Merge "Use static flag instead of impl" into main
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index 3391698..85323c3 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -83,6 +83,7 @@
         "com.android.internal.pm.pkg.component.flags-aconfig-java",
         "com.android.media.flags.bettertogether-aconfig-java",
         "com.android.media.flags.editing-aconfig-java",
+        "com.android.media.flags.performance-aconfig-java",
         "com.android.media.flags.projection-aconfig-java",
         "com.android.net.thread.platform.flags-aconfig-java",
         "com.android.server.flags.services-aconfig-java",
@@ -339,6 +340,7 @@
     apex_available: [
         "//apex_available:platform",
         "com.android.mediaprovider",
+        "com.android.permission",
     ],
 }
 
@@ -573,6 +575,21 @@
     defaults: ["framework-minus-apex-aconfig-java-defaults"],
 }
 
+// Media Performance
+aconfig_declarations {
+    name: "com.android.media.flags.performance-aconfig",
+    package: "com.android.media.performance.flags",
+    srcs: [
+        "media/java/android/media/flags/performance.aconfig",
+    ],
+}
+
+java_aconfig_library {
+    name: "com.android.media.flags.performance-aconfig-java",
+    aconfig_declarations: "com.android.media.flags.performance-aconfig",
+    defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
+
 // Media TV
 aconfig_declarations {
     name: "android.media.tv.flags-aconfig",
@@ -631,6 +648,12 @@
     defaults: ["framework-minus-apex-aconfig-java-defaults"],
 }
 
+cc_aconfig_library {
+    name: "android.database.sqlite-aconfig-cc",
+    aconfig_declarations: "android.database.sqlite-aconfig",
+    host_supported: true,
+}
+
 // Biometrics
 aconfig_declarations {
     name: "android.hardware.biometrics.flags-aconfig",
@@ -664,6 +687,11 @@
     defaults: ["framework-minus-apex-aconfig-java-defaults"],
 }
 
+cc_aconfig_library {
+    name: "android.server.display.flags-aconfig-cc",
+    aconfig_declarations: "display_flags",
+}
+
 java_aconfig_library {
     name: "com.android.internal.foldables.flags-aconfig-java",
     aconfig_declarations: "fold_lock_setting_flags",
diff --git a/Android.bp b/Android.bp
index 59e903e..4f715f8 100644
--- a/Android.bp
+++ b/Android.bp
@@ -150,7 +150,6 @@
         ":framework-javastream-protos",
         ":statslog-framework-java-gen", // FrameworkStatsLog.java
         ":audio_policy_configuration_V7_0",
-        ":perfetto_trace_javastream_protos",
     ],
 }
 
@@ -389,7 +388,6 @@
         // TODO(b/120066492): remove gps_debug and protolog.conf.json when the build
         // system propagates "required" properly.
         "gps_debug.conf",
-        "core.protolog.pb",
         "framework-res",
         // any install dependencies should go into framework-minus-apex-install-dependencies
         // rather than here to avoid bloating incremental build time
@@ -426,6 +424,7 @@
         "audiopolicy-aidl-java",
         "sounddose-aidl-java",
         "modules-utils-expresslog",
+        "perfetto_trace_javastream_protos_jarjar",
     ],
 }
 
@@ -665,6 +664,16 @@
     visibility: ["//frameworks/base/api"],
 }
 
+java_library {
+    name: "perfetto_trace_javastream_protos_jarjar",
+    srcs: [
+        ":perfetto_trace_javastream_protos",
+    ],
+    jarjar_rules: ":framework-jarjar-rules",
+    sdk_version: "core_platform",
+    installable: false,
+}
+
 build = [
     "AconfigFlags.bp",
     "ProtoLibraries.bp",
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index a126c52..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-LOCAL_PATH := $(call my-dir)
-
-# TODO: Empty this file after all subdirectories' Android.mk have been
-#       converted to Android.bp to avoid using any newly added Android.mk.
-include $(call first-makefiles-under,$(LOCAL_PATH))
diff --git a/Ravenwood.bp b/Ravenwood.bp
index f43c37b..7c7c0e2 100644
--- a/Ravenwood.bp
+++ b/Ravenwood.bp
@@ -30,7 +30,7 @@
     name: "framework-minus-apex.ravenwood-base",
     tools: ["hoststubgen"],
     cmd: "$(location hoststubgen) " +
-        "@$(location ravenwood/ravenwood-standard-options.txt) " +
+        "@$(location ravenwood/texts/ravenwood-standard-options.txt) " +
 
         "--debug-log $(location hoststubgen_framework-minus-apex.log) " +
         "--stats-file $(location hoststubgen_framework-minus-apex_stats.csv) " +
@@ -41,13 +41,13 @@
         "--gen-input-dump-file $(location hoststubgen_dump.txt) " +
 
         "--in-jar $(location :framework-minus-apex-for-hoststubgen) " +
-        "--policy-override-file $(location ravenwood/framework-minus-apex-ravenwood-policies.txt) " +
-        "--annotation-allowed-classes-file $(location ravenwood/ravenwood-annotation-allowed-classes.txt) ",
+        "--policy-override-file $(location ravenwood/texts/framework-minus-apex-ravenwood-policies.txt) " +
+        "--annotation-allowed-classes-file $(location ravenwood/texts/ravenwood-annotation-allowed-classes.txt) ",
     srcs: [
         ":framework-minus-apex-for-hoststubgen",
-        "ravenwood/framework-minus-apex-ravenwood-policies.txt",
-        "ravenwood/ravenwood-standard-options.txt",
-        "ravenwood/ravenwood-annotation-allowed-classes.txt",
+        "ravenwood/texts/framework-minus-apex-ravenwood-policies.txt",
+        "ravenwood/texts/ravenwood-standard-options.txt",
+        "ravenwood/texts/ravenwood-annotation-allowed-classes.txt",
     ],
     out: [
         "ravenwood.jar",
@@ -77,6 +77,19 @@
     ],
 }
 
+// Extract the stats file.
+genrule {
+    name: "framework-minus-apex.ravenwood.stats",
+    defaults: ["ravenwood-internal-only-visibility-genrule"],
+    cmd: "cp $(in) $(out)",
+    srcs: [
+        ":framework-minus-apex.ravenwood-base{hoststubgen_framework-minus-apex_stats.csv}",
+    ],
+    out: [
+        "hoststubgen_framework-minus-apex_stats.csv",
+    ],
+}
+
 java_library {
     name: "services.core-for-hoststubgen",
     installable: false, // host only jar.
@@ -91,7 +104,7 @@
     name: "services.core.ravenwood-base",
     tools: ["hoststubgen"],
     cmd: "$(location hoststubgen) " +
-        "@$(location ravenwood/ravenwood-standard-options.txt) " +
+        "@$(location ravenwood/texts/ravenwood-standard-options.txt) " +
 
         "--debug-log $(location hoststubgen_services.core.log) " +
         "--stats-file $(location hoststubgen_services.core_stats.csv) " +
@@ -102,13 +115,13 @@
         "--gen-input-dump-file $(location hoststubgen_dump.txt) " +
 
         "--in-jar $(location :services.core-for-hoststubgen) " +
-        "--policy-override-file $(location ravenwood/services.core-ravenwood-policies.txt) " +
-        "--annotation-allowed-classes-file $(location ravenwood/ravenwood-annotation-allowed-classes.txt) ",
+        "--policy-override-file $(location ravenwood/texts/services.core-ravenwood-policies.txt) " +
+        "--annotation-allowed-classes-file $(location ravenwood/texts/ravenwood-annotation-allowed-classes.txt) ",
     srcs: [
         ":services.core-for-hoststubgen",
-        "ravenwood/services.core-ravenwood-policies.txt",
-        "ravenwood/ravenwood-standard-options.txt",
-        "ravenwood/ravenwood-annotation-allowed-classes.txt",
+        "ravenwood/texts/services.core-ravenwood-policies.txt",
+        "ravenwood/texts/ravenwood-standard-options.txt",
+        "ravenwood/texts/ravenwood-annotation-allowed-classes.txt",
     ],
     out: [
         "ravenwood.jar",
@@ -135,6 +148,19 @@
     ],
 }
 
+// Extract the stats file.
+genrule {
+    name: "services.core.ravenwood.stats",
+    defaults: ["ravenwood-internal-only-visibility-genrule"],
+    cmd: "cp $(in) $(out)",
+    srcs: [
+        ":services.core.ravenwood-base{hoststubgen_services.core_stats.csv}",
+    ],
+    out: [
+        "hoststubgen_services.core_stats.csv",
+    ],
+}
+
 java_library {
     name: "services.core.ravenwood-jarjar",
     installable: false,
@@ -142,6 +168,7 @@
         "services.core.ravenwood",
     ],
     jarjar_rules: ":ravenwood-services-jarjar-rules",
+    visibility: ["//visibility:private"],
 }
 
 java_library {
@@ -153,6 +180,7 @@
         "services.core.ravenwood",
     ],
     jarjar_rules: ":ravenwood-services-jarjar-rules",
+    visibility: ["//visibility:private"],
 }
 
 java_library {
diff --git a/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java b/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java
index 6871762..762e2af 100644
--- a/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java
+++ b/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java
@@ -366,7 +366,7 @@
             mRunner.pauseTiming();
             Log.i(TAG, "Stopping timer");
 
-            stopUser(userId, /* force */true);
+            stopUser(userId);
             mRunner.resumeTimingForNextIteration();
         }
 
@@ -429,7 +429,7 @@
 
             mRunner.pauseTiming();
             Log.i(TAG, "Stopping timer");
-            stopUser(userId, /* force */true);
+            stopUser(userId);
             mRunner.resumeTimingForNextIteration();
         }
 
@@ -545,7 +545,7 @@
             mRunner.pauseTiming();
             Log.d(TAG, "Stopping timer");
             switchUserNoCheck(currentUserId);
-            stopUserAfterWaitingForBroadcastIdle(userId, /* force */true);
+            stopUserAfterWaitingForBroadcastIdle(userId);
             attestFalse("Failed to stop user " + userId, mAm.isUserRunning(userId));
             mRunner.resumeTimingForNextIteration();
         }
@@ -571,7 +571,7 @@
             mRunner.pauseTiming();
             Log.d(TAG, "Stopping timer");
             switchUserNoCheck(startUser);
-            stopUserAfterWaitingForBroadcastIdle(testUser, true);
+            stopUserAfterWaitingForBroadcastIdle(testUser);
             attestFalse("Failed to stop user " + testUser, mAm.isUserRunning(testUser));
             mRunner.resumeTimingForNextIteration();
         }
@@ -660,7 +660,7 @@
             mRunner.resumeTiming();
             Log.i(TAG, "Starting timer");
 
-            stopUser(userId, false);
+            stopUser(userId);
 
             mRunner.pauseTiming();
             Log.i(TAG, "Stopping timer");
@@ -685,7 +685,7 @@
             Log.d(TAG, "Starting timer");
             mRunner.resumeTiming();
 
-            stopUser(userId, false);
+            stopUser(userId);
 
             mRunner.pauseTiming();
             Log.d(TAG, "Stopping timer");
@@ -883,7 +883,7 @@
             final int userId = createManagedProfile();
             // Start the profile initially, then stop it. Similar to setQuietModeEnabled.
             startUserInBackgroundAndWaitForUnlock(userId);
-            stopUserAfterWaitingForBroadcastIdle(userId, true);
+            stopUserAfterWaitingForBroadcastIdle(userId);
             mRunner.resumeTiming();
             Log.i(TAG, "Starting timer");
 
@@ -905,7 +905,7 @@
         startUserInBackgroundAndWaitForUnlock(userId);
         while (mRunner.keepRunning()) {
             mRunner.pauseTiming();
-            stopUserAfterWaitingForBroadcastIdle(userId, true);
+            stopUserAfterWaitingForBroadcastIdle(userId);
             mRunner.resumeTiming();
             Log.d(TAG, "Starting timer");
 
@@ -987,7 +987,7 @@
             installPreexistingApp(userId, DUMMY_PACKAGE_NAME);
             startUserInBackgroundAndWaitForUnlock(userId);
             startApp(userId, DUMMY_PACKAGE_NAME);
-            stopUserAfterWaitingForBroadcastIdle(userId, true);
+            stopUserAfterWaitingForBroadcastIdle(userId);
             SystemClock.sleep(1_000); // 1 second cool-down before re-starting profile.
             mRunner.resumeTiming();
             Log.i(TAG, "Starting timer");
@@ -1019,7 +1019,7 @@
             installPreexistingApp(userId, DUMMY_PACKAGE_NAME);
             startUserInBackgroundAndWaitForUnlock(userId);
             startApp(userId, DUMMY_PACKAGE_NAME);
-            stopUserAfterWaitingForBroadcastIdle(userId, true);
+            stopUserAfterWaitingForBroadcastIdle(userId);
             SystemClock.sleep(1_000); // 1 second cool-down before re-starting profile.
             mRunner.resumeTiming();
             Log.d(TAG, "Starting timer");
@@ -1144,7 +1144,7 @@
             mRunner.resumeTiming();
             Log.i(TAG, "Starting timer");
 
-            stopUser(userId, true);
+            stopUser(userId);
 
             mRunner.pauseTiming();
             Log.i(TAG, "Stopping timer");
@@ -1168,7 +1168,7 @@
             mRunner.resumeTiming();
             Log.d(TAG, "Starting timer");
 
-            stopUser(userId, true);
+            stopUser(userId);
 
             mRunner.pauseTiming();
             Log.d(TAG, "Stopping timer");
@@ -1294,15 +1294,15 @@
      * Do not call this method while timing is on. i.e. between mRunner.resumeTiming() and
      * mRunner.pauseTiming(). Otherwise it would cause the test results to be spiky.
      */
-    private void stopUserAfterWaitingForBroadcastIdle(int userId, boolean force)
+    private void stopUserAfterWaitingForBroadcastIdle(int userId)
             throws RemoteException {
         waitForBroadcastIdle();
-        stopUser(userId, force);
+        stopUser(userId);
     }
 
-    private void stopUser(int userId, boolean force) throws RemoteException {
+    private void stopUser(int userId) throws RemoteException {
         final CountDownLatch latch = new CountDownLatch(1);
-        mIam.stopUser(userId, force /* force */, new IStopUserCallback.Stub() {
+        mIam.stopUserWithCallback(userId, new IStopUserCallback.Stub() {
             @Override
             public void userStopped(int userId) throws RemoteException {
                 latch.countDown();
@@ -1352,7 +1352,7 @@
         attestTrue("Didn't switch back to user, " + origUser, origUser == mAm.getCurrentUser());
 
         if (stopNewUser) {
-            stopUserAfterWaitingForBroadcastIdle(testUser, true);
+            stopUserAfterWaitingForBroadcastIdle(testUser);
             attestFalse("Failed to stop user " + testUser, mAm.isUserRunning(testUser));
         }
 
@@ -1471,7 +1471,7 @@
     }
 
     private void removeUser(int userId) throws RemoteException {
-        stopUserAfterWaitingForBroadcastIdle(userId, true);
+        stopUserAfterWaitingForBroadcastIdle(userId);
         try {
             ShellHelper.runShellCommandWithTimeout("pm remove-user -w " + userId,
                     TIMEOUT_IN_SECOND);
@@ -1512,7 +1512,7 @@
 
             final boolean preStartComplete = mIam.startUserInBackgroundWithListener(userId,
                     preWaiter) && preWaiter.waitForFinish(TIMEOUT_IN_SECOND * 1000);
-            stopUserAfterWaitingForBroadcastIdle(userId, /* force */true);
+            stopUserAfterWaitingForBroadcastIdle(userId);
 
             assertTrue("Pre start was not performed for user" + userId, preStartComplete);
         }
diff --git a/apex/jobscheduler/OWNERS b/apex/jobscheduler/OWNERS
index 58434f1..22b6489 100644
--- a/apex/jobscheduler/OWNERS
+++ b/apex/jobscheduler/OWNERS
@@ -2,7 +2,6 @@
 [email protected]
 [email protected]
 [email protected]
[email protected]
 [email protected]
 [email protected]
 [email protected]
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
index 60eb4ac..c74c48c 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
@@ -2054,8 +2054,8 @@
          * or in a state where launching an activity is allowed, as defined
          * <a href=
          * "https://developer.android.com/guide/components/activities/background-starts#exceptions">
-         * here</a>. Attempting to schedule one outside of these conditions will throw a
-         * {@link SecurityException}.
+         * here</a>. Attempting to schedule one outside of these conditions will return a
+         * {@link JobScheduler#RESULT_FAILURE}.
          *
          * <p>
          * This should <b>NOT</b> be used for automatic features.
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java b/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java
index 36174c6..3c218421 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java
@@ -19,8 +19,6 @@
 import android.annotation.SystemApi;
 import android.app.JobSchedulerImpl;
 import android.app.SystemServiceRegistry;
-import android.app.tare.EconomyManager;
-import android.app.tare.IEconomyManager;
 import android.content.Context;
 import android.os.DeviceIdleManager;
 import android.os.IDeviceIdleController;
@@ -58,8 +56,5 @@
         SystemServiceRegistry.registerContextAwareService(
                 Context.POWER_EXEMPTION_SERVICE, PowerExemptionManager.class,
                 PowerExemptionManager::new);
-        SystemServiceRegistry.registerStaticService(
-                Context.RESOURCE_ECONOMY_SERVICE, EconomyManager.class,
-                (b) -> new EconomyManager(IEconomyManager.Stub.asInterface(b)));
     }
 }
diff --git a/apex/jobscheduler/framework/java/android/app/job/OWNERS b/apex/jobscheduler/framework/java/android/app/job/OWNERS
index b4a45f5..0b1e559 100644
--- a/apex/jobscheduler/framework/java/android/app/job/OWNERS
+++ b/apex/jobscheduler/framework/java/android/app/job/OWNERS
@@ -4,4 +4,3 @@
 [email protected]
 [email protected]
 [email protected]
[email protected]
diff --git a/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java b/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java
deleted file mode 100644
index 0bea028..0000000
--- a/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java
+++ /dev/null
@@ -1,653 +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 android.app.tare;
-
-import android.annotation.IntDef;
-import android.annotation.Nullable;
-import android.annotation.SystemService;
-import android.annotation.TestApi;
-import android.content.Context;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Provides access to the resource economy service.
- *
- * @hide
- */
-@TestApi
-@SystemService(Context.RESOURCE_ECONOMY_SERVICE)
-public class EconomyManager {
-    private static final String TAG = "TARE-" + EconomyManager.class.getSimpleName();
-
-    /**
-     * 1 ARC = 1 GIGA-CAKE!
-     *
-     * @hide
-     */
-    public static final long CAKE_IN_ARC = 1_000_000_000L;
-
-    /** @hide */
-    public static long arcToCake(int arcs) {
-        return arcs * CAKE_IN_ARC;
-    }
-
-    /**
-     * Parses a configuration string to get the value in cakes.
-     *
-     * @hide
-     */
-    public static long parseCreditValue(@Nullable final String val, final long defaultValCakes) {
-        String trunc;
-        if (val == null || (trunc = val.trim()).isEmpty()) {
-            return defaultValCakes;
-        }
-        long multiplier;
-        if (trunc.endsWith("c")) {
-            trunc = trunc.substring(0, trunc.length() - 1);
-            multiplier = 1;
-        } else if (trunc.endsWith("ck")) {
-            trunc = trunc.substring(0, trunc.length() - 2);
-            multiplier = 1;
-        } else if (trunc.endsWith("A")) {
-            trunc = trunc.substring(0, trunc.length() - 1);
-            multiplier = CAKE_IN_ARC;
-        } else if (trunc.endsWith("ARC")) {
-            trunc = trunc.substring(0, trunc.length() - 3);
-            multiplier = CAKE_IN_ARC;
-        } else {
-            // Don't risk using the wrong units
-            Log.e(TAG, "Couldn't determine units of credit value: " + val);
-            return defaultValCakes;
-        }
-
-        // Allow people to shorten notation (eg. Mc for Megacake).
-        if (trunc.endsWith("k")) {
-            trunc = trunc.substring(0, trunc.length() - 1);
-            multiplier *= 1_000;
-        } else if (trunc.endsWith("M")) {
-            trunc = trunc.substring(0, trunc.length() - 1);
-            multiplier *= 1_000_000;
-        } else if (trunc.endsWith("G")) {
-            trunc = trunc.substring(0, trunc.length() - 1);
-            multiplier *= 1_000_000_000;
-        }
-
-        try {
-            return Long.parseLong(trunc) * multiplier;
-        } catch (NumberFormatException e) {
-            Log.e(TAG, "Malformed config string: " + val + " to " + trunc, e);
-            return defaultValCakes;
-        }
-    }
-
-    /** @hide */
-    @TestApi
-    public static final int ENABLED_MODE_OFF = 0;
-    /** @hide */
-    public static final int ENABLED_MODE_ON = 1;
-    /**
-     * Go through the motions, tracking events, updating balances and other TARE state values,
-     * but don't use TARE to affect actual device behavior.
-     * @hide
-     */
-    @TestApi
-    public static final int ENABLED_MODE_SHADOW = 2;
-
-    /** @hide */
-    @IntDef(prefix = {"ENABLED_MODE_"}, value = {
-            ENABLED_MODE_OFF,
-            ENABLED_MODE_ON,
-            ENABLED_MODE_SHADOW,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface EnabledMode {
-    }
-
-    /** @hide */
-    public static String enabledModeToString(@EnabledMode int mode) {
-        switch (mode) {
-            case ENABLED_MODE_OFF: return "ENABLED_MODE_OFF";
-            case ENABLED_MODE_ON: return "ENABLED_MODE_ON";
-            case ENABLED_MODE_SHADOW: return "ENABLED_MODE_SHADOW";
-            default: return "ENABLED_MODE_" + mode;
-        }
-    }
-
-    /** @hide */
-    @TestApi
-    public static final String KEY_ENABLE_TARE_MODE = "enable_tare_mode";
-    /** @hide */
-    public static final String KEY_ENABLE_POLICY_ALARM = "enable_policy_alarm";
-    /** @hide */
-    public static final String KEY_ENABLE_POLICY_JOB_SCHEDULER = "enable_policy_job";
-    /** @hide */
-    public static final int DEFAULT_ENABLE_TARE_MODE = ENABLED_MODE_OFF;
-    /** @hide */
-    public static final boolean DEFAULT_ENABLE_POLICY_ALARM = true;
-    /** @hide */
-    public static final boolean DEFAULT_ENABLE_POLICY_JOB_SCHEDULER = true;
-
-    // Keys for AlarmManager TARE factors
-    /** @hide */
-    public static final String KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED =
-            "am_min_satiated_balance_exempted";
-    /** @hide */
-    public static final String KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP =
-            "am_min_satiated_balance_headless_system_app";
-    /** @hide */
-    public static final String KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP =
-            "am_min_satiated_balance_other_app";
-    /** @hide */
-    public static final String KEY_AM_MAX_SATIATED_BALANCE = "am_max_satiated_balance";
-    /** @hide */
-    public static final String KEY_AM_INITIAL_CONSUMPTION_LIMIT = "am_initial_consumption_limit";
-    /** @hide */
-    public static final String KEY_AM_MIN_CONSUMPTION_LIMIT = "am_minimum_consumption_limit";
-    /** @hide */
-    public static final String KEY_AM_MAX_CONSUMPTION_LIMIT = "am_maximum_consumption_limit";
-    // TODO: Add AlarmManager modifier keys
-    /** @hide */
-    public static final String KEY_AM_REWARD_TOP_ACTIVITY_INSTANT =
-            "am_reward_top_activity_instant";
-    /** @hide */
-    public static final String KEY_AM_REWARD_TOP_ACTIVITY_ONGOING =
-            "am_reward_top_activity_ongoing";
-    /** @hide */
-    public static final String KEY_AM_REWARD_TOP_ACTIVITY_MAX = "am_reward_top_activity_max";
-    /** @hide */
-    public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT =
-            "am_reward_notification_seen_instant";
-    /** @hide */
-    public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING =
-            "am_reward_notification_seen_ongoing";
-    /** @hide */
-    public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_MAX =
-            "am_reward_notification_seen_max";
-    /** @hide */
-    public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_INSTANT =
-            "am_reward_notification_seen_within_15_instant";
-    /** @hide */
-    public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_ONGOING =
-            "am_reward_notification_seen_within_15_ongoing";
-    /** @hide */
-    public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_MAX =
-            "am_reward_notification_seen_within_15_max";
-    /** @hide */
-    public static final String KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT =
-            "am_reward_notification_interaction_instant";
-    /** @hide */
-    public static final String KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING =
-            "am_reward_notification_interaction_ongoing";
-    /** @hide */
-    public static final String KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX =
-            "am_reward_notification_interaction_max";
-    /** @hide */
-    public static final String KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT =
-            "am_reward_widget_interaction_instant";
-    /** @hide */
-    public static final String KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING =
-            "am_reward_widget_interaction_ongoing";
-    /** @hide */
-    public static final String KEY_AM_REWARD_WIDGET_INTERACTION_MAX =
-            "am_reward_widget_interaction_max";
-    /** @hide */
-    public static final String KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT =
-            "am_reward_other_user_interaction_instant";
-    /** @hide */
-    public static final String KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING =
-            "am_reward_other_user_interaction_ongoing";
-    /** @hide */
-    public static final String KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX =
-            "am_reward_other_user_interaction_max";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP =
-            "am_action_alarm_allow_while_idle_exact_wakeup_ctp";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP =
-            "am_action_alarm_allow_while_idle_inexact_wakeup_ctp";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP =
-            "am_action_alarm_exact_wakeup_ctp";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP =
-            "am_action_alarm_inexact_wakeup_ctp";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP =
-            "am_action_alarm_allow_while_idle_exact_nonwakeup_ctp";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP =
-            "am_action_alarm_exact_nonwakeup_ctp";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP =
-            "am_action_alarm_allow_while_idle_inexact_nonwakeup_ctp";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP =
-            "am_action_alarm_inexact_nonwakeup_ctp";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP =
-            "am_action_alarm_alarmclock_ctp";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE =
-            "am_action_alarm_allow_while_idle_exact_wakeup_base_price";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE =
-            "am_action_alarm_allow_while_idle_inexact_wakeup_base_price";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE =
-            "am_action_alarm_exact_wakeup_base_price";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE =
-            "am_action_alarm_inexact_wakeup_base_price";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE =
-            "am_action_alarm_allow_while_idle_exact_nonwakeup_base_price";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE =
-            "am_action_alarm_exact_nonwakeup_base_price";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE =
-            "am_action_alarm_allow_while_idle_inexact_nonwakeup_base_price";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE =
-            "am_action_alarm_inexact_nonwakeup_base_price";
-    /** @hide */
-    public static final String KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE =
-            "am_action_alarm_alarmclock_base_price";
-
-// Keys for JobScheduler TARE factors
-    /** @hide */
-    public static final String KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED =
-            "js_min_satiated_balance_exempted";
-    /** @hide */
-    public static final String KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP =
-            "js_min_satiated_balance_headless_system_app";
-    /** @hide */
-    public static final String KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP =
-            "js_min_satiated_balance_other_app";
-    /** @hide */
-    public static final String KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER =
-            "js_min_satiated_balance_increment_updater";
-    /** @hide */
-    public static final String KEY_JS_MAX_SATIATED_BALANCE =
-            "js_max_satiated_balance";
-    /** @hide */
-    public static final String KEY_JS_INITIAL_CONSUMPTION_LIMIT = "js_initial_consumption_limit";
-    /** @hide */
-    public static final String KEY_JS_MIN_CONSUMPTION_LIMIT = "js_minimum_consumption_limit";
-    /** @hide */
-    public static final String KEY_JS_MAX_CONSUMPTION_LIMIT = "js_maximum_consumption_limit";
-    // TODO: Add JobScheduler modifier keys
-    /** @hide */
-    public static final String KEY_JS_REWARD_APP_INSTALL_INSTANT =
-            "js_reward_app_install_instant";
-    /** @hide */
-    public static final String KEY_JS_REWARD_APP_INSTALL_ONGOING =
-            "js_reward_app_install_ongoing";
-    /** @hide */
-    public static final String KEY_JS_REWARD_APP_INSTALL_MAX =
-            "js_reward_app_install_max";
-    /** @hide */
-    public static final String KEY_JS_REWARD_TOP_ACTIVITY_INSTANT =
-            "js_reward_top_activity_instant";
-    /** @hide */
-    public static final String KEY_JS_REWARD_TOP_ACTIVITY_ONGOING =
-            "js_reward_top_activity_ongoing";
-    /** @hide */
-    public static final String KEY_JS_REWARD_TOP_ACTIVITY_MAX =
-            "js_reward_top_activity_max";
-    /** @hide */
-    public static final String KEY_JS_REWARD_NOTIFICATION_SEEN_INSTANT =
-            "js_reward_notification_seen_instant";
-    /** @hide */
-    public static final String KEY_JS_REWARD_NOTIFICATION_SEEN_ONGOING =
-            "js_reward_notification_seen_ongoing";
-    /** @hide */
-    public static final String KEY_JS_REWARD_NOTIFICATION_SEEN_MAX =
-            "js_reward_notification_seen_max";
-    /** @hide */
-    public static final String KEY_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT =
-            "js_reward_notification_interaction_instant";
-    /** @hide */
-    public static final String KEY_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING =
-            "js_reward_notification_interaction_ongoing";
-    /** @hide */
-    public static final String KEY_JS_REWARD_NOTIFICATION_INTERACTION_MAX =
-            "js_reward_notification_interaction_max";
-    /** @hide */
-    public static final String KEY_JS_REWARD_WIDGET_INTERACTION_INSTANT =
-            "js_reward_widget_interaction_instant";
-    /** @hide */
-    public static final String KEY_JS_REWARD_WIDGET_INTERACTION_ONGOING =
-            "js_reward_widget_interaction_ongoing";
-    /** @hide */
-    public static final String KEY_JS_REWARD_WIDGET_INTERACTION_MAX =
-            "js_reward_widget_interaction_max";
-    /** @hide */
-    public static final String KEY_JS_REWARD_OTHER_USER_INTERACTION_INSTANT =
-            "js_reward_other_user_interaction_instant";
-    /** @hide */
-    public static final String KEY_JS_REWARD_OTHER_USER_INTERACTION_ONGOING =
-            "js_reward_other_user_interaction_ongoing";
-    /** @hide */
-    public static final String KEY_JS_REWARD_OTHER_USER_INTERACTION_MAX =
-            "js_reward_other_user_interaction_max";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_MAX_START_CTP = "js_action_job_max_start_ctp";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_MAX_RUNNING_CTP = "js_action_job_max_running_ctp";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_HIGH_START_CTP = "js_action_job_high_start_ctp";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_HIGH_RUNNING_CTP =
-            "js_action_job_high_running_ctp";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_DEFAULT_START_CTP =
-            "js_action_job_default_start_ctp";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_DEFAULT_RUNNING_CTP =
-            "js_action_job_default_running_ctp";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_LOW_START_CTP = "js_action_job_low_start_ctp";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_LOW_RUNNING_CTP = "js_action_job_low_running_ctp";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_MIN_START_CTP = "js_action_job_min_start_ctp";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_MIN_RUNNING_CTP = "js_action_job_min_running_ctp";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP =
-            "js_action_job_timeout_penalty_ctp";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_MAX_START_BASE_PRICE =
-            "js_action_job_max_start_base_price";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE =
-            "js_action_job_max_running_base_price";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_HIGH_START_BASE_PRICE =
-            "js_action_job_high_start_base_price";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE =
-            "js_action_job_high_running_base_price";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE =
-            "js_action_job_default_start_base_price";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE =
-            "js_action_job_default_running_base_price";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_LOW_START_BASE_PRICE =
-            "js_action_job_low_start_base_price";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE =
-            "js_action_job_low_running_base_price";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_MIN_START_BASE_PRICE =
-            "js_action_job_min_start_base_price";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE =
-            "js_action_job_min_running_base_price";
-    /** @hide */
-    public static final String KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE =
-            "js_action_job_timeout_penalty_base_price";
-
-    // Default values AlarmManager factors
-    /** @hide */
-    public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES = arcToCake(500);
-    /** @hide */
-    public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES =
-            arcToCake(256);
-    /** @hide */
-    public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES = arcToCake(160);
-    /** @hide */
-    public static final long DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES = arcToCake(960);
-    /** @hide */
-    public static final long DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES = arcToCake(2880);
-    /** @hide */
-    public static final long DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES = arcToCake(1440);
-    /** @hide */
-    public static final long DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES = arcToCake(15_000);
-    // TODO: add AlarmManager modifier default values
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT_CAKES = arcToCake(0);
-    /** @hide */
-    // 10 megacakes = .01 ARC
-    public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING_CAKES = 10_000_000;
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX_CAKES = arcToCake(500);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES = arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES = arcToCake(0);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX_CAKES = arcToCake(60);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_INSTANT_CAKES =
-            arcToCake(5);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_ONGOING_CAKES =
-            arcToCake(0);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_MAX_CAKES =
-            arcToCake(500);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES =
-            arcToCake(5);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES =
-            arcToCake(0);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES = arcToCake(500);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT_CAKES = arcToCake(10);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING_CAKES = arcToCake(0);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX_CAKES = arcToCake(500);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES = arcToCake(10);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES = arcToCake(0);
-    /** @hide */
-    public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX_CAKES = arcToCake(500);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP_CAKES =
-            arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP_CAKES =
-            arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP_CAKES = arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP_CAKES = arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP_CAKES =
-            arcToCake(1);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP_CAKES = arcToCake(1);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP_CAKES =
-            arcToCake(1);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP_CAKES = arcToCake(1);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP_CAKES = arcToCake(5);
-    /** @hide */
-    public static final long
-            DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(5);
-    /** @hide */
-    public static final long
-            DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(4);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(4);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(3);
-    /** @hide */
-    public static final long
-            DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE_CAKES =
-            arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE_CAKES =
-            arcToCake(2);
-    /** @hide */
-    public static final long
-            DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES =
-            arcToCake(2);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE_CAKES =
-            arcToCake(1);
-    /** @hide */
-    public static final long DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE_CAKES = arcToCake(10);
-
-    // Default values JobScheduler factors
-    // TODO: add time_since_usage variable to min satiated balance factors
-    /** @hide */
-    public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES = arcToCake(15000);
-    /** @hide */
-    public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES =
-            arcToCake(7500);
-    /** @hide */
-    public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES = arcToCake(2000);
-    /** @hide */
-    public static final long DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES = arcToCake(60000);
-    /** @hide */
-    public static final long DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES = arcToCake(29_000);
-    /** @hide */
-    public static final long DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES = arcToCake(17_000);
-    /** @hide */
-    // TODO: set maximum limit based on device type (phone vs tablet vs etc) + battery size
-    public static final long DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES = arcToCake(250_000);
-    // TODO: add JobScheduler modifier default values
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES = arcToCake(408);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_APP_INSTALL_ONGOING_CAKES = arcToCake(0);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_APP_INSTALL_MAX_CAKES = arcToCake(4000);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT_CAKES = arcToCake(0);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING_CAKES = CAKE_IN_ARC / 2;
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX_CAKES = arcToCake(15000);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES = arcToCake(1);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES = arcToCake(0);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX_CAKES = arcToCake(10);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES =
-            arcToCake(5);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES =
-            arcToCake(0);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES = arcToCake(5000);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT_CAKES = arcToCake(10);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING_CAKES = arcToCake(0);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX_CAKES = arcToCake(5000);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES = arcToCake(10);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES = arcToCake(0);
-    /** @hide */
-    public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX_CAKES = arcToCake(5000);
-    /**
-     * How many credits to increase the updating app's min satiated balance by for each app that it
-     * is responsible for updating.
-     * @hide
-     */
-    public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES =
-            // Research indicates that the median time between popular app updates is 13-14 days,
-            // so adjust by 14 to amortize over that time.
-            DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES / 14;
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_MAX_START_CTP_CAKES = arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP_CAKES = arcToCake(2);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_HIGH_START_CTP_CAKES = arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP_CAKES = arcToCake(2);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP_CAKES = arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP_CAKES = arcToCake(2);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_LOW_START_CTP_CAKES = arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP_CAKES = arcToCake(2);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_MIN_START_CTP_CAKES = arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP_CAKES = arcToCake(2);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP_CAKES = arcToCake(30);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE_CAKES = arcToCake(10);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE_CAKES = arcToCake(5);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE_CAKES = arcToCake(8);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE_CAKES = arcToCake(4);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE_CAKES = arcToCake(6);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE_CAKES = arcToCake(3);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE_CAKES = arcToCake(4);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE_CAKES = arcToCake(2);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE_CAKES = arcToCake(2);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE_CAKES = arcToCake(1);
-    /** @hide */
-    public static final long DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE_CAKES = arcToCake(60);
-
-    //////// APIs below ////////
-
-    private final IEconomyManager mService;
-
-    /** @hide */
-    public EconomyManager(IEconomyManager service) {
-        mService = service;
-    }
-
-    /**
-     * Returns the current enabled status of TARE.
-     * @hide
-     */
-    @EnabledMode
-    @TestApi
-    public int getEnabledMode() {
-        try {
-            return mService.getEnabledMode();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-}
diff --git a/apex/jobscheduler/framework/java/android/app/tare/IEconomyManager.aidl b/apex/jobscheduler/framework/java/android/app/tare/IEconomyManager.aidl
deleted file mode 100644
index 2be0db7..0000000
--- a/apex/jobscheduler/framework/java/android/app/tare/IEconomyManager.aidl
+++ /dev/null
@@ -1,25 +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 android.app.tare;
-
- /**
-  * IPC interface that supports the app-facing {@link #EconomyManager} api.
-  * {@hide}
-  */
-interface IEconomyManager {
-    int getEnabledMode();
-}
diff --git a/apex/jobscheduler/framework/java/android/app/tare/OWNERS b/apex/jobscheduler/framework/java/android/app/tare/OWNERS
deleted file mode 100644
index 217a5ed..0000000
--- a/apex/jobscheduler/framework/java/android/app/tare/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-include /apex/jobscheduler/service/java/com/android/server/tare/OWNERS
\ No newline at end of file
diff --git a/apex/jobscheduler/service/Android.bp b/apex/jobscheduler/service/Android.bp
index ace56d4..06c7d64 100644
--- a/apex/jobscheduler/service/Android.bp
+++ b/apex/jobscheduler/service/Android.bp
@@ -24,6 +24,7 @@
         "app-compat-annotations",
         "error_prone_annotations",
         "framework",
+        "keepanno-annotations",
         "services.core",
         "unsupportedappusage",
     ],
diff --git a/apex/jobscheduler/service/aconfig/Android.bp b/apex/jobscheduler/service/aconfig/Android.bp
index 4db39dc..859c67a 100644
--- a/apex/jobscheduler/service/aconfig/Android.bp
+++ b/apex/jobscheduler/service/aconfig/Android.bp
@@ -2,6 +2,7 @@
 aconfig_declarations {
     name: "service-deviceidle.flags-aconfig",
     package: "com.android.server.deviceidle",
+    container: "system",
     srcs: [
         "device_idle.aconfig",
     ],
@@ -17,6 +18,7 @@
 aconfig_declarations {
     name: "service-job.flags-aconfig",
     package: "com.android.server.job",
+    container: "system",
     srcs: [
         "job.aconfig",
     ],
@@ -32,6 +34,7 @@
 aconfig_declarations {
     name: "alarm_flags",
     package: "com.android.server.alarm",
+    container: "system",
     srcs: ["alarm.aconfig"],
 }
 
diff --git a/apex/jobscheduler/service/aconfig/alarm.aconfig b/apex/jobscheduler/service/aconfig/alarm.aconfig
index bb0f3cb..d3068d7 100644
--- a/apex/jobscheduler/service/aconfig/alarm.aconfig
+++ b/apex/jobscheduler/service/aconfig/alarm.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.alarm"
+container: "system"
 
 flag {
     name: "use_frozen_state_to_drop_listener_alarms"
diff --git a/apex/jobscheduler/service/aconfig/device_idle.aconfig b/apex/jobscheduler/service/aconfig/device_idle.aconfig
index e4cb5ad..e8c99b1 100644
--- a/apex/jobscheduler/service/aconfig/device_idle.aconfig
+++ b/apex/jobscheduler/service/aconfig/device_idle.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.deviceidle"
+container: "system"
 
 flag {
     name: "disable_wakelocks_in_light_idle"
diff --git a/apex/jobscheduler/service/aconfig/job.aconfig b/apex/jobscheduler/service/aconfig/job.aconfig
index 5e6d377..75e2efd2 100644
--- a/apex/jobscheduler/service/aconfig/job.aconfig
+++ b/apex/jobscheduler/service/aconfig/job.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.job"
+container: "system"
 
 flag {
     name: "batch_active_bucket_jobs"
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java b/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java
index 6f8014f..7958d81 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java
@@ -45,7 +45,7 @@
  */
 class Alarm {
     @VisibleForTesting
-    public static final int NUM_POLICIES = 5;
+    public static final int NUM_POLICIES = 4;
     /**
      * Index used to store the time the alarm was requested to expire. To be used with
      * {@link #setPolicyElapsed(int, long)}.
@@ -69,12 +69,6 @@
     public static final int BATTERY_SAVER_POLICY_INDEX = 3;
 
     /**
-     * Index used to store the earliest time the alarm can expire based on TARE policy.
-     * To be used with {@link #setPolicyElapsed(int, long)}.
-     */
-    public static final int TARE_POLICY_INDEX = 4;
-
-    /**
      * Reason to use for inexact alarms.
      */
     static final int EXACT_ALLOW_REASON_NOT_APPLICABLE = -1;
@@ -278,8 +272,6 @@
                 return "device_idle";
             case BATTERY_SAVER_POLICY_INDEX:
                 return "battery_saver";
-            case TARE_POLICY_INDEX:
-                return "tare";
             default:
                 return "--unknown(" + index + ")--";
         }
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 d0a1b02..b982d12 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -57,7 +57,6 @@
 import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_POLICY_PERMISSION;
 import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_PRIORITIZED;
 import static com.android.server.alarm.Alarm.REQUESTER_POLICY_INDEX;
-import static com.android.server.alarm.Alarm.TARE_POLICY_INDEX;
 import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_EXACT_LISTENER_ALARMS_ON_CACHED;
 import static com.android.server.alarm.AlarmManagerService.RemovedAlarm.REMOVE_REASON_ALARM_CANCELLED;
 import static com.android.server.alarm.AlarmManagerService.RemovedAlarm.REMOVE_REASON_DATA_CLEARED;
@@ -88,7 +87,6 @@
 import android.app.PendingIntent;
 import android.app.compat.CompatChanges;
 import android.app.role.RoleManager;
-import android.app.tare.EconomyManager;
 import android.app.usage.UsageStatsManager;
 import android.app.usage.UsageStatsManagerInternal;
 import android.content.BroadcastReceiver;
@@ -137,7 +135,6 @@
 import android.util.LongArrayQueue;
 import android.util.Slog;
 import android.util.SparseArray;
-import android.util.SparseArrayMap;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
 import android.util.SparseLongArray;
@@ -171,8 +168,6 @@
 import com.android.server.pm.permission.PermissionManagerService;
 import com.android.server.pm.permission.PermissionManagerServiceInternal;
 import com.android.server.pm.pkg.AndroidPackage;
-import com.android.server.tare.AlarmManagerEconomicPolicy;
-import com.android.server.tare.EconomyManagerInternal;
 import com.android.server.usage.AppStandbyInternal;
 import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
 
@@ -222,7 +217,6 @@
     static final boolean DEBUG_WAKELOCK = localLOGV || false;
     static final boolean DEBUG_BG_LIMIT = localLOGV || false;
     static final boolean DEBUG_STANDBY = localLOGV || false;
-    static final boolean DEBUG_TARE = localLOGV || false;
     static final boolean RECORD_ALARMS_IN_HISTORY = true;
     static final boolean RECORD_DEVICE_IDLE_ALARMS = false;
 
@@ -259,7 +253,6 @@
     DeviceIdleInternal mLocalDeviceIdleController;
     private UsageStatsManagerInternal mUsageStatsManagerInternal;
     private ActivityManagerInternal mActivityManagerInternal;
-    private final EconomyManagerInternal mEconomyManagerInternal;
     private PackageManagerInternal mPackageManagerInternal;
     private BatteryStatsInternal mBatteryStatsInternal;
     private RoleManager mRoleManager;
@@ -280,16 +273,10 @@
     @GuardedBy("mLock")
     SparseIntArray mLastOpScheduleExactAlarm = new SparseIntArray();
 
-    /**
-     * Local cache of the ability of each userId-pkg to afford the various bills we're tracking for
-     * them.
-     */
-    @GuardedBy("mLock")
-    private final SparseArrayMap<String, ArrayMap<EconomyManagerInternal.ActionBill, Boolean>>
-            mAffordabilityCache = new SparseArrayMap<>();
-
     // List of alarms per uid deferred due to user applied background restrictions on the source app
     SparseArray<ArrayList<Alarm>> mPendingBackgroundAlarms = new SparseArray<>();
+
+    private boolean mStartUserBeforeScheduledAlarms;
     private long mNextWakeup;
     private long mNextNonWakeup;
     private long mNextWakeUpSetAt;
@@ -359,13 +346,11 @@
     interface Stats {
         int REORDER_ALARMS_FOR_STANDBY = 0;
         int HAS_SCHEDULE_EXACT_ALARM = 1;
-        int REORDER_ALARMS_FOR_TARE = 2;
     }
 
     private final StatLogger mStatLogger = new StatLogger("Alarm manager stats", new String[]{
             "REORDER_ALARMS_FOR_STANDBY",
             "HAS_SCHEDULE_EXACT_ALARM",
-            "REORDER_ALARMS_FOR_TARE",
     });
 
     BroadcastOptions mOptsWithFgs = makeBasicAlarmBroadcastOptions();
@@ -684,8 +669,7 @@
      * holding the AlarmManagerService.mLock lock.
      */
     @VisibleForTesting
-    final class Constants implements DeviceConfig.OnPropertiesChangedListener,
-            EconomyManagerInternal.TareStateChangeListener {
+    final class Constants implements DeviceConfig.OnPropertiesChangedListener {
         // Key names stored in the settings value.
         @VisibleForTesting
         static final String KEY_MIN_FUTURITY = "min_futurity";
@@ -856,9 +840,6 @@
          */
         public long MAX_DEVICE_IDLE_FUZZ = DEFAULT_MAX_DEVICE_IDLE_FUZZ;
 
-        public int USE_TARE_POLICY = EconomyManager.DEFAULT_ENABLE_POLICY_ALARM
-                ? EconomyManager.DEFAULT_ENABLE_TARE_MODE : EconomyManager.ENABLED_MODE_OFF;
-
         /**
          * The amount of temporary reserve quota to give apps on receiving the
          * {@link AppIdleStateChangeListener#triggerTemporaryQuotaBump(String, int)} callback
@@ -898,13 +879,7 @@
 
         public void start() {
             mInjector.registerDeviceConfigListener(this);
-            final EconomyManagerInternal economyManagerInternal =
-                    LocalServices.getService(EconomyManagerInternal.class);
-            economyManagerInternal.registerTareStateChangeListener(this,
-                    AlarmManagerEconomicPolicy.POLICY_ALARM);
             onPropertiesChanged(DeviceConfig.getProperties(DeviceConfig.NAMESPACE_ALARM_MANAGER));
-            updateTareSettings(
-                    economyManagerInternal.getEnabledMode(AlarmManagerEconomicPolicy.POLICY_ALARM));
         }
 
         @SuppressLint("MissingPermission")
@@ -1062,42 +1037,6 @@
             }
         }
 
-        @Override
-        public void onTareEnabledModeChanged(@EconomyManager.EnabledMode int enabledMode) {
-            updateTareSettings(enabledMode);
-        }
-
-        private void updateTareSettings(int enabledMode) {
-            synchronized (mLock) {
-                if (USE_TARE_POLICY != enabledMode) {
-                    USE_TARE_POLICY = enabledMode;
-                    final boolean changed = mAlarmStore.updateAlarmDeliveries(alarm -> {
-                        final boolean standbyChanged = adjustDeliveryTimeBasedOnBucketLocked(alarm);
-                        final boolean tareChanged = adjustDeliveryTimeBasedOnTareLocked(alarm);
-                        if (USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) {
-                            // Only register listeners if we're going to be acting on the policy.
-                            registerTareListener(alarm);
-                        } else {
-                            mEconomyManagerInternal.unregisterAffordabilityChangeListener(
-                                    UserHandle.getUserId(alarm.uid), alarm.sourcePackage,
-                                    mAffordabilityChangeListener,
-                                    TareBill.getAppropriateBill(alarm));
-                        }
-                        return standbyChanged || tareChanged;
-                    });
-                    if (USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON) {
-                        // Remove the cached values so we don't accidentally use them when TARE is
-                        // re-enabled.
-                        mAffordabilityCache.clear();
-                    }
-                    if (changed) {
-                        rescheduleKernelAlarmsLocked();
-                        updateNextAlarmClockLocked();
-                    }
-                }
-            }
-        }
-
         private void updateDeviceIdleFuzzBoundaries() {
             final DeviceConfig.Properties properties = DeviceConfig.getProperties(
                     DeviceConfig.NAMESPACE_ALARM_MANAGER,
@@ -1253,10 +1192,6 @@
             TimeUtils.formatDuration(MAX_DEVICE_IDLE_FUZZ, pw);
             pw.println();
 
-            pw.print(Settings.Global.ENABLE_TARE,
-                    EconomyManager.enabledModeToString(USE_TARE_POLICY));
-            pw.println();
-
             pw.print(KEY_TEMPORARY_QUOTA_BUMP, TEMPORARY_QUOTA_BUMP);
             pw.println();
 
@@ -1382,6 +1317,7 @@
     @GuardedBy("mLock")
     AlarmStore mAlarmStore;
 
+    UserWakeupStore mUserWakeupStore;
     // set to non-null if in idle mode; while in this mode, any alarms we don't want
     // to run during this time are rescehduled to go off after this alarm.
     Alarm mPendingIdleUntil = null;
@@ -1391,7 +1327,6 @@
     AlarmManagerService(Context context, Injector injector) {
         super(context);
         mInjector = injector;
-        mEconomyManagerInternal = LocalServices.getService(EconomyManagerInternal.class);
     }
 
     public AlarmManagerService(Context context) {
@@ -1498,29 +1433,6 @@
         return changed;
     }
 
-    /**
-     * Recalculates alarm send times based on TARE wealth.
-     *
-     * @param targetPackages [Package, User] pairs for which alarms need to be re-evaluated,
-     *                       null indicates all
-     * @return True if there was any reordering done to the current list.
-     */
-    boolean reorderAlarmsBasedOnTare(ArraySet<UserPackage> targetPackages) {
-        final long start = mStatLogger.getTime();
-
-        final boolean changed = mAlarmStore.updateAlarmDeliveries(a -> {
-            final UserPackage userPackage =
-                    UserPackage.of(UserHandle.getUserId(a.creatorUid), a.sourcePackage);
-            if (targetPackages != null && !targetPackages.contains(userPackage)) {
-                return false;
-            }
-            return adjustDeliveryTimeBasedOnTareLocked(a);
-        });
-
-        mStatLogger.logDurationStat(Stats.REORDER_ALARMS_FOR_TARE, start);
-        return changed;
-    }
-
     private boolean restoreRequestedTime(Alarm a) {
         return a.setPolicyElapsed(REQUESTER_POLICY_INDEX, convertToElapsed(a.origWhen, a.type));
     }
@@ -1882,6 +1794,11 @@
         mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
 
         mUseFrozenStateToDropListenerAlarms = Flags.useFrozenStateToDropListenerAlarms();
+        mStartUserBeforeScheduledAlarms = Flags.startUserBeforeScheduledAlarms();
+        if (mStartUserBeforeScheduledAlarms) {
+            mUserWakeupStore = new UserWakeupStore();
+            mUserWakeupStore.init();
+        }
         if (mUseFrozenStateToDropListenerAlarms) {
             final ActivityManager.UidFrozenStateChangedCallback callback = (uids, frozenStates) -> {
                 final int size = frozenStates.length;
@@ -2041,6 +1958,9 @@
     public void onUserStarting(TargetUser user) {
         super.onUserStarting(user);
         final int userId = user.getUserIdentifier();
+        if (mStartUserBeforeScheduledAlarms) {
+            mUserWakeupStore.onUserStarting(userId);
+        }
         mHandler.post(() -> {
             for (final int appId : mExactAlarmCandidates) {
                 final int uid = UserHandle.getUid(userId, appId);
@@ -2570,8 +2490,7 @@
      */
     private boolean adjustDeliveryTimeBasedOnBucketLocked(Alarm alarm) {
         final long nowElapsed = mInjector.getElapsedRealtimeMillis();
-        if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON
-                || isExemptFromAppStandby(alarm) || mAppStandbyParole) {
+        if (isExemptFromAppStandby(alarm) || mAppStandbyParole) {
             return alarm.setPolicyElapsed(APP_STANDBY_POLICY_INDEX, nowElapsed);
         }
 
@@ -2622,60 +2541,6 @@
         return alarm.setPolicyElapsed(APP_STANDBY_POLICY_INDEX, nowElapsed);
     }
 
-    /**
-     * Adjusts the alarm's policy time for TARE.
-     *
-     * @param alarm The alarm to update.
-     * @return {@code true} if the actual delivery time of the given alarm was updated due to
-     * adjustments made in this call.
-     */
-    private boolean adjustDeliveryTimeBasedOnTareLocked(Alarm alarm) {
-        final long nowElapsed = mInjector.getElapsedRealtimeMillis();
-        if (mConstants.USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON
-                || isExemptFromTare(alarm) || hasEnoughWealthLocked(alarm)) {
-            return alarm.setPolicyElapsed(TARE_POLICY_INDEX, nowElapsed);
-        }
-
-        // Not enough wealth. Just keep deferring indefinitely till the quota changes.
-        return alarm.setPolicyElapsed(TARE_POLICY_INDEX, nowElapsed + INDEFINITE_DELAY);
-    }
-
-    private void registerTareListener(Alarm alarm) {
-        if (mConstants.USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON) {
-            // Only register listeners if we're going to be acting on the policy.
-            return;
-        }
-        mEconomyManagerInternal.registerAffordabilityChangeListener(
-                UserHandle.getUserId(alarm.creatorUid), alarm.sourcePackage,
-                mAffordabilityChangeListener, TareBill.getAppropriateBill(alarm));
-    }
-
-    /** Unregister the TARE listener associated with the alarm if it's no longer needed. */
-    @GuardedBy("mLock")
-    private void maybeUnregisterTareListenerLocked(Alarm alarm) {
-        if (mConstants.USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON) {
-            return;
-        }
-        final EconomyManagerInternal.ActionBill bill = TareBill.getAppropriateBill(alarm);
-        final Predicate<Alarm> isSameAlarmTypeForSameApp = (a) ->
-                alarm.creatorUid == a.creatorUid
-                        && alarm.sourcePackage.equals(a.sourcePackage)
-                        && bill.equals(TareBill.getAppropriateBill(a));
-        if (mAlarmStore.getCount(isSameAlarmTypeForSameApp) == 0) {
-            final int userId = UserHandle.getUserId(alarm.creatorUid);
-            mEconomyManagerInternal.unregisterAffordabilityChangeListener(
-                    userId, alarm.sourcePackage,
-                    mAffordabilityChangeListener, bill);
-            // Remove the cached value so we don't accidentally use it when the app
-            // schedules a new alarm.
-            ArrayMap<EconomyManagerInternal.ActionBill, Boolean> actionAffordability =
-                    mAffordabilityCache.get(userId, alarm.sourcePackage);
-            if (actionAffordability != null) {
-                actionAffordability.remove(bill);
-            }
-        }
-    }
-
     @GuardedBy("mLock")
     private void setImplLocked(Alarm a) {
         if ((a.flags & AlarmManager.FLAG_IDLE_UNTIL) != 0) {
@@ -2723,8 +2588,6 @@
         }
         adjustDeliveryTimeBasedOnBatterySaver(a);
         adjustDeliveryTimeBasedOnBucketLocked(a);
-        adjustDeliveryTimeBasedOnTareLocked(a);
-        registerTareListener(a);
         mAlarmStore.add(a);
         rescheduleKernelAlarmsLocked();
         updateNextAlarmClockLocked();
@@ -3150,41 +3013,15 @@
             pw.increaseIndent();
             pw.print(Flags.FLAG_USE_FROZEN_STATE_TO_DROP_LISTENER_ALARMS,
                     mUseFrozenStateToDropListenerAlarms);
+            pw.println();
+            pw.print(Flags.FLAG_START_USER_BEFORE_SCHEDULED_ALARMS,
+                    mStartUserBeforeScheduledAlarms);
             pw.decreaseIndent();
             pw.println();
             pw.println();
 
-            if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) {
-                pw.println("TARE details:");
-                pw.increaseIndent();
-
-                pw.println("Affordability cache:");
-                pw.increaseIndent();
-                mAffordabilityCache.forEach((userId, pkgName, billMap) -> {
-                    final int numBills = billMap.size();
-                    if (numBills > 0) {
-                        pw.print(userId);
-                        pw.print(":");
-                        pw.print(pkgName);
-                        pw.println(":");
-
-                        pw.increaseIndent();
-                        for (int i = 0; i < numBills; ++i) {
-                            pw.print(TareBill.getName(billMap.keyAt(i)));
-                            pw.print(": ");
-                            pw.println(billMap.valueAt(i));
-                        }
-                        pw.decreaseIndent();
-                    }
-                });
-                pw.decreaseIndent();
-
-                pw.decreaseIndent();
-                pw.println();
-            } else {
-                pw.println("App Standby Parole: " + mAppStandbyParole);
-                pw.println();
-            }
+            pw.println("App Standby Parole: " + mAppStandbyParole);
+            pw.println();
 
             if (mAppStateTracker != null) {
                 mAppStateTracker.dump(pw);
@@ -3398,6 +3235,12 @@
             pw.println("]");
             pw.println();
 
+            if (mStartUserBeforeScheduledAlarms) {
+                pw.println("Scheduled user wakeups:");
+                mUserWakeupStore.dump(pw, nowELAPSED);
+                pw.println();
+            }
+
             pw.println("App Alarm history:");
             mAppWakeupHistory.dump(pw, nowELAPSED);
 
@@ -3945,10 +3788,19 @@
                         formatNextAlarm(getContext(), alarmClock, userId));
             }
             mNextAlarmClockForUser.put(userId, alarmClock);
+            if (mStartUserBeforeScheduledAlarms) {
+                mUserWakeupStore.addUserWakeup(userId, convertToElapsed(
+                        mNextAlarmClockForUser.get(userId).getTriggerTime(), RTC));
+            }
         } else {
             if (DEBUG_ALARM_CLOCK) {
                 Log.v(TAG, "Next AlarmClockInfoForUser(" + userId + "): None");
             }
+            if (mStartUserBeforeScheduledAlarms) {
+                if (mActivityManagerInternal.isUserRunning(userId, 0)) {
+                    mUserWakeupStore.removeUserWakeup(userId);
+                }
+            }
             mNextAlarmClockForUser.remove(userId);
         }
 
@@ -4003,13 +3855,20 @@
                 DateFormat.format(pattern, info.getTriggerTime()).toString();
     }
 
+    @GuardedBy("mLock")
     void rescheduleKernelAlarmsLocked() {
         // Schedule the next upcoming wakeup alarm.  If there is a deliverable batch
         // prior to that which contains no wakeups, we schedule that as well.
         final long nowElapsed = mInjector.getElapsedRealtimeMillis();
         long nextNonWakeup = 0;
         if (mAlarmStore.size() > 0) {
-            final long firstWakeup = mAlarmStore.getNextWakeupDeliveryTime();
+            long firstWakeup = mAlarmStore.getNextWakeupDeliveryTime();
+            if (mStartUserBeforeScheduledAlarms && mUserWakeupStore != null) {
+                final long firstUserWakeup = mUserWakeupStore.getNextWakeupTime();
+                if (firstUserWakeup >= 0 && firstUserWakeup < firstWakeup) {
+                    firstWakeup = firstUserWakeup;
+                }
+            }
             final long first = mAlarmStore.getNextDeliveryTime();
             if (firstWakeup != 0) {
                 mNextWakeup = firstWakeup;
@@ -4100,7 +3959,6 @@
                 mRemovalHistory.put(removed.uid, bufferForUid);
             }
             bufferForUid.append(new RemovedAlarm(removed, reason, nowRtc, nowElapsed));
-            maybeUnregisterTareListenerLocked(removed);
         }
 
         if (removedFromStore) {
@@ -4460,11 +4318,6 @@
                             alarm.uid, alarm.statsTag);
                 }
                 mDeliveryTracker.deliverLocked(alarm, nowELAPSED);
-                reportAlarmEventToTare(alarm);
-                if (alarm.repeatInterval <= 0) {
-                    // Don't bother trying to unregister for a repeating alarm.
-                    maybeUnregisterTareListenerLocked(alarm);
-                }
             } catch (RuntimeException e) {
                 Slog.w(TAG, "Failure sending alarm.", e);
             }
@@ -4473,52 +4326,6 @@
         }
     }
 
-    private void reportAlarmEventToTare(Alarm alarm) {
-        // Don't bother reporting events if TARE is completely off.
-        if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_OFF) {
-            return;
-        }
-        final boolean allowWhileIdle =
-                (alarm.flags & (FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED | FLAG_ALLOW_WHILE_IDLE)) != 0;
-        final int action;
-        if (alarm.alarmClock != null) {
-            action = AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK;
-        } else if (alarm.wakeup) {
-            if (alarm.windowLength == 0) {
-                if (allowWhileIdle) {
-                    action = AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE;
-                } else {
-                    action = AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT;
-                }
-            } else {
-                if (allowWhileIdle) {
-                    action =
-                            AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE;
-                } else {
-                    action = AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT;
-                }
-            }
-        } else {
-            if (alarm.windowLength == 0) {
-                if (allowWhileIdle) {
-                    action = AlarmManagerEconomicPolicy
-                            .ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE;
-                } else {
-                    action = AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT;
-                }
-            } else {
-                if (allowWhileIdle) {
-                    action = AlarmManagerEconomicPolicy
-                            .ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE;
-                } else {
-                    action = AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT;
-                }
-            }
-        }
-        mEconomyManagerInternal.noteInstantaneousEvent(
-                UserHandle.getUserId(alarm.creatorUid), alarm.sourcePackage, action, null);
-    }
-
     @VisibleForTesting
     static boolean isExemptFromAppStandby(Alarm a) {
         return a.alarmClock != null || UserHandle.isCore(a.creatorUid)
@@ -4526,12 +4333,6 @@
     }
 
     @VisibleForTesting
-    static boolean isExemptFromTare(Alarm a) {
-        return a.alarmClock != null || UserHandle.isCore(a.creatorUid)
-                || (a.flags & (FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED)) != 0;
-    }
-
-    @VisibleForTesting
     static class Injector {
         private long mNativeData;
         private Context mContext;
@@ -4716,6 +4517,16 @@
                                             + ", elapsed=" + nowELAPSED);
                         }
 
+                        if (mStartUserBeforeScheduledAlarms) {
+                            final int[] userIds =
+                                    mUserWakeupStore.getUserIdsToWakeup(nowELAPSED);
+                            for (int i = 0; i < userIds.length; i++) {
+                                if (!mActivityManagerInternal.startUserInBackground(
+                                        userIds[i])) {
+                                    mUserWakeupStore.removeUserWakeup(userIds[i]);
+                                }
+                            }
+                        }
                         mLastTrigger = nowELAPSED;
                         final int wakeUps = triggerAlarmsLocked(triggerList, nowELAPSED);
                         if (wakeUps == 0 && checkAllowNonWakeupDelayLocked(nowELAPSED)) {
@@ -4768,13 +4579,7 @@
                                     wakeupUids.add(a.uid);
                                     increment(wakeupCountsPerUid, a.uid);
                                 }
-                                if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) {
-                                    if (!isExemptFromTare(a)) {
-                                        triggerPackages.add(UserPackage.of(
-                                                UserHandle.getUserId(a.creatorUid),
-                                                a.sourcePackage));
-                                    }
-                                } else if (!isExemptFromAppStandby(a)) {
+                                if (!isExemptFromAppStandby(a)) {
                                     triggerPackages.add(UserPackage.of(
                                             UserHandle.getUserId(a.creatorUid), a.sourcePackage));
                                 }
@@ -4785,11 +4590,7 @@
                             }
                             deliverAlarmsLocked(triggerList, nowELAPSED);
                             mTemporaryQuotaReserve.cleanUpExpiredQuotas(nowELAPSED);
-                            if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) {
-                                reorderAlarmsBasedOnTare(triggerPackages);
-                            } else {
-                                reorderAlarmsBasedOnStandbyBuckets(triggerPackages);
-                            }
+                            reorderAlarmsBasedOnStandbyBuckets(triggerPackages);
                             rescheduleKernelAlarmsLocked();
                             updateNextAlarmClockLocked();
                             logAlarmBatchDelivered(
@@ -4868,32 +4669,6 @@
         return alarm.creatorUid;
     }
 
-    @GuardedBy("mLock")
-    private boolean canAffordBillLocked(@NonNull Alarm alarm,
-            @NonNull EconomyManagerInternal.ActionBill bill) {
-        final int userId = UserHandle.getUserId(alarm.creatorUid);
-        final String pkgName = alarm.sourcePackage;
-        ArrayMap<EconomyManagerInternal.ActionBill, Boolean> actionAffordability =
-                mAffordabilityCache.get(userId, pkgName);
-        if (actionAffordability == null) {
-            actionAffordability = new ArrayMap<>();
-            mAffordabilityCache.add(userId, pkgName, actionAffordability);
-        }
-
-        if (actionAffordability.containsKey(bill)) {
-            return actionAffordability.get(bill);
-        }
-
-        final boolean canAfford = mEconomyManagerInternal.canPayFor(userId, pkgName, bill);
-        actionAffordability.put(bill, canAfford);
-        return canAfford;
-    }
-
-    @GuardedBy("mLock")
-    private boolean hasEnoughWealthLocked(@NonNull Alarm alarm) {
-        return canAffordBillLocked(alarm, TareBill.getAppropriateBill(alarm));
-    }
-
     private Bundle getAlarmOperationBundle(Alarm alarm) {
         if (alarm.mIdleOptions != null) {
             return alarm.mIdleOptions;
@@ -4919,7 +4694,6 @@
         // Unused id 9
         // Unused id 10
         public static final int REFRESH_EXACT_ALARM_CANDIDATES = 11;
-        public static final int TARE_AFFORDABILITY_CHANGED = 12;
         public static final int CHECK_EXACT_ALARM_PERMISSION_ON_UPDATE = 13;
         public static final int TEMPORARY_QUOTA_CHANGED = 14;
         public static final int REMOVE_EXACT_LISTENER_ALARMS_ON_CACHED = 15;
@@ -5000,20 +4774,6 @@
                     }
                     break;
 
-                case TARE_AFFORDABILITY_CHANGED:
-                    synchronized (mLock) {
-                        final int userId = msg.arg1;
-                        final String packageName = (String) msg.obj;
-
-                        final ArraySet<UserPackage> filterPackages = new ArraySet<>();
-                        filterPackages.add(UserPackage.of(userId, packageName));
-                        if (reorderAlarmsBasedOnTare(filterPackages)) {
-                            rescheduleKernelAlarmsLocked();
-                            updateNextAlarmClockLocked();
-                        }
-                    }
-                    break;
-
                 case REMOVE_FOR_CANCELED:
                     final PendingIntent operation = (PendingIntent) msg.obj;
                     synchronized (mLock) {
@@ -5164,6 +4924,10 @@
             IntentFilter sdFilter = new IntentFilter();
             sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
             sdFilter.addAction(Intent.ACTION_USER_STOPPED);
+            if (mStartUserBeforeScheduledAlarms) {
+                sdFilter.addAction(Intent.ACTION_LOCKED_BOOT_COMPLETED);
+                sdFilter.addAction(Intent.ACTION_USER_REMOVED);
+            }
             sdFilter.addAction(Intent.ACTION_UID_REMOVED);
             getContext().registerReceiverForAllUsers(this, sdFilter,
                     /* broadcastPermission */ null, /* scheduler */ null);
@@ -5194,6 +4958,22 @@
                             mTemporaryQuotaReserve.removeForUser(userHandle);
                         }
                         return;
+                    case Intent.ACTION_LOCKED_BOOT_COMPLETED:
+                        final int handle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
+                        if (handle >= 0) {
+                            if (mStartUserBeforeScheduledAlarms) {
+                                mUserWakeupStore.onUserStarted(handle);
+                            }
+                        }
+                        return;
+                    case Intent.ACTION_USER_REMOVED:
+                        final int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
+                        if (user >= 0) {
+                            if (mStartUserBeforeScheduledAlarms) {
+                                mUserWakeupStore.onUserRemoved(user);
+                            }
+                        }
+                        return;
                     case Intent.ACTION_UID_REMOVED:
                         mLastPriorityAlarmDispatch.delete(uid);
                         mRemovalHistory.delete(uid);
@@ -5300,33 +5080,6 @@
         }
     }
 
-    private final EconomyManagerInternal.AffordabilityChangeListener mAffordabilityChangeListener =
-            new EconomyManagerInternal.AffordabilityChangeListener() {
-                @Override
-                public void onAffordabilityChanged(int userId, @NonNull String packageName,
-                        @NonNull EconomyManagerInternal.ActionBill bill, boolean canAfford) {
-                    if (DEBUG_TARE) {
-                        Slog.d(TAG,
-                                userId + ":" + packageName + " affordability for "
-                                        + TareBill.getName(bill) + " changed to " + canAfford);
-                    }
-
-                    synchronized (mLock) {
-                        ArrayMap<EconomyManagerInternal.ActionBill, Boolean> actionAffordability =
-                                mAffordabilityCache.get(userId, packageName);
-                        if (actionAffordability == null) {
-                            actionAffordability = new ArrayMap<>();
-                            mAffordabilityCache.add(userId, packageName, actionAffordability);
-                        }
-                        actionAffordability.put(bill, canAfford);
-                    }
-
-                    mHandler.obtainMessage(AlarmHandler.TARE_AFFORDABILITY_CHANGED, userId,
-                            canAfford ? 1 : 0, packageName)
-                            .sendToTarget();
-                }
-            };
-
     private final Listener mForceAppStandbyListener = new Listener() {
 
         @Override
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/TareBill.java b/apex/jobscheduler/service/java/com/android/server/alarm/TareBill.java
deleted file mode 100644
index a348136..0000000
--- a/apex/jobscheduler/service/java/com/android/server/alarm/TareBill.java
+++ /dev/null
@@ -1,144 +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.server.alarm;
-
-import static android.app.AlarmManager.FLAG_ALLOW_WHILE_IDLE;
-import static android.app.AlarmManager.FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED;
-
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE;
-
-import android.annotation.NonNull;
-
-import com.android.server.tare.EconomyManagerInternal;
-import com.android.server.tare.EconomyManagerInternal.ActionBill;
-
-import java.util.List;
-
-/**
- * Container to maintain alarm TARE {@link ActionBill ActionBills} and their related methods.
- */
-final class TareBill {
-    /**
-     * Bill to use for AlarmClocks.
-     */
-    static final ActionBill ALARM_CLOCK = new ActionBill(List.of(
-            new EconomyManagerInternal.AnticipatedAction(ACTION_ALARM_CLOCK, 1, 0)));
-    /**
-     * Bills to use for various alarm types.
-     */
-    static final ActionBill NONWAKEUP_INEXACT_ALARM = new ActionBill(List.of(
-            new EconomyManagerInternal.AnticipatedAction(ACTION_ALARM_NONWAKEUP_INEXACT, 1, 0)));
-    static final ActionBill NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM = new ActionBill(List.of(
-            new EconomyManagerInternal.AnticipatedAction(
-                    ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE, 1, 0)));
-    static final ActionBill NONWAKEUP_EXACT_ALARM = new ActionBill(List.of(
-            new EconomyManagerInternal.AnticipatedAction(ACTION_ALARM_NONWAKEUP_EXACT, 1, 0)));
-    static final ActionBill NONWAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM = new ActionBill(List.of(
-            new EconomyManagerInternal.AnticipatedAction(
-                    ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE, 1, 0)));
-    static final ActionBill WAKEUP_INEXACT_ALARM = new ActionBill(List.of(
-            new EconomyManagerInternal.AnticipatedAction(ACTION_ALARM_WAKEUP_INEXACT, 1, 0)));
-    static final ActionBill WAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM = new ActionBill(List.of(
-            new EconomyManagerInternal.AnticipatedAction(
-                    ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE, 1, 0)));
-    static final ActionBill WAKEUP_EXACT_ALARM = new ActionBill(List.of(
-            new EconomyManagerInternal.AnticipatedAction(ACTION_ALARM_WAKEUP_EXACT, 1, 0)));
-    static final ActionBill WAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM = new ActionBill(List.of(
-            new EconomyManagerInternal.AnticipatedAction(
-                    ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE, 1, 0)));
-
-    @NonNull
-    static ActionBill getAppropriateBill(@NonNull Alarm alarm) {
-        if (alarm.alarmClock != null) {
-            return ALARM_CLOCK;
-        }
-
-        final boolean allowWhileIdle =
-                (alarm.flags & (FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED | FLAG_ALLOW_WHILE_IDLE)) != 0;
-        final boolean isExact = alarm.windowLength == 0;
-
-        if (alarm.wakeup) {
-            if (isExact) {
-                if (allowWhileIdle) {
-                    return WAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM;
-                }
-                return WAKEUP_EXACT_ALARM;
-            }
-            // Inexact
-            if (allowWhileIdle) {
-                return WAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM;
-            }
-            return WAKEUP_INEXACT_ALARM;
-        }
-
-        // Nonwakeup
-        if (isExact) {
-            if (allowWhileIdle) {
-                return NONWAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM;
-            }
-            return NONWAKEUP_EXACT_ALARM;
-
-        }
-        if (allowWhileIdle) {
-            return NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM;
-        }
-        return NONWAKEUP_INEXACT_ALARM;
-    }
-
-    @NonNull
-    static String getName(@NonNull ActionBill bill) {
-        if (bill.equals(ALARM_CLOCK)) {
-            return "ALARM_CLOCK_BILL";
-        }
-        if (bill.equals(NONWAKEUP_INEXACT_ALARM)) {
-            return "NONWAKEUP_INEXACT_ALARM_BILL";
-        }
-        if (bill.equals(NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM)) {
-            return "NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM_BILL";
-        }
-        if (bill.equals(NONWAKEUP_EXACT_ALARM)) {
-            return "NONWAKEUP_EXACT_ALARM_BILL";
-        }
-        if (bill.equals(NONWAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM)) {
-            return "NONWAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM_BILL";
-        }
-        if (bill.equals(WAKEUP_INEXACT_ALARM)) {
-            return "WAKEUP_INEXACT_ALARM_BILL";
-        }
-        if (bill.equals(WAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM)) {
-            return "WAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM_BILL";
-        }
-        if (bill.equals(WAKEUP_EXACT_ALARM)) {
-            return "WAKEUP_EXACT_ALARM_BILL";
-        }
-        if (bill.equals(WAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM)) {
-            return "WAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM_BILL";
-        }
-        return "UNKNOWN_BILL (" + bill.toString() + ")";
-    }
-
-    private TareBill() {
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/UserWakeupStore.java b/apex/jobscheduler/service/java/com/android/server/alarm/UserWakeupStore.java
new file mode 100644
index 0000000..a0d9133
--- /dev/null
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/UserWakeupStore.java
@@ -0,0 +1,381 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.alarm;
+
+
+import android.annotation.Nullable;
+import android.os.Environment;
+import android.os.SystemClock;
+import android.util.AtomicFile;
+import android.util.IndentingPrintWriter;
+import android.util.Pair;
+import android.util.Slog;
+import android.util.SparseLongArray;
+import android.util.TimeUtils;
+import android.util.Xml;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.os.BackgroundThread;
+import com.android.internal.util.FastXmlSerializer;
+import com.android.internal.util.XmlUtils;
+import com.android.modules.utils.TypedXmlPullParser;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * User wakeup store keeps the list of user ids with the times that user needs to be started in
+ * sorted list in order for alarms to execute even if user gets stopped.
+ * The list of user ids with at least one alarms scheduled is also persisted to the XML file to
+ * start them after the device reboot.
+ */
+public class UserWakeupStore {
+    private static final boolean DEBUG = false;
+
+    static final String USER_WAKEUP_TAG = UserWakeupStore.class.getSimpleName();
+    private static final String TAG_USERS = "users";
+    private static final String TAG_USER = "user";
+    private static final String ATTR_USER_ID = "user_id";
+    private static final String ATTR_VERSION = "version";
+
+    public static final int XML_VERSION_CURRENT = 1;
+    @VisibleForTesting
+    static final String ROOT_DIR_NAME = "alarms";
+    @VisibleForTesting
+    static final String USERS_FILE_NAME = "usersWithAlarmClocks.xml";
+
+    /**
+     * Time offset of user start before the original alarm time in milliseconds.
+     * Also used to schedule user start after reboot to avoid starting them simultaneously.
+     */
+    @VisibleForTesting
+    static final long BUFFER_TIME_MS = TimeUnit.SECONDS.toMillis(30);
+    /**
+     * Maximum time deviation limit to introduce a 5-second time window for user starts.
+     */
+    @VisibleForTesting
+    static final long USER_START_TIME_DEVIATION_LIMIT_MS = TimeUnit.SECONDS.toMillis(5);
+    /**
+     * Delay between two consecutive user starts scheduled during user wakeup store initialization.
+     */
+    @VisibleForTesting
+    static final long INITIAL_USER_START_SCHEDULING_DELAY_MS = TimeUnit.SECONDS.toMillis(5);
+
+    private final Object mUserWakeupLock = new Object();
+
+    /**
+     * A list of wakeups for users with scheduled alarms.
+     */
+    @GuardedBy("mUserWakeupLock")
+    private final SparseLongArray mUserStarts = new SparseLongArray();
+    /**
+     * A list of users that are in a phase after they have been started but before alarms were
+     * initialized.
+     */
+    @GuardedBy("mUserWakeupLock")
+    private final SparseLongArray mStartingUsers = new SparseLongArray();
+    private Executor mBackgroundExecutor;
+    private static final File USER_WAKEUP_DIR = new File(Environment.getDataSystemDirectory(),
+            ROOT_DIR_NAME);
+    private static final Random sRandom = new Random(500);
+
+    /**
+     * Initialize mUserWakeups with persisted values.
+     */
+    public void init() {
+        mBackgroundExecutor = BackgroundThread.getExecutor();
+        mBackgroundExecutor.execute(this::readUserIdList);
+    }
+
+    /**
+     * Add user wakeup for the alarm.
+     * @param userId Id of the user that scheduled alarm.
+     * @param alarmTime time when alarm is expected to trigger.
+     */
+    public void addUserWakeup(int userId, long alarmTime) {
+        synchronized (mUserWakeupLock) {
+            // This should not be needed, but if an app in the user is scheduling an alarm clock, we
+            // consider the user start complete. There is a dedicated removal when user is started.
+            mStartingUsers.delete(userId);
+            mUserStarts.put(userId, alarmTime - BUFFER_TIME_MS + getUserWakeupOffset());
+        }
+        updateUserListFile();
+    }
+
+    /**
+     * Remove wakeup scheduled for the user with given userId if present.
+     */
+    public void removeUserWakeup(int userId) {
+        synchronized (mUserWakeupLock) {
+            mUserStarts.delete(userId);
+        }
+        updateUserListFile();
+    }
+
+    /**
+     * Get ids of users that need to be started now.
+     * @param nowElapsed current time.
+     * @return user ids to be started, or empty if no user needs to be started.
+     */
+    public int[] getUserIdsToWakeup(long nowElapsed) {
+        synchronized (mUserWakeupLock) {
+            final int[] userIds = new int[mUserStarts.size()];
+            int index = 0;
+            for (int i = mUserStarts.size() - 1; i >= 0; i--) {
+                if (mUserStarts.valueAt(i) <= nowElapsed) {
+                    userIds[index++] = mUserStarts.keyAt(i);
+                }
+            }
+            return Arrays.copyOfRange(userIds, 0, index);
+        }
+    }
+
+    /**
+     * Persist user ids that have alarms scheduled so that they can be started after device reboot.
+     */
+    private void updateUserListFile() {
+        mBackgroundExecutor.execute(() -> {
+            try {
+                writeUserIdList();
+                if (DEBUG) {
+                    synchronized (mUserWakeupLock) {
+                        Slog.i(USER_WAKEUP_TAG, "Printing out user wakeups " + mUserStarts.size());
+                        for (int i = 0; i < mUserStarts.size(); i++) {
+                            Slog.i(USER_WAKEUP_TAG, "User id: " + mUserStarts.keyAt(i) + "  time: "
+                                    + mUserStarts.valueAt(i));
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                Slog.e(USER_WAKEUP_TAG, "Failed to write " + e.getLocalizedMessage());
+            }
+        });
+    }
+
+    /**
+     * Return scheduled start time for user or -1 if user does not have alarm set.
+     */
+    @VisibleForTesting
+    long getWakeupTimeForUserForTest(int userId) {
+        synchronized (mUserWakeupLock) {
+            return mUserStarts.get(userId, -1);
+        }
+    }
+
+    /**
+     * Move user from wakeup list to starting user list.
+     */
+    public void onUserStarting(int userId) {
+        synchronized (mUserWakeupLock) {
+            mStartingUsers.put(userId, getWakeupTimeForUserForTest(userId));
+            mUserStarts.delete(userId);
+        }
+    }
+
+    /**
+     * Remove userId from starting user list once start is complete.
+     */
+    public void onUserStarted(int userId) {
+        synchronized (mUserWakeupLock) {
+            mStartingUsers.delete(userId);
+        }
+        updateUserListFile();
+    }
+
+    /**
+     * Remove userId from the store when the user is removed.
+     */
+    public void onUserRemoved(int userId) {
+        synchronized (mUserWakeupLock) {
+            mUserStarts.delete(userId);
+            mStartingUsers.delete(userId);
+        }
+        updateUserListFile();
+    }
+
+    /**
+     * Get the soonest wakeup time in the store.
+     */
+    public long getNextWakeupTime() {
+        long nextWakeupTime = -1;
+        synchronized (mUserWakeupLock) {
+            for (int i = 0; i < mUserStarts.size(); i++) {
+                if (mUserStarts.valueAt(i) < nextWakeupTime || nextWakeupTime == -1) {
+                    nextWakeupTime = mUserStarts.valueAt(i);
+                }
+            }
+        }
+        return nextWakeupTime;
+    }
+
+    private static long getUserWakeupOffset() {
+        return sRandom.nextLong(USER_START_TIME_DEVIATION_LIMIT_MS * 2)
+                - USER_START_TIME_DEVIATION_LIMIT_MS;
+    }
+
+    /**
+     * Write a list of ids for users who have alarm scheduled.
+     * Sample XML file:
+     *
+     * <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+     * <users version="1">
+     * <user user_id="12" />
+     * <user user_id="10" />
+     * </users>
+     * ~
+     */
+    private void writeUserIdList() {
+        final AtomicFile file = getUserWakeupFile();
+        if (file == null) {
+            return;
+        }
+        try (FileOutputStream fos = file.startWrite(SystemClock.uptimeMillis())) {
+            final XmlSerializer out = new FastXmlSerializer();
+            out.setOutput(fos, StandardCharsets.UTF_8.name());
+            out.startDocument(null, true);
+            out.startTag(null, TAG_USERS);
+            XmlUtils.writeIntAttribute(out, ATTR_VERSION, XML_VERSION_CURRENT);
+            final List<Pair<Integer, Long>> listOfUsers = new ArrayList<>();
+            synchronized (mUserWakeupLock) {
+                for (int i = 0; i < mUserStarts.size(); i++) {
+                    listOfUsers.add(new Pair<>(mUserStarts.keyAt(i), mUserStarts.valueAt(i)));
+                }
+                for (int i = 0; i < mStartingUsers.size(); i++) {
+                    listOfUsers.add(new Pair<>(mStartingUsers.keyAt(i), mStartingUsers.valueAt(i)));
+                }
+            }
+            Collections.sort(listOfUsers, Comparator.comparingLong(pair -> pair.second));
+            for (int i = 0; i < listOfUsers.size(); i++) {
+                out.startTag(null, TAG_USER);
+                XmlUtils.writeIntAttribute(out, ATTR_USER_ID, listOfUsers.get(i).first);
+                out.endTag(null, TAG_USER);
+            }
+            out.endTag(null, TAG_USERS);
+            out.endDocument();
+            file.finishWrite(fos);
+        } catch (IOException e) {
+            Slog.wtf(USER_WAKEUP_TAG, "Error writing user wakeup data", e);
+            file.delete();
+        }
+    }
+
+    private void readUserIdList() {
+        final AtomicFile userWakeupFile = getUserWakeupFile();
+        if (userWakeupFile == null) {
+            return;
+        } else if (!userWakeupFile.exists()) {
+            Slog.w(USER_WAKEUP_TAG, "User wakeup file not available: "
+                    + userWakeupFile.getBaseFile());
+            return;
+        }
+        synchronized (mUserWakeupLock) {
+            mUserStarts.clear();
+            mStartingUsers.clear();
+        }
+        try (FileInputStream fis = userWakeupFile.openRead()) {
+            final TypedXmlPullParser parser = Xml.resolvePullParser(fis);
+            int type;
+            while ((type = parser.next()) != XmlPullParser.START_TAG
+                    && type != XmlPullParser.END_DOCUMENT) {
+                // Skip
+            }
+            if (type != XmlPullParser.START_TAG) {
+                Slog.e(USER_WAKEUP_TAG, "Unable to read user list. No start tag found in "
+                        + userWakeupFile.getBaseFile());
+                return;
+            }
+            int version = -1;
+            if (parser.getName().equals(TAG_USERS)) {
+                version = parser.getAttributeInt(null, ATTR_VERSION, version);
+            }
+
+            long counter = 0;
+            final long currentTime = SystemClock.elapsedRealtime();
+            // Time delay between now and first user wakeup is scheduled.
+            final long scheduleOffset = currentTime + BUFFER_TIME_MS + getUserWakeupOffset();
+            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
+                if (type == XmlPullParser.START_TAG) {
+                    if (parser.getName().equals(TAG_USER)) {
+                        final int id = parser.getAttributeInt(null, ATTR_USER_ID);
+                        synchronized (mUserWakeupLock) {
+                            mUserStarts.put(id, scheduleOffset + (counter++
+                                    * INITIAL_USER_START_SCHEDULING_DELAY_MS));
+                        }
+                    }
+                }
+            }
+        } catch (IOException | XmlPullParserException e) {
+            Slog.wtf(USER_WAKEUP_TAG, "Error reading user wakeup data", e);
+        }
+    }
+
+    @Nullable
+    private AtomicFile getUserWakeupFile() {
+        if (!USER_WAKEUP_DIR.exists() && !USER_WAKEUP_DIR.mkdir()) {
+            Slog.wtf(USER_WAKEUP_TAG, "Failed to mkdir() user list file: " + USER_WAKEUP_DIR);
+            return null;
+        }
+        final File userFile = new File(USER_WAKEUP_DIR, USERS_FILE_NAME);
+        return new AtomicFile(userFile);
+    }
+
+    void dump(IndentingPrintWriter pw, long nowELAPSED) {
+        synchronized (mUserWakeupLock) {
+            pw.increaseIndent();
+            pw.print("User wakeup store file path: ");
+            final AtomicFile file = getUserWakeupFile();
+            if (file == null) {
+                pw.println("null");
+            } else {
+                pw.println(file.getBaseFile().getAbsolutePath());
+            }
+            pw.println(mUserStarts.size() + " user wakeups scheduled: ");
+            for (int i = 0; i < mUserStarts.size(); i++) {
+                pw.print("UserId: ");
+                pw.print(mUserStarts.keyAt(i));
+                pw.print(", userStartTime: ");
+                TimeUtils.formatDuration(mUserStarts.valueAt(i), nowELAPSED, pw);
+                pw.println();
+            }
+            pw.println(mStartingUsers.size() + " starting users: ");
+            for (int i = 0; i < mStartingUsers.size(); i++) {
+                pw.print("UserId: ");
+                pw.print(mStartingUsers.keyAt(i));
+                pw.print(", userStartTime: ");
+                TimeUtils.formatDuration(mStartingUsers.valueAt(i), nowELAPSED, pw);
+                pw.println();
+            }
+            pw.decreaseIndent();
+        }
+    }
+}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
index bd00c03..10162fd 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -45,7 +45,6 @@
 import android.app.job.JobSnapshot;
 import android.app.job.JobWorkItem;
 import android.app.job.UserVisibleJobSummary;
-import android.app.tare.EconomyManager;
 import android.app.usage.UsageStatsManager;
 import android.app.usage.UsageStatsManagerInternal;
 import android.compat.annotation.ChangeId;
@@ -85,7 +84,6 @@
 import android.os.WorkSource;
 import android.os.storage.StorageManagerInternal;
 import android.provider.DeviceConfig;
-import android.provider.Settings;
 import android.text.format.DateUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
@@ -130,13 +128,10 @@
 import com.android.server.job.controllers.RestrictingController;
 import com.android.server.job.controllers.StateController;
 import com.android.server.job.controllers.StorageController;
-import com.android.server.job.controllers.TareController;
 import com.android.server.job.controllers.TimeController;
 import com.android.server.job.restrictions.JobRestriction;
 import com.android.server.job.restrictions.ThermalStatusRestriction;
 import com.android.server.pm.UserManagerInternal;
-import com.android.server.tare.EconomyManagerInternal;
-import com.android.server.tare.JobSchedulerEconomicPolicy;
 import com.android.server.usage.AppStandbyInternal;
 import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
 import com.android.server.utils.quota.Categorizer;
@@ -304,12 +299,12 @@
     private final ConnectivityController mConnectivityController;
     /** Need directly for sending uid state changes */
     private final DeviceIdleJobsController mDeviceIdleJobsController;
+    /** Need direct access to this for testing. */
+    private final FlexibilityController mFlexibilityController;
     /** Needed to get next estimated launch time. */
     private final PrefetchController mPrefetchController;
     /** Needed to get remaining quota time. */
     private final QuotaController mQuotaController;
-    /** Needed to get max execution time and expedited-job allowance. */
-    private final TareController mTareController;
     /**
      * List of restrictions.
      * Note: do not add to or remove from this list at runtime except in the constructor, because we
@@ -483,8 +478,7 @@
     // (ScheduledJobStateChanged and JobStatusDumpProto).
     public static final int EXEMPTED_INDEX = 6;
 
-    private class ConstantsObserver implements DeviceConfig.OnPropertiesChangedListener,
-            EconomyManagerInternal.TareStateChangeListener {
+    private class ConstantsObserver implements DeviceConfig.OnPropertiesChangedListener {
         @Nullable
         @GuardedBy("mLock")
         private DeviceConfig.Properties mLastPropertiesPulled;
@@ -514,16 +508,6 @@
         public void start() {
             DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_JOB_SCHEDULER,
                     AppSchedulingModuleThread.getExecutor(), this);
-            final EconomyManagerInternal economyManagerInternal =
-                    LocalServices.getService(EconomyManagerInternal.class);
-            economyManagerInternal
-                    .registerTareStateChangeListener(this, JobSchedulerEconomicPolicy.POLICY_JOB);
-            // Load all the constants.
-            synchronized (mLock) {
-                mConstants.updateTareSettingsLocked(
-                        economyManagerInternal.getEnabledMode(
-                                JobSchedulerEconomicPolicy.POLICY_JOB));
-            }
             onPropertiesChanged(DeviceConfig.getProperties(DeviceConfig.NAMESPACE_JOB_SCHEDULER));
         }
 
@@ -643,16 +627,6 @@
             mHandler.sendEmptyMessage(MSG_CHECK_JOB);
         }
 
-        @Override
-        public void onTareEnabledModeChanged(@EconomyManager.EnabledMode int enabledMode) {
-            if (mConstants.updateTareSettingsLocked(enabledMode)) {
-                for (int controller = 0; controller < mControllers.size(); controller++) {
-                    final StateController sc = mControllers.get(controller);
-                    sc.onConstantsUpdatedLocked();
-                }
-                onControllerStateChanged(null);
-            }
-        }
     }
 
     @VisibleForTesting
@@ -1049,12 +1023,6 @@
          */
         public int MAX_NUM_PERSISTED_JOB_WORK_ITEMS = DEFAULT_MAX_NUM_PERSISTED_JOB_WORK_ITEMS;
 
-        /**
-         * If true, use TARE policy for job limiting. If false, use quotas.
-         */
-        public boolean USE_TARE_POLICY = EconomyManager.DEFAULT_ENABLE_POLICY_JOB_SCHEDULER
-                && EconomyManager.DEFAULT_ENABLE_TARE_MODE == EconomyManager.ENABLED_MODE_ON;
-
         public Constants() {
             copyTransportBatchThresholdDefaults();
         }
@@ -1298,16 +1266,6 @@
                     DEFAULT_RUNTIME_USE_DATA_ESTIMATES_FOR_LIMITS);
         }
 
-        private boolean updateTareSettingsLocked(@EconomyManager.EnabledMode int enabledMode) {
-            boolean changed = false;
-            final boolean useTare = enabledMode == EconomyManager.ENABLED_MODE_ON;
-            if (USE_TARE_POLICY != useTare) {
-                USE_TARE_POLICY = useTare;
-                changed = true;
-            }
-            return changed;
-        }
-
         void dump(IndentingPrintWriter pw) {
             pw.println("Settings:");
             pw.increaseIndent();
@@ -1381,8 +1339,6 @@
             pw.print(KEY_MAX_NUM_PERSISTED_JOB_WORK_ITEMS, MAX_NUM_PERSISTED_JOB_WORK_ITEMS)
                     .println();
 
-            pw.print(Settings.Global.ENABLE_TARE, USE_TARE_POLICY).println();
-
             pw.decreaseIndent();
         }
 
@@ -1867,9 +1823,7 @@
 
             // Return failure early if expedited job quota used up.
             if (jobStatus.isRequestedExpeditedJob()) {
-                if ((mConstants.USE_TARE_POLICY && !mTareController.canScheduleEJ(jobStatus))
-                        || (!mConstants.USE_TARE_POLICY
-                        && !mQuotaController.isWithinEJQuotaLocked(jobStatus))) {
+                if (!mQuotaController.isWithinEJQuotaLocked(jobStatus)) {
                     Counter.logIncrementWithUid(
                             "job_scheduler.value_cntr_w_uid_schedule_failure_ej_out_of_quota",
                             callingUid);
@@ -2701,17 +2655,16 @@
         mControllers = new ArrayList<StateController>();
         mPrefetchController = new PrefetchController(this);
         mControllers.add(mPrefetchController);
-        final FlexibilityController flexibilityController =
-                new FlexibilityController(this, mPrefetchController);
-        mControllers.add(flexibilityController);
+        mFlexibilityController = new FlexibilityController(this, mPrefetchController);
+        mControllers.add(mFlexibilityController);
         mConnectivityController =
-                new ConnectivityController(this, flexibilityController);
+                new ConnectivityController(this, mFlexibilityController);
         mControllers.add(mConnectivityController);
         mControllers.add(new TimeController(this));
-        final IdleController idleController = new IdleController(this, flexibilityController);
+        final IdleController idleController = new IdleController(this, mFlexibilityController);
         mControllers.add(idleController);
         final BatteryController batteryController =
-                new BatteryController(this, flexibilityController);
+                new BatteryController(this, mFlexibilityController);
         mControllers.add(batteryController);
         mStorageController = new StorageController(this);
         mControllers.add(mStorageController);
@@ -2725,9 +2678,6 @@
                 new QuotaController(this, backgroundJobsController, mConnectivityController);
         mControllers.add(mQuotaController);
         mControllers.add(new ComponentController(this));
-        mTareController =
-                new TareController(this, backgroundJobsController, mConnectivityController);
-        mControllers.add(mTareController);
 
         startControllerTrackingAsync();
 
@@ -4242,10 +4192,7 @@
                             job.getTimeoutBlamePackageName(), timeoutTag)
                             ? normalUpperLimitMs
                             : mConstants.RUNTIME_MIN_GUARANTEE_MS;
-            return Math.min(upperLimitMs,
-                    mConstants.USE_TARE_POLICY
-                            ? mTareController.getMaxJobExecutionTimeMsLocked(job)
-                            : mQuotaController.getMaxJobExecutionTimeMsLocked(job));
+            return Math.min(upperLimitMs, mQuotaController.getMaxJobExecutionTimeMsLocked(job));
         }
     }
 
@@ -4783,6 +4730,10 @@
      * Returns whether the app holds the {@link Manifest.permission.RUN_BACKUP_JOBS} permission.
      */
     private boolean hasRunBackupJobsPermission(@NonNull String packageName, int packageUid) {
+        // This permission is currently hidden so always return false for now (see b/331272951)
+        return false;
+
+        /**
         if (packageName == null) {
             Slog.wtfStack(TAG,
                     "Expected a non-null package name when calling hasRunBackupJobsPermission");
@@ -4793,6 +4744,7 @@
                 android.Manifest.permission.RUN_BACKUP_JOBS,
                 PermissionChecker.PID_UNKNOWN, packageUid, packageName)
                     == PermissionChecker.PERMISSION_GRANTED;
+        */
     }
 
     /**
@@ -5556,6 +5508,15 @@
         return 0;
     }
 
+    // Shell command infrastructure: set flex policy
+    void setFlexPolicy(boolean override, int appliedConstraints) {
+        if (DEBUG) {
+            Slog.v(TAG, "setFlexPolicy(): " + override + "/" + appliedConstraints);
+        }
+
+        mFlexibilityController.setLocalPolicyForTesting(override, appliedConstraints);
+    }
+
     void setMonitorBattery(boolean enabled) {
         synchronized (mLock) {
             mBatteryStateTracker.setMonitorBatteryLocked(enabled);
@@ -5732,11 +5693,6 @@
     }
 
     @VisibleForTesting
-    protected TareController getTareController() {
-        return mTareController;
-    }
-
-    @VisibleForTesting
     protected void waitOnAsyncLoadingForTesting() throws Exception {
         mStartControllerTrackingLatch.await();
         // Ignore the job store loading for testing.
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java
index af7b27e..ac240ccf 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java
@@ -27,6 +27,7 @@
 import android.os.UserHandle;
 
 import com.android.modules.utils.BasicShellCommandHandler;
+import com.android.server.job.controllers.JobStatus;
 
 import java.io.PrintWriter;
 
@@ -59,6 +60,10 @@
                     return cancelJob(pw);
                 case "monitor-battery":
                     return monitorBattery(pw);
+                case "disable-flex-policy":
+                    return disableFlexPolicy(pw);
+                case "enable-flex-policy":
+                    return enableFlexPolicy(pw);
                 case "get-aconfig-flag-state":
                     return getAconfigFlagState(pw);
                 case "get-battery-seq":
@@ -91,6 +96,8 @@
                     return resetExecutionQuota(pw);
                 case "reset-schedule-quota":
                     return resetScheduleQuota(pw);
+                case "reset-flex-policy":
+                    return resetFlexPolicy(pw);
                 case "stop":
                     return stop(pw);
                 case "trigger-dock-state":
@@ -346,6 +353,65 @@
         return 0;
     }
 
+    private int disableFlexPolicy(PrintWriter pw) throws Exception {
+        checkPermission("disable flex policy");
+
+        final long ident = Binder.clearCallingIdentity();
+        try {
+            mInternal.setFlexPolicy(true, 0);
+            pw.println("Set flex policy to 0");
+            return 0;
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
+    }
+
+    private int enableFlexPolicy(PrintWriter pw) throws Exception {
+        checkPermission("enable flex policy");
+
+        int enabled = 0;
+
+        String opt;
+        while ((opt = getNextOption()) != null) {
+            switch (opt) {
+                case "-o":
+                case "--option":
+                    final String constraint = getNextArgRequired();
+                    switch (constraint) {
+                        case "battery-not-low":
+                            enabled |= JobStatus.CONSTRAINT_BATTERY_NOT_LOW;
+                            break;
+                        case "charging":
+                            enabled |= JobStatus.CONSTRAINT_CHARGING;
+                            break;
+                        case "connectivity":
+                            enabled |= JobStatus.CONSTRAINT_CONNECTIVITY;
+                            break;
+                        case "idle":
+                            enabled |= JobStatus.CONSTRAINT_IDLE;
+                            break;
+                        default:
+                            pw.println("Unsupported option: " + constraint);
+                            return -1;
+                    }
+                    break;
+
+                default:
+                    pw.println("Error: unknown option '" + opt + "'");
+                    return -1;
+            }
+        }
+
+        final long ident = Binder.clearCallingIdentity();
+        try {
+            mInternal.setFlexPolicy(true, enabled);
+            pw.println("Set flex policy to " + enabled);
+            return 0;
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
+    }
+
     private int getAconfigFlagState(PrintWriter pw) throws Exception {
         checkPermission("get aconfig flag state", Manifest.permission.DUMP);
 
@@ -581,6 +647,19 @@
         return 0;
     }
 
+    private int resetFlexPolicy(PrintWriter pw) throws Exception {
+        checkPermission("reset flex policy");
+
+        final long ident = Binder.clearCallingIdentity();
+        try {
+            mInternal.setFlexPolicy(false, 0);
+            pw.println("Reset flex policy to its default state");
+            return 0;
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
+    }
+
     private int resetExecutionQuota(PrintWriter pw) throws Exception {
         checkPermission("reset execution quota");
 
@@ -773,6 +852,15 @@
         pw.println("  monitor-battery [on|off]");
         pw.println("    Control monitoring of all battery changes.  Off by default.  Turning");
         pw.println("    on makes get-battery-seq useful.");
+        pw.println("  enable-flex-policy --option <option>");
+        pw.println("    Enable flex policy with the specified options. Supported options are");
+        pw.println("    battery-not-low, charging, connectivity, idle.");
+        pw.println("    Multiple enable options can be specified (e.g.");
+        pw.println("    enable-flex-policy --option battery-not-low --option charging");
+        pw.println("  disable-flex-policy");
+        pw.println("    Turn off flex policy so that it does not affect job execution.");
+        pw.println("  reset-flex-policy");
+        pw.println("    Resets the flex policy to its default state.");
         pw.println("  get-aconfig-flag-state FULL_FLAG_NAME");
         pw.println("    Return the state of the specified aconfig flag, if known. The flag name");
         pw.println("         must be fully qualified.");
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
index 8ab7d2f..39d50f5 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
@@ -16,8 +16,6 @@
 
 package com.android.server.job;
 
-import static android.app.job.JobInfo.getPriorityString;
-
 import static com.android.server.job.JobConcurrencyManager.WORK_TYPE_NONE;
 import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
 import static com.android.server.job.JobSchedulerService.safelyScaleBytesToKBForHistogram;
@@ -73,9 +71,6 @@
 import com.android.server.EventLogTags;
 import com.android.server.LocalServices;
 import com.android.server.job.controllers.JobStatus;
-import com.android.server.tare.EconomicPolicy;
-import com.android.server.tare.EconomyManagerInternal;
-import com.android.server.tare.JobSchedulerEconomicPolicy;
 
 import java.util.Objects;
 
@@ -159,7 +154,6 @@
     private final Object mLock;
     private final ActivityManagerInternal mActivityManagerInternal;
     private final IBatteryStats mBatteryStats;
-    private final EconomyManagerInternal mEconomyManagerInternal;
     private final JobPackageTracker mJobPackageTracker;
     private final PowerManager mPowerManager;
     private final UsageStatsManagerInternal mUsageStatsManagerInternal;
@@ -324,7 +318,6 @@
         mService = service;
         mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
         mBatteryStats = batteryStats;
-        mEconomyManagerInternal = LocalServices.getService(EconomyManagerInternal.class);
         mJobPackageTracker = tracker;
         mCallbackHandler = new JobServiceHandler(looper);
         mJobConcurrencyManager = concurrencyManager;
@@ -414,11 +407,6 @@
             mWakeLock.setReferenceCounted(false);
             mWakeLock.acquire();
 
-            // Note the start when we try to bind so that the app is charged for some processing
-            // even if binding fails.
-            mEconomyManagerInternal.noteInstantaneousEvent(
-                    job.getSourceUserId(), job.getSourcePackageName(),
-                    getStartActionId(job), String.valueOf(job.getJobId()));
             mVerb = VERB_BINDING;
             scheduleOpTimeOutLocked();
             // Use FLAG_FROM_BACKGROUND to avoid resetting the bad-app tracking.
@@ -619,25 +607,6 @@
         return result == PermissionChecker.PERMISSION_GRANTED;
     }
 
-    @EconomicPolicy.AppAction
-    private static int getStartActionId(@NonNull JobStatus job) {
-        switch (job.getEffectivePriority()) {
-            case JobInfo.PRIORITY_MAX:
-                return JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START;
-            case JobInfo.PRIORITY_HIGH:
-                return JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START;
-            case JobInfo.PRIORITY_LOW:
-                return JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START;
-            case JobInfo.PRIORITY_MIN:
-                return JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START;
-            default:
-                Slog.wtf(TAG, "Unknown priority: " + getPriorityString(job.getEffectivePriority()));
-                // Intentional fallthrough
-            case JobInfo.PRIORITY_DEFAULT:
-                return JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START;
-        }
-    }
-
     /**
      * Used externally to query the running job. Will return null if there is no job running.
      */
@@ -1649,12 +1618,6 @@
         } catch (RemoteException e) {
             // Whatever.
         }
-        if (loggingStopReason == JobParameters.STOP_REASON_TIMEOUT) {
-            mEconomyManagerInternal.noteInstantaneousEvent(
-                    mRunningJob.getSourceUserId(), mRunningJob.getSourcePackageName(),
-                    JobSchedulerEconomicPolicy.ACTION_JOB_TIMEOUT,
-                    String.valueOf(mRunningJob.getJobId()));
-        }
         mNotificationCoordinator.removeNotificationAssociation(this,
                 reschedulingStopReason, completedJob);
         if (mWakeLock != null) {
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
index 3219f7e..7a39610 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
@@ -1001,8 +1001,7 @@
             NetworkCapabilities capabilities, Constants constants) {
         // A restricted job that's out of quota MUST use an unmetered network.
         if (jobStatus.getEffectiveStandbyBucket() == RESTRICTED_INDEX
-                && (!jobStatus.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)
-                || !jobStatus.isConstraintSatisfied(JobStatus.CONSTRAINT_TARE_WEALTH))) {
+                && (!jobStatus.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA))) {
             final NetworkCapabilities.Builder builder =
                     copyCapabilities(jobStatus.getJob().getRequiredNetwork());
             builder.addCapability(NET_CAPABILITY_NOT_METERED);
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
index ee9400fb..852b00b 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
@@ -328,6 +328,9 @@
     @GuardedBy("mLock")
     private final ArraySet<String> mPackagesToCheck = new ArraySet<>();
 
+    @GuardedBy("mLock")
+    private boolean mLocalOverride;
+
     public FlexibilityController(
             JobSchedulerService service, PrefetchController prefetchController) {
         super(service);
@@ -1923,6 +1926,27 @@
         }
     }
 
+    /**
+     * If {@code override} is true, uses {@code appliedConstraints} for flex policy evaluation,
+     * overriding anything else that was set. If {@code override} is false, any previous calls
+     * will be discarded and the policy will be reset to the normal default policy.
+     */
+    public void setLocalPolicyForTesting(boolean override, int appliedConstraints) {
+        synchronized (mLock) {
+            final boolean recheckJobs = mLocalOverride != override
+                    || mAppliedConstraints != appliedConstraints;
+            mLocalOverride = override;
+            if (mLocalOverride) {
+                mAppliedConstraints = appliedConstraints;
+            } else {
+                mAppliedConstraints = mFcConfig.APPLIED_CONSTRAINTS;
+            }
+            if (recheckJobs) {
+                mHandler.obtainMessage(MSG_CHECK_ALL_JOBS).sendToTarget();
+            }
+        }
+    }
+
     @Override
     @GuardedBy("mLock")
     public void dumpConstants(IndentingPrintWriter pw) {
@@ -1932,6 +1956,12 @@
     @Override
     @GuardedBy("mLock")
     public void dumpControllerStateLocked(IndentingPrintWriter pw, Predicate<JobStatus> predicate) {
+        if (mLocalOverride) {
+            pw.println("Local override active");
+        }
+        pw.print("Applied Flexible Constraints:");
+        JobStatus.dumpConstraints(pw, mAppliedConstraints);
+        pw.println();
         pw.print("Satisfied Flexible Constraints:");
         JobStatus.dumpConstraints(pw, mSatisfiedFlexibleConstraints);
         pw.println();
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
index edd86e3..9985543 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
@@ -116,7 +116,6 @@
     public static final int CONSTRAINT_TIMING_DELAY = 1 << 31;
     public static final int CONSTRAINT_DEADLINE = 1 << 30;
     public static final int CONSTRAINT_CONNECTIVITY = 1 << 28;
-    static final int CONSTRAINT_TARE_WEALTH = 1 << 27; // Implicit constraint
     public static final int CONSTRAINT_CONTENT_TRIGGER = 1 << 26;
     static final int CONSTRAINT_DEVICE_NOT_DOZING = 1 << 25; // Implicit constraint
     static final int CONSTRAINT_WITHIN_QUOTA = 1 << 24;      // Implicit constraint
@@ -128,7 +127,6 @@
             | CONSTRAINT_BACKGROUND_NOT_RESTRICTED
             | CONSTRAINT_DEVICE_NOT_DOZING
             | CONSTRAINT_FLEXIBLE
-            | CONSTRAINT_TARE_WEALTH
             | CONSTRAINT_WITHIN_QUOTA;
 
     // The following set of dynamic constraints are for specific use cases (as explained in their
@@ -196,7 +194,6 @@
     private static final int STATSD_CONSTRAINTS_TO_LOG = CONSTRAINT_CONTENT_TRIGGER
             | CONSTRAINT_DEADLINE
             | CONSTRAINT_PREFETCH
-            | CONSTRAINT_TARE_WEALTH
             | CONSTRAINT_TIMING_DELAY
             | CONSTRAINT_WITHIN_QUOTA;
 
@@ -532,10 +529,6 @@
      * Whether or not this job is approved to be treated as expedited per quota policy.
      */
     private boolean mExpeditedQuotaApproved;
-    /**
-     * Whether or not this job is approved to be treated as expedited per TARE policy.
-     */
-    private boolean mExpeditedTareApproved;
 
     /**
      * Summary describing this job. Lazily created in {@link #getUserVisibleJobSummary()}
@@ -568,9 +561,6 @@
     /** The job is within its quota based on its standby bucket. */
     private boolean mReadyWithinQuota;
 
-    /** The job has enough credits to run based on TARE. */
-    private boolean mReadyTareWealth;
-
     /** The job's dynamic requirements have been satisfied. */
     private boolean mReadyDynamicSatisfied;
 
@@ -1213,7 +1203,8 @@
             return ACTIVE_INDEX;
         }
 
-        final boolean isEligibleAsBackupJob = job.getTriggerContentUris() != null
+        final boolean isEligibleAsBackupJob = false // this exemption is being disabled for now.
+                && job.getTriggerContentUris() != null
                 && job.getRequiredNetwork() != null
                 && !job.hasLateConstraint()
                 && mJobSchedulerInternal.hasRunBackupJobsPermission(sourcePackageName, sourceUid);
@@ -1718,7 +1709,7 @@
      * treated as an expedited job.
      */
     public boolean shouldTreatAsExpeditedJob() {
-        return mExpeditedQuotaApproved && mExpeditedTareApproved && isRequestedExpeditedJob();
+        return mExpeditedQuotaApproved && isRequestedExpeditedJob();
     }
 
     /**
@@ -1867,16 +1858,6 @@
     }
 
     /** @return true if the constraint was changed, false otherwise. */
-    boolean setTareWealthConstraintSatisfied(final long nowElapsed, boolean state) {
-        if (setConstraintSatisfied(CONSTRAINT_TARE_WEALTH, nowElapsed, state)) {
-            // The constraint was changed. Update the ready flag.
-            mReadyTareWealth = state;
-            return true;
-        }
-        return false;
-    }
-
-    /** @return true if the constraint was changed, false otherwise. */
     boolean setFlexibilityConstraintSatisfied(final long nowElapsed, boolean state) {
         return setConstraintSatisfied(CONSTRAINT_FLEXIBLE, nowElapsed, state);
     }
@@ -1903,28 +1884,6 @@
         return true;
     }
 
-    /**
-     * Sets whether or not this job is approved to be treated as an expedited job based on TARE
-     * policy.
-     *
-     * @return true if the approval bit was changed, false otherwise.
-     */
-    boolean setExpeditedJobTareApproved(final long nowElapsed, boolean state) {
-        if (mExpeditedTareApproved == state) {
-            return false;
-        }
-        final boolean wasReady = !state && isReady();
-        mExpeditedTareApproved = state;
-        updateExpeditedDependencies();
-        final boolean isReady = isReady();
-        if (wasReady && !isReady) {
-            mReasonReadyToUnready = JobParameters.STOP_REASON_QUOTA;
-        } else if (!wasReady && isReady) {
-            mReasonReadyToUnready = JobParameters.STOP_REASON_UNDEFINED;
-        }
-        return true;
-    }
-
     private void updateExpeditedDependencies() {
         // DeviceIdleJobsController currently only tracks jobs with the WILL_BE_FOREGROUND flag.
         // Making it also track requested-expedited jobs would add unnecessary hops since the
@@ -2040,7 +1999,6 @@
             case CONSTRAINT_PREFETCH:
                 return JobParameters.STOP_REASON_ESTIMATED_APP_LAUNCH_TIME_CHANGED;
 
-            case CONSTRAINT_TARE_WEALTH:
             case CONSTRAINT_WITHIN_QUOTA:
                 return JobParameters.STOP_REASON_QUOTA;
 
@@ -2129,9 +2087,6 @@
         if ((CONSTRAINT_STORAGE_NOT_LOW & unsatisfiedConstraints) != 0) {
             return JobScheduler.PENDING_JOB_REASON_CONSTRAINT_STORAGE_NOT_LOW;
         }
-        if ((CONSTRAINT_TARE_WEALTH & unsatisfiedConstraints) != 0) {
-            return JobScheduler.PENDING_JOB_REASON_QUOTA;
-        }
         if ((CONSTRAINT_TIMING_DELAY & unsatisfiedConstraints) != 0) {
             return JobScheduler.PENDING_JOB_REASON_CONSTRAINT_MINIMUM_LATENCY;
         }
@@ -2206,11 +2161,6 @@
             Slog.wtf(TAG, "Tried to set quota as a dynamic constraint");
             constraints &= ~CONSTRAINT_WITHIN_QUOTA;
         }
-        if ((constraints & CONSTRAINT_TARE_WEALTH) != 0) {
-            // Quota should never be used as a dynamic constraint.
-            Slog.wtf(TAG, "Tried to set TARE as a dynamic constraint");
-            constraints &= ~CONSTRAINT_TARE_WEALTH;
-        }
 
         // Connectivity and content trigger are special since they're only valid to add if the
         // job has requested network or specific content URIs. Adding these constraints to jobs
@@ -2279,10 +2229,6 @@
                 oldValue = mReadyNotDozing;
                 mReadyNotDozing = value;
                 break;
-            case CONSTRAINT_TARE_WEALTH:
-                oldValue = mReadyTareWealth;
-                mReadyTareWealth = value;
-                break;
             case CONSTRAINT_WITHIN_QUOTA:
                 oldValue = mReadyWithinQuota;
                 mReadyWithinQuota = value;
@@ -2320,9 +2266,6 @@
             case CONSTRAINT_DEVICE_NOT_DOZING:
                 mReadyNotDozing = oldValue;
                 break;
-            case CONSTRAINT_TARE_WEALTH:
-                mReadyTareWealth = oldValue;
-                break;
             case CONSTRAINT_WITHIN_QUOTA:
                 mReadyWithinQuota = oldValue;
                 break;
@@ -2340,7 +2283,7 @@
         // sessions (exempt from dynamic restrictions), we need the additional check to ensure
         // that NEVER jobs don't run.
         // TODO: cleanup quota and standby bucket management so we don't need the additional checks
-        if (((!mReadyWithinQuota || !mReadyTareWealth)
+        if (((!mReadyWithinQuota)
                 && !mReadyDynamicSatisfied && !shouldTreatAsExpeditedJob())
                 || getEffectiveStandbyBucket() == NEVER_INDEX) {
             return false;
@@ -2576,9 +2519,6 @@
         if ((constraints & CONSTRAINT_PREFETCH) != 0) {
             pw.print(" PREFETCH");
         }
-        if ((constraints & CONSTRAINT_TARE_WEALTH) != 0) {
-            pw.print(" TARE_WEALTH");
-        }
         if ((constraints & CONSTRAINT_WITHIN_QUOTA) != 0) {
             pw.print(" WITHIN_QUOTA");
         }
@@ -2614,8 +2554,6 @@
                 return JobServerProtoEnums.CONSTRAINT_PREFETCH;
             case CONSTRAINT_STORAGE_NOT_LOW:
                 return JobServerProtoEnums.CONSTRAINT_STORAGE_NOT_LOW;
-            case CONSTRAINT_TARE_WEALTH:
-                return JobServerProtoEnums.CONSTRAINT_TARE_WEALTH;
             case CONSTRAINT_TIMING_DELAY:
                 return JobServerProtoEnums.CONSTRAINT_TIMING_DELAY;
             case CONSTRAINT_WITHIN_QUOTA:
@@ -2868,7 +2806,7 @@
             pw.println();
             pw.print("Unsatisfied constraints:");
             dumpConstraints(pw,
-                    ((requiredConstraints | CONSTRAINT_WITHIN_QUOTA | CONSTRAINT_TARE_WEALTH)
+                    ((requiredConstraints | CONSTRAINT_WITHIN_QUOTA)
                             & ~satisfiedConstraints));
             pw.println();
             if (hasFlexibilityConstraint()) {
@@ -2936,8 +2874,6 @@
         if ((getFlags() & JobInfo.FLAG_EXPEDITED) != 0) {
             pw.print("expeditedQuotaApproved: ");
             pw.print(mExpeditedQuotaApproved);
-            pw.print(" expeditedTareApproved: ");
-            pw.print(mExpeditedTareApproved);
             pw.print(" (started as EJ: ");
             pw.print(startedAsExpeditedJob);
             pw.println(")");
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
index 8ddbf69..3c9648b 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
@@ -328,9 +328,6 @@
     private final BackgroundJobsController mBackgroundJobsController;
     private final ConnectivityController mConnectivityController;
 
-    @GuardedBy("mLock")
-    private boolean mIsEnabled;
-
     /** How much time each app will have to run jobs within their standby bucket window. */
     private final long[] mAllowedTimePerPeriodMs = new long[]{
             QcConstants.DEFAULT_ALLOWED_TIME_PER_PERIOD_ACTIVE_MS,
@@ -546,7 +543,6 @@
         mQcConstants = new QcConstants();
         mBackgroundJobsController = backgroundJobsController;
         mConnectivityController = connectivityController;
-        mIsEnabled = !mConstants.USE_TARE_POLICY;
         mInQuotaAlarmQueue =
                 new InQuotaAlarmQueue(mContext, AppSchedulingModuleThread.get().getLooper());
 
@@ -835,9 +831,6 @@
     /** @return true if the job is within expedited job quota. */
     @GuardedBy("mLock")
     public boolean isWithinEJQuotaLocked(@NonNull final JobStatus jobStatus) {
-        if (!mIsEnabled) {
-            return true;
-        }
         if (isQuotaFreeLocked(jobStatus.getEffectiveStandbyBucket())) {
             return true;
         }
@@ -882,9 +875,6 @@
 
     @VisibleForTesting
     boolean isWithinQuotaLocked(@NonNull final JobStatus jobStatus) {
-        if (!mIsEnabled) {
-            return true;
-        }
         final int standbyBucket = jobStatus.getEffectiveStandbyBucket();
         // A job is within quota if one of the following is true:
         //   1. it was started while the app was in the TOP state
@@ -912,9 +902,6 @@
     @GuardedBy("mLock")
     boolean isWithinQuotaLocked(final int userId, @NonNull final String packageName,
             final int standbyBucket) {
-        if (!mIsEnabled) {
-            return true;
-        }
         if (standbyBucket == NEVER_INDEX) return false;
 
         if (isQuotaFreeLocked(standbyBucket)) return true;
@@ -2948,8 +2935,7 @@
 
     @Override
     public void onConstantsUpdatedLocked() {
-        if (mQcConstants.mShouldReevaluateConstraints || mIsEnabled == mConstants.USE_TARE_POLICY) {
-            mIsEnabled = !mConstants.USE_TARE_POLICY;
+        if (mQcConstants.mShouldReevaluateConstraints) {
             // Update job bookkeeping out of band.
             AppSchedulingModuleThread.getHandler().post(() -> {
                 synchronized (mLock) {
@@ -4454,7 +4440,6 @@
     @Override
     public void dumpControllerStateLocked(final IndentingPrintWriter pw,
             final Predicate<JobStatus> predicate) {
-        pw.println("Is enabled: " + mIsEnabled);
         pw.println("Current elapsed time: " + sElapsedRealtimeClock.millis());
         pw.println();
 
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/TareController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/TareController.java
deleted file mode 100644
index 7408088..0000000
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/TareController.java
+++ /dev/null
@@ -1,764 +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.server.job.controllers;
-
-import static android.app.job.JobInfo.getPriorityString;
-
-import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
-
-import android.annotation.NonNull;
-import android.app.job.JobInfo;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArrayMap;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.server.AppSchedulingModuleThread;
-import com.android.server.LocalServices;
-import com.android.server.job.JobSchedulerService;
-import com.android.server.tare.EconomicPolicy;
-import com.android.server.tare.EconomyManagerInternal;
-import com.android.server.tare.EconomyManagerInternal.ActionBill;
-import com.android.server.tare.JobSchedulerEconomicPolicy;
-
-import java.util.List;
-import java.util.function.Predicate;
-
-/**
- * Controller that interfaces with Tare ({@link EconomyManagerInternal} and manages each job's
- * ability to run per TARE policies.
- *
- * @see JobSchedulerEconomicPolicy
- */
-public class TareController extends StateController {
-    private static final String TAG = "JobScheduler.TARE";
-    private static final boolean DEBUG = JobSchedulerService.DEBUG
-            || Log.isLoggable(TAG, Log.DEBUG);
-
-    /**
-     * Bill to use while we're waiting to start a min priority job. If a job isn't running yet,
-     * don't consider it eligible to run unless it can pay for a job start and at least some
-     * period of execution time. We don't want min priority jobs to use up all available credits,
-     * so we make sure to only run them while there are enough credits to run higher priority jobs.
-     */
-    private static final ActionBill BILL_JOB_START_MIN =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START, 1, 0),
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 120_000L)
-            ));
-
-    /**
-     * Bill to use when a min priority job is currently running. We don't want min priority jobs
-     * to use up remaining credits, so we make sure to only run them while there are enough
-     * credits to run higher priority jobs. We stop the job when the app's credits get too low.
-     */
-    private static final ActionBill BILL_JOB_RUNNING_MIN =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 60_000L)
-            ));
-
-    /**
-     * Bill to use while we're waiting to start a low priority job. If a job isn't running yet,
-     * don't consider it eligible to run unless it can pay for a job start and at least some
-     * period of execution time. We don't want low priority jobs to use up all available credits,
-     * so we make sure to only run them while there are enough credits to run higher priority jobs.
-     */
-    private static final ActionBill BILL_JOB_START_LOW =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START, 1, 0),
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 60_000L)
-            ));
-
-    /**
-     * Bill to use when a low priority job is currently running. We don't want low priority jobs
-     * to use up all available credits, so we make sure to only run them while there are enough
-     * credits to run higher priority jobs. We stop the job when the app's credits get too low.
-     */
-    private static final ActionBill BILL_JOB_RUNNING_LOW =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 30_000L)
-            ));
-
-    /**
-     * Bill to use while we're waiting to start a job. If a job isn't running yet, don't consider it
-     * eligible to run unless it can pay for a job start and at least some period of execution time.
-     */
-    private static final ActionBill BILL_JOB_START_DEFAULT =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START, 1, 0),
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 30_000L)
-            ));
-
-    /**
-     * Bill to use when a default priority job is currently running. We want to track and make
-     * sure the app can continue to pay for 1 more second of execution time. We stop the job when
-     * the app can no longer pay for that time.
-     */
-    private static final ActionBill BILL_JOB_RUNNING_DEFAULT =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 1_000L)
-            ));
-
-    /**
-     * Bill to use while we're waiting to start a job. If a job isn't running yet, don't consider it
-     * eligible to run unless it can pay for a job start and at least some period of execution time.
-     */
-    private static final ActionBill BILL_JOB_START_HIGH =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 1, 0),
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, 0, 30_000L)
-            ));
-
-    /**
-     * Bill to use when a high priority job is currently running. We want to track and make sure
-     * the app can continue to pay for 1 more second of execution time. We stop the job when the
-     * app can no longer pay for that time.
-     */
-    private static final ActionBill BILL_JOB_RUNNING_HIGH =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, 0, 1_000L)
-            ));
-
-
-    /**
-     * Bill to use while we're waiting to start a max priority job. This should only be used for
-     * requested-EJs that aren't allowed to run as EJs. If a job isn't running yet, don't consider
-     * it eligible to run unless it can pay for a job start and at least some period of execution
-     * time.
-     */
-    private static final ActionBill BILL_JOB_START_MAX =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0),
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 0, 30_000L)
-            ));
-
-    /**
-     * Bill to use when a max priority job is currently running. This should only be used for
-     * requested-EJs that aren't allowed to run as EJs. We want to track and make sure
-     * the app can continue to pay for 1 more second of execution time. We stop the job when the
-     * app can no longer pay for that time.
-     */
-    private static final ActionBill BILL_JOB_RUNNING_MAX =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 0, 1_000L)
-            ));
-
-    /**
-     * Bill to use while we're waiting to start a job. If a job isn't running yet, don't consider it
-     * eligible to run unless it can pay for a job start and at least some period of execution time.
-     */
-    private static final ActionBill BILL_JOB_START_MAX_EXPEDITED =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0),
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 0, 30_000L)
-            ));
-
-    /**
-     * Bill to use when a max priority EJ is currently running (as an EJ). We want to track and
-     * make sure the app can continue to pay for 1 more second of execution time. We stop the job
-     * when the app can no longer pay for that time.
-     */
-    private static final ActionBill BILL_JOB_RUNNING_MAX_EXPEDITED =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 0, 1_000L)
-            ));
-
-    /**
-     * Bill to use while we're waiting to start a job. If a job isn't running yet, don't consider it
-     * eligible to run unless it can pay for a job start and at least some period of execution time.
-     */
-    private static final ActionBill BILL_JOB_START_HIGH_EXPEDITED =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 1, 0),
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, 0, 30_000L)
-            ));
-
-    /**
-     * Bill to use when a high priority EJ is currently running (as an EJ). We want to track and
-     * make sure the app can continue to pay for 1 more second of execution time. We stop the job
-     * when the app can no longer pay for that time.
-     */
-    private static final ActionBill BILL_JOB_RUNNING_HIGH_EXPEDITED =
-            new ActionBill(List.of(
-                    new EconomyManagerInternal.AnticipatedAction(
-                            JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, 0, 1_000L)
-            ));
-
-    private final EconomyManagerInternal mEconomyManagerInternal;
-
-    private final BackgroundJobsController mBackgroundJobsController;
-    private final ConnectivityController mConnectivityController;
-
-    /**
-     * Local cache of the ability of each userId-pkg to afford the various bills we're tracking for
-     * them.
-     */
-    @GuardedBy("mLock")
-    private final SparseArrayMap<String, ArrayMap<ActionBill, Boolean>> mAffordabilityCache =
-            new SparseArrayMap<>();
-
-    /**
-     * List of all tracked jobs. Out SparseArrayMap is userId-sourcePkg. The inner mapping is the
-     * anticipated actions and all the jobs that are applicable to them.
-     */
-    @GuardedBy("mLock")
-    private final SparseArrayMap<String, ArrayMap<ActionBill, ArraySet<JobStatus>>>
-            mRegisteredBillsAndJobs = new SparseArrayMap<>();
-
-    private final EconomyManagerInternal.AffordabilityChangeListener mAffordabilityChangeListener =
-            (userId, pkgName, bill, canAfford) -> {
-                final long nowElapsed = sElapsedRealtimeClock.millis();
-                if (DEBUG) {
-                    Slog.d(TAG,
-                            userId + ":" + pkgName + " affordability for " + getBillName(bill)
-                                    + " changed to " + canAfford);
-                }
-                synchronized (mLock) {
-                    ArrayMap<ActionBill, Boolean> actionAffordability =
-                            mAffordabilityCache.get(userId, pkgName);
-                    if (actionAffordability == null) {
-                        actionAffordability = new ArrayMap<>();
-                        mAffordabilityCache.add(userId, pkgName, actionAffordability);
-                    }
-                    actionAffordability.put(bill, canAfford);
-
-                    final ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
-                            mRegisteredBillsAndJobs.get(userId, pkgName);
-                    if (billToJobMap != null) {
-                        final ArraySet<JobStatus> jobs = billToJobMap.get(bill);
-                        if (jobs != null) {
-                            final ArraySet<JobStatus> changedJobs = new ArraySet<>();
-                            for (int i = 0; i < jobs.size(); ++i) {
-                                final JobStatus job = jobs.valueAt(i);
-                                // Use hasEnoughWealth if canAfford is false in case the job has
-                                // other bills it can depend on (eg. EJs being demoted to
-                                // regular jobs).
-                                if (job.setTareWealthConstraintSatisfied(nowElapsed,
-                                        canAfford || hasEnoughWealthLocked(job))) {
-                                    changedJobs.add(job);
-                                }
-                                if (job.isRequestedExpeditedJob()
-                                        && setExpeditedTareApproved(job, nowElapsed,
-                                        canAffordExpeditedBillLocked(job))) {
-                                    changedJobs.add(job);
-                                }
-                            }
-                            if (changedJobs.size() > 0) {
-                                mStateChangedListener.onControllerStateChanged(changedJobs);
-                            }
-                        }
-                    }
-                }
-            };
-
-    /**
-     * List of jobs that started while the UID was in the TOP state. There will usually be no more
-     * than {@value JobConcurrencyManager#MAX_STANDARD_JOB_CONCURRENCY} running at once, so an
-     * ArraySet is fine.
-     */
-    @GuardedBy("mLock")
-    private final ArraySet<JobStatus> mTopStartedJobs = new ArraySet<>();
-
-    @GuardedBy("mLock")
-    private boolean mIsEnabled;
-
-    public TareController(JobSchedulerService service,
-            @NonNull BackgroundJobsController backgroundJobsController,
-            @NonNull ConnectivityController connectivityController) {
-        super(service);
-        mBackgroundJobsController = backgroundJobsController;
-        mConnectivityController = connectivityController;
-        mEconomyManagerInternal = LocalServices.getService(EconomyManagerInternal.class);
-        mIsEnabled = mConstants.USE_TARE_POLICY;
-    }
-
-    @Override
-    @GuardedBy("mLock")
-    public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {
-        final long nowElapsed = sElapsedRealtimeClock.millis();
-        if (jobStatus.shouldTreatAsUserInitiatedJob()) {
-            // User-initiated jobs should always be allowed to run.
-            jobStatus.setTareWealthConstraintSatisfied(nowElapsed, true);
-            return;
-        }
-        jobStatus.setTareWealthConstraintSatisfied(nowElapsed, hasEnoughWealthLocked(jobStatus));
-        setExpeditedTareApproved(jobStatus, nowElapsed,
-                jobStatus.isRequestedExpeditedJob() && canAffordExpeditedBillLocked(jobStatus));
-
-        final ArraySet<ActionBill> bills = getPossibleStartBills(jobStatus);
-        for (int i = 0; i < bills.size(); ++i) {
-            addJobToBillList(jobStatus, bills.valueAt(i));
-        }
-    }
-
-    @Override
-    @GuardedBy("mLock")
-    public void prepareForExecutionLocked(JobStatus jobStatus) {
-        if (jobStatus.shouldTreatAsUserInitiatedJob()) {
-            // TODO(202954395): consider noting execution with the EconomyManager even though it
-            //                  won't affect this job
-            return;
-        }
-        final int userId = jobStatus.getSourceUserId();
-        final String pkgName = jobStatus.getSourcePackageName();
-        ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
-                mRegisteredBillsAndJobs.get(userId, pkgName);
-        if (billToJobMap == null) {
-            Slog.e(TAG, "Job is being prepared but doesn't have a pre-existing billToJobMap");
-        } else {
-            for (int i = 0; i < billToJobMap.size(); ++i) {
-                removeJobFromBillList(jobStatus, billToJobMap.keyAt(i));
-            }
-        }
-
-        final int uid = jobStatus.getSourceUid();
-        if (mService.getUidBias(uid) == JobInfo.BIAS_TOP_APP) {
-            if (DEBUG) {
-                Slog.d(TAG, jobStatus.toShortString() + " is top started job");
-            }
-            mTopStartedJobs.add(jobStatus);
-            // Top jobs won't count towards quota so there's no need to involve the EconomyManager.
-        } else {
-            addJobToBillList(jobStatus, getRunningBill(jobStatus));
-            mEconomyManagerInternal.noteOngoingEventStarted(userId, pkgName,
-                    getRunningActionId(jobStatus), String.valueOf(jobStatus.getJobId()));
-        }
-    }
-
-    @Override
-    @GuardedBy("mLock")
-    public void unprepareFromExecutionLocked(JobStatus jobStatus) {
-        if (jobStatus.shouldTreatAsUserInitiatedJob()) {
-            return;
-        }
-        final int userId = jobStatus.getSourceUserId();
-        final String pkgName = jobStatus.getSourcePackageName();
-        // If this method is called, then jobStatus.madeActive was never updated, so don't use it
-        // to determine if the EconomyManager was notified.
-        if (!mTopStartedJobs.remove(jobStatus)) {
-            // If the job was started while the app was top, then the EconomyManager wasn't notified
-            // of the job start.
-            mEconomyManagerInternal.noteOngoingEventStopped(userId, pkgName,
-                    getRunningActionId(jobStatus), String.valueOf(jobStatus.getJobId()));
-        }
-
-        final ArraySet<ActionBill> bills = getPossibleStartBills(jobStatus);
-        ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
-                mRegisteredBillsAndJobs.get(userId, pkgName);
-        if (billToJobMap == null) {
-            Slog.e(TAG, "Job was just unprepared but didn't have a pre-existing billToJobMap");
-        } else {
-            for (int i = 0; i < billToJobMap.size(); ++i) {
-                removeJobFromBillList(jobStatus, billToJobMap.keyAt(i));
-            }
-        }
-        for (int i = 0; i < bills.size(); ++i) {
-            addJobToBillList(jobStatus, bills.valueAt(i));
-        }
-    }
-
-    @Override
-    @GuardedBy("mLock")
-    public void maybeStopTrackingJobLocked(JobStatus jobStatus, JobStatus incomingJob) {
-        if (jobStatus.shouldTreatAsUserInitiatedJob()) {
-            return;
-        }
-        final int userId = jobStatus.getSourceUserId();
-        final String pkgName = jobStatus.getSourcePackageName();
-        if (!mTopStartedJobs.remove(jobStatus) && jobStatus.madeActive > 0) {
-            // Only note the job stop if we previously told the EconomyManager that the job started.
-            // If the job was started while the app was top, then the EconomyManager wasn't notified
-            // of the job start.
-            mEconomyManagerInternal.noteOngoingEventStopped(userId, pkgName,
-                    getRunningActionId(jobStatus), String.valueOf(jobStatus.getJobId()));
-        }
-        ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
-                mRegisteredBillsAndJobs.get(userId, pkgName);
-        if (billToJobMap != null) {
-            for (int i = 0; i < billToJobMap.size(); ++i) {
-                removeJobFromBillList(jobStatus, billToJobMap.keyAt(i));
-            }
-        }
-    }
-
-    @Override
-    @GuardedBy("mLock")
-    public void onConstantsUpdatedLocked() {
-        if (mIsEnabled != mConstants.USE_TARE_POLICY) {
-            mIsEnabled = mConstants.USE_TARE_POLICY;
-            // Update job bookkeeping out of band.
-            AppSchedulingModuleThread.getHandler().post(() -> {
-                synchronized (mLock) {
-                    final long nowElapsed = sElapsedRealtimeClock.millis();
-                    mService.getJobStore().forEachJob((jobStatus) -> {
-                        if (!mIsEnabled) {
-                            jobStatus.setTareWealthConstraintSatisfied(nowElapsed, true);
-                            setExpeditedTareApproved(jobStatus, nowElapsed, true);
-                        } else {
-                            jobStatus.setTareWealthConstraintSatisfied(
-                                    nowElapsed, hasEnoughWealthLocked(jobStatus));
-                            setExpeditedTareApproved(jobStatus, nowElapsed,
-                                    jobStatus.isRequestedExpeditedJob()
-                                            && canAffordExpeditedBillLocked(jobStatus));
-                        }
-                    });
-                }
-            });
-        }
-    }
-
-    @GuardedBy("mLock")
-    public boolean canScheduleEJ(@NonNull JobStatus jobStatus) {
-        if (!mIsEnabled) {
-            return true;
-        }
-        if (jobStatus.getEffectivePriority() == JobInfo.PRIORITY_MAX) {
-            return canAffordBillLocked(jobStatus, BILL_JOB_START_MAX_EXPEDITED);
-        }
-        return canAffordBillLocked(jobStatus, BILL_JOB_START_HIGH_EXPEDITED);
-    }
-
-    /** @return true if the job was started while the app was in the TOP state. */
-    @GuardedBy("mLock")
-    private boolean isTopStartedJobLocked(@NonNull final JobStatus jobStatus) {
-        return mTopStartedJobs.contains(jobStatus);
-    }
-
-    @GuardedBy("mLock")
-    public long getMaxJobExecutionTimeMsLocked(@NonNull JobStatus jobStatus) {
-        if (!mIsEnabled) {
-            return mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS;
-        }
-        return mEconomyManagerInternal.getMaxDurationMs(
-                jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(),
-                getRunningBill(jobStatus));
-    }
-
-    @GuardedBy("mLock")
-    private void addJobToBillList(@NonNull JobStatus jobStatus, @NonNull ActionBill bill) {
-        final int userId = jobStatus.getSourceUserId();
-        final String pkgName = jobStatus.getSourcePackageName();
-        ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
-                mRegisteredBillsAndJobs.get(userId, pkgName);
-        if (billToJobMap == null) {
-            billToJobMap = new ArrayMap<>();
-            mRegisteredBillsAndJobs.add(userId, pkgName, billToJobMap);
-        }
-        ArraySet<JobStatus> jobs = billToJobMap.get(bill);
-        if (jobs == null) {
-            jobs = new ArraySet<>();
-            billToJobMap.put(bill, jobs);
-        }
-        if (jobs.add(jobStatus)) {
-            mEconomyManagerInternal.registerAffordabilityChangeListener(userId, pkgName,
-                    mAffordabilityChangeListener, bill);
-        }
-    }
-
-    @GuardedBy("mLock")
-    private void removeJobFromBillList(@NonNull JobStatus jobStatus, @NonNull ActionBill bill) {
-        final int userId = jobStatus.getSourceUserId();
-        final String pkgName = jobStatus.getSourcePackageName();
-        final ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
-                mRegisteredBillsAndJobs.get(userId, pkgName);
-        if (billToJobMap != null) {
-            final ArraySet<JobStatus> jobs = billToJobMap.get(bill);
-            if (jobs == null || (jobs.remove(jobStatus) && jobs.size() == 0)) {
-                mEconomyManagerInternal.unregisterAffordabilityChangeListener(
-                        userId, pkgName, mAffordabilityChangeListener, bill);
-                // Remove the cached value so we don't accidentally use it when the app
-                // schedules a new job.
-                final ArrayMap<ActionBill, Boolean> actionAffordability =
-                        mAffordabilityCache.get(userId, pkgName);
-                if (actionAffordability != null) {
-                    actionAffordability.remove(bill);
-                }
-            }
-        }
-    }
-
-    @NonNull
-    private ArraySet<ActionBill> getPossibleStartBills(JobStatus jobStatus) {
-        // TODO: factor in network cost when available
-        final ArraySet<ActionBill> bills = new ArraySet<>();
-        if (jobStatus.isRequestedExpeditedJob()) {
-            if (jobStatus.getEffectivePriority() == JobInfo.PRIORITY_MAX) {
-                bills.add(BILL_JOB_START_MAX_EXPEDITED);
-            } else {
-                bills.add(BILL_JOB_START_HIGH_EXPEDITED);
-            }
-        }
-        switch (jobStatus.getEffectivePriority()) {
-            case JobInfo.PRIORITY_MAX:
-                bills.add(BILL_JOB_START_MAX);
-                break;
-            case JobInfo.PRIORITY_HIGH:
-                bills.add(BILL_JOB_START_HIGH);
-                break;
-            case JobInfo.PRIORITY_DEFAULT:
-                bills.add(BILL_JOB_START_DEFAULT);
-                break;
-            case JobInfo.PRIORITY_LOW:
-                bills.add(BILL_JOB_START_LOW);
-                break;
-            case JobInfo.PRIORITY_MIN:
-                bills.add(BILL_JOB_START_MIN);
-                break;
-            default:
-                Slog.wtf(TAG, "Unexpected priority: "
-                        + JobInfo.getPriorityString(jobStatus.getEffectivePriority()));
-                break;
-        }
-        return bills;
-    }
-
-    @NonNull
-    private ActionBill getRunningBill(JobStatus jobStatus) {
-        // TODO: factor in network cost when available
-        if (jobStatus.shouldTreatAsExpeditedJob() || jobStatus.startedAsExpeditedJob) {
-            if (jobStatus.getEffectivePriority() == JobInfo.PRIORITY_MAX) {
-                return BILL_JOB_RUNNING_MAX_EXPEDITED;
-            } else {
-                return BILL_JOB_RUNNING_HIGH_EXPEDITED;
-            }
-        }
-        switch (jobStatus.getEffectivePriority()) {
-            case JobInfo.PRIORITY_MAX:
-                return BILL_JOB_RUNNING_MAX;
-            case JobInfo.PRIORITY_HIGH:
-                return BILL_JOB_RUNNING_HIGH;
-            case JobInfo.PRIORITY_LOW:
-                return BILL_JOB_RUNNING_LOW;
-            case JobInfo.PRIORITY_MIN:
-                return BILL_JOB_RUNNING_MIN;
-            default:
-                Slog.wtf(TAG, "Got unexpected priority: " + jobStatus.getEffectivePriority());
-                // Intentional fallthrough
-            case JobInfo.PRIORITY_DEFAULT:
-                return BILL_JOB_RUNNING_DEFAULT;
-        }
-    }
-
-    @EconomicPolicy.AppAction
-    private static int getRunningActionId(@NonNull JobStatus job) {
-        switch (job.getEffectivePriority()) {
-            case JobInfo.PRIORITY_MAX:
-                return JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING;
-            case JobInfo.PRIORITY_HIGH:
-                return JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING;
-            case JobInfo.PRIORITY_LOW:
-                return JobSchedulerEconomicPolicy.ACTION_JOB_LOW_RUNNING;
-            case JobInfo.PRIORITY_MIN:
-                return JobSchedulerEconomicPolicy.ACTION_JOB_MIN_RUNNING;
-            default:
-                Slog.wtf(TAG, "Unknown priority: " + getPriorityString(job.getEffectivePriority()));
-                // Intentional fallthrough
-            case JobInfo.PRIORITY_DEFAULT:
-                return JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING;
-        }
-    }
-
-    @GuardedBy("mLock")
-    private boolean canAffordBillLocked(@NonNull JobStatus jobStatus, @NonNull ActionBill bill) {
-        if (!mIsEnabled) {
-            return true;
-        }
-        if (mService.getUidBias(jobStatus.getSourceUid()) == JobInfo.BIAS_TOP_APP
-                || isTopStartedJobLocked(jobStatus)) {
-            // Jobs for the top app should always be allowed to run, and any jobs started while
-            // the app is on top shouldn't consume any credits.
-            return true;
-        }
-        final int userId = jobStatus.getSourceUserId();
-        final String pkgName = jobStatus.getSourcePackageName();
-        ArrayMap<ActionBill, Boolean> actionAffordability =
-                mAffordabilityCache.get(userId, pkgName);
-        if (actionAffordability == null) {
-            actionAffordability = new ArrayMap<>();
-            mAffordabilityCache.add(userId, pkgName, actionAffordability);
-        }
-
-        if (actionAffordability.containsKey(bill)) {
-            return actionAffordability.get(bill);
-        }
-
-        final boolean canAfford = mEconomyManagerInternal.canPayFor(userId, pkgName, bill);
-        actionAffordability.put(bill, canAfford);
-        return canAfford;
-    }
-
-    @GuardedBy("mLock")
-    private boolean canAffordExpeditedBillLocked(@NonNull JobStatus jobStatus) {
-        if (!mIsEnabled) {
-            return true;
-        }
-        if (!jobStatus.isRequestedExpeditedJob()) {
-            return false;
-        }
-        if (mService.getUidBias(jobStatus.getSourceUid()) == JobInfo.BIAS_TOP_APP
-                || isTopStartedJobLocked(jobStatus)) {
-            // Jobs for the top app should always be allowed to run, and any jobs started while
-            // the app is on top shouldn't consume any credits.
-            return true;
-        }
-        if (mService.isCurrentlyRunningLocked(jobStatus)) {
-            return canAffordBillLocked(jobStatus, getRunningBill(jobStatus));
-        }
-
-        if (jobStatus.getEffectivePriority() == JobInfo.PRIORITY_MAX) {
-            return canAffordBillLocked(jobStatus, BILL_JOB_START_MAX_EXPEDITED);
-        }
-        return canAffordBillLocked(jobStatus, BILL_JOB_START_HIGH_EXPEDITED);
-    }
-
-    @GuardedBy("mLock")
-    private boolean hasEnoughWealthLocked(@NonNull JobStatus jobStatus) {
-        if (!mIsEnabled) {
-            return true;
-        }
-        if (jobStatus.shouldTreatAsUserInitiatedJob()) {
-            // Always allow user-initiated jobs.
-            return true;
-        }
-        if (mService.getUidBias(jobStatus.getSourceUid()) == JobInfo.BIAS_TOP_APP
-                || isTopStartedJobLocked(jobStatus)) {
-            // Jobs for the top app should always be allowed to run, and any jobs started while
-            // the app is on top shouldn't consume any credits.
-            return true;
-        }
-        if (mService.isCurrentlyRunningLocked(jobStatus)) {
-            return canAffordBillLocked(jobStatus, getRunningBill(jobStatus));
-        }
-
-        final ArraySet<ActionBill> bills = getPossibleStartBills(jobStatus);
-        for (int i = 0; i < bills.size(); ++i) {
-            ActionBill bill = bills.valueAt(i);
-            if (canAffordBillLocked(jobStatus, bill)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * If the satisfaction changes, this will tell connectivity & background jobs controller to
-     * also re-evaluate their state.
-     */
-    private boolean setExpeditedTareApproved(@NonNull JobStatus jobStatus, long nowElapsed,
-            boolean isApproved) {
-        if (jobStatus.setExpeditedJobTareApproved(nowElapsed, isApproved)) {
-            mBackgroundJobsController.evaluateStateLocked(jobStatus);
-            mConnectivityController.evaluateStateLocked(jobStatus);
-            if (isApproved && jobStatus.isReady()) {
-                mStateChangedListener.onRunJobNow(jobStatus);
-            }
-            return true;
-        }
-        return false;
-    }
-
-    @NonNull
-    private String getBillName(@NonNull ActionBill bill) {
-        if (bill.equals(BILL_JOB_START_MAX_EXPEDITED)) {
-            return "EJ_MAX_START_BILL";
-        }
-        if (bill.equals(BILL_JOB_RUNNING_MAX_EXPEDITED)) {
-            return "EJ_MAX_RUNNING_BILL";
-        }
-        if (bill.equals(BILL_JOB_START_HIGH_EXPEDITED)) {
-            return "EJ_HIGH_START_BILL";
-        }
-        if (bill.equals(BILL_JOB_RUNNING_HIGH_EXPEDITED)) {
-            return "EJ_HIGH_RUNNING_BILL";
-        }
-        if (bill.equals(BILL_JOB_START_HIGH)) {
-            return "HIGH_START_BILL";
-        }
-        if (bill.equals(BILL_JOB_RUNNING_HIGH)) {
-            return "HIGH_RUNNING_BILL";
-        }
-        if (bill.equals(BILL_JOB_START_DEFAULT)) {
-            return "DEFAULT_START_BILL";
-        }
-        if (bill.equals(BILL_JOB_RUNNING_DEFAULT)) {
-            return "DEFAULT_RUNNING_BILL";
-        }
-        if (bill.equals(BILL_JOB_START_LOW)) {
-            return "LOW_START_BILL";
-        }
-        if (bill.equals(BILL_JOB_RUNNING_LOW)) {
-            return "LOW_RUNNING_BILL";
-        }
-        if (bill.equals(BILL_JOB_START_MIN)) {
-            return "MIN_START_BILL";
-        }
-        if (bill.equals(BILL_JOB_RUNNING_MIN)) {
-            return "MIN_RUNNING_BILL";
-        }
-        return "UNKNOWN_BILL (" + bill + ")";
-    }
-
-    @Override
-    public void dumpControllerStateLocked(IndentingPrintWriter pw, Predicate<JobStatus> predicate) {
-        pw.print("Is enabled: ");
-        pw.println(mIsEnabled);
-
-        pw.println("Affordability cache:");
-        pw.increaseIndent();
-        mAffordabilityCache.forEach((userId, pkgName, billMap) -> {
-            final int numBills = billMap.size();
-            if (numBills > 0) {
-                pw.print(userId);
-                pw.print(":");
-                pw.print(pkgName);
-                pw.println(":");
-
-                pw.increaseIndent();
-                for (int i = 0; i < numBills; ++i) {
-                    pw.print(getBillName(billMap.keyAt(i)));
-                    pw.print(": ");
-                    pw.println(billMap.valueAt(i));
-                }
-                pw.decreaseIndent();
-            }
-        });
-        pw.decreaseIndent();
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java
deleted file mode 100644
index 5c60562..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java
+++ /dev/null
@@ -1,1362 +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.server.tare;
-
-import static android.app.tare.EconomyManager.ENABLED_MODE_OFF;
-import static android.text.format.DateUtils.DAY_IN_MILLIS;
-
-import static com.android.server.tare.EconomicPolicy.REGULATION_BASIC_INCOME;
-import static com.android.server.tare.EconomicPolicy.REGULATION_BG_RESTRICTED;
-import static com.android.server.tare.EconomicPolicy.REGULATION_BG_UNRESTRICTED;
-import static com.android.server.tare.EconomicPolicy.REGULATION_BIRTHRIGHT;
-import static com.android.server.tare.EconomicPolicy.REGULATION_DEMOTION;
-import static com.android.server.tare.EconomicPolicy.REGULATION_PROMOTION;
-import static com.android.server.tare.EconomicPolicy.REGULATION_WEALTH_RECLAMATION;
-import static com.android.server.tare.EconomicPolicy.TYPE_ACTION;
-import static com.android.server.tare.EconomicPolicy.TYPE_REWARD;
-import static com.android.server.tare.EconomicPolicy.eventToString;
-import static com.android.server.tare.EconomicPolicy.getEventType;
-import static com.android.server.tare.TareUtils.appToString;
-import static com.android.server.tare.TareUtils.cakeToString;
-import static com.android.server.tare.TareUtils.getCurrentTimeMillis;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.content.pm.UserPackage;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.util.ArraySet;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArrayMap;
-import android.util.SparseSetArray;
-import android.util.TimeUtils;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.LocalServices;
-import com.android.server.pm.UserManagerInternal;
-import com.android.server.usage.AppStandbyInternal;
-import com.android.server.utils.AlarmQueue;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.function.Consumer;
-
-/**
- * Other half of the IRS. The agent handles the nitty gritty details, interacting directly with
- * ledgers, carrying out specific events such as wealth reclamation, granting initial balances or
- * replenishing balances, and tracking ongoing events.
- */
-class Agent {
-    private static final String TAG = "TARE-" + Agent.class.getSimpleName();
-    private static final boolean DEBUG = InternalResourceService.DEBUG
-            || Log.isLoggable(TAG, Log.DEBUG);
-
-    private static final String ALARM_TAG_AFFORDABILITY_CHECK = "*tare.affordability_check*";
-
-    private final Object mLock;
-    private final AgentHandler mHandler;
-    private final Analyst mAnalyst;
-    private final InternalResourceService mIrs;
-    private final Scribe mScribe;
-
-    private final AppStandbyInternal mAppStandbyInternal;
-
-    @GuardedBy("mLock")
-    private final SparseArrayMap<String, SparseArrayMap<String, OngoingEvent>>
-            mCurrentOngoingEvents = new SparseArrayMap<>();
-
-    /**
-     * Set of {@link ActionAffordabilityNote ActionAffordabilityNotes} keyed by userId-pkgName.
-     *
-     * Note: it would be nice/better to sort by base price since that doesn't change and simply
-     * look at the change in the "insertion" of what would be affordable, but since CTP
-     * is factored into the final price, the sorting order (by modified price) could be different
-     * and that method wouldn't work >:(
-     */
-    @GuardedBy("mLock")
-    private final SparseArrayMap<String, ArraySet<ActionAffordabilityNote>>
-            mActionAffordabilityNotes = new SparseArrayMap<>();
-
-    /**
-     * Queue to track and manage when apps will cross the closest affordability threshold (in
-     * both directions).
-     */
-    @GuardedBy("mLock")
-    private final BalanceThresholdAlarmQueue mBalanceThresholdAlarmQueue;
-
-    /**
-     * Check the affordability notes of all apps.
-     */
-    private static final int MSG_CHECK_ALL_AFFORDABILITY = 0;
-    /**
-     * Check the affordability notes of a single app.
-     */
-    private static final int MSG_CHECK_INDIVIDUAL_AFFORDABILITY = 1;
-
-    Agent(@NonNull InternalResourceService irs, @NonNull Scribe scribe, @NonNull Analyst analyst) {
-        mLock = irs.getLock();
-        mIrs = irs;
-        mScribe = scribe;
-        mAnalyst = analyst;
-        mHandler = new AgentHandler(TareHandlerThread.get().getLooper());
-        mAppStandbyInternal = LocalServices.getService(AppStandbyInternal.class);
-        mBalanceThresholdAlarmQueue = new BalanceThresholdAlarmQueue(
-                mIrs.getContext(), TareHandlerThread.get().getLooper());
-    }
-
-    private class TotalDeltaCalculator implements Consumer<OngoingEvent> {
-        private Ledger mLedger;
-        private long mNowElapsed;
-        private long mNow;
-        private long mTotal;
-
-        void reset(@NonNull Ledger ledger, long nowElapsed, long now) {
-            mLedger = ledger;
-            mNowElapsed = nowElapsed;
-            mNow = now;
-            mTotal = 0;
-        }
-
-        @Override
-        public void accept(OngoingEvent ongoingEvent) {
-            mTotal += getActualDeltaLocked(ongoingEvent, mLedger, mNowElapsed, mNow).price;
-        }
-    }
-
-    @GuardedBy("mLock")
-    private final TotalDeltaCalculator mTotalDeltaCalculator = new TotalDeltaCalculator();
-
-    /** Get an app's current balance, factoring in any currently ongoing events. */
-    @GuardedBy("mLock")
-    long getBalanceLocked(final int userId, @NonNull final String pkgName) {
-        final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-        long balance = ledger.getCurrentBalance();
-        SparseArrayMap<String, OngoingEvent> ongoingEvents =
-                mCurrentOngoingEvents.get(userId, pkgName);
-        if (ongoingEvents != null) {
-            final long nowElapsed = SystemClock.elapsedRealtime();
-            final long now = getCurrentTimeMillis();
-            mTotalDeltaCalculator.reset(ledger, nowElapsed, now);
-            ongoingEvents.forEach(mTotalDeltaCalculator);
-            balance += mTotalDeltaCalculator.mTotal;
-        }
-        return balance;
-    }
-
-    @GuardedBy("mLock")
-    private boolean isAffordableLocked(long balance, long price, long stockLimitHonoringCtp) {
-        return balance >= price
-                && mScribe.getRemainingConsumableCakesLocked() >= stockLimitHonoringCtp;
-    }
-
-    @GuardedBy("mLock")
-    void noteInstantaneousEventLocked(final int userId, @NonNull final String pkgName,
-            final int eventId, @Nullable String tag) {
-        if (mIrs.isSystem(userId, pkgName)) {
-            // Events are free for the system. Don't bother recording them.
-            return;
-        }
-
-        final long now = getCurrentTimeMillis();
-        final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-        final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-
-        final int eventType = getEventType(eventId);
-        switch (eventType) {
-            case TYPE_ACTION:
-                final EconomicPolicy.Cost actionCost =
-                        economicPolicy.getCostOfAction(eventId, userId, pkgName);
-
-                recordTransactionLocked(userId, pkgName, ledger,
-                        new Ledger.Transaction(now, now, eventId, tag,
-                                -actionCost.price, actionCost.costToProduce),
-                        true);
-                break;
-
-            case TYPE_REWARD:
-                final EconomicPolicy.Reward reward = economicPolicy.getReward(eventId);
-                if (reward != null) {
-                    final long rewardSum = ledger.get24HourSum(eventId, now);
-                    final long rewardVal = Math.max(0,
-                            Math.min(reward.maxDailyReward - rewardSum, reward.instantReward));
-                    recordTransactionLocked(userId, pkgName, ledger,
-                            new Ledger.Transaction(now, now, eventId, tag, rewardVal, 0), true);
-                }
-                break;
-
-            default:
-                Slog.w(TAG, "Unsupported event type: " + eventType);
-        }
-        scheduleBalanceCheckLocked(userId, pkgName);
-    }
-
-    @GuardedBy("mLock")
-    void noteOngoingEventLocked(final int userId, @NonNull final String pkgName, final int eventId,
-            @Nullable String tag, final long startElapsed) {
-        noteOngoingEventLocked(userId, pkgName, eventId, tag, startElapsed, true);
-    }
-
-    @GuardedBy("mLock")
-    private void noteOngoingEventLocked(final int userId, @NonNull final String pkgName,
-            final int eventId, @Nullable String tag, final long startElapsed,
-            final boolean updateBalanceCheck) {
-        if (mIrs.isSystem(userId, pkgName)) {
-            // Events are free for the system. Don't bother recording them.
-            return;
-        }
-
-        SparseArrayMap<String, OngoingEvent> ongoingEvents =
-                mCurrentOngoingEvents.get(userId, pkgName);
-        if (ongoingEvents == null) {
-            ongoingEvents = new SparseArrayMap<>();
-            mCurrentOngoingEvents.add(userId, pkgName, ongoingEvents);
-        }
-        OngoingEvent ongoingEvent = ongoingEvents.get(eventId, tag);
-
-        final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-        final int eventType = getEventType(eventId);
-        switch (eventType) {
-            case TYPE_ACTION:
-                final EconomicPolicy.Cost actionCost =
-                        economicPolicy.getCostOfAction(eventId, userId, pkgName);
-
-                if (ongoingEvent == null) {
-                    ongoingEvents.add(eventId, tag,
-                            new OngoingEvent(eventId, tag, startElapsed, actionCost));
-                } else {
-                    ongoingEvent.refCount++;
-                }
-                break;
-
-            case TYPE_REWARD:
-                final EconomicPolicy.Reward reward = economicPolicy.getReward(eventId);
-                if (reward != null) {
-                    if (ongoingEvent == null) {
-                        ongoingEvents.add(eventId, tag, new OngoingEvent(
-                                eventId, tag, startElapsed, reward));
-                    } else {
-                        ongoingEvent.refCount++;
-                    }
-                }
-                break;
-
-            default:
-                Slog.w(TAG, "Unsupported event type: " + eventType);
-        }
-
-        if (updateBalanceCheck) {
-            scheduleBalanceCheckLocked(userId, pkgName);
-        }
-    }
-
-    @GuardedBy("mLock")
-    void onDeviceStateChangedLocked() {
-        onPricingChangedLocked();
-    }
-
-    @GuardedBy("mLock")
-    void onPricingChangedLocked() {
-        onAnythingChangedLocked(true);
-    }
-
-    @GuardedBy("mLock")
-    void onAppStatesChangedLocked(final int userId, @NonNull ArraySet<String> pkgNames) {
-        final long now = getCurrentTimeMillis();
-        final long nowElapsed = SystemClock.elapsedRealtime();
-        final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-
-        for (int i = 0; i < pkgNames.size(); ++i) {
-            final String pkgName = pkgNames.valueAt(i);
-            final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed);
-            SparseArrayMap<String, OngoingEvent> ongoingEvents =
-                    mCurrentOngoingEvents.get(userId, pkgName);
-            if (ongoingEvents != null) {
-                mOngoingEventUpdater.reset(userId, pkgName, now, nowElapsed);
-                ongoingEvents.forEach(mOngoingEventUpdater);
-                final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
-                        mActionAffordabilityNotes.get(userId, pkgName);
-                if (actionAffordabilityNotes != null) {
-                    final int size = actionAffordabilityNotes.size();
-                    final long newBalance =
-                            mScribe.getLedgerLocked(userId, pkgName).getCurrentBalance();
-                    for (int n = 0; n < size; ++n) {
-                        final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(n);
-                        note.recalculateCosts(economicPolicy, userId, pkgName);
-                        final boolean isAffordable = isVip
-                                || isAffordableLocked(newBalance,
-                                        note.getCachedModifiedPrice(),
-                                        note.getStockLimitHonoringCtp());
-                        if (note.isCurrentlyAffordable() != isAffordable) {
-                            note.setNewAffordability(isAffordable);
-                            mIrs.postAffordabilityChanged(userId, pkgName, note);
-                        }
-                    }
-                }
-                scheduleBalanceCheckLocked(userId, pkgName);
-            }
-        }
-    }
-
-    @GuardedBy("mLock")
-    void onVipStatusChangedLocked(final int userId, @NonNull String pkgName) {
-        final long now = getCurrentTimeMillis();
-        final long nowElapsed = SystemClock.elapsedRealtime();
-        final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-
-        final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed);
-        SparseArrayMap<String, OngoingEvent> ongoingEvents =
-                mCurrentOngoingEvents.get(userId, pkgName);
-        if (ongoingEvents != null) {
-            mOngoingEventUpdater.reset(userId, pkgName, now, nowElapsed);
-            ongoingEvents.forEach(mOngoingEventUpdater);
-        }
-        final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
-                mActionAffordabilityNotes.get(userId, pkgName);
-        if (actionAffordabilityNotes != null) {
-            final int size = actionAffordabilityNotes.size();
-            final long newBalance =
-                    mScribe.getLedgerLocked(userId, pkgName).getCurrentBalance();
-            for (int n = 0; n < size; ++n) {
-                final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(n);
-                note.recalculateCosts(economicPolicy, userId, pkgName);
-                final boolean isAffordable = isVip
-                        || isAffordableLocked(newBalance,
-                        note.getCachedModifiedPrice(), note.getStockLimitHonoringCtp());
-                if (note.isCurrentlyAffordable() != isAffordable) {
-                    note.setNewAffordability(isAffordable);
-                    mIrs.postAffordabilityChanged(userId, pkgName, note);
-                }
-            }
-        }
-        scheduleBalanceCheckLocked(userId, pkgName);
-    }
-
-    @GuardedBy("mLock")
-    void onVipStatusChangedLocked(@NonNull SparseSetArray<String> pkgs) {
-        for (int u = pkgs.size() - 1; u >= 0; --u) {
-            final int userId = pkgs.keyAt(u);
-
-            for (int p = pkgs.sizeAt(u) - 1; p >= 0; --p) {
-                onVipStatusChangedLocked(userId, pkgs.valueAt(u, p));
-            }
-        }
-    }
-
-    @GuardedBy("mLock")
-    private void onAnythingChangedLocked(final boolean updateOngoingEvents) {
-        final long now = getCurrentTimeMillis();
-        final long nowElapsed = SystemClock.elapsedRealtime();
-        final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-
-        for (int uIdx = mCurrentOngoingEvents.numMaps() - 1; uIdx >= 0; --uIdx) {
-            final int userId = mCurrentOngoingEvents.keyAt(uIdx);
-
-            for (int pIdx = mCurrentOngoingEvents.numElementsForKey(userId) - 1; pIdx >= 0;
-                    --pIdx) {
-                final String pkgName = mCurrentOngoingEvents.keyAt(uIdx, pIdx);
-
-                SparseArrayMap<String, OngoingEvent> ongoingEvents =
-                        mCurrentOngoingEvents.valueAt(uIdx, pIdx);
-                if (ongoingEvents != null) {
-                    if (updateOngoingEvents) {
-                        mOngoingEventUpdater.reset(userId, pkgName, now, nowElapsed);
-                        ongoingEvents.forEach(mOngoingEventUpdater);
-                    }
-                    scheduleBalanceCheckLocked(userId, pkgName);
-                }
-            }
-        }
-        for (int uIdx = mActionAffordabilityNotes.numMaps() - 1; uIdx >= 0; --uIdx) {
-            final int userId = mActionAffordabilityNotes.keyAt(uIdx);
-
-            for (int pIdx = mActionAffordabilityNotes.numElementsForKey(userId) - 1; pIdx >= 0;
-                    --pIdx) {
-                final String pkgName = mActionAffordabilityNotes.keyAt(uIdx, pIdx);
-
-                final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
-                        mActionAffordabilityNotes.valueAt(uIdx, pIdx);
-
-                if (actionAffordabilityNotes != null) {
-                    final int size = actionAffordabilityNotes.size();
-                    final long newBalance = getBalanceLocked(userId, pkgName);
-                    final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed);
-                    for (int n = 0; n < size; ++n) {
-                        final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(n);
-                        note.recalculateCosts(economicPolicy, userId, pkgName);
-                        final boolean isAffordable = isVip
-                                || isAffordableLocked(newBalance,
-                                        note.getCachedModifiedPrice(),
-                                        note.getStockLimitHonoringCtp());
-                        if (note.isCurrentlyAffordable() != isAffordable) {
-                            note.setNewAffordability(isAffordable);
-                            mIrs.postAffordabilityChanged(userId, pkgName, note);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    @GuardedBy("mLock")
-    void stopOngoingActionLocked(final int userId, @NonNull final String pkgName, final int eventId,
-            @Nullable String tag, final long nowElapsed, final long now) {
-        stopOngoingActionLocked(userId, pkgName, eventId, tag, nowElapsed, now, true, true);
-    }
-
-    /**
-     * @param updateBalanceCheck          Whether to reschedule the affordability/balance
-     *                                    check alarm.
-     * @param notifyOnAffordabilityChange Whether to evaluate the app's ability to afford
-     *                                    registered bills and notify listeners about any changes.
-     */
-    @GuardedBy("mLock")
-    private void stopOngoingActionLocked(final int userId, @NonNull final String pkgName,
-            final int eventId, @Nullable String tag, final long nowElapsed, final long now,
-            final boolean updateBalanceCheck, final boolean notifyOnAffordabilityChange) {
-        if (mIrs.isSystem(userId, pkgName)) {
-            // Events are free for the system. Don't bother recording them.
-            return;
-        }
-
-        final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-
-        SparseArrayMap<String, OngoingEvent> ongoingEvents =
-                mCurrentOngoingEvents.get(userId, pkgName);
-        if (ongoingEvents == null) {
-            // This may occur if TARE goes from disabled to enabled while an event is already
-            // occurring.
-            Slog.w(TAG, "No ongoing transactions for " + appToString(userId, pkgName));
-            return;
-        }
-        final OngoingEvent ongoingEvent = ongoingEvents.get(eventId, tag);
-        if (ongoingEvent == null) {
-            // This may occur if TARE goes from disabled to enabled while an event is already
-            // occurring.
-            Slog.w(TAG, "Nonexistent ongoing transaction "
-                    + eventToString(eventId) + (tag == null ? "" : ":" + tag)
-                    + " for " + appToString(userId, pkgName) + " ended");
-            return;
-        }
-        ongoingEvent.refCount--;
-        if (ongoingEvent.refCount <= 0) {
-            final long startElapsed = ongoingEvent.startTimeElapsed;
-            final long startTime = now - (nowElapsed - startElapsed);
-            final EconomicPolicy.Cost actualDelta =
-                    getActualDeltaLocked(ongoingEvent, ledger, nowElapsed, now);
-            recordTransactionLocked(userId, pkgName, ledger,
-                    new Ledger.Transaction(startTime, now, eventId, tag, actualDelta.price,
-                            actualDelta.costToProduce),
-                    notifyOnAffordabilityChange);
-
-            ongoingEvents.delete(eventId, tag);
-        }
-        if (updateBalanceCheck) {
-            scheduleBalanceCheckLocked(userId, pkgName);
-        }
-    }
-
-    @GuardedBy("mLock")
-    @NonNull
-    private EconomicPolicy.Cost getActualDeltaLocked(@NonNull OngoingEvent ongoingEvent,
-            @NonNull Ledger ledger, long nowElapsed, long now) {
-        final long startElapsed = ongoingEvent.startTimeElapsed;
-        final long durationSecs = (nowElapsed - startElapsed) / 1000;
-        final long computedDelta = durationSecs * ongoingEvent.getDeltaPerSec();
-        if (ongoingEvent.reward == null) {
-            return new EconomicPolicy.Cost(
-                    durationSecs * ongoingEvent.getCtpPerSec(), computedDelta);
-        }
-        final long rewardSum = ledger.get24HourSum(ongoingEvent.eventId, now);
-        return new EconomicPolicy.Cost(0,
-                Math.max(0,
-                        Math.min(ongoingEvent.reward.maxDailyReward - rewardSum, computedDelta)));
-    }
-
-    @VisibleForTesting
-    @GuardedBy("mLock")
-    void recordTransactionLocked(final int userId, @NonNull final String pkgName,
-            @NonNull Ledger ledger, @NonNull Ledger.Transaction transaction,
-            final boolean notifyOnAffordabilityChange) {
-        if (!DEBUG && transaction.delta == 0) {
-            // Skip recording transactions with a delta of 0 to save on space.
-            return;
-        }
-        if (mIrs.isSystem(userId, pkgName)) {
-            Slog.wtfStack(TAG,
-                    "Tried to adjust system balance for " + appToString(userId, pkgName));
-            return;
-        }
-        final boolean isVip = mIrs.isVip(userId, pkgName);
-        if (isVip) {
-            // This could happen if the app was made a VIP after it started performing actions.
-            // Continue recording the transaction for debugging purposes, but don't let it change
-            // any numbers.
-            transaction = new Ledger.Transaction(
-                    transaction.startTimeMs, transaction.endTimeMs,
-                    transaction.eventId, transaction.tag, 0 /* delta */, transaction.ctp);
-        }
-        final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-        final long originalBalance = ledger.getCurrentBalance();
-        final long maxBalance = economicPolicy.getMaxSatiatedBalance(userId, pkgName);
-        if (transaction.delta > 0
-                && originalBalance + transaction.delta > maxBalance) {
-            // Set lower bound at 0 so we don't accidentally take away credits when we were trying
-            // to _give_ the app credits.
-            final long newDelta = Math.max(0, maxBalance - originalBalance);
-            Slog.i(TAG, "Would result in becoming too rich. Decreasing transaction "
-                    + eventToString(transaction.eventId)
-                    + (transaction.tag == null ? "" : ":" + transaction.tag)
-                    + " for " + appToString(userId, pkgName)
-                    + " by " + cakeToString(transaction.delta - newDelta));
-            transaction = new Ledger.Transaction(
-                    transaction.startTimeMs, transaction.endTimeMs,
-                    transaction.eventId, transaction.tag, newDelta, transaction.ctp);
-        }
-        ledger.recordTransaction(transaction);
-        mScribe.adjustRemainingConsumableCakesLocked(-transaction.ctp);
-        mAnalyst.noteTransaction(transaction);
-        if (transaction.delta != 0 && notifyOnAffordabilityChange) {
-            final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
-                    mActionAffordabilityNotes.get(userId, pkgName);
-            if (actionAffordabilityNotes != null) {
-                final long newBalance = ledger.getCurrentBalance();
-                for (int i = 0; i < actionAffordabilityNotes.size(); ++i) {
-                    final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(i);
-                    final boolean isAffordable = isVip
-                            || isAffordableLocked(newBalance,
-                                    note.getCachedModifiedPrice(), note.getStockLimitHonoringCtp());
-                    if (note.isCurrentlyAffordable() != isAffordable) {
-                        note.setNewAffordability(isAffordable);
-                        mIrs.postAffordabilityChanged(userId, pkgName, note);
-                    }
-                }
-            }
-        }
-        if (transaction.ctp != 0) {
-            mHandler.sendEmptyMessage(MSG_CHECK_ALL_AFFORDABILITY);
-            mIrs.maybePerformQuantitativeEasingLocked();
-        }
-    }
-
-    @GuardedBy("mLock")
-    void reclaimAllAssetsLocked(final int userId, @NonNull final String pkgName, int regulationId) {
-        final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-        final long curBalance = ledger.getCurrentBalance();
-        if (curBalance <= 0) {
-            return;
-        }
-        if (DEBUG) {
-            Slog.i(TAG, "Reclaiming " + cakeToString(curBalance)
-                    + " from " + appToString(userId, pkgName)
-                    + " because of " + eventToString(regulationId));
-        }
-
-        final long now = getCurrentTimeMillis();
-        recordTransactionLocked(userId, pkgName, ledger,
-                new Ledger.Transaction(now, now, regulationId, null, -curBalance, 0),
-                true);
-    }
-
-    /**
-     * Reclaim a percentage of unused ARCs from every app that hasn't been used recently. The
-     * reclamation will not reduce an app's balance below its minimum balance as dictated by
-     * {@code scaleMinBalance}.
-     *
-     * @param percentage      A value between 0 and 1 to indicate how much of the unused balance
-     *                        should be reclaimed.
-     * @param minUnusedTimeMs The minimum amount of time (in milliseconds) that must have
-     *                        transpired since the last user usage event before we will consider
-     *                        reclaiming ARCs from the app.
-     * @param scaleMinBalance Whether or not to use the scaled minimum app balance. If false,
-     *                        this will use the constant min balance floor given by
-     *                        {@link EconomicPolicy#getMinSatiatedBalance(int, String)}. If true,
-     *                        this will use the scaled balance given by
-     *                        {@link InternalResourceService#getMinBalanceLocked(int, String)}.
-     */
-    @GuardedBy("mLock")
-    void reclaimUnusedAssetsLocked(double percentage, long minUnusedTimeMs,
-            boolean scaleMinBalance) {
-        final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-        final SparseArrayMap<String, Ledger> ledgers = mScribe.getLedgersLocked();
-        final long now = getCurrentTimeMillis();
-        for (int u = 0; u < ledgers.numMaps(); ++u) {
-            final int userId = ledgers.keyAt(u);
-            for (int p = 0; p < ledgers.numElementsForKey(userId); ++p) {
-                final Ledger ledger = ledgers.valueAt(u, p);
-                final long curBalance = ledger.getCurrentBalance();
-                if (curBalance <= 0) {
-                    continue;
-                }
-                final String pkgName = ledgers.keyAt(u, p);
-                // AppStandby only counts elapsed time for things like this
-                // TODO: should we use clock time instead?
-                final long timeSinceLastUsedMs =
-                        mAppStandbyInternal.getTimeSinceLastUsedByUser(pkgName, userId);
-                if (timeSinceLastUsedMs >= minUnusedTimeMs) {
-                    final long minBalance;
-                    if (!scaleMinBalance) {
-                        // Use a constant floor instead of the scaled floor from the IRS.
-                        minBalance = economicPolicy.getMinSatiatedBalance(userId, pkgName);
-                    } else {
-                        minBalance = mIrs.getMinBalanceLocked(userId, pkgName);
-                    }
-                    long toReclaim = (long) (curBalance * percentage);
-                    if (curBalance - toReclaim < minBalance) {
-                        toReclaim = curBalance - minBalance;
-                    }
-                    if (toReclaim > 0) {
-                        if (DEBUG) {
-                            Slog.i(TAG, "Reclaiming unused wealth! Taking "
-                                    + cakeToString(toReclaim)
-                                    + " from " + appToString(userId, pkgName));
-                        }
-
-                        recordTransactionLocked(userId, pkgName, ledger,
-                                new Ledger.Transaction(now, now, REGULATION_WEALTH_RECLAMATION,
-                                        null, -toReclaim, 0),
-                                true);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Reclaim a percentage of unused ARCs from an app that was just removed from an exemption list.
-     * The amount reclaimed will depend on how recently the app was used. The reclamation will not
-     * reduce an app's balance below its current minimum balance.
-     */
-    @GuardedBy("mLock")
-    void onAppUnexemptedLocked(final int userId, @NonNull final String pkgName) {
-        final long curBalance = getBalanceLocked(userId, pkgName);
-        final long minBalance = mIrs.getMinBalanceLocked(userId, pkgName);
-        if (curBalance <= minBalance) {
-            return;
-        }
-        // AppStandby only counts elapsed time for things like this
-        // TODO: should we use clock time instead?
-        final long timeSinceLastUsedMs =
-                mAppStandbyInternal.getTimeSinceLastUsedByUser(pkgName, userId);
-        // The app is no longer exempted. We should take away some of credits so it's more in line
-        // with other non-exempt apps. However, don't take away as many credits if the app was used
-        // recently.
-        final double percentageToReclaim;
-        if (timeSinceLastUsedMs < DAY_IN_MILLIS) {
-            percentageToReclaim = .25;
-        } else if (timeSinceLastUsedMs < 2 * DAY_IN_MILLIS) {
-            percentageToReclaim = .5;
-        } else if (timeSinceLastUsedMs < 3 * DAY_IN_MILLIS) {
-            percentageToReclaim = .75;
-        } else {
-            percentageToReclaim = 1;
-        }
-        final long overage = curBalance - minBalance;
-        final long toReclaim = (long) (overage * percentageToReclaim);
-        if (toReclaim > 0) {
-            if (DEBUG) {
-                Slog.i(TAG, "Reclaiming bonus wealth! Taking " + toReclaim
-                        + " from " + appToString(userId, pkgName));
-            }
-
-            final long now = getCurrentTimeMillis();
-            final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-            recordTransactionLocked(userId, pkgName, ledger,
-                    new Ledger.Transaction(now, now, REGULATION_DEMOTION, null, -toReclaim, 0),
-                    true);
-        }
-    }
-
-    /**
-     * Reclaim all ARCs from an app that was just restricted.
-     */
-    @GuardedBy("mLock")
-    void onAppRestrictedLocked(final int userId, @NonNull final String pkgName) {
-        reclaimAllAssetsLocked(userId, pkgName, REGULATION_BG_RESTRICTED);
-    }
-
-    /**
-     * Give an app that was just unrestricted some ARCs.
-     */
-    @GuardedBy("mLock")
-    void onAppUnrestrictedLocked(final int userId, @NonNull final String pkgName) {
-        final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-        if (ledger.getCurrentBalance() > 0) {
-            Slog.wtf(TAG, "App " + pkgName + " had credits while it was restricted");
-            // App already got credits somehow. Move along.
-            return;
-        }
-
-        final long now = getCurrentTimeMillis();
-
-        recordTransactionLocked(userId, pkgName, ledger,
-                new Ledger.Transaction(now, now, REGULATION_BG_UNRESTRICTED, null,
-                        mIrs.getMinBalanceLocked(userId, pkgName), 0), true);
-    }
-
-    /** Returns true if an app should be given credits in the general distributions. */
-    private boolean shouldGiveCredits(@NonNull InstalledPackageInfo packageInfo) {
-        // Skip apps that wouldn't be doing any work. Giving them ARCs would be wasteful.
-        if (!packageInfo.hasCode) {
-            return false;
-        }
-        final int userId = UserHandle.getUserId(packageInfo.uid);
-        // No point allocating ARCs to the system. It can do whatever it wants.
-        return !mIrs.isSystem(userId, packageInfo.packageName)
-                && !mIrs.isPackageRestricted(userId, packageInfo.packageName);
-    }
-
-    void onCreditSupplyChanged() {
-        mHandler.sendEmptyMessage(MSG_CHECK_ALL_AFFORDABILITY);
-    }
-
-    @GuardedBy("mLock")
-    void distributeBasicIncomeLocked(int batteryLevel) {
-        final SparseArrayMap<String, InstalledPackageInfo> pkgs = mIrs.getInstalledPackages();
-
-        final long now = getCurrentTimeMillis();
-        for (int uIdx = pkgs.numMaps() - 1; uIdx >= 0; --uIdx) {
-            final int userId = pkgs.keyAt(uIdx);
-
-            for (int pIdx = pkgs.numElementsForKeyAt(uIdx) - 1; pIdx >= 0; --pIdx) {
-                final InstalledPackageInfo pkgInfo = pkgs.valueAt(uIdx, pIdx);
-                if (!shouldGiveCredits(pkgInfo)) {
-                    continue;
-                }
-                final String pkgName = pkgInfo.packageName;
-                final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-                final long minBalance = mIrs.getMinBalanceLocked(userId, pkgName);
-                final double perc = batteryLevel / 100d;
-                // TODO: maybe don't give credits to bankrupt apps until battery level >= 50%
-                final long shortfall = minBalance - ledger.getCurrentBalance();
-                if (shortfall > 0) {
-                    recordTransactionLocked(userId, pkgName, ledger,
-                            new Ledger.Transaction(now, now, REGULATION_BASIC_INCOME,
-                                    null, (long) (perc * shortfall), 0), true);
-                }
-            }
-        }
-    }
-
-    /** Give each app an initial balance. */
-    @GuardedBy("mLock")
-    void grantBirthrightsLocked() {
-        UserManagerInternal userManagerInternal =
-                LocalServices.getService(UserManagerInternal.class);
-        final int[] userIds = userManagerInternal.getUserIds();
-        for (int userId : userIds) {
-            grantBirthrightsLocked(userId);
-        }
-    }
-
-    @GuardedBy("mLock")
-    void grantBirthrightsLocked(final int userId) {
-        final List<InstalledPackageInfo> pkgs = mIrs.getInstalledPackages(userId);
-        final long now = getCurrentTimeMillis();
-
-        for (int i = 0; i < pkgs.size(); ++i) {
-            final InstalledPackageInfo packageInfo = pkgs.get(i);
-            if (!shouldGiveCredits(packageInfo)) {
-                continue;
-            }
-            final String pkgName = packageInfo.packageName;
-            final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-            if (ledger.getCurrentBalance() > 0) {
-                // App already got credits somehow. Move along.
-                Slog.wtf(TAG, "App " + pkgName + " had credits before economy was set up");
-                continue;
-            }
-
-            recordTransactionLocked(userId, pkgName, ledger,
-                    new Ledger.Transaction(now, now, REGULATION_BIRTHRIGHT, null,
-                            mIrs.getMinBalanceLocked(userId, pkgName), 0),
-                    true);
-        }
-    }
-
-    @GuardedBy("mLock")
-    void grantBirthrightLocked(final int userId, @NonNull final String pkgName) {
-        final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-        if (ledger.getCurrentBalance() > 0) {
-            Slog.wtf(TAG, "App " + pkgName + " had credits as soon as it was installed");
-            // App already got credits somehow. Move along.
-            return;
-        }
-
-        final long now = getCurrentTimeMillis();
-
-        recordTransactionLocked(userId, pkgName, ledger,
-                new Ledger.Transaction(now, now, REGULATION_BIRTHRIGHT, null,
-                        mIrs.getMinBalanceLocked(userId, pkgName), 0), true);
-    }
-
-    @GuardedBy("mLock")
-    void onAppExemptedLocked(final int userId, @NonNull final String pkgName) {
-        final long minBalance = mIrs.getMinBalanceLocked(userId, pkgName);
-        final long missing = minBalance - getBalanceLocked(userId, pkgName);
-        if (missing <= 0) {
-            return;
-        }
-
-        final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-        final long now = getCurrentTimeMillis();
-
-        recordTransactionLocked(userId, pkgName, ledger,
-                new Ledger.Transaction(now, now, REGULATION_PROMOTION, null, missing, 0), true);
-    }
-
-    @GuardedBy("mLock")
-    void onPackageRemovedLocked(final int userId, @NonNull final String pkgName) {
-        mScribe.discardLedgerLocked(userId, pkgName);
-        mCurrentOngoingEvents.delete(userId, pkgName);
-        mBalanceThresholdAlarmQueue.removeAlarmForKey(UserPackage.of(userId, pkgName));
-    }
-
-    @GuardedBy("mLock")
-    void onUserRemovedLocked(final int userId) {
-        mCurrentOngoingEvents.delete(userId);
-        mBalanceThresholdAlarmQueue.removeAlarmsForUserId(userId);
-    }
-
-    @VisibleForTesting
-    static class TrendCalculator implements Consumer<OngoingEvent> {
-        static final long WILL_NOT_CROSS_THRESHOLD = -1;
-
-        private long mCurBalance;
-        private long mRemainingConsumableCredits;
-        /**
-         * The maximum change in credits per second towards the upper threshold
-         * {@link #mUpperThreshold}. A value of 0 means the current ongoing events will never
-         * result in the app crossing the upper threshold.
-         */
-        private long mMaxDeltaPerSecToUpperThreshold;
-        /**
-         * The maximum change in credits per second towards the lower threshold
-         * {@link #mLowerThreshold}. A value of 0 means the current ongoing events will never
-         * result in the app crossing the lower threshold.
-         */
-        private long mMaxDeltaPerSecToLowerThreshold;
-        /**
-         * The maximum change in credits per second towards the highest CTP threshold below the
-         * remaining consumable credits (cached in {@link #mCtpThreshold}). A value of 0 means
-         * the current ongoing events will never result in the app crossing the lower threshold.
-         */
-        private long mMaxDeltaPerSecToCtpThreshold;
-        private long mUpperThreshold;
-        private long mLowerThreshold;
-        private long mCtpThreshold;
-
-        void reset(long curBalance, long remainingConsumableCredits,
-                @Nullable ArraySet<ActionAffordabilityNote> actionAffordabilityNotes) {
-            mCurBalance = curBalance;
-            mRemainingConsumableCredits = remainingConsumableCredits;
-            mMaxDeltaPerSecToUpperThreshold = mMaxDeltaPerSecToLowerThreshold = 0;
-            mMaxDeltaPerSecToCtpThreshold = 0;
-            mUpperThreshold = Long.MIN_VALUE;
-            mLowerThreshold = Long.MAX_VALUE;
-            mCtpThreshold = 0;
-            if (actionAffordabilityNotes != null) {
-                for (int i = 0; i < actionAffordabilityNotes.size(); ++i) {
-                    final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(i);
-                    final long price = note.getCachedModifiedPrice();
-                    if (price <= mCurBalance) {
-                        mLowerThreshold = (mLowerThreshold == Long.MAX_VALUE)
-                                ? price : Math.max(mLowerThreshold, price);
-                    } else {
-                        mUpperThreshold = (mUpperThreshold == Long.MIN_VALUE)
-                                ? price : Math.min(mUpperThreshold, price);
-                    }
-                    final long ctp = note.getStockLimitHonoringCtp();
-                    if (ctp <= mRemainingConsumableCredits) {
-                        mCtpThreshold = Math.max(mCtpThreshold, ctp);
-                    }
-                }
-            }
-        }
-
-        /**
-         * Returns the amount of time (in millisecond) it will take for the app to cross the next
-         * lowest action affordability note (compared to its current balance) based on current
-         * ongoing events.
-         * Returns {@link #WILL_NOT_CROSS_THRESHOLD} if the app will never cross the lowest
-         * threshold.
-         */
-        long getTimeToCrossLowerThresholdMs() {
-            if (mMaxDeltaPerSecToLowerThreshold == 0 && mMaxDeltaPerSecToCtpThreshold == 0) {
-                // Will never cross lower threshold based on current events.
-                return WILL_NOT_CROSS_THRESHOLD;
-            }
-            long minSeconds = Long.MAX_VALUE;
-            if (mMaxDeltaPerSecToLowerThreshold != 0) {
-                // deltaPerSec is a negative value, so do threshold-balance to cancel out the
-                // negative.
-                minSeconds = (mLowerThreshold - mCurBalance) / mMaxDeltaPerSecToLowerThreshold;
-            }
-            if (mMaxDeltaPerSecToCtpThreshold != 0) {
-                minSeconds = Math.min(minSeconds,
-                        // deltaPerSec is a negative value, so do threshold-balance to cancel
-                        // out the negative.
-                        (mCtpThreshold - mRemainingConsumableCredits)
-                                / mMaxDeltaPerSecToCtpThreshold);
-            }
-            return minSeconds * 1000;
-        }
-
-        /**
-         * Returns the amount of time (in millisecond) it will take for the app to cross the next
-         * highest action affordability note (compared to its current balance) based on current
-         * ongoing events.
-         * Returns {@link #WILL_NOT_CROSS_THRESHOLD} if the app will never cross the upper
-         * threshold.
-         */
-        long getTimeToCrossUpperThresholdMs() {
-            if (mMaxDeltaPerSecToUpperThreshold == 0) {
-                // Will never cross upper threshold based on current events.
-                return WILL_NOT_CROSS_THRESHOLD;
-            }
-            final long minSeconds =
-                    (mUpperThreshold - mCurBalance) / mMaxDeltaPerSecToUpperThreshold;
-            return minSeconds * 1000;
-        }
-
-        @Override
-        public void accept(OngoingEvent ongoingEvent) {
-            final long deltaPerSec = ongoingEvent.getDeltaPerSec();
-            if (mCurBalance >= mLowerThreshold && deltaPerSec < 0) {
-                mMaxDeltaPerSecToLowerThreshold += deltaPerSec;
-            } else if (mCurBalance < mUpperThreshold && deltaPerSec > 0) {
-                mMaxDeltaPerSecToUpperThreshold += deltaPerSec;
-            }
-            final long ctpPerSec = ongoingEvent.getCtpPerSec();
-            if (mRemainingConsumableCredits >= mCtpThreshold && deltaPerSec < 0) {
-                mMaxDeltaPerSecToCtpThreshold -= ctpPerSec;
-            }
-        }
-    }
-
-    @GuardedBy("mLock")
-    private final TrendCalculator mTrendCalculator = new TrendCalculator();
-
-    @GuardedBy("mLock")
-    private void scheduleBalanceCheckLocked(final int userId, @NonNull final String pkgName) {
-        SparseArrayMap<String, OngoingEvent> ongoingEvents =
-                mCurrentOngoingEvents.get(userId, pkgName);
-        if (ongoingEvents == null || mIrs.isVip(userId, pkgName)) {
-            // No ongoing transactions. No reason to schedule
-            mBalanceThresholdAlarmQueue.removeAlarmForKey(UserPackage.of(userId, pkgName));
-            return;
-        }
-        mTrendCalculator.reset(getBalanceLocked(userId, pkgName),
-                mScribe.getRemainingConsumableCakesLocked(),
-                mActionAffordabilityNotes.get(userId, pkgName));
-        ongoingEvents.forEach(mTrendCalculator);
-        final long lowerTimeMs = mTrendCalculator.getTimeToCrossLowerThresholdMs();
-        final long upperTimeMs = mTrendCalculator.getTimeToCrossUpperThresholdMs();
-        final long timeToThresholdMs;
-        if (lowerTimeMs == TrendCalculator.WILL_NOT_CROSS_THRESHOLD) {
-            if (upperTimeMs == TrendCalculator.WILL_NOT_CROSS_THRESHOLD) {
-                // Will never cross a threshold based on current events.
-                mBalanceThresholdAlarmQueue.removeAlarmForKey(UserPackage.of(userId, pkgName));
-                return;
-            }
-            timeToThresholdMs = upperTimeMs;
-        } else {
-            timeToThresholdMs = (upperTimeMs == TrendCalculator.WILL_NOT_CROSS_THRESHOLD)
-                    ? lowerTimeMs : Math.min(lowerTimeMs, upperTimeMs);
-        }
-        mBalanceThresholdAlarmQueue.addAlarm(UserPackage.of(userId, pkgName),
-                SystemClock.elapsedRealtime() + timeToThresholdMs);
-    }
-
-    @GuardedBy("mLock")
-    void tearDownLocked() {
-        mCurrentOngoingEvents.clear();
-        mBalanceThresholdAlarmQueue.removeAllAlarms();
-        mHandler.removeAllMessages();
-    }
-
-    @VisibleForTesting
-    static class OngoingEvent {
-        public final long startTimeElapsed;
-        public final int eventId;
-        @Nullable
-        public final String tag;
-        @Nullable
-        public final EconomicPolicy.Reward reward;
-        @Nullable
-        public final EconomicPolicy.Cost actionCost;
-        public int refCount;
-
-        OngoingEvent(int eventId, @Nullable String tag, long startTimeElapsed,
-                @NonNull EconomicPolicy.Reward reward) {
-            this.startTimeElapsed = startTimeElapsed;
-            this.eventId = eventId;
-            this.tag = tag;
-            this.reward = reward;
-            this.actionCost = null;
-            refCount = 1;
-        }
-
-        OngoingEvent(int eventId, @Nullable String tag, long startTimeElapsed,
-                @NonNull EconomicPolicy.Cost actionCost) {
-            this.startTimeElapsed = startTimeElapsed;
-            this.eventId = eventId;
-            this.tag = tag;
-            this.reward = null;
-            this.actionCost = actionCost;
-            refCount = 1;
-        }
-
-        long getDeltaPerSec() {
-            if (actionCost != null) {
-                return -actionCost.price;
-            }
-            if (reward != null) {
-                return reward.ongoingRewardPerSecond;
-            }
-            Slog.wtfStack(TAG, "No action or reward in ongoing event?!??!");
-            return 0;
-        }
-
-        long getCtpPerSec() {
-            if (actionCost != null) {
-                return actionCost.costToProduce;
-            }
-            return 0;
-        }
-    }
-
-    private class OngoingEventUpdater implements Consumer<OngoingEvent> {
-        private int mUserId;
-        private String mPkgName;
-        private long mNow;
-        private long mNowElapsed;
-
-        private void reset(int userId, String pkgName, long now, long nowElapsed) {
-            mUserId = userId;
-            mPkgName = pkgName;
-            mNow = now;
-            mNowElapsed = nowElapsed;
-        }
-
-        @Override
-        public void accept(OngoingEvent ongoingEvent) {
-            // Disable balance check & affordability notifications here because
-            // we're in the middle of updating ongoing action costs/prices and
-            // sending out notifications or rescheduling the balance check alarm
-            // would be a waste since we'll have to redo them again after all of
-            // our internal state is updated.
-            final boolean updateBalanceCheck = false;
-            stopOngoingActionLocked(mUserId, mPkgName, ongoingEvent.eventId, ongoingEvent.tag,
-                    mNowElapsed, mNow, updateBalanceCheck, /* notifyOnAffordabilityChange */ false);
-            noteOngoingEventLocked(mUserId, mPkgName, ongoingEvent.eventId, ongoingEvent.tag,
-                    mNowElapsed, updateBalanceCheck);
-        }
-    }
-
-    private final OngoingEventUpdater mOngoingEventUpdater = new OngoingEventUpdater();
-
-    /** Track when apps will cross the closest affordability threshold (in both directions). */
-    private class BalanceThresholdAlarmQueue extends AlarmQueue<UserPackage> {
-        private BalanceThresholdAlarmQueue(Context context, Looper looper) {
-            super(context, looper, ALARM_TAG_AFFORDABILITY_CHECK, "Affordability check", true,
-                    15_000L);
-        }
-
-        @Override
-        protected boolean isForUser(@NonNull UserPackage key, int userId) {
-            return key.userId == userId;
-        }
-
-        @Override
-        protected void processExpiredAlarms(@NonNull ArraySet<UserPackage> expired) {
-            for (int i = 0; i < expired.size(); ++i) {
-                UserPackage p = expired.valueAt(i);
-                mHandler.obtainMessage(
-                        MSG_CHECK_INDIVIDUAL_AFFORDABILITY, p.userId, 0, p.packageName)
-                        .sendToTarget();
-            }
-        }
-    }
-
-    @GuardedBy("mLock")
-    public void registerAffordabilityChangeListenerLocked(int userId, @NonNull String pkgName,
-            @NonNull EconomyManagerInternal.AffordabilityChangeListener listener,
-            @NonNull EconomyManagerInternal.ActionBill bill) {
-        ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
-                mActionAffordabilityNotes.get(userId, pkgName);
-        if (actionAffordabilityNotes == null) {
-            actionAffordabilityNotes = new ArraySet<>();
-            mActionAffordabilityNotes.add(userId, pkgName, actionAffordabilityNotes);
-        }
-        final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-        final ActionAffordabilityNote note =
-                new ActionAffordabilityNote(bill, listener, economicPolicy);
-        if (actionAffordabilityNotes.add(note)) {
-            if (mIrs.getEnabledMode() == ENABLED_MODE_OFF) {
-                // When TARE isn't enabled, we always say something is affordable. We also don't
-                // want to silently drop affordability change listeners in case TARE becomes enabled
-                // because then clients will be in an ambiguous state.
-                note.setNewAffordability(true);
-                return;
-            }
-            final boolean isVip = mIrs.isVip(userId, pkgName);
-            note.recalculateCosts(economicPolicy, userId, pkgName);
-            note.setNewAffordability(isVip
-                    || isAffordableLocked(getBalanceLocked(userId, pkgName),
-                            note.getCachedModifiedPrice(), note.getStockLimitHonoringCtp()));
-            mIrs.postAffordabilityChanged(userId, pkgName, note);
-            // Update ongoing alarm
-            scheduleBalanceCheckLocked(userId, pkgName);
-        }
-    }
-
-    @GuardedBy("mLock")
-    public void unregisterAffordabilityChangeListenerLocked(int userId, @NonNull String pkgName,
-            @NonNull EconomyManagerInternal.AffordabilityChangeListener listener,
-            @NonNull EconomyManagerInternal.ActionBill bill) {
-        final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
-                mActionAffordabilityNotes.get(userId, pkgName);
-        if (actionAffordabilityNotes != null) {
-            final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-            final ActionAffordabilityNote note =
-                    new ActionAffordabilityNote(bill, listener, economicPolicy);
-            if (actionAffordabilityNotes.remove(note)) {
-                // Update ongoing alarm
-                scheduleBalanceCheckLocked(userId, pkgName);
-            }
-        }
-    }
-
-    static final class ActionAffordabilityNote {
-        private final EconomyManagerInternal.ActionBill mActionBill;
-        private final EconomyManagerInternal.AffordabilityChangeListener mListener;
-        private long mStockLimitHonoringCtp;
-        private long mModifiedPrice;
-        private boolean mIsAffordable;
-
-        @VisibleForTesting
-        ActionAffordabilityNote(@NonNull EconomyManagerInternal.ActionBill bill,
-                @NonNull EconomyManagerInternal.AffordabilityChangeListener listener,
-                @NonNull EconomicPolicy economicPolicy) {
-            mActionBill = bill;
-            final List<EconomyManagerInternal.AnticipatedAction> anticipatedActions =
-                    bill.getAnticipatedActions();
-            for (int i = 0; i < anticipatedActions.size(); ++i) {
-                final EconomyManagerInternal.AnticipatedAction aa = anticipatedActions.get(i);
-                final EconomicPolicy.Action action = economicPolicy.getAction(aa.actionId);
-                if (action == null) {
-                    if ((aa.actionId & EconomicPolicy.ALL_POLICIES) == 0) {
-                        throw new IllegalArgumentException("Invalid action id: " + aa.actionId);
-                    } else {
-                        Slog.w(TAG, "Tracking disabled policy's action? " + aa.actionId);
-                    }
-                }
-            }
-            mListener = listener;
-        }
-
-        @NonNull
-        EconomyManagerInternal.ActionBill getActionBill() {
-            return mActionBill;
-        }
-
-        @NonNull
-        EconomyManagerInternal.AffordabilityChangeListener getListener() {
-            return mListener;
-        }
-
-        private long getCachedModifiedPrice() {
-            return mModifiedPrice;
-        }
-
-        /** Returns the cumulative CTP of actions in this note that respect the stock limit. */
-        private long getStockLimitHonoringCtp() {
-            return mStockLimitHonoringCtp;
-        }
-
-        @VisibleForTesting
-        void recalculateCosts(@NonNull EconomicPolicy economicPolicy,
-                int userId, @NonNull String pkgName) {
-            long modifiedPrice = 0;
-            long stockLimitHonoringCtp = 0;
-            final List<EconomyManagerInternal.AnticipatedAction> anticipatedActions =
-                    mActionBill.getAnticipatedActions();
-            for (int i = 0; i < anticipatedActions.size(); ++i) {
-                final EconomyManagerInternal.AnticipatedAction aa = anticipatedActions.get(i);
-                final EconomicPolicy.Action action = economicPolicy.getAction(aa.actionId);
-
-                final EconomicPolicy.Cost actionCost =
-                        economicPolicy.getCostOfAction(aa.actionId, userId, pkgName);
-                modifiedPrice += actionCost.price * aa.numInstantaneousCalls
-                        + actionCost.price * (aa.ongoingDurationMs / 1000);
-                if (action.respectsStockLimit) {
-                    stockLimitHonoringCtp +=
-                            actionCost.costToProduce * aa.numInstantaneousCalls
-                                    + actionCost.costToProduce * (aa.ongoingDurationMs / 1000);
-                }
-            }
-            mModifiedPrice = modifiedPrice;
-            mStockLimitHonoringCtp = stockLimitHonoringCtp;
-        }
-
-        boolean isCurrentlyAffordable() {
-            return mIsAffordable;
-        }
-
-        private void setNewAffordability(boolean isAffordable) {
-            mIsAffordable = isAffordable;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (!(o instanceof ActionAffordabilityNote)) return false;
-            ActionAffordabilityNote other = (ActionAffordabilityNote) o;
-            return mActionBill.equals(other.mActionBill)
-                    && mListener.equals(other.mListener);
-        }
-
-        @Override
-        public int hashCode() {
-            int hash = 0;
-            hash = 31 * hash + Objects.hash(mListener);
-            hash = 31 * hash + mActionBill.hashCode();
-            return hash;
-        }
-    }
-
-    private final class AgentHandler extends Handler {
-        AgentHandler(Looper looper) {
-            super(looper);
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_CHECK_ALL_AFFORDABILITY: {
-                    synchronized (mLock) {
-                        removeMessages(MSG_CHECK_ALL_AFFORDABILITY);
-                        onAnythingChangedLocked(false);
-                    }
-                }
-                break;
-
-                case MSG_CHECK_INDIVIDUAL_AFFORDABILITY: {
-                    final int userId = msg.arg1;
-                    final String pkgName = (String) msg.obj;
-                    synchronized (mLock) {
-                        final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
-                                mActionAffordabilityNotes.get(userId, pkgName);
-                        if (actionAffordabilityNotes != null
-                                && actionAffordabilityNotes.size() > 0) {
-                            final long newBalance = getBalanceLocked(userId, pkgName);
-                            final boolean isVip = mIrs.isVip(userId, pkgName);
-
-                            for (int i = 0; i < actionAffordabilityNotes.size(); ++i) {
-                                final ActionAffordabilityNote note =
-                                        actionAffordabilityNotes.valueAt(i);
-                                final boolean isAffordable = isVip || isAffordableLocked(
-                                        newBalance, note.getCachedModifiedPrice(),
-                                        note.getStockLimitHonoringCtp());
-                                if (note.isCurrentlyAffordable() != isAffordable) {
-                                    note.setNewAffordability(isAffordable);
-                                    mIrs.postAffordabilityChanged(userId, pkgName, note);
-                                }
-                            }
-                        }
-                        scheduleBalanceCheckLocked(userId, pkgName);
-                    }
-                }
-                break;
-            }
-        }
-
-        void removeAllMessages() {
-            removeMessages(MSG_CHECK_ALL_AFFORDABILITY);
-            removeMessages(MSG_CHECK_INDIVIDUAL_AFFORDABILITY);
-        }
-    }
-
-    @GuardedBy("mLock")
-    void dumpLocked(IndentingPrintWriter pw) {
-        mBalanceThresholdAlarmQueue.dump(pw);
-
-        pw.println();
-        pw.println("Ongoing events:");
-        pw.increaseIndent();
-        boolean printedEvents = false;
-        final long nowElapsed = SystemClock.elapsedRealtime();
-        for (int u = mCurrentOngoingEvents.numMaps() - 1; u >= 0; --u) {
-            final int userId = mCurrentOngoingEvents.keyAt(u);
-            for (int p = mCurrentOngoingEvents.numElementsForKey(userId) - 1; p >= 0; --p) {
-                final String pkgName = mCurrentOngoingEvents.keyAt(u, p);
-                final SparseArrayMap<String, OngoingEvent> ongoingEvents =
-                        mCurrentOngoingEvents.get(userId, pkgName);
-
-                boolean printedApp = false;
-
-                for (int e = ongoingEvents.numMaps() - 1; e >= 0; --e) {
-                    final int eventId = ongoingEvents.keyAt(e);
-                    for (int t = ongoingEvents.numElementsForKey(eventId) - 1; t >= 0; --t) {
-                        if (!printedApp) {
-                            printedApp = true;
-                            pw.println(appToString(userId, pkgName));
-                            pw.increaseIndent();
-                        }
-                        printedEvents = true;
-
-                        OngoingEvent ongoingEvent = ongoingEvents.valueAt(e, t);
-
-                        pw.print(EconomicPolicy.eventToString(ongoingEvent.eventId));
-                        if (ongoingEvent.tag != null) {
-                            pw.print("(");
-                            pw.print(ongoingEvent.tag);
-                            pw.print(")");
-                        }
-                        pw.print(" runtime=");
-                        TimeUtils.formatDuration(nowElapsed - ongoingEvent.startTimeElapsed, pw);
-                        pw.print(" delta/sec=");
-                        pw.print(cakeToString(ongoingEvent.getDeltaPerSec()));
-                        final long ctp = ongoingEvent.getCtpPerSec();
-                        if (ctp != 0) {
-                            pw.print(" ctp/sec=");
-                            pw.print(cakeToString(ongoingEvent.getCtpPerSec()));
-                        }
-                        pw.print(" refCount=");
-                        pw.print(ongoingEvent.refCount);
-                        pw.println();
-                    }
-                }
-
-                if (printedApp) {
-                    pw.decreaseIndent();
-                }
-            }
-        }
-        if (!printedEvents) {
-            pw.print("N/A");
-        }
-        pw.decreaseIndent();
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java
deleted file mode 100644
index 8381d1a..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java
+++ /dev/null
@@ -1,454 +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.server.tare;
-
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_AM_MAX_SATIATED_BALANCE;
-import static android.app.tare.EconomyManager.KEY_AM_MIN_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED;
-import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP;
-import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_MAX;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_INSTANT;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_MAX;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_ONGOING;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.arcToCake;
-import static android.provider.Settings.Global.TARE_ALARM_MANAGER_CONSTANTS;
-
-import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING;
-import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE;
-import static com.android.server.tare.TareUtils.cakeToString;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ContentResolver;
-import android.provider.DeviceConfig;
-import android.util.IndentingPrintWriter;
-import android.util.Slog;
-import android.util.SparseArray;
-
-/**
- * Policy defining pricing information and daily ARC requirements and suggestions for
- * AlarmManager.
- */
-public class AlarmManagerEconomicPolicy extends EconomicPolicy {
-    private static final String TAG = "TARE- " + AlarmManagerEconomicPolicy.class.getSimpleName();
-
-    public static final int ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE =
-            TYPE_ACTION | POLICY_ALARM | 0;
-    public static final int ACTION_ALARM_WAKEUP_EXACT =
-            TYPE_ACTION | POLICY_ALARM | 1;
-    public static final int ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE =
-            TYPE_ACTION | POLICY_ALARM | 2;
-    public static final int ACTION_ALARM_WAKEUP_INEXACT =
-            TYPE_ACTION | POLICY_ALARM | 3;
-    public static final int ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE =
-            TYPE_ACTION | POLICY_ALARM | 4;
-    public static final int ACTION_ALARM_NONWAKEUP_EXACT =
-            TYPE_ACTION | POLICY_ALARM | 5;
-    public static final int ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE =
-            TYPE_ACTION | POLICY_ALARM | 6;
-    public static final int ACTION_ALARM_NONWAKEUP_INEXACT =
-            TYPE_ACTION | POLICY_ALARM | 7;
-    public static final int ACTION_ALARM_CLOCK =
-            TYPE_ACTION | POLICY_ALARM | 8;
-
-    private static final int[] COST_MODIFIERS = new int[]{
-            COST_MODIFIER_CHARGING,
-            COST_MODIFIER_DEVICE_IDLE,
-            COST_MODIFIER_POWER_SAVE_MODE,
-            COST_MODIFIER_PROCESS_STATE
-    };
-
-    private long mMinSatiatedBalanceExempted;
-    private long mMinSatiatedBalanceHeadlessSystemApp;
-    private long mMinSatiatedBalanceOther;
-    private long mMaxSatiatedBalance;
-    private long mInitialSatiatedConsumptionLimit;
-    private long mMinSatiatedConsumptionLimit;
-    private long mMaxSatiatedConsumptionLimit;
-
-    private final Injector mInjector;
-
-    private final SparseArray<Action> mActions = new SparseArray<>();
-    private final SparseArray<Reward> mRewards = new SparseArray<>();
-
-    AlarmManagerEconomicPolicy(InternalResourceService irs, Injector injector) {
-        super(irs);
-        mInjector = injector;
-        loadConstants("", null);
-    }
-
-    @Override
-    void setup(@NonNull DeviceConfig.Properties properties) {
-        super.setup(properties);
-        ContentResolver resolver = mIrs.getContext().getContentResolver();
-        loadConstants(mInjector.getSettingsGlobalString(resolver, TARE_ALARM_MANAGER_CONSTANTS),
-                properties);
-    }
-
-    @Override
-    long getMinSatiatedBalance(final int userId, @NonNull final String pkgName) {
-        if (mIrs.isPackageRestricted(userId, pkgName)) {
-            return 0;
-        }
-        if (mIrs.isPackageExempted(userId, pkgName)) {
-            return mMinSatiatedBalanceExempted;
-        }
-        if (mIrs.isHeadlessSystemApp(userId, pkgName)) {
-            return mMinSatiatedBalanceHeadlessSystemApp;
-        }
-        // TODO: take other exemptions into account
-        return mMinSatiatedBalanceOther;
-    }
-
-    @Override
-    long getMaxSatiatedBalance(int userId, @NonNull String pkgName) {
-        if (mIrs.isPackageRestricted(userId, pkgName)) {
-            return 0;
-        }
-        // TODO(230501287): adjust balance based on whether the app has the SCHEDULE_EXACT_ALARM
-        // permission granted. Apps without the permission granted shouldn't need a high balance
-        // since they won't be able to use exact alarms. Apps with the permission granted could
-        // have a higher balance, or perhaps just those with the USE_EXACT_ALARM permission since
-        // that is limited to specific use cases.
-        return mMaxSatiatedBalance;
-    }
-
-    @Override
-    long getInitialSatiatedConsumptionLimit() {
-        return mInitialSatiatedConsumptionLimit;
-    }
-
-    @Override
-    long getMinSatiatedConsumptionLimit() {
-        return mMinSatiatedConsumptionLimit;
-    }
-
-    @Override
-    long getMaxSatiatedConsumptionLimit() {
-        return mMaxSatiatedConsumptionLimit;
-    }
-
-    @NonNull
-    @Override
-    int[] getCostModifiers() {
-        return COST_MODIFIERS;
-    }
-
-    @Nullable
-    @Override
-    Action getAction(@AppAction int actionId) {
-        return mActions.get(actionId);
-    }
-
-    @Nullable
-    @Override
-    Reward getReward(@UtilityReward int rewardId) {
-        return mRewards.get(rewardId);
-    }
-
-    private void loadConstants(String policyValuesString,
-            @Nullable DeviceConfig.Properties properties) {
-        mActions.clear();
-        mRewards.clear();
-
-        try {
-            mUserSettingDeviceConfigMediator.setSettingsString(policyValuesString);
-            mUserSettingDeviceConfigMediator.setDeviceConfigProperties(properties);
-        } catch (IllegalArgumentException e) {
-            Slog.e(TAG, "Global setting key incorrect: ", e);
-        }
-
-        mMinSatiatedBalanceOther = getConstantAsCake(
-            KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES);
-        mMinSatiatedBalanceHeadlessSystemApp = getConstantAsCake(
-                KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
-                DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
-                mMinSatiatedBalanceOther);
-        mMinSatiatedBalanceExempted = getConstantAsCake(
-                KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED,
-                DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
-                mMinSatiatedBalanceHeadlessSystemApp);
-        mMaxSatiatedBalance = getConstantAsCake(
-            KEY_AM_MAX_SATIATED_BALANCE, DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
-            Math.max(arcToCake(1), mMinSatiatedBalanceExempted));
-        mMinSatiatedConsumptionLimit = getConstantAsCake(
-                KEY_AM_MIN_CONSUMPTION_LIMIT, DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES,
-                arcToCake(1));
-        mInitialSatiatedConsumptionLimit = getConstantAsCake(
-                KEY_AM_INITIAL_CONSUMPTION_LIMIT, DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES,
-                mMinSatiatedConsumptionLimit);
-        mMaxSatiatedConsumptionLimit = getConstantAsCake(
-                KEY_AM_MAX_CONSUMPTION_LIMIT, DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES,
-                mInitialSatiatedConsumptionLimit);
-
-        final long exactAllowWhileIdleWakeupBasePrice = getConstantAsCake(
-                KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE,
-                DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE_CAKES);
-
-        // Apps must hold the SCHEDULE_EXACT_ALARM or USE_EXACT_ALARMS permission in order to use
-        // exact alarms. Since the user has the option of granting/revoking the permission, we can
-        // be a little lenient on the action cost checks and only stop the action if the app has
-        // run out of credits, and not when the system has run out of stock.
-        mActions.put(ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE,
-                new Action(ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE,
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP,
-                                DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP_CAKES),
-                        exactAllowWhileIdleWakeupBasePrice,
-                        /* respectsStockLimit */ false));
-        mActions.put(ACTION_ALARM_WAKEUP_EXACT,
-                new Action(ACTION_ALARM_WAKEUP_EXACT,
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP,
-                                DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP_CAKES),
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE,
-                                DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE_CAKES),
-                        /* respectsStockLimit */ false));
-
-        final long inexactAllowWhileIdleWakeupBasePrice =
-                getConstantAsCake(
-                        KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE,
-                        DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE_CAKES);
-
-        mActions.put(ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE,
-                new Action(ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE,
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP,
-                                DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP_CAKES),
-                        inexactAllowWhileIdleWakeupBasePrice,
-                        /* respectsStockLimit */ false));
-        mActions.put(ACTION_ALARM_WAKEUP_INEXACT,
-                new Action(ACTION_ALARM_WAKEUP_INEXACT,
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP,
-                                DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP_CAKES),
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE,
-                                DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE_CAKES),
-                        /* respectsStockLimit */ false));
-
-        final long exactAllowWhileIdleNonWakeupBasePrice = getConstantAsCake(
-                KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE,
-                DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES);
-        mActions.put(ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE,
-                new Action(ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE,
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP,
-                                DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP_CAKES),
-                        exactAllowWhileIdleNonWakeupBasePrice,
-                        /* respectsStockLimit */ false));
-
-        mActions.put(ACTION_ALARM_NONWAKEUP_EXACT,
-                new Action(ACTION_ALARM_NONWAKEUP_EXACT,
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP,
-                                DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP_CAKES),
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE,
-                                DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE_CAKES),
-                        /* respectsStockLimit */ false));
-
-        final long inexactAllowWhileIdleNonWakeupBasePrice = getConstantAsCake(
-                KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE,
-                DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES);
-        final long inexactAllowWhileIdleNonWakeupCtp = getConstantAsCake(
-                KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP,
-                DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP_CAKES);
-        mActions.put(ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE,
-                new Action(ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE,
-                        inexactAllowWhileIdleNonWakeupCtp,
-                        inexactAllowWhileIdleNonWakeupBasePrice));
-
-        mActions.put(ACTION_ALARM_NONWAKEUP_INEXACT,
-                new Action(ACTION_ALARM_NONWAKEUP_INEXACT,
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP,
-                                DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP_CAKES),
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE,
-                                DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE_CAKES)));
-        mActions.put(ACTION_ALARM_CLOCK,
-                new Action(ACTION_ALARM_CLOCK,
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP,
-                                DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP_CAKES),
-                        getConstantAsCake(
-                                KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE,
-                                DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE_CAKES),
-                        /* respectsStockLimit */ false));
-
-        mRewards.put(REWARD_TOP_ACTIVITY, new Reward(REWARD_TOP_ACTIVITY,
-                getConstantAsCake(
-                        KEY_AM_REWARD_TOP_ACTIVITY_INSTANT,
-                        DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT_CAKES),
-                getConstantAsCake(
-                        KEY_AM_REWARD_TOP_ACTIVITY_ONGOING,
-                        DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING_CAKES),
-                getConstantAsCake(
-                        KEY_AM_REWARD_TOP_ACTIVITY_MAX,
-                        DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX_CAKES)));
-        mRewards.put(REWARD_NOTIFICATION_SEEN, new Reward(REWARD_NOTIFICATION_SEEN,
-                getConstantAsCake(
-                        KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT,
-                        DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES),
-                getConstantAsCake(
-                        KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING,
-                        DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES),
-                getConstantAsCake(
-                        KEY_AM_REWARD_NOTIFICATION_SEEN_MAX,
-                        DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX_CAKES)));
-        mRewards.put(REWARD_NOTIFICATION_INTERACTION,
-                new Reward(REWARD_NOTIFICATION_INTERACTION,
-                        getConstantAsCake(
-                                KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT,
-                                DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES),
-                        getConstantAsCake(
-                                KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING,
-                                DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES),
-                        getConstantAsCake(
-                                KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX,
-                                DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES)));
-        mRewards.put(REWARD_WIDGET_INTERACTION, new Reward(REWARD_WIDGET_INTERACTION,
-                getConstantAsCake(
-                        KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT,
-                        DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT_CAKES),
-                getConstantAsCake(
-                        KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING,
-                        DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING_CAKES),
-                getConstantAsCake(
-                        KEY_AM_REWARD_WIDGET_INTERACTION_MAX,
-                        DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX_CAKES)));
-        mRewards.put(REWARD_OTHER_USER_INTERACTION,
-                new Reward(REWARD_OTHER_USER_INTERACTION,
-                        getConstantAsCake(
-                                KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT,
-                                DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES),
-                        getConstantAsCake(
-                                KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING,
-                                DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES),
-                        getConstantAsCake(
-                                KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX,
-                                DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX_CAKES)));
-    }
-
-    @Override
-    void dump(IndentingPrintWriter pw) {
-        pw.println("Min satiated balances:");
-        pw.increaseIndent();
-        pw.print("Exempted", cakeToString(mMinSatiatedBalanceExempted)).println();
-        pw.print("Other", cakeToString(mMinSatiatedBalanceOther)).println();
-        pw.decreaseIndent();
-        pw.print("Max satiated balance", cakeToString(mMaxSatiatedBalance)).println();
-        pw.print("Consumption limits: [");
-        pw.print(cakeToString(mMinSatiatedConsumptionLimit));
-        pw.print(", ");
-        pw.print(cakeToString(mInitialSatiatedConsumptionLimit));
-        pw.print(", ");
-        pw.print(cakeToString(mMaxSatiatedConsumptionLimit));
-        pw.println("]");
-
-        pw.println();
-        pw.println("Actions:");
-        pw.increaseIndent();
-        for (int i = 0; i < mActions.size(); ++i) {
-            dumpAction(pw, mActions.valueAt(i));
-        }
-        pw.decreaseIndent();
-
-        pw.println();
-        pw.println("Rewards:");
-        pw.increaseIndent();
-        for (int i = 0; i < mRewards.size(); ++i) {
-            dumpReward(pw, mRewards.valueAt(i));
-        }
-        pw.decreaseIndent();
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Analyst.java b/apex/jobscheduler/service/java/com/android/server/tare/Analyst.java
deleted file mode 100644
index 06333f1..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/Analyst.java
+++ /dev/null
@@ -1,421 +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.server.tare;
-
-import static android.text.format.DateUtils.HOUR_IN_MILLIS;
-
-import static com.android.server.tare.EconomicPolicy.TYPE_ACTION;
-import static com.android.server.tare.EconomicPolicy.TYPE_REGULATION;
-import static com.android.server.tare.EconomicPolicy.TYPE_REWARD;
-import static com.android.server.tare.EconomicPolicy.getEventType;
-import static com.android.server.tare.TareUtils.cakeToString;
-
-import android.annotation.NonNull;
-import android.os.BatteryManagerInternal;
-import android.os.RemoteException;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.app.IBatteryStats;
-import com.android.server.LocalServices;
-import com.android.server.am.BatteryStatsService;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Responsible for maintaining statistics and analysis of TARE's performance.
- */
-public class Analyst {
-    private static final String TAG = "TARE-" + Analyst.class.getSimpleName();
-    private static final boolean DEBUG = InternalResourceService.DEBUG
-            || Log.isLoggable(TAG, Log.DEBUG);
-
-    private static final int NUM_PERIODS_TO_RETAIN = 8;
-    @VisibleForTesting
-    static final long MIN_REPORT_DURATION_FOR_RESET = 24 * HOUR_IN_MILLIS;
-
-    static final class Report {
-        /** How much the battery was discharged over the tracked period. */
-        public int cumulativeBatteryDischarge = 0;
-        public int currentBatteryLevel = 0;
-        /**
-         * Profit from performing actions. This excludes special circumstances where we charge the
-         * app
-         * less than the action's CTP.
-         */
-        public long cumulativeProfit = 0;
-        public int numProfitableActions = 0;
-        /**
-         * Losses from performing actions for special circumstances (eg. for a TOP app) where we
-         * charge
-         * the app less than the action's CTP.
-         */
-        public long cumulativeLoss = 0;
-        public int numUnprofitableActions = 0;
-        /**
-         * The total number of rewards given to apps over this period.
-         */
-        public long cumulativeRewards = 0;
-        public int numRewards = 0;
-        /**
-         * Regulations that increased an app's balance.
-         */
-        public long cumulativePositiveRegulations = 0;
-        public int numPositiveRegulations = 0;
-        /**
-         * Regulations that decreased an app's balance.
-         */
-        public long cumulativeNegativeRegulations = 0;
-        public int numNegativeRegulations = 0;
-
-        /**
-         * The approximate amount of time the screen has been off while on battery while this
-         * report has been active.
-         */
-        public long screenOffDurationMs = 0;
-        /**
-         * The approximate amount of battery discharge while this report has been active.
-         */
-        public long screenOffDischargeMah = 0;
-        /** The offset used to get the delta when polling the screen off time from BatteryStats. */
-        private long bsScreenOffRealtimeBase = 0;
-        /**
-         * The offset used to get the delta when polling the screen off discharge from BatteryStats.
-         */
-        private long bsScreenOffDischargeMahBase = 0;
-
-        private void clear() {
-            cumulativeBatteryDischarge = 0;
-            currentBatteryLevel = 0;
-            cumulativeProfit = 0;
-            numProfitableActions = 0;
-            cumulativeLoss = 0;
-            numUnprofitableActions = 0;
-            cumulativeRewards = 0;
-            numRewards = 0;
-            cumulativePositiveRegulations = 0;
-            numPositiveRegulations = 0;
-            cumulativeNegativeRegulations = 0;
-            numNegativeRegulations = 0;
-            screenOffDurationMs = 0;
-            screenOffDischargeMah = 0;
-            bsScreenOffRealtimeBase = 0;
-            bsScreenOffDischargeMahBase = 0;
-        }
-    }
-
-    private final IBatteryStats mIBatteryStats;
-
-    private int mPeriodIndex = 0;
-    /** How much the battery was discharged over the tracked period. */
-    private final Report[] mReports = new Report[NUM_PERIODS_TO_RETAIN];
-
-    Analyst() {
-        this(BatteryStatsService.getService());
-    }
-
-    @VisibleForTesting Analyst(IBatteryStats iBatteryStats) {
-        mIBatteryStats = iBatteryStats;
-    }
-
-    /** Returns the list of most recent reports, with the oldest report first. */
-    @NonNull
-    List<Report> getReports() {
-        final List<Report> list = new ArrayList<>(NUM_PERIODS_TO_RETAIN);
-        for (int i = 1; i <= NUM_PERIODS_TO_RETAIN; ++i) {
-            final int idx = (mPeriodIndex + i) % NUM_PERIODS_TO_RETAIN;
-            final Report report = mReports[idx];
-            if (report != null) {
-                list.add(report);
-            }
-        }
-        return list;
-    }
-
-    long getBatteryScreenOffDischargeMah() {
-        long discharge = 0;
-        for (Report report : mReports) {
-            if (report == null) {
-                continue;
-            }
-            discharge += report.screenOffDischargeMah;
-        }
-        return discharge;
-    }
-
-    long getBatteryScreenOffDurationMs() {
-        long duration = 0;
-        for (Report report : mReports) {
-            if (report == null) {
-                continue;
-            }
-            duration += report.screenOffDurationMs;
-        }
-        return duration;
-    }
-
-    /**
-     * Tracks the given reports instead of whatever is currently saved. Reports should be ordered
-     * oldest to most recent.
-     */
-    void loadReports(@NonNull List<Report> reports) {
-        final int numReports = reports.size();
-        mPeriodIndex = Math.max(0, Math.min(NUM_PERIODS_TO_RETAIN, numReports) - 1);
-        for (int i = 0; i < NUM_PERIODS_TO_RETAIN; ++i) {
-            if (i < numReports) {
-                mReports[i] = reports.get(i);
-            } else {
-                mReports[i] = null;
-            }
-        }
-        final Report latest = mReports[mPeriodIndex];
-        if (latest != null) {
-            latest.bsScreenOffRealtimeBase = getLatestBatteryScreenOffRealtimeMs();
-            latest.bsScreenOffDischargeMahBase = getLatestScreenOffDischargeMah();
-        }
-    }
-
-    void noteBatteryLevelChange(int newBatteryLevel) {
-        final boolean deviceDischargedEnough = mReports[mPeriodIndex] != null
-                && newBatteryLevel >= 90
-                // Battery level is increasing, so device is charging.
-                && mReports[mPeriodIndex].currentBatteryLevel < newBatteryLevel
-                && mReports[mPeriodIndex].cumulativeBatteryDischarge >= 25;
-        final boolean reportLongEnough = mReports[mPeriodIndex] != null
-                // Battery level is increasing, so device is charging.
-                && mReports[mPeriodIndex].currentBatteryLevel < newBatteryLevel
-                && mReports[mPeriodIndex].screenOffDurationMs >= MIN_REPORT_DURATION_FOR_RESET;
-        final boolean shouldStartNewReport = deviceDischargedEnough || reportLongEnough;
-        if (shouldStartNewReport) {
-            mPeriodIndex = (mPeriodIndex + 1) % NUM_PERIODS_TO_RETAIN;
-            if (mReports[mPeriodIndex] != null) {
-                final Report report = mReports[mPeriodIndex];
-                report.clear();
-                report.currentBatteryLevel = newBatteryLevel;
-                report.bsScreenOffRealtimeBase = getLatestBatteryScreenOffRealtimeMs();
-                report.bsScreenOffDischargeMahBase = getLatestScreenOffDischargeMah();
-                return;
-            }
-        }
-
-        if (mReports[mPeriodIndex] == null) {
-            Report report = initializeReport();
-            mReports[mPeriodIndex] = report;
-            report.currentBatteryLevel = newBatteryLevel;
-            return;
-        }
-
-        final Report report = mReports[mPeriodIndex];
-        if (newBatteryLevel < report.currentBatteryLevel) {
-            report.cumulativeBatteryDischarge += (report.currentBatteryLevel - newBatteryLevel);
-
-            final long latestScreenOffRealtime = getLatestBatteryScreenOffRealtimeMs();
-            final long latestScreenOffDischargeMah = getLatestScreenOffDischargeMah();
-            if (report.bsScreenOffRealtimeBase > latestScreenOffRealtime) {
-                // BatteryStats reset
-                report.bsScreenOffRealtimeBase = 0;
-                report.bsScreenOffDischargeMahBase = 0;
-            }
-            report.screenOffDurationMs +=
-                    (latestScreenOffRealtime - report.bsScreenOffRealtimeBase);
-            report.screenOffDischargeMah +=
-                    (latestScreenOffDischargeMah - report.bsScreenOffDischargeMahBase);
-            report.bsScreenOffRealtimeBase = latestScreenOffRealtime;
-            report.bsScreenOffDischargeMahBase = latestScreenOffDischargeMah;
-        }
-        report.currentBatteryLevel = newBatteryLevel;
-    }
-
-    void noteTransaction(@NonNull Ledger.Transaction transaction) {
-        if (mReports[mPeriodIndex] == null) {
-            mReports[mPeriodIndex] = initializeReport();
-        }
-        final Report report = mReports[mPeriodIndex];
-        switch (getEventType(transaction.eventId)) {
-            case TYPE_ACTION:
-                // For now, assume all instances where price < CTP is a special instance.
-                // TODO: add an explicit signal for special circumstances
-                if (-transaction.delta > transaction.ctp) {
-                    report.cumulativeProfit += (-transaction.delta - transaction.ctp);
-                    report.numProfitableActions++;
-                } else if (-transaction.delta < transaction.ctp) {
-                    report.cumulativeLoss += (transaction.ctp + transaction.delta);
-                    report.numUnprofitableActions++;
-                }
-                break;
-            case TYPE_REGULATION:
-                if (transaction.delta > 0) {
-                    report.cumulativePositiveRegulations += transaction.delta;
-                    report.numPositiveRegulations++;
-                } else if (transaction.delta < 0) {
-                    report.cumulativeNegativeRegulations -= transaction.delta;
-                    report.numNegativeRegulations++;
-                }
-                break;
-            case TYPE_REWARD:
-                if (transaction.delta != 0) {
-                    report.cumulativeRewards += transaction.delta;
-                    report.numRewards++;
-                }
-                break;
-        }
-    }
-
-    void tearDown() {
-        for (int i = 0; i < mReports.length; ++i) {
-            mReports[i] = null;
-        }
-        mPeriodIndex = 0;
-    }
-
-    private long getLatestBatteryScreenOffRealtimeMs() {
-        try {
-            return mIBatteryStats.computeBatteryScreenOffRealtimeMs();
-        } catch (RemoteException e) {
-            // Shouldn't happen
-            return 0;
-        }
-    }
-
-    private long getLatestScreenOffDischargeMah() {
-        try {
-            return mIBatteryStats.getScreenOffDischargeMah();
-        } catch (RemoteException e) {
-            // Shouldn't happen
-            return 0;
-        }
-    }
-
-    @NonNull
-    private Report initializeReport() {
-        final Report report = new Report();
-        report.bsScreenOffRealtimeBase = getLatestBatteryScreenOffRealtimeMs();
-        report.bsScreenOffDischargeMahBase = getLatestScreenOffDischargeMah();
-        return report;
-    }
-
-    @NonNull
-    private String padStringWithSpaces(@NonNull String text, int targetLength) {
-        // Make sure to have at least one space on either side.
-        final int padding = Math.max(2, targetLength - text.length()) >>> 1;
-        return " ".repeat(padding) + text + " ".repeat(padding);
-    }
-
-    void dump(IndentingPrintWriter pw) {
-        final BatteryManagerInternal bmi = LocalServices.getService(BatteryManagerInternal.class);
-        final long batteryCapacityMah = bmi.getBatteryFullCharge() / 1000;
-        pw.println("Reports:");
-        pw.increaseIndent();
-        pw.print("      Total Discharge");
-        final int statColsLength = 47;
-        pw.print(padStringWithSpaces("Profit (avg/action : avg/discharge)", statColsLength));
-        pw.print(padStringWithSpaces("Loss (avg/action : avg/discharge)", statColsLength));
-        pw.print(padStringWithSpaces("Rewards (avg/reward : avg/discharge)", statColsLength));
-        pw.print(padStringWithSpaces("+Regs (avg/reg : avg/discharge)", statColsLength));
-        pw.print(padStringWithSpaces("-Regs (avg/reg : avg/discharge)", statColsLength));
-        pw.print(padStringWithSpaces("Bg drain estimate", statColsLength));
-        pw.println();
-        for (int r = 0; r < NUM_PERIODS_TO_RETAIN; ++r) {
-            final int idx = (mPeriodIndex - r + NUM_PERIODS_TO_RETAIN) % NUM_PERIODS_TO_RETAIN;
-            final Report report = mReports[idx];
-            if (report == null) {
-                continue;
-            }
-            pw.print("t-");
-            pw.print(r);
-            pw.print(":  ");
-            pw.print(padStringWithSpaces(Integer.toString(report.cumulativeBatteryDischarge), 15));
-            if (report.numProfitableActions > 0) {
-                final String perDischarge = report.cumulativeBatteryDischarge > 0
-                        ? cakeToString(report.cumulativeProfit / report.cumulativeBatteryDischarge)
-                        : "N/A";
-                pw.print(padStringWithSpaces(String.format("%s (%s : %s)",
-                                cakeToString(report.cumulativeProfit),
-                                cakeToString(report.cumulativeProfit / report.numProfitableActions),
-                                perDischarge),
-                        statColsLength));
-            } else {
-                pw.print(padStringWithSpaces("N/A", statColsLength));
-            }
-            if (report.numUnprofitableActions > 0) {
-                final String perDischarge = report.cumulativeBatteryDischarge > 0
-                        ? cakeToString(report.cumulativeLoss / report.cumulativeBatteryDischarge)
-                        : "N/A";
-                pw.print(padStringWithSpaces(String.format("%s (%s : %s)",
-                                cakeToString(report.cumulativeLoss),
-                                cakeToString(report.cumulativeLoss / report.numUnprofitableActions),
-                                perDischarge),
-                        statColsLength));
-            } else {
-                pw.print(padStringWithSpaces("N/A", statColsLength));
-            }
-            if (report.numRewards > 0) {
-                final String perDischarge = report.cumulativeBatteryDischarge > 0
-                        ? cakeToString(report.cumulativeRewards / report.cumulativeBatteryDischarge)
-                        : "N/A";
-                pw.print(padStringWithSpaces(String.format("%s (%s : %s)",
-                                cakeToString(report.cumulativeRewards),
-                                cakeToString(report.cumulativeRewards / report.numRewards),
-                                perDischarge),
-                        statColsLength));
-            } else {
-                pw.print(padStringWithSpaces("N/A", statColsLength));
-            }
-            if (report.numPositiveRegulations > 0) {
-                final String perDischarge = report.cumulativeBatteryDischarge > 0
-                        ? cakeToString(
-                        report.cumulativePositiveRegulations / report.cumulativeBatteryDischarge)
-                        : "N/A";
-                pw.print(padStringWithSpaces(String.format("%s (%s : %s)",
-                                cakeToString(report.cumulativePositiveRegulations),
-                                cakeToString(report.cumulativePositiveRegulations
-                                        / report.numPositiveRegulations),
-                                perDischarge),
-                        statColsLength));
-            } else {
-                pw.print(padStringWithSpaces("N/A", statColsLength));
-            }
-            if (report.numNegativeRegulations > 0) {
-                final String perDischarge = report.cumulativeBatteryDischarge > 0
-                        ? cakeToString(
-                        report.cumulativeNegativeRegulations / report.cumulativeBatteryDischarge)
-                        : "N/A";
-                pw.print(padStringWithSpaces(String.format("%s (%s : %s)",
-                                cakeToString(report.cumulativeNegativeRegulations),
-                                cakeToString(report.cumulativeNegativeRegulations
-                                        / report.numNegativeRegulations),
-                                perDischarge),
-                        statColsLength));
-            } else {
-                pw.print(padStringWithSpaces("N/A", statColsLength));
-            }
-            if (report.screenOffDurationMs > 0) {
-                pw.print(padStringWithSpaces(String.format("%d mAh (%.2f%%/hr)",
-                                report.screenOffDischargeMah,
-                                100.0 * report.screenOffDischargeMah * HOUR_IN_MILLIS
-                                        / (batteryCapacityMah * report.screenOffDurationMs)),
-                        statColsLength));
-            } else {
-                pw.print(padStringWithSpaces("N/A", statColsLength));
-            }
-            pw.println();
-        }
-        pw.decreaseIndent();
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java
deleted file mode 100644
index 2b48d49..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java
+++ /dev/null
@@ -1,136 +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.server.tare;
-
-import android.annotation.NonNull;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.BatteryManager;
-import android.os.SystemClock;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Slog;
-
-/** Modifier that makes things free when the device is charging. */
-class ChargingModifier extends Modifier {
-    private static final String TAG = "TARE-" + ChargingModifier.class.getSimpleName();
-    private static final boolean DEBUG = InternalResourceService.DEBUG
-            || Log.isLoggable(TAG, Log.DEBUG);
-
-    private final InternalResourceService mIrs;
-    private final ChargingTracker mChargingTracker;
-
-    ChargingModifier(@NonNull InternalResourceService irs) {
-        super();
-        mIrs = irs;
-        mChargingTracker = new ChargingTracker();
-    }
-
-    @Override
-    public void setup() {
-        mChargingTracker.startTracking(mIrs.getContext());
-    }
-
-    @Override
-    public void tearDown() {
-        mChargingTracker.stopTracking(mIrs.getContext());
-    }
-
-    @Override
-    long getModifiedCostToProduce(long ctp) {
-        return modifyValue(ctp);
-    }
-
-    @Override
-    long getModifiedPrice(long price) {
-        return modifyValue(price);
-    }
-
-    private long modifyValue(long val) {
-        if (mChargingTracker.mCharging) {
-            return 0;
-        }
-        return val;
-    }
-
-    @Override
-    void dump(IndentingPrintWriter pw) {
-        pw.print("charging=");
-        pw.println(mChargingTracker.mCharging);
-    }
-
-    private final class ChargingTracker extends BroadcastReceiver {
-        private boolean mIsSetup = false;
-
-        /**
-         * Track whether we're "charging", where charging means that we're ready to commit to
-         * doing work.
-         */
-        private volatile boolean mCharging;
-
-        public void startTracking(@NonNull Context context) {
-            if (mIsSetup) {
-                return;
-            }
-
-            final IntentFilter filter = new IntentFilter();
-            filter.addAction(BatteryManager.ACTION_CHARGING);
-            filter.addAction(BatteryManager.ACTION_DISCHARGING);
-            context.registerReceiver(this, filter);
-
-            // Initialise tracker state.
-            final BatteryManager batteryManager = context.getSystemService(BatteryManager.class);
-            mCharging = batteryManager.isCharging();
-
-            mIsSetup = true;
-        }
-
-        public void stopTracking(@NonNull Context context) {
-            if (!mIsSetup) {
-                return;
-            }
-
-            context.unregisterReceiver(this);
-            mIsSetup = false;
-        }
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            final String action = intent.getAction();
-            if (BatteryManager.ACTION_CHARGING.equals(action)) {
-                if (DEBUG) {
-                    Slog.d(TAG, "Received charging intent, fired @ "
-                            + SystemClock.elapsedRealtime());
-                }
-                if (!mCharging) {
-                    mCharging = true;
-                    mIrs.onDeviceStateChanged();
-                }
-            } else if (BatteryManager.ACTION_DISCHARGING.equals(action)) {
-                if (DEBUG) {
-                    Slog.d(TAG, "Disconnected from power.");
-                }
-                if (mCharging) {
-                    mCharging = false;
-                    mIrs.onDeviceStateChanged();
-                }
-            }
-        }
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java
deleted file mode 100644
index 7a96076..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java
+++ /dev/null
@@ -1,276 +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.server.tare;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.tare.EconomyManager;
-import android.provider.DeviceConfig;
-import android.util.ArraySet;
-import android.util.IndentingPrintWriter;
-import android.util.Slog;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.ArrayUtils;
-
-import libcore.util.EmptyArray;
-
-/** Combines all enabled policies into one. */
-public class CompleteEconomicPolicy extends EconomicPolicy {
-    private static final String TAG = "TARE-" + CompleteEconomicPolicy.class.getSimpleName();
-
-    private final CompleteInjector mInjector;
-    private final ArraySet<EconomicPolicy> mEnabledEconomicPolicies = new ArraySet<>();
-    /** Lazily populated set of actions covered by this policy. */
-    private final SparseArray<Action> mActions = new SparseArray<>();
-    /** Lazily populated set of rewards covered by this policy. */
-    private final SparseArray<Reward> mRewards = new SparseArray<>();
-    private int mEnabledEconomicPolicyIds = 0;
-    private int[] mCostModifiers = EmptyArray.INT;
-    private long mInitialConsumptionLimit;
-    private long mMinConsumptionLimit;
-    private long mMaxConsumptionLimit;
-
-    CompleteEconomicPolicy(@NonNull InternalResourceService irs) {
-        this(irs, new CompleteInjector());
-    }
-
-    @VisibleForTesting
-    CompleteEconomicPolicy(@NonNull InternalResourceService irs,
-            @NonNull CompleteInjector injector) {
-        super(irs);
-        mInjector = injector;
-
-        if (mInjector.isPolicyEnabled(POLICY_ALARM, null)) {
-            mEnabledEconomicPolicyIds |= POLICY_ALARM;
-            mEnabledEconomicPolicies.add(new AlarmManagerEconomicPolicy(mIrs, mInjector));
-        }
-        if (mInjector.isPolicyEnabled(POLICY_JOB, null)) {
-            mEnabledEconomicPolicyIds |= POLICY_JOB;
-            mEnabledEconomicPolicies.add(new JobSchedulerEconomicPolicy(mIrs, mInjector));
-        }
-    }
-
-    @Override
-    void setup(@NonNull DeviceConfig.Properties properties) {
-        super.setup(properties);
-
-        mActions.clear();
-        mRewards.clear();
-
-        mEnabledEconomicPolicies.clear();
-        mEnabledEconomicPolicyIds = 0;
-        if (mInjector.isPolicyEnabled(POLICY_ALARM, properties)) {
-            mEnabledEconomicPolicyIds |= POLICY_ALARM;
-            mEnabledEconomicPolicies.add(new AlarmManagerEconomicPolicy(mIrs, mInjector));
-        }
-        if (mInjector.isPolicyEnabled(POLICY_JOB, properties)) {
-            mEnabledEconomicPolicyIds |= POLICY_JOB;
-            mEnabledEconomicPolicies.add(new JobSchedulerEconomicPolicy(mIrs, mInjector));
-        }
-
-        ArraySet<Integer> costModifiers = new ArraySet<>();
-        for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
-            final int[] sm = mEnabledEconomicPolicies.valueAt(i).getCostModifiers();
-            for (int s : sm) {
-                costModifiers.add(s);
-            }
-        }
-        mCostModifiers = ArrayUtils.convertToIntArray(costModifiers);
-
-        for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
-            mEnabledEconomicPolicies.valueAt(i).setup(properties);
-        }
-        updateLimits();
-    }
-
-    private void updateLimits() {
-        long initialConsumptionLimit = 0;
-        long minConsumptionLimit = 0;
-        long maxConsumptionLimit = 0;
-        for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
-            final EconomicPolicy economicPolicy = mEnabledEconomicPolicies.valueAt(i);
-            initialConsumptionLimit += economicPolicy.getInitialSatiatedConsumptionLimit();
-            minConsumptionLimit += economicPolicy.getMinSatiatedConsumptionLimit();
-            maxConsumptionLimit += economicPolicy.getMaxSatiatedConsumptionLimit();
-        }
-        mInitialConsumptionLimit = initialConsumptionLimit;
-        mMinConsumptionLimit = minConsumptionLimit;
-        mMaxConsumptionLimit = maxConsumptionLimit;
-    }
-
-    @Override
-    long getMinSatiatedBalance(final int userId, @NonNull final String pkgName) {
-        long min = 0;
-        for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
-            min += mEnabledEconomicPolicies.valueAt(i).getMinSatiatedBalance(userId, pkgName);
-        }
-        return min;
-    }
-
-    @Override
-    long getMaxSatiatedBalance(int userId, @NonNull String pkgName) {
-        long max = 0;
-        for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
-            max += mEnabledEconomicPolicies.valueAt(i).getMaxSatiatedBalance(userId, pkgName);
-        }
-        return max;
-    }
-
-    @Override
-    long getInitialSatiatedConsumptionLimit() {
-        return mInitialConsumptionLimit;
-    }
-
-    @Override
-    long getMinSatiatedConsumptionLimit() {
-        return mMinConsumptionLimit;
-    }
-
-    @Override
-    long getMaxSatiatedConsumptionLimit() {
-        return mMaxConsumptionLimit;
-    }
-
-    @NonNull
-    @Override
-    int[] getCostModifiers() {
-        return mCostModifiers == null ? EmptyArray.INT : mCostModifiers;
-    }
-
-    @Nullable
-    @Override
-    Action getAction(@AppAction int actionId) {
-        if (mActions.contains(actionId)) {
-            return mActions.get(actionId);
-        }
-
-        long ctp = 0, price = 0;
-        boolean exists = false;
-        for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
-            Action a = mEnabledEconomicPolicies.valueAt(i).getAction(actionId);
-            if (a != null) {
-                exists = true;
-                ctp += a.costToProduce;
-                price += a.basePrice;
-            }
-        }
-        final Action action = exists ? new Action(actionId, ctp, price) : null;
-        mActions.put(actionId, action);
-        return action;
-    }
-
-    @Nullable
-    @Override
-    Reward getReward(@UtilityReward int rewardId) {
-        if (mRewards.contains(rewardId)) {
-            return mRewards.get(rewardId);
-        }
-
-        long instantReward = 0, ongoingReward = 0, maxReward = 0;
-        boolean exists = false;
-        for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
-            Reward r = mEnabledEconomicPolicies.valueAt(i).getReward(rewardId);
-            if (r != null) {
-                exists = true;
-                instantReward += r.instantReward;
-                ongoingReward += r.ongoingRewardPerSecond;
-                maxReward += r.maxDailyReward;
-            }
-        }
-        final Reward reward = exists
-                ? new Reward(rewardId, instantReward, ongoingReward, maxReward) : null;
-        mRewards.put(rewardId, reward);
-        return reward;
-    }
-
-    boolean isPolicyEnabled(@Policy int policyId) {
-        return (mEnabledEconomicPolicyIds & policyId) == policyId;
-    }
-
-    int getEnabledPolicyIds() {
-        return mEnabledEconomicPolicyIds;
-    }
-
-    @VisibleForTesting
-    static class CompleteInjector extends Injector {
-
-        boolean isPolicyEnabled(int policy, @Nullable DeviceConfig.Properties properties) {
-            final String key;
-            final boolean defaultEnable;
-            switch (policy) {
-                case POLICY_ALARM:
-                    key = EconomyManager.KEY_ENABLE_POLICY_ALARM;
-                    defaultEnable = EconomyManager.DEFAULT_ENABLE_POLICY_ALARM;
-                    break;
-                case POLICY_JOB:
-                    key = EconomyManager.KEY_ENABLE_POLICY_JOB_SCHEDULER;
-                    defaultEnable = EconomyManager.DEFAULT_ENABLE_POLICY_JOB_SCHEDULER;
-                    break;
-                default:
-                    Slog.wtf(TAG, "Unknown policy: " + policy);
-                    return false;
-            }
-            if (properties == null) {
-                return defaultEnable;
-            }
-            return properties.getBoolean(key, defaultEnable);
-        }
-    }
-
-    @Override
-    void dump(IndentingPrintWriter pw) {
-        dumpActiveModifiers(pw);
-
-        pw.println();
-        pw.println(getClass().getSimpleName() + ":");
-        pw.increaseIndent();
-
-        pw.println("Cached actions:");
-        pw.increaseIndent();
-        for (int i = 0; i < mActions.size(); ++i) {
-            final Action action = mActions.valueAt(i);
-            if (action != null) {
-                dumpAction(pw, action);
-            }
-        }
-        pw.decreaseIndent();
-
-        pw.println();
-        pw.println("Cached rewards:");
-        pw.increaseIndent();
-        for (int i = 0; i < mRewards.size(); ++i) {
-            final Reward reward = mRewards.valueAt(i);
-            if (reward != null) {
-                dumpReward(pw, reward);
-            }
-        }
-        pw.decreaseIndent();
-
-        for (int i = 0; i < mEnabledEconomicPolicies.size(); i++) {
-            final EconomicPolicy economicPolicy = mEnabledEconomicPolicies.valueAt(i);
-            pw.println();
-            pw.print("(Includes) ");
-            pw.println(economicPolicy.getClass().getSimpleName() + ":");
-            pw.increaseIndent();
-            economicPolicy.dump(pw);
-            pw.decreaseIndent();
-        }
-        pw.decreaseIndent();
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java
deleted file mode 100644
index 47ff307..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java
+++ /dev/null
@@ -1,125 +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.server.tare;
-
-import android.annotation.NonNull;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.PowerManager;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-
-/** Modifier that makes things more expensive in light and deep doze. */
-class DeviceIdleModifier extends Modifier {
-    private static final String TAG = "TARE-" + DeviceIdleModifier.class.getSimpleName();
-    private static final boolean DEBUG = InternalResourceService.DEBUG
-            || Log.isLoggable(TAG, Log.DEBUG);
-
-    private final InternalResourceService mIrs;
-    private final PowerManager mPowerManager;
-    private final DeviceIdleTracker mDeviceIdleTracker;
-
-    DeviceIdleModifier(@NonNull InternalResourceService irs) {
-        super();
-        mIrs = irs;
-        mPowerManager = irs.getContext().getSystemService(PowerManager.class);
-        mDeviceIdleTracker = new DeviceIdleTracker();
-    }
-
-    @Override
-    public void setup() {
-        mDeviceIdleTracker.startTracking(mIrs.getContext());
-    }
-
-    @Override
-    public void tearDown() {
-        mDeviceIdleTracker.stopTracking(mIrs.getContext());
-    }
-
-    @Override
-    long getModifiedCostToProduce(long ctp) {
-        if (mDeviceIdleTracker.mDeviceIdle) {
-            return (long) (1.2 * ctp);
-        }
-        if (mDeviceIdleTracker.mDeviceLightIdle) {
-            return (long) (1.1 * ctp);
-        }
-        return ctp;
-    }
-
-    @Override
-    void dump(IndentingPrintWriter pw) {
-        pw.print("idle=");
-        pw.println(mDeviceIdleTracker.mDeviceIdle);
-        pw.print("lightIdle=");
-        pw.println(mDeviceIdleTracker.mDeviceLightIdle);
-    }
-
-    private final class DeviceIdleTracker extends BroadcastReceiver {
-        private boolean mIsSetup = false;
-
-        private volatile boolean mDeviceIdle;
-        private volatile boolean mDeviceLightIdle;
-
-        DeviceIdleTracker() {
-        }
-
-        void startTracking(@NonNull Context context) {
-            if (mIsSetup) {
-                return;
-            }
-
-            IntentFilter filter = new IntentFilter();
-            filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
-            filter.addAction(PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED);
-            context.registerReceiver(this, filter);
-
-            // Initialise tracker state.
-            mDeviceIdle = mPowerManager.isDeviceIdleMode();
-            mDeviceLightIdle = mPowerManager.isLightDeviceIdleMode();
-
-            mIsSetup = true;
-        }
-
-        void stopTracking(@NonNull Context context) {
-            if (!mIsSetup) {
-                return;
-            }
-
-            context.unregisterReceiver(this);
-            mIsSetup = false;
-        }
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            final String action = intent.getAction();
-            if (PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED.equals(action)) {
-                if (mDeviceIdle != mPowerManager.isDeviceIdleMode()) {
-                    mDeviceIdle = mPowerManager.isDeviceIdleMode();
-                    mIrs.onDeviceStateChanged();
-                }
-            } else if (PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED.equals(action)) {
-                if (mDeviceLightIdle != mPowerManager.isLightDeviceIdleMode()) {
-                    mDeviceLightIdle = mPowerManager.isLightDeviceIdleMode();
-                    mIrs.onDeviceStateChanged();
-                }
-            }
-        }
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java
deleted file mode 100644
index 61096b9..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java
+++ /dev/null
@@ -1,530 +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.server.tare;
-
-import static android.app.tare.EconomyManager.parseCreditValue;
-
-import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING;
-import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE;
-import static com.android.server.tare.Modifier.NUM_COST_MODIFIERS;
-import static com.android.server.tare.TareUtils.cakeToString;
-
-import android.annotation.CallSuper;
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ContentResolver;
-import android.provider.DeviceConfig;
-import android.provider.Settings;
-import android.util.IndentingPrintWriter;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.utils.UserSettingDeviceConfigMediator;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * An EconomicPolicy includes pricing information and daily ARC requirements and suggestions.
- * Policies are defined per participating system service. This allows each service’s EconomicPolicy
- * to be isolated while allowing the core economic system to scale across policies to achieve a
- * logical system-wide value system.
- */
-public abstract class EconomicPolicy {
-    private static final String TAG = "TARE-" + EconomicPolicy.class.getSimpleName();
-
-    private static final int SHIFT_TYPE = 30;
-    static final int MASK_TYPE = 0b11 << SHIFT_TYPE;
-    static final int TYPE_REGULATION = 0 << SHIFT_TYPE;
-    static final int TYPE_ACTION = 1 << SHIFT_TYPE;
-    static final int TYPE_REWARD = 2 << SHIFT_TYPE;
-
-    private static final int SHIFT_POLICY = 28;
-    static final int MASK_POLICY = 0b11 << SHIFT_POLICY;
-    static final int ALL_POLICIES = MASK_POLICY;
-    // Reserve 0 for the base/common policy.
-    public static final int POLICY_ALARM = 1 << SHIFT_POLICY;
-    public static final int POLICY_JOB = 2 << SHIFT_POLICY;
-
-    static final int MASK_EVENT = -1 ^ (MASK_TYPE | MASK_POLICY);
-
-    static final int REGULATION_BASIC_INCOME = TYPE_REGULATION | 0;
-    static final int REGULATION_BIRTHRIGHT = TYPE_REGULATION | 1;
-    static final int REGULATION_WEALTH_RECLAMATION = TYPE_REGULATION | 2;
-    static final int REGULATION_PROMOTION = TYPE_REGULATION | 3;
-    static final int REGULATION_DEMOTION = TYPE_REGULATION | 4;
-    /** App is fully restricted from running in the background. */
-    static final int REGULATION_BG_RESTRICTED = TYPE_REGULATION | 5;
-    static final int REGULATION_BG_UNRESTRICTED = TYPE_REGULATION | 6;
-    static final int REGULATION_FORCE_STOP = TYPE_REGULATION | 8;
-
-    static final int REWARD_NOTIFICATION_SEEN = TYPE_REWARD | 0;
-    static final int REWARD_NOTIFICATION_INTERACTION = TYPE_REWARD | 1;
-    static final int REWARD_TOP_ACTIVITY = TYPE_REWARD | 2;
-    static final int REWARD_WIDGET_INTERACTION = TYPE_REWARD | 3;
-    static final int REWARD_OTHER_USER_INTERACTION = TYPE_REWARD | 4;
-
-    @IntDef({
-            AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE,
-            AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT,
-            AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE,
-            AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT,
-            AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE,
-            AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT,
-            AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE,
-            AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT,
-            AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK,
-            JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START,
-            JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING,
-            JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START,
-            JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING,
-            JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START,
-            JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING,
-            JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START,
-            JobSchedulerEconomicPolicy.ACTION_JOB_LOW_RUNNING,
-            JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START,
-            JobSchedulerEconomicPolicy.ACTION_JOB_MIN_RUNNING,
-            JobSchedulerEconomicPolicy.ACTION_JOB_TIMEOUT,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface AppAction {
-    }
-
-    @IntDef({
-            TYPE_ACTION,
-            TYPE_REGULATION,
-            TYPE_REWARD,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface EventType {
-    }
-
-    @IntDef({
-            ALL_POLICIES,
-            POLICY_ALARM,
-            POLICY_JOB,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface Policy {
-    }
-
-    @IntDef({
-            REWARD_TOP_ACTIVITY,
-            REWARD_NOTIFICATION_SEEN,
-            REWARD_NOTIFICATION_INTERACTION,
-            REWARD_WIDGET_INTERACTION,
-            REWARD_OTHER_USER_INTERACTION,
-            JobSchedulerEconomicPolicy.REWARD_APP_INSTALL,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface UtilityReward {
-    }
-
-    static class Action {
-        /** Unique id (including across policies) for this action. */
-        public final int id;
-        /**
-         * How many ARCs the system says it takes to perform this action.
-         */
-        public final long costToProduce;
-        /**
-         * The base price to perform this action. If this is
-         * less than the {@link #costToProduce}, then the system should not perform
-         * the action unless a modifier lowers the cost to produce.
-         */
-        public final long basePrice;
-        /**
-         * Whether the remaining stock limit affects an app's ability to perform this action.
-         * If {@code false}, then the action can be performed, even if the cost is higher
-         * than the remaining stock. This does not affect checking against an app's balance.
-         */
-        public final boolean respectsStockLimit;
-
-        Action(int id, long costToProduce, long basePrice) {
-            this(id, costToProduce, basePrice, true);
-        }
-
-        Action(int id, long costToProduce, long basePrice, boolean respectsStockLimit) {
-            this.id = id;
-            this.costToProduce = costToProduce;
-            this.basePrice = basePrice;
-            this.respectsStockLimit = respectsStockLimit;
-        }
-    }
-
-    static class Reward {
-        /** Unique id (including across policies) for this reward. */
-        @UtilityReward
-        public final int id;
-        public final long instantReward;
-        /** Reward credited per second of ongoing activity. */
-        public final long ongoingRewardPerSecond;
-        /** The maximum amount an app can earn from this reward within a 24 hour period. */
-        public final long maxDailyReward;
-
-        Reward(int id, long instantReward, long ongoingReward, long maxDailyReward) {
-            this.id = id;
-            this.instantReward = instantReward;
-            this.ongoingRewardPerSecond = ongoingReward;
-            this.maxDailyReward = maxDailyReward;
-        }
-    }
-
-    static class Cost {
-        public final long costToProduce;
-        public final long price;
-
-        Cost(long costToProduce, long price) {
-            this.costToProduce = costToProduce;
-            this.price = price;
-        }
-    }
-
-    protected final InternalResourceService mIrs;
-    protected final UserSettingDeviceConfigMediator mUserSettingDeviceConfigMediator;
-    private static final Modifier[] COST_MODIFIER_BY_INDEX = new Modifier[NUM_COST_MODIFIERS];
-
-    EconomicPolicy(@NonNull InternalResourceService irs) {
-        mIrs = irs;
-        // Don't cross the streams! Mixing Settings/local user config changes with DeviceConfig
-        // config can cause issues since the scales may be different, so use one or the other.
-        // If user settings exist, then just stick with the Settings constants, even if there
-        // are invalid values.
-        mUserSettingDeviceConfigMediator =
-                new UserSettingDeviceConfigMediator.SettingsOverridesAllMediator(',');
-        for (int mId : getCostModifiers()) {
-            initModifier(mId, irs);
-        }
-    }
-
-    @CallSuper
-    void setup(@NonNull DeviceConfig.Properties properties) {
-        for (int i = 0; i < NUM_COST_MODIFIERS; ++i) {
-            final Modifier modifier = COST_MODIFIER_BY_INDEX[i];
-            if (modifier != null) {
-                modifier.setup();
-            }
-        }
-    }
-
-    @CallSuper
-    void tearDown() {
-        for (int i = 0; i < NUM_COST_MODIFIERS; ++i) {
-            final Modifier modifier = COST_MODIFIER_BY_INDEX[i];
-            if (modifier != null) {
-                modifier.tearDown();
-            }
-        }
-    }
-
-    /**
-     * Returns the minimum suggested balance an app should have when the device is at 100% battery.
-     * This takes into account any exemptions the app may have.
-     */
-    abstract long getMinSatiatedBalance(int userId, @NonNull String pkgName);
-
-    /**
-     * Returns the maximum balance an app should have when the device is at 100% battery. This
-     * exists to ensure that no single app accumulate all available resources and increases fairness
-     * for all apps.
-     */
-    abstract long getMaxSatiatedBalance(int userId, @NonNull String pkgName);
-
-    /**
-     * Returns the maximum number of cakes that should be consumed during a full 100% discharge
-     * cycle. This is the initial limit. The system may choose to increase the limit over time,
-     * but the increased limit should never exceed the value returned from
-     * {@link #getMaxSatiatedConsumptionLimit()}.
-     */
-    abstract long getInitialSatiatedConsumptionLimit();
-
-    /**
-     * Returns the minimum number of cakes that should be available for consumption during a full
-     * 100% discharge cycle.
-     */
-    abstract long getMinSatiatedConsumptionLimit();
-
-    /**
-     * Returns the maximum number of cakes that should be available for consumption during a full
-     * 100% discharge cycle.
-     */
-    abstract long getMaxSatiatedConsumptionLimit();
-
-    /** Return the set of modifiers that should apply to this policy's costs. */
-    @NonNull
-    abstract int[] getCostModifiers();
-
-    @Nullable
-    abstract Action getAction(@AppAction int actionId);
-
-    @Nullable
-    abstract Reward getReward(@UtilityReward int rewardId);
-
-    void dump(IndentingPrintWriter pw) {
-    }
-
-    @NonNull
-    final Cost getCostOfAction(int actionId, int userId, @NonNull String pkgName) {
-        final Action action = getAction(actionId);
-        if (action == null || mIrs.isVip(userId, pkgName)) {
-            return new Cost(0, 0);
-        }
-        long ctp = action.costToProduce;
-        long price = action.basePrice;
-        final int[] costModifiers = getCostModifiers();
-        boolean useProcessStatePriceDeterminant = false;
-        for (int costModifier : costModifiers) {
-            if (costModifier == COST_MODIFIER_PROCESS_STATE) {
-                useProcessStatePriceDeterminant = true;
-            } else {
-                final Modifier modifier = getModifier(costModifier);
-                ctp = modifier.getModifiedCostToProduce(ctp);
-                price = modifier.getModifiedPrice(price);
-            }
-        }
-        // ProcessStateModifier needs to be done last.
-        if (useProcessStatePriceDeterminant) {
-            ProcessStateModifier processStateModifier =
-                    (ProcessStateModifier) getModifier(COST_MODIFIER_PROCESS_STATE);
-            price = processStateModifier.getModifiedPrice(userId, pkgName, ctp, price);
-        }
-        return new Cost(ctp, price);
-    }
-
-    private static void initModifier(@Modifier.CostModifier final int modifierId,
-            @NonNull InternalResourceService irs) {
-        if (modifierId < 0 || modifierId >= COST_MODIFIER_BY_INDEX.length) {
-            throw new IllegalArgumentException("Invalid modifier id " + modifierId);
-        }
-        Modifier modifier = COST_MODIFIER_BY_INDEX[modifierId];
-        if (modifier == null) {
-            switch (modifierId) {
-                case COST_MODIFIER_CHARGING:
-                    modifier = new ChargingModifier(irs);
-                    break;
-                case COST_MODIFIER_DEVICE_IDLE:
-                    modifier = new DeviceIdleModifier(irs);
-                    break;
-                case COST_MODIFIER_POWER_SAVE_MODE:
-                    modifier = new PowerSaveModeModifier(irs);
-                    break;
-                case COST_MODIFIER_PROCESS_STATE:
-                    modifier = new ProcessStateModifier(irs);
-                    break;
-                default:
-                    throw new IllegalArgumentException("Invalid modifier id " + modifierId);
-            }
-            COST_MODIFIER_BY_INDEX[modifierId] = modifier;
-        }
-    }
-
-    @NonNull
-    private static Modifier getModifier(@Modifier.CostModifier final int modifierId) {
-        if (modifierId < 0 || modifierId >= COST_MODIFIER_BY_INDEX.length) {
-            throw new IllegalArgumentException("Invalid modifier id " + modifierId);
-        }
-        final Modifier modifier = COST_MODIFIER_BY_INDEX[modifierId];
-        if (modifier == null) {
-            throw new IllegalStateException(
-                    "Modifier #" + modifierId + " was never initialized");
-        }
-        return modifier;
-    }
-
-    @EventType
-    static int getEventType(int eventId) {
-        return eventId & MASK_TYPE;
-    }
-
-    static boolean isReward(int eventId) {
-        return getEventType(eventId) == TYPE_REWARD;
-    }
-
-    @NonNull
-    static String eventToString(int eventId) {
-        switch (eventId & MASK_TYPE) {
-            case TYPE_ACTION:
-                return actionToString(eventId);
-
-            case TYPE_REGULATION:
-                return regulationToString(eventId);
-
-            case TYPE_REWARD:
-                return rewardToString(eventId);
-
-            default:
-                return "UNKNOWN_EVENT:" + Integer.toHexString(eventId);
-        }
-    }
-
-    @NonNull
-    static String actionToString(int eventId) {
-        switch (eventId & MASK_POLICY) {
-            case POLICY_ALARM:
-                switch (eventId) {
-                    case AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE:
-                        return "ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE";
-                    case AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT:
-                        return "ALARM_WAKEUP_EXACT";
-                    case AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE:
-                        return "ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE";
-                    case AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT:
-                        return "ALARM_WAKEUP_INEXACT";
-                    case AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE:
-                        return "ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE";
-                    case AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT:
-                        return "ALARM_NONWAKEUP_EXACT";
-                    case AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE:
-                        return "ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE";
-                    case AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT:
-                        return "ALARM_NONWAKEUP_INEXACT";
-                    case AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK:
-                        return "ALARM_CLOCK";
-                }
-                break;
-
-            case POLICY_JOB:
-                switch (eventId) {
-                    case JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START:
-                        return "JOB_MAX_START";
-                    case JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING:
-                        return "JOB_MAX_RUNNING";
-                    case JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START:
-                        return "JOB_HIGH_START";
-                    case JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING:
-                        return "JOB_HIGH_RUNNING";
-                    case JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START:
-                        return "JOB_DEFAULT_START";
-                    case JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING:
-                        return "JOB_DEFAULT_RUNNING";
-                    case JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START:
-                        return "JOB_LOW_START";
-                    case JobSchedulerEconomicPolicy.ACTION_JOB_LOW_RUNNING:
-                        return "JOB_LOW_RUNNING";
-                    case JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START:
-                        return "JOB_MIN_START";
-                    case JobSchedulerEconomicPolicy.ACTION_JOB_MIN_RUNNING:
-                        return "JOB_MIN_RUNNING";
-                    case JobSchedulerEconomicPolicy.ACTION_JOB_TIMEOUT:
-                        return "JOB_TIMEOUT";
-                }
-                break;
-        }
-        return "UNKNOWN_ACTION:" + Integer.toHexString(eventId);
-    }
-
-    @NonNull
-    static String regulationToString(int eventId) {
-        switch (eventId) {
-            case REGULATION_BASIC_INCOME:
-                return "BASIC_INCOME";
-            case REGULATION_BIRTHRIGHT:
-                return "BIRTHRIGHT";
-            case REGULATION_WEALTH_RECLAMATION:
-                return "WEALTH_RECLAMATION";
-            case REGULATION_PROMOTION:
-                return "PROMOTION";
-            case REGULATION_DEMOTION:
-                return "DEMOTION";
-            case REGULATION_BG_RESTRICTED:
-                return "BG_RESTRICTED";
-            case REGULATION_BG_UNRESTRICTED:
-                return "BG_UNRESTRICTED";
-            case REGULATION_FORCE_STOP:
-                return "FORCE_STOP";
-        }
-        return "UNKNOWN_REGULATION:" + Integer.toHexString(eventId);
-    }
-
-    @NonNull
-    static String rewardToString(int eventId) {
-        switch (eventId) {
-            case REWARD_TOP_ACTIVITY:
-                return "REWARD_TOP_ACTIVITY";
-            case REWARD_NOTIFICATION_SEEN:
-                return "REWARD_NOTIFICATION_SEEN";
-            case REWARD_NOTIFICATION_INTERACTION:
-                return "REWARD_NOTIFICATION_INTERACTION";
-            case REWARD_WIDGET_INTERACTION:
-                return "REWARD_WIDGET_INTERACTION";
-            case REWARD_OTHER_USER_INTERACTION:
-                return "REWARD_OTHER_USER_INTERACTION";
-            case JobSchedulerEconomicPolicy.REWARD_APP_INSTALL:
-                return "REWARD_JOB_APP_INSTALL";
-        }
-        return "UNKNOWN_REWARD:" + Integer.toHexString(eventId);
-    }
-
-    protected long getConstantAsCake(String key, long defaultValCake) {
-        return getConstantAsCake(key, defaultValCake, 0);
-    }
-
-    protected long getConstantAsCake(String key, long defaultValCake, long minValCake) {
-        return Math.max(minValCake,
-                parseCreditValue(
-                        mUserSettingDeviceConfigMediator.getString(key, null), defaultValCake));
-    }
-
-    @VisibleForTesting
-    static class Injector {
-        @Nullable
-        String getSettingsGlobalString(@NonNull ContentResolver resolver, @NonNull String name) {
-            return Settings.Global.getString(resolver, name);
-        }
-    }
-
-    protected static void dumpActiveModifiers(IndentingPrintWriter pw) {
-        for (int i = 0; i < NUM_COST_MODIFIERS; ++i) {
-            pw.print("Modifier ");
-            pw.println(i);
-            pw.increaseIndent();
-
-            Modifier modifier = COST_MODIFIER_BY_INDEX[i];
-            if (modifier != null) {
-                modifier.dump(pw);
-            } else {
-                pw.println("NOT ACTIVE");
-            }
-
-            pw.decreaseIndent();
-        }
-    }
-
-    protected static void dumpAction(IndentingPrintWriter pw, @NonNull Action action) {
-        pw.print(actionToString(action.id));
-        pw.print(": ");
-        pw.print("ctp=");
-        pw.print(cakeToString(action.costToProduce));
-        pw.print(", basePrice=");
-        pw.print(cakeToString(action.basePrice));
-        pw.println();
-    }
-
-    protected static void dumpReward(IndentingPrintWriter pw, @NonNull Reward reward) {
-        pw.print(rewardToString(reward.id));
-        pw.print(": ");
-        pw.print("instant=");
-        pw.print(cakeToString(reward.instantReward));
-        pw.print(", ongoing/sec=");
-        pw.print(cakeToString(reward.ongoingRewardPerSecond));
-        pw.print(", maxDaily=");
-        pw.print(cakeToString(reward.maxDailyReward));
-        pw.println();
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/EconomyManagerInternal.java b/apex/jobscheduler/service/java/com/android/server/tare/EconomyManagerInternal.java
deleted file mode 100644
index 5b305ad..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/EconomyManagerInternal.java
+++ /dev/null
@@ -1,204 +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.server.tare;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.tare.EconomyManager;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Interface for the system server to deal with the resource economy subsystem.
- *
- * @hide
- */
-public interface EconomyManagerInternal {
-    /**
-     * Used to indicate a future action an app is expected to take.
-     */
-    final class AnticipatedAction {
-        public final int actionId;
-        public final int numInstantaneousCalls;
-        public final long ongoingDurationMs;
-        private final int mHashCode;
-
-        /**
-         * @param actionId              The expected action
-         * @param numInstantaneousCalls How many instantaneous times the action will be performed
-         * @param ongoingDurationMs     An estimate of how long the ongoing event will go on for
-         */
-        public AnticipatedAction(@EconomicPolicy.AppAction int actionId,
-                int numInstantaneousCalls, long ongoingDurationMs) {
-            this.actionId = actionId;
-            this.numInstantaneousCalls = numInstantaneousCalls;
-            this.ongoingDurationMs = ongoingDurationMs;
-
-            int hash = 0;
-            hash = 31 * hash + actionId;
-            hash = 31 * hash + numInstantaneousCalls;
-            hash = 31 * hash + (int) (ongoingDurationMs ^ (ongoingDurationMs >>> 32));
-            mHashCode = hash;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-            AnticipatedAction that = (AnticipatedAction) o;
-            return actionId == that.actionId
-                    && numInstantaneousCalls == that.numInstantaneousCalls
-                    && ongoingDurationMs == that.ongoingDurationMs;
-        }
-
-        @Override
-        public int hashCode() {
-            return mHashCode;
-        }
-    }
-
-    /**
-     * A collection of {@link AnticipatedAction AnticipatedActions} that will be performed together.
-     */
-    final class ActionBill {
-        private static final Comparator<AnticipatedAction>
-                sAnticipatedActionComparator = Comparator.comparingInt(aa -> aa.actionId);
-
-        private final List<AnticipatedAction> mAnticipatedActions;
-        private final int mHashCode;
-
-        public ActionBill(@NonNull List<AnticipatedAction> anticipatedActions) {
-            List<AnticipatedAction> actions = new ArrayList<>(anticipatedActions);
-            actions.sort(sAnticipatedActionComparator);
-            mAnticipatedActions = Collections.unmodifiableList(actions);
-
-            int hash = 0;
-            for (int i = 0; i < mAnticipatedActions.size(); ++i) {
-                hash = 31 * hash + mAnticipatedActions.get(i).hashCode();
-            }
-            mHashCode = hash;
-        }
-
-        List<AnticipatedAction> getAnticipatedActions() {
-            return mAnticipatedActions;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-            ActionBill that = (ActionBill) o;
-            return mAnticipatedActions.equals(that.mAnticipatedActions);
-        }
-
-        @Override
-        public int hashCode() {
-            return mHashCode;
-        }
-    }
-
-    /** Listener for when an app's ability to afford a bill changes. */
-    interface AffordabilityChangeListener {
-        void onAffordabilityChanged(int userId, @NonNull String pkgName, @NonNull ActionBill bill,
-                boolean canAfford);
-    }
-
-    /** Listener for various TARE state changes. */
-    interface TareStateChangeListener {
-        void onTareEnabledModeChanged(@EconomyManager.EnabledMode int tareEnabledMode);
-    }
-
-    /**
-     * Return {@code true} if the app is able to pay for the anticipated actions.
-     */
-    boolean canPayFor(int userId, @NonNull String pkgName, @NonNull ActionBill bill);
-
-    /**
-     * Returns the maximum duration (in milliseconds) that the specified app can afford the bill,
-     * based on current prices.
-     */
-    long getMaxDurationMs(int userId, @NonNull String pkgName, @NonNull ActionBill bill);
-
-    /** Returns the current TARE enabled mode. */
-    @EconomyManager.EnabledMode
-    int getEnabledMode();
-
-    /** Returns the current TARE enabled mode for the specified policy. */
-    @EconomyManager.EnabledMode
-    int getEnabledMode(@EconomicPolicy.Policy int policyId);
-
-    /**
-     * Register an {@link AffordabilityChangeListener} to track when an app's ability to afford the
-     * indicated bill changes.
-     */
-    void registerAffordabilityChangeListener(int userId, @NonNull String pkgName,
-            @NonNull AffordabilityChangeListener listener, @NonNull ActionBill bill);
-
-    /**
-     * Unregister a {@link AffordabilityChangeListener} from being notified of any changes to an
-     * app's ability to afford the specified bill.
-     */
-    void unregisterAffordabilityChangeListener(int userId, @NonNull String pkgName,
-            @NonNull AffordabilityChangeListener listener, @NonNull ActionBill bill);
-
-    /**
-     * Register a {@link TareStateChangeListener} to track when TARE's state changes.
-     */
-    void registerTareStateChangeListener(@NonNull TareStateChangeListener listener,
-            @EconomicPolicy.Policy int policyId);
-
-    /**
-     * Unregister a {@link TareStateChangeListener} from being notified when TARE's state changes.
-     */
-    void unregisterTareStateChangeListener(@NonNull TareStateChangeListener listener);
-
-    /**
-     * Note that an instantaneous event has occurred. The event must be specified in one of the
-     * EconomicPolicies.
-     *
-     * @param tag An optional tag that can be used to differentiate the same event for the same app.
-     */
-    void noteInstantaneousEvent(int userId, @NonNull String pkgName, int eventId,
-            @Nullable String tag);
-
-    /**
-     * Note that a long-running event is starting. The event must be specified in one of the
-     * EconomicPolicies. You must always call
-     * {@link #noteOngoingEventStopped(int, String, int, String)} to end the event. Ongoing
-     * events will be separated and grouped by event-tag combinations. There must be an equal
-     * number of start() and stop() calls for the same event-tag combination in order for the
-     * tracking to finally stop (ie. ongoing events are ref-counted).
-     *
-     * @param tag An optional tag that can be used to differentiate the same event for the same app.
-     */
-    void noteOngoingEventStarted(int userId, @NonNull String pkgName, int eventId,
-            @Nullable String tag);
-
-    /**
-     * Note that a long-running event has stopped. The event must be specified in one of the
-     * EconomicPolicies. Ongoing events are separated and grouped by event-tag combinations.
-     * There must be an equal number of start() and stop() calls for the same event-tag combination
-     * in order for the tracking to finally stop (ie. ongoing events are ref-counted).
-     *
-     * @param tag An optional tag that can be used to differentiate the same event for the same app.
-     */
-    void noteOngoingEventStopped(int userId, @NonNull String pkgName, int eventId,
-            @Nullable String tag);
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java b/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java
deleted file mode 100644
index 49c6d1b..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java
+++ /dev/null
@@ -1,106 +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.server.tare;
-
-import android.Manifest;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.UserIdInt;
-import android.app.AppGlobals;
-import android.content.Context;
-import android.content.Intent;
-import android.content.PermissionChecker;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.InstallSourceInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.os.RemoteException;
-
-import com.android.internal.util.ArrayUtils;
-
-/** POJO to cache only the information about installed packages that TARE cares about. */
-class InstalledPackageInfo {
-    static final int NO_UID = -1;
-
-    /**
-     * Flags to use when querying for front door activities. Disabled components are included
-     * are included for completeness since the app can enable them at any time.
-     */
-    private static final int HEADLESS_APP_QUERY_FLAGS = PackageManager.MATCH_DIRECT_BOOT_AWARE
-            | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
-            | PackageManager.MATCH_DISABLED_COMPONENTS;
-
-    public final int uid;
-    public final String packageName;
-    public final boolean hasCode;
-    /**
-     * Whether the app is a system app that is "headless." Headless in this context means that
-     * the app doesn't have any "front door" activities --- activities that would show in the
-     * launcher.
-     */
-    public final boolean isHeadlessSystemApp;
-    public final boolean isSystemInstaller;
-    @Nullable
-    public final String installerPackageName;
-
-    InstalledPackageInfo(@NonNull Context context, @UserIdInt int userId,
-            @NonNull PackageInfo packageInfo) {
-        final ApplicationInfo applicationInfo = packageInfo.applicationInfo;
-        uid = applicationInfo == null ? NO_UID : applicationInfo.uid;
-        packageName = packageInfo.packageName;
-        hasCode = applicationInfo != null && applicationInfo.hasCode();
-
-        final PackageManager packageManager = context.getPackageManager();
-        final Intent frontDoorActivityIntent = new Intent(Intent.ACTION_MAIN)
-                .addCategory(Intent.CATEGORY_LAUNCHER)
-                .setPackage(packageName);
-        isHeadlessSystemApp = applicationInfo != null
-                && (applicationInfo.isSystemApp() || applicationInfo.isUpdatedSystemApp())
-                && ArrayUtils.isEmpty(
-                        packageManager.queryIntentActivitiesAsUser(
-                                frontDoorActivityIntent, HEADLESS_APP_QUERY_FLAGS, userId));
-
-        isSystemInstaller = applicationInfo != null
-                && ArrayUtils.indexOf(
-                packageInfo.requestedPermissions, Manifest.permission.INSTALL_PACKAGES) >= 0
-                && PackageManager.PERMISSION_GRANTED
-                == PermissionChecker.checkPermissionForPreflight(context,
-                Manifest.permission.INSTALL_PACKAGES, PermissionChecker.PID_UNKNOWN,
-                applicationInfo.uid, packageName);
-        InstallSourceInfo installSourceInfo = null;
-        try {
-            installSourceInfo = AppGlobals.getPackageManager().getInstallSourceInfo(packageName,
-                    userId);
-        } catch (RemoteException e) {
-            // Shouldn't happen.
-        }
-        installerPackageName =
-                installSourceInfo == null ? null : installSourceInfo.getInstallingPackageName();
-    }
-
-    @Override
-    public String toString() {
-        return "IPO{"
-                + "uid=" + uid
-                + ", pkgName=" + packageName
-                + (hasCode ? " HAS_CODE" : "")
-                + (isHeadlessSystemApp ? " HEADLESS_SYSTEM" : "")
-                + (isSystemInstaller ? " SYSTEM_INSTALLER" : "")
-                + ", installer=" + installerPackageName
-                + '}';
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java
deleted file mode 100644
index 6635484..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java
+++ /dev/null
@@ -1,1900 +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.server.tare;
-
-import static android.app.tare.EconomyManager.ENABLED_MODE_OFF;
-import static android.app.tare.EconomyManager.ENABLED_MODE_ON;
-import static android.app.tare.EconomyManager.ENABLED_MODE_SHADOW;
-import static android.app.tare.EconomyManager.enabledModeToString;
-import static android.provider.Settings.Global.TARE_ALARM_MANAGER_CONSTANTS;
-import static android.provider.Settings.Global.TARE_JOB_SCHEDULER_CONSTANTS;
-import static android.text.format.DateUtils.DAY_IN_MILLIS;
-import static android.text.format.DateUtils.HOUR_IN_MILLIS;
-import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
-
-import static com.android.server.tare.TareUtils.appToString;
-import static com.android.server.tare.TareUtils.cakeToString;
-import static com.android.server.tare.TareUtils.getCurrentTimeMillis;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.AlarmManager;
-import android.app.AppOpsManager;
-import android.app.tare.EconomyManager;
-import android.app.tare.IEconomyManager;
-import android.app.usage.UsageEvents;
-import android.app.usage.UsageStatsManagerInternal;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.BatteryManager;
-import android.os.BatteryManagerInternal;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.IDeviceIdleController;
-import android.os.Looper;
-import android.os.Message;
-import android.os.ParcelFileDescriptor;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.provider.DeviceConfig;
-import android.provider.Settings;
-import android.util.ArraySet;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArrayMap;
-import android.util.SparseLongArray;
-import android.util.SparseSetArray;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.app.IAppOpsCallback;
-import com.android.internal.app.IAppOpsService;
-import com.android.internal.os.SomeArgs;
-import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.DumpUtils;
-import com.android.server.LocalServices;
-import com.android.server.SystemService;
-import com.android.server.pm.UserManagerInternal;
-import com.android.server.tare.EconomicPolicy.Cost;
-import com.android.server.tare.EconomyManagerInternal.TareStateChangeListener;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Responsible for handling app's ARC count based on events, ensuring ARCs are credited when
- * appropriate, and reclaiming ARCs at the right times. The IRS deals with the high level details
- * while the {@link Agent} deals with the nitty-gritty details.
- *
- * Note on locking: Any function with the suffix 'Locked' needs to lock on {@link #mLock}.
- *
- * @hide
- */
-public class InternalResourceService extends SystemService {
-    public static final String TAG = "TARE-IRS";
-    public static final boolean DEBUG = Log.isLoggable("TARE", Log.DEBUG);
-
-    static final long UNUSED_RECLAMATION_PERIOD_MS = 24 * HOUR_IN_MILLIS;
-    /** How much of an app's unused wealth should be reclaimed periodically. */
-    private static final float DEFAULT_UNUSED_RECLAMATION_PERCENTAGE = .1f;
-    /**
-     * The minimum amount of time an app must not have been used by the user before we start
-     * periodically reclaiming ARCs from it.
-     */
-    private static final long MIN_UNUSED_TIME_MS = 3 * DAY_IN_MILLIS;
-    /** The amount of time to delay reclamation by after boot. */
-    private static final long RECLAMATION_STARTUP_DELAY_MS = 30_000L;
-    /**
-     * The amount of time after TARE has first been set up that a system installer will be allowed
-     * expanded credit privileges.
-     */
-    static final long INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS = 7 * DAY_IN_MILLIS;
-    /**
-     * The amount of time to wait after TARE has first been set up before considering adjusting the
-     * stock/consumption limit.
-     */
-    private static final long STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS = 5 * DAY_IN_MILLIS;
-    /**
-     * The battery level above which we may consider quantitative easing (increasing the consumption
-     * limit).
-     */
-    private static final int QUANTITATIVE_EASING_BATTERY_THRESHOLD = 50;
-    /**
-     * The battery level above which we may consider adjusting the desired stock level.
-     */
-    private static final int STOCK_RECALCULATION_BATTERY_THRESHOLD = 80;
-    /**
-     * The amount of time to wait before considering recalculating the desired stock level.
-     */
-    private static final long STOCK_RECALCULATION_DELAY_MS = 16 * HOUR_IN_MILLIS;
-    /**
-     * The minimum amount of time we must have background drain for before considering
-     * recalculating the desired stock level.
-     */
-    private static final long STOCK_RECALCULATION_MIN_DATA_DURATION_MS = 8 * HOUR_IN_MILLIS;
-    private static final int PACKAGE_QUERY_FLAGS =
-            PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
-                    | PackageManager.MATCH_APEX | PackageManager.GET_PERMISSIONS;
-
-    /** Global lock for all resource economy state. */
-    private final Object mLock = new Object();
-
-    private final Handler mHandler;
-    private final BatteryManagerInternal mBatteryManagerInternal;
-    private final PackageManager mPackageManager;
-    private final PackageManagerInternal mPackageManagerInternal;
-    private final UserManagerInternal mUserManagerInternal;
-
-    private IAppOpsService mAppOpsService;
-    private IDeviceIdleController mDeviceIdleController;
-
-    private final Agent mAgent;
-    private final Analyst mAnalyst;
-    private final ConfigObserver mConfigObserver;
-    private final EconomyManagerStub mEconomyManagerStub;
-    private final Scribe mScribe;
-
-    @GuardedBy("mLock")
-    private CompleteEconomicPolicy mCompleteEconomicPolicy;
-
-    @NonNull
-    @GuardedBy("mLock")
-    private final SparseArrayMap<String, InstalledPackageInfo> mPkgCache = new SparseArrayMap<>();
-
-    /** Cached mapping of UIDs (for all users) to a list of packages in the UID. */
-    @GuardedBy("mLock")
-    private final SparseSetArray<String> mUidToPackageCache = new SparseSetArray<>();
-
-    /** Cached mapping of userId+package to their UIDs (for all users) */
-    @GuardedBy("mPackageToUidCache")
-    private final SparseArrayMap<String, Integer> mPackageToUidCache = new SparseArrayMap<>();
-
-    @GuardedBy("mStateChangeListeners")
-    private final SparseSetArray<TareStateChangeListener> mStateChangeListeners =
-            new SparseSetArray<>();
-
-    /**
-     * List of packages that are fully restricted and shouldn't be allowed to run in the background.
-     */
-    @GuardedBy("mLock")
-    private final SparseSetArray<String> mRestrictedApps = new SparseSetArray<>();
-
-    /** List of packages that are "exempted" from battery restrictions. */
-    // TODO(144864180): include userID
-    @GuardedBy("mLock")
-    private ArraySet<String> mExemptedApps = new ArraySet<>();
-
-    @GuardedBy("mLock")
-    private final SparseArrayMap<String, Boolean> mVipOverrides = new SparseArrayMap<>();
-
-    /**
-     * Set of temporary Very Important Packages and when their VIP status ends, in the elapsed
-     * realtime ({@link android.annotation.ElapsedRealtimeLong}) timebase.
-     */
-    @GuardedBy("mLock")
-    private final SparseArrayMap<String, Long> mTemporaryVips = new SparseArrayMap<>();
-
-    /** Set of apps each installer is responsible for installing. */
-    @GuardedBy("mLock")
-    private final SparseArrayMap<String, ArraySet<String>> mInstallers = new SparseArrayMap<>();
-
-    /** The package name of the wellbeing app. */
-    @GuardedBy("mLock")
-    @Nullable
-    private String mWellbeingPackage;
-
-    private volatile boolean mHasBattery = true;
-    @EconomyManager.EnabledMode
-    private volatile int mEnabledMode;
-    private volatile int mBootPhase;
-    private volatile boolean mExemptListLoaded;
-    // In the range [0,100] to represent 0% to 100% battery.
-    @GuardedBy("mLock")
-    private int mCurrentBatteryLevel;
-
-    // TODO(250007395): make configurable per device (via config.xml)
-    private final int mDefaultTargetBackgroundBatteryLifeHours;
-    @GuardedBy("mLock")
-    private int mTargetBackgroundBatteryLifeHours;
-
-    private final IAppOpsCallback mApbListener = new IAppOpsCallback.Stub() {
-        @Override
-        public void opChanged(int op, int uid, String packageName, String persistentDeviceId) {
-            boolean restricted = false;
-            try {
-                restricted = mAppOpsService.checkOperation(
-                        AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName)
-                        != AppOpsManager.MODE_ALLOWED;
-            } catch (RemoteException e) {
-                // Shouldn't happen
-            }
-            final int userId = UserHandle.getUserId(uid);
-            synchronized (mLock) {
-                if (restricted) {
-                    if (mRestrictedApps.add(userId, packageName)) {
-                        mAgent.onAppRestrictedLocked(userId, packageName);
-                    }
-                } else if (mRestrictedApps.remove(UserHandle.getUserId(uid), packageName)) {
-                    mAgent.onAppUnrestrictedLocked(userId, packageName);
-                }
-            }
-        }
-    };
-
-    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
-        @Nullable
-        private String getPackageName(Intent intent) {
-            Uri uri = intent.getData();
-            return uri != null ? uri.getSchemeSpecificPart() : null;
-        }
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            switch (intent.getAction()) {
-                case Intent.ACTION_BATTERY_CHANGED: {
-                    final boolean hasBattery =
-                            intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, mHasBattery);
-                    if (mHasBattery != hasBattery) {
-                        mHasBattery = hasBattery;
-                        mConfigObserver.updateEnabledStatus();
-                    }
-                }
-                break;
-                case Intent.ACTION_BATTERY_LEVEL_CHANGED:
-                    onBatteryLevelChanged();
-                    break;
-                case Intent.ACTION_PACKAGE_FULLY_REMOVED: {
-                    final String pkgName = getPackageName(intent);
-                    final int pkgUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
-                    onPackageRemoved(pkgUid, pkgName);
-                }
-                break;
-                case Intent.ACTION_PACKAGE_ADDED: {
-                    if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
-                        final String pkgName = getPackageName(intent);
-                        final int pkgUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
-                        onPackageAdded(pkgUid, pkgName);
-                    }
-                }
-                break;
-                case Intent.ACTION_PACKAGE_RESTARTED: {
-                    final String pkgName = getPackageName(intent);
-                    final int pkgUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
-                    final int userId = UserHandle.getUserId(pkgUid);
-                    onPackageForceStopped(userId, pkgName);
-                }
-                break;
-                case Intent.ACTION_USER_ADDED: {
-                    final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
-                    onUserAdded(userId);
-                }
-                break;
-                case Intent.ACTION_USER_REMOVED: {
-                    final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
-                    onUserRemoved(userId);
-                }
-                break;
-                case PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED:
-                    onExemptionListChanged();
-                    break;
-            }
-        }
-    };
-
-    private final UsageStatsManagerInternal.UsageEventListener mSurveillanceAgent =
-            new UsageStatsManagerInternal.UsageEventListener() {
-                /**
-                 * Callback to inform listeners of a new event.
-                 */
-                @Override
-                public void onUsageEvent(int userId, @NonNull UsageEvents.Event event) {
-                    // Skip posting a message to the handler for events we don't care about.
-                    switch (event.getEventType()) {
-                        case UsageEvents.Event.ACTIVITY_RESUMED:
-                        case UsageEvents.Event.ACTIVITY_PAUSED:
-                        case UsageEvents.Event.ACTIVITY_STOPPED:
-                        case UsageEvents.Event.ACTIVITY_DESTROYED:
-                        case UsageEvents.Event.USER_INTERACTION:
-                        case UsageEvents.Event.CHOOSER_ACTION:
-                        case UsageEvents.Event.NOTIFICATION_INTERRUPTION:
-                        case UsageEvents.Event.NOTIFICATION_SEEN:
-                            mHandler.obtainMessage(MSG_PROCESS_USAGE_EVENT, userId, 0, event)
-                                    .sendToTarget();
-                            break;
-                        default:
-                            if (DEBUG) {
-                                Slog.d(TAG, "Dropping event " + event.getEventType());
-                            }
-                            break;
-                    }
-                }
-            };
-
-    private final AlarmManager.OnAlarmListener mUnusedWealthReclamationListener =
-            new AlarmManager.OnAlarmListener() {
-                @Override
-                public void onAlarm() {
-                    synchronized (mLock) {
-                        mAgent.reclaimUnusedAssetsLocked(
-                                DEFAULT_UNUSED_RECLAMATION_PERCENTAGE, MIN_UNUSED_TIME_MS, false);
-                        mScribe.setLastReclamationTimeLocked(getCurrentTimeMillis());
-                        scheduleUnusedWealthReclamationLocked();
-                    }
-                }
-            };
-
-    private static final int MSG_NOTIFY_AFFORDABILITY_CHANGE_LISTENER = 0;
-    private static final int MSG_SCHEDULE_UNUSED_WEALTH_RECLAMATION_EVENT = 1;
-    private static final int MSG_PROCESS_USAGE_EVENT = 2;
-    private static final int MSG_NOTIFY_STATE_CHANGE_LISTENERS = 3;
-    private static final int MSG_NOTIFY_STATE_CHANGE_LISTENER = 4;
-    private static final int MSG_CLEAN_UP_TEMP_VIP_LIST = 5;
-    private static final String ALARM_TAG_WEALTH_RECLAMATION = "*tare.reclamation*";
-
-    /**
-     * Initializes the system service.
-     * <p>
-     * Subclasses must define a single argument constructor that accepts the context
-     * and passes it to super.
-     * </p>
-     *
-     * @param context The system server context.
-     */
-    public InternalResourceService(Context context) {
-        super(context);
-
-        mHandler = new IrsHandler(TareHandlerThread.get().getLooper());
-        mBatteryManagerInternal = LocalServices.getService(BatteryManagerInternal.class);
-        mPackageManager = context.getPackageManager();
-        mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
-        mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
-        mEconomyManagerStub = new EconomyManagerStub();
-        mAnalyst = new Analyst();
-        mScribe = new Scribe(this, mAnalyst);
-        mCompleteEconomicPolicy = new CompleteEconomicPolicy(this);
-        mAgent = new Agent(this, mScribe, mAnalyst);
-
-        mConfigObserver = new ConfigObserver(mHandler, context);
-
-        mDefaultTargetBackgroundBatteryLifeHours =
-                mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)
-                        ? 100 // ~ 1.0%/hr
-                        : 40; // ~ 2.5%/hr
-        mTargetBackgroundBatteryLifeHours = mDefaultTargetBackgroundBatteryLifeHours;
-
-        publishLocalService(EconomyManagerInternal.class, new LocalService());
-    }
-
-    @Override
-    public void onStart() {
-        publishBinderService(Context.RESOURCE_ECONOMY_SERVICE, mEconomyManagerStub);
-    }
-
-    @Override
-    public void onBootPhase(int phase) {
-        mBootPhase = phase;
-
-        switch (phase) {
-            case PHASE_SYSTEM_SERVICES_READY:
-                mAppOpsService = IAppOpsService.Stub.asInterface(
-                        ServiceManager.getService(Context.APP_OPS_SERVICE));
-                mDeviceIdleController = IDeviceIdleController.Stub.asInterface(
-                        ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
-                mConfigObserver.start();
-                onBootPhaseSystemServicesReady();
-                break;
-            case PHASE_THIRD_PARTY_APPS_CAN_START:
-                onBootPhaseThirdPartyAppsCanStart();
-                break;
-            case PHASE_BOOT_COMPLETED:
-                onBootPhaseBootCompleted();
-                break;
-        }
-    }
-
-    @NonNull
-    Object getLock() {
-        return mLock;
-    }
-
-    /** Returns the installed packages for all users. */
-    @NonNull
-    @GuardedBy("mLock")
-    CompleteEconomicPolicy getCompleteEconomicPolicyLocked() {
-        return mCompleteEconomicPolicy;
-    }
-
-    /** Returns the number of apps that this app is expected to update at some point. */
-    int getAppUpdateResponsibilityCount(final int userId, @NonNull final String pkgName) {
-        synchronized (mLock) {
-            // TODO(248274798): return 0 if the app has lost the install permission
-            return ArrayUtils.size(mInstallers.get(userId, pkgName));
-        }
-    }
-
-    @NonNull
-    SparseArrayMap<String, InstalledPackageInfo> getInstalledPackages() {
-        synchronized (mLock) {
-            return mPkgCache;
-        }
-    }
-
-    /** Returns the installed packages for the specified user. */
-    @NonNull
-    List<InstalledPackageInfo> getInstalledPackages(final int userId) {
-        final List<InstalledPackageInfo> userPkgs = new ArrayList<>();
-        synchronized (mLock) {
-            final int uIdx = mPkgCache.indexOfKey(userId);
-            if (uIdx < 0) {
-                return userPkgs;
-            }
-            for (int p = mPkgCache.numElementsForKeyAt(uIdx) - 1; p >= 0; --p) {
-                final InstalledPackageInfo packageInfo = mPkgCache.valueAt(uIdx, p);
-                userPkgs.add(packageInfo);
-            }
-        }
-        return userPkgs;
-    }
-
-    @Nullable
-    InstalledPackageInfo getInstalledPackageInfo(final int userId, @NonNull final String pkgName) {
-        synchronized (mLock) {
-            return mPkgCache.get(userId, pkgName);
-        }
-    }
-
-    @GuardedBy("mLock")
-    long getConsumptionLimitLocked() {
-        return mCurrentBatteryLevel * mScribe.getSatiatedConsumptionLimitLocked() / 100;
-    }
-
-    @GuardedBy("mLock")
-    long getMinBalanceLocked(final int userId, @NonNull final String pkgName) {
-        return mCurrentBatteryLevel * mCompleteEconomicPolicy.getMinSatiatedBalance(userId, pkgName)
-                / 100;
-    }
-
-    @GuardedBy("mLock")
-    long getInitialSatiatedConsumptionLimitLocked() {
-        return mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit();
-    }
-
-
-    long getRealtimeSinceFirstSetupMs() {
-        return mScribe.getRealtimeSinceFirstSetupMs(SystemClock.elapsedRealtime());
-    }
-
-    int getUid(final int userId, @NonNull final String pkgName) {
-        synchronized (mPackageToUidCache) {
-            Integer uid = mPackageToUidCache.get(userId, pkgName);
-            if (uid == null) {
-                uid = mPackageManagerInternal.getPackageUid(pkgName, 0, userId);
-                mPackageToUidCache.add(userId, pkgName, uid);
-            }
-            return uid;
-        }
-    }
-
-    @EconomyManager.EnabledMode
-    int getEnabledMode() {
-        return mEnabledMode;
-    }
-
-    @EconomyManager.EnabledMode
-    int getEnabledMode(int policyId) {
-        synchronized (mLock) {
-            // For now, treat enabled policies as using the same enabled mode as full TARE.
-            // TODO: have enabled mode by policy
-            if (mCompleteEconomicPolicy.isPolicyEnabled(policyId)) {
-                return mEnabledMode;
-            }
-            return ENABLED_MODE_OFF;
-        }
-    }
-
-    boolean isHeadlessSystemApp(final int userId, @NonNull String pkgName) {
-        if (pkgName == null) {
-            Slog.wtfStack(TAG, "isHeadlessSystemApp called with null package");
-            return false;
-        }
-        synchronized (mLock) {
-            final InstalledPackageInfo ipo = getInstalledPackageInfo(userId, pkgName);
-            if (ipo != null && ipo.isHeadlessSystemApp) {
-                return true;
-            }
-            // The wellbeing app is pre-set on the device, not expected to be interacted with
-            // much by the user, but can be expected to do work in the background on behalf of
-            // the user. As such, it's a pseudo-headless system app, so treat it as a headless
-            // system app.
-            return pkgName.equals(mWellbeingPackage);
-        }
-    }
-
-    boolean isPackageExempted(final int userId, @NonNull String pkgName) {
-        synchronized (mLock) {
-            return mExemptedApps.contains(pkgName);
-        }
-    }
-
-    boolean isPackageRestricted(final int userId, @NonNull String pkgName) {
-        synchronized (mLock) {
-            return mRestrictedApps.contains(userId, pkgName);
-        }
-    }
-
-    boolean isSystem(final int userId, @NonNull String pkgName) {
-        if ("android".equals(pkgName)) {
-            return true;
-        }
-        return UserHandle.isCore(getUid(userId, pkgName));
-    }
-
-    boolean isVip(final int userId, @NonNull String pkgName) {
-        return isVip(userId, pkgName, SystemClock.elapsedRealtime());
-    }
-
-    boolean isVip(final int userId, @NonNull String pkgName, final long nowElapsed) {
-        synchronized (mLock) {
-            final Boolean override = mVipOverrides.get(userId, pkgName);
-            if (override != null) {
-                return override;
-            }
-        }
-        if (isSystem(userId, pkgName)) {
-            // The government, I mean the system, can create ARCs as it needs to in order to
-            // operate.
-            return true;
-        }
-        synchronized (mLock) {
-            final Long expirationTimeElapsed = mTemporaryVips.get(userId, pkgName);
-            if (expirationTimeElapsed != null) {
-                return nowElapsed <= expirationTimeElapsed;
-            }
-        }
-        return false;
-    }
-
-    void onBatteryLevelChanged() {
-        synchronized (mLock) {
-            final int newBatteryLevel = getCurrentBatteryLevel();
-            mAnalyst.noteBatteryLevelChange(newBatteryLevel);
-            final boolean increased = newBatteryLevel > mCurrentBatteryLevel;
-            if (increased) {
-                if (newBatteryLevel >= STOCK_RECALCULATION_BATTERY_THRESHOLD) {
-                    maybeAdjustDesiredStockLevelLocked();
-                }
-                mAgent.distributeBasicIncomeLocked(newBatteryLevel);
-            } else if (newBatteryLevel == mCurrentBatteryLevel) {
-                // The broadcast is also sent when the plug type changes...
-                return;
-            }
-            mCurrentBatteryLevel = newBatteryLevel;
-            adjustCreditSupplyLocked(increased);
-        }
-    }
-
-    void onDeviceStateChanged() {
-        synchronized (mLock) {
-            mAgent.onDeviceStateChangedLocked();
-        }
-    }
-
-    void onExemptionListChanged() {
-        final int[] userIds = mUserManagerInternal.getUserIds();
-        synchronized (mLock) {
-            final ArraySet<String> removed = mExemptedApps;
-            final ArraySet<String> added = new ArraySet<>();
-            try {
-                mExemptedApps = new ArraySet<>(mDeviceIdleController.getFullPowerWhitelist());
-                mExemptListLoaded = true;
-            } catch (RemoteException e) {
-                // Shouldn't happen.
-            }
-
-            for (int i = mExemptedApps.size() - 1; i >= 0; --i) {
-                final String pkg = mExemptedApps.valueAt(i);
-                if (!removed.contains(pkg)) {
-                    added.add(pkg);
-                }
-                removed.remove(pkg);
-            }
-            for (int a = added.size() - 1; a >= 0; --a) {
-                final String pkgName = added.valueAt(a);
-                for (int userId : userIds) {
-                    // Since the exemption list doesn't specify user ID and we track by user ID,
-                    // we need to see if the app exists on the user before talking to the agent.
-                    // Otherwise, we may end up with invalid ledgers.
-                    final boolean appExists = getUid(userId, pkgName) >= 0;
-                    if (appExists) {
-                        mAgent.onAppExemptedLocked(userId, pkgName);
-                    }
-                }
-            }
-            for (int r = removed.size() - 1; r >= 0; --r) {
-                final String pkgName = removed.valueAt(r);
-                for (int userId : userIds) {
-                    // Since the exemption list doesn't specify user ID and we track by user ID,
-                    // we need to see if the app exists on the user before talking to the agent.
-                    // Otherwise, we may end up with invalid ledgers.
-                    final boolean appExists = getUid(userId, pkgName) >= 0;
-                    if (appExists) {
-                        mAgent.onAppUnexemptedLocked(userId, pkgName);
-                    }
-                }
-            }
-        }
-    }
-
-    void onPackageAdded(final int uid, @NonNull final String pkgName) {
-        final int userId = UserHandle.getUserId(uid);
-        final PackageInfo packageInfo;
-        try {
-            packageInfo =
-                    mPackageManager.getPackageInfoAsUser(pkgName, PACKAGE_QUERY_FLAGS, userId);
-        } catch (PackageManager.NameNotFoundException e) {
-            Slog.wtf(TAG, "PM couldn't find newly added package: " + pkgName, e);
-            return;
-        }
-        synchronized (mPackageToUidCache) {
-            mPackageToUidCache.add(userId, pkgName, uid);
-        }
-        synchronized (mLock) {
-            final InstalledPackageInfo ipo = new InstalledPackageInfo(getContext(), userId,
-                    packageInfo);
-            final InstalledPackageInfo oldIpo = mPkgCache.add(userId, pkgName, ipo);
-            maybeUpdateInstallerStatusLocked(oldIpo, ipo);
-            mUidToPackageCache.add(uid, pkgName);
-            // TODO: only do this when the user first launches the app (app leaves stopped state)
-            mAgent.grantBirthrightLocked(userId, pkgName);
-            if (ipo.installerPackageName != null) {
-                mAgent.noteInstantaneousEventLocked(userId, ipo.installerPackageName,
-                        JobSchedulerEconomicPolicy.REWARD_APP_INSTALL, null);
-            }
-        }
-    }
-
-    void onPackageForceStopped(final int userId, @NonNull final String pkgName) {
-        synchronized (mLock) {
-            // Remove all credits if the user force stops the app. It will slowly regain them
-            // in response to different events.
-            mAgent.reclaimAllAssetsLocked(userId, pkgName, EconomicPolicy.REGULATION_FORCE_STOP);
-        }
-    }
-
-    void onPackageRemoved(final int uid, @NonNull final String pkgName) {
-        final int userId = UserHandle.getUserId(uid);
-        synchronized (mPackageToUidCache) {
-            mPackageToUidCache.delete(userId, pkgName);
-        }
-        synchronized (mLock) {
-            mUidToPackageCache.remove(uid, pkgName);
-            mVipOverrides.delete(userId, pkgName);
-            final InstalledPackageInfo ipo = mPkgCache.delete(userId, pkgName);
-            mInstallers.delete(userId, pkgName);
-            if (ipo != null && ipo.installerPackageName != null) {
-                final ArraySet<String> list = mInstallers.get(userId, ipo.installerPackageName);
-                if (list != null) {
-                    list.remove(pkgName);
-                }
-            }
-            mAgent.onPackageRemovedLocked(userId, pkgName);
-        }
-    }
-
-    void onUidStateChanged(final int uid) {
-        synchronized (mLock) {
-            final ArraySet<String> pkgNames = getPackagesForUidLocked(uid);
-            if (pkgNames == null) {
-                Slog.e(TAG, "Don't have packages for uid " + uid);
-            } else {
-                mAgent.onAppStatesChangedLocked(UserHandle.getUserId(uid), pkgNames);
-            }
-        }
-    }
-
-    void onUserAdded(final int userId) {
-        synchronized (mLock) {
-            final List<PackageInfo> pkgs =
-                    mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId);
-            for (int i = pkgs.size() - 1; i >= 0; --i) {
-                final InstalledPackageInfo ipo =
-                        new InstalledPackageInfo(getContext(), userId, pkgs.get(i));
-                final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo);
-                maybeUpdateInstallerStatusLocked(oldIpo, ipo);
-            }
-            mAgent.grantBirthrightsLocked(userId);
-            final long nowElapsed = SystemClock.elapsedRealtime();
-            mScribe.setUserAddedTimeLocked(userId, nowElapsed);
-            grantInstallersTemporaryVipStatusLocked(userId,
-                    nowElapsed, INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS);
-        }
-    }
-
-    void onUserRemoved(final int userId) {
-        synchronized (mLock) {
-            mVipOverrides.delete(userId);
-            final int uIdx = mPkgCache.indexOfKey(userId);
-            if (uIdx >= 0) {
-                for (int p = mPkgCache.numElementsForKeyAt(uIdx) - 1; p >= 0; --p) {
-                    final InstalledPackageInfo pkgInfo = mPkgCache.valueAt(uIdx, p);
-                    mUidToPackageCache.remove(pkgInfo.uid);
-                }
-            }
-            mInstallers.delete(userId);
-            mPkgCache.delete(userId);
-            mAgent.onUserRemovedLocked(userId);
-            mScribe.onUserRemovedLocked(userId);
-        }
-    }
-
-    /**
-     * Try to increase the consumption limit if apps are reaching the current limit too quickly.
-     */
-    @GuardedBy("mLock")
-    void maybePerformQuantitativeEasingLocked() {
-        if (mConfigObserver.ENABLE_TIP3) {
-            maybeAdjustDesiredStockLevelLocked();
-            return;
-        }
-        if (getRealtimeSinceFirstSetupMs() < STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS) {
-            // Things can be very tumultuous soon after first setup.
-            return;
-        }
-        // We don't need to increase the limit if the device runs out of consumable credits
-        // when the battery is low.
-        final long remainingConsumableCakes = mScribe.getRemainingConsumableCakesLocked();
-        if (mCurrentBatteryLevel <= QUANTITATIVE_EASING_BATTERY_THRESHOLD
-                || remainingConsumableCakes > 0) {
-            return;
-        }
-        final long currentConsumptionLimit = mScribe.getSatiatedConsumptionLimitLocked();
-        final long shortfall = (mCurrentBatteryLevel - QUANTITATIVE_EASING_BATTERY_THRESHOLD)
-                * currentConsumptionLimit / 100;
-        final long newConsumptionLimit = Math.min(currentConsumptionLimit + shortfall,
-                mCompleteEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        if (newConsumptionLimit != currentConsumptionLimit) {
-            Slog.i(TAG, "Increasing consumption limit from " + cakeToString(currentConsumptionLimit)
-                    + " to " + cakeToString(newConsumptionLimit));
-            mScribe.setConsumptionLimitLocked(newConsumptionLimit);
-            adjustCreditSupplyLocked(/* allowIncrease */ true);
-        }
-    }
-
-    /**
-     * Adjust the consumption limit based on historical data and the target battery drain.
-     */
-    @GuardedBy("mLock")
-    void maybeAdjustDesiredStockLevelLocked() {
-        if (!mConfigObserver.ENABLE_TIP3) {
-            return;
-        }
-        if (getRealtimeSinceFirstSetupMs() < STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS) {
-            // Things can be very tumultuous soon after first setup.
-            return;
-        }
-        // Don't adjust the limit too often or while the battery is low.
-        final long now = getCurrentTimeMillis();
-        if ((now - mScribe.getLastStockRecalculationTimeLocked()) < STOCK_RECALCULATION_DELAY_MS
-                || mCurrentBatteryLevel <= STOCK_RECALCULATION_BATTERY_THRESHOLD) {
-            return;
-        }
-
-        // For now, use screen off battery drain as a proxy for background battery drain.
-        // TODO: get more accurate background battery drain numbers
-        final long totalScreenOffDurationMs = mAnalyst.getBatteryScreenOffDurationMs();
-        if (totalScreenOffDurationMs < STOCK_RECALCULATION_MIN_DATA_DURATION_MS) {
-            return;
-        }
-        final long totalDischargeMah = mAnalyst.getBatteryScreenOffDischargeMah();
-        if (totalDischargeMah == 0) {
-            Slog.i(TAG, "Total discharge was 0");
-            return;
-        }
-        final long batteryCapacityMah = mBatteryManagerInternal.getBatteryFullCharge() / 1000;
-        final long estimatedLifeHours = batteryCapacityMah * totalScreenOffDurationMs
-                / totalDischargeMah / HOUR_IN_MILLIS;
-        final long percentageOfTarget =
-                100 * estimatedLifeHours / mTargetBackgroundBatteryLifeHours;
-        if (DEBUG) {
-            Slog.d(TAG, "maybeAdjustDesiredStockLevelLocked:"
-                    + " screenOffMs=" + totalScreenOffDurationMs
-                    + " dischargeMah=" + totalDischargeMah
-                    + " capacityMah=" + batteryCapacityMah
-                    + " estimatedLifeHours=" + estimatedLifeHours
-                    + " %ofTarget=" + percentageOfTarget);
-        }
-        final long currentConsumptionLimit = mScribe.getSatiatedConsumptionLimitLocked();
-        final long newConsumptionLimit;
-        if (percentageOfTarget > 105) {
-            // The stock is too low. We're doing pretty well. We can increase the stock slightly
-            // to let apps do more work in the background.
-            newConsumptionLimit = Math.min((long) (currentConsumptionLimit * 1.01),
-                    mCompleteEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        } else if (percentageOfTarget < 100) {
-            // The stock is too high IMO. We're below the target. Decrease the stock to reduce
-            // background work.
-            newConsumptionLimit = Math.max((long) (currentConsumptionLimit * .98),
-                    mCompleteEconomicPolicy.getMinSatiatedConsumptionLimit());
-        } else {
-            // The stock is just right.
-            return;
-        }
-        // TODO(250007191): calculate and log implied service level
-        if (newConsumptionLimit != currentConsumptionLimit) {
-            Slog.i(TAG, "Adjusting consumption limit from " + cakeToString(currentConsumptionLimit)
-                    + " to " + cakeToString(newConsumptionLimit)
-                    + " because drain was " + percentageOfTarget + "% of target");
-            mScribe.setConsumptionLimitLocked(newConsumptionLimit);
-            adjustCreditSupplyLocked(/* allowIncrease */ true);
-            mScribe.setLastStockRecalculationTimeLocked(now);
-        }
-    }
-
-    void postAffordabilityChanged(final int userId, @NonNull final String pkgName,
-            @NonNull Agent.ActionAffordabilityNote affordabilityNote) {
-        if (DEBUG) {
-            Slog.d(TAG, userId + ":" + pkgName + " affordability changed to "
-                    + affordabilityNote.isCurrentlyAffordable());
-        }
-        final SomeArgs args = SomeArgs.obtain();
-        args.argi1 = userId;
-        args.arg1 = pkgName;
-        args.arg2 = affordabilityNote;
-        mHandler.obtainMessage(MSG_NOTIFY_AFFORDABILITY_CHANGE_LISTENER, args).sendToTarget();
-    }
-
-    @GuardedBy("mLock")
-    private void adjustCreditSupplyLocked(boolean allowIncrease) {
-        final long newLimit = getConsumptionLimitLocked();
-        final long remainingConsumableCakes = mScribe.getRemainingConsumableCakesLocked();
-        if (remainingConsumableCakes == newLimit) {
-            return;
-        }
-        if (remainingConsumableCakes > newLimit) {
-            mScribe.adjustRemainingConsumableCakesLocked(newLimit - remainingConsumableCakes);
-        } else if (allowIncrease) {
-            final double perc = mCurrentBatteryLevel / 100d;
-            final long shortfall = newLimit - remainingConsumableCakes;
-            mScribe.adjustRemainingConsumableCakesLocked((long) (perc * shortfall));
-        }
-        mAgent.onCreditSupplyChanged();
-    }
-
-    @GuardedBy("mLock")
-    private void grantInstallersTemporaryVipStatusLocked(int userId, long nowElapsed,
-            long grantDurationMs) {
-        final long grantEndTimeElapsed = nowElapsed + grantDurationMs;
-        final int uIdx = mPkgCache.indexOfKey(userId);
-        if (uIdx < 0) {
-            return;
-        }
-        for (int pIdx = mPkgCache.numElementsForKey(uIdx) - 1; pIdx >= 0; --pIdx) {
-            final InstalledPackageInfo ipo = mPkgCache.valueAt(uIdx, pIdx);
-
-            if (ipo.isSystemInstaller) {
-                final Long currentGrantEndTimeElapsed = mTemporaryVips.get(userId, ipo.packageName);
-                if (currentGrantEndTimeElapsed == null
-                        || currentGrantEndTimeElapsed < grantEndTimeElapsed) {
-                    mTemporaryVips.add(userId, ipo.packageName, grantEndTimeElapsed);
-                }
-            }
-        }
-        mHandler.sendEmptyMessageDelayed(MSG_CLEAN_UP_TEMP_VIP_LIST, grantDurationMs);
-    }
-
-    @GuardedBy("mLock")
-    private void processUsageEventLocked(final int userId, @NonNull UsageEvents.Event event) {
-        if (mEnabledMode == ENABLED_MODE_OFF) {
-            return;
-        }
-        final String pkgName = event.getPackageName();
-        if (DEBUG) {
-            Slog.d(TAG, "Processing event " + event.getEventType()
-                    + " (" + event.mInstanceId + ")"
-                    + " for " + appToString(userId, pkgName));
-        }
-        final long nowElapsed = SystemClock.elapsedRealtime();
-        switch (event.getEventType()) {
-            case UsageEvents.Event.ACTIVITY_RESUMED:
-                mAgent.noteOngoingEventLocked(userId, pkgName,
-                        EconomicPolicy.REWARD_TOP_ACTIVITY, String.valueOf(event.mInstanceId),
-                        nowElapsed);
-                break;
-            case UsageEvents.Event.ACTIVITY_PAUSED:
-            case UsageEvents.Event.ACTIVITY_STOPPED:
-            case UsageEvents.Event.ACTIVITY_DESTROYED:
-                final long now = getCurrentTimeMillis();
-                mAgent.stopOngoingActionLocked(userId, pkgName,
-                        EconomicPolicy.REWARD_TOP_ACTIVITY, String.valueOf(event.mInstanceId),
-                        nowElapsed, now);
-                break;
-            case UsageEvents.Event.USER_INTERACTION:
-            case UsageEvents.Event.CHOOSER_ACTION:
-                mAgent.noteInstantaneousEventLocked(userId, pkgName,
-                        EconomicPolicy.REWARD_OTHER_USER_INTERACTION, null);
-                break;
-            case UsageEvents.Event.NOTIFICATION_INTERRUPTION:
-            case UsageEvents.Event.NOTIFICATION_SEEN:
-                mAgent.noteInstantaneousEventLocked(userId, pkgName,
-                        EconomicPolicy.REWARD_NOTIFICATION_SEEN, null);
-                break;
-        }
-    }
-
-    @GuardedBy("mLock")
-    private void scheduleUnusedWealthReclamationLocked() {
-        final long now = getCurrentTimeMillis();
-        final long nextReclamationTime = Math.max(now + RECLAMATION_STARTUP_DELAY_MS,
-                mScribe.getLastReclamationTimeLocked() + UNUSED_RECLAMATION_PERIOD_MS);
-        mHandler.post(() -> {
-            // Never call out to AlarmManager with the lock held. This sits below AM.
-            AlarmManager alarmManager = getContext().getSystemService(AlarmManager.class);
-            if (alarmManager != null) {
-                alarmManager.setWindow(AlarmManager.ELAPSED_REALTIME,
-                        SystemClock.elapsedRealtime() + (nextReclamationTime - now),
-                        30 * MINUTE_IN_MILLIS,
-                        ALARM_TAG_WEALTH_RECLAMATION, mUnusedWealthReclamationListener, mHandler);
-            } else {
-                mHandler.sendEmptyMessageDelayed(
-                        MSG_SCHEDULE_UNUSED_WEALTH_RECLAMATION_EVENT, RECLAMATION_STARTUP_DELAY_MS);
-            }
-        });
-    }
-
-    private int getCurrentBatteryLevel() {
-        return mBatteryManagerInternal.getBatteryLevel();
-    }
-
-    @Nullable
-    @GuardedBy("mLock")
-    private ArraySet<String> getPackagesForUidLocked(final int uid) {
-        ArraySet<String> packages = mUidToPackageCache.get(uid);
-        if (packages == null) {
-            final String[] pkgs = mPackageManager.getPackagesForUid(uid);
-            if (pkgs != null) {
-                for (String pkg : pkgs) {
-                    mUidToPackageCache.add(uid, pkg);
-                }
-                packages = mUidToPackageCache.get(uid);
-            }
-        }
-        return packages;
-    }
-
-    private boolean isTareSupported() {
-        // TARE is presently designed for devices with batteries. Don't enable it on
-        // battery-less devices for now.
-        return mHasBattery;
-    }
-
-    @GuardedBy("mLock")
-    private void loadInstalledPackageListLocked() {
-        mPkgCache.clear();
-        final int[] userIds = mUserManagerInternal.getUserIds();
-        for (int userId : userIds) {
-            final List<PackageInfo> pkgs =
-                    mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId);
-            for (int i = pkgs.size() - 1; i >= 0; --i) {
-                final InstalledPackageInfo ipo =
-                        new InstalledPackageInfo(getContext(), userId, pkgs.get(i));
-                final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo);
-                maybeUpdateInstallerStatusLocked(oldIpo, ipo);
-            }
-        }
-    }
-
-    /**
-     * Used to update the set of installed apps for each installer. This only has an effect if the
-     * installer package name is different between {@code oldIpo} and {@code newIpo}.
-     */
-    @GuardedBy("mLock")
-    private void maybeUpdateInstallerStatusLocked(@Nullable InstalledPackageInfo oldIpo,
-            @NonNull InstalledPackageInfo newIpo) {
-        final boolean changed;
-        if (oldIpo == null) {
-            changed = newIpo.installerPackageName != null;
-        } else {
-            changed = !Objects.equals(oldIpo.installerPackageName, newIpo.installerPackageName);
-        }
-        if (!changed) {
-            return;
-        }
-        // InstallSourceInfo doesn't track userId, so for now, assume the installer on the package's
-        // user profile did the installation.
-        // TODO(246640162): use the actual installer's user ID
-        final int userId = UserHandle.getUserId(newIpo.uid);
-        final String pkgName = newIpo.packageName;
-        if (oldIpo != null) {
-            final ArraySet<String> oldList = mInstallers.get(userId, oldIpo.installerPackageName);
-            if (oldList != null) {
-                oldList.remove(pkgName);
-            }
-        }
-        if (newIpo.installerPackageName != null) {
-            ArraySet<String> newList = mInstallers.get(userId, newIpo.installerPackageName);
-            if (newList == null) {
-                newList = new ArraySet<>();
-                mInstallers.add(userId, newIpo.installerPackageName, newList);
-            }
-            newList.add(pkgName);
-        }
-    }
-
-    private void registerListeners() {
-        final IntentFilter filter = new IntentFilter();
-        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
-        filter.addAction(Intent.ACTION_BATTERY_LEVEL_CHANGED);
-        filter.addAction(PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED);
-        getContext().registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);
-
-        final IntentFilter pkgFilter = new IntentFilter();
-        pkgFilter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED);
-        pkgFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
-        pkgFilter.addAction(Intent.ACTION_PACKAGE_RESTARTED);
-        pkgFilter.addDataScheme("package");
-        getContext()
-                .registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, pkgFilter, null, null);
-
-        final IntentFilter userFilter = new IntentFilter(Intent.ACTION_USER_REMOVED);
-        userFilter.addAction(Intent.ACTION_USER_ADDED);
-        getContext()
-                .registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, userFilter, null, null);
-
-        UsageStatsManagerInternal usmi = LocalServices.getService(UsageStatsManagerInternal.class);
-        usmi.registerListener(mSurveillanceAgent);
-
-        try {
-            mAppOpsService
-                    .startWatchingMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, null, mApbListener);
-        } catch (RemoteException e) {
-            // shouldn't happen.
-        }
-    }
-
-    /** Perform long-running and/or heavy setup work. This should be called off the main thread. */
-    private void setupHeavyWork() {
-        if (mBootPhase < PHASE_THIRD_PARTY_APPS_CAN_START || mEnabledMode == ENABLED_MODE_OFF) {
-            return;
-        }
-        synchronized (mLock) {
-            mCompleteEconomicPolicy.setup(mConfigObserver.getAllDeviceConfigProperties());
-            loadInstalledPackageListLocked();
-            final SparseLongArray timeSinceUsersAdded;
-            final boolean isFirstSetup = !mScribe.recordExists();
-            final long nowElapsed = SystemClock.elapsedRealtime();
-            if (isFirstSetup) {
-                mAgent.grantBirthrightsLocked();
-                mScribe.setConsumptionLimitLocked(
-                        mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit());
-                // Set the last reclamation time to now so we don't start reclaiming assets
-                // too early.
-                mScribe.setLastReclamationTimeLocked(getCurrentTimeMillis());
-                timeSinceUsersAdded = new SparseLongArray();
-            } else {
-                mScribe.loadFromDiskLocked();
-                if (mScribe.getSatiatedConsumptionLimitLocked()
-                        < mCompleteEconomicPolicy.getMinSatiatedConsumptionLimit()
-                        || mScribe.getSatiatedConsumptionLimitLocked()
-                        > mCompleteEconomicPolicy.getMaxSatiatedConsumptionLimit()) {
-                    // Reset the consumption limit since several factors may have changed.
-                    mScribe.setConsumptionLimitLocked(
-                            mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit());
-                } else {
-                    // Adjust the supply in case battery level changed while the device was off.
-                    adjustCreditSupplyLocked(true);
-                }
-                timeSinceUsersAdded = mScribe.getRealtimeSinceUsersAddedLocked(nowElapsed);
-            }
-
-            final int[] userIds = mUserManagerInternal.getUserIds();
-            for (int userId : userIds) {
-                final long timeSinceUserAddedMs = timeSinceUsersAdded.get(userId, 0);
-                // Temporarily mark installers as VIPs so they aren't subject to credit
-                // limits and policies on first boot.
-                if (timeSinceUserAddedMs < INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS) {
-                    final long remainingGraceDurationMs =
-                            INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS - timeSinceUserAddedMs;
-
-                    grantInstallersTemporaryVipStatusLocked(userId, nowElapsed,
-                            remainingGraceDurationMs);
-                }
-            }
-            scheduleUnusedWealthReclamationLocked();
-        }
-    }
-
-    private void onBootPhaseSystemServicesReady() {
-        if (mBootPhase < PHASE_SYSTEM_SERVICES_READY || mEnabledMode == ENABLED_MODE_OFF) {
-            return;
-        }
-        synchronized (mLock) {
-            registerListeners();
-            // As of Android UDC, users can't change the wellbeing package, so load it once
-            // as soon as possible and don't bother trying to update it afterwards.
-            mWellbeingPackage = mPackageManager.getWellbeingPackageName();
-            mCurrentBatteryLevel = getCurrentBatteryLevel();
-            // Get the current battery presence, if available. This would succeed if TARE is
-            // toggled long after boot.
-            final Intent batteryStatus = getContext().registerReceiver(null,
-                    new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
-            if (batteryStatus != null) {
-                final boolean hasBattery =
-                        batteryStatus.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true);
-                if (mHasBattery != hasBattery) {
-                    mHasBattery = hasBattery;
-                    mConfigObserver.updateEnabledStatus();
-                }
-            }
-        }
-    }
-
-    private void onBootPhaseThirdPartyAppsCanStart() {
-        if (mBootPhase < PHASE_THIRD_PARTY_APPS_CAN_START || mEnabledMode == ENABLED_MODE_OFF) {
-            return;
-        }
-        mHandler.post(this::setupHeavyWork);
-    }
-
-    private void onBootPhaseBootCompleted() {
-        if (mBootPhase < PHASE_BOOT_COMPLETED || mEnabledMode == ENABLED_MODE_OFF) {
-            return;
-        }
-        synchronized (mLock) {
-            if (!mExemptListLoaded) {
-                try {
-                    mExemptedApps = new ArraySet<>(mDeviceIdleController.getFullPowerWhitelist());
-                    mExemptListLoaded = true;
-                } catch (RemoteException e) {
-                    // Shouldn't happen.
-                }
-            }
-        }
-    }
-
-    private void setupEverything() {
-        if (mEnabledMode == ENABLED_MODE_OFF) {
-            return;
-        }
-        if (mBootPhase >= PHASE_SYSTEM_SERVICES_READY) {
-            onBootPhaseSystemServicesReady();
-        }
-        if (mBootPhase >= PHASE_THIRD_PARTY_APPS_CAN_START) {
-            onBootPhaseThirdPartyAppsCanStart();
-        }
-        if (mBootPhase >= PHASE_BOOT_COMPLETED) {
-            onBootPhaseBootCompleted();
-        }
-    }
-
-    private void tearDownEverything() {
-        if (mEnabledMode != ENABLED_MODE_OFF) {
-            return;
-        }
-        synchronized (mLock) {
-            mAgent.tearDownLocked();
-            mAnalyst.tearDown();
-            mCompleteEconomicPolicy.tearDown();
-            mExemptedApps.clear();
-            mExemptListLoaded = false;
-            mHandler.post(() -> {
-                // Never call out to AlarmManager with the lock held. This sits below AM.
-                AlarmManager alarmManager = getContext().getSystemService(AlarmManager.class);
-                if (alarmManager != null) {
-                    alarmManager.cancel(mUnusedWealthReclamationListener);
-                }
-            });
-            mPkgCache.clear();
-            mScribe.tearDownLocked();
-            mUidToPackageCache.clear();
-            getContext().unregisterReceiver(mBroadcastReceiver);
-            UsageStatsManagerInternal usmi =
-                    LocalServices.getService(UsageStatsManagerInternal.class);
-            usmi.unregisterListener(mSurveillanceAgent);
-            try {
-                mAppOpsService.stopWatchingMode(mApbListener);
-            } catch (RemoteException e) {
-                // shouldn't happen.
-            }
-        }
-        synchronized (mPackageToUidCache) {
-            mPackageToUidCache.clear();
-        }
-    }
-
-    private final class IrsHandler extends Handler {
-        IrsHandler(Looper looper) {
-            super(looper);
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_CLEAN_UP_TEMP_VIP_LIST: {
-                    removeMessages(MSG_CLEAN_UP_TEMP_VIP_LIST);
-
-                    synchronized (mLock) {
-                        final long nowElapsed = SystemClock.elapsedRealtime();
-
-                        long earliestExpiration = Long.MAX_VALUE;
-                        for (int u = 0; u < mTemporaryVips.numMaps(); ++u) {
-                            final int userId = mTemporaryVips.keyAt(u);
-
-                            for (int p = mTemporaryVips.numElementsForKeyAt(u) - 1; p >= 0; --p) {
-                                final String pkgName = mTemporaryVips.keyAt(u, p);
-                                final Long expiration = mTemporaryVips.valueAt(u, p);
-
-                                if (expiration == null || expiration < nowElapsed) {
-                                    mTemporaryVips.delete(userId, pkgName);
-                                } else {
-                                    earliestExpiration = Math.min(earliestExpiration, expiration);
-                                }
-                            }
-                        }
-
-                        if (earliestExpiration < Long.MAX_VALUE) {
-                            sendEmptyMessageDelayed(MSG_CLEAN_UP_TEMP_VIP_LIST,
-                                    earliestExpiration - nowElapsed);
-                        }
-                    }
-                }
-                break;
-
-                case MSG_NOTIFY_AFFORDABILITY_CHANGE_LISTENER: {
-                    final SomeArgs args = (SomeArgs) msg.obj;
-                    final int userId = args.argi1;
-                    final String pkgName = (String) args.arg1;
-                    final Agent.ActionAffordabilityNote affordabilityNote =
-                            (Agent.ActionAffordabilityNote) args.arg2;
-
-                    final EconomyManagerInternal.AffordabilityChangeListener listener =
-                            affordabilityNote.getListener();
-                    listener.onAffordabilityChanged(userId, pkgName,
-                            affordabilityNote.getActionBill(),
-                            affordabilityNote.isCurrentlyAffordable());
-
-                    args.recycle();
-                }
-                break;
-
-                case MSG_NOTIFY_STATE_CHANGE_LISTENER: {
-                    final int policy = msg.arg1;
-                    final TareStateChangeListener listener = (TareStateChangeListener) msg.obj;
-                    listener.onTareEnabledModeChanged(getEnabledMode(policy));
-                }
-                break;
-
-                case MSG_NOTIFY_STATE_CHANGE_LISTENERS: {
-                    final int changedPolicies = msg.arg1;
-                    synchronized (mStateChangeListeners) {
-                        final int size = mStateChangeListeners.size();
-                        for (int l = 0; l < size; ++l) {
-                            final int policy = mStateChangeListeners.keyAt(l);
-                            if ((policy & changedPolicies) == 0) {
-                                continue;
-                            }
-                            final ArraySet<TareStateChangeListener> listeners =
-                                    mStateChangeListeners.get(policy);
-                            final int enabledMode = getEnabledMode(policy);
-                            for (int p = listeners.size() - 1; p >= 0; --p) {
-                                final TareStateChangeListener listener = listeners.valueAt(p);
-                                listener.onTareEnabledModeChanged(enabledMode);
-                            }
-                        }
-                    }
-                }
-                break;
-
-                case MSG_PROCESS_USAGE_EVENT: {
-                    final int userId = msg.arg1;
-                    final UsageEvents.Event event = (UsageEvents.Event) msg.obj;
-                    synchronized (mLock) {
-                        processUsageEventLocked(userId, event);
-                    }
-                }
-                break;
-
-                case MSG_SCHEDULE_UNUSED_WEALTH_RECLAMATION_EVENT: {
-                    removeMessages(MSG_SCHEDULE_UNUSED_WEALTH_RECLAMATION_EVENT);
-                    synchronized (mLock) {
-                        scheduleUnusedWealthReclamationLocked();
-                    }
-                }
-                break;
-            }
-        }
-    }
-
-    /**
-     * Binder stub trampoline implementation
-     */
-    final class EconomyManagerStub extends IEconomyManager.Stub {
-        /**
-         * "dumpsys" infrastructure
-         */
-        @Override
-        public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-            if (!DumpUtils.checkDumpAndUsageStatsPermission(getContext(), TAG, pw)) return;
-
-            boolean dumpAll = true;
-            if (!ArrayUtils.isEmpty(args)) {
-                String arg = args[0];
-                if ("-h".equals(arg) || "--help".equals(arg)) {
-                    dumpHelp(pw);
-                    return;
-                } else if ("-a".equals(arg)) {
-                    // -a is passed when dumping a bug report. Bug reports have a time limit for
-                    // each service dump, so we can't dump everything.
-                    dumpAll = false;
-                } else if (arg.length() > 0 && arg.charAt(0) == '-') {
-                    pw.println("Unknown option: " + arg);
-                    return;
-                }
-            }
-
-            final long identityToken = Binder.clearCallingIdentity();
-            try {
-                dumpInternal(new IndentingPrintWriter(pw, "  "), dumpAll);
-            } finally {
-                Binder.restoreCallingIdentity(identityToken);
-            }
-        }
-
-        @Override
-        @EconomyManager.EnabledMode
-        public int getEnabledMode() {
-            return InternalResourceService.this.getEnabledMode();
-        }
-
-        @Override
-        public int handleShellCommand(@NonNull ParcelFileDescriptor in,
-                @NonNull ParcelFileDescriptor out, @NonNull ParcelFileDescriptor err,
-                @NonNull String[] args) {
-            return (new TareShellCommand(InternalResourceService.this)).exec(
-                    this, in.getFileDescriptor(), out.getFileDescriptor(), err.getFileDescriptor(),
-                    args);
-        }
-    }
-
-    private final class LocalService implements EconomyManagerInternal {
-        /**
-         * Use an extremely large value to indicate that an app can pay for a bill indefinitely.
-         * The value set here should be large/long enough that there's no reasonable expectation
-         * of a device operating uninterrupted (or in the exact same state) for that period of time.
-         * We intentionally don't use Long.MAX_VALUE to avoid potential overflow if a client
-         * doesn't check the value and just immediately adds it to the current time.
-         */
-        private static final long FOREVER_MS = 27 * 365 * 24 * HOUR_IN_MILLIS;
-
-        @Override
-        public void registerAffordabilityChangeListener(int userId, @NonNull String pkgName,
-                @NonNull AffordabilityChangeListener listener, @NonNull ActionBill bill) {
-            if (!isTareSupported() || isSystem(userId, pkgName)) {
-                // The system's affordability never changes.
-                return;
-            }
-            synchronized (mLock) {
-                mAgent.registerAffordabilityChangeListenerLocked(userId, pkgName, listener, bill);
-            }
-        }
-
-        @Override
-        public void unregisterAffordabilityChangeListener(int userId, @NonNull String pkgName,
-                @NonNull AffordabilityChangeListener listener, @NonNull ActionBill bill) {
-            if (isSystem(userId, pkgName)) {
-                // The system's affordability never changes.
-                return;
-            }
-            synchronized (mLock) {
-                mAgent.unregisterAffordabilityChangeListenerLocked(userId, pkgName, listener, bill);
-            }
-        }
-
-        @Override
-        public void registerTareStateChangeListener(@NonNull TareStateChangeListener listener,
-                int policyId) {
-            if (!isTareSupported()) {
-                return;
-            }
-            synchronized (mStateChangeListeners) {
-                if (mStateChangeListeners.add(policyId, listener)) {
-                    mHandler.obtainMessage(MSG_NOTIFY_STATE_CHANGE_LISTENER, policyId, 0, listener)
-                            .sendToTarget();
-                }
-            }
-        }
-
-        @Override
-        public void unregisterTareStateChangeListener(@NonNull TareStateChangeListener listener) {
-            synchronized (mStateChangeListeners) {
-                for (int i = mStateChangeListeners.size() - 1; i >= 0; --i) {
-                    final ArraySet<TareStateChangeListener> listeners =
-                            mStateChangeListeners.get(mStateChangeListeners.keyAt(i));
-                    listeners.remove(listener);
-                }
-            }
-        }
-
-        @Override
-        public boolean canPayFor(int userId, @NonNull String pkgName, @NonNull ActionBill bill) {
-            if (mEnabledMode == ENABLED_MODE_OFF) {
-                return true;
-            }
-            if (isVip(userId, pkgName)) {
-                // The government, I mean the system, can create ARCs as it needs to in order to
-                // allow VIPs to operate.
-                return true;
-            }
-            // TODO: take temp-allowlist into consideration
-            long requiredBalance = 0;
-            final List<EconomyManagerInternal.AnticipatedAction> projectedActions =
-                    bill.getAnticipatedActions();
-            synchronized (mLock) {
-                for (int i = 0; i < projectedActions.size(); ++i) {
-                    AnticipatedAction action = projectedActions.get(i);
-                    final Cost cost = mCompleteEconomicPolicy.getCostOfAction(
-                            action.actionId, userId, pkgName);
-                    requiredBalance += cost.price * action.numInstantaneousCalls
-                            + cost.price * (action.ongoingDurationMs / 1000);
-                }
-                return mAgent.getBalanceLocked(userId, pkgName) >= requiredBalance
-                        && mScribe.getRemainingConsumableCakesLocked() >= requiredBalance;
-            }
-        }
-
-        @Override
-        public long getMaxDurationMs(int userId, @NonNull String pkgName,
-                @NonNull ActionBill bill) {
-            if (mEnabledMode == ENABLED_MODE_OFF) {
-                return FOREVER_MS;
-            }
-            if (isVip(userId, pkgName)) {
-                return FOREVER_MS;
-            }
-            long totalCostPerSecond = 0;
-            final List<EconomyManagerInternal.AnticipatedAction> projectedActions =
-                    bill.getAnticipatedActions();
-            synchronized (mLock) {
-                for (int i = 0; i < projectedActions.size(); ++i) {
-                    AnticipatedAction action = projectedActions.get(i);
-                    final Cost cost = mCompleteEconomicPolicy.getCostOfAction(
-                            action.actionId, userId, pkgName);
-                    totalCostPerSecond += cost.price;
-                }
-                if (totalCostPerSecond == 0) {
-                    return FOREVER_MS;
-                }
-                final long minBalance = Math.min(
-                        mAgent.getBalanceLocked(userId, pkgName),
-                        mScribe.getRemainingConsumableCakesLocked());
-                return minBalance * 1000 / totalCostPerSecond;
-            }
-        }
-
-        @Override
-        public int getEnabledMode() {
-            return mEnabledMode;
-        }
-
-        @Override
-        public int getEnabledMode(int policyId) {
-            return InternalResourceService.this.getEnabledMode(policyId);
-        }
-
-        @Override
-        public void noteInstantaneousEvent(int userId, @NonNull String pkgName, int eventId,
-                @Nullable String tag) {
-            if (mEnabledMode == ENABLED_MODE_OFF) {
-                return;
-            }
-            synchronized (mLock) {
-                mAgent.noteInstantaneousEventLocked(userId, pkgName, eventId, tag);
-            }
-        }
-
-        @Override
-        public void noteOngoingEventStarted(int userId, @NonNull String pkgName, int eventId,
-                @Nullable String tag) {
-            if (mEnabledMode == ENABLED_MODE_OFF) {
-                return;
-            }
-            synchronized (mLock) {
-                final long nowElapsed = SystemClock.elapsedRealtime();
-                mAgent.noteOngoingEventLocked(userId, pkgName, eventId, tag, nowElapsed);
-            }
-        }
-
-        @Override
-        public void noteOngoingEventStopped(int userId, @NonNull String pkgName, int eventId,
-                @Nullable String tag) {
-            if (mEnabledMode == ENABLED_MODE_OFF) {
-                return;
-            }
-            final long nowElapsed = SystemClock.elapsedRealtime();
-            final long now = getCurrentTimeMillis();
-            synchronized (mLock) {
-                mAgent.stopOngoingActionLocked(userId, pkgName, eventId, tag, nowElapsed, now);
-            }
-        }
-    }
-
-    private class ConfigObserver extends ContentObserver
-            implements DeviceConfig.OnPropertiesChangedListener {
-        private static final String KEY_ENABLE_TIP3 = "enable_tip3";
-        private static final String KEY_TARGET_BACKGROUND_BATTERY_LIFE_HOURS =
-                "target_bg_battery_life_hrs";
-
-        private static final boolean DEFAULT_ENABLE_TIP3 = true;
-
-        /** Use a target background battery drain rate to determine consumption limits. */
-        public boolean ENABLE_TIP3 = DEFAULT_ENABLE_TIP3;
-
-        private final ContentResolver mContentResolver;
-
-        ConfigObserver(Handler handler, Context context) {
-            super(handler);
-            mContentResolver = context.getContentResolver();
-        }
-
-        public void start() {
-            DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_TARE,
-                    TareHandlerThread.getExecutor(), this);
-            mContentResolver.registerContentObserver(
-                    Settings.Global.getUriFor(Settings.Global.ENABLE_TARE), false, this);
-            mContentResolver.registerContentObserver(
-                    Settings.Global.getUriFor(TARE_ALARM_MANAGER_CONSTANTS), false, this);
-            mContentResolver.registerContentObserver(
-                    Settings.Global.getUriFor(TARE_JOB_SCHEDULER_CONSTANTS), false, this);
-            onPropertiesChanged(getAllDeviceConfigProperties());
-            updateEnabledStatus();
-        }
-
-        @NonNull
-        DeviceConfig.Properties getAllDeviceConfigProperties() {
-            // Don't want to cache the Properties object locally in case it ends up being large,
-            // especially since it'll only be used once/infrequently (during setup or on a change).
-            return DeviceConfig.getProperties(DeviceConfig.NAMESPACE_TARE);
-        }
-
-        @Override
-        public void onChange(boolean selfChange, Uri uri) {
-            if (uri.equals(Settings.Global.getUriFor(Settings.Global.ENABLE_TARE))) {
-                updateEnabledStatus();
-            } else if (uri.equals(Settings.Global.getUriFor(TARE_ALARM_MANAGER_CONSTANTS))
-                    || uri.equals(Settings.Global.getUriFor(TARE_JOB_SCHEDULER_CONSTANTS))) {
-                updateEconomicPolicy();
-            }
-        }
-
-        @Override
-        public void onPropertiesChanged(DeviceConfig.Properties properties) {
-            boolean economicPolicyUpdated = false;
-            synchronized (mLock) {
-                for (String name : properties.getKeyset()) {
-                    if (name == null) {
-                        continue;
-                    }
-                    switch (name) {
-                        case EconomyManager.KEY_ENABLE_TARE_MODE:
-                            updateEnabledStatus();
-                            break;
-                        case KEY_ENABLE_TIP3:
-                            ENABLE_TIP3 = properties.getBoolean(name, DEFAULT_ENABLE_TIP3);
-                            break;
-                        case KEY_TARGET_BACKGROUND_BATTERY_LIFE_HOURS:
-                            synchronized (mLock) {
-                                mTargetBackgroundBatteryLifeHours = properties.getInt(name,
-                                        mDefaultTargetBackgroundBatteryLifeHours);
-                                maybeAdjustDesiredStockLevelLocked();
-                            }
-                            break;
-                        default:
-                            if (!economicPolicyUpdated
-                                    && (name.startsWith("am") || name.startsWith("js")
-                                    || name.startsWith("enable_policy"))) {
-                                updateEconomicPolicy();
-                                economicPolicyUpdated = true;
-                            }
-                    }
-                }
-            }
-        }
-
-        private void updateEnabledStatus() {
-            // User setting should override DeviceConfig setting.
-            final int tareEnabledModeDC = DeviceConfig.getInt(DeviceConfig.NAMESPACE_TARE,
-                    EconomyManager.KEY_ENABLE_TARE_MODE, EconomyManager.DEFAULT_ENABLE_TARE_MODE);
-            final int tareEnabledModeConfig = isTareSupported()
-                    ? Settings.Global.getInt(mContentResolver,
-                            Settings.Global.ENABLE_TARE, tareEnabledModeDC)
-                    : ENABLED_MODE_OFF;
-            final int enabledMode;
-            if (tareEnabledModeConfig == ENABLED_MODE_OFF
-                    || tareEnabledModeConfig == ENABLED_MODE_ON
-                    || tareEnabledModeConfig == ENABLED_MODE_SHADOW) {
-                // Config has a valid enabled mode.
-                enabledMode = tareEnabledModeConfig;
-            } else {
-                enabledMode = EconomyManager.DEFAULT_ENABLE_TARE_MODE;
-            }
-            if (mEnabledMode != enabledMode) {
-                // A full change where we've gone from OFF to {SHADOW or ON}, or vie versa.
-                // With this transition, we'll have to set up or tear down.
-                final boolean fullEnableChange =
-                        mEnabledMode == ENABLED_MODE_OFF || enabledMode == ENABLED_MODE_OFF;
-                mEnabledMode = enabledMode;
-                if (fullEnableChange) {
-                    if (mEnabledMode != ENABLED_MODE_OFF) {
-                        setupEverything();
-                    } else {
-                        tearDownEverything();
-                    }
-                }
-                mHandler.obtainMessage(
-                                MSG_NOTIFY_STATE_CHANGE_LISTENERS, EconomicPolicy.ALL_POLICIES, 0)
-                        .sendToTarget();
-            }
-        }
-
-        private void updateEconomicPolicy() {
-            synchronized (mLock) {
-                final long minLimit = mCompleteEconomicPolicy.getMinSatiatedConsumptionLimit();
-                final long maxLimit = mCompleteEconomicPolicy.getMaxSatiatedConsumptionLimit();
-                final int oldEnabledPolicies = mCompleteEconomicPolicy.getEnabledPolicyIds();
-                mCompleteEconomicPolicy.tearDown();
-                mCompleteEconomicPolicy = new CompleteEconomicPolicy(InternalResourceService.this);
-                if (mEnabledMode != ENABLED_MODE_OFF
-                        && mBootPhase >= PHASE_THIRD_PARTY_APPS_CAN_START) {
-                    mCompleteEconomicPolicy.setup(getAllDeviceConfigProperties());
-                    if (minLimit != mCompleteEconomicPolicy.getMinSatiatedConsumptionLimit()
-                            || maxLimit
-                            != mCompleteEconomicPolicy.getMaxSatiatedConsumptionLimit()) {
-                        // Reset the consumption limit since several factors may have changed.
-                        mScribe.setConsumptionLimitLocked(
-                                mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit());
-                    }
-                    mAgent.onPricingChangedLocked();
-                    final int newEnabledPolicies = mCompleteEconomicPolicy.getEnabledPolicyIds();
-                    if (oldEnabledPolicies != newEnabledPolicies) {
-                        final int changedPolicies = oldEnabledPolicies ^ newEnabledPolicies;
-                        mHandler.obtainMessage(
-                                        MSG_NOTIFY_STATE_CHANGE_LISTENERS, changedPolicies, 0)
-                                .sendToTarget();
-                    }
-                }
-            }
-        }
-    }
-
-    // Shell command infrastructure
-    int executeClearVip(@NonNull PrintWriter pw) {
-        synchronized (mLock) {
-            final SparseSetArray<String> changedPkgs = new SparseSetArray<>();
-            for (int u = mVipOverrides.numMaps() - 1; u >= 0; --u) {
-                final int userId = mVipOverrides.keyAt(u);
-
-                for (int p = mVipOverrides.numElementsForKeyAt(u) - 1; p >= 0; --p) {
-                    changedPkgs.add(userId, mVipOverrides.keyAt(u, p));
-                }
-            }
-            mVipOverrides.clear();
-            if (mEnabledMode != ENABLED_MODE_OFF) {
-                mAgent.onVipStatusChangedLocked(changedPkgs);
-            }
-        }
-        pw.println("Cleared all VIP statuses");
-        return TareShellCommand.COMMAND_SUCCESS;
-    }
-
-    int executeSetVip(@NonNull PrintWriter pw,
-            int userId, @NonNull String pkgName, @Nullable Boolean newVipState) {
-        final boolean changed;
-        synchronized (mLock) {
-            final boolean wasVip = isVip(userId, pkgName);
-            if (newVipState == null) {
-                mVipOverrides.delete(userId, pkgName);
-            } else {
-                mVipOverrides.add(userId, pkgName, newVipState);
-            }
-            changed = isVip(userId, pkgName) != wasVip;
-            if (mEnabledMode != ENABLED_MODE_OFF && changed) {
-                mAgent.onVipStatusChangedLocked(userId, pkgName);
-            }
-        }
-        pw.println(appToString(userId, pkgName) + " VIP status set to " + newVipState + "."
-                + " Final VIP state changed? " + changed);
-        return TareShellCommand.COMMAND_SUCCESS;
-    }
-
-    // Dump infrastructure
-    private static void dumpHelp(PrintWriter pw) {
-        pw.println("Resource Economy (economy) dump options:");
-        pw.println("  [-h|--help] [package] ...");
-        pw.println("    -h | --help: print this help");
-        pw.println("  [package] is an optional package name to limit the output to.");
-    }
-
-    private void dumpInternal(final IndentingPrintWriter pw, final boolean dumpAll) {
-        if (!isTareSupported()) {
-            pw.print("Unsupported by device");
-            return;
-        }
-        synchronized (mLock) {
-            pw.print("Enabled mode: ");
-            pw.println(enabledModeToString(mEnabledMode));
-
-            pw.print("Current battery level: ");
-            pw.println(mCurrentBatteryLevel);
-
-            final long consumptionLimit = getConsumptionLimitLocked();
-            pw.print("Consumption limit (current/initial-satiated/current-satiated): ");
-            pw.print(cakeToString(consumptionLimit));
-            pw.print("/");
-            pw.print(cakeToString(mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit()));
-            pw.print("/");
-            pw.println(cakeToString(mScribe.getSatiatedConsumptionLimitLocked()));
-
-            pw.print("Target bg battery life (hours): ");
-            pw.print(mTargetBackgroundBatteryLifeHours);
-            pw.print(" (");
-            pw.print(String.format("%.2f", 100f / mTargetBackgroundBatteryLifeHours));
-            pw.println("%/hr)");
-
-            final long remainingConsumable = mScribe.getRemainingConsumableCakesLocked();
-            pw.print("Goods remaining: ");
-            pw.print(cakeToString(remainingConsumable));
-            pw.print(" (");
-            pw.print(String.format("%.2f", 100f * remainingConsumable / consumptionLimit));
-            pw.println("% of current limit)");
-
-            pw.print("Device wealth: ");
-            pw.println(cakeToString(mScribe.getCakesInCirculationForLoggingLocked()));
-
-            pw.println();
-            pw.print("Exempted apps", mExemptedApps);
-            pw.println();
-
-            pw.println();
-            pw.print("Wellbeing app=");
-            pw.println(mWellbeingPackage == null ? "None" : mWellbeingPackage);
-
-            boolean printedVips = false;
-            pw.println();
-            pw.print("VIPs:");
-            pw.increaseIndent();
-            for (int u = 0; u < mVipOverrides.numMaps(); ++u) {
-                final int userId = mVipOverrides.keyAt(u);
-
-                for (int p = 0; p < mVipOverrides.numElementsForKeyAt(u); ++p) {
-                    final String pkgName = mVipOverrides.keyAt(u, p);
-
-                    printedVips = true;
-                    pw.println();
-                    pw.print(appToString(userId, pkgName));
-                    pw.print("=");
-                    pw.print(mVipOverrides.valueAt(u, p));
-                }
-            }
-            if (printedVips) {
-                pw.println();
-            } else {
-                pw.print(" None");
-            }
-            pw.decreaseIndent();
-            pw.println();
-
-            boolean printedTempVips = false;
-            pw.println();
-            pw.print("Temp VIPs:");
-            pw.increaseIndent();
-            for (int u = 0; u < mTemporaryVips.numMaps(); ++u) {
-                final int userId = mTemporaryVips.keyAt(u);
-
-                for (int p = 0; p < mTemporaryVips.numElementsForKeyAt(u); ++p) {
-                    final String pkgName = mTemporaryVips.keyAt(u, p);
-
-                    printedTempVips = true;
-                    pw.println();
-                    pw.print(appToString(userId, pkgName));
-                    pw.print("=");
-                    pw.print(mTemporaryVips.valueAt(u, p));
-                }
-            }
-            if (printedTempVips) {
-                pw.println();
-            } else {
-                pw.print(" None");
-            }
-            pw.decreaseIndent();
-            pw.println();
-
-            pw.println();
-            pw.println("Installers:");
-            pw.increaseIndent();
-            for (int u = 0; u < mInstallers.numMaps(); ++u) {
-                final int userId = mInstallers.keyAt(u);
-
-                for (int p = 0; p < mInstallers.numElementsForKeyAt(u); ++p) {
-                    final String pkgName = mInstallers.keyAt(u, p);
-
-                    pw.print(appToString(userId, pkgName));
-                    pw.print(": ");
-                    pw.print(mInstallers.valueAt(u, p).size());
-                    pw.println(" apps");
-                }
-            }
-            pw.decreaseIndent();
-
-            pw.println();
-            mCompleteEconomicPolicy.dump(pw);
-
-            pw.println();
-            mScribe.dumpLocked(pw, dumpAll);
-
-            pw.println();
-            mAgent.dumpLocked(pw);
-
-            pw.println();
-            mAnalyst.dump(pw);
-
-            // Put this at the end since this may be a lot and we want to have the earlier
-            // information easily accessible.
-            boolean printedInterestingIpos = false;
-            pw.println();
-            pw.print("Interesting apps:");
-            pw.increaseIndent();
-            for (int u = 0; u < mPkgCache.numMaps(); ++u) {
-                for (int p = 0; p < mPkgCache.numElementsForKeyAt(u); ++p) {
-                    final InstalledPackageInfo ipo = mPkgCache.valueAt(u, p);
-
-                    // Printing out every single app will be too much. Only print apps that
-                    // have some interesting characteristic.
-                    final boolean isInteresting = ipo.hasCode
-                            && ipo.isHeadlessSystemApp
-                            && !UserHandle.isCore(ipo.uid);
-                    if (!isInteresting) {
-                        continue;
-                    }
-
-                    printedInterestingIpos = true;
-                    pw.println();
-                    pw.print(ipo);
-                }
-            }
-            if (printedInterestingIpos) {
-                pw.println();
-            } else {
-                pw.print(" None");
-            }
-            pw.decreaseIndent();
-            pw.println();
-        }
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java
deleted file mode 100644
index 69e5736..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java
+++ /dev/null
@@ -1,483 +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.server.tare;
-
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_START_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_START_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_START_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_START_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_APP_INSTALL_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_APP_INSTALL_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_RUNNING_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_START_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_RUNNING_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_START_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_START_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_RUNNING_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_START_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_START_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_RUNNING_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_START_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_START_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_RUNNING_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_START_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_START_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_INITIAL_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_JS_MAX_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_JS_MAX_SATIATED_BALANCE;
-import static android.app.tare.EconomyManager.KEY_JS_MIN_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED;
-import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP;
-import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER;
-import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_APP_INSTALL_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_APP_INSTALL_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_APP_INSTALL_ONGOING;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_SEEN_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_SEEN_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_SEEN_ONGOING;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_OTHER_USER_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_OTHER_USER_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_OTHER_USER_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_TOP_ACTIVITY_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_TOP_ACTIVITY_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_TOP_ACTIVITY_ONGOING;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_WIDGET_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_WIDGET_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_WIDGET_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.arcToCake;
-import static android.provider.Settings.Global.TARE_JOB_SCHEDULER_CONSTANTS;
-
-import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING;
-import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE;
-import static com.android.server.tare.TareUtils.appToString;
-import static com.android.server.tare.TareUtils.cakeToString;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ContentResolver;
-import android.provider.DeviceConfig;
-import android.util.IndentingPrintWriter;
-import android.util.Slog;
-import android.util.SparseArray;
-
-/**
- * Policy defining pricing information and daily ARC requirements and suggestions for
- * JobScheduler.
- */
-public class JobSchedulerEconomicPolicy extends EconomicPolicy {
-    private static final String TAG = "TARE- " + JobSchedulerEconomicPolicy.class.getSimpleName();
-
-    public static final int ACTION_JOB_MAX_START = TYPE_ACTION | POLICY_JOB | 0;
-    public static final int ACTION_JOB_MAX_RUNNING = TYPE_ACTION | POLICY_JOB | 1;
-    public static final int ACTION_JOB_HIGH_START = TYPE_ACTION | POLICY_JOB | 2;
-    public static final int ACTION_JOB_HIGH_RUNNING = TYPE_ACTION | POLICY_JOB | 3;
-    public static final int ACTION_JOB_DEFAULT_START = TYPE_ACTION | POLICY_JOB | 4;
-    public static final int ACTION_JOB_DEFAULT_RUNNING = TYPE_ACTION | POLICY_JOB | 5;
-    public static final int ACTION_JOB_LOW_START = TYPE_ACTION | POLICY_JOB | 6;
-    public static final int ACTION_JOB_LOW_RUNNING = TYPE_ACTION | POLICY_JOB | 7;
-    public static final int ACTION_JOB_MIN_START = TYPE_ACTION | POLICY_JOB | 8;
-    public static final int ACTION_JOB_MIN_RUNNING = TYPE_ACTION | POLICY_JOB | 9;
-    public static final int ACTION_JOB_TIMEOUT = TYPE_ACTION | POLICY_JOB | 10;
-
-    public static final int REWARD_APP_INSTALL = TYPE_REWARD | POLICY_JOB | 0;
-
-    private static final int[] COST_MODIFIERS = new int[]{
-            COST_MODIFIER_CHARGING,
-            COST_MODIFIER_DEVICE_IDLE,
-            COST_MODIFIER_POWER_SAVE_MODE,
-            COST_MODIFIER_PROCESS_STATE
-    };
-
-    private long mMinSatiatedBalanceExempted;
-    private long mMinSatiatedBalanceHeadlessSystemApp;
-    private long mMinSatiatedBalanceOther;
-    private long mMinSatiatedBalanceIncrementalAppUpdater;
-    private long mMaxSatiatedBalance;
-    private long mInitialSatiatedConsumptionLimit;
-    private long mMinSatiatedConsumptionLimit;
-    private long mMaxSatiatedConsumptionLimit;
-
-    private final Injector mInjector;
-
-    private final SparseArray<Action> mActions = new SparseArray<>();
-    private final SparseArray<Reward> mRewards = new SparseArray<>();
-
-    JobSchedulerEconomicPolicy(InternalResourceService irs, Injector injector) {
-        super(irs);
-        mInjector = injector;
-        loadConstants("", null);
-    }
-
-    @Override
-    void setup(@NonNull DeviceConfig.Properties properties) {
-        super.setup(properties);
-        final ContentResolver resolver = mIrs.getContext().getContentResolver();
-        loadConstants(mInjector.getSettingsGlobalString(resolver, TARE_JOB_SCHEDULER_CONSTANTS),
-                properties);
-    }
-
-    @Override
-    long getMinSatiatedBalance(final int userId, @NonNull final String pkgName) {
-        if (mIrs.isPackageRestricted(userId, pkgName)) {
-            return 0;
-        }
-
-        final long baseBalance;
-        if (mIrs.isPackageExempted(userId, pkgName)) {
-            baseBalance = mMinSatiatedBalanceExempted;
-        } else if (mIrs.isHeadlessSystemApp(userId, pkgName)) {
-            baseBalance = mMinSatiatedBalanceHeadlessSystemApp;
-        } else {
-            baseBalance = mMinSatiatedBalanceOther;
-        }
-
-        long minBalance = baseBalance;
-
-        final int updateResponsibilityCount = mIrs.getAppUpdateResponsibilityCount(userId, pkgName);
-        minBalance += updateResponsibilityCount * mMinSatiatedBalanceIncrementalAppUpdater;
-
-        return Math.min(minBalance, mMaxSatiatedBalance);
-    }
-
-    @Override
-    long getMaxSatiatedBalance(int userId, @NonNull String pkgName) {
-        if (mIrs.isPackageRestricted(userId, pkgName)) {
-            return 0;
-        }
-        final InstalledPackageInfo ipo = mIrs.getInstalledPackageInfo(userId, pkgName);
-        if (ipo == null) {
-            Slog.wtfStack(TAG,
-                    "Tried to get max balance of invalid app: " + appToString(userId, pkgName));
-        } else {
-            // A system installer's max balance is elevated for some time after first boot so
-            // they can use jobs to download and install apps.
-            if (ipo.isSystemInstaller) {
-                final long timeSinceFirstSetupMs = mIrs.getRealtimeSinceFirstSetupMs();
-                final boolean stillExempted = timeSinceFirstSetupMs
-                        < InternalResourceService.INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS;
-                if (stillExempted) {
-                    return mMaxSatiatedConsumptionLimit;
-                }
-            }
-        }
-        return mMaxSatiatedBalance;
-    }
-
-    @Override
-    long getInitialSatiatedConsumptionLimit() {
-        return mInitialSatiatedConsumptionLimit;
-    }
-
-    @Override
-    long getMinSatiatedConsumptionLimit() {
-        return mMinSatiatedConsumptionLimit;
-    }
-
-    @Override
-    long getMaxSatiatedConsumptionLimit() {
-        return mMaxSatiatedConsumptionLimit;
-    }
-
-    @NonNull
-    @Override
-    int[] getCostModifiers() {
-        return COST_MODIFIERS;
-    }
-
-    @Nullable
-    @Override
-    Action getAction(@AppAction int actionId) {
-        return mActions.get(actionId);
-    }
-
-    @Nullable
-    @Override
-    Reward getReward(@UtilityReward int rewardId) {
-        return mRewards.get(rewardId);
-    }
-
-    private void loadConstants(String policyValuesString,
-            @Nullable DeviceConfig.Properties properties) {
-        mActions.clear();
-        mRewards.clear();
-
-        try {
-            mUserSettingDeviceConfigMediator.setSettingsString(policyValuesString);
-            mUserSettingDeviceConfigMediator.setDeviceConfigProperties(properties);
-        } catch (IllegalArgumentException e) {
-            Slog.e(TAG, "Global setting key incorrect: ", e);
-        }
-
-        mMinSatiatedBalanceOther = getConstantAsCake(
-            KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES);
-        mMinSatiatedBalanceHeadlessSystemApp = getConstantAsCake(
-                KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
-                DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
-                mMinSatiatedBalanceOther);
-        mMinSatiatedBalanceExempted = getConstantAsCake(
-                KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED,
-                DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
-                mMinSatiatedBalanceHeadlessSystemApp);
-        mMinSatiatedBalanceIncrementalAppUpdater = getConstantAsCake(
-                KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER,
-                DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES);
-        mMaxSatiatedBalance = getConstantAsCake(
-            KEY_JS_MAX_SATIATED_BALANCE, DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
-            Math.max(arcToCake(1), mMinSatiatedBalanceExempted));
-        mMinSatiatedConsumptionLimit = getConstantAsCake(
-                KEY_JS_MIN_CONSUMPTION_LIMIT, DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES,
-                arcToCake(1));
-        mInitialSatiatedConsumptionLimit = getConstantAsCake(
-                KEY_JS_INITIAL_CONSUMPTION_LIMIT, DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES,
-                mMinSatiatedConsumptionLimit);
-        mMaxSatiatedConsumptionLimit = getConstantAsCake(
-                KEY_JS_MAX_CONSUMPTION_LIMIT, DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES,
-                mInitialSatiatedConsumptionLimit);
-
-        mActions.put(ACTION_JOB_MAX_START, new Action(ACTION_JOB_MAX_START,
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_MAX_START_CTP,
-                        DEFAULT_JS_ACTION_JOB_MAX_START_CTP_CAKES),
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_MAX_START_BASE_PRICE,
-                        DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE_CAKES)));
-        mActions.put(ACTION_JOB_MAX_RUNNING, new Action(ACTION_JOB_MAX_RUNNING,
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_MAX_RUNNING_CTP,
-                        DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP_CAKES),
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE,
-                        DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE_CAKES)));
-        mActions.put(ACTION_JOB_HIGH_START, new Action(ACTION_JOB_HIGH_START,
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_HIGH_START_CTP,
-                        DEFAULT_JS_ACTION_JOB_HIGH_START_CTP_CAKES),
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_HIGH_START_BASE_PRICE,
-                        DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE_CAKES)));
-        mActions.put(ACTION_JOB_HIGH_RUNNING, new Action(ACTION_JOB_HIGH_RUNNING,
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_HIGH_RUNNING_CTP,
-                        DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP_CAKES),
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE,
-                        DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE_CAKES)));
-        mActions.put(ACTION_JOB_DEFAULT_START, new Action(ACTION_JOB_DEFAULT_START,
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_DEFAULT_START_CTP,
-                        DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP_CAKES),
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE,
-                        DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE_CAKES)));
-        mActions.put(ACTION_JOB_DEFAULT_RUNNING, new Action(ACTION_JOB_DEFAULT_RUNNING,
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_DEFAULT_RUNNING_CTP,
-                        DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP_CAKES),
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE,
-                        DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE_CAKES)));
-        mActions.put(ACTION_JOB_LOW_START, new Action(ACTION_JOB_LOW_START,
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_LOW_START_CTP,
-                        DEFAULT_JS_ACTION_JOB_LOW_START_CTP_CAKES),
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_LOW_START_BASE_PRICE,
-                        DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE_CAKES)));
-        mActions.put(ACTION_JOB_LOW_RUNNING, new Action(ACTION_JOB_LOW_RUNNING,
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_LOW_RUNNING_CTP,
-                        DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP_CAKES),
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE,
-                        DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE_CAKES)));
-        mActions.put(ACTION_JOB_MIN_START, new Action(ACTION_JOB_MIN_START,
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_MIN_START_CTP,
-                        DEFAULT_JS_ACTION_JOB_MIN_START_CTP_CAKES),
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_MIN_START_BASE_PRICE,
-                        DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE_CAKES)));
-        mActions.put(ACTION_JOB_MIN_RUNNING, new Action(ACTION_JOB_MIN_RUNNING,
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_MIN_RUNNING_CTP,
-                        DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP_CAKES),
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE,
-                        DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE_CAKES)));
-        mActions.put(ACTION_JOB_TIMEOUT, new Action(ACTION_JOB_TIMEOUT,
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP,
-                        DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP_CAKES),
-                getConstantAsCake(
-                        KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE,
-                        DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE_CAKES)));
-
-        mRewards.put(REWARD_TOP_ACTIVITY, new Reward(REWARD_TOP_ACTIVITY,
-                getConstantAsCake(
-                        KEY_JS_REWARD_TOP_ACTIVITY_INSTANT,
-                        DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT_CAKES),
-                getConstantAsCake(
-                        KEY_JS_REWARD_TOP_ACTIVITY_ONGOING,
-                        DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING_CAKES),
-                getConstantAsCake(
-                        KEY_JS_REWARD_TOP_ACTIVITY_MAX,
-                        DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX_CAKES)));
-        mRewards.put(REWARD_NOTIFICATION_SEEN, new Reward(REWARD_NOTIFICATION_SEEN,
-                getConstantAsCake(
-                        KEY_JS_REWARD_NOTIFICATION_SEEN_INSTANT,
-                        DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES),
-                getConstantAsCake(
-                        KEY_JS_REWARD_NOTIFICATION_SEEN_ONGOING,
-                        DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES),
-                getConstantAsCake(
-                        KEY_JS_REWARD_NOTIFICATION_SEEN_MAX,
-                        DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX_CAKES)));
-        mRewards.put(REWARD_NOTIFICATION_INTERACTION,
-                new Reward(REWARD_NOTIFICATION_INTERACTION,
-                        getConstantAsCake(
-                                KEY_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT,
-                                DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES),
-                        getConstantAsCake(
-                                KEY_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING,
-                                DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES),
-                        getConstantAsCake(
-                                KEY_JS_REWARD_NOTIFICATION_INTERACTION_MAX,
-                                DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES)));
-        mRewards.put(REWARD_WIDGET_INTERACTION, new Reward(REWARD_WIDGET_INTERACTION,
-                getConstantAsCake(
-                        KEY_JS_REWARD_WIDGET_INTERACTION_INSTANT,
-                        DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT_CAKES),
-                getConstantAsCake(
-                        KEY_JS_REWARD_WIDGET_INTERACTION_ONGOING,
-                        DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING_CAKES),
-                getConstantAsCake(
-                        KEY_JS_REWARD_WIDGET_INTERACTION_MAX,
-                        DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX_CAKES)));
-        mRewards.put(REWARD_OTHER_USER_INTERACTION,
-                new Reward(REWARD_OTHER_USER_INTERACTION,
-                        getConstantAsCake(
-                                KEY_JS_REWARD_OTHER_USER_INTERACTION_INSTANT,
-                                DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES),
-                        getConstantAsCake(
-                                KEY_JS_REWARD_OTHER_USER_INTERACTION_ONGOING,
-                                DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES),
-                        getConstantAsCake(
-                                KEY_JS_REWARD_OTHER_USER_INTERACTION_MAX,
-                                DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX_CAKES)));
-        mRewards.put(REWARD_APP_INSTALL,
-                new Reward(REWARD_APP_INSTALL,
-                        getConstantAsCake(
-                                KEY_JS_REWARD_APP_INSTALL_INSTANT,
-                                DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES),
-                        getConstantAsCake(
-                                KEY_JS_REWARD_APP_INSTALL_ONGOING,
-                                DEFAULT_JS_REWARD_APP_INSTALL_ONGOING_CAKES),
-                        getConstantAsCake(
-                                KEY_JS_REWARD_APP_INSTALL_MAX,
-                                DEFAULT_JS_REWARD_APP_INSTALL_MAX_CAKES)));
-    }
-
-    @Override
-    void dump(IndentingPrintWriter pw) {
-        pw.println("Min satiated balance:");
-        pw.increaseIndent();
-        pw.print("Exempted", cakeToString(mMinSatiatedBalanceExempted)).println();
-        pw.print("Other", cakeToString(mMinSatiatedBalanceOther)).println();
-        pw.print("+App Updater", cakeToString(mMinSatiatedBalanceIncrementalAppUpdater)).println();
-        pw.decreaseIndent();
-        pw.print("Max satiated balance", cakeToString(mMaxSatiatedBalance)).println();
-        pw.print("Consumption limits: [");
-        pw.print(cakeToString(mMinSatiatedConsumptionLimit));
-        pw.print(", ");
-        pw.print(cakeToString(mInitialSatiatedConsumptionLimit));
-        pw.print(", ");
-        pw.print(cakeToString(mMaxSatiatedConsumptionLimit));
-        pw.println("]");
-
-        pw.println();
-        pw.println("Actions:");
-        pw.increaseIndent();
-        for (int i = 0; i < mActions.size(); ++i) {
-            dumpAction(pw, mActions.valueAt(i));
-        }
-        pw.decreaseIndent();
-
-        pw.println();
-        pw.println("Rewards:");
-        pw.increaseIndent();
-        for (int i = 0; i < mRewards.size(); ++i) {
-            dumpReward(pw, mRewards.valueAt(i));
-        }
-        pw.decreaseIndent();
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Ledger.java b/apex/jobscheduler/service/java/com/android/server/tare/Ledger.java
deleted file mode 100644
index 92b21e1..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/Ledger.java
+++ /dev/null
@@ -1,322 +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.server.tare;
-
-import static android.text.format.DateUtils.HOUR_IN_MILLIS;
-import static android.util.TimeUtils.dumpTime;
-
-import static com.android.server.tare.TareUtils.cakeToString;
-import static com.android.server.tare.TareUtils.getCurrentTimeMillis;
-
-import android.annotation.CurrentTimeMillisLong;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.Build;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.SparseLongArray;
-import android.util.TimeUtils;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Ledger to track the last recorded balance and recent activities of an app.
- */
-class Ledger {
-    private static final String TAG = "TARE-" + Ledger.class.getSimpleName();
-    private static final boolean DEBUG = InternalResourceService.DEBUG
-            || Log.isLoggable(TAG, Log.DEBUG);
-
-    /** The window size within which rewards will be counted and used towards reward limiting. */
-    private static final long TOTAL_REWARD_WINDOW_MS = 24 * HOUR_IN_MILLIS;
-    /** The number of buckets to split {@link #TOTAL_REWARD_WINDOW_MS} into. */
-    @VisibleForTesting
-    static final int NUM_REWARD_BUCKET_WINDOWS = 4;
-    /**
-     * The duration size of each bucket resulting from splitting {@link #TOTAL_REWARD_WINDOW_MS}
-     * into smaller buckets.
-     */
-    private static final long REWARD_BUCKET_WINDOW_SIZE_MS =
-            TOTAL_REWARD_WINDOW_MS / NUM_REWARD_BUCKET_WINDOWS;
-    /** The maximum number of transactions to retain in memory at any one time. */
-    @VisibleForTesting
-    static final int MAX_TRANSACTION_COUNT = Build.IS_ENG || Build.IS_USERDEBUG || DEBUG ? 32 : 4;
-
-    static class Transaction {
-        public final long startTimeMs;
-        public final long endTimeMs;
-        public final int eventId;
-        @Nullable
-        public final String tag;
-        public final long delta;
-        public final long ctp;
-
-        Transaction(long startTimeMs, long endTimeMs,
-                int eventId, @Nullable String tag, long delta, long ctp) {
-            this.startTimeMs = startTimeMs;
-            this.endTimeMs = endTimeMs;
-            this.eventId = eventId;
-            this.tag = tag == null ? null : tag.intern();
-            this.delta = delta;
-            this.ctp = ctp;
-        }
-    }
-
-    static class RewardBucket {
-        @CurrentTimeMillisLong
-        public long startTimeMs;
-        public final SparseLongArray cumulativeDelta = new SparseLongArray();
-
-        private void reset() {
-            startTimeMs = 0;
-            cumulativeDelta.clear();
-        }
-    }
-
-    /** Last saved balance. This doesn't take currently ongoing events into account. */
-    private long mCurrentBalance = 0;
-    private final Transaction[] mTransactions = new Transaction[MAX_TRANSACTION_COUNT];
-    /** Index within {@link #mTransactions} where the next transaction should be placed. */
-    private int mTransactionIndex = 0;
-    private final RewardBucket[] mRewardBuckets = new RewardBucket[NUM_REWARD_BUCKET_WINDOWS];
-    /** Index within {@link #mRewardBuckets} of the current active bucket. */
-    private int mRewardBucketIndex = 0;
-
-    Ledger() {
-    }
-
-    Ledger(long currentBalance, @NonNull List<Transaction> transactions,
-            @NonNull List<RewardBucket> rewardBuckets) {
-        mCurrentBalance = currentBalance;
-
-        final int numTxs = transactions.size();
-        for (int i = Math.max(0, numTxs - MAX_TRANSACTION_COUNT); i < numTxs; ++i) {
-            mTransactions[mTransactionIndex++] = transactions.get(i);
-        }
-        mTransactionIndex %= MAX_TRANSACTION_COUNT;
-
-        final int numBuckets = rewardBuckets.size();
-        if (numBuckets > 0) {
-            // Set the index to -1 so that we put the first bucket in index 0.
-            mRewardBucketIndex = -1;
-            for (int i = Math.max(0, numBuckets - NUM_REWARD_BUCKET_WINDOWS); i < numBuckets; ++i) {
-                mRewardBuckets[++mRewardBucketIndex] = rewardBuckets.get(i);
-            }
-        }
-    }
-
-    long getCurrentBalance() {
-        return mCurrentBalance;
-    }
-
-    @Nullable
-    Transaction getEarliestTransaction() {
-        for (int t = 0; t < mTransactions.length; ++t) {
-            final Transaction transaction =
-                    mTransactions[(mTransactionIndex + t) % mTransactions.length];
-            if (transaction != null) {
-                return transaction;
-            }
-        }
-        return null;
-    }
-
-    @NonNull
-    List<RewardBucket> getRewardBuckets() {
-        final long cutoffMs = getCurrentTimeMillis() - TOTAL_REWARD_WINDOW_MS;
-        final List<RewardBucket> list = new ArrayList<>(NUM_REWARD_BUCKET_WINDOWS);
-        for (int i = 1; i <= NUM_REWARD_BUCKET_WINDOWS; ++i) {
-            final int idx = (mRewardBucketIndex + i) % NUM_REWARD_BUCKET_WINDOWS;
-            final RewardBucket rewardBucket = mRewardBuckets[idx];
-            if (rewardBucket != null) {
-                if (cutoffMs <= rewardBucket.startTimeMs) {
-                    list.add(rewardBucket);
-                } else {
-                    rewardBucket.reset();
-                }
-            }
-        }
-        return list;
-    }
-
-    @NonNull
-    List<Transaction> getTransactions() {
-        final List<Transaction> list = new ArrayList<>(MAX_TRANSACTION_COUNT);
-        for (int i = 0; i < MAX_TRANSACTION_COUNT; ++i) {
-            final int idx = (mTransactionIndex + i) % MAX_TRANSACTION_COUNT;
-            final Transaction transaction = mTransactions[idx];
-            if (transaction != null) {
-                list.add(transaction);
-            }
-        }
-        return list;
-    }
-
-    void recordTransaction(@NonNull Transaction transaction) {
-        mTransactions[mTransactionIndex] = transaction;
-        mCurrentBalance += transaction.delta;
-        mTransactionIndex = (mTransactionIndex + 1) % MAX_TRANSACTION_COUNT;
-
-        if (EconomicPolicy.isReward(transaction.eventId)) {
-            final RewardBucket bucket = getCurrentRewardBucket();
-            bucket.cumulativeDelta.put(transaction.eventId,
-                    bucket.cumulativeDelta.get(transaction.eventId, 0) + transaction.delta);
-        }
-    }
-
-    @NonNull
-    private RewardBucket getCurrentRewardBucket() {
-        RewardBucket bucket = mRewardBuckets[mRewardBucketIndex];
-        final long now = getCurrentTimeMillis();
-        if (bucket == null) {
-            bucket = new RewardBucket();
-            bucket.startTimeMs = now;
-            mRewardBuckets[mRewardBucketIndex] = bucket;
-            return bucket;
-        }
-
-        if (now - bucket.startTimeMs < REWARD_BUCKET_WINDOW_SIZE_MS) {
-            return bucket;
-        }
-
-        mRewardBucketIndex = (mRewardBucketIndex + 1) % NUM_REWARD_BUCKET_WINDOWS;
-        bucket = mRewardBuckets[mRewardBucketIndex];
-        if (bucket == null) {
-            bucket = new RewardBucket();
-            mRewardBuckets[mRewardBucketIndex] = bucket;
-        }
-        bucket.reset();
-        // Using now as the start time means there will be some gaps between sequential buckets,
-        // but makes processing of large gaps between events easier.
-        bucket.startTimeMs = now;
-        return bucket;
-    }
-
-    long get24HourSum(int eventId, final long now) {
-        final long windowStartTime = now - 24 * HOUR_IN_MILLIS;
-        long sum = 0;
-        for (int i = 0; i < mRewardBuckets.length; ++i) {
-            final RewardBucket bucket = mRewardBuckets[i];
-            if (bucket != null
-                    && bucket.startTimeMs >= windowStartTime && bucket.startTimeMs < now) {
-                sum += bucket.cumulativeDelta.get(eventId, 0);
-            }
-        }
-        return sum;
-    }
-
-    /**
-     * Deletes transactions that are older than {@code minAgeMs}.
-     * @return The earliest transaction in the ledger, or {@code null} if there are no more
-     * transactions.
-     */
-    @Nullable
-    Transaction removeOldTransactions(long minAgeMs) {
-        final long cutoff = getCurrentTimeMillis() - minAgeMs;
-        for (int t = 0; t < mTransactions.length; ++t) {
-            final int idx = (mTransactionIndex + t) % mTransactions.length;
-            final Transaction transaction = mTransactions[idx];
-            if (transaction == null) {
-                continue;
-            }
-            if (transaction.endTimeMs <= cutoff) {
-                mTransactions[idx] = null;
-            } else {
-                // Everything we look at after this transaction will also be within the window,
-                // so no need to go further.
-                return transaction;
-            }
-        }
-        return null;
-    }
-
-    void dump(IndentingPrintWriter pw, int numRecentTransactions) {
-        pw.print("Current balance", cakeToString(getCurrentBalance())).println();
-        pw.println();
-
-        boolean printedTransactionTitle = false;
-        for (int t = 0; t < Math.min(MAX_TRANSACTION_COUNT, numRecentTransactions); ++t) {
-            final int idx = (mTransactionIndex + t) % MAX_TRANSACTION_COUNT;
-            final Transaction transaction = mTransactions[idx];
-            if (transaction == null) {
-                continue;
-            }
-
-            if (!printedTransactionTitle) {
-                pw.println("Transactions:");
-                pw.increaseIndent();
-                printedTransactionTitle = true;
-            }
-
-            dumpTime(pw, transaction.startTimeMs);
-            pw.print("--");
-            dumpTime(pw, transaction.endTimeMs);
-            pw.print(": ");
-            pw.print(EconomicPolicy.eventToString(transaction.eventId));
-            if (transaction.tag != null) {
-                pw.print("(");
-                pw.print(transaction.tag);
-                pw.print(")");
-            }
-            pw.print(" --> ");
-            pw.print(cakeToString(transaction.delta));
-            pw.print(" (ctp=");
-            pw.print(cakeToString(transaction.ctp));
-            pw.println(")");
-        }
-        if (printedTransactionTitle) {
-            pw.decreaseIndent();
-            pw.println();
-        }
-
-        final long now = getCurrentTimeMillis();
-        boolean printedBucketTitle = false;
-        for (int b = 0; b < NUM_REWARD_BUCKET_WINDOWS; ++b) {
-            final int idx = (mRewardBucketIndex - b + NUM_REWARD_BUCKET_WINDOWS)
-                    % NUM_REWARD_BUCKET_WINDOWS;
-            final RewardBucket rewardBucket = mRewardBuckets[idx];
-            if (rewardBucket == null || rewardBucket.startTimeMs == 0) {
-                continue;
-            }
-
-            if (!printedBucketTitle) {
-                pw.println("Reward buckets:");
-                pw.increaseIndent();
-                printedBucketTitle = true;
-            }
-
-            dumpTime(pw, rewardBucket.startTimeMs);
-            pw.print(" (");
-            TimeUtils.formatDuration(now - rewardBucket.startTimeMs, pw);
-            pw.println(" ago):");
-            pw.increaseIndent();
-            for (int r = 0; r < rewardBucket.cumulativeDelta.size(); ++r) {
-                pw.print(EconomicPolicy.eventToString(rewardBucket.cumulativeDelta.keyAt(r)));
-                pw.print(": ");
-                pw.println(cakeToString(rewardBucket.cumulativeDelta.valueAt(r)));
-            }
-            pw.decreaseIndent();
-        }
-        if (printedBucketTitle) {
-            pw.decreaseIndent();
-            pw.println();
-        }
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Modifier.java b/apex/jobscheduler/service/java/com/android/server/tare/Modifier.java
deleted file mode 100644
index 311b6cb..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/Modifier.java
+++ /dev/null
@@ -1,70 +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.server.tare;
-
-import android.annotation.IntDef;
-import android.util.IndentingPrintWriter;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Base class of a modifier that can affect end pricing.
- */
-abstract class Modifier {
-    static final int COST_MODIFIER_CHARGING = 0;
-    static final int COST_MODIFIER_DEVICE_IDLE = 1;
-    static final int COST_MODIFIER_POWER_SAVE_MODE = 2;
-    static final int COST_MODIFIER_PROCESS_STATE = 3;
-    static final int NUM_COST_MODIFIERS = COST_MODIFIER_PROCESS_STATE + 1;
-
-    @IntDef({
-            COST_MODIFIER_CHARGING,
-            COST_MODIFIER_DEVICE_IDLE,
-            COST_MODIFIER_POWER_SAVE_MODE,
-            COST_MODIFIER_PROCESS_STATE,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface CostModifier {
-    }
-
-    /**
-     * Returns a modified cost to produce based on the modifier's state.
-     *
-     * @param ctp Current cost to produce
-     */
-    long getModifiedCostToProduce(long ctp) {
-        return ctp;
-    }
-
-    /**
-     * Returns a modified price based on the modifier's state.
-     *
-     * @param price Current price
-     */
-    long getModifiedPrice(long price) {
-        return price;
-    }
-
-    void setup() {
-    }
-
-    void tearDown() {
-    }
-
-    abstract void dump(IndentingPrintWriter pw);
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/OWNERS b/apex/jobscheduler/service/java/com/android/server/tare/OWNERS
deleted file mode 100644
index 96ec75f..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
\ No newline at end of file
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java
deleted file mode 100644
index 542bfd1..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java
+++ /dev/null
@@ -1,124 +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.server.tare;
-
-import android.annotation.NonNull;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.PowerManager;
-import android.os.SystemClock;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Slog;
-
-/** Modifier that makes things more expensive in adaptive and full battery saver are active. */
-class PowerSaveModeModifier extends Modifier {
-    private static final String TAG = "TARE-" + PowerSaveModeModifier.class.getSimpleName();
-    private static final boolean DEBUG = InternalResourceService.DEBUG
-            || Log.isLoggable(TAG, Log.DEBUG);
-
-    private final InternalResourceService mIrs;
-    private final PowerSaveModeTracker mPowerSaveModeTracker;
-
-    PowerSaveModeModifier(@NonNull InternalResourceService irs) {
-        super();
-        mIrs = irs;
-        mPowerSaveModeTracker = new PowerSaveModeTracker();
-    }
-
-    @Override
-    public void setup() {
-        mPowerSaveModeTracker.startTracking(mIrs.getContext());
-    }
-
-    @Override
-    public void tearDown() {
-        mPowerSaveModeTracker.stopTracking(mIrs.getContext());
-    }
-
-    @Override
-    long getModifiedCostToProduce(long ctp) {
-        if (mPowerSaveModeTracker.mPowerSaveModeEnabled) {
-            return (long) (1.5 * ctp);
-        }
-        // TODO: get adaptive power save mode
-        if (mPowerSaveModeTracker.mPowerSaveModeEnabled) {
-            return (long) (1.25 * ctp);
-        }
-        return ctp;
-    }
-
-    @Override
-    void dump(IndentingPrintWriter pw) {
-        pw.print("power save=");
-        pw.println(mPowerSaveModeTracker.mPowerSaveModeEnabled);
-    }
-
-    // TODO: migrate to relying on PowerSaveState and ServiceType.TARE
-    private final class PowerSaveModeTracker extends BroadcastReceiver {
-        private boolean mIsSetup = false;
-
-        private final PowerManager mPowerManager;
-        private volatile boolean mPowerSaveModeEnabled;
-
-        private PowerSaveModeTracker() {
-            mPowerManager = mIrs.getContext().getSystemService(PowerManager.class);
-        }
-
-        public void startTracking(@NonNull Context context) {
-            if (mIsSetup) {
-                return;
-            }
-
-            final IntentFilter filter = new IntentFilter();
-            filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
-            context.registerReceiver(this, filter);
-
-            // Initialise tracker state.
-            mPowerSaveModeEnabled = mPowerManager.isPowerSaveMode();
-
-            mIsSetup = true;
-        }
-
-        public void stopTracking(@NonNull Context context) {
-            if (!mIsSetup) {
-                return;
-            }
-
-            context.unregisterReceiver(this);
-            mIsSetup = false;
-        }
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            final String action = intent.getAction();
-            if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
-                final boolean enabled = mPowerManager.isPowerSaveMode();
-                if (DEBUG) {
-                    Slog.d(TAG, "Power save mode changed to " + enabled
-                            + ", fired @ " + SystemClock.elapsedRealtime());
-                }
-                if (mPowerSaveModeEnabled != enabled) {
-                    mPowerSaveModeEnabled = enabled;
-                    mIrs.onDeviceStateChanged();
-                }
-            }
-        }
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/ProcessStateModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/ProcessStateModifier.java
deleted file mode 100644
index 58536675..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/ProcessStateModifier.java
+++ /dev/null
@@ -1,176 +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.server.tare;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.app.ActivityManager;
-import android.app.IUidObserver;
-import android.app.UidObserver;
-import android.os.RemoteException;
-import android.util.IndentingPrintWriter;
-import android.util.Slog;
-import android.util.SparseArrayMap;
-import android.util.SparseIntArray;
-
-import com.android.internal.annotations.GuardedBy;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/** Modifier that makes things more cheaper based on an app's process state. */
-class ProcessStateModifier extends Modifier {
-    private static final String TAG = "TARE-" + ProcessStateModifier.class.getSimpleName();
-
-    private static final int PROC_STATE_BUCKET_NONE = 0;
-    private static final int PROC_STATE_BUCKET_TOP = 1;
-    private static final int PROC_STATE_BUCKET_FGS = 2;
-    private static final int PROC_STATE_BUCKET_BFGS = 3;
-    private static final int PROC_STATE_BUCKET_BG = 4;
-
-    @IntDef(prefix = {"PROC_STATE_BUCKET_"}, value = {
-            PROC_STATE_BUCKET_NONE,
-            PROC_STATE_BUCKET_TOP,
-            PROC_STATE_BUCKET_FGS,
-            PROC_STATE_BUCKET_BFGS,
-            PROC_STATE_BUCKET_BG
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface ProcStateBucket {
-    }
-
-    private final Object mLock = new Object();
-    private final InternalResourceService mIrs;
-
-    /** Cached mapping of userId+package to their UIDs (for all users) */
-    private final SparseArrayMap<String, Integer> mPackageToUidCache = new SparseArrayMap<>();
-
-    @GuardedBy("mLock")
-    private final SparseIntArray mUidProcStateBucketCache = new SparseIntArray();
-
-    private final IUidObserver mUidObserver = new UidObserver() {
-        @Override
-        public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
-            final int newBucket = getProcStateBucket(procState);
-            synchronized (mLock) {
-                final int curBucket = mUidProcStateBucketCache.get(uid);
-                if (curBucket != newBucket) {
-                    mUidProcStateBucketCache.put(uid, newBucket);
-                }
-                notifyStateChangedLocked(uid);
-            }
-        }
-
-        @Override
-        public void onUidGone(int uid, boolean disabled) {
-            synchronized (mLock) {
-                if (mUidProcStateBucketCache.indexOfKey(uid) < 0) {
-                    Slog.e(TAG, "UID " + uid + " marked gone but wasn't in cache.");
-                    return;
-                }
-                mUidProcStateBucketCache.delete(uid);
-                notifyStateChangedLocked(uid);
-            }
-        }
-    };
-
-    ProcessStateModifier(@NonNull InternalResourceService irs) {
-        super();
-        mIrs = irs;
-    }
-
-    @Override
-    @GuardedBy("mLock")
-    void setup() {
-        try {
-            ActivityManager.getService().registerUidObserver(mUidObserver,
-                    ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE,
-                    ActivityManager.PROCESS_STATE_UNKNOWN, null);
-        } catch (RemoteException e) {
-            // ignored; both services live in system_server
-        }
-    }
-
-    @Override
-    @GuardedBy("mLock")
-    void tearDown() {
-        try {
-            ActivityManager.getService().unregisterUidObserver(mUidObserver);
-        } catch (RemoteException e) {
-            // ignored; both services live in system_server
-        }
-        mPackageToUidCache.clear();
-        mUidProcStateBucketCache.clear();
-    }
-
-    /**
-     * Get the final modified price based on an app's process state.
-     *
-     * @param ctp   Cost to produce. @see EconomicPolicy.Action#costToProduce
-     * @param price Current price
-     */
-    long getModifiedPrice(final int userId, @NonNull final String pkgName,
-            final long ctp, final long price) {
-        final int procState;
-        synchronized (mLock) {
-            procState = mUidProcStateBucketCache.get(
-                    mIrs.getUid(userId, pkgName), PROC_STATE_BUCKET_NONE);
-        }
-        switch (procState) {
-            case PROC_STATE_BUCKET_TOP:
-                return 0;
-            case PROC_STATE_BUCKET_FGS:
-                // Can't get notification priority. Just use CTP for now.
-                return Math.min(ctp, price);
-            case PROC_STATE_BUCKET_BFGS:
-                if (price <= ctp) {
-                    return price;
-                }
-                return (long) (ctp + .5 * (price - ctp));
-            case PROC_STATE_BUCKET_BG:
-            default:
-                return price;
-        }
-    }
-
-    @Override
-    @GuardedBy("mLock")
-    void dump(IndentingPrintWriter pw) {
-        pw.print("Proc state bucket cache = ");
-        pw.println(mUidProcStateBucketCache);
-    }
-
-    @ProcStateBucket
-    private int getProcStateBucket(int procState) {
-        if (procState <= ActivityManager.PROCESS_STATE_TOP) {
-            return PROC_STATE_BUCKET_TOP;
-        }
-        if (procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
-            return PROC_STATE_BUCKET_FGS;
-        }
-        if (procState <= ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE) {
-            return PROC_STATE_BUCKET_BFGS;
-        }
-        return PROC_STATE_BUCKET_BG;
-    }
-
-    @GuardedBy("mLock")
-    private void notifyStateChangedLocked(final int uid) {
-        // Never call out to the IRS with the local lock held.
-        TareHandlerThread.getHandler().post(() -> mIrs.onUidStateChanged(uid));
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/README.md b/apex/jobscheduler/service/java/com/android/server/tare/README.md
deleted file mode 100644
index 8d25ecc..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/README.md
+++ /dev/null
@@ -1,153 +0,0 @@
-# Overview
-
-Welcome to The Android Resource Economy (TARE for short). If you're reading this, you may be
-wondering what all of this code is for and what it means. TARE is an attempt to apply economic
-principles to resource (principally battery) management. It acknowledges that battery is a limited
-resource on mobile devices and that the system must allocate and apportion those resources
-accordingly. Every action (running a job, firing an alarm, using the network, using the CPU, etc.)
-has a cost. Once that action has been performed and that bit of battery has been drained, it's no
-longer available for someone else (another app) to use until the user charges the device again.
-
-The key tenets of TARE are:
-
-1. Charge for actions --- when an app performs an action, reduce its access to resources in the
-   future. This should help remind everyone that everything they do has a cost.
-1. Reward for good actions --- reward and encourage behavior that provides value to the user
-1. Fine bad actions --- fine and discourage behavior that is bad for the user
-
-In an ideal world, the system could be said to most efficiently allocate resources by maximizing its
-profits &mdash; by maximizing the aggregate sum of the difference between an action's price (that
-the app ends up paying) and the cost to produce by the system. This assumes that more important
-actions have a higher price than less important actions and all actors have perfect information and
-convey that information accurately. With these assumptions, maximizing profits implies that the
-system runs the most important work first and proceeds in decreasing order of importance. Of course,
-that also means the system will not run anything where an app would pay less for the action than the
-system's cost to produce that action. Some of this breaks down when we throw TOP apps into the mix
-&mdash; TOP apps pay 0 for all actions, even though the CTP may be greater than 0. This is to ensure
-ideal user experience for the app the user is actively interacting with. Similar caveats exist for
-system-critical processes (such as the OS itself) and apps running foreground services (since those
-could be critical to user experience, as is the case for media and navigation apps). Excluding those
-caveats/special situations, maximizing profits of actions performed by apps in the background should
-be the target.
-
-To achieve the goal laid out by TARE, we use Android Resource Credits (ARCs for short) as the
-internal/representative currency of the system.
-
-## How do ARCs work?
-
-ARCs are required to perform any action while in the background. Some actions may have a fixed cost.
-Others may be more dynamic (some may even allow apps to bid higher ARCs for some actions to have
-them prioritized). If the app doesn't have enough ARCs, the action can't be performed. Apps are
-granted ARCs (below a certain threshold) as the device charges. Apps are also granted ARCs for
-providing user value (eg. for doing things that engage the user).
-
-ARCs will be used across the entire system as one unified concept. When an app performs an action,
-it pulls from the same account, regardless of the action. This means that apps can choose to do more
-of one action in lieu of being able to do as much of another. For example, an app can choose to use
-all of its ARCs for jobs if it doesn't want to schedule any alarms.
-
-### Scaling
-
-With the ARC system, we can limit the total number of ARCs in circulation, thus limiting how much
-total work can be done, regardless of how many apps the user has installed.
-
-## EconomicPolicy
-
-An EconomicPolicy defines the actions and rewards a specific subsystem makes use of. Each subsystem
-will likely have a unique set of actions that apps can perform, and may choose to reward apps for
-certain behaviors. Generally, the app should be rewarded with ARCs for behaviors that indicate that
-the app provided value to the user. The current set of behaviors that apps may be rewarded for
-include 1) a user seeing a notification, 2) a user interacting with a notification, 3) the user
-opening the app and/or staying in the app for some period of time, 4) the user interacting with a
-widget, and 5) the user explicitly interacting with the app in some other way. These behaviors may
-change as we determine better ways of identifying providing value to the user and/or user desire for
-the app to perform the actions it's requesting.
-
-### Consumption Limit
-
-The consumption limit represents the maximum amount of resources available to be consumed. When the
-battery is satiated (at 100%), then the amount of resources available to be consumed is equal to the
-consumption limit. Each action has a cost to produce that action. When the action is performed,
-those resources are consumed. Thus, when an action is performed, the action's CTP is deducted from
-the remaining amount of resources available. In keeping with the tenet that resources are limited
-and ARCs are a proxy for battery consumption, the amount of resources available to be consumed are
-adjusted as the battery level changes. That is, the consumption limit is scaled based on the current
-battery level, and if the amount currently available to be consumed is greater than the scaled
-consumption limit, then the available resources are decreased to match the scaled limit.
-
-### Regulation
-
-Regulations are unique events invoked by the ~~government~~ system in order to get the whole economy
-moving smoothly.
-
-# Significant Changes
-
-## Tare Improvement Proposal #1 (TIP1)
-
-The initial implementation/proposal combined the supply of resources with the allocation in a single
-mechanism. It defined the maximum number of resources (ARCs) available at a time, and then divided
-(allocated) that number among the installed apps, intending to have some left over that could be
-allocated as part of the rewards. There were several problems with that mechanism:
-
-1. Not all apps used their credits, which meant that allocating credits to those packages
-   effectively permanently reduced the number of usable/re-allocatable ARCs.
-1. Having a global maximum circulation spread across multiple apps meant that as more apps were
-   installed, the allocation to each app decreased. Eventually (with enough apps installed), no app
-   would be given enough credits to perform any actions.
-
-These problems effectively meant that misallocation was a big problem, demand wasn't well reflected,
-and some apps may not have been able to perform work even though they otherwise should have been.
-
-TIP1 separated allocation (to apps) from supply (by the system) and
-allowed apps to accrue credits as appropriate while still limiting the total number of credits
-consumed.
-
-## Tare Improvement Proposal #3 (TIP3)
-
-TIP1 introduced Consumption Limits, which control the total number of ARCs that can be used to
-perform actions, based on the production costs of each action. The Consumption Limits were initially
-determined manually, but could increase in the system if apps used the full consumption limit before
-the device had drained to 50% battery. As with any system that relies on manually deciding
-parameters, the only mechanism to identify an optimal value is through experimentation, which can
-take many iterations and requires extended periods of time to observe results. The limits are also
-chosen and adjusted without consideration of the resulting battery drain of each possible value. In
-addition, having the system potentially increase the limit without considering a decrease introduced
-potential for battery life to get worse as time goes on and the user installed more background-work
-demanding apps.
-
-TIP3 uses a target background battery drain rate to dynamically adjust the Consumption Limit.
-
-# Potential Future Changes
-
-These are some ideas for further changes. There's no guarantee that they'll be implemented.
-
-* Include additional components and policies for them. TARE may benefit from adding policies for
-  components such as broadcast dispatching, network traffic, location requests, and sensor usage.
-* Have a separate "account" for critical/special actions. In other words, have two accounts for each
-  app, where one acts like a special savings account and is only allowed to be used for special
-  actions such as expedited job execution. The second account would have a lower maximum than the
-  main account, but would help to make sure that normal actions don't interfere too much with more
-  critical actions.
-* Transferring credits from one app to another. For apps that rely on others for some pieces of
-  work, it may be beneficial to allow the requesting app to transfer, donate, or somehow make
-  available some of its own credits to the app doing the work in order to make sure the working app
-  has enough credits available to do the work.
-* Formulate values based on device hardware. For example, adjust the consumption limit based on the
-  battery size, or the price and/or CTP of actions based on hardware efficiency.
-* Price discovery via an auction system. Instead of just setting a fixed price that may be modified
-  by device and app states, let an app say how much it's willing to pay for a specific action and
-  then have a small auction when the system needs to decide which app to perform the action for
-  first or how much to charge the app.
-
-# Definitions
-
-* ARC: Android Resource Credits are the "currency" units used as an abstraction layer over the real
-  battery drain. They allow the system to standardize costs and prices across various devices.
-* Cake: A lie; also the smallest unit of an ARC (1 cake = one-billionth of an ARC = 1 nano-ARC).
-  When the apps request to do something, we shall let them eat cake.
-* Cost to produce (CTP): An economic term that refers to the total cost incurred by a business to
-  produce a specific quantity of a product or offer a service. In TARE's context, CTP is meant to be
-  the estimated cost t ohe system to accomplish a certain action. These "actions" are basically APIs
-  that apps use to get something done. So the idea is to define the base cost for an app to use a
-  specific API.
-* Satiated: used to refer to when the device is fully charged (at 100% battery level)
\ No newline at end of file
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java b/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java
deleted file mode 100644
index 87e1249..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java
+++ /dev/null
@@ -1,827 +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.server.tare;
-
-import static android.app.tare.EconomyManager.ENABLED_MODE_OFF;
-import static android.text.format.DateUtils.HOUR_IN_MILLIS;
-
-import static com.android.server.tare.TareUtils.appToString;
-import static com.android.server.tare.TareUtils.cakeToString;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.Environment;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.util.ArraySet;
-import android.util.AtomicFile;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Pair;
-import android.util.Slog;
-import android.util.SparseArray;
-import android.util.SparseArrayMap;
-import android.util.SparseLongArray;
-import android.util.Xml;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.modules.utils.TypedXmlPullParser;
-import com.android.modules.utils.TypedXmlSerializer;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Maintains the current TARE state and handles writing it to disk and reading it back from disk.
- */
-public class Scribe {
-    private static final String TAG = "TARE-" + Scribe.class.getSimpleName();
-    private static final boolean DEBUG = InternalResourceService.DEBUG
-            || Log.isLoggable(TAG, Log.DEBUG);
-
-    /** The maximum number of transactions to dump per ledger. */
-    private static final int MAX_NUM_TRANSACTION_DUMP = 25;
-    /**
-     * The maximum amount of time we'll keep a transaction around for.
-     */
-    private static final long MAX_TRANSACTION_AGE_MS = 8 * 24 * HOUR_IN_MILLIS;
-
-    private static final String XML_TAG_HIGH_LEVEL_STATE = "irs-state";
-    private static final String XML_TAG_LEDGER = "ledger";
-    private static final String XML_TAG_TARE = "tare";
-    private static final String XML_TAG_TRANSACTION = "transaction";
-    private static final String XML_TAG_REWARD_BUCKET = "rewardBucket";
-    private static final String XML_TAG_USER = "user";
-    private static final String XML_TAG_PERIOD_REPORT = "report";
-
-    private static final String XML_ATTR_CTP = "ctp";
-    private static final String XML_ATTR_DELTA = "delta";
-    private static final String XML_ATTR_EVENT_ID = "eventId";
-    private static final String XML_ATTR_TAG = "tag";
-    private static final String XML_ATTR_START_TIME = "startTime";
-    private static final String XML_ATTR_END_TIME = "endTime";
-    private static final String XML_ATTR_PACKAGE_NAME = "pkgName";
-    private static final String XML_ATTR_CURRENT_BALANCE = "currentBalance";
-    private static final String XML_ATTR_USER_ID = "userId";
-    private static final String XML_ATTR_VERSION = "version";
-    private static final String XML_ATTR_LAST_RECLAMATION_TIME = "lastReclamationTime";
-    private static final String XML_ATTR_LAST_STOCK_RECALCULATION_TIME =
-            "lastStockRecalculationTime";
-    private static final String XML_ATTR_REMAINING_CONSUMABLE_CAKES = "remainingConsumableCakes";
-    private static final String XML_ATTR_CONSUMPTION_LIMIT = "consumptionLimit";
-    private static final String XML_ATTR_TIME_SINCE_FIRST_SETUP_MS = "timeSinceFirstSetup";
-    private static final String XML_ATTR_PR_DISCHARGE = "discharge";
-    private static final String XML_ATTR_PR_BATTERY_LEVEL = "batteryLevel";
-    private static final String XML_ATTR_PR_PROFIT = "profit";
-    private static final String XML_ATTR_PR_NUM_PROFIT = "numProfits";
-    private static final String XML_ATTR_PR_LOSS = "loss";
-    private static final String XML_ATTR_PR_NUM_LOSS = "numLoss";
-    private static final String XML_ATTR_PR_REWARDS = "rewards";
-    private static final String XML_ATTR_PR_NUM_REWARDS = "numRewards";
-    private static final String XML_ATTR_PR_POS_REGULATIONS = "posRegulations";
-    private static final String XML_ATTR_PR_NUM_POS_REGULATIONS = "numPosRegulations";
-    private static final String XML_ATTR_PR_NEG_REGULATIONS = "negRegulations";
-    private static final String XML_ATTR_PR_NUM_NEG_REGULATIONS = "numNegRegulations";
-    private static final String XML_ATTR_PR_SCREEN_OFF_DURATION_MS = "screenOffDurationMs";
-    private static final String XML_ATTR_PR_SCREEN_OFF_DISCHARGE_MAH = "screenOffDischargeMah";
-
-    /** Version of the file schema. */
-    private static final int STATE_FILE_VERSION = 0;
-    /** Minimum amount of time between consecutive writes. */
-    private static final long WRITE_DELAY = 30_000L;
-
-    private final AtomicFile mStateFile;
-    private final InternalResourceService mIrs;
-    private final Analyst mAnalyst;
-
-    /**
-     * The value of elapsed realtime since TARE was first setup that was read from disk.
-     * This will only be changed when the persisted file is read.
-     */
-    private long mLoadedTimeSinceFirstSetup;
-    @GuardedBy("mIrs.getLock()")
-    private long mLastReclamationTime;
-    @GuardedBy("mIrs.getLock()")
-    private long mLastStockRecalculationTime;
-    @GuardedBy("mIrs.getLock()")
-    private long mSatiatedConsumptionLimit;
-    @GuardedBy("mIrs.getLock()")
-    private long mRemainingConsumableCakes;
-    @GuardedBy("mIrs.getLock()")
-    private final SparseArrayMap<String, Ledger> mLedgers = new SparseArrayMap<>();
-    /** Offsets used to calculate the total realtime since each user was added. */
-    @GuardedBy("mIrs.getLock()")
-    private final SparseLongArray mRealtimeSinceUsersAddedOffsets = new SparseLongArray();
-
-    private final Runnable mCleanRunnable = this::cleanupLedgers;
-    private final Runnable mWriteRunnable = this::writeState;
-
-    Scribe(InternalResourceService irs, Analyst analyst) {
-        this(irs, analyst, Environment.getDataSystemDirectory());
-    }
-
-    @VisibleForTesting
-    Scribe(InternalResourceService irs, Analyst analyst, File dataDir) {
-        mIrs = irs;
-        mAnalyst = analyst;
-
-        final File tareDir = new File(dataDir, "tare");
-        //noinspection ResultOfMethodCallIgnored
-        tareDir.mkdirs();
-        mStateFile = new AtomicFile(new File(tareDir, "state.xml"), "tare");
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    void adjustRemainingConsumableCakesLocked(long delta) {
-        final long staleCakes = mRemainingConsumableCakes;
-        mRemainingConsumableCakes += delta;
-        if (mRemainingConsumableCakes < 0) {
-            Slog.w(TAG, "Overdrew consumable cakes by " + cakeToString(-mRemainingConsumableCakes));
-            // A negative value would interfere with allowing free actions, so set the minimum as 0.
-            mRemainingConsumableCakes = 0;
-        }
-        if (mRemainingConsumableCakes != staleCakes) {
-            // No point doing any work if there was no functional change.
-            postWrite();
-        }
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    void discardLedgerLocked(final int userId, @NonNull final String pkgName) {
-        mLedgers.delete(userId, pkgName);
-        postWrite();
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    void onUserRemovedLocked(final int userId) {
-        mLedgers.delete(userId);
-        mRealtimeSinceUsersAddedOffsets.delete(userId);
-        postWrite();
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    long getSatiatedConsumptionLimitLocked() {
-        return mSatiatedConsumptionLimit;
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    long getLastReclamationTimeLocked() {
-        return mLastReclamationTime;
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    long getLastStockRecalculationTimeLocked() {
-        return mLastStockRecalculationTime;
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    @NonNull
-    Ledger getLedgerLocked(final int userId, @NonNull final String pkgName) {
-        Ledger ledger = mLedgers.get(userId, pkgName);
-        if (ledger == null) {
-            ledger = new Ledger();
-            mLedgers.add(userId, pkgName, ledger);
-        }
-        return ledger;
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    @NonNull
-    SparseArrayMap<String, Ledger> getLedgersLocked() {
-        return mLedgers;
-    }
-
-    /**
-     * Returns the sum of credits granted to all apps on the system. This is expensive so don't
-     * call it for normal operation.
-     */
-    @GuardedBy("mIrs.getLock()")
-    long getCakesInCirculationForLoggingLocked() {
-        long sum = 0;
-        for (int uIdx = mLedgers.numMaps() - 1; uIdx >= 0; --uIdx) {
-            for (int pIdx = mLedgers.numElementsForKeyAt(uIdx) - 1; pIdx >= 0; --pIdx) {
-                sum += mLedgers.valueAt(uIdx, pIdx).getCurrentBalance();
-            }
-        }
-        return sum;
-    }
-
-    /** Returns the cumulative elapsed realtime since TARE was first setup. */
-    long getRealtimeSinceFirstSetupMs(long nowElapsed) {
-        return mLoadedTimeSinceFirstSetup + nowElapsed;
-    }
-
-    /** Returns the total amount of cakes that remain to be consumed. */
-    @GuardedBy("mIrs.getLock()")
-    long getRemainingConsumableCakesLocked() {
-        return mRemainingConsumableCakes;
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    SparseLongArray getRealtimeSinceUsersAddedLocked(long nowElapsed) {
-        final SparseLongArray realtimes = new SparseLongArray();
-        for (int i = mRealtimeSinceUsersAddedOffsets.size() - 1; i >= 0; --i) {
-            realtimes.put(mRealtimeSinceUsersAddedOffsets.keyAt(i),
-                    mRealtimeSinceUsersAddedOffsets.valueAt(i) + nowElapsed);
-        }
-        return realtimes;
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    void loadFromDiskLocked() {
-        mLedgers.clear();
-        if (!recordExists()) {
-            mSatiatedConsumptionLimit = mIrs.getInitialSatiatedConsumptionLimitLocked();
-            mRemainingConsumableCakes = mIrs.getConsumptionLimitLocked();
-            return;
-        }
-        mSatiatedConsumptionLimit = 0;
-        mRemainingConsumableCakes = 0;
-
-        final SparseArray<ArraySet<String>> installedPackagesPerUser = new SparseArray<>();
-        final SparseArrayMap<String, InstalledPackageInfo> installedPackages =
-                mIrs.getInstalledPackages();
-        for (int uIdx = installedPackages.numMaps() - 1; uIdx >= 0; --uIdx) {
-            final int userId = installedPackages.keyAt(uIdx);
-
-            for (int pIdx = installedPackages.numElementsForKeyAt(uIdx) - 1; pIdx >= 0; --pIdx) {
-                final InstalledPackageInfo packageInfo = installedPackages.valueAt(uIdx, pIdx);
-                if (packageInfo.uid != InstalledPackageInfo.NO_UID) {
-                    ArraySet<String> pkgsForUser = installedPackagesPerUser.get(userId);
-                    if (pkgsForUser == null) {
-                        pkgsForUser = new ArraySet<>();
-                        installedPackagesPerUser.put(userId, pkgsForUser);
-                    }
-                    pkgsForUser.add(packageInfo.packageName);
-                }
-            }
-        }
-
-        final List<Analyst.Report> reports = new ArrayList<>();
-        try (FileInputStream fis = mStateFile.openRead()) {
-            TypedXmlPullParser parser = Xml.resolvePullParser(fis);
-
-            int eventType = parser.getEventType();
-            while (eventType != XmlPullParser.START_TAG
-                    && eventType != XmlPullParser.END_DOCUMENT) {
-                eventType = parser.next();
-            }
-            if (eventType == XmlPullParser.END_DOCUMENT) {
-                if (DEBUG) {
-                    Slog.w(TAG, "No persisted state.");
-                }
-                return;
-            }
-
-            String tagName = parser.getName();
-            if (XML_TAG_TARE.equals(tagName)) {
-                final int version = parser.getAttributeInt(null, XML_ATTR_VERSION);
-                if (version < 0 || version > STATE_FILE_VERSION) {
-                    Slog.e(TAG, "Invalid version number (" + version + "), aborting file read");
-                    return;
-                }
-            }
-
-            final long now = System.currentTimeMillis();
-            final long endTimeCutoff = now - MAX_TRANSACTION_AGE_MS;
-            long earliestEndTime = Long.MAX_VALUE;
-            for (eventType = parser.next(); eventType != XmlPullParser.END_DOCUMENT;
-                    eventType = parser.next()) {
-                if (eventType != XmlPullParser.START_TAG) {
-                    continue;
-                }
-                tagName = parser.getName();
-                if (tagName == null) {
-                    continue;
-                }
-
-                switch (tagName) {
-                    case XML_TAG_HIGH_LEVEL_STATE:
-                        mLastReclamationTime =
-                                parser.getAttributeLong(null, XML_ATTR_LAST_RECLAMATION_TIME);
-                        mLastStockRecalculationTime = parser.getAttributeLong(null,
-                                XML_ATTR_LAST_STOCK_RECALCULATION_TIME, 0);
-                        mLoadedTimeSinceFirstSetup =
-                                parser.getAttributeLong(null, XML_ATTR_TIME_SINCE_FIRST_SETUP_MS,
-                                        // If there's no recorded time since first setup, then
-                                        // offset the current elapsed time so it doesn't shift the
-                                        // timing too much.
-                                        -SystemClock.elapsedRealtime());
-                        mSatiatedConsumptionLimit =
-                                parser.getAttributeLong(null, XML_ATTR_CONSUMPTION_LIMIT,
-                                        mIrs.getInitialSatiatedConsumptionLimitLocked());
-                        final long consumptionLimit = mIrs.getConsumptionLimitLocked();
-                        mRemainingConsumableCakes = Math.min(consumptionLimit,
-                                parser.getAttributeLong(null, XML_ATTR_REMAINING_CONSUMABLE_CAKES,
-                                        consumptionLimit));
-                        break;
-                    case XML_TAG_USER:
-                        earliestEndTime = Math.min(earliestEndTime,
-                                readUserFromXmlLocked(
-                                        parser, installedPackagesPerUser, endTimeCutoff));
-                        break;
-                    case XML_TAG_PERIOD_REPORT:
-                        reports.add(readReportFromXml(parser));
-                        break;
-                    default:
-                        Slog.e(TAG, "Unexpected tag: " + tagName);
-                        break;
-                }
-            }
-            mAnalyst.loadReports(reports);
-            scheduleCleanup(earliestEndTime);
-        } catch (IOException | XmlPullParserException e) {
-            Slog.wtf(TAG, "Error reading state from disk", e);
-        }
-    }
-
-    @VisibleForTesting
-    void postWrite() {
-        TareHandlerThread.getHandler().postDelayed(mWriteRunnable, WRITE_DELAY);
-    }
-
-    boolean recordExists() {
-        return mStateFile.exists();
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    void setConsumptionLimitLocked(long limit) {
-        if (mRemainingConsumableCakes > limit) {
-            mRemainingConsumableCakes = limit;
-        } else if (limit > mSatiatedConsumptionLimit) {
-            final long diff = mSatiatedConsumptionLimit - mRemainingConsumableCakes;
-            mRemainingConsumableCakes = (limit - diff);
-        }
-        mSatiatedConsumptionLimit = limit;
-        postWrite();
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    void setLastReclamationTimeLocked(long time) {
-        mLastReclamationTime = time;
-        postWrite();
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    void setLastStockRecalculationTimeLocked(long time) {
-        mLastStockRecalculationTime = time;
-        postWrite();
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    void setUserAddedTimeLocked(int userId, long timeElapsed) {
-        // Use the current time as an offset so that when we persist the time, it correctly persists
-        // as "time since now".
-        mRealtimeSinceUsersAddedOffsets.put(userId, -timeElapsed);
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    void tearDownLocked() {
-        TareHandlerThread.getHandler().removeCallbacks(mCleanRunnable);
-        TareHandlerThread.getHandler().removeCallbacks(mWriteRunnable);
-        mLedgers.clear();
-        mRemainingConsumableCakes = 0;
-        mSatiatedConsumptionLimit = 0;
-        mLastReclamationTime = 0;
-    }
-
-    @VisibleForTesting
-    void writeImmediatelyForTesting() {
-        mWriteRunnable.run();
-    }
-
-    private void cleanupLedgers() {
-        synchronized (mIrs.getLock()) {
-            TareHandlerThread.getHandler().removeCallbacks(mCleanRunnable);
-            long earliestEndTime = Long.MAX_VALUE;
-            for (int uIdx = mLedgers.numMaps() - 1; uIdx >= 0; --uIdx) {
-                final int userId = mLedgers.keyAt(uIdx);
-
-                for (int pIdx = mLedgers.numElementsForKey(userId) - 1; pIdx >= 0; --pIdx) {
-                    final String pkgName = mLedgers.keyAt(uIdx, pIdx);
-                    final Ledger ledger = mLedgers.get(userId, pkgName);
-                    final Ledger.Transaction transaction =
-                            ledger.removeOldTransactions(MAX_TRANSACTION_AGE_MS);
-                    if (transaction != null) {
-                        earliestEndTime = Math.min(earliestEndTime, transaction.endTimeMs);
-                    }
-                }
-            }
-            scheduleCleanup(earliestEndTime);
-        }
-    }
-
-    /** Returns the {@link String#intern() interned} String if it's not null. */
-    @Nullable
-    private static String intern(@Nullable String val) {
-        return val == null ? null : val.intern();
-    }
-
-    /**
-     * @param parser Xml parser at the beginning of a "<ledger/>" tag. The next "parser.next()" call
-     *               will take the parser into the body of the ledger tag.
-     * @return Newly instantiated ledger holding all the information we just read out of the xml
-     * tag, and the package name associated with the ledger.
-     */
-    @Nullable
-    private static Pair<String, Ledger> readLedgerFromXml(TypedXmlPullParser parser,
-            ArraySet<String> validPackages, long endTimeCutoff)
-            throws XmlPullParserException, IOException {
-        final String pkgName;
-        final long curBalance;
-        final List<Ledger.Transaction> transactions = new ArrayList<>();
-        final List<Ledger.RewardBucket> rewardBuckets = new ArrayList<>();
-
-        pkgName = intern(parser.getAttributeValue(null, XML_ATTR_PACKAGE_NAME));
-        curBalance = parser.getAttributeLong(null, XML_ATTR_CURRENT_BALANCE);
-
-        final boolean isInstalled = validPackages.contains(pkgName);
-        if (!isInstalled) {
-            // Don't return early since we need to go through all the transaction tags and get
-            // to the end of the ledger tag.
-            Slog.w(TAG, "Invalid pkg " + pkgName + " is saved to disk");
-        }
-
-        for (int eventType = parser.next(); eventType != XmlPullParser.END_DOCUMENT;
-                eventType = parser.next()) {
-            final String tagName = parser.getName();
-            if (eventType == XmlPullParser.END_TAG) {
-                if (XML_TAG_LEDGER.equals(tagName)) {
-                    // We've reached the end of the ledger tag.
-                    break;
-                }
-                continue;
-            }
-            if (eventType != XmlPullParser.START_TAG || tagName == null) {
-                Slog.e(TAG, "Unexpected event: (" + eventType + ") " + tagName);
-                return null;
-            }
-            if (!isInstalled) {
-                continue;
-            }
-            if (DEBUG) {
-                Slog.d(TAG, "Starting ledger tag: " + tagName);
-            }
-            switch (tagName) {
-                case XML_TAG_TRANSACTION:
-                    final long endTime = parser.getAttributeLong(null, XML_ATTR_END_TIME);
-                    if (endTime <= endTimeCutoff) {
-                        if (DEBUG) {
-                            Slog.d(TAG, "Skipping event because it's too old.");
-                        }
-                        continue;
-                    }
-                    final String tag = intern(parser.getAttributeValue(null, XML_ATTR_TAG));
-                    final long startTime = parser.getAttributeLong(null, XML_ATTR_START_TIME);
-                    final int eventId = parser.getAttributeInt(null, XML_ATTR_EVENT_ID);
-                    final long delta = parser.getAttributeLong(null, XML_ATTR_DELTA);
-                    final long ctp = parser.getAttributeLong(null, XML_ATTR_CTP);
-                    transactions.add(
-                            new Ledger.Transaction(startTime, endTime, eventId, tag, delta, ctp));
-                    break;
-                case XML_TAG_REWARD_BUCKET:
-                    rewardBuckets.add(readRewardBucketFromXml(parser));
-                    break;
-                default:
-                    // Expecting only "transaction" and "rewardBucket" tags.
-                    Slog.e(TAG, "Unexpected event: (" + eventType + ") " + tagName);
-                    return null;
-            }
-        }
-
-        if (!isInstalled) {
-            return null;
-        }
-        return Pair.create(pkgName, new Ledger(curBalance, transactions, rewardBuckets));
-    }
-
-    /**
-     * @param parser Xml parser at the beginning of a "<user>" tag. The next "parser.next()" call
-     *               will take the parser into the body of the user tag.
-     * @return The earliest valid transaction end time found for the user.
-     */
-    @GuardedBy("mIrs.getLock()")
-    private long readUserFromXmlLocked(TypedXmlPullParser parser,
-            SparseArray<ArraySet<String>> installedPackagesPerUser,
-            long endTimeCutoff) throws XmlPullParserException, IOException {
-        int curUser = parser.getAttributeInt(null, XML_ATTR_USER_ID);
-        final ArraySet<String> installedPackages = installedPackagesPerUser.get(curUser);
-        if (installedPackages == null) {
-            Slog.w(TAG, "Invalid user " + curUser + " is saved to disk");
-            curUser = UserHandle.USER_NULL;
-            // Don't return early since we need to go through all the ledger tags and get to the end
-            // of the user tag.
-        }
-        if (curUser != UserHandle.USER_NULL) {
-            mRealtimeSinceUsersAddedOffsets.put(curUser,
-                            parser.getAttributeLong(null, XML_ATTR_TIME_SINCE_FIRST_SETUP_MS,
-                                    // If there's no recorded time since first setup, then
-                                    // offset the current elapsed time so it doesn't shift the
-                                    // timing too much.
-                                    -SystemClock.elapsedRealtime()));
-        }
-        long earliestEndTime = Long.MAX_VALUE;
-
-        for (int eventType = parser.next(); eventType != XmlPullParser.END_DOCUMENT;
-                eventType = parser.next()) {
-            final String tagName = parser.getName();
-            if (eventType == XmlPullParser.END_TAG) {
-                if (XML_TAG_USER.equals(tagName)) {
-                    // We've reached the end of the user tag.
-                    break;
-                }
-                continue;
-            }
-            if (XML_TAG_LEDGER.equals(tagName)) {
-                if (curUser == UserHandle.USER_NULL) {
-                    continue;
-                }
-                final Pair<String, Ledger> ledgerData =
-                        readLedgerFromXml(parser, installedPackages, endTimeCutoff);
-                if (ledgerData == null) {
-                    continue;
-                }
-                final Ledger ledger = ledgerData.second;
-                if (ledger != null) {
-                    mLedgers.add(curUser, ledgerData.first, ledger);
-                    final Ledger.Transaction transaction = ledger.getEarliestTransaction();
-                    if (transaction != null) {
-                        earliestEndTime = Math.min(earliestEndTime, transaction.endTimeMs);
-                    }
-                }
-            } else {
-                Slog.e(TAG, "Unknown tag: " + tagName);
-            }
-        }
-
-        return earliestEndTime;
-    }
-
-    /**
-     * @param parser Xml parser at the beginning of a {@link #XML_TAG_PERIOD_REPORT} tag. The next
-     *               "parser.next()" call will take the parser into the body of the report tag.
-     * @return Newly instantiated Report holding all the information we just read out of the xml tag
-     */
-    @NonNull
-    private static Analyst.Report readReportFromXml(TypedXmlPullParser parser)
-            throws XmlPullParserException, IOException {
-        final Analyst.Report report = new Analyst.Report();
-
-        report.cumulativeBatteryDischarge = parser.getAttributeInt(null, XML_ATTR_PR_DISCHARGE);
-        report.currentBatteryLevel = parser.getAttributeInt(null, XML_ATTR_PR_BATTERY_LEVEL);
-        report.cumulativeProfit = parser.getAttributeLong(null, XML_ATTR_PR_PROFIT);
-        report.numProfitableActions = parser.getAttributeInt(null, XML_ATTR_PR_NUM_PROFIT);
-        report.cumulativeLoss = parser.getAttributeLong(null, XML_ATTR_PR_LOSS);
-        report.numUnprofitableActions = parser.getAttributeInt(null, XML_ATTR_PR_NUM_LOSS);
-        report.cumulativeRewards = parser.getAttributeLong(null, XML_ATTR_PR_REWARDS);
-        report.numRewards = parser.getAttributeInt(null, XML_ATTR_PR_NUM_REWARDS);
-        report.cumulativePositiveRegulations =
-                parser.getAttributeLong(null, XML_ATTR_PR_POS_REGULATIONS);
-        report.numPositiveRegulations =
-                parser.getAttributeInt(null, XML_ATTR_PR_NUM_POS_REGULATIONS);
-        report.cumulativeNegativeRegulations =
-                parser.getAttributeLong(null, XML_ATTR_PR_NEG_REGULATIONS);
-        report.numNegativeRegulations =
-                parser.getAttributeInt(null, XML_ATTR_PR_NUM_NEG_REGULATIONS);
-        report.screenOffDurationMs =
-                parser.getAttributeLong(null, XML_ATTR_PR_SCREEN_OFF_DURATION_MS, 0);
-        report.screenOffDischargeMah =
-                parser.getAttributeLong(null, XML_ATTR_PR_SCREEN_OFF_DISCHARGE_MAH, 0);
-
-        return report;
-    }
-
-    /**
-     * @param parser Xml parser at the beginning of a {@value #XML_TAG_REWARD_BUCKET} tag. The next
-     *               "parser.next()" call will take the parser into the body of the tag.
-     * @return Newly instantiated {@link Ledger.RewardBucket} holding all the information we just
-     * read out of the xml tag.
-     */
-    @Nullable
-    private static Ledger.RewardBucket readRewardBucketFromXml(TypedXmlPullParser parser)
-            throws XmlPullParserException, IOException {
-
-        final Ledger.RewardBucket rewardBucket = new Ledger.RewardBucket();
-
-        rewardBucket.startTimeMs = parser.getAttributeLong(null, XML_ATTR_START_TIME);
-
-        for (int eventType = parser.next(); eventType != XmlPullParser.END_DOCUMENT;
-                eventType = parser.next()) {
-            final String tagName = parser.getName();
-            if (eventType == XmlPullParser.END_TAG) {
-                if (XML_TAG_REWARD_BUCKET.equals(tagName)) {
-                    // We've reached the end of the rewardBucket tag.
-                    break;
-                }
-                continue;
-            }
-            if (eventType != XmlPullParser.START_TAG || !XML_ATTR_DELTA.equals(tagName)) {
-                // Expecting only delta tags.
-                Slog.e(TAG, "Unexpected event: (" + eventType + ") " + tagName);
-                return null;
-            }
-
-            final int eventId = parser.getAttributeInt(null, XML_ATTR_EVENT_ID);
-            final long delta = parser.getAttributeLong(null, XML_ATTR_DELTA);
-            rewardBucket.cumulativeDelta.put(eventId, delta);
-        }
-
-        return rewardBucket;
-    }
-
-    private void scheduleCleanup(long earliestEndTime) {
-        if (earliestEndTime == Long.MAX_VALUE) {
-            return;
-        }
-        // This is just cleanup to manage memory. We don't need to do it too often or at the exact
-        // intended real time, so the delay that comes from using the Handler (and is limited
-        // to uptime) should be fine.
-        final long delayMs = Math.max(HOUR_IN_MILLIS,
-                earliestEndTime + MAX_TRANSACTION_AGE_MS - System.currentTimeMillis());
-        TareHandlerThread.getHandler().postDelayed(mCleanRunnable, delayMs);
-    }
-
-    private void writeState() {
-        synchronized (mIrs.getLock()) {
-            TareHandlerThread.getHandler().removeCallbacks(mWriteRunnable);
-            // Remove mCleanRunnable callbacks since we're going to clean up the ledgers before
-            // writing anyway.
-            TareHandlerThread.getHandler().removeCallbacks(mCleanRunnable);
-            if (mIrs.getEnabledMode() == ENABLED_MODE_OFF) {
-                // If it's no longer enabled, we would have cleared all the data in memory and would
-                // accidentally write an empty file, thus deleting all the history.
-                return;
-            }
-            long earliestStoredEndTime = Long.MAX_VALUE;
-            try (FileOutputStream fos = mStateFile.startWrite()) {
-                TypedXmlSerializer out = Xml.resolveSerializer(fos);
-                out.startDocument(null, true);
-
-                out.startTag(null, XML_TAG_TARE);
-                out.attributeInt(null, XML_ATTR_VERSION, STATE_FILE_VERSION);
-
-                out.startTag(null, XML_TAG_HIGH_LEVEL_STATE);
-                out.attributeLong(null, XML_ATTR_LAST_RECLAMATION_TIME, mLastReclamationTime);
-                out.attributeLong(null,
-                        XML_ATTR_LAST_STOCK_RECALCULATION_TIME, mLastStockRecalculationTime);
-                out.attributeLong(null, XML_ATTR_TIME_SINCE_FIRST_SETUP_MS,
-                        mLoadedTimeSinceFirstSetup + SystemClock.elapsedRealtime());
-                out.attributeLong(null, XML_ATTR_CONSUMPTION_LIMIT, mSatiatedConsumptionLimit);
-                out.attributeLong(null, XML_ATTR_REMAINING_CONSUMABLE_CAKES,
-                        mRemainingConsumableCakes);
-                out.endTag(null, XML_TAG_HIGH_LEVEL_STATE);
-
-                for (int uIdx = mLedgers.numMaps() - 1; uIdx >= 0; --uIdx) {
-                    final int userId = mLedgers.keyAt(uIdx);
-                    earliestStoredEndTime = Math.min(earliestStoredEndTime,
-                            writeUserLocked(out, userId));
-                }
-
-                List<Analyst.Report> reports = mAnalyst.getReports();
-                for (int i = 0, size = reports.size(); i < size; ++i) {
-                    writeReport(out, reports.get(i));
-                }
-
-                out.endTag(null, XML_TAG_TARE);
-
-                out.endDocument();
-                mStateFile.finishWrite(fos);
-            } catch (IOException e) {
-                Slog.e(TAG, "Error writing state to disk", e);
-            }
-            scheduleCleanup(earliestStoredEndTime);
-        }
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    private long writeUserLocked(@NonNull TypedXmlSerializer out, final int userId)
-            throws IOException {
-        final int uIdx = mLedgers.indexOfKey(userId);
-        long earliestStoredEndTime = Long.MAX_VALUE;
-
-        out.startTag(null, XML_TAG_USER);
-        out.attributeInt(null, XML_ATTR_USER_ID, userId);
-        out.attributeLong(null, XML_ATTR_TIME_SINCE_FIRST_SETUP_MS,
-                mRealtimeSinceUsersAddedOffsets.get(userId, mLoadedTimeSinceFirstSetup)
-                        + SystemClock.elapsedRealtime());
-        for (int pIdx = mLedgers.numElementsForKey(userId) - 1; pIdx >= 0; --pIdx) {
-            final String pkgName = mLedgers.keyAt(uIdx, pIdx);
-            final Ledger ledger = mLedgers.get(userId, pkgName);
-            // Remove old transactions so we don't waste space storing them.
-            ledger.removeOldTransactions(MAX_TRANSACTION_AGE_MS);
-
-            out.startTag(null, XML_TAG_LEDGER);
-            out.attribute(null, XML_ATTR_PACKAGE_NAME, pkgName);
-            out.attributeLong(null,
-                    XML_ATTR_CURRENT_BALANCE, ledger.getCurrentBalance());
-
-            final List<Ledger.Transaction> transactions = ledger.getTransactions();
-            for (int t = 0; t < transactions.size(); ++t) {
-                Ledger.Transaction transaction = transactions.get(t);
-                if (t == 0) {
-                    earliestStoredEndTime = Math.min(earliestStoredEndTime, transaction.endTimeMs);
-                }
-                writeTransaction(out, transaction);
-            }
-
-            final List<Ledger.RewardBucket> rewardBuckets = ledger.getRewardBuckets();
-            for (int r = 0; r < rewardBuckets.size(); ++r) {
-                writeRewardBucket(out, rewardBuckets.get(r));
-            }
-            out.endTag(null, XML_TAG_LEDGER);
-        }
-        out.endTag(null, XML_TAG_USER);
-
-        return earliestStoredEndTime;
-    }
-
-    private static void writeTransaction(@NonNull TypedXmlSerializer out,
-            @NonNull Ledger.Transaction transaction) throws IOException {
-        out.startTag(null, XML_TAG_TRANSACTION);
-        out.attributeLong(null, XML_ATTR_START_TIME, transaction.startTimeMs);
-        out.attributeLong(null, XML_ATTR_END_TIME, transaction.endTimeMs);
-        out.attributeInt(null, XML_ATTR_EVENT_ID, transaction.eventId);
-        if (transaction.tag != null) {
-            out.attribute(null, XML_ATTR_TAG, transaction.tag);
-        }
-        out.attributeLong(null, XML_ATTR_DELTA, transaction.delta);
-        out.attributeLong(null, XML_ATTR_CTP, transaction.ctp);
-        out.endTag(null, XML_TAG_TRANSACTION);
-    }
-
-    private static void writeRewardBucket(@NonNull TypedXmlSerializer out,
-            @NonNull Ledger.RewardBucket rewardBucket) throws IOException {
-        final int numEvents = rewardBucket.cumulativeDelta.size();
-        if (numEvents == 0) {
-            return;
-        }
-        out.startTag(null, XML_TAG_REWARD_BUCKET);
-        out.attributeLong(null, XML_ATTR_START_TIME, rewardBucket.startTimeMs);
-        for (int i = 0; i < numEvents; ++i) {
-            out.startTag(null, XML_ATTR_DELTA);
-            out.attributeInt(null, XML_ATTR_EVENT_ID, rewardBucket.cumulativeDelta.keyAt(i));
-            out.attributeLong(null, XML_ATTR_DELTA, rewardBucket.cumulativeDelta.valueAt(i));
-            out.endTag(null, XML_ATTR_DELTA);
-        }
-        out.endTag(null, XML_TAG_REWARD_BUCKET);
-    }
-
-    private static void writeReport(@NonNull TypedXmlSerializer out,
-            @NonNull Analyst.Report report) throws IOException {
-        out.startTag(null, XML_TAG_PERIOD_REPORT);
-        out.attributeInt(null, XML_ATTR_PR_DISCHARGE, report.cumulativeBatteryDischarge);
-        out.attributeInt(null, XML_ATTR_PR_BATTERY_LEVEL, report.currentBatteryLevel);
-        out.attributeLong(null, XML_ATTR_PR_PROFIT, report.cumulativeProfit);
-        out.attributeInt(null, XML_ATTR_PR_NUM_PROFIT, report.numProfitableActions);
-        out.attributeLong(null, XML_ATTR_PR_LOSS, report.cumulativeLoss);
-        out.attributeInt(null, XML_ATTR_PR_NUM_LOSS, report.numUnprofitableActions);
-        out.attributeLong(null, XML_ATTR_PR_REWARDS, report.cumulativeRewards);
-        out.attributeInt(null, XML_ATTR_PR_NUM_REWARDS, report.numRewards);
-        out.attributeLong(null, XML_ATTR_PR_POS_REGULATIONS, report.cumulativePositiveRegulations);
-        out.attributeInt(null, XML_ATTR_PR_NUM_POS_REGULATIONS, report.numPositiveRegulations);
-        out.attributeLong(null, XML_ATTR_PR_NEG_REGULATIONS, report.cumulativeNegativeRegulations);
-        out.attributeInt(null, XML_ATTR_PR_NUM_NEG_REGULATIONS, report.numNegativeRegulations);
-        out.attributeLong(null, XML_ATTR_PR_SCREEN_OFF_DURATION_MS, report.screenOffDurationMs);
-        out.attributeLong(null, XML_ATTR_PR_SCREEN_OFF_DISCHARGE_MAH, report.screenOffDischargeMah);
-        out.endTag(null, XML_TAG_PERIOD_REPORT);
-    }
-
-    @GuardedBy("mIrs.getLock()")
-    void dumpLocked(IndentingPrintWriter pw, boolean dumpAll) {
-        pw.println("Ledgers:");
-        pw.increaseIndent();
-        mLedgers.forEach((userId, pkgName, ledger) -> {
-            pw.print(appToString(userId, pkgName));
-            if (mIrs.isSystem(userId, pkgName)) {
-                pw.print(" (system)");
-            }
-            pw.println();
-            pw.increaseIndent();
-            ledger.dump(pw, dumpAll ? Integer.MAX_VALUE : MAX_NUM_TRANSACTION_DUMP);
-            pw.decreaseIndent();
-        });
-        pw.decreaseIndent();
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/TEST_MAPPING b/apex/jobscheduler/service/java/com/android/server/tare/TEST_MAPPING
deleted file mode 100644
index e194b8d..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/TEST_MAPPING
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-    "presubmit": [
-        {
-            "name": "FrameworksMockingServicesTests",
-            "options": [
-                {"include-filter": "com.android.server.tare"},
-                {"exclude-annotation": "androidx.test.filters.FlakyTest"}
-            ]
-        },
-        {
-            "name": "FrameworksServicesTests",
-            "options": [
-                {"include-filter": "com.android.server.tare"},
-                {"exclude-annotation": "androidx.test.filters.FlakyTest"}
-            ]
-        }
-    ],
-    "postsubmit": [
-        {
-            "name": "FrameworksMockingServicesTests",
-            "options": [
-                {"include-filter": "com.android.server.tare"}
-            ]
-        },
-        {
-            "name": "FrameworksServicesTests",
-            "options": [
-                {"include-filter": "com.android.server.tare"}
-            ]
-        }
-    ]
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/TareHandlerThread.java b/apex/jobscheduler/service/java/com/android/server/tare/TareHandlerThread.java
deleted file mode 100644
index 65ef8bf..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/TareHandlerThread.java
+++ /dev/null
@@ -1,75 +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.server.tare;
-
-import android.os.Handler;
-import android.os.HandlerExecutor;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Trace;
-
-import java.util.concurrent.Executor;
-
-/**
- * Singleton thread for all of TARE.
- *
- * @see com.android.internal.os.BackgroundThread
- */
-final class TareHandlerThread extends HandlerThread {
-
-    private static TareHandlerThread sInstance;
-    private static Executor sHandlerExecutor;
-    private static Handler sHandler;
-
-    private TareHandlerThread() {
-        super("tare");
-    }
-
-    private static void ensureThreadLocked() {
-        if (sInstance == null) {
-            sInstance = new TareHandlerThread();
-            sInstance.start();
-            final Looper looper = sInstance.getLooper();
-            looper.setTraceTag(Trace.TRACE_TAG_SYSTEM_SERVER);
-            sHandler = new Handler(sInstance.getLooper());
-            sHandlerExecutor = new HandlerExecutor(sHandler);
-        }
-    }
-
-    static TareHandlerThread get() {
-        synchronized (TareHandlerThread.class) {
-            ensureThreadLocked();
-        }
-        return sInstance;
-    }
-
-    /** Returns the singleton handler executor for TareHandlerThread */
-    public static Executor getExecutor() {
-        synchronized (TareHandlerThread.class) {
-            ensureThreadLocked();
-            return sHandlerExecutor;
-        }
-    }
-
-    /** Returns the singleton handler for TareHandlerThread. */
-    public static Handler getHandler() {
-        synchronized (TareHandlerThread.class) {
-            ensureThreadLocked();
-        }
-        return sHandler;
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/TareShellCommand.java b/apex/jobscheduler/service/java/com/android/server/tare/TareShellCommand.java
deleted file mode 100644
index 5e380b40..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/TareShellCommand.java
+++ /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.server.tare;
-
-import android.Manifest;
-import android.annotation.NonNull;
-import android.content.pm.PackageManager;
-import android.os.Binder;
-
-import com.android.modules.utils.BasicShellCommandHandler;
-
-import java.io.PrintWriter;
-
-/**
- * Shell command handler for TARE.
- */
-public class TareShellCommand extends BasicShellCommandHandler {
-    static final int COMMAND_ERROR = -1;
-    static final int COMMAND_SUCCESS = 0;
-
-    private final InternalResourceService mIrs;
-
-    public TareShellCommand(@NonNull InternalResourceService irs) {
-        mIrs = irs;
-    }
-
-    @Override
-    public int onCommand(String cmd) {
-        final PrintWriter pw = getOutPrintWriter();
-        try {
-            switch (cmd != null ? cmd : "") {
-                case "clear-vip":
-                    return runClearVip(pw);
-                case "set-vip":
-                    return runSetVip(pw);
-                default:
-                    return handleDefaultCommands(cmd);
-            }
-        } catch (Exception e) {
-            pw.println("Exception: " + e);
-        }
-        return COMMAND_ERROR;
-    }
-
-    @Override
-    public void onHelp() {
-        final PrintWriter pw = getOutPrintWriter();
-
-        pw.println("TARE commands:");
-        pw.println("  help");
-        pw.println("    Print this help text.");
-        pw.println("  clear-vip");
-        pw.println("    Clears all VIP settings resulting from previous calls using `set-vip` and");
-        pw.println("    resets them all to default.");
-        pw.println("  set-vip <USER_ID> <PACKAGE> <true|false|default>");
-        pw.println("    Designate the app as a Very Important Package or not. A VIP is allowed to");
-        pw.println("    do as much work as it wants, regardless of TARE state.");
-        pw.println("    The user ID must be an explicit user ID. USER_ALL, CURRENT, etc. are not");
-        pw.println("    supported.");
-        pw.println();
-    }
-
-    private void checkPermission(@NonNull String operation) throws Exception {
-        final int perm = mIrs.getContext()
-                .checkCallingOrSelfPermission(Manifest.permission.CHANGE_APP_IDLE_STATE);
-        if (perm != PackageManager.PERMISSION_GRANTED) {
-            throw new SecurityException("Uid " + Binder.getCallingUid()
-                    + " not permitted to " + operation);
-        }
-    }
-
-    private int runClearVip(@NonNull PrintWriter pw) throws Exception {
-        checkPermission("clear vip");
-
-        final long ident = Binder.clearCallingIdentity();
-        try {
-            return mIrs.executeClearVip(pw);
-        } finally {
-            Binder.restoreCallingIdentity(ident);
-        }
-    }
-
-    private int runSetVip(@NonNull PrintWriter pw) throws Exception {
-        checkPermission("modify vip");
-
-        final int userId = Integer.parseInt(getNextArgRequired());
-        final String pkgName = getNextArgRequired();
-        final String vipState = getNextArgRequired();
-        final Boolean isVip = "default".equals(vipState) ? null : Boolean.valueOf(vipState);
-
-        final long ident = Binder.clearCallingIdentity();
-        try {
-            return mIrs.executeSetVip(pw, userId, pkgName, isVip);
-        } finally {
-            Binder.restoreCallingIdentity(ident);
-        }
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/TareUtils.java b/apex/jobscheduler/service/java/com/android/server/tare/TareUtils.java
deleted file mode 100644
index aa4c75a..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/TareUtils.java
+++ /dev/null
@@ -1,68 +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.server.tare;
-
-import static android.app.tare.EconomyManager.CAKE_IN_ARC;
-
-import android.annotation.NonNull;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.time.Clock;
-
-class TareUtils {
-    @VisibleForTesting
-    static Clock sSystemClock = Clock.systemUTC();
-
-    static long getCurrentTimeMillis() {
-        return sSystemClock.millis();
-    }
-
-    static int cakeToArc(long cakes) {
-        return (int) (cakes / CAKE_IN_ARC);
-    }
-
-    @NonNull
-    static String cakeToString(long cakes) {
-        if (cakes == 0) {
-            return "0 ARCs";
-        }
-        final long sub = cakes % CAKE_IN_ARC;
-        final long arcs = cakeToArc(cakes);
-        if (arcs == 0) {
-            return sub == 1
-                    ? sub + " cake"
-                    : sub + " cakes";
-        }
-        StringBuilder sb = new StringBuilder();
-        sb.append(arcs);
-        if (sub != 0) {
-            sb.append(".").append(String.format("%03d", Math.abs(sub) / (CAKE_IN_ARC / 1000)));
-        }
-        sb.append(" ARC");
-        if (arcs != 1 || sub != 0) {
-            sb.append("s");
-        }
-        return sb.toString();
-    }
-
-    /** Returns a standardized format for printing userId+pkgName combinations. */
-    @NonNull
-    static String appToString(int userId, String pkgName) {
-        return "<" + userId + ">" + pkgName;
-    }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
index 19bc716..613678b 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
+++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
@@ -130,6 +130,8 @@
 import com.android.server.LocalServices;
 import com.android.server.pm.pkg.AndroidPackage;
 import com.android.server.usage.AppIdleHistory.AppUsageHistory;
+import com.android.tools.r8.keepanno.annotations.KeepItemKind;
+import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 
 import libcore.util.EmptyArray;
 
@@ -588,6 +590,8 @@
         }
     }
 
+    // This constructor is reflectively invoked from framework code in AppStandbyInternal.
+    @UsedByReflection(kind = KeepItemKind.CLASS_AND_METHODS)
     public AppStandbyController(Context context) {
         this(new Injector(context, AppSchedulingModuleThread.get().getLooper()));
     }
diff --git a/apex/jobscheduler/service/jni/Android.bp b/apex/jobscheduler/service/jni/Android.bp
index 34a1fa2..e8acff7 100644
--- a/apex/jobscheduler/service/jni/Android.bp
+++ b/apex/jobscheduler/service/jni/Android.bp
@@ -28,4 +28,8 @@
         "liblog",
         "libbase",
     ],
+    visibility: [
+        "//frameworks/base/apex:__subpackages__",
+        "//visibility:any_system_partition",
+    ],
 }
diff --git a/api/Android.bp b/api/Android.bp
index 010a2a5..3fa9c60 100644
--- a/api/Android.bp
+++ b/api/Android.bp
@@ -382,6 +382,18 @@
     ],
 }
 
+soong_config_module_type {
+    name: "non_updatable_exportable_droidstubs",
+    module_type: "droidstubs",
+    config_namespace: "ANDROID",
+    bool_variables: [
+        "release_hidden_api_exportable_stubs",
+    ],
+    properties: [
+        "dists",
+    ],
+}
+
 // We resolve dependencies on APIs in modules by depending on a prebuilt of the whole
 // platform (sdk_system_current_android). That prebuilt does not include module-lib APIs,
 // so use the prebuilt module-lib stubs for modules that export module-lib stubs that the
diff --git a/api/StubLibraries.bp b/api/StubLibraries.bp
index c1add03..1b1bc6b 100644
--- a/api/StubLibraries.bp
+++ b/api/StubLibraries.bp
@@ -27,7 +27,12 @@
 // These modules provide source files for the stub libraries
 /////////////////////////////////////////////////////////////////////
 
-droidstubs {
+soong_config_module_type_import {
+    from: "frameworks/base/api/Android.bp",
+    module_types: ["non_updatable_exportable_droidstubs"],
+}
+
+non_updatable_exportable_droidstubs {
     name: "api-stubs-docs-non-updatable",
     defaults: [
         "android-non-updatable-stubs-defaults",
@@ -54,15 +59,35 @@
             targets: ["sdk"],
             dir: "apistubs/android/public/api",
             dest: "android-non-updatable.txt",
-            tag: ".api.txt",
         },
         {
             targets: ["sdk"],
             dir: "apistubs/android/public/api",
             dest: "android-non-updatable-removed.txt",
-            tag: ".removed-api.txt",
         },
     ],
+    soong_config_variables: {
+        release_hidden_api_exportable_stubs: {
+            dists: [
+                {
+                    tag: ".exportable.api.txt",
+                },
+                {
+                    tag: ".exportable.removed-api.txt",
+                },
+            ],
+            conditions_default: {
+                dists: [
+                    {
+                        tag: ".api.txt",
+                    },
+                    {
+                        tag: ".removed-api.txt",
+                    },
+                ],
+            },
+        },
+    },
     api_surface: "public",
 }
 
@@ -86,7 +111,7 @@
         "\\)",
 ]
 
-droidstubs {
+non_updatable_exportable_droidstubs {
     name: "system-api-stubs-docs-non-updatable",
     defaults: [
         "android-non-updatable-stubs-defaults",
@@ -114,19 +139,39 @@
             targets: ["sdk"],
             dir: "apistubs/android/system/api",
             dest: "android-non-updatable.txt",
-            tag: ".api.txt",
         },
         {
             targets: ["sdk"],
             dir: "apistubs/android/system/api",
             dest: "android-non-updatable-removed.txt",
-            tag: ".removed-api.txt",
         },
     ],
+    soong_config_variables: {
+        release_hidden_api_exportable_stubs: {
+            dists: [
+                {
+                    tag: ".exportable.api.txt",
+                },
+                {
+                    tag: ".exportable.removed-api.txt",
+                },
+            ],
+            conditions_default: {
+                dists: [
+                    {
+                        tag: ".api.txt",
+                    },
+                    {
+                        tag: ".removed-api.txt",
+                    },
+                ],
+            },
+        },
+    },
     api_surface: "system",
 }
 
-droidstubs {
+non_updatable_exportable_droidstubs {
     name: "test-api-stubs-docs-non-updatable",
     defaults: [
         "android-non-updatable-stubs-defaults",
@@ -149,31 +194,61 @@
             targets: ["sdk"],
             dir: "apistubs/android/test/api",
             dest: "android.txt",
-            tag: ".api.txt",
         },
         {
             targets: ["sdk"],
             dir: "apistubs/android/test/api",
             dest: "removed.txt",
-            tag: ".removed-api.txt",
         },
         {
             targets: ["sdk"],
             dir: "apistubs/android/test/api",
             dest: "android-non-updatable.txt",
-            tag: ".api.txt",
         },
         {
             targets: ["sdk"],
             dir: "apistubs/android/test/api",
             dest: "android-non-updatable-removed.txt",
-            tag: ".removed-api.txt",
         },
     ],
+    soong_config_variables: {
+        release_hidden_api_exportable_stubs: {
+            dists: [
+                {
+                    tag: ".exportable.api.txt",
+                },
+                {
+                    tag: ".exportable.removed-api.txt",
+                },
+                {
+                    tag: ".exportable.api.txt",
+                },
+                {
+                    tag: ".exportable.removed-api.txt",
+                },
+            ],
+            conditions_default: {
+                dists: [
+                    {
+                        tag: ".api.txt",
+                    },
+                    {
+                        tag: ".removed-api.txt",
+                    },
+                    {
+                        tag: ".api.txt",
+                    },
+                    {
+                        tag: ".removed-api.txt",
+                    },
+                ],
+            },
+        },
+    },
     api_surface: "test",
 }
 
-droidstubs {
+non_updatable_exportable_droidstubs {
     name: "module-lib-api-stubs-docs-non-updatable",
     defaults: [
         "android-non-updatable-stubs-defaults",
@@ -201,15 +276,35 @@
             targets: ["sdk"],
             dir: "apistubs/android/module-lib/api",
             dest: "android-non-updatable.txt",
-            tag: ".api.txt",
         },
         {
             targets: ["sdk"],
             dir: "apistubs/android/module-lib/api",
             dest: "android-non-updatable-removed.txt",
-            tag: ".removed-api.txt",
         },
     ],
+    soong_config_variables: {
+        release_hidden_api_exportable_stubs: {
+            dists: [
+                {
+                    tag: ".exportable.api.txt",
+                },
+                {
+                    tag: ".exportable.removed-api.txt",
+                },
+            ],
+            conditions_default: {
+                dists: [
+                    {
+                        tag: ".api.txt",
+                    },
+                    {
+                        tag: ".removed-api.txt",
+                    },
+                ],
+            },
+        },
+    },
     api_surface: "module-lib",
 }
 
diff --git a/api/coverage/tools/ExtractFlaggedApis.kt b/api/coverage/tools/ExtractFlaggedApis.kt
index caa1929..d5adfd0 100644
--- a/api/coverage/tools/ExtractFlaggedApis.kt
+++ b/api/coverage/tools/ExtractFlaggedApis.kt
@@ -16,51 +16,69 @@
 
 package android.platform.coverage
 
+import com.android.tools.metalava.model.ClassItem
+import com.android.tools.metalava.model.MethodItem
 import com.android.tools.metalava.model.text.ApiFile
 import java.io.File
 import java.io.FileWriter
 
 /** Usage: extract-flagged-apis <api text file> <output .pb file> */
 fun main(args: Array<String>) {
-    var cb = ApiFile.parseApi(listOf(File(args[0])))
-    var builder = FlagApiMap.newBuilder()
+    val cb = ApiFile.parseApi(listOf(File(args[0])))
+    val builder = FlagApiMap.newBuilder()
     for (pkg in cb.getPackages().packages) {
-        var packageName = pkg.qualifiedName()
+        val packageName = pkg.qualifiedName()
         pkg.allClasses()
             .filter { it.methods().size > 0 }
             .forEach {
-                for (method in it.methods()) {
-                    val flagValue =
-                        method.modifiers
-                            .findAnnotation("android.annotation.FlaggedApi")
-                            ?.findAttribute("value")
-                            ?.value
-                            ?.value()
-                    if (flagValue != null && flagValue is String) {
-                        var api =
-                            JavaMethod.newBuilder()
-                                .setPackageName(packageName)
-                                .setClassName(it.fullName())
-                                .setMethodName(method.name())
-                        for (param in method.parameters()) {
-                            api.addParameters(param.type().toTypeString())
-                        }
-                        if (builder.containsFlagToApi(flagValue)) {
-                            var updatedApis =
-                                builder
-                                    .getFlagToApiOrThrow(flagValue)
-                                    .toBuilder()
-                                    .addJavaMethods(api)
-                                    .build()
-                            builder.putFlagToApi(flagValue, updatedApis)
-                        } else {
-                            var apis = FlaggedApis.newBuilder().addJavaMethods(api).build()
-                            builder.putFlagToApi(flagValue, apis)
-                        }
-                    }
-                }
+                extractFlaggedApisFromClass(it, it.methods(), packageName, builder)
+                extractFlaggedApisFromClass(it, it.constructors(), packageName, builder)
             }
     }
     val flagApiMap = builder.build()
     FileWriter(args[1]).use { it.write(flagApiMap.toString()) }
 }
+
+fun extractFlaggedApisFromClass(
+    classItem: ClassItem,
+    methods: List<MethodItem>,
+    packageName: String,
+    builder: FlagApiMap.Builder
+) {
+    val classFlag =
+        classItem.modifiers
+            .findAnnotation("android.annotation.FlaggedApi")
+            ?.findAttribute("value")
+            ?.value
+            ?.value() as? String
+    for (method in methods) {
+        val methodFlag =
+            method.modifiers
+                .findAnnotation("android.annotation.FlaggedApi")
+                ?.findAttribute("value")
+                ?.value
+                ?.value() as? String
+                ?: classFlag
+        val api =
+            JavaMethod.newBuilder()
+                .setPackageName(packageName)
+                .setClassName(classItem.fullName())
+                .setMethodName(method.name())
+        for (param in method.parameters()) {
+            api.addParameters(param.type().toTypeString())
+        }
+        if (methodFlag != null) {
+            addFlaggedApi(builder, api, methodFlag)
+        }
+    }
+}
+
+fun addFlaggedApi(builder: FlagApiMap.Builder, api: JavaMethod.Builder, flag: String) {
+    if (builder.containsFlagToApi(flag)) {
+        val updatedApis = builder.getFlagToApiOrThrow(flag).toBuilder().addJavaMethods(api).build()
+        builder.putFlagToApi(flag, updatedApis)
+    } else {
+        val apis = FlaggedApis.newBuilder().addJavaMethods(api).build()
+        builder.putFlagToApi(flag, apis)
+    }
+}
diff --git a/boot/boot-image-profile.txt b/boot/boot-image-profile.txt
index b629eda..925edc1 100644
--- a/boot/boot-image-profile.txt
+++ b/boot/boot-image-profile.txt
@@ -124,19 +124,19 @@
 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
+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
-HSPLandroid/animation/AnimationHandler$MyFrameCallbackProvider;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)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
-HSPLandroid/animation/AnimationHandler;->cleanUpList()V
-HSPLandroid/animation/AnimationHandler;->doAnimationFrame(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
+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
@@ -157,7 +157,7 @@
 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
+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;
@@ -168,7 +168,7 @@
 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
+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
@@ -180,7 +180,7 @@
 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
+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;
@@ -202,11 +202,11 @@
 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
+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
+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;
@@ -216,39 +216,39 @@
 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
+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
-HSPLandroid/animation/AnimatorSet$Node;->clone()Landroid/animation/AnimatorSet$Node;
+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
+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
+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;
-HSPLandroid/animation/AnimatorSet;->createDependencyGraph()V
+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
-HSPLandroid/animation/AnimatorSet;->endAnimation()V
+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;
-HSPLandroid/animation/AnimatorSet;->getNodeForAnimation(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Node;
+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
-HSPLandroid/animation/AnimatorSet;->initAnimation()V
+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
-HSPLandroid/animation/AnimatorSet;->isInitialized()Z
+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;
@@ -258,28 +258,28 @@
 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
+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
+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
+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
-HSPLandroid/animation/AnimatorSet;->startAnimation()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
-HSPLandroid/animation/AnimatorSet;->updatePlayTime(Landroid/animation/AnimatorSet$Node;Ljava/util/ArrayList;)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
+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;
@@ -287,11 +287,11 @@
 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;
+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
+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;
@@ -313,11 +313,11 @@
 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
+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;
+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;
@@ -357,14 +357,14 @@
 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;
+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;
-HSPLandroid/animation/ObjectAnimator;->getPropertyName()Ljava/lang/String;
+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
+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;
@@ -377,12 +377,12 @@
 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
+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
+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
@@ -399,16 +399,16 @@
 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
+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
+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
+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
+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;
@@ -416,11 +416,11 @@
 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
+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
-HSPLandroid/animation/PropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder;
+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;
@@ -434,7 +434,7 @@
 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
+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
@@ -443,7 +443,7 @@
 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;]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Landroid/animation/Keyframe;Landroid/animation/Keyframe$IntKeyframe;,Landroid/animation/Keyframe$FloatKeyframe;]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;
+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;
@@ -472,18 +472,18 @@
 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
-HSPLandroid/animation/ValueAnimator;->animateValue(F)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;
-HSPLandroid/animation/ValueAnimator;->doAnimationFrame(J)Z
+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;
+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
@@ -640,7 +640,7 @@
 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
+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
@@ -774,7 +774,6 @@
 HSPLandroid/app/ActivityManager;->isLowMemoryKillReportSupported()Z
 HSPLandroid/app/ActivityManager;->isLowRamDevice()Z
 HSPLandroid/app/ActivityManager;->isLowRamDeviceStatic()Z
-HSPLandroid/app/ActivityManager;->isProcStateCached(I)Z
 HSPLandroid/app/ActivityManager;->isRunningInTestHarness()Z
 HSPLandroid/app/ActivityManager;->isRunningInUserTestHarness()Z
 HSPLandroid/app/ActivityManager;->isStartResultFatalError(I)Z
@@ -805,16 +804,12 @@
 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$$ExternalSyntheticLambda2;-><init>()V
-HSPLandroid/app/ActivityThread$$ExternalSyntheticLambda3;-><init>(Landroid/app/ActivityThread;)V
-HSPLandroid/app/ActivityThread$$ExternalSyntheticLambda3;->onConfigurationChanged(Landroid/content/res/Configuration;)V
 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$1;->onConfigurationChanged(Landroid/content/res/Configuration;I)V
 HSPLandroid/app/ActivityThread$ActivityClientRecord;->-$$Nest$misPreHoneycomb(Landroid/app/ActivityThread$ActivityClientRecord;)Z
 HSPLandroid/app/ActivityThread$ActivityClientRecord;->getLifecycleState()I
 HSPLandroid/app/ActivityThread$ActivityClientRecord;->init()V
@@ -874,7 +869,7 @@
 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
+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
@@ -889,7 +884,6 @@
 HSPLandroid/app/ActivityThread$RequestAssistContextExtras;-><init>()V
 HSPLandroid/app/ActivityThread$ServiceArgsData;-><init>()V
 HSPLandroid/app/ActivityThread$ServiceArgsData;->toString()Ljava/lang/String;
-HSPLandroid/app/ActivityThread;->$r8$lambda$H8skqvF0pdTc-bqnTmunR6o6iNI(Landroid/app/ActivityThread;Landroid/content/res/Configuration;)V
 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
@@ -942,7 +936,7 @@
 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
+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
@@ -964,7 +958,7 @@
 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
+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
@@ -1004,7 +998,6 @@
 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$attach$4(Landroid/content/res/Configuration;)V
 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
@@ -1080,7 +1073,7 @@
 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
+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
@@ -1135,7 +1128,7 @@
 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;
+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
@@ -1273,7 +1266,7 @@
 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;
+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;
@@ -1297,7 +1290,7 @@
 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;
+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;
@@ -1307,7 +1300,7 @@
 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
+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
@@ -1332,7 +1325,7 @@
 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;
+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;
@@ -1388,7 +1381,6 @@
 HSPLandroid/app/BroadcastOptions;->setTemporaryAppWhitelistDuration(J)V
 HSPLandroid/app/BroadcastOptions;->toBundle()Landroid/os/Bundle;
 HSPLandroid/app/ClientTransactionHandler;-><init>()V
-HSPLandroid/app/ClientTransactionHandler;->isExecutingLocalTransaction()Z
 HSPLandroid/app/ClientTransactionHandler;->scheduleTransaction(Landroid/app/servertransaction/ClientTransaction;)V
 HSPLandroid/app/ConfigurationChangedListenerController;-><init>()V
 HSPLandroid/app/ConfigurationController;-><init>(Landroid/app/ActivityThreadInternal;)V
@@ -1441,7 +1433,7 @@
 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;Ljava/util/Collections$EmptySet;,Ljava/util/HashSet;,Landroid/util/ArraySet;]Landroid/permission/PermissionManager;Landroid/permission/PermissionManager;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;
+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;
@@ -1476,7 +1468,7 @@
 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;
+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;
@@ -1520,9 +1512,9 @@
 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;
-HSPLandroid/app/ContextImpl;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;
-HSPLandroid/app/ContextImpl;->getSharedPreferencesCacheLocked()Landroid/util/ArrayMap;
+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;
@@ -2274,7 +2266,7 @@
 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
+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
@@ -2299,7 +2291,7 @@
 HSPLandroid/app/Notification;->isGroupChild()Z
 HSPLandroid/app/Notification;->isGroupSummary()Z
 HSPLandroid/app/Notification;->isMediaNotification()Z
-HSPLandroid/app/Notification;->readFromParcelImpl(Landroid/os/Parcel;)V
+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;
@@ -2309,10 +2301,10 @@
 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
+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;
-HSPLandroid/app/NotificationChannel;-><init>(Landroid/os/Parcel;)V
+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
@@ -2331,7 +2323,7 @@
 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;
+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
@@ -2467,7 +2459,7 @@
 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
+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;
@@ -2476,13 +2468,13 @@
 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
+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;
+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
@@ -2519,7 +2511,6 @@
 HSPLandroid/app/RemoteInput;->getChoices()[Ljava/lang/CharSequence;
 HSPLandroid/app/RemoteInput;->getEditChoicesBeforeSending()I
 HSPLandroid/app/RemoteInput;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/ResourcesManager$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;)Z
 HSPLandroid/app/ResourcesManager$ActivityResource;-><init>()V
 HSPLandroid/app/ResourcesManager$ActivityResource;-><init>(Landroid/app/ResourcesManager$ActivityResource-IA;)V
 HSPLandroid/app/ResourcesManager$ActivityResources;-><init>()V
@@ -2527,8 +2518,8 @@
 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
-HSPLandroid/app/ResourcesManager$ApkKey;->hashCode()I
+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;
@@ -2552,8 +2543,8 @@
 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;
-HSPLandroid/app/ResourcesManager;->extractApkKeys(Landroid/content/res/ResourcesKey;)Ljava/util/ArrayList;
+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;
@@ -2626,7 +2617,7 @@
 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;
+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;
@@ -2639,7 +2630,6 @@
 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;->$r8$lambda$gCIQI__z13DI5jNIqnAnYLWLcMc(Landroid/app/SharedPreferencesImpl;)V
 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;
@@ -2672,7 +2662,7 @@
 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
+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;
@@ -2698,9 +2688,7 @@
 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;)Landroid/permission/PermissionManager;
 HSPLandroid/app/SystemServiceRegistry$113;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$114;->createService(Landroid/app/ContextImpl;)Landroid/permission/LegacyPermissionManager;
 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;
@@ -2716,12 +2704,10 @@
 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;)Landroid/app/GameManager;
 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$144;->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;
@@ -2770,11 +2756,9 @@
 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;)Landroid/telephony/TelephonyRegistryManager;
 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;)Landroid/telecom/TelecomManager;
 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;
@@ -2807,13 +2791,11 @@
 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;)Landroid/appwidget/AppWidgetManager;
 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;)Landroid/content/pm/ShortcutManager;
 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;
@@ -2823,11 +2805,9 @@
 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;)Landroid/view/autofill/AutofillManager;
 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;)Landroid/view/contentcapture/ContentCaptureManager;
 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;
@@ -2882,13 +2862,13 @@
 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
+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
+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;
@@ -2905,25 +2885,22 @@
 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
-HSPLandroid/app/WindowConfiguration;->setBounds(Landroid/graphics/Rect;)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
+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
+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
+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
+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$$ExternalSyntheticLambda2;-><init>(Landroid/app/admin/DevicePolicyManager;)V
-HSPLandroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda3;-><init>(Landroid/app/admin/DevicePolicyManager;)V
-HSPLandroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda4;-><init>(Landroid/app/admin/DevicePolicyManager;)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
@@ -3187,7 +3164,7 @@
 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
+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;
@@ -3209,7 +3186,7 @@
 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
+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
@@ -3295,23 +3272,17 @@
 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/BaseClientRequest;->postExecute(Landroid/app/ClientTransactionHandler;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/BaseClientRequest;->preExecute(Landroid/app/ClientTransactionHandler;)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;->getTransactionItems()Ljava/util/List;
 HSPLandroid/app/servertransaction/ClientTransaction;->preExecute(Landroid/app/ClientTransactionHandler;)V
 HSPLandroid/app/servertransaction/ClientTransactionItem;-><init>()V
-HSPLandroid/app/servertransaction/ClientTransactionItem;->getActivityToken()Landroid/os/IBinder;
 HSPLandroid/app/servertransaction/ClientTransactionItem;->getPostExecutionState()I
 HSPLandroid/app/servertransaction/ClientTransactionItem;->isActivityLifecycleItem()Z
 HSPLandroid/app/servertransaction/ClientTransactionItem;->shouldHaveDefinedPreExecutionState()Z
-HSPLandroid/app/servertransaction/ClientTransactionListenerController;-><init>(Landroid/hardware/display/DisplayManagerGlobal;)V
-HSPLandroid/app/servertransaction/ClientTransactionListenerController;->getInstance()Landroid/app/servertransaction/ClientTransactionListenerController;
 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
@@ -3371,7 +3342,7 @@
 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/content/Context;missing_types]Landroid/app/servertransaction/ClientTransactionItem;megamorphic_types]Ljava/util/Map;Ljava/util/Collections$SynchronizedMap;]Landroid/app/servertransaction/TransactionExecutor;Landroid/app/servertransaction/TransactionExecutor;
+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
@@ -3379,7 +3350,6 @@
 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/servertransaction/TransactionExecutorHelper;->shouldExcludeLastLifecycleState(Ljava/util/List;I)Z+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/servertransaction/ClientTransactionItem;megamorphic_types]Landroid/app/servertransaction/ActivityLifecycleItem;Landroid/app/servertransaction/ResumeActivityItem;
 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
@@ -3446,7 +3416,7 @@
 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;
+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;
@@ -3471,7 +3441,7 @@
 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;
+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
@@ -3480,15 +3450,8 @@
 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$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z
 HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda3;-><init>()V
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda3;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda4;->test(Ljava/lang/Object;)Z
 HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda5;-><init>()V
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda5;->apply(I)Ljava/lang/Object;
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda7;-><init>(Landroid/appwidget/AppWidgetManager;)V
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda7;->run()V
-HSPLandroid/appwidget/AppWidgetManager;->$r8$lambda$WKLPyaeqLNLNb3560d7QJuq2DwQ(Landroid/appwidget/AppWidgetManager;)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;
@@ -3503,14 +3466,10 @@
 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
+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/appwidget/flags/FeatureFlagsImpl;-><init>()V
-HSPLandroid/appwidget/flags/FeatureFlagsImpl;->generatedPreviews()Z
-HSPLandroid/appwidget/flags/Flags;-><clinit>()V
-HSPLandroid/appwidget/flags/Flags;->generatedPreviews()Z+]Landroid/appwidget/flags/FeatureFlags;Landroid/appwidget/flags/FeatureFlagsImpl;
 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;
@@ -3521,7 +3480,7 @@
 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
+HSPLandroid/companion/virtual/flags/Flags;->enableNativeVdm()Z+]Landroid/companion/virtual/flags/FeatureFlags;Landroid/companion/virtual/flags/FeatureFlagsImpl;
 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
@@ -3663,7 +3622,7 @@
 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;
+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;
@@ -3675,7 +3634,7 @@
 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/IntStream;Ljava/util/stream/IntPipeline$Head;]Landroid/os/Parcel;Landroid/os/Parcel;
+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
@@ -3942,7 +3901,7 @@
 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;
+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
@@ -4008,7 +3967,7 @@
 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
+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;
@@ -4031,8 +3990,8 @@
 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;
-HSPLandroid/content/ContextWrapper;->getTheme()Landroid/content/res/Resources$Theme;
+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;
@@ -4124,7 +4083,7 @@
 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;
+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
@@ -4189,8 +4148,8 @@
 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
-HSPLandroid/content/Intent;->removeCategory(Ljava/lang/String;)V
+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;
@@ -4215,13 +4174,13 @@
 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
+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
+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;
@@ -4285,7 +4244,7 @@
 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
+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;
@@ -4369,7 +4328,7 @@
 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
+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
@@ -4388,7 +4347,7 @@
 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
+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;
@@ -4425,15 +4384,15 @@
 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
+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
+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;
+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;
@@ -4443,12 +4402,12 @@
 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
+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;
+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;
@@ -4485,7 +4444,7 @@
 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
+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;
@@ -4493,7 +4452,7 @@
 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;
+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;
@@ -4511,7 +4470,7 @@
 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;
+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;
@@ -4563,7 +4522,7 @@
 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
+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
@@ -4587,7 +4546,7 @@
 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
+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;
@@ -4745,7 +4704,7 @@
 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
+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;
@@ -4769,7 +4728,7 @@
 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
+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
@@ -4782,7 +4741,7 @@
 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
+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;
@@ -4846,7 +4805,7 @@
 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
+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;
@@ -4914,7 +4873,7 @@
 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;
+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;
@@ -4949,7 +4908,7 @@
 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;
+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
@@ -4981,7 +4940,7 @@
 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;
+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;
@@ -4994,7 +4953,7 @@
 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
+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
@@ -5007,7 +4966,7 @@
 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;
+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
@@ -5015,7 +4974,6 @@
 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;->setConfiguration(IILjava/lang/String;[Ljava/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
@@ -5085,7 +5043,7 @@
 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
+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
@@ -5098,12 +5056,12 @@
 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
+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
+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
+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;
@@ -5161,16 +5119,16 @@
 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;
+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
+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
+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
@@ -5179,7 +5137,7 @@
 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;
+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;
@@ -5188,12 +5146,12 @@
 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;
+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;
+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;
@@ -5266,7 +5224,7 @@
 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
+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
@@ -5281,10 +5239,10 @@
 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
+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
+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
@@ -5315,18 +5273,18 @@
 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;
-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;Landroid/graphics/drawable/InsetDrawable$InsetState;]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;->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;
+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
-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/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Landroid/app/ResourcesManager;Landroid/app/ResourcesManager;]Ljava/lang/Object;Ljava/util/Locale;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/content/res/DrawableCache;Landroid/content/res/DrawableCache;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Landroid/view/DisplayAdjustments;Landroid/view/DisplayAdjustments;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/os/LocaleList;Landroid/os/LocaleList;]Landroid/util/DisplayMetrics;Landroid/util/DisplayMetrics;]Landroid/content/res/ConfigurationBoundResourceCache;Landroid/content/res/ConfigurationBoundResourceCache;
+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
@@ -5352,15 +5310,15 @@
 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
+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;
-HSPLandroid/content/res/TypedArray;->getDrawableForDensity(II)Landroid/graphics/drawable/Drawable;
+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
@@ -5375,7 +5333,7 @@
 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;
+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
@@ -5408,7 +5366,7 @@
 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;
+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
@@ -5443,13 +5401,13 @@
 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/MatrixCursor;,Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;]Landroid/database/ContentObservable;Landroid/database/ContentObservable;]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard;
+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
-HSPLandroid/database/AbstractCursor;->getColumnCount()I
+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;
+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
@@ -5460,7 +5418,7 @@
 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/MatrixCursor;,Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;
+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;
@@ -5476,10 +5434,10 @@
 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
+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/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;
@@ -5506,7 +5464,7 @@
 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
+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
@@ -5549,10 +5507,10 @@
 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
+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
+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;
@@ -5598,7 +5556,7 @@
 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/String;Ljava/lang/String;]Ljava/lang/Object;Ljava/lang/String;
+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
@@ -5661,13 +5619,16 @@
 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/SQLiteQuery;,Landroid/database/sqlite/SQLiteDatabase;
+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
@@ -5688,7 +5649,7 @@
 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
+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;
@@ -5701,23 +5662,23 @@
 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
+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
-HSPLandroid/database/sqlite/SQLiteConnection;->executeForString(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)Ljava/lang/String;
+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
+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
+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
@@ -5758,7 +5719,7 @@
 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
+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
@@ -5772,13 +5733,13 @@
 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
+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;
+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;
+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;
@@ -5815,7 +5776,7 @@
 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
+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
@@ -5836,7 +5797,7 @@
 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;
+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;
@@ -5846,11 +5807,10 @@
 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
+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;->isInMemoryDatabase()Z+]Landroid/database/sqlite/SQLiteDatabaseConfiguration;Landroid/database/sqlite/SQLiteDatabaseConfiguration;
 HSPLandroid/database/sqlite/SQLiteDatabase;->isMainThread()Z
 HSPLandroid/database/sqlite/SQLiteDatabase;->isOpen()Z
 HSPLandroid/database/sqlite/SQLiteDatabase;->isReadOnly()Z
@@ -5868,7 +5828,7 @@
 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;
+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;
@@ -5893,7 +5853,7 @@
 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
+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
@@ -5916,7 +5876,7 @@
 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;
+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;
@@ -5928,7 +5888,7 @@
 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/SQLiteStatement;,Landroid/database/sqlite/SQLiteQuery;
+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
@@ -5945,11 +5905,11 @@
 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
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->appendColumns(Ljava/lang/StringBuilder;[Ljava/lang/String;)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;
+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;
@@ -5975,8 +5935,8 @@
 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
-HSPLandroid/database/sqlite/SQLiteSession;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)I
+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
@@ -5985,7 +5945,7 @@
 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/os/CancellationSignal;Landroid/os/CancellationSignal;]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;
+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
@@ -5995,9 +5955,9 @@
 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
+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
+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
@@ -6043,22 +6003,22 @@
 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
+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
-HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(FFFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(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
+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
+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
+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;
@@ -6363,8 +6323,8 @@
 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
-HSPLandroid/graphics/HardwareRendererObserver;->notifyDataAvailable()V
+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
@@ -6409,7 +6369,7 @@
 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
+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;
@@ -6429,11 +6389,11 @@
 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
+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
+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
@@ -6442,7 +6402,7 @@
 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
+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
@@ -6478,13 +6438,13 @@
 HSPLandroid/graphics/Outline;->isEmpty()Z
 HSPLandroid/graphics/Outline;->setAlpha(F)V
 HSPLandroid/graphics/Outline;->setConvexPath(Landroid/graphics/Path;)V
-HSPLandroid/graphics/Outline;->setEmpty()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
+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
+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
@@ -6501,20 +6461,19 @@
 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;
+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/BlendModeColorFilter;]Landroid/graphics/Paint;Landroid/graphics/Paint;,Landroid/text/TextPaint;
+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;->getRunCharacterAdvance([CIIIIZI[FILandroid/graphics/RectF;Landroid/graphics/Paint$RunInfo;)F
 HSPLandroid/graphics/Paint;->getShader()Landroid/graphics/Shader;
 HSPLandroid/graphics/Paint;->getShadowLayerColor()I
 HSPLandroid/graphics/Paint;->getShadowLayerDx()F
@@ -6527,7 +6486,7 @@
 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
+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;
@@ -6547,7 +6506,7 @@
 HSPLandroid/graphics/Paint;->isAntiAlias()Z
 HSPLandroid/graphics/Paint;->isDither()Z
 HSPLandroid/graphics/Paint;->isElegantTextHeight()Z
-HSPLandroid/graphics/Paint;->isFilterBitmap()Z+]Landroid/graphics/Paint;Landroid/graphics/Paint;,Landroid/text/TextPaint;
+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
@@ -6581,14 +6540,14 @@
 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
+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
+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
@@ -6597,7 +6556,7 @@
 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
+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
@@ -6607,10 +6566,9 @@
 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
+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;)V
-HSPLandroid/graphics/Path;->computeBounds(Landroid/graphics/RectF;Z)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
@@ -6622,11 +6580,11 @@
 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
+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
+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
@@ -6649,7 +6607,7 @@
 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
+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
@@ -6683,8 +6641,8 @@
 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;
-HSPLandroid/graphics/RecordingCanvas;->recycle()V
+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;
@@ -6697,7 +6655,7 @@
 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
+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
@@ -6737,7 +6695,7 @@
 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
+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
@@ -6748,7 +6706,7 @@
 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
+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;
@@ -6784,10 +6742,10 @@
 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
+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
+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
@@ -6859,7 +6817,7 @@
 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;
+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;
@@ -6984,7 +6942,7 @@
 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
+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
@@ -7138,7 +7096,7 @@
 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
+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
@@ -7153,7 +7111,7 @@
 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
+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
@@ -7169,7 +7127,7 @@
 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;
+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;
@@ -7179,14 +7137,14 @@
 HSPLandroid/graphics/drawable/Drawable;->getIntrinsicWidth()I
 HSPLandroid/graphics/drawable/Drawable;->getLayoutDirection()I
 HSPLandroid/graphics/drawable/Drawable;->getLevel()I
-HSPLandroid/graphics/drawable/Drawable;->getMinimumHeight()I
-HSPLandroid/graphics/drawable/Drawable;->getMinimumWidth()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
+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
@@ -7204,7 +7162,7 @@
 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
+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
@@ -7213,20 +7171,20 @@
 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
+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;
+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;Landroid/graphics/drawable/VectorDrawable;,Landroid/graphics/drawable/NinePatchDrawable;,Landroid/graphics/drawable/AnimatedVectorDrawable;
+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
@@ -7269,7 +7227,7 @@
 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
+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
@@ -7336,7 +7294,7 @@
 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
+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
@@ -7357,7 +7315,7 @@
 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
+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;
@@ -7378,7 +7336,7 @@
 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
+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
@@ -7399,7 +7357,7 @@
 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
+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;
@@ -7440,7 +7398,7 @@
 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
+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
@@ -7452,7 +7410,7 @@
 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
+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
@@ -7636,21 +7594,21 @@
 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;
+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;
+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
+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
+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;
@@ -7729,7 +7687,7 @@
 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
+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
@@ -7812,7 +7770,7 @@
 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
+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;
@@ -7847,7 +7805,7 @@
 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
+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
@@ -7873,7 +7831,7 @@
 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
+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
@@ -7888,8 +7846,8 @@
 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
-HSPLandroid/graphics/drawable/VectorDrawable;->inflateChildElements(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
+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;
@@ -7903,7 +7861,7 @@
 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
+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
@@ -7951,7 +7909,6 @@
 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;->reset(Landroid/graphics/text/LineBreakConfig;)Landroid/graphics/text/LineBreakConfig$Builder;
 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
@@ -7984,7 +7941,6 @@
 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;->setComputeBounds(Z)Landroid/graphics/text/MeasuredText$Builder;
 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;
@@ -8110,8 +8066,6 @@
 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$FoldStateListener;->onBaseStateChanged(I)V
-HSPLandroid/hardware/camera2/CameraManager$FoldStateListener;->onStateChanged(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;
@@ -8189,16 +8143,12 @@
 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$DeviceStateCallback;->onSupportedStatesChanged([I)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$DeviceStateCallbackWrapper;->notifyBaseStateChanged(I)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper;->notifyStateChanged(I)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper;->notifySupportedStatesChanged([I)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
@@ -8247,7 +8197,6 @@
 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$$ExternalSyntheticLambda0;->test(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
@@ -8263,7 +8212,6 @@
 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;->isPresentationDisplay(Landroid/view/Display;)Z
 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
@@ -8273,7 +8221,7 @@
 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/hardware/display/DisplayManager$DisplayListener;missing_types]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;
+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
@@ -8287,14 +8235,12 @@
 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;
+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;->getOverlaySupport()Landroid/hardware/OverlayProperties;
 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;->handleDisplayEvent(IIZ)V+]Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;
 HSPLandroid/hardware/display/DisplayManagerGlobal;->initExtraLogging()Z
 HSPLandroid/hardware/display/DisplayManagerGlobal;->maybeLogAllDisplayListeners()V
 HSPLandroid/hardware/display/DisplayManagerGlobal;->registerCallbackIfNeededLocked()V
@@ -8597,7 +8543,7 @@
 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
+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
@@ -8605,9 +8551,9 @@
 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
+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;
+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
@@ -8698,22 +8644,22 @@
 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
+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
+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
+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;
+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
@@ -8726,7 +8672,7 @@
 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
+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
@@ -8744,13 +8690,13 @@
 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;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->putIfAbsent(ILjava/lang/Object;I)Ljava/lang/Object;
+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;
+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;
+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
@@ -8760,7 +8706,7 @@
 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
+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
@@ -8794,10 +8740,10 @@
 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;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getStringV2(I)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getTable(I)Landroid/icu/impl/ICUResourceBundleReader$Table;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getTable16KeyOffsets(I)[C
+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;
@@ -8807,10 +8753,10 @@
 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;
+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;
-HSPLandroid/icu/impl/IDNA2003;->convertToASCII(Landroid/icu/text/UCharacterIterator;I)Ljava/lang/StringBuffer;
+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
@@ -8818,9 +8764,9 @@
 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
+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
+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;
@@ -8844,10 +8790,10 @@
 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
+HSPLandroid/icu/impl/LocaleIDParser;->parseCountry()I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLandroid/icu/impl/LocaleIDParser;->parseKeywords()I
-HSPLandroid/icu/impl/LocaleIDParser;->parseLanguage()I
-HSPLandroid/icu/impl/LocaleIDParser;->parseScript()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
@@ -8876,7 +8822,7 @@
 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
+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
@@ -8910,7 +8856,7 @@
 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
+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;
@@ -8931,7 +8877,7 @@
 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
+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
@@ -9186,9 +9132,9 @@
 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
+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
+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;
@@ -9424,7 +9370,7 @@
 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;
+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
@@ -9569,7 +9515,7 @@
 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/CurrencyPrecision;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/util/Currency;Landroid/icu/util/Currency;
+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;
@@ -9631,7 +9577,7 @@
 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;
+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;
@@ -9744,7 +9690,7 @@
 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;
+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
@@ -9756,7 +9702,7 @@
 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;
+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
@@ -9799,9 +9745,9 @@
 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
+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
+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;
@@ -9894,7 +9840,7 @@
 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
+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
@@ -10090,7 +10036,7 @@
 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
+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;
@@ -10168,7 +10114,7 @@
 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
+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
@@ -10469,14 +10415,14 @@
 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;
+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;
+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;
@@ -10496,7 +10442,7 @@
 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;
+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;
@@ -10580,7 +10526,7 @@
 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;
+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;
@@ -10606,7 +10552,7 @@
 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
+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
@@ -10742,7 +10688,7 @@
 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
+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
@@ -11477,8 +11423,8 @@
 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;
-HSPLandroid/net/Uri$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+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
@@ -11513,7 +11459,7 @@
 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;
+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;
@@ -11556,7 +11502,7 @@
 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;
+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;
@@ -11588,7 +11534,7 @@
 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;
+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;
@@ -11607,8 +11553,8 @@
 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;
-HSPLandroid/net/Uri;->getQueryParameterNames()Ljava/util/Set;
+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;
@@ -11618,7 +11564,7 @@
 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/ByteBuffer;Ljava/nio/HeapByteBuffer;]Ljava/nio/charset/CharsetDecoder;Lcom/android/icu/charset/CharsetDecoderICU;
+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
@@ -11689,9 +11635,9 @@
 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
+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/PersistableBundle;,Landroid/os/Bundle;]Ljava/lang/Class;Ljava/lang/Class;
+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;
@@ -11704,7 +11650,7 @@
 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
+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
@@ -11722,7 +11668,7 @@
 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/os/Parcel;Landroid/os/Parcel;
+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
@@ -11736,7 +11682,7 @@
 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
+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
@@ -11752,7 +11698,7 @@
 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/PersistableBundle;,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;
@@ -11792,7 +11738,7 @@
 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
+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
@@ -11800,14 +11746,14 @@
 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
-HSPLandroid/os/Binder;->execTransactInternal(ILandroid/os/Parcel;Landroid/os/Parcel;II)Z
+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;
+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
@@ -11831,7 +11777,7 @@
 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
+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;
@@ -11867,7 +11813,7 @@
 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;+]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;
@@ -12095,8 +12041,8 @@
 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
-HSPLandroid/os/Handler;->enqueueMessage(Landroid/os/MessageQueue;Landroid/os/Message;J)Z
+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;
@@ -12104,7 +12050,7 @@
 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
+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
@@ -12114,9 +12060,9 @@
 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
+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
+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
@@ -12129,10 +12075,10 @@
 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
+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
+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
@@ -12162,7 +12108,7 @@
 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
+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;
@@ -12275,12 +12221,12 @@
 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
+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;
+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;
@@ -12302,7 +12248,7 @@
 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
+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
@@ -12336,7 +12282,7 @@
 HSPLandroid/os/Message;->readFromParcel(Landroid/os/Parcel;)V
 HSPLandroid/os/Message;->recycle()V
 HSPLandroid/os/Message;->recycleUnchecked()V
-HSPLandroid/os/Message;->sendToTarget()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
@@ -12355,18 +12301,18 @@
 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;Landroid/app/ActivityThread$Idler;]Landroid/os/Message;Landroid/os/Message;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+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
+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
+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
+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;
@@ -12379,7 +12325,7 @@
 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;
+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;
@@ -12406,7 +12352,7 @@
 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;
+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
@@ -12414,7 +12360,7 @@
 HSPLandroid/os/Parcel;->dataSize()I
 HSPLandroid/os/Parcel;->destroy()V
 HSPLandroid/os/Parcel;->enforceInterface(Ljava/lang/String;)V
-HSPLandroid/os/Parcel;->enforceNoDataAvail()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
@@ -12447,10 +12393,10 @@
 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
+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;
+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
@@ -12479,7 +12425,7 @@
 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;missing_types]Landroid/os/Parcelable$ClassLoaderCreator;Landroid/content/pm/ParceledListSlice$1;
+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;
@@ -12487,14 +12433,14 @@
 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;
+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;
+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
@@ -12507,7 +12453,7 @@
 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;missing_types]Landroid/os/Parcel;Landroid/os/Parcel;
+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;
@@ -12525,7 +12471,7 @@
 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
+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
@@ -12565,12 +12511,12 @@
 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
-HSPLandroid/os/Parcel;->writeTypedArray([Landroid/os/Parcelable;I)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
+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;
@@ -12761,7 +12707,7 @@
 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;
+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;
@@ -12862,7 +12808,7 @@
 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
+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
@@ -12908,7 +12854,7 @@
 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
+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;
@@ -12986,12 +12932,12 @@
 HSPLandroid/os/Temperature;->getStatus()I
 HSPLandroid/os/Temperature;->isValidStatus(I)Z
 HSPLandroid/os/ThreadLocalWorkSource$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-HSPLandroid/os/ThreadLocalWorkSource;->getToken()J
-HSPLandroid/os/ThreadLocalWorkSource;->getUid()I
+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
-HSPLandroid/os/ThreadLocalWorkSource;->setUid(I)J
+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
@@ -13190,7 +13136,7 @@
 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;
+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;
@@ -13249,7 +13195,6 @@
 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;->checkPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/permission/IPermissionManager$Stub$Proxy;Landroid/permission/IPermissionManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel;
 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
@@ -13277,11 +13222,10 @@
 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;->-$$Nest$smcheckPermissionUncached(Ljava/lang/String;III)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;
+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;
@@ -13344,15 +13288,15 @@
 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;
+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;
-HSPLandroid/provider/Settings$NameValueCache;->getStringsForPrefixStripPrefix(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/List;)Ljava/util/Map;+]Ljava/lang/String;Ljava/lang/String;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/provider/Settings$GenerationTracker;Landroid/provider/Settings$GenerationTracker;]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Ljava/util/Iterator;Ljava/util/Arrays$ArrayItr;,Ljava/util/HashMap$EntryIterator;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/provider/Settings$ContentProviderHolder;Landroid/provider/Settings$ContentProviderHolder;]Ljava/util/Set;Ljava/util/HashMap$EntrySet;]Landroid/content/IContentProvider;Landroid/content/ContentProvider$Transport;,Landroid/content/ContentProviderProxy;]Landroid/content/ContentResolver;Landroid/app/ContextImpl$ApplicationContentResolver;]Landroid/net/Uri;Landroid/net/Uri$StringUri;
+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;
@@ -13396,13 +13340,9 @@
 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/SeFrameworkInitializer;->setSeServiceManager(Landroid/se/omapi/SeServiceManager;)V
 HSPLandroid/se/omapi/SeServiceManager;-><init>()V
 HSPLandroid/security/FeatureFlagsImpl;-><init>()V
-HSPLandroid/security/FeatureFlagsImpl;->certificateTransparencyConfiguration()Z
 HSPLandroid/security/Flags;-><clinit>()V
-HSPLandroid/security/Flags;->certificateTransparencyConfiguration()Z
-HSPLandroid/security/Flags;->contentUriPermissionApis()Z+]Landroid/security/FeatureFlags;Landroid/security/FeatureFlagsImpl;
 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
@@ -13612,7 +13552,6 @@
 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;->isCertificateTransparencyVerificationRequired(Ljava/lang/String;)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
@@ -13711,12 +13650,6 @@
 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/autofill/FeatureFlagsImpl;-><init>()V
-HSPLandroid/service/autofill/FeatureFlagsImpl;->autofillCredmanIntegration()Z
-HSPLandroid/service/autofill/FeatureFlagsImpl;->relayout()Z
-HSPLandroid/service/autofill/Flags;-><clinit>()V
-HSPLandroid/service/autofill/Flags;->autofillCredmanIntegration()Z
-HSPLandroid/service/autofill/Flags;->relayout()Z
 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
@@ -13756,18 +13689,18 @@
 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
+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
+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
+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
+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
@@ -13796,7 +13729,7 @@
 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
+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;
@@ -13815,7 +13748,7 @@
 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;
+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
@@ -13878,14 +13811,10 @@
 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;->tryParseBoolean(Ljava/lang/String;)Ljava/lang/Boolean;
 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$$ExternalSyntheticLambda11;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda2;-><init>()V
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda2;->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;
@@ -14302,7 +14231,7 @@
 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;
+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
@@ -14386,7 +14315,6 @@
 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$$ExternalSyntheticLambda13;->applyOrThrow(Ljava/lang/Object;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;
@@ -14658,7 +14586,6 @@
 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$fgetmDrawingBounds(Landroid/text/BoringLayout$Metrics;)Landroid/graphics/RectF;
 HSPLandroid/text/BoringLayout$Metrics;->-$$Nest$mreset(Landroid/text/BoringLayout$Metrics;)V
 HSPLandroid/text/BoringLayout$Metrics;-><init>()V
 HSPLandroid/text/BoringLayout$Metrics;->reset()V
@@ -14681,7 +14608,7 @@
 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
+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;
@@ -14690,7 +14617,6 @@
 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;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;IZZLandroid/graphics/Paint$FontMetrics;)Landroid/text/BoringLayout;+]Landroid/text/BoringLayout;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
@@ -14699,7 +14625,6 @@
 HSPLandroid/text/CharSequenceCharacterIterator;->getIndex()I
 HSPLandroid/text/CharSequenceCharacterIterator;->next()C
 HSPLandroid/text/CharSequenceCharacterIterator;->setIndex(I)C
-HSPLandroid/text/ClientFlags;->fixLineHeightForLocale()Z
 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
@@ -14710,7 +14635,7 @@
 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
+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
@@ -14719,19 +14644,19 @@
 HSPLandroid/text/DynamicLayout;->getEllipsisCount(I)I
 HSPLandroid/text/DynamicLayout;->getEllipsisStart(I)I
 HSPLandroid/text/DynamicLayout;->getEllipsizedWidth()I
-HSPLandroid/text/DynamicLayout;->getEndHyphenEdit(I)I
+HSPLandroid/text/DynamicLayout;->getEndHyphenEdit(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
 HSPLandroid/text/DynamicLayout;->getIndexFirstChangedBlock()I
-HSPLandroid/text/DynamicLayout;->getLineContainsTab(I)Z
+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
-HSPLandroid/text/DynamicLayout;->getLineDirections(I)Landroid/text/Layout$Directions;
+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
-HSPLandroid/text/DynamicLayout;->getStartHyphenEdit(I)I
-HSPLandroid/text/DynamicLayout;->reflow(Ljava/lang/CharSequence;III)V
+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
@@ -14787,9 +14712,9 @@
 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
+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
+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
@@ -14804,28 +14729,27 @@
 HSPLandroid/text/Layout;->getLineBaseline(I)I
 HSPLandroid/text/Layout;->getLineBottom(I)I
 HSPLandroid/text/Layout;->getLineBottom(IZ)I
-HSPLandroid/text/Layout;->getLineEnd(I)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
+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
+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;->getLineVisibleEnd(IIIZ)I+]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout;,Landroid/text/StaticLayout;]Ljava/lang/CharSequence;megamorphic_types
 HSPLandroid/text/Layout;->getLineWidth(I)F
 HSPLandroid/text/Layout;->getOffsetAtStartOf(I)I
 HSPLandroid/text/Layout;->getOffsetForHorizontal(IF)I
-HSPLandroid/text/Layout;->getOffsetForHorizontal(IFZ)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;
-HSPLandroid/text/Layout;->getParagraphLeadingMargin(I)I
+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;
+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
@@ -14844,13 +14768,11 @@
 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/style/MetricAffectingSpan;missing_types]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/graphics/text/LineBreakConfig$Builder;Landroid/graphics/text/LineBreakConfig$Builder;]Landroid/text/AutoGrowArray$IntArray;Landroid/text/AutoGrowArray$IntArray;
+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;->buildForStaticLayout(Landroid/text/TextPaint;Landroid/graphics/text/LineBreakConfig;Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;IZZLandroid/text/MeasuredParagraph;Landroid/text/MeasuredParagraph;)Landroid/text/MeasuredParagraph;
-HSPLandroid/text/MeasuredParagraph;->buildForStaticLayoutInternal(Landroid/text/TextPaint;Landroid/graphics/text/LineBreakConfig;Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;IZZLandroid/text/MeasuredParagraph;Landroid/text/MeasuredParagraph;Landroid/text/MeasuredParagraph$StyleRunCallback;)Landroid/text/MeasuredParagraph;+]Landroid/graphics/text/MeasuredText$Builder;Landroid/graphics/text/MeasuredText$Builder;]Landroid/text/Spanned;missing_types]Landroid/text/AutoGrowArray$IntArray;Landroid/text/AutoGrowArray$IntArray;
 HSPLandroid/text/MeasuredParagraph;->getCharWidthAt(I)F
 HSPLandroid/text/MeasuredParagraph;->getChars()[C
 HSPLandroid/text/MeasuredParagraph;->getDirections(II)Landroid/text/Layout$Directions;
@@ -14868,7 +14790,7 @@
 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
+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
@@ -14876,7 +14798,7 @@
 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
+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
@@ -14886,9 +14808,8 @@
 HSPLandroid/text/PrecomputedText$Params;->getHyphenationFrequency()I
 HSPLandroid/text/PrecomputedText$Params;->getTextDirection()Landroid/text/TextDirectionHeuristic;
 HSPLandroid/text/PrecomputedText$Params;->getTextPaint()Landroid/text/TextPaint;
-HSPLandroid/text/PrecomputedText;->createMeasuredParagraphs(Ljava/lang/CharSequence;Landroid/text/PrecomputedText$Params;IIZZ)[Landroid/text/PrecomputedText$ParagraphInfo;+]Landroid/text/PrecomputedText$Params;Landroid/text/PrecomputedText$Params;]Landroid/graphics/text/LineBreakConfig;Landroid/graphics/text/LineBreakConfig;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLandroid/text/Selection;->getSelectionEnd(Ljava/lang/CharSequence;)I
-HSPLandroid/text/Selection;->getSelectionStart(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
@@ -14898,7 +14819,7 @@
 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
+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;
@@ -14916,17 +14837,17 @@
 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
+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;
+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
+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
+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
@@ -14936,12 +14857,12 @@
 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
-HSPLandroid/text/SpannableStringBuilder;->getSpanFlags(Ljava/lang/Object;)I
-HSPLandroid/text/SpannableStringBuilder;->getSpanStart(Ljava/lang/Object;)I
-HSPLandroid/text/SpannableStringBuilder;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;
+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
+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;
@@ -14960,48 +14881,48 @@
 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;
+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
+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
+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
+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;
+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
-HSPLandroid/text/SpannableStringInternal;->charAt(I)C
-HSPLandroid/text/SpannableStringInternal;->checkRange(Ljava/lang/String;II)V
-HSPLandroid/text/SpannableStringInternal;->copySpansFromInternal(Landroid/text/SpannableStringInternal;IIZ)V
-HSPLandroid/text/SpannableStringInternal;->copySpansFromSpanned(Landroid/text/Spanned;IIZ)V
+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
+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;
-HSPLandroid/text/SpannableStringInternal;->length()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
+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
+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
@@ -15027,7 +14948,6 @@
 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$fgetmUseBoundsForWidth(Landroid/text/StaticLayout$Builder;)Z
 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;
@@ -15047,7 +14967,7 @@
 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
+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
@@ -15057,7 +14977,7 @@
 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;
+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
@@ -15066,7 +14986,7 @@
 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
+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
@@ -15077,7 +14997,6 @@
 HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicInternal;->defaultIsRtl()Z
 HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicLocale;->defaultIsRtl()Z
 HSPLandroid/text/TextDirectionHeuristics;->isRtlCodePoint(I)I
-HSPLandroid/text/TextFlags;-><clinit>()V
 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
@@ -15086,27 +15005,24 @@
 HSPLandroid/text/TextLine;-><init>()V
 HSPLandroid/text/TextLine;->adjustEndHyphenEdit(II)I
 HSPLandroid/text/TextLine;->adjustStartHyphenEdit(II)I
-HSPLandroid/text/TextLine;->calculateRunFlag(III)I
-HSPLandroid/text/TextLine;->draw(Landroid/graphics/Canvas;FIII)V
+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
+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
-HSPLandroid/text/TextLine;->extractDecorationInfo(Landroid/text/TextPaint;Landroid/text/TextLine$DecorationInfo;)V
-HSPLandroid/text/TextLine;->getOffsetBeforeAfter(IIIZIZ)I
+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;
+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;->measureRun(IIIZLandroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;[FIFLandroid/text/TextLine$LineInfo;I)F
-HSPLandroid/text/TextLine;->metrics(Landroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;ZLandroid/text/TextLine$LineInfo;)F+]Landroid/text/TextLine;Landroid/text/TextLine;
 HSPLandroid/text/TextLine;->obtain()Landroid/text/TextLine;
-HSPLandroid/text/TextLine;->recycle(Landroid/text/TextLine;)Landroid/text/TextLine;
-HSPLandroid/text/TextLine;->set(Landroid/text/TextPaint;Ljava/lang/CharSequence;IIILandroid/text/Layout$Directions;ZLandroid/text/Layout$TabStops;IIZ)V
+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
@@ -15123,7 +15039,7 @@
 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;
+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
@@ -15131,23 +15047,23 @@
 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
+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;
+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
+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
+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;
+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
@@ -15160,14 +15076,14 @@
 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;
+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
+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;
@@ -15274,7 +15190,7 @@
 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
+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
@@ -15293,7 +15209,7 @@
 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
+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;
@@ -15359,7 +15275,7 @@
 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
+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
@@ -15472,8 +15388,8 @@
 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;
-HSPLandroid/util/ArrayMap;->putAll(Landroid/util/ArrayMap;)V
+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;
@@ -15494,11 +15410,11 @@
 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
+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
+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
@@ -15538,7 +15454,7 @@
 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
+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;
@@ -15641,9 +15557,9 @@
 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;
-HSPLandroid/util/JsonWriter;->replaceTop(Landroid/util/JsonScope;)V
-HSPLandroid/util/JsonWriter;->string(Ljava/lang/String;)V
+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;
@@ -15693,7 +15609,7 @@
 HSPLandroid/util/LongSparseArray;->clear()V
 HSPLandroid/util/LongSparseArray;->delete(J)V
 HSPLandroid/util/LongSparseArray;->gc()V
-HSPLandroid/util/LongSparseArray;->get(J)Ljava/lang/Object;
+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
@@ -16039,8 +15955,8 @@
 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
-HSPLandroid/view/Choreographer$CallbackRecord;->run(Landroid/view/Choreographer$FrameData;)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
@@ -16053,8 +15969,8 @@
 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
-HSPLandroid/view/Choreographer$FrameDisplayEventReceiver;->run()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
@@ -16071,12 +15987,12 @@
 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$FrameData;Landroid/view/Choreographer$FrameData;]Landroid/view/Choreographer$CallbackRecord;Landroid/view/Choreographer$CallbackRecord;
-HSPLandroid/view/Choreographer;->doFrame(JILandroid/view/DisplayEventReceiver$VsyncEventData;)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
+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;
@@ -16085,17 +16001,17 @@
 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
+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
-HSPLandroid/view/Choreographer;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)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
+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
@@ -16106,7 +16022,7 @@
 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;
+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
@@ -16145,11 +16061,10 @@
 HSPLandroid/view/Display;->getHdrSdrRatio()F
 HSPLandroid/view/Display;->getHeight()I
 HSPLandroid/view/Display;->getInstallOrientation()I
-HSPLandroid/view/Display;->getLocalRotation()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;->getOverlaySupport()Landroid/hardware/OverlayProperties;
 HSPLandroid/view/Display;->getPreferredWideGamutColorSpace()Landroid/graphics/ColorSpace;
 HSPLandroid/view/Display;->getPresentationDeadlineNanos()J
 HSPLandroid/view/Display;->getRealMetrics(Landroid/util/DisplayMetrics;)V
@@ -16168,7 +16083,7 @@
 HSPLandroid/view/Display;->shouldReportMaxBounds()Z
 HSPLandroid/view/Display;->stateToString(I)Ljava/lang/String;
 HSPLandroid/view/Display;->updateCachedAppSizeIfNeededLocked()V
-HSPLandroid/view/Display;->updateDisplayInfoLocked()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
@@ -16220,7 +16135,7 @@
 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
+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
@@ -16230,7 +16145,7 @@
 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
+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;
@@ -16239,14 +16154,14 @@
 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
+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
+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
@@ -16282,7 +16197,7 @@
 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
+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
@@ -16316,7 +16231,7 @@
 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
+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
@@ -16335,13 +16250,6 @@
 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;-><clinit>()V
-HSPLandroid/view/HdrRenderState;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/HdrRenderState;->forceUpdateHdrSdrRatio()V+]Landroid/view/HdrRenderState;Landroid/view/HdrRenderState;]Landroid/view/Display;Landroid/view/Display;
-HSPLandroid/view/HdrRenderState;->getDesiredHdrSdrRatio()F
-HSPLandroid/view/HdrRenderState;->getRenderHdrSdrRatio()F
-HSPLandroid/view/HdrRenderState;->isHdrEnabled()Z
-HSPLandroid/view/HdrRenderState;->setDesiredHdrSdrRatio(ZF)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;
@@ -16376,7 +16284,7 @@
 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
+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
@@ -16501,8 +16409,6 @@
 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$$ExternalSyntheticLambda12;->get()Ljava/lang/Object;
-HSPLandroid/view/InsetsController$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/view/InsetsController$$ExternalSyntheticLambda7;-><init>()V
 HSPLandroid/view/InsetsController$$ExternalSyntheticLambda9;-><init>(Landroid/view/InsetsController;)V
 HSPLandroid/view/InsetsController$1;-><init>(Landroid/view/InsetsController;)V
@@ -16562,7 +16468,7 @@
 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
+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
@@ -16579,7 +16485,7 @@
 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;
+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
@@ -16637,8 +16543,8 @@
 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;
-HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;IZ)Landroid/graphics/Insets;
+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;
@@ -16650,8 +16556,8 @@
 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;
-HSPLandroid/view/InsetsState;->getDisplayCutoutSafe(Landroid/graphics/Rect;)V
+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;
@@ -16733,7 +16639,7 @@
 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
+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
@@ -16895,9 +16801,8 @@
 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$RefreshRateRange;-><init>(FF)V
 HSPLandroid/view/SurfaceControl$Transaction;-><init>()V
-HSPLandroid/view/SurfaceControl$Transaction;-><init>(J)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
@@ -16905,7 +16810,7 @@
 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;
+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;
@@ -16915,7 +16820,7 @@
 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;
+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;
@@ -16949,10 +16854,8 @@
 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$NoOpRegistry;->add(Landroid/view/SurfaceControl;)V
 HSPLandroid/view/SurfaceControlRegistry;-><clinit>()V
 HSPLandroid/view/SurfaceControlRegistry;->getProcessInstance()Landroid/view/SurfaceControlRegistry;
-HSPLandroid/view/SurfaceControlRegistry;->initializeCallStackDebugging()V
 HSPLandroid/view/SurfaceSession;-><init>()V
 HSPLandroid/view/SurfaceSession;->finalize()V
 HSPLandroid/view/SurfaceSession;->kill()V
@@ -17026,8 +16929,8 @@
 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
-HSPLandroid/view/ThreadedRenderer$1;->onFrameDraw(IJ)Landroid/graphics/HardwareRenderer$FrameCommitCallback;
+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
@@ -17042,7 +16945,7 @@
 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
+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
@@ -17053,20 +16956,20 @@
 HSPLandroid/view/ThreadedRenderer;->isEnabled()Z
 HSPLandroid/view/ThreadedRenderer;->isRequested()Z
 HSPLandroid/view/ThreadedRenderer;->loadSystemProperties()Z
-HSPLandroid/view/ThreadedRenderer;->registerRtFrameCallback(Landroid/graphics/HardwareRenderer$FrameDrawingCallback;)V
+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
+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
+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
-HSPLandroid/view/ThreadedRenderer;->updateWebViewOverlayCallbacks()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
@@ -17080,7 +16983,6 @@
 HSPLandroid/view/VelocityTracker;->getYVelocity(I)F
 HSPLandroid/view/VelocityTracker;->obtain()Landroid/view/VelocityTracker;
 HSPLandroid/view/VelocityTracker;->recycle()V
-HSPLandroid/view/View$$ExternalSyntheticLambda3;->get()Ljava/lang/Object;
 HSPLandroid/view/View$$ExternalSyntheticLambda4;-><init>(Landroid/view/View;)V
 HSPLandroid/view/View$$ExternalSyntheticLambda4;->run()V
 HSPLandroid/view/View$$ExternalSyntheticLambda5;->run()V
@@ -17089,7 +16991,7 @@
 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
+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
@@ -17143,15 +17045,15 @@
 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
+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/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Landroid/content/Context;missing_types]Ljava/lang/Class;Ljava/lang/Class;
+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/res/TypedArray;Landroid/content/res/TypedArray;
+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
@@ -17167,7 +17069,7 @@
 HSPLandroid/view/View;->areDrawablesResolved()Z
 HSPLandroid/view/View;->assignParent(Landroid/view/ViewParent;)V
 HSPLandroid/view/View;->awakenScrollBars()Z
-HSPLandroid/view/View;->awakenScrollBars(IZ)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
@@ -17177,8 +17079,8 @@
 HSPLandroid/view/View;->canHaveDisplayList()Z
 HSPLandroid/view/View;->canNotifyAutofillEnterExitEvent()Z
 HSPLandroid/view/View;->canReceivePointerEvents()Z
-HSPLandroid/view/View;->canResolveLayoutDirection()Z
-HSPLandroid/view/View;->canResolveTextDirection()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
@@ -17208,18 +17110,18 @@
 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
+HSPLandroid/view/View;->computeVerticalScrollExtent()I+]Landroid/view/View;missing_types
 HSPLandroid/view/View;->computeVerticalScrollOffset()I
-HSPLandroid/view/View;->computeVerticalScrollRange()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;
+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
+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
+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
@@ -17249,14 +17151,14 @@
 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
-HSPLandroid/view/View;->draw(Landroid/graphics/Canvas;Landroid/view/ViewGroup;J)Z
-HSPLandroid/view/View;->drawAutofilledHighlight(Landroid/graphics/Canvas;)V
-HSPLandroid/view/View;->drawBackground(Landroid/graphics/Canvas;)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
-HSPLandroid/view/View;->drawsWithRenderNode(Landroid/graphics/Canvas;)Z
+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;
@@ -17300,8 +17202,8 @@
 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;
-HSPLandroid/view/View;->getDrawableState()[I
+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
@@ -17317,7 +17219,7 @@
 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
+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
@@ -17330,16 +17232,16 @@
 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
+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
+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;
+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
@@ -17371,15 +17273,15 @@
 HSPLandroid/view/View;->getRotationX()F
 HSPLandroid/view/View;->getRotationY()F
 HSPLandroid/view/View;->getRunQueue()Landroid/view/HandlerActionQueue;
-HSPLandroid/view/View;->getScaleX()F
-HSPLandroid/view/View;->getScaleY()F
+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
-HSPLandroid/view/View;->getSuggestedMinimumHeight()I
-HSPLandroid/view/View;->getSuggestedMinimumWidth()I
+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;
@@ -17391,10 +17293,10 @@
 HSPLandroid/view/View;->getTransitionAlpha()F
 HSPLandroid/view/View;->getTransitionName()Ljava/lang/String;
 HSPLandroid/view/View;->getTranslationX()F
-HSPLandroid/view/View;->getTranslationY()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
+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;
@@ -17402,7 +17304,7 @@
 HSPLandroid/view/View;->getWidth()I
 HSPLandroid/view/View;->getWindowAttachCount()I
 HSPLandroid/view/View;->getWindowId()Landroid/view/WindowId;
-HSPLandroid/view/View;->getWindowInsetsController()Landroid/view/WindowInsetsController;
+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
@@ -17437,17 +17339,17 @@
 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
+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
-HSPLandroid/view/View;->invalidate(IIII)V
-HSPLandroid/view/View;->invalidate(Landroid/graphics/Rect;)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;missing_types]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewParent;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
@@ -17492,7 +17394,7 @@
 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
+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
@@ -17517,18 +17419,17 @@
 HSPLandroid/view/View;->isVisibleToUser()Z
 HSPLandroid/view/View;->isVisibleToUser(Landroid/graphics/Rect;)Z
 HSPLandroid/view/View;->jumpDrawablesToCurrentState()V
-HSPLandroid/view/View;->layout(IIII)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;missing_types]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;
+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;->notifyAutofillManagerViewVisibilityChanged(Z)V+]Landroid/os/Handler;Landroid/view/View$VisibilityChangeForAutofillHandler;]Landroid/os/Message;Landroid/os/Message;]Landroid/view/autofill/AutofillManager;Landroid/view/autofill/AutofillManager;]Landroid/view/View;missing_types
 HSPLandroid/view/View;->notifyEnterOrExitForAutoFillIfNeeded(Z)V
 HSPLandroid/view/View;->notifyGlobalFocusCleared(Landroid/view/View;)V
 HSPLandroid/view/View;->notifySubtreeAccessibilityStateChangedByParentIfNeeded()V
@@ -17540,21 +17441,21 @@
 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
+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
+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
+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
+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
+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
@@ -17564,7 +17465,7 @@
 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
+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
@@ -17579,7 +17480,7 @@
 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;missing_types]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Landroid/graphics/drawable/Drawable;missing_types
+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
@@ -17600,12 +17501,12 @@
 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
+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
+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
@@ -17640,9 +17541,9 @@
 HSPLandroid/view/View;->resetSubtreeAccessibilityStateChanged()V
 HSPLandroid/view/View;->resolveDrawables()V
 HSPLandroid/view/View;->resolveLayoutDirection()Z
-HSPLandroid/view/View;->resolveLayoutParams()V
-HSPLandroid/view/View;->resolvePadding()V
-HSPLandroid/view/View;->resolveRtlPropertiesIfNeeded()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
@@ -17673,10 +17574,10 @@
 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
+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
-HSPLandroid/view/View;->setBackgroundRenderNodeProperties(Landroid/graphics/RenderNode;)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
@@ -17686,18 +17587,18 @@
 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
+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/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager;]Landroid/view/ViewParent;Landroid/view/ViewRootImpl;
+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
+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
@@ -17714,7 +17615,7 @@
 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
+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
@@ -17752,8 +17653,8 @@
 HSPLandroid/view/View;->setRotationY(F)V
 HSPLandroid/view/View;->setSaveEnabled(Z)V
 HSPLandroid/view/View;->setSaveFromParentEnabled(Z)V
-HSPLandroid/view/View;->setScaleX(F)V
-HSPLandroid/view/View;->setScaleY(F)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
@@ -17776,15 +17677,15 @@
 HSPLandroid/view/View;->setTransitionVisibility(I)V
 HSPLandroid/view/View;->setTranslationX(F)V
 HSPLandroid/view/View;->setTranslationY(F)V
-HSPLandroid/view/View;->setTranslationZ(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
+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
+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
@@ -17794,7 +17695,7 @@
 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;missing_types]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
+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
@@ -17867,7 +17768,7 @@
 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
+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
@@ -17913,14 +17814,14 @@
 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
+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
+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
+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
@@ -17945,7 +17846,7 @@
 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
+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
@@ -17964,13 +17865,13 @@
 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;
+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
+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
@@ -17999,7 +17900,7 @@
 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
+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
@@ -18011,7 +17912,7 @@
 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
+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
@@ -18046,7 +17947,7 @@
 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
+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
@@ -18060,9 +17961,9 @@
 HSPLandroid/view/ViewGroup;->resetTouchState()V
 HSPLandroid/view/ViewGroup;->resolveDrawables()V
 HSPLandroid/view/ViewGroup;->resolveLayoutDirection()Z
-HSPLandroid/view/ViewGroup;->resolveLayoutParams()V
+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
+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
@@ -18088,7 +17989,7 @@
 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
+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
@@ -18114,7 +18015,7 @@
 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
+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
@@ -18140,17 +18041,7 @@
 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$$ExternalSyntheticLambda18;->run()V
 HSPLandroid/view/ViewRootImpl$$ExternalSyntheticLambda3;->run()V
-HSPLandroid/view/ViewRootImpl$$ExternalSyntheticLambda6;->accept(Ljava/lang/Object;)V
-HSPLandroid/view/ViewRootImpl$4;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$8;->run()V+]Ljava/util/Optional;Ljava/util/Optional;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;
-HSPLandroid/view/ViewRootImpl$9$$ExternalSyntheticLambda3;-><init>(Landroid/view/ViewRootImpl$9;JLandroid/window/SurfaceSyncGroup;Z)V
-HSPLandroid/view/ViewRootImpl$9$$ExternalSyntheticLambda3;->onFrameCommit(Z)V
-HSPLandroid/view/ViewRootImpl$9;->$r8$lambda$87sb7YFlAxJB5bDf7ZdJlACs2qw(Landroid/view/ViewRootImpl$9;JLandroid/window/SurfaceSyncGroup;ZZ)V
-HSPLandroid/view/ViewRootImpl$9;-><init>(Landroid/view/ViewRootImpl;Landroid/view/SurfaceControl$Transaction;Landroid/window/SurfaceSyncGroup;Z)V
-HSPLandroid/view/ViewRootImpl$9;->lambda$onFrameDraw$3(JLandroid/window/SurfaceSyncGroup;ZZ)V
-HSPLandroid/view/ViewRootImpl$9;->onFrameDraw(IJ)Landroid/graphics/HardwareRenderer$FrameCommitCallback;
 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
@@ -18171,7 +18062,7 @@
 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
+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
@@ -18183,10 +18074,10 @@
 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
-HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->postIfNeededLocked()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
+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
@@ -18210,7 +18101,7 @@
 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
+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
@@ -18235,28 +18126,24 @@
 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$W;->resized(Landroid/window/ClientWindowFrames;ZLandroid/util/MergedConfiguration;Landroid/view/InsetsState;ZZIIZ)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;->$r8$lambda$kydZ5VrQzxxxtiGWLXqElnQw9pY(Landroid/view/ViewRootImpl;ILandroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/view/ViewRootImpl;->$r8$lambda$mXUz2hQqgF1vi6zgAMk8eGZNG-o(Landroid/view/ViewRootImpl;)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$mdispatchResized(Landroid/view/ViewRootImpl;Landroid/window/ClientWindowFrames;ZLandroid/util/MergedConfiguration;Landroid/view/InsetsState;ZZIIZ)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
+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
+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
@@ -18265,14 +18152,13 @@
 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
+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
+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;->determineForceDarkType()I
 HSPLandroid/view/ViewRootImpl;->die(Z)Z
 HSPLandroid/view/ViewRootImpl;->dipToPx(I)I
 HSPLandroid/view/ViewRootImpl;->dispatchAppVisibility(Z)V
@@ -18283,14 +18169,13 @@
 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
+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;->dispatchResized(Landroid/window/ClientWindowFrames;ZLandroid/util/MergedConfiguration;Landroid/view/InsetsState;ZZIIZ)V
 HSPLandroid/view/ViewRootImpl;->doConsumeBatchedInput(J)Z
 HSPLandroid/view/ViewRootImpl;->doDie()V
 HSPLandroid/view/ViewRootImpl;->doProcessInputEvents()V
-HSPLandroid/view/ViewRootImpl;->doTraversal()V
-HSPLandroid/view/ViewRootImpl;->draw(ZLandroid/window/SurfaceSyncGroup;Z)Z
+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
@@ -18312,10 +18197,10 @@
 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;
+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
+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;
@@ -18324,12 +18209,12 @@
 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;
+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;
+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
@@ -18341,14 +18226,14 @@
 HSPLandroid/view/ViewRootImpl;->handleContentCaptureFlush()V
 HSPLandroid/view/ViewRootImpl;->handleDispatchSystemUiVisibilityChanged()V
 HSPLandroid/view/ViewRootImpl;->handleWindowFocusChanged()V
-HSPLandroid/view/ViewRootImpl;->invalidate()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
+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
@@ -18362,45 +18247,43 @@
 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;->logAndTrace(Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 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
-HSPLandroid/view/ViewRootImpl;->mergeWithNextTransaction(Landroid/view/SurfaceControl$Transaction;J)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
+HSPLandroid/view/ViewRootImpl;->notifyDrawStarted(Z)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLandroid/view/ViewRootImpl;->notifyInsetsChanged()V
-HSPLandroid/view/ViewRootImpl;->notifyRendererOfFramePending()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
+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;->performConfigurationChange(Landroid/util/MergedConfiguration;ZI)V
 HSPLandroid/view/ViewRootImpl;->performContentCaptureInitialReport()V
-HSPLandroid/view/ViewRootImpl;->performDraw(Landroid/window/SurfaceSyncGroup;)Z
-HSPLandroid/view/ViewRootImpl;->performLayout(Landroid/view/WindowManager$LayoutParams;II)V
-HSPLandroid/view/ViewRootImpl;->performMeasure(II)V
-HSPLandroid/view/ViewRootImpl;->performTraversals()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
+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
+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
-HSPLandroid/view/ViewRootImpl;->relayoutWindow(Landroid/view/WindowManager$LayoutParams;IZ)I
+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
@@ -18410,27 +18293,24 @@
 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
+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
+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
-HSPLandroid/view/ViewRootImpl;->setLayoutParams(Landroid/view/WindowManager$LayoutParams;Z)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;->setPreferredFrameRate(F)V
-HSPLandroid/view/ViewRootImpl;->setPreferredFrameRateCategory(I)V
 HSPLandroid/view/ViewRootImpl;->setTag()V
-HSPLandroid/view/ViewRootImpl;->setView(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;Landroid/view/View;I)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;->shouldEnableDvrr()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;
@@ -18438,14 +18318,13 @@
 HSPLandroid/view/ViewRootImpl;->systemGestureExclusionChanged()V
 HSPLandroid/view/ViewRootImpl;->unscheduleConsumeBatchedInput()V
 HSPLandroid/view/ViewRootImpl;->unscheduleTraversals()V
-HSPLandroid/view/ViewRootImpl;->updateBlastSurfaceIfNeeded()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;->updateColorModeIfNeeded(IF)V+]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/HdrRenderState;Landroid/view/HdrRenderState;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
 HSPLandroid/view/ViewRootImpl;->updateCompatSysUiVisibility(III)V
 HSPLandroid/view/ViewRootImpl;->updateCompatSystemUiVisibilityInfo(IIII)V
 HSPLandroid/view/ViewRootImpl;->updateConfiguration(I)V
-HSPLandroid/view/ViewRootImpl;->updateContentDrawBounds()Z
+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
@@ -18492,11 +18371,11 @@
 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
+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
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->start()Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;
+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
@@ -18514,7 +18393,7 @@
 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
+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
@@ -18563,7 +18442,7 @@
 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
+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
@@ -18637,18 +18516,17 @@
 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
-HSPLandroid/view/WindowLayout;->computeSurfaceSize(Landroid/view/WindowManager$LayoutParams;Landroid/graphics/Rect;IILandroid/graphics/Rect;ZLandroid/graphics/Point;)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
+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;->getDesiredHdrHeadroom()F
 HSPLandroid/view/WindowManager$LayoutParams;->getFitInsetsSides()I
 HSPLandroid/view/WindowManager$LayoutParams;->getFitInsetsTypes()I
 HSPLandroid/view/WindowManager$LayoutParams;->getTitle()Ljava/lang/CharSequence;
@@ -18661,7 +18539,7 @@
 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
+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
@@ -18674,7 +18552,7 @@
 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
+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;
@@ -18686,7 +18564,7 @@
 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
+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
@@ -18699,7 +18577,7 @@
 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
+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;
@@ -18725,7 +18603,7 @@
 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
+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
@@ -18763,10 +18641,6 @@
 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/FeatureFlagsImpl;-><init>()V
-HSPLandroid/view/accessibility/FeatureFlagsImpl;->forceInvertColor()Z
-HSPLandroid/view/accessibility/Flags;-><clinit>()V
-HSPLandroid/view/accessibility/Flags;->forceInvertColor()Z
 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
@@ -18885,7 +18759,7 @@
 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
+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
@@ -18904,7 +18778,7 @@
 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
+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
@@ -18950,19 +18824,12 @@
 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;->getAllowlistStringFromFlag()Ljava/lang/String;
 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;->isCredentialManagerEnabled()Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->isFillAndSaveDialogDisabledForCredentialManager()Z
 HSPLandroid/view/autofill/AutofillFeatureFlags;->isFillDialogEnabled()Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->isTriggerFillRequestOnFilteredImportantViewsEnabled()Z
 HSPLandroid/view/autofill/AutofillFeatureFlags;->isTriggerFillRequestOnUnimportantViewEnabled()Z
 HSPLandroid/view/autofill/AutofillFeatureFlags;->lambda$getFillDialogEnabledHints$1(Ljava/lang/String;)Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->shouldAlwaysIncludeWebviewInAssistStructure()Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->shouldEnableAutofillOnAllViewTypes()Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->shouldEnableMultilineFilter()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;
@@ -19161,7 +19028,6 @@
 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/flags/FeatureFlagsImpl;->enableSurfaceNativeAllocRegistrationRo()Z
 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
@@ -19195,8 +19061,6 @@
 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/FeatureFlagsImpl;-><init>()V
-HSPLandroid/view/inputmethod/Flags;-><clinit>()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;
@@ -19810,7 +19674,7 @@
 HSPLandroid/widget/EdgeEffect;->isAtEquilibrium()Z
 HSPLandroid/widget/EdgeEffect;->isFinished()Z
 HSPLandroid/widget/EdgeEffect;->onAbsorb(I)V
-HSPLandroid/widget/EdgeEffect;->onPull(FF)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
@@ -19883,7 +19747,7 @@
 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
+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
@@ -19892,7 +19756,7 @@
 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
+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
@@ -19957,7 +19821,7 @@
 HSPLandroid/widget/Editor;->onLocaleChanged()V
 HSPLandroid/widget/Editor;->onScreenStateChanged(I)V
 HSPLandroid/widget/Editor;->onScrollChanged()V
-HSPLandroid/widget/Editor;->onTouchEvent(Landroid/view/MotionEvent;)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;
@@ -19985,7 +19849,7 @@
 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
+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
@@ -20005,13 +19869,13 @@
 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
-HSPLandroid/widget/FrameLayout;->getPaddingLeftWithForeground()I
-HSPLandroid/widget/FrameLayout;->getPaddingRightWithForeground()I
-HSPLandroid/widget/FrameLayout;->getPaddingTopWithForeground()I
-HSPLandroid/widget/FrameLayout;->layoutChildren(IIIIZ)V
-HSPLandroid/widget/FrameLayout;->onLayout(ZIIII)V
-HSPLandroid/widget/FrameLayout;->onMeasure(II)V
+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
@@ -20108,7 +19972,7 @@
 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
+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
@@ -20149,7 +20013,7 @@
 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
+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
@@ -20186,20 +20050,20 @@
 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;
-HSPLandroid/widget/LinearLayout;->getVirtualChildCount()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
-HSPLandroid/widget/LinearLayout;->measureChildBeforeLayout(Landroid/view/View;IIIII)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
+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
-HSPLandroid/widget/LinearLayout;->onMeasure(II)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
+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
@@ -20253,7 +20117,7 @@
 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
+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
@@ -20272,7 +20136,7 @@
 HSPLandroid/widget/OverScroller;->abortAnimation()V
 HSPLandroid/widget/OverScroller;->computeScrollOffset()Z
 HSPLandroid/widget/OverScroller;->fling(IIIIIIII)V
-HSPLandroid/widget/OverScroller;->fling(IIIIIIIIII)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
@@ -20360,7 +20224,7 @@
 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
+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
@@ -20400,7 +20264,7 @@
 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;
+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
@@ -20409,7 +20273,7 @@
 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
+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
@@ -20424,7 +20288,7 @@
 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
+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
@@ -20443,14 +20307,14 @@
 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
+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
+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
@@ -20526,16 +20390,16 @@
 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
+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
-HSPLandroid/widget/ScrollBarDrawable;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ScrollBarDrawable;->isStateful()Z
-HSPLandroid/widget/ScrollBarDrawable;->mutate()Landroid/widget/ScrollBarDrawable;
+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
-HSPLandroid/widget/ScrollBarDrawable;->setAlpha(I)V
+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
@@ -20649,7 +20513,7 @@
 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;
+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
@@ -20669,8 +20533,8 @@
 HSPLandroid/widget/TextView;->compressText(F)Z
 HSPLandroid/widget/TextView;->computeHorizontalScrollRange()I
 HSPLandroid/widget/TextView;->computeScroll()V
-HSPLandroid/widget/TextView;->computeVerticalScrollExtent()I
-HSPLandroid/widget/TextView;->computeVerticalScrollRange()I
+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
@@ -20688,7 +20552,7 @@
 HSPLandroid/widget/TextView;->getBaseline()I
 HSPLandroid/widget/TextView;->getBaselineOffset()I
 HSPLandroid/widget/TextView;->getBottomVerticalOffset(Z)I
-HSPLandroid/widget/TextView;->getBoxHeight(Landroid/text/Layout;)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;
@@ -20701,12 +20565,12 @@
 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
+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
-HSPLandroid/widget/TextView;->getExtendedPaddingTop()I
+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
@@ -20738,7 +20602,7 @@
 HSPLandroid/widget/TextView;->getPaint()Landroid/text/TextPaint;
 HSPLandroid/widget/TextView;->getSelectionEnd()I
 HSPLandroid/widget/TextView;->getSelectionEndTransformed()I
-HSPLandroid/widget/TextView;->getSelectionStart()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;
@@ -20770,20 +20634,20 @@
 HSPLandroid/widget/TextView;->hideErrorIfUnchanged()V
 HSPLandroid/widget/TextView;->invalidateCursor()V
 HSPLandroid/widget/TextView;->invalidateCursorPath()V
-HSPLandroid/widget/TextView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)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
+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
+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
@@ -20792,8 +20656,8 @@
 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
-HSPLandroid/widget/TextView;->makeSingleLayout(ILandroid/text/BoringLayout$Metrics;ILandroid/text/Layout$Alignment;ZLandroid/text/TextUtils$TruncateAt;Z)Landroid/text/Layout;
+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
@@ -20805,7 +20669,7 @@
 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
+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
@@ -20816,7 +20680,7 @@
 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
+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
@@ -20833,7 +20697,7 @@
 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;
+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
@@ -21050,14 +20914,10 @@
 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$$ExternalSyntheticLambda4;-><init>(Landroid/window/SurfaceSyncGroup;Landroid/window/ITransactionReadyCallback;Ljava/util/function/Consumer;)V
-HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda4;->accept(Ljava/lang/Object;)V
 HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda5;->accept(Ljava/lang/Object;)V
-HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda6;->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;->$r8$lambda$RIGQSKCGL_wOT_BLp-LvudtYwpE(Landroid/window/SurfaceSyncGroup;Landroid/window/ITransactionReadyCallback;Ljava/util/function/Consumer;Landroid/view/SurfaceControl$Transaction;)V
 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;
@@ -21130,7 +20990,6 @@
 HSPLandroid/window/WindowOnBackInvokedDispatcher;->hasImeOnBackInvokedDispatcher()Z
 HSPLandroid/window/WindowOnBackInvokedDispatcher;->isOnBackInvokedCallbackEnabled()Z
 HSPLandroid/window/WindowOnBackInvokedDispatcher;->isOnBackInvokedCallbackEnabled(Landroid/content/Context;)Z
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->isOnBackInvokedCallbackEnabled(Landroid/content/pm/ActivityInfo;Landroid/content/pm/ApplicationInfo;Ljava/util/function/Supplier;)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
@@ -21142,10 +21001,6 @@
 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/graphics/hwui/flags/FeatureFlagsImpl;-><init>()V
-HSPLcom/android/graphics/hwui/flags/FeatureFlagsImpl;->animateHdrTransitions()Z
-HSPLcom/android/graphics/hwui/flags/Flags;-><clinit>()V
-HSPLcom/android/graphics/hwui/flags/Flags;->animateHdrTransitions()Z
 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
@@ -21317,7 +21172,7 @@
 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
+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
@@ -21366,16 +21221,16 @@
 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;
-HSPLcom/android/icu/charset/CharsetEncoderICU;->getArray(Ljava/nio/ByteBuffer;)I
-HSPLcom/android/icu/charset/CharsetEncoderICU;->getArray(Ljava/nio/CharBuffer;)I
+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
+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;
@@ -21495,13 +21350,13 @@
 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
+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
-HSPLcom/android/internal/compat/ChangeReporter;->markAsReported(ILcom/android/internal/compat/ChangeReporter$ChangeReport;)V
-HSPLcom/android/internal/compat/ChangeReporter;->reportChange(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;
@@ -21511,13 +21366,8 @@
 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$MassState;-><init>()V
 HSPLcom/android/internal/dynamicanimation/animation/DynamicAnimation;-><init>(Ljava/lang/Object;Landroid/util/FloatProperty;)V
-HSPLcom/android/internal/dynamicanimation/animation/SpringAnimation;-><init>(Ljava/lang/Object;Landroid/util/FloatProperty;)V
-HSPLcom/android/internal/dynamicanimation/animation/SpringAnimation;->setSpring(Lcom/android/internal/dynamicanimation/animation/SpringForce;)Lcom/android/internal/dynamicanimation/animation/SpringAnimation;
 HSPLcom/android/internal/dynamicanimation/animation/SpringForce;-><init>()V
-HSPLcom/android/internal/dynamicanimation/animation/SpringForce;->setDampingRatio(F)Lcom/android/internal/dynamicanimation/animation/SpringForce;
-HSPLcom/android/internal/dynamicanimation/animation/SpringForce;->setStiffness(F)Lcom/android/internal/dynamicanimation/animation/SpringForce;
 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
@@ -21875,12 +21725,11 @@
 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;
+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$$ExternalSyntheticLambda1;-><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
@@ -21888,8 +21737,8 @@
 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
-HSPLcom/android/internal/policy/DecorView;->calculateStatusBarColor(I)I
+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
@@ -21906,9 +21755,9 @@
 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;
-HSPLcom/android/internal/policy/DecorView;->getTitleSuffix(Landroid/view/WindowManager$LayoutParams;)Ljava/lang/String;
-HSPLcom/android/internal/policy/DecorView;->getWindowInsetsController()Landroid/view/WindowInsetsController;
+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
@@ -21920,10 +21769,10 @@
 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
+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
+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
@@ -21938,7 +21787,7 @@
 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
+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
@@ -21946,13 +21795,13 @@
 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
-HSPLcom/android/internal/policy/DecorView;->updateColorViewInt(Lcom/android/internal/policy/DecorView$ColorViewState;IIIZZIZZI)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;
+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
-HSPLcom/android/internal/policy/DecorView;->updateLogTag(Landroid/view/WindowManager$LayoutParams;)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;
@@ -21986,7 +21835,7 @@
 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
+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;
@@ -22002,7 +21851,6 @@
 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;->isEdgeToEdgeEnforced(Landroid/content/pm/ApplicationInfo;ZLandroid/content/res/TypedArray;)Z
 HSPLcom/android/internal/policy/PhoneWindow;->isFloating()Z
 HSPLcom/android/internal/policy/PhoneWindow;->isShowingWallpaper()Z
 HSPLcom/android/internal/policy/PhoneWindow;->isTranslucent()Z
@@ -22018,7 +21866,7 @@
 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
+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
@@ -22038,7 +21886,6 @@
 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/policy/WearGestureInterceptionDetector;->isEnabled(Landroid/content/Context;)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
@@ -22178,7 +22025,7 @@
 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;
+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;
@@ -22186,14 +22033,14 @@
 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;
+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
+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
+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;
+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
@@ -22234,14 +22081,14 @@
 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
+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
+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;
@@ -22262,12 +22109,12 @@
 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;[Ljava/lang/Object;]Ljava/lang/Class;Ljava/lang/Class;
+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;
+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;
@@ -22412,10 +22259,10 @@
 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;
-HSPLcom/android/internal/util/XmlUtils;->readThisPrimitiveValueXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;)Ljava/lang/Object;
+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/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
+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
@@ -22424,7 +22271,7 @@
 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
+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;
@@ -22505,7 +22352,7 @@
 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
+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
@@ -22524,7 +22371,7 @@
 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;
+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
@@ -22561,25 +22408,11 @@
 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/FeatureFlagsImpl;->fixLineHeightForLocale()Z
-HSPLcom/android/text/flags/FeatureFlagsImpl;->icuBidiMigration()Z
-HSPLcom/android/text/flags/FeatureFlagsImpl;->insertModeNotUpdateSelection()Z
-HSPLcom/android/text/flags/FeatureFlagsImpl;->noBreakNoHyphenationSpan()Z
-HSPLcom/android/text/flags/FeatureFlagsImpl;->phraseStrictFallback()Z
-HSPLcom/android/text/flags/FeatureFlagsImpl;->useBoundsForWidth()Z
 HSPLcom/android/text/flags/Flags;-><clinit>()V
-HSPLcom/android/text/flags/Flags;->fixLineHeightForLocale()Z
-HSPLcom/android/text/flags/Flags;->icuBidiMigration()Z
-HSPLcom/android/text/flags/Flags;->insertModeNotUpdateSelection()Z+]Lcom/android/text/flags/FeatureFlags;Lcom/android/text/flags/FeatureFlagsImpl;
-HSPLcom/android/text/flags/Flags;->noBreakNoHyphenationSpan()Z
-HSPLcom/android/text/flags/Flags;->phraseStrictFallback()Z
-HSPLcom/android/text/flags/Flags;->useBoundsForWidth()Z
 HSPLcom/android/window/flags/FeatureFlagsImpl;-><init>()V
 HSPLcom/android/window/flags/FeatureFlagsImpl;->bundleClientTransactionFlag()Z
-HSPLcom/android/window/flags/FeatureFlagsImpl;->enforceEdgeToEdge()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/android/window/flags/Flags;->enforceEdgeToEdge()Z
 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;
@@ -22924,12 +22757,10 @@
 Landroid/app/ActivityThread$4;
 Landroid/app/ActivityThread$ActivityClientRecord$1;
 Landroid/app/ActivityThread$ActivityClientRecord;
-Landroid/app/ActivityThread$AndroidOs;
 Landroid/app/ActivityThread$AppBindData;
 Landroid/app/ActivityThread$ApplicationThread$$ExternalSyntheticLambda2;
 Landroid/app/ActivityThread$ApplicationThread$1;
 Landroid/app/ActivityThread$ApplicationThread-IA;
-Landroid/app/ActivityThread$ApplicationThread;
 Landroid/app/ActivityThread$BindServiceData;
 Landroid/app/ActivityThread$ContextCleanupInfo;
 Landroid/app/ActivityThread$CreateBackupAgentData;
@@ -22959,7 +22790,6 @@
 Landroid/app/ActivityTransitionState;
 Landroid/app/AlarmManager$AlarmClockInfo$1;
 Landroid/app/AlarmManager$AlarmClockInfo;
-Landroid/app/AlarmManager$ListenerWrapper;
 Landroid/app/AlarmManager$OnAlarmListener;
 Landroid/app/AlarmManager;
 Landroid/app/AlertDialog$Builder;
@@ -22980,7 +22810,6 @@
 Landroid/app/AppOpsManager$2;
 Landroid/app/AppOpsManager$3;
 Landroid/app/AppOpsManager$4;
-Landroid/app/AppOpsManager$5;
 Landroid/app/AppOpsManager$AppOpsCollector;
 Landroid/app/AppOpsManager$AttributedHistoricalOps$1;
 Landroid/app/AppOpsManager$AttributedHistoricalOps;
@@ -23047,7 +22876,6 @@
 Landroid/app/ApplicationPackageManager$HasSystemFeatureQuery;
 Landroid/app/ApplicationPackageManager$MoveCallbackDelegate;
 Landroid/app/ApplicationPackageManager$ResourceName;
-Landroid/app/ApplicationPackageManager;
 Landroid/app/AsyncNotedAppOp$1;
 Landroid/app/AsyncNotedAppOp;
 Landroid/app/AutomaticZenRule$1;
@@ -23069,7 +22897,6 @@
 Landroid/app/ContentProviderHolder;
 Landroid/app/ContextImpl$1;
 Landroid/app/ContextImpl$ApplicationContentResolver;
-Landroid/app/ContextImpl;
 Landroid/app/DexLoadReporter;
 Landroid/app/Dialog$$ExternalSyntheticLambda0;
 Landroid/app/Dialog$$ExternalSyntheticLambda1;
@@ -23141,7 +22968,6 @@
 Landroid/app/IAlarmCompleteListener$Stub$Proxy;
 Landroid/app/IAlarmCompleteListener$Stub;
 Landroid/app/IAlarmCompleteListener;
-Landroid/app/IAlarmListener$Stub$Proxy;
 Landroid/app/IAlarmListener$Stub;
 Landroid/app/IAlarmListener;
 Landroid/app/IAlarmManager$Stub$Proxy;
@@ -23156,7 +22982,6 @@
 Landroid/app/IApplicationStartInfoCompleteListener$Stub$Proxy;
 Landroid/app/IApplicationStartInfoCompleteListener$Stub;
 Landroid/app/IApplicationStartInfoCompleteListener;
-Landroid/app/IApplicationThread$Stub$Proxy;
 Landroid/app/IApplicationThread$Stub;
 Landroid/app/IApplicationThread;
 Landroid/app/IAssistDataReceiver$Stub$Proxy;
@@ -23201,7 +23026,6 @@
 Landroid/app/ISearchManager$Stub$Proxy;
 Landroid/app/ISearchManager$Stub;
 Landroid/app/ISearchManager;
-Landroid/app/IServiceConnection$Stub$Proxy;
 Landroid/app/IServiceConnection$Stub;
 Landroid/app/IServiceConnection;
 Landroid/app/IStopUserCallback$Stub$Proxy;
@@ -23227,7 +23051,6 @@
 Landroid/app/IUidFrozenStateChangedCallback$Stub$Proxy;
 Landroid/app/IUidFrozenStateChangedCallback$Stub;
 Landroid/app/IUidFrozenStateChangedCallback;
-Landroid/app/IUidObserver$Stub$Proxy;
 Landroid/app/IUidObserver$Stub;
 Landroid/app/IUidObserver;
 Landroid/app/IUnsafeIntentStrictModeCallback$Stub;
@@ -23256,19 +23079,16 @@
 Landroid/app/IntentReceiverLeaked;
 Landroid/app/IntentService$ServiceHandler;
 Landroid/app/IntentService;
-Landroid/app/JobSchedulerImpl;
 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$InnerReceiver;
 Landroid/app/LoadedApk$ReceiverDispatcher;
 Landroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo-IA;
 Landroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo;
 Landroid/app/LoadedApk$ServiceDispatcher$DeathMonitor;
-Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;
 Landroid/app/LoadedApk$ServiceDispatcher$RunConnection;
 Landroid/app/LoadedApk$ServiceDispatcher;
 Landroid/app/LoadedApk$SplitDependencyLoaderImpl;
@@ -24041,8 +23861,6 @@
 Landroid/appwidget/AppWidgetProviderInfo;
 Landroid/appwidget/PendingHostUpdate$1;
 Landroid/appwidget/PendingHostUpdate;
-Landroid/appwidget/flags/FeatureFlags;
-Landroid/appwidget/flags/FeatureFlagsImpl;
 Landroid/appwidget/flags/Flags;
 Landroid/attention/AttentionManagerInternal$AttentionCallbackInternal;
 Landroid/attention/AttentionManagerInternal;
@@ -24110,7 +23928,6 @@
 Landroid/content/ContentCaptureOptions$1;
 Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda0;
 Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda1;
-Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda2;
 Landroid/content/ContentCaptureOptions$ContentProtectionOptions;
 Landroid/content/ContentCaptureOptions;
 Landroid/content/ContentInterface;
@@ -24168,7 +23985,6 @@
 Landroid/content/IContentService$Stub$Proxy;
 Landroid/content/IContentService$Stub;
 Landroid/content/IContentService;
-Landroid/content/IIntentReceiver$Stub$Proxy;
 Landroid/content/IIntentReceiver$Stub;
 Landroid/content/IIntentReceiver;
 Landroid/content/IIntentSender$Stub$Proxy;
@@ -24690,7 +24506,6 @@
 Landroid/content/res/ThemedResourceCache;
 Landroid/content/res/TypedArray;
 Landroid/content/res/Validator;
-Landroid/content/res/XmlBlock$Parser;
 Landroid/content/res/XmlBlock;
 Landroid/content/res/XmlResourceParser;
 Landroid/content/res/loader/AssetsProvider;
@@ -24723,7 +24538,6 @@
 Landroid/database/ContentObservable;
 Landroid/database/ContentObserver$$ExternalSyntheticLambda0;
 Landroid/database/ContentObserver$$ExternalSyntheticLambda1;
-Landroid/database/ContentObserver$Transport;
 Landroid/database/ContentObserver;
 Landroid/database/CrossProcessCursor;
 Landroid/database/CrossProcessCursorWrapper;
@@ -24742,7 +24556,6 @@
 Landroid/database/DatabaseUtils;
 Landroid/database/DefaultDatabaseErrorHandler;
 Landroid/database/IBulkCursor;
-Landroid/database/IContentObserver$Stub$Proxy;
 Landroid/database/IContentObserver$Stub;
 Landroid/database/IContentObserver;
 Landroid/database/MatrixCursor$RowBuilder;
@@ -25512,9 +25325,6 @@
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda0;
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda1;
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda2;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda3;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda4;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda5;
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper;
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback-IA;
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback;
@@ -25559,7 +25369,6 @@
 Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0;
 Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;
 Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback-IA;
-Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;
 Landroid/hardware/display/DisplayManagerGlobal;
 Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;
 Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;
@@ -25575,7 +25384,6 @@
 Landroid/hardware/display/IDisplayManager$Stub$Proxy;
 Landroid/hardware/display/IDisplayManager$Stub;
 Landroid/hardware/display/IDisplayManager;
-Landroid/hardware/display/IDisplayManagerCallback$Stub$Proxy;
 Landroid/hardware/display/IDisplayManagerCallback$Stub;
 Landroid/hardware/display/IDisplayManagerCallback;
 Landroid/hardware/display/IVirtualDisplayCallback$Stub$Proxy;
@@ -28307,7 +28115,6 @@
 Landroid/net/INetworkManagementEventObserver$Stub$Proxy;
 Landroid/net/INetworkManagementEventObserver$Stub;
 Landroid/net/INetworkManagementEventObserver;
-Landroid/net/INetworkPolicyListener$Stub$Proxy;
 Landroid/net/INetworkPolicyListener$Stub;
 Landroid/net/INetworkPolicyListener;
 Landroid/net/INetworkPolicyManager$Stub$Proxy;
@@ -28332,7 +28139,6 @@
 Landroid/net/LocalSocketAddress$Namespace;
 Landroid/net/LocalSocketAddress;
 Landroid/net/LocalSocketImpl$SocketInputStream;
-Landroid/net/LocalSocketImpl$SocketOutputStream;
 Landroid/net/LocalSocketImpl;
 Landroid/net/MatchAllNetworkSpecifier$1;
 Landroid/net/MatchAllNetworkSpecifier;
@@ -28383,17 +28189,13 @@
 Landroid/net/Uri$AbstractPart;
 Landroid/net/Uri$Builder;
 Landroid/net/Uri$HierarchicalUri-IA;
-Landroid/net/Uri$HierarchicalUri;
 Landroid/net/Uri$NotCachedHolder;
 Landroid/net/Uri$OpaqueUri-IA;
-Landroid/net/Uri$OpaqueUri;
 Landroid/net/Uri$Part$EmptyPart;
 Landroid/net/Uri$Part;
 Landroid/net/Uri$PathPart;
-Landroid/net/Uri$PathSegments;
 Landroid/net/Uri$PathSegmentsBuilder;
 Landroid/net/Uri$StringUri-IA;
-Landroid/net/Uri$StringUri;
 Landroid/net/Uri-IA;
 Landroid/net/Uri;
 Landroid/net/UriCodec;
@@ -28641,7 +28443,6 @@
 Landroid/os/BinderProxy$BinderProxyMapSizeException;
 Landroid/os/BinderProxy$NoImagePreloadHolder;
 Landroid/os/BinderProxy$ProxyMap;
-Landroid/os/BinderProxy;
 Landroid/os/BluetoothServiceManager$ServiceRegisterer;
 Landroid/os/BluetoothServiceManager;
 Landroid/os/BugreportManager;
@@ -28792,8 +28593,6 @@
 Landroid/os/IPowerManager$Stub$Proxy;
 Landroid/os/IPowerManager$Stub;
 Landroid/os/IPowerManager;
-Landroid/os/IPowerStatsService$Stub;
-Landroid/os/IPowerStatsService;
 Landroid/os/IProcessInfoService$Stub;
 Landroid/os/IProcessInfoService;
 Landroid/os/IProgressListener$Stub$Proxy;
@@ -28892,7 +28691,6 @@
 Landroid/os/PackageTagsList$1;
 Landroid/os/PackageTagsList;
 Landroid/os/Parcel$1;
-Landroid/os/Parcel$2;
 Landroid/os/Parcel$LazyValue;
 Landroid/os/Parcel$ReadWriteHelper;
 Landroid/os/Parcel$SquashReadHelper;
@@ -29029,7 +28827,6 @@
 Landroid/os/StrictMode;
 Landroid/os/SynchronousResultReceiver$Result;
 Landroid/os/SynchronousResultReceiver;
-Landroid/os/SystemClock$1;
 Landroid/os/SystemClock$2;
 Landroid/os/SystemClock$3;
 Landroid/os/SystemClock;
@@ -29206,7 +29003,6 @@
 Landroid/permission/ILegacyPermissionManager$Stub$Proxy;
 Landroid/permission/ILegacyPermissionManager$Stub;
 Landroid/permission/ILegacyPermissionManager;
-Landroid/permission/IOnPermissionsChangeListener$Stub$Proxy;
 Landroid/permission/IOnPermissionsChangeListener$Stub;
 Landroid/permission/IOnPermissionsChangeListener;
 Landroid/permission/IPermissionChecker$Stub$Proxy;
@@ -29224,7 +29020,6 @@
 Landroid/permission/PermissionControllerManager;
 Landroid/permission/PermissionManager$1;
 Landroid/permission/PermissionManager$2;
-Landroid/permission/PermissionManager$OnPermissionsChangeListenerDelegate;
 Landroid/permission/PermissionManager$PackageNamePermissionQuery;
 Landroid/permission/PermissionManager$PermissionQuery;
 Landroid/permission/PermissionManager$SplitPermissionInfo-IA;
@@ -29633,8 +29428,6 @@
 Landroid/service/autofill/AutofillServiceInfo;
 Landroid/service/autofill/Dataset$1;
 Landroid/service/autofill/Dataset;
-Landroid/service/autofill/FeatureFlags;
-Landroid/service/autofill/FeatureFlagsImpl;
 Landroid/service/autofill/FieldClassificationUserData;
 Landroid/service/autofill/FillContext$1;
 Landroid/service/autofill/FillContext;
@@ -29780,12 +29573,9 @@
 Landroid/service/notification/ConditionProviderService$H-IA;
 Landroid/service/notification/ConditionProviderService$H;
 Landroid/service/notification/ConditionProviderService$Provider-IA;
-Landroid/service/notification/ConditionProviderService$Provider;
 Landroid/service/notification/ConditionProviderService;
-Landroid/service/notification/IConditionProvider$Stub$Proxy;
 Landroid/service/notification/IConditionProvider$Stub;
 Landroid/service/notification/IConditionProvider;
-Landroid/service/notification/INotificationListener$Stub$Proxy;
 Landroid/service/notification/INotificationListener$Stub;
 Landroid/service/notification/INotificationListener;
 Landroid/service/notification/IStatusBarNotificationHolder$Stub$Proxy;
@@ -29797,7 +29587,6 @@
 Landroid/service/notification/NotificationListenerFilter$1;
 Landroid/service/notification/NotificationListenerFilter;
 Landroid/service/notification/NotificationListenerService$MyHandler;
-Landroid/service/notification/NotificationListenerService$NotificationListenerWrapper;
 Landroid/service/notification/NotificationListenerService$Ranking;
 Landroid/service/notification/NotificationListenerService$RankingMap$1;
 Landroid/service/notification/NotificationListenerService$RankingMap-IA;
@@ -30286,7 +30075,6 @@
 Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda62;
 Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda6;
 Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda9;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;
 Landroid/telephony/PhoneStateListener;
 Landroid/telephony/PhysicalChannelConfig$1;
 Landroid/telephony/PhysicalChannelConfig$Builder;
@@ -30390,7 +30178,6 @@
 Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda52;
 Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda63;
 Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda65;
-Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub;
 Landroid/telephony/TelephonyCallback$ImsCallDisconnectCauseListener;
 Landroid/telephony/TelephonyCallback$LinkCapacityEstimateChangedListener;
 Landroid/telephony/TelephonyCallback$MediaQualityStatusChangedListener;
@@ -30863,7 +30650,6 @@
 Landroid/text/TextFlags;
 Landroid/text/TextLine$DecorationInfo-IA;
 Landroid/text/TextLine$DecorationInfo;
-Landroid/text/TextLine$LineInfo;
 Landroid/text/TextLine;
 Landroid/text/TextPaint;
 Landroid/text/TextShaper$GlyphsConsumer;
@@ -31085,7 +30871,6 @@
 Landroid/util/AndroidException;
 Landroid/util/AndroidRuntimeException;
 Landroid/util/ArrayMap$1;
-Landroid/util/ArrayMap;
 Landroid/util/ArraySet$1;
 Landroid/util/ArraySet;
 Landroid/util/AtomicFile;
@@ -31155,11 +30940,6 @@
 Landroid/util/LongSparseLongArray;
 Landroid/util/LruCache;
 Landroid/util/MalformedJsonException;
-Landroid/util/MapCollections$ArrayIterator;
-Landroid/util/MapCollections$EntrySet;
-Landroid/util/MapCollections$KeySet;
-Landroid/util/MapCollections$MapIterator;
-Landroid/util/MapCollections$ValuesCollection;
 Landroid/util/MapCollections;
 Landroid/util/MathUtils;
 Landroid/util/MemoryIntArray$1;
@@ -31438,13 +31218,11 @@
 Landroid/view/ISurfaceControlViewHost;
 Landroid/view/ISurfaceControlViewHostParent$Stub;
 Landroid/view/ISurfaceControlViewHostParent;
-Landroid/view/ISystemGestureExclusionListener$Stub$Proxy;
 Landroid/view/ISystemGestureExclusionListener$Stub;
 Landroid/view/ISystemGestureExclusionListener;
 Landroid/view/IWallpaperVisibilityListener$Stub$Proxy;
 Landroid/view/IWallpaperVisibilityListener$Stub;
 Landroid/view/IWallpaperVisibilityListener;
-Landroid/view/IWindow$Stub$Proxy;
 Landroid/view/IWindow$Stub;
 Landroid/view/IWindow;
 Landroid/view/IWindowFocusObserver$Stub;
@@ -31834,7 +31612,6 @@
 Landroid/view/ViewRootImpl$6;
 Landroid/view/ViewRootImpl$7;
 Landroid/view/ViewRootImpl$8;
-Landroid/view/ViewRootImpl$9$$ExternalSyntheticLambda3;
 Landroid/view/ViewRootImpl$9;
 Landroid/view/ViewRootImpl$AccessibilityInteractionConnection;
 Landroid/view/ViewRootImpl$AccessibilityInteractionConnectionManager;
@@ -31987,8 +31764,6 @@
 Landroid/view/accessibility/CaptioningManager$MyContentObserver;
 Landroid/view/accessibility/CaptioningManager;
 Landroid/view/accessibility/DirectAccessibilityConnection;
-Landroid/view/accessibility/FeatureFlags;
-Landroid/view/accessibility/FeatureFlagsImpl;
 Landroid/view/accessibility/Flags;
 Landroid/view/accessibility/IAccessibilityEmbeddedConnection;
 Landroid/view/accessibility/IAccessibilityInteractionConnection$Stub$Proxy;
@@ -32059,7 +31834,8 @@
 Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda13;
 Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda14;
 Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda16;
-Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda6;
+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;
@@ -32168,8 +31944,6 @@
 Landroid/view/inputmethod/ExtractedText;
 Landroid/view/inputmethod/ExtractedTextRequest$1;
 Landroid/view/inputmethod/ExtractedTextRequest;
-Landroid/view/inputmethod/FeatureFlags;
-Landroid/view/inputmethod/FeatureFlagsImpl;
 Landroid/view/inputmethod/Flags;
 Landroid/view/inputmethod/HandwritingGesture;
 Landroid/view/inputmethod/IAccessibilityInputMethodSessionInvoker$$ExternalSyntheticLambda0;
@@ -32940,7 +32714,6 @@
 Landroid/window/BackMotionEvent;
 Landroid/window/BackNavigationInfo$1;
 Landroid/window/BackNavigationInfo;
-Landroid/window/BackProgressAnimator$$ExternalSyntheticLambda0;
 Landroid/window/BackProgressAnimator$1;
 Landroid/window/BackProgressAnimator$ProgressCallback;
 Landroid/window/BackProgressAnimator;
@@ -33076,8 +32849,6 @@
 Landroid/window/WindowContainerTransaction;
 Landroid/window/WindowContext;
 Landroid/window/WindowContextController;
-Landroid/window/WindowContextInfo$1;
-Landroid/window/WindowContextInfo;
 Landroid/window/WindowInfosListener$DisplayInfo;
 Landroid/window/WindowInfosListener;
 Landroid/window/WindowMetricsController$$ExternalSyntheticLambda0;
@@ -33174,8 +32945,6 @@
 Lcom/android/framework/protobuf/nano/InvalidProtocolBufferNanoException;
 Lcom/android/framework/protobuf/nano/MessageNano;
 Lcom/android/framework/protobuf/nano/WireFormatNano;
-Lcom/android/graphics/hwui/flags/FeatureFlags;
-Lcom/android/graphics/hwui/flags/FeatureFlagsImpl;
 Lcom/android/graphics/hwui/flags/Flags;
 Lcom/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet;
 Lcom/android/i18n/phonenumbers/AsYouTypeFormatter;
@@ -33295,10 +33064,8 @@
 Lcom/android/i18n/timezone/internal/MemoryMappedFile;
 Lcom/android/i18n/timezone/internal/NioBufferIterator;
 Lcom/android/i18n/util/Log;
-Lcom/android/icu/charset/CharsetDecoderICU;
 Lcom/android/icu/charset/CharsetEncoderICU;
 Lcom/android/icu/charset/CharsetFactory;
-Lcom/android/icu/charset/CharsetICU;
 Lcom/android/icu/charset/NativeConverter;
 Lcom/android/icu/text/CompatibleDecimalFormatFactory;
 Lcom/android/icu/text/DateSorterBridge;
@@ -33725,13 +33492,11 @@
 Lcom/android/internal/app/IAppOpsActiveCallback$Stub$Proxy;
 Lcom/android/internal/app/IAppOpsActiveCallback$Stub;
 Lcom/android/internal/app/IAppOpsActiveCallback;
-Lcom/android/internal/app/IAppOpsAsyncNotedCallback$Stub$Proxy;
 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$Proxy;
 Lcom/android/internal/app/IAppOpsNotedCallback$Stub;
 Lcom/android/internal/app/IAppOpsNotedCallback;
 Lcom/android/internal/app/IAppOpsService$Stub$Proxy;
@@ -33885,7 +33650,6 @@
 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$OnAnimationEndListener;
 Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$ViewProperty;
 Lcom/android/internal/dynamicanimation/animation/DynamicAnimation;
 Lcom/android/internal/dynamicanimation/animation/Force;
@@ -34087,7 +33851,6 @@
 Lcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;
 Lcom/android/internal/os/CachedDeviceState;
 Lcom/android/internal/os/ClassLoaderFactory;
-Lcom/android/internal/os/Clock$1;
 Lcom/android/internal/os/Clock;
 Lcom/android/internal/os/FuseAppLoop$1;
 Lcom/android/internal/os/FuseAppLoop;
@@ -34486,7 +34249,6 @@
 Lcom/android/internal/telephony/IOns$Stub$Proxy;
 Lcom/android/internal/telephony/IOns$Stub;
 Lcom/android/internal/telephony/IOns;
-Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;
 Lcom/android/internal/telephony/IPhoneStateListener$Stub;
 Lcom/android/internal/telephony/IPhoneStateListener;
 Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;
@@ -35868,7 +35630,6 @@
 Lcom/android/internal/util/XmlPullParserWrapper;
 Lcom/android/internal/util/XmlSerializerWrapper;
 Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
-Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;
 Lcom/android/internal/util/XmlUtils$ReadMapCallback;
 Lcom/android/internal/util/XmlUtils$WriteMapCallback;
 Lcom/android/internal/util/XmlUtils;
@@ -35914,7 +35675,6 @@
 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/PooledLambdaImpl;
 Lcom/android/internal/util/function/pooled/PooledPredicate;
 Lcom/android/internal/util/function/pooled/PooledRunnable;
 Lcom/android/internal/util/function/pooled/PooledSupplier$OfDouble;
@@ -36052,7 +35812,6 @@
 Lcom/android/internal/widget/floatingtoolbar/FloatingToolbar$$ExternalSyntheticLambda1;
 Lcom/android/internal/widget/floatingtoolbar/FloatingToolbar;
 Lcom/android/internal/widget/floatingtoolbar/FloatingToolbarPopup;
-Lcom/android/internal/widget/remotecompose/player/RemoteComposePlayer$ClickCallbacks;
 Lcom/android/media/flags/Flags;
 Lcom/android/modules/expresslog/Counter;
 Lcom/android/modules/expresslog/MetricIds;
@@ -36088,8 +35847,6 @@
 Lcom/android/phone/ecc/nano/ProtobufEccData$EccInfo;
 Lcom/android/phone/ecc/nano/UnknownFieldData;
 Lcom/android/phone/ecc/nano/WireFormatNano;
-Lcom/android/sdksandbox/flags/FeatureFlags;
-Lcom/android/sdksandbox/flags/FeatureFlagsImpl;
 Lcom/android/sdksandbox/flags/Flags;
 Lcom/android/server/AppWidgetBackupBridge;
 Lcom/android/server/LocalServices;
@@ -36644,7 +36401,6 @@
 Lgov/nist/javax/sip/stack/UDPMessageChannel;
 Lgov/nist/javax/sip/stack/UDPMessageProcessor;
 Ljava/io/InterruptedIOException;
-Ljava/nio/DirectByteBuffer;
 Ljavax/microedition/khronos/egl/EGL10;
 Ljavax/microedition/khronos/egl/EGL11;
 Ljavax/microedition/khronos/egl/EGL;
@@ -36774,7 +36530,6 @@
 Lorg/apache/http/params/CoreConnectionPNames;
 Lorg/apache/http/params/HttpConnectionParams;
 Lorg/apache/http/params/HttpParams;
-Lorg/ccil/cowan/tagsoup/AttributesImpl;
 Lorg/ccil/cowan/tagsoup/AutoDetector;
 Lorg/ccil/cowan/tagsoup/CommandLine;
 Lorg/ccil/cowan/tagsoup/Element;
diff --git a/boot/preloaded-classes b/boot/preloaded-classes
index 038b432..784bb32 100644
--- a/boot/preloaded-classes
+++ b/boot/preloaded-classes
@@ -25,6 +25,7 @@
 android.R$id
 android.R$styleable
 android.accessibilityservice.AccessibilityServiceInfo$1
+android.accessibilityservice.AccessibilityServiceInfo$DynamicPropertyDefaults
 android.accessibilityservice.AccessibilityServiceInfo
 android.accessibilityservice.AccessibilityShortcutInfo
 android.accessibilityservice.GestureDescription$MotionEventGenerator
@@ -211,7 +212,6 @@
 android.app.ActivityClient$ActivityClientControllerSingleton
 android.app.ActivityClient-IA
 android.app.ActivityClient
-android.app.ActivityManager$1
 android.app.ActivityManager$2
 android.app.ActivityManager$3
 android.app.ActivityManager$AppTask
@@ -267,12 +267,10 @@
 android.app.ActivityThread$4
 android.app.ActivityThread$ActivityClientRecord$1
 android.app.ActivityThread$ActivityClientRecord
-android.app.ActivityThread$AndroidOs
 android.app.ActivityThread$AppBindData
 android.app.ActivityThread$ApplicationThread$$ExternalSyntheticLambda2
 android.app.ActivityThread$ApplicationThread$1
 android.app.ActivityThread$ApplicationThread-IA
-android.app.ActivityThread$ApplicationThread
 android.app.ActivityThread$BindServiceData
 android.app.ActivityThread$ContextCleanupInfo
 android.app.ActivityThread$CreateBackupAgentData
@@ -302,7 +300,6 @@
 android.app.ActivityTransitionState
 android.app.AlarmManager$AlarmClockInfo$1
 android.app.AlarmManager$AlarmClockInfo
-android.app.AlarmManager$ListenerWrapper
 android.app.AlarmManager$OnAlarmListener
 android.app.AlarmManager
 android.app.AlertDialog$Builder
@@ -320,10 +317,8 @@
 android.app.AppOpsManager$$ExternalSyntheticLambda5
 android.app.AppOpsManager$$ExternalSyntheticLambda6
 android.app.AppOpsManager$1
-android.app.AppOpsManager$2
 android.app.AppOpsManager$3
 android.app.AppOpsManager$4
-android.app.AppOpsManager$5
 android.app.AppOpsManager$AppOpsCollector
 android.app.AppOpsManager$AttributedHistoricalOps$1
 android.app.AppOpsManager$AttributedHistoricalOps
@@ -366,7 +361,6 @@
 android.app.AppOpsManagerInternal
 android.app.Application$ActivityLifecycleCallbacks
 android.app.Application$OnProvideAssistDataListener
-android.app.Application
 android.app.ApplicationErrorReport$1
 android.app.ApplicationErrorReport$AnrInfo
 android.app.ApplicationErrorReport$BatteryInfo
@@ -390,7 +384,6 @@
 android.app.ApplicationPackageManager$HasSystemFeatureQuery
 android.app.ApplicationPackageManager$MoveCallbackDelegate
 android.app.ApplicationPackageManager$ResourceName
-android.app.ApplicationPackageManager
 android.app.AsyncNotedAppOp$1
 android.app.AsyncNotedAppOp
 android.app.AutomaticZenRule$1
@@ -403,6 +396,7 @@
 android.app.BackgroundServiceStartNotAllowedException
 android.app.BroadcastOptions
 android.app.ClientTransactionHandler
+android.app.ComponentCaller
 android.app.ComponentOptions
 android.app.ConfigurationChangedListenerController
 android.app.ConfigurationController
@@ -411,7 +405,6 @@
 android.app.ContentProviderHolder
 android.app.ContextImpl$1
 android.app.ContextImpl$ApplicationContentResolver
-android.app.ContextImpl
 android.app.DexLoadReporter
 android.app.Dialog$$ExternalSyntheticLambda0
 android.app.Dialog$$ExternalSyntheticLambda1
@@ -483,7 +476,6 @@
 android.app.IAlarmCompleteListener$Stub$Proxy
 android.app.IAlarmCompleteListener$Stub
 android.app.IAlarmCompleteListener
-android.app.IAlarmListener$Stub$Proxy
 android.app.IAlarmListener$Stub
 android.app.IAlarmListener
 android.app.IAlarmManager$Stub$Proxy
@@ -498,7 +490,6 @@
 android.app.IApplicationStartInfoCompleteListener$Stub$Proxy
 android.app.IApplicationStartInfoCompleteListener$Stub
 android.app.IApplicationStartInfoCompleteListener
-android.app.IApplicationThread$Stub$Proxy
 android.app.IApplicationThread$Stub
 android.app.IApplicationThread
 android.app.IAssistDataReceiver$Stub$Proxy
@@ -543,13 +534,11 @@
 android.app.ISearchManager$Stub$Proxy
 android.app.ISearchManager$Stub
 android.app.ISearchManager
-android.app.IServiceConnection$Stub$Proxy
 android.app.IServiceConnection$Stub
 android.app.IServiceConnection
 android.app.IStopUserCallback$Stub$Proxy
 android.app.IStopUserCallback$Stub
 android.app.IStopUserCallback
-android.app.ITaskStackListener$Stub$Proxy
 android.app.ITaskStackListener$Stub
 android.app.ITaskStackListener
 android.app.ITransientNotification$Stub$Proxy
@@ -569,7 +558,6 @@
 android.app.IUidFrozenStateChangedCallback$Stub$Proxy
 android.app.IUidFrozenStateChangedCallback$Stub
 android.app.IUidFrozenStateChangedCallback
-android.app.IUidObserver$Stub$Proxy
 android.app.IUidObserver$Stub
 android.app.IUidObserver
 android.app.IUnsafeIntentStrictModeCallback$Stub
@@ -598,19 +586,16 @@
 android.app.IntentReceiverLeaked
 android.app.IntentService$ServiceHandler
 android.app.IntentService
-android.app.JobSchedulerImpl
 android.app.KeyguardManager$1
 android.app.KeyguardManager$KeyguardDismissCallback
 android.app.KeyguardManager
 android.app.ListActivity
 android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0
 android.app.LoadedApk$ReceiverDispatcher$Args
-android.app.LoadedApk$ReceiverDispatcher$InnerReceiver
 android.app.LoadedApk$ReceiverDispatcher
 android.app.LoadedApk$ServiceDispatcher$ConnectionInfo-IA
 android.app.LoadedApk$ServiceDispatcher$ConnectionInfo
 android.app.LoadedApk$ServiceDispatcher$DeathMonitor
-android.app.LoadedApk$ServiceDispatcher$InnerConnection
 android.app.LoadedApk$ServiceDispatcher$RunConnection
 android.app.LoadedApk$ServiceDispatcher
 android.app.LoadedApk$SplitDependencyLoaderImpl
@@ -1425,6 +1410,7 @@
 android.content.BroadcastReceiver$PendingResult
 android.content.BroadcastReceiver
 android.content.ClipData$1
+android.content.ClipData$Item-IA
 android.content.ClipData$Item
 android.content.ClipData
 android.content.ClipDescription$1
@@ -1442,7 +1428,6 @@
 android.content.ComponentName$WithComponentName
 android.content.ComponentName
 android.content.ContentCaptureOptions$1
-android.content.ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda0
 android.content.ContentCaptureOptions$ContentProtectionOptions
 android.content.ContentCaptureOptions
 android.content.ContentInterface
@@ -1500,7 +1485,6 @@
 android.content.IContentService$Stub$Proxy
 android.content.IContentService$Stub
 android.content.IContentService
-android.content.IIntentReceiver$Stub$Proxy
 android.content.IIntentReceiver$Stub
 android.content.IIntentReceiver
 android.content.IIntentSender$Stub$Proxy
@@ -2022,7 +2006,6 @@
 android.content.res.ThemedResourceCache
 android.content.res.TypedArray
 android.content.res.Validator
-android.content.res.XmlBlock$Parser
 android.content.res.XmlBlock
 android.content.res.XmlResourceParser
 android.content.res.loader.AssetsProvider
@@ -2054,7 +2037,6 @@
 android.database.ContentObservable
 android.database.ContentObserver$$ExternalSyntheticLambda0
 android.database.ContentObserver$$ExternalSyntheticLambda1
-android.database.ContentObserver$Transport
 android.database.ContentObserver
 android.database.CrossProcessCursor
 android.database.CrossProcessCursorWrapper
@@ -2073,7 +2055,6 @@
 android.database.DatabaseUtils
 android.database.DefaultDatabaseErrorHandler
 android.database.IBulkCursor
-android.database.IContentObserver$Stub$Proxy
 android.database.IContentObserver$Stub
 android.database.IContentObserver
 android.database.MatrixCursor$RowBuilder
@@ -2084,6 +2065,8 @@
 android.database.SQLException
 android.database.StaleDataException
 android.database.sqlite.DatabaseObjectNotClosedException
+android.database.sqlite.FeatureFlags
+android.database.sqlite.FeatureFlagsImpl
 android.database.sqlite.Flags
 android.database.sqlite.SQLiteAbortException
 android.database.sqlite.SQLiteAccessPermException
@@ -2601,7 +2584,6 @@
 android.hardware.SystemSensorManager$BaseEventQueue
 android.hardware.SystemSensorManager$SensorEventQueue
 android.hardware.SystemSensorManager$TriggerEventQueue
-android.hardware.SystemSensorManager
 android.hardware.TriggerEvent
 android.hardware.TriggerEventListener
 android.hardware.biometrics.BiometricAuthenticator$AuthenticationCallback
@@ -2811,6 +2793,7 @@
 android.hardware.camera2.utils.ConcurrentCameraIdCombination$1
 android.hardware.camera2.utils.ConcurrentCameraIdCombination-IA
 android.hardware.camera2.utils.ConcurrentCameraIdCombination
+android.hardware.camera2.utils.ExceptionUtils
 android.hardware.camera2.utils.HashCodeHelpers
 android.hardware.camera2.utils.SurfaceUtils
 android.hardware.camera2.utils.TypeReference$SpecializedBaseTypeReference
@@ -2830,6 +2813,7 @@
 android.hardware.contexthub.V1_0.NanoAppBinary
 android.hardware.contexthub.V1_0.PhysicalSensor
 android.hardware.contexthub.V1_1.Setting
+android.hardware.devicestate.DeviceState
 android.hardware.devicestate.DeviceStateInfo$1
 android.hardware.devicestate.DeviceStateInfo
 android.hardware.devicestate.DeviceStateManager$DeviceStateCallback
@@ -2838,7 +2822,6 @@
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda0
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda1
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda2
-android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda3
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateManagerCallback-IA
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateManagerCallback
@@ -2883,7 +2866,6 @@
 android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0
 android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate
 android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback-IA
-android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback
 android.hardware.display.DisplayManagerGlobal
 android.hardware.display.DisplayManagerInternal$DisplayPowerCallbacks
 android.hardware.display.DisplayManagerInternal$DisplayPowerRequest
@@ -2899,7 +2881,6 @@
 android.hardware.display.IDisplayManager$Stub$Proxy
 android.hardware.display.IDisplayManager$Stub
 android.hardware.display.IDisplayManager
-android.hardware.display.IDisplayManagerCallback$Stub$Proxy
 android.hardware.display.IDisplayManagerCallback$Stub
 android.hardware.display.IDisplayManagerCallback
 android.hardware.display.IVirtualDisplayCallback$Stub$Proxy
@@ -3012,6 +2993,7 @@
 android.hardware.location.ContextHubInfo$1
 android.hardware.location.ContextHubInfo-IA
 android.hardware.location.ContextHubInfo
+android.hardware.location.ContextHubManager$1
 android.hardware.location.ContextHubManager$2
 android.hardware.location.ContextHubManager$3
 android.hardware.location.ContextHubManager$Callback
@@ -5122,7 +5104,6 @@
 android.media.IMediaRouter2$Stub$Proxy
 android.media.IMediaRouter2$Stub
 android.media.IMediaRouter2
-android.media.IMediaRouter2Manager$Stub$Proxy
 android.media.IMediaRouter2Manager$Stub
 android.media.IMediaRouter2Manager
 android.media.IMediaRouterClient$Stub$Proxy
@@ -5187,7 +5168,6 @@
 android.media.MediaCodec$PersistentSurface
 android.media.MediaCodec$QueueRequest
 android.media.MediaCodecInfo$AudioCapabilities
-android.media.MediaCodecInfo$CodecCapabilities
 android.media.MediaCodecInfo$CodecProfileLevel
 android.media.MediaCodecInfo$EncoderCapabilities
 android.media.MediaCodecInfo$Feature
@@ -5624,7 +5604,6 @@
 android.net.INetworkManagementEventObserver$Stub$Proxy
 android.net.INetworkManagementEventObserver$Stub
 android.net.INetworkManagementEventObserver
-android.net.INetworkPolicyListener$Stub$Proxy
 android.net.INetworkPolicyListener$Stub
 android.net.INetworkPolicyListener
 android.net.INetworkPolicyManager$Stub$Proxy
@@ -5649,7 +5628,6 @@
 android.net.LocalSocketAddress$Namespace
 android.net.LocalSocketAddress
 android.net.LocalSocketImpl$SocketInputStream
-android.net.LocalSocketImpl$SocketOutputStream
 android.net.LocalSocketImpl
 android.net.MatchAllNetworkSpecifier$1
 android.net.MatchAllNetworkSpecifier
@@ -5700,17 +5678,13 @@
 android.net.Uri$AbstractPart
 android.net.Uri$Builder
 android.net.Uri$HierarchicalUri-IA
-android.net.Uri$HierarchicalUri
 android.net.Uri$NotCachedHolder
 android.net.Uri$OpaqueUri-IA
-android.net.Uri$OpaqueUri
 android.net.Uri$Part$EmptyPart
 android.net.Uri$Part
 android.net.Uri$PathPart
-android.net.Uri$PathSegments
 android.net.Uri$PathSegmentsBuilder
 android.net.Uri$StringUri-IA
-android.net.Uri$StringUri
 android.net.Uri-IA
 android.net.Uri
 android.net.UriCodec
@@ -5958,7 +5932,6 @@
 android.os.BinderProxy$BinderProxyMapSizeException
 android.os.BinderProxy$NoImagePreloadHolder
 android.os.BinderProxy$ProxyMap
-android.os.BinderProxy
 android.os.BluetoothServiceManager$ServiceRegisterer
 android.os.BluetoothServiceManager
 android.os.BugreportManager
@@ -6089,7 +6062,6 @@
 android.os.IIncidentManager$Stub$Proxy
 android.os.IIncidentManager$Stub
 android.os.IIncidentManager
-android.os.IInstalld$Stub$Proxy
 android.os.IInstalld$Stub
 android.os.IInstalld
 android.os.IInterface
@@ -6205,7 +6177,6 @@
 android.os.PackageTagsList$1
 android.os.PackageTagsList
 android.os.Parcel$1
-android.os.Parcel$2
 android.os.Parcel$LazyValue
 android.os.Parcel$ReadWriteHelper
 android.os.Parcel$SquashReadHelper
@@ -6258,6 +6229,7 @@
 android.os.PowerWhitelistManager
 android.os.Process$ProcessStartResult
 android.os.Process
+android.os.ProfilingServiceManager
 android.os.ProxyFileDescriptorCallback
 android.os.RecoverySystem$1
 android.os.RecoverySystem$2
@@ -6311,14 +6283,12 @@
 android.os.StrictMode$2
 android.os.StrictMode$3
 android.os.StrictMode$4
-android.os.StrictMode$5
 android.os.StrictMode$6
 android.os.StrictMode$7
 android.os.StrictMode$8
 android.os.StrictMode$9
 android.os.StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda0
 android.os.StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda1
-android.os.StrictMode$AndroidBlockGuardPolicy
 android.os.StrictMode$AndroidCloseGuardReporter-IA
 android.os.StrictMode$AndroidCloseGuardReporter
 android.os.StrictMode$InstanceTracker
@@ -6341,7 +6311,6 @@
 android.os.StrictMode
 android.os.SynchronousResultReceiver$Result
 android.os.SynchronousResultReceiver
-android.os.SystemClock$1
 android.os.SystemClock$2
 android.os.SystemClock$3
 android.os.SystemClock
@@ -6518,7 +6487,6 @@
 android.permission.ILegacyPermissionManager$Stub$Proxy
 android.permission.ILegacyPermissionManager$Stub
 android.permission.ILegacyPermissionManager
-android.permission.IOnPermissionsChangeListener$Stub$Proxy
 android.permission.IOnPermissionsChangeListener$Stub
 android.permission.IOnPermissionsChangeListener
 android.permission.IPermissionChecker$Stub$Proxy
@@ -6536,7 +6504,6 @@
 android.permission.PermissionControllerManager
 android.permission.PermissionManager$1
 android.permission.PermissionManager$2
-android.permission.PermissionManager$OnPermissionsChangeListenerDelegate
 android.permission.PermissionManager$PackageNamePermissionQuery
 android.permission.PermissionManager$PermissionQuery
 android.permission.PermissionManager$SplitPermissionInfo-IA
@@ -7067,9 +7034,11 @@
 android.service.media.IMediaBrowserServiceCallbacks$Stub$Proxy
 android.service.media.IMediaBrowserServiceCallbacks$Stub
 android.service.media.IMediaBrowserServiceCallbacks
+android.service.media.MediaBrowserService$$ExternalSyntheticLambda0
 android.service.media.MediaBrowserService$BrowserRoot
 android.service.media.MediaBrowserService$ConnectionRecord
 android.service.media.MediaBrowserService$Result
+android.service.media.MediaBrowserService$ServiceBinder$$ExternalSyntheticLambda1
 android.service.media.MediaBrowserService$ServiceBinder-IA
 android.service.media.MediaBrowserService$ServiceBinder
 android.service.media.MediaBrowserService$ServiceState
@@ -7081,12 +7050,9 @@
 android.service.notification.ConditionProviderService$H-IA
 android.service.notification.ConditionProviderService$H
 android.service.notification.ConditionProviderService$Provider-IA
-android.service.notification.ConditionProviderService$Provider
 android.service.notification.ConditionProviderService
-android.service.notification.IConditionProvider$Stub$Proxy
 android.service.notification.IConditionProvider$Stub
 android.service.notification.IConditionProvider
-android.service.notification.INotificationListener$Stub$Proxy
 android.service.notification.INotificationListener$Stub
 android.service.notification.INotificationListener
 android.service.notification.IStatusBarNotificationHolder$Stub$Proxy
@@ -7098,7 +7064,6 @@
 android.service.notification.NotificationListenerFilter$1
 android.service.notification.NotificationListenerFilter
 android.service.notification.NotificationListenerService$MyHandler
-android.service.notification.NotificationListenerService$NotificationListenerWrapper
 android.service.notification.NotificationListenerService$Ranking
 android.service.notification.NotificationListenerService$RankingMap$1
 android.service.notification.NotificationListenerService$RankingMap-IA
@@ -7584,7 +7549,6 @@
 android.telephony.PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda62
 android.telephony.PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda6
 android.telephony.PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda9
-android.telephony.PhoneStateListener$IPhoneStateListenerStub
 android.telephony.PhoneStateListener
 android.telephony.PhysicalChannelConfig$1
 android.telephony.PhysicalChannelConfig$Builder
@@ -7688,7 +7652,6 @@
 android.telephony.TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda52
 android.telephony.TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda63
 android.telephony.TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda65
-android.telephony.TelephonyCallback$IPhoneStateListenerStub
 android.telephony.TelephonyCallback$ImsCallDisconnectCauseListener
 android.telephony.TelephonyCallback$LinkCapacityEstimateChangedListener
 android.telephony.TelephonyCallback$MediaQualityStatusChangedListener
@@ -8381,7 +8344,6 @@
 android.util.AndroidException
 android.util.AndroidRuntimeException
 android.util.ArrayMap$1
-android.util.ArrayMap
 android.util.ArraySet$1
 android.util.ArraySet
 android.util.AtomicFile
@@ -8451,11 +8413,6 @@
 android.util.LongSparseLongArray
 android.util.LruCache
 android.util.MalformedJsonException
-android.util.MapCollections$ArrayIterator
-android.util.MapCollections$EntrySet
-android.util.MapCollections$KeySet
-android.util.MapCollections$MapIterator
-android.util.MapCollections$ValuesCollection
 android.util.MapCollections
 android.util.MathUtils
 android.util.MemoryIntArray$1
@@ -8502,7 +8459,6 @@
 android.util.SparseLongArray
 android.util.SparseSetArray
 android.util.Spline$LinearSpline
-android.util.Spline$MonotoneCubicSpline
 android.util.Spline
 android.util.StateSet
 android.util.StringBuilderPrinter
@@ -8731,13 +8687,11 @@
 android.view.ISurfaceControlViewHost
 android.view.ISurfaceControlViewHostParent$Stub
 android.view.ISurfaceControlViewHostParent
-android.view.ISystemGestureExclusionListener$Stub$Proxy
 android.view.ISystemGestureExclusionListener$Stub
 android.view.ISystemGestureExclusionListener
 android.view.IWallpaperVisibilityListener$Stub$Proxy
 android.view.IWallpaperVisibilityListener$Stub
 android.view.IWallpaperVisibilityListener
-android.view.IWindow$Stub$Proxy
 android.view.IWindow$Stub
 android.view.IWindow
 android.view.IWindowFocusObserver$Stub
@@ -9062,6 +9016,7 @@
 android.view.ViewAnimationHostBridge
 android.view.ViewAnimationUtils
 android.view.ViewConfiguration
+android.view.ViewCredentialHandler
 android.view.ViewDebug$ExportedProperty
 android.view.ViewDebug$FlagToString
 android.view.ViewDebug$HierarchyHandler
@@ -9164,7 +9119,6 @@
 android.view.ViewRootImpl$ViewPostImeInputStage
 android.view.ViewRootImpl$ViewPreImeInputStage
 android.view.ViewRootImpl$ViewRootHandler
-android.view.ViewRootImpl$W
 android.view.ViewRootImpl$WindowInputEventReceiver
 android.view.ViewRootImpl
 android.view.ViewRootInsetsControllerHost
@@ -9401,7 +9355,6 @@
 android.view.contentcapture.IContentCaptureManager
 android.view.contentcapture.IContentCaptureOptionsCallback$Stub
 android.view.contentcapture.IContentCaptureOptionsCallback
-android.view.contentcapture.IDataShareWriteAdapter$Stub$Proxy
 android.view.contentcapture.IDataShareWriteAdapter$Stub
 android.view.contentcapture.IDataShareWriteAdapter
 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda0
@@ -9769,6 +9722,7 @@
 android.webkit.WebViewProviderResponse
 android.webkit.WebViewRenderProcess
 android.webkit.WebViewRenderProcessClient
+android.webkit.WebViewUpdateManager
 android.webkit.WebViewUpdateService
 android.webkit.WebViewZygote
 android.widget.AbsListView$1
@@ -10365,6 +10319,7 @@
 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda2
 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda3
 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda4
+android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda5
 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$CallbackRef
 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper
 android.window.WindowOnBackInvokedDispatcher
@@ -10568,10 +10523,8 @@
 com.android.i18n.timezone.internal.MemoryMappedFile
 com.android.i18n.timezone.internal.NioBufferIterator
 com.android.i18n.util.Log
-com.android.icu.charset.CharsetDecoderICU
 com.android.icu.charset.CharsetEncoderICU
 com.android.icu.charset.CharsetFactory
-com.android.icu.charset.CharsetICU
 com.android.icu.charset.NativeConverter
 com.android.icu.text.CompatibleDecimalFormatFactory
 com.android.icu.text.DateSorterBridge
@@ -10998,13 +10951,10 @@
 com.android.internal.app.IAppOpsActiveCallback$Stub$Proxy
 com.android.internal.app.IAppOpsActiveCallback$Stub
 com.android.internal.app.IAppOpsActiveCallback
-com.android.internal.app.IAppOpsAsyncNotedCallback$Stub$Proxy
 com.android.internal.app.IAppOpsAsyncNotedCallback$Stub
 com.android.internal.app.IAppOpsAsyncNotedCallback
-com.android.internal.app.IAppOpsCallback$Stub$Proxy
 com.android.internal.app.IAppOpsCallback$Stub
 com.android.internal.app.IAppOpsCallback
-com.android.internal.app.IAppOpsNotedCallback$Stub$Proxy
 com.android.internal.app.IAppOpsNotedCallback$Stub
 com.android.internal.app.IAppOpsNotedCallback
 com.android.internal.app.IAppOpsService$Stub$Proxy
@@ -11190,7 +11140,6 @@
 com.android.internal.infra.AndroidFuture$$ExternalSyntheticLambda3
 com.android.internal.infra.AndroidFuture$1
 com.android.internal.infra.AndroidFuture$2
-com.android.internal.infra.AndroidFuture
 com.android.internal.infra.GlobalWhitelistState
 com.android.internal.infra.IAndroidFuture$Stub$Proxy
 com.android.internal.infra.IAndroidFuture$Stub
@@ -11354,7 +11303,6 @@
 com.android.internal.os.CachedDeviceState$TimeInStateStopwatch
 com.android.internal.os.CachedDeviceState
 com.android.internal.os.ClassLoaderFactory
-com.android.internal.os.Clock$1
 com.android.internal.os.Clock
 com.android.internal.os.FuseAppLoop$1
 com.android.internal.os.FuseAppLoop
@@ -11532,7 +11480,6 @@
 com.android.internal.protolog.common.LogDataType
 com.android.internal.security.VerityUtils
 com.android.internal.statusbar.IAddTileResultCallback
-com.android.internal.statusbar.IStatusBar$Stub$Proxy
 com.android.internal.statusbar.IStatusBar$Stub
 com.android.internal.statusbar.IStatusBar
 com.android.internal.statusbar.IStatusBarService$Stub$Proxy
@@ -11753,7 +11700,6 @@
 com.android.internal.telephony.IOns$Stub$Proxy
 com.android.internal.telephony.IOns$Stub
 com.android.internal.telephony.IOns
-com.android.internal.telephony.IPhoneStateListener$Stub$Proxy
 com.android.internal.telephony.IPhoneStateListener$Stub
 com.android.internal.telephony.IPhoneStateListener
 com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy
@@ -13125,7 +13071,6 @@
 com.android.internal.util.XmlPullParserWrapper
 com.android.internal.util.XmlSerializerWrapper
 com.android.internal.util.XmlUtils$ForcedTypedXmlPullParser
-com.android.internal.util.XmlUtils$ForcedTypedXmlSerializer
 com.android.internal.util.XmlUtils$ReadMapCallback
 com.android.internal.util.XmlUtils$WriteMapCallback
 com.android.internal.util.XmlUtils
@@ -13171,7 +13116,6 @@
 com.android.internal.util.function.pooled.PooledLambdaImpl$LambdaType$ReturnType
 com.android.internal.util.function.pooled.PooledLambdaImpl$LambdaType
 com.android.internal.util.function.pooled.PooledLambdaImpl$Pool
-com.android.internal.util.function.pooled.PooledLambdaImpl
 com.android.internal.util.function.pooled.PooledPredicate
 com.android.internal.util.function.pooled.PooledRunnable
 com.android.internal.util.function.pooled.PooledSupplier$OfDouble
@@ -13456,6 +13400,7 @@
 com.android.service.nano.StringListParamProto
 com.android.telephony.Rlog
 com.android.text.flags.Flags
+com.android.window.flags.Flags
 com.google.android.collect.Lists
 com.google.android.collect.Maps
 com.google.android.collect.Sets
@@ -13891,7 +13836,6 @@
 gov.nist.javax.sip.stack.UDPMessageChannel
 gov.nist.javax.sip.stack.UDPMessageProcessor
 java.io.InterruptedIOException
-java.nio.DirectByteBuffer
 javax.microedition.khronos.egl.EGL10
 javax.microedition.khronos.egl.EGL11
 javax.microedition.khronos.egl.EGL
@@ -14020,7 +13964,6 @@
 org.apache.http.params.CoreConnectionPNames
 org.apache.http.params.HttpConnectionParams
 org.apache.http.params.HttpParams
-org.ccil.cowan.tagsoup.AttributesImpl
 org.ccil.cowan.tagsoup.AutoDetector
 org.ccil.cowan.tagsoup.CommandLine
 org.ccil.cowan.tagsoup.Element
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
index 0d3dc49..6310d32 100644
--- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
+++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
@@ -1280,6 +1280,24 @@
                 return "START_PACKAGE_RESTORE";
             case BackupManagerMonitor.LOG_EVENT_ID_AGENT_FAILURE:
                 return "AGENT_FAILURE";
+            case BackupManagerMonitor.LOG_EVENT_ID_RESTORE_AT_INSTALL_INVOKED:
+                return "RESTORE_AT_INSTALL_INVOKED";
+            case BackupManagerMonitor.LOG_EVENT_ID_SKIP_RESTORE_AT_INSTALL:
+                return "SKIP_RESTORE_AT_INSTALL";
+            case BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_ACCEPTED_FOR_RESTORE:
+                return "PACKAGE_ACCEPTED_FOR_RESTORE";
+            case BackupManagerMonitor.LOG_EVENT_ID_RESTORE_DATA_DOES_NOT_BELONG_TO_PACKAGE:
+                return "RESTORE_DATA_DOES_NOT_BELONG_TO_PACKAGE";
+            case BackupManagerMonitor.LOG_EVENT_ID_UNABLE_TO_CREATE_AGENT_FOR_RESTORE:
+                return "UNABLE_TO_CREATE_AGENT_FOR_RESTORE";
+            case BackupManagerMonitor.LOG_EVENT_ID_AGENT_CRASHED_BEFORE_RESTORE_DATA_IS_SENT:
+                return "AGENT_CRASHED_BEFORE_RESTORE_DATA_IS_SEN";
+            case BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_SEND_DATA_TO_AGENT_DURING_RESTORE:
+                return "FAILED_TO_SEND_DATA_TO_AGENT_DURING_RESTORE";
+            case BackupManagerMonitor.LOG_EVENT_ID_AGENT_FAILURE_DURING_RESTORE:
+                return "AGENT_FAILURE_DURING_RESTORE";
+            case BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_READ_DATA_FROM_TRANSPORT:
+                return "FAILED_TO_READ_DATA_FROM_TRANSPORT";
             default:
                 return "UNKNOWN_ID";
         }
diff --git a/cmds/incident_helper/OWNERS b/cmds/incident_helper/OWNERS
index cede4ea..29f44ab 100644
--- a/cmds/incident_helper/OWNERS
+++ b/cmds/incident_helper/OWNERS
@@ -1,3 +1,2 @@
 [email protected]
[email protected]
 [email protected]
diff --git a/cmds/incidentd/src/PrivacyFilter.cpp b/cmds/incidentd/src/PrivacyFilter.cpp
index 0d427d1..b273fd4 100644
--- a/cmds/incidentd/src/PrivacyFilter.cpp
+++ b/cmds/incidentd/src/PrivacyFilter.cpp
@@ -195,7 +195,9 @@
         ProtoOutputStream proto(mEncodedBuffer);
 
         // Optimization when no strip happens.
-        if (mRestrictions == NULL || spec.RequireAll()) {
+        if (mRestrictions == NULL || spec.RequireAll()
+                // Do not iterate through fields if primitive data
+                || !mRestrictions->children /* != FieldDescriptor::TYPE_MESSAGE */) {
             if (spec.CheckPremission(mRestrictions)) {
                 mSize = mData->size();
             }
diff --git a/cmds/locksettings/TEST_MAPPING b/cmds/locksettings/TEST_MAPPING
index 7a449ef..af54a2d 100644
--- a/cmds/locksettings/TEST_MAPPING
+++ b/cmds/locksettings/TEST_MAPPING
@@ -11,5 +11,10 @@
                 }
             ]
         }
+    ],
+    "postsubmit": [
+        {
+            "name": "CtsDevicePolicyManagerTestCases_LockSettings_NoFlakes"
+        }
     ]
 }
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index 56174c3..ee417e8 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -124,19 +124,19 @@
 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
+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
-HSPLandroid/animation/AnimationHandler$MyFrameCallbackProvider;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)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
-HSPLandroid/animation/AnimationHandler;->cleanUpList()V
-HSPLandroid/animation/AnimationHandler;->doAnimationFrame(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
+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
@@ -157,7 +157,7 @@
 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
+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;
@@ -168,7 +168,7 @@
 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
+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
@@ -180,7 +180,7 @@
 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
+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;
@@ -202,11 +202,11 @@
 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
+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
+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;
@@ -216,39 +216,39 @@
 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
+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
-HSPLandroid/animation/AnimatorSet$Node;->clone()Landroid/animation/AnimatorSet$Node;
+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
+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
+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;
-HSPLandroid/animation/AnimatorSet;->createDependencyGraph()V
+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
-HSPLandroid/animation/AnimatorSet;->endAnimation()V
+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;
-HSPLandroid/animation/AnimatorSet;->getNodeForAnimation(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Node;
+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
-HSPLandroid/animation/AnimatorSet;->initAnimation()V
+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
-HSPLandroid/animation/AnimatorSet;->isInitialized()Z
+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;
@@ -258,28 +258,28 @@
 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
+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
+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
+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
-HSPLandroid/animation/AnimatorSet;->startAnimation()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
-HSPLandroid/animation/AnimatorSet;->updatePlayTime(Landroid/animation/AnimatorSet$Node;Ljava/util/ArrayList;)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
+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;
@@ -287,11 +287,11 @@
 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;
+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
+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;
@@ -313,11 +313,11 @@
 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
+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;
+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;
@@ -357,14 +357,14 @@
 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;
+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;
-HSPLandroid/animation/ObjectAnimator;->getPropertyName()Ljava/lang/String;
+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
+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;
@@ -377,12 +377,12 @@
 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
+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
+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
@@ -399,16 +399,16 @@
 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
+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
+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
+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
+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;
@@ -416,11 +416,11 @@
 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
+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
-HSPLandroid/animation/PropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder;
+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;
@@ -434,7 +434,7 @@
 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
+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
@@ -443,7 +443,7 @@
 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;]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Landroid/animation/Keyframe;Landroid/animation/Keyframe$IntKeyframe;,Landroid/animation/Keyframe$FloatKeyframe;]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;
+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;
@@ -472,18 +472,18 @@
 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
-HSPLandroid/animation/ValueAnimator;->animateValue(F)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;
-HSPLandroid/animation/ValueAnimator;->doAnimationFrame(J)Z
+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;
+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
@@ -640,7 +640,7 @@
 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
+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
@@ -774,7 +774,6 @@
 HSPLandroid/app/ActivityManager;->isLowMemoryKillReportSupported()Z
 HSPLandroid/app/ActivityManager;->isLowRamDevice()Z
 HSPLandroid/app/ActivityManager;->isLowRamDeviceStatic()Z
-HSPLandroid/app/ActivityManager;->isProcStateCached(I)Z
 HSPLandroid/app/ActivityManager;->isRunningInTestHarness()Z
 HSPLandroid/app/ActivityManager;->isRunningInUserTestHarness()Z
 HSPLandroid/app/ActivityManager;->isStartResultFatalError(I)Z
@@ -805,16 +804,12 @@
 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$$ExternalSyntheticLambda2;-><init>()V
-HSPLandroid/app/ActivityThread$$ExternalSyntheticLambda3;-><init>(Landroid/app/ActivityThread;)V
-HSPLandroid/app/ActivityThread$$ExternalSyntheticLambda3;->onConfigurationChanged(Landroid/content/res/Configuration;)V
 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$1;->onConfigurationChanged(Landroid/content/res/Configuration;I)V
 HSPLandroid/app/ActivityThread$ActivityClientRecord;->-$$Nest$misPreHoneycomb(Landroid/app/ActivityThread$ActivityClientRecord;)Z
 HSPLandroid/app/ActivityThread$ActivityClientRecord;->getLifecycleState()I
 HSPLandroid/app/ActivityThread$ActivityClientRecord;->init()V
@@ -874,7 +869,7 @@
 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
+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
@@ -889,7 +884,6 @@
 HSPLandroid/app/ActivityThread$RequestAssistContextExtras;-><init>()V
 HSPLandroid/app/ActivityThread$ServiceArgsData;-><init>()V
 HSPLandroid/app/ActivityThread$ServiceArgsData;->toString()Ljava/lang/String;
-HSPLandroid/app/ActivityThread;->$r8$lambda$H8skqvF0pdTc-bqnTmunR6o6iNI(Landroid/app/ActivityThread;Landroid/content/res/Configuration;)V
 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
@@ -942,7 +936,7 @@
 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
+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
@@ -964,7 +958,7 @@
 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
+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
@@ -1004,7 +998,6 @@
 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$attach$4(Landroid/content/res/Configuration;)V
 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
@@ -1080,7 +1073,7 @@
 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
+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
@@ -1135,7 +1128,7 @@
 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;
+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
@@ -1273,7 +1266,7 @@
 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;
+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;
@@ -1297,7 +1290,7 @@
 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;
+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;
@@ -1307,7 +1300,7 @@
 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
+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
@@ -1332,7 +1325,7 @@
 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;
+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;
@@ -1388,7 +1381,6 @@
 HSPLandroid/app/BroadcastOptions;->setTemporaryAppWhitelistDuration(J)V
 HSPLandroid/app/BroadcastOptions;->toBundle()Landroid/os/Bundle;
 HSPLandroid/app/ClientTransactionHandler;-><init>()V
-HSPLandroid/app/ClientTransactionHandler;->isExecutingLocalTransaction()Z
 HSPLandroid/app/ClientTransactionHandler;->scheduleTransaction(Landroid/app/servertransaction/ClientTransaction;)V
 HSPLandroid/app/ConfigurationChangedListenerController;-><init>()V
 HSPLandroid/app/ConfigurationController;-><init>(Landroid/app/ActivityThreadInternal;)V
@@ -1441,7 +1433,7 @@
 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;Ljava/util/Collections$EmptySet;,Ljava/util/HashSet;,Landroid/util/ArraySet;]Landroid/permission/PermissionManager;Landroid/permission/PermissionManager;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;
+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;
@@ -1476,7 +1468,7 @@
 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;
+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;
@@ -1520,9 +1512,9 @@
 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;
-HSPLandroid/app/ContextImpl;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;
-HSPLandroid/app/ContextImpl;->getSharedPreferencesCacheLocked()Landroid/util/ArrayMap;
+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;
@@ -2274,7 +2266,7 @@
 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
+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
@@ -2299,7 +2291,7 @@
 HSPLandroid/app/Notification;->isGroupChild()Z
 HSPLandroid/app/Notification;->isGroupSummary()Z
 HSPLandroid/app/Notification;->isMediaNotification()Z
-HSPLandroid/app/Notification;->readFromParcelImpl(Landroid/os/Parcel;)V
+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;
@@ -2309,10 +2301,10 @@
 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
+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;
-HSPLandroid/app/NotificationChannel;-><init>(Landroid/os/Parcel;)V
+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
@@ -2331,7 +2323,7 @@
 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;
+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
@@ -2467,7 +2459,7 @@
 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
+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;
@@ -2476,13 +2468,13 @@
 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
+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;
+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
@@ -2519,7 +2511,6 @@
 HSPLandroid/app/RemoteInput;->getChoices()[Ljava/lang/CharSequence;
 HSPLandroid/app/RemoteInput;->getEditChoicesBeforeSending()I
 HSPLandroid/app/RemoteInput;->writeToParcel(Landroid/os/Parcel;I)V
-HSPLandroid/app/ResourcesManager$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;)Z
 HSPLandroid/app/ResourcesManager$ActivityResource;-><init>()V
 HSPLandroid/app/ResourcesManager$ActivityResource;-><init>(Landroid/app/ResourcesManager$ActivityResource-IA;)V
 HSPLandroid/app/ResourcesManager$ActivityResources;-><init>()V
@@ -2527,8 +2518,8 @@
 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
-HSPLandroid/app/ResourcesManager$ApkKey;->hashCode()I
+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;
@@ -2552,8 +2543,8 @@
 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;
-HSPLandroid/app/ResourcesManager;->extractApkKeys(Landroid/content/res/ResourcesKey;)Ljava/util/ArrayList;
+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;
@@ -2626,7 +2617,7 @@
 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;
+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;
@@ -2639,7 +2630,6 @@
 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;->$r8$lambda$gCIQI__z13DI5jNIqnAnYLWLcMc(Landroid/app/SharedPreferencesImpl;)V
 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;
@@ -2672,7 +2662,7 @@
 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
+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;
@@ -2698,9 +2688,7 @@
 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;)Landroid/permission/PermissionManager;
 HSPLandroid/app/SystemServiceRegistry$113;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-HSPLandroid/app/SystemServiceRegistry$114;->createService(Landroid/app/ContextImpl;)Landroid/permission/LegacyPermissionManager;
 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;
@@ -2716,12 +2704,10 @@
 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;)Landroid/app/GameManager;
 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$144;->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;
@@ -2770,11 +2756,9 @@
 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;)Landroid/telephony/TelephonyRegistryManager;
 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;)Landroid/telecom/TelecomManager;
 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;
@@ -2807,13 +2791,11 @@
 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;)Landroid/appwidget/AppWidgetManager;
 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;)Landroid/content/pm/ShortcutManager;
 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;
@@ -2823,11 +2805,9 @@
 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;)Landroid/view/autofill/AutofillManager;
 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;)Landroid/view/contentcapture/ContentCaptureManager;
 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;
@@ -2882,13 +2862,13 @@
 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
+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
+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;
@@ -2905,25 +2885,22 @@
 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
-HSPLandroid/app/WindowConfiguration;->setBounds(Landroid/graphics/Rect;)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
+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
+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
+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
+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$$ExternalSyntheticLambda2;-><init>(Landroid/app/admin/DevicePolicyManager;)V
-HSPLandroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda3;-><init>(Landroid/app/admin/DevicePolicyManager;)V
-HSPLandroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda4;-><init>(Landroid/app/admin/DevicePolicyManager;)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
@@ -3187,7 +3164,7 @@
 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
+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;
@@ -3209,7 +3186,7 @@
 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
+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
@@ -3295,23 +3272,17 @@
 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/BaseClientRequest;->postExecute(Landroid/app/ClientTransactionHandler;Landroid/app/servertransaction/PendingTransactionActions;)V
-HSPLandroid/app/servertransaction/BaseClientRequest;->preExecute(Landroid/app/ClientTransactionHandler;)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;->getTransactionItems()Ljava/util/List;
 HSPLandroid/app/servertransaction/ClientTransaction;->preExecute(Landroid/app/ClientTransactionHandler;)V
 HSPLandroid/app/servertransaction/ClientTransactionItem;-><init>()V
-HSPLandroid/app/servertransaction/ClientTransactionItem;->getActivityToken()Landroid/os/IBinder;
 HSPLandroid/app/servertransaction/ClientTransactionItem;->getPostExecutionState()I
 HSPLandroid/app/servertransaction/ClientTransactionItem;->isActivityLifecycleItem()Z
 HSPLandroid/app/servertransaction/ClientTransactionItem;->shouldHaveDefinedPreExecutionState()Z
-HSPLandroid/app/servertransaction/ClientTransactionListenerController;-><init>(Landroid/hardware/display/DisplayManagerGlobal;)V
-HSPLandroid/app/servertransaction/ClientTransactionListenerController;->getInstance()Landroid/app/servertransaction/ClientTransactionListenerController;
 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
@@ -3371,7 +3342,7 @@
 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/content/Context;missing_types]Landroid/app/servertransaction/ClientTransactionItem;megamorphic_types]Ljava/util/Map;Ljava/util/Collections$SynchronizedMap;]Landroid/app/servertransaction/TransactionExecutor;Landroid/app/servertransaction/TransactionExecutor;
+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
@@ -3379,7 +3350,6 @@
 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/servertransaction/TransactionExecutorHelper;->shouldExcludeLastLifecycleState(Ljava/util/List;I)Z+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/servertransaction/ClientTransactionItem;megamorphic_types]Landroid/app/servertransaction/ActivityLifecycleItem;Landroid/app/servertransaction/ResumeActivityItem;
 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
@@ -3446,7 +3416,7 @@
 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;
+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;
@@ -3471,7 +3441,7 @@
 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;
+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
@@ -3480,15 +3450,8 @@
 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$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z
 HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda3;-><init>()V
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda3;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda4;->test(Ljava/lang/Object;)Z
 HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda5;-><init>()V
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda5;->apply(I)Ljava/lang/Object;
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda7;-><init>(Landroid/appwidget/AppWidgetManager;)V
-HSPLandroid/appwidget/AppWidgetManager$$ExternalSyntheticLambda7;->run()V
-HSPLandroid/appwidget/AppWidgetManager;->$r8$lambda$WKLPyaeqLNLNb3560d7QJuq2DwQ(Landroid/appwidget/AppWidgetManager;)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;
@@ -3503,14 +3466,10 @@
 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
+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/appwidget/flags/FeatureFlagsImpl;-><init>()V
-HSPLandroid/appwidget/flags/FeatureFlagsImpl;->generatedPreviews()Z
-HSPLandroid/appwidget/flags/Flags;-><clinit>()V
-HSPLandroid/appwidget/flags/Flags;->generatedPreviews()Z+]Landroid/appwidget/flags/FeatureFlags;Landroid/appwidget/flags/FeatureFlagsImpl;
 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;
@@ -3521,7 +3480,7 @@
 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
+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
@@ -3666,7 +3625,7 @@
 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;
+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;
@@ -3678,7 +3637,7 @@
 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/IntStream;Ljava/util/stream/IntPipeline$Head;]Landroid/os/Parcel;Landroid/os/Parcel;
+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
@@ -3945,7 +3904,7 @@
 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;
+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
@@ -4011,7 +3970,7 @@
 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
+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;
@@ -4034,8 +3993,8 @@
 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;
-HSPLandroid/content/ContextWrapper;->getTheme()Landroid/content/res/Resources$Theme;
+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;
@@ -4127,7 +4086,7 @@
 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;
+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
@@ -4192,8 +4151,8 @@
 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
-HSPLandroid/content/Intent;->removeCategory(Ljava/lang/String;)V
+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;
@@ -4218,13 +4177,13 @@
 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
+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
+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;
@@ -4288,7 +4247,7 @@
 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
+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;
@@ -4372,7 +4331,7 @@
 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
+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
@@ -4391,7 +4350,7 @@
 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
+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;
@@ -4428,15 +4387,15 @@
 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
+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
+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;
+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;
@@ -4446,12 +4405,12 @@
 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
+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;
+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;
@@ -4488,7 +4447,7 @@
 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
+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;
@@ -4496,7 +4455,7 @@
 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;
+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;
@@ -4514,7 +4473,7 @@
 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;
+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;
@@ -4566,7 +4525,7 @@
 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
+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
@@ -4590,7 +4549,7 @@
 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
+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;
@@ -4748,7 +4707,7 @@
 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
+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;
@@ -4772,7 +4731,7 @@
 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
+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
@@ -4785,7 +4744,7 @@
 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
+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;
@@ -4849,7 +4808,7 @@
 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
+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;
@@ -4917,7 +4876,7 @@
 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;
+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;
@@ -4952,7 +4911,7 @@
 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;
+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
@@ -4984,7 +4943,7 @@
 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;
+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;
@@ -4997,7 +4956,7 @@
 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
+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
@@ -5010,7 +4969,7 @@
 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;
+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
@@ -5018,7 +4977,6 @@
 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;->setConfiguration(IILjava/lang/String;[Ljava/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
@@ -5088,7 +5046,7 @@
 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
+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
@@ -5101,12 +5059,12 @@
 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
+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
+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
+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;
@@ -5164,16 +5122,16 @@
 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;
+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
+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
+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
@@ -5182,7 +5140,7 @@
 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;
+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;
@@ -5191,12 +5149,12 @@
 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;
+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;
+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;
@@ -5269,7 +5227,7 @@
 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
+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
@@ -5284,10 +5242,10 @@
 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
+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
+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
@@ -5318,18 +5276,18 @@
 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;
-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;Landroid/graphics/drawable/InsetDrawable$InsetState;]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;->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;
+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
-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/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Landroid/app/ResourcesManager;Landroid/app/ResourcesManager;]Ljava/lang/Object;Ljava/util/Locale;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/content/res/DrawableCache;Landroid/content/res/DrawableCache;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Landroid/view/DisplayAdjustments;Landroid/view/DisplayAdjustments;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/os/LocaleList;Landroid/os/LocaleList;]Landroid/util/DisplayMetrics;Landroid/util/DisplayMetrics;]Landroid/content/res/ConfigurationBoundResourceCache;Landroid/content/res/ConfigurationBoundResourceCache;
+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
@@ -5355,15 +5313,15 @@
 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
+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;
-HSPLandroid/content/res/TypedArray;->getDrawableForDensity(II)Landroid/graphics/drawable/Drawable;
+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
@@ -5378,7 +5336,7 @@
 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;
+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
@@ -5411,7 +5369,7 @@
 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;
+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
@@ -5446,13 +5404,13 @@
 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/MatrixCursor;,Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;]Landroid/database/ContentObservable;Landroid/database/ContentObservable;]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard;
+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
-HSPLandroid/database/AbstractCursor;->getColumnCount()I
+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;
+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
@@ -5463,7 +5421,7 @@
 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/MatrixCursor;,Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;
+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;
@@ -5479,10 +5437,10 @@
 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
+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/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;
@@ -5509,7 +5467,7 @@
 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
+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
@@ -5552,10 +5510,10 @@
 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
+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
+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;
@@ -5601,7 +5559,7 @@
 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/String;Ljava/lang/String;]Ljava/lang/Object;Ljava/lang/String;
+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
@@ -5664,13 +5622,16 @@
 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/SQLiteQuery;,Landroid/database/sqlite/SQLiteDatabase;
+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
@@ -5691,7 +5652,7 @@
 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
+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;
@@ -5704,23 +5665,23 @@
 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
+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
-HSPLandroid/database/sqlite/SQLiteConnection;->executeForString(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)Ljava/lang/String;
+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
+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
+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
@@ -5761,7 +5722,7 @@
 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
+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
@@ -5775,13 +5736,13 @@
 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
+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;
+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;
+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;
@@ -5818,7 +5779,7 @@
 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
+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
@@ -5839,7 +5800,7 @@
 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;
+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;
@@ -5849,11 +5810,10 @@
 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
+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;->isInMemoryDatabase()Z+]Landroid/database/sqlite/SQLiteDatabaseConfiguration;Landroid/database/sqlite/SQLiteDatabaseConfiguration;
 HSPLandroid/database/sqlite/SQLiteDatabase;->isMainThread()Z
 HSPLandroid/database/sqlite/SQLiteDatabase;->isOpen()Z
 HSPLandroid/database/sqlite/SQLiteDatabase;->isReadOnly()Z
@@ -5871,7 +5831,7 @@
 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;
+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;
@@ -5896,7 +5856,7 @@
 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
+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
@@ -5919,7 +5879,7 @@
 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;
+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;
@@ -5931,7 +5891,7 @@
 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/SQLiteStatement;,Landroid/database/sqlite/SQLiteQuery;
+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
@@ -5948,11 +5908,11 @@
 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
-HSPLandroid/database/sqlite/SQLiteQueryBuilder;->appendColumns(Ljava/lang/StringBuilder;[Ljava/lang/String;)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;
+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;
@@ -5978,8 +5938,8 @@
 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
-HSPLandroid/database/sqlite/SQLiteSession;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)I
+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
@@ -5988,7 +5948,7 @@
 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/os/CancellationSignal;Landroid/os/CancellationSignal;]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;
+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
@@ -5998,9 +5958,9 @@
 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
+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
+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
@@ -6046,22 +6006,22 @@
 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
+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
-HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(FFFFLandroid/graphics/Paint;)V
-HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(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
+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
+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
+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;
@@ -6366,8 +6326,8 @@
 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
-HSPLandroid/graphics/HardwareRendererObserver;->notifyDataAvailable()V
+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
@@ -6412,7 +6372,7 @@
 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
+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;
@@ -6432,11 +6392,11 @@
 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
+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
+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
@@ -6445,7 +6405,7 @@
 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
+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
@@ -6481,13 +6441,13 @@
 HSPLandroid/graphics/Outline;->isEmpty()Z
 HSPLandroid/graphics/Outline;->setAlpha(F)V
 HSPLandroid/graphics/Outline;->setConvexPath(Landroid/graphics/Path;)V
-HSPLandroid/graphics/Outline;->setEmpty()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
+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
+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
@@ -6504,20 +6464,19 @@
 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;
+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/BlendModeColorFilter;]Landroid/graphics/Paint;Landroid/graphics/Paint;,Landroid/text/TextPaint;
+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;->getRunCharacterAdvance([CIIIIZI[FILandroid/graphics/RectF;Landroid/graphics/Paint$RunInfo;)F
 HSPLandroid/graphics/Paint;->getShader()Landroid/graphics/Shader;
 HSPLandroid/graphics/Paint;->getShadowLayerColor()I
 HSPLandroid/graphics/Paint;->getShadowLayerDx()F
@@ -6530,7 +6489,7 @@
 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
+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;
@@ -6550,7 +6509,7 @@
 HSPLandroid/graphics/Paint;->isAntiAlias()Z
 HSPLandroid/graphics/Paint;->isDither()Z
 HSPLandroid/graphics/Paint;->isElegantTextHeight()Z
-HSPLandroid/graphics/Paint;->isFilterBitmap()Z+]Landroid/graphics/Paint;Landroid/graphics/Paint;,Landroid/text/TextPaint;
+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
@@ -6584,14 +6543,14 @@
 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
+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
+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
@@ -6600,7 +6559,7 @@
 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
+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
@@ -6610,10 +6569,9 @@
 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
+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;)V
-HSPLandroid/graphics/Path;->computeBounds(Landroid/graphics/RectF;Z)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
@@ -6625,11 +6583,11 @@
 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
+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
+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
@@ -6652,7 +6610,7 @@
 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
+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
@@ -6686,8 +6644,8 @@
 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;
-HSPLandroid/graphics/RecordingCanvas;->recycle()V
+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;
@@ -6700,7 +6658,7 @@
 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
+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
@@ -6740,7 +6698,7 @@
 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
+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
@@ -6751,7 +6709,7 @@
 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
+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;
@@ -6787,10 +6745,10 @@
 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
+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
+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
@@ -6862,7 +6820,7 @@
 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;
+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;
@@ -6987,7 +6945,7 @@
 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
+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
@@ -7141,7 +7099,7 @@
 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
+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
@@ -7156,7 +7114,7 @@
 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
+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
@@ -7172,7 +7130,7 @@
 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;
+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;
@@ -7182,14 +7140,14 @@
 HSPLandroid/graphics/drawable/Drawable;->getIntrinsicWidth()I
 HSPLandroid/graphics/drawable/Drawable;->getLayoutDirection()I
 HSPLandroid/graphics/drawable/Drawable;->getLevel()I
-HSPLandroid/graphics/drawable/Drawable;->getMinimumHeight()I
-HSPLandroid/graphics/drawable/Drawable;->getMinimumWidth()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
+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
@@ -7207,7 +7165,7 @@
 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
+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
@@ -7216,20 +7174,20 @@
 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
+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;
+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;Landroid/graphics/drawable/VectorDrawable;,Landroid/graphics/drawable/NinePatchDrawable;,Landroid/graphics/drawable/AnimatedVectorDrawable;
+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
@@ -7272,7 +7230,7 @@
 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
+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
@@ -7339,7 +7297,7 @@
 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
+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
@@ -7360,7 +7318,7 @@
 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
+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;
@@ -7381,7 +7339,7 @@
 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
+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
@@ -7402,7 +7360,7 @@
 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
+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;
@@ -7443,7 +7401,7 @@
 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
+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
@@ -7455,7 +7413,7 @@
 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
+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
@@ -7639,21 +7597,21 @@
 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;
+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;
+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
+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
+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;
@@ -7732,7 +7690,7 @@
 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
+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
@@ -7815,7 +7773,7 @@
 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
+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;
@@ -7850,7 +7808,7 @@
 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
+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
@@ -7876,7 +7834,7 @@
 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
+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
@@ -7891,8 +7849,8 @@
 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
-HSPLandroid/graphics/drawable/VectorDrawable;->inflateChildElements(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
+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;
@@ -7906,7 +7864,7 @@
 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
+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
@@ -7954,7 +7912,6 @@
 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;->reset(Landroid/graphics/text/LineBreakConfig;)Landroid/graphics/text/LineBreakConfig$Builder;
 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
@@ -7987,7 +7944,6 @@
 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;->setComputeBounds(Z)Landroid/graphics/text/MeasuredText$Builder;
 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;
@@ -8113,8 +8069,6 @@
 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$FoldStateListener;->onBaseStateChanged(I)V
-HSPLandroid/hardware/camera2/CameraManager$FoldStateListener;->onStateChanged(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;
@@ -8192,16 +8146,12 @@
 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$DeviceStateCallback;->onSupportedStatesChanged([I)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$DeviceStateCallbackWrapper;->notifyBaseStateChanged(I)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper;->notifyStateChanged(I)V
-HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper;->notifySupportedStatesChanged([I)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
@@ -8250,7 +8200,6 @@
 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$$ExternalSyntheticLambda0;->test(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
@@ -8266,7 +8215,6 @@
 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;->isPresentationDisplay(Landroid/view/Display;)Z
 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
@@ -8276,7 +8224,7 @@
 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/hardware/display/DisplayManager$DisplayListener;missing_types]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;
+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
@@ -8290,14 +8238,12 @@
 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;
+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;->getOverlaySupport()Landroid/hardware/OverlayProperties;
 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;->handleDisplayEvent(IIZ)V+]Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;
 HSPLandroid/hardware/display/DisplayManagerGlobal;->initExtraLogging()Z
 HSPLandroid/hardware/display/DisplayManagerGlobal;->maybeLogAllDisplayListeners()V
 HSPLandroid/hardware/display/DisplayManagerGlobal;->registerCallbackIfNeededLocked()V
@@ -8600,7 +8546,7 @@
 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
+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
@@ -8608,9 +8554,9 @@
 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
+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;
+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
@@ -8701,22 +8647,22 @@
 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
+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
+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
+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;
+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
@@ -8729,7 +8675,7 @@
 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
+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
@@ -8747,13 +8693,13 @@
 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;
-HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->putIfAbsent(ILjava/lang/Object;I)Ljava/lang/Object;
+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;
+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;
+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
@@ -8763,7 +8709,7 @@
 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
+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
@@ -8797,10 +8743,10 @@
 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;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getStringV2(I)Ljava/lang/String;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getTable(I)Landroid/icu/impl/ICUResourceBundleReader$Table;
-HSPLandroid/icu/impl/ICUResourceBundleReader;->getTable16KeyOffsets(I)[C
+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;
@@ -8810,10 +8756,10 @@
 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;
+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;
-HSPLandroid/icu/impl/IDNA2003;->convertToASCII(Landroid/icu/text/UCharacterIterator;I)Ljava/lang/StringBuffer;
+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
@@ -8821,9 +8767,9 @@
 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
+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
+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;
@@ -8847,10 +8793,10 @@
 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
+HSPLandroid/icu/impl/LocaleIDParser;->parseCountry()I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLandroid/icu/impl/LocaleIDParser;->parseKeywords()I
-HSPLandroid/icu/impl/LocaleIDParser;->parseLanguage()I
-HSPLandroid/icu/impl/LocaleIDParser;->parseScript()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
@@ -8879,7 +8825,7 @@
 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
+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
@@ -8913,7 +8859,7 @@
 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
+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;
@@ -8934,7 +8880,7 @@
 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
+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
@@ -9189,9 +9135,9 @@
 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
+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
+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;
@@ -9427,7 +9373,7 @@
 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;
+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
@@ -9572,7 +9518,7 @@
 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/CurrencyPrecision;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/util/Currency;Landroid/icu/util/Currency;
+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;
@@ -9634,7 +9580,7 @@
 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;
+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;
@@ -9747,7 +9693,7 @@
 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;
+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
@@ -9759,7 +9705,7 @@
 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;
+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
@@ -9802,9 +9748,9 @@
 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
+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
+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;
@@ -9897,7 +9843,7 @@
 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
+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
@@ -10093,7 +10039,7 @@
 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
+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;
@@ -10171,7 +10117,7 @@
 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
+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
@@ -10472,14 +10418,14 @@
 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;
+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;
+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;
@@ -10499,7 +10445,7 @@
 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;
+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;
@@ -10583,7 +10529,7 @@
 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;
+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;
@@ -10609,7 +10555,7 @@
 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
+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
@@ -10745,7 +10691,7 @@
 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
+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
@@ -11480,8 +11426,8 @@
 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;
-HSPLandroid/net/Uri$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+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
@@ -11516,7 +11462,7 @@
 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;
+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;
@@ -11559,7 +11505,7 @@
 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;
+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;
@@ -11591,7 +11537,7 @@
 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;
+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;
@@ -11610,8 +11556,8 @@
 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;
-HSPLandroid/net/Uri;->getQueryParameterNames()Ljava/util/Set;
+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;
@@ -11621,7 +11567,7 @@
 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/ByteBuffer;Ljava/nio/HeapByteBuffer;]Ljava/nio/charset/CharsetDecoder;Lcom/android/icu/charset/CharsetDecoderICU;
+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
@@ -11692,9 +11638,9 @@
 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
+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/PersistableBundle;,Landroid/os/Bundle;]Ljava/lang/Class;Ljava/lang/Class;
+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;
@@ -11707,7 +11653,7 @@
 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
+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
@@ -11725,7 +11671,7 @@
 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/os/Parcel;Landroid/os/Parcel;
+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
@@ -11739,7 +11685,7 @@
 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
+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
@@ -11755,7 +11701,7 @@
 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/PersistableBundle;,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;
@@ -11795,7 +11741,7 @@
 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
+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
@@ -11803,14 +11749,14 @@
 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
-HSPLandroid/os/Binder;->execTransactInternal(ILandroid/os/Parcel;Landroid/os/Parcel;II)Z
+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;
+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
@@ -11834,7 +11780,7 @@
 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
+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;
@@ -11870,7 +11816,7 @@
 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;+]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;
@@ -12098,8 +12044,8 @@
 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
-HSPLandroid/os/Handler;->enqueueMessage(Landroid/os/MessageQueue;Landroid/os/Message;J)Z
+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;
@@ -12107,7 +12053,7 @@
 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
+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
@@ -12117,9 +12063,9 @@
 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
+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
+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
@@ -12132,10 +12078,10 @@
 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
+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
+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
@@ -12165,7 +12111,7 @@
 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
+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;
@@ -12278,12 +12224,12 @@
 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
+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;
+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;
@@ -12305,7 +12251,7 @@
 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
+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
@@ -12339,7 +12285,7 @@
 HSPLandroid/os/Message;->readFromParcel(Landroid/os/Parcel;)V
 HSPLandroid/os/Message;->recycle()V
 HSPLandroid/os/Message;->recycleUnchecked()V
-HSPLandroid/os/Message;->sendToTarget()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
@@ -12358,18 +12304,18 @@
 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;Landroid/app/ActivityThread$Idler;]Landroid/os/Message;Landroid/os/Message;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+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
+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
+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
+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;
@@ -12382,7 +12328,7 @@
 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;
+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;
@@ -12409,7 +12355,7 @@
 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;
+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
@@ -12417,7 +12363,7 @@
 HSPLandroid/os/Parcel;->dataSize()I
 HSPLandroid/os/Parcel;->destroy()V
 HSPLandroid/os/Parcel;->enforceInterface(Ljava/lang/String;)V
-HSPLandroid/os/Parcel;->enforceNoDataAvail()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
@@ -12450,10 +12396,10 @@
 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
+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;
+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
@@ -12482,7 +12428,7 @@
 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;missing_types]Landroid/os/Parcelable$ClassLoaderCreator;Landroid/content/pm/ParceledListSlice$1;
+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;
@@ -12490,14 +12436,14 @@
 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;
+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;
+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
@@ -12510,7 +12456,7 @@
 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;missing_types]Landroid/os/Parcel;Landroid/os/Parcel;
+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;
@@ -12528,7 +12474,7 @@
 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
+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
@@ -12568,12 +12514,12 @@
 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
-HSPLandroid/os/Parcel;->writeTypedArray([Landroid/os/Parcelable;I)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
+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;
@@ -12764,7 +12710,7 @@
 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;
+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;
@@ -12865,7 +12811,7 @@
 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
+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
@@ -12911,7 +12857,7 @@
 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
+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;
@@ -12989,12 +12935,12 @@
 HSPLandroid/os/Temperature;->getStatus()I
 HSPLandroid/os/Temperature;->isValidStatus(I)Z
 HSPLandroid/os/ThreadLocalWorkSource$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-HSPLandroid/os/ThreadLocalWorkSource;->getToken()J
-HSPLandroid/os/ThreadLocalWorkSource;->getUid()I
+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
-HSPLandroid/os/ThreadLocalWorkSource;->setUid(I)J
+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
@@ -13193,7 +13139,7 @@
 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;
+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;
@@ -13252,7 +13198,6 @@
 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;->checkPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/permission/IPermissionManager$Stub$Proxy;Landroid/permission/IPermissionManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel;
 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
@@ -13280,11 +13225,10 @@
 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;->-$$Nest$smcheckPermissionUncached(Ljava/lang/String;III)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;
+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;
@@ -13347,15 +13291,15 @@
 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;
+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;
-HSPLandroid/provider/Settings$NameValueCache;->getStringsForPrefixStripPrefix(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/List;)Ljava/util/Map;+]Ljava/lang/String;Ljava/lang/String;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/provider/Settings$GenerationTracker;Landroid/provider/Settings$GenerationTracker;]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Ljava/util/Iterator;Ljava/util/Arrays$ArrayItr;,Ljava/util/HashMap$EntryIterator;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/provider/Settings$ContentProviderHolder;Landroid/provider/Settings$ContentProviderHolder;]Ljava/util/Set;Ljava/util/HashMap$EntrySet;]Landroid/content/IContentProvider;Landroid/content/ContentProvider$Transport;,Landroid/content/ContentProviderProxy;]Landroid/content/ContentResolver;Landroid/app/ContextImpl$ApplicationContentResolver;]Landroid/net/Uri;Landroid/net/Uri$StringUri;
+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;
@@ -13399,13 +13343,9 @@
 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/SeFrameworkInitializer;->setSeServiceManager(Landroid/se/omapi/SeServiceManager;)V
 HSPLandroid/se/omapi/SeServiceManager;-><init>()V
 HSPLandroid/security/FeatureFlagsImpl;-><init>()V
-HSPLandroid/security/FeatureFlagsImpl;->certificateTransparencyConfiguration()Z
 HSPLandroid/security/Flags;-><clinit>()V
-HSPLandroid/security/Flags;->certificateTransparencyConfiguration()Z
-HSPLandroid/security/Flags;->contentUriPermissionApis()Z+]Landroid/security/FeatureFlags;Landroid/security/FeatureFlagsImpl;
 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
@@ -13615,7 +13555,6 @@
 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;->isCertificateTransparencyVerificationRequired(Ljava/lang/String;)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
@@ -13714,12 +13653,6 @@
 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/autofill/FeatureFlagsImpl;-><init>()V
-HSPLandroid/service/autofill/FeatureFlagsImpl;->autofillCredmanIntegration()Z
-HSPLandroid/service/autofill/FeatureFlagsImpl;->relayout()Z
-HSPLandroid/service/autofill/Flags;-><clinit>()V
-HSPLandroid/service/autofill/Flags;->autofillCredmanIntegration()Z
-HSPLandroid/service/autofill/Flags;->relayout()Z
 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
@@ -13759,18 +13692,18 @@
 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
+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
+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
+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
+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
@@ -13799,7 +13732,7 @@
 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
+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;
@@ -13818,7 +13751,7 @@
 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;
+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
@@ -13881,14 +13814,10 @@
 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;->tryParseBoolean(Ljava/lang/String;)Ljava/lang/Boolean;
 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$$ExternalSyntheticLambda11;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda2;-><init>()V
-HSPLandroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda2;->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;
@@ -13940,7 +13869,7 @@
 HSPLandroid/system/Os;->getpgid(I)I
 HSPLandroid/system/Os;->getpid()I
 HSPLandroid/system/Os;->gettid()I
-HSPLandroid/system/Os;->getuid()I+]Llibcore/io/Os;Landroid/app/ActivityThread$AndroidOs;
+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
@@ -14366,7 +14295,7 @@
 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;
+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
@@ -14450,7 +14379,6 @@
 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$$ExternalSyntheticLambda13;->applyOrThrow(Ljava/lang/Object;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;
@@ -14722,7 +14650,6 @@
 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$fgetmDrawingBounds(Landroid/text/BoringLayout$Metrics;)Landroid/graphics/RectF;
 HSPLandroid/text/BoringLayout$Metrics;->-$$Nest$mreset(Landroid/text/BoringLayout$Metrics;)V
 HSPLandroid/text/BoringLayout$Metrics;-><init>()V
 HSPLandroid/text/BoringLayout$Metrics;->reset()V
@@ -14745,7 +14672,7 @@
 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
+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;
@@ -14754,7 +14681,6 @@
 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;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;IZZLandroid/graphics/Paint$FontMetrics;)Landroid/text/BoringLayout;+]Landroid/text/BoringLayout;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
@@ -14763,7 +14689,6 @@
 HSPLandroid/text/CharSequenceCharacterIterator;->getIndex()I
 HSPLandroid/text/CharSequenceCharacterIterator;->next()C
 HSPLandroid/text/CharSequenceCharacterIterator;->setIndex(I)C
-HSPLandroid/text/ClientFlags;->fixLineHeightForLocale()Z
 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
@@ -14774,7 +14699,7 @@
 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
+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
@@ -14783,19 +14708,19 @@
 HSPLandroid/text/DynamicLayout;->getEllipsisCount(I)I
 HSPLandroid/text/DynamicLayout;->getEllipsisStart(I)I
 HSPLandroid/text/DynamicLayout;->getEllipsizedWidth()I
-HSPLandroid/text/DynamicLayout;->getEndHyphenEdit(I)I
+HSPLandroid/text/DynamicLayout;->getEndHyphenEdit(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;
 HSPLandroid/text/DynamicLayout;->getIndexFirstChangedBlock()I
-HSPLandroid/text/DynamicLayout;->getLineContainsTab(I)Z
+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
-HSPLandroid/text/DynamicLayout;->getLineDirections(I)Landroid/text/Layout$Directions;
+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
-HSPLandroid/text/DynamicLayout;->getStartHyphenEdit(I)I
-HSPLandroid/text/DynamicLayout;->reflow(Ljava/lang/CharSequence;III)V
+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
@@ -14851,9 +14776,9 @@
 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
+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
+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
@@ -14868,28 +14793,27 @@
 HSPLandroid/text/Layout;->getLineBaseline(I)I
 HSPLandroid/text/Layout;->getLineBottom(I)I
 HSPLandroid/text/Layout;->getLineBottom(IZ)I
-HSPLandroid/text/Layout;->getLineEnd(I)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
+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
+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;->getLineVisibleEnd(IIIZ)I+]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout;,Landroid/text/StaticLayout;]Ljava/lang/CharSequence;megamorphic_types
 HSPLandroid/text/Layout;->getLineWidth(I)F
 HSPLandroid/text/Layout;->getOffsetAtStartOf(I)I
 HSPLandroid/text/Layout;->getOffsetForHorizontal(IF)I
-HSPLandroid/text/Layout;->getOffsetForHorizontal(IFZ)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;
-HSPLandroid/text/Layout;->getParagraphLeadingMargin(I)I
+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;
+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
@@ -14908,13 +14832,11 @@
 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/style/MetricAffectingSpan;missing_types]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/graphics/text/LineBreakConfig$Builder;Landroid/graphics/text/LineBreakConfig$Builder;]Landroid/text/AutoGrowArray$IntArray;Landroid/text/AutoGrowArray$IntArray;
+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;->buildForStaticLayout(Landroid/text/TextPaint;Landroid/graphics/text/LineBreakConfig;Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;IZZLandroid/text/MeasuredParagraph;Landroid/text/MeasuredParagraph;)Landroid/text/MeasuredParagraph;
-HSPLandroid/text/MeasuredParagraph;->buildForStaticLayoutInternal(Landroid/text/TextPaint;Landroid/graphics/text/LineBreakConfig;Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;IZZLandroid/text/MeasuredParagraph;Landroid/text/MeasuredParagraph;Landroid/text/MeasuredParagraph$StyleRunCallback;)Landroid/text/MeasuredParagraph;+]Landroid/graphics/text/MeasuredText$Builder;Landroid/graphics/text/MeasuredText$Builder;]Landroid/text/Spanned;missing_types]Landroid/text/AutoGrowArray$IntArray;Landroid/text/AutoGrowArray$IntArray;
 HSPLandroid/text/MeasuredParagraph;->getCharWidthAt(I)F
 HSPLandroid/text/MeasuredParagraph;->getChars()[C
 HSPLandroid/text/MeasuredParagraph;->getDirections(II)Landroid/text/Layout$Directions;
@@ -14932,7 +14854,7 @@
 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
+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
@@ -14940,7 +14862,7 @@
 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
+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
@@ -14950,9 +14872,8 @@
 HSPLandroid/text/PrecomputedText$Params;->getHyphenationFrequency()I
 HSPLandroid/text/PrecomputedText$Params;->getTextDirection()Landroid/text/TextDirectionHeuristic;
 HSPLandroid/text/PrecomputedText$Params;->getTextPaint()Landroid/text/TextPaint;
-HSPLandroid/text/PrecomputedText;->createMeasuredParagraphs(Ljava/lang/CharSequence;Landroid/text/PrecomputedText$Params;IIZZ)[Landroid/text/PrecomputedText$ParagraphInfo;+]Landroid/text/PrecomputedText$Params;Landroid/text/PrecomputedText$Params;]Landroid/graphics/text/LineBreakConfig;Landroid/graphics/text/LineBreakConfig;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLandroid/text/Selection;->getSelectionEnd(Ljava/lang/CharSequence;)I
-HSPLandroid/text/Selection;->getSelectionStart(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
@@ -14962,7 +14883,7 @@
 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
+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;
@@ -14980,17 +14901,17 @@
 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
+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;
+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
+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
+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
@@ -15000,12 +14921,12 @@
 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
-HSPLandroid/text/SpannableStringBuilder;->getSpanFlags(Ljava/lang/Object;)I
-HSPLandroid/text/SpannableStringBuilder;->getSpanStart(Ljava/lang/Object;)I
-HSPLandroid/text/SpannableStringBuilder;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;
+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
+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;
@@ -15024,48 +14945,48 @@
 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;
+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
+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
+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
+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;
+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
-HSPLandroid/text/SpannableStringInternal;->charAt(I)C
-HSPLandroid/text/SpannableStringInternal;->checkRange(Ljava/lang/String;II)V
-HSPLandroid/text/SpannableStringInternal;->copySpansFromInternal(Landroid/text/SpannableStringInternal;IIZ)V
-HSPLandroid/text/SpannableStringInternal;->copySpansFromSpanned(Landroid/text/Spanned;IIZ)V
+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
+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;
-HSPLandroid/text/SpannableStringInternal;->length()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
+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
+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
@@ -15091,7 +15012,6 @@
 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$fgetmUseBoundsForWidth(Landroid/text/StaticLayout$Builder;)Z
 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;
@@ -15111,7 +15031,7 @@
 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
+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
@@ -15121,7 +15041,7 @@
 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;
+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
@@ -15130,7 +15050,7 @@
 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
+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
@@ -15141,7 +15061,6 @@
 HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicInternal;->defaultIsRtl()Z
 HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicLocale;->defaultIsRtl()Z
 HSPLandroid/text/TextDirectionHeuristics;->isRtlCodePoint(I)I
-HSPLandroid/text/TextFlags;-><clinit>()V
 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
@@ -15150,27 +15069,24 @@
 HSPLandroid/text/TextLine;-><init>()V
 HSPLandroid/text/TextLine;->adjustEndHyphenEdit(II)I
 HSPLandroid/text/TextLine;->adjustStartHyphenEdit(II)I
-HSPLandroid/text/TextLine;->calculateRunFlag(III)I
-HSPLandroid/text/TextLine;->draw(Landroid/graphics/Canvas;FIII)V
+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
+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
-HSPLandroid/text/TextLine;->extractDecorationInfo(Landroid/text/TextPaint;Landroid/text/TextLine$DecorationInfo;)V
-HSPLandroid/text/TextLine;->getOffsetBeforeAfter(IIIZIZ)I
+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;
+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;->measureRun(IIIZLandroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;[FIFLandroid/text/TextLine$LineInfo;I)F
-HSPLandroid/text/TextLine;->metrics(Landroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;ZLandroid/text/TextLine$LineInfo;)F+]Landroid/text/TextLine;Landroid/text/TextLine;
 HSPLandroid/text/TextLine;->obtain()Landroid/text/TextLine;
-HSPLandroid/text/TextLine;->recycle(Landroid/text/TextLine;)Landroid/text/TextLine;
-HSPLandroid/text/TextLine;->set(Landroid/text/TextPaint;Ljava/lang/CharSequence;IIILandroid/text/Layout$Directions;ZLandroid/text/Layout$TabStops;IIZ)V
+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
@@ -15187,7 +15103,7 @@
 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;
+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
@@ -15195,23 +15111,23 @@
 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
+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;
+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
+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
+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;
+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
@@ -15224,14 +15140,14 @@
 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;
+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
+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;
@@ -15338,7 +15254,7 @@
 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
+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
@@ -15357,7 +15273,7 @@
 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
+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;
@@ -15423,7 +15339,7 @@
 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
+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
@@ -15536,8 +15452,8 @@
 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;
-HSPLandroid/util/ArrayMap;->putAll(Landroid/util/ArrayMap;)V
+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;
@@ -15558,11 +15474,11 @@
 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
+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
+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
@@ -15602,7 +15518,7 @@
 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
+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;
@@ -15705,9 +15621,9 @@
 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;
-HSPLandroid/util/JsonWriter;->replaceTop(Landroid/util/JsonScope;)V
-HSPLandroid/util/JsonWriter;->string(Ljava/lang/String;)V
+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;
@@ -15757,7 +15673,7 @@
 HSPLandroid/util/LongSparseArray;->clear()V
 HSPLandroid/util/LongSparseArray;->delete(J)V
 HSPLandroid/util/LongSparseArray;->gc()V
-HSPLandroid/util/LongSparseArray;->get(J)Ljava/lang/Object;
+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
@@ -16103,8 +16019,8 @@
 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
-HSPLandroid/view/Choreographer$CallbackRecord;->run(Landroid/view/Choreographer$FrameData;)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
@@ -16117,8 +16033,8 @@
 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
-HSPLandroid/view/Choreographer$FrameDisplayEventReceiver;->run()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
@@ -16135,12 +16051,12 @@
 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$FrameData;Landroid/view/Choreographer$FrameData;]Landroid/view/Choreographer$CallbackRecord;Landroid/view/Choreographer$CallbackRecord;
-HSPLandroid/view/Choreographer;->doFrame(JILandroid/view/DisplayEventReceiver$VsyncEventData;)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
+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;
@@ -16149,17 +16065,17 @@
 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
+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
-HSPLandroid/view/Choreographer;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)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
+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
@@ -16170,7 +16086,7 @@
 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;
+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
@@ -16209,11 +16125,10 @@
 HSPLandroid/view/Display;->getHdrSdrRatio()F
 HSPLandroid/view/Display;->getHeight()I
 HSPLandroid/view/Display;->getInstallOrientation()I
-HSPLandroid/view/Display;->getLocalRotation()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;->getOverlaySupport()Landroid/hardware/OverlayProperties;
 HSPLandroid/view/Display;->getPreferredWideGamutColorSpace()Landroid/graphics/ColorSpace;
 HSPLandroid/view/Display;->getPresentationDeadlineNanos()J
 HSPLandroid/view/Display;->getRealMetrics(Landroid/util/DisplayMetrics;)V
@@ -16232,7 +16147,7 @@
 HSPLandroid/view/Display;->shouldReportMaxBounds()Z
 HSPLandroid/view/Display;->stateToString(I)Ljava/lang/String;
 HSPLandroid/view/Display;->updateCachedAppSizeIfNeededLocked()V
-HSPLandroid/view/Display;->updateDisplayInfoLocked()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
@@ -16284,7 +16199,7 @@
 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
+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
@@ -16294,7 +16209,7 @@
 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
+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;
@@ -16303,14 +16218,14 @@
 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
+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
+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
@@ -16346,7 +16261,7 @@
 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
+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
@@ -16380,7 +16295,7 @@
 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
+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
@@ -16399,13 +16314,6 @@
 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;-><clinit>()V
-HSPLandroid/view/HdrRenderState;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/HdrRenderState;->forceUpdateHdrSdrRatio()V+]Landroid/view/HdrRenderState;Landroid/view/HdrRenderState;]Landroid/view/Display;Landroid/view/Display;
-HSPLandroid/view/HdrRenderState;->getDesiredHdrSdrRatio()F
-HSPLandroid/view/HdrRenderState;->getRenderHdrSdrRatio()F
-HSPLandroid/view/HdrRenderState;->isHdrEnabled()Z
-HSPLandroid/view/HdrRenderState;->setDesiredHdrSdrRatio(ZF)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;
@@ -16440,7 +16348,7 @@
 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
+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
@@ -16565,8 +16473,6 @@
 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$$ExternalSyntheticLambda12;->get()Ljava/lang/Object;
-HSPLandroid/view/InsetsController$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLandroid/view/InsetsController$$ExternalSyntheticLambda7;-><init>()V
 HSPLandroid/view/InsetsController$$ExternalSyntheticLambda9;-><init>(Landroid/view/InsetsController;)V
 HSPLandroid/view/InsetsController$1;-><init>(Landroid/view/InsetsController;)V
@@ -16626,7 +16532,7 @@
 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
+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
@@ -16643,7 +16549,7 @@
 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;
+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
@@ -16701,8 +16607,8 @@
 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;
-HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;IZ)Landroid/graphics/Insets;
+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;
@@ -16714,8 +16620,8 @@
 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;
-HSPLandroid/view/InsetsState;->getDisplayCutoutSafe(Landroid/graphics/Rect;)V
+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;
@@ -16797,7 +16703,7 @@
 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
+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
@@ -16959,9 +16865,8 @@
 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$RefreshRateRange;-><init>(FF)V
 HSPLandroid/view/SurfaceControl$Transaction;-><init>()V
-HSPLandroid/view/SurfaceControl$Transaction;-><init>(J)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
@@ -16969,7 +16874,7 @@
 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;
+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;
@@ -16979,7 +16884,7 @@
 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;
+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;
@@ -17013,10 +16918,8 @@
 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$NoOpRegistry;->add(Landroid/view/SurfaceControl;)V
 HSPLandroid/view/SurfaceControlRegistry;-><clinit>()V
 HSPLandroid/view/SurfaceControlRegistry;->getProcessInstance()Landroid/view/SurfaceControlRegistry;
-HSPLandroid/view/SurfaceControlRegistry;->initializeCallStackDebugging()V
 HSPLandroid/view/SurfaceSession;-><init>()V
 HSPLandroid/view/SurfaceSession;->finalize()V
 HSPLandroid/view/SurfaceSession;->kill()V
@@ -17090,8 +16993,8 @@
 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
-HSPLandroid/view/ThreadedRenderer$1;->onFrameDraw(IJ)Landroid/graphics/HardwareRenderer$FrameCommitCallback;
+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
@@ -17106,7 +17009,7 @@
 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
+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
@@ -17117,20 +17020,20 @@
 HSPLandroid/view/ThreadedRenderer;->isEnabled()Z
 HSPLandroid/view/ThreadedRenderer;->isRequested()Z
 HSPLandroid/view/ThreadedRenderer;->loadSystemProperties()Z
-HSPLandroid/view/ThreadedRenderer;->registerRtFrameCallback(Landroid/graphics/HardwareRenderer$FrameDrawingCallback;)V
+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
+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
+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
-HSPLandroid/view/ThreadedRenderer;->updateWebViewOverlayCallbacks()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
@@ -17144,7 +17047,6 @@
 HSPLandroid/view/VelocityTracker;->getYVelocity(I)F
 HSPLandroid/view/VelocityTracker;->obtain()Landroid/view/VelocityTracker;
 HSPLandroid/view/VelocityTracker;->recycle()V
-HSPLandroid/view/View$$ExternalSyntheticLambda3;->get()Ljava/lang/Object;
 HSPLandroid/view/View$$ExternalSyntheticLambda4;-><init>(Landroid/view/View;)V
 HSPLandroid/view/View$$ExternalSyntheticLambda4;->run()V
 HSPLandroid/view/View$$ExternalSyntheticLambda5;->run()V
@@ -17153,7 +17055,7 @@
 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
+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
@@ -17207,15 +17109,15 @@
 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
+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/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Landroid/content/Context;missing_types]Ljava/lang/Class;Ljava/lang/Class;
+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/res/TypedArray;Landroid/content/res/TypedArray;
+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
@@ -17231,7 +17133,7 @@
 HSPLandroid/view/View;->areDrawablesResolved()Z
 HSPLandroid/view/View;->assignParent(Landroid/view/ViewParent;)V
 HSPLandroid/view/View;->awakenScrollBars()Z
-HSPLandroid/view/View;->awakenScrollBars(IZ)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
@@ -17241,8 +17143,8 @@
 HSPLandroid/view/View;->canHaveDisplayList()Z
 HSPLandroid/view/View;->canNotifyAutofillEnterExitEvent()Z
 HSPLandroid/view/View;->canReceivePointerEvents()Z
-HSPLandroid/view/View;->canResolveLayoutDirection()Z
-HSPLandroid/view/View;->canResolveTextDirection()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
@@ -17272,18 +17174,18 @@
 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
+HSPLandroid/view/View;->computeVerticalScrollExtent()I+]Landroid/view/View;missing_types
 HSPLandroid/view/View;->computeVerticalScrollOffset()I
-HSPLandroid/view/View;->computeVerticalScrollRange()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;
+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
+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
+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
@@ -17313,14 +17215,14 @@
 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
-HSPLandroid/view/View;->draw(Landroid/graphics/Canvas;Landroid/view/ViewGroup;J)Z
-HSPLandroid/view/View;->drawAutofilledHighlight(Landroid/graphics/Canvas;)V
-HSPLandroid/view/View;->drawBackground(Landroid/graphics/Canvas;)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
-HSPLandroid/view/View;->drawsWithRenderNode(Landroid/graphics/Canvas;)Z
+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;
@@ -17364,8 +17266,8 @@
 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;
-HSPLandroid/view/View;->getDrawableState()[I
+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
@@ -17381,7 +17283,7 @@
 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
+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
@@ -17394,16 +17296,16 @@
 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
+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
+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;
+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
@@ -17435,15 +17337,15 @@
 HSPLandroid/view/View;->getRotationX()F
 HSPLandroid/view/View;->getRotationY()F
 HSPLandroid/view/View;->getRunQueue()Landroid/view/HandlerActionQueue;
-HSPLandroid/view/View;->getScaleX()F
-HSPLandroid/view/View;->getScaleY()F
+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
-HSPLandroid/view/View;->getSuggestedMinimumHeight()I
-HSPLandroid/view/View;->getSuggestedMinimumWidth()I
+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;
@@ -17455,10 +17357,10 @@
 HSPLandroid/view/View;->getTransitionAlpha()F
 HSPLandroid/view/View;->getTransitionName()Ljava/lang/String;
 HSPLandroid/view/View;->getTranslationX()F
-HSPLandroid/view/View;->getTranslationY()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
+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;
@@ -17466,7 +17368,7 @@
 HSPLandroid/view/View;->getWidth()I
 HSPLandroid/view/View;->getWindowAttachCount()I
 HSPLandroid/view/View;->getWindowId()Landroid/view/WindowId;
-HSPLandroid/view/View;->getWindowInsetsController()Landroid/view/WindowInsetsController;
+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
@@ -17501,17 +17403,17 @@
 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
+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
-HSPLandroid/view/View;->invalidate(IIII)V
-HSPLandroid/view/View;->invalidate(Landroid/graphics/Rect;)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;missing_types]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewParent;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
@@ -17556,7 +17458,7 @@
 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
+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
@@ -17581,18 +17483,17 @@
 HSPLandroid/view/View;->isVisibleToUser()Z
 HSPLandroid/view/View;->isVisibleToUser(Landroid/graphics/Rect;)Z
 HSPLandroid/view/View;->jumpDrawablesToCurrentState()V
-HSPLandroid/view/View;->layout(IIII)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;missing_types]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;
+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;->notifyAutofillManagerViewVisibilityChanged(Z)V+]Landroid/os/Handler;Landroid/view/View$VisibilityChangeForAutofillHandler;]Landroid/os/Message;Landroid/os/Message;]Landroid/view/autofill/AutofillManager;Landroid/view/autofill/AutofillManager;]Landroid/view/View;missing_types
 HSPLandroid/view/View;->notifyEnterOrExitForAutoFillIfNeeded(Z)V
 HSPLandroid/view/View;->notifyGlobalFocusCleared(Landroid/view/View;)V
 HSPLandroid/view/View;->notifySubtreeAccessibilityStateChangedByParentIfNeeded()V
@@ -17604,21 +17505,21 @@
 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
+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
+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
+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
+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
+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
@@ -17628,7 +17529,7 @@
 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
+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
@@ -17643,7 +17544,7 @@
 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;missing_types]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Landroid/graphics/drawable/Drawable;missing_types
+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
@@ -17664,12 +17565,12 @@
 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
+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
+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
@@ -17704,9 +17605,9 @@
 HSPLandroid/view/View;->resetSubtreeAccessibilityStateChanged()V
 HSPLandroid/view/View;->resolveDrawables()V
 HSPLandroid/view/View;->resolveLayoutDirection()Z
-HSPLandroid/view/View;->resolveLayoutParams()V
-HSPLandroid/view/View;->resolvePadding()V
-HSPLandroid/view/View;->resolveRtlPropertiesIfNeeded()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
@@ -17737,10 +17638,10 @@
 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
+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
-HSPLandroid/view/View;->setBackgroundRenderNodeProperties(Landroid/graphics/RenderNode;)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
@@ -17750,18 +17651,18 @@
 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
+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/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager;]Landroid/view/ViewParent;Landroid/view/ViewRootImpl;
+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
+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
@@ -17778,7 +17679,7 @@
 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
+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
@@ -17816,8 +17717,8 @@
 HSPLandroid/view/View;->setRotationY(F)V
 HSPLandroid/view/View;->setSaveEnabled(Z)V
 HSPLandroid/view/View;->setSaveFromParentEnabled(Z)V
-HSPLandroid/view/View;->setScaleX(F)V
-HSPLandroid/view/View;->setScaleY(F)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
@@ -17840,15 +17741,15 @@
 HSPLandroid/view/View;->setTransitionVisibility(I)V
 HSPLandroid/view/View;->setTranslationX(F)V
 HSPLandroid/view/View;->setTranslationY(F)V
-HSPLandroid/view/View;->setTranslationZ(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
+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
+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
@@ -17858,7 +17759,7 @@
 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;missing_types]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;
+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
@@ -17931,7 +17832,7 @@
 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
+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
@@ -17977,14 +17878,14 @@
 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
+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
+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
+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
@@ -18009,7 +17910,7 @@
 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
+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
@@ -18028,13 +17929,13 @@
 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;
+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
+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
@@ -18063,7 +17964,7 @@
 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
+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
@@ -18075,7 +17976,7 @@
 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
+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
@@ -18110,7 +18011,7 @@
 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
+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
@@ -18124,9 +18025,9 @@
 HSPLandroid/view/ViewGroup;->resetTouchState()V
 HSPLandroid/view/ViewGroup;->resolveDrawables()V
 HSPLandroid/view/ViewGroup;->resolveLayoutDirection()Z
-HSPLandroid/view/ViewGroup;->resolveLayoutParams()V
+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
+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
@@ -18152,7 +18053,7 @@
 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
+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
@@ -18178,7 +18079,7 @@
 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
+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
@@ -18204,17 +18105,7 @@
 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$$ExternalSyntheticLambda18;->run()V
 HSPLandroid/view/ViewRootImpl$$ExternalSyntheticLambda3;->run()V
-HSPLandroid/view/ViewRootImpl$$ExternalSyntheticLambda6;->accept(Ljava/lang/Object;)V
-HSPLandroid/view/ViewRootImpl$4;-><init>(Landroid/view/ViewRootImpl;)V
-HSPLandroid/view/ViewRootImpl$8;->run()V+]Ljava/util/Optional;Ljava/util/Optional;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;
-HSPLandroid/view/ViewRootImpl$9$$ExternalSyntheticLambda3;-><init>(Landroid/view/ViewRootImpl$9;JLandroid/window/SurfaceSyncGroup;Z)V
-HSPLandroid/view/ViewRootImpl$9$$ExternalSyntheticLambda3;->onFrameCommit(Z)V
-HSPLandroid/view/ViewRootImpl$9;->$r8$lambda$87sb7YFlAxJB5bDf7ZdJlACs2qw(Landroid/view/ViewRootImpl$9;JLandroid/window/SurfaceSyncGroup;ZZ)V
-HSPLandroid/view/ViewRootImpl$9;-><init>(Landroid/view/ViewRootImpl;Landroid/view/SurfaceControl$Transaction;Landroid/window/SurfaceSyncGroup;Z)V
-HSPLandroid/view/ViewRootImpl$9;->lambda$onFrameDraw$3(JLandroid/window/SurfaceSyncGroup;ZZ)V
-HSPLandroid/view/ViewRootImpl$9;->onFrameDraw(IJ)Landroid/graphics/HardwareRenderer$FrameCommitCallback;
 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
@@ -18235,7 +18126,7 @@
 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
+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
@@ -18247,10 +18138,10 @@
 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
-HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->postIfNeededLocked()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
+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
@@ -18274,7 +18165,7 @@
 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
+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
@@ -18299,28 +18190,24 @@
 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$W;->resized(Landroid/window/ClientWindowFrames;ZLandroid/util/MergedConfiguration;Landroid/view/InsetsState;ZZIIZ)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;->$r8$lambda$kydZ5VrQzxxxtiGWLXqElnQw9pY(Landroid/view/ViewRootImpl;ILandroid/view/SurfaceControl$Transaction;)V
-HSPLandroid/view/ViewRootImpl;->$r8$lambda$mXUz2hQqgF1vi6zgAMk8eGZNG-o(Landroid/view/ViewRootImpl;)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$mdispatchResized(Landroid/view/ViewRootImpl;Landroid/window/ClientWindowFrames;ZLandroid/util/MergedConfiguration;Landroid/view/InsetsState;ZZIIZ)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
+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
+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
@@ -18329,14 +18216,13 @@
 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
+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
+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;->determineForceDarkType()I
 HSPLandroid/view/ViewRootImpl;->die(Z)Z
 HSPLandroid/view/ViewRootImpl;->dipToPx(I)I
 HSPLandroid/view/ViewRootImpl;->dispatchAppVisibility(Z)V
@@ -18347,14 +18233,13 @@
 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
+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;->dispatchResized(Landroid/window/ClientWindowFrames;ZLandroid/util/MergedConfiguration;Landroid/view/InsetsState;ZZIIZ)V
 HSPLandroid/view/ViewRootImpl;->doConsumeBatchedInput(J)Z
 HSPLandroid/view/ViewRootImpl;->doDie()V
 HSPLandroid/view/ViewRootImpl;->doProcessInputEvents()V
-HSPLandroid/view/ViewRootImpl;->doTraversal()V
-HSPLandroid/view/ViewRootImpl;->draw(ZLandroid/window/SurfaceSyncGroup;Z)Z
+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
@@ -18376,10 +18261,10 @@
 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;
+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
+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;
@@ -18388,12 +18273,12 @@
 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;
+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;
+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
@@ -18405,14 +18290,14 @@
 HSPLandroid/view/ViewRootImpl;->handleContentCaptureFlush()V
 HSPLandroid/view/ViewRootImpl;->handleDispatchSystemUiVisibilityChanged()V
 HSPLandroid/view/ViewRootImpl;->handleWindowFocusChanged()V
-HSPLandroid/view/ViewRootImpl;->invalidate()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
+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
@@ -18426,45 +18311,43 @@
 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;->logAndTrace(Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 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
-HSPLandroid/view/ViewRootImpl;->mergeWithNextTransaction(Landroid/view/SurfaceControl$Transaction;J)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
+HSPLandroid/view/ViewRootImpl;->notifyDrawStarted(Z)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLandroid/view/ViewRootImpl;->notifyInsetsChanged()V
-HSPLandroid/view/ViewRootImpl;->notifyRendererOfFramePending()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
+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;->performConfigurationChange(Landroid/util/MergedConfiguration;ZI)V
 HSPLandroid/view/ViewRootImpl;->performContentCaptureInitialReport()V
-HSPLandroid/view/ViewRootImpl;->performDraw(Landroid/window/SurfaceSyncGroup;)Z
-HSPLandroid/view/ViewRootImpl;->performLayout(Landroid/view/WindowManager$LayoutParams;II)V
-HSPLandroid/view/ViewRootImpl;->performMeasure(II)V
-HSPLandroid/view/ViewRootImpl;->performTraversals()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
+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
+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
-HSPLandroid/view/ViewRootImpl;->relayoutWindow(Landroid/view/WindowManager$LayoutParams;IZ)I
+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
@@ -18474,27 +18357,24 @@
 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
+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
+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
-HSPLandroid/view/ViewRootImpl;->setLayoutParams(Landroid/view/WindowManager$LayoutParams;Z)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;->setPreferredFrameRate(F)V
-HSPLandroid/view/ViewRootImpl;->setPreferredFrameRateCategory(I)V
 HSPLandroid/view/ViewRootImpl;->setTag()V
-HSPLandroid/view/ViewRootImpl;->setView(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;Landroid/view/View;I)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;->shouldEnableDvrr()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;
@@ -18502,14 +18382,13 @@
 HSPLandroid/view/ViewRootImpl;->systemGestureExclusionChanged()V
 HSPLandroid/view/ViewRootImpl;->unscheduleConsumeBatchedInput()V
 HSPLandroid/view/ViewRootImpl;->unscheduleTraversals()V
-HSPLandroid/view/ViewRootImpl;->updateBlastSurfaceIfNeeded()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;->updateColorModeIfNeeded(IF)V+]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/HdrRenderState;Landroid/view/HdrRenderState;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
 HSPLandroid/view/ViewRootImpl;->updateCompatSysUiVisibility(III)V
 HSPLandroid/view/ViewRootImpl;->updateCompatSystemUiVisibilityInfo(IIII)V
 HSPLandroid/view/ViewRootImpl;->updateConfiguration(I)V
-HSPLandroid/view/ViewRootImpl;->updateContentDrawBounds()Z
+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
@@ -18556,11 +18435,11 @@
 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
+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
-HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->start()Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;
+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
@@ -18578,7 +18457,7 @@
 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
+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
@@ -18627,7 +18506,7 @@
 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
+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
@@ -18701,18 +18580,17 @@
 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
-HSPLandroid/view/WindowLayout;->computeSurfaceSize(Landroid/view/WindowManager$LayoutParams;Landroid/graphics/Rect;IILandroid/graphics/Rect;ZLandroid/graphics/Point;)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
+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;->getDesiredHdrHeadroom()F
 HSPLandroid/view/WindowManager$LayoutParams;->getFitInsetsSides()I
 HSPLandroid/view/WindowManager$LayoutParams;->getFitInsetsTypes()I
 HSPLandroid/view/WindowManager$LayoutParams;->getTitle()Ljava/lang/CharSequence;
@@ -18725,7 +18603,7 @@
 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
+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
@@ -18738,7 +18616,7 @@
 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
+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;
@@ -18750,7 +18628,7 @@
 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
+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
@@ -18763,7 +18641,7 @@
 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
+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;
@@ -18789,7 +18667,7 @@
 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
+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
@@ -18827,10 +18705,6 @@
 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/FeatureFlagsImpl;-><init>()V
-HSPLandroid/view/accessibility/FeatureFlagsImpl;->forceInvertColor()Z
-HSPLandroid/view/accessibility/Flags;-><clinit>()V
-HSPLandroid/view/accessibility/Flags;->forceInvertColor()Z
 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
@@ -18949,7 +18823,7 @@
 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
+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
@@ -18968,7 +18842,7 @@
 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
+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
@@ -19014,19 +18888,12 @@
 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;->getAllowlistStringFromFlag()Ljava/lang/String;
 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;->isCredentialManagerEnabled()Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->isFillAndSaveDialogDisabledForCredentialManager()Z
 HSPLandroid/view/autofill/AutofillFeatureFlags;->isFillDialogEnabled()Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->isTriggerFillRequestOnFilteredImportantViewsEnabled()Z
 HSPLandroid/view/autofill/AutofillFeatureFlags;->isTriggerFillRequestOnUnimportantViewEnabled()Z
 HSPLandroid/view/autofill/AutofillFeatureFlags;->lambda$getFillDialogEnabledHints$1(Ljava/lang/String;)Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->shouldAlwaysIncludeWebviewInAssistStructure()Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->shouldEnableAutofillOnAllViewTypes()Z
-HSPLandroid/view/autofill/AutofillFeatureFlags;->shouldEnableMultilineFilter()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;
@@ -19225,7 +19092,6 @@
 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/flags/FeatureFlagsImpl;->enableSurfaceNativeAllocRegistrationRo()Z
 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
@@ -19259,8 +19125,6 @@
 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/FeatureFlagsImpl;-><init>()V
-HSPLandroid/view/inputmethod/Flags;-><clinit>()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;
@@ -19874,7 +19738,7 @@
 HSPLandroid/widget/EdgeEffect;->isAtEquilibrium()Z
 HSPLandroid/widget/EdgeEffect;->isFinished()Z
 HSPLandroid/widget/EdgeEffect;->onAbsorb(I)V
-HSPLandroid/widget/EdgeEffect;->onPull(FF)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
@@ -19947,7 +19811,7 @@
 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
+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
@@ -19956,7 +19820,7 @@
 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
+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
@@ -20021,7 +19885,7 @@
 HSPLandroid/widget/Editor;->onLocaleChanged()V
 HSPLandroid/widget/Editor;->onScreenStateChanged(I)V
 HSPLandroid/widget/Editor;->onScrollChanged()V
-HSPLandroid/widget/Editor;->onTouchEvent(Landroid/view/MotionEvent;)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;
@@ -20049,7 +19913,7 @@
 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
+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
@@ -20069,13 +19933,13 @@
 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
-HSPLandroid/widget/FrameLayout;->getPaddingLeftWithForeground()I
-HSPLandroid/widget/FrameLayout;->getPaddingRightWithForeground()I
-HSPLandroid/widget/FrameLayout;->getPaddingTopWithForeground()I
-HSPLandroid/widget/FrameLayout;->layoutChildren(IIIIZ)V
-HSPLandroid/widget/FrameLayout;->onLayout(ZIIII)V
-HSPLandroid/widget/FrameLayout;->onMeasure(II)V
+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
@@ -20172,7 +20036,7 @@
 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
+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
@@ -20213,7 +20077,7 @@
 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
+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
@@ -20250,20 +20114,20 @@
 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;
-HSPLandroid/widget/LinearLayout;->getVirtualChildCount()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
-HSPLandroid/widget/LinearLayout;->measureChildBeforeLayout(Landroid/view/View;IIIII)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
+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
-HSPLandroid/widget/LinearLayout;->onMeasure(II)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
+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
@@ -20317,7 +20181,7 @@
 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
+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
@@ -20336,7 +20200,7 @@
 HSPLandroid/widget/OverScroller;->abortAnimation()V
 HSPLandroid/widget/OverScroller;->computeScrollOffset()Z
 HSPLandroid/widget/OverScroller;->fling(IIIIIIII)V
-HSPLandroid/widget/OverScroller;->fling(IIIIIIIIII)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
@@ -20424,7 +20288,7 @@
 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
+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
@@ -20464,7 +20328,7 @@
 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;
+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
@@ -20473,7 +20337,7 @@
 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
+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
@@ -20488,7 +20352,7 @@
 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
+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
@@ -20507,14 +20371,14 @@
 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
+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
+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
@@ -20590,16 +20454,16 @@
 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
+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
-HSPLandroid/widget/ScrollBarDrawable;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V
-HSPLandroid/widget/ScrollBarDrawable;->isStateful()Z
-HSPLandroid/widget/ScrollBarDrawable;->mutate()Landroid/widget/ScrollBarDrawable;
+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
-HSPLandroid/widget/ScrollBarDrawable;->setAlpha(I)V
+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
@@ -20713,7 +20577,7 @@
 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;
+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
@@ -20733,8 +20597,8 @@
 HSPLandroid/widget/TextView;->compressText(F)Z
 HSPLandroid/widget/TextView;->computeHorizontalScrollRange()I
 HSPLandroid/widget/TextView;->computeScroll()V
-HSPLandroid/widget/TextView;->computeVerticalScrollExtent()I
-HSPLandroid/widget/TextView;->computeVerticalScrollRange()I
+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
@@ -20752,7 +20616,7 @@
 HSPLandroid/widget/TextView;->getBaseline()I
 HSPLandroid/widget/TextView;->getBaselineOffset()I
 HSPLandroid/widget/TextView;->getBottomVerticalOffset(Z)I
-HSPLandroid/widget/TextView;->getBoxHeight(Landroid/text/Layout;)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;
@@ -20765,12 +20629,12 @@
 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
+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
-HSPLandroid/widget/TextView;->getExtendedPaddingTop()I
+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
@@ -20802,7 +20666,7 @@
 HSPLandroid/widget/TextView;->getPaint()Landroid/text/TextPaint;
 HSPLandroid/widget/TextView;->getSelectionEnd()I
 HSPLandroid/widget/TextView;->getSelectionEndTransformed()I
-HSPLandroid/widget/TextView;->getSelectionStart()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;
@@ -20834,20 +20698,20 @@
 HSPLandroid/widget/TextView;->hideErrorIfUnchanged()V
 HSPLandroid/widget/TextView;->invalidateCursor()V
 HSPLandroid/widget/TextView;->invalidateCursorPath()V
-HSPLandroid/widget/TextView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)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
+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
+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
@@ -20856,8 +20720,8 @@
 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
-HSPLandroid/widget/TextView;->makeSingleLayout(ILandroid/text/BoringLayout$Metrics;ILandroid/text/Layout$Alignment;ZLandroid/text/TextUtils$TruncateAt;Z)Landroid/text/Layout;
+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
@@ -20869,7 +20733,7 @@
 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
+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
@@ -20880,7 +20744,7 @@
 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
+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
@@ -20897,7 +20761,7 @@
 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;
+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
@@ -21114,14 +20978,10 @@
 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$$ExternalSyntheticLambda4;-><init>(Landroid/window/SurfaceSyncGroup;Landroid/window/ITransactionReadyCallback;Ljava/util/function/Consumer;)V
-HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda4;->accept(Ljava/lang/Object;)V
 HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda5;->accept(Ljava/lang/Object;)V
-HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda6;->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;->$r8$lambda$RIGQSKCGL_wOT_BLp-LvudtYwpE(Landroid/window/SurfaceSyncGroup;Landroid/window/ITransactionReadyCallback;Ljava/util/function/Consumer;Landroid/view/SurfaceControl$Transaction;)V
 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;
@@ -21194,7 +21054,6 @@
 HSPLandroid/window/WindowOnBackInvokedDispatcher;->hasImeOnBackInvokedDispatcher()Z
 HSPLandroid/window/WindowOnBackInvokedDispatcher;->isOnBackInvokedCallbackEnabled()Z
 HSPLandroid/window/WindowOnBackInvokedDispatcher;->isOnBackInvokedCallbackEnabled(Landroid/content/Context;)Z
-HSPLandroid/window/WindowOnBackInvokedDispatcher;->isOnBackInvokedCallbackEnabled(Landroid/content/pm/ActivityInfo;Landroid/content/pm/ApplicationInfo;Ljava/util/function/Supplier;)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
@@ -21206,10 +21065,6 @@
 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/graphics/hwui/flags/FeatureFlagsImpl;-><init>()V
-HSPLcom/android/graphics/hwui/flags/FeatureFlagsImpl;->animateHdrTransitions()Z
-HSPLcom/android/graphics/hwui/flags/Flags;-><clinit>()V
-HSPLcom/android/graphics/hwui/flags/Flags;->animateHdrTransitions()Z
 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
@@ -21381,7 +21236,7 @@
 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
+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
@@ -21430,16 +21285,16 @@
 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;
-HSPLcom/android/icu/charset/CharsetEncoderICU;->getArray(Ljava/nio/ByteBuffer;)I
-HSPLcom/android/icu/charset/CharsetEncoderICU;->getArray(Ljava/nio/CharBuffer;)I
+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
+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;
@@ -21559,13 +21414,13 @@
 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
+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
-HSPLcom/android/internal/compat/ChangeReporter;->markAsReported(ILcom/android/internal/compat/ChangeReporter$ChangeReport;)V
-HSPLcom/android/internal/compat/ChangeReporter;->reportChange(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;
@@ -21575,13 +21430,8 @@
 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$MassState;-><init>()V
 HSPLcom/android/internal/dynamicanimation/animation/DynamicAnimation;-><init>(Ljava/lang/Object;Landroid/util/FloatProperty;)V
-HSPLcom/android/internal/dynamicanimation/animation/SpringAnimation;-><init>(Ljava/lang/Object;Landroid/util/FloatProperty;)V
-HSPLcom/android/internal/dynamicanimation/animation/SpringAnimation;->setSpring(Lcom/android/internal/dynamicanimation/animation/SpringForce;)Lcom/android/internal/dynamicanimation/animation/SpringAnimation;
 HSPLcom/android/internal/dynamicanimation/animation/SpringForce;-><init>()V
-HSPLcom/android/internal/dynamicanimation/animation/SpringForce;->setDampingRatio(F)Lcom/android/internal/dynamicanimation/animation/SpringForce;
-HSPLcom/android/internal/dynamicanimation/animation/SpringForce;->setStiffness(F)Lcom/android/internal/dynamicanimation/animation/SpringForce;
 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
@@ -21939,12 +21789,11 @@
 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;
+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$$ExternalSyntheticLambda1;-><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
@@ -21952,8 +21801,8 @@
 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
-HSPLcom/android/internal/policy/DecorView;->calculateStatusBarColor(I)I
+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
@@ -21970,9 +21819,9 @@
 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;
-HSPLcom/android/internal/policy/DecorView;->getTitleSuffix(Landroid/view/WindowManager$LayoutParams;)Ljava/lang/String;
-HSPLcom/android/internal/policy/DecorView;->getWindowInsetsController()Landroid/view/WindowInsetsController;
+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
@@ -21984,10 +21833,10 @@
 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
+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
+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
@@ -22002,7 +21851,7 @@
 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
+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
@@ -22010,13 +21859,13 @@
 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
-HSPLcom/android/internal/policy/DecorView;->updateColorViewInt(Lcom/android/internal/policy/DecorView$ColorViewState;IIIZZIZZI)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;
+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
-HSPLcom/android/internal/policy/DecorView;->updateLogTag(Landroid/view/WindowManager$LayoutParams;)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;
@@ -22050,7 +21899,7 @@
 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
+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;
@@ -22066,7 +21915,6 @@
 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;->isEdgeToEdgeEnforced(Landroid/content/pm/ApplicationInfo;ZLandroid/content/res/TypedArray;)Z
 HSPLcom/android/internal/policy/PhoneWindow;->isFloating()Z
 HSPLcom/android/internal/policy/PhoneWindow;->isShowingWallpaper()Z
 HSPLcom/android/internal/policy/PhoneWindow;->isTranslucent()Z
@@ -22082,7 +21930,7 @@
 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
+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
@@ -22102,7 +21950,6 @@
 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/policy/WearGestureInterceptionDetector;->isEnabled(Landroid/content/Context;)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
@@ -22242,7 +22089,7 @@
 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;
+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;
@@ -22250,14 +22097,14 @@
 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;
+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
+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
+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;
+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
@@ -22298,14 +22145,14 @@
 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
+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
+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;
@@ -22326,12 +22173,12 @@
 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;[Ljava/lang/Object;]Ljava/lang/Class;Ljava/lang/Class;
+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;
+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;
@@ -22476,10 +22323,10 @@
 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;
-HSPLcom/android/internal/util/XmlUtils;->readThisPrimitiveValueXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;)Ljava/lang/Object;
+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/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
+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
@@ -22488,7 +22335,7 @@
 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
+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;
@@ -22569,7 +22416,7 @@
 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
+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
@@ -22588,7 +22435,7 @@
 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;
+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
@@ -22957,7 +22804,7 @@
 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+]Lcom/android/okhttp/internal/http/Http1xStream$FixedLengthSource;Lcom/android/okhttp/internal/http/Http1xStream$FixedLengthSource;]Lcom/android/okhttp/okio/BufferedSource;Lcom/android/okhttp/okio/RealBufferedSource;
+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
@@ -23200,7 +23047,7 @@
 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+]Ljava/lang/Object;Ljava/lang/Class;
+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
@@ -23211,7 +23058,7 @@
 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+]Lcom/android/okhttp/okio/Segment;Lcom/android/okhttp/okio/Segment;
+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
@@ -23226,9 +23073,9 @@
 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+]Lcom/android/okhttp/okio/Segment;Lcom/android/okhttp/okio/Segment;
+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+]Lcom/android/okhttp/okio/Segment;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;
@@ -23249,17 +23096,17 @@
 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+]Ljava/util/zip/CRC32;Ljava/util/zip/CRC32;
+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+]Lcom/android/okhttp/okio/InflaterSource;Lcom/android/okhttp/okio/InflaterSource;]Lcom/android/okhttp/okio/Segment;Lcom/android/okhttp/okio/Segment;]Lcom/android/okhttp/okio/Buffer;Lcom/android/okhttp/okio/Buffer;]Ljava/util/zip/Inflater;Ljava/util/zip/Inflater;
-HSPLcom/android/okhttp/okio/InflaterSource;->refill()Z+]Lcom/android/okhttp/okio/BufferedSource;Lcom/android/okhttp/okio/RealBufferedSource;]Ljava/util/zip/Inflater;Ljava/util/zip/Inflater;
+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+]Lcom/android/okhttp/okio/Buffer;Lcom/android/okhttp/okio/Buffer;]Lcom/android/okhttp/okio/Timeout;Lcom/android/okhttp/okio/Okio$3;
+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
@@ -23291,17 +23138,17 @@
 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+]Lcom/android/okhttp/okio/Buffer;Lcom/android/okhttp/okio/Buffer;]Lcom/android/okhttp/okio/Source;Lcom/android/okhttp/okio/GzipSource;
+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+]Lcom/android/okhttp/okio/Buffer;Lcom/android/okhttp/okio/Buffer;]Lcom/android/okhttp/okio/Source;Lcom/android/okhttp/okio/RealBufferedSource;
+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+]Lcom/android/okhttp/okio/Buffer;Lcom/android/okhttp/okio/Buffer;]Lcom/android/okhttp/okio/Source;Lcom/android/okhttp/internal/http/Http1xStream$FixedLengthSource;,Lcom/android/okhttp/okio/AsyncTimeout$2;
+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
@@ -23344,7 +23191,6 @@
 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;->readTagNumber(Ljava/io/InputStream;I)I
 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
@@ -23364,6 +23210,7 @@
 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
@@ -23398,7 +23245,6 @@
 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/LimitedInputStream;-><init>(Ljava/io/InputStream;I)V
 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;
@@ -23407,14 +23253,13 @@
 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/PBEParametersGenerator;->init([B[BI)V
 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+]Ljava/security/MessageDigest;Ljava/security/MessageDigest$Delegate;
+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
@@ -23443,13 +23288,13 @@
 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/paddings/PaddedBufferedBlockCipher;->processBytes([BII[BI)I
 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
@@ -23464,6 +23309,7 @@
 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
@@ -23471,7 +23317,6 @@
 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$BufferedGenericBlockCipher;->processBytes([BII[BI)I
 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
@@ -23480,6 +23325,10 @@
 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
@@ -23493,10 +23342,10 @@
 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+]Ljava/lang/String;Ljava/lang/String;]Lcom/android/org/kxml2/io/KXmlParser;Lcom/android/org/kxml2/io/KXmlParser;
+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+]Ljava/io/Reader;Ljava/io/InputStreamReader;
+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;
@@ -23512,7 +23361,7 @@
 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+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -23523,9 +23372,9 @@
 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;+]Llibcore/internal/StringPool;Llibcore/internal/StringPool;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Llibcore/internal/StringPool;Llibcore/internal/StringPool;
+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
@@ -23553,25 +23402,11 @@
 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/FeatureFlagsImpl;->fixLineHeightForLocale()Z
-HSPLcom/android/text/flags/FeatureFlagsImpl;->icuBidiMigration()Z
-HSPLcom/android/text/flags/FeatureFlagsImpl;->insertModeNotUpdateSelection()Z
-HSPLcom/android/text/flags/FeatureFlagsImpl;->noBreakNoHyphenationSpan()Z
-HSPLcom/android/text/flags/FeatureFlagsImpl;->phraseStrictFallback()Z
-HSPLcom/android/text/flags/FeatureFlagsImpl;->useBoundsForWidth()Z
 HSPLcom/android/text/flags/Flags;-><clinit>()V
-HSPLcom/android/text/flags/Flags;->fixLineHeightForLocale()Z
-HSPLcom/android/text/flags/Flags;->icuBidiMigration()Z
-HSPLcom/android/text/flags/Flags;->insertModeNotUpdateSelection()Z+]Lcom/android/text/flags/FeatureFlags;Lcom/android/text/flags/FeatureFlagsImpl;
-HSPLcom/android/text/flags/Flags;->noBreakNoHyphenationSpan()Z
-HSPLcom/android/text/flags/Flags;->phraseStrictFallback()Z
-HSPLcom/android/text/flags/Flags;->useBoundsForWidth()Z
 HSPLcom/android/window/flags/FeatureFlagsImpl;-><init>()V
 HSPLcom/android/window/flags/FeatureFlagsImpl;->bundleClientTransactionFlag()Z
-HSPLcom/android/window/flags/FeatureFlagsImpl;->enforceEdgeToEdge()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/android/window/flags/Flags;->enforceEdgeToEdge()Z
 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;
@@ -23608,7 +23443,7 @@
 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;+]Ljava/lang/ThreadLocal;Ldalvik/system/BlockGuard$3;
+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
@@ -23616,11 +23451,11 @@
 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+]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard;
-HSPLdalvik/system/CloseGuard;->openWithCallSite(Ljava/lang/String;Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+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+]Ldalvik/system/CloseGuard$Reporter;Landroid/os/StrictMode$AndroidCloseGuardReporter;
+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;
@@ -23678,7 +23513,7 @@
 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+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
+HSPLdalvik/system/VMRuntime;->notifyNativeAllocation()V
 HSPLdalvik/system/VMRuntime;->registerNativeAllocation(I)V
 HSPLdalvik/system/VMRuntime;->registerNativeFree(I)V
 HSPLdalvik/system/VMRuntime;->runFinalization(J)V
@@ -23739,8 +23574,8 @@
 HSPLjava/io/BufferedReader;->read()I
 HSPLjava/io/BufferedReader;->read([CII)I
 HSPLjava/io/BufferedReader;->read1([CII)I
-HSPLjava/io/BufferedReader;->readLine()Ljava/lang/String;+]Ljava/io/BufferedReader;Ljava/io/BufferedReader;
-HSPLjava/io/BufferedReader;->readLine(Z)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+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
@@ -23786,22 +23621,21 @@
 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+]Ljava/io/InputStream;Ljava/io/BufferedInputStream;
-HSPLjava/io/DataInputStream;->readByte()B+]Ljava/io/InputStream;Ljava/io/BufferedInputStream;,Ljava/io/ByteArrayInputStream;
+HSPLjava/io/DataInputStream;->readBoolean()Z
+HSPLjava/io/DataInputStream;->readByte()B
 HSPLjava/io/DataInputStream;->readFully([B)V
-HSPLjava/io/DataInputStream;->readFully([BII)V+]Ljava/io/InputStream;Ljava/io/BufferedInputStream;,Ljava/io/FileInputStream;,Ljava/io/ByteArrayInputStream;,Ljava/io/ObjectInputStream$BlockDataInputStream;,Landroid/content/res/AssetFileDescriptor$AutoCloseInputStream;
-HSPLjava/io/DataInputStream;->readInt()I+]Ljava/io/DataInputStream;Ljava/io/DataInputStream;
+HSPLjava/io/DataInputStream;->readFully([BII)V
+HSPLjava/io/DataInputStream;->readInt()I
 HSPLjava/io/DataInputStream;->readLong()J
-HSPLjava/io/DataInputStream;->readShort()S+]Ljava/io/DataInputStream;Ljava/io/DataInputStream;
+HSPLjava/io/DataInputStream;->readShort()S
 HSPLjava/io/DataInputStream;->readUTF()Ljava/lang/String;
-HSPLjava/io/DataInputStream;->readUTF(Ljava/io/DataInput;)Ljava/lang/String;+]Ljava/io/DataInput;Ljava/io/DataInputStream;
+HSPLjava/io/DataInputStream;->readUTF(Ljava/io/DataInput;)Ljava/lang/String;
 HSPLjava/io/DataInputStream;->readUnsignedByte()I
-HSPLjava/io/DataInputStream;->readUnsignedShort()I+]Ljava/io/DataInputStream;Ljava/io/DataInputStream;
+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;->size()I
 HSPLjava/io/DataOutputStream;->write(I)V
 HSPLjava/io/DataOutputStream;->write([BII)V
 HSPLjava/io/DataOutputStream;->writeBoolean(Z)V
@@ -23810,12 +23644,12 @@
 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+]Ljava/lang/String;Ljava/lang/String;]Ljava/io/DataOutput;Ljava/io/DataOutputStream;
+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+]Ljava/lang/String;Ljava/lang/String;]Ljava/io/FileSystem;Ljava/io/UnixFileSystem;
+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
@@ -23889,11 +23723,11 @@
 HSPLjava/io/FileInputStream;->getFD()Ljava/io/FileDescriptor;
 HSPLjava/io/FileInputStream;->read()I
 HSPLjava/io/FileInputStream;->read([B)I
-HSPLjava/io/FileInputStream;->read([BII)I+]Llibcore/io/IoTracker;Llibcore/io/IoTracker;
+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+]Ljava/io/File;Ljava/io/File;]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard;
+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
@@ -23904,19 +23738,19 @@
 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+]Llibcore/io/IoTracker;Llibcore/io/IoTracker;
+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+]Ljava/io/InputStream;Ljava/io/FileInputStream;
+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+]Ljava/io/InputStream;Ljava/io/BufferedInputStream;,Ljava/io/PushbackInputStream;,Ljava/io/ByteArrayInputStream;,Ljava/util/zip/ZipFile$ZipFileInflaterInputStream;
-HSPLjava/io/FilterInputStream;->read([B)I+]Ljava/io/FilterInputStream;Ljava/util/zip/ZipInputStream;
-HSPLjava/io/FilterInputStream;->read([BII)I+]Ljava/io/InputStream;Ljava/io/BufferedInputStream;,Ljava/io/FileInputStream;
+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
@@ -23933,7 +23767,7 @@
 HSPLjava/io/InputStream;->available()I
 HSPLjava/io/InputStream;->close()V
 HSPLjava/io/InputStream;->markSupported()Z
-HSPLjava/io/InputStream;->read([B)I+]Ljava/io/InputStream;missing_types
+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
@@ -23949,25 +23783,25 @@
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->close()V
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->currentBlockRemaining()I
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->getBlockDataMode()Z
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->peek()I+]Ljava/io/ObjectInputStream$PeekInputStream;Ljava/io/ObjectInputStream$PeekInputStream;
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->peekByte()B+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->read()I+]Ljava/io/ObjectInputStream$PeekInputStream;Ljava/io/ObjectInputStream$PeekInputStream;
+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+]Ljava/io/ObjectInputStream$PeekInputStream;Ljava/io/ObjectInputStream$PeekInputStream;
+HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readBlockHeader(Z)I
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readBoolean()Z
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readByte()B+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;
+HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readByte()B
 HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readFloat()F
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readFully([BIIZ)V+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readInt()I+]Ljava/io/ObjectInputStream$PeekInputStream;Ljava/io/ObjectInputStream$PeekInputStream;]Ljava/io/DataInputStream;Ljava/io/DataInputStream;
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readLong()J+]Ljava/io/ObjectInputStream$PeekInputStream;Ljava/io/ObjectInputStream$PeekInputStream;
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readShort()S+]Ljava/io/ObjectInputStream$PeekInputStream;Ljava/io/ObjectInputStream$PeekInputStream;]Ljava/io/DataInputStream;Ljava/io/DataInputStream;
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readUTF()Ljava/lang/String;+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readUTFBody(J)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/io/ObjectInputStream$PeekInputStream;Ljava/io/ObjectInputStream$PeekInputStream;
+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+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->readUnsignedShort()I+]Ljava/io/ObjectInputStream$PeekInputStream;Ljava/io/ObjectInputStream$PeekInputStream;
-HSPLjava/io/ObjectInputStream$BlockDataInputStream;->refill()V+]Ljava/io/ObjectInputStream$PeekInputStream;Ljava/io/ObjectInputStream$PeekInputStream;
+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
@@ -23975,10 +23809,10 @@
 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;+]Ljava/io/ObjectInputStream$HandleTable;Ljava/io/ObjectInputStream$HandleTable;
+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+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;]Ljava/io/ObjectStreamClass;Ljava/io/ObjectStreamClass;]Ljava/io/ObjectStreamField;Ljava/io/ObjectStreamField;
+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
@@ -23993,14 +23827,14 @@
 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+]Ljava/io/InputStream;Ljava/io/ByteArrayInputStream;,Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection$1;,Landroid/content/res/AssetManager$AssetInputStream;
-HSPLjava/io/ObjectInputStream$PeekInputStream;->read()I+]Ljava/io/InputStream;Ljava/io/ByteArrayInputStream;
-HSPLjava/io/ObjectInputStream$PeekInputStream;->read([BII)I+]Ljava/io/InputStream;Ljava/io/ByteArrayInputStream;,Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection$1;,Landroid/content/res/AssetManager$AssetInputStream;
-HSPLjava/io/ObjectInputStream$PeekInputStream;->readFully([BII)V+]Ljava/io/ObjectInputStream$PeekInputStream;Ljava/io/ObjectInputStream$PeekInputStream;
+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+]Ljava/io/ObjectInputStream;Ljava/io/ObjectInputStream;,Landroid/os/Parcel$2;]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;
+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
@@ -24010,46 +23844,46 @@
 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+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;
-HSPLjava/io/ObjectInputStream;->readClassDesc(Z)Ljava/io/ObjectStreamClass;+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;
+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;+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;]Ljava/io/ObjectInputStream$HandleTable;Ljava/io/ObjectInputStream$HandleTable;
+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;+]Ljava/io/ObjectInputStream;Landroid/os/Parcel$2;]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;]Ljava/io/ObjectStreamClass;Ljava/io/ObjectStreamClass;]Ljava/io/ObjectInputStream$HandleTable;Ljava/io/ObjectInputStream$HandleTable;
+HSPLjava/io/ObjectInputStream;->readNonProxyDesc(Z)Ljava/io/ObjectStreamClass;
 HSPLjava/io/ObjectInputStream;->readNull()Ljava/lang/Object;
-HSPLjava/io/ObjectInputStream;->readObject()Ljava/lang/Object;+]Ljava/io/ObjectInputStream$ValidationList;Ljava/io/ObjectInputStream$ValidationList;]Ljava/io/ObjectInputStream$HandleTable;Ljava/io/ObjectInputStream$HandleTable;
-HSPLjava/io/ObjectInputStream;->readObject0(Z)Ljava/lang/Object;+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;
-HSPLjava/io/ObjectInputStream;->readOrdinaryObject(Z)Ljava/lang/Object;+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;]Ljava/io/ObjectStreamClass;Ljava/io/ObjectStreamClass;]Ljava/io/ObjectInputStream$HandleTable;Ljava/io/ObjectInputStream$HandleTable;
-HSPLjava/io/ObjectInputStream;->readSerialData(Ljava/lang/Object;Ljava/io/ObjectStreamClass;)V+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;]Ljava/io/ObjectStreamClass;Ljava/io/ObjectStreamClass;]Ljava/io/ObjectInputStream$HandleTable;Ljava/io/ObjectInputStream$HandleTable;]Ljava/io/SerialCallbackContext;Ljava/io/SerialCallbackContext;
+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;+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;]Ljava/io/ObjectInputStream$HandleTable;Ljava/io/ObjectInputStream$HandleTable;
+HSPLjava/io/ObjectInputStream;->readString(Z)Ljava/lang/String;
 HSPLjava/io/ObjectInputStream;->readTypeString()Ljava/lang/String;
-HSPLjava/io/ObjectInputStream;->readUTF()Ljava/lang/String;+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;
+HSPLjava/io/ObjectInputStream;->readUTF()Ljava/lang/String;
 HSPLjava/io/ObjectInputStream;->resolveClass(Ljava/io/ObjectStreamClass;)Ljava/lang/Class;
-HSPLjava/io/ObjectInputStream;->skipCustomData()V+]Ljava/io/ObjectInputStream$BlockDataInputStream;Ljava/io/ObjectInputStream$BlockDataInputStream;
+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+]Ljava/io/OutputStream;Ljava/io/ByteArrayOutputStream;
+HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->drain()V
 HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->flush()V
-HSPLjava/io/ObjectOutputStream$BlockDataOutputStream;->getUTFLength(Ljava/lang/String;)J+]Ljava/lang/String;Ljava/lang/String;
+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+]Ljava/lang/String;Ljava/lang/String;
+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+]Ljava/lang/String;Ljava/lang/String;]Ljava/io/ObjectOutputStream$BlockDataOutputStream;Ljava/io/ObjectOutputStream$BlockDataOutputStream;
+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
@@ -24073,7 +23907,7 @@
 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+]Ljava/io/ObjectStreamClass;Ljava/io/ObjectStreamClass;]Ljava/io/ObjectStreamField;Ljava/io/ObjectStreamField;]Ljava/io/ObjectOutputStream$BlockDataOutputStream;Ljava/io/ObjectOutputStream$BlockDataOutputStream;]Ljava/lang/Class;Ljava/lang/Class;
+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
@@ -24092,8 +23926,8 @@
 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+]Ljava/io/ObjectOutputStream$ReplaceTable;Ljava/io/ObjectOutputStream$ReplaceTable;]Ljava/lang/Object;megamorphic_types]Ljava/io/ObjectOutputStream$HandleTable;Ljava/io/ObjectOutputStream$HandleTable;]Ljava/io/ObjectStreamClass;Ljava/io/ObjectStreamClass;]Ljava/io/ObjectOutputStream$BlockDataOutputStream;Ljava/io/ObjectOutputStream$BlockDataOutputStream;]Ljava/lang/Class;Ljava/lang/Class;
-HSPLjava/io/ObjectOutputStream;->writeOrdinaryObject(Ljava/lang/Object;Ljava/io/ObjectStreamClass;Z)V+]Ljava/io/ObjectOutputStream$HandleTable;Ljava/io/ObjectOutputStream$HandleTable;]Ljava/io/ObjectStreamClass;Ljava/io/ObjectStreamClass;]Ljava/io/ObjectOutputStream$BlockDataOutputStream;Ljava/io/ObjectOutputStream$BlockDataOutputStream;
+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
@@ -24130,7 +23964,7 @@
 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+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;]Ljava/io/ObjectStreamField;Ljava/io/ObjectStreamField;
+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
@@ -24164,15 +23998,15 @@
 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+]Ljava/io/ObjectStreamField;Ljava/io/ObjectStreamField;
+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;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/HashSet;Ljava/util/HashSet;]Ljava/lang/Class;Ljava/lang/Class;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+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;+]Ljava/lang/String;Ljava/lang/String;]Ljava/io/ObjectStreamField;Ljava/io/ObjectStreamField;]Ljava/lang/Class;Ljava/lang/Class;
+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;
@@ -24186,7 +24020,7 @@
 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+]Ljava/lang/Long;Ljava/lang/Long;
+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;
@@ -24195,7 +24029,7 @@
 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+]Ljava/io/ObjectStreamClass$FieldReflector;Ljava/io/ObjectStreamClass$FieldReflector;]Ljava/io/ObjectStreamClass;Ljava/io/ObjectStreamClass;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/lang/Class;Ljava/lang/Class;
+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
@@ -24205,28 +24039,30 @@
 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;+]Ljava/lang/ref/Reference;Ljava/lang/ref/SoftReference;]Ljava/util/concurrent/ConcurrentMap;Ljava/util/concurrent/ConcurrentHashMap;]Ljava/io/ObjectStreamClass$EntryFuture;Ljava/io/ObjectStreamClass$EntryFuture;]Ljava/lang/Class;Ljava/lang/Class;
+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+]Ljava/lang/ref/ReferenceQueue;Ljava/lang/ref/ReferenceQueue;
-HSPLjava/io/ObjectStreamClass;->readNonProxy(Ljava/io/ObjectInputStream;)V+]Ljava/io/ObjectInputStream;Landroid/os/Parcel$2;
+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+]Ljava/lang/String;Ljava/lang/String;
+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+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/io/ObjectStreamField;->getTypeCode()C
 HSPLjava/io/ObjectStreamField;->getTypeString()Ljava/lang/String;
 HSPLjava/io/ObjectStreamField;->isPrimitive()Z
 HSPLjava/io/ObjectStreamField;->isUnshared()Z
@@ -24288,6 +24124,7 @@
 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
@@ -24296,15 +24133,15 @@
 HSPLjava/io/RandomAccessFile;->getFilePointer()J
 HSPLjava/io/RandomAccessFile;->length()J
 HSPLjava/io/RandomAccessFile;->maybeSync()V
-HSPLjava/io/RandomAccessFile;->read()I+]Ljava/io/RandomAccessFile;Ljava/io/RandomAccessFile;
+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+]Llibcore/io/IoTracker;Llibcore/io/IoTracker;
+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;+]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;]Ljava/io/RandomAccessFile;Ljava/io/RandomAccessFile;
+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
@@ -24332,7 +24169,7 @@
 HSPLjava/io/StringReader;->close()V
 HSPLjava/io/StringReader;->ensureOpen()V
 HSPLjava/io/StringReader;->read()I
-HSPLjava/io/StringReader;->read([CII)I+]Ljava/lang/String;Ljava/lang/String;
+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;
@@ -24361,11 +24198,11 @@
 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;+]Ljava/lang/String;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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;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
@@ -24374,23 +24211,23 @@
 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;+]Ljava/lang/AbstractStringBuilder;Ljava/lang/StringBuilder;,Ljava/lang/StringBuffer;
+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;+]Ljava/lang/AbstractStringBuilder;Ljava/lang/StringBuilder;,Ljava/lang/StringBuffer;
+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;+]Ljava/lang/AbstractStringBuilder;Ljava/lang/StringBuilder;,Ljava/lang/StringBuffer;
-HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/CharSequence;)Ljava/lang/AbstractStringBuilder;+]Ljava/lang/CharSequence;Landroid/icu/impl/FormattedStringBuilder;,Ljava/nio/HeapCharBuffer;]Ljava/lang/AbstractStringBuilder;Ljava/lang/StringBuilder;,Ljava/lang/StringBuffer;
-HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/CharSequence;II)Ljava/lang/AbstractStringBuilder;+]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/icu/impl/FormattedStringBuilder;,Ljava/nio/HeapCharBuffer;
-HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;+]Ljava/lang/String;Ljava/lang/String;
+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+]Ljava/lang/CharSequence;Ljava/lang/String;,Ljava/nio/HeapCharBuffer;,Landroid/icu/impl/FormattedStringBuilder;]Ljava/lang/AbstractStringBuilder;Ljava/lang/StringBuilder;,Ljava/lang/StringBuffer;
-HSPLjava/lang/AbstractStringBuilder;->appendChars([CII)V+]Ljava/lang/AbstractStringBuilder;Ljava/lang/StringBuilder;,Ljava/lang/StringBuffer;
+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+]Ljava/lang/AbstractStringBuilder;Ljava/lang/StringBuilder;,Ljava/lang/StringBuffer;
+HSPLjava/lang/AbstractStringBuilder;->charAt(I)C
 HSPLjava/lang/AbstractStringBuilder;->checkRange(III)V
 HSPLjava/lang/AbstractStringBuilder;->checkRangeSIOOBE(III)V
 HSPLjava/lang/AbstractStringBuilder;->codePointAt(I)I
@@ -24403,6 +24240,7 @@
 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;
@@ -24410,7 +24248,7 @@
 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+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/AbstractStringBuilder;Ljava/lang/StringBuilder;,Ljava/lang/StringBuffer;
+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
@@ -24452,8 +24290,8 @@
 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;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/Locale;Ljava/util/Locale;
-HSPLjava/lang/CaseMapper;->toUpperCase(Ljava/util/Locale;Ljava/lang/String;I)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/Locale;Ljava/util/Locale;
+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
@@ -24467,7 +24305,7 @@
 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+]Ljava/lang/Character;Ljava/lang/Character;
+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
@@ -24516,7 +24354,7 @@
 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+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/Class;Ljava/lang/Class;
+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;
@@ -24524,7 +24362,7 @@
 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;+]Ljava/lang/Class;Ljava/lang/Class;
+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;
@@ -24532,7 +24370,7 @@
 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;+]Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;]Ljava/lang/Class;Ljava/lang/Class;
+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;
@@ -24540,7 +24378,7 @@
 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;+]Llibcore/reflect/GenericSignatureParser;Llibcore/reflect/GenericSignatureParser;]Ljava/lang/Class;Ljava/lang/Class;
+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;
@@ -24554,17 +24392,17 @@
 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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLjava/lang/Class;->getSignatureAttribute()Ljava/lang/String;
 HSPLjava/lang/Class;->getSimpleName()Ljava/lang/String;
-HSPLjava/lang/Class;->getSuperclass()Ljava/lang/Class;+]Ljava/lang/Class;Ljava/lang/Class;
+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+]Ljava/lang/Class;Ljava/lang/Class;
-HSPLjava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z+]Ljava/lang/Class;Ljava/lang/Class;
+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+]Ljava/lang/Class;Ljava/lang/Class;]Ljava/lang/Object;megamorphic_types
+HSPLjava/lang/Class;->isInstance(Ljava/lang/Object;)Z
 HSPLjava/lang/Class;->isInterface()Z
 HSPLjava/lang/Class;->isLocalClass()Z
 HSPLjava/lang/Class;->isLocalOrAnonymousClass()Z
@@ -24576,7 +24414,9 @@
 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;
@@ -24590,16 +24430,16 @@
 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/ClassNotFoundException;->getCause()Ljava/lang/Throwable;
 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+]Ljava/lang/Object;missing_types]Ljava/lang/ref/FinalizerReference;Ljava/lang/ref/FinalizerReference;
-HSPLjava/lang/Daemons$FinalizerDaemon;->processReference(Ljava/lang/Object;)V+]Ljava/lang/ref/FinalizerReference;Ljava/lang/ref/FinalizerReference;
+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
@@ -24617,6 +24457,9 @@
 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
@@ -24647,7 +24490,7 @@
 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;+]Ljava/lang/Class;Ljava/lang/Class;
+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;
@@ -24697,11 +24540,11 @@
 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+]Ljava/lang/Integer;Ljava/lang/Integer;
+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+]Ljava/lang/Integer;Ljava/lang/Integer;
+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
@@ -24720,7 +24563,7 @@
 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+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -24740,18 +24583,18 @@
 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;missing_types]Ljava/util/function/Consumer;missing_types]Ljava/util/Iterator;Ljava/util/HashMap$KeyIterator;,Ljava/util/AbstractList$Itr;,Ljava/util/WeakHashMap$KeyIterator;,Ljava/util/ImmutableCollections$ListItr;
+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+]Ljava/lang/Long;Ljava/lang/Long;
+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+]Ljava/lang/Long;Ljava/lang/Long;
+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
@@ -24765,9 +24608,9 @@
 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+]Ljava/lang/CharSequence;Ljava/lang/String;
+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+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -24845,7 +24688,7 @@
 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+]Ljava/lang/Object;missing_types
+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
@@ -24898,7 +24741,7 @@
 HSPLjava/lang/StackTraceElement;->getMethodName()Ljava/lang/String;
 HSPLjava/lang/StackTraceElement;->hashCode()I
 HSPLjava/lang/StackTraceElement;->isNativeMethod()Z
-HSPLjava/lang/StackTraceElement;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/StackTraceElement;Ljava/lang/StackTraceElement;
+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
@@ -24908,66 +24751,66 @@
 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+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/String;->compareTo(Ljava/lang/Object;)I
 HSPLjava/lang/String;->compareToIgnoreCase(Ljava/lang/String;)I
-HSPLjava/lang/String;->contains(Ljava/lang/CharSequence;)Z+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/CharSequence;Ljava/lang/String;
+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+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->equals(Ljava/lang/Object;)Z+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z+]Ljava/lang/String;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+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->getChars(II[CI)V+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/String;->getBytes([BIB)V
+HSPLjava/lang/String;->getChars(II[CI)V
 HSPLjava/lang/String;->getChars([CI)V
-HSPLjava/lang/String;->hashCode()I+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->indexOf(I)I+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->indexOf(II)I+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->indexOf(Ljava/lang/String;)I+]Ljava/lang/String;Ljava/lang/String;
+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+]Ljava/lang/String;Ljava/lang/String;
+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+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->lastIndexOf(II)I+]Ljava/lang/String;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+]Ljava/lang/String;Ljava/lang/String;
+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;+]Ljava/lang/String;Ljava/lang/String;
+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+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->startsWith(Ljava/lang/String;I)Z+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->subSequence(II)Ljava/lang/CharSequence;+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->substring(I)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->substring(II)Ljava/lang/String;+]Ljava/lang/String;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;+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->trim()Ljava/lang/String;+]Ljava/lang/String;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;+]Ljava/lang/Object;missing_types
+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
@@ -24976,10 +24819,11 @@
 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;+]Ljava/lang/StringBuffer;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;+]Ljava/lang/StringBuffer;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;
@@ -24993,25 +24837,25 @@
 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;+]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;
+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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+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;+]Ljava/lang/StringBuilder;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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;+]Ljava/lang/StringBuilder;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;
@@ -25037,31 +24881,34 @@
 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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+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;+]Ljava/lang/String;Ljava/lang/String;]Ljava/nio/charset/Charset;Lcom/android/icu/charset/CharsetICU;
+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+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -25076,7 +24923,7 @@
 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;+]Ljava/util/Properties;Ljava/lang/System$PropertiesWithNonOverrideableDefaults;
+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
@@ -25158,24 +25005,24 @@
 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+]Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
+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;+]Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->getEntryAfterMiss(Ljava/lang/ThreadLocal;ILjava/lang/ThreadLocal$ThreadLocalMap$Entry;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;+]Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
+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+]Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
+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;+]Ljava/lang/ThreadLocal;megamorphic_types
+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
@@ -25192,7 +25039,7 @@
 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+]Ljava/lang/Throwable;megamorphic_types
+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
@@ -25237,6 +25084,7 @@
 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
@@ -25293,6 +25141,9 @@
 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
@@ -25315,7 +25166,7 @@
 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+]Ljava/lang/Object;Ljava/lang/Object;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;]Lsun/misc/Cleaner;Lsun/misc/Cleaner;
+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;
@@ -25332,7 +25183,7 @@
 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;+]Ljava/lang/Class;Ljava/lang/Class;
+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
@@ -25394,10 +25245,10 @@
 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;+]Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;
+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;+]Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;
+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
@@ -25511,7 +25362,7 @@
 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;+]Ljava/math/BigInteger;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
@@ -25530,7 +25381,7 @@
 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;+]Ljava/math/BigInteger;Ljava/math/BigInteger;
+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;
@@ -25540,7 +25391,7 @@
 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;+]Ljava/math/MutableBigInteger;Ljava/math/MutableBigInteger;
+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
@@ -25551,10 +25402,10 @@
 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;+]Ljava/math/BigInteger;Ljava/math/BigInteger;
+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+]Ljava/math/BigInteger;Ljava/math/BigInteger;
+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
@@ -25574,9 +25425,9 @@
 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;+]Ljava/math/MutableBigInteger;Ljava/math/MutableBigInteger;
-HSPLjava/math/MutableBigInteger;->divideKnuth(Ljava/math/MutableBigInteger;Ljava/math/MutableBigInteger;Z)Ljava/math/MutableBigInteger;+]Ljava/math/MutableBigInteger;Ljava/math/SignedMutableBigInteger;,Ljava/math/MutableBigInteger;
-HSPLjava/math/MutableBigInteger;->divideMagnitude(Ljava/math/MutableBigInteger;Ljava/math/MutableBigInteger;Z)Ljava/math/MutableBigInteger;+]Ljava/math/MutableBigInteger;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
@@ -25601,21 +25452,21 @@
 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+]Ljava/net/InetSocketAddress;Ljava/net/InetSocketAddress;
+HSPLjava/net/AbstractPlainSocketImpl;->connect(Ljava/net/SocketAddress;I)V
 HSPLjava/net/AbstractPlainSocketImpl;->connectToAddress(Ljava/net/InetAddress;II)V
-HSPLjava/net/AbstractPlainSocketImpl;->create(Z)V+]Ljava/net/Socket;Ljava/net/Socket;]Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;]Ljava/net/AbstractPlainSocketImpl;Ljava/net/SocksSocketImpl;]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard;
-HSPLjava/net/AbstractPlainSocketImpl;->doConnect(Ljava/net/InetAddress;II)V+]Ljava/net/Socket;Ljava/net/Socket;]Ljava/net/AbstractPlainSocketImpl;Ljava/net/SocksSocketImpl;]Ldalvik/system/BlockGuard$Policy;Ldalvik/system/BlockGuard$1;
+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+]Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;
+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+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/net/AbstractPlainSocketImpl;Ljava/net/SocksSocketImpl;
+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
@@ -25760,7 +25611,7 @@
 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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Llibcore/io/Os;Landroid/app/ActivityThread$AndroidOs;]Ljava/net/AddressCache;Ljava/net/AddressCache;]Ljava/net/InetAddress;Ljava/net/Inet4Address;]Landroid/system/GaiException;Landroid/system/GaiException;]Ldalvik/system/BlockGuard$Policy;Ldalvik/system/BlockGuard$1;
+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;
@@ -25775,7 +25626,7 @@
 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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/net/InetAddress;Ljava/net/Inet4Address;]Ljava/net/InetAddress$InetAddressHolder;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;
@@ -25784,7 +25635,7 @@
 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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/net/InetAddress;Ljava/net/Inet4Address;
+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
@@ -25836,12 +25687,12 @@
 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;+]Llibcore/io/Os;Landroid/app/ActivityThread$AndroidOs;
+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+]Llibcore/io/Os;Landroid/app/ActivityThread$AndroidOs;]Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;
-HSPLjava/net/PlainSocketImpl;->socketConnect(Ljava/net/InetAddress;II)V+]Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;]Ljava/net/PlainSocketImpl;Ljava/net/SocksSocketImpl;]Ljava/net/InetSocketAddress;Ljava/net/InetSocketAddress;
-HSPLjava/net/PlainSocketImpl;->socketCreate(Z)V+]Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;
+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
@@ -25878,12 +25729,12 @@
 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+]Ljava/net/Socket;Ljava/net/Socket;
+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+]Ljava/net/SocketImpl;Ljava/net/SocksSocketImpl;]Ljava/net/Socket;Ljava/net/Socket;]Ljava/net/InetSocketAddress;Ljava/net/InetSocketAddress;
+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;
@@ -25893,7 +25744,7 @@
 HSPLjava/net/Socket;->getLocalPort()I
 HSPLjava/net/Socket;->getLocalSocketAddress()Ljava/net/SocketAddress;
 HSPLjava/net/Socket;->getOutputStream()Ljava/io/OutputStream;
-HSPLjava/net/Socket;->getPort()I+]Ljava/net/SocketImpl;Ljava/net/SocksSocketImpl;]Ljava/net/Socket;Ljava/net/Socket;
+HSPLjava/net/Socket;->getPort()I
 HSPLjava/net/Socket;->getRemoteSocketAddress()Ljava/net/SocketAddress;
 HSPLjava/net/Socket;->getReuseAddress()Z
 HSPLjava/net/Socket;->getSoTimeout()I
@@ -25906,8 +25757,8 @@
 HSPLjava/net/Socket;->setBound()V
 HSPLjava/net/Socket;->setConnected()V
 HSPLjava/net/Socket;->setCreated()V
-HSPLjava/net/Socket;->setImpl()V+]Ljava/net/SocketImpl;Ljava/net/SocksSocketImpl;
-HSPLjava/net/Socket;->setSoTimeout(I)V+]Ljava/net/SocketImpl;Ljava/net/SocksSocketImpl;]Ljava/net/Socket;Ljava/net/Socket;
+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
@@ -25922,8 +25773,8 @@
 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+]Ljava/net/SocketInputStream;Ljava/net/SocketInputStream;]Ljava/net/AbstractPlainSocketImpl;Ljava/net/SocksSocketImpl;
-HSPLjava/net/SocketInputStream;->read([BIII)I+]Ljava/net/AbstractPlainSocketImpl;Ljava/net/SocksSocketImpl;]Ldalvik/system/BlockGuard$Policy;Ldalvik/system/BlockGuard$1;
+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
@@ -25939,7 +25790,7 @@
 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+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -25950,7 +25801,7 @@
 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+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -25968,7 +25819,7 @@
 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+]Ljava/net/URI$Parser;Ljava/net/URI$Parser;
+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
@@ -26060,14 +25911,14 @@
 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+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLjava/nio/Bits;->getIntL(Ljava/nio/ByteBuffer;I)I+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
+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+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLjava/nio/Bits;->getShortL(Ljava/nio/ByteBuffer;I)S+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
+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
@@ -26086,17 +25937,17 @@
 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+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
+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+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLjava/nio/Bits;->putIntL(Ljava/nio/ByteBuffer;II)V+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
+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+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLjava/nio/Bits;->putShortL(Ljava/nio/ByteBuffer;IS)V+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;
+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
@@ -26104,6 +25955,7 @@
 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;
@@ -26131,8 +25983,8 @@
 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+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;,Ljava/nio/DirectByteBuffer;
-HSPLjava/nio/ByteBuffer;->equals(Ljava/lang/Object;)Z+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;,Ljava/nio/DirectByteBuffer;
+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
@@ -26142,8 +25994,9 @@
 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;+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;,Ljava/nio/DirectByteBuffer;
+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;
@@ -26209,21 +26062,21 @@
 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;+]Ljava/nio/DirectByteBuffer;Ljava/nio/DirectByteBuffer;
+HSPLjava/nio/DirectByteBuffer;->duplicate()Ljava/nio/MappedByteBuffer;
 HSPLjava/nio/DirectByteBuffer;->get()B
-HSPLjava/nio/DirectByteBuffer;->get(I)B+]Ljava/nio/DirectByteBuffer;Ljava/nio/DirectByteBuffer;
+HSPLjava/nio/DirectByteBuffer;->get(I)B
 HSPLjava/nio/DirectByteBuffer;->get(J)B
-HSPLjava/nio/DirectByteBuffer;->get([BII)Ljava/nio/ByteBuffer;+]Ljava/nio/DirectByteBuffer;Ljava/nio/DirectByteBuffer;
+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+]Ljava/nio/DirectByteBuffer;Ljava/nio/DirectByteBuffer;
+HSPLjava/nio/DirectByteBuffer;->getInt(I)I
 HSPLjava/nio/DirectByteBuffer;->getInt(J)I
-HSPLjava/nio/DirectByteBuffer;->getLong(I)J+]Ljava/nio/DirectByteBuffer;Ljava/nio/DirectByteBuffer;
+HSPLjava/nio/DirectByteBuffer;->getLong(I)J
 HSPLjava/nio/DirectByteBuffer;->getLong(J)J
 HSPLjava/nio/DirectByteBuffer;->getShort()S
-HSPLjava/nio/DirectByteBuffer;->getShort(I)S+]Ljava/nio/DirectByteBuffer;Ljava/nio/DirectByteBuffer;
+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
@@ -26240,9 +26093,9 @@
 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;+]Ljava/nio/DirectByteBuffer;Ljava/nio/DirectByteBuffer;
+HSPLjava/nio/DirectByteBuffer;->putInt(II)Ljava/nio/ByteBuffer;
 HSPLjava/nio/DirectByteBuffer;->putInt(JI)Ljava/nio/ByteBuffer;
-HSPLjava/nio/DirectByteBuffer;->putLong(IJ)Ljava/nio/ByteBuffer;+]Ljava/nio/DirectByteBuffer;Ljava/nio/DirectByteBuffer;
+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
@@ -26265,19 +26118,19 @@
 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;+]Ljava/nio/HeapByteBuffer;Ljava/nio/HeapByteBuffer;
+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+]Ljava/nio/HeapByteBuffer;Ljava/nio/HeapByteBuffer;
+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+]Ljava/nio/HeapByteBuffer;Ljava/nio/HeapByteBuffer;
+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+]Ljava/nio/HeapByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->getShort(I)S+]Ljava/nio/HeapByteBuffer;Ljava/nio/HeapByteBuffer;
+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
@@ -26285,16 +26138,18 @@
 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;+]Ljava/nio/HeapByteBuffer;Ljava/nio/HeapByteBuffer;
+HSPLjava/nio/HeapByteBuffer;->putChar(C)Ljava/nio/ByteBuffer;
 HSPLjava/nio/HeapByteBuffer;->putFloat(F)Ljava/nio/ByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putInt(I)Ljava/nio/ByteBuffer;+]Ljava/nio/HeapByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putInt(II)Ljava/nio/ByteBuffer;+]Ljava/nio/HeapByteBuffer;Ljava/nio/HeapByteBuffer;
+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;+]Ljava/nio/HeapByteBuffer;Ljava/nio/HeapByteBuffer;
-HSPLjava/nio/HeapByteBuffer;->putShort(S)Ljava/nio/ByteBuffer;+]Ljava/nio/HeapByteBuffer;Ljava/nio/HeapByteBuffer;
+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
@@ -26305,6 +26160,7 @@
 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
@@ -26322,12 +26178,18 @@
 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;->load()Ljava/nio/MappedByteBuffer;+]Ljava/nio/MappedByteBuffer;Ljava/nio/DirectByteBuffer;]Lsun/misc/Unsafe;Lsun/misc/Unsafe;
+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
@@ -26485,6 +26347,8 @@
 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;
@@ -26539,7 +26403,7 @@
 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+]Ljava/security/MessageDigestSpi;Lcom/android/org/conscrypt/OpenSSLMessageDigestJDK$SHA1;
+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
@@ -26558,9 +26422,9 @@
 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+]Ljava/security/MessageDigest;Ljava/security/MessageDigest$Delegate;
+HSPLjava/security/MessageDigest;->update([BII)V
 HSPLjava/security/MessageDigestSpi;-><init>()V
-HSPLjava/security/MessageDigestSpi;->engineDigest([BII)I+]Ljava/security/MessageDigestSpi;Lcom/android/org/conscrypt/OpenSSLMessageDigestJDK$SHA1;
+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;
@@ -26574,8 +26438,9 @@
 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;+]Ljava/util/Map;Ljava/util/HashMap;
+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;
@@ -26583,6 +26448,8 @@
 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
@@ -26591,9 +26458,10 @@
 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+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -26602,11 +26470,12 @@
 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+]Ljava/lang/String;Ljava/lang/String;]Ljava/security/Provider$Service;Ljava/security/Provider$Service;]Ljava/util/Map;Ljava/util/LinkedHashMap;
+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
@@ -26617,6 +26486,7 @@
 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
@@ -26798,11 +26668,11 @@
 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;+]Ljava/text/FieldPosition;Ljava/text/DontCareFieldPosition;]Landroid/icu/text/DecimalFormat;Landroid/icu/text/DecimalFormat;
+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;+]Ljava/text/FieldPosition;Ljava/text/DontCareFieldPosition;
+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
@@ -26827,7 +26697,7 @@
 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;+]Ljava/text/DecimalFormatSymbols;Ljava/text/DecimalFormatSymbols;]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/util/Currency;Landroid/icu/util/Currency;
+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
@@ -26891,7 +26761,7 @@
 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;+]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;]Ljava/text/NumberFormat;Ljava/text/DecimalFormat;
+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;
@@ -26941,12 +26811,12 @@
 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+]Ljava/text/Format$FieldDelegate;Ljava/text/DontCareFieldPosition$1;]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;]Ljava/util/Calendar;Ljava/util/GregorianCalendar;
+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+]Ljava/text/DecimalFormatSymbols;Ljava/text/DecimalFormatSymbols;]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;]Ljava/text/DecimalFormat;Ljava/text/DecimalFormat;]Ljava/text/NumberFormat;Ljava/text/DecimalFormat;
+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
@@ -27137,10 +27007,10 @@
 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;
+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/ZoneOffset;Ljava/time/ZoneOffset;]Ljava/time/LocalTime;Ljava/time/LocalTime;]Ljava/time/chrono/ChronoZonedDateTime;Ljava/time/ZonedDateTime;]Ljava/time/chrono/ChronoLocalDate;Ljava/time/LocalDate;
-HSPLjava/time/chrono/ChronoZonedDateTime;->toInstant()Ljava/time/Instant;+]Ljava/time/LocalTime;Ljava/time/LocalTime;]Ljava/time/chrono/ChronoZonedDateTime;Ljava/time/ZonedDateTime;
+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;
@@ -27189,6 +27059,7 @@
 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;
@@ -27210,6 +27081,7 @@
 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
@@ -27244,8 +27116,8 @@
 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
-HSPLjava/time/temporal/TemporalAccessor;->range(Ljava/time/temporal/TemporalField;)Ljava/time/temporal/ValueRange;
+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;
@@ -27304,20 +27176,20 @@
 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+]Ljava/lang/Object;missing_types]Ljava/util/Iterator;Ljava/util/AbstractList$Itr;
+HSPLjava/util/AbstractCollection;->contains(Ljava/lang/Object;)Z
 HSPLjava/util/AbstractCollection;->containsAll(Ljava/util/Collection;)Z
-HSPLjava/util/AbstractCollection;->isEmpty()Z+]Ljava/util/AbstractCollection;missing_types
+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;+]Ljava/util/AbstractCollection;missing_types]Ljava/util/Iterator;missing_types
+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+]Ljava/util/AbstractList;missing_types
-HSPLjava/util/AbstractList$Itr;->next()Ljava/lang/Object;+]Ljava/util/AbstractList$Itr;Ljava/util/AbstractList$Itr;,Ljava/util/AbstractList$ListItr;]Ljava/util/AbstractList;missing_types
+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
@@ -27376,7 +27248,7 @@
 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+]Ljava/util/AbstractMap;Ljava/util/TreeMap;
+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;
@@ -27393,7 +27265,7 @@
 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+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;
+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;
@@ -27404,7 +27276,7 @@
 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+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;
+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
@@ -27434,9 +27306,9 @@
 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;+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;
+HSPLjava/util/ArrayDeque;->remove()Ljava/lang/Object;
 HSPLjava/util/ArrayDeque;->remove(Ljava/lang/Object;)Z
-HSPLjava/util/ArrayDeque;->removeFirst()Ljava/lang/Object;+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;
+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
@@ -27453,7 +27325,7 @@
 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;+]Ljava/util/ArrayList$Itr;Ljava/util/ArrayList$ListItr;,Ljava/util/ArrayList$Itr;
+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
@@ -27486,7 +27358,7 @@
 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+]Ljava/util/Collection;missing_types
+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
@@ -27499,14 +27371,14 @@
 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+]Ljava/util/function/Consumer;Ljava/util/ArrayDeque$$ExternalSyntheticLambda1;
-HSPLjava/util/ArrayList;->get(I)Ljava/lang/Object;+]Ljava/util/ArrayList;missing_types
+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+]Ljava/lang/Object;missing_types
+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
@@ -27544,8 +27416,9 @@
 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;+][Ljava/lang/Object;missing_types
+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
@@ -27565,8 +27438,8 @@
 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;+]Ljava/lang/Object;missing_types
-HSPLjava/util/Arrays;->copyOf([Ljava/lang/Object;ILjava/lang/Class;)[Ljava/lang/Object;+]Ljava/lang/Class;Ljava/lang/Class;
+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
@@ -27602,7 +27475,7 @@
 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+]Ljava/lang/Object;missing_types
+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
@@ -27620,8 +27493,8 @@
 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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLjava/util/Arrays;->toString([I)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+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
@@ -27707,7 +27580,7 @@
 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/Iterator;Landroid/util/MapCollections$ArrayIterator;,Landroid/util/MapCollections$MapIterator;
+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
@@ -27808,6 +27681,7 @@
 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;
@@ -27879,8 +27753,8 @@
 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+]Ljava/util/List;Ljava/util/ArrayList;
-HSPLjava/util/Collections;->indexedBinarySearch(Ljava/util/List;Ljava/lang/Object;Ljava/util/Comparator;)I+]Ljava/util/List;missing_types
+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;
@@ -27894,6 +27768,7 @@
 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;
@@ -27942,7 +27817,7 @@
 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$$ExternalSyntheticLambda5;
+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
@@ -28054,18 +27929,19 @@
 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+]Ljava/lang/Appendable;Ljava/lang/StringBuilder;
+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+]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;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/Formatter$Flags;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+]Ljava/lang/String;Ljava/lang/String;
+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;->checkBadFlags([Ljava/util/Formatter$Flags;)V+]Ljava/util/Formatter$Flags;Ljava/util/Formatter$Flags;
+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
@@ -28073,11 +27949,14 @@
 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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Formatter$Flags;Ljava/util/Formatter$Flags;]Ljava/util/Locale;Ljava/util/Locale;]Ljava/lang/CharSequence;Ljava/lang/String;,Ljava/lang/StringBuilder;]Ljava/text/DecimalFormatSymbols;Ljava/text/DecimalFormatSymbols;
+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
@@ -28097,16 +27976,18 @@
 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$FormatSpecifierParser;-><init>(Ljava/util/Formatter;Ljava/lang/String;I)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/util/Formatter$FormatSpecifierParser;->advance()C+]Ljava/lang/String;Ljava/lang/String;
+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+]Ljava/lang/String;Ljava/lang/String;
+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+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -28115,12 +27996,14 @@
 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;+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Formatter$FormatString;Ljava/util/Formatter$FixedString;,Ljava/util/Formatter$FormatSpecifier;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+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;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/Formatter$FormatSpecifierParser;Ljava/util/Formatter$FormatSpecifierParser;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+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
@@ -28144,7 +28027,7 @@
 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+]Ljava/util/GregorianCalendar;Ljava/util/GregorianCalendar;
+HSPLjava/util/GregorianCalendar;->getWeekNumber(JJ)I
 HSPLjava/util/GregorianCalendar;->internalGetEra()I
 HSPLjava/util/GregorianCalendar;->isCutoverYear(I)Z
 HSPLjava/util/GregorianCalendar;->isLeapYear(I)Z
@@ -28155,8 +28038,8 @@
 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;+]Ljava/util/HashMap$EntryIterator;Ljava/util/HashMap$EntryIterator;
-HSPLjava/util/HashMap$EntryIterator;->next()Ljava/util/Map$Entry;+]Ljava/util/HashMap$EntryIterator;Ljava/util/HashMap$EntryIterator;
+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
@@ -28171,7 +28054,7 @@
 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;+]Ljava/util/HashMap$KeyIterator;Ljava/util/HashMap$KeyIterator;
+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
@@ -28220,39 +28103,41 @@
 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+]Ljava/util/HashMap;missing_types
+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;+]Ljava/util/HashMap;Ljava/util/HashMap;
-HSPLjava/util/HashMap;->getNode(Ljava/lang/Object;)Ljava/util/HashMap$Node;+]Ljava/lang/Object;megamorphic_types]Ljava/util/HashMap$TreeNode;Ljava/util/HashMap$TreeNode;
+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+]Ljava/lang/Object;missing_types
+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;+]Ljava/util/HashMap;missing_types
+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+]Ljava/util/Map$Entry;missing_types]Ljava/util/HashMap;missing_types]Ljava/util/Map;missing_types]Ljava/util/Iterator;missing_types]Ljava/util/Set;missing_types
-HSPLjava/util/HashMap;->putVal(ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/lang/Object;+]Ljava/util/HashMap;missing_types]Ljava/lang/Object;missing_types]Ljava/util/HashMap$TreeNode;Ljava/util/HashMap$TreeNode;
+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;+]Ljava/util/HashMap$TreeNode;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
@@ -28267,13 +28152,15 @@
 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+]Ljava/util/HashMap;Ljava/util/HashMap;,Ljava/util/LinkedHashMap;
+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;
@@ -28300,7 +28187,7 @@
 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+]Ljava/lang/Object;Ljava/lang/String;
+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;
@@ -28362,6 +28249,9 @@
 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;
@@ -28369,6 +28259,8 @@
 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
@@ -28376,13 +28268,14 @@
 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+]Ljava/lang/Object;Ljava/lang/String;
+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/Iterator;->forEachRemaining(Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;megamorphic_types]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
+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;
@@ -28397,19 +28290,29 @@
 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
@@ -28421,14 +28324,21 @@
 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;+]Ljava/util/LinkedHashMap;missing_types
+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
@@ -28493,7 +28403,7 @@
 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/LinkedList$ListItr;]Ljava/util/List;Ljava/util/LinkedList;
+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;
@@ -28501,6 +28411,7 @@
 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;
@@ -28517,7 +28428,7 @@
 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+]Lsun/util/locale/BaseLocale;Lsun/util/locale/BaseLocale;
+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;
@@ -28530,11 +28441,11 @@
 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;+]Ljava/lang/String;Ljava/lang/String;]Lsun/util/locale/BaseLocale;Lsun/util/locale/BaseLocale;
+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;+]Lsun/util/locale/BaseLocale;Lsun/util/locale/BaseLocale;
+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;
@@ -28544,14 +28455,14 @@
 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+]Ljava/lang/String;Ljava/lang/String;]Ljava/io/ObjectInputStream;Landroid/os/Parcel$2;]Ljava/io/ObjectInputStream$GetField;Ljava/io/ObjectInputStream$GetFieldImpl;
+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/function/Function;missing_types]Ljava/util/Map;Landroid/util/ArrayMap;
+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;
@@ -28561,10 +28472,11 @@
 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+]Ljava/lang/Object;megamorphic_types
+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;
@@ -28630,11 +28542,15 @@
 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
@@ -28644,12 +28560,12 @@
 HSPLjava/util/Random;-><init>()V
 HSPLjava/util/Random;-><init>(J)V
 HSPLjava/util/Random;->initialScramble(J)J
-HSPLjava/util/Random;->next(I)I+]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong;
+HSPLjava/util/Random;->next(I)I
 HSPLjava/util/Random;->nextBoolean()Z
 HSPLjava/util/Random;->nextBytes([B)V
-HSPLjava/util/Random;->nextDouble()D+]Ljava/util/Random;Ljava/util/Random;
+HSPLjava/util/Random;->nextDouble()D
 HSPLjava/util/Random;->nextFloat()F
-HSPLjava/util/Random;->nextGaussian()D+]Ljava/util/Random;Ljava/util/Random;
+HSPLjava/util/Random;->nextGaussian()D
 HSPLjava/util/Random;->nextInt()I
 HSPLjava/util/Random;->nextInt(I)I
 HSPLjava/util/Random;->nextLong()J
@@ -28746,7 +28662,7 @@
 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;
+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
@@ -28791,14 +28707,14 @@
 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+]Ljava/lang/String;Ljava/lang/String;
+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;+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/util/StringTokenizer;->scanToken(I)I+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/util/StringTokenizer;->setMaxDelimCodePoint()V+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/util/StringTokenizer;->skipDelimiters(I)I+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -28918,6 +28834,8 @@
 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;
@@ -28941,8 +28859,8 @@
 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;+]Ljava/lang/Comparable;missing_types]Ljava/util/TreeMap;Ljava/util/TreeMap;
-HSPLjava/util/TreeMap;->getEntryUsingComparator(Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;+]Ljava/util/Comparator;missing_types
+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;
@@ -28960,7 +28878,8 @@
 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;+]Ljava/util/TreeMap$TreeMapEntry;Ljava/util/TreeMap$TreeMapEntry;]Ljava/util/TreeMap;missing_types]Ljava/lang/Comparable;missing_types]Ljava/util/Comparator;missing_types
+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;
@@ -28978,7 +28897,7 @@
 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+]Ljava/util/NavigableMap;Ljava/util/TreeMap;
+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
@@ -28987,7 +28906,7 @@
 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+]Ljava/util/NavigableMap;Ljava/util/TreeMap;
+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
@@ -28999,11 +28918,13 @@
 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
@@ -29173,7 +29094,7 @@
 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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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;
@@ -29181,7 +29102,7 @@
 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;+]Ljava/lang/Object;megamorphic_types
+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;
@@ -29195,13 +29116,13 @@
 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;+]Ljava/lang/Object;Lsun/nio/ch/FileKey;
+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;+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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
@@ -29247,7 +29168,7 @@
 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+]Ljava/util/concurrent/ConcurrentLinkedQueue;Ljava/util/concurrent/ConcurrentLinkedQueue;
+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;
@@ -29416,14 +29337,14 @@
 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+]Ljava/util/concurrent/locks/ReentrantLock;Ljava/util/concurrent/locks/ReentrantLock;]Ljava/util/concurrent/locks/Condition;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
+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+]Ljava/util/concurrent/locks/ReentrantLock;Ljava/util/concurrent/locks/ReentrantLock;]Ljava/util/concurrent/locks/Condition;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
+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;+]Ljava/util/concurrent/locks/ReentrantLock;Ljava/util/concurrent/locks/ReentrantLock;]Ljava/util/concurrent/locks/Condition;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
+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
@@ -29462,7 +29383,7 @@
 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+]Ljava/util/concurrent/RunnableScheduledFuture;Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;
+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;
@@ -29472,7 +29393,7 @@
 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+]Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;
+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
@@ -29601,7 +29522,7 @@
 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+]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;]Ljava/util/concurrent/ThreadPoolExecutor$Worker;Ljava/util/concurrent/ThreadPoolExecutor$Worker;
+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
@@ -29650,8 +29571,8 @@
 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+]Ljava/lang/Class;Ljava/lang/Class;
-HSPLjava/util/concurrent/atomic/AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl;->compareAndSet(Ljava/lang/Object;II)Z+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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
@@ -29673,12 +29594,12 @@
 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+]Ljava/lang/Class;Ljava/lang/Class;
+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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->getAndIncrement(Ljava/lang/Object;)J+]Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->incrementAndGet(Ljava/lang/Object;)J+]Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;
+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
@@ -29701,12 +29622,12 @@
 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+]Ljava/lang/Class;Ljava/lang/Class;
-HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
-HSPLjava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;->valueCheck(Ljava/lang/Object;)V+]Ljava/lang/Class;Ljava/lang/Class;
+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
@@ -29723,37 +29644,37 @@
 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+]Ljava/lang/Thread;Ljava/lang/Thread;
+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+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;
+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+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->doSignal(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;Z)V+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->enableWait(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;)I+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;
+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+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;
+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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->getAndUnsetStatus(I)I+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->setPrevRelaxed(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;->setStatusRelaxed(I)V+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;,Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;,Ljava/util/concurrent/ThreadPoolExecutor$Worker;
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->acquire(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;IZZZJ)I+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ExclusiveNode;,Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;,Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$SharedNode;]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;Ljava/util/concurrent/CountDownLatch$Sync;,Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;
+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+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;
+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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->enqueue(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;)V+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;
+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
@@ -29761,10 +29682,10 @@
 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+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;,Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;,Ljava/util/concurrent/ThreadPoolExecutor$Worker;,Ljava/util/concurrent/locks/ReentrantLock$FairSync;
-HSPLjava/util/concurrent/locks/AbstractQueuedSynchronizer;->releaseShared(I)Z+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;,Ljava/util/concurrent/CountDownLatch$Sync;
+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+]Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ExclusiveNode;,Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionNode;,Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$SharedNode;
+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
@@ -29772,42 +29693,42 @@
 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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
-HSPLjava/util/concurrent/locks/LockSupport;->setBlocker(Ljava/lang/Thread;Ljava/lang/Object;)V+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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+]Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;
-HSPLjava/util/concurrent/locks/ReentrantLock$NonfairSync;->tryAcquire(I)Z+]Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;
+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+]Ljava/util/concurrent/locks/ReentrantLock$Sync;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;
-HSPLjava/util/concurrent/locks/ReentrantLock$Sync;->lock()V+]Ljava/util/concurrent/locks/ReentrantLock$Sync;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;,Ljava/util/concurrent/locks/ReentrantLock$FairSync;
+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+]Ljava/util/concurrent/locks/ReentrantLock$Sync;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;,Ljava/util/concurrent/locks/ReentrantLock$FairSync;
+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+]Ljava/util/concurrent/locks/ReentrantLock$Sync;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;,Ljava/util/concurrent/locks/ReentrantLock$FairSync;
+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+]Ljava/util/concurrent/locks/ReentrantLock$Sync;Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;,Ljava/util/concurrent/locks/ReentrantLock$FairSync;
+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+]Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;
+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+]Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;
-HSPLjava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;->unlock()V+]Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;
+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;
@@ -29820,16 +29741,16 @@
 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+]Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;
+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+]Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;
+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;+]Ljava/util/concurrent/locks/ReentrantReadWriteLock;Ljava/util/concurrent/locks/ReentrantReadWriteLock;
+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;
@@ -29837,6 +29758,8 @@
 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;
@@ -29851,15 +29774,20 @@
 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;+]Ljava/util/Map;Ljava/util/LinkedHashMap;
-HSPLjava/util/jar/Attributes;->putValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+]Ljava/util/jar/Attributes;Ljava/util/jar/Attributes;
+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+]Ljava/util/jar/Attributes;Ljava/util/jar/Attributes;]Ljava/util/jar/Manifest$FastInputStream;Ljava/util/jar/Manifest$FastInputStream;
-HSPLjava/util/jar/Attributes;->size()I+]Ljava/util/Map;Ljava/util/LinkedHashMap;
+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;
@@ -29886,11 +29814,11 @@
 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+]Ljava/util/jar/Manifest$FastInputStream;Ljava/util/jar/Manifest$FastInputStream;
+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;+]Ljava/util/jar/Manifest;Ljava/util/jar/Manifest;]Ljava/util/Map;Ljava/util/HashMap;
+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;
@@ -29943,9 +29871,9 @@
 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+]Ljava/util/logging/LogManager$LoggerContext;Ljava/util/logging/LogManager$LoggerContext;]Ljava/util/Hashtable;Ljava/util/Hashtable;]Ljava/util/logging/Logger;Ljava/util/logging/LogManager$RootLogger;,Ljava/util/logging/Logger;
-HSPLjava/util/logging/LogManager$LoggerContext;->ensureInitialized()V+]Ljava/util/logging/LogManager$LoggerContext;Ljava/util/logging/LogManager$LoggerContext;
-HSPLjava/util/logging/LogManager$LoggerContext;->findLogger(Ljava/lang/String;)Ljava/util/logging/Logger;+]Ljava/util/Hashtable;Ljava/util/Hashtable;]Ljava/util/logging/LogManager$LoggerWeakRef;Ljava/util/logging/LogManager$LoggerWeakRef;
+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;
@@ -29953,7 +29881,7 @@
 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+]Ljava/util/logging/LogManager$LoggerContext;Ljava/util/logging/LogManager$LoggerContext;]Ljava/util/logging/LogManager;Ljava/util/logging/LogManager;
+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
@@ -29992,7 +29920,7 @@
 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+]Ljava/lang/Object;Ljava/util/logging/Level;]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong;
+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;
@@ -30028,7 +29956,7 @@
 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+]Ljava/util/logging/Level;Ljava/util/logging/Level;
+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
@@ -30057,51 +29985,51 @@
 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+]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;
+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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/regex/Matcher;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+]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->end(I)I+]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;
+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+]Lcom/android/icu/util/regex/MatcherNative;Lcom/android/icu/util/regex/MatcherNative;]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;
+HSPLjava/util/regex/Matcher;->find(I)Z
 HSPLjava/util/regex/Matcher;->getSubSequence(II)Ljava/lang/CharSequence;
-HSPLjava/util/regex/Matcher;->getTextLength()I+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/util/regex/Matcher;->getTextLength()I
 HSPLjava/util/regex/Matcher;->group()Ljava/lang/String;
-HSPLjava/util/regex/Matcher;->group(I)Ljava/lang/String;+]Ljava/lang/CharSequence;Ljava/lang/String;]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->groupCount()I+]Lcom/android/icu/util/regex/MatcherNative;Lcom/android/icu/util/regex/MatcherNative;
+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+]Lcom/android/icu/util/regex/MatcherNative;Lcom/android/icu/util/regex/MatcherNative;
+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;+]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLjava/util/regex/Matcher;->reset(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;+]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLjava/util/regex/Matcher;->reset(Ljava/lang/CharSequence;II)Ljava/util/regex/Matcher;+]Ljava/lang/CharSequence;Ljava/lang/String;,Ljava/nio/HeapCharBuffer;
-HSPLjava/util/regex/Matcher;->resetForInput()V+]Lcom/android/icu/util/regex/MatcherNative;Lcom/android/icu/util/regex/MatcherNative;
-HSPLjava/util/regex/Matcher;->start()I+]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->start(I)I+]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;
+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;+]Ljava/util/regex/Matcher;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;+]Ljava/lang/String;Ljava/lang/String;
+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;+]Ljava/util/List;Ljava/util/ArrayList$SubList;]Ljava/lang/CharSequence;Ljava/lang/String;]Ljava/util/regex/Pattern;Ljava/util/regex/Pattern;]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/String;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
@@ -30124,14 +30052,20 @@
 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$$ExternalSyntheticLambda77;-><init>()V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda78;-><init>()V
-HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda78;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 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
@@ -30148,6 +30082,7 @@
 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;
@@ -30187,8 +30122,13 @@
 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;
@@ -30208,6 +30148,7 @@
 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
@@ -30313,9 +30254,10 @@
 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$11$1;-><init>(Ljava/util/stream/ReferencePipeline$11;Ljava/util/stream/Sink;)V
-HSPLjava/util/stream/ReferencePipeline$11$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$11;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
+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
@@ -30441,6 +30383,12 @@
 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
@@ -30484,38 +30432,44 @@
 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+]Ljava/util/zip/ZStreamRef;Ljava/util/zip/ZStreamRef;
+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+]Ljava/util/zip/ZStreamRef;Ljava/util/zip/ZStreamRef;
+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+]Ljava/io/InputStream;Ljava/io/PushbackInputStream;]Ljava/util/zip/Inflater;Ljava/util/zip/Inflater;
+HSPLjava/util/zip/InflaterInputStream;->fill()V
 HSPLjava/util/zip/InflaterInputStream;->read()I
-HSPLjava/util/zip/InflaterInputStream;->read([BII)I+]Ljava/util/zip/InflaterInputStream;Ljava/util/zip/ZipInputStream;]Ljava/util/zip/Inflater;Ljava/util/zip/Inflater;
-HSPLjava/util/zip/ZStreamRef;-><init>(J)V
-HSPLjava/util/zip/ZStreamRef;->address()J
-HSPLjava/util/zip/ZStreamRef;->clear()V
+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;+]Ljava/nio/CharBuffer;Ljava/nio/HeapCharBuffer;]Ljava/nio/charset/CoderResult;Ljava/nio/charset/CoderResult;]Ljava/nio/charset/CharsetDecoder;Lcom/android/icu/charset/CharsetDecoderICU;
+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
@@ -30525,6 +30479,38 @@
 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;
@@ -30533,16 +30519,20 @@
 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
@@ -30550,17 +30540,32 @@
 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;+]Ljava/util/zip/CRC32;Ljava/util/zip/CRC32;]Ljava/util/zip/Inflater;Ljava/util/zip/Inflater;
-HSPLjava/util/zip/ZipInputStream;->read([BII)I+]Ljava/util/zip/CRC32;Ljava/util/zip/CRC32;
-HSPLjava/util/zip/ZipInputStream;->readEnd(Ljava/util/zip/ZipEntry;)V+]Ljava/util/zip/CRC32;Ljava/util/zip/CRC32;]Ljava/io/PushbackInputStream;Ljava/io/PushbackInputStream;]Ljava/util/zip/Inflater;Ljava/util/zip/Inflater;
+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;+]Ldalvik/system/ZipPathValidator$Callback;Lcom/android/internal/os/SafeZipPathValidatorCallback;]Ljava/util/zip/ZipInputStream;Ljava/util/zip/ZipInputStream;]Ljava/util/zip/ZipCoder;Ljava/util/zip/ZipCoder;
+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;
@@ -30568,7 +30573,7 @@
 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;+]Ljavax/crypto/Cipher$SpiAndProviderUpdater;Ljavax/crypto/Cipher$SpiAndProviderUpdater;
+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
@@ -30591,9 +30596,9 @@
 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;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/StringTokenizer;Ljava/util/StringTokenizer;
-HSPLjavax/crypto/Cipher;->tryCombinations(Ljavax/crypto/Cipher$InitParams;Ljava/security/Provider;[Ljava/lang/String;)Ljavax/crypto/Cipher$CipherSpiAndProvider;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/security/Provider$Service;Ljava/security/Provider$Service;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HSPLjavax/crypto/Cipher;->tryTransformWithProvider(Ljavax/crypto/Cipher$InitParams;[Ljava/lang/String;Ljavax/crypto/Cipher$NeedToSet;Ljava/security/Provider$Service;)Ljavax/crypto/Cipher$CipherSpiAndProvider;+]Ljava/security/Provider$Service;Ljava/security/Provider$Service;]Ljavax/crypto/Cipher$InitType;Ljavax/crypto/Cipher$InitType;
+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
@@ -30622,7 +30627,7 @@
 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+]Ljava/security/Provider$Service;Ljava/security/Provider$Service;]Ljava/util/List;Lsun/security/jca/ProviderList$ServiceList;]Ljava/util/Iterator;Lsun/security/jca/ProviderList$ServiceList$1;
+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
@@ -30768,6 +30773,8 @@
 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;
@@ -30803,7 +30810,7 @@
 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+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+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
@@ -30823,8 +30830,8 @@
 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+]Ljdk/internal/math/FloatingDecimal$ASCIIToBinaryConverter;Ljdk/internal/math/FloatingDecimal$ASCIIToBinaryBuffer;
-HSPLjdk/internal/math/FloatingDecimal;->readJavaFormatString(Ljava/lang/String;)Ljdk/internal/math/FloatingDecimal$ASCIIToBinaryConverter;+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -30845,35 +30852,44 @@
 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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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;+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
-HSPLjdk/internal/misc/Unsafe;->putReferenceRelease(Ljava/lang/Object;JLjava/lang/Object;)V+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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
@@ -30881,9 +30897,12 @@
 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+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+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;
@@ -30907,6 +30926,7 @@
 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;
@@ -30917,6 +30937,7 @@
 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;
@@ -30937,7 +30958,7 @@
 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+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -30962,8 +30983,8 @@
 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+]Ldalvik/system/BlockGuard$Policy;Ldalvik/system/BlockGuard$1;
-HSPLlibcore/io/BlockGuardOs;->read(Ljava/io/FileDescriptor;[BII)I+]Ldalvik/system/BlockGuard$Policy;Ldalvik/system/BlockGuard$1;,Landroid/os/StrictMode$AndroidBlockGuardPolicy;
+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
@@ -30974,13 +30995,14 @@
 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+]Ldalvik/system/BlockGuard$Policy;Ldalvik/system/BlockGuard$1;,Landroid/os/StrictMode$AndroidBlockGuardPolicy;
+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;
@@ -31012,7 +31034,7 @@
 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+]Llibcore/io/Os;Llibcore/io/BlockGuardOs;,Llibcore/io/Linux;
+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
@@ -31025,8 +31047,8 @@
 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+]Llibcore/io/Os;Llibcore/io/BlockGuardOs;,Llibcore/io/Linux;
-HSPLlibcore/io/ForwardingOs;->read(Ljava/io/FileDescriptor;[BII)I+]Llibcore/io/Os;Llibcore/io/BlockGuardOs;,Llibcore/io/Linux;
+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
@@ -31045,7 +31067,7 @@
 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+]Llibcore/io/Os;Llibcore/io/BlockGuardOs;,Llibcore/io/Linux;
+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
@@ -31060,17 +31082,17 @@
 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+]Llibcore/io/Os;Landroid/app/ActivityThread$AndroidOs;
+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+]Llibcore/io/Os;Landroid/app/ActivityThread$AndroidOs;
+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+]Ldalvik/system/BlockGuard$Policy;Ldalvik/system/BlockGuard$1;,Landroid/os/StrictMode$AndroidBlockGuardPolicy;
-HSPLlibcore/io/IoTracker;->trackIo(ILlibcore/io/IoTracker$Mode;)V+]Llibcore/io/IoTracker;Llibcore/io/IoTracker;
+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
@@ -31129,10 +31151,10 @@
 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+]Llibcore/reflect/GenericSignatureParser;Llibcore/reflect/GenericSignatureParser;
+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+]Llibcore/reflect/GenericSignatureParser;Llibcore/reflect/GenericSignatureParser;
+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
@@ -31144,7 +31166,7 @@
 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+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Llibcore/reflect/GenericSignatureParser;Llibcore/reflect/GenericSignatureParser;
+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
@@ -31159,7 +31181,7 @@
 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;+]Llibcore/reflect/ParameterizedTypeImpl;Llibcore/reflect/ParameterizedTypeImpl;]Ljava/lang/Class;Ljava/lang/Class;
+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;
@@ -31170,7 +31192,7 @@
 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+]Ljava/lang/String;Ljava/lang/String;]Llibcore/reflect/TypeVariableImpl;Llibcore/reflect/TypeVariableImpl;]Ljava/lang/Object;Ljava/lang/Class;
+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;
@@ -31209,9 +31231,9 @@
 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+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;
-HSPLlibcore/util/NativeAllocationRegistry;->registerNativeAllocation(Ljava/lang/Object;J)Ljava/lang/Runnable;+]Llibcore/util/NativeAllocationRegistry$CleanerThunk;Llibcore/util/NativeAllocationRegistry$CleanerThunk;
-HSPLlibcore/util/NativeAllocationRegistry;->registerNativeFree(J)V+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;
+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;
@@ -31452,7 +31474,7 @@
 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+]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Lorg/json/JSONStringer;Lorg/json/JSONStringer;]Ljava/util/Iterator;Ljava/util/LinkedHashMap$LinkedEntryIterator;]Ljava/util/Set;Ljava/util/LinkedHashMap$LinkedEntrySet;
+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;
@@ -31467,18 +31489,18 @@
 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+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+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+]Ljava/lang/String;Ljava/lang/String;
-HSPLorg/json/JSONTokener;->nextString(C)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+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;+]Ljava/lang/String;Ljava/lang/String;
-HSPLorg/json/JSONTokener;->readObject()Lorg/json/JSONObject;+]Ljava/lang/String;Ljava/lang/String;]Lorg/json/JSONObject;Lorg/json/JSONObject;]Lorg/json/JSONTokener;Lorg/json/JSONTokener;
+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
@@ -31515,7 +31537,8 @@
 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;->clean()V+]Ljava/lang/Runnable;Lsun/nio/fs/NativeBuffer$Deallocator;,Lsun/nio/ch/FileChannelImpl$Unmapper;,Llibcore/util/NativeAllocationRegistry$CleanerThunk;
+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
@@ -31543,8 +31566,8 @@
 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;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLsun/net/spi/DefaultProxySelector;->select(Ljava/net/URI;)Ljava/util/List;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/net/URI;Ljava/net/URI;
+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;
@@ -31574,6 +31597,7 @@
 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
@@ -31581,7 +31605,7 @@
 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;+]Lsun/nio/ch/NativeThreadSet;Lsun/nio/ch/NativeThreadSet;]Lsun/nio/ch/FileDispatcher;Lsun/nio/ch/FileDispatcherImpl;]Lsun/nio/ch/FileChannelImpl;Lsun/nio/ch/FileChannelImpl;]Ldalvik/system/BlockGuard$Policy;Ldalvik/system/BlockGuard$1;
+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;
@@ -31592,6 +31616,7 @@
 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
@@ -31741,6 +31766,7 @@
 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
@@ -31805,6 +31831,7 @@
 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
@@ -31815,6 +31842,7 @@
 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
@@ -31823,6 +31851,8 @@
 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
@@ -31842,7 +31872,6 @@
 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;->realpath(Lsun/nio/fs/UnixPath;)[B
 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
@@ -31858,7 +31887,6 @@
 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;->isAbsolute()Z
 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;
@@ -31866,8 +31894,6 @@
 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;->toAbsolutePath()Lsun/nio/fs/UnixPath;
-HSPLsun/nio/fs/UnixPath;->toRealPath([Ljava/nio/file/LinkOption;)Ljava/nio/file/Path;+]Lsun/nio/fs/UnixPath;Lsun/nio/fs/UnixPath;
 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
@@ -31921,7 +31947,7 @@
 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+]Ljava/lang/String;Ljava/lang/String;]Lsun/security/jca/ProviderList;Lsun/security/jca/ProviderList;]Ljava/security/Provider;missing_types
+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;
@@ -32153,7 +32179,7 @@
 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;+]Lsun/security/util/DerInputBuffer;Lsun/security/util/DerInputBuffer;]Ljava/util/Vector;Ljava/util/Vector;]Lsun/security/util/DerInputStream;Lsun/security/util/DerInputStream;
+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
@@ -32171,9 +32197,9 @@
 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+]Lsun/security/util/DerInputBuffer;Lsun/security/util/DerInputBuffer;
+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+]Lsun/security/util/DerInputBuffer;Lsun/security/util/DerInputBuffer;]Lsun/security/util/DerOutputStream;Lsun/security/util/DerOutputStream;
+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
@@ -32187,7 +32213,7 @@
 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;+]Ljava/io/InputStream;Lsun/security/util/DerInputBuffer;,Ljava/io/ByteArrayInputStream;
+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
@@ -32196,6 +32222,7 @@
 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
@@ -32229,7 +32256,7 @@
 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+]Lsun/security/util/DerInputStream;Lsun/security/util/DerInputStream;
+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
@@ -32255,7 +32282,7 @@
 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;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;]Lsun/security/util/DerValue;Lsun/security/util/DerValue;
+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;
@@ -32437,7 +32464,7 @@
 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+]Lsun/util/calendar/BaseCalendar$Date;Lsun/util/calendar/Gregorian$Date;]Lsun/util/calendar/BaseCalendar;Lsun/util/calendar/Gregorian;
+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
@@ -32489,7 +32516,7 @@
 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+]Lsun/util/calendar/Gregorian$Date;Lsun/util/calendar/Gregorian$Date;
+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;
@@ -32506,6 +32533,7 @@
 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;
@@ -32513,14 +32541,15 @@
 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+]Ljava/lang/String;Ljava/lang/String;]Lsun/util/locale/BaseLocale;Lsun/util/locale/BaseLocale;
+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+]Ljava/lang/String;Ljava/lang/String;]Lsun/util/locale/BaseLocale;Lsun/util/locale/BaseLocale;
+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;
@@ -32536,7 +32565,7 @@
 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;+]Lsun/util/locale/InternalLocaleBuilder;Lsun/util/locale/InternalLocaleBuilder;]Ljava/lang/String;Ljava/lang/String;]Lsun/util/locale/LanguageTag;Lsun/util/locale/LanguageTag;]Ljava/util/List;Ljava/util/Collections$EmptyList;
+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;
@@ -32556,7 +32585,7 @@
 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;+]Lsun/util/locale/StringTokenIterator;Lsun/util/locale/StringTokenIterator;]Ljava/util/Map;Ljava/util/HashMap;
+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
@@ -32570,7 +32599,7 @@
 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+]Ljava/lang/String;Ljava/lang/String;
+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
@@ -32856,12 +32885,10 @@
 Landroid/app/ActivityThread$4;
 Landroid/app/ActivityThread$ActivityClientRecord$1;
 Landroid/app/ActivityThread$ActivityClientRecord;
-Landroid/app/ActivityThread$AndroidOs;
 Landroid/app/ActivityThread$AppBindData;
 Landroid/app/ActivityThread$ApplicationThread$$ExternalSyntheticLambda2;
 Landroid/app/ActivityThread$ApplicationThread$1;
 Landroid/app/ActivityThread$ApplicationThread-IA;
-Landroid/app/ActivityThread$ApplicationThread;
 Landroid/app/ActivityThread$BindServiceData;
 Landroid/app/ActivityThread$ContextCleanupInfo;
 Landroid/app/ActivityThread$CreateBackupAgentData;
@@ -32891,7 +32918,6 @@
 Landroid/app/ActivityTransitionState;
 Landroid/app/AlarmManager$AlarmClockInfo$1;
 Landroid/app/AlarmManager$AlarmClockInfo;
-Landroid/app/AlarmManager$ListenerWrapper;
 Landroid/app/AlarmManager$OnAlarmListener;
 Landroid/app/AlarmManager;
 Landroid/app/AlertDialog$Builder;
@@ -32912,7 +32938,6 @@
 Landroid/app/AppOpsManager$2;
 Landroid/app/AppOpsManager$3;
 Landroid/app/AppOpsManager$4;
-Landroid/app/AppOpsManager$5;
 Landroid/app/AppOpsManager$AppOpsCollector;
 Landroid/app/AppOpsManager$AttributedHistoricalOps$1;
 Landroid/app/AppOpsManager$AttributedHistoricalOps;
@@ -32979,7 +33004,6 @@
 Landroid/app/ApplicationPackageManager$HasSystemFeatureQuery;
 Landroid/app/ApplicationPackageManager$MoveCallbackDelegate;
 Landroid/app/ApplicationPackageManager$ResourceName;
-Landroid/app/ApplicationPackageManager;
 Landroid/app/AsyncNotedAppOp$1;
 Landroid/app/AsyncNotedAppOp;
 Landroid/app/AutomaticZenRule$1;
@@ -33001,7 +33025,6 @@
 Landroid/app/ContentProviderHolder;
 Landroid/app/ContextImpl$1;
 Landroid/app/ContextImpl$ApplicationContentResolver;
-Landroid/app/ContextImpl;
 Landroid/app/DexLoadReporter;
 Landroid/app/Dialog$$ExternalSyntheticLambda0;
 Landroid/app/Dialog$$ExternalSyntheticLambda1;
@@ -33073,7 +33096,6 @@
 Landroid/app/IAlarmCompleteListener$Stub$Proxy;
 Landroid/app/IAlarmCompleteListener$Stub;
 Landroid/app/IAlarmCompleteListener;
-Landroid/app/IAlarmListener$Stub$Proxy;
 Landroid/app/IAlarmListener$Stub;
 Landroid/app/IAlarmListener;
 Landroid/app/IAlarmManager$Stub$Proxy;
@@ -33088,7 +33110,6 @@
 Landroid/app/IApplicationStartInfoCompleteListener$Stub$Proxy;
 Landroid/app/IApplicationStartInfoCompleteListener$Stub;
 Landroid/app/IApplicationStartInfoCompleteListener;
-Landroid/app/IApplicationThread$Stub$Proxy;
 Landroid/app/IApplicationThread$Stub;
 Landroid/app/IApplicationThread;
 Landroid/app/IAssistDataReceiver$Stub$Proxy;
@@ -33133,7 +33154,6 @@
 Landroid/app/ISearchManager$Stub$Proxy;
 Landroid/app/ISearchManager$Stub;
 Landroid/app/ISearchManager;
-Landroid/app/IServiceConnection$Stub$Proxy;
 Landroid/app/IServiceConnection$Stub;
 Landroid/app/IServiceConnection;
 Landroid/app/IStopUserCallback$Stub$Proxy;
@@ -33159,7 +33179,6 @@
 Landroid/app/IUidFrozenStateChangedCallback$Stub$Proxy;
 Landroid/app/IUidFrozenStateChangedCallback$Stub;
 Landroid/app/IUidFrozenStateChangedCallback;
-Landroid/app/IUidObserver$Stub$Proxy;
 Landroid/app/IUidObserver$Stub;
 Landroid/app/IUidObserver;
 Landroid/app/IUnsafeIntentStrictModeCallback$Stub;
@@ -33188,19 +33207,16 @@
 Landroid/app/IntentReceiverLeaked;
 Landroid/app/IntentService$ServiceHandler;
 Landroid/app/IntentService;
-Landroid/app/JobSchedulerImpl;
 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$InnerReceiver;
 Landroid/app/LoadedApk$ReceiverDispatcher;
 Landroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo-IA;
 Landroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo;
 Landroid/app/LoadedApk$ServiceDispatcher$DeathMonitor;
-Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;
 Landroid/app/LoadedApk$ServiceDispatcher$RunConnection;
 Landroid/app/LoadedApk$ServiceDispatcher;
 Landroid/app/LoadedApk$SplitDependencyLoaderImpl;
@@ -33973,8 +33989,6 @@
 Landroid/appwidget/AppWidgetProviderInfo;
 Landroid/appwidget/PendingHostUpdate$1;
 Landroid/appwidget/PendingHostUpdate;
-Landroid/appwidget/flags/FeatureFlags;
-Landroid/appwidget/flags/FeatureFlagsImpl;
 Landroid/appwidget/flags/Flags;
 Landroid/attention/AttentionManagerInternal$AttentionCallbackInternal;
 Landroid/attention/AttentionManagerInternal;
@@ -34046,7 +34060,6 @@
 Landroid/content/ContentCaptureOptions$1;
 Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda0;
 Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda1;
-Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda2;
 Landroid/content/ContentCaptureOptions$ContentProtectionOptions;
 Landroid/content/ContentCaptureOptions;
 Landroid/content/ContentInterface;
@@ -34104,7 +34117,6 @@
 Landroid/content/IContentService$Stub$Proxy;
 Landroid/content/IContentService$Stub;
 Landroid/content/IContentService;
-Landroid/content/IIntentReceiver$Stub$Proxy;
 Landroid/content/IIntentReceiver$Stub;
 Landroid/content/IIntentReceiver;
 Landroid/content/IIntentSender$Stub$Proxy;
@@ -34626,7 +34638,6 @@
 Landroid/content/res/ThemedResourceCache;
 Landroid/content/res/TypedArray;
 Landroid/content/res/Validator;
-Landroid/content/res/XmlBlock$Parser;
 Landroid/content/res/XmlBlock;
 Landroid/content/res/XmlResourceParser;
 Landroid/content/res/loader/AssetsProvider;
@@ -34659,7 +34670,6 @@
 Landroid/database/ContentObservable;
 Landroid/database/ContentObserver$$ExternalSyntheticLambda0;
 Landroid/database/ContentObserver$$ExternalSyntheticLambda1;
-Landroid/database/ContentObserver$Transport;
 Landroid/database/ContentObserver;
 Landroid/database/CrossProcessCursor;
 Landroid/database/CrossProcessCursorWrapper;
@@ -34678,7 +34688,6 @@
 Landroid/database/DatabaseUtils;
 Landroid/database/DefaultDatabaseErrorHandler;
 Landroid/database/IBulkCursor;
-Landroid/database/IContentObserver$Stub$Proxy;
 Landroid/database/IContentObserver$Stub;
 Landroid/database/IContentObserver;
 Landroid/database/MatrixCursor$RowBuilder;
@@ -35448,9 +35457,6 @@
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda0;
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda1;
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda2;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda3;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda4;
-Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda5;
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper;
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback-IA;
 Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback;
@@ -35495,7 +35501,6 @@
 Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0;
 Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;
 Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback-IA;
-Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;
 Landroid/hardware/display/DisplayManagerGlobal;
 Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;
 Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;
@@ -35511,7 +35516,6 @@
 Landroid/hardware/display/IDisplayManager$Stub$Proxy;
 Landroid/hardware/display/IDisplayManager$Stub;
 Landroid/hardware/display/IDisplayManager;
-Landroid/hardware/display/IDisplayManagerCallback$Stub$Proxy;
 Landroid/hardware/display/IDisplayManagerCallback$Stub;
 Landroid/hardware/display/IDisplayManagerCallback;
 Landroid/hardware/display/IVirtualDisplayCallback$Stub$Proxy;
@@ -38243,7 +38247,6 @@
 Landroid/net/INetworkManagementEventObserver$Stub$Proxy;
 Landroid/net/INetworkManagementEventObserver$Stub;
 Landroid/net/INetworkManagementEventObserver;
-Landroid/net/INetworkPolicyListener$Stub$Proxy;
 Landroid/net/INetworkPolicyListener$Stub;
 Landroid/net/INetworkPolicyListener;
 Landroid/net/INetworkPolicyManager$Stub$Proxy;
@@ -38268,7 +38271,6 @@
 Landroid/net/LocalSocketAddress$Namespace;
 Landroid/net/LocalSocketAddress;
 Landroid/net/LocalSocketImpl$SocketInputStream;
-Landroid/net/LocalSocketImpl$SocketOutputStream;
 Landroid/net/LocalSocketImpl;
 Landroid/net/MatchAllNetworkSpecifier$1;
 Landroid/net/MatchAllNetworkSpecifier;
@@ -38319,17 +38321,13 @@
 Landroid/net/Uri$AbstractPart;
 Landroid/net/Uri$Builder;
 Landroid/net/Uri$HierarchicalUri-IA;
-Landroid/net/Uri$HierarchicalUri;
 Landroid/net/Uri$NotCachedHolder;
 Landroid/net/Uri$OpaqueUri-IA;
-Landroid/net/Uri$OpaqueUri;
 Landroid/net/Uri$Part$EmptyPart;
 Landroid/net/Uri$Part;
 Landroid/net/Uri$PathPart;
-Landroid/net/Uri$PathSegments;
 Landroid/net/Uri$PathSegmentsBuilder;
 Landroid/net/Uri$StringUri-IA;
-Landroid/net/Uri$StringUri;
 Landroid/net/Uri-IA;
 Landroid/net/Uri;
 Landroid/net/UriCodec;
@@ -38577,7 +38575,6 @@
 Landroid/os/BinderProxy$BinderProxyMapSizeException;
 Landroid/os/BinderProxy$NoImagePreloadHolder;
 Landroid/os/BinderProxy$ProxyMap;
-Landroid/os/BinderProxy;
 Landroid/os/BluetoothServiceManager$ServiceRegisterer;
 Landroid/os/BluetoothServiceManager;
 Landroid/os/BugreportManager;
@@ -38728,8 +38725,6 @@
 Landroid/os/IPowerManager$Stub$Proxy;
 Landroid/os/IPowerManager$Stub;
 Landroid/os/IPowerManager;
-Landroid/os/IPowerStatsService$Stub;
-Landroid/os/IPowerStatsService;
 Landroid/os/IProcessInfoService$Stub;
 Landroid/os/IProcessInfoService;
 Landroid/os/IProgressListener$Stub$Proxy;
@@ -38828,7 +38823,6 @@
 Landroid/os/PackageTagsList$1;
 Landroid/os/PackageTagsList;
 Landroid/os/Parcel$1;
-Landroid/os/Parcel$2;
 Landroid/os/Parcel$LazyValue;
 Landroid/os/Parcel$ReadWriteHelper;
 Landroid/os/Parcel$SquashReadHelper;
@@ -38965,7 +38959,6 @@
 Landroid/os/StrictMode;
 Landroid/os/SynchronousResultReceiver$Result;
 Landroid/os/SynchronousResultReceiver;
-Landroid/os/SystemClock$1;
 Landroid/os/SystemClock$2;
 Landroid/os/SystemClock$3;
 Landroid/os/SystemClock;
@@ -39142,7 +39135,6 @@
 Landroid/permission/ILegacyPermissionManager$Stub$Proxy;
 Landroid/permission/ILegacyPermissionManager$Stub;
 Landroid/permission/ILegacyPermissionManager;
-Landroid/permission/IOnPermissionsChangeListener$Stub$Proxy;
 Landroid/permission/IOnPermissionsChangeListener$Stub;
 Landroid/permission/IOnPermissionsChangeListener;
 Landroid/permission/IPermissionChecker$Stub$Proxy;
@@ -39160,7 +39152,6 @@
 Landroid/permission/PermissionControllerManager;
 Landroid/permission/PermissionManager$1;
 Landroid/permission/PermissionManager$2;
-Landroid/permission/PermissionManager$OnPermissionsChangeListenerDelegate;
 Landroid/permission/PermissionManager$PackageNamePermissionQuery;
 Landroid/permission/PermissionManager$PermissionQuery;
 Landroid/permission/PermissionManager$SplitPermissionInfo-IA;
@@ -39569,8 +39560,6 @@
 Landroid/service/autofill/AutofillServiceInfo;
 Landroid/service/autofill/Dataset$1;
 Landroid/service/autofill/Dataset;
-Landroid/service/autofill/FeatureFlags;
-Landroid/service/autofill/FeatureFlagsImpl;
 Landroid/service/autofill/FieldClassificationUserData;
 Landroid/service/autofill/FillContext$1;
 Landroid/service/autofill/FillContext;
@@ -39716,12 +39705,9 @@
 Landroid/service/notification/ConditionProviderService$H-IA;
 Landroid/service/notification/ConditionProviderService$H;
 Landroid/service/notification/ConditionProviderService$Provider-IA;
-Landroid/service/notification/ConditionProviderService$Provider;
 Landroid/service/notification/ConditionProviderService;
-Landroid/service/notification/IConditionProvider$Stub$Proxy;
 Landroid/service/notification/IConditionProvider$Stub;
 Landroid/service/notification/IConditionProvider;
-Landroid/service/notification/INotificationListener$Stub$Proxy;
 Landroid/service/notification/INotificationListener$Stub;
 Landroid/service/notification/INotificationListener;
 Landroid/service/notification/IStatusBarNotificationHolder$Stub$Proxy;
@@ -39733,7 +39719,6 @@
 Landroid/service/notification/NotificationListenerFilter$1;
 Landroid/service/notification/NotificationListenerFilter;
 Landroid/service/notification/NotificationListenerService$MyHandler;
-Landroid/service/notification/NotificationListenerService$NotificationListenerWrapper;
 Landroid/service/notification/NotificationListenerService$Ranking;
 Landroid/service/notification/NotificationListenerService$RankingMap$1;
 Landroid/service/notification/NotificationListenerService$RankingMap-IA;
@@ -40249,7 +40234,6 @@
 Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda62;
 Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda6;
 Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda9;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;
 Landroid/telephony/PhoneStateListener;
 Landroid/telephony/PhysicalChannelConfig$1;
 Landroid/telephony/PhysicalChannelConfig$Builder;
@@ -40353,7 +40337,6 @@
 Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda52;
 Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda63;
 Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda65;
-Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub;
 Landroid/telephony/TelephonyCallback$ImsCallDisconnectCauseListener;
 Landroid/telephony/TelephonyCallback$LinkCapacityEstimateChangedListener;
 Landroid/telephony/TelephonyCallback$MediaQualityStatusChangedListener;
@@ -40826,7 +40809,6 @@
 Landroid/text/TextFlags;
 Landroid/text/TextLine$DecorationInfo-IA;
 Landroid/text/TextLine$DecorationInfo;
-Landroid/text/TextLine$LineInfo;
 Landroid/text/TextLine;
 Landroid/text/TextPaint;
 Landroid/text/TextShaper$GlyphsConsumer;
@@ -41048,7 +41030,6 @@
 Landroid/util/AndroidException;
 Landroid/util/AndroidRuntimeException;
 Landroid/util/ArrayMap$1;
-Landroid/util/ArrayMap;
 Landroid/util/ArraySet$1;
 Landroid/util/ArraySet;
 Landroid/util/AtomicFile;
@@ -41118,11 +41099,6 @@
 Landroid/util/LongSparseLongArray;
 Landroid/util/LruCache;
 Landroid/util/MalformedJsonException;
-Landroid/util/MapCollections$ArrayIterator;
-Landroid/util/MapCollections$EntrySet;
-Landroid/util/MapCollections$KeySet;
-Landroid/util/MapCollections$MapIterator;
-Landroid/util/MapCollections$ValuesCollection;
 Landroid/util/MapCollections;
 Landroid/util/MathUtils;
 Landroid/util/MemoryIntArray$1;
@@ -41401,13 +41377,11 @@
 Landroid/view/ISurfaceControlViewHost;
 Landroid/view/ISurfaceControlViewHostParent$Stub;
 Landroid/view/ISurfaceControlViewHostParent;
-Landroid/view/ISystemGestureExclusionListener$Stub$Proxy;
 Landroid/view/ISystemGestureExclusionListener$Stub;
 Landroid/view/ISystemGestureExclusionListener;
 Landroid/view/IWallpaperVisibilityListener$Stub$Proxy;
 Landroid/view/IWallpaperVisibilityListener$Stub;
 Landroid/view/IWallpaperVisibilityListener;
-Landroid/view/IWindow$Stub$Proxy;
 Landroid/view/IWindow$Stub;
 Landroid/view/IWindow;
 Landroid/view/IWindowFocusObserver$Stub;
@@ -41797,7 +41771,6 @@
 Landroid/view/ViewRootImpl$6;
 Landroid/view/ViewRootImpl$7;
 Landroid/view/ViewRootImpl$8;
-Landroid/view/ViewRootImpl$9$$ExternalSyntheticLambda3;
 Landroid/view/ViewRootImpl$9;
 Landroid/view/ViewRootImpl$AccessibilityInteractionConnection;
 Landroid/view/ViewRootImpl$AccessibilityInteractionConnectionManager;
@@ -41950,8 +41923,6 @@
 Landroid/view/accessibility/CaptioningManager$MyContentObserver;
 Landroid/view/accessibility/CaptioningManager;
 Landroid/view/accessibility/DirectAccessibilityConnection;
-Landroid/view/accessibility/FeatureFlags;
-Landroid/view/accessibility/FeatureFlagsImpl;
 Landroid/view/accessibility/Flags;
 Landroid/view/accessibility/IAccessibilityEmbeddedConnection;
 Landroid/view/accessibility/IAccessibilityInteractionConnection$Stub$Proxy;
@@ -42022,7 +41993,8 @@
 Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda13;
 Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda14;
 Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda16;
-Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda6;
+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;
@@ -42131,8 +42103,6 @@
 Landroid/view/inputmethod/ExtractedText;
 Landroid/view/inputmethod/ExtractedTextRequest$1;
 Landroid/view/inputmethod/ExtractedTextRequest;
-Landroid/view/inputmethod/FeatureFlags;
-Landroid/view/inputmethod/FeatureFlagsImpl;
 Landroid/view/inputmethod/Flags;
 Landroid/view/inputmethod/HandwritingGesture;
 Landroid/view/inputmethod/IAccessibilityInputMethodSessionInvoker$$ExternalSyntheticLambda0;
@@ -42903,7 +42873,6 @@
 Landroid/window/BackMotionEvent;
 Landroid/window/BackNavigationInfo$1;
 Landroid/window/BackNavigationInfo;
-Landroid/window/BackProgressAnimator$$ExternalSyntheticLambda0;
 Landroid/window/BackProgressAnimator$1;
 Landroid/window/BackProgressAnimator$ProgressCallback;
 Landroid/window/BackProgressAnimator;
@@ -43039,8 +43008,6 @@
 Landroid/window/WindowContainerTransaction;
 Landroid/window/WindowContext;
 Landroid/window/WindowContextController;
-Landroid/window/WindowContextInfo$1;
-Landroid/window/WindowContextInfo;
 Landroid/window/WindowInfosListener$DisplayInfo;
 Landroid/window/WindowInfosListener;
 Landroid/window/WindowMetricsController$$ExternalSyntheticLambda0;
@@ -43137,8 +43104,6 @@
 Lcom/android/framework/protobuf/nano/InvalidProtocolBufferNanoException;
 Lcom/android/framework/protobuf/nano/MessageNano;
 Lcom/android/framework/protobuf/nano/WireFormatNano;
-Lcom/android/graphics/hwui/flags/FeatureFlags;
-Lcom/android/graphics/hwui/flags/FeatureFlagsImpl;
 Lcom/android/graphics/hwui/flags/Flags;
 Lcom/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet;
 Lcom/android/i18n/phonenumbers/AsYouTypeFormatter;
@@ -43258,10 +43223,8 @@
 Lcom/android/i18n/timezone/internal/MemoryMappedFile;
 Lcom/android/i18n/timezone/internal/NioBufferIterator;
 Lcom/android/i18n/util/Log;
-Lcom/android/icu/charset/CharsetDecoderICU;
 Lcom/android/icu/charset/CharsetEncoderICU;
 Lcom/android/icu/charset/CharsetFactory;
-Lcom/android/icu/charset/CharsetICU;
 Lcom/android/icu/charset/NativeConverter;
 Lcom/android/icu/text/CompatibleDecimalFormatFactory;
 Lcom/android/icu/text/DateSorterBridge;
@@ -43688,13 +43651,11 @@
 Lcom/android/internal/app/IAppOpsActiveCallback$Stub$Proxy;
 Lcom/android/internal/app/IAppOpsActiveCallback$Stub;
 Lcom/android/internal/app/IAppOpsActiveCallback;
-Lcom/android/internal/app/IAppOpsAsyncNotedCallback$Stub$Proxy;
 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$Proxy;
 Lcom/android/internal/app/IAppOpsNotedCallback$Stub;
 Lcom/android/internal/app/IAppOpsNotedCallback;
 Lcom/android/internal/app/IAppOpsService$Stub$Proxy;
@@ -43848,7 +43809,6 @@
 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$OnAnimationEndListener;
 Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$ViewProperty;
 Lcom/android/internal/dynamicanimation/animation/DynamicAnimation;
 Lcom/android/internal/dynamicanimation/animation/Force;
@@ -44050,7 +44010,6 @@
 Lcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch;
 Lcom/android/internal/os/CachedDeviceState;
 Lcom/android/internal/os/ClassLoaderFactory;
-Lcom/android/internal/os/Clock$1;
 Lcom/android/internal/os/Clock;
 Lcom/android/internal/os/FuseAppLoop$1;
 Lcom/android/internal/os/FuseAppLoop;
@@ -44449,7 +44408,6 @@
 Lcom/android/internal/telephony/IOns$Stub$Proxy;
 Lcom/android/internal/telephony/IOns$Stub;
 Lcom/android/internal/telephony/IOns;
-Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;
 Lcom/android/internal/telephony/IPhoneStateListener$Stub;
 Lcom/android/internal/telephony/IPhoneStateListener;
 Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;
@@ -45831,7 +45789,6 @@
 Lcom/android/internal/util/XmlPullParserWrapper;
 Lcom/android/internal/util/XmlSerializerWrapper;
 Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;
-Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;
 Lcom/android/internal/util/XmlUtils$ReadMapCallback;
 Lcom/android/internal/util/XmlUtils$WriteMapCallback;
 Lcom/android/internal/util/XmlUtils;
@@ -45877,7 +45834,6 @@
 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/PooledLambdaImpl;
 Lcom/android/internal/util/function/pooled/PooledPredicate;
 Lcom/android/internal/util/function/pooled/PooledRunnable;
 Lcom/android/internal/util/function/pooled/PooledSupplier$OfDouble;
@@ -46015,7 +45971,6 @@
 Lcom/android/internal/widget/floatingtoolbar/FloatingToolbar$$ExternalSyntheticLambda1;
 Lcom/android/internal/widget/floatingtoolbar/FloatingToolbar;
 Lcom/android/internal/widget/floatingtoolbar/FloatingToolbarPopup;
-Lcom/android/internal/widget/remotecompose/player/RemoteComposePlayer$ClickCallbacks;
 Lcom/android/media/flags/Flags;
 Lcom/android/modules/expresslog/Counter;
 Lcom/android/modules/expresslog/MetricIds;
@@ -46072,7 +46027,6 @@
 Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
 Lcom/android/okhttp/HttpUrl$Builder;
 Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/HttpsHandler;
 Lcom/android/okhttp/Interceptor$Chain;
 Lcom/android/okhttp/MediaType;
 Lcom/android/okhttp/OkCacheContainer;
@@ -46153,7 +46107,6 @@
 Lcom/android/okhttp/internal/http/StreamAllocation;
 Lcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;
 Lcom/android/okhttp/internal/huc/HttpURLConnectionImpl;
-Lcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;
 Lcom/android/okhttp/internal/io/FileSystem$1;
 Lcom/android/okhttp/internal/io/FileSystem;
 Lcom/android/okhttp/internal/io/RealConnection;
@@ -46186,7 +46139,6 @@
 Lcom/android/okhttp/okio/Okio;
 Lcom/android/okhttp/okio/RealBufferedSink$1;
 Lcom/android/okhttp/okio/RealBufferedSink;
-Lcom/android/okhttp/okio/RealBufferedSource$1;
 Lcom/android/okhttp/okio/RealBufferedSource;
 Lcom/android/okhttp/okio/Segment;
 Lcom/android/okhttp/okio/SegmentPool;
@@ -46303,10 +46255,20 @@
 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;
@@ -46315,6 +46277,7 @@
 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;
@@ -46337,7 +46300,6 @@
 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/BCDSAPublicKey;
 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;
@@ -46353,6 +46315,7 @@
 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;
@@ -46368,7 +46331,6 @@
 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$ECB;
 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;
@@ -46402,6 +46364,7 @@
 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;
@@ -46422,6 +46385,7 @@
 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;
@@ -46436,8 +46400,6 @@
 Lcom/android/org/bouncycastle/util/io/Streams;
 Lcom/android/org/kxml2/io/KXmlParser$ContentSource;
 Lcom/android/org/kxml2/io/KXmlParser$ValueContext;
-Lcom/android/org/kxml2/io/KXmlParser;
-Lcom/android/org/kxml2/io/KXmlSerializer;
 Lcom/android/phone/ecc/nano/CodedInputByteBufferNano;
 Lcom/android/phone/ecc/nano/CodedOutputByteBufferNano$OutOfSpaceException;
 Lcom/android/phone/ecc/nano/CodedOutputByteBufferNano;
@@ -46453,8 +46415,6 @@
 Lcom/android/phone/ecc/nano/ProtobufEccData$EccInfo;
 Lcom/android/phone/ecc/nano/UnknownFieldData;
 Lcom/android/phone/ecc/nano/WireFormatNano;
-Lcom/android/sdksandbox/flags/FeatureFlags;
-Lcom/android/sdksandbox/flags/FeatureFlagsImpl;
 Lcom/android/sdksandbox/flags/Flags;
 Lcom/android/server/AppWidgetBackupBridge;
 Lcom/android/server/LocalServices;
@@ -46598,9 +46558,7 @@
 Ldalvik/system/AppSpecializationHooks;
 Ldalvik/system/BaseDexClassLoader$Reporter;
 Ldalvik/system/BaseDexClassLoader;
-Ldalvik/system/BlockGuard$1;
 Ldalvik/system/BlockGuard$2;
-Ldalvik/system/BlockGuard$3;
 Ldalvik/system/BlockGuard$BlockGuardPolicyException;
 Ldalvik/system/BlockGuard$Policy;
 Ldalvik/system/BlockGuard$VmPolicy;
@@ -47058,7 +47016,6 @@
 Ljava/awt/font/TextAttribute;
 Ljava/io/Bits;
 Ljava/io/BufferedInputStream;
-Ljava/io/BufferedOutputStream;
 Ljava/io/BufferedReader;
 Ljava/io/BufferedWriter;
 Ljava/io/ByteArrayInputStream;
@@ -47120,16 +47077,16 @@
 Ljava/io/ObjectInputStream;
 Ljava/io/ObjectOutput;
 Ljava/io/ObjectOutputStream$1;
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;
 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/ObjectOutputStream;
 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;
@@ -47173,7 +47130,6 @@
 Ljava/io/SyncFailedException;
 Ljava/io/UTFDataFormatException;
 Ljava/io/UncheckedIOException;
-Ljava/io/UnixFileSystem;
 Ljava/io/UnsupportedEncodingException;
 Ljava/io/WriteAbortedException;
 Ljava/io/Writer;
@@ -47203,10 +47159,15 @@
 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;
@@ -47215,6 +47176,7 @@
 Ljava/lang/CloneNotSupportedException;
 Ljava/lang/Cloneable;
 Ljava/lang/Comparable;
+Ljava/lang/CompoundEnumeration;
 Ljava/lang/Daemons$Daemon;
 Ljava/lang/Daemons$FinalizerDaemon;
 Ljava/lang/Daemons$FinalizerWatchdogDaemon;
@@ -47224,7 +47186,9 @@
 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;
@@ -47302,7 +47266,6 @@
 Ljava/lang/String$$ExternalSyntheticLambda2;
 Ljava/lang/String$$ExternalSyntheticLambda3;
 Ljava/lang/String$CaseInsensitiveComparator-IA;
-Ljava/lang/String$CaseInsensitiveComparator;
 Ljava/lang/String;
 Ljava/lang/StringBuffer;
 Ljava/lang/StringBuilder;
@@ -47326,11 +47289,9 @@
 Ljava/lang/Thread;
 Ljava/lang/ThreadDeath;
 Ljava/lang/ThreadGroup;
-Ljava/lang/ThreadLocal$SuppliedThreadLocal;
 Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
 Ljava/lang/ThreadLocal$ThreadLocalMap-IA;
 Ljava/lang/ThreadLocal$ThreadLocalMap;
-Ljava/lang/ThreadLocal;
 Ljava/lang/Throwable$PrintStreamOrWriter-IA;
 Ljava/lang/Throwable$PrintStreamOrWriter;
 Ljava/lang/Throwable$SentinelHolder;
@@ -47389,13 +47350,16 @@
 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;
@@ -47455,7 +47419,9 @@
 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;
@@ -47560,9 +47526,7 @@
 Ljava/net/Inet6Address$Inet6AddressHolder-IA;
 Ljava/net/Inet6Address$Inet6AddressHolder;
 Ljava/net/Inet6Address;
-Ljava/net/Inet6AddressImpl;
 Ljava/net/InetAddress$1;
-Ljava/net/InetAddress$InetAddressHolder;
 Ljava/net/InetAddress;
 Ljava/net/InetAddressImpl;
 Ljava/net/InetSocketAddress$InetSocketAddressHolder-IA;
@@ -47597,10 +47561,8 @@
 Ljava/net/SocketException;
 Ljava/net/SocketImpl;
 Ljava/net/SocketImplFactory;
-Ljava/net/SocketInputStream;
 Ljava/net/SocketOption;
 Ljava/net/SocketOptions;
-Ljava/net/SocketOutputStream;
 Ljava/net/SocketPermission;
 Ljava/net/SocketTimeoutException;
 Ljava/net/SocksConsts;
@@ -47627,18 +47589,13 @@
 Ljava/nio/ByteBuffer;
 Ljava/nio/ByteBufferAsCharBuffer;
 Ljava/nio/ByteBufferAsDoubleBuffer;
-Ljava/nio/ByteBufferAsFloatBuffer;
-Ljava/nio/ByteBufferAsIntBuffer;
 Ljava/nio/ByteBufferAsLongBuffer;
 Ljava/nio/ByteBufferAsShortBuffer;
 Ljava/nio/ByteOrder;
 Ljava/nio/CharBuffer;
 Ljava/nio/DirectByteBuffer$MemoryRef;
-Ljava/nio/DirectByteBuffer;
 Ljava/nio/DoubleBuffer;
 Ljava/nio/FloatBuffer;
-Ljava/nio/HeapByteBuffer;
-Ljava/nio/HeapCharBuffer;
 Ljava/nio/HeapIntBuffer;
 Ljava/nio/IntBuffer;
 Ljava/nio/InvalidMarkException;
@@ -47790,7 +47747,6 @@
 Ljava/security/KeyStore;
 Ljava/security/KeyStoreException;
 Ljava/security/KeyStoreSpi;
-Ljava/security/MessageDigest$Delegate;
 Ljava/security/MessageDigest;
 Ljava/security/MessageDigestSpi;
 Ljava/security/NoSuchAlgorithmException;
@@ -47814,12 +47770,12 @@
 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$Delegate;
 Ljava/security/Signature;
 Ljava/security/SignatureException;
 Ljava/security/SignatureSpi;
@@ -47952,7 +47908,6 @@
 Ljava/text/RuleBasedCollator;
 Ljava/text/SimpleDateFormat;
 Ljava/text/StringCharacterIterator;
-Ljava/time/Clock$SystemClock;
 Ljava/time/Clock;
 Ljava/time/DateTimeException;
 Ljava/time/DayOfWeek;
@@ -47971,7 +47926,6 @@
 Ljava/time/Year;
 Ljava/time/ZoneId;
 Ljava/time/ZoneOffset;
-Ljava/time/ZoneRegion;
 Ljava/time/ZonedDateTime$$ExternalSyntheticLambda0;
 Ljava/time/ZonedDateTime$1;
 Ljava/time/ZonedDateTime;
@@ -48037,6 +47991,8 @@
 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;
@@ -48062,7 +48018,6 @@
 Ljava/time/zone/ZoneRulesProvider;
 Ljava/util/AbstractCollection;
 Ljava/util/AbstractList$Itr-IA;
-Ljava/util/AbstractList$Itr;
 Ljava/util/AbstractList$ListItr;
 Ljava/util/AbstractList$RandomAccessSpliterator;
 Ljava/util/AbstractList$RandomAccessSubList;
@@ -48071,23 +48026,18 @@
 Ljava/util/AbstractList;
 Ljava/util/AbstractMap$1;
 Ljava/util/AbstractMap$2$1;
-Ljava/util/AbstractMap$2;
 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$DeqIterator;
-Ljava/util/ArrayDeque$DescendingIterator;
 Ljava/util/ArrayDeque;
 Ljava/util/ArrayList$ArrayListSpliterator;
-Ljava/util/ArrayList$Itr;
 Ljava/util/ArrayList$ListItr;
-Ljava/util/ArrayList$SubList$1;
 Ljava/util/ArrayList$SubList$2;
-Ljava/util/ArrayList$SubList;
 Ljava/util/ArrayList;
 Ljava/util/ArrayPrefixHelpers$CumulateTask;
 Ljava/util/ArrayPrefixHelpers$DoubleCumulateTask;
@@ -48097,8 +48047,6 @@
 Ljava/util/Arrays$$ExternalSyntheticLambda1;
 Ljava/util/Arrays$$ExternalSyntheticLambda2;
 Ljava/util/Arrays$$ExternalSyntheticLambda3;
-Ljava/util/Arrays$ArrayItr;
-Ljava/util/Arrays$ArrayList;
 Ljava/util/Arrays$NaturalOrder;
 Ljava/util/Arrays;
 Ljava/util/ArraysParallelSortHelpers$FJObject$Sorter;
@@ -48110,7 +48058,6 @@
 Ljava/util/Calendar$Builder;
 Ljava/util/Calendar;
 Ljava/util/Collection;
-Ljava/util/Collections$1;
 Ljava/util/Collections$2;
 Ljava/util/Collections$3;
 Ljava/util/Collections$AsLIFOQueue;
@@ -48126,48 +48073,31 @@
 Ljava/util/Collections$CheckedSortedSet;
 Ljava/util/Collections$CopiesList;
 Ljava/util/Collections$EmptyEnumeration;
-Ljava/util/Collections$EmptyIterator;
 Ljava/util/Collections$EmptyList-IA;
-Ljava/util/Collections$EmptyList;
 Ljava/util/Collections$EmptyListIterator;
 Ljava/util/Collections$EmptyMap-IA;
-Ljava/util/Collections$EmptyMap;
 Ljava/util/Collections$EmptySet-IA;
-Ljava/util/Collections$EmptySet;
 Ljava/util/Collections$ReverseComparator2;
 Ljava/util/Collections$ReverseComparator;
-Ljava/util/Collections$SetFromMap;
-Ljava/util/Collections$SingletonList;
-Ljava/util/Collections$SingletonMap;
-Ljava/util/Collections$SingletonSet;
-Ljava/util/Collections$SynchronizedCollection;
+Ljava/util/Collections$SequencedSetFromMap;
 Ljava/util/Collections$SynchronizedList;
-Ljava/util/Collections$SynchronizedMap;
 Ljava/util/Collections$SynchronizedNavigableMap;
 Ljava/util/Collections$SynchronizedNavigableSet;
-Ljava/util/Collections$SynchronizedRandomAccessList;
 Ljava/util/Collections$SynchronizedSet;
 Ljava/util/Collections$SynchronizedSortedMap;
 Ljava/util/Collections$SynchronizedSortedSet;
-Ljava/util/Collections$UnmodifiableCollection$1;
-Ljava/util/Collections$UnmodifiableCollection;
 Ljava/util/Collections$UnmodifiableList$1;
 Ljava/util/Collections$UnmodifiableList;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet;
-Ljava/util/Collections$UnmodifiableMap;
 Ljava/util/Collections$UnmodifiableNavigableMap$EmptyNavigableMap;
 Ljava/util/Collections$UnmodifiableNavigableMap;
 Ljava/util/Collections$UnmodifiableNavigableSet$EmptyNavigableSet;
 Ljava/util/Collections$UnmodifiableNavigableSet;
-Ljava/util/Collections$UnmodifiableRandomAccessList;
-Ljava/util/Collections$UnmodifiableSet;
+Ljava/util/Collections$UnmodifiableSequencedCollection;
+Ljava/util/Collections$UnmodifiableSequencedMap;
+Ljava/util/Collections$UnmodifiableSequencedSet;
 Ljava/util/Collections$UnmodifiableSortedMap;
-Ljava/util/Collections$UnmodifiableSortedSet;
 Ljava/util/Collections;
 Ljava/util/ComparableTimSort;
-Ljava/util/Comparator$$ExternalSyntheticLambda0;
 Ljava/util/Comparator$$ExternalSyntheticLambda1;
 Ljava/util/Comparator$$ExternalSyntheticLambda2;
 Ljava/util/Comparator$$ExternalSyntheticLambda3;
@@ -48181,6 +48111,7 @@
 Ljava/util/Date;
 Ljava/util/Deque;
 Ljava/util/Dictionary;
+Ljava/util/DoubleSummaryStatistics;
 Ljava/util/DualPivotQuicksort$Sorter-IA;
 Ljava/util/DualPivotQuicksort$Sorter;
 Ljava/util/DualPivotQuicksort;
@@ -48220,31 +48151,23 @@
 Ljava/util/Formatter$FormatString;
 Ljava/util/Formatter;
 Ljava/util/FormatterClosedException;
-Ljava/util/GregorianCalendar;
-Ljava/util/HashMap$EntryIterator;
-Ljava/util/HashMap$EntrySet;
 Ljava/util/HashMap$EntrySpliterator;
 Ljava/util/HashMap$HashIterator;
 Ljava/util/HashMap$HashMapSpliterator;
-Ljava/util/HashMap$KeyIterator;
-Ljava/util/HashMap$KeySet;
 Ljava/util/HashMap$KeySpliterator;
-Ljava/util/HashMap$Node;
-Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$ValueIterator;
+Ljava/util/HashMap$UnsafeHolder;
 Ljava/util/HashMap$ValueSpliterator;
-Ljava/util/HashMap$Values;
 Ljava/util/HashMap;
 Ljava/util/HashSet;
 Ljava/util/Hashtable$EntrySet-IA;
 Ljava/util/Hashtable$EntrySet;
-Ljava/util/Hashtable$Enumerator;
 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;
@@ -48273,16 +48196,11 @@
 Ljava/util/ImmutableCollections$AbstractImmutableList;
 Ljava/util/ImmutableCollections$AbstractImmutableMap;
 Ljava/util/ImmutableCollections$AbstractImmutableSet;
-Ljava/util/ImmutableCollections$List12;
-Ljava/util/ImmutableCollections$ListItr;
+Ljava/util/ImmutableCollections$Access$1;
+Ljava/util/ImmutableCollections$Access;
 Ljava/util/ImmutableCollections$ListN-IA;
-Ljava/util/ImmutableCollections$ListN;
-Ljava/util/ImmutableCollections$Map1;
 Ljava/util/ImmutableCollections$MapN$1;
 Ljava/util/ImmutableCollections$MapN$MapNIterator;
-Ljava/util/ImmutableCollections$MapN;
-Ljava/util/ImmutableCollections$Set12;
-Ljava/util/ImmutableCollections$SetN;
 Ljava/util/ImmutableCollections$SubList;
 Ljava/util/ImmutableCollections;
 Ljava/util/InputMismatchException;
@@ -48290,18 +48208,11 @@
 Ljava/util/JumboEnumSet$EnumSetIterator;
 Ljava/util/JumboEnumSet;
 Ljava/util/KeyValueHolder;
-Ljava/util/LinkedHashMap$LinkedEntryIterator;
-Ljava/util/LinkedHashMap$LinkedEntrySet;
 Ljava/util/LinkedHashMap$LinkedHashIterator;
-Ljava/util/LinkedHashMap$LinkedKeyIterator;
-Ljava/util/LinkedHashMap$LinkedKeySet;
-Ljava/util/LinkedHashMap$LinkedValueIterator;
-Ljava/util/LinkedHashMap$LinkedValues;
+Ljava/util/LinkedHashMap$ReversedLinkedHashMapView;
 Ljava/util/LinkedHashMap;
 Ljava/util/LinkedHashSet;
 Ljava/util/LinkedList$DescendingIterator-IA;
-Ljava/util/LinkedList$DescendingIterator;
-Ljava/util/LinkedList$ListItr;
 Ljava/util/LinkedList$Node;
 Ljava/util/LinkedList;
 Ljava/util/List;
@@ -48321,6 +48232,7 @@
 Ljava/util/Locale$NoImagePreloadHolder;
 Ljava/util/Locale-IA;
 Ljava/util/Locale;
+Ljava/util/LongSummaryStatistics;
 Ljava/util/Map$Entry;
 Ljava/util/Map;
 Ljava/util/MissingFormatArgumentException;
@@ -48338,8 +48250,8 @@
 Ljava/util/PrimitiveIterator$OfInt$$ExternalSyntheticLambda0;
 Ljava/util/PrimitiveIterator$OfInt;
 Ljava/util/PrimitiveIterator;
-Ljava/util/PriorityQueue$Itr;
 Ljava/util/PriorityQueue;
+Ljava/util/Properties$EntrySet;
 Ljava/util/Properties$LineReader;
 Ljava/util/Properties;
 Ljava/util/PropertyPermission;
@@ -48362,10 +48274,19 @@
 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;
@@ -48392,6 +48313,7 @@
 Ljava/util/TaskQueue;
 Ljava/util/TimSort;
 Ljava/util/TimeZone;
+Ljava/util/Timer$ThreadReaper;
 Ljava/util/Timer;
 Ljava/util/TimerTask;
 Ljava/util/TimerThread;
@@ -48399,18 +48321,12 @@
 Ljava/util/TreeMap$AscendingSubMap$AscendingEntrySetView;
 Ljava/util/TreeMap$AscendingSubMap;
 Ljava/util/TreeMap$DescendingSubMap;
-Ljava/util/TreeMap$EntryIterator;
-Ljava/util/TreeMap$EntrySet;
-Ljava/util/TreeMap$KeyIterator;
-Ljava/util/TreeMap$KeySet;
 Ljava/util/TreeMap$NavigableSubMap$DescendingSubMapKeyIterator;
 Ljava/util/TreeMap$NavigableSubMap$EntrySetView;
 Ljava/util/TreeMap$NavigableSubMap$SubMapEntryIterator;
 Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;
-Ljava/util/TreeMap$NavigableSubMap$SubMapKeyIterator;
 Ljava/util/TreeMap$NavigableSubMap;
 Ljava/util/TreeMap$PrivateEntryIterator;
-Ljava/util/TreeMap$TreeMapEntry;
 Ljava/util/TreeMap$ValueIterator;
 Ljava/util/TreeMap$Values;
 Ljava/util/TreeMap;
@@ -48432,9 +48348,7 @@
 Ljava/util/WeakHashMap$EntrySet;
 Ljava/util/WeakHashMap$HashIterator;
 Ljava/util/WeakHashMap$KeyIterator-IA;
-Ljava/util/WeakHashMap$KeyIterator;
 Ljava/util/WeakHashMap$KeySet-IA;
-Ljava/util/WeakHashMap$KeySet;
 Ljava/util/WeakHashMap$ValueIterator-IA;
 Ljava/util/WeakHashMap$ValueIterator;
 Ljava/util/WeakHashMap$Values-IA;
@@ -48462,8 +48376,6 @@
 Ljava/util/concurrent/ConcurrentHashMap$BulkTask;
 Ljava/util/concurrent/ConcurrentHashMap$CollectionView;
 Ljava/util/concurrent/ConcurrentHashMap$CounterCell;
-Ljava/util/concurrent/ConcurrentHashMap$EntryIterator;
-Ljava/util/concurrent/ConcurrentHashMap$EntrySetView;
 Ljava/util/concurrent/ConcurrentHashMap$ForEachEntryTask;
 Ljava/util/concurrent/ConcurrentHashMap$ForEachKeyTask;
 Ljava/util/concurrent/ConcurrentHashMap$ForEachMappingTask;
@@ -48476,7 +48388,6 @@
 Ljava/util/concurrent/ConcurrentHashMap$KeyIterator;
 Ljava/util/concurrent/ConcurrentHashMap$KeySetView;
 Ljava/util/concurrent/ConcurrentHashMap$KeySpliterator;
-Ljava/util/concurrent/ConcurrentHashMap$MapEntry;
 Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;
 Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;
 Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;
@@ -48507,13 +48418,11 @@
 Ljava/util/concurrent/ConcurrentHashMap$Traverser;
 Ljava/util/concurrent/ConcurrentHashMap$TreeBin;
 Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;
-Ljava/util/concurrent/ConcurrentHashMap$ValuesView;
 Ljava/util/concurrent/ConcurrentHashMap;
 Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
 Ljava/util/concurrent/ConcurrentLinkedDeque;
 Ljava/util/concurrent/ConcurrentLinkedQueue$$ExternalSyntheticLambda0;
-Ljava/util/concurrent/ConcurrentLinkedQueue$Itr;
+Ljava/util/concurrent/ConcurrentLinkedQueue$$ExternalSyntheticLambda2;
 Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
 Ljava/util/concurrent/ConcurrentLinkedQueue;
 Ljava/util/concurrent/ConcurrentMap$$ExternalSyntheticLambda0;
@@ -48528,8 +48437,6 @@
 Ljava/util/concurrent/ConcurrentSkipListMap;
 Ljava/util/concurrent/ConcurrentSkipListSet;
 Ljava/util/concurrent/CopyOnWriteArrayList$$ExternalSyntheticLambda2;
-Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;
-Ljava/util/concurrent/CopyOnWriteArrayList;
 Ljava/util/concurrent/CopyOnWriteArraySet;
 Ljava/util/concurrent/CountDownLatch$Sync;
 Ljava/util/concurrent/CountDownLatch;
@@ -48541,8 +48448,6 @@
 Ljava/util/concurrent/ExecutorService;
 Ljava/util/concurrent/Executors$DefaultThreadFactory;
 Ljava/util/concurrent/Executors$DelegatedExecutorService;
-Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService;
-Ljava/util/concurrent/Executors$FinalizableDelegatedExecutorService;
 Ljava/util/concurrent/Executors$RunnableAdapter;
 Ljava/util/concurrent/Executors;
 Ljava/util/concurrent/ForkJoinPool$1;
@@ -48575,8 +48480,6 @@
 Ljava/util/concurrent/ScheduledFuture;
 Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr;
 Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;
 Ljava/util/concurrent/Semaphore$FairSync;
 Ljava/util/concurrent/Semaphore$NonfairSync;
 Ljava/util/concurrent/Semaphore$Sync;
@@ -48591,8 +48494,6 @@
 Ljava/util/concurrent/ThreadLocalRandom;
 Ljava/util/concurrent/ThreadPoolExecutor$AbortPolicy;
 Ljava/util/concurrent/ThreadPoolExecutor$DiscardPolicy;
-Ljava/util/concurrent/ThreadPoolExecutor$Worker;
-Ljava/util/concurrent/ThreadPoolExecutor;
 Ljava/util/concurrent/TimeUnit$1;
 Ljava/util/concurrent/TimeUnit;
 Ljava/util/concurrent/TimeoutException;
@@ -48631,11 +48532,9 @@
 Ljava/util/concurrent/locks/ReentrantLock;
 Ljava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;
 Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;
 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$WriteLock;
 Ljava/util/concurrent/locks/ReentrantReadWriteLock;
 Ljava/util/function/BiConsumer;
 Ljava/util/function/BiFunction$$ExternalSyntheticLambda0;
@@ -48651,8 +48550,8 @@
 Ljava/util/function/DoubleSupplier;
 Ljava/util/function/DoubleUnaryOperator$$ExternalSyntheticLambda0;
 Ljava/util/function/DoubleUnaryOperator$$ExternalSyntheticLambda1;
-Ljava/util/function/DoubleUnaryOperator$$ExternalSyntheticLambda2;
 Ljava/util/function/DoubleUnaryOperator;
+Ljava/util/function/Function$$ExternalSyntheticLambda0;
 Ljava/util/function/Function$$ExternalSyntheticLambda1;
 Ljava/util/function/Function$$ExternalSyntheticLambda2;
 Ljava/util/function/Function;
@@ -48739,11 +48638,13 @@
 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;
@@ -48757,14 +48658,21 @@
 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;
@@ -48774,15 +48682,20 @@
 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$$ExternalSyntheticLambda78;
 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;
@@ -48790,16 +48703,21 @@
 Ljava/util/stream/Collectors;
 Ljava/util/stream/DistinctOps$1$1;
 Ljava/util/stream/DistinctOps$1$2;
-Ljava/util/stream/DistinctOps$1;
 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;
@@ -48808,19 +48726,24 @@
 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$4;
 Ljava/util/stream/IntPipeline$9;
-Ljava/util/stream/IntPipeline$Head;
 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;
@@ -48861,8 +48784,10 @@
 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;
@@ -48871,28 +48796,25 @@
 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$11$1;
-Ljava/util/stream/ReferencePipeline$11;
+Ljava/util/stream/ReferencePipeline$15$1;
 Ljava/util/stream/ReferencePipeline$2$1;
-Ljava/util/stream/ReferencePipeline$2;
 Ljava/util/stream/ReferencePipeline$3$1;
-Ljava/util/stream/ReferencePipeline$3;
 Ljava/util/stream/ReferencePipeline$4$1;
-Ljava/util/stream/ReferencePipeline$4;
 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$Head;
 Ljava/util/stream/ReferencePipeline$StatefulOp;
 Ljava/util/stream/ReferencePipeline$StatelessOp;
 Ljava/util/stream/ReferencePipeline;
@@ -48906,7 +48828,6 @@
 Ljava/util/stream/SliceOps$1;
 Ljava/util/stream/SliceOps;
 Ljava/util/stream/SortedOps$AbstractRefSortingSink;
-Ljava/util/stream/SortedOps$OfRef;
 Ljava/util/stream/SortedOps$RefSortingSink$$ExternalSyntheticLambda0;
 Ljava/util/stream/SortedOps$RefSortingSink;
 Ljava/util/stream/SortedOps$SizedRefSortingSink;
@@ -48944,19 +48865,27 @@
 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/GZIPInputStream;
 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/ZStreamRef;
+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;
@@ -49195,15 +49124,16 @@
 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$ASCIIToBinaryBuffer;
 Ljdk/internal/math/FloatingDecimal$ASCIIToBinaryConverter;
-Ljdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;
 Ljdk/internal/math/FloatingDecimal$BinaryToASCIIConverter;
 Ljdk/internal/math/FloatingDecimal$ExceptionalBinaryToASCIIBuffer;
 Ljdk/internal/math/FloatingDecimal$HexFloatPattern;
-Ljdk/internal/math/FloatingDecimal$PreparedASCIIToBinaryBuffer;
 Ljdk/internal/math/FloatingDecimal;
 Ljdk/internal/math/FormattedFloatingDecimal$1;
 Ljdk/internal/math/FormattedFloatingDecimal$Form;
@@ -49213,12 +49143,16 @@
 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;
@@ -49236,7 +49170,6 @@
 Llibcore/icu/TimeZoneNames;
 Llibcore/internal/StringPool;
 Llibcore/io/AsynchronousCloseMonitor;
-Llibcore/io/BlockGuardOs;
 Llibcore/io/BufferIterator;
 Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection$1;
 Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection;
@@ -49286,11 +49219,9 @@
 Llibcore/util/HexEncoding;
 Llibcore/util/NativeAllocationRegistry$CleanerRunner;
 Llibcore/util/NativeAllocationRegistry$CleanerThunk;
-Llibcore/util/NativeAllocationRegistry;
 Llibcore/util/Objects;
 Llibcore/util/SneakyThrow;
 Llibcore/util/XmlObjectFactory;
-Llibcore/util/ZoneInfo;
 Lorg/apache/harmony/dalvik/ddmc/Chunk;
 Lorg/apache/harmony/dalvik/ddmc/ChunkHandler;
 Lorg/apache/harmony/dalvik/ddmc/DdmServer;
@@ -49309,9 +49240,7 @@
 Lorg/apache/harmony/xml/dom/CharacterDataImpl;
 Lorg/apache/harmony/xml/dom/CommentImpl;
 Lorg/apache/harmony/xml/dom/DOMImplementationImpl;
-Lorg/apache/harmony/xml/dom/DocumentImpl;
 Lorg/apache/harmony/xml/dom/DocumentTypeImpl;
-Lorg/apache/harmony/xml/dom/ElementImpl;
 Lorg/apache/harmony/xml/dom/EntityReferenceImpl;
 Lorg/apache/harmony/xml/dom/InnerNodeImpl;
 Lorg/apache/harmony/xml/dom/LeafNodeImpl;
@@ -49319,7 +49248,6 @@
 Lorg/apache/harmony/xml/dom/NodeImpl;
 Lorg/apache/harmony/xml/dom/NodeListImpl;
 Lorg/apache/harmony/xml/dom/ProcessingInstructionImpl;
-Lorg/apache/harmony/xml/dom/TextImpl;
 Lorg/apache/harmony/xml/parsers/DocumentBuilderFactoryImpl;
 Lorg/apache/harmony/xml/parsers/DocumentBuilderImpl;
 Lorg/apache/harmony/xml/parsers/SAXParserFactoryImpl;
@@ -49339,7 +49267,6 @@
 Lorg/apache/http/params/CoreConnectionPNames;
 Lorg/apache/http/params/HttpConnectionParams;
 Lorg/apache/http/params/HttpParams;
-Lorg/ccil/cowan/tagsoup/AttributesImpl;
 Lorg/ccil/cowan/tagsoup/AutoDetector;
 Lorg/ccil/cowan/tagsoup/CommandLine;
 Lorg/ccil/cowan/tagsoup/Element;
@@ -49456,7 +49383,6 @@
 Lsun/nio/ch/FileChannelImpl$SimpleFileLockTable;
 Lsun/nio/ch/FileChannelImpl$Unmapper-IA;
 Lsun/nio/ch/FileChannelImpl$Unmapper;
-Lsun/nio/ch/FileChannelImpl;
 Lsun/nio/ch/FileDescriptorHolderSocketImpl;
 Lsun/nio/ch/FileDispatcher;
 Lsun/nio/ch/FileDispatcherImpl;
@@ -49509,7 +49435,6 @@
 Lsun/nio/fs/DefaultFileSystemProvider;
 Lsun/nio/fs/DynamicFileAttributeView;
 Lsun/nio/fs/FileOwnerAttributeViewImpl;
-Lsun/nio/fs/LinuxFileSystem;
 Lsun/nio/fs/LinuxFileSystemProvider;
 Lsun/nio/fs/NativeBuffer$Deallocator;
 Lsun/nio/fs/NativeBuffer;
@@ -49526,6 +49451,7 @@
 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;
@@ -49533,7 +49459,6 @@
 Lsun/nio/fs/UnixFileSystemProvider;
 Lsun/nio/fs/UnixMountEntry;
 Lsun/nio/fs/UnixNativeDispatcher;
-Lsun/nio/fs/UnixPath;
 Lsun/nio/fs/UnixSecureDirectoryStream;
 Lsun/nio/fs/Util;
 Lsun/reflect/Reflection;
@@ -49618,6 +49543,7 @@
 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;
@@ -50445,6 +50371,7 @@
 [Lsun/security/x509/NetscapeCertTypeExtension$MapEntry;
 [Lsun/security/x509/RDN;
 [Lsun/util/calendar/Era;
+[Lsun/util/locale/BaseLocale;
 [Lsun/util/logging/PlatformLogger$Level;
 [S
 [Z
diff --git a/config/preloaded-classes b/config/preloaded-classes
index da9228a..73907a4 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -25,6 +25,7 @@
 android.R$id
 android.R$styleable
 android.accessibilityservice.AccessibilityServiceInfo$1
+android.accessibilityservice.AccessibilityServiceInfo$DynamicPropertyDefaults
 android.accessibilityservice.AccessibilityServiceInfo
 android.accessibilityservice.AccessibilityShortcutInfo
 android.accessibilityservice.GestureDescription$MotionEventGenerator
@@ -211,7 +212,6 @@
 android.app.ActivityClient$ActivityClientControllerSingleton
 android.app.ActivityClient-IA
 android.app.ActivityClient
-android.app.ActivityManager$1
 android.app.ActivityManager$2
 android.app.ActivityManager$3
 android.app.ActivityManager$AppTask
@@ -267,12 +267,10 @@
 android.app.ActivityThread$4
 android.app.ActivityThread$ActivityClientRecord$1
 android.app.ActivityThread$ActivityClientRecord
-android.app.ActivityThread$AndroidOs
 android.app.ActivityThread$AppBindData
 android.app.ActivityThread$ApplicationThread$$ExternalSyntheticLambda2
 android.app.ActivityThread$ApplicationThread$1
 android.app.ActivityThread$ApplicationThread-IA
-android.app.ActivityThread$ApplicationThread
 android.app.ActivityThread$BindServiceData
 android.app.ActivityThread$ContextCleanupInfo
 android.app.ActivityThread$CreateBackupAgentData
@@ -302,7 +300,6 @@
 android.app.ActivityTransitionState
 android.app.AlarmManager$AlarmClockInfo$1
 android.app.AlarmManager$AlarmClockInfo
-android.app.AlarmManager$ListenerWrapper
 android.app.AlarmManager$OnAlarmListener
 android.app.AlarmManager
 android.app.AlertDialog$Builder
@@ -320,10 +317,8 @@
 android.app.AppOpsManager$$ExternalSyntheticLambda5
 android.app.AppOpsManager$$ExternalSyntheticLambda6
 android.app.AppOpsManager$1
-android.app.AppOpsManager$2
 android.app.AppOpsManager$3
 android.app.AppOpsManager$4
-android.app.AppOpsManager$5
 android.app.AppOpsManager$AppOpsCollector
 android.app.AppOpsManager$AttributedHistoricalOps$1
 android.app.AppOpsManager$AttributedHistoricalOps
@@ -366,7 +361,6 @@
 android.app.AppOpsManagerInternal
 android.app.Application$ActivityLifecycleCallbacks
 android.app.Application$OnProvideAssistDataListener
-android.app.Application
 android.app.ApplicationErrorReport$1
 android.app.ApplicationErrorReport$AnrInfo
 android.app.ApplicationErrorReport$BatteryInfo
@@ -390,7 +384,6 @@
 android.app.ApplicationPackageManager$HasSystemFeatureQuery
 android.app.ApplicationPackageManager$MoveCallbackDelegate
 android.app.ApplicationPackageManager$ResourceName
-android.app.ApplicationPackageManager
 android.app.AsyncNotedAppOp$1
 android.app.AsyncNotedAppOp
 android.app.AutomaticZenRule$1
@@ -403,6 +396,7 @@
 android.app.BackgroundServiceStartNotAllowedException
 android.app.BroadcastOptions
 android.app.ClientTransactionHandler
+android.app.ComponentCaller
 android.app.ComponentOptions
 android.app.ConfigurationChangedListenerController
 android.app.ConfigurationController
@@ -411,7 +405,6 @@
 android.app.ContentProviderHolder
 android.app.ContextImpl$1
 android.app.ContextImpl$ApplicationContentResolver
-android.app.ContextImpl
 android.app.DexLoadReporter
 android.app.Dialog$$ExternalSyntheticLambda0
 android.app.Dialog$$ExternalSyntheticLambda1
@@ -483,7 +476,6 @@
 android.app.IAlarmCompleteListener$Stub$Proxy
 android.app.IAlarmCompleteListener$Stub
 android.app.IAlarmCompleteListener
-android.app.IAlarmListener$Stub$Proxy
 android.app.IAlarmListener$Stub
 android.app.IAlarmListener
 android.app.IAlarmManager$Stub$Proxy
@@ -498,7 +490,6 @@
 android.app.IApplicationStartInfoCompleteListener$Stub$Proxy
 android.app.IApplicationStartInfoCompleteListener$Stub
 android.app.IApplicationStartInfoCompleteListener
-android.app.IApplicationThread$Stub$Proxy
 android.app.IApplicationThread$Stub
 android.app.IApplicationThread
 android.app.IAssistDataReceiver$Stub$Proxy
@@ -543,13 +534,11 @@
 android.app.ISearchManager$Stub$Proxy
 android.app.ISearchManager$Stub
 android.app.ISearchManager
-android.app.IServiceConnection$Stub$Proxy
 android.app.IServiceConnection$Stub
 android.app.IServiceConnection
 android.app.IStopUserCallback$Stub$Proxy
 android.app.IStopUserCallback$Stub
 android.app.IStopUserCallback
-android.app.ITaskStackListener$Stub$Proxy
 android.app.ITaskStackListener$Stub
 android.app.ITaskStackListener
 android.app.ITransientNotification$Stub$Proxy
@@ -569,7 +558,6 @@
 android.app.IUidFrozenStateChangedCallback$Stub$Proxy
 android.app.IUidFrozenStateChangedCallback$Stub
 android.app.IUidFrozenStateChangedCallback
-android.app.IUidObserver$Stub$Proxy
 android.app.IUidObserver$Stub
 android.app.IUidObserver
 android.app.IUnsafeIntentStrictModeCallback$Stub
@@ -598,19 +586,16 @@
 android.app.IntentReceiverLeaked
 android.app.IntentService$ServiceHandler
 android.app.IntentService
-android.app.JobSchedulerImpl
 android.app.KeyguardManager$1
 android.app.KeyguardManager$KeyguardDismissCallback
 android.app.KeyguardManager
 android.app.ListActivity
 android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0
 android.app.LoadedApk$ReceiverDispatcher$Args
-android.app.LoadedApk$ReceiverDispatcher$InnerReceiver
 android.app.LoadedApk$ReceiverDispatcher
 android.app.LoadedApk$ServiceDispatcher$ConnectionInfo-IA
 android.app.LoadedApk$ServiceDispatcher$ConnectionInfo
 android.app.LoadedApk$ServiceDispatcher$DeathMonitor
-android.app.LoadedApk$ServiceDispatcher$InnerConnection
 android.app.LoadedApk$ServiceDispatcher$RunConnection
 android.app.LoadedApk$ServiceDispatcher
 android.app.LoadedApk$SplitDependencyLoaderImpl
@@ -1429,6 +1414,7 @@
 android.content.BroadcastReceiver$PendingResult
 android.content.BroadcastReceiver
 android.content.ClipData$1
+android.content.ClipData$Item-IA
 android.content.ClipData$Item
 android.content.ClipData
 android.content.ClipDescription$1
@@ -1446,7 +1432,6 @@
 android.content.ComponentName$WithComponentName
 android.content.ComponentName
 android.content.ContentCaptureOptions$1
-android.content.ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda0
 android.content.ContentCaptureOptions$ContentProtectionOptions
 android.content.ContentCaptureOptions
 android.content.ContentInterface
@@ -1504,7 +1489,6 @@
 android.content.IContentService$Stub$Proxy
 android.content.IContentService$Stub
 android.content.IContentService
-android.content.IIntentReceiver$Stub$Proxy
 android.content.IIntentReceiver$Stub
 android.content.IIntentReceiver
 android.content.IIntentSender$Stub$Proxy
@@ -2026,7 +2010,6 @@
 android.content.res.ThemedResourceCache
 android.content.res.TypedArray
 android.content.res.Validator
-android.content.res.XmlBlock$Parser
 android.content.res.XmlBlock
 android.content.res.XmlResourceParser
 android.content.res.loader.AssetsProvider
@@ -2058,7 +2041,6 @@
 android.database.ContentObservable
 android.database.ContentObserver$$ExternalSyntheticLambda0
 android.database.ContentObserver$$ExternalSyntheticLambda1
-android.database.ContentObserver$Transport
 android.database.ContentObserver
 android.database.CrossProcessCursor
 android.database.CrossProcessCursorWrapper
@@ -2077,7 +2059,6 @@
 android.database.DatabaseUtils
 android.database.DefaultDatabaseErrorHandler
 android.database.IBulkCursor
-android.database.IContentObserver$Stub$Proxy
 android.database.IContentObserver$Stub
 android.database.IContentObserver
 android.database.MatrixCursor$RowBuilder
@@ -2088,6 +2069,8 @@
 android.database.SQLException
 android.database.StaleDataException
 android.database.sqlite.DatabaseObjectNotClosedException
+android.database.sqlite.FeatureFlags
+android.database.sqlite.FeatureFlagsImpl
 android.database.sqlite.Flags
 android.database.sqlite.SQLiteAbortException
 android.database.sqlite.SQLiteAccessPermException
@@ -2605,7 +2588,6 @@
 android.hardware.SystemSensorManager$BaseEventQueue
 android.hardware.SystemSensorManager$SensorEventQueue
 android.hardware.SystemSensorManager$TriggerEventQueue
-android.hardware.SystemSensorManager
 android.hardware.TriggerEvent
 android.hardware.TriggerEventListener
 android.hardware.biometrics.BiometricAuthenticator$AuthenticationCallback
@@ -2815,6 +2797,7 @@
 android.hardware.camera2.utils.ConcurrentCameraIdCombination$1
 android.hardware.camera2.utils.ConcurrentCameraIdCombination-IA
 android.hardware.camera2.utils.ConcurrentCameraIdCombination
+android.hardware.camera2.utils.ExceptionUtils
 android.hardware.camera2.utils.HashCodeHelpers
 android.hardware.camera2.utils.SurfaceUtils
 android.hardware.camera2.utils.TypeReference$SpecializedBaseTypeReference
@@ -2834,6 +2817,7 @@
 android.hardware.contexthub.V1_0.NanoAppBinary
 android.hardware.contexthub.V1_0.PhysicalSensor
 android.hardware.contexthub.V1_1.Setting
+android.hardware.devicestate.DeviceState
 android.hardware.devicestate.DeviceStateInfo$1
 android.hardware.devicestate.DeviceStateInfo
 android.hardware.devicestate.DeviceStateManager$DeviceStateCallback
@@ -2842,7 +2826,6 @@
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda0
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda1
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda2
-android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda3
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateManagerCallback-IA
 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateManagerCallback
@@ -2887,7 +2870,6 @@
 android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0
 android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate
 android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback-IA
-android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback
 android.hardware.display.DisplayManagerGlobal
 android.hardware.display.DisplayManagerInternal$DisplayPowerCallbacks
 android.hardware.display.DisplayManagerInternal$DisplayPowerRequest
@@ -2903,7 +2885,6 @@
 android.hardware.display.IDisplayManager$Stub$Proxy
 android.hardware.display.IDisplayManager$Stub
 android.hardware.display.IDisplayManager
-android.hardware.display.IDisplayManagerCallback$Stub$Proxy
 android.hardware.display.IDisplayManagerCallback$Stub
 android.hardware.display.IDisplayManagerCallback
 android.hardware.display.IVirtualDisplayCallback$Stub$Proxy
@@ -3016,6 +2997,7 @@
 android.hardware.location.ContextHubInfo$1
 android.hardware.location.ContextHubInfo-IA
 android.hardware.location.ContextHubInfo
+android.hardware.location.ContextHubManager$1
 android.hardware.location.ContextHubManager$2
 android.hardware.location.ContextHubManager$3
 android.hardware.location.ContextHubManager$Callback
@@ -5126,7 +5108,6 @@
 android.media.IMediaRouter2$Stub$Proxy
 android.media.IMediaRouter2$Stub
 android.media.IMediaRouter2
-android.media.IMediaRouter2Manager$Stub$Proxy
 android.media.IMediaRouter2Manager$Stub
 android.media.IMediaRouter2Manager
 android.media.IMediaRouterClient$Stub$Proxy
@@ -5191,7 +5172,6 @@
 android.media.MediaCodec$PersistentSurface
 android.media.MediaCodec$QueueRequest
 android.media.MediaCodecInfo$AudioCapabilities
-android.media.MediaCodecInfo$CodecCapabilities
 android.media.MediaCodecInfo$CodecProfileLevel
 android.media.MediaCodecInfo$EncoderCapabilities
 android.media.MediaCodecInfo$Feature
@@ -5628,7 +5608,6 @@
 android.net.INetworkManagementEventObserver$Stub$Proxy
 android.net.INetworkManagementEventObserver$Stub
 android.net.INetworkManagementEventObserver
-android.net.INetworkPolicyListener$Stub$Proxy
 android.net.INetworkPolicyListener$Stub
 android.net.INetworkPolicyListener
 android.net.INetworkPolicyManager$Stub$Proxy
@@ -5653,7 +5632,6 @@
 android.net.LocalSocketAddress$Namespace
 android.net.LocalSocketAddress
 android.net.LocalSocketImpl$SocketInputStream
-android.net.LocalSocketImpl$SocketOutputStream
 android.net.LocalSocketImpl
 android.net.MatchAllNetworkSpecifier$1
 android.net.MatchAllNetworkSpecifier
@@ -5704,17 +5682,13 @@
 android.net.Uri$AbstractPart
 android.net.Uri$Builder
 android.net.Uri$HierarchicalUri-IA
-android.net.Uri$HierarchicalUri
 android.net.Uri$NotCachedHolder
 android.net.Uri$OpaqueUri-IA
-android.net.Uri$OpaqueUri
 android.net.Uri$Part$EmptyPart
 android.net.Uri$Part
 android.net.Uri$PathPart
-android.net.Uri$PathSegments
 android.net.Uri$PathSegmentsBuilder
 android.net.Uri$StringUri-IA
-android.net.Uri$StringUri
 android.net.Uri-IA
 android.net.Uri
 android.net.UriCodec
@@ -5962,7 +5936,6 @@
 android.os.BinderProxy$BinderProxyMapSizeException
 android.os.BinderProxy$NoImagePreloadHolder
 android.os.BinderProxy$ProxyMap
-android.os.BinderProxy
 android.os.BluetoothServiceManager$ServiceRegisterer
 android.os.BluetoothServiceManager
 android.os.BugreportManager
@@ -6093,7 +6066,6 @@
 android.os.IIncidentManager$Stub$Proxy
 android.os.IIncidentManager$Stub
 android.os.IIncidentManager
-android.os.IInstalld$Stub$Proxy
 android.os.IInstalld$Stub
 android.os.IInstalld
 android.os.IInterface
@@ -6209,7 +6181,6 @@
 android.os.PackageTagsList$1
 android.os.PackageTagsList
 android.os.Parcel$1
-android.os.Parcel$2
 android.os.Parcel$LazyValue
 android.os.Parcel$ReadWriteHelper
 android.os.Parcel$SquashReadHelper
@@ -6262,6 +6233,7 @@
 android.os.PowerWhitelistManager
 android.os.Process$ProcessStartResult
 android.os.Process
+android.os.ProfilingServiceManager
 android.os.ProxyFileDescriptorCallback
 android.os.RecoverySystem$1
 android.os.RecoverySystem$2
@@ -6315,14 +6287,12 @@
 android.os.StrictMode$2
 android.os.StrictMode$3
 android.os.StrictMode$4
-android.os.StrictMode$5
 android.os.StrictMode$6
 android.os.StrictMode$7
 android.os.StrictMode$8
 android.os.StrictMode$9
 android.os.StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda0
 android.os.StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda1
-android.os.StrictMode$AndroidBlockGuardPolicy
 android.os.StrictMode$AndroidCloseGuardReporter-IA
 android.os.StrictMode$AndroidCloseGuardReporter
 android.os.StrictMode$InstanceTracker
@@ -6345,7 +6315,6 @@
 android.os.StrictMode
 android.os.SynchronousResultReceiver$Result
 android.os.SynchronousResultReceiver
-android.os.SystemClock$1
 android.os.SystemClock$2
 android.os.SystemClock$3
 android.os.SystemClock
@@ -6522,7 +6491,6 @@
 android.permission.ILegacyPermissionManager$Stub$Proxy
 android.permission.ILegacyPermissionManager$Stub
 android.permission.ILegacyPermissionManager
-android.permission.IOnPermissionsChangeListener$Stub$Proxy
 android.permission.IOnPermissionsChangeListener$Stub
 android.permission.IOnPermissionsChangeListener
 android.permission.IPermissionChecker$Stub$Proxy
@@ -6540,7 +6508,6 @@
 android.permission.PermissionControllerManager
 android.permission.PermissionManager$1
 android.permission.PermissionManager$2
-android.permission.PermissionManager$OnPermissionsChangeListenerDelegate
 android.permission.PermissionManager$PackageNamePermissionQuery
 android.permission.PermissionManager$PermissionQuery
 android.permission.PermissionManager$SplitPermissionInfo-IA
@@ -7071,9 +7038,11 @@
 android.service.media.IMediaBrowserServiceCallbacks$Stub$Proxy
 android.service.media.IMediaBrowserServiceCallbacks$Stub
 android.service.media.IMediaBrowserServiceCallbacks
+android.service.media.MediaBrowserService$$ExternalSyntheticLambda0
 android.service.media.MediaBrowserService$BrowserRoot
 android.service.media.MediaBrowserService$ConnectionRecord
 android.service.media.MediaBrowserService$Result
+android.service.media.MediaBrowserService$ServiceBinder$$ExternalSyntheticLambda1
 android.service.media.MediaBrowserService$ServiceBinder-IA
 android.service.media.MediaBrowserService$ServiceBinder
 android.service.media.MediaBrowserService$ServiceState
@@ -7085,12 +7054,9 @@
 android.service.notification.ConditionProviderService$H-IA
 android.service.notification.ConditionProviderService$H
 android.service.notification.ConditionProviderService$Provider-IA
-android.service.notification.ConditionProviderService$Provider
 android.service.notification.ConditionProviderService
-android.service.notification.IConditionProvider$Stub$Proxy
 android.service.notification.IConditionProvider$Stub
 android.service.notification.IConditionProvider
-android.service.notification.INotificationListener$Stub$Proxy
 android.service.notification.INotificationListener$Stub
 android.service.notification.INotificationListener
 android.service.notification.IStatusBarNotificationHolder$Stub$Proxy
@@ -7102,7 +7068,6 @@
 android.service.notification.NotificationListenerFilter$1
 android.service.notification.NotificationListenerFilter
 android.service.notification.NotificationListenerService$MyHandler
-android.service.notification.NotificationListenerService$NotificationListenerWrapper
 android.service.notification.NotificationListenerService$Ranking
 android.service.notification.NotificationListenerService$RankingMap$1
 android.service.notification.NotificationListenerService$RankingMap-IA
@@ -7615,7 +7580,6 @@
 android.telephony.PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda62
 android.telephony.PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda6
 android.telephony.PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda9
-android.telephony.PhoneStateListener$IPhoneStateListenerStub
 android.telephony.PhoneStateListener
 android.telephony.PhysicalChannelConfig$1
 android.telephony.PhysicalChannelConfig$Builder
@@ -7719,7 +7683,6 @@
 android.telephony.TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda52
 android.telephony.TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda63
 android.telephony.TelephonyCallback$IPhoneStateListenerStub$$ExternalSyntheticLambda65
-android.telephony.TelephonyCallback$IPhoneStateListenerStub
 android.telephony.TelephonyCallback$ImsCallDisconnectCauseListener
 android.telephony.TelephonyCallback$LinkCapacityEstimateChangedListener
 android.telephony.TelephonyCallback$MediaQualityStatusChangedListener
@@ -8412,7 +8375,6 @@
 android.util.AndroidException
 android.util.AndroidRuntimeException
 android.util.ArrayMap$1
-android.util.ArrayMap
 android.util.ArraySet$1
 android.util.ArraySet
 android.util.AtomicFile
@@ -8482,11 +8444,6 @@
 android.util.LongSparseLongArray
 android.util.LruCache
 android.util.MalformedJsonException
-android.util.MapCollections$ArrayIterator
-android.util.MapCollections$EntrySet
-android.util.MapCollections$KeySet
-android.util.MapCollections$MapIterator
-android.util.MapCollections$ValuesCollection
 android.util.MapCollections
 android.util.MathUtils
 android.util.MemoryIntArray$1
@@ -8533,7 +8490,6 @@
 android.util.SparseLongArray
 android.util.SparseSetArray
 android.util.Spline$LinearSpline
-android.util.Spline$MonotoneCubicSpline
 android.util.Spline
 android.util.StateSet
 android.util.StringBuilderPrinter
@@ -8762,13 +8718,11 @@
 android.view.ISurfaceControlViewHost
 android.view.ISurfaceControlViewHostParent$Stub
 android.view.ISurfaceControlViewHostParent
-android.view.ISystemGestureExclusionListener$Stub$Proxy
 android.view.ISystemGestureExclusionListener$Stub
 android.view.ISystemGestureExclusionListener
 android.view.IWallpaperVisibilityListener$Stub$Proxy
 android.view.IWallpaperVisibilityListener$Stub
 android.view.IWallpaperVisibilityListener
-android.view.IWindow$Stub$Proxy
 android.view.IWindow$Stub
 android.view.IWindow
 android.view.IWindowFocusObserver$Stub
@@ -9093,6 +9047,7 @@
 android.view.ViewAnimationHostBridge
 android.view.ViewAnimationUtils
 android.view.ViewConfiguration
+android.view.ViewCredentialHandler
 android.view.ViewDebug$ExportedProperty
 android.view.ViewDebug$FlagToString
 android.view.ViewDebug$HierarchyHandler
@@ -9195,7 +9150,6 @@
 android.view.ViewRootImpl$ViewPostImeInputStage
 android.view.ViewRootImpl$ViewPreImeInputStage
 android.view.ViewRootImpl$ViewRootHandler
-android.view.ViewRootImpl$W
 android.view.ViewRootImpl$WindowInputEventReceiver
 android.view.ViewRootImpl
 android.view.ViewRootInsetsControllerHost
@@ -9432,7 +9386,6 @@
 android.view.contentcapture.IContentCaptureManager
 android.view.contentcapture.IContentCaptureOptionsCallback$Stub
 android.view.contentcapture.IContentCaptureOptionsCallback
-android.view.contentcapture.IDataShareWriteAdapter$Stub$Proxy
 android.view.contentcapture.IDataShareWriteAdapter$Stub
 android.view.contentcapture.IDataShareWriteAdapter
 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda0
@@ -9800,6 +9753,7 @@
 android.webkit.WebViewProviderResponse
 android.webkit.WebViewRenderProcess
 android.webkit.WebViewRenderProcessClient
+android.webkit.WebViewUpdateManager
 android.webkit.WebViewUpdateService
 android.webkit.WebViewZygote
 android.widget.AbsListView$1
@@ -10396,6 +10350,7 @@
 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda2
 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda3
 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda4
+android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda5
 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$CallbackRef
 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper
 android.window.WindowOnBackInvokedDispatcher
@@ -10599,10 +10554,8 @@
 com.android.i18n.timezone.internal.MemoryMappedFile
 com.android.i18n.timezone.internal.NioBufferIterator
 com.android.i18n.util.Log
-com.android.icu.charset.CharsetDecoderICU
 com.android.icu.charset.CharsetEncoderICU
 com.android.icu.charset.CharsetFactory
-com.android.icu.charset.CharsetICU
 com.android.icu.charset.NativeConverter
 com.android.icu.text.CompatibleDecimalFormatFactory
 com.android.icu.text.DateSorterBridge
@@ -11029,13 +10982,10 @@
 com.android.internal.app.IAppOpsActiveCallback$Stub$Proxy
 com.android.internal.app.IAppOpsActiveCallback$Stub
 com.android.internal.app.IAppOpsActiveCallback
-com.android.internal.app.IAppOpsAsyncNotedCallback$Stub$Proxy
 com.android.internal.app.IAppOpsAsyncNotedCallback$Stub
 com.android.internal.app.IAppOpsAsyncNotedCallback
-com.android.internal.app.IAppOpsCallback$Stub$Proxy
 com.android.internal.app.IAppOpsCallback$Stub
 com.android.internal.app.IAppOpsCallback
-com.android.internal.app.IAppOpsNotedCallback$Stub$Proxy
 com.android.internal.app.IAppOpsNotedCallback$Stub
 com.android.internal.app.IAppOpsNotedCallback
 com.android.internal.app.IAppOpsService$Stub$Proxy
@@ -11221,7 +11171,6 @@
 com.android.internal.infra.AndroidFuture$$ExternalSyntheticLambda3
 com.android.internal.infra.AndroidFuture$1
 com.android.internal.infra.AndroidFuture$2
-com.android.internal.infra.AndroidFuture
 com.android.internal.infra.GlobalWhitelistState
 com.android.internal.infra.IAndroidFuture$Stub$Proxy
 com.android.internal.infra.IAndroidFuture$Stub
@@ -11385,7 +11334,6 @@
 com.android.internal.os.CachedDeviceState$TimeInStateStopwatch
 com.android.internal.os.CachedDeviceState
 com.android.internal.os.ClassLoaderFactory
-com.android.internal.os.Clock$1
 com.android.internal.os.Clock
 com.android.internal.os.FuseAppLoop$1
 com.android.internal.os.FuseAppLoop
@@ -11563,7 +11511,6 @@
 com.android.internal.protolog.common.LogDataType
 com.android.internal.security.VerityUtils
 com.android.internal.statusbar.IAddTileResultCallback
-com.android.internal.statusbar.IStatusBar$Stub$Proxy
 com.android.internal.statusbar.IStatusBar$Stub
 com.android.internal.statusbar.IStatusBar
 com.android.internal.statusbar.IStatusBarService$Stub$Proxy
@@ -11784,7 +11731,6 @@
 com.android.internal.telephony.IOns$Stub$Proxy
 com.android.internal.telephony.IOns$Stub
 com.android.internal.telephony.IOns
-com.android.internal.telephony.IPhoneStateListener$Stub$Proxy
 com.android.internal.telephony.IPhoneStateListener$Stub
 com.android.internal.telephony.IPhoneStateListener
 com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy
@@ -13156,7 +13102,6 @@
 com.android.internal.util.XmlPullParserWrapper
 com.android.internal.util.XmlSerializerWrapper
 com.android.internal.util.XmlUtils$ForcedTypedXmlPullParser
-com.android.internal.util.XmlUtils$ForcedTypedXmlSerializer
 com.android.internal.util.XmlUtils$ReadMapCallback
 com.android.internal.util.XmlUtils$WriteMapCallback
 com.android.internal.util.XmlUtils
@@ -13202,7 +13147,6 @@
 com.android.internal.util.function.pooled.PooledLambdaImpl$LambdaType$ReturnType
 com.android.internal.util.function.pooled.PooledLambdaImpl$LambdaType
 com.android.internal.util.function.pooled.PooledLambdaImpl$Pool
-com.android.internal.util.function.pooled.PooledLambdaImpl
 com.android.internal.util.function.pooled.PooledPredicate
 com.android.internal.util.function.pooled.PooledRunnable
 com.android.internal.util.function.pooled.PooledSupplier$OfDouble
@@ -13395,7 +13339,6 @@
 com.android.okhttp.HttpUrl$Builder$ParseResult
 com.android.okhttp.HttpUrl$Builder
 com.android.okhttp.HttpUrl
-com.android.okhttp.HttpsHandler
 com.android.okhttp.Interceptor$Chain
 com.android.okhttp.MediaType
 com.android.okhttp.OkCacheContainer
@@ -13476,7 +13419,6 @@
 com.android.okhttp.internal.http.StreamAllocation
 com.android.okhttp.internal.huc.DelegatingHttpsURLConnection
 com.android.okhttp.internal.huc.HttpURLConnectionImpl
-com.android.okhttp.internal.huc.HttpsURLConnectionImpl
 com.android.okhttp.internal.io.FileSystem$1
 com.android.okhttp.internal.io.FileSystem
 com.android.okhttp.internal.io.RealConnection
@@ -13507,9 +13449,7 @@
 com.android.okhttp.okio.Okio$2
 com.android.okhttp.okio.Okio$3
 com.android.okhttp.okio.Okio
-com.android.okhttp.okio.RealBufferedSink$1
 com.android.okhttp.okio.RealBufferedSink
-com.android.okhttp.okio.RealBufferedSource$1
 com.android.okhttp.okio.RealBufferedSource
 com.android.okhttp.okio.Segment
 com.android.okhttp.okio.SegmentPool
@@ -13626,10 +13566,20 @@
 com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL
 com.android.org.bouncycastle.crypto.digests.EncodableDigest
 com.android.org.bouncycastle.crypto.digests.GeneralDigest
+com.android.org.bouncycastle.crypto.digests.LongDigest
+com.android.org.bouncycastle.crypto.digests.MD5Digest
 com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$MD5
 com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA1
+com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA224
+com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA256
+com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA384
+com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA512
 com.android.org.bouncycastle.crypto.digests.OpenSSLDigest
 com.android.org.bouncycastle.crypto.digests.SHA1Digest
+com.android.org.bouncycastle.crypto.digests.SHA224Digest
+com.android.org.bouncycastle.crypto.digests.SHA256Digest
+com.android.org.bouncycastle.crypto.digests.SHA384Digest
+com.android.org.bouncycastle.crypto.digests.SHA512Digest
 com.android.org.bouncycastle.crypto.engines.AESEngine
 com.android.org.bouncycastle.crypto.engines.DESEngine
 com.android.org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator
@@ -13638,6 +13588,7 @@
 com.android.org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator
 com.android.org.bouncycastle.crypto.io.MacInputStream
 com.android.org.bouncycastle.crypto.macs.HMac
+com.android.org.bouncycastle.crypto.modes.AEADBlockCipher
 com.android.org.bouncycastle.crypto.modes.CBCBlockCipher
 com.android.org.bouncycastle.crypto.paddings.BlockCipherPadding
 com.android.org.bouncycastle.crypto.paddings.PKCS7Padding
@@ -13660,7 +13611,6 @@
 com.android.org.bouncycastle.jcajce.provider.asymmetric.RSA$Mappings
 com.android.org.bouncycastle.jcajce.provider.asymmetric.RSA
 com.android.org.bouncycastle.jcajce.provider.asymmetric.dh.KeyFactorySpi
-com.android.org.bouncycastle.jcajce.provider.asymmetric.dsa.BCDSAPublicKey
 com.android.org.bouncycastle.jcajce.provider.asymmetric.dsa.DSAUtil
 com.android.org.bouncycastle.jcajce.provider.asymmetric.dsa.KeyFactorySpi
 com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$NoPadding
@@ -13676,6 +13626,7 @@
 com.android.org.bouncycastle.jcajce.provider.config.ProviderConfiguration
 com.android.org.bouncycastle.jcajce.provider.config.ProviderConfigurationPermission
 com.android.org.bouncycastle.jcajce.provider.digest.DigestAlgorithmProvider
+com.android.org.bouncycastle.jcajce.provider.digest.SHA1$Mappings$$ExternalSyntheticOutline0
 com.android.org.bouncycastle.jcajce.provider.digest.SHA1$Mappings
 com.android.org.bouncycastle.jcajce.provider.digest.SHA1
 com.android.org.bouncycastle.jcajce.provider.digest.SHA224$Mappings
@@ -13691,7 +13642,6 @@
 com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std
 com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$StoreEntry
 com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB
 com.android.org.bouncycastle.jcajce.provider.symmetric.AES$Mappings
 com.android.org.bouncycastle.jcajce.provider.symmetric.AES
 com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings
@@ -13725,6 +13675,7 @@
 com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher$ErasableOutputStream
 com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher$InvalidKeyOrParametersException
 com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher
+com.android.org.bouncycastle.jcajce.provider.symmetric.util.ClassUtil$1
 com.android.org.bouncycastle.jcajce.provider.symmetric.util.ClassUtil
 com.android.org.bouncycastle.jcajce.provider.symmetric.util.GcmSpecUtil$2
 com.android.org.bouncycastle.jcajce.provider.symmetric.util.GcmSpecUtil
@@ -13745,6 +13696,7 @@
 com.android.org.bouncycastle.jce.provider.BouncyCastleProvider
 com.android.org.bouncycastle.jce.provider.BouncyCastleProviderConfiguration
 com.android.org.bouncycastle.jce.provider.CertStoreCollectionSpi
+com.android.org.bouncycastle.jce.provider.X509CRLObject
 com.android.org.bouncycastle.util.Arrays
 com.android.org.bouncycastle.util.BigIntegers
 com.android.org.bouncycastle.util.Integers
@@ -13759,8 +13711,6 @@
 com.android.org.bouncycastle.util.io.Streams
 com.android.org.kxml2.io.KXmlParser$ContentSource
 com.android.org.kxml2.io.KXmlParser$ValueContext
-com.android.org.kxml2.io.KXmlParser
-com.android.org.kxml2.io.KXmlSerializer
 com.android.phone.ecc.nano.CodedInputByteBufferNano
 com.android.phone.ecc.nano.CodedOutputByteBufferNano$OutOfSpaceException
 com.android.phone.ecc.nano.CodedOutputByteBufferNano
@@ -13889,6 +13839,7 @@
 com.android.service.nano.StringListParamProto
 com.android.telephony.Rlog
 com.android.text.flags.Flags
+com.android.window.flags.Flags
 com.google.android.collect.Lists
 com.google.android.collect.Maps
 com.google.android.collect.Sets
@@ -13914,9 +13865,6 @@
 dalvik.system.AppSpecializationHooks
 dalvik.system.BaseDexClassLoader$Reporter
 dalvik.system.BaseDexClassLoader
-dalvik.system.BlockGuard$1
-dalvik.system.BlockGuard$2
-dalvik.system.BlockGuard$3
 dalvik.system.BlockGuard$BlockGuardPolicyException
 dalvik.system.BlockGuard$Policy
 dalvik.system.BlockGuard$VmPolicy
@@ -14373,7 +14321,6 @@
 java.awt.font.TextAttribute
 java.io.Bits
 java.io.BufferedInputStream
-java.io.BufferedOutputStream
 java.io.BufferedReader
 java.io.BufferedWriter
 java.io.ByteArrayInputStream
@@ -14435,16 +14382,16 @@
 java.io.ObjectInputStream
 java.io.ObjectOutput
 java.io.ObjectOutputStream$1
-java.io.ObjectOutputStream$BlockDataOutputStream
 java.io.ObjectOutputStream$Caches
 java.io.ObjectOutputStream$DebugTraceInfoStack
 java.io.ObjectOutputStream$HandleTable
 java.io.ObjectOutputStream$PutField
 java.io.ObjectOutputStream$PutFieldImpl
 java.io.ObjectOutputStream$ReplaceTable
-java.io.ObjectOutputStream
 java.io.ObjectStreamClass$$ExternalSyntheticLambda0
 java.io.ObjectStreamClass$$ExternalSyntheticLambda1
+java.io.ObjectStreamClass$$ExternalSyntheticLambda2
+java.io.ObjectStreamClass$$ExternalSyntheticLambda3
 java.io.ObjectStreamClass$1
 java.io.ObjectStreamClass$2
 java.io.ObjectStreamClass$3
@@ -14488,7 +14435,6 @@
 java.io.SyncFailedException
 java.io.UTFDataFormatException
 java.io.UncheckedIOException
-java.io.UnixFileSystem
 java.io.UnsupportedEncodingException
 java.io.WriteAbortedException
 java.io.Writer
@@ -14518,10 +14464,15 @@
 java.lang.Character$Subset
 java.lang.Character$UnicodeBlock
 java.lang.Character
+java.lang.Class$$ExternalSyntheticLambda0
+java.lang.Class$$ExternalSyntheticLambda1
 java.lang.Class$Caches
 java.lang.Class
 java.lang.ClassCastException
 java.lang.ClassFormatError
+java.lang.ClassLoader$$ExternalSyntheticLambda0
+java.lang.ClassLoader$$ExternalSyntheticLambda1
+java.lang.ClassLoader$$ExternalSyntheticLambda2
 java.lang.ClassLoader$SystemClassLoader
 java.lang.ClassLoader
 java.lang.ClassNotFoundException
@@ -14530,6 +14481,7 @@
 java.lang.CloneNotSupportedException
 java.lang.Cloneable
 java.lang.Comparable
+java.lang.CompoundEnumeration
 java.lang.Daemons$Daemon
 java.lang.Daemons$FinalizerDaemon
 java.lang.Daemons$FinalizerWatchdogDaemon
@@ -14539,7 +14491,9 @@
 java.lang.Deprecated
 java.lang.DexCache
 java.lang.Double
+java.lang.Enum$$ExternalSyntheticLambda0
 java.lang.Enum$1
+java.lang.Enum$EnumDesc
 java.lang.Enum
 java.lang.EnumConstantNotPresentException
 java.lang.Error
@@ -14617,7 +14571,6 @@
 java.lang.String$$ExternalSyntheticLambda2
 java.lang.String$$ExternalSyntheticLambda3
 java.lang.String$CaseInsensitiveComparator-IA
-java.lang.String$CaseInsensitiveComparator
 java.lang.String
 java.lang.StringBuffer
 java.lang.StringBuilder
@@ -14641,11 +14594,9 @@
 java.lang.Thread
 java.lang.ThreadDeath
 java.lang.ThreadGroup
-java.lang.ThreadLocal$SuppliedThreadLocal
 java.lang.ThreadLocal$ThreadLocalMap$Entry
 java.lang.ThreadLocal$ThreadLocalMap-IA
 java.lang.ThreadLocal$ThreadLocalMap
-java.lang.ThreadLocal
 java.lang.Throwable$PrintStreamOrWriter-IA
 java.lang.Throwable$PrintStreamOrWriter
 java.lang.Throwable$SentinelHolder
@@ -14704,13 +14655,16 @@
 java.lang.invoke.MethodHandleInfo
 java.lang.invoke.MethodHandleStatics
 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda0
+java.lang.invoke.MethodHandles$$ExternalSyntheticLambda10
 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda11
 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda12
 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda13
 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda14
 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda15
+java.lang.invoke.MethodHandles$$ExternalSyntheticLambda16
 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda17
 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda18
+java.lang.invoke.MethodHandles$$ExternalSyntheticLambda19
 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda1
 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda20
 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda21
@@ -14770,7 +14724,9 @@
 java.lang.invoke.VarHandle$VarHandleDesc$Kind
 java.lang.invoke.VarHandle
 java.lang.invoke.WrongMethodTypeException
+java.lang.ref.Cleaner$1
 java.lang.ref.Cleaner$Cleanable
+java.lang.ref.Cleaner
 java.lang.ref.FinalizerReference$Sentinel-IA
 java.lang.ref.FinalizerReference$Sentinel
 java.lang.ref.FinalizerReference
@@ -14875,9 +14831,7 @@
 java.net.Inet6Address$Inet6AddressHolder-IA
 java.net.Inet6Address$Inet6AddressHolder
 java.net.Inet6Address
-java.net.Inet6AddressImpl
 java.net.InetAddress$1
-java.net.InetAddress$InetAddressHolder
 java.net.InetAddress
 java.net.InetAddressImpl
 java.net.InetSocketAddress$InetSocketAddressHolder-IA
@@ -14912,10 +14866,8 @@
 java.net.SocketException
 java.net.SocketImpl
 java.net.SocketImplFactory
-java.net.SocketInputStream
 java.net.SocketOption
 java.net.SocketOptions
-java.net.SocketOutputStream
 java.net.SocketPermission
 java.net.SocketTimeoutException
 java.net.SocksConsts
@@ -14942,18 +14894,11 @@
 java.nio.ByteBuffer
 java.nio.ByteBufferAsCharBuffer
 java.nio.ByteBufferAsDoubleBuffer
-java.nio.ByteBufferAsFloatBuffer
-java.nio.ByteBufferAsIntBuffer
-java.nio.ByteBufferAsLongBuffer
-java.nio.ByteBufferAsShortBuffer
 java.nio.ByteOrder
 java.nio.CharBuffer
 java.nio.DirectByteBuffer$MemoryRef
-java.nio.DirectByteBuffer
 java.nio.DoubleBuffer
 java.nio.FloatBuffer
-java.nio.HeapByteBuffer
-java.nio.HeapCharBuffer
 java.nio.HeapIntBuffer
 java.nio.IntBuffer
 java.nio.InvalidMarkException
@@ -15105,7 +15050,6 @@
 java.security.KeyStore
 java.security.KeyStoreException
 java.security.KeyStoreSpi
-java.security.MessageDigest$Delegate
 java.security.MessageDigest
 java.security.MessageDigestSpi
 java.security.NoSuchAlgorithmException
@@ -15129,12 +15073,12 @@
 java.security.ProviderException
 java.security.PublicKey
 java.security.SecureRandom
+java.security.SecureRandomParameters
 java.security.SecureRandomSpi
 java.security.Security$1
 java.security.Security
 java.security.SecurityPermission
 java.security.Signature$CipherAdapter
-java.security.Signature$Delegate
 java.security.Signature
 java.security.SignatureException
 java.security.SignatureSpi
@@ -15267,7 +15211,6 @@
 java.text.RuleBasedCollator
 java.text.SimpleDateFormat
 java.text.StringCharacterIterator
-java.time.Clock$SystemClock
 java.time.Clock
 java.time.DateTimeException
 java.time.DayOfWeek
@@ -15286,7 +15229,6 @@
 java.time.Year
 java.time.ZoneId
 java.time.ZoneOffset
-java.time.ZoneRegion
 java.time.ZonedDateTime$$ExternalSyntheticLambda0
 java.time.ZonedDateTime$1
 java.time.ZonedDateTime
@@ -15352,6 +15294,8 @@
 java.time.temporal.TemporalAdjusters$$ExternalSyntheticLambda11
 java.time.temporal.TemporalAdjusters$$ExternalSyntheticLambda1
 java.time.temporal.TemporalAdjusters$$ExternalSyntheticLambda3
+java.time.temporal.TemporalAdjusters$$ExternalSyntheticLambda6
+java.time.temporal.TemporalAdjusters$$ExternalSyntheticLambda8
 java.time.temporal.TemporalAdjusters
 java.time.temporal.TemporalAmount
 java.time.temporal.TemporalField
@@ -15377,7 +15321,6 @@
 java.time.zone.ZoneRulesProvider
 java.util.AbstractCollection
 java.util.AbstractList$Itr-IA
-java.util.AbstractList$Itr
 java.util.AbstractList$ListItr
 java.util.AbstractList$RandomAccessSpliterator
 java.util.AbstractList$RandomAccessSubList
@@ -15386,23 +15329,18 @@
 java.util.AbstractList
 java.util.AbstractMap$1
 java.util.AbstractMap$2$1
-java.util.AbstractMap$2
 java.util.AbstractMap$SimpleEntry
 java.util.AbstractMap$SimpleImmutableEntry
+java.util.AbstractMap$ViewCollection
 java.util.AbstractMap
 java.util.AbstractQueue
 java.util.AbstractSequentialList
 java.util.AbstractSet
 java.util.ArrayDeque$$ExternalSyntheticLambda1
-java.util.ArrayDeque$DeqIterator
-java.util.ArrayDeque$DescendingIterator
 java.util.ArrayDeque
 java.util.ArrayList$ArrayListSpliterator
-java.util.ArrayList$Itr
 java.util.ArrayList$ListItr
-java.util.ArrayList$SubList$1
 java.util.ArrayList$SubList$2
-java.util.ArrayList$SubList
 java.util.ArrayList
 java.util.ArrayPrefixHelpers$CumulateTask
 java.util.ArrayPrefixHelpers$DoubleCumulateTask
@@ -15412,8 +15350,6 @@
 java.util.Arrays$$ExternalSyntheticLambda1
 java.util.Arrays$$ExternalSyntheticLambda2
 java.util.Arrays$$ExternalSyntheticLambda3
-java.util.Arrays$ArrayItr
-java.util.Arrays$ArrayList
 java.util.Arrays$NaturalOrder
 java.util.Arrays
 java.util.ArraysParallelSortHelpers$FJObject$Sorter
@@ -15425,7 +15361,6 @@
 java.util.Calendar$Builder
 java.util.Calendar
 java.util.Collection
-java.util.Collections$1
 java.util.Collections$2
 java.util.Collections$3
 java.util.Collections$AsLIFOQueue
@@ -15441,48 +15376,30 @@
 java.util.Collections$CheckedSortedSet
 java.util.Collections$CopiesList
 java.util.Collections$EmptyEnumeration
-java.util.Collections$EmptyIterator
 java.util.Collections$EmptyList-IA
-java.util.Collections$EmptyList
 java.util.Collections$EmptyListIterator
 java.util.Collections$EmptyMap-IA
-java.util.Collections$EmptyMap
 java.util.Collections$EmptySet-IA
-java.util.Collections$EmptySet
 java.util.Collections$ReverseComparator2
 java.util.Collections$ReverseComparator
-java.util.Collections$SetFromMap
-java.util.Collections$SingletonList
-java.util.Collections$SingletonMap
-java.util.Collections$SingletonSet
-java.util.Collections$SynchronizedCollection
+java.util.Collections$SequencedSetFromMap
 java.util.Collections$SynchronizedList
-java.util.Collections$SynchronizedMap
 java.util.Collections$SynchronizedNavigableMap
 java.util.Collections$SynchronizedNavigableSet
-java.util.Collections$SynchronizedRandomAccessList
-java.util.Collections$SynchronizedSet
 java.util.Collections$SynchronizedSortedMap
 java.util.Collections$SynchronizedSortedSet
-java.util.Collections$UnmodifiableCollection$1
-java.util.Collections$UnmodifiableCollection
 java.util.Collections$UnmodifiableList$1
 java.util.Collections$UnmodifiableList
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$1
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet
-java.util.Collections$UnmodifiableMap
 java.util.Collections$UnmodifiableNavigableMap$EmptyNavigableMap
 java.util.Collections$UnmodifiableNavigableMap
 java.util.Collections$UnmodifiableNavigableSet$EmptyNavigableSet
 java.util.Collections$UnmodifiableNavigableSet
-java.util.Collections$UnmodifiableRandomAccessList
-java.util.Collections$UnmodifiableSet
+java.util.Collections$UnmodifiableSequencedCollection
+java.util.Collections$UnmodifiableSequencedMap
+java.util.Collections$UnmodifiableSequencedSet
 java.util.Collections$UnmodifiableSortedMap
-java.util.Collections$UnmodifiableSortedSet
 java.util.Collections
 java.util.ComparableTimSort
-java.util.Comparator$$ExternalSyntheticLambda0
 java.util.Comparator$$ExternalSyntheticLambda1
 java.util.Comparator$$ExternalSyntheticLambda2
 java.util.Comparator$$ExternalSyntheticLambda3
@@ -15496,6 +15413,7 @@
 java.util.Date
 java.util.Deque
 java.util.Dictionary
+java.util.DoubleSummaryStatistics
 java.util.DualPivotQuicksort$Sorter-IA
 java.util.DualPivotQuicksort$Sorter
 java.util.DualPivotQuicksort
@@ -15535,31 +15453,23 @@
 java.util.Formatter$FormatString
 java.util.Formatter
 java.util.FormatterClosedException
-java.util.GregorianCalendar
-java.util.HashMap$EntryIterator
-java.util.HashMap$EntrySet
 java.util.HashMap$EntrySpliterator
 java.util.HashMap$HashIterator
 java.util.HashMap$HashMapSpliterator
-java.util.HashMap$KeyIterator
-java.util.HashMap$KeySet
 java.util.HashMap$KeySpliterator
-java.util.HashMap$Node
-java.util.HashMap$TreeNode
-java.util.HashMap$ValueIterator
+java.util.HashMap$UnsafeHolder
 java.util.HashMap$ValueSpliterator
-java.util.HashMap$Values
 java.util.HashMap
 java.util.HashSet
 java.util.Hashtable$EntrySet-IA
 java.util.Hashtable$EntrySet
-java.util.Hashtable$Enumerator
 java.util.Hashtable$HashtableEntry
 java.util.Hashtable$KeySet-IA
 java.util.Hashtable$KeySet
 java.util.Hashtable$ValueCollection-IA
 java.util.Hashtable$ValueCollection
 java.util.Hashtable
+java.util.HexFormat
 java.util.IdentityHashMap$EntryIterator$Entry-IA
 java.util.IdentityHashMap$EntryIterator$Entry
 java.util.IdentityHashMap$EntryIterator-IA
@@ -15588,34 +15498,21 @@
 java.util.ImmutableCollections$AbstractImmutableList
 java.util.ImmutableCollections$AbstractImmutableMap
 java.util.ImmutableCollections$AbstractImmutableSet
-java.util.ImmutableCollections$List12
-java.util.ImmutableCollections$ListItr
+java.util.ImmutableCollections$Access
 java.util.ImmutableCollections$ListN-IA
-java.util.ImmutableCollections$ListN
-java.util.ImmutableCollections$Map1
 java.util.ImmutableCollections$MapN$1
 java.util.ImmutableCollections$MapN$MapNIterator
-java.util.ImmutableCollections$MapN
-java.util.ImmutableCollections$Set12
-java.util.ImmutableCollections$SetN
 java.util.ImmutableCollections$SubList
 java.util.InputMismatchException
 java.util.Iterator
 java.util.JumboEnumSet$EnumSetIterator
 java.util.JumboEnumSet
 java.util.KeyValueHolder
-java.util.LinkedHashMap$LinkedEntryIterator
-java.util.LinkedHashMap$LinkedEntrySet
 java.util.LinkedHashMap$LinkedHashIterator
-java.util.LinkedHashMap$LinkedKeyIterator
-java.util.LinkedHashMap$LinkedKeySet
-java.util.LinkedHashMap$LinkedValueIterator
-java.util.LinkedHashMap$LinkedValues
+java.util.LinkedHashMap$ReversedLinkedHashMapView
 java.util.LinkedHashMap
 java.util.LinkedHashSet
 java.util.LinkedList$DescendingIterator-IA
-java.util.LinkedList$DescendingIterator
-java.util.LinkedList$ListItr
 java.util.LinkedList$Node
 java.util.LinkedList
 java.util.List
@@ -15635,6 +15532,7 @@
 java.util.Locale$NoImagePreloadHolder
 java.util.Locale-IA
 java.util.Locale
+java.util.LongSummaryStatistics
 java.util.Map$Entry
 java.util.Map
 java.util.MissingFormatArgumentException
@@ -15652,8 +15550,8 @@
 java.util.PrimitiveIterator$OfInt$$ExternalSyntheticLambda0
 java.util.PrimitiveIterator$OfInt
 java.util.PrimitiveIterator
-java.util.PriorityQueue$Itr
 java.util.PriorityQueue
+java.util.Properties$EntrySet
 java.util.Properties$LineReader
 java.util.Properties
 java.util.PropertyPermission
@@ -15676,10 +15574,19 @@
 java.util.ResourceBundle$RBClassLoader
 java.util.ResourceBundle$SingleFormatControl
 java.util.ResourceBundle
+java.util.ReverseOrderListView
 java.util.Scanner$PatternLRUCache
 java.util.Scanner
+java.util.SequencedCollection
+java.util.SequencedMap$1SeqEntrySet
+java.util.SequencedMap$1SeqKeySet
+java.util.SequencedMap$1SeqValues
+java.util.SequencedMap
+java.util.SequencedSet
 java.util.ServiceConfigurationError
 java.util.ServiceLoader$1
+java.util.ServiceLoader$2
+java.util.ServiceLoader$LazyClassPathLookupIterator
 java.util.ServiceLoader
 java.util.Set
 java.util.SimpleTimeZone$Cache
@@ -15706,6 +15613,7 @@
 java.util.TaskQueue
 java.util.TimSort
 java.util.TimeZone
+java.util.Timer$ThreadReaper
 java.util.Timer
 java.util.TimerTask
 java.util.TimerThread
@@ -15713,18 +15621,12 @@
 java.util.TreeMap$AscendingSubMap$AscendingEntrySetView
 java.util.TreeMap$AscendingSubMap
 java.util.TreeMap$DescendingSubMap
-java.util.TreeMap$EntryIterator
-java.util.TreeMap$EntrySet
-java.util.TreeMap$KeyIterator
-java.util.TreeMap$KeySet
 java.util.TreeMap$NavigableSubMap$DescendingSubMapKeyIterator
 java.util.TreeMap$NavigableSubMap$EntrySetView
 java.util.TreeMap$NavigableSubMap$SubMapEntryIterator
 java.util.TreeMap$NavigableSubMap$SubMapIterator
-java.util.TreeMap$NavigableSubMap$SubMapKeyIterator
 java.util.TreeMap$NavigableSubMap
 java.util.TreeMap$PrivateEntryIterator
-java.util.TreeMap$TreeMapEntry
 java.util.TreeMap$ValueIterator
 java.util.TreeMap$Values
 java.util.TreeMap
@@ -15746,9 +15648,7 @@
 java.util.WeakHashMap$EntrySet
 java.util.WeakHashMap$HashIterator
 java.util.WeakHashMap$KeyIterator-IA
-java.util.WeakHashMap$KeyIterator
 java.util.WeakHashMap$KeySet-IA
-java.util.WeakHashMap$KeySet
 java.util.WeakHashMap$ValueIterator-IA
 java.util.WeakHashMap$ValueIterator
 java.util.WeakHashMap$Values-IA
@@ -15762,7 +15662,6 @@
 java.util.concurrent.Callable
 java.util.concurrent.CancellationException
 java.util.concurrent.CompletableFuture$AltResult
-java.util.concurrent.CompletableFuture$AsyncRun
 java.util.concurrent.CompletableFuture$AsyncSupply
 java.util.concurrent.CompletableFuture$AsynchronousCompletionTask
 java.util.concurrent.CompletableFuture$Completion
@@ -15776,8 +15675,6 @@
 java.util.concurrent.ConcurrentHashMap$BulkTask
 java.util.concurrent.ConcurrentHashMap$CollectionView
 java.util.concurrent.ConcurrentHashMap$CounterCell
-java.util.concurrent.ConcurrentHashMap$EntryIterator
-java.util.concurrent.ConcurrentHashMap$EntrySetView
 java.util.concurrent.ConcurrentHashMap$ForEachEntryTask
 java.util.concurrent.ConcurrentHashMap$ForEachKeyTask
 java.util.concurrent.ConcurrentHashMap$ForEachMappingTask
@@ -15790,7 +15687,6 @@
 java.util.concurrent.ConcurrentHashMap$KeyIterator
 java.util.concurrent.ConcurrentHashMap$KeySetView
 java.util.concurrent.ConcurrentHashMap$KeySpliterator
-java.util.concurrent.ConcurrentHashMap$MapEntry
 java.util.concurrent.ConcurrentHashMap$MapReduceEntriesTask
 java.util.concurrent.ConcurrentHashMap$MapReduceEntriesToDoubleTask
 java.util.concurrent.ConcurrentHashMap$MapReduceEntriesToIntTask
@@ -15821,13 +15717,11 @@
 java.util.concurrent.ConcurrentHashMap$Traverser
 java.util.concurrent.ConcurrentHashMap$TreeBin
 java.util.concurrent.ConcurrentHashMap$TreeNode
-java.util.concurrent.ConcurrentHashMap$ValueIterator
-java.util.concurrent.ConcurrentHashMap$ValuesView
 java.util.concurrent.ConcurrentHashMap
 java.util.concurrent.ConcurrentLinkedDeque$Node
 java.util.concurrent.ConcurrentLinkedDeque
 java.util.concurrent.ConcurrentLinkedQueue$$ExternalSyntheticLambda0
-java.util.concurrent.ConcurrentLinkedQueue$Itr
+java.util.concurrent.ConcurrentLinkedQueue$$ExternalSyntheticLambda2
 java.util.concurrent.ConcurrentLinkedQueue$Node
 java.util.concurrent.ConcurrentLinkedQueue
 java.util.concurrent.ConcurrentMap$$ExternalSyntheticLambda0
@@ -15842,8 +15736,6 @@
 java.util.concurrent.ConcurrentSkipListMap
 java.util.concurrent.ConcurrentSkipListSet
 java.util.concurrent.CopyOnWriteArrayList$$ExternalSyntheticLambda2
-java.util.concurrent.CopyOnWriteArrayList$COWIterator
-java.util.concurrent.CopyOnWriteArrayList
 java.util.concurrent.CopyOnWriteArraySet
 java.util.concurrent.CountDownLatch$Sync
 java.util.concurrent.CountDownLatch
@@ -15855,8 +15747,6 @@
 java.util.concurrent.ExecutorService
 java.util.concurrent.Executors$DefaultThreadFactory
 java.util.concurrent.Executors$DelegatedExecutorService
-java.util.concurrent.Executors$DelegatedScheduledExecutorService
-java.util.concurrent.Executors$FinalizableDelegatedExecutorService
 java.util.concurrent.Executors$RunnableAdapter
 java.util.concurrent.Executors
 java.util.concurrent.ForkJoinPool$1
@@ -15889,8 +15779,6 @@
 java.util.concurrent.ScheduledFuture
 java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr
 java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
-java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask
-java.util.concurrent.ScheduledThreadPoolExecutor
 java.util.concurrent.Semaphore$FairSync
 java.util.concurrent.Semaphore$NonfairSync
 java.util.concurrent.Semaphore$Sync
@@ -15904,8 +15792,6 @@
 java.util.concurrent.ThreadFactory
 java.util.concurrent.ThreadPoolExecutor$AbortPolicy
 java.util.concurrent.ThreadPoolExecutor$DiscardPolicy
-java.util.concurrent.ThreadPoolExecutor$Worker
-java.util.concurrent.ThreadPoolExecutor
 java.util.concurrent.TimeUnit$1
 java.util.concurrent.TimeUnit
 java.util.concurrent.TimeoutException
@@ -15944,11 +15830,9 @@
 java.util.concurrent.locks.ReentrantLock
 java.util.concurrent.locks.ReentrantReadWriteLock$FairSync
 java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync
-java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock
 java.util.concurrent.locks.ReentrantReadWriteLock$Sync$HoldCounter
 java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
 java.util.concurrent.locks.ReentrantReadWriteLock$Sync
-java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock
 java.util.concurrent.locks.ReentrantReadWriteLock
 java.util.function.BiConsumer
 java.util.function.BiFunction$$ExternalSyntheticLambda0
@@ -15964,8 +15848,8 @@
 java.util.function.DoubleSupplier
 java.util.function.DoubleUnaryOperator$$ExternalSyntheticLambda0
 java.util.function.DoubleUnaryOperator$$ExternalSyntheticLambda1
-java.util.function.DoubleUnaryOperator$$ExternalSyntheticLambda2
 java.util.function.DoubleUnaryOperator
+java.util.function.Function$$ExternalSyntheticLambda0
 java.util.function.Function$$ExternalSyntheticLambda1
 java.util.function.Function$$ExternalSyntheticLambda2
 java.util.function.Function
@@ -16052,11 +15936,13 @@
 java.util.prefs.FileSystemPreferencesFactory
 java.util.prefs.Preferences
 java.util.prefs.PreferencesFactory
+java.util.random.RandomGenerator
 java.util.regex.ASCII
 java.util.regex.MatchResult
 java.util.regex.Matcher
 java.util.regex.Pattern
 java.util.regex.PatternSyntaxException
+java.util.stream.AbstractPipeline$$ExternalSyntheticLambda0
 java.util.stream.AbstractPipeline$$ExternalSyntheticLambda2
 java.util.stream.AbstractPipeline
 java.util.stream.AbstractSpinedBuffer
@@ -16070,14 +15956,19 @@
 java.util.stream.Collectors$$ExternalSyntheticLambda20
 java.util.stream.Collectors$$ExternalSyntheticLambda21
 java.util.stream.Collectors$$ExternalSyntheticLambda22
+java.util.stream.Collectors$$ExternalSyntheticLambda23
 java.util.stream.Collectors$$ExternalSyntheticLambda24
+java.util.stream.Collectors$$ExternalSyntheticLambda25
 java.util.stream.Collectors$$ExternalSyntheticLambda26
+java.util.stream.Collectors$$ExternalSyntheticLambda30
 java.util.stream.Collectors$$ExternalSyntheticLambda34
 java.util.stream.Collectors$$ExternalSyntheticLambda37
 java.util.stream.Collectors$$ExternalSyntheticLambda39
 java.util.stream.Collectors$$ExternalSyntheticLambda41
 java.util.stream.Collectors$$ExternalSyntheticLambda42
 java.util.stream.Collectors$$ExternalSyntheticLambda45
+java.util.stream.Collectors$$ExternalSyntheticLambda47
+java.util.stream.Collectors$$ExternalSyntheticLambda48
 java.util.stream.Collectors$$ExternalSyntheticLambda49
 java.util.stream.Collectors$$ExternalSyntheticLambda4
 java.util.stream.Collectors$$ExternalSyntheticLambda50
@@ -16087,14 +15978,20 @@
 java.util.stream.Collectors$$ExternalSyntheticLambda54
 java.util.stream.Collectors$$ExternalSyntheticLambda56
 java.util.stream.Collectors$$ExternalSyntheticLambda57
+java.util.stream.Collectors$$ExternalSyntheticLambda63
 java.util.stream.Collectors$$ExternalSyntheticLambda64
 java.util.stream.Collectors$$ExternalSyntheticLambda65
 java.util.stream.Collectors$$ExternalSyntheticLambda66
+java.util.stream.Collectors$$ExternalSyntheticLambda68
+java.util.stream.Collectors$$ExternalSyntheticLambda69
+java.util.stream.Collectors$$ExternalSyntheticLambda72
+java.util.stream.Collectors$$ExternalSyntheticLambda73
 java.util.stream.Collectors$$ExternalSyntheticLambda74
 java.util.stream.Collectors$$ExternalSyntheticLambda75
 java.util.stream.Collectors$$ExternalSyntheticLambda76
 java.util.stream.Collectors$$ExternalSyntheticLambda77
 java.util.stream.Collectors$$ExternalSyntheticLambda79
+java.util.stream.Collectors$$ExternalSyntheticLambda80
 java.util.stream.Collectors$$ExternalSyntheticLambda82
 java.util.stream.Collectors$$ExternalSyntheticLambda87
 java.util.stream.Collectors$$ExternalSyntheticLambda94
@@ -16102,16 +15999,20 @@
 java.util.stream.Collectors
 java.util.stream.DistinctOps$1$1
 java.util.stream.DistinctOps$1$2
-java.util.stream.DistinctOps$1
 java.util.stream.DistinctOps
 java.util.stream.DoublePipeline$$ExternalSyntheticLambda0
 java.util.stream.DoublePipeline$$ExternalSyntheticLambda4
+java.util.stream.DoublePipeline$$ExternalSyntheticLambda7
 java.util.stream.DoublePipeline$$ExternalSyntheticLambda9
 java.util.stream.DoublePipeline$StatelessOp
 java.util.stream.DoublePipeline
 java.util.stream.DoubleStream
 java.util.stream.FindOps$FindOp
+java.util.stream.FindOps$FindSink$OfInt$$ExternalSyntheticLambda0
+java.util.stream.FindOps$FindSink$OfInt$$ExternalSyntheticLambda1
 java.util.stream.FindOps$FindSink$OfInt
+java.util.stream.FindOps$FindSink$OfRef$$ExternalSyntheticLambda0
+java.util.stream.FindOps$FindSink$OfRef$$ExternalSyntheticLambda1
 java.util.stream.FindOps$FindSink$OfRef
 java.util.stream.FindOps$FindSink
 java.util.stream.FindOps
@@ -16120,19 +16021,23 @@
 java.util.stream.ForEachOps$ForEachOp
 java.util.stream.ForEachOps
 java.util.stream.IntPipeline$$ExternalSyntheticLambda0
+java.util.stream.IntPipeline$$ExternalSyntheticLambda10
+java.util.stream.IntPipeline$$ExternalSyntheticLambda11
+java.util.stream.IntPipeline$$ExternalSyntheticLambda12
 java.util.stream.IntPipeline$$ExternalSyntheticLambda1
+java.util.stream.IntPipeline$$ExternalSyntheticLambda5
 java.util.stream.IntPipeline$$ExternalSyntheticLambda7
 java.util.stream.IntPipeline$$ExternalSyntheticLambda8
+java.util.stream.IntPipeline$1$1
 java.util.stream.IntPipeline$4$1
-java.util.stream.IntPipeline$4
 java.util.stream.IntPipeline$9
-java.util.stream.IntPipeline$Head
 java.util.stream.IntPipeline$StatelessOp
 java.util.stream.IntPipeline
 java.util.stream.IntStream
 java.util.stream.LongPipeline$$ExternalSyntheticLambda3
 java.util.stream.LongPipeline$$ExternalSyntheticLambda4
 java.util.stream.LongPipeline$$ExternalSyntheticLambda7
+java.util.stream.LongPipeline$$ExternalSyntheticLambda9
 java.util.stream.LongPipeline$StatelessOp
 java.util.stream.LongPipeline
 java.util.stream.LongStream
@@ -16173,8 +16078,10 @@
 java.util.stream.Nodes$ToArrayTask
 java.util.stream.Nodes
 java.util.stream.PipelineHelper
+java.util.stream.ReduceOps$10
 java.util.stream.ReduceOps$12
 java.util.stream.ReduceOps$12ReducingSink
+java.util.stream.ReduceOps$15
 java.util.stream.ReduceOps$1
 java.util.stream.ReduceOps$1ReducingSink
 java.util.stream.ReduceOps$2
@@ -16183,26 +16090,24 @@
 java.util.stream.ReduceOps$3ReducingSink
 java.util.stream.ReduceOps$5
 java.util.stream.ReduceOps$5ReducingSink
+java.util.stream.ReduceOps$6
 java.util.stream.ReduceOps$8
 java.util.stream.ReduceOps$8ReducingSink
 java.util.stream.ReduceOps$AccumulatingSink
 java.util.stream.ReduceOps$Box
 java.util.stream.ReduceOps$ReduceOp
 java.util.stream.ReduceOps
+java.util.stream.ReferencePipeline$$ExternalSyntheticLambda0
 java.util.stream.ReferencePipeline$$ExternalSyntheticLambda1
 java.util.stream.ReferencePipeline$2$1
-java.util.stream.ReferencePipeline$2
 java.util.stream.ReferencePipeline$3$1
-java.util.stream.ReferencePipeline$3
 java.util.stream.ReferencePipeline$4$1
-java.util.stream.ReferencePipeline$4
 java.util.stream.ReferencePipeline$5$1
 java.util.stream.ReferencePipeline$5
 java.util.stream.ReferencePipeline$6$1
 java.util.stream.ReferencePipeline$6
 java.util.stream.ReferencePipeline$7$1
 java.util.stream.ReferencePipeline$7
-java.util.stream.ReferencePipeline$Head
 java.util.stream.ReferencePipeline$StatefulOp
 java.util.stream.ReferencePipeline$StatelessOp
 java.util.stream.ReferencePipeline
@@ -16216,7 +16121,6 @@
 java.util.stream.SliceOps$1
 java.util.stream.SliceOps
 java.util.stream.SortedOps$AbstractRefSortingSink
-java.util.stream.SortedOps$OfRef
 java.util.stream.SortedOps$RefSortingSink$$ExternalSyntheticLambda0
 java.util.stream.SortedOps$RefSortingSink
 java.util.stream.SortedOps$SizedRefSortingSink
@@ -16242,7 +16146,6 @@
 java.util.stream.Streams$ConcatSpliterator$OfRef
 java.util.stream.Streams$ConcatSpliterator
 java.util.stream.Streams$RangeIntSpliterator
-java.util.stream.Streams$StreamBuilderImpl
 java.util.stream.Streams
 java.util.stream.TerminalOp
 java.util.stream.TerminalSink
@@ -16254,19 +16157,27 @@
 java.util.zip.Checksum$1
 java.util.zip.Checksum
 java.util.zip.DataFormatException
+java.util.zip.Deflater$DeflaterZStreamRef
 java.util.zip.Deflater
 java.util.zip.DeflaterOutputStream
 java.util.zip.GZIPInputStream$1
-java.util.zip.GZIPInputStream
 java.util.zip.GZIPOutputStream
+java.util.zip.Inflater$InflaterZStreamRef-IA
+java.util.zip.Inflater$InflaterZStreamRef
 java.util.zip.Inflater
 java.util.zip.InflaterInputStream
-java.util.zip.ZStreamRef
+java.util.zip.ZipCoder$UTF8ZipCoder
 java.util.zip.ZipCoder
 java.util.zip.ZipConstants
 java.util.zip.ZipEntry
 java.util.zip.ZipError
 java.util.zip.ZipException
+java.util.zip.ZipFile$CleanableResource
+java.util.zip.ZipFile$InflaterCleanupAction
+java.util.zip.ZipFile$Source$End-IA
+java.util.zip.ZipFile$Source$End
+java.util.zip.ZipFile$Source$Key
+java.util.zip.ZipFile$Source
 java.util.zip.ZipFile$ZipEntryIterator
 java.util.zip.ZipFile$ZipFileInflaterInputStream
 java.util.zip.ZipFile$ZipFileInputStream
@@ -16504,15 +16415,16 @@
 javax.xml.parsers.ParserConfigurationException
 javax.xml.parsers.SAXParser
 javax.xml.parsers.SAXParserFactory
+jdk.internal.access.JavaIOFileDescriptorAccess
+jdk.internal.access.JavaObjectInputStreamAccess
+jdk.internal.access.JavaUtilCollectionAccess
+jdk.internal.access.SharedSecrets
 jdk.internal.math.FDBigInteger
 jdk.internal.math.FloatingDecimal$1
-jdk.internal.math.FloatingDecimal$ASCIIToBinaryBuffer
 jdk.internal.math.FloatingDecimal$ASCIIToBinaryConverter
-jdk.internal.math.FloatingDecimal$BinaryToASCIIBuffer
 jdk.internal.math.FloatingDecimal$BinaryToASCIIConverter
 jdk.internal.math.FloatingDecimal$ExceptionalBinaryToASCIIBuffer
 jdk.internal.math.FloatingDecimal$HexFloatPattern
-jdk.internal.math.FloatingDecimal$PreparedASCIIToBinaryBuffer
 jdk.internal.math.FloatingDecimal
 jdk.internal.math.FormattedFloatingDecimal$1
 jdk.internal.math.FormattedFloatingDecimal$Form
@@ -16522,12 +16434,16 @@
 jdk.internal.misc.Unsafe
 jdk.internal.misc.UnsafeConstants
 jdk.internal.misc.VM
+jdk.internal.ref.CleanerFactory
 jdk.internal.ref.CleanerImpl$PhantomCleanableRef
+jdk.internal.ref.CleanerImpl
 jdk.internal.ref.PhantomCleanable
 jdk.internal.reflect.Reflection
 jdk.internal.util.ArraysSupport
+jdk.internal.util.NullableKeyValueHolder
 jdk.internal.util.Preconditions
 jdk.internal.util.StaticProperty
+jdk.internal.util.random.RandomSupport
 libcore.content.type.MimeMap$$ExternalSyntheticLambda0
 libcore.content.type.MimeMap$Builder$Element
 libcore.content.type.MimeMap$Builder
@@ -16545,7 +16461,6 @@
 libcore.icu.TimeZoneNames
 libcore.internal.StringPool
 libcore.io.AsynchronousCloseMonitor
-libcore.io.BlockGuardOs
 libcore.io.BufferIterator
 libcore.io.ClassPathURLStreamHandler$ClassPathURLConnection$1
 libcore.io.ClassPathURLStreamHandler$ClassPathURLConnection
@@ -16595,11 +16510,9 @@
 libcore.util.HexEncoding
 libcore.util.NativeAllocationRegistry$CleanerRunner
 libcore.util.NativeAllocationRegistry$CleanerThunk
-libcore.util.NativeAllocationRegistry
 libcore.util.Objects
 libcore.util.SneakyThrow
 libcore.util.XmlObjectFactory
-libcore.util.ZoneInfo
 org.apache.harmony.dalvik.ddmc.Chunk
 org.apache.harmony.dalvik.ddmc.ChunkHandler
 org.apache.harmony.dalvik.ddmc.DdmServer
@@ -16613,14 +16526,11 @@
 org.apache.harmony.xml.ExpatParser$ParseException
 org.apache.harmony.xml.ExpatParser
 org.apache.harmony.xml.ExpatReader
-org.apache.harmony.xml.dom.AttrImpl
 org.apache.harmony.xml.dom.CDATASectionImpl
 org.apache.harmony.xml.dom.CharacterDataImpl
 org.apache.harmony.xml.dom.CommentImpl
 org.apache.harmony.xml.dom.DOMImplementationImpl
-org.apache.harmony.xml.dom.DocumentImpl
 org.apache.harmony.xml.dom.DocumentTypeImpl
-org.apache.harmony.xml.dom.ElementImpl
 org.apache.harmony.xml.dom.EntityReferenceImpl
 org.apache.harmony.xml.dom.InnerNodeImpl
 org.apache.harmony.xml.dom.LeafNodeImpl
@@ -16628,7 +16538,6 @@
 org.apache.harmony.xml.dom.NodeImpl
 org.apache.harmony.xml.dom.NodeListImpl
 org.apache.harmony.xml.dom.ProcessingInstructionImpl
-org.apache.harmony.xml.dom.TextImpl
 org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl
 org.apache.harmony.xml.parsers.DocumentBuilderImpl
 org.apache.harmony.xml.parsers.SAXParserFactoryImpl
@@ -16647,7 +16556,6 @@
 org.apache.http.params.CoreConnectionPNames
 org.apache.http.params.HttpConnectionParams
 org.apache.http.params.HttpParams
-org.ccil.cowan.tagsoup.AttributesImpl
 org.ccil.cowan.tagsoup.AutoDetector
 org.ccil.cowan.tagsoup.CommandLine
 org.ccil.cowan.tagsoup.Element
@@ -16764,7 +16672,6 @@
 sun.nio.ch.FileChannelImpl$SimpleFileLockTable
 sun.nio.ch.FileChannelImpl$Unmapper-IA
 sun.nio.ch.FileChannelImpl$Unmapper
-sun.nio.ch.FileChannelImpl
 sun.nio.ch.FileDescriptorHolderSocketImpl
 sun.nio.ch.FileDispatcher
 sun.nio.ch.FileDispatcherImpl
@@ -16805,7 +16712,6 @@
 sun.nio.ch.Util
 sun.nio.cs.ArrayDecoder
 sun.nio.cs.ArrayEncoder
-sun.nio.cs.StreamDecoder
 sun.nio.cs.StreamEncoder
 sun.nio.cs.ThreadLocalCoders$1
 sun.nio.cs.ThreadLocalCoders$2
@@ -16817,7 +16723,6 @@
 sun.nio.fs.DefaultFileSystemProvider
 sun.nio.fs.DynamicFileAttributeView
 sun.nio.fs.FileOwnerAttributeViewImpl
-sun.nio.fs.LinuxFileSystem
 sun.nio.fs.LinuxFileSystemProvider
 sun.nio.fs.NativeBuffer$Deallocator
 sun.nio.fs.NativeBuffer
@@ -16840,7 +16745,6 @@
 sun.nio.fs.UnixFileSystemProvider
 sun.nio.fs.UnixMountEntry
 sun.nio.fs.UnixNativeDispatcher
-sun.nio.fs.UnixPath
 sun.nio.fs.UnixSecureDirectoryStream
 sun.nio.fs.Util
 sun.reflect.Reflection
@@ -16892,7 +16796,6 @@
 sun.security.provider.certpath.OCSPResponse
 sun.security.provider.certpath.PKIX$ValidatorParams
 sun.security.provider.certpath.PKIX
-sun.security.provider.certpath.PKIXCertPathValidator
 sun.security.provider.certpath.PKIXMasterCertPathValidator
 sun.security.provider.certpath.PolicyChecker
 sun.security.provider.certpath.PolicyNodeImpl
@@ -16925,6 +16828,7 @@
 sun.security.util.DisabledAlgorithmConstraints$Constraint
 sun.security.util.DisabledAlgorithmConstraints$Constraints
 sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint
+sun.security.util.DisabledAlgorithmConstraints$jdkCAConstraint
 sun.security.util.DisabledAlgorithmConstraints
 sun.security.util.FilePaths
 sun.security.util.KeyUtil
@@ -17665,6 +17569,7 @@
 [Ljava.text.DateFormat$Field;
 [Ljava.text.Format;
 [Ljava.text.Normalizer$Form;
+[Ljava.text.NumberFormat$Style;
 [Ljava.time.DayOfWeek;
 [Ljava.time.LocalDateTime;
 [Ljava.time.LocalTime;
@@ -17751,6 +17656,7 @@
 [Lsun.security.x509.NetscapeCertTypeExtension$MapEntry;
 [Lsun.security.x509.RDN;
 [Lsun.util.calendar.Era;
+[Lsun.util.locale.BaseLocale;
 [Lsun.util.logging.PlatformLogger$Level;
 [S
 [Z
diff --git a/core/api/current.txt b/core/api/current.txt
index 982ab64..13d5e03 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -285,7 +285,6 @@
     field @FlaggedApi("android.companion.flags.device_presence") public static final String REQUEST_OBSERVE_DEVICE_UUID_PRESENCE = "android.permission.REQUEST_OBSERVE_DEVICE_UUID_PRESENCE";
     field public static final String REQUEST_PASSWORD_COMPLEXITY = "android.permission.REQUEST_PASSWORD_COMPLEXITY";
     field @Deprecated public static final String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
-    field @FlaggedApi("android.app.job.backup_jobs_exemption") public static final String RUN_BACKUP_JOBS = "android.permission.RUN_BACKUP_JOBS";
     field public static final String RUN_USER_INITIATED_JOBS = "android.permission.RUN_USER_INITIATED_JOBS";
     field public static final String SCHEDULE_EXACT_ALARM = "android.permission.SCHEDULE_EXACT_ALARM";
     field public static final String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
@@ -5464,15 +5463,11 @@
     method public int getDeferralPolicy();
     method @Nullable public String getDeliveryGroupMatchingKey();
     method public int getDeliveryGroupPolicy();
-    method @FlaggedApi("android.app.bcast_event_timestamps") public long getEventTriggerTimestampMillis();
-    method @FlaggedApi("android.app.bcast_event_timestamps") public long getRemoteEventTriggerTimestampMillis();
     method public boolean isShareIdentityEnabled();
     method @NonNull public static android.app.BroadcastOptions makeBasic();
     method @NonNull public android.app.BroadcastOptions setDeferralPolicy(int);
     method @NonNull public android.app.BroadcastOptions setDeliveryGroupMatchingKey(@NonNull String, @NonNull String);
     method @NonNull public android.app.BroadcastOptions setDeliveryGroupPolicy(int);
-    method @FlaggedApi("android.app.bcast_event_timestamps") public void setEventTriggerTimestampMillis(long);
-    method @FlaggedApi("android.app.bcast_event_timestamps") public void setRemoteEventTriggerTimestampMillis(long);
     method @NonNull public android.app.BroadcastOptions setShareIdentityEnabled(boolean);
     method @NonNull public android.os.Bundle toBundle();
     field public static final int DEFERRAL_POLICY_DEFAULT = 0; // 0x0
@@ -8028,7 +8023,7 @@
     method public CharSequence getDeviceOwnerLockScreenInfo();
     method @Nullable public String getDevicePolicyManagementRoleHolderPackage();
     method public CharSequence getEndUserSessionMessage(@NonNull android.content.ComponentName);
-    method @FlaggedApi("android.app.admin.flags.permission_migration_for_zero_trust_api_enabled") @NonNull @RequiresPermission(value=android.Manifest.permission.MANAGE_DEVICE_POLICY_CERTIFICATES, conditional=true) public String getEnrollmentSpecificId();
+    method @NonNull @RequiresPermission(value=android.Manifest.permission.MANAGE_DEVICE_POLICY_CERTIFICATES, conditional=true) public String getEnrollmentSpecificId();
     method @Nullable @RequiresPermission(value=android.Manifest.permission.MANAGE_DEVICE_POLICY_FACTORY_RESET, conditional=true) public android.app.admin.FactoryResetProtectionPolicy getFactoryResetProtectionPolicy(@Nullable android.content.ComponentName);
     method @Nullable public String getGlobalPrivateDnsHost(@NonNull android.content.ComponentName);
     method public int getGlobalPrivateDnsMode(@NonNull android.content.ComponentName);
@@ -8067,7 +8062,7 @@
     method @Deprecated public int getPasswordMinimumSymbols(@Nullable android.content.ComponentName);
     method @Deprecated public int getPasswordMinimumUpperCase(@Nullable android.content.ComponentName);
     method @Deprecated public int getPasswordQuality(@Nullable android.content.ComponentName);
-    method @FlaggedApi("android.app.admin.flags.permission_migration_for_zero_trust_api_enabled") @Nullable @RequiresPermission(value=android.Manifest.permission.MANAGE_DEVICE_POLICY_QUERY_SYSTEM_UPDATES, conditional=true) public android.app.admin.SystemUpdateInfo getPendingSystemUpdate(@Nullable android.content.ComponentName);
+    method @Nullable @RequiresPermission(value=android.Manifest.permission.MANAGE_DEVICE_POLICY_QUERY_SYSTEM_UPDATES, conditional=true) public android.app.admin.SystemUpdateInfo getPendingSystemUpdate(@Nullable android.content.ComponentName);
     method @RequiresPermission(value=android.Manifest.permission.MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS, conditional=true) public int getPermissionGrantState(@Nullable android.content.ComponentName, @NonNull String, @NonNull String);
     method public int getPermissionPolicy(android.content.ComponentName);
     method @Nullable public java.util.List<java.lang.String> getPermittedAccessibilityServices(@NonNull android.content.ComponentName);
@@ -9247,140 +9242,140 @@
 
 package android.app.slice {
 
-  public final class Slice implements android.os.Parcelable {
-    ctor protected Slice(android.os.Parcel);
-    method public int describeContents();
-    method public java.util.List<java.lang.String> getHints();
-    method public java.util.List<android.app.slice.SliceItem> getItems();
-    method @Nullable public android.app.slice.SliceSpec getSpec();
-    method public android.net.Uri getUri();
-    method public boolean isCallerNeeded();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.slice.Slice> CREATOR;
-    field public static final String EXTRA_RANGE_VALUE = "android.app.slice.extra.RANGE_VALUE";
-    field public static final String EXTRA_TOGGLE_STATE = "android.app.slice.extra.TOGGLE_STATE";
-    field public static final String HINT_ACTIONS = "actions";
-    field public static final String HINT_ERROR = "error";
-    field public static final String HINT_HORIZONTAL = "horizontal";
-    field public static final String HINT_KEYWORDS = "keywords";
-    field public static final String HINT_LARGE = "large";
-    field public static final String HINT_LAST_UPDATED = "last_updated";
-    field public static final String HINT_LIST = "list";
-    field public static final String HINT_LIST_ITEM = "list_item";
-    field public static final String HINT_NO_TINT = "no_tint";
-    field public static final String HINT_PARTIAL = "partial";
-    field public static final String HINT_PERMISSION_REQUEST = "permission_request";
-    field public static final String HINT_SEE_MORE = "see_more";
-    field public static final String HINT_SELECTED = "selected";
-    field public static final String HINT_SHORTCUT = "shortcut";
-    field public static final String HINT_SUMMARY = "summary";
-    field public static final String HINT_TITLE = "title";
-    field public static final String HINT_TTL = "ttl";
-    field public static final String SUBTYPE_COLOR = "color";
-    field public static final String SUBTYPE_CONTENT_DESCRIPTION = "content_description";
-    field public static final String SUBTYPE_LAYOUT_DIRECTION = "layout_direction";
-    field public static final String SUBTYPE_MAX = "max";
-    field public static final String SUBTYPE_MESSAGE = "message";
-    field public static final String SUBTYPE_MILLIS = "millis";
-    field public static final String SUBTYPE_PRIORITY = "priority";
-    field public static final String SUBTYPE_RANGE = "range";
-    field public static final String SUBTYPE_SOURCE = "source";
-    field public static final String SUBTYPE_TOGGLE = "toggle";
-    field public static final String SUBTYPE_VALUE = "value";
+  @Deprecated public final class Slice implements android.os.Parcelable {
+    ctor @Deprecated protected Slice(android.os.Parcel);
+    method @Deprecated public int describeContents();
+    method @Deprecated public java.util.List<java.lang.String> getHints();
+    method @Deprecated public java.util.List<android.app.slice.SliceItem> getItems();
+    method @Deprecated @Nullable public android.app.slice.SliceSpec getSpec();
+    method @Deprecated public android.net.Uri getUri();
+    method @Deprecated public boolean isCallerNeeded();
+    method @Deprecated public void writeToParcel(android.os.Parcel, int);
+    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.app.slice.Slice> CREATOR;
+    field @Deprecated public static final String EXTRA_RANGE_VALUE = "android.app.slice.extra.RANGE_VALUE";
+    field @Deprecated public static final String EXTRA_TOGGLE_STATE = "android.app.slice.extra.TOGGLE_STATE";
+    field @Deprecated public static final String HINT_ACTIONS = "actions";
+    field @Deprecated public static final String HINT_ERROR = "error";
+    field @Deprecated public static final String HINT_HORIZONTAL = "horizontal";
+    field @Deprecated public static final String HINT_KEYWORDS = "keywords";
+    field @Deprecated public static final String HINT_LARGE = "large";
+    field @Deprecated public static final String HINT_LAST_UPDATED = "last_updated";
+    field @Deprecated public static final String HINT_LIST = "list";
+    field @Deprecated public static final String HINT_LIST_ITEM = "list_item";
+    field @Deprecated public static final String HINT_NO_TINT = "no_tint";
+    field @Deprecated public static final String HINT_PARTIAL = "partial";
+    field @Deprecated public static final String HINT_PERMISSION_REQUEST = "permission_request";
+    field @Deprecated public static final String HINT_SEE_MORE = "see_more";
+    field @Deprecated public static final String HINT_SELECTED = "selected";
+    field @Deprecated public static final String HINT_SHORTCUT = "shortcut";
+    field @Deprecated public static final String HINT_SUMMARY = "summary";
+    field @Deprecated public static final String HINT_TITLE = "title";
+    field @Deprecated public static final String HINT_TTL = "ttl";
+    field @Deprecated public static final String SUBTYPE_COLOR = "color";
+    field @Deprecated public static final String SUBTYPE_CONTENT_DESCRIPTION = "content_description";
+    field @Deprecated public static final String SUBTYPE_LAYOUT_DIRECTION = "layout_direction";
+    field @Deprecated public static final String SUBTYPE_MAX = "max";
+    field @Deprecated public static final String SUBTYPE_MESSAGE = "message";
+    field @Deprecated public static final String SUBTYPE_MILLIS = "millis";
+    field @Deprecated public static final String SUBTYPE_PRIORITY = "priority";
+    field @Deprecated public static final String SUBTYPE_RANGE = "range";
+    field @Deprecated public static final String SUBTYPE_SOURCE = "source";
+    field @Deprecated public static final String SUBTYPE_TOGGLE = "toggle";
+    field @Deprecated public static final String SUBTYPE_VALUE = "value";
   }
 
-  public static class Slice.Builder {
-    ctor public Slice.Builder(@NonNull android.net.Uri, android.app.slice.SliceSpec);
-    ctor public Slice.Builder(@NonNull android.app.slice.Slice.Builder);
-    method public android.app.slice.Slice.Builder addAction(@NonNull android.app.PendingIntent, @NonNull android.app.slice.Slice, @Nullable String);
-    method public android.app.slice.Slice.Builder addBundle(android.os.Bundle, @Nullable String, java.util.List<java.lang.String>);
-    method public android.app.slice.Slice.Builder addHints(java.util.List<java.lang.String>);
-    method public android.app.slice.Slice.Builder addIcon(android.graphics.drawable.Icon, @Nullable String, java.util.List<java.lang.String>);
-    method public android.app.slice.Slice.Builder addInt(int, @Nullable String, java.util.List<java.lang.String>);
-    method public android.app.slice.Slice.Builder addLong(long, @Nullable String, java.util.List<java.lang.String>);
-    method public android.app.slice.Slice.Builder addRemoteInput(android.app.RemoteInput, @Nullable String, java.util.List<java.lang.String>);
-    method public android.app.slice.Slice.Builder addSubSlice(@NonNull android.app.slice.Slice, @Nullable String);
-    method public android.app.slice.Slice.Builder addText(CharSequence, @Nullable String, java.util.List<java.lang.String>);
-    method public android.app.slice.Slice build();
-    method public android.app.slice.Slice.Builder setCallerNeeded(boolean);
+  @Deprecated public static class Slice.Builder {
+    ctor @Deprecated public Slice.Builder(@NonNull android.net.Uri, android.app.slice.SliceSpec);
+    ctor @Deprecated public Slice.Builder(@NonNull android.app.slice.Slice.Builder);
+    method @Deprecated public android.app.slice.Slice.Builder addAction(@NonNull android.app.PendingIntent, @NonNull android.app.slice.Slice, @Nullable String);
+    method @Deprecated public android.app.slice.Slice.Builder addBundle(android.os.Bundle, @Nullable String, java.util.List<java.lang.String>);
+    method @Deprecated public android.app.slice.Slice.Builder addHints(java.util.List<java.lang.String>);
+    method @Deprecated public android.app.slice.Slice.Builder addIcon(android.graphics.drawable.Icon, @Nullable String, java.util.List<java.lang.String>);
+    method @Deprecated public android.app.slice.Slice.Builder addInt(int, @Nullable String, java.util.List<java.lang.String>);
+    method @Deprecated public android.app.slice.Slice.Builder addLong(long, @Nullable String, java.util.List<java.lang.String>);
+    method @Deprecated public android.app.slice.Slice.Builder addRemoteInput(android.app.RemoteInput, @Nullable String, java.util.List<java.lang.String>);
+    method @Deprecated public android.app.slice.Slice.Builder addSubSlice(@NonNull android.app.slice.Slice, @Nullable String);
+    method @Deprecated public android.app.slice.Slice.Builder addText(CharSequence, @Nullable String, java.util.List<java.lang.String>);
+    method @Deprecated public android.app.slice.Slice build();
+    method @Deprecated public android.app.slice.Slice.Builder setCallerNeeded(boolean);
   }
 
-  public final class SliceItem implements android.os.Parcelable {
-    method public int describeContents();
-    method public android.app.PendingIntent getAction();
-    method public android.os.Bundle getBundle();
-    method public String getFormat();
-    method @NonNull public java.util.List<java.lang.String> getHints();
-    method public android.graphics.drawable.Icon getIcon();
-    method public int getInt();
-    method public long getLong();
-    method public android.app.RemoteInput getRemoteInput();
-    method public android.app.slice.Slice getSlice();
-    method public String getSubType();
-    method public CharSequence getText();
-    method public boolean hasHint(String);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.slice.SliceItem> CREATOR;
-    field public static final String FORMAT_ACTION = "action";
-    field public static final String FORMAT_BUNDLE = "bundle";
-    field public static final String FORMAT_IMAGE = "image";
-    field public static final String FORMAT_INT = "int";
-    field public static final String FORMAT_LONG = "long";
-    field public static final String FORMAT_REMOTE_INPUT = "input";
-    field public static final String FORMAT_SLICE = "slice";
-    field public static final String FORMAT_TEXT = "text";
+  @Deprecated public final class SliceItem implements android.os.Parcelable {
+    method @Deprecated public int describeContents();
+    method @Deprecated public android.app.PendingIntent getAction();
+    method @Deprecated public android.os.Bundle getBundle();
+    method @Deprecated public String getFormat();
+    method @Deprecated @NonNull public java.util.List<java.lang.String> getHints();
+    method @Deprecated public android.graphics.drawable.Icon getIcon();
+    method @Deprecated public int getInt();
+    method @Deprecated public long getLong();
+    method @Deprecated public android.app.RemoteInput getRemoteInput();
+    method @Deprecated public android.app.slice.Slice getSlice();
+    method @Deprecated public String getSubType();
+    method @Deprecated public CharSequence getText();
+    method @Deprecated public boolean hasHint(String);
+    method @Deprecated public void writeToParcel(android.os.Parcel, int);
+    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.app.slice.SliceItem> CREATOR;
+    field @Deprecated public static final String FORMAT_ACTION = "action";
+    field @Deprecated public static final String FORMAT_BUNDLE = "bundle";
+    field @Deprecated public static final String FORMAT_IMAGE = "image";
+    field @Deprecated public static final String FORMAT_INT = "int";
+    field @Deprecated public static final String FORMAT_LONG = "long";
+    field @Deprecated public static final String FORMAT_REMOTE_INPUT = "input";
+    field @Deprecated public static final String FORMAT_SLICE = "slice";
+    field @Deprecated public static final String FORMAT_TEXT = "text";
   }
 
-  public class SliceManager {
-    method @Nullable public android.app.slice.Slice bindSlice(@NonNull android.net.Uri, @NonNull java.util.Set<android.app.slice.SliceSpec>);
-    method @Nullable public android.app.slice.Slice bindSlice(@NonNull android.content.Intent, @NonNull java.util.Set<android.app.slice.SliceSpec>);
-    method public int checkSlicePermission(@NonNull android.net.Uri, int, int);
-    method @NonNull public java.util.List<android.net.Uri> getPinnedSlices();
-    method @NonNull public java.util.Set<android.app.slice.SliceSpec> getPinnedSpecs(android.net.Uri);
-    method @NonNull @WorkerThread public java.util.Collection<android.net.Uri> getSliceDescendants(@NonNull android.net.Uri);
-    method public void grantSlicePermission(@NonNull String, @NonNull android.net.Uri);
-    method @Nullable public android.net.Uri mapIntentToUri(@NonNull android.content.Intent);
-    method public void pinSlice(@NonNull android.net.Uri, @NonNull java.util.Set<android.app.slice.SliceSpec>);
-    method public void revokeSlicePermission(@NonNull String, @NonNull android.net.Uri);
-    method public void unpinSlice(@NonNull android.net.Uri);
-    field public static final String CATEGORY_SLICE = "android.app.slice.category.SLICE";
-    field public static final String SLICE_METADATA_KEY = "android.metadata.SLICE_URI";
+  @Deprecated public class SliceManager {
+    method @Deprecated @Nullable public android.app.slice.Slice bindSlice(@NonNull android.net.Uri, @NonNull java.util.Set<android.app.slice.SliceSpec>);
+    method @Deprecated @Nullable public android.app.slice.Slice bindSlice(@NonNull android.content.Intent, @NonNull java.util.Set<android.app.slice.SliceSpec>);
+    method @Deprecated public int checkSlicePermission(@NonNull android.net.Uri, int, int);
+    method @Deprecated @NonNull public java.util.List<android.net.Uri> getPinnedSlices();
+    method @Deprecated @NonNull public java.util.Set<android.app.slice.SliceSpec> getPinnedSpecs(android.net.Uri);
+    method @Deprecated @NonNull @WorkerThread public java.util.Collection<android.net.Uri> getSliceDescendants(@NonNull android.net.Uri);
+    method @Deprecated public void grantSlicePermission(@NonNull String, @NonNull android.net.Uri);
+    method @Deprecated @Nullable public android.net.Uri mapIntentToUri(@NonNull android.content.Intent);
+    method @Deprecated public void pinSlice(@NonNull android.net.Uri, @NonNull java.util.Set<android.app.slice.SliceSpec>);
+    method @Deprecated public void revokeSlicePermission(@NonNull String, @NonNull android.net.Uri);
+    method @Deprecated public void unpinSlice(@NonNull android.net.Uri);
+    field @Deprecated public static final String CATEGORY_SLICE = "android.app.slice.category.SLICE";
+    field @Deprecated public static final String SLICE_METADATA_KEY = "android.metadata.SLICE_URI";
   }
 
-  public class SliceMetrics {
-    ctor public SliceMetrics(@NonNull android.content.Context, @NonNull android.net.Uri);
-    method public void logHidden();
-    method public void logTouch(int, @NonNull android.net.Uri);
-    method public void logVisible();
+  @Deprecated public class SliceMetrics {
+    ctor @Deprecated public SliceMetrics(@NonNull android.content.Context, @NonNull android.net.Uri);
+    method @Deprecated public void logHidden();
+    method @Deprecated public void logTouch(int, @NonNull android.net.Uri);
+    method @Deprecated public void logVisible();
   }
 
-  public abstract class SliceProvider extends android.content.ContentProvider {
-    ctor public SliceProvider(@NonNull java.lang.String...);
-    ctor public SliceProvider();
-    method public final int delete(android.net.Uri, String, String[]);
-    method public final String getType(android.net.Uri);
-    method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
-    method public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.Set<android.app.slice.SliceSpec>);
-    method @NonNull public android.app.PendingIntent onCreatePermissionRequest(android.net.Uri);
-    method @NonNull public java.util.Collection<android.net.Uri> onGetSliceDescendants(@NonNull android.net.Uri);
-    method @NonNull public android.net.Uri onMapIntentToUri(android.content.Intent);
-    method public void onSlicePinned(android.net.Uri);
-    method public void onSliceUnpinned(android.net.Uri);
-    method public final android.database.Cursor query(android.net.Uri, String[], String, String[], String);
-    method public final android.database.Cursor query(android.net.Uri, String[], String, String[], String, android.os.CancellationSignal);
-    method public final android.database.Cursor query(android.net.Uri, String[], android.os.Bundle, android.os.CancellationSignal);
-    method public final int update(android.net.Uri, android.content.ContentValues, String, String[]);
-    field public static final String SLICE_TYPE = "vnd.android.slice";
+  @Deprecated public abstract class SliceProvider extends android.content.ContentProvider {
+    ctor @Deprecated public SliceProvider(@NonNull java.lang.String...);
+    ctor @Deprecated public SliceProvider();
+    method @Deprecated public final int delete(android.net.Uri, String, String[]);
+    method @Deprecated public final String getType(android.net.Uri);
+    method @Deprecated public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
+    method @Deprecated public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.Set<android.app.slice.SliceSpec>);
+    method @Deprecated @NonNull public android.app.PendingIntent onCreatePermissionRequest(android.net.Uri);
+    method @Deprecated @NonNull public java.util.Collection<android.net.Uri> onGetSliceDescendants(@NonNull android.net.Uri);
+    method @Deprecated @NonNull public android.net.Uri onMapIntentToUri(android.content.Intent);
+    method @Deprecated public void onSlicePinned(android.net.Uri);
+    method @Deprecated public void onSliceUnpinned(android.net.Uri);
+    method @Deprecated public final android.database.Cursor query(android.net.Uri, String[], String, String[], String);
+    method @Deprecated public final android.database.Cursor query(android.net.Uri, String[], String, String[], String, android.os.CancellationSignal);
+    method @Deprecated public final android.database.Cursor query(android.net.Uri, String[], android.os.Bundle, android.os.CancellationSignal);
+    method @Deprecated public final int update(android.net.Uri, android.content.ContentValues, String, String[]);
+    field @Deprecated public static final String SLICE_TYPE = "vnd.android.slice";
   }
 
-  public final class SliceSpec implements android.os.Parcelable {
-    ctor public SliceSpec(@NonNull String, int);
-    method public boolean canRender(@NonNull android.app.slice.SliceSpec);
-    method public int describeContents();
-    method public int getRevision();
-    method public String getType();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.app.slice.SliceSpec> CREATOR;
+  @Deprecated public final class SliceSpec implements android.os.Parcelable {
+    ctor @Deprecated public SliceSpec(@NonNull String, int);
+    method @Deprecated public boolean canRender(@NonNull android.app.slice.SliceSpec);
+    method @Deprecated public int describeContents();
+    method @Deprecated public int getRevision();
+    method @Deprecated public String getType();
+    method @Deprecated public void writeToParcel(android.os.Parcel, int);
+    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.app.slice.SliceSpec> CREATOR;
   }
 
 }
@@ -9882,7 +9877,7 @@
     ctor public ObservingDevicePresenceRequest.Builder();
     method @NonNull public android.companion.ObservingDevicePresenceRequest build();
     method @NonNull public android.companion.ObservingDevicePresenceRequest.Builder setAssociationId(int);
-    method @NonNull @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_DEVICE_UUID_PRESENCE) public android.companion.ObservingDevicePresenceRequest.Builder setUuid(@NonNull android.os.ParcelUuid);
+    method @NonNull @RequiresPermission(allOf={android.Manifest.permission.REQUEST_OBSERVE_DEVICE_UUID_PRESENCE, android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_SCAN}) public android.companion.ObservingDevicePresenceRequest.Builder setUuid(@NonNull android.os.ParcelUuid);
   }
 
   public final class WifiDeviceFilter implements android.companion.DeviceFilter<android.net.wifi.ScanResult> {
@@ -10152,17 +10147,17 @@
 
   public interface ComponentCallbacks {
     method public void onConfigurationChanged(@NonNull android.content.res.Configuration);
-    method public void onLowMemory();
+    method @Deprecated public void onLowMemory();
   }
 
   public interface ComponentCallbacks2 extends android.content.ComponentCallbacks {
     method public void onTrimMemory(int);
     field public static final int TRIM_MEMORY_BACKGROUND = 40; // 0x28
-    field public static final int TRIM_MEMORY_COMPLETE = 80; // 0x50
-    field public static final int TRIM_MEMORY_MODERATE = 60; // 0x3c
-    field public static final int TRIM_MEMORY_RUNNING_CRITICAL = 15; // 0xf
-    field public static final int TRIM_MEMORY_RUNNING_LOW = 10; // 0xa
-    field public static final int TRIM_MEMORY_RUNNING_MODERATE = 5; // 0x5
+    field @Deprecated public static final int TRIM_MEMORY_COMPLETE = 80; // 0x50
+    field @Deprecated public static final int TRIM_MEMORY_MODERATE = 60; // 0x3c
+    field @Deprecated public static final int TRIM_MEMORY_RUNNING_CRITICAL = 15; // 0xf
+    field @Deprecated public static final int TRIM_MEMORY_RUNNING_LOW = 10; // 0xa
+    field @Deprecated public static final int TRIM_MEMORY_RUNNING_MODERATE = 5; // 0x5
     field public static final int TRIM_MEMORY_UI_HIDDEN = 20; // 0x14
   }
 
@@ -37288,7 +37283,6 @@
     field public static final String ACTION_APP_USAGE_SETTINGS = "android.settings.action.APP_USAGE_SETTINGS";
     field @FlaggedApi("android.app.modes_api") public static final String ACTION_AUTOMATIC_ZEN_RULE_SETTINGS = "android.settings.AUTOMATIC_ZEN_RULE_SETTINGS";
     field public static final String ACTION_AUTO_ROTATE_SETTINGS = "android.settings.AUTO_ROTATE_SETTINGS";
-    field @FlaggedApi("android.app.app_restrictions_api") public static final String ACTION_BACKGROUND_RESTRICTIONS_SETTINGS = "android.settings.BACKGROUND_RESTRICTIONS_SETTINGS";
     field public static final String ACTION_BATTERY_SAVER_SETTINGS = "android.settings.BATTERY_SAVER_SETTINGS";
     field public static final String ACTION_BIOMETRIC_ENROLL = "android.settings.BIOMETRIC_ENROLL";
     field public static final String ACTION_BLUETOOTH_SETTINGS = "android.settings.BLUETOOTH_SETTINGS";
@@ -37343,7 +37337,6 @@
     field public static final String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
     field public static final String ACTION_REQUEST_MANAGE_MEDIA = "android.settings.REQUEST_MANAGE_MEDIA";
     field @FlaggedApi("com.android.media.flags.enable_privileged_routing_for_media_routing_control") public static final String ACTION_REQUEST_MEDIA_ROUTING_CONTROL = "android.settings.REQUEST_MEDIA_ROUTING_CONTROL";
-    field @FlaggedApi("android.provider.backup_tasks_settings_screen") public static final String ACTION_REQUEST_RUN_BACKUP_JOBS = "android.settings.REQUEST_RUN_BACKUP_JOBS";
     field public static final String ACTION_REQUEST_SCHEDULE_EXACT_ALARM = "android.settings.REQUEST_SCHEDULE_EXACT_ALARM";
     field public static final String ACTION_REQUEST_SET_AUTOFILL_SERVICE = "android.settings.REQUEST_SET_AUTOFILL_SERVICE";
     field @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") public static final String ACTION_SATELLITE_SETTING = "android.settings.SATELLITE_SETTING";
@@ -57034,7 +57027,6 @@
     field public static final String TYPE_EMAIL = "email";
     field public static final String TYPE_FLIGHT_NUMBER = "flight";
     field public static final String TYPE_OTHER = "other";
-    field @FlaggedApi("android.service.notification.redact_sensitive_notifications_from_untrusted_listeners") public static final String TYPE_OTP_CODE = "otp_code";
     field public static final String TYPE_PHONE = "phone";
     field public static final String TYPE_UNKNOWN = "";
     field public static final String TYPE_URL = "url";
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 5ead3e1..b767c52 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -319,9 +319,8 @@
     field public static final String RECEIVE_DATA_ACTIVITY_CHANGE = "android.permission.RECEIVE_DATA_ACTIVITY_CHANGE";
     field public static final String RECEIVE_DEVICE_CUSTOMIZATION_READY = "android.permission.RECEIVE_DEVICE_CUSTOMIZATION_READY";
     field public static final String RECEIVE_EMERGENCY_BROADCAST = "android.permission.RECEIVE_EMERGENCY_BROADCAST";
-    field @FlaggedApi("android.permission.flags.voice_activation_permission_apis") public static final String RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA = "android.permission.RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA";
     field @FlaggedApi("android.permission.flags.voice_activation_permission_apis") public static final String RECEIVE_SANDBOX_TRIGGER_AUDIO = "android.permission.RECEIVE_SANDBOX_TRIGGER_AUDIO";
-    field @FlaggedApi("com.android.server.notification.flags.redact_otp_notifications_from_untrusted_listeners") public static final String RECEIVE_SENSITIVE_NOTIFICATIONS = "android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS";
+    field @FlaggedApi("android.view.flags.sensitive_content_app_protection_api") public static final String RECEIVE_SENSITIVE_NOTIFICATIONS = "android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS";
     field public static final String RECEIVE_WIFI_CREDENTIAL_CHANGE = "android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE";
     field public static final String RECORD_BACKGROUND_AUDIO = "android.permission.RECORD_BACKGROUND_AUDIO";
     field public static final String RECOVERY = "android.permission.RECOVERY";
@@ -2178,8 +2177,15 @@
 
 package android.app.contextualsearch {
 
-  @FlaggedApi("android.app.contextualsearch.flags.enable_service") public class ContextualSearchManager {
-    method public void getContextualSearchState(@NonNull android.os.IBinder, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.app.contextualsearch.ContextualSearchState,java.lang.Throwable>);
+  @FlaggedApi("android.app.contextualsearch.flags.enable_service") public final class CallbackToken implements android.os.Parcelable {
+    ctor public CallbackToken();
+    method public int describeContents();
+    method public void getContextualSearchState(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.app.contextualsearch.ContextualSearchState,java.lang.Throwable>);
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.app.contextualsearch.CallbackToken> CREATOR;
+  }
+
+  @FlaggedApi("android.app.contextualsearch.flags.enable_service") public final class ContextualSearchManager {
     method @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXTUAL_SEARCH) public void startContextualSearch(int);
     field public static final String ACTION_LAUNCH_CONTEXTUAL_SEARCH = "android.app.contextualsearch.action.LAUNCH_CONTEXTUAL_SEARCH";
     field public static final int ENTRYPOINT_LONG_PRESS_HOME = 2; // 0x2
@@ -13483,12 +13489,12 @@
     method public static int getMaxBundleSize();
     method public static int getMaxHotwordPhraseId();
     method public static int getMaxScore();
-    method @FlaggedApi("android.service.voice.flags.allow_speaker_id_egress") public static int getMaxSpeakerId();
+    method public static int getMaxSpeakerId();
     method @Nullable public android.media.MediaSyncEvent getMediaSyncEvent();
     method public int getPersonalizedScore();
     method public int getProximity();
     method public int getScore();
-    method @FlaggedApi("android.service.voice.flags.allow_speaker_id_egress") public int getSpeakerId();
+    method public int getSpeakerId();
     method public boolean isHotwordDetectionPersonalized();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field public static final int AUDIO_CHANNEL_UNSET = -1; // 0xffffffff
@@ -13522,7 +13528,7 @@
     method @NonNull public android.service.voice.HotwordDetectedResult.Builder setMediaSyncEvent(@NonNull android.media.MediaSyncEvent);
     method @NonNull public android.service.voice.HotwordDetectedResult.Builder setPersonalizedScore(int);
     method @NonNull public android.service.voice.HotwordDetectedResult.Builder setScore(int);
-    method @FlaggedApi("android.service.voice.flags.allow_speaker_id_egress") @NonNull public android.service.voice.HotwordDetectedResult.Builder setSpeakerId(int);
+    method @NonNull public android.service.voice.HotwordDetectedResult.Builder setSpeakerId(int);
   }
 
   public abstract class HotwordDetectionService extends android.app.Service implements android.service.voice.SandboxedDetectionInitializer {
@@ -13621,7 +13627,7 @@
     field public static final int ERROR_CODE_UNKNOWN = 0; // 0x0
   }
 
-  @FlaggedApi("android.service.voice.flags.allow_various_attention_types") public final class VisualQueryAttentionResult implements android.os.Parcelable {
+  public final class VisualQueryAttentionResult implements android.os.Parcelable {
     method public int describeContents();
     method @IntRange(from=1, to=100) public int getEngagementLevel();
     method public int getInteractionIntention();
@@ -13638,7 +13644,7 @@
     method @NonNull public android.service.voice.VisualQueryAttentionResult.Builder setInteractionIntention(int);
   }
 
-  @FlaggedApi("android.service.voice.flags.allow_complex_results_egress_from_vqds") public final class VisualQueryDetectedResult implements android.os.Parcelable {
+  public final class VisualQueryDetectedResult implements android.os.Parcelable {
     method public int describeContents();
     method @Nullable public byte[] getAccessibilityDetectionData();
     method public static int getMaxSpeakerId();
@@ -13660,16 +13666,16 @@
     ctor public VisualQueryDetectionService();
     method public final void finishQuery() throws java.lang.IllegalStateException;
     method public final void gainedAttention();
-    method @FlaggedApi("android.service.voice.flags.allow_various_attention_types") public final void gainedAttention(@NonNull android.service.voice.VisualQueryAttentionResult);
+    method public final void gainedAttention(@NonNull android.service.voice.VisualQueryAttentionResult);
     method public final void lostAttention();
-    method @FlaggedApi("android.service.voice.flags.allow_various_attention_types") public final void lostAttention(int);
+    method public final void lostAttention(int);
     method @Nullable public android.os.IBinder onBind(@NonNull android.content.Intent);
     method public void onStartDetection();
     method public void onStopDetection();
     method public void onUpdateState(@Nullable android.os.PersistableBundle, @Nullable android.os.SharedMemory, long, @Nullable java.util.function.IntConsumer);
     method public final void rejectQuery() throws java.lang.IllegalStateException;
     method public final void streamQuery(@NonNull String) throws java.lang.IllegalStateException;
-    method @FlaggedApi("android.service.voice.flags.allow_complex_results_egress_from_vqds") public final void streamQuery(@NonNull android.service.voice.VisualQueryDetectedResult);
+    method public final void streamQuery(@NonNull android.service.voice.VisualQueryDetectedResult);
     field public static final String SERVICE_INTERFACE = "android.service.voice.VisualQueryDetectionService";
   }
 
@@ -13689,10 +13695,10 @@
   }
 
   public class VisualQueryDetector {
-    method @FlaggedApi("android.service.voice.flags.allow_complex_results_egress_from_vqds") public void clearAccessibilityDetectionEnabledListener();
+    method public void clearAccessibilityDetectionEnabledListener();
     method public void destroy();
-    method @FlaggedApi("android.service.voice.flags.allow_complex_results_egress_from_vqds") public boolean isAccessibilityDetectionEnabled();
-    method @FlaggedApi("android.service.voice.flags.allow_complex_results_egress_from_vqds") public void setAccessibilityDetectionEnabledListener(@NonNull java.util.function.Consumer<java.lang.Boolean>);
+    method public boolean isAccessibilityDetectionEnabled();
+    method public void setAccessibilityDetectionEnabledListener(@NonNull java.util.function.Consumer<java.lang.Boolean>);
     method @RequiresPermission(allOf={android.Manifest.permission.CAMERA, android.Manifest.permission.RECORD_AUDIO}) public boolean startRecognition();
     method @RequiresPermission(allOf={android.Manifest.permission.CAMERA, android.Manifest.permission.RECORD_AUDIO}) public boolean stopRecognition();
     method public void updateState(@Nullable android.os.PersistableBundle, @Nullable android.os.SharedMemory);
@@ -13701,7 +13707,7 @@
   public static interface VisualQueryDetector.Callback {
     method public void onFailure(@NonNull android.service.voice.VisualQueryDetectionServiceFailure);
     method public void onQueryDetected(@NonNull String);
-    method @FlaggedApi("android.service.voice.flags.allow_complex_results_egress_from_vqds") public default void onQueryDetected(@NonNull android.service.voice.VisualQueryDetectedResult);
+    method public default void onQueryDetected(@NonNull android.service.voice.VisualQueryDetectedResult);
     method public void onQueryFinished();
     method public void onQueryRejected();
     method public void onUnknownFailure(@NonNull String);
@@ -15342,7 +15348,7 @@
     method @Deprecated public boolean getDataEnabled(int);
     method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.ComponentName getDefaultRespondViaMessageApplication();
     method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getDeviceSoftwareVersion(int);
-    method @FlaggedApi("android.permission.flags.get_emergency_role_holder_api_enabled") @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getEmergencyAssistancePackageName();
+    method @FlaggedApi("android.permission.flags.get_emergency_role_holder_api_enabled") @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getEmergencyAssistancePackageName();
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getEmergencyCallbackMode();
     method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEmergencyNumberDbVersion();
     method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimDomain();
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index a76aa67..3b988e1 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -157,7 +157,7 @@
     method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public void scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int);
     method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}) public void setStopUserOnSwitch(int);
     method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}) public boolean startUserInBackgroundVisibleOnDisplay(int, int);
-    method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public boolean stopUser(int, boolean);
+    method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public boolean stopUser(int);
     method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void unregisterUidFrozenStateChangedCallback(@NonNull android.app.ActivityManager.UidFrozenStateChangedCallback);
     method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public boolean updateMccMncConfiguration(@NonNull String, @NonNull String);
     method @RequiresPermission(android.Manifest.permission.DUMP) public void waitForBroadcastIdle();
@@ -486,12 +486,16 @@
   }
 
   public final class UiAutomation {
+    method public void addOverridePermissionState(int, @NonNull String, int);
+    method public void clearAllOverridePermissionStates();
+    method public void clearOverridePermissionStates(int);
     method public void destroy();
     method @NonNull public java.util.Set<java.lang.String> getAdoptedShellPermissions();
     method @Deprecated public boolean grantRuntimePermission(String, String, android.os.UserHandle);
     method public boolean injectInputEvent(@NonNull android.view.InputEvent, boolean, boolean);
     method public void injectInputEventToInputFilter(@NonNull android.view.InputEvent);
     method public boolean isNodeInCache(@NonNull android.view.accessibility.AccessibilityNodeInfo);
+    method public void removeOverridePermissionState(int, @NonNull String);
     method @Deprecated public boolean revokeRuntimePermission(String, String, android.os.UserHandle);
     method public void syncInputTransactions();
     method public void syncInputTransactions(boolean);
@@ -803,6 +807,14 @@
 
 }
 
+package android.app.contextualsearch {
+
+  @FlaggedApi("android.app.contextualsearch.flags.enable_service") public final class CallbackToken implements android.os.Parcelable {
+    method @NonNull public android.os.IBinder getToken();
+  }
+
+}
+
 package android.app.job {
 
   public class JobParameters implements android.os.Parcelable {
@@ -838,17 +850,6 @@
 
 }
 
-package android.app.tare {
-
-  public class EconomyManager {
-    method public int getEnabledMode();
-    field public static final int ENABLED_MODE_OFF = 0; // 0x0
-    field public static final int ENABLED_MODE_SHADOW = 2; // 0x2
-    field public static final String KEY_ENABLE_TARE_MODE = "enable_tare_mode";
-  }
-
-}
-
 package android.app.usage {
 
   public class StorageStatsManager {
@@ -1519,6 +1520,13 @@
 
 package android.hardware {
 
+  @Deprecated public class Camera {
+    method @Deprecated public static void getCameraInfo(int, @NonNull android.content.Context, boolean, android.hardware.Camera.CameraInfo);
+    method @Deprecated public static int getNumberOfCameras(@NonNull android.content.Context);
+    method @Deprecated public static android.hardware.Camera open(int, @NonNull android.content.Context, boolean);
+    method @Deprecated public final void setPreviewSurface(android.view.Surface) throws java.io.IOException;
+  }
+
   public final class SensorPrivacyManager {
     method @FlaggedApi("com.android.internal.camera.flags.camera_privacy_allowlist") @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setCameraPrivacyAllowlist(@NonNull java.util.List<java.lang.String>);
     method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setSensorPrivacy(int, int, boolean);
@@ -1551,7 +1559,7 @@
 
   public static class BiometricPrompt.Builder {
     method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.TEST_BIOMETRIC, "android.permission.USE_BIOMETRIC_INTERNAL"}) public android.hardware.biometrics.BiometricPrompt.Builder setAllowBackgroundAuthentication(boolean);
-    method @FlaggedApi("android.multiuser.enable_biometrics_to_unlock_private_space") @NonNull @RequiresPermission(anyOf={android.Manifest.permission.TEST_BIOMETRIC, "android.permission.USE_BIOMETRIC_INTERNAL"}) public android.hardware.biometrics.BiometricPrompt.Builder setAllowBackgroundAuthentication(boolean, boolean);
+    method @FlaggedApi("android.os.allow_private_profile") @NonNull @RequiresPermission(anyOf={android.Manifest.permission.TEST_BIOMETRIC, "android.permission.USE_BIOMETRIC_INTERNAL"}) public android.hardware.biometrics.BiometricPrompt.Builder setAllowBackgroundAuthentication(boolean, boolean);
     method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.TEST_BIOMETRIC, "android.permission.USE_BIOMETRIC_INTERNAL"}) public android.hardware.biometrics.BiometricPrompt.Builder setAllowedSensorIds(@NonNull java.util.List<java.lang.Integer>);
   }
 
@@ -1757,19 +1765,22 @@
   public final class InputManager {
     method public void addUniqueIdAssociation(@NonNull String, @NonNull String);
     method @RequiresPermission(android.Manifest.permission.REMAP_MODIFIER_KEYS) public void clearAllModifierKeyRemappings();
-    method @Nullable public String getCurrentKeyboardLayoutForInputDevice(@NonNull android.hardware.input.InputDeviceIdentifier);
-    method @NonNull public java.util.List<java.lang.String> getKeyboardLayoutDescriptorsForInputDevice(@NonNull android.view.InputDevice);
+    method @NonNull public java.util.List<java.lang.String> getKeyboardLayoutDescriptors();
     method @NonNull public String getKeyboardLayoutTypeForLayoutDescriptor(@NonNull String);
     method @NonNull @RequiresPermission(android.Manifest.permission.REMAP_MODIFIER_KEYS) public java.util.Map<java.lang.Integer,java.lang.Integer> getModifierKeyRemapping();
     method public int getMousePointerSpeed();
     method @RequiresPermission(android.Manifest.permission.REMAP_MODIFIER_KEYS) public void remapModifierKey(int, int);
-    method @RequiresPermission(android.Manifest.permission.SET_KEYBOARD_LAYOUT) public void removeKeyboardLayoutForInputDevice(@NonNull android.hardware.input.InputDeviceIdentifier, @NonNull String);
     method public void removeUniqueIdAssociation(@NonNull String);
-    method @RequiresPermission(android.Manifest.permission.SET_KEYBOARD_LAYOUT) public void setCurrentKeyboardLayoutForInputDevice(@NonNull android.hardware.input.InputDeviceIdentifier, @NonNull String);
     field public static final long BLOCK_UNTRUSTED_TOUCHES = 158002302L; // 0x96aec7eL
   }
 
   public class InputSettings {
+    method @FlaggedApi("com.android.hardware.input.keyboard_a11y_bounce_keys_flag") public static int getAccessibilityBounceKeysThreshold(@NonNull android.content.Context);
+    method @FlaggedApi("com.android.hardware.input.keyboard_a11y_slow_keys_flag") public static int getAccessibilitySlowKeysThreshold(@NonNull android.content.Context);
+    method @FlaggedApi("com.android.hardware.input.keyboard_a11y_sticky_keys_flag") public static boolean isAccessibilityStickyKeysEnabled(@NonNull android.content.Context);
+    method @FlaggedApi("com.android.hardware.input.keyboard_a11y_bounce_keys_flag") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilityBounceKeysThreshold(@NonNull android.content.Context, int);
+    method @FlaggedApi("com.android.hardware.input.keyboard_a11y_slow_keys_flag") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilitySlowKeysThreshold(@NonNull android.content.Context, int);
+    method @FlaggedApi("com.android.hardware.input.keyboard_a11y_sticky_keys_flag") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilityStickyKeysEnabled(@NonNull android.content.Context, boolean);
     method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static void setMaximumObscuringOpacityForTouch(@NonNull android.content.Context, @FloatRange(from=0, to=1) float);
     field public static final int DEFAULT_POINTER_SPEED = 0; // 0x0
   }
@@ -2769,6 +2780,7 @@
   public final class PermissionManager {
     method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.permission.PermissionGroupUsage> getIndicatorAppOpUsageData();
     method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.permission.PermissionGroupUsage> getIndicatorAppOpUsageData(boolean);
+    method @FlaggedApi("android.permission.flags.should_register_attribution_source") public boolean isRegisteredAttributionSource(@NonNull android.content.AttributionSource);
     method @NonNull public android.content.AttributionSource registerAttributionSource(@NonNull android.content.AttributionSource);
     method @RequiresPermission(android.Manifest.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL) public void revokePostNotificationPermissionWithoutKillForTest(@NonNull String, int);
   }
@@ -3107,6 +3119,14 @@
 
 }
 
+package android.service.ondeviceintelligence {
+
+  @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence") public abstract class OnDeviceIntelligenceService extends android.app.Service {
+    method public void onReady();
+  }
+
+}
+
 package android.service.quickaccesswallet {
 
   public interface QuickAccessWalletClient extends java.io.Closeable {
@@ -3652,6 +3672,10 @@
     field public static final int FLAG_IS_ACCESSIBILITY_EVENT = 2048; // 0x800
   }
 
+  public final class PointerIcon implements android.os.Parcelable {
+    method @FlaggedApi("android.view.flags.enable_vector_cursors") public void setDrawNativeDropShadow(boolean);
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface RemotableViewMethod {
     method public abstract String asyncImpl() default "";
   }
@@ -3953,6 +3977,7 @@
 
   public final class InputMethodManager {
     method @RequiresPermission(android.Manifest.permission.TEST_INPUT_METHOD) public void addVirtualStylusIdForTestSession();
+    method @RequiresPermission(android.Manifest.permission.TEST_INPUT_METHOD) public void finishTrackingPendingImeVisibilityRequests();
     method public int getDisplayId();
     method @FlaggedApi("android.view.inputmethod.imm_userhandle_hostsidetests") @NonNull @RequiresPermission(value=android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional=true) public java.util.List<android.view.inputmethod.InputMethodInfo> getEnabledInputMethodListAsUser(@NonNull android.os.UserHandle);
     method @FlaggedApi("android.view.inputmethod.imm_userhandle_hostsidetests") @NonNull @RequiresPermission(value=android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional=true) public java.util.List<android.view.inputmethod.InputMethodSubtype> getEnabledInputMethodSubtypeListAsUser(@NonNull String, boolean, @NonNull android.os.UserHandle);
diff --git a/core/java/Android.bp b/core/java/Android.bp
index db5888e..fae411d 100644
--- a/core/java/Android.bp
+++ b/core/java/Android.bp
@@ -582,7 +582,9 @@
     srcs: [
         "com/android/internal/protolog/ProtoLogImpl.java",
         "com/android/internal/protolog/ProtoLogViewerConfigReader.java",
-        ":perfetto_trace_javastream_protos",
+    ],
+    static_libs: [
+        "perfetto_trace_javastream_protos_jarjar",
     ],
 }
 
diff --git a/core/java/android/accessibilityservice/BrailleDisplayController.java b/core/java/android/accessibilityservice/BrailleDisplayController.java
index 5282aa3..7334676 100644
--- a/core/java/android/accessibilityservice/BrailleDisplayController.java
+++ b/core/java/android/accessibilityservice/BrailleDisplayController.java
@@ -305,4 +305,6 @@
     @FlaggedApi(Flags.FLAG_BRAILLE_DISPLAY_HID)
     @TestApi
     String TEST_BRAILLE_DISPLAY_UNIQUE_ID = "UNIQUE_ID";
+    /** @hide */
+    String TEST_BRAILLE_DISPLAY_NAME = "NAME";
 }
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 0c54351..0dab3de 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -5071,7 +5071,7 @@
      * <p><b>NOTE:</b> differently from {@link #switchUser(int)}, which stops the current foreground
      * user before starting a new one, this method does not stop the previous user running in
      * background in the display, and it will return {@code false} in this case. It's up to the
-     * caller to call {@link #stopUser(int, boolean)} before starting a new user.
+     * caller to call {@link #stopUser(int)} before starting a new user.
      *
      * @param userId user to be started in the display. It will return {@code false} if the user is
      * a profile, the {@link #getCurrentUser()}, the {@link UserHandle#SYSTEM system user}, or
@@ -5281,15 +5281,16 @@
      *
      * @hide
      */
+    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
     @TestApi
     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
-    public boolean stopUser(@UserIdInt int userId, boolean force) {
+    public boolean stopUser(@UserIdInt int userId) {
         if (userId == UserHandle.USER_SYSTEM) {
             return false;
         }
         try {
-            return USER_OP_SUCCESS == getService().stopUser(
-                    userId, force, /* callback= */ null);
+            return USER_OP_SUCCESS == getService().stopUserWithCallback(
+                    userId, /* callback= */ null);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -5672,9 +5673,11 @@
     }
 
     /**
-     * Return if a given profile is in the foreground.
+     * Returns whether the given user, or its parent (if the user is a profile), is in the
+     * foreground.
      * @param userHandle UserHandle to check
-     * @return Returns the boolean result.
+     * @return whether the user is the foreground user or, if it is a profile, whether its parent
+     *         is the foreground user
      * @hide
      */
     @RequiresPermission(anyOf = {
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 5843e51..e66f7fe 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -148,6 +148,13 @@
     public abstract void onUserRemoved(@UserIdInt int userId);
 
     /**
+     * Start user, if it is not already running, but don't bring it to foreground.
+     * @param userId ID of the user to start
+     * @return true if the user has been successfully started
+     */
+    public abstract boolean startUserInBackground(int userId);
+
+    /**
      * Kill foreground apps from the specified user.
      */
     public abstract void killForegroundAppsForUser(@UserIdInt int userId);
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index e094ac6..9ea55f5 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -2205,19 +2205,6 @@
     }
 
     /**
-     * Sets background activity launch logic won't use pending intent creator foreground state.
-     *
-     * @hide
-     * @deprecated use {@link #setPendingIntentCreatorBackgroundActivityStartMode(int)} instead
-     */
-    @Deprecated
-    public ActivityOptions setIgnorePendingIntentCreatorForegroundState(boolean ignore) {
-        mPendingIntentCreatorBackgroundActivityStartMode = ignore
-                ? MODE_BACKGROUND_ACTIVITY_START_DENIED : MODE_BACKGROUND_ACTIVITY_START_ALLOWED;
-        return this;
-    }
-
-    /**
      * Allow a {@link PendingIntent} to use the privilege of its creator to start background
      * activities.
      *
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index fa9346e..3575545 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -365,7 +365,7 @@
     @UnsupportedAppUsage
     private ContextImpl mSystemContext;
     @GuardedBy("this")
-    private SparseArray<ContextImpl> mDisplaySystemUiContexts;
+    private ArrayList<WeakReference<ContextImpl>> mDisplaySystemUiContexts;
 
     @UnsupportedAppUsage
     static volatile IPackageManager sPackageManager;
@@ -607,9 +607,9 @@
         Configuration createdConfig;
         Configuration overrideConfig;
         @NonNull
-        private ActivityWindowInfo mActivityWindowInfo;
-        @Nullable
-        private ActivityWindowInfo mLastReportedActivityWindowInfo;
+        private final ActivityWindowInfo mActivityWindowInfo = new ActivityWindowInfo();
+        @NonNull
+        private final ActivityWindowInfo mLastReportedActivityWindowInfo = new ActivityWindowInfo();
 
         // Used for consolidating configs before sending on to Activity.
         private final Configuration tmpConfig = new Configuration();
@@ -700,7 +700,7 @@
             mSceneTransitionInfo = sceneTransitionInfo;
             mLaunchedFromBubble = launchedFromBubble;
             mTaskFragmentToken = taskFragmentToken;
-            mActivityWindowInfo = activityWindowInfo;
+            mActivityWindowInfo.set(activityWindowInfo);
             init();
         }
 
@@ -720,7 +720,7 @@
                         throw new IllegalStateException(
                                 "Received config update for non-existing activity");
                     }
-                    if (activityWindowInfoFlag() && activityWindowInfo == null) {
+                    if (activityWindowInfo == null) {
                         Log.w(TAG, "Received empty ActivityWindowInfo update for r=" + activity);
                         activityWindowInfo = mActivityWindowInfo;
                     }
@@ -1082,6 +1082,8 @@
         public boolean managed;
         public boolean mallocInfo;
         public boolean runGc;
+        // compression format to dump bitmaps, null if no bitmaps to be dumped
+        public String dumpBitmaps;
         String path;
         ParcelFileDescriptor fd;
         RemoteCallback finishCallback;
@@ -1486,11 +1488,12 @@
         }
 
         @Override
-        public void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, String path,
-                ParcelFileDescriptor fd, RemoteCallback finishCallback) {
+        public void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, String dumpBitmaps,
+                String path, ParcelFileDescriptor fd, RemoteCallback finishCallback) {
             DumpHeapData dhd = new DumpHeapData();
             dhd.managed = managed;
             dhd.mallocInfo = mallocInfo;
+            dhd.dumpBitmaps = dumpBitmaps;
             dhd.runGc = runGc;
             dhd.path = path;
             try {
@@ -3033,14 +3036,19 @@
     public ContextImpl getSystemUiContext(int displayId) {
         synchronized (this) {
             if (mDisplaySystemUiContexts == null) {
-                mDisplaySystemUiContexts = new SparseArray<>();
+                mDisplaySystemUiContexts = new ArrayList<>();
             }
-            ContextImpl systemUiContext = mDisplaySystemUiContexts.get(displayId);
-            if (systemUiContext == null) {
-                systemUiContext = ContextImpl.createSystemUiContext(getSystemContext(), displayId);
-                mDisplaySystemUiContexts.put(displayId, systemUiContext);
+
+            mDisplaySystemUiContexts.removeIf(contextRef -> contextRef.refersTo(null));
+
+            ContextImpl context = getSystemUiContextNoCreateLocked(displayId);
+            if (context != null) {
+                return context;
             }
-            return systemUiContext;
+
+            context = ContextImpl.createSystemUiContext(getSystemContext(), displayId);
+            mDisplaySystemUiContexts.add(new WeakReference<>(context));
+            return context;
         }
     }
 
@@ -3048,18 +3056,30 @@
     @Override
     public ContextImpl getSystemUiContextNoCreate() {
         synchronized (this) {
-            if (mDisplaySystemUiContexts == null) return null;
-            return mDisplaySystemUiContexts.get(DEFAULT_DISPLAY);
+            if (mDisplaySystemUiContexts == null) {
+                return null;
+            }
+            return getSystemUiContextNoCreateLocked(DEFAULT_DISPLAY);
         }
     }
 
+    @GuardedBy("this")
+    @Nullable
+    private ContextImpl getSystemUiContextNoCreateLocked(int displayId) {
+        for (int i = 0; i < mDisplaySystemUiContexts.size(); i++) {
+            ContextImpl context = mDisplaySystemUiContexts.get(i).get();
+            if (context != null && context.getDisplayId() == displayId) {
+                return context;
+            }
+        }
+        return null;
+    }
+
     void onSystemUiContextCleanup(ContextImpl context) {
         synchronized (this) {
             if (mDisplaySystemUiContexts == null) return;
-            final int index = mDisplaySystemUiContexts.indexOfValue(context);
-            if (index >= 0) {
-                mDisplaySystemUiContexts.removeAt(index);
-            }
+            mDisplaySystemUiContexts.removeIf(
+                    contextRef -> contextRef.refersTo(null) || contextRef.refersTo(context));
         }
     }
 
@@ -6063,7 +6083,7 @@
             target.createdConfig = config.getGlobalConfiguration();
             target.overrideConfig = config.getOverrideConfiguration();
             target.pendingConfigChanges |= configChanges;
-            target.mActivityWindowInfo = activityWindowInfo;
+            target.mActivityWindowInfo.set(activityWindowInfo);
         }
 
         return scheduleRelaunch ? target : null;
@@ -6257,7 +6277,7 @@
         }
         r.startsNotResumed = startsNotResumed;
         r.overrideConfig = overrideConfig;
-        r.mActivityWindowInfo = activityWindowInfo;
+        r.mActivityWindowInfo.set(activityWindowInfo);
 
         handleLaunchActivity(r, pendingActions, mLastReportedDeviceId, customIntent);
     }
@@ -6759,7 +6779,7 @@
 
         // Perform updates.
         r.overrideConfig = overrideConfig;
-        r.mActivityWindowInfo = activityWindowInfo;
+        r.mActivityWindowInfo.set(activityWindowInfo);
 
         final ViewRootImpl viewRoot = r.activity.mDecor != null
             ? r.activity.mDecor.getViewRootImpl() : null;
@@ -6792,11 +6812,10 @@
         if (!activityWindowInfoFlag()) {
             return;
         }
-        if (r.mActivityWindowInfo == null
-                || r.mActivityWindowInfo.equals(r.mLastReportedActivityWindowInfo)) {
+        if (r.mActivityWindowInfo.equals(r.mLastReportedActivityWindowInfo)) {
             return;
         }
-        r.mLastReportedActivityWindowInfo = r.mActivityWindowInfo;
+        r.mLastReportedActivityWindowInfo.set(r.mActivityWindowInfo);
         ClientTransactionListenerController.getInstance().onActivityWindowInfoChanged(r.token,
                 r.mActivityWindowInfo);
     }
@@ -6843,6 +6862,9 @@
             System.runFinalization();
             System.gc();
         }
+        if (dhd.dumpBitmaps != null) {
+            Bitmap.dumpAll(dhd.dumpBitmaps);
+        }
         try (ParcelFileDescriptor fd = dhd.fd) {
             if (dhd.managed) {
                 Debug.dumpHprofData(dhd.path, fd.getFileDescriptor());
@@ -6870,6 +6892,9 @@
         if (dhd.finishCallback != null) {
             dhd.finishCallback.sendResult(null);
         }
+        if (dhd.dumpBitmaps != null) {
+            Bitmap.dumpAll(null); // clear dump
+        }
     }
 
     final void handleDispatchPackageBroadcast(int cmd, String[] packages) {
@@ -6966,7 +6991,7 @@
                             }
                         } else {
                             // No package, perhaps it was removed?
-                            Slog.e(TAG, "Package [" + packages[i] + "] reported as REPLACED,"
+                            Slog.d(TAG, "Package [" + packages[i] + "] reported as REPLACED,"
                                     + " but missing application info. Assuming REMOVED.");
                             mPackages.remove(packages[i]);
                             mResourcePackages.remove(packages[i]);
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index ff713d0..7ae514a 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -18,7 +18,7 @@
 
 
 import static android.location.flags.Flags.FLAG_LOCATION_BYPASS;
-import static android.media.audio.Flags.foregroundAudioControl;
+import static android.media.audio.Flags.roForegroundAudioControl;
 import static android.permission.flags.Flags.FLAG_OP_ENABLE_MOBILE_DATA_BY_USER;
 import static android.view.contentprotection.flags.Flags.FLAG_CREATE_ACCESSIBILITY_OVERLAY_APP_OP_ENABLED;
 import static android.view.contentprotection.flags.Flags.FLAG_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER_APP_OP_ENABLED;
@@ -1502,12 +1502,10 @@
             AppProtoEnums.APP_OP_RECEIVE_SANDBOX_TRIGGER_AUDIO;
 
     /**
-     * Allows the privileged assistant app to receive the training data from the sandboxed hotword
-     * detection service.
+     * This op has been deprecated.
      *
-     * @hide
      */
-    public static final int OP_RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA =
+    private static final int OP_DEPRECATED_3 =
             AppProtoEnums.APP_OP_RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA;
 
     /**
@@ -1735,7 +1733,6 @@
             OPSTR_CAMERA_SANDBOXED,
             OPSTR_RECORD_AUDIO_SANDBOXED,
             OPSTR_RECEIVE_SANDBOX_TRIGGER_AUDIO,
-            OPSTR_RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA,
             OPSTR_CREATE_ACCESSIBILITY_OVERLAY,
             OPSTR_MEDIA_ROUTING_CONTROL,
             OPSTR_ENABLE_MOBILE_DATA_BY_USER,
@@ -2395,13 +2392,10 @@
             "android:receive_sandbox_trigger_audio";
 
     /**
-     * Allows the privileged assistant app to receive training data from the sandboxed hotword
-     * detection service.
-     *
+     * App op has been deprecated.
      * @hide
      */
-    public static final String OPSTR_RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA =
-            "android:RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA";
+    public static final String OPSTR_DEPRECATED_3 = "android:deprecated_3";
 
     /**
      * Creation of an overlay using accessibility services
@@ -2582,7 +2576,6 @@
             OP_CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD,
             OP_USE_FULL_SCREEN_INTENT,
             OP_RECEIVE_SANDBOX_TRIGGER_AUDIO,
-            OP_RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA,
             OP_MEDIA_ROUTING_CONTROL,
             OP_READ_SYSTEM_GRAMMATICAL_GENDER,
             OP_RUN_BACKUP_JOBS,
@@ -2685,8 +2678,7 @@
             .setDefaultMode(getSystemAlertWindowDefault()).build(),
         new AppOpInfo.Builder(OP_ACCESS_NOTIFICATIONS, OPSTR_ACCESS_NOTIFICATIONS,
                 "ACCESS_NOTIFICATIONS")
-            .setPermission(android.Manifest.permission.ACCESS_NOTIFICATIONS)
-            .setDefaultMode(AppOpsManager.MODE_ALLOWED).build(),
+            .setPermission(android.Manifest.permission.ACCESS_NOTIFICATIONS).build(),
         new AppOpInfo.Builder(OP_CAMERA, OPSTR_CAMERA, "CAMERA")
             .setPermission(android.Manifest.permission.CAMERA)
             .setRestriction(UserManager.DISALLOW_CAMERA)
@@ -3022,11 +3014,8 @@
                 "RECEIVE_SANDBOX_TRIGGER_AUDIO")
                 .setPermission(Manifest.permission.RECEIVE_SANDBOX_TRIGGER_AUDIO)
                 .setDefaultMode(AppOpsManager.MODE_DEFAULT).build(),
-        new AppOpInfo.Builder(OP_RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA,
-                OPSTR_RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA,
-                "RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA")
-                .setPermission(Manifest.permission.RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA)
-                .setDefaultMode(AppOpsManager.MODE_DEFAULT).build(),
+        new AppOpInfo.Builder(OP_DEPRECATED_3, OPSTR_DEPRECATED_3, "DEPRECATED_3")
+                .setDefaultMode(AppOpsManager.MODE_IGNORED).build(),
         new AppOpInfo.Builder(OP_CREATE_ACCESSIBILITY_OVERLAY,
                 OPSTR_CREATE_ACCESSIBILITY_OVERLAY,
                 "CREATE_ACCESSIBILITY_OVERLAY")
@@ -3247,7 +3236,7 @@
      * @hide
      */
     public static @Mode int opToDefaultMode(int op) {
-        if (op == OP_TAKE_AUDIO_FOCUS && foregroundAudioControl()) {
+        if (op == OP_TAKE_AUDIO_FOCUS && roForegroundAudioControl()) {
             // when removing the flag, change the entry in sAppOpInfos for OP_TAKE_AUDIO_FOCUS
             return AppOpsManager.MODE_FOREGROUND;
         }
diff --git a/core/java/android/app/AppOpsManagerInternal.java b/core/java/android/app/AppOpsManagerInternal.java
index 8daee58..f8a8f5d 100644
--- a/core/java/android/app/AppOpsManagerInternal.java
+++ b/core/java/android/app/AppOpsManagerInternal.java
@@ -53,9 +53,10 @@
          * @param superImpl The super implementation.
          * @return The app op check result.
          */
-        int checkOperation(int code, int uid, String packageName, @Nullable String attributionTag,
-                int virtualDeviceId, boolean raw, HexFunction<Integer, Integer, String, String,
-                Integer, Boolean, Integer> superImpl);
+        int checkOperation(int code, int uid, @Nullable String packageName,
+                @Nullable String attributionTag, int virtualDeviceId, boolean raw,
+                @NonNull HexFunction<Integer, Integer, String, String, Integer, Boolean, Integer>
+                        superImpl);
 
         /**
          * Allows overriding check audio operation behavior.
@@ -67,8 +68,8 @@
          * @param superImpl The super implementation.
          * @return The app op check result.
          */
-        int checkAudioOperation(int code, int usage, int uid, String packageName,
-                QuadFunction<Integer, Integer, Integer, String, Integer> superImpl);
+        int checkAudioOperation(int code, int usage, int uid, @Nullable String packageName,
+                @NonNull QuadFunction<Integer, Integer, Integer, String, Integer> superImpl);
 
         /**
          * Allows overriding note operation behavior.
@@ -125,7 +126,7 @@
          * @param superImpl The super implementation.
          * @return The app op note result.
          */
-        SyncNotedAppOp startOperation(IBinder token, int code, int uid,
+        SyncNotedAppOp startOperation(@NonNull IBinder token, int code, int uid,
                 @Nullable String packageName, @Nullable String attributionTag, int virtualDeviceId,
                 boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp,
                 @Nullable String message, boolean shouldCollectMessage,
@@ -152,8 +153,9 @@
          */
         SyncNotedAppOp startProxyOperation(@NonNull IBinder clientId, int code,
                 @NonNull AttributionSource attributionSource, boolean startIfModeDefault,
-                boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage,
-                boolean skipProxyOperation, @AttributionFlags int proxyAttributionFlags,
+                boolean shouldCollectAsyncNotedOp, @Nullable String message,
+                boolean shouldCollectMessage, boolean skipProxyOperation,
+                @AttributionFlags int proxyAttributionFlags,
                 @AttributionFlags int proxiedAttributionFlags, int attributionChainId,
                 @NonNull UndecFunction<IBinder, Integer, AttributionSource, Boolean,
                         Boolean, String, Boolean, Boolean, Integer, Integer, Integer,
diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java
index 33d41d3..308178c 100644
--- a/core/java/android/app/AutomaticZenRule.java
+++ b/core/java/android/app/AutomaticZenRule.java
@@ -676,7 +676,7 @@
         private ComponentName mConfigurationActivity = null;
         private ZenPolicy mPolicy = null;
         private ZenDeviceEffects mDeviceEffects = null;
-        private int mType;
+        private int mType = TYPE_UNKNOWN;
         private String mDescription;
         private int mIconResId;
         private boolean mAllowManualInvocation;
diff --git a/core/java/android/app/BroadcastOptions.java b/core/java/android/app/BroadcastOptions.java
index 60d622d..4db3727 100644
--- a/core/java/android/app/BroadcastOptions.java
+++ b/core/java/android/app/BroadcastOptions.java
@@ -18,8 +18,6 @@
 
 import static android.app.ActivityOptions.BackgroundActivityStartMode;
 
-import android.annotation.CurrentTimeMillisLong;
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.IntRange;
 import android.annotation.NonNull;
@@ -69,8 +67,6 @@
     private @Nullable BundleMerger mDeliveryGroupExtrasMerger;
     private @Nullable IntentFilter mDeliveryGroupMatchingFilter;
     private @DeferralPolicy int mDeferralPolicy;
-    private @CurrentTimeMillisLong long mEventTriggerTimestampMillis;
-    private @CurrentTimeMillisLong long mRemoteEventTriggerTimestampMillis;
 
     /** @hide */
     @IntDef(flag = true, prefix = { "FLAG_" }, value = {
@@ -196,18 +192,6 @@
             "android:broadcast.idForResponseEvent";
 
     /**
-     * Corresponds to {@link #setEventTriggerTimestampMillis(long)}.
-     */
-    private static final String KEY_EVENT_TRIGGER_TIMESTAMP =
-            "android:broadcast.eventTriggerTimestamp";
-
-    /**
-     * Corresponds to {@link #setRemoteEventTriggerTimestampMillis(long)}.
-     */
-    private static final String KEY_REMOTE_EVENT_TRIGGER_TIMESTAMP =
-            "android:broadcast.remoteEventTriggerTimestamp";
-
-    /**
      * Corresponds to {@link #setDeliveryGroupPolicy(int)}.
      */
     private static final String KEY_DELIVERY_GROUP_POLICY =
@@ -359,8 +343,6 @@
         mRequireNoneOfPermissions = opts.getStringArray(KEY_REQUIRE_NONE_OF_PERMISSIONS);
         mRequireCompatChangeId = opts.getLong(KEY_REQUIRE_COMPAT_CHANGE_ID, CHANGE_INVALID);
         mIdForResponseEvent = opts.getLong(KEY_ID_FOR_RESPONSE_EVENT);
-        mEventTriggerTimestampMillis = opts.getLong(KEY_EVENT_TRIGGER_TIMESTAMP);
-        mRemoteEventTriggerTimestampMillis = opts.getLong(KEY_REMOTE_EVENT_TRIGGER_TIMESTAMP);
         mDeliveryGroupPolicy = opts.getInt(KEY_DELIVERY_GROUP_POLICY,
                 DELIVERY_GROUP_POLICY_ALL);
         mDeliveryGroupMatchingNamespaceFragment = opts.getString(KEY_DELIVERY_GROUP_NAMESPACE);
@@ -807,60 +789,6 @@
     }
 
     /**
-     * Set the timestamp for the event that triggered this broadcast, in
-     * {@link System#currentTimeMillis()} timebase.
-     *
-     * <p> For instance, if this broadcast is for a push message, then this timestamp
-     * could correspond to when the device received the message.
-     *
-     * @param timestampMillis the timestamp in {@link System#currentTimeMillis()} timebase that
-     *                        correspond to the event that triggered this broadcast.
-     */
-    @FlaggedApi(android.app.Flags.FLAG_BCAST_EVENT_TIMESTAMPS)
-    public void setEventTriggerTimestampMillis(@CurrentTimeMillisLong long timestampMillis) {
-        mEventTriggerTimestampMillis = timestampMillis;
-    }
-
-    /**
-     * Return the timestamp for the event that triggered this broadcast, in
-     * {@link System#currentTimeMillis()} timebase.
-     *
-     * @return the timestamp in {@link System#currentTimeMillis()} timebase that was previously
-     *         set using {@link #setEventTriggerTimestampMillis(long)}.
-     */
-    @FlaggedApi(android.app.Flags.FLAG_BCAST_EVENT_TIMESTAMPS)
-    public @CurrentTimeMillisLong long getEventTriggerTimestampMillis() {
-        return mEventTriggerTimestampMillis;
-    }
-
-    /**
-     * Set the timestamp for the remote event, if any, that triggered this broadcast, in
-     * {@link System#currentTimeMillis()} timebase.
-     *
-     * <p> For instance, if this broadcast is for a push message, then this timestamp
-     * could correspond to when the message originated remotely.
-     *
-     * @param timestampMillis the timestamp in {@link System#currentTimeMillis()} timebase that
-     *                        correspond to the remote event that triggered this broadcast.
-     */
-    @FlaggedApi(android.app.Flags.FLAG_BCAST_EVENT_TIMESTAMPS)
-    public void setRemoteEventTriggerTimestampMillis(@CurrentTimeMillisLong long timestampMillis) {
-        mRemoteEventTriggerTimestampMillis = timestampMillis;
-    }
-
-    /**
-     * Return the timestamp for the remote event that triggered this broadcast, in
-     * {@link System#currentTimeMillis()} timebase.
-     *
-     * @return the timestamp in {@link System#currentTimeMillis()} timebase that was previously
-     *         set using {@link #setRemoteEventTriggerTimestampMillis(long)}}.
-     */
-    @FlaggedApi(android.app.Flags.FLAG_BCAST_EVENT_TIMESTAMPS)
-    public @CurrentTimeMillisLong long getRemoteEventTriggerTimestampMillis() {
-        return mRemoteEventTriggerTimestampMillis;
-    }
-
-    /**
      * Sets deferral policy for this broadcast that specifies how this broadcast
      * can be deferred for delivery at some future point.
      */
@@ -1195,12 +1123,6 @@
         if (mIdForResponseEvent != 0) {
             b.putLong(KEY_ID_FOR_RESPONSE_EVENT, mIdForResponseEvent);
         }
-        if (mEventTriggerTimestampMillis > 0) {
-            b.putLong(KEY_EVENT_TRIGGER_TIMESTAMP, mEventTriggerTimestampMillis);
-        }
-        if (mRemoteEventTriggerTimestampMillis > 0) {
-            b.putLong(KEY_REMOTE_EVENT_TRIGGER_TIMESTAMP, mRemoteEventTriggerTimestampMillis);
-        }
         if (mDeliveryGroupPolicy != DELIVERY_GROUP_POLICY_ALL) {
             b.putInt(KEY_DELIVERY_GROUP_POLICY, mDeliveryGroupPolicy);
         }
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 716dee4..e3380e0 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -21,12 +21,14 @@
 import static android.os.StrictMode.vmIncorrectContextUseEnabled;
 import static android.view.WindowManager.LayoutParams.WindowType;
 
+import android.Manifest;
 import android.annotation.CallbackExecutor;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SuppressLint;
 import android.annotation.UiContext;
+import android.companion.virtual.VirtualDevice;
 import android.companion.virtual.VirtualDeviceManager;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.AttributionSource;
@@ -2288,7 +2290,35 @@
             Log.v(TAG, "Treating renounced permission " + permission + " as denied");
             return PERMISSION_DENIED;
         }
-        return PermissionManager.checkPermission(permission, pid, uid, getDeviceId());
+
+        // When checking a device-aware permission on a remote device, if the permission is CAMERA
+        // or RECORD_AUDIO we need to check remote device's corresponding capability. If the remote
+        // device doesn't have capability fall back to checking permission on the default device.
+        // Note: we only perform permission check redirection when the device id is not explicitly
+        // set in the context.
+        int deviceId = getDeviceId();
+        if (deviceId != Context.DEVICE_ID_DEFAULT
+                && !mIsExplicitDeviceId
+                && PermissionManager.DEVICE_AWARE_PERMISSIONS.contains(permission)) {
+            VirtualDeviceManager virtualDeviceManager =
+                    getSystemService(VirtualDeviceManager.class);
+            VirtualDevice virtualDevice = virtualDeviceManager.getVirtualDevice(deviceId);
+            if (virtualDevice != null) {
+                if ((Objects.equals(permission, Manifest.permission.RECORD_AUDIO)
+                                && !virtualDevice.hasCustomAudioInputSupport())
+                        || (Objects.equals(permission, Manifest.permission.CAMERA)
+                                && !virtualDevice.hasCustomCameraSupport())) {
+                    deviceId = Context.DEVICE_ID_DEFAULT;
+                }
+            } else {
+                Slog.e(
+                        TAG,
+                        "virtualDevice is not found when device id is not default. deviceId = "
+                                + deviceId);
+            }
+        }
+
+        return PermissionManager.checkPermission(permission, pid, uid, deviceId);
     }
 
     /** @hide */
@@ -3114,6 +3144,14 @@
         if (mIsExplicitDeviceId) {
             return;
         }
+
+        if ((displayId == Display.DEFAULT_DISPLAY || displayId == Display.INVALID_DISPLAY)
+                && mDeviceId == DEVICE_ID_DEFAULT) {
+            // DEFAULT_DISPLAY & INVALID_DISPLAY are associated with default device.
+            // Return early avoiding instantiating VDM when it's not needed.
+            return;
+        }
+
         VirtualDeviceManager vdm = getSystemService(VirtualDeviceManager.class);
         if (vdm != null) {
             int deviceId = vdm.getDeviceIdForDisplayId(displayId);
diff --git a/core/java/android/app/GrammaticalInflectionManager.java b/core/java/android/app/GrammaticalInflectionManager.java
index 3e7d665..f0bc3e2 100644
--- a/core/java/android/app/GrammaticalInflectionManager.java
+++ b/core/java/android/app/GrammaticalInflectionManager.java
@@ -143,4 +143,24 @@
             throw e.rethrowFromSystemServer();
         }
     }
+
+    /**
+     * Peeks the current grammatical gender of privileged application from the specific user's
+     * encrypted file.
+     *
+     * @return the value of system grammatical gender.
+     * @hide
+     * @see Configuration#getGrammaticalGender
+     */
+    @RequiresPermission(Manifest.permission.READ_SYSTEM_GRAMMATICAL_GENDER)
+    @FlaggedApi(Flags.FLAG_SYSTEM_TERMS_OF_ADDRESS_ENABLED)
+    @Configuration.GrammaticalGender
+    public int peekSystemGrammaticalGenderByUserId(int userId) {
+        try {
+            return mService.peekSystemGrammaticalGenderByUserId(mContext.getAttributionSource(),
+                    userId);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
 }
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 5e6b54b..dca164d 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -394,7 +394,7 @@
     oneway void getMimeTypeFilterAsync(in Uri uri, int userId, in RemoteCallback resultCallback);
     // Cause the specified process to dump the specified heap.
     boolean dumpHeap(in String process, int userId, boolean managed, boolean mallocInfo,
-            boolean runGc, in String path, in ParcelFileDescriptor fd,
+            boolean runGc, in String dumpBitmaps, in String path, in ParcelFileDescriptor fd,
             in RemoteCallback finishCallback);
     @UnsupportedAppUsage
     boolean isUserRunning(int userid, int flags);
@@ -452,12 +452,14 @@
             in IBinder resultTo, in String resultWho, int requestCode, int flags,
             in ProfilerInfo profilerInfo, in Bundle options, int userId);
     @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
-    int stopUser(int userid, boolean force, in IStopUserCallback callback);
+    int stopUser(int userid, boolean stopProfileRegardlessOfParent, in IStopUserCallback callback);
+    int stopUserWithCallback(int userid, in IStopUserCallback callback);
+    int stopUserExceptCertainProfiles(int userid, boolean stopProfileRegardlessOfParent, in IStopUserCallback callback);
     /**
-     * Check {@link com.android.server.am.ActivityManagerService#stopUserWithDelayedLocking(int, boolean, IStopUserCallback)}
+     * Check {@link com.android.server.am.ActivityManagerService#stopUserWithDelayedLocking(int, IStopUserCallback)}
      * for details.
      */
-    int stopUserWithDelayedLocking(int userid, boolean force, in IStopUserCallback callback);
+    int stopUserWithDelayedLocking(int userid, in IStopUserCallback callback);
 
     @UnsupportedAppUsage
     void registerUserSwitchObserver(in IUserSwitchObserver observer, in String name);
@@ -499,6 +501,7 @@
             in String shareDescription);
 
     void requestInteractiveBugReport();
+    void requestBugReportWithExtraAttachment(in Uri extraAttachment);
     void requestFullBugReport();
     void requestRemoteBugReport(long nonce);
     boolean launchBugReportHandlerApp();
@@ -962,4 +965,48 @@
      */
     oneway void frozenBinderTransactionDetected(int debugPid, int code, int flags, int err);
     int getBindingUidProcessState(int uid, in String callingPackage);
+
+    /**
+     * Return the timestampe (in the elapsed timebase) when the UID became idle from active
+     * last time (regardless of if the UID is still idle, or became active again).
+     * This is useful when trying to detect whether an UID has ever became idle since a certain
+     * time in the past.
+     */
+    long getUidLastIdleElapsedTime(int uid, in String callingPackage);
+
+    /**
+     * Adds permission to be overridden to the given state. Must be called from root user.
+     *
+     * @param originatingUid The UID of the instrumented app that initialized the override
+     * @param uid The UID of the app whose permission will be overridden
+     * @param permission The permission whose state will be overridden
+     * @param result The state to override the permission to
+     *
+     * @see PackageManager.PermissionResult
+     */
+    void addOverridePermissionState(int originatingUid, int uid, String permission, int result);
+
+    /**
+     * Removes overridden permission. Must be called from root user.
+     *
+     * @param originatingUid The UID of the instrumented app that initialized the override
+     * @param uid The UID of the app whose permission is overridden
+     * @param permission The permission whose state will no longer be overridden
+     */
+    void removeOverridePermissionState(int originatingUid, int uid, String permission);
+
+    /**
+     * Clears all overridden permissions for the given UID. Must be called from root user.
+     *
+     * @param originatingUid The UID of the instrumented app that initialized the override
+     * @param uid The UID of the app whose permissions will no longer be overridden
+     */
+    void clearOverridePermissionStates(int originatingUid, int uid);
+
+    /**
+     * Clears all overridden permissions on the device. Must be called from root user.
+     *
+     * @param originatingUid The UID of the instrumented app that initialized the override
+     */
+    void clearAllOverridePermissionStates(int originatingUid);
 }
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
index 08636ae..55ce90d 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -157,7 +157,6 @@
     ParceledListSlice<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum, int flags,
             int userId);
     boolean isTopActivityImmersive();
-    ActivityManager.TaskDescription getTaskDescription(int taskId);
     void reportAssistContextExtras(in IBinder assistToken, in Bundle extras,
             in AssistStructure structure, in AssistContent content, in Uri referrer);
 
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index 251e4e8..a64261a 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -119,7 +119,8 @@
     void scheduleSuicide();
     void dispatchPackageBroadcast(int cmd, in String[] packages);
     void scheduleCrash(in String msg, int typeId, in Bundle extras);
-    void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, in String path,
+    void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc,
+            in String dumpBitmaps, in String path,
             in ParcelFileDescriptor fd, in RemoteCallback finishCallback);
     void dumpActivity(in ParcelFileDescriptor fd, IBinder servicetoken, in String prefix,
             in String[] args);
diff --git a/core/java/android/app/IGrammaticalInflectionManager.aidl b/core/java/android/app/IGrammaticalInflectionManager.aidl
index 86f2e91..a5e2d0b 100644
--- a/core/java/android/app/IGrammaticalInflectionManager.aidl
+++ b/core/java/android/app/IGrammaticalInflectionManager.aidl
@@ -43,4 +43,10 @@
       * Gets the grammatical gender from system.
       */
      int getSystemGrammaticalGender(in AttributionSource attributionSource, int userId);
+
+     /**
+      * Peeks the grammatical gender from system by user Id.
+      */
+     int peekSystemGrammaticalGenderByUserId(in AttributionSource attributionSource, int userId);
+
  }
diff --git a/core/java/android/app/IUiAutomationConnection.aidl b/core/java/android/app/IUiAutomationConnection.aidl
index 63cae63..69c3bd3 100644
--- a/core/java/android/app/IUiAutomationConnection.aidl
+++ b/core/java/android/app/IUiAutomationConnection.aidl
@@ -62,4 +62,8 @@
     void executeShellCommandWithStderr(String command, in ParcelFileDescriptor sink,
                 in ParcelFileDescriptor source, in ParcelFileDescriptor stderrSink);
     List<String> getAdoptedShellPermissions();
+    void addOverridePermissionState(int uid, String permission, int result);
+    void removeOverridePermissionState(int uid, String permission);
+    void clearOverridePermissionStates(int uid);
+    void clearAllOverridePermissionStates();
 }
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 7337a7c..fe261be 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -24,6 +24,7 @@
 import static android.graphics.drawable.Icon.TYPE_URI;
 import static android.graphics.drawable.Icon.TYPE_URI_ADAPTIVE_BITMAP;
 import static android.app.Flags.evenlyDividedCallStyleActionLayout;
+import static android.app.Flags.updateRankingTime;
 
 import static java.util.Objects.requireNonNull;
 
@@ -339,8 +340,9 @@
 
     /**
      * The creation time of the notification
+     * @hide
      */
-    private long creationTime;
+    public long creationTime;
 
     /**
      * The resource id of a drawable to use as the icon in the status bar.
@@ -2578,7 +2580,11 @@
     public Notification()
     {
         this.when = System.currentTimeMillis();
-        this.creationTime = System.currentTimeMillis();
+        if (updateRankingTime()) {
+            creationTime = when;
+        } else {
+            this.creationTime = System.currentTimeMillis();
+        }
         this.priority = PRIORITY_DEFAULT;
     }
 
@@ -2589,6 +2595,9 @@
     public Notification(Context context, int icon, CharSequence tickerText, long when,
             CharSequence contentTitle, CharSequence contentText, Intent contentIntent)
     {
+        if (updateRankingTime()) {
+            creationTime = when;
+        }
         new Builder(context)
                 .setWhen(when)
                 .setSmallIcon(icon)
@@ -2618,7 +2627,11 @@
         this.icon = icon;
         this.tickerText = tickerText;
         this.when = when;
-        this.creationTime = System.currentTimeMillis();
+        if (updateRankingTime()) {
+            creationTime = when;
+        } else {
+            this.creationTime = System.currentTimeMillis();
+        }
     }
 
     /**
@@ -3794,6 +3807,13 @@
     }
 
     /**
+     * @hide
+     */
+    public void setTimeoutAfter(long timeout) {
+        mTimeout = timeout;
+    }
+
+    /**
      * Returns what icon should be shown for this notification if it is being displayed in a
      * Launcher that supports badging. Will be one of {@link #BADGE_ICON_NONE},
      * {@link #BADGE_ICON_SMALL}, or {@link #BADGE_ICON_LARGE}.
@@ -3897,6 +3917,13 @@
     /**
      * @hide
      */
+    public boolean hasAppProvidedWhen() {
+        return when != 0 && when != creationTime;
+    }
+
+    /**
+     * @hide
+     */
     @UnsupportedAppUsage
     public boolean isGroupSummary() {
         return mGroupKey != null && (flags & FLAG_GROUP_SUMMARY) != 0;
@@ -6843,7 +6870,9 @@
                 }
             }
 
-            mN.creationTime = System.currentTimeMillis();
+            if (!updateRankingTime()) {
+                mN.creationTime = System.currentTimeMillis();
+            }
 
             // lazy stuff from mContext; see comment in Builder(Context, Notification)
             Notification.addFieldsFromContext(mContext, mN);
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index 7c803eb..193c524 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -434,6 +434,40 @@
     /**
      * @hide
      */
+    public NotificationChannel copy() {
+        NotificationChannel copy = new NotificationChannel(mId, mName, mImportance);
+        copy.setDescription(mDesc);
+        copy.setBypassDnd(mBypassDnd);
+        copy.setLockscreenVisibility(mLockscreenVisibility);
+        copy.setSound(mSound, mAudioAttributes);
+        copy.setLightColor(mLightColor);
+        copy.enableLights(mLights);
+        copy.setVibrationPattern(mVibrationPattern);
+        if (Flags.notificationChannelVibrationEffectApi()) {
+            copy.setVibrationEffect(mVibrationEffect);
+        }
+        copy.lockFields(mUserLockedFields);
+        copy.setUserVisibleTaskShown(mUserVisibleTaskShown);
+        copy.enableVibration(mVibrationEnabled);
+        copy.setShowBadge(mShowBadge);
+        copy.setDeleted(mDeleted);
+        copy.setGroup(mGroup);
+        copy.setBlockable(mBlockableSystem);
+        copy.setAllowBubbles(mAllowBubbles);
+        copy.setOriginalImportance(mOriginalImportance);
+        copy.setConversationId(mParentId, mConversationId);
+        copy.setDemoted(mDemoted);
+        copy.setImportantConversation(mImportantConvo);
+        copy.setDeletedTimeMs(mDeletedTime);
+        copy.setImportanceLockedByCriticalDeviceFunction(mImportanceLockedDefaultApp);
+        copy.setLastNotificationUpdateTimeMs(mLastNotificationUpdateTimeMs);
+
+        return copy;
+    }
+
+    /**
+     * @hide
+     */
     @TestApi
     public void lockFields(int field) {
         mUserLockedFields |= field;
diff --git a/core/java/android/app/OWNERS b/core/java/android/app/OWNERS
index 41b97d0..97c2e43 100644
--- a/core/java/android/app/OWNERS
+++ b/core/java/android/app/OWNERS
@@ -42,6 +42,7 @@
 # ActivityThread
 per-file ActivityThread.java = file:/services/core/java/com/android/server/am/OWNERS
 per-file ActivityThread.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file ActivityThread.java = file:RESOURCES_OWNERS
 
 # Alarm
 per-file *Alarm* = file:/apex/jobscheduler/OWNERS
diff --git a/core/java/android/app/RESOURCES_OWNERS b/core/java/android/app/RESOURCES_OWNERS
index 5582803..fe37c0c 100644
--- a/core/java/android/app/RESOURCES_OWNERS
+++ b/core/java/android/app/RESOURCES_OWNERS
@@ -1,3 +1,5 @@
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
 [email protected]
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index 8b84f06..370aff8 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -120,6 +120,17 @@
     private final ReferenceQueue<Resources> mResourcesReferencesQueue = new ReferenceQueue<>();
 
     /**
+     * A list of Resources references for all Resources instances created through Resources public
+     * constructor, only system Resources created by the private constructor are excluded.
+     * This addition is necessary due to certain Application Resources created by constructor
+     * directly which are not managed by ResourcesManager, hence we require a comprehensive
+     * collection of all Resources references to help with asset paths appending tasks when shared
+     * libraries are registered.
+     */
+    private final ArrayList<WeakReference<Resources>> mAllResourceReferences = new ArrayList<>();
+    private final ReferenceQueue<Resources> mAllResourceReferencesQueue = new ReferenceQueue<>();
+
+    /**
      * The localeConfig of the app.
      */
     private LocaleConfig mLocaleConfig = new LocaleConfig(LocaleList.getEmptyLocaleList());
@@ -736,7 +747,8 @@
     private @Nullable ResourcesImpl findOrCreateResourcesImplForKeyLocked(
             @NonNull ResourcesKey key, @Nullable ApkAssetsSupplier apkSupplier) {
         ResourcesImpl impl = findResourcesImplForKeyLocked(key);
-        if (impl == null) {
+        // ResourcesImpl also need to be recreated if its shared library count is not up-to-date.
+        if (impl == null || impl.getSharedLibCount() != mSharedLibAssetsMap.size()) {
             impl = createResourcesImpl(key, apkSupplier);
             if (impl != null) {
                 mResourceImpls.put(key, new WeakReference<>(impl));
@@ -1567,7 +1579,7 @@
                 }
             }
 
-            redirectResourcesToNewImplLocked(updatedResourceKeys);
+            redirectAllResourcesToNewImplLocked(updatedResourceKeys);
         }
     }
 
@@ -1706,6 +1718,43 @@
         }
     }
 
+    // Another redirect function which will loop through all Resources and reload ResourcesImpl
+    // if it needs a shared library asset paths update.
+    private void redirectAllResourcesToNewImplLocked(
+            @NonNull final ArrayMap<ResourcesImpl, ResourcesKey> updatedResourceKeys) {
+        cleanupReferences(mAllResourceReferences, mAllResourceReferencesQueue);
+
+        // Update any references to ResourcesImpl that require reloading.
+        final int resourcesCount = mAllResourceReferences.size();
+        for (int i = 0; i < resourcesCount; i++) {
+            final WeakReference<Resources> ref = mAllResourceReferences.get(i);
+            final Resources r = ref != null ? ref.get() : null;
+            if (r != null) {
+                final ResourcesKey key = updatedResourceKeys.get(r.getImpl());
+                if (key != null) {
+                    final ResourcesImpl impl = findOrCreateResourcesImplForKeyLocked(key);
+                    if (impl == null) {
+                        throw new Resources.NotFoundException("failed to redirect ResourcesImpl");
+                    }
+                    r.setImpl(impl);
+                } else {
+                    // ResourcesKey is null which means the ResourcesImpl could belong to a
+                    // Resources created by application through Resources constructor and was not
+                    // managed by ResourcesManager, so the ResourcesImpl needs to be recreated to
+                    // have shared library asset paths appended if there are any.
+                    if (r.getImpl() != null) {
+                        final ResourcesImpl oldImpl = r.getImpl();
+                        // ResourcesImpl constructor will help to append shared library asset paths.
+                        final ResourcesImpl newImpl = new ResourcesImpl(oldImpl.getAssets(),
+                                oldImpl.getMetrics(), oldImpl.getConfiguration(),
+                                oldImpl.getDisplayAdjustments());
+                        r.setImpl(newImpl);
+                    }
+                }
+            }
+        }
+    }
+
     /**
      * Returns the LocaleConfig current set
      */
@@ -1826,4 +1875,17 @@
     public @NonNull ArrayMap<String, SharedLibraryAssets> getSharedLibAssetsMap() {
         return new ArrayMap<>(mSharedLibAssetsMap);
     }
+
+    /**
+     * Add all resources references to the list which is designed to help to append shared library
+     * asset paths. This is invoked in Resources constructor to include all Resources instances.
+     */
+    public void registerAllResourcesReference(@NonNull Resources resources) {
+        if (android.content.res.Flags.registerResourcePaths()) {
+            synchronized (mLock) {
+                mAllResourceReferences.add(
+                        new WeakReference<>(resources, mAllResourceReferencesQueue));
+            }
+        }
+    }
 }
diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java
index fe8655c..f092945 100644
--- a/core/java/android/app/Service.java
+++ b/core/java/android/app/Service.java
@@ -1135,6 +1135,9 @@
         } catch (RemoteException ex) {
         }
         onTimeout(startId);
+        if (Flags.introduceNewServiceOntimeoutCallback()) {
+            onTimeout(startId, ServiceInfo.FOREGROUND_SERVICE_TYPE_SHORT_SERVICE);
+        }
     }
 
     /**
@@ -1146,6 +1149,12 @@
      * doesn't finish even after it's timed out,
      * the app will be declared an ANR after a short grace period of several seconds.
      *
+     * <p>Starting from Android version {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM},
+     * {@link #onTimeout(int, int)} will also be called when a foreground service of type
+     * {@link ServiceInfo#FOREGROUND_SERVICE_TYPE_SHORT_SERVICE} times out.
+     * Developers do not need to implement both of the callbacks on
+     * {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM} and onwards.
+     *
      * <p>Note, even though
      * {@link ServiceInfo#FOREGROUND_SERVICE_TYPE_SHORT_SERVICE}
      * was added
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 66ec865..103af4b 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -66,6 +66,8 @@
 import android.companion.virtual.IVirtualDeviceManager;
 import android.companion.virtual.VirtualDeviceManager;
 import android.compat.Compatibility;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledSince;
 import android.content.ClipboardManager;
 import android.content.ContentCaptureOptions;
 import android.content.Context;
@@ -196,6 +198,7 @@
 import android.os.ServiceManager.ServiceNotFoundException;
 import android.os.StatsFrameworkInitializer;
 import android.os.SystemConfigManager;
+import android.os.SystemProperties;
 import android.os.SystemUpdateManager;
 import android.os.SystemVibrator;
 import android.os.SystemVibratorManager;
@@ -285,6 +288,18 @@
     /** @hide */
     public static boolean sEnableServiceNotFoundWtf = false;
 
+    /**
+     * Starting with {@link VANILLA_ICE_CREAM}, Telephony feature flags
+     * (e.g. {@link PackageManager#FEATURE_TELEPHONY_SUBSCRIPTION}) are being checked before
+     * returning managers that depend on them. If the feature is missing,
+     * {@link Context#getSystemService} will return null.
+     *
+     * This change is specific to VcnManager.
+     */
+    @ChangeId
+    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    static final long ENABLE_CHECKING_TELEPHONY_FEATURES_FOR_VCN = 330902016;
+
     // Service registry information.
     // This information is never changed once static initialization has completed.
     private static final Map<Class<?>, String> SYSTEM_SERVICE_NAMES =
@@ -450,8 +465,9 @@
                 new CachedServiceFetcher<VcnManager>() {
             @Override
             public VcnManager createService(ContextImpl ctx) throws ServiceNotFoundException {
-                if (!ctx.getPackageManager().hasSystemFeature(
-                        PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION)) {
+                if (shouldCheckTelephonyFeatures()
+                    && !ctx.getPackageManager().hasSystemFeature(
+                            PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION)) {
                     return null;
                 }
 
@@ -1748,6 +1764,22 @@
         return manager.hasSystemFeature(featureName);
     }
 
+    // Suppressing AndroidFrameworkCompatChange because we're querying vendor
+    // partition SDK level, not application's target SDK version (which BTW we
+    // also check through Compatibility framework a few lines below).
+    @SuppressWarnings("AndroidFrameworkCompatChange")
+    private static boolean shouldCheckTelephonyFeatures() {
+        // Check SDK version of the vendor partition. Pre-V devices might have
+        // incorrectly under-declared telephony features.
+        final int vendorApiLevel = SystemProperties.getInt(
+                "ro.vendor.api_level", Build.VERSION.DEVICE_INITIAL_SDK_INT);
+        if (vendorApiLevel < Build.VERSION_CODES.VANILLA_ICE_CREAM) return false;
+
+        // Check SDK version of the client app. Apps targeting pre-V SDK might
+        // have not checked for existence of these features.
+        return Compatibility.isChangeEnabled(ENABLE_CHECKING_TELEPHONY_FEATURES_FOR_VCN);
+    }
+
     /**
      * Gets a system service from a given context.
      * @hide
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index b0edc3d..348d4d8f 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -33,6 +33,7 @@
 import android.annotation.TestApi;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
 import android.graphics.Point;
 import android.graphics.Rect;
@@ -653,6 +654,81 @@
     }
 
     /**
+     * Adds permission to be overridden to the given state. UiAutomation must be connected to
+     * root user.
+     *
+     * @param uid The UID of the app whose permission will be overridden
+     * @param permission The permission whose state will be overridden
+     * @param result The state to override the permission to
+     *
+     * @see PackageManager#PERMISSION_GRANTED
+     * @see PackageManager#PERMISSION_DENIED
+     *
+     * @hide
+     */
+    @TestApi
+    @SuppressLint("UnflaggedApi")
+    public void addOverridePermissionState(int uid, @NonNull String permission,
+            @PackageManager.PermissionResult int result) {
+        try {
+            mUiAutomationConnection.addOverridePermissionState(uid, permission, result);
+        } catch (RemoteException re) {
+            re.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Removes overridden permission. UiAutomation must be connected to root user.
+     *
+     * @param uid The UID of the app whose permission is overridden
+     * @param permission The permission whose state will no longer be overridden
+     *
+     * @hide
+     */
+    @TestApi
+    @SuppressLint("UnflaggedApi")
+    public void removeOverridePermissionState(int uid, @NonNull String permission) {
+        try {
+            mUiAutomationConnection.removeOverridePermissionState(uid, permission);
+        } catch (RemoteException re) {
+            re.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Clears all overridden permissions for the given UID. UiAutomation must be connected to
+     * root user.
+     *
+     * @param uid The UID of the app whose permissions will no longer be overridden
+     *
+     * @hide
+     */
+    @TestApi
+    @SuppressLint("UnflaggedApi")
+    public void clearOverridePermissionStates(int uid) {
+        try {
+            mUiAutomationConnection.clearOverridePermissionStates(uid);
+        } catch (RemoteException re) {
+            re.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Clears all overridden permissions on the device. UiAutomation must be connected to root user.
+     *
+     * @hide
+     */
+    @TestApi
+    @SuppressLint("UnflaggedApi")
+    public void clearAllOverridePermissionStates() {
+        try {
+            mUiAutomationConnection.clearAllOverridePermissionStates();
+        } catch (RemoteException re) {
+            re.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Performs a global action. Such an action can be performed at any moment
      * regardless of the current application or user location in that application.
      * For example going back, going home, opening recents, etc.
diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java
index 33e260f..3c4bd9e 100644
--- a/core/java/android/app/UiAutomationConnection.java
+++ b/core/java/android/app/UiAutomationConnection.java
@@ -437,6 +437,71 @@
         }
     }
 
+    @Override
+    public void addOverridePermissionState(int uid, String permission, int result)
+            throws RemoteException {
+        synchronized (mLock) {
+            throwIfCalledByNotTrustedUidLocked();
+            throwIfShutdownLocked();
+            throwIfNotConnectedLocked();
+        }
+        final int callingUid = Binder.getCallingUid();
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            mActivityManager.addOverridePermissionState(callingUid, uid, permission, result);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    @Override
+    public void removeOverridePermissionState(int uid, String permission) throws RemoteException {
+        synchronized (mLock) {
+            throwIfCalledByNotTrustedUidLocked();
+            throwIfShutdownLocked();
+            throwIfNotConnectedLocked();
+        }
+        final int callingUid = Binder.getCallingUid();
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            mActivityManager.removeOverridePermissionState(callingUid, uid, permission);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    @Override
+    public void clearOverridePermissionStates(int uid) throws RemoteException {
+        synchronized (mLock) {
+            throwIfCalledByNotTrustedUidLocked();
+            throwIfShutdownLocked();
+            throwIfNotConnectedLocked();
+        }
+        final int callingUid = Binder.getCallingUid();
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            mActivityManager.clearOverridePermissionStates(callingUid, uid);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    @Override
+    public void clearAllOverridePermissionStates() throws RemoteException {
+        synchronized (mLock) {
+            throwIfCalledByNotTrustedUidLocked();
+            throwIfShutdownLocked();
+            throwIfNotConnectedLocked();
+        }
+        final int callingUid = Binder.getCallingUid();
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            mActivityManager.clearAllOverridePermissionStates(callingUid);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
     public class Repeater implements Runnable {
         // Continuously read readFrom and write back to writeTo until EOF is encountered
         private final InputStream readFrom;
diff --git a/core/java/android/app/activity_manager.aconfig b/core/java/android/app/activity_manager.aconfig
index b9aa18c..e751bd2 100644
--- a/core/java/android/app/activity_manager.aconfig
+++ b/core/java/android/app/activity_manager.aconfig
@@ -39,11 +39,3 @@
      description: "Add a new callback in Service to indicate a FGS has reached its timeout."
      bug: "317799821"
 }
-
-flag {
-    name: "bcast_event_timestamps"
-    is_exported: true
-    namespace: "backstage_power"
-    description: "Add APIs for clients to provide broadcast event trigger timestamps"
-    bug: "325136414"
-}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 60dffbd..ea6f45e 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -58,7 +58,6 @@
 import static android.app.admin.flags.Flags.FLAG_ESIM_MANAGEMENT_ENABLED;
 import static android.app.admin.flags.Flags.FLAG_DEVICE_POLICY_SIZE_TRACKING_ENABLED;
 import static android.app.admin.flags.Flags.FLAG_HEADLESS_DEVICE_OWNER_SINGLE_USER_ENABLED;
-import static android.app.admin.flags.Flags.FLAG_PERMISSION_MIGRATION_FOR_ZERO_TRUST_API_ENABLED;
 import static android.app.admin.flags.Flags.FLAG_SECURITY_LOG_V2_ENABLED;
 import static android.app.admin.flags.Flags.onboardingBugreportV2Enabled;
 import static android.app.admin.flags.Flags.FLAG_IS_MTE_POLICY_ENFORCED;
@@ -10285,6 +10284,16 @@
      * get the list of app restrictions set by each admin via
      * {@link android.content.RestrictionsManager#getApplicationRestrictionsPerAdmin}.
      *
+     * <p>Starting from Android Version {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM},
+     * the device policy management role holder can also set app restrictions on any applications
+     * in the calling user, as well as the parent user of an organization-owned managed profile via
+     * the {@link DevicePolicyManager} instance returned by
+     * {@link #getParentProfileInstance(ComponentName)}. App restrictions set by the device policy
+     * management role holder are not returned by
+     * {@link UserManager#getApplicationRestrictions(String)}. The target application should use
+     * {@link android.content.RestrictionsManager#getApplicationRestrictionsPerAdmin} to retrieve
+     * them, alongside any app restrictions the profile or device owner might have set.
+     *
      * <p>NOTE: The method performs disk I/O and shouldn't be called on the main thread
      *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
@@ -10300,11 +10309,14 @@
     @WorkerThread
     public void setApplicationRestrictions(@Nullable ComponentName admin, String packageName,
             Bundle settings) {
-        throwIfParentInstance("setApplicationRestrictions");
+        if (!Flags.dmrhCanSetAppRestriction()) {
+            throwIfParentInstance("setApplicationRestrictions");
+        }
+
         if (mService != null) {
             try {
                 mService.setApplicationRestrictions(admin, mContext.getPackageName(), packageName,
-                        settings);
+                        settings, mParentInstance);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -11705,11 +11717,14 @@
     @WorkerThread
     public @NonNull Bundle getApplicationRestrictions(
             @Nullable ComponentName admin, String packageName) {
-        throwIfParentInstance("getApplicationRestrictions");
+        if (!Flags.dmrhCanSetAppRestriction()) {
+            throwIfParentInstance("getApplicationRestrictions");
+        }
+
         if (mService != null) {
             try {
                 return mService.getApplicationRestrictions(admin, mContext.getPackageName(),
-                        packageName);
+                        packageName, mParentInstance);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -12732,7 +12747,6 @@
     @StringDef({
             Settings.System.SCREEN_BRIGHTNESS_MODE,
             Settings.System.SCREEN_BRIGHTNESS,
-            Settings.System.SCREEN_BRIGHTNESS_FLOAT,
             Settings.System.SCREEN_OFF_TIMEOUT
     })
     @Retention(RetentionPolicy.SOURCE)
@@ -13462,7 +13476,6 @@
      */
     @RequiresPermission(value = MANAGE_DEVICE_POLICY_QUERY_SYSTEM_UPDATES, conditional = true)
     @SuppressLint("RequiresPermission")
-    @FlaggedApi(FLAG_PERMISSION_MIGRATION_FOR_ZERO_TRUST_API_ENABLED)
     public @Nullable SystemUpdateInfo getPendingSystemUpdate(@Nullable ComponentName admin) {
         throwIfParentInstance("getPendingSystemUpdate");
         try {
@@ -13989,8 +14002,15 @@
     public @NonNull DevicePolicyManager getParentProfileInstance(@NonNull ComponentName admin) {
         throwIfParentInstance("getParentProfileInstance");
         try {
-            if (!mService.isManagedProfile(admin)) {
-                throw new SecurityException("The current user does not have a parent profile.");
+            if (Flags.dmrhCanSetAppRestriction()) {
+                UserManager um = mContext.getSystemService(UserManager.class);
+                if (!um.isManagedProfile()) {
+                    throw new SecurityException("The current user does not have a parent profile.");
+                }
+            } else {
+                if (!mService.isManagedProfile(admin)) {
+                    throw new SecurityException("The current user does not have a parent profile.");
+                }
             }
             return new DevicePolicyManager(mContext, mService, true);
         } catch (RemoteException e) {
@@ -16638,7 +16658,6 @@
      */
     @RequiresPermission(value = MANAGE_DEVICE_POLICY_CERTIFICATES, conditional = true)
     @SuppressLint("RequiresPermission")
-    @FlaggedApi(FLAG_PERMISSION_MIGRATION_FOR_ZERO_TRUST_API_ENABLED)
     @NonNull public String getEnrollmentSpecificId() {
         throwIfParentInstance("getEnrollmentSpecificId");
         if (mService == null) {
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index d4589dc..2002326 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -244,8 +244,8 @@
     void setDefaultSmsApplication(in ComponentName admin, String callerPackageName, String packageName, boolean parent);
     void setDefaultDialerApplication(String packageName);
 
-    void setApplicationRestrictions(in ComponentName who, in String callerPackage, in String packageName, in Bundle settings);
-    Bundle getApplicationRestrictions(in ComponentName who, in String callerPackage, in String packageName);
+    void setApplicationRestrictions(in ComponentName who, in String callerPackage, in String packageName, in Bundle settings, in boolean parent);
+    Bundle getApplicationRestrictions(in ComponentName who, in String callerPackage, in String packageName, in boolean parent);
     boolean setApplicationRestrictionsManagingPackage(in ComponentName admin, in String packageName);
     String getApplicationRestrictionsManagingPackage(in ComponentName admin);
     boolean isCallerApplicationRestrictionsManagingPackage(in String callerPackage);
diff --git a/core/java/android/app/admin/Provisioning_OWNERS b/core/java/android/app/admin/Provisioning_OWNERS
index 8f71fc0..91b9761 100644
--- a/core/java/android/app/admin/Provisioning_OWNERS
+++ b/core/java/android/app/admin/Provisioning_OWNERS
@@ -1,4 +1,4 @@
 # Assign bugs to [email protected]
 [email protected]
[email protected] #{LAST_RESORT_SUGGESTION}
[email protected] #{LAST_RESORT_SUGGESTION}
 file:EnterprisePlatform_OWNERS
diff --git a/core/java/android/app/admin/flags/flags.aconfig b/core/java/android/app/admin/flags/flags.aconfig
index 4fa45be5..fe2f764 100644
--- a/core/java/android/app/admin/flags/flags.aconfig
+++ b/core/java/android/app/admin/flags/flags.aconfig
@@ -35,10 +35,11 @@
 }
 
 flag {
-  name: "cross_user_suspension_enabled"
+  name: "cross_user_suspension_enabled_ro"
   namespace: "enterprise"
   description: "Allow holders of INTERACT_ACROSS_USERS_FULL to suspend apps in different users."
   bug: "263464464"
+  is_fixed_read_only: true
 }
 
 flag {
@@ -174,6 +175,17 @@
 }
 
 flag {
+  name: "copy_account_with_retry_enabled"
+  namespace: "enterprise"
+  description: "Retry copy and remove account from personal to work profile in case of failure"
+  bug: "329424312"
+  metadata {
+      purpose: PURPOSE_BUGFIX
+  }
+}
+
+
+flag {
   name: "esim_management_ux_enabled"
   namespace: "enterprise"
   description: "Enable UX changes for esim management"
@@ -186,8 +198,15 @@
   description: "Fix provisioning for single-user headless DO"
   bug: "289515470"
   metadata {
-      purpose: PURPOSE_BUGFIX
-    }
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
+  name: "dmrh_can_set_app_restriction"
+  namespace: "enterprise"
+  description: "Allow DMRH to set application restrictions (both on the profile and the parent)"
+  bug: "328758346"
 }
 
 flag {
@@ -203,3 +222,13 @@
   description: "Guards a new flow for recursive required enterprise app list merging"
   bug: "319084618"
 }
+
+flag {
+  name: "headless_device_owner_delegate_security_logging_bug_fix"
+  namespace: "enterprise"
+  description: "Fix delegate security logging for single user headless DO."
+  bug: "289515470"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index 7548562..508077e 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -2655,13 +2655,12 @@
             );
         }
         GetCredentialRequest getCredentialRequest = node.getPendingCredentialRequest();
-        if (getCredentialRequest == null) {
-            Log.i(TAG, prefix + " No Credential Manager Request");
-        } else {
-            Log.i(TAG, prefix + "  GetCredentialRequest: no. of options= "
-                    + getCredentialRequest.getCredentialOptions().size()
-            );
-        }
+        Log.i(TAG, prefix + "  Credential Manager info:"
+                + " hasCredentialManagerRequest=" + (getCredentialRequest != null)
+                + (getCredentialRequest != null
+                        ? ", sizeOfOptions=" + getCredentialRequest.getCredentialOptions().size()
+                        : "")
+        );
 
         final int NCHILDREN = node.getChildCount();
         if (NCHILDREN > 0) {
diff --git a/core/java/android/app/backup/BackupManagerMonitor.java b/core/java/android/app/backup/BackupManagerMonitor.java
index c66478f..e741bc2 100644
--- a/core/java/android/app/backup/BackupManagerMonitor.java
+++ b/core/java/android/app/backup/BackupManagerMonitor.java
@@ -269,6 +269,33 @@
   /** V to U restore attempt, allowlist and denlist are set
    @hide */
   public static final int LOG_EVENT_ID_V_TO_U_RESTORE_SET_LIST = 72;
+  /** As part of package install, {@link PackageManager} invoked restore.
+   @hide */
+  public static final int LOG_EVENT_ID_RESTORE_AT_INSTALL_INVOKED = 73;
+  /** Skipping restore at package install
+   @hide */
+  public static final int LOG_EVENT_ID_SKIP_RESTORE_AT_INSTALL = 74;
+  /** Package is eligible and is accepted for restore
+   @hide */
+  public static final int LOG_EVENT_ID_PACKAGE_ACCEPTED_FOR_RESTORE = 75;
+  /** Restore data doesn't belong to the package for which restore is started
+   @hide */
+  public static final int LOG_EVENT_ID_RESTORE_DATA_DOES_NOT_BELONG_TO_PACKAGE = 76;
+  /** Unable to create BackupAgent for package for restore
+   @hide */
+  public static final int LOG_EVENT_ID_UNABLE_TO_CREATE_AGENT_FOR_RESTORE = 77;
+  /** BackupAgent crashed after creation but before accepting any data
+   @hide */
+  public static final int LOG_EVENT_ID_AGENT_CRASHED_BEFORE_RESTORE_DATA_IS_SENT = 78;
+  /** Failure in streaming restore data to BackupAgent
+   @hide */
+  public static final int LOG_EVENT_ID_FAILED_TO_SEND_DATA_TO_AGENT_DURING_RESTORE = 79;
+  /** BackupAgent related failure during restore
+   @hide */
+  public static final int LOG_EVENT_ID_AGENT_FAILURE_DURING_RESTORE = 80;
+  /** Failure in reading data from TransportPackage during restore
+   @hide */
+  public static final int LOG_EVENT_ID_FAILED_TO_READ_DATA_FROM_TRANSPORT = 81;
 
   /**
    * This method will be called each time something important happens on BackupManager.
diff --git a/core/java/android/app/contextualsearch/CallbackToken.java b/core/java/android/app/contextualsearch/CallbackToken.java
new file mode 100644
index 0000000..378193f
--- /dev/null
+++ b/core/java/android/app/contextualsearch/CallbackToken.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.contextualsearch;
+
+import android.annotation.CallbackExecutor;
+import android.annotation.FlaggedApi;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
+import android.app.contextualsearch.flags.Flags;
+import android.content.Context;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.OutcomeReceiver;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.ParcelableException;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Used to share a single use token with the contextual search handling activity via the launch
+ * extras bundle.
+ * The caller can then use this token to get {@link ContextualSearchState} by calling
+ * {@link #getContextualSearchState}.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_ENABLE_SERVICE)
+@SystemApi
+public final class CallbackToken implements Parcelable {
+    private static final boolean DEBUG = true;
+    private static final String TAG = CallbackToken.class.getSimpleName();
+    private final IBinder mToken;
+
+    private final Object mLock = new Object();
+    private boolean mTokenUsed = false;
+
+    public CallbackToken() {
+        mToken = new Binder();
+    }
+
+    private CallbackToken(Parcel in) {
+        mToken = in.readStrongBinder();
+    }
+
+    /**
+     * Returns the {@link ContextualSearchState} to the handler via the provided callback. The
+     * method can only be invoked to provide the {@link OutcomeReceiver} once and all subsequent
+     * invocations of this method will result in {@link OutcomeReceiver#onError} being called with
+     * an {@link IllegalAccessException}.
+     *
+     * @param executor The executor which will be used to invoke the callback.
+     * @param callback The callback which will be used to return {@link ContextualSearchState}
+     *                 if/when it is available via {@link OutcomeReceiver#onResult}. It will also be
+     *                 used to return errors via {@link OutcomeReceiver#onError}.
+     */
+    public void getContextualSearchState(@NonNull @CallbackExecutor Executor executor,
+            @NonNull OutcomeReceiver<ContextualSearchState, Throwable> callback) {
+        if (DEBUG) Log.d(TAG, "getContextualSearchState for token:" + mToken);
+        boolean tokenUsed;
+        synchronized (mLock) {
+            tokenUsed = markUsedLocked();
+        }
+        if (tokenUsed) {
+            callback.onError(new IllegalAccessException("Token already used."));
+            return;
+        }
+        try {
+            // Get the service from the system server.
+            IBinder b = ServiceManager.getService(Context.CONTEXTUAL_SEARCH_SERVICE);
+            IContextualSearchManager service = IContextualSearchManager.Stub.asInterface(b);
+            final CallbackWrapper wrapper = new CallbackWrapper(executor, callback);
+            // If the service is not null, hand over the call to the service.
+            if (service != null) {
+                service.getContextualSearchState(mToken, wrapper);
+            } else {
+                Log.w(TAG, "Failed to getContextualSearchState. Service null.");
+            }
+        } catch (RemoteException e) {
+            if (DEBUG) Log.d(TAG, "Failed to call getContextualSearchState", e);
+            e.rethrowFromSystemServer();
+        }
+    }
+
+    private boolean markUsedLocked() {
+        boolean oldValue = mTokenUsed;
+        mTokenUsed = true;
+        return oldValue;
+    }
+
+    /**
+     * Return the token necessary for validating the caller of {@link #getContextualSearchState}.
+     *
+     * @hide
+     */
+    @TestApi
+    @NonNull
+    public IBinder getToken() {
+        return mToken;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        dest.writeStrongBinder(mToken);
+    }
+
+    @NonNull
+    public static final Creator<CallbackToken> CREATOR = new Creator<>() {
+        @Override
+        public CallbackToken createFromParcel(Parcel in) {
+            return new CallbackToken(in);
+        }
+
+        @Override
+        public CallbackToken[] newArray(int size) {
+            return new CallbackToken[size];
+        }
+    };
+
+    private static class CallbackWrapper extends IContextualSearchCallback.Stub {
+        private final OutcomeReceiver<ContextualSearchState, Throwable> mCallback;
+        private final Executor mExecutor;
+
+        CallbackWrapper(@NonNull Executor callbackExecutor,
+                @NonNull OutcomeReceiver<ContextualSearchState, Throwable> callback) {
+            mCallback = callback;
+            mExecutor = callbackExecutor;
+        }
+
+        @Override
+        public void onResult(ContextualSearchState state) {
+            Binder.withCleanCallingIdentity(() -> {
+                if (DEBUG) Log.d(TAG, "onResult state:" + state);
+                mExecutor.execute(() -> mCallback.onResult(state));
+            });
+        }
+
+        @Override
+        public void onError(ParcelableException error) {
+            Binder.withCleanCallingIdentity(() -> {
+                if (DEBUG) Log.w(TAG, "onError", error);
+                mExecutor.execute(() -> mCallback.onError(error));
+            });
+        }
+    }
+}
diff --git a/core/java/android/app/contextualsearch/ContextualSearchManager.java b/core/java/android/app/contextualsearch/ContextualSearchManager.java
index 693de21..c080a6b 100644
--- a/core/java/android/app/contextualsearch/ContextualSearchManager.java
+++ b/core/java/android/app/contextualsearch/ContextualSearchManager.java
@@ -18,43 +18,32 @@
 
 import static android.Manifest.permission.ACCESS_CONTEXTUAL_SEARCH;
 
-import android.annotation.CallbackExecutor;
 import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
-import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemApi;
 import android.app.contextualsearch.flags.Flags;
 import android.content.Context;
-import android.os.Binder;
-import android.os.Bundle;
 import android.os.IBinder;
-import android.os.OutcomeReceiver;
-import android.os.ParcelableException;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.util.Log;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
-import java.util.concurrent.Executor;
 
 /**
  * {@link ContextualSearchManager} is a system service to facilitate contextual search experience on
  * configured Android devices.
  * <p>
- * This class lets
- * <ul>
- *   <li> a caller start contextual search by calling {@link #startContextualSearch} method.
- *   <li> a handler request {@link ContextualSearchState} by calling the
- *   {@link #getContextualSearchState} method.
- * </ul>
+ * This class lets a caller start contextual search by calling {@link #startContextualSearch}
+ * method.
  *
  * @hide
  */
 @SystemApi
 @FlaggedApi(Flags.FLAG_ENABLE_SERVICE)
-public class ContextualSearchManager {
+public final class ContextualSearchManager {
 
     /**
      * Key to get the entrypoint from the extras of the activity launched by contextual search.
@@ -92,7 +81,7 @@
 
     /**
      * Key to get the binder token from the extras of the activity launched by contextual search.
-     * This token is needed to invoke {@link #getContextualSearchState} method.
+     * This token is needed to invoke {@link CallbackToken#getContextualSearchState} method.
      * Only supposed to be used with ACTON_LAUNCH_CONTEXTUAL_SEARCH.
      */
     public static final String EXTRA_TOKEN = "android.app.contextualsearch.extra.TOKEN";
@@ -174,57 +163,4 @@
             e.rethrowFromSystemServer();
         }
     }
-
-    /**
-     * Returns the {@link ContextualSearchState} to the handler via the provided callback.
-     *
-     * @param token The caller is expected to get the token from the launch extras of the handling
-     *              activity using {@link Bundle#getIBinder} with {@link #EXTRA_TOKEN} key.
-     *              <br>
-     *              <b>Note</b> This token is for one time use only. Subsequent uses will invoke
-     *              callback's {@link OutcomeReceiver#onError}.
-     * @param executor The executor which will be used to invoke the callback.
-     * @param callback The callback which will be used to return {@link ContextualSearchState}
-     *                 if/when it is available via {@link OutcomeReceiver#onResult}. It will also be
-     *                 used to return errors via {@link OutcomeReceiver#onError}.
-     */
-    public void getContextualSearchState(@NonNull IBinder token,
-            @NonNull @CallbackExecutor Executor executor,
-            @NonNull OutcomeReceiver<ContextualSearchState, Throwable> callback) {
-        if (DEBUG) Log.d(TAG, "getContextualSearchState for token:" + token);
-        try {
-            final CallbackWrapper wrapper = new CallbackWrapper(executor, callback);
-            mService.getContextualSearchState(token, wrapper);
-        } catch (RemoteException e) {
-            if (DEBUG) Log.d(TAG, "Failed to getContextualSearchState", e);
-            e.rethrowFromSystemServer();
-        }
-    }
-
-    private static class CallbackWrapper extends IContextualSearchCallback.Stub {
-        private final OutcomeReceiver<ContextualSearchState, Throwable> mCallback;
-        private final Executor mExecutor;
-
-        CallbackWrapper(@NonNull Executor callbackExecutor,
-                        @NonNull OutcomeReceiver<ContextualSearchState, Throwable> callback) {
-            mCallback = callback;
-            mExecutor = callbackExecutor;
-        }
-
-        @Override
-        public void onResult(ContextualSearchState state) {
-            Binder.withCleanCallingIdentity(() -> {
-                if (DEBUG) Log.d(TAG, "onResult state:" + state);
-                mExecutor.execute(() -> mCallback.onResult(state));
-            });
-        }
-
-        @Override
-        public void onError(ParcelableException error) {
-            Binder.withCleanCallingIdentity(() -> {
-                if (DEBUG) Log.w(TAG, "onError", error);
-                mExecutor.execute(() -> mCallback.onError(error));
-            });
-        }
-    }
 }
diff --git a/core/java/android/app/contextualsearch/ContextualSearchState.java b/core/java/android/app/contextualsearch/ContextualSearchState.java
index 5c04bc89..f01ae55 100644
--- a/core/java/android/app/contextualsearch/ContextualSearchState.java
+++ b/core/java/android/app/contextualsearch/ContextualSearchState.java
@@ -32,6 +32,10 @@
  * {@link ContextualSearchState} contains additional data a contextual search handler can request
  * via {@link ContextualSearchManager#getContextualSearchState} method.
  *
+ * It provides the caller of {@link ContextualSearchManager#getContextualSearchState} with an
+ * {@link AssistStructure}, {@link AssistContent} and a {@link Bundle} extras containing any
+ * relevant data added by th system server. When invoked via the Launcher, this bundle is empty.
+ *
  * @hide
  */
 @FlaggedApi(Flags.FLAG_ENABLE_SERVICE)
@@ -41,6 +45,12 @@
     private final @Nullable AssistStructure mStructure;
     private final @Nullable AssistContent mContent;
 
+    /**
+     * {@link ContextualSearchState} contains non-essential data which can be requested by the
+     * Contextual Search activity.
+     * The activity can request an instance of {@link ContextualSearchState} by calling
+     * {@link CallbackToken#getContextualSearchState} and passing a valid token as an argument.
+     */
     public ContextualSearchState(@Nullable AssistStructure structure,
             @Nullable AssistContent content, @NonNull Bundle extras) {
         mStructure = structure;
diff --git a/core/java/android/app/contextualsearch/IContextualSearchManager.aidl b/core/java/android/app/contextualsearch/IContextualSearchManager.aidl
index 1735a71..9b0b8b7 100644
--- a/core/java/android/app/contextualsearch/IContextualSearchManager.aidl
+++ b/core/java/android/app/contextualsearch/IContextualSearchManager.aidl
@@ -1,6 +1,5 @@
 package android.app.contextualsearch;
 
-
 import android.app.contextualsearch.IContextualSearchCallback;
 /**
  * @hide
diff --git a/core/java/android/app/notification.aconfig b/core/java/android/app/notification.aconfig
index e9a7460..0214d40 100644
--- a/core/java/android/app/notification.aconfig
+++ b/core/java/android/app/notification.aconfig
@@ -71,4 +71,42 @@
   metadata {
     purpose: PURPOSE_BUGFIX
   }
+}
+
+flag {
+  name: "update_ranking_time"
+  namespace: "systemui"
+  description: "Updates notification sorting criteria to highlight new content while maintaining stability"
+  bug: "326016985"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
+  name: "sort_section_by_time"
+  namespace: "systemui"
+  description: "Changes notification sort order to be by time within a section"
+  bug: "330193582"
+}
+
+flag {
+  name: "restrict_audio_attributes_call"
+  namespace: "systemui"
+  description: "Only CallStyle notifs can use USAGE_NOTIFICATION_RINGTONE"
+  bug: "331793339"
+}
+
+flag {
+  name: "restrict_audio_attributes_alarm"
+  namespace: "systemui"
+  description: "Only alarm category notifs can use USAGE_ALARM"
+  bug: "331793339"
+}
+
+flag {
+  name: "restrict_audio_attributes_media"
+  namespace: "systemui"
+  description: "No notifs can use USAGE_UNKNOWN or USAGE_MEDIA"
+  bug: "331793339"
 }
\ No newline at end of file
diff --git a/core/java/android/app/ondeviceintelligence/IDownloadCallback.aidl b/core/java/android/app/ondeviceintelligence/IDownloadCallback.aidl
index 8fc269e..2d7ea1a 100644
--- a/core/java/android/app/ondeviceintelligence/IDownloadCallback.aidl
+++ b/core/java/android/app/ondeviceintelligence/IDownloadCallback.aidl
@@ -23,7 +23,7 @@
  *
  * @hide
  */
-interface IDownloadCallback {
+oneway interface IDownloadCallback {
   void onDownloadStarted(long bytesToDownload) = 1;
   void onDownloadProgress(long bytesDownloaded) = 2;
   void onDownloadFailed(int failureStatus, String errorMessage, in PersistableBundle errorParams) = 3;
diff --git a/core/java/android/app/ondeviceintelligence/IFeatureCallback.aidl b/core/java/android/app/ondeviceintelligence/IFeatureCallback.aidl
index 93a84ec..2e05692 100644
--- a/core/java/android/app/ondeviceintelligence/IFeatureCallback.aidl
+++ b/core/java/android/app/ondeviceintelligence/IFeatureCallback.aidl
@@ -8,7 +8,7 @@
   *
   * @hide
   */
-interface IFeatureCallback {
+oneway interface IFeatureCallback {
     void onSuccess(in Feature result) = 1;
     void onFailure(int errorCode, in String errorMessage, in PersistableBundle errorParams) = 2;
 }
diff --git a/core/java/android/app/ondeviceintelligence/IFeatureDetailsCallback.aidl b/core/java/android/app/ondeviceintelligence/IFeatureDetailsCallback.aidl
index d950290..8688028 100644
--- a/core/java/android/app/ondeviceintelligence/IFeatureDetailsCallback.aidl
+++ b/core/java/android/app/ondeviceintelligence/IFeatureDetailsCallback.aidl
@@ -8,7 +8,7 @@
   *
   * @hide
   */
-interface IFeatureDetailsCallback {
+oneway interface IFeatureDetailsCallback {
     void onSuccess(in FeatureDetails result) = 1;
     void onFailure(int errorCode, in String errorMessage, in PersistableBundle errorParams) = 2;
 }
diff --git a/core/java/android/app/ondeviceintelligence/IListFeaturesCallback.aidl b/core/java/android/app/ondeviceintelligence/IListFeaturesCallback.aidl
index 374cb71..7e5eb57 100644
--- a/core/java/android/app/ondeviceintelligence/IListFeaturesCallback.aidl
+++ b/core/java/android/app/ondeviceintelligence/IListFeaturesCallback.aidl
@@ -9,7 +9,7 @@
   *
   * @hide
   */
-interface IListFeaturesCallback {
+oneway interface IListFeaturesCallback {
     void onSuccess(in List<Feature> result) = 1;
     void onFailure(int errorCode, in String errorMessage, in PersistableBundle errorParams) = 2;
 }
diff --git a/core/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl b/core/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl
index 8bf288a..470b1ec 100644
--- a/core/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl
+++ b/core/java/android/app/ondeviceintelligence/IOnDeviceIntelligenceManager.aidl
@@ -39,7 +39,7 @@
   *
   * @hide
   */
- interface IOnDeviceIntelligenceManager {
+interface IOnDeviceIntelligenceManager {
       @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.USE_ON_DEVICE_INTELLIGENCE)")
       void getVersion(in RemoteCallback remoteCallback) = 1;
 
diff --git a/core/java/android/app/ondeviceintelligence/IResponseCallback.aidl b/core/java/android/app/ondeviceintelligence/IResponseCallback.aidl
index 45963d2..270b600 100644
--- a/core/java/android/app/ondeviceintelligence/IResponseCallback.aidl
+++ b/core/java/android/app/ondeviceintelligence/IResponseCallback.aidl
@@ -9,7 +9,7 @@
   *
   * @hide
   */
-interface IResponseCallback {
+oneway interface IResponseCallback {
     void onSuccess(in Bundle resultBundle) = 1;
     void onFailure(int errorCode, in String errorMessage, in PersistableBundle errorParams) = 2;
     void onDataAugmentRequest(in Bundle processedContent, in RemoteCallback responseCallback) = 3;
diff --git a/core/java/android/app/ondeviceintelligence/IStreamingResponseCallback.aidl b/core/java/android/app/ondeviceintelligence/IStreamingResponseCallback.aidl
index 671abe3..3e90240 100644
--- a/core/java/android/app/ondeviceintelligence/IStreamingResponseCallback.aidl
+++ b/core/java/android/app/ondeviceintelligence/IStreamingResponseCallback.aidl
@@ -10,7 +10,7 @@
   *
   * @hide
   */
-interface IStreamingResponseCallback {
+oneway interface IStreamingResponseCallback {
     void onNewContent(in Bundle processedResult) = 1;
     void onSuccess(in Bundle result) = 2;
     void onFailure(int errorCode, in String errorMessage, in PersistableBundle errorParams) = 3;
diff --git a/core/java/android/app/ondeviceintelligence/ITokenInfoCallback.aidl b/core/java/android/app/ondeviceintelligence/ITokenInfoCallback.aidl
index 9219a89..958bef0 100644
--- a/core/java/android/app/ondeviceintelligence/ITokenInfoCallback.aidl
+++ b/core/java/android/app/ondeviceintelligence/ITokenInfoCallback.aidl
@@ -8,7 +8,7 @@
   *
   * @hide
   */
-interface ITokenInfoCallback {
+oneway interface ITokenInfoCallback {
     void onSuccess(in TokenInfo tokenInfo) = 1;
     void onFailure(int errorCode, in String errorMessage, in PersistableBundle errorParams) = 2;
 }
diff --git a/core/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java b/core/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java
index bc50d2e4..5e1c1e0 100644
--- a/core/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java
+++ b/core/java/android/app/ondeviceintelligence/OnDeviceIntelligenceManager.java
@@ -365,7 +365,6 @@
      *                           associated params.
      */
     @RequiresPermission(Manifest.permission.USE_ON_DEVICE_INTELLIGENCE)
-
     public void processRequest(@NonNull Feature feature, @NonNull @InferenceParams Bundle request,
             @RequestType int requestType,
             @Nullable CancellationSignal cancellationSignal,
@@ -423,16 +422,16 @@
      * when the final response contains an enhanced aggregation of the contents already
      * streamed.
      *
-     * @param feature                   feature associated with the request.
-     * @param request                   request and associated params represented by the Bundle
-     *                                  data.
-     * @param requestType               type of request being sent for processing the content.
-     * @param cancellationSignal        signal to invoke cancellation.
-     * @param processingSignal          signal to send custom signals in the
-     *                                  remote implementation.
-     * @param streamingResponseCallback streaming callback to populate the response content and
-     *                                  associated params.
-     * @param callbackExecutor          executor to run the callback on.
+     * @param feature                     feature associated with the request.
+     * @param request                     request and associated params represented by the Bundle
+     *                                    data.
+     * @param requestType                 type of request being sent for processing the content.
+     * @param cancellationSignal          signal to invoke cancellation.
+     * @param processingSignal            signal to send custom signals in the
+     *                                    remote implementation.
+     * @param streamingProcessingCallback streaming callback to populate the response content and
+     *                                    associated params.
+     * @param callbackExecutor            executor to run the callback on.
      */
     @RequiresPermission(Manifest.permission.USE_ON_DEVICE_INTELLIGENCE)
     public void processRequestStreaming(@NonNull Feature feature,
@@ -528,19 +527,18 @@
 
     /**
      * {@link Bundle}s annotated with this type will be validated that they are in-effect read-only
-     * when passed to inference service via Binder IPC. Following restrictions apply :
+     * when passed via Binder IPC. Following restrictions apply :
      * <ul>
+     * <li> No Nested Bundles are allowed.</li>
+     * <li> {@link PersistableBundle}s are allowed.</li>
      * <li> Any primitive types or their collections can be added as usual.</li>
      * <li>IBinder objects should *not* be added.</li>
      * <li>Parcelable data which has no active-objects, should be added as
      * {@link Bundle#putByteArray}</li>
      * <li>Parcelables have active-objects, only following types will be allowed</li>
      * <ul>
-     *  <li>{@link Bitmap} set as {@link Bitmap#setImmutable()}</li>
-     *  <li>{@link android.database.CursorWindow}</li>
      *  <li>{@link android.os.ParcelFileDescriptor} opened in
      *  {@link android.os.ParcelFileDescriptor#MODE_READ_ONLY}</li>
-     *  <li>{@link android.os.SharedMemory} set to {@link OsConstants#PROT_READ}</li>
      * </ul>
      * </ul>
      *
@@ -550,9 +548,40 @@
      * @hide
      */
     @Target({ElementType.PARAMETER, ElementType.FIELD})
+    public @interface StateParams {
+    }
+
+    /**
+     * This is an extension of {@link StateParams} but for purpose of inference few other types are
+     * also allowed as read-only, as listed below.
+     *
+     * <li>{@link Bitmap} set as immutable.</li>
+     * <li>{@link android.database.CursorWindow}</li>
+     * <li>{@link android.os.SharedMemory} set to {@link OsConstants#PROT_READ}</li>
+     * </ul>
+     * </ul>
+     *
+     * In all other scenarios the system-server might throw a
+     * {@link android.os.BadParcelableException} if the Bundle validation fails.
+     *
+     * @hide
+     */
+    @Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.TYPE_USE})
     public @interface InferenceParams {
     }
 
+    /**
+     * This is an extension of {@link StateParams} with the exception that it allows writing
+     * {@link Bitmap} as part of the response.
+     *
+     * In all other scenarios the system-server might throw a
+     * {@link android.os.BadParcelableException} if the Bundle validation fails.
+     *
+     * @hide
+     */
+    @Target({ElementType.PARAMETER, ElementType.FIELD})
+    public @interface ResponseParams {
+    }
 
     @Nullable
     private static AndroidFuture<IBinder> configureRemoteCancellationFuture(
diff --git a/core/java/android/app/ondeviceintelligence/ProcessingCallback.java b/core/java/android/app/ondeviceintelligence/ProcessingCallback.java
index 4d936ea..e50d6b1 100644
--- a/core/java/android/app/ondeviceintelligence/ProcessingCallback.java
+++ b/core/java/android/app/ondeviceintelligence/ProcessingCallback.java
@@ -23,6 +23,7 @@
 import android.annotation.SystemApi;
 import android.os.Bundle;
 import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.InferenceParams;
+import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.ResponseParams;
 
 import java.util.function.Consumer;
 
@@ -43,7 +44,7 @@
      *
      * @param result Response to be passed as a result.
      */
-    void onResult(@NonNull @InferenceParams Bundle result);
+    void onResult(@NonNull @ResponseParams Bundle result);
 
     /**
      * Called when the request processing fails. The failure details are indicated by the
@@ -64,8 +65,8 @@
      *                         expected to be non-null or EMPTY when there is no response.
      */
     default void onDataAugmentRequest(
-            @NonNull @InferenceParams Bundle processedContent,
-            @NonNull Consumer<Bundle> contentConsumer) {
+            @NonNull @ResponseParams Bundle processedContent,
+            @NonNull Consumer<@InferenceParams Bundle> contentConsumer) {
         contentConsumer.accept(Bundle.EMPTY);
     }
 }
diff --git a/core/java/android/app/ondeviceintelligence/StreamingProcessingCallback.java b/core/java/android/app/ondeviceintelligence/StreamingProcessingCallback.java
index 41f1807..7ee2af7 100644
--- a/core/java/android/app/ondeviceintelligence/StreamingProcessingCallback.java
+++ b/core/java/android/app/ondeviceintelligence/StreamingProcessingCallback.java
@@ -22,7 +22,7 @@
 import android.annotation.NonNull;
 import android.annotation.SystemApi;
 import android.os.Bundle;
-import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.InferenceParams;
+import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.ResponseParams;
 
 /**
  * Streaming variant of {@link ProcessingCallback} to populate response while processing a given
@@ -37,5 +37,5 @@
      * Callback that would be invoked when a part of the response i.e. some response is
      * already processed, and needs to be passed onto the caller.
      */
-    void onPartialResult(@NonNull @InferenceParams Bundle partialResult);
+    void onPartialResult(@NonNull @ResponseParams Bundle partialResult);
 }
diff --git a/core/java/android/app/servertransaction/ClientTransactionListenerController.java b/core/java/android/app/servertransaction/ClientTransactionListenerController.java
index 7383d07..c55b0f1 100644
--- a/core/java/android/app/servertransaction/ClientTransactionListenerController.java
+++ b/core/java/android/app/servertransaction/ClientTransactionListenerController.java
@@ -122,7 +122,7 @@
         }
         for (Object activityWindowInfoChangedListener : activityWindowInfoChangedListeners) {
             ((BiConsumer<IBinder, ActivityWindowInfo>) activityWindowInfoChangedListener)
-                    .accept(activityToken, activityWindowInfo);
+                    .accept(activityToken, new ActivityWindowInfo(activityWindowInfo));
         }
     }
 
diff --git a/core/java/android/app/slice/Slice.java b/core/java/android/app/slice/Slice.java
index 475ee7a..5514868 100644
--- a/core/java/android/app/slice/Slice.java
+++ b/core/java/android/app/slice/Slice.java
@@ -41,7 +41,12 @@
  *
  * <p>They are constructed using {@link Builder} in a tree structure
  * that provides the OS some information about how the content should be displayed.
+ * @deprecated Slice framework has been deprecated, it will not receive any updates from
+ *          {@link android.os.Build.VANILLA_ICE_CREAM} and forward. If you are looking for a
+ *          framework that sends displayable data from one app to another, consider using
+ *          {@link android.app.appsearch.AppSearchManager}.
  */
+@Deprecated
 public final class Slice implements Parcelable {
 
     /**
@@ -338,7 +343,12 @@
 
     /**
      * A Builder used to construct {@link Slice}s
+     * @deprecated Slice framework has been deprecated, it will not receive any updates from
+     *          {@link android.os.Build.VANILLA_ICE_CREAM} and forward. If you are looking for a
+     *          framework that sends displayable data from one app to another, consider using
+     *          {@link android.app.appsearch.AppSearchManager}.
      */
+    @Deprecated
     public static class Builder {
 
         private final Uri mUri;
diff --git a/core/java/android/app/slice/SliceItem.java b/core/java/android/app/slice/SliceItem.java
index 2d6f4a6..27c726d 100644
--- a/core/java/android/app/slice/SliceItem.java
+++ b/core/java/android/app/slice/SliceItem.java
@@ -53,7 +53,12 @@
  * The hints that a {@link SliceItem} are a set of strings which annotate
  * the content. The hints that are guaranteed to be understood by the system
  * are defined on {@link Slice}.
+ * @deprecated Slice framework has been deprecated, it will not receive any updates from
+ *          {@link android.os.Build.VANILLA_ICE_CREAM} and forward. If you are looking for a
+ *          framework that sends displayable data from one app to another, consider using
+ *          {@link android.app.appsearch.AppSearchManager}.
  */
+@Deprecated
 public final class SliceItem implements Parcelable {
 
     private static final String TAG = "SliceItem";
diff --git a/core/java/android/app/slice/SliceManager.java b/core/java/android/app/slice/SliceManager.java
index 2e179d0..4fc2a0c 100644
--- a/core/java/android/app/slice/SliceManager.java
+++ b/core/java/android/app/slice/SliceManager.java
@@ -59,7 +59,12 @@
  * Class to handle interactions with {@link Slice}s.
  * <p>
  * The SliceManager manages permissions and pinned state for slices.
+ * @deprecated Slice framework has been deprecated, it will not receive any updates from
+ *          {@link android.os.Build.VANILLA_ICE_CREAM} and forward. If you are looking for a
+ *          framework that sends displayable data from one app to another, consider using
+ *          {@link android.app.appsearch.AppSearchManager}.
  */
+@Deprecated
 @SystemService(Context.SLICE_SERVICE)
 public class SliceManager {
 
diff --git a/core/java/android/app/slice/SliceMetrics.java b/core/java/android/app/slice/SliceMetrics.java
index 746beaf..abfe3a2f 100644
--- a/core/java/android/app/slice/SliceMetrics.java
+++ b/core/java/android/app/slice/SliceMetrics.java
@@ -31,7 +31,12 @@
  * not need to reference this class.
  *
  * @see androidx.slice.widget.SliceView
+ * @deprecated Slice framework has been deprecated, it will not receive any updates from
+ *          {@link android.os.Build.VANILLA_ICE_CREAM} and forward. If you are looking for a
+ *          framework that sends displayable data from one app to another, consider using
+ *          {@link android.app.appsearch.AppSearchManager}.
  */
+@Deprecated
 public class SliceMetrics {
 
     private static final String TAG = "SliceMetrics";
diff --git a/core/java/android/app/slice/SliceProvider.java b/core/java/android/app/slice/SliceProvider.java
index 42c3aa6..4374550 100644
--- a/core/java/android/app/slice/SliceProvider.java
+++ b/core/java/android/app/slice/SliceProvider.java
@@ -91,7 +91,12 @@
  * </pre>
  *
  * @see Slice
+ * @deprecated Slice framework has been deprecated, it will not receive any updates from
+ *          {@link android.os.Build.VANILLA_ICE_CREAM} and forward. If you are looking for a
+ *          framework that sends displayable data from one app to another, consider using
+ *          {@link android.app.appsearch.AppSearchManager}.
  */
+@Deprecated
 public abstract class SliceProvider extends ContentProvider {
     /**
      * This is the Android platform's MIME type for a URI
diff --git a/core/java/android/app/slice/SliceSpec.java b/core/java/android/app/slice/SliceSpec.java
index a332349..078f552 100644
--- a/core/java/android/app/slice/SliceSpec.java
+++ b/core/java/android/app/slice/SliceSpec.java
@@ -38,7 +38,12 @@
  *
  * @see Slice
  * @see SliceProvider#onBindSlice(Uri, Set)
+ * @deprecated Slice framework has been deprecated, it will not receive any updates from
+ *          {@link android.os.Build.VANILLA_ICE_CREAM} and forward. If you are looking for a
+ *          framework that sends displayable data from one app to another, consider using
+ *          {@link android.app.appsearch.AppSearchManager}.
  */
+@Deprecated
 public final class SliceSpec implements Parcelable {
 
     private final String mType;
diff --git a/core/java/android/app/wearable/IWearableSensingCallback.aidl b/core/java/android/app/wearable/IWearableSensingCallback.aidl
new file mode 100644
index 0000000..d76b32d
--- /dev/null
+++ b/core/java/android/app/wearable/IWearableSensingCallback.aidl
@@ -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 android.app.wearable;
+
+import android.os.ParcelFileDescriptor;
+
+import com.android.internal.infra.AndroidFuture;
+
+/**
+ * Interface for callbacks coming from the WearableSensingService.
+ *
+ * @hide
+ */
+oneway interface IWearableSensingCallback {
+
+    /**
+     * Opens the requested file and returns the resulting ParcelFileDescriptor to the provided
+     * future.
+     */
+    void openFile(in String filename, in AndroidFuture<ParcelFileDescriptor> future);
+}
\ No newline at end of file
diff --git a/core/java/android/app/wearable/IWearableSensingManager.aidl b/core/java/android/app/wearable/IWearableSensingManager.aidl
index 7d3b285..c0d06ea 100644
--- a/core/java/android/app/wearable/IWearableSensingManager.aidl
+++ b/core/java/android/app/wearable/IWearableSensingManager.aidl
@@ -17,6 +17,7 @@
 package android.app.wearable;
 
 import android.app.PendingIntent;
+import android.app.wearable.IWearableSensingCallback;
 import android.content.ComponentName;
 import android.os.ParcelFileDescriptor;
 import android.os.PersistableBundle;
@@ -30,9 +31,9 @@
  */
 interface IWearableSensingManager {
      @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE)")
-     void provideConnection(in ParcelFileDescriptor parcelFileDescriptor, in RemoteCallback callback);
+     void provideConnection(in ParcelFileDescriptor parcelFileDescriptor, in IWearableSensingCallback wearableSensingCallback, in RemoteCallback statusCallback);
      @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE)")
-     void provideDataStream(in ParcelFileDescriptor parcelFileDescriptor, in RemoteCallback callback);
+     void provideDataStream(in ParcelFileDescriptor parcelFileDescriptor, in @nullable IWearableSensingCallback wearableSensingCallback, in RemoteCallback statusCallback);
      @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE)")
      void provideData(in PersistableBundle data, in SharedMemory sharedMemory, in RemoteCallback callback);
      @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE)")
diff --git a/core/java/android/app/wearable/WearableSensingManager.java b/core/java/android/app/wearable/WearableSensingManager.java
index df6d2a6..4b77c74 100644
--- a/core/java/android/app/wearable/WearableSensingManager.java
+++ b/core/java/android/app/wearable/WearableSensingManager.java
@@ -27,11 +27,15 @@
 import android.annotation.SystemService;
 import android.app.PendingIntent;
 import android.app.ambientcontext.AmbientContextEvent;
+import android.app.compat.CompatChanges;
 import android.companion.CompanionDeviceManager;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledSince;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Binder;
+import android.os.Build;
 import android.os.ParcelFileDescriptor;
 import android.os.PersistableBundle;
 import android.os.RemoteCallback;
@@ -39,7 +43,13 @@
 import android.os.SharedMemory;
 import android.service.wearable.WearableSensingService;
 import android.system.OsConstants;
+import android.util.Slog;
 
+import com.android.internal.infra.AndroidFuture;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.lang.annotation.Retention;
@@ -155,6 +165,17 @@
     public @interface StatusCode {}
 
     /**
+     * If the WearableSensingService implementation belongs to the same APK as the caller, calling
+     * {@link #provideDataStream(ParcelFileDescriptor, Executor, Consumer)} will allow
+     * WearableSensingService to read from the caller's file directory via {@link
+     * Context#openFileInput(String)}. The read will be proxied via the caller's process and
+     * executed by the {@code executor} provided to this method.
+     */
+    @ChangeId
+    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    static final long ALLOW_WEARABLE_SENSING_SERVICE_FILE_READ = 330701114L;
+
+    /**
      * Retrieves a {@link WearableSensingDataRequest} from the Intent sent to the PendingIntent
      * provided to {@link #registerDataRequestObserver(int, PendingIntent, Executor, Consumer)}.
      *
@@ -169,6 +190,7 @@
                 EXTRA_WEARABLE_SENSING_DATA_REQUEST, WearableSensingDataRequest.class);
     }
 
+    private static final String TAG = WearableSensingManager.class.getSimpleName();
     private final Context mContext;
     private final IWearableSensingManager mService;
 
@@ -216,6 +238,11 @@
      * dropped during the restart. The caller is responsible for ensuring other method calls are
      * queued until a success status is returned from the {@code statusConsumer}.
      *
+     * <p>If the WearableSensingService implementation belongs to the same APK as the caller,
+     * calling this method will allow WearableSensingService to read from the caller's file
+     * directory via {@link Context#openFileInput(String)}. The read will be proxied via the
+     * caller's process and executed by the {@code executor} provided to this method.
+     *
      * @param wearableConnection The connection to provide
      * @param executor Executor on which to run the consumer callback
      * @param statusConsumer A consumer that handles the status codes for providing the connection
@@ -227,9 +254,14 @@
             @NonNull ParcelFileDescriptor wearableConnection,
             @NonNull @CallbackExecutor Executor executor,
             @NonNull @StatusCode Consumer<Integer> statusConsumer) {
+        RemoteCallback statusCallback = createStatusCallback(executor, statusConsumer);
         try {
-            RemoteCallback callback = createStatusCallback(executor, statusConsumer);
-            mService.provideConnection(wearableConnection, callback);
+            // The wearableSensingCallback is included in this method call even though it is not
+            // semantically related to the connection because we want to avoid race conditions
+            // during the process restart triggered by this method call. See
+            // com.android.server.wearable.RemoteWearableSensingService for details.
+            mService.provideConnection(
+                    wearableConnection, createWearableSensingCallback(executor), statusCallback);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -237,15 +269,21 @@
 
     /**
      * Provides a data stream to the WearableSensingService that's backed by the
-     * parcelFileDescriptor, and sends the result to the {@link Consumer} right after the call.
-     * This is used by applications that will also provide an implementation of
-     * an isolated WearableSensingService. If the data stream was provided successfully
-     * {@link WearableSensingManager#STATUS_SUCCESS} will be provided.
+     * parcelFileDescriptor, and sends the result to the {@link Consumer} right after the call. This
+     * is used by applications that will also provide an implementation of an isolated
+     * WearableSensingService. If the data stream was provided successfully {@link
+     * WearableSensingManager#STATUS_SUCCESS} will be provided.
+     *
+     * <p>Starting from target SDK level 35, if the WearableSensingService implementation belongs to
+     * the same APK as the caller, calling this method will allow WearableSensingService to read
+     * from the caller's file directory via {@link Context#openFileInput(String)}. The read will be
+     * proxied via the caller's process and executed by the {@code executor} provided to this
+     * method.
      *
      * @param parcelFileDescriptor The data stream to provide
      * @param executor Executor on which to run the consumer callback
-     * @param statusConsumer A consumer that handles the status codes, which is returned
-     *                 right after the call.
+     * @param statusConsumer A consumer that handles the status codes, which is returned right after
+     *     the call.
      * @deprecated Use {@link #provideConnection(ParcelFileDescriptor, Executor, Consumer)} instead
      *     to provide a remote wearable device connection to the WearableSensingService
      */
@@ -255,9 +293,14 @@
             @NonNull ParcelFileDescriptor parcelFileDescriptor,
             @NonNull @CallbackExecutor Executor executor,
             @NonNull @StatusCode Consumer<Integer> statusConsumer) {
+        RemoteCallback statusCallback = createStatusCallback(executor, statusConsumer);
+        IWearableSensingCallback wearableSensingCallback = null;
+        if (CompatChanges.isChangeEnabled(ALLOW_WEARABLE_SENSING_SERVICE_FILE_READ)) {
+            wearableSensingCallback = createWearableSensingCallback(executor);
+        }
         try {
-            RemoteCallback callback = createStatusCallback(executor, statusConsumer);
-            mService.provideDataStream(parcelFileDescriptor, callback);
+            mService.provideDataStream(
+                    parcelFileDescriptor, wearableSensingCallback, statusCallback);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -480,4 +523,47 @@
                     }
                 });
     }
+
+    private IWearableSensingCallback createWearableSensingCallback(Executor executor) {
+        return new IWearableSensingCallback.Stub() {
+
+            @Override
+            public void openFile(String filename, AndroidFuture<ParcelFileDescriptor> future) {
+                Slog.d(TAG, "IWearableSensingCallback#openFile " + filename);
+                Binder.withCleanCallingIdentity(
+                        () ->
+                                executor.execute(
+                                        () -> {
+                                            File file = new File(mContext.getFilesDir(), filename);
+                                            ParcelFileDescriptor pfd = null;
+                                            try {
+                                                pfd =
+                                                        ParcelFileDescriptor.open(
+                                                                file,
+                                                                ParcelFileDescriptor
+                                                                        .MODE_READ_ONLY);
+                                                Slog.d(
+                                                        TAG,
+                                                        "Successfully opened a file with"
+                                                                + " ParcelFileDescriptor.");
+                                            } catch (FileNotFoundException e) {
+                                                Slog.e(TAG, "Cannot open file.", e);
+                                            } finally {
+                                                future.complete(pfd);
+                                                if (pfd != null) {
+                                                    try {
+                                                        pfd.close();
+                                                    } catch (IOException ex) {
+                                                        Slog.e(
+                                                                TAG,
+                                                                "Error closing"
+                                                                        + " ParcelFileDescriptor.",
+                                                                ex);
+                                                    }
+                                                }
+                                            }
+                                        }));
+            }
+        };
+    }
 }
diff --git a/core/java/android/appwidget/OWNERS b/core/java/android/appwidget/OWNERS
index 554b0de..1910833 100644
--- a/core/java/android/appwidget/OWNERS
+++ b/core/java/android/appwidget/OWNERS
@@ -1,4 +1,5 @@
[email protected]
[email protected]
 [email protected]
[email protected]
 [email protected]
 [email protected]
diff --git a/core/java/android/appwidget/flags.aconfig b/core/java/android/appwidget/flags.aconfig
index 4511954..765c802 100644
--- a/core/java/android/appwidget/flags.aconfig
+++ b/core/java/android/appwidget/flags.aconfig
@@ -32,3 +32,10 @@
   description: "Enable support for transporting draw instructions as data parcel"
   bug: "286130467"
 }
+
+flag {
+  name: "throttle_widget_updates"
+  namespace: "app_widgets"
+  description: "Throttle the widget view updates to mitigate transaction exceptions"
+  bug: "326145514"
+}
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index 2c26389..a08d659 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -26,6 +26,7 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.RequiresFeature;
 import android.annotation.RequiresPermission;
 import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
@@ -80,25 +81,27 @@
 import java.util.function.Consumer;
 
 /**
- * System level service for managing companion devices
+ * Public interfaces for managing companion devices.
  *
- * See <a href="{@docRoot}guide/topics/connectivity/companion-device-pairing">this guide</a>
- * for a usage example.
+ * <p>The interfaces in this class allow companion apps to
+ * {@link #associate(AssociationRequest, Executor, Callback)} discover and request device profiles}
+ * for companion devices, {@link #startObservingDevicePresence(String) listen to device presence
+ * events}, {@link #startSystemDataTransfer(int, Executor, OutcomeReceiver) transfer system level
+ * data} via {@link #attachSystemDataTransport(int, InputStream, OutputStream) the reported
+ * channel} and more.</p>
  *
- * <p>To obtain an instance call {@link Context#getSystemService}({@link
- * Context#COMPANION_DEVICE_SERVICE}) Then, call {@link #associate(AssociationRequest,
- * Callback, Handler)} to initiate the flow of associating current package with a
- * device selected by user.</p>
- *
- * @see CompanionDeviceManager#associate
- * @see AssociationRequest
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about managing companion devices, read the <a href=
+ * "{@docRoot}guide/topics/connectivity/companion-device-pairing">Companion Device Pairing</a>
+ * developer guide.
+ * </div>
  */
 @SuppressLint("LongLogTag")
 @SystemService(Context.COMPANION_DEVICE_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_COMPANION_DEVICE_SETUP)
 public final class CompanionDeviceManager {
-
-    private static final boolean DEBUG = false;
-    private static final String LOG_TAG = "CDM_CompanionDeviceManager";
+    private static final String TAG = "CDM_CompanionDeviceManager";
 
     /** @hide */
     @IntDef(prefix = {"RESULT_"}, value = {
@@ -374,7 +377,7 @@
     }
 
     private final ICompanionDeviceManager mService;
-    private Context mContext;
+    private final Context mContext;
 
     @GuardedBy("mListeners")
     private final ArrayList<OnAssociationsChangedListenerProxy> mListeners = new ArrayList<>();
@@ -432,7 +435,11 @@
             @NonNull AssociationRequest request,
             @NonNull Callback callback,
             @Nullable Handler handler) {
-        if (!checkFeaturePresent()) return;
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         Objects.requireNonNull(request, "Request cannot be null");
         Objects.requireNonNull(callback, "Callback cannot be null");
         handler = Handler.mainIfNull(handler);
@@ -492,7 +499,11 @@
             @NonNull AssociationRequest request,
             @NonNull Executor executor,
             @NonNull Callback callback) {
-        if (!checkFeaturePresent()) return;
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         Objects.requireNonNull(request, "Request cannot be null");
         Objects.requireNonNull(executor, "Executor cannot be null");
         Objects.requireNonNull(callback, "Callback cannot be null");
@@ -521,7 +532,10 @@
     @UserHandleAware
     @Nullable
     public IntentSender buildAssociationCancellationIntent() {
-        if (!checkFeaturePresent()) return null;
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return null;
+        }
 
         try {
             PendingIntent pendingIntent = mService.buildAssociationCancellationIntent(
@@ -543,7 +557,8 @@
      * @param flags system data types to be enabled.
      */
     public void enableSystemDataSyncForTypes(int associationId, @DataSyncTypes int flags) {
-        if (!checkFeaturePresent()) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
             return;
         }
 
@@ -565,7 +580,8 @@
      * @param flags system data types to be disabled.
      */
     public void disableSystemDataSyncForTypes(int associationId, @DataSyncTypes int flags) {
-        if (!checkFeaturePresent()) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
             return;
         }
 
@@ -580,6 +596,11 @@
      * @hide
      */
     public void enablePermissionsSync(int associationId) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         try {
             mService.enablePermissionsSync(associationId);
         } catch (RemoteException e) {
@@ -591,6 +612,11 @@
      * @hide
      */
     public void disablePermissionsSync(int associationId) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         try {
             mService.disablePermissionsSync(associationId);
         } catch (RemoteException e) {
@@ -602,6 +628,11 @@
      * @hide
      */
     public PermissionSyncRequest getPermissionSyncRequest(int associationId) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return null;
+        }
+
         try {
             return mService.getPermissionSyncRequest(associationId);
         } catch (RemoteException e) {
@@ -636,7 +667,10 @@
     @UserHandleAware
     @NonNull
     public List<AssociationInfo> getMyAssociations() {
-        if (!checkFeaturePresent()) return Collections.emptyList();
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return Collections.emptyList();
+        }
 
         try {
             return mService.getAssociations(mContext.getOpPackageName(), mContext.getUserId());
@@ -665,7 +699,10 @@
     @UserHandleAware
     @Deprecated
     public void disassociate(@NonNull String deviceMacAddress) {
-        if (!checkFeaturePresent()) return;
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
 
         try {
             mService.legacyDisassociate(deviceMacAddress, mContext.getOpPackageName(),
@@ -690,7 +727,10 @@
      */
     @UserHandleAware
     public void disassociate(int associationId) {
-        if (!checkFeaturePresent()) return;
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
 
         try {
             mService.disassociate(associationId);
@@ -716,9 +756,11 @@
      */
     @UserHandleAware
     public void requestNotificationAccess(ComponentName component) {
-        if (!checkFeaturePresent()) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
             return;
         }
+
         try {
             PendingIntent pendingIntent = mService.requestNotificationAccess(
                     component, mContext.getUserId());
@@ -755,9 +797,11 @@
      */
     @Deprecated
     public boolean hasNotificationAccess(ComponentName component) {
-        if (!checkFeaturePresent()) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
             return false;
         }
+
         try {
             return mService.hasNotificationAccess(component);
         } catch (RemoteException e) {
@@ -793,7 +837,11 @@
             @NonNull String packageName,
             @NonNull MacAddress macAddress,
             @NonNull UserHandle user) {
-        if (!checkFeaturePresent()) return false;
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return false;
+        }
+
         Objects.requireNonNull(packageName, "package name cannot be null");
         Objects.requireNonNull(macAddress, "mac address cannot be null");
         Objects.requireNonNull(user, "user cannot be null");
@@ -816,7 +864,8 @@
     @SystemApi
     @UserHandleAware
     @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES)
-    public @NonNull List<AssociationInfo> getAllAssociations() {
+    @NonNull
+    public List<AssociationInfo> getAllAssociations() {
         return getAllAssociations(mContext.getUserId());
     }
 
@@ -826,8 +875,13 @@
      * @hide
      */
     @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES)
-    public @NonNull List<AssociationInfo> getAllAssociations(@UserIdInt int userId) {
-        if (!checkFeaturePresent()) return Collections.emptyList();
+    @NonNull
+    public List<AssociationInfo> getAllAssociations(@UserIdInt int userId) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return Collections.emptyList();
+        }
+
         try {
             return mService.getAllAssociationsForUser(userId);
         } catch (RemoteException e) {
@@ -875,7 +929,11 @@
     public void addOnAssociationsChangedListener(
             @NonNull Executor executor, @NonNull OnAssociationsChangedListener listener,
             @UserIdInt int userId) {
-        if (!checkFeaturePresent()) return;
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         synchronized (mListeners) {
             final OnAssociationsChangedListenerProxy proxy = new OnAssociationsChangedListenerProxy(
                     executor, listener);
@@ -899,7 +957,11 @@
     @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES)
     public void removeOnAssociationsChangedListener(
             @NonNull OnAssociationsChangedListener listener) {
-        if (!checkFeaturePresent()) return;
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         synchronized (mListeners) {
             final Iterator<OnAssociationsChangedListenerProxy> iterator = mListeners.iterator();
             while (iterator.hasNext()) {
@@ -931,6 +993,11 @@
     public void addOnTransportsChangedListener(
             @NonNull @CallbackExecutor Executor executor,
             @NonNull Consumer<List<AssociationInfo>> listener) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         final OnTransportsChangedListenerProxy proxy = new OnTransportsChangedListenerProxy(
                 executor, listener);
         try {
@@ -950,6 +1017,11 @@
     @RequiresPermission(android.Manifest.permission.USE_COMPANION_TRANSPORTS)
     public void removeOnTransportsChangedListener(
             @NonNull Consumer<List<AssociationInfo>> listener) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         final OnTransportsChangedListenerProxy proxy = new OnTransportsChangedListenerProxy(
                 null, listener);
         try {
@@ -969,6 +1041,11 @@
      */
     @RequiresPermission(android.Manifest.permission.USE_COMPANION_TRANSPORTS)
     public void sendMessage(int messageType, @NonNull byte[] data, @NonNull int[] associationIds) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         try {
             mService.sendMessage(messageType, data, associationIds);
         } catch (RemoteException e) {
@@ -989,6 +1066,11 @@
     public void addOnMessageReceivedListener(
             @NonNull @CallbackExecutor Executor executor, int messageType,
             @NonNull BiConsumer<Integer, byte[]> listener) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         final OnMessageReceivedListenerProxy proxy = new OnMessageReceivedListenerProxy(
                 executor, listener);
         try {
@@ -1006,6 +1088,11 @@
     @RequiresPermission(android.Manifest.permission.USE_COMPANION_TRANSPORTS)
     public void removeOnMessageReceivedListener(int messageType,
             @NonNull BiConsumer<Integer, byte[]> listener) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         final OnMessageReceivedListenerProxy proxy = new OnMessageReceivedListenerProxy(
                 null, listener);
         try {
@@ -1031,9 +1118,11 @@
     @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES)
     public boolean canPairWithoutPrompt(@NonNull String packageName,
             @NonNull String deviceMacAddress, @NonNull UserHandle user) {
-        if (!checkFeaturePresent()) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
             return false;
         }
+
         Objects.requireNonNull(packageName, "package name cannot be null");
         Objects.requireNonNull(deviceMacAddress, "device mac address cannot be null");
         Objects.requireNonNull(user, "user handle cannot be null");
@@ -1081,9 +1170,11 @@
     @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE)
     public void startObservingDevicePresence(@NonNull String deviceAddress)
             throws DeviceNotAssociatedException {
-        if (!checkFeaturePresent()) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
             return;
         }
+
         Objects.requireNonNull(deviceAddress, "address cannot be null");
         try {
             mService.legacyStartObservingDevicePresence(deviceAddress,
@@ -1123,9 +1214,11 @@
     @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE)
     public void stopObservingDevicePresence(@NonNull String deviceAddress)
             throws DeviceNotAssociatedException {
-        if (!checkFeaturePresent()) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
             return;
         }
+
         Objects.requireNonNull(deviceAddress, "address cannot be null");
         try {
             mService.legacyStopObservingDevicePresence(deviceAddress,
@@ -1171,6 +1264,11 @@
     @FlaggedApi(Flags.FLAG_DEVICE_PRESENCE)
     @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE)
     public void startObservingDevicePresence(@NonNull ObservingDevicePresenceRequest request) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         Objects.requireNonNull(request, "request cannot be null");
 
         try {
@@ -1192,6 +1290,11 @@
     @FlaggedApi(Flags.FLAG_DEVICE_PRESENCE)
     @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE)
     public void stopObservingDevicePresence(@NonNull ObservingDevicePresenceRequest request) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         Objects.requireNonNull(request, "request cannot be null");
 
         try {
@@ -1222,7 +1325,7 @@
     @RequiresPermission(android.Manifest.permission.DELIVER_COMPANION_MESSAGES)
     public void dispatchMessage(int messageId, int associationId, @NonNull byte[] message)
             throws DeviceNotAssociatedException {
-        Log.w(LOG_TAG, "dispatchMessage replaced by attachSystemDataTransport");
+        Log.w(TAG, "dispatchMessage replaced by attachSystemDataTransport");
     }
 
     /**
@@ -1244,6 +1347,11 @@
     @RequiresPermission(android.Manifest.permission.DELIVER_COMPANION_MESSAGES)
     public void attachSystemDataTransport(int associationId, @NonNull InputStream in,
             @NonNull OutputStream out) throws DeviceNotAssociatedException {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         synchronized (mTransports) {
             if (mTransports.contains(associationId)) {
                 detachSystemDataTransport(associationId);
@@ -1272,6 +1380,11 @@
     @RequiresPermission(android.Manifest.permission.DELIVER_COMPANION_MESSAGES)
     public void detachSystemDataTransport(int associationId)
             throws DeviceNotAssociatedException {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         synchronized (mTransports) {
             final Transport transport = mTransports.get(associationId);
             if (transport != null) {
@@ -1296,9 +1409,11 @@
             @NonNull String packageName,
             @NonNull MacAddress macAddress,
             @NonNull byte[] certificate) {
-        if (!checkFeaturePresent()) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
             return;
         }
+
         Objects.requireNonNull(packageName, "package name cannot be null");
         Objects.requireNonNull(macAddress, "mac address cannot be null");
 
@@ -1327,6 +1442,11 @@
     @SystemApi
     @RequiresPermission(android.Manifest.permission.REQUEST_COMPANION_SELF_MANAGED)
     public void notifyDeviceAppeared(int associationId) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         try {
             mService.notifySelfManagedDeviceAppeared(associationId);
         } catch (RemoteException e) {
@@ -1349,6 +1469,11 @@
     @SystemApi
     @RequiresPermission(android.Manifest.permission.REQUEST_COMPANION_SELF_MANAGED)
     public void notifyDeviceDisappeared(int associationId) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         try {
             mService.notifySelfManagedDeviceDisappeared(associationId);
         } catch (RemoteException e) {
@@ -1384,6 +1509,11 @@
     @Nullable
     public IntentSender buildPermissionTransferUserConsentIntent(int associationId)
             throws DeviceNotAssociatedException {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return null;
+        }
+
         try {
             PendingIntent pendingIntent = mService.buildPermissionTransferUserConsentIntent(
                     mContext.getOpPackageName(),
@@ -1420,6 +1550,11 @@
     @UserHandleAware
     @FlaggedApi(Flags.FLAG_PERM_SYNC_USER_CONSENT)
     public boolean isPermissionTransferUserConsented(int associationId) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return false;
+        }
+
         try {
             return mService.isPermissionTransferUserConsented(mContext.getOpPackageName(),
                     mContext.getUserId(), associationId);
@@ -1446,6 +1581,11 @@
     @Deprecated
     @UserHandleAware
     public void startSystemDataTransfer(int associationId) throws DeviceNotAssociatedException {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         try {
             mService.startSystemDataTransfer(mContext.getOpPackageName(), mContext.getUserId(),
                     associationId, null);
@@ -1478,6 +1618,11 @@
             @NonNull Executor executor,
             @NonNull OutcomeReceiver<Void, CompanionException> result)
             throws DeviceNotAssociatedException {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         try {
             mService.startSystemDataTransfer(mContext.getOpPackageName(), mContext.getUserId(),
                     associationId, new SystemDataTransferCallbackProxy(executor, result));
@@ -1495,6 +1640,11 @@
      */
     @UserHandleAware
     public boolean isCompanionApplicationBound() {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return false;
+        }
+
         try {
             return mService.isCompanionApplicationBound(
                     mContext.getOpPackageName(), mContext.getUserId());
@@ -1513,6 +1663,11 @@
     @TestApi
     @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES)
     public void enableSecureTransport(boolean enabled) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         try {
             mService.enableSecureTransport(enabled);
         } catch (RemoteException e) {
@@ -1534,6 +1689,11 @@
     @FlaggedApi(Flags.FLAG_ASSOCIATION_TAG)
     @UserHandleAware
     public void setAssociationTag(int associationId, @NonNull String tag) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         Objects.requireNonNull(tag, "tag cannot be null");
 
         if (tag.length() > ASSOCIATION_TAG_LENGTH_LIMIT) {
@@ -1560,6 +1720,11 @@
     @FlaggedApi(Flags.FLAG_ASSOCIATION_TAG)
     @UserHandleAware
     public void clearAssociationTag(int associationId) {
+        if (mService == null) {
+            Log.w(TAG, "CompanionDeviceManager service is not available.");
+            return;
+        }
+
         try {
             mService.clearAssociationTag(associationId);
         } catch (RemoteException e) {
@@ -1567,15 +1732,6 @@
         }
     }
 
-    private boolean checkFeaturePresent() {
-        boolean featurePresent = mService != null;
-        if (!featurePresent && DEBUG) {
-            Log.d(LOG_TAG, "Feature " + PackageManager.FEATURE_COMPANION_DEVICE_SETUP
-                    + " not available");
-        }
-        return featurePresent;
-    }
-
     private static class AssociationRequestCallbackProxy extends IAssociationRequestCallback.Stub {
         private final Handler mHandler;
         private final Callback mCallback;
@@ -1613,7 +1769,7 @@
         private <T> void execute(Consumer<T> callback, T arg) {
             if (mExecutor != null) {
                 mExecutor.execute(() -> callback.accept(arg));
-            } else {
+            } else if (mHandler != null) {
                 mHandler.post(() -> callback.accept(arg));
             }
         }
@@ -1716,6 +1872,11 @@
         }
 
         public void start() throws IOException {
+            if (mService == null) {
+                Log.w(TAG, "CompanionDeviceManager service is not available.");
+                return;
+            }
+
             final ParcelFileDescriptor[] pair = ParcelFileDescriptor.createSocketPair();
             final ParcelFileDescriptor localFd = pair[0];
             final ParcelFileDescriptor remoteFd = pair[1];
@@ -1734,7 +1895,7 @@
                     copyWithFlushing(mLocalIn, mRemoteOut);
                 } catch (IOException e) {
                     if (!mStopped) {
-                        Log.w(LOG_TAG, "Trouble during outgoing transport", e);
+                        Log.w(TAG, "Trouble during outgoing transport", e);
                         stop();
                     }
                 }
@@ -1744,7 +1905,7 @@
                     copyWithFlushing(mRemoteIn, mLocalOut);
                 } catch (IOException e) {
                     if (!mStopped) {
-                        Log.w(LOG_TAG, "Trouble during incoming transport", e);
+                        Log.w(TAG, "Trouble during incoming transport", e);
                         stop();
                     }
                 }
@@ -1752,13 +1913,18 @@
         }
 
         public void stop() {
+            if (mService == null) {
+                Log.w(TAG, "CompanionDeviceManager service is not available.");
+                return;
+            }
+
             mStopped = true;
 
             try {
                 mService.detachSystemDataTransport(mContext.getPackageName(),
                         mContext.getUserId(), mAssociationId);
             } catch (RemoteException e) {
-                Log.w(LOG_TAG, "Failed to detach transport", e);
+                Log.w(TAG, "Failed to detach transport", e);
             }
 
             IoUtils.closeQuietly(mRemoteIn);
diff --git a/core/java/android/companion/ObservingDevicePresenceRequest.java b/core/java/android/companion/ObservingDevicePresenceRequest.java
index f1d594e..11ea735 100644
--- a/core/java/android/companion/ObservingDevicePresenceRequest.java
+++ b/core/java/android/companion/ObservingDevicePresenceRequest.java
@@ -183,7 +183,11 @@
          * @param uuid The ParcelUuid for observing device presence.
          */
         @NonNull
-        @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_DEVICE_UUID_PRESENCE)
+        @RequiresPermission(allOf = {
+                android.Manifest.permission.REQUEST_OBSERVE_DEVICE_UUID_PRESENCE,
+                android.Manifest.permission.BLUETOOTH_CONNECT,
+                android.Manifest.permission.BLUETOOTH_SCAN
+        })
         public Builder setUuid(@NonNull ParcelUuid uuid) {
             checkNotUsed();
             this.mUuid = uuid;
diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java
index ec59cf6..ed55a3f 100644
--- a/core/java/android/companion/virtual/VirtualDeviceManager.java
+++ b/core/java/android/companion/virtual/VirtualDeviceManager.java
@@ -66,6 +66,7 @@
 import android.os.RemoteException;
 import android.util.ArraySet;
 import android.util.Log;
+import android.view.Display;
 import android.view.Surface;
 import android.view.WindowManager;
 
@@ -338,6 +339,10 @@
     @TestApi
     public @VirtualDeviceParams.DevicePolicy int getDevicePolicy(
             int deviceId, @VirtualDeviceParams.PolicyType int policyType) {
+        if (deviceId == Context.DEVICE_ID_DEFAULT) {
+            // Avoid unnecessary binder call, for default device, policy will be always default.
+            return VirtualDeviceParams.DEVICE_POLICY_DEFAULT;
+        }
         if (mService == null) {
             Log.w(TAG, "Failed to retrieve device policy; no virtual device manager service.");
             return VirtualDeviceParams.DEVICE_POLICY_DEFAULT;
@@ -357,6 +362,10 @@
     @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
     @TestApi
     public int getDeviceIdForDisplayId(int displayId) {
+        if (displayId == Display.DEFAULT_DISPLAY || displayId == Display.INVALID_DISPLAY) {
+            // Avoid unnecessary binder call for default / invalid display id.
+            return Context.DEVICE_ID_DEFAULT;
+        }
         if (mService == null) {
             Log.w(TAG, "Failed to retrieve virtual devices; no virtual device manager service.");
             return Context.DEVICE_ID_DEFAULT;
diff --git a/core/java/android/companion/virtual/flags.aconfig b/core/java/android/companion/virtual/flags.aconfig
index a6a4f5e..e6649df 100644
--- a/core/java/android/companion/virtual/flags.aconfig
+++ b/core/java/android/companion/virtual/flags.aconfig
@@ -116,3 +116,14 @@
   description: "Enable virtual stylus input"
   bug: "304829446"
 }
+
+flag {
+  name: "intercept_intents_before_applying_policy"
+  is_exported: true
+  namespace: "virtual_devices"
+  description: "Apply intent interception before applying activity policy"
+  bug: "333444131"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
\ No newline at end of file
diff --git a/core/java/android/content/ComponentCallbacks.java b/core/java/android/content/ComponentCallbacks.java
index 428545d..fb9536f 100644
--- a/core/java/android/content/ComponentCallbacks.java
+++ b/core/java/android/content/ComponentCallbacks.java
@@ -55,15 +55,11 @@
      * That is, before reaching the point of killing processes hosting
      * service and foreground UI that we would like to avoid killing.
      *
-     * <p>You should implement this method to release
-     * any caches or other unnecessary resources you may be holding on to.
-     * The system will perform a garbage collection for you after returning from this method.
-     * <p>Preferably, you should implement {@link ComponentCallbacks2#onTrimMemory} from
-     * {@link ComponentCallbacks2} to incrementally unload your resources based on various
-     * levels of memory demands.  That API is available for API level 14 and higher, so you should
-     * only use this {@link #onLowMemory} method as a fallback for older versions, which can be
-     * treated the same as {@link ComponentCallbacks2#onTrimMemory} with the {@link
-     * ComponentCallbacks2#TRIM_MEMORY_COMPLETE} level.</p>
+     * @deprecated Since API level 14 this is superseded by
+     *             {@link ComponentCallbacks2#onTrimMemory}.
+     *             Since API level 34 this is never called.
+     *             Apps targeting API level 34 and above may provide an empty implementation.
      */
+    @Deprecated
     void onLowMemory();
 }
diff --git a/core/java/android/content/ComponentCallbacks2.java b/core/java/android/content/ComponentCallbacks2.java
index 6576c0f..a165b18 100644
--- a/core/java/android/content/ComponentCallbacks2.java
+++ b/core/java/android/content/ComponentCallbacks2.java
@@ -105,14 +105,20 @@
      * Level for {@link #onTrimMemory(int)}: the process is nearing the end
      * of the background LRU list, and if more memory isn't found soon it will
      * be killed.
+     *
+     * @deprecated Apps are not notified of this level since API level 34
      */
+    @Deprecated
     static final int TRIM_MEMORY_COMPLETE = 80;
     
     /**
      * Level for {@link #onTrimMemory(int)}: the process is around the middle
      * of the background LRU list; freeing memory can help the system keep
      * other processes running later in the list for better overall performance.
+     *
+     * @deprecated Apps are not notified of this level since API level 34
      */
+    @Deprecated
     static final int TRIM_MEMORY_MODERATE = 60;
     
     /**
@@ -139,7 +145,10 @@
      * will happen after this is {@link #onLowMemory()} called to report that
      * nothing at all can be kept in the background, a situation that can start
      * to notably impact the user.
+     *
+     * @deprecated Apps are not notified of this level since API level 34
      */
+    @Deprecated
     static final int TRIM_MEMORY_RUNNING_CRITICAL = 15;
 
     /**
@@ -147,7 +156,10 @@
      * background process, but the device is running low on memory.
      * Your running process should free up unneeded resources to allow that
      * memory to be used elsewhere.
+     *
+     * @deprecated Apps are not notified of this level since API level 34
      */
+    @Deprecated
     static final int TRIM_MEMORY_RUNNING_LOW = 10;
 
     /**
@@ -155,17 +167,19 @@
      * background process, but the device is running moderately low on memory.
      * Your running process may want to release some unneeded resources for
      * use elsewhere.
+     *
+     * @deprecated Apps are not notified of this level since API level 34
      */
+    @Deprecated
     static final int TRIM_MEMORY_RUNNING_MODERATE = 5;
 
     /**
      * Called when the operating system has determined that it is a good
-     * time for a process to trim unneeded memory from its process.  This will
-     * happen for example when it goes in the background and there is not enough
-     * memory to keep as many background processes running as desired.  You
-     * should never compare to exact values of the level, since new intermediate
-     * values may be added -- you will typically want to compare if the value
-     * is greater or equal to a level you are interested in.
+     * time for a process to trim unneeded memory from its process.
+     *
+     * You should never compare to exact values of the level, since new
+     * intermediate values may be added -- you will typically want to compare if
+     * the value is greater or equal to a level you are interested in.
      *
      * <p>To retrieve the processes current trim level at any point, you can
      * use {@link android.app.ActivityManager#getMyMemoryState
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index c0c91cb..bad73fc 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3256,6 +3256,14 @@
      *
      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
      *
+     * <p>As of {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE}, the system can <a
+     * href="{@docRoot}develop/background-work/background-tasks/broadcasts#android-14">place
+     * context-registered broadcasts in a queue while the app is in the <a
+     * href="{@docRoot}guide/components/activities/process-lifecycle">cached state</a>.
+     * When the app leaves the cached state, such as returning to the
+     * foreground, the system delivers any queued broadcasts. Multiple instances
+     * of certain broadcasts might be merged into one broadcast.
+     *
      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
      * registered with this method will correctly respect the
      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
@@ -3301,6 +3309,14 @@
      *
      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
      *
+     * <p>As of {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE}, the system can <a
+     * href="{@docRoot}develop/background-work/background-tasks/broadcasts#android-14">place
+     * context-registered broadcasts in a queue while the app is in the <a
+     * href="{@docRoot}guide/components/activities/process-lifecycle">cached state</a>.
+     * When the app leaves the cached state, such as returning to the
+     * foreground, the system delivers any queued broadcasts. Multiple instances
+     * of certain broadcasts might be merged into one broadcast.
+     *
      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
      * registered with this method will correctly respect the
      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
@@ -3342,6 +3358,14 @@
      *
      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
      *
+     * <p>As of {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE}, the system can <a
+     * href="{@docRoot}develop/background-work/background-tasks/broadcasts#android-14">place
+     * context-registered broadcasts in a queue while the app is in the <a
+     * href="{@docRoot}guide/components/activities/process-lifecycle">cached state</a>.
+     * When the app leaves the cached state, such as returning to the
+     * foreground, the system delivers any queued broadcasts. Multiple instances
+     * of certain broadcasts might be merged into one broadcast.
+     *
      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
      * registered with this method will correctly respect the
      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
@@ -3385,6 +3409,14 @@
      *
      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
      *
+     * <p>As of {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE}, the system can <a
+     * href="{@docRoot}develop/background-work/background-tasks/broadcasts#android-14">place
+     * context-registered broadcasts in a queue while the app is in the <a
+     * href="{@docRoot}guide/components/activities/process-lifecycle">cached state</a>.
+     * When the app leaves the cached state, such as returning to the
+     * foreground, the system delivers any queued broadcasts. Multiple instances
+     * of certain broadcasts might be merged into one broadcast.
+     *
      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
      * registered with this method will correctly respect the
      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
@@ -5914,15 +5946,6 @@
     public static final String JOB_SCHEDULER_SERVICE = "jobscheduler";
 
     /**
-     * Use with {@link #getSystemService(String)} to retrieve a
-     * {@link android.app.tare.EconomyManager} instance for understanding economic standing.
-     * @see #getSystemService(String)
-     * @hide
-     * @see android.app.tare.EconomyManager
-     */
-    public static final String RESOURCE_ECONOMY_SERVICE = "tare";
-
-    /**
      * Use with {@link #getSystemService(String)} to retrieve a {@link
      * android.service.persistentdata.PersistentDataBlockManager} instance
      * for interacting with a storage device that lives across factory resets.
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 8bc5e8c..9e316a2 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -3771,6 +3771,10 @@
      *   <li><em>{@link android.content.Intent#EXTRA_PHONE_NUMBER}</em> -
      *       the phone number originally intended to be dialed.</li>
      * </ul>
+     * <p class="note">Starting in Android 15, this broadcast is no longer sent as an ordered
+     * broadcast.  The <code>resultData</code> no longer has any effect and will not determine the
+     * actual routing of the call.  Further, receivers of this broadcast do not get foreground
+     * priority and cannot launch background activities.</p>
      * <p>Once the broadcast is finished, the resultData is used as the actual
      * number to call.  If  <code>null</code>, no call will be placed.</p>
      * <p>It is perfectly acceptable for multiple receivers to process the
@@ -3811,8 +3815,8 @@
      * {@link android.telecom.CallRedirectionService} API.  Apps that perform call screening
      * should use the {@link android.telecom.CallScreeningService} API.  Apps which need to be
      * notified of basic call state should use
-     * {@link android.telephony.PhoneStateListener#onCallStateChanged(int, String)} to determine
-     * when a new outgoing call is placed.
+     * {@link android.telephony.TelephonyCallback.CallStateListener} to determine when a new
+     * outgoing call is placed.
      */
     @Deprecated
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index bd04634..535cebb 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -1280,6 +1280,26 @@
             264301586L; // buganizer id
 
     /**
+     * Excludes the packages the override is applied to from the camera compatibility treatment
+     * in free-form windowing mode for fixed-orientation apps.
+     *
+     * <p>In free-form windowing mode, the compatibility treatment emulates running on a portrait
+     * device by letterboxing the app window and changing the camera characteristics to what apps
+     * commonly expect in a portrait device: 90 and 270 degree sensor rotation for back and front
+     * cameras, respectively, and setting display rotation to 0.
+     *
+     * <p>Use this flag to disable the compatibility treatment for apps that do not respond well to
+     * the treatment.
+     *
+     * @hide
+     */
+    @ChangeId
+    @Overridable
+    @Disabled
+    public static final long OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT =
+            314961188L;
+
+    /**
      * This change id forces the packages it is applied to sandbox {@link android.view.View} API to
      * an activity bounds for:
      *
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index bff90f1..5d4babb8 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -847,5 +847,5 @@
     @EnforcePermission("GET_APP_METADATA")
     int getAppMetadataSource(String packageName, int userId);
 
-    ComponentName getDomainVerificationAgent();
+    ComponentName getDomainVerificationAgent(int userId);
 }
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index b5809cf..f5bff9d 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -267,6 +267,15 @@
             "android.app.PROPERTY_LEGACY_UPDATE_OWNERSHIP_DENYLIST";
 
     /**
+     * Application level {@link android.content.pm.PackageManager.Property PackageManager
+     * .Property} for a app to inform the installer that a file containing the app's android
+     * safety label data is bundled into the APK at the given path.
+     * @hide
+     */
+    public static final String PROPERTY_ANDROID_SAFETY_LABEL_PATH =
+            "android.content.SAFETY_LABEL_PATH";
+
+    /**
      * A property value set within the manifest.
      * <p>
      * The value of a property will only have a single type, as defined by
@@ -3263,6 +3272,16 @@
 
     /**
      * Feature for {@link #getSystemAvailableFeatures} and
+     * {@link #hasSystemFeature}: This device is capable of launching apps in automotive display
+     * compatibility mode.
+     * @hide
+     */
+    @SdkConstant(SdkConstantType.FEATURE)
+    public static final String FEATURE_CAR_DISPLAY_COMPATIBILITY =
+            "android.software.car.display_compatibility";
+
+    /**
+     * Feature for {@link #getSystemAvailableFeatures} and
      * {@link #hasSystemFeature(String, int)}: If this feature is supported, the device supports
      * {@link android.security.identity.IdentityCredentialStore} implemented in secure hardware
      * at the given feature version.
@@ -4825,6 +4844,16 @@
     public static final String FEATURE_ROTARY_ENCODER_LOW_RES =
             "android.hardware.rotaryencoder.lowres";
 
+  /**
+   * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device has
+   * support for contextual search helper.
+   *
+   * @hide
+   */
+  @SdkConstant(SdkConstantType.FEATURE)
+  public static final String FEATURE_CONTEXTUAL_SEARCH_HELPER =
+      "android.software.contextualsearch";
+
     /** @hide */
     public static final boolean APP_ENUMERATION_ENABLED_BY_DEFAULT = true;
 
diff --git a/core/java/android/content/pm/UserProperties.java b/core/java/android/content/pm/UserProperties.java
index 9159929..1d4403c 100644
--- a/core/java/android/content/pm/UserProperties.java
+++ b/core/java/android/content/pm/UserProperties.java
@@ -887,7 +887,7 @@
      * <p> Setting this property to true will enable the user's CE storage to remain unlocked when
      * the user is stopped using
      * {@link com.android.server.am.ActivityManagerService#stopUserWithDelayedLocking(int,
-     * boolean, IStopUserCallback)}.
+     * IStopUserCallback)}.
      *
      * <p> When this property is false, delayed locking may still be applicable at a global
      * level for all users via the {@code config_multiuserDelayUserDataLocking}. That is, delayed
diff --git a/core/java/android/content/res/FontScaleConverterFactory.java b/core/java/android/content/res/FontScaleConverterFactory.java
index 625d7cb..c7237ea 100644
--- a/core/java/android/content/res/FontScaleConverterFactory.java
+++ b/core/java/android/content/res/FontScaleConverterFactory.java
@@ -58,6 +58,16 @@
         synchronized (LOOKUP_TABLES_WRITE_LOCK) {
             putInto(
                     sLookupTables,
+                    /* scaleKey= */ 1.05f,
+                    new FontScaleConverterImpl(
+                            /* fromSp= */
+                            new float[] {   8f,   10f,   12f,   14f,   18f,   20f,   24f,   30f,  100},
+                            /* toDp=   */
+                            new float[] { 8.4f, 10.5f, 12.6f, 14.8f, 18.6f, 20.6f, 24.4f,   30f,  100})
+            );
+
+            putInto(
+                    sLookupTables,
                     /* scaleKey= */ 1.1f,
                     new FontScaleConverterImpl(
                             /* fromSp= */
@@ -78,6 +88,16 @@
 
             putInto(
                     sLookupTables,
+                    /* scaleKey= */ 1.2f,
+                    new FontScaleConverterImpl(
+                            /* fromSp= */
+                            new float[] {   8f,   10f,   12f,   14f,   18f,   20f,   24f,   30f,  100},
+                            /* toDp=   */
+                            new float[] { 9.6f,   12f, 14.4f, 17.2f, 20.4f, 22.4f, 25.6f,   30f,  100})
+            );
+
+            putInto(
+                    sLookupTables,
                     /* scaleKey= */ 1.3f,
                     new FontScaleConverterImpl(
                             /* fromSp= */
@@ -117,7 +137,7 @@
             );
         }
 
-        sMinScaleBeforeCurvesApplied = getScaleFromKey(sLookupTables.keyAt(0)) - 0.02f;
+        sMinScaleBeforeCurvesApplied = getScaleFromKey(sLookupTables.keyAt(0)) - 0.01f;
         if (sMinScaleBeforeCurvesApplied <= 1.0f) {
             throw new IllegalStateException(
                     "You should only apply non-linear scaling to font scales > 1"
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 1f5f88f..a720b64 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -339,14 +339,17 @@
     public Resources(@Nullable ClassLoader classLoader) {
         mClassLoader = classLoader == null ? ClassLoader.getSystemClassLoader() : classLoader;
         sResourcesHistory.add(this);
+        ResourcesManager.getInstance().registerAllResourcesReference(this);
     }
 
     /**
-     * Only for creating the System resources.
+     * Only for creating the System resources. This is the only constructor that doesn't add
+     * Resources itself to the ResourcesManager list of all Resources references.
      */
     @UnsupportedAppUsage
     private Resources() {
-        this(null);
+        mClassLoader = ClassLoader.getSystemClassLoader();
+        sResourcesHistory.add(this);
 
         final DisplayMetrics metrics = new DisplayMetrics();
         metrics.setToDefaults();
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index 8d045aa..31cacb7 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -146,6 +146,11 @@
 
     // Cyclical cache used for recently-accessed XML files.
     private int mLastCachedXmlBlockIndex = -1;
+
+    // The number of shared libraries registered within this ResourcesImpl, which is designed to
+    // help to determine whether this ResourcesImpl is outdated on shared library information and
+    // needs to be replaced.
+    private int mSharedLibCount;
     private final int[] mCachedXmlBlockCookies = new int[XML_BLOCK_CACHE_SIZE];
     private final String[] mCachedXmlBlockFiles = new String[XML_BLOCK_CACHE_SIZE];
     private final XmlBlock[] mCachedXmlBlocks = new XmlBlock[XML_BLOCK_CACHE_SIZE];
@@ -206,6 +211,7 @@
             for (int i = 0; i < size; i++) {
                 assets.addSharedLibraryPaths(sharedLibMap.valueAt(i).getAllAssetPaths());
             }
+            mSharedLibCount = sharedLibMap.size();
         }
         mMetrics.setToDefaults();
         mDisplayAdjustments = displayAdjustments;
@@ -222,6 +228,11 @@
         return mAssets;
     }
 
+    @UnsupportedAppUsage
+    public DisplayMetrics getMetrics() {
+        return mMetrics;
+    }
+
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     DisplayMetrics getDisplayMetrics() {
         if (DEBUG_CONFIG) Slog.v(TAG, "Returning DisplayMetrics: " + mMetrics.widthPixels
@@ -229,7 +240,8 @@
         return mMetrics;
     }
 
-    Configuration getConfiguration() {
+    @UnsupportedAppUsage
+    public Configuration getConfiguration() {
         return mConfiguration;
     }
 
@@ -1602,4 +1614,8 @@
             mSize--;
         }
     }
+
+    public int getSharedLibCount() {
+        return mSharedLibCount;
+    }
 }
diff --git a/core/java/android/credentials/CredentialManager.java b/core/java/android/credentials/CredentialManager.java
index 3a9a0f91..eb7afb8e 100644
--- a/core/java/android/credentials/CredentialManager.java
+++ b/core/java/android/credentials/CredentialManager.java
@@ -61,7 +61,9 @@
 @SystemService(Context.CREDENTIAL_SERVICE)
 @RequiresFeature(PackageManager.FEATURE_CREDENTIALS)
 public final class CredentialManager {
-    private static final String TAG = "CredentialManager";
+    /** @hide **/
+    @Hide
+    public static final String TAG = "CredentialManager";
     private static final Bundle OPTIONS_SENDER_BAL_OPTIN = ActivityOptions.makeBasic()
             .setPendingIntentBackgroundActivityStartMode(
                     ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED).toBundle();
@@ -74,6 +76,11 @@
                 PROVIDER_FILTER_ALL_PROVIDERS,
                 PROVIDER_FILTER_SYSTEM_PROVIDERS_ONLY,
                 PROVIDER_FILTER_USER_PROVIDERS_ONLY,
+                // By default the returned list of providers will not include any providers that
+                // have been hidden by device policy. However, there are some cases where we want
+                // them to show up (e.g. settings) so this will return the list of providers with
+                // the hidden ones included.
+                PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN,
             })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ProviderFilter {}
@@ -99,6 +106,14 @@
      */
     @TestApi public static final int PROVIDER_FILTER_USER_PROVIDERS_ONLY = 2;
 
+    /**
+     * Returns user credential providers only. This will include providers that
+     * have been disabled by the device policy.
+     *
+     * @hide
+     */
+    public static final int PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN = 3;
+
     private final Context mContext;
     private final ICredentialManager mService;
 
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index 1c36a88..a9f70c9 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -16,14 +16,21 @@
 
 package android.hardware;
 
+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.system.OsConstants.EACCES;
 import static android.system.OsConstants.ENODEV;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SdkConstant;
 import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.SuppressLint;
+import android.annotation.TestApi;
 import android.app.ActivityThread;
 import android.app.AppOpsManager;
+import android.companion.virtual.VirtualDeviceManager;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
 import android.graphics.ImageFormat;
@@ -56,6 +63,7 @@
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * The Camera class is used to set image capture settings, start/stop preview,
@@ -271,7 +279,24 @@
      * @return total number of accessible camera devices, or 0 if there are no
      *   cameras or an error was encountered enumerating them.
      */
-    public native static int getNumberOfCameras();
+    public static int getNumberOfCameras() {
+        return getNumberOfCameras(ActivityThread.currentApplication().getApplicationContext());
+    }
+
+    /**
+     * Returns the number of physical cameras available on this device for the given context.
+     * The return value of this method might change dynamically if the device supports external
+     * cameras and an external camera is connected or disconnected.
+     *
+     * @hide
+     */
+    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
+    @TestApi
+    public static int getNumberOfCameras(@NonNull Context context) {
+        return _getNumberOfCameras(context.getDeviceId(), getDevicePolicyFromContext(context));
+    }
+
+    private static native int _getNumberOfCameras(int deviceId, int devicePolicy);
 
     /**
      * Returns the information about a particular camera.
@@ -282,10 +307,22 @@
      *    low-level failure).
      */
     public static void getCameraInfo(int cameraId, CameraInfo cameraInfo) {
-        boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(
-                ActivityThread.currentApplication().getApplicationContext());
+        Context context = ActivityThread.currentApplication().getApplicationContext();
+        boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(context);
+        getCameraInfo(cameraId, context, overrideToPortrait, cameraInfo);
+    }
 
-        _getCameraInfo(cameraId, overrideToPortrait, cameraInfo);
+    /**
+     * Returns the information about a particular camera for the given context.
+     *
+     * @hide
+     */
+    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
+    @TestApi
+    public static void getCameraInfo(int cameraId, @NonNull Context context,
+            boolean overrideToPortrait, CameraInfo cameraInfo) {
+        _getCameraInfo(cameraId, overrideToPortrait, context.getDeviceId(),
+                getDevicePolicyFromContext(context), cameraInfo);
         IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
         IAudioService audioService = IAudioService.Stub.asInterface(b);
         try {
@@ -298,8 +335,20 @@
             Log.e(TAG, "Audio service is unavailable for queries");
         }
     }
+
     private native static void _getCameraInfo(int cameraId, boolean overrideToPortrait,
-            CameraInfo cameraInfo);
+            int deviceId, int devicePolicy, CameraInfo cameraInfo);
+
+    private static int getDevicePolicyFromContext(Context context) {
+        if (context.getDeviceId() == DEVICE_ID_DEFAULT
+                || !android.companion.virtual.flags.Flags.virtualCamera()) {
+            return DEVICE_POLICY_DEFAULT;
+        }
+
+        VirtualDeviceManager virtualDeviceManager =
+                context.getSystemService(VirtualDeviceManager.class);
+        return virtualDeviceManager.getDevicePolicy(context.getDeviceId(), POLICY_TYPE_CAMERA);
+    }
 
     /**
      * Information about a camera
@@ -359,7 +408,7 @@
          * when {@link Camera#takePicture takePicture} is called.</p>
          */
         public boolean canDisableShutterSound;
-    };
+    }
 
     /**
      * Creates a new Camera object to access a particular hardware camera. If
@@ -391,7 +440,20 @@
      * @see android.app.admin.DevicePolicyManager#getCameraDisabled(android.content.ComponentName)
      */
     public static Camera open(int cameraId) {
-        return new Camera(cameraId);
+        Context context = ActivityThread.currentApplication().getApplicationContext();
+        boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(context);
+        return open(cameraId, context, overrideToPortrait);
+    }
+
+    /**
+     * Creates a new Camera object for a given camera id for the given context.
+     *
+     * @hide
+     */
+    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
+    @TestApi
+    public static Camera open(int cameraId, @NonNull Context context, boolean overrideToPortrait) {
+        return new Camera(cameraId, context, overrideToPortrait);
     }
 
     /**
@@ -409,7 +471,7 @@
         for (int i = 0; i < numberOfCameras; i++) {
             getCameraInfo(i, cameraInfo);
             if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
-                return new Camera(i);
+                return open(i);
             }
         }
         return null;
@@ -459,10 +521,10 @@
             throw new IllegalArgumentException("Unsupported HAL version " + halVersion);
         }
 
-        return new Camera(cameraId);
+        return open(cameraId);
     }
 
-    private int cameraInit(int cameraId) {
+    private int cameraInit(int cameraId, Context context, boolean overrideToPortrait) {
         mShutterCallback = null;
         mRawImageCallback = null;
         mJpegCallback = null;
@@ -480,11 +542,10 @@
             mEventHandler = null;
         }
 
-        boolean overrideToPortrait = CameraManager.shouldOverrideToPortrait(
-                ActivityThread.currentApplication().getApplicationContext());
         boolean forceSlowJpegMode = shouldForceSlowJpegMode();
-        return native_setup(new WeakReference<Camera>(this), cameraId,
-                ActivityThread.currentOpPackageName(), overrideToPortrait, forceSlowJpegMode);
+        return native_setup(new WeakReference<>(this), cameraId,
+                ActivityThread.currentOpPackageName(), overrideToPortrait, forceSlowJpegMode,
+                context.getDeviceId(), getDevicePolicyFromContext(context));
     }
 
     private boolean shouldForceSlowJpegMode() {
@@ -501,8 +562,9 @@
     }
 
     /** used by Camera#open, Camera#open(int) */
-    Camera(int cameraId) {
-        int err = cameraInit(cameraId);
+    Camera(int cameraId, @NonNull Context context, boolean overrideToPortrait) {
+        Objects.requireNonNull(context);
+        int err = cameraInit(cameraId, context, overrideToPortrait);
         if (checkInitErrors(err)) {
             if (err == -EACCES) {
                 throw new RuntimeException("Fail to connect to camera service");
@@ -515,7 +577,6 @@
         initAppOps();
     }
 
-
     /**
      * @hide
      */
@@ -568,11 +629,10 @@
 
     @UnsupportedAppUsage
     private native int native_setup(Object cameraThis, int cameraId, String packageName,
-            boolean overrideToPortrait, boolean forceSlowJpegMode);
+            boolean overrideToPortrait, boolean forceSlowJpegMode, int deviceId, int devicePolicy);
 
     private native final void native_release();
 
-
     /**
      * Disconnects and releases the Camera object resources.
      *
@@ -672,13 +732,15 @@
         if (holder != null) {
             setPreviewSurface(holder.getSurface());
         } else {
-            setPreviewSurface((Surface)null);
+            setPreviewSurface(null);
         }
     }
 
     /**
      * @hide
      */
+    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
+    @TestApi
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
     public native final void setPreviewSurface(Surface surface) throws IOException;
 
diff --git a/core/java/android/hardware/CameraStatus.java b/core/java/android/hardware/CameraStatus.java
index fa35efb..0198421 100644
--- a/core/java/android/hardware/CameraStatus.java
+++ b/core/java/android/hardware/CameraStatus.java
@@ -16,6 +16,7 @@
 
 package android.hardware;
 
+import android.annotation.NonNull;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -23,7 +24,7 @@
  * Status information about a camera.
  *
  * Contains the name of the camera device, and its current status, one of the
- * ICameraServiceListener.STATUS_ values.
+ * ICameraServiceListener.STATUS_* values.
  *
  * @hide
  */
@@ -32,6 +33,7 @@
     public int status;
     public String[] unavailablePhysicalCameras;
     public String clientPackage;
+    public int deviceId;
 
     @Override
     public int describeContents() {
@@ -44,6 +46,7 @@
         out.writeInt(status);
         out.writeStringArray(unavailablePhysicalCameras);
         out.writeString(clientPackage);
+        out.writeInt(deviceId);
     }
 
     public void readFromParcel(Parcel in) {
@@ -51,21 +54,22 @@
         status = in.readInt();
         unavailablePhysicalCameras = in.readStringArray();
         clientPackage = in.readString();
+        deviceId = in.readInt();
     }
 
-    public static final @android.annotation.NonNull Parcelable.Creator<CameraStatus> CREATOR =
-            new Parcelable.Creator<CameraStatus>() {
-        @Override
-        public CameraStatus createFromParcel(Parcel in) {
-            CameraStatus status = new CameraStatus();
-            status.readFromParcel(in);
+    @NonNull
+    public static final Parcelable.Creator<CameraStatus> CREATOR =
+            new Parcelable.Creator<>() {
+                @Override
+                public CameraStatus createFromParcel(Parcel in) {
+                    CameraStatus status = new CameraStatus();
+                    status.readFromParcel(in);
+                    return status;
+                }
 
-            return status;
-        }
-
-        @Override
-        public CameraStatus[] newArray(int size) {
-            return new CameraStatus[size];
-        }
-    };
+                @Override
+                public CameraStatus[] newArray(int size) {
+                    return new CameraStatus[size];
+                }
+            };
 }
diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java
index a8d54ed..a0e40f6 100644
--- a/core/java/android/hardware/biometrics/BiometricPrompt.java
+++ b/core/java/android/hardware/biometrics/BiometricPrompt.java
@@ -24,7 +24,7 @@
 import static android.hardware.biometrics.Flags.FLAG_ADD_KEY_AGREEMENT_CRYPTO_OBJECT;
 import static android.hardware.biometrics.Flags.FLAG_CUSTOM_BIOMETRIC_PROMPT;
 import static android.hardware.biometrics.Flags.FLAG_GET_OP_ID_CRYPTO_OBJECT;
-import static android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE;
+import static android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE;
 
 import android.annotation.CallbackExecutor;
 import android.annotation.DrawableRes;
@@ -52,6 +52,7 @@
 import android.util.Log;
 
 import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.FrameworkStatsLog;
 
 import java.lang.annotation.Retention;
@@ -70,6 +71,8 @@
 public class BiometricPrompt implements BiometricAuthenticator, BiometricConstants {
 
     private static final String TAG = "BiometricPrompt";
+    @VisibleForTesting
+    static final int MAX_LOGO_DESCRIPTION_CHARACTER_NUMBER = 30;
 
     /**
      * Error/help message will show for this amount of time.
@@ -123,6 +126,15 @@
     public static final int DISMISSED_REASON_CREDENTIAL_CONFIRMED = 7;
 
     /**
+     * Dialog is done animating away after user clicked on the button set via
+     * {@link PromptContentViewWithMoreOptionsButton.Builder#setMoreOptionsButtonListener(Executor,
+     * DialogInterface.OnClickListener)} )}.
+     *
+     * @hide
+     */
+    public static final int DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS = 8;
+
+    /**
      * @hide
      */
     @IntDef({DISMISSED_REASON_BIOMETRIC_CONFIRMED,
@@ -131,7 +143,8 @@
             DISMISSED_REASON_BIOMETRIC_CONFIRM_NOT_REQUIRED,
             DISMISSED_REASON_ERROR,
             DISMISSED_REASON_SERVER_REQUESTED,
-            DISMISSED_REASON_CREDENTIAL_CONFIRMED})
+            DISMISSED_REASON_CREDENTIAL_CONFIRMED,
+            DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS})
     @Retention(RetentionPolicy.SOURCE)
     public @interface DismissedReason {}
 
@@ -212,16 +225,23 @@
          *
          * @param logoDescription The logo description text that will be shown on the prompt.
          * @return This builder.
+         * @throws IllegalArgumentException If logo description is null or exceeds certain character
+         *                                  limit.
          */
         @FlaggedApi(FLAG_CUSTOM_BIOMETRIC_PROMPT)
         @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED)
         @NonNull
         public BiometricPrompt.Builder setLogoDescription(@NonNull String logoDescription) {
+            if (logoDescription == null
+                    || logoDescription.length() > MAX_LOGO_DESCRIPTION_CHARACTER_NUMBER) {
+                throw new IllegalArgumentException(
+                        "Logo description passed in can not be null or exceed "
+                                + MAX_LOGO_DESCRIPTION_CHARACTER_NUMBER + " character number.");
+            }
             mPromptInfo.setLogoDescription(logoDescription);
             return this;
         }
 
-
         /**
          * Required: Sets the title that will be shown on the prompt.
          * @param title The title to display.
@@ -510,7 +530,7 @@
 
         /**
          * Remove {@link Builder#setAllowBackgroundAuthentication(boolean)} once
-         * FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE is enabled.
+         * FLAG_ALLOW_PRIVATE_PROFILE is enabled.
          *
          * @param allow If true, allows authentication when the calling package is not in the
          *              foreground. This is set to false by default.
@@ -519,7 +539,7 @@
          * @return This builder
          * @hide
          */
-        @FlaggedApi(FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE)
+        @FlaggedApi(FLAG_ALLOW_PRIVATE_PROFILE)
         @TestApi
         @NonNull
         @RequiresPermission(anyOf = {TEST_BIOMETRIC, USE_BIOMETRIC_INTERNAL})
@@ -654,8 +674,6 @@
     private final IAuthService mService;
     private final PromptInfo mPromptInfo;
     private final ButtonInfo mNegativeButtonInfo;
-    // TODO(b/328843028): add callback onContentViewMoreOptionsButtonClicked() in
-    //  IBiometricServiceReceiver.
     private final ButtonInfo mContentViewMoreOptionsButtonInfo;
 
     private CryptoObject mCryptoObject;
@@ -745,6 +763,13 @@
                     mNegativeButtonInfo.listener.onClick(null, DialogInterface.BUTTON_NEGATIVE);
                     mIsPromptShowing = false;
                 });
+            } else if (reason == DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS) {
+                if (mContentViewMoreOptionsButtonInfo != null) {
+                    mContentViewMoreOptionsButtonInfo.executor.execute(() -> {
+                        mContentViewMoreOptionsButtonInfo.listener.onClick(null,
+                                DialogInterface.BUTTON_NEGATIVE);
+                    });
+                }
             } else {
                 mIsPromptShowing = false;
                 Log.e(TAG, "Unknown reason: " + reason);
@@ -799,7 +824,7 @@
 
     /**
      * Gets the logo description for the prompt, as set by
-     * {@link Builder#setDescription(CharSequence)}.
+     * {@link Builder#setLogoDescription(String)}.
      * Currently for system applications use only.
      *
      * @return The logo description of the prompt, or null if the prompt has no logo description
diff --git a/core/java/android/hardware/biometrics/PromptContentViewWithMoreOptionsButton.java b/core/java/android/hardware/biometrics/PromptContentViewWithMoreOptionsButton.java
index 9ebfa8f..a9eca3f 100644
--- a/core/java/android/hardware/biometrics/PromptContentViewWithMoreOptionsButton.java
+++ b/core/java/android/hardware/biometrics/PromptContentViewWithMoreOptionsButton.java
@@ -29,20 +29,26 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import com.android.internal.annotations.VisibleForTesting;
+
 import java.util.concurrent.Executor;
 
 /**
- * Contains the information of the template of content view with a more options button for Biometric
- * Prompt.
+ * Contains the information of the template of content view with a more options button for
+ * Biometric Prompt.
+ * <p>
  * This button should be used to provide more options for sign in or other purposes, such as when a
  * user needs to select between multiple app-specific accounts or profiles that are available for
- * sign in. This is not common and apps should avoid using it if there is only one choice available
- * or if the user has already selected the appropriate account to use before invoking
- * BiometricPrompt because it will create additional steps that the user must navigate through.
- * Clicking the more options button will dismiss the prompt, provide the app an opportunity to ask
- * the user for the correct account, &finally allow the app to decide how to proceed once selected.
+ * sign in.
  * <p>
- * Here's how you'd set a <code>PromptContentViewWithMoreOptionsButton</code> on a Biometric Prompt:
+ * Apps should avoid using this when possible because it will create additional steps that the user
+ * must navigate through - clicking the more options button will dismiss the prompt, provide the app
+ * an opportunity to ask the user for the correct option, and finally allow the app to decide how to
+ * proceed once selected.
+ *
+ * <p>
+ * Here's how you'd set a <code>PromptContentViewWithMoreOptionsButton</code> on a Biometric
+ * Prompt:
  * <pre class="prettyprint">
  * BiometricPrompt biometricPrompt = new BiometricPrompt.Builder(...)
  *     .setTitle(...)
@@ -56,6 +62,8 @@
  */
 @FlaggedApi(FLAG_CUSTOM_BIOMETRIC_PROMPT)
 public final class PromptContentViewWithMoreOptionsButton implements PromptContentViewParcelable {
+    @VisibleForTesting
+    static final int MAX_DESCRIPTION_CHARACTER_NUMBER = 225;
 
     private final String mDescription;
     private DialogInterface.OnClickListener mListener;
@@ -128,21 +136,28 @@
         }
     };
 
+    /**
+     * A builder that collects arguments to be shown on the content view with more options button.
+     */
     public static final class Builder {
         private String mDescription;
         private Executor mExecutor;
         private DialogInterface.OnClickListener mListener;
 
         /**
-         * Optional: Sets a description that will be shown on the content view.  Note that there are
-         * limits on the number of characters allowed for description.
+         * Optional: Sets a description that will be shown on the content view.
          *
          * @param description The description to display.
          * @return This builder.
+         * @throws IllegalArgumentException If description exceeds certain character limit.
          */
         @NonNull
         @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED)
         public Builder setDescription(@NonNull String description) {
+            if (description.length() > MAX_DESCRIPTION_CHARACTER_NUMBER) {
+                throw new IllegalArgumentException("The character number of description exceeds "
+                        + MAX_DESCRIPTION_CHARACTER_NUMBER);
+            }
             mDescription = description;
             return this;
         }
@@ -150,14 +165,6 @@
         /**
          * Required: Sets the executor and click listener for the more options button on the
          * prompt content.
-         * This button should be used to provide more options for sign in or other purposes, such
-         * as when a user needs to select between multiple app-specific accounts or profiles that
-         * are available for sign in. This is not common and apps should avoid using it if there
-         * is only one choice available or if the user has already selected the appropriate
-         * account to use before invoking BiometricPrompt because it will create additional steps
-         * that the user must navigate through. Clicking the more options button will dismiss the
-         * prompt, provide the app an opportunity to ask the user for the correct account, &finally
-         * allow the app to decide how to proceed once selected.
          *
          * @param executor Executor that will be used to run the on click callback.
          * @param listener Listener containing a callback to be run when the button is pressed.
@@ -167,12 +174,6 @@
         @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED)
         public Builder setMoreOptionsButtonListener(@NonNull @CallbackExecutor Executor executor,
                 @NonNull DialogInterface.OnClickListener listener) {
-            if (executor == null) {
-                throw new IllegalArgumentException("Executor must not be null");
-            }
-            if (listener == null) {
-                throw new IllegalArgumentException("Listener must not be null");
-            }
             mExecutor = executor;
             mListener = listener;
             return this;
@@ -183,14 +184,22 @@
          * Creates a {@link PromptContentViewWithMoreOptionsButton}.
          *
          * @return An instance of {@link PromptContentViewWithMoreOptionsButton}.
+         * @throws IllegalArgumentException If the executor of more options button is null, or the
+         *                                  listener of more options button is null.
          */
         @NonNull
         @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED)
         public PromptContentViewWithMoreOptionsButton build() {
+            if (mExecutor == null) {
+                throw new IllegalArgumentException(
+                        "The executor for the listener of more options button on prompt content "
+                                + "must be set and non-null if "
+                                + "PromptContentViewWithMoreOptionsButton is used.");
+            }
             if (mListener == null) {
                 throw new IllegalArgumentException(
-                        "The listener of more options button on prompt content must be set if "
-                                + "PromptContentViewWithMoreOptionsButton is used.");
+                        "The listener of more options button on prompt content must be set and "
+                                + "non-null if PromptContentViewWithMoreOptionsButton is used.");
             }
             return new PromptContentViewWithMoreOptionsButton(mDescription, mExecutor, mListener);
         }
diff --git a/core/java/android/hardware/biometrics/PromptInfo.java b/core/java/android/hardware/biometrics/PromptInfo.java
index 8143213..18b75c9 100644
--- a/core/java/android/hardware/biometrics/PromptInfo.java
+++ b/core/java/android/hardware/biometrics/PromptInfo.java
@@ -173,14 +173,19 @@
 
     /**
      * Returns whether SET_BIOMETRIC_DIALOG_ADVANCED is contained.
+     *
+     * Currently, logo res, logo bitmap, logo description, PromptContentViewWithMoreOptions needs
+     * this permission.
      */
-    public boolean containsSetLogoApiConfigurations() {
+    public boolean containsAdvancedApiConfigurations() {
         if (mLogoRes != -1) {
             return true;
         } else if (mLogoBitmap != null) {
             return true;
         } else if (mLogoDescription != null) {
             return true;
+        } else if (mContentView != null && isContentViewMoreOptionsButtonUsed()) {
+            return true;
         }
         return false;
     }
diff --git a/core/java/android/hardware/biometrics/PromptVerticalListContentView.java b/core/java/android/hardware/biometrics/PromptVerticalListContentView.java
index 38d32dc..d8b2867 100644
--- a/core/java/android/hardware/biometrics/PromptVerticalListContentView.java
+++ b/core/java/android/hardware/biometrics/PromptVerticalListContentView.java
@@ -24,14 +24,14 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import com.android.internal.annotations.VisibleForTesting;
+
 import java.util.ArrayList;
 import java.util.List;
 
 
 /**
- * Contains the information of the template of vertical list content view for Biometric Prompt. Note
- * that there are limits on the item count and the number of characters allowed for each item's
- * text.
+ * Contains the information of the template of vertical list content view for Biometric Prompt.
  * <p>
  * Here's how you'd set a <code>PromptVerticalListContentView</code> on a Biometric Prompt:
  * <pre class="prettyprint">
@@ -49,8 +49,13 @@
  */
 @FlaggedApi(FLAG_CUSTOM_BIOMETRIC_PROMPT)
 public final class PromptVerticalListContentView implements PromptContentViewParcelable {
-    private static final int MAX_ITEM_NUMBER = 20;
-    private static final int MAX_EACH_ITEM_CHARACTER_NUMBER = 640;
+    @VisibleForTesting
+    static final int MAX_ITEM_NUMBER = 20;
+    @VisibleForTesting
+    static final int MAX_EACH_ITEM_CHARACTER_NUMBER = 640;
+    @VisibleForTesting
+    static final int MAX_DESCRIPTION_CHARACTER_NUMBER = 225;
+
     private final List<PromptContentItemParcelable> mContentList;
     private final String mDescription;
 
@@ -150,51 +155,59 @@
          *
          * @param description The description to display.
          * @return This builder.
+         * @throws IllegalArgumentException If description exceeds certain character limit.
          */
         @NonNull
         public Builder setDescription(@NonNull String description) {
+            if (description.length() > MAX_DESCRIPTION_CHARACTER_NUMBER) {
+                throw new IllegalArgumentException("The character number of description exceeds "
+                        + MAX_DESCRIPTION_CHARACTER_NUMBER);
+            }
             mDescription = description;
             return this;
         }
 
         /**
-         * Optional: Adds a list item in the current row. Maximum {@value MAX_ITEM_NUMBER} items in
-         * total. The maximum length for each item is {@value MAX_EACH_ITEM_CHARACTER_NUMBER}
-         * characters.
+         * Optional: Adds a list item in the current row.
          *
          * @param listItem The list item view to display
          * @return This builder.
+         * @throws IllegalArgumentException If this list item exceeds certain character limits or
+         *                                  the number of list items exceeds certain limit.
          */
         @NonNull
         public Builder addListItem(@NonNull PromptContentItem listItem) {
-            if (doesListItemExceedsCharLimit(listItem)) {
-                throw new IllegalStateException(
-                        "The character number of list item exceeds "
-                                + MAX_EACH_ITEM_CHARACTER_NUMBER);
-            }
             mContentList.add((PromptContentItemParcelable) listItem);
+            checkItemLimits(listItem);
             return this;
         }
 
-
         /**
-         * Optional: Adds a list item in the current row. Maximum {@value MAX_ITEM_NUMBER} items in
-         * total. The maximum length for each item is {@value MAX_EACH_ITEM_CHARACTER_NUMBER}
-         * characters.
+         * Optional: Adds a list item in the current row.
          *
          * @param listItem The list item view to display
-         * @param index The position at which to add the item
+         * @param index    The position at which to add the item
          * @return This builder.
+         * @throws IllegalArgumentException If this list item exceeds certain character limits or
+         *                                  the number of list items exceeds certain limit.
          */
         @NonNull
         public Builder addListItem(@NonNull PromptContentItem listItem, int index) {
+            mContentList.add(index, (PromptContentItemParcelable) listItem);
+            checkItemLimits(listItem);
+            return this;
+        }
+
+        private void checkItemLimits(@NonNull PromptContentItem listItem) {
             if (doesListItemExceedsCharLimit(listItem)) {
-                throw new IllegalStateException(
+                throw new IllegalArgumentException(
                         "The character number of list item exceeds "
                                 + MAX_EACH_ITEM_CHARACTER_NUMBER);
             }
-            mContentList.add(index, (PromptContentItemParcelable) listItem);
-            return this;
+            if (mContentList.size() > MAX_ITEM_NUMBER) {
+                throw new IllegalArgumentException(
+                        "The number of list items exceeds " + MAX_ITEM_NUMBER);
+            }
         }
 
         private boolean doesListItemExceedsCharLimit(PromptContentItem listItem) {
@@ -217,10 +230,6 @@
          */
         @NonNull
         public PromptVerticalListContentView build() {
-            if (mContentList.size() > MAX_ITEM_NUMBER) {
-                throw new IllegalStateException(
-                        "The number of list items exceeds " + MAX_ITEM_NUMBER);
-            }
             return new PromptVerticalListContentView(mContentList, mDescription);
         }
     }
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 238c381..c6a8762 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -39,7 +39,9 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * <p>The properties describing a
@@ -567,10 +569,23 @@
     @NonNull
     @FlaggedApi(Flags.FLAG_FEATURE_COMBINATION_QUERY)
     public List<CameraCharacteristics.Key<?>> getAvailableSessionCharacteristicsKeys() {
-        if (mAvailableSessionCharacteristicsKeys == null) {
-            mAvailableSessionCharacteristicsKeys =
-                    Arrays.asList(CONTROL_ZOOM_RATIO_RANGE, SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
+        if (mAvailableSessionCharacteristicsKeys != null) {
+            return mAvailableSessionCharacteristicsKeys;
         }
+
+        Integer queryVersion = get(INFO_SESSION_CONFIGURATION_QUERY_VERSION);
+        if (queryVersion == null) {
+            mAvailableSessionCharacteristicsKeys = List.of();
+            return mAvailableSessionCharacteristicsKeys;
+        }
+
+        mAvailableSessionCharacteristicsKeys =
+                AVAILABLE_SESSION_CHARACTERISTICS_KEYS_MAP.entrySet().stream()
+                        .filter(e -> e.getKey() <= queryVersion)
+                        .map(Map.Entry::getValue)
+                        .flatMap(Arrays::stream)
+                        .collect(Collectors.toUnmodifiableList());
+
         return mAvailableSessionCharacteristicsKeys;
     }
 
@@ -5329,6 +5344,18 @@
             new Key<Integer>("android.info.sessionConfigurationQueryVersion", int.class);
 
     /**
+     * <p>Id of the device that owns this camera.</p>
+     * <p>In case of a virtual camera, this would be the id of the virtual device
+     * owning the camera. For any other camera, this key would not be present.
+     * Callers should assume {@link android.content.Context#DEVICE_ID_DEFAULT }
+     * in case this key is not present.</p>
+     * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
+     * @hide
+     */
+    public static final Key<Integer> INFO_DEVICE_ID =
+            new Key<Integer>("android.info.deviceId", int.class);
+
+    /**
      * <p>The maximum number of frames that can occur after a request
      * (different than the previous) has been submitted, and before the
      * result's state becomes synchronized.</p>
@@ -6102,16 +6129,22 @@
     public static final Key<android.util.Range<Float>> EFV_PADDING_ZOOM_FACTOR_RANGE =
             new Key<android.util.Range<Float>>("android.efv.paddingZoomFactorRange", new TypeReference<android.util.Range<Float>>() {{ }});
 
+
+    /**
+     * Mapping from INFO_SESSION_CONFIGURATION_QUERY_VERSION to session characteristics key.
+     */
+    private static final Map<Integer, Key<?>[]> AVAILABLE_SESSION_CHARACTERISTICS_KEYS_MAP =
+            Map.ofEntries(
+                Map.entry(
+                    35,
+                    new Key<?>[] {
+                        CONTROL_ZOOM_RATIO_RANGE,
+                        SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
+                    }
+                )
+            );
+
     /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
      * End generated code
      *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
-
-
-
-
-
-
-
-
-
 }
diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java
index ec9b013..50d976f 100644
--- a/core/java/android/hardware/camera2/CameraDevice.java
+++ b/core/java/android/hardware/camera2/CameraDevice.java
@@ -23,12 +23,14 @@
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemApi;
+import android.graphics.SurfaceTexture;
 import android.hardware.camera2.params.ExtensionSessionConfiguration;
 import android.hardware.camera2.params.InputConfiguration;
 import android.hardware.camera2.params.OutputConfiguration;
 import android.hardware.camera2.params.SessionConfiguration;
 import android.hardware.camera2.params.StreamConfigurationMap;
 import android.os.Handler;
+import android.util.Size;
 import android.view.Surface;
 
 import com.android.internal.camera.flags.Flags;
@@ -530,9 +532,10 @@
      *   SurfaceTexture}: Set the size of the SurfaceTexture with {@link
      *   android.graphics.SurfaceTexture#setDefaultBufferSize} to be one of the sizes returned by
      *   {@link StreamConfigurationMap#getOutputSizes(Class) getOutputSizes(SurfaceTexture.class)}
-     *   before creating a Surface from the SurfaceTexture with {@link Surface#Surface}. If the size
-     *   is not set by the application, it will be set to be the smallest supported size less than
-     *   1080p, by the camera device.</li>
+     *   before creating a Surface from the SurfaceTexture with
+     *   {@link Surface#Surface(SurfaceTexture)}. If the size is not set by the application,
+     *   it will be set to be the smallest supported size less than 1080p, by the camera
+     *   device.</li>
      *
      * <li>For recording with {@link android.media.MediaCodec}: Call
      *   {@link android.media.MediaCodec#createInputSurface} after configuring
@@ -1405,10 +1408,16 @@
      *
      * <p><b>NOTE:</b>
      * For apps targeting {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM} and above,
-     * this method will ensure session parameters set through calls to
-     * {@link SessionConfiguration#setSessionParameters} are also supported if the Camera Device
-     * supports it. For apps targeting {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE} and
-     * below, session parameters will be ignored.</p>
+     * this method will automatically delegate to
+     * {@link CameraDeviceSetup#isSessionConfigurationSupported} whenever possible. This
+     * means that the output of this method will consider parameters set through
+     * {@link SessionConfiguration#setSessionParameters} as well.
+     * </p>
+     *
+     * <p>Session Parameters will be ignored for apps targeting <=
+     * {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE}, or if
+     * {@link CameraManager#isCameraDeviceSetupSupported} returns false for the camera id
+     * associated with this {@code CameraDevice}.</p>
      *
      * @return {@code true} if the given session configuration is supported by the camera device
      *         {@code false} otherwise.
@@ -1419,6 +1428,8 @@
      *                               encountered a fatal error
      * @throws IllegalStateException if the camera device has been closed
      *
+     * @see CameraManager#isCameraDeviceSetupSupported(String)
+     * @see CameraDeviceSetup#isSessionConfigurationSupported(SessionConfiguration)
      */
     public boolean isSessionConfigurationSupported(
             @NonNull SessionConfiguration sessionConfig) throws CameraAccessException {
@@ -1703,7 +1714,7 @@
          * SessionConfiguration} can then be created using the OutputConfiguration objects and
          * be used to query whether it's supported by the camera device. To create the
          * CameraCaptureSession, the application still needs to make sure all output surfaces
-         * are added via {@link OutputConfiguration#addSurfaces} with the exception of deferred
+         * are added via {@link OutputConfiguration#addSurface} with the exception of deferred
          * surfaces for {@link android.view.SurfaceView} and
          * {@link android.graphics.SurfaceTexture}.</li>
          * </ul>
@@ -1751,15 +1762,18 @@
          * SessionConfiguration} can then be created using the OutputConfiguration objects and
          * be used for this function. To create the CameraCaptureSession, the application still
          * needs to make sure all output surfaces are added via {@link
-         * OutputConfiguration#addSurfaces} with the exception of deferred surfaces for {@link
+         * OutputConfiguration#addSurface} with the exception of deferred surfaces for {@link
          * android.view.SurfaceView} and {@link android.graphics.SurfaceTexture}.</p>
          *
          * @param sessionConfig The session configuration for which characteristics are fetched.
          * @return CameraCharacteristics specific to a given session configuration.
          *
-         * @throws IllegalArgumentException      if the session configuration is invalid
-         * @throws CameraAccessException         if the camera device is no longer connected or has
-         *                                       encountered a fatal error
+         * @throws IllegalArgumentException if the session configuration is invalid or if
+         *                                  {@link #isSessionConfigurationSupported} returns
+         *                                  {@code false} for the provided
+         *                                  {@link SessionConfiguration}
+         * @throws CameraAccessException    if the camera device is no longer connected or has
+         *                                  encountered a fatal error
          *
          * @see CameraCharacteristics#getAvailableSessionCharacteristicsKeys
          */
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index b43a900..4cd40ea 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -16,6 +16,10 @@
 
 package android.hardware.camera2;
 
+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 android.annotation.CallbackExecutor;
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
@@ -25,6 +29,7 @@
 import android.annotation.SystemService;
 import android.annotation.TestApi;
 import android.app.compat.CompatChanges;
+import android.companion.virtual.VirtualDeviceManager;
 import android.compat.annotation.ChangeId;
 import android.compat.annotation.EnabledSince;
 import android.compat.annotation.Overridable;
@@ -74,7 +79,9 @@
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
@@ -105,7 +112,33 @@
     private static final int CAMERA_TYPE_BACKWARD_COMPATIBLE = 0;
     private static final int CAMERA_TYPE_ALL = 1;
 
-    private ArrayList<String> mDeviceIdList;
+    /**
+     * Caches the mapping between a logical camera ID and 'MultiResolutionStreamConfigurationMap'
+     * that is calculated by {@link #getPhysicalCameraMultiResolutionConfigs} as the calculation
+     * might take many binder calls.
+     * <p>
+     * Note, this is a map of maps. The structure is:
+     * <pre>
+     * {
+     *     logicalCameraId_1 -> {
+     *         physicalCameraId_1 -> [
+     *             streamConfiguration_1,
+     *             streamConfiguration_2,
+     *             ...
+     *         ],
+     *         physicalCameraId_2 -> [...],
+     *         ...
+     *     },
+     *     logicalCameraId_2 -> {
+     *         ...
+     *     },
+     *     ...
+     * }
+     * </pre>
+     * </p>
+     */
+    private final Map<String, Map<String, StreamConfiguration[]>>
+            mCameraIdToMultiResolutionStreamConfigurationMap = new HashMap<>();
 
     private final Context mContext;
     private final Object mLock = new Object();
@@ -114,6 +147,8 @@
             "android.permission.CAMERA_OPEN_CLOSE_LISTENER";
     private final boolean mHasOpenCloseListenerPermission;
 
+    private VirtualDeviceManager mVirtualDeviceManager;
+
     /**
      * Force camera output to be rotated to portrait orientation on landscape cameras.
      * Many apps do not handle this situation and display stretched images otherwise.
@@ -240,7 +275,8 @@
      */
     @NonNull
     public String[] getCameraIdList() throws CameraAccessException {
-        return CameraManagerGlobal.get().getCameraIdList();
+        return CameraManagerGlobal.get().getCameraIdList(mContext.getDeviceId(),
+                getDevicePolicyFromContext(mContext));
     }
 
     /**
@@ -251,11 +287,13 @@
      * adopt(drop)ShellPermissionIdentity() and effectively change their permissions). This call
      * affects the camera ids returned by getCameraIdList() as well. Tests which do adopt shell
      * permission identity should not mix getCameraIdList() and getCameraListNoLazyCalls().
+     *
+     * @hide
      */
-    /** @hide */
     @TestApi
     public String[] getCameraIdListNoLazy() throws CameraAccessException {
-        return CameraManagerGlobal.get().getCameraIdListNoLazy();
+        return CameraManagerGlobal.get().getCameraIdListNoLazy(mContext.getDeviceId(),
+                getDevicePolicyFromContext(mContext));
     }
 
     /**
@@ -381,7 +419,8 @@
     public void registerAvailabilityCallback(@NonNull AvailabilityCallback callback,
             @Nullable Handler handler) {
         CameraManagerGlobal.get().registerAvailabilityCallback(callback,
-                CameraDeviceImpl.checkAndWrapHandler(handler), mHasOpenCloseListenerPermission);
+                CameraDeviceImpl.checkAndWrapHandler(handler), mHasOpenCloseListenerPermission,
+                mContext.getDeviceId(), getDevicePolicyFromContext(mContext));
     }
 
     /**
@@ -420,7 +459,8 @@
             throw new IllegalArgumentException("executor was null");
         }
         CameraManagerGlobal.get().registerAvailabilityCallback(callback, executor,
-                mHasOpenCloseListenerPermission);
+                mHasOpenCloseListenerPermission, mContext.getDeviceId(),
+                getDevicePolicyFromContext(mContext));
     }
 
     /**
@@ -459,7 +499,8 @@
      */
     public void registerTorchCallback(@NonNull TorchCallback callback, @Nullable Handler handler) {
         CameraManagerGlobal.get().registerTorchCallback(callback,
-                CameraDeviceImpl.checkAndWrapHandler(handler));
+                CameraDeviceImpl.checkAndWrapHandler(handler), mContext.getDeviceId(),
+                getDevicePolicyFromContext(mContext));
     }
 
     /**
@@ -480,7 +521,8 @@
         if (executor == null) {
             throw new IllegalArgumentException("executor was null");
         }
-        CameraManagerGlobal.get().registerTorchCallback(callback, executor);
+        CameraManagerGlobal.get().registerTorchCallback(callback, executor, mContext.getDeviceId(),
+                getDevicePolicyFromContext(mContext));
     }
 
     /**
@@ -495,6 +537,19 @@
         CameraManagerGlobal.get().unregisterTorchCallback(callback);
     }
 
+    /** @hide */
+    public int getDevicePolicyFromContext(@NonNull Context context) {
+        if (context.getDeviceId() == DEVICE_ID_DEFAULT
+                || !android.companion.virtual.flags.Flags.virtualCamera()) {
+            return DEVICE_POLICY_DEFAULT;
+        }
+
+        if (mVirtualDeviceManager == null) {
+            mVirtualDeviceManager = context.getSystemService(VirtualDeviceManager.class);
+        }
+        return mVirtualDeviceManager.getDevicePolicy(context.getDeviceId(), POLICY_TYPE_CAMERA);
+    }
+
     // TODO(b/147726300): Investigate how to support foldables/multi-display devices.
     private Size getDisplaySize() {
         Size ret = new Size(0, 0);
@@ -539,8 +594,14 @@
     private Map<String, StreamConfiguration[]> getPhysicalCameraMultiResolutionConfigs(
             String cameraId, CameraMetadataNative info, ICameraService cameraService)
             throws CameraAccessException {
+        if (mCameraIdToMultiResolutionStreamConfigurationMap.containsKey(cameraId)) {
+            return mCameraIdToMultiResolutionStreamConfigurationMap.get(cameraId);
+        }
+
         HashMap<String, StreamConfiguration[]> multiResolutionStreamConfigurations =
-                new HashMap<String, StreamConfiguration[]>();
+                new HashMap<>();
+        mCameraIdToMultiResolutionStreamConfigurationMap.put(cameraId,
+                multiResolutionStreamConfigurations);
 
         Boolean multiResolutionStreamSupported = info.get(
                 CameraCharacteristics.SCALER_MULTI_RESOLUTION_STREAM_SUPPORTED);
@@ -566,7 +627,8 @@
                 CameraMetadataNative physicalCameraInfo =
                         cameraService.getCameraCharacteristics(physicalCameraId,
                                 mContext.getApplicationInfo().targetSdkVersion,
-                                /*overrideToPortrait*/false);
+                                /*overrideToPortrait*/ false, DEVICE_ID_DEFAULT,
+                                DEVICE_POLICY_DEFAULT);
                 StreamConfiguration[] configs = physicalCameraInfo.get(
                         CameraCharacteristics.
                                 SCALER_PHYSICAL_CAMERA_MULTI_RESOLUTION_STREAM_CONFIGURATIONS);
@@ -637,7 +699,7 @@
     @NonNull
     public CameraCharacteristics getCameraCharacteristics(@NonNull String cameraId,
             boolean overrideToPortrait) throws CameraAccessException {
-        CameraCharacteristics characteristics = null;
+        CameraCharacteristics characteristics;
         if (CameraManagerGlobal.sCameraServiceDisabled) {
             throw new IllegalArgumentException("No cameras available on device");
         }
@@ -648,28 +710,10 @@
                         "Camera service is currently unavailable");
             }
             try {
-                Size displaySize = getDisplaySize();
-
                 CameraMetadataNative info = cameraService.getCameraCharacteristics(cameraId,
-                        mContext.getApplicationInfo().targetSdkVersion, overrideToPortrait);
-                try {
-                    info.setCameraId(Integer.parseInt(cameraId));
-                } catch (NumberFormatException e) {
-                    Log.v(TAG, "Failed to parse camera Id " + cameraId + " to integer");
-                }
-
-                boolean hasConcurrentStreams =
-                        CameraManagerGlobal.get().cameraIdHasConcurrentStreamsLocked(cameraId);
-                info.setHasMandatoryConcurrentStreams(hasConcurrentStreams);
-                info.setDisplaySize(displaySize);
-
-                Map<String, StreamConfiguration[]> multiResolutionSizeMap =
-                        getPhysicalCameraMultiResolutionConfigs(cameraId, info, cameraService);
-                if (multiResolutionSizeMap.size() > 0) {
-                    info.setMultiResolutionStreamConfigurationMap(multiResolutionSizeMap);
-                }
-
-                characteristics = new CameraCharacteristics(info);
+                        mContext.getApplicationInfo().targetSdkVersion, overrideToPortrait,
+                        mContext.getDeviceId(), getDevicePolicyFromContext(mContext));
+                characteristics = prepareCameraCharacteristics(cameraId, info, cameraService);
             } catch (ServiceSpecificException e) {
                 throw ExceptionUtils.throwAsPublicException(e);
             } catch (RemoteException e) {
@@ -682,6 +726,48 @@
         return characteristics;
     }
 
+
+    /**
+     * Utility method to take a {@link CameraMetadataNative} object and wrap it into a
+     * {@link CameraCharacteristics} object that has all required fields and keys set and is fit
+     * for apps to consume.
+     *
+     * @param cameraId      camera Id that the CameraMetadataNative was fetched for.
+     * @param metadata      base CameraMetadataNative to be wrapped
+     * @param cameraService remote cameraservice instance to be used if binder calls need
+     *                      to be made.
+     * @return A CameraCharacteristics object that can be used by the apps.
+     * @hide
+     */
+    @NonNull
+    public CameraCharacteristics prepareCameraCharacteristics(
+            @NonNull String cameraId, CameraMetadataNative metadata, ICameraService cameraService)
+            throws CameraAccessException {
+        synchronized (mLock) {
+            try {
+                metadata.setCameraId(Integer.parseInt(cameraId));
+            } catch (NumberFormatException e) {
+                Log.v(TAG, "Failed to parse camera Id " + cameraId + " to integer");
+            }
+
+            boolean hasConcurrentStreams =
+                    CameraManagerGlobal.get().cameraIdHasConcurrentStreamsLocked(cameraId,
+                            mContext.getDeviceId());
+            metadata.setHasMandatoryConcurrentStreams(hasConcurrentStreams);
+
+            Size displaySize = getDisplaySize();
+            metadata.setDisplaySize(displaySize);
+
+            Map<String, StreamConfiguration[]> multiResolutionSizeMap =
+                    getPhysicalCameraMultiResolutionConfigs(cameraId, metadata, cameraService);
+            if (!multiResolutionSizeMap.isEmpty()) {
+                metadata.setMultiResolutionStreamConfigurationMap(multiResolutionSizeMap);
+            }
+
+            return new CameraCharacteristics(metadata);
+        }
+    }
+
     /**
      * <p>Query the camera extension capabilities of a camera device.</p>
      *
@@ -759,7 +845,6 @@
         }
 
         return getCameraDeviceSetupUnsafe(cameraId);
-
     }
 
     /**
@@ -806,7 +891,8 @@
         }
 
         if (CameraManagerGlobal.sCameraServiceDisabled
-                || !Arrays.asList(CameraManagerGlobal.get().getCameraIdList()).contains(cameraId)) {
+                || !Arrays.asList(CameraManagerGlobal.get().getCameraIdList(mContext.getDeviceId(),
+                getDevicePolicyFromContext(mContext))).contains(cameraId)) {
             throw new IllegalArgumentException(
                     "Camera ID '" + cameraId + "' not available on device.");
         }
@@ -846,7 +932,6 @@
         Map<String, CameraCharacteristics> physicalIdsToChars =
                 getPhysicalIdToCharsMap(characteristics);
         synchronized (mLock) {
-
             ICameraDeviceUser cameraUser = null;
             CameraDevice.CameraDeviceSetup cameraDeviceSetup = null;
             if (Flags.cameraDeviceSetup()
@@ -855,7 +940,7 @@
             }
 
             android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
-                    new android.hardware.camera2.impl.CameraDeviceImpl(
+                    new CameraDeviceImpl(
                         cameraId,
                         callback,
                         executor,
@@ -876,7 +961,8 @@
                 cameraUser = cameraService.connectDevice(callbacks, cameraId,
                     mContext.getOpPackageName(), mContext.getAttributionTag(), uid,
                     oomScoreOffset, mContext.getApplicationInfo().targetSdkVersion,
-                    overrideToPortrait);
+                    overrideToPortrait, mContext.getDeviceId(),
+                        getDevicePolicyFromContext(mContext));
             } catch (ServiceSpecificException e) {
                 if (e.errorCode == ICameraService.ERROR_DEPRECATED_HAL) {
                     throw new AssertionError("Should've gone down the shim path");
@@ -1002,7 +1088,6 @@
     public void openCamera(@NonNull String cameraId,
             @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)
             throws CameraAccessException {
-
         openCameraForUid(cameraId, callback, CameraDeviceImpl.checkAndWrapHandler(handler),
                 USE_CALLING_UID);
     }
@@ -1052,6 +1137,12 @@
      * {@link java.util.concurrent.Executor} as an argument instead of
      * {@link android.os.Handler}.</p>
      *
+     * <p>Do note that typically callbacks are expected to be dispatched
+     * by the executor in a single thread. If the executor uses two or
+     * more threads to dispatch callbacks, then clients must ensure correct
+     * synchronization and must also be able to handle potentially different
+     * ordering of the incoming callbacks.</p>
+     *
      * @param cameraId
      *             The unique identifier of the camera device to open
      * @param executor
@@ -1253,7 +1344,8 @@
         if (CameraManagerGlobal.sCameraServiceDisabled) {
             throw new IllegalArgumentException("No cameras available on device");
         }
-        CameraManagerGlobal.get().setTorchMode(cameraId, enabled);
+        CameraManagerGlobal.get().setTorchMode(cameraId, enabled, mContext.getDeviceId(),
+                getDevicePolicyFromContext(mContext));
     }
 
     /**
@@ -1316,7 +1408,8 @@
         if (CameraManagerGlobal.sCameraServiceDisabled) {
             throw new IllegalArgumentException("No camera available on device");
         }
-        CameraManagerGlobal.get().turnOnTorchWithStrengthLevel(cameraId, torchStrength);
+        CameraManagerGlobal.get().turnOnTorchWithStrengthLevel(cameraId, torchStrength,
+                mContext.getDeviceId(), getDevicePolicyFromContext(mContext));
     }
 
     /**
@@ -1342,7 +1435,8 @@
         if (CameraManagerGlobal.sCameraServiceDisabled) {
             throw new IllegalArgumentException("No camera available on device.");
         }
-        return CameraManagerGlobal.get().getTorchStrengthLevel(cameraId);
+        return CameraManagerGlobal.get().getTorchStrengthLevel(cameraId, mContext.getDeviceId(),
+                getDevicePolicyFromContext(mContext));
     }
 
     /**
@@ -1407,6 +1501,9 @@
      */
     public static abstract class AvailabilityCallback {
 
+        private int mDeviceId;
+        private int mDevicePolicy;
+
         /**
          * A new camera has become available to use.
          *
@@ -1645,6 +1742,10 @@
      * @see #registerTorchCallback
      */
     public static abstract class TorchCallback {
+
+        private int mDeviceId;
+        private int mDevicePolicy;
+
         /**
          * A camera's torch mode has become unavailable to set via {@link #setTorchMode}.
          *
@@ -1867,6 +1968,10 @@
             implements IBinder.DeathRecipient {
 
         private static final String TAG = "CameraManagerGlobal";
+
+        private static final String BACK_CAMERA_ID = "0";
+        private static final String FRONT_CAMERA_ID = "1";
+
         private final boolean DEBUG = false;
 
         private final int CAMERA_SERVICE_RECONNECT_DELAY_MS = 1000;
@@ -1882,29 +1987,26 @@
 
         private final ScheduledExecutorService mScheduler = Executors.newScheduledThreadPool(1);
         // Camera ID -> Status map
-        private final ArrayMap<String, Integer> mDeviceStatus = new ArrayMap<String, Integer>();
+        private final ArrayMap<DeviceCameraInfo, Integer> mDeviceStatus = new ArrayMap<>();
         // Camera ID -> (physical camera ID -> Status map)
-        private final ArrayMap<String, ArrayList<String>> mUnavailablePhysicalDevices =
-                new ArrayMap<String, ArrayList<String>>();
+        private final ArrayMap<DeviceCameraInfo, ArrayList<String>> mUnavailablePhysicalDevices =
+                new ArrayMap<>();
         // Opened Camera ID -> apk name map
-        private final ArrayMap<String, String> mOpenedDevices = new ArrayMap<String, String>();
+        private final ArrayMap<DeviceCameraInfo, String> mOpenedDevices = new ArrayMap<>();
 
-        private final Set<Set<String>> mConcurrentCameraIdCombinations =
-                new ArraySet<Set<String>>();
+        private final Set<Set<String>> mConcurrentCameraIdCombinations = new ArraySet<>();
 
         // Registered availability callbacks and their executors
-        private final ArrayMap<AvailabilityCallback, Executor> mCallbackMap =
-            new ArrayMap<AvailabilityCallback, Executor>();
+        private final ArrayMap<AvailabilityCallback, Executor> mCallbackMap = new ArrayMap<>();
 
         // torch client binder to set the torch mode with.
-        private Binder mTorchClientBinder = new Binder();
+        private final Binder mTorchClientBinder = new Binder();
 
         // Camera ID -> Torch status map
-        private final ArrayMap<String, Integer> mTorchStatus = new ArrayMap<String, Integer>();
+        private final ArrayMap<DeviceCameraInfo, Integer> mTorchStatus = new ArrayMap<>();
 
         // Registered torch callbacks and their executors
-        private final ArrayMap<TorchCallback, Executor> mTorchCallbackMap =
-                new ArrayMap<TorchCallback, Executor>();
+        private final ArrayMap<TorchCallback, Executor> mTorchCallbackMap = new ArrayMap<>();
 
         private final Object mLock = new Object();
 
@@ -2019,25 +2121,28 @@
 
             try {
                 CameraStatus[] cameraStatuses = cameraService.addListener(this);
-                for (CameraStatus c : cameraStatuses) {
-                    onStatusChangedLocked(c.status, c.cameraId);
+                for (CameraStatus cameraStatus : cameraStatuses) {
+                    DeviceCameraInfo info = new DeviceCameraInfo(cameraStatus.cameraId,
+                            cameraStatus.deviceId);
+                    onStatusChangedLocked(cameraStatus.status, info);
 
-                    if (c.unavailablePhysicalCameras != null) {
-                        for (String unavailPhysicalCamera : c.unavailablePhysicalCameras) {
+                    if (cameraStatus.unavailablePhysicalCameras != null) {
+                        for (String unavailablePhysicalCamera :
+                                cameraStatus.unavailablePhysicalCameras) {
                             onPhysicalCameraStatusChangedLocked(
                                     ICameraServiceListener.STATUS_NOT_PRESENT,
-                                    c.cameraId, unavailPhysicalCamera);
+                                    info, unavailablePhysicalCamera);
                         }
                     }
 
-                    if (mHasOpenCloseListenerPermission &&
-                            c.status == ICameraServiceListener.STATUS_NOT_AVAILABLE &&
-                            !c.clientPackage.isEmpty()) {
-                        onCameraOpenedLocked(c.cameraId, c.clientPackage);
+                    if (mHasOpenCloseListenerPermission
+                            && cameraStatus.status == ICameraServiceListener.STATUS_NOT_AVAILABLE
+                            && !cameraStatus.clientPackage.isEmpty()) {
+                        onCameraOpenedLocked(info, cameraStatus.clientPackage);
                     }
                 }
                 mCameraService = cameraService;
-            } catch(ServiceSpecificException e) {
+            } catch (ServiceSpecificException e) {
                 // Unexpected failure
                 throw new IllegalStateException("Failed to register a camera service listener", e);
             } catch (RemoteException e) {
@@ -2118,36 +2223,32 @@
             }
         }
 
-        private String[] extractCameraIdListLocked() {
-            String[] cameraIds = null;
-            int idCount = 0;
+        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) continue;
-                idCount++;
+                        || status == ICameraServiceListener.STATUS_ENUMERATING
+                        || shouldHideCamera(deviceId, devicePolicy, info)) {
+                    continue;
+                }
+                cameraIds.add(info.mCameraId);
             }
-            cameraIds = new String[idCount];
-            idCount = 0;
-            for (int i = 0; i < mDeviceStatus.size(); i++) {
-                int status = mDeviceStatus.valueAt(i);
-                if (status == ICameraServiceListener.STATUS_NOT_PRESENT
-                        || status == ICameraServiceListener.STATUS_ENUMERATING) continue;
-                cameraIds[idCount] = mDeviceStatus.keyAt(i);
-                idCount++;
-            }
-            return cameraIds;
+            return cameraIds.toArray(new String[0]);
         }
 
         private Set<Set<String>> extractConcurrentCameraIdListLocked() {
-            Set<Set<String>> concurrentCameraIds = new ArraySet<Set<String>>();
+            Set<Set<String>> concurrentCameraIds = new ArraySet<>();
             for (Set<String> cameraIds : mConcurrentCameraIdCombinations) {
-                Set<String> extractedCameraIds = new ArraySet<String>();
+                Set<String> extractedCameraIds = new ArraySet<>();
                 for (String cameraId : cameraIds) {
+                    // TODO(b/291736219): This to be made device-aware.
+                    DeviceCameraInfo info = new DeviceCameraInfo(cameraId, DEVICE_ID_DEFAULT);
                     // if the camera id status is NOT_PRESENT or ENUMERATING; skip the device.
                     // TODO: Would a device status NOT_PRESENT ever be in the map ? it gets removed
                     // in the callback anyway.
-                    Integer status = mDeviceStatus.get(cameraId);
+                    Integer status = mDeviceStatus.get(info);
                     if (status == null) {
                         // camera id not present
                         continue;
@@ -2194,19 +2295,39 @@
                             return s1.compareTo(s2);
                         }
                     }});
-
         }
 
-        public static boolean cameraStatusesContains(CameraStatus[] cameraStatuses, String id) {
+        private boolean shouldHideCamera(int currentDeviceId, int devicePolicy,
+                DeviceCameraInfo info) {
+            if (!android.companion.virtualdevice.flags.Flags.cameraDeviceAwareness()) {
+                // Don't hide any cameras if the device-awareness feature flag is disabled.
+                return false;
+            }
+
+            if (devicePolicy == DEVICE_POLICY_DEFAULT && info.mDeviceId == DEVICE_ID_DEFAULT) {
+                // Don't hide default-device cameras for a default-policy virtual device.
+                return false;
+            }
+
+            // External cameras should never be hidden.
+            if (!info.mCameraId.equals(FRONT_CAMERA_ID) && !info.mCameraId.equals(BACK_CAMERA_ID)) {
+                return false;
+            }
+
+            return currentDeviceId != info.mDeviceId;
+        }
+
+        private static boolean cameraStatusesContains(CameraStatus[] cameraStatuses,
+                DeviceCameraInfo info) {
             for (CameraStatus c : cameraStatuses) {
-                if (c.cameraId.equals(id)) {
+                if (c.cameraId.equals(info.mCameraId) && c.deviceId == info.mDeviceId) {
                     return true;
                 }
             }
             return false;
         }
 
-        public String[] getCameraIdListNoLazy() {
+        public String[] getCameraIdListNoLazy(int deviceId, int devicePolicy) {
             if (sCameraServiceDisabled) {
                 return new String[] {};
             }
@@ -2214,30 +2335,32 @@
             CameraStatus[] cameraStatuses;
             ICameraServiceListener.Stub testListener = new ICameraServiceListener.Stub() {
                 @Override
-                public void onStatusChanged(int status, String id) throws RemoteException {
+                public void onStatusChanged(int status, String id, int deviceId)
+                        throws RemoteException {
                 }
                 @Override
                 public void onPhysicalCameraStatusChanged(int status,
-                        String id, String physicalId) throws RemoteException {
+                        String id, String physicalId, int deviceId) throws RemoteException {
                 }
                 @Override
-                public void onTorchStatusChanged(int status, String id) throws RemoteException {
-                }
-                @Override
-                public void onTorchStrengthLevelChanged(String id, int newStrengthLevel)
+                public void onTorchStatusChanged(int status, String id, int deviceId)
                         throws RemoteException {
                 }
                 @Override
+                public void onTorchStrengthLevelChanged(String id, int newStrengthLevel,
+                        int deviceId) throws RemoteException {
+                }
+                @Override
                 public void onCameraAccessPrioritiesChanged() {
                 }
                 @Override
-                public void onCameraOpened(String id, String clientPackageId) {
+                public void onCameraOpened(String id, String clientPackageId, int deviceId) {
                 }
                 @Override
-                public void onCameraClosed(String id) {
+                public void onCameraClosed(String id, int deviceId) {
                 }};
 
-            String[] cameraIds = null;
+            String[] cameraIds;
             synchronized (mLock) {
                 connectCameraServiceLocked();
                 try {
@@ -2255,23 +2378,24 @@
                     // devices removed as well. This is the same situation.
                     cameraStatuses = mCameraService.addListener(testListener);
                     mCameraService.removeListener(testListener);
-                    for (CameraStatus c : cameraStatuses) {
-                        onStatusChangedLocked(c.status, c.cameraId);
+                    for (CameraStatus cameraStatus : cameraStatuses) {
+                        onStatusChangedLocked(cameraStatus.status,
+                                new DeviceCameraInfo(cameraStatus.cameraId, cameraStatus.deviceId));
                     }
-                    Set<String> deviceCameraIds = mDeviceStatus.keySet();
-                    ArrayList<String> deviceIdsToRemove = new ArrayList<String>();
-                    for (String deviceCameraId : deviceCameraIds) {
+                    Set<DeviceCameraInfo> deviceCameraInfos = mDeviceStatus.keySet();
+                    List<DeviceCameraInfo> deviceInfosToRemove = new ArrayList<>();
+                    for (DeviceCameraInfo info : deviceCameraInfos) {
                         // Its possible that a device id was removed without a callback notifying
                         // us. This may happen in case a process 'drops' system camera permissions
                         // (even though the permission isn't a changeable one, tests may call
                         // adoptShellPermissionIdentity() and then dropShellPermissionIdentity().
-                        if (!cameraStatusesContains(cameraStatuses, deviceCameraId)) {
-                            deviceIdsToRemove.add(deviceCameraId);
+                        if (!cameraStatusesContains(cameraStatuses, info)) {
+                            deviceInfosToRemove.add(info);
                         }
                     }
-                    for (String id : deviceIdsToRemove) {
-                        onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, id);
-                        mTorchStatus.remove(id);
+                    for (DeviceCameraInfo info : deviceInfosToRemove) {
+                        onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, info);
+                        mTorchStatus.remove(info);
                     }
                 } catch (ServiceSpecificException e) {
                     // Unexpected failure
@@ -2280,7 +2404,7 @@
                 } catch (RemoteException e) {
                     // Camera service is now down, leave mCameraService as null
                 }
-                cameraIds = extractCameraIdListLocked();
+                cameraIds = extractCameraIdListLocked(deviceId, devicePolicy);
             }
             sortCameraIds(cameraIds);
             return cameraIds;
@@ -2290,19 +2414,19 @@
          * Get a list of all camera IDs that are at least PRESENT; ignore devices that are
          * NOT_PRESENT or ENUMERATING, since they cannot be used by anyone.
          */
-        public String[] getCameraIdList() {
-            String[] cameraIds = null;
+        public String[] getCameraIdList(int deviceId, int devicePolicy) {
+            String[] cameraIds;
             synchronized (mLock) {
                 // Try to make sure we have an up-to-date list of camera devices.
                 connectCameraServiceLocked();
-                cameraIds = extractCameraIdListLocked();
+                cameraIds = extractCameraIdListLocked(deviceId, devicePolicy);
             }
             sortCameraIds(cameraIds);
             return cameraIds;
         }
 
         public @NonNull Set<Set<String>> getConcurrentCameraIds() {
-            Set<Set<String>> concurrentStreamingCameraIds = null;
+            Set<Set<String>> concurrentStreamingCameraIds;
             synchronized (mLock) {
                 // Try to make sure we have an up-to-date list of concurrent camera devices.
                 connectCameraServiceLocked();
@@ -2315,11 +2439,12 @@
         public boolean isConcurrentSessionConfigurationSupported(
                 @NonNull Map<String, SessionConfiguration> cameraIdsAndSessionConfigurations,
                 int targetSdkVersion) throws CameraAccessException {
-
             if (cameraIdsAndSessionConfigurations == null) {
                 throw new IllegalArgumentException("cameraIdsAndSessionConfigurations was null");
             }
 
+            // TODO(b/291736219): Check if this API needs to be made device-aware.
+
             int size = cameraIdsAndSessionConfigurations.size();
             if (size == 0) {
                 throw new IllegalArgumentException("camera id and session combination is empty");
@@ -2361,19 +2486,21 @@
             }
         }
 
-      /**
-        * Helper function to find out if a camera id is in the set of combinations returned by
-        * getConcurrentCameraIds()
-        * @param cameraId the unique identifier of the camera device to query
-        * @return Whether the camera device was found in the set of combinations returned by
-        *         getConcurrentCameraIds
-        */
-        public boolean cameraIdHasConcurrentStreamsLocked(String cameraId) {
-            if (!mDeviceStatus.containsKey(cameraId)) {
+        /**
+         * Helper function to find out if a camera id is in the set of combinations returned by
+         * getConcurrentCameraIds()
+         * @param cameraId the unique identifier of the camera device to query
+         * @param deviceId the device id of the context
+         * @return Whether the camera device was found in the set of combinations returned by
+         *         getConcurrentCameraIds
+         */
+        public boolean cameraIdHasConcurrentStreamsLocked(String cameraId, int deviceId) {
+            DeviceCameraInfo info = new DeviceCameraInfo(cameraId, deviceId);
+            if (!mDeviceStatus.containsKey(info)) {
                 // physical camera ids aren't advertised in concurrent camera id combinations.
                 if (DEBUG) {
                     Log.v(TAG, " physical camera id " + cameraId + " is hidden." +
-                            " Available logical camera ids : " + mDeviceStatus.toString());
+                            " Available logical camera ids : " + mDeviceStatus);
                 }
                 return false;
             }
@@ -2385,9 +2512,9 @@
             return false;
         }
 
-        public void setTorchMode(String cameraId, boolean enabled) throws CameraAccessException {
-            synchronized(mLock) {
-
+        public void setTorchMode(String cameraId, boolean enabled, int deviceId, int devicePolicy)
+                throws CameraAccessException {
+            synchronized (mLock) {
                 if (cameraId == null) {
                     throw new IllegalArgumentException("cameraId was null");
                 }
@@ -2399,7 +2526,8 @@
                 }
 
                 try {
-                    cameraService.setTorchMode(cameraId, enabled, mTorchClientBinder);
+                    cameraService.setTorchMode(cameraId, enabled, mTorchClientBinder, deviceId,
+                            devicePolicy);
                 } catch(ServiceSpecificException e) {
                     throw ExceptionUtils.throwAsPublicException(e);
                 } catch (RemoteException e) {
@@ -2409,10 +2537,10 @@
             }
         }
 
-        public void turnOnTorchWithStrengthLevel(String cameraId, int torchStrength) throws
-                CameraAccessException {
-            synchronized(mLock) {
-
+        public void turnOnTorchWithStrengthLevel(String cameraId, int torchStrength, int deviceId,
+                int devicePolicy)
+                throws CameraAccessException {
+            synchronized (mLock) {
                 if (cameraId == null) {
                     throw new IllegalArgumentException("cameraId was null");
                 }
@@ -2425,7 +2553,7 @@
 
                 try {
                     cameraService.turnOnTorchWithStrengthLevel(cameraId, torchStrength,
-                            mTorchClientBinder);
+                            mTorchClientBinder, deviceId, devicePolicy);
                 } catch(ServiceSpecificException e) {
                     throw ExceptionUtils.throwAsPublicException(e);
                 } catch (RemoteException e) {
@@ -2435,9 +2563,10 @@
             }
         }
 
-        public int getTorchStrengthLevel(String cameraId) throws CameraAccessException {
-            int torchStrength = 0;
-            synchronized(mLock) {
+        public int getTorchStrengthLevel(String cameraId, int deviceId, int devicePolicy)
+                throws CameraAccessException {
+            int torchStrength;
+            synchronized (mLock) {
                 if (cameraId == null) {
                     throw new IllegalArgumentException("cameraId was null");
                 }
@@ -2449,7 +2578,8 @@
                 }
 
                 try {
-                    torchStrength = cameraService.getTorchStrengthLevel(cameraId);
+                    torchStrength = cameraService.getTorchStrengthLevel(cameraId, deviceId,
+                            devicePolicy);
                 } catch(ServiceSpecificException e) {
                     throw ExceptionUtils.throwAsPublicException(e);
                 } catch (RemoteException e) {
@@ -2506,13 +2636,7 @@
                 final Executor executor) {
             final long ident = Binder.clearCallingIdentity();
             try {
-                executor.execute(
-                    new Runnable() {
-                        @Override
-                        public void run() {
-                            callback.onCameraAccessPrioritiesChanged();
-                        }
-                    });
+                executor.execute(callback::onCameraAccessPrioritiesChanged);
             } finally {
                 Binder.restoreCallingIdentity(ident);
             }
@@ -2522,13 +2646,7 @@
                 final Executor executor, final String id, final String packageId) {
             final long ident = Binder.clearCallingIdentity();
             try {
-                executor.execute(
-                    new Runnable() {
-                        @Override
-                        public void run() {
-                            callback.onCameraOpened(id, packageId);
-                        }
-                    });
+                executor.execute(() -> callback.onCameraOpened(id, packageId));
             } finally {
                 Binder.restoreCallingIdentity(ident);
             }
@@ -2538,13 +2656,7 @@
                 final Executor executor, final String id) {
             final long ident = Binder.clearCallingIdentity();
             try {
-                executor.execute(
-                    new Runnable() {
-                        @Override
-                        public void run() {
-                            callback.onCameraClosed(id);
-                        }
-                    });
+                executor.execute(() -> callback.onCameraClosed(id));
             } finally {
                 Binder.restoreCallingIdentity(ident);
             }
@@ -2556,16 +2668,13 @@
                 final long ident = Binder.clearCallingIdentity();
                 try {
                     executor.execute(
-                        new Runnable() {
-                            @Override
-                            public void run() {
+                            () -> {
                                 if (physicalId == null) {
                                     callback.onCameraAvailable(id);
                                 } else {
                                     callback.onPhysicalCameraAvailable(id, physicalId);
                                 }
-                            }
-                        });
+                            });
                 } finally {
                     Binder.restoreCallingIdentity(ident);
                 }
@@ -2573,16 +2682,13 @@
                 final long ident = Binder.clearCallingIdentity();
                 try {
                     executor.execute(
-                        new Runnable() {
-                            @Override
-                            public void run() {
+                            () -> {
                                 if (physicalId == null) {
                                     callback.onCameraUnavailable(id);
                                 } else {
                                     callback.onPhysicalCameraUnavailable(id, physicalId);
                                 }
-                            }
-                        });
+                            });
                 } finally {
                     Binder.restoreCallingIdentity(ident);
                 }
@@ -2594,28 +2700,24 @@
             switch(status) {
                 case ICameraServiceListener.TORCH_STATUS_AVAILABLE_ON:
                 case ICameraServiceListener.TORCH_STATUS_AVAILABLE_OFF: {
-                        final long ident = Binder.clearCallingIdentity();
-                        try {
-                            executor.execute(() -> {
-                                callback.onTorchModeChanged(id, status ==
-                                        ICameraServiceListener.TORCH_STATUS_AVAILABLE_ON);
-                            });
-                        } finally {
-                            Binder.restoreCallingIdentity(ident);
-                        }
+                    final long ident = Binder.clearCallingIdentity();
+                    try {
+                        executor.execute(() -> callback.onTorchModeChanged(id, status
+                                == ICameraServiceListener.TORCH_STATUS_AVAILABLE_ON));
+                    } finally {
+                        Binder.restoreCallingIdentity(ident);
                     }
                     break;
+                }
                 default: {
-                        final long ident = Binder.clearCallingIdentity();
-                        try {
-                            executor.execute(() -> {
-                                callback.onTorchModeUnavailable(id);
-                            });
-                        } finally {
-                            Binder.restoreCallingIdentity(ident);
-                        }
+                    final long ident = Binder.clearCallingIdentity();
+                    try {
+                        executor.execute(() -> callback.onTorchModeUnavailable(id));
+                    } finally {
+                        Binder.restoreCallingIdentity(ident);
                     }
                     break;
+                }
             }
         }
 
@@ -2623,9 +2725,7 @@
                  final Executor executor, final String id, final int newStrengthLevel) {
             final long ident = Binder.clearCallingIdentity();
             try {
-                executor.execute(() -> {
-                    callback.onTorchStrengthLevelChanged(id, newStrengthLevel);
-                });
+                executor.execute(() -> callback.onTorchStrengthLevelChanged(id, newStrengthLevel));
             } finally {
                 Binder.restoreCallingIdentity(ident);
             }
@@ -2637,48 +2737,57 @@
          */
         private void updateCallbackLocked(AvailabilityCallback callback, Executor executor) {
             for (int i = 0; i < mDeviceStatus.size(); i++) {
-                String id = mDeviceStatus.keyAt(i);
+                DeviceCameraInfo info = mDeviceStatus.keyAt(i);
+                if (shouldHideCamera(callback.mDeviceId, callback.mDevicePolicy, info)) {
+                    continue;
+                }
+
                 Integer status = mDeviceStatus.valueAt(i);
-                postSingleUpdate(callback, executor, id, null /*physicalId*/, status);
+                postSingleUpdate(callback, executor, info.mCameraId, null /* physicalId */, status);
 
                 // Send the NOT_PRESENT state for unavailable physical cameras
                 if ((isAvailable(status) || physicalCallbacksAreEnabledForUnavailableCamera())
-                        && mUnavailablePhysicalDevices.containsKey(id)) {
-                    ArrayList<String> unavailableIds = mUnavailablePhysicalDevices.get(id);
+                        && mUnavailablePhysicalDevices.containsKey(info)) {
+                    List<String> unavailableIds = mUnavailablePhysicalDevices.get(info);
                     for (String unavailableId : unavailableIds) {
-                        postSingleUpdate(callback, executor, id, unavailableId,
+                        postSingleUpdate(callback, executor, info.mCameraId, unavailableId,
                                 ICameraServiceListener.STATUS_NOT_PRESENT);
                     }
                 }
-
             }
+
             for (int i = 0; i < mOpenedDevices.size(); i++) {
-                String id = mOpenedDevices.keyAt(i);
+                DeviceCameraInfo info = mOpenedDevices.keyAt(i);
+                if (shouldHideCamera(callback.mDeviceId, callback.mDevicePolicy, info)) {
+                    continue;
+                }
+
                 String clientPackageId = mOpenedDevices.valueAt(i);
-                postSingleCameraOpenedUpdate(callback, executor, id, clientPackageId);
+                postSingleCameraOpenedUpdate(callback, executor, info.mCameraId, clientPackageId);
             }
         }
 
-        private void onStatusChangedLocked(int status, String id) {
+        private void onStatusChangedLocked(int status, DeviceCameraInfo info) {
             if (DEBUG) {
                 Log.v(TAG,
-                        String.format("Camera id %s has status changed to 0x%x", id, status));
+                        String.format("Camera id %s has status changed to 0x%x for device %d",
+                                info.mCameraId, status, info.mDeviceId));
             }
 
             if (!validStatus(status)) {
-                Log.e(TAG, String.format("Ignoring invalid device %s status 0x%x", id,
-                                status));
+                Log.e(TAG, String.format("Ignoring invalid camera %s status 0x%x for device %d",
+                        info.mCameraId, status, info.mDeviceId));
                 return;
             }
 
             Integer oldStatus;
             if (status == ICameraServiceListener.STATUS_NOT_PRESENT) {
-                oldStatus = mDeviceStatus.remove(id);
-                mUnavailablePhysicalDevices.remove(id);
+                oldStatus = mDeviceStatus.remove(info);
+                mUnavailablePhysicalDevices.remove(info);
             } else {
-                oldStatus = mDeviceStatus.put(id, status);
+                oldStatus = mDeviceStatus.put(info, status);
                 if (oldStatus == null) {
-                    mUnavailablePhysicalDevices.put(id, new ArrayList<String>());
+                    mUnavailablePhysicalDevices.put(info, new ArrayList<>());
                 }
             }
 
@@ -2718,45 +2827,50 @@
 
             final int callbackCount = mCallbackMap.size();
             for (int i = 0; i < callbackCount; i++) {
-                Executor executor = mCallbackMap.valueAt(i);
                 final AvailabilityCallback callback = mCallbackMap.keyAt(i);
+                if (shouldHideCamera(callback.mDeviceId, callback.mDevicePolicy, info)) {
+                    continue;
+                }
 
-                postSingleUpdate(callback, executor, id, null /*physicalId*/, status);
+                final Executor executor = mCallbackMap.valueAt(i);
+                postSingleUpdate(callback, executor, info.mCameraId, null /* physicalId */, status);
 
                 // Send the NOT_PRESENT state for unavailable physical cameras
-                if (isAvailable(status) && mUnavailablePhysicalDevices.containsKey(id)) {
-                    ArrayList<String> unavailableIds = mUnavailablePhysicalDevices.get(id);
+                if (isAvailable(status) && mUnavailablePhysicalDevices.containsKey(info)) {
+                    List<String> unavailableIds = mUnavailablePhysicalDevices.get(info);
                     for (String unavailableId : unavailableIds) {
-                        postSingleUpdate(callback, executor, id, unavailableId,
+                        postSingleUpdate(callback, executor, info.mCameraId, unavailableId,
                                 ICameraServiceListener.STATUS_NOT_PRESENT);
                     }
                 }
             }
         } // onStatusChangedLocked
 
-        private void onPhysicalCameraStatusChangedLocked(int status,
-                String id, String physicalId) {
+        private void onPhysicalCameraStatusChangedLocked(int status, DeviceCameraInfo info,
+                String physicalId) {
             if (DEBUG) {
                 Log.v(TAG,
-                        String.format("Camera id %s physical camera id %s has status "
-                        + "changed to 0x%x", id, physicalId, status));
+                        String.format("Camera id %s physical camera id %s has status changed "
+                                + "to 0x%x for device %d", info.mCameraId, physicalId, status,
+                                info.mDeviceId));
             }
 
             if (!validStatus(status)) {
                 Log.e(TAG, String.format(
-                        "Ignoring invalid device %s physical device %s status 0x%x", id,
-                        physicalId, status));
+                        "Ignoring invalid device %s physical device %s status 0x%x for device %d",
+                        info.mCameraId, physicalId, status, info.mDeviceId));
                 return;
             }
 
             //TODO: Do we need to treat this as error?
-            if (!mDeviceStatus.containsKey(id) || !mUnavailablePhysicalDevices.containsKey(id)) {
+            if (!mDeviceStatus.containsKey(info)
+                    || !mUnavailablePhysicalDevices.containsKey(info)) {
                 Log.e(TAG, String.format("Camera %s is not present. Ignore physical camera "
-                        + "status change", id));
+                        + "status change", info.mCameraId));
                 return;
             }
 
-            ArrayList<String> unavailablePhysicalDevices = mUnavailablePhysicalDevices.get(id);
+            List<String> unavailablePhysicalDevices = mUnavailablePhysicalDevices.get(info);
             if (!isAvailable(status)
                     && !unavailablePhysicalDevices.contains(physicalId)) {
                 unavailablePhysicalDevices.add(physicalId);
@@ -2777,42 +2891,51 @@
             }
 
             if (!physicalCallbacksAreEnabledForUnavailableCamera()
-                    && !isAvailable(mDeviceStatus.get(id))) {
+                    && !isAvailable(mDeviceStatus.get(info))) {
                 Log.i(TAG, String.format("Camera %s is not available. Ignore physical camera "
-                        + "status change callback(s)", id));
+                        + "status change callback(s)", info.mCameraId));
                 return;
             }
 
             final int callbackCount = mCallbackMap.size();
             for (int i = 0; i < callbackCount; i++) {
-                Executor executor = mCallbackMap.valueAt(i);
                 final AvailabilityCallback callback = mCallbackMap.keyAt(i);
+                if (shouldHideCamera(callback.mDeviceId, callback.mDevicePolicy, info)) {
+                    continue;
+                }
 
-                postSingleUpdate(callback, executor, id, physicalId, status);
+                final Executor executor = mCallbackMap.valueAt(i);
+                postSingleUpdate(callback, executor, info.mCameraId, physicalId, status);
             }
         } // onPhysicalCameraStatusChangedLocked
 
         private void updateTorchCallbackLocked(TorchCallback callback, Executor executor) {
             for (int i = 0; i < mTorchStatus.size(); i++) {
-                String id = mTorchStatus.keyAt(i);
+                DeviceCameraInfo info = mTorchStatus.keyAt(i);
+                if (shouldHideCamera(callback.mDeviceId, callback.mDevicePolicy, info)) {
+                    continue;
+                }
+
                 Integer status = mTorchStatus.valueAt(i);
-                postSingleTorchUpdate(callback, executor, id, status);
+                postSingleTorchUpdate(callback, executor, info.mCameraId, status);
             }
         }
 
-        private void onTorchStatusChangedLocked(int status, String id) {
+        private void onTorchStatusChangedLocked(int status, DeviceCameraInfo info) {
             if (DEBUG) {
-                Log.v(TAG,
-                        String.format("Camera id %s has torch status changed to 0x%x", id, status));
+                Log.v(TAG, String.format(
+                        "Camera id %s has torch status changed to 0x%x for device %d",
+                        info.mCameraId, status, info.mDeviceId));
             }
 
             if (!validTorchStatus(status)) {
-                Log.e(TAG, String.format("Ignoring invalid device %s torch status 0x%x", id,
-                                status));
+                Log.e(TAG, String.format(
+                        "Ignoring invalid camera %s torch status 0x%x for device %d",
+                        info.mCameraId, status, info.mDeviceId));
                 return;
             }
 
-            Integer oldStatus = mTorchStatus.put(id, status);
+            Integer oldStatus = mTorchStatus.put(info, status);
             if (oldStatus != null && oldStatus == status) {
                 if (DEBUG) {
                     Log.v(TAG, String.format(
@@ -2824,25 +2947,34 @@
 
             final int callbackCount = mTorchCallbackMap.size();
             for (int i = 0; i < callbackCount; i++) {
-                final Executor executor = mTorchCallbackMap.valueAt(i);
                 final TorchCallback callback = mTorchCallbackMap.keyAt(i);
-                postSingleTorchUpdate(callback, executor, id, status);
+                if (shouldHideCamera(callback.mDeviceId, callback.mDevicePolicy, info)) {
+                    continue;
+                }
+
+                final Executor executor = mTorchCallbackMap.valueAt(i);
+                postSingleTorchUpdate(callback, executor, info.mCameraId, status);
             }
         } // onTorchStatusChangedLocked
 
-        private void onTorchStrengthLevelChangedLocked(String cameraId, int newStrengthLevel) {
+        private void onTorchStrengthLevelChangedLocked(DeviceCameraInfo info,
+                int newStrengthLevel) {
             if (DEBUG) {
-
-                Log.v(TAG,
-                        String.format("Camera id %s has torch strength level changed to %d",
-                            cameraId, newStrengthLevel));
+                Log.v(TAG, String.format(
+                        "Camera id %s has torch strength level changed to %d for device %d",
+                        info.mCameraId, newStrengthLevel, info.mDeviceId));
             }
 
             final int callbackCount = mTorchCallbackMap.size();
             for (int i = 0; i < callbackCount; i++) {
-                final Executor executor = mTorchCallbackMap.valueAt(i);
                 final TorchCallback callback = mTorchCallbackMap.keyAt(i);
-                postSingleTorchStrengthLevelUpdate(callback, executor, cameraId, newStrengthLevel);
+                if (shouldHideCamera(callback.mDeviceId, callback.mDevicePolicy, info)) {
+                    continue;
+                }
+
+                final Executor executor = mTorchCallbackMap.valueAt(i);
+                postSingleTorchStrengthLevelUpdate(callback, executor, info.mCameraId,
+                        newStrengthLevel);
             }
         } // onTorchStrengthLevelChanged
 
@@ -2856,13 +2988,16 @@
          *                                       onCameraOpened/onCameraClosed callback
          */
         public void registerAvailabilityCallback(AvailabilityCallback callback, Executor executor,
-                boolean hasOpenCloseListenerPermission) {
+                boolean hasOpenCloseListenerPermission, int deviceId, int devicePolicy) {
             synchronized (mLock) {
                 // In practice, this permission doesn't change. So we don't need one flag for each
                 // callback object.
                 mHasOpenCloseListenerPermission = hasOpenCloseListenerPermission;
                 connectCameraServiceLocked();
 
+                callback.mDeviceId = deviceId;
+                callback.mDevicePolicy = devicePolicy;
+
                 Executor oldExecutor = mCallbackMap.put(callback, executor);
                 // For new callbacks, provide initial availability information
                 if (oldExecutor == null) {
@@ -2888,10 +3023,14 @@
             }
         }
 
-        public void registerTorchCallback(TorchCallback callback, Executor executor) {
+        public void registerTorchCallback(TorchCallback callback, Executor executor, int deviceId,
+                int devicePolicy) {
             synchronized(mLock) {
                 connectCameraServiceLocked();
 
+                callback.mDeviceId = deviceId;
+                callback.mDevicePolicy = devicePolicy;
+
                 Executor oldExecutor = mTorchCallbackMap.put(callback, executor);
                 // For new callbacks, provide initial torch information
                 if (oldExecutor == null) {
@@ -2915,32 +3054,36 @@
          * Callback from camera service notifying the process about camera availability changes
          */
         @Override
-        public void onStatusChanged(int status, String cameraId) throws RemoteException {
+        public void onStatusChanged(int status, String cameraId, int deviceId)
+                throws RemoteException {
             synchronized(mLock) {
-                onStatusChangedLocked(status, cameraId);
+                onStatusChangedLocked(status, new DeviceCameraInfo(cameraId, deviceId));
             }
         }
 
         @Override
         public void onPhysicalCameraStatusChanged(int status, String cameraId,
-                String physicalCameraId) throws RemoteException {
+                String physicalCameraId, int deviceId) throws RemoteException {
             synchronized (mLock) {
-                onPhysicalCameraStatusChangedLocked(status, cameraId, physicalCameraId);
+                onPhysicalCameraStatusChangedLocked(status,
+                        new DeviceCameraInfo(cameraId, deviceId), physicalCameraId);
             }
         }
 
         @Override
-        public void onTorchStatusChanged(int status, String cameraId) throws RemoteException {
-            synchronized (mLock) {
-                onTorchStatusChangedLocked(status, cameraId);
-            }
-        }
-
-        @Override
-        public void onTorchStrengthLevelChanged(String cameraId, int newStrengthLevel)
+        public void onTorchStatusChanged(int status, String cameraId, int deviceId)
                 throws RemoteException {
             synchronized (mLock) {
-                onTorchStrengthLevelChangedLocked(cameraId, newStrengthLevel);
+                onTorchStatusChangedLocked(status, new DeviceCameraInfo(cameraId, deviceId));
+            }
+        }
+
+        @Override
+        public void onTorchStrengthLevelChanged(String cameraId, int newStrengthLevel, int deviceId)
+                throws RemoteException {
+            synchronized (mLock) {
+                onTorchStrengthLevelChangedLocked(new DeviceCameraInfo(cameraId, deviceId),
+                        newStrengthLevel);
             }
         }
 
@@ -2958,14 +3101,14 @@
         }
 
         @Override
-        public void onCameraOpened(String cameraId, String clientPackageId) {
+        public void onCameraOpened(String cameraId, String clientPackageId, int deviceId) {
             synchronized (mLock) {
-                onCameraOpenedLocked(cameraId, clientPackageId);
+                onCameraOpenedLocked(new DeviceCameraInfo(cameraId, deviceId), clientPackageId);
             }
         }
 
-        private void onCameraOpenedLocked(String cameraId, String clientPackageId) {
-            String oldApk = mOpenedDevices.put(cameraId, clientPackageId);
+        private void onCameraOpenedLocked(DeviceCameraInfo info, String clientPackageId) {
+            String oldApk = mOpenedDevices.put(info, clientPackageId);
 
             if (oldApk != null) {
                 if (oldApk.equals(clientPackageId)) {
@@ -2984,29 +3127,35 @@
 
             final int callbackCount = mCallbackMap.size();
             for (int i = 0; i < callbackCount; i++) {
-                Executor executor = mCallbackMap.valueAt(i);
                 final AvailabilityCallback callback = mCallbackMap.keyAt(i);
+                if (shouldHideCamera(callback.mDeviceId, callback.mDevicePolicy, info)) {
+                    continue;
+                }
 
-                postSingleCameraOpenedUpdate(callback, executor, cameraId, clientPackageId);
+                final Executor executor = mCallbackMap.valueAt(i);
+                postSingleCameraOpenedUpdate(callback, executor, info.mCameraId, clientPackageId);
             }
         }
 
         @Override
-        public void onCameraClosed(String cameraId) {
+        public void onCameraClosed(String cameraId, int deviceId) {
             synchronized (mLock) {
-                onCameraClosedLocked(cameraId);
+                onCameraClosedLocked(new DeviceCameraInfo(cameraId, deviceId));
             }
         }
 
-        private void onCameraClosedLocked(String cameraId) {
-            mOpenedDevices.remove(cameraId);
+        private void onCameraClosedLocked(DeviceCameraInfo info) {
+            mOpenedDevices.remove(info);
 
             final int callbackCount = mCallbackMap.size();
             for (int i = 0; i < callbackCount; i++) {
-                Executor executor = mCallbackMap.valueAt(i);
                 final AvailabilityCallback callback = mCallbackMap.keyAt(i);
+                if (shouldHideCamera(callback.mDeviceId, callback.mDevicePolicy, info)) {
+                    continue;
+                }
 
-                postSingleCameraClosedUpdate(callback, executor, cameraId);
+                final Executor executor = mCallbackMap.valueAt(i);
+                postSingleCameraClosedUpdate(callback, executor, info.mCameraId);
             }
         }
 
@@ -3062,17 +3211,18 @@
                 // Iterate from the end to the beginning because onStatusChangedLocked removes
                 // entries from the ArrayMap.
                 for (int i = mDeviceStatus.size() - 1; i >= 0; i--) {
-                    String cameraId = mDeviceStatus.keyAt(i);
-                    onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, cameraId);
+                    DeviceCameraInfo info = mDeviceStatus.keyAt(i);
+                    onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, info);
 
                     if (mHasOpenCloseListenerPermission) {
-                        onCameraClosedLocked(cameraId);
+                        onCameraClosedLocked(info);
                     }
                 }
+
                 for (int i = 0; i < mTorchStatus.size(); i++) {
-                    String cameraId = mTorchStatus.keyAt(i);
+                    DeviceCameraInfo info = mTorchStatus.keyAt(i);
                     onTorchStatusChangedLocked(ICameraServiceListener.TORCH_STATUS_NOT_AVAILABLE,
-                            cameraId);
+                            info);
                 }
 
                 mConcurrentCameraIdCombinations.clear();
@@ -3081,6 +3231,31 @@
             }
         }
 
-    } // CameraManagerGlobal
+        private static final class DeviceCameraInfo {
+            private final String mCameraId;
+            private final int mDeviceId;
 
+            DeviceCameraInfo(String cameraId, int deviceId) {
+                mCameraId = cameraId;
+                mDeviceId = deviceId;
+            }
+
+            @Override
+            public boolean equals(Object o) {
+                if (this == o) {
+                    return true;
+                }
+                if (o == null || getClass() != o.getClass()) {
+                    return false;
+                }
+                DeviceCameraInfo that = (DeviceCameraInfo) o;
+                return mDeviceId == that.mDeviceId && Objects.equals(mCameraId, that.mCameraId);
+            }
+
+            @Override
+            public int hashCode() {
+                return Objects.hash(mCameraId, mDeviceId);
+            }
+        }
+    } // CameraManagerGlobal
 } // CameraManager
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 6f901d7..735b20f 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -4454,13 +4454,4 @@
     /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
      * End generated code
      *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
-
-
-
-
-
-
-
-
-
 }
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 69b1c34..76287ca 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -6133,14 +6133,4 @@
     /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
      * End generated code
      *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
-
-
-
-
-
-
-
-
-
-
 }
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index 97c03ed..81bb9ac 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -290,6 +290,55 @@
         }
     };
 
+    private class ClientStateCallback extends StateCallback {
+        private final Executor mClientExecutor;
+        private final StateCallback mClientStateCallback;
+
+        private ClientStateCallback(@NonNull Executor clientExecutor,
+                @NonNull StateCallback clientStateCallback) {
+            mClientExecutor = clientExecutor;
+            mClientStateCallback = clientStateCallback;
+        }
+
+        public void onClosed(@NonNull CameraDevice camera) {
+            mClientExecutor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    mClientStateCallback.onClosed(camera);
+                }
+            });
+        }
+        @Override
+        public void onOpened(@NonNull CameraDevice camera) {
+            mClientExecutor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    mClientStateCallback.onOpened(camera);
+                }
+            });
+        }
+
+        @Override
+        public void onDisconnected(@NonNull CameraDevice camera) {
+            mClientExecutor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    mClientStateCallback.onDisconnected(camera);
+                }
+            });
+        }
+
+        @Override
+        public void onError(@NonNull CameraDevice camera, int error) {
+            mClientExecutor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    mClientStateCallback.onError(camera, error);
+                }
+            });
+        }
+    }
+
     public CameraDeviceImpl(String cameraId, StateCallback callback, Executor executor,
                         CameraCharacteristics characteristics,
                         Map<String, CameraCharacteristics> physicalIdsToChars,
@@ -300,8 +349,13 @@
             throw new IllegalArgumentException("Null argument given");
         }
         mCameraId = cameraId;
-        mDeviceCallback = callback;
-        mDeviceExecutor = executor;
+        if (Flags.singleThreadExecutor()) {
+            mDeviceCallback = new ClientStateCallback(executor, callback);
+            mDeviceExecutor = Executors.newSingleThreadExecutor();
+        } else {
+            mDeviceCallback = callback;
+            mDeviceExecutor = executor;
+        }
         mCharacteristics = characteristics;
         mPhysicalIdsToChars = physicalIdsToChars;
         mAppTargetSdkVersion = appTargetSdkVersion;
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java
index 9e01438..372839d 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package android.hardware.camera2.impl;
 
 import android.annotation.CallbackExecutor;
@@ -71,7 +72,8 @@
 
             try {
                 CameraMetadataNative defaultRequest = cameraService.createDefaultRequest(mCameraId,
-                        templateType);
+                        templateType, mContext.getDeviceId(),
+                        mCameraManager.getDevicePolicyFromContext(mContext));
                 CameraDeviceImpl.disableZslIfNeeded(defaultRequest, mTargetSdkVersion,
                         templateType);
 
@@ -102,8 +104,9 @@
             }
 
             try {
-                return cameraService.isSessionConfigurationWithParametersSupported(
-                        mCameraId, config);
+                return cameraService.isSessionConfigurationWithParametersSupported(mCameraId,
+                        mTargetSdkVersion, config, mContext.getDeviceId(),
+                        mCameraManager.getDevicePolicyFromContext(mContext));
             } catch (ServiceSpecificException e) {
                 throw ExceptionUtils.throwAsPublicException(e);
             } catch (RemoteException e) {
@@ -129,11 +132,14 @@
             }
 
             try {
-                CameraMetadataNative metadataNative = cameraService.getSessionCharacteristics(
+                CameraMetadataNative metadata = cameraService.getSessionCharacteristics(
                         mCameraId, mTargetSdkVersion,
-                        CameraManager.shouldOverrideToPortrait(mContext), sessionConfig);
+                        CameraManager.shouldOverrideToPortrait(mContext), sessionConfig,
+                        mContext.getDeviceId(),
+                        mCameraManager.getDevicePolicyFromContext(mContext));
 
-                return new CameraCharacteristics(metadataNative);
+                return mCameraManager.prepareCameraCharacteristics(mCameraId, metadata,
+                        cameraService);
             } catch (ServiceSpecificException e) {
                 switch (e.errorCode) {
                     case ICameraService.ERROR_INVALID_OPERATION ->
diff --git a/core/java/android/hardware/devicestate/DeviceState.java b/core/java/android/hardware/devicestate/DeviceState.java
index 689e343..e583627 100644
--- a/core/java/android/hardware/devicestate/DeviceState.java
+++ b/core/java/android/hardware/devicestate/DeviceState.java
@@ -333,14 +333,12 @@
         private final ArraySet<@PhysicalDeviceStateProperties Integer> mPhysicalProperties;
 
         private Configuration(int identifier, @NonNull String name,
-                @NonNull Set<@SystemDeviceStateProperties Integer> systemProperties,
-                @NonNull Set<@PhysicalDeviceStateProperties Integer> physicalProperties) {
+                @NonNull ArraySet<@SystemDeviceStateProperties Integer> systemProperties,
+                @NonNull ArraySet<@PhysicalDeviceStateProperties Integer> physicalProperties) {
             mIdentifier = identifier;
             mName = name;
-            mSystemProperties = new ArraySet<@SystemDeviceStateProperties Integer>(
-                    systemProperties);
-            mPhysicalProperties = new ArraySet<@PhysicalDeviceStateProperties Integer>(
-                    physicalProperties);
+            mSystemProperties = systemProperties;
+            mPhysicalProperties = physicalProperties;
         }
 
         /** Returns the unique identifier for the device state. */
@@ -401,16 +399,8 @@
         public void writeToParcel(@NonNull Parcel dest, int flags) {
             dest.writeInt(mIdentifier);
             dest.writeString8(mName);
-
-            dest.writeInt(mSystemProperties.size());
-            for (int i = 0; i < mSystemProperties.size(); i++) {
-                dest.writeInt(mSystemProperties.valueAt(i));
-            }
-
-            dest.writeInt(mPhysicalProperties.size());
-            for (int i = 0; i < mPhysicalProperties.size(); i++) {
-                dest.writeInt(mPhysicalProperties.valueAt(i));
-            }
+            dest.writeArraySet(mSystemProperties);
+            dest.writeArraySet(mPhysicalProperties);
         }
 
         @NonNull
@@ -419,16 +409,11 @@
             public DeviceState.Configuration createFromParcel(Parcel source) {
                 int identifier = source.readInt();
                 String name = source.readString8();
-                ArraySet<@DeviceStateProperties Integer> systemProperties = new ArraySet<>();
-                int systemPropertySize = source.readInt();
-                for (int i = 0; i < systemPropertySize; i++) {
-                    systemProperties.add(source.readInt());
-                }
-                ArraySet<@DeviceStateProperties Integer> physicalProperties = new ArraySet<>();
-                int physicalPropertySize = source.readInt();
-                for (int j = 0; j < physicalPropertySize; j++) {
-                    physicalProperties.add(source.readInt());
-                }
+                ArraySet<@SystemDeviceStateProperties Integer> systemProperties =
+                        (ArraySet<Integer>) source.readArraySet(null /* classLoader */);
+                ArraySet<@PhysicalDeviceStateProperties Integer> physicalProperties =
+                        (ArraySet<Integer>) source.readArraySet(null /* classLoader */);
+
                 return new DeviceState.Configuration(identifier, name, systemProperties,
                         physicalProperties);
             }
@@ -479,8 +464,8 @@
              */
             @NonNull
             public DeviceState.Configuration build() {
-                return new DeviceState.Configuration(mIdentifier, mName, mSystemProperties,
-                        mPhysicalProperties);
+                return new DeviceState.Configuration(mIdentifier, mName,
+                        new ArraySet<>(mSystemProperties), new ArraySet<>(mPhysicalProperties));
             }
         }
     }
diff --git a/core/java/android/hardware/devicestate/DeviceStateInfo.java b/core/java/android/hardware/devicestate/DeviceStateInfo.java
index c319c89..28561ec 100644
--- a/core/java/android/hardware/devicestate/DeviceStateInfo.java
+++ b/core/java/android/hardware/devicestate/DeviceStateInfo.java
@@ -25,7 +25,6 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
-import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.Executor;
 
@@ -77,9 +76,11 @@
      * NOTE: Unlike {@link #DeviceStateInfo(DeviceStateInfo)}, this constructor does not copy the
      * supplied parameters.
      */
-    public DeviceStateInfo(@NonNull List<DeviceState> supportedStates, DeviceState baseState,
+    // Using the specific types to avoid virtual method calls in binder transactions
+    @SuppressWarnings("NonApiType")
+    public DeviceStateInfo(@NonNull ArrayList<DeviceState> supportedStates, DeviceState baseState,
             DeviceState state) {
-        this.supportedStates = new ArrayList<>(supportedStates);
+        this.supportedStates = supportedStates;
         this.baseState = baseState;
         this.currentState = state;
     }
@@ -89,13 +90,13 @@
      * the fields of the returned instance.
      */
     public DeviceStateInfo(@NonNull DeviceStateInfo info) {
-        this(List.copyOf(info.supportedStates), info.baseState, info.currentState);
+        this(new ArrayList<>(info.supportedStates), info.baseState, info.currentState);
     }
 
     @Override
     public boolean equals(@Nullable Object other) {
         if (this == other) return true;
-        if (other == null || getClass() != other.getClass()) return false;
+        if (other == null || (getClass() != other.getClass())) return false;
         DeviceStateInfo that = (DeviceStateInfo) other;
         return baseState.equals(that.baseState)
                 &&  currentState.equals(that.currentState)
diff --git a/core/java/android/hardware/devicestate/OWNERS b/core/java/android/hardware/devicestate/OWNERS
new file mode 100644
index 0000000..d9b0e2e
--- /dev/null
+++ b/core/java/android/hardware/devicestate/OWNERS
@@ -0,0 +1 @@
+include /services/core/java/com/android/server/devicestate/OWNERS
diff --git a/core/java/android/hardware/display/ColorDisplayManager.java b/core/java/android/hardware/display/ColorDisplayManager.java
index f927b8b..0d9db1f 100644
--- a/core/java/android/hardware/display/ColorDisplayManager.java
+++ b/core/java/android/hardware/display/ColorDisplayManager.java
@@ -37,6 +37,7 @@
 import com.android.internal.R;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.server.display.feature.flags.Flags;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -533,11 +534,15 @@
 
     /**
      * Returns {@code true} if reduce bright colors is supported by the device.
+     * Will return false if even dimmer is enabled - since this is the successor to RBC and cannot
+     * be run concurrently.
      *
      * @hide
      */
     public static boolean isReduceBrightColorsAvailable(Context context) {
-        return context.getResources().getBoolean(R.bool.config_reduceBrightColorsAvailable);
+        return context.getResources().getBoolean(R.bool.config_reduceBrightColorsAvailable)
+                && !(Flags.evenDimmer() && context.getResources().getBoolean(
+                com.android.internal.R.bool.config_evenDimmerEnabled));
     }
 
     /**
diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java
index 58aafbc..ec67212 100644
--- a/core/java/android/hardware/display/DisplayManagerInternal.java
+++ b/core/java/android/hardware/display/DisplayManagerInternal.java
@@ -498,6 +498,7 @@
         // Overrides the policy for adjusting screen brightness and state while dozing.
         public int dozeScreenState;
         public float dozeScreenBrightness;
+        public int dozeScreenStateReason;
 
         public DisplayPowerRequest() {
             policy = POLICY_BRIGHT;
@@ -508,6 +509,7 @@
             blockScreenOn = false;
             dozeScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
             dozeScreenState = Display.STATE_UNKNOWN;
+            dozeScreenStateReason = Display.STATE_REASON_UNKNOWN;
         }
 
         public DisplayPowerRequest(DisplayPowerRequest other) {
@@ -529,6 +531,7 @@
             boostScreenBrightness = other.boostScreenBrightness;
             dozeScreenBrightness = other.dozeScreenBrightness;
             dozeScreenState = other.dozeScreenState;
+            dozeScreenStateReason = other.dozeScreenStateReason;
         }
 
         @Override
@@ -551,7 +554,8 @@
                     && lowPowerMode == other.lowPowerMode
                     && boostScreenBrightness == other.boostScreenBrightness
                     && floatEquals(dozeScreenBrightness, other.dozeScreenBrightness)
-                    && dozeScreenState == other.dozeScreenState;
+                    && dozeScreenState == other.dozeScreenState
+                    && dozeScreenStateReason == other.dozeScreenStateReason;
         }
 
         private boolean floatEquals(float f1, float f2) {
@@ -575,7 +579,9 @@
                     + ", lowPowerMode=" + lowPowerMode
                     + ", boostScreenBrightness=" + boostScreenBrightness
                     + ", dozeScreenBrightness=" + dozeScreenBrightness
-                    + ", dozeScreenState=" + Display.stateToString(dozeScreenState);
+                    + ", dozeScreenState=" + Display.stateToString(dozeScreenState)
+                    + ", dozeScreenStateReason="
+                            + Display.stateReasonToString(dozeScreenStateReason);
         }
 
         public static String policyToString(int policy) {
diff --git a/core/java/android/hardware/face/FaceSensorConfigurations.java b/core/java/android/hardware/face/FaceSensorConfigurations.java
index 6ef692f..1247168 100644
--- a/core/java/android/hardware/face/FaceSensorConfigurations.java
+++ b/core/java/android/hardware/face/FaceSensorConfigurations.java
@@ -22,11 +22,12 @@
 import android.content.Context;
 import android.hardware.biometrics.face.IFace;
 import android.hardware.biometrics.face.SensorProps;
+import android.os.Binder;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.util.Log;
-import android.util.Pair;
 import android.util.Slog;
 
 import androidx.annotation.NonNull;
@@ -36,7 +37,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.function.Function;
 
 /**
  * Provides the sensor props for face sensor, if available.
@@ -74,22 +74,10 @@
     /**
      * Process AIDL instances to extract sensor props and add it to the sensor map.
      * @param aidlInstances available face AIDL instances
-     * @param getIFace function that provides the daemon for the specific instance
      */
-    public void addAidlConfigs(@NonNull String[] aidlInstances,
-            @NonNull Function<String, IFace> getIFace) {
+    public void addAidlConfigs(@NonNull String[] aidlInstances) {
         for (String aidlInstance : aidlInstances) {
-            final String fqName = IFace.DESCRIPTOR + "/" + aidlInstance;
-            IFace face = getIFace.apply(fqName);
-            try {
-                if (face != null) {
-                    mSensorPropsMap.put(aidlInstance, face.getSensorProps());
-                } else {
-                    Slog.e(TAG, "Unable to get declared service: " + fqName);
-                }
-            } catch (RemoteException e) {
-                Log.d(TAG, "Unable to get sensor properties!");
-            }
+            mSensorPropsMap.put(aidlInstance, null);
         }
     }
 
@@ -131,38 +119,31 @@
     }
 
     /**
-     * Return sensor props for the given instance. If instance is not available,
-     * then null is returned.
+     * Checks if {@param instance} exists.
      */
     @Nullable
-    public Pair<String, SensorProps[]> getSensorPairForInstance(String instance) {
-        if (mSensorPropsMap.containsKey(instance)) {
-            return new Pair<>(instance, mSensorPropsMap.get(instance));
-        }
-
-        return null;
+    public boolean doesInstanceExist(String instance) {
+        return mSensorPropsMap.containsKey(instance);
     }
 
     /**
-     * Return the first pair of instance and sensor props, which does not correspond to the given
-     * If instance is not available, then null is returned.
+     * Return the first HAL instance, which does not correspond to the given {@param instance}.
+     * If another instance is not available, then null is returned.
      */
     @Nullable
-    public Pair<String, SensorProps[]> getSensorPairNotForInstance(String instance) {
+    public String getSensorNameNotForInstance(String instance) {
         Optional<String> notAVirtualInstance = mSensorPropsMap.keySet().stream().filter(
                 (instanceName) -> !instanceName.equals(instance)).findFirst();
-        return notAVirtualInstance.map(this::getSensorPairForInstance).orElseGet(
-                this::getSensorPair);
+        return notAVirtualInstance.orElse(null);
     }
 
     /**
-     * Returns the first pair of instance and sensor props that has been added to the map.
+     * Returns the first instance that has been added to the map.
      */
     @Nullable
-    public Pair<String, SensorProps[]> getSensorPair() {
+    public String getSensorInstance() {
         Optional<String> optionalInstance = mSensorPropsMap.keySet().stream().findFirst();
-        return optionalInstance.map(this::getSensorPairForInstance).orElse(null);
-
+        return optionalInstance.orElse(null);
     }
 
     public boolean getResetLockoutRequiresChallenge() {
@@ -179,4 +160,31 @@
         dest.writeByte((byte) (mResetLockoutRequiresChallenge ? 1 : 0));
         dest.writeMap(mSensorPropsMap);
     }
+
+    /**
+     * Returns face sensor props for the HAL {@param instance}.
+     */
+    @Nullable
+    public SensorProps[] getSensorPropForInstance(String instance) {
+        SensorProps[] props = mSensorPropsMap.get(instance);
+
+        //Props should not be null for HIDL configs
+        if (props != null) {
+            return props;
+        }
+
+        final String fqName = IFace.DESCRIPTOR + "/" + instance;
+        IFace face = IFace.Stub.asInterface(Binder.allowBlocking(
+                ServiceManager.waitForDeclaredService(fqName)));
+        try {
+            if (face != null) {
+                props = face.getSensorProps();
+            } else {
+                Slog.e(TAG, "Unable to get declared service: " + fqName);
+            }
+        } catch (RemoteException e) {
+            Log.d(TAG, "Unable to get sensor properties!");
+        }
+        return props;
+    }
 }
diff --git a/core/java/android/hardware/fingerprint/FingerprintSensorConfigurations.java b/core/java/android/hardware/fingerprint/FingerprintSensorConfigurations.java
index f214494a..43c0da9 100644
--- a/core/java/android/hardware/fingerprint/FingerprintSensorConfigurations.java
+++ b/core/java/android/hardware/fingerprint/FingerprintSensorConfigurations.java
@@ -23,18 +23,18 @@
 import android.content.Context;
 import android.hardware.biometrics.fingerprint.IFingerprint;
 import android.hardware.biometrics.fingerprint.SensorProps;
+import android.os.Binder;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.util.Log;
-import android.util.Pair;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.function.Function;
 
 /**
  * Provides the sensor props for fingerprint sensor, if available.
@@ -68,23 +68,10 @@
     /**
      * Process AIDL instances to extract sensor props and add it to the sensor map.
      * @param aidlInstances available face AIDL instances
-     * @param getIFingerprint function that provides the daemon for the specific instance
      */
-    public void addAidlSensors(@NonNull String[] aidlInstances,
-            @NonNull Function<String, IFingerprint> getIFingerprint) {
+    public void addAidlSensors(@NonNull String[] aidlInstances) {
         for (String aidlInstance : aidlInstances) {
-            try {
-                final String fqName = IFingerprint.DESCRIPTOR + "/" + aidlInstance;
-                final IFingerprint fp = getIFingerprint.apply(fqName);
-                if (fp != null) {
-                    SensorProps[] props = fp.getSensorProps();
-                    mSensorPropsMap.put(aidlInstance, props);
-                } else {
-                    Log.d(TAG, "IFingerprint null for instance " + aidlInstance);
-                }
-            } catch (RemoteException e) {
-                Log.d(TAG, "Unable to get sensor properties!");
-            }
+            mSensorPropsMap.put(aidlInstance, null);
         }
     }
 
@@ -133,38 +120,31 @@
     }
 
     /**
-     * Return sensor props for the given instance. If instance is not available,
-     * then null is returned.
+     * Checks if {@param instance} exists.
      */
     @Nullable
-    public Pair<String, SensorProps[]> getSensorPairForInstance(String instance) {
-        if (mSensorPropsMap.containsKey(instance)) {
-            return new Pair<>(instance, mSensorPropsMap.get(instance));
-        }
-
-        return null;
+    public boolean doesInstanceExist(String instance) {
+        return mSensorPropsMap.containsKey(instance);
     }
 
     /**
-     * Return the first pair of instance and sensor props, which does not correspond to the given
-     * If instance is not available, then null is returned.
+     * Return the first HAL instance, which does not correspond to the given {@param instance}.
+     * If another instance is not available, then null is returned.
      */
     @Nullable
-    public Pair<String, SensorProps[]> getSensorPairNotForInstance(String instance) {
+    public String getSensorNameNotForInstance(String instance) {
         Optional<String> notAVirtualInstance = mSensorPropsMap.keySet().stream().filter(
                 (instanceName) -> !instanceName.equals(instance)).findFirst();
-        return notAVirtualInstance.map(this::getSensorPairForInstance).orElseGet(
-                this::getSensorPair);
+        return notAVirtualInstance.orElse(null);
     }
 
     /**
-     * Returns the first pair of instance and sensor props that has been added to the map.
+     * Returns the first instance that has been added to the map.
      */
     @Nullable
-    public Pair<String, SensorProps[]> getSensorPair() {
+    public String getSensorInstance() {
         Optional<String> optionalInstance = mSensorPropsMap.keySet().stream().findFirst();
-        return optionalInstance.map(this::getSensorPairForInstance).orElse(null);
-
+        return optionalInstance.orElse(null);
     }
 
     public boolean getResetLockoutRequiresHardwareAuthToken() {
@@ -181,4 +161,31 @@
         dest.writeByte((byte) (mResetLockoutRequiresHardwareAuthToken ? 1 : 0));
         dest.writeMap(mSensorPropsMap);
     }
+
+    /**
+     * Returns fingerprint sensor props for the HAL {@param instance}.
+     */
+    @Nullable
+    public SensorProps[] getSensorPropForInstance(String instance) {
+        SensorProps[] props = mSensorPropsMap.get(instance);
+
+        //Props should not be null for HIDL configs
+        if (props != null) {
+            return props;
+        }
+
+        try {
+            final String fqName = IFingerprint.DESCRIPTOR + "/" + instance;
+            final IFingerprint fp = IFingerprint.Stub.asInterface(Binder.allowBlocking(
+                    ServiceManager.waitForDeclaredService(fqName)));
+            if (fp != null) {
+                props = fp.getSensorProps();
+            } else {
+                Log.d(TAG, "IFingerprint null for instance " + instance);
+            }
+        } catch (RemoteException e) {
+            Log.d(TAG, "Unable to get sensor properties!");
+        }
+        return props;
+    }
 }
diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java
index 09741e52..ac043d3 100644
--- a/core/java/android/hardware/hdmi/HdmiControlManager.java
+++ b/core/java/android/hardware/hdmi/HdmiControlManager.java
@@ -139,6 +139,16 @@
     public static final String EXTRA_LOCALE = "android.hardware.hdmi.extra.LOCALE";
 
     /**
+     * Broadcast Action: Active Source status was recovered by the device.
+     * <p>Send when device becomes the current active source such that the activity
+     * HdmiCecActiveSourceLostActivity can be finished and cleared from the screen.
+     * <p>Requires {@link android.Manifest.permission#HDMI_CEC} to receive.
+     * @hide
+     */
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+    public static final String ACTION_ON_ACTIVE_SOURCE_RECOVERED_DISMISS_UI =
+            "android.hardware.hdmi.action.ON_ACTIVE_SOURCE_RECOVERED_DISMISS_UI";
+    /**
      * Volume value for mute state.
      */
     public static final int AVR_VOLUME_MUTED = 101;
diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl
index 2816f77..1c37aa2 100644
--- a/core/java/android/hardware/input/IInputManager.aidl
+++ b/core/java/android/hardware/input/IInputManager.aidl
@@ -94,33 +94,8 @@
     // Keyboard layouts configuration.
     KeyboardLayout[] getKeyboardLayouts();
 
-    KeyboardLayout[] getKeyboardLayoutsForInputDevice(in InputDeviceIdentifier identifier);
-
     KeyboardLayout getKeyboardLayout(String keyboardLayoutDescriptor);
 
-    String getCurrentKeyboardLayoutForInputDevice(in InputDeviceIdentifier identifier);
-
-    @EnforcePermission("SET_KEYBOARD_LAYOUT")
-    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
-            + "android.Manifest.permission.SET_KEYBOARD_LAYOUT)")
-    void setCurrentKeyboardLayoutForInputDevice(in InputDeviceIdentifier identifier,
-            String keyboardLayoutDescriptor);
-
-    String[] getEnabledKeyboardLayoutsForInputDevice(in InputDeviceIdentifier identifier);
-
-    @EnforcePermission("SET_KEYBOARD_LAYOUT")
-    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
-            + "android.Manifest.permission.SET_KEYBOARD_LAYOUT)")
-    void addKeyboardLayoutForInputDevice(in InputDeviceIdentifier identifier,
-            String keyboardLayoutDescriptor);
-
-    @EnforcePermission("SET_KEYBOARD_LAYOUT")
-    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
-            + "android.Manifest.permission.SET_KEYBOARD_LAYOUT)")
-    void removeKeyboardLayoutForInputDevice(in InputDeviceIdentifier identifier,
-            String keyboardLayoutDescriptor);
-
-    // New Keyboard layout config APIs
     KeyboardLayoutSelectionResult getKeyboardLayoutForInputDevice(
             in InputDeviceIdentifier identifier, int userId, in InputMethodInfo imeInfo,
             in InputMethodSubtype imeSubtype);
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index a1242fb..f949158 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -473,22 +473,21 @@
     }
 
     /**
-     * Returns the descriptors of all supported keyboard layouts appropriate for the specified
-     * input device.
+     * Returns the descriptors of all supported keyboard layouts.
      * <p>
      * The input manager consults the built-in keyboard layouts as well as all keyboard layouts
      * advertised by applications using a {@link #ACTION_QUERY_KEYBOARD_LAYOUTS} broadcast receiver.
      * </p>
      *
-     * @param device The input device to query.
      * @return The ids of all keyboard layouts which are supported by the specified input device.
      *
      * @hide
      */
     @TestApi
     @NonNull
-    public List<String> getKeyboardLayoutDescriptorsForInputDevice(@NonNull InputDevice device) {
-        KeyboardLayout[] layouts = getKeyboardLayoutsForInputDevice(device.getIdentifier());
+    @SuppressLint("UnflaggedApi")
+    public List<String> getKeyboardLayoutDescriptors() {
+        KeyboardLayout[] layouts = getKeyboardLayouts();
         List<String> res = new ArrayList<>();
         for (KeyboardLayout kl : layouts) {
             res.add(kl.getDescriptor());
@@ -511,33 +510,18 @@
     @TestApi
     @NonNull
     public String getKeyboardLayoutTypeForLayoutDescriptor(@NonNull String layoutDescriptor) {
-        KeyboardLayout[] layouts = getKeyboardLayouts();
-        for (KeyboardLayout kl : layouts) {
-            if (layoutDescriptor.equals(kl.getDescriptor())) {
-                return kl.getLayoutType();
-            }
-        }
-        return "";
+        KeyboardLayout layout = getKeyboardLayout(layoutDescriptor);
+        return layout == null ? "" : layout.getLayoutType();
     }
 
     /**
-     * Gets information about all supported keyboard layouts appropriate
-     * for a specific input device.
-     * <p>
-     * The input manager consults the built-in keyboard layouts as well
-     * as all keyboard layouts advertised by applications using a
-     * {@link #ACTION_QUERY_KEYBOARD_LAYOUTS} broadcast receiver.
-     * </p>
-     *
-     * @return A list of all supported keyboard layouts for a specific
-     * input device.
-     *
+     * TODO(b/330517633): Cleanup the unsupported API
      * @hide
      */
     @NonNull
     public KeyboardLayout[] getKeyboardLayoutsForInputDevice(
             @NonNull InputDeviceIdentifier identifier) {
-        return mGlobal.getKeyboardLayoutsForInputDevice(identifier);
+        return new KeyboardLayout[0];
     }
 
     /**
@@ -549,6 +533,7 @@
      *
      * @hide
      */
+    @Nullable
     public KeyboardLayout getKeyboardLayout(String keyboardLayoutDescriptor) {
         if (keyboardLayoutDescriptor == null) {
             throw new IllegalArgumentException("keyboardLayoutDescriptor must not be null");
@@ -562,121 +547,45 @@
     }
 
     /**
-     * Gets the current keyboard layout descriptor for the specified input device.
-     *
-     * @param identifier Identifier for the input device
-     * @return The keyboard layout descriptor, or null if no keyboard layout has been set.
-     *
+     * TODO(b/330517633): Cleanup the unsupported API
      * @hide
      */
-    @TestApi
     @Nullable
     public String getCurrentKeyboardLayoutForInputDevice(
             @NonNull InputDeviceIdentifier identifier) {
-        try {
-            return mIm.getCurrentKeyboardLayoutForInputDevice(identifier);
-        } catch (RemoteException ex) {
-            throw ex.rethrowFromSystemServer();
-        }
+        return null;
     }
 
     /**
-     * Sets the current keyboard layout descriptor for the specified input device.
-     * <p>
-     * This method may have the side-effect of causing the input device in question to be
-     * reconfigured.
-     * </p>
-     *
-     * @param identifier The identifier for the input device.
-     * @param keyboardLayoutDescriptor The keyboard layout descriptor to use, must not be null.
-     *
+     * TODO(b/330517633): Cleanup the unsupported API
      * @hide
      */
-    @TestApi
-    @RequiresPermission(Manifest.permission.SET_KEYBOARD_LAYOUT)
     public void setCurrentKeyboardLayoutForInputDevice(@NonNull InputDeviceIdentifier identifier,
-            @NonNull String keyboardLayoutDescriptor) {
-        mGlobal.setCurrentKeyboardLayoutForInputDevice(identifier,
-                keyboardLayoutDescriptor);
-    }
+            @NonNull String keyboardLayoutDescriptor) {}
 
     /**
-     * Gets all keyboard layout descriptors that are enabled for the specified input device.
-     *
-     * @param identifier The identifier for the input device.
-     * @return The keyboard layout descriptors.
-     *
+     * TODO(b/330517633): Cleanup the unsupported API
      * @hide
      */
     public String[] getEnabledKeyboardLayoutsForInputDevice(InputDeviceIdentifier identifier) {
-        if (identifier == null) {
-            throw new IllegalArgumentException("inputDeviceDescriptor must not be null");
-        }
-
-        try {
-            return mIm.getEnabledKeyboardLayoutsForInputDevice(identifier);
-        } catch (RemoteException ex) {
-            throw ex.rethrowFromSystemServer();
-        }
+        return new String[0];
     }
 
     /**
-     * Adds the keyboard layout descriptor for the specified input device.
-     * <p>
-     * This method may have the side-effect of causing the input device in question to be
-     * reconfigured.
-     * </p>
-     *
-     * @param identifier The identifier for the input device.
-     * @param keyboardLayoutDescriptor The descriptor of the keyboard layout to add.
-     *
+     * TODO(b/330517633): Cleanup the unsupported API
      * @hide
      */
-    @RequiresPermission(Manifest.permission.SET_KEYBOARD_LAYOUT)
     public void addKeyboardLayoutForInputDevice(InputDeviceIdentifier identifier,
             String keyboardLayoutDescriptor) {
-        if (identifier == null) {
-            throw new IllegalArgumentException("inputDeviceDescriptor must not be null");
-        }
-        if (keyboardLayoutDescriptor == null) {
-            throw new IllegalArgumentException("keyboardLayoutDescriptor must not be null");
-        }
-
-        try {
-            mIm.addKeyboardLayoutForInputDevice(identifier, keyboardLayoutDescriptor);
-        } catch (RemoteException ex) {
-            throw ex.rethrowFromSystemServer();
-        }
     }
 
     /**
-     * Removes the keyboard layout descriptor for the specified input device.
-     * <p>
-     * This method may have the side-effect of causing the input device in question to be
-     * reconfigured.
-     * </p>
-     *
-     * @param identifier The identifier for the input device.
-     * @param keyboardLayoutDescriptor The descriptor of the keyboard layout to remove.
-     *
+     * TODO(b/330517633): Cleanup the unsupported API
      * @hide
      */
-    @TestApi
     @RequiresPermission(Manifest.permission.SET_KEYBOARD_LAYOUT)
     public void removeKeyboardLayoutForInputDevice(@NonNull InputDeviceIdentifier identifier,
             @NonNull String keyboardLayoutDescriptor) {
-        if (identifier == null) {
-            throw new IllegalArgumentException("inputDeviceDescriptor must not be null");
-        }
-        if (keyboardLayoutDescriptor == null) {
-            throw new IllegalArgumentException("keyboardLayoutDescriptor must not be null");
-        }
-
-        try {
-            mIm.removeKeyboardLayoutForInputDevice(identifier, keyboardLayoutDescriptor);
-        } catch (RemoteException ex) {
-            throw ex.rethrowFromSystemServer();
-        }
     }
 
     /**
diff --git a/core/java/android/hardware/input/InputManagerGlobal.java b/core/java/android/hardware/input/InputManagerGlobal.java
index 7c104a0..7b29666 100644
--- a/core/java/android/hardware/input/InputManagerGlobal.java
+++ b/core/java/android/hardware/input/InputManagerGlobal.java
@@ -1068,36 +1068,21 @@
     }
 
     /**
-     * @see InputManager#getKeyboardLayoutsForInputDevice(InputDeviceIdentifier)
+     * TODO(b/330517633): Cleanup the unsupported API
      */
     @NonNull
     public KeyboardLayout[] getKeyboardLayoutsForInputDevice(
             @NonNull InputDeviceIdentifier identifier) {
-        try {
-            return mIm.getKeyboardLayoutsForInputDevice(identifier);
-        } catch (RemoteException ex) {
-            throw ex.rethrowFromSystemServer();
-        }
+        return new KeyboardLayout[0];
     }
 
     /**
-     * @see InputManager#setCurrentKeyboardLayoutForInputDevice
-     * (InputDeviceIdentifier, String)
+     * TODO(b/330517633): Cleanup the unsupported API
      */
-    @RequiresPermission(Manifest.permission.SET_KEYBOARD_LAYOUT)
     public void setCurrentKeyboardLayoutForInputDevice(
             @NonNull InputDeviceIdentifier identifier,
-            @NonNull String keyboardLayoutDescriptor) {
-        Objects.requireNonNull(identifier, "identifier must not be null");
-        Objects.requireNonNull(keyboardLayoutDescriptor,
-                "keyboardLayoutDescriptor must not be null");
-        try {
-            mIm.setCurrentKeyboardLayoutForInputDevice(identifier,
-                    keyboardLayoutDescriptor);
-        } catch (RemoteException ex) {
-            throw ex.rethrowFromSystemServer();
-        }
-    }
+            @NonNull String keyboardLayoutDescriptor) {}
+
 
     /**
      * @see InputDevice#getSensorManager()
diff --git a/core/java/android/hardware/input/InputSettings.java b/core/java/android/hardware/input/InputSettings.java
index 4328d9f..4c5ebe7 100644
--- a/core/java/android/hardware/input/InputSettings.java
+++ b/core/java/android/hardware/input/InputSettings.java
@@ -16,6 +16,9 @@
 
 package android.hardware.input;
 
+import static com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG;
+import static com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG;
+import static com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG;
 import static com.android.hardware.input.Flags.keyboardA11yBounceKeysFlag;
 import static com.android.hardware.input.Flags.keyboardA11ySlowKeysFlag;
 import static com.android.hardware.input.Flags.keyboardA11yStickyKeysFlag;
@@ -23,6 +26,7 @@
 import static com.android.input.flags.Flags.enableInputFilterRustImpl;
 
 import android.Manifest;
+import android.annotation.FlaggedApi;
 import android.annotation.FloatRange;
 import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
@@ -465,6 +469,8 @@
      *
      * @hide
      */
+    @TestApi
+    @FlaggedApi(FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG)
     public static int getAccessibilityBounceKeysThreshold(@NonNull Context context) {
         if (!isAccessibilityBounceKeysFeatureEnabled()) {
             return 0;
@@ -487,6 +493,8 @@
      *
      * @hide
      */
+    @TestApi
+    @FlaggedApi(FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG)
     @RequiresPermission(Manifest.permission.WRITE_SETTINGS)
     public static void setAccessibilityBounceKeysThreshold(@NonNull Context context,
             int thresholdTimeMillis) {
@@ -545,6 +553,8 @@
      *
      * @hide
      */
+    @TestApi
+    @FlaggedApi(FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG)
     public static int getAccessibilitySlowKeysThreshold(@NonNull Context context) {
         if (!isAccessibilitySlowKeysFeatureFlagEnabled()) {
             return 0;
@@ -567,6 +577,8 @@
      *
      * @hide
      */
+    @TestApi
+    @FlaggedApi(FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG)
     @RequiresPermission(Manifest.permission.WRITE_SETTINGS)
     public static void setAccessibilitySlowKeysThreshold(@NonNull Context context,
             int thresholdTimeMillis) {
@@ -614,6 +626,8 @@
      *
      * @hide
      */
+    @TestApi
+    @FlaggedApi(FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG)
     public static boolean isAccessibilityStickyKeysEnabled(@NonNull Context context) {
         if (!isAccessibilityStickyKeysFeatureEnabled()) {
             return false;
@@ -635,6 +649,8 @@
      *
      * @hide
      */
+    @TestApi
+    @FlaggedApi(FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG)
     @RequiresPermission(Manifest.permission.WRITE_SETTINGS)
     public static void setAccessibilityStickyKeysEnabled(@NonNull Context context,
             boolean enabled) {
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 4dbdd91..cbfc5d1 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -16,6 +16,7 @@
 
 package android.inputmethodservice;
 
+import static android.view.inputmethod.Flags.predictiveBackIme;
 import static android.inputmethodservice.InputMethodServiceProto.CANDIDATES_VIEW_STARTED;
 import static android.inputmethodservice.InputMethodServiceProto.CANDIDATES_VISIBILITY;
 import static android.inputmethodservice.InputMethodServiceProto.CONFIGURATION;
@@ -55,6 +56,7 @@
 import static android.view.inputmethod.ConnectionlessHandwritingCallback.CONNECTIONLESS_HANDWRITING_ERROR_OTHER;
 import static android.view.inputmethod.ConnectionlessHandwritingCallback.CONNECTIONLESS_HANDWRITING_ERROR_UNSUPPORTED;
 import static android.view.inputmethod.Flags.FLAG_CONNECTIONLESS_HANDWRITING;
+import static android.view.inputmethod.Flags.ctrlShiftShortcut;
 
 import static java.lang.annotation.RetentionPolicy.SOURCE;
 
@@ -399,9 +401,14 @@
     private long mStylusHwSessionsTimeout = STYLUS_HANDWRITING_IDLE_TIMEOUT_MS;
     private Runnable mStylusWindowIdleTimeoutRunnable;
     private long mStylusWindowIdleTimeoutForTest;
-    /** Tracks last {@link MotionEvent#getToolType(int)} used for {@link MotionEvent#ACTION_DOWN}.
+    /**
+     * Tracks last {@link MotionEvent#getToolType(int)} used for {@link MotionEvent#ACTION_DOWN}.
      **/
     private int mLastUsedToolType;
+    /**
+     * Tracks the ctrl+shift shortcut
+     **/
+    private boolean mUsingCtrlShiftShortcut = false;
 
     /**
      * Returns whether {@link InputMethodService} is responsible for rendering the back button and
@@ -3098,7 +3105,7 @@
         cancelImeSurfaceRemoval();
         mInShowWindow = false;
         Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
-        registerCompatOnBackInvokedCallback();
+        registerDefaultOnBackInvokedCallback();
     }
 
 
@@ -3107,18 +3114,27 @@
      *  back dispatching is enabled. We keep the {@link KeyEvent#KEYCODE_BACK} based legacy code
      *  around to handle back on older devices.
      */
-    private void registerCompatOnBackInvokedCallback() {
+    private void registerDefaultOnBackInvokedCallback() {
         if (mBackCallbackRegistered) {
             return;
         }
         if (mWindow != null) {
-            mWindow.getOnBackInvokedDispatcher().registerOnBackInvokedCallback(
-                    OnBackInvokedDispatcher.PRIORITY_DEFAULT, mCompatBackCallback);
+            if (getApplicationInfo().isOnBackInvokedCallbackEnabled() && predictiveBackIme()) {
+                // Register the compat callback as system-callback if IME has opted in for
+                // predictive back (and predictiveBackIme feature flag is enabled). This indicates
+                // to the receiving process (application process) that a predictive IME dismiss
+                // animation may be played instead of invoking the callback.
+                mWindow.getOnBackInvokedDispatcher().registerSystemOnBackInvokedCallback(
+                        mCompatBackCallback);
+            } else {
+                mWindow.getOnBackInvokedDispatcher().registerOnBackInvokedCallback(
+                        OnBackInvokedDispatcher.PRIORITY_DEFAULT, mCompatBackCallback);
+            }
             mBackCallbackRegistered = true;
         }
     }
 
-    private void unregisterCompatOnBackInvokedCallback() {
+    private void unregisterDefaultOnBackInvokedCallback() {
         if (!mBackCallbackRegistered) {
             return;
         }
@@ -3251,7 +3267,7 @@
         }
         mLastWasInFullscreenMode = mIsFullscreen;
         updateFullscreenMode();
-        unregisterCompatOnBackInvokedCallback();
+        unregisterDefaultOnBackInvokedCallback();
     }
 
     /**
@@ -3328,7 +3344,7 @@
         // Back callback is typically unregistered in {@link #hideWindow()}, but it's possible
         // for {@link #doFinishInput()} to be called without {@link #hideWindow()} so we also
         // unregister here.
-        unregisterCompatOnBackInvokedCallback();
+        unregisterDefaultOnBackInvokedCallback();
     }
 
     void doStartInput(InputConnection ic, EditorInfo editorInfo, boolean restarting) {
@@ -3602,7 +3618,8 @@
             // any KeyEvent keyDown should reset last toolType.
             updateEditorToolTypeInternal(MotionEvent.TOOL_TYPE_UNKNOWN);
         }
-        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
+
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
             final ExtractEditText eet = getExtractEditTextIfVisible();
             if (eet != null && eet.handleBackInTextActionModeIfNeeded(event)) {
                 return true;
@@ -3612,14 +3629,33 @@
                 return true;
             }
             return false;
-        } else if (event.getKeyCode() == KeyEvent.KEYCODE_SPACE && KeyEvent.metaStateHasModifiers(
+        } else if (keyCode == KeyEvent.KEYCODE_SPACE && KeyEvent.metaStateHasModifiers(
                 event.getMetaState() & ~KeyEvent.META_SHIFT_MASK, KeyEvent.META_CTRL_ON)) {
             if (mDecorViewVisible && mWindowVisible) {
                 int direction = (event.getMetaState() & KeyEvent.META_SHIFT_MASK) != 0 ? -1 : 1;
                 mPrivOps.switchKeyboardLayoutAsync(direction);
+                event.startTracking();
                 return true;
             }
         }
+
+        // Check if this may be a ctrl+shift shortcut
+        if (ctrlShiftShortcut()) {
+            if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT
+                    || keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT) {
+                // Potentially Ctrl+Shift shortcut if Ctrl is currently pressed
+                mUsingCtrlShiftShortcut = KeyEvent.metaStateHasModifiers(
+                    event.getMetaState() & ~KeyEvent.META_SHIFT_MASK, KeyEvent.META_CTRL_ON);
+            } else if (keyCode == KeyEvent.KEYCODE_CTRL_LEFT
+                    || keyCode == KeyEvent.KEYCODE_CTRL_RIGHT) {
+                // Potentially Ctrl+Shift shortcut if Shift is currently pressed
+                mUsingCtrlShiftShortcut = KeyEvent.metaStateHasModifiers(
+                    event.getMetaState() & ~KeyEvent.META_CTRL_MASK, KeyEvent.META_SHIFT_ON);
+            } else {
+                mUsingCtrlShiftShortcut = false;
+            }
+        }
+
         return doMovementKey(keyCode, event, MOVEMENT_DOWN);
     }
 
@@ -3661,7 +3697,27 @@
      * them to perform navigation in the underlying application.
      */
     public boolean onKeyUp(int keyCode, KeyEvent event) {
-        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
+        if (ctrlShiftShortcut()) {
+            if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT
+                    || keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT
+                    || keyCode == KeyEvent.KEYCODE_CTRL_LEFT
+                    || keyCode == KeyEvent.KEYCODE_CTRL_RIGHT) {
+                if (mUsingCtrlShiftShortcut
+                        && event.hasNoModifiers()) {
+                    mUsingCtrlShiftShortcut = false;
+                    if (mDecorViewVisible && mWindowVisible) {
+                        // Move to the next IME
+                        switchToNextInputMethod(false /* onlyCurrentIme */);
+                        // TODO(b/332937629): Make the event stream consistent again
+                        return true;
+                    }
+                }
+            } else {
+                mUsingCtrlShiftShortcut = false;
+            }
+        }
+
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
             final ExtractEditText eet = getExtractEditTextIfVisible();
             if (eet != null && eet.handleBackInTextActionModeIfNeeded(event)) {
                 return true;
@@ -3669,7 +3725,12 @@
             if (event.isTracking() && !event.isCanceled()) {
                 return handleBack(true);
             }
+        } else if (keyCode == KeyEvent.KEYCODE_SPACE) {
+            if (event.isTracking() && !event.isCanceled()) {
+                return true;
+            }
         }
+
         return doMovementKey(keyCode, event, MOVEMENT_UP);
     }
 
@@ -4473,7 +4534,7 @@
     private void compatHandleBack() {
         if (!mDecorViewVisible) {
             Log.e(TAG, "Back callback invoked on a hidden IME. Removing the callback...");
-            unregisterCompatOnBackInvokedCallback();
+            unregisterDefaultOnBackInvokedCallback();
             return;
         }
         final KeyEvent downEvent = createBackKeyEvent(
diff --git a/core/java/android/net/IVpnManager.aidl b/core/java/android/net/IVpnManager.aidl
index f302378..5149967 100644
--- a/core/java/android/net/IVpnManager.aidl
+++ b/core/java/android/net/IVpnManager.aidl
@@ -60,6 +60,12 @@
     LegacyVpnInfo getLegacyVpnInfo(int userId);
     boolean updateLockdownVpn();
 
+    /** Profile store APIs */
+    byte[] getFromVpnProfileStore(String name);
+    boolean putIntoVpnProfileStore(String name, in byte[] blob);
+    boolean removeFromVpnProfileStore(String name);
+    String[] listFromVpnProfileStore(String prefix);
+
     /** General system APIs */
     VpnConfig getVpnConfig(int userId);
     void factoryReset();
diff --git a/core/java/android/net/VpnManager.java b/core/java/android/net/VpnManager.java
index ff47f3f..c50bc56 100644
--- a/core/java/android/net/VpnManager.java
+++ b/core/java/android/net/VpnManager.java
@@ -717,4 +717,81 @@
             throw e.rethrowFromSystemServer();
         }
     }
+
+    /**
+     * Get the vpn profile owned by the calling uid with the given name from the vpn database.
+     *
+     * <p>Note this method should not be used for platform VPN profiles. </p>
+     *
+     * @param name The name of the profile to retrieve.
+     * @return the unstructured blob for the matching vpn profile.
+     * Returns null if no profile with a matching name was found.
+     * @hide
+     */
+    @Nullable
+    public byte[] getFromVpnProfileStore(@NonNull String name) {
+        try {
+            return mService.getFromVpnProfileStore(name);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Put the given vpn profile owned by the calling uid with the given name into the vpn database.
+     * Existing profiles with the same name will be replaced.
+     *
+     * <p>Note this method should not be used for platform VPN profiles.
+     * To update a platform VPN, use provisionVpnProfile() instead. </p>
+     *
+     * @param name The name of the profile to put.
+     * @param blob The profile.
+     * @return true if the profile was successfully added. False otherwise.
+     * @hide
+     */
+    public boolean putIntoVpnProfileStore(@NonNull String name, @NonNull byte[] blob) {
+        try {
+            return mService.putIntoVpnProfileStore(name, blob);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Removes the vpn profile owned by the calling uid with the given name from the vpn database.
+     *
+     * <p>Note this method should not be used for platform VPN profiles.
+     * To remove a platform VPN, use deleteVpnProfile() instead.</p>
+     *
+     * @param name The name of the profile to be removed.
+     * @return true if a profile was removed. False if no profile with a matching name was found.
+     * @hide
+     */
+    public boolean removeFromVpnProfileStore(@NonNull String name) {
+        try {
+            return mService.removeFromVpnProfileStore(name);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Returns a list of the name suffixes of the vpn profiles owned by the calling uid in the vpn
+     * database matching the given prefix, sorted in ascending order.
+     *
+     * <p>Note this method should not be used for platform VPN profiles. </p>
+     *
+     * @param prefix The prefix to match.
+     * @return an array of strings representing the name suffixes stored in the profile database
+     * matching the given prefix. The return value may be empty but never null.
+     * @hide
+     */
+    @NonNull
+    public String[] listFromVpnProfileStore(@NonNull String prefix) {
+        try {
+            return mService.listFromVpnProfileStore(prefix);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
 }
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index 04d6f61..f785cca 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -210,6 +210,7 @@
         @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
         public boolean hasSwappedOutPss;
 
+        // LINT.IfChange
         /** @hide */
         public static final int HEAP_UNKNOWN = 0;
         /** @hide */
@@ -311,6 +312,7 @@
         public static final int OTHER_ART_APP = 30;
         /** @hide */
         public static final int OTHER_ART_BOOT = 31;
+        // LINT.ThenChange(/system/memory/libmeminfo/include/meminfo/androidprocheaps.h)
         /** @hide */
         public static final int OTHER_DVK_STAT_ART_START = OTHER_ART_APP - NUM_OTHER_STATS;
         /** @hide */
diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java
index 2fe115f..5b711c9 100644
--- a/core/java/android/os/MessageQueue.java
+++ b/core/java/android/os/MessageQueue.java
@@ -25,8 +25,6 @@
 import android.util.SparseArray;
 import android.util.proto.ProtoOutputStream;
 
-import dalvik.annotation.optimization.CriticalNative;
-
 import java.io.FileDescriptor;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -80,7 +78,6 @@
     private native static void nativeDestroy(long ptr);
     @UnsupportedAppUsage
     private native void nativePollOnce(long ptr, int timeoutMillis); /*non-static for callbacks*/
-    @CriticalNative
     private native static void nativeWake(long ptr);
     private native static boolean nativeIsPolling(long ptr);
     private native static void nativeSetFileDescriptorEvents(long ptr, int fd, int events);
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index bcef815..35a3a5f 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -577,6 +577,11 @@
             }
             res.mReadWriteHelper = ReadWriteHelper.DEFAULT;
         }
+
+        if (res.mNativePtr == 0) {
+            Log.e(TAG, "Obtained Parcel object has null native pointer. Invalid state.");
+        }
+
         return res;
     }
 
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index f4795f8..406a1a6 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -184,6 +184,22 @@
     public static final int DRAW_WAKE_LOCK = OsProtoEnums.DRAW_WAKE_LOCK; // 0x00000080
 
     /**
+     * Wake lock level: Override the current screen timeout.
+     * <p>
+     *  This is used by the system to allow {@code PowerManagerService} to override the current
+     *  screen timeout by config value.
+     *
+     *  config_screenTimeoutOverride in config.xml determines the screen timeout override value.
+     * </p><p>
+     * Requires the {@link android.Manifest.permission#SCREEN_TIMEOUT_OVERRIDE} permission.
+     * </p>
+     *
+     * @hide
+     */
+    public static final int SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK =
+            OsProtoEnums.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK; // 0x00000100
+
+    /**
      * Mask for the wake lock level component of a combined wake lock level and flags integer.
      *
      * @hide
@@ -1369,6 +1385,7 @@
             case PROXIMITY_SCREEN_OFF_WAKE_LOCK:
             case DOZE_WAKE_LOCK:
             case DRAW_WAKE_LOCK:
+            case SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK:
                 break;
             default:
                 throw new IllegalArgumentException("Must specify a valid wake lock level.");
diff --git a/core/java/android/os/PowerManagerInternal.java b/core/java/android/os/PowerManagerInternal.java
index fec67b9..df353e5 100644
--- a/core/java/android/os/PowerManagerInternal.java
+++ b/core/java/android/os/PowerManagerInternal.java
@@ -136,11 +136,12 @@
      *
      * @param screenState The overridden screen state, or {@link Display#STATE_UNKNOWN}
      * to disable the override.
+     * @param reason The reason for overriding the screen state.
      * @param screenBrightness The overridden screen brightness, or
      * {@link PowerManager#BRIGHTNESS_DEFAULT} to disable the override.
      */
     public abstract void setDozeOverrideFromDreamManager(
-            int screenState, int screenBrightness);
+            int screenState, @Display.StateReason int reason, int screenBrightness);
 
     /**
      * Used by sidekick manager to tell the power manager if it shouldn't change the display state
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 8a17742..bb74a3e 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -1436,10 +1436,10 @@
      * @throws IOException if the recovery system service could not be contacted
      */
     private boolean requestLskf(String packageName, IntentSender sender) throws IOException {
-        Log.i(TAG, String.format("<%s> is requesting LSFK", packageName));
+        Log.i(TAG, TextUtils.formatSimple("Package<%s> requesting LSKF", packageName));
         try {
             boolean validRequest = mService.requestLskf(packageName, sender);
-            Log.i(TAG, String.format("LSKF Request isValid = %b", validRequest));
+            Log.i(TAG, TextUtils.formatSimple("LSKF Request isValid = %b", validRequest));
             return validRequest;
         } catch (RemoteException | SecurityException e) {
             throw new IOException("could not request LSKF capture", e);
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index f172c3e..857a85d 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -705,7 +705,7 @@
      * {@link android.Manifest.permission#MANAGE_DEVICE_POLICY_BLUETOOTH}
      * can set this restriction using the DevicePolicyManager APIs mentioned below.
      *
-     * <p>Default is <code>true</code> for managed profiles and false otherwise.
+     * <p>Default is <code>true</code> for managed and private profiles, false otherwise.
      *
      * <p>When a device upgrades to {@link android.os.Build.VERSION_CODES#O}, the system sets it
      * for all existing managed profiles.
diff --git a/core/java/android/os/flags.aconfig b/core/java/android/os/flags.aconfig
index 311e991..f26a797 100644
--- a/core/java/android/os/flags.aconfig
+++ b/core/java/android/os/flags.aconfig
@@ -98,6 +98,46 @@
 }
 
 flag {
+    name: "adpf_use_fmq_channel_fixed"
+    namespace: "game"
+    description: "Guards use of the FMQ channel for ADPF with a readonly flag"
+    is_fixed_read_only: true
+    bug: "315894228"
+}
+
+flag {
+    name: "adpf_fmq_eager_send"
+    namespace: "game"
+    description: "Guards the use of an eager-sending optimization in FMQ for low-latency messages"
+    is_fixed_read_only: true
+    bug: "315894228"
+}
+
+flag {
+    name: "adpf_hwui_gpu"
+    namespace: "game"
+    description: "Guards use of the FMQ channel for ADPF"
+    is_fixed_read_only: true
+    bug: "330922490"
+}
+
+flag {
+    name: "adpf_obtainview_boost"
+    namespace: "game"
+    description: "Guards use of a boost in response to HWUI obtainView"
+    is_fixed_read_only: true
+    bug: "328238660"
+}
+
+flag {
+    name: "adpf_platform_power_efficiency"
+    namespace: "game"
+    description: "Guards use of the ADPF power efficiency API within the platform"
+    is_fixed_read_only: true
+    bug: "277285195"
+}
+
+flag {
     name: "battery_service_support_current_adb_command"
     namespace: "backstage_power"
     description: "Whether or not BatteryService supports adb commands for Current values."
diff --git a/core/java/android/os/storage/ICeStorageLockEventListener.java b/core/java/android/os/storage/ICeStorageLockEventListener.java
new file mode 100644
index 0000000..f16a7fe
--- /dev/null
+++ b/core/java/android/os/storage/ICeStorageLockEventListener.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 android.os.storage;
+
+
+/**
+ * Callback class for receiving CE storage lock events from StorageManagerService.
+ * @hide
+ */
+public interface ICeStorageLockEventListener {
+
+    /**
+     * Called when the CE storage corresponding to the userId is locked
+     */
+    void onStorageLocked(int userId);
+}
diff --git a/core/java/android/os/storage/StorageManagerInternal.java b/core/java/android/os/storage/StorageManagerInternal.java
index 6995ea8..8ba2fa4 100644
--- a/core/java/android/os/storage/StorageManagerInternal.java
+++ b/core/java/android/os/storage/StorageManagerInternal.java
@@ -16,10 +16,12 @@
 
 package android.os.storage;
 
+import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UserIdInt;
 import android.content.pm.UserInfo;
+import android.multiuser.Flags;
 import android.os.IInstalld;
 import android.os.IVold;
 import android.os.ParcelFileDescriptor;
@@ -201,4 +203,18 @@
      */
     public abstract int enableFsverity(IInstalld.IFsveritySetupAuthToken authToken, String filePath,
             String packageName) throws IOException;
+
+    /**
+     * Registers a {@link ICeStorageLockEventListener} for receiving CE storage lock events.
+     */
+    @FlaggedApi(Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE)
+    public abstract void registerStorageLockEventListener(
+            @NonNull ICeStorageLockEventListener listener);
+
+    /**
+     * Unregisters the {@link ICeStorageLockEventListener} which was registered previously
+     */
+    @FlaggedApi(Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE)
+    public abstract void unregisterStorageLockEventListener(
+            @NonNull ICeStorageLockEventListener listener);
 }
diff --git a/core/java/android/os/vibrator/flags.aconfig b/core/java/android/os/vibrator/flags.aconfig
index bb0498e..229d119 100644
--- a/core/java/android/os/vibrator/flags.aconfig
+++ b/core/java/android/os/vibrator/flags.aconfig
@@ -9,14 +9,6 @@
 
 flag {
     namespace: "haptics"
-    name: "haptics_customization_enabled"
-    is_exported: true
-    description: "Enables the haptics customization feature"
-    bug: "241918098"
-}
-
-flag {
-    namespace: "haptics"
     name: "haptic_feedback_vibration_oem_customization_enabled"
     description: "Enables OEMs/devices to customize vibrations for haptic feedback"
     # Make read only. This is because the flag is used only once, and this could happen before
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java
index 3c7692d..fe3fa8c 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -23,6 +23,7 @@
 import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED;
 import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET;
 import static android.os.Build.VERSION_CODES.S;
+import static android.permission.flags.Flags.FLAG_SHOULD_REGISTER_ATTRIBUTION_SOURCE;
 import static android.permission.flags.Flags.serverSideAttributionRegistration;
 
 import android.Manifest;
@@ -239,6 +240,16 @@
     public static final String EXTRA_PERMISSION_USAGES =
             "android.permission.extra.PERMISSION_USAGES";
 
+    /**
+     * Specify what permissions are device aware. Only device aware permissions can be granted to
+     * a remote device.
+     * @hide
+     */
+    public static final Set<String> DEVICE_AWARE_PERMISSIONS =
+            Flags.deviceAwarePermissionsEnabled()
+                    ? Set.of(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
+                    : Collections.emptySet();
+
     private final @NonNull Context mContext;
 
     private final IPackageManager mPackageManager;
@@ -1652,6 +1663,8 @@
      *
      * @hide
      */
+    @TestApi
+    @FlaggedApi(FLAG_SHOULD_REGISTER_ATTRIBUTION_SOURCE)
     public boolean isRegisteredAttributionSource(@NonNull AttributionSource source) {
         try {
             return mPermissionManager.isRegisteredAttributionSource(source.asState());
diff --git a/core/java/android/permission/TEST_MAPPING b/core/java/android/permission/TEST_MAPPING
index 69113ef..a15d9bc 100644
--- a/core/java/android/permission/TEST_MAPPING
+++ b/core/java/android/permission/TEST_MAPPING
@@ -11,5 +11,29 @@
                 }
             ]
         }
+    ],
+    "postsubmit": [
+        {
+            "name": "CtsVirtualDevicesAudioTestCases",
+            "options": [
+                {
+                    "exclude-annotation": "androidx.test.filters.FlakyTest"
+                },
+                {
+                    "include-filter": "android.virtualdevice.cts.audio.VirtualAudioPermissionTest"
+                }
+            ]
+        },
+        {
+            "name": "CtsVirtualDevicesAppLaunchTestCases",
+            "options": [
+                {
+                    "exclude-annotation": "androidx.test.filters.FlakyTest"
+                },
+                {
+                    "include-filter": "android.virtualdevice.cts.applaunch.VirtualDevicePermissionTest"
+                }
+            ]
+        }
     ]
 }
\ No newline at end of file
diff --git a/core/java/android/permission/flags.aconfig b/core/java/android/permission/flags.aconfig
index 2710df2..ec3c978 100644
--- a/core/java/android/permission/flags.aconfig
+++ b/core/java/android/permission/flags.aconfig
@@ -116,6 +116,15 @@
 }
 
 flag {
+  name: "sensitive_content_improvements"
+  namespace: "permissions"
+  description: "Improvements to sensitive content/notification features, such as the Toast UX."
+  bug: "301960090"
+  # Referenced in WM where WM starts before DeviceConfig
+  is_fixed_read_only: true
+}
+
+flag {
     name: "device_aware_permissions_enabled"
     is_fixed_read_only: true
     namespace: "permissions"
@@ -147,3 +156,13 @@
     bug: "266164193"
 }
 
+flag {
+    name: "ignore_apex_permissions"
+    is_fixed_read_only: true
+    namespace: "permissions"
+    description: "Ignore APEX pacakges for permissions on V+"
+    bug: "301320911"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index d0593e7..dd93972 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -16,6 +16,8 @@
 
 package android.provider;
 
+import static android.app.Flags.systemTermsOfAddressEnabled;
+
 import android.Manifest;
 import android.annotation.CallbackExecutor;
 import android.annotation.FlaggedApi;
@@ -37,6 +39,7 @@
 import android.app.AppOpsManager;
 import android.app.Application;
 import android.app.AutomaticZenRule;
+import android.app.GrammaticalInflectionManager;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
 import android.app.SearchManager;
@@ -693,6 +696,8 @@
      * Output: When a package data uri is passed as input, the activity result is set to
      * {@link android.app.Activity#RESULT_OK} if the permission was granted to the app. Otherwise,
      * the result is set to {@link android.app.Activity#RESULT_CANCELED}.
+     *
+     * @hide
      */
     @FlaggedApi(Flags.FLAG_BACKUP_TASKS_SETTINGS_SCREEN)
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
@@ -997,6 +1002,21 @@
             "android.settings.BLUETOOTH_SETTINGS";
 
     /**
+     * Activity Action: Show settings to allow configuration of Hearing Devices.
+     * <p>
+     * In some cases, a matching Activity may not exist, so ensure you
+     * safeguard against this.
+     * <p>
+     * Input: Nothing.
+     * <p>
+     * Output: Nothing.
+     * @hide
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_HEARING_DEVICES_SETTINGS =
+            "android.settings.HEARING_DEVICES_SETTINGS";
+
+    /**
      * Activity action: Show Settings app search UI when this action is available for device.
      * <p>
      * Input: Nothing.
@@ -1246,6 +1266,22 @@
             "android.settings.BLUETOOTH_PAIRING_SETTINGS";
 
     /**
+     * Activity Action: Show settings to allow pairing hearing devices.
+     * <p>
+     * In some cases, a matching Activity may not exist, so ensure you
+     * safeguard against this.
+     * <p>
+     * Input: Nothing.
+     * <p>
+     * Output: Nothing.
+     *
+     * @hide
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_HEARING_DEVICE_PAIRING_SETTINGS =
+            "android.settings.HEARING_DEVICES_PAIRING_SETTINGS";
+
+    /**
      * Activity Action: Show settings to configure input methods, in particular
      * allowing the user to enable input methods.
      * <p>
@@ -1566,23 +1602,6 @@
             "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
 
     /**
-     * Activity Action: Show screen for controlling any background restrictions imposed on
-     * an app. If the system returns true for
-     * {@link android.app.ActivityManager#isBackgroundRestricted()}, and the app is not able to
-     * satisfy user requests due to being restricted in the background, then this intent can be
-     * used to request the user to unrestrict the app.
-     * <p>
-     * Input: The Intent's data URI must specify the application package name
-     *        to be shown, with the "package" scheme, such as "package:com.my.app".
-     * <p>
-     * Output: Nothing.
-     */
-    @FlaggedApi(android.app.Flags.FLAG_APP_RESTRICTIONS_API)
-    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ACTION_BACKGROUND_RESTRICTIONS_SETTINGS =
-            "android.settings.BACKGROUND_RESTRICTIONS_SETTINGS";
-
-    /**
      * Activity Action: Open the advanced power usage details page of an associated app.
      * <p>
      * Input: Intent's data URI set with an application name, using the
@@ -4594,6 +4613,13 @@
             }
             outConfig.fontWeightAdjustment = Settings.Secure.getIntForUser(
                     cr, Settings.Secure.FONT_WEIGHT_ADJUSTMENT, DEFAULT_FONT_WEIGHT, userHandle);
+            if (systemTermsOfAddressEnabled()) {
+                GrammaticalInflectionManager manager =
+                        ActivityThread.currentApplication().getApplicationContext()
+                                .getSystemService(GrammaticalInflectionManager.class);
+                outConfig.setGrammaticalGender(
+                        manager.peekSystemGrammaticalGenderByUserId(userHandle));
+            }
 
             final String localeValue =
                     Settings.System.getStringForUser(cr, SYSTEM_LOCALES, userHandle);
@@ -7979,6 +8005,7 @@
          *
          * @hide
          */
+        @Readable
         public static final String ACCESSIBILITY_BOUNCE_KEYS = "accessibility_bounce_keys";
 
         /**
@@ -7990,6 +8017,7 @@
          *
          * @hide
          */
+        @Readable
         public static final String ACCESSIBILITY_SLOW_KEYS = "accessibility_slow_keys";
 
         /**
@@ -7999,6 +8027,7 @@
          *
          * @hide
          */
+        @Readable
         public static final String ACCESSIBILITY_STICKY_KEYS = "accessibility_sticky_keys";
 
         /**
@@ -8502,6 +8531,19 @@
         public static final String ACCESSIBILITY_BUTTON_TARGETS = "accessibility_button_targets";
 
         /**
+         * Setting specifying the accessibility services, shortcut targets or features
+         * to be toggled via the floating accessibility menu
+         *
+         * <p> This is a colon-separated string list which contains the flattened
+         * {@link ComponentName} and the class name of a system class
+         * implementing a supported accessibility feature.
+         * @hide
+         */
+        @Readable
+        public static final String ACCESSIBILITY_FLOATING_MENU_TARGETS =
+                "accessibility_floating_menu_targets";
+
+        /**
          * Setting specifying the accessibility services, accessibility shortcut targets,
          * or features to be toggled via a tile in the quick settings panel.
          *
@@ -10186,6 +10228,13 @@
                 "screensaver_complications_enabled";
 
         /**
+         * Defines the enabled state for the glanceable hub.
+         *
+         * @hide
+         */
+        public static final String GLANCEABLE_HUB_ENABLED = "glanceable_hub_enabled";
+
+        /**
          * Whether home controls are enabled to be shown over the screensaver by the user.
          *
          * @hide
@@ -10931,7 +10980,7 @@
                 "biometric_debug_enabled";
 
         /**
-         * Whether or not virtual sensors are enabled.
+         * Whether or not both fingerprint and face virtual sensors are enabled.
          * @hide
          */
         @TestApi
@@ -10939,6 +10988,22 @@
         public static final String BIOMETRIC_VIRTUAL_ENABLED = "biometric_virtual_enabled";
 
         /**
+         * Whether or not fingerprint virtual sensors are enabled.
+         * @hide
+         */
+        @FlaggedApi("com.android.server.biometrics.face_vhal_feature")
+        public static final String BIOMETRIC_FINGERPRINT_VIRTUAL_ENABLED =
+                "biometric_fingerprint_virtual_enabled";
+
+        /**
+         * Whether or not face virtual sensors are enabled.
+         * @hide
+         */
+        @FlaggedApi("com.android.server.biometrics.face_vhal_feature")
+        public static final String BIOMETRIC_FACE_VIRTUAL_ENABLED =
+                "biometric_face_virtual_enabled";
+
+        /**
          * Whether or not biometric is allowed on Keyguard.
          * @hide
          */
@@ -11162,6 +11227,32 @@
         public static final String DISPLAY_WHITE_BALANCE_ENABLED = "display_white_balance_enabled";
 
         /**
+         * Used by DisplayManager to backup/restore the user-selected resolution mode.
+         * @hide
+         */
+        @Readable
+        public static final String SCREEN_RESOLUTION_MODE = "screen_resolution_mode";
+
+        /**
+         * Resolution Mode Constants for SCREEN_RESOLUTION_MODE setting.
+         *
+         * @hide
+         */
+        @IntDef(prefix = { "RESOLUTION_MODE_" }, value = {
+                RESOLUTION_MODE_UNKNOWN,
+                RESOLUTION_MODE_HIGH,
+                RESOLUTION_MODE_FULL
+        })
+        @Retention(RetentionPolicy.SOURCE)
+        public @interface ResolutionMode {}
+        /** @hide */
+        public static final int RESOLUTION_MODE_UNKNOWN = 0;
+        /** @hide */
+        public static final int RESOLUTION_MODE_HIGH = 1;
+        /** @hide */
+        public static final int RESOLUTION_MODE_FULL = 2;
+
+        /**
          * Names of the service components that the current user has explicitly allowed to
          * be a VR mode listener, separated by ':'.
          *
@@ -12402,7 +12493,7 @@
         /** @hide */
         public static final int PRIVATE_SPACE_AUTO_LOCK_AFTER_INACTIVITY = 1;
         /** @hide */
-        public static final int PRIVATE_SPACE_AUTO_LOCK_NEVER = 2;
+        public static final int PRIVATE_SPACE_AUTO_LOCK_AFTER_DEVICE_RESTART = 2;
 
         /**
          * The different auto lock options for private space.
@@ -12412,7 +12503,7 @@
         @IntDef(prefix = {"PRIVATE_SPACE_AUTO_LOCK_"}, value = {
                 PRIVATE_SPACE_AUTO_LOCK_ON_DEVICE_LOCK,
                 PRIVATE_SPACE_AUTO_LOCK_AFTER_INACTIVITY,
-                PRIVATE_SPACE_AUTO_LOCK_NEVER,
+                PRIVATE_SPACE_AUTO_LOCK_AFTER_DEVICE_RESTART,
         })
         @Retention(RetentionPolicy.SOURCE)
         public @interface PrivateSpaceAutoLockOption {
@@ -15873,41 +15964,6 @@
                 = "forced_app_standby_for_small_battery_enabled";
 
         /**
-         * Whether to enable the TARE subsystem or not.
-         * Valid values are
-         * {@link android.app.tare.EconomyManager#ENABLE_TARE_ON EconomyManager.ENABLE_TARE_*}.
-         *
-         * @hide
-         */
-        public static final String ENABLE_TARE = "enable_tare";
-
-        /**
-         * Whether to show the TARE page in Developer Options or not.
-         * 1 = true, everything else = false
-         *
-         * @hide
-         */
-        public static final String SHOW_TARE_DEVELOPER_OPTIONS = "show_tare_developer_options";
-
-        /**
-         * Settings for AlarmManager's TARE EconomicPolicy (list of its economic factors).
-         *
-         * Keys are listed in {@link android.app.tare.EconomyManager}.
-         *
-         * @hide
-         */
-        public static final String TARE_ALARM_MANAGER_CONSTANTS = "tare_alarm_manager_constants";
-
-        /**
-         * Settings for JobScheduler's TARE EconomicPolicy (list of its economic factors).
-         *
-         * Keys are listed in {@link android.app.tare.EconomyManager}.
-         *
-         * @hide
-         */
-        public static final String TARE_JOB_SCHEDULER_CONSTANTS = "tare_job_scheduler_constants";
-
-        /**
          * Whether or not to enable the User Absent, Radios Off feature on small battery devices.
          * Type: int (0 for false, 1 for true)
          * Default: 0
diff --git a/core/java/android/service/autofill/AutofillServiceInfo.java b/core/java/android/service/autofill/AutofillServiceInfo.java
index 83f9662..0e67477 100644
--- a/core/java/android/service/autofill/AutofillServiceInfo.java
+++ b/core/java/android/service/autofill/AutofillServiceInfo.java
@@ -312,6 +312,7 @@
             final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
             try {
                 if (serviceInfo != null && isCredentialManagerAutofillService(
+                        context,
                         serviceInfo.getComponentName())) {
                     // Skip this service as it is for internal use only
                     continue;
@@ -325,11 +326,23 @@
         return services;
     }
 
-    private static boolean isCredentialManagerAutofillService(ComponentName componentName) {
+    private static boolean isCredentialManagerAutofillService(Context context,
+            ComponentName componentName) {
         if (componentName == null) {
             return false;
         }
-        return componentName.equals(CREDMAN_SERVICE_COMPONENT_NAME);
+        ComponentName credAutofillService = null;
+        String credentialManagerAutofillCompName = context.getResources().getString(
+                R.string.config_defaultCredentialManagerAutofillService);
+        if (credentialManagerAutofillCompName != null && !credentialManagerAutofillCompName
+                .isEmpty()) {
+            credAutofillService = ComponentName.unflattenFromString(
+                    credentialManagerAutofillCompName);
+        } else {
+            Log.w(TAG, "Invalid CredentialAutofillService");
+        }
+
+        return componentName.equals(credAutofillService);
     }
 
     @Override
diff --git a/core/java/android/service/credentials/CredentialProviderInfoFactory.java b/core/java/android/service/credentials/CredentialProviderInfoFactory.java
index 514d722..92f2c32 100644
--- a/core/java/android/service/credentials/CredentialProviderInfoFactory.java
+++ b/core/java/android/service/credentials/CredentialProviderInfoFactory.java
@@ -65,7 +65,7 @@
  * @hide
  */
 public final class CredentialProviderInfoFactory {
-    private static final String TAG = "CredentialProviderInfoFactory";
+    private static final String TAG = CredentialManager.TAG;
 
     private static final String TAG_CREDENTIAL_PROVIDER = "credential-provider";
     private static final String TAG_CAPABILITIES = "capabilities";
@@ -480,8 +480,12 @@
             Set<ComponentName> primaryServices) {
         requireNonNull(context, "context must not be null");
 
-        // Get the device policy.
-        PackagePolicy pp = getDeviceManagerPolicy(context, userId);
+        // Get the device policy. If the client has asked for all providers then we
+        // should ignore the device policy.
+        PackagePolicy pp =
+                providerFilter != CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN
+                        ? getDeviceManagerPolicy(context, userId)
+                        : null;
 
         // Generate the provider list.
         final boolean disableSystemAppVerificationForTests = false;
@@ -514,8 +518,12 @@
             Set<ComponentName> primaryServices) {
         requireNonNull(context, "context must not be null");
 
-        // Get the device policy.
-        PackagePolicy pp = getDeviceManagerPolicy(context, userId);
+        // Get the device policy. If the client has asked for all providers then we
+        // should ignore the device policy.
+        PackagePolicy pp =
+                providerFilter != CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN
+                        ? getDeviceManagerPolicy(context, userId)
+                        : null;
 
         // Generate the provider list.
         final boolean disableSystemAppVerificationForTests = true;
@@ -593,7 +601,10 @@
             if (cpi.isSystemProvider()) {
                 return mProviderFilter == CredentialManager.PROVIDER_FILTER_SYSTEM_PROVIDERS_ONLY;
             } else {
-                return mProviderFilter == CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY;
+                return mProviderFilter == CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY
+                        || mProviderFilter
+                                == CredentialManager
+                                        .PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN;
             }
         }
 
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index 4060b24..353828c 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -17,6 +17,7 @@
 package android.service.dreams;
 
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.service.dreams.Flags.dreamHandlesConfirmKeys;
 
 import android.annotation.FlaggedApi;
 import android.annotation.IdRes;
@@ -29,6 +30,7 @@
 import android.annotation.TestApi;
 import android.app.Activity;
 import android.app.AlarmManager;
+import android.app.KeyguardManager;
 import android.app.Service;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.ComponentName;
@@ -263,7 +265,9 @@
     private boolean mCanDoze;
     private boolean mDozing;
     private boolean mWindowless;
+    private boolean mPreviewMode;
     private int mDozeScreenState = Display.STATE_UNKNOWN;
+    private @Display.StateReason int mDozeScreenStateReason = Display.STATE_REASON_UNKNOWN;
     private int mDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
 
     private boolean mDebug = false;
@@ -278,6 +282,8 @@
 
     private IDreamOverlayCallback mOverlayCallback;
 
+    private Integer mTrackingConfirmKey = null;
+
 
     public DreamService() {
         mDreamManager = IDreamManager.Stub.asInterface(ServiceManager.getService(DREAM_SERVICE));
@@ -294,7 +300,54 @@
     /** {@inheritDoc} */
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
-        // TODO: create more flexible version of mInteractive that allows use of KEYCODE_BACK
+        if (dreamHandlesConfirmKeys()) {
+            // In the case of an interactive dream that consumes the event, do not process further.
+            if (mInteractive && mWindow.superDispatchKeyEvent(event)) {
+                return true;
+            }
+
+            // If the key is a confirm key and on up, either unlock (no auth) or show bouncer.
+            if (KeyEvent.isConfirmKey(event.getKeyCode())) {
+                switch (event.getAction()) {
+                    case KeyEvent.ACTION_DOWN -> {
+                        if (mTrackingConfirmKey != null) {
+                            return true;
+                        }
+
+                        mTrackingConfirmKey = event.getKeyCode();
+                    }
+                    case KeyEvent.ACTION_UP -> {
+                        if (mTrackingConfirmKey != event.getKeyCode()) {
+                            return true;
+                        }
+
+                        mTrackingConfirmKey = null;
+
+                        final KeyguardManager keyguardManager =
+                                getSystemService(KeyguardManager.class);
+
+                        // Simply wake up in the case the device is not locked.
+                        if (!keyguardManager.isKeyguardLocked()) {
+                            wakeUp();
+                            return true;
+                        }
+
+                        keyguardManager.requestDismissKeyguard(getActivity(),
+                                new KeyguardManager.KeyguardDismissCallback() {
+                                    @Override
+                                    public void onDismissError() {
+                                        Log.e(TAG, "Could not dismiss keyguard on confirm key");
+                                    }
+                                });
+                    }
+                }
+
+                // All key events for matching key codes should be consumed to prevent other actions
+                // from triggering.
+                return true;
+            }
+        }
+
         if (!mInteractive) {
             if (mDebug) Slog.v(mTag, "Waking up on keyEvent");
             wakeUp();
@@ -647,12 +700,13 @@
     }
 
     /**
-     * Marks this dream as keeping the screen bright while dreaming.
+     * Marks this dream as keeping the screen bright while dreaming. In preview mode, the screen
+     * is always allowed to dim and overrides the value specified here.
      *
      * @param screenBright True to keep the screen bright while dreaming.
      */
     public void setScreenBright(boolean screenBright) {
-        if (mScreenBright != screenBright) {
+        if (mScreenBright != screenBright && !mPreviewMode) {
             mScreenBright = screenBright;
             int flag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
             applyWindowFlags(mScreenBright ? flag : 0, flag);
@@ -661,7 +715,7 @@
 
     /**
      * Returns whether this dream keeps the screen bright while dreaming.
-     * Defaults to false, allowing the screen to dim if necessary.
+     * Defaults to true, preventing the screen from dimming.
      *
      * @see #setScreenBright(boolean)
      */
@@ -748,7 +802,9 @@
 
         if (mDozing) {
             try {
-                mDreamManager.startDozing(mDreamToken, mDozeScreenState, mDozeScreenBrightness);
+                mDreamManager.startDozing(
+                        mDreamToken, mDozeScreenState, mDozeScreenStateReason,
+                        mDozeScreenBrightness);
             } catch (RemoteException ex) {
                 // system server died
             }
@@ -808,6 +864,19 @@
     }
 
     /**
+     * Same as {@link #setDozeScreenState(int, int)}, but with no screen state reason specified.
+     *
+     * <p>Use {@link #setDozeScreenState(int, int)} whenever possible to allow properly accounting
+     * for the screen state reason.
+     *
+     * @hide
+     */
+    @UnsupportedAppUsage
+    public void setDozeScreenState(int state) {
+        setDozeScreenState(state, Display.STATE_REASON_UNKNOWN);
+    }
+
+    /**
      * Sets the screen state to use while dozing.
      * <p>
      * The value of this property determines the power state of the primary display
@@ -841,13 +910,15 @@
      * {@link Display#STATE_DOZE}, {@link Display#STATE_DOZE_SUSPEND},
      * {@link Display#STATE_ON_SUSPEND}, {@link Display#STATE_OFF}, or {@link Display#STATE_UNKNOWN}
      * for the default behavior.
+     * @param reason the reason for setting the specified screen state.
      *
      * @hide For use by system UI components only.
      */
     @UnsupportedAppUsage
-    public void setDozeScreenState(int state) {
+    public void setDozeScreenState(int state, @Display.StateReason int reason) {
         if (mDozeScreenState != state) {
             mDozeScreenState = state;
+            mDozeScreenStateReason = reason;
             updateDoze();
         }
     }
@@ -1030,12 +1101,10 @@
                     overlay.endDream();
                     mOverlayConnection.unbind();
                     mOverlayConnection = null;
-                    finish();
                 } catch (RemoteException e) {
                     Log.e(mTag, "could not inform overlay of dream end:" + e);
                 }
             });
-            return;
         }
 
         if (mDebug) Slog.v(mTag, "finish(): mFinished=" + mFinished);
@@ -1280,6 +1349,11 @@
 
         mDreamToken = dreamToken;
         mCanDoze = canDoze;
+        mPreviewMode = isPreviewMode;
+        if (mPreviewMode) {
+            // Allow screen to dim when in preview mode.
+            mScreenBright = false;
+        }
         // This is not a security check to prevent malicious dreams but a guard rail to stop
         // third-party dreams from being windowless and not working well as a result.
         if (mWindowless && !mCanDoze && !isCallerSystemUi()) {
diff --git a/core/java/android/service/dreams/IDreamManager.aidl b/core/java/android/service/dreams/IDreamManager.aidl
index c489c58..e45384f 100644
--- a/core/java/android/service/dreams/IDreamManager.aidl
+++ b/core/java/android/service/dreams/IDreamManager.aidl
@@ -40,7 +40,7 @@
     boolean isDreamingOrInPreview();
     boolean canStartDreaming(boolean isScreenOn);
     void finishSelf(in IBinder token, boolean immediate);
-    void startDozing(in IBinder token, int screenState, int screenBrightness);
+    void startDozing(in IBinder token, int screenState, int reason, int screenBrightness);
     void stopDozing(in IBinder token);
     void forceAmbientDisplayEnabled(boolean enabled);
     ComponentName[] getDreamComponentsForUser(int userId);
diff --git a/core/java/android/service/dreams/flags.aconfig b/core/java/android/service/dreams/flags.aconfig
index 91a713e..cca4937 100644
--- a/core/java/android/service/dreams/flags.aconfig
+++ b/core/java/android/service/dreams/flags.aconfig
@@ -7,3 +7,14 @@
       "relying on the dream's window"
   bug: "291990564"
 }
+
+flag {
+  name: "dream_handles_confirm_keys"
+  namespace: "communal"
+  description: "This flag enables dreams processing confirm keys to show the bouncer or dismiss "
+       "the keyguard"
+  bug: "326975875"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java
index d821074..264b53c 100644
--- a/core/java/android/service/notification/StatusBarNotification.java
+++ b/core/java/android/service/notification/StatusBarNotification.java
@@ -174,23 +174,6 @@
         return sbnKey;
     }
 
-    /**
-     * @return Whether the Entry is a group child by the app or system
-     * @hide
-     */
-    public boolean isAppOrSystemGroupChild() {
-        return isGroup() && !getNotification().isGroupSummary();
-    }
-
-
-    /**
-     * @return Whether the Entry is a group summary by the app or system
-     * @hide
-     */
-    public boolean isAppOrSystemGroupSummary() {
-        return isGroup() && getNotification().isGroupSummary();
-    }
-
     private String groupKey() {
         if (overrideGroupKey != null) {
             return user.getIdentifier() + "|" + pkg + "|" + "g:" + overrideGroupKey;
diff --git a/core/java/android/service/notification/SystemZenRules.java b/core/java/android/service/notification/SystemZenRules.java
new file mode 100644
index 0000000..302efb3
--- /dev/null
+++ b/core/java/android/service/notification/SystemZenRules.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.service.notification;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.AutomaticZenRule;
+import android.app.Flags;
+import android.content.Context;
+import android.service.notification.ZenModeConfig.EventInfo;
+import android.service.notification.ZenModeConfig.ScheduleInfo;
+import android.service.notification.ZenModeConfig.ZenRule;
+import android.text.format.DateFormat;
+import android.util.Log;
+
+import com.android.internal.R;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.Objects;
+
+/**
+ * Helper methods for schedule-type (system-owned) rules.
+ * @hide
+ */
+public final class SystemZenRules {
+
+    private static final String TAG = "SystemZenRules";
+
+    public static final String PACKAGE_ANDROID = "android";
+
+    /** Updates existing system-owned rules to use the new Modes fields (type, etc). */
+    @FlaggedApi(Flags.FLAG_MODES_API)
+    public static void maybeUpgradeRules(Context context, ZenModeConfig config) {
+        for (ZenRule rule : config.automaticRules.values()) {
+            if (isSystemOwnedRule(rule) && rule.type == AutomaticZenRule.TYPE_UNKNOWN) {
+                upgradeSystemProviderRule(context, rule);
+            }
+        }
+    }
+
+    /**
+     * Returns whether the rule corresponds to a system ConditionProviderService (i.e. it is owned
+     * by the "android" package).
+     */
+    public static boolean isSystemOwnedRule(ZenRule rule) {
+        return PACKAGE_ANDROID.equals(rule.pkg);
+    }
+
+    @FlaggedApi(Flags.FLAG_MODES_API)
+    private static void upgradeSystemProviderRule(Context context, ZenRule rule) {
+        ScheduleInfo scheduleInfo = ZenModeConfig.tryParseScheduleConditionId(rule.conditionId);
+        if (scheduleInfo != null) {
+            rule.type = AutomaticZenRule.TYPE_SCHEDULE_TIME;
+            rule.triggerDescription = getTriggerDescriptionForScheduleTime(context, scheduleInfo);
+            return;
+        }
+        EventInfo eventInfo = ZenModeConfig.tryParseEventConditionId(rule.conditionId);
+        if (eventInfo != null) {
+            rule.type = AutomaticZenRule.TYPE_SCHEDULE_CALENDAR;
+            rule.triggerDescription = getTriggerDescriptionForScheduleEvent(context, eventInfo);
+            return;
+        }
+        Log.wtf(TAG, "Couldn't determine type of system-owned ZenRule " + rule);
+    }
+
+    /**
+     * Updates the {@link ZenRule#triggerDescription} of the system-owned rule based on the schedule
+     * or event condition encoded in its {@link ZenRule#conditionId}.
+     *
+     * @return {@code true} if the trigger description was updated.
+     */
+    public static boolean updateTriggerDescription(Context context, ZenRule rule) {
+        ScheduleInfo scheduleInfo = ZenModeConfig.tryParseScheduleConditionId(rule.conditionId);
+        if (scheduleInfo != null) {
+            return updateTriggerDescription(rule,
+                    getTriggerDescriptionForScheduleTime(context, scheduleInfo));
+        }
+        EventInfo eventInfo = ZenModeConfig.tryParseEventConditionId(rule.conditionId);
+        if (eventInfo != null) {
+            return updateTriggerDescription(rule,
+                    getTriggerDescriptionForScheduleEvent(context, eventInfo));
+        }
+        Log.wtf(TAG, "Couldn't determine type of system-owned ZenRule " + rule);
+        return false;
+    }
+
+    private static boolean updateTriggerDescription(ZenRule rule, String triggerDescription) {
+        if (!Objects.equals(rule.triggerDescription, triggerDescription)) {
+            rule.triggerDescription = triggerDescription;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Returns a suitable trigger description for a time-schedule rule (e.g. "Mon-Fri, 8:00-10:00"),
+     * using the Context's current locale.
+     */
+    @Nullable
+    public static String getTriggerDescriptionForScheduleTime(Context context,
+            @NonNull ScheduleInfo schedule) {
+        final StringBuilder sb = new StringBuilder();
+        String daysSummary = getShortDaysSummary(context, schedule);
+        if (daysSummary == null) {
+            // no use outputting times without dates
+            return null;
+        }
+        sb.append(daysSummary);
+        sb.append(context.getString(R.string.zen_mode_trigger_summary_divider_text));
+        sb.append(context.getString(
+                R.string.zen_mode_trigger_summary_range_symbol_combination,
+                timeString(context, schedule.startHour, schedule.startMinute),
+                timeString(context, schedule.endHour, schedule.endMinute)));
+
+        return sb.toString();
+    }
+
+    /**
+     * Returns an ordered summarized list of the days on which this schedule applies, with
+     * adjacent days grouped together ("Sun-Wed" instead of "Sun,Mon,Tue,Wed").
+     */
+    @Nullable
+    private static String getShortDaysSummary(Context context, @NonNull ScheduleInfo schedule) {
+        // Compute a list of days with contiguous days grouped together, for example: "Sun-Thu" or
+        // "Sun-Mon,Wed,Fri"
+        final int[] days = schedule.days;
+        if (days != null && days.length > 0) {
+            final StringBuilder sb = new StringBuilder();
+            final Calendar cStart = Calendar.getInstance(getLocale(context));
+            final Calendar cEnd = Calendar.getInstance(getLocale(context));
+            int[] daysOfWeek = getDaysOfWeekForLocale(cStart);
+            // the i for loop goes through days in order as determined by locale. as we walk through
+            // the days of the week, keep track of "start" and "last seen"  as indicators for
+            // what's contiguous, and initialize them to something not near actual indices
+            int startDay = Integer.MIN_VALUE;
+            int lastSeenDay = Integer.MIN_VALUE;
+            for (int i = 0; i < daysOfWeek.length; i++) {
+                final int day = daysOfWeek[i];
+
+                // by default, output if this day is *not* included in the schedule, and thus
+                // ends a previously existing block. if this day is included in the schedule
+                // after all (as will be determined in the inner for loop), then output will be set
+                // to false.
+                boolean output = (i == lastSeenDay + 1);
+                for (int j = 0; j < days.length; j++) {
+                    if (day == days[j]) {
+                        // match for this day in the schedule (indicated by counter i)
+                        if (i == lastSeenDay + 1) {
+                            // contiguous to the block we're walking through right now, record it
+                            // (specifically, i, the day index) and move on to the next day
+                            lastSeenDay = i;
+                            output = false;
+                        } else {
+                            // it's a match, but not 1 past the last match, we are starting a new
+                            // block
+                            startDay = i;
+                            lastSeenDay = i;
+                        }
+
+                        // if there is a match on the last day, also make sure to output at the end
+                        // of this loop, and mark the day as the last day we'll have seen in the
+                        // scheduled days.
+                        if (i == daysOfWeek.length - 1) {
+                            output = true;
+                        }
+                        break;
+                    }
+                }
+
+                // output in either of 2 cases: this day is not a match, so has ended any previous
+                // block, or this day *is* a match but is the last day of the week, so we need to
+                // summarize
+                if (output) {
+                    // either describe just the single day if startDay == lastSeenDay, or
+                    // output "startDay - lastSeenDay" as a group
+                    if (sb.length() > 0) {
+                        sb.append(
+                                context.getString(R.string.zen_mode_trigger_summary_divider_text));
+                    }
+
+                    SimpleDateFormat dayFormat = new SimpleDateFormat("EEE", getLocale(context));
+                    if (startDay == lastSeenDay) {
+                        // last group was only one day
+                        cStart.set(Calendar.DAY_OF_WEEK, daysOfWeek[startDay]);
+                        sb.append(dayFormat.format(cStart.getTime()));
+                    } else {
+                        // last group was a contiguous group of days, so group them together
+                        cStart.set(Calendar.DAY_OF_WEEK, daysOfWeek[startDay]);
+                        cEnd.set(Calendar.DAY_OF_WEEK, daysOfWeek[lastSeenDay]);
+                        sb.append(context.getString(
+                                R.string.zen_mode_trigger_summary_range_symbol_combination,
+                                dayFormat.format(cStart.getTime()),
+                                dayFormat.format(cEnd.getTime())));
+                    }
+                }
+            }
+
+            if (sb.length() > 0) {
+                return sb.toString();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Convenience method for representing the specified time in string format.
+     */
+    private static String timeString(Context context, int hour, int minute) {
+        final Calendar c = Calendar.getInstance(getLocale(context));
+        c.set(Calendar.HOUR_OF_DAY, hour);
+        c.set(Calendar.MINUTE, minute);
+        return DateFormat.getTimeFormat(context).format(c.getTime());
+    }
+
+    private static int[] getDaysOfWeekForLocale(Calendar c) {
+        int[] daysOfWeek = new int[7];
+        int currentDay = c.getFirstDayOfWeek();
+        for (int i = 0; i < daysOfWeek.length; i++) {
+            if (currentDay > 7) currentDay = 1;
+            daysOfWeek[i] = currentDay;
+            currentDay++;
+        }
+        return daysOfWeek;
+    }
+
+    private static Locale getLocale(Context context) {
+        return context.getResources().getConfiguration().getLocales().get(0);
+    }
+
+    /**
+     * Returns a suitable trigger description for a calendar-schedule rule (either the name of the
+     * calendar, or a message indicating all calendars are included).
+     */
+    public static String getTriggerDescriptionForScheduleEvent(Context context,
+            @NonNull EventInfo event) {
+        if (event.calName != null) {
+            return event.calName;
+        } else {
+            return context.getResources().getString(
+                    R.string.zen_mode_trigger_event_calendar_any);
+        }
+    }
+
+    private SystemZenRules() {}
+}
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index 1d6dd1e..610a317 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -1773,7 +1773,12 @@
         return true;
     }
 
+    /**
+     * Returns the {@link ScheduleInfo} encoded in the condition id, or {@code null} if it could not
+     * be decoded.
+     */
     @UnsupportedAppUsage
+    @Nullable
     public static ScheduleInfo tryParseScheduleConditionId(Uri conditionId) {
         final boolean isSchedule =  conditionId != null
                 && Condition.SCHEME.equals(conditionId.getScheme())
@@ -1882,6 +1887,11 @@
         return tryParseEventConditionId(conditionId) != null;
     }
 
+    /**
+     * Returns the {@link EventInfo} encoded in the condition id, or {@code null} if it could not be
+     * decoded.
+     */
+    @Nullable
     public static EventInfo tryParseEventConditionId(Uri conditionId) {
         final boolean isEvent = conditionId != null
                 && Condition.SCHEME.equals(conditionId.getScheme())
diff --git a/core/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl b/core/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl
index 908ab5f..45c4350 100644
--- a/core/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl
+++ b/core/java/android/service/ondeviceintelligence/IOnDeviceIntelligenceService.aidl
@@ -42,9 +42,10 @@
     void getReadOnlyFileDescriptor(in String fileName, in AndroidFuture<ParcelFileDescriptor> future);
     void getReadOnlyFeatureFileDescriptorMap(in Feature feature, in RemoteCallback remoteCallback);
     void requestFeatureDownload(int callerUid, in Feature feature,
-                                in AndroidFuture<ICancellationSignal> cancellationSignal,
+                                in AndroidFuture cancellationSignal,
                                 in IDownloadCallback downloadCallback);
     void registerRemoteServices(in IRemoteProcessingService remoteProcessingService);
     void notifyInferenceServiceConnected();
     void notifyInferenceServiceDisconnected();
+    void ready();
 }
\ No newline at end of file
diff --git a/core/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl b/core/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl
index 4213a09..2aa17c4 100644
--- a/core/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl
+++ b/core/java/android/service/ondeviceintelligence/IOnDeviceSandboxedInferenceService.aidl
@@ -36,15 +36,15 @@
 oneway interface IOnDeviceSandboxedInferenceService {
     void registerRemoteStorageService(in IRemoteStorageService storageService);
     void requestTokenInfo(int callerUid, in Feature feature, in Bundle request,
-                            in AndroidFuture<ICancellationSignal> cancellationSignal,
+                            in AndroidFuture cancellationSignal,
                             in ITokenInfoCallback tokenInfoCallback);
     void processRequest(int callerUid, in Feature feature, in Bundle request, in int requestType,
-                        in AndroidFuture<ICancellationSignal> cancellationSignal,
-                        in AndroidFuture<IProcessingSignal> processingSignal,
+                        in AndroidFuture cancellationSignal,
+                        in AndroidFuture processingSignal,
                         in IResponseCallback callback);
     void processRequestStreaming(int callerUid, in Feature feature, in Bundle request, in int requestType,
-                                in AndroidFuture<ICancellationSignal> cancellationSignal,
-                                in AndroidFuture<IProcessingSignal> processingSignal,
+                                in AndroidFuture cancellationSignal,
+                                in AndroidFuture processingSignal,
                                 in IStreamingResponseCallback callback);
     void updateProcessingState(in Bundle processingState,
                                      in IProcessingUpdateStatusCallback callback);
diff --git a/core/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java b/core/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java
index 86320b8..793e58a 100644
--- a/core/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java
+++ b/core/java/android/service/ondeviceintelligence/OnDeviceIntelligenceService.java
@@ -24,6 +24,7 @@
 import android.annotation.Nullable;
 import android.annotation.SdkConstant;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.app.Service;
 import android.app.ondeviceintelligence.DownloadCallback;
 import android.app.ondeviceintelligence.Feature;
@@ -34,7 +35,7 @@
 import android.app.ondeviceintelligence.IListFeaturesCallback;
 import android.app.ondeviceintelligence.OnDeviceIntelligenceException;
 import android.app.ondeviceintelligence.OnDeviceIntelligenceManager;
-import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.InferenceParams;
+import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.StateParams;
 import android.content.Intent;
 import android.os.Binder;
 import android.os.Bundle;
@@ -111,6 +112,11 @@
             return new IOnDeviceIntelligenceService.Stub() {
                 /** {@inheritDoc} */
                 @Override
+                public void ready() {
+                    OnDeviceIntelligenceService.this.onReady();
+                }
+
+                @Override
                 public void getVersion(RemoteCallback remoteCallback) {
                     Objects.requireNonNull(remoteCallback);
                     OnDeviceIntelligenceService.this.onGetVersion(l -> {
@@ -208,6 +214,16 @@
         return null;
     }
 
+    /**
+     * Using this signal to assertively a signal each time service binds successfully, used only in
+     * tests to get a signal that service instance is ready. This is needed because we cannot rely
+     * on {@link #onCreate} or {@link #onBind} to be invoke on each binding.
+     *
+     * @hide
+     */
+    @TestApi
+    public void onReady() {}
+
 
     /**
      * Invoked when a new instance of the remote inference service is created.
@@ -229,13 +245,13 @@
      * service if there is a state change to be performed. State change could be config updates,
      * performing initialization or cleanup tasks in the remote inference service.
      * The Bundle passed in here is expected to be read-only and will be rejected if it has any
-     * writable fields as detailed under {@link InferenceParams}.
+     * writable fields as detailed under {@link StateParams}.
      *
      * @param processingState  the updated state to be applied.
      * @param callbackExecutor executor to the run status callback on.
      * @param statusReceiver   receiver to get status of the update state operation.
      */
-    public final void updateProcessingState(@NonNull @InferenceParams Bundle processingState,
+    public final void updateProcessingState(@NonNull @StateParams Bundle processingState,
             @NonNull @CallbackExecutor Executor callbackExecutor,
             @NonNull OutcomeReceiver<PersistableBundle, OnDeviceIntelligenceException> statusReceiver) {
         Objects.requireNonNull(callbackExecutor);
diff --git a/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java b/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java
index 96c45ee..29a6db6 100644
--- a/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java
+++ b/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java
@@ -35,6 +35,7 @@
 import android.app.ondeviceintelligence.OnDeviceIntelligenceException;
 import android.app.ondeviceintelligence.OnDeviceIntelligenceManager;
 import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.InferenceParams;
+import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.StateParams;
 import android.app.ondeviceintelligence.ProcessingCallback;
 import android.app.ondeviceintelligence.ProcessingSignal;
 import android.app.ondeviceintelligence.StreamingProcessingCallback;
@@ -293,7 +294,7 @@
      * @param callback        callback to populate the update status and if there are params
      *                        associated with the status.
      */
-    public abstract void onUpdateProcessingState(@NonNull @InferenceParams Bundle processingState,
+    public abstract void onUpdateProcessingState(@NonNull @StateParams Bundle processingState,
             @NonNull OutcomeReceiver<PersistableBundle,
                     OnDeviceIntelligenceException> callback);
 
diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
index e6d8fd0..8a3f6ce 100644
--- a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
+++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
@@ -71,9 +71,11 @@
 
     @Nullable
     static QuickAccessWalletServiceInfo tryCreate(@NonNull Context context) {
-        String defaultAppPackageName = getDefaultWalletApp(context);
+        String defaultAppPackageName = null;
 
-        if (defaultAppPackageName == null) {
+        if (isWalletRoleAvailable(context)) {
+            defaultAppPackageName = getDefaultWalletApp(context);
+        } else {
             ComponentName defaultPaymentApp = getDefaultPaymentApp(context);
             if (defaultPaymentApp == null) {
                 return null;
@@ -103,14 +105,21 @@
         final long token = Binder.clearCallingIdentity();
         try {
             RoleManager roleManager = context.getSystemService(RoleManager.class);
-            if (roleManager.isRoleAvailable(RoleManager.ROLE_WALLET)) {
-                List<String> roleHolders = roleManager.getRoleHolders(RoleManager.ROLE_WALLET);
-                return roleHolders.isEmpty() ? null : roleHolders.get(0);
-            }
+            List<String> roleHolders = roleManager.getRoleHolders(RoleManager.ROLE_WALLET);
+            return roleHolders.isEmpty() ? null : roleHolders.get(0);
         } finally {
             Binder.restoreCallingIdentity(token);
         }
-        return null;
+    }
+
+    private static boolean isWalletRoleAvailable(Context context) {
+        final long token = Binder.clearCallingIdentity();
+        try {
+            RoleManager roleManager = context.getSystemService(RoleManager.class);
+            return roleManager.isRoleAvailable(RoleManager.ROLE_WALLET);
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
     }
 
     private static ComponentName getDefaultPaymentApp(Context context) {
diff --git a/core/java/android/service/voice/HotwordDetectedResult.java b/core/java/android/service/voice/HotwordDetectedResult.java
index df4a2bb..0b7b199 100644
--- a/core/java/android/service/voice/HotwordDetectedResult.java
+++ b/core/java/android/service/voice/HotwordDetectedResult.java
@@ -16,10 +16,10 @@
 
 package android.service.voice;
 
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
 import android.content.res.Resources;
 import android.media.AudioRecord;
@@ -27,7 +27,6 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.PersistableBundle;
-import android.service.voice.flags.Flags;
 
 import com.android.internal.R;
 import com.android.internal.util.DataClass;
@@ -142,7 +141,7 @@
     }
 
     /** Maximum number of active speaker ids. **/
-    @FlaggedApi(Flags.FLAG_ALLOW_SPEAKER_ID_EGRESS)
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public static int getMaxSpeakerId() {
         return 15;
     }
@@ -666,7 +665,7 @@
      * <p>Only values between 0 and {@link #getMaxSpeakerId} (inclusive) are accepted.
      */
     @DataClass.Generated.Member
-    @FlaggedApi(Flags.FLAG_ALLOW_SPEAKER_ID_EGRESS)
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public int getSpeakerId() {
         return mSpeakerId;
     }
@@ -988,7 +987,7 @@
          * <p>Only values between 0 and {@link #getMaxSpeakerId} (inclusive) are accepted.
          */
         @DataClass.Generated.Member
-        @FlaggedApi(Flags.FLAG_ALLOW_SPEAKER_ID_EGRESS)
+        @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
         public @NonNull Builder setSpeakerId(int value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x1;
@@ -1232,10 +1231,10 @@
     }
 
     @DataClass.Generated(
-            time = 1709773165191L,
+            time = 1710918729668L,
             codegenVersion = "1.0.23",
             sourceFile = "frameworks/base/core/java/android/service/voice/HotwordDetectedResult.java",
-            inputSignatures = "public static final  int CONFIDENCE_LEVEL_NONE\npublic static final  int CONFIDENCE_LEVEL_LOW\npublic static final  int CONFIDENCE_LEVEL_LOW_MEDIUM\npublic static final  int CONFIDENCE_LEVEL_MEDIUM\npublic static final  int CONFIDENCE_LEVEL_MEDIUM_HIGH\npublic static final  int CONFIDENCE_LEVEL_HIGH\npublic static final  int CONFIDENCE_LEVEL_VERY_HIGH\npublic static final  int HOTWORD_OFFSET_UNSET\npublic static final  int AUDIO_CHANNEL_UNSET\npublic static final  int BACKGROUND_AUDIO_POWER_UNSET\nprivate static final  int LIMIT_HOTWORD_OFFSET_MAX_VALUE\nprivate static final  int LIMIT_AUDIO_CHANNEL_MAX_VALUE\nprivate static final  java.lang.String EXTRA_PROXIMITY\npublic static final  int PROXIMITY_UNKNOWN\npublic static final  int PROXIMITY_NEAR\npublic static final  int PROXIMITY_FAR\nprivate final  int mSpeakerId\nprivate final @android.service.voice.HotwordDetectedResult.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate @android.annotation.Nullable android.media.MediaSyncEvent mMediaSyncEvent\nprivate  int mHotwordOffsetMillis\nprivate  int mHotwordDurationMillis\nprivate  int mAudioChannel\nprivate  boolean mHotwordDetectionPersonalized\nprivate final  int mScore\nprivate final  int mPersonalizedScore\nprivate final  int mHotwordPhraseId\nprivate final @android.annotation.NonNull java.util.List<android.service.voice.HotwordAudioStream> mAudioStreams\nprivate final @android.annotation.NonNull android.os.PersistableBundle mExtras\nprivate static  int sMaxBundleSize\nprivate final  int mBackgroundAudioPower\nprivate static  int defaultSpeakerId()\npublic static @android.annotation.FlaggedApi int getMaxSpeakerId()\nprivate static  int defaultConfidenceLevel()\nprivate static  int defaultScore()\nprivate static  int defaultPersonalizedScore()\npublic static  int getMaxScore()\nprivate static  int defaultHotwordPhraseId()\npublic static  int getMaxHotwordPhraseId()\nprivate static  java.util.List<android.service.voice.HotwordAudioStream> defaultAudioStreams()\nprivate static  android.os.PersistableBundle defaultExtras()\npublic static  int getMaxBundleSize()\npublic @android.annotation.Nullable android.media.MediaSyncEvent getMediaSyncEvent()\nprivate static  int defaultBackgroundAudioPower()\npublic static  int getMaxBackgroundAudioPower()\npublic static  int getParcelableSize(android.os.Parcelable)\npublic static  int getUsageSize(android.service.voice.HotwordDetectedResult)\nprivate static  int bitCount(long)\nprivate  void onConstructed()\npublic @android.annotation.NonNull java.util.List<android.service.voice.HotwordAudioStream> getAudioStreams()\npublic  void setProximity(double)\npublic @android.service.voice.HotwordDetectedResult.ProximityValue int getProximity()\nprivate @android.service.voice.HotwordDetectedResult.ProximityValue int convertToProximityLevel(double)\npublic  android.service.voice.HotwordDetectedResult.Builder buildUpon()\nclass HotwordDetectedResult extends java.lang.Object implements [android.os.Parcelable]\npublic @android.annotation.NonNull android.service.voice.HotwordDetectedResult.Builder setAudioStreams(java.util.List<android.service.voice.HotwordAudioStream>)\nclass BaseBuilder extends java.lang.Object implements []\[email protected](genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)\npublic @android.annotation.NonNull android.service.voice.HotwordDetectedResult.Builder setAudioStreams(java.util.List<android.service.voice.HotwordAudioStream>)\nclass BaseBuilder extends java.lang.Object implements []")
+            inputSignatures = "public static final  int CONFIDENCE_LEVEL_NONE\npublic static final  int CONFIDENCE_LEVEL_LOW\npublic static final  int CONFIDENCE_LEVEL_LOW_MEDIUM\npublic static final  int CONFIDENCE_LEVEL_MEDIUM\npublic static final  int CONFIDENCE_LEVEL_MEDIUM_HIGH\npublic static final  int CONFIDENCE_LEVEL_HIGH\npublic static final  int CONFIDENCE_LEVEL_VERY_HIGH\npublic static final  int HOTWORD_OFFSET_UNSET\npublic static final  int AUDIO_CHANNEL_UNSET\npublic static final  int BACKGROUND_AUDIO_POWER_UNSET\nprivate static final  int LIMIT_HOTWORD_OFFSET_MAX_VALUE\nprivate static final  int LIMIT_AUDIO_CHANNEL_MAX_VALUE\nprivate static final  java.lang.String EXTRA_PROXIMITY\npublic static final  int PROXIMITY_UNKNOWN\npublic static final  int PROXIMITY_NEAR\npublic static final  int PROXIMITY_FAR\nprivate final  int mSpeakerId\nprivate final @android.service.voice.HotwordDetectedResult.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate @android.annotation.Nullable android.media.MediaSyncEvent mMediaSyncEvent\nprivate  int mHotwordOffsetMillis\nprivate  int mHotwordDurationMillis\nprivate  int mAudioChannel\nprivate  boolean mHotwordDetectionPersonalized\nprivate final  int mScore\nprivate final  int mPersonalizedScore\nprivate final  int mHotwordPhraseId\nprivate final @android.annotation.NonNull java.util.List<android.service.voice.HotwordAudioStream> mAudioStreams\nprivate final @android.annotation.NonNull android.os.PersistableBundle mExtras\nprivate static  int sMaxBundleSize\nprivate final  int mBackgroundAudioPower\nprivate static  int defaultSpeakerId()\npublic static @android.annotation.SuppressLint int getMaxSpeakerId()\nprivate static  int defaultConfidenceLevel()\nprivate static  int defaultScore()\nprivate static  int defaultPersonalizedScore()\npublic static  int getMaxScore()\nprivate static  int defaultHotwordPhraseId()\npublic static  int getMaxHotwordPhraseId()\nprivate static  java.util.List<android.service.voice.HotwordAudioStream> defaultAudioStreams()\nprivate static  android.os.PersistableBundle defaultExtras()\npublic static  int getMaxBundleSize()\npublic @android.annotation.Nullable android.media.MediaSyncEvent getMediaSyncEvent()\nprivate static  int defaultBackgroundAudioPower()\npublic static  int getMaxBackgroundAudioPower()\npublic static  int getParcelableSize(android.os.Parcelable)\npublic static  int getUsageSize(android.service.voice.HotwordDetectedResult)\nprivate static  int bitCount(long)\nprivate  void onConstructed()\npublic @android.annotation.NonNull java.util.List<android.service.voice.HotwordAudioStream> getAudioStreams()\npublic  void setProximity(double)\npublic @android.service.voice.HotwordDetectedResult.ProximityValue int getProximity()\nprivate @android.service.voice.HotwordDetectedResult.ProximityValue int convertToProximityLevel(double)\npublic  android.service.voice.HotwordDetectedResult.Builder buildUpon()\nclass HotwordDetectedResult extends java.lang.Object implements [android.os.Parcelable]\npublic @android.annotation.NonNull android.service.voice.HotwordDetectedResult.Builder setAudioStreams(java.util.List<android.service.voice.HotwordAudioStream>)\nclass BaseBuilder extends java.lang.Object implements []\[email protected](genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)\npublic @android.annotation.NonNull android.service.voice.HotwordDetectedResult.Builder setAudioStreams(java.util.List<android.service.voice.HotwordAudioStream>)\nclass BaseBuilder extends java.lang.Object implements []")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/service/voice/OWNERS b/core/java/android/service/voice/OWNERS
index 763c79e..5f9f6bd 100644
--- a/core/java/android/service/voice/OWNERS
+++ b/core/java/android/service/voice/OWNERS
@@ -3,5 +3,4 @@
 include /core/java/android/app/assist/OWNERS
 
 # The owner here should not be assist owner
[email protected]
 [email protected]
diff --git a/core/java/android/service/voice/VisualQueryAttentionResult.java b/core/java/android/service/voice/VisualQueryAttentionResult.java
index 690990b..aad49d5 100644
--- a/core/java/android/service/voice/VisualQueryAttentionResult.java
+++ b/core/java/android/service/voice/VisualQueryAttentionResult.java
@@ -16,15 +16,14 @@
 
 package android.service.voice;
 
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.service.voice.flags.Flags;
 
 import com.android.internal.util.DataClass;
 
@@ -45,13 +44,15 @@
         genToString = true
 )
 @SystemApi
-@FlaggedApi(Flags.FLAG_ALLOW_VARIOUS_ATTENTION_TYPES)
+@SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
 public final class VisualQueryAttentionResult implements Parcelable {
 
     /** Intention type to allow the system to listen to audio-visual query interactions. */
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public static final int INTERACTION_INTENTION_AUDIO_VISUAL = 0;
 
     /** Intention type to allow the system to listen to visual accessibility query interactions. */
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public static final int INTERACTION_INTENTION_VISUAL_ACCESSIBILITY = 1;
 
     /**
@@ -94,6 +95,16 @@
                 .setEngagementLevel(mEngagementLevel);
     }
 
+    /**
+     * TODO(b/301491148): Remove suppressLint on generated API when fixed or sdk finalized.
+     * Codegen does not support flaggedAPI, so needs to review manually on the generated code
+     * and makes sure the following:
+     *     1. SuppressLint is added back to the API after each run of codegen
+     *     2. No unwanted method is modified due to suppressLint annotation
+     *
+     *  Run $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/service/voice/VisualQueryAttentionResult.java
+     *  for codegen on new APIs.
+     */
 
 
 
@@ -112,8 +123,8 @@
 
     /** @hide */
     @IntDef(prefix = "INTERACTION_INTENTION_", value = {
-        INTERACTION_INTENTION_AUDIO_VISUAL,
-        INTERACTION_INTENTION_VISUAL_ACCESSIBILITY
+            INTERACTION_INTENTION_AUDIO_VISUAL,
+            INTERACTION_INTENTION_VISUAL_ACCESSIBILITY
     })
     @Retention(RetentionPolicy.SOURCE)
     @DataClass.Generated.Member
@@ -124,15 +135,15 @@
     public static String interactionIntentionToString(@InteractionIntention int value) {
         switch (value) {
             case INTERACTION_INTENTION_AUDIO_VISUAL:
-                    return "INTERACTION_INTENTION_AUDIO_VISUAL";
+                return "INTERACTION_INTENTION_AUDIO_VISUAL";
             case INTERACTION_INTENTION_VISUAL_ACCESSIBILITY:
-                    return "INTERACTION_INTENTION_VISUAL_ACCESSIBILITY";
+                return "INTERACTION_INTENTION_VISUAL_ACCESSIBILITY";
             default: return Integer.toHexString(value);
         }
     }
 
     @DataClass.Generated.Member
-    /* package-private */ VisualQueryAttentionResult(
+        /* package-private */ VisualQueryAttentionResult(
             @InteractionIntention int interactionIntention,
             @IntRange(from = 1, to = 100) int engagementLevel) {
         this.mInteractionIntention = interactionIntention;
@@ -159,6 +170,7 @@
      * to after the attention signal is gained.
      */
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi")
     public @InteractionIntention int getInteractionIntention() {
         return mInteractionIntention;
     }
@@ -176,6 +188,7 @@
      * presentation of the device attention UI.
      */
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi")
     public @IntRange(from = 1, to = 100) int getEngagementLevel() {
         return mEngagementLevel;
     }
@@ -187,7 +200,7 @@
         // String fieldNameToString() { ... }
 
         return "VisualQueryAttentionResult { " +
-                "interactionIntention = " + interactionIntentionToString(mInteractionIntention) + ", " +
+                "interactionIntention = " + mInteractionIntention + ", " +
                 "engagementLevel = " + mEngagementLevel +
         " }";
     }
@@ -223,6 +236,7 @@
 
     @Override
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi")
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         // You can override field parcelling by defining methods like:
         // void parcelFieldName(Parcel dest, int flags) { ... }
@@ -233,6 +247,7 @@
 
     @Override
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi")
     public int describeContents() { return 0; }
 
     /** @hide */
@@ -246,7 +261,6 @@
         int engagementLevel = in.readInt();
 
         this.mInteractionIntention = interactionIntention;
-
         if (!(mInteractionIntention == INTERACTION_INTENTION_AUDIO_VISUAL)
                 && !(mInteractionIntention == INTERACTION_INTENTION_VISUAL_ACCESSIBILITY)) {
             throw new java.lang.IllegalArgumentException(
@@ -254,7 +268,6 @@
                             + "INTERACTION_INTENTION_AUDIO_VISUAL(" + INTERACTION_INTENTION_AUDIO_VISUAL + "), "
                             + "INTERACTION_INTENTION_VISUAL_ACCESSIBILITY(" + INTERACTION_INTENTION_VISUAL_ACCESSIBILITY + ")");
         }
-
         this.mEngagementLevel = engagementLevel;
         com.android.internal.util.AnnotationValidations.validate(
                 IntRange.class, null, mEngagementLevel,
@@ -265,6 +278,7 @@
     }
 
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi")
     public static final @NonNull Parcelable.Creator<VisualQueryAttentionResult> CREATOR
             = new Parcelable.Creator<VisualQueryAttentionResult>() {
         @Override
@@ -283,6 +297,7 @@
      */
     @SuppressWarnings("WeakerAccess")
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi")
     public static final class Builder {
 
         private @InteractionIntention int mInteractionIntention;
@@ -290,6 +305,7 @@
 
         private long mBuilderFieldsSet = 0L;
 
+        @SuppressLint("UnflaggedApi")
         public Builder() {
         }
 
@@ -298,6 +314,7 @@
          * to after the attention signal is gained.
          */
         @DataClass.Generated.Member
+        @SuppressLint("UnflaggedApi")
         public @NonNull Builder setInteractionIntention(@InteractionIntention int value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x1;
@@ -318,6 +335,7 @@
          * presentation of the device attention UI.
          */
         @DataClass.Generated.Member
+        @SuppressLint("UnflaggedApi")
         public @NonNull Builder setEngagementLevel(@IntRange(from = 1, to = 100) int value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x2;
@@ -326,6 +344,7 @@
         }
 
         /** Builds the instance. This builder should not be touched after calling this! */
+        @SuppressLint("UnflaggedApi")
         public @NonNull VisualQueryAttentionResult build() {
             checkNotUsed();
             mBuilderFieldsSet |= 0x4; // Mark builder used
@@ -351,10 +370,10 @@
     }
 
     @DataClass.Generated(
-            time = 1707773691880L,
+            time = 1710979945907L,
             codegenVersion = "1.0.23",
             sourceFile = "frameworks/base/core/java/android/service/voice/VisualQueryAttentionResult.java",
-            inputSignatures = "public static final  int INTERACTION_INTENTION_AUDIO_VISUAL\npublic static final  int INTERACTION_INTENTION_VISUAL_ACCESSIBILITY\nprivate final @android.service.voice.VisualQueryAttentionResult.InteractionIntention int mInteractionIntention\nprivate final @android.annotation.IntRange int mEngagementLevel\nprivate static @android.service.voice.VisualQueryAttentionResult.InteractionIntention int defaultInteractionIntention()\nprivate static  int defaultEngagementLevel()\npublic  android.service.voice.VisualQueryAttentionResult.Builder buildUpon()\nclass VisualQueryAttentionResult extends java.lang.Object implements [android.os.Parcelable]\[email protected](genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)")
+            inputSignatures = "public static final @android.annotation.SuppressLint int INTERACTION_INTENTION_AUDIO_VISUAL\npublic static final @android.annotation.SuppressLint int INTERACTION_INTENTION_VISUAL_ACCESSIBILITY\nprivate final @android.service.voice.VisualQueryAttentionResult.InteractionIntention int mInteractionIntention\nprivate final @android.annotation.IntRange int mEngagementLevel\nprivate static @android.service.voice.VisualQueryAttentionResult.InteractionIntention int defaultInteractionIntention()\nprivate static  int defaultEngagementLevel()\npublic  android.service.voice.VisualQueryAttentionResult.Builder buildUpon()\nclass VisualQueryAttentionResult extends java.lang.Object implements [android.os.Parcelable]\[email protected](genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/service/voice/VisualQueryDetectedResult.java b/core/java/android/service/voice/VisualQueryDetectedResult.java
index 3b61794..74b7da3 100644
--- a/core/java/android/service/voice/VisualQueryDetectedResult.java
+++ b/core/java/android/service/voice/VisualQueryDetectedResult.java
@@ -16,13 +16,12 @@
 
 package android.service.voice;
 
-import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.service.voice.flags.Flags;
 
 import com.android.internal.util.DataClass;
 import com.android.internal.util.Preconditions;
@@ -43,7 +42,7 @@
         genToString = true
 )
 @SystemApi
-@FlaggedApi(Flags.FLAG_ALLOW_COMPLEX_RESULTS_EGRESS_FROM_VQDS)
+@SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
 public final class VisualQueryDetectedResult implements Parcelable {
 
     /**
@@ -64,6 +63,7 @@
         return 0;
     }
     /** Maximum number of active speaker ids. **/
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public static int getMaxSpeakerId() {
         return 15;
     }
@@ -100,6 +100,16 @@
                 .setAccessibilityDetectionData(mAccessibilityDetectionData);
     }
 
+    /**
+     * TODO(b/301491148): Remove suppressLint on generated API when fixed or sdk finalized.
+     * Codegen does not support flaggedAPI, so needs to review manually on the generated code
+     * and makes sure the following:
+     *     1. SuppressLint is added back to the API after each run of codegen
+     *     2. No unwanted method is modified due to suppressLint annotation
+     *
+     *  Run $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/service/voice/VisualQueryAttentionResult.java
+     *  for codegen on new APIs.
+     */
 
     // Code below generated by codegen v1.0.23.
     //
@@ -132,6 +142,7 @@
      * Text query being associated with the detection result.
      */
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public @NonNull String getPartialQuery() {
         return mPartialQuery;
     }
@@ -142,6 +153,7 @@
      * <p>Only values between 0 and {@link #getMaxSpeakerId} (inclusive) are accepted.
      */
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public int getSpeakerId() {
         return mSpeakerId;
     }
@@ -152,6 +164,7 @@
      * {@link VisualQueryDetector@setAccessibilityDetectionEnabled(boolean)}
      */
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public @Nullable byte[] getAccessibilityDetectionData() {
         return mAccessibilityDetectionData;
     }
@@ -202,6 +215,7 @@
 
     @Override
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         // You can override field parcelling by defining methods like:
         // void parcelFieldName(Parcel dest, int flags) { ... }
@@ -213,6 +227,7 @@
 
     @Override
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public int describeContents() { return 0; }
 
     /** @hide */
@@ -236,6 +251,7 @@
     }
 
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public static final @NonNull Parcelable.Creator<VisualQueryDetectedResult> CREATOR
             = new Parcelable.Creator<VisualQueryDetectedResult>() {
         @Override
@@ -254,6 +270,7 @@
      */
     @SuppressWarnings("WeakerAccess")
     @DataClass.Generated.Member
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public static final class Builder {
 
         private @NonNull String mPartialQuery;
@@ -262,6 +279,7 @@
 
         private long mBuilderFieldsSet = 0L;
 
+        @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
         public Builder() {
         }
 
@@ -269,6 +287,7 @@
          * Text query being associated with the detection result.
          */
         @DataClass.Generated.Member
+        @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
         public @NonNull Builder setPartialQuery(@NonNull String value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x1;
@@ -282,6 +301,7 @@
          * <p>Only values between 0 and {@link #getMaxSpeakerId} (inclusive) are accepted.
          */
         @DataClass.Generated.Member
+        @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
         public @NonNull Builder setSpeakerId(int value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x2;
@@ -295,6 +315,7 @@
          * {@link VisualQueryDetector@setAccessibilityDetectionEnabled(boolean)}
          */
         @DataClass.Generated.Member
+        @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
         public @NonNull Builder setAccessibilityDetectionData(@NonNull byte... value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x4;
@@ -303,6 +324,7 @@
         }
 
         /** Builds the instance. This builder should not be touched after calling this! */
+        @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
         public @NonNull VisualQueryDetectedResult build() {
             checkNotUsed();
             mBuilderFieldsSet |= 0x8; // Mark builder used
@@ -332,10 +354,10 @@
     }
 
     @DataClass.Generated(
-            time = 1707429290528L,
+            time = 1710958903381L,
             codegenVersion = "1.0.23",
             sourceFile = "frameworks/base/core/java/android/service/voice/VisualQueryDetectedResult.java",
-            inputSignatures = "private final @android.annotation.NonNull java.lang.String mPartialQuery\nprivate final  int mSpeakerId\nprivate final @android.annotation.Nullable byte[] mAccessibilityDetectionData\nprivate static  java.lang.String defaultPartialQuery()\nprivate static  int defaultSpeakerId()\npublic static  int getMaxSpeakerId()\nprivate static  byte[] defaultAccessibilityDetectionData()\nprivate  void onConstructed()\npublic  android.service.voice.VisualQueryDetectedResult.Builder buildUpon()\nclass VisualQueryDetectedResult extends java.lang.Object implements [android.os.Parcelable]\[email protected](genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)")
+            inputSignatures = "private final @android.annotation.NonNull java.lang.String mPartialQuery\nprivate final  int mSpeakerId\nprivate final @android.annotation.Nullable byte[] mAccessibilityDetectionData\nprivate static  java.lang.String defaultPartialQuery()\nprivate static  int defaultSpeakerId()\npublic static @android.annotation.SuppressLint int getMaxSpeakerId()\nprivate static  byte[] defaultAccessibilityDetectionData()\nprivate  void onConstructed()\npublic  android.service.voice.VisualQueryDetectedResult.Builder buildUpon()\nclass VisualQueryDetectedResult extends java.lang.Object implements [android.os.Parcelable]\[email protected](genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/core/java/android/service/voice/VisualQueryDetectionService.java b/core/java/android/service/voice/VisualQueryDetectionService.java
index b9f4c32..8c9731d 100644
--- a/core/java/android/service/voice/VisualQueryDetectionService.java
+++ b/core/java/android/service/voice/VisualQueryDetectionService.java
@@ -17,7 +17,6 @@
 package android.service.voice;
 
 import android.annotation.DurationMillisLong;
-import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SdkConstant;
@@ -36,7 +35,6 @@
 import android.os.PersistableBundle;
 import android.os.RemoteException;
 import android.os.SharedMemory;
-import android.service.voice.flags.Flags;
 import android.speech.IRecognitionServiceManager;
 import android.util.Log;
 import android.view.contentcapture.ContentCaptureManager;
@@ -272,14 +270,10 @@
      *
      */
     public final void gainedAttention() {
-        if (Flags.allowVariousAttentionTypes()) {
-            gainedAttention(new VisualQueryAttentionResult.Builder().build());
-        } else {
-            try {
-                mRemoteCallback.onAttentionGained(null);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
+        try {
+            mRemoteCallback.onAttentionGained(null);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -299,7 +293,7 @@
      *
      * @param attentionResult Attention result of type {@link VisualQueryAttentionResult}.
      */
-    @FlaggedApi(Flags.FLAG_ALLOW_VARIOUS_ATTENTION_TYPES)
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public final void gainedAttention(@NonNull VisualQueryAttentionResult attentionResult) {
         try {
             mRemoteCallback.onAttentionGained(attentionResult);
@@ -312,15 +306,10 @@
      * Informs the system that all attention has lost to stop streaming.
      */
     public final void lostAttention() {
-        if (Flags.allowVariousAttentionTypes()) {
-            lostAttention(VisualQueryAttentionResult.INTERACTION_INTENTION_AUDIO_VISUAL);
-            lostAttention(VisualQueryAttentionResult.INTERACTION_INTENTION_VISUAL_ACCESSIBILITY);
-        } else {
-            try {
-                mRemoteCallback.onAttentionLost(0); // placeholder
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
+        try {
+            mRemoteCallback.onAttentionLost(0); // placeholder
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -332,7 +321,7 @@
      * @param interactionIntention Interaction intention, one of
      *        {@link VisualQueryAttentionResult#InteractionIntention}.
      */
-    @FlaggedApi(Flags.FLAG_ALLOW_VARIOUS_ATTENTION_TYPES)
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public final void lostAttention(
             @VisualQueryAttentionResult.InteractionIntention int interactionIntention) {
         try {
@@ -375,7 +364,7 @@
      * @param partialResult Partially detected result in the format of
      * {@link VisualQueryDetectedResult}.
      */
-    @FlaggedApi(Flags.FLAG_ALLOW_COMPLEX_RESULTS_EGRESS_FROM_VQDS)
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public final void streamQuery(@NonNull VisualQueryDetectedResult partialResult) {
         Objects.requireNonNull(partialResult);
         try {
diff --git a/core/java/android/service/voice/VisualQueryDetector.java b/core/java/android/service/voice/VisualQueryDetector.java
index bf8de06..cd1d125 100644
--- a/core/java/android/service/voice/VisualQueryDetector.java
+++ b/core/java/android/service/voice/VisualQueryDetector.java
@@ -20,7 +20,6 @@
 import static android.Manifest.permission.RECORD_AUDIO;
 
 import android.annotation.CallbackExecutor;
-import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
@@ -34,7 +33,6 @@
 import android.os.PersistableBundle;
 import android.os.RemoteException;
 import android.os.SharedMemory;
-import android.service.voice.flags.Flags;
 import android.text.TextUtils;
 import android.util.Slog;
 
@@ -187,7 +185,7 @@
      * @hide
      */
     @SystemApi
-    @FlaggedApi(Flags.FLAG_ALLOW_COMPLEX_RESULTS_EGRESS_FROM_VQDS)
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public boolean isAccessibilityDetectionEnabled() {
         Slog.d(TAG, "Fetching accessibility setting");
         synchronized (mInitializationDelegate.getLock()) {
@@ -214,7 +212,7 @@
      * @hide
      */
     @SystemApi
-    @FlaggedApi(Flags.FLAG_ALLOW_COMPLEX_RESULTS_EGRESS_FROM_VQDS)
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public void setAccessibilityDetectionEnabledListener(@NonNull Consumer<Boolean> listener) {
         Slog.d(TAG, "Registering Accessibility settings listener.");
         synchronized (mInitializationDelegate.getLock()) {
@@ -247,7 +245,7 @@
      * @hide
      */
     @SystemApi
-    @FlaggedApi(Flags.FLAG_ALLOW_COMPLEX_RESULTS_EGRESS_FROM_VQDS)
+    @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
     public void clearAccessibilityDetectionEnabledListener() {
         Slog.d(TAG, "Unregistering Accessibility settings listener.");
         synchronized (mInitializationDelegate.getLock()) {
@@ -301,8 +299,15 @@
     }
 
     /**
-     * A class that lets a VoiceInteractionService implementation interact with
-     * visual query detection APIs.
+     * A class that lets a VoiceInteractionService implementation interact with visual query
+     * detection APIs.
+     *
+     * Note that methods in this callbacks are not thread-safe so the invocation of each
+     * methods will have different order from how they are called in the
+     * {@link VisualQueryDetectionService}. It is expected to pass a single thread executor or a
+     * serial executor as the callback executor when creating the {@link VisualQueryDetector}
+     * with {@link VoiceInteractionService#createVisualQueryDetector(
+     * PersistableBundle, SharedMemory, Executor, Callback)}.
      */
     public interface Callback {
 
@@ -320,7 +325,7 @@
          *
          * @param partialResult The partial query in a text form being streamed.
          */
-        @FlaggedApi(Flags.FLAG_ALLOW_COMPLEX_RESULTS_EGRESS_FROM_VQDS)
+        @SuppressLint("UnflaggedApi") // b/325678077 flags not supported in isolated process
         default void onQueryDetected(@NonNull VisualQueryDetectedResult partialResult) {
             throw new UnsupportedOperationException("This emthod must be implemented for use.");
         }
@@ -456,7 +461,7 @@
             Slog.v(TAG, "BinderCallback#onResultDetected");
             Binder.withCleanCallingIdentity(() -> {
                 synchronized (mLock) {
-                    mCallback.onQueryDetected(partialResult);
+                    mExecutor.execute(()->mCallback.onQueryDetected(partialResult));
                 }
             });
         }
diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java
index 306410c..2f2a670 100644
--- a/core/java/android/service/voice/VoiceInteractionService.java
+++ b/core/java/android/service/voice/VoiceInteractionService.java
@@ -932,7 +932,10 @@
      * @param sharedMemory The unrestricted data blob to be provided to the
      * {@link VisualQueryDetectionService}. Use this to provide models or other such data to the
      * sandboxed process.
-     * @param callback The callback to notify of detection events.
+     * @param callback The callback to notify of detection events. Single threaded or sequential
+     *                 executors are recommended for the callback are not guaranteed to be executed
+     *                 in the order of how they were called from the
+     *                 {@link VisualQueryDetectionService}.
      * @return An instanece of {@link VisualQueryDetector}.
      * @throws IllegalStateException when there is an existing {@link VisualQueryDetector}, or when
      * there is a non-trusted hotword detector running.
diff --git a/core/java/android/service/voice/flags/flags.aconfig b/core/java/android/service/voice/flags/flags.aconfig
index 633304b..1ae7d8c 100644
--- a/core/java/android/service/voice/flags/flags.aconfig
+++ b/core/java/android/service/voice/flags/flags.aconfig
@@ -22,28 +22,4 @@
     namespace: "machine_learning"
     description: "This flag allows providing foreground app component along with onShow args."
     bug: "319409708"
-}
-
-flag {
-    name: "allow_various_attention_types"
-    is_exported: true
-    namespace: "visual_query"
-    description: "This flag allows visual query detection service to set different attention types."
-    bug: "318617199"
-}
-
-flag {
-    name: "allow_complex_results_egress_from_vqds"
-    is_exported: true
-    namespace: "visual_query"
-    description: "This flag allows visual query detection service egress detailed results. "
-    bug: "318617199"
-}
-
-flag {
-    name: "allow_speaker_id_egress"
-    is_exported: true
-    namespace: "machine_learning"
-    description: "This flag allows hotword detection service and visual query detection service to egress current speaker profile id."
-    bug: "318617199"
 }
\ No newline at end of file
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index f6d197c..582c90f 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -27,12 +27,15 @@
 import static android.view.View.SYSTEM_UI_FLAG_VISIBLE;
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
 
+import static com.android.window.flags.Flags.FLAG_OFFLOAD_COLOR_EXTRACTION;
 import static com.android.window.flags.Flags.noConsecutiveVisibilityEvents;
+import static com.android.window.flags.Flags.offloadColorExtraction;
 
 import android.animation.AnimationHandler;
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ValueAnimator;
+import android.annotation.FlaggedApi;
 import android.annotation.FloatRange;
 import android.annotation.MainThread;
 import android.annotation.NonNull;
@@ -106,6 +109,7 @@
 import android.window.ClientWindowFrames;
 import android.window.ScreenCapture;
 
+import com.android.internal.R;
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.os.HandlerCaller;
@@ -831,6 +835,15 @@
         }
 
         /**
+         * Called when the dim amount of the wallpaper changed. This can be used to recompute the
+         * wallpaper colors based on the new dim, and call {@link #notifyColorsChanged()}.
+         * @hide
+         */
+        @FlaggedApi(FLAG_OFFLOAD_COLOR_EXTRACTION)
+        public void onDimAmountChanged(float dimAmount) {
+        }
+
+        /**
          * Called when an application has changed the desired virtual size of
          * the wallpaper.
          */
@@ -1042,6 +1055,10 @@
             }
 
             mPreviousWallpaperDimAmount = mWallpaperDimAmount;
+
+            // after the dim changes, allow colors to be immediately recomputed
+            mLastColorInvalidation = 0;
+            if (offloadColorExtraction()) onDimAmountChanged(mWallpaperDimAmount);
         }
 
         /**
@@ -1283,8 +1300,14 @@
                                     .build();
                             SurfaceControl.Transaction transaction =
                                     new SurfaceControl.Transaction();
+                            final int frameRateCompat = getResources().getInteger(
+                                    R.integer.config_wallpaperFrameRateCompatibility);
+                            if (DEBUG) {
+                                Log.d(TAG, "Set frame rate compatibility value for Wallpaper: "
+                                        + frameRateCompat);
+                            }
                             transaction.setDefaultFrameRateCompatibility(mBbqSurfaceControl,
-                                Surface.FRAME_RATE_COMPATIBILITY_MIN).apply();
+                                    frameRateCompat).apply();
                         }
                         // Propagate transform hint from WM, so we can use the right hint for the
                         // first frame.
diff --git a/core/java/android/service/wearable/IWearableSensingService.aidl b/core/java/android/service/wearable/IWearableSensingService.aidl
index dffadf0..9d9cacf 100644
--- a/core/java/android/service/wearable/IWearableSensingService.aidl
+++ b/core/java/android/service/wearable/IWearableSensingService.aidl
@@ -17,6 +17,7 @@
 package android.service.wearable;
 
 import android.app.ambientcontext.AmbientContextEventRequest;
+import android.app.wearable.IWearableSensingCallback;
 import android.os.PersistableBundle;
 import android.os.RemoteCallback;
 import android.os.SharedMemory;
@@ -28,8 +29,8 @@
  * @hide
  */
 oneway interface IWearableSensingService {
-    void provideSecureConnection(in ParcelFileDescriptor parcelFileDescriptor, in RemoteCallback callback);
-    void provideDataStream(in ParcelFileDescriptor parcelFileDescriptor, in RemoteCallback callback);
+    void provideSecureConnection(in ParcelFileDescriptor parcelFileDescriptor, in IWearableSensingCallback wearableSensingCallback, in RemoteCallback statusCallback);
+    void provideDataStream(in ParcelFileDescriptor parcelFileDescriptor, in IWearableSensingCallback wearableSensingCallback, in RemoteCallback statusCallback);
     void provideData(in PersistableBundle data, in SharedMemory sharedMemory, in RemoteCallback callback);
     void registerDataRequestObserver(int dataType, in RemoteCallback dataRequestCallback, int dataRequestObserverId, in String packageName, in RemoteCallback statusCallback);
     void unregisterDataRequestObserver(int dataType, int dataRequestObserverId, in String packageName, in RemoteCallback statusCallback);
diff --git a/core/java/android/service/wearable/WearableSensingService.java b/core/java/android/service/wearable/WearableSensingService.java
index a277017..ac22e70 100644
--- a/core/java/android/service/wearable/WearableSensingService.java
+++ b/core/java/android/service/wearable/WearableSensingService.java
@@ -20,13 +20,16 @@
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
 import android.app.Service;
 import android.app.ambientcontext.AmbientContextEvent;
 import android.app.ambientcontext.AmbientContextEventRequest;
 import android.app.wearable.Flags;
+import android.app.wearable.IWearableSensingCallback;
 import android.app.wearable.WearableSensingDataRequest;
 import android.app.wearable.WearableSensingManager;
+import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.IBinder;
@@ -34,18 +37,28 @@
 import android.os.PersistableBundle;
 import android.os.Process;
 import android.os.RemoteCallback;
+import android.os.RemoteException;
 import android.os.SharedMemory;
 import android.service.ambientcontext.AmbientContextDetectionResult;
 import android.service.ambientcontext.AmbientContextDetectionServiceStatus;
 import android.service.voice.HotwordAudioStream;
+import android.text.TextUtils;
 import android.util.Slog;
 import android.util.SparseArray;
 
+import com.android.internal.infra.AndroidFuture;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.time.Duration;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import java.util.function.Consumer;
 
 /**
@@ -102,9 +115,14 @@
     public static final String SERVICE_INTERFACE =
             "android.service.wearable.WearableSensingService";
 
+    // Timeout to prevent thread from waiting on the openFile future indefinitely.
+    private static final Duration OPEN_FILE_TIMEOUT = Duration.ofSeconds(5);
+
     private final SparseArray<WearableSensingDataRequester> mDataRequestObserverIdToRequesterMap =
             new SparseArray<>();
 
+    private IWearableSensingCallback mWearableSensingCallback;
+
     @Nullable
     @Override
     public final IBinder onBind(@NonNull Intent intent) {
@@ -113,8 +131,13 @@
                 /** {@inheritDoc} */
                 @Override
                 public void provideSecureConnection(
-                        ParcelFileDescriptor secureWearableConnection, RemoteCallback callback) {
+                        ParcelFileDescriptor secureWearableConnection,
+                        IWearableSensingCallback wearableSensingCallback,
+                        RemoteCallback callback) {
                     Objects.requireNonNull(secureWearableConnection);
+                    if (wearableSensingCallback != null) {
+                        mWearableSensingCallback = wearableSensingCallback;
+                    }
                     Consumer<Integer> consumer = createWearableStatusConsumer(callback);
                     WearableSensingService.this.onSecureConnectionProvided(
                             secureWearableConnection, consumer);
@@ -123,8 +146,13 @@
                 /** {@inheritDoc} */
                 @Override
                 public void provideDataStream(
-                        ParcelFileDescriptor parcelFileDescriptor, RemoteCallback callback) {
+                        ParcelFileDescriptor parcelFileDescriptor,
+                        IWearableSensingCallback wearableSensingCallback,
+                        RemoteCallback callback) {
                     Objects.requireNonNull(parcelFileDescriptor);
+                    if (wearableSensingCallback != null) {
+                        mWearableSensingCallback = wearableSensingCallback;
+                    }
                     Consumer<Integer> consumer = createWearableStatusConsumer(callback);
                     WearableSensingService.this.onDataStreamProvided(
                             parcelFileDescriptor, consumer);
@@ -570,6 +598,64 @@
             @NonNull String packageName,
             @NonNull Consumer<AmbientContextDetectionServiceStatus> consumer);
 
+    /**
+     * Overrides {@link Context#openFileInput} to read files with the given {@code fileName} under
+     * the internal app storage of the APK providing the implementation for this class. {@link
+     * Context#getFilesDir()} will be added as a prefix to the provided {@code fileName}.
+     *
+     * <p>This method is only functional after {@link
+     * #onSecureConnectionProvided(ParcelFileDescriptor, Consumer)} or {@link
+     * #onDataStreamProvided(ParcelFileDescriptor, Consumer)} has been called as a result of a
+     * process owned by the same APK calling {@link
+     * WearableSensingManager#provideConnection(ParcelFileDescriptor, Executor, Consumer)} or {@link
+     * WearableSensingManager#provideDataStream(ParcelFileDescriptor, Executor, Consumer)}.
+     * Otherwise, it will throw an {@link IllegalStateException}. This is because this method
+     * proxies the file read via that process. Also, the APK needs to have a targetSdkVersion of 35
+     * or newer.
+     *
+     * @param fileName Relative path of a file under {@link Context#getFilesDir()}.
+     * @throws IllegalStateException if the above condition is not satisfied.
+     * @throws FileNotFoundException if the file does not exist or cannot be opened, or an error
+     *     occurred during the RPC to proxy the file read via a non-isolated process.
+     */
+    // SuppressLint is needed because the parent Context class does not specify the nullability of
+    // the parameter filename. If we remove the @NonNull annotation, the linter will complain about
+    // MissingNullability
+    @Override
+    public @NonNull FileInputStream openFileInput(
+            @SuppressLint("InvalidNullabilityOverride") @NonNull String fileName)
+            throws FileNotFoundException {
+        if (fileName == null) {
+            throw new IllegalArgumentException("filename cannot be null");
+        }
+        try {
+            if (mWearableSensingCallback == null) {
+                throw new IllegalStateException(
+                        "Cannot open file from WearableSensingService. WearableSensingCallback is"
+                                + " not available.");
+            }
+            AndroidFuture<ParcelFileDescriptor> future = new AndroidFuture<>();
+            mWearableSensingCallback.openFile(fileName, future);
+            ParcelFileDescriptor pfd =
+                    future.get(OPEN_FILE_TIMEOUT.toMillis(), TimeUnit.MILLISECONDS);
+            if (pfd == null) {
+                throw new FileNotFoundException(
+                        TextUtils.formatSimple(
+                                "File %s not found or unable to be opened in read-only mode.",
+                                fileName));
+            }
+            return new FileInputStream(pfd.getFileDescriptor());
+        } catch (RemoteException | ExecutionException | TimeoutException e) {
+            throw (FileNotFoundException)
+                    new FileNotFoundException("Cannot open file due to remote service failure")
+                            .initCause(e);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw (FileNotFoundException)
+                    new FileNotFoundException("Interrupted when opening a file.").initCause(e);
+        }
+    }
+
     @NonNull
     private static Integer[] intArrayToIntegerArray(@NonNull int[] integerSet) {
         Integer[] intArray = new Integer[integerSet.length];
diff --git a/core/java/android/text/BoringLayout.java b/core/java/android/text/BoringLayout.java
index e95b216..9db8aa1 100644
--- a/core/java/android/text/BoringLayout.java
+++ b/core/java/android/text/BoringLayout.java
@@ -28,7 +28,6 @@
 import android.graphics.Path;
 import android.graphics.RectF;
 import android.graphics.text.LineBreakConfig;
-import android.os.Trace;
 import android.text.style.ParagraphStyle;
 
 /**
@@ -568,59 +567,49 @@
     public static @Nullable Metrics isBoring(@NonNull CharSequence text, @NonNull TextPaint paint,
             @NonNull TextDirectionHeuristic textDir, boolean useFallbackLineSpacing,
             @Nullable Paint.FontMetrics minimumFontMetrics, @Nullable Metrics metrics) {
-        if (TRACE_LAYOUT) {
-            Trace.beginSection("BoringLayout#isBoring");
-            Trace.setCounter("BoringLayout#textLength", text.length());
+        final int textLength = text.length();
+        if (hasAnyInterestingChars(text, textLength)) {
+           return null;  // There are some interesting characters. Not boring.
         }
-        try {
-            final int textLength = text.length();
-            if (hasAnyInterestingChars(text, textLength)) {
-                return null;  // There are some interesting characters. Not boring.
-            }
-            if (textDir != null && textDir.isRtl(text, 0, textLength)) {
-                return null;  // The heuristic considers the whole text RTL. Not boring.
-            }
-            if (text instanceof Spanned) {
-                Spanned sp = (Spanned) text;
-                Object[] styles = sp.getSpans(0, textLength, ParagraphStyle.class);
-                if (styles.length > 0) {
-                    return null;  // There are some ParagraphStyle spans. Not boring.
-                }
-            }
-
-            Metrics fm = metrics;
-            if (fm == null) {
-                fm = new Metrics();
-            } else {
-                fm.reset();
-            }
-
-            if (ClientFlags.fixLineHeightForLocale()) {
-                if (minimumFontMetrics != null) {
-                    fm.set(minimumFontMetrics);
-                    // Because the font metrics is provided by public APIs, adjust the top/bottom
-                    // with ascent/descent: top must be smaller than ascent, bottom must be larger
-                    // than descent.
-                    fm.top = Math.min(fm.top, fm.ascent);
-                    fm.bottom = Math.max(fm.bottom, fm.descent);
-                }
-            }
-
-            TextLine line = TextLine.obtain();
-            line.set(paint, text, 0, textLength, Layout.DIR_LEFT_TO_RIGHT,
-                    Layout.DIRS_ALL_LEFT_TO_RIGHT, false, null,
-                    0 /* ellipsisStart, 0 since text has not been ellipsized at this point */,
-                    0 /* ellipsisEnd, 0 since text has not been ellipsized at this point */,
-                    useFallbackLineSpacing);
-            fm.width = (int) Math.ceil(line.metrics(fm, fm.mDrawingBounds, false, null));
-            TextLine.recycle(line);
-
-            return fm;
-        } finally {
-            if (TRACE_LAYOUT) {
-                Trace.endSection();
+        if (textDir != null && textDir.isRtl(text, 0, textLength)) {
+           return null;  // The heuristic considers the whole text RTL. Not boring.
+        }
+        if (text instanceof Spanned) {
+            Spanned sp = (Spanned) text;
+            Object[] styles = sp.getSpans(0, textLength, ParagraphStyle.class);
+            if (styles.length > 0) {
+                return null;  // There are some ParagraphStyle spans. Not boring.
             }
         }
+
+        Metrics fm = metrics;
+        if (fm == null) {
+            fm = new Metrics();
+        } else {
+            fm.reset();
+        }
+
+        if (ClientFlags.fixLineHeightForLocale()) {
+            if (minimumFontMetrics != null) {
+                fm.set(minimumFontMetrics);
+                // Because the font metrics is provided by public APIs, adjust the top/bottom with
+                // ascent/descent: top must be smaller than ascent, bottom must be larger than
+                // descent.
+                fm.top = Math.min(fm.top, fm.ascent);
+                fm.bottom = Math.max(fm.bottom, fm.descent);
+            }
+        }
+
+        TextLine line = TextLine.obtain();
+        line.set(paint, text, 0, textLength, Layout.DIR_LEFT_TO_RIGHT,
+                Layout.DIRS_ALL_LEFT_TO_RIGHT, false, null,
+                0 /* ellipsisStart, 0 since text has not been ellipsized at this point */,
+                0 /* ellipsisEnd, 0 since text has not been ellipsized at this point */,
+                useFallbackLineSpacing);
+        fm.width = (int) Math.ceil(line.metrics(fm, fm.mDrawingBounds, false, null));
+        TextLine.recycle(line);
+
+        return fm;
     }
 
     @Override
diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java
index 99ce0ef..cce4f7b 100644
--- a/core/java/android/text/DynamicLayout.java
+++ b/core/java/android/text/DynamicLayout.java
@@ -31,7 +31,6 @@
 import android.graphics.Rect;
 import android.graphics.text.LineBreakConfig;
 import android.os.Build;
-import android.os.Trace;
 import android.text.method.OffsetMapping;
 import android.text.style.ReplacementSpan;
 import android.text.style.UpdateLayout;
@@ -637,224 +636,207 @@
     /** @hide */
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
     public void reflow(CharSequence s, int where, int before, int after) {
-        if (TRACE_LAYOUT) {
-            Trace.beginSection("DynamicLayout#reflow");
+        if (s != mBase)
+            return;
+
+        CharSequence text = mDisplay;
+        int len = text.length();
+
+        // seek back to the start of the paragraph
+
+        int find = TextUtils.lastIndexOf(text, '\n', where - 1);
+        if (find < 0)
+            find = 0;
+        else
+            find = find + 1;
+
+        {
+            int diff = where - find;
+            before += diff;
+            after += diff;
+            where -= diff;
         }
-        try {
-            if (s != mBase) {
-                return;
-            }
 
-            CharSequence text = mDisplay;
-            int len = text.length();
+        // seek forward to the end of the paragraph
 
-            // seek back to the start of the paragraph
+        int look = TextUtils.indexOf(text, '\n', where + after);
+        if (look < 0)
+            look = len;
+        else
+            look++; // we want the index after the \n
 
-            int find = TextUtils.lastIndexOf(text, '\n', where - 1);
-            if (find < 0) {
-                find = 0;
-            } else {
-                find = find + 1;
-            }
+        int change = look - (where + after);
+        before += change;
+        after += change;
 
-            {
-                int diff = where - find;
-                before += diff;
-                after += diff;
-                where -= diff;
-            }
+        // seek further out to cover anything that is forced to wrap together
 
-            // seek forward to the end of the paragraph
+        if (text instanceof Spanned) {
+            Spanned sp = (Spanned) text;
+            boolean again;
 
-            int look = TextUtils.indexOf(text, '\n', where + after);
-            if (look < 0) {
-                look = len;
-            } else {
-                look++; // we want the index after the \n
-            }
+            do {
+                again = false;
 
-            int change = look - (where + after);
-            before += change;
-            after += change;
+                Object[] force = sp.getSpans(where, where + after,
+                                             WrapTogetherSpan.class);
 
-            // seek further out to cover anything that is forced to wrap together
+                for (int i = 0; i < force.length; i++) {
+                    int st = sp.getSpanStart(force[i]);
+                    int en = sp.getSpanEnd(force[i]);
 
-            if (text instanceof Spanned) {
-                Spanned sp = (Spanned) text;
-                boolean again;
+                    if (st < where) {
+                        again = true;
 
-                do {
-                    again = false;
-
-                    Object[] force = sp.getSpans(where, where + after,
-                            WrapTogetherSpan.class);
-
-                    for (int i = 0; i < force.length; i++) {
-                        int st = sp.getSpanStart(force[i]);
-                        int en = sp.getSpanEnd(force[i]);
-
-                        if (st < where) {
-                            again = true;
-
-                            int diff = where - st;
-                            before += diff;
-                            after += diff;
-                            where -= diff;
-                        }
-
-                        if (en > where + after) {
-                            again = true;
-
-                            int diff = en - (where + after);
-                            before += diff;
-                            after += diff;
-                        }
+                        int diff = where - st;
+                        before += diff;
+                        after += diff;
+                        where -= diff;
                     }
-                } while (again);
-            }
 
-            // find affected region of old layout
+                    if (en > where + after) {
+                        again = true;
 
-            int startline = getLineForOffset(where);
-            int startv = getLineTop(startline);
+                        int diff = en - (where + after);
+                        before += diff;
+                        after += diff;
+                    }
+                }
+            } while (again);
+        }
 
-            int endline = getLineForOffset(where + before);
-            if (where + after == len) {
-                endline = getLineCount();
-            }
-            int endv = getLineTop(endline);
-            boolean islast = (endline == getLineCount());
+        // find affected region of old layout
 
-            // generate new layout for affected text
+        int startline = getLineForOffset(where);
+        int startv = getLineTop(startline);
 
-            StaticLayout reflowed;
-            StaticLayout.Builder b;
+        int endline = getLineForOffset(where + before);
+        if (where + after == len)
+            endline = getLineCount();
+        int endv = getLineTop(endline);
+        boolean islast = (endline == getLineCount());
 
-            synchronized (sLock) {
-                reflowed = sStaticLayout;
-                b = sBuilder;
-                sStaticLayout = null;
-                sBuilder = null;
-            }
+        // generate new layout for affected text
 
-            if (b == null) {
-                b = StaticLayout.Builder.obtain(text, where, where + after, getPaint(), getWidth());
-            }
+        StaticLayout reflowed;
+        StaticLayout.Builder b;
 
-            b.setText(text, where, where + after)
-                    .setPaint(getPaint())
-                    .setWidth(getWidth())
-                    .setTextDirection(getTextDirectionHeuristic())
-                    .setLineSpacing(getSpacingAdd(), getSpacingMultiplier())
-                    .setUseLineSpacingFromFallbacks(mFallbackLineSpacing)
-                    .setEllipsizedWidth(mEllipsizedWidth)
-                    .setEllipsize(mEllipsizeAt)
-                    .setBreakStrategy(mBreakStrategy)
-                    .setHyphenationFrequency(mHyphenationFrequency)
-                    .setJustificationMode(mJustificationMode)
-                    .setLineBreakConfig(mLineBreakConfig)
-                    .setAddLastLineLineSpacing(!islast)
-                    .setIncludePad(false)
-                    .setUseBoundsForWidth(mUseBoundsForWidth)
-                    .setShiftDrawingOffsetForStartOverhang(mShiftDrawingOffsetForStartOverhang)
-                    .setMinimumFontMetrics(mMinimumFontMetrics)
-                    .setCalculateBounds(true);
+        synchronized (sLock) {
+            reflowed = sStaticLayout;
+            b = sBuilder;
+            sStaticLayout = null;
+            sBuilder = null;
+        }
 
-            reflowed = b.buildPartialStaticLayoutForDynamicLayout(true /* trackpadding */,
-                    reflowed);
-            int n = reflowed.getLineCount();
-            // If the new layout has a blank line at the end, but it is not
-            // the very end of the buffer, then we already have a line that
-            // starts there, so disregard the blank line.
+        if (b == null) {
+            b = StaticLayout.Builder.obtain(text, where, where + after, getPaint(), getWidth());
+        }
 
-            if (where + after != len && reflowed.getLineStart(n - 1) == where + after) {
-                n--;
-            }
+        b.setText(text, where, where + after)
+                .setPaint(getPaint())
+                .setWidth(getWidth())
+                .setTextDirection(getTextDirectionHeuristic())
+                .setLineSpacing(getSpacingAdd(), getSpacingMultiplier())
+                .setUseLineSpacingFromFallbacks(mFallbackLineSpacing)
+                .setEllipsizedWidth(mEllipsizedWidth)
+                .setEllipsize(mEllipsizeAt)
+                .setBreakStrategy(mBreakStrategy)
+                .setHyphenationFrequency(mHyphenationFrequency)
+                .setJustificationMode(mJustificationMode)
+                .setLineBreakConfig(mLineBreakConfig)
+                .setAddLastLineLineSpacing(!islast)
+                .setIncludePad(false)
+                .setUseBoundsForWidth(mUseBoundsForWidth)
+                .setShiftDrawingOffsetForStartOverhang(mShiftDrawingOffsetForStartOverhang)
+                .setMinimumFontMetrics(mMinimumFontMetrics)
+                .setCalculateBounds(true);
 
-            // remove affected lines from old layout
-            mInts.deleteAt(startline, endline - startline);
-            mObjects.deleteAt(startline, endline - startline);
+        reflowed = b.buildPartialStaticLayoutForDynamicLayout(true /* trackpadding */, reflowed);
+        int n = reflowed.getLineCount();
+        // If the new layout has a blank line at the end, but it is not
+        // the very end of the buffer, then we already have a line that
+        // starts there, so disregard the blank line.
 
-            // adjust offsets in layout for new height and offsets
+        if (where + after != len && reflowed.getLineStart(n - 1) == where + after)
+            n--;
 
-            int ht = reflowed.getLineTop(n);
-            int toppad = 0, botpad = 0;
+        // remove affected lines from old layout
+        mInts.deleteAt(startline, endline - startline);
+        mObjects.deleteAt(startline, endline - startline);
 
-            if (mIncludePad && startline == 0) {
-                toppad = reflowed.getTopPadding();
-                mTopPadding = toppad;
-                ht -= toppad;
-            }
-            if (mIncludePad && islast) {
-                botpad = reflowed.getBottomPadding();
-                mBottomPadding = botpad;
-                ht += botpad;
-            }
+        // adjust offsets in layout for new height and offsets
 
-            mInts.adjustValuesBelow(startline, START, after - before);
-            mInts.adjustValuesBelow(startline, TOP, startv - endv + ht);
+        int ht = reflowed.getLineTop(n);
+        int toppad = 0, botpad = 0;
 
-            // insert new layout
+        if (mIncludePad && startline == 0) {
+            toppad = reflowed.getTopPadding();
+            mTopPadding = toppad;
+            ht -= toppad;
+        }
+        if (mIncludePad && islast) {
+            botpad = reflowed.getBottomPadding();
+            mBottomPadding = botpad;
+            ht += botpad;
+        }
 
-            int[] ints;
+        mInts.adjustValuesBelow(startline, START, after - before);
+        mInts.adjustValuesBelow(startline, TOP, startv - endv + ht);
+
+        // insert new layout
+
+        int[] ints;
+
+        if (mEllipsize) {
+            ints = new int[COLUMNS_ELLIPSIZE];
+            ints[ELLIPSIS_START] = ELLIPSIS_UNDEFINED;
+        } else {
+            ints = new int[COLUMNS_NORMAL];
+        }
+
+        Directions[] objects = new Directions[1];
+
+        for (int i = 0; i < n; i++) {
+            final int start = reflowed.getLineStart(i);
+            ints[START] = start;
+            ints[DIR] |= reflowed.getParagraphDirection(i) << DIR_SHIFT;
+            ints[TAB] |= reflowed.getLineContainsTab(i) ? TAB_MASK : 0;
+
+            int top = reflowed.getLineTop(i) + startv;
+            if (i > 0)
+                top -= toppad;
+            ints[TOP] = top;
+
+            int desc = reflowed.getLineDescent(i);
+            if (i == n - 1)
+                desc += botpad;
+
+            ints[DESCENT] = desc;
+            ints[EXTRA] = reflowed.getLineExtra(i);
+            objects[0] = reflowed.getLineDirections(i);
+
+            final int end = (i == n - 1) ? where + after : reflowed.getLineStart(i + 1);
+            ints[HYPHEN] = StaticLayout.packHyphenEdit(
+                    reflowed.getStartHyphenEdit(i), reflowed.getEndHyphenEdit(i));
+            ints[MAY_PROTRUDE_FROM_TOP_OR_BOTTOM] |=
+                    contentMayProtrudeFromLineTopOrBottom(text, start, end) ?
+                            MAY_PROTRUDE_FROM_TOP_OR_BOTTOM_MASK : 0;
 
             if (mEllipsize) {
-                ints = new int[COLUMNS_ELLIPSIZE];
-                ints[ELLIPSIS_START] = ELLIPSIS_UNDEFINED;
-            } else {
-                ints = new int[COLUMNS_NORMAL];
+                ints[ELLIPSIS_START] = reflowed.getEllipsisStart(i);
+                ints[ELLIPSIS_COUNT] = reflowed.getEllipsisCount(i);
             }
 
-            Directions[] objects = new Directions[1];
+            mInts.insertAt(startline + i, ints);
+            mObjects.insertAt(startline + i, objects);
+        }
 
-            for (int i = 0; i < n; i++) {
-                final int start = reflowed.getLineStart(i);
-                ints[START] = start;
-                ints[DIR] |= reflowed.getParagraphDirection(i) << DIR_SHIFT;
-                ints[TAB] |= reflowed.getLineContainsTab(i) ? TAB_MASK : 0;
+        updateBlocks(startline, endline - 1, n);
 
-                int top = reflowed.getLineTop(i) + startv;
-                if (i > 0) {
-                    top -= toppad;
-                }
-                ints[TOP] = top;
-
-                int desc = reflowed.getLineDescent(i);
-                if (i == n - 1) {
-                    desc += botpad;
-                }
-
-                ints[DESCENT] = desc;
-                ints[EXTRA] = reflowed.getLineExtra(i);
-                objects[0] = reflowed.getLineDirections(i);
-
-                final int end = (i == n - 1) ? where + after : reflowed.getLineStart(i + 1);
-                ints[HYPHEN] = StaticLayout.packHyphenEdit(
-                        reflowed.getStartHyphenEdit(i), reflowed.getEndHyphenEdit(i));
-                ints[MAY_PROTRUDE_FROM_TOP_OR_BOTTOM] |=
-                        contentMayProtrudeFromLineTopOrBottom(text, start, end)
-                                ? MAY_PROTRUDE_FROM_TOP_OR_BOTTOM_MASK : 0;
-
-                if (mEllipsize) {
-                    ints[ELLIPSIS_START] = reflowed.getEllipsisStart(i);
-                    ints[ELLIPSIS_COUNT] = reflowed.getEllipsisCount(i);
-                }
-
-                mInts.insertAt(startline + i, ints);
-                mObjects.insertAt(startline + i, objects);
-            }
-
-            updateBlocks(startline, endline - 1, n);
-
-            b.finish();
-            synchronized (sLock) {
-                sStaticLayout = reflowed;
-                sBuilder = b;
-            }
-        } finally {
-            if (TRACE_LAYOUT) {
-                Trace.endSection();
-            }
+        b.finish();
+        synchronized (sLock) {
+            sStaticLayout = reflowed;
+            sBuilder = b;
         }
     }
 
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index ce238a7..8dee4b1 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -39,7 +39,6 @@
 import android.graphics.text.LineBreakConfig;
 import android.graphics.text.LineBreaker;
 import android.os.Build;
-import android.os.Trace;
 import android.text.method.TextKeyListener;
 import android.text.style.AlignmentSpan;
 import android.text.style.LeadingMarginSpan;
@@ -71,11 +70,6 @@
  * For text that will not change, use a {@link StaticLayout}.
  */
 public abstract class Layout {
-
-    /** @hide */
-    protected static final boolean TRACE_LAYOUT = Build.isDebuggable();
-
-
     /** @hide */
     @IntDef(prefix = { "BREAK_STRATEGY_" }, value = {
             LineBreaker.BREAK_STRATEGY_SIMPLE,
@@ -478,51 +472,40 @@
             @Nullable Path selectionPath,
             @Nullable Paint selectionPaint,
             int cursorOffsetVertical) {
-        if (TRACE_LAYOUT) {
-            Trace.beginSection("Layout#draw");
+        float leftShift = 0;
+        if (mUseBoundsForWidth && mShiftDrawingOffsetForStartOverhang) {
+            RectF drawingRect = computeDrawingBoundingBox();
+            if (drawingRect.left < 0) {
+                leftShift = -drawingRect.left;
+                canvas.translate(leftShift, 0);
+            }
         }
-        try {
-            float leftShift = 0;
-            if (mUseBoundsForWidth && mShiftDrawingOffsetForStartOverhang) {
-                RectF drawingRect = computeDrawingBoundingBox();
-                if (drawingRect.left < 0) {
-                    leftShift = -drawingRect.left;
-                    canvas.translate(leftShift, 0);
-                }
-            }
-            final long lineRange = getLineRangeForDraw(canvas);
-            int firstLine = TextUtils.unpackRangeStartFromLong(lineRange);
-            int lastLine = TextUtils.unpackRangeEndFromLong(lineRange);
-            if (lastLine < 0) return;
+        final long lineRange = getLineRangeForDraw(canvas);
+        int firstLine = TextUtils.unpackRangeStartFromLong(lineRange);
+        int lastLine = TextUtils.unpackRangeEndFromLong(lineRange);
+        if (lastLine < 0) return;
 
-            if (shouldDrawHighlightsOnTop(canvas)) {
-                drawBackground(canvas, firstLine, lastLine);
-            } else {
-                drawWithoutText(canvas, highlightPaths, highlightPaints, selectionPath,
-                        selectionPaint,
-                        cursorOffsetVertical, firstLine, lastLine);
-            }
+        if (shouldDrawHighlightsOnTop(canvas)) {
+            drawBackground(canvas, firstLine, lastLine);
+        } else {
+            drawWithoutText(canvas, highlightPaths, highlightPaints, selectionPath, selectionPaint,
+                    cursorOffsetVertical, firstLine, lastLine);
+        }
 
-            drawText(canvas, firstLine, lastLine);
+        drawText(canvas, firstLine, lastLine);
 
-            // Since high contrast text draws a solid rectangle background behind the text, it
-            // covers up the highlights and selections. In this case we draw over the top of the
-            // text with a blend mode that ensures the text stays high-contrast.
-            if (shouldDrawHighlightsOnTop(canvas)) {
-                drawHighlights(canvas, highlightPaths, highlightPaints, selectionPath,
-                        selectionPaint,
-                        cursorOffsetVertical, firstLine, lastLine);
-            }
+        // Since high contrast text draws a solid rectangle background behind the text, it covers up
+        // the highlights and selections. In this case we draw over the top of the text with a
+        // blend mode that ensures the text stays high-contrast.
+        if (shouldDrawHighlightsOnTop(canvas)) {
+            drawHighlights(canvas, highlightPaths, highlightPaints, selectionPath, selectionPaint,
+                    cursorOffsetVertical, firstLine, lastLine);
+        }
 
-            if (leftShift != 0) {
-                // Manually translate back to the original position because of b/324498002, using
-                // save/restore disappears the toggle switch drawables.
-                canvas.translate(-leftShift, 0);
-            }
-        } finally {
-            if (TRACE_LAYOUT) {
-                Trace.endSection();
-            }
+        if (leftShift != 0) {
+            // Manually translate back to the original position because of b/324498002, using
+            // save/restore disappears the toggle switch drawables.
+            canvas.translate(-leftShift, 0);
         }
     }
 
diff --git a/core/java/android/text/MeasuredParagraph.java b/core/java/android/text/MeasuredParagraph.java
index 2b6684e..38aeb37 100644
--- a/core/java/android/text/MeasuredParagraph.java
+++ b/core/java/android/text/MeasuredParagraph.java
@@ -700,6 +700,23 @@
                 bidiRequest = isRtl ? Bidi.RTL : Bidi.LTR;
             }
             mBidi = new Bidi(mCopiedBuffer, 0, null, 0, mCopiedBuffer.length, bidiRequest);
+
+            if (mCopiedBuffer.length > 0
+                    && mBidi.getParagraphIndex(mCopiedBuffer.length - 1) != 0) {
+                // Historically, the MeasuredParagraph does not treat the CR letters as paragraph
+                // breaker but ICU BiDi treats it as paragraph breaker. In the MeasureParagraph,
+                // the given range always represents a single paragraph, so if the BiDi object has
+                // multiple paragraph, it should contains a CR letters in the text. Using CR is not
+                // common in Android and also it should not penalize the easy case, e.g. all LTR,
+                // check the paragraph count here and replace the CR letters and re-calculate
+                // BiDi again.
+                for (int i = 0; i < mTextLength; ++i) {
+                    if (mCopiedBuffer[i] == '\r') {
+                        mCopiedBuffer[i] = OBJECT_REPLACEMENT_CHARACTER;
+                    }
+                }
+                mBidi = new Bidi(mCopiedBuffer, 0, null, 0, mCopiedBuffer.length, bidiRequest);
+            }
             mLevels.resize(mTextLength);
             byte[] rawArray = mLevels.getRawArray();
             for (int i = 0; i < mTextLength; ++i) {
diff --git a/core/java/android/text/PrecomputedText.java b/core/java/android/text/PrecomputedText.java
index 14401a6..5f6a9bd 100644
--- a/core/java/android/text/PrecomputedText.java
+++ b/core/java/android/text/PrecomputedText.java
@@ -25,8 +25,6 @@
 import android.graphics.Rect;
 import android.graphics.text.LineBreakConfig;
 import android.graphics.text.MeasuredText;
-import android.os.Build;
-import android.os.Trace;
 import android.text.style.MetricAffectingSpan;
 
 import com.android.internal.util.Preconditions;
@@ -80,8 +78,6 @@
 public class PrecomputedText implements Spannable {
     private static final char LINE_FEED = '\n';
 
-    private static final boolean TRACE_PCT = Build.isDebuggable();
-
     /**
      * The information required for building {@link PrecomputedText}.
      *
@@ -451,47 +447,35 @@
 
     private static ParagraphInfo[] createMeasuredParagraphsFromPrecomputedText(
             @NonNull PrecomputedText pct, @NonNull Params params, boolean computeLayout) {
-        if (TRACE_PCT) {
-            Trace.beginSection("PrecomputedText#createMeasuredParagraphsFromPrecomputedText");
-            Trace.setCounter("PrecomputedText#textCharCount", pct.length());
+        final boolean needHyphenation = params.getBreakStrategy() != Layout.BREAK_STRATEGY_SIMPLE
+                && params.getHyphenationFrequency() != Layout.HYPHENATION_FREQUENCY_NONE;
+        final int hyphenationMode;
+        if (needHyphenation) {
+            hyphenationMode = isFastHyphenation(params.getHyphenationFrequency())
+                    ? MeasuredText.Builder.HYPHENATION_MODE_FAST :
+                    MeasuredText.Builder.HYPHENATION_MODE_NORMAL;
+        } else {
+            hyphenationMode = MeasuredText.Builder.HYPHENATION_MODE_NONE;
         }
-        try {
-            final boolean needHyphenation =
-                    params.getBreakStrategy() != Layout.BREAK_STRATEGY_SIMPLE
-                            && params.getHyphenationFrequency()
-                            != Layout.HYPHENATION_FREQUENCY_NONE;
-            final int hyphenationMode;
-            if (needHyphenation) {
-                hyphenationMode = isFastHyphenation(params.getHyphenationFrequency())
-                        ? MeasuredText.Builder.HYPHENATION_MODE_FAST :
-                        MeasuredText.Builder.HYPHENATION_MODE_NORMAL;
-            } else {
-                hyphenationMode = MeasuredText.Builder.HYPHENATION_MODE_NONE;
-            }
-            LineBreakConfig config = params.getLineBreakConfig();
-            if (config.getLineBreakWordStyle() == LineBreakConfig.LINE_BREAK_WORD_STYLE_AUTO
-                    && pct.getParagraphCount() != 1) {
-                // If the text has multiple paragraph, resolve line break word style auto to none.
-                config = new LineBreakConfig.Builder()
-                        .merge(config)
-                        .setLineBreakWordStyle(LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE)
-                        .build();
-            }
-            ArrayList<ParagraphInfo> result = new ArrayList<>();
-            for (int i = 0; i < pct.getParagraphCount(); ++i) {
-                final int paraStart = pct.getParagraphStart(i);
-                final int paraEnd = pct.getParagraphEnd(i);
-                result.add(new ParagraphInfo(paraEnd, MeasuredParagraph.buildForStaticLayout(
-                        params.getTextPaint(), config, pct, paraStart, paraEnd,
-                        params.getTextDirection(), hyphenationMode, computeLayout, true,
-                        pct.getMeasuredParagraph(i), null /* no recycle */)));
-            }
-            return result.toArray(new ParagraphInfo[result.size()]);
-        } finally {
-            if (TRACE_PCT) {
-                Trace.endSection();
-            }
+        LineBreakConfig config = params.getLineBreakConfig();
+        if (config.getLineBreakWordStyle() == LineBreakConfig.LINE_BREAK_WORD_STYLE_AUTO
+                && pct.getParagraphCount() != 1) {
+            // If the text has multiple paragraph, resolve line break word style auto to none.
+            config = new LineBreakConfig.Builder()
+                    .merge(config)
+                    .setLineBreakWordStyle(LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE)
+                    .build();
         }
+        ArrayList<ParagraphInfo> result = new ArrayList<>();
+        for (int i = 0; i < pct.getParagraphCount(); ++i) {
+            final int paraStart = pct.getParagraphStart(i);
+            final int paraEnd = pct.getParagraphEnd(i);
+            result.add(new ParagraphInfo(paraEnd, MeasuredParagraph.buildForStaticLayout(
+                    params.getTextPaint(), config, pct, paraStart, paraEnd,
+                    params.getTextDirection(), hyphenationMode, computeLayout, true,
+                    pct.getMeasuredParagraph(i), null /* no recycle */)));
+        }
+        return result.toArray(new ParagraphInfo[result.size()]);
     }
 
     /** @hide */
@@ -499,65 +483,53 @@
             @NonNull CharSequence text, @NonNull Params params,
             @IntRange(from = 0) int start, @IntRange(from = 0) int end, boolean computeLayout,
             boolean computeBounds) {
-        if (TRACE_PCT) {
-            Trace.beginSection("PrecomputedText#createMeasuredParagraphs");
-            Trace.setCounter("PrecomputedText#textCharCount", text.length());
-        }
-        try {
-            ArrayList<ParagraphInfo> result = new ArrayList<>();
+        ArrayList<ParagraphInfo> result = new ArrayList<>();
 
-            Preconditions.checkNotNull(text);
-            Preconditions.checkNotNull(params);
-            final boolean needHyphenation =
-                    params.getBreakStrategy() != Layout.BREAK_STRATEGY_SIMPLE
-                            && params.getHyphenationFrequency()
-                            != Layout.HYPHENATION_FREQUENCY_NONE;
-            final int hyphenationMode;
-            if (needHyphenation) {
-                hyphenationMode = isFastHyphenation(params.getHyphenationFrequency())
-                        ? MeasuredText.Builder.HYPHENATION_MODE_FAST :
-                        MeasuredText.Builder.HYPHENATION_MODE_NORMAL;
+        Preconditions.checkNotNull(text);
+        Preconditions.checkNotNull(params);
+        final boolean needHyphenation = params.getBreakStrategy() != Layout.BREAK_STRATEGY_SIMPLE
+                && params.getHyphenationFrequency() != Layout.HYPHENATION_FREQUENCY_NONE;
+        final int hyphenationMode;
+        if (needHyphenation) {
+            hyphenationMode = isFastHyphenation(params.getHyphenationFrequency())
+                    ? MeasuredText.Builder.HYPHENATION_MODE_FAST :
+                    MeasuredText.Builder.HYPHENATION_MODE_NORMAL;
+        } else {
+            hyphenationMode = MeasuredText.Builder.HYPHENATION_MODE_NONE;
+        }
+
+        LineBreakConfig config = null;
+        int paraEnd = 0;
+        for (int paraStart = start; paraStart < end; paraStart = paraEnd) {
+            paraEnd = TextUtils.indexOf(text, LINE_FEED, paraStart, end);
+            if (paraEnd < 0) {
+                // No LINE_FEED(U+000A) character found. Use end of the text as the paragraph
+                // end.
+                paraEnd = end;
             } else {
-                hyphenationMode = MeasuredText.Builder.HYPHENATION_MODE_NONE;
+                paraEnd++;  // Includes LINE_FEED(U+000A) to the prev paragraph.
             }
 
-            LineBreakConfig config = null;
-            int paraEnd = 0;
-            for (int paraStart = start; paraStart < end; paraStart = paraEnd) {
-                paraEnd = TextUtils.indexOf(text, LINE_FEED, paraStart, end);
-                if (paraEnd < 0) {
-                    // No LINE_FEED(U+000A) character found. Use end of the text as the paragraph
-                    // end.
-                    paraEnd = end;
-                } else {
-                    paraEnd++;  // Includes LINE_FEED(U+000A) to the prev paragraph.
+            if (config == null) {
+                config = params.getLineBreakConfig();
+                if (config.getLineBreakWordStyle() == LineBreakConfig.LINE_BREAK_WORD_STYLE_AUTO
+                        && !(paraStart == start && paraEnd == end)) {
+                    // If the text has multiple paragraph, resolve line break word style auto to
+                    // none.
+                    config = new LineBreakConfig.Builder()
+                            .merge(config)
+                            .setLineBreakWordStyle(LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE)
+                            .build();
                 }
-
-                if (config == null) {
-                    config = params.getLineBreakConfig();
-                    if (config.getLineBreakWordStyle() == LineBreakConfig.LINE_BREAK_WORD_STYLE_AUTO
-                            && !(paraStart == start && paraEnd == end)) {
-                        // If the text has multiple paragraph, resolve line break word style auto to
-                        // none.
-                        config = new LineBreakConfig.Builder()
-                                .merge(config)
-                                .setLineBreakWordStyle(LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE)
-                                .build();
-                    }
-                }
-
-                result.add(new ParagraphInfo(paraEnd, MeasuredParagraph.buildForStaticLayout(
-                        params.getTextPaint(), config, text, paraStart, paraEnd,
-                        params.getTextDirection(), hyphenationMode, computeLayout, computeBounds,
-                        null /* no hint */,
-                        null /* no recycle */)));
             }
-            return result.toArray(new ParagraphInfo[result.size()]);
-        } finally {
-            if (TRACE_PCT) {
-                Trace.endSection();
-            }
+
+            result.add(new ParagraphInfo(paraEnd, MeasuredParagraph.buildForStaticLayout(
+                    params.getTextPaint(), config, text, paraStart, paraEnd,
+                    params.getTextDirection(), hyphenationMode, computeLayout, computeBounds,
+                    null /* no hint */,
+                    null /* no recycle */)));
         }
+        return result.toArray(new ParagraphInfo[result.size()]);
     }
 
     // Use PrecomputedText.create instead.
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index d1b14d1..3dd3a9e 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -542,20 +542,10 @@
          */
         @NonNull
         public StaticLayout build() {
-            if (TRACE_LAYOUT) {
-                Trace.beginSection("StaticLayout#build");
-                Trace.setCounter("StaticLayout#textLength", mText.length());
-            }
-            try {
-                StaticLayout result = new StaticLayout(this, mIncludePad, mEllipsize != null
-                        ? COLUMNS_ELLIPSIZE : COLUMNS_NORMAL);
-                Builder.recycle(this);
-                return result;
-            } finally {
-                if (TRACE_LAYOUT) {
-                    Trace.endSection();
-                }
-            }
+            StaticLayout result = new StaticLayout(this, mIncludePad, mEllipsize != null
+                    ? COLUMNS_ELLIPSIZE : COLUMNS_NORMAL);
+            Builder.recycle(this);
+            return result;
         }
 
         /**
@@ -572,21 +562,16 @@
          */
         /* package */ @NonNull StaticLayout buildPartialStaticLayoutForDynamicLayout(
                 boolean trackpadding, StaticLayout recycle) {
-            if (TRACE_LAYOUT) {
-                Trace.beginSection("StaticLayout#forDynamicLayout");
-                Trace.setCounter("StaticLayout#textLength", mText.length());
+            if (recycle == null) {
+                recycle = new StaticLayout();
             }
+            Trace.beginSection("Generating StaticLayout For DynamicLayout");
             try {
-                if (recycle == null) {
-                    recycle = new StaticLayout();
-                }
                 recycle.generate(this, mIncludePad, trackpadding);
-                return recycle;
             } finally {
-                if (TRACE_LAYOUT) {
-                    Trace.endSection();
-                }
+                Trace.endSection();
             }
+            return recycle;
         }
 
         private CharSequence mText;
@@ -742,7 +727,12 @@
         mLeftIndents = b.mLeftIndents;
         mRightIndents = b.mRightIndents;
 
-        generate(b, b.mIncludePad, trackPadding);
+        Trace.beginSection("Constructing StaticLayout");
+        try {
+            generate(b, b.mIncludePad, trackPadding);
+        } finally {
+            Trace.endSection();
+        }
     }
 
     private static int getBaseHyphenationFrequency(int frequency) {
@@ -852,23 +842,14 @@
                 case PrecomputedText.Params.UNUSABLE:
                     break;
                 case PrecomputedText.Params.NEED_RECOMPUTE:
-                    if (TRACE_LAYOUT) {
-                        Trace.beginSection("StaticLayout#recomputePct");
-                    }
-                    try {
-                        final PrecomputedText.Params newParams =
-                                new PrecomputedText.Params.Builder(paint)
-                                    .setBreakStrategy(b.mBreakStrategy)
-                                    .setHyphenationFrequency(b.mHyphenationFrequency)
-                                    .setTextDirection(textDir)
-                                    .setLineBreakConfig(b.mLineBreakConfig)
-                                    .build();
-                        precomputed = PrecomputedText.create(precomputed, newParams);
-                    } finally {
-                        if (TRACE_LAYOUT) {
-                            Trace.endSection();
-                        }
-                    }
+                    final PrecomputedText.Params newParams =
+                            new PrecomputedText.Params.Builder(paint)
+                                .setBreakStrategy(b.mBreakStrategy)
+                                .setHyphenationFrequency(b.mHyphenationFrequency)
+                                .setTextDirection(textDir)
+                                .setLineBreakConfig(b.mLineBreakConfig)
+                                .build();
+                    precomputed = PrecomputedText.create(precomputed, newParams);
                     paragraphInfo = precomputed.getParagraphInfo();
                     break;
                 case PrecomputedText.Params.USABLE:
@@ -879,261 +860,232 @@
         }
 
         if (paragraphInfo == null) {
-            if (TRACE_LAYOUT) {
-                Trace.beginSection("StaticLayout#computePct");
-            }
-            try {
-                final PrecomputedText.Params param = new PrecomputedText.Params(paint,
-                        b.mLineBreakConfig, textDir, b.mBreakStrategy, b.mHyphenationFrequency);
-                paragraphInfo = PrecomputedText.createMeasuredParagraphs(source, param, bufStart,
-                        bufEnd, false /* computeLayout */, b.mCalculateBounds);
-            } finally {
-                if (TRACE_LAYOUT) {
-                    Trace.endSection();
-                }
-            }
+            final PrecomputedText.Params param = new PrecomputedText.Params(paint,
+                    b.mLineBreakConfig, textDir, b.mBreakStrategy, b.mHyphenationFrequency);
+            paragraphInfo = PrecomputedText.createMeasuredParagraphs(source, param, bufStart,
+                    bufEnd, false /* computeLayout */, b.mCalculateBounds);
         }
 
         for (int paraIndex = 0; paraIndex < paragraphInfo.length; paraIndex++) {
-            if (TRACE_LAYOUT) {
-                Trace.beginSection("StaticLayout#processParagraph");
-                Trace.setCounter("StaticLayout#paragraph", paraIndex);
+            final int paraStart = paraIndex == 0
+                    ? bufStart : paragraphInfo[paraIndex - 1].paragraphEnd;
+            final int paraEnd = paragraphInfo[paraIndex].paragraphEnd;
+
+            int firstWidthLineCount = 1;
+            int firstWidth = outerWidth;
+            int restWidth = outerWidth;
+
+            LineHeightSpan[] chooseHt = null;
+            if (spanned != null) {
+                LeadingMarginSpan[] sp = getParagraphSpans(spanned, paraStart, paraEnd,
+                        LeadingMarginSpan.class);
+                for (int i = 0; i < sp.length; i++) {
+                    LeadingMarginSpan lms = sp[i];
+                    firstWidth -= sp[i].getLeadingMargin(true);
+                    restWidth -= sp[i].getLeadingMargin(false);
+
+                    // LeadingMarginSpan2 is odd.  The count affects all
+                    // leading margin spans, not just this particular one
+                    if (lms instanceof LeadingMarginSpan2) {
+                        LeadingMarginSpan2 lms2 = (LeadingMarginSpan2) lms;
+                        firstWidthLineCount = Math.max(firstWidthLineCount,
+                                lms2.getLeadingMarginLineCount());
+                    }
+                }
+
+                chooseHt = getParagraphSpans(spanned, paraStart, paraEnd, LineHeightSpan.class);
+
+                if (chooseHt.length == 0) {
+                    chooseHt = null; // So that out() would not assume it has any contents
+                } else {
+                    if (chooseHtv == null || chooseHtv.length < chooseHt.length) {
+                        chooseHtv = ArrayUtils.newUnpaddedIntArray(chooseHt.length);
+                    }
+
+                    for (int i = 0; i < chooseHt.length; i++) {
+                        int o = spanned.getSpanStart(chooseHt[i]);
+
+                        if (o < paraStart) {
+                            // starts in this layout, before the
+                            // current paragraph
+
+                            chooseHtv[i] = getLineTop(getLineForOffset(o));
+                        } else {
+                            // starts in this paragraph
+
+                            chooseHtv[i] = v;
+                        }
+                    }
+                }
             }
-            try {
-                final int paraStart = paraIndex == 0
-                        ? bufStart : paragraphInfo[paraIndex - 1].paragraphEnd;
-                final int paraEnd = paragraphInfo[paraIndex].paragraphEnd;
-
-                int firstWidthLineCount = 1;
-                int firstWidth = outerWidth;
-                int restWidth = outerWidth;
-
-                LineHeightSpan[] chooseHt = null;
-                if (spanned != null) {
-                    LeadingMarginSpan[] sp = getParagraphSpans(spanned, paraStart, paraEnd,
-                            LeadingMarginSpan.class);
-                    for (int i = 0; i < sp.length; i++) {
-                        LeadingMarginSpan lms = sp[i];
-                        firstWidth -= sp[i].getLeadingMargin(true);
-                        restWidth -= sp[i].getLeadingMargin(false);
-
-                        // LeadingMarginSpan2 is odd.  The count affects all
-                        // leading margin spans, not just this particular one
-                        if (lms instanceof LeadingMarginSpan2) {
-                            LeadingMarginSpan2 lms2 = (LeadingMarginSpan2) lms;
-                            firstWidthLineCount = Math.max(firstWidthLineCount,
-                                    lms2.getLeadingMarginLineCount());
-                        }
+            // tab stop locations
+            float[] variableTabStops = null;
+            if (spanned != null) {
+                TabStopSpan[] spans = getParagraphSpans(spanned, paraStart,
+                        paraEnd, TabStopSpan.class);
+                if (spans.length > 0) {
+                    float[] stops = new float[spans.length];
+                    for (int i = 0; i < spans.length; i++) {
+                        stops[i] = (float) spans[i].getTabStop();
                     }
+                    Arrays.sort(stops, 0, stops.length);
+                    variableTabStops = stops;
+                }
+            }
 
-                    chooseHt = getParagraphSpans(spanned, paraStart, paraEnd, LineHeightSpan.class);
+            final MeasuredParagraph measuredPara = paragraphInfo[paraIndex].measured;
+            final char[] chs = measuredPara.getChars();
+            final int[] spanEndCache = measuredPara.getSpanEndCache().getRawArray();
+            final int[] fmCache = measuredPara.getFontMetrics().getRawArray();
 
-                    if (chooseHt.length == 0) {
-                        chooseHt = null; // So that out() would not assume it has any contents
+            constraints.setWidth(restWidth);
+            constraints.setIndent(firstWidth, firstWidthLineCount);
+            constraints.setTabStops(variableTabStops, TAB_INCREMENT);
+
+            LineBreaker.Result res = lineBreaker.computeLineBreaks(
+                    measuredPara.getMeasuredText(), constraints, mLineCount);
+            int breakCount = res.getLineCount();
+            if (lineBreakCapacity < breakCount) {
+                lineBreakCapacity = breakCount;
+                breaks = new int[lineBreakCapacity];
+                lineWidths = new float[lineBreakCapacity];
+                ascents = new float[lineBreakCapacity];
+                descents = new float[lineBreakCapacity];
+                hasTabs = new boolean[lineBreakCapacity];
+                hyphenEdits = new int[lineBreakCapacity];
+            }
+
+            for (int i = 0; i < breakCount; ++i) {
+                breaks[i] = res.getLineBreakOffset(i);
+                lineWidths[i] = res.getLineWidth(i);
+                ascents[i] = res.getLineAscent(i);
+                descents[i] = res.getLineDescent(i);
+                hasTabs[i] = res.hasLineTab(i);
+                hyphenEdits[i] =
+                    packHyphenEdit(res.getStartLineHyphenEdit(i), res.getEndLineHyphenEdit(i));
+            }
+
+            final int remainingLineCount = mMaximumVisibleLineCount - mLineCount;
+            final boolean ellipsisMayBeApplied = ellipsize != null
+                    && (ellipsize == TextUtils.TruncateAt.END
+                        || (mMaximumVisibleLineCount == 1
+                                && ellipsize != TextUtils.TruncateAt.MARQUEE));
+            if (0 < remainingLineCount && remainingLineCount < breakCount
+                    && ellipsisMayBeApplied) {
+                // Calculate width
+                float width = 0;
+                boolean hasTab = false;  // XXX May need to also have starting hyphen edit
+                for (int i = remainingLineCount - 1; i < breakCount; i++) {
+                    if (i == breakCount - 1) {
+                        width += lineWidths[i];
                     } else {
-                        if (chooseHtv == null || chooseHtv.length < chooseHt.length) {
-                            chooseHtv = ArrayUtils.newUnpaddedIntArray(chooseHt.length);
-                        }
-
-                        for (int i = 0; i < chooseHt.length; i++) {
-                            int o = spanned.getSpanStart(chooseHt[i]);
-
-                            if (o < paraStart) {
-                                // starts in this layout, before the
-                                // current paragraph
-
-                                chooseHtv[i] = getLineTop(getLineForOffset(o));
-                            } else {
-                                // starts in this paragraph
-
-                                chooseHtv[i] = v;
-                            }
+                        for (int j = (i == 0 ? 0 : breaks[i - 1]); j < breaks[i]; j++) {
+                            width += measuredPara.getCharWidthAt(j);
                         }
                     }
+                    hasTab |= hasTabs[i];
                 }
-                // tab stop locations
-                float[] variableTabStops = null;
-                if (spanned != null) {
-                    TabStopSpan[] spans = getParagraphSpans(spanned, paraStart,
-                            paraEnd, TabStopSpan.class);
-                    if (spans.length > 0) {
-                        float[] stops = new float[spans.length];
-                        for (int i = 0; i < spans.length; i++) {
-                            stops[i] = (float) spans[i].getTabStop();
+                // Treat the last line and overflowed lines as a single line.
+                breaks[remainingLineCount - 1] = breaks[breakCount - 1];
+                lineWidths[remainingLineCount - 1] = width;
+                hasTabs[remainingLineCount - 1] = hasTab;
+
+                breakCount = remainingLineCount;
+            }
+
+            // here is the offset of the starting character of the line we are currently
+            // measuring
+            int here = paraStart;
+
+            int fmTop = defaultTop;
+            int fmBottom = defaultBottom;
+            int fmAscent = defaultAscent;
+            int fmDescent = defaultDescent;
+            int fmCacheIndex = 0;
+            int spanEndCacheIndex = 0;
+            int breakIndex = 0;
+            for (int spanStart = paraStart, spanEnd; spanStart < paraEnd; spanStart = spanEnd) {
+                // retrieve end of span
+                spanEnd = spanEndCache[spanEndCacheIndex++];
+
+                // retrieve cached metrics, order matches above
+                fm.top = fmCache[fmCacheIndex * 4 + 0];
+                fm.bottom = fmCache[fmCacheIndex * 4 + 1];
+                fm.ascent = fmCache[fmCacheIndex * 4 + 2];
+                fm.descent = fmCache[fmCacheIndex * 4 + 3];
+                fmCacheIndex++;
+
+                if (fm.top < fmTop) {
+                    fmTop = fm.top;
+                }
+                if (fm.ascent < fmAscent) {
+                    fmAscent = fm.ascent;
+                }
+                if (fm.descent > fmDescent) {
+                    fmDescent = fm.descent;
+                }
+                if (fm.bottom > fmBottom) {
+                    fmBottom = fm.bottom;
+                }
+
+                // skip breaks ending before current span range
+                while (breakIndex < breakCount && paraStart + breaks[breakIndex] < spanStart) {
+                    breakIndex++;
+                }
+
+                while (breakIndex < breakCount && paraStart + breaks[breakIndex] <= spanEnd) {
+                    int endPos = paraStart + breaks[breakIndex];
+
+                    boolean moreChars = (endPos < bufEnd);
+
+                    final int ascent = isFallbackLineSpacing
+                            ? Math.min(fmAscent, Math.round(ascents[breakIndex]))
+                            : fmAscent;
+                    final int descent = isFallbackLineSpacing
+                            ? Math.max(fmDescent, Math.round(descents[breakIndex]))
+                            : fmDescent;
+
+                    // The fallback ascent/descent may be larger than top/bottom of the default font
+                    // metrics. Adjust top/bottom with ascent/descent for avoiding unexpected
+                    // clipping.
+                    if (isFallbackLineSpacing) {
+                        if (ascent < fmTop) {
+                            fmTop = ascent;
                         }
-                        Arrays.sort(stops, 0, stops.length);
-                        variableTabStops = stops;
-                    }
-                }
-
-                final MeasuredParagraph measuredPara = paragraphInfo[paraIndex].measured;
-                final char[] chs = measuredPara.getChars();
-                final int[] spanEndCache = measuredPara.getSpanEndCache().getRawArray();
-                final int[] fmCache = measuredPara.getFontMetrics().getRawArray();
-
-                constraints.setWidth(restWidth);
-                constraints.setIndent(firstWidth, firstWidthLineCount);
-                constraints.setTabStops(variableTabStops, TAB_INCREMENT);
-
-                if (TRACE_LAYOUT) {
-                    Trace.beginSection("LineBreaker#computeLineBreaks");
-                }
-                LineBreaker.Result res;
-                try {
-                    res = lineBreaker.computeLineBreaks(
-                            measuredPara.getMeasuredText(), constraints, mLineCount);
-                } finally {
-                    if (TRACE_LAYOUT) {
-                        Trace.endSection();
-                    }
-                }
-                int breakCount = res.getLineCount();
-                if (lineBreakCapacity < breakCount) {
-                    lineBreakCapacity = breakCount;
-                    breaks = new int[lineBreakCapacity];
-                    lineWidths = new float[lineBreakCapacity];
-                    ascents = new float[lineBreakCapacity];
-                    descents = new float[lineBreakCapacity];
-                    hasTabs = new boolean[lineBreakCapacity];
-                    hyphenEdits = new int[lineBreakCapacity];
-                }
-
-                for (int i = 0; i < breakCount; ++i) {
-                    breaks[i] = res.getLineBreakOffset(i);
-                    lineWidths[i] = res.getLineWidth(i);
-                    ascents[i] = res.getLineAscent(i);
-                    descents[i] = res.getLineDescent(i);
-                    hasTabs[i] = res.hasLineTab(i);
-                    hyphenEdits[i] =
-                        packHyphenEdit(res.getStartLineHyphenEdit(i), res.getEndLineHyphenEdit(i));
-                }
-
-                final int remainingLineCount = mMaximumVisibleLineCount - mLineCount;
-                final boolean ellipsisMayBeApplied = ellipsize != null
-                        && (ellipsize == TextUtils.TruncateAt.END
-                            || (mMaximumVisibleLineCount == 1
-                                    && ellipsize != TextUtils.TruncateAt.MARQUEE));
-                if (0 < remainingLineCount && remainingLineCount < breakCount
-                        && ellipsisMayBeApplied) {
-                    // Calculate width
-                    float width = 0;
-                    boolean hasTab = false;  // XXX May need to also have starting hyphen edit
-                    for (int i = remainingLineCount - 1; i < breakCount; i++) {
-                        if (i == breakCount - 1) {
-                            width += lineWidths[i];
-                        } else {
-                            for (int j = (i == 0 ? 0 : breaks[i - 1]); j < breaks[i]; j++) {
-                                width += measuredPara.getCharWidthAt(j);
-                            }
-                        }
-                        hasTab |= hasTabs[i];
-                    }
-                    // Treat the last line and overflowed lines as a single line.
-                    breaks[remainingLineCount - 1] = breaks[breakCount - 1];
-                    lineWidths[remainingLineCount - 1] = width;
-                    hasTabs[remainingLineCount - 1] = hasTab;
-
-                    breakCount = remainingLineCount;
-                }
-
-                // here is the offset of the starting character of the line we are currently
-                // measuring
-                int here = paraStart;
-
-                int fmTop = defaultTop;
-                int fmBottom = defaultBottom;
-                int fmAscent = defaultAscent;
-                int fmDescent = defaultDescent;
-                int fmCacheIndex = 0;
-                int spanEndCacheIndex = 0;
-                int breakIndex = 0;
-                for (int spanStart = paraStart, spanEnd; spanStart < paraEnd; spanStart = spanEnd) {
-                    // retrieve end of span
-                    spanEnd = spanEndCache[spanEndCacheIndex++];
-
-                    // retrieve cached metrics, order matches above
-                    fm.top = fmCache[fmCacheIndex * 4 + 0];
-                    fm.bottom = fmCache[fmCacheIndex * 4 + 1];
-                    fm.ascent = fmCache[fmCacheIndex * 4 + 2];
-                    fm.descent = fmCache[fmCacheIndex * 4 + 3];
-                    fmCacheIndex++;
-
-                    if (fm.top < fmTop) {
-                        fmTop = fm.top;
-                    }
-                    if (fm.ascent < fmAscent) {
-                        fmAscent = fm.ascent;
-                    }
-                    if (fm.descent > fmDescent) {
-                        fmDescent = fm.descent;
-                    }
-                    if (fm.bottom > fmBottom) {
-                        fmBottom = fm.bottom;
-                    }
-
-                    // skip breaks ending before current span range
-                    while (breakIndex < breakCount && paraStart + breaks[breakIndex] < spanStart) {
-                        breakIndex++;
-                    }
-
-                    while (breakIndex < breakCount && paraStart + breaks[breakIndex] <= spanEnd) {
-                        int endPos = paraStart + breaks[breakIndex];
-
-                        boolean moreChars = (endPos < bufEnd);
-
-                        final int ascent = isFallbackLineSpacing
-                                ? Math.min(fmAscent, Math.round(ascents[breakIndex]))
-                                : fmAscent;
-                        final int descent = isFallbackLineSpacing
-                                ? Math.max(fmDescent, Math.round(descents[breakIndex]))
-                                : fmDescent;
-
-                        // The fallback ascent/descent may be larger than top/bottom of the default
-                        // font metrics. Adjust top/bottom with ascent/descent for avoiding
-                        // unexpected clipping.
-                        if (isFallbackLineSpacing) {
-                            if (ascent < fmTop) {
-                                fmTop = ascent;
-                            }
-                            if (descent > fmBottom) {
-                                fmBottom = descent;
-                            }
-                        }
-
-                        v = out(source, here, endPos,
-                                ascent, descent, fmTop, fmBottom,
-                                v, spacingmult, spacingadd, chooseHt, chooseHtv, fm,
-                                hasTabs[breakIndex], hyphenEdits[breakIndex], needMultiply,
-                                measuredPara, bufEnd, includepad, trackpad, addLastLineSpacing, chs,
-                                paraStart, ellipsize, ellipsizedWidth, lineWidths[breakIndex],
-                                paint, moreChars);
-
-                        if (endPos < spanEnd) {
-                            // preserve metrics for current span
-                            fmTop = Math.min(defaultTop, fm.top);
-                            fmBottom = Math.max(defaultBottom, fm.bottom);
-                            fmAscent = Math.min(defaultAscent, fm.ascent);
-                            fmDescent = Math.max(defaultDescent, fm.descent);
-                        } else {
-                            fmTop = fmBottom = fmAscent = fmDescent = 0;
-                        }
-
-                        here = endPos;
-                        breakIndex++;
-
-                        if (mLineCount >= mMaximumVisibleLineCount && mEllipsized) {
-                            return;
+                        if (descent > fmBottom) {
+                            fmBottom = descent;
                         }
                     }
-                }
 
-                if (paraEnd == bufEnd) {
-                    break;
+                    v = out(source, here, endPos,
+                            ascent, descent, fmTop, fmBottom,
+                            v, spacingmult, spacingadd, chooseHt, chooseHtv, fm,
+                            hasTabs[breakIndex], hyphenEdits[breakIndex], needMultiply,
+                            measuredPara, bufEnd, includepad, trackpad, addLastLineSpacing, chs,
+                            paraStart, ellipsize, ellipsizedWidth, lineWidths[breakIndex],
+                            paint, moreChars);
+
+                    if (endPos < spanEnd) {
+                        // preserve metrics for current span
+                        fmTop = Math.min(defaultTop, fm.top);
+                        fmBottom = Math.max(defaultBottom, fm.bottom);
+                        fmAscent = Math.min(defaultAscent, fm.ascent);
+                        fmDescent = Math.max(defaultDescent, fm.descent);
+                    } else {
+                        fmTop = fmBottom = fmAscent = fmDescent = 0;
+                    }
+
+                    here = endPos;
+                    breakIndex++;
+
+                    if (mLineCount >= mMaximumVisibleLineCount && mEllipsized) {
+                        return;
+                    }
                 }
-            } finally {
-                if (TRACE_LAYOUT) {
-                    Trace.endSection();
-                }
+            }
+
+            if (paraEnd == bufEnd) {
+                break;
             }
         }
 
@@ -1227,18 +1179,9 @@
                     (!firstLine && (currentLineIsTheLastVisibleOne || !moreChars) &&
                             ellipsize == TextUtils.TruncateAt.END);
             if (doEllipsis) {
-                if (TRACE_LAYOUT) {
-                    Trace.beginSection("StaticLayout#calculateEllipsis");
-                }
-                try {
-                    calculateEllipsis(start, end, measured, widthStart,
-                            ellipsisWidth, ellipsize, j,
-                            textWidth, paint, forceEllipsis);
-                } finally {
-                    if (TRACE_LAYOUT) {
-                        Trace.endSection();
-                    }
-                }
+                calculateEllipsis(start, end, measured, widthStart,
+                        ellipsisWidth, ellipsize, j,
+                        textWidth, paint, forceEllipsis);
             } else {
                 mLines[mColumns * j + ELLIPSIS_START] = 0;
                 mLines[mColumns * j + ELLIPSIS_COUNT] = 0;
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index a439478..bde9c77 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -28,7 +28,6 @@
 import android.graphics.text.PositionedGlyphs;
 import android.graphics.text.TextRunShaper;
 import android.os.Build;
-import android.os.Trace;
 import android.text.Layout.Directions;
 import android.text.Layout.TabStops;
 import android.text.style.CharacterStyle;
@@ -57,8 +56,6 @@
 public class TextLine {
     private static final boolean DEBUG = false;
 
-    private static final boolean TRACE_TEXTLINE = Build.isDebuggable();
-
     private static final char TAB_CHAR = '\t';
 
     private TextPaint mPaint;
@@ -433,37 +430,28 @@
      * @param bottom the bottom of the line
      */
     void draw(Canvas c, float x, int top, int y, int bottom) {
-        if (TRACE_TEXTLINE) {
-            Trace.beginSection("TextLine#draw");
-        }
-        try {
-            float h = 0;
-            final int runCount = mDirections.getRunCount();
-            for (int runIndex = 0; runIndex < runCount; runIndex++) {
-                final int runStart = mDirections.getRunStart(runIndex);
-                if (runStart > mLen) break;
-                final int runLimit = Math.min(runStart + mDirections.getRunLength(runIndex), mLen);
-                final boolean runIsRtl = mDirections.isRunRtl(runIndex);
+        float h = 0;
+        final int runCount = mDirections.getRunCount();
+        for (int runIndex = 0; runIndex < runCount; runIndex++) {
+            final int runStart = mDirections.getRunStart(runIndex);
+            if (runStart > mLen) break;
+            final int runLimit = Math.min(runStart + mDirections.getRunLength(runIndex), mLen);
+            final boolean runIsRtl = mDirections.isRunRtl(runIndex);
 
-                final int runFlag = calculateRunFlag(runIndex, runCount, mDir);
+            final int runFlag = calculateRunFlag(runIndex, runCount, mDir);
 
-                int segStart = runStart;
-                for (int j = mHasTabs ? runStart : runLimit; j <= runLimit; j++) {
-                    if (j == runLimit || charAt(j) == TAB_CHAR) {
-                        h += drawRun(c, segStart, j, runIsRtl, x + h, top, y, bottom,
-                                runIndex != (runCount - 1) || j != mLen, runFlag);
+            int segStart = runStart;
+            for (int j = mHasTabs ? runStart : runLimit; j <= runLimit; j++) {
+                if (j == runLimit || charAt(j) == TAB_CHAR) {
+                    h += drawRun(c, segStart, j, runIsRtl, x + h, top, y, bottom,
+                            runIndex != (runCount - 1) || j != mLen, runFlag);
 
-                        if (j != runLimit) {  // charAt(j) == TAB_CHAR
-                            h = mDir * nextTab(h * mDir);
-                        }
-                        segStart = j + 1;
+                    if (j != runLimit) {  // charAt(j) == TAB_CHAR
+                        h = mDir * nextTab(h * mDir);
                     }
+                    segStart = j + 1;
                 }
             }
-        } finally {
-            if (TRACE_TEXTLINE) {
-                Trace.endSection();
-            }
         }
     }
 
@@ -576,76 +564,63 @@
      */
     public float measure(@IntRange(from = 0) int offset, boolean trailing,
             @NonNull FontMetricsInt fmi, @Nullable RectF drawBounds, @Nullable LineInfo lineInfo) {
-        if (TRACE_TEXTLINE) {
-            Trace.beginSection("TextLine#measure");
+        if (offset > mLen) {
+            throw new IndexOutOfBoundsException(
+                    "offset(" + offset + ") should be less than line limit(" + mLen + ")");
         }
-        try {
-            if (offset > mLen) {
-                throw new IndexOutOfBoundsException(
-                        "offset(" + offset + ") should be less than line limit(" + mLen + ")");
-            }
-            if (lineInfo != null) {
-                lineInfo.setClusterCount(0);
-            }
-            final int target = trailing ? offset - 1 : offset;
-            if (target < 0) {
-                return 0;
-            }
+        if (lineInfo != null) {
+            lineInfo.setClusterCount(0);
+        }
+        final int target = trailing ? offset - 1 : offset;
+        if (target < 0) {
+            return 0;
+        }
 
-            float h = 0;
-            final int runCount = mDirections.getRunCount();
-            for (int runIndex = 0; runIndex < runCount; runIndex++) {
-                final int runStart = mDirections.getRunStart(runIndex);
-                if (runStart > mLen) break;
-                final int runLimit = Math.min(runStart + mDirections.getRunLength(runIndex), mLen);
-                final boolean runIsRtl = mDirections.isRunRtl(runIndex);
-                final int runFlag = calculateRunFlag(runIndex, runCount, mDir);
+        float h = 0;
+        final int runCount = mDirections.getRunCount();
+        for (int runIndex = 0; runIndex < runCount; runIndex++) {
+            final int runStart = mDirections.getRunStart(runIndex);
+            if (runStart > mLen) break;
+            final int runLimit = Math.min(runStart + mDirections.getRunLength(runIndex), mLen);
+            final boolean runIsRtl = mDirections.isRunRtl(runIndex);
+            final int runFlag = calculateRunFlag(runIndex, runCount, mDir);
 
-                int segStart = runStart;
-                for (int j = mHasTabs ? runStart : runLimit; j <= runLimit; j++) {
-                    if (j == runLimit || charAt(j) == TAB_CHAR) {
-                        final boolean targetIsInThisSegment = target >= segStart && target < j;
-                        final boolean sameDirection =
-                                (mDir == Layout.DIR_RIGHT_TO_LEFT) == runIsRtl;
+            int segStart = runStart;
+            for (int j = mHasTabs ? runStart : runLimit; j <= runLimit; j++) {
+                if (j == runLimit || charAt(j) == TAB_CHAR) {
+                    final boolean targetIsInThisSegment = target >= segStart && target < j;
+                    final boolean sameDirection = (mDir == Layout.DIR_RIGHT_TO_LEFT) == runIsRtl;
 
-                        if (targetIsInThisSegment && sameDirection) {
-                            return h + measureRun(segStart, offset, j, runIsRtl, fmi, drawBounds,
-                                    null,
-                                    0, h, lineInfo, runFlag);
-                        }
-
-                        final float segmentWidth = measureRun(segStart, j, j, runIsRtl, fmi,
-                                drawBounds,
-                                null, 0, h, lineInfo, runFlag);
-                        h += sameDirection ? segmentWidth : -segmentWidth;
-
-                        if (targetIsInThisSegment) {
-                            return h + measureRun(segStart, offset, j, runIsRtl, null, null, null,
-                                    0,
-                                    h, lineInfo, runFlag);
-                        }
-
-                        if (j != runLimit) {  // charAt(j) == TAB_CHAR
-                            if (offset == j) {
-                                return h;
-                            }
-                            h = mDir * nextTab(h * mDir);
-                            if (target == j) {
-                                return h;
-                            }
-                        }
-
-                        segStart = j + 1;
+                    if (targetIsInThisSegment && sameDirection) {
+                        return h + measureRun(segStart, offset, j, runIsRtl, fmi, drawBounds, null,
+                                0, h, lineInfo, runFlag);
                     }
+
+                    final float segmentWidth = measureRun(segStart, j, j, runIsRtl, fmi, drawBounds,
+                            null, 0, h, lineInfo, runFlag);
+                    h += sameDirection ? segmentWidth : -segmentWidth;
+
+                    if (targetIsInThisSegment) {
+                        return h + measureRun(segStart, offset, j, runIsRtl, null, null,  null, 0,
+                                h, lineInfo, runFlag);
+                    }
+
+                    if (j != runLimit) {  // charAt(j) == TAB_CHAR
+                        if (offset == j) {
+                            return h;
+                        }
+                        h = mDir * nextTab(h * mDir);
+                        if (target == j) {
+                            return h;
+                        }
+                    }
+
+                    segStart = j + 1;
                 }
             }
-
-            return h;
-        } finally {
-            if (TRACE_TEXTLINE) {
-                Trace.endSection();
-            }
         }
+
+        return h;
     }
 
     /**
diff --git a/core/java/android/text/flags/flags.aconfig b/core/java/android/text/flags/flags.aconfig
index 8e1ac63..24035af 100644
--- a/core/java/android/text/flags/flags.aconfig
+++ b/core/java/android/text/flags/flags.aconfig
@@ -52,6 +52,19 @@
 }
 
 flag {
+  name: "complete_font_load_in_system_services_ready"
+  namespace: "text"
+  description: "Fix to ensure that font loading is complete on system-services-ready boot phase."
+  # Make read only, as font loading is in the critical boot path which happens before the read-write
+  # flags propagate to the device.
+  is_fixed_read_only: true
+  bug: "327941215"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
   name: "phrase_strict_fallback"
   namespace: "text"
   description: "Feature flag for automatic fallback from phrase based line break to strict line break."
@@ -146,3 +159,14 @@
   description: "Feature flag for showing error message when user tries stylus handwriting on a text field which doesn't support it"
   bug: "297962571"
 }
+
+flag {
+  name: "fix_font_update_failure"
+  namespace: "text"
+  description: "There was a bug of updating system font from Android 13 to 14. This flag for fixing the migration failure."
+  is_fixed_read_only: true
+  bug: "331717791"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
diff --git a/core/java/android/tracing/flags.aconfig b/core/java/android/tracing/flags.aconfig
index cedba85..1815f14 100644
--- a/core/java/android/tracing/flags.aconfig
+++ b/core/java/android/tracing/flags.aconfig
@@ -14,3 +14,10 @@
     bug: "276432490"
     is_fixed_read_only: true
 }
+
+flag {
+    name: "perfetto_ime_tracing"
+    namespace: "windowing_tools"
+    description: "Migrate IME tracing to Perfetto"
+    bug: "276433199"
+}
diff --git a/core/java/android/tracing/perfetto/DataSource.java b/core/java/android/tracing/perfetto/DataSource.java
index d0c719b..c33fa7d 100644
--- a/core/java/android/tracing/perfetto/DataSource.java
+++ b/core/java/android/tracing/perfetto/DataSource.java
@@ -20,6 +20,8 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 
+import dalvik.annotation.optimization.CriticalNative;
+
 /**
  * Templated base class meant to be derived by embedders to create a custom data
  * source.
@@ -71,9 +73,24 @@
      * @param fun The tracing lambda that will be called with the tracing contexts of each active
      *            tracing instance.
      */
-    public final void trace(
-            TraceFunction<DataSourceInstanceType, TlsStateType, IncrementalStateType> fun) {
-        nativeTrace(mNativeObj, fun);
+    public final void trace(TraceFunction<TlsStateType, IncrementalStateType> fun) {
+        boolean startedIterator = nativePerfettoDsTraceIterateBegin(mNativeObj);
+
+        if (!startedIterator) {
+            return;
+        }
+
+        try {
+            do {
+                TracingContext<TlsStateType, IncrementalStateType> ctx =
+                        new TracingContext<>(mNativeObj);
+                fun.trace(ctx);
+
+                ctx.flush();
+            } while (nativePerfettoDsTraceIterateNext(mNativeObj));
+        } finally {
+            nativePerfettoDsTraceIterateBreak(mNativeObj);
+        }
     }
 
     /**
@@ -154,8 +171,6 @@
             long dataSourcePtr, int bufferExhaustedPolicy);
 
     private static native long nativeCreate(DataSource thiz, String name);
-    private static native void nativeTrace(
-            long nativeDataSourcePointer, TraceFunction traceFunction);
     private static native void nativeFlushAll(long nativeDataSourcePointer);
     private static native long nativeGetFinalizer();
 
@@ -163,4 +178,11 @@
             long dataSourcePtr, int dsInstanceIdx);
     private static native void nativeReleasePerfettoInstanceLocked(
             long dataSourcePtr, int dsInstanceIdx);
+
+    @CriticalNative
+    private static native boolean nativePerfettoDsTraceIterateBegin(long dataSourcePtr);
+    @CriticalNative
+    private static native boolean nativePerfettoDsTraceIterateNext(long dataSourcePtr);
+    @CriticalNative
+    private static native void nativePerfettoDsTraceIterateBreak(long dataSourcePtr);
 }
diff --git a/core/java/android/tracing/perfetto/TraceFunction.java b/core/java/android/tracing/perfetto/TraceFunction.java
index 62941df..13e663d 100644
--- a/core/java/android/tracing/perfetto/TraceFunction.java
+++ b/core/java/android/tracing/perfetto/TraceFunction.java
@@ -16,19 +16,15 @@
 
 package android.tracing.perfetto;
 
-import java.io.IOException;
-
 /**
  * The interface for the trace function called from native on a trace call with a context.
  *
- * @param <DataSourceInstanceType> The type of DataSource this tracing context is for.
  * @param <TlsStateType> The type of the custom TLS state, if any is used.
  * @param <IncrementalStateType> The type of the custom incremental state, if any is used.
  *
  * @hide
  */
-public interface TraceFunction<DataSourceInstanceType extends DataSourceInstance,
-        TlsStateType, IncrementalStateType> {
+public interface TraceFunction<TlsStateType, IncrementalStateType> {
 
     /**
      * This function will be called synchronously (i.e., always before trace() returns) only if
@@ -38,6 +34,5 @@
      *
      * @param ctx the tracing context to trace for in the trace function.
      */
-    void trace(TracingContext<DataSourceInstanceType, TlsStateType, IncrementalStateType> ctx)
-            throws IOException;
+    void trace(TracingContext<TlsStateType, IncrementalStateType> ctx);
 }
diff --git a/core/java/android/tracing/perfetto/TracingContext.java b/core/java/android/tracing/perfetto/TracingContext.java
index c1a61a7..060f964 100644
--- a/core/java/android/tracing/perfetto/TracingContext.java
+++ b/core/java/android/tracing/perfetto/TracingContext.java
@@ -24,26 +24,18 @@
 /**
  * Argument passed to the lambda function passed to Trace().
  *
- * @param <DataSourceInstanceType> The type of the datasource this tracing context is for.
  * @param <TlsStateType> The type of the custom TLS state, if any is used.
  * @param <IncrementalStateType> The type of the custom incremental state, if any is used.
  *
  * @hide
  */
-public class TracingContext<DataSourceInstanceType extends DataSourceInstance,
-        TlsStateType, IncrementalStateType> {
+public class TracingContext<TlsStateType, IncrementalStateType> {
 
-    private final long mContextPtr;
-    private final TlsStateType mTlsState;
-    private final IncrementalStateType mIncrementalState;
+    private final long mNativeDsPtr;
     private final List<ProtoOutputStream> mTracePackets = new ArrayList<>();
 
-    // Should only be created from the native side.
-    private TracingContext(long contextPtr, TlsStateType tlsState,
-            IncrementalStateType incrementalState) {
-        this.mContextPtr = contextPtr;
-        this.mTlsState = tlsState;
-        this.mIncrementalState = incrementalState;
+    TracingContext(long nativeDsPtr) {
+        this.mNativeDsPtr = nativeDsPtr;
     }
 
     /**
@@ -69,7 +61,7 @@
      * Stop timeout expires.
      */
     public void flush() {
-        nativeFlush(this, mContextPtr);
+        nativeFlush(mNativeDsPtr, getAndClearAllPendingTracePackets());
     }
 
     /**
@@ -80,7 +72,7 @@
      * @return The TlsState instance for the tracing thread and instance.
      */
     public TlsStateType getCustomTlsState() {
-        return this.mTlsState;
+        return (TlsStateType) nativeGetCustomTls(mNativeDsPtr);
     }
 
     /**
@@ -90,10 +82,9 @@
      * @return The current IncrementalState object instance.
      */
     public IncrementalStateType getIncrementalState() {
-        return this.mIncrementalState;
+        return (IncrementalStateType) nativeGetIncrementalState(mNativeDsPtr);
     }
 
-    // Called from native to get trace packets
     private byte[][] getAndClearAllPendingTracePackets() {
         byte[][] res = new byte[mTracePackets.size()][];
         for (int i = 0; i < mTracePackets.size(); i++) {
@@ -105,5 +96,7 @@
         return res;
     }
 
-    private static native void nativeFlush(TracingContext thiz, long ctxPointer);
+    private static native void nativeFlush(long dataSourcePtr, byte[][] packetData);
+    private static native Object nativeGetCustomTls(long nativeDsPtr);
+    private static native Object nativeGetIncrementalState(long nativeDsPtr);
 }
diff --git a/core/java/android/view/BatchedInputEventReceiver.java b/core/java/android/view/BatchedInputEventReceiver.java
index ca2e56d..2e39f73 100644
--- a/core/java/android/view/BatchedInputEventReceiver.java
+++ b/core/java/android/view/BatchedInputEventReceiver.java
@@ -29,6 +29,7 @@
     private Choreographer mChoreographer;
     private boolean mBatchingEnabled;
     private boolean mBatchedInputScheduled;
+    private final String mTag;
     private final Handler mHandler;
     private final Runnable mConsumeBatchedInputEvents = new Runnable() {
         @Override
@@ -43,6 +44,7 @@
         super(inputChannel, looper);
         mChoreographer = choreographer;
         mBatchingEnabled = true;
+        mTag = inputChannel.getName();
         traceBoolVariable("mBatchingEnabled", mBatchingEnabled);
         traceBoolVariable("mBatchedInputScheduled", mBatchedInputScheduled);
         mHandler = new Handler(looper);
@@ -123,7 +125,12 @@
     private final class BatchedInputRunnable implements Runnable {
         @Override
         public void run() {
-            doConsumeBatchedInput(mChoreographer.getFrameTimeNanos());
+            try {
+                Trace.traceBegin(Trace.TRACE_TAG_INPUT, mTag);
+                doConsumeBatchedInput(mChoreographer.getFrameTimeNanos());
+            } finally {
+                Trace.traceEnd(Trace.TRACE_TAG_INPUT);
+            }
         }
     }
     private final BatchedInputRunnable mBatchedInputRunnable = new BatchedInputRunnable();
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 1f2b4fa..4475418 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -503,6 +503,79 @@
      */
     public static final int STATE_ON_SUSPEND = ViewProtoEnums.DISPLAY_STATE_ON_SUSPEND; // 6
 
+    /**
+     * The cause of the display state change is unknown.
+     *
+     * @hide
+     */
+    public static final int STATE_REASON_UNKNOWN = ViewProtoEnums.DISPLAY_STATE_REASON_UNKNOWN;
+
+    /**
+     * The default power and display policy caused the display state.
+     *
+     * @hide
+     */
+    public static final int STATE_REASON_DEFAULT_POLICY =
+            ViewProtoEnums.DISPLAY_STATE_REASON_DEFAULT_POLICY;
+
+    /**
+     * The display state was changed due to acquiring a draw wake lock.
+     *
+     * @hide
+     */
+    public static final int STATE_REASON_DRAW_WAKE_LOCK =
+            ViewProtoEnums.DISPLAY_STATE_REASON_DRAW_WAKE_LOCK;
+
+    /**
+     * The display state was changed due to display offloading.
+     *
+     * @hide
+     */
+    public static final int STATE_REASON_OFFLOAD = ViewProtoEnums.DISPLAY_STATE_REASON_OFFLOAD;
+
+    /**
+     * The display state was changed due to a tilt event.
+     *
+     * @hide
+     */
+    public static final int STATE_REASON_TILT = ViewProtoEnums.DISPLAY_STATE_REASON_TILT;
+
+    /**
+     * The display state was changed due to the dream manager.
+     *
+     * @hide
+     */
+    public static final int STATE_REASON_DREAM_MANAGER =
+            ViewProtoEnums.DISPLAY_STATE_REASON_DREAM_MANAGER;
+
+    /**
+     * The display state was changed due to a {@link KeyEvent}.
+     *
+     * @hide
+     */
+    public static final int STATE_REASON_KEY = ViewProtoEnums.DISPLAY_STATE_REASON_KEY;
+
+    /**
+     * The display state was changed due to a {@link MotionEvent}.
+     *
+     * @hide
+     */
+    public static final int STATE_REASON_MOTION = ViewProtoEnums.DISPLAY_STATE_REASON_MOTION;
+
+    /** @hide */
+    @IntDef(prefix = {"STATE_REASON_"}, value = {
+        STATE_REASON_UNKNOWN,
+        STATE_REASON_DEFAULT_POLICY,
+        STATE_REASON_DRAW_WAKE_LOCK,
+        STATE_REASON_OFFLOAD,
+        STATE_REASON_TILT,
+        STATE_REASON_DREAM_MANAGER,
+        STATE_REASON_KEY,
+        STATE_REASON_MOTION,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface StateReason {}
+
     /* The color mode constants defined below must be kept in sync with the ones in
      * system/core/include/system/graphics-base.h */
 
@@ -1996,6 +2069,30 @@
         }
     }
 
+    /** @hide */
+    public static String stateReasonToString(@StateReason int reason) {
+        switch (reason) {
+            case STATE_REASON_UNKNOWN:
+                return "UNKNOWN";
+            case STATE_REASON_DEFAULT_POLICY:
+                return "DEFAULT_POLICY";
+            case STATE_REASON_DRAW_WAKE_LOCK:
+                return "DRAW_WAKE_LOCK";
+            case STATE_REASON_OFFLOAD:
+                return "OFFLOAD";
+            case STATE_REASON_TILT:
+                return "TILT";
+            case STATE_REASON_DREAM_MANAGER:
+                return "DREAM_MANAGER";
+            case STATE_REASON_KEY:
+                return "KEY";
+            case STATE_REASON_MOTION:
+                return "MOTION";
+            default:
+                return Integer.toString(reason);
+        }
+    }
+
     /**
      * Returns true if display updates may be suspended while in the specified
      * display power state. In SUSPEND states, updates are absolutely forbidden.
diff --git a/core/java/android/view/ImeBackAnimationController.java b/core/java/android/view/ImeBackAnimationController.java
new file mode 100644
index 0000000..d14e858
--- /dev/null
+++ b/core/java/android/view/ImeBackAnimationController.java
@@ -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 android.view;
+
+import static android.view.InsetsController.ANIMATION_TYPE_USER;
+import static android.view.WindowInsets.Type.ime;
+import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
+import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.Insets;
+import android.util.Log;
+import android.view.animation.Interpolator;
+import android.view.animation.PathInterpolator;
+import android.window.BackEvent;
+import android.window.OnBackAnimationCallback;
+
+/**
+ * Controller for IME predictive back animation
+ *
+ * @hide
+ */
+public class ImeBackAnimationController implements OnBackAnimationCallback {
+
+    private static final String TAG = "ImeBackAnimationController";
+    private static final int POST_COMMIT_DURATION_MS = 200;
+    private static final int POST_COMMIT_CANCEL_DURATION_MS = 50;
+    private static final float PEEK_FRACTION = 0.1f;
+    private static final Interpolator STANDARD_DECELERATE = new PathInterpolator(0f, 0f, 0f, 1f);
+    private static final Interpolator EMPHASIZED_DECELERATE = new PathInterpolator(
+            0.05f, 0.7f, 0.1f, 1f);
+    private static final Interpolator STANDARD_ACCELERATE = new PathInterpolator(0.3f, 0f, 1f, 1f);
+
+    private final InsetsController mInsetsController;
+    private final ViewRootImpl mViewRoot;
+    private WindowInsetsAnimationController mWindowInsetsAnimationController = null;
+    private ValueAnimator mPostCommitAnimator = null;
+    private float mLastProgress = 0f;
+    private boolean mTriggerBack = false;
+    private boolean mIsPreCommitAnimationInProgress = false;
+
+    public ImeBackAnimationController(ViewRootImpl viewRoot) {
+        mInsetsController = viewRoot.getInsetsController();
+        mViewRoot = viewRoot;
+    }
+
+    @Override
+    public void onBackStarted(@NonNull BackEvent backEvent) {
+        if (isAdjustResize()) {
+            // There is no good solution for a predictive back animation if the app uses
+            // adjustResize, since we can't relayout the whole app for every frame. We also don't
+            // want to reveal any black areas behind the IME. Therefore let's not play any animation
+            // in that case for now.
+            Log.d(TAG, "onBackStarted -> not playing predictive back animation due to softinput"
+                    + " mode adjustResize");
+            return;
+        }
+        if (isHideAnimationInProgress()) {
+            // If IME is currently animating away, skip back gesture
+            return;
+        }
+        mIsPreCommitAnimationInProgress = true;
+        if (mWindowInsetsAnimationController != null) {
+            // There's still an active animation controller. This means that a cancel post commit
+            // animation of an earlier back gesture is still in progress. Let's cancel it and let
+            // the new gesture seamlessly take over.
+            resetPostCommitAnimator();
+            setPreCommitProgress(0f);
+            return;
+        }
+        mInsetsController.controlWindowInsetsAnimation(ime(), /*cancellationSignal*/ null,
+                new WindowInsetsAnimationControlListener() {
+                    @Override
+                    public void onReady(@NonNull WindowInsetsAnimationController controller,
+                            @WindowInsets.Type.InsetsType int types) {
+                        mWindowInsetsAnimationController = controller;
+                        if (mIsPreCommitAnimationInProgress) {
+                            setPreCommitProgress(mLastProgress);
+                        } else {
+                            // gesture has already finished before IME became ready to animate
+                            startPostCommitAnim(mTriggerBack);
+                        }
+                    }
+
+                    @Override
+                    public void onFinished(@NonNull WindowInsetsAnimationController controller) {
+                        reset();
+                    }
+
+                    @Override
+                    public void onCancelled(@Nullable WindowInsetsAnimationController controller) {
+                        reset();
+                    }
+                }, /*fromIme*/ false, /*durationMs*/ -1, /*interpolator*/ null, ANIMATION_TYPE_USER,
+                /*fromPredictiveBack*/ true);
+    }
+
+    @Override
+    public void onBackProgressed(@NonNull BackEvent backEvent) {
+        mLastProgress = backEvent.getProgress();
+        setPreCommitProgress(mLastProgress);
+    }
+
+    @Override
+    public void onBackCancelled() {
+        if (isAdjustResize()) return;
+        startPostCommitAnim(/*hideIme*/ false);
+    }
+
+    @Override
+    public void onBackInvoked() {
+        if (isAdjustResize()) {
+            mInsetsController.hide(ime());
+            return;
+        }
+        startPostCommitAnim(/*hideIme*/ true);
+    }
+
+    private void setPreCommitProgress(float progress) {
+        if (isHideAnimationInProgress()) return;
+        if (mWindowInsetsAnimationController != null) {
+            float hiddenY = mWindowInsetsAnimationController.getHiddenStateInsets().bottom;
+            float shownY = mWindowInsetsAnimationController.getShownStateInsets().bottom;
+            float imeHeight = shownY - hiddenY;
+            float interpolatedProgress = STANDARD_DECELERATE.getInterpolation(progress);
+            int newY = (int) (imeHeight - interpolatedProgress * (imeHeight * PEEK_FRACTION));
+            mWindowInsetsAnimationController.setInsetsAndAlpha(Insets.of(0, 0, 0, newY), 1f,
+                    progress);
+        }
+    }
+
+    private void startPostCommitAnim(boolean triggerBack) {
+        mIsPreCommitAnimationInProgress = false;
+        if (mWindowInsetsAnimationController == null || isHideAnimationInProgress()) {
+            mTriggerBack = triggerBack;
+            return;
+        }
+        mTriggerBack = triggerBack;
+        int currentBottomInset = mWindowInsetsAnimationController.getCurrentInsets().bottom;
+        int targetBottomInset;
+        if (triggerBack) {
+            targetBottomInset = mWindowInsetsAnimationController.getHiddenStateInsets().bottom;
+        } else {
+            targetBottomInset = mWindowInsetsAnimationController.getShownStateInsets().bottom;
+        }
+        mPostCommitAnimator = ValueAnimator.ofFloat(currentBottomInset, targetBottomInset);
+        mPostCommitAnimator.setInterpolator(
+                triggerBack ? STANDARD_ACCELERATE : EMPHASIZED_DECELERATE);
+        mPostCommitAnimator.addUpdateListener(animation -> {
+            int bottomInset = (int) ((float) animation.getAnimatedValue());
+            if (mWindowInsetsAnimationController != null) {
+                mWindowInsetsAnimationController.setInsetsAndAlpha(Insets.of(0, 0, 0, bottomInset),
+                        1f, animation.getAnimatedFraction());
+            } else {
+                reset();
+            }
+        });
+        mPostCommitAnimator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animator) {
+                if (mIsPreCommitAnimationInProgress) {
+                    // this means a new gesture has started while the cancel-post-commit-animation
+                    // was in progress. Let's not reset anything and let the new user gesture take
+                    // over seamlessly
+                    return;
+                }
+                if (mWindowInsetsAnimationController != null) {
+                    mWindowInsetsAnimationController.finish(!triggerBack);
+                }
+                reset();
+            }
+        });
+        mPostCommitAnimator.setDuration(
+                triggerBack ? POST_COMMIT_DURATION_MS : POST_COMMIT_CANCEL_DURATION_MS);
+        mPostCommitAnimator.start();
+    }
+
+    private void reset() {
+        mWindowInsetsAnimationController = null;
+        resetPostCommitAnimator();
+        mLastProgress = 0f;
+        mTriggerBack = false;
+        mIsPreCommitAnimationInProgress = false;
+    }
+
+    private void resetPostCommitAnimator() {
+        if (mPostCommitAnimator != null) {
+            mPostCommitAnimator.cancel();
+            mPostCommitAnimator = null;
+        }
+    }
+
+    private boolean isAdjustResize() {
+        return (mViewRoot.mWindowAttributes.softInputMode & SOFT_INPUT_MASK_ADJUST)
+                == SOFT_INPUT_ADJUST_RESIZE;
+    }
+
+    private boolean isHideAnimationInProgress() {
+        return mPostCommitAnimator != null && mTriggerBack;
+    }
+
+}
diff --git a/core/java/android/view/ImeInsetsSourceConsumer.java b/core/java/android/view/ImeInsetsSourceConsumer.java
index b300022..6caf4d6 100644
--- a/core/java/android/view/ImeInsetsSourceConsumer.java
+++ b/core/java/android/view/ImeInsetsSourceConsumer.java
@@ -196,11 +196,11 @@
         if (!super.setControl(control, showTypes, hideTypes)) {
             return false;
         }
-        final boolean hasLeash = control != null && control.getLeash() != null;
-        if (!hasLeash && !mIsRequestedVisibleAwaitingLeash) {
+        if (control == null && !mIsRequestedVisibleAwaitingLeash) {
             mController.setRequestedVisibleTypes(0 /* visibleTypes */, getType());
             removeSurface();
         }
+        final boolean hasLeash = control != null && control.getLeash() != null;
         if (hasLeash) {
             mIsRequestedVisibleAwaitingLeash = false;
         }
diff --git a/core/java/android/view/InputWindowHandle.java b/core/java/android/view/InputWindowHandle.java
index 9db1060..de5fc7f 100644
--- a/core/java/android/view/InputWindowHandle.java
+++ b/core/java/android/view/InputWindowHandle.java
@@ -67,6 +67,7 @@
             InputConfig.SPY,
             InputConfig.INTERCEPTS_STYLUS,
             InputConfig.CLONE,
+            InputConfig.SENSITIVE_FOR_TRACING,
     })
     public @interface InputConfigFlags {}
 
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java
index 1920fa3..b52003f 100644
--- a/core/java/android/view/InsetsController.java
+++ b/core/java/android/view/InsetsController.java
@@ -29,7 +29,8 @@
 import static android.view.WindowInsets.Type.captionBar;
 import static android.view.WindowInsets.Type.ime;
 
-import android.animation.AnimationHandler;
+import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
+
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.TypeEvaluator;
@@ -67,7 +68,6 @@
 import android.view.inputmethod.InputMethodManager;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.graphics.SfVsyncFrameCallbackProvider;
 import com.android.internal.inputmethod.ImeTracing;
 import com.android.internal.inputmethod.SoftInputShowHideReason;
 import com.android.internal.util.function.TriFunction;
@@ -140,10 +140,6 @@
          */
         @Appearance int getSystemBarsAppearance();
 
-        default boolean isSystemBarsAppearanceControlled() {
-            return false;
-        }
-
         /**
          * @see WindowInsetsController#setSystemBarsBehavior
          */
@@ -154,10 +150,6 @@
          */
         @Behavior int getSystemBarsBehavior();
 
-        default boolean isSystemBarsBehaviorControlled() {
-            return false;
-        }
-
         /**
          * Releases a surface and ensure that this is done after {@link #applySurfaceParams} has
          * finished applying params.
@@ -322,7 +314,7 @@
     public static final int ANIMATION_TYPE_HIDE = 1;
 
     /** Running animation is controlled by user via {@link #controlWindowInsetsAnimation} */
-    @VisibleForTesting
+    @VisibleForTesting(visibility = PACKAGE)
     public static final int ANIMATION_TYPE_USER = 2;
 
     /** Running animation will resize insets */
@@ -385,16 +377,6 @@
         private final WindowInsetsAnimationControlListener mLoggingListener;
         private final InputMethodJankContext mInputMethodJankContext;
 
-        private final ThreadLocal<AnimationHandler> mSfAnimationHandlerThreadLocal =
-                new ThreadLocal<AnimationHandler>() {
-            @Override
-            protected AnimationHandler initialValue() {
-                AnimationHandler handler = new AnimationHandler();
-                handler.setProvider(new SfVsyncFrameCallbackProvider());
-                return handler;
-            }
-        };
-
         public InternalAnimationControlListener(boolean show, boolean hasAnimationCallbacks,
                 @InsetsType int requestedTypes, @Behavior int behavior, boolean disable,
                 int floatingImeBottomInset, WindowInsetsAnimationControlListener loggingListener,
@@ -476,9 +458,6 @@
                     ImeTracker.forJank().onFinishAnimation(getAnimationType());
                 }
             });
-            if (!mHasAnimationCallbacks) {
-                mAnimator.setAnimationHandler(mSfAnimationHandlerThreadLocal.get());
-            }
             mAnimator.start();
         }
 
@@ -670,6 +649,9 @@
     private int mImeCaptionBarInsetsHeight = 0;
     private boolean mAnimationsDisabled;
     private boolean mCompatSysUiVisibilityStaled;
+    private @Appearance int mAppearanceControlled;
+    private @Appearance int mAppearanceFromResource;
+    private boolean mBehaviorControlled;
 
     private final Runnable mPendingControlTimeout = this::abortPendingImeControlRequest;
     private final ArrayList<OnControllableInsetsChangedListener> mControllableInsetsChangedListeners
@@ -737,15 +719,17 @@
 
                 @Override
                 public void onIdMatch(InsetsSource source1, InsetsSource source2) {
-                    final @InsetsType int type = source1.getType();
-                    if ((type & Type.systemBars()) == 0
+                    final Rect frame1 = source1.getFrame();
+                    final Rect frame2 = source2.getFrame();
+                    if (!source1.hasFlags(InsetsSource.FLAG_ANIMATE_RESIZING)
+                            || !source2.hasFlags(InsetsSource.FLAG_ANIMATE_RESIZING)
                             || !source1.isVisible() || !source2.isVisible()
-                            || source1.getFrame().equals(source2.getFrame())
+                            || frame1.equals(frame2) || frame1.isEmpty() || frame2.isEmpty()
                             || !(Rect.intersects(mFrame, source1.getFrame())
                                     || Rect.intersects(mFrame, source2.getFrame()))) {
                         return;
                     }
-                    mTypes |= type;
+                    mTypes |= source1.getType();
                     if (mToState == null) {
                         mToState = new InsetsState();
                     }
@@ -877,7 +861,6 @@
             return false;
         }
         if (DEBUG) Log.d(TAG, "onStateChanged: " + state);
-        mLastDispatchedState.set(state, true /* copySources */);
 
         final InsetsState lastState = new InsetsState(mState, true /* copySources */);
         updateState(state);
@@ -888,10 +871,13 @@
                 true /* excludesInvisibleIme */)) {
             if (DEBUG) Log.d(TAG, "onStateChanged, notifyInsetsChanged");
             mHost.notifyInsetsChanged();
-            if (lastState.getDisplayFrame().equals(mState.getDisplayFrame())) {
-                InsetsState.traverse(lastState, mState, mStartResizingAnimationIfNeeded);
+            if (mLastDispatchedState.getDisplayFrame().equals(state.getDisplayFrame())) {
+                // Here compares the raw states instead of the overridden ones because we don't want
+                // to animate an insets source that its mServerVisible is false.
+                InsetsState.traverse(mLastDispatchedState, state, mStartResizingAnimationIfNeeded);
             }
         }
+        mLastDispatchedState.set(state, true /* copySources */);
         return true;
     }
 
@@ -1072,7 +1058,7 @@
         show(types, false /* fromIme */, null /* statsToken */);
     }
 
-    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+    @VisibleForTesting(visibility = PACKAGE)
     public void show(@InsetsType int types, boolean fromIme,
             @Nullable ImeTracker.Token statsToken) {
         if ((types & ime()) != 0) {
@@ -1256,14 +1242,15 @@
             @Nullable CancellationSignal cancellationSignal,
             @NonNull WindowInsetsAnimationControlListener listener) {
         controlWindowInsetsAnimation(types, cancellationSignal, listener,
-                false /* fromIme */, durationMillis, interpolator, ANIMATION_TYPE_USER);
+                false /* fromIme */, durationMillis, interpolator, ANIMATION_TYPE_USER,
+                false /* fromPredictiveBack */);
     }
 
-    private void controlWindowInsetsAnimation(@InsetsType int types,
+    void controlWindowInsetsAnimation(@InsetsType int types,
             @Nullable CancellationSignal cancellationSignal,
             WindowInsetsAnimationControlListener listener,
             boolean fromIme, long durationMs, @Nullable Interpolator interpolator,
-            @AnimationType int animationType) {
+            @AnimationType int animationType, boolean fromPredictiveBack) {
         if ((mState.calculateUncontrollableInsetsFromFrame(mFrame) & types) != 0) {
             listener.onCancelled(null);
             return;
@@ -1275,7 +1262,8 @@
         }
 
         controlAnimationUnchecked(types, cancellationSignal, listener, mFrame, fromIme, durationMs,
-                interpolator, animationType, getLayoutInsetsDuringAnimationMode(types),
+                interpolator, animationType,
+                getLayoutInsetsDuringAnimationMode(types, fromPredictiveBack),
                 false /* useInsetsAnimationThread */, null /* statsToken */);
     }
 
@@ -1522,7 +1510,12 @@
     }
 
     private @LayoutInsetsDuringAnimation int getLayoutInsetsDuringAnimationMode(
-            @InsetsType int types) {
+            @InsetsType int types, boolean fromPredictiveBack) {
+        if (fromPredictiveBack) {
+            // When insets are animated by predictive back, we want insets to be shown to prevent a
+            // jump cut from shown to hidden at the start of the predictive back animation
+            return LAYOUT_INSETS_DURING_ANIMATION_SHOWN;
+        }
         // Generally, we want to layout the opposite of the current state. This is to make animation
         // callbacks easy to use: The can capture the layout values and then treat that as end-state
         // during the animation.
@@ -1726,7 +1719,7 @@
         return ANIMATION_TYPE_NONE;
     }
 
-    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+    @VisibleForTesting(visibility = PACKAGE)
     public void setRequestedVisibleTypes(@InsetsType int visibleTypes, @InsetsType int mask) {
         final @InsetsType int requestedVisibleTypes =
                 (mRequestedVisibleTypes & ~mask) | (visibleTypes & mask);
@@ -1871,20 +1864,28 @@
 
     @Override
     public void setSystemBarsAppearance(@Appearance int appearance, @Appearance int mask) {
+        mAppearanceControlled |= mask;
         mHost.setSystemBarsAppearance(appearance, mask);
     }
 
     @Override
+    public void setSystemBarsAppearanceFromResource(@Appearance int appearance,
+            @Appearance int mask) {
+        mAppearanceFromResource = (mAppearanceFromResource & ~mask) | (appearance & mask);
+
+        // Don't change the flags which are already controlled by setSystemBarsAppearance.
+        mHost.setSystemBarsAppearance(appearance, mask & ~mAppearanceControlled);
+    }
+
+    @Override
     public @Appearance int getSystemBarsAppearance() {
-        @Appearance int appearance = mHost.getSystemBarsAppearance();
-
         // We only return the requested appearance, not the implied one.
-        appearance &= ~APPEARANCE_FORCE_LIGHT_NAVIGATION_BARS;
-        if (!mHost.isSystemBarsAppearanceControlled()) {
-            appearance &= ~COMPATIBLE_APPEARANCE_FLAGS;
-        }
+        return (mHost.getSystemBarsAppearance() & mAppearanceControlled)
+                | (mAppearanceFromResource & ~mAppearanceControlled);
+    }
 
-        return appearance;
+    public @Appearance int getAppearanceControlled() {
+        return mAppearanceControlled;
     }
 
     @Override
@@ -1936,18 +1937,23 @@
 
     @Override
     public void setSystemBarsBehavior(@Behavior int behavior) {
+        mBehaviorControlled = true;
         mHost.setSystemBarsBehavior(behavior);
     }
 
     @Override
     public @Behavior int getSystemBarsBehavior() {
-        if (!mHost.isSystemBarsBehaviorControlled()) {
+        if (!mBehaviorControlled) {
             // We only return the requested behavior, not the implied one.
-            return 0;
+            return BEHAVIOR_DEFAULT;
         }
         return mHost.getSystemBarsBehavior();
     }
 
+    public boolean isBehaviorControlled() {
+        return mBehaviorControlled;
+    }
+
     @Override
     public void setAnimationsDisabled(boolean disable) {
         mAnimationsDisabled = disable;
diff --git a/core/java/android/view/InsetsSource.java b/core/java/android/view/InsetsSource.java
index 4ac78f5..5c10db1 100644
--- a/core/java/android/view/InsetsSource.java
+++ b/core/java/android/view/InsetsSource.java
@@ -99,11 +99,17 @@
      */
     public static final int FLAG_FORCE_CONSUMING = 1 << 2;
 
+    /**
+     * Controls whether the insets source will play an animation when resizing.
+     */
+    public static final int FLAG_ANIMATE_RESIZING = 1 << 3;
+
     @Retention(RetentionPolicy.SOURCE)
     @IntDef(flag = true, prefix = "FLAG_", value = {
             FLAG_SUPPRESS_SCRIM,
             FLAG_INSETS_ROUNDED_CORNER,
             FLAG_FORCE_CONSUMING,
+            FLAG_ANIMATE_RESIZING,
     })
     public @interface Flags {}
 
@@ -546,6 +552,9 @@
         if ((flags & FLAG_FORCE_CONSUMING) != 0) {
             joiner.add("FORCE_CONSUMING");
         }
+        if ((flags & FLAG_ANIMATE_RESIZING) != 0) {
+            joiner.add("ANIMATE_RESIZING");
+        }
         return joiner.toString();
     }
 
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index 0ae3e59..56a24e4 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -3783,6 +3783,13 @@
             throw new IllegalArgumentException(
                     "idBits must contain at least one pointer from this motion event");
         }
+        final int currentBits = getPointerIdBits();
+        if ((currentBits & idBits) != idBits) {
+            throw new IllegalArgumentException(
+                    "idBits must be a non-empty subset of the pointer IDs from this MotionEvent, "
+                            + "got idBits: "
+                            + String.format("0x%x", idBits) + " for " + this);
+        }
         MotionEvent event = obtain();
         event.mNativePtr = nativeSplit(event.mNativePtr, this.mNativePtr, idBits);
         return event;
diff --git a/core/java/android/view/PendingInsetsController.java b/core/java/android/view/PendingInsetsController.java
index a4cbc52..00a5806 100644
--- a/core/java/android/view/PendingInsetsController.java
+++ b/core/java/android/view/PendingInsetsController.java
@@ -37,6 +37,8 @@
     private final ArrayList<PendingRequest> mRequests = new ArrayList<>();
     private @Appearance int mAppearance;
     private @Appearance int mAppearanceMask;
+    private @Appearance int mAppearanceFromResource;
+    private @Appearance int mAppearanceFromResourceMask;
     private @Behavior int mBehavior = KEEP_BEHAVIOR;
     private boolean mAnimationsDisabled;
     private final InsetsState mDummyState = new InsetsState();
@@ -79,11 +81,21 @@
     }
 
     @Override
+    public void setSystemBarsAppearanceFromResource(int appearance, int mask) {
+        if (mReplayedInsetsController != null) {
+            mReplayedInsetsController.setSystemBarsAppearanceFromResource(appearance, mask);
+        } else {
+            mAppearanceFromResource = (mAppearanceFromResource & ~mask) | (appearance & mask);
+            mAppearanceFromResourceMask |= mask;
+        }
+    }
+
+    @Override
     public int getSystemBarsAppearance() {
         if (mReplayedInsetsController != null) {
             return mReplayedInsetsController.getSystemBarsAppearance();
         }
-        return mAppearance;
+        return mAppearance | (mAppearanceFromResource & ~mAppearanceMask);
     }
 
     @Override
@@ -171,6 +183,10 @@
         if (mAppearanceMask != 0) {
             controller.setSystemBarsAppearance(mAppearance, mAppearanceMask);
         }
+        if (mAppearanceFromResourceMask != 0) {
+            controller.setSystemBarsAppearanceFromResource(
+                    mAppearanceFromResource, mAppearanceFromResourceMask);
+        }
         if (mCaptionInsetsHeight != 0) {
             controller.setCaptionInsetsHeight(mCaptionInsetsHeight);
         }
@@ -199,6 +215,8 @@
         mBehavior = KEEP_BEHAVIOR;
         mAppearance = 0;
         mAppearanceMask = 0;
+        mAppearanceFromResource = 0;
+        mAppearanceFromResourceMask = 0;
         mAnimationsDisabled = false;
         mLoggingListener = null;
         mRequestedVisibleTypes = WindowInsets.Type.defaultVisible();
diff --git a/core/java/android/view/PointerIcon.java b/core/java/android/view/PointerIcon.java
index 9099f98..17d1404 100644
--- a/core/java/android/view/PointerIcon.java
+++ b/core/java/android/view/PointerIcon.java
@@ -16,8 +16,10 @@
 
 package android.view;
 
+import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.TestApi;
 import android.annotation.XmlRes;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
@@ -36,8 +38,10 @@
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.os.PointerIconType;
 import android.util.Log;
 import android.util.SparseArray;
+import android.view.flags.Flags;
 
 import com.android.internal.util.XmlUtils;
 
@@ -52,10 +56,10 @@
     private static final String TAG = "PointerIcon";
 
     /** {@hide} Type constant: Custom icon with a user-supplied bitmap. */
-    public static final int TYPE_CUSTOM = -1;
+    public static final int TYPE_CUSTOM = PointerIconType.CUSTOM;
 
     /** Type constant: Null icon.  It has no bitmap. */
-    public static final int TYPE_NULL = 0;
+    public static final int TYPE_NULL = PointerIconType.TYPE_NULL;
 
     /**
      * Type constant: no icons are specified. If all views uses this, then the pointer icon falls
@@ -63,63 +67,63 @@
      * to have the default icon.
      * @hide
      */
-    public static final int TYPE_NOT_SPECIFIED = 1;
+    public static final int TYPE_NOT_SPECIFIED = PointerIconType.NOT_SPECIFIED;
 
     /** Type constant: Arrow icon.  (Default mouse pointer) */
-    public static final int TYPE_ARROW = 1000;
+    public static final int TYPE_ARROW = PointerIconType.ARROW;
 
     /** {@hide} Type constant: Spot hover icon for touchpads. */
-    public static final int TYPE_SPOT_HOVER = 2000;
+    public static final int TYPE_SPOT_HOVER = PointerIconType.SPOT_HOVER;
 
     /** {@hide} Type constant: Spot touch icon for touchpads. */
-    public static final int TYPE_SPOT_TOUCH = 2001;
+    public static final int TYPE_SPOT_TOUCH = PointerIconType.SPOT_TOUCH;
 
     /** {@hide} Type constant: Spot anchor icon for touchpads. */
-    public static final int TYPE_SPOT_ANCHOR = 2002;
+    public static final int TYPE_SPOT_ANCHOR = PointerIconType.SPOT_ANCHOR;
 
     // Type constants for additional predefined icons for mice.
     /** Type constant: context-menu. */
-    public static final int TYPE_CONTEXT_MENU = 1001;
+    public static final int TYPE_CONTEXT_MENU = PointerIconType.CONTEXT_MENU;
 
     /** Type constant: hand. */
-    public static final int TYPE_HAND = 1002;
+    public static final int TYPE_HAND = PointerIconType.HAND;
 
     /** Type constant: help. */
-    public static final int TYPE_HELP = 1003;
+    public static final int TYPE_HELP = PointerIconType.HELP;
 
     /** Type constant: wait. */
-    public static final int TYPE_WAIT = 1004;
+    public static final int TYPE_WAIT = PointerIconType.WAIT;
 
     /** Type constant: cell. */
-    public static final int TYPE_CELL = 1006;
+    public static final int TYPE_CELL = PointerIconType.CELL;
 
     /** Type constant: crosshair. */
-    public static final int TYPE_CROSSHAIR = 1007;
+    public static final int TYPE_CROSSHAIR = PointerIconType.CROSSHAIR;
 
     /** Type constant: text. */
-    public static final int TYPE_TEXT = 1008;
+    public static final int TYPE_TEXT = PointerIconType.TEXT;
 
     /** Type constant: vertical-text. */
-    public static final int TYPE_VERTICAL_TEXT = 1009;
+    public static final int TYPE_VERTICAL_TEXT = PointerIconType.VERTICAL_TEXT;
 
     /** Type constant: alias (indicating an alias of/shortcut to something is
       * to be created. */
-    public static final int TYPE_ALIAS = 1010;
+    public static final int TYPE_ALIAS = PointerIconType.ALIAS;
 
     /** Type constant: copy. */
-    public static final int TYPE_COPY = 1011;
+    public static final int TYPE_COPY = PointerIconType.COPY;
 
     /** Type constant: no-drop. */
-    public static final int TYPE_NO_DROP = 1012;
+    public static final int TYPE_NO_DROP = PointerIconType.NO_DROP;
 
     /** Type constant: all-scroll. */
-    public static final int TYPE_ALL_SCROLL = 1013;
+    public static final int TYPE_ALL_SCROLL = PointerIconType.ALL_SCROLL;
 
     /** Type constant: horizontal double arrow mainly for resizing. */
-    public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014;
+    public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = PointerIconType.HORIZONTAL_DOUBLE_ARROW;
 
     /** Type constant: vertical double arrow mainly for resizing. */
-    public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015;
+    public static final int TYPE_VERTICAL_DOUBLE_ARROW = PointerIconType.VERTICAL_DOUBLE_ARROW;
 
     /** Type constant: diagonal double arrow -- top-right to bottom-left. */
     public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016;
@@ -128,19 +132,19 @@
     public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017;
 
     /** Type constant: zoom-in. */
-    public static final int TYPE_ZOOM_IN = 1018;
+    public static final int TYPE_ZOOM_IN = PointerIconType.ZOOM_IN;
 
     /** Type constant: zoom-out. */
-    public static final int TYPE_ZOOM_OUT = 1019;
+    public static final int TYPE_ZOOM_OUT = PointerIconType.ZOOM_OUT;
 
     /** Type constant: grab. */
-    public static final int TYPE_GRAB = 1020;
+    public static final int TYPE_GRAB = PointerIconType.GRAB;
 
     /** Type constant: grabbing. */
-    public static final int TYPE_GRABBING = 1021;
+    public static final int TYPE_GRABBING = PointerIconType.GRABBING;
 
     /** Type constant: handwriting. */
-    public static final int TYPE_HANDWRITING = 1022;
+    public static final int TYPE_HANDWRITING = PointerIconType.HANDWRITING;
 
     // OEM private types should be defined starting at this range to avoid
     // conflicts with any system types that may be defined in the future.
@@ -636,4 +640,15 @@
             default: return Integer.toString(type);
         }
     }
+
+    /**
+     * Sets whether drop shadow will draw in the native code.
+     *
+     * @hide
+     */
+    @TestApi
+    @FlaggedApi(Flags.FLAG_ENABLE_VECTOR_CURSORS)
+    public void setDrawNativeDropShadow(boolean drawNativeDropShadow) {
+        mDrawNativeDropShadow = drawNativeDropShadow;
+    }
 }
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 6c6e8b2..188ad8f 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -203,9 +203,7 @@
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
     @IntDef(prefix = {"FRAME_RATE_COMPATIBILITY_"},
-            value = {FRAME_RATE_COMPATIBILITY_DEFAULT, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
-                    FRAME_RATE_COMPATIBILITY_EXACT, FRAME_RATE_COMPATIBILITY_NO_VOTE,
-                    FRAME_RATE_COMPATIBILITY_MIN, FRAME_RATE_COMPATIBILITY_GTE})
+            value = {FRAME_RATE_COMPATIBILITY_DEFAULT, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE})
     public @interface FrameRateCompatibility {}
 
     // From native_window.h. Keep these in sync.
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 4f5b51d..1cd7d34 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -1272,7 +1272,7 @@
      * surface has no buffer or crop, the surface is boundless and only constrained
      * by the size of its parent bounds.
      *
-     * @param session  The surface session, must not be null.
+     * @param session  The surface session.
      * @param name     The surface name, must not be null.
      * @param w        The surface initial width.
      * @param h        The surface initial height.
@@ -2099,6 +2099,65 @@
         }
     }
 
+    /**
+     * Contains information of the idle time of the screen after which the refresh rate is to be
+     * reduced.
+     *
+     * @hide
+     */
+    public static final class IdleScreenRefreshRateConfig {
+        /**
+         *  The time(in ms) after which the refresh rate is to be reduced. Defaults to -1, which
+         *  means no timeout has been configured for the current conditions
+         */
+        public int timeoutMillis;
+
+        public IdleScreenRefreshRateConfig() {
+            timeoutMillis = -1;
+        }
+
+        public IdleScreenRefreshRateConfig(int timeoutMillis) {
+            this.timeoutMillis = timeoutMillis;
+        }
+
+        /**
+         * Checks whether the two objects have the same values.
+         */
+        @Override
+        public boolean equals(Object other) {
+            if (other == this) {
+                return true;
+            }
+
+            if (!(other instanceof IdleScreenRefreshRateConfig) || other == null) {
+                return false;
+            }
+
+            IdleScreenRefreshRateConfig
+                    idleScreenRefreshRateConfig = (IdleScreenRefreshRateConfig) other;
+            return timeoutMillis == idleScreenRefreshRateConfig.timeoutMillis;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(timeoutMillis);
+        }
+
+        @Override
+        public String toString() {
+            return "timeoutMillis: " + timeoutMillis;
+        }
+
+        /**
+         * Copies the supplied object's values to this object.
+         */
+        public void copyFrom(IdleScreenRefreshRateConfig other) {
+            if (other != null) {
+                this.timeoutMillis = other.timeoutMillis;
+            }
+        }
+    }
+
 
     /**
      * Contains information about desired display configuration.
@@ -2132,6 +2191,15 @@
          */
         public final RefreshRateRanges appRequestRanges;
 
+        /**
+         * Represents the idle time of the screen after which the associated display's refresh rate
+         * is to be reduced to preserve power
+         * Defaults to null, meaning that the device is not configured to have a timeout.
+         * Timeout value of -1 refers that the current conditions require no timeout
+         */
+        @Nullable
+        public IdleScreenRefreshRateConfig idleScreenRefreshRateConfig;
+
         public DesiredDisplayModeSpecs() {
             this.primaryRanges = new RefreshRateRanges();
             this.appRequestRanges = new RefreshRateRanges();
@@ -2144,13 +2212,17 @@
         }
 
         public DesiredDisplayModeSpecs(int defaultMode, boolean allowGroupSwitching,
-                RefreshRateRanges primaryRanges, RefreshRateRanges appRequestRanges) {
+                RefreshRateRanges primaryRanges, RefreshRateRanges appRequestRanges,
+                @Nullable IdleScreenRefreshRateConfig idleScreenRefreshRateConfig) {
             this.defaultMode = defaultMode;
             this.allowGroupSwitching = allowGroupSwitching;
             this.primaryRanges =
                     new RefreshRateRanges(primaryRanges.physical, primaryRanges.render);
             this.appRequestRanges =
                     new RefreshRateRanges(appRequestRanges.physical, appRequestRanges.render);
+            this.idleScreenRefreshRateConfig =
+                    (idleScreenRefreshRateConfig == null) ? null : new IdleScreenRefreshRateConfig(
+                            idleScreenRefreshRateConfig.timeoutMillis);
         }
 
         @Override
@@ -2165,7 +2237,9 @@
             return other != null && defaultMode == other.defaultMode
                     && allowGroupSwitching == other.allowGroupSwitching
                     && primaryRanges.equals(other.primaryRanges)
-                    && appRequestRanges.equals(other.appRequestRanges);
+                    && appRequestRanges.equals(other.appRequestRanges)
+                    && Objects.equals(
+                    idleScreenRefreshRateConfig, other.idleScreenRefreshRateConfig);
         }
 
         @Override
@@ -2181,6 +2255,7 @@
             allowGroupSwitching = other.allowGroupSwitching;
             primaryRanges.copyFrom(other.primaryRanges);
             appRequestRanges.copyFrom(other.appRequestRanges);
+            copyIdleScreenRefreshRateConfig(other.idleScreenRefreshRateConfig);
         }
 
         @Override
@@ -2188,7 +2263,21 @@
             return "defaultMode=" + defaultMode
                     + " allowGroupSwitching=" + allowGroupSwitching
                     + " primaryRanges=" + primaryRanges
-                    + " appRequestRanges=" + appRequestRanges;
+                    + " appRequestRanges=" + appRequestRanges
+                    + " idleScreenRefreshRate=" + String.valueOf(idleScreenRefreshRateConfig);
+        }
+
+        private void copyIdleScreenRefreshRateConfig(IdleScreenRefreshRateConfig other) {
+            if (idleScreenRefreshRateConfig == null) {
+                if (other != null) {
+                    idleScreenRefreshRateConfig =
+                            new IdleScreenRefreshRateConfig(other.timeoutMillis);
+                }
+            } else if (other == null) {
+                idleScreenRefreshRateConfig = null;
+            } else {
+                idleScreenRefreshRateConfig.copyFrom(other);
+            }
         }
     }
 
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index c66abe8..5466bf5 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -889,11 +889,11 @@
      * @hide
      */
     @Override
-    protected int calculateFrameRateCategory(int width, int height) {
+    protected int calculateFrameRateCategory() {
         if (mMinusTwoFrameIntervalMillis > 15 && mMinusOneFrameIntervalMillis > 15) {
             return FRAME_RATE_CATEGORY_NORMAL;
         }
-        return super.calculateFrameRateCategory(width, height);
+        return super.calculateFrameRateCategory();
     }
 
     @UnsupportedAppUsage
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 0a9ac2f..eb7de93 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -40,6 +40,10 @@
 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.toolkitFrameRateBySizeReadOnly;
+import static android.view.flags.Flags.toolkitFrameRateDefaultNormalReadOnly;
+import static android.view.flags.Flags.toolkitFrameRateSmallUsesPercentReadOnly;
+import static android.view.flags.Flags.toolkitFrameRateViewEnablingReadOnly;
 import static android.view.flags.Flags.toolkitMetricsForFrameRateDecision;
 import static android.view.flags.Flags.toolkitSetFrameRateReadOnly;
 import static android.view.flags.Flags.viewVelocityApi;
@@ -222,6 +226,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
@@ -2429,6 +2434,16 @@
      */
     protected static boolean sToolkitSetFrameRateReadOnlyFlagValue;
     private static boolean sToolkitMetricsForFrameRateDecisionFlagValue;
+    private static final boolean sToolkitFrameRateDefaultNormalReadOnlyFlagValue =
+            toolkitFrameRateDefaultNormalReadOnly();
+    private static final boolean sToolkitFrameRateBySizeReadOnlyFlagValue =
+            toolkitFrameRateBySizeReadOnly();
+
+    private static final boolean sToolkitFrameRateSmallUsesPercentReadOnlyFlagValue =
+            toolkitFrameRateSmallUsesPercentReadOnly();
+    private static final boolean sToolkitFrameRateViewEnablingReadOnlyFlagValue =
+            toolkitFrameRateViewEnablingReadOnly();
+
     // Used to set frame rate compatibility.
     @Surface.FrameRateCompatibility int mFrameRateCompatibility =
             FRAME_RATE_COMPATIBILITY_FIXED_SOURCE;
@@ -3320,16 +3335,17 @@
     public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0x00000000;
 
     /**
-     * Live region mode specifying that accessibility services should announce
-     * changes to this view.
+     * Live region mode specifying that accessibility services should notify users of changes to
+     * this view.
      * <p>
      * Use with {@link #setAccessibilityLiveRegion(int)}.
      */
     public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 0x00000001;
 
     /**
-     * Live region mode specifying that accessibility services should interrupt
-     * ongoing speech to immediately announce changes to this view.
+     * Live region mode specifying that accessibility services should immediately notify users of
+     * changes to this view. For example, a screen reader may interrupt ongoing speech to
+     * immediately announce these changes.
      * <p>
      * Use with {@link #setAccessibilityLiveRegion(int)}.
      */
@@ -3762,6 +3778,8 @@
      *         1                        PFLAG4_ROTARY_HAPTICS_WAITING_FOR_SCROLL_EVENT
      *       11                         PFLAG4_CONTENT_SENSITIVITY_MASK
      *      1                           PFLAG4_IS_COUNTED_AS_SENSITIVE
+     *     1                            PFLAG4_HAS_DRAWN
+     *    1                             PFLAG4_HAS_MOVED
      * |-------|-------|-------|-------|
      */
 
@@ -3894,6 +3912,19 @@
      * @see AttachInfo#mSensitiveViewsCount
      */
     private static final int PFLAG4_IS_COUNTED_AS_SENSITIVE = 0x4000000;
+
+    /**
+     * Whether this view has been drawn once with updateDisplayListIfDirty() or not.
+     * Used by VRR to for quick detection of scrolling.
+     */
+    private static final int PFLAG4_HAS_DRAWN = 0x8000000;
+
+    /**
+     * Whether this view has been moved with either setTranslationX/Y or setLeft/Top.
+     * Used by VRR to for quick detection of scrolling.
+     */
+    private static final int PFLAG4_HAS_MOVED = 0x10000000;
+
     /* End of masks for mPrivateFlags4 */
 
     /** @hide */
@@ -5693,19 +5724,22 @@
     private ViewTranslationResponse mViewTranslationResponse;
 
     /**
-     * Threshold size for something to be considered a small area update (in DP).
-     * This is the dimension for both width and height.
+     * The size in DP that is considered small for VRR purposes, if square.
      */
-    private static final float FRAME_RATE_SMALL_SIZE_THRESHOLD = 40f;
+    private static final float FRAME_RATE_SQUARE_SMALL_SIZE_DP = 40f;
 
     /**
-     * Threshold size for something to be considered a small area update (in DP) if
-     * it is narrow. This is for either width OR height. For example, a narrow progress
-     * bar could be considered a small area.
+     * The size in DP that is considered small for VRR purposes in the narrow dimension. Used for
+     * narrow Views like a progress bar.
      */
-    private static final float FRAME_RATE_NARROW_THRESHOLD = 10f;
+    private static final float FRAME_RATE_NARROW_SIZE_DP = 10f;
 
-    private static final long INFREQUENT_UPDATE_INTERVAL_MILLIS = 100;
+    /**
+     * A threshold value to determine the frame rate category of the View based on the size.
+     */
+    private static final float FRAME_RATE_SIZE_PERCENTAGE_THRESHOLD = 0.07f;
+
+    private static final int INFREQUENT_UPDATE_INTERVAL_MILLIS = 100;
     private static final int INFREQUENT_UPDATE_COUNTS = 2;
 
     // The preferred frame rate of the view that is mainly used for
@@ -5717,16 +5751,13 @@
     /**
      * @hide
      */
-    protected long mMinusOneFrameIntervalMillis = 0;
+    protected int mMinusOneFrameIntervalMillis = 0;
     /**
      * @hide
      */
-    protected long mMinusTwoFrameIntervalMillis = 0;
+    protected int mMinusTwoFrameIntervalMillis = 0;
     private int mLastFrameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE;
 
-    private float mLastFrameX = Float.NaN;
-    private float mLastFrameY = Float.NaN;
-
     @FlaggedApi(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
     public static final float REQUESTED_FRAME_RATE_CATEGORY_DEFAULT = Float.NaN;
     @FlaggedApi(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
@@ -5738,6 +5769,8 @@
     @FlaggedApi(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
     public static final float REQUESTED_FRAME_RATE_CATEGORY_HIGH = -4;
 
+    private int mSizeBasedFrameRateCategoryAndReason;
+
     /**
      * Simple constructor to use when creating a view from code.
      *
@@ -8766,14 +8799,17 @@
      *
      * <p>
      * When transitioning from one Activity to another, instead of using
-     * setAccessibilityPaneTitle(), set a descriptive title for its window by using android:label
-     * for the matching <activity> entry in your application’s manifest or updating the title at
-     * runtime with{@link android.app.Activity#setTitle(CharSequence)}.
+     * {@code setAccessibilityPaneTitle()}, set a descriptive title for its window by using
+     * {@code android:label}
+     * for the matching Activity entry in your application's manifest or updating the title at
+     * runtime with {@link android.app.Activity#setTitle(CharSequence)}.
      *
      * <p>
+     * <aside>
      * <b>Note:</b> Use
      * {@link androidx.core.view.ViewCompat#setAccessibilityPaneTitle(View, CharSequence)}
-     * for backwards-compatibility. </aside>
+     * for backwards-compatibility.
+     * </aside>
      * @param accessibilityPaneTitle The pane's title. Setting to {@code null} indicates that this
      *                               View is not a pane.
      *
@@ -8881,7 +8917,7 @@
      * They should not need to specify what exactly is announced to users.
      *
      * <p>
-     * In general, only announce transitions and don’t generate a confirmation message for simple
+     * In general, only announce transitions and don't generate a confirmation message for simple
      * actions like a button press. Label your controls concisely and precisely instead, and for
      * significant UI changes like window changes, use
      * {@link android.app.Activity#setTitle(CharSequence)} and
@@ -15274,33 +15310,56 @@
      * to the view's content description or text, or to the content descriptions
      * or text of the view's children (where applicable).
      * <p>
-     * To indicate that the user should be notified of changes, use
-     * {@link #ACCESSIBILITY_LIVE_REGION_POLITE}. Announcements from this region are queued and
-     * do not disrupt ongoing speech.
+     * Different priority levels are available:
+     * <ul>
+     *   <li>
+     *       {@link #ACCESSIBILITY_LIVE_REGION_POLITE}:
+     *       Indicates that updates to the region should be presented to the user. Suitable in most
+     *       cases for prominent updates within app content that don't require the user's immediate
+     *       attention.
+     *   </li>
+     *   <li>
+     *       {@link #ACCESSIBILITY_LIVE_REGION_ASSERTIVE}: Indicates that updates to the region have
+     *       the highest priority and should be presented to the user immediately. This may result
+     *       in disruptive notifications from an accessibility service, which may potentially
+     *       interrupt other feedback or user actions, so it should generally be used only for
+     *       critical, time-sensitive information.
+     *   </li>
+     *   <li>
+     *       {@link #ACCESSIBILITY_LIVE_REGION_NONE}: Disables change announcements (the default for
+     *       most views).
+     *   </li>
+     * </ul>
      * <p>
-     * For example, selecting an option in a dropdown menu may update a panel below with the updated
-     * content. This panel may be marked as a live region with
-     * {@link #ACCESSIBILITY_LIVE_REGION_POLITE} to notify users of the change.
+     * Examples:
+     * <ul>
+     *     <li>
+     *         Selecting an option in a dropdown menu updates a panel below with the updated
+     *         content. This panel may be marked as a live region with
+     *         {@link #ACCESSIBILITY_LIVE_REGION_POLITE} to notify users of the change. A screen
+     *         reader may queue changes as announcements that don't disrupt ongoing speech.
+     *      </li>
+     *      <li>
+     *          An emergency alert may be marked with {@link #ACCESSIBILITY_LIVE_REGION_ASSERTIVE}
+     *          to immediately inform users of the emergency.
+     *      </li>
+     * </ul>
      * <p>
-     * For notifying users about errors, such as in a login screen with text that displays an
-     * "incorrect password" notification, that view should send an AccessibilityEvent of type
+     * For error notifications, like an "incorrect password" warning in a login screen, views
+     * should send a {@link AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED}
+     * {@code AccessibilityEvent} with a content change type
      * {@link AccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR} and set
-     * {@link AccessibilityNodeInfo#setError(CharSequence)} instead. Custom widgets should expose
-     * error-setting methods that support accessibility automatically. For example, instead of
-     * explicitly sending this event when using a TextView, use
-     * {@link android.widget.TextView#setError(CharSequence)}.
+     * {@link AccessibilityNodeInfo#setError(CharSequence)}. Custom widgets should provide
+     * error-setting methods that support accessibility. For example, use
+     * {@link android.widget.TextView#setError(CharSequence)} instead of explicitly sending events.
      * <p>
-     * To disable change notifications for this view, use
-     * {@link #ACCESSIBILITY_LIVE_REGION_NONE}. This is the default live region
-     * mode for most views.
+     * Don't use live regions for frequently-updating UI elements (e.g., progress bars), as this can
+     * overwhelm the user with feedback from accessibility services. If necessary, use
+     * {@link AccessibilityNodeInfo#setMinDurationBetweenContentChanges(Duration)} to throttle
+     * feedback and reduce disruptions.
      * <p>
-     * If the view's changes should interrupt ongoing speech and notify the user
-     * immediately, use {@link #ACCESSIBILITY_LIVE_REGION_ASSERTIVE}. This may result in disruptive
-     * announcements from an accessibility service, so it should generally be used only to convey
-     * information that is time-sensitive or critical for use of the application. Examples may
-     * include an incoming call or an emergency alert.
-     * <p>
-     * <b>Note:</b> Use {@link androidx.core.view.ViewCompat#setAccessibilityLiveRegion(View, int)}
+     * <aside><b>Note:</b> Use
+     * {@link androidx.core.view.ViewCompat#setAccessibilityLiveRegion(View, int)}
      * for backwards-compatibility. </aside>
      *
      * @param mode The live region mode for this view, one of:
@@ -19423,6 +19482,7 @@
      */
     public final void setTop(int top) {
         if (top != mTop) {
+            mPrivateFlags4 |= PFLAG4_HAS_MOVED;
             final boolean matrixIsIdentity = hasIdentityMatrix();
             if (matrixIsIdentity) {
                 if (mAttachInfo != null) {
@@ -19547,6 +19607,7 @@
      */
     public final void setLeft(int left) {
         if (left != mLeft) {
+            mPrivateFlags4 |= PFLAG4_HAS_MOVED;
             final boolean matrixIsIdentity = hasIdentityMatrix();
             if (matrixIsIdentity) {
                 if (mAttachInfo != null) {
@@ -19803,6 +19864,7 @@
     @RemotableViewMethod
     public void setTranslationX(float translationX) {
         if (translationX != getTranslationX()) {
+            mPrivateFlags4 |= PFLAG4_HAS_MOVED;
             invalidateViewProperty(true, false);
             mRenderNode.setTranslationX(translationX);
             invalidateViewProperty(false, true);
@@ -19839,6 +19901,7 @@
     @RemotableViewMethod
     public void setTranslationY(float translationY) {
         if (translationY != getTranslationY()) {
+            mPrivateFlags4 |= PFLAG4_HAS_MOVED;
             invalidateViewProperty(true, false);
             mRenderNode.setTranslationY(translationY);
             invalidateViewProperty(false, true);
@@ -20311,6 +20374,7 @@
      */
     public void offsetTopAndBottom(int offset) {
         if (offset != 0) {
+            mPrivateFlags4 |= PFLAG4_HAS_MOVED;
             final boolean matrixIsIdentity = hasIdentityMatrix();
             if (matrixIsIdentity) {
                 if (isHardwareAccelerated()) {
@@ -20362,6 +20426,7 @@
      */
     public void offsetLeftAndRight(int offset) {
         if (offset != 0) {
+            mPrivateFlags4 |= PFLAG4_HAS_MOVED;
             final boolean matrixIsIdentity = hasIdentityMatrix();
             if (matrixIsIdentity) {
                 if (isHardwareAccelerated()) {
@@ -20760,8 +20825,8 @@
         }
 
         // For VRR to vote the preferred frame rate
-        if (sToolkitSetFrameRateReadOnlyFlagValue) {
-            updateInfrequentCount();
+        if (sToolkitSetFrameRateReadOnlyFlagValue
+                && sToolkitFrameRateViewEnablingReadOnlyFlagValue) {
             votePreferredFrameRate();
         }
 
@@ -20868,8 +20933,8 @@
     protected void damageInParent() {
         if (mParent != null && mAttachInfo != null) {
             // For VRR to vote the preferred frame rate
-            if (sToolkitSetFrameRateReadOnlyFlagValue) {
-                updateInfrequentCount();
+            if (sToolkitSetFrameRateReadOnlyFlagValue
+                    && sToolkitFrameRateViewEnablingReadOnlyFlagValue) {
                 votePreferredFrameRate();
             }
             mParent.onDescendantInvalidated(this, this);
@@ -23559,6 +23624,12 @@
             return renderNode;
         }
 
+        mPrivateFlags4 = (mPrivateFlags4 & ~PFLAG4_HAS_MOVED) | PFLAG4_HAS_DRAWN;
+        if (sToolkitSetFrameRateReadOnlyFlagValue
+                && sToolkitFrameRateViewEnablingReadOnlyFlagValue) {
+            updateInfrequentCount();
+        }
+
         if ((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0
                 || !renderNode.hasDisplayList()
                 || (mRecreateDisplayList)) {
@@ -24722,8 +24793,6 @@
         mPrivateFlags = (privateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DRAWN;
 
         mFrameContentVelocity = -1;
-        mLastFrameX = mLeft + mRenderNode.getTranslationX();
-        mLastFrameY = mTop + mRenderNode.getTranslationY();
 
         /*
          * Draw traversal performs several drawing steps which must be executed
@@ -25400,6 +25469,7 @@
         }
 
         if (mLeft != left || mRight != right || mTop != top || mBottom != bottom) {
+            mPrivateFlags4 |= PFLAG4_HAS_MOVED;
             changed = true;
 
             // Remember our drawn bit
@@ -25472,6 +25542,30 @@
     }
 
     private void sizeChange(int newWidth, int newHeight, int oldWidth, int oldHeight) {
+        if (mAttachInfo != null && sToolkitFrameRateViewEnablingReadOnlyFlagValue) {
+            boolean isSmall;
+            if (sToolkitFrameRateSmallUsesPercentReadOnlyFlagValue) {
+                int size = newWidth * newHeight;
+                float percent = size / mAttachInfo.mDisplayPixelCount;
+                isSmall = percent <= FRAME_RATE_SIZE_PERCENTAGE_THRESHOLD;
+            } else {
+                float density = mAttachInfo.mDensity;
+                int narrowSize = (int) (density * FRAME_RATE_NARROW_SIZE_DP);
+                int smallSize = (int) (density * FRAME_RATE_SQUARE_SMALL_SIZE_DP);
+                isSmall = newWidth <= narrowSize || newHeight <= narrowSize
+                        || (newWidth <= smallSize && newHeight <= smallSize);
+            }
+            if (isSmall) {
+                int category = sToolkitFrameRateBySizeReadOnlyFlagValue
+                        ? FRAME_RATE_CATEGORY_LOW : FRAME_RATE_CATEGORY_NORMAL;
+                mSizeBasedFrameRateCategoryAndReason = category | FRAME_RATE_CATEGORY_REASON_SMALL;
+            } else {
+                int category = sToolkitFrameRateDefaultNormalReadOnlyFlagValue
+                        ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
+                mSizeBasedFrameRateCategoryAndReason = category | FRAME_RATE_CATEGORY_REASON_LARGE;
+            }
+        }
+
         onSizeChanged(newWidth, newHeight, oldWidth, oldHeight);
         if (mOverlay != null) {
             mOverlay.getOverlayView().setRight(newWidth);
@@ -32038,6 +32132,21 @@
         int mSensitiveViewsCount;
 
         /**
+         * The value of viewVelocityApi(), read only once per ViewRootImpl
+         */
+        final boolean mViewVelocityApi = viewVelocityApi();
+
+        /**
+         * Density so that it doesn't need to be retrieved on every invalidation.
+         */
+        final float mDensity;
+
+        /**
+         * The number of pixels in the display (width * height).
+         */
+        final float mDisplayPixelCount;
+
+        /**
          * Creates a new set of attachment information with the specified
          * events handler and thread.
          *
@@ -32054,6 +32163,10 @@
             mHandler = handler;
             mRootCallbacks = effectPlayer;
             mTreeObserver = new ViewTreeObserver(context);
+            DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
+            mDensity = displayMetrics.density;
+            float pixelCount = (float) displayMetrics.widthPixels * displayMetrics.heightPixels;
+            mDisplayPixelCount = pixelCount == 0f ? Float.POSITIVE_INFINITY : pixelCount;
         }
 
         void increaseSensitiveViewsCount() {
@@ -33758,48 +33871,15 @@
         return null;
     }
 
-    private float getSizePercentage() {
-        float alpha = mTransformationInfo != null ? mTransformationInfo.mAlpha : 1;
-        int visibility = mViewFlags & VISIBILITY_MASK;
-
-        if (mResources == null || alpha == 0 || visibility != VISIBLE) {
-            return 0;
-        }
-
-        DisplayMetrics displayMetrics = mResources.getDisplayMetrics();
-        int screenSize = displayMetrics.widthPixels
-                * displayMetrics.heightPixels;
-        int viewSize = getWidth() * getHeight();
-
-        if (screenSize == 0 || viewSize == 0) {
-            return 0f;
-        }
-        return (float) viewSize / screenSize;
-    }
-
     /**
      * Used to calculate the frame rate category of a View.
      *
      * @hide
      */
-    protected int calculateFrameRateCategory(int width, int height) {
+    protected int calculateFrameRateCategory() {
         if (mMinusTwoFrameIntervalMillis + mMinusOneFrameIntervalMillis
                 < INFREQUENT_UPDATE_INTERVAL_MILLIS) {
-            DisplayMetrics displayMetrics = mResources.getDisplayMetrics();
-            float density = displayMetrics.density;
-            if (density == 0f) {
-                density = 1f;
-            }
-            float widthDp = width / density;
-            float heightDp = height / density;
-            if (widthDp <= FRAME_RATE_NARROW_THRESHOLD
-                    || heightDp <= FRAME_RATE_NARROW_THRESHOLD
-                    || (widthDp <= FRAME_RATE_SMALL_SIZE_THRESHOLD
-                    && heightDp <= FRAME_RATE_SMALL_SIZE_THRESHOLD)) {
-                return FRAME_RATE_CATEGORY_NORMAL | FRAME_RATE_CATEGORY_REASON_SMALL;
-            } else {
-                return FRAME_RATE_CATEGORY_HIGH | FRAME_RATE_CATEGORY_REASON_LARGE;
-            }
+            return mSizeBasedFrameRateCategoryAndReason;
         }
 
         if (mInfrequentUpdateCount == INFREQUENT_UPDATE_COUNTS) {
@@ -33813,11 +33893,19 @@
         ViewRootImpl viewRootImpl = getViewRootImpl();
         int width = mRight - mLeft;
         int height = mBottom - mTop;
-        if (viewRootImpl != null && (width != 0 && height != 0)) {
-            if (viewVelocityApi()) {
+        float alpha = mTransformationInfo != null ? mTransformationInfo.mAlpha : 1;
+        int visibility = mViewFlags & VISIBILITY_MASK;
+
+        if (viewRootImpl != null && (width != 0 && height != 0)
+                && alpha != 0 && visibility == View.VISIBLE
+        ) {
+            if (mAttachInfo.mViewVelocityApi) {
                 float velocity = mFrameContentVelocity;
-                if (velocity < 0f) {
-                    velocity = calculateVelocity();
+                int mask = PFLAG4_HAS_MOVED | PFLAG4_HAS_DRAWN;
+                if (velocity < 0f && (mPrivateFlags4 & mask) == mask) {
+                    // This current calculation is very simple. If something on the screen moved,
+                    // then it votes for the highest velocity. If it doesn't move, then return 0.
+                    velocity = Float.POSITIVE_INFINITY;
                 }
                 if (velocity > 0f) {
                     float frameRate = convertVelocityToFrameRate(velocity);
@@ -33825,61 +33913,58 @@
                     return;
                 }
             }
-            if (sToolkitMetricsForFrameRateDecisionFlagValue) {
-                float sizePercentage = getSizePercentage();
-                viewRootImpl.recordViewPercentage(sizePercentage);
-            }
-            int frameRateCategory;
-            if (Float.isNaN(mPreferredFrameRate)) {
-                frameRateCategory = calculateFrameRateCategory(width, height);
-            } else if (mPreferredFrameRate < 0) {
-                if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE) {
-                    frameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE
-                            | FRAME_RATE_CATEGORY_REASON_REQUESTED;
-                } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_LOW) {
-                    frameRateCategory = FRAME_RATE_CATEGORY_LOW
-                            | FRAME_RATE_CATEGORY_REASON_REQUESTED;
-                } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_NORMAL) {
-                    frameRateCategory = FRAME_RATE_CATEGORY_NORMAL
-                            | FRAME_RATE_CATEGORY_REASON_REQUESTED;
-                } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_HIGH) {
-                    frameRateCategory = FRAME_RATE_CATEGORY_HIGH
-                            | FRAME_RATE_CATEGORY_REASON_REQUESTED;
-                } else {
-                    // invalid frame rate, default to HIGH
-                    frameRateCategory = FRAME_RATE_CATEGORY_HIGH
-                            | FRAME_RATE_CATEGORY_REASON_INVALID;
+            if (!willNotDraw()) {
+                if (sToolkitMetricsForFrameRateDecisionFlagValue) {
+                    float sizePercentage = width * height / mAttachInfo.mDisplayPixelCount;
+                    viewRootImpl.recordViewPercentage(sizePercentage);
                 }
-            } else {
-                viewRootImpl.votePreferredFrameRate(mPreferredFrameRate,
-                        mFrameRateCompatibility);
-                return;
-            }
 
-            int category = frameRateCategory & ~FRAME_RATE_CATEGORY_REASON_MASK;
-            int reason = frameRateCategory & FRAME_RATE_CATEGORY_REASON_MASK;
-            viewRootImpl.votePreferredFrameRateCategory(category, reason, this);
-            mLastFrameRateCategory = frameRateCategory;
+                int frameRateCategory;
+                if (Float.isNaN(mPreferredFrameRate)) {
+                    frameRateCategory = calculateFrameRateCategory();
+                } else if (mPreferredFrameRate < 0) {
+                    switch ((int) mPreferredFrameRate) {
+                        case (int) REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE ->
+                                frameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE
+                                        | FRAME_RATE_CATEGORY_REASON_REQUESTED;
+                        case (int) REQUESTED_FRAME_RATE_CATEGORY_LOW ->
+                                frameRateCategory = FRAME_RATE_CATEGORY_LOW
+                                        | FRAME_RATE_CATEGORY_REASON_REQUESTED;
+                        case (int) REQUESTED_FRAME_RATE_CATEGORY_NORMAL ->
+                                frameRateCategory = FRAME_RATE_CATEGORY_NORMAL
+                                        | FRAME_RATE_CATEGORY_REASON_REQUESTED;
+                        case (int) REQUESTED_FRAME_RATE_CATEGORY_HIGH ->
+                                frameRateCategory = FRAME_RATE_CATEGORY_HIGH
+                                        | FRAME_RATE_CATEGORY_REASON_REQUESTED;
+                        default -> {
+                            // invalid frame rate, use default
+                            int category = sToolkitFrameRateDefaultNormalReadOnlyFlagValue
+                                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
+                            frameRateCategory = category
+                                    | FRAME_RATE_CATEGORY_REASON_INVALID;
+                        }
+                    }
+                } else {
+                    viewRootImpl.votePreferredFrameRate(mPreferredFrameRate,
+                            mFrameRateCompatibility);
+                    return;
+                }
+
+                int category = frameRateCategory & ~FRAME_RATE_CATEGORY_REASON_MASK;
+                int reason = frameRateCategory & FRAME_RATE_CATEGORY_REASON_MASK;
+                viewRootImpl.votePreferredFrameRateCategory(category, reason, this);
+                mLastFrameRateCategory = frameRateCategory;
+            }
         }
     }
 
     private float convertVelocityToFrameRate(float velocityPps) {
-        float density = getResources().getDisplayMetrics().density;
+        float density = mAttachInfo.mDensity;
         float velocityDps = velocityPps / density;
         // Choose a frame rate in increments of 10fps
         return Math.min(140f, 60f + (10f * (float) Math.floor(velocityDps / 300f)));
     }
 
-    private float calculateVelocity() {
-        // This current calculation is very simple. If something on the screen moved, then
-        // it votes for the highest velocity. If it doesn't move, then return 0.
-        float x = mLeft + mRenderNode.getTranslationX();
-        float y = mTop + mRenderNode.getTranslationY();
-
-        return (!Float.isNaN(mLastFrameX) && (x != mLastFrameX || y != mLastFrameY))
-                ? 100_000f : 0f;
-    }
-
     /**
      * Set the current velocity of the View, we only track positive value.
      * We will use the velocity information to adjust the frame rate when applicable.
@@ -33962,20 +34047,23 @@
      * - otherwise, use the previous category value.
      */
     private void updateInfrequentCount() {
-        long currentTimeMillis = getDrawingTime();
-        long timeIntervalMillis = currentTimeMillis - mLastUpdateTimeMillis;
-        mMinusTwoFrameIntervalMillis = mMinusOneFrameIntervalMillis;
-        mMinusOneFrameIntervalMillis = timeIntervalMillis;
+        if (!willNotDraw()) {
+            long currentTimeMillis = getDrawingTime();
+            int timeIntervalMillis =
+                    (int) Math.min(Integer.MAX_VALUE, currentTimeMillis - mLastUpdateTimeMillis);
+            mMinusTwoFrameIntervalMillis = mMinusOneFrameIntervalMillis;
+            mMinusOneFrameIntervalMillis = timeIntervalMillis;
 
-        mLastUpdateTimeMillis = currentTimeMillis;
-        if (mMinusTwoFrameIntervalMillis >= 30 && timeIntervalMillis < 2) {
-            return;
-        }
-        if (timeIntervalMillis >= INFREQUENT_UPDATE_INTERVAL_MILLIS) {
-            mInfrequentUpdateCount = mInfrequentUpdateCount == INFREQUENT_UPDATE_COUNTS
+            mLastUpdateTimeMillis = currentTimeMillis;
+            if (mMinusTwoFrameIntervalMillis >= 30 && timeIntervalMillis < 2) {
+                return;
+            }
+            if (timeIntervalMillis >= INFREQUENT_UPDATE_INTERVAL_MILLIS) {
+                mInfrequentUpdateCount = mInfrequentUpdateCount == INFREQUENT_UPDATE_COUNTS
                         ? mInfrequentUpdateCount : mInfrequentUpdateCount + 1;
-        } else {
-            mInfrequentUpdateCount = 0;
+            } else {
+                mInfrequentUpdateCount = 0;
+            }
         }
     }
 }
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 3c61854..c5a4d67 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -34,13 +34,13 @@
 import static android.view.Surface.FRAME_RATE_CATEGORY_NO_PREFERENCE;
 import static android.view.Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE;
 import static android.view.Surface.FRAME_RATE_COMPATIBILITY_GTE;
-import static android.view.View.FRAME_RATE_CATEGORY_REASON_UNKNOWN;
 import static android.view.View.FRAME_RATE_CATEGORY_REASON_IDLE;
 import static android.view.View.FRAME_RATE_CATEGORY_REASON_INTERMITTENT;
 import static android.view.View.FRAME_RATE_CATEGORY_REASON_INVALID;
 import static android.view.View.FRAME_RATE_CATEGORY_REASON_LARGE;
 import static android.view.View.FRAME_RATE_CATEGORY_REASON_REQUESTED;
 import static android.view.View.FRAME_RATE_CATEGORY_REASON_SMALL;
+import static android.view.View.FRAME_RATE_CATEGORY_REASON_UNKNOWN;
 import static android.view.View.FRAME_RATE_CATEGORY_REASON_VELOCITY;
 import static android.view.View.PFLAG_DRAW_ANIMATION;
 import static android.view.View.SYSTEM_UI_FLAG_FULLSCREEN;
@@ -69,11 +69,10 @@
 import static android.view.ViewRootImplProto.WINDOW_ATTRIBUTES;
 import static android.view.ViewRootImplProto.WIN_FRAME;
 import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
-import static android.view.WindowInsetsController.COMPATIBLE_APPEARANCE_FLAGS;
-import static android.view.flags.Flags.sensitiveContentAppProtection;
 import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS;
 import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
 import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;
+import static android.view.WindowInsetsController.Appearance;
 import static android.view.WindowInsetsController.BEHAVIOR_DEFAULT;
 import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
 import static android.view.WindowLayout.UNSPECIFIED_LENGTH;
@@ -85,8 +84,6 @@
 import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
 import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
 import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_APPEARANCE_CONTROLLED;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_BEHAVIOR_CONTROLLED;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FIT_INSETS_CONTROLLED;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INSET_PARENT_FRAME_BY_IME;
@@ -104,16 +101,21 @@
 import static android.view.WindowManagerGlobal.RELAYOUT_RES_CANCEL_AND_REDRAW;
 import static android.view.WindowManagerGlobal.RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS;
 import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED;
-import static android.view.accessibility.Flags.fixMergedContentChangeEvent;
+import static android.view.accessibility.Flags.fixMergedContentChangeEventV2;
 import static android.view.accessibility.Flags.forceInvertColor;
 import static android.view.accessibility.Flags.reduceWindowContentChangedEventThrottle;
+import static android.view.flags.Flags.sensitiveContentAppProtection;
 import static android.view.flags.Flags.toolkitFrameRateTypingReadOnly;
+import static android.view.flags.Flags.toolkitFrameRateVelocityMappingReadOnly;
 import static android.view.flags.Flags.toolkitMetricsForFrameRateDecision;
 import static android.view.flags.Flags.toolkitSetFrameRateReadOnly;
+import static android.view.flags.Flags.toolkitFrameRateFunctionEnablingReadOnly;
+import static android.view.flags.Flags.toolkitFrameRateViewEnablingReadOnly;
 import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.IME_FOCUS_CONTROLLER;
 import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.INSETS_CONTROLLER;
 
 import static com.android.input.flags.Flags.enablePointerChoreographer;
+import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
 import static com.android.window.flags.Flags.activityWindowInfoFlag;
 import static com.android.window.flags.Flags.enableBufferTransformHintFromDisplay;
 import static com.android.window.flags.Flags.setScPropertiesInClient;
@@ -941,6 +943,7 @@
                     new InputEventConsistencyVerifier(this, 0) : null;
 
     private final InsetsController mInsetsController;
+    private final ImeBackAnimationController mImeBackAnimationController;
     private final ImeFocusController mImeFocusController;
 
     private boolean mIsSurfaceOpaque;
@@ -1066,11 +1069,6 @@
     // Used to check if there is a message in the message queue
     // for idleness handling.
     private boolean mHasIdledMessage = false;
-    // Used to allow developers to opt out Toolkit dVRR feature.
-    // This feature allows device to adjust refresh rate
-    // as needed and can be useful for power saving.
-    // Should not enable the dVRR feature if the value is false.
-    private boolean mIsFrameRatePowerSavingsBalanced = true;
     // Used to check if there is a conflict between different frame rate voting.
     // Take 24 and 30 as an example, 24 is not a divisor of 30.
     // We consider there is a conflict.
@@ -1153,13 +1151,21 @@
     private String mLargestViewTraceName;
 
     private static boolean sToolkitSetFrameRateReadOnlyFlagValue;
+    private static boolean sToolkitFrameRateFunctionEnablingReadOnlyFlagValue;
     private static boolean sToolkitMetricsForFrameRateDecisionFlagValue;
     private static boolean sToolkitFrameRateTypingReadOnlyFlagValue;
+    private static final boolean sToolkitFrameRateViewEnablingReadOnlyFlagValue;
+    private static boolean sToolkitFrameRateVelocityMappingReadOnlyFlagValue =
+            toolkitFrameRateVelocityMappingReadOnly();;
 
     static {
         sToolkitSetFrameRateReadOnlyFlagValue = toolkitSetFrameRateReadOnly();
         sToolkitMetricsForFrameRateDecisionFlagValue = toolkitMetricsForFrameRateDecision();
         sToolkitFrameRateTypingReadOnlyFlagValue = toolkitFrameRateTypingReadOnly();
+        sToolkitFrameRateFunctionEnablingReadOnlyFlagValue =
+                toolkitFrameRateFunctionEnablingReadOnly();
+        sToolkitFrameRateViewEnablingReadOnlyFlagValue =
+                toolkitFrameRateViewEnablingReadOnly();
     }
 
     // The latest input event from the gesture that was used to resolve the pointer icon.
@@ -1207,6 +1213,7 @@
         // TODO(b/222696368): remove getSfInstance usage and use vsyncId for transactions
         mChoreographer = Choreographer.getInstance();
         mInsetsController = new InsetsController(new ViewRootInsetsControllerHost(this));
+        mImeBackAnimationController = new ImeBackAnimationController(this);
         mHandwritingInitiator = new HandwritingInitiator(
                 mViewConfiguration,
                 mContext.getSystemService(InputMethodManager.class));
@@ -1517,7 +1524,9 @@
                     mOrigWindowType = mWindowAttributes.type;
                     mAttachInfo.mRecomputeGlobalAttributes = true;
                     collectViewAttributes();
-                    adjustLayoutParamsForCompatibility(mWindowAttributes);
+                    adjustLayoutParamsForCompatibility(mWindowAttributes,
+                            mInsetsController.getAppearanceControlled(),
+                            mInsetsController.isBehaviorControlled());
                     controlInsetsForCompatibility(mWindowAttributes);
 
                     Rect attachedFrame = new Rect();
@@ -2033,8 +2042,6 @@
             // Preserve appearance and behavior.
             final int appearance = mWindowAttributes.insetsFlags.appearance;
             final int behavior = mWindowAttributes.insetsFlags.behavior;
-            final int appearanceAndBehaviorPrivateFlags = mWindowAttributes.privateFlags
-                    & (PRIVATE_FLAG_APPEARANCE_CONTROLLED | PRIVATE_FLAG_BEHAVIOR_CONTROLLED);
 
             final int changes = mWindowAttributes.copyFrom(attrs);
             if ((changes & WindowManager.LayoutParams.TRANSLUCENT_FLAGS_CHANGED) != 0) {
@@ -2057,7 +2064,6 @@
             mWindowAttributes.subtreeSystemUiVisibility = subtreeSystemUiVisibility;
             mWindowAttributes.insetsFlags.appearance = appearance;
             mWindowAttributes.insetsFlags.behavior = behavior;
-            mWindowAttributes.privateFlags |= appearanceAndBehaviorPrivateFlags;
 
             if (mWindowAttributes.preservePreviousSurfaceInsets) {
                 // Restore old surface insets.
@@ -2622,8 +2628,10 @@
         // no longer needed if the dVRR feature is disabled.
         if (shouldEnableDvrr()) {
             try {
-                mFrameRateTransaction.setFrameRateSelectionStrategy(sc,
+                if (sToolkitFrameRateFunctionEnablingReadOnlyFlagValue) {
+                    mFrameRateTransaction.setFrameRateSelectionStrategy(sc,
                         sc.FRAME_RATE_SELECTION_STRATEGY_SELF).applyAsyncUnsafe();
+                }
             } catch (Exception e) {
                 Log.e(mTag, "Unable to set frame rate selection strategy ", e);
             }
@@ -2911,26 +2919,35 @@
     }
 
     @VisibleForTesting
-    public static void adjustLayoutParamsForCompatibility(WindowManager.LayoutParams inOutParams) {
+    public static void adjustLayoutParamsForCompatibility(WindowManager.LayoutParams inOutParams,
+            @Appearance int appearanceControlled, boolean behaviorControlled) {
         final int sysUiVis = inOutParams.systemUiVisibility | inOutParams.subtreeSystemUiVisibility;
         final int flags = inOutParams.flags;
         final int type = inOutParams.type;
         final int adjust = inOutParams.softInputMode & SOFT_INPUT_MASK_ADJUST;
 
-        if ((inOutParams.privateFlags & PRIVATE_FLAG_APPEARANCE_CONTROLLED) == 0) {
-            inOutParams.insetsFlags.appearance &= ~COMPATIBLE_APPEARANCE_FLAGS;
-            if ((sysUiVis & SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
-                inOutParams.insetsFlags.appearance |= APPEARANCE_LOW_PROFILE_BARS;
-            }
-            if ((sysUiVis & SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0) {
-                inOutParams.insetsFlags.appearance |= APPEARANCE_LIGHT_STATUS_BARS;
-            }
-            if ((sysUiVis & SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) != 0) {
-                inOutParams.insetsFlags.appearance |= APPEARANCE_LIGHT_NAVIGATION_BARS;
-            }
+        @Appearance int appearance = inOutParams.insetsFlags.appearance;
+        if ((appearanceControlled & APPEARANCE_LOW_PROFILE_BARS) == 0) {
+            appearance &= ~APPEARANCE_LOW_PROFILE_BARS;
+            appearance |= (sysUiVis & SYSTEM_UI_FLAG_LOW_PROFILE) != 0
+                    ? APPEARANCE_LOW_PROFILE_BARS
+                    : 0;
         }
+        if ((appearanceControlled & APPEARANCE_LIGHT_STATUS_BARS) == 0) {
+            appearance &= ~APPEARANCE_LIGHT_STATUS_BARS;
+            appearance |= (sysUiVis & SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0
+                    ? APPEARANCE_LIGHT_STATUS_BARS
+                    : 0;
+        }
+        if ((appearanceControlled & APPEARANCE_LIGHT_NAVIGATION_BARS) == 0) {
+            appearance &= ~APPEARANCE_LIGHT_NAVIGATION_BARS;
+            appearance |= (sysUiVis & SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) != 0
+                    ? APPEARANCE_LIGHT_NAVIGATION_BARS
+                    : 0;
+        }
+        inOutParams.insetsFlags.appearance = appearance;
 
-        if ((inOutParams.privateFlags & PRIVATE_FLAG_BEHAVIOR_CONTROLLED) == 0) {
+        if (!behaviorControlled) {
             if ((sysUiVis & SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0
                     || (flags & FLAG_FULLSCREEN) != 0) {
                 inOutParams.insetsFlags.behavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
@@ -3182,7 +3199,7 @@
                         == LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
     }
 
-    @VisibleForTesting
+    @VisibleForTesting(visibility = PACKAGE)
     public InsetsController getInsetsController() {
         return mInsetsController;
     }
@@ -3480,7 +3497,9 @@
                     && !PixelFormat.formatHasAlpha(params.format)) {
                 params.format = PixelFormat.TRANSLUCENT;
             }
-            adjustLayoutParamsForCompatibility(params);
+            adjustLayoutParamsForCompatibility(params,
+                    mInsetsController.getAppearanceControlled(),
+                    mInsetsController.isBehaviorControlled());
             controlInsetsForCompatibility(params);
             if (mDispatchedSystemBarAppearance != params.insetsFlags.appearance) {
                 mDispatchedSystemBarAppearance = params.insetsFlags.appearance;
@@ -6365,6 +6384,12 @@
                     return "MSG_KEEP_CLEAR_RECTS_CHANGED";
                 case MSG_REFRESH_POINTER_ICON:
                     return "MSG_REFRESH_POINTER_ICON";
+                case MSG_TOUCH_BOOST_TIMEOUT:
+                    return "MSG_TOUCH_BOOST_TIMEOUT";
+                case MSG_CHECK_INVALIDATION_IDLE:
+                    return "MSG_CHECK_INVALIDATION_IDLE";
+                case MSG_FRAME_RATE_SETTING:
+                    return "MSG_FRAME_RATE_SETTING";
             }
             return super.getMessageName(message);
         }
@@ -6569,10 +6594,15 @@
                     // Use the newer global config and last reported override config.
                     mPendingMergedConfiguration.setConfiguration(config,
                             mLastReportedMergedConfiguration.getOverrideConfiguration());
+                    if (mPendingActivityWindowInfo != null) {
+                        mPendingActivityWindowInfo.set(mLastReportedActivityWindowInfo);
+                    }
 
                     performConfigurationChange(new MergedConfiguration(mPendingMergedConfiguration),
                             false /* force */, INVALID_DISPLAY /* same display */,
-                            mLastReportedActivityWindowInfo);
+                            mPendingActivityWindowInfo != null
+                                    ? new ActivityWindowInfo(mPendingActivityWindowInfo)
+                                    : null);
                 } break;
                 case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: {
                     setAccessibilityFocus(null, null);
@@ -9014,6 +9044,7 @@
                     mPendingActivityWindowInfo.set(outInfo);
                 }
             }
+            mRelayoutBundle.clear();
             mWinFrameInScreen.set(mTmpFrames.frame);
             if (mTranslator != null) {
                 mTranslator.translateRectInScreenToAppWindow(mTmpFrames.frame);
@@ -9556,6 +9587,8 @@
             }
             mRemoved = true;
             mOnBackInvokedDispatcher.detachFromWindow();
+            removeVrrMessages();
+
             if (mAdded) {
                 dispatchDetachedFromWindow();
             }
@@ -10171,13 +10204,18 @@
     final class ConsumeBatchedInputRunnable implements Runnable {
         @Override
         public void run() {
-            mConsumeBatchedInputScheduled = false;
-            if (doConsumeBatchedInput(mChoreographer.getFrameTimeNanos())) {
-                // If we consumed a batch here, we want to go ahead and schedule the
-                // consumption of batched input events on the next frame. Otherwise, we would
-                // wait until we have more input events pending and might get starved by other
-                // things occurring in the process.
-                scheduleConsumeBatchedInput();
+            Trace.traceBegin(TRACE_TAG_VIEW, mTag);
+            try {
+                mConsumeBatchedInputScheduled = false;
+                if (doConsumeBatchedInput(mChoreographer.getFrameTimeNanos())) {
+                    // If we consumed a batch here, we want to go ahead and schedule the
+                    // consumption of batched input events on the next frame. Otherwise, we would
+                    // wait until we have more input events pending and might get starved by other
+                    // things occurring in the process.
+                    scheduleConsumeBatchedInput();
+                }
+            } finally {
+                Trace.traceEnd(TRACE_TAG_VIEW);
             }
         }
     }
@@ -11796,7 +11834,7 @@
             }
 
             if (mSource != null) {
-                if (fixMergedContentChangeEvent()) {
+                if (fixMergedContentChangeEventV2()) {
                     View newSource = getCommonPredecessor(mSource, source);
                     if (newSource != null) {
                         newSource = newSource.getSelfOrParentImportantForA11y();
@@ -12149,7 +12187,8 @@
                             + "IWindow:%s Session:%s",
                     mOnBackInvokedDispatcher, mBasePackageName, mWindow, mWindowSession));
         }
-        mOnBackInvokedDispatcher.attachToWindow(mWindowSession, mWindow);
+        mOnBackInvokedDispatcher.attachToWindow(mWindowSession, mWindow,
+                mImeBackAnimationController);
     }
 
     private void sendBackKeyEvent(int action) {
@@ -12455,7 +12494,9 @@
     }
 
     private void setPreferredFrameRateCategory(int preferredFrameRateCategory) {
-        if (!shouldSetFrameRateCategory()) {
+        if (!shouldSetFrameRateCategory()
+                || (mFrameRateCompatibility == FRAME_RATE_COMPATIBILITY_GTE
+                && sToolkitFrameRateVelocityMappingReadOnlyFlagValue)) {
             return;
         }
         int categoryFromConflictedFrameRates = FRAME_RATE_CATEGORY_NO_PREFERENCE;
@@ -12509,8 +12550,10 @@
                                     + category + ", reason " + reason + ", "
                                     + sourceView);
                 }
-                mFrameRateTransaction.setFrameRateCategory(mSurfaceControl,
+                if (sToolkitFrameRateFunctionEnablingReadOnlyFlagValue) {
+                    mFrameRateTransaction.setFrameRateCategory(mSurfaceControl,
                         frameRateCategory, false).applyAsyncUnsafe();
+                }
                 mLastPreferredFrameRateCategory = frameRateCategory;
             }
         } catch (Exception e) {
@@ -12550,8 +12593,12 @@
     }
 
     private void setPreferredFrameRate(float preferredFrameRate) {
-        if (!shouldSetFrameRate() || (mFrameRateCompatibility == FRAME_RATE_COMPATIBILITY_GTE
-                && preferredFrameRate > 0)) {
+        if (!shouldSetFrameRate()) {
+            return;
+        }
+        if (mFrameRateCompatibility == FRAME_RATE_COMPATIBILITY_GTE
+                && preferredFrameRate > 0 && !sToolkitFrameRateVelocityMappingReadOnlyFlagValue) {
+            mIsTouchBoosting = false;
             return;
         }
 
@@ -12564,8 +12611,10 @@
                                 + preferredFrameRate + " compatibility "
                                 + mFrameRateCompatibility);
                 }
-                mFrameRateTransaction.setFrameRate(mSurfaceControl, preferredFrameRate,
+                if (sToolkitFrameRateFunctionEnablingReadOnlyFlagValue) {
+                    mFrameRateTransaction.setFrameRate(mSurfaceControl, preferredFrameRate,
                     mFrameRateCompatibility).applyAsyncUnsafe();
+                }
                 mLastPreferredFrameRate = preferredFrameRate;
             }
         } catch (Exception e) {
@@ -12609,14 +12658,14 @@
      */
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED)
     public void votePreferredFrameRateCategory(int frameRateCategory, int reason, View view) {
-        if (frameRateCategory == FRAME_RATE_CATEGORY_HIGH) {
-            mFrameRateCategoryHighCount = FRAME_RATE_CATEGORY_COUNT;
-        } else if (frameRateCategory == FRAME_RATE_CATEGORY_HIGH_HINT) {
-            mFrameRateCategoryHighHintCount = FRAME_RATE_CATEGORY_COUNT;
-        } else if (frameRateCategory == FRAME_RATE_CATEGORY_NORMAL) {
-            mFrameRateCategoryNormalCount = FRAME_RATE_CATEGORY_COUNT;
-        } else if (frameRateCategory == FRAME_RATE_CATEGORY_LOW) {
-            mFrameRateCategoryLowCount = FRAME_RATE_CATEGORY_COUNT;
+        switch (frameRateCategory) {
+            case FRAME_RATE_CATEGORY_LOW -> mFrameRateCategoryLowCount = FRAME_RATE_CATEGORY_COUNT;
+            case FRAME_RATE_CATEGORY_NORMAL ->
+                    mFrameRateCategoryNormalCount = FRAME_RATE_CATEGORY_COUNT;
+            case FRAME_RATE_CATEGORY_HIGH_HINT ->
+                    mFrameRateCategoryHighHintCount = FRAME_RATE_CATEGORY_COUNT;
+            case FRAME_RATE_CATEGORY_HIGH ->
+                    mFrameRateCategoryHighCount = FRAME_RATE_CATEGORY_COUNT;
         }
 
         int oldCategory = mPreferredFrameRateCategory;
@@ -12631,12 +12680,11 @@
         }
         mHasInvalidation = true;
         checkIdleness();
-        if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)
-                && mPreferredFrameRateCategory != oldCategory
+        if (mPreferredFrameRateCategory != oldCategory
                 && mPreferredFrameRateCategory == frameRateCategory
         ) {
             mFrameRateCategoryChangeReason = reason;
-            mFrameRateCategoryView = view.getClass().getSimpleName();
+            mFrameRateCategoryView = view == null ? "null" : view.getClass().getSimpleName();
         }
     }
 
@@ -12777,7 +12825,10 @@
      */
     @VisibleForTesting
     public boolean isFrameRatePowerSavingsBalanced() {
-        return mIsFrameRatePowerSavingsBalanced;
+        if (sToolkitSetFrameRateReadOnlyFlagValue) {
+            return mWindowAttributes.isFrameRatePowerSavingsBalanced();
+        }
+        return true;
     }
 
     /**
@@ -12789,21 +12840,12 @@
         return mIsFrameRateConflicted;
     }
 
-    /**
-     * Set the value of mIsFrameRatePowerSavingsBalanced
-     * Can be used to checked if toolkit dVRR feature is enabled.
-     */
-    public void setFrameRatePowerSavingsBalanced(boolean enabled) {
-        if (sToolkitSetFrameRateReadOnlyFlagValue) {
-            mIsFrameRatePowerSavingsBalanced = enabled;
-        }
-    }
-
     private boolean shouldEnableDvrr() {
         // uncomment this when we are ready for enabling dVRR
-        // return sToolkitSetFrameRateReadOnlyFlagValue && mIsFrameRatePowerSavingsBalanced;
+        if (sToolkitFrameRateViewEnablingReadOnlyFlagValue) {
+            return sToolkitSetFrameRateReadOnlyFlagValue && isFrameRatePowerSavingsBalanced();
+        }
         return false;
-
     }
 
     private void checkIdleness() {
@@ -12815,4 +12857,10 @@
             mHasIdledMessage = true;
         }
     }
+
+    private void removeVrrMessages() {
+        mHandler.removeMessages(MSG_TOUCH_BOOST_TIMEOUT);
+        mHandler.removeMessages(MSG_CHECK_INVALIDATION_IDLE);
+        mHandler.removeMessages(MSG_FRAME_RATE_SETTING);
+    }
 }
diff --git a/core/java/android/view/ViewRootInsetsControllerHost.java b/core/java/android/view/ViewRootInsetsControllerHost.java
index 4214141..b66c59a 100644
--- a/core/java/android/view/ViewRootInsetsControllerHost.java
+++ b/core/java/android/view/ViewRootInsetsControllerHost.java
@@ -17,9 +17,6 @@
 package android.view;
 
 import static android.view.InsetsController.DEBUG;
-import static android.view.WindowInsetsController.COMPATIBLE_APPEARANCE_FLAGS;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_APPEARANCE_CONTROLLED;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_BEHAVIOR_CONTROLLED;
 
 import android.annotation.NonNull;
 import android.content.Context;
@@ -174,9 +171,6 @@
 
     @Override
     public void setSystemBarsAppearance(int appearance, int mask) {
-        if ((mask & COMPATIBLE_APPEARANCE_FLAGS) != 0) {
-            mViewRoot.mWindowAttributes.privateFlags |= PRIVATE_FLAG_APPEARANCE_CONTROLLED;
-        }
         final InsetsFlags insetsFlags = mViewRoot.mWindowAttributes.insetsFlags;
         final int newAppearance = (insetsFlags.appearance & ~mask) | (appearance & mask);
         if (insetsFlags.appearance != newAppearance) {
@@ -192,13 +186,7 @@
     }
 
     @Override
-    public boolean isSystemBarsAppearanceControlled() {
-        return (mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_APPEARANCE_CONTROLLED) != 0;
-    }
-
-    @Override
     public void setSystemBarsBehavior(int behavior) {
-        mViewRoot.mWindowAttributes.privateFlags |= PRIVATE_FLAG_BEHAVIOR_CONTROLLED;
         if (mViewRoot.mWindowAttributes.insetsFlags.behavior != behavior) {
             mViewRoot.mWindowAttributes.insetsFlags.behavior = behavior;
             mViewRoot.mWindowAttributesChanged = true;
@@ -212,11 +200,6 @@
     }
 
     @Override
-    public boolean isSystemBarsBehaviorControlled() {
-        return (mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_BEHAVIOR_CONTROLLED) != 0;
-    }
-
-    @Override
     public void releaseSurfaceControlFromRt(SurfaceControl surfaceControl) {
 
          // At the time we receive new leashes (e.g. InsetsSourceConsumer is processing
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 51229a7..1ebced5 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -334,7 +334,12 @@
     private boolean mOverlayWithDecorCaptionEnabled = true;
     private boolean mCloseOnSwipeEnabled = false;
 
-    private static boolean sToolkitSetFrameRateReadOnlyFlagValue =
+    /**
+     * To check if toolkitSetFrameRateReadOnly flag is enabled
+     *
+     * @hide
+     */
+    protected static boolean sToolkitSetFrameRateReadOnlyFlagValue =
                 android.view.flags.Flags.toolkitSetFrameRateReadOnly();
 
     // The current window attributes.
diff --git a/core/java/android/view/WindowInsetsController.java b/core/java/android/view/WindowInsetsController.java
index 7601ffa..1ffffb3 100644
--- a/core/java/android/view/WindowInsetsController.java
+++ b/core/java/android/view/WindowInsetsController.java
@@ -101,14 +101,6 @@
     int APPEARANCE_FORCE_LIGHT_NAVIGATION_BARS = 1 << 9;
 
     /**
-     * Appearance flags that can be implied from system UI flags.
-     * @hide
-     */
-    int COMPATIBLE_APPEARANCE_FLAGS = APPEARANCE_LOW_PROFILE_BARS
-            | APPEARANCE_LIGHT_STATUS_BARS
-            | APPEARANCE_LIGHT_NAVIGATION_BARS;
-
-    /**
      * Determines the appearance of system bars.
      * @hide
      */
@@ -271,10 +263,23 @@
     void setSystemBarsAppearance(@Appearance int appearance, @Appearance int mask);
 
     /**
+     * Similar to {@link #setSystemBarsAppearance} but the given flag will only take effect when it
+     * is not controlled by {@link #setSystemBarsAppearance}.
+     *
+     * @see WindowInsetsController#getSystemBarsAppearance()
+     * @see android.R.attr#windowLightStatusBar
+     * @see android.R.attr#windowLightNavigationBar
+     * @hide
+     */
+    void setSystemBarsAppearanceFromResource(@Appearance int appearance, @Appearance int mask);
+
+    /**
      * Retrieves the requested appearance of system bars.
      *
      * @return The requested bitmask of system bar appearance controlled by this window.
      * @see #setSystemBarsAppearance(int, int)
+     * @see android.R.attr#windowLightStatusBar
+     * @see android.R.attr#windowLightNavigationBar
      */
     @Appearance int getSystemBarsAppearance();
 
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 5666739..59cb450 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -104,6 +104,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.graphics.Bitmap;
 import android.graphics.PixelFormat;
@@ -1490,7 +1491,13 @@
         }
 
         try {
-            return ActivityTaskManager.supportsMultiWindow(ActivityThread.currentApplication());
+            final Context context = ActivityThread.currentApplication();
+            if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
+                // Watch supports multi-window to present essential system UI, but it doesn't need
+                // WM Extensions.
+                return false;
+            }
+            return ActivityTaskManager.supportsMultiWindow(context);
         } catch (Exception e) {
             // In case the PackageManager is not set up correctly in test.
             Log.e("WindowManager", "Unable to read if the device supports multi window", e);
@@ -3433,20 +3440,6 @@
         public static final int PRIVATE_FLAG_CONSUME_IME_INSETS = 1 << 25;
 
         /**
-         * Flag to indicate that the window is controlling the appearance of system bars. So we
-         * don't need to adjust it by reading its system UI flags for compatibility.
-         * @hide
-         */
-        public static final int PRIVATE_FLAG_APPEARANCE_CONTROLLED = 1 << 26;
-
-        /**
-         * Flag to indicate that the window is controlling the behavior of system bars. So we don't
-         * need to adjust it by reading its window flags or system UI flags for compatibility.
-         * @hide
-         */
-        public static final int PRIVATE_FLAG_BEHAVIOR_CONTROLLED = 1 << 27;
-
-        /**
          * Flag to indicate that the window is controlling how it fits window insets on its own.
          * So we don't need to adjust its attributes for fitting window insets.
          * @hide
@@ -3517,8 +3510,6 @@
                 PRIVATE_FLAG_NOT_MAGNIFIABLE,
                 PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC,
                 PRIVATE_FLAG_CONSUME_IME_INSETS,
-                PRIVATE_FLAG_APPEARANCE_CONTROLLED,
-                PRIVATE_FLAG_BEHAVIOR_CONTROLLED,
                 PRIVATE_FLAG_FIT_INSETS_CONTROLLED,
                 PRIVATE_FLAG_TRUSTED_OVERLAY,
                 PRIVATE_FLAG_INSET_PARENT_FRAME_BY_IME,
@@ -3619,14 +3610,6 @@
                         equals = PRIVATE_FLAG_CONSUME_IME_INSETS,
                         name = "CONSUME_IME_INSETS"),
                 @ViewDebug.FlagToString(
-                        mask = PRIVATE_FLAG_APPEARANCE_CONTROLLED,
-                        equals = PRIVATE_FLAG_APPEARANCE_CONTROLLED,
-                        name = "APPEARANCE_CONTROLLED"),
-                @ViewDebug.FlagToString(
-                        mask = PRIVATE_FLAG_BEHAVIOR_CONTROLLED,
-                        equals = PRIVATE_FLAG_BEHAVIOR_CONTROLLED,
-                        name = "BEHAVIOR_CONTROLLED"),
-                @ViewDebug.FlagToString(
                         mask = PRIVATE_FLAG_FIT_INSETS_CONTROLLED,
                         equals = PRIVATE_FLAG_FIT_INSETS_CONTROLLED,
                         name = "FIT_INSETS_CONTROLLED"),
@@ -4370,6 +4353,22 @@
         public static final int INPUT_FEATURE_SPY = 1 << 2;
 
         /**
+         * Input feature used to indicate that this window is sensitive for tracing.
+         * <p>
+         * A window that uses {@link LayoutParams#FLAG_SECURE} will automatically be treated as
+         * a sensitive for input tracing, but this input feature can be set on windows that don't
+         * set FLAG_SECURE. The tracing configuration will determine how these sensitive events
+         * are eventually traced.
+         * <p>
+         * This can only be set for trusted system overlays.
+         * <p>
+         * Note: Input tracing is only available on userdebug and eng builds.
+         *
+         * @hide
+         */
+        public static final int INPUT_FEATURE_SENSITIVE_FOR_TRACING = 1 << 3;
+
+        /**
          * An internal annotation for flags that can be specified to {@link #inputFeatures}.
          *
          * NOTE: These are not the same as {@link android.os.InputConfig} flags.
@@ -4381,6 +4380,7 @@
                 INPUT_FEATURE_NO_INPUT_CHANNEL,
                 INPUT_FEATURE_DISABLE_USER_ACTIVITY,
                 INPUT_FEATURE_SPY,
+                INPUT_FEATURE_SENSITIVE_FOR_TRACING,
         })
         public @interface InputFeatureFlags {
         }
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index 9708591..3fc9ebc 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -69,7 +69,6 @@
 
 import com.android.internal.R;
 import com.android.internal.accessibility.common.ShortcutConstants;
-import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.IntPair;
 
@@ -161,22 +160,6 @@
     public static final String ACTION_CHOOSE_ACCESSIBILITY_BUTTON =
             "com.android.internal.intent.action.CHOOSE_ACCESSIBILITY_BUTTON";
 
-    /**
-     * Used as an int value for accessibility chooser activity to represent the accessibility button
-     * shortcut type.
-     *
-     * @hide
-     */
-    public static final int ACCESSIBILITY_BUTTON = 0;
-
-    /**
-     * Used as an int value for accessibility chooser activity to represent hardware key shortcut,
-     * such as volume key button.
-     *
-     * @hide
-     */
-    public static final int ACCESSIBILITY_SHORTCUT_KEY = 1;
-
     /** @hide */
     public static final int FLASH_REASON_CALL = 1;
 
@@ -190,35 +173,6 @@
     public static final int FLASH_REASON_PREVIEW = 4;
 
     /**
-     * Annotations for the shortcut type.
-     * <p>Note: Keep in sync with {@link #SHORTCUT_TYPES}.</p>
-     * @hide
-     */
-    // TODO(b/323686675): reuse the one defined in ShortcutConstants
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(value = {
-            // LINT.IfChange(shortcut_type_intdef)
-            ACCESSIBILITY_BUTTON,
-            ACCESSIBILITY_SHORTCUT_KEY,
-            UserShortcutType.QUICK_SETTINGS,
-            // LINT.ThenChange(:shortcut_type_array)
-    })
-    public @interface ShortcutType {}
-
-    /**
-     * Used for iterating through {@link ShortcutType}.
-     * <p>Note: Keep in sync with {@link ShortcutType}.</p>
-     * @hide
-     */
-    public static final int[] SHORTCUT_TYPES = {
-            // LINT.IfChange(shortcut_type_array)
-            ACCESSIBILITY_BUTTON,
-            ACCESSIBILITY_SHORTCUT_KEY,
-            UserShortcutType.QUICK_SETTINGS,
-            // LINT.ThenChange(:shortcut_type_intdef)
-    };
-
-    /**
      * Annotations for content flag of UI.
      * @hide
      */
@@ -1648,7 +1602,7 @@
      */
     @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
     public void enableShortcutsForTargets(boolean enable,
-            @UserShortcutType int shortcutTypes, @NonNull Set<String> targets,
+            @ShortcutConstants.UserShortcutType int shortcutTypes, @NonNull Set<String> targets,
             @UserIdInt int userId) {
         final IAccessibilityManager service;
         synchronized (mLock) {
@@ -1862,7 +1816,8 @@
     @TestApi
     @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
     @NonNull
-    public List<String> getAccessibilityShortcutTargets(@ShortcutType int shortcutType) {
+    public List<String> getAccessibilityShortcutTargets(
+            @ShortcutConstants.UserShortcutType int shortcutType) {
         final IAccessibilityManager service;
         synchronized (mLock) {
             service = getServiceLocked();
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 49a2843..a5ba294 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -159,7 +159,7 @@
      * <p> To avoid disconnected trees, this flag will also prefetch the parent. Siblings will be
      * prefetched before descendants.
      *
-     * @see #FLAG_PREFETCH_ANCESTORS for where to use these flags.
+     * <p> See {@link #FLAG_PREFETCH_ANCESTORS} for information on where these flags can be used.
      */
     public static final int FLAG_PREFETCH_SIBLINGS = 1 << 1;
 
@@ -171,7 +171,7 @@
      * {@link #FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST} or this will trigger an
      * IllegalArgumentException.
      *
-     * @see #FLAG_PREFETCH_ANCESTORS for where to use these flags.
+     * <p> See {@link #FLAG_PREFETCH_ANCESTORS} for information on where these flags can be used.
      */
     public static final int FLAG_PREFETCH_DESCENDANTS_HYBRID = 1 << 2;
 
@@ -181,7 +181,7 @@
      * {@link #FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST} or this will trigger an
      * IllegalArgumentException.
      *
-     * @see #FLAG_PREFETCH_ANCESTORS for where to use these flags.
+     * <p> See {@link #FLAG_PREFETCH_ANCESTORS} for information on where these flags can be used.
      */
     public static final int FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST = 1 << 3;
 
@@ -191,7 +191,7 @@
      * {@link #FLAG_PREFETCH_DESCENDANTS_DEPTH_FIRST} or this will trigger an
      * IllegalArgumentException.
      *
-     * @see #FLAG_PREFETCH_ANCESTORS for where to use these flags.
+     * <p> See {@link #FLAG_PREFETCH_ANCESTORS} for information on where these flags can be used.
      */
     public static final int FLAG_PREFETCH_DESCENDANTS_BREADTH_FIRST = 1 << 4;
 
@@ -199,7 +199,7 @@
      * Prefetching flag that specifies prefetching should not be interrupted by a request to
      * retrieve a node or perform an action on a node.
      *
-     * @see #FLAG_PREFETCH_ANCESTORS for where to use these flags.
+     * <p> See {@link #FLAG_PREFETCH_ANCESTORS} for information on where these flags can be used.
      */
     public static final int FLAG_PREFETCH_UNINTERRUPTIBLE = 1 << 5;
 
@@ -1295,6 +1295,8 @@
     /**
      * Get the child at given index.
      *
+     * <p>
+     * See {@link #getParent(int)} for a description of prefetching.
      * @param index The child index.
      * @param prefetchingStrategy the prefetching strategy.
      * @return The child node.
@@ -1302,7 +1304,6 @@
      * @throws IllegalStateException If called outside of an {@link AccessibilityService} and before
      *                               calling {@link #setQueryFromAppProcessEnabled}.
      *
-     * @see AccessibilityNodeInfo#getParent(int) for a description of prefetching.
      */
     @Nullable
     public AccessibilityNodeInfo getChild(int index, @PrefetchingStrategy int prefetchingStrategy) {
@@ -1903,8 +1904,13 @@
      * Accessibility service will throttle those content change events and only handle one event
      * per minute for that view.
      * </p>
+     * <p>
+     * Example UI elements that frequently update and may benefit from a duration are progress bars,
+     * timers, and stopwatches.
+     * </p>
      *
-     * @see AccessibilityEvent#getContentChangeTypes for all content change types.
+     * @see AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED
+     * @see AccessibilityEvent#getContentChangeTypes
      * @param duration the minimum duration between content change events.
      *                                         Negative duration would be treated as zero.
      */
@@ -3954,7 +3960,7 @@
     /**
      * Returns the container title.
      *
-     * @see #setContainerTitle for details.
+     * @see #setContainerTitle
      */
     @Nullable
     public CharSequence getContainerTitle() {
@@ -5161,15 +5167,17 @@
      * {@link View#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)} and are performed
      * within {@link View#performAccessibilityAction(int, Bundle)}.
      * </p>
+     * <p>
      * <aside class="note">
      * <b>Note:</b> Views which support these actions should invoke
      * {@link View#setImportantForAccessibility(int)} with
      * {@link View#IMPORTANT_FOR_ACCESSIBILITY_YES} to ensure an {@link AccessibilityService}
-     * can discover the set of supported actions.
+     * can discover the set of supported actions. </aside>
      * </p>
+     * <p>
      * <aside class="note">
      * <b>Note:</b> Use {@link androidx.core.view.ViewCompat#addAccessibilityAction(View,
-     * CharSequence, AccessibilityViewCommand)} to register an action directly on the view.
+     * CharSequence, AccessibilityViewCommand)} to register an action directly on the view. </aside>
      * </p>
      */
     public static final class AccessibilityAction implements Parcelable {
@@ -5185,8 +5193,8 @@
          * <p>The node that is focused should return {@code true} for
          * {@link AccessibilityNodeInfo#isFocused()}.
          *
-         * @see #ACTION_ACCESSIBILITY_FOCUS for the difference between system and accessibility
-         * focus.
+         * See {@link #ACTION_ACCESSIBILITY_FOCUS} for the difference between system and
+         * accessibility focus.
          */
         public static final AccessibilityAction ACTION_FOCUS =
                 new AccessibilityAction(AccessibilityNodeInfo.ACTION_FOCUS);
diff --git a/core/java/android/view/accessibility/flags/accessibility_flags.aconfig b/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
index 91bd4ea..eefc72b 100644
--- a/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
+++ b/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
@@ -56,9 +56,12 @@
 
 flag {
     namespace: "accessibility"
-    name: "fix_merged_content_change_event"
+    name: "fix_merged_content_change_event_v2"
     description: "Fixes event type and source of content change event merged in ViewRootImpl"
     bug: "277305460"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
 }
 
 flag {
diff --git a/core/java/android/view/autofill/AutofillFeatureFlags.java b/core/java/android/view/autofill/AutofillFeatureFlags.java
index 644a7a9..5cdcf0a 100644
--- a/core/java/android/view/autofill/AutofillFeatureFlags.java
+++ b/core/java/android/view/autofill/AutofillFeatureFlags.java
@@ -255,6 +255,17 @@
     public static final String DEVICE_CONFIG_IGNORE_RELAYOUT_WHEN_AUTH_PENDING =
             "ignore_relayout_auth_pending";
 
+    /**
+     * Bugfix flag, Autofill should only fill in value from current session.
+     *
+     * See frameworks/base/services/autofill/bugfixes.aconfig#fill_fields_from_current_session_only
+     * for more information
+     *
+     * @hide
+     */
+    public static final String DEVICE_CONFIG_FILL_FIELDS_FROM_CURRENT_SESSION_ONLY =
+            "fill_fields_from_current_session_only";
+
     // END AUTOFILL FOR ALL APPS FLAGS //
 
 
@@ -532,6 +543,14 @@
                 false);
     }
 
+    /** @hide **/
+    public static boolean shouldFillFieldsFromCurrentSessionOnly() {
+        return DeviceConfig.getBoolean(
+                DeviceConfig.NAMESPACE_AUTOFILL,
+                DEVICE_CONFIG_FILL_FIELDS_FROM_CURRENT_SESSION_ONLY,
+                false);
+    }
+
     /**
      * Whether should enable multi-line filter
      *
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 1d9eb71..c7df15c 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -588,6 +588,9 @@
      */
     public static final int NO_SESSION = Integer.MAX_VALUE;
 
+    /** @hide **/
+    public static final String PINNED_DATASET_ID = "PINNED_DATASET_ID";
+
     private final IAutoFillManager mService;
 
     private final Object mLock = new Object();
diff --git a/core/java/android/view/flags/refresh_rate_flags.aconfig b/core/java/android/view/flags/refresh_rate_flags.aconfig
index 06598b3..1047131 100644
--- a/core/java/android/view/flags/refresh_rate_flags.aconfig
+++ b/core/java/android/view/flags/refresh_rate_flags.aconfig
@@ -81,9 +81,33 @@
 }
 
 flag {
+    name: "toolkit_frame_rate_small_uses_percent_read_only"
+    namespace: "toolkit"
+    description: "VRR uses percent of size to consider a view to be small"
+    bug: "239979904"
+    is_fixed_read_only: true
+}
+
+flag {
     name: "toolkit_frame_rate_typing_read_only"
     namespace: "toolkit"
     description: "Feature flag for suppressing boost on typing"
     bug: "239979904"
     is_fixed_read_only: true
+}
+
+flag {
+    name: "toolkit_frame_rate_function_enabling_read_only"
+    namespace: "toolkit"
+    description: "Feature flag to enable the functionality of the dVRR feature"
+    bug: "239979904"
+    is_fixed_read_only: true
+}
+
+flag {
+    name: "toolkit_frame_rate_view_enabling_read_only"
+    namespace: "toolkit"
+    description: "Feature flag to enable the functionality on views for the dVRR feature"
+    bug: "239979904"
+    is_fixed_read_only: true
 }
\ No newline at end of file
diff --git a/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java b/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
index cedf8d0..f454a6a 100644
--- a/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
+++ b/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
@@ -770,6 +770,20 @@
     }
 
     @AnyThread
+    @RequiresPermission(Manifest.permission.TEST_INPUT_METHOD)
+    static void finishTrackingPendingImeVisibilityRequests() {
+        final var service = getImeTrackerService();
+        if (service == null) {
+            return;
+        }
+        try {
+            service.finishTrackingPendingImeVisibilityRequests();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    @AnyThread
     @Nullable
     private static IImeTracker getImeTrackerService() {
         var trackerService = sTrackerServiceCache;
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 8efb201..8174da6 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -1153,6 +1153,9 @@
                     }
                     final boolean startInput;
                     synchronized (mH) {
+                        if (reason == UnbindReason.DISCONNECT_IME) {
+                            mImeDispatcher.clear();
+                        }
                         if (getBindSequenceLocked() != sequence) {
                             return;
                         }
@@ -4316,6 +4319,19 @@
     }
 
     /**
+     * A test API for CTS to finish the tracking of any pending IME visibility requests. This
+     * won't stop the actual requests, but allows resetting the state when starting up test runs.
+     *
+     * @hide
+     */
+    @SuppressLint("UnflaggedApi") // @TestApi without associated feature.
+    @TestApi
+    @RequiresPermission(Manifest.permission.TEST_INPUT_METHOD)
+    public void finishTrackingPendingImeVisibilityRequests() {
+        IInputMethodManagerGlobalInvoker.finishTrackingPendingImeVisibilityRequests();
+    }
+
+    /**
      * Show the settings for enabling subtypes of the specified input method.
      *
      * @param imiId An input method, whose subtypes settings will be shown. If imiId is null,
diff --git a/core/java/android/view/inputmethod/flags.aconfig b/core/java/android/view/inputmethod/flags.aconfig
index be74a65..0d19746 100644
--- a/core/java/android/view/inputmethod/flags.aconfig
+++ b/core/java/android/view/inputmethod/flags.aconfig
@@ -93,3 +93,15 @@
     bug: "322836622"
     is_fixed_read_only: true
 }
+
+flag {
+    name: "ctrl_shift_shortcut"
+    namespace: "input_method"
+    description: "Ctrl+Shift shortcut to switch IMEs"
+    bug: "327198899"
+    is_fixed_read_only: true
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
+
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 1d2f653..ef50045 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -16,9 +16,6 @@
 
 package android.view.textclassifier;
 
-import static android.service.notification.Flags.FLAG_REDACT_SENSITIVE_NOTIFICATIONS_FROM_UNTRUSTED_LISTENERS;
-
-import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
 import android.annotation.IntRange;
 import android.annotation.NonNull;
@@ -111,9 +108,6 @@
     String TYPE_DATE_TIME = "datetime";
     /** Flight number in IATA format. */
     String TYPE_FLIGHT_NUMBER = "flight";
-    /** One-time login codes */
-    @FlaggedApi(FLAG_REDACT_SENSITIVE_NOTIFICATIONS_FROM_UNTRUSTED_LISTENERS)
-    String TYPE_OTP_CODE = "otp_code";
     /**
      * Word that users may be interested to look up for meaning.
      * @hide
@@ -132,8 +126,7 @@
             TYPE_DATE,
             TYPE_DATE_TIME,
             TYPE_FLIGHT_NUMBER,
-            TYPE_DICTIONARY,
-            TYPE_OTP_CODE
+            TYPE_DICTIONARY
     })
     @interface EntityType {}
 
diff --git a/core/java/android/webkit/WebViewZygote.java b/core/java/android/webkit/WebViewZygote.java
index e14ae72..c7900e4 100644
--- a/core/java/android/webkit/WebViewZygote.java
+++ b/core/java/android/webkit/WebViewZygote.java
@@ -104,7 +104,8 @@
             sPackage = packageInfo;
 
             // If multi-process is not enabled, then do not start the zygote service.
-            if (!sMultiprocessEnabled) {
+            // Only check sMultiprocessEnabled if updateServiceV2 is not enabled.
+            if (!updateServiceV2() && !sMultiprocessEnabled) {
                 return;
             }
 
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index f54ef38..ab6b512 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -16,6 +16,8 @@
 
 package android.widget;
 
+import static android.view.flags.Flags.viewVelocityApi;
+
 import android.annotation.ColorInt;
 import android.annotation.DrawableRes;
 import android.annotation.NonNull;
@@ -5098,6 +5100,11 @@
                 boolean more = scroller.computeScrollOffset();
                 final int y = scroller.getCurrY();
 
+                // For variable refresh rate project to track the current velocity of this View
+                if (viewVelocityApi()) {
+                    setFrameContentVelocity(Math.abs(mScroller.getCurrVelocity()));
+                }
+
                 // Flip sign to convert finger direction to list items direction
                 // (e.g. finger moving down means list is moving towards the top)
                 int delta = consumeFlingInStretch(mLastFlingY - y);
@@ -5192,6 +5199,10 @@
                         invalidate();
                         postOnAnimation(this);
                     }
+                    // For variable refresh rate project to track the current velocity of this View
+                    if (viewVelocityApi()) {
+                        setFrameContentVelocity(Math.abs(mScroller.getCurrVelocity()));
+                    }
                 } else {
                     endFling();
                 }
diff --git a/core/java/android/widget/OverScroller.java b/core/java/android/widget/OverScroller.java
index d00fc1c..abb1471 100644
--- a/core/java/android/widget/OverScroller.java
+++ b/core/java/android/widget/OverScroller.java
@@ -299,8 +299,10 @@
                 final int duration = mScrollerX.mDuration;
                 if (elapsedTime < duration) {
                     final float q = mInterpolator.getInterpolation(elapsedTime / (float) duration);
-                    mScrollerX.updateScroll(q);
-                    mScrollerY.updateScroll(q);
+                    final float q2 =
+                            mInterpolator.getInterpolation((elapsedTime - 1) / (float) duration);
+                    mScrollerX.updateScroll(q, q2);
+                    mScrollerY.updateScroll(q, q2);
                 } else {
                     abortAnimation();
                 }
@@ -642,8 +644,11 @@
                     * 0.84f; // look and feel tuning
         }
 
-        void updateScroll(float q) {
-            mCurrentPosition = mStart + Math.round(q * (mFinal - mStart));
+        void updateScroll(float q, float q2) {
+            int distance = mFinal - mStart;
+            mCurrentPosition = mStart + Math.round(q * distance);
+            // q2 is 1ms before q1
+            mCurrVelocity = 1000f * (q - q2) * distance;
         }
 
         /*
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index 356d059..6e43d0f 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -69,6 +69,7 @@
 import com.android.internal.R;
 
 import java.text.NumberFormat;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Locale;
 
@@ -139,6 +140,14 @@
  * <p>The "inverse" styles provide an inverse color scheme for the spinner, which may be necessary
  * if your application uses a light colored theme (a white background).</p>
  *
+ * <h4>Accessibility</h4>
+ * <p>
+ * Consider using
+ * {@link AccessibilityNodeInfo#setMinDurationBetweenContentChanges(Duration)} to
+ * convey to accessibility services that changes can be throttled. This may reduce the
+ * frequency of potentially disruptive notifications.
+ * </p>
+ *
  * <p><strong>XML attributes</b></strong>
  * <p>
  * See {@link android.R.styleable#ProgressBar ProgressBar Attributes},
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index e3caf70..f643bd4 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -345,7 +345,7 @@
      *
      * @hide
      */
-    private static final int MAX_ADAPTER_CONVERSION_WAITING_TIME_MS = 5000;
+    private static final int MAX_ADAPTER_CONVERSION_WAITING_TIME_MS = 20_000;
 
     /**
      * Application that hosts the remote views.
diff --git a/core/java/android/widget/RemoteViewsService.java b/core/java/android/widget/RemoteViewsService.java
index d4a5bbd..07d6acb 100644
--- a/core/java/android/widget/RemoteViewsService.java
+++ b/core/java/android/widget/RemoteViewsService.java
@@ -124,6 +124,41 @@
          * @return True if the same id always refers to the same object.
          */
         public boolean hasStableIds();
+
+        /**
+         * @hide
+         */
+        default RemoteViews.RemoteCollectionItems getRemoteCollectionItems(int capSize) {
+            RemoteViews.RemoteCollectionItems items = new RemoteViews.RemoteCollectionItems
+                    .Builder().build();
+            Parcel capSizeTestParcel = Parcel.obtain();
+            capSizeTestParcel.allowSquashing();
+
+            try {
+                RemoteViews.RemoteCollectionItems.Builder itemsBuilder =
+                        new RemoteViews.RemoteCollectionItems.Builder();
+                onDataSetChanged();
+
+                itemsBuilder.setHasStableIds(hasStableIds());
+                final int numOfEntries = getCount();
+
+                for (int i = 0; i < numOfEntries; i++) {
+                    final long currentItemId = getItemId(i);
+                    final RemoteViews currentView = getViewAt(i);
+                    currentView.writeToParcel(capSizeTestParcel, 0);
+                    if (capSizeTestParcel.dataSize() > capSize) {
+                        break;
+                    }
+                    itemsBuilder.addItem(currentItemId, currentView);
+                }
+
+                items = itemsBuilder.build();
+            } finally {
+                // Recycle the parcel
+                capSizeTestParcel.recycle();
+            }
+            return items;
+        }
     }
 
     /**
@@ -232,33 +267,11 @@
         public RemoteViews.RemoteCollectionItems getRemoteCollectionItems(int capSize) {
             RemoteViews.RemoteCollectionItems items = new RemoteViews.RemoteCollectionItems
                     .Builder().build();
-            Parcel capSizeTestParcel = Parcel.obtain();
-
             try {
-                RemoteViews.RemoteCollectionItems.Builder itemsBuilder =
-                        new RemoteViews.RemoteCollectionItems.Builder();
-                mFactory.onDataSetChanged();
-
-                itemsBuilder.setHasStableIds(mFactory.hasStableIds());
-                final int numOfEntries = mFactory.getCount();
-
-                for (int i = 0; i < numOfEntries; i++) {
-                    final long currentItemId = mFactory.getItemId(i);
-                    final RemoteViews currentView = mFactory.getViewAt(i);
-                    currentView.writeToParcel(capSizeTestParcel, 0);
-                    if (capSizeTestParcel.dataSize() > capSize) {
-                        break;
-                    }
-                    itemsBuilder.addItem(currentItemId, currentView);
-                }
-
-                items = itemsBuilder.build();
+                items = mFactory.getRemoteCollectionItems(capSize);
             } catch (Exception ex) {
                 Thread t = Thread.currentThread();
                 Thread.getDefaultUncaughtExceptionHandler().uncaughtException(t, ex);
-            } finally {
-                // Recycle the parcel
-                capSizeTestParcel.recycle();
             }
             return items;
         }
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index 42c2d80..b5bf529 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -568,7 +568,7 @@
                     handled = pageScroll(View.FOCUS_DOWN);
                     break;
                 case KeyEvent.KEYCODE_SPACE:
-                    pageScroll(event.isShiftPressed() ? View.FOCUS_UP : View.FOCUS_DOWN);
+                    handled = pageScroll(event.isShiftPressed() ? View.FOCUS_UP : View.FOCUS_DOWN);
                     break;
             }
         }
diff --git a/core/java/android/window/BackProgressAnimator.java b/core/java/android/window/BackProgressAnimator.java
index 40e28cb..163e43a 100644
--- a/core/java/android/window/BackProgressAnimator.java
+++ b/core/java/android/window/BackProgressAnimator.java
@@ -155,6 +155,14 @@
         mSpring.animateToFinalPosition(0);
     }
 
+    /**
+     * Removes the finishCallback passed into {@link #onBackCancelled}
+     */
+    public void removeOnBackCancelledFinishCallback() {
+        mSpring.removeEndListener(mOnAnimationEndListener);
+        mBackCancelledFinishRunnable = null;
+    }
+
     /** Returns true if the back animation is in progress. */
     boolean isBackAnimationInProgress() {
         return mBackAnimationInProgress;
diff --git a/core/java/android/window/ImeOnBackInvokedDispatcher.java b/core/java/android/window/ImeOnBackInvokedDispatcher.java
index 0cc9a0d..da1993d 100644
--- a/core/java/android/window/ImeOnBackInvokedDispatcher.java
+++ b/core/java/android/window/ImeOnBackInvokedDispatcher.java
@@ -148,8 +148,17 @@
             @OnBackInvokedDispatcher.Priority int priority,
             int callbackId,
             @NonNull WindowOnBackInvokedDispatcher receivingDispatcher) {
-        final ImeOnBackInvokedCallback imeCallback =
-                new ImeOnBackInvokedCallback(iCallback, callbackId, priority);
+        final ImeOnBackInvokedCallback imeCallback;
+        if (priority == PRIORITY_SYSTEM) {
+            // A callback registration with PRIORITY_SYSTEM indicates that a predictive back
+            // animation can be played on the IME. Therefore register the
+            // DefaultImeOnBackInvokedCallback with the receiving dispatcher and override the
+            // priority to PRIORITY_DEFAULT.
+            priority = PRIORITY_DEFAULT;
+            imeCallback = new DefaultImeOnBackAnimationCallback(iCallback, callbackId, priority);
+        } else {
+            imeCallback = new ImeOnBackInvokedCallback(iCallback, callbackId, priority);
+        }
         mImeCallbacks.add(imeCallback);
         receivingDispatcher.registerOnBackInvokedCallbackUnchecked(imeCallback, priority);
     }
@@ -230,6 +239,17 @@
     }
 
     /**
+     * Subclass of ImeOnBackInvokedCallback indicating that a predictive IME back animation may be
+     * played instead of invoking the callback.
+     */
+    static class DefaultImeOnBackAnimationCallback extends ImeOnBackInvokedCallback {
+        DefaultImeOnBackAnimationCallback(@NonNull IOnBackInvokedCallback iCallback, int id,
+                int priority) {
+            super(iCallback, id, priority);
+        }
+    }
+
+    /**
      * Transfers {@link ImeOnBackInvokedCallback}s registered on one {@link ViewRootImpl} to
      * another {@link ViewRootImpl} on focus change.
      *
diff --git a/core/java/android/window/WindowOnBackInvokedDispatcher.java b/core/java/android/window/WindowOnBackInvokedDispatcher.java
index 45d7767..bcbac93 100644
--- a/core/java/android/window/WindowOnBackInvokedDispatcher.java
+++ b/core/java/android/window/WindowOnBackInvokedDispatcher.java
@@ -31,6 +31,7 @@
 import android.util.Log;
 import android.view.IWindow;
 import android.view.IWindowSession;
+import android.view.ImeBackAnimationController;
 
 import androidx.annotation.VisibleForTesting;
 
@@ -71,6 +72,9 @@
     @Nullable
     private ImeOnBackInvokedDispatcher mImeDispatcher;
 
+    @Nullable
+    private ImeBackAnimationController mImeBackAnimationController;
+
     /** Convenience hashmap to quickly decide if a callback has been added. */
     private final HashMap<OnBackInvokedCallback, Integer> mAllCallbacks = new HashMap<>();
     /** Holds all callbacks by priorities. */
@@ -88,9 +92,11 @@
      * Sends the pending top callback (if one exists) to WM when the view root
      * is attached a window.
      */
-    public void attachToWindow(@NonNull IWindowSession windowSession, @NonNull IWindow window) {
+    public void attachToWindow(@NonNull IWindowSession windowSession, @NonNull IWindow window,
+            @Nullable ImeBackAnimationController imeBackAnimationController) {
         mWindowSession = windowSession;
         mWindow = window;
+        mImeBackAnimationController = imeBackAnimationController;
         if (!mAllCallbacks.isEmpty()) {
             setTopOnBackInvokedCallback(getTopCallback());
         }
@@ -101,6 +107,7 @@
         clear();
         mWindow = null;
         mWindowSession = null;
+        mImeBackAnimationController = null;
     }
 
     // TODO: Take an Executor for the callback to run on.
@@ -125,6 +132,9 @@
         if (!mOnBackInvokedCallbacks.containsKey(priority)) {
             mOnBackInvokedCallbacks.put(priority, new ArrayList<>());
         }
+        if (callback instanceof ImeOnBackInvokedDispatcher.DefaultImeOnBackAnimationCallback) {
+            callback = mImeBackAnimationController;
+        }
         ArrayList<OnBackInvokedCallback> callbacks = mOnBackInvokedCallbacks.get(priority);
 
         // If callback has already been added, remove it and re-add it.
@@ -152,6 +162,9 @@
             mImeDispatcher.unregisterOnBackInvokedCallback(callback);
             return;
         }
+        if (callback instanceof ImeOnBackInvokedDispatcher.DefaultImeOnBackAnimationCallback) {
+            callback = mImeBackAnimationController;
+        }
         if (!mAllCallbacks.containsKey(callback)) {
             if (DEBUG) {
                 Log.i(TAG, "Callback not found. returning...");
@@ -199,7 +212,7 @@
             }
         } else {
             Log.w(TAG, "sendCancelIfRunning: isInProgress=" + isInProgress
-                    + "callback=" + callback);
+                    + " callback=" + callback);
         }
     }
 
@@ -243,9 +256,9 @@
                 int priority = mAllCallbacks.get(callback);
                 final IOnBackInvokedCallback iCallback =
                         callback instanceof ImeOnBackInvokedDispatcher
-                                    .ImeOnBackInvokedCallback
+                                .ImeOnBackInvokedCallback
                                 ? ((ImeOnBackInvokedDispatcher.ImeOnBackInvokedCallback)
-                                        callback).getIOnBackInvokedCallback()
+                                callback).getIOnBackInvokedCallback()
                                 : new OnBackInvokedCallbackWrapper(
                                         callback,
                                         mProgressAnimator,
diff --git a/core/java/android/window/flags/accessibility.aconfig b/core/java/android/window/flags/accessibility.aconfig
index 90b54bd..368c609 100644
--- a/core/java/android/window/flags/accessibility.aconfig
+++ b/core/java/android/window/flags/accessibility.aconfig
@@ -8,11 +8,31 @@
 }
 
 flag {
-  name: "magnification_always_draw_fullscreen_border"
+  name: "always_draw_magnification_fullscreen_border"
   namespace: "accessibility"
   description: "Always draw fullscreen orange border in fullscreen magnification"
   bug: "291891390"
   metadata {
-        purpose: PURPOSE_BUGFIX
+    purpose: PURPOSE_BUGFIX
   }
-}
\ No newline at end of file
+}
+
+flag {
+  name: "use_window_original_touchable_region_when_magnification_recompute_bounds"
+  namespace: "accessibility"
+  description: "The flag controls whether to use the window original touchable regions in accessibilityController recomputeBounds"
+  bug: "323366243"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
+  name: "delay_notification_to_magnification_when_recents_window_to_front_transition"
+  namespace: "accessibility"
+  description: "The flag controls whether the delaying of notification for recents window to-front transition is needed. In accessibilityController other callbacks will decide sending or canceling the delayed notification."
+  bug: "324949652"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
diff --git a/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig b/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig
index 7fbec67..fa0dab0 100644
--- a/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig
+++ b/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig
@@ -86,3 +86,10 @@
   description: "Whether the blurred letterbox wallpaper background is enabled by default"
   bug: "297195682"
 }
+
+flag {
+    name: "enable_compatui_sysui_launcher"
+    namespace: "large_screen_experiences_app_compat"
+    description: "Enables sysui animation for user aspect ratio button"
+    bug: "300357441"
+}
\ No newline at end of file
diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig
index ed1d434..9524a6e 100644
--- a/core/java/android/window/flags/lse_desktop_experience.aconfig
+++ b/core/java/android/window/flags/lse_desktop_experience.aconfig
@@ -21,3 +21,31 @@
     description: "Enables policy for modals activities"
     bug: "319492844"
 }
+
+flag {
+    name: "enable_windowing_dynamic_initial_bounds"
+    namespace: "lse_desktop_experience"
+    description: "Enables new initial bounds for desktop windowing which adjust depending on app constraints"
+    bug: "324377962"
+}
+
+flag {
+    name: "enable_desktop_windowing_task_limit"
+    namespace: "lse_desktop_experience"
+    description: "Enables a limit on the number of Tasks shown in Desktop Mode"
+    bug: "332502912"
+}
+
+flag {
+    name: "enable_windowing_edge_drag_resize"
+    namespace: "lse_desktop_experience"
+    description: "Enables edge drag resizing for all input sources"
+    bug: "323383067"
+}
+
+flag {
+    name: "enable_desktop_windowing_taskbar_running_apps"
+    namespace: "lse_desktop_experience"
+    description: "Shows running apps in Desktop Mode Taskbar"
+    bug: "332504528"
+}
diff --git a/core/java/android/window/flags/wallpaper_manager.aconfig b/core/java/android/window/flags/wallpaper_manager.aconfig
index dea9497..edf90b5 100644
--- a/core/java/android/window/flags/wallpaper_manager.aconfig
+++ b/core/java/android/window/flags/wallpaper_manager.aconfig
@@ -20,4 +20,14 @@
   namespace: "systemui"
   description: "Prevent the system from sending consecutive onVisibilityChanged(false) events."
   bug: "285631818"
+}
+
+flag {
+  name: "offload_color_extraction"
+  namespace: "systemui"
+  description: "Let ImageWallpaper take care of its wallpaper color extraction, instead of system_server"
+  bug: "328791519"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
 }
\ 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 247f28c..e2efff3 100644
--- a/core/java/android/window/flags/windowing_frontend.aconfig
+++ b/core/java/android/window/flags/windowing_frontend.aconfig
@@ -8,6 +8,16 @@
 }
 
 flag {
+    name: "wait_for_transition_on_display_switch"
+    namespace: "windowing_frontend"
+    description: "Waits for Shell transition to start before unblocking the screen after display switch"
+    bug: "301420598"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
+
+flag {
   name: "edge_to_edge_by_default"
   namespace: "windowing_frontend"
   description: "Make app go edge-to-edge by default when targeting SDK 35 or greater"
@@ -32,6 +42,17 @@
 }
 
 flag {
+  name: "remove_prepare_surface_in_placement"
+  namespace: "windowing_frontend"
+  description: "Reduce unnecessary invocation to improve performance"
+  bug: "330721336"
+  is_fixed_read_only: true
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
   name: "close_to_square_config_includes_status_bar"
   namespace: "windowing_frontend"
   description: "On close to square display, when necessary, configuration includes status bar"
@@ -106,9 +127,28 @@
 }
 
 flag {
+  name: "fifo_priority_for_major_ui_processes"
+  namespace: "windowing_frontend"
+  description: "Use realtime priority for SystemUI and launcher"
+  bug: "288140556"
+  is_fixed_read_only: true
+}
+
+flag {
   name: "insets_decoupled_configuration"
   namespace: "windowing_frontend"
   description: "Configuration decoupled from insets"
   bug: "151861875"
   is_fixed_read_only: true
+}
+
+flag {
+  name: "keyguard_appear_transition"
+  namespace: "windowing_frontend"
+  description: "Add transition when keyguard appears"
+  bug: "327970608"
+  is_fixed_read_only: true
+  metadata {
+      purpose: PURPOSE_BUGFIX
+  }
 }
\ No newline at end of file
diff --git a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
index 840e2a1..ddb8ee0 100644
--- a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
+++ b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
@@ -18,14 +18,16 @@
 
 import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
 import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
 
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
 import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets;
 import static com.android.internal.os.RoSystemProperties.SUPPORT_ONE_HANDED_MODE;
 import static com.android.internal.util.ArrayUtils.convertToLongArray;
 
+import android.Manifest;
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.annotation.IntDef;
+import android.annotation.RequiresPermission;
 import android.app.ActivityManager;
 import android.app.ActivityThread;
 import android.app.AlertDialog;
@@ -57,7 +59,6 @@
 import android.widget.Toast;
 
 import com.android.internal.R;
-import com.android.internal.accessibility.common.ShortcutConstants;
 import com.android.internal.accessibility.dialog.AccessibilityTarget;
 import com.android.internal.accessibility.util.ShortcutUtils;
 import com.android.internal.util.function.pooled.PooledLambda;
@@ -330,11 +331,14 @@
         warningToast.show();
     }
 
+    @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
     private AlertDialog createShortcutWarningDialog(int userId) {
-        List<AccessibilityTarget> targets = getTargets(mContext, ACCESSIBILITY_SHORTCUT_KEY);
+        List<AccessibilityTarget> targets = getTargets(mContext, HARDWARE);
         if (targets.size() == 0) {
             return null;
         }
+        final AccessibilityManager am = mFrameworkObjectProvider
+                .getAccessibilityManagerInstance(mContext);
 
         // Avoid non-a11y users accidentally turning shortcut on without reading this carefully.
         // Put "don't turn on" as the primary action.
@@ -362,32 +366,34 @@
                                 // to the Settings.
                                 final ComponentName configDefaultService =
                                         ComponentName.unflattenFromString(defaultService);
-                                Settings.Secure.putStringForUser(mContext.getContentResolver(),
-                                        Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
-                                        configDefaultService.flattenToString(),
-                                        userId);
+                                if (Flags.a11yQsShortcut()) {
+                                    am.enableShortcutsForTargets(true, HARDWARE,
+                                            Set.of(configDefaultService.flattenToString()), userId);
+                                } else {
+                                    Settings.Secure.putStringForUser(mContext.getContentResolver(),
+                                            Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+                                            configDefaultService.flattenToString(),
+                                            userId);
+                                }
                             }
                         })
                 .setPositiveButton(R.string.accessibility_shortcut_off,
                         (DialogInterface d, int which) -> {
-                            if (Flags.updateAlwaysOnA11yService()) {
-                                Set<String> targetServices =
-                                        ShortcutUtils.getShortcutTargetsFromSettings(
-                                                mContext,
-                                                ShortcutConstants.UserShortcutType.HARDWARE,
-                                                userId);
-
+                            Set<String> targetServices =
+                                    ShortcutUtils.getShortcutTargetsFromSettings(
+                                            mContext,
+                                            HARDWARE,
+                                            userId);
+                            if (Flags.a11yQsShortcut()) {
+                                am.enableShortcutsForTargets(
+                                        false, HARDWARE, targetServices, userId);
+                            } else {
                                 Settings.Secure.putStringForUser(mContext.getContentResolver(),
                                         Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, "",
                                         userId);
                                 ShortcutUtils.updateInvisibleToggleAccessibilityServiceEnableState(
                                         mContext, targetServices, userId);
-                            } else {
-                                Settings.Secure.putStringForUser(mContext.getContentResolver(),
-                                        Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, "",
-                                        userId);
                             }
-
                             // If canceled, treat as if the dialog has never been shown
                             Settings.Secure.putIntForUser(mContext.getContentResolver(),
                                     Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN,
@@ -543,7 +549,7 @@
     private ComponentName getShortcutTargetComponentName() {
         final List<String> shortcutTargets = mFrameworkObjectProvider
                 .getAccessibilityManagerInstance(mContext)
-                .getAccessibilityShortcutTargets(ACCESSIBILITY_SHORTCUT_KEY);
+                .getAccessibilityShortcutTargets(HARDWARE);
         if (shortcutTargets.size() != 1) {
             return null;
         }
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityActivityTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityActivityTarget.java
index 063154d..bd3c659 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityActivityTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityActivityTarget.java
@@ -17,23 +17,22 @@
 package com.android.internal.accessibility.dialog;
 
 import static com.android.internal.accessibility.util.ShortcutUtils.convertToKey;
-import static com.android.internal.accessibility.util.ShortcutUtils.convertToUserType;
 import static com.android.internal.accessibility.util.ShortcutUtils.isShortcutContained;
 
 import android.accessibilityservice.AccessibilityShortcutInfo;
 import android.annotation.NonNull;
 import android.content.Context;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
 
 import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
 import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 
 /**
  * Base class for creating accessibility activity target.
  */
 class AccessibilityActivityTarget extends AccessibilityTarget {
 
-    AccessibilityActivityTarget(Context context, @ShortcutType int shortcutType,
+    AccessibilityActivityTarget(Context context, @UserShortcutType int shortcutType,
             @NonNull AccessibilityShortcutInfo shortcutInfo) {
         super(context,
                 shortcutType,
@@ -44,7 +43,7 @@
                 shortcutInfo.getActivityInfo().applicationInfo.uid,
                 shortcutInfo.getActivityInfo().loadLabel(context.getPackageManager()),
                 shortcutInfo.getActivityInfo().loadIcon(context.getPackageManager()),
-                convertToKey(convertToUserType(shortcutType)));
+                convertToKey(shortcutType));
     }
 
     @Override
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java
index 7eb09e5..fc3cd45 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java
@@ -17,10 +17,10 @@
 package com.android.internal.accessibility.dialog;
 
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
 
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
 import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets;
 import static com.android.internal.accessibility.util.AccessibilityStatsLogUtils.logAccessibilityButtonLongPressStatus;
 
@@ -85,7 +85,7 @@
             prompt.setVisibility(View.VISIBLE);
         }
 
-        mTargets.addAll(getTargets(this, ACCESSIBILITY_BUTTON));
+        mTargets.addAll(getTargets(this, SOFTWARE));
 
         final GridView gridview = findViewById(R.id.accessibility_button_chooser_grid);
         gridview.setAdapter(new ButtonTargetAdapter(mTargets));
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityServiceTarget.java
index 2b6913c..677c0f0 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityServiceTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityServiceTarget.java
@@ -17,16 +17,15 @@
 package com.android.internal.accessibility.dialog;
 
 import static com.android.internal.accessibility.util.ShortcutUtils.convertToKey;
-import static com.android.internal.accessibility.util.ShortcutUtils.convertToUserType;
 import static com.android.internal.accessibility.util.ShortcutUtils.isShortcutContained;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.annotation.NonNull;
 import android.content.Context;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
 
 import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
 import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 
 /**
  * Base class for creating accessibility service target with various fragment types related to
@@ -36,7 +35,7 @@
 
     private final AccessibilityServiceInfo mAccessibilityServiceInfo;
 
-    AccessibilityServiceTarget(Context context, @ShortcutType int shortcutType,
+    AccessibilityServiceTarget(Context context, @UserShortcutType int shortcutType,
             @AccessibilityFragmentType int fragmentType,
             @NonNull AccessibilityServiceInfo serviceInfo) {
         super(context,
@@ -48,7 +47,7 @@
                 serviceInfo.getResolveInfo().serviceInfo.applicationInfo.uid,
                 serviceInfo.getResolveInfo().loadLabel(context.getPackageManager()),
                 serviceInfo.getResolveInfo().loadIcon(context.getPackageManager()),
-                convertToKey(convertToUserType(shortcutType)));
+                convertToKey(shortcutType));
         mAccessibilityServiceInfo = serviceInfo;
     }
 
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java
index c70febb..6256dbc 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java
@@ -15,11 +15,10 @@
  */
 package com.android.internal.accessibility.dialog;
 
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-import static android.view.accessibility.AccessibilityManager.ShortcutType;
-
 import static com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
 import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getInstalledTargets;
 import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets;
 import static com.android.internal.accessibility.util.AccessibilityUtils.isUserSetupCompleted;
@@ -37,7 +36,6 @@
 import android.view.Window;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.Flags;
 import android.widget.AdapterView;
 
 import com.android.internal.R;
@@ -51,8 +49,8 @@
  * activity or allowlisting feature for volume key shortcut.
  */
 public class AccessibilityShortcutChooserActivity extends Activity {
-    @ShortcutType
-    private final int mShortcutType = ACCESSIBILITY_SHORTCUT_KEY;
+    @UserShortcutType
+    private final int mShortcutType = HARDWARE;
     private static final String KEY_ACCESSIBILITY_SHORTCUT_MENU_MODE =
             "accessibility_shortcut_menu_mode";
     private final List<AccessibilityTarget> mTargets = new ArrayList<>();
@@ -216,7 +214,7 @@
                 mTargetAdapter.getShortcutMenuMode() == ShortcutMenuMode.EDIT;
         final int selectDialogTitleId = R.string.accessibility_select_shortcut_menu_title;
         final int editDialogTitleId =
-                mShortcutType == ACCESSIBILITY_BUTTON
+                mShortcutType == SOFTWARE
                         ? R.string.accessibility_edit_shortcut_menu_button_title
                         : R.string.accessibility_edit_shortcut_menu_volume_title;
 
@@ -248,12 +246,10 @@
 
         boolean allowEditing = isUserSetupCompleted(this);
         boolean showWhenLocked = false;
-        if (Flags.allowShortcutChooserOnLockscreen()) {
-            final KeyguardManager keyguardManager = getSystemService(KeyguardManager.class);
-            if (keyguardManager != null && keyguardManager.isKeyguardLocked()) {
-                allowEditing = false;
-                showWhenLocked = true;
-            }
+        final KeyguardManager keyguardManager = getSystemService(KeyguardManager.class);
+        if (keyguardManager != null && keyguardManager.isKeyguardLocked()) {
+            allowEditing = false;
+            showWhenLocked = true;
         }
         if (allowEditing) {
             final String positiveButtonText =
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
index 652cb52..f088592 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
@@ -16,27 +16,30 @@
 
 package com.android.internal.accessibility.dialog;
 
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-
-import static com.android.internal.accessibility.util.ShortcutUtils.convertToUserType;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
 import static com.android.internal.accessibility.util.ShortcutUtils.optInValueToSettings;
 import static com.android.internal.accessibility.util.ShortcutUtils.optOutValueFromSettings;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SuppressLint;
 import android.content.ComponentName;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
 import android.view.View;
 import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
+import android.view.accessibility.Flags;
 
 import com.android.internal.accessibility.common.ShortcutConstants;
 import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder;
 import com.android.internal.annotations.VisibleForTesting;
 
+import java.util.Set;
+
 /**
  * Abstract base class for creating various target related to accessibility service, accessibility
  * activity, and allowlisting features.
@@ -47,7 +50,7 @@
 public abstract class AccessibilityTarget implements TargetOperations, OnTargetSelectedListener,
         OnTargetCheckedChangeListener {
     private Context mContext;
-    @ShortcutType
+    @UserShortcutType
     private int mShortcutType;
     @AccessibilityFragmentType
     private int mFragmentType;
@@ -61,7 +64,7 @@
     private CharSequence mStateDescription;
 
     @VisibleForTesting
-    public AccessibilityTarget(Context context, @ShortcutType int shortcutType,
+    public AccessibilityTarget(Context context, @UserShortcutType int shortcutType,
             @AccessibilityFragmentType int fragmentType, boolean isShortcutSwitched, String id,
             int uid, CharSequence label, Drawable icon, String key) {
         mContext = context;
@@ -99,10 +102,10 @@
         final AccessibilityManager am =
                 getContext().getSystemService(AccessibilityManager.class);
         switch (getShortcutType()) {
-            case ACCESSIBILITY_BUTTON:
+            case SOFTWARE:
                 am.notifyAccessibilityButtonClicked(getContext().getDisplayId(), getId());
                 return;
-            case ACCESSIBILITY_SHORTCUT_KEY:
+            case HARDWARE:
                 am.performAccessibilityShortcut(getId());
                 return;
             default:
@@ -110,13 +113,21 @@
         }
     }
 
+    @SuppressLint("MissingPermission")
     @Override
     public void onCheckedChanged(boolean isChecked) {
         setShortcutEnabled(isChecked);
-        if (isChecked) {
-            optInValueToSettings(getContext(), convertToUserType(getShortcutType()), getId());
+        if (Flags.a11yQsShortcut()) {
+            final AccessibilityManager am =
+                    getContext().getSystemService(AccessibilityManager.class);
+            am.enableShortcutsForTargets(
+                    isChecked, getShortcutType(), Set.of(mId), UserHandle.myUserId());
         } else {
-            optOutValueFromSettings(getContext(), convertToUserType(getShortcutType()), getId());
+            if (isChecked) {
+                optInValueToSettings(getContext(), getShortcutType(), getId());
+            } else {
+                optOutValueFromSettings(getContext(), getShortcutType(), getId());
+            }
         }
     }
 
@@ -142,7 +153,7 @@
         return mContext;
     }
 
-    public @ShortcutType int getShortcutType() {
+    public @UserShortcutType int getShortcutType() {
         return mShortcutType;
     }
 
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
index 0d82d63..e523ab0 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
@@ -16,14 +16,13 @@
 
 package com.android.internal.accessibility.dialog;
 
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-
 import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.COLOR_INVERSION_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.ONE_HANDED_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.REDUCE_BRIGHT_COLORS_COMPONENT_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
 import static com.android.internal.accessibility.util.AccessibilityUtils.getAccessibilityServiceFragmentType;
 import static com.android.internal.accessibility.util.ShortcutUtils.isShortcutContained;
 import static com.android.internal.os.RoSystemProperties.SUPPORT_ONE_HANDED_MODE;
@@ -38,10 +37,10 @@
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
 
 import com.android.internal.R;
 import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -64,7 +63,7 @@
      * @hide
      */
     public static List<AccessibilityTarget> getTargets(Context context,
-            @ShortcutType int shortcutType) {
+            @UserShortcutType int shortcutType) {
         // List all accessibility target
         final List<AccessibilityTarget> installedTargets = getInstalledTargets(context,
                 shortcutType);
@@ -107,7 +106,7 @@
      * @hide
      */
     public static List<AccessibilityTarget> getInstalledTargets(Context context,
-            @ShortcutType int shortcutType) {
+            @UserShortcutType int shortcutType) {
         final List<AccessibilityTarget> targets = new ArrayList<>();
         targets.addAll(getAccessibilityFilteredTargets(context, shortcutType));
         targets.addAll(getAllowListingFeatureTargets(context, shortcutType));
@@ -116,7 +115,7 @@
     }
 
     private static List<AccessibilityTarget> getAccessibilityFilteredTargets(Context context,
-            @ShortcutType int shortcutType) {
+            @UserShortcutType int shortcutType) {
         final List<AccessibilityTarget> serviceTargets =
                 getAccessibilityServiceTargets(context, shortcutType);
         final List<AccessibilityTarget> activityTargets =
@@ -149,7 +148,7 @@
     }
 
     private static List<AccessibilityTarget> getAccessibilityServiceTargets(Context context,
-            @ShortcutType int shortcutType) {
+            @UserShortcutType int shortcutType) {
         final AccessibilityManager am = (AccessibilityManager) context.getSystemService(
                 Context.ACCESSIBILITY_SERVICE);
         final List<AccessibilityServiceInfo> installedServices =
@@ -165,7 +164,7 @@
             final boolean hasRequestAccessibilityButtonFlag =
                     (info.flags & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
             if ((targetSdk <= Build.VERSION_CODES.Q) && !hasRequestAccessibilityButtonFlag
-                    && (shortcutType == ACCESSIBILITY_BUTTON)) {
+                    && (shortcutType == SOFTWARE)) {
                 continue;
             }
 
@@ -176,7 +175,7 @@
     }
 
     private static List<AccessibilityTarget> getAccessibilityActivityTargets(Context context,
-            @ShortcutType int shortcutType) {
+            @UserShortcutType int shortcutType) {
         final AccessibilityManager am = (AccessibilityManager) context.getSystemService(
                 Context.ACCESSIBILITY_SERVICE);
         final List<AccessibilityShortcutInfo> installedServices =
@@ -195,7 +194,7 @@
     }
 
     private static List<AccessibilityTarget> getAllowListingFeatureTargets(Context context,
-            @ShortcutType int shortcutType) {
+            @UserShortcutType int shortcutType) {
         final List<AccessibilityTarget> targets = new ArrayList<>();
         final int uid = context.getApplicationInfo().uid;
 
@@ -276,7 +275,7 @@
     }
 
     private static AccessibilityTarget createAccessibilityServiceTarget(Context context,
-            @ShortcutType int shortcutType, @NonNull AccessibilityServiceInfo info) {
+            @UserShortcutType int shortcutType, @NonNull AccessibilityServiceInfo info) {
         switch (getAccessibilityServiceFragmentType(info)) {
             case AccessibilityFragmentType.VOLUME_SHORTCUT_TOGGLE:
                 return new VolumeShortcutToggleAccessibilityServiceTarget(context, shortcutType,
diff --git a/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTarget.java
index 1bc8b84..2097788 100644
--- a/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTarget.java
@@ -16,22 +16,14 @@
 
 package com.android.internal.accessibility.dialog;
 
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-
-import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
-import static com.android.internal.accessibility.util.AccessibilityUtils.setAccessibilityServiceState;
-import static com.android.internal.accessibility.util.ShortcutUtils.isComponentIdExistingInSettings;
-
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.annotation.NonNull;
 import android.content.ComponentName;
 import android.content.Context;
 import android.os.UserHandle;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
-import android.view.accessibility.Flags;
 
 import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import com.android.internal.accessibility.util.ShortcutUtils;
 import com.android.internal.annotations.VisibleForTesting;
 
@@ -45,7 +37,7 @@
 public class InvisibleToggleAccessibilityServiceTarget extends AccessibilityServiceTarget {
 
     public InvisibleToggleAccessibilityServiceTarget(
-            Context context, @ShortcutType int shortcutType,
+            Context context, @UserShortcutType int shortcutType,
             @NonNull AccessibilityServiceInfo serviceInfo) {
         super(context,
                 shortcutType,
@@ -55,31 +47,9 @@
 
     @Override
     public void onCheckedChanged(boolean isChecked) {
+        super.onCheckedChanged(isChecked);
         final ComponentName componentName = ComponentName.unflattenFromString(getId());
-
-        if (Flags.updateAlwaysOnA11yService()) {
-            super.onCheckedChanged(isChecked);
-            ShortcutUtils.updateInvisibleToggleAccessibilityServiceEnableState(
-                    getContext(), Set.of(componentName.flattenToString()), UserHandle.myUserId());
-        } else {
-            if (!isComponentIdExistingInOtherShortcut()) {
-                setAccessibilityServiceState(getContext(), componentName, isChecked);
-            }
-
-            super.onCheckedChanged(isChecked);
-        }
-    }
-
-    private boolean isComponentIdExistingInOtherShortcut() {
-        switch (getShortcutType()) {
-            case ACCESSIBILITY_BUTTON:
-                return isComponentIdExistingInSettings(getContext(), UserShortcutType.HARDWARE,
-                        getId());
-            case ACCESSIBILITY_SHORTCUT_KEY:
-                return isComponentIdExistingInSettings(getContext(), UserShortcutType.SOFTWARE,
-                        getId());
-            default:
-                throw new IllegalStateException("Unexpected shortcut type");
-        }
+        ShortcutUtils.updateInvisibleToggleAccessibilityServiceEnableState(
+                getContext(), Set.of(componentName.flattenToString()), UserHandle.myUserId());
     }
 }
diff --git a/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAllowListingFeatureTarget.java b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAllowListingFeatureTarget.java
index c22f17d..9605793 100644
--- a/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAllowListingFeatureTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAllowListingFeatureTarget.java
@@ -18,9 +18,9 @@
 
 import android.content.Context;
 import android.graphics.drawable.Drawable;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
 
 import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 
 /**
  * Extension for {@link AccessibilityTarget} with {@link AccessibilityFragmentType#INVISIBLE_TOGGLE}
@@ -28,7 +28,7 @@
  */
 class InvisibleToggleAllowListingFeatureTarget extends AccessibilityTarget {
 
-    InvisibleToggleAllowListingFeatureTarget(Context context, @ShortcutType int shortcutType,
+    InvisibleToggleAllowListingFeatureTarget(Context context, @UserShortcutType int shortcutType,
             boolean isShortcutSwitched, String id, int uid, CharSequence label, Drawable icon,
             String key) {
         super(context, shortcutType, AccessibilityFragmentType.INVISIBLE_TOGGLE, isShortcutSwitched,
diff --git a/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java
index a4ffef6..4c5401c 100644
--- a/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java
@@ -22,11 +22,11 @@
 import android.annotation.NonNull;
 import android.content.Context;
 import android.view.View;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
 
 import com.android.internal.R;
 import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
 import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder;
 
 import java.lang.annotation.Retention;
@@ -45,7 +45,7 @@
         float DISABLED = 0.5f;
     }
 
-    ToggleAccessibilityServiceTarget(Context context, @ShortcutType int shortcutType,
+    ToggleAccessibilityServiceTarget(Context context, @UserShortcutType int shortcutType,
             @NonNull AccessibilityServiceInfo serviceInfo) {
         super(context,
                 shortcutType,
diff --git a/core/java/com/android/internal/accessibility/dialog/ToggleAllowListingFeatureTarget.java b/core/java/com/android/internal/accessibility/dialog/ToggleAllowListingFeatureTarget.java
index 11e668f..c285670 100644
--- a/core/java/com/android/internal/accessibility/dialog/ToggleAllowListingFeatureTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/ToggleAllowListingFeatureTarget.java
@@ -21,11 +21,11 @@
 import android.graphics.drawable.Drawable;
 import android.provider.Settings;
 import android.view.View;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
 
 import com.android.internal.R;
 import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
 import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder;
 
 /**
@@ -34,7 +34,7 @@
  */
 class ToggleAllowListingFeatureTarget extends AccessibilityTarget {
 
-    ToggleAllowListingFeatureTarget(Context context, @ShortcutType int shortcutType,
+    ToggleAllowListingFeatureTarget(Context context, @UserShortcutType int shortcutType,
             boolean isShortcutSwitched, String id, int uid, CharSequence label, Drawable icon,
             String key) {
         super(context, shortcutType, AccessibilityFragmentType.TOGGLE, isShortcutSwitched, id,
diff --git a/core/java/com/android/internal/accessibility/dialog/VolumeShortcutToggleAccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/VolumeShortcutToggleAccessibilityServiceTarget.java
index 04f5061..f9efb50 100644
--- a/core/java/com/android/internal/accessibility/dialog/VolumeShortcutToggleAccessibilityServiceTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/VolumeShortcutToggleAccessibilityServiceTarget.java
@@ -16,22 +16,14 @@
 
 package com.android.internal.accessibility.dialog;
 
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-
-import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
-import static com.android.internal.accessibility.util.AccessibilityUtils.setAccessibilityServiceState;
-import static com.android.internal.accessibility.util.ShortcutUtils.optOutValueFromSettings;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.annotation.NonNull;
-import android.content.ComponentName;
 import android.content.Context;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
-import android.widget.Toast;
 
-import com.android.internal.R;
 import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 
 /**
  * Extension for {@link AccessibilityServiceTarget} with
@@ -39,8 +31,8 @@
  */
 class VolumeShortcutToggleAccessibilityServiceTarget extends AccessibilityServiceTarget {
 
-    VolumeShortcutToggleAccessibilityServiceTarget(Context context, @ShortcutType int shortcutType,
-            @NonNull AccessibilityServiceInfo serviceInfo) {
+    VolumeShortcutToggleAccessibilityServiceTarget(Context context,
+            @UserShortcutType int shortcutType, @NonNull AccessibilityServiceInfo serviceInfo) {
         super(context,
                 shortcutType,
                 AccessibilityFragmentType.VOLUME_SHORTCUT_TOGGLE,
@@ -49,30 +41,10 @@
 
     @Override
     public void onCheckedChanged(boolean isChecked) {
-        switch (getShortcutType()) {
-            case ACCESSIBILITY_BUTTON:
-                onCheckedFromAccessibilityButton(isChecked);
-                return;
-            case ACCESSIBILITY_SHORTCUT_KEY:
-                super.onCheckedChanged(isChecked);
-                return;
-            default:
-                throw new IllegalStateException("Unexpected shortcut type");
-        }
-    }
-
-    private void onCheckedFromAccessibilityButton(boolean isChecked) {
-        setShortcutEnabled(isChecked);
-        final ComponentName componentName = ComponentName.unflattenFromString(getId());
-        setAccessibilityServiceState(getContext(), componentName, isChecked);
-
-        if (!isChecked) {
-            optOutValueFromSettings(getContext(), UserShortcutType.HARDWARE, getId());
-
-            final String warningText =
-                    getContext().getString(R.string.accessibility_uncheck_legacy_item_warning,
-                            getLabel());
-            Toast.makeText(getContext(), warningText, Toast.LENGTH_SHORT).show();
+        if (getShortcutType() == HARDWARE) {
+            super.onCheckedChanged(isChecked);
+        } else {
+            throw new IllegalStateException("Unexpected shortcut type");
         }
     }
 }
diff --git a/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java b/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java
index 6b074a6..6864bf7 100644
--- a/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java
+++ b/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java
@@ -21,10 +21,10 @@
 import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL;
 import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;
 import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
 
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
 import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__DISABLED;
 import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__ENABLED;
 import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__UNKNOWN;
@@ -47,9 +47,9 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.provider.Settings;
-import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
 
+import com.android.internal.accessibility.common.ShortcutConstants;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import com.android.internal.util.FrameworkStatsLog;
 
 /** Methods for logging accessibility states. */
@@ -71,15 +71,15 @@
 
     /**
      * Logs accessibility feature name that is assigned to the given {@code shortcutType}.
-     * Calls this when clicking the shortcut {@link AccessibilityManager#ACCESSIBILITY_BUTTON} or
-     * {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY}.
+     * Calls this when clicking the shortcut {@link ShortcutConstants.UserShortcutType#SOFTWARE} or
+     * {@link ShortcutConstants.UserShortcutType#HARDWARE}.
      *
      * @param context context used to retrieve the {@link Settings} provider
      * @param componentName component name of the accessibility feature
      * @param shortcutType  accessibility shortcut type
      */
     public static void logAccessibilityShortcutActivated(Context context,
-            ComponentName componentName, @ShortcutType int shortcutType) {
+            ComponentName componentName, @UserShortcutType int shortcutType) {
         logAccessibilityShortcutActivatedInternal(componentName,
                 convertToLoggingShortcutType(context, shortcutType), UNKNOWN_STATUS);
     }
@@ -87,16 +87,17 @@
     /**
      * Logs accessibility feature name that is assigned to the given {@code shortcutType} and the
      * {@code serviceEnabled} status.
-     * Calls this when clicking the shortcut {@link AccessibilityManager#ACCESSIBILITY_BUTTON}
-     * or {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY}.
+     * Calls this when clicking the shortcut {@link ShortcutConstants.UserShortcutType#SOFTWARE}
+     * or {@link ShortcutConstants.UserShortcutType#HARDWARE}.
      *
      * @param context context used to retrieve the {@link Settings} provider
      * @param componentName  component name of the accessibility feature
      * @param shortcutType   accessibility shortcut type
      * @param serviceEnabled {@code true} if the service is enabled
      */
-    public static void logAccessibilityShortcutActivated(Context context,
-            ComponentName componentName, @ShortcutType int shortcutType, boolean serviceEnabled) {
+    public static void logAccessibilityShortcutActivated(
+            Context context, ComponentName componentName,
+            @UserShortcutType int shortcutType, boolean serviceEnabled) {
         logAccessibilityShortcutActivatedInternal(componentName,
                 convertToLoggingShortcutType(context, shortcutType),
                 convertToLoggingServiceStatus(serviceEnabled));
@@ -235,9 +236,9 @@
     }
 
     private static int convertToLoggingShortcutType(Context context,
-            @ShortcutType int shortcutType) {
+            @UserShortcutType int shortcutType) {
         switch (shortcutType) {
-            case ACCESSIBILITY_BUTTON:
+            case SOFTWARE:
                 if (isAccessibilityFloatingMenuEnabled(context)) {
                     return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_FLOATING_MENU;
                 } else if (isAccessibilityGestureEnabled(context)) {
@@ -245,7 +246,7 @@
                 } else {
                     return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_BUTTON;
                 }
-            case ACCESSIBILITY_SHORTCUT_KEY:
+            case HARDWARE:
                 return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__VOLUME_KEY;
         }
         return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__UNKNOWN_TYPE;
diff --git a/core/java/com/android/internal/accessibility/util/ShortcutUtils.java b/core/java/com/android/internal/accessibility/util/ShortcutUtils.java
index f9c4d37..5b09a8b 100644
--- a/core/java/com/android/internal/accessibility/util/ShortcutUtils.java
+++ b/core/java/com/android/internal/accessibility/util/ShortcutUtils.java
@@ -16,14 +16,10 @@
 
 package com.android.internal.accessibility.util;
 
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
 import static com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType.INVISIBLE_TOGGLE;
 import static com.android.internal.accessibility.common.ShortcutConstants.SERVICES_SEPARATOR;
 import static com.android.internal.accessibility.common.ShortcutConstants.USER_SHORTCUT_TYPES;
-import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.annotation.NonNull;
@@ -33,7 +29,8 @@
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
+
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 
 import java.util.Collections;
 import java.util.List;
@@ -151,7 +148,7 @@
      * @param componentId The component id that need to be checked.
      * @return {@code true} if a component id is contained.
      */
-    public static boolean isShortcutContained(Context context, @ShortcutType int shortcutType,
+    public static boolean isShortcutContained(Context context, @UserShortcutType int shortcutType,
             @NonNull String componentId) {
         final AccessibilityManager am = (AccessibilityManager) context.getSystemService(
                 Context.ACCESSIBILITY_SERVICE);
@@ -184,24 +181,6 @@
     }
 
     /**
-     * Converts {@link ShortcutType} to {@link UserShortcutType}.
-     *
-     * @param type The shortcut type.
-     * @return Mapping type from {@link UserShortcutType}.
-     */
-    public static @UserShortcutType int convertToUserType(@ShortcutType int type) {
-        switch (type) {
-            case ACCESSIBILITY_BUTTON:
-                return UserShortcutType.SOFTWARE;
-            case ACCESSIBILITY_SHORTCUT_KEY:
-                return UserShortcutType.HARDWARE;
-            default:
-                throw new IllegalArgumentException(
-                        "Unsupported shortcut type:" + type);
-        }
-    }
-
-    /**
      * Updates an accessibility state if the accessibility service is a Always-On a11y service,
      * a.k.a. AccessibilityServices that has FLAG_REQUEST_ACCESSIBILITY_BUTTON
      * <p>
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 5f688f6..99b3f9a 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -43,14 +43,16 @@
     void noteStartVideo(int uid);
     @EnforcePermission("UPDATE_DEVICE_STATS")
     void noteStopVideo(int uid);
+    // The audio battery stats interface is oneway to prevent inversion. These calls
+    // are ordered with respect to each other, but not with any other calls.
     @EnforcePermission("UPDATE_DEVICE_STATS")
-    void noteStartAudio(int uid);
+    oneway void noteStartAudio(int uid);
     @EnforcePermission("UPDATE_DEVICE_STATS")
-    void noteStopAudio(int uid);
+    oneway void noteStopAudio(int uid);
     @EnforcePermission("UPDATE_DEVICE_STATS")
     void noteResetVideo();
     @EnforcePermission("UPDATE_DEVICE_STATS")
-    void noteResetAudio();
+    oneway void noteResetAudio();
     @EnforcePermission("UPDATE_DEVICE_STATS")
     void noteFlashlightOn(int uid);
     @EnforcePermission("UPDATE_DEVICE_STATS")
diff --git a/core/java/com/android/internal/app/IntentForwarderActivity.java b/core/java/com/android/internal/app/IntentForwarderActivity.java
index 6bd273b..4f55441 100644
--- a/core/java/com/android/internal/app/IntentForwarderActivity.java
+++ b/core/java/com/android/internal/app/IntentForwarderActivity.java
@@ -28,6 +28,7 @@
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 
 import static com.android.internal.app.ResolverActivity.EXTRA_CALLING_USER;
+import static com.android.internal.app.ResolverActivity.EXTRA_RESTRICT_TO_SINGLE_USER;
 import static com.android.internal.app.ResolverActivity.EXTRA_SELECTED_PROFILE;
 
 import android.annotation.Nullable;
@@ -190,7 +191,7 @@
                 .thenApplyAsync(targetResolveInfo -> {
                     if (isResolverActivityResolveInfo(targetResolveInfo)) {
                         launchResolverActivityWithCorrectTab(intentReceived, className, newIntent,
-                                callingUserId, targetUserId);
+                                callingUserId, targetUserId, false);
                     // When switching to the personal profile, automatically start the activity
                     } else if (className.equals(FORWARD_INTENT_TO_PARENT)) {
                         startActivityAsCaller(newIntent, targetUserId);
@@ -218,7 +219,7 @@
                 .thenAcceptAsync(targetResolveInfo -> {
                     if (isResolverActivityResolveInfo(targetResolveInfo)) {
                         launchResolverActivityWithCorrectTab(intentReceived, className, newIntent,
-                                callingUserId, targetUserId);
+                                callingUserId, targetUserId, true);
                     } else {
                         maybeShowUserConsentMiniResolverPrivate(targetResolveInfo, newIntent,
                                 targetUserId);
@@ -490,7 +491,7 @@
     }
 
     private void launchResolverActivityWithCorrectTab(Intent intentReceived, String className,
-            Intent newIntent, int callingUserId, int targetUserId) {
+            Intent newIntent, int callingUserId, int targetUserId, boolean singleTabOnly) {
         // When showing the intent resolver, instead of forwarding to the other profile,
         // we launch it in the current user and select the other tab. This fixes b/155874820.
         //
@@ -505,6 +506,9 @@
         sanitizeIntent(intentReceived);
         intentReceived.putExtra(EXTRA_SELECTED_PROFILE, selectedProfile);
         intentReceived.putExtra(EXTRA_CALLING_USER, UserHandle.of(callingUserId));
+        if (singleTabOnly) {
+            intentReceived.putExtra(EXTRA_RESTRICT_TO_SINGLE_USER, true);
+        }
         startActivityAsCaller(intentReceived, null, false, userId);
         finish();
     }
diff --git a/core/java/com/android/internal/app/SuspendedAppActivity.java b/core/java/com/android/internal/app/SuspendedAppActivity.java
index 751368f..7a8a47e 100644
--- a/core/java/com/android/internal/app/SuspendedAppActivity.java
+++ b/core/java/com/android/internal/app/SuspendedAppActivity.java
@@ -16,7 +16,7 @@
 
 package com.android.internal.app;
 
-import static android.app.admin.flags.Flags.crossUserSuspensionEnabled;
+import static android.app.admin.flags.Flags.crossUserSuspensionEnabledRo;
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
 import static android.content.pm.SuspendDialogInfo.BUTTON_ACTION_MORE_DETAILS;
@@ -234,7 +234,7 @@
         }
         mSuspendedPackage = intent.getStringExtra(EXTRA_SUSPENDED_PACKAGE);
         mSuspendingPackage = intent.getStringExtra(EXTRA_SUSPENDING_PACKAGE);
-        if (crossUserSuspensionEnabled()) {
+        if (crossUserSuspensionEnabledRo()) {
             mSuspendingUserId = intent.getIntExtra(EXTRA_SUSPENDING_USER, mUserId);
         } else {
             mSuspendingUserId = mUserId;
@@ -373,7 +373,7 @@
                 .putExtra(Intent.EXTRA_USER_ID, userId)
                 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                         | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-        if (crossUserSuspensionEnabled()) {
+        if (crossUserSuspensionEnabledRo() && suspendingPackage != null) {
             intent.putExtra(EXTRA_SUSPENDING_USER, suspendingPackage.userId);
         }
         return intent;
diff --git a/core/java/com/android/internal/compat/Android.bp b/core/java/com/android/internal/compat/Android.bp
index 9ff05a6..8253aa8 100644
--- a/core/java/com/android/internal/compat/Android.bp
+++ b/core/java/com/android/internal/compat/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "compat_logging_flags",
     package: "com.android.internal.compat.flags",
+    container: "system",
     srcs: [
         "compat_logging_flags.aconfig",
     ],
diff --git a/core/java/com/android/internal/compat/compat_logging_flags.aconfig b/core/java/com/android/internal/compat/compat_logging_flags.aconfig
index a5c31ed..4f51626 100644
--- a/core/java/com/android/internal/compat/compat_logging_flags.aconfig
+++ b/core/java/com/android/internal/compat/compat_logging_flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.internal.compat.flags"
+container: "system"
 
 flag {
     name: "skip_old_and_disabled_compat_logging"
@@ -6,4 +7,4 @@
     description: "Feature flag for skipping debug logging for changes that do not target the latest sdk or are disabled"
     bug: "323949942"
     is_fixed_read_only: true
-}
\ No newline at end of file
+}
diff --git a/core/java/com/android/internal/foldables/Android.bp b/core/java/com/android/internal/foldables/Android.bp
index f1d06da..53a9be5 100644
--- a/core/java/com/android/internal/foldables/Android.bp
+++ b/core/java/com/android/internal/foldables/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "fold_lock_setting_flags",
     package: "com.android.internal.foldables.flags",
+    container: "system",
     srcs: [
         "fold_lock_setting_flags.aconfig",
     ],
diff --git a/core/java/com/android/internal/foldables/fold_lock_setting_flags.aconfig b/core/java/com/android/internal/foldables/fold_lock_setting_flags.aconfig
index d73e623..03b6a5b 100644
--- a/core/java/com/android/internal/foldables/fold_lock_setting_flags.aconfig
+++ b/core/java/com/android/internal/foldables/fold_lock_setting_flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.internal.foldables.flags"
+container: "system"
 
 flag {
     name: "fold_lock_setting_enabled"
diff --git a/core/java/com/android/internal/inputmethod/IImeTracker.aidl b/core/java/com/android/internal/inputmethod/IImeTracker.aidl
index b45bc1c..ab4edb6 100644
--- a/core/java/com/android/internal/inputmethod/IImeTracker.aidl
+++ b/core/java/com/android/internal/inputmethod/IImeTracker.aidl
@@ -86,4 +86,13 @@
     @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
             + "android.Manifest.permission.TEST_INPUT_METHOD)")
     boolean hasPendingImeVisibilityRequests();
+
+    /**
+     * Finishes the tracking of any pending IME visibility requests. This won't stop the actual
+     * requests, but allows resetting the state when starting up test runs.
+     */
+    @EnforcePermission("TEST_INPUT_METHOD")
+    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
+            + "android.Manifest.permission.TEST_INPUT_METHOD)")
+    oneway void finishTrackingPendingImeVisibilityRequests();
 }
diff --git a/core/java/com/android/internal/jank/Cuj.java b/core/java/com/android/internal/jank/Cuj.java
index d2a533c..f2d2c1b 100644
--- a/core/java/com/android/internal/jank/Cuj.java
+++ b/core/java/com/android/internal/jank/Cuj.java
@@ -127,10 +127,17 @@
     public static final int CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE = 91;
     public static final int CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR = 92;
     public static final int CUJ_LAUNCHER_SAVE_APP_PAIR = 93;
+    public static final int CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK = 95;
+    public static final int CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK = 96;
+    public static final int CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK = 97;
+    public static final int CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK = 98;
+    public static final int CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK = 99;
+    public static final int CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK = 100;
+    public static final int CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK = 101;
 
     // When adding a CUJ, update this and make sure to also update CUJ_TO_STATSD_INTERACTION_TYPE.
     @VisibleForTesting
-    static final int LAST_CUJ = CUJ_LAUNCHER_SAVE_APP_PAIR;
+    static final int LAST_CUJ = CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK;
 
     /** @hide */
     @IntDef({
@@ -217,7 +224,13 @@
             CUJ_LAUNCHER_SEARCH_QSB_WEB_SEARCH,
             CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE,
             CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR,
-            CUJ_LAUNCHER_SAVE_APP_PAIR
+            CUJ_LAUNCHER_SAVE_APP_PAIR,
+            CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK,
+            CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK,
+            CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK,
+            CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK,
+            CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK,
+            CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface CujType {
@@ -315,6 +328,13 @@
         CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE;
         CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR;
         CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_SAVE_APP_PAIR] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_SAVE_APP_PAIR;
+        CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_ALL_APPS_SEARCH_BACK;
+        CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK;
+        CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK;
+        CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_WIDGET_PICKER_CLOSE_BACK;
+        CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_WIDGET_PICKER_SEARCH_BACK;
+        CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK;
+        CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK;
     }
 
     private Cuj() {
@@ -499,6 +519,20 @@
                 return "LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR";
             case CUJ_LAUNCHER_SAVE_APP_PAIR:
                 return "LAUNCHER_SAVE_APP_PAIR";
+            case CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK:
+                return "LAUNCHER_ALL_APPS_SEARCH_BACK";
+            case CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK:
+                return "LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK";
+            case CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK:
+                return "LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK";
+            case CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK:
+                return "LAUNCHER_WIDGET_PICKER_CLOSE_BACK";
+            case CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK:
+                return "LAUNCHER_WIDGET_PICKER_SEARCH_BACK";
+            case CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK:
+                return "LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK";
+            case CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK:
+                return "LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK";
         }
         return "UNKNOWN";
     }
diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java
index a288fb7..b86cbfb 100644
--- a/core/java/com/android/internal/jank/InteractionJankMonitor.java
+++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java
@@ -168,6 +168,13 @@
     @Deprecated public static final int CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE = Cuj.CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE;
     @Deprecated public static final int CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR = Cuj.CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR;
     @Deprecated public static final int CUJ_LAUNCHER_SAVE_APP_PAIR = Cuj.CUJ_LAUNCHER_SAVE_APP_PAIR;
+    @Deprecated public static final int CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK = Cuj.CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK;
+    @Deprecated public static final int CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK = Cuj.CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK;
+    @Deprecated public static final int CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK = Cuj.CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK;
+    @Deprecated public static final int CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK = Cuj.CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK;
+    @Deprecated public static final int CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK = Cuj.CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK;
+    @Deprecated public static final int CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK = Cuj.CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK;
+    @Deprecated public static final int CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK = Cuj.CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK;
 
     private static class InstanceHolder {
         public static final InteractionJankMonitor INSTANCE =
diff --git a/core/java/com/android/internal/net/ConnectivityBlobStore.java b/core/java/com/android/internal/net/ConnectivityBlobStore.java
index 1b18485..f8eb5be 100644
--- a/core/java/com/android/internal/net/ConnectivityBlobStore.java
+++ b/core/java/com/android/internal/net/ConnectivityBlobStore.java
@@ -19,6 +19,7 @@
 import android.annotation.NonNull;
 import android.content.ContentValues;
 import android.database.Cursor;
+import android.database.DatabaseUtils;
 import android.database.SQLException;
 import android.database.sqlite.SQLiteDatabase;
 import android.os.Binder;
@@ -153,8 +154,11 @@
         final List<String> names = new ArrayList<String>();
         try (Cursor cursor = mDb.query(TABLENAME,
                 new String[] {"name"} /* columns */,
-                "owner=? AND name LIKE ?" /* selection */,
-                new String[] {Integer.toString(ownerUid), prefix + "%"} /* selectionArgs */,
+                "owner=? AND name LIKE ? ESCAPE '\\'" /* selection */,
+                new String[] {
+                        Integer.toString(ownerUid),
+                        DatabaseUtils.escapeForLike(prefix) + "%"
+                } /* selectionArgs */,
                 null /* groupBy */,
                 null /* having */,
                 "name ASC" /* orderBy */)) {
diff --git a/core/java/com/android/internal/os/BinderInternal.java b/core/java/com/android/internal/os/BinderInternal.java
index c14d8d8..8063be6 100644
--- a/core/java/com/android/internal/os/BinderInternal.java
+++ b/core/java/com/android/internal/os/BinderInternal.java
@@ -45,8 +45,8 @@
     static ArrayList<Runnable> sGcWatchers = new ArrayList<>();
     static Runnable[] sTmpWatchers = new Runnable[1];
     static long sLastGcTime;
-    static final BinderProxyLimitListenerDelegate sBinderProxyLimitListenerDelegate =
-            new BinderProxyLimitListenerDelegate();
+    static final BinderProxyCountEventListenerDelegate sBinderProxyCountEventListenerDelegate =
+            new BinderProxyCountEventListenerDelegate();
 
     static final class GcWatcher {
         @Override
@@ -226,15 +226,24 @@
      * @param low   The threshold a binder count must drop below before the callback
      *              can be called again. (This is to avoid many repeated calls to the
      *              callback in a brief period of time)
+     * @param warning The threshold between {@code high} and {@code low} where if the binder count
+     *                exceeds that, the warning callback would be triggered.
      */
-    public static final native void nSetBinderProxyCountWatermarks(int high, int low);
+    public static final native void nSetBinderProxyCountWatermarks(int high, int low, int warning);
 
     /**
      * Interface for callback invocation when the Binder Proxy limit is reached. onLimitReached will
      * be called with the uid of the app causing too many Binder Proxies
      */
-    public interface BinderProxyLimitListener {
+    public interface BinderProxyCountEventListener {
         public void onLimitReached(int uid);
+
+        /**
+         * Call when the number of binder proxies from the uid of the app reaches
+         * the warning threshold.
+         */
+        default void onWarningThresholdReached(int uid) {
+        }
     }
 
     /**
@@ -243,7 +252,17 @@
      * @param uid The uid of the bad behaving app sending too many binders
      */
     public static void binderProxyLimitCallbackFromNative(int uid) {
-       sBinderProxyLimitListenerDelegate.notifyClient(uid);
+        sBinderProxyCountEventListenerDelegate.notifyLimitReached(uid);
+    }
+
+    /**
+     * Callback used by native code to trigger a callback in java code. The callback will be
+     * triggered when too many binder proxies from a uid hits the warning limit.
+     * @param uid The uid of the bad behaving app sending too many binders
+     */
+    @SuppressWarnings("unused")
+    public static void binderProxyWarningCallbackFromNative(int uid) {
+        sBinderProxyCountEventListenerDelegate.notifyWarningReached(uid);
     }
 
     /**
@@ -252,41 +271,45 @@
      * @param handler must not be null, callback will be posted through the handler;
      *
      */
-    public static void setBinderProxyCountCallback(BinderProxyLimitListener listener,
+    public static void setBinderProxyCountCallback(BinderProxyCountEventListener listener,
             @NonNull Handler handler) {
         Preconditions.checkNotNull(handler,
                 "Must provide NonNull Handler to setBinderProxyCountCallback when setting "
-                        + "BinderProxyLimitListener");
-        sBinderProxyLimitListenerDelegate.setListener(listener, handler);
+                        + "BinderProxyCountEventListener");
+        sBinderProxyCountEventListenerDelegate.setListener(listener, handler);
     }
 
     /**
      * Clear the Binder Proxy callback
      */
     public static void clearBinderProxyCountCallback() {
-        sBinderProxyLimitListenerDelegate.setListener(null, null);
+        sBinderProxyCountEventListenerDelegate.setListener(null, null);
     }
 
-    static private class BinderProxyLimitListenerDelegate {
-        private BinderProxyLimitListener mBinderProxyLimitListener;
+    private static class BinderProxyCountEventListenerDelegate {
+        private BinderProxyCountEventListener mBinderProxyCountEventListener;
         private Handler mHandler;
 
-        void setListener(BinderProxyLimitListener listener, Handler handler) {
+        void setListener(BinderProxyCountEventListener listener, Handler handler) {
             synchronized (this) {
-                mBinderProxyLimitListener = listener;
+                mBinderProxyCountEventListener = listener;
                 mHandler = handler;
             }
         }
 
-        void notifyClient(final int uid) {
+        void notifyLimitReached(final int uid) {
             synchronized (this) {
-                if (mBinderProxyLimitListener != null) {
-                    mHandler.post(new Runnable() {
-                        @Override
-                        public void run() {
-                            mBinderProxyLimitListener.onLimitReached(uid);
-                        }
-                    });
+                if (mBinderProxyCountEventListener != null) {
+                    mHandler.post(() -> mBinderProxyCountEventListener.onLimitReached(uid));
+                }
+            }
+        }
+
+        void notifyWarningReached(final int uid) {
+            synchronized (this) {
+                if (mBinderProxyCountEventListener != null) {
+                    mHandler.post(() ->
+                            mBinderProxyCountEventListener.onWarningThresholdReached(uid));
                 }
             }
         }
diff --git a/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java b/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java
index e1aff2a..b316a01 100644
--- a/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java
+++ b/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java
@@ -421,8 +421,6 @@
     @NonNull
     private String[] mUsesStaticLibrariesSorted;
 
-    private boolean mAppMetadataFileInApk = false;
-
     @NonNull
     public static PackageImpl forParsing(@NonNull String packageName, @NonNull String baseCodePath,
             @NonNull String codePath, @NonNull TypedArray manifestArray, boolean isCoreApp,
@@ -1065,11 +1063,6 @@
         return memtagMode;
     }
 
-    @Override
-    public boolean isAppMetadataFileInApk() {
-        return mAppMetadataFileInApk;
-    }
-
     @Nullable
     @Override
     public Bundle getMetaData() {
@@ -2158,12 +2151,6 @@
     }
 
     @Override
-    public PackageImpl setAppMetadataFileInApk(boolean fileInApk) {
-        mAppMetadataFileInApk = fileInApk;
-        return this;
-    }
-
-    @Override
     public PackageImpl setMetaData(@Nullable Bundle value) {
         metaData = value;
         return this;
@@ -3277,7 +3264,6 @@
         dest.writeLong(this.mBooleans);
         dest.writeLong(this.mBooleans2);
         dest.writeBoolean(this.mAllowCrossUidActivitySwitchFromBelow);
-        dest.writeBoolean(this.mAppMetadataFileInApk);
     }
 
     public PackageImpl(Parcel in) {
@@ -3445,7 +3431,6 @@
         this.mBooleans = in.readLong();
         this.mBooleans2 = in.readLong();
         this.mAllowCrossUidActivitySwitchFromBelow = in.readBoolean();
-        this.mAppMetadataFileInApk = in.readBoolean();
 
         assignDerivedFields();
         assignDerivedFields2();
diff --git a/core/java/com/android/internal/pm/parsing/pkg/ParsedPackage.java b/core/java/com/android/internal/pm/parsing/pkg/ParsedPackage.java
index 3c26a7c..66cfb69 100644
--- a/core/java/com/android/internal/pm/parsing/pkg/ParsedPackage.java
+++ b/core/java/com/android/internal/pm/parsing/pkg/ParsedPackage.java
@@ -127,7 +127,4 @@
     ParsedPackage setDirectBootAware(boolean directBootAware);
 
     ParsedPackage setPersistent(boolean persistent);
-
-    /** Retrieves whether the apk contains a app metadata file. */
-    boolean isAppMetadataFileInApk();
 }
diff --git a/core/java/com/android/internal/pm/pkg/parsing/ParsingPackage.java b/core/java/com/android/internal/pm/pkg/parsing/ParsingPackage.java
index 5ab17a6..5d185af 100644
--- a/core/java/com/android/internal/pm/pkg/parsing/ParsingPackage.java
+++ b/core/java/com/android/internal/pm/pkg/parsing/ParsingPackage.java
@@ -133,9 +133,6 @@
             @Nullable SparseArray<int[]> splitDependencies
     );
 
-    /** Sets whether the apk contains a app metadata file. */
-    ParsingPackage setAppMetadataFileInApk(boolean fileInApk);
-
     ParsingPackage setMetaData(Bundle metaData);
 
     ParsingPackage setForceQueryable(boolean forceQueryable);
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 95ecd47..e12becd 100644
--- a/core/java/com/android/internal/pm/pkg/parsing/ParsingPackageUtils.java
+++ b/core/java/com/android/internal/pm/pkg/parsing/ParsingPackageUtils.java
@@ -46,7 +46,6 @@
 import android.content.pm.ConfigurationInfo;
 import android.content.pm.FeatureGroupInfo;
 import android.content.pm.FeatureInfo;
-import android.content.pm.Flags;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.Property;
@@ -134,7 +133,6 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.security.PublicKey;
@@ -165,8 +163,6 @@
      */
     public static final String ANDROID_MANIFEST_FILENAME = "AndroidManifest.xml";
 
-    public static final String APP_METADATA_FILE_NAME = "app.metadata";
-
     /**
      * Path prefix for apps on expanded storage
      */
@@ -411,8 +407,10 @@
      */
     private ParseResult<ParsingPackage> parseMonolithicPackage(ParseInput input, File apkFile,
             int flags) {
+        // The signature parsing will be done later in method parseBaseApk.
+        int liteParseFlags = flags & ~PARSE_COLLECT_CERTIFICATES;
         final ParseResult<PackageLite> liteResult =
-                ApkLiteParseUtils.parseMonolithicPackageLite(input, apkFile, flags);
+                ApkLiteParseUtils.parseMonolithicPackageLite(input, apkFile, liteParseFlags);
         if (liteResult.isError()) {
             return input.error(liteResult);
         }
@@ -640,12 +638,6 @@
                 pkg.setSigningDetails(SigningDetails.UNKNOWN);
             }
 
-            if (Flags.aslInApkAppMetadataSource()) {
-                try (InputStream in = assets.open(APP_METADATA_FILE_NAME)) {
-                    pkg.setAppMetadataFileInApk(true);
-                } catch (Exception e) { }
-            }
-
             return input.success(pkg);
         } catch (Exception e) {
             return input.error(INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION,
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index 9868ceb..e6a2a6c 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -22,6 +22,8 @@
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
 import static android.view.WindowInsetsController.APPEARANCE_FORCE_LIGHT_NAVIGATION_BARS;
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS;
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
 import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
 import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN;
 import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
@@ -365,8 +367,6 @@
 
     private boolean mUseDecorContext = false;
 
-    private boolean mIsFrameRatePowerSavingsBalanced = true;
-
     /** @see ViewRootImpl#mActivityConfigCallback */
     private ActivityConfigCallback mActivityConfigCallback;
 
@@ -2216,7 +2216,6 @@
     void onViewRootImplSet(ViewRootImpl viewRoot) {
         viewRoot.setActivityConfigCallback(mActivityConfigCallback);
         viewRoot.getOnBackInvokedDispatcher().updateContext(getContext());
-        viewRoot.setFrameRatePowerSavingsBalanced(mIsFrameRatePowerSavingsBalanced);
         mProxyOnBackInvokedDispatcher.setActualDispatcher(viewRoot.getOnBackInvokedDispatcher());
         applyDecorFitsSystemWindows();
     }
@@ -2566,8 +2565,11 @@
             requestFeature(FEATURE_ACTIVITY_TRANSITIONS);
         }
         if (a.hasValue(R.styleable.Window_windowIsFrameRatePowerSavingsBalanced)) {
-            mIsFrameRatePowerSavingsBalanced =
-                    a.getBoolean(R.styleable.Window_windowIsFrameRatePowerSavingsBalanced, true);
+            if (sToolkitSetFrameRateReadOnlyFlagValue) {
+                setFrameRatePowerSavingsBalanced(
+                        a.getBoolean(R.styleable.Window_windowIsFrameRatePowerSavingsBalanced,
+                                true));
+            }
         }
 
         mIsTranslucent = a.getBoolean(R.styleable.Window_windowIsTranslucent, false);
@@ -2628,15 +2630,24 @@
                 false)) {
             params.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION;
         }
-        final int sysUiVis = decor.getSystemUiVisibility();
-        final int statusLightFlag = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
-        final int statusFlag = a.getBoolean(R.styleable.Window_windowLightStatusBar, false)
-                ? statusLightFlag : 0;
-        final int navLightFlag = View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
-        final int navFlag = a.getBoolean(R.styleable.Window_windowLightNavigationBar, false)
-                ? navLightFlag : 0;
+
+        final boolean lightStatus = a.getBoolean(R.styleable.Window_windowLightStatusBar, false);
+        final boolean lightNav = a.getBoolean(R.styleable.Window_windowLightNavigationBar, false);
+
+        // Here still sets the light bar flags via setSystemUiVisibility (even it is deprecated) to
+        // make the light bar state be able to be read from the legacy method.
         decor.setSystemUiVisibility(
-                (sysUiVis & ~(statusLightFlag | navLightFlag)) | (statusFlag | navFlag));
+                (decor.getSystemUiVisibility()
+                        & ~(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
+                                | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR))
+                | (lightStatus ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : 0)
+                | (lightNav ? View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR : 0));
+
+        decor.getWindowInsetsController().setSystemBarsAppearanceFromResource(
+                (lightStatus ? APPEARANCE_LIGHT_STATUS_BARS : 0)
+                        | (lightNav ? APPEARANCE_LIGHT_NAVIGATION_BARS : 0),
+                APPEARANCE_LIGHT_STATUS_BARS | APPEARANCE_LIGHT_NAVIGATION_BARS);
+
         if (a.hasValue(R.styleable.Window_windowLayoutInDisplayCutoutMode)) {
             int mode = a.getInt(R.styleable.Window_windowLayoutInDisplayCutoutMode, -1);
             if (mode < LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
@@ -3945,6 +3956,9 @@
 
     @Override
     public int getNavigationBarColor() {
+        if (mEdgeToEdgeEnforced) {
+            return Color.TRANSPARENT;
+        }
         return mNavigationBarColor;
     }
 
diff --git a/core/java/com/android/internal/protolog/LegacyProtoLogImpl.java b/core/java/com/android/internal/protolog/LegacyProtoLogImpl.java
index 2096ba4..d244874 100644
--- a/core/java/com/android/internal/protolog/LegacyProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/LegacyProtoLogImpl.java
@@ -66,6 +66,7 @@
     private final TraceBuffer mBuffer;
     private final LegacyProtoLogViewerConfigReader mViewerConfig;
     private final TreeMap<String, IProtoLogGroup> mLogGroups;
+    private final Runnable mCacheUpdater;
     private final int mPerChunkSize;
 
     private boolean mProtoLogEnabled;
@@ -73,20 +74,21 @@
     private final Object mProtoLogEnabledLock = new Object();
 
     public LegacyProtoLogImpl(String outputFile, String viewerConfigFilename,
-            TreeMap<String, IProtoLogGroup> logGroups) {
+            TreeMap<String, IProtoLogGroup> logGroups, Runnable cacheUpdater) {
         this(new File(outputFile), viewerConfigFilename, BUFFER_CAPACITY,
-                new LegacyProtoLogViewerConfigReader(), PER_CHUNK_SIZE, logGroups);
+                new LegacyProtoLogViewerConfigReader(), PER_CHUNK_SIZE, logGroups, cacheUpdater);
     }
 
     public LegacyProtoLogImpl(File file, String viewerConfigFilename, int bufferCapacity,
             LegacyProtoLogViewerConfigReader viewerConfig, int perChunkSize,
-            TreeMap<String, IProtoLogGroup> logGroups) {
+            TreeMap<String, IProtoLogGroup> logGroups, Runnable cacheUpdater) {
         mLogFile = file;
         mBuffer = new TraceBuffer(bufferCapacity);
         mLegacyViewerConfigFilename = viewerConfigFilename;
         mViewerConfig = viewerConfig;
         mPerChunkSize = perChunkSize;
-        this.mLogGroups = logGroups;
+        mLogGroups = logGroups;
+        mCacheUpdater = cacheUpdater;
     }
 
     /**
@@ -285,6 +287,8 @@
                 return -1;
             }
         }
+
+        mCacheUpdater.run();
         return 0;
     }
 
@@ -399,5 +403,12 @@
     public int stopLoggingToLogcat(String[] groups, ILogger logger) {
         return setLogging(true /* setTextLogging */, false, logger, groups);
     }
+
+    @Override
+    public boolean isEnabled(IProtoLogGroup group, LogLevel level) {
+        // In legacy logging we just enable an entire group at a time without more granular control,
+        // so we ignore the level argument to this function.
+        return group.isLogToLogcat() || (group.isLogToProto() && isProtoEnabled());
+    }
 }
 
diff --git a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
index 4ead82f..fca4e91 100644
--- a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
@@ -16,33 +16,34 @@
 
 package com.android.internal.protolog;
 
-import static perfetto.protos.PerfettoTrace.InternedData.PROTOLOG_STACKTRACE;
-import static perfetto.protos.PerfettoTrace.InternedData.PROTOLOG_STRING_ARGS;
-import static perfetto.protos.PerfettoTrace.InternedString.IID;
-import static perfetto.protos.PerfettoTrace.InternedString.STR;
-import static perfetto.protos.PerfettoTrace.ProtoLogMessage.BOOLEAN_PARAMS;
-import static perfetto.protos.PerfettoTrace.ProtoLogMessage.DOUBLE_PARAMS;
-import static perfetto.protos.PerfettoTrace.ProtoLogMessage.MESSAGE_ID;
-import static perfetto.protos.PerfettoTrace.ProtoLogMessage.SINT64_PARAMS;
-import static perfetto.protos.PerfettoTrace.ProtoLogMessage.STACKTRACE_IID;
-import static perfetto.protos.PerfettoTrace.ProtoLogMessage.STR_PARAM_IIDS;
-import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.GROUPS;
-import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.Group.ID;
-import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.Group.NAME;
-import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.Group.TAG;
-import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MESSAGES;
-import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.GROUP_ID;
-import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.LEVEL;
-import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.MESSAGE;
-import static perfetto.protos.PerfettoTrace.TracePacket.INTERNED_DATA;
-import static perfetto.protos.PerfettoTrace.TracePacket.PROTOLOG_MESSAGE;
-import static perfetto.protos.PerfettoTrace.TracePacket.PROTOLOG_VIEWER_CONFIG;
-import static perfetto.protos.PerfettoTrace.TracePacket.SEQUENCE_FLAGS;
-import static perfetto.protos.PerfettoTrace.TracePacket.SEQ_INCREMENTAL_STATE_CLEARED;
-import static perfetto.protos.PerfettoTrace.TracePacket.SEQ_NEEDS_INCREMENTAL_STATE;
-import static perfetto.protos.PerfettoTrace.TracePacket.TIMESTAMP;
+import static android.internal.perfetto.protos.PerfettoTrace.InternedData.PROTOLOG_STACKTRACE;
+import static android.internal.perfetto.protos.PerfettoTrace.InternedData.PROTOLOG_STRING_ARGS;
+import static android.internal.perfetto.protos.PerfettoTrace.InternedString.IID;
+import static android.internal.perfetto.protos.PerfettoTrace.InternedString.STR;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogMessage.BOOLEAN_PARAMS;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogMessage.DOUBLE_PARAMS;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogMessage.MESSAGE_ID;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogMessage.SINT64_PARAMS;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogMessage.STACKTRACE_IID;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogMessage.STR_PARAM_IIDS;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.GROUPS;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.Group.ID;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.Group.NAME;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.Group.TAG;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MESSAGES;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.GROUP_ID;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.LEVEL;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.MESSAGE;
+import static android.internal.perfetto.protos.PerfettoTrace.TracePacket.INTERNED_DATA;
+import static android.internal.perfetto.protos.PerfettoTrace.TracePacket.PROTOLOG_MESSAGE;
+import static android.internal.perfetto.protos.PerfettoTrace.TracePacket.PROTOLOG_VIEWER_CONFIG;
+import static android.internal.perfetto.protos.PerfettoTrace.TracePacket.SEQUENCE_FLAGS;
+import static android.internal.perfetto.protos.PerfettoTrace.TracePacket.SEQ_INCREMENTAL_STATE_CLEARED;
+import static android.internal.perfetto.protos.PerfettoTrace.TracePacket.SEQ_NEEDS_INCREMENTAL_STATE;
+import static android.internal.perfetto.protos.PerfettoTrace.TracePacket.TIMESTAMP;
 
 import android.annotation.Nullable;
+import android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData;
 import android.os.ShellCommand;
 import android.os.SystemClock;
 import android.os.Trace;
@@ -51,6 +52,8 @@
 import android.tracing.perfetto.InitArguments;
 import android.tracing.perfetto.Producer;
 import android.tracing.perfetto.TracingContext;
+import android.util.ArrayMap;
+import android.util.Log;
 import android.util.LongArray;
 import android.util.Slog;
 import android.util.proto.ProtoInputStream;
@@ -65,17 +68,17 @@
 
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Map;
+import java.util.Set;
 import java.util.TreeMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData;
-
 /**
  * A service for the ProtoLog logging system.
  */
@@ -84,18 +87,22 @@
     private final AtomicInteger mTracingInstances = new AtomicInteger();
 
     private final ProtoLogDataSource mDataSource = new ProtoLogDataSource(
-            this.mTracingInstances::incrementAndGet,
+            this::onTracingInstanceStart,
             this::dumpTransitionTraceConfig,
-            this.mTracingInstances::decrementAndGet
+            this::onTracingInstanceStop
     );
     private final ProtoLogViewerConfigReader mViewerConfigReader;
     private final ViewerConfigInputStreamProvider mViewerConfigInputStreamProvider;
     private final TreeMap<String, IProtoLogGroup> mLogGroups;
+    private final Runnable mCacheUpdater;
+
+    private final Map<LogLevel, Integer> mDefaultLogLevelCounts = new ArrayMap<>();
+    private final Map<IProtoLogGroup, Map<LogLevel, Integer>> mLogLevelCounts = new ArrayMap<>();
 
     private final ExecutorService mBackgroundLoggingService = Executors.newCachedThreadPool();
 
     public PerfettoProtoLogImpl(String viewerConfigFilePath,
-            TreeMap<String, IProtoLogGroup> logGroups) {
+            TreeMap<String, IProtoLogGroup> logGroups, Runnable cacheUpdater) {
         this(() -> {
             try {
                 return new ProtoInputStream(new FileInputStream(viewerConfigFilePath));
@@ -103,28 +110,32 @@
                 Slog.w(LOG_TAG, "Failed to load viewer config file " + viewerConfigFilePath, e);
                 return null;
             }
-        }, logGroups);
+        }, logGroups, cacheUpdater);
     }
 
     public PerfettoProtoLogImpl(
             ViewerConfigInputStreamProvider viewerConfigInputStreamProvider,
-            TreeMap<String, IProtoLogGroup> logGroups
+            TreeMap<String, IProtoLogGroup> logGroups,
+            Runnable cacheUpdater
     ) {
         this(viewerConfigInputStreamProvider,
-                new ProtoLogViewerConfigReader(viewerConfigInputStreamProvider), logGroups);
+                new ProtoLogViewerConfigReader(viewerConfigInputStreamProvider), logGroups,
+                cacheUpdater);
     }
 
     @VisibleForTesting
     public PerfettoProtoLogImpl(
             ViewerConfigInputStreamProvider viewerConfigInputStreamProvider,
             ProtoLogViewerConfigReader viewerConfigReader,
-            TreeMap<String, IProtoLogGroup> logGroups
+            TreeMap<String, IProtoLogGroup> logGroups,
+            Runnable cacheUpdater
     ) {
         Producer.init(InitArguments.DEFAULTS);
         mDataSource.register(DataSourceParams.DEFAULTS);
         this.mViewerConfigInputStreamProvider = viewerConfigInputStreamProvider;
         this.mViewerConfigReader = viewerConfigReader;
         this.mLogGroups = logGroups;
+        this.mCacheUpdater = cacheUpdater;
     }
 
     /**
@@ -157,78 +168,92 @@
         }
 
         mDataSource.trace(ctx -> {
-            final ProtoOutputStream os = ctx.newTracePacket();
+            try {
+                final ProtoOutputStream os = ctx.newTracePacket();
 
-            os.write(TIMESTAMP, SystemClock.elapsedRealtimeNanos());
+                os.write(TIMESTAMP, SystemClock.elapsedRealtimeNanos());
 
-            final long outProtologViewerConfigToken = os.start(PROTOLOG_VIEWER_CONFIG);
-            while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) {
-                if (pis.getFieldNumber() == (int) MESSAGES) {
-                    final long inMessageToken = pis.start(MESSAGES);
-                    final long outMessagesToken = os.start(MESSAGES);
-
-                    while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) {
-                        switch (pis.getFieldNumber()) {
-                            case (int) MessageData.MESSAGE_ID:
-                                os.write(MessageData.MESSAGE_ID,
-                                        pis.readLong(MessageData.MESSAGE_ID));
-                                break;
-                            case (int) MESSAGE:
-                                os.write(MESSAGE, pis.readString(MESSAGE));
-                                break;
-                            case (int) LEVEL:
-                                os.write(LEVEL, pis.readInt(LEVEL));
-                                break;
-                            case (int) GROUP_ID:
-                                os.write(GROUP_ID, pis.readInt(GROUP_ID));
-                                break;
-                            default:
-                                throw new RuntimeException(
-                                        "Unexpected field id " + pis.getFieldNumber());
-                        }
+                final long outProtologViewerConfigToken = os.start(PROTOLOG_VIEWER_CONFIG);
+                while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) {
+                    if (pis.getFieldNumber() == (int) MESSAGES) {
+                        writeViewerConfigMessage(pis, os);
                     }
 
-                    pis.end(inMessageToken);
-                    os.end(outMessagesToken);
-                }
-
-                if (pis.getFieldNumber() == (int) GROUPS) {
-                    final long inGroupToken = pis.start(GROUPS);
-                    final long outGroupToken = os.start(GROUPS);
-
-                    while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) {
-                        switch (pis.getFieldNumber()) {
-                            case (int) ID:
-                                int id = pis.readInt(ID);
-                                os.write(ID, id);
-                                break;
-                            case (int) NAME:
-                                String name = pis.readString(NAME);
-                                os.write(NAME, name);
-                                break;
-                            case (int) TAG:
-                                String tag = pis.readString(TAG);
-                                os.write(TAG, tag);
-                                break;
-                            default:
-                                throw new RuntimeException(
-                                        "Unexpected field id " + pis.getFieldNumber());
-                        }
+                    if (pis.getFieldNumber() == (int) GROUPS) {
+                        writeViewerConfigGroup(pis, os);
                     }
-
-                    pis.end(inGroupToken);
-                    os.end(outGroupToken);
                 }
+
+                os.end(outProtologViewerConfigToken);
+
+                ctx.flush();
+            } catch (IOException e) {
+                Log.e(LOG_TAG, "Failed to read ProtoLog viewer config to dump on tracing end", e);
             }
-
-            os.end(outProtologViewerConfigToken);
-
-            ctx.flush();
         });
 
         mDataSource.flush();
     }
 
+    private static void writeViewerConfigGroup(
+            ProtoInputStream pis, ProtoOutputStream os) throws IOException {
+        final long inGroupToken = pis.start(GROUPS);
+        final long outGroupToken = os.start(GROUPS);
+
+        while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) {
+            switch (pis.getFieldNumber()) {
+                case (int) ID:
+                    int id = pis.readInt(ID);
+                    os.write(ID, id);
+                    break;
+                case (int) NAME:
+                    String name = pis.readString(NAME);
+                    os.write(NAME, name);
+                    break;
+                case (int) TAG:
+                    String tag = pis.readString(TAG);
+                    os.write(TAG, tag);
+                    break;
+                default:
+                    throw new RuntimeException(
+                            "Unexpected field id " + pis.getFieldNumber());
+            }
+        }
+
+        pis.end(inGroupToken);
+        os.end(outGroupToken);
+    }
+
+    private static void writeViewerConfigMessage(
+            ProtoInputStream pis, ProtoOutputStream os) throws IOException {
+        final long inMessageToken = pis.start(MESSAGES);
+        final long outMessagesToken = os.start(MESSAGES);
+
+        while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) {
+            switch (pis.getFieldNumber()) {
+                case (int) MessageData.MESSAGE_ID:
+                    os.write(MessageData.MESSAGE_ID,
+                            pis.readLong(MessageData.MESSAGE_ID));
+                    break;
+                case (int) MESSAGE:
+                    os.write(MESSAGE, pis.readString(MESSAGE));
+                    break;
+                case (int) LEVEL:
+                    os.write(LEVEL, pis.readInt(LEVEL));
+                    break;
+                case (int) GROUP_ID:
+                    os.write(GROUP_ID, pis.readInt(GROUP_ID));
+                    break;
+                default:
+                    throw new RuntimeException(
+                            "Unexpected field id " + pis.getFieldNumber());
+            }
+        }
+
+        pis.end(inMessageToken);
+        os.end(outMessagesToken);
+    }
+
     private void logToLogcat(String tag, LogLevel level, long messageHash,
             @Nullable String messageString, Object[] args) {
         Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "logToLogcat");
@@ -414,7 +439,7 @@
         return sw.toString();
     }
 
-    private int internStacktraceString(TracingContext<ProtoLogDataSource.Instance,
+    private int internStacktraceString(TracingContext<
             ProtoLogDataSource.TlsState,
             ProtoLogDataSource.IncrementalState> ctx,
             String stacktrace) {
@@ -424,9 +449,7 @@
     }
 
     private int internStringArg(
-            TracingContext<ProtoLogDataSource.Instance,
-            ProtoLogDataSource.TlsState,
-            ProtoLogDataSource.IncrementalState> ctx,
+            TracingContext<ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx,
             String string
     ) {
         final ProtoLogDataSource.IncrementalState incrementalState = ctx.getIncrementalState();
@@ -435,9 +458,7 @@
     }
 
     private int internString(
-            TracingContext<ProtoLogDataSource.Instance,
-                ProtoLogDataSource.TlsState,
-                ProtoLogDataSource.IncrementalState> ctx,
+            TracingContext<ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx,
             Map<String, Integer> internMap,
             long fieldId,
             String string
@@ -495,6 +516,29 @@
         return setTextLogging(false, logger, groups);
     }
 
+    @Override
+    public boolean isEnabled(IProtoLogGroup group, LogLevel level) {
+        return group.isLogToLogcat() || getLogFromLevel(group).ordinal() <= level.ordinal();
+    }
+
+    private LogLevel getLogFromLevel(IProtoLogGroup group) {
+        if (mLogLevelCounts.containsKey(group)) {
+            for (LogLevel logLevel : LogLevel.values()) {
+                if (mLogLevelCounts.get(group).getOrDefault(logLevel, 0) > 0) {
+                    return logLevel;
+                }
+            }
+        } else {
+            for (LogLevel logLevel : LogLevel.values()) {
+                if (mDefaultLogLevelCounts.getOrDefault(logLevel, 0) > 0) {
+                    return logLevel;
+                }
+            }
+        }
+
+        return LogLevel.WTF;
+    }
+
     /**
      * Start logging the stack trace of the when the log message happened for target groups
      * @return status code
@@ -522,6 +566,8 @@
                 return -1;
             }
         }
+
+        mCacheUpdater.run();
         return 0;
     }
 
@@ -568,6 +614,61 @@
         return -1;
     }
 
+    private synchronized void onTracingInstanceStart(ProtoLogDataSource.ProtoLogConfig config) {
+        this.mTracingInstances.incrementAndGet();
+
+        final LogLevel defaultLogFrom = config.getDefaultGroupConfig().logFrom;
+        mDefaultLogLevelCounts.put(defaultLogFrom,
+                mDefaultLogLevelCounts.getOrDefault(defaultLogFrom, 0) + 1);
+
+        final Set<String> overriddenGroupTags = config.getGroupTagsWithOverriddenConfigs();
+
+        for (String overriddenGroupTag : overriddenGroupTags) {
+            IProtoLogGroup group = mLogGroups.get(overriddenGroupTag);
+
+            mLogLevelCounts.putIfAbsent(group, new ArrayMap<>());
+            final Map<LogLevel, Integer> logLevelsCountsForGroup = mLogLevelCounts.get(group);
+
+            final LogLevel logFromLevel = config.getConfigFor(overriddenGroupTag).logFrom;
+            logLevelsCountsForGroup.put(logFromLevel,
+                    logLevelsCountsForGroup.getOrDefault(logFromLevel, 0) + 1);
+        }
+
+        mCacheUpdater.run();
+    }
+
+    private synchronized void onTracingInstanceStop(ProtoLogDataSource.ProtoLogConfig config) {
+        this.mTracingInstances.decrementAndGet();
+
+        final LogLevel defaultLogFrom = config.getDefaultGroupConfig().logFrom;
+        mDefaultLogLevelCounts.put(defaultLogFrom,
+                mDefaultLogLevelCounts.get(defaultLogFrom) - 1);
+        if (mDefaultLogLevelCounts.get(defaultLogFrom) <= 0) {
+            mDefaultLogLevelCounts.remove(defaultLogFrom);
+        }
+
+        final Set<String> overriddenGroupTags = config.getGroupTagsWithOverriddenConfigs();
+
+        for (String overriddenGroupTag : overriddenGroupTags) {
+            IProtoLogGroup group = mLogGroups.get(overriddenGroupTag);
+
+            mLogLevelCounts.putIfAbsent(group, new ArrayMap<>());
+            final Map<LogLevel, Integer> logLevelsCountsForGroup = mLogLevelCounts.get(group);
+
+            final LogLevel logFromLevel = config.getConfigFor(overriddenGroupTag).logFrom;
+            logLevelsCountsForGroup.put(logFromLevel,
+                    logLevelsCountsForGroup.get(logFromLevel) - 1);
+            if (logLevelsCountsForGroup.get(logFromLevel) <= 0) {
+                logLevelsCountsForGroup.remove(logFromLevel);
+            }
+            if (logLevelsCountsForGroup.isEmpty()) {
+                mLogLevelCounts.remove(group);
+            }
+        }
+
+        mCacheUpdater.run();
+    }
+
     static void logAndPrintln(@Nullable PrintWriter pw, String msg) {
         Slog.i(LOG_TAG, msg);
         if (pw != null) {
diff --git a/core/java/com/android/internal/protolog/ProtoLogDataSource.java b/core/java/com/android/internal/protolog/ProtoLogDataSource.java
index a8ff75d..e79bf36 100644
--- a/core/java/com/android/internal/protolog/ProtoLogDataSource.java
+++ b/core/java/com/android/internal/protolog/ProtoLogDataSource.java
@@ -16,13 +16,14 @@
 
 package com.android.internal.protolog;
 
-import static perfetto.protos.PerfettoTrace.DataSourceConfig.PROTOLOG_CONFIG;
-import static perfetto.protos.PerfettoTrace.ProtoLogConfig.GROUP_OVERRIDES;
-import static perfetto.protos.PerfettoTrace.ProtoLogConfig.TRACING_MODE;
-import static perfetto.protos.PerfettoTrace.ProtoLogGroup.COLLECT_STACKTRACE;
-import static perfetto.protos.PerfettoTrace.ProtoLogGroup.LOG_FROM;
-import static perfetto.protos.PerfettoTrace.ProtoLogGroup.GROUP_NAME;
+import static android.internal.perfetto.protos.PerfettoTrace.DataSourceConfig.PROTOLOG_CONFIG;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogConfig.GROUP_OVERRIDES;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogConfig.TRACING_MODE;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogGroup.COLLECT_STACKTRACE;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogGroup.GROUP_NAME;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogGroup.LOG_FROM;
 
+import android.internal.perfetto.protos.PerfettoTrace;
 import android.tracing.perfetto.CreateIncrementalStateArgs;
 import android.tracing.perfetto.CreateTlsStateArgs;
 import android.tracing.perfetto.DataSource;
@@ -38,18 +39,19 @@
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
-
-import perfetto.protos.PerfettoTrace;
+import java.util.Set;
+import java.util.function.Consumer;
 
 public class ProtoLogDataSource extends DataSource<ProtoLogDataSource.Instance,
         ProtoLogDataSource.TlsState,
         ProtoLogDataSource.IncrementalState> {
 
-    private final Runnable mOnStart;
+    private final Consumer<ProtoLogConfig> mOnStart;
     private final Runnable mOnFlush;
-    private final Runnable mOnStop;
+    private final Consumer<ProtoLogConfig> mOnStop;
 
-    public ProtoLogDataSource(Runnable onStart, Runnable onFlush, Runnable onStop) {
+    public ProtoLogDataSource(Consumer<ProtoLogConfig> onStart, Runnable onFlush,
+            Consumer<ProtoLogConfig> onStop) {
         super("android.protolog");
         this.mOnStart = onStart;
         this.mOnFlush = onFlush;
@@ -139,7 +141,7 @@
         public boolean clearReported = false;
     }
 
-    private static class ProtoLogConfig {
+    public static class ProtoLogConfig {
         private final LogLevel mDefaultLogFromLevel;
         private final Map<String, GroupConfig> mGroupConfigs;
 
@@ -152,13 +154,17 @@
             this.mGroupConfigs = groupConfigs;
         }
 
-        private GroupConfig getConfigFor(String groupTag) {
+        public GroupConfig getConfigFor(String groupTag) {
             return mGroupConfigs.getOrDefault(groupTag, getDefaultGroupConfig());
         }
 
-        private GroupConfig getDefaultGroupConfig() {
+        public GroupConfig getDefaultGroupConfig() {
             return new GroupConfig(mDefaultLogFromLevel, false);
         }
+
+        public Set<String> getGroupTagsWithOverriddenConfigs() {
+            return mGroupConfigs.keySet();
+        }
     }
 
     public static class GroupConfig {
@@ -256,18 +262,18 @@
 
     public static class Instance extends DataSourceInstance {
 
-        private final Runnable mOnStart;
+        private final Consumer<ProtoLogConfig> mOnStart;
         private final Runnable mOnFlush;
-        private final Runnable mOnStop;
+        private final Consumer<ProtoLogConfig> mOnStop;
         private final ProtoLogConfig mConfig;
 
         public Instance(
                 DataSource<Instance, TlsState, IncrementalState> dataSource,
                 int instanceIdx,
                 ProtoLogConfig config,
-                Runnable onStart,
+                Consumer<ProtoLogConfig> onStart,
                 Runnable onFlush,
-                Runnable onStop
+                Consumer<ProtoLogConfig> onStop
         ) {
             super(dataSource, instanceIdx);
             this.mOnStart = onStart;
@@ -278,7 +284,7 @@
 
         @Override
         public void onStart(StartCallbackArguments args) {
-            this.mOnStart.run();
+            this.mOnStart.accept(this.mConfig);
         }
 
         @Override
@@ -288,7 +294,7 @@
 
         @Override
         public void onStop(StopCallbackArguments args) {
-            this.mOnStop.run();
+            this.mOnStop.accept(this.mConfig);
         }
     }
 }
diff --git a/core/java/com/android/internal/protolog/ProtoLogImpl.java b/core/java/com/android/internal/protolog/ProtoLogImpl.java
index 487ae814..6d142af 100644
--- a/core/java/com/android/internal/protolog/ProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/ProtoLogImpl.java
@@ -16,6 +16,7 @@
 
 package com.android.internal.protolog;
 
+import static com.android.internal.protolog.common.ProtoLogToolInjected.Value.CACHE_UPDATER;
 import static com.android.internal.protolog.common.ProtoLogToolInjected.Value.LEGACY_OUTPUT_FILE_PATH;
 import static com.android.internal.protolog.common.ProtoLogToolInjected.Value.LEGACY_VIEWER_CONFIG_PATH;
 import static com.android.internal.protolog.common.ProtoLogToolInjected.Value.LOG_GROUPS;
@@ -49,6 +50,9 @@
     @ProtoLogToolInjected(LOG_GROUPS)
     private static TreeMap<String, IProtoLogGroup> sLogGroups;
 
+    @ProtoLogToolInjected(CACHE_UPDATER)
+    private static Runnable sCacheUpdater;
+
     /** Used by the ProtoLogTool, do not call directly - use {@code ProtoLog} class instead. */
     public static void d(IProtoLogGroup group, long messageHash, int paramsMask,
             @Nullable String messageString,
@@ -94,9 +98,12 @@
         getSingleInstance().log(LogLevel.WTF, group, messageHash, paramsMask, messageString, args);
     }
 
-    public static boolean isEnabled(IProtoLogGroup group) {
-        // TODO: Implement for performance reasons, with optional level parameter?
-        return true;
+    /**
+     * Should return true iff we should be logging to either protolog or logcat for this group
+     * and log level.
+     */
+    public static boolean isEnabled(IProtoLogGroup group, LogLevel level) {
+        return getSingleInstance().isEnabled(group, level);
     }
 
     /**
@@ -105,11 +112,14 @@
     public static synchronized IProtoLog getSingleInstance() {
         if (sServiceInstance == null) {
             if (android.tracing.Flags.perfettoProtologTracing()) {
-                sServiceInstance = new PerfettoProtoLogImpl(sViewerConfigPath, sLogGroups);
+                sServiceInstance = new PerfettoProtoLogImpl(
+                        sViewerConfigPath, sLogGroups, sCacheUpdater);
             } else {
                 sServiceInstance = new LegacyProtoLogImpl(
-                        sLegacyOutputFilePath, sLegacyViewerConfigPath, sLogGroups);
+                        sLegacyOutputFilePath, sLegacyViewerConfigPath, sLogGroups, sCacheUpdater);
             }
+
+            sCacheUpdater.run();
         }
         return sServiceInstance;
     }
diff --git a/core/java/com/android/internal/protolog/ProtoLogViewerConfigReader.java b/core/java/com/android/internal/protolog/ProtoLogViewerConfigReader.java
index ae3d448..88a7b54 100644
--- a/core/java/com/android/internal/protolog/ProtoLogViewerConfigReader.java
+++ b/core/java/com/android/internal/protolog/ProtoLogViewerConfigReader.java
@@ -1,8 +1,8 @@
 package com.android.internal.protolog;
 
-import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MESSAGES;
-import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.MESSAGE;
-import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.MESSAGE_ID;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MESSAGES;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.MESSAGE;
+import static android.internal.perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.MESSAGE_ID;
 
 import android.util.ArrayMap;
 import android.util.proto.ProtoInputStream;
diff --git a/core/java/com/android/internal/protolog/common/IProtoLog.java b/core/java/com/android/internal/protolog/common/IProtoLog.java
index c06d14b..f72d9f7 100644
--- a/core/java/com/android/internal/protolog/common/IProtoLog.java
+++ b/core/java/com/android/internal/protolog/common/IProtoLog.java
@@ -52,4 +52,12 @@
      * @return status code
      */
     int stopLoggingToLogcat(String[] groups, ILogger logger);
+
+    /**
+     * Should return true iff logging is enabled to ProtoLog or to Logcat for this group and level.
+     * @param group ProtoLog group to check for.
+     * @param level ProtoLog level to check for.
+     * @return If we need to log this group and level to either ProtoLog or Logcat.
+     */
+    boolean isEnabled(IProtoLogGroup group, LogLevel level);
 }
diff --git a/core/java/com/android/internal/protolog/common/IProtoLogGroup.java b/core/java/com/android/internal/protolog/common/IProtoLogGroup.java
index 4e9686f99..149aa7a 100644
--- a/core/java/com/android/internal/protolog/common/IProtoLogGroup.java
+++ b/core/java/com/android/internal/protolog/common/IProtoLogGroup.java
@@ -38,6 +38,7 @@
 
     /**
      * returns true is any logging is enabled for this group.
+     * @deprecated TODO(b/324128613) remove once we migrate fully to Perfetto
      */
     default boolean isLogToAny() {
         return isLogToLogcat() || isLogToProto();
@@ -50,6 +51,7 @@
 
     /**
      * set binary logging for this group.
+     * @deprecated TODO(b/324128613) remove once we migrate fully to Perfetto
      */
     void setLogToProto(boolean logToProto);
 
diff --git a/core/java/com/android/internal/protolog/common/ProtoLog.java b/core/java/com/android/internal/protolog/common/ProtoLog.java
index 18e3f66..8149cd5 100644
--- a/core/java/com/android/internal/protolog/common/ProtoLog.java
+++ b/core/java/com/android/internal/protolog/common/ProtoLog.java
@@ -135,7 +135,7 @@
      * @param group Group to check enable status of.
      * @return true iff this is being logged.
      */
-    public static boolean isEnabled(IProtoLogGroup group) {
+    public static boolean isEnabled(IProtoLogGroup group, LogLevel level) {
         if (REQUIRE_PROTOLOGTOOL) {
             throw new UnsupportedOperationException(
                     "ProtoLog calls MUST be processed with ProtoLogTool");
diff --git a/core/java/com/android/internal/protolog/common/ProtoLogToolInjected.java b/core/java/com/android/internal/protolog/common/ProtoLogToolInjected.java
index 17c82d7..2d39f3b 100644
--- a/core/java/com/android/internal/protolog/common/ProtoLogToolInjected.java
+++ b/core/java/com/android/internal/protolog/common/ProtoLogToolInjected.java
@@ -23,7 +23,11 @@
 @Target({ElementType.FIELD, ElementType.PARAMETER})
 public @interface ProtoLogToolInjected {
     enum Value {
-        VIEWER_CONFIG_PATH, LEGACY_OUTPUT_FILE_PATH, LEGACY_VIEWER_CONFIG_PATH, LOG_GROUPS
+        VIEWER_CONFIG_PATH,
+        LEGACY_OUTPUT_FILE_PATH,
+        LEGACY_VIEWER_CONFIG_PATH,
+        LOG_GROUPS,
+        CACHE_UPDATER
     }
 
     Value value();
diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java
index b6066ba..9c63d0d 100644
--- a/core/java/com/android/internal/widget/ConversationLayout.java
+++ b/core/java/com/android/internal/widget/ConversationLayout.java
@@ -1297,6 +1297,17 @@
      */
     @Nullable
     private Drawable resolveAvatarImageForOneToOne(Icon conversationIcon) {
+        final Drawable conversationIconDrawable =
+                tryLoadingSizeRestrictedIconForOneToOne(conversationIcon);
+        if (conversationIconDrawable != null) {
+            return conversationIconDrawable;
+        }
+        // when size restricted icon loading fails, we fallback to icons load drawable.
+        return loadDrawableFromIcon(conversationIcon);
+    }
+
+    @Nullable
+    private Drawable tryLoadingSizeRestrictedIconForOneToOne(Icon conversationIcon) {
         try {
             return mConversationIconView.loadSizeRestrictedIcon(conversationIcon);
         } catch (Exception ex) {
@@ -1309,6 +1320,11 @@
      */
     @Nullable
     private Drawable resolveAvatarImageForFacePile(Icon conversationIcon) {
+        return loadDrawableFromIcon(conversationIcon);
+    }
+
+    @Nullable
+    private Drawable loadDrawableFromIcon(Icon conversationIcon) {
         try {
             return conversationIcon.loadDrawable(getContext());
         } catch (Exception ex) {
diff --git a/core/java/com/android/internal/widget/EmphasizedNotificationButton.java b/core/java/com/android/internal/widget/EmphasizedNotificationButton.java
index c07e624..e5ef833 100644
--- a/core/java/com/android/internal/widget/EmphasizedNotificationButton.java
+++ b/core/java/com/android/internal/widget/EmphasizedNotificationButton.java
@@ -229,7 +229,8 @@
                     + "gluedLayoutDirection = " + mGluedLayoutDirection);
         }
 
-        if (layoutDirection != mGluedLayoutDirection) {
+        final boolean alreadyGlued = mGluedLayoutDirection != LAYOUT_DIRECTION_UNDEFINED;
+        if (alreadyGlued && layoutDirection != mGluedLayoutDirection) {
             if (DEBUG_NEW_ACTION_LAYOUT) {
                 Log.d(TAG, "onRtlPropertiesChanged: layout direction changed; regluing");
             }
@@ -249,14 +250,6 @@
             return;
         }
 
-        if (mIconToGlue == null && mLabelToGlue == null) {
-            if (DEBUG_NEW_ACTION_LAYOUT) {
-                Log.v(TAG, "glueIconAndLabelIfNeeded: no icon or label to glue; doing nothing");
-            }
-            mGluePending = false;
-            return;
-        }
-
         if (!evenlyDividedCallStyleActionLayout()) {
             Log.e(TAG, "glueIconAndLabelIfNeeded: new action layout disabled; doing nothing");
             return;
@@ -272,17 +265,6 @@
             return;
         }
 
-        // Ready to glue but don't have an icon *and* a label:
-        //
-        // (Note that this will *not* happen while the button is being initialized, since we won't
-        // be ready to glue. This can only happen if the button is initialized and displayed and
-        // *then* someone calls glueIcon or glueLabel.
-
-        if (mLabelToGlue == null) {
-            Log.w(TAG, "glueIconAndLabelIfNeeded: icon glued without label; doing nothing");
-            return;
-        }
-
         // Can't glue:
 
         final int layoutDirection = getLayoutDirection();
@@ -313,12 +295,26 @@
     private static final String POP_DIRECTIONAL_ISOLATE = "\u2069";
 
     private void glueIconAndLabel(int layoutDirection) {
-        if (mIconToGlue == null) {
+        if (mIconToGlue == null && mLabelToGlue == null) {
+            if (DEBUG_NEW_ACTION_LAYOUT) {
+                Log.d(TAG, "glueIconAndLabel: null icon and label, setting text to empty string");
+            }
+            setText("");
+            return;
+        } else if (mIconToGlue == null) {
             if (DEBUG_NEW_ACTION_LAYOUT) {
                 Log.d(TAG, "glueIconAndLabel: null icon, setting text to label");
             }
             setText(mLabelToGlue);
             return;
+        } else if (mLabelToGlue == null) {
+            if (DEBUG_NEW_ACTION_LAYOUT) {
+                Log.d(TAG, "glueIconAndLabel: null label, setting text to ImageSpan with icon");
+            }
+            final SpannableStringBuilder builder = new SpannableStringBuilder();
+            appendSpan(builder, IMAGE_SPAN_TEXT, new ImageSpan(mIconToGlue, ALIGN_CENTER));
+            setText(builder);
+            return;
         }
 
         final boolean rtlLayout = layoutDirection == LAYOUT_DIRECTION_RTL;
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 ce8ca0d..2d36536 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/CompanionOperation.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/CompanionOperation.java
@@ -21,6 +21,11 @@
  * Interface for the companion operations
  */
 public interface CompanionOperation {
+    /**
+     * Read, create and add instance to operations
+     * @param buffer data to read to create operation
+     * @param operations command is to be added
+     */
     void read(WireBuffer buffer, List<Operation> operations);
 
     // Debugging / Documentation utility functions
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 0e4c743..55f2dee 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/CoreDocument.java
@@ -331,6 +331,7 @@
     public void initFromBuffer(RemoteComposeBuffer buffer) {
         mOperations = new ArrayList<Operation>();
         buffer.inflateFromBuffer(mOperations);
+        mBuffer = buffer;
     }
 
     /**
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 b8bb1f0..54b277a 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/Operations.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/Operations.java
@@ -17,8 +17,29 @@
 
 import com.android.internal.widget.remotecompose.core.operations.BitmapData;
 import com.android.internal.widget.remotecompose.core.operations.ClickArea;
+import com.android.internal.widget.remotecompose.core.operations.ClipPath;
+import com.android.internal.widget.remotecompose.core.operations.ClipRect;
+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;
+import com.android.internal.widget.remotecompose.core.operations.DrawCircle;
+import com.android.internal.widget.remotecompose.core.operations.DrawLine;
+import com.android.internal.widget.remotecompose.core.operations.DrawOval;
+import com.android.internal.widget.remotecompose.core.operations.DrawPath;
+import com.android.internal.widget.remotecompose.core.operations.DrawRect;
+import com.android.internal.widget.remotecompose.core.operations.DrawRoundRect;
+import com.android.internal.widget.remotecompose.core.operations.DrawTextOnPath;
+import com.android.internal.widget.remotecompose.core.operations.DrawTextRun;
+import com.android.internal.widget.remotecompose.core.operations.DrawTweenPath;
 import com.android.internal.widget.remotecompose.core.operations.Header;
+import com.android.internal.widget.remotecompose.core.operations.MatrixRestore;
+import com.android.internal.widget.remotecompose.core.operations.MatrixRotate;
+import com.android.internal.widget.remotecompose.core.operations.MatrixSave;
+import com.android.internal.widget.remotecompose.core.operations.MatrixScale;
+import com.android.internal.widget.remotecompose.core.operations.MatrixSkew;
+import com.android.internal.widget.remotecompose.core.operations.MatrixTranslate;
+import com.android.internal.widget.remotecompose.core.operations.PaintData;
+import com.android.internal.widget.remotecompose.core.operations.PathData;
 import com.android.internal.widget.remotecompose.core.operations.RootContentBehavior;
 import com.android.internal.widget.remotecompose.core.operations.RootContentDescription;
 import com.android.internal.widget.remotecompose.core.operations.TextData;
@@ -48,7 +69,30 @@
     public static final int DATA_BITMAP = 101;
     public static final int DATA_TEXT = 102;
 
+/////////////////////////////=====================
+    public static final int CLIP_PATH = 38;
+    public static final int CLIP_RECT = 39;
+    public static final int PAINT_VALUES = 40;
+    public static final int DRAW_RECT = 42;
+    public static final int DRAW_TEXT_RUN = 43;
+    public static final int DRAW_CIRCLE = 46;
+    public static final int DRAW_LINE = 47;
+    public static final int DRAW_ROUND_RECT = 51;
+    public static final int DRAW_ARC = 52;
+    public static final int DRAW_TEXT_ON_PATH = 53;
+    public static final int DRAW_OVAL = 56;
+    public static final int DATA_PATH = 123;
+    public static final int DRAW_PATH = 124;
+    public static final int DRAW_TWEEN_PATH = 125;
+    public static final int MATRIX_SCALE = 126;
+    public static final int MATRIX_TRANSLATE = 127;
+    public static final int MATRIX_SKEW = 128;
+    public static final int MATRIX_ROTATE = 129;
+    public static final int MATRIX_SAVE = 130;
+    public static final int MATRIX_RESTORE = 131;
+    public static final int MATRIX_SET = 132;
 
+    /////////////////////////////////////////======================
     public static IntMap<CompanionOperation> map = new IntMap<>();
 
     static {
@@ -60,6 +104,29 @@
         map.put(CLICK_AREA, ClickArea.COMPANION);
         map.put(ROOT_CONTENT_BEHAVIOR, RootContentBehavior.COMPANION);
         map.put(ROOT_CONTENT_DESCRIPTION, RootContentDescription.COMPANION);
+
+        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, DrawTextRun.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);
+
     }
 
 }
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 6999cde..eece8ad52 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/PaintContext.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/PaintContext.java
@@ -15,6 +15,8 @@
  */
 package com.android.internal.widget.remotecompose.core;
 
+import com.android.internal.widget.remotecompose.core.operations.paint.PaintBundle;
+
 /**
  * Specify an abstract paint context used by RemoteCompose commands to draw
  */
@@ -30,11 +32,74 @@
     }
 
     public abstract void drawBitmap(int imageId,
-                             int srcLeft, int srcTop, int srcRight, int srcBottom,
-                             int dstLeft, int dstTop, int dstRight, int dstBottom,
-                             int cdId);
+                                    int srcLeft, int srcTop, int srcRight, int srcBottom,
+                                    int dstLeft, int dstTop, int dstRight, int dstBottom,
+                                    int cdId);
 
     public abstract void scale(float scaleX, float scaleY);
+
     public abstract void translate(float translateX, float translateY);
+
+    public abstract void drawArc(float left,
+                                 float top,
+                                 float right,
+                                 float bottom,
+                                 float startAngle,
+                                 float sweepAngle);
+
+    public abstract void drawBitmap(int id, float left, float top, float right, float bottom);
+
+    public abstract void drawCircle(float centerX, float centerY, float radius);
+
+    public abstract void drawLine(float x1, float y1, float x2, float y2);
+
+    public abstract void drawOval(float left, float top, float right, float bottom);
+
+    public abstract void drawPath(int id, float start, float end);
+
+    public abstract void drawRect(float left, float top, float right, float bottom);
+
+    public abstract void drawRoundRect(float left,
+                                       float top,
+                                       float right,
+                                       float bottom,
+                                       float radiusX,
+                                       float radiusY);
+
+    public abstract void drawTextOnPath(int textId, int pathId, float hOffset, float vOffset);
+
+    public abstract void drawTextRun(int textID,
+                                     int start,
+                                     int end,
+                                     int contextStart,
+                                     int contextEnd,
+                                     float x,
+                                     float y,
+                                     boolean rtl);
+
+    public abstract void drawTweenPath(int path1Id,
+                                       int path2Id,
+                                       float tween,
+                                       float start,
+                                       float stop);
+
+    public abstract void applyPaint(PaintBundle mPaintData);
+
+    public abstract void mtrixScale(float scaleX, float scaleY, float centerX, float centerY);
+
+    public abstract void matrixTranslate(float translateX, float translateY);
+
+    public abstract void matrixSkew(float skewX, float skewY);
+
+    public abstract void matrixRotate(float rotate, float pivotX, float pivotY);
+
+    public abstract void matrixSave();
+
+    public abstract void matrixRestore();
+
+    public abstract void clipRect(float left, float top, float right, float bottom);
+
+    public abstract void clipPath(int pathId, int regionOp);
+
 }
 
diff --git a/core/java/com/android/internal/widget/remotecompose/core/Platform.java b/core/java/com/android/internal/widget/remotecompose/core/Platform.java
index abda0c0..903dab4 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/Platform.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/Platform.java
@@ -20,5 +20,8 @@
  */
 public interface Platform {
     byte[] imageToByteArray(Object image);
+    int getImageWidth(Object image);
+    int getImageHeight(Object image);
+    float[] pathToFloatArray(Object image);
 }
 
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 c34730f..c2e8131 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/RemoteComposeBuffer.java
@@ -17,12 +17,34 @@
 
 import com.android.internal.widget.remotecompose.core.operations.BitmapData;
 import com.android.internal.widget.remotecompose.core.operations.ClickArea;
+import com.android.internal.widget.remotecompose.core.operations.ClipPath;
+import com.android.internal.widget.remotecompose.core.operations.ClipRect;
+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;
+import com.android.internal.widget.remotecompose.core.operations.DrawCircle;
+import com.android.internal.widget.remotecompose.core.operations.DrawLine;
+import com.android.internal.widget.remotecompose.core.operations.DrawOval;
+import com.android.internal.widget.remotecompose.core.operations.DrawPath;
+import com.android.internal.widget.remotecompose.core.operations.DrawRect;
+import com.android.internal.widget.remotecompose.core.operations.DrawRoundRect;
+import com.android.internal.widget.remotecompose.core.operations.DrawTextOnPath;
+import com.android.internal.widget.remotecompose.core.operations.DrawTextRun;
+import com.android.internal.widget.remotecompose.core.operations.DrawTweenPath;
 import com.android.internal.widget.remotecompose.core.operations.Header;
+import com.android.internal.widget.remotecompose.core.operations.MatrixRestore;
+import com.android.internal.widget.remotecompose.core.operations.MatrixRotate;
+import com.android.internal.widget.remotecompose.core.operations.MatrixSave;
+import com.android.internal.widget.remotecompose.core.operations.MatrixScale;
+import com.android.internal.widget.remotecompose.core.operations.MatrixSkew;
+import com.android.internal.widget.remotecompose.core.operations.MatrixTranslate;
+import com.android.internal.widget.remotecompose.core.operations.PaintData;
+import com.android.internal.widget.remotecompose.core.operations.PathData;
 import com.android.internal.widget.remotecompose.core.operations.RootContentBehavior;
 import com.android.internal.widget.remotecompose.core.operations.RootContentDescription;
 import com.android.internal.widget.remotecompose.core.operations.TextData;
 import com.android.internal.widget.remotecompose.core.operations.Theme;
+import com.android.internal.widget.remotecompose.core.operations.paint.PaintBundle;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -82,10 +104,10 @@
     /**
      * Insert a header
      *
-     * @param width        the width of the document in pixels
-     * @param height       the height of the document in pixels
+     * @param width              the width of the document in pixels
+     * @param height             the height of the document in pixels
      * @param contentDescription content description of the document
-     * @param capabilities bitmask indicating needed capabilities (unused for now)
+     * @param capabilities       bitmask indicating needed capabilities (unused for now)
      */
     public void header(int width, int height, String contentDescription, long capabilities) {
         Header.COMPANION.apply(mBuffer, width, height, capabilities);
@@ -99,8 +121,8 @@
     /**
      * Insert a header
      *
-     * @param width  the width of the document in pixels
-     * @param height the height of the document in pixels
+     * @param width              the width of the document in pixels
+     * @param height             the height of the document in pixels
      * @param contentDescription content description of the document
      */
     public void header(int width, int height, String contentDescription) {
@@ -111,7 +133,7 @@
      * Insert a bitmap
      *
      * @param image       an opaque image that we'll add to the buffer
-     * @param imageWidth the width of the image
+     * @param imageWidth  the width of the image
      * @param imageHeight the height of the image
      * @param srcLeft     left coordinate of the source area
      * @param srcTop      top coordinate of the source area
@@ -161,13 +183,13 @@
     /**
      * Add a click area to the document
      *
-     * @param id       the id of the click area, reported in the click listener callback
+     * @param id                 the id of the click area, reported in the click listener callback
      * @param contentDescription the content description of that click area (accessibility)
-     * @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
+     * @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
      */
     public void addClickArea(
             int id,
@@ -193,35 +215,294 @@
     /**
      * 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) {
         RootContentBehavior.COMPANION.apply(mBuffer, scroll, alignment, sizing, mode);
     }
 
+    /**
+     * add Drawing the specified arc, which will be scaled to fit inside the specified oval.
+     * <br>
+     * If the start angle is negative or >= 360, the start angle is treated as start angle modulo
+     * 360.
+     * <br>
+     * If the sweep angle is >= 360, then the oval is drawn completely. Note that this differs
+     * slightly from SkPath::arcTo, which treats the sweep angle modulo 360. If the sweep angle is
+     * negative, the sweep angle is treated as sweep angle modulo 360
+     * <br>
+     * The arc is drawn clockwise. An angle of 0 degrees correspond to the geometric angle of 0
+     * degrees (3 o'clock on a watch.)
+     * <br>
+     *
+     * @param left       left coordinate of oval used to define the shape and size of the arc
+     * @param top        top coordinate of oval used to define the shape and size of the arc
+     * @param right      right coordinate of oval used to define the shape and size of the arc
+     * @param bottom     bottom coordinate of oval used to define the shape and size of the arc
+     * @param startAngle Starting angle (in degrees) where the arc begins
+     * @param sweepAngle Sweep angle (in degrees) measured clockwise
+     */
+    public void addDrawArc(float left,
+                           float top,
+                           float right,
+                           float bottom,
+                           float startAngle,
+                           float sweepAngle) {
+        DrawArc.COMPANION.apply(mBuffer, left, top, right, bottom, startAngle, sweepAngle);
+    }
+
+    /**
+     * @param image              The bitmap to be drawn
+     * @param left               left coordinate of rectangle that the bitmap will be to fit into
+     * @param top                top coordinate of rectangle that the bitmap will be to fit into
+     * @param right              right coordinate of rectangle that the bitmap will be to fit into
+     * @param bottom             bottom coordinate of rectangle that the bitmap will be to fit into
+     * @param contentDescription content description of the image
+     */
+    public void addDrawBitmap(Object image,
+                              float left,
+                              float top,
+                              float right,
+                              float bottom,
+                              String contentDescription) {
+        int imageId = mRemoteComposeState.dataGetId(image);
+        if (imageId == -1) {
+            imageId = mRemoteComposeState.cache(image);
+            byte[] data = mPlatform.imageToByteArray(image);
+            int imageWidth = mPlatform.getImageWidth(image);
+            int imageHeight = mPlatform.getImageHeight(image);
+
+            BitmapData.COMPANION.apply(mBuffer, imageId, imageWidth, imageHeight, data);
+        }
+        int contentDescriptionId = 0;
+        if (contentDescription != null) {
+            contentDescriptionId = addText(contentDescription);
+        }
+        DrawBitmap.COMPANION.apply(
+                mBuffer, imageId, left, top, right, bottom, contentDescriptionId
+        );
+    }
+
+    /**
+     * Draw the specified circle using the specified paint. If radius is <= 0, then nothing will be
+     * drawn.
+     *
+     * @param centerX The x-coordinate of the center of the circle to be drawn
+     * @param centerY The y-coordinate of the center of the circle to be drawn
+     * @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);
+    }
+
+    /**
+     * Draw a line segment with the specified start and stop x,y coordinates, using the specified
+     * paint.
+     *
+     * @param x1 The x-coordinate of the start point of the line
+     * @param y1 The y-coordinate of the start point of the line
+     * @param x2 The x-coordinate of the end point of the line
+     * @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);
+    }
+
+    /**
+     * Draw the specified oval using the specified paint.
+     *
+     * @param left   left coordinate of oval
+     * @param top    top coordinate of oval
+     * @param right  right coordinate of oval
+     * @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);
+    }
+
+    /**
+     * Draw the specified path
+     * <p>
+     * Note: path objects are not immutable
+     * modifying them and calling this will not change the drawing
+     *
+     * @param path The path to be drawn
+     */
+    public void addDrawPath(Object path) {
+        int id = mRemoteComposeState.dataGetId(path);
+        if (id == -1) { // never been seen before
+            id = addPathData(path);
+        }
+        addDrawPath(id);
+    }
+
+
+    /**
+     * Draw the specified path
+     *
+     * @param pathId
+     */
+    public void addDrawPath(int pathId) {
+        DrawPath.COMPANION.apply(mBuffer, pathId);
+    }
+
+    /**
+     * Draw the specified Rect
+     *
+     * @param left   left coordinate of rectangle to be drawn
+     * @param top    top coordinate of rectangle to be drawn
+     * @param right  right coordinate of rectangle to be drawn
+     * @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);
+    }
+
+    /**
+     * Draw the specified round-rect
+     *
+     * @param left    left coordinate of rectangle to be drawn
+     * @param top     left coordinate of rectangle to be drawn
+     * @param right   left coordinate of rectangle to be drawn
+     * @param bottom  left coordinate of rectangle to be drawn
+     * @param radiusX The x-radius of the oval used to round the corners
+     * @param radiusY The y-radius of the oval used to round the corners
+     */
+    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);
+    }
+
+    /**
+     * Draw the text, with origin at (x,y) along the specified path.
+     *
+     * @param text    The text to be drawn
+     * @param path    The path the text should follow for its baseline
+     * @param hOffset The distance along the path to add to the text's starting position
+     * @param vOffset The distance above(-) or below(+) the path to position the text
+     */
+    public void addDrawTextOnPath(String text, Object path, float hOffset, float vOffset) {
+        int pathId = mRemoteComposeState.dataGetId(path);
+        if (pathId == -1) { // never been seen before
+            pathId = addPathData(path);
+        }
+        int textId = addText(text);
+        DrawTextOnPath.COMPANION.apply(mBuffer, textId, pathId, hOffset, vOffset);
+    }
+
+    /**
+     * Draw the text, with origin at (x,y). The origin is interpreted
+     * based on the Align setting in the paint.
+     *
+     * @param text         The text to be drawn
+     * @param start        The index of the first character in text to draw
+     * @param end          (end - 1) is the index of the last character in text to draw
+     * @param contextStart
+     * @param contextEnd
+     * @param x            The x-coordinate of the origin of the text being drawn
+     * @param y            The y-coordinate of the baseline of the text being drawn
+     * @param rtl          Draw RTTL
+     */
+    public void addDrawTextRun(String text,
+                               int start,
+                               int end,
+                               int contextStart,
+                               int contextEnd,
+                               float x,
+                               float y,
+                               boolean rtl) {
+        int textId = addText(text);
+        DrawTextRun.COMPANION.apply(
+                mBuffer, textId, start, end,
+                contextStart, contextEnd, x, y, rtl);
+    }
+
+    /**
+     * draw an interpolation between two paths that have the same pattern
+     * <p>
+     * Warning paths objects are not immutable and this is not taken into consideration
+     *
+     * @param path1 The path1 to be drawn between
+     * @param path2 The path2 to be drawn between
+     * @param tween The ratio of path1 and path2 to 0 = all path 1, 1 = all path2
+     * @param start The start of the subrange of paths to draw 0 = start form start 0.5 is half way
+     * @param stop  The end of the subrange of paths to draw 1 = end at the end 0.5 is end half way
+     */
+    public void addDrawTweenPath(Object path1,
+                                 Object path2,
+                                 float tween,
+                                 float start,
+                                 float stop) {
+        int path1Id = mRemoteComposeState.dataGetId(path1);
+        if (path1Id == -1) { // never been seen before
+            path1Id = addPathData(path1);
+        }
+        int path2Id = mRemoteComposeState.dataGetId(path2);
+        if (path2Id == -1) { // never been seen before
+            path2Id = addPathData(path2);
+        }
+        addDrawTweenPath(path1Id, path2Id, tween, start, stop);
+    }
+
+    /**
+     * draw an interpolation between two paths that have the same pattern
+     *
+     * @param path1Id The path1 to be drawn between
+     * @param path2Id The path2 to be drawn between
+     * @param tween   The ratio of path1 and path2 to 0 = all path 1, 1 = all path2
+     * @param start   The start of the subrange of paths to draw 0 = start form start .5 is 1/2 way
+     * @param stop    The end of the subrange of paths to draw 1 = end at the end .5 is end 1/2 way
+     */
+    public void addDrawTweenPath(int path1Id,
+                                 int path2Id,
+                                 float tween,
+                                 float start,
+                                 float stop) {
+        DrawTweenPath.COMPANION.apply(
+                mBuffer, path1Id, path2Id,
+                tween, start, stop);
+    }
+
+    /**
+     * Add a path object
+     *
+     * @param path
+     * @return the id of the path on the wire
+     */
+    public int addPathData(Object path) {
+        float[] pathData = mPlatform.pathToFloatArray(path);
+        int id = mRemoteComposeState.cache(path);
+        PathData.COMPANION.apply(mBuffer, id, pathData);
+        return id;
+    }
+
+    public void addPaint(PaintBundle paint) {
+        PaintData.COMPANION.apply(mBuffer, paint);
+    }
     ///////////////////////////////////////////////////////////////////////////////////////////////
 
     public void inflateFromBuffer(ArrayList<Operation> operations) {
         mBuffer.setIndex(0);
         while (mBuffer.available()) {
             int opId = mBuffer.readByte();
+            System.out.println(">>> " + opId);
             CompanionOperation operation = Operations.map.get(opId);
             if (operation == null) {
-                throw new RuntimeException("Unknown operation encountered");
+                throw new RuntimeException("Unknown operation encountered " + opId);
             }
             operation.read(mBuffer, operations);
         }
@@ -259,7 +540,7 @@
     }
 
     public static RemoteComposeBuffer fromInputStream(InputStream inputStream,
-                                               RemoteComposeState remoteComposeState) {
+                                                      RemoteComposeState remoteComposeState) {
         RemoteComposeBuffer buffer = new RemoteComposeBuffer(remoteComposeState);
         read(inputStream, buffer);
         return buffer;
@@ -318,5 +599,86 @@
         }
     }
 
+    /**
+     * add a Pre-concat the current matrix with the specified skew.
+     *
+     * @param skewX The amount to skew in X
+     * @param skewY The amount to skew in Y
+     */
+    public void addMatrixSkew(float skewX, float skewY) {
+        MatrixSkew.COMPANION.apply(mBuffer, skewX, skewY);
+    }
+
+    /**
+     * This call balances a previous call to save(), and is used to remove all
+     * modifications to the matrix/clip state since the last save call.
+     * Do not call restore() more times than save() was called.
+     */
+    public void addMatrixRestore() {
+        MatrixRestore.COMPANION.apply(mBuffer);
+    }
+
+    /**
+     * Add a saves the current matrix and clip onto a private stack.
+     * <p>
+     * Subsequent calls to translate,scale,rotate,skew,concat or clipRect,
+     * clipPath will all operate as usual, but when the balancing call to
+     * restore() is made, those calls will be forgotten, and the settings that
+     * existed before the save() will be reinstated.
+     */
+    public void addMatrixSave() {
+        MatrixSave.COMPANION.apply(mBuffer);
+    }
+
+    /**
+     * add a pre-concat the current matrix with the specified rotation.
+     *
+     * @param angle   The amount to rotate, in degrees
+     * @param centerX The x-coord for the pivot point (unchanged by the rotation)
+     * @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);
+    }
+
+    /**
+     * add a Pre-concat to the current matrix with the specified translation
+     *
+     * @param dx The distance to translate in X
+     * @param dy The distance to translate in Y
+     */
+    public void addMatrixTranslate(float dx, float dy) {
+        MatrixTranslate.COMPANION.apply(mBuffer, dx, dy);
+    }
+
+    /**
+     * Add a pre-concat of the current matrix with the specified scale.
+     *
+     * @param scaleX  The amount to scale in X
+     * @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);
+    }
+
+    /**
+     * Add a pre-concat of the current matrix with the specified scale.
+     *
+     * @param scaleX  The amount to scale in X
+     * @param scaleY  The amount to scale in Y
+     * @param centerX The x-coord for the pivot point (unchanged by the scale)
+     * @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);
+    }
+
+    public void addClipPath(int pathId) {
+        ClipPath.COMPANION.apply(mBuffer, pathId);
+    }
+
+    public void addClipRect(float left, float top, float right, float bottom) {
+        ClipRect.COMPANION.apply(mBuffer, left, top, right, bottom);
+    }
 }
 
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 1b7c6fd..d16cbc5 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/RemoteContext.java
@@ -37,6 +37,8 @@
     public float mWidth = 0f;
     public float mHeight = 0f;
 
+    public abstract void loadPathData(int instanceId, float[] floatPath);
+
     /**
      * The context can be used in a few different mode, allowing operations to skip being executed:
      * - UNSET : all operations will get executed
diff --git a/core/java/com/android/internal/widget/remotecompose/core/WireBuffer.java b/core/java/com/android/internal/widget/remotecompose/core/WireBuffer.java
index 7c9fda5..fc3202e 100644
--- a/core/java/com/android/internal/widget/remotecompose/core/WireBuffer.java
+++ b/core/java/com/android/internal/widget/remotecompose/core/WireBuffer.java
@@ -37,7 +37,7 @@
         this(BUFFER_SIZE);
     }
 
-    public void resize(int need) {
+    private void resize(int need) {
         if (mSize + need >= mMaxSize) {
             mMaxSize = Math.max(mMaxSize * 2, mSize + need);
             mBuffer = Arrays.copyOf(mBuffer, mMaxSize);
@@ -120,7 +120,7 @@
     }
 
     public int readByte() {
-        byte value = mBuffer[mIndex];
+        int value = 0xFF & mBuffer[mIndex];
         mIndex++;
         return value;
     }
@@ -130,6 +130,14 @@
         int v2 = (mBuffer[mIndex++] & 0xFF) << 0;
         return v1 + v2;
     }
+    public int peekInt() {
+        int tmp = mIndex;
+        int v1 = (mBuffer[tmp++] & 0xFF) << 24;
+        int v2 = (mBuffer[tmp++] & 0xFF) << 16;
+        int v3 = (mBuffer[tmp++] & 0xFF) << 8;
+        int v4 = (mBuffer[tmp++] & 0xFF) << 0;
+        return v1 + v2 + v3 + v4;
+    }
 
     public int readInt() {
         int v1 = (mBuffer[mIndex++] & 0xFF) << 24;
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
new file mode 100644
index 0000000..8d4a787
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ClipPath.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 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 java.util.List;
+
+public class ClipPath extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    int mId;
+    int mRegionOp;
+
+    public ClipPath(int pathId, int regionOp) {
+        mId = pathId;
+        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;
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mId);
+    }
+
+    @Override
+    public String toString() {
+        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);
+        }
+    }
+
+    @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
new file mode 100644
index 0000000..803618a
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/ClipRect.java
@@ -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.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 java.util.List;
+
+public class ClipRect extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mLeft;
+    float mTop;
+    float mRight;
+    float mBottom;
+
+    public ClipRect(
+            float left,
+            float top,
+            float right,
+            float bottom) {
+        mLeft = left;
+        mTop = top;
+        mRight = right;
+        mBottom = bottom;
+
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mLeft, mTop, mRight, mBottom);
+    }
+
+    @Override
+    public String toString() {
+        return "ClipRect " + mLeft + " " + mTop
+                + " " + mRight + " " + mBottom + ";";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @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();
+
+            ClipRect op = new ClipRect(sLeft, srcTop, srcRight, srcBottom);
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "ClipRect";
+        }
+
+        @Override
+        public int id() {
+            return Operations.CLIP_RECT;
+        }
+
+        public void apply(WireBuffer buffer,
+                          float left,
+                          float top,
+                          float right,
+                          float bottom) {
+            buffer.start(Operations.CLIP_RECT);
+            buffer.writeFloat(left);
+            buffer.writeFloat(top);
+            buffer.writeFloat(right);
+            buffer.writeFloat(bottom);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.clipRect(mLeft,
+                mTop,
+                mRight,
+                mBottom);
+    }
+}
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
new file mode 100644
index 0000000..e829975
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawArc.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 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 java.util.List;
+
+public class DrawArc extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mLeft;
+    float mTop;
+    float mRight;
+    float mBottom;
+    float mStartAngle;
+    float mSweepAngle;
+
+    public DrawArc(
+            float left,
+            float top,
+            float right,
+            float bottom,
+            float startAngle,
+            float sweepAngle) {
+        mLeft = left;
+        mTop = top;
+        mRight = right;
+        mBottom = bottom;
+        mStartAngle = startAngle;
+        mSweepAngle = sweepAngle;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mLeft,
+                mTop,
+                mRight,
+                mBottom,
+                mStartAngle,
+                mSweepAngle);
+    }
+
+    @Override
+    public String toString() {
+        return "DrawArc " + mLeft + " " + mTop
+                + " " + mRight + " " + mBottom + " "
+                + "- " + mStartAngle + " " + mSweepAngle + ";";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @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();
+            float mStartAngle = buffer.readFloat();
+            float mSweepAngle = buffer.readFloat();
+            DrawArc op = new DrawArc(sLeft, srcTop, srcRight, srcBottom,
+                    mStartAngle, mSweepAngle);
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "DrawArc";
+        }
+
+        @Override
+        public int id() {
+            return Operations.DRAW_ARC;
+        }
+
+        public void apply(WireBuffer buffer,
+                          float left,
+                          float top,
+                          float right,
+                          float bottom,
+                          float startAngle,
+                          float sweepAngle) {
+            buffer.start(Operations.DRAW_ARC);
+            buffer.writeFloat(left);
+            buffer.writeFloat(top);
+            buffer.writeFloat(right);
+            buffer.writeFloat(bottom);
+            buffer.writeFloat(startAngle);
+            buffer.writeFloat(sweepAngle);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.drawArc(mLeft,
+                mTop,
+                mRight,
+                mBottom,
+                mStartAngle,
+                mSweepAngle);
+    }
+}
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
new file mode 100644
index 0000000..2e971f5
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawBitmap.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.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 java.util.List;
+
+public class DrawBitmap extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mLeft;
+    float mTop;
+    float mRight;
+    float mBottom;
+    int mId;
+    int mDescriptionId = 0;
+
+    public DrawBitmap(
+            int imageId,
+            float left,
+            float top,
+            float right,
+            float bottom,
+            int descriptionId) {
+        mLeft = left;
+        mTop = top;
+        mRight = right;
+        mBottom = bottom;
+        mId = imageId;
+        mDescriptionId = descriptionId;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mId, mLeft, mTop, mRight, mBottom, mDescriptionId);
+    }
+
+    @Override
+    public String toString() {
+        return "DrawBitmap (desc=" + mDescriptionId + ")" + mLeft + " " + mTop
+                + " " + mRight + " " + mBottom + ";";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @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);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.drawBitmap(mId, mLeft,
+                mTop,
+                mRight,
+                mBottom);
+    }
+}
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 3fbdf94..c2a56e7 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
@@ -76,7 +76,8 @@
     }
 
     public static class Companion implements CompanionOperation {
-        private Companion() {}
+        private Companion() {
+        }
 
         @Override
         public String name() {
@@ -89,9 +90,9 @@
         }
 
         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) {
+                          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);
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
new file mode 100644
index 0000000..9ce754d
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawCircle.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 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 java.util.List;
+
+public class DrawCircle extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mCenterX;
+    float mCenterY;
+    float mRadius;
+
+    public DrawCircle(float centerX, float centerY, float radius) {
+        mCenterX = centerX;
+        mCenterY = centerY;
+        mRadius = radius;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mCenterX,
+                mCenterY,
+                mRadius);
+    }
+
+    @Override
+    public String toString() {
+        return "";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @Override
+        public void read(WireBuffer buffer, List<Operation> operations) {
+            float centerX = buffer.readFloat();
+            float centerY = buffer.readFloat();
+            float radius = buffer.readFloat();
+
+            DrawCircle op = new DrawCircle(centerX, centerY, radius);
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "";
+        }
+
+        @Override
+        public int id() {
+            return 0;
+        }
+
+        public void apply(WireBuffer buffer, float centerX, float centerY, float radius) {
+            buffer.start(Operations.DRAW_CIRCLE);
+            buffer.writeFloat(centerX);
+            buffer.writeFloat(centerY);
+            buffer.writeFloat(radius);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.drawCircle(mCenterX,
+                mCenterY,
+                mRadius);
+    }
+}
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
new file mode 100644
index 0000000..c7a8315
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawLine.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.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 java.util.List;
+
+public class DrawLine extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mX1;
+    float mY1;
+    float mX2;
+    float mY2;
+
+    public DrawLine(
+            float x1,
+            float y1,
+            float x2,
+            float y2) {
+        mX1 = x1;
+        mY1 = y1;
+        mX2 = x2;
+        mY2 = y2;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mX1,
+                mY1,
+                mX2,
+                mY2);
+    }
+
+    @Override
+    public String toString() {
+        return "DrawArc " + mX1 + " " + mY1
+                + " " + mX2 + " " + mY2 + ";";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @Override
+        public void read(WireBuffer buffer, List<Operation> operations) {
+            float x1 = buffer.readFloat();
+            float y1 = buffer.readFloat();
+            float x2 = buffer.readFloat();
+            float y2 = buffer.readFloat();
+
+            DrawLine op = new DrawLine(x1, y1, x2, y2);
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "DrawLine";
+        }
+
+        @Override
+        public int id() {
+            return Operations.DRAW_LINE;
+        }
+
+        public void apply(WireBuffer buffer,
+                          float x1,
+                          float y1,
+                          float x2,
+                          float y2) {
+            buffer.start(Operations.DRAW_LINE);
+            buffer.writeFloat(x1);
+            buffer.writeFloat(y1);
+            buffer.writeFloat(x2);
+            buffer.writeFloat(y2);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.drawLine(mX1,
+                mY1,
+                mX2,
+                mY2);
+    }
+
+}
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
new file mode 100644
index 0000000..7143753
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawOval.java
@@ -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.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 java.util.List;
+
+public class DrawOval extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mLeft;
+    float mTop;
+    float mRight;
+    float mBottom;
+
+
+    public DrawOval(
+            float left,
+            float top,
+            float right,
+            float bottom) {
+        mLeft = left;
+        mTop = top;
+        mRight = right;
+        mBottom = bottom;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mLeft, mTop, mRight, mBottom);
+    }
+
+    @Override
+    public String toString() {
+        return "DrawOval " + mLeft + " " + mTop
+                + " " + mRight + " " + mBottom + ";";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @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();
+
+            DrawOval op = new DrawOval(sLeft, srcTop, srcRight, srcBottom);
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "DrawOval";
+        }
+
+        @Override
+        public int id() {
+            return Operations.DRAW_OVAL;
+        }
+
+        public void apply(WireBuffer buffer,
+                          float left,
+                          float top,
+                          float right,
+                          float bottom) {
+            buffer.start(Operations.DRAW_OVAL);
+            buffer.writeFloat(left);
+            buffer.writeFloat(top);
+            buffer.writeFloat(right);
+            buffer.writeFloat(bottom);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.drawOval(mLeft,
+                mTop,
+                mRight,
+                mBottom);
+    }
+}
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
new file mode 100644
index 0000000..7b8a9e9
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawPath.java
@@ -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 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 java.util.List;
+
+public class DrawPath extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    int mId;
+    float mStart = 0;
+    float mEnd = 1;
+
+    public DrawPath(int pathId) {
+        mId = pathId;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mId);
+    }
+
+    @Override
+    public String toString() {
+        return "DrawPath " + ";";
+    }
+
+    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);
+        }
+    }
+
+    @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
new file mode 100644
index 0000000..4775241
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRect.java
@@ -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.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 java.util.List;
+
+public class DrawRect extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mLeft;
+    float mTop;
+    float mRight;
+    float mBottom;
+
+    public DrawRect(
+            float left,
+            float top,
+            float right,
+            float bottom) {
+        mLeft = left;
+        mTop = top;
+        mRight = right;
+        mBottom = bottom;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mLeft, mTop, mRight, mBottom);
+    }
+
+    @Override
+    public String toString() {
+        return "DrawRect " + mLeft + " " + mTop
+                + " " + mRight + " " + mBottom + ";";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @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();
+
+            DrawRect op = new DrawRect(sLeft, srcTop, srcRight, srcBottom);
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "DrawRect";
+        }
+
+        @Override
+        public int id() {
+            return Operations.DRAW_RECT;
+        }
+
+        public void apply(WireBuffer buffer,
+                          float left,
+                          float top,
+                          float right,
+                          float bottom) {
+            buffer.start(Operations.DRAW_RECT);
+            buffer.writeFloat(left);
+            buffer.writeFloat(top);
+            buffer.writeFloat(right);
+            buffer.writeFloat(bottom);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.drawRect(mLeft,
+                mTop,
+                mRight,
+                mBottom);
+    }
+
+}
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
new file mode 100644
index 0000000..8da16e7
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawRoundRect.java
@@ -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.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 java.util.List;
+
+public class DrawRoundRect extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mLeft;
+    float mTop;
+    float mRight;
+    float mBottom;
+    float mRadiusX;
+    float mRadiusY;
+
+    public DrawRoundRect(
+            float left,
+            float top,
+            float right,
+            float bottom,
+            float radiusX,
+            float radiusY) {
+        mLeft = left;
+        mTop = top;
+        mRight = right;
+        mBottom = bottom;
+        mRadiusX = radiusX;
+        mRadiusY = radiusY;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mLeft, mTop, mRight, mBottom, mRadiusX, mRadiusY);
+    }
+
+    @Override
+    public String toString() {
+        return "DrawRoundRect " + mLeft + " " + mTop
+                + " " + mRight + " " + mBottom
+                + " (" + mRadiusX + " " + mRadiusY + ");";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @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();
+            float srcRadiusX = buffer.readFloat();
+            float srcRadiusY = buffer.readFloat();
+
+            DrawRoundRect op = new DrawRoundRect(sLeft, srcTop, srcRight,
+                    srcBottom, srcRadiusX, srcRadiusY);
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "DrawOval";
+        }
+
+        @Override
+        public int id() {
+            return Operations.DRAW_ROUND_RECT;
+        }
+
+        public void apply(WireBuffer buffer,
+                          float left,
+                          float top,
+                          float right,
+                          float bottom,
+                          float radiusX,
+                          float radiusY) {
+            buffer.start(Operations.DRAW_ROUND_RECT);
+            buffer.writeFloat(left);
+            buffer.writeFloat(top);
+            buffer.writeFloat(right);
+            buffer.writeFloat(bottom);
+            buffer.writeFloat(radiusX);
+            buffer.writeFloat(radiusY);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.drawRoundRect(mLeft,
+                mTop,
+                mRight,
+                mBottom,
+                mRadiusX,
+                mRadiusY
+        );
+    }
+
+}
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
new file mode 100644
index 0000000..1856e30
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextOnPath.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 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 java.util.List;
+
+public class DrawTextOnPath extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    int mPathId;
+    public int mTextId;
+    float mVOffset;
+    float mHOffset;
+
+    public DrawTextOnPath(int textId, int pathId, float hOffset, float vOffset) {
+        mPathId = pathId;
+        mTextId = textId;
+        mHOffset = vOffset;
+        mVOffset = hOffset;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mTextId, mPathId, mHOffset, mVOffset);
+    }
+
+    @Override
+    public String toString() {
+        return "DrawTextOnPath " + " " + mPathId + ";";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @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);
+        }
+
+        @Override
+        public String name() {
+            return "DrawTextOnPath";
+        }
+
+        @Override
+        public 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);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.drawTextOnPath(mTextId, mPathId, mHOffset, mVOffset);
+    }
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextRun.java b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextRun.java
new file mode 100644
index 0000000..a099252
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTextRun.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 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 java.util.List;
+
+public class DrawTextRun extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    int mTextID;
+    int mStart = 0;
+    int mEnd = 0;
+    int mContextStart = 0;
+    int mContextEnd = 0;
+    float mX = 0f;
+    float mY = 0f;
+    boolean mRtl = false;
+
+    public DrawTextRun(int textID,
+                       int start,
+                       int end,
+                       int contextStart,
+                       int contextEnd,
+                       float x,
+                       float y,
+                       boolean rtl) {
+        mTextID = textID;
+        mStart = start;
+        mEnd = end;
+        mContextStart = contextStart;
+        mContextEnd = contextEnd;
+        mX = x;
+        mY = y;
+        mRtl = rtl;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mTextID, mStart, mEnd, mContextStart, mContextEnd, mX, mY, mRtl);
+
+    }
+
+    @Override
+    public String toString() {
+        return "";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @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();
+            DrawTextRun op = new DrawTextRun(text, start, end, contextStart, contextEnd, x, y, rtl);
+
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "";
+        }
+
+        @Override
+        public int id() {
+            return 0;
+        }
+
+        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);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.drawTextRun(mTextID, mStart, mEnd, mContextStart, mContextEnd, mX, mY, mRtl);
+    }
+}
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
new file mode 100644
index 0000000..ef0a4ad
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/DrawTweenPath.java
@@ -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.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 java.util.List;
+
+public class DrawTweenPath extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mTween;
+    float mStart;
+    float mStop;
+    int mPath1Id;
+    int mPath2Id;
+
+    public DrawTweenPath(
+            int path1Id,
+            int path2Id,
+            float tween,
+            float start,
+            float stop) {
+        mTween = tween;
+        mStart = start;
+        mStop = stop;
+        mPath1Id = path1Id;
+        mPath2Id = path2Id;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mPath1Id,
+                mPath2Id,
+                mTween,
+                mStart,
+                mStop);
+    }
+
+    @Override
+    public String toString() {
+        return "DrawTweenPath " + mPath1Id + " " + mPath2Id
+                + " " + mTween + " " + mStart + " "
+                + "- " + mStop + ";";
+    }
+
+    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);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.drawTweenPath(mPath1Id,
+                mPath2Id,
+                mTween,
+                mStart,
+                mStop);
+    }
+
+}
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 eca43c5..aabed15e 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
@@ -26,11 +26,11 @@
 
 /**
  * Describe some basic information for a RemoteCompose document
- *
+ * <p>
  * It encodes the version of the document (following semantic versioning) as well
  * as the dimensions of the document in pixels.
  */
-public class Header  implements RemoteComposeOperation {
+public class Header implements RemoteComposeOperation {
     public static final int MAJOR_VERSION = 0;
     public static final int MINOR_VERSION = 1;
     public static final int PATCH_VERSION = 0;
@@ -89,7 +89,8 @@
     }
 
     public static class Companion implements CompanionOperation {
-        private Companion() {}
+        private Companion() {
+        }
 
         @Override
         public String name() {
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
new file mode 100644
index 0000000..482e0e2
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRestore.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.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 java.util.List;
+
+public class MatrixRestore extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+
+    public MatrixRestore() {
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer);
+    }
+
+    @Override
+    public String toString() {
+        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);
+        }
+    }
+
+    @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
new file mode 100644
index 0000000..d6c89e0
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixRotate.java
@@ -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.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 java.util.List;
+
+public class MatrixRotate extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mRotate, mPivotX, mPivotY;
+
+    public MatrixRotate(float rotate, float pivotX, float pivotY) {
+        mRotate = rotate;
+        mPivotX = pivotX;
+        mPivotY = pivotY;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mRotate, mPivotX, mPivotY);
+    }
+
+    @Override
+    public String toString() {
+        return "DrawArc " + mRotate + ", " + mPivotX + ", " + mPivotY + ";";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @Override
+        public void read(WireBuffer buffer, List<Operation> operations) {
+            float rotate = buffer.readFloat();
+            float pivotX = buffer.readFloat();
+            float pivotY = buffer.readFloat();
+            MatrixRotate op = new MatrixRotate(rotate, pivotX, pivotY);
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "Matrix";
+        }
+
+        @Override
+        public int id() {
+            return Operations.MATRIX_ROTATE;
+        }
+
+        public void apply(WireBuffer buffer, float rotate, float pivotX, float pivotY) {
+            buffer.start(Operations.MATRIX_ROTATE);
+            buffer.writeFloat(rotate);
+            buffer.writeFloat(pivotX);
+            buffer.writeFloat(pivotY);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.matrixRotate(mRotate, mPivotX, mPivotY);
+    }
+}
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
new file mode 100644
index 0000000..d3d5bfb
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSave.java
@@ -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.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 java.util.List;
+
+public class MatrixSave extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+
+    public MatrixSave() {
+
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer);
+    }
+
+    @Override
+    public String toString() {
+        return "MatrixSave;";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @Override
+        public void read(WireBuffer buffer, List<Operation> operations) {
+
+            MatrixSave op = new MatrixSave();
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "Matrix";
+        }
+
+        @Override
+        public int id() {
+            return Operations.MATRIX_SAVE;
+        }
+
+        public void apply(WireBuffer buffer) {
+            buffer.start(Operations.MATRIX_SAVE);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.matrixSave();
+    }
+}
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
new file mode 100644
index 0000000..28aa68dd
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixScale.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 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 java.util.List;
+
+public class MatrixScale extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mScaleX, mScaleY;
+    float mCenterX, mCenterY;
+
+    public MatrixScale(float scaleX, float scaleY, float centerX, float centerY) {
+        mScaleX = scaleX;
+        mScaleY = scaleY;
+        mCenterX = centerX;
+        mCenterY = centerY;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mScaleX, mScaleY, mCenterX, mCenterY);
+    }
+
+    @Override
+    public String toString() {
+        return "MatrixScale " + mScaleY + ", " + mScaleY + ";";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @Override
+        public void read(WireBuffer buffer, List<Operation> operations) {
+            float scaleX = buffer.readFloat();
+            float scaleY = buffer.readFloat();
+            float centerX = buffer.readFloat();
+            float centerY = buffer.readFloat();
+            MatrixScale op = new MatrixScale(scaleX, scaleY, centerX, centerY);
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "Matrix";
+        }
+
+        @Override
+        public int id() {
+            return Operations.MATRIX_SCALE;
+        }
+
+        public void apply(WireBuffer buffer, float scaleX, float scaleY,
+                float centerX, float centerY) {
+            buffer.start(Operations.MATRIX_SCALE);
+            buffer.writeFloat(scaleX);
+            buffer.writeFloat(scaleY);
+            buffer.writeFloat(centerX);
+            buffer.writeFloat(centerY);
+
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.mtrixScale(mScaleX, mScaleY, mCenterX, mCenterY);
+    }
+}
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
new file mode 100644
index 0000000..a388899
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixSkew.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 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 java.util.List;
+
+public class MatrixSkew extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mSkewX, mSkewY;
+
+    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);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.matrixSkew(mSkewX, mSkewY);
+    }
+}
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
new file mode 100644
index 0000000..3298752
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/MatrixTranslate.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 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 java.util.List;
+
+public class MatrixTranslate extends PaintOperation {
+    public static final Companion COMPANION = new Companion();
+    float mTranslateX, mTranslateY;
+
+    public MatrixTranslate(float translateX, float translateY) {
+        mTranslateX = translateX;
+        mTranslateY = translateY;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mTranslateX, mTranslateY);
+    }
+
+    @Override
+    public String toString() {
+        return "DrawArc " + mTranslateY + ", " + mTranslateY + ";";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @Override
+        public void read(WireBuffer buffer, List<Operation> operations) {
+            float translateX = buffer.readFloat();
+            float translateY = buffer.readFloat();
+            MatrixTranslate op = new MatrixTranslate(translateX, translateY);
+            operations.add(op);
+        }
+
+        @Override
+        public String name() {
+            return "Matrix";
+        }
+
+        @Override
+        public int id() {
+            return Operations.MATRIX_TRANSLATE;
+        }
+
+        public void apply(WireBuffer buffer, float translateX, float translateY) {
+            buffer.start(Operations.MATRIX_TRANSLATE);
+            buffer.writeFloat(translateX);
+            buffer.writeFloat(translateY);
+        }
+    }
+
+    @Override
+    public void paint(PaintContext context) {
+        context.matrixTranslate(mTranslateX, mTranslateY);
+    }
+}
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
new file mode 100644
index 0000000..e5683ec
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PaintData.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.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.operations.paint.PaintBundle;
+
+import java.util.List;
+
+public class PaintData extends PaintOperation {
+    public PaintBundle mPaintData = new PaintBundle();
+    public static final Companion COMPANION = new Companion();
+    public static final int MAX_STRING_SIZE = 4000;
+
+    public PaintData() {
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mPaintData);
+    }
+
+    @Override
+    public String toString() {
+        return "PaintData " + "\"" + mPaintData + "\"";
+    }
+
+    public static class Companion implements CompanionOperation {
+        private Companion() {
+        }
+
+        @Override
+        public String name() {
+            return "TextData";
+        }
+
+        @Override
+        public int id() {
+            return Operations.PAINT_VALUES;
+        }
+
+        public 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);
+        }
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return indent + toString();
+    }
+
+    @Override
+    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
new file mode 100644
index 0000000..2646b27
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/PathData.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 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.RemoteContext;
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+
+import java.util.List;
+
+public class PathData implements Operation {
+    public static final Companion COMPANION = new Companion();
+    int mInstanceId;
+    float[] mRef;
+    float[] mFloatPath;
+    float[] mRetFloats;
+
+    PathData(int instanceId, float[] floatPath) {
+        mInstanceId = instanceId;
+        mFloatPath = floatPath;
+    }
+
+    @Override
+    public void write(WireBuffer buffer) {
+        COMPANION.apply(buffer, mInstanceId, mFloatPath);
+    }
+
+    @Override
+    public String deepToString(String indent) {
+        return pathString(mFloatPath);
+    }
+
+    public float[] getFloatPath(PaintContext context) {
+        float[] ret = mRetFloats; // Assume retFloats is declared elsewhere
+        if (ret == null) {
+            return mFloatPath; // Assume floatPath is declared elsewhere
+        }
+        float[] localRef = mRef; // Assume ref is of type Float[]
+        if (localRef == null) {
+            for (int i = 0; i < mFloatPath.length; i++) {
+                ret[i] = mFloatPath[i];
+            }
+        } else {
+            for (int i = 0; i < mFloatPath.length; i++) {
+                float lr = localRef[i];
+                if (Float.isNaN(lr)) {
+                    ret[i] = Utils.getActualValue(lr);
+                } else {
+                    ret[i] = mFloatPath[i];
+                }
+            }
+        }
+        return ret;
+    }
+
+    public static final int MOVE = 10;
+    public static final int LINE = 11;
+    public static final int QUADRATIC = 12;
+    public static final int CONIC = 13;
+    public static final int CUBIC = 14;
+    public static final int CLOSE = 15;
+    public static final int DONE = 16;
+    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);
+    public static final float CONIC_NAN = Utils.asNan(CONIC);
+    public static final float CUBIC_NAN = Utils.asNan(CUBIC);
+    public static final float CLOSE_NAN = Utils.asNan(CLOSE);
+    public static final float DONE_NAN = Utils.asNan(DONE);
+
+    public static class Companion implements CompanionOperation {
+
+        private Companion() {
+        }
+
+        @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 String pathString(float[] path) {
+        if (path == null) {
+            return "null";
+        }
+        StringBuilder str = new StringBuilder();
+        for (int i = 0; i < path.length; i++) {
+            if (i != 0) {
+                str.append(" ");
+            }
+            if (Float.isNaN(path[i])) {
+                int id = Utils.idFromNan(path[i]); // Assume idFromNan is defined elsewhere
+                if (id <= DONE) { // Assume DONE is a constant
+                    switch (id) {
+                        case MOVE:
+                            str.append("M");
+                            break;
+                        case LINE:
+                            str.append("L");
+                            break;
+                        case QUADRATIC:
+                            str.append("Q");
+                            break;
+                        case CONIC:
+                            str.append("R");
+                            break;
+                        case CUBIC:
+                            str.append("C");
+                            break;
+                        case CLOSE:
+                            str.append("Z");
+                            break;
+                        case DONE:
+                            str.append(".");
+                            break;
+                        default:
+                            str.append("X");
+                            break;
+                    }
+                } else {
+                    str.append("(" + id + ")");
+                }
+            } else {
+                str.append(path[i]);
+            }
+        }
+        return str.toString();
+    }
+
+    @Override
+    public void apply(RemoteContext context) {
+        context.loadPathData(mInstanceId, mFloatPath);
+    }
+
+}
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 ad4caea..6d924eb 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
@@ -28,7 +28,7 @@
 
 /**
  * Describe some basic information for a RemoteCompose document
- *
+ * <p>
  * It encodes the version of the document (following semantic versioning) as well
  * as the dimensions of the document in pixels.
  */
@@ -100,21 +100,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 RootContentBehavior(int scroll, int alignment, int sizing, int mode) {
         switch (scroll) {
@@ -149,10 +149,12 @@
         switch (sizing) {
             case SIZING_LAYOUT: {
                 Log.e(TAG, "sizing_layout is not yet supported");
-            } break;
+            }
+            break;
             case SIZING_SCALE: {
                 mSizing = sizing;
-            } break;
+            }
+            break;
             default: {
                 Log.e(TAG, "incorrect sizing value " + sizing);
             }
@@ -200,7 +202,8 @@
     }
 
     public static class Companion implements CompanionOperation {
-        private Companion() {}
+        private Companion() {
+        }
 
         @Override
         public String name() {
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
new file mode 100644
index 0000000..00e2f20
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/Utils.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.internal.widget.remotecompose.core.operations;
+
+public class Utils {
+    public static float asNan(int v) {
+        return Float.intBitsToFloat(v | -0x800000);
+    }
+
+    public static int idFromNan(float value) {
+        int b =  Float.floatToRawIntBits(value);
+        return b & 0xFFFFF;
+    }
+
+    public static float getActualValue(float lr) {
+        return 0;
+    }
+
+    String getFloatString(float value) {
+        if (Float.isNaN(value)) {
+            int id = idFromNan(value);
+            if (id > 0) {
+                return "NaN(" + id + ")";
+            }
+        }
+        return "" + 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
new file mode 100644
index 0000000..8abb0bf
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintBundle.java
@@ -0,0 +1,829 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.paint;
+
+import com.android.internal.widget.remotecompose.core.WireBuffer;
+
+import java.util.Arrays;
+
+public class PaintBundle {
+    int[] mArray = new int[200];
+    int mPos = 0;
+
+    public void applyPaintChange(PaintChanges p) {
+        int i = 0;
+        int mask = 0;
+        while (i < mPos) {
+            int cmd = mArray[i++];
+            mask = mask | (1 << (cmd - 1));
+            switch (cmd & 0xFFFF) {
+                case TEXT_SIZE: {
+                    p.setTextSize(Float.intBitsToFloat(mArray[i++]));
+                    break;
+                }
+                case TYPEFACE:
+                    int style = (cmd >> 16);
+                    int weight = style & 0x3ff;
+                    boolean italic = (style >> 10) > 0;
+                    int font_type = mArray[i++];
+
+                    p.setTypeFace(font_type, weight, italic);
+                    break;
+                case COLOR: {
+                    p.setColor(mArray[i++]);
+                    break;
+                }
+                case STROKE_WIDTH: {
+                    p.setStrokeWidth(Float.intBitsToFloat(mArray[i++]));
+                    break;
+                }
+                case STROKE_MITER: {
+                    p.setStrokeMiter(Float.intBitsToFloat(mArray[i++]));
+                    break;
+                }
+                case STROKE_CAP: {
+                    p.setStrokeCap(cmd >> 16);
+                    break;
+                }
+                case STYLE: {
+                    p.setStyle(cmd >> 16);
+                    break;
+                }
+                case SHADER: {
+                    break;
+                }
+                case STROKE_JOIN: {
+                    p.setStrokeJoin(cmd >> 16);
+                    break;
+                }
+                case IMAGE_FILTER_QUALITY: {
+                    p.setImageFilterQuality(cmd >> 16);
+                    break;
+                }
+                case BLEND_MODE: {
+                    p.setBlendMode(cmd >> 16);
+                    break;
+                }
+                case FILTER_BITMAP: {
+                    p.setFilterBitmap(!((cmd >> 16) == 0));
+                    break;
+                }
+
+                case GRADIENT: {
+                    i = callSetGradient(cmd, mArray, i, p);
+                    break;
+                }
+                case COLOR_FILTER: {
+                    p.setColorFilter(mArray[i++], cmd >> 16);
+                    break;
+                }
+                case ALPHA: {
+                    p.setAlpha(Float.intBitsToFloat(mArray[i++]));
+                    break;
+                }
+            }
+        }
+
+        mask = (~mask) & PaintChanges.VALID_BITS;
+
+        p.clear(mask);
+    }
+
+    private String toName(int id) {
+        switch (id) {
+            case TEXT_SIZE:
+                return "TEXT_SIZE";
+
+            case COLOR:
+                return "COLOR";
+            case STROKE_WIDTH:
+                return "STROKE_WIDTH";
+            case STROKE_MITER:
+                return "STROKE_MITER";
+            case TYPEFACE:
+                return "TYPEFACE";
+            case STROKE_CAP:
+                return "CAP";
+            case STYLE:
+                return "STYLE";
+            case SHADER:
+                return "SHADER";
+            case IMAGE_FILTER_QUALITY:
+                return "IMAGE_FILTER_QUALITY";
+            case BLEND_MODE:
+                return "BLEND_MODE";
+            case FILTER_BITMAP:
+                return "FILTER_BITMAP";
+            case GRADIENT:
+                return "GRADIENT_LINEAR";
+            case ALPHA:
+                return "ALPHA";
+            case COLOR_FILTER:
+                return "COLOR_FILTER";
+
+        }
+        return "????" + id + "????";
+    }
+
+    private static String colorInt(int color) {
+        String str = "000000000000" + Integer.toHexString(color);
+        return "0x" + str.substring(str.length() - 8);
+    }
+
+    private static String colorInt(int[] color) {
+        String str = "[";
+        for (int i = 0; i < color.length; i++) {
+            if (i > 0) {
+                str += ", ";
+            }
+            str += colorInt(color[i]);
+        }
+        return str + "]";
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder ret = new StringBuilder("\n");
+        int i = 0;
+        while (i < mPos) {
+            int cmd = mArray[i++];
+            int type = cmd & 0xFFFF;
+            switch (type) {
+
+                case TEXT_SIZE: {
+                    ret.append("    TextSize(" + Float.intBitsToFloat(mArray[i++]));
+                }
+
+                break;
+                case TYPEFACE: {
+                    int style = (cmd >> 16);
+                    int weight = style & 0x3ff;
+                    boolean italic = (style >> 10) > 0;
+                    int font_type = mArray[i++];
+                    ret.append("    TypeFace(" + (font_type + ", "
+                            + weight + ", " + italic));
+                }
+                break;
+                case COLOR: {
+                    ret.append("    Color(" + colorInt(mArray[i++]));
+                }
+                break;
+                case STROKE_WIDTH: {
+                    ret.append("    StrokeWidth("
+                            + (Float.intBitsToFloat(mArray[i++])));
+                }
+                break;
+                case STROKE_MITER: {
+                    ret.append("    StrokeMiter("
+                            + (Float.intBitsToFloat(mArray[i++])));
+                }
+                break;
+                case STROKE_CAP: {
+                    ret.append("    StrokeCap("
+                            + (cmd >> 16));
+                }
+                break;
+                case STYLE: {
+                    ret.append("    Style(" + (cmd >> 16));
+                }
+                break;
+                case COLOR_FILTER: {
+                    ret.append("    ColorFilter(color="
+                            + colorInt(mArray[i++])
+                            + ", mode=" + blendModeString(cmd >> 16));
+                }
+                break;
+                case SHADER: {
+                }
+                break;
+                case ALPHA: {
+                    ret.append("    Alpha("
+                            + (Float.intBitsToFloat(mArray[i++])));
+                }
+                break;
+                case IMAGE_FILTER_QUALITY: {
+                    ret.append("    ImageFilterQuality(" + (cmd >> 16));
+                }
+                break;
+                case BLEND_MODE: {
+                    ret.append("    BlendMode(" + blendModeString(cmd >> 16));
+                }
+                break;
+                case FILTER_BITMAP: {
+                    ret.append("    FilterBitmap("
+                            + (!((cmd >> 16) == 0)));
+                }
+                break;
+                case STROKE_JOIN: {
+                    ret.append("    StrokeJoin(" + (cmd >> 16));
+                }
+                break;
+                case ANTI_ALIAS: {
+                    ret.append("    AntiAlias(" + (cmd >> 16));
+                }
+                break;
+                case GRADIENT: {
+                    i = callPrintGradient(cmd, mArray, i, ret);
+                }
+            }
+            ret.append("),\n");
+        }
+        return ret.toString();
+    }
+
+
+    int callPrintGradient(int cmd, int[] array, int i, StringBuilder p) {
+        int ret = i;
+        int type = (cmd >> 16);
+        switch (type) {
+
+            case 0: {
+                p.append("    LinearGradient(\n");
+                int len = array[ret++];
+                int[] colors = null;
+                if (len > 0) {
+                    colors = new int[len];
+                    for (int j = 0; j < colors.length; j++) {
+                        colors[j] = array[ret++];
+
+                    }
+                }
+                len = array[ret++];
+                float[] stops = null;
+                if (len > 0) {
+                    stops = new float[len];
+                    for (int j = 0; j < stops.length; j++) {
+                        stops[j] = Float.intBitsToFloat(array[ret++]);
+                    }
+                }
+
+                p.append("      colors = " + colorInt(colors) + ",\n");
+                p.append("      stops = " + Arrays.toString(stops) + ",\n");
+                p.append("      start = ");
+                p.append("[" + Float.intBitsToFloat(array[ret++]));
+                p.append(", " + Float.intBitsToFloat(array[ret++]) + "],\n");
+                p.append("      end = ");
+                p.append("[" + Float.intBitsToFloat(array[ret++]));
+                p.append(", " + Float.intBitsToFloat(array[ret++]) + "],\n");
+                int tileMode = array[ret++];
+                p.append("      tileMode = " + tileMode + "\n    ");
+            }
+
+            break;
+            case 1: {
+                p.append("    RadialGradient(\n");
+                int len = array[ret++];
+                int[] colors = null;
+                if (len > 0) {
+                    colors = new int[len];
+                    for (int j = 0; j < colors.length; j++) {
+                        colors[j] = array[ret++];
+
+                    }
+                }
+                len = array[ret++];
+                float[] stops = null;
+                if (len > 0) {
+                    stops = new float[len];
+                    for (int j = 0; j < stops.length; j++) {
+                        stops[j] = Float.intBitsToFloat(array[ret++]);
+                    }
+                }
+
+                p.append("      colors = " + colorInt(colors) + ",\n");
+                p.append("      stops = " + Arrays.toString(stops) + ",\n");
+                p.append("      center = ");
+                p.append("[" + Float.intBitsToFloat(array[ret++]));
+                p.append(", " + Float.intBitsToFloat(array[ret++]) + "],\n");
+                p.append("      radius =");
+                p.append(" " + Float.intBitsToFloat(array[ret++]) + ",\n");
+                int tileMode = array[ret++];
+                p.append("      tileMode = " + tileMode + "\n    ");
+            }
+
+            break;
+            case 2: {
+                p.append("    SweepGradient(\n");
+                int len = array[ret++];
+                int[] colors = null;
+                if (len > 0) {
+                    colors = new int[len];
+                    for (int j = 0; j < colors.length; j++) {
+                        colors[j] = array[ret++];
+
+                    }
+                }
+                len = array[ret++];
+                float[] stops = null;
+                if (len > 0) {
+                    stops = new float[len];
+                    for (int j = 0; j < stops.length; j++) {
+                        stops[j] = Float.intBitsToFloat(array[ret++]);
+                    }
+                }
+
+                p.append("      colors = " + colorInt(colors) + ",\n");
+                p.append("      stops = " + Arrays.toString(stops) + ",\n");
+                p.append("      center = ");
+                p.append("[" + Float.intBitsToFloat(array[ret++]));
+                p.append(", " + Float.intBitsToFloat(array[ret++]) + "],\n    ");
+
+            }
+            break;
+            default: {
+                p.append("GRADIENT_??????!!!!");
+            }
+        }
+
+        return ret;
+    }
+
+    int callSetGradient(int cmd, int[] array, int i, PaintChanges p) {
+        int ret = i;
+        int gradientType = (cmd >> 16);
+
+        int len = array[ret++];
+        int[] colors = null;
+        if (len > 0) {
+            colors = new int[len];
+            for (int j = 0; j < colors.length; j++) {
+                colors[j] = array[ret++];
+            }
+        }
+        len = array[ret++];
+        float[] stops = null;
+        if (len > 0) {
+            stops = new float[len];
+            for (int j = 0; j < colors.length; j++) {
+                stops[j] = Float.intBitsToFloat(array[ret++]);
+            }
+        }
+
+        if (colors == null) {
+            return ret;
+        }
+
+
+        switch (gradientType) {
+
+            case LINEAR_GRADIENT: {
+                float startX = Float.intBitsToFloat(array[ret++]);
+                float startY = Float.intBitsToFloat(array[ret++]);
+                float endX = Float.intBitsToFloat(array[ret++]);
+                float endY = Float.intBitsToFloat(array[ret++]);
+                int tileMode = array[ret++];
+                p.setLinearGradient(colors, stops, startX,
+                        startY, endX, endY, tileMode);
+            }
+
+            break;
+            case RADIAL_GRADIENT: {
+                float centerX = Float.intBitsToFloat(array[ret++]);
+                float centerY = Float.intBitsToFloat(array[ret++]);
+                float radius = Float.intBitsToFloat(array[ret++]);
+                int tileMode = array[ret++];
+                p.setRadialGradient(colors, stops, centerX, centerY,
+                        radius, tileMode);
+            }
+            break;
+            case SWEEP_GRADIENT: {
+                float centerX = Float.intBitsToFloat(array[ret++]);
+                float centerY = Float.intBitsToFloat(array[ret++]);
+                p.setSweepGradient(colors, stops, centerX, centerY);
+            }
+        }
+
+        return ret;
+    }
+
+    public void writeBundle(WireBuffer buffer) {
+        buffer.writeInt(mPos);
+        for (int index = 0; index < mPos; index++) {
+            buffer.writeInt(mArray[index]);
+        }
+    }
+
+    public void readBundle(WireBuffer buffer) {
+        int len = buffer.readInt();
+        if (len <= 0 || len > 1024) {
+            throw new RuntimeException("buffer corrupt paint len = " + len);
+        }
+        mArray = new int[len];
+        for (int i = 0; i < mArray.length; i++) {
+            mArray[i] = buffer.readInt();
+        }
+        mPos = len;
+    }
+
+    public static final int TEXT_SIZE = 1;  // float
+
+    public static final int COLOR = 4;  // int
+    public static final int STROKE_WIDTH = 5; // float
+    public static final int STROKE_MITER = 6;
+    public static final int STROKE_CAP = 7; // int
+    public static final int STYLE = 8; // int
+    public static final int SHADER = 9; // int
+    public static final int IMAGE_FILTER_QUALITY = 10; // int
+    public static final int GRADIENT = 11;
+    public static final int ALPHA = 12;
+    public static final int COLOR_FILTER = 13;
+    public static final int ANTI_ALIAS = 14;
+    public static final int STROKE_JOIN = 15;
+    public static final int TYPEFACE = 16;
+    public static final int FILTER_BITMAP = 17;
+    public static final int BLEND_MODE = 18;
+
+
+    public static final int BLEND_MODE_CLEAR = 0;
+    public static final int BLEND_MODE_SRC = 1;
+    public static final int BLEND_MODE_DST = 2;
+    public static final int BLEND_MODE_SRC_OVER = 3;
+    public static final int BLEND_MODE_DST_OVER = 4;
+    public static final int BLEND_MODE_SRC_IN = 5;
+    public static final int BLEND_MODE_DST_IN = 6;
+    public static final int BLEND_MODE_SRC_OUT = 7;
+    public static final int BLEND_MODE_DST_OUT = 8;
+    public static final int BLEND_MODE_SRC_ATOP = 9;
+    public static final int BLEND_MODE_DST_ATOP = 10;
+    public static final int BLEND_MODE_XOR = 11;
+    public static final int BLEND_MODE_PLUS = 12;
+    public static final int BLEND_MODE_MODULATE = 13;
+    public static final int BLEND_MODE_SCREEN = 14;
+    public static final int BLEND_MODE_OVERLAY = 15;
+    public static final int BLEND_MODE_DARKEN = 16;
+    public static final int BLEND_MODE_LIGHTEN = 17;
+    public static final int BLEND_MODE_COLOR_DODGE = 18;
+    public static final int BLEND_MODE_COLOR_BURN = 19;
+    public static final int BLEND_MODE_HARD_LIGHT = 20;
+    public static final int BLEND_MODE_SOFT_LIGHT = 21;
+    public static final int BLEND_MODE_DIFFERENCE = 22;
+    public static final int BLEND_MODE_EXCLUSION = 23;
+    public static final int BLEND_MODE_MULTIPLY = 24;
+    public static final int BLEND_MODE_HUE = 25;
+    public static final int BLEND_MODE_SATURATION = 26;
+    public static final int BLEND_MODE_COLOR = 27;
+    public static final int BLEND_MODE_LUMINOSITY = 28;
+    public static final int BLEND_MODE_NULL = 29;
+    public static final int PORTER_MODE_ADD = 30;
+
+    public static final int FONT_NORMAL = 0;
+    public static final int FONT_BOLD = 1;
+    public static final int FONT_ITALIC = 2;
+    public static final int FONT_BOLD_ITALIC = 3;
+
+    public static final int FONT_TYPE_DEFAULT = 0;
+    public static final int FONT_TYPE_SANS_SERIF = 1;
+    public static final int FONT_TYPE_SERIF = 2;
+    public static final int FONT_TYPE_MONOSPACE = 3;
+
+    public static final int STYLE_FILL = 0;
+    public static final int STYLE_STROKE = 1;
+    public static final int STYLE_FILL_AND_STROKE = 2;
+    public static final int LINEAR_GRADIENT = 0;
+    public static final int RADIAL_GRADIENT = 1;
+    public static final int SWEEP_GRADIENT = 2;
+
+    /**
+     * sets a shader that draws a linear gradient along a line.
+     *
+     * @param startX   The x-coordinate for the start of the gradient line
+     * @param startY   The y-coordinate for the start of the gradient line
+     * @param endX     The x-coordinate for the end of the gradient line
+     * @param endY     The y-coordinate for the end of the gradient line
+     * @param colors   The sRGB colors to be distributed along the gradient line
+     * @param stops    May be null. The relative positions [0..1] of
+     *                 each corresponding color in the colors array. If this is null,
+     *                 the colors are distributed evenly along the gradient line.
+     * @param tileMode The Shader tiling mode
+     */
+    public void setLinearGradient(int[] colors,
+                                  float[] stops,
+                                  float startX,
+                                  float startY,
+                                  float endX,
+                                  float endY,
+                                  int tileMode) {
+        int startPos = mPos;
+        int len;
+        mArray[mPos++] = GRADIENT | (LINEAR_GRADIENT << 16);
+        mArray[mPos++] = len = (colors == null) ? 0 : colors.length;
+        for (int i = 0; i < len; i++) {
+            mArray[mPos++] = colors[i];
+        }
+
+        mArray[mPos++] = len = (stops == null) ? 0 : stops.length;
+        for (int i = 0; i < len; i++) {
+            mArray[mPos++] = Float.floatToRawIntBits(stops[i]);
+        }
+        mArray[mPos++] = Float.floatToRawIntBits(startX);
+        mArray[mPos++] = Float.floatToRawIntBits(startY);
+        mArray[mPos++] = Float.floatToRawIntBits(endX);
+        mArray[mPos++] = Float.floatToRawIntBits(endY);
+        mArray[mPos++] = tileMode;
+    }
+
+    /**
+     * Set a shader that draws a sweep gradient around a center point.
+     *
+     * @param centerX The x-coordinate of the center
+     * @param centerY The y-coordinate of the center
+     * @param colors  The sRGB colors to be distributed around the center.
+     *                There must be at least 2 colors in the array.
+     * @param stops   May be NULL. The relative position of
+     *                each corresponding color in the colors array, beginning
+     *                with 0 and ending with 1.0. If the values are not
+     *                monotonic, the drawing may produce unexpected results.
+     *                If positions is NULL, then the colors are automatically
+     *                spaced evenly.
+     */
+    public void setSweepGradient(int[] colors, float[] stops, float centerX, float centerY) {
+        int startPos = mPos;
+        int len;
+        mArray[mPos++] = GRADIENT | (SWEEP_GRADIENT << 16);
+        mArray[mPos++] = len = (colors == null) ? 0 : colors.length;
+        for (int i = 0; i < len; i++) {
+            mArray[mPos++] = colors[i];
+        }
+
+        mArray[mPos++] = len = (stops == null) ? 0 : stops.length;
+        for (int i = 0; i < len; i++) {
+            mArray[mPos++] = Float.floatToRawIntBits(stops[i]);
+        }
+        mArray[mPos++] = Float.floatToRawIntBits(centerX);
+        mArray[mPos++] = Float.floatToRawIntBits(centerY);
+    }
+
+    /**
+     * Sets a shader that draws a radial gradient given the center and radius.
+     *
+     * @param centerX  The x-coordinate of the center of the radius
+     * @param centerY  The y-coordinate of the center of the radius
+     * @param radius   Must be positive. The radius of the gradient.
+     * @param colors   The sRGB colors distributed between the center and edge
+     * @param stops    May be <code>null</code>.
+     *                 Valid values are between <code>0.0f</code> and
+     *                 <code>1.0f</code>. The relative position of each
+     *                 corresponding color in
+     *                 the colors array. If <code>null</code>, colors are
+     *                 distributed evenly
+     *                 between the center and edge of the circle.
+     * @param tileMode The Shader tiling mode
+     */
+    public void setRadialGradient(int[] colors,
+                                  float[] stops,
+                                  float centerX,
+                                  float centerY,
+                                  float radius,
+                                  int tileMode) {
+        int startPos = mPos;
+        int len;
+        mArray[mPos++] = GRADIENT | (RADIAL_GRADIENT << 16);
+        mArray[mPos++] = len = (colors == null) ? 0 : colors.length;
+        for (int i = 0; i < len; i++) {
+            mArray[mPos++] = colors[i];
+        }
+        mArray[mPos++] = len = (stops == null) ? 0 : stops.length;
+
+        for (int i = 0; i < len; i++) {
+            mArray[mPos++] = Float.floatToRawIntBits(stops[i]);
+        }
+        mArray[mPos++] = Float.floatToRawIntBits(centerX);
+        mArray[mPos++] = Float.floatToRawIntBits(centerY);
+        mArray[mPos++] = Float.floatToRawIntBits(radius);
+        mArray[mPos++] = tileMode;
+
+    }
+
+    /**
+     * Create a color filter that uses the specified color and Porter-Duff mode.
+     *
+     * @param color The ARGB source color used with the Porter-Duff mode
+     * @param mode  The porter-duff mode that is applied
+     */
+    public void setColorFilter(int color, int mode) {
+        mArray[mPos] = COLOR_FILTER | (mode << 16);
+        mPos++;
+        mArray[mPos++] = color;
+    }
+
+    /**
+     * Set the paint's text size. This value must be > 0
+     *
+     * @param size set the paint's text size in pixel units.
+     */
+    public void setTextSize(float size) {
+        int p = mPos;
+        mArray[mPos] = TEXT_SIZE;
+        mPos++;
+        mArray[mPos] = Float.floatToRawIntBits(size);
+        mPos++;
+    }
+
+    /**
+     * @param fontType 0 = default 1 = sans serif 2 = serif 3 = monospace
+     * @param weight    100-1000
+     * @param italic    tur
+     */
+    public void setTextStyle(int fontType, int weight, boolean italic) {
+        int style = (weight & 0x3FF) | (italic ? 2048 : 0);  // pack the weight and italic
+        mArray[mPos++] = TYPEFACE | (style << 16);
+        mArray[mPos++] = fontType;
+    }
+
+    /**
+     * Set the width for stroking.
+     * Pass 0 to stroke in hairline mode.
+     * Hairlines always draws a single pixel independent of the canvas's matrix.
+     *
+     * @param width set the paint's stroke width, used whenever the paint's
+     *              style is Stroke or StrokeAndFill.
+     */
+    public void setStrokeWidth(float width) {
+        mArray[mPos] = STROKE_WIDTH;
+        mPos++;
+        mArray[mPos] = Float.floatToRawIntBits(width);
+        mPos++;
+    }
+
+    public void setColor(int color) {
+        mArray[mPos] = COLOR;
+        mPos++;
+        mArray[mPos] = color;
+        mPos++;
+    }
+
+    /**
+     * Set the paint's Cap.
+     *
+     * @param cap set the paint's line cap style, used whenever the paint's
+     *            style is Stroke or StrokeAndFill.
+     */
+    public void setStrokeCap(int cap) {
+        mArray[mPos] = STROKE_CAP | (cap << 16);
+        mPos++;
+    }
+
+    public void setStyle(int style) {
+        mArray[mPos] = STYLE | (style << 16);
+        mPos++;
+    }
+
+    public void setShader(int shader, String shaderString) {
+        mArray[mPos] = SHADER | (shader << 16);
+        mPos++;
+    }
+
+    public void setAlpha(float alpha) {
+        mArray[mPos] = ALPHA;
+        mPos++;
+        mArray[mPos] = Float.floatToRawIntBits(alpha);
+        mPos++;
+    }
+
+    /**
+     * Set the paint's stroke miter value. This is used to control the behavior
+     * of miter joins when the joins angle is sharp. This value must be >= 0.
+     *
+     * @param miter set the miter limit on the paint, used whenever the paint's
+     *              style is Stroke or StrokeAndFill.
+     */
+    public void setStrokeMiter(float miter) {
+        mArray[mPos] = STROKE_MITER;
+        mPos++;
+        mArray[mPos] = Float.floatToRawIntBits(miter);
+        mPos++;
+    }
+
+    /**
+     * Set the paint's Join.
+     *
+     * @param join set the paint's Join, used whenever the paint's style is
+     *             Stroke or StrokeAndFill.
+     */
+    public void setStrokeJoin(int join) {
+        mArray[mPos] = STROKE_JOIN | (join << 16);
+        mPos++;
+    }
+
+    public void setFilterBitmap(boolean filter) {
+        mArray[mPos] = FILTER_BITMAP | (filter ? (1 << 16) : 0);
+        mPos++;
+    }
+
+    /**
+     * Set or clear the blend mode. A blend mode defines how source pixels
+     * (generated by a drawing command) are composited with the
+     * destination pixels
+     * (content of the render target).
+     *
+     *
+     * @param blendmode The blend mode to be installed in the paint
+     */
+    public void setBlendMode(int blendmode) {
+        mArray[mPos] = BLEND_MODE | (blendmode << 16);
+        mPos++;
+    }
+
+    /**
+     * Helper for setFlags(), setting or clearing the ANTI_ALIAS_FLAG bit
+     * AntiAliasing smooths out the edges of what is being drawn, but is has
+     * no impact on the interior of the shape. See setDither() and
+     * setFilterBitmap() to affect how colors are treated.
+     *
+     * @param aa true to set the antialias bit in the flags, false to clear it
+     */
+    public void setAntiAlias(boolean aa) {
+        mArray[mPos] = ANTI_ALIAS | (((aa) ? 1 : 0) << 16);
+        mPos++;
+    }
+
+    public void clear(long mask) { // unused for now
+    }
+
+    public void reset() {
+        mPos = 0;
+    }
+
+    public static String blendModeString(int mode) {
+        switch (mode) {
+            case PaintBundle.BLEND_MODE_CLEAR:
+                return "CLEAR";
+            case PaintBundle.BLEND_MODE_SRC:
+                return "SRC";
+            case PaintBundle.BLEND_MODE_DST:
+                return "DST";
+            case PaintBundle.BLEND_MODE_SRC_OVER:
+                return "SRC_OVER";
+            case PaintBundle.BLEND_MODE_DST_OVER:
+                return "DST_OVER";
+            case PaintBundle.BLEND_MODE_SRC_IN:
+                return "SRC_IN";
+            case PaintBundle.BLEND_MODE_DST_IN:
+                return "DST_IN";
+            case PaintBundle.BLEND_MODE_SRC_OUT:
+                return "SRC_OUT";
+            case PaintBundle.BLEND_MODE_DST_OUT:
+                return "DST_OUT";
+            case PaintBundle.BLEND_MODE_SRC_ATOP:
+                return "SRC_ATOP";
+            case PaintBundle.BLEND_MODE_DST_ATOP:
+                return "DST_ATOP";
+            case PaintBundle.BLEND_MODE_XOR:
+                return "XOR";
+            case PaintBundle.BLEND_MODE_PLUS:
+                return "PLUS";
+            case PaintBundle.BLEND_MODE_MODULATE:
+                return "MODULATE";
+            case PaintBundle.BLEND_MODE_SCREEN:
+                return "SCREEN";
+            case PaintBundle.BLEND_MODE_OVERLAY:
+                return "OVERLAY";
+            case PaintBundle.BLEND_MODE_DARKEN:
+                return "DARKEN";
+            case PaintBundle.BLEND_MODE_LIGHTEN:
+                return "LIGHTEN";
+            case PaintBundle.BLEND_MODE_COLOR_DODGE:
+                return "COLOR_DODGE";
+            case PaintBundle.BLEND_MODE_COLOR_BURN:
+                return "COLOR_BURN";
+            case PaintBundle.BLEND_MODE_HARD_LIGHT:
+                return "HARD_LIGHT";
+            case PaintBundle.BLEND_MODE_SOFT_LIGHT:
+                return "SOFT_LIGHT";
+            case PaintBundle.BLEND_MODE_DIFFERENCE:
+                return "DIFFERENCE";
+            case PaintBundle.BLEND_MODE_EXCLUSION:
+                return "EXCLUSION";
+            case PaintBundle.BLEND_MODE_MULTIPLY:
+                return "MULTIPLY";
+            case PaintBundle.BLEND_MODE_HUE:
+                return "HUE";
+            case PaintBundle.BLEND_MODE_SATURATION:
+                return "SATURATION";
+            case PaintBundle.BLEND_MODE_COLOR:
+                return "COLOR";
+            case PaintBundle.BLEND_MODE_LUMINOSITY:
+                return "LUMINOSITY";
+            case PaintBundle.BLEND_MODE_NULL:
+                return "null";
+            case PaintBundle.PORTER_MODE_ADD:
+                return "ADD";
+        }
+        return "null";
+    }
+
+}
+
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintChangeAdapter.java b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintChangeAdapter.java
new file mode 100644
index 0000000..994bf6d
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintChangeAdapter.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.paint;
+
+public class PaintChangeAdapter implements PaintChanges {
+
+    @Override
+    public void setTextSize(float size) {
+
+    }
+
+    @Override
+    public void setTypeFace(int fontType, int weight, boolean italic) {
+
+    }
+
+
+    @Override
+    public void setStrokeWidth(float width) {
+
+    }
+
+    @Override
+    public void setColor(int color) {
+
+    }
+
+    @Override
+    public void setStrokeCap(int cap) {
+
+    }
+
+    @Override
+    public void setStyle(int style) {
+
+    }
+
+    @Override
+    public void setShader(int shader, String shaderString) {
+
+    }
+
+    @Override
+    public void setImageFilterQuality(int quality) {
+
+    }
+
+    @Override
+    public void setAlpha(float a) {
+
+    }
+
+    @Override
+    public void setStrokeMiter(float miter) {
+
+    }
+
+    @Override
+    public void setStrokeJoin(int join) {
+
+    }
+
+    @Override
+    public void setFilterBitmap(boolean filter) {
+
+    }
+
+    @Override
+    public void setBlendMode(int blendmode) {
+
+    }
+
+    @Override
+    public void setAntiAlias(boolean aa) {
+
+    }
+
+    @Override
+    public void clear(long mask) {
+
+    }
+
+    @Override
+    public void setLinearGradient(int[] colorsArray,
+                                  float[] stopsArray,
+                                  float startX,
+                                  float startY,
+                                  float endX,
+                                  float endY,
+                                  int tileMode) {
+
+    }
+
+    @Override
+    public void setRadialGradient(int[] colorsArray,
+                                  float[] stopsArray,
+                                  float centerX,
+                                  float centerY,
+                                  float radius,
+                                  int tileMode) {
+
+    }
+
+    @Override
+    public void setSweepGradient(int[] colorsArray,
+                                 float[] stopsArray,
+                                 float centerX,
+                                 float centerY) {
+
+    }
+
+    @Override
+    public void setColorFilter(int color, int mode) {
+
+    }
+
+}
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintChanges.java b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintChanges.java
new file mode 100644
index 0000000..87e58ac
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/PaintChanges.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.paint;
+
+public interface PaintChanges {
+
+
+    int CLEAR_TEXT_STYLE = 1 << (PaintBundle.TYPEFACE - 1);
+    int CLEAR_COLOR = 1 << (PaintBundle.COLOR - 1);
+    int CLEAR_STROKE_WIDTH = 1 << (PaintBundle.STROKE_WIDTH - 1);
+    int CLEAR_STROKE_MITER = 1 << (PaintBundle.STROKE_MITER - 1);
+    int CLEAR_CAP = 1 << (PaintBundle.STROKE_CAP - 1);
+    int CLEAR_STYLE = 1 << (PaintBundle.STYLE - 1);
+    int CLEAR_SHADER = 1 << (PaintBundle.SHADER - 1);
+    int CLEAR_IMAGE_FILTER_QUALITY =
+            1 << (PaintBundle.IMAGE_FILTER_QUALITY - 1);
+    int CLEAR_RADIENT = 1 << (PaintBundle.GRADIENT - 1);
+    int CLEAR_ALPHA = 1 << (PaintBundle.ALPHA - 1);
+    int CLEAR_COLOR_FILTER = 1 << (PaintBundle.COLOR_FILTER - 1);
+    int VALID_BITS = 0x1FFF; // only the first 13 bit are valid now
+
+
+    void setTextSize(float size);
+    void setStrokeWidth(float width);
+    void setColor(int color);
+    void setStrokeCap(int cap);
+    void setStyle(int style);
+    void setShader(int shader, String shaderString);
+    void setImageFilterQuality(int quality);
+    void setAlpha(float a);
+    void setStrokeMiter(float miter);
+    void setStrokeJoin(int join);
+    void setFilterBitmap(boolean filter);
+    void setBlendMode(int mode);
+    void setAntiAlias(boolean aa);
+    void clear(long mask);
+    void setLinearGradient(
+            int[] colorsArray,
+            float[] stopsArray,
+            float startX,
+            float startY,
+            float endX,
+            float endY,
+            int tileMode
+    );
+
+    void setRadialGradient(
+            int[] colorsArray,
+            float[] stopsArray,
+            float centerX,
+            float centerY,
+            float radius,
+            int tileMode
+    );
+
+    void setSweepGradient(
+            int[] colorsArray,
+            float[] stopsArray,
+            float centerX,
+            float centerY
+    );
+
+
+    void setColorFilter(int color, int mode);
+
+    void setTypeFace(int fontType, int weight, boolean italic);
+}
+
diff --git a/core/java/com/android/internal/widget/remotecompose/core/operations/paint/TextPaint.java b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/TextPaint.java
new file mode 100644
index 0000000..1c0bec7
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/core/operations/paint/TextPaint.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 com.android.internal.widget.remotecompose.core.operations.paint;
+
+public interface TextPaint {
+    void setARGB(int a, int r, int g, int b);
+
+    void setDither(boolean dither);
+
+    void setElegantTextHeight(boolean elegant);
+
+    void setEndHyphenEdit(int endHyphen);
+
+    void setFakeBoldText(boolean fakeBoldText);
+
+    void setFlags(int flags);
+
+    void setFontFeatureSettings(String settings);
+
+    void setHinting(int mode);
+
+    void setLetterSpacing(float letterSpacing);
+
+    void setLinearText(boolean linearText);
+
+    void setShadowLayer(float radius, float dx, float dy, int shadowColor);
+
+    void setStartHyphenEdit(int startHyphen);
+
+    void setStrikeThruText(boolean strikeThruText);
+
+    void setStrokeCap(int cap);
+
+    void setSubpixelText(boolean subpixelText);
+
+    void setTextAlign(int align);
+
+    void setTextLocale(int locale);
+
+    void setTextLocales(int localesArray);
+
+    void setTextScaleX(float scaleX);
+
+    void setTextSize(float textSize);
+
+    void setTextSkewX(float skewX);
+
+    void setUnderlineText(boolean underlineText);
+
+    void setWordSpacing(float wordSpacing);
+}
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 cc1f3dd..7423a16 100644
--- a/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java
+++ b/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java
@@ -16,6 +16,7 @@
 package com.android.internal.widget.remotecompose.player;
 
 import android.content.Context;
+import android.graphics.Color;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.ViewGroup;
@@ -97,6 +98,7 @@
                             LayoutParams.MATCH_PARENT);
                     HorizontalScrollView horizontalScrollView =
                             new HorizontalScrollView(getContext());
+                    horizontalScrollView.setBackgroundColor(Color.TRANSPARENT);
                     horizontalScrollView.setFillViewport(true);
                     horizontalScrollView.addView(mInner, layoutParamsInner);
                     LayoutParams layoutParams = new LayoutParams(
@@ -113,6 +115,7 @@
                             LayoutParams.MATCH_PARENT,
                             LayoutParams.WRAP_CONTENT);
                     ScrollView scrollView = new ScrollView(getContext());
+                    scrollView.setBackgroundColor(Color.TRANSPARENT);
                     scrollView.setFillViewport(true);
                     scrollView.addView(mInner, layoutParamsInner);
                     LayoutParams layoutParams = new LayoutParams(
@@ -136,7 +139,9 @@
     private void init(Context context, AttributeSet attrs, int defStyleAttr) {
         LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT,
                 LayoutParams.MATCH_PARENT);
+        setBackgroundColor(Color.TRANSPARENT);
         mInner = new RemoteComposeCanvas(context, attrs, defStyleAttr);
+        mInner.setBackgroundColor(Color.TRANSPARENT);
         addView(mInner, layoutParams);
     }
 
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 3799cf6..d0d6e69 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
@@ -16,12 +16,25 @@
 package com.android.internal.widget.remotecompose.player.platform;
 
 import android.graphics.Bitmap;
+import android.graphics.BlendMode;
 import android.graphics.Canvas;
+import android.graphics.LinearGradient;
 import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.RadialGradient;
 import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Shader;
+import android.graphics.SweepGradient;
+import android.graphics.Typeface;
 
 import com.android.internal.widget.remotecompose.core.PaintContext;
 import com.android.internal.widget.remotecompose.core.RemoteContext;
+import com.android.internal.widget.remotecompose.core.operations.ClipPath;
+import com.android.internal.widget.remotecompose.core.operations.paint.PaintBundle;
+import com.android.internal.widget.remotecompose.core.operations.paint.PaintChanges;
 
 /**
  * An implementation of PaintContext for the Android Canvas.
@@ -71,7 +84,8 @@
                            int cdId) {
         AndroidRemoteContext androidContext = (AndroidRemoteContext) mContext;
         if (androidContext.mRemoteComposeState.containsId(imageId)) {
-            Bitmap bitmap = (Bitmap) androidContext.mRemoteComposeState.getFromId(imageId);
+            Bitmap bitmap = (Bitmap) androidContext.mRemoteComposeState
+                    .getFromId(imageId);
             mCanvas.drawBitmap(
                     bitmap,
                     new Rect(srcLeft, srcTop, srcRight, srcBottom),
@@ -89,5 +103,501 @@
     public void translate(float translateX, float translateY) {
         mCanvas.translate(translateX, translateY);
     }
+
+    @Override
+    public void drawArc(float left,
+                        float top,
+                        float right,
+                        float bottom,
+                        float startAngle,
+                        float sweepAngle) {
+        mCanvas.drawArc(left, top, right, bottom, startAngle,
+                sweepAngle, true, mPaint);
+    }
+
+    @Override
+    public void drawBitmap(int id,
+                           float left,
+                           float top,
+                           float right,
+                           float bottom) {
+        AndroidRemoteContext androidContext = (AndroidRemoteContext) mContext;
+        if (androidContext.mRemoteComposeState.containsId(id)) {
+            Bitmap bitmap =
+                    (Bitmap) androidContext.mRemoteComposeState.getFromId(id);
+            Rect src = new Rect(0, 0,
+                    bitmap.getWidth(), bitmap.getHeight());
+            RectF dst = new RectF(left, top, right, bottom);
+            mCanvas.drawBitmap(bitmap, src, dst, mPaint);
+        }
+    }
+
+    @Override
+    public void drawCircle(float centerX, float centerY, float radius) {
+        mCanvas.drawCircle(centerX, centerY, radius, mPaint);
+    }
+
+    @Override
+    public void drawLine(float x1, float y1, float x2, float y2) {
+        mCanvas.drawLine(x1, y1, x2, y2, mPaint);
+    }
+
+    @Override
+    public void drawOval(float left, float top, float right, float bottom) {
+        mCanvas.drawOval(left, top, right, bottom, mPaint);
+    }
+
+    @Override
+    public void drawPath(int id, float start, float end) {
+        mCanvas.drawPath(getPath(id, start, end), mPaint);
+    }
+
+    @Override
+    public void drawRect(float left, float top, float right, float bottom) {
+        mCanvas.drawRect(left, top, right, bottom, mPaint);
+    }
+
+    @Override
+    public void drawRoundRect(float left,
+                              float top,
+                              float right,
+                              float bottom,
+                              float radiusX,
+                              float radiusY) {
+        mCanvas.drawRoundRect(left, top, right, bottom,
+                radiusX, radiusY, mPaint);
+    }
+
+    @Override
+    public void drawTextOnPath(int textId,
+                               int pathId,
+                               float hOffset,
+                               float vOffset) {
+        mCanvas.drawTextOnPath(getText(textId), getPath(pathId, 0, 1), hOffset, vOffset, mPaint);
+    }
+
+    @Override
+    public void drawTextRun(int textID,
+                            int start,
+                            int end,
+                            int contextStart,
+                            int contextEnd,
+                            float x,
+                            float y,
+                            boolean rtl) {
+        String textToPaint = getText(textID).substring(start, end);
+        mCanvas.drawText(textToPaint, x, y, mPaint);
+    }
+
+    @Override
+    public void drawTweenPath(int path1Id,
+                              int path2Id,
+                              float tween,
+                              float start,
+                              float end) {
+        mCanvas.drawPath(getPath(path1Id, path2Id, tween, start, end), mPaint);
+    }
+
+    private static PorterDuff.Mode origamiToPorterDuffMode(int mode) {
+        switch (mode) {
+            case PaintBundle.BLEND_MODE_CLEAR:
+                return PorterDuff.Mode.CLEAR;
+            case PaintBundle.BLEND_MODE_SRC:
+                return PorterDuff.Mode.SRC;
+            case PaintBundle.BLEND_MODE_DST:
+                return PorterDuff.Mode.DST;
+            case PaintBundle.BLEND_MODE_SRC_OVER:
+                return PorterDuff.Mode.SRC_OVER;
+            case PaintBundle.BLEND_MODE_DST_OVER:
+                return PorterDuff.Mode.DST_OVER;
+            case PaintBundle.BLEND_MODE_SRC_IN:
+                return PorterDuff.Mode.SRC_IN;
+            case PaintBundle.BLEND_MODE_DST_IN:
+                return PorterDuff.Mode.DST_IN;
+            case PaintBundle.BLEND_MODE_SRC_OUT:
+                return PorterDuff.Mode.SRC_OUT;
+            case PaintBundle.BLEND_MODE_DST_OUT:
+                return PorterDuff.Mode.DST_OUT;
+            case PaintBundle.BLEND_MODE_SRC_ATOP:
+                return PorterDuff.Mode.SRC_ATOP;
+            case PaintBundle.BLEND_MODE_DST_ATOP:
+                return PorterDuff.Mode.DST_ATOP;
+            case PaintBundle.BLEND_MODE_XOR:
+                return PorterDuff.Mode.XOR;
+            case PaintBundle.BLEND_MODE_SCREEN:
+                return PorterDuff.Mode.SCREEN;
+            case PaintBundle.BLEND_MODE_OVERLAY:
+                return PorterDuff.Mode.OVERLAY;
+            case PaintBundle.BLEND_MODE_DARKEN:
+                return PorterDuff.Mode.DARKEN;
+            case PaintBundle.BLEND_MODE_LIGHTEN:
+                return PorterDuff.Mode.LIGHTEN;
+            case PaintBundle.BLEND_MODE_MULTIPLY:
+                return PorterDuff.Mode.MULTIPLY;
+            case PaintBundle.PORTER_MODE_ADD:
+                return PorterDuff.Mode.ADD;
+        }
+        return PorterDuff.Mode.SRC_OVER;
+    }
+
+    public static BlendMode origamiToBlendMode(int mode) {
+        switch (mode) {
+            case PaintBundle.BLEND_MODE_CLEAR:
+                return BlendMode.CLEAR;
+            case PaintBundle.BLEND_MODE_SRC:
+                return BlendMode.SRC;
+            case PaintBundle.BLEND_MODE_DST:
+                return BlendMode.DST;
+            case PaintBundle.BLEND_MODE_SRC_OVER:
+                return BlendMode.SRC_OVER;
+            case PaintBundle.BLEND_MODE_DST_OVER:
+                return BlendMode.DST_OVER;
+            case PaintBundle.BLEND_MODE_SRC_IN:
+                return BlendMode.SRC_IN;
+            case PaintBundle.BLEND_MODE_DST_IN:
+                return BlendMode.DST_IN;
+            case PaintBundle.BLEND_MODE_SRC_OUT:
+                return BlendMode.SRC_OUT;
+            case PaintBundle.BLEND_MODE_DST_OUT:
+                return BlendMode.DST_OUT;
+            case PaintBundle.BLEND_MODE_SRC_ATOP:
+                return BlendMode.SRC_ATOP;
+            case PaintBundle.BLEND_MODE_DST_ATOP:
+                return BlendMode.DST_ATOP;
+            case PaintBundle.BLEND_MODE_XOR:
+                return BlendMode.XOR;
+            case PaintBundle.BLEND_MODE_PLUS:
+                return BlendMode.PLUS;
+            case PaintBundle.BLEND_MODE_MODULATE:
+                return BlendMode.MODULATE;
+            case PaintBundle.BLEND_MODE_SCREEN:
+                return BlendMode.SCREEN;
+            case PaintBundle.BLEND_MODE_OVERLAY:
+                return BlendMode.OVERLAY;
+            case PaintBundle.BLEND_MODE_DARKEN:
+                return BlendMode.DARKEN;
+            case PaintBundle.BLEND_MODE_LIGHTEN:
+                return BlendMode.LIGHTEN;
+            case PaintBundle.BLEND_MODE_COLOR_DODGE:
+                return BlendMode.COLOR_DODGE;
+            case PaintBundle.BLEND_MODE_COLOR_BURN:
+                return BlendMode.COLOR_BURN;
+            case PaintBundle.BLEND_MODE_HARD_LIGHT:
+                return BlendMode.HARD_LIGHT;
+            case PaintBundle.BLEND_MODE_SOFT_LIGHT:
+                return BlendMode.SOFT_LIGHT;
+            case PaintBundle.BLEND_MODE_DIFFERENCE:
+                return BlendMode.DIFFERENCE;
+            case PaintBundle.BLEND_MODE_EXCLUSION:
+                return BlendMode.EXCLUSION;
+            case PaintBundle.BLEND_MODE_MULTIPLY:
+                return BlendMode.MULTIPLY;
+            case PaintBundle.BLEND_MODE_HUE:
+                return BlendMode.HUE;
+            case PaintBundle.BLEND_MODE_SATURATION:
+                return BlendMode.SATURATION;
+            case PaintBundle.BLEND_MODE_COLOR:
+                return BlendMode.COLOR;
+            case PaintBundle.BLEND_MODE_LUMINOSITY:
+                return BlendMode.LUMINOSITY;
+            case PaintBundle.BLEND_MODE_NULL:
+                return null;
+        }
+        return null;
+    }
+
+    @Override
+    public void applyPaint(PaintBundle mPaintData) {
+        mPaintData.applyPaintChange(new PaintChanges() {
+            @Override
+            public void setTextSize(float size) {
+                mPaint.setTextSize(size);
+            }
+
+            @Override
+            public void setTypeFace(int fontType, int weight, boolean italic) {
+                int[] type = new int[]{Typeface.NORMAL, Typeface.BOLD,
+                        Typeface.ITALIC, Typeface.BOLD_ITALIC};
+
+                switch (fontType) {
+                    case PaintBundle.FONT_TYPE_DEFAULT: {
+                        if (weight == 400 && !italic) { // for normal case
+                            mPaint.setTypeface(Typeface.DEFAULT);
+                        } else {
+                            mPaint.setTypeface(Typeface.create(Typeface.DEFAULT,
+                                    weight, italic));
+                        }
+                        break;
+                    }
+                    case PaintBundle.FONT_TYPE_SERIF: {
+                        if (weight == 400 && !italic) { // for normal case
+                            mPaint.setTypeface(Typeface.SERIF);
+                        } else {
+                            mPaint.setTypeface(Typeface.create(Typeface.SERIF,
+                                    weight, italic));
+                        }
+                        break;
+                    }
+                    case PaintBundle.FONT_TYPE_SANS_SERIF: {
+                        if (weight == 400 && !italic) { //  for normal case
+                            mPaint.setTypeface(Typeface.SANS_SERIF);
+                        } else {
+                            mPaint.setTypeface(
+                                    Typeface.create(Typeface.SANS_SERIF,
+                                            weight, italic));
+                        }
+                        break;
+                    }
+                    case PaintBundle.FONT_TYPE_MONOSPACE: {
+                        if (weight == 400 && !italic) { //  for normal case
+                            mPaint.setTypeface(Typeface.MONOSPACE);
+                        } else {
+                            mPaint.setTypeface(
+                                    Typeface.create(Typeface.MONOSPACE,
+                                            weight, italic));
+                        }
+
+                        break;
+                    }
+                }
+
+
+            }
+
+
+            @Override
+            public void setStrokeWidth(float width) {
+                mPaint.setStrokeWidth(width);
+            }
+
+            @Override
+            public void setColor(int color) {
+                mPaint.setColor(color);
+            }
+
+            @Override
+            public void setStrokeCap(int cap) {
+                mPaint.setStrokeCap(Paint.Cap.values()[cap]);
+            }
+
+            @Override
+            public void setStyle(int style) {
+                mPaint.setStyle(Paint.Style.values()[style]);
+            }
+
+            @Override
+            public void setShader(int shader, String shaderString) {
+
+            }
+
+            @Override
+            public void setImageFilterQuality(int quality) {
+                System.out.println(">>>>>>>>>>>> ");
+            }
+
+            @Override
+            public void setBlendMode(int mode) {
+                mPaint.setBlendMode(origamiToBlendMode(mode));
+            }
+
+            @Override
+            public void setAlpha(float a) {
+                mPaint.setAlpha((int) (255 * a));
+            }
+
+            @Override
+            public void setStrokeMiter(float miter) {
+                mPaint.setStrokeMiter(miter);
+            }
+
+            @Override
+            public void setStrokeJoin(int join) {
+                mPaint.setStrokeJoin(Paint.Join.values()[join]);
+            }
+
+            @Override
+            public void setFilterBitmap(boolean filter) {
+                mPaint.setFilterBitmap(filter);
+            }
+
+
+            @Override
+            public void setAntiAlias(boolean aa) {
+                mPaint.setAntiAlias(aa);
+            }
+
+            @Override
+            public void clear(long mask) {
+                if (true) return;
+                long m = mask;
+                int k = 1;
+                while (m > 0) {
+                    if ((m & 1) == 1L) {
+                        switch (k) {
+
+                            case PaintBundle.COLOR_FILTER:
+                                mPaint.setColorFilter(null);
+                                System.out.println(">>>>>>>>>>>>> CLEAR!!!!");
+                                break;
+                        }
+                    }
+                    k++;
+                    m = m >> 1;
+                }
+            }
+
+            Shader.TileMode[] mTilesModes = new Shader.TileMode[]{
+                    Shader.TileMode.CLAMP,
+                    Shader.TileMode.REPEAT,
+                    Shader.TileMode.MIRROR};
+
+
+            @Override
+            public void setLinearGradient(int[] colors,
+                                          float[] stops,
+                                          float startX,
+                                          float startY,
+                                          float endX,
+                                          float endY,
+                                          int tileMode) {
+                mPaint.setShader(new LinearGradient(startX,
+                        startY,
+                        endX,
+                        endY, colors, stops, mTilesModes[tileMode]));
+
+            }
+
+            @Override
+            public void setRadialGradient(int[] colors,
+                                          float[] stops,
+                                          float centerX,
+                                          float centerY,
+                                          float radius,
+                                          int tileMode) {
+                mPaint.setShader(new RadialGradient(centerX, centerY, radius,
+                        colors, stops, mTilesModes[tileMode]));
+            }
+
+            @Override
+            public void setSweepGradient(int[] colors,
+                                         float[] stops,
+                                         float centerX,
+                                         float centerY) {
+                mPaint.setShader(new SweepGradient(centerX, centerY, colors, stops));
+
+            }
+
+            @Override
+            public void setColorFilter(int color, int mode) {
+                PorterDuff.Mode pmode = origamiToPorterDuffMode(mode);
+                System.out.println("setting color filter to " + pmode.name());
+                if (pmode != null) {
+                    mPaint.setColorFilter(
+                            new PorterDuffColorFilter(color, pmode));
+                }
+            }
+        });
+    }
+
+    @Override
+    public void mtrixScale(float scaleX,
+                           float scaleY,
+                           float centerX,
+                           float centerY) {
+        if (Float.isNaN(centerX)) {
+            mCanvas.scale(scaleX, scaleY);
+        } else {
+            mCanvas.scale(scaleX, scaleY, centerX, centerY);
+        }
+    }
+
+    @Override
+    public void matrixTranslate(float translateX, float translateY) {
+        mCanvas.translate(translateX, translateY);
+    }
+
+    @Override
+    public void matrixSkew(float skewX, float skewY) {
+        mCanvas.skew(skewX, skewY);
+    }
+
+    @Override
+    public void matrixRotate(float rotate, float pivotX, float pivotY) {
+        if (Float.isNaN(pivotX)) {
+            mCanvas.rotate(rotate);
+        } else {
+            mCanvas.rotate(rotate, pivotX, pivotY);
+
+        }
+    }
+
+    @Override
+    public void matrixSave() {
+        mCanvas.save();
+    }
+
+    @Override
+    public void matrixRestore() {
+        mCanvas.restore();
+    }
+
+    @Override
+    public void clipRect(float left, float top, float right, float bottom) {
+        mCanvas.clipRect(left, top, right, bottom);
+    }
+
+    @Override
+    public void clipPath(int pathId, int regionOp) {
+        Path path = getPath(pathId, 0, 1);
+        if (regionOp == ClipPath.DIFFERENCE) {
+            mCanvas.clipOutPath(path); // DIFFERENCE
+        } else {
+            mCanvas.clipPath(path);  // INTERSECT
+        }
+    }
+
+    private Path getPath(int path1Id,
+                         int path2Id,
+                         float tween,
+                         float start,
+                         float end) {
+        if (tween == 0.0f) {
+            return getPath(path1Id, start, end);
+        }
+        if (tween == 1.0f) {
+            return getPath(path2Id, start, end);
+        }
+        AndroidRemoteContext androidContext = (AndroidRemoteContext) mContext;
+        float[] data1 =
+                (float[]) androidContext.mRemoteComposeState.getFromId(path1Id);
+        float[] data2 =
+                (float[]) androidContext.mRemoteComposeState.getFromId(path2Id);
+        float[] tmp = new float[data2.length];
+        for (int i = 0; i < tmp.length; i++) {
+            if (Float.isNaN(data1[i]) || Float.isNaN(data2[i])) {
+                tmp[i] = data1[i];
+            } else {
+                tmp[i] = (data2[i] - data1[i]) * tween + data1[i];
+            }
+        }
+        Path path = new Path();
+        FloatsToPath.genPath(path, tmp, start, end);
+        return path;
+    }
+
+    private Path getPath(int id, float start, float end) {
+        AndroidRemoteContext androidContext = (AndroidRemoteContext) mContext;
+        Path path = new Path();
+        if (androidContext.mRemoteComposeState.containsId(id)) {
+            float[] data =
+                    (float[]) androidContext.mRemoteComposeState.getFromId(id);
+            FloatsToPath.genPath(path, data, start, end);
+        }
+        return path;
+    }
+
+    private String getText(int id) {
+        return (String) mContext.mRemoteComposeState.getFromId(id);
+    }
 }
 
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 ce15855..270e96f 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
@@ -43,6 +43,13 @@
     // Data handling
     ///////////////////////////////////////////////////////////////////////////////////////////////
 
+    @Override
+    public void loadPathData(int instanceId, float[] floatPath) {
+        if (!mRemoteComposeState.containsId(instanceId)) {
+            mRemoteComposeState.cache(instanceId, floatPath);
+        }
+    }
+
     /**
      * Decode a byte array into an image and cache it using the given imageId
      *
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
new file mode 100644
index 0000000..2d766f8
--- /dev/null
+++ b/core/java/com/android/internal/widget/remotecompose/player/platform/FloatsToPath.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.player.platform;
+
+import static com.android.internal.widget.remotecompose.core.operations.Utils.idFromNan;
+
+import android.graphics.Path;
+import android.graphics.PathMeasure;
+import android.os.Build;
+
+import com.android.internal.widget.remotecompose.core.operations.PathData;
+
+public class FloatsToPath {
+    public static void genPath(Path retPath,
+                               float[] floatPath,
+                               float start,
+                               float stop) {
+        int i = 0;
+        Path path = new Path(); // todo this should be cached for performance
+        while (i < floatPath.length) {
+            switch (idFromNan(floatPath[i])) {
+                case PathData.MOVE: {
+                    i++;
+                    path.moveTo(floatPath[i + 0], floatPath[i + 1]);
+                    i += 2;
+                }
+                break;
+                case PathData.LINE: {
+                    i += 3;
+                    path.lineTo(floatPath[i + 0], floatPath[i + 1]);
+                    i += 2;
+                }
+                break;
+                case PathData.QUADRATIC: {
+                    i += 3;
+                    path.quadTo(
+                            floatPath[i + 0],
+                            floatPath[i + 1],
+                            floatPath[i + 2],
+                            floatPath[i + 3]
+                    );
+                    i += 4;
+
+                }
+                break;
+                case PathData.CONIC: {
+                    i += 3;
+                    if (Build.VERSION.SDK_INT >= 34) {
+                        path.conicTo(
+                                floatPath[i + 0], floatPath[i + 1],
+                                floatPath[i + 2], floatPath[i + 3],
+                                floatPath[i + 4]
+                        );
+                    }
+                    i += 5;
+                }
+                break;
+                case PathData.CUBIC: {
+                    i += 3;
+                    path.cubicTo(
+                            floatPath[i + 0], floatPath[i + 1],
+                            floatPath[i + 2], floatPath[i + 3],
+                            floatPath[i + 4], floatPath[i + 5]
+                    );
+                    i += 6;
+                }
+                break;
+                case PathData.CLOSE: {
+
+                    path.close();
+                    i++;
+                }
+                break;
+                case PathData.DONE: {
+                    i++;
+                }
+                break;
+                default: {
+                    System.err.println(" Odd command "
+                            + idFromNan(floatPath[i]));
+                }
+            }
+        }
+
+        retPath.reset();
+        if (start > 0f || stop < 1f) {
+            if (start < stop) {
+
+                PathMeasure measure = new PathMeasure(); // todo cached
+                measure.setPath(path, false);
+                float len = measure.getLength();
+                float scaleStart = Math.max(start, 0f) * len;
+                float scaleStop = Math.min(stop, 1f) * len;
+                measure.getSegment(scaleStart, scaleStop, retPath,
+                        true);
+            }
+        } else {
+
+            retPath.addPath(path);
+        }
+    }
+}
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 444288c..03b57d0 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -99,6 +99,7 @@
         "libminikin",
         "libz",
         "server_configurable_flags",
+        "android.database.sqlite-aconfig-cc",
         "android.media.audiopolicy-aconfig-cc",
     ],
 
@@ -308,6 +309,7 @@
                 "libdebuggerd_client",
                 "libutils",
                 "libbinder",
+                "libbinderdebug",
                 "libbinder_ndk",
                 "libui",
                 "libgraphicsenv",
diff --git a/core/jni/OWNERS b/core/jni/OWNERS
index 2a4f062..163f32e 100644
--- a/core/jni/OWNERS
+++ b/core/jni/OWNERS
@@ -1,6 +1,5 @@
 # Camera
-per-file *Camera*,*camera* = [email protected], [email protected], [email protected]
-per-file *Camera*,*camera* = [email protected], [email protected], [email protected]
+per-file *Camera*,*camera* = file:platform/frameworks/av:/camera/OWNERS
 
 # Connectivity
 per-file android_net_* = [email protected], [email protected], [email protected], [email protected], [email protected]
@@ -111,3 +110,6 @@
 
 # PerformanceHintManager
 per-file android_os_PerformanceHintManager.cpp = file:/ADPF_OWNERS
+
+# IF Tools
+per-file android_tracing_Perfetto* = file:platform/development:/tools/winscope/OWNERS
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index 5f3a1b5..72b98a2 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -523,21 +523,23 @@
     }
 }
 
-static jint android_hardware_Camera_getNumberOfCameras(JNIEnv *env, jobject thiz)
-{
-    return Camera::getNumberOfCameras();
+static jint android_hardware_Camera_getNumberOfCameras(JNIEnv *env, jobject thiz, jint deviceId,
+                                                       jint devicePolicy) {
+    return Camera::getNumberOfCameras(deviceId, devicePolicy);
 }
 
 static void android_hardware_Camera_getCameraInfo(JNIEnv *env, jobject thiz, jint cameraId,
-                                                  jboolean overrideToPortrait, jobject info_obj) {
+                                                  jboolean overrideToPortrait, jint deviceId,
+                                                  jint devicePolicy, jobject info_obj) {
     CameraInfo cameraInfo;
-    if (cameraId >= Camera::getNumberOfCameras() || cameraId < 0) {
+    if (cameraId >= Camera::getNumberOfCameras(deviceId, devicePolicy) || cameraId < 0) {
         ALOGE("%s: Unknown camera ID %d", __FUNCTION__, cameraId);
         jniThrowRuntimeException(env, "Unknown camera ID");
         return;
     }
 
-    status_t rc = Camera::getCameraInfo(cameraId, overrideToPortrait, &cameraInfo);
+    status_t rc = Camera::getCameraInfo(cameraId, overrideToPortrait, deviceId, devicePolicy,
+                                        &cameraInfo);
     if (rc != NO_ERROR) {
         jniThrowRuntimeException(env, "Fail to get camera info");
         return;
@@ -556,7 +558,8 @@
 static jint android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz, jobject weak_this,
                                                  jint cameraId, jstring clientPackageName,
                                                  jboolean overrideToPortrait,
-                                                 jboolean forceSlowJpegMode) {
+                                                 jboolean forceSlowJpegMode, jint deviceId,
+                                                 jint devicePolicy) {
     // Convert jstring to String16
     const char16_t *rawClientName = reinterpret_cast<const char16_t*>(
         env->GetStringChars(clientPackageName, NULL));
@@ -568,7 +571,8 @@
     int targetSdkVersion = android_get_application_target_sdk_version();
     sp<Camera> camera =
             Camera::connect(cameraId, clientName, Camera::USE_CALLING_UID, Camera::USE_CALLING_PID,
-                            targetSdkVersion, overrideToPortrait, forceSlowJpegMode);
+                            targetSdkVersion, overrideToPortrait, forceSlowJpegMode, deviceId,
+                            devicePolicy);
     if (camera == NULL) {
         return -EACCES;
     }
@@ -596,7 +600,8 @@
 
     // Update default display orientation in case the sensor is reverse-landscape
     CameraInfo cameraInfo;
-    status_t rc = Camera::getCameraInfo(cameraId, overrideToPortrait, &cameraInfo);
+    status_t rc = Camera::getCameraInfo(cameraId, overrideToPortrait, deviceId, devicePolicy,
+                                        &cameraInfo);
     if (rc != NO_ERROR) {
         ALOGE("%s: getCameraInfo error: %d", __FUNCTION__, rc);
         return rc;
@@ -1051,10 +1056,10 @@
 //-------------------------------------------------
 
 static const JNINativeMethod camMethods[] = {
-        {"getNumberOfCameras", "()I", (void *)android_hardware_Camera_getNumberOfCameras},
-        {"_getCameraInfo", "(IZLandroid/hardware/Camera$CameraInfo;)V",
+        {"_getNumberOfCameras", "(II)I", (void *)android_hardware_Camera_getNumberOfCameras},
+        {"_getCameraInfo", "(IZIILandroid/hardware/Camera$CameraInfo;)V",
          (void *)android_hardware_Camera_getCameraInfo},
-        {"native_setup", "(Ljava/lang/Object;ILjava/lang/String;ZZ)I",
+        {"native_setup", "(Ljava/lang/Object;ILjava/lang/String;ZZII)I",
          (void *)android_hardware_Camera_native_setup},
         {"native_release", "()V", (void *)android_hardware_Camera_release},
         {"setPreviewSurface", "(Landroid/view/Surface;)V",
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index a98f947..3c2dccd 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -16,97 +16,51 @@
 
 #define LOG_TAG "android.os.Debug"
 
+#include "android_os_Debug.h"
+
+#include <android-base/file.h>
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <android-base/strings.h>
 #include <assert.h>
+#include <binderdebug/BinderDebug.h>
+#include <bionic/malloc.h>
 #include <ctype.h>
+#include <debuggerd/client.h>
+#include <dmabufinfo/dmabuf_sysfs_stats.h>
+#include <dmabufinfo/dmabufinfo.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <inttypes.h>
+#include <log/log.h>
 #include <malloc.h>
+#include <meminfo/androidprocheaps.h>
+#include <meminfo/procmeminfo.h>
+#include <meminfo/sysmeminfo.h>
+#include <memtrack/memtrack.h>
+#include <memunreachable/memunreachable.h>
+#include <nativehelper/JNIPlatformHelp.h>
+#include <nativehelper/ScopedUtfChars.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/time.h>
 #include <time.h>
 #include <unistd.h>
+#include <utils/String8.h>
+#include <utils/misc.h>
+#include <vintf/KernelConfigs.h>
 
 #include <iomanip>
 #include <string>
 #include <vector>
 
-#include <android-base/logging.h>
-#include <android-base/properties.h>
-#include <bionic/malloc.h>
-#include <debuggerd/client.h>
-#include <log/log.h>
-#include <utils/misc.h>
-#include <utils/String8.h>
-
-#include <nativehelper/JNIPlatformHelp.h>
-#include <nativehelper/ScopedUtfChars.h>
 #include "jni.h"
-#include <dmabufinfo/dmabuf_sysfs_stats.h>
-#include <dmabufinfo/dmabufinfo.h>
-#include <meminfo/procmeminfo.h>
-#include <meminfo/sysmeminfo.h>
-#include <memtrack/memtrack.h>
-#include <memunreachable/memunreachable.h>
-#include <android-base/strings.h>
-#include "android_os_Debug.h"
-#include <vintf/KernelConfigs.h>
 
 namespace android
 {
 
-enum {
-    HEAP_UNKNOWN,
-    HEAP_DALVIK,
-    HEAP_NATIVE,
-
-    HEAP_DALVIK_OTHER,
-    HEAP_STACK,
-    HEAP_CURSOR,
-    HEAP_ASHMEM,
-    HEAP_GL_DEV,
-    HEAP_UNKNOWN_DEV,
-    HEAP_SO,
-    HEAP_JAR,
-    HEAP_APK,
-    HEAP_TTF,
-    HEAP_DEX,
-    HEAP_OAT,
-    HEAP_ART,
-    HEAP_UNKNOWN_MAP,
-    HEAP_GRAPHICS,
-    HEAP_GL,
-    HEAP_OTHER_MEMTRACK,
-
-    // Dalvik extra sections (heap).
-    HEAP_DALVIK_NORMAL,
-    HEAP_DALVIK_LARGE,
-    HEAP_DALVIK_ZYGOTE,
-    HEAP_DALVIK_NON_MOVING,
-
-    // Dalvik other extra sections.
-    HEAP_DALVIK_OTHER_LINEARALLOC,
-    HEAP_DALVIK_OTHER_ACCOUNTING,
-    HEAP_DALVIK_OTHER_ZYGOTE_CODE_CACHE,
-    HEAP_DALVIK_OTHER_APP_CODE_CACHE,
-    HEAP_DALVIK_OTHER_COMPILER_METADATA,
-    HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE,
-
-    // Boot vdex / app dex / app vdex
-    HEAP_DEX_BOOT_VDEX,
-    HEAP_DEX_APP_DEX,
-    HEAP_DEX_APP_VDEX,
-
-    // App art, boot art.
-    HEAP_ART_APP,
-    HEAP_ART_BOOT,
-
-    _NUM_HEAP,
-    _NUM_EXCLUSIVE_HEAP = HEAP_OTHER_MEMTRACK+1,
-    _NUM_CORE_HEAP = HEAP_NATIVE+1
-};
+using namespace android::meminfo;
 
 struct stat_fields {
     jfieldID pss_field;
@@ -146,18 +100,6 @@
 static jfieldID otherStats_field;
 static jfieldID hasSwappedOutPss_field;
 
-struct stats_t {
-    int pss;
-    int swappablePss;
-    int rss;
-    int privateDirty;
-    int sharedDirty;
-    int privateClean;
-    int sharedClean;
-    int swappedOut;
-    int swappedOutPss;
-};
-
 #define BINDER_STATS "/proc/binder/stats"
 
 static jlong android_os_Debug_getNativeHeapSize(JNIEnv *env, jobject clazz)
@@ -240,190 +182,14 @@
     return err;
 }
 
-static bool load_maps(int pid, stats_t* stats, bool* foundSwapPss)
-{
-    *foundSwapPss = false;
-    uint64_t prev_end = 0;
-    int prev_heap = HEAP_UNKNOWN;
-
-    std::string smaps_path = base::StringPrintf("/proc/%d/smaps", pid);
-    auto vma_scan = [&](const meminfo::Vma& vma) {
-        int which_heap = HEAP_UNKNOWN;
-        int sub_heap = HEAP_UNKNOWN;
-        bool is_swappable = false;
-        std::string name;
-        if (base::EndsWith(vma.name, " (deleted)")) {
-            name = vma.name.substr(0, vma.name.size() - strlen(" (deleted)"));
-        } else {
-            name = vma.name;
-        }
-
-        uint32_t namesz = name.size();
-        if (base::StartsWith(name, "[heap]")) {
-            which_heap = HEAP_NATIVE;
-        } else if (base::StartsWith(name, "[anon:libc_malloc]")) {
-            which_heap = HEAP_NATIVE;
-        } else if (base::StartsWith(name, "[anon:scudo:")) {
-            which_heap = HEAP_NATIVE;
-        } else if (base::StartsWith(name, "[anon:GWP-ASan")) {
-            which_heap = HEAP_NATIVE;
-        } else if (base::StartsWith(name, "[stack")) {
-            which_heap = HEAP_STACK;
-        } else if (base::StartsWith(name, "[anon:stack_and_tls:")) {
-            which_heap = HEAP_STACK;
-        } else if (base::EndsWith(name, ".so")) {
-            which_heap = HEAP_SO;
-            is_swappable = true;
-        } else if (base::EndsWith(name, ".jar")) {
-            which_heap = HEAP_JAR;
-            is_swappable = true;
-        } else if (base::EndsWith(name, ".apk")) {
-            which_heap = HEAP_APK;
-            is_swappable = true;
-        } else if (base::EndsWith(name, ".ttf")) {
-            which_heap = HEAP_TTF;
-            is_swappable = true;
-        } else if ((base::EndsWith(name, ".odex")) ||
-                (namesz > 4 && strstr(name.c_str(), ".dex") != nullptr)) {
-            which_heap = HEAP_DEX;
-            sub_heap = HEAP_DEX_APP_DEX;
-            is_swappable = true;
-        } else if (base::EndsWith(name, ".vdex")) {
-            which_heap = HEAP_DEX;
-            // Handle system@framework@boot and system/framework/boot|apex
-            if ((strstr(name.c_str(), "@boot") != nullptr) ||
-                    (strstr(name.c_str(), "/boot") != nullptr) ||
-                    (strstr(name.c_str(), "/apex") != nullptr)) {
-                sub_heap = HEAP_DEX_BOOT_VDEX;
-            } else {
-                sub_heap = HEAP_DEX_APP_VDEX;
-            }
-            is_swappable = true;
-        } else if (base::EndsWith(name, ".oat")) {
-            which_heap = HEAP_OAT;
-            is_swappable = true;
-        } else if (base::EndsWith(name, ".art") || base::EndsWith(name, ".art]")) {
-            which_heap = HEAP_ART;
-            // Handle system@framework@boot* and system/framework/boot|apex*
-            if ((strstr(name.c_str(), "@boot") != nullptr) ||
-                    (strstr(name.c_str(), "/boot") != nullptr) ||
-                    (strstr(name.c_str(), "/apex") != nullptr)) {
-                sub_heap = HEAP_ART_BOOT;
-            } else {
-                sub_heap = HEAP_ART_APP;
-            }
-            is_swappable = true;
-        } else if (base::StartsWith(name, "/dev/")) {
-            which_heap = HEAP_UNKNOWN_DEV;
-            if (base::StartsWith(name, "/dev/kgsl-3d0")) {
-                which_heap = HEAP_GL_DEV;
-            } else if (base::StartsWith(name, "/dev/ashmem/CursorWindow")) {
-                which_heap = HEAP_CURSOR;
-            } else if (base::StartsWith(name, "/dev/ashmem/jit-zygote-cache")) {
-                which_heap = HEAP_DALVIK_OTHER;
-                sub_heap = HEAP_DALVIK_OTHER_ZYGOTE_CODE_CACHE;
-            } else if (base::StartsWith(name, "/dev/ashmem")) {
-                which_heap = HEAP_ASHMEM;
-            }
-        } else if (base::StartsWith(name, "/memfd:jit-cache")) {
-          which_heap = HEAP_DALVIK_OTHER;
-          sub_heap = HEAP_DALVIK_OTHER_APP_CODE_CACHE;
-        } else if (base::StartsWith(name, "/memfd:jit-zygote-cache")) {
-          which_heap = HEAP_DALVIK_OTHER;
-          sub_heap = HEAP_DALVIK_OTHER_ZYGOTE_CODE_CACHE;
-        } else if (base::StartsWith(name, "[anon:")) {
-            which_heap = HEAP_UNKNOWN;
-            if (base::StartsWith(name, "[anon:dalvik-")) {
-                which_heap = HEAP_DALVIK_OTHER;
-                if (base::StartsWith(name, "[anon:dalvik-LinearAlloc")) {
-                    sub_heap = HEAP_DALVIK_OTHER_LINEARALLOC;
-                } else if (base::StartsWith(name, "[anon:dalvik-alloc space") ||
-                        base::StartsWith(name, "[anon:dalvik-main space")) {
-                    // This is the regular Dalvik heap.
-                    which_heap = HEAP_DALVIK;
-                    sub_heap = HEAP_DALVIK_NORMAL;
-                } else if (base::StartsWith(name,
-                            "[anon:dalvik-large object space") ||
-                        base::StartsWith(
-                            name, "[anon:dalvik-free list large object space")) {
-                    which_heap = HEAP_DALVIK;
-                    sub_heap = HEAP_DALVIK_LARGE;
-                } else if (base::StartsWith(name, "[anon:dalvik-non moving space")) {
-                    which_heap = HEAP_DALVIK;
-                    sub_heap = HEAP_DALVIK_NON_MOVING;
-                } else if (base::StartsWith(name, "[anon:dalvik-zygote space")) {
-                    which_heap = HEAP_DALVIK;
-                    sub_heap = HEAP_DALVIK_ZYGOTE;
-                } else if (base::StartsWith(name, "[anon:dalvik-indirect ref")) {
-                    sub_heap = HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE;
-                } else if (base::StartsWith(name, "[anon:dalvik-jit-code-cache") ||
-                        base::StartsWith(name, "[anon:dalvik-data-code-cache")) {
-                    sub_heap = HEAP_DALVIK_OTHER_APP_CODE_CACHE;
-                } else if (base::StartsWith(name, "[anon:dalvik-CompilerMetadata")) {
-                    sub_heap = HEAP_DALVIK_OTHER_COMPILER_METADATA;
-                } else {
-                    sub_heap = HEAP_DALVIK_OTHER_ACCOUNTING;  // Default to accounting.
-                }
-            }
-        } else if (namesz > 0) {
-            which_heap = HEAP_UNKNOWN_MAP;
-        } else if (vma.start == prev_end && prev_heap == HEAP_SO) {
-            // bss section of a shared library
-            which_heap = HEAP_SO;
-        }
-
-        prev_end = vma.end;
-        prev_heap = which_heap;
-
-        const meminfo::MemUsage& usage = vma.usage;
-        if (usage.swap_pss > 0 && *foundSwapPss != true) {
-            *foundSwapPss = true;
-        }
-
-        uint64_t swapable_pss = 0;
-        if (is_swappable && (usage.pss > 0)) {
-            float sharing_proportion = 0.0;
-            if ((usage.shared_clean > 0) || (usage.shared_dirty > 0)) {
-                sharing_proportion = (usage.pss - usage.uss) / (usage.shared_clean + usage.shared_dirty);
-            }
-            swapable_pss = (sharing_proportion * usage.shared_clean) + usage.private_clean;
-        }
-
-        stats[which_heap].pss += usage.pss;
-        stats[which_heap].swappablePss += swapable_pss;
-        stats[which_heap].rss += usage.rss;
-        stats[which_heap].privateDirty += usage.private_dirty;
-        stats[which_heap].sharedDirty += usage.shared_dirty;
-        stats[which_heap].privateClean += usage.private_clean;
-        stats[which_heap].sharedClean += usage.shared_clean;
-        stats[which_heap].swappedOut += usage.swap;
-        stats[which_heap].swappedOutPss += usage.swap_pss;
-        if (which_heap == HEAP_DALVIK || which_heap == HEAP_DALVIK_OTHER ||
-                which_heap == HEAP_DEX || which_heap == HEAP_ART) {
-            stats[sub_heap].pss += usage.pss;
-            stats[sub_heap].swappablePss += swapable_pss;
-            stats[sub_heap].rss += usage.rss;
-            stats[sub_heap].privateDirty += usage.private_dirty;
-            stats[sub_heap].sharedDirty += usage.shared_dirty;
-            stats[sub_heap].privateClean += usage.private_clean;
-            stats[sub_heap].sharedClean += usage.shared_clean;
-            stats[sub_heap].swappedOut += usage.swap;
-            stats[sub_heap].swappedOutPss += usage.swap_pss;
-        }
-        return true;
-    };
-
-    return meminfo::ForEachVmaFromFile(smaps_path, vma_scan);
-}
-
 static jboolean android_os_Debug_getDirtyPagesPid(JNIEnv *env, jobject clazz,
         jint pid, jobject object)
 {
     bool foundSwapPss;
-    stats_t stats[_NUM_HEAP];
+    AndroidHeapStats stats[_NUM_HEAP];
     memset(&stats, 0, sizeof(stats));
 
-    if (!load_maps(pid, stats, &foundSwapPss)) {
+    if (!ExtractAndroidHeapStats(pid, stats, &foundSwapPss)) {
         return JNI_FALSE;
     }
 
@@ -815,6 +581,15 @@
         return false;
     }
 
+    std::string binderState;
+    android::status_t status = android::getBinderTransactions(pid, binderState);
+    if (status == android::OK) {
+        if (!android::base::WriteStringToFd(binderState, fd)) {
+            PLOG(ERROR) << "Failed to dump binder state info for pid: " << pid;
+        }
+    } else {
+        PLOG(ERROR) << "Failed to get binder state info for pid: " << pid << " status: " << status;
+    }
     int res = dump_backtrace_to_file_timeout(pid, dumpType, timeoutSecs, fd);
     if (fdatasync(fd.get()) != 0) {
         PLOG(ERROR) << "Failed flushing trace.";
diff --git a/core/jni/android_os_MessageQueue.cpp b/core/jni/android_os_MessageQueue.cpp
index 9525605..30d9ea1 100644
--- a/core/jni/android_os_MessageQueue.cpp
+++ b/core/jni/android_os_MessageQueue.cpp
@@ -225,7 +225,7 @@
     nativeMessageQueue->pollOnce(env, obj, timeoutMillis);
 }
 
-static void android_os_MessageQueue_nativeWake(jlong ptr) {
+static void android_os_MessageQueue_nativeWake(JNIEnv* env, jclass clazz, jlong ptr) {
     NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr);
     nativeMessageQueue->wake();
 }
diff --git a/core/jni/android_os_Trace.cpp b/core/jni/android_os_Trace.cpp
index 4387a4c..21e056d 100644
--- a/core/jni/android_os_Trace.cpp
+++ b/core/jni/android_os_Trace.cpp
@@ -15,6 +15,7 @@
  */
 
 #include <cutils/compiler.h>
+#include <cutils/trace.h>
 #include <jni.h>
 #include <log/log.h>
 #include <nativehelper/JNIHelp.h>
@@ -103,7 +104,9 @@
 }
 
 static void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv*, jclass, jboolean allowed) {
-    // no-op
+    // TODO(b/331916606): this is load-bearing for an app to notice that it is
+    // traced after post-zygote-fork specialisation.
+    atrace_update_tags();
 }
 
 static void android_os_Trace_nativeSetTracingEnabled(JNIEnv*, jclass, jboolean enabled) {
diff --git a/core/jni/android_text_Hyphenator.cpp b/core/jni/android_text_Hyphenator.cpp
index 7c976b7..b6bf617 100644
--- a/core/jni/android_text_Hyphenator.cpp
+++ b/core/jni/android_text_Hyphenator.cpp
@@ -36,43 +36,41 @@
     return SYSTEM_HYPHENATOR_PREFIX + lowerLocale + SYSTEM_HYPHENATOR_SUFFIX;
 }
 
-static std::pair<const uint8_t*, uint32_t> mmapPatternFile(const std::string& locale) {
+static const uint8_t* mmapPatternFile(const std::string& locale) {
     const std::string hyFilePath = buildFileName(locale);
     const int fd = open(hyFilePath.c_str(), O_RDONLY | O_CLOEXEC);
     if (fd == -1) {
-        return std::make_pair(nullptr, 0); // Open failed.
+        return nullptr;  // Open failed.
     }
 
     struct stat st = {};
     if (fstat(fd, &st) == -1) {  // Unlikely to happen.
         close(fd);
-        return std::make_pair(nullptr, 0);
+        return nullptr;
     }
 
     void* ptr = mmap(nullptr, st.st_size, PROT_READ, MAP_SHARED, fd, 0 /* offset */);
     close(fd);
     if (ptr == MAP_FAILED) {
-        return std::make_pair(nullptr, 0);
+        return nullptr;
     }
-    return std::make_pair(reinterpret_cast<const uint8_t*>(ptr), st.st_size);
+    return reinterpret_cast<const uint8_t*>(ptr);
 }
 
 static void addHyphenatorWithoutPatternFile(const std::string& locale, int minPrefix,
         int minSuffix) {
-    minikin::addHyphenator(locale,
-                           minikin::Hyphenator::loadBinary(nullptr, 0, minPrefix, minSuffix,
-                                                           locale));
+    minikin::addHyphenator(locale, minikin::Hyphenator::loadBinary(
+            nullptr, minPrefix, minSuffix, locale));
 }
 
 static void addHyphenator(const std::string& locale, int minPrefix, int minSuffix) {
-    auto [ptr, size] = mmapPatternFile(locale);
+    const uint8_t* ptr = mmapPatternFile(locale);
     if (ptr == nullptr) {
         ALOGE("Unable to find pattern file or unable to map it for %s", locale.c_str());
         return;
     }
-    minikin::addHyphenator(locale,
-                           minikin::Hyphenator::loadBinary(ptr, size, minPrefix, minSuffix,
-                                                           locale));
+    minikin::addHyphenator(locale, minikin::Hyphenator::loadBinary(
+            ptr, minPrefix, minSuffix, locale));
 }
 
 static void addHyphenatorAlias(const std::string& from, const std::string& to) {
diff --git a/core/jni/android_tracing_PerfettoDataSource.cpp b/core/jni/android_tracing_PerfettoDataSource.cpp
index 1eff5ce..5c7b470 100644
--- a/core/jni/android_tracing_PerfettoDataSource.cpp
+++ b/core/jni/android_tracing_PerfettoDataSource.cpp
@@ -45,12 +45,6 @@
 static struct {
     jclass clazz;
     jmethodID init;
-    jmethodID getAndClearAllPendingTracePackets;
-} gTracingContextClassInfo;
-
-static struct {
-    jclass clazz;
-    jmethodID init;
 } gCreateTlsStateArgsClassInfo;
 
 static struct {
@@ -68,32 +62,10 @@
     jobject jobj;
 };
 
-static void traceAllPendingPackets(JNIEnv* env, jobject jCtx, PerfettoDsTracerIterator* ctx) {
-    jobjectArray packets =
-            (jobjectArray)env
-                    ->CallObjectMethod(jCtx,
-                                       gTracingContextClassInfo.getAndClearAllPendingTracePackets);
-    if (env->ExceptionOccurred()) {
-        env->ExceptionDescribe();
-        env->ExceptionClear();
-
-        LOG_ALWAYS_FATAL("Failed to call java context finalize method");
-    }
-
-    int packets_count = env->GetArrayLength(packets);
-    for (int i = 0; i < packets_count; i++) {
-        jbyteArray packet_proto_buffer = (jbyteArray)env->GetObjectArrayElement(packets, i);
-
-        jbyte* raw_proto_buffer = env->GetByteArrayElements(packet_proto_buffer, 0);
-        int buffer_size = env->GetArrayLength(packet_proto_buffer);
-
-        struct PerfettoDsRootTracePacket trace_packet;
-        PerfettoDsTracerPacketBegin(ctx, &trace_packet);
-        PerfettoPbMsgAppendBytes(&trace_packet.msg.msg, (const uint8_t*)raw_proto_buffer,
-                                 buffer_size);
-        PerfettoDsTracerPacketEnd(ctx, &trace_packet);
-    }
-}
+// In a single thread there can be only one trace point active across all data source, so we can use
+// a single global thread_local variable to keep track of the active tracer iterator.
+thread_local static bool gInIteration;
+thread_local static struct PerfettoDsTracerIterator gIterator;
 
 PerfettoDataSource::PerfettoDataSource(JNIEnv* env, jobject javaDataSource,
                                        std::string dataSourceName)
@@ -164,44 +136,89 @@
     return env->NewGlobalRef(incrementalState.get());
 }
 
-void PerfettoDataSource::trace(JNIEnv* env, jobject traceFunction) {
-    PERFETTO_DS_TRACE(dataSource, ctx) {
-        ALOG(LOG_DEBUG, LOG_TAG, "\tin native trace callback function %p", this);
-        TlsState* tls_state =
-                reinterpret_cast<TlsState*>(PerfettoDsGetCustomTls(&dataSource, &ctx));
-        IncrementalState* incr_state = reinterpret_cast<IncrementalState*>(
-                PerfettoDsGetIncrementalState(&dataSource, &ctx));
+bool PerfettoDataSource::TraceIterateBegin() {
+    if (gInIteration) {
+        return false;
+    }
 
-        ALOG(LOG_DEBUG, LOG_TAG, "\t tls_state = %p", tls_state);
-        ALOG(LOG_DEBUG, LOG_TAG, "\t incr_state = %p", incr_state);
+    gIterator = PerfettoDsTraceIterateBegin(&dataSource);
 
-        ALOG(LOG_DEBUG, LOG_TAG, "\t tls_state->jobj = %p", tls_state->jobj);
-        ALOG(LOG_DEBUG, LOG_TAG, "\t incr_state->jobj = %p", incr_state->jobj);
+    if (gIterator.impl.tracer == nullptr) {
+        return false;
+    }
 
-        ScopedLocalRef<jobject> jCtx(env,
-                                     env->NewObject(gTracingContextClassInfo.clazz,
-                                                    gTracingContextClassInfo.init, &ctx,
-                                                    tls_state->jobj, incr_state->jobj));
+    gInIteration = true;
+    return true;
+}
 
-        ALOG(LOG_DEBUG, LOG_TAG, "\t jCtx = %p", jCtx.get());
+bool PerfettoDataSource::TraceIterateNext() {
+    if (!gInIteration) {
+        LOG_ALWAYS_FATAL("Tried calling TraceIterateNext outside of a tracer iteration.");
+        return false;
+    }
 
-        jclass objclass = env->GetObjectClass(traceFunction);
-        jmethodID method =
-                env->GetMethodID(objclass, "trace", "(Landroid/tracing/perfetto/TracingContext;)V");
-        if (method == 0) {
-            LOG_ALWAYS_FATAL("Failed to get method id");
-        }
+    PerfettoDsTraceIterateNext(&dataSource, &gIterator);
 
-        env->ExceptionClear();
+    if (gIterator.impl.tracer == nullptr) {
+        // Reached end of iterator. No more datasource instances.
+        gInIteration = false;
+        return false;
+    }
 
-        env->CallVoidMethod(traceFunction, method, jCtx.get());
-        if (env->ExceptionOccurred()) {
-            env->ExceptionDescribe();
-            env->ExceptionClear();
-            LOG_ALWAYS_FATAL("Failed to call java trace method");
-        }
+    return true;
+}
 
-        traceAllPendingPackets(env, jCtx.get(), &ctx);
+void PerfettoDataSource::TraceIterateBreak() {
+    if (!gInIteration) {
+        return;
+    }
+
+    PerfettoDsTraceIterateBreak(&dataSource, &gIterator);
+    gInIteration = false;
+}
+
+jobject PerfettoDataSource::GetCustomTls() {
+    if (!gInIteration) {
+        LOG_ALWAYS_FATAL("Tried getting CustomTls outside of a tracer iteration.");
+        return nullptr;
+    }
+
+    TlsState* tls_state =
+            reinterpret_cast<TlsState*>(PerfettoDsGetCustomTls(&dataSource, &gIterator));
+
+    return tls_state->jobj;
+}
+
+jobject PerfettoDataSource::GetIncrementalState() {
+    if (!gInIteration) {
+        LOG_ALWAYS_FATAL("Tried getting IncrementalState outside of a tracer iteration.");
+        return nullptr;
+    }
+
+    IncrementalState* incr_state = reinterpret_cast<IncrementalState*>(
+            PerfettoDsGetIncrementalState(&dataSource, &gIterator));
+
+    return incr_state->jobj;
+}
+
+void PerfettoDataSource::WritePackets(JNIEnv* env, jobjectArray packets) {
+    if (!gInIteration) {
+        LOG_ALWAYS_FATAL("Tried writing packets outside of a tracer iteration.");
+        return;
+    }
+
+    int packets_count = env->GetArrayLength(packets);
+    for (int i = 0; i < packets_count; i++) {
+        jbyteArray packet_proto_buffer = (jbyteArray)env->GetObjectArrayElement(packets, i);
+
+        jbyte* raw_proto_buffer = env->GetByteArrayElements(packet_proto_buffer, 0);
+        int buffer_size = env->GetArrayLength(packet_proto_buffer);
+
+        struct PerfettoDsRootTracePacket trace_packet;
+        PerfettoDsTracerPacketBegin(&gIterator, &trace_packet);
+        PerfettoPbMsgAppendBytes(&trace_packet.msg.msg, (const uint8_t*)raw_proto_buffer,
+                                 buffer_size);
+        PerfettoDsTracerPacketEnd(&gIterator, &trace_packet);
     }
 }
 
@@ -213,14 +230,12 @@
 
 PerfettoDataSource::~PerfettoDataSource() {
     JNIEnv* env = AndroidRuntime::getJNIEnv();
-    env->DeleteWeakGlobalRef(mJavaDataSource);
+    env->DeleteGlobalRef(mJavaDataSource);
 }
 
 jlong nativeCreate(JNIEnv* env, jclass clazz, jobject javaDataSource, jstring name) {
     const char* nativeString = env->GetStringUTFChars(name, 0);
-    ALOG(LOG_DEBUG, LOG_TAG, "nativeCreate(%p, %s)", javaDataSource, nativeString);
     PerfettoDataSource* dataSource = new PerfettoDataSource(env, javaDataSource, nativeString);
-    ALOG(LOG_DEBUG, LOG_TAG, "\tdatasource* = %p", dataSource);
     env->ReleaseStringUTFChars(name, nativeString);
 
     dataSource->incStrong((void*)nativeCreate);
@@ -229,39 +244,27 @@
 }
 
 void nativeDestroy(void* ptr) {
-    ALOG(LOG_DEBUG, LOG_TAG, "nativeCreate(%p)", ptr);
     PerfettoDataSource* dataSource = reinterpret_cast<PerfettoDataSource*>(ptr);
     dataSource->decStrong((void*)nativeCreate);
 }
 
 static jlong nativeGetFinalizer(JNIEnv* /* env */, jclass /* clazz */) {
-    ALOG(LOG_DEBUG, LOG_TAG, "nativeGetFinalizer()");
     return static_cast<jlong>(reinterpret_cast<uintptr_t>(&nativeDestroy));
 }
 
-void nativeTrace(JNIEnv* env, jclass clazz, jlong dataSourcePtr, jobject traceFunctionInterface) {
-    ALOG(LOG_DEBUG, LOG_TAG, "nativeTrace(%p)", (void*)dataSourcePtr);
-    sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr);
-
-    datasource->trace(env, traceFunctionInterface);
-}
-
-void nativeFlush(JNIEnv* env, jclass clazz, jobject jCtx, jlong ctxPtr) {
-    ALOG(LOG_DEBUG, LOG_TAG, "nativeFlush(%p, %p)", jCtx, (void*)ctxPtr);
-    auto* ctx = reinterpret_cast<struct PerfettoDsTracerIterator*>(ctxPtr);
-    traceAllPendingPackets(env, jCtx, ctx);
-    PerfettoDsTracerFlush(ctx, nullptr, nullptr);
+void nativeFlush(JNIEnv* env, jclass clazz, jlong ds_ptr, jobjectArray packets) {
+    ALOG(LOG_DEBUG, LOG_TAG, "nativeFlush(%p)", (void*)ds_ptr);
+    sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(ds_ptr);
+    datasource->WritePackets(env, packets);
 }
 
 void nativeFlushAll(JNIEnv* env, jclass clazz, jlong ptr) {
-    ALOG(LOG_DEBUG, LOG_TAG, "nativeFlushAll(%p)", (void*)ptr);
     sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(ptr);
     datasource->flushAll();
 }
 
 void nativeRegisterDataSource(JNIEnv* env, jclass clazz, jlong datasource_ptr,
                               int buffer_exhausted_policy) {
-    ALOG(LOG_DEBUG, LOG_TAG, "nativeRegisterDataSource(%p)", (void*)datasource_ptr);
     sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(datasource_ptr);
 
     struct PerfettoDsParams params = PerfettoDsParamsDefault();
@@ -283,10 +286,6 @@
 
         auto* datasource_instance =
                 new PerfettoDataSourceInstance(env, java_data_source_instance.get(), inst_id);
-
-        ALOG(LOG_DEBUG, LOG_TAG, "on_setup_cb ds=%p, ds_instance=%p", datasource,
-             datasource_instance);
-
         return static_cast<void*>(datasource_instance);
     };
 
@@ -299,9 +298,6 @@
         jobject java_tls_state = datasource->createTlsStateGlobalRef(env, inst_id);
 
         auto* tls_state = new TlsState(java_tls_state);
-
-        ALOG(LOG_DEBUG, LOG_TAG, "on_create_tls_cb ds=%p, tsl_state=%p", datasource, tls_state);
-
         return static_cast<void*>(tls_state);
     };
 
@@ -310,8 +306,6 @@
 
         TlsState* tls_state = reinterpret_cast<TlsState*>(ptr);
 
-        ALOG(LOG_DEBUG, LOG_TAG, "on_delete_tls_cb %p", tls_state);
-
         env->DeleteGlobalRef(tls_state->jobj);
         delete tls_state;
     };
@@ -324,9 +318,6 @@
         jobject java_incr_state = datasource->createIncrementalStateGlobalRef(env, inst_id);
 
         auto* incr_state = new IncrementalState(java_incr_state);
-
-        ALOG(LOG_DEBUG, LOG_TAG, "on_create_incr_cb ds=%p, incr_state=%p", datasource, incr_state);
-
         return static_cast<void*>(incr_state);
     };
 
@@ -335,8 +326,6 @@
 
         IncrementalState* incr_state = reinterpret_cast<IncrementalState*>(ptr);
 
-        ALOG(LOG_DEBUG, LOG_TAG, "on_delete_incr_cb incr_state=%p", incr_state);
-
         env->DeleteGlobalRef(incr_state->jobj);
         delete incr_state;
     };
@@ -346,9 +335,6 @@
         JNIEnv* env = GetOrAttachJNIEnvironment(gVm, JNI_VERSION_1_6);
 
         auto* datasource_instance = static_cast<PerfettoDataSourceInstance*>(inst_ctx);
-
-        ALOG(LOG_DEBUG, LOG_TAG, "on_start_cb ds_instance=%p", datasource_instance);
-
         datasource_instance->onStart(env);
     };
 
@@ -357,9 +343,6 @@
         JNIEnv* env = GetOrAttachJNIEnvironment(gVm, JNI_VERSION_1_6);
 
         auto* datasource_instance = static_cast<PerfettoDataSourceInstance*>(inst_ctx);
-
-        ALOG(LOG_DEBUG, LOG_TAG, "on_flush_cb ds_instance=%p", datasource_instance);
-
         datasource_instance->onFlush(env);
     };
 
@@ -368,9 +351,6 @@
         JNIEnv* env = GetOrAttachJNIEnvironment(gVm, JNI_VERSION_1_6);
 
         auto* datasource_instance = static_cast<PerfettoDataSourceInstance*>(inst_ctx);
-
-        ALOG(LOG_DEBUG, LOG_TAG, "on_stop_cb ds_instance=%p", datasource_instance);
-
         datasource_instance->onStop(env);
     };
 
@@ -378,18 +358,14 @@
                               void* inst_ctx) -> void {
         auto* datasource_instance = static_cast<PerfettoDataSourceInstance*>(inst_ctx);
 
-        ALOG(LOG_DEBUG, LOG_TAG, "on_destroy_cb ds_instance=%p", datasource_instance);
-
         delete datasource_instance;
     };
 
     PerfettoDsRegister(&datasource->dataSource, datasource->dataSourceName.c_str(), params);
 }
 
-jobject nativeGetPerfettoInstanceLocked(JNIEnv* env, jclass clazz, jlong dataSourcePtr,
+jobject nativeGetPerfettoInstanceLocked(JNIEnv* /* env */, jclass /* clazz */, jlong dataSourcePtr,
                                         PerfettoDsInstanceIndex instance_idx) {
-    ALOG(LOG_DEBUG, LOG_TAG, "nativeGetPerfettoInstanceLocked ds=%p, idx=%d", (void*)dataSourcePtr,
-         instance_idx);
     sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr);
     auto* datasource_instance = static_cast<PerfettoDataSourceInstance*>(
             PerfettoDsImplGetInstanceLocked(datasource->dataSource.impl, instance_idx));
@@ -401,24 +377,44 @@
         return nullptr;
     }
 
-    ALOG(LOG_DEBUG, LOG_TAG, "\tnativeGetPerfettoInstanceLocked got lock ds=%p, idx=%d",
-         (void*)dataSourcePtr, instance_idx);
     return datasource_instance->GetJavaDataSourceInstance();
 }
 
-void nativeReleasePerfettoInstanceLocked(JNIEnv* env, jclass clazz, jlong dataSourcePtr,
+void nativeReleasePerfettoInstanceLocked(JNIEnv* /* env */, jclass /* clazz */, jlong dataSourcePtr,
                                          PerfettoDsInstanceIndex instance_idx) {
-    ALOG(LOG_DEBUG, LOG_TAG, "nativeReleasePerfettoInstanceLocked got lock ds=%p, idx=%d",
-         (void*)dataSourcePtr, instance_idx);
     sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr);
     PerfettoDsImplReleaseInstanceLocked(datasource->dataSource.impl, instance_idx);
 }
 
+bool nativePerfettoDsTraceIterateBegin(jlong dataSourcePtr) {
+    sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr);
+    return datasource->TraceIterateBegin();
+}
+
+bool nativePerfettoDsTraceIterateNext(jlong dataSourcePtr) {
+    sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr);
+    return datasource->TraceIterateNext();
+}
+
+void nativePerfettoDsTraceIterateBreak(jlong dataSourcePtr) {
+    sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr);
+    return datasource->TraceIterateBreak();
+}
+
+jobject nativeGetCustomTls(JNIEnv* /* env */, jclass /* clazz */, jlong dataSourcePtr) {
+    sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr);
+    return datasource->GetCustomTls();
+}
+
+jobject nativeGetIncrementalState(JNIEnv* /* env */, jclass /* clazz */, jlong dataSourcePtr) {
+    sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr);
+    return datasource->GetIncrementalState();
+}
+
 const JNINativeMethod gMethods[] = {
         /* name, signature, funcPtr */
         {"nativeCreate", "(Landroid/tracing/perfetto/DataSource;Ljava/lang/String;)J",
          (void*)nativeCreate},
-        {"nativeTrace", "(JLandroid/tracing/perfetto/TraceFunction;)V", (void*)nativeTrace},
         {"nativeFlushAll", "(J)V", (void*)nativeFlushAll},
         {"nativeGetFinalizer", "()J", (void*)nativeGetFinalizer},
         {"nativeRegisterDataSource", "(JI)V", (void*)nativeRegisterDataSource},
@@ -426,11 +422,16 @@
          (void*)nativeGetPerfettoInstanceLocked},
         {"nativeReleasePerfettoInstanceLocked", "(JI)V",
          (void*)nativeReleasePerfettoInstanceLocked},
-};
+
+        {"nativePerfettoDsTraceIterateBegin", "(J)Z", (void*)nativePerfettoDsTraceIterateBegin},
+        {"nativePerfettoDsTraceIterateNext", "(J)Z", (void*)nativePerfettoDsTraceIterateNext},
+        {"nativePerfettoDsTraceIterateBreak", "(J)V", (void*)nativePerfettoDsTraceIterateBreak}};
 
 const JNINativeMethod gMethodsTracingContext[] = {
         /* name, signature, funcPtr */
-        {"nativeFlush", "(Landroid/tracing/perfetto/TracingContext;J)V", (void*)nativeFlush},
+        {"nativeFlush", "(J[[B)V", (void*)nativeFlush},
+        {"nativeGetCustomTls", "(J)Ljava/lang/Object;", (void*)nativeGetCustomTls},
+        {"nativeGetIncrementalState", "(J)Ljava/lang/Object;", (void*)nativeGetIncrementalState},
 };
 
 int register_android_tracing_PerfettoDataSource(JNIEnv* env) {
@@ -461,14 +462,6 @@
                              "(Landroid/tracing/perfetto/CreateIncrementalStateArgs;)Ljava/lang/"
                              "Object;");
 
-    clazz = env->FindClass("android/tracing/perfetto/TracingContext");
-    gTracingContextClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
-    gTracingContextClassInfo.init = env->GetMethodID(gTracingContextClassInfo.clazz, "<init>",
-                                                     "(JLjava/lang/Object;Ljava/lang/Object;)V");
-    gTracingContextClassInfo.getAndClearAllPendingTracePackets =
-            env->GetMethodID(gTracingContextClassInfo.clazz, "getAndClearAllPendingTracePackets",
-                             "()[[B");
-
     clazz = env->FindClass("android/tracing/perfetto/CreateTlsStateArgs");
     gCreateTlsStateArgsClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
     gCreateTlsStateArgsClassInfo.init =
diff --git a/core/jni/android_tracing_PerfettoDataSource.h b/core/jni/android_tracing_PerfettoDataSource.h
index 906d9f5..209de29 100644
--- a/core/jni/android_tracing_PerfettoDataSource.h
+++ b/core/jni/android_tracing_PerfettoDataSource.h
@@ -46,7 +46,15 @@
 
     jobject createTlsStateGlobalRef(JNIEnv* env, PerfettoDsInstanceIndex inst_id);
     jobject createIncrementalStateGlobalRef(JNIEnv* env, PerfettoDsInstanceIndex inst_id);
-    void trace(JNIEnv* env, jobject trace_function);
+
+    bool TraceIterateBegin();
+    bool TraceIterateNext();
+    void TraceIterateBreak();
+    void WritePackets(JNIEnv* env, jobjectArray packets);
+
+    jobject GetCustomTls();
+    jobject GetIncrementalState();
+
     void flushAll();
 
 private:
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index d2d5186..2068bd7 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -88,6 +88,7 @@
     jclass mClass;
     jmethodID mForceGc;
     jmethodID mProxyLimitCallback;
+    jmethodID mProxyWarningCallback;
 
 } gBinderInternalOffsets;
 
@@ -1240,7 +1241,7 @@
     gCollectedAtRefs = gNumLocalRefsCreated + gNumDeathRefsCreated;
 }
 
-static void android_os_BinderInternal_proxyLimitcallback(int uid)
+static void android_os_BinderInternal_proxyLimitCallback(int uid)
 {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     env->CallStaticVoidMethod(gBinderInternalOffsets.mClass,
@@ -1254,6 +1255,20 @@
     }
 }
 
+static void android_os_BinderInternal_proxyWarningCallback(int uid)
+{
+    JNIEnv *env = AndroidRuntime::getJNIEnv();
+    env->CallStaticVoidMethod(gBinderInternalOffsets.mClass,
+                              gBinderInternalOffsets.mProxyWarningCallback,
+                              uid);
+
+    if (env->ExceptionCheck()) {
+        ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
+        binder_report_exception(env, excep.get(),
+                                "*** Uncaught exception in binderProxyWarningCallbackFromNative");
+    }
+}
+
 static void android_os_BinderInternal_setBinderProxyCountEnabled(JNIEnv* env, jobject clazz,
                                                                  jboolean enable)
 {
@@ -1278,9 +1293,10 @@
 }
 
 static void android_os_BinderInternal_setBinderProxyCountWatermarks(JNIEnv* env, jobject clazz,
-                                                                    jint high, jint low)
+                                                                    jint high, jint low,
+                                                                    jint warning)
 {
-    BpBinder::setBinderProxyCountWatermarks(high, low);
+    BpBinder::setBinderProxyCountWatermarks(high, low, warning);
 }
 
 // ----------------------------------------------------------------------------
@@ -1295,7 +1311,7 @@
     { "nSetBinderProxyCountEnabled", "(Z)V", (void*)android_os_BinderInternal_setBinderProxyCountEnabled },
     { "nGetBinderProxyPerUidCounts", "()Landroid/util/SparseIntArray;", (void*)android_os_BinderInternal_getBinderProxyPerUidCounts },
     { "nGetBinderProxyCount", "(I)I", (void*)android_os_BinderInternal_getBinderProxyCount },
-    { "nSetBinderProxyCountWatermarks", "(II)V", (void*)android_os_BinderInternal_setBinderProxyCountWatermarks}
+    { "nSetBinderProxyCountWatermarks", "(III)V", (void*)android_os_BinderInternal_setBinderProxyCountWatermarks}
 };
 
 const char* const kBinderInternalPathName = "com/android/internal/os/BinderInternal";
@@ -1307,6 +1323,8 @@
     gBinderInternalOffsets.mClass = MakeGlobalRefOrDie(env, clazz);
     gBinderInternalOffsets.mForceGc = GetStaticMethodIDOrDie(env, clazz, "forceBinderGc", "()V");
     gBinderInternalOffsets.mProxyLimitCallback = GetStaticMethodIDOrDie(env, clazz, "binderProxyLimitCallbackFromNative", "(I)V");
+    gBinderInternalOffsets.mProxyWarningCallback =
+        GetStaticMethodIDOrDie(env, clazz, "binderProxyWarningCallbackFromNative", "(I)V");
 
     jclass SparseIntArrayClass = FindClassOrDie(env, "android/util/SparseIntArray");
     gSparseIntArrayOffsets.classObject = MakeGlobalRefOrDie(env, SparseIntArrayClass);
@@ -1315,7 +1333,8 @@
     gSparseIntArrayOffsets.put = GetMethodIDOrDie(env, gSparseIntArrayOffsets.classObject, "put",
                                                    "(II)V");
 
-    BpBinder::setLimitCallback(android_os_BinderInternal_proxyLimitcallback);
+    BpBinder::setBinderProxyCountEventCallback(android_os_BinderInternal_proxyLimitCallback,
+                                               android_os_BinderInternal_proxyWarningCallback);
 
     return RegisterMethodsOrDie(
         env, kBinderInternalPathName,
diff --git a/core/jni/android_view_MotionEvent.cpp b/core/jni/android_view_MotionEvent.cpp
index 1a86363..b801a69 100644
--- a/core/jni/android_view_MotionEvent.cpp
+++ b/core/jni/android_view_MotionEvent.cpp
@@ -85,24 +85,9 @@
 
 ScopedLocalRef<jobject> android_view_MotionEvent_obtainAsCopy(JNIEnv* env,
                                                               const MotionEvent& event) {
-    ScopedLocalRef<jobject> eventObj(env,
-                                     env->CallStaticObjectMethod(gMotionEventClassInfo.clazz,
-                                                                 gMotionEventClassInfo.obtain));
-    if (env->ExceptionCheck() || !eventObj.get()) {
-        ALOGE("An exception occurred while obtaining a motion event.");
-        LOGE_EX(env);
-        env->ExceptionClear();
-        return ScopedLocalRef<jobject>(env);
-    }
-
-    MotionEvent* destEvent = android_view_MotionEvent_getNativePtr(env, eventObj.get());
-    if (!destEvent) {
-        destEvent = new MotionEvent();
-        android_view_MotionEvent_setNativePtr(env, eventObj, destEvent);
-    }
-
+    std::unique_ptr<MotionEvent> destEvent = std::make_unique<MotionEvent>();
     destEvent->copyFrom(&event, true);
-    return eventObj;
+    return android_view_MotionEvent_obtainFromNative(env, std::move(destEvent));
 }
 
 ScopedLocalRef<jobject> android_view_MotionEvent_obtainFromNative(
@@ -117,6 +102,8 @@
         LOGE_EX(env);
         LOG_ALWAYS_FATAL("An exception occurred while obtaining a Java motion event.");
     }
+    MotionEvent* oldEvent = android_view_MotionEvent_getNativePtr(env, eventObj.get());
+    delete oldEvent;
     android_view_MotionEvent_setNativePtr(env, eventObj, event.release());
     return eventObj;
 }
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 1eab991..1aa635c 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -208,10 +208,17 @@
 static struct {
     jclass clazz;
     jmethodID ctor;
+    jfieldID timeoutMillis;
+} gIdleScreenRefreshRateConfigClassInfo;
+
+static struct {
+    jclass clazz;
+    jmethodID ctor;
     jfieldID defaultMode;
     jfieldID allowGroupSwitching;
     jfieldID primaryRanges;
     jfieldID appRequestRanges;
+    jfieldID idleScreenRefreshRateConfig;
 } gDesiredDisplayModeSpecsClassInfo;
 
 static struct {
@@ -1407,6 +1414,18 @@
         return ranges;
     };
 
+    const auto makeIdleScreenRefreshRateConfig = [env](jobject obj)
+            -> std::optional<gui::DisplayModeSpecs::IdleScreenRefreshRateConfig> {
+        if (obj == NULL) {
+            return std::nullopt;
+        }
+        gui::DisplayModeSpecs::IdleScreenRefreshRateConfig idleScreenRefreshRateConfig;
+        idleScreenRefreshRateConfig.timeoutMillis =
+                env->GetIntField(obj, gIdleScreenRefreshRateConfigClassInfo.timeoutMillis);
+
+        return idleScreenRefreshRateConfig;
+    };
+
     gui::DisplayModeSpecs specs;
     specs.defaultMode = env->GetIntField(DesiredDisplayModeSpecs,
                                          gDesiredDisplayModeSpecsClassInfo.defaultMode);
@@ -1421,6 +1440,10 @@
             makeRanges(env->GetObjectField(DesiredDisplayModeSpecs,
                                            gDesiredDisplayModeSpecsClassInfo.appRequestRanges));
 
+    specs.idleScreenRefreshRateConfig = makeIdleScreenRefreshRateConfig(
+            env->GetObjectField(DesiredDisplayModeSpecs,
+                                gDesiredDisplayModeSpecsClassInfo.idleScreenRefreshRateConfig));
+
     size_t result = SurfaceComposerClient::setDesiredDisplayModeSpecs(token, specs);
     return result == NO_ERROR ? JNI_TRUE : JNI_FALSE;
 }
@@ -1440,6 +1463,17 @@
                               rangeToJava(ranges.physical), rangeToJava(ranges.render));
     };
 
+    const auto idleScreenRefreshRateConfigToJava =
+            [env](const std::optional<gui::DisplayModeSpecs::IdleScreenRefreshRateConfig>&
+                          idleScreenRefreshRateConfig) -> jobject {
+        if (!idleScreenRefreshRateConfig.has_value()) {
+            return NULL; // Return null if input config is null
+        }
+        return env->NewObject(gIdleScreenRefreshRateConfigClassInfo.clazz,
+                              gIdleScreenRefreshRateConfigClassInfo.ctor,
+                              idleScreenRefreshRateConfig->timeoutMillis);
+    };
+
     gui::DisplayModeSpecs specs;
     if (SurfaceComposerClient::getDesiredDisplayModeSpecs(token, &specs) != NO_ERROR) {
         return nullptr;
@@ -1448,7 +1482,8 @@
     return env->NewObject(gDesiredDisplayModeSpecsClassInfo.clazz,
                           gDesiredDisplayModeSpecsClassInfo.ctor, specs.defaultMode,
                           specs.allowGroupSwitching, rangesToJava(specs.primaryRanges),
-                          rangesToJava(specs.appRequestRanges));
+                          rangesToJava(specs.appRequestRanges),
+                          idleScreenRefreshRateConfigToJava(specs.idleScreenRefreshRateConfig));
 }
 
 static jobject nativeGetDisplayNativePrimaries(JNIEnv* env, jclass, jobject tokenObj) {
@@ -2607,13 +2642,23 @@
             GetFieldIDOrDie(env, RefreshRateRangesClazz, "render",
                             "Landroid/view/SurfaceControl$RefreshRateRange;");
 
+    jclass IdleScreenRefreshRateConfigClazz =
+            FindClassOrDie(env, "android/view/SurfaceControl$IdleScreenRefreshRateConfig");
+    gIdleScreenRefreshRateConfigClassInfo.clazz =
+            MakeGlobalRefOrDie(env, IdleScreenRefreshRateConfigClazz);
+    gIdleScreenRefreshRateConfigClassInfo.ctor =
+            GetMethodIDOrDie(env, gIdleScreenRefreshRateConfigClassInfo.clazz, "<init>", "(I)V");
+    gIdleScreenRefreshRateConfigClassInfo.timeoutMillis =
+            GetFieldIDOrDie(env, gIdleScreenRefreshRateConfigClassInfo.clazz, "timeoutMillis", "I");
+
     jclass DesiredDisplayModeSpecsClazz =
             FindClassOrDie(env, "android/view/SurfaceControl$DesiredDisplayModeSpecs");
     gDesiredDisplayModeSpecsClassInfo.clazz = MakeGlobalRefOrDie(env, DesiredDisplayModeSpecsClazz);
     gDesiredDisplayModeSpecsClassInfo.ctor =
             GetMethodIDOrDie(env, gDesiredDisplayModeSpecsClassInfo.clazz, "<init>",
                              "(IZLandroid/view/SurfaceControl$RefreshRateRanges;Landroid/view/"
-                             "SurfaceControl$RefreshRateRanges;)V");
+                             "SurfaceControl$RefreshRateRanges;Landroid/view/"
+                             "SurfaceControl$IdleScreenRefreshRateConfig;)V");
     gDesiredDisplayModeSpecsClassInfo.defaultMode =
             GetFieldIDOrDie(env, DesiredDisplayModeSpecsClazz, "defaultMode", "I");
     gDesiredDisplayModeSpecsClassInfo.allowGroupSwitching =
@@ -2624,6 +2669,9 @@
     gDesiredDisplayModeSpecsClassInfo.appRequestRanges =
             GetFieldIDOrDie(env, DesiredDisplayModeSpecsClazz, "appRequestRanges",
                             "Landroid/view/SurfaceControl$RefreshRateRanges;");
+    gDesiredDisplayModeSpecsClassInfo.idleScreenRefreshRateConfig =
+            GetFieldIDOrDie(env, DesiredDisplayModeSpecsClazz, "idleScreenRefreshRateConfig",
+                            "Landroid/view/SurfaceControl$IdleScreenRefreshRateConfig;");
 
     jclass jankDataClazz =
                 FindClassOrDie(env, "android/view/SurfaceControl$JankData");
diff --git a/core/proto/OWNERS b/core/proto/OWNERS
index b900fa6..b51f72d 100644
--- a/core/proto/OWNERS
+++ b/core/proto/OWNERS
@@ -11,7 +11,6 @@
 # Frameworks
 [email protected]
 [email protected]
[email protected]
 [email protected]
 per-file package_item_info.proto = file:/PACKAGE_MANAGER_OWNERS
 per-file usagestatsservice.proto, usagestatsservice_v2.proto = file:/core/java/android/app/usage/OWNERS
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index 6b0c2d2..5ae365c 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -102,6 +102,7 @@
         optional SettingProto qs_targets = 54 [ (android.privacy).dest = DEST_AUTOMATIC ];
         optional SettingProto accessibility_pinch_to_zoom_anywhere_enabled = 55 [ (android.privacy).dest = DEST_AUTOMATIC ];
         optional SettingProto accessibility_single_finger_panning_enabled = 56 [ (android.privacy).dest = DEST_AUTOMATIC ];
+        optional SettingProto accessibility_floating_menu_targets = 57 [ (android.privacy).dest = DEST_AUTOMATIC ];
 
     }
     optional Accessibility accessibility = 2;
@@ -248,6 +249,11 @@
     }
     optional DateTime date_time = 90;
 
+    message Display {
+        optional SettingProto screen_resolution_mode = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+    }
+    optional Display display = 100;
+
     message Doze {
         option (android.msg_privacy).dest = DEST_EXPLICIT;
 
@@ -726,5 +732,5 @@
 
     // Please insert fields in alphabetical order and group them into messages
     // if possible (to avoid reaching the method limit).
-    // Next tag = 100;
+    // Next tag = 101;
 }
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 31f2d8b..f743299 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -6778,7 +6778,7 @@
                 android:protectionLevel="signature" />
 
     <!-- Allows an application to set the advanced features on BiometricDialog (SystemUI), including
-         logo, logo description.
+         logo, logo description, and content view with more options button.
          <p>Not for use by third-party applications.
          @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt")
     -->
@@ -7507,16 +7507,6 @@
     <permission android:name="android.permission.RECEIVE_SANDBOX_TRIGGER_AUDIO"
                 android:protectionLevel="signature|privileged|appop" />
 
-    <!-- @SystemApi Required for the privileged assistant apps targeting
-         {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM}
-         that receive training data from a sandboxed {@link HotwordDetectionService} or
-         {@link VisualQueryDetectionService}.
-         <p>Protection level: internal|appop
-         @FlaggedApi("android.permission.flags.voice_activation_permission_apis")
-         @hide -->
-    <permission android:name="android.permission.RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA"
-                android:protectionLevel="internal|appop" />
-
     <!-- @SystemApi Allows requesting the framework broadcast the
          {@link Intent#ACTION_DEVICE_CUSTOMIZATION_READY} intent.
          @hide -->
@@ -7986,6 +7976,7 @@
          content URI trigger and network constraint set.
          <p>This is a special access permission that can be revoked by the system or the user.
          <p>Protection level: signature|privileged|appop
+         @hide
      -->
     <permission android:name="android.permission.RUN_BACKUP_JOBS"
                 android:protectionLevel="signature|privileged|appop"/>
@@ -8119,7 +8110,7 @@
         android:protectionLevel="signature|privileged" />
 
     <!-- @hide @SystemApi
-        @FlaggedApi("com.android.server.notification.flags.redact_otp_notifications_from_untrusted_listeners")
+        @FlaggedApi("android.view.flags.sensitive_content_app_protection_api")
         Allows apps with a NotificationListenerService to receive notifications with sensitive
         information
         <p>Apps with a NotificationListenerService without this permission will not be able
@@ -8167,6 +8158,15 @@
     <permission android:name="android.permission.RESTRICT_DISPLAY_MODES"
         android:protectionLevel="signature" />
 
+    <!-- Allows internal applications to override screen timeout temporarily
+        <p>Protection level: signature
+        <p>Not for use by third-party applications.
+        @FlaggedApi("com.android.server.power.feature.flags.enable_early_screen_timeout_detector")
+        @hide
+    -->
+    <permission android:name="android.permission.SCREEN_TIMEOUT_OVERRIDE"
+                android:protectionLevel="signature" />
+
     <!-- Attribution for Geofencing service. -->
     <attribution android:tag="GeofencingService" android:label="@string/geofencing_service"/>
     <!-- Attribution for Country Detector. -->
diff --git a/core/res/OWNERS b/core/res/OWNERS
index 6924248..3489cac 100644
--- a/core/res/OWNERS
+++ b/core/res/OWNERS
@@ -4,7 +4,6 @@
 [email protected]
 [email protected]
 [email protected]
[email protected]
 [email protected]
 [email protected]
 [email protected]
@@ -43,10 +42,13 @@
 # Device Idle
 per-file res/values/config_device_idle.xml = file:/apex/jobscheduler/OWNERS
 
+# Display Manager
+per-file res/values/config_display.xml = file:/services/core/java/com/android/server/display/OWNERS
+
 # Wear
 per-file res/*-watch/* = file:/WEAR_OWNERS
 
-# Peformance
+# Performance
 per-file res/values/config.xml = file:/PERFORMANCE_OWNERS
 per-file res/values/symbols.xml = file:/PERFORMANCE_OWNERS
 
@@ -60,3 +62,11 @@
 
 # TV Input Framework
 per-file res/values/config_tv_external_input_logging.xml = file:/services/core/java/com/android/server/tv/OWNERS
+
+# SysUi Color Team
+per-file res/values/colors.xml = [email protected]
+per-file res/values/attrs.xml = [email protected]
+per-file res/values/styles.xml = [email protected]
+per-file res/values/symbols.xml = [email protected]
+per-file res/values/themes_device_defaults.xml = [email protected]
+per-file res/values/styles_material.xml = [email protected]
\ No newline at end of file
diff --git a/core/res/res/drawable/ic_bt_hearing_aid.xml b/core/res/res/drawable/ic_bt_hearing_aid.xml
index e14c99b..1517147 100644
--- a/core/res/res/drawable/ic_bt_hearing_aid.xml
+++ b/core/res/res/drawable/ic_bt_hearing_aid.xml
@@ -14,10 +14,11 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0"
+    android:tint="?android:attr/colorControlNormal">
     <path
         android:fillColor="#FF000000"
         android:pathData="M17,20c-0.29,0 -0.56,-0.06 -0.76,-0.15 -0.71,-0.37 -1.21,-0.88 -1.71,-2.38 -0.51,-1.56 -1.47,-2.29 -2.39,-3 -0.79,-0.61 -1.61,-1.24 -2.32,-2.53C9.29,10.98 9,9.93 9,9c0,-2.8 2.2,-5 5,-5s5,2.2 5,5h2c0,-3.93 -3.07,-7 -7,-7S7,5.07 7,9c0,1.26 0.38,2.65 1.07,3.9 0.91,1.65 1.98,2.48 2.85,3.15 0.81,0.62 1.39,1.07 1.71,2.05 0.6,1.82 1.37,2.84 2.73,3.55 0.51,0.23 1.07,0.35 1.64,0.35 2.21,0 4,-1.79 4,-4h-2c0,1.1 -0.9,2 -2,2zM7.64,2.64L6.22,1.22C4.23,3.21 3,5.96 3,9s1.23,5.79 3.22,7.78l1.41,-1.41C6.01,13.74 5,11.49 5,9s1.01,-4.74 2.64,-6.36zM11.5,9c0,1.38 1.12,2.5 2.5,2.5s2.5,-1.12 2.5,-2.5 -1.12,-2.5 -2.5,-2.5 -2.5,1.12 -2.5,2.5z"/>
diff --git a/core/res/res/layout/autofill_fill_dialog.xml b/core/res/res/layout/autofill_fill_dialog.xml
index 196af6d..ed9961c 100644
--- a/core/res/res/layout/autofill_fill_dialog.xml
+++ b/core/res/res/layout/autofill_fill_dialog.xml
@@ -72,6 +72,7 @@
         android:layout_marginEnd="24dp"
         android:clipToPadding="false"
         android:drawSelectorOnTop="true"
+        android:contentSensitivity="sensitive"
         android:clickable="true"
         android:divider="@null"
         android:visibility="gone" />
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 5e435124..63cd6b9 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Kan nie selnetwerk bereik nie"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Probeer die voorkeurnetwerk verander. Tik om te verander."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Noodoproepe is onbeskikbaar"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Kan nie noodoproepe oor Wi-Fi maak nie"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Noodoproepe vereis ’n selnetwerk."</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Opletberigte"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Oproepaanstuur"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Noodterugbel-modus"</string>
@@ -137,7 +137,7 @@
     <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="8383917598312067365">"Wi-Fi-oproepe | <xliff:g id="SPN">%s</xliff:g>"</string>
     <string name="wfcSpnFormat_spn_vowifi" msgid="6865214948822061486">"<xliff:g id="SPN">%s</xliff:g>-VoWifi"</string>
     <string name="wfcSpnFormat_wifi_calling" msgid="6178935388378661755">"Wi-Fi-oproepe"</string>
-    <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string>
+    <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-fi"</string>
     <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Wi-Fi-oproepe"</string>
     <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string>
     <string name="wfcSpnFormat_wifi_call" msgid="434016592539090004">"Wi-fi-oproep"</string>
@@ -357,7 +357,7 @@
     <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan \'n skermkiekie neem."</string>
     <string name="dream_preview_title" msgid="5570751491996100804">"Voorskou, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string>
     <string name="permlab_statusBar" msgid="8798267849526214017">"deaktiveer of verander statusbalk"</string>
-    <string name="permdesc_statusBar" msgid="5809162768651019642">"Laat die program toe om die statusbalk te deaktiveer en stelselikone by te voeg of te verwyder."</string>
+    <string name="permdesc_statusBar" msgid="5809162768651019642">"Laat die app toe om die statusbalk te deaktiveer en stelselikone by te voeg of te verwyder."</string>
     <string name="permlab_statusBarService" msgid="2523421018081437981">"wees die statusbalk"</string>
     <string name="permdesc_statusBarService" msgid="6652917399085712557">"Laat die program toe om die statusbalk te wees."</string>
     <string name="permlab_expandStatusBar" msgid="1184232794782141698">"vou statusbalk in of uit"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Vee uit"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Invoermetode"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Teksaksies"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handskrif word nie in hierdie veld gesteun nie"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handskrif word nie in wagwoordvelde gesteun nie"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Terug"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Wissel invoermetode"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Bergingspasie word min"</string>
@@ -1339,7 +1341,7 @@
     <string name="network_switch_metered_toast" msgid="501662047275723743">"Het oorgeskakel van <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
   <string-array name="network_switch_type_name">
     <item msgid="2255670471736226365">"mobiele data"</item>
-    <item msgid="5520925862115353992">"Wi-Fi"</item>
+    <item msgid="5520925862115353992">"Wi-fi"</item>
     <item msgid="1055487873974272842">"Bluetooth"</item>
     <item msgid="1616528372438698248">"Ethernet"</item>
     <item msgid="9177085807664964627">"VPN"</item>
@@ -1900,7 +1902,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"Batterybespaarder skakel Donkertema aan en beperk of skakel agtergrondaktiwiteit, sommige visuele effekte, sekere kenmerke en sommige netwerkverbindings af"</string>
     <string name="battery_saver_description" msgid="8518809702138617167">"Batterybespaarder skakel Donkertema aan en beperk of skakel agtergrondaktiwiteit, sommige visuele effekte, sekere kenmerke en sommige netwerkverbindings af"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Databespaarder verhoed sommige programme om data in die agtergrond te stuur of te aanvaar om datagebruik te help verminder. \'n Program wat jy tans gebruik kan by data ingaan, maar sal dit dalk minder gereeld doen. Dit kan byvoorbeeld beteken dat prente nie wys voordat jy op hulle tik nie."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Databespaarder verhoed sommige apps om data in die agtergrond te stuur of te aanvaar om datagebruik te help verminder. \'n App wat jy tans gebruik kan by data ingaan, maar sal dit dalk minder gereeld doen. Dit kan byvoorbeeld beteken dat prente nie wys voordat jy op hulle tik nie."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Skakel Databespaarder aan?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Skakel aan"</string>
     <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Een minuut lank (tot {formattedTime})}other{# minute lank (tot {formattedTime})}}"</string>
@@ -1927,6 +1929,12 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Bestuur deur <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aan"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Af"</string>
+    <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+    <skip />
+    <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+    <skip />
+    <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+    <skip />
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> demp sekere klanke"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Daar is \'n interne probleem met jou toestel en dit sal dalk onstabiel wees totdat jy \'n fabriekterugstelling doen."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Daar is \'n interne probleem met jou toestel. Kontak jou vervaardiger vir besonderhede."</string>
@@ -2026,7 +2034,7 @@
     <string name="pin_specific_target" msgid="7824671240625957415">"Speld <xliff:g id="LABEL">%1$s</xliff:g> vas"</string>
     <string name="unpin_target" msgid="3963318576590204447">"Ontspeld"</string>
     <string name="unpin_specific_target" msgid="3859828252160908146">"Ontspeld <xliff:g id="LABEL">%1$s</xliff:g>"</string>
-    <string name="app_info" msgid="6113278084877079851">"Programinligting"</string>
+    <string name="app_info" msgid="6113278084877079851">"Appinligting"</string>
     <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="demo_starting_message" msgid="6577581216125805905">"Begin tans demonstrasie …"</string>
     <string name="demo_restarting_message" msgid="1160053183701746766">"Stel toestel tans terug …"</string>
@@ -2389,6 +2397,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Toets"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Gemeenskaplik"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Outomaties aan satelliet gekoppel"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Jy kan boodskappe stuur en ontvang sonder ’n selfoon- of wi-fi-netwerk"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Maak Boodskappe oop"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index a06d4d4..799a7ab 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"የሞባይል አውታረ መረብን መድረስ አልተቻለም"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ተመራጭ አውታረ መረብን ለመለወጥ ይሞክሩ። ለመለወጥ መታ ያድርጉ።"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"የአደጋ ጊዜ ጥሪ አይገኝም"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"በWi‑Fi በኩል የአደጋ ጊዜ ጥሪዎችን ማድረግ አይችልም"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"የአደጋ ጥሪዎች የተንቀሳቃሽ ስልክ አውታረ መረብ ያስፈልጋቸዋል"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"ማንቂያዎች"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"ጥሪ ማስተላለፍ"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"የአደጋ ጊዜ ጥሪ ሁነታ"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"ሰርዝ"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ግቤት ስልት"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"የፅሁፍ እርምጃዎች"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"የእጅ ጽሑፍ በዚህ መስክ ውስጥ አይደገፍም"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"የእጅ ጽሑፍ በይለፍ ቃል መስኮች ውስጥ አይደገፍም"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ተመለስ"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"የግቤት ስልትን ቀይር"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"የማከማቻ ቦታ እያለቀ ነው"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"በ<xliff:g id="APP_NAME">%1$s</xliff:g> የሚተዳደር"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"በርቷል"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ጠፍቷል"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">"፣ "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ማንኛውም ቀን መቁጠሪያ"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> አንዳንድ ድምጾችን እየዘጋ ነው"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"መሣሪያዎ ላይ የውስጣዊ ችግር አለ፣ የፋብሪካ ውሂብ ዳግም እስኪያስጀምሩት ድረስ ላይረጋጋ ይችላል።"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"መሣሪያዎ ላይ የውስጣዊ ችግር አለ። ዝርዝሮችን ለማግኘት አምራችዎን ያነጋግሩ።"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"ሙከራ"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"የጋራ"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"ከሳተላይት ጋር በራስ-ሰር ተገናኝቷል"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"ያለ ሞባይል ወይም የWi-Fi አውታረ መረብ መልዕክቶችን መላክ እና መቀበል ይችላሉ"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"መልዕክቶች ይክፈቱ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 894371c..fad2cd6 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -88,7 +88,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"يتعذّر الوصول إلى شبكة الجوّال."</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"حاول تغيير الشبكة المفضلة. انقر لتغييرها."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"لا تتوفر إمكانية الاتصال في حالات الطوارئ."</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"‏يتعذّر إجراء مكالمات طوارئ عبر Wi‑Fi."</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"يتطلّب إجراء مكالمات الطوارئ الاتصال بشبكة جوّال"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"التنبيهات"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"إعادة توجيه المكالمة"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"وضع معاودة الاتصال بالطوارئ"</string>
@@ -319,7 +319,7 @@
     <string name="permgroupdesc_contacts" msgid="9163927941244182567">"الوصول إلى جهات اتصالك"</string>
     <string name="permgrouplab_location" msgid="1858277002233964394">"الموقع الجغرافي"</string>
     <string name="permgroupdesc_location" msgid="1995955142118450685">"الوصول إلى موقع هذا الجهاز"</string>
-    <string name="permgrouplab_calendar" msgid="6426860926123033230">"التقويم"</string>
+    <string name="permgrouplab_calendar" msgid="6426860926123033230">"‏تقويم Google"</string>
     <string name="permgroupdesc_calendar" msgid="6762751063361489379">"الوصول إلى تقويمك"</string>
     <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
     <string name="permgroupdesc_sms" msgid="5726462398070064542">"‏إرسال رسائل قصيرة SMS وعرضها"</string>
@@ -1187,6 +1187,8 @@
     <string name="deleteText" msgid="4200807474529938112">"حذف"</string>
     <string name="inputMethod" msgid="1784759500516314751">"طريقة الإرسال"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"إجراءات النص"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"الكتابة بخط اليد غير متاحة في هذا الحقل"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"الكتابة بخط اليد غير متاحة في حقول كلمات المرور"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"رجوع"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"تبديل أسلوب الإدخال"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"مساحة التخزين منخفضة"</string>
@@ -1285,7 +1287,7 @@
     <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"بدء التطبيقات."</string>
     <string name="android_upgrading_complete" msgid="409800058018374746">"جارٍ إعادة التشغيل."</string>
     <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"ضغطت على زر التشغيل، يؤدي هذا عادةً إلى إيقاف الشاشة.\n\nجرِّب النقر بخفة أثناء إعداد بصمتك."</string>
-    <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"لإيقاف عملية الإعداد، أغلِق الشاشة."</string>
+    <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"لإيقاف عملية الإعداد، أغلِق الشاشة"</string>
     <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"إيقاف"</string>
     <string name="fp_power_button_bp_title" msgid="5585506104526820067">"هل تريد مواصلة تأكيد بصمة إصبعك؟"</string>
     <string name="fp_power_button_bp_message" msgid="2983163038168903393">"ضغطت على زر التشغيل، يؤدي هذا عادةً إلى إيقاف الشاشة.\n\nجرِّب النقر بخفة لتأكيد بصمة إصبعك."</string>
@@ -1931,6 +1933,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"تحت إدارة \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"مفعَّل"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"غير مفعَّل"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">"، "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"من <xliff:g id="START">%1$s</xliff:g> إلى <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"أي تقويم"</string>
     <string name="muted_by" msgid="91464083490094950">"يعمل <xliff:g id="THIRD_PARTY">%1$s</xliff:g> على كتم بعض الأصوات."</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"حدثت مشكلة داخلية في جهازك، وقد لا يستقر وضعه حتى إجراء إعادة الضبط على الإعدادات الأصلية."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"حدثت مشكلة داخلية في جهازك. يمكنك الاتصال بالمصنِّع للحصول على تفاصيل."</string>
@@ -1992,7 +1997,7 @@
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"الطوارئ"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"ضبط قفل شاشة"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"ضبط قفل الشاشة"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"لاستخدام مساحتك الخاصة، يجب ضبط قفل شاشة على هذا الجهاز."</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"لاستخدام مساحتك الخاصة، يجب ضبط قفل شاشة على هذا الجهاز"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"التطبيق غير متاح"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> غير متاح الآن."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"تطبيق <xliff:g id="ACTIVITY">%1$s</xliff:g> غير متاح"</string>
@@ -2393,6 +2398,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"ملف شخصي تجريبي"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"ملف شخصي مشترك"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"تم الاتصال تلقائيًا بالقمر الصناعي"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"‏يمكنك إرسال الرسائل واستلامها بدون شبكة الجوّال أو شبكة Wi-Fi."</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"فتح تطبيق \"الرسائل\""</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index b1af54f..8b3f832 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ম’বাইল নেটৱৰ্কৰ লগত সংযোগ কৰিব পৰা নাই"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"পচন্দৰ নেটৱৰ্ক সলনি কৰি চেষ্টা কৰি চাওক। সলনি কৰিবলৈ টিপক।"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"জৰুৰীকালীন কল কৰাৰ সুবিধা উপলব্ধ নহয়"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"ৱাই-ফাইৰ জৰিয়তে জৰুৰীকালীন কল কৰিব নোৱাৰি"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"জৰুৰীকালীন কল কৰিবলৈ ম’বাইল নেটৱৰ্কৰ প্ৰয়োজন"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"সতৰ্কবাণীসমূহ"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"কল ফৰৱাৰ্ডিং"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"জৰুৰীকালীন ক\'লবেক ম\'ড"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"মচক"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ইনপুট পদ্ধতি"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"পাঠ বিষয়ক কাৰ্য"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"এই ক্ষেত্ৰত হস্তলিপি সমৰ্থিত নহয়"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"পাছৱৰ্ড ক্ষেত্ৰসমূহত হস্তলিপি সমৰ্থিত নহয়"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"উভতি যাওক"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ইনপুটৰ পদ্ধতি সলনি কৰক"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"ষ্ট’ৰেজৰ খালী ঠাই শেষ হৈ আছে"</string>
@@ -1922,11 +1924,14 @@
     <string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"ডাউনটাইম"</string>
     <string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"কাৰ্য-দিনৰ নিশা"</string>
     <string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"সপ্তাহ অন্ত"</string>
-    <string name="zen_mode_default_events_name" msgid="2280682960128512257">"কার্যক্ৰম"</string>
+    <string name="zen_mode_default_events_name" msgid="2280682960128512257">"অনুষ্ঠান"</string>
     <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"নিদ্ৰাৰত"</string>
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ পৰিচালনা কৰা"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"অন আছে"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"অফ আছে"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"যিকোনো কেলেণ্ডাৰ"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>এ কিছুমান ধ্বনি মিউট কৰি আছে"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"আপোনাৰ ডিভাইচত এটা আভ্যন্তৰীণ সমস্যা আছে আৰু আপুনি ফেক্টৰী ডেটা ৰিছেট নকৰালৈকে ই সুস্থিৰভাৱে কাম নকৰিব পাৰে।"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"আপোনাৰ ডিভাইচত এটা আভ্যন্তৰীণ সমস্যা আছে। সবিশেষ জানিবৰ বাবে আপোনাৰ ডিভাইচ নির্মাতাৰ সৈতে যোগাযোগ কৰক।"</string>
@@ -1972,7 +1977,7 @@
     <string name="language_selection_title" msgid="52674936078683285">"ভাষা যোগ কৰক"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"অঞ্চলৰ অগ্ৰাধিকাৰ"</string>
     <string name="search_language_hint" msgid="7004225294308793583">"ভাষাৰ নাম লিখক"</string>
-    <string name="language_picker_section_suggested" msgid="6556199184638990447">"প্ৰস্তাৱিত"</string>
+    <string name="language_picker_section_suggested" msgid="6556199184638990447">"পৰামৰ্শিত"</string>
     <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"পৰামৰ্শিত"</string>
     <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"পৰামৰ্শিত ভাষাসমূহ"</string>
     <string name="region_picker_section_suggested_bilingual" msgid="704607569328224133">"চুপাৰিছ কৰা অঞ্চলসমূহ"</string>
@@ -1988,7 +1993,7 @@
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"জৰুৰীকালীন"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"এটা স্ক্ৰীন লক ছেট কৰক"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"স্ক্ৰীন লক ছেট কৰা"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"আপোনাৰ প্ৰাইভেট স্পেচ ব্যৱহাৰ কৰিবলৈ এই ডিভাইচটোত স্ক্ৰীন লক ছেট কৰক"</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"আপোনাৰ প্ৰাইভেট স্পে\'চ ব্যৱহাৰ কৰিবলৈ এই ডিভাইচটোত স্ক্ৰীন লক ছেট কৰক"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"এপ্‌টো উপলব্ধ নহয়"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"এই মুহূৰ্তত <xliff:g id="APP_NAME">%1$s</xliff:g> উপলব্ধ নহয়।"</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> উপলব্ধ নহয়"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"পৰীক্ষা"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"শ্বেয়াৰ কৰা"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"উপগ্ৰহৰ সৈতে স্বয়ংক্ৰিয়ভাৱে সংযুক্ত হৈছে"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"আপুনি ম’বাইল বা ৱাই-ফাই নেটৱৰ্কৰ জৰিয়তে পাঠ বাৰ্তা পঠিয়াব বা লাভ কৰিব পাৰে"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages খোলক"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 0d0d102..c0b886b 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobil şəbəkəyə daxil olmaq mümkün deyil"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Tərcih edilən şəbəkəni dəyişin. Dəyişmək üçün klikləyin."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Təcili zəng əlçatan deyil"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi‑Fi vasitəsilə təcili zənglər etmək mümkün deyil"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Təcili zənglər üçün mobil şəbəkə tələb olunur"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Siqnallar"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Zəng yönləndirmə"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Təcili geriyə zəng rejimi"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Sil"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Daxiletmə metodu"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Mətn əməliyyatları"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Bu xanada əlyazma dəstəklənmir"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Parol sahələrində əlyazma dəstəklənmir"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Geriyə"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Daxiletmə metodunu dəyişdirin"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Yaddaş yeri bitir"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> idarə edir"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aktiv"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Deaktiv"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"İstənilən təqvim"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> bəzi səsləri səssiz rejimə salır"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Cihazınızın daxili problemi var və istehsalçı sıfırlanması olmayana qədər qeyri-stabil ola bilər."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Cihazınızın daxili problemi var. Əlavə məlumat üçün istehsalçı ilə əlaqə saxlayın."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Kommunal"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Peykə avtomatik qoşulub"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Mobil və ya Wi-Fi şəbəkəsi olmadan mesaj göndərə və qəbul edə bilərsiniz"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Mesajı açı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 653a06b..a275cab 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Povezivanje sa mobilnom mrežom nije uspelo"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Probajte da promenite željenu mrežu. Dodirnite da biste promenili."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Hitni pozivi nisu dostupni"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Ne možete da upućujete hitne pozive preko Wi‑Fi-ja"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Hitni pozivi zahtevaju mobilnu mrežu"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Upozorenja"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Preusmeravanje poziva"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Režim za hitan povratni poziv"</string>
@@ -615,7 +615,7 @@
     <string name="permlab_disableKeyguard" msgid="3605253559020928505">"onemogućavanje zaključavanja ekrana"</string>
     <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Dozvoljava aplikaciji da onemogući zaključavanje tastature i sve povezane bezbednosne mere sa lozinkama. Na primer, telefon onemogućava zaključavanje tastature pri prijemu dolaznog telefonskog poziva, a zatim ga ponovo omogućava po završetku poziva."</string>
     <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"traženje složenosti zaključavanja ekrana"</string>
-    <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"Dozvoljava aplikaciji da sazna nivo složenosti zaključavanja ekrana (visoka, srednja, niska ili nijedna), što ukazuje na mogući opseg trajanja i tip zaključavanja ekrana. Aplikacija može i da predlaže korisnicima da ažuriraju zaključavanje ekrana na određeni nivo, ali korisnici slobodno mogu da zanemare to i da idu na druge stranice. Imajte na umu da se podaci za zaključavanje ekrana ne čuvaju kao običan tekst, pa aplikacija ne zna tačnu lozinku."</string>
+    <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"Dozvoljava aplikaciji da sazna nivo složenosti zaključavanja ekrana (visoka, srednja, niska ili nijedna), što ukazuje na mogući opseg trajanja i tip zaključavanja ekrana. Aplikacija može i da predlaže korisnicima da ažuriraju otključavanje ekrana na određeni nivo, ali korisnici slobodno mogu da zanemare to i da idu na druge stranice. Imajte na umu da se podaci za otključavanje ekrana ne čuvaju kao običan tekst, pa aplikacija ne zna tačnu lozinku."</string>
     <string name="permlab_postNotification" msgid="4875401198597803658">"prikazivanje obaveštenja"</string>
     <string name="permdesc_postNotification" msgid="5974977162462877075">"Dozvoljava aplikaciji da prikazuje obaveštenja"</string>
     <string name="permlab_turnScreenOn" msgid="219344053664171492">"uključivanje ekrana"</string>
@@ -635,10 +635,10 @@
     <string name="permlab_mediaLocation" msgid="7368098373378598066">"čitanje lokacija iz medijske kolekcije"</string>
     <string name="permdesc_mediaLocation" msgid="597912899423578138">"Dozvoljava aplikaciji da čita lokacije iz medijske kolekcije."</string>
     <string name="biometric_app_setting_name" msgid="3339209978734534457">"Koristite biometriju"</string>
-    <string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Koristite biometriju ili zaključavanje ekrana"</string>
+    <string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Koristite biometriju ili otključavanje ekrana"</string>
     <string name="biometric_dialog_default_title" msgid="55026799173208210">"Potvrdite svoj identitet"</string>
     <string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Koristite biometrijski podatak da biste nastavili"</string>
-    <string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Koristite biometrijski podatak ili zaključavanje ekrana da biste nastavili"</string>
+    <string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Koristite biometrijski podatak ili otključavanje ekrana da biste nastavili"</string>
     <string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrijski hardver nije dostupan"</string>
     <string name="biometric_error_user_canceled" msgid="6732303949695293730">"Potvrda identiteta je otkazana"</string>
     <string name="biometric_not_recognized" msgid="5106687642694635888">"Nije prepoznato"</string>
@@ -646,8 +646,8 @@
     <string name="biometric_error_canceled" msgid="8266582404844179778">"Potvrda identiteta je otkazana"</string>
     <string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Niste podesili ni PIN, ni šablon, ni lozinku"</string>
     <string name="biometric_error_generic" msgid="6784371929985434439">"Greška pri potvrdi identiteta"</string>
-    <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Koristite zaključavanje ekrana"</string>
-    <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Upotrebite zaključavanje ekrana da biste nastavili"</string>
+    <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Koristite otključavanje ekrana"</string>
+    <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Upotrebite otključavanje ekrana da biste nastavili"</string>
     <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"Čvrsto pritisnite senzor"</string>
     <string name="fingerprint_acquired_insufficient" msgid="2410176550915730974">"Otisak prsta nije prepoznat. Probajte ponovo."</string>
     <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Obrišite senzor za otisak prsta i probajte ponovo"</string>
@@ -672,8 +672,8 @@
     <string name="fingerprint_error_timeout" msgid="7361192266621252164">"Vreme za podešavanje otiska prsta je isteklo. Probajte ponovo."</string>
     <string name="fingerprint_error_canceled" msgid="5541771463159727513">"Radnja sa otiskom prsta je otkazana"</string>
     <string name="fingerprint_error_user_canceled" msgid="2017941773466506863">"Korisnik je otkazao radnju sa otiskom prsta"</string>
-    <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Previše pokušaja. Koristite zaključavanje ekrana umesto toga."</string>
-    <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Previše pokušaja. Koristite zaključavanje ekrana umesto toga."</string>
+    <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Previše pokušaja. Koristite otključavanje ekrana umesto toga."</string>
+    <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Previše pokušaja. Koristite otključavanje ekrana umesto toga."</string>
     <string name="fingerprint_error_unable_to_process" msgid="2446280592818621224">"Obrađivanje otiska prsta nije uspelo. Probajte ponovo."</string>
     <string name="fingerprint_error_no_fingerprints" msgid="3144806556204061862">"Nije registrovan nijedan otisak prsta"</string>
     <string name="fingerprint_error_hw_not_present" msgid="5898827259419366359">"Ovaj uređaj nema senzor za otisak prsta"</string>
@@ -682,9 +682,9 @@
     <string name="fingerprint_error_power_pressed" msgid="5479524500542129414">"Pritisnuto je dugme za uključivanje"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Koristite otisak prsta"</string>
-    <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Koristite otisak prsta ili zaključavanje ekrana"</string>
+    <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Koristite otisak prsta ili otključavanje ekrana"</string>
     <string name="fingerprint_dialog_default_subtitle" msgid="3879832845486835905">"Nastavite pomoću otiska prsta"</string>
-    <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Koristite otisak prsta ili zaključavanje ekrana da biste nastavili"</string>
+    <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Koristite otisak prsta ili otključavanje ekrana da biste nastavili"</string>
   <string-array name="fingerprint_error_vendor">
   </string-array>
     <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Došlo je do problema. Probajte ponovo."</string>
@@ -736,16 +736,16 @@
     <string name="face_error_user_canceled" msgid="5766472033202928373">"Korisnik je otkazao otključavanje licem"</string>
     <string name="face_error_lockout" msgid="7864408714994529437">"Previše pokušaja. Probajte ponovo kasnije."</string>
     <string name="face_error_lockout_permanent" msgid="8533257333130473422">"Previše pokušaja. Otključavanje licem nije dostupno."</string>
-    <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Previše pokušaja. Koristite zaključavanje ekrana za to."</string>
+    <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Previše pokušaja. Koristite otključavanje ekrana za to."</string>
     <string name="face_error_unable_to_process" msgid="5723292697366130070">"Provera lica nije uspela. Probajte ponovo."</string>
     <string name="face_error_not_enrolled" msgid="1134739108536328412">"Niste podesili otključavanje licem"</string>
     <string name="face_error_hw_not_present" msgid="7940978724978763011">"Otključavanje licem nije podržano na ovom uređaju"</string>
     <string name="face_error_security_update_required" msgid="5076017208528750161">"Senzor je privremeno onemogućen."</string>
     <string name="face_name_template" msgid="3877037340223318119">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string>
     <string name="face_app_setting_name" msgid="5854024256907828015">"Koristite otključavanje licem"</string>
-    <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Koristite zaključavanje licem ili zaključavanje ekrana"</string>
+    <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Koristite zaključavanje licem ili otključavanje ekrana"</string>
     <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Potvrdite identitet licem da biste nastavili"</string>
-    <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Koristite lice ili zaključavanje ekrana da biste nastavili"</string>
+    <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Koristite lice ili otključavanje ekrana da biste nastavili"</string>
   <string-array name="face_error_vendor">
   </string-array>
     <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Došlo je do problema. Probajte ponovo."</string>
@@ -827,7 +827,7 @@
     <string name="permlab_writeVerificationStateE2eeContactKeys" msgid="3990742344778360457">"Ažuriranje statusa verifikacije ključeva za šifrovanje kontakata s kraja na kraj u vlasništvu drugih aplikacija"</string>
     <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Dozvoljava aplikaciji da ažurira statuse verifikacije ključeva za šifrovanje kontakata s kraja na kraj (E2EE) u vlasništvu drugih aplikacija"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Podešavanje pravila za lozinku"</string>
-    <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontroliše dužinu i znakove dozvoljene u lozinkama i PIN-ovima za zaključavanje ekrana."</string>
+    <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontroliše dužinu i znakove dozvoljene u lozinkama i PIN-ovima za otključavanje ekrana."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Nadzor pokušaja otključavanja ekrana"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Prati broj netačno unetih lozinki prilikom otključavanja ekrana i zaključava tablet ili briše podatke sa tableta ako je netačna lozinka uneta previše puta."</string>
     <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Nadgleda broj netačnih lozinki unetih pri otključavanju ekrana i zaključava Android TV uređaj ili briše sve podatke sa Android TV uređaja ako se unese previše netačnih lozinki."</string>
@@ -838,7 +838,7 @@
     <string name="policydesc_watchLogin_secondaryUser" product="automotive" msgid="7180857406058327941">"Nadgleda broj netačnih lozinki unetih pri otključavanju ekrana i zaključava sistem za info-zabavu ili briše sve podatke ovog profila ako se unese previše netačnih lozinki."</string>
     <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"Nadgleda broj netačnih lozinki unetih pri otključavanju ekrana i zaključava telefon ili briše sve podatke ovog korisnika ako se unese previše netačnih lozinki."</string>
     <string name="policylab_resetPassword" msgid="214556238645096520">"Promena zaključavanja ekrana"</string>
-    <string name="policydesc_resetPassword" msgid="4626419138439341851">"Menja zaključavanje ekrana."</string>
+    <string name="policydesc_resetPassword" msgid="4626419138439341851">"Menja otključavanje ekrana."</string>
     <string name="policylab_forceLock" msgid="7360335502968476434">"Zaključavanje ekrana"</string>
     <string name="policydesc_forceLock" msgid="1008844760853899693">"Kontrola načina i vremena zaključavanja ekrana."</string>
     <string name="policylab_wipeData" msgid="1359485247727537311">"Brisanje svih podataka"</string>
@@ -855,7 +855,7 @@
     <string name="policylab_setGlobalProxy" msgid="215332221188670221">"Podesite globalni proksi server uređaja"</string>
     <string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"Podešava globalni proksi uređaja koji će se koristiti dok su smernice omogućene. Samo vlasnik uređaja može da podesi globalni proksi."</string>
     <string name="policylab_expirePassword" msgid="6015404400532459169">"Podesi istek. lozin. za zaklj. ekr."</string>
-    <string name="policydesc_expirePassword" msgid="9136524319325960675">"Menja koliko često lozinka, PIN ili šablon za zaključavanje ekrana mora da se menja."</string>
+    <string name="policydesc_expirePassword" msgid="9136524319325960675">"Menja koliko često lozinka, PIN ili šablon za otključavanje ekrana mora da se menja."</string>
     <string name="policylab_encryptedStorage" msgid="9012936958126670110">"Podešavanje šifrovanja skladišta"</string>
     <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"Zahteva da sačuvani podaci aplikacije budu šifrovani."</string>
     <string name="policylab_disableCamera" msgid="5749486347810162018">"Onemogućavanje kamera"</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Metod unosa"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Radnje u vezi sa tekstom"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Pisanje rukom nije podržano u ovom polju"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Pisanje rukom nije podržano u poljima za lozinke"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Nazad"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Promenite metod unosa"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Memorijski prostor je na izmaku"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Upravlja: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Uključeno"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Isključeno"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Bilo koji kalendar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> isključuje neke zvuke"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Došlo je do internog problema u vezi sa uređajem i možda će biti nestabilan dok ne obavite resetovanje na fabrička podešavanja."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Došlo je do internog problema u vezi sa uređajem. Potražite detalje od proizvođača."</string>
@@ -1987,9 +1992,9 @@
     <string name="work_mode_off_title" msgid="6367463960165135829">"Uključiti poslovne aplikacije?"</string>
     <string name="work_mode_turn_on" msgid="5316648862401307800">"Ponovo aktiviraj"</string>
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Hitan slučaj"</string>
-    <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Podesite zaključavanje ekrana"</string>
-    <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Podesi zaključavanje ekrana"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Da biste koristili privatni prostor, podesite zaključavanje ekrana na ovom uređaju"</string>
+    <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Podesite otključavanje ekrana"</string>
+    <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Podesi otključavanje ekrana"</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Da biste koristili privatni prostor, podesite otključavanje ekrana na ovom uređaju"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Aplikacija nije dostupna"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutno nije dostupna."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> – nije dostupno"</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Zajedničko"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automatski povezano sa satelitom"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Možete da šaljete i primate poruke bez mobilne ili WiFi mreže"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvori Messages"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 2f517a5..c0d930f 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -86,7 +86,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Сетка мабільнай сувязі недаступная"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Націсніце, каб выбраць іншую сетку."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Экстранныя выклікі недаступныя"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Экстранныя выклікі ў сетцы Wi‑Fi недаступныя"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Для экстранных выклікаў патрабуецца мабільная сетка"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Абвесткі"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Пераадрасацыя выкліку"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Рэжым экстранных зваротных выклікаў"</string>
@@ -1185,6 +1185,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Выдалiць"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Метад уводу"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Дзеянні з тэкстам"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Гэта поле не падтрымлівае рукапісны ўвод"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Палі для ўказання пароля не падтрымліваюць рукапісны ўвод"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Пераключэнне рэжыму ўводу"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Месца для захавання на зыходзе"</string>
@@ -1929,6 +1931,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Пад кіраваннем праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Уключана"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Выключана"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>-<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Любы каляндар"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> выключае некаторыя гукі"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"На вашай прыладзе ўзнікла ўнутраная праблема, і яна можа працаваць нестабільна, пакуль вы не зробіце скід да заводскіх налад."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"На вашай прыладзе ўзнікла ўнутраная праблема. Для атрымання дадатковай інфармацыі звярніцеся да вытворцы."</string>
@@ -2391,6 +2396,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Тэставы"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Супольны"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Аўтаматычна падключана да сістэм спадарожнікавай сувязі"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Вы можаце адпраўляць і атрымліваць паведамленні без доступу да мабільнай сеткі або Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Адкрыць Паведамленні"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 1b486fb..5c793e5 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Не може да се установи връзка с мобилната мрежа"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Изберете друга предпочитана мрежа. Докоснете за промяна."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Няма достъп до спешните обаждания"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Не може да се извършват спешни обаждания през Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"За спешните обаждания се изисква мобилна мрежа"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Сигнали"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Пренасочване на обаждания"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Режим на обратно обаждане при спешност"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Изтриване"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Метод на въвеждане"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Действия с текста"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"В това поле не се поддържа ръкописно въвеждане"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"В полета за парола не се поддържа ръкописно въвеждане"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Превключване на метода на въвеждане"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Мястото в хранилището е на изчерпване"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Управлява се от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Вкл."</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Изкл."</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Всички календари"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> заглушава някои звуци"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Възникна вътрешен проблем с устройството ви. То може да е нестабилно, докато не възстановите фабричните настройки."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Възникна вътрешен проблем с устройството ви. За подробности се свържете с производителя."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Тестване"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Общи"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Автоматично установена връзка със сателит"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Можете да изпращате и получавате съобщения без мобилна или Wi-Fi мрежа"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Отваряне на Messages"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index b9fde04..8946607 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"মোবাইল নেটওয়ার্কে কানেক্ট করা যাচ্ছে না"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"পছন্দের নেটওয়ার্ক পরিবর্তন করে দেখুন। অন্য নেটওয়ার্ক বেছে নিতে ট্যাপ করুন।"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"জরুরি কল করা যাবে না"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"ওয়াই-ফাইয়ের মাধ্যমে জরুরি কল করা যাবে না"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"জরুরি কলের জন্য মোবাইল নেটওয়ার্ক থাকতে হবে"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"সতর্কতা"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"কল ফরওয়ার্ড করা"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"জরুরি কলব্যাক মোড"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"মুছুন"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ইনপুট পদ্ধতি"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"পাঠ্য ক্রিয়াগুলি"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"এই ফিল্ডে হাতের লেখা কাজ করে না"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"পাসওয়ার্ডের ফিল্ডে হাতের লেখা কাজ করে না"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ফিরে যান"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ইনপুট পদ্ধতি পাল্টান"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"স্টোরেজ পূর্ণ হতে চলেছে"</string>
@@ -1718,7 +1720,7 @@
     <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"উভয় ভলিউম কী কয়েক সেকেন্ড ধরে থাকলে <xliff:g id="SERVICE">%1$s</xliff:g> চালু হয়ে যাবে। এটি একটি অ্যাক্সেসিবিলিটি ফিচার। এর ফলে, আপনার ডিভাইস কীভাবে কাজ করবে সেটিতে পরিবর্তন হতে পারে।\n\nসেটিংস &gt; অ্যাক্সেসিবিলিটি থেকে আপনি এই শর্টকাট পরিবর্তন করতে পারবেন।"</string>
     <string name="accessibility_shortcut_on" msgid="5463618449556111344">"চালু করুন"</string>
     <string name="accessibility_shortcut_off" msgid="3651336255403648739">"চালু করবেন না"</string>
-    <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"চালু"</string>
+    <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>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ম্যানেজ করে"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"চালু আছে"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"বন্ধ আছে"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"যেকোনও ক্যালেন্ডার"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> কিছু সাউন্ডকে মিউট করে দিচ্ছে"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"আপনার ডিভাইসে একটি অভ্যন্তরীন সমস্যা হয়েছে, এবং আপনি যতক্ষণ না পর্যন্ত এটিকে ফ্যাক্টরি ডেটা রিসেট করছেন ততক্ষণ এটি ঠিকভাবে কাজ নাও করতে পারে৷"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"আপনার ডিভাইসে একটি অভ্যন্তরীন সমস্যা হয়েছে৷ বিস্তারিত জানার জন্য প্রস্তুতকারকের সাথে যোগাযোগ করুন৷"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"পরীক্ষা"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"কমিউনাল"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"স্যাটেলাইটের সাথে অটোমেটিক কানেক্ট করা হয়েছে"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"আপনি কোনও মেবাইল বা ওয়াই-ফাই নেটওয়ার্ক ছাড়াই মেসেজ পাঠাতে ও পেতে পারবেন"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages খুলুন"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 2414b7e..2d08a22 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Nije moguće dosegnuti mobilnu mrežu"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Pokušajte promijeniti preferiranu mrežu. Dodirnite za promjenu."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Hitni pozivi su nedostupni"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Nije moguće uspostaviti hitne pozive putem Wi‑Fi mreže"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Za hitne pozive potrebna je mreža"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Upozorenja"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Prosljeđivanje poziva"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Način rada za hitni povratni poziv"</string>
@@ -828,7 +828,7 @@
     <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Dozvoljava aplikaciji da ažurira stanja potvrđivanja E2EE kontaktnih ključeva u vlasništvu drugih aplikacija"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Postavljanje pravila za lozinke"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolira dužinu i znakove koji su dozvoljeni u lozinkama za zaključavanje ekrana i PIN-ovima."</string>
-    <string name="policylab_watchLogin" msgid="7599669460083719504">"Prati pokušaje otključavanja ekrana"</string>
+    <string name="policylab_watchLogin" msgid="7599669460083719504">"Praćenje pokušaja otključavanja ekrana"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Prati broj pogrešno unijetih lozinki prilikom otključavanja ekrana i zaključava tablet ili briše sve podatke s njega ukoliko se previše puta unese pogrešna lozinka."</string>
     <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Praćenje broja unosa netačnih lozinki pri otključavanju ekrana i zaključavanje Android TV uređaja ili brisanje svih podataka Android TV uređaja u slučaju prevelikog broja unosa netačnih lozinki."</string>
     <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Prati koliko puta je lozinka neispravno unijeta prilikom otključavanja ekrana i zaključava informativno-zabavni sistem ili briše sve podatke informativno-zabavnog sistema ako se lozinka neispravno unese previše puta."</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Način unosa"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Akcije za tekst"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Rukopis nije podržan u ovom polju"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Rukopis nije podržan u poljima za lozinku"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Nazad"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Promjena načina unosa"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ponestaje prostora za pohranu"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Upravlja <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Uključeno"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Isključeno"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Bilo koji kalendar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> isključuje neke zvukove"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Postoji problem u vašem uređaju i može biti nestabilan dok ga ne vratite na fabričke postavke."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Postoji problem u vašem uređaju. Za više informacija obratite se proizvođaču."</string>
@@ -1989,7 +1994,7 @@
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Hitan slučaj"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Postavite zaključavanje ekrana"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Postavite zaključavanje ekrana"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Za upotrebu privatn. prostora postavite zaklj. ekr. na uređ."</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Za upotrebu privatnog prostora postavite zaključavanje ekrana na uređaju"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Aplikacija nije dostupna"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutno nije dostupna."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"Nedostupno: <xliff:g id="ACTIVITY">%1$s</xliff:g>"</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Testno"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Opće"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automatski je povezano sa satelitom"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Možete slati i primati poruke bez mobilne ili WiFi mreže"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvorite Messages"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 8e733ec..263d129 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"No es pot accedir a la xarxa mòbil"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Prova de canviar de xarxa preferent. Toca per canviar-la."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Les trucades d\'emergència no estan disponibles"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"No es poden fer trucades d\'emergència per Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Per poder fer trucades d\'emergència, cal tenir connexió a una xarxa mòbil"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertes"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Desviació de trucades"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mode de devolució de trucada d\'emergència"</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Suprimeix"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Mètode d\'introducció de text"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Accions de text"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"L\'escriptura a mà no s\'admet en aquest camp"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"L\'escriptura a mà no s\'admet als camps de contrasenya"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Enrere"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Canvia el mètode d\'introducció de text"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"L\'espai d\'emmagatzematge s\'està esgotant"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gestionat per <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activat"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desactivat"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>-<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Qualsevol calendari"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> està silenciant alguns sons"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"S\'ha produït un error intern al dispositiu i és possible que funcioni de manera inestable fins que restableixis les dades de fàbrica."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"S\'ha produït un error intern al dispositiu. Contacta amb el fabricant del dispositiu per obtenir més informació."</string>
@@ -1989,7 +1994,7 @@
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Emergència"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Defineix un bloqueig de pantalla"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Defineix un bloqueig de pantalla"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Per utilitzar l\'espai privat, defineix un bloq. de pantalla"</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Per utilitzar l\'espai privat, defineix un bloqueig de pantalla en aquest dispositiu"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"L\'aplicació no està disponible"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"Ara mateix, <xliff:g id="APP_NAME">%1$s</xliff:g> no està disponible."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> no està disponible"</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Prova"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Compartit"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"S\'ha connectat automàticament a un satèl·lit"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Pots enviar i rebre missatges sense una xarxa mòbil o Wi‑Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Obre Missatges"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index dee6bbb..a8ad543 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -86,7 +86,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobilní síť není dostupná"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Zkuste změnit preferovanou síť. Změníte ji klepnutím."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Tísňová volání jsou nedostupná"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Přes Wi‑Fi nelze uskutečňovat tísňová volání"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Tísňová volání vyžadují mobilní síť"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Upozornění"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Přesměrování hovorů"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Režim tísňového zpětného volání"</string>
@@ -1185,6 +1185,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Smazat"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Metoda zadávání dat"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Operace s textem"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"V tomto poli není psaní rukou podporováno"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"V polích pro hesla není psaní rukou podporováno"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Zpět"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Přepnout metodu zadávání"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"V úložišti je málo místa"</string>
@@ -1929,6 +1931,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Spravováno aplikací <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Zapnuto"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Vypnuto"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"V libovolném kalendáři"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> vypíná určité zvuky"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"V zařízení došlo k internímu problému. Dokud neprovedete obnovení továrních dat, může být nestabilní."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"V zařízení došlo k internímu problému. Další informace vám sdělí výrobce."</string>
@@ -1973,7 +1978,7 @@
     <string name="supervised_user_creation_label" msgid="6884904353827427515">"Přidat dozorovaného uživatele"</string>
     <string name="language_selection_title" msgid="52674936078683285">"Přidat jazyk"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"Preferovaná oblast"</string>
-    <string name="search_language_hint" msgid="7004225294308793583">"Zadejte název jazyka"</string>
+    <string name="search_language_hint" msgid="7004225294308793583">"Zadejte jazyk"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"Navrhované"</string>
     <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"Navrženo"</string>
     <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"Navrhované jazyky"</string>
@@ -1988,7 +1993,7 @@
     <string name="work_mode_off_title" msgid="6367463960165135829">"Zrušit pozastavení pracovních aplikací?"</string>
     <string name="work_mode_turn_on" msgid="5316648862401307800">"Zrušit pozastavení"</string>
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Stav nouze"</string>
-    <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Nastavení zámku obrazovky"</string>
+    <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Nastavte si zámek obrazovky"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Nastavit zámek obrazovky"</string>
     <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Pokud chcete používat soukromý prostor, nastavte na tomto zařízení zámek obrazovky"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Aplikace není k dispozici"</string>
@@ -2391,6 +2396,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Komunální"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automaticky připojeno k satelitu"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Zprávy můžete odesílat a přijímat bez mobilní sítě nebo sítě Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otevřít Zprávy"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index bde7dbd..59be3dd 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Der er ingen forbindelse til mobilnetværket"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Prøv at skifte dit foretrukne netværk. Tryk for skifte."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Det er ikke muligt at foretage nødopkald"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Det er ikke muligt at foretage nødopkald via Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Nødopkald kræver adgang til et mobilnetværk"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Underretninger"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Viderestilling af opkald"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Nødtilbagekaldstilstand"</string>
@@ -827,7 +827,7 @@
     <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Giver appen tilladelse til at opdatere tilstandene for verificering E2EE-kontaktnøgler, som ejes af andre apps"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Angiv regler for adgangskoder"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Tjek længden samt tilladte tegn i adgangskoder og pinkoder til skærmlåsen."</string>
-    <string name="policylab_watchLogin" msgid="7599669460083719504">"Overvåg forsøg på oplåsning af skærm"</string>
+    <string name="policylab_watchLogin" msgid="7599669460083719504">"Overvåge forsøg på oplåsning af skærm"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Overvåg antallet af forkert indtastede adgangskoder, når du låser skærmen op, og lås din tablet, eller slet alle data i den, hvis der er indtastet for mange forkerte adgangskoder."</string>
     <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Registrer antallet af forkerte adgangskoder, der angives ved oplåsning af skærmen, og lås din Android TV-enhed, eller ryd alle dataene på din Android TV-enhed, hvis adgangskoden angives forkert for mange gange."</string>
     <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Registrer antallet af forkert indtastede adgangskoder, når du låser skærmen op, og lås infotainmentsystemet, eller slet alle data i infotainmentsystemet, hvis der er indtastet for mange forkerte adgangskoder."</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Slet"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Inputmetode"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Teksthandlinger"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Håndskrift understøttes ikke for dette felt"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Håndskrift understøttes ikke for adgangskodefelter"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Tilbage"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Skift indtastningsmetode"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Der er snart ikke mere lagerplads"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Administreres af <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Til"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Fra"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>-<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Alle kalendere"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> slår nogle lyde fra"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Der er et internt problem med enheden, og den vil muligvis være ustabil, indtil du gendanner fabriksdataene."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Der er et internt problem med enheden. Kontakt producenten for at få yderligere oplysninger."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Fælles"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Der blev automatisk oprettet forbindelse til satellit"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kan sende og modtage beskeder uden et mobil- eller Wi-Fi-netværk"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Åbn Beskeder"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 27d3848..b4882fe 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobilfunknetz nicht erreichbar"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Versuche, das bevorzugte Netzwerk zu ändern. Tippe, um ein anderes auszuwählen."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Notrufe nicht möglich"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Notrufe über WLAN nicht möglich"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Für Notrufe ist ein Mobilfunknetz erforderlich"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Warnmeldungen"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Anrufweiterleitung"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Notfallrückrufmodus"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Löschen"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Eingabemethode"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Textaktionen"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handschrift wird in diesem Feld nicht unterstützt"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handschrift wird in Passwortfeldern nicht unterstützt"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Zurück"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Eingabemethode wechseln"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Der Speicherplatz wird knapp"</string>
@@ -1927,6 +1929,12 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Verwaltet von <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"An"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Aus"</string>
+    <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+    <skip />
+    <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+    <skip />
+    <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+    <skip />
     <string name="muted_by" msgid="91464083490094950">"Einige Töne werden von <xliff:g id="THIRD_PARTY">%1$s</xliff:g> stummgeschaltet"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Es liegt ein internes Problem mit deinem Gerät vor. Möglicherweise verhält es sich instabil, bis du es auf die Werkseinstellungen zurücksetzt."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Es liegt ein internes Problem mit deinem Gerät vor. Bitte wende dich diesbezüglich an den Hersteller."</string>
@@ -2131,7 +2139,7 @@
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Ausschalten"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Weitere Informationen"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Die adaptiven Benachrichtigungen wurden in Android 12 durch die Funktion „Erweiterte Benachrichtigungen“ ersetzt. Diese Funktion zeigt Vorschläge für Aktionen und Antworten an und sortiert Benachrichtigungen.\n\nDie Funktion hat Zugriff auf alle Benachrichtigungen, darunter auch personenbezogene Daten wie Kontaktnamen und Nachrichten. Außerdem kann sie auf Benachrichtigungen antworten oder diese schließen und so beispielsweise Anrufe entgegennehmen oder „Bitte nicht stören“ steuern."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Die adaptiven Benachrichtigungen wurden in Android 12 durch die Funktion „Erweiterte Benachrichtigungen“ ersetzt. Diese Funktion zeigt Vorschläge für Aktionen und Antworten an und sortiert Benachrichtigungen.\n\nDie Funktion hat Zugriff auf alle Benachrichtigungen, darunter auch personenbezogene Daten wie Namen von Kontakten und Nachrichten. Außerdem kann sie auf Benachrichtigungen antworten oder diese schließen und so unter anderem Anrufe entgegennehmen oder „Bitte nicht stören“ steuern."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Infomitteilung zum Ablaufmodus"</string>
     <string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Energiesparmodus aktiviert"</string>
     <string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Reduzierung der Akkunutzung, um die Akkulaufzeit zu verlängern"</string>
@@ -2389,6 +2397,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Gemeinsam genutzt"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automatisch mit Satellit verbunden"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kannst Nachrichten ohne Mobilfunknetz oder WLAN senden und empfangen"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages öffnen"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 1f9c09f..1b88a6a 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Δεν είναι δυνατή η σύνδεση στο δίκτυο κινητής τηλεφωνίας"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Δοκιμάστε να αλλάξετε το προτιμώμενο δίκτυο. Πατήστε για αλλαγή."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Οι κλήσεις έκτακτης ανάγκης δεν είναι διαθέσιμες"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Δεν είναι δυνατή η πραγματοποίηση κλήσεων έκτακτης ανάγκης μέσω Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Για τις κλήσεις έκτακτης ανάγκης απαιτείται δίκτυο κινητής τηλεφωνίας"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Ειδοποιήσεις"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Προώθηση κλήσης"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Λειτουργία επιστροφής κλήσης έκτακτης ανάγκης"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Διαγραφή"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Μέθοδος εισόδου"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Ενέργειες κειμένου"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Η γραφή δεν υποστηρίζεται σε αυτό το πεδίο"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Η γραφή δεν υποστηρίζεται στα πεδία κωδικού πρόσβασης"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Πίσω"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Εναλλαγή μεθόδου εισαγωγής"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ο αποθηκευτικός χώρος εξαντλείται"</string>
@@ -1756,7 +1758,7 @@
     <string name="user_switched" msgid="7249833311585228097">"Τρέχων χρήστης <xliff:g id="NAME">%1$s</xliff:g>."</string>
     <string name="user_switching_message" msgid="1912993630661332336">"Εναλλαγή σε <xliff:g id="NAME">%1$s</xliff:g>…"</string>
     <string name="user_logging_out_message" msgid="7216437629179710359">"Αποσύνδεση <xliff:g id="NAME">%1$s</xliff:g>…"</string>
-    <string name="owner_name" msgid="8713560351570795743">"Κάτοχο"</string>
+    <string name="owner_name" msgid="8713560351570795743">"Κάτοχος"</string>
     <string name="guest_name" msgid="8502103277839834324">"Επισκέπτης"</string>
     <string name="error_message_title" msgid="4082495589294631966">"Σφάλμα"</string>
     <string name="error_message_change_not_allowed" msgid="843159705042381454">"Αυτή η αλλαγή δεν επιτρέπεται από το διαχειριστή σας"</string>
@@ -1900,7 +1902,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"Η Εξοικονόμηση μπαταρίας ενεργοποιεί το Σκούρο θέμα και περιορίζει ή απενεργοποιεί τη δραστηριότητα στο παρασκήνιο, ορισμένα οπτικά εφέ, συγκεκριμένες λειτουργίες και κάποιες συνδέσεις δικτύου."</string>
     <string name="battery_saver_description" msgid="8518809702138617167">"Η Εξοικονόμηση μπαταρίας ενεργοποιεί το Σκούρο θέμα και περιορίζει ή απενεργοποιεί τη δραστηριότητα στο παρασκήνιο, ορισμένα οπτικά εφέ, συγκεκριμένες λειτουργίες και ορισμένες συνδέσεις δικτύου."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Προκειμένου να μειωθεί η χρήση δεδομένων, η Εξοικονόμηση δεδομένων αποτρέπει την αποστολή ή λήψη δεδομένων από ορισμένες εφαρμογές στο παρασκήνιο. Μια εφαρμογή που χρησιμοποιείτε αυτήν τη στιγμή μπορεί να χρησιμοποιήσει δεδομένα αλλά με μικρότερη συχνότητα. Για παράδειγμα, οι εικόνες μπορεί να μην εμφανίζονται μέχρι να τις πατήσετε."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Προκειμένου να μειωθεί η χρήση δεδομένων, η Εξοικονόμηση δεδομένων αποτρέπει την αποστολή ή λήψη δεδομένων από ορισμένες εφαρμογές στο παρασκήνιο. Μια εφαρμογή που χρησιμοποιείτε αυτή τη στιγμή μπορεί να χρησιμοποιήσει δεδομένα αλλά με μικρότερη συχνότητα. Για παράδειγμα, οι εικόνες μπορεί να μην εμφανίζονται μέχρι να τις πατήσετε."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Ενεργ. Εξοικονόμησης δεδομένων;"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Ενεργοποίηση"</string>
     <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Για ένα λεπτό (μέχρι τις {formattedTime})}other{Για # λεπτά (μέχρι τις {formattedTime})}}"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Διαχείριση από <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Ενεργός"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Ανενεργός"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Οποιοδήποτε ημερολόγιο"</string>
     <string name="muted_by" msgid="91464083490094950">"Το τρίτο μέρος <xliff:g id="THIRD_PARTY">%1$s</xliff:g> θέτει ορισμένους ήχους σε σίγαση"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Υπάρχει ένα εσωτερικό πρόβλημα με τη συσκευή σας και ενδέχεται να είναι ασταθής μέχρι την επαναφορά των εργοστασιακών ρυθμίσεων."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Υπάρχει ένα εσωτερικό πρόβλημα με τη συσκευή σας. Επικοινωνήστε με τον κατασκευαστή σας για λεπτομέρειες."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Δοκιμή"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Κοινόχρηστο"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Συνδέθηκε αυτόματα με δορυφόρο"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Μπορείτε να στέλνετε και να λαμβάνετε μηνύματα χωρίς δίκτυο κινητής τηλεφωνίας ή Wi-Fi."</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Άνοιγμα Messages"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 907026a..5a6c620 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Can’t reach mobile network"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Try changing preferred network. Tap to change."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Emergency calling unavailable"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Can’t make emergency calls over Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Emergency calls require a mobile network"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alerts"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Call forwarding"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Emergency callback mode"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Delete"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Input method"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Text actions"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handwriting is not supported in this field"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handwriting is not supported in password fields"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Back"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Switch input method"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Storage space running out"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Managed by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"On"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Off"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Any calendar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> is muting some sounds"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Communal"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Auto-connected to satellite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"You can send and receive messages without a mobile or Wi-Fi network"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Open Messages"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 4148ad74..86fe49c 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Can’t reach mobile network"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Try changing preferred network. Tap to change."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Emergency calling unavailable"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Can’t make emergency calls over Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Emergency calls require a mobile network"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alerts"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Call forwarding"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Emergency callback mode"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Delete"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Input method"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Text actions"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handwriting is not supported in this field"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handwriting is not supported in password fields"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Back"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Switch input method"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Storage space running out"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Managed by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"On"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Off"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Any calendar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> is muting some sounds"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
@@ -2389,6 +2394,7 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Communal"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"App content hidden from screen share for security"</string>
     <string name="satellite_notification_title" msgid="4026338973463121526">"Auto connected to satellite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"You can send and receive messages without a mobile or Wi-Fi network"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Open Messages"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index a3f50c5..4972e1b 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Can’t reach mobile network"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Try changing preferred network. Tap to change."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Emergency calling unavailable"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Can’t make emergency calls over Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Emergency calls require a mobile network"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alerts"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Call forwarding"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Emergency callback mode"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Delete"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Input method"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Text actions"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handwriting is not supported in this field"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handwriting is not supported in password fields"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Back"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Switch input method"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Storage space running out"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Managed by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"On"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Off"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Any calendar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> is muting some sounds"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Communal"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Auto-connected to satellite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"You can send and receive messages without a mobile or Wi-Fi network"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Open Messages"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 72d89fb..c35c2ff 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Can’t reach mobile network"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Try changing preferred network. Tap to change."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Emergency calling unavailable"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Can’t make emergency calls over Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Emergency calls require a mobile network"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alerts"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Call forwarding"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Emergency callback mode"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Delete"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Input method"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Text actions"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handwriting is not supported in this field"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handwriting is not supported in password fields"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Back"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Switch input method"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Storage space running out"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Managed by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"On"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Off"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Any calendar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> is muting some sounds"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Communal"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Auto-connected to satellite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"You can send and receive messages without a mobile or Wi-Fi network"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Open Messages"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index edba901..b7f49980 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎Can’t reach mobile network‎‏‎‎‏‎"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‎‎‎‏‎‎‏‏‏‎‎‏‎‎‏‎‎‏‏‎‎‎‏‎‏‏‎‎‎‏‏‏‏‏‎‎‎Try changing preferred network. Tap to change.‎‏‎‎‏‎"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‏‎‎‎‎‎‏‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎Emergency calling unavailable‎‏‎‎‏‎"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‎‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‏‎‎‏‎Can’t make emergency calls over Wi‑Fi‎‏‎‎‏‎"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‏‎‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‏‏‎‏‎‎‎Emergency calls require a mobile network‎‏‎‎‏‎"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‎‎‏‏‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎Alerts‎‏‎‎‏‎"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‎‏‎‏‏‎‎Call forwarding‎‏‎‎‏‎"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎Emergency callback mode‎‏‎‎‏‎"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‏‎‏‎‏‎‏‎‏‏‎‎‎‎‎‎‎Delete‎‏‎‎‏‎"</string>
     <string name="inputMethod" msgid="1784759500516314751">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‎‏‏‏‎‎‎‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‏‏‏‏‎Input method‎‏‎‎‏‎"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎Text actions‎‏‎‎‏‎"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‎‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‎‎‏‎‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‎‎‎‏‏‎‏‏‎‎‎‏‎‎Handwriting is not supported in this field‎‏‎‎‏‎"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‏‏‎Handwriting is not supported in password fields‎‏‎‎‏‎"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‎‏‎‏‏‎Back‎‏‎‎‏‎"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‎Switch input method‎‏‎‎‏‎"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‎‎‏‏‎‎‎‏‎‎‏‏‎‏‏‎‎Storage space running out‎‏‎‎‏‎"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‎Managed by ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎On‎‏‎‎‏‎"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‎‎‏‎‏‏‏‏‎‎‎‎‎‏‎‏‎‎‎‏‏‏‎‏‏‏‎‎‏‏‎‎‏‏‏‎‏‎‏‎‏‏‎‏‏‎‎Off‎‏‎‎‏‎"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‏‏‏‎‎, ‎‏‎‎‏‎ "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‏‏‎‎‎‏‎‎‏‎‏‏‏‎‏‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="START">%1$s</xliff:g>‎‏‎‎‏‏‏‎ - ‎‏‎‎‏‏‎<xliff:g id="END">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‏‎Any calendar‎‏‎‎‏‎"</string>
     <string name="muted_by" msgid="91464083490094950">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‏‎‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="THIRD_PARTY">%1$s</xliff:g>‎‏‎‎‏‏‏‎ is muting some sounds‎‏‎‎‏‎"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‏‎There\'s an internal problem with your device, and it may be unstable until you factory data reset.‎‏‎‎‏‎"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‎‏‎‎‎‏‎‏‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‎‏‏‎‏‏‎There\'s an internal problem with your device. Contact your manufacturer for details.‎‏‎‎‏‎"</string>
@@ -2389,6 +2394,7 @@
     <string name="profile_label_test" msgid="9168641926186071947">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‎‏‎‏‏‎Test‎‏‎‎‏‎"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‎‏‏‎Communal‎‏‎‎‏‎"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <string name="screen_not_shared_sensitive_content" msgid="7058419185079565001">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‎‏‏‎‏‏‎‏‎‎‎‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‏‏‎‎‏‎‎‏‎App content hidden from screen share for security‎‏‎‎‏‎"</string>
     <string name="satellite_notification_title" msgid="4026338973463121526">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‏‎‎Auto connected to satellite‎‏‎‎‏‎"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‎‏‏‎‎‎‎‏‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎You can send and receive messages without a mobile or Wi-Fi network‎‏‎‎‏‎"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‏‏‎‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‎Open Messages‎‏‎‎‏‎"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index c23ad31..4f7f7a7 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"No se puede acceder a la red móvil"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Presiona para cambiar la red preferida."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Servicio de llamadas de emergencia no disponible"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"No se pueden hacer llamadas de emergencia mediante Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Las llamadas de emergencia requieren una red móvil"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertas"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Desvío de llamada"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modo de devolución de llamada de emergencia"</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Eliminar"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Método de entrada"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Acciones de texto"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"La función Escritura a mano no es compatible en este campo"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"La función Escritura a mano no es compatible en los campos de contraseñas"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atrás"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Cambiar método de entrada"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Queda poco espacio de almacenamiento"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Administradas por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activado"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desactivado"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Cualquier calendario"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> silencia algunos sonidos"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Existe un problema interno con el dispositivo, de modo que el dispositivo puede estar inestable hasta que restablezcas la configuración de fábrica."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Existe un problema interno con el dispositivo. Comunícate con el fabricante para obtener más información."</string>
@@ -2132,7 +2137,7 @@
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Aceptar"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desactivar"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Más información"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Las notificaciones mejoradas reemplazaron a las notificaciones adaptables en Android 12. Esta función muestra respuestas y acciones sugeridas, y organiza tus notificaciones.\n\nLas notificaciones mejoradas pueden acceder a todo el contenido de notificaciones, lo que incluye información personal, como nombres de contactos y mensajes. También pueden descartar o responder notificaciones (como contestar llamadas) y controlar la función No interrumpir."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Las notificaciones mejoradas reemplazaron a las notificaciones adaptables en Android 12. Esta función muestra respuestas y acciones sugeridas, y organiza tus notificaciones.\n\nLas notificaciones mejoradas pueden acceder a todo el contenido de notificaciones, incluida información personal, como nombres de contactos y mensajes. También pueden descartar o responder notificaciones (como contestar llamadas) y controlar la función No interrumpir."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación de información del modo de Rutinas"</string>
     <string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Ahorro de batería activado"</string>
     <string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Reduciendo el uso de la batería para extender su duración"</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Probar"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Compartido"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Conexión automática a satélite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Puedes enviar y recibir mensajes incluso si no tienes conexión a una red móvil o Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir Mensajes"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index def340d3..bf9d526 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"No se puede establecer conexión con la red móvil"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Toca para cambiar la red preferida."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Servicio de llamadas de emergencia no disponible"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"No se pueden hacer llamadas de emergencia por Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Para hacer llamadas de emergencia, necesitas conectarte a una red móvil"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertas"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Desvío de llamadas"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modo de devolución de llamada de emergencia"</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Eliminar"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Método de introducción de texto"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Acciones de texto"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Escritura a mano no está disponible en este campo"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Escritura a mano no está disponible en campos de contraseña"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atrás"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Cambiar método de introducción de texto"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Queda poco espacio"</string>
@@ -1901,7 +1903,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"Aceptar"</string>
     <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"Ahorro de batería activa el tema oscuro y limita o desactiva la actividad en segundo plano, algunos efectos visuales, ciertas funciones y algunas conexiones de red."</string>
     <string name="battery_saver_description" msgid="8518809702138617167">"Ahorro de batería activa el tema oscuro y limita o desactiva la actividad en segundo plano, algunos efectos visuales, ciertas funciones y algunas conexiones de red."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Para reducir el uso de datos, Ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano. Si estás usando una aplicación, podrá acceder a datos, pero con menos frecuencia. Esto significa que es posible que, por ejemplo, algunas imágenes no se muestren hasta que las toques."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Para reducir el uso de datos, el ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano. Si estás usando una aplicación, podrá acceder a datos, pero con menos frecuencia. Esto significa que es posible que, por ejemplo, algunas imágenes no se muestren hasta que las toques."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"¿Activar Ahorro de datos?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string>
     <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Durante un minuto (hasta las {formattedTime})}many{Durante # minutos (hasta las {formattedTime})}other{Durante # minutos (hasta las {formattedTime})}}"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gestionado por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activado"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desactivado"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>-<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Cualquier calendario"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> silencia algunos sonidos"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Se ha producido un problema interno en el dispositivo y es posible que este no sea estable hasta que restablezcas el estado de fábrica."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Se ha producido un problema interno en el dispositivo. Ponte en contacto con el fabricante para obtener más información."</string>
@@ -1972,7 +1977,7 @@
     <string name="supervised_user_creation_label" msgid="6884904353827427515">"Añadir usuario supervisado"</string>
     <string name="language_selection_title" msgid="52674936078683285">"Añadir un idioma"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"Preferencia de región"</string>
-    <string name="search_language_hint" msgid="7004225294308793583">"Nombre de idioma"</string>
+    <string name="search_language_hint" msgid="7004225294308793583">"Escribe el idioma"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"Sugeridos"</string>
     <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"Sugerencias"</string>
     <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"Idiomas sugeridos"</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Prueba"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Común"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Conectado automáticamente al satélite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Puedes enviar y recibir mensajes sin una red móvil o Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abre Mensajes"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 90a98a5..cc82e47 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobiilsidevõrguga ei saa ühendust"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Proovige eelistatud võrku vahetada. Puudutage muutmiseks."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Hädaabikõned pole saadaval"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"WiFi kaudu ei saa hädaabikõnesid teha"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Hädaabikõnede jaoks on vajalik mobiilsidevõrk"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Teatised"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Kõnede suunamine"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Hädaolukorra tagasihelistusrežiim"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Kustuta"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Sisestusmeetod"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Tekstitoimingud"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Käsitsi kirjutamine ei ole sellel väljal toetatud"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Käsitsi kirjutamine ei ole parooliväljadel toetatud"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Tagasi"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Sisestusmeetodi vahetamine"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Talletusruum saab täis"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Haldab <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Sees"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Väljas"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Mis tahes kalender"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> vaigistab teatud helid"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Seadmes ilmnes sisemine probleem ja seade võib olla ebastabiilne seni, kuni lähtestate seadme tehase andmetele."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Seadmes ilmnes sisemine probleem. Üksikasjaliku teabe saamiseks võtke ühendust tootjaga."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Jagatud"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Satelliidiga loodi automaatselt ühendus"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Teil on võimalik sõnumeid saata ja vastu võtta ilma mobiilside- ja WiFi-võrguta"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ava rakendus Messages"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 45d9e25..34c0663 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Ezin da konektatu sare mugikorrera"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Aldatu sare hobetsia. Sakatu aldatzeko."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Ezin da egin larrialdi-deirik"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Ezin duzu egin larrialdi-deirik Wi-Fi bidez"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Sare mugikorrera konektatuta egon behar duzu larrialdi-deiak egin ahal izateko"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertak"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Dei-desbideratzea"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Larrialdi-zerbitzuen deiak jasotzeko modua"</string>
@@ -278,7 +278,7 @@
     <string name="global_action_settings" msgid="4671878836947494217">"Ezarpenak"</string>
     <string name="global_action_assist" msgid="2517047220311505805">"Lagundu"</string>
     <string name="global_action_voice_assist" msgid="6655788068555086695">"Ahots-laguntza"</string>
-    <string name="global_action_lockdown" msgid="2475471405907902963">"Blokeoa"</string>
+    <string name="global_action_lockdown" msgid="2475471405907902963">"Blokeatu"</string>
     <string name="status_bar_notification_info_overflow" msgid="3330152558746563475">"999+"</string>
     <string name="notification_hidden_text" msgid="2835519769868187223">"Jakinarazpen berria"</string>
     <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"Teklatu fisikoa"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Ezabatu"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Idazketa-metodoa"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Testu-ekintzak"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Eremu honetan ez da onartzen eskuzko idazketa"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Pasahitzen eremuetan ez da onartzen eskuzko idazketa"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atzera"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Aldatu idazketa-metodoa"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Memoria betetzen ari da"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Kudeatzailea: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aktibatuta"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desaktibatuta"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>-<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Edozein egutegi"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> soinu batzuk isilarazten ari da"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Barneko arazo bat dago zure gailuan eta agian ezegonkor egongo da jatorrizko datuak berrezartzen dituzun arte."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Barneko arazo bat dago zure gailuan. Xehetasunak jakiteko, jarri fabrikatzailearekin harremanetan."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Probakoa"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Partekatua"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automatikoki konektatu da satelitera"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Mezuak bidal eta jaso ditzakezu sare mugikorrik edo wifi-sarerik gabe"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ireki Mezuak"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index c1a1b82..4f2484e 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"شبکه تلفن همراه دردسترس نیست"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"تغییر شبکه ترجیحی را امتحان کنید. برای تغییر، ضربه بزنید."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"تماس اضطراری امکان‌پذیر نیست"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"‏تماس اضطراری ازطریق Wi‑Fi امکان‌پذیر نیست"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"برای برقراری تماس اضطراری به شبکه تلفن همراه نیاز دارید"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"هشدارها"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"بازارسال تماس"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"حالت پاسخ تماس اضطراری"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"حذف"</string>
     <string name="inputMethod" msgid="1784759500516314751">"روش ورودی"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"کنش‌های متنی"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"در این فیلد از دست‌نویسی پشتیبانی نمی‌شود"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"در فیلدهای گذرواژه از دست‌نویسی پشتیبانی نمی‌شود"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"برگشت"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"تغییر روش ورودی"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"فضای ذخیره‌سازی درحال پر شدن است"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"تحت‌مدیریت <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"روشن"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"خاموش"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">"، "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"هر تقویمی"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> درحال قطع کردن بعضی از صداهاست"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"دستگاهتان یک مشکل داخلی دارد، و ممکن است تا زمانی که بازنشانی داده‌های کارخانه انجام نگیرد، بی‌ثبات بماند."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"دستگاهتان یک مشکل داخلی دارد. برای جزئیات آن با سازنده‌تان تماس بگیرید."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"آزمایش"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"عمومی"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"به‌طور خودکار به ماهواره متصل شد"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"‏می‌توانید بدون شبکه تلفن همراه یا Wi-Fi پیام ارسال و دریافت کنید"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"باز کردن «پیام‌ها»"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 88ede78..81b9848 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobiiliverkkoon ei saada yhteyttä"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Kokeile vaihtaa ensisijaista verkkoa. Vaihda se napauttamalla."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Hätäpuhelut eivät ole käytettävissä"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Hätäpuhelujen soittaminen Wi-Fi-yhteyden kautta ei onnistu."</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Hätäpuhelu edellyttää mobiiliverkkoa"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Ilmoitukset"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Soitonsiirto"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Hätäpuhelujen takaisinsoittotila"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Poista"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Syöttötapa"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Tekstitoiminnot"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Käsinkirjoitusta ei tueta tässä kentässä"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Käsinkirjoitusta ei tueta salasanakentissä"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Takaisin"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Vaihda syöttötapaa"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Tallennustila loppumassa"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Ylläpitäjä: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Päällä"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Pois päältä"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Kaikki kalenterit"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> mykistää joitakin ääniä"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Laitteellasi on sisäinen ongelma, joka aiheuttaa epävakautta. Voit korjata tilanteen palauttamalla tehdasasetukset."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Laitteesi yhdistäminen ei onnistu sisäisen virheen takia. Saat lisätietoja valmistajalta."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Testi"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Jaettu"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Yhdistetty automaattisesti satelliittiin"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Voit lähettää ja vastaanottaa viestejä ilman mobiili‑ tai Wi-Fi-verkkoa"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Avaa Messages"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 12176c8..15d36f5 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Impossible de joindre le réseau cellulaire"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Essayez de changer de réseau préféré. Touchez l\'écran pour changer."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Le service d\'appel d\'urgence n\'est pas accessible"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Impossible d\'effectuer des appels d\'urgence par Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Les appels d\'urgence nécessitent un réseau cellulaire"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertes"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Transfert d\'appel"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mode de rappel d\'urgence"</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Supprimer"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Mode de saisie"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Actions sur le texte"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Ce champ ne prend pas en charge l\'écriture manuscrite"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Les champs de mot de passe ne prennent pas en charge l\'écriture manuscrite"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Retour"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Changer de méthode d\'entrée"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Espace de stockage bientôt saturé"</string>
@@ -1928,6 +1930,12 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Géré par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activé"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Désactivé"</string>
+    <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+    <skip />
+    <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+    <skip />
+    <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+    <skip />
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> désactive certains sons"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Un problème interne est survenu avec votre appareil. Il se peut qu\'il soit instable jusqu\'à ce que vous le réinitialisiez à ses paramètres par défaut."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Un problème interne est survenu avec votre appareil. Communiquez avec le fabricant pour obtenir plus de détails."</string>
@@ -2390,6 +2398,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Commun"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Connecté au satellite automatiquement"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Vous pouvez envoyer et recevoir des messages sans avoir recours à un appareil mobile ou à un réseau Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ouvrir Messages"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 91b2e34..0346822 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Impossible d\'accéder au réseau mobile"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Essayez de changer le réseau préféré. Appuyez pour le modifier."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Appels d\'urgence non disponibles"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Impossible de passer des appels d\'urgence via le Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Les appels d\'urgence requièrent un réseau mobile"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertes"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Transfert d\'appel"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mode de rappel d\'urgence"</string>
@@ -261,7 +261,7 @@
     <string name="global_action_bug_report" msgid="5127867163044170003">"Rapport de bug"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"Fermer la session"</string>
     <string name="global_action_screenshot" msgid="2610053466156478564">"Capture d\'écran"</string>
-    <string name="bugreport_title" msgid="8549990811777373050">"Rapport de bug"</string>
+    <string name="bugreport_title" msgid="8549990811777373050">"Signaler un bug"</string>
     <string name="bugreport_message" msgid="5212529146119624326">"Cela permet de recueillir des informations concernant l\'état actuel de votre appareil. Ces informations sont ensuite envoyées sous forme d\'e-mail. Merci de patienter pendant la préparation du rapport de bug. Cette opération peut prendre quelques instants."</string>
     <string name="bugreport_option_interactive_title" msgid="7968287837902871289">"Rapport interactif"</string>
     <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Utilisez cette option dans la plupart des circonstances. Elle vous permet de suivre la progression du rapport, de saisir plus d\'informations sur le problème et d\'effectuer des captures d\'écran. Certaines sections moins utilisées et dont le remplissage demande beaucoup de temps peuvent être omises."</string>
@@ -828,7 +828,7 @@
     <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Autorise l\'appli à mettre à jour les états de validation des clés de contact E2EE possédées par d\'autres applis."</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Définir les règles du mot de passe"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Gérer le nombre et le type de caractères autorisés dans les mots de passe et les codes d\'accès de verrouillage de l\'écran"</string>
-    <string name="policylab_watchLogin" msgid="7599669460083719504">"Gérer les tentatives de déverrouillage de l\'écran"</string>
+    <string name="policylab_watchLogin" msgid="7599669460083719504">"Contrôler les tentatives de déverrouillage de l\'écran"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Contrôler le nombre de mots de passe incorrects saisis pour le déverrouillage de l\'écran, puis verrouiller la tablette ou effacer toutes ses données si le nombre maximal de tentatives de saisie du mot de passe est atteint"</string>
     <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Contrôle le nombre de fois qu\'un mot de passe incorrect est saisi lors du déverrouillage de l\'écran, et verrouille votre appareil Android TV ou en efface toutes les données si le nombre maximal de mots de passe incorrects autorisé est dépassé."</string>
     <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Contrôler le nombre de mots de passe incorrects saisis pour le déverrouillage de l\'écran, puis verrouiller le système d\'infoloisirs ou effacer toutes ses données si le nombre maximal de tentatives de saisie du mot de passe est atteint."</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Supprimer"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Mode de saisie"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Actions sur le texte"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Ce champ ne prend pas en charge l\'écriture manuscrite"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Les champs de mot de passe ne prennent pas en charge l\'écriture manuscrite"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Retour"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Changer le mode de saisie"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Espace de stockage bientôt saturé"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Géré par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activé"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Désactivé"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Tous les agendas"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> coupe certains sons"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Un problème interne lié à votre appareil est survenu. Ce dernier risque d\'être instable jusqu\'à ce que vous rétablissiez la configuration d\'usine."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Un problème interne lié à votre appareil est survenu. Veuillez contacter le fabricant pour en savoir plus."</string>
@@ -1987,9 +1992,9 @@
     <string name="work_mode_off_title" msgid="6367463960165135829">"Réactiver les applis pro ?"</string>
     <string name="work_mode_turn_on" msgid="5316648862401307800">"Réactiver"</string>
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Urgence"</string>
-    <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Définir verrouillage écran"</string>
+    <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Activer verrouillage écran"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Activer verrouillage écran"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Pour utiliser votre espace privé, définissez un verrouillage de l\'écran sur cet appareil"</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Pour utiliser votre espace privé, activez le verrouillage de l\'écran sur cet appareil"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Application non disponible"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> n\'est pas disponible pour le moment."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> indisponible"</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Commun"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Connecté automatiquement au réseau satellite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Vous pouvez envoyer et recevoir des messages sans connexion au réseau mobile ou Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ouvrir Messages"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 4f1b88e..fa48e96 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Non se puido conectar coa rede de telefonía móbil"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Proba a cambiar a rede preferida. Toca para cambiar."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"As chamadas de emerxencia non están dispoñibles"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Non se poden realizar chamadas de emerxencia por wifi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"As chamadas de emerxencia precisan unha rede de telefonía móbil"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertas"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Desvío de chamadas"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modo de devolución de chamadas de emerxencia"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Eliminar"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Método de introdución de texto"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Accións de texto"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Este campo non admite a escritura manual"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Os campos dos contrasinais non admiten a escritura manual"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atrás"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Cambia o método de introdución"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Estase esgotando o espazo de almacenamento"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Xestionada por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activada"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desactivada"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Calquera calendario"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> está silenciando algúns sons"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Produciuse un erro interno no teu dispositivo e quizais funcione de maneira inestable ata o restablecemento dos datos de fábrica."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Produciuse un erro interno co teu dispositivo. Contacta co teu fabricante para obter máis información."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Proba"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Compartido"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Conexión automática ao satélite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Podes enviar e recibir mensaxes sen unha rede de telefonía móbil ou wifi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir Mensaxes"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 6bd19ea..fb202ba 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"મોબાઇલ નેટવર્ક સુધી પહોંચી શકાતું નથી"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"પસંદગીનું નેટવર્ક બદલવાનો પ્રયાસ કરો. બદલવા માટે ટૅપ કરો."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"કટોકટીની કૉલિંગ સેવા અનુપલબ્ધ"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"વાઇ-ફાઇ પરથી કટોકટીના કૉલ કરી શકાતા નથી"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ઇમર્જન્સી કૉલ માટે મોબાઇલ નેટવર્કની આવશ્યકતા છે"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"અલર્ટ"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"કૉલ ફૉર્વર્ડિંગ"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"કટોકટી કૉલબૅક મોડ"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"ડિલીટ કરો"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ઇનપુટ પદ્ધતિ"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"ટેક્સ્ટ ક્રિયાઓ"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"આ ફીલ્ડમાં હસ્તલેખન સપોર્ટેડ નથી"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"પાસવર્ડ ફીલ્ડમાં હસ્તલેખન સપોર્ટેડ નથી"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"પાછળ"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ઇનપુટ પદ્ધતિ સ્વિચ કરો"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"સ્ટોરેજ સ્થાન સમાપ્ત થયું"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> દ્વારા મેનેજ કરવામાં આવે છે"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ચાલુ છે"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"બંધ છે"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"કોઈપણ કૅલેન્ડર"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> અમુક અવાજોને મ્યૂટ કરે છે"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"તમારા ઉપકરણમાં આંતરિક સમસ્યા છે અને જ્યાં સુધી તમે ફેક્ટરી ડેટા ફરીથી સેટ કરશો નહીં ત્યાં સુધી તે અસ્થિર રહી શકે છે."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"તમારા ઉપકરણમાં આંતરિક સમસ્યા છે. વિગતો માટે તમારા નિર્માતાનો સંપર્ક કરો."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"પરીક્ષણ કરો"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"કૉમ્યુનલ"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"સેટેલાઇટ સાથે ઑટોમૅટિક રીતે કનેક્ટેડ"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"તમે મોબાઇલ અથવા વાઇ-ફાઇ નેટવર્ક વિના મેસેજ મોકલી અને પ્રાપ્ત કરી શકો છો"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ખોલો"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 53c3c63..fd99d19 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"मोबाइल नेटवर्क से कनेक्ट नहीं किया जा सका"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"पसंदीदा नेटवर्क बदलकर देखें. बदलने के लिए टैप करें."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"आपातकालीन कॉल करने की सुविधा उपलब्ध नहीं है"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"वाई-फ़ाई के ज़रिए आपातकालीन कॉल नहीं किया जा सकता"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"आपातकालीन कॉल के लिए मोबाइल नेटवर्क ज़रूरी है"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"सूचनाएं"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"कॉल को दूसरे नंबर पर भेजना"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"आपातकालीन कॉलबैक मोड"</string>
@@ -256,7 +256,7 @@
     <string name="global_action_power_off" msgid="4404936470711393203">"बंद करें"</string>
     <string name="global_action_power_options" msgid="1185286119330160073">"पावर"</string>
     <string name="global_action_restart" msgid="4678451019561687074">"रीस्टार्ट करें"</string>
-    <string name="global_action_emergency" msgid="1387617624177105088">"आपातकालीन"</string>
+    <string name="global_action_emergency" msgid="1387617624177105088">"आपातकालीन सुविधाएं देखें"</string>
     <string name="global_action_bug_report" msgid="5127867163044170003">"गड़बड़ी की रिपोर्ट"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"सत्र खत्म करें"</string>
     <string name="global_action_screenshot" msgid="2610053466156478564">"स्क्रीनशॉट"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"मिटाएं"</string>
     <string name="inputMethod" msgid="1784759500516314751">"इनपुट विधि"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"लेख क्रियाएं"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"इस फ़ील्ड में हैंडराइटिंग की सुविधा मौजूद नहीं है"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"पासवर्ड वाले फ़ील्ड में हैंडराइटिंग की सुविधा मौजूद नहीं है"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"वापस जाएं"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"इनपुट का तरीका बदलें"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"मेमोरी में जगह नहीं बची है"</string>
@@ -1923,10 +1925,13 @@
     <string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"हफ़्ते की रात"</string>
     <string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"सप्ताहांत"</string>
     <string name="zen_mode_default_events_name" msgid="2280682960128512257">"इवेंट"</string>
-    <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"सोते समय"</string>
+    <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"सोने का समय"</string>
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"मैनेज करने वाला ऐप्लिकेशन: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"चालू है"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"बंद है"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"कोई भी कैलेंडर"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> कुछ आवाज़ें म्‍यूट कर रहा है"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"आपके डिवाइस में कोई अंदरूनी समस्या है और यह तब तक ठीक नहीं होगी जब तक आप फ़ैक्‍टरी डेटा रीसेट नहीं करते."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"आपके डिवाइस के साथ कोई आंतरिक गड़बड़ी हुई. विवरणों के लिए अपने निर्माता से संपर्क करें."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"टेस्ट"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"कम्यूनिटी"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"सैटलाइट से अपने-आप कनेक्ट हो गया"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"मोबाइल या वाई-फ़ाई नेटवर्क के बिना भी मैसेज भेजे और पाए जा सकते हैं"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ऐप्लिकेशन खोलें"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 69d88f0..5ac09ec 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobilna mreža nije dostupna"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Pokušajte promijeniti preferiranu mrežu. Dodirnite da biste je promijenili."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Hitni pozivi nisu dostupni"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Nije moguće upućivati hitne pozive putem Wi‑Fi-ja"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Za hitne pozive potrebna je mobilna mreža"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Upozorenja"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Preusmjeravanje poziva"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Način hitnog povratnog poziva"</string>
@@ -330,7 +330,7 @@
     <string name="permgroupdesc_microphone" msgid="1047786732792487722">"snimati zvuk"</string>
     <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Tjelesna aktivnost"</string>
     <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"pristupiti vašoj tjelesnoj aktivnosti"</string>
-    <string name="permgrouplab_camera" msgid="9090413408963547706">"Fotoaparat"</string>
+    <string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
     <string name="permgroupdesc_camera" msgid="7585150538459320326">"snimati fotografije i videozapise"</string>
     <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Uređaji u blizini"</string>
     <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"otkrivanje i povezivanje s uređajima u blizini"</string>
@@ -1059,7 +1059,7 @@
     <string name="keyguard_accessibility_widget" msgid="6776892679715699875">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget."</string>
     <string name="keyguard_accessibility_user_selector" msgid="1466067610235696600">"Birač korisnika"</string>
     <string name="keyguard_accessibility_status" msgid="6792745049712397237">"Status"</string>
-    <string name="keyguard_accessibility_camera" msgid="7862557559464986528">"Fotoaparat"</string>
+    <string name="keyguard_accessibility_camera" msgid="7862557559464986528">"Kamera"</string>
     <string name="keygaurd_accessibility_media_controls" msgid="2267379779900620614">"Nadzor medija"</string>
     <string name="keyguard_accessibility_widget_reorder_start" msgid="7066213328912939191">"Pokrenuta je promjena redoslijeda widgeta."</string>
     <string name="keyguard_accessibility_widget_reorder_end" msgid="1083806817600593490">"Završena je promjena redoslijeda widgeta."</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Način unosa"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Radnje s tekstom"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Rukopis nije podržan u ovom polju"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Rukopis nije podržan u poljima za zaporku"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Natrag"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Promjena načina unosa"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ponestaje prostora za pohranu"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Upravlja <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Uključeno"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Isključeno"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Bilo koji kalendar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> isključuje neke zvukove"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Na vašem uređaju postoji interni problem i možda neće biti stabilan dok ga ne vratite na tvorničko stanje."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Na vašem uređaju postoji interni problem. Obratite se proizvođaču za više pojedinosti."</string>
@@ -1989,7 +1994,7 @@
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Hitni slučaj"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Postavite zaključavanje zaslona"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Postavi zaključavanje zaslona"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Za upotrebu privatnog prostora postavite zaključavanje zaslona na ovom uređaju"</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Da biste upotrebljavali privatni prostor, postavite zaključavanje zaslona na ovom uređaju"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Aplikacija nije dostupna"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutačno nije dostupna."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> – nije dostupno"</string>
@@ -2119,7 +2124,7 @@
     <string name="review_notification_settings_dismiss" msgid="4160916504616428294">"Odbaci"</string>
     <string name="notification_app_name_system" msgid="3045196791746735601">"Sustav"</string>
     <string name="notification_app_name_settings" msgid="9088548800899952531">"Postavke"</string>
-    <string name="notification_appops_camera_active" msgid="8177643089272352083">"Fotoaparat"</string>
+    <string name="notification_appops_camera_active" msgid="8177643089272352083">"Kamera"</string>
     <string name="notification_appops_microphone_active" msgid="581333393214739332">"Mikrofon"</string>
     <string name="notification_appops_overlay_active" msgid="5571732753262836481">"prikazuje se preko drugih aplikacija na zaslonu"</string>
     <string name="notification_feedback_indicator" msgid="663476517711323016">"Slanje povratnih informacija"</string>
@@ -2331,7 +2336,7 @@
     <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Uključite u Postavkama"</string>
     <string name="dismiss_action" msgid="1728820550388704784">"Odbaci"</string>
     <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Deblokiraj mikrofon uređaja"</string>
-    <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Deblokiraj fotoaparat uređaja"</string>
+    <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Deblokiraj kameru uređaja"</string>
     <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Za &lt;b&gt;<xliff:g id="APP">%s</xliff:g>&lt;/b&gt; i sve aplikacije i usluge"</string>
     <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Deblokiraj"</string>
     <string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privatnost senzora"</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Zajedničko"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automatski povezano sa satelitom"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Možete slati i primati poruke bez mobilne mreže ili Wi-Fi mreže"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvori Poruke"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 8a3d551..06ca1b6 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"A mobilhálózat nem érhető el"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Próbálja meg módosítani a preferált hálózatot. Koppintson a módosításhoz."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Segélyhívás nem lehetséges"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Nem lehet segélyhívást kezdeményezni Wi-Fi-n keresztül"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"A segélyhíváshoz mobilhálózatra van szükség"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Értesítések"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Hívásátirányítás"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Sürgősségi visszahívás mód"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Törlés"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Beviteli mód"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Műveletek szöveggel"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"A kézírás nem támogatott ebben a mezőben"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"A kézírás nem támogatott a jelszómezőkben"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Vissza"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Beviteli módszer váltása"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Kevés a szabad terület"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Kezelő: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Bekapcsolva"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Kikapcsolva"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Bármilyen naptár"</string>
     <string name="muted_by" msgid="91464083490094950">"A(z) <xliff:g id="THIRD_PARTY">%1$s</xliff:g> lenémít néhány hangot"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Belső probléma van az eszközzel, és instabil lehet, amíg vissza nem állítja a gyári adatokat."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Belső probléma van az eszközzel. A részletekért vegye fel a kapcsolatot a gyártóval."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Teszt"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Közös"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automatikusan csatlakozva a műholdhoz"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Küldhet és fogadhat üzeneteket mobil- és Wi-Fi-hálózat nélkül is"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"A Messages megnyitása"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 84d18c7..89e087e 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Չհաջողվեց միանալ բջջային ցանցին"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Փորձեք այլ ցանցի միանալ: Հպեք՝ նախընտրած ցանցը փոխելու համար:"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Շտապ կանչերը հասանելի չեն"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Շտապ կանչերը հասանելի չեն Wi‑Fi-ի միջոցով"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Շտապ կանչերի համար բջջային ցանց է անհրաժեշտ"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Ծանուցումներ"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Զանգի վերահասցեավորում"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Շտապ հետզանգի ռեժիմ"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Ջնջել"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Մուտքագրման եղանակը"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Տեքստի գործողությունները"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Ձեռագիր ներածումը չի աջակցվում այս դաշտում"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Ձեռագիր ներածումը չի աջակցվում գաղտնաբառերի դաշտերում"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Հետ"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Փոխել ներածման եղանակը"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Հիշողությունը սպառվում է"</string>
@@ -1628,7 +1630,7 @@
     <string name="validity_period" msgid="1717724283033175968">"Վավերականություն`"</string>
     <string name="issued_on" msgid="5855489688152497307">"Թողարկվել է`"</string>
     <string name="expires_on" msgid="1623640879705103121">"Սպառվում է`"</string>
-    <string name="serial_number" msgid="3479576915806623429">"Հերթական համարը`"</string>
+    <string name="serial_number" msgid="3479576915806623429">"Հերթական համար`"</string>
     <string name="fingerprints" msgid="148690767172613723">"Մատնահետքերը`"</string>
     <string name="sha256_fingerprint" msgid="7103976380961964600">"SHA-256 մատնահետք`"</string>
     <string name="sha1_fingerprint" msgid="2339915142825390774">"SHA-1 մատնահետք`"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Կառավարվում է <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի կողմից"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Միացված է"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Անջատված է"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Ցանկացած օրացույց"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>-ն անջատում է որոշ ձայներ"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Սարքում ներքին խնդիր է առաջացել և այն կարող է կրկնվել, մինչև չվերականգնեք գործարանային կարգավորումները:"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Սարքում ներքին խնդիր է առաջացել: Մանրամասների համար կապվեք արտադրողի հետ:"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Փորձնական"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Ընդհանուր"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Ավտոմատ միացել է արբանյակին"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Դուք կարող եք ուղարկել և ստանալ հաղորդագրություններ՝ առանց բջջային կամ Wi-Fi կապի"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Բացել Messages-ը"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index aadf58d..616b30b 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Tidak dapat menjangkau jaringan seluler"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Coba ubah jaringan pilihan. Ketuk untuk mengubah."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Panggilan darurat tidak tersedia"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Tidak dapat melakukan panggilan darurat melalui Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Panggilan darurat memerlukan jaringan seluler"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Notifikasi"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Penerusan panggilan"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mode telepon balik darurat"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Hapus"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Metode masukan"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Tindakan teks"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Tulisan tangan tidak didukung di kolom ini"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Tulisan tangan tidak didukung di kolom sandi"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Kembali"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Beralih metode input"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ruang penyimpanan hampir habis"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Dikelola oleh <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aktif"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Nonaktif"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Kalender mana saja"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> mematikan beberapa suara"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Ada masalah dengan perangkat. Hal ini mungkin membuat perangkat jadi tidak stabil dan perlu dikembalikan ke setelan pabrik."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Ada masalah dengan perangkat. Hubungi produsen perangkat untuk informasi selengkapnya."</string>
@@ -1988,7 +1993,7 @@
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Darurat"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Setel kunci layar"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Setel kunci layar"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Untuk menggunakan ruang pribadi, setel kunci layar di perangkat ini"</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Untuk menggunakan ruang privasi, setel kunci layar di perangkat ini"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Aplikasi tidak tersedia"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak tersedia saat ini."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> tidak tersedia"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Pengujian"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Umum"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Menghubungkan otomatis ke satelit"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Anda dapat mengirim dan menerima pesan tanpa jaringan seluler atau Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Buka Message"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index c56e35f..5d55ba8 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Ekki næst samband við farsímakerfi"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Prófaðu að velja annað símkerfi. Ýttu til að breyta."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Neyðarsímtöl eru ekki í boði"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Ekki er hægt að hringja neyðarsímtöl með Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Neyðarsímtöl krefjast farsímakerfis"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Tilkynningar"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Símtalsflutningur"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Stilling fyrir svarhringingu neyðarsímtala"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Eyða"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Innsláttaraðferð"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Textaaðgerðir"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handskrift er ekki studd í þessum reit"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handskrift er ekki studd í reitum fyrir aðgangsorð"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Til baka"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Skipta um innfærsluaðferð"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Geymslurýmið er senn á þrotum"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Stýrt af <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Kveikt"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Slökkt"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Öll dagatöl"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> þaggar í einhverjum hljóðum"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Innra vandamál kom upp í tækinu og það kann að vera óstöðugt þangað til þú núllstillir það."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Innra vandamál kom upp í tækinu. Hafðu samband við framleiðanda til að fá nánari upplýsingar."</string>
@@ -1969,7 +1974,7 @@
     <string name="user_creation_account_exists" msgid="2239146360099708035">"Viltu leyfa <xliff:g id="APP">%1$s</xliff:g> að stofna nýjan notanda með <xliff:g id="ACCOUNT">%2$s</xliff:g> (notandi með þennan reikning er þegar fyrir hendi)?"</string>
     <string name="user_creation_adding" msgid="7305185499667958364">"Leyfa <xliff:g id="APP">%1$s</xliff:g> að stofna nýjan notanda með <xliff:g id="ACCOUNT">%2$s</xliff:g> ?"</string>
     <string name="supervised_user_creation_label" msgid="6884904353827427515">"Bæta við stýrðum notanda"</string>
-    <string name="language_selection_title" msgid="52674936078683285">"Bæta við tungumáli"</string>
+    <string name="language_selection_title" msgid="52674936078683285">"Bæta tungumáli við"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"Svæðisval"</string>
     <string name="search_language_hint" msgid="7004225294308793583">"Sláðu inn heiti tungumáls"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"Tillögur"</string>
@@ -1987,7 +1992,7 @@
     <string name="work_mode_turn_on" msgid="5316648862401307800">"Ljúka hléi"</string>
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Neyðartilvik"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Stilltu skjálás"</string>
-    <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Stilltu skjálás"</string>
+    <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Stilla skjálás"</string>
     <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Stilltu skjálás í tækinu til að nota leynirými"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Forrit er ekki tiltækt"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> er ekki tiltækt núna."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Prófun"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Sameiginlegt"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Tengdist sjálfkrafa við gervihnött"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Þú getur sent og móttekið skilaboð án tengingar við farsímakerfi eða Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Opna Messages"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 1c12a97..9d8d74a 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Impossibile raggiungere la rete mobile"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Prova a cambiare la rete preferita. Tocca per cambiare."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Chiamate di emergenza non disponibili"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Impossibile fare chiamate di emergenza tramite Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Per le chiamate di emergenza è necessaria una rete mobile"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Avvisi"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Deviazione chiamate"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modalità di richiamata di emergenza"</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Elimina"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Metodo inserimento"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Azioni testo"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"La scrittura a mano libera non è supportata in questo campo"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"La scrittura a mano libera non è supportata nei campi per le password"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Indietro"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Cambia metodo di immissione"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Spazio di archiviazione in esaurimento"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gestione: app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"On"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Off"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Qualsiasi calendario"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> sta disattivando alcuni suoni"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Si è verificato un problema interno con il dispositivo, che potrebbe essere instabile fino al ripristino dei dati di fabbrica."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Si è verificato un problema interno con il dispositivo. Per informazioni dettagliate, contatta il produttore."</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Condiviso"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Connessione automatica al satellite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Puoi inviare e ricevere messaggi senza una rete mobile o Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Apri Messaggi"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 744c2ed..c256de9 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"לא ניתן להתחבר לרשת הסלולרית"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"אפשר לנסות לשנות את הרשת המועדפת. יש להקיש כדי לשנות אותה."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"שיחות חירום לא זמינות"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"‏לא ניתן לבצע שיחות חירום דרך Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"כדי לבצע שיחות חירום, צריך להתחבר לרשת סלולרית"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"התראות"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"העברת שיחות"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"מצב \'התקשרות חזרה בחירום\'"</string>
@@ -258,10 +258,10 @@
     <string name="global_action_power_options" msgid="1185286119330160073">"הפעלה"</string>
     <string name="global_action_restart" msgid="4678451019561687074">"הפעלה מחדש"</string>
     <string name="global_action_emergency" msgid="1387617624177105088">"חירום"</string>
-    <string name="global_action_bug_report" msgid="5127867163044170003">"דיווח על באג"</string>
+    <string name="global_action_bug_report" msgid="5127867163044170003">"דוח איתור באגים"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"סיום הפעלה"</string>
     <string name="global_action_screenshot" msgid="2610053466156478564">"צילום מסך"</string>
-    <string name="bugreport_title" msgid="8549990811777373050">"דוח על באג"</string>
+    <string name="bugreport_title" msgid="8549990811777373050">"דיווח על באג"</string>
     <string name="bugreport_message" msgid="5212529146119624326">"הפעולה הזו תאסוף מידע על מצב המכשיר הנוכחי שלך כדי לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת הדיווח על הבאג ועד לשליחת ההודעה בפועל. יש להמתין בסבלנות."</string>
     <string name="bugreport_option_interactive_title" msgid="7968287837902871289">"דוח אינטראקטיבי"</string>
     <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"כדאי להשתמש באפשרות הזו ברוב המקרים. היא מאפשרת לך לעקוב אחר התקדמות הדוח, להזין פרטים נוספים על הבעיה ולצלם את המסך. היא עשויה להשמיט כמה קטעים שנמצאים פחות בשימוש ושיצירת הדיווח עליהם נמשכת זמן רב."</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"מחיקה"</string>
     <string name="inputMethod" msgid="1784759500516314751">"שיטת קלט"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"פעולות טקסט"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"אין תמיכה בכתיבה ידנית בשדה הזה"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"אין תמיכה בכתיבה ידנית בשדות של הזנת סיסמה"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"חזרה"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"החלפה של שיטת הקלט"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"מקום האחסון עומד להיגמר"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"בניהול של <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"מצב פעיל"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"מצב מושבת"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"‫<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"כל יומן"</string>
     <string name="muted_by" msgid="91464083490094950">"חלק מהצלילים מושתקים על ידי <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"קיימת בעיה פנימית במכשיר שלך, וייתכן שהוא לא יתפקד כראוי עד שיבוצע איפוס לנתוני היצרן."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"קיימת בעיה פנימית במכשיר שלך. לקבלת פרטים, יש ליצור קשר עם היצרן."</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"בדיקה"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"שיתופי"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"חיבור אוטומטי ללוויין"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"‏אפשר לשלוח ולקבל הודעות ללא רשת סלולרית או רשת Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"‏לפתיחת Messages"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 576e1df9..eee2e3d 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"モバイル ネットワークにアクセスできません"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"タップして、優先ネットワークを変更してください。"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"緊急通報は利用できません"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi‑Fi では緊急通報ができません"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"緊急通報にはモバイル ネットワークが必要です"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"通知"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"電話の転送"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"緊急通報待機モード"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"削除"</string>
     <string name="inputMethod" msgid="1784759500516314751">"入力方法"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"テキスト操作"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"この欄は手書き入力には対応していません"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"パスワードの欄は手書き入力には対応していません"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"戻る"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"入力方法の切り替え"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"空き容量わずか"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> によって管理されています"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ON"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"OFF"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">"、 "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>~<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"すべてのカレンダー"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> により一部の音はミュートに設定"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"デバイスで内部的な問題が発生しました。データが初期化されるまで不安定になる可能性があります。"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"デバイスで内部的な問題が発生しました。詳しくはメーカーにお問い合わせください。"</string>
@@ -2368,8 +2373,8 @@
     <string name="concurrent_display_notification_name" msgid="1526911253558311131">"デュアル スクリーン"</string>
     <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"デュアル スクリーン: ON"</string>
     <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>は 2 画面でコンテンツを表示しています"</string>
-    <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"デバイスが熱くなりすぎています"</string>
-    <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"スマートフォンが熱くなりすぎているため、デュアル スクリーンを使用できません"</string>
+    <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"デバイスが熱くなっています"</string>
+    <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"スマートフォンが熱いため、デュアル スクリーンを使用できません"</string>
     <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"デュアル スクリーンを使用できません"</string>
     <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"バッテリー セーバーが ON のため、デュアル スクリーンを使用できません。この動作は設定で OFF にできます。"</string>
     <string name="device_state_notification_settings_button" msgid="691937505741872749">"設定に移動"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"テスト"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"共用"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"衛星に自動接続しました"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"モバイル ネットワークや Wi-Fi ネットワークを使わずにメッセージを送受信できます"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"メッセージ アプリを開く"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 43f13a3..ececd92 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"მობილურ ქსელთან დაკავშირება ვერ ხერხდება"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ცადეთ უპირატესი ქსელის შეცვლა. შეეხეთ შესაცვლელად."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"გადაუდებელი ზარი მიუწვდომელია"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"გადაუდებელი ზარები Wi‑Fi-ს მეშვეობით ვერ განხორციელდება"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"გადაუდებელი ზარები საჭიროებს მობილურ ქსელს"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"გაფრთხილებები"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"ზარის გადამისამართება"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"გადაუდებელი გადმორეკვის რეჟიმი"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"წაშლა"</string>
     <string name="inputMethod" msgid="1784759500516314751">"შეყვანის მეთოდი"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"ქმედებები ტექსტზე"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ამ ველში ხელით წერა არ არის მხარდაჭერილი"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"პაროლის ველში ხელით წერა არ არის მხარდაჭერილი"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"უკან"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"შეყვანის მეთოდის გადართვა"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"თავისუფალი ადგილი იწურება"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"მართავს <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ჩართული"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"გამორთული"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ნებისმიერი კალენდარი"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ზოგიერთ ხმას ადუმებს"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"ფიქსირდება თქვენი მ ოწყობილობის შიდა პრობლემა და შეიძლება არასტაბილური იყოს, სანამ ქარხნულ მონაცემების არ განაახლებთ."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"ფიქსირდება თქვენი მოწყობილობის შიდა პრობლემა. დეტალებისათვის, მიმართეთ თქვენს მწარმოებელს."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"სატესტო"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"საერთო"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"სატელიტთან ავტომატურად დაკავშირებულია"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"შეგიძლიათ გაგზავნოთ და მიიღოთ შეტყობინებები მობილური ან Wi-Fi ქსელის გარეშე"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages-ის გახსნა"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index e029b70..38c6f77 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Мобильдік желіге қосылу мүмкін емес"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Таңдаулы желіні өзгертіп көріңіз. Өзгерту үшін түртіңіз."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Жедел қызметке қоңырау шалу мүмкін емес"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi-Fi арқылы жедел қызметке қоңырау шалу мүмкін емес"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Құтқару қызметіне қоңырау шалу үшін мобильдік желі қажет."</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Дабылдар"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Қоңырауды басқа нөмірге бағыттау"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Шұғыл кері қоңырау шалу режимі"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Жою"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Енгізу әдісі"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Мәтін әрекеттері"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Бұл өрісте қолмен жазу мүмкін емес."</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Құпия сөз өрістерінде қолмен жазу мүмкін емес."</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Артқа"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Енгізу әдісін ауыстыру"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Жадта орын азайып барады"</string>
@@ -1281,7 +1283,7 @@
     <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Қолданбалар іске қосылуда."</string>
     <string name="android_upgrading_complete" msgid="409800058018374746">"Қосуды аяқтауда."</string>
     <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Қуат түймесін бастыңыз. Бұл әдетте экранды өшіреді.\n\nСаусақ ізін реттеу үшін, оны жайлап түртіп көріңіз."</string>
-    <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Реттеуді аяқтау үшін экранды өшіріңіз"</string>
+    <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Реттеуді аяқтау үшін экранды өшіріңіз."</string>
     <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Өшіру"</string>
     <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Саусақ ізін растауды жалғастырасыз ба?"</string>
     <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Қуат түймесін бастыңыз. Бұл әдетте экранды өшіреді.\n\nСаусақ ізін растау үшін, оны жайлап түртіп көріңіз."</string>
@@ -1559,7 +1561,7 @@
     <string name="sync_really_delete" msgid="5657871730315579051">"Бұл нәрселер жойылсын"</string>
     <string name="sync_undo_deletes" msgid="5786033331266418896">"Жойылғандарды кері орындау"</string>
     <string name="sync_do_nothing" msgid="4528734662446469646">"Қазір ешқандай әрекет жасамаңыз"</string>
-    <string name="choose_account_label" msgid="5557833752759831548">"Аккаунт таңдау"</string>
+    <string name="choose_account_label" msgid="5557833752759831548">"Аккаунт таңдаңыз"</string>
     <string name="add_account_label" msgid="4067610644298737417">"Аккаунт қосу"</string>
     <string name="add_account_button_label" msgid="322390749416414097">"Аккаунт қосу."</string>
     <string name="number_picker_increment_button" msgid="7621013714795186298">"Арттыру"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> басқарады."</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Қосулы"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Өшірулі"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Кез келген күнтізбе"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> кейбір дыбыстарды өшіруде"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Сынақ"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Жалпы"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Жерсерік қызметіне автоматты түрде қосылды"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Мобильдік не Wi-Fi желісіне қосылмастан хабар жібере аласыз және ала аласыз."</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages қолданбасын ашу"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 1dee12e..6c0a195 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"មិន​អាច​ភ្ជាប់​បណ្ដាញ​ទូរសព្ទ​ចល័តបានទេ"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"សាកល្បង​ប្ដូរ​ទៅបណ្ដាញ​ដែល​ចង់ប្រើ។ សូមចុច​ដើម្បីផ្លាស់​ប្ដូរ។"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"មិន​អាច​ប្រើ​ការ​ហៅ​បន្ទាន់​បានទេ"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"មិន​អាចធ្វើការ​ហៅ​បន្ទាន់​តាម Wi‑Fi បានទេ"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ការហៅទៅលេខសង្គ្រោះបន្ទាន់តម្រូវឱ្យមានបណ្ដាញ​ទូរសព្ទ​ចល័ត"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"ការជូនដំណឹង"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"ការបញ្ជូន​ការហៅ​ទូរសព្ទ​បន្ត"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"មុខងារ​ហៅត្រឡប់​វិញ​បន្ទាន់"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"លុប"</string>
     <string name="inputMethod" msgid="1784759500516314751">"វិធីបញ្ចូល"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"សកម្មភាព​អត្ថបទ"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"មិនអាចប្រើការសរសេរដោយដៃនៅក្នុងកន្លែងបញ្ចូលនេះបានទេ"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"មិនអាចប្រើការសរសេរដោយដៃនៅក្នុងកន្លែងបញ្ចូលពាក្យសម្ងាត់បានទេ"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ថយក្រោយ"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ប្ដូរវិធីសាស្ត្រ​បញ្ចូល"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"អស់​ទំហំ​ផ្ទុក"</string>
@@ -1741,7 +1743,7 @@
     <string name="color_inversion_feature_name" msgid="2672824491933264951">"ការបញ្ច្រាស​ពណ៌"</string>
     <string name="color_correction_feature_name" msgid="7975133554160979214">"ការកែតម្រូវ​ពណ៌"</string>
     <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"មុខងារប្រើដៃម្ខាង"</string>
-    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"ពន្លឺតិចខ្លាំង"</string>
+    <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"ងងឹតខ្លាំង"</string>
     <string name="hearing_aids_feature_name" msgid="1125892105105852542">"ឧបករណ៍ជំនួយការស្ដាប់"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"បានសង្កត់​គ្រាប់ចុច​កម្រិតសំឡេង​ជាប់។ បាន​បើក <xliff:g id="SERVICE_NAME">%1$s</xliff:g>។"</string>
     <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"បានសង្កត់​គ្រាប់ចុច​កម្រិតសំឡេង​ជាប់។ បាន​បិទ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>។"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"គ្រប់គ្រងដោយ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"បើក"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"បិទ"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ប្រតិទិនណាមួយ"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> កំពុង​បិទសំឡេង​មួយចំនួន"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"មានបញ្ហាខាងក្នុងឧបករណ៍របស់អ្នក ហើយវាអ្នកមិនមានស្ថេរភាព រហូតទាល់តែអ្នកកំណត់ដូចដើមវិញទាំងស្រុង។"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"មានបញ្ហាខាងក្នុងឧបករណ៍របស់អ្នក ទំនាក់ទំនងក្រុមហ៊ុនផលិតឧបករណ៍របស់អ្នកសម្រាប់ព័ត៌មានបន្ថែម។"</string>
@@ -1969,7 +1974,7 @@
     <string name="user_creation_account_exists" msgid="2239146360099708035">"អនុញ្ញាតឱ្យ <xliff:g id="APP">%1$s</xliff:g> បង្កើតអ្នកប្រើប្រាស់​ថ្មីដោយប្រើ <xliff:g id="ACCOUNT">%2$s</xliff:g> (អ្នកប្រើប្រាស់ដែលមានគណនីនេះមានរួចហើយ) ដែរឬទេ?"</string>
     <string name="user_creation_adding" msgid="7305185499667958364">"អនុញ្ញាតឱ្យ <xliff:g id="APP">%1$s</xliff:g> បង្កើតអ្នកប្រើប្រាស់​ថ្មីដោយប្រើ <xliff:g id="ACCOUNT">%2$s</xliff:g> ដែរឬទេ?"</string>
     <string name="supervised_user_creation_label" msgid="6884904353827427515">"បញ្ចូលអ្នកប្រើប្រាស់ដែលស្ថិតក្រោមការគ្រប់គ្រង"</string>
-    <string name="language_selection_title" msgid="52674936078683285">"បន្ថែមភាសា"</string>
+    <string name="language_selection_title" msgid="52674936078683285">"បញ្ចូលភាសា"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"ចំណូលចិត្តតំបន់"</string>
     <string name="search_language_hint" msgid="7004225294308793583">"វាយបញ្ចូលឈ្មោះភាសា"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"បាន​ណែនាំ"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"ការធ្វើ​តេស្ត"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"ទូទៅ"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"ភ្ជាប់ដោយស្វ័យប្រវត្តិទៅផ្កាយរណប"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"អ្នកអាចផ្ញើ និងទទួលសារដោយមិនប្រើបណ្តាញទូរសព្ទចល័ត ឬ Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"បើក​កម្មវិធី Messages"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 1574a84..faa46ba 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ಮೊಬೈಲ್‌ ನೆಟ್‌ವರ್ಕ್ ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ಆದ್ಯತೆಗೊಳಿಸಿದ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಪ್ರಯತ್ನಿಸಿ. ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"ತುರ್ತು ಕರೆ ಮಾಡುವಿಕೆ ಲಭ್ಯವಿಲ್ಲ"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"ವೈ-ಫೈ ಮೂಲಕ ತುರ್ತು ಕರೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ತುರ್ತು ಕರೆಗಳಿಗೆ ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್‌ನ ಅಗತ್ಯವಿದೆ"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"ಎಚ್ಚರಿಕೆಗಳು"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"ಕರೆ ಫಾರ್ವರ್ಡ್‌ ಮಾಡುವಿಕೆ"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"ತುರ್ತು ಕಾಲ್‌ಬ್ಯಾಕ್‌ ಮೋಡ್‌"</string>
@@ -615,7 +615,7 @@
     <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"ಕೀಲಾಕ್ ಮತ್ತು ಯಾವುದೇ ಸಂಬಂಧಿತ ಭದ್ರತಾ ಪಾಸ್‍‍ವರ್ಡ್ ಭದ್ರತೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಒಳಬರುವ ಕರೆಯನ್ನು ಸ್ವೀಕರಿಸುವಾಗ ಕೀಲಾಕ್ ಅನ್ನು ಫೋನ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ, ನಂತರ ಕರೆಯು ಅಂತ್ಯಗೊಂಡಾಗ ಕೀಲಾಕ್ ಅನ್ನು ಮರು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string>
     <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಸಂಕೀರ್ಣತೆಯನ್ನು ವಿನಂತಿಸಿ"</string>
     <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"ಆ್ಯಪ್‌ಗೆ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಸಂಕೀರ್ಣತೆ ಮಟ್ಟವನ್ನು (ಅಧಿಕ, ಮಧ್ಯಮ, ಕಡಿಮೆ ಅಥವಾ ಯಾವುದೂ ಅಲ್ಲ) ತಿಳಿದುಕೊಳ್ಳಲು ಅನುಮತಿಸುತ್ತದೆ, ಅದು ಉದ್ದದ ಸಂಭವನೀಯ ಶ್ರೇಣಿ ಮತ್ತು ಸ್ಕ್ರೀನ್ ಲಾಕ್‌ನ ವಿಧವನ್ನು ಸೂಚಿಸುತ್ತದೆ. ಬಳಕೆದಾರರು ನಿರ್ದಿಷ್ಟ ಹಂತದವರೆಗೆ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಬಹುದು, ಆದರೆ ಅವರು ಅದನ್ನು ನಿರ್ಲಕ್ಷಿಸಬಹುದು ಮತ್ತು ಅದರಿಂದ ಹೊರಬರಬಹುದು ಎಂಬುದನ್ನು ಸಹ ಆ್ಯಪ್ ಬಳಕೆದಾರರಿಗೆ ಸೂಚಿಸುತ್ತದೆ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಪಠ್ಯದ ರೂಪದಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವುದಿಲ್ಲ, ಇದರಿಂದಾಗಿ ಆ್ಯಪ್‌ಗೆ ಸರಿಯಾದ ಪಾಸ್‌ವರ್ಡ್ ಗೊತ್ತಿರುವುದಿಲ್ಲ ಎಂಬುದನ್ನು ಗಮನಿಸಿ."</string>
-    <string name="permlab_postNotification" msgid="4875401198597803658">"ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಿ"</string>
+    <string name="permlab_postNotification" msgid="4875401198597803658">"ನೋಟಿಫಿಕೇಶನ್‌ಗಳನ್ನು ತೋರಿಸಿ"</string>
     <string name="permdesc_postNotification" msgid="5974977162462877075">"ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಲು ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string>
     <string name="permlab_turnScreenOn" msgid="219344053664171492">"ಸ್ಕ್ರೀನ್ ಅನ್ನು ಆನ್ ಮಾಡಿ"</string>
     <string name="permdesc_turnScreenOn" msgid="4394606875897601559">"ಸ್ಕ್ರೀನ್ ಅನ್ನು ಆನ್ ಮಾಡಲು ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"ಅಳಿಸಿ"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ಇನ್‌ಪುಟ್ ವಿಧಾನ"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"ಪಠ್ಯದ ಕ್ರಮಗಳು"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ಈ ಫೀಲ್ಡ್‌ನಲ್ಲಿ ಕೈಬರಹವನ್ನು ಬೆಂಬಲಿಸಲಾಗುವುದಿಲ್ಲ"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ಪಾಸ್‌ವರ್ಡ್ ಫೀಲ್ಡ್‌ಗಳಲ್ಲಿ ಕೈಬರಹವನ್ನು ಬೆಂಬಲಿಸಲಾಗುವುದಿಲ್ಲ"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ಹಿಂದಕ್ಕೆ"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ಇನ್‌ಪುಟ್ ವಿಧಾನವನ್ನು ಬದಲಿಸಿ"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"ಸಂಗ್ರಹಣೆ ಸ್ಥಳವು ತುಂಬಿದೆ"</string>
@@ -1900,7 +1902,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ಸರಿ"</string>
     <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"ಬ್ಯಾಟರಿ ಸೇವರ್, ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ವಿಷುವಲ್ ಎಫೆಕ್ಟ್‌ಗಳು, ಕೆಲವು ಫೀಚರ್‌ಗಳು ಮತ್ತು ಇತರ ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕಗಳನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ ಅಥವಾ ಆಫ್ ಮಾಡುತ್ತದೆ."</string>
     <string name="battery_saver_description" msgid="8518809702138617167">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ವಿಷುವಲ್ ಎಫೆಕ್ಟ್‌ಗಳು, ಕೆಲವು ಫೀಚರ್‌ಗಳು ಮತ್ತು ಇತರ ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕಗಳನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ ಅಥವಾ ಆಫ್ ಮಾಡುತ್ತದೆ."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"ಡೇಟಾ ಬಳಕೆ ಕಡಿಮೆ ಮಾಡುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಡೇಟಾ ಸೇವರ್ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಅಥವಾ ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಪ್ರಸ್ತುತ ಬಳಸುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಆದರೆ ಪದೇ ಪದೇ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಇದರರ್ಥ, ಉದಾಹರಣೆಗೆ, ನೀವು ಅವುಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವವರೆಗೆ ಆ ಚಿತ್ರಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"ಡೇಟಾ ಬಳಕೆ ಕಡಿಮೆ ಮಾಡಲು ನೆರವಾಗಲು, ಡೇಟಾ ಸೇವರ್ ಕೆಲವು ಆ್ಯಪ್‍ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಅಥವಾ ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಪ್ರಸ್ತುತ ಬಳಸುತ್ತಿರುವ ಆ್ಯಪ್, ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು ಆದರೆ ಅಷ್ಟೊಂದು ಪದೇ ಪದೇ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡದಿರಬಹುದು. ಇದರರ್ಥ, ಉದಾಹರಣೆಗೆ, ನೀವು ಆ ಚಿತ್ರಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವವರೆಗೆ ಅವುಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"ಡೇಟಾ ಸೇವರ್ ಆನ್ ಮಾಡಬೇಕೇ?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ಆನ್‌ ಮಾಡಿ"</string>
     <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ಒಂದು ನಿಮಿಷದವರೆಗೆ ({formattedTime} ವರೆಗೆ)}one{# ನಿಮಿಷಗಳವರೆಗೆ ({formattedTime} ವರೆಗೆ)}other{# ನಿಮಿಷಗಳವರೆಗೆ ({formattedTime} ವರೆಗೆ)}}"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗಿದೆ"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ಆನ್ ಆಗಿದೆ"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ಆಫ್ ಆಗಿದೆ"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ಯಾವುದೇ ಕ್ಯಾಲೆಂಡರ್"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ಧ್ವನಿ ಮ್ಯೂಟ್ ಮಾಡುತ್ತಿದ್ದಾರೆ"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಂತರಿಕ ಸಮಸ್ಯೆಯಿದೆ ಹಾಗೂ ನೀವು ಫ್ಯಾಕ್ಟರಿ ಡೇಟಾವನ್ನು ರೀಸೆಟ್ ಮಾಡುವವರೆಗೂ ಅದು ಅಸ್ಥಿರವಾಗಬಹುದು."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಂತರಿಕ ಸಮಸ್ಯೆಯಿದೆ. ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ತಯಾರಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
@@ -1972,7 +1977,7 @@
     <string name="language_selection_title" msgid="52674936078683285">"ಭಾಷೆ ಸೇರಿಸಿ"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"ಪ್ರದೇಶ ಪ್ರಾಶಸ್ತ್ಯ"</string>
     <string name="search_language_hint" msgid="7004225294308793583">"ಭಾಷೆ ಹೆಸರನ್ನು ಟೈಪ್ ಮಾಡಿ"</string>
-    <string name="language_picker_section_suggested" msgid="6556199184638990447">"ಸೂಚಿತ ಭಾಷೆ"</string>
+    <string name="language_picker_section_suggested" msgid="6556199184638990447">"ಸೂಚಿತ ಭಾಷೆಗಳು"</string>
     <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"ಸೂಚಿಸಲಾಗಿರುವುದು"</string>
     <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"ಸೂಚಿಸಲಾದ ಭಾಷೆಗಳು"</string>
     <string name="region_picker_section_suggested_bilingual" msgid="704607569328224133">"ಸೂಚಿಸಲಾದ ಪ್ರದೇಶಗಳು"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"ಪರೀಕ್ಷೆ"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"ಸಮುದಾಯ"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"ಸ್ಯಾಟಲೈಟ್‌ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕನೆಕ್ಟ್ ಆಗಿದೆ"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"ನೀವು ಮೊಬೈಲ್ ಅಥವಾ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್ ಇಲ್ಲದೆಯೇ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಮತ್ತು ಸ್ವೀಕರಿಸಬಹುದು"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ಅನ್ನು ತೆರೆಯಿರಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 75d4a2d..9eaa414 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"모바일 네트워크에 연결할 수 없습니다."</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"기본 네트워크를 변경해 보세요. 탭하여 변경할 수 있습니다."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"긴급 전화를 사용할 수 없습니다."</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi‑Fi로는 긴급 전화를 걸 수 없습니다."</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"긴급 전화를 걸려면 모바일 네트워크 연결이 필요함"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"알림"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"착신전환"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"긴급 콜백 모드"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"삭제"</string>
     <string name="inputMethod" msgid="1784759500516314751">"입력 방법"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"텍스트 작업"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"이 입력란은 필기 입력을 지원하지 않습니다."</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"비밀번호 입력란은 필기 입력을 지원하지 않습니다."</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"뒤로"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"입력 방법 전환"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"저장 공간이 부족함"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"관리자: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"사용"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"사용 중지"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>~<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"모든 캘린더"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>(이)가 일부 소리를 음소거함"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"사용 중인 기기 내부에 문제가 발생했습니다. 초기화할 때까지 불안정할 수 있습니다."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"사용 중인 기기 내부에 문제가 발생했습니다. 자세한 내용은 제조업체에 문의하세요."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"테스트"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"공동"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"위성에 자동 연결됨"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"모바일 또는 Wi-Fi 네트워크 없이 메시지를 주고 받을 수 있습니다"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"메시지 열기"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 118a542..9efccff 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Мобилдик тармакка туташпай жатат"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Тандалган тармакты өзгөртүп көрүңүз. Өзгөртүү үчүн таптаңыз."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Шашылыш чалуу жеткиликсиз"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi-Fi аркылуу шашылыш чалуулар иштетилген жок"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Шашылыш чалуу үчүн мобилдик тармак талап кылынат"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Шашылыш билдирүүлөр"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Чалууну башка номерге багыттоо"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Шашылыш кайра чалуу режими"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Өчүрүү"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Киргизүү ыкмасы"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Текст боюнча иштер"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Бул талаада жазып киргизүү колдоого алынбайт"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Сырсөз талаасында жазып киргизүү колдоого алынбайт"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Артка"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Киргизүү ыкмасын өзгөртүү"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Сактагычта орун калбай баратат"</string>
@@ -1281,7 +1283,7 @@
     <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Колдонмолорду иштетип баштоо"</string>
     <string name="android_upgrading_complete" msgid="409800058018374746">"Жүктөлүүдө"</string>
     <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Кубат баскычын бастыңыз — адатта, бул экранды өчүрөт.\n\nМанжаңыздын изин жөндөп жатканда аны акырын басып көрүңүз."</string>
-    <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Кошуп бүтүрүү үчүн экранды өчүрүңүз"</string>
+    <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Бүтүрүү үчүн экранды өчүрүңүз"</string>
     <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Өчүрүү"</string>
     <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Манжаңыздын изин ырастоону улантасызбы?"</string>
     <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Кубат баскычын бастыңыз — адатта, бул экранды өчүрөт.\n\nМанжаңыздын изин ырастоо үчүн аны акырын басып көрүңүз."</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> башкарат"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Күйүк"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Өчүк"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>, <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Бардык жылнаамалар"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> айрым үндөрдү өчүрүүдө"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Түзмөгүңүздө ички көйгөй бар жана ал баштапкы абалга кайтарылмайынча туруктуу иштебей коюшу мүмкүн."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Түзмөгүңүздө ички көйгөй бар. Анын чоо-жайын билүү үчүн өндүрүүчүңүзгө кайрылыңыз."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Сыноо"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Жалпы"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Спутникке автоматтык түрдө туташтырылган"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Сиз мобилдик же Wi-Fi тармагы жок эле билдирүүлөрдү жөнөтүп, ала аласыз"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Жазышуулар колдонмосун ачуу"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 7057324..752e68e 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ບໍ່ສາມາດຕິດຕໍ່ເຄືອຂ່າຍມືຖືໄດ້"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ໃຫ້ລອງປ່ຽນເຄືອຂ່າຍທີ່ຕ້ອງການ. ແຕະເພື່ອປ່ຽນ."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"ບໍ່ສາມາດໃຊ້ການໂທສຸກເສີນໄດ້"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"ບໍ່ສາມາດໂທສຸກເສີນຜ່ານ Wi‑Fi ໄດ້"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ໂທ​ສຸກ​ເສີນຕ້ອງໃຊ້ເຄືອຂ່າຍມືຖື"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"ການເຕືອນ"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"ການໂອນສາຍ"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"ໂໝດໂທກັບສຸກເສີນ"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"ລຶບ"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ຮູບແບບການປ້ອນຂໍ້ມູນ"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"ການເຮັດວຽກຂອງຂໍ້ຄວາມ"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ການຂຽນດ້ວຍມືບໍ່ຖືກຮອງຮັບໃນຊ່ອງຂໍ້ມູນນີ້"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ການຂຽນດ້ວຍມືບໍ່ຖືກຮອງຮັບໃນຊ່ອງຂໍ້ມູນລະຫັດຜ່ານ"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ກັບຄືນ"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ສະຫຼັບວິທີການປ້ອນຂໍ້ມູນ"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"ພື້ນທີ່ຈັດເກັບຂໍ້ມູນກຳລັງຈະເຕັມ"</string>
@@ -1900,7 +1902,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ຕົກລົງ"</string>
     <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"ຕົວປະຢັດແບັດເຕີຣີຈະເປີດໃຊ້ຮູບແບບສີສັນມືດ ແລະ ຈຳກັດ ຫຼື ປິດການເຄື່ອນໄຫວໃນພື້ນຫຼັງ, ເອັບເຟັກທາງພາບຈຳນວນໜຶ່ງ, ຄຸນສົມບັດບາງຢ່າງ ແລະ ການເຊື່ອມຕໍ່ເຄືອຂ່າຍບາງອັນ."</string>
     <string name="battery_saver_description" msgid="8518809702138617167">"ຕົວປະຢັດແບັດເຕີຣີຈະເປີດໃຊ້ຮູບແບບສີສັນມືດ ແລະ ຈຳກັດ ຫຼື ປິດການເຄື່ອນໄຫວໃນພື້ນຫຼັງ, ເອັບເຟັກທາງພາບຈຳນວນໜຶ່ງ, ຄຸນສົມບັດບາງຢ່າງ ແລະ ການເຊື່ອມຕໍ່ເຄືອຂ່າຍບາງອັນ."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"ເພື່ອຊ່ວຍຫຼຸດຜ່ອນການນຳໃຊ້ຂໍ້ມູນ, ຕົວປະຢັດອິນເຕີເນັດຈະປ້ອງກັນບໍ່ໃຫ້ບາງແອັບສົ່ງ ຫຼື ຮັບຂໍ້ມູນໃນພື້ນຫຼັງ. ແອັບໃດໜຶ່ງທີ່ທ່ານກຳລັງໃຊ້ຢູ່ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນໄດ້ ແຕ່ອາດເຂົ້າເຖິງໄດ້ຖີ່ໜ້ອຍລົງ. ນີ້ອາດໝາຍຄວາມວ່າ ຮູບພາບຕ່າງໆອາດບໍ່ສະແດງຈົນກວ່າທ່ານຈະແຕະໃສ່ກ່ອນ."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"ເພື່ອຊ່ວຍຫຼຸດຜ່ອນການນຳໃຊ້ຂໍ້ມູນ, ຕົວປະຢັດຂໍ້ມູນຈະປ້ອງກັນບໍ່ໃຫ້ບາງແອັບສົ່ງ ຫຼື ຮັບຂໍ້ມູນໃນພື້ນຫຼັງ. ແອັບໃດໜຶ່ງທີ່ທ່ານກຳລັງໃຊ້ຢູ່ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນໄດ້ ແຕ່ອາດເຂົ້າເຖິງໄດ້ຖີ່ໜ້ອຍລົງ. ນີ້ອາດໝາຍຄວາມວ່າ ຮູບພາບຕ່າງໆອາດບໍ່ສະແດງຈົນກວ່າທ່ານຈະແຕະໃສ່ກ່ອນ."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"ເປີດຕົວປະຢັດອິນເຕີເນັດບໍ?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ເປີດໃຊ້"</string>
     <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ໄລຍະເວລາ 1 ນາທີ (ຈົນຮອດ {formattedTime})}other{ໄລຍະເວລາ # ນາທີ (ຈົນຮອດ {formattedTime})}}"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"ຈັດການໂດຍ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ເປີດຢູ່"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ປິດຢູ່"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ປະ​ຕິ​ທິນ​ໃດ​ກໍໄດ້"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ປິດສຽງບາງຢ່າງໄວ້"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"ມີ​ບັນ​ຫາ​ພາຍ​ໃນ​ກັບ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ, ແລະ​ມັນ​ອາດ​ຈະ​ບໍ່​ສະ​ຖຽນ​ຈົນ​ກວ່າ​ທ່ານ​ຕັ້ງ​ເປັນ​ຂໍ້​ມູນ​ໂຮງ​ງານ​ຄືນ​ແລ້ວ."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"ມີ​ບັນ​ຫາ​ພາຍ​ໃນ​ກັບ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ. ຕິດ​ຕໍ່ຜູ້​ຜະ​ລິດ​ຂອງ​ທ່ານ​ສຳ​ລັບ​ລາຍ​ລະ​ອຽດ​ຕ່າງໆ."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"ທົດສອບ"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"ສ່ວນກາງ"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"ເຊື່ອມຕໍ່ກັບດາວທຽມໂດຍອັດຕະໂນມັດ"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"ທ່ານສາມາດສົ່ງ ແລະ ຮັບຂໍ້ຄວາມໂດຍບໍ່ຕ້ອງໃຊ້ເຄືອຂ່າຍມືຖື ຫຼື Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"ເປີດ Messages"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index e3405d6..2fd6ded 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -86,7 +86,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Nepavyko pasiekti mobiliojo ryšio tinklo"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Pabandykite pakeisti pageidaujamą tinklą. Palieskite, kad pakeistumėte."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Skambučių pagalbos numeriu paslauga nepasiekiama"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Negalima skambinti pagalbos numeriu naudojant „Wi‑Fi“"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Kad būtų galima skambinti pagalbos numeriais, būtina naudoti mobiliojo ryšio tinklą"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Įspėjimai"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Skambučio peradresavimas"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Atskambinimo pagalbos numeriu režimas"</string>
@@ -1185,6 +1185,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Ištrinti"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Įvesties būdas"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Teksto veiksmai"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Rašymas ranka nepalaikomas šiame lauke"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Rašymas ranka nepalaikomas slaptažodžių laukuose"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atgal"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Perjungti įvesties metodą"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Mažėja laisvos saugyklos vietos"</string>
@@ -1929,6 +1931,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Tvarko „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Įjungti"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Išjungti"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Bet kuris kalendorius"</string>
     <string name="muted_by" msgid="91464083490094950">"„<xliff:g id="THIRD_PARTY">%1$s</xliff:g>“ nutildo kai kuriuos garsus"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Iškilo vidinė su jūsų įrenginiu susijusi problema, todėl įrenginys gali veikti nestabiliai, kol neatkursite gamyklinių duomenų."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Iškilo vidinė su jūsų įrenginiu susijusi problema. Jei reikia išsamios informacijos, susisiekite su gamintoju."</string>
@@ -2391,6 +2396,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Bandymas"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Bendruomenės"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automatiškai prisijungta prie palydovinio ryšio"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Galite siųsti ir gauti pranešimus be mobiliojo ryšio ar „Wi-Fi“ tinklo"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Atidaryti programą „Messages“"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index d297856a2..066cd4b 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Nevar sasniegt mobilo tīklu"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Mēģiniet nomainīt vēlamo tīklu. Pieskarieties, lai to mainītu."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Nav pieejami ārkārtas izsaukumi"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Izmantojot Wi-Fi, nevar veikt ārkārtas izsaukumus"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Lai veiktu ārkārtas zvanus, ir nepieciešams mobilais tīkls."</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Brīdinājumi"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Zvanu pāradresācija"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Ārkārtas atzvana režīms"</string>
@@ -828,7 +828,7 @@
     <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Atļauj lietotnei atjaunināt citām lietotnēm piederošu E2EE sakaru atslēgu verifikācijas statusus."</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Paroles kārtulu iestatīšana"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolēt ekrāna bloķēšanas paroļu un PIN garumu un tajos atļautās rakstzīmes."</string>
-    <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekrāna atbloķēšanas mēģinājumu pārraudzīšana"</string>
+    <string name="policylab_watchLogin" msgid="7599669460083719504">"Pārraudzīt ekrāna atbloķēšanas mēģinājumus"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Pārrauga nepareizi ievadīto paroļu skaitu, atbloķējot ekrānu, un bloķē planšetdatoru vai dzēš visus planšetdatora datus, ja tiek ievadīts pārāk daudz nepareizu paroļu."</string>
     <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Pārraudzīt nepareizi ievadīto ekrāna atbloķēšanas paroļu skaitu un bloķēt Android TV vai dzēst visus Android TV ierīces datus, ja tiek ievadīts pārāk daudz nepareizu paroļu."</string>
     <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Ekrāna atbloķēšanas laikā pārraudzīt nepareizi ievadīto paroļu skaitu un bloķēt informatīvi izklaidējošo sistēmu vai dzēst visus informatīvi izklaidējošās sistēmas datus, ja tiek ievadīts pārāk daudz nepareizu paroļu."</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Dzēst"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Ievades metode"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Teksta darbības"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Šajā laukā netiek atbalstīta rokraksta funkcija."</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Paroļu laukā netiek atbalstīta rokraksta funkcija."</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atpakaļ"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Pārslēgt ievades metodi"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Paliek maz brīvas vietas"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Pārvalda <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Ieslēgta"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Izslēgta"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Jebkurš kalendārs"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> izslēdz noteiktas skaņas"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Jūsu ierīcē ir radusies iekšēja problēma, un ierīce var darboties nestabili. Lai to labotu, veiciet rūpnīcas datu atiestatīšanu."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Jūsu ierīcē ir radusies iekšēja problēma. Lai iegūtu plašāku informāciju, lūdzu, sazinieties ar ražotāju."</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Testēšanai"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Kopīgs"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automātiski izveidots savienojums ar satelītu"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Varat sūtīt un saņemt ziņojumus bez mobilā vai Wi-Fi tīkla."</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Atvērt lietotni Ziņojumi"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index a15aa6e5..a8d5ea4 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Мобилната мрежа е недостапна"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Сменете ја претпочитаната мрежа. Допрете за промена."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Итните повици се недостапни"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Не може да остваруваат итни повици преку Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"За итните повици е потребна мобилна мрежа"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Предупредувања"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Проследување повик"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Режим на итен повратен повик"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Избриши"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Метод на внес"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Дејства со текст"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Ракописот не е поддржан во полево"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Ракописот не е поддржан во полињата за лозинка"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Префрлете го методот за внесување"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Капацитетот е речиси полн"</string>
@@ -1303,7 +1305,7 @@
     <string name="dump_heap_ready_text" msgid="5849618132123045516">"Слика од меморијата на <xliff:g id="PROC">%1$s</xliff:g> ви е достапна за споделување. Бидете внимателни: оваа слика од меморијата можеби ги содржи сите чувствителни лични информации до коишто процесот има пристап, што може да вклучуваат работи што сте ги напишале."</string>
     <string name="sendText" msgid="493003724401350724">"Избери дејство за текст"</string>
     <string name="volume_ringtone" msgid="134784084629229029">"Јачина на звук на ѕвонче"</string>
-    <string name="volume_music" msgid="7727274216734955095">"Јачина на аудио/видео звук"</string>
+    <string name="volume_music" msgid="7727274216734955095">"Јачина на звук за аудио/видео"</string>
     <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Се репродуцира преку Bluetooth"</string>
     <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Поставено ѕвонење на тивко"</string>
     <string name="volume_call" msgid="7625321655265747433">"Јачина на звук на дојдовен повик"</string>
@@ -1314,7 +1316,7 @@
     <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Јачина на звук на Bluetooth"</string>
     <string name="volume_icon_description_ringer" msgid="2187800636867423459">"Јачина на звук на мелодија"</string>
     <string name="volume_icon_description_incall" msgid="4491255105381227919">"Јачина на звук на повик"</string>
-    <string name="volume_icon_description_media" msgid="4997633254078171233">"Јачина на аудио/видео звук"</string>
+    <string name="volume_icon_description_media" msgid="4997633254078171233">"Јачина на звук за аудио/видео"</string>
     <string name="volume_icon_description_notification" msgid="579091344110747279">"Јачина на звук за известување"</string>
     <string name="ringtone_default" msgid="9118299121288174597">"Стандардна мелодија"</string>
     <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Стандардна (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Управувано од <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Вклучено"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Исклучено"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Кој било календар"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> исклучи некои звуци"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Настана внатрешен проблем со уредот и може да биде нестабилен сè додека не ресетирате на фабричките податоци."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Настана внатрешен проблем со уредот. Контактирајте го производителот за детали."</string>
@@ -1987,7 +1992,7 @@
     <string name="work_mode_turn_on" msgid="5316648862401307800">"Прекини ја паузата"</string>
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Итен случај"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Поставете заклучување екран"</string>
-    <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Поставување заклучување екран"</string>
+    <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Поставете заклучување екран"</string>
     <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"За да користите „Приватен простор“, поставете заклучување екран на уредов"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Апликацијата не е достапна"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> не е достапна во моментов."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Профил за тестирање"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Профил на заедницата"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Поврзано со сателит автоматски"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Може да испраќате и примате пораки без мобилна или Wi-Fi мрежа"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Отворете ја Messages"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 8043293..32f2daf 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"മൊബൈൽ നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യാനാവുന്നില്ല"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"തിര‌ഞ്ഞെടുത്ത നെറ്റ്‌വർക്ക് മാറ്റുന്നത് പരീക്ഷിക്കുക. മാറ്റാൻ ടാപ്പ് ചെയ്യുക."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"എമർജൻസി കോളിംഗ് ലഭ്യമല്ല"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"വൈഫൈ വഴി എമർജൻസി കോളുകൾ ചെയ്യാനാകില്ല"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"എമർജൻസി കോളുകൾ ചെയ്യാൻ ഒരു മൊബൈൽ നെറ്റ്‌വർക്ക് ആവശ്യമാണ്"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"അലേർട്ടുകൾ"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"കോൾ ഫോർവേഡിംഗ്"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"അടിയന്തര കോൾബാക്ക് മോഡ്"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"ഇല്ലാതാക്കുക"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ടൈപ്പുചെയ്യൽ രീതി"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"ടെക്‌സ്‌റ്റ് പ്രവർത്തനങ്ങൾ"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ഈ ഫീൽഡിൽ കയ്യെഴുത്ത് പിന്തുണയ്ക്കുന്നില്ല"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"പാസ്‍വേഡ് ഫീൽഡുകളിൽ കയ്യെഴുത്ത് പിന്തുണയ്ക്കുന്നില്ല"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"മടങ്ങുക"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ഇൻപുട്ട് രീതി മാറുക"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"സംഭരണയിടം കഴിഞ്ഞു"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> മാനേജ് ചെയ്യുന്നത്"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ഓണാണ്"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ഓഫാണ്"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"എല്ലാ കലണ്ടറിലും"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ചില ശബ്‌ദങ്ങൾ മ്യൂട്ട് ചെയ്യുന്നു"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു ആന്തരിക പ്രശ്‌നമുണ്ട്, ഫാക്‌ടറി വിവര പുനഃസജ്ജീകരണം ചെയ്യുന്നതുവരെ ഇതു അസ്ഥിരമായിരിക്കാനിടയുണ്ട്."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു ആന്തരിക പ്രശ്‌നമുണ്ട്. വിശദാംശങ്ങൾക്കായി നിർമ്മാതാവിനെ ബന്ധപ്പെടുക."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"ടെസ്‌റ്റ്"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"കമ്മ്യൂണൽ"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"സാറ്റലൈറ്റിലേക്ക് സ്വയമേവ കണക്റ്റ് ചെയ്തു"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"മൊബൈലോ വൈഫൈ നെറ്റ്‌വർക്കോ ഇല്ലാതെ തന്നെ സന്ദേശങ്ങൾ അയയ്‌ക്കാനും സ്വീകരിക്കാനും നിങ്ങൾക്ക് കഴിയും"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages തുറക്കുക"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 615369c..a926e60 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Мобайл сүлжээнд холбогдох боломжгүй байна"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Сонгосон сүлжээг өөрчлөхөөр оролдоно уу. Өөрчлөхийн тулд товшино уу."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Яаралтай дуудлага хийх боломжгүй"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi‑Fi-р яаралтай дуудлага хийх боломжгүй байна"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Яаралтай дуудлагуудад мобайл сүлжээ шаардлагатай"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Сануулга"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Дуудлага шилжүүлэх"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Яаралтай дуудлага хийх горим"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Устгах"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Оруулах арга"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Текст үйлдэл"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Гараар бичихийг энэ талбарт дэмждэггүй"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Гараар бичихийг нууц үгний талбаруудад дэмждэггүй"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Буцах"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Оруулах аргыг сэлгэх"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Сангийн хэмжээ дутагдаж байна"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g>-с удирддаг"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Асаалттай"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Унтраалттай"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Дурын календарь"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> зарим дууны дууг хааж байна"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Таны төхөөрөмжид дотоод алдаа байна.Та төхөөрөмжөө үйлдвэрээс гарсан төлөвт шилжүүлэх хүртэл таны төхөөрөмж чинь тогтворгүй байж болох юм."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Таны төхөөрөмжид дотоод алдаа байна. Дэлгэрэнгүй мэдээлэл авахыг хүсвэл үйлдвэрлэгчтэйгээ холбоо барина уу."</string>
@@ -1971,7 +1976,7 @@
     <string name="supervised_user_creation_label" msgid="6884904353827427515">"Хяналттай хэрэглэгч нэмэх"</string>
     <string name="language_selection_title" msgid="52674936078683285">"Хэл нэмэх"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"Бүс нутгийн тохиргоо"</string>
-    <string name="search_language_hint" msgid="7004225294308793583">"Улсын хэлийг бичнэ үү"</string>
+    <string name="search_language_hint" msgid="7004225294308793583">"Хэлний нэрийг бичнэ үү"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"Санал болгосон"</string>
     <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"Санал болгосон"</string>
     <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"Санал болгосон хэл"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Туршилт"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Нийтийн"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Хиймэл дагуулд автоматаар холбогдсон"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Та мобайл эсвэл Wi-Fi сүлжээгүйгээр мессеж илгээх болон хүлээн авах боломжтой"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Мессежийг нээх"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index d96bb41..c10b7413 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"मोबाइल नेटवर्क उपलब्ध नाही"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"प्राधान्य दिलेले नेटवर्क बदलण्याचा प्रयत्न करा. बदलण्यासाठी टॅप करा."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"आणीबाणी कॉलिंग अनुपलब्ध"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"वाय-फाय वरून आणीबाणी कॉल करू शकत नाही"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"आणीबाणी कॉलसाठी मोबाइल नेटवर्क आवश्यक आहे"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"अलर्ट"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"कॉल फॉरवर्डिंग"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"इमर्जन्सी कॉलबॅक मोड"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"हटवा"</string>
     <string name="inputMethod" msgid="1784759500516314751">"इनपुट पद्धत"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"मजकूर क्रिया"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"या फील्डमध्ये हस्तलेखनला सपोर्ट नाही"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"पासवर्ड फील्डमध्ये हस्तलेखनला सपोर्ट नाही"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"मागे जा"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"इनपुट पद्धत स्विच करा"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"संचयन स्थान संपत आहे"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> द्वारे व्यवस्थापित"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"सुरू आहे"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"बंद आहे"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"कोणतेही कॅलेंडर"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> काही ध्‍वनी म्‍यूट करत आहे"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"आपल्‍या डिव्‍हाइसमध्‍ये अंतर्गत समस्‍या आहे आणि तुमचा फॅक्‍टरी डेटा रीसेट होईपर्यंत ती अस्‍थिर असू शकते."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"आपल्‍या डिव्‍हाइसमध्‍ये अंतर्गत समस्‍या आहे. तपशीलांसाठी आपल्‍या निर्मात्याशी संपर्क साधा."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"चाचणी"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"सामुदायिक"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"उपग्रहाशी आपोआप कनेक्ट केलेले आहे"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"तुम्ही मोबाइल किंवा वाय-फाय नेटवर्कशिवाय मेसेज पाठवू आणि मिळवू शकता"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages उघडा"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index d794ae0..4a4ea88 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Tidak dapat mencapai rangkaian mudah alih"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Cuba tukar rangkaian pilihan. Ketik untuk menukar."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Panggilan kecemasan tidak tersedia"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Tidak boleh membuat panggilan kecemasan melalui Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Rangkaian mudah alih diperlukan untuk membuat panggilan kecemasan"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Makluman"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Pemajuan panggilan"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mod paggil balik kecemasan"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Padam"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Kaedah input"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Tindakan teks"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Tulisan tangan tidak disokong dalam medan ini"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Tulisan tangan tidak disokong dalam medan kata laluan"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Kembali"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Tukar kaedah masukan"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ruang storan semakin berkurangan"</string>
@@ -1900,7 +1902,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"Penjimat Bateri menghidupkan tema Gelap dan mengehadkan atau mematikan aktiviti latar, sesetengah kesan visual, ciri tertentu dan sesetengah sambungan rangkaian."</string>
     <string name="battery_saver_description" msgid="8518809702138617167">"Penjimat Bateri menghidupkan tema Gelap dan mengehadkan atau mematikan aktiviti latar, sesetengah kesan visual, ciri tertentu dan sesetengah sambungan rangkaian."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Untuk membantu penggunaan data dikurangkan, Penjimat Data menghalang sesetengah apl daripada menghantar atau menerima data di latar. Apl yang sedang digunakan boleh mengakses data tetapi mungkin tidak secara kerap. Perkara ini mungkin bermaksud bahawa imej tidak dipaparkan sehingga anda mengetik pada imej itu, contohnya."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Untuk mengurangkan penggunaan data, Penjimat Data menghalang sesetengah apl daripada menghantar atau menerima data di latar. Apl yang sedang digunakan boleh mengakses data tetapi mungkin tidak secara kerap. Sebagai contoh, imej tidak dipaparkan sehingga anda mengetik pada imej itu."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Hidupkan Penjimat Data?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Hidupkan"</string>
     <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Selama satu minit (hingga{formattedTime})}other{Selama # minit (hingga {formattedTime})}}"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Diurus oleh <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Hidup"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Mati"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Sebarang kalendar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> meredamkan sesetengah bunyi"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Terdapat masalah dalaman dengan peranti anda. Peranti mungkin tidak stabil sehingga anda membuat tetapan semula data kilang."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Terdapat masalah dalaman dengan peranti anda. Hubungi pengilang untuk mengetahui butirannya."</string>
@@ -1988,7 +1993,7 @@
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Kecemasan"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Tetapkan kunci skrin"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Tetapkan kunci skrin"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Tetapkan kunci skrin pada peranti untuk guna ruang privasi"</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Tetapkan kunci skrin pada peranti untuk menggunakan ruang privasi"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Apl tidak tersedia"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak tersedia sekarang."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> tidak tersedia"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Ujian"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Umum"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Disambungkan secara automatik kepada satelit"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Anda boleh menghantar dan menerima mesej tanpa rangkaian mudah alih atau Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Buka Messages"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 825d3a6..8346134 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"မိုဘိုင်းကွန်ရက် လိုင်းမရပါ"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ဦးစားပေးကွန်ရက်သို့ ပြောင်းကြည့်ပါ။ ပြောင်းရန် တို့ပါ။"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"အရေးပေါ်ခေါ်ဆိုမှု မရနိုင်ပါ"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi‑Fi ဖြင့် အရေးပေါ်ခေါ်ဆိုမှုများ ပြုလုပ်၍မရပါ"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"အရေးပေါ်ဖုန်းခေါ်ရန် မိုဘိုင်းကွန်ရက် လိုအပ်သည်"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"သတိပေးချက်များ"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"အဝင်ခေါ်ဆိုမှုအား ထပ်ဆင့်ပို့ခြင်း"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"အရေးပေါ် ပြန်လည်ခေါ်ဆိုနိုင်သောမုဒ်"</string>
@@ -827,7 +827,7 @@
     <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"အခြားအက်ပ်များ ပိုင်ဆိုင်သော E2EE အဆက်အသွယ်ကီးများ၏ အတည်ပြုခြင်းအခြေအနေများကို အက်ပ်အား အပ်ဒိတ်လုပ်ခွင့်ပြုသည်"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"စကားဝှက်စည်းမျဥ်းကိုသတ်မှတ်ရန်"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"မျက်နှာပြင်သော့ခတ်သည့် စကားဝှက်များနှင့် PINများရှိ ခွင့်ပြုထားသည့် စာလုံးအရေအတွက်နှင့် အက္ခရာများအား ထိန်းချုပ်ရန်။"</string>
-    <string name="policylab_watchLogin" msgid="7599669460083719504">"မျက်နှာပြင်လော့ခ်ဖွင့်ရန် ကြိုးပမ်းမှုများကို စောင့်ကြည့်ပါ"</string>
+    <string name="policylab_watchLogin" msgid="7599669460083719504">"မျက်နှာပြင်လော့ခ်ဖွင့်ရန် ကြိုးပမ်းမှုများကို စောင့်ကြည့်ခြင်း"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"မျက်နှာပြင်ကို သော့ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက်၊ စကားဝှက် ရိုက်ထည့်မှု သိပ်များနေလျှင် တက်ဘလက်ကို သော့ခတ်ရန် သို့မဟုတ် တက်ဘလက် ဒေတာ အားလုံးကို ဖျက်ရန်။"</string>
     <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"မျက်နှာပြင်ကို လော့ခ်ဖွင့်သည့်အခါ စကားဝှက်မှားယွင်းစွာ ရိုက်သွင်းသည့်အကြိမ်ရေကို စောင့်ကြည့်ပြီး မှားယွင်းသည့်အကြိမ်ရေ အလွန်များလာပါက သင့် Android TV စက်ပစ္စည်းကို လော့ခ်ချခြင်း သို့မဟုတ် သင့် Android TV ရှိ အသုံးပြုသူဒေတာများအားလုံးကို ဖျက်ခြင်းတို့ ပြုလုပ်သွားပါမည်။"</string>
     <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"ဖန်သားပြင်လော့ခ်ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက် စကားဝှက် မမှန်မကန် ရိုက်ထည့်မှု များနေလျှင် သတင်းနှင့်ဖျော်ဖြေရေး စနစ်ကို လော့ခ်ချသည် (သို့) ၎င်း၏ ဒေတာအားလုံးကို ဖျက်သည်။"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"ဖျက်ရန်"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ထည့်သွင်းရန်နည်းလမ်း"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"စာတို လုပ်ဆောင်ချက်"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ဤအကွက်တွင် လက်ရေးကို မပံ့ပိုးပါ"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"စကားဝှက်အကွက်များတွင် လက်ရေးကို မပံ့ပိုးပါ"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"နောက်သို့"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"လက်ကွက်ပြောင်းရန်"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"သိမ်းဆည်သော နေရာ နည်းနေပါသည်"</string>
@@ -1898,8 +1900,8 @@
     <string name="package_updated_device_owner" msgid="7560272363805506941">"သင်၏ စီမံခန့်ခွဲသူက အပ်ဒိတ်လုပ်ထားသည်"</string>
     <string name="package_deleted_device_owner" msgid="2292335928930293023">"သင်၏ စီမံခန့်ခွဲသူက ဖျက်လိုက်ပါပြီ"</string>
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
-    <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"‘ဘက်ထရီ အားထိန်း’ က ‘အမှောင်နောက်ခံ’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့၊ ဝန်ဆောင်မှုအချို့နှင့် ကွန်ရက်ချိတ်ဆက်မှုအချို့တို့ကို ကန့်သတ်သည် သို့မဟုတ် ပိတ်သည်။"</string>
-    <string name="battery_saver_description" msgid="8518809702138617167">"‘ဘက်ထရီ အားထိန်း’ က ‘အမှောင်နောက်ခံ’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့၊ ဝန်ဆောင်မှုအချို့နှင့် ကွန်ရက်ချိတ်ဆက်မှုအချို့တို့ကို ကန့်သတ်သည် သို့မဟုတ် ပိတ်သည်။"</string>
+    <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"‘ဘက်ထရီ အားထိန်း’ က ‘အမှောင်နောက်ခံ’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ဖန်တီးပြသချက်အချို့၊ ဝန်ဆောင်မှုအချို့နှင့် ကွန်ရက်ချိတ်ဆက်မှုအချို့တို့ကို ကန့်သတ်သည် သို့မဟုတ် ပိတ်သည်။"</string>
+    <string name="battery_saver_description" msgid="8518809702138617167">"‘ဘက်ထရီ အားထိန်း’ က ‘အမှောင်နောက်ခံ’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ဖန်တီးပြသချက်အချို့၊ ဝန်ဆောင်မှုအချို့နှင့် ကွန်ရက်ချိတ်ဆက်မှုအချို့တို့ကို ကန့်သတ်သည် သို့မဟုတ် ပိတ်သည်။"</string>
     <string name="data_saver_description" msgid="4995164271550590517">"ဒေတာအသုံးလျှော့ချနိုင်ရန်အတွက် အက်ပ်များကို နောက်ခံတွင် ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းမပြုရန် \'ဒေတာချွေတာမှု\' စနစ်က တားဆီးထားပါသည်။ ယခုအက်ပ်ဖြင့် ဒေတာအသုံးပြုနိုင်သော်လည်း အကြိမ်လျှော့၍သုံးရပါမည်။ ဥပမာ၊ သင်က မတို့မချင်း ပုံများပေါ်လာမည် မဟုတ်ပါ။"</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"ဒေတာချွေတာမှုစနစ် ဖွင့်မလား။"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ဖွင့်ရန်"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> က စီမံသည်"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ဖွင့်"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ပိတ်"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">"၊ "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"မည်သည့်ပြက္ခဒိန်မဆို"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> သည် အချို့အသံကို ပိတ်နေသည်"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"သင့်ကိရိယာအတွင်းပိုင်းတွင် ပြဿနာရှိနေပြီး၊ မူလစက်ရုံထုတ်အခြေအနေအဖြစ် ပြန်လည်ရယူနိုင်သည်အထိ အခြေအနေမတည်ငြိမ်နိုင်ပါ။"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"သင့်ကိရိယာအတွင်းပိုင်းတွင် ပြဿနာရှိနေ၏။ အသေးစိတ်သိရန်အတွက် ပစ္စည်းထုတ်လုပ်သူအား ဆက်သွယ်ပါ။"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"စမ်းသပ်မှု"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"အများသုံး"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"ဂြိုဟ်တုနှင့် အလိုအလျောက် ချိတ်ဆက်ထားသည်"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"မိုဘိုင်း (သို့) Wi-Fi ကွန်ရက်မရှိဘဲ မက်ဆေ့ဂျ်များကို ပို့နိုင်၊ လက်ခံနိုင်သည်"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ဖွင့်ရန်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 3c07ba7..252b413 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Får ikke kontakt med mobilnettverket"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Prøv å endre foretrukket nettverk. Trykk for å endre."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Nødanrop er utilgjengelig"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Kan ikke ringe nødnumre via Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Du må være koblet til et mobilnettverk for å utføre nødanrop"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Varsler"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Viderekobling"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modusen nødsamtale-tilbakeringing"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Slett"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Inndatametode"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Teksthandlinger"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Håndskrift støttes ikke i dette feltet"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Håndskrift støttes ikke i passordfelt"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Tilbake"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Bytt inndatametode"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Lite ledig lagringsplass"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Administreres av <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"På"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Av"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Hvilken som helst kalender"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> slår av noen lyder"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Det har oppstått et internt problem på enheten din, og den kan være ustabil til du tilbakestiller den til fabrikkdata."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Det har oppstått et internt problem på enheten din. Ta kontakt med produsenten for mer informasjon."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Felles"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automatisk tilkoblet satellitt"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kan sende og motta meldinger uten mobil- eller wifi-nettverk"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Åpne Meldinger"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 8d0ac72..6035bb1 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"मोबाइल नेटवर्कमाथि पहुँच राख्न सकिएन"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"रुचाइएको नेटवर्क परिवर्तन गरी हेर्नुहोस्‌। परिवर्तन गर्न ट्याप गर्नुहोस्‌।"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"आपत्‌कालीन कल सेवा अनुपलब्ध छ"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi‑Fi मार्फत आपत्‌कालीन कल गर्न सकिँदैन"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"आपत्कालीन कलहरू गर्न मोबाइल नेटवर्क चाहिन्छ"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"अलर्टहरू"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"कल फर्वार्ड गर्ने सेवा"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"आपत्‌कालीन कलब्याक मोड"</string>
@@ -349,9 +349,9 @@
     <string name="capability_desc_canRequestFilterKeyEvents" msgid="2381315802405773092">"व्यक्तिगत डेटा जस्तै क्रेडिट कार्ड नम्बरहरू र पासवर्डहरू समावेश गर्दछ।"</string>
     <string name="capability_title_canControlMagnification" msgid="7701572187333415795">"डिस्प्ले म्याग्निफिकेसन नियन्त्रण गर्नुहोस्"</string>
     <string name="capability_desc_canControlMagnification" msgid="2206586716709254805">"डिस्प्लेको जुम लेबल र स्थिति नियन्त्रण गर्नुहोस्।"</string>
-    <string name="capability_title_canPerformGestures" msgid="9106545062106728987">"इसाराहरू सम्बन्धी कार्य गर्नुहोस्"</string>
-    <string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"ट्याप, स्वाइप गर्न, थिच्न र अन्य इसाराहरू सम्बन्धी कार्य गर्न सक्छ"</string>
-    <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"फिंगरप्रिन्टका इसाराहरू"</string>
+    <string name="capability_title_canPerformGestures" msgid="9106545062106728987">"जेस्चरहरू सम्बन्धी कार्य गर्नुहोस्"</string>
+    <string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"ट्याप, स्वाइप गर्न, थिच्न र अन्य जेस्चरहरू सम्बन्धी कार्य गर्न सक्छ"</string>
+    <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"फिंगरप्रिन्टका जेस्चरहरू"</string>
     <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"यसले यन्त्रक‍ो फिंगरप्रिन्टसम्बन्धी सेन्सरमा गरिएका इसाराहरूलाई खिच्‍न सक्छ।"</string>
     <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"स्क्रिनसट लिनुहोस्"</string>
     <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"डिस्प्लेको स्क्रिनसट लिन सकिन्छ।"</string>
@@ -373,9 +373,9 @@
     <string name="permlab_answerPhoneCalls" msgid="4131324833663725855">"फोन कलहरूको जवाफ दिनुहोस्"</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>
@@ -399,7 +399,7 @@
     <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>
@@ -513,9 +513,9 @@
     <string name="permlab_backgroundCamera" msgid="7549917926079731681">"ब्याकग्राउन्डमा फोटो खिच्नुहोस् तथा भिडियो रेकर्ड गर्नुहोस्"</string>
     <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"यो एपले जुनसुकै बेला क्यामेराको प्रयोग गरी फोटो खिच्न र भिडियो रेकर्ड गर्न सक्छ।"</string>
     <string name="permlab_systemCamera" msgid="3642917457796210580">"एप वा सेवालाई फोटो र भिडियो खिच्न प्रणालीका क्यामेराहरूमाथि पहुँच राख्न दिनुहोस्"</string>
-    <string name="permdesc_systemCamera" msgid="5938360914419175986">"प्रणालीको यस विशेषाधिकार प्राप्त अनुप्रयोगले जुनसुकै बेला प्रणालीको क्यामेरा प्रयोग गरी फोटो खिच्न र भिडियो रेकर्ड गर्न सक्छ। एपसँग पनि android.permission.CAMERA प्रयोग गर्ने अनुमति हुनु पर्छ"</string>
+    <string name="permdesc_systemCamera" msgid="5938360914419175986">"प्रणालीको यस विशेषाधिकार प्राप्त एपले जुनसुकै बेला प्रणालीको क्यामेरा प्रयोग गरी फोटो खिच्न र भिडियो रेकर्ड गर्न सक्छ। एपसँग पनि android.permission.CAMERA प्रयोग गर्ने अनुमति हुनु पर्छ"</string>
     <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"कुनै एप वा सेवालाई खोलिँदै वा बन्द गरिँदै गरेका क्यामेरा यन्त्रहरूका बारेमा कलब्याक प्राप्त गर्ने अनुमति दिनुहोस्।"</string>
-    <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"कुनै क्यामेरा यन्त्र खोलिँदा (कुन अनुप्रयोगले खोलेको भन्ने बारेमा) वा बन्द गरिँदा यो एपले कलब्याक प्राप्त गर्न सक्छ।"</string>
+    <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"कुनै क्यामेरा यन्त्र खोलिँदा (कुन एपले खोलेको भन्ने बारेमा) वा बन्द गरिँदा यो एपले कलब्याक प्राप्त गर्न सक्छ।"</string>
     <string name="permlab_cameraHeadlessSystemUser" msgid="680194666834500050">"कुनै एप वा सेवालाई हेडलेस सिस्टमको प्रयोगकर्ताका रूपमा क्यामेरा एक्सेस गर्ने अनुमति दिनुहोस्।"</string>
     <string name="permdesc_cameraHeadlessSystemUser" msgid="6963163319710996412">"यो एपले हेडलेस सिस्टमको प्रयोगकर्ताका रूपमा क्यामेरा एक्सेस गर्न सक्छ।"</string>
     <string name="permlab_vibrate" msgid="8596800035791962017">"कम्पन नियन्त्रण गर्नुहोस्"</string>
@@ -827,7 +827,7 @@
     <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"यसले एपलाई अन्य एपको स्वामित्वमा रहेका E2EE कन्ट्याक्ट कीहरूको प्रमाणीकरणको स्थिति अपडेट गर्न दिन्छ"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियमहरू मिलाउनुहोस्"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रिन लक पासवर्ड र PIN हरूमा अनुमति दिइएको लम्बाइ र वर्णहरूको नियन्त्रण गर्नुहोस्।"</string>
-    <string name="policylab_watchLogin" msgid="7599669460083719504">"मनिटरको स्क्रिन अनलक गर्ने प्रयासहरू"</string>
+    <string name="policylab_watchLogin" msgid="7599669460083719504">"स्क्रिन अनलक गर्न गरिएको प्रयासको अनुगमन गर्ने"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"स्क्रिन अनलक गर्दा गलत पासवर्ड टाइप भएको संख्या निरीक्षण गर्नुहोस् र यदि निकै धेरै गलत पासवर्डहरू टाइप भएका छन भने ट्याब्लेट लक गर्नुहोस् वा ट्याब्लेटका सबै डेटा मेट्नुहोस्।"</string>
     <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"स्क्रिन अनलक गर्दा गलत पासवर्ड टाइप गरेको सङ्ख्या निरीक्षण गर्नुहोस्, र धेरै पटक गलत पासवर्डहरू टाइप गरिएको खण्डमा आफ्नो Android टिभी यन्त्र लक गर्नुहोस् वा डिभाइसमा भएको सम्पूर्ण डेटा मेटाउनुहोस्।"</string>
     <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"स्क्रिन अनलक गर्दा कति पटक गलत पासवर्ड टाइप गरिन्छ भन्ने कुरा निगरानी गरियोस् र अत्यन्तै धेरै पटक गलत पासवर्ड टाइप गरिएका खण्डमा यो इन्फोटेनमेन्ट प्रणाली लक गरियोस् वा यस इन्फोटेनमेन्ट प्रणालीका सबै डेटा मेटाइयोस्।"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"मेट्नुहोस्"</string>
     <string name="inputMethod" msgid="1784759500516314751">"निवेश विधि"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"पाठ कार्यहरू"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"यो फिल्डमा हस्तलेखन गर्न मिल्दैन"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"पासवर्ड हाल्ने फिल्डहरूमा हस्तलेखन गर्न मिल्दैन"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"पछाडि"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"इनपुट विधि बदल्नुहोस्"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"भण्डारण ठाउँ सकिँदै छ"</string>
@@ -1561,7 +1563,7 @@
     <string name="sync_do_nothing" msgid="4528734662446469646">"अहिलेको लागि केही नगर्नुहोस्"</string>
     <string name="choose_account_label" msgid="5557833752759831548">"एउटा खाता छान्‍नुहोस्"</string>
     <string name="add_account_label" msgid="4067610644298737417">"खाता हाल्नुहोस्"</string>
-    <string name="add_account_button_label" msgid="322390749416414097">"खाता थप्नुहोस्"</string>
+    <string name="add_account_button_label" msgid="322390749416414097">"खाता हाल्नुहोस्"</string>
     <string name="number_picker_increment_button" msgid="7621013714795186298">"बढाउनुहोस्"</string>
     <string name="number_picker_decrement_button" msgid="5116948444762708204">"घटाउनुहोस्"</string>
     <string name="number_picker_increment_scroll_mode" msgid="8403893549806805985">"<xliff:g id="VALUE">%s</xliff:g> टच एण्ड होल्ड गर्नुहोस्।"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले व्यवस्थापन गरेको"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"अन छ"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"अफ छ"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"कुनै पनि पात्रो"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ले केही ध्वनिहरू म्युट गर्दै छ"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"तपाईंको यन्त्रसँग आन्तरिक समस्या छ, र तपाईंले फ्याक्ट्री डाटा रिसेट नगर्दासम्म यो अस्थिर रहन्छ।"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"तपाईंको यन्त्रसँग आन्तरिक समस्या छ। विवरणहरूको लागि आफ्नो निर्मातासँग सम्पर्क गर्नुहोस्।"</string>
@@ -2095,7 +2100,7 @@
     <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_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>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"परीक्षण"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"सामुदायिक"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"स्याटलाइटमा स्वतः कनेक्ट गरियो"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"तपाईं मोबाइल वा Wi-Fi नेटवर्कविनै म्यासेज पठाउन र प्राप्त गर्न सक्नुहुन्छ"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages खोल्नुहोस्"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index bc2fc69..5870ca3 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Kan mobiel netwerk niet bereiken"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Probeer een ander voorkeursnetwerk. Tik om te wijzigen."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Noodoproepen niet beschikbaar"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Er kunnen geen noodoproepen worden gemaakt via wifi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Voor noodoproepen is een mobiel netwerk vereist"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Meldingen"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Gesprek doorschakelen"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modus voor noodoproepen"</string>
@@ -255,7 +255,7 @@
     <string name="global_action_lock" msgid="6949357274257655383">"Schermvergrendeling"</string>
     <string name="global_action_power_off" msgid="4404936470711393203">"Uitzetten"</string>
     <string name="global_action_power_options" msgid="1185286119330160073">"Aan/uit"</string>
-    <string name="global_action_restart" msgid="4678451019561687074">"Opnieuw opstarten"</string>
+    <string name="global_action_restart" msgid="4678451019561687074">"Herstarten"</string>
     <string name="global_action_emergency" msgid="1387617624177105088">"Noodgeval"</string>
     <string name="global_action_bug_report" msgid="5127867163044170003">"Bugrapport"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"Sessie beëindigen"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Verwijderen"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Invoermethode"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Tekstacties"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handschrift wordt in dit veld niet ondersteund"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handschrift wordt niet ondersteund in wachtwoordvelden"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Terug"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Invoermethode wijzigen"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Opslagruimte is bijna vol"</string>
@@ -1646,7 +1648,7 @@
     <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefoon"</string>
     <string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dockluidsprekers"</string>
     <string name="default_audio_route_name_external_device" msgid="8124229858618975">"Extern apparaat"</string>
-    <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Hoofdtelefoon"</string>
+    <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Koptelefoon"</string>
     <string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string>
     <string name="default_audio_route_category_name" msgid="5241740395748134483">"Systeem"</string>
     <string name="bluetooth_a2dp_audio_route_name" msgid="4214648773120426288">"Bluetooth-audio"</string>
@@ -1864,7 +1866,7 @@
     <string name="print_service_installed_title" msgid="6134880817336942482">"<xliff:g id="NAME">%s</xliff:g>-service geïnstalleerd"</string>
     <string name="print_service_installed_message" msgid="7005672469916968131">"Tik om aan te zetten"</string>
     <string name="restr_pin_enter_admin_pin" msgid="1199419462726962697">"Beheerderspincode invoeren"</string>
-    <string name="restr_pin_enter_pin" msgid="373139384161304555">"Geef de pincode op"</string>
+    <string name="restr_pin_enter_pin" msgid="373139384161304555">"Voer pincode in"</string>
     <string name="restr_pin_incorrect" msgid="3861383632940852496">"Onjuist"</string>
     <string name="restr_pin_enter_old_pin" msgid="7537079094090650967">"Huidige pincode"</string>
     <string name="restr_pin_enter_new_pin" msgid="3267614461844565431">"Nieuwe pincode"</string>
@@ -1922,11 +1924,14 @@
     <string name="zen_mode_downtime_feature_name" msgid="5886005761431427128">"Downtime"</string>
     <string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"Doordeweekse avond"</string>
     <string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"Weekend"</string>
-    <string name="zen_mode_default_events_name" msgid="2280682960128512257">"Afspraken"</string>
+    <string name="zen_mode_default_events_name" msgid="2280682960128512257">"Afspraak"</string>
     <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"Slapen"</string>
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Beheerd door <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aan"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Uit"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Elke agenda"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> zet sommige geluiden uit"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Er is een intern probleem met je apparaat. Het apparaat kan instabiel zijn totdat u het apparaat terugzet naar de fabrieksinstellingen."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Er is een intern probleem met je apparaat. Neem contact op met de fabrikant voor meer informatie."</string>
@@ -1988,7 +1993,7 @@
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Noodgeval"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Schermvergrendeling instellen"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Schermvergrendeling instellen"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Als je je privéruimte wilt gebruiken, stel je een schermvergrendeling op dit apparaat in"</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Als je je privégedeelte wilt gebruiken, stel je een schermvergrendeling op dit apparaat in"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"App is niet beschikbaar"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> is momenteel niet beschikbaar."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> niet beschikbaar"</string>
@@ -2198,7 +2203,7 @@
     <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Deze content kan niet worden geopend met werk-apps"</string>
     <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Deze content kan niet worden gedeeld met persoonlijke apps"</string>
     <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Deze content kan niet worden geopend met persoonlijke apps"</string>
-    <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Werk-apps zijn onderbroken"</string>
+    <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Werk-apps zijn gepauzeerd"</string>
     <string name="resolver_switch_on_work" msgid="4527096360772311894">"Hervatten"</string>
     <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Geen werk-apps"</string>
     <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Geen persoonlijke apps"</string>
@@ -2329,7 +2334,7 @@
     <string name="window_magnification_prompt_content" msgid="8159173903032344891">"Je kunt nu een deel van je scherm vergroten"</string>
     <string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aanzetten in Instellingen"</string>
     <string name="dismiss_action" msgid="1728820550388704784">"Sluiten"</string>
-    <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Blokkeren van apparaatmicrofoon opheffen"</string>
+    <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Microfoon van apparaat niet meer blokkeren"</string>
     <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Blokkeren van apparaatcamera opheffen"</string>
     <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Voor &lt;b&gt;<xliff:g id="APP">%s</xliff:g>&lt;/b&gt; en alle andere apps en services"</string>
     <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Niet meer blokkeren"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Gemeenschappelijk"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automatisch verbonden met satelliet"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Je kunt berichten sturen en krijgen zonder een mobiel of wifi-netwerk"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Berichten openen"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 1b68a74..4174d04 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ମୋବାଇଲ୍‌ ନେଟ୍‌ୱର୍କ ମିଳୁନାହିଁ"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ନିଜ ପସନ୍ଦର ନେଟ୍‌ୱର୍କକୁ ଯିବାପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ। ବଦଳାଇବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"ଜରୁରୀକାଳୀନ କଲ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"ୱାଇ-ଫାଇ ସାହାଯ୍ୟରେ ଜରୁରୀକାଳୀନ କଲ୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ଜରୁରୀକାଳୀନ କଲ କରିବା ପାଇଁ ଏକ ମୋବାଇଲ ନେଟୱାର୍କ ଆବଶ୍ୟକ"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"ଆଲର୍ଟ"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"କଲ୍‌ ଫରୱାର୍ଡିଂ"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"ଜରୁରୀକାଳୀନ କଲବ୍ୟାକ୍‍ ମୋଡ୍‍"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"ଡିଲିଟ କରନ୍ତୁ"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ଇନପୁଟ୍ ପଦ୍ଧତି"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"ଟେକ୍ସଟ୍‌ କାର୍ଯ୍ୟ"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ଏହି ଫିଲ୍ଡରେ ହେଣ୍ଡରାଇଟିଂ ସମର୍ଥିତ ନୁହେଁ"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ପାସୱାର୍ଡ ଫିଲ୍ଡଗୁଡ଼ିକରେ ହେଣ୍ଡରାଇଟିଂ ସମର୍ଥିତ ନୁହେଁ"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ପଛକୁ ଫେରନ୍ତୁ"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ଇନପୁଟ ପଦ୍ଧତି ସ୍ୱିଚ କରନ୍ତୁ"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"ଷ୍ଟୋରେଜ୍‌ ସ୍ପେସ୍‌ ଶେଷ ହେବାରେ ଲାଗିଛି"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ଚାଲୁ ଅଛି"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ବନ୍ଦ ଅଛି"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ଯେକୌଣସି କ୍ୟାଲେଣ୍ଡର୍‌"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> କିଛି ସାଉଣ୍ଡକୁ ମ୍ୟୁଟ୍ କରୁଛି"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"ଆପଣଙ୍କ ଡିଭାଇସ୍‍ରେ ଏକ ସମସ୍ୟା ରହିଛି ଏବଂ ଆପଣ ଫ୍ୟାକ୍ଟୋରୀ ଡାଟା ରିସେଟ୍‍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଅସ୍ଥିର ରହିପାରେ।"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"ଆପଣଙ୍କ ଡିଭାଇସରେ ଏକ ସମସ୍ୟା ରହିଛି। ବିବରଣୀ ପାଇଁ ଆପଣଙ୍କ ଉତ୍ପାଦକଙ୍କ ସହ କଣ୍ଟାକ୍ଟ କରନ୍ତୁ।"</string>
@@ -1971,7 +1976,7 @@
     <string name="supervised_user_creation_label" msgid="6884904353827427515">"ନିରୀକ୍ଷିତ ୟୁଜର ଯୋଗ କରନ୍ତୁ"</string>
     <string name="language_selection_title" msgid="52674936078683285">"ଏକ ଭାଷା ଯୋଗ କରନ୍ତୁ"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"ପସନ୍ଦର ଅଞ୍ଚଳ"</string>
-    <string name="search_language_hint" msgid="7004225294308793583">"ଭାଷାର ନାମ ଟାଇପ୍‍ କରନ୍ତୁ"</string>
+    <string name="search_language_hint" msgid="7004225294308793583">"ଭାଷାର ନାମ ଟାଇପ କରନ୍ତୁ"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"ପ୍ରସ୍ତାବିତ"</string>
     <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"ପ୍ରସ୍ତାବିତ"</string>
     <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"ପ୍ରସ୍ତାବିତ ଭାଷାଗୁଡ଼ିକ"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"ଟେଷ୍ଟ"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"କମ୍ୟୁନାଲ"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"ସାଟେଲାଇଟ ସହ ସ୍ୱତଃ କନେକ୍ଟ ହୋଇଛି"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"ଏକ ମୋବାଇଲ କିମ୍ବା ୱାଇ-ଫାଇ ନେଟୱାର୍କ ବିନା ଆପଣ ମେସେଜ ପଠାଇପାରିବେ ଏବଂ ପାଇପାରିବେ"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ଖୋଲନ୍ତୁ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 439190b..3e7b27e 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਨੂੰ ਬਦਲ ਕੇ ਦੇਖੋ। ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਿੰਗ ਉਪਲਬਧ ਨਹੀਂ"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"ਵਾਈ-ਫਾਈ ਰਾਹੀਂ ਸੰਕਟਕਾਲੀਨ ਕਾਲਾਂ ਨਹੀਂ ਕਰ ਸਕਦੇ"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ਐਮਰਜੈਂਸੀ ਕਾਲਾਂ ਲਈ ਕਿਸੇ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"ਅਲਰਟ"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"ਕਾਲ ਫਾਰਵਰਡਿੰਗ"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਬੈਕ ਮੋਡ"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"ਮਿਟਾਓ"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ਇਨਪੁੱਟ ਵਿਧੀ"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"ਟੈਕਸਟ ਕਿਰਿਆਵਾਂ"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ਇਸ ਖੇਤਰ ਵਿੱਚ ਲਿਖਾਈ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ਪਾਸਵਰਡ ਖੇਤਰਾਂ ਵਿੱਚ ਲਿਖਾਈ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ਪਿੱਛੇ"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ਇਨਪੁੱਟ ਵਿਧੀ ਨੂੰ ਸਵਿੱਚ ਕਰੋ"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"ਸਟੋਰੇਜ ਦੀ ਜਗ੍ਹਾ ਖਤਮ ਹੋ ਰਹੀ ਹੈ"</string>
@@ -1559,7 +1561,7 @@
     <string name="sync_really_delete" msgid="5657871730315579051">"ਆਈਟਮਾਂ ਹਟਾਓ"</string>
     <string name="sync_undo_deletes" msgid="5786033331266418896">"ਮਿਟਾਏ ਗਏ ਨੂੰ ਅਣਕੀਤਾ ਕਰੋ"</string>
     <string name="sync_do_nothing" msgid="4528734662446469646">"ਹੁਣ ਕੁਝ ਨਾ ਕਰੋ"</string>
-    <string name="choose_account_label" msgid="5557833752759831548">"ਇੱਕ ਖਾਤਾ ਚੁਣੋ"</string>
+    <string name="choose_account_label" msgid="5557833752759831548">"ਕੋਈ ਖਾਤਾ ਚੁਣੋ"</string>
     <string name="add_account_label" msgid="4067610644298737417">"ਇੱਕ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
     <string name="add_account_button_label" msgid="322390749416414097">"ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
     <string name="number_picker_increment_button" msgid="7621013714795186298">"ਵਧਾਓ"</string>
@@ -1900,7 +1902,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"ਠੀਕ ਹੈ"</string>
     <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"ਬੈਟਰੀ ਸੇਵਰ ਗੂੜ੍ਹੇ ਥੀਮ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ, ਕੁਝ ਦ੍ਰਿਸ਼ਟੀਗਤ ਪ੍ਰਭਾਵਾਂ, ਕੁਝ ਖਾਸ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਕੁਝ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨਾਂ ਨੂੰ ਸੀਮਤ ਜਾਂ ਬੰਦ ਕਰਦਾ ਹੈ।"</string>
     <string name="battery_saver_description" msgid="8518809702138617167">"ਬੈਟਰੀ ਸੇਵਰ ਗੂੜ੍ਹੇ ਥੀਮ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ, ਕੁਝ ਦ੍ਰਿਸ਼ਟੀਗਤ ਪ੍ਰਭਾਵਾਂ, ਕੁਝ ਖਾਸ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਕੁਝ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨਾਂ ਨੂੰ ਸੀਮਤ ਜਾਂ ਬੰਦ ਕਰਦਾ ਹੈ।"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"ਡਾਟਾ ਵਰਤੋਂ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਨ ਲਈ, ਡਾਟਾ ਸੇਵਰ ਕੁਝ ਐਪਾਂ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟਾ ਭੇਜਣ ਜਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਰੋਕਦਾ ਹੈ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਵਰਤਮਾਨ ਤੌਰ \'ਤੇ ਵਰਤੀ ਜਾ ਰਹੀ ਐਪ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਪਰ ਉਹ ਇੰਝ ਕਦੇ-ਕਦਾਈਂ ਕਰ ਸਕਦੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸ ਦਾ ਮਤਲਬ ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਚਿੱਤਰ ਉਦੋਂ ਤੱਕ ਨਹੀਂ ਦਿਖਾਏ ਜਾਂਦੇ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਨ੍ਹਾਂ \'ਤੇ ਟੈਪ ਨਹੀਂ ਕਰਦੇ।"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"ਡਾਟਾ ਵਰਤੋਂ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਨ ਲਈ, ਡਾਟਾ ਸੇਵਰ ਵਿਸ਼ੇਸ਼ਤਾ ਕੁਝ ਐਪਾਂ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟਾ ਭੇਜਣ ਜਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਰੋਕਦੀ ਹੈ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਮੌਜੂਦਾ ਤੌਰ \'ਤੇ ਵਰਤੀ ਜਾ ਰਹੀ ਐਪ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਪਰ ਉਹ ਇੰਝ ਕਦੇ-ਕਦਾਈਂ ਕਰ ਸਕਦੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸ ਦਾ ਮਤਲਬ ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਚਿੱਤਰ ਉਦੋਂ ਤੱਕ ਨਹੀਂ ਦਿਖਾਏ ਜਾਂਦੇ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਨ੍ਹਾਂ \'ਤੇ ਟੈਪ ਨਹੀਂ ਕਰਦੇ।"</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"ਕੀ ਡਾਟਾ ਸੇਵਰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"ਚਾਲੂ ਕਰੋ"</string>
     <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{ਇੱਕ ਮਿੰਟ ਲਈ ({formattedTime} ਤੱਕ)}one{# ਮਿੰਟ ਲਈ ({formattedTime} ਤੱਕ)}other{# ਮਿੰਟਾਂ ਲਈ ({formattedTime} ਤੱਕ)}}"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ਚਾਲੂ ਹੈ"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ਬੰਦ ਹੈ"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ਕੋਈ ਵੀ ਕੈਲੰਡਰ"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ਕੁਝ ਧੁਨੀਆਂ ਨੂੰ ਮਿਊਟ ਕਰ ਰਹੀ ਹੈ"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਇੱਕ ਅੰਦਰੂਨੀ ਸਮੱਸਿਆ ਹੈ ਅਤੇ ਇਹ ਅਸਥਿਰ ਹੋ ਸਕਦੀ ਹੈ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ ਨਹੀਂ ਕਰਦੇ।"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਇੱਕ ਅੰਦਰੂਨੀ ਸਮੱਸਿਆ ਸੀ। ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਨਿਰਮਾਤਾ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"ਜਾਂਚ"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"ਭਾਈਚਾਰਕ"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"ਸੈਟੇਲਾਈਟ ਨਾਲ ਸਵੈ-ਕਨੈਕਟ ਹੋਇਆ"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"ਤੁਸੀਂ ਮੋਬਾਈਲ ਜਾਂ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਤੋਂ ਬਿਨਾਂ ਸੁਨੇਹੇ ਭੇਜ ਅਤੇ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ਐਪ ਖੋਲ੍ਹੋ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 8f742eb..ca126f7 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -86,7 +86,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Brak zasięgu sieci komórkowej"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Spróbuj zmienić preferowaną sieć. Kliknij, by zmienić."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Połączenia alarmowe są niedostępne"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Nie można nawiązywać połączeń alarmowych przez Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Połączenia alarmowe wymagają sieci komórkowej"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alerty"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Przekierowanie połączeń"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Tryb alarmowego połączenia zwrotnego"</string>
@@ -1185,6 +1185,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Usuń"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Sposób wprowadzania tekstu"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Działania na tekście"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"To pole nie obsługuje pisma odręcznego"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Pola haseł nie obsługują pisma odręcznego"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Wstecz"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Przełącz metodę wprowadzania"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Kończy się miejsce"</string>
@@ -1315,7 +1317,7 @@
     <string name="volume_unknown" msgid="4041914008166576293">"Głośność"</string>
     <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Głośność Bluetooth"</string>
     <string name="volume_icon_description_ringer" msgid="2187800636867423459">"Głośność dzwonka"</string>
-    <string name="volume_icon_description_incall" msgid="4491255105381227919">"Głośność w czasie połączenia"</string>
+    <string name="volume_icon_description_incall" msgid="4491255105381227919">"Głośność połączeń"</string>
     <string name="volume_icon_description_media" msgid="4997633254078171233">"Głośność multimediów"</string>
     <string name="volume_icon_description_notification" msgid="579091344110747279">"Głośność powiadomień"</string>
     <string name="ringtone_default" msgid="9118299121288174597">"Dzwonek domyślny"</string>
@@ -1929,6 +1931,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Zarządzana przez aplikację <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Włączono"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Wyłączono"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Dowolny kalendarz"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> wycisza niektóre dźwięki"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"W Twoim urządzeniu wystąpił problem wewnętrzny. Może być ono niestabilne, dopóki nie przywrócisz danych fabrycznych."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"W Twoim urządzeniu wystąpił problem wewnętrzny. Skontaktuj się z jego producentem, by otrzymać szczegółowe informacje."</string>
@@ -2391,6 +2396,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Testowy"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Wspólny"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automatycznie połączono z satelitą"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Możesz wymieniać wiadomości bez dostępu do sieci komórkowej lub Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otwórz Wiadomości"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 786e582..c53b1d5 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Não foi possível acessar a rede móvel"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Tente alterar a rede preferencial. Toque para alterar."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Chamadas de emergência indisponíveis"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Não é possível fazer chamadas de emergência por Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"As chamadas de emergência exigem uma rede móvel"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertas"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Encaminhamento de chamada"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modo de retorno de chamada de emergência"</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Excluir"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Método de entrada"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Ações de texto"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Não há suporte para escrita à mão neste campo"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Não há suporte para escrita à mão em campos de senha"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Voltar"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Mudar o método de entrada"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Pouco espaço de armazenamento"</string>
@@ -1741,7 +1743,7 @@
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Usar atalho"</string>
     <string name="color_inversion_feature_name" msgid="2672824491933264951">"Inversão de cores"</string>
     <string name="color_correction_feature_name" msgid="7975133554160979214">"Correção de cor"</string>
-    <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"Modo para uma mão"</string>
+    <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"Modo uma mão"</string>
     <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Escurecer a tela"</string>
     <string name="hearing_aids_feature_name" msgid="1125892105105852542">"Aparelhos auditivos"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Teclas de volume pressionadas. Serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ativado."</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gerenciada pelo app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Ativada"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desativada"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> a <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Qualquer agenda"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> está silenciando alguns sons"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Há um problema interno com seu dispositivo. Ele pode ficar instável até que você faça a redefinição para configuração original."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Há um problema interno com seu dispositivo. Entre em contato com o fabricante para saber mais detalhes."</string>
@@ -1972,7 +1977,7 @@
     <string name="supervised_user_creation_label" msgid="6884904353827427515">"Adicionar usuário supervisionado"</string>
     <string name="language_selection_title" msgid="52674936078683285">"Adicionar um idioma"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"Preferência de região"</string>
-    <string name="search_language_hint" msgid="7004225294308793583">"Digitar nome do idioma"</string>
+    <string name="search_language_hint" msgid="7004225294308793583">"Digite o nome do idioma"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"Sugeridos"</string>
     <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"Sugestões"</string>
     <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"Idiomas sugeridos"</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Teste"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Público"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Conectado automaticamente ao satélite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Você pode enviar e receber mensagens sem um dispositivo móvel ou uma rede Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir o app Mensagens"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 4418acd..6b6f5c5 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Não é possível estabelecer ligação à rede móvel."</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Experimente alterar a rede preferida. Toque para alterar."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Chamadas de emergência indisponíveis"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Não é possível efetuar chamadas de emergência através de Wi‑Fi."</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"As chamadas de emergência requerem uma rede móvel"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertas"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Reencaminhamento de chamadas"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modo de chamada de retorno de emergência"</string>
@@ -1148,7 +1148,7 @@
     <string name="duration_days_shortest_future" msgid="3392722163935571543">"em <xliff:g id="COUNT">%d</xliff:g> d"</string>
     <string name="duration_years_shortest_future" msgid="5537464088352970388">"em <xliff:g id="COUNT">%d</xliff:g> a"</string>
     <string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Há # minuto}many{Há # minutos}other{Há # minutos}}"</string>
-    <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Há # hora}many{Há # horas}other{Há # horas}}"</string>
+    <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{há # hora}many{há # horas}other{há # horas}}"</string>
     <string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Há # dia}many{Há # dias}other{Há # dias}}"</string>
     <string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Há # ano}many{Há # anos}other{Há # anos}}"</string>
     <string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Eliminar"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Método de entrada"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Acções de texto"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"A escrita manual não é suportada neste campo"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"A escrita manual não é suportada nos campos de palavras-passe"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Voltar"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Alternar o método de introdução"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Está quase sem espaço de armazenamento"</string>
@@ -1310,13 +1312,13 @@
     <string name="volume_call" msgid="7625321655265747433">"Volume da chamada recebida"</string>
     <string name="volume_bluetooth_call" msgid="2930204618610115061">"Volume de chamada recebida em Bluetooth"</string>
     <string name="volume_alarm" msgid="4486241060751798448">"Volume do alarme"</string>
-    <string name="volume_notification" msgid="6864412249031660057">"Volume de notificações"</string>
+    <string name="volume_notification" msgid="6864412249031660057">"Volume das notificações"</string>
     <string name="volume_unknown" msgid="4041914008166576293">"Volume"</string>
     <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Volume de Bluetooth"</string>
     <string name="volume_icon_description_ringer" msgid="2187800636867423459">"Volume do toque"</string>
     <string name="volume_icon_description_incall" msgid="4491255105381227919">"Volume de chamadas"</string>
     <string name="volume_icon_description_media" msgid="4997633254078171233">"Volume de multimédia"</string>
-    <string name="volume_icon_description_notification" msgid="579091344110747279">"Volume de notificações"</string>
+    <string name="volume_icon_description_notification" msgid="579091344110747279">"Volume das notificações"</string>
     <string name="ringtone_default" msgid="9118299121288174597">"Toque predefinido"</string>
     <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Predefinição (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
     <string name="ringtone_silent" msgid="397111123930141876">"Nenhum"</string>
@@ -1901,7 +1903,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
     <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"A Poupança de bateria ativa o tema escuro e limita ou desativa a atividade em segundo plano, alguns efeitos visuais, determinadas funcionalidades e algumas ligações de rede."</string>
     <string name="battery_saver_description" msgid="8518809702138617167">"A Poupança de bateria ativa o tema escuro e limita ou desativa a atividade em segundo plano, alguns efeitos visuais, determinadas funcionalidades e algumas ligações de rede."</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas apps enviem ou recebam dados em segundo plano. Uma determinada app que esteja a utilizar atualmente pode aceder aos dados, mas é possível que o faça com menos frequência. Isto pode significar, por exemplo, que as imagens não são apresentadas até que toque nas mesmas."</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas apps enviem ou recebam dados em segundo plano. Qualquer app que esteja a usar atualmente pode aceder aos dados, mas é possível que o faça com menos frequência. Isto pode significar, por exemplo, que as imagens não são apresentadas até que toque nelas."</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar a Poupança de dados?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string>
     <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{Durante um minuto (até à[s] {formattedTime})}many{Durante # minutos (até à[s] {formattedTime})}other{Durante # minutos (até à[s] {formattedTime})}}"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gerido por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Ativada"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desativada"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Qualquer calendário"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> está a desativar alguns sons."</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Existe um problema interno no seu dispositivo e pode ficar instável até efetuar uma reposição de dados de fábrica."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Existe um problema interno no seu dispositivo. Contacte o fabricante para obter mais informações."</string>
@@ -1972,7 +1977,7 @@
     <string name="supervised_user_creation_label" msgid="6884904353827427515">"Adicionar utilizador supervisionado"</string>
     <string name="language_selection_title" msgid="52674936078683285">"Adicionar um idioma"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"Preferência de região"</string>
-    <string name="search_language_hint" msgid="7004225294308793583">"Intr. nome do idioma"</string>
+    <string name="search_language_hint" msgid="7004225294308793583">"Introduza o idioma"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"Sugeridos"</string>
     <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"Sugeridas"</string>
     <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"Idiomas sugeridos"</string>
@@ -1989,7 +1994,7 @@
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Emergência"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Defina um bloqueio de ecrã"</string>
     <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Definir bloqueio de ecrã"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Para usar espaço privado, defina bloqueio de ecrã no disp."</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Defina um bloqueio para usar o espaço privado"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"A app não está disponível"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"De momento, a app <xliff:g id="APP_NAME">%1$s</xliff:g> não está disponível."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> indisponível"</string>
@@ -2066,7 +2071,7 @@
     <string name="autofill_update_title_with_2types" msgid="1797514386321086273">"Quer atualizar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
     <string name="autofill_update_title_with_3types" msgid="8285767070604652626">"Atualizar estes itens no serviço "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>": <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g>?"</string>
     <string name="autofill_save_yes" msgid="8035743017382012850">"Guardar"</string>
-    <string name="autofill_save_no" msgid="9212826374207023544">"Não, obrigado"</string>
+    <string name="autofill_save_no" msgid="9212826374207023544">"Não"</string>
     <string name="autofill_save_notnow" msgid="2853932672029024195">"Agora não"</string>
     <string name="autofill_save_never" msgid="6821841919831402526">"Nunca"</string>
     <string name="autofill_update_yes" msgid="4608662968996874445">"Atualizar"</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Teste"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Comum"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Ligação de satélite estabelecida automaticamente"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Pode enviar e receber mensagens sem uma rede móvel ou Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abre a app Mensagens"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 786e582..c53b1d5 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Não foi possível acessar a rede móvel"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Tente alterar a rede preferencial. Toque para alterar."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Chamadas de emergência indisponíveis"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Não é possível fazer chamadas de emergência por Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"As chamadas de emergência exigem uma rede móvel"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertas"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Encaminhamento de chamada"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modo de retorno de chamada de emergência"</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Excluir"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Método de entrada"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Ações de texto"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Não há suporte para escrita à mão neste campo"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Não há suporte para escrita à mão em campos de senha"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Voltar"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Mudar o método de entrada"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Pouco espaço de armazenamento"</string>
@@ -1741,7 +1743,7 @@
     <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Usar atalho"</string>
     <string name="color_inversion_feature_name" msgid="2672824491933264951">"Inversão de cores"</string>
     <string name="color_correction_feature_name" msgid="7975133554160979214">"Correção de cor"</string>
-    <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"Modo para uma mão"</string>
+    <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"Modo uma mão"</string>
     <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Escurecer a tela"</string>
     <string name="hearing_aids_feature_name" msgid="1125892105105852542">"Aparelhos auditivos"</string>
     <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Teclas de volume pressionadas. Serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ativado."</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gerenciada pelo app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Ativada"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desativada"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> a <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Qualquer agenda"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> está silenciando alguns sons"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Há um problema interno com seu dispositivo. Ele pode ficar instável até que você faça a redefinição para configuração original."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Há um problema interno com seu dispositivo. Entre em contato com o fabricante para saber mais detalhes."</string>
@@ -1972,7 +1977,7 @@
     <string name="supervised_user_creation_label" msgid="6884904353827427515">"Adicionar usuário supervisionado"</string>
     <string name="language_selection_title" msgid="52674936078683285">"Adicionar um idioma"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"Preferência de região"</string>
-    <string name="search_language_hint" msgid="7004225294308793583">"Digitar nome do idioma"</string>
+    <string name="search_language_hint" msgid="7004225294308793583">"Digite o nome do idioma"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"Sugeridos"</string>
     <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"Sugestões"</string>
     <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"Idiomas sugeridos"</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Teste"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Público"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Conectado automaticamente ao satélite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Você pode enviar e receber mensagens sem um dispositivo móvel ou uma rede Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir o app Mensagens"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index bc2eae1..5a449e3 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Nu se poate stabili conexiunea la rețeaua mobilă"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Încearcă să schimbi rețeaua preferată. Atinge pentru a schimba."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Apelurile de urgență nu sunt disponibile"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Nu poți face apeluri de urgență prin Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Apelurile de urgență necesită o rețea mobilă"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Alerte"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Redirecționarea apelurilor"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mod de apelare inversă de urgență"</string>
@@ -828,7 +828,7 @@
     <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Permite aplicației să actualizeze starea verificării cheilor E2EE deținute de alte aplicații"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Să seteze reguli pentru parolă"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"Stabilește lungimea și tipul de caractere permise pentru parolele și codurile PIN de blocare a ecranului."</string>
-    <string name="policylab_watchLogin" msgid="7599669460083719504">"Să monitorizeze încercările de deblocare a ecranului"</string>
+    <string name="policylab_watchLogin" msgid="7599669460083719504">"să monitorizeze încercările de deblocare a ecranului"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează tableta sau șterge datele acesteia dacă sunt introduse prea multe parole incorecte."</string>
     <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează dispozitivul Android TV sau șterge toate datele de pe acesta dacă se introduc prea multe parole incorecte."</string>
     <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează sistemul de infotainment sau șterge toate datele acestuia dacă sunt introduse prea multe parole incorecte."</string>
@@ -841,7 +841,7 @@
     <string name="policydesc_resetPassword" msgid="4626419138439341851">"Modifică blocarea ecranului."</string>
     <string name="policylab_forceLock" msgid="7360335502968476434">"Să blocheze ecranul"</string>
     <string name="policydesc_forceLock" msgid="1008844760853899693">"Stabilește cum și când se blochează ecranul."</string>
-    <string name="policylab_wipeData" msgid="1359485247727537311">"Să șteargă toate datele"</string>
+    <string name="policylab_wipeData" msgid="1359485247727537311">"să șteargă toate datele"</string>
     <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Șterge datele de pe tabletă fără avertisment, efectuând resetarea configurării din fabrică."</string>
     <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Șterge datele de pe dispozitivul Android TV fără avertisment, efectuând o revenire la setările din fabrică."</string>
     <string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"Șterge datele din sistemul de infotainment fără avertisment, prin revenirea la setările din fabrică."</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Șterge"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Metodă de intrare"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Acțiuni pentru text"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Scrierea de mână nu este acceptată în acest câmp"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Scrierea de mână nu este acceptată în câmpurile pentru parole"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Înapoi"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Schimbă metoda de introducere"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Spațiul de stocare aproape ocupat"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gestionat de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activată"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Dezactivată"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Orice calendar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> dezactivează anumite sunete"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"A apărut o problemă internă pe dispozitiv, iar acesta poate fi instabil până la revenirea la setările din fabrică."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"A apărut o problemă internă pe dispozitiv. Pentru detalii, contactează producătorul."</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Comun"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"S-a conectat automat la satelit"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Poți să trimiți și să primești mesaje fără o rețea mobilă sau Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Deschide Mesaje"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index a476bca..59982ef 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -86,7 +86,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Мобильная сеть недоступна"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Нажмите, чтобы выбрать другую сеть."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Экстренные вызовы недоступны"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Экстренные вызовы по Wi‑Fi недоступны."</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Для экстренных вызовов нужна мобильная сеть."</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Оповещения"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Переадресация вызовов"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Режим экстренных обратных вызовов"</string>
@@ -1185,6 +1185,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Удалить"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Способ ввода"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Операции с текстом"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Это поле не поддерживает рукописный ввод"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Поля для указания пароля не поддерживают рукописный ввод"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Сменить способ ввода"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Недостаточно памяти"</string>
@@ -1283,7 +1285,7 @@
     <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Запуск приложений."</string>
     <string name="android_upgrading_complete" msgid="409800058018374746">"Окончание загрузки..."</string>
     <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Вы нажали кнопку питания. Обычно это приводит к отключению экрана.\n\nПри добавлении отпечатка пальца слегка прикоснитесь к кнопке."</string>
-    <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Для завершения нужно отключить экран"</string>
+    <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Для завершения нужно отключить экран."</string>
     <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Отключить"</string>
     <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Продолжить сканирование отпечатка?"</string>
     <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Вы нажали кнопку питания. Обычно это приводит к отключению экрана.\n\nЧтобы отсканировать отпечаток пальца, слегка прикоснитесь к кнопке."</string>
@@ -1929,6 +1931,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Под управлением приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Включено"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Отключено"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Любой календарь"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> приглушает некоторые звуки."</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Произошла внутренняя ошибка, и устройство может работать нестабильно, пока вы не выполните сброс настроек."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Произошла внутренняя ошибка. Обратитесь к производителю устройства за подробными сведениями."</string>
@@ -2391,6 +2396,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Тестовый"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Совместный"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Автоматически подключено к системам спутниковой связи"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Вы можете отправлять и получать сообщения без доступа к мобильной сети или Wi-Fi."</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Открыть Сообщения"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 8bbf199..04b2c52 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ජංගම ජාලය වෙත ළඟා විය නොහැකිය"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"කැමති ජාලය වෙනස් කිරීමට උත්සාහ කරන්න. වෙනස් කිරීමට තට්ටු කරන්න."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"හදිසි ඇමතුම් ලබා ගත නොහැකිය"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi-Fi හරහා හදිසි ඇමතුම් ලබා ගත නොහැකිය"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"හදිසි ඇමතුම් සඳහා ජංගම ජාලයක් අවශ්‍ය වේ"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"ඇඟවීම්"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"ඇමතුම ප්‍රතියොමු කිරීම"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"හදිසි අවස්ථා පසු ඇමතුම් ප්‍රකාරය"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"මකන්න"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ආදාන ක්‍රමය"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"පෙළ ක්‍රියාවන්"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"මෙම ක්ෂේත්‍රය අත් අකුරු සඳහා සහය නොදක්වයි"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"මුරපද ක්ෂේත්‍ර අත් අකුරු සඳහා සහය නොදක්වයි"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ආපසු"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ආදාන ක්‍රමය මාරු කිරීම"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"ආචයනය ඉඩ ප්‍රමාණය අඩු වී ඇත"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> විසින් කළමනාකරණය කරයි"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ක්‍රියාත්මකයි"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ක්‍රියාවිරහිතයි"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ඕනෑම දින දර්ශනයක්"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> සමහර ශබ්ද නිහඬ කරමින්"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"ඔබේ උපාංගය සමගින් ගැටලුවක් ඇති අතර, ඔබේ කර්මාන්තශාලා දත්ත යළි සකසන තෙක් එය අස්ථායි විය හැකිය."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"ඔබේ උපාංගය සමගින් අභ්‍යන්තර ගැටලුවක් ඇත. විස්තර සඳහා ඔබේ නිෂ්පාදක අමතන්න."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"පරීක්ෂණය"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"වාර්ගික"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"චන්ද්‍රිකාවට ස්වයංක්‍රීයව සම්බන්ධ වේ"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"ඔබට ජංගම හෝ Wi-Fi ජාලයක් නොමැතිව පණිවිඩ යැවීමට සහ ලැබීමට හැක"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages විවෘත කරන්න"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 928371d..76cad30 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -86,7 +86,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Nepodarilo sa pripojiť k mobilnej sieti"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Skúste zmeniť predvolenú sieť. Zmeníte ju klepnutím."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Tiesňové volania nie sú k dispozícii"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Nedajú sa uskutočniť tiesňové volania cez Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Tiesňové volania vyžadujú mobilnú sieť"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Upozornenia"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Presmerovanie hovorov"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Režim tiesňového spätného volania"</string>
@@ -1185,6 +1185,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Odstrániť"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Metóda vstupu"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Operácie s textom"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Ručné písanie nie je v tomto poli podporované"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"V poliach pre heslá nie je ručné písanie podporované"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Späť"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Prepnúť metódu vstupu"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Nedostatok ukladacieho priestoru"</string>
@@ -1929,6 +1931,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Spravované aplikáciou <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Zapnuté"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Vypnuté"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Ľubovoľný kalendár"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> vypína niektoré zvuky"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Vo vašom zariadení došlo k internému problému. Môže byť nestabilné, kým neobnovíte jeho výrobné nastavenia."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Vo vašom zariadení došlo k internému problému. Ak chcete získať podrobné informácie, obráťte sa na jeho výrobcu."</string>
@@ -1989,7 +1994,7 @@
     <string name="work_mode_turn_on" msgid="5316648862401307800">"Zrušiť pozastavenie"</string>
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Tiesňová linka"</string>
     <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Nastavte zámku obrazovky"</string>
-    <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Nastavte zámku obrazovky"</string>
+    <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Nastaviť zámku obrazovky"</string>
     <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Ak chcete používať súkromný priestor, nastavte v tomto zariadení zámku obrazovky"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Aplikácia nie je dostupná"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> nie je teraz dostupná."</string>
@@ -2391,6 +2396,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Testovací"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Spoločný"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automaticky pripojené k satelitu"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Správy môžete odosielať a prijímať bez mobilnej siete či siete Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvoriť Správy"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index e4abb44..5983929 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -86,7 +86,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobilnega omrežja ni mogoče doseči"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Poskusite spremeniti prednostno omrežje. Dotaknite se, če ga želite spremeniti."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Klicanje v sili ni na voljo"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Klicev v sili ni mogoče opravljati prek omrežja Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Za klice v sili potrebujete mobilno omrežje"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Opozorila"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Preusmerjanje klicev"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Način za povratni klic v sili"</string>
@@ -1185,6 +1185,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Način vnosa"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Besedilna dejanja"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Rokopis ni podprt v tem polju"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Rokopis ni podprt v poljih za vnos gesla"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Nazaj"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Preklop načina vnosa"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Prostor za shranjevanje bo pošel"</string>
@@ -1929,6 +1931,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Upravlja <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Vklopljeno"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Izklopljeno"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Kateri koli koledar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> izklaplja nekatere zvoke"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Vaša naprava ima notranjo napako in bo morda nestabilna, dokler je ne ponastavite na tovarniške nastavitve."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Vaša naprava ima notranjo napako. Če želite več informacij, se obrnite na proizvajalca."</string>
@@ -2391,6 +2396,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Preizkus"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Skupno"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Samodejno vzpostavljena povezava s satelitom"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Sporočila SMS lahko pošiljate in prejemate brez mobilnega omrežja ali omrežja Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Odpri Sporočila"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 29d6fe5..5a02d56 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Rrjeti celular është i paarritshëm"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Provo të ndryshosh rrjetin e preferuar. Trokit për ta ndryshuar."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Telefonatat e urgjencës nuk ofrohen"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Nuk mund të kryhen telefonata urgjence me Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Telefonatat e urgjencës kërkojnë një rrjet celular"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Sinjalizimet"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Transferimi i telefonatave"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modaliteti i \"Kthimit të telefonatës së urgjencës\""</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Fshi"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Metoda e hyrjes"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Veprimet e tekstit"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Shkrimi i dorës nuk mbështetet në këtë fushë"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Shkrimi i dorës nuk mbështetet në fushat e fjalëkalimeve"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Pas"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Ndërro metodën e hyrjes"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Hapësira ruajtëse po mbaron"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Menaxhohet nga <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aktivizuar"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Çaktivizuar"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Çdo kalendar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> po çaktivizon disa tinguj"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Ka një problem të brendshëm me pajisjen tënde. Ajo mund të jetë e paqëndrueshme derisa të rivendosësh të dhënat në gjendje fabrike."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Ka një problem të brendshëm me pajisjen tënde. Kontakto prodhuesin tënd për detaje."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"I përbashkët"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"U lidh automatikisht me satelitin"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Mund të dërgosh dhe të marrësh mesazhe pa një rrjet celular apo rrjet Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Hap \"Mesazhet\""</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index db9c849..637371c 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -85,7 +85,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Повезивање са мобилном мрежом није успело"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Пробајте да промените жељену мрежу. Додирните да бисте променили."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Хитни позиви нису доступни"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Не можете да упућујете хитне позиве преко Wi‑Fi-ја"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Хитни позиви захтевају мобилну мрежу"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Упозорења"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Преусмеравање позива"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Режим за хитан повратни позив"</string>
@@ -615,7 +615,7 @@
     <string name="permlab_disableKeyguard" msgid="3605253559020928505">"онемогућавање закључавања екрана"</string>
     <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Дозвољава апликацији да онемогући закључавање тастатуре и све повезане безбедносне мере са лозинкама. На пример, телефон онемогућава закључавање тастатуре при пријему долазног телефонског позива, а затим га поново омогућава по завршетку позива."</string>
     <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"тражење сложености закључавања екрана"</string>
-    <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"Дозвољава апликацији да сазна ниво сложености закључавања екрана (висока, средња, ниска или ниједна), што указује на могући опсег трајања и тип закључавања екрана. Апликација може и да предлаже корисницима да ажурирају закључавање екрана на одређени ниво, али корисници слободно могу да занемаре то и да иду на друге странице. Имајте на уму да се подаци за закључавање екрана не чувају као обичан текст, па апликација не зна тачну лозинку."</string>
+    <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"Дозвољава апликацији да сазна ниво сложености закључавања екрана (висока, средња, ниска или ниједна), што указује на могући опсег трајања и тип закључавања екрана. Апликација може и да предлаже корисницима да ажурирају откључавање екрана на одређени ниво, али корисници слободно могу да занемаре то и да иду на друге странице. Имајте на уму да се подаци за откључавање екрана не чувају као обичан текст, па апликација не зна тачну лозинку."</string>
     <string name="permlab_postNotification" msgid="4875401198597803658">"приказивање обавештења"</string>
     <string name="permdesc_postNotification" msgid="5974977162462877075">"Дозвољава апликацији да приказује обавештења"</string>
     <string name="permlab_turnScreenOn" msgid="219344053664171492">"укључивање екрана"</string>
@@ -635,10 +635,10 @@
     <string name="permlab_mediaLocation" msgid="7368098373378598066">"читање локација из медијске колекције"</string>
     <string name="permdesc_mediaLocation" msgid="597912899423578138">"Дозвољава апликацији да чита локације из медијске колекције."</string>
     <string name="biometric_app_setting_name" msgid="3339209978734534457">"Користите биометрију"</string>
-    <string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Користите биометрију или закључавање екрана"</string>
+    <string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Користите биометрију или откључавање екрана"</string>
     <string name="biometric_dialog_default_title" msgid="55026799173208210">"Потврдите свој идентитет"</string>
     <string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Користите биометријски податак да бисте наставили"</string>
-    <string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Користите биометријски податак или закључавање екрана да бисте наставили"</string>
+    <string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Користите биометријски податак или откључавање екрана да бисте наставили"</string>
     <string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Биометријски хардвер није доступан"</string>
     <string name="biometric_error_user_canceled" msgid="6732303949695293730">"Потврда идентитета је отказана"</string>
     <string name="biometric_not_recognized" msgid="5106687642694635888">"Није препознато"</string>
@@ -646,8 +646,8 @@
     <string name="biometric_error_canceled" msgid="8266582404844179778">"Потврда идентитета је отказана"</string>
     <string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Нисте подесили ни PIN, ни шаблон, ни лозинку"</string>
     <string name="biometric_error_generic" msgid="6784371929985434439">"Грешка при потврди идентитета"</string>
-    <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Користите закључавање екрана"</string>
-    <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Употребите закључавање екрана да бисте наставили"</string>
+    <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Користите откључавање екрана"</string>
+    <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>
@@ -672,8 +672,8 @@
     <string name="fingerprint_error_timeout" msgid="7361192266621252164">"Време за подешавање отиска прста је истекло. Пробајте поново."</string>
     <string name="fingerprint_error_canceled" msgid="5541771463159727513">"Радња са отиском прста је отказана"</string>
     <string name="fingerprint_error_user_canceled" msgid="2017941773466506863">"Корисник је отказао радњу са отиском прста"</string>
-    <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Превише покушаја. Користите закључавање екрана уместо тога."</string>
-    <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Превише покушаја. Користите закључавање екрана уместо тога."</string>
+    <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Превише покушаја. Користите откључавање екрана уместо тога."</string>
+    <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Превише покушаја. Користите откључавање екрана уместо тога."</string>
     <string name="fingerprint_error_unable_to_process" msgid="2446280592818621224">"Обрађивање отиска прста није успело. Пробајте поново."</string>
     <string name="fingerprint_error_no_fingerprints" msgid="3144806556204061862">"Није регистрован ниједан отисак прста"</string>
     <string name="fingerprint_error_hw_not_present" msgid="5898827259419366359">"Овај уређај нема сензор за отисак прста"</string>
@@ -682,9 +682,9 @@
     <string name="fingerprint_error_power_pressed" msgid="5479524500542129414">"Притиснуто је дугме за укључивање"</string>
     <string name="fingerprint_name_template" msgid="8941662088160289778">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string>
     <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Користите отисак прста"</string>
-    <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Користите отисак прста или закључавање екрана"</string>
+    <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Користите отисак прста или откључавање екрана"</string>
     <string name="fingerprint_dialog_default_subtitle" msgid="3879832845486835905">"Наставите помоћу отиска прста"</string>
-    <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Користите отисак прста или закључавање екрана да бисте наставили"</string>
+    <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Користите отисак прста или откључавање екрана да бисте наставили"</string>
   <string-array name="fingerprint_error_vendor">
   </string-array>
     <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Дошло је до проблема. Пробајте поново."</string>
@@ -736,16 +736,16 @@
     <string name="face_error_user_canceled" msgid="5766472033202928373">"Корисник је отказао откључавање лицем"</string>
     <string name="face_error_lockout" msgid="7864408714994529437">"Превише покушаја. Пробајте поново касније."</string>
     <string name="face_error_lockout_permanent" msgid="8533257333130473422">"Превише покушаја. Откључавање лицем није доступно."</string>
-    <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Превише покушаја. Користите закључавање екрана за то."</string>
+    <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Превише покушаја. Користите откључавање екрана за то."</string>
     <string name="face_error_unable_to_process" msgid="5723292697366130070">"Провера лица није успела. Пробајте поново."</string>
     <string name="face_error_not_enrolled" msgid="1134739108536328412">"Нисте подесили откључавање лицем"</string>
     <string name="face_error_hw_not_present" msgid="7940978724978763011">"Откључавање лицем није подржано на овом уређају"</string>
     <string name="face_error_security_update_required" msgid="5076017208528750161">"Сензор је привремено онемогућен."</string>
     <string name="face_name_template" msgid="3877037340223318119">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string>
     <string name="face_app_setting_name" msgid="5854024256907828015">"Користите откључавање лицем"</string>
-    <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Користите закључавање лицем или закључавање екрана"</string>
+    <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Користите закључавање лицем или откључавање екрана"</string>
     <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Потврдите идентитет лицем да бисте наставили"</string>
-    <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Користите лице или закључавање екрана да бисте наставили"</string>
+    <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Користите лице или откључавање екрана да бисте наставили"</string>
   <string-array name="face_error_vendor">
   </string-array>
     <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Дошло је до проблема. Пробајте поново."</string>
@@ -827,7 +827,7 @@
     <string name="permlab_writeVerificationStateE2eeContactKeys" msgid="3990742344778360457">"Ажурирање статуса верификације кључева за шифровање контаката с краја на крај у власништву других апликација"</string>
     <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Дозвољава апликацији да ажурира статусе верификације кључева за шифровање контаката с краја на крај (E2EE) у власништву других апликација"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"Подешавање правила за лозинку"</string>
-    <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролише дужину и знакове дозвољене у лозинкама и PIN-овима за закључавање екрана."</string>
+    <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролише дужину и знакове дозвољене у лозинкама и PIN-овима за откључавање екрана."</string>
     <string name="policylab_watchLogin" msgid="7599669460083719504">"Надзор покушаја откључавања екрана"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Прати број нетачно унетих лозинки приликом откључавања екрана и закључава таблет или брише податке са таблета ако је нетачна лозинка унета превише пута."</string>
     <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Надгледа број нетачних лозинки унетих при откључавању екрана и закључава Android TV уређај или брише све податке са Android TV уређаја ако се унесе превише нетачних лозинки."</string>
@@ -838,7 +838,7 @@
     <string name="policydesc_watchLogin_secondaryUser" product="automotive" msgid="7180857406058327941">"Надгледа број нетачних лозинки унетих при откључавању екрана и закључава систем за инфо-забаву или брише све податке овог профила ако се унесе превише нетачних лозинки."</string>
     <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"Надгледа број нетачних лозинки унетих при откључавању екрана и закључава телефон или брише све податке овог корисника ако се унесе превише нетачних лозинки."</string>
     <string name="policylab_resetPassword" msgid="214556238645096520">"Промена закључавања екрана"</string>
-    <string name="policydesc_resetPassword" msgid="4626419138439341851">"Мења закључавање екрана."</string>
+    <string name="policydesc_resetPassword" msgid="4626419138439341851">"Мења откључавање екрана."</string>
     <string name="policylab_forceLock" msgid="7360335502968476434">"Закључавање екрана"</string>
     <string name="policydesc_forceLock" msgid="1008844760853899693">"Контрола начина и времена закључавања екрана."</string>
     <string name="policylab_wipeData" msgid="1359485247727537311">"Брисање свих података"</string>
@@ -855,7 +855,7 @@
     <string name="policylab_setGlobalProxy" msgid="215332221188670221">"Подесите глобални прокси сервер уређаја"</string>
     <string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"Подешава глобални прокси уређаја који ће се користити док су смернице омогућене. Само власник уређаја може да подеси глобални прокси."</string>
     <string name="policylab_expirePassword" msgid="6015404400532459169">"Подеси истек. лозин. за закљ. екр."</string>
-    <string name="policydesc_expirePassword" msgid="9136524319325960675">"Мења колико често лозинка, PIN или шаблон за закључавање екрана мора да се мења."</string>
+    <string name="policydesc_expirePassword" msgid="9136524319325960675">"Мења колико често лозинка, PIN или шаблон за откључавање екрана мора да се мења."</string>
     <string name="policylab_encryptedStorage" msgid="9012936958126670110">"Подешавање шифровања складишта"</string>
     <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"Захтева да сачувани подаци апликације буду шифровани."</string>
     <string name="policylab_disableCamera" msgid="5749486347810162018">"Онемогућавање камера"</string>
@@ -1184,6 +1184,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Избриши"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Метод уноса"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Радње у вези са текстом"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Писање руком није подржано у овом пољу"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Писање руком није подржано у пољима за лозинке"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Промените метод уноса"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Меморијски простор је на измаку"</string>
@@ -1928,6 +1930,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Управља: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Укључено"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Искључено"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Било који календар"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> искључује неке звуке"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Дошло је до интерног проблема у вези са уређајем и можда ће бити нестабилан док не обавите ресетовање на фабричка подешавања."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Дошло је до интерног проблема у вези са уређајем. Потражите детаље од произвођача."</string>
@@ -1987,9 +1992,9 @@
     <string name="work_mode_off_title" msgid="6367463960165135829">"Укључити пословне апликације?"</string>
     <string name="work_mode_turn_on" msgid="5316648862401307800">"Поново активирај"</string>
     <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Хитан случај"</string>
-    <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Подесите закључавање екрана"</string>
-    <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Подеси закључавање екрана"</string>
-    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Да бисте користили приватни простор, подесите закључавање екрана на овом уређају"</string>
+    <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Подесите откључавање екрана"</string>
+    <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Подеси откључавање екрана"</string>
+    <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Да бисте користили приватни простор, подесите откључавање екрана на овом уређају"</string>
     <string name="app_blocked_title" msgid="7353262160455028160">"Апликација није доступна"</string>
     <string name="app_blocked_message" msgid="542972921087873023">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> тренутно није доступна."</string>
     <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> – није доступно"</string>
@@ -2390,6 +2395,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Тест"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Заједничко"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Аутоматски повезано са сателитом"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Можете да шаљете и примате поруке без мобилне или WiFi мреже"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Отвори Messages"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 657eb2c..2dde3a8 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Det går inte att nå mobilnätverket"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Testa att byta föredraget nätverk. Tryck om du vill ändra."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Det går inte att ringa nödsamtal"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Det går inte att ringa nödsamtal via Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Mobilnätverk krävs för att ringa nödsamtal"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Aviseringar"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Vidarekoppla samtal"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Läget Återuppringning vid nödsamtal"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Ta bort"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Indatametod"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Textåtgärder"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handskrift stöds inte i det här fältet"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handskrift stöds inte i lösenordsfält"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Tillbaka"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Byt inmatningsmetod"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Lagringsutrymmet börjar ta slut"</string>
@@ -1271,7 +1273,7 @@
     <string name="android_upgrading_title" product="default" msgid="7279077384220829683">"Mobilen uppdateras …"</string>
     <string name="android_upgrading_title" product="tablet" msgid="4268417249079938805">"Surfplattan uppdateras …"</string>
     <string name="android_upgrading_title" product="device" msgid="6774767702998149762">"Enheten uppdateras …"</string>
-    <string name="android_start_title" product="default" msgid="4036708252778757652">"Mobilen startar …"</string>
+    <string name="android_start_title" product="default" msgid="4036708252778757652">"Telefonen startar …"</string>
     <string name="android_start_title" product="automotive" msgid="7917984412828168079">"Android startar …"</string>
     <string name="android_start_title" product="tablet" msgid="4429767260263190344">"Surfplattan startar …"</string>
     <string name="android_start_title" product="device" msgid="6967413819673299309">"Enheten startar …"</string>
@@ -1525,10 +1527,10 @@
     <string name="vpn_title_long" msgid="6834144390504619998">"VPN aktiveras av <xliff:g id="APP">%s</xliff:g>"</string>
     <string name="vpn_text" msgid="2275388920267251078">"Knacka lätt för att hantera nätverket."</string>
     <string name="vpn_text_long" msgid="278540576806169831">"Ansluten till <xliff:g id="SESSION">%s</xliff:g>. Knacka lätt för att hantera nätverket."</string>
-    <string name="vpn_lockdown_connecting" msgid="6096725311950342607">"Ansluter till Always-on VPN ..."</string>
-    <string name="vpn_lockdown_connected" msgid="2853127976590658469">"Ansluten till Always-on VPN"</string>
-    <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"Frånkopplad från Always-on VPN"</string>
-    <string name="vpn_lockdown_error" msgid="4453048646854247947">"Det gick inte att ansluta till Always-on VPN"</string>
+    <string name="vpn_lockdown_connecting" msgid="6096725311950342607">"Ansluter till Alltid på-VPN ..."</string>
+    <string name="vpn_lockdown_connected" msgid="2853127976590658469">"Ansluten till Alltid på-VPN"</string>
+    <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"Frånkopplad från Alltid på-VPN"</string>
+    <string name="vpn_lockdown_error" msgid="4453048646854247947">"Det gick inte att ansluta till Alltid på-VPN"</string>
     <string name="vpn_lockdown_config" msgid="8331697329868252169">"Ändra inställningarna för nätverk eller VPN"</string>
     <string name="upload_file" msgid="8651942222301634271">"Välj fil"</string>
     <string name="no_file_chosen" msgid="4146295695162318057">"Ingen fil har valts"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Hanteras av <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"På"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Av"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Alla kalendrar"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> stänger av vissa ljud"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Ett internt problem har uppstått i enheten, och det kan hända att problemet kvarstår tills du återställer standardinställningarna."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Ett internt problem har uppstått i enheten. Kontakta tillverkaren om du vill veta mer."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Allmän"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Automatiskt ansluten till satellit"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kan skicka och ta emot meddelanden utan mobil- eller wifi-nätverk"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Öppna Messages"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 83be3fc..2936716 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Imeshindwa kufikia mtandao wa simu"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Jaribu kutumia mtandao unaopendelea. Gusa ili ubadilishe."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Huduma ya kupiga simu za dharura haipatikani"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Huwezi kupiga simu ya dharura kupitia Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Huduma ya kupiga simu za dharura inahitaji mtandao wa simu"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Arifa"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Kupeleka simu kwenye namba nyingine"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Hali ya kupiga simu za dharura"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Futa"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Mbinu ya uingizaji"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Vitendo vya maandishi"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Huwezi kuandika kwa mkono kwenye sehemu hii"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Huwezi kuandika kwa mkono kwenye sehemu za kuweka nenosiri"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Rudi nyuma"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Badilisha mbinu ya kuingiza data"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Nafasi ya kuhifadhi inakaribia kujaa"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Inadhibitiwa na <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Imewashwa"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Imezimwa"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Kalenda yoyote"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> inazima baadhi ya sauti"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Kuna hitilafu ya ndani ya kifaa chako, na huenda kisiwe thabiti mpaka urejeshe mipangilio ya kiwandani."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Kuna hitilafu ya ndani ya kifaa chako. Wasiliana na mtengenezaji wa kifaa chako kwa maelezo."</string>
@@ -1971,7 +1976,7 @@
     <string name="supervised_user_creation_label" msgid="6884904353827427515">"Weka mtumiaji anayesimamiwa"</string>
     <string name="language_selection_title" msgid="52674936078683285">"Ongeza lugha"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"Mapendeleo ya eneo"</string>
-    <string name="search_language_hint" msgid="7004225294308793583">"Weka jina la lugha"</string>
+    <string name="search_language_hint" msgid="7004225294308793583">"Andika jina la lugha"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"Zinazopendekezwa"</string>
     <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"Yanayopendekezwa"</string>
     <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"Lugha zinazopendekezwa"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Jaribio"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Unaoshirikiwa"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Imeunganishwa kiotomatiki na satelaiti"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Unaweza kutuma na kupokea ujumbe bila mtandao wa simu au Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Fungua Programu ya Messages"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 362a18d..28ee91d 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"மொபைல் நெட்வொர்க் கிடைக்கவில்லை"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"விருப்ப நெட்வொர்க்கை மாற்றவும். மாற்ற, தட்டவும்."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"அவசர அழைப்பைச் செய்ய முடியாது"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"வைஃபை மூலம் அவசர அழைப்புகளைச் செய்ய முடியாது"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"அவசர அழைப்புகளுக்கு மொபைல் நெட்வொர்க் தேவை"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"விழிப்பூட்டல்கள்"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"அழைப்பு திருப்பிவிடுதல்"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"அவசரகாலத் திரும்ப அழைக்கும் பயன்முறை"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"நீக்கு"</string>
     <string name="inputMethod" msgid="1784759500516314751">"உள்ளீட்டு முறை"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"உரை நடவடிக்கைகள்"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"இந்தப் புலத்தில் கையெழுத்து ஆதரிக்கப்படவில்லை"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"கடவுச்சொல் புலங்களில் கையெழுத்து ஆதரிக்கப்படவில்லை"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"பின்செல்லும்"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"உள்ளீட்டு முறையை மாற்றும்"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"சேமிப்பிடம் குறைகிறது"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"நிர்வகிப்பது: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ஆன்"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ஆஃப்"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ஏதேனும் கேலெண்டர்"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> சில ஒலிகளை முடக்குகிறது"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"சாதனத்தில் அகச் சிக்கல் இருக்கிறது, அதனை ஆரம்பநிலைக்கு மீட்டமைக்கும் வரை நிலையற்று இயங்கலாம்."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"சாதனத்தில் அகச் சிக்கல் இருக்கிறது. விவரங்களுக்கு சாதன தயாரிப்பாளரைத் தொடர்புகொள்ளவும்."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"பரிசோதனை"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"பொது"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"சாட்டிலைட்டுடன் தானாக இணைக்கப்பட்டது"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"மொபைல்/வைஃபை நெட்வொர்க் இல்லாமல் நீங்கள் மெசேஜ்களை அனுப்பலாம் பெறலாம்"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ஆப்ஸைத் திறக்கவும்"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 738b410..c64c9b6d 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"మొబైల్ నెట్‌వర్క్ అందుబాటులో లేదు"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ప్రాధాన్య నెట్‌వర్క్‌ను మార్చుకోవడానికి ప్రయత్నించండి. మార్చడానికి నొక్కండి."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"అత్యవసర కాలింగ్ అందుబాటులో లేదు"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi-Fiతో అత్యవసర కాల్స్‌ చేయలేరు"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ఎమర్జెన్సీ కాల్స్‌కు మొబైల్ నెట్‌వర్క్ అవసరమవుతుంది"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"అలర్ట్‌లు"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"కాల్ ఫార్వార్డింగ్"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"అత్యవసర కాల్‌బ్యాక్ మోడ్"</string>
@@ -278,7 +278,7 @@
     <string name="global_action_settings" msgid="4671878836947494217">"సెట్టింగ్‌లు"</string>
     <string name="global_action_assist" msgid="2517047220311505805">"సహాయం"</string>
     <string name="global_action_voice_assist" msgid="6655788068555086695">"వాయిస్ అసిస్టెంట్"</string>
-    <string name="global_action_lockdown" msgid="2475471405907902963">"లాక్ చేయి"</string>
+    <string name="global_action_lockdown" msgid="2475471405907902963">"లాక్ చేయండి"</string>
     <string name="status_bar_notification_info_overflow" msgid="3330152558746563475">"999+"</string>
     <string name="notification_hidden_text" msgid="2835519769868187223">"కొత్త నోటిఫికేషన్"</string>
     <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"భౌతిక కీబోర్డ్"</string>
@@ -827,7 +827,7 @@
     <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"మీకు సంబంధించిన ఇతర యాప్‌లలోని E2EE కాంటాక్ట్ కీల వెరిఫికేషన్ స్టేట్‌లను అప్‌డేట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది"</string>
     <string name="policylab_limitPassword" msgid="4851829918814422199">"పాస్‌వర్డ్ నియమాలను సెట్ చేయండి"</string>
     <string name="policydesc_limitPassword" msgid="4105491021115793793">"స్క్రీన్ లాక్ పాస్‌వర్డ్‌లు మరియు PINల్లో అనుమతించబడిన పొడవు మరియు అక్షరాలను నియంత్రిస్తుంది."</string>
-    <string name="policylab_watchLogin" msgid="7599669460083719504">"స్క్రీన్ అన్‌లాక్ ప్రయత్నాలను పర్యవేక్షించండి"</string>
+    <string name="policylab_watchLogin" msgid="7599669460083719504">"స్క్రీన్‌ను అన్‌లాక్ చేయడానికి చేస్తున్న ప్రయత్నాలను మానిటర్ చేయడానికి"</string>
     <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"టైప్ చేసిన చెల్లని పాస్‌వర్డ్‌ల సంఖ్యను పర్యవేక్షిస్తుంది. స్క్రీన్‌ను అన్‌లాక్ చేస్తున్నప్పుడు, అనేక సార్లు చెల్లని పాస్‌వర్డ్‌లను టైప్ చేస్తే టాబ్లెట్ లాక్ చేయబడుతుంది లేదా టాబ్లెట్‌లోని మొత్తం డేటా ఎరేజ్ చేయబడుతుంది."</string>
     <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"స్క్రీన్‌ను అన్‌లాక్ చేస్తున్నప్పుడు పాస్‌వర్డ్‌లను ఎన్నిసార్లు తప్పుగా టైప్ చేశారో పర్యవేక్షిస్తుంది, అలాగే చాలా ఎక్కువసార్లు పాస్‌వర్డ్‌లను తప్పుగా టైప్ చేసి ఉంటే మీ Android TV పరికరాన్ని లాక్ చేస్తుంది లేదా మీ Android TV డేటా మొత్తాన్ని తొలగిస్తుంది."</string>
     <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"స్క్రీన్‌ను అన్‌లాక్ చేస్తున్నప్పుడు, పాస్‌వర్డ్‌ను ఎన్నిసార్లు తప్పుగా టైప్ చేశారో పర్యవేక్షిస్తుంది. ఒకవేళ చాలా ఎక్కువ సార్లు పాస్‌వర్డ్‌ను తప్పుగా టైప్ చేసి ఉంటే, సమాచారంతో కూడిన వినోదం సిస్టమ్‌ను లాక్ చేస్తుంది లేదా సమాచారంతో కూడిన వినోదం సిస్టమ్ డేటాను తొలగించి ఫ్యాక్టరీ రీసెట్ చేస్తుంది."</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"తొలగించండి"</string>
     <string name="inputMethod" msgid="1784759500516314751">"ఇన్‌పుట్ పద్ధతి"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"వచనానికి సంబంధించిన చర్యలు"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ఈ ఫీల్డ్‌లో చేతిరాతకు సపోర్ట్ లేదు"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"పాస్‌వర్డ్ ఫీల్డ్‌లలో చేతిరాతకు సపోర్ట్ లేదు"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"వెనుకకు"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ఇన్‌పుట్ విధానాన్ని మార్చండి"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"స్టోరేజ్‌ ఖాళీ అయిపోతోంది"</string>
@@ -1242,10 +1244,10 @@
     <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_report" msgid="3095644466849299308">"ఫీడ్‌బ్యాక్‌ను పంపు"</string>
-    <string name="aerr_close" msgid="3398336821267021852">"మూసివేయి"</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>
@@ -1923,10 +1925,13 @@
     <string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"వారపు రోజుల్లో రాత్రి"</string>
     <string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"వారాంతం"</string>
     <string name="zen_mode_default_events_name" msgid="2280682960128512257">"ఈవెంట్"</string>
-    <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"నిద్రావస్థ"</string>
+    <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"నిద్ర"</string>
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ద్వారా మేనేజ్ చేయబడుతోంది"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ఆన్‌లో ఉంది"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ఆఫ్‌లో ఉంది"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ఏదైనా క్యాలెండర్"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> కొన్ని ధ్వనులను మ్యూట్ చేస్తోంది"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"మీ పరికరంతో అంతర్గత సమస్య ఏర్పడింది మరియు మీరు ఫ్యాక్టరీ డేటా రీసెట్ చేసే వరకు అస్థిరంగా ఉంటుంది."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"మీ పరికరంతో అంతర్గత సమస్య ఏర్పడింది. వివరాల కోసం మీ తయారీదారుని సంప్రదించండి."</string>
@@ -1953,7 +1958,7 @@
     <string name="floating_toolbar_open_overflow_description" msgid="2260297653578167367">"మరిన్ని ఆప్షన్‌లు"</string>
     <string name="floating_toolbar_close_overflow_description" msgid="3949818077708138098">"అతివ్యాప్తిని మూసివేస్తుంది"</string>
     <string name="maximize_button_text" msgid="4258922519914732645">"గరిష్టీకరించు"</string>
-    <string name="close_button_text" msgid="10603510034455258">"మూసివేయి"</string>
+    <string name="close_button_text" msgid="10603510034455258">"మూసివేయండి"</string>
     <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
     <string name="call_notification_answer_action" msgid="5999246836247132937">"పికప్ చేయండి"</string>
     <string name="call_notification_answer_video_action" msgid="2086030940195382249">"వీడియో కాల్"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"పరీక్ష"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"కమ్యూనల్"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"శాటిలైట్‌కు ఆటోమేటిక్‌గా కనెక్ట్ చేయబడింది"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"మీరు మొబైల్ లేదా Wi-Fi నెట్‌వర్క్ లేకుండా మెసేజ్‌లను పంపవచ్చు, స్వీకరించవచ్చు"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messagesను తెరవండి"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 7856369..7555f26 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"เชื่อมต่อเครือข่ายมือถือไม่ได้"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ลองเปลี่ยนเครือข่ายที่ต้องการ แตะเพื่อเปลี่ยน"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"โทรหาหมายเลขฉุกเฉินไม่ได้"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"โทรหาหมายเลขฉุกเฉินผ่าน Wi‑Fi ไม่ได้"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"การโทรหาหมายเลขฉุกเฉินต้องใช้เครือข่ายมือถือ"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"การแจ้งเตือน"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"การโอนสาย"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"โหมดติดต่อกลับฉุกเฉิน"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"ลบ"</string>
     <string name="inputMethod" msgid="1784759500516314751">"วิธีป้อนข้อมูล"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"การทำงานของข้อความ"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ช่องนี้ไม่รองรับการเขียนด้วยลายมือ"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ช่องรหัสผ่านไม่รองรับการเขียนด้วยลายมือ"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"กลับ"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"สลับวิธีการป้อนข้อมูล"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"พื้นที่จัดเก็บเหลือน้อย"</string>
@@ -1295,12 +1297,12 @@
     <string name="new_app_action" msgid="547772182913269801">"เปิด <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
     <string name="new_app_description" msgid="1958903080400806644">"<xliff:g id="OLD_APP">%1$s</xliff:g> จะปิดโดยไม่บันทึก"</string>
     <string name="dump_heap_notification" msgid="5316644945404825032">"<xliff:g id="PROC">%1$s</xliff:g> เกินขีดจำกัดของหน่วยความจำ"</string>
-    <string name="dump_heap_ready_notification" msgid="2302452262927390268">"ฮีพดัมพ์ <xliff:g id="PROC">%1$s</xliff:g> พร้อมแล้ว"</string>
-    <string name="dump_heap_notification_detail" msgid="8431586843001054050">"รวบรวมฮีพดัมพ์แล้ว แตะเพื่อแชร์"</string>
-    <string name="dump_heap_title" msgid="4367128917229233901">"แชร์ฮีพดัมพ์ไหม"</string>
-    <string name="dump_heap_text" msgid="1692649033835719336">"กระบวนการ <xliff:g id="PROC">%1$s</xliff:g> ใช้หน่วยความจำเกินขีดจำกัดขนาด <xliff:g id="SIZE">%2$s</xliff:g> มีฮีพดัมพ์พร้อมให้แชร์กับนักพัฒนาซอฟต์แวร์ โปรดระวัง: ฮีพดัมพ์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งแอปพลิเคชันเข้าถึงได้"</string>
-    <string name="dump_heap_system_text" msgid="6805155514925350849">"กระบวนการ <xliff:g id="PROC">%1$s</xliff:g> ใช้หน่วยความจำเกินขีดจำกัดขนาด <xliff:g id="SIZE">%2$s</xliff:g> มีฮีพดัมพ์พร้อมให้แชร์ โปรดระวัง: ฮีพดัมพ์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งกระบวนการดังกล่าวเข้าถึงได้ ซึ่งอาจรวมถึงข้อมูลต่างๆ ที่คุณพิมพ์ไว้"</string>
-    <string name="dump_heap_ready_text" msgid="5849618132123045516">"มีฮีพดัมพ์ของกระบวนการ <xliff:g id="PROC">%1$s</xliff:g> พร้อมให้แชร์ โปรดระวัง: ฮีพดัมพ์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งกระบวนการดังกล่าวเข้าถึงได้ ซึ่งอาจรวมถึงข้อมูลต่างๆ ที่คุณพิมพ์ไว้"</string>
+    <string name="dump_heap_ready_notification" msgid="2302452262927390268">"ฮีปดัมป์ <xliff:g id="PROC">%1$s</xliff:g> พร้อมแล้ว"</string>
+    <string name="dump_heap_notification_detail" msgid="8431586843001054050">"รวบรวมฮีปดัมป์แล้ว แตะเพื่อแชร์"</string>
+    <string name="dump_heap_title" msgid="4367128917229233901">"แชร์ฮีปดัมป์ไหม"</string>
+    <string name="dump_heap_text" msgid="1692649033835719336">"กระบวนการ <xliff:g id="PROC">%1$s</xliff:g> ใช้หน่วยความจำเกินขีดจำกัดขนาด <xliff:g id="SIZE">%2$s</xliff:g> มีฮีปดัมป์พร้อมให้แชร์กับนักพัฒนาซอฟต์แวร์ โปรดระวัง: ฮีปดัมป์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งแอปพลิเคชันเข้าถึงได้"</string>
+    <string name="dump_heap_system_text" msgid="6805155514925350849">"กระบวนการ <xliff:g id="PROC">%1$s</xliff:g> ใช้หน่วยความจำเกินขีดจำกัดขนาด <xliff:g id="SIZE">%2$s</xliff:g> มีฮีปดัมป์พร้อมให้แชร์ โปรดระวัง: ฮีปดัมป์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งกระบวนการดังกล่าวเข้าถึงได้ ซึ่งอาจรวมถึงข้อมูลต่างๆ ที่คุณพิมพ์ไว้"</string>
+    <string name="dump_heap_ready_text" msgid="5849618132123045516">"มีฮีปดัมป์ของกระบวนการ <xliff:g id="PROC">%1$s</xliff:g> พร้อมให้แชร์ โปรดระวัง: ฮีปดัมป์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งกระบวนการดังกล่าวเข้าถึงได้ ซึ่งอาจรวมถึงข้อมูลต่างๆ ที่คุณพิมพ์ไว้"</string>
     <string name="sendText" msgid="493003724401350724">"เลือกการทำงานกับข้อความ"</string>
     <string name="volume_ringtone" msgid="134784084629229029">"ระดับความดังเสียงเรียกเข้า"</string>
     <string name="volume_music" msgid="7727274216734955095">"ระดับเสียงของสื่อ"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"จัดการโดย <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"เปิด"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ปิด"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ปฏิทินทั้งหมด"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> กำลังปิดเสียงบางรายการ"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"อุปกรณ์ของคุณเกิดปัญหาภายในเครื่อง อุปกรณ์อาจทำงานไม่เสถียรจนกว่าคุณจะรีเซ็ตข้อมูลเป็นค่าเริ่มต้น"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"อุปกรณ์ของคุณเกิดปัญหาภายในเครื่อง โปรดติดต่อผู้ผลิตเพื่อขอรายละเอียดเพิ่มเติม"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"ทดสอบ"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"ส่วนกลาง"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"เชื่อมต่อกับดาวเทียมโดยอัตโนมัติ"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"คุณรับส่งข้อความผ่านดาวเทียมได้โดยไม่ต้องใช้เครือข่ายมือถือหรือ Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"เปิด Messages"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index f95c6b2..112da5c 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Hindi makakonekta sa mobile network"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Subukang baguhin ang gustong network. I-tap para baguhin."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Hindi available ang pang-emergency na pagtawag"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Hindi makapagsagawa ng mga emergency na tawag sa pamamagitan ng Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Kailangan ng mobile network para sa mga emergency na tawag"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Mga Alerto"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Pagpasa ng tawag"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Emergency callback mode"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"I-delete"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Pamamaraan ng pag-input"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Pagkilos ng teksto"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Hindi sinusuportahan ang sulat-kamay sa field na ito"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Hindi sinusuportahan ang sulat-kamay sa mga field ng password"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Bumalik"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Magpalit ng pamamaraan ng pag-input"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Nauubusan na ang puwang ng storage"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Pinapamahalaan ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Naka-on"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Naka-off"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>, <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Anumang kalendaryo"</string>
     <string name="muted_by" msgid="91464083490094950">"Minu-mute ng <xliff:g id="THIRD_PARTY">%1$s</xliff:g> ang ilang tunog"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"May internal na problema sa iyong device, at maaaring hindi ito maging stable hanggang sa i-reset mo ang factory data."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"May internal na problema sa iyong device. Makipag-ugnayan sa iyong manufacturer upang malaman ang mga detalye."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Communal"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Awtomatikong nakakonekta sa satellite"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Puwede kang magpadala at tumanggap ng mga mensahe nang walang mobile o Wi-Fi network"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Buksan ang Messages"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 9638983..2ca545b 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobil ağa erişilemiyor"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Tercih edilen ağı değiştirmeyi deneyin. Değiştirmek için dokunun."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Acil durum çağrısı kullanılamaz"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Kablosuz ağ üzerinden acil durum çağrıları yapılamaz"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Acil durum aramaları için mobil ağ gereklidir"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Uyarılar"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Çağrı yönlendirme"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Acil geri arama modu"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Sil"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Giriş yöntemi"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Metin eylemleri"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"El yazısı bu alanda desteklenmiyor"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"El yazısı, şifre alanlarında desteklenmiyor"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Geri"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Giriş yöntemini değiştir"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Depolama alanı bitiyor"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> tarafından yönetiliyor"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Açık"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Kapalı"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>-<xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Tüm takvimler"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> bazı sesleri kapatıyor"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Cihazınızla ilgili dahili bir sorun oluştu ve fabrika verilerine sıfırlama işlemi gerçekleştirilene kadar kararsız çalışabilir."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Cihazınızla ilgili dahili bir sorun oluştu. Ayrıntılı bilgi için üreticinizle iletişim kurun."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Paylaşılan"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Uyduya otomatik olarak bağlandı"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Mobil veya kablosuz ağa bağlı olmadan mesaj alıp gönderebilirsiniz"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Mesajlar\'ı aç"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 640e7fc..df2c715 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -86,7 +86,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Не вдається під’єднатися до мобільної мережі"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Спробуйте змінити вибрану мережу. Торкніться, щоб це зробити."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Екстрені виклики недоступні"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Не можна здійснювати екстрені виклики через Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Щоб здійснювати екстрені виклики, потрібне з’єднання з мобільною мережею"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Сповіщення"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Переадресація виклику"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Режим екстреного зворотного виклику"</string>
@@ -1185,6 +1185,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Видалити"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Метод введення"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Дії з текстом"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Рукописне введення не підтримується в цьому полі"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Рукописне введення не підтримується в полях паролів"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Змінити метод введення"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Закінчується пам’ять"</string>
@@ -1929,6 +1931,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Керує додаток <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Увімкнено"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Вимкнено"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"З усіх календарів"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> вимикає деякі звуки"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Через внутрішню помилку ваш пристрій може працювати нестабільно. Відновіть заводські налаштування."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"На пристрої сталася внутрішня помилка. Зв’яжіться з виробником пристрою, щоб дізнатися більше."</string>
@@ -2133,7 +2138,7 @@
     <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
     <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Вимкнути"</string>
     <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Докладніше"</string>
-    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"В Android 12 адаптивні сповіщення замінено на покращені. Ця функція допомагає впорядковувати сповіщення й показує в них пропоновані дії та відповіді.\n\nПокращені сповіщення надають доступ до вмісту сповіщень, зокрема до такої особистої інформації, як повідомлення й імена контактів. Ця функція може автоматично закривати сповіщення чи реагувати на них, наприклад відповідати на телефонні дзвінки або керувати режимом \"Не турбувати\"."</string>
+    <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"В Android 12 адаптивні сповіщення замінено на покращені. Ця функція допомагає впорядковувати сповіщення й показує в них пропоновані дії і відповіді.\n\nПокращені сповіщення надають доступ до вмісту сповіщень, зокрема до такої особистої інформації, як повідомлення й імена контактів. Ця функція може автоматично закривати сповіщення чи реагувати на них, наприклад відповідати на телефонні дзвінки або керувати режимом \"Не турбувати\"."</string>
     <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Сповіщення про програму"</string>
     <string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Режим енергозбереження ввімкнено"</string>
     <string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Заряд використовується економно, щоб подовжити час роботи акумулятора"</string>
@@ -2391,6 +2396,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Тестовий профіль"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Спільний профіль"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Автоматично підключено до супутника"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Ви можете надсилати й отримувати повідомлення, не використовуючи Wi-Fi або мобільну мережу"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Відкрийте Повідомлення"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index f8f7dde..29bd5be 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"موبائل نیٹ ورک تک رسائی نہیں ہو سکتی"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ترجیحی نیٹ ورک تبدیل کر کے دیکھیں۔ تبدیل کرنے کے لیے تھپتھپائیں۔"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"ایمرجنسی کالنگ دستیاب نہیں ہے"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"‏Wi‑Fi کے ذریعے ایمرجنسی کالز نہیں کر سکتے"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ہنگامی کالز کو موبائل نیٹ ورک کی ضرورت ہے"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"الرٹس"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"کال فارورڈنگ"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"ایمرجنسی کال بیک وضع"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"حذف کریں"</string>
     <string name="inputMethod" msgid="1784759500516314751">"اندراج کا طریقہ"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"متن کی کارروائیاں"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"اس فیلڈ میں ہینڈ رائٹنگ تعاون یافتہ نہیں ہے"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ہینڈ رائٹنگ پاس ورڈ فیلڈز میں تعاون یافتہ نہیں ہے"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"پیچھے"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"اندراج کا طریقہ سوئچ کریں"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"اسٹوریج کی جگہ ختم ہو رہی ہے"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے زیر انتظام ہے"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"آن ہے"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"آف ہے"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">"، "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"کوئی بھی کیلنڈر"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> کچھ آوازوں کو خاموش کر رہا ہے"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"آپ کے آلہ میں ایک داخلی مسئلہ ہے اور جب تک آپ فیکٹری ڈیٹا کو دوبارہ ترتیب نہیں دے دیتے ہیں، ہوسکتا ہے کہ یہ غیر مستحکم رہے۔"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"آپ کے آلہ میں ایک داخلی مسئلہ ہے۔ تفصیلات کیلئے اپنے مینوفیکچرر سے رابطہ کریں۔"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"ٹیسٹ"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"کمیونل"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"سٹلائٹ سے خودکار طور پر منسلک ہے"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"‏آپ موبائل یا Wi-Fi نیٹ ورک کے بغیر پیغامات بھیج اور موصول کر سکتے ہیں"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"پیغامات ایپ کو کھولیں"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 5c73637..dddc3d6 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobil tarmoqqa ulanib bo‘lmadi"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Tarmoq turini almashtiring. Almashtirish uchun bosing."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Favqulodda chaqiruv ishlamayapti"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Wi‑Fi orqali favqulodda chaqiruvlar amalga oshirilmadi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Favqulodda chaqiruvlar uchun mobil tarmoq zarur"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Ogohlantirishlar"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Chaqiruvlarni uzatish"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Favqulodda qaytarib chaqirish rejimi"</string>
@@ -278,7 +278,7 @@
     <string name="global_action_settings" msgid="4671878836947494217">"Sozlamalar"</string>
     <string name="global_action_assist" msgid="2517047220311505805">"Yordam"</string>
     <string name="global_action_voice_assist" msgid="6655788068555086695">"Ovozli yordam"</string>
-    <string name="global_action_lockdown" msgid="2475471405907902963">"Bloklash"</string>
+    <string name="global_action_lockdown" msgid="2475471405907902963">"Qulflash"</string>
     <string name="status_bar_notification_info_overflow" msgid="3330152558746563475">"999+"</string>
     <string name="notification_hidden_text" msgid="2835519769868187223">"Yangi bildirishnoma"</string>
     <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"Tashqi klaviatura"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"O‘chirish"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Kiritish uslubi"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Matn yozish"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Bu qatorda qoʻlyozma ishlatish imkonsiz"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Parol qatorlarida qoʻlyozma ishlatish imkonsiz"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Orqaga"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Matn kiritish usulini almashtirish"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Xotirada joy yetarli emas"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> tomonidan boshqariladi"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Yoniq"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Oʻchiq"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Har qanday taqvim"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ayrim tovushlarni ovozsiz qilgan"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Qurilmangiz bilan bog‘liq ichki muammo mavjud. U zavod sozlamalari tiklanmaguncha barqaror ishlamasligi mumkin."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Qurilmangiz bilan bog‘liq ichki muammo mavjud. Tafsilotlar uchun qurilmangiz ishlab chiqaruvchisiga murojaat qiling."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Umumiy"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Sputnikka avtomatik ulandi"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Mobil yoki Wi-Fi tarmoqsiz xabarlarni yuborishingiz va qabul qilishingiz mumkin"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Xabarlar ilovasini ochish"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 2b39b8a..073a1a8 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Không thể kết nối với mạng di động"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Hãy thử thay đổi mạng ưu tiên. Nhấn để thay đổi."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Không có dịch vụ gọi khẩn cấp"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Không thể thực hiện cuộc gọi khẩn cấp qua Wi‑Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Cần có mạng di động để thực hiện các cuộc gọi khẩn cấp"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Thông báo"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Chuyển tiếp cuộc gọi"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Chế độ gọi lại khẩn cấp"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Xóa"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Phương thức nhập"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Tác vụ văn bản"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Trường này không hỗ trợ tính năng Viết tay"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Các trường mật khẩu không hỗ trợ tính năng Viết tay"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Quay lại"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Chuyển phương thức nhập"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Sắp hết dung lượng lưu trữ"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Do <xliff:g id="APP_NAME">%1$s</xliff:g> quản lý"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Bật"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Tắt"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Bất kỳ lịch nào"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> đang tắt một số âm thanh"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Đã xảy ra sự cố nội bộ với thiết bị của bạn và thiết bị có thể sẽ không ổn định cho tới khi bạn thiết lập lại dữ liệu ban đầu."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Đã xảy ra sự cố nội bộ với thiết bị. Hãy liên hệ với nhà sản xuất của bạn để biết chi tiết."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Kiểm thử"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Dùng chung"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Đã tự động kết nối với vệ tinh"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Bạn có thể gửi và nhận tin nhắn mà không cần có mạng di động hoặc mạng Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Mở ứng dụng Tin nhắn"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 036e91f..ff2d4fc 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"无法连接到移动网络"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"请尝试更改首选网络。点按即可更改。"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"无法使用紧急呼救服务"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"无法通过 WLAN 拨打紧急呼救电话"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"紧急呼叫需要使用移动网络"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"提醒"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"来电转接"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"紧急回拨模式"</string>
@@ -260,7 +260,7 @@
     <string name="global_action_bug_report" msgid="5127867163044170003">"错误报告"</string>
     <string name="global_action_logout" msgid="6093581310002476511">"结束会话"</string>
     <string name="global_action_screenshot" msgid="2610053466156478564">"屏幕截图"</string>
-    <string name="bugreport_title" msgid="8549990811777373050">"Bug 报告"</string>
+    <string name="bugreport_title" msgid="8549990811777373050">"错误报告"</string>
     <string name="bugreport_message" msgid="5212529146119624326">"这会收集有关当前设备状态的信息,并以电子邮件的形式进行发送。从开始生成错误报告到准备好发送需要一点时间,请耐心等待。"</string>
     <string name="bugreport_option_interactive_title" msgid="7968287837902871289">"互动式报告"</string>
     <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"在大多数情况下,建议您使用此选项,以便追踪报告的生成进度,输入与相应问题相关的更多详细信息,以及截取屏幕截图。系统可能会省略掉一些不常用的区段,从而缩短生成报告的时间。"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"删除"</string>
     <string name="inputMethod" msgid="1784759500516314751">"输入法"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"文字操作"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"无法在此字段中使用手写功能"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"无法在密码字段中使用手写功能"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"返回"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"切换输入法"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"存储空间不足"</string>
@@ -1281,7 +1283,7 @@
     <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"正在启动应用。"</string>
     <string name="android_upgrading_complete" msgid="409800058018374746">"即将完成启动。"</string>
     <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"您已按电源按钮,这通常会关闭屏幕。\n\n请尝试在设置指纹时轻轻按一下。"</string>
-    <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"若要结束设置,请关闭屏幕"</string>
+    <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"结束设置,请关闭屏幕"</string>
     <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"关闭"</string>
     <string name="fp_power_button_bp_title" msgid="5585506104526820067">"要继续验证您的指纹吗?"</string>
     <string name="fp_power_button_bp_message" msgid="2983163038168903393">"您已按电源按钮,这通常会关闭屏幕。\n\n请尝试轻轻按一下来验证您的指纹。"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"由<xliff:g id="APP_NAME">%1$s</xliff:g>管理"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"已启用"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"已停用"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">"、 "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"所有日历"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>正在将某些音效设为静音"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"您的设备内部出现了问题。如果不将设备恢复出厂设置,设备运行可能会不稳定。"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"您的设备内部出现了问题。请联系您的设备制造商了解详情。"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"测试"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"共用"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"自动连接到卫星"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"您无需使用移动网络或 WLAN 网络便能收发消息"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"打开“信息”应用"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 460067f..6f560bb 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"無法連線至流動網絡"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"請嘗試變更偏好的網絡。輕按即可變更。"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"無法撥打緊急電話"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"無法經 Wi‑Fi 撥打緊急電話"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"撥打緊急電話需要使用流動網絡"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"通知"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"來電轉駁"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"緊急回撥模式"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"刪除"</string>
     <string name="inputMethod" msgid="1784759500516314751">"輸入法"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"文字操作"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"此欄位無法使用手寫功能"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"密碼欄位無法使用手寫功能"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"返回"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"切換輸入方法"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"儲存空間即將用盡"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"由<xliff:g id="APP_NAME">%1$s</xliff:g>管理"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"已開啟"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"已關閉"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">"、 "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"任何日曆"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>正將某些音效設為靜音"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"你裝置的系統發生問題,回復原廠設定後即可解決該問題。"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"你裝置的系統發生問題,請聯絡你的製造商瞭解詳情。"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"測試"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"共用"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"已自動連線至衛星"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"你可在沒有流動/Wi-Fi 網絡的情況下收發訊息"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"開啟「訊息」"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 1a6b1d5..8b2d534 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"無法連上行動網路"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"請嘗試變更偏好的網路。輕觸即可變更。"</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"無法撥打緊急電話"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"無法透過 Wi‑Fi 撥打緊急電話"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"撥打緊急電話需要使用行動網路"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"快訊"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"來電轉接"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"緊急回撥模式"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"刪除"</string>
     <string name="inputMethod" msgid="1784759500516314751">"輸入法"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"文字動作"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"這個欄位無法使用手寫功能"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"密碼欄位無法使用手寫功能"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"返回"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"切換輸入法"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"儲存空間即將用盡"</string>
@@ -1900,7 +1902,7 @@
     <string name="confirm_battery_saver" msgid="5247976246208245754">"確定"</string>
     <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"省電模式會開啟深色主題,並限制或關閉背景活動、某些視覺效果、特定功能和部分網路連線。"</string>
     <string name="battery_saver_description" msgid="8518809702138617167">"省電模式會開啟深色主題,並限制或關閉背景活動、某些視覺效果、特定功能和部分網路連線。"</string>
-    <string name="data_saver_description" msgid="4995164271550590517">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,在你輕觸後才會顯示。"</string>
+    <string name="data_saver_description" msgid="4995164271550590517">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你有一個使用中的應用程式仍可存取資料,但存取頻率可能會變低。舉例來說,圖片可能要等到你輕觸後才會顯示。"</string>
     <string name="data_saver_enable_title" msgid="7080620065745260137">"要開啟數據節省模式嗎?"</string>
     <string name="data_saver_enable_button" msgid="4399405762586419726">"開啟"</string>
     <string name="zen_mode_duration_minutes_summary" msgid="4555514757230849789">"{count,plural, =1{1 分鐘 (直到 {formattedTime})}other{# 分鐘 (直到 {formattedTime})}}"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"由「<xliff:g id="APP_NAME">%1$s</xliff:g>」管理"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"已啟用"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"已停用"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">"、 "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"任何日曆"</string>
     <string name="muted_by" msgid="91464083490094950">"「<xliff:g id="THIRD_PARTY">%1$s</xliff:g>」正在關閉部分音效"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"你的裝置發生內部問題,必須將裝置恢復原廠設定才能解除不穩定狀態。"</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"你的裝置發生內部問題,詳情請洽裝置製造商。"</string>
@@ -1971,7 +1976,7 @@
     <string name="supervised_user_creation_label" msgid="6884904353827427515">"新增受監管的使用者"</string>
     <string name="language_selection_title" msgid="52674936078683285">"新增語言"</string>
     <string name="country_selection_title" msgid="5221495687299014379">"地區偏好設定"</string>
-    <string name="search_language_hint" msgid="7004225294308793583">"請輸入語言名稱"</string>
+    <string name="search_language_hint" msgid="7004225294308793583">"請輸入語言"</string>
     <string name="language_picker_section_suggested" msgid="6556199184638990447">"建議語言"</string>
     <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"建議地區"</string>
     <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"建議語言"</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"測試"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"通用"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"已自動連上衛星"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"你可以收發訊息,沒有行動/Wi-Fi 網路也無妨"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"開啟「訊息」應用程式"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index cf4858e..922172c 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -84,7 +84,7 @@
     <string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Ayikwazi ukufinyelela kunethiwekhi yeselula"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Zama ukushintsha inethiwekhi encanyelwayo. Thepha ukuze ushintshe."</string>
     <string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Ukushaya okuphuthumayo akutholakali"</string>
-    <string name="EmergencyCallWarningSummary" msgid="1194185880092805497">"Ayikwazi ukwenza amakholi aphuthumayo nge-Wi-Fi"</string>
+    <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Amakholi aphuthumayo adinga inethiwekhi yeselula"</string>
     <string name="notification_channel_network_alert" msgid="4788053066033851841">"Izexwayiso"</string>
     <string name="notification_channel_call_forward" msgid="8230490317314272406">"Ukudlulisa ikholi"</string>
     <string name="notification_channel_emergency_callback" msgid="54074839059123159">"Imodi yokushayela yesimo esiphuthumayo"</string>
@@ -1183,6 +1183,8 @@
     <string name="deleteText" msgid="4200807474529938112">"Susa"</string>
     <string name="inputMethod" msgid="1784759500516314751">"Indlela yokufakwayo"</string>
     <string name="editTextMenuTitle" msgid="857666911134482176">"Izenzo zombhalo"</string>
+    <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Ukubhala ngesandla akusekelwa kule nkambu"</string>
+    <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Ukubhala ngesandla akusekelwa kuzinkambu zephasiwedi"</string>
     <string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Emuva"</string>
     <string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Shintsha indlela yokufaka"</string>
     <string name="low_internal_storage_view_title" msgid="9024241779284783414">"Isikhala sokulondoloza siyaphela"</string>
@@ -1927,6 +1929,9 @@
     <string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Iphethwe yi-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Kuvuliwe"</string>
     <string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Kuvaliwe"</string>
+    <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+    <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>, <xliff:g id="END">%2$s</xliff:g>"</string>
+    <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Noma iyiphi ikhalenda"</string>
     <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ithulisa eminye imisindo"</string>
     <string name="system_error_wipe_data" msgid="5910572292172208493">"Kukhona inkinga yangaphakathi ngedivayisi yakho, futhi ingase ibe engazinzile kuze kube yilapho usetha kabusha yonke idatha."</string>
     <string name="system_error_manufacturer" msgid="703545241070116315">"Kukhona inkinga yangaphakathi ngedivayisi yakho. Xhumana nomkhiqizi wakho ukuze uthole imininingwane."</string>
@@ -2389,6 +2394,8 @@
     <string name="profile_label_test" msgid="9168641926186071947">"Hlola"</string>
     <string name="profile_label_communal" msgid="8743921499944800427">"Okomphakathi"</string>
     <string name="redacted_notification_action_title" msgid="6942924973335920935"></string>
+    <!-- no translation found for screen_not_shared_sensitive_content (7058419185079565001) -->
+    <skip />
     <string name="satellite_notification_title" msgid="4026338973463121526">"Ixhumeke ngokuzenzakalelayo kusathelayithi"</string>
     <string name="satellite_notification_summary" msgid="5207364139430767162">"Ungathumela futhi wamukele imilayezo ngaphandle kwenethiwekhi yeselula noma ye-Wi-Fi"</string>
     <string name="satellite_notification_open_message" msgid="4149234979688273729">"Vula Imilayezo"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 81c79f2..b262ebd 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2400,7 +2400,9 @@
              have been requested to be translucent with
              {@link android.R.attr#windowTranslucentStatus}.
              Corresponds to setting {@link android.view.View#SYSTEM_UI_FLAG_LIGHT_STATUS_BAR} on
-             the decor view. -->
+             the decor view and
+             {@link android.view.WindowInsetsController#APPEARANCE_LIGHT_STATUS_BARS} on the
+             {@link android.view.WindowInsetsController}. -->
         <attr name="windowLightStatusBar" format="boolean" />
 
         <!-- Reference to a drawable to be used as the splash screen content of the window. This
@@ -2422,7 +2424,9 @@
              have been requested to be translucent with
              {@link android.R.attr#windowTranslucentNavigation}.
              Corresponds to setting {@link android.view.View#SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR} on
-             the decor view. -->
+             the decor view and
+             {@link android.view.WindowInsetsController#APPEARANCE_LIGHT_NAVIGATION_BARS} on the
+             {@link android.view.WindowInsetsController}. -->
         <attr name="windowLightNavigationBar" format="boolean" />
 
         <!-- Controls how the window is laid out if there is a {@code DisplayCutout}.
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 89ac81e..d4db244 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2883,6 +2883,13 @@
     -->
     <integer name="config_minimumScreenOffTimeout">10000</integer>
 
+    <!-- User activity timeout: Screen timeout override in milliseconds.
+
+         This value must be greater than 0, otherwise the invalid value will not apply to
+         the screen timeout override policy.
+    -->
+    <integer name="config_screenTimeoutOverride">-1</integer>
+
     <!-- User activity timeout: Maximum screen dim duration in milliseconds.
 
          Sets an upper bound for how long the screen will dim before the device goes
@@ -3344,6 +3351,11 @@
         com.android.systemui/com.android.systemui.tv.hdmi.HdmiCecSetMenuLanguageActivity
     </string>
 
+    <!-- Component name of the activity used to inform user that their device lost Active Source
+      status and will go to standby if there is no interaction. -->
+    <string name="config_hdmiCecActiveSourceLostActivity"
+    >com.android.systemui/com.android.systemui.tv.hdmi.HdmiCecActiveSourceLostActivity</string>
+
     <!-- Name of the dialog that is used to request the user's consent for a Platform VPN -->
     <string name="config_platformVpnConfirmDialogComponent" translatable="false"
             >com.android.vpndialogs/com.android.vpndialogs.PlatformVpnConfirmDialog</string>
@@ -4800,6 +4812,18 @@
      See android.credentials.CredentialManager
     -->
     <string name="config_defaultCredentialManagerHybridService" translatable="false"></string>
+    
+    <!-- The component name, flattened to a string, for the system's credential manager
+      autofill service. This service allows interceding autofill requests and routing
+      them to credential manager.
+
+     This service must be trusted, as it can be activated without explicit consent of the user.
+     If no service with the specified name exists on the device, autofill will still
+     work with the user configured autofill service
+
+     See android.credentials.CredentialManager
+    -->
+    <string name="config_defaultCredentialManagerAutofillService" translatable="false"></string>
 
     <!-- The component name(s), flattened to a string, for the system's credential manager
       provider services. These services allow retrieving and storing credentials.
@@ -6984,4 +7008,14 @@
     <!-- Whether WM DisplayContent supports high performance transitions
          (lower-end devices may want to disable) -->
     <bool name="config_deviceSupportsHighPerfTransitions">true</bool>
+
+    <!-- Wear devices: An intent action that is used for remote intent. -->
+    <string name="config_wearRemoteIntentAction" translatable="false" />
+
+    <!-- Whether desktop mode is supported on the current device  -->
+    <bool name="config_isDesktopModeSupported">false</bool>
+
+    <!-- Frame rate compatibility value for Wallpaper
+         FRAME_RATE_COMPATIBILITY_MIN (102) is used by default for lower power consumption -->
+    <integer name="config_wallpaperFrameRateCompatibility">102</integer>
 </resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index a3dba48..f3aa27f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -5312,6 +5312,13 @@
     <!-- Zen mode - Condition summary when a rule is deactivated due to a call to setInterruptionFilter(). [CHAR_LIMIT=NONE] -->
     <string name="zen_mode_implicit_deactivated">Off</string>
 
+    <!-- [CHAR LIMIT=40] General divider text when concatenating multiple items in a text summary, used for the trigger description of a Zen mode -->
+    <string name="zen_mode_trigger_summary_divider_text">,\u0020</string>
+    <!-- [CHAR LIMIT=40] General template for a symbolic start - end range in a text summary, used for the trigger description of a Zen mode -->
+    <string name="zen_mode_trigger_summary_range_symbol_combination"><xliff:g id="start" example="Sun">%1$s</xliff:g> - <xliff:g id="end" example="Thu">%2$s</xliff:g></string>
+    <!-- [CHAR LIMIT=40] Event-based rule calendar option value for any calendar, used for the trigger description of a Zen mode -->
+    <string name="zen_mode_trigger_event_calendar_any">Any calendar</string>
+
     <!-- Indication that the current volume and other effects (vibration) are being suppressed by a third party, such as a notification listener. [CHAR LIMIT=30] -->
     <string name="muted_by"><xliff:g id="third_party">%1$s</xliff:g> is muting some sounds</string>
 
@@ -6436,6 +6443,9 @@
     <!-- Notification action title used instead of a notification's normal title sensitive [CHAR_LIMIT=NOTIF_BODY] -->
     <string name="redacted_notification_action_title"></string>
 
+    <!-- Toast when an app's content is hidden from screen share (user can still see content) due to potential security risks of showing the content (such as a password or OTP) - [CHAR_LIMIT=TOAST] -->
+    <string name="screen_not_shared_sensitive_content">App content hidden from screen share for security</string>
+
     <!-- Satellite related messages -->
     <!-- Notification title when satellite service is connected. -->
     <string name="satellite_notification_title">Auto connected to satellite</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 2e029b2..f33e277 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -390,6 +390,7 @@
   <java-symbol type="string" name="config_sensorUseStartedActivity_hwToggle" />
   <java-symbol type="string" name="config_sensorStateChangedActivity" />
   <java-symbol type="string" name="config_hdmiCecSetMenuLanguageActivity" />
+  <java-symbol type="string" name="config_hdmiCecActiveSourceLostActivity" />
   <java-symbol type="integer" name="config_minNumVisibleRecentTasks_lowRam" />
   <java-symbol type="integer" name="config_maxNumVisibleRecentTasks_lowRam" />
   <java-symbol type="integer" name="config_minNumVisibleRecentTasks" />
@@ -2285,6 +2286,7 @@
   <java-symbol type="bool" name="config_powerDecoupleAutoSuspendModeFromDisplay" />
   <java-symbol type="bool" name="config_powerDecoupleInteractiveModeFromDisplay" />
   <java-symbol type="integer" name="config_minimumScreenOffTimeout" />
+  <java-symbol type="integer" name="config_screenTimeoutOverride" />
   <java-symbol type="integer" name="config_maximumScreenDimDuration" />
   <java-symbol type="fraction" name="config_maximumScreenDimRatio" />
   <java-symbol type="integer" name="config_attentiveTimeout" />
@@ -2609,6 +2611,10 @@
   <java-symbol type="string" name="zen_mode_implicit_trigger_description" />
   <java-symbol type="string" name="zen_mode_implicit_activated" />
   <java-symbol type="string" name="zen_mode_implicit_deactivated" />
+  <java-symbol type="string" name="zen_mode_trigger_summary_divider_text" />
+  <java-symbol type="string" name="zen_mode_trigger_summary_range_symbol_combination" />
+  <java-symbol type="string" name="zen_mode_trigger_event_calendar_any" />
+
   <java-symbol type="string" name="display_rotation_camera_compat_toast_after_rotation" />
   <java-symbol type="string" name="display_rotation_camera_compat_toast_in_multi_window" />
   <java-symbol type="array" name="config_system_condition_providers" />
@@ -3900,6 +3906,7 @@
   <java-symbol type="string" name="config_defaultAppPredictionService" />
   <java-symbol type="string" name="config_defaultContentSuggestionsService" />
   <java-symbol type="string" name="config_defaultCredentialManagerHybridService" />
+  <java-symbol type="string" name="config_defaultCredentialManagerAutofillService" />
   <java-symbol type="array" name="config_enabledCredentialProviderService" />
   <java-symbol type="array" name="config_primaryCredentialProviderService" />
   <java-symbol type="string" name="config_defaultSearchUiService" />
@@ -5202,9 +5209,10 @@
   <java-symbol type="string" name="keyboard_layout_notification_multiple_selected_title"/>
   <java-symbol type="string" name="keyboard_layout_notification_multiple_selected_message"/>
 
-  <!-- For redacted notifications -->
+  <!-- For redacted notifications and screen sharing-->
   <java-symbol type="string" name="redacted_notification_message"/>
   <java-symbol type="string" name="redacted_notification_action_title"/>
+  <java-symbol type="string" name="screen_not_shared_sensitive_content"/>
 
   <java-symbol type="bool" name="config_batteryStatsResetOnUnplugHighBatteryLevel" />
   <java-symbol type="bool" name="config_batteryStatsResetOnUnplugAfterSignificantCharge" />
@@ -5385,4 +5393,12 @@
 
   <!-- Whether WM DisplayContent supports high performance transitions -->
   <java-symbol type="bool" name="config_deviceSupportsHighPerfTransitions" />
+
+  <java-symbol type="string" name="config_wearRemoteIntentAction" />
+
+  <!-- Whether desktop mode is supported on the current device  -->
+  <java-symbol type="bool" name="config_isDesktopModeSupported" />
+
+  <!-- Frame rate compatibility value for Wallpaper -->
+  <java-symbol type="integer" name="config_wallpaperFrameRateCompatibility" />
 </resources>
diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml
index c8625b9..9bb72d9 100644
--- a/core/res/res/xml/sms_short_codes.xml
+++ b/core/res/res/xml/sms_short_codes.xml
@@ -28,7 +28,7 @@
          standard SMS rate. The user is warned when the destination phone number matches the
          "pattern" or "premium" regexes, and does not match the "free" or "standard" regexes. -->
 
-    <!-- Harmonised European Short Codes are 6 digit numbers starting with 116 (free helplines).
+    <!-- Harmonised European Short Codes are 7 digit numbers starting with 116 (free helplines).
          Premium patterns include short codes from: http://aonebill.com/coverage&tariffs
          and http://mobilcent.com/info-worldwide.asp and extracted from:
          http://smscoin.net/software/engine/WordPress/Paid+SMS-registration/ -->
@@ -39,8 +39,8 @@
     <!-- Albania: 5 digits, known short codes listed -->
     <shortcode country="al" pattern="\\d{5}" premium="15191|55[56]00" />
 
-    <!-- Argentina: 5 digits, known short codes listed -->
-    <shortcode country="ar" pattern="\\d{5}" free="11711|28291|44077|78887" />
+    <!-- Argentina: 6 digits, known short codes listed -->
+    <shortcode country="ar" pattern="\\d{1,6}" free="11711|28291|44077|78887|191289|39010" />
 
     <!-- Armenia: 3-5 digits, emergency numbers 10[123] -->
     <shortcode country="am" pattern="\\d{3,5}" premium="11[2456]1|3024" free="10[123]|71522|71512|71502" />
@@ -67,7 +67,7 @@
     <shortcode country="bh" pattern="\\d{1,5}" free="81181|85999" />
 
     <!-- Brazil: 1-5 digits (standard system default, not country specific) -->
-    <shortcode country="br" pattern="\\d{1,5}" free="6000[012]\\d|876|5500|9963|4141|8000" />
+    <shortcode country="br" pattern="\\d{1,5}" free="6000[012]\\d|876|5500|9963|4141|8000|2652" />
 
     <!-- Belarus: 4 digits -->
     <shortcode country="by" pattern="\\d{4}" premium="3336|4161|444[4689]|501[34]|7781" />
@@ -163,7 +163,7 @@
     <shortcode country="in" pattern="\\d{1,5}" free="59336|53969" />
 
     <!-- Indonesia: 1-5 digits (standard system default, not country specific) -->
-    <shortcode country="id" pattern="\\d{1,5}" free="99477|6006|46645|363|93457" />
+    <shortcode country="id" pattern="\\d{1,5}" free="99477|6006|46645|363|93457|99265" />
 
     <!-- Ireland: 5 digits, 5xxxx (50xxx=free, 5[12]xxx=standard), plus EU:
          http://www.comreg.ie/_fileupload/publications/ComReg1117.pdf -->
@@ -172,6 +172,9 @@
     <!-- Israel: 1-5 digits, known premium codes listed -->
     <shortcode country="il" pattern="\\d{1,5}" premium="4422|4545" free="37477|6681" />
 
+    <!-- Iran: 4-6 digits, known premium codes listed -->
+    <shortcode country="ir" pattern="\\d{4,6}" free="700791|700792" />
+
     <!-- Italy: 5 digits (premium=41xxx,42xxx), plus EU:
          https://www.itu.int/dms_pub/itu-t/oth/02/02/T020200006B0001PDFE.pdf -->
     <shortcode country="it" pattern="\\d{5}" premium="44[0-4]\\d{2}|47[0-4]\\d{2}|48[0-4]\\d{2}|44[5-9]\\d{4}|47[5-9]\\d{4}|48[5-9]\\d{4}|455\\d{2}|499\\d{2}" free="116\\d{3}|4112503|40\\d{0,12}" standard="430\\d{2}|431\\d{2}|434\\d{4}|435\\d{4}|439\\d{7}" />
@@ -219,11 +222,11 @@
     <!-- Mozambique: 1-5 digits (standard system default, not country specific) -->
     <shortcode country="mz" pattern="\\d{1,5}" free="1714" />
 
-    <!-- Mexico: 4-5 digits (not confirmed), known premium codes listed -->
-    <shortcode country="mx" pattern="\\d{4,6}" premium="53035|7766" free="26259|46645|50025|50052|5050|76551|88778|9963|91101|45453|550346" />
+    <!-- Mexico: 4-7 digits (not confirmed), known premium codes listed -->
+    <shortcode country="mx" pattern="\\d{4,7}" premium="53035|7766" free="26259|46645|50025|50052|5050|76551|88778|9963|91101|45453|550346|3030303" />
 
     <!-- Malaysia: 5 digits: http://www.skmm.gov.my/attachment/Consumer_Regulation/Mobile_Content_Services_FAQs.pdf -->
-    <shortcode country="my" pattern="\\d{5}" premium="32298|33776" free="22099|28288|66668" />
+    <shortcode country="my" pattern="\\d{5}" premium="32298|33776" free="22099|28288|66668|66966" />
 
     <!-- Namibia: 1-5 digits (standard system default, not country specific) -->
     <shortcode country="na" pattern="\\d{1,5}" free="40005" />
@@ -255,6 +258,9 @@
     <!-- Palestine: 5 digits, known premium codes listed -->
     <shortcode country="ps" pattern="\\d{1,5}" free="37477|6681" />
 
+    <!-- Paraguay: 6 digits, known premium codes listed -->
+    <shortcode country="py" pattern="\\d{6}" free="191289" />
+
     <!-- Poland: 4-5 digits (not confirmed), known premium codes listed, plus EU -->
     <shortcode country="pl" pattern="\\d{4,5}" premium="74240|79(?:10|866)|92525" free="116\\d{3}|8012|80921" />
 
@@ -275,7 +281,7 @@
     <shortcode country="ru" pattern="\\d{4}" premium="1(?:1[56]1|899)|2(?:09[57]|322|47[46]|880|990)|3[589]33|4161|44(?:4[3-9]|81)|77(?:33|81)|8424" free="6954|8501" standard="2037|2044"/>
 
     <!-- Rwanda: 4 digits -->
-    <shortcode country="rw" pattern="\\d{4}" free="5060" />
+    <shortcode country="rw" pattern="\\d{4}" free="5060|5061" />
 
     <!-- Saudi Arabia -->
     <shortcode country="sa" pattern="\\d{1,5}" free="8145" />
@@ -309,7 +315,10 @@
     <shortcode country="tj" pattern="\\d{4}" premium="11[3-7]1|4161|4333|444[689]" />
 
     <!-- Tanzania: 1-5 digits (standard system default, not country specific) -->
-    <shortcode country="tz" pattern="\\d{1,5}" free="15046|15234" />
+    <shortcode country="tz" pattern="\\d{1,5}" free="15046|15234|15324" />
+
+    <!-- Tunisia: 5 digits, known premium codes listed -->
+    <shortcode country="tn" pattern="\\d{5}" free="85799" />
 
     <!-- Turkey -->
     <shortcode country="tr" pattern="\\d{1,5}" free="7529|5528|6493|3193" />
@@ -324,8 +333,11 @@
          visual voicemail code for T-Mobile: 122 -->
     <shortcode country="us" pattern="\\d{5,6}" premium="20433|21(?:344|472)|22715|23(?:333|847)|24(?:15|28)0|25209|27(?:449|606|663)|28498|305(?:00|83)|32(?:340|941)|33(?:166|786|849)|34746|35(?:182|564)|37975|38(?:135|146|254)|41(?:366|463)|42335|43(?:355|500)|44(?:578|711|811)|45814|46(?:157|173|327)|46666|47553|48(?:221|277|669)|50(?:844|920)|51(?:062|368)|52944|54(?:723|892)|55928|56483|57370|59(?:182|187|252|342)|60339|61(?:266|982)|62478|64(?:219|898)|65(?:108|500)|69(?:208|388)|70877|71851|72(?:078|087|465)|73(?:288|588|882|909|997)|74(?:034|332|815)|76426|79213|81946|83177|84(?:103|685)|85797|86(?:234|236|666)|89616|90(?:715|842|938)|91(?:362|958)|94719|95297|96(?:040|666|835|969)|97(?:142|294|688)|99(?:689|796|807)" standard="44567|244444" free="122|87902|21696|24614|28003|30356|33669|40196|41064|41270|43753|44034|46645|52413|56139|57969|61785|66975|75136|76227|81398|83952|85140|86566|86799|95737|96684|99245|611611|96831" />
 
-    <!--Uruguay : 1-5 digits (standard system default, not country specific) -->
-    <shortcode country="uy" pattern="\\d{1,5}" free="55002" />
+    <!--Uruguay : 1-6 digits (standard system default, not country specific) -->
+    <shortcode country="uy" pattern="\\d{1,6}" free="55002|191289" />
+
+    <!-- Venezuela: 1-6 digits (standard system default, not country specific) -->
+    <shortcode country="ve" pattern="\\d{1,6}" free="538352" />
 
     <!-- Vietnam: 1-5 digits (standard system default, not country specific) -->
     <shortcode country="vn" pattern="\\d{1,5}" free="5001|9055|8079" />
@@ -336,6 +348,9 @@
     <!-- South Africa -->
     <shortcode country="za" pattern="\\d{1,5}" free="44136|30791|36056|33009" />
 
+    <!-- Yemen -->
+    <shortcode country="ye" pattern="\\d{1,4}" free="5081" />
+
     <!-- Zimbabwe -->
     <shortcode country="zw" pattern="\\d{1,5}" free="33679" />
 
diff --git a/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java b/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java
index 6cc5485..8072d69 100644
--- a/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java
+++ b/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.os.bugreports.tests;
 
+import static android.content.Context.RECEIVER_EXPORTED;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertNotNull;
@@ -358,7 +360,10 @@
         // shell UID rather than our own.
         BugreportBroadcastReceiver br = new BugreportBroadcastReceiver();
         InstrumentationRegistry.getContext()
-                .registerReceiver(br, new IntentFilter(INTENT_BUGREPORT_FINISHED));
+                .registerReceiver(
+                        br,
+                        new IntentFilter(INTENT_BUGREPORT_FINISHED),
+                        RECEIVER_EXPORTED);
         UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
                 .executeShellCommand("am bug-report");
 
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index 24031cad..4808204 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -134,6 +134,8 @@
         ":BinderDeathRecipientHelperApp1",
         ":BinderDeathRecipientHelperApp2",
         ":com.android.cts.helpers.aosp",
+        ":BinderProxyCountingTestApp",
+        ":BinderProxyCountingTestService",
     ],
 }
 
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index 62d58b6..c05ea3d 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -254,6 +254,17 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="android.widget.AbsListViewActivity"
+                android:label="AbsListViewActivity"
+                android:screenOrientation="portrait"
+                android:exported="true"
+                android:theme="@android:style/Theme.Material.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="android.widget.DatePickerActivity"
                 android:label="DatePickerActivity"
                 android:screenOrientation="portrait"
diff --git a/core/tests/coretests/AndroidTest.xml b/core/tests/coretests/AndroidTest.xml
index 05b309b..bf2a5b8 100644
--- a/core/tests/coretests/AndroidTest.xml
+++ b/core/tests/coretests/AndroidTest.xml
@@ -22,6 +22,8 @@
         <option name="test-file-name" value="FrameworksCoreTests.apk" />
         <option name="test-file-name" value="BinderDeathRecipientHelperApp1.apk" />
         <option name="test-file-name" value="BinderDeathRecipientHelperApp2.apk" />
+        <option name="test-file-name" value="BinderProxyCountingTestApp.apk" />
+        <option name="test-file-name" value="BinderProxyCountingTestService.apk" />
     </target_preparer>
 
     <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
diff --git a/core/tests/coretests/BinderProxyCountingTestApp/AndroidManifest.xml b/core/tests/coretests/BinderProxyCountingTestApp/AndroidManifest.xml
index a971730..c8407b8 100644
--- a/core/tests/coretests/BinderProxyCountingTestApp/AndroidManifest.xml
+++ b/core/tests/coretests/BinderProxyCountingTestApp/AndroidManifest.xml
@@ -16,6 +16,9 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.android.frameworks.coretests.binderproxycountingtestapp">
 
+    <queries>
+        <package android:name="com.android.frameworks.coretests.binderproxycountingtestservice" />
+    </queries>
     <application>
         <service android:name=".BpcTestAppCmdService"
                  android:exported="true"/>
diff --git a/core/tests/coretests/BinderProxyCountingTestApp/src/com/android/frameworks/coretests/binderproxycountingtestapp/BpcTestAppCmdService.java b/core/tests/coretests/BinderProxyCountingTestApp/src/com/android/frameworks/coretests/binderproxycountingtestapp/BpcTestAppCmdService.java
index 5aae1203..a7e97d3 100644
--- a/core/tests/coretests/BinderProxyCountingTestApp/src/com/android/frameworks/coretests/binderproxycountingtestapp/BpcTestAppCmdService.java
+++ b/core/tests/coretests/BinderProxyCountingTestApp/src/com/android/frameworks/coretests/binderproxycountingtestapp/BpcTestAppCmdService.java
@@ -17,14 +17,15 @@
 package com.android.frameworks.coretests.binderproxycountingtestapp;
 
 import android.app.Service;
-import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.ServiceConnection;
+import android.database.ContentObserver;
+import android.os.Handler;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.provider.Settings;
 import android.util.Log;
 
 import com.android.frameworks.coretests.aidl.IBinderProxyCountingService;
@@ -49,24 +50,20 @@
 
     private IBpcTestAppCmdService.Stub mBinder = new IBpcTestAppCmdService.Stub() {
 
-        private ArrayList<BroadcastReceiver> mBrList = new ArrayList();
+        private ArrayList<ContentObserver> mCoList = new ArrayList();
         private ArrayList<ITestRemoteCallback> mTrcList = new ArrayList();
+        private Handler mHandler = new Handler();
 
         @Override
         public void createSystemBinders(int count) {
             int i = 0;
             while (i++ < count) {
-                BroadcastReceiver br = new BroadcastReceiver() {
-                    @Override
-                    public void onReceive(Context context, Intent intent) {
-
-                    }
-                };
-                IntentFilter filt = new IntentFilter(Intent.ACTION_POWER_DISCONNECTED);
-                synchronized (mBrList) {
-                    mBrList.add(br);
+                final ContentObserver co = new ContentObserver(mHandler) {};
+                synchronized (mCoList) {
+                    mCoList.add(co);
                 }
-                registerReceiver(br, filt);
+                getContentResolver().registerContentObserver(
+                        Settings.System.CONTENT_URI, false, co);
             }
         }
 
@@ -74,11 +71,11 @@
         public void releaseSystemBinders(int count) {
             int i = 0;
             while (i++ < count) {
-                BroadcastReceiver br;
-                synchronized (mBrList) {
-                    br = mBrList.remove(0);
+                ContentObserver co;
+                synchronized (mCoList) {
+                    co = mCoList.remove(0);
                 }
-                unregisterReceiver(br);
+                getContentResolver().unregisterContentObserver(co);
             }
         }
 
@@ -117,9 +114,9 @@
 
         @Override
         public void releaseAllBinders() {
-            synchronized (mBrList) {
-                while (mBrList.size() > 0) {
-                    unregisterReceiver(mBrList.remove(0));
+            synchronized (mCoList) {
+                while (mCoList.size() > 0) {
+                    getContentResolver().unregisterContentObserver(mCoList.remove(0));
                 }
             }
             synchronized (mTrcList) {
@@ -179,4 +176,4 @@
     public IBinder onBind(Intent intent) {
         return mBinder;
     }
-}
\ No newline at end of file
+}
diff --git a/core/tests/coretests/BinderProxyCountingTestService/src/com/android/frameworks/coretests/binderproxycountingtestservice/BpcTestServiceCmdService.java b/core/tests/coretests/BinderProxyCountingTestService/src/com/android/frameworks/coretests/binderproxycountingtestservice/BpcTestServiceCmdService.java
index 6bed2a2..0f1accc 100644
--- a/core/tests/coretests/BinderProxyCountingTestService/src/com/android/frameworks/coretests/binderproxycountingtestservice/BpcTestServiceCmdService.java
+++ b/core/tests/coretests/BinderProxyCountingTestService/src/com/android/frameworks/coretests/binderproxycountingtestservice/BpcTestServiceCmdService.java
@@ -55,8 +55,8 @@
         }
 
         @Override
-        public void setBinderProxyWatermarks(int high, int low) {
-            BinderInternal.nSetBinderProxyCountWatermarks(high, low);
+        public void setBinderProxyWatermarks(int high, int low, int warning) {
+            BinderInternal.nSetBinderProxyCountWatermarks(high, low, warning);
         }
 
         @Override
@@ -68,12 +68,23 @@
         public void setBinderProxyCountCallback(IBpcCallbackObserver observer) {
             if (observer != null) {
                 BinderInternal.setBinderProxyCountCallback(
-                        new BinderInternal.BinderProxyLimitListener() {
+                        new BinderInternal.BinderProxyCountEventListener() {
                             @Override
                             public void onLimitReached(int uid) {
                                 try {
                                     synchronized (observer) {
-                                        observer.onCallback(uid);
+                                        observer.onLimitReached(uid);
+                                    }
+                                } catch (Exception e) {
+                                    Log.e(TAG, e.toString());
+                                }
+                            }
+
+                            @Override
+                            public void onWarningThresholdReached(int uid) {
+                                try {
+                                    synchronized (observer) {
+                                        observer.onWarningThresholdReached(uid);
                                     }
                                 } catch (Exception e) {
                                     Log.e(TAG, e.toString());
@@ -98,4 +109,4 @@
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
     }
-}
\ No newline at end of file
+}
diff --git a/core/tests/coretests/aidl/com/android/frameworks/coretests/aidl/IBpcCallbackObserver.aidl b/core/tests/coretests/aidl/com/android/frameworks/coretests/aidl/IBpcCallbackObserver.aidl
index c4ebd56..ada7d92 100644
--- a/core/tests/coretests/aidl/com/android/frameworks/coretests/aidl/IBpcCallbackObserver.aidl
+++ b/core/tests/coretests/aidl/com/android/frameworks/coretests/aidl/IBpcCallbackObserver.aidl
@@ -17,5 +17,6 @@
 package com.android.frameworks.coretests.aidl;
 
 interface IBpcCallbackObserver {
-    void onCallback(int uid);
-}
\ No newline at end of file
+    void onLimitReached(int uid);
+    void onWarningThresholdReached(int uid);
+}
diff --git a/core/tests/coretests/aidl/com/android/frameworks/coretests/aidl/IBpcTestServiceCmdService.aidl b/core/tests/coretests/aidl/com/android/frameworks/coretests/aidl/IBpcTestServiceCmdService.aidl
index abdab41..cdcda9d 100644
--- a/core/tests/coretests/aidl/com/android/frameworks/coretests/aidl/IBpcTestServiceCmdService.aidl
+++ b/core/tests/coretests/aidl/com/android/frameworks/coretests/aidl/IBpcTestServiceCmdService.aidl
@@ -20,7 +20,7 @@
 interface IBpcTestServiceCmdService {
    void forceGc();
    int getBinderProxyCount(int uid);
-   void setBinderProxyWatermarks(int high, int low);
+   void setBinderProxyWatermarks(int high, int low, int warning);
    void enableBinderProxyLimit(boolean enable);
    void setBinderProxyCountCallback(IBpcCallbackObserver observer);
-}
\ No newline at end of file
+}
diff --git a/core/tests/coretests/res/layout/activity_abslist_view.xml b/core/tests/coretests/res/layout/activity_abslist_view.xml
new file mode 100644
index 0000000..85b4f11
--- /dev/null
+++ b/core/tests/coretests/res/layout/activity_abslist_view.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
+  -->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+  <view
+      class="android.widget.AbsListViewFunctionalTest$MyListView"
+      android:id="@+id/list_view"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+  />
+</LinearLayout>
\ No newline at end of file
diff --git a/core/tests/coretests/res/layout/activity_horizontal_scroll_view.xml b/core/tests/coretests/res/layout/activity_horizontal_scroll_view.xml
index 5029212..44dc1f8 100644
--- a/core/tests/coretests/res/layout/activity_horizontal_scroll_view.xml
+++ b/core/tests/coretests/res/layout/activity_horizontal_scroll_view.xml
@@ -22,7 +22,7 @@
 
     <HorizontalScrollView
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
+        android:layout_height="wrap_content"
         android:id="@+id/horizontal_scroll_view">
 
         <LinearLayout
@@ -133,31 +133,31 @@
         <LinearLayout
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:orientation="vertical">
+            android:orientation="horizontal">
             <View
                 android:background="#00F"
-                android:layout_width="90dp"
-                android:layout_height="50dp"/>
+                android:layout_width="100dp"
+                android:layout_height="90dp"/>
             <View
                 android:background="#0FF"
-                android:layout_width="90dp"
-                android:layout_height="50dp"/>
+                android:layout_width="100dp"
+                android:layout_height="90dp"/>
             <View
                 android:background="#0F0"
-                android:layout_width="90dp"
-                android:layout_height="50dp"/>
+                android:layout_width="100dp"
+                android:layout_height="90dp"/>
             <View
                 android:background="#FF0"
-                android:layout_width="90dp"
-                android:layout_height="50dp"/>
+                android:layout_width="100dp"
+                android:layout_height="90dp"/>
             <View
                 android:background="#F00"
-                android:layout_width="90dp"
-                android:layout_height="50dp"/>
+                android:layout_width="100dp"
+                android:layout_height="90dp"/>
             <View
                 android:background="#F0F"
-                android:layout_width="90dp"
-                android:layout_height="50dp"/>
+                android:layout_width="100dp"
+                android:layout_height="90dp"/>
         </LinearLayout>
     </view>
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/core/tests/coretests/res/layout/activity_scroll_view.xml b/core/tests/coretests/res/layout/activity_scroll_view.xml
index db8cd02..0d4afd5 100644
--- a/core/tests/coretests/res/layout/activity_scroll_view.xml
+++ b/core/tests/coretests/res/layout/activity_scroll_view.xml
@@ -18,10 +18,10 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical">
+    android:orientation="horizontal">
 
     <ScrollView
-        android:layout_width="match_parent"
+        android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:id="@+id/scroll_view">
 
diff --git a/core/tests/coretests/src/android/app/AutomaticZenRuleTest.java b/core/tests/coretests/src/android/app/AutomaticZenRuleTest.java
index 33f37da..a5c8545 100644
--- a/core/tests/coretests/src/android/app/AutomaticZenRuleTest.java
+++ b/core/tests/coretests/src/android/app/AutomaticZenRuleTest.java
@@ -16,6 +16,8 @@
 
 package android.app;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.fail;
 
@@ -177,6 +179,24 @@
 
     @Test
     @EnableFlags(Flags.FLAG_MODES_API)
+    public void constructor_defaultTypeUnknown() {
+        AutomaticZenRule rule = new AutomaticZenRule("name", new ComponentName("pkg", "cps"), null,
+                Uri.parse("conditionId"), null, NotificationManager.INTERRUPTION_FILTER_PRIORITY,
+                true);
+
+        assertThat(rule.getType()).isEqualTo(AutomaticZenRule.TYPE_UNKNOWN);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_MODES_API)
+    public void builder_defaultTypeUnknown() {
+        AutomaticZenRule rule = new AutomaticZenRule.Builder("name",
+                Uri.parse("conditionId")).build();
+
+        assertThat(rule.getType()).isEqualTo(AutomaticZenRule.TYPE_UNKNOWN);
+    }
+    @Test
+    @EnableFlags(Flags.FLAG_MODES_API)
     public void validate_builderWithValidType_succeeds() throws Exception {
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri"))
                 .setType(AutomaticZenRule.TYPE_BEDTIME)
diff --git a/core/tests/coretests/src/android/app/NotificationChannelTest.java b/core/tests/coretests/src/android/app/NotificationChannelTest.java
index 18209b5..504f98f 100644
--- a/core/tests/coretests/src/android/app/NotificationChannelTest.java
+++ b/core/tests/coretests/src/android/app/NotificationChannelTest.java
@@ -31,6 +31,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import android.annotation.FlaggedApi;
 import android.content.AttributionSource;
 import android.content.ContentProvider;
 import android.content.ContentResolver;
@@ -46,6 +47,7 @@
 import android.os.RemoteCallback;
 import android.os.RemoteException;
 import android.os.VibrationEffect;
+import android.platform.test.annotations.EnableFlags;
 import android.platform.test.annotations.Presubmit;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.MediaStore.Audio.AudioColumns;
@@ -577,6 +579,40 @@
         assertNull(channel.getVibrationEffect());
     }
 
+    @Test
+    @EnableFlags({Flags.FLAG_RESTRICT_AUDIO_ATTRIBUTES_MEDIA,
+            Flags.FLAG_RESTRICT_AUDIO_ATTRIBUTES_CALL, Flags.FLAG_RESTRICT_AUDIO_ATTRIBUTES_ALARM})
+    public void testCopy() {
+        NotificationChannel original = new NotificationChannel("id", "name", 2);
+        original.setDescription("desc");
+        original.setBypassDnd(true);
+        original.setLockscreenVisibility(7);
+        original.setSound(Uri.EMPTY, new AudioAttributes.Builder().build());
+        original.setLightColor(5);
+        original.enableLights(false);
+        original.setVibrationPattern(new long[] {1, 9, 3});
+        if (Flags.notificationChannelVibrationEffectApi()) {
+            original.setVibrationEffect(VibrationEffect.createOneShot(100, 5));
+        }
+        original.lockFields(9999);
+        original.setUserVisibleTaskShown(true);
+        original.enableVibration(false);
+        original.setShowBadge(true);
+        original.setDeleted(false);
+        original.setGroup("group");
+        original.setBlockable(false);
+        original.setAllowBubbles(true);
+        original.setOriginalImportance(6);
+        original.setConversationId("parent", "convo");
+        original.setDemoted(false);
+        original.setImportantConversation(true);
+        original.setDeletedTimeMs(100);
+        original.setImportanceLockedByCriticalDeviceFunction(false);
+
+        NotificationChannel parcelCopy = writeToAndReadFromParcel(original);
+        assertThat(original.copy()).isEqualTo(parcelCopy);
+    }
+
     /** Backs up a given channel to an XML, and returns the channel read from the XML. */
     private NotificationChannel backUpAndRestore(NotificationChannel channel) throws Exception {
         TypedXmlSerializer serializer = Xml.newFastSerializer();
diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
index 927c67c..f87a9e2 100644
--- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
+++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
@@ -34,9 +34,11 @@
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.clearInvocations;
 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.annotation.NonNull;
@@ -67,10 +69,10 @@
 import android.hardware.display.VirtualDisplay;
 import android.os.Bundle;
 import android.os.IBinder;
-import android.os.RemoteException;
 import android.platform.test.annotations.Presubmit;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.util.DisplayMetrics;
+import android.util.Log;
 import android.util.MergedConfiguration;
 import android.view.Display;
 import android.view.View;
@@ -90,7 +92,6 @@
 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;
@@ -109,6 +110,9 @@
 @MediumTest
 @Presubmit
 public class ActivityThreadTest {
+
+    private static final String TAG = "ActivityThreadTest";
+
     private static final int TIMEOUT_SEC = 10;
 
     // The first sequence number to try with. Use a large number to avoid conflicts with the first a
@@ -123,9 +127,7 @@
     @Rule(order = 1)
     public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT);
 
-    @Mock
-    private BiConsumer<IBinder, ActivityWindowInfo> mActivityWindowInfoListener;
-
+    private ActivityWindowInfoListener mActivityWindowInfoListener;
     private WindowTokenClientController mOriginalWindowTokenClientController;
     private Configuration mOriginalAppConfig;
 
@@ -140,6 +142,7 @@
         mOriginalWindowTokenClientController = WindowTokenClientController.getInstance();
         mOriginalAppConfig = new Configuration(ActivityThread.currentActivityThread()
                 .getConfiguration());
+        mActivityWindowInfoListener = spy(new ActivityWindowInfoListener());
     }
 
     @After
@@ -808,96 +811,107 @@
     @Test
     public void testActivityWindowInfoChanged_activityLaunch() {
         mSetFlagsRule.enableFlags(FLAG_ACTIVITY_WINDOW_INFO_FLAG);
-
         ClientTransactionListenerController.getInstance().registerActivityWindowInfoChangedListener(
                 mActivityWindowInfoListener);
 
         final Activity activity = mActivityTestRule.launchActivity(new Intent());
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+        mActivityWindowInfoListener.await();
         final ActivityClientRecord activityClientRecord = getActivityClientRecord(activity);
 
-        verify(mActivityWindowInfoListener).accept(activityClientRecord.token,
+        // In case the system change the window after launch, there can be more than one callback.
+        verify(mActivityWindowInfoListener, atLeastOnce()).accept(activityClientRecord.token,
                 activityClientRecord.getActivityWindowInfo());
     }
 
     @Test
-    public void testActivityWindowInfoChanged_activityRelaunch() throws RemoteException {
+    public void testActivityWindowInfoChanged_activityRelaunch() {
         mSetFlagsRule.enableFlags(FLAG_ACTIVITY_WINDOW_INFO_FLAG);
-
         ClientTransactionListenerController.getInstance().registerActivityWindowInfoChangedListener(
                 mActivityWindowInfoListener);
 
         final Activity activity = mActivityTestRule.launchActivity(new Intent());
-        final IApplicationThread appThread = activity.getActivityThread().getApplicationThread();
-        appThread.scheduleTransaction(newRelaunchResumeTransaction(activity));
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+        mActivityWindowInfoListener.await();
         final ActivityClientRecord activityClientRecord = getActivityClientRecord(activity);
 
-        // The same ActivityWindowInfo won't trigger duplicated callback.
-        verify(mActivityWindowInfoListener).accept(activityClientRecord.token,
-                activityClientRecord.getActivityWindowInfo());
+        // Run on main thread to avoid racing from updating from window relayout.
+        final ActivityThread activityThread = activity.getActivityThread();
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            // Try relaunch with the same ActivityWindowInfo
+            clearInvocations(mActivityWindowInfoListener);
+            activityThread.executeTransaction(newRelaunchResumeTransaction(activity));
 
-        final Configuration currentConfig = activity.getResources().getConfiguration();
-        final ActivityWindowInfo activityWindowInfo = new ActivityWindowInfo();
-        activityWindowInfo.set(true /* isEmbedded */, new Rect(0, 0, 1000, 2000),
-                new Rect(0, 0, 1000, 1000));
-        final ActivityRelaunchItem relaunchItem = ActivityRelaunchItem.obtain(
-                activity.getActivityToken(), null, null, 0,
-                new MergedConfiguration(currentConfig, currentConfig),
-                false /* preserveWindow */, activityWindowInfo);
-        final ClientTransaction transaction = newTransaction(activity);
-        transaction.addTransactionItem(relaunchItem);
-        appThread.scheduleTransaction(transaction);
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+            // The same ActivityWindowInfo won't trigger duplicated callback.
+            verify(mActivityWindowInfoListener, never()).accept(activityClientRecord.token,
+                    activityClientRecord.getActivityWindowInfo());
 
-        verify(mActivityWindowInfoListener).accept(activityClientRecord.token,
-                activityWindowInfo);
+            // Try relaunch with different ActivityWindowInfo
+            final Configuration currentConfig = activity.getResources().getConfiguration();
+            final ActivityWindowInfo newInfo = new ActivityWindowInfo();
+            newInfo.set(true /* isEmbedded */, new Rect(0, 0, 1000, 2000),
+                    new Rect(0, 0, 1000, 1000));
+            final ActivityRelaunchItem relaunchItem = ActivityRelaunchItem.obtain(
+                    activity.getActivityToken(), null, null, 0,
+                    new MergedConfiguration(currentConfig, currentConfig),
+                    false /* preserveWindow */, newInfo);
+            final ClientTransaction transaction = newTransaction(activity);
+            transaction.addTransactionItem(relaunchItem);
+
+            clearInvocations(mActivityWindowInfoListener);
+            activityThread.executeTransaction(transaction);
+
+            // Trigger callback with a different ActivityWindowInfo
+            verify(mActivityWindowInfoListener).accept(activityClientRecord.token, newInfo);
+        });
     }
 
     @Test
-    public void testActivityWindowInfoChanged_activityConfigurationChanged()
-            throws RemoteException {
+    public void testActivityWindowInfoChanged_activityConfigurationChanged() {
         mSetFlagsRule.enableFlags(FLAG_ACTIVITY_WINDOW_INFO_FLAG);
-
         ClientTransactionListenerController.getInstance().registerActivityWindowInfoChangedListener(
                 mActivityWindowInfoListener);
 
         final Activity activity = mActivityTestRule.launchActivity(new Intent());
-        final IApplicationThread appThread = activity.getActivityThread().getApplicationThread();
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+        mActivityWindowInfoListener.await();
 
-        clearInvocations(mActivityWindowInfoListener);
-        final Configuration config = new Configuration(activity.getResources().getConfiguration());
-        config.seq++;
-        final Rect taskBounds = new Rect(0, 0, 1000, 2000);
-        final Rect taskFragmentBounds = new Rect(0, 0, 1000, 1000);
-        final ActivityWindowInfo activityWindowInfo = new ActivityWindowInfo();
-        activityWindowInfo.set(true /* isEmbedded */, taskBounds, taskFragmentBounds);
-        final ActivityConfigurationChangeItem activityConfigurationChangeItem =
-                ActivityConfigurationChangeItem.obtain(
-                        activity.getActivityToken(), config, activityWindowInfo);
-        final ClientTransaction transaction = newTransaction(activity);
-        transaction.addTransactionItem(activityConfigurationChangeItem);
-        appThread.scheduleTransaction(transaction);
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+        final ActivityThread activityThread = activity.getActivityThread();
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            // Trigger callback with different ActivityWindowInfo
+            final Configuration config = new Configuration(activity.getResources()
+                    .getConfiguration());
+            config.seq++;
+            final Rect taskBounds = new Rect(0, 0, 1000, 2000);
+            final Rect taskFragmentBounds = new Rect(0, 0, 1000, 1000);
+            final ActivityWindowInfo activityWindowInfo = new ActivityWindowInfo();
+            activityWindowInfo.set(true /* isEmbedded */, taskBounds, taskFragmentBounds);
+            final ActivityConfigurationChangeItem activityConfigurationChangeItem =
+                    ActivityConfigurationChangeItem.obtain(
+                            activity.getActivityToken(), config, activityWindowInfo);
+            final ClientTransaction transaction = newTransaction(activity);
+            transaction.addTransactionItem(activityConfigurationChangeItem);
 
-        verify(mActivityWindowInfoListener).accept(activity.getActivityToken(),
-                activityWindowInfo);
+            clearInvocations(mActivityWindowInfoListener);
+            activityThread.executeTransaction(transaction);
 
-        clearInvocations(mActivityWindowInfoListener);
-        final ActivityWindowInfo activityWindowInfo2 = new ActivityWindowInfo();
-        activityWindowInfo2.set(true /* isEmbedded */, taskBounds, taskFragmentBounds);
-        config.seq++;
-        final ActivityConfigurationChangeItem activityConfigurationChangeItem2 =
-                ActivityConfigurationChangeItem.obtain(
-                        activity.getActivityToken(), config, activityWindowInfo2);
-        final ClientTransaction transaction2 = newTransaction(activity);
-        transaction2.addTransactionItem(activityConfigurationChangeItem2);
-        appThread.scheduleTransaction(transaction);
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+            // Trigger callback with a different ActivityWindowInfo
+            verify(mActivityWindowInfoListener).accept(activity.getActivityToken(),
+                    activityWindowInfo);
 
-        // The same ActivityWindowInfo won't trigger duplicated callback.
-        verify(mActivityWindowInfoListener, never()).accept(any(), any());
+            // Try callback with the same ActivityWindowInfo
+            final ActivityWindowInfo activityWindowInfo2 =
+                    new ActivityWindowInfo(activityWindowInfo);
+            config.seq++;
+            final ActivityConfigurationChangeItem activityConfigurationChangeItem2 =
+                    ActivityConfigurationChangeItem.obtain(
+                            activity.getActivityToken(), config, activityWindowInfo2);
+            final ClientTransaction transaction2 = newTransaction(activity);
+            transaction2.addTransactionItem(activityConfigurationChangeItem2);
+
+            clearInvocations(mActivityWindowInfoListener);
+            activityThread.executeTransaction(transaction);
+
+            // The same ActivityWindowInfo won't trigger duplicated callback.
+            verify(mActivityWindowInfoListener, never()).accept(any(), any());
+        });
     }
 
     /**
@@ -958,10 +972,19 @@
     @NonNull
     private static ClientTransaction newRelaunchResumeTransaction(@NonNull Activity activity) {
         final Configuration currentConfig = activity.getResources().getConfiguration();
+        final ActivityClientRecord record = getActivityClientRecord(activity);
+        final ActivityWindowInfo activityWindowInfo;
+        if (record == null) {
+            Log.d(TAG, "The ActivityClientRecord of r=" + activity + " is not created yet. "
+                    + "Likely because this call doesn't wait until activity launch.");
+            activityWindowInfo = new ActivityWindowInfo();
+        } else {
+            activityWindowInfo = record.getActivityWindowInfo();
+        }
         final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(
                 activity.getActivityToken(), null, null, 0,
                 new MergedConfiguration(currentConfig, currentConfig),
-                false /* preserveWindow */, new ActivityWindowInfo());
+                false /* preserveWindow */, activityWindowInfo);
         final ResumeActivityItem resumeStateRequest =
                 ResumeActivityItem.obtain(activity.getActivityToken(), true /* isForward */,
                         false /* shouldSendCompatFakeFocus*/);
@@ -1127,4 +1150,28 @@
             return mPipEnterSkipped;
         }
     }
+
+    public static class ActivityWindowInfoListener implements
+            BiConsumer<IBinder, ActivityWindowInfo> {
+
+        CountDownLatch mCallbackLatch = new CountDownLatch(1);
+
+        @Override
+        public void accept(@NonNull IBinder activityToken,
+                @NonNull ActivityWindowInfo activityWindowInfo) {
+            mCallbackLatch.countDown();
+        }
+
+        /**
+         * When the test is expecting to receive a callback, waits until the callback is triggered.
+         */
+        void await() {
+            InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+            try {
+                mCallbackLatch.await(TIMEOUT_SEC, TimeUnit.SECONDS);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
 }
diff --git a/core/tests/coretests/src/android/app/activity/RegisterComponentCallbacksTest.java b/core/tests/coretests/src/android/app/activity/RegisterComponentCallbacksTest.java
index c1b6666..fd1add9 100644
--- a/core/tests/coretests/src/android/app/activity/RegisterComponentCallbacksTest.java
+++ b/core/tests/coretests/src/android/app/activity/RegisterComponentCallbacksTest.java
@@ -16,7 +16,7 @@
 
 package android.app.activity;
 
-import static android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW;
+import static android.content.ComponentCallbacks2.TRIM_MEMORY_BACKGROUND;
 import static android.content.Context.OVERRIDABLE_COMPONENT_CALLBACKS;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -67,7 +67,7 @@
         config.windowConfiguration.setWindowingMode(
                 WindowConfiguration.WINDOWING_MODE_FREEFORM);
         config.windowConfiguration.setBounds(new Rect(0, 0, 100, 100));
-        final int trimMemoryLevel = TRIM_MEMORY_RUNNING_LOW;
+        final int trimMemoryLevel = TRIM_MEMORY_BACKGROUND;
 
         scenario.onActivity(activity -> {
             // It should be no-op to unregister a ComponentCallbacks without registration.
@@ -98,7 +98,7 @@
         config.windowConfiguration.setWindowingMode(
                 WindowConfiguration.WINDOWING_MODE_FREEFORM);
         config.windowConfiguration.setBounds(new Rect(0, 0, 100, 100));
-        final int trimMemoryLevel = TRIM_MEMORY_RUNNING_LOW;
+        final int trimMemoryLevel = TRIM_MEMORY_BACKGROUND;
 
         scenario.onActivity(activity -> {
             // It should be no-op to unregister a ComponentCallbacks without registration.
diff --git a/core/tests/coretests/src/android/content/res/FontScaleConverterFactoryTest.kt b/core/tests/coretests/src/android/content/res/FontScaleConverterFactoryTest.kt
index a2a5433..c7d5825 100644
--- a/core/tests/coretests/src/android/content/res/FontScaleConverterFactoryTest.kt
+++ b/core/tests/coretests/src/android/content/res/FontScaleConverterFactoryTest.kt
@@ -175,10 +175,12 @@
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(-1f)).isFalse()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(0.85f)).isFalse()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.02f)).isFalse()
+        assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.05f)).isTrue()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.10f)).isTrue()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.15f)).isTrue()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.1499999f))
                 .isTrue()
+        assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.2f)).isTrue()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(1.5f)).isTrue()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(2f)).isTrue()
         assertThat(FontScaleConverterFactory.isNonLinearFontScalingActive(3f)).isTrue()
diff --git a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
index 0c1e879..6b3cf7b 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
@@ -421,6 +421,85 @@
         ResourcesManager.setInstance(oriResourcesManager);
     }
 
+    @Test
+    @SmallTest
+    @RequiresFlagsEnabled(Flags.FLAG_REGISTER_RESOURCE_PATHS)
+    public void testExistingResourcesCreatedByConstructorAfterResourcePathsRegistration()
+            throws PackageManager.NameNotFoundException {
+        // Inject ResourcesManager instance from this test to the ResourcesManager class so that all
+        // the static method can interact with this test smoothly.
+        ResourcesManager oriResourcesManager = ResourcesManager.getInstance();
+        ResourcesManager.setInstance(mResourcesManager);
+
+        // Create a Resources through constructor directly before register resources' paths.
+        final DisplayMetrics metrics = new DisplayMetrics();
+        metrics.setToDefaults();
+        final Configuration config = new Configuration();
+        config.setToDefaults();
+        Resources resources = new Resources(new AssetManager(), metrics, config);
+        assertNotNull(resources);
+
+        ResourcesImpl oriResImpl = resources.getImpl();
+
+        ApplicationInfo appInfo = mPackageManager.getApplicationInfo(TEST_LIB, 0);
+        Resources.registerResourcePaths(TEST_LIB, appInfo);
+
+        assertNotSame(oriResImpl, resources.getImpl());
+
+        String[] resourcePaths = appInfo.getAllApkPaths();
+        resourcePaths = removeDuplicates(resourcePaths);
+        ApkAssets[] loadedAssets = resources.getAssets().getApkAssets();
+        assertTrue(allResourcePathsLoaded(resourcePaths, loadedAssets));
+
+        // Package resources' paths should be cached in ResourcesManager.
+        assertEquals(Arrays.toString(resourcePaths), Arrays.toString(ResourcesManager.getInstance()
+                .getSharedLibAssetsMap().get(TEST_LIB).getAllAssetPaths()));
+
+        // Revert the ResourcesManager instance back.
+        ResourcesManager.setInstance(oriResourcesManager);
+    }
+
+    @Test
+    @SmallTest
+    @RequiresFlagsEnabled(Flags.FLAG_REGISTER_RESOURCE_PATHS)
+    public void testNewResourcesWithOutdatedImplAfterResourcePathsRegistration()
+            throws PackageManager.NameNotFoundException {
+        ResourcesManager oriResourcesManager = ResourcesManager.getInstance();
+        ResourcesManager.setInstance(mResourcesManager);
+
+        Resources old_resources = mResourcesManager.getResources(
+                null, APP_ONE_RES_DIR, null, null, null, null, null, null,
+                CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null, null);
+        assertNotNull(old_resources);
+        ResourcesImpl oldImpl = old_resources.getImpl();
+
+        ApplicationInfo appInfo = mPackageManager.getApplicationInfo(TEST_LIB, 0);
+        Resources.registerResourcePaths(TEST_LIB, appInfo);
+
+        // Create another resources with identical parameters.
+        Resources resources = mResourcesManager.getResources(
+                null, APP_ONE_RES_DIR, null, null, null, null, null, null,
+                CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null, null);
+        assertNotNull(resources);
+        // For a normal ResourcesImpl redirect, new Resources may find an old ResourcesImpl cache
+        // and reuse it based on the ResourcesKey. But for shared library ResourcesImpl redirect,
+        // new created Resources should never reuse any old impl, it has to recreate a new impl
+        // which has proper asset paths appended.
+        assertNotSame(oldImpl, resources.getImpl());
+
+        String[] resourcePaths = appInfo.getAllApkPaths();
+        resourcePaths = removeDuplicates(resourcePaths);
+        ApkAssets[] loadedAssets = resources.getAssets().getApkAssets();
+        assertTrue(allResourcePathsLoaded(resourcePaths, loadedAssets));
+
+        // Package resources' paths should be cached in ResourcesManager.
+        assertEquals(Arrays.toString(resourcePaths), Arrays.toString(ResourcesManager.getInstance()
+                .getSharedLibAssetsMap().get(TEST_LIB).getAllAssetPaths()));
+
+        // Revert the ResourcesManager instance back.
+        ResourcesManager.setInstance(oriResourcesManager);
+    }
+
     private static boolean allResourcePathsLoaded(String[] resourcePaths, ApkAssets[] loadedAsset) {
         for (int i = 0; i < resourcePaths.length; i++) {
             if (!resourcePaths[i].endsWith(".apk")) {
diff --git a/core/tests/coretests/src/android/hardware/biometrics/BiometricPromptTest.java b/core/tests/coretests/src/android/hardware/biometrics/BiometricPromptTest.java
index 66f3bca..ca915428 100644
--- a/core/tests/coretests/src/android/hardware/biometrics/BiometricPromptTest.java
+++ b/core/tests/coretests/src/android/hardware/biometrics/BiometricPromptTest.java
@@ -16,6 +16,14 @@
 
 package android.hardware.biometrics;
 
+import static android.hardware.biometrics.BiometricPrompt.MAX_LOGO_DESCRIPTION_CHARACTER_NUMBER;
+import static android.hardware.biometrics.PromptContentViewWithMoreOptionsButton.MAX_DESCRIPTION_CHARACTER_NUMBER;
+import static android.hardware.biometrics.PromptVerticalListContentView.MAX_EACH_ITEM_CHARACTER_NUMBER;
+import static android.hardware.biometrics.PromptVerticalListContentView.MAX_ITEM_NUMBER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
@@ -40,6 +48,7 @@
 import org.mockito.junit.MockitoJUnitRunner;
 import org.mockito.junit.MockitoRule;
 
+import java.util.Random;
 import java.util.concurrent.Executor;
 
 
@@ -83,10 +92,11 @@
                 ArgumentCaptor.forClass(IBiometricServiceReceiver.class);
         BiometricPrompt.AuthenticationCallback callback =
                 new BiometricPrompt.AuthenticationCallback() {
-            @Override
-            public void onAuthenticationError(int errorCode, CharSequence errString) {
-                super.onAuthenticationError(errorCode, errString);
-            }};
+                    @Override
+                    public void onAuthenticationError(int errorCode, CharSequence errString) {
+                        super.onAuthenticationError(errorCode, errString);
+                    }
+                };
         mBiometricPrompt.authenticate(mCancellationSignal, mExecutor, callback);
         mLooper.dispatchAll();
 
@@ -99,4 +109,112 @@
 
         verify(mService).cancelAuthentication(any(), anyString(), anyLong());
     }
+
+    @Test
+    public void testLogoDescription_null() {
+        IllegalArgumentException e = assertThrows(IllegalArgumentException.class,
+                () -> new BiometricPrompt.Builder(mContext).setLogoDescription(null)
+        );
+
+        assertThat(e).hasMessageThat().contains(
+                "Logo description passed in can not be null or exceed");
+    }
+
+    @Test
+    public void testLogoDescription_charLimit() {
+        IllegalArgumentException e = assertThrows(IllegalArgumentException.class,
+                () -> new BiometricPrompt.Builder(mContext).setLogoDescription(
+                        generateRandomString(MAX_LOGO_DESCRIPTION_CHARACTER_NUMBER + 1))
+        );
+
+        assertThat(e).hasMessageThat().contains(
+                "Logo description passed in can not be null or exceed");
+    }
+
+    @Test
+    public void testMoreOptionsButton_descriptionCharLimit() {
+        IllegalArgumentException e = assertThrows(IllegalArgumentException.class,
+                () -> new PromptContentViewWithMoreOptionsButton.Builder().setDescription(
+                        generateRandomString(MAX_DESCRIPTION_CHARACTER_NUMBER + 1))
+        );
+
+        assertThat(e).hasMessageThat().contains(
+                "The character number of description exceeds ");
+    }
+
+    @Test
+    public void testMoreOptionsButton_ExecutorNull() {
+        PromptContentViewWithMoreOptionsButton.Builder builder =
+                new PromptContentViewWithMoreOptionsButton.Builder().setMoreOptionsButtonListener(
+                        null, null);
+        IllegalArgumentException e = assertThrows(IllegalArgumentException.class,
+                builder::build
+        );
+
+        assertThat(e).hasMessageThat().contains(
+                "The executor for the listener of more options button on prompt content must be "
+                        + "set");
+    }
+
+    @Test
+    public void testMoreOptionsButton_ListenerNull() {
+        PromptContentViewWithMoreOptionsButton.Builder builder =
+                new PromptContentViewWithMoreOptionsButton.Builder().setMoreOptionsButtonListener(
+                        mExecutor, null);
+        IllegalArgumentException e = assertThrows(IllegalArgumentException.class,
+                builder::build
+        );
+
+        assertThat(e).hasMessageThat().contains(
+                "The listener of more options button on prompt content must be set");
+    }
+
+    @Test
+    public void testVerticalList_descriptionCharLimit() {
+        IllegalArgumentException e = assertThrows(IllegalArgumentException.class,
+                () -> new PromptVerticalListContentView.Builder().setDescription(
+                        generateRandomString(MAX_DESCRIPTION_CHARACTER_NUMBER + 1))
+        );
+
+        assertThat(e).hasMessageThat().contains(
+                "The character number of description exceeds ");
+    }
+
+    @Test
+    public void testVerticalList_itemCharLimit() {
+        IllegalArgumentException e = assertThrows(IllegalArgumentException.class,
+                () -> new PromptVerticalListContentView.Builder().addListItem(
+                        new PromptContentItemBulletedText(
+                                generateRandomString(MAX_EACH_ITEM_CHARACTER_NUMBER + 1)))
+        );
+
+        assertThat(e).hasMessageThat().contains(
+                "The character number of list item exceeds ");
+    }
+
+    @Test
+    public void testVerticalList_itemNumLimit() {
+        PromptVerticalListContentView.Builder builder = new PromptVerticalListContentView.Builder();
+
+        for (int i = 0; i < MAX_ITEM_NUMBER; i++) {
+            builder.addListItem(new PromptContentItemBulletedText(generateRandomString(10)));
+        }
+
+        IllegalArgumentException e = assertThrows(IllegalArgumentException.class,
+                () -> builder.addListItem(
+                        new PromptContentItemBulletedText(generateRandomString(10)))
+        );
+
+        assertThat(e).hasMessageThat().contains(
+                "The number of list items exceeds ");
+    }
+
+    private String generateRandomString(int charNum) {
+        final Random random = new Random();
+        final StringBuilder longString = new StringBuilder(charNum);
+        for (int j = 0; j < charNum; j++) {
+            longString.append(random.nextInt(10));
+        }
+        return longString.toString();
+    }
 }
diff --git a/core/tests/coretests/src/android/hardware/face/FaceSensorConfigurationsTest.java b/core/tests/coretests/src/android/hardware/face/FaceSensorConfigurationsTest.java
index b61104d..7d7f8ed 100644
--- a/core/tests/coretests/src/android/hardware/face/FaceSensorConfigurationsTest.java
+++ b/core/tests/coretests/src/android/hardware/face/FaceSensorConfigurationsTest.java
@@ -18,13 +18,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.content.res.Resources;
-import android.hardware.biometrics.face.IFace;
-import android.hardware.biometrics.face.SensorProps;
 import android.os.RemoteException;
 import android.platform.test.annotations.Presubmit;
 
@@ -37,8 +34,6 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
-import java.util.function.Function;
-
 @Presubmit
 @SmallTest
 public class FaceSensorConfigurationsTest {
@@ -48,10 +43,6 @@
     private Context mContext;
     @Mock
     private Resources mResources;
-    @Mock
-    private IFace mFace;
-    @Mock
-    private Function<String, IFace> mGetIFace;
 
     private final String[] mAidlInstances = new String[]{"default", "virtual"};
     private String[] mHidlConfigStrings = new String[]{"0:2:15", "0:8:15"};
@@ -59,15 +50,13 @@
 
     @Before
     public void setUp() throws RemoteException {
-        when(mGetIFace.apply(anyString())).thenReturn(mFace);
-        when(mFace.getSensorProps()).thenReturn(new SensorProps[]{});
         when(mContext.getResources()).thenReturn(mResources);
     }
 
     @Test
     public void testAidlInstanceSensorProps() {
         mFaceSensorConfigurations = new FaceSensorConfigurations(false);
-        mFaceSensorConfigurations.addAidlConfigs(mAidlInstances, mGetIFace);
+        mFaceSensorConfigurations.addAidlConfigs(mAidlInstances);
 
         assertThat(mFaceSensorConfigurations.hasSensorConfigurations()).isTrue();
         assertThat(!mFaceSensorConfigurations.isSingleSensorConfigurationPresent()).isTrue();
diff --git a/core/tests/coretests/src/android/hardware/fingerprint/FingerprintSensorConfigurationsTest.java b/core/tests/coretests/src/android/hardware/fingerprint/FingerprintSensorConfigurationsTest.java
index f058c16..b2f8299 100644
--- a/core/tests/coretests/src/android/hardware/fingerprint/FingerprintSensorConfigurationsTest.java
+++ b/core/tests/coretests/src/android/hardware/fingerprint/FingerprintSensorConfigurationsTest.java
@@ -18,13 +18,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.content.res.Resources;
-import android.hardware.biometrics.fingerprint.IFingerprint;
-import android.hardware.biometrics.fingerprint.SensorProps;
 import android.os.RemoteException;
 import android.platform.test.annotations.Presubmit;
 
@@ -37,8 +34,6 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
-import java.util.function.Function;
-
 @Presubmit
 @SmallTest
 public class FingerprintSensorConfigurationsTest {
@@ -48,10 +43,6 @@
     private Context mContext;
     @Mock
     private Resources mResources;
-    @Mock
-    private IFingerprint mFingerprint;
-    @Mock
-    private Function<String, IFingerprint> mGetIFingerprint;
 
     private final String[] mAidlInstances = new String[]{"default", "virtual"};
     private String[] mHidlConfigStrings = new String[]{"0:2:15", "0:8:15"};
@@ -59,8 +50,6 @@
 
     @Before
     public void setUp() throws RemoteException {
-        when(mGetIFingerprint.apply(anyString())).thenReturn(mFingerprint);
-        when(mFingerprint.getSensorProps()).thenReturn(new SensorProps[]{});
         when(mContext.getResources()).thenReturn(mResources);
     }
 
@@ -68,7 +57,7 @@
     public void testAidlInstanceSensorProps() {
         mFingerprintSensorConfigurations = new FingerprintSensorConfigurations(
                 true /* resetLockoutRequiresHardwareAuthToken */);
-        mFingerprintSensorConfigurations.addAidlSensors(mAidlInstances, mGetIFingerprint);
+        mFingerprintSensorConfigurations.addAidlSensors(mAidlInstances);
 
         assertThat(mFingerprintSensorConfigurations.hasSensorConfigurations()).isTrue();
         assertThat(!mFingerprintSensorConfigurations.isSingleSensorConfigurationPresent())
diff --git a/core/tests/coretests/src/android/os/BinderProxyCountingTest.java b/core/tests/coretests/src/android/os/BinderProxyCountingTest.java
index bcd9521..84d2995 100644
--- a/core/tests/coretests/src/android/os/BinderProxyCountingTest.java
+++ b/core/tests/coretests/src/android/os/BinderProxyCountingTest.java
@@ -88,9 +88,10 @@
 
     private static final int BIND_SERVICE_TIMEOUT_SEC = 5;
     private static final int TOO_MANY_BINDERS_TIMEOUT_SEC = 2;
+    private static final int TOO_MANY_BINDERS_WITH_KILL_TIMEOUT_SEC = 30;
 
-    // Keep in sync with sBinderProxyCountLimit in BpBinder.cpp
-    private static final int BINDER_PROXY_LIMIT = 2500;
+    // Keep in sync with BINDER_PROXY_HIGH_WATERMARK in ActivityManagerService.java
+    private static final int BINDER_PROXY_LIMIT = 6000;
 
     private static Context sContext;
     private static UiDevice sUiDevice;
@@ -175,18 +176,26 @@
         }
     }
 
-    private CountDownLatch createBinderLimitLatch() throws RemoteException {
-        final CountDownLatch latch = new CountDownLatch(1);
+    private CountDownLatch[] createBinderLimitLatch() throws RemoteException {
+        final CountDownLatch[] latches = new CountDownLatch[] {
+            new CountDownLatch(1), new CountDownLatch(1)
+        };
         sBpcTestServiceCmdService.setBinderProxyCountCallback(
                 new IBpcCallbackObserver.Stub() {
                     @Override
-                    public void onCallback(int uid) {
+                    public void onLimitReached(int uid) {
                         if (uid == sTestPkgUid) {
-                            latch.countDown();
+                            latches[0].countDown();
+                        }
+                    }
+                    @Override
+                    public void onWarningThresholdReached(int uid) {
+                        if (uid == sTestPkgUid) {
+                            latches[1].countDown();
                         }
                     }
                 });
-        return latch;
+        return latches;
     }
 
     /**
@@ -227,6 +236,7 @@
     @Test
     public void testBinderProxyLimitBoundary() throws Exception {
         final int binderProxyLimit = 2000;
+        final int binderProxyWarning = 1900;
         final int rearmThreshold = 1800;
         try {
             sTestAppConnection = bindService(sTestAppConsumer, sTestAppIntent);
@@ -238,19 +248,33 @@
             // Get the baseline of binders naturally held by the test Package
             int baseBinderCount = sBpcTestServiceCmdService.getBinderProxyCount(sTestPkgUid);
 
-            final CountDownLatch binderLimitLatch = createBinderLimitLatch();
-            sBpcTestServiceCmdService.setBinderProxyWatermarks(binderProxyLimit, rearmThreshold);
+            final CountDownLatch[] binderLatches = createBinderLimitLatch();
+            sBpcTestServiceCmdService.setBinderProxyWatermarks(binderProxyLimit, rearmThreshold,
+                    binderProxyWarning);
+
+            // Create Binder Proxies up to the warning;
+            sBpcTestAppCmdService.createTestBinders(binderProxyWarning - baseBinderCount);
+            if (binderLatches[1].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+                fail("Received BinderProxyLimitCallback for uid " + sTestPkgUid
+                        + " when proxy warning should not have been triggered");
+            }
+
+            // Create one more Binder to trigger the warning
+            sBpcTestAppCmdService.createTestBinders(1);
+            if (!binderLatches[1].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+                fail("Timed out waiting for uid " + sTestPkgUid + " to trigger the warning");
+            }
 
             // Create Binder Proxies up to the limit
-            sBpcTestAppCmdService.createTestBinders(binderProxyLimit - baseBinderCount);
-            if (binderLimitLatch.await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+            sBpcTestAppCmdService.createTestBinders(binderProxyLimit - binderProxyWarning - 1);
+            if (binderLatches[0].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
                 fail("Received BinderProxyLimitCallback for uid " + sTestPkgUid
                         + " when proxy limit should not have been reached");
             }
 
             // Create one more Binder to cross the limit
             sBpcTestAppCmdService.createTestBinders(1);
-            if (!binderLimitLatch.await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+            if (!binderLatches[0].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
                 fail("Timed out waiting for uid " + sTestPkgUid + " to hit limit");
             }
 
@@ -274,12 +298,20 @@
             sBpcTestServiceCmdService.forceGc();
             int baseBinderCount = sBpcTestServiceCmdService.getBinderProxyCount(sTestPkgUid);
             for (int testLimit : testLimits) {
-                final CountDownLatch binderLimitLatch = createBinderLimitLatch();
+                final CountDownLatch[] binderLatches = createBinderLimitLatch();
                 // Change the BinderProxyLimit
-                sBpcTestServiceCmdService.setBinderProxyWatermarks(testLimit, baseBinderCount + 10);
+                sBpcTestServiceCmdService.setBinderProxyWatermarks(testLimit, baseBinderCount + 10,
+                        testLimit - 10);
+
+                // Trigger the new Binder Proxy warning
+                sBpcTestAppCmdService.createTestBinders(testLimit - 9 - baseBinderCount);
+                if (!binderLatches[1].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+                    fail("Timed out waiting for uid " + sTestPkgUid + " to trigger the warning");
+                }
+
                 // Exceed the new Binder Proxy Limit
-                sBpcTestAppCmdService.createTestBinders(testLimit + 1);
-                if (!binderLimitLatch.await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+                sBpcTestAppCmdService.createTestBinders(10);
+                if (!binderLatches[0].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
                     fail("Timed out waiting for uid " + sTestPkgUid + " to hit limit");
                 }
 
@@ -297,6 +329,7 @@
     public void testRearmCallbackThreshold() throws Exception {
         final int binderProxyLimit = 2000;
         final int exceedBinderProxyLimit = binderProxyLimit + 10;
+        final int binderProxyWarning = 1900;
         final int rearmThreshold = 1800;
         try {
             sTestAppConnection = bindService(sTestAppConsumer, sTestAppIntent);
@@ -305,11 +338,19 @@
             sBpcTestServiceCmdService.enableBinderProxyLimit(true);
 
             sBpcTestServiceCmdService.forceGc();
-            final CountDownLatch firstBinderLimitLatch = createBinderLimitLatch();
-            sBpcTestServiceCmdService.setBinderProxyWatermarks(binderProxyLimit, rearmThreshold);
+            int baseBinderCount = sBpcTestServiceCmdService.getBinderProxyCount(sTestPkgUid);
+            final CountDownLatch[] firstBinderLatches = createBinderLimitLatch();
+            sBpcTestServiceCmdService.setBinderProxyWatermarks(binderProxyLimit, rearmThreshold,
+                    binderProxyWarning);
+            // Trigger the Binder Proxy Waring
+            sBpcTestAppCmdService.createTestBinders(binderProxyWarning - baseBinderCount + 1);
+            if (!firstBinderLatches[1].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+                fail("Timed out waiting for uid " + sTestPkgUid + " to trigger warning");
+            }
+
             // Exceed the Binder Proxy Limit
-            sBpcTestAppCmdService.createTestBinders(exceedBinderProxyLimit);
-            if (!firstBinderLimitLatch.await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+            sBpcTestAppCmdService.createTestBinders(exceedBinderProxyLimit - binderProxyWarning);
+            if (!firstBinderLatches[0].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
                 fail("Timed out waiting for uid " + sTestPkgUid + " to hit limit");
             }
 
@@ -321,11 +362,20 @@
             sBpcTestServiceCmdService.forceGc();
             currentBinderCount = sBpcTestServiceCmdService.getBinderProxyCount(sTestPkgUid);
 
-            final CountDownLatch secondBinderLimitLatch = createBinderLimitLatch();
+            final CountDownLatch[] secondBinderLatches = createBinderLimitLatch();
+
+            // Exceed the Binder Proxy warning which should not cause a callback since there has
+            // been no rearm
+            sBpcTestAppCmdService.createTestBinders(binderProxyWarning - currentBinderCount + 1);
+            if (secondBinderLatches[1].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+                fail("Received BinderProxyLimitCallback for uid " + sTestPkgUid
+                        + " when the callback has not been rearmed yet");
+            }
+
             // Exceed the Binder Proxy limit which should not cause a callback since there has
             // been no rearm
-            sBpcTestAppCmdService.createTestBinders(exceedBinderProxyLimit - currentBinderCount);
-            if (secondBinderLimitLatch.await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+            sBpcTestAppCmdService.createTestBinders(exceedBinderProxyLimit - binderProxyWarning);
+            if (secondBinderLatches[0].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
                 fail("Received BinderProxyLimitCallback for uid " + sTestPkgUid
                         + " when the callback has not been rearmed yet");
             }
@@ -337,10 +387,16 @@
 
             sBpcTestServiceCmdService.forceGc();
             currentBinderCount = sBpcTestServiceCmdService.getBinderProxyCount(sTestPkgUid);
+            // Trigger the Binder Proxy Waring
+            sBpcTestAppCmdService.createTestBinders(binderProxyWarning - currentBinderCount + 1);
+            if (!secondBinderLatches[1].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+                fail("Timed out waiting for uid " + sTestPkgUid + " to trigger warning");
+            }
+
             // Exceed the Binder Proxy limit for the last time
             sBpcTestAppCmdService.createTestBinders(exceedBinderProxyLimit - currentBinderCount);
 
-            if (!secondBinderLimitLatch.await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+            if (!secondBinderLatches[0].await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
                 fail("Timed out waiting for uid " + sTestPkgUid + " to hit limit");
             }
             sBpcTestAppCmdService.releaseTestBinders(currentBinderCount);
@@ -373,7 +429,7 @@
                 // is not unexpected
             }
 
-            if (!binderDeathLatch.await(TOO_MANY_BINDERS_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+            if (!binderDeathLatch.await(TOO_MANY_BINDERS_WITH_KILL_TIMEOUT_SEC, TimeUnit.SECONDS)) {
                 sBpcTestAppCmdService.releaseSystemBinders(exceedBinderProxyLimit);
                 fail("Timed out waiting for uid " + sTestPkgUid + " to die.");
             }
diff --git a/core/tests/coretests/src/android/text/format/DateIntervalFormatTest.java b/core/tests/coretests/src/android/text/format/DateIntervalFormatTest.java
index de7244d..71c068d 100644
--- a/core/tests/coretests/src/android/text/format/DateIntervalFormatTest.java
+++ b/core/tests/coretests/src/android/text/format/DateIntervalFormatTest.java
@@ -149,7 +149,7 @@
                 FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
         assertEquals("19.–22.01.2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * DAY,
                 FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
-        assertEquals("19.01. – 22.04.2009",
+        assertEquals("19.01.\u2009–\u200922.04.2009",
                 formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * MONTH,
                         FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE));
         assertEquals("19.01.2009\u2009\u2013\u200909.02.2012",
@@ -220,10 +220,10 @@
                 formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * DAY, 0));
         assertEquals("19.–22. Jan. 2009", formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * DAY,
                 FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
-        assertEquals("Mo., 19. – Do., 22. Jan. 2009",
+        assertEquals("Mo., 19.\u2009–\u2009Do., 22. Jan. 2009",
                 formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * DAY,
                         FORMAT_SHOW_WEEKDAY | FORMAT_ABBREV_ALL));
-        assertEquals("Montag, 19. – Donnerstag, 22. Januar 2009",
+        assertEquals("Montag, 19.\u2009–\u2009Donnerstag, 22. Januar 2009",
                 formatDateRange(de_DE, tz, fixedTime, fixedTime + 3 * DAY, FORMAT_SHOW_WEEKDAY));
 
         assertEquals("19. Januar\u2009\u2013\u200922. April 2009",
diff --git a/core/tests/coretests/src/android/view/InsetsControllerTest.java b/core/tests/coretests/src/android/view/InsetsControllerTest.java
index 316e191..97f894f 100644
--- a/core/tests/coretests/src/android/view/InsetsControllerTest.java
+++ b/core/tests/coretests/src/android/view/InsetsControllerTest.java
@@ -21,12 +21,11 @@
 import static android.view.InsetsController.ANIMATION_TYPE_NONE;
 import static android.view.InsetsController.ANIMATION_TYPE_RESIZE;
 import static android.view.InsetsController.ANIMATION_TYPE_SHOW;
-import static android.view.InsetsController.AnimationType;
+import static android.view.InsetsSource.FLAG_ANIMATE_RESIZING;
 import static android.view.InsetsSource.ID_IME;
 import static android.view.InsetsSourceConsumer.ShowResult.IME_SHOW_DELAYED;
 import static android.view.InsetsSourceConsumer.ShowResult.SHOW_IMMEDIATELY;
 import static android.view.ViewRootImpl.CAPTION_ON_SHELL;
-import static android.view.WindowInsets.Type.SIZE;
 import static android.view.WindowInsets.Type.all;
 import static android.view.WindowInsets.Type.captionBar;
 import static android.view.WindowInsets.Type.defaultVisible;
@@ -671,36 +670,81 @@
     }
 
     @Test
-    public void testResizeAnimation_insetsTypes() {
-        for (int i = 0; i < SIZE; i++) {
-            final @InsetsType int type = 1 << i;
-            final @AnimationType int expectedAnimationType = (type & systemBars()) != 0
-                            ? ANIMATION_TYPE_RESIZE
-                            : ANIMATION_TYPE_NONE;
-            doTestResizeAnimation_insetsTypes(type, expectedAnimationType);
-        }
-    }
-
-    private void doTestResizeAnimation_insetsTypes(@InsetsType int type,
-            @AnimationType int expectedAnimationType) {
-        final int id = type;
+    public void testResizeAnimation_withFlagAnimateResizing() {
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            final int id = ID_NAVIGATION_BAR;
+            final @InsetsType int type = navigationBars();
             final InsetsState state1 = new InsetsState();
-            state1.getOrCreateSource(id, type).setVisible(true).setFrame(0, 0, 500, 50);
+            state1.getOrCreateSource(id, type)
+                    .setVisible(true)
+                    .setFrame(0, 0, 500, 50)
+                    .setFlags(FLAG_ANIMATE_RESIZING, FLAG_ANIMATE_RESIZING);
             final InsetsState state2 = new InsetsState(state1, true /* copySources */);
             state2.peekSource(id).setFrame(0, 0, 500, 60);
-            final String message = "Animation type of " + WindowInsets.Type.toString(type) + ":";
+
+            // New insets source won't cause the resize animation.
+            mController.onStateChanged(state1);
+            assertEquals("There must not be resize animation.", ANIMATION_TYPE_NONE,
+                    mController.getAnimationType(type));
+
+            // Changing frame of the source with FLAG_ANIMATE_RESIZING will cause the resize
+            // animation.
+            mController.onStateChanged(state2);
+            assertEquals("There must be resize animation.", ANIMATION_TYPE_RESIZE,
+                    mController.getAnimationType(type));
+        });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+    }
+
+    @Test
+    public void testResizeAnimation_withoutFlagAnimateResizing() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            final int id = ID_STATUS_BAR;
+            final @InsetsType int type = statusBars();
+            final InsetsState state1 = new InsetsState();
+            state1.getOrCreateSource(id, type)
+                    .setVisible(true)
+                    .setFrame(0, 0, 500, 50)
+                    .setFlags(0, FLAG_ANIMATE_RESIZING);
+            final InsetsState state2 = new InsetsState(state1, true /* copySources */);
+            state2.peekSource(id).setFrame(0, 0, 500, 60);
+            final String message = "There must not be resize animation.";
 
             // New insets source won't cause the resize animation.
             mController.onStateChanged(state1);
             assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type));
 
-            // Changing frame might cause the resize animation. This depends on the insets type.
+            // Changing frame of the source without FLAG_ANIMATE_RESIZING must not cause the resize
+            // animation.
             mController.onStateChanged(state2);
-            assertEquals(message, expectedAnimationType, mController.getAnimationType(type));
+            assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type));
+        });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+    }
 
-            // Cancel the existing animations for the next iteration.
-            mController.cancelExistingAnimations();
+    @Test
+    public void testResizeAnimation_sourceFrame() {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            final int id = ID_STATUS_BAR;
+            final @InsetsType int type = statusBars();
+            final InsetsState state1 = new InsetsState();
+            state1.setDisplayFrame(new Rect(0, 0, 500, 1000));
+            state1.getOrCreateSource(id, type).setFrame(0, 0, 500, 50);
+            final InsetsState state2 = new InsetsState(state1, true /* copySources */);
+            state2.setDisplayFrame(state1.getDisplayFrame());
+            state2.peekSource(id).setFrame(0, 0, 500, 0);
+            final String message = "There must not be resize animation.";
+
+            // New insets source won't cause the resize animation.
+            mController.onStateChanged(state1);
+            assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type));
+
+            // Changing frame won't cause the resize animation if the new frame is empty.
+            mController.onStateChanged(state2);
+            assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type));
+
+            // Changing frame won't cause the resize animation if the existing frame is empty.
+            mController.onStateChanged(state1);
             assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type));
         });
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
diff --git a/core/tests/coretests/src/android/view/MotionEventTest.java b/core/tests/coretests/src/android/view/MotionEventTest.java
index c4c983d..bad0485 100644
--- a/core/tests/coretests/src/android/view/MotionEventTest.java
+++ b/core/tests/coretests/src/android/view/MotionEventTest.java
@@ -26,6 +26,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
 
 import android.graphics.Matrix;
 import android.platform.test.annotations.Presubmit;
@@ -47,21 +48,25 @@
 public class MotionEventTest {
     private static final int ID_SOURCE_MASK = 0x3 << 30;
 
+    private PointerCoords pointerCoords(float x, float y) {
+        final var coords = new PointerCoords();
+        coords.x = x;
+        coords.y = y;
+        return coords;
+    }
+
+    private PointerProperties fingerProperties(int id) {
+        final var props = new PointerProperties();
+        props.id = id;
+        props.toolType = TOOL_TYPE_FINGER;
+        return props;
+    }
+
     @Test
     public void testObtainWithDisplayId() {
         final int pointerCount = 1;
-        PointerProperties[] properties = new PointerProperties[pointerCount];
-        final PointerCoords[] coords = new PointerCoords[pointerCount];
-        for (int i = 0; i < pointerCount; i++) {
-            final PointerCoords c = new PointerCoords();
-            c.x = i * 10;
-            c.y = i * 20;
-            coords[i] = c;
-            final PointerProperties p = new PointerProperties();
-            p.id = i;
-            p.toolType = TOOL_TYPE_FINGER;
-            properties[i] = p;
-        }
+        final var properties = new PointerProperties[]{fingerProperties(0)};
+        final var coords = new PointerCoords[]{pointerCoords(10, 20)};
 
         int displayId = 2;
         MotionEvent motionEvent = MotionEvent.obtain(0, 0, ACTION_DOWN,
@@ -125,18 +130,8 @@
     @Test
     public void testCalculatesCursorPositionForMultiTouchMouseEvents() {
         final int pointerCount = 2;
-        final PointerProperties[] properties = new PointerProperties[pointerCount];
-        final PointerCoords[] coords = new PointerCoords[pointerCount];
-
-        for (int i = 0; i < pointerCount; ++i) {
-            properties[i] = new PointerProperties();
-            properties[i].id = i;
-            properties[i].toolType = MotionEvent.TOOL_TYPE_FINGER;
-
-            coords[i] = new PointerCoords();
-            coords[i].x = 20 + i * 20;
-            coords[i].y = 60 - i * 20;
-        }
+        final var properties = new PointerProperties[]{fingerProperties(0), fingerProperties(1)};
+        final var coords = new PointerCoords[]{pointerCoords(20, 60), pointerCoords(40, 40)};
 
         final MotionEvent event = MotionEvent.obtain(0 /* downTime */,
                 0 /* eventTime */, ACTION_POINTER_DOWN, pointerCount, properties, coords,
@@ -238,4 +233,66 @@
         assertEquals(10, (int) event.getX());
         assertEquals(20, (int) event.getY());
     }
+
+    @Test
+    public void testSplit() {
+        final int pointerCount = 2;
+        final var properties = new PointerProperties[]{fingerProperties(0), fingerProperties(1)};
+        final var coords = new PointerCoords[]{pointerCoords(20, 60), pointerCoords(40, 40)};
+
+        final MotionEvent event = MotionEvent.obtain(0 /* downTime */,
+                0 /* eventTime */, MotionEvent.ACTION_MOVE, pointerCount, properties, coords,
+                0 /* metaState */, 0 /* buttonState */, 1 /* xPrecision */, 1 /* yPrecision */,
+                0 /* deviceId */, 0 /* edgeFlags */, InputDevice.SOURCE_TOUCHSCREEN,
+                0 /* flags */);
+
+        final int idBits = ~0b1 & event.getPointerIdBits();
+        final MotionEvent splitEvent = event.split(idBits);
+        assertEquals(1, splitEvent.getPointerCount());
+        assertEquals(1, splitEvent.getPointerId(0));
+        assertEquals(40, (int) splitEvent.getX());
+        assertEquals(40, (int) splitEvent.getY());
+    }
+
+    @Test
+    public void testSplitFailsWhenNoIdsSpecified() {
+        final int pointerCount = 2;
+        final var properties = new PointerProperties[]{fingerProperties(0), fingerProperties(1)};
+        final var coords = new PointerCoords[]{pointerCoords(20, 60), pointerCoords(40, 40)};
+
+        final MotionEvent event = MotionEvent.obtain(0 /* downTime */,
+                0 /* eventTime */, MotionEvent.ACTION_MOVE, pointerCount, properties, coords,
+                0 /* metaState */, 0 /* buttonState */, 1 /* xPrecision */, 1 /* yPrecision */,
+                0 /* deviceId */, 0 /* edgeFlags */, InputDevice.SOURCE_TOUCHSCREEN,
+                0 /* flags */);
+
+        try {
+            final MotionEvent splitEvent = event.split(0);
+            fail("Splitting event with id bits 0 should throw: " + splitEvent);
+        } catch (IllegalArgumentException e) {
+            // Expected
+        }
+    }
+
+    @Test
+    public void testSplitFailsWhenIdBitsDoNotMatch() {
+        final int pointerCount = 2;
+        final var properties = new PointerProperties[]{fingerProperties(0), fingerProperties(1)};
+        final var coords = new PointerCoords[]{pointerCoords(20, 60), pointerCoords(40, 40)};
+
+        final MotionEvent event = MotionEvent.obtain(0 /* downTime */,
+                0 /* eventTime */, MotionEvent.ACTION_MOVE, pointerCount, properties, coords,
+                0 /* metaState */, 0 /* buttonState */, 1 /* xPrecision */, 1 /* yPrecision */,
+                0 /* deviceId */, 0 /* edgeFlags */, InputDevice.SOURCE_TOUCHSCREEN,
+                0 /* flags */);
+
+        try {
+            final int idBits = 0b100;
+            final MotionEvent splitEvent = event.split(idBits);
+            fail("Splitting event with id bits that do not match any pointers should throw: "
+                    + splitEvent);
+        } catch (IllegalArgumentException e) {
+            // Expected
+        }
+    }
 }
diff --git a/core/tests/coretests/src/android/view/PendingInsetsControllerTest.java b/core/tests/coretests/src/android/view/PendingInsetsControllerTest.java
index 690b3587..b5b2d0c 100644
--- a/core/tests/coretests/src/android/view/PendingInsetsControllerTest.java
+++ b/core/tests/coretests/src/android/view/PendingInsetsControllerTest.java
@@ -18,6 +18,7 @@
 
 import static android.view.WindowInsets.Type.navigationBars;
 import static android.view.WindowInsets.Type.systemBars;
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS;
 import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
 import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
 
@@ -154,8 +155,8 @@
         mPendingInsetsController.replayAndAttach(mReplayedController);
         mPendingInsetsController.setSystemBarsAppearance(
                 APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
-        verify(mReplayedController).setSystemBarsAppearance(eq(APPEARANCE_LIGHT_STATUS_BARS),
-                eq(APPEARANCE_LIGHT_STATUS_BARS));
+        verify(mReplayedController).setSystemBarsAppearance(
+                eq(APPEARANCE_LIGHT_STATUS_BARS), eq(APPEARANCE_LIGHT_STATUS_BARS));
     }
 
     @Test
@@ -168,6 +169,24 @@
     }
 
     @Test
+    public void testAppearanceFromResource() {
+        mPendingInsetsController.setSystemBarsAppearanceFromResource(
+                APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
+        mPendingInsetsController.replayAndAttach(mReplayedController);
+        verify(mReplayedController).setSystemBarsAppearanceFromResource(
+                eq(APPEARANCE_LIGHT_STATUS_BARS), eq(APPEARANCE_LIGHT_STATUS_BARS));
+    }
+
+    @Test
+    public void testAppearanceFromResource_direct() {
+        mPendingInsetsController.replayAndAttach(mReplayedController);
+        mPendingInsetsController.setSystemBarsAppearanceFromResource(
+                APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
+        verify(mReplayedController).setSystemBarsAppearanceFromResource(
+                eq(APPEARANCE_LIGHT_STATUS_BARS), eq(APPEARANCE_LIGHT_STATUS_BARS));
+    }
+
+    @Test
     public void testAddOnControllableInsetsChangedListener() {
         OnControllableInsetsChangedListener listener =
                 mock(OnControllableInsetsChangedListener.class);
@@ -201,8 +220,10 @@
     public void testReplayTwice() {
         mPendingInsetsController.show(systemBars());
         mPendingInsetsController.setSystemBarsBehavior(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
-        mPendingInsetsController.setSystemBarsAppearance(APPEARANCE_LIGHT_STATUS_BARS,
-                APPEARANCE_LIGHT_STATUS_BARS);
+        mPendingInsetsController.setSystemBarsAppearance(
+                APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
+        mPendingInsetsController.setSystemBarsAppearanceFromResource(
+                APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
         mPendingInsetsController.addOnControllableInsetsChangedListener(
                 (controller, typeMask) -> {});
         mPendingInsetsController.replayAndAttach(mReplayedController);
@@ -235,15 +256,29 @@
     public void testDetachReattach() {
         mPendingInsetsController.show(systemBars());
         mPendingInsetsController.setSystemBarsBehavior(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
-        mPendingInsetsController.setSystemBarsAppearance(APPEARANCE_LIGHT_STATUS_BARS,
-                APPEARANCE_LIGHT_STATUS_BARS);
+        mPendingInsetsController.setSystemBarsAppearance(
+                APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
+        mPendingInsetsController.setSystemBarsAppearanceFromResource(
+                APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
         mPendingInsetsController.replayAndAttach(mReplayedController);
         mPendingInsetsController.detach();
         mPendingInsetsController.show(navigationBars());
+        mPendingInsetsController.setSystemBarsAppearance(
+                APPEARANCE_LIGHT_NAVIGATION_BARS, APPEARANCE_LIGHT_NAVIGATION_BARS);
+        mPendingInsetsController.setSystemBarsAppearanceFromResource(
+                APPEARANCE_LIGHT_NAVIGATION_BARS, APPEARANCE_LIGHT_NAVIGATION_BARS);
         InsetsController secondController = mock(InsetsController.class);
         mPendingInsetsController.replayAndAttach(secondController);
 
         verify(mReplayedController).show(eq(systemBars()));
+        verify(mReplayedController).setSystemBarsAppearance(
+                eq(APPEARANCE_LIGHT_STATUS_BARS), eq(APPEARANCE_LIGHT_STATUS_BARS));
+        verify(mReplayedController).setSystemBarsAppearanceFromResource(
+                eq(APPEARANCE_LIGHT_STATUS_BARS), eq(APPEARANCE_LIGHT_STATUS_BARS));
         verify(secondController).show(eq(navigationBars()));
+        verify(secondController).setSystemBarsAppearance(
+                eq(APPEARANCE_LIGHT_NAVIGATION_BARS), eq(APPEARANCE_LIGHT_NAVIGATION_BARS));
+        verify(secondController).setSystemBarsAppearanceFromResource(
+                eq(APPEARANCE_LIGHT_NAVIGATION_BARS), eq(APPEARANCE_LIGHT_NAVIGATION_BARS));
     }
 }
diff --git a/core/tests/coretests/src/android/view/ViewFrameRateTest.java b/core/tests/coretests/src/android/view/ViewFrameRateTest.java
index 90a8c5c..dcfbf64 100644
--- a/core/tests/coretests/src/android/view/ViewFrameRateTest.java
+++ b/core/tests/coretests/src/android/view/ViewFrameRateTest.java
@@ -16,7 +16,17 @@
 
 package android.view;
 
+import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH;
+import static android.view.Surface.FRAME_RATE_CATEGORY_LOW;
+import static android.view.Surface.FRAME_RATE_CATEGORY_NORMAL;
+import static android.view.Surface.FRAME_RATE_COMPATIBILITY_GTE;
+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;
 import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
+import static android.view.flags.Flags.toolkitFrameRateBySizeReadOnly;
+import static android.view.flags.Flags.toolkitFrameRateDefaultNormalReadOnly;
+import static android.view.flags.Flags.toolkitFrameRateSmallUsesPercentReadOnly;
 
 import static junit.framework.Assert.assertEquals;
 
@@ -26,6 +36,9 @@
 import android.app.Activity;
 import android.os.SystemClock;
 import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.util.DisplayMetrics;
 
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.filters.SmallTest;
@@ -50,6 +63,9 @@
     public ActivityTestRule<ViewCaptureTestActivity> mActivityRule = new ActivityTestRule<>(
             ViewCaptureTestActivity.class);
 
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
     private Activity mActivity;
     private View mMovingView;
     private ViewRootImpl mViewRoot;
@@ -70,7 +86,8 @@
 
     @UiThreadTest
     @Test
-    @RequiresFlagsEnabled(FLAG_VIEW_VELOCITY_API)
+    @RequiresFlagsEnabled({FLAG_VIEW_VELOCITY_API,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void frameRateChangesWhenContentMoves() {
         mMovingView.offsetLeftAndRight(100);
         float frameRate = mViewRoot.getPreferredFrameRate();
@@ -109,6 +126,46 @@
         });
     }
 
+    @Test
+    @RequiresFlagsEnabled({FLAG_VIEW_VELOCITY_API,
+            FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
+    public void lowVelocity60() throws Throwable {
+        mActivityRule.runOnUiThread(() -> {
+            ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
+            layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
+            layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
+            mMovingView.setLayoutParams(layoutParams);
+        });
+        waitForFrameRateCategoryToSettle();
+        mActivityRule.runOnUiThread(() -> {
+            mMovingView.setFrameContentVelocity(1f);
+            mMovingView.invalidate();
+            assertEquals(60f, mViewRoot.getPreferredFrameRate(), 0f);
+            assertEquals(FRAME_RATE_COMPATIBILITY_GTE, mViewRoot.getFrameRateCompatibility());
+        });
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_VIEW_VELOCITY_API,
+            FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
+    public void highVelocity140() throws Throwable {
+        mActivityRule.runOnUiThread(() -> {
+            ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
+            layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
+            layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
+            mMovingView.setLayoutParams(layoutParams);
+        });
+        waitForFrameRateCategoryToSettle();
+        mActivityRule.runOnUiThread(() -> {
+            mMovingView.setFrameContentVelocity(1_000_000_000f);
+            mMovingView.invalidate();
+            assertEquals(140f, mViewRoot.getPreferredFrameRate(), 0f);
+            assertEquals(FRAME_RATE_COMPATIBILITY_GTE, mViewRoot.getFrameRateCompatibility());
+        });
+    }
+
     private void waitForFrameRateCategoryToSettle() throws Throwable {
         for (int i = 0; i < 5; i++) {
             final CountDownLatch drawLatch = new CountDownLatch(1);
@@ -124,13 +181,24 @@
     }
 
     @Test
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void noVelocityUsesCategorySmall() throws Throwable {
         final CountDownLatch drawLatch1 = new CountDownLatch(1);
         mActivityRule.runOnUiThread(() -> {
-            float density = mActivity.getResources().getDisplayMetrics().density;
+            DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics();
             ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
-            layoutParams.height = (int) (40 * density);
-            layoutParams.width = (int) (40 * density);
+            if (toolkitFrameRateSmallUsesPercentReadOnly()) {
+                float pixels = displayMetrics.widthPixels * displayMetrics.heightPixels * 0.07f;
+                double smallSize = Math.sqrt(pixels);
+                layoutParams.width = (int) smallSize;
+                layoutParams.height = (int) smallSize;
+            } else {
+                float density = displayMetrics.density;
+                layoutParams.height = ((int) (40 * density));
+                layoutParams.width = ((int) (40 * density));
+            }
+
             mMovingView.setLayoutParams(layoutParams);
             mMovingView.getViewTreeObserver().addOnDrawListener(drawLatch1::countDown);
         });
@@ -141,19 +209,30 @@
         // Now that it is small, any invalidation should have a normal category
         mActivityRule.runOnUiThread(() -> {
             mMovingView.invalidate();
-            assertEquals(Surface.FRAME_RATE_CATEGORY_NORMAL,
-                    mViewRoot.getPreferredFrameRateCategory());
+            int expected = toolkitFrameRateBySizeReadOnly()
+                    ? FRAME_RATE_CATEGORY_LOW : FRAME_RATE_CATEGORY_NORMAL;
+            assertEquals(expected, mViewRoot.getPreferredFrameRateCategory());
         });
     }
 
     @Test
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void noVelocityUsesCategoryNarrowWidth() throws Throwable {
         final CountDownLatch drawLatch1 = new CountDownLatch(1);
         mActivityRule.runOnUiThread(() -> {
-            float density = mActivity.getResources().getDisplayMetrics().density;
+            DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics();
             ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
-            layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
-            layoutParams.width = (int) (10 * density);
+            if (toolkitFrameRateSmallUsesPercentReadOnly()) {
+                float pixels = displayMetrics.widthPixels * displayMetrics.heightPixels * 0.07f;
+                int parentWidth = ((View) mMovingView.getParent()).getWidth();
+                layoutParams.width = parentWidth;
+                layoutParams.height = (int) (pixels / parentWidth);
+            } else {
+                float density = displayMetrics.density;
+                layoutParams.width = (int) (10 * density);
+                layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
+            }
             mMovingView.setLayoutParams(layoutParams);
             mMovingView.getViewTreeObserver().addOnDrawListener(drawLatch1::countDown);
         });
@@ -164,19 +243,30 @@
         // Now that it is small, any invalidation should have a normal category
         mActivityRule.runOnUiThread(() -> {
             mMovingView.invalidate();
-            assertEquals(Surface.FRAME_RATE_CATEGORY_NORMAL,
-                    mViewRoot.getPreferredFrameRateCategory());
+            int expected = toolkitFrameRateBySizeReadOnly()
+                    ? FRAME_RATE_CATEGORY_LOW : FRAME_RATE_CATEGORY_NORMAL;
+            assertEquals(expected, mViewRoot.getPreferredFrameRateCategory());
         });
     }
 
     @Test
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void noVelocityUsesCategoryNarrowHeight() throws Throwable {
         final CountDownLatch drawLatch1 = new CountDownLatch(1);
         mActivityRule.runOnUiThread(() -> {
-            float density = mActivity.getResources().getDisplayMetrics().density;
+            DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics();
             ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
-            layoutParams.height = (int) (10 * density);
-            layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
+            if (toolkitFrameRateSmallUsesPercentReadOnly()) {
+                float pixels = displayMetrics.widthPixels * displayMetrics.heightPixels * 0.07f;
+                int parentHeight = ((View) mMovingView.getParent()).getHeight();
+                layoutParams.width = (int) (pixels / parentHeight);
+                layoutParams.height = parentHeight;
+            } else {
+                float density = displayMetrics.density;
+                layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
+                layoutParams.height = (int) (10 * density);
+            }
             mMovingView.setLayoutParams(layoutParams);
             mMovingView.getViewTreeObserver().addOnDrawListener(drawLatch1::countDown);
         });
@@ -187,19 +277,30 @@
         // Now that it is small, any invalidation should have a normal category
         mActivityRule.runOnUiThread(() -> {
             mMovingView.invalidate();
-            assertEquals(Surface.FRAME_RATE_CATEGORY_NORMAL,
-                    mViewRoot.getPreferredFrameRateCategory());
+            int expected = toolkitFrameRateBySizeReadOnly()
+                    ? FRAME_RATE_CATEGORY_LOW : FRAME_RATE_CATEGORY_NORMAL;
+            assertEquals(expected, mViewRoot.getPreferredFrameRateCategory());
         });
     }
 
     @Test
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void noVelocityUsesCategoryLargeWidth() throws Throwable {
         final CountDownLatch drawLatch1 = new CountDownLatch(1);
         mActivityRule.runOnUiThread(() -> {
-            float density = mActivity.getResources().getDisplayMetrics().density;
+            DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics();
             ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
-            layoutParams.height = (int) (40 * density);
-            layoutParams.width = (int) Math.ceil(41 * density);
+            if (toolkitFrameRateSmallUsesPercentReadOnly()) {
+                float pixels = displayMetrics.widthPixels * displayMetrics.heightPixels * 0.07f;
+                double smallSize = Math.sqrt(pixels);
+                layoutParams.width = 1 + (int) Math.ceil(pixels / smallSize);
+                layoutParams.height = (int) smallSize;
+            } else {
+                float density = displayMetrics.density;
+                layoutParams.width = ((int) Math.ceil(40 * density)) + 1;
+                layoutParams.height = ((int) (40 * density));
+            }
             mMovingView.setLayoutParams(layoutParams);
             mMovingView.getViewTreeObserver().addOnDrawListener(drawLatch1::countDown);
         });
@@ -210,19 +311,30 @@
         // Now that it is small, any invalidation should have a high category
         mActivityRule.runOnUiThread(() -> {
             mMovingView.invalidate();
-            assertEquals(Surface.FRAME_RATE_CATEGORY_HIGH,
-                    mViewRoot.getPreferredFrameRateCategory());
+            int expected = toolkitFrameRateDefaultNormalReadOnly()
+                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
+            assertEquals(expected, mViewRoot.getPreferredFrameRateCategory());
         });
     }
 
     @Test
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void noVelocityUsesCategoryLargeHeight() throws Throwable {
         final CountDownLatch drawLatch1 = new CountDownLatch(1);
         mActivityRule.runOnUiThread(() -> {
-            float density = mActivity.getResources().getDisplayMetrics().density;
+            DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics();
             ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
-            layoutParams.height = (int) Math.ceil(41 * density);
-            layoutParams.width = (int) (40 * density);
+            if (toolkitFrameRateSmallUsesPercentReadOnly()) {
+                float pixels = displayMetrics.widthPixels * displayMetrics.heightPixels * 0.07f;
+                double smallSize = Math.sqrt(pixels);
+                layoutParams.width = (int) smallSize;
+                layoutParams.height = 1 + (int) Math.ceil(pixels / smallSize);
+            } else {
+                float density = displayMetrics.density;
+                layoutParams.width = ((int) (40 * density));
+                layoutParams.height = ((int) Math.ceil(40 * density)) + 1;
+            }
             mMovingView.setLayoutParams(layoutParams);
             mMovingView.getViewTreeObserver().addOnDrawListener(drawLatch1::countDown);
         });
@@ -233,7 +345,29 @@
         // Now that it is small, any invalidation should have a high category
         mActivityRule.runOnUiThread(() -> {
             mMovingView.invalidate();
-            assertEquals(Surface.FRAME_RATE_CATEGORY_HIGH,
+            int expected = toolkitFrameRateDefaultNormalReadOnly()
+                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
+            assertEquals(expected, mViewRoot.getPreferredFrameRateCategory());
+        });
+    }
+
+    @Test
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
+    public void defaultNormal() throws Throwable {
+        mActivityRule.runOnUiThread(() -> {
+            View parent = (View) mMovingView.getParent();
+            ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
+            layoutParams.width = parent.getWidth() / 2;
+            layoutParams.height = parent.getHeight() / 2;
+            mMovingView.setLayoutParams(layoutParams);
+        });
+        waitForFrameRateCategoryToSettle();
+        mActivityRule.runOnUiThread(() -> {
+            mMovingView.invalidate();
+            int expected = toolkitFrameRateDefaultNormalReadOnly()
+                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
+            assertEquals(expected,
                     mViewRoot.getPreferredFrameRateCategory());
         });
     }
diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java
index f1e56d9..90ee36e 100644
--- a/core/tests/coretests/src/android/view/ViewRootImplTest.java
+++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java
@@ -19,6 +19,8 @@
 import static android.view.accessibility.Flags.FLAG_FORCE_INVERT_COLOR;
 import static android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY;
 import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY;
+import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY;
+import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY;
 import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
 import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH;
 import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH_HINT;
@@ -41,6 +43,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
 import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
+import static android.view.flags.Flags.toolkitFrameRateDefaultNormalReadOnly;
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
@@ -81,7 +84,6 @@
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -152,7 +154,8 @@
     public void adjustLayoutParamsForCompatibility_layoutFullscreen() {
         final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
         attrs.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
-        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
+        ViewRootImpl.adjustLayoutParamsForCompatibility(
+                attrs, 0 /* appearanceControlled */, false /* behaviorControlled */);
 
         // Type.statusBars() must be removed.
         assertEquals(0, attrs.getFitInsetsTypes() & Type.statusBars());
@@ -162,7 +165,8 @@
     public void adjustLayoutParamsForCompatibility_layoutInScreen() {
         final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
         attrs.flags = FLAG_LAYOUT_IN_SCREEN;
-        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
+        ViewRootImpl.adjustLayoutParamsForCompatibility(
+                attrs, 0 /* appearanceControlled */, false /* behaviorControlled */);
 
         // Type.statusBars() must be removed.
         assertEquals(0, attrs.getFitInsetsTypes() & Type.statusBars());
@@ -172,7 +176,8 @@
     public void adjustLayoutParamsForCompatibility_layoutHideNavigation() {
         final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
         attrs.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
-        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
+        ViewRootImpl.adjustLayoutParamsForCompatibility(
+                attrs, 0 /* appearanceControlled */, false /* behaviorControlled */);
 
         // Type.systemBars() must be removed.
         assertEquals(0, attrs.getFitInsetsTypes() & Type.systemBars());
@@ -181,7 +186,8 @@
     @Test
     public void adjustLayoutParamsForCompatibility_toast() {
         final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_TOAST);
-        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
+        ViewRootImpl.adjustLayoutParamsForCompatibility(
+                attrs, 0 /* appearanceControlled */, false /* behaviorControlled */);
 
         assertTrue(attrs.isFitInsetsIgnoringVisibility());
     }
@@ -189,7 +195,8 @@
     @Test
     public void adjustLayoutParamsForCompatibility_systemAlert() {
         final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_SYSTEM_ALERT);
-        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
+        ViewRootImpl.adjustLayoutParamsForCompatibility(
+                attrs, 0 /* appearanceControlled */, false /* behaviorControlled */);
 
         assertTrue(attrs.isFitInsetsIgnoringVisibility());
     }
@@ -197,7 +204,8 @@
     @Test
     public void adjustLayoutParamsForCompatibility_fitSystemBars() {
         final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
-        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
+        ViewRootImpl.adjustLayoutParamsForCompatibility(
+                attrs, 0 /* appearanceControlled */, false /* behaviorControlled */);
 
         assertEquals(Type.systemBars(), attrs.getFitInsetsTypes());
     }
@@ -206,7 +214,8 @@
     public void adjustLayoutParamsForCompatibility_fitSystemBarsAndIme() {
         final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
         attrs.softInputMode |= SOFT_INPUT_ADJUST_RESIZE;
-        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
+        ViewRootImpl.adjustLayoutParamsForCompatibility(
+                attrs, 0 /* appearanceControlled */, false /* behaviorControlled */);
 
         assertEquals(Type.systemBars() | Type.ime(), attrs.getFitInsetsTypes());
     }
@@ -221,7 +230,8 @@
         attrs.setFitInsetsTypes(types);
         attrs.setFitInsetsSides(sides);
         attrs.setFitInsetsIgnoringVisibility(fitMaxInsets);
-        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
+        ViewRootImpl.adjustLayoutParamsForCompatibility(
+                attrs, 0 /* appearanceControlled */, false /* behaviorControlled */);
 
         // Fit-insets related fields must not be adjusted due to legacy system UI visibility
         // after calling fit-insets related methods.
@@ -232,14 +242,16 @@
 
     @Test
     public void adjustLayoutParamsForCompatibility_noAdjustAppearance() {
-        final WindowInsetsController controller = mViewRootImpl.getInsetsController();
+        final InsetsController controller = mViewRootImpl.getInsetsController();
         final WindowManager.LayoutParams attrs = mViewRootImpl.mWindowAttributes;
         final int appearance = APPEARANCE_OPAQUE_STATUS_BARS;
         controller.setSystemBarsAppearance(appearance, 0xffffffff);
         attrs.systemUiVisibility = SYSTEM_UI_FLAG_LOW_PROFILE
                 | SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
                 | SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
-        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
+        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs,
+                controller.getAppearanceControlled(),
+                controller.isBehaviorControlled());
 
         // Appearance must not be adjusted due to legacy system UI visibility after calling
         // setSystemBarsAppearance.
@@ -253,12 +265,14 @@
 
     @Test
     public void adjustLayoutParamsForCompatibility_noAdjustBehavior() {
-        final WindowInsetsController controller = mViewRootImpl.getInsetsController();
+        final InsetsController controller = mViewRootImpl.getInsetsController();
         final WindowManager.LayoutParams attrs = mViewRootImpl.mWindowAttributes;
         final int behavior = BEHAVIOR_DEFAULT;
         controller.setSystemBarsBehavior(behavior);
         attrs.systemUiVisibility = SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
-        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
+        ViewRootImpl.adjustLayoutParamsForCompatibility(attrs,
+                controller.getAppearanceControlled(),
+                controller.isBehaviorControlled());
 
         // Behavior must not be adjusted due to legacy system UI visibility after calling
         // setSystemBarsBehavior.
@@ -463,8 +477,8 @@
      */
     @UiThreadTest
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_getDefaultValues() {
         ViewRootImpl viewRootImpl = new ViewRootImpl(sContext,
                 sContext.getDisplayNoVerify());
@@ -480,9 +494,9 @@
      * Also, mIsFrameRateBoosting should be true when the visibility becomes visible
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
     @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
-            FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY})
+            FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRateCategory_visibility_bySize() {
         View view = new View(sContext);
         attachViewToWindow(view);
@@ -514,9 +528,9 @@
      * <7%: FRAME_RATE_CATEGORY_LOW
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
     @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
-            FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY})
+            FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRateCategory_smallSize_bySize() {
         View view = new View(sContext);
         WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -543,9 +557,9 @@
      * >=7% : FRAME_RATE_CATEGORY_NORMAL
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
     @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
-            FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY})
+            FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRateCategory_normalSize_bySize() {
         View view = new View(sContext);
         WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -576,8 +590,9 @@
      * Also, mIsFrameRateBoosting should be true when the visibility becomes visible
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRateCategory_visibility_defaultHigh() {
         View view = new View(sContext);
         attachViewToWindow(view);
@@ -593,8 +608,9 @@
         sInstrumentation.runOnMainSync(() -> {
             view.setVisibility(View.VISIBLE);
             view.invalidate();
-            assertEquals(viewRootImpl.getPreferredFrameRateCategory(),
-                    FRAME_RATE_CATEGORY_HIGH);
+            int expected = toolkitFrameRateDefaultNormalReadOnly()
+                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
+            assertEquals(expected, viewRootImpl.getPreferredFrameRateCategory());
         });
         sInstrumentation.waitForIdleSync();
 
@@ -609,8 +625,9 @@
      * <7%: FRAME_RATE_CATEGORY_NORMAL
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRateCategory_smallSize_defaultHigh() {
         View view = new View(sContext);
         WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -637,8 +654,9 @@
      * >=7% : FRAME_RATE_CATEGORY_HIGH
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRateCategory_normalSize_defaultHigh() {
         View view = new View(sContext);
         WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -658,17 +676,19 @@
         ViewRootImpl viewRootImpl = view.getViewRootImpl();
         sInstrumentation.runOnMainSync(() -> {
             view.invalidate();
-            assertEquals(viewRootImpl.getPreferredFrameRateCategory(), FRAME_RATE_CATEGORY_HIGH);
+            int expected = toolkitFrameRateDefaultNormalReadOnly()
+                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
+            assertEquals(expected, viewRootImpl.getPreferredFrameRateCategory());
         });
     }
 
     /**
-     * Test how values of the frame rate cateogry are aggregated.
+     * Test how values of the frame rate category are aggregated.
      * It should take the max value among all of the voted categories per frame.
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRateCategory_aggregate() {
         View view = new View(sContext);
         attachViewToWindow(view);
@@ -713,8 +733,8 @@
      * prioritize 60Hz..
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRate_aggregate() {
         View view = new View(sContext);
         attachViewToWindow(view);
@@ -772,8 +792,9 @@
      * submit your preferred choice to the ViewRootImpl.
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRate_category() {
         View view = new View(sContext);
         attachViewToWindow(view);
@@ -812,8 +833,10 @@
      * Also, we shouldn't call setFrameRate.
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_VIEW_VELOCITY_API})
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_VIEW_VELOCITY_API,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRateCategory_velocityToHigh() {
         View view = new View(sContext);
         WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -844,8 +867,8 @@
      * We should boost the frame rate if the value of mInsetsAnimationRunning is true.
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_insetsAnimation() {
         View view = new View(sContext);
         WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -881,8 +904,8 @@
      * Test FrameRateBoostOnTouchEnabled API
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_frameRateBoostOnTouch() {
         View view = new View(sContext);
         attachViewToWindow(view);
@@ -914,8 +937,8 @@
      * mPreferredFrameRate should be set to 0.
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRateTimeOut() throws InterruptedException {
         final long delay = 200L;
 
@@ -952,8 +975,9 @@
      * A View should either vote a frame rate or a frame rate category instead of both.
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_voteFrameRateOnly() {
         View view = new View(sContext);
         float frameRate = 20;
@@ -995,8 +1019,9 @@
      * - otherwise, use the previous category value.
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_infrequentLayer_defaultHigh() throws InterruptedException {
         final long delay = 200L;
 
@@ -1017,11 +1042,13 @@
 
         ViewRootImpl viewRootImpl = view.getViewRootImpl();
 
-        // In transistion from frequent update to infrequent update
+        // In transition from frequent update to infrequent update
         Thread.sleep(delay);
         sInstrumentation.runOnMainSync(() -> {
             view.invalidate();
-            assertEquals(viewRootImpl.getPreferredFrameRateCategory(), FRAME_RATE_CATEGORY_HIGH);
+            int expected = toolkitFrameRateDefaultNormalReadOnly()
+                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
+            assertEquals(expected, viewRootImpl.getPreferredFrameRateCategory());
         });
 
         // reset the frame rate category counts
@@ -1033,7 +1060,7 @@
             sInstrumentation.waitForIdleSync();
         }
 
-        // In transistion from frequent update to infrequent update
+        // In transition from frequent update to infrequent update
         Thread.sleep(delay);
         sInstrumentation.runOnMainSync(() -> {
             view.setRequestedFrameRate(view.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE);
@@ -1061,18 +1088,32 @@
     /**
      * Test the IsFrameRatePowerSavingsBalanced values are properly set
      */
-    @UiThreadTest
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_isFrameRatePowerSavingsBalanced() {
-        ViewRootImpl viewRootImpl = new ViewRootImpl(sContext,
-                sContext.getDisplayNoVerify());
-        assertEquals(viewRootImpl.isFrameRatePowerSavingsBalanced(), true);
-        viewRootImpl.setFrameRatePowerSavingsBalanced(false);
-        assertEquals(viewRootImpl.isFrameRatePowerSavingsBalanced(), false);
-        viewRootImpl.setFrameRatePowerSavingsBalanced(true);
-        assertEquals(viewRootImpl.isFrameRatePowerSavingsBalanced(), true);
+        View view = new View(sContext);
+        attachViewToWindow(view);
+        sInstrumentation.waitForIdleSync();
+
+        ViewRootImpl viewRoot = view.getViewRootImpl();
+        final WindowManager.LayoutParams attrs = viewRoot.mWindowAttributes;
+        assertEquals(attrs.isFrameRatePowerSavingsBalanced(), true);
+        assertEquals(viewRoot.isFrameRatePowerSavingsBalanced(),
+                attrs.isFrameRatePowerSavingsBalanced());
+
+        sInstrumentation.runOnMainSync(() -> {
+            attrs.setFrameRatePowerSavingsBalanced(false);
+            viewRoot.setLayoutParams(attrs, false);
+        });
+        sInstrumentation.waitForIdleSync();
+
+        sInstrumentation.runOnMainSync(() -> {
+            final WindowManager.LayoutParams newAttrs = viewRoot.mWindowAttributes;
+            assertEquals(newAttrs.isFrameRatePowerSavingsBalanced(), false);
+            assertEquals(viewRoot.isFrameRatePowerSavingsBalanced(),
+                    newAttrs.isFrameRatePowerSavingsBalanced());
+        });
     }
 
     /**
@@ -1081,8 +1122,9 @@
      * 2. If FT2-FT1 > 15ms && FT3-FT2 > 15ms -> vote for NORMAL category
      */
     @Test
-    @Ignore("Can be enabled only after b/330596920 is ready")
-    @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+    @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY,
+            FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
     public void votePreferredFrameRate_applyTextureViewHeuristic() throws InterruptedException {
         final long delay = 30L;
 
@@ -1107,8 +1149,9 @@
             assertEquals(viewRootImpl.getPreferredFrameRateCategory(),
                     FRAME_RATE_CATEGORY_NO_PREFERENCE);
             view.invalidate();
-            assertEquals(viewRootImpl.getPreferredFrameRateCategory(),
-                    FRAME_RATE_CATEGORY_HIGH);
+            int expected = toolkitFrameRateDefaultNormalReadOnly()
+                    ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
+            assertEquals(expected, viewRootImpl.getPreferredFrameRateCategory());
         });
 
          // reset the frame rate category counts
diff --git a/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java b/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java
index faad472..365f3bf 100644
--- a/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java
+++ b/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java
@@ -21,7 +21,7 @@
 import static android.view.MotionEvent.ACTION_MOVE;
 import static android.view.MotionEvent.ACTION_UP;
 import static android.view.inputmethod.Flags.initiationWithoutInputConnection;
-import static android.view.stylus.HandwritingTestUtil.createView;
+import static android.view.stylus.HandwritingTestUtil.createEditText;
 
 import static com.android.text.flags.Flags.handwritingCursorPosition;
 
@@ -112,13 +112,13 @@
         mHandwritingInitiator =
                 spy(new HandwritingInitiator(viewConfiguration, inputMethodManager));
 
-        mTestView1 = createView(sHwArea1, /* autoHandwritingEnabled= */ true,
+        mTestView1 = createEditText(sHwArea1, /* autoHandwritingEnabled= */ true,
                 /* isStylusHandwritingAvailable= */ true,
                 HW_BOUNDS_OFFSETS_LEFT_PX,
                 HW_BOUNDS_OFFSETS_TOP_PX,
                 HW_BOUNDS_OFFSETS_RIGHT_PX,
                 HW_BOUNDS_OFFSETS_BOTTOM_PX);
-        mTestView2 = createView(sHwArea2, /* autoHandwritingEnabled= */ true,
+        mTestView2 = createEditText(sHwArea2, /* autoHandwritingEnabled= */ true,
                 /* isStylusHandwritingAvailable= */ true,
                 HW_BOUNDS_OFFSETS_LEFT_PX,
                 HW_BOUNDS_OFFSETS_TOP_PX,
@@ -412,7 +412,7 @@
     @Test
     public void onTouchEvent_notStartHandwriting_whenHandwritingNotAvailable() {
         final Rect rect = new Rect(600, 600, 900, 900);
-        final View testView = createView(rect, true /* autoHandwritingEnabled */,
+        final View testView = createEditText(rect, true /* autoHandwritingEnabled */,
                 false /* isStylusHandwritingAvailable */);
         mHandwritingInitiator.updateHandwritingAreasForView(testView);
 
@@ -717,7 +717,7 @@
             mTestView1.setHandwritingDelegatorCallback(null);
             onEditorFocusedOrConnectionCreated(mTestView1);
         } else {
-            View mockView = createView(sHwArea1, false /* autoHandwritingEnabled */,
+            View mockView = createEditText(sHwArea1, false /* autoHandwritingEnabled */,
                     true /* isStylusHandwritingAvailable */);
             onEditorFocusedOrConnectionCreated(mockView);
         }
diff --git a/core/tests/coretests/src/android/view/stylus/HandwritingTestUtil.java b/core/tests/coretests/src/android/view/stylus/HandwritingTestUtil.java
index 3b2ab4c..2c3ee34 100644
--- a/core/tests/coretests/src/android/view/stylus/HandwritingTestUtil.java
+++ b/core/tests/coretests/src/android/view/stylus/HandwritingTestUtil.java
@@ -33,26 +33,63 @@
 
 import androidx.test.platform.app.InstrumentationRegistry;
 
-public class HandwritingTestUtil {
-    public static EditText createView(Rect handwritingArea) {
+class HandwritingTestUtil {
+    static View createView(Rect handwritingArea) {
         return createView(handwritingArea, true /* autoHandwritingEnabled */,
                 true /* isStylusHandwritingAvailable */);
     }
 
-    public static EditText createView(Rect handwritingArea, boolean autoHandwritingEnabled,
+    static View createView(Rect handwritingArea, boolean autoHandwritingEnabled,
             boolean isStylusHandwritingAvailable) {
         return createView(handwritingArea, autoHandwritingEnabled, isStylusHandwritingAvailable,
                 0, 0, 0, 0);
     }
 
-    public static EditText createView(Rect handwritingArea, boolean autoHandwritingEnabled,
+    static View createView(Rect handwritingArea, boolean autoHandwritingEnabled,
             boolean isStylusHandwritingAvailable,
             float handwritingBoundsOffsetLeft, float handwritingBoundsOffsetTop,
             float handwritingBoundsOffsetRight, float handwritingBoundsOffsetBottom) {
         final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
         final Context context = instrumentation.getTargetContext();
-        // mock a parent so that HandwritingInitiator can get visible rect and hit region.
-        final ViewGroup parent = new ViewGroup(context) {
+        View view = spy(new View(context));
+        mockSpy(view, handwritingArea, autoHandwritingEnabled, isStylusHandwritingAvailable,
+                handwritingBoundsOffsetLeft, handwritingBoundsOffsetTop,
+                handwritingBoundsOffsetRight, handwritingBoundsOffsetBottom);
+        return view;
+    }
+
+    static EditText createEditText(Rect handwritingArea, boolean autoHandwritingEnabled,
+            boolean isStylusHandwritingAvailable) {
+        return createEditText(handwritingArea, autoHandwritingEnabled, isStylusHandwritingAvailable,
+                0, 0, 0, 0);
+    }
+
+    static EditText createEditText(Rect handwritingArea, boolean autoHandwritingEnabled,
+            boolean isStylusHandwritingAvailable,
+            float handwritingBoundsOffsetLeft, float handwritingBoundsOffsetTop,
+            float handwritingBoundsOffsetRight, float handwritingBoundsOffsetBottom) {
+        final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        final Context context = instrumentation.getTargetContext();
+        EditText view = spy(new EditText(context));
+        doAnswer(invocation -> {
+            int[] outLocation = invocation.getArgument(0);
+            outLocation[0] = handwritingArea.left;
+            outLocation[1] = handwritingArea.top;
+            return null;
+        }).when(view).getLocationInWindow(any());
+        when(view.getOffsetForPosition(anyFloat(), anyFloat())).thenReturn(0);
+        mockSpy(view, handwritingArea, autoHandwritingEnabled, isStylusHandwritingAvailable,
+                handwritingBoundsOffsetLeft, handwritingBoundsOffsetTop,
+                handwritingBoundsOffsetRight, handwritingBoundsOffsetBottom);
+        return view;
+    }
+
+    private static void mockSpy(View viewSpy, Rect handwritingArea,
+            boolean autoHandwritingEnabled, boolean isStylusHandwritingAvailable,
+            float handwritingBoundsOffsetLeft, float handwritingBoundsOffsetTop,
+            float handwritingBoundsOffsetRight, float handwritingBoundsOffsetBottom) {
+        // Mock a parent so that HandwritingInitiator can get visible rect and hit region.
+        final ViewGroup parent = new ViewGroup(viewSpy.getContext()) {
             @Override
             protected void onLayout(boolean changed, int l, int t, int r, int b) {
                 // We don't layout this view.
@@ -72,24 +109,15 @@
             }
         };
 
-        EditText view = spy(new EditText(context));
-        when(view.isAttachedToWindow()).thenReturn(true);
-        when(view.isAggregatedVisible()).thenReturn(true);
-        when(view.isStylusHandwritingAvailable()).thenReturn(isStylusHandwritingAvailable);
-        when(view.getHandwritingArea()).thenReturn(handwritingArea);
-        when(view.getHandwritingBoundsOffsetLeft()).thenReturn(handwritingBoundsOffsetLeft);
-        when(view.getHandwritingBoundsOffsetTop()).thenReturn(handwritingBoundsOffsetTop);
-        when(view.getHandwritingBoundsOffsetRight()).thenReturn(handwritingBoundsOffsetRight);
-        when(view.getHandwritingBoundsOffsetBottom()).thenReturn(handwritingBoundsOffsetBottom);
-        doAnswer(invocation -> {
-            int[] outLocation = invocation.getArgument(0);
-            outLocation[0] = handwritingArea.left;
-            outLocation[1] = handwritingArea.top;
-            return null;
-        }).when(view).getLocationInWindow(any());
-        when(view.getOffsetForPosition(anyFloat(), anyFloat())).thenReturn(0);
-        view.setAutoHandwritingEnabled(autoHandwritingEnabled);
-        parent.addView(view);
-        return view;
+        when(viewSpy.isAttachedToWindow()).thenReturn(true);
+        when(viewSpy.isAggregatedVisible()).thenReturn(true);
+        when(viewSpy.isStylusHandwritingAvailable()).thenReturn(isStylusHandwritingAvailable);
+        when(viewSpy.getHandwritingArea()).thenReturn(handwritingArea);
+        when(viewSpy.getHandwritingBoundsOffsetLeft()).thenReturn(handwritingBoundsOffsetLeft);
+        when(viewSpy.getHandwritingBoundsOffsetTop()).thenReturn(handwritingBoundsOffsetTop);
+        when(viewSpy.getHandwritingBoundsOffsetRight()).thenReturn(handwritingBoundsOffsetRight);
+        when(viewSpy.getHandwritingBoundsOffsetBottom()).thenReturn(handwritingBoundsOffsetBottom);
+        viewSpy.setAutoHandwritingEnabled(autoHandwritingEnabled);
+        parent.addView(viewSpy);
     }
 }
diff --git a/core/tests/coretests/src/android/widget/AbsListViewActivity.java b/core/tests/coretests/src/android/widget/AbsListViewActivity.java
new file mode 100644
index 0000000..a617fa4
--- /dev/null
+++ b/core/tests/coretests/src/android/widget/AbsListViewActivity.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.widget;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import com.android.frameworks.coretests.R;
+
+/**
+ * An activity for testing the AbsListView widget.
+ */
+public class AbsListViewActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_abslist_view);
+    }
+}
diff --git a/core/tests/coretests/src/android/widget/AbsListViewFunctionalTest.java b/core/tests/coretests/src/android/widget/AbsListViewFunctionalTest.java
new file mode 100644
index 0000000..ceea6ca
--- /dev/null
+++ b/core/tests/coretests/src/android/widget/AbsListViewFunctionalTest.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 android.widget;
+
+import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.util.AttributeSet;
+import android.util.PollingCheck;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.compatibility.common.util.WidgetTestUtils;
+import com.android.frameworks.coretests.R;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class AbsListViewFunctionalTest {
+    private final String[] mCountryList = new String[] {
+        "Argentina", "Australia", "Belize", "Botswana", "Brazil", "Cameroon", "China", "Cyprus",
+        "Denmark", "Djibouti", "Ethiopia", "Fiji", "Finland", "France", "Gabon", "Germany",
+        "Ghana", "Haiti", "Honduras", "Iceland", "India", "Indonesia", "Ireland", "Italy",
+        "Japan", "Kiribati", "Laos", "Lesotho", "Liberia", "Malaysia", "Mongolia", "Myanmar",
+        "Nauru", "Norway", "Oman", "Pakistan", "Philippines", "Portugal", "Romania", "Russia",
+        "Rwanda", "Singapore", "Slovakia", "Slovenia", "Somalia", "Swaziland", "Togo", "Tuvalu",
+        "Uganda", "Ukraine", "United States", "Vanuatu", "Venezuela", "Zimbabwe"
+    };
+    private AbsListViewActivity mActivity;
+    private MyListView mMyListView;
+
+    @Rule
+    public ActivityTestRule<AbsListViewActivity> mActivityRule = new ActivityTestRule<>(
+            AbsListViewActivity.class);
+
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule =
+            DeviceFlagsValueProvider.createCheckFlagsRule();
+
+    @Before
+    public void setUp() throws Exception {
+        mActivity = mActivityRule.getActivity();
+        mMyListView = (MyListView) mActivity.findViewById(R.id.list_view);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_VIEW_VELOCITY_API)
+    public void testLsitViewSetVelocity() throws Throwable {
+        final ArrayList<String> items = new ArrayList<>(Arrays.asList(mCountryList));
+        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(mActivity,
+                android.R.layout.simple_list_item_1, items);
+
+        WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mMyListView,
+                () -> mMyListView.setAdapter(adapter));
+        mActivityRule.runOnUiThread(() -> {
+            // Create an adapter to display the list
+            mMyListView.setFrameContentVelocity(0);
+        });
+        // set setFrameContentVelocity shouldn't do anything.
+        assertEquals(mMyListView.isSetVelocityCalled, false);
+
+        mActivityRule.runOnUiThread(() -> {
+            mMyListView.fling(100);
+        });
+        PollingCheck.waitFor(100, () -> mMyListView.isSetVelocityCalled);
+        // set setFrameContentVelocity should be called when fling.
+        assertTrue(mMyListView.isSetVelocityCalled);
+    }
+
+    public static class MyListView extends ListView {
+
+        public boolean isSetVelocityCalled;
+
+        public MyListView(Context context) {
+            super(context);
+        }
+
+        public MyListView(Context context, AttributeSet attrs) {
+            super(context, attrs);
+        }
+
+        public MyListView(Context context, AttributeSet attrs, int defStyle) {
+            super(context, attrs, defStyle);
+        }
+
+        public MyListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+            super(context, attrs, defStyleAttr, defStyleRes);
+        }
+
+        @Override
+        public void setFrameContentVelocity(float pixelsPerSecond) {
+            if (pixelsPerSecond != 0) {
+                isSetVelocityCalled = true;
+            }
+        }
+    }
+}
diff --git a/core/tests/coretests/src/android/widget/HorizontalScrollViewFunctionalTest.java b/core/tests/coretests/src/android/widget/HorizontalScrollViewFunctionalTest.java
index cd38bd6..5d62f1c 100644
--- a/core/tests/coretests/src/android/widget/HorizontalScrollViewFunctionalTest.java
+++ b/core/tests/coretests/src/android/widget/HorizontalScrollViewFunctionalTest.java
@@ -99,13 +99,29 @@
             mMyHorizontalScrollView.setFrameContentVelocity(0);
         });
         // set setFrameContentVelocity shouldn't do anything.
-        assertEquals(mMyHorizontalScrollView.isSetVelocityCalled, false);
+        assertTrue(mMyHorizontalScrollView.isSetVelocityCalled);
+        assertEquals(0f, mMyHorizontalScrollView.velocity, 0f);
+        mMyHorizontalScrollView.isSetVelocityCalled = false;
 
         mActivityRule.runOnUiThread(() -> {
             mMyHorizontalScrollView.fling(100);
         });
         // set setFrameContentVelocity should be called when fling.
-        assertEquals(mMyHorizontalScrollView.isSetVelocityCalled, true);
+        assertTrue(mMyHorizontalScrollView.isSetVelocityCalled);
+        assertTrue(mMyHorizontalScrollView.velocity > 0f);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_VIEW_VELOCITY_API)
+    public void hasVelocityInSmoothScrollBy() throws Throwable {
+        int maxScroll = mMyHorizontalScrollView.getChildAt(0).getWidth()
+                - mMyHorizontalScrollView.getWidth();
+        mActivityRule.runOnUiThread(() -> {
+            mMyHorizontalScrollView.smoothScrollTo(maxScroll, 0);
+        });
+        PollingCheck.waitFor(() -> mMyHorizontalScrollView.getScrollX() != 0);
+        assertTrue(mMyHorizontalScrollView.isSetVelocityCalled);
+        assertTrue(mMyHorizontalScrollView.velocity > 0f);
     }
 
     static class WatchedEdgeEffect extends EdgeEffect {
@@ -122,9 +138,10 @@
         }
     }
 
-    public static class MyHorizontalScrollView extends ScrollView {
+    public static class MyHorizontalScrollView extends HorizontalScrollView {
 
         public boolean isSetVelocityCalled;
+        public float velocity;
 
         public MyHorizontalScrollView(Context context) {
             super(context);
@@ -140,9 +157,8 @@
 
         @Override
         public void setFrameContentVelocity(float pixelsPerSecond) {
-            if (pixelsPerSecond != 0) {
-                isSetVelocityCalled = true;
-            }
+            isSetVelocityCalled = true;
+            velocity = pixelsPerSecond;
         }
     }
 }
diff --git a/core/tests/coretests/src/android/widget/ScrollViewFunctionalTest.java b/core/tests/coretests/src/android/widget/ScrollViewFunctionalTest.java
index a60b2a13..6d0bab5 100644
--- a/core/tests/coretests/src/android/widget/ScrollViewFunctionalTest.java
+++ b/core/tests/coretests/src/android/widget/ScrollViewFunctionalTest.java
@@ -19,6 +19,7 @@
 import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
 import android.content.Context;
@@ -98,13 +99,28 @@
             mMyScrollView.setFrameContentVelocity(0);
         });
         // set setFrameContentVelocity shouldn't do anything.
-        assertEquals(mMyScrollView.isSetVelocityCalled, false);
+        assertTrue(mMyScrollView.isSetVelocityCalled);
+        assertEquals(0f, mMyScrollView.velocity, 0f);
+        mMyScrollView.isSetVelocityCalled = false;
 
         mActivityRule.runOnUiThread(() -> {
             mMyScrollView.fling(100);
         });
         // set setFrameContentVelocity should be called when fling.
-        assertEquals(mMyScrollView.isSetVelocityCalled, true);
+        assertTrue(mMyScrollView.isSetVelocityCalled);
+        assertNotEquals(0f, mMyScrollView.velocity, 0.01f);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(FLAG_VIEW_VELOCITY_API)
+    public void hasVelocityInSmoothScrollBy() throws Throwable {
+        int maxScroll = mMyScrollView.getChildAt(0).getHeight() - mMyScrollView.getHeight();
+        mActivityRule.runOnUiThread(() -> {
+            mMyScrollView.smoothScrollTo(0, maxScroll);
+        });
+        PollingCheck.waitFor(() -> mMyScrollView.getScrollY() != 0);
+        assertTrue(mMyScrollView.isSetVelocityCalled);
+        assertTrue(mMyScrollView.velocity > 0f);
     }
 
     static class WatchedEdgeEffect extends EdgeEffect {
@@ -125,6 +141,8 @@
 
         public boolean isSetVelocityCalled;
 
+        public float velocity;
+
         public MyScrollView(Context context) {
             super(context);
         }
@@ -139,9 +157,8 @@
 
         @Override
         public void setFrameContentVelocity(float pixelsPerSecond) {
-            if (pixelsPerSecond != 0) {
-                isSetVelocityCalled = true;
-            }
+            isSetVelocityCalled = true;
+            velocity = pixelsPerSecond;
         }
     }
 }
diff --git a/core/tests/coretests/src/android/window/WindowMetricsHelperTest.java b/core/tests/coretests/src/android/window/WindowMetricsHelperTest.java
index 921866b..7cbb6b4 100644
--- a/core/tests/coretests/src/android/window/WindowMetricsHelperTest.java
+++ b/core/tests/coretests/src/android/window/WindowMetricsHelperTest.java
@@ -16,18 +16,27 @@
 
 package android.window;
 
+import static android.view.WindowInsets.Type.displayCutout;
+import static android.view.WindowInsets.Type.navigationBars;
+
 import static org.junit.Assert.assertEquals;
 
 import android.app.Activity;
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.view.WindowInsets;
 import android.view.WindowMetrics;
 
 import androidx.test.filters.SmallTest;
 import androidx.test.rule.ActivityTestRule;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.window.flags.Flags;
+
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -49,20 +58,44 @@
     @Rule
     public ActivityTestRule<TestActivity> mActivityRule =
             new ActivityTestRule<>(TestActivity.class);
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule =
+            DeviceFlagsValueProvider.createCheckFlagsRule();
 
     @Test
-    public void testGetLegacySizeMatchesDisplayGetSize() throws Throwable {
+    @RequiresFlagsDisabled(Flags.FLAG_INSETS_DECOUPLED_CONFIGURATION)
+    public void testGetBoundsExcludingNavigationBarAndCutoutMatchesDisplayGetSize()
+            throws Throwable {
         mActivityRule.runOnUiThread(() -> {
             Activity activity = mActivityRule.getActivity();
             final WindowMetrics metrics = activity.getWindowManager().getCurrentWindowMetrics();
-            final Rect legacyBounds = WindowMetricsHelper
+            final Rect boundsExcludingNavBarAndCutout = WindowMetricsHelper
                     .getBoundsExcludingNavigationBarAndCutout(metrics);
 
             final Point expectedSize = new Point();
             activity.getDisplay().getSize(expectedSize);
 
-            assertEquals(expectedSize.x, legacyBounds.width());
-            assertEquals(expectedSize.y, legacyBounds.height());
+            assertEquals(expectedSize.x, boundsExcludingNavBarAndCutout.width());
+            assertEquals(expectedSize.y, boundsExcludingNavBarAndCutout.height());
+        });
+    }
+
+    @Test
+    public void testGetBoundsExcludingNavigationBarAndCutout()
+            throws Throwable {
+        mActivityRule.runOnUiThread(() -> {
+            Activity activity = mActivityRule.getActivity();
+            final WindowMetrics metrics = activity.getWindowManager().getCurrentWindowMetrics();
+            final Rect boundsExcludingNavBarAndCutout = WindowMetricsHelper
+                    .getBoundsExcludingNavigationBarAndCutout(metrics);
+
+            final WindowInsets windowInsets = metrics.getWindowInsets();
+            final Rect expectedBounds = new Rect(metrics.getBounds());
+            expectedBounds.inset(windowInsets.getInsetsIgnoringVisibility(
+                    navigationBars() | displayCutout()));
+
+            assertEquals(expectedBounds.width(), boundsExcludingNavBarAndCutout.width());
+            assertEquals(expectedBounds.height(), boundsExcludingNavBarAndCutout.height());
         });
     }
 
diff --git a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
index a709d7b..6321e5d 100644
--- a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
+++ b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java
@@ -96,7 +96,7 @@
         doReturn(mApplicationInfo).when(mContext).getApplicationInfo();
 
         mDispatcher = new WindowOnBackInvokedDispatcher(mContext);
-        mDispatcher.attachToWindow(mWindowSession, mWindow);
+        mDispatcher.attachToWindow(mWindowSession, mWindow, null);
     }
 
     private void waitForIdle() {
diff --git a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutChooserActivityTest.java
index 745390d..9f5ed29 100644
--- a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutChooserActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutChooserActivityTest.java
@@ -53,7 +53,6 @@
 import android.content.pm.ServiceInfo;
 import android.os.Bundle;
 import android.os.Handler;
-import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.support.test.uiautomator.By;
@@ -63,7 +62,6 @@
 import android.view.View;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.Flags;
 import android.view.accessibility.IAccessibilityManager;
 import android.widget.Button;
 
@@ -298,7 +296,6 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(Flags.FLAG_ALLOW_SHORTCUT_CHOOSER_ON_LOCKSCREEN)
     public void createDialog_onLockscreen_hasExpectedContent() {
         when(mKeyguardManager.isKeyguardLocked()).thenReturn(true);
         launchActivity();
diff --git a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
index 75b0d4a..5fab1a0 100644
--- a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
+++ b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
@@ -21,13 +21,13 @@
 import static android.provider.Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN;
 import static android.provider.Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE;
 import static android.provider.Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
 
 import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.COLOR_INVERSION_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.ONE_HANDED_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.REDUCE_BRIGHT_COLORS_COMPONENT_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -64,9 +64,9 @@
 import android.os.Handler;
 import android.os.Message;
 import android.os.Vibrator;
-import android.platform.test.annotations.RequiresFlagsEnabled;
-import android.platform.test.flag.junit.CheckFlagsRule;
-import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.Settings;
 import android.speech.tts.TextToSpeech;
 import android.speech.tts.Voice;
@@ -91,6 +91,7 @@
 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 org.mockito.invocation.InvocationOnMock;
@@ -98,14 +99,14 @@
 import java.lang.reflect.Field;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 @RunWith(AndroidJUnit4.class)
 public class AccessibilityShortcutControllerTest {
     @Rule
-    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
-
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
     private static final String SERVICE_NAME_STRING = "fake.package/fake.service.name";
     private static final CharSequence PACKAGE_NAME_STRING = "Service name";
     private static final String SERVICE_NAME_SUMMARY = "Summary";
@@ -134,6 +135,7 @@
     private @Mock TextToSpeech mTextToSpeech;
     private @Mock Voice mVoice;
     private @Mock Ringtone mRingtone;
+    private @Captor ArgumentCaptor<List<String>> mListCaptor;
 
     private MockContentResolver mContentResolver;
     private WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams();
@@ -418,6 +420,7 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
     public void testClickingDisableButtonInDialog_shouldClearShortcutId() throws Exception {
         configureShortcutEnabled(ENABLED_EXCEPT_LOCK_SCREEN);
         configureValidShortcutService();
@@ -431,6 +434,29 @@
                 captor.capture());
         captor.getValue().onClick(null, DialogInterface.BUTTON_POSITIVE);
 
+        verify(mAccessibilityManagerService).enableShortcutsForTargets(
+                eq(false), eq(HARDWARE), mListCaptor.capture(), anyInt());
+        assertThat(mListCaptor.getValue()).containsExactly(SERVICE_NAME_STRING);
+        assertThat(Settings.Secure.getInt(
+                mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN)).isEqualTo(
+                AccessibilityShortcutController.DialogStatus.NOT_SHOWN);
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+    public void testClickingDisableButtonInDialog_shouldClearShortcutId_old() throws Exception {
+        configureShortcutEnabled(ENABLED_EXCEPT_LOCK_SCREEN);
+        configureValidShortcutService();
+        Settings.Secure.putInt(mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN,
+                AccessibilityShortcutController.DialogStatus.NOT_SHOWN);
+        getController().performAccessibilityShortcut();
+
+        ArgumentCaptor<DialogInterface.OnClickListener> captor =
+                ArgumentCaptor.forClass(DialogInterface.OnClickListener.class);
+        verify(mAlertDialogBuilder).setPositiveButton(eq(R.string.accessibility_shortcut_off),
+                captor.capture());
+        captor.getValue().onClick(null, DialogInterface.BUTTON_POSITIVE);
+
         assertThat(
                 Settings.Secure.getString(mContentResolver, ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)
         ).isEmpty();
@@ -440,7 +466,8 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(Flags.FLAG_UPDATE_ALWAYS_ON_A11Y_SERVICE)
+    @EnableFlags(Flags.FLAG_UPDATE_ALWAYS_ON_A11Y_SERVICE)
+    @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
     public void turnOffVolumeShortcutForAlwaysOnA11yService_shouldTurnOffA11yService()
             throws Exception {
         configureApplicationTargetSdkVersion(Build.VERSION_CODES.R);
@@ -452,7 +479,8 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(Flags.FLAG_UPDATE_ALWAYS_ON_A11Y_SERVICE)
+    @EnableFlags(Flags.FLAG_UPDATE_ALWAYS_ON_A11Y_SERVICE)
+    @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
     public void turnOffVolumeShortcutForAlwaysOnA11yService_hasOtherTypesShortcut_shouldNotTurnOffA11yService()
             throws Exception {
         configureApplicationTargetSdkVersion(Build.VERSION_CODES.R);
@@ -499,6 +527,7 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
     public void testTurnOnDefaultA11yServiceInDialog_defaultServiceShortcutTurnsOn()
             throws Exception {
         configureShortcutEnabled(ENABLED_EXCEPT_LOCK_SCREEN);
@@ -513,15 +542,39 @@
                 captor.capture());
         captor.getValue().onClick(null, DialogInterface.BUTTON_NEGATIVE);
 
-        assertThat(
-                Settings.Secure.getString(mContentResolver,
-                        ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)).isEqualTo(SERVICE_NAME_STRING);
+        verify(mAccessibilityManagerService).enableShortcutsForTargets(
+                eq(true), eq(HARDWARE), mListCaptor.capture(), anyInt());
+        assertThat(mListCaptor.getValue()).containsExactly(SERVICE_NAME_STRING);
         assertThat(Settings.Secure.getInt(
                 mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN)).isEqualTo(
                 AccessibilityShortcutController.DialogStatus.SHOWN);
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+    public void testTurnOnDefaultA11yServiceInDialog_defaultServiceShortcutTurnsOn_old()
+            throws Exception {
+        configureShortcutEnabled(ENABLED_EXCEPT_LOCK_SCREEN);
+        configureDefaultAccessibilityService();
+        Settings.Secure.putInt(mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN,
+                AccessibilityShortcutController.DialogStatus.NOT_SHOWN);
+        getController().performAccessibilityShortcut();
+
+        ArgumentCaptor<DialogInterface.OnClickListener> captor =
+                ArgumentCaptor.forClass(DialogInterface.OnClickListener.class);
+        verify(mAlertDialogBuilder).setNegativeButton(eq(R.string.accessibility_shortcut_on),
+                captor.capture());
+        captor.getValue().onClick(null, DialogInterface.BUTTON_NEGATIVE);
+
+        assertThat(Settings.Secure.getString(mContentResolver,
+                ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)).isEqualTo(SERVICE_NAME_STRING);
+        assertThat(Settings.Secure.getInt(
+                mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN)).isEqualTo(
+                AccessibilityShortcutController.DialogStatus.SHOWN);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
     public void testTurnOffDefaultA11yServiceInDialog_defaultServiceShortcutTurnsOff()
             throws Exception {
         configureShortcutEnabled(ENABLED_EXCEPT_LOCK_SCREEN);
@@ -536,9 +589,32 @@
                 captor.capture());
         captor.getValue().onClick(null, DialogInterface.BUTTON_POSITIVE);
 
-        assertThat(
-                Settings.Secure.getString(mContentResolver,
-                        ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)).isEmpty();
+        verify(mAccessibilityManagerService).enableShortcutsForTargets(
+                eq(false), eq(HARDWARE), mListCaptor.capture(), anyInt());
+        assertThat(mListCaptor.getValue()).isEmpty();
+        assertThat(Settings.Secure.getInt(
+                mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN)).isEqualTo(
+                AccessibilityShortcutController.DialogStatus.NOT_SHOWN);
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+    public void testTurnOffDefaultA11yServiceInDialog_defaultServiceShortcutTurnsOff_old()
+            throws Exception {
+        configureShortcutEnabled(ENABLED_EXCEPT_LOCK_SCREEN);
+        configureDefaultAccessibilityService();
+        Settings.Secure.putInt(mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN,
+                AccessibilityShortcutController.DialogStatus.NOT_SHOWN);
+        getController().performAccessibilityShortcut();
+
+        ArgumentCaptor<DialogInterface.OnClickListener> captor =
+                ArgumentCaptor.forClass(DialogInterface.OnClickListener.class);
+        verify(mAlertDialogBuilder).setPositiveButton(eq(R.string.accessibility_shortcut_off),
+                captor.capture());
+        captor.getValue().onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        assertThat(Settings.Secure.getString(mContentResolver,
+                ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)).isEmpty();
         assertThat(Settings.Secure.getInt(
                 mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN)).isEqualTo(
                 AccessibilityShortcutController.DialogStatus.NOT_SHOWN);
@@ -726,14 +802,14 @@
 
     private void configureNoShortcutService() throws Exception {
         when(mAccessibilityManagerService
-                .getAccessibilityShortcutTargets(ACCESSIBILITY_SHORTCUT_KEY))
+                .getAccessibilityShortcutTargets(HARDWARE))
                 .thenReturn(Collections.emptyList());
         Settings.Secure.putString(mContentResolver, ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, "");
     }
 
     private void configureValidShortcutService() throws Exception {
         when(mAccessibilityManagerService
-                .getAccessibilityShortcutTargets(ACCESSIBILITY_SHORTCUT_KEY))
+                .getAccessibilityShortcutTargets(HARDWARE))
                 .thenReturn(Collections.singletonList(SERVICE_NAME_STRING));
         Settings.Secure.putString(
                 mContentResolver, ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, SERVICE_NAME_STRING);
@@ -744,7 +820,7 @@
                 (ComponentName) AccessibilityShortcutController.getFrameworkShortcutFeaturesMap()
                         .keySet().toArray()[0];
         when(mAccessibilityManagerService
-                .getAccessibilityShortcutTargets(ACCESSIBILITY_SHORTCUT_KEY))
+                .getAccessibilityShortcutTargets(HARDWARE))
                 .thenReturn(Collections.singletonList(featureComponentName.flattenToString()));
         Settings.Secure.putString(mContentResolver, ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
                 featureComponentName.flattenToString());
@@ -806,7 +882,7 @@
 
     private void configureDefaultAccessibilityService() throws Exception {
         when(mAccessibilityManagerService
-                .getAccessibilityShortcutTargets(ACCESSIBILITY_SHORTCUT_KEY))
+                .getAccessibilityShortcutTargets(HARDWARE))
                 .thenReturn(Collections.singletonList(SERVICE_NAME_STRING));
 
         when(mResources.getString(R.string.config_defaultAccessibilityService)).thenReturn(
diff --git a/core/tests/coretests/src/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTargetTest.java b/core/tests/coretests/src/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTargetTest.java
index 69b6a9b7a..a14d8e0 100644
--- a/core/tests/coretests/src/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTargetTest.java
+++ b/core/tests/coretests/src/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTargetTest.java
@@ -19,8 +19,10 @@
 import static com.google.common.truth.Truth.assertThat;
 
 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.verify;
 import static org.mockito.Mockito.when;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
@@ -31,14 +33,19 @@
 import android.os.Handler;
 import android.os.RemoteException;
 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.provider.Settings;
 import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.Flags;
 import android.view.accessibility.IAccessibilityManager;
 
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.internal.accessibility.TestUtils;
+import com.android.internal.accessibility.common.ShortcutConstants;
 import com.android.internal.util.test.FakeSettingsProvider;
 import com.android.internal.util.test.FakeSettingsProviderRule;
 
@@ -46,10 +53,13 @@
 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.MockitoAnnotations;
 
 import java.util.Collections;
+import java.util.List;
 
 /**
  * Unit Tests for
@@ -58,9 +68,13 @@
 @RunWith(AndroidJUnit4.class)
 public class InvisibleToggleAccessibilityServiceTargetTest {
     @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+    @Rule
     public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
     @Mock
     private IAccessibilityManager mAccessibilityManagerService;
+    @Captor
+    private ArgumentCaptor<List<String>> mListCaptor;
 
     private static final String ALWAYS_ON_SERVICE_PACKAGE_LABEL = "always on a11y service";
     private static final String ALWAYS_ON_SERVICE_COMPONENT_NAME =
@@ -99,10 +113,36 @@
 
         mSut = new InvisibleToggleAccessibilityServiceTarget(
                 mContextSpy,
-                AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY, accessibilityServiceInfo);
+                ShortcutConstants.UserShortcutType.HARDWARE, accessibilityServiceInfo);
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+    public void onCheckedChanged_true_callA11yManagerToUpdateShortcuts() throws Exception {
+        mSut.onCheckedChanged(true);
+
+        verify(mAccessibilityManagerService).enableShortcutsForTargets(
+                eq(true),
+                eq(ShortcutConstants.UserShortcutType.HARDWARE),
+                mListCaptor.capture(),
+                anyInt());
+        assertThat(mListCaptor.getValue()).containsExactly(ALWAYS_ON_SERVICE_COMPONENT_NAME);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+    public void onCheckedChanged_false_callA11yManagerToUpdateShortcuts() throws Exception {
+        mSut.onCheckedChanged(false);
+        verify(mAccessibilityManagerService).enableShortcutsForTargets(
+                eq(false),
+                eq(ShortcutConstants.UserShortcutType.HARDWARE),
+                mListCaptor.capture(),
+                anyInt());
+        assertThat(mListCaptor.getValue()).containsExactly(ALWAYS_ON_SERVICE_COMPONENT_NAME);
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
     public void onCheckedChanged_turnOnShortcut_hasOtherShortcut_serviceKeepsOn() {
         enableA11yService(/* enable= */ true);
         addShortcutForA11yService(
@@ -115,6 +155,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
     public void onCheckedChanged_turnOnShortcut_noOtherShortcut_shouldTurnOnService() {
         enableA11yService(/* enable= */ false);
         addShortcutForA11yService(
@@ -127,6 +168,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
     public void onCheckedChanged_turnOffShortcut_hasOtherShortcut_serviceKeepsOn() {
         enableA11yService(/* enable= */ true);
         addShortcutForA11yService(
@@ -139,6 +181,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
     public void onCheckedChanged_turnOffShortcut_noOtherShortcut_shouldTurnOffService() {
         enableA11yService(/* enable= */ true);
         addShortcutForA11yService(
diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java
index 488f017..ff280555 100644
--- a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java
@@ -1258,7 +1258,8 @@
     @Test
     public void testTriggerFromMainProfile_inSingleUserMode_withWorkProfilePresent() {
         mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-                android.multiuser.Flags.FLAG_ALLOW_RESOLVER_SHEET_FOR_PRIVATE_SPACE);
+                android.multiuser.Flags.FLAG_ALLOW_RESOLVER_SHEET_FOR_PRIVATE_SPACE,
+                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
         markWorkProfileUserAvailable();
         setTabOwnerUserHandleForLaunch(PERSONAL_USER_HANDLE);
         Intent sendIntent = createSendImageIntent();
@@ -1281,7 +1282,8 @@
     @Test
     public void testTriggerFromWorkProfile_inSingleUserMode() {
         mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-                android.multiuser.Flags.FLAG_ALLOW_RESOLVER_SHEET_FOR_PRIVATE_SPACE);
+                android.multiuser.Flags.FLAG_ALLOW_RESOLVER_SHEET_FOR_PRIVATE_SPACE,
+                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
         markWorkProfileUserAvailable();
         setTabOwnerUserHandleForLaunch(sOverrides.workProfileUserHandle);
         Intent sendIntent = createSendImageIntent();
diff --git a/core/tests/coretests/src/com/android/internal/net/ConnectivityBlobStoreTest.java b/core/tests/coretests/src/com/android/internal/net/ConnectivityBlobStoreTest.java
index 68545cf..ad4ccc9 100644
--- a/core/tests/coretests/src/com/android/internal/net/ConnectivityBlobStoreTest.java
+++ b/core/tests/coretests/src/com/android/internal/net/ConnectivityBlobStoreTest.java
@@ -153,4 +153,41 @@
         final String[] actual = connectivityBlobStore.list(TEST_NAME /* prefix */);
         assertArrayEquals(expected, actual);
     }
+
+    @Test
+    public void testList_underscoreInPrefix() throws Exception {
+        final String prefix = TEST_NAME + "_";
+        final String[] unsortedNames = new String[] {
+                prefix + "000",
+                TEST_NAME + "123",
+        };
+        // The '_' in the prefix should not be treated as a wildcard so the only match is "000".
+        final String[] expected = new String[] {"000"};
+        final ConnectivityBlobStore connectivityBlobStore = createConnectivityBlobStore();
+
+        for (int i = 0; i < unsortedNames.length; i++) {
+            assertTrue(connectivityBlobStore.put(unsortedNames[i], TEST_BLOB));
+        }
+        final String[] actual = connectivityBlobStore.list(prefix);
+        assertArrayEquals(expected, actual);
+    }
+
+    @Test
+    public void testList_percentInPrefix() throws Exception {
+        final String prefix = "%" + TEST_NAME + "%";
+        final String[] unsortedNames = new String[] {
+                TEST_NAME + "12345",
+                prefix + "0",
+                "abc" + TEST_NAME + "987",
+        };
+        // The '%' in the prefix should not be treated as a wildcard so the only match is "0".
+        final String[] expected = new String[] {"0"};
+        final ConnectivityBlobStore connectivityBlobStore = createConnectivityBlobStore();
+
+        for (int i = 0; i < unsortedNames.length; i++) {
+            assertTrue(connectivityBlobStore.put(unsortedNames[i], TEST_BLOB));
+        }
+        final String[] actual = connectivityBlobStore.list(prefix);
+        assertArrayEquals(expected, actual);
+    }
 }
diff --git a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
index b9841ff..82251b8 100644
--- a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
+++ b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
@@ -182,7 +182,8 @@
 
         WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
         wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check
-
+        wmlp.setFrameRatePowerSavingsBalanced(
+                    mPhoneWindow.getAttributes().isFrameRatePowerSavingsBalanced());
         sInstrumentation.runOnMainSync(() -> {
             WindowManager wm = mContext.getSystemService(WindowManager.class);
             wm.addView(decorView, wmlp);
@@ -203,7 +204,8 @@
 
         WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
         wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check
-
+        wmlp.setFrameRatePowerSavingsBalanced(
+                mPhoneWindow.getAttributes().isFrameRatePowerSavingsBalanced());
         sInstrumentation.runOnMainSync(() -> {
             WindowManager wm = mContext.getSystemService(WindowManager.class);
             wm.addView(decorView, wmlp);
diff --git a/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateInfoTest.java b/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateInfoTest.java
index 0897726..cf7c549 100644
--- a/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateInfoTest.java
+++ b/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateInfoTest.java
@@ -38,6 +38,7 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
@@ -73,8 +74,8 @@
 
     @Test
     public void create() {
-        final List<DeviceState> supportedStates = List.of(DEVICE_STATE_0, DEVICE_STATE_1,
-                DEVICE_STATE_2);
+        final ArrayList<DeviceState> supportedStates = new ArrayList<>(
+                List.of(DEVICE_STATE_0, DEVICE_STATE_1, DEVICE_STATE_2));
         final DeviceState baseState = DEVICE_STATE_0;
         final DeviceState currentState = DEVICE_STATE_2;
 
@@ -87,8 +88,8 @@
 
     @Test
     public void equals() {
-        final List<DeviceState> supportedStates = List.of(DEVICE_STATE_0, DEVICE_STATE_1,
-                DEVICE_STATE_2);
+        final ArrayList<DeviceState> supportedStates = new ArrayList<>(
+                List.of(DEVICE_STATE_0, DEVICE_STATE_1, DEVICE_STATE_2));
         final DeviceState baseState = DEVICE_STATE_0;
         final DeviceState currentState = DEVICE_STATE_2;
 
@@ -100,15 +101,14 @@
         Assert.assertEquals(info, sameInfo);
 
         final DeviceStateInfo differentInfo = new DeviceStateInfo(
-                List.of(DEVICE_STATE_0, DEVICE_STATE_2), baseState,
-                currentState);
+                new ArrayList<>(List.of(DEVICE_STATE_0, DEVICE_STATE_2)), baseState, currentState);
         assertNotEquals(info, differentInfo);
     }
 
     @Test
     public void diff_sameObject() {
-        final List<DeviceState> supportedStates = List.of(DEVICE_STATE_0, DEVICE_STATE_1,
-                DEVICE_STATE_2);
+        final ArrayList<DeviceState> supportedStates = new ArrayList<>(
+                List.of(DEVICE_STATE_0, DEVICE_STATE_1, DEVICE_STATE_2));
         final DeviceState baseState = DEVICE_STATE_0;
         final DeviceState currentState = DEVICE_STATE_2;
 
@@ -118,10 +118,10 @@
 
     @Test
     public void diff_differentSupportedStates() {
-        final DeviceStateInfo info = new DeviceStateInfo(List.of(DEVICE_STATE_1), DEVICE_STATE_0,
-                DEVICE_STATE_0);
-        final DeviceStateInfo otherInfo = new DeviceStateInfo(List.of(DEVICE_STATE_2),
+        final DeviceStateInfo info = new DeviceStateInfo(new ArrayList<>(List.of(DEVICE_STATE_1)),
                 DEVICE_STATE_0, DEVICE_STATE_0);
+        final DeviceStateInfo otherInfo = new DeviceStateInfo(
+                new ArrayList<>(List.of(DEVICE_STATE_2)), DEVICE_STATE_0, DEVICE_STATE_0);
         final int diff = info.diff(otherInfo);
         assertTrue((diff & DeviceStateInfo.CHANGED_SUPPORTED_STATES) > 0);
         assertFalse((diff & DeviceStateInfo.CHANGED_BASE_STATE) > 0);
@@ -130,10 +130,10 @@
 
     @Test
     public void diff_differentNonOverrideState() {
-        final DeviceStateInfo info = new DeviceStateInfo(List.of(DEVICE_STATE_1), DEVICE_STATE_1,
-                DEVICE_STATE_0);
-        final DeviceStateInfo otherInfo = new DeviceStateInfo(List.of(DEVICE_STATE_1),
-                DEVICE_STATE_2, DEVICE_STATE_0);
+        final DeviceStateInfo info = new DeviceStateInfo(new ArrayList<>(List.of(DEVICE_STATE_1)),
+                DEVICE_STATE_1, DEVICE_STATE_0);
+        final DeviceStateInfo otherInfo = new DeviceStateInfo(
+                new ArrayList<>(List.of(DEVICE_STATE_1)), DEVICE_STATE_2, DEVICE_STATE_0);
         final int diff = info.diff(otherInfo);
         assertFalse((diff & DeviceStateInfo.CHANGED_SUPPORTED_STATES) > 0);
         assertTrue((diff & DeviceStateInfo.CHANGED_BASE_STATE) > 0);
@@ -142,10 +142,10 @@
 
     @Test
     public void diff_differentState() {
-        final DeviceStateInfo info = new DeviceStateInfo(List.of(DEVICE_STATE_1), DEVICE_STATE_0,
-                DEVICE_STATE_1);
-        final DeviceStateInfo otherInfo = new DeviceStateInfo(List.of(DEVICE_STATE_1),
-                DEVICE_STATE_0, DEVICE_STATE_2);
+        final DeviceStateInfo info = new DeviceStateInfo(new ArrayList<>(List.of(DEVICE_STATE_1)),
+                DEVICE_STATE_0, DEVICE_STATE_1);
+        final DeviceStateInfo otherInfo = new DeviceStateInfo(
+                new ArrayList<>(List.of(DEVICE_STATE_1)), DEVICE_STATE_0, DEVICE_STATE_2);
         final int diff = info.diff(otherInfo);
         assertFalse((diff & DeviceStateInfo.CHANGED_SUPPORTED_STATES) > 0);
         assertFalse((diff & DeviceStateInfo.CHANGED_BASE_STATE) > 0);
@@ -154,8 +154,8 @@
 
     @Test
     public void writeToParcel() {
-        final List<DeviceState> supportedStates = List.of(DEVICE_STATE_0, DEVICE_STATE_1,
-                DEVICE_STATE_2);
+        final ArrayList<DeviceState> supportedStates = new ArrayList<>(
+                List.of(DEVICE_STATE_0, DEVICE_STATE_1, DEVICE_STATE_2));
         final DeviceState nonOverrideState = DEVICE_STATE_0;
         final DeviceState state = DEVICE_STATE_2;
         final DeviceStateInfo originalInfo =
diff --git a/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateManagerGlobalTest.java b/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateManagerGlobalTest.java
index ee238c0..f4d3631 100644
--- a/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateManagerGlobalTest.java
+++ b/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateManagerGlobalTest.java
@@ -40,6 +40,7 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -276,7 +277,7 @@
                     new DeviceState.Configuration.Builder(mergedBaseState, "" /* name */).build());
             final DeviceState state = new DeviceState(
                     new DeviceState.Configuration.Builder(mergedState, "" /* name */).build());
-            return new DeviceStateInfo(mSupportedDeviceStates, baseState, state);
+            return new DeviceStateInfo(new ArrayList<>(mSupportedDeviceStates), baseState, state);
         }
 
         private void notifyDeviceStateInfoChanged() {
diff --git a/data/etc/com.android.settings.xml b/data/etc/com.android.settings.xml
index 6bdd291..cd68503 100644
--- a/data/etc/com.android.settings.xml
+++ b/data/etc/com.android.settings.xml
@@ -67,5 +67,6 @@
         <permission name="android.permission.READ_SAFETY_CENTER_STATUS" />
         <permission name="android.permission.SEND_SAFETY_CENTER_UPDATE" />
         <permission name="android.permission.LIST_ENABLED_CREDENTIAL_PROVIDERS" />
+        <permission name="android.permission.SATELLITE_COMMUNICATION" />
     </privapp-permissions>
 </permissions>
diff --git a/data/etc/core.protolog.pb b/data/etc/core.protolog.pb
index e1670be..97147a0 100644
--- a/data/etc/core.protolog.pb
+++ b/data/etc/core.protolog.pb
Binary files differ
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index ea3235b..fc4277e 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -42,6 +42,10 @@
         <permission name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"/>
     </privapp-permissions>
 
+    <privapp-permissions package="com.android.credentialmanager">
+        <permission name="android.permission.SET_BIOMETRIC_DIALOG_ADVANCED" />
+    </privapp-permissions>
+
     <privapp-permissions package="com.android.externalstorage">
         <permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
         <permission name="android.permission.WRITE_MEDIA_STORAGE"/>
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index d410d5f..6cf12de 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -709,18 +709,6 @@
       "group": "WM_DEBUG_CONFIGURATION",
       "at": "com\/android\/server\/wm\/ActivityTaskManagerService.java"
     },
-    "2959074735946674755": {
-      "message": "Trying to update display configuration for system\/invalid process.",
-      "level": "WARN",
-      "group": "WM_DEBUG_CONFIGURATION",
-      "at": "com\/android\/server\/wm\/ActivityTaskManagerService.java"
-    },
-    "5668810920995272206": {
-      "message": "Trying to update display configuration for invalid process, pid=%d",
-      "level": "WARN",
-      "group": "WM_DEBUG_CONFIGURATION",
-      "at": "com\/android\/server\/wm\/ActivityTaskManagerService.java"
-    },
     "-1123414663662718691": {
       "message": "setVr2dDisplayId called for: %d",
       "level": "DEBUG",
@@ -3469,6 +3457,12 @@
       "group": "WM_DEBUG_WALLPAPER",
       "at": "com\/android\/server\/wm\/WallpaperController.java"
     },
+    "257349083882992098": {
+      "message": "updateWallpaperTokens requestedVisibility=%b on keyguardLocked=%b",
+      "level": "VERBOSE",
+      "group": "WM_DEBUG_WALLPAPER",
+      "at": "com\/android\/server\/wm\/WallpaperController.java"
+    },
     "7408402065665963407": {
       "message": "Wallpaper at display %d - visibility: %b, keyguardLocked: %b",
       "level": "VERBOSE",
diff --git a/data/keyboards/Generic.kl b/data/keyboards/Generic.kl
index f9347ee..e8b4104 100644
--- a/data/keyboards/Generic.kl
+++ b/data/keyboards/Generic.kl
@@ -424,12 +424,14 @@
 key 582   VOICE_ASSIST
 # Linux KEY_ASSISTANT
 key 583   ASSIST
+key 585   EMOJI_PICKER
 key 656   MACRO_1
 key 657   MACRO_2
 key 658   MACRO_3
 key 659   MACRO_4
 
 # Keys defined by HID usages
+key usage 0x0c0065 SCREENSHOT                FALLBACK_USAGE_MAPPING
 key usage 0x0c0067 WINDOW                    FALLBACK_USAGE_MAPPING
 key usage 0x0c006F BRIGHTNESS_UP             FALLBACK_USAGE_MAPPING
 key usage 0x0c0070 BRIGHTNESS_DOWN           FALLBACK_USAGE_MAPPING
diff --git a/graphics/java/Android.bp b/graphics/java/Android.bp
index ece453d..f4abd0a 100644
--- a/graphics/java/Android.bp
+++ b/graphics/java/Android.bp
@@ -11,6 +11,7 @@
 aconfig_declarations {
     name: "framework_graphics_flags",
     package: "com.android.graphics.flags",
+    container: "system",
     srcs: ["android/framework_graphics.aconfig"],
 }
 
diff --git a/graphics/java/android/framework_graphics.aconfig b/graphics/java/android/framework_graphics.aconfig
index 1e41b4d..4ab09eb 100644
--- a/graphics/java/android/framework_graphics.aconfig
+++ b/graphics/java/android/framework_graphics.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.graphics.flags"
+container: "system"
 
 flag {
      name: "exact_compute_bounds"
@@ -14,4 +15,4 @@
      namespace: "core_graphics"
      description: "Feature flag for YUV image compress to Ultra HDR."
      bug: "308978825"
-}
\ No newline at end of file
+}
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 250362b..319f115 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -41,12 +41,15 @@
 import libcore.util.NativeAllocationRegistry;
 
 import java.io.IOException;
+import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
 import java.lang.ref.WeakReference;
 import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.IntBuffer;
 import java.nio.ShortBuffer;
+import java.util.ArrayList;
+import java.util.WeakHashMap;
 
 public final class Bitmap implements Parcelable {
     private static final String TAG = "Bitmap";
@@ -120,6 +123,11 @@
     }
 
     /**
+     * @hide
+     */
+    private static final WeakHashMap<Bitmap, Void> sAllBitmaps = new WeakHashMap<>();
+
+    /**
      * Private constructor that must receive an already allocated native bitmap
      * int (pointer).
      */
@@ -162,6 +170,9 @@
                     Bitmap.class.getClassLoader(), nativeGetNativeFinalizer(), allocationByteCount);
         }
         registry.registerNativeAllocation(this, nativeBitmap);
+        synchronized (Bitmap.class) {
+          sAllBitmaps.put(this, null);
+        }
     }
 
     /**
@@ -1510,6 +1521,86 @@
     }
 
     /**
+     * @hide
+     */
+    private static final class DumpData {
+        private int count;
+        private int format;
+        private long[] natives;
+        private byte[][] buffers;
+        private int max;
+
+        public DumpData(@NonNull CompressFormat format, int max) {
+            this.max = max;
+            this.format = format.nativeInt;
+            this.natives = new long[max];
+            this.buffers = new byte[max][];
+            this.count = 0;
+        }
+
+        public void add(long nativePtr, byte[] buffer) {
+            natives[count] = nativePtr;
+            buffers[count] = buffer;
+            count = (count >= max) ? max : count + 1;
+        }
+
+        public int size() {
+            return count;
+        }
+    }
+
+    /**
+     * @hide
+     */
+    private static DumpData dumpData = null;
+
+
+    /**
+     * @hide
+     *
+     * Dump all the bitmaps with their contents compressed into dumpData
+     *
+     * @param format  format of the compressed image, null to clear dump data
+     */
+    public static void dumpAll(@Nullable String format) {
+        if (format == null) {
+            /* release the dump data */
+            dumpData = null;
+            return;
+        }
+        final CompressFormat fmt;
+        if (format.equals("jpg") || format.equals("jpeg")) {
+            fmt = CompressFormat.JPEG;
+        } else if (format.equals("png")) {
+            fmt = CompressFormat.PNG;
+        } else if (format.equals("webp")) {
+            fmt = CompressFormat.WEBP_LOSSLESS;
+        } else {
+            Log.w(TAG, "No bitmaps dumped: unrecognized format " + format);
+            return;
+        }
+
+        final ArrayList<Bitmap> allBitmaps;
+        synchronized (Bitmap.class) {
+          allBitmaps = new ArrayList<>(sAllBitmaps.size());
+          for (Bitmap bitmap : sAllBitmaps.keySet()) {
+            if (bitmap != null && !bitmap.isRecycled()) {
+              allBitmaps.add(bitmap);
+            }
+          }
+        }
+
+        dumpData = new DumpData(fmt, allBitmaps.size());
+        for (Bitmap bitmap : allBitmaps) {
+            ByteArrayOutputStream bas = new ByteArrayOutputStream();
+            if (bitmap.compress(fmt, 90, bas)) {
+                dumpData.add(bitmap.getNativeInstance(), bas.toByteArray());
+            }
+        }
+        Log.i(TAG, dumpData.size() + "/" + allBitmaps.size() + " bitmaps dumped");
+    }
+
+    /**
      * Number of bytes of temp storage we use for communicating between the
      * native compressor and the java OutputStream.
      */
diff --git a/graphics/java/android/graphics/fonts/FontFamily.java b/graphics/java/android/graphics/fonts/FontFamily.java
index 685fd82..199e929 100644
--- a/graphics/java/android/graphics/fonts/FontFamily.java
+++ b/graphics/java/android/graphics/fonts/FontFamily.java
@@ -140,7 +140,11 @@
          * value of the supported `wght`axis, the maximum supported `wght` value is used. The weight
          * value of the font is ignored.
          *
-         * If none of the above conditions are met, this function return {@code null}.
+         * If none of the above conditions are met, the provided font files cannot be used for
+         * variable font family and this function returns {@code null}. Even if this function
+         * returns {@code null}, you can still use {@link #build()} method for creating FontFamily
+         * instance with manually specifying variation settings by using
+         * {@link Font.Builder#setFontVariationSettings(String)}.
          *
          * @return A variable font family. null if a variable font cannot be built from the given
          *         fonts.
diff --git a/keystore/java/android/security/AndroidKeyStoreMaintenance.java b/keystore/java/android/security/AndroidKeyStoreMaintenance.java
index efbbfc2..24aea37 100644
--- a/keystore/java/android/security/AndroidKeyStoreMaintenance.java
+++ b/keystore/java/android/security/AndroidKeyStoreMaintenance.java
@@ -229,4 +229,24 @@
                     "Keystore error while trying to get apps affected by SID.");
         }
     }
+
+    /**
+    * Deletes all keys in all KeyMint devices.
+    * Called by RecoverySystem before rebooting to recovery in order to delete all KeyMint keys,
+    * including synthetic password protector keys (used by LockSettingsService), as well as keys
+    * protecting DE and metadata encryption keys (used by vold). This ensures that FBE-encrypted
+    * data is unrecoverable even if the data wipe in recovery is interrupted or skipped.
+    */
+    public static void deleteAllKeys() throws KeyStoreException {
+        StrictMode.noteDiskWrite();
+        try {
+            getService().deleteAllKeys();
+        } catch (RemoteException | NullPointerException e) {
+            throw new KeyStoreException(SYSTEM_ERROR,
+                    "Failure to connect to Keystore while trying to delete all keys.");
+        } catch (ServiceSpecificException e) {
+            throw new KeyStoreException(e.errorCode,
+                    "Keystore error while trying to delete all keys.");
+        }
+    }
 }
diff --git a/keystore/java/android/security/Authorization.java b/keystore/java/android/security/Authorization.java
deleted file mode 100644
index 6404c4b..0000000
--- a/keystore/java/android/security/Authorization.java
+++ /dev/null
@@ -1,140 +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 android.security;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.hardware.biometrics.BiometricConstants;
-import android.hardware.security.keymint.HardwareAuthToken;
-import android.hardware.security.keymint.HardwareAuthenticatorType;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.ServiceSpecificException;
-import android.os.StrictMode;
-import android.security.authorization.IKeystoreAuthorization;
-import android.system.keystore2.ResponseCode;
-import android.util.Log;
-
-/**
- * @hide This is the client side for IKeystoreAuthorization AIDL.
- * It shall only be used by biometric authentication providers and Gatekeeper.
- */
-public class Authorization {
-    private static final String TAG = "KeystoreAuthorization";
-
-    public static final int SYSTEM_ERROR = ResponseCode.SYSTEM_ERROR;
-
-    /**
-     * @return an instance of IKeystoreAuthorization
-     */
-    public static IKeystoreAuthorization getService() {
-        return IKeystoreAuthorization.Stub.asInterface(
-                    ServiceManager.checkService("android.security.authorization"));
-    }
-
-    /**
-     * Adds an auth token to keystore2.
-     *
-     * @param authToken created by Android authenticators.
-     * @return 0 if successful or {@code ResponseCode.SYSTEM_ERROR}.
-     */
-    public static int addAuthToken(@NonNull HardwareAuthToken authToken) {
-        StrictMode.noteSlowCall("addAuthToken");
-        try {
-            getService().addAuthToken(authToken);
-            return 0;
-        } catch (RemoteException | NullPointerException e) {
-            Log.w(TAG, "Can not connect to keystore", e);
-            return SYSTEM_ERROR;
-        } catch (ServiceSpecificException e) {
-            return e.errorCode;
-        }
-    }
-
-    /**
-     * Add an auth token to Keystore 2.0 in the legacy serialized auth token format.
-     * @param authToken
-     * @return 0 if successful or a {@code ResponseCode}.
-     */
-    public static int addAuthToken(@NonNull byte[] authToken) {
-        return addAuthToken(AuthTokenUtils.toHardwareAuthToken(authToken));
-    }
-
-    /**
-     * Tells Keystore that the device is now unlocked for a user.
-     *
-     * @param userId - the user's Android user ID
-     * @param password - a secret derived from the user's synthetic password, if the unlock method
-     *                   is LSKF (or equivalent) and thus has made the synthetic password available
-     * @return 0 if successful or a {@code ResponseCode}.
-     */
-    public static int onDeviceUnlocked(int userId, @Nullable byte[] password) {
-        StrictMode.noteDiskWrite();
-        try {
-            getService().onDeviceUnlocked(userId, password);
-            return 0;
-        } catch (RemoteException | NullPointerException e) {
-            Log.w(TAG, "Can not connect to keystore", e);
-            return SYSTEM_ERROR;
-        } catch (ServiceSpecificException e) {
-            return e.errorCode;
-        }
-    }
-
-    /**
-     * Tells Keystore that the device is now locked for a user.
-     *
-     * @param userId - the user's Android user ID
-     * @param unlockingSids - list of biometric SIDs with which the device may be unlocked again
-     * @param weakUnlockEnabled - true if non-strong biometric or trust agent unlock is enabled
-     * @return 0 if successful or a {@code ResponseCode}.
-     */
-    public static int onDeviceLocked(int userId, @NonNull long[] unlockingSids,
-            boolean weakUnlockEnabled) {
-        StrictMode.noteDiskWrite();
-        try {
-            getService().onDeviceLocked(userId, unlockingSids, weakUnlockEnabled);
-            return 0;
-        } catch (RemoteException | NullPointerException e) {
-            Log.w(TAG, "Can not connect to keystore", e);
-            return SYSTEM_ERROR;
-        } catch (ServiceSpecificException e) {
-            return e.errorCode;
-        }
-    }
-
-    /**
-     * Gets the last authentication time of the given user and authenticators.
-     *
-     * @param userId user id
-     * @param authenticatorTypes an array of {@link HardwareAuthenticatorType}.
-     * @return the last authentication time or
-     * {@link BiometricConstants#BIOMETRIC_NO_AUTHENTICATION}.
-     */
-    public static long getLastAuthenticationTime(
-            long userId, @HardwareAuthenticatorType int[] authenticatorTypes) {
-        try {
-            return getService().getLastAuthTime(userId, authenticatorTypes);
-        } catch (RemoteException | NullPointerException e) {
-            Log.w(TAG, "Can not connect to keystore", e);
-            return BiometricConstants.BIOMETRIC_NO_AUTHENTICATION;
-        } catch (ServiceSpecificException e) {
-            return BiometricConstants.BIOMETRIC_NO_AUTHENTICATION;
-        }
-    }
-
-}
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index 2cac2e1..2f2215f 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -17,7 +17,6 @@
 package android.security;
 
 import android.compat.annotation.UnsupportedAppUsage;
-import android.os.StrictMode;
 
 /**
  * This class provides some constants and helper methods related to Android's Keystore service.
@@ -38,17 +37,4 @@
     public static KeyStore getInstance() {
         return KEY_STORE;
     }
-
-    /**
-     * Add an authentication record to the keystore authorization table.
-     *
-     * @param authToken The packed bytes of a hw_auth_token_t to be provided to keymaster.
-     * @return 0 on success, otherwise an error value corresponding to a
-     * {@code KeymasterDefs.KM_ERROR_} value or {@code KeyStore} ResponseCode.
-     */
-    public int addAuthToken(byte[] authToken) {
-        StrictMode.noteDiskWrite();
-
-        return Authorization.addAuthToken(authToken);
-    }
 }
diff --git a/keystore/java/android/security/KeyStoreAuthorization.java b/keystore/java/android/security/KeyStoreAuthorization.java
new file mode 100644
index 0000000..14d715f
--- /dev/null
+++ b/keystore/java/android/security/KeyStoreAuthorization.java
@@ -0,0 +1,149 @@
+/*
+ * 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 android.security;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.hardware.biometrics.BiometricConstants;
+import android.hardware.security.keymint.HardwareAuthToken;
+import android.hardware.security.keymint.HardwareAuthenticatorType;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.ServiceSpecificException;
+import android.os.StrictMode;
+import android.security.authorization.IKeystoreAuthorization;
+import android.system.keystore2.ResponseCode;
+import android.util.Log;
+
+/**
+ * @hide This is the client side for IKeystoreAuthorization AIDL.
+ * It shall only be used by biometric authentication providers and Gatekeeper.
+ */
+public class KeyStoreAuthorization {
+    private static final String TAG = "KeyStoreAuthorization";
+
+    public static final int SYSTEM_ERROR = ResponseCode.SYSTEM_ERROR;
+
+    private static final KeyStoreAuthorization sInstance = new KeyStoreAuthorization();
+
+    public static KeyStoreAuthorization getInstance() {
+        return sInstance;
+    }
+
+    /**
+     * @return an instance of IKeystoreAuthorization
+     */
+    private IKeystoreAuthorization getService() {
+        return IKeystoreAuthorization.Stub.asInterface(
+                    ServiceManager.checkService("android.security.authorization"));
+    }
+
+    /**
+     * Adds an auth token to keystore2.
+     *
+     * @param authToken created by Android authenticators.
+     * @return 0 if successful or {@code ResponseCode.SYSTEM_ERROR}.
+     */
+    public int addAuthToken(@NonNull HardwareAuthToken authToken) {
+        StrictMode.noteSlowCall("addAuthToken");
+        try {
+            getService().addAuthToken(authToken);
+            return 0;
+        } catch (RemoteException | NullPointerException e) {
+            Log.w(TAG, "Can not connect to keystore", e);
+            return SYSTEM_ERROR;
+        } catch (ServiceSpecificException e) {
+            return e.errorCode;
+        }
+    }
+
+    /**
+     * Add an auth token to Keystore 2.0 in the legacy serialized auth token format.
+     * @param authToken
+     * @return 0 if successful or a {@code ResponseCode}.
+     */
+    public int addAuthToken(@NonNull byte[] authToken) {
+        return addAuthToken(AuthTokenUtils.toHardwareAuthToken(authToken));
+    }
+
+    /**
+     * Tells Keystore that the device is now unlocked for a user.
+     *
+     * @param userId - the user's Android user ID
+     * @param password - a secret derived from the user's synthetic password, if the unlock method
+     *                   is LSKF (or equivalent) and thus has made the synthetic password available
+     * @return 0 if successful or a {@code ResponseCode}.
+     */
+    public int onDeviceUnlocked(int userId, @Nullable byte[] password) {
+        StrictMode.noteDiskWrite();
+        try {
+            getService().onDeviceUnlocked(userId, password);
+            return 0;
+        } catch (RemoteException | NullPointerException e) {
+            Log.w(TAG, "Can not connect to keystore", e);
+            return SYSTEM_ERROR;
+        } catch (ServiceSpecificException e) {
+            return e.errorCode;
+        }
+    }
+
+    /**
+     * Tells Keystore that the device is now locked for a user.
+     *
+     * @param userId - the user's Android user ID
+     * @param unlockingSids - list of biometric SIDs with which the device may be unlocked again
+     * @param weakUnlockEnabled - true if non-strong biometric or trust agent unlock is enabled
+     * @return 0 if successful or a {@code ResponseCode}.
+     */
+    public int onDeviceLocked(int userId, @NonNull long[] unlockingSids,
+            boolean weakUnlockEnabled) {
+        StrictMode.noteDiskWrite();
+        try {
+            getService().onDeviceLocked(userId, unlockingSids, weakUnlockEnabled);
+            return 0;
+        } catch (RemoteException | NullPointerException e) {
+            Log.w(TAG, "Can not connect to keystore", e);
+            return SYSTEM_ERROR;
+        } catch (ServiceSpecificException e) {
+            return e.errorCode;
+        }
+    }
+
+    /**
+     * Gets the last authentication time of the given user and authenticators.
+     *
+     * @param userId user id
+     * @param authenticatorTypes an array of {@link HardwareAuthenticatorType}.
+     * @return the last authentication time or
+     * {@link BiometricConstants#BIOMETRIC_NO_AUTHENTICATION}.
+     */
+    public long getLastAuthTime(long userId, @HardwareAuthenticatorType int[] authenticatorTypes) {
+        try {
+            return getService().getLastAuthTime(userId, authenticatorTypes);
+        } catch (RemoteException | NullPointerException e) {
+            Log.w(TAG, "Error getting last auth time: " + e);
+            return BiometricConstants.BIOMETRIC_NO_AUTHENTICATION;
+        } catch (ServiceSpecificException e) {
+            // This is returned when the feature flag test fails in keystore2
+            if (e.errorCode == ResponseCode.PERMISSION_DENIED) {
+                throw new UnsupportedOperationException();
+            }
+            return BiometricConstants.BIOMETRIC_NO_AUTHENTICATION;
+        }
+    }
+
+}
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/DividerPresenter.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/DividerPresenter.java
index cae232e..b8ac191 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/DividerPresenter.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/DividerPresenter.java
@@ -23,9 +23,11 @@
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
 import static android.window.TaskFragmentOperation.OP_TYPE_CREATE_OR_MOVE_TASK_FRAGMENT_DECOR_SURFACE;
 import static android.window.TaskFragmentOperation.OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE;
+import static android.window.TaskFragmentOperation.OP_TYPE_SET_DECOR_SURFACE_BOOSTED;
 
 import static androidx.window.extensions.embedding.DividerAttributes.RATIO_UNSET;
 import static androidx.window.extensions.embedding.DividerAttributes.WIDTH_UNSET;
+import static androidx.window.extensions.embedding.SplitAttributesHelper.isReversedLayout;
 import static androidx.window.extensions.embedding.SplitPresenter.CONTAINER_POSITION_BOTTOM;
 import static androidx.window.extensions.embedding.SplitPresenter.CONTAINER_POSITION_LEFT;
 import static androidx.window.extensions.embedding.SplitPresenter.CONTAINER_POSITION_RIGHT;
@@ -45,8 +47,10 @@
 import android.os.IBinder;
 import android.util.TypedValue;
 import android.view.Gravity;
+import android.view.MotionEvent;
 import android.view.SurfaceControl;
 import android.view.SurfaceControlViewHost;
+import android.view.View;
 import android.view.WindowManager;
 import android.view.WindowlessWindowManager;
 import android.widget.FrameLayout;
@@ -56,23 +60,30 @@
 import android.window.TaskFragmentParentInfo;
 import android.window.WindowContainerTransaction;
 
+import androidx.annotation.GuardedBy;
 import androidx.annotation.IdRes;
 import androidx.annotation.NonNull;
+import androidx.window.extensions.core.util.function.Consumer;
 
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.window.flags.Flags;
 
 import java.util.Objects;
+import java.util.concurrent.Executor;
 
 /**
  * Manages the rendering and interaction of the divider.
  */
-class DividerPresenter {
+class DividerPresenter implements View.OnTouchListener {
     private static final String WINDOW_NAME = "AE Divider";
+    private static final int VEIL_LAYER = 0;
+    private static final int DIVIDER_LAYER = 1;
 
     // TODO(b/327067596) Update based on UX guidance.
     private static final Color DEFAULT_DIVIDER_COLOR = Color.valueOf(Color.BLACK);
+    private static final Color DEFAULT_PRIMARY_VEIL_COLOR = Color.valueOf(Color.BLACK);
+    private static final Color DEFAULT_SECONDARY_VEIL_COLOR = Color.valueOf(Color.GRAY);
     @VisibleForTesting
     static final float DEFAULT_MIN_RATIO = 0.35f;
     @VisibleForTesting
@@ -80,11 +91,23 @@
     @VisibleForTesting
     static final int DEFAULT_DIVIDER_WIDTH_DP = 24;
 
+    private final int mTaskId;
+
+    @NonNull
+    private final Object mLock = new Object();
+
+    @NonNull
+    private final DragEventCallback mDragEventCallback;
+
+    @NonNull
+    private final Executor mCallbackExecutor;
+
     /**
      * The {@link Properties} of the divider. This field is {@code null} when no divider should be
      * drawn, e.g. when the split doesn't have {@link DividerAttributes} or when the decor surface
      * is not available.
      */
+    @GuardedBy("mLock")
     @Nullable
     @VisibleForTesting
     Properties mProperties;
@@ -94,6 +117,7 @@
      * drawn, i.e. when {@link #mProperties} is {@code null}. The {@link Renderer} is recreated or
      * updated when {@link #mProperties} is changed.
      */
+    @GuardedBy("mLock")
     @Nullable
     @VisibleForTesting
     Renderer mRenderer;
@@ -102,10 +126,26 @@
      * The owner TaskFragment token of the decor surface. The decor surface is placed right above
      * the owner TaskFragment surface and is removed if the owner TaskFragment is destroyed.
      */
+    @GuardedBy("mLock")
     @Nullable
     @VisibleForTesting
     IBinder mDecorSurfaceOwner;
 
+    /**
+     * The current divider position relative to the Task bounds. For vertical split (left-to-right
+     * or right-to-left), it is the x coordinate in the task window, and for horizontal split
+     * (top-to-bottom or bottom-to-top), it is the y coordinate in the task window.
+     */
+    @GuardedBy("mLock")
+    private int mDividerPosition;
+
+    DividerPresenter(int taskId, @NonNull DragEventCallback dragEventCallback,
+            @NonNull Executor callbackExecutor) {
+        mTaskId = taskId;
+        mDragEventCallback = dragEventCallback;
+        mCallbackExecutor = callbackExecutor;
+    }
+
     /** Updates the divider when external conditions are changed. */
     void updateDivider(
             @NonNull WindowContainerTransaction wct,
@@ -115,58 +155,65 @@
             return;
         }
 
-        // Clean up the decor surface if top SplitContainer is null.
-        if (topSplitContainer == null) {
-            removeDecorSurfaceAndDivider(wct);
-            return;
-        }
+        synchronized (mLock) {
+            // Clean up the decor surface if top SplitContainer is null.
+            if (topSplitContainer == null) {
+                removeDecorSurfaceAndDivider(wct);
+                return;
+            }
 
-        // Clean up the decor surface if DividerAttributes is null.
-        final DividerAttributes dividerAttributes =
-                topSplitContainer.getCurrentSplitAttributes().getDividerAttributes();
-        if (dividerAttributes == null) {
-            removeDecorSurfaceAndDivider(wct);
-            return;
-        }
+            // Clean up the decor surface if DividerAttributes is null.
+            final DividerAttributes dividerAttributes =
+                    topSplitContainer.getCurrentSplitAttributes().getDividerAttributes();
+            if (dividerAttributes == null) {
+                removeDecorSurfaceAndDivider(wct);
+                return;
+            }
 
-        if (topSplitContainer.getCurrentSplitAttributes().getSplitType()
-                instanceof SplitAttributes.SplitType.ExpandContainersSplitType) {
-            // No divider is needed for ExpandContainersSplitType.
-            removeDivider();
-            return;
-        }
+            if (topSplitContainer.getCurrentSplitAttributes().getSplitType()
+                    instanceof SplitAttributes.SplitType.ExpandContainersSplitType) {
+                // No divider is needed for ExpandContainersSplitType.
+                removeDivider();
+                return;
+            }
 
-        // Skip updating when the TFs have not been updated to match the SplitAttributes.
-        if (topSplitContainer.getPrimaryContainer().getLastRequestedBounds().isEmpty()
-                || topSplitContainer.getSecondaryContainer().getLastRequestedBounds().isEmpty()) {
-            return;
-        }
+            // Skip updating when the TFs have not been updated to match the SplitAttributes.
+            if (topSplitContainer.getPrimaryContainer().getLastRequestedBounds().isEmpty()
+                    || topSplitContainer.getSecondaryContainer().getLastRequestedBounds()
+                    .isEmpty()) {
+                return;
+            }
 
-        final SurfaceControl decorSurface = parentInfo.getDecorSurface();
-        if (decorSurface == null) {
-            // Clean up when the decor surface is currently unavailable.
-            removeDivider();
-            // Request to create the decor surface
-            createOrMoveDecorSurface(wct, topSplitContainer.getPrimaryContainer());
-            return;
-        }
+            final SurfaceControl decorSurface = parentInfo.getDecorSurface();
+            if (decorSurface == null) {
+                // Clean up when the decor surface is currently unavailable.
+                removeDivider();
+                // Request to create the decor surface
+                createOrMoveDecorSurface(wct, topSplitContainer.getPrimaryContainer());
+                return;
+            }
 
-        // make the top primary container the owner of the decor surface.
-        if (!Objects.equals(mDecorSurfaceOwner,
-                topSplitContainer.getPrimaryContainer().getTaskFragmentToken())) {
-            createOrMoveDecorSurface(wct, topSplitContainer.getPrimaryContainer());
-        }
+            // make the top primary container the owner of the decor surface.
+            if (!Objects.equals(mDecorSurfaceOwner,
+                    topSplitContainer.getPrimaryContainer().getTaskFragmentToken())) {
+                createOrMoveDecorSurface(wct, topSplitContainer.getPrimaryContainer());
+            }
 
-        updateProperties(
-                new Properties(
-                        parentInfo.getConfiguration(),
-                        dividerAttributes,
-                        decorSurface,
-                        getInitialDividerPosition(topSplitContainer),
-                        isVerticalSplit(topSplitContainer),
-                        parentInfo.getDisplayId()));
+            updateProperties(
+                    new Properties(
+                            parentInfo.getConfiguration(),
+                            dividerAttributes,
+                            decorSurface,
+                            getInitialDividerPosition(topSplitContainer),
+                            isVerticalSplit(topSplitContainer),
+                            isReversedLayout(
+                                    topSplitContainer.getCurrentSplitAttributes(),
+                                    parentInfo.getConfiguration()),
+                            parentInfo.getDisplayId()));
+        }
     }
 
+    @GuardedBy("mLock")
     private void updateProperties(@NonNull Properties properties) {
         if (Properties.equalsForDivider(mProperties, properties)) {
             return;
@@ -176,16 +223,16 @@
 
         if (mRenderer == null) {
             // Create a new renderer when a renderer doesn't exist yet.
-            mRenderer = new Renderer();
+            mRenderer = new Renderer(mProperties, this);
         } else if (!Properties.areSameSurfaces(
                 previousProperties.mDecorSurface, mProperties.mDecorSurface)
                 || previousProperties.mDisplayId != mProperties.mDisplayId) {
             // Release and recreate the renderer if the decor surface or the display has changed.
             mRenderer.release();
-            mRenderer = new Renderer();
+            mRenderer = new Renderer(mProperties, this);
         } else {
             // Otherwise, update the renderer for the new properties.
-            mRenderer.update();
+            mRenderer.update(mProperties);
         }
     }
 
@@ -195,6 +242,7 @@
      *
      * See {@link TaskFragmentOperation#OP_TYPE_CREATE_OR_MOVE_TASK_FRAGMENT_DECOR_SURFACE}.
      */
+    @GuardedBy("mLock")
     private void createOrMoveDecorSurface(
             @NonNull WindowContainerTransaction wct, @NonNull TaskFragmentContainer container) {
         final TaskFragmentOperation operation = new TaskFragmentOperation.Builder(
@@ -204,6 +252,7 @@
         mDecorSurfaceOwner = container.getTaskFragmentToken();
     }
 
+    @GuardedBy("mLock")
     private void removeDecorSurfaceAndDivider(@NonNull WindowContainerTransaction wct) {
         if (mDecorSurfaceOwner != null) {
             final TaskFragmentOperation operation = new TaskFragmentOperation.Builder(
@@ -215,6 +264,7 @@
         removeDivider();
     }
 
+    @GuardedBy("mLock")
     private void removeDivider() {
         if (mRenderer != null) {
             mRenderer.release();
@@ -238,7 +288,7 @@
 
     private static boolean isVerticalSplit(@NonNull SplitContainer splitContainer) {
         final int layoutDirection = splitContainer.getCurrentSplitAttributes().getLayoutDirection();
-        switch(layoutDirection) {
+        switch (layoutDirection) {
             case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT:
             case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT:
             case SplitAttributes.LayoutDirection.LOCALE:
@@ -251,12 +301,6 @@
         }
     }
 
-    private static void safeReleaseSurfaceControl(@Nullable SurfaceControl sc) {
-        if (sc != null) {
-            sc.release();
-        }
-    }
-
     private static int getDividerWidthPx(@NonNull DividerAttributes dividerAttributes) {
         int dividerWidthDp = dividerAttributes.getWidthDp();
         return convertDpToPixel(dividerWidthDp);
@@ -388,6 +432,227 @@
                 .build();
     }
 
+    @Override
+    public boolean onTouch(@NonNull View view, @NonNull MotionEvent event) {
+        synchronized (mLock) {
+            final Rect taskBounds = mProperties.mConfiguration.windowConfiguration.getBounds();
+            mDividerPosition = calculateDividerPosition(
+                    event, taskBounds, mRenderer.mDividerWidthPx, mProperties.mDividerAttributes,
+                    mProperties.mIsVerticalSplit, mProperties.mIsReversedLayout);
+            mRenderer.setDividerPosition(mDividerPosition);
+            switch (event.getAction()) {
+                case MotionEvent.ACTION_DOWN:
+                    onStartDragging();
+                    break;
+                case MotionEvent.ACTION_UP:
+                case MotionEvent.ACTION_CANCEL:
+                    onFinishDragging();
+                    break;
+                case MotionEvent.ACTION_MOVE:
+                    onDrag();
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        // Returns false so that the default button click callback is still triggered, i.e. the
+        // button UI transitions into the "pressed" state.
+        return false;
+    }
+
+    @GuardedBy("mLock")
+    private void onStartDragging() {
+        mRenderer.mIsDragging = true;
+        final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+        mRenderer.updateSurface(t);
+        mRenderer.showVeils(t);
+        final IBinder decorSurfaceOwner = mDecorSurfaceOwner;
+
+        // Callbacks must be executed on the executor to release mLock and prevent deadlocks.
+        mCallbackExecutor.execute(() -> {
+            mDragEventCallback.onStartDragging(
+                    wct -> setDecorSurfaceBoosted(wct, decorSurfaceOwner, true /* boosted */, t));
+        });
+    }
+
+    @GuardedBy("mLock")
+    private void onDrag() {
+        final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+        mRenderer.updateSurface(t);
+        t.apply();
+    }
+
+    @GuardedBy("mLock")
+    private void onFinishDragging() {
+        final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+        mRenderer.updateSurface(t);
+        mRenderer.hideVeils(t);
+        final IBinder decorSurfaceOwner = mDecorSurfaceOwner;
+
+        // Callbacks must be executed on the executor to release mLock and prevent deadlocks.
+        mCallbackExecutor.execute(() -> {
+            mDragEventCallback.onFinishDragging(
+                    mTaskId,
+                    wct -> setDecorSurfaceBoosted(wct, decorSurfaceOwner, false /* boosted */, t));
+        });
+        mRenderer.mIsDragging = false;
+    }
+
+    private static void setDecorSurfaceBoosted(
+            @NonNull WindowContainerTransaction wct,
+            @Nullable IBinder decorSurfaceOwner,
+            boolean boosted,
+            @NonNull SurfaceControl.Transaction clientTransaction) {
+        if (decorSurfaceOwner == null) {
+            return;
+        }
+        wct.addTaskFragmentOperation(
+                decorSurfaceOwner,
+                new TaskFragmentOperation.Builder(OP_TYPE_SET_DECOR_SURFACE_BOOSTED)
+                        .setBooleanValue(boosted)
+                        .setSurfaceTransaction(clientTransaction)
+                        .build()
+        );
+    }
+
+    /** Calculates the new divider position based on the touch event and divider attributes. */
+    @VisibleForTesting
+    static int calculateDividerPosition(@NonNull MotionEvent event, @NonNull Rect taskBounds,
+            int dividerWidthPx, @NonNull DividerAttributes dividerAttributes,
+            boolean isVerticalSplit, boolean isReversedLayout) {
+        // The touch event is in display space. Converting it into the task window space.
+        final int touchPositionInTaskSpace = isVerticalSplit
+                ? (int) (event.getRawX()) - taskBounds.left
+                : (int) (event.getRawY()) - taskBounds.top;
+
+        // Assuming that the touch position is at the center of the divider bar, so the divider
+        // position is offset by half of the divider width.
+        int dividerPosition = touchPositionInTaskSpace - dividerWidthPx / 2;
+
+        // Limit the divider position to the min and max ratios set in DividerAttributes.
+        // TODO(b/327536303) Handle when the divider is dragged to the edge.
+        dividerPosition = Math.max(dividerPosition, calculateMinPosition(
+                taskBounds, dividerWidthPx, dividerAttributes, isVerticalSplit, isReversedLayout));
+        dividerPosition = Math.min(dividerPosition, calculateMaxPosition(
+                taskBounds, dividerWidthPx, dividerAttributes, isVerticalSplit, isReversedLayout));
+        return dividerPosition;
+    }
+
+    /** Calculates the min position of the divider that the user is allowed to drag to. */
+    @VisibleForTesting
+    static int calculateMinPosition(@NonNull Rect taskBounds, int dividerWidthPx,
+            @NonNull DividerAttributes dividerAttributes, boolean isVerticalSplit,
+            boolean isReversedLayout) {
+        // The usable size is the task window size minus the divider bar width. This is shared
+        // between the primary and secondary containers based on the split ratio.
+        final int usableSize = isVerticalSplit
+                ? taskBounds.width() - dividerWidthPx
+                : taskBounds.height() - dividerWidthPx;
+        return (int) (isReversedLayout
+                ? usableSize - usableSize * dividerAttributes.getPrimaryMaxRatio()
+                : usableSize * dividerAttributes.getPrimaryMinRatio());
+    }
+
+    /** Calculates the max position of the divider that the user is allowed to drag to. */
+    @VisibleForTesting
+    static int calculateMaxPosition(@NonNull Rect taskBounds, int dividerWidthPx,
+            @NonNull DividerAttributes dividerAttributes, boolean isVerticalSplit,
+            boolean isReversedLayout) {
+        // The usable size is the task window size minus the divider bar width. This is shared
+        // between the primary and secondary containers based on the split ratio.
+        final int usableSize = isVerticalSplit
+                ? taskBounds.width() - dividerWidthPx
+                : taskBounds.height() - dividerWidthPx;
+        return (int) (isReversedLayout
+                ? usableSize - usableSize * dividerAttributes.getPrimaryMinRatio()
+                : usableSize * dividerAttributes.getPrimaryMaxRatio());
+    }
+
+    /**
+     * Returns the new split ratio of the {@link SplitContainer} based on the current divider
+     * position.
+     */
+    float calculateNewSplitRatio(@NonNull SplitContainer topSplitContainer) {
+        synchronized (mLock) {
+            return calculateNewSplitRatio(
+                    topSplitContainer,
+                    mDividerPosition,
+                    mProperties.mConfiguration.windowConfiguration.getBounds(),
+                    mRenderer.mDividerWidthPx,
+                    mProperties.mIsVerticalSplit,
+                    mProperties.mIsReversedLayout);
+        }
+    }
+
+    /**
+     * Returns the new split ratio of the {@link SplitContainer} based on the current divider
+     * position.
+     * @param topSplitContainer the {@link SplitContainer} for which to compute the split ratio.
+     * @param dividerPosition the divider position. See {@link #mDividerPosition}.
+     * @param taskBounds the task bounds
+     * @param dividerWidthPx the width of the divider in pixels.
+     * @param isVerticalSplit if {@code true}, the split is a vertical split. If {@code false}, the
+     *                        split is a horizontal split. See
+     *                        {@link #isVerticalSplit(SplitContainer)}.
+     * @param isReversedLayout if {@code true}, the split layout is reversed, i.e. right-to-left or
+     *                         bottom-to-top. If {@code false}, the split is not reversed, i.e.
+     *                         left-to-right or top-to-bottom. See
+     *                         {@link SplitAttributesHelper#isReversedLayout}
+     * @return the computed split ratio of the primary container.
+     */
+    @VisibleForTesting
+    static float calculateNewSplitRatio(
+            @NonNull SplitContainer topSplitContainer,
+            int dividerPosition,
+            @NonNull Rect taskBounds,
+            int dividerWidthPx,
+            boolean isVerticalSplit,
+            boolean isReversedLayout) {
+        final int usableSize = isVerticalSplit
+                ? taskBounds.width() - dividerWidthPx
+                : taskBounds.height() - dividerWidthPx;
+
+        final TaskFragmentContainer primaryContainer = topSplitContainer.getPrimaryContainer();
+        final Rect origPrimaryBounds = primaryContainer.getLastRequestedBounds();
+
+        float newRatio;
+        if (isVerticalSplit) {
+            final int newPrimaryWidth = isReversedLayout
+                    ? (origPrimaryBounds.right - (dividerPosition + dividerWidthPx))
+                    : (dividerPosition - origPrimaryBounds.left);
+            newRatio = 1.0f * newPrimaryWidth / usableSize;
+        } else {
+            final int newPrimaryHeight = isReversedLayout
+                    ? (origPrimaryBounds.bottom - (dividerPosition + dividerWidthPx))
+                    : (dividerPosition - origPrimaryBounds.top);
+            newRatio = 1.0f * newPrimaryHeight / usableSize;
+        }
+        return newRatio;
+    }
+
+    /** Callbacks for drag events */
+    interface DragEventCallback {
+        /**
+         * Called when the user starts dragging the divider. Callbacks are executed on
+         * {@link #mCallbackExecutor}.
+         *
+         * @param action additional action that should be applied to the
+         *               {@link WindowContainerTransaction}
+         */
+        void onStartDragging(@NonNull Consumer<WindowContainerTransaction> action);
+
+        /**
+         * Called when the user finishes dragging the divider. Callbacks are executed on
+         * {@link #mCallbackExecutor}.
+         *
+         * @param taskId the Task id of the {@link TaskContainer} that this divider belongs to.
+         * @param action additional action that should be applied to the
+         *               {@link WindowContainerTransaction}
+         */
+        void onFinishDragging(int taskId, @NonNull Consumer<WindowContainerTransaction> action);
+    }
+
     /**
      * Properties for the {@link DividerPresenter}. The rendering of the divider solely depends on
      * these properties. When any value is updated, the divider is re-rendered. The Properties
@@ -411,6 +676,7 @@
         private final boolean mIsVerticalSplit;
 
         private final int mDisplayId;
+        private final boolean mIsReversedLayout;
 
         @VisibleForTesting
         Properties(
@@ -419,12 +685,14 @@
                 @NonNull SurfaceControl decorSurface,
                 int initialDividerPosition,
                 boolean isVerticalSplit,
+                boolean isReversedLayout,
                 int displayId) {
             mConfiguration = configuration;
             mDividerAttributes = dividerAttributes;
             mDecorSurface = decorSurface;
             mInitialDividerPosition = initialDividerPosition;
             mIsVerticalSplit = isVerticalSplit;
+            mIsReversedLayout = isReversedLayout;
             mDisplayId = displayId;
         }
 
@@ -445,7 +713,8 @@
                     && areConfigurationsEqualForDivider(a.mConfiguration, b.mConfiguration)
                     && a.mInitialDividerPosition == b.mInitialDividerPosition
                     && a.mIsVerticalSplit == b.mIsVerticalSplit
-                    && a.mDisplayId == b.mDisplayId;
+                    && a.mDisplayId == b.mDisplayId
+                    && a.mIsReversedLayout == b.mIsReversedLayout;
         }
 
         private static boolean areSameSurfaces(
@@ -472,7 +741,7 @@
      * recreated. When other fields in the Properties are changed, the renderer is updated.
      */
     @VisibleForTesting
-    class Renderer {
+    static class Renderer {
         @NonNull
         private final SurfaceControl mDividerSurface;
         @NonNull
@@ -481,10 +750,21 @@
         private final SurfaceControlViewHost mViewHost;
         @NonNull
         private final FrameLayout mDividerLayout;
-        private final int mDividerWidthPx;
+        @NonNull
+        private final View.OnTouchListener mListener;
+        @NonNull
+        private Properties mProperties;
+        private int mDividerWidthPx;
+        @Nullable
+        private SurfaceControl mPrimaryVeil;
+        @Nullable
+        private SurfaceControl mSecondaryVeil;
+        private boolean mIsDragging;
+        private int mDividerPosition;
 
-        private Renderer() {
-            mDividerWidthPx = getDividerWidthPx(mProperties.mDividerAttributes);
+        private Renderer(@NonNull Properties properties, @NonNull View.OnTouchListener listener) {
+            mProperties = properties;
+            mListener = listener;
 
             mDividerSurface = createChildSurface("DividerSurface", true /* visible */);
             mWindowlessWindowManager = new WindowlessWindowManager(
@@ -503,36 +783,63 @@
         }
 
         /** Updates the divider when properties are changed */
+        private void update(@NonNull Properties newProperties) {
+            mProperties = newProperties;
+            update();
+        }
+
+        /** Updates the divider when initializing or when properties are changed */
         @VisibleForTesting
         void update() {
+            mDividerWidthPx = getDividerWidthPx(mProperties.mDividerAttributes);
+            mDividerPosition = mProperties.mInitialDividerPosition;
             mWindowlessWindowManager.setConfiguration(mProperties.mConfiguration);
-            updateSurface();
+            // TODO handle synchronization between surface transactions and WCT.
+            final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+            updateSurface(t);
             updateLayout();
-            updateDivider();
+            updateDivider(t);
+            t.apply();
         }
 
         @VisibleForTesting
         void release() {
             mViewHost.release();
             // TODO handle synchronization between surface transactions and WCT.
-            new SurfaceControl.Transaction().remove(mDividerSurface).apply();
-            safeReleaseSurfaceControl(mDividerSurface);
-        }
-
-        private void updateSurface() {
-            final Rect taskBounds = mProperties.mConfiguration.windowConfiguration.getBounds();
-            // TODO handle synchronization between surface transactions and WCT.
             final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
-            if (mProperties.mIsVerticalSplit) {
-                t.setPosition(mDividerSurface, mProperties.mInitialDividerPosition, 0.0f);
-                t.setWindowCrop(mDividerSurface, mDividerWidthPx, taskBounds.height());
-            } else {
-                t.setPosition(mDividerSurface, 0.0f, mProperties.mInitialDividerPosition);
-                t.setWindowCrop(mDividerSurface, taskBounds.width(), mDividerWidthPx);
-            }
+            t.remove(mDividerSurface);
+            removeVeils(t);
             t.apply();
         }
 
+        private void setDividerPosition(int dividerPosition) {
+            mDividerPosition = dividerPosition;
+        }
+
+        /**
+         * Updates the positions and crops of the divider surface and veil surfaces. This method
+         * should be called when {@link #mProperties} is changed or while dragging to update the
+         * position of the divider surface and the veil surfaces.
+         */
+        private void updateSurface(@NonNull SurfaceControl.Transaction t) {
+            final Rect taskBounds = mProperties.mConfiguration.windowConfiguration.getBounds();
+            if (mProperties.mIsVerticalSplit) {
+                t.setPosition(mDividerSurface, mDividerPosition, 0.0f);
+                t.setWindowCrop(mDividerSurface, mDividerWidthPx, taskBounds.height());
+            } else {
+                t.setPosition(mDividerSurface, 0.0f, mDividerPosition);
+                t.setWindowCrop(mDividerSurface, taskBounds.width(), mDividerWidthPx);
+            }
+            if (mIsDragging) {
+                updateVeils(t);
+            }
+        }
+
+        /**
+         * Updates the layout parameters of the layout used to host the divider. This method should
+         * be called only when {@link #mProperties} is changed. This should not be called while
+         * dragging, because the layout parameters are not changed during dragging.
+         */
         private void updateLayout() {
             final Rect taskBounds = mProperties.mConfiguration.windowConfiguration.getBounds();
             final WindowManager.LayoutParams lp = mProperties.mIsVerticalSplit
@@ -552,12 +859,21 @@
             mViewHost.setView(mDividerLayout, lp);
         }
 
-        private void updateDivider() {
+        /**
+         * Updates the UI component of the divider, including the drag handle and the veils. This
+         * method should be called only when {@link #mProperties} is changed. This should not be
+         * called while dragging, because the UI components are not changed during dragging and
+         * only their surface positions are changed.
+         */
+        private void updateDivider(@NonNull SurfaceControl.Transaction t) {
             mDividerLayout.removeAllViews();
             mDividerLayout.setBackgroundColor(DEFAULT_DIVIDER_COLOR.toArgb());
             if (mProperties.mDividerAttributes.getDividerType()
                     == DividerAttributes.DIVIDER_TYPE_DRAGGABLE) {
+                createVeils();
                 drawDragHandle();
+            } else {
+                removeVeils(t);
             }
             mViewHost.getView().invalidate();
         }
@@ -580,7 +896,7 @@
             button.setLayoutParams(params);
             button.setBackgroundColor(R.color.transparent);
 
-            final Drawable handle =  context.getResources().getDrawable(
+            final Drawable handle = context.getResources().getDrawable(
                     R.drawable.activity_embedding_divider_handle, context.getTheme());
             if (mProperties.mIsVerticalSplit) {
                 button.setImageDrawable(handle);
@@ -598,6 +914,8 @@
 
                 button.setImageDrawable(rotatedHandle);
             }
+
+            button.setOnTouchListener(mListener);
             mDividerLayout.addView(button);
         }
 
@@ -613,5 +931,69 @@
                     .setColorLayer()
                     .build();
         }
+
+        private void createVeils() {
+            if (mPrimaryVeil == null) {
+                mPrimaryVeil = createChildSurface("DividerPrimaryVeil", false /* visible */);
+            }
+            if (mSecondaryVeil == null) {
+                mSecondaryVeil = createChildSurface("DividerSecondaryVeil", false /* visible */);
+            }
+        }
+
+        private void removeVeils(@NonNull SurfaceControl.Transaction t) {
+            if (mPrimaryVeil != null) {
+                t.remove(mPrimaryVeil);
+            }
+            if (mSecondaryVeil != null) {
+                t.remove(mSecondaryVeil);
+            }
+            mPrimaryVeil = null;
+            mSecondaryVeil = null;
+        }
+
+        private void showVeils(@NonNull SurfaceControl.Transaction t) {
+            t.setColor(mPrimaryVeil, colorToFloatArray(DEFAULT_PRIMARY_VEIL_COLOR))
+                    .setColor(mSecondaryVeil, colorToFloatArray(DEFAULT_SECONDARY_VEIL_COLOR))
+                    .setLayer(mDividerSurface, DIVIDER_LAYER)
+                    .setLayer(mPrimaryVeil, VEIL_LAYER)
+                    .setLayer(mSecondaryVeil, VEIL_LAYER)
+                    .setVisibility(mPrimaryVeil, true)
+                    .setVisibility(mSecondaryVeil, true);
+            updateVeils(t);
+        }
+
+        private void hideVeils(@NonNull SurfaceControl.Transaction t) {
+            t.setVisibility(mPrimaryVeil, false).setVisibility(mSecondaryVeil, false);
+        }
+
+        private void updateVeils(@NonNull SurfaceControl.Transaction t) {
+            final Rect taskBounds = mProperties.mConfiguration.windowConfiguration.getBounds();
+
+            // Relative bounds of the primary and secondary containers in the Task.
+            Rect primaryBounds;
+            Rect secondaryBounds;
+            if (mProperties.mIsVerticalSplit) {
+                final Rect boundsLeft = new Rect(0, 0, mDividerPosition, taskBounds.height());
+                final Rect boundsRight = new Rect(mDividerPosition + mDividerWidthPx, 0,
+                        taskBounds.width(), taskBounds.height());
+                primaryBounds = mProperties.mIsReversedLayout ? boundsRight : boundsLeft;
+                secondaryBounds = mProperties.mIsReversedLayout ? boundsLeft : boundsRight;
+            } else {
+                final Rect boundsTop = new Rect(0, 0, taskBounds.width(), mDividerPosition);
+                final Rect boundsBottom = new Rect(0, mDividerPosition + mDividerWidthPx,
+                        taskBounds.width(), taskBounds.height());
+                primaryBounds = mProperties.mIsReversedLayout ? boundsBottom : boundsTop;
+                secondaryBounds = mProperties.mIsReversedLayout ? boundsTop : boundsBottom;
+            }
+            t.setWindowCrop(mPrimaryVeil, primaryBounds.width(), primaryBounds.height());
+            t.setWindowCrop(mSecondaryVeil, secondaryBounds.width(), secondaryBounds.height());
+            t.setPosition(mPrimaryVeil, primaryBounds.left, primaryBounds.top);
+            t.setPosition(mSecondaryVeil, secondaryBounds.left, secondaryBounds.top);
+        }
+
+        private static float[] colorToFloatArray(@NonNull Color color) {
+            return new float[]{color.red(), color.green(), color.blue()};
+        }
     }
 }
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java
index 3f4dddf..32f2d67 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java
@@ -165,7 +165,7 @@
     /**
      * Expands an existing TaskFragment to fill parent.
      * @param wct WindowContainerTransaction in which the task fragment should be resized.
-     * @param fragmentToken token of an existing TaskFragment.
+     * @param container the {@link TaskFragmentContainer} to be expanded.
      */
     void expandTaskFragment(@NonNull WindowContainerTransaction wct,
             @NonNull TaskFragmentContainer container) {
@@ -174,8 +174,6 @@
         clearAdjacentTaskFragments(wct, fragmentToken);
         updateWindowingMode(wct, fragmentToken, WINDOWING_MODE_UNDEFINED);
         updateAnimationParams(wct, fragmentToken, TaskFragmentAnimationParams.DEFAULT);
-
-        container.getTaskContainer().updateDivider(wct);
     }
 
     /**
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitAttributesHelper.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitAttributesHelper.java
new file mode 100644
index 0000000..042a68a6
--- /dev/null
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitAttributesHelper.java
@@ -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 androidx.window.extensions.embedding;
+
+import android.content.res.Configuration;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+
+/** Helper functions for {@link SplitAttributes} */
+class SplitAttributesHelper {
+    /**
+     * Returns whether the split layout direction is reversed. Right-to-left and bottom-to-top are
+     * considered reversed.
+     */
+    static boolean isReversedLayout(
+            @NonNull SplitAttributes splitAttributes, @NonNull Configuration configuration) {
+        switch (splitAttributes.getLayoutDirection()) {
+            case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT:
+            case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM:
+                return false;
+            case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT:
+            case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP:
+                return true;
+            case SplitAttributes.LayoutDirection.LOCALE:
+                return configuration.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+            default:
+                throw new IllegalArgumentException(
+                        "Invalid layout direction:" + splitAttributes.getLayoutDirection());
+        }
+    }
+}
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 1bc8264..b9b86f0 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java
@@ -110,7 +110,7 @@
  * Main controller class that manages split states and presentation.
  */
 public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmentCallback,
-        ActivityEmbeddingComponent {
+        ActivityEmbeddingComponent, DividerPresenter.DragEventCallback {
     static final String TAG = "SplitController";
     static final boolean ENABLE_SHELL_TRANSITIONS =
             SystemProperties.getBoolean("persist.wm.debug.shell_transit", true);
@@ -163,6 +163,10 @@
     @GuardedBy("mLock")
     final SparseArray<TaskContainer> mTaskContainers = new SparseArray<>();
 
+    /** Map from Task id to {@link DividerPresenter} which manages the divider in the Task. */
+    @GuardedBy("mLock")
+    private final SparseArray<DividerPresenter> mDividerPresenters = new SparseArray<>();
+
     /** Callback to Jetpack to notify about changes to split states. */
     @GuardedBy("mLock")
     @Nullable
@@ -195,15 +199,16 @@
                     : null;
 
     private final Handler mHandler;
+    private final MainThreadExecutor mExecutor;
     final Object mLock = new Object();
     private final ActivityStartMonitor mActivityStartMonitor;
 
     public SplitController(@NonNull WindowLayoutComponentImpl windowLayoutComponent,
             @NonNull DeviceStateManagerFoldingFeatureProducer foldingFeatureProducer) {
         Log.i(TAG, "Initializing Activity Embedding Controller.");
-        final MainThreadExecutor executor = new MainThreadExecutor();
-        mHandler = executor.mHandler;
-        mPresenter = new SplitPresenter(executor, windowLayoutComponent, this);
+        mExecutor = new MainThreadExecutor();
+        mHandler = mExecutor.mHandler;
+        mPresenter = new SplitPresenter(mExecutor, windowLayoutComponent, this);
         mTransactionManager = new TransactionManager(mPresenter);
         final ActivityThread activityThread = ActivityThread.currentActivityThread();
         final Application application = activityThread.getApplication();
@@ -844,7 +849,11 @@
         // Checks if container should be updated before apply new parentInfo.
         final boolean shouldUpdateContainer = taskContainer.shouldUpdateContainer(parentInfo);
         taskContainer.updateTaskFragmentParentInfo(parentInfo);
-        taskContainer.updateDivider(wct);
+
+        // The divider need to be updated even if shouldUpdateContainer is false, because the decor
+        // surface may change in TaskFragmentParentInfo, which requires divider update but not
+        // container update.
+        updateDivider(wct, taskContainer);
 
         // If the last direct activity of the host task is dismissed and the overlay container is
         // the only taskFragment, the overlay container should also be dismissed.
@@ -1007,6 +1016,7 @@
             if (taskContainer.isEmpty()) {
                 // Cleanup the TaskContainer if it becomes empty.
                 mTaskContainers.remove(taskContainer.getTaskId());
+                mDividerPresenters.remove(taskContainer.getTaskId());
             }
             return;
         }
@@ -1759,6 +1769,7 @@
         }
         if (!mTaskContainers.contains(taskId)) {
             mTaskContainers.put(taskId, new TaskContainer(taskId, activityInTask));
+            mDividerPresenters.put(taskId, new DividerPresenter(taskId, this, mExecutor));
         }
         final TaskContainer taskContainer = mTaskContainers.get(taskId);
         final TaskFragmentContainer container = new TaskFragmentContainer(pendingAppearedActivity,
@@ -3065,4 +3076,46 @@
         return configuration != null
                 && configuration.windowConfiguration.getWindowingMode() == WINDOWING_MODE_PINNED;
     }
+
+    @GuardedBy("mLock")
+    void updateDivider(
+            @NonNull WindowContainerTransaction wct, @NonNull TaskContainer taskContainer) {
+        final DividerPresenter dividerPresenter = mDividerPresenters.get(taskContainer.getTaskId());
+        final TaskFragmentParentInfo parentInfo = taskContainer.getTaskFragmentParentInfo();
+        if (parentInfo != null) {
+            dividerPresenter.updateDivider(
+                    wct, parentInfo, taskContainer.getTopNonFinishingSplitContainer());
+        }
+    }
+
+    @Override
+    public void onStartDragging(@NonNull Consumer<WindowContainerTransaction> action) {
+        synchronized (mLock) {
+            final TransactionRecord transactionRecord =
+                    mTransactionManager.startNewTransaction();
+            final WindowContainerTransaction wct = transactionRecord.getTransaction();
+            action.accept(wct);
+            transactionRecord.apply(false /* shouldApplyIndependently */);
+        }
+    }
+
+    @Override
+    public void onFinishDragging(
+            int taskId,
+            @NonNull Consumer<WindowContainerTransaction> action) {
+        synchronized (mLock) {
+            final TransactionRecord transactionRecord =
+                    mTransactionManager.startNewTransaction();
+            final WindowContainerTransaction wct = transactionRecord.getTransaction();
+            final TaskContainer taskContainer = mTaskContainers.get(taskId);
+            if (taskContainer != null) {
+                final DividerPresenter dividerPresenter =
+                        mDividerPresenters.get(taskContainer.getTaskId());
+                taskContainer.updateTopSplitContainerForDivider(dividerPresenter);
+                updateContainersInTask(wct, taskContainer);
+            }
+            action.accept(wct);
+            transactionRecord.apply(false /* shouldApplyIndependently */);
+        }
+    }
 }
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 20bc82002..0d31266 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java
@@ -19,6 +19,7 @@
 import static android.content.pm.PackageManager.MATCH_ALL;
 
 import static androidx.window.extensions.embedding.DividerPresenter.getBoundsOffsetForDivider;
+import static androidx.window.extensions.embedding.SplitAttributesHelper.isReversedLayout;
 import static androidx.window.extensions.embedding.WindowAttributes.DIM_AREA_ON_TASK;
 
 import android.app.Activity;
@@ -33,7 +34,6 @@
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.os.IBinder;
-import android.util.LayoutDirection;
 import android.util.Pair;
 import android.util.Size;
 import android.view.View;
@@ -368,7 +368,7 @@
         updateTaskFragmentWindowingModeIfRegistered(wct, secondaryContainer, windowingMode);
         updateAnimationParams(wct, primaryContainer.getTaskFragmentToken(), splitAttributes);
         updateAnimationParams(wct, secondaryContainer.getTaskFragmentToken(), splitAttributes);
-        taskContainer.updateDivider(wct);
+        mController.updateDivider(wct, taskContainer);
     }
 
     private void setAdjacentTaskFragments(@NonNull WindowContainerTransaction wct,
@@ -697,6 +697,17 @@
         return RESULT_NOT_EXPANDED;
     }
 
+    /**
+     * Expands an existing TaskFragment to fill parent.
+     * @param wct WindowContainerTransaction in which the task fragment should be resized.
+     * @param container the {@link TaskFragmentContainer} to be expanded.
+     */
+    void expandTaskFragment(@NonNull WindowContainerTransaction wct,
+            @NonNull TaskFragmentContainer container) {
+        super.expandTaskFragment(wct, container);
+        mController.updateDivider(wct, container.getTaskContainer());
+    }
+
     static boolean shouldShowSplit(@NonNull SplitContainer splitContainer) {
         return shouldShowSplit(splitContainer.getCurrentSplitAttributes());
     }
@@ -1108,7 +1119,6 @@
      */
     private SplitType computeSplitType(@NonNull SplitAttributes splitAttributes,
             @NonNull Configuration taskConfiguration, @Nullable FoldingFeature foldingFeature) {
-        final int layoutDirection = splitAttributes.getLayoutDirection();
         final SplitType splitType = splitAttributes.getSplitType();
         if (splitType instanceof ExpandContainersSplitType) {
             return splitType;
@@ -1117,19 +1127,9 @@
             // Reverse the ratio for RIGHT_TO_LEFT and BOTTOM_TO_TOP to make the boundary
             // computation have the same direction, which is from (top, left) to (bottom, right).
             final SplitType reversedSplitType = new RatioSplitType(1 - splitRatio.getRatio());
-            switch (layoutDirection) {
-                case SplitAttributes.LayoutDirection.LEFT_TO_RIGHT:
-                case SplitAttributes.LayoutDirection.TOP_TO_BOTTOM:
-                    return splitType;
-                case SplitAttributes.LayoutDirection.RIGHT_TO_LEFT:
-                case SplitAttributes.LayoutDirection.BOTTOM_TO_TOP:
-                    return reversedSplitType;
-                case LayoutDirection.LOCALE: {
-                    boolean isLtr = taskConfiguration.getLayoutDirection()
-                            == View.LAYOUT_DIRECTION_LTR;
-                    return isLtr ? splitType : reversedSplitType;
-                }
-            }
+            return isReversedLayout(splitAttributes, taskConfiguration)
+                    ? reversedSplitType
+                    : splitType;
         } else if (splitType instanceof HingeSplitType) {
             final HingeSplitType hinge = (HingeSplitType) splitType;
             @WindowingMode
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 e75a317..a215bdf 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java
@@ -88,10 +88,6 @@
      */
     final Set<IBinder> mFinishedContainer = new ArraySet<>();
 
-    // TODO(b/293654166): move DividerPresenter to SplitController.
-    @NonNull
-    final DividerPresenter mDividerPresenter;
-
     /**
      * The {@link TaskContainer} constructor
      *
@@ -113,7 +109,6 @@
         // the host task is visible and has an activity in the task.
         mIsVisible = true;
         mHasDirectActivity = true;
-        mDividerPresenter = new DividerPresenter();
     }
 
     int getTaskId() {
@@ -151,6 +146,11 @@
         mTaskFragmentParentInfo = info;
     }
 
+    @Nullable
+    TaskFragmentParentInfo getTaskFragmentParentInfo() {
+        return mTaskFragmentParentInfo;
+    }
+
     /**
      * Returns {@code true} if the container should be updated with {@code info}.
      */
@@ -398,16 +398,22 @@
         return mContainers;
     }
 
-    void updateDivider(@NonNull WindowContainerTransaction wct) {
-        if (mTaskFragmentParentInfo != null) {
-            // Update divider only if TaskFragmentParentInfo is available.
-            mDividerPresenter.updateDivider(
-                    wct, mTaskFragmentParentInfo, getTopNonFinishingSplitContainer());
+    void updateTopSplitContainerForDivider(@NonNull DividerPresenter dividerPresenter) {
+        final SplitContainer topSplitContainer = getTopNonFinishingSplitContainer();
+        if (topSplitContainer == null) {
+            return;
         }
+
+        final float newRatio = dividerPresenter.calculateNewSplitRatio(topSplitContainer);
+        topSplitContainer.updateDefaultSplitAttributes(
+                new SplitAttributes.Builder(topSplitContainer.getDefaultSplitAttributes())
+                        .setSplitType(new SplitAttributes.SplitType.RatioSplitType(newRatio))
+                        .build()
+        );
     }
 
     @Nullable
-    private SplitContainer getTopNonFinishingSplitContainer() {
+    SplitContainer getTopNonFinishingSplitContainer() {
         for (int i = mSplitContainers.size() - 1; i >= 0; i--) {
             final SplitContainer splitContainer = mSplitContainers.get(i);
             if (!splitContainer.getPrimaryContainer().isFinished()
diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/DividerPresenterTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/DividerPresenterTest.java
index 4d1d807..47d01da 100644
--- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/DividerPresenterTest.java
+++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/DividerPresenterTest.java
@@ -42,6 +42,7 @@
 import android.platform.test.annotations.Presubmit;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.view.Display;
+import android.view.MotionEvent;
 import android.view.SurfaceControl;
 import android.window.TaskFragmentOperation;
 import android.window.TaskFragmentParentInfo;
@@ -60,6 +61,8 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.concurrent.Executor;
+
 /**
  * Test class for {@link DividerPresenter}.
  *
@@ -73,6 +76,8 @@
     @Rule
     public final SetFlagsRule mSetFlagRule = new SetFlagsRule();
 
+    private static final int MOCK_TASK_ID = 1234;
+
     @Mock
     private DividerPresenter.Renderer mRenderer;
 
@@ -83,6 +88,12 @@
     private TaskFragmentParentInfo mParentInfo;
 
     @Mock
+    private TaskContainer mTaskContainer;
+
+    @Mock
+    private DividerPresenter.DragEventCallback mDragEventCallback;
+
+    @Mock
     private SplitContainer mSplitContainer;
 
     @Mock
@@ -110,6 +121,8 @@
         MockitoAnnotations.initMocks(this);
         mSetFlagRule.enableFlags(Flags.FLAG_ACTIVITY_EMBEDDING_INTERACTIVE_DIVIDER_FLAG);
 
+        when(mTaskContainer.getTaskId()).thenReturn(MOCK_TASK_ID);
+
         when(mParentInfo.getDisplayId()).thenReturn(Display.DEFAULT_DISPLAY);
         when(mParentInfo.getConfiguration()).thenReturn(new Configuration());
         when(mParentInfo.getDecorSurface()).thenReturn(mSurfaceControl);
@@ -133,9 +146,11 @@
                 mSurfaceControl,
                 getInitialDividerPosition(mSplitContainer),
                 true /* isVerticalSplit */,
+                false /* isReversedLayout */,
                 Display.DEFAULT_DISPLAY);
 
-        mDividerPresenter = new DividerPresenter();
+        mDividerPresenter = new DividerPresenter(
+                MOCK_TASK_ID, mDragEventCallback, mock(Executor.class));
         mDividerPresenter.mProperties = mProperties;
         mDividerPresenter.mRenderer = mRenderer;
         mDividerPresenter.mDecorSurfaceOwner = mPrimaryContainerToken;
@@ -311,6 +326,184 @@
                 dividerWidthPx, splitType, expectedTopLeftOffset, expectedBottomRightOffset);
     }
 
+    @Test
+    public void testCalculateDividerPosition() {
+        final MotionEvent event = mock(MotionEvent.class);
+        final Rect taskBounds = new Rect(100, 200, 1000, 2000);
+        final int dividerWidthPx = 50;
+        final DividerAttributes dividerAttributes =
+                new DividerAttributes.Builder(DividerAttributes.DIVIDER_TYPE_DRAGGABLE)
+                        .setPrimaryMinRatio(0.3f)
+                        .setPrimaryMaxRatio(0.8f)
+                        .build();
+
+        // Left-to-right split
+        when(event.getRawX()).thenReturn(500f); // Touch event is in display space
+        assertEquals(
+                // Touch position is in task space is 400, then minus half of divider width.
+                375,
+                DividerPresenter.calculateDividerPosition(
+                        event,
+                        taskBounds,
+                        dividerWidthPx,
+                        dividerAttributes,
+                        true /* isVerticalSplit */,
+                        false /* isReversedLayout */));
+
+        // Top-to-bottom split
+        when(event.getRawY()).thenReturn(1000f); // Touch event is in display space
+        assertEquals(
+                // Touch position is in task space is 800, then minus half of divider width.
+                775,
+                DividerPresenter.calculateDividerPosition(
+                        event,
+                        taskBounds,
+                        dividerWidthPx,
+                        dividerAttributes,
+                        false /* isVerticalSplit */,
+                        false /* isReversedLayout */));
+    }
+
+    @Test
+    public void testCalculateMinPosition() {
+        final Rect taskBounds = new Rect(100, 200, 1000, 2000);
+        final int dividerWidthPx = 50;
+        final DividerAttributes dividerAttributes =
+                new DividerAttributes.Builder(DividerAttributes.DIVIDER_TYPE_DRAGGABLE)
+                        .setPrimaryMinRatio(0.3f)
+                        .setPrimaryMaxRatio(0.8f)
+                        .build();
+
+        // Left-to-right split
+        assertEquals(
+                255, /* (1000 - 100 - 50) * 0.3 */
+                DividerPresenter.calculateMinPosition(
+                        taskBounds,
+                        dividerWidthPx,
+                        dividerAttributes,
+                        true /* isVerticalSplit */,
+                        false /* isReversedLayout */));
+
+        // Top-to-bottom split
+        assertEquals(
+                525, /* (2000 - 200 - 50) * 0.3 */
+                DividerPresenter.calculateMinPosition(
+                        taskBounds,
+                        dividerWidthPx,
+                        dividerAttributes,
+                        false /* isVerticalSplit */,
+                        false /* isReversedLayout */));
+
+        // Right-to-left split
+        assertEquals(
+                170, /* (1000 - 100 - 50) * (1 - 0.8) */
+                DividerPresenter.calculateMinPosition(
+                        taskBounds,
+                        dividerWidthPx,
+                        dividerAttributes,
+                        true /* isVerticalSplit */,
+                        true /* isReversedLayout */));
+    }
+
+    @Test
+    public void testCalculateMaxPosition() {
+        final Rect taskBounds = new Rect(100, 200, 1000, 2000);
+        final int dividerWidthPx = 50;
+        final DividerAttributes dividerAttributes =
+                new DividerAttributes.Builder(DividerAttributes.DIVIDER_TYPE_DRAGGABLE)
+                        .setPrimaryMinRatio(0.3f)
+                        .setPrimaryMaxRatio(0.8f)
+                        .build();
+
+        // Left-to-right split
+        assertEquals(
+                680, /* (1000 - 100 - 50) * 0.8 */
+                DividerPresenter.calculateMaxPosition(
+                        taskBounds,
+                        dividerWidthPx,
+                        dividerAttributes,
+                        true /* isVerticalSplit */,
+                        false /* isReversedLayout */));
+
+        // Top-to-bottom split
+        assertEquals(
+                1400, /* (2000 - 200 - 50) * 0.8 */
+                DividerPresenter.calculateMaxPosition(
+                        taskBounds,
+                        dividerWidthPx,
+                        dividerAttributes,
+                        false /* isVerticalSplit */,
+                        false /* isReversedLayout */));
+
+        // Right-to-left split
+        assertEquals(
+                595, /* (1000 - 100 - 50) * (1 - 0.3) */
+                DividerPresenter.calculateMaxPosition(
+                        taskBounds,
+                        dividerWidthPx,
+                        dividerAttributes,
+                        true /* isVerticalSplit */,
+                        true /* isReversedLayout */));
+    }
+
+    @Test
+    public void testCalculateNewSplitRatio_leftToRight() {
+        // primary=500px; secondary=500px; divider=100px; total=1100px.
+        final Rect taskBounds = new Rect(0, 0, 1100, 2000);
+        final Rect primaryBounds = new Rect(0, 0, 500, 2000);
+        final Rect secondaryBounds = new Rect(600, 0, 1100, 2000);
+        final int dividerWidthPx = 100;
+        final int dividerPosition = 300;
+
+        final TaskFragmentContainer mockPrimaryContainer =
+                createMockTaskFragmentContainer(mPrimaryContainerToken, primaryBounds);
+        final TaskFragmentContainer mockSecondaryContainer =
+                createMockTaskFragmentContainer(mSecondaryContainerToken, secondaryBounds);
+        when(mSplitContainer.getPrimaryContainer()).thenReturn(mockPrimaryContainer);
+        when(mSplitContainer.getSecondaryContainer()).thenReturn(mockSecondaryContainer);
+
+        assertEquals(
+                0.3f, // Primary is 300px after dragging.
+                DividerPresenter.calculateNewSplitRatio(
+                        mSplitContainer,
+                        dividerPosition,
+                        taskBounds,
+                        dividerWidthPx,
+                        true /* isVerticalSplit */,
+                        false /* isReversedLayout */),
+                0.0001 /* delta */);
+    }
+
+    @Test
+    public void testCalculateNewSplitRatio_bottomToTop() {
+        // Primary is at bottom. Secondary is at top.
+        // primary=500px; secondary=500px; divider=100px; total=1100px.
+        final Rect taskBounds = new Rect(0, 0, 2000, 1100);
+        final Rect primaryBounds = new Rect(0, 0, 2000, 1100);
+        final Rect secondaryBounds = new Rect(0, 0, 2000, 500);
+        final int dividerWidthPx = 100;
+        final int dividerPosition = 300;
+
+        final TaskFragmentContainer mockPrimaryContainer =
+                createMockTaskFragmentContainer(mPrimaryContainerToken, primaryBounds);
+        final TaskFragmentContainer mockSecondaryContainer =
+                createMockTaskFragmentContainer(mSecondaryContainerToken, secondaryBounds);
+        when(mSplitContainer.getPrimaryContainer()).thenReturn(mockPrimaryContainer);
+        when(mSplitContainer.getSecondaryContainer()).thenReturn(mockSecondaryContainer);
+
+        assertEquals(
+                // After dragging, secondary is [0, 0, 2000, 300]. Primary is [0, 400, 2000, 1100].
+                0.7f,
+                DividerPresenter.calculateNewSplitRatio(
+                        mSplitContainer,
+                        dividerPosition,
+                        taskBounds,
+                        dividerWidthPx,
+                        false /* isVerticalSplit */,
+                        true /* isReversedLayout */),
+                0.0001 /* delta */);
+    }
+
     private TaskFragmentContainer createMockTaskFragmentContainer(
             @NonNull IBinder token, @NonNull Rect bounds) {
         final TaskFragmentContainer container = mock(TaskFragmentContainer.class);
diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp
index 8829d1b..5c978e2 100644
--- a/libs/WindowManager/Shell/Android.bp
+++ b/libs/WindowManager/Shell/Android.bp
@@ -45,7 +45,6 @@
     name: "wm_shell_util-sources",
     srcs: [
         "src/com/android/wm/shell/animation/Interpolators.java",
-        "src/com/android/wm/shell/animation/PhysicsAnimator.kt",
         "src/com/android/wm/shell/common/bubbles/*.kt",
         "src/com/android/wm/shell/common/bubbles/*.java",
         "src/com/android/wm/shell/common/magnetictarget/MagnetizedObject.kt",
@@ -166,10 +165,28 @@
     },
 }
 
+filegroup {
+    name: "wm_shell-shared-aidls",
+
+    srcs: [
+        "shared/**/*.aidl",
+    ],
+
+    path: "shared/src",
+}
+
 java_library {
     name: "WindowManager-Shell-shared",
 
-    srcs: ["shared/**/*.java"],
+    srcs: [
+        "shared/**/*.java",
+        "shared/**/*.kt",
+        ":wm_shell-shared-aidls",
+    ],
+    static_libs: [
+        "androidx.dynamicanimation_dynamicanimation",
+        "jsr330",
+    ],
 }
 
 android_library {
@@ -193,7 +210,7 @@
         "androidx.recyclerview_recyclerview",
         "kotlinx-coroutines-android",
         "kotlinx-coroutines-core",
-        "iconloader_base",
+        "//frameworks/libs/systemui:iconloader_base",
         "com_android_wm_shell_flags_lib",
         "com.android.window.flags.window-aconfig-java",
         "WindowManager-Shell-proto",
diff --git a/libs/WindowManager/Shell/aconfig/Android.bp b/libs/WindowManager/Shell/aconfig/Android.bp
index 1a98ffc..7f8f57b 100644
--- a/libs/WindowManager/Shell/aconfig/Android.bp
+++ b/libs/WindowManager/Shell/aconfig/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "com_android_wm_shell_flags",
     package: "com.android.wm.shell",
+    container: "system",
     srcs: [
         "multitasking.aconfig",
     ],
diff --git a/libs/WindowManager/Shell/aconfig/multitasking.aconfig b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
index b61dda4..7ff204c 100644
--- a/libs/WindowManager/Shell/aconfig/multitasking.aconfig
+++ b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.wm.shell"
+container: "system"
 
 flag {
     name: "enable_app_pairs"
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt
index f3d70f7..35a4a62 100644
--- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt
+++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt
@@ -34,11 +34,11 @@
 import com.android.internal.protolog.common.ProtoLog
 import com.android.launcher3.icons.BubbleIconFactory
 import com.android.wm.shell.R
-import com.android.wm.shell.animation.PhysicsAnimatorTestUtils
 import com.android.wm.shell.bubbles.Bubbles.SysuiProxy
 import com.android.wm.shell.bubbles.animation.AnimatableScaleMatrix
 import com.android.wm.shell.common.FloatingContentCoordinator
 import com.android.wm.shell.common.ShellExecutor
+import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils
 import com.android.wm.shell.taskview.TaskView
 import com.android.wm.shell.taskview.TaskViewTaskController
 import com.google.common.truth.Truth.assertThat
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetControllerTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetControllerTest.kt
deleted file mode 100644
index 2ac7791..0000000
--- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetControllerTest.kt
+++ /dev/null
@@ -1,180 +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.bubbles.bar
-
-import android.content.Context
-import android.graphics.Insets
-import android.graphics.Rect
-import android.view.View
-import android.view.WindowManager
-import android.widget.FrameLayout
-import androidx.core.animation.AnimatorTestRule
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import androidx.test.platform.app.InstrumentationRegistry
-import com.android.internal.protolog.common.ProtoLog
-import com.android.wm.shell.R
-import com.android.wm.shell.bubbles.BubblePositioner
-import com.android.wm.shell.bubbles.DeviceConfig
-import com.android.wm.shell.bubbles.bar.BubbleBarDropTargetController.Companion.DROP_TARGET_ALPHA_IN_DURATION
-import com.android.wm.shell.bubbles.bar.BubbleBarDropTargetController.Companion.DROP_TARGET_ALPHA_OUT_DURATION
-import com.android.wm.shell.bubbles.bar.BubbleBarDropTargetController.Companion.DROP_TARGET_SCALE
-import com.android.wm.shell.common.bubbles.BubbleBarLocation
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.ClassRule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/** Tests for [BubbleBarDropTargetController] */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class BubbleBarDropTargetControllerTest {
-
-    companion object {
-        @JvmField @ClassRule val animatorTestRule: AnimatorTestRule = AnimatorTestRule()
-    }
-
-    private val context = ApplicationProvider.getApplicationContext<Context>()
-    private lateinit var controller: BubbleBarDropTargetController
-    private lateinit var positioner: BubblePositioner
-    private lateinit var container: FrameLayout
-
-    @Before
-    fun setUp() {
-        ProtoLog.REQUIRE_PROTOLOGTOOL = false
-        container = FrameLayout(context)
-        val windowManager = context.getSystemService(WindowManager::class.java)
-        positioner = BubblePositioner(context, windowManager)
-        positioner.setShowingInBubbleBar(true)
-        val deviceConfig =
-            DeviceConfig(
-                windowBounds = Rect(0, 0, 2000, 2600),
-                isLargeScreen = true,
-                isSmallTablet = false,
-                isLandscape = true,
-                isRtl = false,
-                insets = Insets.of(10, 20, 30, 40)
-            )
-        positioner.update(deviceConfig)
-        positioner.bubbleBarBounds = Rect(1800, 2400, 1970, 2560)
-
-        controller = BubbleBarDropTargetController(context, container, positioner)
-    }
-
-    @Test
-    fun show_moveLeftToRight_isVisibleWithExpectedBounds() {
-        val expectedBoundsOnLeft = getExpectedDropTargetBounds(onLeft = true)
-        val expectedBoundsOnRight = getExpectedDropTargetBounds(onLeft = false)
-
-        runOnMainSync { controller.show(BubbleBarLocation.LEFT) }
-        waitForAnimateIn()
-        val viewOnLeft = getDropTargetView()
-        assertThat(viewOnLeft).isNotNull()
-        assertThat(viewOnLeft!!.alpha).isEqualTo(1f)
-        assertThat(viewOnLeft.layoutParams.width).isEqualTo(expectedBoundsOnLeft.width())
-        assertThat(viewOnLeft.layoutParams.height).isEqualTo(expectedBoundsOnLeft.height())
-        assertThat(viewOnLeft.x).isEqualTo(expectedBoundsOnLeft.left)
-        assertThat(viewOnLeft.y).isEqualTo(expectedBoundsOnLeft.top)
-
-        runOnMainSync { controller.show(BubbleBarLocation.RIGHT) }
-        waitForAnimateOut()
-        waitForAnimateIn()
-        val viewOnRight = getDropTargetView()
-        assertThat(viewOnRight).isNotNull()
-        assertThat(viewOnRight!!.alpha).isEqualTo(1f)
-        assertThat(viewOnRight.layoutParams.width).isEqualTo(expectedBoundsOnRight.width())
-        assertThat(viewOnRight.layoutParams.height).isEqualTo(expectedBoundsOnRight.height())
-        assertThat(viewOnRight.x).isEqualTo(expectedBoundsOnRight.left)
-        assertThat(viewOnRight.y).isEqualTo(expectedBoundsOnRight.top)
-    }
-
-    @Test
-    fun toggleSetHidden_dropTargetShown_updatesAlpha() {
-        runOnMainSync { controller.show(BubbleBarLocation.RIGHT) }
-        waitForAnimateIn()
-        val view = getDropTargetView()
-        assertThat(view).isNotNull()
-        assertThat(view!!.alpha).isEqualTo(1f)
-
-        runOnMainSync { controller.setHidden(true) }
-        waitForAnimateOut()
-        val hiddenView = getDropTargetView()
-        assertThat(hiddenView).isNotNull()
-        assertThat(hiddenView!!.alpha).isEqualTo(0f)
-
-        runOnMainSync { controller.setHidden(false) }
-        waitForAnimateIn()
-        val shownView = getDropTargetView()
-        assertThat(shownView).isNotNull()
-        assertThat(shownView!!.alpha).isEqualTo(1f)
-    }
-
-    @Test
-    fun toggleSetHidden_dropTargetNotShown_viewNotCreated() {
-        runOnMainSync { controller.setHidden(true) }
-        waitForAnimateOut()
-        assertThat(getDropTargetView()).isNull()
-        runOnMainSync { controller.setHidden(false) }
-        waitForAnimateIn()
-        assertThat(getDropTargetView()).isNull()
-    }
-
-    @Test
-    fun dismiss_dropTargetShown_viewRemoved() {
-        runOnMainSync { controller.show(BubbleBarLocation.LEFT) }
-        waitForAnimateIn()
-        assertThat(getDropTargetView()).isNotNull()
-        runOnMainSync { controller.dismiss() }
-        waitForAnimateOut()
-        assertThat(getDropTargetView()).isNull()
-    }
-
-    @Test
-    fun dismiss_dropTargetNotShown_doesNothing() {
-        runOnMainSync { controller.dismiss() }
-        waitForAnimateOut()
-        assertThat(getDropTargetView()).isNull()
-    }
-
-    private fun getDropTargetView(): View? = container.findViewById(R.id.bubble_bar_drop_target)
-
-    private fun getExpectedDropTargetBounds(onLeft: Boolean): Rect {
-        val rect = Rect()
-        positioner.getBubbleBarExpandedViewBounds(onLeft, false /* isOveflowExpanded */, rect)
-        // Scale the rect to expected size, but keep the center point the same
-        val centerX = rect.centerX()
-        val centerY = rect.centerY()
-        rect.scale(DROP_TARGET_SCALE)
-        rect.offset(centerX - rect.centerX(), centerY - rect.centerY())
-        return rect
-    }
-
-    private fun runOnMainSync(runnable: Runnable) {
-        InstrumentationRegistry.getInstrumentation().runOnMainSync(runnable)
-    }
-
-    private fun waitForAnimateIn() {
-        // Advance animator for on-device test
-        runOnMainSync { animatorTestRule.advanceTimeBy(DROP_TARGET_ALPHA_IN_DURATION) }
-    }
-
-    private fun waitForAnimateOut() {
-        // Advance animator for on-device test
-        runOnMainSync { animatorTestRule.advanceTimeBy(DROP_TARGET_ALPHA_OUT_DURATION) }
-    }
-}
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinControllerTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinControllerTest.kt
new file mode 100644
index 0000000..e1bf40c
--- /dev/null
+++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinControllerTest.kt
@@ -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.wm.shell.bubbles.bar
+
+import android.content.Context
+import android.graphics.Insets
+import android.graphics.PointF
+import android.graphics.Rect
+import android.view.View
+import android.view.WindowManager
+import android.widget.FrameLayout
+import androidx.core.animation.AnimatorTestRule
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.internal.protolog.common.ProtoLog
+import com.android.wm.shell.R
+import com.android.wm.shell.bubbles.BubblePositioner
+import com.android.wm.shell.bubbles.DeviceConfig
+import com.android.wm.shell.bubbles.bar.BubbleExpandedViewPinController.Companion.DROP_TARGET_SCALE
+import com.android.wm.shell.common.bubbles.BaseBubblePinController
+import com.android.wm.shell.common.bubbles.BaseBubblePinController.Companion.DROP_TARGET_ALPHA_IN_DURATION
+import com.android.wm.shell.common.bubbles.BaseBubblePinController.Companion.DROP_TARGET_ALPHA_OUT_DURATION
+import com.android.wm.shell.common.bubbles.BubbleBarLocation
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.ClassRule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** Tests for [BubbleExpandedViewPinController] */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class BubbleExpandedViewPinControllerTest {
+
+    companion object {
+        @JvmField @ClassRule val animatorTestRule: AnimatorTestRule = AnimatorTestRule()
+
+        const val SCREEN_WIDTH = 2000
+        const val SCREEN_HEIGHT = 1000
+
+        const val BUBBLE_BAR_WIDTH = 100
+        const val BUBBLE_BAR_HEIGHT = 50
+    }
+
+    private val context = ApplicationProvider.getApplicationContext<Context>()
+    private lateinit var positioner: BubblePositioner
+    private lateinit var container: FrameLayout
+
+    private lateinit var controller: BubbleExpandedViewPinController
+    private lateinit var testListener: TestLocationChangeListener
+
+    private val pointOnLeft = PointF(100f, 100f)
+    private val pointOnRight = PointF(1900f, 500f)
+
+    @Before
+    fun setUp() {
+        ProtoLog.REQUIRE_PROTOLOGTOOL = false
+        container = FrameLayout(context)
+        val windowManager = context.getSystemService(WindowManager::class.java)
+        positioner = BubblePositioner(context, windowManager)
+        positioner.setShowingInBubbleBar(true)
+        val deviceConfig =
+            DeviceConfig(
+                windowBounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT),
+                isLargeScreen = true,
+                isSmallTablet = false,
+                isLandscape = true,
+                isRtl = false,
+                insets = Insets.of(10, 20, 30, 40)
+            )
+        positioner.update(deviceConfig)
+        positioner.bubbleBarBounds =
+            Rect(
+                SCREEN_WIDTH - deviceConfig.insets.right - BUBBLE_BAR_WIDTH,
+                SCREEN_HEIGHT - deviceConfig.insets.bottom - BUBBLE_BAR_HEIGHT,
+                SCREEN_WIDTH - deviceConfig.insets.right,
+                SCREEN_HEIGHT - deviceConfig.insets.bottom
+            )
+
+        controller = BubbleExpandedViewPinController(context, container, positioner)
+        testListener = TestLocationChangeListener()
+        controller.setListener(testListener)
+    }
+
+    @After
+    fun tearDown() {
+        runOnMainSync { controller.onDragEnd() }
+        waitForAnimateOut()
+    }
+
+    @Test
+    fun onDragUpdate_stayOnSameSide() {
+        runOnMainSync {
+            controller.onDragStart(initialLocationOnLeft = false)
+            controller.onDragUpdate(pointOnRight.x, pointOnRight.y)
+        }
+        waitForAnimateIn()
+        assertThat(dropTargetView).isNull()
+        assertThat(testListener.locationChanges).isEmpty()
+    }
+
+    @Test
+    fun onDragUpdate_toLeft() {
+        runOnMainSync {
+            controller.onDragStart(initialLocationOnLeft = false)
+            controller.onDragUpdate(pointOnLeft.x, pointOnLeft.y)
+        }
+        waitForAnimateIn()
+
+        assertThat(dropTargetView).isNotNull()
+        assertThat(dropTargetView!!.alpha).isEqualTo(1f)
+
+        val expectedDropTargetBounds = getExpectedDropTargetBounds(onLeft = true)
+        assertThat(dropTargetView!!.layoutParams.width).isEqualTo(expectedDropTargetBounds.width())
+        assertThat(dropTargetView!!.layoutParams.height)
+            .isEqualTo(expectedDropTargetBounds.height())
+
+        assertThat(testListener.locationChanges).containsExactly(BubbleBarLocation.LEFT)
+    }
+
+    @Test
+    fun onDragUpdate_toLeftAndBackToRight() {
+        runOnMainSync {
+            controller.onDragStart(initialLocationOnLeft = false)
+            controller.onDragUpdate(pointOnLeft.x, pointOnLeft.y)
+        }
+        waitForAnimateIn()
+        assertThat(dropTargetView).isNotNull()
+
+        runOnMainSync { controller.onDragUpdate(pointOnRight.x, pointOnRight.y) }
+        // We have to wait for existing drop target to animate out and new to animate in
+        waitForAnimateOut()
+        waitForAnimateIn()
+
+        assertThat(dropTargetView).isNotNull()
+        assertThat(dropTargetView!!.alpha).isEqualTo(1f)
+
+        val expectedDropTargetBounds = getExpectedDropTargetBounds(onLeft = false)
+        assertThat(dropTargetView!!.layoutParams.width).isEqualTo(expectedDropTargetBounds.width())
+        assertThat(dropTargetView!!.layoutParams.height)
+            .isEqualTo(expectedDropTargetBounds.height())
+
+        assertThat(testListener.locationChanges)
+            .containsExactly(BubbleBarLocation.LEFT, BubbleBarLocation.RIGHT)
+    }
+
+    @Test
+    fun onDragUpdate_toLeftInExclusionRect() {
+        runOnMainSync {
+            controller.onDragStart(initialLocationOnLeft = false)
+            // Exclusion rect is around the bottom center area of the screen
+            controller.onDragUpdate(SCREEN_WIDTH / 2f - 50, SCREEN_HEIGHT - 100f)
+        }
+        waitForAnimateIn()
+        assertThat(dropTargetView).isNull()
+        assertThat(testListener.locationChanges).isEmpty()
+    }
+
+    @Test
+    fun toggleSetDropTargetHidden_dropTargetExists() {
+        runOnMainSync {
+            controller.onDragStart(initialLocationOnLeft = false)
+            controller.onDragUpdate(pointOnLeft.x, pointOnLeft.y)
+        }
+        waitForAnimateIn()
+
+        assertThat(dropTargetView).isNotNull()
+        assertThat(dropTargetView!!.alpha).isEqualTo(1f)
+
+        runOnMainSync { controller.setDropTargetHidden(true) }
+        waitForAnimateOut()
+        assertThat(dropTargetView).isNotNull()
+        assertThat(dropTargetView!!.alpha).isEqualTo(0f)
+
+        runOnMainSync { controller.setDropTargetHidden(false) }
+        waitForAnimateIn()
+        assertThat(dropTargetView).isNotNull()
+        assertThat(dropTargetView!!.alpha).isEqualTo(1f)
+    }
+
+    @Test
+    fun toggleSetDropTargetHidden_noDropTarget() {
+        runOnMainSync { controller.setDropTargetHidden(true) }
+        waitForAnimateOut()
+        assertThat(dropTargetView).isNull()
+
+        runOnMainSync { controller.setDropTargetHidden(false) }
+        waitForAnimateIn()
+        assertThat(dropTargetView).isNull()
+    }
+
+    @Test
+    fun onDragEnd_dropTargetExists() {
+        runOnMainSync {
+            controller.onDragStart(initialLocationOnLeft = false)
+            controller.onDragUpdate(pointOnLeft.x, pointOnLeft.y)
+        }
+        waitForAnimateIn()
+        assertThat(dropTargetView).isNotNull()
+
+        runOnMainSync { controller.onDragEnd() }
+        waitForAnimateOut()
+        assertThat(dropTargetView).isNull()
+    }
+
+    @Test
+    fun onDragEnd_noDropTarget() {
+        runOnMainSync { controller.onDragEnd() }
+        waitForAnimateOut()
+        assertThat(dropTargetView).isNull()
+    }
+
+    private val dropTargetView: View?
+        get() = container.findViewById(R.id.bubble_bar_drop_target)
+
+    private fun getExpectedDropTargetBounds(onLeft: Boolean): Rect {
+        val rect = Rect()
+        positioner.getBubbleBarExpandedViewBounds(onLeft, false /* isOveflowExpanded */, rect)
+        // Scale the rect to expected size, but keep the center point the same
+        val centerX = rect.centerX()
+        val centerY = rect.centerY()
+        rect.scale(DROP_TARGET_SCALE)
+        rect.offset(centerX - rect.centerX(), centerY - rect.centerY())
+        return rect
+    }
+
+    private fun runOnMainSync(runnable: Runnable) {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(runnable)
+    }
+
+    private fun waitForAnimateIn() {
+        // Advance animator for on-device test
+        runOnMainSync { animatorTestRule.advanceTimeBy(DROP_TARGET_ALPHA_IN_DURATION) }
+    }
+
+    private fun waitForAnimateOut() {
+        // Advance animator for on-device test
+        runOnMainSync { animatorTestRule.advanceTimeBy(DROP_TARGET_ALPHA_OUT_DURATION) }
+    }
+
+    internal class TestLocationChangeListener : BaseBubblePinController.LocationChangeListener {
+        val locationChanges = mutableListOf<BubbleBarLocation>()
+        override fun onChange(location: BubbleBarLocation) {
+            locationChanges.add(location)
+        }
+    }
+}
diff --git a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml b/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml
index 65f5239..640d184 100644
--- a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml
+++ b/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml
@@ -14,15 +14,13 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License
 -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
     <item android:state_pressed="true"
-        android:color="@color/desktop_mode_maximize_menu_button_on_hover"/>
-    <item android:state_hovered="true"
-        android:color="@color/desktop_mode_maximize_menu_button_on_hover"/>
+        android:color="?androidprv:attr/colorAccentPrimary"/>
     <item android:state_focused="true"
-        android:color="@color/desktop_mode_maximize_menu_button_on_hover"/>
+        android:color="?androidprv:attr/colorAccentPrimary"/>
     <item android:state_selected="true"
-        android:color="@color/desktop_mode_maximize_menu_button_on_hover"/>
-    <item android:color="@color/desktop_mode_maximize_menu_button"/>
+        android:color="?androidprv:attr/colorAccentPrimary"/>
+    <item android:color="?androidprv:attr/materialColorOutlineVariant"/>
 </selector>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_outline_color_selector.xml b/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_outline_color_selector.xml
deleted file mode 100644
index 86679af..0000000
--- a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_outline_color_selector.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_pressed="true"
-        android:color="@color/desktop_mode_maximize_menu_button_outline_on_hover"/>
-    <item android:state_hovered="true"
-        android:color="@color/desktop_mode_maximize_menu_button_outline_on_hover"/>
-    <item android:state_focused="true"
-        android:color="@color/desktop_mode_maximize_menu_button_outline_on_hover"/>
-    <item android:state_selected="true"
-        android:color="@color/desktop_mode_maximize_menu_button_outline_on_hover"/>
-    <item android:color="@color/desktop_mode_maximize_menu_button_outline"/>
-</selector>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_button_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_button_background.xml
new file mode 100644
index 0000000..ed51498
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_button_background.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/desktop_mode_maximize_menu_button_color_selector"/>
+    <corners
+        android:radius="@dimen/desktop_mode_maximize_menu_buttons_radius"/>
+</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml
new file mode 100644
index 0000000..04ad572
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:shape="rectangle">
+    <corners
+        android:radius="@dimen/desktop_mode_maximize_menu_buttons_outline_radius"/>
+    <stroke android:width="1dp" android:color="?androidprv:attr/materialColorOutlineVariant"/>
+</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background_on_hover.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background_on_hover.xml
new file mode 100644
index 0000000..86da9fe
--- /dev/null
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background_on_hover.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:shape="rectangle">
+    <corners
+        android:radius="@dimen/desktop_mode_maximize_menu_buttons_outline_radius"/>
+    <stroke android:width="1dp" android:color="?androidprv:attr/colorAccentPrimary"/>
+</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml
deleted file mode 100644
index bfb0dd7..0000000
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <solid android:color="@color/desktop_mode_maximize_menu_button_color_selector"/>
-    <corners
-        android:radius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"/>
-    <stroke android:width="1dp" android:color="@color/desktop_mode_maximize_menu_button_outline_color_selector"/>
-</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_left_button_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_left_button_background.xml
deleted file mode 100644
index 6630fca..0000000
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_left_button_background.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
-  ~ 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
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <solid android:color="@color/desktop_mode_maximize_menu_button_color_selector"/>
-    <corners
-        android:topLeftRadius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"
-        android:topRightRadius="@dimen/desktop_mode_maximize_menu_buttons_small_corner_radius"
-        android:bottomLeftRadius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"
-        android:bottomRightRadius="@dimen/desktop_mode_maximize_menu_buttons_small_corner_radius"/>
-    <stroke android:width="1dp" android:color="@color/desktop_mode_maximize_menu_button_outline_color_selector"/>
-</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_right_button_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_right_button_background.xml
deleted file mode 100644
index 7bd6e99..0000000
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_right_button_background.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
-  ~ 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
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="rectangle">
-    <solid android:color="@color/desktop_mode_maximize_menu_button_color_selector"/>
-    <corners
-        android:topLeftRadius="@dimen/desktop_mode_maximize_menu_buttons_small_corner_radius"
-        android:topRightRadius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"
-        android:bottomLeftRadius="@dimen/desktop_mode_maximize_menu_buttons_small_corner_radius"
-        android:bottomRightRadius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"/>
-    <stroke android:width="1dp" android:color="@color/desktop_mode_maximize_menu_button_outline_color_selector"/>
-</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_resize_veil_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_resize_veil_background.xml
deleted file mode 100644
index 1f3e3a4..0000000
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_resize_veil_background.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-<shape android:shape="rectangle"
-       xmlns:android="http://schemas.android.com/apk/res/android">
-    <solid android:color="@android:color/white" />
-</shape>
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_focused_window_decor.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_focused_window_decor.xml
index ef7478c..c0ff192 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_focused_window_decor.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_focused_window_decor.xml
@@ -22,14 +22,15 @@
     android:layout_height="wrap_content"
     android:gravity="center_horizontal">
 
-    <ImageButton
+    <com.android.wm.shell.windowdecor.HandleImageButton
         android:id="@+id/caption_handle"
         android:layout_width="@dimen/desktop_mode_fullscreen_decor_caption_width"
         android:layout_height="@dimen/desktop_mode_fullscreen_decor_caption_height"
         android:paddingVertical="16dp"
+        android:paddingHorizontal="10dp"
         android:contentDescription="@string/handle_text"
         android:src="@drawable/decor_handle_dark"
         tools:tint="@color/desktop_mode_caption_handle_bar_dark"
         android:scaleType="fitXY"
-        android:background="?android:selectableItemBackground"/>
+        android:background="@android:color/transparent"/>
 </com.android.wm.shell.windowdecor.WindowDecorLinearLayout>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_resize_veil.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_resize_veil.xml
index a4bbd89..147f991 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_resize_veil.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_resize_veil.xml
@@ -16,13 +16,12 @@
   -->
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:background="@drawable/desktop_mode_resize_veil_background">
+              android:layout_height="match_parent">
 
     <ImageView
         android:id="@+id/veil_application_icon"
-        android:layout_width="96dp"
-        android:layout_height="96dp"
+        android:layout_width="@dimen/desktop_mode_resize_veil_icon_size"
+        android:layout_height="@dimen/desktop_mode_resize_veil_icon_size"
         android:layout_gravity="center"
         android:contentDescription="@string/app_icon_text" />
 </FrameLayout>
\ No newline at end of file
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 fca2fe4..d5724cc 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
@@ -52,7 +52,7 @@
             android:textStyle="normal"
             android:layout_weight="1"/>
 
-        <ImageButton
+        <com.android.wm.shell.windowdecor.HandleMenuImageButton
             android:id="@+id/collapse_menu_button"
             android:layout_width="32dp"
             android:layout_height="32dp"
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
index dbfd6e5..9f0a425 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
@@ -15,41 +15,87 @@
   ~ 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:id="@+id/maximize_menu"
     style="?android:attr/buttonBarStyle"
     android:layout_width="@dimen/desktop_mode_maximize_menu_width"
     android:layout_height="@dimen/desktop_mode_maximize_menu_height"
     android:orientation="horizontal"
     android:gravity="center"
+    android:padding="16dp"
     android:background="@drawable/desktop_mode_maximize_menu_background">
 
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
 
-    <Button
-        android:id="@+id/maximize_menu_maximize_button"
-        style="?android:attr/buttonBarButtonStyle"
-        android:layout_width="120dp"
-        android:layout_height="80dp"
-        android:layout_marginRight="15dp"
-        android:color="@color/desktop_mode_maximize_menu_button"
-        android:background="@drawable/desktop_mode_maximize_menu_maximize_button_background"
-        android:stateListAnimator="@null"/>
+        <FrameLayout
+            android:id="@+id/maximize_menu_maximize_button_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@drawable/desktop_mode_maximize_menu_layout_background"
+            android:padding="4dp"
+            android:layout_marginRight="8dp"
+            android:layout_marginBottom="4dp">
+            <Button
+                android:id="@+id/maximize_menu_maximize_button"
+                style="?android:attr/buttonBarButtonStyle"
+                android:layout_width="86dp"
+                android:layout_height="@dimen/desktop_mode_maximize_menu_button_height"
+                android:background="@drawable/desktop_mode_maximize_menu_button_background"
+                android:stateListAnimator="@null"/>
+        </FrameLayout>
 
-    <Button
-        android:id="@+id/maximize_menu_snap_left_button"
-        style="?android:attr/buttonBarButtonStyle"
-        android:layout_width="58dp"
-        android:layout_height="80dp"
-        android:layout_marginRight="6dp"
-        android:color="@color/desktop_mode_maximize_menu_button"
-        android:background="@drawable/desktop_mode_maximize_menu_snap_left_button_background"
-        android:stateListAnimator="@null"/>
+        <TextView
+            android:layout_width="94dp"
+            android:layout_height="18dp"
+            android:textSize="11sp"
+            android:layout_marginBottom="76dp"
+            android:gravity="center"
+            android:fontFamily="google-sans-text"
+            android:text="@string/desktop_mode_maximize_menu_maximize_text"
+            android:textColor="?androidprv:attr/materialColorOnSurface"/>
+    </LinearLayout>
 
-    <Button
-        android:id="@+id/maximize_menu_snap_right_button"
-        style="?android:attr/buttonBarButtonStyle"
-        android:layout_width="58dp"
-        android:layout_height="80dp"
-        android:color="@color/desktop_mode_maximize_menu_button"
-        android:background="@drawable/desktop_mode_maximize_menu_snap_right_button_background"
-        android:stateListAnimator="@null"/>
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+        <LinearLayout
+            android:id="@+id/maximize_menu_snap_menu_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:padding="4dp"
+            android:background="@drawable/desktop_mode_maximize_menu_layout_background"
+            android:layout_marginBottom="4dp">
+            <Button
+                android:id="@+id/maximize_menu_snap_left_button"
+                style="?android:attr/buttonBarButtonStyle"
+                android:layout_width="41dp"
+                android:layout_height="@dimen/desktop_mode_maximize_menu_button_height"
+                android:layout_marginRight="4dp"
+                android:background="@drawable/desktop_mode_maximize_menu_button_background"
+                android:stateListAnimator="@null"/>
+
+            <Button
+                android:id="@+id/maximize_menu_snap_right_button"
+                style="?android:attr/buttonBarButtonStyle"
+                android:layout_width="41dp"
+                android:layout_height="@dimen/desktop_mode_maximize_menu_button_height"
+                android:background="@drawable/desktop_mode_maximize_menu_button_background"
+                android:stateListAnimator="@null"/>
+        </LinearLayout>
+        <TextView
+            android:layout_width="94dp"
+            android:layout_height="18dp"
+            android:textSize="11sp"
+            android:layout_marginBottom="76dp"
+            android:layout_gravity="center"
+            android:gravity="center"
+            android:fontFamily="google-sans-text"
+            android:text="@string/desktop_mode_maximize_menu_snap_text"
+            android:textColor="?androidprv:attr/materialColorOnSurface"/>
+    </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml
index f7d49908..9a26b7e 100644
--- a/libs/WindowManager/Shell/res/values-ne/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ne/strings.xml
@@ -35,7 +35,7 @@
     <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"यो एप स्प्लिट स्क्रिन मोडमा प्रयोग गर्न मिल्दैन"</string>
     <string name="dock_multi_instances_not_supported_text" msgid="5011042177901502928">"यो एप एउटा विन्डोमा मात्र खोल्न मिल्छ"</string>
     <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"यो एपले सहायक प्रदर्शनमा काम नगर्नसक्छ।"</string>
-    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"अनुप्रयोगले सहायक प्रदर्शनहरूमा लञ्च सुविधालाई समर्थन गर्दैन।"</string>
+    <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"एपले सहायक प्रदर्शनहरूमा लञ्च सुविधालाई समर्थन गर्दैन।"</string>
     <string name="accessibility_divider" msgid="6407584574218956849">"स्प्लिट स्क्रिन डिभाइडर"</string>
     <string name="divider_title" msgid="1963391955593749442">"स्प्लिट स्क्रिन डिभाइडर"</string>
     <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"बायाँ भाग फुल स्क्रिन"</string>
diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
index 49935ad..ba24d7b 100644
--- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
@@ -52,10 +52,10 @@
     <string name="accessibility_split_right" msgid="8441001008181296837">"Dividir para a direita"</string>
     <string name="accessibility_split_top" msgid="2789329702027147146">"Dividir para cima"</string>
     <string name="accessibility_split_bottom" msgid="8694551025220868191">"Dividir para baixo"</string>
-    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Como usar o modo para uma mão"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Como usar o modo uma mão"</string>
     <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para sair, deslize de baixo para cima na tela ou toque em qualquer lugar acima do app"</string>
-    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar o modo para uma mão"</string>
-    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Sair do modo para uma mão"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar o modo uma mão"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Sair do modo uma mão"</string>
     <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Configurações de balões do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menu flutuante"</string>
     <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Devolver à pilha"</string>
diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml
index 49935ad..ba24d7b 100644
--- a/libs/WindowManager/Shell/res/values-pt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt/strings.xml
@@ -52,10 +52,10 @@
     <string name="accessibility_split_right" msgid="8441001008181296837">"Dividir para a direita"</string>
     <string name="accessibility_split_top" msgid="2789329702027147146">"Dividir para cima"</string>
     <string name="accessibility_split_bottom" msgid="8694551025220868191">"Dividir para baixo"</string>
-    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Como usar o modo para uma mão"</string>
+    <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Como usar o modo uma mão"</string>
     <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para sair, deslize de baixo para cima na tela ou toque em qualquer lugar acima do app"</string>
-    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar o modo para uma mão"</string>
-    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Sair do modo para uma mão"</string>
+    <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar o modo uma mão"</string>
+    <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Sair do modo uma mão"</string>
     <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Configurações de balões do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menu flutuante"</string>
     <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Devolver à pilha"</string>
diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml
index 593c8fc..9be3f33 100644
--- a/libs/WindowManager/Shell/res/values-te/strings.xml
+++ b/libs/WindowManager/Shell/res/values-te/strings.xml
@@ -17,7 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="pip_phone_close" msgid="5783752637260411309">"మూసివేయి"</string>
+    <string name="pip_phone_close" msgid="5783752637260411309">"మూసివేయండి"</string>
     <string name="pip_phone_expand" msgid="2579292903468287504">"విస్తరింపజేయి"</string>
     <string name="pip_phone_settings" msgid="5468987116750491918">"సెట్టింగ్‌లు"</string>
     <string name="pip_menu_title" msgid="5393619322111827096">"మెనూ"</string>
diff --git a/libs/WindowManager/Shell/res/values/colors.xml b/libs/WindowManager/Shell/res/values/colors.xml
index 758dbfd..cf18da6 100644
--- a/libs/WindowManager/Shell/res/values/colors.xml
+++ b/libs/WindowManager/Shell/res/values/colors.xml
@@ -62,10 +62,6 @@
     <color name="desktop_mode_caption_handle_bar_dark">#1C1C17</color>
     <color name="desktop_mode_resize_veil_light">#EFF1F2</color>
     <color name="desktop_mode_resize_veil_dark">#1C1C17</color>
-    <color name="desktop_mode_maximize_menu_button">#DDDACD</color>
-    <color name="desktop_mode_maximize_menu_button_outline">#797869</color>
-    <color name="desktop_mode_maximize_menu_button_outline_on_hover">#606219</color>
-    <color name="desktop_mode_maximize_menu_button_on_hover">#E7E790</color>
     <color name="desktop_mode_maximize_menu_progress_light">#33000000</color>
     <color name="desktop_mode_maximize_menu_progress_dark">#33FFFFFF</color>
     <color name="desktop_mode_caption_button_on_hover_light">#11000000</color>
diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml
index c68b0be..c2ba064 100644
--- a/libs/WindowManager/Shell/res/values/config.xml
+++ b/libs/WindowManager/Shell/res/values/config.xml
@@ -45,9 +45,6 @@
     <!-- Allow PIP to resize to a slightly bigger state upon touch/showing the menu -->
     <bool name="config_pipEnableResizeForMenu">true</bool>
 
-    <!-- PiP minimum size, which is a % based off the shorter side of display width and height -->
-    <fraction name="config_pipShortestEdgePercent">40%</fraction>
-
     <!-- Time (duration in milliseconds) that the shell waits for an app to close the PiP by itself
          if a custom action is present before closing it. -->
     <integer name="config_pipForceCloseDelay">1000</integer>
@@ -91,11 +88,45 @@
         16x16
     </string>
 
+    <!-- Default percentages for the PIP size logic.
+         1. Determine max widths
+         Subtract width of system UI and default padding from the shortest edge of the device.
+         This is the max width.
+         2. Calculate Default and Mins
+         Default is config_pipSystemPreferredDefaultSizePercent of max-width/height.
+         Min is config_pipSystemPreferredMinimumSizePercent of it. -->
+    <item name="config_pipSystemPreferredDefaultSizePercent" format="float" type="dimen">0.6</item>
+    <item name="config_pipSystemPreferredMinimumSizePercent" format="float" type="dimen">0.5</item>
+    <!-- Default percentages for the PIP size logic when the Display is close to square.
+         This is used instead when the display is square-ish, like fold-ables when unfolded,
+         to make sure that default PiP does not cover the hinge (halfway of the display).
+         0. Determine if the display is square-ish
+         If min(displayWidth, displayHeight) / max(displayWidth, displayHeight) is greater than
+         config_pipSquareDisplayThresholdForSystemPreferredSize, we use the percent for
+         square display listed below.
+         1. Determine max widths
+         Subtract width of system UI and default padding from the shortest edge of the device.
+         This is the max width.
+         2. Calculate Default and Mins
+         Default is config_pipSystemPreferredDefaultSizePercentForSquareDisplay of max-width/height.
+         Min is config_pipSystemPreferredMinimumSizePercentForSquareDisplay of it. -->
+    <item name="config_pipSquareDisplayThresholdForSystemPreferredSize"
+        format="float" type="dimen">0.95</item>
+    <item name="config_pipSystemPreferredDefaultSizePercentForSquareDisplay"
+        format="float" type="dimen">0.5</item>
+    <item name="config_pipSystemPreferredMinimumSizePercentForSquareDisplay"
+        format="float" type="dimen">0.4</item>
+
     <!-- The percentage of the screen width to use for the default width or height of
          picture-in-picture windows. Regardless of the percent set here, calculated size will never
-         be smaller than @dimen/default_minimal_size_pip_resizable_task. -->
+         be smaller than @dimen/default_minimal_size_pip_resizable_task.
+         This is used in legacy spec, use config_pipSystemPreferredDefaultSizePercent instead. -->
     <item name="config_pictureInPictureDefaultSizePercent" format="float" type="dimen">0.23</item>
 
+    <!-- PiP minimum size, which is a % based off the shorter side of display width and height.
+         This is used in legacy spec, use config_pipSystemPreferredMinimumSizePercent instead. -->
+    <fraction name="config_pipShortestEdgePercent">40%</fraction>
+
     <!-- The default aspect ratio for picture-in-picture windows. -->
     <item name="config_pictureInPictureDefaultAspectRatio" format="float" type="dimen">
         1.777778
@@ -148,7 +179,4 @@
 
     <!-- Whether pointer pilfer is required to start back animation. -->
     <bool name="config_backAnimationRequiresPointerPilfer">true</bool>
-
-    <!-- Whether desktop mode is supported on the current device  -->
-    <bool name="config_isDesktopModeSupported">false</bool>
 </resources>
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index c032a81..6d5bf62 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -423,8 +423,9 @@
     <!-- Height of desktop mode caption for fullscreen tasks. -->
     <dimen name="desktop_mode_fullscreen_decor_caption_height">36dp</dimen>
 
-    <!-- Width of desktop mode caption for fullscreen tasks. -->
-    <dimen name="desktop_mode_fullscreen_decor_caption_width">128dp</dimen>
+    <!-- Width of desktop mode caption for fullscreen tasks.
+        80 dp for handle + 20 dp for room to grow on the sides when hovered. -->
+    <dimen name="desktop_mode_fullscreen_decor_caption_width">100dp</dimen>
 
     <!-- Required empty space to be visible for partially offscreen tasks. -->
     <dimen name="freeform_required_visible_empty_space_in_header">48dp</dimen>
@@ -456,16 +457,19 @@
     <dimen name="desktop_mode_customizable_caption_margin_end">152dp</dimen>
 
     <!-- The width of the maximize menu in desktop mode. -->
-    <dimen name="desktop_mode_maximize_menu_width">287dp</dimen>
+    <dimen name="desktop_mode_maximize_menu_width">228dp</dimen>
 
     <!-- The height of the maximize menu in desktop mode. -->
-    <dimen name="desktop_mode_maximize_menu_height">112dp</dimen>
+    <dimen name="desktop_mode_maximize_menu_height">114dp</dimen>
 
-    <!-- The larger of the two corner radii of the maximize menu buttons. -->
-    <dimen name="desktop_mode_maximize_menu_buttons_large_corner_radius">4dp</dimen>
+    <!-- The height of the buttons in the maximize menu. -->
+    <dimen name="desktop_mode_maximize_menu_button_height">52dp</dimen>
 
-    <!-- The smaller of the two corner radii of the maximize menu buttons. -->
-    <dimen name="desktop_mode_maximize_menu_buttons_small_corner_radius">2dp</dimen>
+    <!-- The radius of the maximize menu buttons. -->
+    <dimen name="desktop_mode_maximize_menu_buttons_radius">4dp</dimen>
+
+    <!-- The radius of the layout outline around the maximize menu buttons. -->
+    <dimen name="desktop_mode_maximize_menu_buttons_outline_radius">6dp</dimen>
 
     <!-- The corner radius of the maximize menu. -->
     <dimen name="desktop_mode_maximize_menu_corner_radius">8dp</dimen>
@@ -506,6 +510,9 @@
     <!-- The radius of the caption menu shadow. -->
     <dimen name="desktop_mode_handle_menu_shadow_radius">2dp</dimen>
 
+    <!-- The size of the icon shown in the resize veil. -->
+    <dimen name="desktop_mode_resize_veil_icon_size">96dp</dimen>
+
     <dimen name="freeform_resize_handle">15dp</dimen>
 
     <dimen name="freeform_resize_corner">44dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values/strings.xml b/libs/WindowManager/Shell/res/values/strings.xml
index 812a81b..bf654d9 100644
--- a/libs/WindowManager/Shell/res/values/strings.xml
+++ b/libs/WindowManager/Shell/res/values/strings.xml
@@ -280,4 +280,8 @@
     <string name="collapse_menu_text">Close Menu</string>
     <!-- Accessibility text for the handle menu open menu button [CHAR LIMIT=NONE] -->
     <string name="expand_menu_text">Open Menu</string>
+    <!-- Maximize menu maximize button string. -->
+    <string name="desktop_mode_maximize_menu_maximize_text">Maximize Screen</string>
+    <!-- Maximize menu snap buttons string. -->
+    <string name="desktop_mode_maximize_menu_snap_text">Snap Screen</string>
 </resources>
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IHomeTransitionListener.aidl b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IHomeTransitionListener.aidl
new file mode 100644
index 0000000..8481c44
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IHomeTransitionListener.aidl
@@ -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.wm.shell.shared;
+
+import android.window.RemoteTransition;
+import android.window.TransitionFilter;
+
+/**
+ * Listener interface that Launcher attaches to SystemUI to get home activity transition callbacks
+ * on the default display.
+ */
+oneway interface IHomeTransitionListener {
+
+    /**
+     * Called when a transition changes the visibility of the home activity on the default display.
+     */
+    void onHomeVisibilityChanged(in boolean isVisible);
+}
+
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
new file mode 100644
index 0000000..526407e
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/IShellTransitions.aidl
@@ -0,0 +1,55 @@
+/*
+ * 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.wm.shell.shared;
+
+import android.view.SurfaceControl;
+import android.window.RemoteTransition;
+import android.window.TransitionFilter;
+
+import com.android.wm.shell.shared.IHomeTransitionListener;
+
+/**
+ * Interface that is exposed to remote callers to manipulate the transitions feature.
+ */
+interface IShellTransitions {
+
+    /**
+     * Registers a remote transition handler.
+     */
+    oneway void registerRemote(in TransitionFilter filter,
+            in RemoteTransition remoteTransition) = 1;
+
+    /**
+     * Unregisters a remote transition handler.
+     */
+    oneway void unregisterRemote(in RemoteTransition remoteTransition) = 2;
+
+    /**
+     * Retrieves the apply-token used by transactions in Shell
+     */
+    IBinder getShellApplyToken() = 3;
+
+    /**
+     * Set listener that will receive callbacks about transitions involving home activity.
+     */
+    oneway void setHomeTransitionListener(in IHomeTransitionListener listener) = 4;
+
+    /**
+     * Returns a container surface for the home root task.
+     */
+    SurfaceControl getHomeTaskOverlayContainer() = 5;
+}
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
new file mode 100644
index 0000000..5e49f55
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/ShellTransitions.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 com.android.wm.shell.shared;
+
+import android.annotation.NonNull;
+import android.window.RemoteTransition;
+import android.window.TransitionFilter;
+
+import com.android.wm.shell.shared.annotations.ExternalThread;
+
+/**
+ * Interface to manage remote transitions.
+ */
+@ExternalThread
+public interface ShellTransitions {
+    /**
+     * Registers a remote transition.
+     */
+    default void registerRemote(@NonNull TransitionFilter filter,
+            @NonNull RemoteTransition remoteTransition) {}
+
+    /**
+     * Unregisters a remote transition.
+     */
+    default void unregisterRemote(@NonNull RemoteTransition remoteTransition) {}
+}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/PhysicsAnimator.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/PhysicsAnimator.kt
new file mode 100644
index 0000000..9d3b56d
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/PhysicsAnimator.kt
@@ -0,0 +1,1032 @@
+/*
+ * 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.wm.shell.shared.animation
+
+import android.util.ArrayMap
+import android.util.Log
+import android.view.View
+import androidx.dynamicanimation.animation.DynamicAnimation
+import androidx.dynamicanimation.animation.FlingAnimation
+import androidx.dynamicanimation.animation.FloatPropertyCompat
+import androidx.dynamicanimation.animation.SpringAnimation
+import androidx.dynamicanimation.animation.SpringForce
+
+import com.android.wm.shell.shared.animation.PhysicsAnimator.Companion.getInstance
+import java.lang.ref.WeakReference
+import java.util.WeakHashMap
+import kotlin.math.abs
+import kotlin.math.max
+import kotlin.math.min
+
+/**
+ * Extension function for all objects which will return a PhysicsAnimator instance for that object.
+ */
+val <T : View> T.physicsAnimator: PhysicsAnimator<T> get() { return getInstance(this) }
+
+private const val TAG = "PhysicsAnimator"
+
+private val UNSET = -Float.MAX_VALUE
+
+/**
+ * [FlingAnimation] multiplies the friction set via [FlingAnimation.setFriction] by 4.2f, which is
+ * where this number comes from. We use it in [PhysicsAnimator.flingThenSpring] to calculate the
+ * minimum velocity for a fling to reach a certain value, given the fling's friction.
+ */
+private const val FLING_FRICTION_SCALAR_MULTIPLIER = 4.2f
+
+typealias EndAction = () -> Unit
+
+/** A map of Property -> AnimationUpdate, which is provided to update listeners on each frame. */
+typealias UpdateMap<T> =
+        ArrayMap<FloatPropertyCompat<in T>, PhysicsAnimator.AnimationUpdate>
+
+/**
+ * Map of the animators associated with a given object. This ensures that only one animator
+ * per object exists.
+ */
+internal val animators = WeakHashMap<Any, PhysicsAnimator<*>>()
+
+/**
+ * Default spring configuration to use for animations where stiffness and/or damping ratio
+ * were not provided, and a default spring was not set via [PhysicsAnimator.setDefaultSpringConfig].
+ */
+private val globalDefaultSpring = PhysicsAnimator.SpringConfig(
+        SpringForce.STIFFNESS_MEDIUM,
+        SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY)
+
+/**
+ * Default fling configuration to use for animations where friction was not provided, and a default
+ * fling config was not set via [PhysicsAnimator.setDefaultFlingConfig].
+ */
+private val globalDefaultFling = PhysicsAnimator.FlingConfig(
+        friction = 1f, min = -Float.MAX_VALUE, max = Float.MAX_VALUE)
+
+/** Whether to log helpful debug information about animations. */
+private var verboseLogging = false
+
+/**
+ * Animator that uses physics-based animations to animate properties on views and objects. Physics
+ * animations use real-world physical concepts, such as momentum and mass, to realistically simulate
+ * motion. PhysicsAnimator is heavily inspired by [android.view.ViewPropertyAnimator], and
+ * also uses the builder pattern to configure and start animations.
+ *
+ * The physics animations are backed by [DynamicAnimation].
+ *
+ * @param T The type of the object being animated.
+ */
+class PhysicsAnimator<T> private constructor (target: T) {
+    /** Weak reference to the animation target. */
+    val weakTarget = WeakReference(target)
+
+    /** Data class for representing animation frame updates. */
+    data class AnimationUpdate(val value: Float, val velocity: Float)
+
+    /** [DynamicAnimation] instances for the given properties. */
+    private val springAnimations = ArrayMap<FloatPropertyCompat<in T>, SpringAnimation>()
+    private val flingAnimations = ArrayMap<FloatPropertyCompat<in T>, FlingAnimation>()
+
+    /**
+     * Spring and fling configurations for the properties to be animated on the target. We'll
+     * configure and start the DynamicAnimations for these properties according to the provided
+     * configurations.
+     */
+    private val springConfigs = ArrayMap<FloatPropertyCompat<in T>, SpringConfig>()
+    private val flingConfigs = ArrayMap<FloatPropertyCompat<in T>, FlingConfig>()
+
+    /**
+     * Animation listeners for the animation. These will be notified when each property animation
+     * updates or ends.
+     */
+    private val updateListeners = ArrayList<UpdateListener<T>>()
+    private val endListeners = ArrayList<EndListener<T>>()
+
+    /** End actions to run when all animations have completed.  */
+    private val endActions = ArrayList<EndAction>()
+
+    /** SpringConfig to use by default for properties whose springs were not provided. */
+    private var defaultSpring: SpringConfig = globalDefaultSpring
+
+    /** FlingConfig to use by default for properties whose fling configs were not provided. */
+    private var defaultFling: FlingConfig = globalDefaultFling
+
+    /**
+     * Internal listeners that respond to DynamicAnimations updating and ending, and dispatch to
+     * the listeners provided via [addUpdateListener] and [addEndListener]. This allows us to add
+     * just one permanent update and end listener to the DynamicAnimations.
+     */
+    internal var internalListeners = ArrayList<InternalListener>()
+
+    /**
+     * Action to run when [start] is called. This can be changed by
+     * [PhysicsAnimatorTestUtils.prepareForTest] to enable animators to run under test and provide
+     * helpful test utilities.
+     */
+    internal var startAction: () -> Unit = ::startInternal
+
+    /**
+     * Action to run when [cancel] is called. This can be changed by
+     * [PhysicsAnimatorTestUtils.prepareForTest] to cancel animations from the main thread, which
+     * is required.
+     */
+    internal var cancelAction: (Set<FloatPropertyCompat<in T>>) -> Unit = ::cancelInternal
+
+    /**
+     * Springs a property to the given value, using the provided configuration settings.
+     *
+     * Springs are used when you know the exact value to which you want to animate. They can be
+     * configured with a start velocity (typically used when the spring is initiated by a touch
+     * event), but this velocity will be realistically attenuated as forces are applied to move the
+     * property towards the end value.
+     *
+     * If you find yourself repeating the same stiffness and damping ratios many times, consider
+     * storing a single [SpringConfig] instance and passing that in instead of individual values.
+     *
+     * @param property The property to spring to the given value. The property must be an instance
+     * of FloatPropertyCompat&lt;? super T&gt;. For example, if this is a
+     * PhysicsAnimator&lt;FrameLayout&gt;, you can use a FloatPropertyCompat&lt;FrameLayout&gt;, as
+     * well as a FloatPropertyCompat&lt;ViewGroup&gt;, and so on.
+     * @param toPosition The value to spring the given property to.
+     * @param startVelocity The initial velocity to use for the animation.
+     * @param stiffness The stiffness to use for the spring. Higher stiffness values result in
+     * faster animations, while lower stiffness means a slower animation. Reasonable values for
+     * low, medium, and high stiffness can be found as constants in [SpringForce].
+     * @param dampingRatio The damping ratio (bounciness) to use for the spring. Higher values
+     * result in a less 'springy' animation, while lower values allow the animation to bounce
+     * back and forth for a longer time after reaching the final position. Reasonable values for
+     * low, medium, and high damping can be found in [SpringForce].
+     */
+    fun spring(
+        property: FloatPropertyCompat<in T>,
+        toPosition: Float,
+        startVelocity: Float = 0f,
+        stiffness: Float = defaultSpring.stiffness,
+        dampingRatio: Float = defaultSpring.dampingRatio
+    ): PhysicsAnimator<T> {
+        if (verboseLogging) {
+            Log.d(TAG, "Springing ${getReadablePropertyName(property)} to $toPosition.")
+        }
+
+        springConfigs[property] =
+                SpringConfig(stiffness, dampingRatio, startVelocity, toPosition)
+        return this
+    }
+
+    /**
+     * Springs a property to a given value using the provided start velocity and configuration
+     * options.
+     *
+     * @see spring
+     */
+    fun spring(
+        property: FloatPropertyCompat<in T>,
+        toPosition: Float,
+        startVelocity: Float,
+        config: SpringConfig = defaultSpring
+    ): PhysicsAnimator<T> {
+        return spring(
+                property, toPosition, startVelocity, config.stiffness, config.dampingRatio)
+    }
+
+    /**
+     * Springs a property to a given value using the provided configuration options, and a start
+     * velocity of 0f.
+     *
+     * @see spring
+     */
+    fun spring(
+        property: FloatPropertyCompat<in T>,
+        toPosition: Float,
+        config: SpringConfig = defaultSpring
+    ): PhysicsAnimator<T> {
+        return spring(property, toPosition, 0f, config)
+    }
+
+    /**
+     * Springs a property to a given value using the provided configuration options, and a start
+     * velocity of 0f.
+     *
+     * @see spring
+     */
+    fun spring(
+        property: FloatPropertyCompat<in T>,
+        toPosition: Float
+    ): PhysicsAnimator<T> {
+        return spring(property, toPosition, 0f)
+    }
+
+    /**
+     * Flings a property using the given start velocity, using a [FlingAnimation] configured using
+     * the provided configuration settings.
+     *
+     * Flings are used when you have a start velocity, and want the property value to realistically
+     * decrease as friction is applied until the velocity reaches zero. Flings do not have a
+     * deterministic end value. If you are attempting to animate to a specific end value, use
+     * [spring].
+     *
+     * If you find yourself repeating the same friction/min/max values, consider storing a single
+     * [FlingConfig] and passing that in instead.
+     *
+     * @param property The property to fling using the given start velocity.
+     * @param startVelocity The start velocity (in pixels per second) with which to start the fling.
+     * @param friction Friction value applied to slow down the animation over time. Higher values
+     * will more quickly slow the animation. Typical friction values range from 1f to 10f.
+     * @param min The minimum value allowed for the animation. If this value is reached, the
+     * animation will end abruptly.
+     * @param max The maximum value allowed for the animation. If this value is reached, the
+     * animation will end abruptly.
+     */
+    fun fling(
+        property: FloatPropertyCompat<in T>,
+        startVelocity: Float,
+        friction: Float = defaultFling.friction,
+        min: Float = defaultFling.min,
+        max: Float = defaultFling.max
+    ): PhysicsAnimator<T> {
+        if (verboseLogging) {
+            Log.d(TAG, "Flinging ${getReadablePropertyName(property)} " +
+                    "with velocity $startVelocity.")
+        }
+
+        flingConfigs[property] = FlingConfig(friction, min, max, startVelocity)
+        return this
+    }
+
+    /**
+     * Flings a property using the given start velocity, using a [FlingAnimation] configured using
+     * the provided configuration settings.
+     *
+     * @see fling
+     */
+    fun fling(
+        property: FloatPropertyCompat<in T>,
+        startVelocity: Float,
+        config: FlingConfig = defaultFling
+    ): PhysicsAnimator<T> {
+        return fling(property, startVelocity, config.friction, config.min, config.max)
+    }
+
+    /**
+     * Flings a property using the given start velocity. If the fling animation reaches the min/max
+     * bounds (from the [flingConfig]) with velocity remaining, it'll overshoot it and spring back.
+     *
+     * If the object is already out of the fling bounds, it will immediately spring back within
+     * bounds.
+     *
+     * This is useful for animating objects that are bounded by constraints such as screen edges,
+     * since otherwise the fling animation would end abruptly upon reaching the min/max bounds.
+     *
+     * @param property The property to animate.
+     * @param startVelocity The velocity, in pixels/second, with which to start the fling. If the
+     * object is already outside the fling bounds, this velocity will be used as the start velocity
+     * of the spring that will spring it back within bounds.
+     * @param flingMustReachMinOrMax If true, the fling animation is guaranteed to reach either its
+     * minimum bound (if [startVelocity] is negative) or maximum bound (if it's positive). The
+     * animator will use startVelocity if it's sufficient, or add more velocity if necessary. This
+     * is useful when fling's deceleration-based physics are preferable to the acceleration-based
+     * forces used by springs - typically, when you're allowing the user to move an object somewhere
+     * on the screen, but it needs to be along an edge.
+     * @param flingConfig The configuration to use for the fling portion of the animation.
+     * @param springConfig The configuration to use for the spring portion of the animation.
+     */
+    @JvmOverloads
+    fun flingThenSpring(
+        property: FloatPropertyCompat<in T>,
+        startVelocity: Float,
+        flingConfig: FlingConfig,
+        springConfig: SpringConfig,
+        flingMustReachMinOrMax: Boolean = false
+    ): PhysicsAnimator<T> {
+        val target = weakTarget.get()
+        if (target == null) {
+            Log.w(TAG, "Trying to animate a GC-ed target.")
+            return this
+        }
+        val flingConfigCopy = flingConfig.copy()
+        val springConfigCopy = springConfig.copy()
+        val toAtLeast = if (startVelocity < 0) flingConfig.min else flingConfig.max
+
+        if (flingMustReachMinOrMax && isValidValue(toAtLeast)) {
+            val currentValue = property.getValue(target)
+            val flingTravelDistance =
+                    startVelocity / (flingConfig.friction * FLING_FRICTION_SCALAR_MULTIPLIER)
+            val projectedFlingEndValue = currentValue + flingTravelDistance
+            val midpoint = (flingConfig.min + flingConfig.max) / 2
+
+            // If fling velocity is too low to push the target past the midpoint between min and
+            // max, then spring back towards the nearest edge, starting with the current velocity.
+            if ((startVelocity < 0 && projectedFlingEndValue > midpoint) ||
+                    (startVelocity > 0 && projectedFlingEndValue < midpoint)) {
+                val toPosition =
+                        if (projectedFlingEndValue < midpoint) flingConfig.min else flingConfig.max
+                if (isValidValue(toPosition)) {
+                    return spring(property, toPosition, startVelocity, springConfig)
+                }
+            }
+
+            // Projected fling end value is past the midpoint, so fling forward.
+            val distanceToDestination = toAtLeast - property.getValue(target)
+
+            // The minimum velocity required for the fling to end up at the given destination,
+            // taking the provided fling friction value.
+            val velocityToReachDestination = distanceToDestination *
+                    (flingConfig.friction * FLING_FRICTION_SCALAR_MULTIPLIER)
+
+            // If there's distance to cover, and the provided velocity is moving in the correct
+            // direction, ensure that the velocity is high enough to reach the destination.
+            // Otherwise, just use startVelocity - this means that the fling is at or out of bounds.
+            // The fling will immediately end and a spring will bring the object back into bounds
+            // with this startVelocity.
+            flingConfigCopy.startVelocity = when {
+                distanceToDestination > 0f && startVelocity >= 0f ->
+                    max(velocityToReachDestination, startVelocity)
+                distanceToDestination < 0f && startVelocity <= 0f ->
+                    min(velocityToReachDestination, startVelocity)
+                else -> startVelocity
+            }
+
+            springConfigCopy.finalPosition = toAtLeast
+        } else {
+            flingConfigCopy.startVelocity = startVelocity
+        }
+
+        flingConfigs[property] = flingConfigCopy
+        springConfigs[property] = springConfigCopy
+        return this
+    }
+
+    private fun isValidValue(value: Float) = value < Float.MAX_VALUE && value > -Float.MAX_VALUE
+
+    /**
+     * Adds a listener that will be called whenever any property on the animated object is updated.
+     * This will be called on every animation frame, with the current value of the animated object
+     * and the new property values.
+     */
+    fun addUpdateListener(listener: UpdateListener<T>): PhysicsAnimator<T> {
+        updateListeners.add(listener)
+        return this
+    }
+
+    /**
+     * Adds a listener that will be called when a property stops animating. This is useful if
+     * you care about a specific property ending, or want to use the end value/end velocity from a
+     * particular property's animation. If you just want to run an action when all property
+     * animations have ended, use [withEndActions].
+     */
+    fun addEndListener(listener: EndListener<T>): PhysicsAnimator<T> {
+        endListeners.add(listener)
+        return this
+    }
+
+    /**
+     * Adds end actions that will be run sequentially when animations for every property involved in
+     * this specific animation have ended (unless they were explicitly canceled). For example, if
+     * you call:
+     *
+     * animator
+     *   .spring(TRANSLATION_X, ...)
+     *   .spring(TRANSLATION_Y, ...)
+     *   .withEndAction(action)
+     *   .start()
+     *
+     * 'action' will be run when both TRANSLATION_X and TRANSLATION_Y end.
+     *
+     * Other properties may still be animating, if those animations were not started in the same
+     * call. For example:
+     *
+     * animator
+     *   .spring(ALPHA, ...)
+     *   .start()
+     *
+     * animator
+     *   .spring(TRANSLATION_X, ...)
+     *   .spring(TRANSLATION_Y, ...)
+     *   .withEndAction(action)
+     *   .start()
+     *
+     * 'action' will still be run as soon as TRANSLATION_X and TRANSLATION_Y end, even if ALPHA is
+     * still animating.
+     *
+     * If you want to run actions as soon as a subset of property animations have ended, you want
+     * access to the animation's end value/velocity, or you want to run these actions even if the
+     * animation is explicitly canceled, use [addEndListener]. End listeners have an allEnded param,
+     * which indicates that all relevant animations have ended.
+     */
+    fun withEndActions(vararg endActions: EndAction?): PhysicsAnimator<T> {
+        this.endActions.addAll(endActions.filterNotNull())
+        return this
+    }
+
+    /**
+     * Helper overload so that callers from Java can use Runnables or method references as end
+     * actions without having to explicitly return Unit.
+     */
+    fun withEndActions(vararg endActions: Runnable?): PhysicsAnimator<T> {
+        this.endActions.addAll(endActions.filterNotNull().map { it::run })
+        return this
+    }
+
+    fun setDefaultSpringConfig(defaultSpring: SpringConfig) {
+        this.defaultSpring = defaultSpring
+    }
+
+    fun setDefaultFlingConfig(defaultFling: FlingConfig) {
+        this.defaultFling = defaultFling
+    }
+
+    /** Starts the animations! */
+    fun start() {
+        startAction()
+    }
+
+    /**
+     * Starts the animations for real! This is typically called immediately by [start] unless this
+     * animator is under test.
+     */
+    internal fun startInternal() {
+        val target = weakTarget.get()
+        if (target == null) {
+            Log.w(TAG, "Trying to animate a GC-ed object.")
+            return
+        }
+
+        // Functions that will actually start the animations. These are run after we build and add
+        // the InternalListener, since some animations might update/end immediately and we don't
+        // want to miss those updates.
+        val animationStartActions = ArrayList<() -> Unit>()
+
+        for (animatedProperty in getAnimatedProperties()) {
+            val flingConfig = flingConfigs[animatedProperty]
+            val springConfig = springConfigs[animatedProperty]
+
+            // The property's current value on the object.
+            val currentValue = animatedProperty.getValue(target)
+
+            // Start by checking for a fling configuration. If one is present, we're either flinging
+            // or flinging-then-springing. Either way, we'll want to start the fling first.
+            if (flingConfig != null) {
+                animationStartActions.add {
+                    // When the animation is starting, adjust the min/max bounds to include the
+                    // current value of the property, if necessary. This is required to allow a
+                    // fling to bring an out-of-bounds object back into bounds. For example, if an
+                    // object was dragged halfway off the left side of the screen, but then flung to
+                    // the right, we don't want the animation to end instantly just because the
+                    // object started out of bounds. If the fling is in the direction that would
+                    // take it farther out of bounds, it will end instantly as expected.
+                    flingConfig.apply {
+                        min = min(currentValue, this.min)
+                        max = max(currentValue, this.max)
+                    }
+
+                    // Flings can't be updated to a new position while maintaining velocity, because
+                    // we're using the explicitly provided start velocity. Cancel any flings (or
+                    // springs) on this property before flinging.
+                    cancel(animatedProperty)
+
+                    // Apply the configuration and start the animation.
+                    getFlingAnimation(animatedProperty, target)
+                        .also { flingConfig.applyToAnimation(it) }.start()
+                }
+            }
+
+            // Check for a spring configuration. If one is present, we're either springing, or
+            // flinging-then-springing.
+            if (springConfig != null) {
+                // If there is no corresponding fling config, we're only springing.
+                if (flingConfig == null) {
+                    // Apply the configuration and start the animation.
+                    val springAnim = getSpringAnimation(animatedProperty, target)
+
+                    // Apply the configuration and start the animation.
+                    springConfig.applyToAnimation(springAnim)
+                    animationStartActions.add(springAnim::start)
+                } else {
+                    // If there's a corresponding fling config, we're flinging-then-springing. Save
+                    // the fling's original bounds so we can spring to them when the fling ends.
+                    val flingMin = flingConfig.min
+                    val flingMax = flingConfig.max
+
+                    // Add an end listener that will start the spring when the fling ends.
+                    endListeners.add(0, object : EndListener<T> {
+                        override fun onAnimationEnd(
+                            target: T,
+                            property: FloatPropertyCompat<in T>,
+                            wasFling: Boolean,
+                            canceled: Boolean,
+                            finalValue: Float,
+                            finalVelocity: Float,
+                            allRelevantPropertyAnimsEnded: Boolean
+                        ) {
+                            // If this isn't the relevant property, it wasn't a fling, or the fling
+                            // was explicitly cancelled, don't spring.
+                            if (property != animatedProperty || !wasFling || canceled) {
+                                return
+                            }
+
+                            val endedWithVelocity = abs(finalVelocity) > 0
+
+                            // If the object was out of bounds when the fling animation started, it
+                            // will immediately end. In that case, we'll spring it back in bounds.
+                            val endedOutOfBounds = finalValue !in flingMin..flingMax
+
+                            // If the fling ended either out of bounds or with remaining velocity,
+                            // it's time to spring.
+                            if (endedWithVelocity || endedOutOfBounds) {
+                                springConfig.startVelocity = finalVelocity
+
+                                // If the spring's final position isn't set, this is a
+                                // flingThenSpring where flingMustReachMinOrMax was false. We'll
+                                // need to set the spring's final position here.
+                                if (springConfig.finalPosition == UNSET) {
+                                    if (endedWithVelocity) {
+                                        // If the fling ended with negative velocity, that means it
+                                        // hit the min bound, so spring to that bound (and vice
+                                        // versa).
+                                        springConfig.finalPosition =
+                                                if (finalVelocity < 0) flingMin else flingMax
+                                    } else if (endedOutOfBounds) {
+                                        // If the fling ended out of bounds, spring it to the
+                                        // nearest bound.
+                                        springConfig.finalPosition =
+                                                if (finalValue < flingMin) flingMin else flingMax
+                                    }
+                                }
+
+                                // Apply the configuration and start the spring animation.
+                                getSpringAnimation(animatedProperty, target)
+                                    .also { springConfig.applyToAnimation(it) }.start()
+                            }
+                        }
+                    })
+                }
+            }
+        }
+
+        // Add an internal listener that will dispatch animation events to the provided listeners.
+        internalListeners.add(InternalListener(
+                target,
+                getAnimatedProperties(),
+                ArrayList(updateListeners),
+                ArrayList(endListeners),
+                ArrayList(endActions)))
+
+        // Actually start the DynamicAnimations. This is delayed until after the InternalListener is
+        // constructed and added so that we don't miss the end listener firing for any animations
+        // that immediately end.
+        animationStartActions.forEach { it.invoke() }
+
+        clearAnimator()
+    }
+
+    /** Clear the animator's builder variables. */
+    private fun clearAnimator() {
+        springConfigs.clear()
+        flingConfigs.clear()
+
+        updateListeners.clear()
+        endListeners.clear()
+        endActions.clear()
+    }
+
+    /** Retrieves a spring animation for the given property, building one if needed. */
+    private fun getSpringAnimation(
+        property: FloatPropertyCompat<in T>,
+        target: T
+    ): SpringAnimation {
+        return springAnimations.getOrPut(
+                property,
+                { configureDynamicAnimation(SpringAnimation(target, property), property)
+                        as SpringAnimation })
+    }
+
+    /** Retrieves a fling animation for the given property, building one if needed. */
+    private fun getFlingAnimation(property: FloatPropertyCompat<in T>, target: T): FlingAnimation {
+        return flingAnimations.getOrPut(
+                property,
+                { configureDynamicAnimation(FlingAnimation(target, property), property)
+                        as FlingAnimation })
+    }
+
+    /**
+     * Adds update and end listeners to the DynamicAnimation which will dispatch to the internal
+     * listeners.
+     */
+    private fun configureDynamicAnimation(
+        anim: DynamicAnimation<*>,
+        property: FloatPropertyCompat<in T>
+    ): DynamicAnimation<*> {
+        anim.addUpdateListener { _, value, velocity ->
+            for (i in 0 until internalListeners.size) {
+                internalListeners[i].onInternalAnimationUpdate(property, value, velocity)
+            }
+        }
+        anim.addEndListener { _, canceled, value, velocity ->
+            internalListeners.removeAll {
+                it.onInternalAnimationEnd(
+                        property, canceled, value, velocity, anim is FlingAnimation)
+            }
+            if (springAnimations[property] == anim) {
+                springAnimations.remove(property)
+            }
+            if (flingAnimations[property] == anim) {
+                flingAnimations.remove(property)
+            }
+        }
+        return anim
+    }
+
+    /**
+     * Internal listener class that receives updates from DynamicAnimation listeners, and dispatches
+     * them to the appropriate update/end listeners. This class is also aware of which properties
+     * were being animated when the end listeners were passed in, so that we can provide the
+     * appropriate value for allEnded to [EndListener.onAnimationEnd].
+     */
+    internal inner class InternalListener constructor(
+        private val target: T,
+        private var properties: Set<FloatPropertyCompat<in T>>,
+        private var updateListeners: List<UpdateListener<T>>,
+        private var endListeners: List<EndListener<T>>,
+        private var endActions: List<EndAction>
+    ) {
+
+        /** The number of properties whose animations haven't ended. */
+        private var numPropertiesAnimating = properties.size
+
+        /**
+         * Update values that haven't yet been dispatched because not all property animations have
+         * updated yet.
+         */
+        private val undispatchedUpdates =
+                ArrayMap<FloatPropertyCompat<in T>, AnimationUpdate>()
+
+        /** Called when a DynamicAnimation updates.  */
+        internal fun onInternalAnimationUpdate(
+            property: FloatPropertyCompat<in T>,
+            value: Float,
+            velocity: Float
+        ) {
+            // If this property animation isn't relevant to this listener, ignore it.
+            if (!properties.contains(property)) {
+                return
+            }
+
+            undispatchedUpdates[property] = AnimationUpdate(value, velocity)
+            maybeDispatchUpdates()
+        }
+
+        /**
+         * Called when a DynamicAnimation ends.
+         *
+         * @return True if this listener should be removed from the list of internal listeners, so
+         * it no longer receives updates from DynamicAnimations.
+         */
+        internal fun onInternalAnimationEnd(
+            property: FloatPropertyCompat<in T>,
+            canceled: Boolean,
+            finalValue: Float,
+            finalVelocity: Float,
+            isFling: Boolean
+        ): Boolean {
+            // If this property animation isn't relevant to this listener, ignore it.
+            if (!properties.contains(property)) {
+                return false
+            }
+
+            // Dispatch updates if we have one for each property.
+            numPropertiesAnimating--
+            maybeDispatchUpdates()
+
+            // If we didn't have an update for each property, dispatch the update for the ending
+            // property. This guarantees that an update isn't sent for this property *after* we call
+            // onAnimationEnd for that property.
+            if (undispatchedUpdates.contains(property)) {
+                updateListeners.forEach { updateListener ->
+                    updateListener.onAnimationUpdateForProperty(
+                            target,
+                            UpdateMap<T>().also { it[property] = undispatchedUpdates[property] })
+                }
+
+                undispatchedUpdates.remove(property)
+            }
+
+            val allEnded = !arePropertiesAnimating(properties)
+            endListeners.forEach {
+                it.onAnimationEnd(
+                        target, property, isFling, canceled, finalValue, finalVelocity,
+                        allEnded)
+
+                // Check that the end listener didn't restart this property's animation.
+                if (isPropertyAnimating(property)) {
+                    return false
+                }
+            }
+
+            // If all of the animations that this listener cares about have ended, run the end
+            // actions unless the animation was canceled.
+            if (allEnded && !canceled) {
+                endActions.forEach { it() }
+            }
+
+            return allEnded
+        }
+
+        /**
+         * Dispatch undispatched values if we've received an update from each of the animating
+         * properties.
+         */
+        private fun maybeDispatchUpdates() {
+            if (undispatchedUpdates.size >= numPropertiesAnimating &&
+                    undispatchedUpdates.size > 0) {
+                updateListeners.forEach {
+                    it.onAnimationUpdateForProperty(target, ArrayMap(undispatchedUpdates))
+                }
+
+                undispatchedUpdates.clear()
+            }
+        }
+    }
+
+    /** Return true if any animations are running on the object.  */
+    fun isRunning(): Boolean {
+        return arePropertiesAnimating(springAnimations.keys.union(flingAnimations.keys))
+    }
+
+    /** Returns whether the given property is animating.  */
+    fun isPropertyAnimating(property: FloatPropertyCompat<in T>): Boolean {
+        return springAnimations[property]?.isRunning ?: false ||
+                flingAnimations[property]?.isRunning ?: false
+    }
+
+    /** Returns whether any of the given properties are animating.  */
+    fun arePropertiesAnimating(properties: Set<FloatPropertyCompat<in T>>): Boolean {
+        return properties.any { isPropertyAnimating(it) }
+    }
+
+    /** Return the set of properties that will begin animating upon calling [start]. */
+    internal fun getAnimatedProperties(): Set<FloatPropertyCompat<in T>> {
+        return springConfigs.keys.union(flingConfigs.keys)
+    }
+
+    /**
+     * Cancels the given properties. This is typically called immediately by [cancel], unless this
+     * animator is under test.
+     */
+    internal fun cancelInternal(properties: Set<FloatPropertyCompat<in T>>) {
+        for (property in properties) {
+            flingAnimations[property]?.cancel()
+            springAnimations[property]?.cancel()
+        }
+    }
+
+    /** Cancels all in progress animations on all properties. */
+    fun cancel() {
+        if (flingAnimations.size > 0) {
+            cancelAction(flingAnimations.keys)
+        }
+        if (springAnimations.size > 0) {
+            cancelAction(springAnimations.keys)
+        }
+    }
+
+    /** Cancels in progress animations on the provided properties only. */
+    fun cancel(vararg properties: FloatPropertyCompat<in T>) {
+        cancelAction(properties.toSet())
+    }
+
+    /**
+     * Container object for spring animation configuration settings. This allows you to store
+     * default stiffness and damping ratio values in a single configuration object, which you can
+     * pass to [spring].
+     */
+    data class SpringConfig internal constructor(
+        var stiffness: Float,
+        internal var dampingRatio: Float,
+        internal var startVelocity: Float = 0f,
+        internal var finalPosition: Float = UNSET
+    ) {
+
+        constructor() :
+                this(globalDefaultSpring.stiffness, globalDefaultSpring.dampingRatio)
+
+        constructor(stiffness: Float, dampingRatio: Float) :
+                this(stiffness = stiffness, dampingRatio = dampingRatio, startVelocity = 0f)
+
+        /** Apply these configuration settings to the given SpringAnimation. */
+        internal fun applyToAnimation(anim: SpringAnimation) {
+            val springForce = anim.spring ?: SpringForce()
+            anim.spring = springForce.apply {
+                stiffness = [email protected]
+                dampingRatio = [email protected]
+                finalPosition = [email protected]
+            }
+
+            if (startVelocity != 0f) anim.setStartVelocity(startVelocity)
+        }
+    }
+
+    /**
+     * Container object for fling animation configuration settings. This allows you to store default
+     * friction values (as well as optional min/max values) in a single configuration object, which
+     * you can pass to [fling] and related methods.
+     */
+    data class FlingConfig internal constructor(
+        internal var friction: Float,
+        var min: Float,
+        var max: Float,
+        internal var startVelocity: Float
+    ) {
+
+        constructor() : this(globalDefaultFling.friction)
+
+        constructor(friction: Float) :
+                this(friction, globalDefaultFling.min, globalDefaultFling.max)
+
+        constructor(friction: Float, min: Float, max: Float) :
+                this(friction, min, max, startVelocity = 0f)
+
+        /** Apply these configuration settings to the given FlingAnimation. */
+        internal fun applyToAnimation(anim: FlingAnimation) {
+            anim.apply {
+                friction = [email protected]
+                setMinValue(min)
+                setMaxValue(max)
+                setStartVelocity(startVelocity)
+            }
+        }
+    }
+
+    /**
+     * Listener for receiving values from in progress animations. Used with
+     * [PhysicsAnimator.addUpdateListener].
+     *
+     * @param <T> The type of the object being animated.
+    </T> */
+    fun interface UpdateListener<T> {
+
+        /**
+         * Called on each animation frame with the target object, and a map of FloatPropertyCompat
+         * -> AnimationUpdate, containing the latest value and velocity for that property. When
+         * multiple properties are animating together, the map will typically contain one entry for
+         * each property. However, you should never assume that this is the case - when a property
+         * animation ends earlier than the others, you'll receive an UpdateMap containing only that
+         * property's final update. Subsequently, you'll only receive updates for the properties
+         * that are still animating.
+         *
+         * Always check that the map contains an update for the property you're interested in before
+         * accessing it.
+         *
+         * @param target The animated object itself.
+         * @param values Map of property to AnimationUpdate, which contains that property
+         * animation's latest value and velocity. You should never assume that a particular property
+         * is present in this map.
+         */
+        fun onAnimationUpdateForProperty(
+            target: T,
+            values: UpdateMap<T>
+        )
+    }
+
+    /**
+     * Listener for receiving callbacks when animations end.
+     *
+     * @param <T> The type of the object being animated.
+    </T> */
+    fun interface EndListener<T> {
+
+        /**
+         * Called with the final animation values as each property animation ends. This can be used
+         * to respond to specific property animations concluding (such as hiding a view when ALPHA
+         * ends, even if the corresponding TRANSLATION animations have not ended).
+         *
+         * If you just want to run an action when all of the property animations have ended, you can
+         * use [PhysicsAnimator.withEndActions].
+         *
+         * @param target The animated object itself.
+         * @param property The property whose animation has just ended.
+         * @param wasFling Whether this property ended after a fling animation (as opposed to a
+         * spring animation). If this property was animated via [flingThenSpring], this will be true
+         * if the fling animation did not reach the min/max bounds, decelerating to a stop
+         * naturally. It will be false if it hit the bounds and was sprung back.
+         * @param canceled Whether the animation was explicitly canceled before it naturally ended.
+         * @param finalValue The final value of the animated property.
+         * @param finalVelocity The final velocity (in pixels per second) of the ended animation.
+         * This is typically zero, unless this was a fling animation which ended abruptly due to
+         * reaching its configured min/max values.
+         * @param allRelevantPropertyAnimsEnded Whether all properties relevant to this end listener
+         * have ended. Relevant properties are those which were animated alongside the
+         * [addEndListener] call where this animator was passed in. For example:
+         *
+         * animator
+         *    .spring(TRANSLATION_X, 100f)
+         *    .spring(TRANSLATION_Y, 200f)
+         *    .withEndListener(firstEndListener)
+         *    .start()
+         *
+         * firstEndListener will be called first for TRANSLATION_X, with allEnded = false,
+         * because TRANSLATION_Y is still running. When TRANSLATION_Y ends, it'll be called with
+         * allEnded = true.
+         *
+         * If a subsequent call to start() is made with other properties, those properties are not
+         * considered relevant and allEnded will still equal true when only TRANSLATION_X and
+         * TRANSLATION_Y end. For example, if immediately after the prior example, while
+         * TRANSLATION_X and TRANSLATION_Y are still animating, we called:
+         *
+         * animator.
+         *    .spring(SCALE_X, 2f, stiffness = 10f) // That will take awhile...
+         *    .withEndListener(secondEndListener)
+         *    .start()
+         *
+         * firstEndListener will still be called with allEnded = true when TRANSLATION_X/Y end, even
+         * though SCALE_X is still animating. Similarly, secondEndListener will be called with
+         * allEnded = true as soon as SCALE_X ends, even if the translation animations are still
+         * running.
+         */
+        fun onAnimationEnd(
+            target: T,
+            property: FloatPropertyCompat<in T>,
+            wasFling: Boolean,
+            canceled: Boolean,
+            finalValue: Float,
+            finalVelocity: Float,
+            allRelevantPropertyAnimsEnded: Boolean
+        )
+    }
+
+    companion object {
+
+        /**
+         * Callback to notify that a new animator was created. Used in [PhysicsAnimatorTestUtils]
+         * to be able to keep track of animators and wait for them to finish.
+         */
+        internal var onAnimatorCreated: (PhysicsAnimator<*>, Any) -> Unit = { _, _ -> }
+
+        @JvmStatic
+        @Suppress("UNCHECKED_CAST")
+        fun <T : Any> getInstance(target: T): PhysicsAnimator<T> {
+            if (!animators.containsKey(target)) {
+                val animator = PhysicsAnimator(target)
+                onAnimatorCreated(animator, target)
+                animators[target] = animator
+            }
+
+            return animators[target] as PhysicsAnimator<T>
+        }
+
+        /**
+         * Set whether all physics animators should log a lot of information about animations.
+         * Useful for debugging!
+         */
+        @JvmStatic
+        fun setVerboseLogging(debug: Boolean) {
+            verboseLogging = debug
+        }
+
+        /**
+         * Estimates the end value of a fling that starts at the given value using the provided
+         * start velocity and fling configuration.
+         *
+         * This is only an estimate. Fling animations use a timing-based physics simulation that is
+         * non-deterministic, so this exact value may not be reached.
+         */
+        @JvmStatic
+        fun estimateFlingEndValue(
+            startValue: Float,
+            startVelocity: Float,
+            flingConfig: FlingConfig
+        ): Float {
+            val distance = startVelocity / (flingConfig.friction * FLING_FRICTION_SCALAR_MULTIPLIER)
+            return Math.min(flingConfig.max, Math.max(flingConfig.min, startValue + distance))
+        }
+
+        @JvmStatic
+        fun getReadablePropertyName(property: FloatPropertyCompat<*>): String {
+            return when (property) {
+                DynamicAnimation.TRANSLATION_X -> "translationX"
+                DynamicAnimation.TRANSLATION_Y -> "translationY"
+                DynamicAnimation.TRANSLATION_Z -> "translationZ"
+                DynamicAnimation.SCALE_X -> "scaleX"
+                DynamicAnimation.SCALE_Y -> "scaleY"
+                DynamicAnimation.ROTATION -> "rotation"
+                DynamicAnimation.ROTATION_X -> "rotationX"
+                DynamicAnimation.ROTATION_Y -> "rotationY"
+                DynamicAnimation.SCROLL_X -> "scrollX"
+                DynamicAnimation.SCROLL_Y -> "scrollY"
+                DynamicAnimation.ALPHA -> "alpha"
+                else -> "Custom FloatPropertyCompat instance"
+            }
+        }
+    }
+}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/PhysicsAnimatorTestUtils.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/PhysicsAnimatorTestUtils.kt
new file mode 100644
index 0000000..235b9bf
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/PhysicsAnimatorTestUtils.kt
@@ -0,0 +1,480 @@
+/*
+ * 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.wm.shell.shared.animation
+
+import android.os.Handler
+import android.os.Looper
+import android.util.ArrayMap
+import androidx.dynamicanimation.animation.FloatPropertyCompat
+import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils.prepareForTest
+import java.util.*
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+import kotlin.collections.ArrayList
+import kotlin.collections.HashMap
+import kotlin.collections.HashSet
+import kotlin.collections.Set
+import kotlin.collections.component1
+import kotlin.collections.component2
+import kotlin.collections.drop
+import kotlin.collections.forEach
+import kotlin.collections.getOrPut
+import kotlin.collections.set
+import kotlin.collections.toList
+import kotlin.collections.toTypedArray
+
+typealias UpdateMatcher = (PhysicsAnimator.AnimationUpdate) -> Boolean
+typealias UpdateFramesPerProperty<T> =
+        ArrayMap<FloatPropertyCompat<in T>, ArrayList<PhysicsAnimator.AnimationUpdate>>
+
+/**
+ * Utilities for testing code that uses [PhysicsAnimator].
+ *
+ * Start by calling [prepareForTest] at the beginning of each test - this will modify the behavior
+ * of all PhysicsAnimator instances so that they post animations to the main thread (so they don't
+ * crash). It'll also enable the use of the other static helper methods in this class, which you can
+ * use to do things like block the test until animations complete (so you can test end states), or
+ * verify keyframes.
+ */
+object PhysicsAnimatorTestUtils {
+    var timeoutMs: Long = 2000
+    private var startBlocksUntilAnimationsEnd = false
+    private val animationThreadHandler = Handler(Looper.getMainLooper())
+    private val allAnimatedObjects = HashSet<Any>()
+    private val animatorTestHelpers = HashMap<PhysicsAnimator<*>, AnimatorTestHelper<*>>()
+
+    /**
+     * Modifies the behavior of all [PhysicsAnimator] instances so that they post animations to the
+     * main thread, and report all of their
+     */
+    @JvmStatic
+    fun prepareForTest() {
+        PhysicsAnimator.onAnimatorCreated = { animator, target ->
+            allAnimatedObjects.add(target)
+            animatorTestHelpers[animator] = AnimatorTestHelper(animator)
+        }
+
+        timeoutMs = 2000
+        startBlocksUntilAnimationsEnd = false
+        allAnimatedObjects.clear()
+    }
+
+    @JvmStatic
+    fun tearDown() {
+        val latch = CountDownLatch(1)
+        animationThreadHandler.post {
+            animatorTestHelpers.keys.forEach { it.cancel() }
+            latch.countDown()
+        }
+
+        latch.await()
+
+        animatorTestHelpers.clear()
+        animators.clear()
+        allAnimatedObjects.clear()
+    }
+
+    /**
+     * Sets the maximum time (in milliseconds) to block the test thread while waiting for animations
+     * before throwing an exception.
+     */
+    @JvmStatic
+    fun setBlockTimeout(timeoutMs: Long) {
+        PhysicsAnimatorTestUtils.timeoutMs = timeoutMs
+    }
+
+    /**
+     * Sets whether all animations should block the test thread until they end. This is typically
+     * the desired behavior, since you can invoke code that runs an animation and then assert things
+     * about its end state.
+     */
+    @JvmStatic
+    fun setAllAnimationsBlock(block: Boolean) {
+        startBlocksUntilAnimationsEnd = block
+    }
+
+    /**
+     * Blocks the calling thread until animations of the given property on the target object end.
+     */
+    @JvmStatic
+    @Throws(InterruptedException::class)
+    fun <T : Any> blockUntilAnimationsEnd(
+        animator: PhysicsAnimator<T>,
+        vararg properties: FloatPropertyCompat<in T>
+    ) {
+        val animatingProperties = HashSet<FloatPropertyCompat<in T>>()
+        for (property in properties) {
+            if (animator.isPropertyAnimating(property)) {
+                animatingProperties.add(property)
+            }
+        }
+
+        if (animatingProperties.size > 0) {
+            val latch = CountDownLatch(animatingProperties.size)
+            getAnimationTestHelper(animator).addTestEndListener(
+                    object : PhysicsAnimator.EndListener<T> {
+                override fun onAnimationEnd(
+                    target: T,
+                    property: FloatPropertyCompat<in T>,
+                    wasFling: Boolean,
+                    canceled: Boolean,
+                    finalValue: Float,
+                    finalVelocity: Float,
+                    allRelevantPropertyAnimsEnded: Boolean
+                ) {
+                    if (animatingProperties.contains(property)) {
+                        latch.countDown()
+                    }
+                }
+            })
+
+            latch.await(timeoutMs, TimeUnit.MILLISECONDS)
+        }
+    }
+
+    /**
+     * Blocks the calling thread until all animations of the given property (on all target objects)
+     * have ended. Useful when you don't have access to the objects being animated, but still need
+     * to wait for them to end so that other testable side effects occur (such as update/end
+     * listeners).
+     */
+    @JvmStatic
+    @Throws(InterruptedException::class)
+    @Suppress("UNCHECKED_CAST")
+    fun <T : Any> blockUntilAnimationsEnd(
+        vararg properties: FloatPropertyCompat<in T>
+    ) {
+        for (target in allAnimatedObjects) {
+            try {
+                blockUntilAnimationsEnd(
+                        PhysicsAnimator.getInstance(target) as PhysicsAnimator<T>, *properties)
+            } catch (e: ClassCastException) {
+                // Keep checking the other objects for ones whose types match the provided
+                // properties.
+            }
+        }
+    }
+
+    /**
+     * Blocks the calling thread until the first animation frame in which predicate returns true. If
+     * the given object isn't animating, returns without blocking.
+     */
+    @JvmStatic
+    @Throws(InterruptedException::class)
+    fun <T : Any> blockUntilFirstAnimationFrameWhereTrue(
+        animator: PhysicsAnimator<T>,
+        predicate: (T) -> Boolean
+    ) {
+        if (animator.isRunning()) {
+            val latch = CountDownLatch(1)
+            getAnimationTestHelper(animator).addTestUpdateListener(object : PhysicsAnimator
+            .UpdateListener<T> {
+                override fun onAnimationUpdateForProperty(
+                    target: T,
+                    values: UpdateMap<T>
+                ) {
+                    if (predicate(target)) {
+                        latch.countDown()
+                    }
+                }
+            })
+
+            latch.await(timeoutMs, TimeUnit.MILLISECONDS)
+        }
+    }
+
+    /**
+     * Verifies that the animator reported animation frame values to update listeners that satisfy
+     * the given matchers, in order. Not all frames need to satisfy a matcher - we'll run through
+     * all animation frames, and check them against the current predicate. If it returns false, we
+     * continue through the frames until it returns true, and then move on to the next matcher.
+     * Verification fails if we run out of frames while unsatisfied matchers remain.
+     *
+     * If verification is successful, all frames to this point are considered 'verified' and will be
+     * cleared. Subsequent calls to this method will start verification at the next animation frame.
+     *
+     * Example: Verify that an animation surpassed x = 50f before going negative.
+     * verifyAnimationUpdateFrames(
+     *    animator, TRANSLATION_X,
+     *    { u -> u.value > 50f },
+     *    { u -> u.value < 0f })
+     *
+     * Example: verify that an animation went backwards at some point while still being on-screen.
+     * verifyAnimationUpdateFrames(
+     *    animator, TRANSLATION_X,
+     *    { u -> u.velocity < 0f && u.value >= 0f })
+     *
+     * This method is intended to help you test longer, more complicated animations where it's
+     * critical that certain values were reached. Using this method to test short animations can
+     * fail due to the animation having fewer frames than provided matchers. For example, an
+     * animation from x = 1f to x = 5f might only have two frames, at x = 3f and x = 5f. The
+     * following would then fail despite it seeming logically sound:
+     *
+     * verifyAnimationUpdateFrames(
+     *    animator, TRANSLATION_X,
+     *    { u -> u.value > 1f },
+     *    { u -> u.value > 2f },
+     *    { u -> u.value > 3f })
+     *
+     * Tests might also fail if your matchers are too granular, such as this example test after an
+     * animation from x = 0f to x = 100f. It's unlikely there was a frame specifically between 2f
+     * and 3f.
+     *
+     * verifyAnimationUpdateFrames(
+     *    animator, TRANSLATION_X,
+     *    { u -> u.value > 2f && u.value < 3f },
+     *    { u -> u.value >= 50f })
+     *
+     * Failures will print a helpful log of all animation frames so you can see what caused the test
+     * to fail.
+     */
+    fun <T : Any> verifyAnimationUpdateFrames(
+        animator: PhysicsAnimator<T>,
+        property: FloatPropertyCompat<in T>,
+        firstUpdateMatcher: UpdateMatcher,
+        vararg additionalUpdateMatchers: UpdateMatcher
+    ) {
+        val updateFrames: UpdateFramesPerProperty<T> = getAnimationUpdateFrames(animator)
+
+        if (!updateFrames.containsKey(property)) {
+            error("No frames for given target object and property.")
+        }
+
+        // Copy the frames to avoid a ConcurrentModificationException if the animation update
+        // listeners attempt to add a new frame while we're verifying these.
+        val framesForProperty = ArrayList(updateFrames[property]!!)
+        val matchers = ArrayDeque<UpdateMatcher>(
+                additionalUpdateMatchers.toList())
+        val frameTraceMessage = StringBuilder()
+
+        var curMatcher = firstUpdateMatcher
+
+        // Loop through the updates from the testable animator.
+        for (update in framesForProperty) {
+            // Check whether this frame satisfies the current matcher.
+            if (curMatcher(update)) {
+                // If that was the last unsatisfied matcher, we're good here. 'Verify' all remaining
+                // frames and return without failing.
+                if (matchers.size == 0) {
+                    getAnimationUpdateFrames(animator).remove(property)
+                    return
+                }
+
+                frameTraceMessage.append("$update\t(satisfied matcher)\n")
+                curMatcher = matchers.pop() // Get the next matcher and keep going.
+            } else {
+                frameTraceMessage.append("${update}\n")
+            }
+        }
+
+        val readablePropertyName = PhysicsAnimator.getReadablePropertyName(property)
+        getAnimationUpdateFrames(animator).remove(property)
+
+        throw RuntimeException(
+                "Failed to verify animation frames for property $readablePropertyName: " +
+                        "Provided ${additionalUpdateMatchers.size + 1} matchers, " +
+                        "however ${matchers.size + 1} remained unsatisfied.\n\n" +
+                        "All frames:\n$frameTraceMessage")
+    }
+
+    /**
+     * Overload of [verifyAnimationUpdateFrames] that builds matchers for you, from given float
+     * values. For example, to verify that an animations passed from 0f to 50f to 100f back to 50f:
+     *
+     * verifyAnimationUpdateFrames(animator, TRANSLATION_X, 0f, 50f, 100f, 50f)
+     *
+     * This verifies that update frames were received with values of >= 0f, >= 50f, >= 100f, and
+     * <= 50f.
+     *
+     * The same caveats apply: short animations might not have enough frames to satisfy all of the
+     * matchers, and overly specific calls (such as 0f, 1f, 2f, 3f, etc. for an animation from
+     * x = 0f to x = 100f) might fail as the animation only had frames at 0f, 25f, 50f, 75f, and
+     * 100f. As with [verifyAnimationUpdateFrames], failures will print a helpful log of all frames
+     * so you can see what caused the test to fail.
+     */
+    fun <T : Any> verifyAnimationUpdateFrames(
+        animator: PhysicsAnimator<T>,
+        property: FloatPropertyCompat<in T>,
+        startValue: Float,
+        firstTargetValue: Float,
+        vararg additionalTargetValues: Float
+    ) {
+        val matchers = ArrayList<UpdateMatcher>()
+
+        val values = ArrayList<Float>().also {
+            it.add(firstTargetValue)
+            it.addAll(additionalTargetValues.toList())
+        }
+
+        var prevVal = startValue
+        for (value in values) {
+            if (value > prevVal) {
+                matchers.add { update -> update.value >= value }
+            } else {
+                matchers.add { update -> update.value <= value }
+            }
+
+            prevVal = value
+        }
+
+        verifyAnimationUpdateFrames(
+                animator, property, matchers[0], *matchers.drop(0).toTypedArray())
+    }
+
+    /**
+     * Returns all of the values that have ever been reported to update listeners, per property.
+     */
+    @Suppress("UNCHECKED_CAST")
+    fun <T : Any> getAnimationUpdateFrames(animator: PhysicsAnimator<T>):
+            UpdateFramesPerProperty<T> {
+        return animatorTestHelpers[animator]?.getUpdates() as UpdateFramesPerProperty<T>
+    }
+
+    /**
+     * Clears animation frame updates from the given animator so they aren't used the next time its
+     * passed to [verifyAnimationUpdateFrames].
+     */
+    fun <T : Any> clearAnimationUpdateFrames(animator: PhysicsAnimator<T>) {
+        animatorTestHelpers[animator]?.clearUpdates()
+    }
+
+    @Suppress("UNCHECKED_CAST")
+    private fun <T> getAnimationTestHelper(animator: PhysicsAnimator<T>): AnimatorTestHelper<T> {
+        return animatorTestHelpers[animator] as AnimatorTestHelper<T>
+    }
+
+    /**
+     * Helper class for testing an animator. This replaces the animator's start action with
+     * [startForTest] and adds test listeners to enable other test utility behaviors. We build one
+     * these for each Animator and keep them around so we can access the updates.
+     */
+    class AnimatorTestHelper<T> (private val animator: PhysicsAnimator<T>) {
+
+        /** All updates received for each property animation. */
+        private val allUpdates =
+                ArrayMap<FloatPropertyCompat<in T>, ArrayList<PhysicsAnimator.AnimationUpdate>>()
+
+        private val testEndListeners = ArrayList<PhysicsAnimator.EndListener<T>>()
+        private val testUpdateListeners = ArrayList<PhysicsAnimator.UpdateListener<T>>()
+
+        /** Whether we're currently in the middle of executing startInternal(). */
+        private var currentlyRunningStartInternal = false
+
+        init {
+            animator.startAction = ::startForTest
+            animator.cancelAction = ::cancelForTest
+        }
+
+        internal fun addTestEndListener(listener: PhysicsAnimator.EndListener<T>) {
+            testEndListeners.add(listener)
+        }
+
+        internal fun addTestUpdateListener(listener: PhysicsAnimator.UpdateListener<T>) {
+            testUpdateListeners.add(listener)
+        }
+
+        internal fun getUpdates(): UpdateFramesPerProperty<T> {
+            return allUpdates
+        }
+
+        internal fun clearUpdates() {
+            allUpdates.clear()
+        }
+
+        private fun startForTest() {
+            // The testable animator needs to block the main thread until super.start() has been
+            // called, since callers expect .start() to be synchronous but we're posting it to a
+            // handler here. We may also continue blocking until all animations end, if
+            // startBlocksUntilAnimationsEnd = true.
+            val unblockLatch = CountDownLatch(if (startBlocksUntilAnimationsEnd) 2 else 1)
+
+            animationThreadHandler.post {
+                // Add an update listener that dispatches to any test update listeners added by
+                // tests.
+                animator.addUpdateListener(object : PhysicsAnimator.UpdateListener<T> {
+                    override fun onAnimationUpdateForProperty(
+                        target: T,
+                        values: ArrayMap<FloatPropertyCompat<in T>, PhysicsAnimator.AnimationUpdate>
+                    ) {
+                        values.forEach { (property, value) ->
+                            allUpdates.getOrPut(property, { ArrayList() }).add(value)
+                        }
+
+                        for (listener in testUpdateListeners) {
+                            listener.onAnimationUpdateForProperty(target, values)
+                        }
+                    }
+                })
+
+                // Add an end listener that dispatches to any test end listeners added by tests, and
+                // unblocks the main thread if required.
+                animator.addEndListener(object : PhysicsAnimator.EndListener<T> {
+                    override fun onAnimationEnd(
+                        target: T,
+                        property: FloatPropertyCompat<in T>,
+                        wasFling: Boolean,
+                        canceled: Boolean,
+                        finalValue: Float,
+                        finalVelocity: Float,
+                        allRelevantPropertyAnimsEnded: Boolean
+                    ) {
+                        for (listener in testEndListeners) {
+                            listener.onAnimationEnd(
+                                    target, property, wasFling, canceled, finalValue, finalVelocity,
+                                    allRelevantPropertyAnimsEnded)
+                        }
+
+                        if (allRelevantPropertyAnimsEnded) {
+                            testEndListeners.clear()
+                            testUpdateListeners.clear()
+
+                            if (startBlocksUntilAnimationsEnd) {
+                                unblockLatch.countDown()
+                            }
+                        }
+                    }
+                })
+
+                currentlyRunningStartInternal = true
+                animator.startInternal()
+                currentlyRunningStartInternal = false
+                unblockLatch.countDown()
+            }
+
+            unblockLatch.await(timeoutMs, TimeUnit.MILLISECONDS)
+        }
+
+        private fun cancelForTest(properties: Set<FloatPropertyCompat<in T>>) {
+            // If this was called from startInternal, we are already on the animation thread, and
+            // should just call cancelInternal rather than posting it. If we post it, the
+            // cancellation will occur after the rest of startInternal() and we'll immediately
+            // cancel the animation we worked so hard to start!
+            if (currentlyRunningStartInternal) {
+                animator.cancelInternal(properties)
+                return
+            }
+
+            val unblockLatch = CountDownLatch(1)
+
+            animationThreadHandler.post {
+                animator.cancelInternal(properties)
+                unblockLatch.countDown()
+            }
+
+            unblockLatch.await(timeoutMs, TimeUnit.MILLISECONDS)
+        }
+    }
+}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ChoreographerSfVsync.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ChoreographerSfVsync.java
new file mode 100644
index 0000000..a1496ac
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ChoreographerSfVsync.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 com.android.wm.shell.shared.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.inject.Qualifier;
+
+/**
+ * Annotates a method that or qualifies a provider runs aligned to the Choreographer SF vsync
+ * instead of the app vsync.
+ */
+@Documented
+@Inherited
+@Qualifier
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ChoreographerSfVsync {}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ExternalMainThread.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ExternalMainThread.java
new file mode 100644
index 0000000..52a717b
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ExternalMainThread.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 com.android.wm.shell.shared.annotations;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+
+import javax.inject.Qualifier;
+
+/**
+ * Annotates a method or qualifies a provider that runs on the main-thread of the process using
+ * this library.
+ */
+@Qualifier
+@Documented
+@Retention(RUNTIME)
+public @interface ExternalMainThread {
+}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ExternalThread.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ExternalThread.java
new file mode 100644
index 0000000..ae5188c
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ExternalThread.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.wm.shell.shared.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.inject.Qualifier;
+
+/** Annotates a method or class that is called from an external thread to the Shell threads. */
+@Documented
+@Inherited
+@Qualifier
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExternalThread {}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellAnimationThread.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellAnimationThread.java
new file mode 100644
index 0000000..bd2887e
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellAnimationThread.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.wm.shell.shared.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.inject.Qualifier;
+
+/** Annotates a method or qualifies a provider that runs on the Shell animation-thread */
+@Documented
+@Inherited
+@Qualifier
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ShellAnimationThread {}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellBackgroundThread.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellBackgroundThread.java
new file mode 100644
index 0000000..586ac82
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellBackgroundThread.java
@@ -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.wm.shell.shared.annotations;
+
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.inject.Qualifier;
+
+/** Annotates a method or qualifies a provider that runs on the shared background thread */
+@Documented
+@Inherited
+@Qualifier
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ShellBackgroundThread {
+}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellMainThread.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellMainThread.java
new file mode 100644
index 0000000..6c879a49
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellMainThread.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.wm.shell.shared.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.inject.Qualifier;
+
+/** Annotates a method or qualifies a provider that runs on the Shell main-thread */
+@Documented
+@Inherited
+@Qualifier
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ShellMainThread {}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellSplashscreenThread.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellSplashscreenThread.java
new file mode 100644
index 0000000..4887dbe
--- /dev/null
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/annotations/ShellSplashscreenThread.java
@@ -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.wm.shell.shared.annotations;
+
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.inject.Qualifier;
+
+/** Annotates a method or qualifies a provider that runs on the Shell splashscreen-thread */
+@Documented
+@Inherited
+@Qualifier
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ShellSplashscreenThread {
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/animation/PhysicsAnimator.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/animation/PhysicsAnimator.kt
deleted file mode 100644
index b7f0890..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/animation/PhysicsAnimator.kt
+++ /dev/null
@@ -1,1032 +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.wm.shell.animation
-
-import android.util.ArrayMap
-import android.util.Log
-import android.view.View
-import androidx.dynamicanimation.animation.DynamicAnimation
-import androidx.dynamicanimation.animation.FlingAnimation
-import androidx.dynamicanimation.animation.FloatPropertyCompat
-import androidx.dynamicanimation.animation.SpringAnimation
-import androidx.dynamicanimation.animation.SpringForce
-
-import com.android.wm.shell.animation.PhysicsAnimator.Companion.getInstance
-import java.lang.ref.WeakReference
-import java.util.WeakHashMap
-import kotlin.math.abs
-import kotlin.math.max
-import kotlin.math.min
-
-/**
- * Extension function for all objects which will return a PhysicsAnimator instance for that object.
- */
-val <T : View> T.physicsAnimator: PhysicsAnimator<T> get() { return getInstance(this) }
-
-private const val TAG = "PhysicsAnimator"
-
-private val UNSET = -Float.MAX_VALUE
-
-/**
- * [FlingAnimation] multiplies the friction set via [FlingAnimation.setFriction] by 4.2f, which is
- * where this number comes from. We use it in [PhysicsAnimator.flingThenSpring] to calculate the
- * minimum velocity for a fling to reach a certain value, given the fling's friction.
- */
-private const val FLING_FRICTION_SCALAR_MULTIPLIER = 4.2f
-
-typealias EndAction = () -> Unit
-
-/** A map of Property -> AnimationUpdate, which is provided to update listeners on each frame. */
-typealias UpdateMap<T> =
-        ArrayMap<FloatPropertyCompat<in T>, PhysicsAnimator.AnimationUpdate>
-
-/**
- * Map of the animators associated with a given object. This ensures that only one animator
- * per object exists.
- */
-internal val animators = WeakHashMap<Any, PhysicsAnimator<*>>()
-
-/**
- * Default spring configuration to use for animations where stiffness and/or damping ratio
- * were not provided, and a default spring was not set via [PhysicsAnimator.setDefaultSpringConfig].
- */
-private val globalDefaultSpring = PhysicsAnimator.SpringConfig(
-        SpringForce.STIFFNESS_MEDIUM,
-        SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY)
-
-/**
- * Default fling configuration to use for animations where friction was not provided, and a default
- * fling config was not set via [PhysicsAnimator.setDefaultFlingConfig].
- */
-private val globalDefaultFling = PhysicsAnimator.FlingConfig(
-        friction = 1f, min = -Float.MAX_VALUE, max = Float.MAX_VALUE)
-
-/** Whether to log helpful debug information about animations. */
-private var verboseLogging = false
-
-/**
- * Animator that uses physics-based animations to animate properties on views and objects. Physics
- * animations use real-world physical concepts, such as momentum and mass, to realistically simulate
- * motion. PhysicsAnimator is heavily inspired by [android.view.ViewPropertyAnimator], and
- * also uses the builder pattern to configure and start animations.
- *
- * The physics animations are backed by [DynamicAnimation].
- *
- * @param T The type of the object being animated.
- */
-class PhysicsAnimator<T> private constructor (target: T) {
-    /** Weak reference to the animation target. */
-    val weakTarget = WeakReference(target)
-
-    /** Data class for representing animation frame updates. */
-    data class AnimationUpdate(val value: Float, val velocity: Float)
-
-    /** [DynamicAnimation] instances for the given properties. */
-    private val springAnimations = ArrayMap<FloatPropertyCompat<in T>, SpringAnimation>()
-    private val flingAnimations = ArrayMap<FloatPropertyCompat<in T>, FlingAnimation>()
-
-    /**
-     * Spring and fling configurations for the properties to be animated on the target. We'll
-     * configure and start the DynamicAnimations for these properties according to the provided
-     * configurations.
-     */
-    private val springConfigs = ArrayMap<FloatPropertyCompat<in T>, SpringConfig>()
-    private val flingConfigs = ArrayMap<FloatPropertyCompat<in T>, FlingConfig>()
-
-    /**
-     * Animation listeners for the animation. These will be notified when each property animation
-     * updates or ends.
-     */
-    private val updateListeners = ArrayList<UpdateListener<T>>()
-    private val endListeners = ArrayList<EndListener<T>>()
-
-    /** End actions to run when all animations have completed.  */
-    private val endActions = ArrayList<EndAction>()
-
-    /** SpringConfig to use by default for properties whose springs were not provided. */
-    private var defaultSpring: SpringConfig = globalDefaultSpring
-
-    /** FlingConfig to use by default for properties whose fling configs were not provided. */
-    private var defaultFling: FlingConfig = globalDefaultFling
-
-    /**
-     * Internal listeners that respond to DynamicAnimations updating and ending, and dispatch to
-     * the listeners provided via [addUpdateListener] and [addEndListener]. This allows us to add
-     * just one permanent update and end listener to the DynamicAnimations.
-     */
-    internal var internalListeners = ArrayList<InternalListener>()
-
-    /**
-     * Action to run when [start] is called. This can be changed by
-     * [PhysicsAnimatorTestUtils.prepareForTest] to enable animators to run under test and provide
-     * helpful test utilities.
-     */
-    internal var startAction: () -> Unit = ::startInternal
-
-    /**
-     * Action to run when [cancel] is called. This can be changed by
-     * [PhysicsAnimatorTestUtils.prepareForTest] to cancel animations from the main thread, which
-     * is required.
-     */
-    internal var cancelAction: (Set<FloatPropertyCompat<in T>>) -> Unit = ::cancelInternal
-
-    /**
-     * Springs a property to the given value, using the provided configuration settings.
-     *
-     * Springs are used when you know the exact value to which you want to animate. They can be
-     * configured with a start velocity (typically used when the spring is initiated by a touch
-     * event), but this velocity will be realistically attenuated as forces are applied to move the
-     * property towards the end value.
-     *
-     * If you find yourself repeating the same stiffness and damping ratios many times, consider
-     * storing a single [SpringConfig] instance and passing that in instead of individual values.
-     *
-     * @param property The property to spring to the given value. The property must be an instance
-     * of FloatPropertyCompat&lt;? super T&gt;. For example, if this is a
-     * PhysicsAnimator&lt;FrameLayout&gt;, you can use a FloatPropertyCompat&lt;FrameLayout&gt;, as
-     * well as a FloatPropertyCompat&lt;ViewGroup&gt;, and so on.
-     * @param toPosition The value to spring the given property to.
-     * @param startVelocity The initial velocity to use for the animation.
-     * @param stiffness The stiffness to use for the spring. Higher stiffness values result in
-     * faster animations, while lower stiffness means a slower animation. Reasonable values for
-     * low, medium, and high stiffness can be found as constants in [SpringForce].
-     * @param dampingRatio The damping ratio (bounciness) to use for the spring. Higher values
-     * result in a less 'springy' animation, while lower values allow the animation to bounce
-     * back and forth for a longer time after reaching the final position. Reasonable values for
-     * low, medium, and high damping can be found in [SpringForce].
-     */
-    fun spring(
-        property: FloatPropertyCompat<in T>,
-        toPosition: Float,
-        startVelocity: Float = 0f,
-        stiffness: Float = defaultSpring.stiffness,
-        dampingRatio: Float = defaultSpring.dampingRatio
-    ): PhysicsAnimator<T> {
-        if (verboseLogging) {
-            Log.d(TAG, "Springing ${getReadablePropertyName(property)} to $toPosition.")
-        }
-
-        springConfigs[property] =
-                SpringConfig(stiffness, dampingRatio, startVelocity, toPosition)
-        return this
-    }
-
-    /**
-     * Springs a property to a given value using the provided start velocity and configuration
-     * options.
-     *
-     * @see spring
-     */
-    fun spring(
-        property: FloatPropertyCompat<in T>,
-        toPosition: Float,
-        startVelocity: Float,
-        config: SpringConfig = defaultSpring
-    ): PhysicsAnimator<T> {
-        return spring(
-                property, toPosition, startVelocity, config.stiffness, config.dampingRatio)
-    }
-
-    /**
-     * Springs a property to a given value using the provided configuration options, and a start
-     * velocity of 0f.
-     *
-     * @see spring
-     */
-    fun spring(
-        property: FloatPropertyCompat<in T>,
-        toPosition: Float,
-        config: SpringConfig = defaultSpring
-    ): PhysicsAnimator<T> {
-        return spring(property, toPosition, 0f, config)
-    }
-
-    /**
-     * Springs a property to a given value using the provided configuration options, and a start
-     * velocity of 0f.
-     *
-     * @see spring
-     */
-    fun spring(
-        property: FloatPropertyCompat<in T>,
-        toPosition: Float
-    ): PhysicsAnimator<T> {
-        return spring(property, toPosition, 0f)
-    }
-
-    /**
-     * Flings a property using the given start velocity, using a [FlingAnimation] configured using
-     * the provided configuration settings.
-     *
-     * Flings are used when you have a start velocity, and want the property value to realistically
-     * decrease as friction is applied until the velocity reaches zero. Flings do not have a
-     * deterministic end value. If you are attempting to animate to a specific end value, use
-     * [spring].
-     *
-     * If you find yourself repeating the same friction/min/max values, consider storing a single
-     * [FlingConfig] and passing that in instead.
-     *
-     * @param property The property to fling using the given start velocity.
-     * @param startVelocity The start velocity (in pixels per second) with which to start the fling.
-     * @param friction Friction value applied to slow down the animation over time. Higher values
-     * will more quickly slow the animation. Typical friction values range from 1f to 10f.
-     * @param min The minimum value allowed for the animation. If this value is reached, the
-     * animation will end abruptly.
-     * @param max The maximum value allowed for the animation. If this value is reached, the
-     * animation will end abruptly.
-     */
-    fun fling(
-        property: FloatPropertyCompat<in T>,
-        startVelocity: Float,
-        friction: Float = defaultFling.friction,
-        min: Float = defaultFling.min,
-        max: Float = defaultFling.max
-    ): PhysicsAnimator<T> {
-        if (verboseLogging) {
-            Log.d(TAG, "Flinging ${getReadablePropertyName(property)} " +
-                    "with velocity $startVelocity.")
-        }
-
-        flingConfigs[property] = FlingConfig(friction, min, max, startVelocity)
-        return this
-    }
-
-    /**
-     * Flings a property using the given start velocity, using a [FlingAnimation] configured using
-     * the provided configuration settings.
-     *
-     * @see fling
-     */
-    fun fling(
-        property: FloatPropertyCompat<in T>,
-        startVelocity: Float,
-        config: FlingConfig = defaultFling
-    ): PhysicsAnimator<T> {
-        return fling(property, startVelocity, config.friction, config.min, config.max)
-    }
-
-    /**
-     * Flings a property using the given start velocity. If the fling animation reaches the min/max
-     * bounds (from the [flingConfig]) with velocity remaining, it'll overshoot it and spring back.
-     *
-     * If the object is already out of the fling bounds, it will immediately spring back within
-     * bounds.
-     *
-     * This is useful for animating objects that are bounded by constraints such as screen edges,
-     * since otherwise the fling animation would end abruptly upon reaching the min/max bounds.
-     *
-     * @param property The property to animate.
-     * @param startVelocity The velocity, in pixels/second, with which to start the fling. If the
-     * object is already outside the fling bounds, this velocity will be used as the start velocity
-     * of the spring that will spring it back within bounds.
-     * @param flingMustReachMinOrMax If true, the fling animation is guaranteed to reach either its
-     * minimum bound (if [startVelocity] is negative) or maximum bound (if it's positive). The
-     * animator will use startVelocity if it's sufficient, or add more velocity if necessary. This
-     * is useful when fling's deceleration-based physics are preferable to the acceleration-based
-     * forces used by springs - typically, when you're allowing the user to move an object somewhere
-     * on the screen, but it needs to be along an edge.
-     * @param flingConfig The configuration to use for the fling portion of the animation.
-     * @param springConfig The configuration to use for the spring portion of the animation.
-     */
-    @JvmOverloads
-    fun flingThenSpring(
-        property: FloatPropertyCompat<in T>,
-        startVelocity: Float,
-        flingConfig: FlingConfig,
-        springConfig: SpringConfig,
-        flingMustReachMinOrMax: Boolean = false
-    ): PhysicsAnimator<T> {
-        val target = weakTarget.get()
-        if (target == null) {
-            Log.w(TAG, "Trying to animate a GC-ed target.")
-            return this
-        }
-        val flingConfigCopy = flingConfig.copy()
-        val springConfigCopy = springConfig.copy()
-        val toAtLeast = if (startVelocity < 0) flingConfig.min else flingConfig.max
-
-        if (flingMustReachMinOrMax && isValidValue(toAtLeast)) {
-            val currentValue = property.getValue(target)
-            val flingTravelDistance =
-                    startVelocity / (flingConfig.friction * FLING_FRICTION_SCALAR_MULTIPLIER)
-            val projectedFlingEndValue = currentValue + flingTravelDistance
-            val midpoint = (flingConfig.min + flingConfig.max) / 2
-
-            // If fling velocity is too low to push the target past the midpoint between min and
-            // max, then spring back towards the nearest edge, starting with the current velocity.
-            if ((startVelocity < 0 && projectedFlingEndValue > midpoint) ||
-                    (startVelocity > 0 && projectedFlingEndValue < midpoint)) {
-                val toPosition =
-                        if (projectedFlingEndValue < midpoint) flingConfig.min else flingConfig.max
-                if (isValidValue(toPosition)) {
-                    return spring(property, toPosition, startVelocity, springConfig)
-                }
-            }
-
-            // Projected fling end value is past the midpoint, so fling forward.
-            val distanceToDestination = toAtLeast - property.getValue(target)
-
-            // The minimum velocity required for the fling to end up at the given destination,
-            // taking the provided fling friction value.
-            val velocityToReachDestination = distanceToDestination *
-                    (flingConfig.friction * FLING_FRICTION_SCALAR_MULTIPLIER)
-
-            // If there's distance to cover, and the provided velocity is moving in the correct
-            // direction, ensure that the velocity is high enough to reach the destination.
-            // Otherwise, just use startVelocity - this means that the fling is at or out of bounds.
-            // The fling will immediately end and a spring will bring the object back into bounds
-            // with this startVelocity.
-            flingConfigCopy.startVelocity = when {
-                distanceToDestination > 0f && startVelocity >= 0f ->
-                    max(velocityToReachDestination, startVelocity)
-                distanceToDestination < 0f && startVelocity <= 0f ->
-                    min(velocityToReachDestination, startVelocity)
-                else -> startVelocity
-            }
-
-            springConfigCopy.finalPosition = toAtLeast
-        } else {
-            flingConfigCopy.startVelocity = startVelocity
-        }
-
-        flingConfigs[property] = flingConfigCopy
-        springConfigs[property] = springConfigCopy
-        return this
-    }
-
-    private fun isValidValue(value: Float) = value < Float.MAX_VALUE && value > -Float.MAX_VALUE
-
-    /**
-     * Adds a listener that will be called whenever any property on the animated object is updated.
-     * This will be called on every animation frame, with the current value of the animated object
-     * and the new property values.
-     */
-    fun addUpdateListener(listener: UpdateListener<T>): PhysicsAnimator<T> {
-        updateListeners.add(listener)
-        return this
-    }
-
-    /**
-     * Adds a listener that will be called when a property stops animating. This is useful if
-     * you care about a specific property ending, or want to use the end value/end velocity from a
-     * particular property's animation. If you just want to run an action when all property
-     * animations have ended, use [withEndActions].
-     */
-    fun addEndListener(listener: EndListener<T>): PhysicsAnimator<T> {
-        endListeners.add(listener)
-        return this
-    }
-
-    /**
-     * Adds end actions that will be run sequentially when animations for every property involved in
-     * this specific animation have ended (unless they were explicitly canceled). For example, if
-     * you call:
-     *
-     * animator
-     *   .spring(TRANSLATION_X, ...)
-     *   .spring(TRANSLATION_Y, ...)
-     *   .withEndAction(action)
-     *   .start()
-     *
-     * 'action' will be run when both TRANSLATION_X and TRANSLATION_Y end.
-     *
-     * Other properties may still be animating, if those animations were not started in the same
-     * call. For example:
-     *
-     * animator
-     *   .spring(ALPHA, ...)
-     *   .start()
-     *
-     * animator
-     *   .spring(TRANSLATION_X, ...)
-     *   .spring(TRANSLATION_Y, ...)
-     *   .withEndAction(action)
-     *   .start()
-     *
-     * 'action' will still be run as soon as TRANSLATION_X and TRANSLATION_Y end, even if ALPHA is
-     * still animating.
-     *
-     * If you want to run actions as soon as a subset of property animations have ended, you want
-     * access to the animation's end value/velocity, or you want to run these actions even if the
-     * animation is explicitly canceled, use [addEndListener]. End listeners have an allEnded param,
-     * which indicates that all relevant animations have ended.
-     */
-    fun withEndActions(vararg endActions: EndAction?): PhysicsAnimator<T> {
-        this.endActions.addAll(endActions.filterNotNull())
-        return this
-    }
-
-    /**
-     * Helper overload so that callers from Java can use Runnables or method references as end
-     * actions without having to explicitly return Unit.
-     */
-    fun withEndActions(vararg endActions: Runnable?): PhysicsAnimator<T> {
-        this.endActions.addAll(endActions.filterNotNull().map { it::run })
-        return this
-    }
-
-    fun setDefaultSpringConfig(defaultSpring: SpringConfig) {
-        this.defaultSpring = defaultSpring
-    }
-
-    fun setDefaultFlingConfig(defaultFling: FlingConfig) {
-        this.defaultFling = defaultFling
-    }
-
-    /** Starts the animations! */
-    fun start() {
-        startAction()
-    }
-
-    /**
-     * Starts the animations for real! This is typically called immediately by [start] unless this
-     * animator is under test.
-     */
-    internal fun startInternal() {
-        val target = weakTarget.get()
-        if (target == null) {
-            Log.w(TAG, "Trying to animate a GC-ed object.")
-            return
-        }
-
-        // Functions that will actually start the animations. These are run after we build and add
-        // the InternalListener, since some animations might update/end immediately and we don't
-        // want to miss those updates.
-        val animationStartActions = ArrayList<() -> Unit>()
-
-        for (animatedProperty in getAnimatedProperties()) {
-            val flingConfig = flingConfigs[animatedProperty]
-            val springConfig = springConfigs[animatedProperty]
-
-            // The property's current value on the object.
-            val currentValue = animatedProperty.getValue(target)
-
-            // Start by checking for a fling configuration. If one is present, we're either flinging
-            // or flinging-then-springing. Either way, we'll want to start the fling first.
-            if (flingConfig != null) {
-                animationStartActions.add {
-                    // When the animation is starting, adjust the min/max bounds to include the
-                    // current value of the property, if necessary. This is required to allow a
-                    // fling to bring an out-of-bounds object back into bounds. For example, if an
-                    // object was dragged halfway off the left side of the screen, but then flung to
-                    // the right, we don't want the animation to end instantly just because the
-                    // object started out of bounds. If the fling is in the direction that would
-                    // take it farther out of bounds, it will end instantly as expected.
-                    flingConfig.apply {
-                        min = min(currentValue, this.min)
-                        max = max(currentValue, this.max)
-                    }
-
-                    // Flings can't be updated to a new position while maintaining velocity, because
-                    // we're using the explicitly provided start velocity. Cancel any flings (or
-                    // springs) on this property before flinging.
-                    cancel(animatedProperty)
-
-                    // Apply the configuration and start the animation.
-                    getFlingAnimation(animatedProperty, target)
-                        .also { flingConfig.applyToAnimation(it) }.start()
-                }
-            }
-
-            // Check for a spring configuration. If one is present, we're either springing, or
-            // flinging-then-springing.
-            if (springConfig != null) {
-                // If there is no corresponding fling config, we're only springing.
-                if (flingConfig == null) {
-                    // Apply the configuration and start the animation.
-                    val springAnim = getSpringAnimation(animatedProperty, target)
-
-                    // Apply the configuration and start the animation.
-                    springConfig.applyToAnimation(springAnim)
-                    animationStartActions.add(springAnim::start)
-                } else {
-                    // If there's a corresponding fling config, we're flinging-then-springing. Save
-                    // the fling's original bounds so we can spring to them when the fling ends.
-                    val flingMin = flingConfig.min
-                    val flingMax = flingConfig.max
-
-                    // Add an end listener that will start the spring when the fling ends.
-                    endListeners.add(0, object : EndListener<T> {
-                        override fun onAnimationEnd(
-                            target: T,
-                            property: FloatPropertyCompat<in T>,
-                            wasFling: Boolean,
-                            canceled: Boolean,
-                            finalValue: Float,
-                            finalVelocity: Float,
-                            allRelevantPropertyAnimsEnded: Boolean
-                        ) {
-                            // If this isn't the relevant property, it wasn't a fling, or the fling
-                            // was explicitly cancelled, don't spring.
-                            if (property != animatedProperty || !wasFling || canceled) {
-                                return
-                            }
-
-                            val endedWithVelocity = abs(finalVelocity) > 0
-
-                            // If the object was out of bounds when the fling animation started, it
-                            // will immediately end. In that case, we'll spring it back in bounds.
-                            val endedOutOfBounds = finalValue !in flingMin..flingMax
-
-                            // If the fling ended either out of bounds or with remaining velocity,
-                            // it's time to spring.
-                            if (endedWithVelocity || endedOutOfBounds) {
-                                springConfig.startVelocity = finalVelocity
-
-                                // If the spring's final position isn't set, this is a
-                                // flingThenSpring where flingMustReachMinOrMax was false. We'll
-                                // need to set the spring's final position here.
-                                if (springConfig.finalPosition == UNSET) {
-                                    if (endedWithVelocity) {
-                                        // If the fling ended with negative velocity, that means it
-                                        // hit the min bound, so spring to that bound (and vice
-                                        // versa).
-                                        springConfig.finalPosition =
-                                                if (finalVelocity < 0) flingMin else flingMax
-                                    } else if (endedOutOfBounds) {
-                                        // If the fling ended out of bounds, spring it to the
-                                        // nearest bound.
-                                        springConfig.finalPosition =
-                                                if (finalValue < flingMin) flingMin else flingMax
-                                    }
-                                }
-
-                                // Apply the configuration and start the spring animation.
-                                getSpringAnimation(animatedProperty, target)
-                                    .also { springConfig.applyToAnimation(it) }.start()
-                            }
-                        }
-                    })
-                }
-            }
-        }
-
-        // Add an internal listener that will dispatch animation events to the provided listeners.
-        internalListeners.add(InternalListener(
-                target,
-                getAnimatedProperties(),
-                ArrayList(updateListeners),
-                ArrayList(endListeners),
-                ArrayList(endActions)))
-
-        // Actually start the DynamicAnimations. This is delayed until after the InternalListener is
-        // constructed and added so that we don't miss the end listener firing for any animations
-        // that immediately end.
-        animationStartActions.forEach { it.invoke() }
-
-        clearAnimator()
-    }
-
-    /** Clear the animator's builder variables. */
-    private fun clearAnimator() {
-        springConfigs.clear()
-        flingConfigs.clear()
-
-        updateListeners.clear()
-        endListeners.clear()
-        endActions.clear()
-    }
-
-    /** Retrieves a spring animation for the given property, building one if needed. */
-    private fun getSpringAnimation(
-        property: FloatPropertyCompat<in T>,
-        target: T
-    ): SpringAnimation {
-        return springAnimations.getOrPut(
-                property,
-                { configureDynamicAnimation(SpringAnimation(target, property), property)
-                        as SpringAnimation })
-    }
-
-    /** Retrieves a fling animation for the given property, building one if needed. */
-    private fun getFlingAnimation(property: FloatPropertyCompat<in T>, target: T): FlingAnimation {
-        return flingAnimations.getOrPut(
-                property,
-                { configureDynamicAnimation(FlingAnimation(target, property), property)
-                        as FlingAnimation })
-    }
-
-    /**
-     * Adds update and end listeners to the DynamicAnimation which will dispatch to the internal
-     * listeners.
-     */
-    private fun configureDynamicAnimation(
-        anim: DynamicAnimation<*>,
-        property: FloatPropertyCompat<in T>
-    ): DynamicAnimation<*> {
-        anim.addUpdateListener { _, value, velocity ->
-            for (i in 0 until internalListeners.size) {
-                internalListeners[i].onInternalAnimationUpdate(property, value, velocity)
-            }
-        }
-        anim.addEndListener { _, canceled, value, velocity ->
-            internalListeners.removeAll {
-                it.onInternalAnimationEnd(
-                        property, canceled, value, velocity, anim is FlingAnimation)
-            }
-            if (springAnimations[property] == anim) {
-                springAnimations.remove(property)
-            }
-            if (flingAnimations[property] == anim) {
-                flingAnimations.remove(property)
-            }
-        }
-        return anim
-    }
-
-    /**
-     * Internal listener class that receives updates from DynamicAnimation listeners, and dispatches
-     * them to the appropriate update/end listeners. This class is also aware of which properties
-     * were being animated when the end listeners were passed in, so that we can provide the
-     * appropriate value for allEnded to [EndListener.onAnimationEnd].
-     */
-    internal inner class InternalListener constructor(
-        private val target: T,
-        private var properties: Set<FloatPropertyCompat<in T>>,
-        private var updateListeners: List<UpdateListener<T>>,
-        private var endListeners: List<EndListener<T>>,
-        private var endActions: List<EndAction>
-    ) {
-
-        /** The number of properties whose animations haven't ended. */
-        private var numPropertiesAnimating = properties.size
-
-        /**
-         * Update values that haven't yet been dispatched because not all property animations have
-         * updated yet.
-         */
-        private val undispatchedUpdates =
-                ArrayMap<FloatPropertyCompat<in T>, AnimationUpdate>()
-
-        /** Called when a DynamicAnimation updates.  */
-        internal fun onInternalAnimationUpdate(
-            property: FloatPropertyCompat<in T>,
-            value: Float,
-            velocity: Float
-        ) {
-            // If this property animation isn't relevant to this listener, ignore it.
-            if (!properties.contains(property)) {
-                return
-            }
-
-            undispatchedUpdates[property] = AnimationUpdate(value, velocity)
-            maybeDispatchUpdates()
-        }
-
-        /**
-         * Called when a DynamicAnimation ends.
-         *
-         * @return True if this listener should be removed from the list of internal listeners, so
-         * it no longer receives updates from DynamicAnimations.
-         */
-        internal fun onInternalAnimationEnd(
-            property: FloatPropertyCompat<in T>,
-            canceled: Boolean,
-            finalValue: Float,
-            finalVelocity: Float,
-            isFling: Boolean
-        ): Boolean {
-            // If this property animation isn't relevant to this listener, ignore it.
-            if (!properties.contains(property)) {
-                return false
-            }
-
-            // Dispatch updates if we have one for each property.
-            numPropertiesAnimating--
-            maybeDispatchUpdates()
-
-            // If we didn't have an update for each property, dispatch the update for the ending
-            // property. This guarantees that an update isn't sent for this property *after* we call
-            // onAnimationEnd for that property.
-            if (undispatchedUpdates.contains(property)) {
-                updateListeners.forEach { updateListener ->
-                    updateListener.onAnimationUpdateForProperty(
-                            target,
-                            UpdateMap<T>().also { it[property] = undispatchedUpdates[property] })
-                }
-
-                undispatchedUpdates.remove(property)
-            }
-
-            val allEnded = !arePropertiesAnimating(properties)
-            endListeners.forEach {
-                it.onAnimationEnd(
-                        target, property, isFling, canceled, finalValue, finalVelocity,
-                        allEnded)
-
-                // Check that the end listener didn't restart this property's animation.
-                if (isPropertyAnimating(property)) {
-                    return false
-                }
-            }
-
-            // If all of the animations that this listener cares about have ended, run the end
-            // actions unless the animation was canceled.
-            if (allEnded && !canceled) {
-                endActions.forEach { it() }
-            }
-
-            return allEnded
-        }
-
-        /**
-         * Dispatch undispatched values if we've received an update from each of the animating
-         * properties.
-         */
-        private fun maybeDispatchUpdates() {
-            if (undispatchedUpdates.size >= numPropertiesAnimating &&
-                    undispatchedUpdates.size > 0) {
-                updateListeners.forEach {
-                    it.onAnimationUpdateForProperty(target, ArrayMap(undispatchedUpdates))
-                }
-
-                undispatchedUpdates.clear()
-            }
-        }
-    }
-
-    /** Return true if any animations are running on the object.  */
-    fun isRunning(): Boolean {
-        return arePropertiesAnimating(springAnimations.keys.union(flingAnimations.keys))
-    }
-
-    /** Returns whether the given property is animating.  */
-    fun isPropertyAnimating(property: FloatPropertyCompat<in T>): Boolean {
-        return springAnimations[property]?.isRunning ?: false ||
-                flingAnimations[property]?.isRunning ?: false
-    }
-
-    /** Returns whether any of the given properties are animating.  */
-    fun arePropertiesAnimating(properties: Set<FloatPropertyCompat<in T>>): Boolean {
-        return properties.any { isPropertyAnimating(it) }
-    }
-
-    /** Return the set of properties that will begin animating upon calling [start]. */
-    internal fun getAnimatedProperties(): Set<FloatPropertyCompat<in T>> {
-        return springConfigs.keys.union(flingConfigs.keys)
-    }
-
-    /**
-     * Cancels the given properties. This is typically called immediately by [cancel], unless this
-     * animator is under test.
-     */
-    internal fun cancelInternal(properties: Set<FloatPropertyCompat<in T>>) {
-        for (property in properties) {
-            flingAnimations[property]?.cancel()
-            springAnimations[property]?.cancel()
-        }
-    }
-
-    /** Cancels all in progress animations on all properties. */
-    fun cancel() {
-        if (flingAnimations.size > 0) {
-            cancelAction(flingAnimations.keys)
-        }
-        if (springAnimations.size > 0) {
-            cancelAction(springAnimations.keys)
-        }
-    }
-
-    /** Cancels in progress animations on the provided properties only. */
-    fun cancel(vararg properties: FloatPropertyCompat<in T>) {
-        cancelAction(properties.toSet())
-    }
-
-    /**
-     * Container object for spring animation configuration settings. This allows you to store
-     * default stiffness and damping ratio values in a single configuration object, which you can
-     * pass to [spring].
-     */
-    data class SpringConfig internal constructor(
-        var stiffness: Float,
-        internal var dampingRatio: Float,
-        internal var startVelocity: Float = 0f,
-        internal var finalPosition: Float = UNSET
-    ) {
-
-        constructor() :
-                this(globalDefaultSpring.stiffness, globalDefaultSpring.dampingRatio)
-
-        constructor(stiffness: Float, dampingRatio: Float) :
-                this(stiffness = stiffness, dampingRatio = dampingRatio, startVelocity = 0f)
-
-        /** Apply these configuration settings to the given SpringAnimation. */
-        internal fun applyToAnimation(anim: SpringAnimation) {
-            val springForce = anim.spring ?: SpringForce()
-            anim.spring = springForce.apply {
-                stiffness = [email protected]
-                dampingRatio = [email protected]
-                finalPosition = [email protected]
-            }
-
-            if (startVelocity != 0f) anim.setStartVelocity(startVelocity)
-        }
-    }
-
-    /**
-     * Container object for fling animation configuration settings. This allows you to store default
-     * friction values (as well as optional min/max values) in a single configuration object, which
-     * you can pass to [fling] and related methods.
-     */
-    data class FlingConfig internal constructor(
-        internal var friction: Float,
-        var min: Float,
-        var max: Float,
-        internal var startVelocity: Float
-    ) {
-
-        constructor() : this(globalDefaultFling.friction)
-
-        constructor(friction: Float) :
-                this(friction, globalDefaultFling.min, globalDefaultFling.max)
-
-        constructor(friction: Float, min: Float, max: Float) :
-                this(friction, min, max, startVelocity = 0f)
-
-        /** Apply these configuration settings to the given FlingAnimation. */
-        internal fun applyToAnimation(anim: FlingAnimation) {
-            anim.apply {
-                friction = [email protected]
-                setMinValue(min)
-                setMaxValue(max)
-                setStartVelocity(startVelocity)
-            }
-        }
-    }
-
-    /**
-     * Listener for receiving values from in progress animations. Used with
-     * [PhysicsAnimator.addUpdateListener].
-     *
-     * @param <T> The type of the object being animated.
-    </T> */
-    interface UpdateListener<T> {
-
-        /**
-         * Called on each animation frame with the target object, and a map of FloatPropertyCompat
-         * -> AnimationUpdate, containing the latest value and velocity for that property. When
-         * multiple properties are animating together, the map will typically contain one entry for
-         * each property. However, you should never assume that this is the case - when a property
-         * animation ends earlier than the others, you'll receive an UpdateMap containing only that
-         * property's final update. Subsequently, you'll only receive updates for the properties
-         * that are still animating.
-         *
-         * Always check that the map contains an update for the property you're interested in before
-         * accessing it.
-         *
-         * @param target The animated object itself.
-         * @param values Map of property to AnimationUpdate, which contains that property
-         * animation's latest value and velocity. You should never assume that a particular property
-         * is present in this map.
-         */
-        fun onAnimationUpdateForProperty(
-            target: T,
-            values: UpdateMap<T>
-        )
-    }
-
-    /**
-     * Listener for receiving callbacks when animations end.
-     *
-     * @param <T> The type of the object being animated.
-    </T> */
-    interface EndListener<T> {
-
-        /**
-         * Called with the final animation values as each property animation ends. This can be used
-         * to respond to specific property animations concluding (such as hiding a view when ALPHA
-         * ends, even if the corresponding TRANSLATION animations have not ended).
-         *
-         * If you just want to run an action when all of the property animations have ended, you can
-         * use [PhysicsAnimator.withEndActions].
-         *
-         * @param target The animated object itself.
-         * @param property The property whose animation has just ended.
-         * @param wasFling Whether this property ended after a fling animation (as opposed to a
-         * spring animation). If this property was animated via [flingThenSpring], this will be true
-         * if the fling animation did not reach the min/max bounds, decelerating to a stop
-         * naturally. It will be false if it hit the bounds and was sprung back.
-         * @param canceled Whether the animation was explicitly canceled before it naturally ended.
-         * @param finalValue The final value of the animated property.
-         * @param finalVelocity The final velocity (in pixels per second) of the ended animation.
-         * This is typically zero, unless this was a fling animation which ended abruptly due to
-         * reaching its configured min/max values.
-         * @param allRelevantPropertyAnimsEnded Whether all properties relevant to this end listener
-         * have ended. Relevant properties are those which were animated alongside the
-         * [addEndListener] call where this animator was passed in. For example:
-         *
-         * animator
-         *    .spring(TRANSLATION_X, 100f)
-         *    .spring(TRANSLATION_Y, 200f)
-         *    .withEndListener(firstEndListener)
-         *    .start()
-         *
-         * firstEndListener will be called first for TRANSLATION_X, with allEnded = false,
-         * because TRANSLATION_Y is still running. When TRANSLATION_Y ends, it'll be called with
-         * allEnded = true.
-         *
-         * If a subsequent call to start() is made with other properties, those properties are not
-         * considered relevant and allEnded will still equal true when only TRANSLATION_X and
-         * TRANSLATION_Y end. For example, if immediately after the prior example, while
-         * TRANSLATION_X and TRANSLATION_Y are still animating, we called:
-         *
-         * animator.
-         *    .spring(SCALE_X, 2f, stiffness = 10f) // That will take awhile...
-         *    .withEndListener(secondEndListener)
-         *    .start()
-         *
-         * firstEndListener will still be called with allEnded = true when TRANSLATION_X/Y end, even
-         * though SCALE_X is still animating. Similarly, secondEndListener will be called with
-         * allEnded = true as soon as SCALE_X ends, even if the translation animations are still
-         * running.
-         */
-        fun onAnimationEnd(
-            target: T,
-            property: FloatPropertyCompat<in T>,
-            wasFling: Boolean,
-            canceled: Boolean,
-            finalValue: Float,
-            finalVelocity: Float,
-            allRelevantPropertyAnimsEnded: Boolean
-        )
-    }
-
-    companion object {
-
-        /**
-         * Callback to notify that a new animator was created. Used in [PhysicsAnimatorTestUtils]
-         * to be able to keep track of animators and wait for them to finish.
-         */
-        internal var onAnimatorCreated: (PhysicsAnimator<*>, Any) -> Unit = { _, _ -> }
-
-        @JvmStatic
-        @Suppress("UNCHECKED_CAST")
-        fun <T : Any> getInstance(target: T): PhysicsAnimator<T> {
-            if (!animators.containsKey(target)) {
-                val animator = PhysicsAnimator(target)
-                onAnimatorCreated(animator, target)
-                animators[target] = animator
-            }
-
-            return animators[target] as PhysicsAnimator<T>
-        }
-
-        /**
-         * Set whether all physics animators should log a lot of information about animations.
-         * Useful for debugging!
-         */
-        @JvmStatic
-        fun setVerboseLogging(debug: Boolean) {
-            verboseLogging = debug
-        }
-
-        /**
-         * Estimates the end value of a fling that starts at the given value using the provided
-         * start velocity and fling configuration.
-         *
-         * This is only an estimate. Fling animations use a timing-based physics simulation that is
-         * non-deterministic, so this exact value may not be reached.
-         */
-        @JvmStatic
-        fun estimateFlingEndValue(
-            startValue: Float,
-            startVelocity: Float,
-            flingConfig: FlingConfig
-        ): Float {
-            val distance = startVelocity / (flingConfig.friction * FLING_FRICTION_SCALAR_MULTIPLIER)
-            return Math.min(flingConfig.max, Math.max(flingConfig.min, startValue + distance))
-        }
-
-        @JvmStatic
-        fun getReadablePropertyName(property: FloatPropertyCompat<*>): String {
-            return when (property) {
-                DynamicAnimation.TRANSLATION_X -> "translationX"
-                DynamicAnimation.TRANSLATION_Y -> "translationY"
-                DynamicAnimation.TRANSLATION_Z -> "translationZ"
-                DynamicAnimation.SCALE_X -> "scaleX"
-                DynamicAnimation.SCALE_Y -> "scaleY"
-                DynamicAnimation.ROTATION -> "rotation"
-                DynamicAnimation.ROTATION_X -> "rotationX"
-                DynamicAnimation.ROTATION_Y -> "rotationY"
-                DynamicAnimation.SCROLL_X -> "scrollX"
-                DynamicAnimation.SCROLL_Y -> "scrollY"
-                DynamicAnimation.ALPHA -> "alpha"
-                else -> "Custom FloatPropertyCompat instance"
-            }
-        }
-    }
-}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/animation/PhysicsAnimatorTestUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/animation/PhysicsAnimatorTestUtils.kt
deleted file mode 100644
index 7defc26..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/animation/PhysicsAnimatorTestUtils.kt
+++ /dev/null
@@ -1,480 +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.wm.shell.animation
-
-import android.os.Handler
-import android.os.Looper
-import android.util.ArrayMap
-import androidx.dynamicanimation.animation.FloatPropertyCompat
-import com.android.wm.shell.animation.PhysicsAnimatorTestUtils.prepareForTest
-import java.util.*
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-import kotlin.collections.ArrayList
-import kotlin.collections.HashMap
-import kotlin.collections.HashSet
-import kotlin.collections.Set
-import kotlin.collections.component1
-import kotlin.collections.component2
-import kotlin.collections.drop
-import kotlin.collections.forEach
-import kotlin.collections.getOrPut
-import kotlin.collections.set
-import kotlin.collections.toList
-import kotlin.collections.toTypedArray
-
-typealias UpdateMatcher = (PhysicsAnimator.AnimationUpdate) -> Boolean
-typealias UpdateFramesPerProperty<T> =
-        ArrayMap<FloatPropertyCompat<in T>, ArrayList<PhysicsAnimator.AnimationUpdate>>
-
-/**
- * Utilities for testing code that uses [PhysicsAnimator].
- *
- * Start by calling [prepareForTest] at the beginning of each test - this will modify the behavior
- * of all PhysicsAnimator instances so that they post animations to the main thread (so they don't
- * crash). It'll also enable the use of the other static helper methods in this class, which you can
- * use to do things like block the test until animations complete (so you can test end states), or
- * verify keyframes.
- */
-object PhysicsAnimatorTestUtils {
-    var timeoutMs: Long = 2000
-    private var startBlocksUntilAnimationsEnd = false
-    private val animationThreadHandler = Handler(Looper.getMainLooper())
-    private val allAnimatedObjects = HashSet<Any>()
-    private val animatorTestHelpers = HashMap<PhysicsAnimator<*>, AnimatorTestHelper<*>>()
-
-    /**
-     * Modifies the behavior of all [PhysicsAnimator] instances so that they post animations to the
-     * main thread, and report all of their
-     */
-    @JvmStatic
-    fun prepareForTest() {
-        PhysicsAnimator.onAnimatorCreated = { animator, target ->
-            allAnimatedObjects.add(target)
-            animatorTestHelpers[animator] = AnimatorTestHelper(animator)
-        }
-
-        timeoutMs = 2000
-        startBlocksUntilAnimationsEnd = false
-        allAnimatedObjects.clear()
-    }
-
-    @JvmStatic
-    fun tearDown() {
-        val latch = CountDownLatch(1)
-        animationThreadHandler.post {
-            animatorTestHelpers.keys.forEach { it.cancel() }
-            latch.countDown()
-        }
-
-        latch.await()
-
-        animatorTestHelpers.clear()
-        animators.clear()
-        allAnimatedObjects.clear()
-    }
-
-    /**
-     * Sets the maximum time (in milliseconds) to block the test thread while waiting for animations
-     * before throwing an exception.
-     */
-    @JvmStatic
-    fun setBlockTimeout(timeoutMs: Long) {
-        PhysicsAnimatorTestUtils.timeoutMs = timeoutMs
-    }
-
-    /**
-     * Sets whether all animations should block the test thread until they end. This is typically
-     * the desired behavior, since you can invoke code that runs an animation and then assert things
-     * about its end state.
-     */
-    @JvmStatic
-    fun setAllAnimationsBlock(block: Boolean) {
-        startBlocksUntilAnimationsEnd = block
-    }
-
-    /**
-     * Blocks the calling thread until animations of the given property on the target object end.
-     */
-    @JvmStatic
-    @Throws(InterruptedException::class)
-    fun <T : Any> blockUntilAnimationsEnd(
-        animator: PhysicsAnimator<T>,
-        vararg properties: FloatPropertyCompat<in T>
-    ) {
-        val animatingProperties = HashSet<FloatPropertyCompat<in T>>()
-        for (property in properties) {
-            if (animator.isPropertyAnimating(property)) {
-                animatingProperties.add(property)
-            }
-        }
-
-        if (animatingProperties.size > 0) {
-            val latch = CountDownLatch(animatingProperties.size)
-            getAnimationTestHelper(animator).addTestEndListener(
-                    object : PhysicsAnimator.EndListener<T> {
-                override fun onAnimationEnd(
-                    target: T,
-                    property: FloatPropertyCompat<in T>,
-                    wasFling: Boolean,
-                    canceled: Boolean,
-                    finalValue: Float,
-                    finalVelocity: Float,
-                    allRelevantPropertyAnimsEnded: Boolean
-                ) {
-                    if (animatingProperties.contains(property)) {
-                        latch.countDown()
-                    }
-                }
-            })
-
-            latch.await(timeoutMs, TimeUnit.MILLISECONDS)
-        }
-    }
-
-    /**
-     * Blocks the calling thread until all animations of the given property (on all target objects)
-     * have ended. Useful when you don't have access to the objects being animated, but still need
-     * to wait for them to end so that other testable side effects occur (such as update/end
-     * listeners).
-     */
-    @JvmStatic
-    @Throws(InterruptedException::class)
-    @Suppress("UNCHECKED_CAST")
-    fun <T : Any> blockUntilAnimationsEnd(
-        vararg properties: FloatPropertyCompat<in T>
-    ) {
-        for (target in allAnimatedObjects) {
-            try {
-                blockUntilAnimationsEnd(
-                        PhysicsAnimator.getInstance(target) as PhysicsAnimator<T>, *properties)
-            } catch (e: ClassCastException) {
-                // Keep checking the other objects for ones whose types match the provided
-                // properties.
-            }
-        }
-    }
-
-    /**
-     * Blocks the calling thread until the first animation frame in which predicate returns true. If
-     * the given object isn't animating, returns without blocking.
-     */
-    @JvmStatic
-    @Throws(InterruptedException::class)
-    fun <T : Any> blockUntilFirstAnimationFrameWhereTrue(
-        animator: PhysicsAnimator<T>,
-        predicate: (T) -> Boolean
-    ) {
-        if (animator.isRunning()) {
-            val latch = CountDownLatch(1)
-            getAnimationTestHelper(animator).addTestUpdateListener(object : PhysicsAnimator
-            .UpdateListener<T> {
-                override fun onAnimationUpdateForProperty(
-                    target: T,
-                    values: UpdateMap<T>
-                ) {
-                    if (predicate(target)) {
-                        latch.countDown()
-                    }
-                }
-            })
-
-            latch.await(timeoutMs, TimeUnit.MILLISECONDS)
-        }
-    }
-
-    /**
-     * Verifies that the animator reported animation frame values to update listeners that satisfy
-     * the given matchers, in order. Not all frames need to satisfy a matcher - we'll run through
-     * all animation frames, and check them against the current predicate. If it returns false, we
-     * continue through the frames until it returns true, and then move on to the next matcher.
-     * Verification fails if we run out of frames while unsatisfied matchers remain.
-     *
-     * If verification is successful, all frames to this point are considered 'verified' and will be
-     * cleared. Subsequent calls to this method will start verification at the next animation frame.
-     *
-     * Example: Verify that an animation surpassed x = 50f before going negative.
-     * verifyAnimationUpdateFrames(
-     *    animator, TRANSLATION_X,
-     *    { u -> u.value > 50f },
-     *    { u -> u.value < 0f })
-     *
-     * Example: verify that an animation went backwards at some point while still being on-screen.
-     * verifyAnimationUpdateFrames(
-     *    animator, TRANSLATION_X,
-     *    { u -> u.velocity < 0f && u.value >= 0f })
-     *
-     * This method is intended to help you test longer, more complicated animations where it's
-     * critical that certain values were reached. Using this method to test short animations can
-     * fail due to the animation having fewer frames than provided matchers. For example, an
-     * animation from x = 1f to x = 5f might only have two frames, at x = 3f and x = 5f. The
-     * following would then fail despite it seeming logically sound:
-     *
-     * verifyAnimationUpdateFrames(
-     *    animator, TRANSLATION_X,
-     *    { u -> u.value > 1f },
-     *    { u -> u.value > 2f },
-     *    { u -> u.value > 3f })
-     *
-     * Tests might also fail if your matchers are too granular, such as this example test after an
-     * animation from x = 0f to x = 100f. It's unlikely there was a frame specifically between 2f
-     * and 3f.
-     *
-     * verifyAnimationUpdateFrames(
-     *    animator, TRANSLATION_X,
-     *    { u -> u.value > 2f && u.value < 3f },
-     *    { u -> u.value >= 50f })
-     *
-     * Failures will print a helpful log of all animation frames so you can see what caused the test
-     * to fail.
-     */
-    fun <T : Any> verifyAnimationUpdateFrames(
-        animator: PhysicsAnimator<T>,
-        property: FloatPropertyCompat<in T>,
-        firstUpdateMatcher: UpdateMatcher,
-        vararg additionalUpdateMatchers: UpdateMatcher
-    ) {
-        val updateFrames: UpdateFramesPerProperty<T> = getAnimationUpdateFrames(animator)
-
-        if (!updateFrames.containsKey(property)) {
-            error("No frames for given target object and property.")
-        }
-
-        // Copy the frames to avoid a ConcurrentModificationException if the animation update
-        // listeners attempt to add a new frame while we're verifying these.
-        val framesForProperty = ArrayList(updateFrames[property]!!)
-        val matchers = ArrayDeque<UpdateMatcher>(
-                additionalUpdateMatchers.toList())
-        val frameTraceMessage = StringBuilder()
-
-        var curMatcher = firstUpdateMatcher
-
-        // Loop through the updates from the testable animator.
-        for (update in framesForProperty) {
-            // Check whether this frame satisfies the current matcher.
-            if (curMatcher(update)) {
-                // If that was the last unsatisfied matcher, we're good here. 'Verify' all remaining
-                // frames and return without failing.
-                if (matchers.size == 0) {
-                    getAnimationUpdateFrames(animator).remove(property)
-                    return
-                }
-
-                frameTraceMessage.append("$update\t(satisfied matcher)\n")
-                curMatcher = matchers.pop() // Get the next matcher and keep going.
-            } else {
-                frameTraceMessage.append("${update}\n")
-            }
-        }
-
-        val readablePropertyName = PhysicsAnimator.getReadablePropertyName(property)
-        getAnimationUpdateFrames(animator).remove(property)
-
-        throw RuntimeException(
-                "Failed to verify animation frames for property $readablePropertyName: " +
-                        "Provided ${additionalUpdateMatchers.size + 1} matchers, " +
-                        "however ${matchers.size + 1} remained unsatisfied.\n\n" +
-                        "All frames:\n$frameTraceMessage")
-    }
-
-    /**
-     * Overload of [verifyAnimationUpdateFrames] that builds matchers for you, from given float
-     * values. For example, to verify that an animations passed from 0f to 50f to 100f back to 50f:
-     *
-     * verifyAnimationUpdateFrames(animator, TRANSLATION_X, 0f, 50f, 100f, 50f)
-     *
-     * This verifies that update frames were received with values of >= 0f, >= 50f, >= 100f, and
-     * <= 50f.
-     *
-     * The same caveats apply: short animations might not have enough frames to satisfy all of the
-     * matchers, and overly specific calls (such as 0f, 1f, 2f, 3f, etc. for an animation from
-     * x = 0f to x = 100f) might fail as the animation only had frames at 0f, 25f, 50f, 75f, and
-     * 100f. As with [verifyAnimationUpdateFrames], failures will print a helpful log of all frames
-     * so you can see what caused the test to fail.
-     */
-    fun <T : Any> verifyAnimationUpdateFrames(
-        animator: PhysicsAnimator<T>,
-        property: FloatPropertyCompat<in T>,
-        startValue: Float,
-        firstTargetValue: Float,
-        vararg additionalTargetValues: Float
-    ) {
-        val matchers = ArrayList<UpdateMatcher>()
-
-        val values = ArrayList<Float>().also {
-            it.add(firstTargetValue)
-            it.addAll(additionalTargetValues.toList())
-        }
-
-        var prevVal = startValue
-        for (value in values) {
-            if (value > prevVal) {
-                matchers.add { update -> update.value >= value }
-            } else {
-                matchers.add { update -> update.value <= value }
-            }
-
-            prevVal = value
-        }
-
-        verifyAnimationUpdateFrames(
-                animator, property, matchers[0], *matchers.drop(0).toTypedArray())
-    }
-
-    /**
-     * Returns all of the values that have ever been reported to update listeners, per property.
-     */
-    @Suppress("UNCHECKED_CAST")
-    fun <T : Any> getAnimationUpdateFrames(animator: PhysicsAnimator<T>):
-            UpdateFramesPerProperty<T> {
-        return animatorTestHelpers[animator]?.getUpdates() as UpdateFramesPerProperty<T>
-    }
-
-    /**
-     * Clears animation frame updates from the given animator so they aren't used the next time its
-     * passed to [verifyAnimationUpdateFrames].
-     */
-    fun <T : Any> clearAnimationUpdateFrames(animator: PhysicsAnimator<T>) {
-        animatorTestHelpers[animator]?.clearUpdates()
-    }
-
-    @Suppress("UNCHECKED_CAST")
-    private fun <T> getAnimationTestHelper(animator: PhysicsAnimator<T>): AnimatorTestHelper<T> {
-        return animatorTestHelpers[animator] as AnimatorTestHelper<T>
-    }
-
-    /**
-     * Helper class for testing an animator. This replaces the animator's start action with
-     * [startForTest] and adds test listeners to enable other test utility behaviors. We build one
-     * these for each Animator and keep them around so we can access the updates.
-     */
-    class AnimatorTestHelper<T> (private val animator: PhysicsAnimator<T>) {
-
-        /** All updates received for each property animation. */
-        private val allUpdates =
-                ArrayMap<FloatPropertyCompat<in T>, ArrayList<PhysicsAnimator.AnimationUpdate>>()
-
-        private val testEndListeners = ArrayList<PhysicsAnimator.EndListener<T>>()
-        private val testUpdateListeners = ArrayList<PhysicsAnimator.UpdateListener<T>>()
-
-        /** Whether we're currently in the middle of executing startInternal(). */
-        private var currentlyRunningStartInternal = false
-
-        init {
-            animator.startAction = ::startForTest
-            animator.cancelAction = ::cancelForTest
-        }
-
-        internal fun addTestEndListener(listener: PhysicsAnimator.EndListener<T>) {
-            testEndListeners.add(listener)
-        }
-
-        internal fun addTestUpdateListener(listener: PhysicsAnimator.UpdateListener<T>) {
-            testUpdateListeners.add(listener)
-        }
-
-        internal fun getUpdates(): UpdateFramesPerProperty<T> {
-            return allUpdates
-        }
-
-        internal fun clearUpdates() {
-            allUpdates.clear()
-        }
-
-        private fun startForTest() {
-            // The testable animator needs to block the main thread until super.start() has been
-            // called, since callers expect .start() to be synchronous but we're posting it to a
-            // handler here. We may also continue blocking until all animations end, if
-            // startBlocksUntilAnimationsEnd = true.
-            val unblockLatch = CountDownLatch(if (startBlocksUntilAnimationsEnd) 2 else 1)
-
-            animationThreadHandler.post {
-                // Add an update listener that dispatches to any test update listeners added by
-                // tests.
-                animator.addUpdateListener(object : PhysicsAnimator.UpdateListener<T> {
-                    override fun onAnimationUpdateForProperty(
-                        target: T,
-                        values: ArrayMap<FloatPropertyCompat<in T>, PhysicsAnimator.AnimationUpdate>
-                    ) {
-                        values.forEach { (property, value) ->
-                            allUpdates.getOrPut(property, { ArrayList() }).add(value)
-                        }
-
-                        for (listener in testUpdateListeners) {
-                            listener.onAnimationUpdateForProperty(target, values)
-                        }
-                    }
-                })
-
-                // Add an end listener that dispatches to any test end listeners added by tests, and
-                // unblocks the main thread if required.
-                animator.addEndListener(object : PhysicsAnimator.EndListener<T> {
-                    override fun onAnimationEnd(
-                        target: T,
-                        property: FloatPropertyCompat<in T>,
-                        wasFling: Boolean,
-                        canceled: Boolean,
-                        finalValue: Float,
-                        finalVelocity: Float,
-                        allRelevantPropertyAnimsEnded: Boolean
-                    ) {
-                        for (listener in testEndListeners) {
-                            listener.onAnimationEnd(
-                                    target, property, wasFling, canceled, finalValue, finalVelocity,
-                                    allRelevantPropertyAnimsEnded)
-                        }
-
-                        if (allRelevantPropertyAnimsEnded) {
-                            testEndListeners.clear()
-                            testUpdateListeners.clear()
-
-                            if (startBlocksUntilAnimationsEnd) {
-                                unblockLatch.countDown()
-                            }
-                        }
-                    }
-                })
-
-                currentlyRunningStartInternal = true
-                animator.startInternal()
-                currentlyRunningStartInternal = false
-                unblockLatch.countDown()
-            }
-
-            unblockLatch.await(timeoutMs, TimeUnit.MILLISECONDS)
-        }
-
-        private fun cancelForTest(properties: Set<FloatPropertyCompat<in T>>) {
-            // If this was called from startInternal, we are already on the animation thread, and
-            // should just call cancelInternal rather than posting it. If we post it, the
-            // cancellation will occur after the rest of startInternal() and we'll immediately
-            // cancel the animation we worked so hard to start!
-            if (currentlyRunningStartInternal) {
-                animator.cancelInternal(properties)
-                return
-            }
-
-            val unblockLatch = CountDownLatch(1)
-
-            animationThreadHandler.post {
-                animator.cancelInternal(properties)
-                unblockLatch.countDown()
-            }
-
-            unblockLatch.await(timeoutMs, TimeUnit.MILLISECONDS)
-        }
-    }
-}
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 8d8dc10..2643211 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
@@ -20,7 +20,7 @@
 import android.view.MotionEvent;
 import android.window.BackEvent;
 
-import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 
 /**
  * Interface for external process to get access to the Back animation related methods.
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 9bd8531..73b2656 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
@@ -32,6 +32,7 @@
 import android.app.IActivityTaskManager;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.res.Configuration;
 import android.database.ContentObserver;
 import android.hardware.input.InputManager;
 import android.net.Uri;
@@ -69,8 +70,9 @@
 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.annotations.ShellBackgroundThread;
-import com.android.wm.shell.common.annotations.ShellMainThread;
+import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
+import com.android.wm.shell.sysui.ConfigurationChangeListener;
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
@@ -81,7 +83,8 @@
 /**
  * Controls the window animation run when a user initiates a back gesture.
  */
-public class BackAnimationController implements RemoteCallable<BackAnimationController> {
+public class BackAnimationController implements RemoteCallable<BackAnimationController>,
+        ConfigurationChangeListener {
     private static final String TAG = "ShellBackPreview";
     private static final int SETTING_VALUE_OFF = 0;
     private static final int SETTING_VALUE_ON = 1;
@@ -147,7 +150,7 @@
     private final Runnable mAnimationTimeoutRunnable = () -> {
         ProtoLog.w(WM_SHELL_BACK_PREVIEW, "Animation didn't finish in %d ms. Resetting...",
                 MAX_ANIMATION_DURATION);
-        onBackAnimationFinished();
+        finishBackAnimation();
     };
 
     private IBackAnimationFinishedCallback mBackAnimationFinishedCallback;
@@ -156,6 +159,8 @@
 
     @Nullable
     private IOnBackInvokedCallback mActiveCallback;
+    @Nullable
+    private RemoteAnimationTarget[] mApps;
 
     @VisibleForTesting
     final RemoteCallback mNavigationObserver = new RemoteCallback(
@@ -171,6 +176,8 @@
                         ProtoLog.i(WM_SHELL_BACK_PREVIEW, "Navigation window gone.");
                         setTriggerBack(false);
                         resetTouchTracker();
+                        // Don't wait for animation start
+                        mShellExecutor.removeCallbacks(mAnimationTimeoutRunnable);
                     });
                 }
             });
@@ -244,6 +251,7 @@
         mShellController.addExternalInterface(KEY_EXTRA_SHELL_BACK_ANIMATION,
                 this::createExternalInterface, this);
         mShellCommandHandler.addDumpCallback(this::dump, this);
+        mShellController.addConfigurationChangeListener(this);
     }
 
     private void setupAnimationDeveloperSettingsObserver(
@@ -293,6 +301,11 @@
     private final BackAnimationImpl mBackAnimation = new BackAnimationImpl();
 
     @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        mShellBackAnimationRegistry.onConfigurationChanged(newConfig);
+    }
+
+    @Override
     public Context getContext() {
         return mContext;
     }
@@ -466,6 +479,14 @@
     }
 
     private void onGestureStarted(float touchX, float touchY, @BackEvent.SwipeEdge int swipeEdge) {
+        boolean interruptCancelPostCommitAnimation = mPostCommitAnimationInProgress
+                && mCurrentTracker.isFinished() && !mCurrentTracker.getTriggerBack()
+                && mQueuedTracker.isInInitialState();
+        if (interruptCancelPostCommitAnimation) {
+            // If a system animation is currently in the post-commit phase animating an
+            // onBackCancelled event, let's interrupt it and start animating a new back gesture
+            resetTouchTracker();
+        }
         TouchTracker touchTracker;
         if (mCurrentTracker.isInInitialState()) {
             touchTracker = mCurrentTracker;
@@ -480,9 +501,15 @@
         touchTracker.setState(TouchTracker.TouchTrackerState.ACTIVE);
         mBackGestureStarted = true;
 
-        if (touchTracker == mCurrentTracker) {
+        if (interruptCancelPostCommitAnimation) {
+            // post-commit cancel is currently running. let's interrupt it and dispatch a new
+            // onBackStarted event.
+            mPostCommitAnimationInProgress = false;
+            mShellExecutor.removeCallbacks(mAnimationTimeoutRunnable);
+            startSystemAnimation();
+        } else if (touchTracker == mCurrentTracker) {
             // Only start the back navigation if no other gesture is being processed. Otherwise,
-            // the back navigation will be started once the current gesture has finished.
+            // the back navigation will fall back to legacy back event injection.
             startBackNavigation(mCurrentTracker);
         }
     }
@@ -670,7 +697,11 @@
         }
     }
 
-    private void dispatchOnBackCancelled(IOnBackInvokedCallback callback) {
+    private void tryDispatchOnBackCancelled(IOnBackInvokedCallback callback) {
+        if (!mOnBackStartDispatched) {
+            Log.e(TAG, "Skipping dispatching onBackCancelled. Start was never dispatched.");
+            return;
+        }
         if (callback == null) {
             return;
         }
@@ -729,7 +760,7 @@
             if (touchTracker.getTriggerBack()) {
                 dispatchOrAnimateOnBackInvoked(callback, touchTracker);
             } else {
-                dispatchOnBackCancelled(callback);
+                tryDispatchOnBackCancelled(callback);
             }
         }
         finishBackNavigation(touchTracker.getTriggerBack());
@@ -808,7 +839,7 @@
         if (mCurrentTracker.getTriggerBack()) {
             dispatchOrAnimateOnBackInvoked(mActiveCallback, mCurrentTracker);
         } else {
-            dispatchOnBackCancelled(mActiveCallback);
+            tryDispatchOnBackCancelled(mActiveCallback);
         }
     }
 
@@ -818,6 +849,20 @@
      */
     @VisibleForTesting
     void onBackAnimationFinished() {
+        if (!mPostCommitAnimationInProgress) {
+            // This can happen when a post-commit cancel animation was interrupted by a new back
+            // gesture but the timing of interruption was bad such that the back-callback
+            // implementation finished in between the time of the new gesture having started and
+            // the time of the back-callback receiving the new onBackStarted event. Due to the
+            // asynchronous APIs this isn't an unlikely case. To handle this, let's return early.
+            // The back-callback implementation will call onBackAnimationFinished again when it is
+            // done with animating the second gesture.
+            return;
+        }
+        finishBackAnimation();
+    }
+
+    private void finishBackAnimation() {
         // Stop timeout runner.
         mShellExecutor.removeCallbacks(mAnimationTimeoutRunnable);
         mPostCommitAnimationInProgress = false;
@@ -846,7 +891,7 @@
         if (mCurrentTracker.isInInitialState()) {
             if (mBackGestureStarted) {
                 mBackGestureStarted = false;
-                dispatchOnBackCancelled(mActiveCallback);
+                tryDispatchOnBackCancelled(mActiveCallback);
                 finishBackNavigation(false);
                 ProtoLog.d(WM_SHELL_BACK_PREVIEW,
                         "resetTouchTracker -> reset an unfinished gesture");
@@ -878,6 +923,7 @@
     void finishBackNavigation(boolean triggerBack) {
         ProtoLog.d(WM_SHELL_BACK_PREVIEW, "BackAnimationController: finishBackNavigation()");
         mActiveCallback = null;
+        mApps = null;
         mShouldStartOnNextMoveEvent = false;
         mOnBackStartDispatched = false;
         mPointerPilfered = false;
@@ -914,6 +960,57 @@
         mTrackingLatency = false;
     }
 
+    private void startSystemAnimation() {
+        if (mBackNavigationInfo == null) {
+            ProtoLog.e(WM_SHELL_BACK_PREVIEW, "Lack of navigation info to start animation.");
+            return;
+        }
+        if (!validateAnimationTargets(mApps)) {
+            ProtoLog.w(WM_SHELL_BACK_PREVIEW, "Not starting animation due to mApps being null.");
+            return;
+        }
+
+        final BackAnimationRunner runner =
+                mShellBackAnimationRegistry.getAnimationRunnerAndInit(mBackNavigationInfo);
+        if (runner == null) {
+            if (mBackAnimationFinishedCallback != null) {
+                try {
+                    mBackAnimationFinishedCallback.onAnimationFinished(false);
+                } catch (RemoteException e) {
+                    Log.w(TAG, "Failed call IBackNaviAnimationController", e);
+                }
+            }
+            return;
+        }
+        mActiveCallback = runner.getCallback();
+
+        ProtoLog.d(WM_SHELL_BACK_PREVIEW, "BackAnimationController: startAnimation()");
+
+        runner.startAnimation(mApps, /*wallpapers*/ null, /*nonApps*/ null,
+                () -> mShellExecutor.execute(this::onBackAnimationFinished));
+
+        if (mApps.length >= 1) {
+            mCurrentTracker.updateStartLocation();
+            BackMotionEvent startEvent = mCurrentTracker.createStartEvent(mApps[0]);
+            dispatchOnBackStarted(mActiveCallback, startEvent);
+        }
+    }
+
+    /**
+     * Validate animation targets.
+     */
+    static boolean validateAnimationTargets(RemoteAnimationTarget[] apps) {
+        if (apps == null || apps.length == 0) {
+            return false;
+        }
+        for (int i = apps.length - 1; i >= 0; --i) {
+            if (!apps[i].leash.isValid()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     private void createAdapter() {
         IBackAnimationRunner runner =
                 new IBackAnimationRunner.Stub() {
@@ -926,48 +1023,13 @@
                         mShellExecutor.execute(
                                 () -> {
                                     endLatencyTracking();
-                                    if (mBackNavigationInfo == null) {
-                                        ProtoLog.e(WM_SHELL_BACK_PREVIEW,
-                                                "Lack of navigation info to start animation.");
+                                    if (!validateAnimationTargets(apps)) {
+                                        Log.e(TAG, "Invalid animation targets!");
                                         return;
                                     }
-                                    final BackAnimationRunner runner =
-                                            mShellBackAnimationRegistry.getAnimationRunnerAndInit(
-                                                    mBackNavigationInfo);
-                                    if (runner == null) {
-                                        if (finishedCallback != null) {
-                                            try {
-                                                finishedCallback.onAnimationFinished(false);
-                                            } catch (RemoteException e) {
-                                                Log.w(
-                                                        TAG,
-                                                        "Failed call IBackNaviAnimationController",
-                                                        e);
-                                            }
-                                        }
-                                        return;
-                                    }
-                                    mActiveCallback = runner.getCallback();
                                     mBackAnimationFinishedCallback = finishedCallback;
-
-                                    ProtoLog.d(
-                                            WM_SHELL_BACK_PREVIEW,
-                                            "BackAnimationController: startAnimation()");
-                                    runner.startAnimation(
-                                            apps,
-                                            wallpapers,
-                                            nonApps,
-                                            () ->
-                                                    mShellExecutor.execute(
-                                                            BackAnimationController.this
-                                                                    ::onBackAnimationFinished));
-
-                                    if (apps.length >= 1) {
-                                        mCurrentTracker.updateStartLocation();
-                                        BackMotionEvent startEvent =
-                                                mCurrentTracker.createStartEvent(apps[0]);
-                                        dispatchOnBackStarted(mActiveCallback, startEvent);
-                                    }
+                                    mApps = apps;
+                                    startSystemAnimation();
 
                                     // Dispatch the first progress after animation start for
                                     // smoothing the initial animation, instead of waiting for next
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossActivityBackAnimation.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossActivityBackAnimation.kt
index edf29dd..112ed09 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossActivityBackAnimation.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossActivityBackAnimation.kt
@@ -25,6 +25,7 @@
 import android.graphics.Rect
 import android.graphics.RectF
 import android.os.RemoteException
+import android.view.Choreographer
 import android.view.Display
 import android.view.IRemoteAnimationFinishedCallback
 import android.view.IRemoteAnimationRunner
@@ -42,8 +43,8 @@
 import com.android.wm.shell.R
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer
 import com.android.wm.shell.animation.Interpolators
-import com.android.wm.shell.common.annotations.ShellMainThread
 import com.android.wm.shell.protolog.ShellProtoLogGroup
+import com.android.wm.shell.shared.annotations.ShellMainThread
 import javax.inject.Inject
 import kotlin.math.abs
 import kotlin.math.max
@@ -65,9 +66,9 @@
     private val targetEnteringRect = RectF()
     private val currentEnteringRect = RectF()
 
-    private val taskBoundsRect = Rect()
+    private val backAnimRect = Rect()
 
-    private val cornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context)
+    private var cornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context)
 
     private val backAnimationRunner = BackAnimationRunner(
         Callback(), Runner(), context, Cuj.CUJ_PREDICTIVE_BACK_CROSS_ACTIVITY
@@ -93,6 +94,10 @@
     private var scrimLayer: SurfaceControl? = null
     private var maxScrimAlpha: Float = 0f
 
+    override fun onConfigurationChanged(newConfiguration: Configuration) {
+        cornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context)
+    }
+
     override fun getRunner() = backAnimationRunner
 
     private fun startBackAnimation(backMotionEvent: BackMotionEvent) {
@@ -109,10 +114,10 @@
         transaction.setAnimationTransaction()
 
         // Offset start rectangle to align task bounds.
-        taskBoundsRect.set(closingTarget!!.windowConfiguration.bounds)
-        taskBoundsRect.offsetTo(0, 0)
+        backAnimRect.set(closingTarget!!.localBounds)
+        backAnimRect.offsetTo(0, 0)
 
-        startClosingRect.set(taskBoundsRect)
+        startClosingRect.set(backAnimRect)
 
         // scale closing target into the middle for rhs and to the right for lhs
         targetClosingRect.set(startClosingRect)
@@ -137,7 +142,7 @@
             enteringTarget!!.taskInfo.taskDescription!!.backgroundColor, transaction
         )
         ensureScrimLayer()
-        transaction.apply()
+        applyTransaction()
     }
 
     private fun onGestureProgress(backEvent: BackEvent) {
@@ -150,11 +155,11 @@
         currentEnteringRect.setInterpolatedRectF(startEnteringRect, targetEnteringRect, progress)
         currentEnteringRect.offset(0f, yOffset)
         applyTransform(enteringTarget?.leash, currentEnteringRect, 1f)
-        transaction.apply()
+        applyTransaction()
     }
 
     private fun getYOffset(centeredRect: RectF, touchY: Float): Float {
-        val screenHeight = taskBoundsRect.height()
+        val screenHeight = backAnimRect.height()
         // Base the window movement in the Y axis on the touch movement in the Y axis.
         val rawYDelta = touchY - initialTouchPos.y
         val yDirection = (if (rawYDelta < 0) -1 else 1)
@@ -181,8 +186,8 @@
         // off the animator
         startClosingRect.set(currentClosingRect)
         startEnteringRect.set(currentEnteringRect)
-        targetEnteringRect.set(taskBoundsRect)
-        targetClosingRect.set(taskBoundsRect)
+        targetEnteringRect.set(backAnimRect)
+        targetClosingRect.set(backAnimRect)
         targetClosingRect.offset(currentClosingRect.left + enteringStartOffset, 0f)
 
         val valueAnimator = ValueAnimator.ofFloat(1f, 0f).setDuration(POST_ANIMATION_DURATION)
@@ -210,7 +215,7 @@
         applyTransform(closingTarget?.leash, currentClosingRect, closingAlpha)
         currentEnteringRect.setInterpolatedRectF(startEnteringRect, targetEnteringRect, progress)
         applyTransform(enteringTarget?.leash, currentEnteringRect, 1f)
-        transaction.apply()
+        applyTransaction()
     }
 
     private fun finishAnimation() {
@@ -226,7 +231,7 @@
         closingTarget = null
 
         background.removeBackground(transaction)
-        transaction.apply()
+        applyTransaction()
         transformMatrix.reset()
         initialTouchPos.set(0f, 0f)
         try {
@@ -240,16 +245,21 @@
 
     private fun applyTransform(leash: SurfaceControl?, rect: RectF, alpha: Float) {
         if (leash == null || !leash.isValid) return
-        val scale = rect.width() / taskBoundsRect.width()
+        val scale = rect.width() / backAnimRect.width()
         transformMatrix.reset()
         transformMatrix.setScale(scale, scale)
         transformMatrix.postTranslate(rect.left, rect.top)
         transaction.setAlpha(leash, alpha)
             .setMatrix(leash, transformMatrix, tmpFloat9)
-            .setCrop(leash, taskBoundsRect)
+            .setCrop(leash, backAnimRect)
             .setCornerRadius(leash, cornerRadius)
     }
 
+    private fun applyTransaction() {
+        transaction.setFrameTimelineVsync(Choreographer.getInstance().vsyncId)
+        transaction.apply()
+    }
+
     private fun ensureScrimLayer() {
         if (scrimLayer != null) return
         val isDarkTheme: Boolean = isDarkMode(context)
@@ -267,6 +277,7 @@
         transaction
             .setColor(scrimLayer, colorComponents)
             .setAlpha(scrimLayer!!, maxScrimAlpha)
+            .setCrop(scrimLayer!!, closingTarget!!.localBounds)
             .setRelativeLayer(scrimLayer!!, closingTarget!!.leash, -1)
             .show(scrimLayer)
     }
@@ -274,7 +285,8 @@
     private fun removeScrimLayer() {
         scrimLayer?.let {
             if (it.isValid) {
-                transaction.remove(it).apply()
+                transaction.remove(it)
+                applyTransaction()
             }
         }
         scrimLayer = null
@@ -283,6 +295,11 @@
 
     private inner class Callback : IOnBackInvokedCallback.Default() {
         override fun onBackStarted(backMotionEvent: BackMotionEvent) {
+            // in case we're still animating an onBackCancelled event, let's remove the finish-
+            // callback from the progress animator to prevent calling finishAnimation() before
+            // restarting a new animation
+            progressAnimator.removeOnBackCancelledFinishCallback()
+
             startBackAnimation(backMotionEvent)
             progressAnimator.onBackStarted(backMotionEvent) { backEvent: BackEvent ->
                 onGestureProgress(backEvent)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java
index 4b31541..c34f30d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java
@@ -29,11 +29,13 @@
 import android.animation.ValueAnimator;
 import android.annotation.NonNull;
 import android.content.Context;
+import android.content.res.Configuration;
 import android.graphics.Matrix;
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.os.RemoteException;
+import android.view.Choreographer;
 import android.view.IRemoteAnimationFinishedCallback;
 import android.view.IRemoteAnimationRunner;
 import android.view.RemoteAnimationTarget;
@@ -49,7 +51,7 @@
 import com.android.internal.protolog.common.ProtoLog;
 import com.android.wm.shell.R;
 import com.android.wm.shell.animation.Interpolators;
-import com.android.wm.shell.common.annotations.ShellMainThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 
 import javax.inject.Inject;
 
@@ -79,7 +81,7 @@
     private static final int POST_ANIMATION_DURATION_MS = 500;
 
     private final Rect mStartTaskRect = new Rect();
-    private final float mCornerRadius;
+    private float mCornerRadius;
 
     // The closing window properties.
     private final Rect mClosingStartRect = new Rect();
@@ -119,6 +121,11 @@
         mContext = context;
     }
 
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        mCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(mContext);
+    }
+
     private static float mapRange(float value, float min, float max) {
         return min + (value * (max - min));
     }
@@ -192,7 +199,7 @@
 
         applyTransform(mClosingTarget.leash, mClosingCurrentRect, mCornerRadius);
         applyTransform(mEnteringTarget.leash, mEnteringCurrentRect, mCornerRadius);
-        mTransaction.apply();
+        applyTransaction();
 
         mBackground.onBackProgressed(progress);
     }
@@ -242,6 +249,11 @@
                 .setCornerRadius(leash, cornerRadius);
     }
 
+    private void applyTransaction() {
+        mTransaction.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId());
+        mTransaction.apply();
+    }
+
     private void finishAnimation() {
         if (mEnteringTarget != null) {
             mEnteringTarget.leash.release();
@@ -255,8 +267,7 @@
         if (mBackground != null) {
             mBackground.removeBackground(mTransaction);
         }
-
-        mTransaction.apply();
+        applyTransaction();
         mBackInProgress = false;
         mTransformMatrix.reset();
         mClosingCurrentRect.setEmpty();
@@ -275,8 +286,6 @@
 
     private void onGestureProgress(@NonNull BackEvent backEvent) {
         if (!mBackInProgress) {
-            mIsRightEdge = backEvent.getSwipeEdge() == EDGE_RIGHT;
-            mInitialTouchPos.set(backEvent.getTouchX(), backEvent.getTouchY());
             mBackInProgress = true;
         }
         float progress = backEvent.getProgress();
@@ -305,7 +314,7 @@
             if (progress > 1 - UPDATE_SYSUI_FLAGS_THRESHOLD) {
                 mBackground.resetStatusBarCustomization();
             }
-            mTransaction.apply();
+            applyTransaction();
         });
 
         valueAnimator.addListener(new AnimatorListenerAdapter() {
@@ -326,6 +335,13 @@
     private final class Callback extends IOnBackInvokedCallback.Default {
         @Override
         public void onBackStarted(BackMotionEvent backEvent) {
+            // in case we're still animating an onBackCancelled event, let's remove the finish-
+            // callback from the progress animator to prevent calling finishAnimation() before
+            // restarting a new animation
+            mProgressAnimator.removeOnBackCancelledFinishCallback();
+
+            mIsRightEdge = backEvent.getSwipeEdge() == EDGE_RIGHT;
+            mInitialTouchPos.set(backEvent.getTouchX(), backEvent.getTouchY());
             mProgressAnimator.onBackStarted(backEvent,
                     CrossTaskBackAnimation.this::onGestureProgress);
         }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CustomizeActivityAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CustomizeActivityAnimation.java
index 5254ff4..838dab4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CustomizeActivityAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CustomizeActivityAnimation.java
@@ -29,6 +29,7 @@
 import android.annotation.Nullable;
 import android.app.Activity;
 import android.content.Context;
+import android.content.res.Configuration;
 import android.graphics.Color;
 import android.graphics.Rect;
 import android.os.RemoteException;
@@ -54,7 +55,7 @@
 import com.android.internal.policy.ScreenDecorationsUtils;
 import com.android.internal.policy.TransitionAnimation;
 import com.android.internal.protolog.common.ProtoLog;
-import com.android.wm.shell.common.annotations.ShellMainThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 
 import javax.inject.Inject;
 
@@ -63,7 +64,7 @@
 public class CustomizeActivityAnimation extends ShellBackAnimation {
     private final BackProgressAnimator mProgressAnimator = new BackProgressAnimator();
     private final BackAnimationRunner mBackAnimationRunner;
-    private final float mCornerRadius;
+    private float mCornerRadius;
     private final SurfaceControl.Transaction mTransaction;
     private final BackAnimationBackground mBackground;
     private RemoteAnimationTarget mEnteringTarget;
@@ -88,6 +89,7 @@
     final Transformation mTransformation = new Transformation();
 
     private final Choreographer mChoreographer;
+    private final Context mContext;
 
     @Inject
     public CustomizeActivityAnimation(Context context, BackAnimationBackground background) {
@@ -108,6 +110,12 @@
                 .setDampingRatio(SpringForce.DAMPING_RATIO_NO_BOUNCY));
         mTransaction = transaction == null ? new SurfaceControl.Transaction() : transaction;
         mChoreographer = choreographer != null ? choreographer : Choreographer.getInstance();
+        mContext = context;
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        mCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(mContext);
     }
 
     private float getLatestProgress() {
@@ -285,6 +293,11 @@
     private final class Callback extends IOnBackInvokedCallback.Default {
         @Override
         public void onBackStarted(BackMotionEvent backEvent) {
+            // in case we're still animating an onBackCancelled event, let's remove the finish-
+            // callback from the progress animator to prevent calling finishAnimation() before
+            // restarting a new animation
+            mProgressAnimator.removeOnBackCancelledFinishCallback();
+
             mProgressAnimator.onBackStarted(backEvent,
                     CustomizeActivityAnimation.this::onGestureProgress);
         }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimation.java
index dc65919..8a0daaa 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimation.java
@@ -16,6 +16,7 @@
 
 package com.android.wm.shell.back;
 
+import android.content.res.Configuration;
 import android.window.BackNavigationInfo;
 
 import javax.inject.Qualifier;
@@ -48,4 +49,8 @@
     public boolean prepareNextAnimation(BackNavigationInfo.CustomAnimationInfo animationInfo) {
         return false;
     }
+
+    void onConfigurationChanged(Configuration newConfig) {
+
+    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java
index 26d2097..00daddc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java
@@ -18,6 +18,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.content.res.Configuration;
 import android.util.Log;
 import android.util.SparseArray;
 import android.window.BackNavigationInfo;
@@ -29,6 +30,7 @@
     private final SparseArray<BackAnimationRunner> mAnimationDefinition = new SparseArray<>();
     private final ShellBackAnimation mDefaultCrossActivityAnimation;
     private final ShellBackAnimation mCustomizeActivityAnimation;
+    private final ShellBackAnimation mCrossTaskAnimation;
 
     public ShellBackAnimationRegistry(
             @ShellBackAnimation.CrossActivity @Nullable ShellBackAnimation crossActivityAnimation,
@@ -57,6 +59,7 @@
 
         mDefaultCrossActivityAnimation = crossActivityAnimation;
         mCustomizeActivityAnimation = customizeActivityAnimation;
+        mCrossTaskAnimation = crossTaskAnimation;
 
         // TODO(b/236760237): register dialog close animation when it's completed.
     }
@@ -125,6 +128,12 @@
                 BackNavigationInfo.TYPE_CROSS_ACTIVITY, mDefaultCrossActivityAnimation.getRunner());
     }
 
+    void onConfigurationChanged(Configuration newConfig) {
+        mCustomizeActivityAnimation.onConfigurationChanged(newConfig);
+        mDefaultCrossActivityAnimation.onConfigurationChanged(newConfig);
+        mCrossTaskAnimation.onConfigurationChanged(newConfig);
+    }
+
     BackAnimationRunner getAnimationRunnerAndInit(BackNavigationInfo backNavigationInfo) {
         int type = backNavigationInfo.getType();
         // Initiate customized cross-activity animation, or fall back to cross activity animation
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 4455a3c..d295877 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
@@ -101,14 +101,14 @@
 import com.android.wm.shell.common.SyncTransactionQueue;
 import com.android.wm.shell.common.TaskStackListenerCallback;
 import com.android.wm.shell.common.TaskStackListenerImpl;
-import com.android.wm.shell.common.annotations.ShellBackgroundThread;
-import com.android.wm.shell.common.annotations.ShellMainThread;
 import com.android.wm.shell.common.bubbles.BubbleBarLocation;
 import com.android.wm.shell.common.bubbles.BubbleBarUpdate;
 import com.android.wm.shell.draganddrop.DragAndDropController;
 import com.android.wm.shell.onehanded.OneHandedController;
 import com.android.wm.shell.onehanded.OneHandedTransitionCallback;
 import com.android.wm.shell.pip.PinnedStackListenerForwarder;
+import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.sysui.ConfigurationChangeListener;
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
@@ -455,8 +455,7 @@
                         ProtoLog.d(WM_SHELL_BUBBLES,
                                 "onActivityRestartAttempt - taskId=%d selecting matching bubble=%s",
                                 task.taskId, b.getKey());
-                        mBubbleData.setSelectedBubble(b);
-                        mBubbleData.setExpanded(true);
+                        mBubbleData.setSelectedBubbleAndExpandStack(b);
                         return;
                     }
                 }
@@ -593,13 +592,6 @@
         }
     }
 
-    private void openBubbleOverflow() {
-        ensureBubbleViewsAndWindowCreated();
-        mBubbleData.setShowingOverflow(true);
-        mBubbleData.setSelectedBubble(mBubbleData.getOverflow());
-        mBubbleData.setExpanded(true);
-    }
-
     /**
      * Called when the status bar has become visible or invisible (either permanently or
      * temporarily).
@@ -1247,8 +1239,7 @@
         }
         if (mBubbleData.hasBubbleInStackWithKey(b.getKey())) {
             // already in the stack
-            mBubbleData.setSelectedBubble(b);
-            mBubbleData.setExpanded(true);
+            mBubbleData.setSelectedBubbleAndExpandStack(b);
         } else if (mBubbleData.hasOverflowBubbleWithKey(b.getKey())) {
             // promote it out of the overflow
             promoteBubbleFromOverflow(b);
@@ -1273,8 +1264,7 @@
             String key = entry.getKey();
             Bubble bubble = mBubbleData.getBubbleInStackWithKey(key);
             if (bubble != null) {
-                mBubbleData.setSelectedBubble(bubble);
-                mBubbleData.setExpanded(true);
+                mBubbleData.setSelectedBubbleAndExpandStack(bubble);
             } else {
                 bubble = mBubbleData.getOverflowBubbleWithKey(key);
                 if (bubble != null) {
@@ -1367,8 +1357,7 @@
             } else {
                 // App bubble is not selected, select it & expand
                 Log.i(TAG, "  showOrHideAppBubble, expand and select existing app bubble");
-                mBubbleData.setSelectedBubble(existingAppBubble);
-                mBubbleData.setExpanded(true);
+                mBubbleData.setSelectedBubbleAndExpandStack(existingAppBubble);
             }
         } else {
             // Check if it exists in the overflow
@@ -2329,6 +2318,17 @@
             mMainExecutor.execute(() ->
                     mController.showUserEducation(new Point(positionX, positionY)));
         }
+
+        @Override
+        public void setBubbleBarLocation(BubbleBarLocation location) {
+            mMainExecutor.execute(() ->
+                    mController.setBubbleBarLocation(location));
+        }
+
+        @Override
+        public void setBubbleBarBounds(Rect bubbleBarBounds) {
+            mMainExecutor.execute(() -> mBubblePositioner.setBubbleBarBounds(bubbleBarBounds));
+        }
     }
 
     private class BubblesImpl implements Bubbles {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
index 61f0ed2..ae3d0c5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
@@ -365,6 +365,19 @@
         mSelectedBubble = bubble;
     }
 
+    /**
+     * Sets the selected bubble and expands it.
+     *
+     * <p>This dispatches a single state update for both changes and should be used instead of
+     * calling {@link #setSelectedBubble(BubbleViewProvider)} followed by
+     * {@link #setExpanded(boolean)} immediately after, which will generate 2 separate updates.
+     */
+    public void setSelectedBubbleAndExpandStack(BubbleViewProvider bubble) {
+        setSelectedBubbleInternal(bubble);
+        setExpandedInternal(true);
+        dispatchPendingChanges();
+    }
+
     public void setSelectedBubble(BubbleViewProvider bubble) {
         setSelectedBubbleInternal(bubble);
         dispatchPendingChanges();
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 6908682..8da85d2 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
@@ -82,7 +82,6 @@
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.wm.shell.R;
 import com.android.wm.shell.animation.Interpolators;
-import com.android.wm.shell.animation.PhysicsAnimator;
 import com.android.wm.shell.bubbles.BubblesNavBarMotionEventHandler.MotionEventListener;
 import com.android.wm.shell.bubbles.animation.AnimatableScaleMatrix;
 import com.android.wm.shell.bubbles.animation.ExpandedAnimationController;
@@ -95,6 +94,7 @@
 import com.android.wm.shell.common.bubbles.DismissView;
 import com.android.wm.shell.common.bubbles.RelativeTouchListener;
 import com.android.wm.shell.common.magnetictarget.MagnetizedObject;
+import com.android.wm.shell.shared.animation.PhysicsAnimator;
 
 import java.io.PrintWriter;
 import java.math.BigDecimal;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java
index 26077cf..127a49f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubbles.java
@@ -37,8 +37,8 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.Nullable;
 
-import com.android.wm.shell.common.annotations.ExternalThread;
 import com.android.wm.shell.common.bubbles.BubbleBarUpdate;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/IBubbles.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/IBubbles.aidl
index 7a5afec..c9f0f0d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/IBubbles.aidl
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/IBubbles.aidl
@@ -19,6 +19,7 @@
 import android.content.Intent;
 import android.graphics.Rect;
 import com.android.wm.shell.bubbles.IBubblesListener;
+import com.android.wm.shell.common.bubbles.BubbleBarLocation;
 
 /**
  * Interface that is exposed to remote callers (launcher) to manipulate the bubbles feature when
@@ -42,4 +43,7 @@
 
     oneway void showUserEducation(in int positionX, in int positionY) = 8;
 
+    oneway void setBubbleBarLocation(in BubbleBarLocation location) = 9;
+
+    oneway void setBubbleBarBounds(in Rect bubbleBarBounds) = 10;
 }
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java
index 512c9d1..1fb966f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java
@@ -34,12 +34,12 @@
 
 import com.android.wm.shell.R;
 import com.android.wm.shell.animation.Interpolators;
-import com.android.wm.shell.animation.PhysicsAnimator;
 import com.android.wm.shell.bubbles.BadgedImageView;
 import com.android.wm.shell.bubbles.BubbleOverflow;
 import com.android.wm.shell.bubbles.BubblePositioner;
 import com.android.wm.shell.bubbles.BubbleStackView;
 import com.android.wm.shell.common.magnetictarget.MagnetizedObject;
+import com.android.wm.shell.shared.animation.PhysicsAnimator;
 
 import com.google.android.collect.Sets;
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java
index bb0dd95..47d4d07 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/StackAnimationController.java
@@ -38,12 +38,12 @@
 import androidx.dynamicanimation.animation.SpringForce;
 
 import com.android.wm.shell.R;
-import com.android.wm.shell.animation.PhysicsAnimator;
 import com.android.wm.shell.bubbles.BadgedImageView;
 import com.android.wm.shell.bubbles.BubblePositioner;
 import com.android.wm.shell.bubbles.BubbleStackView;
 import com.android.wm.shell.common.FloatingContentCoordinator;
 import com.android.wm.shell.common.magnetictarget.MagnetizedObject;
+import com.android.wm.shell.shared.animation.PhysicsAnimator;
 
 import com.google.android.collect.Sets;
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarAnimationHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarAnimationHelper.java
index 9eb9632..45ad631 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarAnimationHelper.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarAnimationHelper.java
@@ -43,12 +43,12 @@
 import androidx.annotation.Nullable;
 
 import com.android.wm.shell.animation.Interpolators;
-import com.android.wm.shell.animation.PhysicsAnimator;
 import com.android.wm.shell.bubbles.BubbleOverflow;
 import com.android.wm.shell.bubbles.BubblePositioner;
 import com.android.wm.shell.bubbles.BubbleViewProvider;
 import com.android.wm.shell.bubbles.animation.AnimatableScaleMatrix;
 import com.android.wm.shell.common.magnetictarget.MagnetizedObject.MagneticTarget;
+import com.android.wm.shell.shared.animation.PhysicsAnimator;
 
 /**
  * Helper class to animate a {@link BubbleBarExpandedView} on a bubble.
@@ -166,13 +166,8 @@
         bbev.setTaskViewAlpha(0f);
         bbev.setVisibility(VISIBLE);
 
-        // Set the pivot point for the scale, so the view animates out from the bubble bar.
-        Rect bubbleBarBounds = mPositioner.getBubbleBarBounds();
-        mExpandedViewContainerMatrix.setScale(
-                1f - EXPANDED_VIEW_ANIMATE_SCALE_AMOUNT,
-                1f - EXPANDED_VIEW_ANIMATE_SCALE_AMOUNT,
-                bubbleBarBounds.centerX(),
-                bubbleBarBounds.top);
+        setScaleFromBubbleBar(mExpandedViewContainerMatrix,
+                1f - EXPANDED_VIEW_ANIMATE_SCALE_AMOUNT);
 
         bbev.setAnimationMatrix(mExpandedViewContainerMatrix);
 
@@ -214,8 +209,8 @@
         }
         bbev.setScaleX(1f);
         bbev.setScaleY(1f);
-        mExpandedViewContainerMatrix.setScaleX(1f);
-        mExpandedViewContainerMatrix.setScaleY(1f);
+
+        setScaleFromBubbleBar(mExpandedViewContainerMatrix, 1f);
 
         PhysicsAnimator.getInstance(mExpandedViewContainerMatrix).cancel();
         PhysicsAnimator.getInstance(mExpandedViewContainerMatrix)
@@ -240,6 +235,16 @@
         mExpandedViewAlphaAnimator.reverse();
     }
 
+    private void setScaleFromBubbleBar(AnimatableScaleMatrix matrix, float scale) {
+        // Set the pivot point for the scale, so the view animates out from the bubble bar.
+        Rect bubbleBarBounds = mPositioner.getBubbleBarBounds();
+        matrix.setScale(
+                scale,
+                scale,
+                bubbleBarBounds.centerX(),
+                bubbleBarBounds.top);
+    }
+
     /**
      * Animate the expanded bubble when it is being dragged
      */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetController.kt
deleted file mode 100644
index f6b4653..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetController.kt
+++ /dev/null
@@ -1,151 +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.bubbles.bar
-
-import android.content.Context
-import android.graphics.Rect
-import android.view.LayoutInflater
-import android.view.View
-import android.widget.FrameLayout
-import android.widget.FrameLayout.LayoutParams
-import androidx.annotation.VisibleForTesting
-import androidx.core.animation.Animator
-import androidx.core.animation.AnimatorListenerAdapter
-import androidx.core.animation.ObjectAnimator
-import com.android.wm.shell.R
-import com.android.wm.shell.bubbles.BubblePositioner
-import com.android.wm.shell.common.bubbles.BubbleBarLocation
-
-/** Controller to show/hide drop target when bubble bar expanded view is being dragged */
-class BubbleBarDropTargetController(
-    val context: Context,
-    val container: FrameLayout,
-    val positioner: BubblePositioner
-) {
-
-    private var dropTargetView: View? = null
-    private var animator: ObjectAnimator? = null
-    private val tempRect: Rect by lazy(LazyThreadSafetyMode.NONE) { Rect() }
-
-    /**
-     * Show drop target at [location] with animation.
-     *
-     * If the drop target is currently visible, animates it out first, before showing it at the
-     * supplied location.
-     */
-    fun show(location: BubbleBarLocation) {
-        val targetView = dropTargetView ?: createView().also { dropTargetView = it }
-        if (targetView.alpha > 0) {
-            targetView.animateOut {
-                targetView.updateBounds(location)
-                targetView.animateIn()
-            }
-        } else {
-            targetView.updateBounds(location)
-            targetView.animateIn()
-        }
-    }
-
-    /**
-     * Set the view hidden or not
-     *
-     * Requires the drop target to be first shown by calling [animateIn]. Otherwise does not do
-     * anything.
-     */
-    fun setHidden(hidden: Boolean) {
-        val targetView = dropTargetView ?: return
-        if (hidden) {
-            targetView.animateOut()
-        } else {
-            targetView.animateIn()
-        }
-    }
-
-    /** Remove the drop target if it is was shown. */
-    fun dismiss() {
-        dropTargetView?.animateOut {
-            dropTargetView?.let { container.removeView(it) }
-            dropTargetView = null
-        }
-    }
-
-    private fun createView(): View {
-        return LayoutInflater.from(context)
-            .inflate(R.layout.bubble_bar_drop_target, container, false /* attachToRoot */)
-            .also { view: View ->
-                view.alpha = 0f
-                // Add at index 0 to ensure it does not cover the bubble
-                container.addView(view, 0)
-            }
-    }
-
-    private fun getBounds(onLeft: Boolean, out: Rect) {
-        positioner.getBubbleBarExpandedViewBounds(onLeft, false /* isOverflowExpanded */, out)
-        val centerX = out.centerX()
-        val centerY = out.centerY()
-        out.scale(DROP_TARGET_SCALE)
-        // Move rect center back to the same position as before scale
-        out.offset(centerX - out.centerX(), centerY - out.centerY())
-    }
-
-    private fun View.updateBounds(location: BubbleBarLocation) {
-        getBounds(location.isOnLeft(isLayoutRtl), tempRect)
-        val lp = layoutParams as LayoutParams
-        lp.width = tempRect.width()
-        lp.height = tempRect.height()
-        layoutParams = lp
-        x = tempRect.left.toFloat()
-        y = tempRect.top.toFloat()
-    }
-
-    private fun View.animateIn() {
-        animator?.cancel()
-        animator =
-            ObjectAnimator.ofFloat(this, View.ALPHA, 1f)
-                .setDuration(DROP_TARGET_ALPHA_IN_DURATION)
-                .addEndAction { animator = null }
-        animator?.start()
-    }
-
-    private fun View.animateOut(endAction: Runnable? = null) {
-        animator?.cancel()
-        animator =
-            ObjectAnimator.ofFloat(this, View.ALPHA, 0f)
-                .setDuration(DROP_TARGET_ALPHA_OUT_DURATION)
-                .addEndAction {
-                    endAction?.run()
-                    animator = null
-                }
-        animator?.start()
-    }
-
-    private fun <T : Animator> T.addEndAction(runnable: Runnable): T {
-        addListener(
-            object : AnimatorListenerAdapter() {
-                override fun onAnimationEnd(animation: Animator) {
-                    runnable.run()
-                }
-            }
-        )
-        return this
-    }
-
-    companion object {
-        @VisibleForTesting const val DROP_TARGET_ALPHA_IN_DURATION = 150L
-        @VisibleForTesting const val DROP_TARGET_ALPHA_OUT_DURATION = 100L
-        @VisibleForTesting const val DROP_TARGET_SCALE = 0.9f
-    }
-}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt
index ad97a24..fe9c4d4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt
@@ -17,12 +17,9 @@
 package com.android.wm.shell.bubbles.bar
 
 import android.annotation.SuppressLint
-import android.graphics.RectF
 import android.view.MotionEvent
 import android.view.View
-import com.android.wm.shell.R
 import com.android.wm.shell.bubbles.BubblePositioner
-import com.android.wm.shell.common.bubbles.BubbleBarLocation
 import com.android.wm.shell.common.bubbles.DismissView
 import com.android.wm.shell.common.bubbles.RelativeTouchListener
 import com.android.wm.shell.common.magnetictarget.MagnetizedObject
@@ -34,6 +31,7 @@
     private val dismissView: DismissView,
     private val animationHelper: BubbleBarAnimationHelper,
     private val bubblePositioner: BubblePositioner,
+    private val pinController: BubbleExpandedViewPinController,
     private val dragListener: DragListener
 ) {
 
@@ -45,8 +43,6 @@
     private val magnetizedExpandedView: MagnetizedObject<BubbleBarExpandedView> =
         MagnetizedObject.magnetizeView(expandedView)
     private val magnetizedDismissTarget: MagnetizedObject.MagneticTarget
-    private val dismissZoneHeight: Int
-    private val dismissZoneWidth: Int
 
     init {
         magnetizedExpandedView.magnetListener = MagnetListener()
@@ -78,33 +74,11 @@
             }
             return@setOnTouchListener dragMotionEventHandler.onTouch(view, event) || magnetConsumed
         }
-
-        dismissZoneHeight =
-            dismissView.resources.getDimensionPixelSize(R.dimen.bubble_bar_dismiss_zone_height)
-        dismissZoneWidth =
-            dismissView.resources.getDimensionPixelSize(R.dimen.bubble_bar_dismiss_zone_width)
     }
 
-    /** Listener to receive callback about dragging events */
+    /** Listener to get notified about drag events */
     interface DragListener {
         /**
-         * Bubble bar [BubbleBarLocation] has changed as a result of dragging the expanded view.
-         *
-         * Triggered when drag gesture passes the middle of the screen and before touch up. Can be
-         * triggered multiple times per gesture.
-         *
-         * @param location new location of the bubble bar as a result of the ongoing drag operation
-         */
-        fun onLocationChanged(location: BubbleBarLocation)
-
-        /**
-         * Called when bubble bar is moved into or out of the dismiss target
-         *
-         * @param isStuck `true` if view is dragged inside dismiss target
-         */
-        fun onStuckToDismissChanged(isStuck: Boolean)
-
-        /**
          * Bubble bar was released
          *
          * @param inDismiss `true` if view was release in dismiss target
@@ -115,25 +89,11 @@
     private inner class HandleDragListener : RelativeTouchListener() {
 
         private var isMoving = false
-        private var screenCenterX: Int = -1
-        private var isOnLeft = false
-        private val dismissZone = RectF()
 
         override fun onDown(v: View, ev: MotionEvent): Boolean {
             // While animating, don't allow new touch events
             if (expandedView.isAnimating) return false
-            isOnLeft = bubblePositioner.isBubbleBarOnLeft
-
-            val screenRect = bubblePositioner.screenRect
-            screenCenterX = screenRect.centerX()
-            val screenBottom = screenRect.bottom
-
-            dismissZone.set(
-                screenCenterX - dismissZoneWidth / 2f,
-                (screenBottom - dismissZoneHeight).toFloat(),
-                screenCenterX + dismissZoneHeight / 2f,
-                screenBottom.toFloat()
-            )
+            pinController.onDragStart(bubblePositioner.isBubbleBarOnLeft)
             return true
         }
 
@@ -152,19 +112,7 @@
             expandedView.translationX = expandedViewInitialTranslationX + dx
             expandedView.translationY = expandedViewInitialTranslationY + dy
             dismissView.show()
-
-            // Check if we are in the zone around dismiss view where drag can only lead to dismiss
-            if (dismissZone.contains(ev.rawX, ev.rawY)) {
-                return
-            }
-
-            if (isOnLeft && ev.rawX > screenCenterX) {
-                isOnLeft = false
-                dragListener.onLocationChanged(BubbleBarLocation.RIGHT)
-            } else if (!isOnLeft && ev.rawX < screenCenterX) {
-                isOnLeft = true
-                dragListener.onLocationChanged(BubbleBarLocation.LEFT)
-            }
+            pinController.onDragUpdate(ev.rawX, ev.rawY)
         }
 
         override fun onUp(
@@ -188,6 +136,7 @@
         private fun finishDrag() {
             if (!isStuckToDismiss) {
                 animationHelper.animateToRestPosition()
+                pinController.onDragEnd()
                 dragListener.onReleased(inDismiss = false)
                 dismissView.hide()
             }
@@ -201,7 +150,7 @@
             draggedObject: MagnetizedObject<*>
         ) {
             isStuckToDismiss = true
-            dragListener.onStuckToDismissChanged(isStuck = true)
+            pinController.setDropTargetHidden(true)
         }
 
         override fun onUnstuckFromTarget(
@@ -213,7 +162,7 @@
         ) {
             isStuckToDismiss = false
             animationHelper.animateUnstuckFromDismissView(target)
-            dragListener.onStuckToDismissChanged(isStuck = false)
+            pinController.setDropTargetHidden(false)
         }
 
         override fun onReleasedInTarget(
@@ -221,6 +170,7 @@
             draggedObject: MagnetizedObject<*>
         ) {
             dragListener.onReleased(inDismiss = true)
+            pinController.onDragEnd()
             dismissView.hide()
         }
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java
index 88ccc92..62cc4da 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java
@@ -33,8 +33,6 @@
 import android.view.WindowManager;
 import android.widget.FrameLayout;
 
-import androidx.annotation.NonNull;
-
 import com.android.wm.shell.bubbles.Bubble;
 import com.android.wm.shell.bubbles.BubbleController;
 import com.android.wm.shell.bubbles.BubbleData;
@@ -44,7 +42,6 @@
 import com.android.wm.shell.bubbles.DeviceConfig;
 import com.android.wm.shell.bubbles.DismissViewUtils;
 import com.android.wm.shell.bubbles.bar.BubbleBarExpandedViewDragController.DragListener;
-import com.android.wm.shell.common.bubbles.BubbleBarLocation;
 import com.android.wm.shell.common.bubbles.DismissView;
 
 import kotlin.Unit;
@@ -71,7 +68,7 @@
     private final BubbleBarAnimationHelper mAnimationHelper;
     private final BubbleEducationViewController mEducationViewController;
     private final View mScrimView;
-    private final BubbleBarDropTargetController mDropTargetController;
+    private final BubbleExpandedViewPinController mBubbleExpandedViewPinController;
 
     @Nullable
     private BubbleViewProvider mExpandedBubble;
@@ -116,7 +113,9 @@
 
         setUpDismissView();
 
-        mDropTargetController = new BubbleBarDropTargetController(context, this, mPositioner);
+        mBubbleExpandedViewPinController = new BubbleExpandedViewPinController(
+                context, this, mPositioner);
+        mBubbleExpandedViewPinController.setListener(mBubbleController::setBubbleBarLocation);
 
         setOnClickListener(view -> hideMenuOrCollapse());
     }
@@ -207,12 +206,17 @@
                 }
             });
 
-            DragListener dragListener = createDragListener();
+            DragListener dragListener = inDismiss -> {
+                if (inDismiss && mExpandedBubble != null) {
+                    mBubbleController.dismissBubble(mExpandedBubble.getKey(), DISMISS_USER_GESTURE);
+                }
+            };
             mDragController = new BubbleBarExpandedViewDragController(
                     mExpandedView,
                     mDismissView,
                     mAnimationHelper,
                     mPositioner,
+                    mBubbleExpandedViewPinController,
                     dragListener);
 
             addView(mExpandedView, new LayoutParams(width, height, Gravity.LEFT));
@@ -377,26 +381,4 @@
         }
     }
 
-    private DragListener createDragListener() {
-        return new DragListener() {
-            @Override
-            public void onLocationChanged(@NonNull BubbleBarLocation location) {
-                mBubbleController.setBubbleBarLocation(location);
-                mDropTargetController.show(location);
-            }
-
-            @Override
-            public void onStuckToDismissChanged(boolean isStuck) {
-                mDropTargetController.setHidden(isStuck);
-            }
-
-            @Override
-            public void onReleased(boolean inDismiss) {
-                mDropTargetController.dismiss();
-                if (inDismiss && mExpandedBubble != null) {
-                    mBubbleController.dismissBubble(mExpandedBubble.getKey(), DISMISS_USER_GESTURE);
-                }
-            }
-        };
-    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java
index 81e7582..02918db 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java
@@ -29,8 +29,8 @@
 import androidx.dynamicanimation.animation.SpringForce;
 
 import com.android.wm.shell.R;
-import com.android.wm.shell.animation.PhysicsAnimator;
 import com.android.wm.shell.bubbles.Bubble;
+import com.android.wm.shell.shared.animation.PhysicsAnimator;
 
 import java.util.ArrayList;
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleEducationViewController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleEducationViewController.kt
index ee552ae..e108f7b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleEducationViewController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleEducationViewController.kt
@@ -28,7 +28,6 @@
 import androidx.dynamicanimation.animation.DynamicAnimation
 import androidx.dynamicanimation.animation.SpringForce
 import com.android.wm.shell.R
-import com.android.wm.shell.animation.PhysicsAnimator
 import com.android.wm.shell.bubbles.BubbleDebugConfig.DEBUG_USER_EDUCATION
 import com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES
 import com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME
@@ -37,6 +36,7 @@
 import com.android.wm.shell.bubbles.setup
 import com.android.wm.shell.common.bubbles.BubblePopupDrawable
 import com.android.wm.shell.common.bubbles.BubblePopupView
+import com.android.wm.shell.shared.animation.PhysicsAnimator
 import kotlin.math.roundToInt
 
 /** Manages bubble education presentation and animation */
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinController.kt
new file mode 100644
index 0000000..5d391ec
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinController.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.bar
+
+import android.content.Context
+import android.graphics.Rect
+import android.graphics.RectF
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.FrameLayout
+import androidx.annotation.VisibleForTesting
+import androidx.core.view.updateLayoutParams
+import com.android.wm.shell.R
+import com.android.wm.shell.bubbles.BubblePositioner
+import com.android.wm.shell.common.bubbles.BaseBubblePinController
+import com.android.wm.shell.common.bubbles.BubbleBarLocation
+
+/**
+ * Controller to manage pinning bubble bar to left or right when dragging starts from the bubble bar
+ * expanded view
+ */
+class BubbleExpandedViewPinController(
+    private val context: Context,
+    private val container: FrameLayout,
+    private val positioner: BubblePositioner
+) : BaseBubblePinController() {
+
+    private var dropTargetView: View? = null
+    private val tempRect: Rect by lazy(LazyThreadSafetyMode.NONE) { Rect() }
+
+    override fun getScreenCenterX(): Int {
+        return positioner.screenRect.centerX()
+    }
+
+    override fun getExclusionRect(): RectF {
+        val rect =
+            RectF(
+                0f,
+                0f,
+                context.resources.getDimension(R.dimen.bubble_bar_dismiss_zone_width),
+                context.resources.getDimension(R.dimen.bubble_bar_dismiss_zone_height)
+            )
+
+        val screenRect = positioner.screenRect
+        // Center it around the bottom center of the screen
+        rect.offsetTo(
+            screenRect.exactCenterX() - rect.width() / 2f,
+            screenRect.bottom - rect.height()
+        )
+        return rect
+    }
+
+    override fun createDropTargetView(): View {
+        return LayoutInflater.from(context)
+            .inflate(R.layout.bubble_bar_drop_target, container, false /* attachToRoot */)
+            .also { view: View ->
+                dropTargetView = view
+                // Add at index 0 to ensure it does not cover the bubble
+                container.addView(view, 0)
+            }
+    }
+
+    override fun getDropTargetView(): View? {
+        return dropTargetView
+    }
+
+    override fun removeDropTargetView(view: View) {
+        container.removeView(view)
+        dropTargetView = null
+    }
+
+    override fun updateLocation(location: BubbleBarLocation) {
+        val view = dropTargetView ?: return
+        getBounds(location.isOnLeft(view.isLayoutRtl), tempRect)
+        view.updateLayoutParams<FrameLayout.LayoutParams> {
+            width = tempRect.width()
+            height = tempRect.height()
+        }
+        view.x = tempRect.left.toFloat()
+        view.y = tempRect.top.toFloat()
+    }
+
+    private fun getBounds(onLeft: Boolean, out: Rect) {
+        positioner.getBubbleBarExpandedViewBounds(onLeft, false /* isOverflowExpanded */, out)
+        val centerX = out.centerX()
+        val centerY = out.centerY()
+        out.scale(DROP_TARGET_SCALE)
+        // Move rect center back to the same position as before scale
+        out.offset(centerX - out.centerX(), centerY - out.centerY())
+    }
+
+    companion object {
+        @VisibleForTesting const val DROP_TARGET_SCALE = 0.9f
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayChangeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayChangeController.java
index b828aac..2873d584 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayChangeController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayChangeController.java
@@ -28,7 +28,7 @@
 
 import androidx.annotation.BinderThread;
 
-import com.android.wm.shell.common.annotations.ShellMainThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.sysui.ShellInit;
 
 import java.util.concurrent.CopyOnWriteArrayList;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java
index 8353900..dcbc72a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java
@@ -34,7 +34,7 @@
 import androidx.annotation.BinderThread;
 
 import com.android.wm.shell.common.DisplayChangeController.OnDisplayChangingListener;
-import com.android.wm.shell.common.annotations.ShellMainThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.sysui.ShellInit;
 
 import java.util.ArrayList;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayInsetsController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayInsetsController.java
index ca06024..55dc793 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayInsetsController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayInsetsController.java
@@ -30,7 +30,7 @@
 
 import androidx.annotation.BinderThread;
 
-import com.android.wm.shell.common.annotations.ShellMainThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.sysui.ShellInit;
 
 import java.util.concurrent.CopyOnWriteArrayList;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/TabletopModeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/TabletopModeController.java
index 53683c6..43c92ca 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/TabletopModeController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/TabletopModeController.java
@@ -33,7 +33,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.protolog.common.ProtoLog;
-import com.android.wm.shell.common.annotations.ShellMainThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.sysui.ShellInit;
 
 import java.lang.annotation.Retention;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ChoreographerSfVsync.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ChoreographerSfVsync.java
deleted file mode 100644
index 4009ad2..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ChoreographerSfVsync.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.android.wm.shell.common.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-import javax.inject.Qualifier;
-
-/**
- * Annotates a method that or qualifies a provider runs aligned to the Choreographer SF vsync
- * instead of the app vsync.
- */
-@Documented
-@Inherited
-@Qualifier
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ChoreographerSfVsync {}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ExternalMainThread.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ExternalMainThread.java
deleted file mode 100644
index 9ac7a12..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ExternalMainThread.java
+++ /dev/null
@@ -1,34 +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.wm.shell.common.annotations;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-
-import javax.inject.Qualifier;
-
-/**
- * Annotates a method or qualifies a provider that runs on the main-thread of the process using
- * this library.
- */
-@Qualifier
-@Documented
-@Retention(RUNTIME)
-public @interface ExternalMainThread {
-}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ExternalThread.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ExternalThread.java
deleted file mode 100644
index 7560f71..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ExternalThread.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.wm.shell.common.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-import javax.inject.Qualifier;
-
-/** Annotates a method or class that is called from an external thread to the Shell threads. */
-@Documented
-@Inherited
-@Qualifier
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ExternalThread {}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellAnimationThread.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellAnimationThread.java
deleted file mode 100644
index 0479f87..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellAnimationThread.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.wm.shell.common.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-import javax.inject.Qualifier;
-
-/** Annotates a method or qualifies a provider that runs on the Shell animation-thread */
-@Documented
-@Inherited
-@Qualifier
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ShellAnimationThread {}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellBackgroundThread.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellBackgroundThread.java
deleted file mode 100644
index 4cd3c90..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellBackgroundThread.java
+++ /dev/null
@@ -1,33 +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.wm.shell.common.annotations;
-
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-import javax.inject.Qualifier;
-
-/** Annotates a method or qualifies a provider that runs on the shared background thread */
-@Documented
-@Inherited
-@Qualifier
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ShellBackgroundThread {
-}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellMainThread.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellMainThread.java
deleted file mode 100644
index 423f4ce..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellMainThread.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.wm.shell.common.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-import javax.inject.Qualifier;
-
-/** Annotates a method or qualifies a provider that runs on the Shell main-thread */
-@Documented
-@Inherited
-@Qualifier
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ShellMainThread {}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellSplashscreenThread.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellSplashscreenThread.java
deleted file mode 100644
index c2fd54f..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/annotations/ShellSplashscreenThread.java
+++ /dev/null
@@ -1,33 +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.wm.shell.common.annotations;
-
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-import javax.inject.Qualifier;
-
-/** Annotates a method or qualifies a provider that runs on the Shell splashscreen-thread */
-@Documented
-@Inherited
-@Qualifier
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ShellSplashscreenThread {
-}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BaseBubblePinController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BaseBubblePinController.kt
new file mode 100644
index 0000000..630ad6e
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BaseBubblePinController.kt
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.common.bubbles
+
+import android.graphics.RectF
+import android.view.View
+import androidx.annotation.VisibleForTesting
+import androidx.core.animation.Animator
+import androidx.core.animation.AnimatorListenerAdapter
+import androidx.core.animation.ObjectAnimator
+import com.android.wm.shell.common.bubbles.BaseBubblePinController.LocationChangeListener
+import com.android.wm.shell.common.bubbles.BubbleBarLocation.LEFT
+import com.android.wm.shell.common.bubbles.BubbleBarLocation.RIGHT
+
+/**
+ * Base class for common logic shared between different bubble views to support pinning bubble bar
+ * to left or right edge of screen.
+ *
+ * Handles drag events and allows a [LocationChangeListener] to be registered that is notified when
+ * location of the bubble bar should change.
+ *
+ * Shows a drop target when releasing a view would update the [BubbleBarLocation].
+ */
+abstract class BaseBubblePinController {
+
+    private var onLeft = false
+    private var dismissZone: RectF? = null
+    private var screenCenterX = 0
+    private var listener: LocationChangeListener? = null
+    private var dropTargetAnimator: ObjectAnimator? = null
+
+    /**
+     * Signal the controller that dragging interaction has started.
+     *
+     * @param initialLocationOnLeft side of the screen where bubble bar is pinned to
+     */
+    fun onDragStart(initialLocationOnLeft: Boolean) {
+        onLeft = initialLocationOnLeft
+        dismissZone = getExclusionRect()
+        screenCenterX = getScreenCenterX()
+    }
+
+    /** View has moved to [x] and [y] screen coordinates */
+    fun onDragUpdate(x: Float, y: Float) {
+        if (dismissZone?.contains(x, y) == true) return
+
+        if (onLeft && x > screenCenterX) {
+            onLeft = false
+            onLocationChange(RIGHT)
+        } else if (!onLeft && x < screenCenterX) {
+            onLeft = true
+            onLocationChange(LEFT)
+        }
+    }
+
+    /** Temporarily hide the drop target view */
+    fun setDropTargetHidden(hidden: Boolean) {
+        val targetView = getDropTargetView() ?: return
+        if (hidden) {
+            targetView.animateOut()
+        } else {
+            targetView.animateIn()
+        }
+    }
+
+    /** Signal the controller that dragging interaction has finished. */
+    fun onDragEnd() {
+        getDropTargetView()?.let { view -> view.animateOut { removeDropTargetView(view) } }
+        dismissZone = null
+    }
+
+    /**
+     * [LocationChangeListener] that is notified when dragging interaction has resulted in bubble
+     * bar to be pinned on the other edge
+     */
+    fun setListener(listener: LocationChangeListener?) {
+        this.listener = listener
+    }
+
+    /** Get screen center coordinate on the x axis. */
+    protected abstract fun getScreenCenterX(): Int
+
+    /** Optional exclusion rect where drag interactions are not processed */
+    protected abstract fun getExclusionRect(): RectF?
+
+    /** Create the drop target view and attach it to the parent */
+    protected abstract fun createDropTargetView(): View
+
+    /** Get the drop target view if it exists */
+    protected abstract fun getDropTargetView(): View?
+
+    /** Remove the drop target view */
+    protected abstract fun removeDropTargetView(view: View)
+
+    /** Update size and location of the drop target view */
+    protected abstract fun updateLocation(location: BubbleBarLocation)
+
+    private fun onLocationChange(location: BubbleBarLocation) {
+        showDropTarget(location)
+        listener?.onChange(location)
+    }
+
+    private fun showDropTarget(location: BubbleBarLocation) {
+        val targetView = getDropTargetView() ?: createDropTargetView().apply { alpha = 0f }
+        if (targetView.alpha > 0) {
+            targetView.animateOut {
+                updateLocation(location)
+                targetView.animateIn()
+            }
+        } else {
+            updateLocation(location)
+            targetView.animateIn()
+        }
+    }
+
+    private fun View.animateIn() {
+        dropTargetAnimator?.cancel()
+        dropTargetAnimator =
+            ObjectAnimator.ofFloat(this, View.ALPHA, 1f)
+                .setDuration(DROP_TARGET_ALPHA_IN_DURATION)
+                .addEndAction { dropTargetAnimator = null }
+        dropTargetAnimator?.start()
+    }
+
+    private fun View.animateOut(endAction: Runnable? = null) {
+        dropTargetAnimator?.cancel()
+        dropTargetAnimator =
+            ObjectAnimator.ofFloat(this, View.ALPHA, 0f)
+                .setDuration(DROP_TARGET_ALPHA_OUT_DURATION)
+                .addEndAction {
+                    endAction?.run()
+                    dropTargetAnimator = null
+                }
+        dropTargetAnimator?.start()
+    }
+
+    private fun <T : Animator> T.addEndAction(runnable: Runnable): T {
+        addListener(
+            object : AnimatorListenerAdapter() {
+                override fun onAnimationEnd(animation: Animator) {
+                    runnable.run()
+                }
+            }
+        )
+        return this
+    }
+
+    /** Receive updates on location changes */
+    interface LocationChangeListener {
+        /**
+         * Bubble bar [BubbleBarLocation] has changed as a result of dragging
+         *
+         * Triggered when drag gesture passes the middle of the screen and before touch up. Can be
+         * triggered multiple times per gesture.
+         *
+         * @param location new location as a result of the ongoing drag operation
+         */
+        fun onChange(location: BubbleBarLocation)
+    }
+
+    companion object {
+        @VisibleForTesting const val DROP_TARGET_ALPHA_IN_DURATION = 150L
+        @VisibleForTesting const val DROP_TARGET_ALPHA_OUT_DURATION = 100L
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BubbleBarLocation.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BubbleBarLocation.aidl
new file mode 100644
index 0000000..3c5beeb
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BubbleBarLocation.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.wm.shell.common.bubbles;
+
+parcelable BubbleBarLocation;
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/DismissView.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/DismissView.kt
index 9094739..e06de9e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/DismissView.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/DismissView.kt
@@ -35,7 +35,7 @@
 import androidx.dynamicanimation.animation.DynamicAnimation
 import androidx.dynamicanimation.animation.SpringForce.DAMPING_RATIO_LOW_BOUNCY
 import androidx.dynamicanimation.animation.SpringForce.STIFFNESS_LOW
-import com.android.wm.shell.animation.PhysicsAnimator
+import com.android.wm.shell.shared.animation.PhysicsAnimator
 
 /**
  * View that handles interactions between DismissCircleView and BubbleStackView.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/magnetictarget/MagnetizedObject.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/magnetictarget/MagnetizedObject.kt
index 11e4777..123d4dc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/magnetictarget/MagnetizedObject.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/magnetictarget/MagnetizedObject.kt
@@ -28,7 +28,7 @@
 import androidx.dynamicanimation.animation.DynamicAnimation
 import androidx.dynamicanimation.animation.FloatPropertyCompat
 import androidx.dynamicanimation.animation.SpringForce
-import com.android.wm.shell.animation.PhysicsAnimator
+import com.android.wm.shell.shared.animation.PhysicsAnimator
 import kotlin.math.abs
 import kotlin.math.hypot
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PhoneSizeSpecSource.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PhoneSizeSpecSource.kt
index 18c7bdd..7eb0f26 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PhoneSizeSpecSource.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PhoneSizeSpecSource.kt
@@ -18,7 +18,6 @@
 
 import android.content.Context
 import android.content.res.Resources
-import android.os.SystemProperties
 import android.util.Size
 import com.android.wm.shell.R
 import java.io.PrintWriter
@@ -36,30 +35,81 @@
     private var mOverrideMinSize: Size? = null
 
 
-    /** Default and minimum percentages for the PIP size logic.  */
-    private val mDefaultSizePercent: Float
-    private val mMinimumSizePercent: Float
+    /**
+     * Default percentages for the PIP size logic.
+     * 1. Determine max widths
+     * Subtract width of system UI and default padding from the shortest edge of the device.
+     * This is the max width.
+     * 2. Calculate Default and Mins
+     * Default is mSystemPreferredDefaultSizePercent of max-width/height.
+     * Min is mSystemPreferredMinimumSizePercent of it.
+     *
+     * NOTE: Do not use this directly, use the mPreferredDefaultSizePercent getter instead.
+     */
+    private var mSystemPreferredDefaultSizePercent = 0.6f
+    /** Minimum percentages for the PIP size logic. */
+    private var mSystemPreferredMinimumSizePercent = 0.5f
+
+    /** Threshold to categorize the Display as square, calculated as min(w, h) / max(w, h). */
+    private var mSquareDisplayThresholdForSystemPreferredSize = 0.95f
+    /**
+     * Default percentages for the PIP size logic when the Display is square-ish.
+     * This is used instead when the display is square-ish, like fold-ables when unfolded,
+     * to make sure that default PiP does not cover the hinge (halfway of the display).
+     * 1. Determine max widths
+     * Subtract width of system UI and default padding from the shortest edge of the device.
+     * This is the max width.
+     * 2. Calculate Default and Mins
+     * Default is mSystemPreferredDefaultSizePercent of max-width/height.
+     * Min is mSystemPreferredMinimumSizePercent of it.
+     *
+     * NOTE: Do not use this directly, use the mPreferredDefaultSizePercent getter instead.
+     */
+    private var mSystemPreferredDefaultSizePercentForSquareDisplay = 0.5f
+    /** Minimum percentages for the PIP size logic. */
+    private var mSystemPreferredMinimumSizePercentForSquareDisplay = 0.4f
+
+    private val mIsSquareDisplay
+        get() = minOf(pipDisplayLayoutState.displayLayout.width(),
+                        pipDisplayLayoutState.displayLayout.height()).toFloat() /
+                maxOf(pipDisplayLayoutState.displayLayout.width(),
+                        pipDisplayLayoutState.displayLayout.height()) >
+                mSquareDisplayThresholdForSystemPreferredSize
+    private val mPreferredDefaultSizePercent
+        get() = if (mIsSquareDisplay) mSystemPreferredDefaultSizePercentForSquareDisplay else
+            mSystemPreferredDefaultSizePercent
+
+    private val mPreferredMinimumSizePercent
+        get() = if (mIsSquareDisplay) mSystemPreferredMinimumSizePercentForSquareDisplay else
+            mSystemPreferredMinimumSizePercent
 
     /** Aspect ratio that the PIP size spec logic optimizes for.  */
     private var mOptimizedAspectRatio = 0f
 
     init {
-        mDefaultSizePercent = SystemProperties
-                .get("com.android.wm.shell.pip.phone.def_percentage", "0.6").toFloat()
-        mMinimumSizePercent = SystemProperties
-                .get("com.android.wm.shell.pip.phone.min_percentage", "0.5").toFloat()
-
         reloadResources()
     }
 
     private fun reloadResources() {
-        val res: Resources = context.getResources()
+        val res: Resources = context.resources
 
         mDefaultMinSize = res.getDimensionPixelSize(
                 R.dimen.default_minimal_size_pip_resizable_task)
         mOverridableMinSize = res.getDimensionPixelSize(
                 R.dimen.overridable_minimal_size_pip_resizable_task)
 
+        mSystemPreferredDefaultSizePercent = res.getFloat(
+                R.dimen.config_pipSystemPreferredDefaultSizePercent)
+        mSystemPreferredMinimumSizePercent = res.getFloat(
+                R.dimen.config_pipSystemPreferredMinimumSizePercent)
+
+        mSquareDisplayThresholdForSystemPreferredSize = res.getFloat(
+                R.dimen.config_pipSquareDisplayThresholdForSystemPreferredSize)
+        mSystemPreferredDefaultSizePercentForSquareDisplay = res.getFloat(
+                R.dimen.config_pipSystemPreferredDefaultSizePercentForSquareDisplay)
+        mSystemPreferredMinimumSizePercentForSquareDisplay = res.getFloat(
+                R.dimen.config_pipSystemPreferredMinimumSizePercentForSquareDisplay)
+
         val requestedOptAspRatio = res.getFloat(R.dimen.config_pipLargeScreenOptimizedAspectRatio)
         // make sure the optimized aspect ratio is valid with a default value to fall back to
         mOptimizedAspectRatio = if (requestedOptAspRatio > 1) {
@@ -128,7 +178,7 @@
             return minSize
         }
         val maxSize = getMaxSize(aspectRatio)
-        val defaultWidth = Math.max(Math.round(maxSize.width * mDefaultSizePercent),
+        val defaultWidth = Math.max(Math.round(maxSize.width * mPreferredDefaultSizePercent),
                 minSize.width)
         val defaultHeight = Math.round(defaultWidth / aspectRatio)
         return Size(defaultWidth, defaultHeight)
@@ -146,8 +196,8 @@
             return adjustOverrideMinSizeToAspectRatio(aspectRatio)!!
         }
         val maxSize = getMaxSize(aspectRatio)
-        var minWidth = Math.round(maxSize.width * mMinimumSizePercent)
-        var minHeight = Math.round(maxSize.height * mMinimumSizePercent)
+        var minWidth = Math.round(maxSize.width * mPreferredMinimumSizePercent)
+        var minHeight = Math.round(maxSize.height * mPreferredMinimumSizePercent)
 
         // make sure the calculated min size is not smaller than the allowed default min size
         if (aspectRatio > 1f) {
@@ -244,8 +294,8 @@
         pw.println(innerPrefix + "mOverrideMinSize=" + mOverrideMinSize)
         pw.println(innerPrefix + "mOverridableMinSize=" + mOverridableMinSize)
         pw.println(innerPrefix + "mDefaultMinSize=" + mDefaultMinSize)
-        pw.println(innerPrefix + "mDefaultSizePercent=" + mDefaultSizePercent)
-        pw.println(innerPrefix + "mMinimumSizePercent=" + mMinimumSizePercent)
+        pw.println(innerPrefix + "mDefaultSizePercent=" + mPreferredDefaultSizePercent)
+        pw.println(innerPrefix + "mMinimumSizePercent=" + mPreferredMinimumSizePercent)
         pw.println(innerPrefix + "mOptimizedAspectRatio=" + mOptimizedAspectRatio)
     }
 }
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipPerfHintController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipPerfHintController.java
index 317e48e..c421dec 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipPerfHintController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipPerfHintController.java
@@ -28,7 +28,7 @@
 
 import com.android.internal.protolog.common.ProtoLog;
 import com.android.wm.shell.common.ShellExecutor;
-import com.android.wm.shell.common.annotations.ShellMainThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 
 import java.io.PrintWriter;
 import java.util.Map;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java
index fa2e236..cf3ad42 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIConfiguration.java
@@ -24,8 +24,8 @@
 
 import com.android.wm.shell.R;
 import com.android.wm.shell.common.ShellExecutor;
-import com.android.wm.shell.common.annotations.ShellMainThread;
 import com.android.wm.shell.dagger.WMSingleton;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 
 import javax.inject.Inject;
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java
index 216da07..0110937 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java
@@ -31,10 +31,9 @@
 import com.android.wm.shell.common.SyncTransactionQueue;
 import com.android.wm.shell.common.SystemWindows;
 import com.android.wm.shell.common.TransactionPool;
-import com.android.wm.shell.common.annotations.ShellMainThread;
 import com.android.wm.shell.dagger.pip.TvPipModule;
-import com.android.wm.shell.draganddrop.DragAndDropController;
 import com.android.wm.shell.recents.RecentTasksController;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.splitscreen.SplitScreenController;
 import com.android.wm.shell.splitscreen.tv.TvSplitScreenController;
 import com.android.wm.shell.startingsurface.StartingWindowTypeAlgorithm;
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 5122114..73228de 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
@@ -58,10 +58,6 @@
 import com.android.wm.shell.common.TabletopModeController;
 import com.android.wm.shell.common.TaskStackListenerImpl;
 import com.android.wm.shell.common.TransactionPool;
-import com.android.wm.shell.common.annotations.ShellAnimationThread;
-import com.android.wm.shell.common.annotations.ShellBackgroundThread;
-import com.android.wm.shell.common.annotations.ShellMainThread;
-import com.android.wm.shell.common.annotations.ShellSplashscreenThread;
 import com.android.wm.shell.common.pip.PhonePipKeepClearAlgorithm;
 import com.android.wm.shell.common.pip.PhoneSizeSpecSource;
 import com.android.wm.shell.common.pip.PipBoundsAlgorithm;
@@ -92,6 +88,11 @@
 import com.android.wm.shell.recents.RecentTasks;
 import com.android.wm.shell.recents.RecentTasksController;
 import com.android.wm.shell.recents.RecentsTransitionHandler;
+import com.android.wm.shell.shared.ShellTransitions;
+import com.android.wm.shell.shared.annotations.ShellAnimationThread;
+import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
+import com.android.wm.shell.shared.annotations.ShellSplashscreenThread;
 import com.android.wm.shell.splitscreen.SplitScreen;
 import com.android.wm.shell.splitscreen.SplitScreenController;
 import com.android.wm.shell.startingsurface.StartingSurface;
@@ -106,7 +107,6 @@
 import com.android.wm.shell.taskview.TaskViewFactoryController;
 import com.android.wm.shell.taskview.TaskViewTransitions;
 import com.android.wm.shell.transition.HomeTransitionObserver;
-import com.android.wm.shell.transition.ShellTransitions;
 import com.android.wm.shell.transition.Transitions;
 import com.android.wm.shell.unfold.ShellUnfoldProgressProvider;
 import com.android.wm.shell.unfold.UnfoldAnimationController;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java
index 0cc545a..c5644a8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java
@@ -33,11 +33,11 @@
 import com.android.wm.shell.R;
 import com.android.wm.shell.common.HandlerExecutor;
 import com.android.wm.shell.common.ShellExecutor;
-import com.android.wm.shell.common.annotations.ExternalMainThread;
-import com.android.wm.shell.common.annotations.ShellAnimationThread;
-import com.android.wm.shell.common.annotations.ShellBackgroundThread;
-import com.android.wm.shell.common.annotations.ShellMainThread;
-import com.android.wm.shell.common.annotations.ShellSplashscreenThread;
+import com.android.wm.shell.shared.annotations.ExternalMainThread;
+import com.android.wm.shell.shared.annotations.ShellAnimationThread;
+import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
+import com.android.wm.shell.shared.annotations.ShellSplashscreenThread;
 
 import dagger.Module;
 import dagger.Provides;
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 04f0f44..b933e5d 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
@@ -52,9 +52,6 @@
 import com.android.wm.shell.common.SyncTransactionQueue;
 import com.android.wm.shell.common.TaskStackListenerImpl;
 import com.android.wm.shell.common.TransactionPool;
-import com.android.wm.shell.common.annotations.ShellAnimationThread;
-import com.android.wm.shell.common.annotations.ShellBackgroundThread;
-import com.android.wm.shell.common.annotations.ShellMainThread;
 import com.android.wm.shell.dagger.back.ShellBackAnimationModule;
 import com.android.wm.shell.dagger.pip.PipModule;
 import com.android.wm.shell.desktopmode.DesktopModeEventLogger;
@@ -77,6 +74,9 @@
 import com.android.wm.shell.pip.PipTransitionController;
 import com.android.wm.shell.recents.RecentTasksController;
 import com.android.wm.shell.recents.RecentsTransitionHandler;
+import com.android.wm.shell.shared.annotations.ShellAnimationThread;
+import com.android.wm.shell.shared.annotations.ShellBackgroundThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.splitscreen.SplitScreenController;
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java
index 1e3d7fb..d644006 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java
@@ -29,7 +29,6 @@
 import com.android.wm.shell.common.SystemWindows;
 import com.android.wm.shell.common.TabletopModeController;
 import com.android.wm.shell.common.TaskStackListenerImpl;
-import com.android.wm.shell.common.annotations.ShellMainThread;
 import com.android.wm.shell.common.pip.PhonePipKeepClearAlgorithm;
 import com.android.wm.shell.common.pip.PipAppOpsListener;
 import com.android.wm.shell.common.pip.PipBoundsAlgorithm;
@@ -56,6 +55,7 @@
 import com.android.wm.shell.pip.phone.PipController;
 import com.android.wm.shell.pip.phone.PipMotionHelper;
 import com.android.wm.shell.pip.phone.PipTouchHandler;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.splitscreen.SplitScreenController;
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
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 458ea05..4eff3f0 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
@@ -23,21 +23,27 @@
 import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.common.DisplayController;
 import com.android.wm.shell.common.DisplayInsetsController;
+import com.android.wm.shell.common.FloatingContentCoordinator;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.SystemWindows;
-import com.android.wm.shell.common.annotations.ShellMainThread;
 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.PipMediaController;
+import com.android.wm.shell.common.pip.PipPerfHintController;
+import com.android.wm.shell.common.pip.PipSnapAlgorithm;
 import com.android.wm.shell.common.pip.PipUiEventLogger;
 import com.android.wm.shell.common.pip.PipUtils;
+import com.android.wm.shell.common.pip.SizeSpecSource;
 import com.android.wm.shell.dagger.WMShellBaseModule;
 import com.android.wm.shell.dagger.WMSingleton;
 import com.android.wm.shell.pip2.phone.PhonePipMenuController;
 import com.android.wm.shell.pip2.phone.PipController;
+import com.android.wm.shell.pip2.phone.PipMotionHelper;
 import com.android.wm.shell.pip2.phone.PipScheduler;
+import com.android.wm.shell.pip2.phone.PipTouchHandler;
 import com.android.wm.shell.pip2.phone.PipTransition;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.transition.Transitions;
@@ -62,6 +68,7 @@
             PipBoundsState pipBoundsState,
             PipBoundsAlgorithm pipBoundsAlgorithm,
             Optional<PipController> pipController,
+            PipTouchHandler pipTouchHandler,
             @NonNull PipScheduler pipScheduler) {
         return new PipTransition(context, shellInit, shellTaskOrganizer, transitions,
                 pipBoundsState, null, pipBoundsAlgorithm, pipScheduler);
@@ -93,8 +100,9 @@
     @Provides
     static PipScheduler providePipScheduler(Context context,
             PipBoundsState pipBoundsState,
-            @ShellMainThread ShellExecutor mainExecutor) {
-        return new PipScheduler(context, pipBoundsState, mainExecutor);
+            @ShellMainThread ShellExecutor mainExecutor,
+            ShellTaskOrganizer shellTaskOrganizer) {
+        return new PipScheduler(context, pipBoundsState, mainExecutor, shellTaskOrganizer);
     }
 
     @WMSingleton
@@ -108,4 +116,34 @@
         return new PhonePipMenuController(context, pipBoundsState, pipMediaController,
                 systemWindows, pipUiEventLogger, mainExecutor, mainHandler);
     }
+
+
+    @WMSingleton
+    @Provides
+    static PipTouchHandler providePipTouchHandler(Context context,
+            ShellInit shellInit,
+            PhonePipMenuController menuPhoneController,
+            PipBoundsAlgorithm pipBoundsAlgorithm,
+            @NonNull PipBoundsState pipBoundsState,
+            @NonNull SizeSpecSource sizeSpecSource,
+            PipMotionHelper pipMotionHelper,
+            FloatingContentCoordinator floatingContentCoordinator,
+            PipUiEventLogger pipUiEventLogger,
+            @ShellMainThread ShellExecutor mainExecutor,
+            Optional<PipPerfHintController> pipPerfHintControllerOptional) {
+        return new PipTouchHandler(context, shellInit, menuPhoneController, pipBoundsAlgorithm,
+                pipBoundsState, sizeSpecSource, pipMotionHelper, floatingContentCoordinator,
+                pipUiEventLogger, mainExecutor, pipPerfHintControllerOptional);
+    }
+
+    @WMSingleton
+    @Provides
+    static PipMotionHelper providePipMotionHelper(Context context,
+            PipBoundsState pipBoundsState, PhonePipMenuController menuController,
+            PipSnapAlgorithm pipSnapAlgorithm,
+            FloatingContentCoordinator floatingContentCoordinator,
+            Optional<PipPerfHintController> pipPerfHintControllerOptional) {
+        return new PipMotionHelper(context, pipBoundsState, menuController, pipSnapAlgorithm,
+                floatingContentCoordinator, pipPerfHintControllerOptional);
+    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java
index 54c2aea..8d1b15c1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java
@@ -29,7 +29,6 @@
 import com.android.wm.shell.common.SyncTransactionQueue;
 import com.android.wm.shell.common.SystemWindows;
 import com.android.wm.shell.common.TaskStackListenerImpl;
-import com.android.wm.shell.common.annotations.ShellMainThread;
 import com.android.wm.shell.common.pip.LegacySizeSpecSource;
 import com.android.wm.shell.common.pip.PipAppOpsListener;
 import com.android.wm.shell.common.pip.PipDisplayLayoutState;
@@ -53,6 +52,7 @@
 import com.android.wm.shell.pip.tv.TvPipNotificationController;
 import com.android.wm.shell.pip.tv.TvPipTaskOrganizer;
 import com.android.wm.shell.pip.tv.TvPipTransition;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.splitscreen.SplitScreenController;
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
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 5889da1..df1b062 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
@@ -18,7 +18,7 @@
 
 import android.graphics.Region;
 
-import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeStatus.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeStatus.java
index 494d893..32c22c0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeStatus.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeStatus.java
@@ -20,9 +20,9 @@
 import android.content.Context;
 import android.os.SystemProperties;
 
+import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.window.flags.Flags;
-import com.android.wm.shell.R;
 
 /**
  * Constants for desktop mode feature
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
index 7c8fcbb..120d681 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt
@@ -16,10 +16,12 @@
 
 package com.android.wm.shell.desktopmode
 
+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 androidx.core.util.forEach
 import androidx.core.util.keyIterator
 import androidx.core.util.valueIterator
@@ -54,6 +56,8 @@
     private val visibleTasksListeners = ArrayMap<VisibleTasksListener, Executor>()
     // Track corner/caption regions of desktop tasks, used to determine gesture exclusion
     private val desktopExclusionRegions = SparseArray<Region>()
+    // Track 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
 
@@ -226,6 +230,14 @@
                         displayData[otherDisplayId].visibleTasks.size)
                 }
             }
+        } else if (displayId == INVALID_DISPLAY) {
+            // Task has vanished. Check which display to remove the task from.
+            displayData.forEach { displayId, data ->
+                if (data.visibleTasks.remove(taskId)) {
+                    notifyVisibleTaskListeners(displayId, data.visibleTasks.size)
+                }
+            }
+            return
         }
 
         val prevCount = getVisibleTaskCount(displayId)
@@ -236,6 +248,7 @@
         }
         val newCount = getVisibleTaskCount(displayId)
 
+        // Check if count changed
         if (prevCount != newCount) {
             KtProtoLog.d(
                 WM_SHELL_DESKTOP_MODE,
@@ -244,10 +257,6 @@
                 visible,
                 displayId
             )
-        }
-
-        // Check if count changed
-        if (prevCount != newCount) {
             KtProtoLog.d(
                 WM_SHELL_DESKTOP_MODE,
                 "DesktopTaskRepo: visibleTaskCount has changed from %d to %d",
@@ -301,6 +310,7 @@
             taskId
         )
         freeformTasksInZOrder.remove(taskId)
+        boundsBeforeMaximizeByTaskId.remove(taskId)
         KtProtoLog.d(
             WM_SHELL_DESKTOP_MODE,
             "DesktopTaskRepo: remaining freeform tasks: " + freeformTasksInZOrder.toDumpString()
@@ -352,6 +362,20 @@
     }
 
     /**
+     * Removes and returns the bounds saved before maximizing the given task.
+     */
+    fun removeBoundsBeforeMaximize(taskId: Int): Rect? {
+        return boundsBeforeMaximizeByTaskId.removeReturnOld(taskId)
+    }
+
+    /**
+     * Saves the bounds of the given task before maximizing.
+     */
+    fun saveBoundsBeforeMaximize(taskId: Int, bounds: Rect) {
+        boundsBeforeMaximizeByTaskId.set(taskId, Rect(bounds))
+    }
+
+    /**
      * Check if display with id [displayId] has desktop tasks stashed
      */
     fun isStashed(displayId: Int): Boolean {
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 1b1c967..58942ec 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
@@ -61,8 +61,6 @@
 import com.android.wm.shell.common.ShellExecutor
 import com.android.wm.shell.common.SingleInstanceRemoteListener
 import com.android.wm.shell.common.SyncTransactionQueue
-import com.android.wm.shell.common.annotations.ExternalThread
-import com.android.wm.shell.common.annotations.ShellMainThread
 import com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT
 import com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT
 import com.android.wm.shell.compatui.isSingleTopActivityTranslucent
@@ -72,6 +70,8 @@
 import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
 import com.android.wm.shell.recents.RecentsTransitionHandler
 import com.android.wm.shell.recents.RecentsTransitionStateListener
+import com.android.wm.shell.shared.annotations.ExternalThread
+import com.android.wm.shell.shared.annotations.ShellMainThread
 import com.android.wm.shell.splitscreen.SplitScreenController
 import com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DESKTOP_MODE
 import com.android.wm.shell.sysui.ShellCommandHandler
@@ -120,7 +120,6 @@
     private var visualIndicator: DesktopModeVisualIndicator? = null
     private val desktopModeShellCommandHandler: DesktopModeShellCommandHandler =
         DesktopModeShellCommandHandler(this)
-
     private val mOnAnimationFinishedCallback = Consumer<SurfaceControl.Transaction> {
         t: SurfaceControl.Transaction ->
         visualIndicator?.releaseVisualIndicator(t)
@@ -570,7 +569,10 @@
         }
     }
 
-    /** Quick-resizes a desktop task, toggling between the stable bounds and the default bounds. */
+    /**
+     * Quick-resizes a desktop task, toggling between the stable bounds and the last saved bounds
+     * if available or the default bounds otherwise.
+     */
     fun toggleDesktopTaskSize(taskInfo: RunningTaskInfo) {
         val displayLayout = displayController.getDisplayLayout(taskInfo.displayId) ?: return
 
@@ -578,11 +580,21 @@
         displayLayout.getStableBounds(stableBounds)
         val destinationBounds = Rect()
         if (taskInfo.configuration.windowConfiguration.bounds == stableBounds) {
-            // The desktop task is currently occupying the whole stable bounds, toggle to the
-            // default bounds.
-            getDefaultDesktopTaskBounds(displayLayout, destinationBounds)
+            // The desktop task is currently occupying the whole stable bounds. If the bounds
+            // before the task was toggled to stable bounds were saved, toggle the task to those
+            // bounds. Otherwise, toggle to the default bounds.
+            val taskBoundsBeforeMaximize =
+                    desktopModeTaskRepository.removeBoundsBeforeMaximize(taskInfo.taskId)
+            if (taskBoundsBeforeMaximize != null) {
+                destinationBounds.set(taskBoundsBeforeMaximize)
+            } else {
+                getDefaultDesktopTaskBounds(displayLayout, destinationBounds)
+            }
         } else {
-            // Toggle to the stable bounds.
+            // Save current bounds so that task can be restored back to original bounds if necessary
+            // and toggle to the stable bounds.
+            val taskBounds = taskInfo.configuration.windowConfiguration.bounds
+            desktopModeTaskRepository.saveBoundsBeforeMaximize(taskInfo.taskId, taskBounds)
             destinationBounds.set(stableBounds)
         }
 
@@ -1342,6 +1354,13 @@
                     "setTaskListener"
             ) { _ -> listener?.let { remoteListener.register(it) } ?: remoteListener.unregister() }
         }
+
+        override fun moveToDesktop(taskId: Int) {
+            ExecutorUtils.executeRemoteCallWithTaskPermission(
+                controller,
+                "moveToDesktop"
+            ) { c -> c.moveToDesktop(taskId) }
+        }
     }
 
     companion object {
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 b830a41..0061d03 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
@@ -369,67 +369,50 @@
             val startBounds = draggedTaskChange.startAbsBounds
             val endBounds = draggedTaskChange.endAbsBounds
 
-            // TODO(b/301106941): Instead of forcing-finishing the animation that scales the
-            //  surface down and then starting another that scales it back up to the final size,
-            //  blend the two animations.
-            state.dragAnimator.endAnimator()
-            // Using [DRAG_FREEFORM_SCALE] to calculate animated width/height is possible because
-            // it is known that the animation scale is finished because the animation was
-            // force-ended above. This won't be true when the two animations are blended.
-            val animStartWidth = (startBounds.width() * DRAG_FREEFORM_SCALE).toInt()
-            val animStartHeight = (startBounds.height() * DRAG_FREEFORM_SCALE).toInt()
-            // Using end bounds here to find the left/top also assumes the center animation has
-            // finished and the surface is placed exactly in the center of the screen which matches
-            // the end/default bounds of the now freeform task.
-            val animStartLeft = endBounds.centerX() - (animStartWidth / 2)
-            val animStartTop = endBounds.centerY() - (animStartHeight / 2)
-            val animStartBounds = Rect(
-                    animStartLeft,
-                    animStartTop,
-                    animStartLeft + animStartWidth,
-                    animStartTop + animStartHeight
+            // Pause any animation that may be currently playing; we will use the relevant
+            // details of that animation here.
+            state.dragAnimator.cancelAnimator()
+            // We still apply scale to task bounds; as we animate the bounds to their
+            // end value, animate scale to 1.
+            val startScale = state.dragAnimator.scale
+            val startPosition = state.dragAnimator.position
+            val unscaledStartWidth = startBounds.width()
+            val unscaledStartHeight = startBounds.height()
+            val unscaledStartBounds = Rect(
+                startPosition.x.toInt(),
+                startPosition.y.toInt(),
+                startPosition.x.toInt() + unscaledStartWidth,
+                startPosition.y.toInt() + unscaledStartHeight
             )
 
-
             dragToDesktopStateListener?.onCommitToDesktopAnimationStart(t)
-            t.apply {
-                setScale(draggedTaskLeash, 1f, 1f)
-                setPosition(
-                        draggedTaskLeash,
-                        animStartBounds.left.toFloat(),
-                        animStartBounds.top.toFloat()
-                )
-                setWindowCrop(
-                        draggedTaskLeash,
-                        animStartBounds.width(),
-                        animStartBounds.height()
-                )
-            }
             // Accept the merge by applying the merging transaction (applied by #showResizeVeil)
             // and finish callback. Show the veil and position the task at the first frame before
             // starting the final animation.
-            onTaskResizeAnimationListener.onAnimationStart(state.draggedTaskId, t, animStartBounds)
+            onTaskResizeAnimationListener.onAnimationStart(state.draggedTaskId, t,
+                unscaledStartBounds)
             finishCallback.onTransitionFinished(null /* wct */)
 
-            // Because the task surface was scaled down during the drag, we must use the animated
-            // bounds instead of the [startAbsBounds].
             val tx: SurfaceControl.Transaction = transactionSupplier.get()
-            ValueAnimator.ofObject(rectEvaluator, animStartBounds, endBounds)
+            ValueAnimator.ofObject(rectEvaluator, unscaledStartBounds, endBounds)
                     .setDuration(DRAG_TO_DESKTOP_FINISH_ANIM_DURATION_MS)
                     .apply {
                         addUpdateListener { animator ->
                             val animBounds = animator.animatedValue as Rect
+                            val animFraction = animator.animatedFraction
+                            // Progress scale from starting value to 1 as animation plays.
+                            val animScale = startScale + animFraction * (1 - startScale)
                             tx.apply {
-                                setScale(draggedTaskLeash, 1f, 1f)
-                                 setPosition(
-                                         draggedTaskLeash,
-                                         animBounds.left.toFloat(),
-                                         animBounds.top.toFloat()
-                                 )
+                                setScale(draggedTaskLeash, animScale, animScale)
+                                setPosition(
+                                     draggedTaskLeash,
+                                     animBounds.left.toFloat(),
+                                     animBounds.top.toFloat()
+                                )
                                 setWindowCrop(
-                                        draggedTaskLeash,
-                                        animBounds.width(),
-                                        animBounds.height()
+                                    draggedTaskLeash,
+                                    animBounds.width(),
+                                    animBounds.height()
                                 )
                             }
                             onTaskResizeAnimationListener.onBoundsChange(
@@ -493,10 +476,8 @@
         val draggedTaskChange = state.draggedTaskChange
                 ?: throw IllegalStateException("Expected non-null task change")
         val sc = draggedTaskChange.leash
-        // TODO(b/301106941): Don't end the animation and start one to scale it back, merge them
-        //  instead.
-        // End the animation that shrinks the window when task is first dragged from fullscreen
-        dragToDesktopAnimator.endAnimator()
+        // Pause the animation that shrinks the window when task is first dragged from fullscreen
+        dragToDesktopAnimator.cancelAnimator()
         // Then animate the scaled window back to its original bounds.
         val x: Float = dragToDesktopAnimator.position.x
         val y: Float = dragToDesktopAnimator.position.y
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 6bdaf1e..fa43522 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
@@ -45,4 +45,7 @@
 
     /** Set listener that will receive callbacks about updates to desktop tasks */
     oneway void setTaskListener(IDesktopTaskListener listener);
+
+    /** Move a task with given `taskId` to desktop */
+    void moveToDesktop(int taskId);
 }
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
index 7da1b23..165feec 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
@@ -67,8 +67,8 @@
 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.annotations.ExternalMainThread;
 import com.android.wm.shell.protolog.ShellProtoLogGroup;
+import com.android.wm.shell.shared.annotations.ExternalMainThread;
 import com.android.wm.shell.splitscreen.SplitScreenController;
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
index 43dd66d..6a7d297 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
@@ -310,10 +310,6 @@
                 | FLAG_ACTIVITY_MULTIPLE_TASK);
 
         final Bundle opts = baseActivityOpts.toBundle();
-        // Put BAL flags to avoid activity start aborted.
-        opts.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED, true);
-        opts.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED_BY_PERMISSION, true);
-
         mStarter.startIntent(session.launchableIntent,
                 session.launchableIntent.getCreatorUserHandle().getIdentifier(),
                 null /* fillIntent */, position, opts);
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 73de231f..863a51a 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
@@ -48,8 +48,8 @@
 
 import com.android.internal.protolog.common.ProtoLog;
 import com.android.wm.shell.common.ShellExecutor;
-import com.android.wm.shell.common.annotations.ExternalThread;
 import com.android.wm.shell.protolog.ShellProtoLogGroup;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 import com.android.wm.shell.sysui.KeyguardChangeListener;
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
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 33c299f..4215b2c 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
@@ -19,7 +19,7 @@
 import android.annotation.NonNull;
 import android.window.IRemoteTransition;
 
-import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 
 /**
  * Interface exposed to SystemUI Keyguard to register handlers for running
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java
index 2ee3348..b000e32 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHanded.java
@@ -18,7 +18,7 @@
 
 import android.os.SystemProperties;
 
-import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 
 /**
  * Interface to engage one handed feature.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java
index 679d4ca..39b9000 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java
@@ -55,7 +55,7 @@
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.TaskStackListenerCallback;
 import com.android.wm.shell.common.TaskStackListenerImpl;
-import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 import com.android.wm.shell.sysui.ConfigurationChangeListener;
 import com.android.wm.shell.sysui.KeyguardChangeListener;
 import com.android.wm.shell.sysui.ShellCommandHandler;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/Pip.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/Pip.java
index a9aa6ba..7b1ef5c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/Pip.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/Pip.java
@@ -18,7 +18,7 @@
 
 import android.graphics.Rect;
 
-import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 
 import java.util.function.Consumer;
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
index bd186ba..c16eac8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
@@ -82,7 +82,6 @@
 import com.android.wm.shell.common.ScreenshotUtils;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.SyncTransactionQueue;
-import com.android.wm.shell.common.annotations.ShellMainThread;
 import com.android.wm.shell.common.pip.PipBoundsAlgorithm;
 import com.android.wm.shell.common.pip.PipBoundsState;
 import com.android.wm.shell.common.pip.PipDisplayLayoutState;
@@ -92,6 +91,7 @@
 import com.android.wm.shell.common.pip.PipUtils;
 import com.android.wm.shell.pip.phone.PipMotionHelper;
 import com.android.wm.shell.protolog.ShellProtoLogGroup;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.splitscreen.SplitScreenController;
 import com.android.wm.shell.transition.Transitions;
 
@@ -1957,6 +1957,8 @@
         }
         if (mPipTransitionState.getTransitionState() == PipTransitionState.UNDEFINED) {
             // Avoid double removal, which is fatal.
+            ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: trying to remove overlay (%s) while in UNDEFINED state", TAG, surface);
             return;
         }
         if (surface == null || !surface.isValid()) {
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 6a1a62ea..d60f5a6 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
@@ -27,6 +27,7 @@
 import static android.view.WindowManager.TRANSIT_OPEN;
 import static android.view.WindowManager.TRANSIT_PIP;
 import static android.view.WindowManager.TRANSIT_TO_BACK;
+import static android.view.WindowManager.TRANSIT_TO_FRONT;
 import static android.view.WindowManager.transitTypeToString;
 import static android.window.TransitionInfo.FLAG_IS_DISPLAY;
 
@@ -840,8 +841,11 @@
                 && change.getTaskInfo().getWindowingMode() == WINDOWING_MODE_PINNED
                 && !change.getContainer().equals(mCurrentPipTaskToken)) {
             // We support TRANSIT_PIP type (from RootWindowContainer) or TRANSIT_OPEN (from apps
-            // that enter PiP instantly on opening, mostly from CTS/Flicker tests)
-            if (transitType == TRANSIT_PIP || transitType == TRANSIT_OPEN) {
+            // that enter PiP instantly on opening, mostly from CTS/Flicker tests).
+            // TRANSIT_TO_FRONT, though uncommon with triggering PiP, should semantically also
+            // be allowed to animate if the task in question is pinned already - see b/308054074.
+            if (transitType == TRANSIT_PIP || transitType == TRANSIT_OPEN
+                    || transitType == TRANSIT_TO_FRONT) {
                 return true;
             }
             // This can happen if the request to enter PIP happens when we are collecting for
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java
index df67707..ef46843 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java
@@ -37,7 +37,6 @@
 import com.android.internal.protolog.common.ProtoLog;
 import com.android.wm.shell.R;
 import com.android.wm.shell.animation.FloatProperties;
-import com.android.wm.shell.animation.PhysicsAnimator;
 import com.android.wm.shell.common.FloatingContentCoordinator;
 import com.android.wm.shell.common.magnetictarget.MagnetizedObject;
 import com.android.wm.shell.common.pip.PipAppOpsListener;
@@ -47,6 +46,7 @@
 import com.android.wm.shell.pip.PipTaskOrganizer;
 import com.android.wm.shell.pip.PipTransitionController;
 import com.android.wm.shell.protolog.ShellProtoLogGroup;
+import com.android.wm.shell.shared.animation.PhysicsAnimator;
 
 import kotlin.Unit;
 import kotlin.jvm.functions.Function0;
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 4c69cc3..1e18b8c 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
@@ -245,9 +245,9 @@
             Rect destinationBounds, SurfaceControl overlay, Rect appBounds) {
         ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
                 "onSwipePipToHomeAnimationStart: %s", componentName);
-        mPipScheduler.setInSwipePipToHomeTransition(true);
+        mPipScheduler.onSwipePipToHomeAnimationStart(taskId, componentName, destinationBounds,
+                overlay, appBounds);
         mPipRecentsAnimationListener.onPipAnimationStarted();
-        // TODO: cache the overlay if provided for reparenting later.
     }
 
     //
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipDismissTargetHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipDismissTargetHandler.java
new file mode 100644
index 0000000..e7e7970
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipDismissTargetHandler.java
@@ -0,0 +1,311 @@
+/*
+ * 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.wm.shell.pip2.phone;
+
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.PixelFormat;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.view.MotionEvent;
+import android.view.SurfaceControl;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.view.WindowInsets;
+import android.view.WindowManager;
+
+import androidx.annotation.NonNull;
+
+import com.android.wm.shell.R;
+import com.android.wm.shell.bubbles.DismissViewUtils;
+import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.common.bubbles.DismissCircleView;
+import com.android.wm.shell.common.bubbles.DismissView;
+import com.android.wm.shell.common.magnetictarget.MagnetizedObject;
+import com.android.wm.shell.common.pip.PipUiEventLogger;
+
+import kotlin.Unit;
+
+/**
+ * Handler of all Magnetized Object related code for PiP.
+ */
+public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListener {
+
+    /* The multiplier to apply scale the target size by when applying the magnetic field radius */
+    private static final float MAGNETIC_FIELD_RADIUS_MULTIPLIER = 1.25f;
+
+    /**
+     * MagnetizedObject wrapper for PIP. This allows the magnetic target library to locate and move
+     * PIP.
+     */
+    private MagnetizedObject<Rect> mMagnetizedPip;
+
+    /**
+     * Container for the dismiss circle, so that it can be animated within the container via
+     * translation rather than within the WindowManager via slow layout animations.
+     */
+    private DismissView mTargetViewContainer;
+
+    /** Circle view used to render the dismiss target. */
+    private DismissCircleView mTargetView;
+
+    /**
+     * MagneticTarget instance wrapping the target view and allowing us to set its magnetic radius.
+     */
+    private MagnetizedObject.MagneticTarget mMagneticTarget;
+
+    // Allow dragging the PIP to a location to close it
+    private boolean mEnableDismissDragToEdge;
+
+    private int mTargetSize;
+    private int mDismissAreaHeight;
+    private float mMagneticFieldRadiusPercent = 1f;
+    private WindowInsets mWindowInsets;
+
+    private SurfaceControl mTaskLeash;
+    private boolean mHasDismissTargetSurface;
+
+    private final Context mContext;
+    private final PipMotionHelper mMotionHelper;
+    private final PipUiEventLogger mPipUiEventLogger;
+    private final WindowManager mWindowManager;
+    private final ShellExecutor mMainExecutor;
+
+    public PipDismissTargetHandler(Context context, PipUiEventLogger pipUiEventLogger,
+            PipMotionHelper motionHelper, ShellExecutor mainExecutor) {
+        mContext = context;
+        mPipUiEventLogger = pipUiEventLogger;
+        mMotionHelper = motionHelper;
+        mMainExecutor = mainExecutor;
+        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
+    }
+
+    void init() {
+        Resources res = mContext.getResources();
+        mEnableDismissDragToEdge = res.getBoolean(R.bool.config_pipEnableDismissDragToEdge);
+        mDismissAreaHeight = res.getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height);
+
+        if (mTargetViewContainer != null) {
+            // init can be called multiple times, remove the old one from view hierarchy first.
+            cleanUpDismissTarget();
+        }
+
+        mTargetViewContainer = new DismissView(mContext);
+        DismissViewUtils.setup(mTargetViewContainer);
+        mTargetView = mTargetViewContainer.getCircle();
+        mTargetViewContainer.setOnApplyWindowInsetsListener((view, windowInsets) -> {
+            if (!windowInsets.equals(mWindowInsets)) {
+                mWindowInsets = windowInsets;
+                updateMagneticTargetSize();
+            }
+            return windowInsets;
+        });
+
+        mMagnetizedPip = mMotionHelper.getMagnetizedPip();
+        mMagnetizedPip.clearAllTargets();
+        mMagneticTarget = mMagnetizedPip.addTarget(mTargetView, 0);
+        updateMagneticTargetSize();
+
+        mMagnetizedPip.setAnimateStuckToTarget(
+                (target, velX, velY, flung, after) -> {
+                    if (mEnableDismissDragToEdge) {
+                        mMotionHelper.animateIntoDismissTarget(target, velX, velY, flung, after);
+                    }
+                    return Unit.INSTANCE;
+                });
+        mMagnetizedPip.setMagnetListener(new MagnetizedObject.MagnetListener() {
+            @Override
+            public void onStuckToTarget(@NonNull MagnetizedObject.MagneticTarget target,
+                    @NonNull MagnetizedObject<?> draggedObject) {
+                // Show the dismiss target, in case the initial touch event occurred within
+                // the magnetic field radius.
+                if (mEnableDismissDragToEdge) {
+                    showDismissTargetMaybe();
+                }
+            }
+
+            @Override
+            public void onUnstuckFromTarget(@NonNull MagnetizedObject.MagneticTarget target,
+                    @NonNull MagnetizedObject<?> draggedObject,
+                    float velX, float velY, boolean wasFlungOut) {
+                if (wasFlungOut) {
+                    mMotionHelper.flingToSnapTarget(velX, velY, null /* endAction */);
+                    hideDismissTargetMaybe();
+                } else {
+                    mMotionHelper.setSpringingToTouch(true);
+                }
+            }
+
+            @Override
+            public void onReleasedInTarget(@NonNull MagnetizedObject.MagneticTarget target,
+                    @NonNull MagnetizedObject<?> draggedObject) {
+                if (mEnableDismissDragToEdge) {
+                    mMainExecutor.executeDelayed(() -> {
+                        mMotionHelper.notifyDismissalPending();
+                        mMotionHelper.animateDismiss();
+                        hideDismissTargetMaybe();
+
+                        mPipUiEventLogger.log(
+                                PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_DRAG_TO_REMOVE);
+                    }, 0);
+                }
+            }
+        });
+
+    }
+
+    @Override
+    public boolean onPreDraw() {
+        mTargetViewContainer.getViewTreeObserver().removeOnPreDrawListener(this);
+        mHasDismissTargetSurface = true;
+        updateDismissTargetLayer();
+        return true;
+    }
+
+    /**
+     * Potentially start consuming future motion events if PiP is currently near the magnetized
+     * object.
+     */
+    public boolean maybeConsumeMotionEvent(MotionEvent ev) {
+        return mMagnetizedPip.maybeConsumeMotionEvent(ev);
+    }
+
+    /**
+     * Update the magnet size.
+     */
+    public void updateMagneticTargetSize() {
+        if (mTargetView == null) {
+            return;
+        }
+        if (mTargetViewContainer != null) {
+            mTargetViewContainer.updateResources();
+        }
+
+        final Resources res = mContext.getResources();
+        mTargetSize = res.getDimensionPixelSize(R.dimen.dismiss_circle_size);
+        mDismissAreaHeight = res.getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height);
+
+        // Set the magnetic field radius equal to the target size from the center of the target
+        setMagneticFieldRadiusPercent(mMagneticFieldRadiusPercent);
+    }
+
+    /**
+     * Increase or decrease the field radius of the magnet object, e.g. with larger percent,
+     * PiP will magnetize to the field sooner.
+     */
+    public void setMagneticFieldRadiusPercent(float percent) {
+        mMagneticFieldRadiusPercent = percent;
+        mMagneticTarget.setMagneticFieldRadiusPx((int) (mMagneticFieldRadiusPercent * mTargetSize
+                        * MAGNETIC_FIELD_RADIUS_MULTIPLIER));
+    }
+
+    public void setTaskLeash(SurfaceControl taskLeash) {
+        mTaskLeash = taskLeash;
+    }
+
+    private void updateDismissTargetLayer() {
+        if (!mHasDismissTargetSurface || mTaskLeash == null) {
+            // No dismiss target surface, can just return
+            return;
+        }
+
+        final SurfaceControl targetViewLeash =
+                mTargetViewContainer.getViewRootImpl().getSurfaceControl();
+        if (!targetViewLeash.isValid()) {
+            // The surface of mTargetViewContainer is somehow not ready, bail early
+            return;
+        }
+
+        // Put the dismiss target behind the task
+        SurfaceControl.Transaction t = new SurfaceControl.Transaction();
+        t.setRelativeLayer(targetViewLeash, mTaskLeash, -1);
+        t.apply();
+    }
+
+    /** Adds the magnetic target view to the WindowManager so it's ready to be animated in. */
+    public void createOrUpdateDismissTarget() {
+        if (mTargetViewContainer.getParent() == null) {
+            mTargetViewContainer.cancelAnimators();
+
+            mTargetViewContainer.setVisibility(View.INVISIBLE);
+            mTargetViewContainer.getViewTreeObserver().removeOnPreDrawListener(this);
+            mHasDismissTargetSurface = false;
+
+            mWindowManager.addView(mTargetViewContainer, getDismissTargetLayoutParams());
+        } else {
+            mWindowManager.updateViewLayout(mTargetViewContainer, getDismissTargetLayoutParams());
+        }
+    }
+
+    /** Returns layout params for the dismiss target, using the latest display metrics. */
+    private WindowManager.LayoutParams getDismissTargetLayoutParams() {
+        final Point windowSize = new Point();
+        mWindowManager.getDefaultDisplay().getRealSize(windowSize);
+        int height = Math.min(windowSize.y, mDismissAreaHeight);
+        final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+                WindowManager.LayoutParams.MATCH_PARENT,
+                height,
+                0, windowSize.y - height,
+                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
+                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+                        | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
+                        | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
+                PixelFormat.TRANSLUCENT);
+
+        lp.setTitle("pip-dismiss-overlay");
+        lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
+        lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+        lp.setFitInsetsTypes(0 /* types */);
+
+        return lp;
+    }
+
+    /** Makes the dismiss target visible and animates it in, if it isn't already visible. */
+    public void showDismissTargetMaybe() {
+        if (!mEnableDismissDragToEdge) {
+            return;
+        }
+
+        createOrUpdateDismissTarget();
+
+        if (mTargetViewContainer.getVisibility() != View.VISIBLE) {
+            mTargetViewContainer.getViewTreeObserver().addOnPreDrawListener(this);
+        }
+        // always invoke show, since the target might still be VISIBLE while playing hide animation,
+        // so we want to ensure it will show back again
+        mTargetViewContainer.show();
+    }
+
+    /** Animates the magnetic dismiss target out and then sets it to GONE. */
+    public void hideDismissTargetMaybe() {
+        if (!mEnableDismissDragToEdge) {
+            return;
+        }
+        mTargetViewContainer.hide();
+    }
+
+    /**
+     * Removes the dismiss target and cancels any pending callbacks to show it.
+     */
+    public void cleanUpDismissTarget() {
+        if (mTargetViewContainer.getParent() != null) {
+            mWindowManager.removeViewImmediate(mTargetViewContainer);
+        }
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipInputConsumer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipInputConsumer.java
new file mode 100644
index 0000000..03547a5
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipInputConsumer.java
@@ -0,0 +1,188 @@
+/*
+ * 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.wm.shell.pip2.phone;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.view.BatchedInputEventReceiver;
+import android.view.Choreographer;
+import android.view.IWindowManager;
+import android.view.InputChannel;
+import android.view.InputEvent;
+
+import com.android.internal.protolog.common.ProtoLog;
+import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.protolog.ShellProtoLogGroup;
+
+import java.io.PrintWriter;
+
+/**
+ * Manages the input consumer that allows the Shell to directly receive input.
+ */
+public class PipInputConsumer {
+
+    private static final String TAG = PipInputConsumer.class.getSimpleName();
+
+    /**
+     * Listener interface for callers to subscribe to input events.
+     */
+    public interface InputListener {
+        /** Handles any input event. */
+        boolean onInputEvent(InputEvent ev);
+    }
+
+    /**
+     * Listener interface for callers to learn when this class is registered or unregistered with
+     * window manager
+     */
+    private interface RegistrationListener {
+        void onRegistrationChanged(boolean isRegistered);
+    }
+
+    /**
+     * Input handler used for the input consumer. Input events are batched and consumed with the
+     * SurfaceFlinger vsync.
+     */
+    private final class InputEventReceiver extends BatchedInputEventReceiver {
+
+        InputEventReceiver(InputChannel inputChannel, Looper looper,
+                Choreographer choreographer) {
+            super(inputChannel, looper, choreographer);
+        }
+
+        @Override
+        public void onInputEvent(InputEvent event) {
+            boolean handled = true;
+            try {
+                if (mListener != null) {
+                    handled = mListener.onInputEvent(event);
+                }
+            } finally {
+                finishInputEvent(event, handled);
+            }
+        }
+    }
+
+    private final IWindowManager mWindowManager;
+    private final IBinder mToken;
+    private final String mName;
+    private final ShellExecutor mMainExecutor;
+
+    private InputEventReceiver mInputEventReceiver;
+    private InputListener mListener;
+    private RegistrationListener mRegistrationListener;
+
+    /**
+     * @param name the name corresponding to the input consumer that is defined in the system.
+     */
+    public PipInputConsumer(IWindowManager windowManager, String name,
+            ShellExecutor mainExecutor) {
+        mWindowManager = windowManager;
+        mToken = new Binder();
+        mName = name;
+        mMainExecutor = mainExecutor;
+    }
+
+    /**
+     * Sets the input listener.
+     */
+    public void setInputListener(InputListener listener) {
+        mListener = listener;
+    }
+
+    /**
+     * Sets the registration listener.
+     */
+    public void setRegistrationListener(RegistrationListener listener) {
+        mRegistrationListener = listener;
+        mMainExecutor.execute(() -> {
+            if (mRegistrationListener != null) {
+                mRegistrationListener.onRegistrationChanged(mInputEventReceiver != null);
+            }
+        });
+    }
+
+    /**
+     * Check if the InputConsumer is currently registered with WindowManager
+     *
+     * @return {@code true} if registered, {@code false} if not.
+     */
+    public boolean isRegistered() {
+        return mInputEventReceiver != null;
+    }
+
+    /**
+     * Registers the input consumer.
+     */
+    public void registerInputConsumer() {
+        if (mInputEventReceiver != null) {
+            return;
+        }
+        final InputChannel inputChannel = new InputChannel();
+        try {
+            // TODO(b/113087003): Support Picture-in-picture in multi-display.
+            mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY);
+            mWindowManager.createInputConsumer(mToken, mName, DEFAULT_DISPLAY, inputChannel);
+        } catch (RemoteException e) {
+            ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: Failed to create input consumer, %s", TAG, e);
+        }
+        mMainExecutor.execute(() -> {
+            mInputEventReceiver = new InputEventReceiver(inputChannel,
+                Looper.myLooper(), Choreographer.getInstance());
+            if (mRegistrationListener != null) {
+                mRegistrationListener.onRegistrationChanged(true /* isRegistered */);
+            }
+        });
+    }
+
+    /**
+     * Unregisters the input consumer.
+     */
+    public void unregisterInputConsumer() {
+        if (mInputEventReceiver == null) {
+            return;
+        }
+        try {
+            // TODO(b/113087003): Support Picture-in-picture in multi-display.
+            mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY);
+        } catch (RemoteException e) {
+            ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: Failed to destroy input consumer, %s", TAG, e);
+        }
+        mInputEventReceiver.dispose();
+        mInputEventReceiver = null;
+        mMainExecutor.execute(() -> {
+            if (mRegistrationListener != null) {
+                mRegistrationListener.onRegistrationChanged(false /* isRegistered */);
+            }
+        });
+    }
+
+    /**
+     * Dumps the {@link PipInputConsumer} state.
+     */
+    public void dump(PrintWriter pw, String prefix) {
+        final String innerPrefix = prefix + "  ";
+        pw.println(prefix + TAG);
+        pw.println(innerPrefix + "registered=" + (mInputEventReceiver != null));
+    }
+}
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
new file mode 100644
index 0000000..619bed4
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java
@@ -0,0 +1,719 @@
+/*
+ * 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.wm.shell.pip2.phone;
+
+import static androidx.dynamicanimation.animation.SpringForce.DAMPING_RATIO_NO_BOUNCY;
+import static androidx.dynamicanimation.animation.SpringForce.STIFFNESS_LOW;
+import static androidx.dynamicanimation.animation.SpringForce.STIFFNESS_MEDIUM;
+
+import static com.android.wm.shell.common.pip.PipBoundsState.STASH_TYPE_LEFT;
+import static com.android.wm.shell.common.pip.PipBoundsState.STASH_TYPE_NONE;
+import static com.android.wm.shell.common.pip.PipBoundsState.STASH_TYPE_RIGHT;
+import static com.android.wm.shell.pip2.phone.PipMenuView.ANIM_TYPE_DISMISS;
+import static com.android.wm.shell.pip2.phone.PipMenuView.ANIM_TYPE_NONE;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.PointF;
+import android.graphics.Rect;
+import android.os.Debug;
+
+import com.android.internal.protolog.common.ProtoLog;
+import com.android.wm.shell.R;
+import com.android.wm.shell.animation.FloatProperties;
+import com.android.wm.shell.common.FloatingContentCoordinator;
+import com.android.wm.shell.common.magnetictarget.MagnetizedObject;
+import com.android.wm.shell.common.pip.PipAppOpsListener;
+import com.android.wm.shell.common.pip.PipBoundsState;
+import com.android.wm.shell.common.pip.PipPerfHintController;
+import com.android.wm.shell.common.pip.PipSnapAlgorithm;
+import com.android.wm.shell.protolog.ShellProtoLogGroup;
+import com.android.wm.shell.shared.animation.PhysicsAnimator;
+
+import kotlin.Unit;
+import kotlin.jvm.functions.Function0;
+
+import java.util.Optional;
+import java.util.function.Consumer;
+
+/**
+ * A helper to animate and manipulate the PiP.
+ */
+public class PipMotionHelper implements PipAppOpsListener.Callback,
+        FloatingContentCoordinator.FloatingContent {
+    private static final String TAG = "PipMotionHelper";
+    private static final boolean DEBUG = false;
+
+    private static final int SHRINK_STACK_FROM_MENU_DURATION = 250;
+    private static final int EXPAND_STACK_TO_MENU_DURATION = 250;
+    private static final int UNSTASH_DURATION = 250;
+    private static final int LEAVE_PIP_DURATION = 300;
+    private static final int SHIFT_DURATION = 300;
+
+    /** Friction to use for PIP when it moves via physics fling animations. */
+    private static final float DEFAULT_FRICTION = 1.9f;
+    /** How much of the dismiss circle size to use when scaling down PIP. **/
+    private static final float DISMISS_CIRCLE_PERCENT = 0.85f;
+
+    private final Context mContext;
+    private @NonNull PipBoundsState mPipBoundsState;
+
+    private PhonePipMenuController mMenuController;
+    private PipSnapAlgorithm mSnapAlgorithm;
+
+    /** The region that all of PIP must stay within. */
+    private final Rect mFloatingAllowedArea = new Rect();
+
+    /** Coordinator instance for resolving conflicts with other floating content. */
+    private FloatingContentCoordinator mFloatingContentCoordinator;
+
+    @Nullable private final PipPerfHintController mPipPerfHintController;
+    @Nullable private PipPerfHintController.PipHighPerfSession mPipHighPerfSession;
+
+    /**
+     * PhysicsAnimator instance for animating {@link PipBoundsState#getMotionBoundsState()}
+     * using physics animations.
+     */
+    private PhysicsAnimator<Rect> mTemporaryBoundsPhysicsAnimator;
+
+    private MagnetizedObject<Rect> mMagnetizedPip;
+
+    /**
+     * Update listener that resizes the PIP to {@link PipBoundsState#getMotionBoundsState()}.
+     */
+    private final PhysicsAnimator.UpdateListener<Rect> mResizePipUpdateListener;
+
+    /** FlingConfig instances provided to PhysicsAnimator for fling gestures. */
+    private PhysicsAnimator.FlingConfig mFlingConfigX;
+    private PhysicsAnimator.FlingConfig mFlingConfigY;
+    /** FlingConfig instances provided to PhysicsAnimator for stashing. */
+    private PhysicsAnimator.FlingConfig mStashConfigX;
+
+    /** SpringConfig to use for fling-then-spring animations. */
+    private final PhysicsAnimator.SpringConfig mSpringConfig =
+            new PhysicsAnimator.SpringConfig(700f, DAMPING_RATIO_NO_BOUNCY);
+
+    /** SpringConfig used for animating into the dismiss region, matches the one in
+     * {@link MagnetizedObject}. */
+    private final PhysicsAnimator.SpringConfig mAnimateToDismissSpringConfig =
+            new PhysicsAnimator.SpringConfig(STIFFNESS_MEDIUM, DAMPING_RATIO_NO_BOUNCY);
+
+    /** SpringConfig used for animating the pip to catch up to the finger once it leaves the dismiss
+     * drag region. */
+    private final PhysicsAnimator.SpringConfig mCatchUpSpringConfig =
+            new PhysicsAnimator.SpringConfig(5000f, DAMPING_RATIO_NO_BOUNCY);
+
+    /** SpringConfig to use for springing PIP away from conflicting floating content. */
+    private final PhysicsAnimator.SpringConfig mConflictResolutionSpringConfig =
+            new PhysicsAnimator.SpringConfig(STIFFNESS_LOW, DAMPING_RATIO_NO_BOUNCY);
+
+    private final Consumer<Rect> mUpdateBoundsCallback = (Rect newBounds) -> {
+        if (mPipBoundsState.getBounds().equals(newBounds)) {
+            return;
+        }
+
+        mMenuController.updateMenuLayout(newBounds);
+        mPipBoundsState.setBounds(newBounds);
+    };
+
+    /**
+     * Whether we're springing to the touch event location (vs. moving it to that position
+     * instantly). We spring-to-touch after PIP is dragged out of the magnetic target, since it was
+     * 'stuck' in the target and needs to catch up to the touch location.
+     */
+    private boolean mSpringingToTouch = false;
+
+    /**
+     * Whether PIP was released in the dismiss target, and will be animated out and dismissed
+     * shortly.
+     */
+    private boolean mDismissalPending = false;
+
+    /**
+     * Gets set in {@link #animateToExpandedState(Rect, Rect, Rect, Runnable)}, this callback is
+     * used to show menu activity when the expand animation is completed.
+     */
+    private Runnable mPostPipTransitionCallback;
+
+    public PipMotionHelper(Context context, @NonNull PipBoundsState pipBoundsState,
+            PhonePipMenuController menuController, PipSnapAlgorithm snapAlgorithm,
+            FloatingContentCoordinator floatingContentCoordinator,
+            Optional<PipPerfHintController> pipPerfHintControllerOptional) {
+        mContext = context;
+        mPipBoundsState = pipBoundsState;
+        mMenuController = menuController;
+        mSnapAlgorithm = snapAlgorithm;
+        mFloatingContentCoordinator = floatingContentCoordinator;
+        mPipPerfHintController = pipPerfHintControllerOptional.orElse(null);
+        mResizePipUpdateListener = (target, values) -> {
+            if (mPipBoundsState.getMotionBoundsState().isInMotion()) {
+                /*
+                mPipTaskOrganizer.scheduleUserResizePip(getBounds(),
+                        mPipBoundsState.getMotionBoundsState().getBoundsInMotion(), null);
+                 */
+            }
+        };
+    }
+
+    void init() {
+        mTemporaryBoundsPhysicsAnimator = PhysicsAnimator.getInstance(
+                mPipBoundsState.getMotionBoundsState().getBoundsInMotion());
+    }
+
+    @NonNull
+    @Override
+    public Rect getFloatingBoundsOnScreen() {
+        return !mPipBoundsState.getMotionBoundsState().getAnimatingToBounds().isEmpty()
+                ? mPipBoundsState.getMotionBoundsState().getAnimatingToBounds() : getBounds();
+    }
+
+    @NonNull
+    @Override
+    public Rect getAllowedFloatingBoundsRegion() {
+        return mFloatingAllowedArea;
+    }
+
+    @Override
+    public void moveToBounds(@NonNull Rect bounds) {
+        animateToBounds(bounds, mConflictResolutionSpringConfig);
+    }
+
+    /**
+     * Synchronizes the current bounds with the pinned stack, cancelling any ongoing animations.
+     */
+    void synchronizePinnedStackBounds() {
+        cancelPhysicsAnimation();
+        mPipBoundsState.getMotionBoundsState().onAllAnimationsEnded();
+
+        /*
+        if (mPipTaskOrganizer.isInPip()) {
+            mFloatingContentCoordinator.onContentMoved(this);
+        }
+         */
+    }
+
+    /**
+     * Tries to move the pinned stack to the given {@param bounds}.
+     */
+    void movePip(Rect toBounds) {
+        movePip(toBounds, false /* isDragging */);
+    }
+
+    /**
+     * Tries to move the pinned stack to the given {@param bounds}.
+     *
+     * @param isDragging Whether this movement is the result of a drag touch gesture. If so, we
+     *                   won't notify the floating content coordinator of this move, since that will
+     *                   happen when the gesture ends.
+     */
+    void movePip(Rect toBounds, boolean isDragging) {
+        if (!isDragging) {
+            mFloatingContentCoordinator.onContentMoved(this);
+        }
+
+        if (!mSpringingToTouch) {
+            // If we are moving PIP directly to the touch event locations, cancel any animations and
+            // move PIP to the given bounds.
+            cancelPhysicsAnimation();
+
+            if (!isDragging) {
+                resizePipUnchecked(toBounds);
+                mPipBoundsState.setBounds(toBounds);
+            } else {
+                mPipBoundsState.getMotionBoundsState().setBoundsInMotion(toBounds);
+                /*
+                mPipTaskOrganizer.scheduleUserResizePip(getBounds(), toBounds,
+                        (Rect newBounds) -> {
+                                mMenuController.updateMenuLayout(newBounds);
+                        });
+                 */
+            }
+        } else {
+            // If PIP is 'catching up' after being stuck in the dismiss target, update the animation
+            // to spring towards the new touch location.
+            mTemporaryBoundsPhysicsAnimator
+                    .spring(FloatProperties.RECT_WIDTH, getBounds().width(), mCatchUpSpringConfig)
+                    .spring(FloatProperties.RECT_HEIGHT, getBounds().height(), mCatchUpSpringConfig)
+                    .spring(FloatProperties.RECT_X, toBounds.left, mCatchUpSpringConfig)
+                    .spring(FloatProperties.RECT_Y, toBounds.top, mCatchUpSpringConfig);
+
+            startBoundsAnimator(toBounds.left /* toX */, toBounds.top /* toY */);
+        }
+    }
+
+    /** Animates the PIP into the dismiss target, scaling it down. */
+    void animateIntoDismissTarget(
+            MagnetizedObject.MagneticTarget target,
+            float velX, float velY,
+            boolean flung, Function0<Unit> after) {
+        final PointF targetCenter = target.getCenterOnScreen();
+
+        // PIP should fit in the circle
+        final float dismissCircleSize = mContext.getResources().getDimensionPixelSize(
+                R.dimen.dismiss_circle_size);
+
+        final float width = getBounds().width();
+        final float height = getBounds().height();
+        final float ratio = width / height;
+
+        // Width should be a little smaller than the circle size.
+        final float desiredWidth = dismissCircleSize * DISMISS_CIRCLE_PERCENT;
+        final float desiredHeight = desiredWidth / ratio;
+        final float destinationX = targetCenter.x - (desiredWidth / 2f);
+        final float destinationY = targetCenter.y - (desiredHeight / 2f);
+
+        // If we're already in the dismiss target area, then there won't be a move to set the
+        // temporary bounds, so just initialize it to the current bounds.
+        if (!mPipBoundsState.getMotionBoundsState().isInMotion()) {
+            mPipBoundsState.getMotionBoundsState().setBoundsInMotion(getBounds());
+        }
+        mTemporaryBoundsPhysicsAnimator
+                .spring(FloatProperties.RECT_X, destinationX, velX, mAnimateToDismissSpringConfig)
+                .spring(FloatProperties.RECT_Y, destinationY, velY, mAnimateToDismissSpringConfig)
+                .spring(FloatProperties.RECT_WIDTH, desiredWidth, mAnimateToDismissSpringConfig)
+                .spring(FloatProperties.RECT_HEIGHT, desiredHeight, mAnimateToDismissSpringConfig)
+                .withEndActions(after);
+
+        startBoundsAnimator(destinationX, destinationY);
+    }
+
+    /** Set whether we're springing-to-touch to catch up after being stuck in the dismiss target. */
+    void setSpringingToTouch(boolean springingToTouch) {
+        mSpringingToTouch = springingToTouch;
+    }
+
+    /**
+     * Resizes the pinned stack back to unknown windowing mode, which could be freeform or
+     *      * fullscreen depending on the display area's windowing mode.
+     */
+    void expandLeavePip(boolean skipAnimation) {
+        expandLeavePip(skipAnimation, false /* enterSplit */);
+    }
+
+    /**
+     * Resizes the pinned task to split-screen mode.
+     */
+    void expandIntoSplit() {
+        expandLeavePip(false, true /* enterSplit */);
+    }
+
+    /**
+     * Resizes the pinned stack back to unknown windowing mode, which could be freeform or
+     * fullscreen depending on the display area's windowing mode.
+     */
+    private void expandLeavePip(boolean skipAnimation, boolean enterSplit) {
+        if (DEBUG) {
+            ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: exitPip: skipAnimation=%s"
+                            + " callers=\n%s", TAG, skipAnimation, Debug.getCallers(5, "    "));
+        }
+        cancelPhysicsAnimation();
+        mMenuController.hideMenu(ANIM_TYPE_NONE, false /* resize */);
+        // mPipTaskOrganizer.exitPip(skipAnimation ? 0 : LEAVE_PIP_DURATION, enterSplit);
+    }
+
+    /**
+     * Dismisses the pinned stack.
+     */
+    @Override
+    public void dismissPip() {
+        if (DEBUG) {
+            ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: removePip: callers=\n%s", TAG, Debug.getCallers(5, "    "));
+        }
+        cancelPhysicsAnimation();
+        mMenuController.hideMenu(ANIM_TYPE_DISMISS, false /* resize */);
+        // mPipTaskOrganizer.removePip();
+    }
+
+    /** Sets the movement bounds to use to constrain PIP position animations. */
+    void onMovementBoundsChanged() {
+        rebuildFlingConfigs();
+
+        // The movement bounds represent the area within which we can move PIP's top-left position.
+        // The allowed area for all of PIP is those bounds plus PIP's width and height.
+        mFloatingAllowedArea.set(mPipBoundsState.getMovementBounds());
+        mFloatingAllowedArea.right += getBounds().width();
+        mFloatingAllowedArea.bottom += getBounds().height();
+    }
+
+    /**
+     * @return the PiP bounds.
+     */
+    private Rect getBounds() {
+        return mPipBoundsState.getBounds();
+    }
+
+    /**
+     * Flings the PiP to the closest snap target.
+     */
+    void flingToSnapTarget(
+            float velocityX, float velocityY, @Nullable Runnable postBoundsUpdateCallback) {
+        movetoTarget(velocityX, velocityY, postBoundsUpdateCallback, false /* isStash */);
+    }
+
+    /**
+     * Stash PiP to the closest edge. We set velocityY to 0 to limit pure horizontal motion.
+     */
+    void stashToEdge(float velX, float velY, @Nullable Runnable postBoundsUpdateCallback) {
+        velY = mPipBoundsState.getStashedState() == STASH_TYPE_NONE ? 0 : velY;
+        movetoTarget(velX, velY, postBoundsUpdateCallback, true /* isStash */);
+    }
+
+    private void onHighPerfSessionTimeout(PipPerfHintController.PipHighPerfSession session) {}
+
+    private void cleanUpHighPerfSessionMaybe() {
+        if (mPipHighPerfSession != null) {
+            // Close the high perf session once pointer interactions are over;
+            mPipHighPerfSession.close();
+            mPipHighPerfSession = null;
+        }
+    }
+
+    private void movetoTarget(
+            float velocityX,
+            float velocityY,
+            @Nullable Runnable postBoundsUpdateCallback,
+            boolean isStash) {
+        // If we're flinging to a snap target now, we're not springing to catch up to the touch
+        // location now.
+        mSpringingToTouch = false;
+
+        mTemporaryBoundsPhysicsAnimator
+                .spring(FloatProperties.RECT_WIDTH, getBounds().width(), mSpringConfig)
+                .spring(FloatProperties.RECT_HEIGHT, getBounds().height(), mSpringConfig)
+                .flingThenSpring(
+                        FloatProperties.RECT_X, velocityX,
+                        isStash ? mStashConfigX : mFlingConfigX,
+                        mSpringConfig, true /* flingMustReachMinOrMax */)
+                .flingThenSpring(
+                        FloatProperties.RECT_Y, velocityY, mFlingConfigY, mSpringConfig);
+
+        final Rect insetBounds = mPipBoundsState.getDisplayLayout().stableInsets();
+        final float leftEdge = isStash
+                ? mPipBoundsState.getStashOffset() - mPipBoundsState.getBounds().width()
+                + insetBounds.left
+                : mPipBoundsState.getMovementBounds().left;
+        final float rightEdge = isStash
+                ?  mPipBoundsState.getDisplayBounds().right - mPipBoundsState.getStashOffset()
+                - insetBounds.right
+                : mPipBoundsState.getMovementBounds().right;
+
+        final float xEndValue = velocityX < 0 ? leftEdge : rightEdge;
+
+        final int startValueY = mPipBoundsState.getMotionBoundsState().getBoundsInMotion().top;
+        final float estimatedFlingYEndValue =
+                PhysicsAnimator.estimateFlingEndValue(startValueY, velocityY, mFlingConfigY);
+
+        startBoundsAnimator(xEndValue /* toX */, estimatedFlingYEndValue /* toY */,
+                postBoundsUpdateCallback);
+    }
+
+    /**
+     * Animates PIP to the provided bounds, using physics animations and the given spring
+     * configuration
+     */
+    void animateToBounds(Rect bounds, PhysicsAnimator.SpringConfig springConfig) {
+        if (!mTemporaryBoundsPhysicsAnimator.isRunning()) {
+            // Animate from the current bounds if we're not already animating.
+            mPipBoundsState.getMotionBoundsState().setBoundsInMotion(getBounds());
+        }
+
+        mTemporaryBoundsPhysicsAnimator
+                .spring(FloatProperties.RECT_X, bounds.left, springConfig)
+                .spring(FloatProperties.RECT_Y, bounds.top, springConfig);
+        startBoundsAnimator(bounds.left /* toX */, bounds.top /* toY */);
+    }
+
+    /**
+     * Animates the dismissal of the PiP off the edge of the screen.
+     */
+    void animateDismiss() {
+        // Animate off the bottom of the screen, then dismiss PIP.
+        mTemporaryBoundsPhysicsAnimator
+                .spring(FloatProperties.RECT_Y,
+                        mPipBoundsState.getMovementBounds().bottom + getBounds().height() * 2,
+                        0,
+                        mSpringConfig)
+                .withEndActions(this::dismissPip);
+
+        startBoundsAnimator(
+                getBounds().left /* toX */, getBounds().bottom + getBounds().height() /* toY */);
+
+        mDismissalPending = false;
+    }
+
+    /**
+     * Animates the PiP to the expanded state to show the menu.
+     */
+    float animateToExpandedState(Rect expandedBounds, Rect movementBounds,
+            Rect expandedMovementBounds, Runnable callback) {
+        float savedSnapFraction = mSnapAlgorithm.getSnapFraction(new Rect(getBounds()),
+                movementBounds);
+        mSnapAlgorithm.applySnapFraction(expandedBounds, expandedMovementBounds, savedSnapFraction);
+        mPostPipTransitionCallback = callback;
+        resizeAndAnimatePipUnchecked(expandedBounds, EXPAND_STACK_TO_MENU_DURATION);
+        return savedSnapFraction;
+    }
+
+    /**
+     * Animates the PiP from the expanded state to the normal state after the menu is hidden.
+     */
+    void animateToUnexpandedState(Rect normalBounds, float savedSnapFraction,
+            Rect normalMovementBounds, Rect currentMovementBounds, boolean immediate) {
+        if (savedSnapFraction < 0f) {
+            // If there are no saved snap fractions, then just use the current bounds
+            savedSnapFraction = mSnapAlgorithm.getSnapFraction(new Rect(getBounds()),
+                    currentMovementBounds, mPipBoundsState.getStashedState());
+        }
+
+        mSnapAlgorithm.applySnapFraction(normalBounds, normalMovementBounds, savedSnapFraction,
+                mPipBoundsState.getStashedState(), mPipBoundsState.getStashOffset(),
+                mPipBoundsState.getDisplayBounds(),
+                mPipBoundsState.getDisplayLayout().stableInsets());
+
+        if (immediate) {
+            movePip(normalBounds);
+        } else {
+            resizeAndAnimatePipUnchecked(normalBounds, SHRINK_STACK_FROM_MENU_DURATION);
+        }
+    }
+
+    /**
+     * Animates the PiP to the stashed state, choosing the closest edge.
+     */
+    void animateToStashedClosestEdge() {
+        Rect tmpBounds = new Rect();
+        final Rect insetBounds = mPipBoundsState.getDisplayLayout().stableInsets();
+        final int stashType =
+                mPipBoundsState.getBounds().left == mPipBoundsState.getMovementBounds().left
+                ? STASH_TYPE_LEFT : STASH_TYPE_RIGHT;
+        final float leftEdge = stashType == STASH_TYPE_LEFT
+                ? mPipBoundsState.getStashOffset()
+                - mPipBoundsState.getBounds().width() + insetBounds.left
+                : mPipBoundsState.getDisplayBounds().right
+                        - mPipBoundsState.getStashOffset() - insetBounds.right;
+        tmpBounds.set((int) leftEdge,
+                mPipBoundsState.getBounds().top,
+                (int) (leftEdge + mPipBoundsState.getBounds().width()),
+                mPipBoundsState.getBounds().bottom);
+        resizeAndAnimatePipUnchecked(tmpBounds, UNSTASH_DURATION);
+        mPipBoundsState.setStashed(stashType);
+    }
+
+    /**
+     * Animates the PiP from stashed state into un-stashed, popping it out from the edge.
+     */
+    void animateToUnStashedBounds(Rect unstashedBounds) {
+        resizeAndAnimatePipUnchecked(unstashedBounds, UNSTASH_DURATION);
+    }
+
+    /**
+     * Animates the PiP to offset it from the IME or shelf.
+     */
+    void animateToOffset(Rect originalBounds, int offset) {
+        if (DEBUG) {
+            ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: animateToOffset: originalBounds=%s offset=%s"
+                            + " callers=\n%s", TAG, originalBounds, offset,
+                    Debug.getCallers(5, "    "));
+        }
+        cancelPhysicsAnimation();
+        /*
+        mPipTaskOrganizer.scheduleOffsetPip(originalBounds, offset, SHIFT_DURATION,
+                mUpdateBoundsCallback);
+         */
+    }
+
+    /**
+     * Cancels all existing animations.
+     */
+    private void cancelPhysicsAnimation() {
+        mTemporaryBoundsPhysicsAnimator.cancel();
+        mPipBoundsState.getMotionBoundsState().onPhysicsAnimationEnded();
+        mSpringingToTouch = false;
+    }
+
+    /** Set new fling configs whose min/max values respect the given movement bounds. */
+    private void rebuildFlingConfigs() {
+        mFlingConfigX = new PhysicsAnimator.FlingConfig(DEFAULT_FRICTION,
+                mPipBoundsState.getMovementBounds().left,
+                mPipBoundsState.getMovementBounds().right);
+        mFlingConfigY = new PhysicsAnimator.FlingConfig(DEFAULT_FRICTION,
+                mPipBoundsState.getMovementBounds().top,
+                mPipBoundsState.getMovementBounds().bottom);
+        final Rect insetBounds = mPipBoundsState.getDisplayLayout().stableInsets();
+        mStashConfigX = new PhysicsAnimator.FlingConfig(
+                DEFAULT_FRICTION,
+                mPipBoundsState.getStashOffset() - mPipBoundsState.getBounds().width()
+                        + insetBounds.left,
+                mPipBoundsState.getDisplayBounds().right - mPipBoundsState.getStashOffset()
+                        - insetBounds.right);
+    }
+
+    private void startBoundsAnimator(float toX, float toY) {
+        startBoundsAnimator(toX, toY, null /* postBoundsUpdateCallback */);
+    }
+
+    /**
+     * Starts the physics animator which will update the animated PIP bounds using physics
+     * animations, as well as the TimeAnimator which will apply those bounds to PIP.
+     *
+     * This will also add end actions to the bounds animator that cancel the TimeAnimator and update
+     * the 'real' bounds to equal the final animated bounds.
+     *
+     * If one wishes to supply a callback after all the 'real' bounds update has happened,
+     * pass @param postBoundsUpdateCallback.
+     */
+    private void startBoundsAnimator(float toX, float toY, Runnable postBoundsUpdateCallback) {
+        if (!mSpringingToTouch) {
+            cancelPhysicsAnimation();
+        }
+
+        setAnimatingToBounds(new Rect(
+                (int) toX,
+                (int) toY,
+                (int) toX + getBounds().width(),
+                (int) toY + getBounds().height()));
+
+        if (!mTemporaryBoundsPhysicsAnimator.isRunning()) {
+            if (mPipPerfHintController != null) {
+                // Start a high perf session with a timeout callback.
+                mPipHighPerfSession = mPipPerfHintController.startSession(
+                        this::onHighPerfSessionTimeout, "startBoundsAnimator");
+            }
+            if (postBoundsUpdateCallback != null) {
+                mTemporaryBoundsPhysicsAnimator
+                        .addUpdateListener(mResizePipUpdateListener)
+                        .withEndActions(this::onBoundsPhysicsAnimationEnd,
+                                postBoundsUpdateCallback);
+            } else {
+                mTemporaryBoundsPhysicsAnimator
+                        .addUpdateListener(mResizePipUpdateListener)
+                        .withEndActions(this::onBoundsPhysicsAnimationEnd);
+            }
+        }
+
+        mTemporaryBoundsPhysicsAnimator.start();
+    }
+
+    /**
+     * Notify that PIP was released in the dismiss target and will be animated out and dismissed
+     * shortly.
+     */
+    void notifyDismissalPending() {
+        mDismissalPending = true;
+    }
+
+    private void onBoundsPhysicsAnimationEnd() {
+        // The physics animation ended, though we may not necessarily be done animating, such as
+        // when we're still dragging after moving out of the magnetic target.
+        if (!mDismissalPending
+                && !mSpringingToTouch
+                && !mMagnetizedPip.getObjectStuckToTarget()) {
+            // All motion operations have actually finished.
+            mPipBoundsState.setBounds(
+                    mPipBoundsState.getMotionBoundsState().getBoundsInMotion());
+            mPipBoundsState.getMotionBoundsState().onAllAnimationsEnded();
+            if (!mDismissalPending) {
+                // do not schedule resize if PiP is dismissing, which may cause app re-open to
+                // mBounds instead of its normal bounds.
+                // mPipTaskOrganizer.scheduleFinishResizePip(getBounds());
+            }
+        }
+        mPipBoundsState.getMotionBoundsState().onPhysicsAnimationEnded();
+        mSpringingToTouch = false;
+        mDismissalPending = false;
+        cleanUpHighPerfSessionMaybe();
+    }
+
+    /**
+     * Notifies the floating coordinator that we're moving, and sets the animating to bounds so
+     * we return these bounds from
+     * {@link FloatingContentCoordinator.FloatingContent#getFloatingBoundsOnScreen()}.
+     */
+    private void setAnimatingToBounds(Rect bounds) {
+        mPipBoundsState.getMotionBoundsState().setAnimatingToBounds(bounds);
+        mFloatingContentCoordinator.onContentMoved(this);
+    }
+
+    /**
+     * Directly resizes the PiP to the given {@param bounds}.
+     */
+    private void resizePipUnchecked(Rect toBounds) {
+        if (DEBUG) {
+            ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: resizePipUnchecked: toBounds=%s"
+                            + " callers=\n%s", TAG, toBounds, Debug.getCallers(5, "    "));
+        }
+        if (!toBounds.equals(getBounds())) {
+            // mPipTaskOrganizer.scheduleResizePip(toBounds, mUpdateBoundsCallback);
+        }
+    }
+
+    /**
+     * Directly resizes the PiP to the given {@param bounds}.
+     */
+    private void resizeAndAnimatePipUnchecked(Rect toBounds, int duration) {
+        if (DEBUG) {
+            ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: resizeAndAnimatePipUnchecked: toBounds=%s"
+                            + " duration=%s callers=\n%s", TAG, toBounds, duration,
+                    Debug.getCallers(5, "    "));
+        }
+
+        // Intentionally resize here even if the current bounds match the destination bounds.
+        // This is so all the proper callbacks are performed.
+
+        // mPipTaskOrganizer.scheduleAnimateResizePip(toBounds, duration,
+        //         TRANSITION_DIRECTION_EXPAND_OR_UNEXPAND, null /* updateBoundsCallback */);
+        // setAnimatingToBounds(toBounds);
+    }
+
+    /**
+     * Returns a MagnetizedObject wrapper for PIP's animated bounds. This is provided to the
+     * magnetic dismiss target so it can calculate PIP's size and position.
+     */
+    MagnetizedObject<Rect> getMagnetizedPip() {
+        if (mMagnetizedPip == null) {
+            mMagnetizedPip = new MagnetizedObject<Rect>(
+                    mContext, mPipBoundsState.getMotionBoundsState().getBoundsInMotion(),
+                    FloatProperties.RECT_X, FloatProperties.RECT_Y) {
+                @Override
+                public float getWidth(@NonNull Rect animatedPipBounds) {
+                    return animatedPipBounds.width();
+                }
+
+                @Override
+                public float getHeight(@NonNull Rect animatedPipBounds) {
+                    return animatedPipBounds.height();
+                }
+
+                @Override
+                public void getLocationOnScreen(
+                        @NonNull Rect animatedPipBounds, @NonNull int[] loc) {
+                    loc[0] = animatedPipBounds.left;
+                    loc[1] = animatedPipBounds.top;
+                }
+            };
+            mMagnetizedPip.setFlingToTargetEnabled(false);
+        }
+
+        return mMagnetizedPip;
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipResizeGestureHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipResizeGestureHandler.java
new file mode 100644
index 0000000..04cf350
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipResizeGestureHandler.java
@@ -0,0 +1,538 @@
+/*
+ * 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.wm.shell.pip2.phone;
+
+import static com.android.internal.policy.TaskResizingAlgorithm.CTRL_NONE;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Point;
+import android.graphics.PointF;
+import android.graphics.Rect;
+import android.hardware.input.InputManager;
+import android.os.Looper;
+import android.view.BatchedInputEventReceiver;
+import android.view.Choreographer;
+import android.view.InputChannel;
+import android.view.InputEvent;
+import android.view.InputEventReceiver;
+import android.view.InputMonitor;
+import android.view.MotionEvent;
+import android.view.ViewConfiguration;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.wm.shell.R;
+import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.common.pip.PipBoundsAlgorithm;
+import com.android.wm.shell.common.pip.PipBoundsState;
+import com.android.wm.shell.common.pip.PipPerfHintController;
+import com.android.wm.shell.common.pip.PipPinchResizingAlgorithm;
+import com.android.wm.shell.common.pip.PipUiEventLogger;
+
+import java.io.PrintWriter;
+import java.util.function.Consumer;
+
+/**
+ * Helper on top of PipTouchHandler that handles inputs OUTSIDE of the PIP window, which is used to
+ * trigger dynamic resize.
+ */
+public class PipResizeGestureHandler {
+
+    private static final String TAG = "PipResizeGestureHandler";
+    private static final int PINCH_RESIZE_SNAP_DURATION = 250;
+    private static final float PINCH_RESIZE_AUTO_MAX_RATIO = 0.9f;
+
+    private final Context mContext;
+    private final PipBoundsAlgorithm mPipBoundsAlgorithm;
+    private final PipBoundsState mPipBoundsState;
+    private final PipTouchState mPipTouchState;
+    private final PhonePipMenuController mPhonePipMenuController;
+    private final PipUiEventLogger mPipUiEventLogger;
+    private final PipPinchResizingAlgorithm mPinchResizingAlgorithm;
+    private final int mDisplayId;
+    private final ShellExecutor mMainExecutor;
+
+    private final PointF mDownPoint = new PointF();
+    private final PointF mDownSecondPoint = new PointF();
+    private final PointF mLastPoint = new PointF();
+    private final PointF mLastSecondPoint = new PointF();
+    private final Point mMaxSize = new Point();
+    private final Point mMinSize = new Point();
+    private final Rect mLastResizeBounds = new Rect();
+    private final Rect mUserResizeBounds = new Rect();
+    private final Rect mDownBounds = new Rect();
+    private final Runnable mUpdateMovementBoundsRunnable;
+    private final Consumer<Rect> mUpdateResizeBoundsCallback;
+
+    private float mTouchSlop;
+
+    private boolean mAllowGesture;
+    private boolean mIsAttached;
+    private boolean mIsEnabled;
+    private boolean mEnablePinchResize;
+    private boolean mIsSysUiStateValid;
+    private boolean mThresholdCrossed;
+    private boolean mOngoingPinchToResize = false;
+    private float mAngle = 0;
+    int mFirstIndex = -1;
+    int mSecondIndex = -1;
+
+    private InputMonitor mInputMonitor;
+    private InputEventReceiver mInputEventReceiver;
+
+    @Nullable
+    private final PipPerfHintController mPipPerfHintController;
+
+    @Nullable
+    private PipPerfHintController.PipHighPerfSession mPipHighPerfSession;
+
+    private int mCtrlType;
+    private int mOhmOffset;
+
+    public PipResizeGestureHandler(Context context, PipBoundsAlgorithm pipBoundsAlgorithm,
+            PipBoundsState pipBoundsState, PipTouchState pipTouchState,
+            Runnable updateMovementBoundsRunnable,
+            PipUiEventLogger pipUiEventLogger, PhonePipMenuController menuActivityController,
+            ShellExecutor mainExecutor, @Nullable PipPerfHintController pipPerfHintController) {
+        mContext = context;
+        mDisplayId = context.getDisplayId();
+        mMainExecutor = mainExecutor;
+        mPipPerfHintController = pipPerfHintController;
+        mPipBoundsAlgorithm = pipBoundsAlgorithm;
+        mPipBoundsState = pipBoundsState;
+        mPipTouchState = pipTouchState;
+        mUpdateMovementBoundsRunnable = updateMovementBoundsRunnable;
+        mPhonePipMenuController = menuActivityController;
+        mPipUiEventLogger = pipUiEventLogger;
+        mPinchResizingAlgorithm = new PipPinchResizingAlgorithm();
+
+        mUpdateResizeBoundsCallback = (rect) -> {
+            mUserResizeBounds.set(rect);
+            // mMotionHelper.synchronizePinnedStackBounds();
+            mUpdateMovementBoundsRunnable.run();
+            resetState();
+        };
+    }
+
+    void init() {
+        mContext.getDisplay().getRealSize(mMaxSize);
+        reloadResources();
+
+        final Resources res = mContext.getResources();
+        mEnablePinchResize = res.getBoolean(R.bool.config_pipEnablePinchResize);
+    }
+
+    void onConfigurationChanged() {
+        reloadResources();
+    }
+
+    /**
+     * Called when SysUI state changed.
+     *
+     * @param isSysUiStateValid Is SysUI valid or not.
+     */
+    public void onSystemUiStateChanged(boolean isSysUiStateValid) {
+        mIsSysUiStateValid = isSysUiStateValid;
+    }
+
+    private void reloadResources() {
+        mTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();
+    }
+
+    private void disposeInputChannel() {
+        if (mInputEventReceiver != null) {
+            mInputEventReceiver.dispose();
+            mInputEventReceiver = null;
+        }
+        if (mInputMonitor != null) {
+            mInputMonitor.dispose();
+            mInputMonitor = null;
+        }
+    }
+
+    void onActivityPinned() {
+        mIsAttached = true;
+        updateIsEnabled();
+    }
+
+    void onActivityUnpinned() {
+        mIsAttached = false;
+        mUserResizeBounds.setEmpty();
+        updateIsEnabled();
+    }
+
+    private void updateIsEnabled() {
+        boolean isEnabled = mIsAttached;
+        if (isEnabled == mIsEnabled) {
+            return;
+        }
+        mIsEnabled = isEnabled;
+        disposeInputChannel();
+
+        if (mIsEnabled) {
+            // Register input event receiver
+            mInputMonitor = mContext.getSystemService(InputManager.class).monitorGestureInput(
+                    "pip-resize", mDisplayId);
+            try {
+                mMainExecutor.executeBlocking(() -> {
+                    mInputEventReceiver = new PipResizeInputEventReceiver(
+                            mInputMonitor.getInputChannel(), Looper.myLooper());
+                });
+            } catch (InterruptedException e) {
+                throw new RuntimeException("Failed to create input event receiver", e);
+            }
+        }
+    }
+
+    @VisibleForTesting
+    void onInputEvent(InputEvent ev) {
+        if (!mEnablePinchResize) {
+            // No need to handle anything if neither form of resizing is enabled.
+            return;
+        }
+
+        if (!mPipTouchState.getAllowInputEvents()) {
+            // No need to handle anything if touches are not enabled
+            return;
+        }
+
+        // Don't allow resize when PiP is stashed.
+        if (mPipBoundsState.isStashed()) {
+            return;
+        }
+
+        if (ev instanceof MotionEvent) {
+            MotionEvent mv = (MotionEvent) ev;
+            int action = mv.getActionMasked();
+            final Rect pipBounds = mPipBoundsState.getBounds();
+            if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+                if (!pipBounds.contains((int) mv.getRawX(), (int) mv.getRawY())
+                        && mPhonePipMenuController.isMenuVisible()) {
+                    mPhonePipMenuController.hideMenu();
+                }
+            }
+
+            if (mEnablePinchResize && mOngoingPinchToResize) {
+                onPinchResize(mv);
+            }
+        }
+    }
+
+    /**
+     * Checks if there is currently an on-going gesture, either drag-resize or pinch-resize.
+     */
+    public boolean hasOngoingGesture() {
+        return mCtrlType != CTRL_NONE || mOngoingPinchToResize;
+    }
+
+    public boolean isUsingPinchToZoom() {
+        return mEnablePinchResize;
+    }
+
+    public boolean isResizing() {
+        return mAllowGesture;
+    }
+
+    boolean willStartResizeGesture(MotionEvent ev) {
+        if (isInValidSysUiState()) {
+            if (ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) {
+                if (mEnablePinchResize && ev.getPointerCount() == 2) {
+                    onPinchResize(ev);
+                    mOngoingPinchToResize = mAllowGesture;
+                    return mAllowGesture;
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean isInValidSysUiState() {
+        return mIsSysUiStateValid;
+    }
+
+    private void onHighPerfSessionTimeout(PipPerfHintController.PipHighPerfSession session) {}
+
+    private void cleanUpHighPerfSessionMaybe() {
+        if (mPipHighPerfSession != null) {
+            // Close the high perf session once pointer interactions are over;
+            mPipHighPerfSession.close();
+            mPipHighPerfSession = null;
+        }
+    }
+
+    @VisibleForTesting
+    void onPinchResize(MotionEvent ev) {
+        int action = ev.getActionMasked();
+
+        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+            mFirstIndex = -1;
+            mSecondIndex = -1;
+            mAllowGesture = false;
+            finishResize();
+            cleanUpHighPerfSessionMaybe();
+        }
+
+        if (ev.getPointerCount() != 2) {
+            return;
+        }
+
+        final Rect pipBounds = mPipBoundsState.getBounds();
+        if (action == MotionEvent.ACTION_POINTER_DOWN) {
+            if (mFirstIndex == -1 && mSecondIndex == -1
+                    && pipBounds.contains((int) ev.getRawX(0), (int) ev.getRawY(0))
+                    && pipBounds.contains((int) ev.getRawX(1), (int) ev.getRawY(1))) {
+                mAllowGesture = true;
+                mFirstIndex = 0;
+                mSecondIndex = 1;
+                mDownPoint.set(ev.getRawX(mFirstIndex), ev.getRawY(mFirstIndex));
+                mDownSecondPoint.set(ev.getRawX(mSecondIndex), ev.getRawY(mSecondIndex));
+                mDownBounds.set(pipBounds);
+
+                mLastPoint.set(mDownPoint);
+                mLastSecondPoint.set(mLastSecondPoint);
+                mLastResizeBounds.set(mDownBounds);
+
+                // start the high perf session as the second pointer gets detected
+                if (mPipPerfHintController != null) {
+                    mPipHighPerfSession = mPipPerfHintController.startSession(
+                            this::onHighPerfSessionTimeout, "onPinchResize");
+                }
+            }
+        }
+
+        if (action == MotionEvent.ACTION_MOVE) {
+            if (mFirstIndex == -1 || mSecondIndex == -1) {
+                return;
+            }
+
+            float x0 = ev.getRawX(mFirstIndex);
+            float y0 = ev.getRawY(mFirstIndex);
+            float x1 = ev.getRawX(mSecondIndex);
+            float y1 = ev.getRawY(mSecondIndex);
+            mLastPoint.set(x0, y0);
+            mLastSecondPoint.set(x1, y1);
+
+            // Capture inputs
+            if (!mThresholdCrossed
+                    && (distanceBetween(mDownSecondPoint, mLastSecondPoint) > mTouchSlop
+                            || distanceBetween(mDownPoint, mLastPoint) > mTouchSlop)) {
+                pilferPointers();
+                mThresholdCrossed = true;
+                // Reset the down to begin resizing from this point
+                mDownPoint.set(mLastPoint);
+                mDownSecondPoint.set(mLastSecondPoint);
+
+                if (mPhonePipMenuController.isMenuVisible()) {
+                    mPhonePipMenuController.hideMenu();
+                }
+            }
+
+            if (mThresholdCrossed) {
+                mAngle = mPinchResizingAlgorithm.calculateBoundsAndAngle(mDownPoint,
+                        mDownSecondPoint, mLastPoint, mLastSecondPoint, mMinSize, mMaxSize,
+                        mDownBounds, mLastResizeBounds);
+
+                /*
+                mPipTaskOrganizer.scheduleUserResizePip(mDownBounds, mLastResizeBounds,
+                        mAngle, null);
+                 */
+                mPipBoundsState.setHasUserResizedPip(true);
+            }
+        }
+    }
+
+    private void snapToMovementBoundsEdge(Rect bounds, Rect movementBounds) {
+        final int leftEdge = bounds.left;
+
+
+        final int fromLeft = Math.abs(leftEdge - movementBounds.left);
+        final int fromRight = Math.abs(movementBounds.right - leftEdge);
+
+        // The PIP will be snapped to either the right or left edge, so calculate which one
+        // is closest to the current position.
+        final int newLeft = fromLeft < fromRight
+                ? movementBounds.left : movementBounds.right;
+
+        bounds.offsetTo(newLeft, mLastResizeBounds.top);
+    }
+
+    /**
+     * Resizes the pip window and updates user-resized bounds.
+     *
+     * @param bounds target bounds to resize to
+     * @param snapFraction snap fraction to apply after resizing
+     */
+    void userResizeTo(Rect bounds, float snapFraction) {
+        Rect finalBounds = new Rect(bounds);
+
+        // get the current movement bounds
+        final Rect movementBounds = mPipBoundsAlgorithm.getMovementBounds(finalBounds);
+
+        // snap the target bounds to the either left or right edge, by choosing the closer one
+        snapToMovementBoundsEdge(finalBounds, movementBounds);
+
+        // apply the requested snap fraction onto the target bounds
+        mPipBoundsAlgorithm.applySnapFraction(finalBounds, snapFraction);
+
+        // resize from current bounds to target bounds without animation
+        // mPipTaskOrganizer.scheduleUserResizePip(mPipBoundsState.getBounds(), finalBounds, null);
+        // set the flag that pip has been resized
+        mPipBoundsState.setHasUserResizedPip(true);
+
+        // finish the resize operation and update the state of the bounds
+        // mPipTaskOrganizer.scheduleFinishResizePip(finalBounds, mUpdateResizeBoundsCallback);
+    }
+
+    private void finishResize() {
+        if (!mLastResizeBounds.isEmpty()) {
+            // Pinch-to-resize needs to re-calculate snap fraction and animate to the snapped
+            // position correctly. Drag-resize does not need to move, so just finalize resize.
+            if (mOngoingPinchToResize) {
+                final Rect startBounds = new Rect(mLastResizeBounds);
+                // If user resize is pretty close to max size, just auto resize to max.
+                if (mLastResizeBounds.width() >= PINCH_RESIZE_AUTO_MAX_RATIO * mMaxSize.x
+                        || mLastResizeBounds.height() >= PINCH_RESIZE_AUTO_MAX_RATIO * mMaxSize.y) {
+                    resizeRectAboutCenter(mLastResizeBounds, mMaxSize.x, mMaxSize.y);
+                }
+
+                // If user resize is smaller than min size, auto resize to min
+                if (mLastResizeBounds.width() < mMinSize.x
+                        || mLastResizeBounds.height() < mMinSize.y) {
+                    resizeRectAboutCenter(mLastResizeBounds, mMinSize.x, mMinSize.y);
+                }
+
+                // get the current movement bounds
+                final Rect movementBounds = mPipBoundsAlgorithm
+                        .getMovementBounds(mLastResizeBounds);
+
+                // snap mLastResizeBounds to the correct edge based on movement bounds
+                snapToMovementBoundsEdge(mLastResizeBounds, movementBounds);
+
+                final float snapFraction = mPipBoundsAlgorithm.getSnapFraction(
+                        mLastResizeBounds, movementBounds);
+                mPipBoundsAlgorithm.applySnapFraction(mLastResizeBounds, snapFraction);
+
+                // disable any touch events beyond resizing too
+                mPipTouchState.setAllowInputEvents(false);
+
+                /*
+                mPipTaskOrganizer.scheduleAnimateResizePip(startBounds, mLastResizeBounds,
+                        PINCH_RESIZE_SNAP_DURATION, mAngle, mUpdateResizeBoundsCallback, () -> {
+                            // enable touch events
+                            mPipTouchState.setAllowInputEvents(true);
+                        });
+                 */
+            } else {
+                /*
+                mPipTaskOrganizer.scheduleFinishResizePip(mLastResizeBounds,
+                        TRANSITION_DIRECTION_USER_RESIZE,
+                        mUpdateResizeBoundsCallback);
+                 */
+            }
+            final float magnetRadiusPercent = (float) mLastResizeBounds.width() / mMinSize.x / 2.f;
+            mPipUiEventLogger.log(
+                    PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_RESIZE);
+        } else {
+            resetState();
+        }
+    }
+
+    private void resetState() {
+        mCtrlType = CTRL_NONE;
+        mAngle = 0;
+        mOngoingPinchToResize = false;
+        mAllowGesture = false;
+        mThresholdCrossed = false;
+    }
+
+    void setUserResizeBounds(Rect bounds) {
+        mUserResizeBounds.set(bounds);
+    }
+
+    void invalidateUserResizeBounds() {
+        mUserResizeBounds.setEmpty();
+    }
+
+    Rect getUserResizeBounds() {
+        return mUserResizeBounds;
+    }
+
+    @VisibleForTesting
+    Rect getLastResizeBounds() {
+        return mLastResizeBounds;
+    }
+
+    @VisibleForTesting
+    void pilferPointers() {
+        mInputMonitor.pilferPointers();
+    }
+
+
+    void updateMaxSize(int maxX, int maxY) {
+        mMaxSize.set(maxX, maxY);
+    }
+
+    void updateMinSize(int minX, int minY) {
+        mMinSize.set(minX, minY);
+    }
+
+    void setOhmOffset(int offset) {
+        mOhmOffset = offset;
+    }
+
+    private float distanceBetween(PointF p1, PointF p2) {
+        return (float) Math.hypot(p2.x - p1.x, p2.y - p1.y);
+    }
+
+    private void resizeRectAboutCenter(Rect rect, int w, int h) {
+        int cx = rect.centerX();
+        int cy = rect.centerY();
+        int l = cx - w / 2;
+        int r = l + w;
+        int t = cy - h / 2;
+        int b = t + h;
+        rect.set(l, t, r, b);
+    }
+
+    /**
+     * Dumps the {@link PipResizeGestureHandler} state.
+     */
+    public void dump(PrintWriter pw, String prefix) {
+        final String innerPrefix = prefix + "  ";
+        pw.println(prefix + TAG);
+        pw.println(innerPrefix + "mAllowGesture=" + mAllowGesture);
+        pw.println(innerPrefix + "mIsAttached=" + mIsAttached);
+        pw.println(innerPrefix + "mIsEnabled=" + mIsEnabled);
+        pw.println(innerPrefix + "mEnablePinchResize=" + mEnablePinchResize);
+        pw.println(innerPrefix + "mThresholdCrossed=" + mThresholdCrossed);
+        pw.println(innerPrefix + "mOhmOffset=" + mOhmOffset);
+        pw.println(innerPrefix + "mMinSize=" + mMinSize);
+        pw.println(innerPrefix + "mMaxSize=" + mMaxSize);
+    }
+
+    class PipResizeInputEventReceiver extends BatchedInputEventReceiver {
+        PipResizeInputEventReceiver(InputChannel channel, Looper looper) {
+            super(channel, looper, Choreographer.getInstance());
+        }
+
+        public void onInputEvent(InputEvent event) {
+            PipResizeGestureHandler.this.onInputEvent(event);
+            finishInputEvent(event, true);
+        }
+    }
+}
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 6665013..b4ca7df 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
@@ -21,6 +21,7 @@
 import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP;
 
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -30,9 +31,11 @@
 import android.window.WindowContainerTransaction;
 
 import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.core.content.ContextCompat;
 
+import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.pip.PipBoundsState;
 import com.android.wm.shell.common.pip.PipUtils;
@@ -52,6 +55,7 @@
     private final Context mContext;
     private final PipBoundsState mPipBoundsState;
     private final ShellExecutor mMainExecutor;
+    private final ShellTaskOrganizer mShellTaskOrganizer;
     private PipSchedulerReceiver mSchedulerReceiver;
     private PipTransitionController mPipTransitionController;
 
@@ -66,6 +70,16 @@
     // true if Launcher has started swipe PiP to home animation
     private boolean mInSwipePipToHomeTransition;
 
+    // Overlay leash potentially used during swipe PiP to home transition;
+    // if null while mInSwipePipToHomeTransition is true, then srcRectHint was invalid.
+    @Nullable
+    SurfaceControl mSwipePipToHomeOverlay;
+
+    // App bounds used when as a starting point to swipe PiP to home animation in Launcher;
+    // these are also used to calculate the app icon overlay buffer size.
+    @NonNull
+    final Rect mSwipePipToHomeAppBounds = new Rect();
+
     /**
      * Temporary PiP CUJ codes to schedule PiP related transitions directly from Shell.
      * This is used for a broadcast receiver to resolve intents. This should be removed once
@@ -101,11 +115,14 @@
         }
     }
 
-    public PipScheduler(Context context, PipBoundsState pipBoundsState,
-            ShellExecutor mainExecutor) {
+    public PipScheduler(Context context,
+            PipBoundsState pipBoundsState,
+            ShellExecutor mainExecutor,
+            ShellTaskOrganizer shellTaskOrganizer) {
         mContext = context;
         mPipBoundsState = pipBoundsState;
         mMainExecutor = mainExecutor;
+        mShellTaskOrganizer = shellTaskOrganizer;
 
         if (PipUtils.isPip2ExperimentEnabled()) {
             // temporary broadcast receiver to initiate exit PiP via expand
@@ -115,6 +132,10 @@
         }
     }
 
+    ShellExecutor getMainExecutor() {
+        return mMainExecutor;
+    }
+
     void setPipTransitionController(PipTransitionController pipTransitionController) {
         mPipTransitionController = pipTransitionController;
     }
@@ -171,6 +192,24 @@
         mPipTransitionController.startResizeTransition(wct, onFinishResizeCallback);
     }
 
+    void onSwipePipToHomeAnimationStart(int taskId, ComponentName componentName,
+            Rect destinationBounds, SurfaceControl overlay, Rect appBounds) {
+        mInSwipePipToHomeTransition = true;
+        mSwipePipToHomeOverlay = overlay;
+        mSwipePipToHomeAppBounds.set(appBounds);
+        if (overlay != null) {
+            // Shell transitions might use a root animation leash, which will be removed when
+            // the Recents transition is finished. Launcher attaches the overlay leash to this
+            // animation target leash; thus, we need to reparent it to the actual Task surface now.
+            // PipTransition is responsible to fade it out and cleanup when finishing the enter PIP
+            // transition.
+            SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
+            mShellTaskOrganizer.reparentChildSurfaceToTask(taskId, overlay, tx);
+            tx.setLayer(overlay, Integer.MAX_VALUE);
+            tx.apply();
+        }
+    }
+
     void setInSwipePipToHomeTransition(boolean inSwipePipToHome) {
         mInSwipePipToHomeTransition = inSwipePipToHome;
     }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchGesture.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchGesture.java
new file mode 100644
index 0000000..efa5fc8
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchGesture.java
@@ -0,0 +1,47 @@
+/*
+ * 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.wm.shell.pip2.phone;
+
+/**
+ * A generic interface for a touch gesture.
+ */
+public abstract class PipTouchGesture {
+
+    /**
+     * Handle the touch down.
+     */
+    public void onDown(PipTouchState touchState) {}
+
+    /**
+     * Handle the touch move, and return whether the event was consumed.
+     */
+    public boolean onMove(PipTouchState touchState) {
+        return false;
+    }
+
+    /**
+     * Handle the touch up, and return whether the gesture was consumed.
+     */
+    public boolean onUp(PipTouchState touchState) {
+        return false;
+    }
+
+    /**
+     * Cleans up the high performance hint session if needed.
+     */
+    public void cleanUpHighPerfSessionMaybe() {}
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchHandler.java
new file mode 100644
index 0000000..cc8e3e0
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchHandler.java
@@ -0,0 +1,1081 @@
+/*
+ * 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.wm.shell.pip2.phone;
+
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.PIP_STASHING;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.PIP_STASH_MINIMUM_VELOCITY_THRESHOLD;
+import static com.android.wm.shell.common.pip.PipBoundsState.STASH_TYPE_LEFT;
+import static com.android.wm.shell.common.pip.PipBoundsState.STASH_TYPE_NONE;
+import static com.android.wm.shell.common.pip.PipBoundsState.STASH_TYPE_RIGHT;
+import static com.android.wm.shell.pip.PipAnimationController.TRANSITION_DIRECTION_TO_PIP;
+import static com.android.wm.shell.pip2.phone.PhonePipMenuController.MENU_STATE_FULL;
+import static com.android.wm.shell.pip2.phone.PhonePipMenuController.MENU_STATE_NONE;
+import static com.android.wm.shell.pip2.phone.PipMenuView.ANIM_TYPE_NONE;
+import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Point;
+import android.graphics.PointF;
+import android.graphics.Rect;
+import android.provider.DeviceConfig;
+import android.util.Size;
+import android.view.DisplayCutout;
+import android.view.InputEvent;
+import android.view.MotionEvent;
+import android.view.ViewConfiguration;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityWindowInfo;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.protolog.common.ProtoLog;
+import com.android.wm.shell.R;
+import com.android.wm.shell.common.FloatingContentCoordinator;
+import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.common.pip.PipBoundsAlgorithm;
+import com.android.wm.shell.common.pip.PipBoundsState;
+import com.android.wm.shell.common.pip.PipDoubleTapHelper;
+import com.android.wm.shell.common.pip.PipPerfHintController;
+import com.android.wm.shell.common.pip.PipUiEventLogger;
+import com.android.wm.shell.common.pip.PipUtils;
+import com.android.wm.shell.common.pip.SizeSpecSource;
+import com.android.wm.shell.pip.PipAnimationController;
+import com.android.wm.shell.pip.PipTransitionController;
+import com.android.wm.shell.sysui.ShellInit;
+
+import java.io.PrintWriter;
+import java.util.Optional;
+
+/**
+ * Manages all the touch handling for PIP on the Phone, including moving, dismissing and expanding
+ * the PIP.
+ */
+public class PipTouchHandler {
+
+    private static final String TAG = "PipTouchHandler";
+    private static final float DEFAULT_STASH_VELOCITY_THRESHOLD = 18000.f;
+
+    // Allow PIP to resize to a slightly bigger state upon touch
+    private boolean mEnableResize;
+    private final Context mContext;
+    private final PipBoundsAlgorithm mPipBoundsAlgorithm;
+    @NonNull private final PipBoundsState mPipBoundsState;
+    @NonNull private final SizeSpecSource mSizeSpecSource;
+    private final PipUiEventLogger mPipUiEventLogger;
+    private final PipDismissTargetHandler mPipDismissTargetHandler;
+    private final ShellExecutor mMainExecutor;
+    @Nullable private final PipPerfHintController mPipPerfHintController;
+
+    private PipResizeGestureHandler mPipResizeGestureHandler;
+
+    private final PhonePipMenuController mMenuController;
+    private final AccessibilityManager mAccessibilityManager;
+
+    /**
+     * Whether PIP stash is enabled or not. When enabled, if the user flings toward the edge of the
+     * screen, it will be shown in "stashed" mode, where PIP will only show partially.
+     */
+    private boolean mEnableStash = true;
+
+    private float mStashVelocityThreshold;
+
+    // The reference inset bounds, used to determine the dismiss fraction
+    private final Rect mInsetBounds = new Rect();
+
+    // Used to workaround an issue where the WM rotation happens before we are notified, allowing
+    // us to send stale bounds
+    private int mDeferResizeToNormalBoundsUntilRotation = -1;
+    private int mDisplayRotation;
+
+    // Behaviour states
+    private int mMenuState = MENU_STATE_NONE;
+    private boolean mIsImeShowing;
+    private int mImeHeight;
+    private int mImeOffset;
+    private boolean mIsShelfShowing;
+    private int mShelfHeight;
+    private int mMovementBoundsExtraOffsets;
+    private int mBottomOffsetBufferPx;
+    private float mSavedSnapFraction = -1f;
+    private boolean mSendingHoverAccessibilityEvents;
+    private boolean mMovementWithinDismiss;
+
+    // Touch state
+    private final PipTouchState mTouchState;
+    private final FloatingContentCoordinator mFloatingContentCoordinator;
+    private PipMotionHelper mMotionHelper;
+    private PipTouchGesture mGesture;
+
+    // Temp vars
+    private final Rect mTmpBounds = new Rect();
+
+    /**
+     * A listener for the PIP menu activity.
+     */
+    private class PipMenuListener implements PhonePipMenuController.Listener {
+        @Override
+        public void onPipMenuStateChangeStart(int menuState, boolean resize, Runnable callback) {
+            PipTouchHandler.this.onPipMenuStateChangeStart(menuState, resize, callback);
+        }
+
+        @Override
+        public void onPipMenuStateChangeFinish(int menuState) {
+            setMenuState(menuState);
+        }
+
+        @Override
+        public void onPipExpand() {
+            mMotionHelper.expandLeavePip(false /* skipAnimation */);
+        }
+
+        @Override
+        public void onPipDismiss() {
+            mTouchState.removeDoubleTapTimeoutCallback();
+            mMotionHelper.dismissPip();
+        }
+
+        @Override
+        public void onPipShowMenu() {
+            mMenuController.showMenu(MENU_STATE_FULL, mPipBoundsState.getBounds(),
+                    true /* allowMenuTimeout */, willResizeMenu(), shouldShowResizeHandle());
+        }
+    }
+
+    @SuppressLint("InflateParams")
+    public PipTouchHandler(Context context,
+            ShellInit shellInit,
+            PhonePipMenuController menuController,
+            PipBoundsAlgorithm pipBoundsAlgorithm,
+            @NonNull PipBoundsState pipBoundsState,
+            @NonNull SizeSpecSource sizeSpecSource,
+            PipMotionHelper pipMotionHelper,
+            FloatingContentCoordinator floatingContentCoordinator,
+            PipUiEventLogger pipUiEventLogger,
+            ShellExecutor mainExecutor,
+            Optional<PipPerfHintController> pipPerfHintControllerOptional) {
+        mContext = context;
+        mMainExecutor = mainExecutor;
+        mPipPerfHintController = pipPerfHintControllerOptional.orElse(null);
+        mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
+        mPipBoundsAlgorithm = pipBoundsAlgorithm;
+        mPipBoundsState = pipBoundsState;
+        mSizeSpecSource = sizeSpecSource;
+        mMenuController = menuController;
+        mPipUiEventLogger = pipUiEventLogger;
+        mFloatingContentCoordinator = floatingContentCoordinator;
+        mMenuController.addListener(new PipMenuListener());
+        mGesture = new DefaultPipTouchGesture();
+        mMotionHelper = pipMotionHelper;
+        mPipDismissTargetHandler = new PipDismissTargetHandler(context, pipUiEventLogger,
+                mMotionHelper, mainExecutor);
+        mTouchState = new PipTouchState(ViewConfiguration.get(context),
+                () -> {
+                    if (mPipBoundsState.isStashed()) {
+                        animateToUnStashedState();
+                        mPipUiEventLogger.log(
+                                PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_UNSTASHED);
+                        mPipBoundsState.setStashed(STASH_TYPE_NONE);
+                    } else {
+                        mMenuController.showMenuWithPossibleDelay(MENU_STATE_FULL,
+                                mPipBoundsState.getBounds(), true /* allowMenuTimeout */,
+                                willResizeMenu(),
+                                shouldShowResizeHandle());
+                    }
+                },
+                menuController::hideMenu,
+                mainExecutor);
+        mPipResizeGestureHandler =
+                new PipResizeGestureHandler(context, pipBoundsAlgorithm, pipBoundsState,
+                        mTouchState, this::updateMovementBounds, pipUiEventLogger,
+                        menuController, mainExecutor, mPipPerfHintController);
+
+        if (PipUtils.isPip2ExperimentEnabled()) {
+            shellInit.addInitCallback(this::onInit, this);
+        }
+    }
+
+    /**
+     * Called when the touch handler is initialized.
+     */
+    public void onInit() {
+        Resources res = mContext.getResources();
+        mEnableResize = res.getBoolean(R.bool.config_pipEnableResizeForMenu);
+        reloadResources();
+
+        mMotionHelper.init();
+        mPipResizeGestureHandler.init();
+        mPipDismissTargetHandler.init();
+
+        mEnableStash = DeviceConfig.getBoolean(
+                DeviceConfig.NAMESPACE_SYSTEMUI,
+                PIP_STASHING,
+                /* defaultValue = */ true);
+        DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
+                mMainExecutor,
+                properties -> {
+                    if (properties.getKeyset().contains(PIP_STASHING)) {
+                        mEnableStash = properties.getBoolean(
+                                PIP_STASHING, /* defaultValue = */ true);
+                    }
+                });
+        mStashVelocityThreshold = DeviceConfig.getFloat(
+                DeviceConfig.NAMESPACE_SYSTEMUI,
+                PIP_STASH_MINIMUM_VELOCITY_THRESHOLD,
+                DEFAULT_STASH_VELOCITY_THRESHOLD);
+        DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
+                mMainExecutor,
+                properties -> {
+                    if (properties.getKeyset().contains(PIP_STASH_MINIMUM_VELOCITY_THRESHOLD)) {
+                        mStashVelocityThreshold = properties.getFloat(
+                                PIP_STASH_MINIMUM_VELOCITY_THRESHOLD,
+                                DEFAULT_STASH_VELOCITY_THRESHOLD);
+                    }
+                });
+    }
+
+    public PipTransitionController getTransitionHandler() {
+        // return mPipTaskOrganizer.getTransitionController();
+        return null;
+    }
+
+    private void reloadResources() {
+        final Resources res = mContext.getResources();
+        mBottomOffsetBufferPx = res.getDimensionPixelSize(R.dimen.pip_bottom_offset_buffer);
+        mImeOffset = res.getDimensionPixelSize(R.dimen.pip_ime_offset);
+        mPipDismissTargetHandler.updateMagneticTargetSize();
+    }
+
+    void onOverlayChanged() {
+        // onOverlayChanged is triggered upon theme change, update the dismiss target accordingly.
+        mPipDismissTargetHandler.init();
+    }
+
+    private boolean shouldShowResizeHandle() {
+        return false;
+    }
+
+    void setTouchGesture(PipTouchGesture gesture) {
+        mGesture = gesture;
+    }
+
+    void setTouchEnabled(boolean enabled) {
+        mTouchState.setAllowTouches(enabled);
+    }
+
+    void showPictureInPictureMenu() {
+        // Only show the menu if the user isn't currently interacting with the PiP
+        if (!mTouchState.isUserInteracting()) {
+            mMenuController.showMenu(MENU_STATE_FULL, mPipBoundsState.getBounds(),
+                    false /* allowMenuTimeout */, willResizeMenu(),
+                    shouldShowResizeHandle());
+        }
+    }
+
+    void onActivityPinned() {
+        mPipDismissTargetHandler.createOrUpdateDismissTarget();
+
+        mPipResizeGestureHandler.onActivityPinned();
+        mFloatingContentCoordinator.onContentAdded(mMotionHelper);
+    }
+
+    void onActivityUnpinned(ComponentName topPipActivity) {
+        if (topPipActivity == null) {
+            // Clean up state after the last PiP activity is removed
+            mPipDismissTargetHandler.cleanUpDismissTarget();
+
+            mFloatingContentCoordinator.onContentRemoved(mMotionHelper);
+        }
+        mPipResizeGestureHandler.onActivityUnpinned();
+    }
+
+    void onPinnedStackAnimationEnded(
+            @PipAnimationController.TransitionDirection int direction) {
+        // Always synchronize the motion helper bounds once PiP animations finish
+        mMotionHelper.synchronizePinnedStackBounds();
+        updateMovementBounds();
+        if (direction == TRANSITION_DIRECTION_TO_PIP) {
+            // Set the initial bounds as the user resize bounds.
+            mPipResizeGestureHandler.setUserResizeBounds(mPipBoundsState.getBounds());
+        }
+    }
+
+    void onConfigurationChanged() {
+        mPipResizeGestureHandler.onConfigurationChanged();
+        mMotionHelper.synchronizePinnedStackBounds();
+        reloadResources();
+
+        /*
+        if (mPipTaskOrganizer.isInPip()) {
+            // Recreate the dismiss target for the new orientation.
+            mPipDismissTargetHandler.createOrUpdateDismissTarget();
+        }
+         */
+    }
+
+    void onImeVisibilityChanged(boolean imeVisible, int imeHeight) {
+        mIsImeShowing = imeVisible;
+        mImeHeight = imeHeight;
+    }
+
+    void onShelfVisibilityChanged(boolean shelfVisible, int shelfHeight) {
+        mIsShelfShowing = shelfVisible;
+        mShelfHeight = shelfHeight;
+    }
+
+    /**
+     * Called when SysUI state changed.
+     *
+     * @param isSysUiStateValid Is SysUI valid or not.
+     */
+    public void onSystemUiStateChanged(boolean isSysUiStateValid) {
+        mPipResizeGestureHandler.onSystemUiStateChanged(isSysUiStateValid);
+    }
+
+    void adjustBoundsForRotation(Rect outBounds, Rect curBounds, Rect insetBounds) {
+        final Rect toMovementBounds = new Rect();
+        mPipBoundsAlgorithm.getMovementBounds(outBounds, insetBounds, toMovementBounds, 0);
+        final int prevBottom = mPipBoundsState.getMovementBounds().bottom
+                - mMovementBoundsExtraOffsets;
+        if ((prevBottom - mBottomOffsetBufferPx) <= curBounds.top) {
+            outBounds.offsetTo(outBounds.left, toMovementBounds.bottom);
+        }
+    }
+
+    /**
+     * Responds to IPinnedStackListener on resetting aspect ratio for the pinned window.
+     */
+    public void onAspectRatioChanged() {
+        mPipResizeGestureHandler.invalidateUserResizeBounds();
+    }
+
+    void onMovementBoundsChanged(Rect insetBounds, Rect normalBounds, Rect curBounds,
+            boolean fromImeAdjustment, boolean fromShelfAdjustment, int displayRotation) {
+        // Set the user resized bounds equal to the new normal bounds in case they were
+        // invalidated (e.g. by an aspect ratio change).
+        if (mPipResizeGestureHandler.getUserResizeBounds().isEmpty()) {
+            mPipResizeGestureHandler.setUserResizeBounds(normalBounds);
+        }
+
+        final int bottomOffset = mIsImeShowing ? mImeHeight : 0;
+        final boolean fromDisplayRotationChanged = (mDisplayRotation != displayRotation);
+        if (fromDisplayRotationChanged) {
+            mTouchState.reset();
+        }
+
+        // Re-calculate the expanded bounds
+        Rect normalMovementBounds = new Rect();
+        mPipBoundsAlgorithm.getMovementBounds(normalBounds, insetBounds,
+                normalMovementBounds, bottomOffset);
+
+        if (mPipBoundsState.getMovementBounds().isEmpty()) {
+            // mMovementBounds is not initialized yet and a clean movement bounds without
+            // bottom offset shall be used later in this function.
+            mPipBoundsAlgorithm.getMovementBounds(curBounds, insetBounds,
+                    mPipBoundsState.getMovementBounds(), 0 /* bottomOffset */);
+        }
+
+        // Calculate the expanded size
+        float aspectRatio = (float) normalBounds.width() / normalBounds.height();
+        Size expandedSize = mSizeSpecSource.getDefaultSize(aspectRatio);
+        mPipBoundsState.setExpandedBounds(
+                new Rect(0, 0, expandedSize.getWidth(), expandedSize.getHeight()));
+        Rect expandedMovementBounds = new Rect();
+        mPipBoundsAlgorithm.getMovementBounds(
+                mPipBoundsState.getExpandedBounds(), insetBounds, expandedMovementBounds,
+                bottomOffset);
+
+        updatePipSizeConstraints(normalBounds, aspectRatio);
+
+        // The extra offset does not really affect the movement bounds, but are applied based on the
+        // current state (ime showing, or shelf offset) when we need to actually shift
+        int extraOffset = Math.max(
+                mIsImeShowing ? mImeOffset : 0,
+                !mIsImeShowing && mIsShelfShowing ? mShelfHeight : 0);
+
+        // Update the movement bounds after doing the calculations based on the old movement bounds
+        // above
+        mPipBoundsState.setNormalMovementBounds(normalMovementBounds);
+        mPipBoundsState.setExpandedMovementBounds(expandedMovementBounds);
+        mDisplayRotation = displayRotation;
+        mInsetBounds.set(insetBounds);
+        updateMovementBounds();
+        mMovementBoundsExtraOffsets = extraOffset;
+
+        // If we have a deferred resize, apply it now
+        if (mDeferResizeToNormalBoundsUntilRotation == displayRotation) {
+            mMotionHelper.animateToUnexpandedState(normalBounds, mSavedSnapFraction,
+                    mPipBoundsState.getNormalMovementBounds(), mPipBoundsState.getMovementBounds(),
+                    true /* immediate */);
+            mSavedSnapFraction = -1f;
+            mDeferResizeToNormalBoundsUntilRotation = -1;
+        }
+    }
+
+    /**
+     * Update the values for min/max allowed size of picture in picture window based on the aspect
+     * ratio.
+     * @param aspectRatio aspect ratio to use for the calculation of min/max size
+     */
+    public void updateMinMaxSize(float aspectRatio) {
+        updatePipSizeConstraints(mPipBoundsState.getNormalBounds(),
+                aspectRatio);
+    }
+
+    private void updatePipSizeConstraints(Rect normalBounds,
+            float aspectRatio) {
+        if (mPipResizeGestureHandler.isUsingPinchToZoom()) {
+            updatePinchResizeSizeConstraints(aspectRatio);
+        } else {
+            mPipResizeGestureHandler.updateMinSize(normalBounds.width(), normalBounds.height());
+            mPipResizeGestureHandler.updateMaxSize(mPipBoundsState.getExpandedBounds().width(),
+                    mPipBoundsState.getExpandedBounds().height());
+        }
+    }
+
+    private void updatePinchResizeSizeConstraints(float aspectRatio) {
+        mPipBoundsState.updateMinMaxSize(aspectRatio);
+        mPipResizeGestureHandler.updateMinSize(mPipBoundsState.getMinSize().x,
+                mPipBoundsState.getMinSize().y);
+        mPipResizeGestureHandler.updateMaxSize(mPipBoundsState.getMaxSize().x,
+                mPipBoundsState.getMaxSize().y);
+    }
+
+    /**
+     * TODO Add appropriate description
+     */
+    public void onRegistrationChanged(boolean isRegistered) {
+        if (isRegistered) {
+            // Register the accessibility connection.
+        } else {
+            mAccessibilityManager.setPictureInPictureActionReplacingConnection(null);
+        }
+        if (!isRegistered && mTouchState.isUserInteracting()) {
+            // If the input consumer is unregistered while the user is interacting, then we may not
+            // get the final TOUCH_UP event, so clean up the dismiss target as well
+            mPipDismissTargetHandler.cleanUpDismissTarget();
+        }
+    }
+
+    private void onAccessibilityShowMenu() {
+        mMenuController.showMenu(MENU_STATE_FULL, mPipBoundsState.getBounds(),
+                true /* allowMenuTimeout */, willResizeMenu(),
+                shouldShowResizeHandle());
+    }
+
+    /**
+     * TODO Add appropriate description
+     */
+    public boolean handleTouchEvent(InputEvent inputEvent) {
+        // Skip any non motion events
+        if (!(inputEvent instanceof MotionEvent)) {
+            return true;
+        }
+
+        // do not process input event if not allowed
+        if (!mTouchState.getAllowInputEvents()) {
+            return true;
+        }
+
+        MotionEvent ev = (MotionEvent) inputEvent;
+        if (!mPipBoundsState.isStashed() && mPipResizeGestureHandler.willStartResizeGesture(ev)) {
+            // Initialize the touch state for the gesture, but immediately reset to invalidate the
+            // gesture
+            mTouchState.onTouchEvent(ev);
+            mTouchState.reset();
+            return true;
+        }
+
+        if (mPipResizeGestureHandler.hasOngoingGesture()) {
+            mGesture.cleanUpHighPerfSessionMaybe();
+            mPipDismissTargetHandler.hideDismissTargetMaybe();
+            return true;
+        }
+
+        if ((ev.getAction() == MotionEvent.ACTION_DOWN || mTouchState.isUserInteracting())
+                && mPipDismissTargetHandler.maybeConsumeMotionEvent(ev)) {
+            // If the first touch event occurs within the magnetic field, pass the ACTION_DOWN event
+            // to the touch state. Touch state needs a DOWN event in order to later process MOVE
+            // events it'll receive if the object is dragged out of the magnetic field.
+            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+                mTouchState.onTouchEvent(ev);
+            }
+
+            // Continue tracking velocity when the object is in the magnetic field, since we want to
+            // respect touch input velocity if the object is dragged out and then flung.
+            mTouchState.addMovementToVelocityTracker(ev);
+
+            return true;
+        }
+
+        if (!mTouchState.isUserInteracting()) {
+            ProtoLog.wtf(WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: Waiting to start the entry animation, skip the motion event.", TAG);
+            return true;
+        }
+
+        // Update the touch state
+        mTouchState.onTouchEvent(ev);
+
+        boolean shouldDeliverToMenu = mMenuState != MENU_STATE_NONE;
+
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_DOWN: {
+                mGesture.onDown(mTouchState);
+                break;
+            }
+            case MotionEvent.ACTION_MOVE: {
+                if (mGesture.onMove(mTouchState)) {
+                    break;
+                }
+
+                shouldDeliverToMenu = !mTouchState.isDragging();
+                break;
+            }
+            case MotionEvent.ACTION_UP: {
+                // Update the movement bounds again if the state has changed since the user started
+                // dragging (ie. when the IME shows)
+                updateMovementBounds();
+
+                if (mGesture.onUp(mTouchState)) {
+                    break;
+                }
+            }
+            // Fall through to clean up
+            case MotionEvent.ACTION_CANCEL: {
+                shouldDeliverToMenu = !mTouchState.startedDragging() && !mTouchState.isDragging();
+                mTouchState.reset();
+                break;
+            }
+            case MotionEvent.ACTION_HOVER_ENTER: {
+                // If Touch Exploration is enabled, some a11y services (e.g. Talkback) is probably
+                // on and changing MotionEvents into HoverEvents.
+                // Let's not enable menu show/hide for a11y services.
+                if (!mAccessibilityManager.isTouchExplorationEnabled()) {
+                    mTouchState.removeHoverExitTimeoutCallback();
+                    mMenuController.showMenu(MENU_STATE_FULL, mPipBoundsState.getBounds(),
+                            false /* allowMenuTimeout */, false /* willResizeMenu */,
+                            shouldShowResizeHandle());
+                }
+            }
+            // Fall through
+            case MotionEvent.ACTION_HOVER_MOVE: {
+                if (!shouldDeliverToMenu && !mSendingHoverAccessibilityEvents) {
+                    sendAccessibilityHoverEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER);
+                    mSendingHoverAccessibilityEvents = true;
+                }
+                break;
+            }
+            case MotionEvent.ACTION_HOVER_EXIT: {
+                // If Touch Exploration is enabled, some a11y services (e.g. Talkback) is probably
+                // on and changing MotionEvents into HoverEvents.
+                // Let's not enable menu show/hide for a11y services.
+                if (!mAccessibilityManager.isTouchExplorationEnabled()) {
+                    mTouchState.scheduleHoverExitTimeoutCallback();
+                }
+                if (!shouldDeliverToMenu && mSendingHoverAccessibilityEvents) {
+                    sendAccessibilityHoverEvent(AccessibilityEvent.TYPE_VIEW_HOVER_EXIT);
+                    mSendingHoverAccessibilityEvents = false;
+                }
+                break;
+            }
+        }
+
+        shouldDeliverToMenu &= !mPipBoundsState.isStashed();
+
+        // Deliver the event to PipMenuActivity to handle button click if the menu has shown.
+        if (shouldDeliverToMenu) {
+            final MotionEvent cloneEvent = MotionEvent.obtain(ev);
+            // Send the cancel event and cancel menu timeout if it starts to drag.
+            if (mTouchState.startedDragging()) {
+                cloneEvent.setAction(MotionEvent.ACTION_CANCEL);
+                mMenuController.pokeMenu();
+            }
+
+            mMenuController.handlePointerEvent(cloneEvent);
+            cloneEvent.recycle();
+        }
+
+        return true;
+    }
+
+    private void sendAccessibilityHoverEvent(int type) {
+        if (!mAccessibilityManager.isEnabled()) {
+            return;
+        }
+
+        AccessibilityEvent event = AccessibilityEvent.obtain(type);
+        event.setImportantForAccessibility(true);
+        event.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID);
+        event.setWindowId(
+                AccessibilityWindowInfo.PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID);
+        mAccessibilityManager.sendAccessibilityEvent(event);
+    }
+
+    /**
+     * Called when the PiP menu state is in the process of animating/changing from one to another.
+     */
+    private void onPipMenuStateChangeStart(int menuState, boolean resize, Runnable callback) {
+        if (mMenuState == menuState && !resize) {
+            return;
+        }
+
+        if (menuState == MENU_STATE_FULL && mMenuState != MENU_STATE_FULL) {
+            // Save the current snap fraction and if we do not drag or move the PiP, then
+            // we store back to this snap fraction.  Otherwise, we'll reset the snap
+            // fraction and snap to the closest edge.
+            if (resize) {
+                // PIP is too small to show the menu actions and thus needs to be resized to a
+                // size that can fit them all. Resize to the default size.
+                animateToNormalSize(callback);
+            }
+        } else if (menuState == MENU_STATE_NONE && mMenuState == MENU_STATE_FULL) {
+            // Try and restore the PiP to the closest edge, using the saved snap fraction
+            // if possible
+            if (resize && !mPipResizeGestureHandler.isResizing()) {
+                if (mDeferResizeToNormalBoundsUntilRotation == -1) {
+                    // This is a very special case: when the menu is expanded and visible,
+                    // navigating to another activity can trigger auto-enter PiP, and if the
+                    // revealed activity has a forced rotation set, then the controller will get
+                    // updated with the new rotation of the display. However, at the same time,
+                    // SystemUI will try to hide the menu by creating an animation to the normal
+                    // bounds which are now stale.  In such a case we defer the animation to the
+                    // normal bounds until after the next onMovementBoundsChanged() call to get the
+                    // bounds in the new orientation
+                    int displayRotation = mContext.getDisplay().getRotation();
+                    if (mDisplayRotation != displayRotation) {
+                        mDeferResizeToNormalBoundsUntilRotation = displayRotation;
+                    }
+                }
+
+                if (mDeferResizeToNormalBoundsUntilRotation == -1) {
+                    animateToUnexpandedState(getUserResizeBounds());
+                }
+            } else {
+                mSavedSnapFraction = -1f;
+            }
+        }
+    }
+
+    private void setMenuState(int menuState) {
+        mMenuState = menuState;
+        updateMovementBounds();
+        // If pip menu has dismissed, we should register the A11y ActionReplacingConnection for pip
+        // as well, or it can't handle a11y focus and pip menu can't perform any action.
+        onRegistrationChanged(menuState == MENU_STATE_NONE);
+        if (menuState == MENU_STATE_NONE) {
+            mPipUiEventLogger.log(PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_HIDE_MENU);
+        } else if (menuState == MENU_STATE_FULL) {
+            mPipUiEventLogger.log(PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_SHOW_MENU);
+        }
+    }
+
+    private void animateToMaximizedState(Runnable callback) {
+        Rect maxMovementBounds = new Rect();
+        Rect maxBounds = new Rect(0, 0, mPipBoundsState.getMaxSize().x,
+                mPipBoundsState.getMaxSize().y);
+        mPipBoundsAlgorithm.getMovementBounds(maxBounds, mInsetBounds, maxMovementBounds,
+                mIsImeShowing ? mImeHeight : 0);
+        mSavedSnapFraction = mMotionHelper.animateToExpandedState(maxBounds,
+                mPipBoundsState.getMovementBounds(), maxMovementBounds,
+                callback);
+    }
+
+    private void animateToNormalSize(Runnable callback) {
+        // Save the current bounds as the user-resize bounds.
+        mPipResizeGestureHandler.setUserResizeBounds(mPipBoundsState.getBounds());
+
+        final Size minMenuSize = mMenuController.getEstimatedMinMenuSize();
+        final Rect normalBounds = mPipBoundsState.getNormalBounds();
+        final Rect destBounds = mPipBoundsAlgorithm.adjustNormalBoundsToFitMenu(normalBounds,
+                minMenuSize);
+        Rect restoredMovementBounds = new Rect();
+        mPipBoundsAlgorithm.getMovementBounds(destBounds,
+                mInsetBounds, restoredMovementBounds, mIsImeShowing ? mImeHeight : 0);
+        mSavedSnapFraction = mMotionHelper.animateToExpandedState(destBounds,
+                mPipBoundsState.getMovementBounds(), restoredMovementBounds, callback);
+    }
+
+    private void animateToUnexpandedState(Rect restoreBounds) {
+        Rect restoredMovementBounds = new Rect();
+        mPipBoundsAlgorithm.getMovementBounds(restoreBounds,
+                mInsetBounds, restoredMovementBounds, mIsImeShowing ? mImeHeight : 0);
+        mMotionHelper.animateToUnexpandedState(restoreBounds, mSavedSnapFraction,
+                restoredMovementBounds, mPipBoundsState.getMovementBounds(), false /* immediate */);
+        mSavedSnapFraction = -1f;
+    }
+
+    private void animateToUnStashedState() {
+        final Rect pipBounds = mPipBoundsState.getBounds();
+        final boolean onLeftEdge = pipBounds.left < mPipBoundsState.getDisplayBounds().left;
+        final Rect unStashedBounds = new Rect(0, pipBounds.top, 0, pipBounds.bottom);
+        unStashedBounds.left = onLeftEdge ? mInsetBounds.left
+                : mInsetBounds.right - pipBounds.width();
+        unStashedBounds.right = onLeftEdge ? mInsetBounds.left + pipBounds.width()
+                : mInsetBounds.right;
+        mMotionHelper.animateToUnStashedBounds(unStashedBounds);
+    }
+
+    /**
+     * @return the motion helper.
+     */
+    public PipMotionHelper getMotionHelper() {
+        return mMotionHelper;
+    }
+
+    @VisibleForTesting
+    public PipResizeGestureHandler getPipResizeGestureHandler() {
+        return mPipResizeGestureHandler;
+    }
+
+    @VisibleForTesting
+    public void setPipResizeGestureHandler(PipResizeGestureHandler pipResizeGestureHandler) {
+        mPipResizeGestureHandler = pipResizeGestureHandler;
+    }
+
+    @VisibleForTesting
+    public void setPipMotionHelper(PipMotionHelper pipMotionHelper) {
+        mMotionHelper = pipMotionHelper;
+    }
+
+    Rect getUserResizeBounds() {
+        return mPipResizeGestureHandler.getUserResizeBounds();
+    }
+
+    /**
+     * Sets the user resize bounds tracked by {@link PipResizeGestureHandler}
+     */
+    void setUserResizeBounds(Rect bounds) {
+        mPipResizeGestureHandler.setUserResizeBounds(bounds);
+    }
+
+    /**
+     * Gesture controlling normal movement of the PIP.
+     */
+    private class DefaultPipTouchGesture extends PipTouchGesture {
+        private final Point mStartPosition = new Point();
+        private final PointF mDelta = new PointF();
+        private boolean mShouldHideMenuAfterFling;
+
+        @Nullable private PipPerfHintController.PipHighPerfSession mPipHighPerfSession;
+
+        private void onHighPerfSessionTimeout(PipPerfHintController.PipHighPerfSession session) {}
+
+        @Override
+        public void cleanUpHighPerfSessionMaybe() {
+            if (mPipHighPerfSession != null) {
+                // Close the high perf session once pointer interactions are over;
+                mPipHighPerfSession.close();
+                mPipHighPerfSession = null;
+            }
+        }
+
+        @Override
+        public void onDown(PipTouchState touchState) {
+            if (!touchState.isUserInteracting()) {
+                return;
+            }
+
+            if (mPipPerfHintController != null) {
+                // Cache the PiP high perf session to close it upon touch up.
+                mPipHighPerfSession = mPipPerfHintController.startSession(
+                        this::onHighPerfSessionTimeout, "DefaultPipTouchGesture#onDown");
+            }
+
+            Rect bounds = getPossiblyMotionBounds();
+            mDelta.set(0f, 0f);
+            mStartPosition.set(bounds.left, bounds.top);
+            mMovementWithinDismiss = touchState.getDownTouchPosition().y
+                    >= mPipBoundsState.getMovementBounds().bottom;
+            mMotionHelper.setSpringingToTouch(false);
+            // mPipDismissTargetHandler.setTaskLeash(mPipTaskOrganizer.getSurfaceControl());
+
+            // If the menu is still visible then just poke the menu
+            // so that it will timeout after the user stops touching it
+            if (mMenuState != MENU_STATE_NONE && !mPipBoundsState.isStashed()) {
+                mMenuController.pokeMenu();
+            }
+        }
+
+        @Override
+        public boolean onMove(PipTouchState touchState) {
+            if (!touchState.isUserInteracting()) {
+                return false;
+            }
+
+            if (touchState.startedDragging()) {
+                mSavedSnapFraction = -1f;
+                mPipDismissTargetHandler.showDismissTargetMaybe();
+            }
+
+            if (touchState.isDragging()) {
+                mPipBoundsState.setHasUserMovedPip(true);
+
+                // Move the pinned stack freely
+                final PointF lastDelta = touchState.getLastTouchDelta();
+                float lastX = mStartPosition.x + mDelta.x;
+                float lastY = mStartPosition.y + mDelta.y;
+                float left = lastX + lastDelta.x;
+                float top = lastY + lastDelta.y;
+
+                // Add to the cumulative delta after bounding the position
+                mDelta.x += left - lastX;
+                mDelta.y += top - lastY;
+
+                mTmpBounds.set(getPossiblyMotionBounds());
+                mTmpBounds.offsetTo((int) left, (int) top);
+                mMotionHelper.movePip(mTmpBounds, true /* isDragging */);
+
+                final PointF curPos = touchState.getLastTouchPosition();
+                if (mMovementWithinDismiss) {
+                    // Track if movement remains near the bottom edge to identify swipe to dismiss
+                    mMovementWithinDismiss = curPos.y >= mPipBoundsState.getMovementBounds().bottom;
+                }
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public boolean onUp(PipTouchState touchState) {
+            mPipDismissTargetHandler.hideDismissTargetMaybe();
+            mPipDismissTargetHandler.setTaskLeash(null);
+
+            if (!touchState.isUserInteracting()) {
+                return false;
+            }
+
+            final PointF vel = touchState.getVelocity();
+
+            if (touchState.isDragging()) {
+                if (mMenuState != MENU_STATE_NONE) {
+                    // If the menu is still visible, then just poke the menu so that
+                    // it will timeout after the user stops touching it
+                    mMenuController.showMenu(mMenuState, mPipBoundsState.getBounds(),
+                            true /* allowMenuTimeout */, willResizeMenu(),
+                            shouldShowResizeHandle());
+                }
+                mShouldHideMenuAfterFling = mMenuState == MENU_STATE_NONE;
+
+                // Reset the touch state on up before the fling settles
+                mTouchState.reset();
+                if (mEnableStash && shouldStash(vel, getPossiblyMotionBounds())) {
+                    mMotionHelper.stashToEdge(vel.x, vel.y, this::stashEndAction /* endAction */);
+                } else {
+                    if (mPipBoundsState.isStashed()) {
+                        // Reset stashed state if previously stashed
+                        mPipUiEventLogger.log(
+                                PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_UNSTASHED);
+                        mPipBoundsState.setStashed(STASH_TYPE_NONE);
+                    }
+                    mMotionHelper.flingToSnapTarget(vel.x, vel.y,
+                            this::flingEndAction /* endAction */);
+                }
+            } else if (mTouchState.isDoubleTap() && !mPipBoundsState.isStashed()
+                    && mMenuState != MENU_STATE_FULL) {
+                // If using pinch to zoom, double-tap functions as resizing between max/min size
+                if (mPipResizeGestureHandler.isUsingPinchToZoom()) {
+                    final boolean toExpand = mPipBoundsState.getBounds().width()
+                            < mPipBoundsState.getMaxSize().x
+                            && mPipBoundsState.getBounds().height()
+                            < mPipBoundsState.getMaxSize().y;
+                    if (mMenuController.isMenuVisible()) {
+                        mMenuController.hideMenu(ANIM_TYPE_NONE, false /* resize */);
+                    }
+
+                    // the size to toggle to after a double tap
+                    int nextSize = PipDoubleTapHelper
+                            .nextSizeSpec(mPipBoundsState, getUserResizeBounds());
+
+                    // actually toggle to the size chosen
+                    if (nextSize == PipDoubleTapHelper.SIZE_SPEC_MAX) {
+                        mPipResizeGestureHandler.setUserResizeBounds(mPipBoundsState.getBounds());
+                        animateToMaximizedState(null);
+                    } else if (nextSize == PipDoubleTapHelper.SIZE_SPEC_DEFAULT) {
+                        mPipResizeGestureHandler.setUserResizeBounds(mPipBoundsState.getBounds());
+                        animateToNormalSize(null);
+                    } else {
+                        animateToUnexpandedState(getUserResizeBounds());
+                    }
+                } else {
+                    // Expand to fullscreen if this is a double tap
+                    // the PiP should be frozen until the transition ends
+                    setTouchEnabled(false);
+                    mMotionHelper.expandLeavePip(false /* skipAnimation */);
+                }
+            } else if (mMenuState != MENU_STATE_FULL) {
+                if (mPipBoundsState.isStashed()) {
+                    // Unstash immediately if stashed, and don't wait for the double tap timeout
+                    animateToUnStashedState();
+                    mPipUiEventLogger.log(
+                            PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_UNSTASHED);
+                    mPipBoundsState.setStashed(STASH_TYPE_NONE);
+                    mTouchState.removeDoubleTapTimeoutCallback();
+                } else if (!mTouchState.isWaitingForDoubleTap()) {
+                    // User has stalled long enough for this not to be a drag or a double tap,
+                    // just expand the menu
+                    mMenuController.showMenu(MENU_STATE_FULL, mPipBoundsState.getBounds(),
+                            true /* allowMenuTimeout */, willResizeMenu(),
+                            shouldShowResizeHandle());
+                } else {
+                    // Next touch event _may_ be the second tap for the double-tap, schedule a
+                    // fallback runnable to trigger the menu if no touch event occurs before the
+                    // next tap
+                    mTouchState.scheduleDoubleTapTimeoutCallback();
+                }
+            }
+            cleanUpHighPerfSessionMaybe();
+            return true;
+        }
+
+        private void stashEndAction() {
+            if (mPipBoundsState.getBounds().left < 0
+                    && mPipBoundsState.getStashedState() != STASH_TYPE_LEFT) {
+                mPipUiEventLogger.log(
+                        PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_LEFT);
+                mPipBoundsState.setStashed(STASH_TYPE_LEFT);
+            } else if (mPipBoundsState.getBounds().left >= 0
+                    && mPipBoundsState.getStashedState() != STASH_TYPE_RIGHT) {
+                mPipUiEventLogger.log(
+                        PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_STASH_RIGHT);
+                mPipBoundsState.setStashed(STASH_TYPE_RIGHT);
+            }
+            mMenuController.hideMenu();
+        }
+
+        private void flingEndAction() {
+            if (mShouldHideMenuAfterFling) {
+                // If the menu is not visible, then we can still be showing the activity for the
+                // dismiss overlay, so just finish it after the animation completes
+                mMenuController.hideMenu();
+            }
+        }
+
+        private boolean shouldStash(PointF vel, Rect motionBounds) {
+            final boolean flingToLeft = vel.x < -mStashVelocityThreshold;
+            final boolean flingToRight = vel.x > mStashVelocityThreshold;
+            final int offset = motionBounds.width() / 2;
+            final boolean droppingOnLeft =
+                    motionBounds.left < mPipBoundsState.getDisplayBounds().left - offset;
+            final boolean droppingOnRight =
+                    motionBounds.right > mPipBoundsState.getDisplayBounds().right + offset;
+
+            // Do not allow stash if the destination edge contains display cutout. We only
+            // compare the left and right edges since we do not allow stash on top / bottom.
+            final DisplayCutout displayCutout =
+                    mPipBoundsState.getDisplayLayout().getDisplayCutout();
+            if (displayCutout != null) {
+                if ((flingToLeft || droppingOnLeft)
+                        && !displayCutout.getBoundingRectLeft().isEmpty()) {
+                    return false;
+                } else if ((flingToRight || droppingOnRight)
+                        && !displayCutout.getBoundingRectRight().isEmpty()) {
+                    return false;
+                }
+            }
+
+            // If user flings the PIP window above the minimum velocity, stash PIP.
+            // Only allow stashing to the edge if PIP wasn't previously stashed on the opposite
+            // edge.
+            final boolean stashFromFlingToEdge =
+                    (flingToLeft && mPipBoundsState.getStashedState() != STASH_TYPE_RIGHT)
+                    || (flingToRight && mPipBoundsState.getStashedState() != STASH_TYPE_LEFT);
+
+            // If User releases the PIP window while it's out of the display bounds, put
+            // PIP into stashed mode.
+            final boolean stashFromDroppingOnEdge = droppingOnLeft || droppingOnRight;
+
+            return stashFromFlingToEdge || stashFromDroppingOnEdge;
+        }
+    }
+
+    /**
+     * Updates the current movement bounds based on whether the menu is currently visible and
+     * resized.
+     */
+    private void updateMovementBounds() {
+        mPipBoundsAlgorithm.getMovementBounds(mPipBoundsState.getBounds(),
+                mInsetBounds, mPipBoundsState.getMovementBounds(), mIsImeShowing ? mImeHeight : 0);
+        mMotionHelper.onMovementBoundsChanged();
+    }
+
+    private Rect getMovementBounds(Rect curBounds) {
+        Rect movementBounds = new Rect();
+        mPipBoundsAlgorithm.getMovementBounds(curBounds, mInsetBounds,
+                movementBounds, mIsImeShowing ? mImeHeight : 0);
+        return movementBounds;
+    }
+
+    /**
+     * @return {@code true} if the menu should be resized on tap because app explicitly specifies
+     * PiP window size that is too small to hold all the actions.
+     */
+    private boolean willResizeMenu() {
+        if (!mEnableResize) {
+            return false;
+        }
+        final Size estimatedMinMenuSize = mMenuController.getEstimatedMinMenuSize();
+        if (estimatedMinMenuSize == null) {
+            ProtoLog.wtf(WM_SHELL_PICTURE_IN_PICTURE,
+                    "%s: Failed to get estimated menu size", TAG);
+            return false;
+        }
+        final Rect currentBounds = mPipBoundsState.getBounds();
+        return currentBounds.width() < estimatedMinMenuSize.getWidth()
+                || currentBounds.height() < estimatedMinMenuSize.getHeight();
+    }
+
+    /**
+     * Returns the PIP bounds if we're not in the middle of a motion operation, or the current,
+     * temporary motion bounds otherwise.
+     */
+    Rect getPossiblyMotionBounds() {
+        return mPipBoundsState.getMotionBoundsState().isInMotion()
+                ? mPipBoundsState.getMotionBoundsState().getBoundsInMotion()
+                : mPipBoundsState.getBounds();
+    }
+
+    void setOhmOffset(int offset) {
+        mPipResizeGestureHandler.setOhmOffset(offset);
+    }
+
+    /**
+     * Dumps the {@link PipTouchHandler} state.
+     */
+    public void dump(PrintWriter pw, String prefix) {
+        final String innerPrefix = prefix + "  ";
+        pw.println(prefix + TAG);
+        pw.println(innerPrefix + "mMenuState=" + mMenuState);
+        pw.println(innerPrefix + "mIsImeShowing=" + mIsImeShowing);
+        pw.println(innerPrefix + "mImeHeight=" + mImeHeight);
+        pw.println(innerPrefix + "mIsShelfShowing=" + mIsShelfShowing);
+        pw.println(innerPrefix + "mShelfHeight=" + mShelfHeight);
+        pw.println(innerPrefix + "mSavedSnapFraction=" + mSavedSnapFraction);
+        pw.println(innerPrefix + "mMovementBoundsExtraOffsets=" + mMovementBoundsExtraOffsets);
+        mPipBoundsAlgorithm.dump(pw, innerPrefix);
+        mTouchState.dump(pw, innerPrefix);
+        if (mPipResizeGestureHandler != null) {
+            mPipResizeGestureHandler.dump(pw, innerPrefix);
+        }
+    }
+
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchState.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchState.java
new file mode 100644
index 0000000..d093f1e
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTouchState.java
@@ -0,0 +1,427 @@
+/*
+ * 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.wm.shell.pip2.phone;
+
+import android.graphics.PointF;
+import android.view.Display;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.ViewConfiguration;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.protolog.common.ProtoLog;
+import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.protolog.ShellProtoLogGroup;
+
+import java.io.PrintWriter;
+
+/**
+ * This keeps track of the touch state throughout the current touch gesture.
+ */
+public class PipTouchState {
+    private static final String TAG = "PipTouchState";
+    private static final boolean DEBUG = false;
+
+    @VisibleForTesting
+    public static final long DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout();
+    static final long HOVER_EXIT_TIMEOUT = 50;
+
+    private final ShellExecutor mMainExecutor;
+    private final ViewConfiguration mViewConfig;
+    private final Runnable mDoubleTapTimeoutCallback;
+    private final Runnable mHoverExitTimeoutCallback;
+
+    private VelocityTracker mVelocityTracker;
+    private long mDownTouchTime = 0;
+    private long mLastDownTouchTime = 0;
+    private long mUpTouchTime = 0;
+    private final PointF mDownTouch = new PointF();
+    private final PointF mDownDelta = new PointF();
+    private final PointF mLastTouch = new PointF();
+    private final PointF mLastDelta = new PointF();
+    private final PointF mVelocity = new PointF();
+    private boolean mAllowTouches = true;
+
+    // Set to false to block both PipTouchHandler and PipResizeGestureHandler's input processing
+    private boolean mAllowInputEvents = true;
+    private boolean mIsUserInteracting = false;
+    // Set to true only if the multiple taps occur within the double tap timeout
+    private boolean mIsDoubleTap = false;
+    // Set to true only if a gesture
+    private boolean mIsWaitingForDoubleTap = false;
+    private boolean mIsDragging = false;
+    // The previous gesture was a drag
+    private boolean mPreviouslyDragging = false;
+    private boolean mStartedDragging = false;
+    private boolean mAllowDraggingOffscreen = false;
+    private int mActivePointerId;
+    private int mLastTouchDisplayId = Display.INVALID_DISPLAY;
+
+    public PipTouchState(ViewConfiguration viewConfig, Runnable doubleTapTimeoutCallback,
+            Runnable hoverExitTimeoutCallback, ShellExecutor mainExecutor) {
+        mViewConfig = viewConfig;
+        mDoubleTapTimeoutCallback = doubleTapTimeoutCallback;
+        mHoverExitTimeoutCallback = hoverExitTimeoutCallback;
+        mMainExecutor = mainExecutor;
+    }
+
+    /**
+     * @return true if input processing is enabled for PiP in general.
+     */
+    public boolean getAllowInputEvents() {
+        return mAllowInputEvents;
+    }
+
+    /**
+     * @param allowInputEvents true to enable input processing for PiP in general.
+     */
+    public void setAllowInputEvents(boolean allowInputEvents) {
+        mAllowInputEvents = allowInputEvents;
+    }
+
+    /**
+     * Resets this state.
+     */
+    public void reset() {
+        mAllowDraggingOffscreen = false;
+        mIsDragging = false;
+        mStartedDragging = false;
+        mIsUserInteracting = false;
+        mLastTouchDisplayId = Display.INVALID_DISPLAY;
+    }
+
+    /**
+     * Processes a given touch event and updates the state.
+     */
+    public void onTouchEvent(MotionEvent ev) {
+        mLastTouchDisplayId = ev.getDisplayId();
+        switch (ev.getActionMasked()) {
+            case MotionEvent.ACTION_DOWN: {
+                if (!mAllowTouches) {
+                    return;
+                }
+
+                // Initialize the velocity tracker
+                initOrResetVelocityTracker();
+                addMovementToVelocityTracker(ev);
+
+                mActivePointerId = ev.getPointerId(0);
+                if (DEBUG) {
+                    ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                            "%s: Setting active pointer id on DOWN: %d", TAG, mActivePointerId);
+                }
+                mLastTouch.set(ev.getRawX(), ev.getRawY());
+                mDownTouch.set(mLastTouch);
+                mAllowDraggingOffscreen = true;
+                mIsUserInteracting = true;
+                mDownTouchTime = ev.getEventTime();
+                mIsDoubleTap = !mPreviouslyDragging
+                        && (mDownTouchTime - mLastDownTouchTime) < DOUBLE_TAP_TIMEOUT;
+                mIsWaitingForDoubleTap = false;
+                mIsDragging = false;
+                mLastDownTouchTime = mDownTouchTime;
+                if (mDoubleTapTimeoutCallback != null) {
+                    mMainExecutor.removeCallbacks(mDoubleTapTimeoutCallback);
+                }
+                break;
+            }
+            case MotionEvent.ACTION_MOVE: {
+                // Skip event if we did not start processing this touch gesture
+                if (!mIsUserInteracting) {
+                    break;
+                }
+
+                // Update the velocity tracker
+                addMovementToVelocityTracker(ev);
+                int pointerIndex = ev.findPointerIndex(mActivePointerId);
+                if (pointerIndex == -1) {
+                    ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                            "%s: Invalid active pointer id on MOVE: %d", TAG, mActivePointerId);
+                    break;
+                }
+
+                float x = ev.getRawX(pointerIndex);
+                float y = ev.getRawY(pointerIndex);
+                mLastDelta.set(x - mLastTouch.x, y - mLastTouch.y);
+                mDownDelta.set(x - mDownTouch.x, y - mDownTouch.y);
+
+                boolean hasMovedBeyondTap = mDownDelta.length() > mViewConfig.getScaledTouchSlop();
+                if (!mIsDragging) {
+                    if (hasMovedBeyondTap) {
+                        mIsDragging = true;
+                        mStartedDragging = true;
+                    }
+                } else {
+                    mStartedDragging = false;
+                }
+                mLastTouch.set(x, y);
+                break;
+            }
+            case MotionEvent.ACTION_POINTER_UP: {
+                // Skip event if we did not start processing this touch gesture
+                if (!mIsUserInteracting) {
+                    break;
+                }
+
+                // Update the velocity tracker
+                addMovementToVelocityTracker(ev);
+
+                int pointerIndex = ev.getActionIndex();
+                int pointerId = ev.getPointerId(pointerIndex);
+                if (pointerId == mActivePointerId) {
+                    // Select a new active pointer id and reset the movement state
+                    final int newPointerIndex = (pointerIndex == 0) ? 1 : 0;
+                    mActivePointerId = ev.getPointerId(newPointerIndex);
+                    if (DEBUG) {
+                        ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                                "%s: Relinquish active pointer id on POINTER_UP: %d",
+                                TAG, mActivePointerId);
+                    }
+                    mLastTouch.set(ev.getRawX(newPointerIndex), ev.getRawY(newPointerIndex));
+                }
+                break;
+            }
+            case MotionEvent.ACTION_UP: {
+                // Skip event if we did not start processing this touch gesture
+                if (!mIsUserInteracting) {
+                    break;
+                }
+
+                // Update the velocity tracker
+                addMovementToVelocityTracker(ev);
+                mVelocityTracker.computeCurrentVelocity(1000,
+                        mViewConfig.getScaledMaximumFlingVelocity());
+                mVelocity.set(mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity());
+
+                int pointerIndex = ev.findPointerIndex(mActivePointerId);
+                if (pointerIndex == -1) {
+                    ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+                            "%s: Invalid active pointer id on UP: %d", TAG, mActivePointerId);
+                    break;
+                }
+
+                mUpTouchTime = ev.getEventTime();
+                mLastTouch.set(ev.getRawX(pointerIndex), ev.getRawY(pointerIndex));
+                mPreviouslyDragging = mIsDragging;
+                mIsWaitingForDoubleTap = !mIsDoubleTap && !mIsDragging
+                        && (mUpTouchTime - mDownTouchTime) < DOUBLE_TAP_TIMEOUT;
+
+            }
+            // fall through to clean up
+            case MotionEvent.ACTION_CANCEL: {
+                recycleVelocityTracker();
+                break;
+            }
+            case MotionEvent.ACTION_BUTTON_PRESS: {
+                removeHoverExitTimeoutCallback();
+                break;
+            }
+        }
+    }
+
+    /**
+     * @return the velocity of the active touch pointer at the point it is lifted off the screen.
+     */
+    public PointF getVelocity() {
+        return mVelocity;
+    }
+
+    /**
+     * @return the last touch position of the active pointer.
+     */
+    public PointF getLastTouchPosition() {
+        return mLastTouch;
+    }
+
+    /**
+     * @return the movement delta between the last handled touch event and the previous touch
+     * position.
+     */
+    public PointF getLastTouchDelta() {
+        return mLastDelta;
+    }
+
+    /**
+     * @return the down touch position.
+     */
+    public PointF getDownTouchPosition() {
+        return mDownTouch;
+    }
+
+    /**
+     * @return the movement delta between the last handled touch event and the down touch
+     * position.
+     */
+    public PointF getDownTouchDelta() {
+        return mDownDelta;
+    }
+
+    /**
+     * @return whether the user has started dragging.
+     */
+    public boolean isDragging() {
+        return mIsDragging;
+    }
+
+    /**
+     * @return whether the user is currently interacting with the PiP.
+     */
+    public boolean isUserInteracting() {
+        return mIsUserInteracting;
+    }
+
+    /**
+     * @return whether the user has started dragging just in the last handled touch event.
+     */
+    public boolean startedDragging() {
+        return mStartedDragging;
+    }
+
+    /**
+     * @return Display ID of the last touch event.
+     */
+    public int getLastTouchDisplayId() {
+        return mLastTouchDisplayId;
+    }
+
+    /**
+     * Sets whether touching is currently allowed.
+     */
+    public void setAllowTouches(boolean allowTouches) {
+        mAllowTouches = allowTouches;
+
+        // If the user happens to touch down before this is sent from the system during a transition
+        // then block any additional handling by resetting the state now
+        if (mIsUserInteracting) {
+            reset();
+        }
+    }
+
+    /**
+     * Disallows dragging offscreen for the duration of the current gesture.
+     */
+    public void setDisallowDraggingOffscreen() {
+        mAllowDraggingOffscreen = false;
+    }
+
+    /**
+     * @return whether dragging offscreen is allowed during this gesture.
+     */
+    public boolean allowDraggingOffscreen() {
+        return mAllowDraggingOffscreen;
+    }
+
+    /**
+     * @return whether this gesture is a double-tap.
+     */
+    public boolean isDoubleTap() {
+        return mIsDoubleTap;
+    }
+
+    /**
+     * @return whether this gesture will potentially lead to a following double-tap.
+     */
+    public boolean isWaitingForDoubleTap() {
+        return mIsWaitingForDoubleTap;
+    }
+
+    /**
+     * Schedules the callback to run if the next double tap does not occur.  Only runs if
+     * isWaitingForDoubleTap() is true.
+     */
+    public void scheduleDoubleTapTimeoutCallback() {
+        if (mIsWaitingForDoubleTap) {
+            long delay = getDoubleTapTimeoutCallbackDelay();
+            mMainExecutor.removeCallbacks(mDoubleTapTimeoutCallback);
+            mMainExecutor.executeDelayed(mDoubleTapTimeoutCallback, delay);
+        }
+    }
+
+    long getDoubleTapTimeoutCallbackDelay() {
+        if (mIsWaitingForDoubleTap) {
+            return Math.max(0, DOUBLE_TAP_TIMEOUT - (mUpTouchTime - mDownTouchTime));
+        }
+        return -1;
+    }
+
+    /**
+     * Removes the timeout callback if it's in queue.
+     */
+    public void removeDoubleTapTimeoutCallback() {
+        mIsWaitingForDoubleTap = false;
+        mMainExecutor.removeCallbacks(mDoubleTapTimeoutCallback);
+    }
+
+    void scheduleHoverExitTimeoutCallback() {
+        mMainExecutor.removeCallbacks(mHoverExitTimeoutCallback);
+        mMainExecutor.executeDelayed(mHoverExitTimeoutCallback, HOVER_EXIT_TIMEOUT);
+    }
+
+    void removeHoverExitTimeoutCallback() {
+        mMainExecutor.removeCallbacks(mHoverExitTimeoutCallback);
+    }
+
+    void addMovementToVelocityTracker(MotionEvent event) {
+        if (mVelocityTracker == null) {
+            return;
+        }
+
+        // Add movement to velocity tracker using raw screen X and Y coordinates instead
+        // of window coordinates because the window frame may be moving at the same time.
+        float deltaX = event.getRawX() - event.getX();
+        float deltaY = event.getRawY() - event.getY();
+        event.offsetLocation(deltaX, deltaY);
+        mVelocityTracker.addMovement(event);
+        event.offsetLocation(-deltaX, -deltaY);
+    }
+
+    private void initOrResetVelocityTracker() {
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        } else {
+            mVelocityTracker.clear();
+        }
+    }
+
+    private void recycleVelocityTracker() {
+        if (mVelocityTracker != null) {
+            mVelocityTracker.recycle();
+            mVelocityTracker = null;
+        }
+    }
+
+    /**
+     * Dumps the {@link PipTouchState}.
+     */
+    public void dump(PrintWriter pw, String prefix) {
+        final String innerPrefix = prefix + "  ";
+        pw.println(prefix + TAG);
+        pw.println(innerPrefix + "mAllowTouches=" + mAllowTouches);
+        pw.println(innerPrefix + "mAllowInputEvents=" + mAllowInputEvents);
+        pw.println(innerPrefix + "mActivePointerId=" + mActivePointerId);
+        pw.println(innerPrefix + "mLastTouchDisplayId=" + mLastTouchDisplayId);
+        pw.println(innerPrefix + "mDownTouch=" + mDownTouch);
+        pw.println(innerPrefix + "mDownDelta=" + mDownDelta);
+        pw.println(innerPrefix + "mLastTouch=" + mLastTouch);
+        pw.println(innerPrefix + "mLastDelta=" + mLastDelta);
+        pw.println(innerPrefix + "mVelocity=" + mVelocity);
+        pw.println(innerPrefix + "mIsUserInteracting=" + mIsUserInteracting);
+        pw.println(innerPrefix + "mIsDragging=" + mIsDragging);
+        pw.println(innerPrefix + "mStartedDragging=" + mStartedDragging);
+        pw.println(innerPrefix + "mAllowDraggingOffscreen=" + mAllowDraggingOffscreen);
+    }
+}
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 d15da4a..b179b5b 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
@@ -24,6 +24,9 @@
 import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP;
 import static com.android.wm.shell.transition.Transitions.TRANSIT_RESIZE_PIP;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
 import android.annotation.NonNull;
 import android.app.ActivityManager;
 import android.app.PictureInPictureParams;
@@ -44,6 +47,7 @@
 import com.android.wm.shell.common.pip.PipBoundsState;
 import com.android.wm.shell.common.pip.PipMenuController;
 import com.android.wm.shell.common.pip.PipUtils;
+import com.android.wm.shell.pip.PipContentOverlay;
 import com.android.wm.shell.pip.PipTransitionController;
 import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.transition.Transitions;
@@ -55,6 +59,11 @@
  */
 public class PipTransition extends PipTransitionController {
     private static final String TAG = PipTransition.class.getSimpleName();
+    /**
+     * 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 final Context mContext;
     private final PipScheduler mPipScheduler;
@@ -230,10 +239,13 @@
 
         PictureInPictureParams params = pipChange.getTaskInfo().pictureInPictureParams;
         Rect srcRectHint = params.getSourceRectHint();
+        Rect startBounds = pipChange.getStartAbsBounds();
         Rect destinationBounds = pipChange.getEndAbsBounds();
 
+        WindowContainerTransaction finishWct = new WindowContainerTransaction();
+
         if (PipBoundsAlgorithm.isSourceRectHintValidForEnterPip(srcRectHint, destinationBounds)) {
-            float scale = (float) destinationBounds.width() / srcRectHint.width();
+            final float scale = (float) destinationBounds.width() / srcRectHint.width();
             startTransaction.setWindowCrop(pipLeash, srcRectHint);
             startTransaction.setPosition(pipLeash,
                     destinationBounds.left - srcRectHint.left * scale,
@@ -244,13 +256,62 @@
             // in multi-activity case, reparenting yields new reset scales coming from pinned task.
             startTransaction.setScale(pipLeash, scale, scale);
         } else {
-            // TODO(b/325481148): handle the case with invalid srcRectHint (using overlay).
+            final float scaleX = (float) destinationBounds.width() / startBounds.width();
+            final float scaleY = (float) destinationBounds.height() / startBounds.height();
+            final int overlaySize = PipContentOverlay.PipAppIconOverlay
+                    .getOverlaySize(mPipScheduler.mSwipePipToHomeAppBounds, destinationBounds);
+            SurfaceControl overlayLeash = mPipScheduler.mSwipePipToHomeOverlay;
+
+            startTransaction.setPosition(pipLeash, destinationBounds.left, destinationBounds.top)
+                    .setScale(pipLeash, scaleX, scaleY)
+                    .setWindowCrop(pipLeash, startBounds)
+                    .reparent(overlayLeash, pipLeash)
+                    .setLayer(overlayLeash, Integer.MAX_VALUE);
+
+            if (mPipTaskToken != null) {
+                SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
+                tx.addTransactionCommittedListener(mPipScheduler.getMainExecutor(),
+                                this::onClientDrawAtTransitionEnd)
+                        .setScale(overlayLeash, 1f, 1f)
+                        .setPosition(overlayLeash,
+                                (destinationBounds.width() - overlaySize) / 2f,
+                                (destinationBounds.height() - overlaySize) / 2f);
+                finishWct.setBoundsChangeTransaction(mPipTaskToken, tx);
+            }
         }
         startTransaction.apply();
-        finishCallback.onTransitionFinished(null);
+
+        // 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);
         return true;
     }
 
+    private void onClientDrawAtTransitionEnd() {
+        startOverlayFadeoutAnimation();
+    }
+
+    private void startOverlayFadeoutAnimation() {
+        ValueAnimator animator = ValueAnimator.ofFloat(1f, 0f);
+        animator.setDuration(CONTENT_OVERLAY_FADE_OUT_DELAY_MS);
+        animator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                super.onAnimationEnd(animation);
+                SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
+                tx.remove(mPipScheduler.mSwipePipToHomeOverlay);
+                tx.apply();
+                mPipScheduler.mSwipePipToHomeOverlay = null;
+            }
+        });
+        animator.addUpdateListener(animation -> {
+            float alpha = (float) animation.getAnimatedValue();
+            SurfaceControl.Transaction tx = new SurfaceControl.Transaction();
+            tx.setAlpha(mPipScheduler.mSwipePipToHomeOverlay, alpha).apply();
+        });
+        animator.start();
+    }
+
     private boolean startBoundsTypeEnterAnimation(@NonNull TransitionInfo info,
             @NonNull SurfaceControl.Transaction startTransaction,
             @NonNull SurfaceControl.Transaction finishTransaction,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasks.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasks.java
index 2616b8b..eebd133 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasks.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasks.java
@@ -16,7 +16,7 @@
 
 package com.android.wm.shell.recents;
 
-import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 import com.android.wm.shell.util.GroupedRecentTaskInfo;
 
 import java.util.List;
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 3707207..f9fcfac 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
@@ -49,11 +49,11 @@
 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.common.annotations.ExternalThread;
-import com.android.wm.shell.common.annotations.ShellMainThread;
 import com.android.wm.shell.desktopmode.DesktopModeStatus;
 import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
 import com.android.wm.shell.protolog.ShellProtoLogGroup;
+import com.android.wm.shell.shared.annotations.ExternalThread;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
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 235456c..3b4fb9f 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
@@ -1069,7 +1069,7 @@
         }
 
         private boolean allAppsAreTranslucent(ArrayList<TaskState> tasks) {
-            if (tasks == null || tasks.isEmpty()) {
+            if (tasks == null) {
                 return false;
             }
             for (int i = tasks.size() - 1; i >= 0; --i) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java
index 2b433e9..6aad4e2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java
@@ -18,11 +18,16 @@
 
 import android.annotation.IntDef;
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.app.ActivityManager;
 import android.graphics.Rect;
+import android.os.Bundle;
+import android.window.RemoteTransition;
 
-import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.internal.logging.InstanceId;
+import com.android.wm.shell.common.split.SplitScreenConstants.PersistentSnapPosition;
 import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 
 import java.util.concurrent.Executor;
 
@@ -72,6 +77,12 @@
         }
     }
 
+    /** Launches a pair of tasks into splitscreen */
+    void startTasks(int taskId1, @Nullable Bundle options1, int taskId2,
+            @Nullable Bundle options2, @SplitPosition int splitPosition,
+            @PersistentSnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition,
+            InstanceId instanceId);
+
     /** Registers listener that gets split screen callback. */
     void registerSplitScreenListener(@NonNull SplitScreenListener listener,
             @NonNull Executor executor);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
index 3e34c30..547457b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
@@ -90,7 +90,6 @@
 import com.android.wm.shell.common.SingleInstanceRemoteListener;
 import com.android.wm.shell.common.SyncTransactionQueue;
 import com.android.wm.shell.common.TransactionPool;
-import com.android.wm.shell.common.annotations.ExternalThread;
 import com.android.wm.shell.common.split.SplitScreenConstants.PersistentSnapPosition;
 import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition;
 import com.android.wm.shell.common.split.SplitScreenUtils;
@@ -99,6 +98,7 @@
 import com.android.wm.shell.draganddrop.DragAndDropPolicy;
 import com.android.wm.shell.protolog.ShellProtoLogGroup;
 import com.android.wm.shell.recents.RecentTasksController;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 import com.android.wm.shell.splitscreen.SplitScreen.StageType;
 import com.android.wm.shell.sysui.KeyguardChangeListener;
 import com.android.wm.shell.sysui.ShellCommandHandler;
@@ -138,6 +138,7 @@
     public static final int EXIT_REASON_RECREATE_SPLIT = 10;
     public static final int EXIT_REASON_FULLSCREEN_SHORTCUT = 11;
     public static final int EXIT_REASON_DESKTOP_MODE = 12;
+    public static final int EXIT_REASON_FULLSCREEN_REQUEST = 13;
     @IntDef(value = {
             EXIT_REASON_UNKNOWN,
             EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW,
@@ -151,7 +152,8 @@
             EXIT_REASON_CHILD_TASK_ENTER_PIP,
             EXIT_REASON_RECREATE_SPLIT,
             EXIT_REASON_FULLSCREEN_SHORTCUT,
-            EXIT_REASON_DESKTOP_MODE
+            EXIT_REASON_DESKTOP_MODE,
+            EXIT_REASON_FULLSCREEN_REQUEST
     })
     @Retention(RetentionPolicy.SOURCE)
     @interface ExitReason{}
@@ -504,6 +506,15 @@
         return mStageCoordinator.getActivateSplitPosition(taskInfo);
     }
 
+    /** Start two tasks in parallel as a splitscreen pair. */
+    public void startTasks(int taskId1, @Nullable Bundle options1, int taskId2,
+            @Nullable Bundle options2, @SplitPosition int splitPosition,
+            @PersistentSnapPosition int snapPosition,
+            @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
+        mStageCoordinator.startTasks(taskId1, options1, taskId2, options2, splitPosition,
+                snapPosition, remoteTransition, instanceId);
+    }
+
     /**
      * Move a task to split select
      * @param taskInfo the task being moved to split select
@@ -1054,6 +1065,8 @@
                 return "RECREATE_SPLIT";
             case EXIT_REASON_DESKTOP_MODE:
                 return "DESKTOP_MODE";
+            case EXIT_REASON_FULLSCREEN_REQUEST:
+                return "FULLSCREEN_REQUEST";
             default:
                 return "unknown reason, reason int = " + exitReason;
         }
@@ -1116,6 +1129,15 @@
         };
 
         @Override
+        public void startTasks(int taskId1, @Nullable Bundle options1, int taskId2,
+                @Nullable Bundle options2, int splitPosition, int snapPosition,
+                @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
+            mMainExecutor.execute(() -> SplitScreenController.this.startTasks(
+                    taskId1, options1, taskId2, options2, splitPosition, snapPosition,
+                    remoteTransition, instanceId));
+        }
+
+        @Override
         public void registerSplitScreenListener(SplitScreenListener listener, Executor executor) {
             if (mExecutors.containsKey(listener)) return;
 
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 d5434e3..fadc970 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
@@ -59,6 +59,7 @@
 import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DESKTOP_MODE;
 import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DEVICE_FOLDED;
 import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DRAG_DIVIDER;
+import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_FULLSCREEN_REQUEST;
 import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_FULLSCREEN_SHORTCUT;
 import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_RECREATE_SPLIT;
 import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_RETURN_HOME;
@@ -2615,6 +2616,13 @@
                     prepareEnterSplitScreen(out);
                     mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(),
                             TRANSIT_SPLIT_SCREEN_PAIR_OPEN, !mIsDropEntering);
+                } else if (inFullscreen && isSplitScreenVisible()) {
+                    // If the trigger task is in fullscreen and in split, exit split and place
+                    // task on top
+                    final int stageType = getStageOfTask(triggerTask.taskId);
+                    prepareExitSplitScreen(stageType, out);
+                    mSplitTransitions.setDismissTransition(transition, stageType,
+                            EXIT_REASON_FULLSCREEN_REQUEST);
                 }
             } else if (isOpening && inFullscreen) {
                 final int activityType = triggerTask.getActivityType();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
index 4465aef..3353c7b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
@@ -47,8 +47,8 @@
 import com.android.launcher3.icons.IconProvider;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.TransactionPool;
-import com.android.wm.shell.common.annotations.ShellSplashscreenThread;
 import com.android.wm.shell.protolog.ShellProtoLogGroup;
+import com.android.wm.shell.shared.annotations.ShellSplashscreenThread;
 
 /**
  * A class which able to draw splash screen or snapshot as the starting window for a task.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/sysui/ShellController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/sysui/ShellController.java
index 2f6edc2..5ced1fb 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/sysui/ShellController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/sysui/ShellController.java
@@ -45,7 +45,7 @@
 import com.android.wm.shell.common.DisplayInsetsController.OnInsetsChangedListener;
 import com.android.wm.shell.common.ExternalInterfaceBinder;
 import com.android.wm.shell.common.ShellExecutor;
-import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 
 import java.io.PrintWriter;
 import java.util.List;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactory.java
index a7e4b01..f0a2315 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactory.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactory.java
@@ -19,7 +19,7 @@
 import android.annotation.UiContext;
 import android.content.Context;
 
-import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactoryController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactoryController.java
index 7eed588..e4fcff0c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactoryController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewFactoryController.java
@@ -22,7 +22,7 @@
 import com.android.wm.shell.ShellTaskOrganizer;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.SyncTransactionQueue;
-import com.android.wm.shell.common.annotations.ExternalThread;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java
index cb2944c..c9185ae 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java
@@ -32,6 +32,7 @@
 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.shared.IHomeTransitionListener;
 import com.android.wm.shell.shared.TransitionUtil;
 
 /**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IHomeTransitionListener.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IHomeTransitionListener.aidl
deleted file mode 100644
index 72fba3b..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IHomeTransitionListener.aidl
+++ /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 com.android.wm.shell.transition;
-
-import android.window.RemoteTransition;
-import android.window.TransitionFilter;
-
-/**
- * Listener interface that Launcher attaches to SystemUI to get home activity transition callbacks
- * on the default display.
- */
-oneway interface IHomeTransitionListener {
-
-    /**
-     * Called when a transition changes the visibility of the home activity on the default display.
-     */
-    void onHomeVisibilityChanged(in boolean isVisible);
-}
-
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IShellTransitions.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IShellTransitions.aidl
deleted file mode 100644
index 7f4a8f1..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IShellTransitions.aidl
+++ /dev/null
@@ -1,55 +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.wm.shell.transition;
-
-import android.view.SurfaceControl;
-import android.window.RemoteTransition;
-import android.window.TransitionFilter;
-
-import com.android.wm.shell.transition.IHomeTransitionListener;
-
-/**
- * Interface that is exposed to remote callers to manipulate the transitions feature.
- */
-interface IShellTransitions {
-
-    /**
-     * Registers a remote transition handler.
-     */
-    oneway void registerRemote(in TransitionFilter filter,
-            in RemoteTransition remoteTransition) = 1;
-
-    /**
-     * Unregisters a remote transition handler.
-     */
-    oneway void unregisterRemote(in RemoteTransition remoteTransition) = 2;
-
-    /**
-     * Retrieves the apply-token used by transactions in Shell
-     */
-    IBinder getShellApplyToken() = 3;
-
-    /**
-     * Set listener that will receive callbacks about transitions involving home activity.
-     */
-    oneway void setHomeTransitionListener(in IHomeTransitionListener listener) = 4;
-
-    /**
-     * Returns a container surface for the home root task.
-     */
-    SurfaceControl getHomeTaskOverlayContainer() = 5;
-}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ShellTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ShellTransitions.java
deleted file mode 100644
index da39017..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ShellTransitions.java
+++ /dev/null
@@ -1,40 +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.wm.shell.transition;
-
-import android.annotation.NonNull;
-import android.window.RemoteTransition;
-import android.window.TransitionFilter;
-
-import com.android.wm.shell.common.annotations.ExternalThread;
-
-/**
- * Interface to manage remote transitions.
- */
-@ExternalThread
-public interface ShellTransitions {
-    /**
-     * Registers a remote transition.
-     */
-    default void registerRemote(@NonNull TransitionFilter filter,
-            @NonNull RemoteTransition remoteTransition) {}
-
-    /**
-     * Unregisters a remote transition.
-     */
-    default void unregisterRemote(@NonNull RemoteTransition remoteTransition) {}
-}
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 a77602b..437a00e 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
@@ -76,10 +76,13 @@
 import com.android.wm.shell.common.RemoteCallable;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.TransactionPool;
-import com.android.wm.shell.common.annotations.ExternalThread;
 import com.android.wm.shell.keyguard.KeyguardTransitionHandler;
 import com.android.wm.shell.protolog.ShellProtoLogGroup;
+import com.android.wm.shell.shared.IHomeTransitionListener;
+import com.android.wm.shell.shared.IShellTransitions;
+import com.android.wm.shell.shared.ShellTransitions;
 import com.android.wm.shell.shared.TransitionUtil;
+import com.android.wm.shell.shared.annotations.ExternalThread;
 import com.android.wm.shell.sysui.ShellCommandHandler;
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/UnfoldTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/UnfoldTransitionHandler.java
index c26604a..7c2ba45 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/UnfoldTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/UnfoldTransitionHandler.java
@@ -293,7 +293,13 @@
     @Override
     public void onFoldStateChanged(boolean isFolded) {
         if (isFolded) {
+            // Reset unfold animation finished flag on folding, so it could be used next time
+            // when we unfold the device as an indication that animation hasn't finished yet
             mAnimationFinished = false;
+
+            // If we are currently animating unfold animation we should finish it because
+            // the animation might not start and finish as the device was folded
+            finishTransitionIfNeeded();
         }
     }
 
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 9a48922..beead6a 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
@@ -90,12 +90,14 @@
     @Override
     @NonNull
     Rect calculateValidDragArea() {
+        final Context displayContext = mDisplayController.getDisplayContext(mTaskInfo.displayId);
+        if (displayContext == null) return new Rect();
         final int leftButtonsWidth = loadDimensionPixelSize(mContext.getResources(),
                 R.dimen.caption_left_buttons_width);
 
         // On a smaller screen, don't require as much empty space on screen, as offscreen
         // drags will be restricted too much.
-        final int requiredEmptySpaceId = mDisplayController.getDisplayContext(mTaskInfo.displayId)
+        final int requiredEmptySpaceId = displayContext
                 .getResources().getConfiguration().smallestScreenWidthDp >= 600
                 ? R.dimen.freeform_required_visible_empty_space_in_header :
                 R.dimen.small_screen_required_visible_empty_space_in_header;
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 6d2109c..a0f9c6b 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
@@ -25,22 +25,16 @@
 import static android.view.MotionEvent.ACTION_CANCEL;
 import static android.view.MotionEvent.ACTION_HOVER_ENTER;
 import static android.view.MotionEvent.ACTION_HOVER_EXIT;
+import static android.view.MotionEvent.ACTION_HOVER_MOVE;
+import static android.view.MotionEvent.ACTION_MOVE;
 import static android.view.MotionEvent.ACTION_UP;
 import static android.view.WindowInsets.Type.statusBars;
 
 import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
 import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT;
 import static com.android.wm.shell.compatui.AppCompatUtils.isSingleTopActivityTranslucent;
-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 static com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler.FREEFORM_ANIMATION_DURATION;
-import static com.android.wm.shell.windowdecor.MoveToDesktopAnimator.DRAG_FREEFORM_SCALE;
 
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
 import android.annotation.NonNull;
 import android.app.ActivityManager;
 import android.app.ActivityManager.RunningTaskInfo;
@@ -364,7 +358,7 @@
 
     private class DesktopModeTouchEventListener extends GestureDetector.SimpleOnGestureListener
             implements View.OnClickListener, View.OnTouchListener, View.OnLongClickListener,
-            View.OnGenericMotionListener , DragDetector.MotionEventHandler {
+            View.OnGenericMotionListener, DragDetector.MotionEventHandler {
         private static final int CLOSE_MAXIMIZE_MENU_DELAY_MS = 150;
 
         private final int mTaskId;
@@ -493,6 +487,12 @@
                         (int) e.getRawX(), (int) e.getRawY());
                 final boolean isTransparentCaption =
                         TaskInfoKt.isTransparentCaptionBarAppearance(decoration.mTaskInfo);
+                // MotionEvent's coordinates are relative to view, we want location in window
+                // to offset position relative to caption as a whole.
+                int[] viewLocation = new int[2];
+                v.getLocationInWindow(viewLocation);
+                final boolean isResizeEvent = decoration.shouldResizeListenerHandleEvent(e,
+                        new Point(viewLocation[0], viewLocation[1]));
                 // The caption window may be a spy window when the caption background is
                 // transparent, which means events will fall through to the app window. Make
                 // sure to cancel these events if they do not happen in the intersection of the
@@ -500,11 +500,11 @@
                 // the drag-move or other caption gestures should take priority outside those
                 // regions.
                 mShouldPilferCaptionEvents = !(downInCustomizableCaptionRegion
-                        && downInExclusionRegion && isTransparentCaption);
+                        && downInExclusionRegion && isTransparentCaption) && !isResizeEvent;
             }
 
             if (!mShouldPilferCaptionEvents) {
-                // The event will be handled by a window below.
+                // The event will be handled by a window below or pilfered by resize handler.
                 return false;
             }
             // Otherwise pilfer so that windows below receive cancellations for this gesture, and
@@ -551,8 +551,14 @@
                     // Re-hovering over any of the maximize menu views should keep the menu open by
                     // cancelling any attempts to close the menu.
                     mMainHandler.removeCallbacks(mCloseMaximizeWindowRunnable);
+                    if (id != R.id.maximize_window) {
+                        decoration.onMaximizeMenuHoverEnter(id, ev);
+                    }
                 }
                 return true;
+            } else if (ev.getAction() == ACTION_HOVER_MOVE
+                    && MaximizeMenu.Companion.isMaximizeMenuView(id)) {
+                decoration.onMaximizeMenuHoverMove(id, ev);
             } else if (ev.getAction() == ACTION_HOVER_EXIT) {
                 if (!decoration.isMaximizeMenuActive() && id == R.id.maximize_window) {
                     decoration.onMaximizeWindowHoverExit();
@@ -562,6 +568,8 @@
                     // menu view to another.
                     mMainHandler.postDelayed(mCloseMaximizeWindowRunnable,
                             CLOSE_MAXIMIZE_MENU_DELAY_MS);
+                } else if (MaximizeMenu.Companion.isMaximizeMenuView(id)) {
+                    decoration.onMaximizeMenuHoverExit(id, ev);
                 }
                 return true;
             }
@@ -604,7 +612,7 @@
                     // prevent the button's ripple effect from showing.
                     return !touchingButton;
                 }
-                case MotionEvent.ACTION_MOVE: {
+                case ACTION_MOVE: {
                     // If a decor's resize drag zone is active, don't also try to reposition it.
                     if (decoration.isHandlingDragResize()) break;
                     decoration.closeMaximizeMenu();
@@ -788,7 +796,7 @@
         if (relevantDecor == null || relevantDecor.checkTouchEventInCaption(ev)) {
             return;
         }
-
+        relevantDecor.updateHoverAndPressStatus(ev);
         final int action = ev.getActionMasked();
         if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
             if (!mTransitionDragActive) {
@@ -805,52 +813,55 @@
      */
     private void handleCaptionThroughStatusBar(MotionEvent ev,
             DesktopModeWindowDecoration relevantDecor) {
+        if (relevantDecor == null) {
+            if (ev.getActionMasked() == ACTION_UP) {
+                mMoveToDesktopAnimator = null;
+                mTransitionDragActive = false;
+            }
+            return;
+        }
         switch (ev.getActionMasked()) {
+            case MotionEvent.ACTION_HOVER_EXIT:
+            case MotionEvent.ACTION_HOVER_MOVE:
+            case MotionEvent.ACTION_HOVER_ENTER: {
+                relevantDecor.updateHoverAndPressStatus(ev);
+                break;
+            }
             case MotionEvent.ACTION_DOWN: {
                 // Begin drag through status bar if applicable.
-                if (relevantDecor != null) {
-                    mDragToDesktopAnimationStartBounds.set(
-                            relevantDecor.mTaskInfo.configuration.windowConfiguration.getBounds());
-                    boolean dragFromStatusBarAllowed = false;
-                    if (DesktopModeStatus.isEnabled()) {
-                        // In proto2 any full screen or multi-window task can be dragged to
-                        // freeform.
-                        final int windowingMode = relevantDecor.mTaskInfo.getWindowingMode();
-                        dragFromStatusBarAllowed = windowingMode == WINDOWING_MODE_FULLSCREEN
-                                || windowingMode == WINDOWING_MODE_MULTI_WINDOW;
-                    }
+                relevantDecor.checkTouchEvent(ev);
+                relevantDecor.updateHoverAndPressStatus(ev);
+                mDragToDesktopAnimationStartBounds.set(
+                        relevantDecor.mTaskInfo.configuration.windowConfiguration.getBounds());
+                boolean dragFromStatusBarAllowed = false;
+                if (DesktopModeStatus.isEnabled()) {
+                    // In proto2 any full screen or multi-window task can be dragged to
+                    // freeform.
+                    final int windowingMode = relevantDecor.mTaskInfo.getWindowingMode();
+                    dragFromStatusBarAllowed = windowingMode == WINDOWING_MODE_FULLSCREEN
+                            || windowingMode == WINDOWING_MODE_MULTI_WINDOW;
+                }
 
-                    if (dragFromStatusBarAllowed
-                            && relevantDecor.checkTouchEventInFocusedCaptionHandle(ev)) {
-                        mTransitionDragActive = true;
-                    }
+                if (dragFromStatusBarAllowed
+                        && relevantDecor.checkTouchEventInFocusedCaptionHandle(ev)) {
+                    mTransitionDragActive = true;
                 }
                 break;
             }
             case MotionEvent.ACTION_UP: {
-                if (relevantDecor == null) {
-                    mMoveToDesktopAnimator = null;
-                    mTransitionDragActive = false;
-                    return;
-                }
                 if (mTransitionDragActive) {
-                    final DesktopModeVisualIndicator.IndicatorType indicatorType =
-                            mDesktopTasksController.updateVisualIndicator(relevantDecor.mTaskInfo,
-                                    relevantDecor.mTaskSurface, ev.getRawX(), ev.getRawY());
+                    mDesktopTasksController.updateVisualIndicator(relevantDecor.mTaskInfo,
+                            relevantDecor.mTaskSurface, ev.getRawX(), ev.getRawY());
                     mTransitionDragActive = false;
-                    if (indicatorType == TO_DESKTOP_INDICATOR
-                            || indicatorType == TO_SPLIT_LEFT_INDICATOR
-                            || indicatorType == TO_SPLIT_RIGHT_INDICATOR) {
-                        if (DesktopModeStatus.isEnabled()) {
-                            animateToDesktop(relevantDecor, ev);
-                        }
-                        mMoveToDesktopAnimator = null;
-                        return;
-                    } else if (mMoveToDesktopAnimator != null) {
+                    if (mMoveToDesktopAnimator != null) {
+                        // Though this isn't a hover event, we need to update handle's hover state
+                        // as it likely will change.
+                        relevantDecor.updateHoverAndPressStatus(ev);
                         mDesktopTasksController.onDragPositioningEndThroughStatusBar(
                                 new PointF(ev.getRawX(), ev.getRawY()),
                                 relevantDecor.mTaskInfo,
-                                calculateFreeformBounds(ev.getDisplayId(), DRAG_FREEFORM_SCALE));
+                                calculateFreeformBounds(ev.getDisplayId(),
+                                        DesktopTasksController.DESKTOP_MODE_INITIAL_BOUNDS_SCALE));
                         mMoveToDesktopAnimator = null;
                         return;
                     } else {
@@ -859,11 +870,11 @@
                         mDesktopTasksController.releaseVisualIndicator();
                     }
                 }
-                relevantDecor.checkClickEvent(ev);
+                relevantDecor.checkTouchEvent(ev);
                 break;
             }
 
-            case MotionEvent.ACTION_MOVE: {
+            case ACTION_MOVE: {
                 if (relevantDecor == null) {
                     return;
                 }
@@ -919,54 +930,6 @@
                 (int) (screenHeight * (adjustmentPercentage + scale)));
     }
 
-    /**
-     * Blocks relayout until transition is finished and transitions to Desktop
-     */
-    private void animateToDesktop(DesktopModeWindowDecoration relevantDecor,
-            MotionEvent ev) {
-        centerAndMoveToDesktopWithAnimation(relevantDecor, ev);
-    }
-
-    /**
-     * Animates a window to the center, grows to freeform size, and transitions to Desktop Mode.
-     * @param relevantDecor the window decor of the task to be animated
-     * @param ev the motion event that triggers the animation
-     * TODO(b/315527000): This animation needs to be adjusted to allow snap left/right cases.
-     *  Currently fullscreen -> split snap still animates to center screen before readjusting.
-     */
-    private void centerAndMoveToDesktopWithAnimation(DesktopModeWindowDecoration relevantDecor,
-            MotionEvent ev) {
-        ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
-        animator.setDuration(FREEFORM_ANIMATION_DURATION);
-        final SurfaceControl sc = relevantDecor.mTaskSurface;
-        final Rect endBounds = calculateFreeformBounds(ev.getDisplayId(), DRAG_FREEFORM_SCALE);
-        final Transaction t = mTransactionFactory.get();
-        final float diffX = endBounds.centerX() - ev.getRawX();
-        final float diffY = endBounds.top - ev.getRawY();
-        final float startingX = ev.getRawX() - DRAG_FREEFORM_SCALE
-                * mDragToDesktopAnimationStartBounds.width() / 2;
-
-        animator.addUpdateListener(animation -> {
-            final float animatorValue = (float) animation.getAnimatedValue();
-            final float x = startingX + diffX * animatorValue;
-            final float y = ev.getRawY() + diffY * animatorValue;
-            t.setPosition(sc, x, y);
-            t.apply();
-        });
-        animator.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                mDesktopTasksController.onDragPositioningEndThroughStatusBar(
-                        new PointF(ev.getRawX(), ev.getRawY()),
-                        relevantDecor.mTaskInfo,
-                        calculateFreeformBounds(ev.getDisplayId(),
-                                DesktopTasksController
-                                        .DESKTOP_MODE_INITIAL_BOUNDS_SCALE));
-            }
-        });
-        animator.start();
-    }
-
     @Nullable
     private DesktopModeWindowDecoration getRelevantWindowDecor(MotionEvent ev) {
         final DesktopModeWindowDecoration focusedDecor = getFocusedDecor();
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 4c9e171..b865d94 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
@@ -19,6 +19,9 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.windowingModeToString;
+import static android.view.MotionEvent.ACTION_CANCEL;
+import static android.view.MotionEvent.ACTION_DOWN;
+import static android.view.MotionEvent.ACTION_UP;
 
 import static com.android.launcher3.icons.BaseIconFactory.MODE_DEFAULT;
 
@@ -401,7 +404,8 @@
         final int menuHeight = loadDimensionPixelSize(
                 resources, R.dimen.desktop_mode_maximize_menu_height);
 
-        float menuLeft = (mPositionInParent.x + maximizeButtonLocation[0]);
+        float menuLeft = (mPositionInParent.x + maximizeButtonLocation[0] - ((float) (menuWidth
+                - maximizeWindowButton.getWidth()) / 2));
         float menuTop = (mPositionInParent.y + captionHeight);
         final float menuRight = menuLeft + menuWidth;
         final float menuBottom = menuTop + menuHeight;
@@ -421,6 +425,10 @@
         return mHandleMenu != null;
     }
 
+    boolean shouldResizeListenerHandleEvent(MotionEvent e, Point offset) {
+        return mDragResizeListener != null && mDragResizeListener.shouldHandleEvent(e, offset);
+    }
+
     boolean isHandlingDragResize() {
         return mDragResizeListener != null && mDragResizeListener.isHandlingDragResize();
     }
@@ -451,7 +459,7 @@
      * until a resize event calls showResizeVeil below.
      */
     void createResizeVeil() {
-        mResizeVeil = new ResizeVeil(mContext, mAppIconDrawable, mTaskInfo,
+        mResizeVeil = new ResizeVeil(mContext, mAppIconDrawable, mTaskInfo, mTaskSurface,
                 mSurfaceControlBuilderSupplier, mDisplay, mSurfaceControlTransactionSupplier);
     }
 
@@ -709,27 +717,50 @@
     }
 
     /**
-     * Check a passed MotionEvent if a click has occurred on any button on this caption
+     * Check a passed MotionEvent if it has occurred on any button related to this decor.
      * Note this should only be called when a regular onClick is not possible
      * (i.e. the button was clicked through status bar layer)
      *
      * @param ev the MotionEvent to compare
      */
-    void checkClickEvent(MotionEvent ev) {
+    void checkTouchEvent(MotionEvent ev) {
         if (mResult.mRootView == null) return;
-        if (!isHandleMenuActive()) {
-            // Click if point in caption handle view
-            final View caption = mResult.mRootView.findViewById(R.id.desktop_mode_caption);
-            final View handle = caption.findViewById(R.id.caption_handle);
-            if (checkTouchEventInFocusedCaptionHandle(ev)) {
-                mOnCaptionButtonClickListener.onClick(handle);
-            }
-        } else {
-            mHandleMenu.checkClickEvent(ev);
+        final View caption = mResult.mRootView.findViewById(R.id.desktop_mode_caption);
+        final View handle = caption.findViewById(R.id.caption_handle);
+        final boolean inHandle = !isHandleMenuActive()
+                && checkTouchEventInFocusedCaptionHandle(ev);
+        final int action = ev.getActionMasked();
+        if (action == ACTION_UP && inHandle) {
+            handle.performClick();
+        }
+        if (isHandleMenuActive()) {
+            mHandleMenu.checkMotionEvent(ev);
             closeHandleMenuIfNeeded(ev);
         }
     }
 
+    /**
+     * Updates hover and pressed status of views in this decoration. Should only be called
+     * when status cannot be updated normally (i.e. the button is hovered through status
+     * bar layer).
+     * @param ev the MotionEvent to compare against.
+     */
+    void updateHoverAndPressStatus(MotionEvent ev) {
+        if (mResult.mRootView == null) return;
+        final View handle = mResult.mRootView.findViewById(R.id.caption_handle);
+        final boolean inHandle = !isHandleMenuActive()
+                && checkTouchEventInFocusedCaptionHandle(ev);
+        final int action = ev.getActionMasked();
+        // The comparison against ACTION_UP is needed for the cancel drag to desktop case.
+        handle.setHovered(inHandle && action != ACTION_UP);
+        // We want handle to remain pressed if the pointer moves outside of it during a drag.
+        handle.setPressed((inHandle && action == ACTION_DOWN)
+                || (handle.isPressed() && action != ACTION_UP && action != ACTION_CANCEL));
+        if (isHandleMenuActive()) {
+            mHandleMenu.checkMotionEvent(ev);
+        }
+    }
+
     private boolean pointInView(View v, float x, float y) {
         return v != null && v.getLeft() <= x && v.getRight() >= x
                 && v.getTop() <= y && v.getBottom() >= y;
@@ -767,7 +798,7 @@
      */
     private Region getGlobalExclusionRegion() {
         Region exclusionRegion;
-        if (mTaskInfo.isResizeable) {
+        if (mDragResizeListener != null && mTaskInfo.isResizeable) {
             exclusionRegion = mDragResizeListener.getCornersRegion();
         } else {
             exclusionRegion = new Region();
@@ -804,16 +835,34 @@
                 .setAnimatingTaskResize(animatingTaskResize);
     }
 
+    /** Called when there is a {@Link ACTION_HOVER_EXIT} on the maximize window button. */
     void onMaximizeWindowHoverExit() {
         ((DesktopModeAppControlsWindowDecorationViewHolder) mWindowDecorViewHolder)
                 .onMaximizeWindowHoverExit();
     }
 
+    /** Called when there is a {@Link ACTION_HOVER_ENTER} on the maximize window button. */
     void onMaximizeWindowHoverEnter() {
         ((DesktopModeAppControlsWindowDecorationViewHolder) mWindowDecorViewHolder)
                 .onMaximizeWindowHoverEnter();
     }
 
+    /** Called when there is a {@Link ACTION_HOVER_ENTER} on a view in the maximize menu. */
+    void onMaximizeMenuHoverEnter(int id, MotionEvent ev) {
+        mMaximizeMenu.onMaximizeMenuHoverEnter(id, ev);
+    }
+
+    /** Called when there is a {@Link ACTION_HOVER_MOVE} on a view in the maximize menu. */
+    void onMaximizeMenuHoverMove(int id, MotionEvent ev) {
+        mMaximizeMenu.onMaximizeMenuHoverMove(id, ev);
+    }
+
+    /** Called when there is a {@Link ACTION_HOVER_EXIT} on a view in the maximize menu. */
+    void onMaximizeMenuHoverExit(int id, MotionEvent ev) {
+        mMaximizeMenu.onMaximizeMenuHoverExit(id, ev);
+    }
+
+
     @Override
     public String toString() {
         return "{"
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
index e83e5d1e..97eb4a4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
@@ -31,6 +31,7 @@
 import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_TOP;
 
 import android.content.Context;
+import android.graphics.Point;
 import android.graphics.Rect;
 import android.graphics.Region;
 import android.hardware.input.InputManager;
@@ -321,6 +322,10 @@
         }
     }
 
+    boolean shouldHandleEvent(MotionEvent e, Point offset) {
+        return mInputEventReceiver.shouldHandleEvent(e, offset);
+    }
+
     boolean isHandlingDragResize() {
         return mInputEventReceiver.isHandlingEvents();
     }
@@ -408,18 +413,14 @@
             boolean result = false;
             // Check if this is a touch event vs mouse event.
             // Touch events are tracked in four corners. Other events are tracked in resize edges.
-            boolean isTouch = (e.getSource() & SOURCE_TOUCHSCREEN) == SOURCE_TOUCHSCREEN;
+            boolean isTouch = isTouchEvent(e);
             switch (e.getActionMasked()) {
                 case MotionEvent.ACTION_DOWN: {
-                    float x = e.getX(0);
-                    float y = e.getY(0);
-                    if (isTouch) {
-                        mShouldHandleEvents = isInCornerBounds(x, y);
-                    } else {
-                        mShouldHandleEvents = isInResizeHandleBounds(x, y);
-                    }
+                    mShouldHandleEvents = shouldHandleEvent(e, isTouch, new Point() /* offset */);
                     if (mShouldHandleEvents) {
                         mDragPointerId = e.getPointerId(0);
+                        float x = e.getX(0);
+                        float y = e.getY(0);
                         float rawX = e.getRawX(0);
                         float rawY = e.getRawY(0);
                         int ctrlType = calculateCtrlType(isTouch, x, y);
@@ -447,7 +448,6 @@
                 }
                 case MotionEvent.ACTION_UP:
                 case MotionEvent.ACTION_CANCEL: {
-                    mInputManager.pilferPointers(mInputChannel.getToken());
                     if (mShouldHandleEvents) {
                         int dragPointerIndex = e.findPointerIndex(mDragPointerId);
                         final Rect taskBounds = mCallback.onDragPositioningEnd(
@@ -638,5 +638,25 @@
                 mLastCursorType = cursorType;
             }
         }
+
+        private boolean shouldHandleEvent(MotionEvent e, Point offset) {
+            return shouldHandleEvent(e, isTouchEvent(e), offset);
+        }
+
+        private boolean shouldHandleEvent(MotionEvent e, boolean isTouch, Point offset) {
+            boolean result;
+            final float x = e.getX(0) + offset.x;
+            final float y = e.getY(0) + offset.y;
+            if (isTouch) {
+                result = isInCornerBounds(x, y);
+            } else {
+                result = isInResizeHandleBounds(x, y);
+            }
+            return result;
+        }
+
+        private boolean isTouchEvent(MotionEvent e) {
+            return (e.getSource() & SOURCE_TOUCHSCREEN) == SOURCE_TOUCHSCREEN;
+        }
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleImageButton.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleImageButton.kt
new file mode 100644
index 0000000..b21c3f5
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleImageButton.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.wm.shell.windowdecor
+
+import android.animation.ValueAnimator
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.ImageButton
+
+/**
+ * [ImageButton] for the handle at the top of fullscreen apps. Has custom hover
+ * and press handling to grow the handle on hover enter and shrink the handle on
+ * hover exit and press.
+ */
+class HandleImageButton (context: Context?, attrs: AttributeSet?) :
+    ImageButton(context, attrs) {
+    private val handleAnimator = ValueAnimator()
+
+    override fun onHoverChanged(hovered: Boolean) {
+        super.onHoverChanged(hovered)
+        if (hovered) {
+            animateHandle(HANDLE_HOVER_ANIM_DURATION, HANDLE_HOVER_ENTER_SCALE)
+        } else {
+            if (!isPressed) {
+                animateHandle(HANDLE_HOVER_ANIM_DURATION, HANDLE_DEFAULT_SCALE)
+            }
+        }
+    }
+
+    override fun setPressed(pressed: Boolean) {
+        if (isPressed != pressed) {
+            super.setPressed(pressed)
+            if (pressed) {
+                animateHandle(HANDLE_PRESS_ANIM_DURATION, HANDLE_PRESS_DOWN_SCALE)
+            } else {
+                animateHandle(HANDLE_PRESS_ANIM_DURATION, HANDLE_DEFAULT_SCALE)
+            }
+        }
+    }
+
+    private fun animateHandle(duration: Long, endScale: Float) {
+        if (handleAnimator.isRunning) {
+            handleAnimator.cancel()
+        }
+        handleAnimator.duration = duration
+        handleAnimator.setFloatValues(scaleX, endScale)
+        handleAnimator.addUpdateListener { animator ->
+            scaleX = animator.animatedValue as Float
+        }
+        handleAnimator.start()
+    }
+
+    companion object {
+        /** The duration of animations related to hover state. **/
+        private const val HANDLE_HOVER_ANIM_DURATION = 300L
+        /** The duration of animations related to pressed state. **/
+        private const val HANDLE_PRESS_ANIM_DURATION = 200L
+        /** Ending scale for hover enter. **/
+        private const val HANDLE_HOVER_ENTER_SCALE = 1.2f
+        /** Ending scale for press down. **/
+        private const val HANDLE_PRESS_DOWN_SCALE = 0.85f
+        /** Default scale for handle. **/
+        private const val HANDLE_DEFAULT_SCALE = 1f
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.java
index 3d0dd31..65adcee 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.java
@@ -20,6 +20,8 @@
 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.view.MotionEvent.ACTION_DOWN;
+import static android.view.MotionEvent.ACTION_UP;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -140,7 +142,8 @@
      * Set up interactive elements of handle menu's app info pill.
      */
     private void setupAppInfoPill(View handleMenu) {
-        final ImageButton collapseBtn = handleMenu.findViewById(R.id.collapse_menu_button);
+        final HandleMenuImageButton collapseBtn =
+                handleMenu.findViewById(R.id.collapse_menu_button);
         final ImageView appIcon = handleMenu.findViewById(R.id.application_icon);
         final TextView appName = handleMenu.findViewById(R.id.application_name);
         collapseBtn.setOnClickListener(mOnClickListener);
@@ -172,9 +175,9 @@
         final ColorStateList activeColorStateList = iconColors[1];
         final int windowingMode = mTaskInfo.getWindowingMode();
         fullscreenBtn.setImageTintList(windowingMode == WINDOWING_MODE_FULLSCREEN
-                        ? activeColorStateList : inActiveColorStateList);
+                ? activeColorStateList : inActiveColorStateList);
         splitscreenBtn.setImageTintList(windowingMode == WINDOWING_MODE_MULTI_WINDOW
-                        ? activeColorStateList : inActiveColorStateList);
+                ? activeColorStateList : inActiveColorStateList);
         floatingBtn.setImageTintList(windowingMode == WINDOWING_MODE_PINNED
                 ? activeColorStateList : inActiveColorStateList);
         desktopBtn.setImageTintList(windowingMode == WINDOWING_MODE_FREEFORM
@@ -243,24 +246,31 @@
     }
 
     /**
-     * Check a passed MotionEvent if a click has occurred on any button on this caption
-     * Note this should only be called when a regular onClick is not possible
+     * Check a passed MotionEvent if a click or hover has occurred on any button on this caption
+     * Note this should only be called when a regular onClick/onHover is not possible
      * (i.e. the button was clicked through status bar layer)
      *
      * @param ev the MotionEvent to compare against.
      */
-    void checkClickEvent(MotionEvent ev) {
+    void checkMotionEvent(MotionEvent ev) {
         final View handleMenu = mHandleMenuWindow.mWindowViewHost.getView();
-        final ImageButton collapse = handleMenu.findViewById(R.id.collapse_menu_button);
-        // Translate the input point from display coordinates to the same space as the collapse
-        // button, meaning its parent (app info pill view).
-        final PointF inputPoint = new PointF(ev.getX() - mHandleMenuPosition.x,
-                ev.getY() - mHandleMenuPosition.y);
-        if (pointInView(collapse, inputPoint.x, inputPoint.y)) {
-            mOnClickListener.onClick(collapse);
+        final HandleMenuImageButton collapse = handleMenu.findViewById(R.id.collapse_menu_button);
+        final PointF inputPoint = translateInputToLocalSpace(ev);
+        final boolean inputInCollapseButton = pointInView(collapse, inputPoint.x, inputPoint.y);
+        final int action = ev.getActionMasked();
+        collapse.setHovered(inputInCollapseButton && action != ACTION_UP);
+        collapse.setPressed(inputInCollapseButton && action == ACTION_DOWN);
+        if (action == ACTION_UP && inputInCollapseButton) {
+            collapse.performClick();
         }
     }
 
+    // Translate the input point from display coordinates to the same space as the handle menu.
+    private PointF translateInputToLocalSpace(MotionEvent ev) {
+        return new PointF(ev.getX() - mHandleMenuPosition.x,
+                ev.getY() - mHandleMenuPosition.y);
+    }
+
     /**
      * A valid menu input is one of the following:
      * An input that happens in the menu views.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuImageButton.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuImageButton.kt
new file mode 100644
index 0000000..7898567
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuImageButton.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.wm.shell.windowdecor
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.MotionEvent
+import android.widget.ImageButton
+
+/**
+ * A custom [ImageButton] for buttons inside handle menu that intentionally doesn't handle hovers.
+ * This is due to the hover events being handled by [DesktopModeWindowDecorViewModel]
+ * in order to take the status bar layer into account. Handling it in both classes results in a
+ * flicker when the hover moves from outside to inside status bar layer.
+ */
+class HandleMenuImageButton(context: Context?, attrs: AttributeSet?) :
+    ImageButton(context, attrs) {
+    override fun onHoverEvent(motionEvent: MotionEvent): Boolean {
+        return false
+    }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
index b82f7ca..899b7cc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
@@ -33,7 +33,11 @@
 import android.view.WindowManager
 import android.view.WindowlessWindowManager
 import android.widget.Button
+import android.widget.FrameLayout
+import android.widget.LinearLayout
 import android.window.TaskConstants
+import androidx.core.content.withStyledAttributes
+import com.android.internal.R.attr.colorAccentPrimary
 import com.android.wm.shell.R
 import com.android.wm.shell.RootTaskDisplayAreaOrganizer
 import com.android.wm.shell.common.DisplayController
@@ -70,6 +74,12 @@
     private val menuWidth = loadDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_width)
     private val menuHeight = loadDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_height)
 
+    private lateinit var snapRightButton: Button
+    private lateinit var snapLeftButton: Button
+    private lateinit var maximizeButton: Button
+    private lateinit var maximizeButtonLayout: FrameLayout
+    private lateinit var snapButtonsLayout: LinearLayout
+
     /** Position the menu relative to the caption's position. */
     fun positionMenu(position: PointF, t: Transaction) {
         menuPosition.set(position)
@@ -150,23 +160,23 @@
         maximizeMenuView.setOnGenericMotionListener(onGenericMotionListener)
         maximizeMenuView.setOnTouchListener(onTouchListener)
 
-        val maximizeButton = maximizeMenuView.requireViewById<Button>(
-                R.id.maximize_menu_maximize_button
-        )
+        maximizeButtonLayout = maximizeMenuView.requireViewById(
+                R.id.maximize_menu_maximize_button_layout)
+
+        maximizeButton = maximizeMenuView.requireViewById(R.id.maximize_menu_maximize_button)
         maximizeButton.setOnClickListener(onClickListener)
         maximizeButton.setOnGenericMotionListener(onGenericMotionListener)
 
-        val snapRightButton = maximizeMenuView.requireViewById<Button>(
-                R.id.maximize_menu_snap_right_button
-        )
+        snapRightButton = maximizeMenuView.requireViewById(R.id.maximize_menu_snap_right_button)
         snapRightButton.setOnClickListener(onClickListener)
         snapRightButton.setOnGenericMotionListener(onGenericMotionListener)
 
-        val snapLeftButton = maximizeMenuView.requireViewById<Button>(
-                R.id.maximize_menu_snap_left_button
-        )
+        snapLeftButton = maximizeMenuView.requireViewById(R.id.maximize_menu_snap_left_button)
         snapLeftButton.setOnClickListener(onClickListener)
         snapLeftButton.setOnGenericMotionListener(onGenericMotionListener)
+
+        snapButtonsLayout = maximizeMenuView.requireViewById(R.id.maximize_menu_snap_menu_layout)
+        snapButtonsLayout.setOnGenericMotionListener(onGenericMotionListener)
     }
 
     /**
@@ -190,11 +200,77 @@
         return maximizeMenu?.mWindowViewHost?.view?.isLaidOut ?: false
     }
 
+    fun onMaximizeMenuHoverEnter(viewId: Int, ev: MotionEvent) {
+        setSnapButtonsColorOnHover(viewId, ev)
+    }
+
+    fun onMaximizeMenuHoverMove(viewId: Int, ev: MotionEvent) {
+        setSnapButtonsColorOnHover(viewId, ev)
+    }
+
+    fun onMaximizeMenuHoverExit(id: Int, ev: MotionEvent) {
+        val inSnapMenuBounds = ev.x >= 0 && ev.x <= snapButtonsLayout.width &&
+                ev.y >= 0 && ev.y <= snapButtonsLayout.height
+        val colorList = decorWindowContext.getColorStateList(
+                R.color.desktop_mode_maximize_menu_button_color_selector)
+
+        if (id == R.id.maximize_menu_maximize_button) {
+            maximizeButton.background?.setTintList(colorList)
+            maximizeButtonLayout.setBackgroundResource(
+                    R.drawable.desktop_mode_maximize_menu_layout_background)
+        } else if (id == R.id.maximize_menu_snap_menu_layout && !inSnapMenuBounds) {
+            // After exiting the snap menu layout area, checks to see that user is not still
+            // hovering within the snap menu layout bounds which would indicate that the user is
+            // hovering over a snap button within the snap menu layout rather than having exited.
+            snapLeftButton.background?.setTintList(colorList)
+            snapLeftButton.background?.alpha = 255
+            snapRightButton.background?.setTintList(colorList)
+            snapRightButton.background?.alpha = 255
+            snapButtonsLayout.setBackgroundResource(
+                    R.drawable.desktop_mode_maximize_menu_layout_background)
+        }
+    }
+
+    private fun setSnapButtonsColorOnHover(viewId: Int, ev: MotionEvent) {
+        decorWindowContext.withStyledAttributes(null, intArrayOf(colorAccentPrimary), 0, 0) {
+            val materialColor = getColor(0, 0)
+            val snapMenuCenter = snapButtonsLayout.width / 2
+            if (viewId == R.id.maximize_menu_maximize_button) {
+                // Highlight snap maximize window button
+                maximizeButton.background?.setTint(materialColor)
+                maximizeButtonLayout.setBackgroundResource(
+                        R.drawable.desktop_mode_maximize_menu_layout_background_on_hover)
+            } else if (viewId == R.id.maximize_menu_snap_left_button ||
+                    (viewId == R.id.maximize_menu_snap_menu_layout && ev.x <= snapMenuCenter)) {
+                // Highlight snap left button
+                snapRightButton.background?.setTint(materialColor)
+                snapLeftButton.background?.setTint(materialColor)
+                snapButtonsLayout.setBackgroundResource(
+                        R.drawable.desktop_mode_maximize_menu_layout_background_on_hover)
+                snapRightButton.background?.alpha = 102
+                snapLeftButton.background?.alpha = 255
+            } else if (viewId == R.id.maximize_menu_snap_right_button ||
+                    (viewId == R.id.maximize_menu_snap_menu_layout && ev.x > snapMenuCenter)) {
+                // Highlight snap right button
+                snapRightButton.background?.setTint(materialColor)
+                snapLeftButton.background?.setTint(materialColor)
+                snapButtonsLayout.setBackgroundResource(
+                        R.drawable.desktop_mode_maximize_menu_layout_background_on_hover)
+                snapRightButton.background?.alpha = 255
+                snapLeftButton.background?.alpha = 102
+            }
+        }
+    }
+
     companion object {
         fun isMaximizeMenuView(@IdRes viewId: Int): Boolean {
-            return viewId == R.id.maximize_menu || viewId == R.id.maximize_menu_maximize_button ||
+            return viewId == R.id.maximize_menu ||
+                    viewId == R.id.maximize_menu_maximize_button ||
+                    viewId == R.id.maximize_menu_maximize_button_layout ||
                     viewId == R.id.maximize_menu_snap_left_button ||
-                    viewId == R.id.maximize_menu_snap_right_button
+                    viewId == R.id.maximize_menu_snap_right_button ||
+                    viewId == R.id.maximize_menu_snap_menu_layout ||
+                    viewId == R.id.maximize_menu_snap_menu_layout
         }
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MoveToDesktopAnimator.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MoveToDesktopAnimator.kt
index af05523..987aadf 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MoveToDesktopAnimator.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MoveToDesktopAnimator.kt
@@ -31,15 +31,16 @@
 
     private val animatedTaskWidth
         get() = dragToDesktopAnimator.animatedValue as Float * startBounds.width()
+    val scale: Float
+        get() = dragToDesktopAnimator.animatedValue as Float
     private val dragToDesktopAnimator: ValueAnimator = ValueAnimator.ofFloat(1f,
             DRAG_FREEFORM_SCALE)
             .setDuration(ANIMATION_DURATION.toLong())
             .apply {
                 val t = SurfaceControl.Transaction()
                 val cornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context)
-                addUpdateListener { animation ->
-                    val animatorValue = animation.animatedValue as Float
-                    t.setScale(taskSurface, animatorValue, animatorValue)
+                addUpdateListener {
+                    t.setScale(taskSurface, scale, scale)
                             .setCornerRadius(taskSurface, cornerRadius)
                             .apply()
                 }
@@ -90,9 +91,9 @@
     }
 
     /**
-     * Ends the animation, setting the scale and position to the final animation value
+     * Cancels the animation, intended to be used when another animator will take over.
      */
-    fun endAnimator() {
-        dragToDesktopAnimator.end()
+    fun cancelAnimator() {
+        dragToDesktopAnimator.cancel()
     }
 }
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.java
index b0d3b50..d072f8c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/ResizeVeil.java
@@ -23,13 +23,16 @@
 import android.app.ActivityManager.RunningTaskInfo;
 import android.content.Context;
 import android.content.res.Configuration;
+import android.graphics.Color;
 import android.graphics.PixelFormat;
+import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.view.Display;
 import android.view.LayoutInflater;
 import android.view.SurfaceControl;
 import android.view.SurfaceControlViewHost;
+import android.view.SurfaceSession;
 import android.view.View;
 import android.view.WindowManager;
 import android.view.WindowlessWindowManager;
@@ -37,6 +40,7 @@
 import android.window.TaskConstants;
 
 import com.android.wm.shell.R;
+import com.android.wm.shell.common.SurfaceUtils;
 
 import java.util.function.Supplier;
 
@@ -45,19 +49,36 @@
  */
 public class ResizeVeil {
     private static final int RESIZE_ALPHA_DURATION = 100;
+
+    private static final int VEIL_CONTAINER_LAYER = TaskConstants.TASK_CHILD_LAYER_RESIZE_VEIL;
+    /** The background is a child of the veil container layer and goes at the bottom. */
+    private static final int VEIL_BACKGROUND_LAYER = 0;
+    /** The icon is a child of the veil container layer and goes in front of the background. */
+    private static final int VEIL_ICON_LAYER = 1;
+
     private final Context mContext;
     private final Supplier<SurfaceControl.Builder> mSurfaceControlBuilderSupplier;
     private final Supplier<SurfaceControl.Transaction> mSurfaceControlTransactionSupplier;
+    private final SurfaceSession mSurfaceSession = new SurfaceSession();
     private final Drawable mAppIcon;
     private ImageView mIconView;
+    private int mIconSize;
     private SurfaceControl mParentSurface;
+
+    /** A container surface to host the veil background and icon child surfaces. */
     private SurfaceControl mVeilSurface;
+    /** A color surface for the veil background. */
+    private SurfaceControl mBackgroundSurface;
+    /** A surface that hosts a windowless window with the app icon. */
+    private SurfaceControl mIconSurface;
+
     private final RunningTaskInfo mTaskInfo;
     private SurfaceControlViewHost mViewHost;
     private final Display mDisplay;
     private ValueAnimator mVeilAnimator;
 
     public ResizeVeil(Context context, Drawable appIcon, RunningTaskInfo taskInfo,
+            SurfaceControl taskSurface,
             Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier, Display display,
             Supplier<SurfaceControl.Transaction> surfaceControlTransactionSupplier) {
         mContext = context;
@@ -65,6 +86,7 @@
         mSurfaceControlBuilderSupplier = surfaceControlBuilderSupplier;
         mSurfaceControlTransactionSupplier = surfaceControlTransactionSupplier;
         mTaskInfo = taskInfo;
+        mParentSurface = taskSurface;
         mDisplay = display;
         setupResizeVeil();
     }
@@ -73,34 +95,44 @@
      * Create the veil in its default invisible state.
      */
     private void setupResizeVeil() {
-        SurfaceControl.Transaction t = mSurfaceControlTransactionSupplier.get();
-        final SurfaceControl.Builder builder = mSurfaceControlBuilderSupplier.get();
-        mVeilSurface = builder
-                .setName("Resize veil of Task= " + mTaskInfo.taskId)
+        mVeilSurface = mSurfaceControlBuilderSupplier.get()
                 .setContainerLayer()
+                .setName("Resize veil of Task=" + mTaskInfo.taskId)
+                .setHidden(true)
+                .setParent(mParentSurface)
+                .setCallsite("ResizeVeil#setupResizeVeil")
                 .build();
-        View v = LayoutInflater.from(mContext)
-                .inflate(R.layout.desktop_mode_resize_veil, null);
+        mBackgroundSurface = SurfaceUtils.makeColorLayer(mVeilSurface,
+                "Resize veil background of Task=" + mTaskInfo.taskId, mSurfaceSession);
+        mIconSurface = mSurfaceControlBuilderSupplier.get()
+                .setName("Resize veil icon of Task= " + mTaskInfo.taskId)
+                .setContainerLayer()
+                .setParent(mVeilSurface)
+                .setHidden(true)
+                .setCallsite("ResizeVeil#setupResizeVeil")
+                .build();
 
-        t.setPosition(mVeilSurface, 0, 0)
-            .setLayer(mVeilSurface, TaskConstants.TASK_CHILD_LAYER_RESIZE_VEIL)
-            .apply();
-        Rect taskBounds = mTaskInfo.configuration.windowConfiguration.getBounds();
+        mIconSize = mContext.getResources()
+                .getDimensionPixelSize(R.dimen.desktop_mode_resize_veil_icon_size);
+        final View root = LayoutInflater.from(mContext)
+                .inflate(R.layout.desktop_mode_resize_veil, null /* root */);
+        mIconView = root.findViewById(R.id.veil_application_icon);
+        mIconView.setImageDrawable(mAppIcon);
+
         final WindowManager.LayoutParams lp =
-                new WindowManager.LayoutParams(taskBounds.width(),
-                        taskBounds.height(),
+                new WindowManager.LayoutParams(
+                        mIconSize,
+                        mIconSize,
                         WindowManager.LayoutParams.TYPE_APPLICATION,
                         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                         PixelFormat.TRANSPARENT);
-        lp.setTitle("Resize veil of Task=" + mTaskInfo.taskId);
+        lp.setTitle("Resize veil icon window of Task=" + mTaskInfo.taskId);
         lp.setTrustedOverlay();
-        WindowlessWindowManager windowManager = new WindowlessWindowManager(mTaskInfo.configuration,
-                mVeilSurface, null /* hostInputToken */);
-        mViewHost = new SurfaceControlViewHost(mContext, mDisplay, windowManager, "ResizeVeil");
-        mViewHost.setView(v, lp);
 
-        mIconView = mViewHost.getView().findViewById(R.id.veil_application_icon);
-        mIconView.setImageDrawable(mAppIcon);
+        final WindowlessWindowManager wwm = new WindowlessWindowManager(mTaskInfo.configuration,
+                mIconSurface, null /* hostInputToken */);
+        mViewHost = new SurfaceControlViewHost(mContext, mDisplay, wwm, "ResizeVeil");
+        mViewHost.setView(root, lp);
     }
 
     /**
@@ -120,46 +152,74 @@
             mParentSurface = parentSurface;
         }
 
-        int backgroundColorId = getBackgroundColorId();
-        mViewHost.getView().setBackgroundColor(mContext.getColor(backgroundColorId));
+        t.show(mVeilSurface);
+        t.setLayer(mVeilSurface, VEIL_CONTAINER_LAYER);
+        t.setLayer(mIconSurface, VEIL_ICON_LAYER);
+        t.setLayer(mBackgroundSurface, VEIL_BACKGROUND_LAYER);
+        t.setColor(mBackgroundSurface,
+                Color.valueOf(mContext.getColor(getBackgroundColorId())).getComponents());
 
         relayout(taskBounds, t);
         if (fadeIn) {
             cancelAnimation();
+            final SurfaceControl.Transaction veilAnimT = mSurfaceControlTransactionSupplier.get();
             mVeilAnimator = new ValueAnimator();
             mVeilAnimator.setFloatValues(0f, 1f);
             mVeilAnimator.setDuration(RESIZE_ALPHA_DURATION);
             mVeilAnimator.addUpdateListener(animation -> {
-                t.setAlpha(mVeilSurface, mVeilAnimator.getAnimatedFraction());
-                t.apply();
+                veilAnimT.setAlpha(mBackgroundSurface, mVeilAnimator.getAnimatedFraction());
+                veilAnimT.apply();
             });
             mVeilAnimator.addListener(new AnimatorListenerAdapter() {
                 @Override
+                public void onAnimationStart(Animator animation) {
+                    veilAnimT.show(mBackgroundSurface)
+                            .setAlpha(mBackgroundSurface, 0)
+                            .apply();
+                }
+
+                @Override
                 public void onAnimationEnd(Animator animation) {
-                    t.setAlpha(mVeilSurface, 1);
-                    t.apply();
+                    veilAnimT.setAlpha(mBackgroundSurface, 1).apply();
                 }
             });
 
+            final SurfaceControl.Transaction iconAnimT = mSurfaceControlTransactionSupplier.get();
             final ValueAnimator iconAnimator = new ValueAnimator();
             iconAnimator.setFloatValues(0f, 1f);
             iconAnimator.setDuration(RESIZE_ALPHA_DURATION);
             iconAnimator.addUpdateListener(animation -> {
-                mIconView.setAlpha(animation.getAnimatedFraction());
+                iconAnimT.setAlpha(mIconSurface, animation.getAnimatedFraction());
+                iconAnimT.apply();
             });
+            iconAnimator.addListener(new AnimatorListenerAdapter() {
+                @Override
+                public void onAnimationStart(Animator animation) {
+                    iconAnimT.show(mIconSurface)
+                            .setAlpha(mIconSurface, 0)
+                            .apply();
+                }
 
-            t.show(mVeilSurface)
-                    .addTransactionCommittedListener(
-                            mContext.getMainExecutor(), () -> {
-                                mVeilAnimator.start();
-                                iconAnimator.start();
-                            })
-                    .setAlpha(mVeilSurface, 0);
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    iconAnimT.setAlpha(mIconSurface, 1).apply();
+                }
+            });
+            // Let the animators show it with the correct alpha value once the animation starts.
+            t.hide(mIconSurface);
+            t.hide(mBackgroundSurface);
+            t.apply();
+
+            mVeilAnimator.start();
+            iconAnimator.start();
         } else {
-            // Show the veil immediately at full opacity.
-            t.show(mVeilSurface).setAlpha(mVeilSurface, 1);
+            // Show the veil immediately.
+            t.show(mIconSurface);
+            t.show(mBackgroundSurface);
+            t.setAlpha(mIconSurface, 1);
+            t.setAlpha(mBackgroundSurface, 1);
+            t.apply();
         }
-        mViewHost.getView().getViewRootImpl().applyTransactionOnDraw(t);
     }
 
     /**
@@ -175,8 +235,9 @@
      * @param newBounds bounds to update veil to.
      */
     private void relayout(Rect newBounds, SurfaceControl.Transaction t) {
-        mViewHost.relayout(newBounds.width(), newBounds.height());
         t.setWindowCrop(mVeilSurface, newBounds.width(), newBounds.height());
+        final PointF iconPosition = calculateAppIconPosition(newBounds);
+        t.setPosition(mIconSurface, iconPosition.x, iconPosition.y);
         t.setPosition(mParentSurface, newBounds.left, newBounds.top);
         t.setWindowCrop(mParentSurface, newBounds.width(), newBounds.height());
     }
@@ -204,7 +265,7 @@
             mVeilAnimator.end();
         }
         relayout(newBounds, t);
-        mViewHost.getView().getViewRootImpl().applyTransactionOnDraw(t);
+        t.apply();
     }
 
     /**
@@ -217,14 +278,16 @@
         mVeilAnimator.setDuration(RESIZE_ALPHA_DURATION);
         mVeilAnimator.addUpdateListener(animation -> {
             SurfaceControl.Transaction t = mSurfaceControlTransactionSupplier.get();
-            t.setAlpha(mVeilSurface, 1 - mVeilAnimator.getAnimatedFraction());
+            t.setAlpha(mBackgroundSurface, 1 - mVeilAnimator.getAnimatedFraction());
+            t.setAlpha(mIconSurface, 1 - mVeilAnimator.getAnimatedFraction());
             t.apply();
         });
         mVeilAnimator.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
                 SurfaceControl.Transaction t = mSurfaceControlTransactionSupplier.get();
-                t.hide(mVeilSurface);
+                t.hide(mBackgroundSurface);
+                t.hide(mIconSurface);
                 t.apply();
             }
         });
@@ -242,6 +305,11 @@
         }
     }
 
+    private PointF calculateAppIconPosition(Rect parentBounds) {
+        return new PointF((float) parentBounds.width() / 2 - (float) mIconSize / 2,
+                (float) parentBounds.height() / 2 - (float) mIconSize / 2);
+    }
+
     private void cancelAnimation() {
         if (mVeilAnimator != null) {
             mVeilAnimator.removeAllUpdateListeners();
@@ -260,11 +328,19 @@
             mViewHost.release();
             mViewHost = null;
         }
+        final SurfaceControl.Transaction t = mSurfaceControlTransactionSupplier.get();
+        if (mBackgroundSurface != null) {
+            t.remove(mBackgroundSurface);
+            mBackgroundSurface = null;
+        }
+        if (mIconSurface != null) {
+            t.remove(mIconSurface);
+            mIconSurface = null;
+        }
         if (mVeilSurface != null) {
-            final SurfaceControl.Transaction t = mSurfaceControlTransactionSupplier.get();
             t.remove(mVeilSurface);
             mVeilSurface = null;
-            t.apply();
         }
+        t.apply();
     }
 }
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 b94989d..12e395d 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
@@ -24,6 +24,7 @@
 import android.tools.flicker.legacy.LegacyFlickerTestFactory
 import android.tools.helpers.WindowUtils
 import android.tools.traces.parsers.toFlickerComponent
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.helpers.SimpleAppHelper
 import com.android.server.wm.flicker.testapp.ActivityOptions
@@ -143,6 +144,10 @@
         }
     }
 
+    @FlakyTest(bugId = 293133362)
+    @Test
+    override fun entireScreenCovered() = super.entireScreenCovered()
+
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
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 9b51538..e85da30 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
@@ -18,7 +18,6 @@
 
 import android.Manifest
 import android.platform.test.annotations.Postsubmit
-import android.tools.NavBar
 import android.tools.Rotation
 import android.tools.traces.component.ComponentNameMatcher
 import android.tools.device.apphelpers.NetflixAppHelper
@@ -26,6 +25,7 @@
 import android.tools.flicker.legacy.FlickerBuilder
 import android.tools.flicker.legacy.LegacyFlickerTest
 import android.tools.flicker.legacy.LegacyFlickerTestFactory
+import android.tools.helpers.WindowUtils
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.statusBarLayerPositionAtEnd
 import org.junit.Assume
@@ -62,6 +62,8 @@
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
 open class NetflixEnterPipTest(flicker: LegacyFlickerTest) : AppsEnterPipTransition(flicker) {
     override val standardAppHelper: NetflixAppHelper = NetflixAppHelper(instrumentation)
+    private val startingBounds = WindowUtils.getDisplayBounds(Rotation.ROTATION_90)
+    private val endingBounds = WindowUtils.getDisplayBounds(Rotation.ROTATION_0)
 
     override val permissions: Array<String> = arrayOf(Manifest.permission.POST_NOTIFICATIONS)
 
@@ -134,6 +136,31 @@
         // Netflix plays in immersive fullscreen mode, so taskbar will be gone at some point
     }
 
+    @Postsubmit
+    @Test
+    override fun pipWindowRemainInsideVisibleBounds() {
+        // during the transition we assert the center point is within the display bounds, since it
+        // might go outside of bounds as we resize from landscape fullscreen to destination bounds,
+        // and once the animation is over we assert that it's fully within the display bounds, at
+        // which point the device also performs orientation change from landscape to portrait
+        flicker.assertWmVisibleRegion(standardAppHelper.packageNameMatcher) {
+            regionsCenterPointInside(startingBounds).then().coversAtMost(endingBounds)
+        }
+    }
+
+    @Postsubmit
+    @Test
+    override fun pipLayerOrOverlayRemainInsideVisibleBounds() {
+        // during the transition we assert the center point is within the display bounds, since it
+        // might go outside of bounds as we resize from landscape fullscreen to destination bounds,
+        // and once the animation is over we assert that it's fully within the display bounds, at
+        // which point the device also performs orientation change from landscape to portrait
+        // since Netflix uses source rect hint, there is no PiP overlay present
+        flicker.assertLayersVisibleRegion(standardAppHelper.packageNameMatcher) {
+            regionsCenterPointInside(startingBounds).then().coversAtMost(endingBounds)
+        }
+    }
+
     companion object {
         /**
          * Creates the test configurations.
@@ -145,8 +172,7 @@
         @JvmStatic
         fun getParams() =
             LegacyFlickerTestFactory.nonRotationTests(
-                supportedRotations = listOf(Rotation.ROTATION_0),
-                supportedNavigationModes = listOf(NavBar.MODE_GESTURAL)
+                supportedRotations = listOf(Rotation.ROTATION_0)
             )
     }
 }
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
new file mode 100644
index 0000000..de8e7c3
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipToOtherOrientationTest.kt
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.flicker.pip.apps
+
+import android.Manifest
+import android.platform.test.annotations.Postsubmit
+import android.tools.Rotation
+import android.tools.traces.component.ComponentNameMatcher
+import android.tools.device.apphelpers.YouTubeAppHelper
+import android.tools.flicker.junit.FlickerParametersRunnerFactory
+import android.tools.flicker.legacy.FlickerBuilder
+import android.tools.flicker.legacy.LegacyFlickerTest
+import android.tools.flicker.legacy.LegacyFlickerTestFactory
+import android.tools.helpers.WindowUtils
+import androidx.test.filters.RequiresDevice
+import com.android.server.wm.flicker.statusBarLayerPositionAtEnd
+import org.junit.Assume
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test entering pip from YouTube app by interacting with the app UI
+ *
+ * To run this test: `atest WMShellFlickerTests:YouTubeEnterPipTest`
+ *
+ * Actions:
+ * ```
+ *     Launch YouTube and start playing a video
+ *     Make the video fullscreen, aka immersive mode
+ *     Go home to enter PiP
+ * ```
+ *
+ * Notes:
+ * ```
+ *     1. Some default assertions (e.g., nav bar, status bar and screen covered)
+ *        are inherited from [PipTransition]
+ *     2. Part of the test setup occurs automatically via
+ *        [android.tools.flicker.legacy.runner.TransitionRunner],
+ *        including configuring navigation mode, initial orientation and ensuring no
+ *        apps are running before setup
+ * ```
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
[email protected](FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+open class YouTubeEnterPipToOtherOrientationTest(flicker: LegacyFlickerTest) :
+    YouTubeEnterPipTest(flicker) {
+    override val standardAppHelper: YouTubeAppHelper = YouTubeAppHelper(instrumentation)
+    private val startingBounds = WindowUtils.getDisplayBounds(Rotation.ROTATION_90)
+    private val endingBounds = WindowUtils.getDisplayBounds(Rotation.ROTATION_0)
+
+    override val permissions: Array<String> = arrayOf(Manifest.permission.POST_NOTIFICATIONS)
+
+    override val defaultEnterPip: FlickerBuilder.() -> Unit = {
+        setup {
+            standardAppHelper.launchViaIntent(
+                wmHelper,
+                YouTubeAppHelper.getYoutubeVideoIntent("HPcEAtoXXLA"),
+                ComponentNameMatcher(YouTubeAppHelper.PACKAGE_NAME, "")
+            )
+            standardAppHelper.enterFullscreen()
+            standardAppHelper.waitForVideoPlaying()
+        }
+    }
+
+    override val thisTransition: FlickerBuilder.() -> Unit = {
+        transitions { tapl.goHomeFromImmersiveFullscreenApp() }
+    }
+
+    @Postsubmit
+    @Test
+    override fun taskBarLayerIsVisibleAtStartAndEnd() {
+        Assume.assumeTrue(flicker.scenario.isTablet)
+        // YouTube starts in immersive fullscreen mode, so taskbar bar is not visible at start
+        flicker.assertLayersStart { this.isInvisible(ComponentNameMatcher.TASK_BAR) }
+        flicker.assertLayersEnd { this.isVisible(ComponentNameMatcher.TASK_BAR) }
+    }
+
+    @Postsubmit
+    @Test
+    override fun pipWindowRemainInsideVisibleBounds() {
+        // during the transition we assert the center point is within the display bounds, since it
+        // might go outside of bounds as we resize from landscape fullscreen to destination bounds,
+        // and once the animation is over we assert that it's fully within the display bounds, at
+        // which point the device also performs orientation change from landscape to portrait
+        flicker.assertWmVisibleRegion(standardAppHelper.packageNameMatcher) {
+            regionsCenterPointInside(startingBounds).then().coversAtMost(endingBounds)
+        }
+    }
+
+    @Postsubmit
+    @Test
+    override fun pipLayerOrOverlayRemainInsideVisibleBounds() {
+        // during the transition we assert the center point is within the display bounds, since it
+        // might go outside of bounds as we resize from landscape fullscreen to destination bounds,
+        // and once the animation is over we assert that it's fully within the display bounds, at
+        // which point the device also performs orientation change from landscape to portrait
+        // since YouTube uses source rect hint, there is no PiP overlay present
+        flicker.assertLayersVisibleRegion(standardAppHelper.packageNameMatcher) {
+            regionsCenterPointInside(startingBounds).then().coversAtMost(endingBounds)
+        }
+    }
+
+    @Postsubmit
+    @Test
+    override fun taskBarWindowIsAlwaysVisible() {
+        // YouTube plays in immersive fullscreen mode, so taskbar will be gone at some point
+    }
+
+    @Postsubmit
+    @Test
+    override fun statusBarLayerIsVisibleAtStartAndEnd() {
+        // YouTube starts in immersive fullscreen mode, so status bar is not visible at start
+        flicker.assertLayersStart { this.isInvisible(ComponentNameMatcher.STATUS_BAR) }
+        flicker.assertLayersEnd { this.isVisible(ComponentNameMatcher.STATUS_BAR) }
+    }
+
+    @Postsubmit
+    @Test
+    override fun statusBarLayerPositionAtStartAndEnd() {
+        // YouTube starts in immersive fullscreen mode, so status bar is not visible at start
+        flicker.statusBarLayerPositionAtEnd()
+    }
+
+    @Postsubmit
+    @Test
+    override fun statusBarWindowIsAlwaysVisible() {
+        // YouTube plays in immersive fullscreen mode, so taskbar will be gone at some point
+    }
+
+    companion object {
+        /**
+         * Creates the test configurations.
+         *
+         * See [LegacyFlickerTestFactory.nonRotationTests] for configuring repetitions, screen
+         * orientation and navigation modes.
+         */
+        @Parameterized.Parameters(name = "{0}")
+        @JvmStatic
+        fun getParams() =
+            LegacyFlickerTestFactory.nonRotationTests(
+                supportedRotations = listOf(Rotation.ROTATION_0)
+            )
+    }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/utils/SplitScreenUtils.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/utils/SplitScreenUtils.kt
index 4e9a9d6..9cc3a98 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/utils/SplitScreenUtils.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/utils/SplitScreenUtils.kt
@@ -179,12 +179,13 @@
         val displayBounds =
             wmHelper.currentState.layerState.displays.firstOrNull { !it.isVirtual }?.layerStackSpace
                 ?: error("Display not found")
+        val swipeXCoordinate = displayBounds.centerX() / 2
 
         // Pull down the notifications
         device.swipe(
-            displayBounds.centerX(),
+            swipeXCoordinate,
             5,
-            displayBounds.centerX(),
+            swipeXCoordinate,
             displayBounds.bottom,
             50 /* steps */
         )
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/animation/PhysicsAnimatorTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/animation/PhysicsAnimatorTest.kt
deleted file mode 100644
index e727491..0000000
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/animation/PhysicsAnimatorTest.kt
+++ /dev/null
@@ -1,627 +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.wm.shell.animation
-
-import android.testing.AndroidTestingRunner
-import android.testing.TestableLooper
-import android.util.ArrayMap
-import android.view.View
-import android.view.ViewGroup
-import android.widget.FrameLayout
-import androidx.dynamicanimation.animation.DynamicAnimation
-import androidx.dynamicanimation.animation.FloatPropertyCompat
-import androidx.dynamicanimation.animation.SpringForce
-import androidx.test.filters.SmallTest
-import com.android.wm.shell.ShellTestCase
-import com.android.wm.shell.animation.PhysicsAnimator.EndListener
-import com.android.wm.shell.animation.PhysicsAnimator.UpdateListener
-import com.android.wm.shell.animation.PhysicsAnimatorTestUtils.clearAnimationUpdateFrames
-import com.android.wm.shell.animation.PhysicsAnimatorTestUtils.getAnimationUpdateFrames
-import com.android.wm.shell.animation.PhysicsAnimatorTestUtils.verifyAnimationUpdateFrames
-import org.junit.After
-import org.junit.Assert
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertFalse
-import org.junit.Assert.assertNotEquals
-import org.junit.Assert.assertNotNull
-import org.junit.Assert.assertTrue
-import org.junit.Before
-import org.junit.Ignore
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.anyFloat
-import org.mockito.Mockito
-import org.mockito.Mockito.mock
-import org.mockito.Mockito.times
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyNoMoreInteractions
-import org.mockito.MockitoAnnotations
-
[email protected]
-@RunWith(AndroidTestingRunner::class)
-@SmallTest
-class PhysicsAnimatorTest : ShellTestCase() {
-    private lateinit var viewGroup: ViewGroup
-    private lateinit var testView: View
-    private lateinit var testView2: View
-
-    private lateinit var animator: PhysicsAnimator<View>
-
-    private val springConfig = PhysicsAnimator.SpringConfig(
-            SpringForce.STIFFNESS_LOW, SpringForce.DAMPING_RATIO_NO_BOUNCY)
-    private val flingConfig = PhysicsAnimator.FlingConfig(2f)
-
-    private lateinit var mockUpdateListener: UpdateListener<View>
-    private lateinit var mockEndListener: EndListener<View>
-    private lateinit var mockEndAction: Runnable
-
-    private fun <T> eq(value: T): T = Mockito.eq(value) ?: value
-
-    @Before
-    fun setup() {
-        MockitoAnnotations.initMocks(this)
-
-        mockUpdateListener = mock(UpdateListener::class.java) as UpdateListener<View>
-        mockEndListener = mock(EndListener::class.java) as EndListener<View>
-        mockEndAction = mock(Runnable::class.java)
-
-        viewGroup = FrameLayout(context)
-        testView = View(context)
-        testView2 = View(context)
-        viewGroup.addView(testView)
-        viewGroup.addView(testView2)
-
-        PhysicsAnimatorTestUtils.prepareForTest()
-
-        // Most of our tests involve checking the end state of animations, so we want calls that
-        // start animations to block the test thread until the animations have ended.
-        PhysicsAnimatorTestUtils.setAllAnimationsBlock(true)
-
-        animator = PhysicsAnimator.getInstance(testView)
-    }
-
-    @After
-    fun tearDown() {
-        PhysicsAnimatorTestUtils.tearDown()
-    }
-
-    @Test
-    fun testOneAnimatorPerView() {
-        assertEquals(animator, PhysicsAnimator.getInstance(testView))
-        assertEquals(PhysicsAnimator.getInstance(testView), PhysicsAnimator.getInstance(testView))
-        assertNotEquals(animator, PhysicsAnimator.getInstance(testView2))
-    }
-
-    @Test
-    fun testSpringOneProperty() {
-        animator
-                .spring(DynamicAnimation.TRANSLATION_X, 50f, springConfig)
-                .start()
-
-        assertEquals(testView.translationX, 50f, 1f)
-    }
-
-    @Test
-    fun testSpringMultipleProperties() {
-        animator
-                .spring(DynamicAnimation.TRANSLATION_X, 10f, springConfig)
-                .spring(DynamicAnimation.TRANSLATION_Y, 50f, springConfig)
-                .spring(DynamicAnimation.SCALE_Y, 1.1f, springConfig)
-                .start()
-
-        assertEquals(10f, testView.translationX, 1f)
-        assertEquals(50f, testView.translationY, 1f)
-        assertEquals(1.1f, testView.scaleY, 0.01f)
-    }
-
-    @Test
-    fun testFling() {
-        val startTime = System.currentTimeMillis()
-
-        animator
-                .fling(DynamicAnimation.TRANSLATION_X, 1000f /* startVelocity */, flingConfig)
-                .fling(DynamicAnimation.TRANSLATION_Y, 500f, flingConfig)
-                .start()
-
-        val elapsedTimeSeconds = (System.currentTimeMillis() - startTime) / 1000f
-
-        // If the fling worked, the view should be somewhere between its starting position and the
-        // and the theoretical no-friction maximum of startVelocity (in pixels per second)
-        // multiplied by elapsedTimeSeconds. We can't calculate an exact expected location for a
-        // fling, so this is close enough.
-        assertTrue(testView.translationX > 0f)
-        assertTrue(testView.translationX < 1000f * elapsedTimeSeconds)
-        assertTrue(testView.translationY > 0f)
-        assertTrue(testView.translationY < 500f * elapsedTimeSeconds)
-    }
-
-    @Test
-    @Throws(InterruptedException::class)
-    @Ignore("Increasingly flaky")
-    fun testEndListenersAndActions() {
-        PhysicsAnimatorTestUtils.setAllAnimationsBlock(false)
-        animator
-                .spring(DynamicAnimation.TRANSLATION_X, 10f, springConfig)
-                .spring(DynamicAnimation.TRANSLATION_Y, 500f, springConfig)
-                .addEndListener(mockEndListener)
-                .withEndActions(mockEndAction::run)
-                .start()
-
-        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(animator, DynamicAnimation.TRANSLATION_X)
-
-        // Once TRANSLATION_X is done, the view should be at x = 10...
-        assertEquals(10f, testView.translationX, 1f)
-
-        // / ...TRANSLATION_Y should still be running...
-        assertTrue(animator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Y))
-
-        // ...and our end listener should have been called with x = 10, velocity = 0, and allEnded =
-        // false since TRANSLATION_Y is still running.
-        verify(mockEndListener).onAnimationEnd(
-                testView,
-                DynamicAnimation.TRANSLATION_X,
-                wasFling = false,
-                canceled = false,
-                finalValue = 10f,
-                finalVelocity = 0f,
-                allRelevantPropertyAnimsEnded = false)
-        verifyNoMoreInteractions(mockEndListener)
-
-        // The end action should not have been run yet.
-        verify(mockEndAction, times(0)).run()
-
-        // Block until TRANSLATION_Y finishes.
-        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(animator, DynamicAnimation.TRANSLATION_Y)
-
-        // The view should have been moved.
-        assertEquals(10f, testView.translationX, 1f)
-        assertEquals(500f, testView.translationY, 1f)
-
-        // The end listener should have been called, this time with TRANSLATION_Y, y = 50, and
-        // allEnded = true.
-        verify(mockEndListener).onAnimationEnd(
-                testView,
-                DynamicAnimation.TRANSLATION_Y,
-                wasFling = false,
-                canceled = false,
-                finalValue = 500f,
-                finalVelocity = 0f,
-                allRelevantPropertyAnimsEnded = true)
-        verifyNoMoreInteractions(mockEndListener)
-
-        // Now that all properties are done animating, the end action should have been called.
-        verify(mockEndAction, times(1)).run()
-    }
-
-    @Test
-    fun testUpdateListeners() {
-        animator
-                .spring(DynamicAnimation.TRANSLATION_X, 100f, springConfig)
-                .spring(DynamicAnimation.TRANSLATION_Y, 50f, springConfig)
-                .addUpdateListener(object : UpdateListener<View> {
-                    override fun onAnimationUpdateForProperty(
-                        target: View,
-                        values: UpdateMap<View>
-                    ) {
-                        mockUpdateListener.onAnimationUpdateForProperty(target, values)
-                    }
-                })
-                .start()
-
-        verifyUpdateListenerCalls(animator, mockUpdateListener)
-    }
-
-    @Test
-    fun testListenersNotCalledOnSubsequentAnimations() {
-        animator
-                .spring(DynamicAnimation.TRANSLATION_X, 10f, springConfig)
-                .addUpdateListener(mockUpdateListener)
-                .addEndListener(mockEndListener)
-                .withEndActions(mockEndAction::run)
-                .start()
-
-        verifyUpdateListenerCalls(animator, mockUpdateListener)
-        verify(mockEndListener, times(1)).onAnimationEnd(
-                eq(testView), eq(DynamicAnimation.TRANSLATION_X), eq(false), eq(false), anyFloat(),
-                anyFloat(), eq(true))
-        verify(mockEndAction, times(1)).run()
-
-        animator
-                .spring(DynamicAnimation.TRANSLATION_X, 0f, springConfig)
-                .start()
-
-        // We didn't pass any of the listeners/actions to the subsequent animation, so they should
-        // never have been called.
-        verifyNoMoreInteractions(mockUpdateListener)
-        verifyNoMoreInteractions(mockEndListener)
-        verifyNoMoreInteractions(mockEndAction)
-    }
-
-    @Test
-    @Throws(InterruptedException::class)
-    fun testAnimationsUpdatedWhileInMotion() {
-        PhysicsAnimatorTestUtils.setAllAnimationsBlock(false)
-
-        // Spring towards x = 100f.
-        animator
-                .spring(
-                        DynamicAnimation.TRANSLATION_X,
-                        100f,
-                        springConfig)
-                .start()
-
-        // Block until it reaches x = 50f.
-        PhysicsAnimatorTestUtils.blockUntilFirstAnimationFrameWhereTrue(
-                animator) { view -> view.translationX > 50f }
-
-        // Translation X value at the time of reversing the animation to spring to x = 0f.
-        val reversalTranslationX = testView.translationX
-
-        // Spring back towards 0f.
-        animator
-                .spring(
-                        DynamicAnimation.TRANSLATION_X,
-                        0f,
-                        // Lower the stiffness to ensure the update listener receives at least one
-                        // update frame where the view has continued to move to the right.
-                        springConfig.apply { stiffness = SpringForce.STIFFNESS_LOW })
-                .start()
-
-        // Wait for TRANSLATION_X.
-        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(animator, DynamicAnimation.TRANSLATION_X)
-
-        // Verify that the animation continued past the X value at the time of reversal, before
-        // springing back. This ensures the change in direction was not abrupt.
-        verifyAnimationUpdateFrames(
-                animator, DynamicAnimation.TRANSLATION_X,
-                { u -> u.value > reversalTranslationX },
-                { u -> u.value < reversalTranslationX })
-
-        // Verify that the view is where it should be.
-        assertEquals(0f, testView.translationX, 1f)
-    }
-
-    @Test
-    @Throws(InterruptedException::class)
-    @Ignore("Sporadically flaking.")
-    fun testAnimationsUpdatedWhileInMotion_originalListenersStillCalled() {
-        PhysicsAnimatorTestUtils.setAllAnimationsBlock(false)
-
-        // Spring TRANSLATION_X to 100f, with an update and end listener provided.
-        animator
-                .spring(
-                        DynamicAnimation.TRANSLATION_X,
-                        100f,
-                        // Use very low stiffness to ensure that all of the keyframes we're testing
-                        // for are reported to the update listener.
-                        springConfig.apply { stiffness = SpringForce.STIFFNESS_VERY_LOW })
-                .addUpdateListener(mockUpdateListener)
-                .addEndListener(mockEndListener)
-                .start()
-
-        // Wait until the animation is halfway there.
-        PhysicsAnimatorTestUtils.blockUntilFirstAnimationFrameWhereTrue(
-                animator) { view -> view.translationX > 50f }
-
-        // The end listener shouldn't have been called since the animation hasn't ended.
-        verifyNoMoreInteractions(mockEndListener)
-
-        // Make sure we called the update listener with appropriate values.
-        verifyAnimationUpdateFrames(animator, DynamicAnimation.TRANSLATION_X,
-                { u -> u.value > 0f },
-                { u -> u.value >= 50f })
-
-        // Mock a second end listener.
-        val secondEndListener = mock(EndListener::class.java) as EndListener<View>
-        val secondUpdateListener = mock(UpdateListener::class.java) as UpdateListener<View>
-
-        // Start a new animation that springs both TRANSLATION_X and TRANSLATION_Y, and provide it
-        // the second end listener. This new end listener should be called for the end of
-        // TRANSLATION_X and TRANSLATION_Y, with allEnded = true when both have ended.
-        animator
-                .spring(DynamicAnimation.TRANSLATION_X, 200f, springConfig)
-                .spring(DynamicAnimation.TRANSLATION_Y, 4000f, springConfig)
-                .addUpdateListener(secondUpdateListener)
-                .addEndListener(secondEndListener)
-                .start()
-
-        // Wait for TRANSLATION_X to end.
-        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(animator, DynamicAnimation.TRANSLATION_X)
-
-        // The update listener provided to the initial animation call (the one that only animated
-        // TRANSLATION_X) should have been called with values on the way to x = 200f. This is
-        // because the second animation call updated the original TRANSLATION_X animation.
-        verifyAnimationUpdateFrames(
-                animator, DynamicAnimation.TRANSLATION_X,
-                { u -> u.value > 100f }, { u -> u.value >= 200f })
-
-        // The original end listener should also have been called, with allEnded = true since it was
-        // provided to an animator that animated only TRANSLATION_X.
-        verify(mockEndListener, times(1))
-                .onAnimationEnd(
-                        testView, DynamicAnimation.TRANSLATION_X,
-                        wasFling = false,
-                        canceled = false,
-                        finalValue = 200f,
-                        finalVelocity = 0f,
-                        allRelevantPropertyAnimsEnded = true)
-        verifyNoMoreInteractions(mockEndListener)
-
-        // The second end listener should have been called, but with allEnded = false since it was
-        // provided to an animator that animated both TRANSLATION_X and TRANSLATION_Y.
-        verify(secondEndListener, times(1))
-                .onAnimationEnd(testView, DynamicAnimation.TRANSLATION_X,
-                        wasFling = false,
-                        canceled = false,
-                        finalValue = 200f,
-                        finalVelocity = 0f,
-                        allRelevantPropertyAnimsEnded = false)
-        verifyNoMoreInteractions(secondEndListener)
-
-        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(animator, DynamicAnimation.TRANSLATION_Y)
-
-        // The original end listener shouldn't receive any callbacks because it was not provided to
-        // an animator that animated TRANSLATION_Y.
-        verifyNoMoreInteractions(mockEndListener)
-
-        verify(secondEndListener, times(1))
-                .onAnimationEnd(testView, DynamicAnimation.TRANSLATION_Y,
-                        wasFling = false,
-                        canceled = false,
-                        finalValue = 4000f,
-                        finalVelocity = 0f,
-                        allRelevantPropertyAnimsEnded = true)
-        verifyNoMoreInteractions(secondEndListener)
-    }
-
-    @Test
-    fun testFlingRespectsMinMax() {
-        animator
-                .fling(DynamicAnimation.TRANSLATION_X,
-                        startVelocity = 1000f,
-                        friction = 1.1f,
-                        max = 10f)
-                .addEndListener(mockEndListener)
-                .start()
-
-        // Ensure that the view stopped at x = 10f, and the end listener was called once with that
-        // value.
-        assertEquals(10f, testView.translationX, 1f)
-        verify(mockEndListener, times(1))
-                .onAnimationEnd(
-                        eq(testView), eq(DynamicAnimation.TRANSLATION_X), eq(true), eq(false),
-                        eq(10f), anyFloat(), eq(true))
-
-        animator
-                .fling(
-                        DynamicAnimation.TRANSLATION_X,
-                        startVelocity = -1000f,
-                        friction = 1.1f,
-                        min = -5f)
-                .addEndListener(mockEndListener)
-                .start()
-
-        // Ensure that the view stopped at x = -5f, and the end listener was called once with that
-        // value.
-        assertEquals(-5f, testView.translationX, 1f)
-        verify(mockEndListener, times(1))
-                .onAnimationEnd(
-                        eq(testView), eq(DynamicAnimation.TRANSLATION_X), eq(true), eq(false),
-                        eq(-5f), anyFloat(), eq(true))
-    }
-
-    @Ignore("Started flaking despite no changes, tracking in b/299636216")
-    @Test
-    fun testIsPropertyAnimating() {
-        PhysicsAnimatorTestUtils.setAllAnimationsBlock(false)
-
-        testView.physicsAnimator
-                .spring(DynamicAnimation.TRANSLATION_X, 500f, springConfig)
-                .fling(DynamicAnimation.TRANSLATION_Y, 10f, flingConfig)
-                .spring(DynamicAnimation.TRANSLATION_Z, 1000f, springConfig)
-                .start()
-
-        // All of the properties we just started should be animating.
-        assertTrue(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_X))
-        assertTrue(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Y))
-        assertTrue(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Z))
-
-        // Block until x and y end.
-        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(testView.physicsAnimator,
-                DynamicAnimation.TRANSLATION_X, DynamicAnimation.TRANSLATION_Y)
-
-        // Verify that x and y are no longer animating, but that Z is (it's springing to 1000f).
-        assertFalse(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_X))
-        assertFalse(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Y))
-        assertTrue(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Z))
-
-        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Z)
-
-        assertFalse(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_X))
-        assertFalse(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Y))
-        assertFalse(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Z))
-    }
-
-    @Test
-    fun testExtensionProperty() {
-        testView
-                .physicsAnimator
-                .spring(DynamicAnimation.TRANSLATION_X, 200f)
-                .start()
-
-        assertEquals(200f, testView.translationX, 1f)
-    }
-
-    @Test
-    @Ignore("Sporadically flaking.")
-    fun testFlingThenSpring() {
-        PhysicsAnimatorTestUtils.setAllAnimationsBlock(false)
-
-        // Start at 500f and fling hard to the left. We should quickly reach the 250f minimum, fly
-        // past it since there's so much velocity remaining, then spring back to 250f.
-        testView.translationX = 500f
-        animator
-                .flingThenSpring(
-                        DynamicAnimation.TRANSLATION_X,
-                        -5000f,
-                        flingConfig.apply { min = 250f },
-                        springConfig)
-                .addUpdateListener(mockUpdateListener)
-                .addEndListener(mockEndListener)
-                .withEndActions(mockEndAction::run)
-                .start()
-
-        // Block until we pass the minimum.
-        PhysicsAnimatorTestUtils.blockUntilFirstAnimationFrameWhereTrue(
-                animator) { v -> v.translationX <= 250f }
-
-        // Double check that the view is there.
-        assertTrue(testView.translationX <= 250f)
-
-        // The update listener should have been called with a value < 500f, and then a value less
-        // than or equal to the 250f minimum.
-        verifyAnimationUpdateFrames(animator, DynamicAnimation.TRANSLATION_X,
-                { u -> u.value < 500f },
-                { u -> u.value <= 250f })
-
-        // Despite the fact that the fling has ended, the end listener shouldn't have been called
-        // since we're about to begin springing the same property.
-        verifyNoMoreInteractions(mockEndListener)
-        verifyNoMoreInteractions(mockEndAction)
-
-        // Wait for the spring to finish.
-        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_X)
-
-        // Make sure we continued past 250f since the spring should have been started with some
-        // remaining negative velocity from the fling.
-        verifyAnimationUpdateFrames(animator, DynamicAnimation.TRANSLATION_X,
-                { u -> u.value < 250f })
-
-        // At this point, the animation end listener should have been called once, and only once,
-        // when the spring ended at 250f.
-        verify(mockEndListener).onAnimationEnd(testView, DynamicAnimation.TRANSLATION_X,
-                wasFling = false,
-                canceled = false,
-                finalValue = 250f,
-                finalVelocity = 0f,
-                allRelevantPropertyAnimsEnded = true)
-        verifyNoMoreInteractions(mockEndListener)
-
-        // The end action should also have been called once.
-        verify(mockEndAction, times(1)).run()
-        verifyNoMoreInteractions(mockEndAction)
-
-        assertEquals(250f, testView.translationX)
-    }
-
-    @Test
-    fun testFlingThenSpring_objectOutsideFlingBounds() {
-        // Start the view at x = -500, well outside the fling bounds of min = 0f, with strong
-        // negative velocity.
-        testView.translationX = -500f
-        animator
-                .flingThenSpring(
-                        DynamicAnimation.TRANSLATION_X,
-                        -5000f,
-                        flingConfig.apply { min = 0f },
-                        springConfig)
-                .addUpdateListener(mockUpdateListener)
-                .addEndListener(mockEndListener)
-                .withEndActions(mockEndAction::run)
-                .start()
-
-        // The initial -5000f velocity should result in frames to the left of -500f before the view
-        // springs back towards 0f.
-        verifyAnimationUpdateFrames(
-                animator, DynamicAnimation.TRANSLATION_X,
-                { u -> u.value < -500f },
-                { u -> u.value > -500f })
-
-        // We should end up at the fling min.
-        assertEquals(0f, testView.translationX, 1f)
-    }
-
-    @Test
-    fun testFlingToMinMaxThenSpring() {
-        // Start at x = 500f.
-        testView.translationX = 500f
-
-        // Fling to the left at the very sad rate of -1 pixels per second. That won't get us much of
-        // anywhere, and certainly not to the 0f min.
-        animator
-                // Good thing we have flingToMinMaxThenSpring!
-                .flingThenSpring(
-                        DynamicAnimation.TRANSLATION_X,
-                        -10000f,
-                        flingConfig.apply { min = 0f },
-                        springConfig,
-                        flingMustReachMinOrMax = true)
-                .addUpdateListener(mockUpdateListener)
-                .addEndListener(mockEndListener)
-                .withEndActions(mockEndAction::run)
-                .start()
-
-        // Thanks, flingToMinMaxThenSpring, for adding enough velocity to get us here.
-        assertEquals(0f, testView.translationX, 1f)
-    }
-
-    /**
-     * Verifies that the calls to the mock update listener match the animation update frames
-     * reported by the test internal listener, in order.
-     */
-    private fun <T : Any> verifyUpdateListenerCalls(
-        animator: PhysicsAnimator<T>,
-        mockUpdateListener: UpdateListener<T>
-    ) {
-        val updates = getAnimationUpdateFrames(animator)
-
-        for (invocation in Mockito.mockingDetails(mockUpdateListener).invocations) {
-
-            // Grab the update map of Property -> AnimationUpdate that was passed to the mock update
-            // listener.
-            val updateMap = invocation.arguments[1]
-                    as ArrayMap<FloatPropertyCompat<in T>, PhysicsAnimator.AnimationUpdate>
-
-            //
-            for ((property, update) in updateMap) {
-                val updatesForProperty = updates[property]!!
-
-                // This update should be the next one in the list for this property.
-                if (update != updatesForProperty[0]) {
-                    Assert.fail("The update listener was called with an unexpected value: $update.")
-                }
-
-                updatesForProperty.remove(update)
-            }
-
-            val target = animator.weakTarget.get()
-            assertNotNull(target)
-            // Mark this invocation verified.
-            verify(mockUpdateListener).onAnimationUpdateForProperty(target!!, updateMap)
-        }
-
-        verifyNoMoreInteractions(mockUpdateListener)
-
-        // Since we were removing values as matching invocations were found, there should no longer
-        // be any values remaining. If there are, it means the update listener wasn't notified when
-        // it should have been.
-        assertEquals(0,
-                updates.values.fold(0, { count, propertyUpdates -> count + propertyUpdates.size }))
-
-        clearAnimationUpdateFrames(animator)
-    }
-}
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 703eb19..9c623bd 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
@@ -69,7 +69,6 @@
 import com.android.wm.shell.sysui.ShellInit;
 import com.android.wm.shell.sysui.ShellSharedConstants;
 
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -121,6 +120,8 @@
     private TestableContentResolver mContentResolver;
     private TestableLooper mTestableLooper;
 
+    private CrossActivityBackAnimation mCrossActivityBackAnimation;
+    private CrossTaskBackAnimation mCrossTaskBackAnimation;
     private ShellBackAnimationRegistry mShellBackAnimationRegistry;
 
     @Before
@@ -134,11 +135,11 @@
                 ANIMATION_ENABLED);
         mTestableLooper = TestableLooper.get(this);
         mShellInit = spy(new ShellInit(mShellExecutor));
+        mCrossActivityBackAnimation = new CrossActivityBackAnimation(mContext, mAnimationBackground,
+                mRootTaskDisplayAreaOrganizer);
+        mCrossTaskBackAnimation = new CrossTaskBackAnimation(mContext, mAnimationBackground);
         mShellBackAnimationRegistry =
-                new ShellBackAnimationRegistry(
-                        new CrossActivityBackAnimation(
-                                mContext, mAnimationBackground, mRootTaskDisplayAreaOrganizer),
-                        new CrossTaskBackAnimation(mContext, mAnimationBackground),
+                new ShellBackAnimationRegistry(mCrossActivityBackAnimation, mCrossTaskBackAnimation,
                         /* dialogCloseAnimation= */ null,
                         new CustomizeActivityAnimation(mContext, mAnimationBackground),
                         /* defaultBackToHomeAnimation= */ null);
@@ -182,7 +183,9 @@
     }
 
     RemoteAnimationTarget createAnimationTarget() {
-        SurfaceControl topWindowLeash = new SurfaceControl();
+        SurfaceControl topWindowLeash = new SurfaceControl.Builder()
+                .setName("FakeLeash")
+                .build();
         return new RemoteAnimationTarget(-1, RemoteAnimationTarget.MODE_CLOSING, topWindowLeash,
                 false, new Rect(), new Rect(), -1,
                 new Point(0, 0), new Rect(), new Rect(), new WindowConfiguration(),
@@ -409,6 +412,32 @@
     }
 
     @Test
+    public void gestureNotQueued_WhenPreviousGestureIsPostCommitCancelling()
+            throws RemoteException {
+        registerAnimation(BackNavigationInfo.TYPE_RETURN_TO_HOME);
+        createNavigationInfo(BackNavigationInfo.TYPE_RETURN_TO_HOME,
+                /* enableAnimation = */ true,
+                /* isAnimationCallback = */ false);
+
+        doStartEvents(0, 100);
+        simulateRemoteAnimationStart();
+        releaseBackGesture();
+
+        // Check that back cancellation is dispatched.
+        verify(mAnimatorCallback).onBackCancelled();
+        verify(mBackAnimationRunner).onAnimationStart(anyInt(), any(), any(), any(), any());
+
+        reset(mAnimatorCallback);
+        reset(mBackAnimationRunner);
+
+        // Verify that a new start event is dispatched if a new gesture is started during the
+        // post-commit cancel phase
+        triggerBackGesture();
+        verify(mAnimatorCallback).onBackStarted(any());
+        verify(mBackAnimationRunner).onAnimationStart(anyInt(), any(), any(), any(), any());
+    }
+
+    @Test
     public void acceptsGesture_transitionTimeout() throws RemoteException {
         registerAnimation(BackNavigationInfo.TYPE_RETURN_TO_HOME);
         createNavigationInfo(BackNavigationInfo.TYPE_RETURN_TO_HOME,
@@ -531,17 +560,32 @@
     }
 
     @Test
+    public void skipsCancelWithoutStart() throws RemoteException {
+        final int type = BackNavigationInfo.TYPE_CALLBACK;
+        final ResultListener result = new ResultListener();
+        createNavigationInfo(new BackNavigationInfo.Builder()
+                .setType(type)
+                .setOnBackInvokedCallback(mAppCallback)
+                .setOnBackNavigationDone(new RemoteCallback(result)));
+        doMotionEvent(MotionEvent.ACTION_CANCEL, 0);
+        mShellExecutor.flushAll();
+
+        verify(mAppCallback, never()).onBackStarted(any());
+        verify(mAppCallback, never()).onBackProgressed(any());
+        verify(mAppCallback, never()).onBackInvoked();
+        verify(mAppCallback, never()).onBackCancelled();
+    }
+
+    @Test
     public void testBackToActivity() throws RemoteException {
-        final CrossActivityBackAnimation animation = new CrossActivityBackAnimation(
-                mContext, mAnimationBackground, mRootTaskDisplayAreaOrganizer);
-        verifySystemBackBehavior(BackNavigationInfo.TYPE_CROSS_ACTIVITY, animation.getRunner());
+        verifySystemBackBehavior(BackNavigationInfo.TYPE_CROSS_ACTIVITY,
+                mCrossActivityBackAnimation.getRunner());
     }
 
     @Test
     public void testBackToTask() throws RemoteException {
-        final CrossTaskBackAnimation animation = new CrossTaskBackAnimation(mContext,
-                mAnimationBackground);
-        verifySystemBackBehavior(BackNavigationInfo.TYPE_CROSS_TASK, animation.getRunner());
+        verifySystemBackBehavior(BackNavigationInfo.TYPE_CROSS_TASK,
+                mCrossTaskBackAnimation.getRunner());
     }
 
     private void verifySystemBackBehavior(int type, BackAnimationRunner animation)
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 7e26577..8932e60 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
@@ -134,6 +134,31 @@
         assertEquals(0, cancelCallbackCalled.getCount());
     }
 
+    @Test
+    public void testCancelFinishCallbackNotInvokedWhenRemoved() throws InterruptedException {
+        // Give the animator some progress.
+        final BackMotionEvent backEvent = backMotionEventFrom(100, mTargetProgress);
+        mMainThreadHandler.post(
+                () -> mProgressAnimator.onBackProgressed(backEvent));
+        mTargetProgressCalled.await(1, TimeUnit.SECONDS);
+        assertNotNull(mReceivedBackEvent);
+
+        // call onBackCancelled (which animates progress to 0 before invoking the finishCallback)
+        CountDownLatch finishCallbackCalled = new CountDownLatch(1);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(
+                () -> mProgressAnimator.onBackCancelled(finishCallbackCalled::countDown));
+
+        // remove onBackCancelled finishCallback (while progress is still animating to 0)
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(
+                () -> mProgressAnimator.removeOnBackCancelledFinishCallback());
+
+        // call reset (which triggers the finishCallback invocation, if one is present)
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> mProgressAnimator.reset());
+
+        // verify that finishCallback is not invoked
+        assertEquals(1, finishCallbackCalled.getCount());
+    }
+
     private void onGestureProgress(BackEvent backEvent) {
         if (mTargetProgress == backEvent.getProgress()) {
             mReceivedBackEvent = backEvent;
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
index 48e396a..6be411d 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataTest.java
@@ -1222,6 +1222,19 @@
         assertThat(update.bubbleBarLocation).isEqualTo(BubbleBarLocation.LEFT);
     }
 
+    @Test
+    public void setSelectedBubbleAndExpandStack() {
+        sendUpdatedEntryAtTime(mEntryA1, 1000);
+        sendUpdatedEntryAtTime(mEntryA2, 2000);
+        mBubbleData.setListener(mListener);
+
+        mBubbleData.setSelectedBubbleAndExpandStack(mBubbleA1);
+
+        verifyUpdateReceived();
+        assertSelectionChangedTo(mBubbleA1);
+        assertExpandedChangedTo(true);
+    }
+
     private void verifyUpdateReceived() {
         verify(mListener).applyUpdate(mUpdateCaptor.capture());
         reset(mListener);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/magnetictarget/MagnetizedObjectTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/magnetictarget/MagnetizedObjectTest.kt
index a4fb350..8bb182d 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/magnetictarget/MagnetizedObjectTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/magnetictarget/MagnetizedObjectTest.kt
@@ -22,7 +22,7 @@
 import androidx.dynamicanimation.animation.FloatPropertyCompat
 import androidx.test.filters.SmallTest
 import com.android.wm.shell.ShellTestCase
-import com.android.wm.shell.animation.PhysicsAnimatorTestUtils
+import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
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
index 445f74a..0c45d52 100644
--- 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
@@ -16,8 +16,10 @@
 
 package com.android.wm.shell.desktopmode
 
+import android.graphics.Rect
 import android.testing.AndroidTestingRunner
 import android.view.Display.DEFAULT_DISPLAY
+import android.view.Display.INVALID_DISPLAY
 import androidx.test.filters.SmallTest
 import com.android.wm.shell.ShellTestCase
 import com.android.wm.shell.TestShellExecutor
@@ -237,6 +239,27 @@
         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 updateVisibleFreeformTasks_removeVisibleTasksRemovesTaskWithInvalidDisplay() {
+        val listener = TestVisibilityListener()
+        val executor = TestShellExecutor()
+        repo.addVisibleTasksListener(listener, executor)
+        repo.updateVisibleFreeformTasks(DEFAULT_DISPLAY, taskId = 1, visible = true)
+        repo.updateVisibleFreeformTasks(DEFAULT_DISPLAY, taskId = 2, visible = true)
+        executor.flushAll()
+
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(2)
+        repo.updateVisibleFreeformTasks(INVALID_DISPLAY, taskId = 1, visible = false)
+        executor.flushAll()
+
+        assertThat(listener.visibleChangesOnDefaultDisplay).isEqualTo(3)
+        assertThat(listener.visibleTasksCountOnDefaultDisplay).isEqualTo(1)
+    }
+
     @Test
     fun getVisibleTaskCount() {
         // No tasks, count is 0
@@ -384,6 +407,31 @@
         assertThat(listener.stashedOnSecondaryDisplay).isTrue()
     }
 
+    @Test
+    fun removeFreeformTask_removesTaskBoundsBeforeMaximize() {
+        val taskId = 1
+        repo.saveBoundsBeforeMaximize(taskId, Rect(0, 0, 200, 200))
+        repo.removeFreeformTask(taskId)
+        assertThat(repo.removeBoundsBeforeMaximize(taskId)).isNull()
+    }
+
+    @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)
+        assertThat(repo.removeBoundsBeforeMaximize(taskId)).isNull()
+    }
+
     class TestListener : DesktopModeTaskRepository.ActiveTasksListener {
         var activeChangesOnDefaultDisplay = 0
         var activeChangesOnSecondaryDisplay = 0
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 4fbf2bd..93a967e 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
@@ -95,9 +95,10 @@
 import org.mockito.Mockito.clearInvocations
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.verify
-import org.mockito.kotlin.times
-import org.mockito.Mockito.`when` as whenever
+import org.mockito.kotlin.atLeastOnce
+import org.mockito.kotlin.capture
 import org.mockito.quality.Strictness
+import org.mockito.Mockito.`when` as whenever
 
 /**
  * Test class for {@link DesktopTasksController}
@@ -116,13 +117,14 @@
     @Mock lateinit var shellCommandHandler: ShellCommandHandler
     @Mock lateinit var shellController: ShellController
     @Mock lateinit var displayController: DisplayController
+    @Mock lateinit var displayLayout: DisplayLayout
     @Mock lateinit var shellTaskOrganizer: ShellTaskOrganizer
     @Mock lateinit var syncQueue: SyncTransactionQueue
     @Mock lateinit var rootTaskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer
     @Mock lateinit var transitions: Transitions
     @Mock lateinit var exitDesktopTransitionHandler: ExitDesktopTaskTransitionHandler
     @Mock lateinit var enterDesktopTransitionHandler: EnterDesktopTaskTransitionHandler
-    @Mock lateinit var mToggleResizeDesktopTaskTransitionHandler:
+    @Mock lateinit var toggleResizeDesktopTaskTransitionHandler:
             ToggleResizeDesktopTaskTransitionHandler
     @Mock lateinit var dragToDesktopTransitionHandler: DragToDesktopTransitionHandler
     @Mock lateinit var launchAdjacentController: LaunchAdjacentController
@@ -154,6 +156,10 @@
 
         whenever(shellTaskOrganizer.getRunningTasks(anyInt())).thenAnswer { runningTasks }
         whenever(transitions.startTransition(anyInt(), any(), isNull())).thenAnswer { Binder() }
+        whenever(displayController.getDisplayLayout(anyInt())).thenReturn(displayLayout)
+        whenever(displayLayout.getStableBounds(any())).thenAnswer { i ->
+                (i.arguments.first() as Rect).set(STABLE_BOUNDS)
+            }
 
         controller = createController()
         controller.setSplitScreenController(splitScreenController)
@@ -179,7 +185,7 @@
             transitions,
             enterDesktopTransitionHandler,
             exitDesktopTransitionHandler,
-            mToggleResizeDesktopTaskTransitionHandler,
+            toggleResizeDesktopTaskTransitionHandler,
             dragToDesktopTransitionHandler,
             desktopModeTaskRepository,
             desktopModeLoggerTransitionObserver,
@@ -929,15 +935,74 @@
         controller.enterSplit(DEFAULT_DISPLAY, false)
 
         verify(splitScreenController).requestEnterSplitSelect(
-            task2,
-            any(),
-            SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT,
-            task2.configuration.windowConfiguration.bounds
+                task2,
+                any(),
+                SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT,
+                task2.configuration.windowConfiguration.bounds
         )
     }
 
-    private fun setUpFreeformTask(displayId: Int = DEFAULT_DISPLAY): RunningTaskInfo {
-        val task = createFreeformTask(displayId)
+    @Test
+    fun toggleBounds_togglesToStableBounds() {
+        val bounds = Rect(0, 0, 100, 100)
+        val task = setUpFreeformTask(DEFAULT_DISPLAY, bounds)
+
+        controller.toggleDesktopTaskSize(task)
+        // Assert bounds set to stable bounds
+        val wct = getLatestToggleResizeDesktopTaskWct()
+        assertThat(wct.changes[task.token.asBinder()]?.configuration?.windowConfiguration?.bounds)
+                .isEqualTo(STABLE_BOUNDS)
+    }
+
+    @Test
+    fun toggleBounds_lastBoundsBeforeMaximizeSaved() {
+        val bounds = Rect(0, 0, 100, 100)
+        val task = setUpFreeformTask(DEFAULT_DISPLAY, bounds)
+
+        controller.toggleDesktopTaskSize(task)
+        assertThat(desktopModeTaskRepository.removeBoundsBeforeMaximize(task.taskId))
+                .isEqualTo(bounds)
+    }
+
+    @Test
+    fun toggleBounds_togglesFromStableBoundsToLastBoundsBeforeMaximize() {
+        val boundsBeforeMaximize = Rect(0, 0, 100, 100)
+        val task = setUpFreeformTask(DEFAULT_DISPLAY, boundsBeforeMaximize)
+
+        // Maximize
+        controller.toggleDesktopTaskSize(task)
+        task.configuration.windowConfiguration.bounds.set(STABLE_BOUNDS)
+
+        // Restore
+        controller.toggleDesktopTaskSize(task)
+
+        // Assert bounds set to last bounds before maximize
+        val wct = getLatestToggleResizeDesktopTaskWct()
+        assertThat(wct.changes[task.token.asBinder()]?.configuration?.windowConfiguration?.bounds)
+                .isEqualTo(boundsBeforeMaximize)
+    }
+
+    @Test
+    fun toggleBounds_removesLastBoundsBeforeMaximizeAfterRestoringBounds() {
+        val boundsBeforeMaximize = Rect(0, 0, 100, 100)
+        val task = setUpFreeformTask(DEFAULT_DISPLAY, boundsBeforeMaximize)
+
+        // Maximize
+        controller.toggleDesktopTaskSize(task)
+        task.configuration.windowConfiguration.bounds.set(STABLE_BOUNDS)
+
+        // Restore
+        controller.toggleDesktopTaskSize(task)
+
+        // Assert last bounds before maximize removed after use
+        assertThat(desktopModeTaskRepository.removeBoundsBeforeMaximize(task.taskId)).isNull()
+    }
+
+    private fun setUpFreeformTask(
+            displayId: Int = DEFAULT_DISPLAY,
+            bounds: Rect? = null
+    ): RunningTaskInfo {
+        val task = createFreeformTask(displayId, bounds)
         whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task)
         desktopModeTaskRepository.addActiveTask(displayId, task.taskId)
         desktopModeTaskRepository.addOrMoveFreeformTaskToTop(task.taskId)
@@ -1004,6 +1069,18 @@
         return arg.value
     }
 
+    private fun getLatestToggleResizeDesktopTaskWct(): WindowContainerTransaction {
+        val arg: ArgumentCaptor<WindowContainerTransaction> =
+                ArgumentCaptor.forClass(WindowContainerTransaction::class.java)
+        if (ENABLE_SHELL_TRANSITIONS) {
+            verify(toggleResizeDesktopTaskTransitionHandler, atLeastOnce())
+                    .startTransition(capture(arg))
+        } else {
+            verify(shellTaskOrganizer).applyTransaction(capture(arg))
+        }
+        return arg.value
+    }
+
     private fun getLatestMoveToDesktopWct(): WindowContainerTransaction {
         val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java)
         if (ENABLE_SHELL_TRANSITIONS) {
@@ -1042,6 +1119,7 @@
 
     companion object {
         const val SECOND_DISPLAY = 2
+        private val STABLE_BOUNDS = Rect(0, 0, 1000, 1000)
     }
 }
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTestHelpers.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTestHelpers.kt
index 2f6f320..52da7fb 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTestHelpers.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTestHelpers.kt
@@ -22,6 +22,7 @@
 import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
 import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN
 import android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW
+import android.graphics.Rect
 import android.view.Display.DEFAULT_DISPLAY
 import com.android.wm.shell.MockToken
 import com.android.wm.shell.TestRunningTaskInfoBuilder
@@ -31,13 +32,17 @@
         /** Create a task that has windowing mode set to [WINDOWING_MODE_FREEFORM] */
         @JvmStatic
         @JvmOverloads
-        fun createFreeformTask(displayId: Int = DEFAULT_DISPLAY): RunningTaskInfo {
+        fun createFreeformTask(
+                displayId: Int = DEFAULT_DISPLAY,
+                bounds: Rect? = null
+        ): RunningTaskInfo {
             return TestRunningTaskInfoBuilder()
                     .setDisplayId(displayId)
                     .setToken(MockToken().token())
                     .setActivityType(ACTIVITY_TYPE_STANDARD)
                     .setWindowingMode(WINDOWING_MODE_FREEFORM)
                     .setLastActiveTime(100)
+                    .apply { bounds?.let { setBounds(it) }}
                     .build()
         }
 
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 98e90d6..2ade3fb 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
@@ -190,7 +190,7 @@
         handler.cancelDragToDesktopTransition()
 
         // Cancel animation should run since it had already started.
-        verify(dragAnimator).endAnimator()
+        verify(dragAnimator).cancelAnimator()
     }
 
     @Test
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PhoneSizeSpecSourceTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PhoneSizeSpecSourceTest.java
index 3d5cd69..85f1da5 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PhoneSizeSpecSourceTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PhoneSizeSpecSourceTest.java
@@ -16,33 +16,26 @@
 
 package com.android.wm.shell.pip.phone;
 
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.content.res.Resources;
-import android.os.SystemProperties;
 import android.testing.AndroidTestingRunner;
 import android.util.Size;
 import android.view.DisplayInfo;
 
-import com.android.dx.mockito.inline.extended.StaticMockitoSession;
+import com.android.wm.shell.R;
 import com.android.wm.shell.ShellTestCase;
 import com.android.wm.shell.common.DisplayLayout;
 import com.android.wm.shell.common.pip.PhoneSizeSpecSource;
 import com.android.wm.shell.common.pip.PipDisplayLayoutState;
 import com.android.wm.shell.common.pip.SizeSpecSource;
 
-import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.exceptions.misusing.InvalidUseOfMatchersException;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -63,15 +56,24 @@
     private static final float DEFAULT_PERCENT = 0.6f;
     /** Minimum sizing percentage */
     private static final float MIN_PERCENT = 0.5f;
+    /** Threshold to determine if a Display is square-ish. */
+    private static final float SQUARE_DISPLAY_THRESHOLD = 0.95f;
+    /** Default sizing percentage for square-ish Display. */
+    private static final float SQUARE_DISPLAY_DEFAULT_PERCENT = 0.5f;
+    /** Minimum sizing percentage for square-ish Display. */
+    private static final float SQUARE_DISPLAY_MIN_PERCENT = 0.4f;
     /** Aspect ratio that the new PIP size spec logic optimizes for. */
     private static final float OPTIMIZED_ASPECT_RATIO = 9f / 16;
 
-    /** A map of aspect ratios to be tested to expected sizes */
-    private static Map<Float, Size> sExpectedMaxSizes;
-    private static Map<Float, Size> sExpectedDefaultSizes;
-    private static Map<Float, Size> sExpectedMinSizes;
-    /** A static mockito session object to mock {@link SystemProperties} */
-    private static StaticMockitoSession sStaticMockitoSession;
+    /** Maps of aspect ratios to be tested to expected sizes on non-square Display. */
+    private static Map<Float, Size> sNonSquareDisplayExpectedMaxSizes;
+    private static Map<Float, Size> sNonSquareDisplayExpectedDefaultSizes;
+    private static Map<Float, Size> sNonSquareDisplayExpectedMinSizes;
+
+    /** Maps of aspect ratios to be tested to expected sizes on square Display. */
+    private static Map<Float, Size> sSquareDisplayExpectedMaxSizes;
+    private static Map<Float, Size> sSquareDisplayExpectedDefaultSizes;
+    private static Map<Float, Size> sSquareDisplayExpectedMinSizes;
 
     @Mock private Context mContext;
     @Mock private Resources mResources;
@@ -80,49 +82,55 @@
     private SizeSpecSource mSizeSpecSource;
 
     /**
-     * Sets up static Mockito session for SystemProperties and mocks necessary static methods.
+     * Initializes the map with the aspect ratios to be tested and corresponding expected max sizes.
+     * This is to initialize the expectations on non-square Display only.
      */
-    private static void setUpStaticSystemPropertiesSession() {
-        sStaticMockitoSession = mockitoSession()
-                .mockStatic(SystemProperties.class).startMocking();
-        when(SystemProperties.get(anyString(), anyString())).thenAnswer(invocation -> {
-            String property = invocation.getArgument(0);
-            if (property.equals("com.android.wm.shell.pip.phone.def_percentage")) {
-                return Float.toString(DEFAULT_PERCENT);
-            } else if (property.equals("com.android.wm.shell.pip.phone.min_percentage")) {
-                return Float.toString(MIN_PERCENT);
-            }
+    private static void initNonSquareDisplayExpectedSizes() {
+        sNonSquareDisplayExpectedMaxSizes = new HashMap<>();
+        sNonSquareDisplayExpectedDefaultSizes = new HashMap<>();
+        sNonSquareDisplayExpectedMinSizes = new HashMap<>();
 
-            // throw an exception if illegal arguments are used for these tests
-            throw new InvalidUseOfMatchersException(
-                String.format("Argument %s does not match", property)
-            );
-        });
+        sNonSquareDisplayExpectedMaxSizes.put(16f / 9, new Size(1000, 563));
+        sNonSquareDisplayExpectedDefaultSizes.put(16f / 9, new Size(600, 338));
+        sNonSquareDisplayExpectedMinSizes.put(16f / 9, new Size(501, 282));
+
+        sNonSquareDisplayExpectedMaxSizes.put(4f / 3, new Size(893, 670));
+        sNonSquareDisplayExpectedDefaultSizes.put(4f / 3, new Size(536, 402));
+        sNonSquareDisplayExpectedMinSizes.put(4f / 3, new Size(447, 335));
+
+        sNonSquareDisplayExpectedMaxSizes.put(3f / 4, new Size(670, 893));
+        sNonSquareDisplayExpectedDefaultSizes.put(3f / 4, new Size(402, 536));
+        sNonSquareDisplayExpectedMinSizes.put(3f / 4, new Size(335, 447));
+
+        sNonSquareDisplayExpectedMaxSizes.put(9f / 16, new Size(563, 1001));
+        sNonSquareDisplayExpectedDefaultSizes.put(9f / 16, new Size(338, 601));
+        sNonSquareDisplayExpectedMinSizes.put(9f / 16, new Size(282, 501));
     }
 
     /**
      * Initializes the map with the aspect ratios to be tested and corresponding expected max sizes.
+     * This is to initialize the expectations on square Display only.
      */
-    private static void initExpectedSizes() {
-        sExpectedMaxSizes = new HashMap<>();
-        sExpectedDefaultSizes = new HashMap<>();
-        sExpectedMinSizes = new HashMap<>();
+    private static void initSquareDisplayExpectedSizes() {
+        sSquareDisplayExpectedMaxSizes = new HashMap<>();
+        sSquareDisplayExpectedDefaultSizes = new HashMap<>();
+        sSquareDisplayExpectedMinSizes = new HashMap<>();
 
-        sExpectedMaxSizes.put(16f / 9, new Size(1000, 563));
-        sExpectedDefaultSizes.put(16f / 9, new Size(600, 338));
-        sExpectedMinSizes.put(16f / 9, new Size(501, 282));
+        sSquareDisplayExpectedMaxSizes.put(16f / 9, new Size(1000, 563));
+        sSquareDisplayExpectedDefaultSizes.put(16f / 9, new Size(500, 281));
+        sSquareDisplayExpectedMinSizes.put(16f / 9, new Size(400, 225));
 
-        sExpectedMaxSizes.put(4f / 3, new Size(893, 670));
-        sExpectedDefaultSizes.put(4f / 3, new Size(536, 402));
-        sExpectedMinSizes.put(4f / 3, new Size(447, 335));
+        sSquareDisplayExpectedMaxSizes.put(4f / 3, new Size(893, 670));
+        sSquareDisplayExpectedDefaultSizes.put(4f / 3, new Size(447, 335));
+        sSquareDisplayExpectedMinSizes.put(4f / 3, new Size(357, 268));
 
-        sExpectedMaxSizes.put(3f / 4, new Size(670, 893));
-        sExpectedDefaultSizes.put(3f / 4, new Size(402, 536));
-        sExpectedMinSizes.put(3f / 4, new Size(335, 447));
+        sSquareDisplayExpectedMaxSizes.put(3f / 4, new Size(670, 893));
+        sSquareDisplayExpectedDefaultSizes.put(3f / 4, new Size(335, 447));
+        sSquareDisplayExpectedMinSizes.put(3f / 4, new Size(268, 357));
 
-        sExpectedMaxSizes.put(9f / 16, new Size(563, 1001));
-        sExpectedDefaultSizes.put(9f / 16, new Size(338, 601));
-        sExpectedMinSizes.put(9f / 16, new Size(282, 501));
+        sSquareDisplayExpectedMaxSizes.put(9f / 16, new Size(563, 1001));
+        sSquareDisplayExpectedDefaultSizes.put(9f / 16, new Size(282, 501));
+        sSquareDisplayExpectedMinSizes.put(9f / 16, new Size(225, 400));
     }
 
     private void forEveryTestCaseCheck(Map<Float, Size> expectedSizes,
@@ -137,20 +145,38 @@
 
     @Before
     public void setUp() {
-        initExpectedSizes();
+        initNonSquareDisplayExpectedSizes();
+        initSquareDisplayExpectedSizes();
 
-        when(mResources.getDimensionPixelSize(anyInt())).thenReturn(DEFAULT_MIN_EDGE_SIZE);
-        when(mResources.getFloat(anyInt())).thenReturn(OPTIMIZED_ASPECT_RATIO);
-        when(mResources.getString(anyInt())).thenReturn("0x0");
+        when(mResources.getFloat(R.dimen.config_pipSystemPreferredDefaultSizePercent))
+                .thenReturn(DEFAULT_PERCENT);
+        when(mResources.getFloat(R.dimen.config_pipSystemPreferredMinimumSizePercent))
+                .thenReturn(MIN_PERCENT);
+        when(mResources.getDimensionPixelSize(R.dimen.default_minimal_size_pip_resizable_task))
+                .thenReturn(DEFAULT_MIN_EDGE_SIZE);
+        when(mResources.getFloat(R.dimen.config_pipLargeScreenOptimizedAspectRatio))
+                .thenReturn(OPTIMIZED_ASPECT_RATIO);
+        when(mResources.getString(R.string.config_defaultPictureInPictureScreenEdgeInsets))
+                .thenReturn("0x0");
         when(mResources.getDisplayMetrics())
                 .thenReturn(getContext().getResources().getDisplayMetrics());
+        when(mResources.getFloat(R.dimen.config_pipSquareDisplayThresholdForSystemPreferredSize))
+                .thenReturn(SQUARE_DISPLAY_THRESHOLD);
+        when(mResources.getFloat(
+                R.dimen.config_pipSystemPreferredDefaultSizePercentForSquareDisplay))
+                .thenReturn(SQUARE_DISPLAY_DEFAULT_PERCENT);
+        when(mResources.getFloat(
+                R.dimen.config_pipSystemPreferredMinimumSizePercentForSquareDisplay))
+                .thenReturn(SQUARE_DISPLAY_MIN_PERCENT);
 
         // set up the mock context for spec handler specifically
         when(mContext.getResources()).thenReturn(mResources);
+    }
 
+    private void setupSizeSpecWithDisplayDimension(int width, int height) {
         DisplayInfo displayInfo = new DisplayInfo();
-        displayInfo.logicalWidth = DISPLAY_EDGE_SIZE;
-        displayInfo.logicalHeight = DISPLAY_EDGE_SIZE;
+        displayInfo.logicalWidth = width;
+        displayInfo.logicalHeight = height;
 
         // use the parent context (not the mocked one) to obtain the display layout
         // this is done to avoid unnecessary mocking while allowing for custom display dimensions
@@ -159,38 +185,57 @@
         mPipDisplayLayoutState = new PipDisplayLayoutState(mContext);
         mPipDisplayLayoutState.setDisplayLayout(displayLayout);
 
-        setUpStaticSystemPropertiesSession();
         mSizeSpecSource = new PhoneSizeSpecSource(mContext, mPipDisplayLayoutState);
 
         // no overridden min edge size by default
         mSizeSpecSource.setOverrideMinSize(null);
     }
 
-    @After
-    public void cleanUp() {
-        sStaticMockitoSession.finishMocking();
-    }
-
     @Test
-    public void testGetMaxSize() {
-        forEveryTestCaseCheck(sExpectedMaxSizes,
+    public void testGetMaxSize_nonSquareDisplay() {
+        setupSizeSpecWithDisplayDimension(DISPLAY_EDGE_SIZE * 2, DISPLAY_EDGE_SIZE);
+        forEveryTestCaseCheck(sNonSquareDisplayExpectedMaxSizes,
                 (aspectRatio) -> mSizeSpecSource.getMaxSize(aspectRatio));
     }
 
     @Test
-    public void testGetDefaultSize() {
-        forEveryTestCaseCheck(sExpectedDefaultSizes,
+    public void testGetDefaultSize_nonSquareDisplay() {
+        setupSizeSpecWithDisplayDimension(DISPLAY_EDGE_SIZE * 2, DISPLAY_EDGE_SIZE);
+        forEveryTestCaseCheck(sNonSquareDisplayExpectedDefaultSizes,
                 (aspectRatio) -> mSizeSpecSource.getDefaultSize(aspectRatio));
     }
 
     @Test
-    public void testGetMinSize() {
-        forEveryTestCaseCheck(sExpectedMinSizes,
+    public void testGetMinSize_nonSquareDisplay() {
+        setupSizeSpecWithDisplayDimension(DISPLAY_EDGE_SIZE * 2, DISPLAY_EDGE_SIZE);
+        forEveryTestCaseCheck(sNonSquareDisplayExpectedMinSizes,
+                (aspectRatio) -> mSizeSpecSource.getMinSize(aspectRatio));
+    }
+
+    @Test
+    public void testGetMaxSize_squareDisplay() {
+        setupSizeSpecWithDisplayDimension(DISPLAY_EDGE_SIZE, DISPLAY_EDGE_SIZE);
+        forEveryTestCaseCheck(sSquareDisplayExpectedMaxSizes,
+                (aspectRatio) -> mSizeSpecSource.getMaxSize(aspectRatio));
+    }
+
+    @Test
+    public void testGetDefaultSize_squareDisplay() {
+        setupSizeSpecWithDisplayDimension(DISPLAY_EDGE_SIZE, DISPLAY_EDGE_SIZE);
+        forEveryTestCaseCheck(sSquareDisplayExpectedDefaultSizes,
+                (aspectRatio) -> mSizeSpecSource.getDefaultSize(aspectRatio));
+    }
+
+    @Test
+    public void testGetMinSize_squareDisplay() {
+        setupSizeSpecWithDisplayDimension(DISPLAY_EDGE_SIZE, DISPLAY_EDGE_SIZE);
+        forEveryTestCaseCheck(sSquareDisplayExpectedMinSizes,
                 (aspectRatio) -> mSizeSpecSource.getMinSize(aspectRatio));
     }
 
     @Test
     public void testGetSizeForAspectRatio_noOverrideMinSize() {
+        setupSizeSpecWithDisplayDimension(DISPLAY_EDGE_SIZE * 2, DISPLAY_EDGE_SIZE);
         // an initial size with 16:9 aspect ratio
         Size initSize = new Size(600, 337);
 
@@ -202,6 +247,7 @@
 
     @Test
     public void testGetSizeForAspectRatio_withOverrideMinSize() {
+        setupSizeSpecWithDisplayDimension(DISPLAY_EDGE_SIZE * 2, DISPLAY_EDGE_SIZE);
         // an initial size with a 1:1 aspect ratio
         Size initSize = new Size(OVERRIDE_MIN_EDGE_SIZE, OVERRIDE_MIN_EDGE_SIZE);
         mSizeSpecSource.setOverrideMinSize(initSize);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/animation/PhysicsAnimatorTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/animation/PhysicsAnimatorTest.kt
new file mode 100644
index 0000000..3fb66be
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/animation/PhysicsAnimatorTest.kt
@@ -0,0 +1,627 @@
+/*
+ * 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.wm.shell.shared.animation
+
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import android.util.ArrayMap
+import android.view.View
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.dynamicanimation.animation.DynamicAnimation
+import androidx.dynamicanimation.animation.FloatPropertyCompat
+import androidx.dynamicanimation.animation.SpringForce
+import androidx.test.filters.SmallTest
+import com.android.wm.shell.ShellTestCase
+import com.android.wm.shell.shared.animation.PhysicsAnimator.EndListener
+import com.android.wm.shell.shared.animation.PhysicsAnimator.UpdateListener
+import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils.clearAnimationUpdateFrames
+import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils.getAnimationUpdateFrames
+import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils.verifyAnimationUpdateFrames
+import org.junit.After
+import org.junit.Assert
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNotEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyFloat
+import org.mockito.Mockito
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.MockitoAnnotations
+
[email protected]
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+class PhysicsAnimatorTest : ShellTestCase() {
+    private lateinit var viewGroup: ViewGroup
+    private lateinit var testView: View
+    private lateinit var testView2: View
+
+    private lateinit var animator: PhysicsAnimator<View>
+
+    private val springConfig = PhysicsAnimator.SpringConfig(
+            SpringForce.STIFFNESS_LOW, SpringForce.DAMPING_RATIO_NO_BOUNCY)
+    private val flingConfig = PhysicsAnimator.FlingConfig(2f)
+
+    private lateinit var mockUpdateListener: UpdateListener<View>
+    private lateinit var mockEndListener: EndListener<View>
+    private lateinit var mockEndAction: Runnable
+
+    private fun <T> eq(value: T): T = Mockito.eq(value) ?: value
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+
+        mockUpdateListener = mock(UpdateListener::class.java) as UpdateListener<View>
+        mockEndListener = mock(EndListener::class.java) as EndListener<View>
+        mockEndAction = mock(Runnable::class.java)
+
+        viewGroup = FrameLayout(context)
+        testView = View(context)
+        testView2 = View(context)
+        viewGroup.addView(testView)
+        viewGroup.addView(testView2)
+
+        PhysicsAnimatorTestUtils.prepareForTest()
+
+        // Most of our tests involve checking the end state of animations, so we want calls that
+        // start animations to block the test thread until the animations have ended.
+        PhysicsAnimatorTestUtils.setAllAnimationsBlock(true)
+
+        animator = PhysicsAnimator.getInstance(testView)
+    }
+
+    @After
+    fun tearDown() {
+        PhysicsAnimatorTestUtils.tearDown()
+    }
+
+    @Test
+    fun testOneAnimatorPerView() {
+        assertEquals(animator, PhysicsAnimator.getInstance(testView))
+        assertEquals(PhysicsAnimator.getInstance(testView), PhysicsAnimator.getInstance(testView))
+        assertNotEquals(animator, PhysicsAnimator.getInstance(testView2))
+    }
+
+    @Test
+    fun testSpringOneProperty() {
+        animator
+                .spring(DynamicAnimation.TRANSLATION_X, 50f, springConfig)
+                .start()
+
+        assertEquals(testView.translationX, 50f, 1f)
+    }
+
+    @Test
+    fun testSpringMultipleProperties() {
+        animator
+                .spring(DynamicAnimation.TRANSLATION_X, 10f, springConfig)
+                .spring(DynamicAnimation.TRANSLATION_Y, 50f, springConfig)
+                .spring(DynamicAnimation.SCALE_Y, 1.1f, springConfig)
+                .start()
+
+        assertEquals(10f, testView.translationX, 1f)
+        assertEquals(50f, testView.translationY, 1f)
+        assertEquals(1.1f, testView.scaleY, 0.01f)
+    }
+
+    @Test
+    fun testFling() {
+        val startTime = System.currentTimeMillis()
+
+        animator
+                .fling(DynamicAnimation.TRANSLATION_X, 1000f /* startVelocity */, flingConfig)
+                .fling(DynamicAnimation.TRANSLATION_Y, 500f, flingConfig)
+                .start()
+
+        val elapsedTimeSeconds = (System.currentTimeMillis() - startTime) / 1000f
+
+        // If the fling worked, the view should be somewhere between its starting position and the
+        // and the theoretical no-friction maximum of startVelocity (in pixels per second)
+        // multiplied by elapsedTimeSeconds. We can't calculate an exact expected location for a
+        // fling, so this is close enough.
+        assertTrue(testView.translationX > 0f)
+        assertTrue(testView.translationX < 1000f * elapsedTimeSeconds)
+        assertTrue(testView.translationY > 0f)
+        assertTrue(testView.translationY < 500f * elapsedTimeSeconds)
+    }
+
+    @Test
+    @Throws(InterruptedException::class)
+    @Ignore("Increasingly flaky")
+    fun testEndListenersAndActions() {
+        PhysicsAnimatorTestUtils.setAllAnimationsBlock(false)
+        animator
+                .spring(DynamicAnimation.TRANSLATION_X, 10f, springConfig)
+                .spring(DynamicAnimation.TRANSLATION_Y, 500f, springConfig)
+                .addEndListener(mockEndListener)
+                .withEndActions(mockEndAction::run)
+                .start()
+
+        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(animator, DynamicAnimation.TRANSLATION_X)
+
+        // Once TRANSLATION_X is done, the view should be at x = 10...
+        assertEquals(10f, testView.translationX, 1f)
+
+        // / ...TRANSLATION_Y should still be running...
+        assertTrue(animator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Y))
+
+        // ...and our end listener should have been called with x = 10, velocity = 0, and allEnded =
+        // false since TRANSLATION_Y is still running.
+        verify(mockEndListener).onAnimationEnd(
+                testView,
+                DynamicAnimation.TRANSLATION_X,
+                wasFling = false,
+                canceled = false,
+                finalValue = 10f,
+                finalVelocity = 0f,
+                allRelevantPropertyAnimsEnded = false)
+        verifyNoMoreInteractions(mockEndListener)
+
+        // The end action should not have been run yet.
+        verify(mockEndAction, times(0)).run()
+
+        // Block until TRANSLATION_Y finishes.
+        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(animator, DynamicAnimation.TRANSLATION_Y)
+
+        // The view should have been moved.
+        assertEquals(10f, testView.translationX, 1f)
+        assertEquals(500f, testView.translationY, 1f)
+
+        // The end listener should have been called, this time with TRANSLATION_Y, y = 50, and
+        // allEnded = true.
+        verify(mockEndListener).onAnimationEnd(
+                testView,
+                DynamicAnimation.TRANSLATION_Y,
+                wasFling = false,
+                canceled = false,
+                finalValue = 500f,
+                finalVelocity = 0f,
+                allRelevantPropertyAnimsEnded = true)
+        verifyNoMoreInteractions(mockEndListener)
+
+        // Now that all properties are done animating, the end action should have been called.
+        verify(mockEndAction, times(1)).run()
+    }
+
+    @Test
+    fun testUpdateListeners() {
+        animator
+                .spring(DynamicAnimation.TRANSLATION_X, 100f, springConfig)
+                .spring(DynamicAnimation.TRANSLATION_Y, 50f, springConfig)
+                .addUpdateListener(object : UpdateListener<View> {
+                    override fun onAnimationUpdateForProperty(
+                        target: View,
+                        values: UpdateMap<View>
+                    ) {
+                        mockUpdateListener.onAnimationUpdateForProperty(target, values)
+                    }
+                })
+                .start()
+
+        verifyUpdateListenerCalls(animator, mockUpdateListener)
+    }
+
+    @Test
+    fun testListenersNotCalledOnSubsequentAnimations() {
+        animator
+                .spring(DynamicAnimation.TRANSLATION_X, 10f, springConfig)
+                .addUpdateListener(mockUpdateListener)
+                .addEndListener(mockEndListener)
+                .withEndActions(mockEndAction::run)
+                .start()
+
+        verifyUpdateListenerCalls(animator, mockUpdateListener)
+        verify(mockEndListener, times(1)).onAnimationEnd(
+                eq(testView), eq(DynamicAnimation.TRANSLATION_X), eq(false), eq(false), anyFloat(),
+                anyFloat(), eq(true))
+        verify(mockEndAction, times(1)).run()
+
+        animator
+                .spring(DynamicAnimation.TRANSLATION_X, 0f, springConfig)
+                .start()
+
+        // We didn't pass any of the listeners/actions to the subsequent animation, so they should
+        // never have been called.
+        verifyNoMoreInteractions(mockUpdateListener)
+        verifyNoMoreInteractions(mockEndListener)
+        verifyNoMoreInteractions(mockEndAction)
+    }
+
+    @Test
+    @Throws(InterruptedException::class)
+    fun testAnimationsUpdatedWhileInMotion() {
+        PhysicsAnimatorTestUtils.setAllAnimationsBlock(false)
+
+        // Spring towards x = 100f.
+        animator
+                .spring(
+                        DynamicAnimation.TRANSLATION_X,
+                        100f,
+                        springConfig)
+                .start()
+
+        // Block until it reaches x = 50f.
+        PhysicsAnimatorTestUtils.blockUntilFirstAnimationFrameWhereTrue(
+                animator) { view -> view.translationX > 50f }
+
+        // Translation X value at the time of reversing the animation to spring to x = 0f.
+        val reversalTranslationX = testView.translationX
+
+        // Spring back towards 0f.
+        animator
+                .spring(
+                        DynamicAnimation.TRANSLATION_X,
+                        0f,
+                        // Lower the stiffness to ensure the update listener receives at least one
+                        // update frame where the view has continued to move to the right.
+                        springConfig.apply { stiffness = SpringForce.STIFFNESS_LOW })
+                .start()
+
+        // Wait for TRANSLATION_X.
+        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(animator, DynamicAnimation.TRANSLATION_X)
+
+        // Verify that the animation continued past the X value at the time of reversal, before
+        // springing back. This ensures the change in direction was not abrupt.
+        verifyAnimationUpdateFrames(
+                animator, DynamicAnimation.TRANSLATION_X,
+                { u -> u.value > reversalTranslationX },
+                { u -> u.value < reversalTranslationX })
+
+        // Verify that the view is where it should be.
+        assertEquals(0f, testView.translationX, 1f)
+    }
+
+    @Test
+    @Throws(InterruptedException::class)
+    @Ignore("Sporadically flaking.")
+    fun testAnimationsUpdatedWhileInMotion_originalListenersStillCalled() {
+        PhysicsAnimatorTestUtils.setAllAnimationsBlock(false)
+
+        // Spring TRANSLATION_X to 100f, with an update and end listener provided.
+        animator
+                .spring(
+                        DynamicAnimation.TRANSLATION_X,
+                        100f,
+                        // Use very low stiffness to ensure that all of the keyframes we're testing
+                        // for are reported to the update listener.
+                        springConfig.apply { stiffness = SpringForce.STIFFNESS_VERY_LOW })
+                .addUpdateListener(mockUpdateListener)
+                .addEndListener(mockEndListener)
+                .start()
+
+        // Wait until the animation is halfway there.
+        PhysicsAnimatorTestUtils.blockUntilFirstAnimationFrameWhereTrue(
+                animator) { view -> view.translationX > 50f }
+
+        // The end listener shouldn't have been called since the animation hasn't ended.
+        verifyNoMoreInteractions(mockEndListener)
+
+        // Make sure we called the update listener with appropriate values.
+        verifyAnimationUpdateFrames(animator, DynamicAnimation.TRANSLATION_X,
+                { u -> u.value > 0f },
+                { u -> u.value >= 50f })
+
+        // Mock a second end listener.
+        val secondEndListener = mock(EndListener::class.java) as EndListener<View>
+        val secondUpdateListener = mock(UpdateListener::class.java) as UpdateListener<View>
+
+        // Start a new animation that springs both TRANSLATION_X and TRANSLATION_Y, and provide it
+        // the second end listener. This new end listener should be called for the end of
+        // TRANSLATION_X and TRANSLATION_Y, with allEnded = true when both have ended.
+        animator
+                .spring(DynamicAnimation.TRANSLATION_X, 200f, springConfig)
+                .spring(DynamicAnimation.TRANSLATION_Y, 4000f, springConfig)
+                .addUpdateListener(secondUpdateListener)
+                .addEndListener(secondEndListener)
+                .start()
+
+        // Wait for TRANSLATION_X to end.
+        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(animator, DynamicAnimation.TRANSLATION_X)
+
+        // The update listener provided to the initial animation call (the one that only animated
+        // TRANSLATION_X) should have been called with values on the way to x = 200f. This is
+        // because the second animation call updated the original TRANSLATION_X animation.
+        verifyAnimationUpdateFrames(
+                animator, DynamicAnimation.TRANSLATION_X,
+                { u -> u.value > 100f }, { u -> u.value >= 200f })
+
+        // The original end listener should also have been called, with allEnded = true since it was
+        // provided to an animator that animated only TRANSLATION_X.
+        verify(mockEndListener, times(1))
+                .onAnimationEnd(
+                        testView, DynamicAnimation.TRANSLATION_X,
+                        wasFling = false,
+                        canceled = false,
+                        finalValue = 200f,
+                        finalVelocity = 0f,
+                        allRelevantPropertyAnimsEnded = true)
+        verifyNoMoreInteractions(mockEndListener)
+
+        // The second end listener should have been called, but with allEnded = false since it was
+        // provided to an animator that animated both TRANSLATION_X and TRANSLATION_Y.
+        verify(secondEndListener, times(1))
+                .onAnimationEnd(testView, DynamicAnimation.TRANSLATION_X,
+                        wasFling = false,
+                        canceled = false,
+                        finalValue = 200f,
+                        finalVelocity = 0f,
+                        allRelevantPropertyAnimsEnded = false)
+        verifyNoMoreInteractions(secondEndListener)
+
+        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(animator, DynamicAnimation.TRANSLATION_Y)
+
+        // The original end listener shouldn't receive any callbacks because it was not provided to
+        // an animator that animated TRANSLATION_Y.
+        verifyNoMoreInteractions(mockEndListener)
+
+        verify(secondEndListener, times(1))
+                .onAnimationEnd(testView, DynamicAnimation.TRANSLATION_Y,
+                        wasFling = false,
+                        canceled = false,
+                        finalValue = 4000f,
+                        finalVelocity = 0f,
+                        allRelevantPropertyAnimsEnded = true)
+        verifyNoMoreInteractions(secondEndListener)
+    }
+
+    @Test
+    fun testFlingRespectsMinMax() {
+        animator
+                .fling(DynamicAnimation.TRANSLATION_X,
+                        startVelocity = 1000f,
+                        friction = 1.1f,
+                        max = 10f)
+                .addEndListener(mockEndListener)
+                .start()
+
+        // Ensure that the view stopped at x = 10f, and the end listener was called once with that
+        // value.
+        assertEquals(10f, testView.translationX, 1f)
+        verify(mockEndListener, times(1))
+                .onAnimationEnd(
+                        eq(testView), eq(DynamicAnimation.TRANSLATION_X), eq(true), eq(false),
+                        eq(10f), anyFloat(), eq(true))
+
+        animator
+                .fling(
+                        DynamicAnimation.TRANSLATION_X,
+                        startVelocity = -1000f,
+                        friction = 1.1f,
+                        min = -5f)
+                .addEndListener(mockEndListener)
+                .start()
+
+        // Ensure that the view stopped at x = -5f, and the end listener was called once with that
+        // value.
+        assertEquals(-5f, testView.translationX, 1f)
+        verify(mockEndListener, times(1))
+                .onAnimationEnd(
+                        eq(testView), eq(DynamicAnimation.TRANSLATION_X), eq(true), eq(false),
+                        eq(-5f), anyFloat(), eq(true))
+    }
+
+    @Ignore("Started flaking despite no changes, tracking in b/299636216")
+    @Test
+    fun testIsPropertyAnimating() {
+        PhysicsAnimatorTestUtils.setAllAnimationsBlock(false)
+
+        testView.physicsAnimator
+                .spring(DynamicAnimation.TRANSLATION_X, 500f, springConfig)
+                .fling(DynamicAnimation.TRANSLATION_Y, 10f, flingConfig)
+                .spring(DynamicAnimation.TRANSLATION_Z, 1000f, springConfig)
+                .start()
+
+        // All of the properties we just started should be animating.
+        assertTrue(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_X))
+        assertTrue(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Y))
+        assertTrue(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Z))
+
+        // Block until x and y end.
+        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(testView.physicsAnimator,
+                DynamicAnimation.TRANSLATION_X, DynamicAnimation.TRANSLATION_Y)
+
+        // Verify that x and y are no longer animating, but that Z is (it's springing to 1000f).
+        assertFalse(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_X))
+        assertFalse(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Y))
+        assertTrue(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Z))
+
+        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Z)
+
+        assertFalse(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_X))
+        assertFalse(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Y))
+        assertFalse(testView.physicsAnimator.isPropertyAnimating(DynamicAnimation.TRANSLATION_Z))
+    }
+
+    @Test
+    fun testExtensionProperty() {
+        testView
+                .physicsAnimator
+                .spring(DynamicAnimation.TRANSLATION_X, 200f)
+                .start()
+
+        assertEquals(200f, testView.translationX, 1f)
+    }
+
+    @Test
+    @Ignore("Sporadically flaking.")
+    fun testFlingThenSpring() {
+        PhysicsAnimatorTestUtils.setAllAnimationsBlock(false)
+
+        // Start at 500f and fling hard to the left. We should quickly reach the 250f minimum, fly
+        // past it since there's so much velocity remaining, then spring back to 250f.
+        testView.translationX = 500f
+        animator
+                .flingThenSpring(
+                        DynamicAnimation.TRANSLATION_X,
+                        -5000f,
+                        flingConfig.apply { min = 250f },
+                        springConfig)
+                .addUpdateListener(mockUpdateListener)
+                .addEndListener(mockEndListener)
+                .withEndActions(mockEndAction::run)
+                .start()
+
+        // Block until we pass the minimum.
+        PhysicsAnimatorTestUtils.blockUntilFirstAnimationFrameWhereTrue(
+                animator) { v -> v.translationX <= 250f }
+
+        // Double check that the view is there.
+        assertTrue(testView.translationX <= 250f)
+
+        // The update listener should have been called with a value < 500f, and then a value less
+        // than or equal to the 250f minimum.
+        verifyAnimationUpdateFrames(animator, DynamicAnimation.TRANSLATION_X,
+                { u -> u.value < 500f },
+                { u -> u.value <= 250f })
+
+        // Despite the fact that the fling has ended, the end listener shouldn't have been called
+        // since we're about to begin springing the same property.
+        verifyNoMoreInteractions(mockEndListener)
+        verifyNoMoreInteractions(mockEndAction)
+
+        // Wait for the spring to finish.
+        PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_X)
+
+        // Make sure we continued past 250f since the spring should have been started with some
+        // remaining negative velocity from the fling.
+        verifyAnimationUpdateFrames(animator, DynamicAnimation.TRANSLATION_X,
+                { u -> u.value < 250f })
+
+        // At this point, the animation end listener should have been called once, and only once,
+        // when the spring ended at 250f.
+        verify(mockEndListener).onAnimationEnd(testView, DynamicAnimation.TRANSLATION_X,
+                wasFling = false,
+                canceled = false,
+                finalValue = 250f,
+                finalVelocity = 0f,
+                allRelevantPropertyAnimsEnded = true)
+        verifyNoMoreInteractions(mockEndListener)
+
+        // The end action should also have been called once.
+        verify(mockEndAction, times(1)).run()
+        verifyNoMoreInteractions(mockEndAction)
+
+        assertEquals(250f, testView.translationX)
+    }
+
+    @Test
+    fun testFlingThenSpring_objectOutsideFlingBounds() {
+        // Start the view at x = -500, well outside the fling bounds of min = 0f, with strong
+        // negative velocity.
+        testView.translationX = -500f
+        animator
+                .flingThenSpring(
+                        DynamicAnimation.TRANSLATION_X,
+                        -5000f,
+                        flingConfig.apply { min = 0f },
+                        springConfig)
+                .addUpdateListener(mockUpdateListener)
+                .addEndListener(mockEndListener)
+                .withEndActions(mockEndAction::run)
+                .start()
+
+        // The initial -5000f velocity should result in frames to the left of -500f before the view
+        // springs back towards 0f.
+        verifyAnimationUpdateFrames(
+                animator, DynamicAnimation.TRANSLATION_X,
+                { u -> u.value < -500f },
+                { u -> u.value > -500f })
+
+        // We should end up at the fling min.
+        assertEquals(0f, testView.translationX, 1f)
+    }
+
+    @Test
+    fun testFlingToMinMaxThenSpring() {
+        // Start at x = 500f.
+        testView.translationX = 500f
+
+        // Fling to the left at the very sad rate of -1 pixels per second. That won't get us much of
+        // anywhere, and certainly not to the 0f min.
+        animator
+                // Good thing we have flingToMinMaxThenSpring!
+                .flingThenSpring(
+                        DynamicAnimation.TRANSLATION_X,
+                        -10000f,
+                        flingConfig.apply { min = 0f },
+                        springConfig,
+                        flingMustReachMinOrMax = true)
+                .addUpdateListener(mockUpdateListener)
+                .addEndListener(mockEndListener)
+                .withEndActions(mockEndAction::run)
+                .start()
+
+        // Thanks, flingToMinMaxThenSpring, for adding enough velocity to get us here.
+        assertEquals(0f, testView.translationX, 1f)
+    }
+
+    /**
+     * Verifies that the calls to the mock update listener match the animation update frames
+     * reported by the test internal listener, in order.
+     */
+    private fun <T : Any> verifyUpdateListenerCalls(
+        animator: PhysicsAnimator<T>,
+        mockUpdateListener: UpdateListener<T>
+    ) {
+        val updates = getAnimationUpdateFrames(animator)
+
+        for (invocation in Mockito.mockingDetails(mockUpdateListener).invocations) {
+
+            // Grab the update map of Property -> AnimationUpdate that was passed to the mock update
+            // listener.
+            val updateMap = invocation.arguments[1]
+                    as ArrayMap<FloatPropertyCompat<in T>, PhysicsAnimator.AnimationUpdate>
+
+            //
+            for ((property, update) in updateMap) {
+                val updatesForProperty = updates[property]!!
+
+                // This update should be the next one in the list for this property.
+                if (update != updatesForProperty[0]) {
+                    Assert.fail("The update listener was called with an unexpected value: $update.")
+                }
+
+                updatesForProperty.remove(update)
+            }
+
+            val target = animator.weakTarget.get()
+            assertNotNull(target)
+            // Mark this invocation verified.
+            verify(mockUpdateListener).onAnimationUpdateForProperty(target!!, updateMap)
+        }
+
+        verifyNoMoreInteractions(mockUpdateListener)
+
+        // Since we were removing values as matching invocations were found, there should no longer
+        // be any values remaining. If there are, it means the update listener wasn't notified when
+        // it should have been.
+        assertEquals(0,
+                updates.values.fold(0, { count, propertyUpdates -> count + propertyUpdates.size }))
+
+        clearAnimationUpdateFrames(animator)
+    }
+}
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 66efa02..e7d37ad 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
@@ -51,6 +51,7 @@
 import com.android.wm.shell.common.DisplayController;
 import com.android.wm.shell.common.ShellExecutor;
 import com.android.wm.shell.common.TransactionPool;
+import com.android.wm.shell.shared.IHomeTransitionListener;
 import com.android.wm.shell.sysui.ShellController;
 import com.android.wm.shell.sysui.ShellInit;
 
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/unfold/UnfoldTransitionHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/unfold/UnfoldTransitionHandlerTest.java
index c5e229f..acc0bce 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/unfold/UnfoldTransitionHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/unfold/UnfoldTransitionHandlerTest.java
@@ -298,6 +298,32 @@
     }
 
     @Test
+    public void fold_animationInProgress_finishesTransition() {
+        TransitionRequestInfo requestInfo = createUnfoldTransitionRequestInfo();
+        TransitionFinishCallback finishCallback = mock(TransitionFinishCallback.class);
+
+        // Unfold
+        mShellUnfoldProgressProvider.onFoldStateChanged(/* isFolded= */ false);
+        mUnfoldTransitionHandler.handleRequest(mTransition, requestInfo);
+        mUnfoldTransitionHandler.startAnimation(
+                mTransition,
+                mock(TransitionInfo.class),
+                mock(SurfaceControl.Transaction.class),
+                mock(SurfaceControl.Transaction.class),
+                finishCallback
+        );
+
+        // Start animation but don't finish it
+        mShellUnfoldProgressProvider.onStateChangeStarted();
+        mShellUnfoldProgressProvider.onStateChangeProgress(0.5f);
+
+        // Fold
+        mShellUnfoldProgressProvider.onFoldStateChanged(/* isFolded= */ true);
+
+        verify(finishCallback).onTransitionFinished(any());
+    }
+
+    @Test
     public void mergeAnimation_eatsDisplayOnlyTransitions() {
         TransitionRequestInfo requestInfo = createUnfoldTransitionRequestInfo();
         mUnfoldTransitionHandler.handleRequest(mTransition, requestInfo);
diff --git a/libs/androidfw/ZipFileRO.cpp b/libs/androidfw/ZipFileRO.cpp
index d7b5914..9d4b426 100644
--- a/libs/androidfw/ZipFileRO.cpp
+++ b/libs/androidfw/ZipFileRO.cpp
@@ -304,7 +304,7 @@
     _ZipEntryRO *zipEntry = reinterpret_cast<_ZipEntryRO*>(entry);
     const int32_t error = ExtractEntryToFile(mHandle, &(zipEntry->entry), fd);
     if (error) {
-        ALOGW("ExtractToMemory failed with %s", ErrorCodeString(error));
+        ALOGW("ExtractToFile failed with %s", ErrorCodeString(error));
         return false;
     }
 
diff --git a/libs/dream/lowlight/tests/Android.bp b/libs/dream/lowlight/tests/Android.bp
index 4dafd0a..4254783 100644
--- a/libs/dream/lowlight/tests/Android.bp
+++ b/libs/dream/lowlight/tests/Android.bp
@@ -27,7 +27,7 @@
         "androidx.test.runner",
         "androidx.test.rules",
         "androidx.test.ext.junit",
-        "animationlib",
+        "//frameworks/libs/systemui:animationlib",
         "frameworks-base-testutils",
         "junit",
         "kotlinx_coroutines_test",
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index 014b841..29bb1b9 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -31,6 +31,7 @@
 aconfig_declarations {
     name: "hwui_flags",
     package: "com.android.graphics.hwui.flags",
+    container: "system",
     srcs: [
         "aconfig/hwui_flags.aconfig",
     ],
@@ -78,13 +79,13 @@
     include_dirs: [
         "external/skia/include/private",
         "external/skia/src/core",
+        "external/skia/src/utils",
     ],
 
     target: {
         android: {
             include_dirs: [
                 "external/skia/src/image",
-                "external/skia/src/utils",
                 "external/skia/src/gpu",
                 "external/skia/src/shaders",
             ],
@@ -345,6 +346,7 @@
         "jni/android_nio_utils.cpp",
         "jni/android_util_PathParser.cpp",
 
+        "jni/AnimatedImageDrawable.cpp",
         "jni/Bitmap.cpp",
         "jni/BitmapRegionDecoder.cpp",
         "jni/BufferUtils.cpp",
@@ -418,7 +420,6 @@
     target: {
         android: {
             srcs: [ // sources that depend on android only libraries
-                "jni/AnimatedImageDrawable.cpp",
                 "jni/android_graphics_TextureLayer.cpp",
                 "jni/android_graphics_HardwareRenderer.cpp",
                 "jni/android_graphics_HardwareBufferRenderer.cpp",
@@ -529,7 +530,9 @@
         "effects/GainmapRenderer.cpp",
         "pipeline/skia/BackdropFilterDrawable.cpp",
         "pipeline/skia/HolePunch.cpp",
+        "pipeline/skia/SkiaCpuPipeline.cpp",
         "pipeline/skia/SkiaDisplayList.cpp",
+        "pipeline/skia/SkiaPipeline.cpp",
         "pipeline/skia/SkiaRecordingCanvas.cpp",
         "pipeline/skia/StretchMask.cpp",
         "pipeline/skia/RenderNodeDrawable.cpp",
@@ -539,6 +542,7 @@
         "renderthread/RenderTask.cpp",
         "renderthread/TimeLord.cpp",
         "hwui/AnimatedImageDrawable.cpp",
+        "hwui/AnimatedImageThread.cpp",
         "hwui/Bitmap.cpp",
         "hwui/BlurDrawLooper.cpp",
         "hwui/Canvas.cpp",
@@ -567,6 +571,7 @@
         "HWUIProperties.sysprop",
         "Interpolator.cpp",
         "JankTracker.cpp",
+        "LayerUpdateQueue.cpp",
         "LightingInfo.cpp",
         "Matrix.cpp",
         "Mesh.cpp",
@@ -599,14 +604,13 @@
             local_include_dirs: ["platform/android"],
 
             srcs: [
-                "hwui/AnimatedImageThread.cpp",
                 "pipeline/skia/ATraceMemoryDump.cpp",
                 "pipeline/skia/GLFunctorDrawable.cpp",
                 "pipeline/skia/LayerDrawable.cpp",
                 "pipeline/skia/ShaderCache.cpp",
+                "pipeline/skia/SkiaGpuPipeline.cpp",
                 "pipeline/skia/SkiaMemoryTracer.cpp",
                 "pipeline/skia/SkiaOpenGLPipeline.cpp",
-                "pipeline/skia/SkiaPipeline.cpp",
                 "pipeline/skia/SkiaProfileRenderer.cpp",
                 "pipeline/skia/SkiaVulkanPipeline.cpp",
                 "pipeline/skia/VkFunctorDrawable.cpp",
@@ -630,7 +634,6 @@
                 "DeferredLayerUpdater.cpp",
                 "HardwareBitmapUploader.cpp",
                 "Layer.cpp",
-                "LayerUpdateQueue.cpp",
                 "ProfileDataContainer.cpp",
                 "Readback.cpp",
                 "TreeInfo.cpp",
diff --git a/libs/hwui/AnimatorManager.cpp b/libs/hwui/AnimatorManager.cpp
index 0780414..8645995 100644
--- a/libs/hwui/AnimatorManager.cpp
+++ b/libs/hwui/AnimatorManager.cpp
@@ -90,7 +90,13 @@
         }
         mCancelAllAnimators = false;
     } else {
-        for (auto& animator : mAnimators) {
+        // create a copy of mAnimators as onAnimatorTargetChanged can erase mAnimators.
+        FatVector<sp<BaseRenderNodeAnimator>> animators;
+        animators.reserve(mAnimators.size());
+        for (const auto& animator : mAnimators) {
+            animators.push_back(animator);
+        }
+        for (auto& animator : animators) {
             animator->pushStaging(mAnimationHandle->context());
         }
     }
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index ec53070..c1510d9 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -242,7 +242,7 @@
 
 enum class OverdrawColorSet { Default = 0, Deuteranomaly };
 
-enum class RenderPipelineType { SkiaGL, SkiaVulkan, NotInitialized = 128 };
+enum class RenderPipelineType { SkiaGL, SkiaVulkan, SkiaCpu, NotInitialized = 128 };
 
 enum class StretchEffectBehavior {
     ShaderHWUI,   // Stretch shader in HWUI only, matrix scale in SF
diff --git a/libs/hwui/WebViewFunctorManager.cpp b/libs/hwui/WebViewFunctorManager.cpp
index 5b4ab5f..efa9b11 100644
--- a/libs/hwui/WebViewFunctorManager.cpp
+++ b/libs/hwui/WebViewFunctorManager.cpp
@@ -16,15 +16,16 @@
 
 #include "WebViewFunctorManager.h"
 
+#include <log/log.h>
 #include <private/hwui/WebViewFunctor.h>
+#include <utils/Trace.h>
+
+#include <atomic>
+
 #include "Properties.h"
 #include "renderthread/CanvasContext.h"
 #include "renderthread/RenderThread.h"
 
-#include <log/log.h>
-#include <utils/Trace.h>
-#include <atomic>
-
 namespace android::uirenderer {
 
 namespace {
@@ -265,7 +266,7 @@
 }
 
 void WebViewFunctor::reportRenderingThreads(const int32_t* thread_ids, size_t size) {
-    // TODO(b/329219352): Pass the threads to HWUI and update the ADPF session.
+    mRenderingThreads = std::vector<int32_t>(thread_ids, thread_ids + size);
 }
 
 WebViewFunctorManager& WebViewFunctorManager::instance() {
@@ -365,6 +366,21 @@
     }
 }
 
+std::vector<int32_t> WebViewFunctorManager::getRenderingThreadsForActiveFunctors() {
+    std::vector<int32_t> renderingThreads;
+    std::lock_guard _lock{mLock};
+    for (const auto& iter : mActiveFunctors) {
+        const auto& functorThreads = iter->getRenderingThreads();
+        for (const auto& tid : functorThreads) {
+            if (std::find(renderingThreads.begin(), renderingThreads.end(), tid) ==
+                renderingThreads.end()) {
+                renderingThreads.push_back(tid);
+            }
+        }
+    }
+    return renderingThreads;
+}
+
 sp<WebViewFunctor::Handle> WebViewFunctorManager::handleFor(int functor) {
     std::lock_guard _lock{mLock};
     for (auto& iter : mActiveFunctors) {
diff --git a/libs/hwui/WebViewFunctorManager.h b/libs/hwui/WebViewFunctorManager.h
index 1bf2c1f..2d77dd8 100644
--- a/libs/hwui/WebViewFunctorManager.h
+++ b/libs/hwui/WebViewFunctorManager.h
@@ -60,6 +60,10 @@
 
         void onRemovedFromTree() { mReference.onRemovedFromTree(); }
 
+        const std::vector<int32_t>& getRenderingThreads() const {
+            return mReference.getRenderingThreads();
+        }
+
     private:
         friend class WebViewFunctor;
 
@@ -82,6 +86,7 @@
     void mergeTransaction(ASurfaceTransaction* transaction);
 
     void reportRenderingThreads(const int32_t* thread_ids, size_t size);
+    const std::vector<int32_t>& getRenderingThreads() const { return mRenderingThreads; }
 
     sp<Handle> createHandle() {
         LOG_ALWAYS_FATAL_IF(mCreatedHandle);
@@ -102,6 +107,7 @@
     bool mCreatedHandle = false;
     int32_t mParentSurfaceControlGenerationId = 0;
     ASurfaceControl* mSurfaceControl = nullptr;
+    std::vector<int32_t> mRenderingThreads;
 };
 
 class WebViewFunctorManager {
@@ -113,6 +119,7 @@
     void onContextDestroyed();
     void destroyFunctor(int functor);
     void reportRenderingThreads(int functor, const int32_t* thread_ids, size_t size);
+    std::vector<int32_t> getRenderingThreadsForActiveFunctors();
 
     sp<WebViewFunctor::Handle> handleFor(int functor);
 
diff --git a/libs/hwui/aconfig/hwui_flags.aconfig b/libs/hwui/aconfig/hwui_flags.aconfig
index 659bcdc..50f8b39 100644
--- a/libs/hwui/aconfig/hwui_flags.aconfig
+++ b/libs/hwui/aconfig/hwui_flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.graphics.hwui.flags"
+container: "system"
 
 flag {
   name: "clip_shader"
diff --git a/libs/hwui/hwui/AnimatedImageDrawable.cpp b/libs/hwui/hwui/AnimatedImageDrawable.cpp
index 27773a6..69613c7 100644
--- a/libs/hwui/hwui/AnimatedImageDrawable.cpp
+++ b/libs/hwui/hwui/AnimatedImageDrawable.cpp
@@ -15,18 +15,16 @@
  */
 
 #include "AnimatedImageDrawable.h"
-#ifdef __ANDROID__ // Layoutlib does not support AnimatedImageThread
-#include "AnimatedImageThread.h"
-#endif
-
-#include <gui/TraceUtils.h>
-#include "pipeline/skia/SkiaUtils.h"
 
 #include <SkPicture.h>
 #include <SkRefCnt.h>
+#include <gui/TraceUtils.h>
 
 #include <optional>
 
+#include "AnimatedImageThread.h"
+#include "pipeline/skia/SkiaUtils.h"
+
 namespace android {
 
 AnimatedImageDrawable::AnimatedImageDrawable(sk_sp<SkAnimatedImage> animatedImage, size_t bytesUsed,
@@ -185,10 +183,8 @@
     } else if (starting) {
         // The image has animated, and now is being reset. Queue up the first
         // frame, but keep showing the current frame until the first is ready.
-#ifdef __ANDROID__ // Layoutlib does not support AnimatedImageThread
         auto& thread = uirenderer::AnimatedImageThread::getInstance();
         mNextSnapshot = thread.reset(sk_ref_sp(this));
-#endif
     }
 
     bool finalFrame = false;
@@ -214,10 +210,8 @@
     }
 
     if (mRunning && !mNextSnapshot.valid()) {
-#ifdef __ANDROID__ // Layoutlib does not support AnimatedImageThread
         auto& thread = uirenderer::AnimatedImageThread::getInstance();
         mNextSnapshot = thread.decodeNextFrame(sk_ref_sp(this));
-#endif
     }
 
     if (!drawDirectly) {
diff --git a/libs/hwui/hwui/AnimatedImageThread.cpp b/libs/hwui/hwui/AnimatedImageThread.cpp
index 825dd4c..e39c8d5 100644
--- a/libs/hwui/hwui/AnimatedImageThread.cpp
+++ b/libs/hwui/hwui/AnimatedImageThread.cpp
@@ -16,7 +16,9 @@
 
 #include "AnimatedImageThread.h"
 
+#ifdef __ANDROID__
 #include <sys/resource.h>
+#endif
 
 namespace android {
 namespace uirenderer {
@@ -31,7 +33,9 @@
 }
 
 AnimatedImageThread::AnimatedImageThread() {
+#ifdef __ANDROID__
     setpriority(PRIO_PROCESS, 0, PRIORITY_NORMAL + PRIORITY_MORE_FAVORABLE);
+#endif
 }
 
 std::future<AnimatedImageDrawable::Snapshot> AnimatedImageThread::decodeNextFrame(
diff --git a/libs/hwui/jni/AnimatedImageDrawable.cpp b/libs/hwui/jni/AnimatedImageDrawable.cpp
index 90b1da8..0f80c55 100644
--- a/libs/hwui/jni/AnimatedImageDrawable.cpp
+++ b/libs/hwui/jni/AnimatedImageDrawable.cpp
@@ -25,7 +25,9 @@
 #include <hwui/AnimatedImageDrawable.h>
 #include <hwui/Canvas.h>
 #include <hwui/ImageDecoder.h>
+#ifdef __ANDROID__
 #include <utils/Looper.h>
+#endif
 
 #include "ColorFilter.h"
 #include "GraphicsJNI.h"
@@ -180,6 +182,23 @@
     drawable->setRepetitionCount(loopCount);
 }
 
+#ifndef __ANDROID__
+struct Message {
+    Message(int w) {}
+};
+
+class MessageHandler : public virtual RefBase {
+protected:
+    virtual ~MessageHandler() override {}
+
+public:
+    /**
+     * Handles a message.
+     */
+    virtual void handleMessage(const Message& message) = 0;
+};
+#endif
+
 class InvokeListener : public MessageHandler {
 public:
     InvokeListener(JNIEnv* env, jobject javaObject) {
@@ -204,6 +223,7 @@
 };
 
 class JniAnimationEndListener : public OnAnimationEndListener {
+#ifdef __ANDROID__
 public:
     JniAnimationEndListener(sp<Looper>&& looper, JNIEnv* env, jobject javaObject) {
         mListener = new InvokeListener(env, javaObject);
@@ -215,6 +235,17 @@
 private:
     sp<InvokeListener> mListener;
     sp<Looper> mLooper;
+#else
+public:
+    JniAnimationEndListener(JNIEnv* env, jobject javaObject) {
+        mListener = new InvokeListener(env, javaObject);
+    }
+
+    void onAnimationEnd() override { mListener->handleMessage(0); }
+
+private:
+    sp<InvokeListener> mListener;
+#endif
 };
 
 static void AnimatedImageDrawable_nSetOnAnimationEndListener(JNIEnv* env, jobject /*clazz*/,
@@ -223,6 +254,7 @@
     if (!jdrawable) {
         drawable->setOnAnimationEndListener(nullptr);
     } else {
+#ifdef __ANDROID__
         sp<Looper> looper = Looper::getForThread();
         if (!looper.get()) {
             doThrowISE(env,
@@ -233,6 +265,10 @@
 
         drawable->setOnAnimationEndListener(
                 std::make_unique<JniAnimationEndListener>(std::move(looper), env, jdrawable));
+#else
+        drawable->setOnAnimationEndListener(
+                std::make_unique<JniAnimationEndListener>(env, jdrawable));
+#endif
     }
 }
 
diff --git a/libs/hwui/pipeline/skia/SkiaCpuPipeline.cpp b/libs/hwui/pipeline/skia/SkiaCpuPipeline.cpp
new file mode 100644
index 0000000..5bbbc10
--- /dev/null
+++ b/libs/hwui/pipeline/skia/SkiaCpuPipeline.cpp
@@ -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.
+ */
+
+#include "pipeline/skia/SkiaCpuPipeline.h"
+
+#include <system/window.h>
+
+#include "DeviceInfo.h"
+#include "LightingInfo.h"
+#include "renderthread/Frame.h"
+#include "utils/Color.h"
+
+using namespace android::uirenderer::renderthread;
+
+namespace android {
+namespace uirenderer {
+namespace skiapipeline {
+
+void SkiaCpuPipeline::renderLayersImpl(const LayerUpdateQueue& layers, bool opaque) {
+    // Render all layers that need to be updated, in order.
+    for (size_t i = 0; i < layers.entries().size(); i++) {
+        RenderNode* layerNode = layers.entries()[i].renderNode.get();
+        // only schedule repaint if node still on layer - possible it may have been
+        // removed during a dropped frame, but layers may still remain scheduled so
+        // as not to lose info on what portion is damaged
+        if (CC_UNLIKELY(layerNode->getLayerSurface() == nullptr)) {
+            continue;
+        }
+        bool rendered = renderLayerImpl(layerNode, layers.entries()[i].damage);
+        if (!rendered) {
+            return;
+        }
+    }
+}
+
+// If the given node didn't have a layer surface, or had one of the wrong size, this method
+// creates a new one and returns true. Otherwise does nothing and returns false.
+bool SkiaCpuPipeline::createOrUpdateLayer(RenderNode* node,
+                                          const DamageAccumulator& damageAccumulator,
+                                          ErrorHandler* errorHandler) {
+    // compute the size of the surface (i.e. texture) to be allocated for this layer
+    const int surfaceWidth = ceilf(node->getWidth() / float(LAYER_SIZE)) * LAYER_SIZE;
+    const int surfaceHeight = ceilf(node->getHeight() / float(LAYER_SIZE)) * LAYER_SIZE;
+
+    SkSurface* layer = node->getLayerSurface();
+    if (!layer || layer->width() != surfaceWidth || layer->height() != surfaceHeight) {
+        SkImageInfo info;
+        info = SkImageInfo::Make(surfaceWidth, surfaceHeight, getSurfaceColorType(),
+                                 kPremul_SkAlphaType, getSurfaceColorSpace());
+        SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
+        node->setLayerSurface(SkSurfaces::Raster(info, &props));
+        if (node->getLayerSurface()) {
+            // update the transform in window of the layer to reset its origin wrt light source
+            // position
+            Matrix4 windowTransform;
+            damageAccumulator.computeCurrentTransform(&windowTransform);
+            node->getSkiaLayer()->inverseTransformInWindow.loadInverse(windowTransform);
+        } else {
+            String8 cachesOutput;
+            mRenderThread.cacheManager().dumpMemoryUsage(cachesOutput,
+                                                         &mRenderThread.renderState());
+            ALOGE("%s", cachesOutput.c_str());
+            if (errorHandler) {
+                std::ostringstream err;
+                err << "Unable to create layer for " << node->getName();
+                const int maxTextureSize = DeviceInfo::get()->maxTextureSize();
+                err << ", size " << info.width() << "x" << info.height() << " max size "
+                    << maxTextureSize << " color type " << (int)info.colorType() << " has context "
+                    << (int)(mRenderThread.getGrContext() != nullptr);
+                errorHandler->onError(err.str());
+            }
+        }
+        return true;
+    }
+    return false;
+}
+
+MakeCurrentResult SkiaCpuPipeline::makeCurrent() {
+    return MakeCurrentResult::AlreadyCurrent;
+}
+
+Frame SkiaCpuPipeline::getFrame() {
+    return Frame(mSurface->width(), mSurface->height(), 0);
+}
+
+IRenderPipeline::DrawResult SkiaCpuPipeline::draw(
+        const Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
+        const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
+        const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo,
+        const std::vector<sp<RenderNode>>& renderNodes, FrameInfoVisualizer* profiler,
+        const HardwareBufferRenderParams& bufferParams, std::mutex& profilerLock) {
+    LightingInfo::updateLighting(lightGeometry, lightInfo);
+    renderFrame(*layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, mSurface,
+                SkMatrix::I());
+    return {true, IRenderPipeline::DrawResult::kUnknownTime, android::base::unique_fd{}};
+}
+
+bool SkiaCpuPipeline::setSurface(ANativeWindow* surface, SwapBehavior swapBehavior) {
+    if (surface) {
+        ANativeWindowBuffer* buffer;
+        surface->dequeueBuffer(surface, &buffer, nullptr);
+        int width, height;
+        surface->query(surface, NATIVE_WINDOW_WIDTH, &width);
+        surface->query(surface, NATIVE_WINDOW_HEIGHT, &height);
+        SkImageInfo imageInfo =
+                SkImageInfo::Make(width, height, mSurfaceColorType,
+                                  SkAlphaType::kPremul_SkAlphaType, mSurfaceColorSpace);
+        size_t widthBytes = width * imageInfo.bytesPerPixel();
+        void* pixels = buffer->reserved[0];
+        mSurface = SkSurfaces::WrapPixels(imageInfo, pixels, widthBytes);
+    } else {
+        mSurface = sk_sp<SkSurface>();
+    }
+    return true;
+}
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/pipeline/skia/SkiaCpuPipeline.h b/libs/hwui/pipeline/skia/SkiaCpuPipeline.h
new file mode 100644
index 0000000..5a1014c
--- /dev/null
+++ b/libs/hwui/pipeline/skia/SkiaCpuPipeline.h
@@ -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.
+ */
+
+#pragma once
+
+#include "pipeline/skia/SkiaPipeline.h"
+
+namespace android {
+
+namespace uirenderer {
+namespace skiapipeline {
+
+class SkiaCpuPipeline : public SkiaPipeline {
+public:
+    SkiaCpuPipeline(renderthread::RenderThread& thread) : SkiaPipeline(thread) {}
+    ~SkiaCpuPipeline() {}
+
+    bool pinImages(std::vector<SkImage*>& mutableImages) override { return false; }
+    bool pinImages(LsaVector<sk_sp<Bitmap>>& images) override { return false; }
+    void unpinImages() override {}
+
+    // If the given node didn't have a layer surface, or had one of the wrong size, this method
+    // creates a new one and returns true. Otherwise does nothing and returns false.
+    bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
+                             ErrorHandler* errorHandler) override;
+    void renderLayersImpl(const LayerUpdateQueue& layers, bool opaque) override;
+    void setHardwareBuffer(AHardwareBuffer* hardwareBuffer) override {}
+    bool hasHardwareBuffer() override { return false; }
+
+    renderthread::MakeCurrentResult makeCurrent() override;
+    renderthread::Frame getFrame() override;
+    renderthread::IRenderPipeline::DrawResult draw(
+            const renderthread::Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
+            const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
+            const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo,
+            const std::vector<sp<RenderNode>>& renderNodes, FrameInfoVisualizer* profiler,
+            const renderthread::HardwareBufferRenderParams& bufferParams,
+            std::mutex& profilerLock) override;
+    bool swapBuffers(const renderthread::Frame& frame, IRenderPipeline::DrawResult& drawResult,
+                     const SkRect& screenDirty, FrameInfo* currentFrameInfo,
+                     bool* requireSwap) override {
+        return false;
+    }
+    DeferredLayerUpdater* createTextureLayer() override { return nullptr; }
+    bool setSurface(ANativeWindow* surface, renderthread::SwapBehavior swapBehavior) override;
+    [[nodiscard]] android::base::unique_fd flush() override {
+        return android::base::unique_fd(-1);
+    };
+    void onStop() override {}
+    bool isSurfaceReady() override { return mSurface.get() != nullptr; }
+    bool isContextReady() override { return true; }
+
+    const SkM44& getPixelSnapMatrix() const override {
+        static const SkM44 sSnapMatrix = SkM44();
+        return sSnapMatrix;
+    }
+
+private:
+    sk_sp<SkSurface> mSurface;
+};
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/pipeline/skia/SkiaGpuPipeline.cpp b/libs/hwui/pipeline/skia/SkiaGpuPipeline.cpp
new file mode 100644
index 0000000..7bfbfdc
--- /dev/null
+++ b/libs/hwui/pipeline/skia/SkiaGpuPipeline.cpp
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "pipeline/skia/SkiaGpuPipeline.h"
+
+#include <SkImageAndroid.h>
+#include <gui/TraceUtils.h>
+#include <include/android/SkSurfaceAndroid.h>
+#include <include/gpu/ganesh/SkSurfaceGanesh.h>
+
+using namespace android::uirenderer::renderthread;
+
+namespace android {
+namespace uirenderer {
+namespace skiapipeline {
+
+SkiaGpuPipeline::SkiaGpuPipeline(RenderThread& thread) : SkiaPipeline(thread) {}
+
+SkiaGpuPipeline::~SkiaGpuPipeline() {
+    unpinImages();
+}
+
+void SkiaGpuPipeline::renderLayersImpl(const LayerUpdateQueue& layers, bool opaque) {
+    sk_sp<GrDirectContext> cachedContext;
+
+    // Render all layers that need to be updated, in order.
+    for (size_t i = 0; i < layers.entries().size(); i++) {
+        RenderNode* layerNode = layers.entries()[i].renderNode.get();
+        // only schedule repaint if node still on layer - possible it may have been
+        // removed during a dropped frame, but layers may still remain scheduled so
+        // as not to lose info on what portion is damaged
+        if (CC_UNLIKELY(layerNode->getLayerSurface() == nullptr)) {
+            continue;
+        }
+        bool rendered = renderLayerImpl(layerNode, layers.entries()[i].damage);
+        if (!rendered) {
+            return;
+        }
+        // cache the current context so that we can defer flushing it until
+        // either all the layers have been rendered or the context changes
+        GrDirectContext* currentContext =
+                GrAsDirectContext(layerNode->getLayerSurface()->getCanvas()->recordingContext());
+        if (cachedContext.get() != currentContext) {
+            if (cachedContext.get()) {
+                ATRACE_NAME("flush layers (context changed)");
+                cachedContext->flushAndSubmit();
+            }
+            cachedContext.reset(SkSafeRef(currentContext));
+        }
+    }
+    if (cachedContext.get()) {
+        ATRACE_NAME("flush layers");
+        cachedContext->flushAndSubmit();
+    }
+}
+
+// If the given node didn't have a layer surface, or had one of the wrong size, this method
+// creates a new one and returns true. Otherwise does nothing and returns false.
+bool SkiaGpuPipeline::createOrUpdateLayer(RenderNode* node,
+                                          const DamageAccumulator& damageAccumulator,
+                                          ErrorHandler* errorHandler) {
+    // compute the size of the surface (i.e. texture) to be allocated for this layer
+    const int surfaceWidth = ceilf(node->getWidth() / float(LAYER_SIZE)) * LAYER_SIZE;
+    const int surfaceHeight = ceilf(node->getHeight() / float(LAYER_SIZE)) * LAYER_SIZE;
+
+    SkSurface* layer = node->getLayerSurface();
+    if (!layer || layer->width() != surfaceWidth || layer->height() != surfaceHeight) {
+        SkImageInfo info;
+        info = SkImageInfo::Make(surfaceWidth, surfaceHeight, getSurfaceColorType(),
+                                 kPremul_SkAlphaType, getSurfaceColorSpace());
+        SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
+        SkASSERT(mRenderThread.getGrContext() != nullptr);
+        node->setLayerSurface(SkSurfaces::RenderTarget(mRenderThread.getGrContext(),
+                                                       skgpu::Budgeted::kYes, info, 0,
+                                                       this->getSurfaceOrigin(), &props));
+        if (node->getLayerSurface()) {
+            // update the transform in window of the layer to reset its origin wrt light source
+            // position
+            Matrix4 windowTransform;
+            damageAccumulator.computeCurrentTransform(&windowTransform);
+            node->getSkiaLayer()->inverseTransformInWindow.loadInverse(windowTransform);
+        } else {
+            String8 cachesOutput;
+            mRenderThread.cacheManager().dumpMemoryUsage(cachesOutput,
+                                                         &mRenderThread.renderState());
+            ALOGE("%s", cachesOutput.c_str());
+            if (errorHandler) {
+                std::ostringstream err;
+                err << "Unable to create layer for " << node->getName();
+                const int maxTextureSize = DeviceInfo::get()->maxTextureSize();
+                err << ", size " << info.width() << "x" << info.height() << " max size "
+                    << maxTextureSize << " color type " << (int)info.colorType() << " has context "
+                    << (int)(mRenderThread.getGrContext() != nullptr);
+                errorHandler->onError(err.str());
+            }
+        }
+        return true;
+    }
+    return false;
+}
+
+bool SkiaGpuPipeline::pinImages(std::vector<SkImage*>& mutableImages) {
+    if (!mRenderThread.getGrContext()) {
+        ALOGD("Trying to pin an image with an invalid GrContext");
+        return false;
+    }
+    for (SkImage* image : mutableImages) {
+        if (skgpu::ganesh::PinAsTexture(mRenderThread.getGrContext(), image)) {
+            mPinnedImages.emplace_back(sk_ref_sp(image));
+        } else {
+            return false;
+        }
+    }
+    return true;
+}
+
+void SkiaGpuPipeline::unpinImages() {
+    for (auto& image : mPinnedImages) {
+        skgpu::ganesh::UnpinTexture(mRenderThread.getGrContext(), image.get());
+    }
+    mPinnedImages.clear();
+}
+
+void SkiaGpuPipeline::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) {
+    GrDirectContext* context = thread.getGrContext();
+    if (context && !bitmap->isHardware()) {
+        ATRACE_FORMAT("Bitmap#prepareToDraw %dx%d", bitmap->width(), bitmap->height());
+        auto image = bitmap->makeImage();
+        if (image.get()) {
+            skgpu::ganesh::PinAsTexture(context, image.get());
+            skgpu::ganesh::UnpinTexture(context, image.get());
+            // A submit is necessary as there may not be a frame coming soon, so without a call
+            // to submit these texture uploads can just sit in the queue building up until
+            // we run out of RAM
+            context->flushAndSubmit();
+        }
+    }
+}
+
+sk_sp<SkSurface> SkiaGpuPipeline::getBufferSkSurface(
+        const renderthread::HardwareBufferRenderParams& bufferParams) {
+    auto bufferColorSpace = bufferParams.getColorSpace();
+    if (mBufferSurface == nullptr || mBufferColorSpace == nullptr ||
+        !SkColorSpace::Equals(mBufferColorSpace.get(), bufferColorSpace.get())) {
+        mBufferSurface = SkSurfaces::WrapAndroidHardwareBuffer(
+                mRenderThread.getGrContext(), mHardwareBuffer, kTopLeft_GrSurfaceOrigin,
+                bufferColorSpace, nullptr, true);
+        mBufferColorSpace = bufferColorSpace;
+    }
+    return mBufferSurface;
+}
+
+void SkiaGpuPipeline::dumpResourceCacheUsage() const {
+    int resources;
+    size_t bytes;
+    mRenderThread.getGrContext()->getResourceCacheUsage(&resources, &bytes);
+    size_t maxBytes = mRenderThread.getGrContext()->getResourceCacheLimit();
+
+    SkString log("Resource Cache Usage:\n");
+    log.appendf("%8d items\n", resources);
+    log.appendf("%8zu bytes (%.2f MB) out of %.2f MB maximum\n", bytes,
+                bytes * (1.0f / (1024.0f * 1024.0f)), maxBytes * (1.0f / (1024.0f * 1024.0f)));
+
+    ALOGD("%s", log.c_str());
+}
+
+void SkiaGpuPipeline::setHardwareBuffer(AHardwareBuffer* buffer) {
+    if (mHardwareBuffer) {
+        AHardwareBuffer_release(mHardwareBuffer);
+        mHardwareBuffer = nullptr;
+    }
+
+    if (buffer) {
+        AHardwareBuffer_acquire(buffer);
+        mHardwareBuffer = buffer;
+    }
+}
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
index c8d5987..e4b1f916 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
@@ -14,25 +14,25 @@
  * limitations under the License.
  */
 
-#include "SkiaOpenGLPipeline.h"
+#include "pipeline/skia/SkiaOpenGLPipeline.h"
 
-#include <include/gpu/ganesh/SkSurfaceGanesh.h>
-#include <include/gpu/ganesh/gl/GrGLBackendSurface.h>
-#include <include/gpu/gl/GrGLTypes.h>
 #include <GrBackendSurface.h>
 #include <SkBlendMode.h>
 #include <SkImageInfo.h>
 #include <cutils/properties.h>
 #include <gui/TraceUtils.h>
+#include <include/gpu/ganesh/SkSurfaceGanesh.h>
+#include <include/gpu/ganesh/gl/GrGLBackendSurface.h>
+#include <include/gpu/gl/GrGLTypes.h>
 #include <strings.h>
 
 #include "DeferredLayerUpdater.h"
 #include "FrameInfo.h"
-#include "LayerDrawable.h"
 #include "LightingInfo.h"
-#include "SkiaPipeline.h"
-#include "SkiaProfileRenderer.h"
 #include "hwui/Bitmap.h"
+#include "pipeline/skia/LayerDrawable.h"
+#include "pipeline/skia/SkiaGpuPipeline.h"
+#include "pipeline/skia/SkiaProfileRenderer.h"
 #include "private/hwui/DrawGlInfo.h"
 #include "renderstate/RenderState.h"
 #include "renderthread/EglManager.h"
@@ -47,7 +47,7 @@
 namespace skiapipeline {
 
 SkiaOpenGLPipeline::SkiaOpenGLPipeline(RenderThread& thread)
-        : SkiaPipeline(thread), mEglManager(thread.eglManager()) {
+        : SkiaGpuPipeline(thread), mEglManager(thread.eglManager()) {
     thread.renderState().registerContextCallback(this);
 }
 
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h
deleted file mode 100644
index ebe8b6e..0000000
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <EGL/egl.h>
-#include <system/window.h>
-
-#include "SkiaPipeline.h"
-#include "renderstate/RenderState.h"
-#include "renderthread/HardwareBufferRenderParams.h"
-
-namespace android {
-
-class Bitmap;
-
-namespace uirenderer {
-namespace skiapipeline {
-
-class SkiaOpenGLPipeline : public SkiaPipeline, public IGpuContextCallback {
-public:
-    SkiaOpenGLPipeline(renderthread::RenderThread& thread);
-    virtual ~SkiaOpenGLPipeline();
-
-    renderthread::MakeCurrentResult makeCurrent() override;
-    renderthread::Frame getFrame() override;
-    renderthread::IRenderPipeline::DrawResult draw(
-            const renderthread::Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
-            const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
-            const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo,
-            const std::vector<sp<RenderNode> >& renderNodes, FrameInfoVisualizer* profiler,
-            const renderthread::HardwareBufferRenderParams& bufferParams,
-            std::mutex& profilerLock) override;
-    GrSurfaceOrigin getSurfaceOrigin() override { return kBottomLeft_GrSurfaceOrigin; }
-    bool swapBuffers(const renderthread::Frame& frame, IRenderPipeline::DrawResult& drawResult,
-                     const SkRect& screenDirty, FrameInfo* currentFrameInfo,
-                     bool* requireSwap) override;
-    DeferredLayerUpdater* createTextureLayer() override;
-    bool setSurface(ANativeWindow* surface, renderthread::SwapBehavior swapBehavior) override;
-    [[nodiscard]] android::base::unique_fd flush() override;
-    void onStop() override;
-    bool isSurfaceReady() override;
-    bool isContextReady() override;
-
-    const SkM44& getPixelSnapMatrix() const override {
-        // Small (~1/16th) nudge to ensure that pixel-aligned non-AA'd draws fill the
-        // desired fragment
-        static const SkScalar kOffset = 0.063f;
-        static const SkM44 sSnapMatrix = SkM44::Translate(kOffset, kOffset);
-        return sSnapMatrix;
-    }
-
-    static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor);
-
-protected:
-    void onContextDestroyed() override;
-
-private:
-    renderthread::EglManager& mEglManager;
-    EGLSurface mEglSurface = EGL_NO_SURFACE;
-    sp<ANativeWindow> mNativeWindow;
-    renderthread::SwapBehavior mSwapBehavior = renderthread::SwapBehavior::kSwap_discardBuffer;
-};
-
-} /* namespace skiapipeline */
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index 99469d1..34932b1 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -14,11 +14,8 @@
  * limitations under the License.
  */
 
-#include "SkiaPipeline.h"
+#include "pipeline/skia/SkiaPipeline.h"
 
-#include <include/android/SkSurfaceAndroid.h>
-#include <include/gpu/ganesh/SkSurfaceGanesh.h>
-#include <include/encode/SkPngEncoder.h>
 #include <SkCanvas.h>
 #include <SkColor.h>
 #include <SkColorSpace.h>
@@ -40,6 +37,9 @@
 #include <SkTypeface.h>
 #include <android-base/properties.h>
 #include <gui/TraceUtils.h>
+#include <include/android/SkSurfaceAndroid.h>
+#include <include/encode/SkPngEncoder.h>
+#include <include/gpu/ganesh/SkSurfaceGanesh.h>
 #include <unistd.h>
 
 #include <sstream>
@@ -62,37 +62,13 @@
     setSurfaceColorProperties(mColorMode);
 }
 
-SkiaPipeline::~SkiaPipeline() {
-    unpinImages();
-}
+SkiaPipeline::~SkiaPipeline() {}
 
 void SkiaPipeline::onDestroyHardwareResources() {
     unpinImages();
     mRenderThread.cacheManager().trimStaleResources();
 }
 
-bool SkiaPipeline::pinImages(std::vector<SkImage*>& mutableImages) {
-    if (!mRenderThread.getGrContext()) {
-        ALOGD("Trying to pin an image with an invalid GrContext");
-        return false;
-    }
-    for (SkImage* image : mutableImages) {
-        if (skgpu::ganesh::PinAsTexture(mRenderThread.getGrContext(), image)) {
-            mPinnedImages.emplace_back(sk_ref_sp(image));
-        } else {
-            return false;
-        }
-    }
-    return true;
-}
-
-void SkiaPipeline::unpinImages() {
-    for (auto& image : mPinnedImages) {
-        skgpu::ganesh::UnpinTexture(mRenderThread.getGrContext(), image.get());
-    }
-    mPinnedImages.clear();
-}
-
 void SkiaPipeline::renderLayers(const LightGeometry& lightGeometry,
                                 LayerUpdateQueue* layerUpdateQueue, bool opaque,
                                 const LightInfo& lightInfo) {
@@ -102,136 +78,48 @@
     layerUpdateQueue->clear();
 }
 
-void SkiaPipeline::renderLayersImpl(const LayerUpdateQueue& layers, bool opaque) {
-    sk_sp<GrDirectContext> cachedContext;
-
-    // Render all layers that need to be updated, in order.
-    for (size_t i = 0; i < layers.entries().size(); i++) {
-        RenderNode* layerNode = layers.entries()[i].renderNode.get();
-        // only schedule repaint if node still on layer - possible it may have been
-        // removed during a dropped frame, but layers may still remain scheduled so
-        // as not to lose info on what portion is damaged
-        if (CC_UNLIKELY(layerNode->getLayerSurface() == nullptr)) {
-            continue;
-        }
-        SkASSERT(layerNode->getLayerSurface());
-        SkiaDisplayList* displayList = layerNode->getDisplayList().asSkiaDl();
-        if (!displayList || displayList->isEmpty()) {
-            ALOGE("%p drawLayers(%s) : missing drawable", layerNode, layerNode->getName());
-            return;
-        }
-
-        const Rect& layerDamage = layers.entries()[i].damage;
-
-        SkCanvas* layerCanvas = layerNode->getLayerSurface()->getCanvas();
-
-        int saveCount = layerCanvas->save();
-        SkASSERT(saveCount == 1);
-
-        layerCanvas->androidFramework_setDeviceClipRestriction(layerDamage.toSkIRect());
-
-        // TODO: put localized light center calculation and storage to a drawable related code.
-        // It does not seem right to store something localized in a global state
-        // fix here and in recordLayers
-        const Vector3 savedLightCenter(LightingInfo::getLightCenterRaw());
-        Vector3 transformedLightCenter(savedLightCenter);
-        // map current light center into RenderNode's coordinate space
-        layerNode->getSkiaLayer()->inverseTransformInWindow.mapPoint3d(transformedLightCenter);
-        LightingInfo::setLightCenterRaw(transformedLightCenter);
-
-        const RenderProperties& properties = layerNode->properties();
-        const SkRect bounds = SkRect::MakeWH(properties.getWidth(), properties.getHeight());
-        if (properties.getClipToBounds() && layerCanvas->quickReject(bounds)) {
-            return;
-        }
-
-        ATRACE_FORMAT("drawLayer [%s] %.1f x %.1f", layerNode->getName(), bounds.width(),
-                      bounds.height());
-
-        layerNode->getSkiaLayer()->hasRenderedSinceRepaint = false;
-        layerCanvas->clear(SK_ColorTRANSPARENT);
-
-        RenderNodeDrawable root(layerNode, layerCanvas, false);
-        root.forceDraw(layerCanvas);
-        layerCanvas->restoreToCount(saveCount);
-
-        LightingInfo::setLightCenterRaw(savedLightCenter);
-
-        // cache the current context so that we can defer flushing it until
-        // either all the layers have been rendered or the context changes
-        GrDirectContext* currentContext =
-            GrAsDirectContext(layerNode->getLayerSurface()->getCanvas()->recordingContext());
-        if (cachedContext.get() != currentContext) {
-            if (cachedContext.get()) {
-                ATRACE_NAME("flush layers (context changed)");
-                cachedContext->flushAndSubmit();
-            }
-            cachedContext.reset(SkSafeRef(currentContext));
-        }
+bool SkiaPipeline::renderLayerImpl(RenderNode* layerNode, const Rect& layerDamage) {
+    SkASSERT(layerNode->getLayerSurface());
+    SkiaDisplayList* displayList = layerNode->getDisplayList().asSkiaDl();
+    if (!displayList || displayList->isEmpty()) {
+        ALOGE("%p drawLayers(%s) : missing drawable", layerNode, layerNode->getName());
+        return false;
     }
 
-    if (cachedContext.get()) {
-        ATRACE_NAME("flush layers");
-        cachedContext->flushAndSubmit();
-    }
-}
+    SkCanvas* layerCanvas = layerNode->getLayerSurface()->getCanvas();
 
-bool SkiaPipeline::createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
-                                       ErrorHandler* errorHandler) {
-    // compute the size of the surface (i.e. texture) to be allocated for this layer
-    const int surfaceWidth = ceilf(node->getWidth() / float(LAYER_SIZE)) * LAYER_SIZE;
-    const int surfaceHeight = ceilf(node->getHeight() / float(LAYER_SIZE)) * LAYER_SIZE;
+    int saveCount = layerCanvas->save();
+    SkASSERT(saveCount == 1);
 
-    SkSurface* layer = node->getLayerSurface();
-    if (!layer || layer->width() != surfaceWidth || layer->height() != surfaceHeight) {
-        SkImageInfo info;
-        info = SkImageInfo::Make(surfaceWidth, surfaceHeight, getSurfaceColorType(),
-                                 kPremul_SkAlphaType, getSurfaceColorSpace());
-        SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
-        SkASSERT(mRenderThread.getGrContext() != nullptr);
-        node->setLayerSurface(SkSurfaces::RenderTarget(mRenderThread.getGrContext(),
-                                                       skgpu::Budgeted::kYes, info, 0,
-                                                       this->getSurfaceOrigin(), &props));
-        if (node->getLayerSurface()) {
-            // update the transform in window of the layer to reset its origin wrt light source
-            // position
-            Matrix4 windowTransform;
-            damageAccumulator.computeCurrentTransform(&windowTransform);
-            node->getSkiaLayer()->inverseTransformInWindow.loadInverse(windowTransform);
-        } else {
-            String8 cachesOutput;
-            mRenderThread.cacheManager().dumpMemoryUsage(cachesOutput,
-                                                         &mRenderThread.renderState());
-            ALOGE("%s", cachesOutput.c_str());
-            if (errorHandler) {
-                std::ostringstream err;
-                err << "Unable to create layer for " << node->getName();
-                const int maxTextureSize = DeviceInfo::get()->maxTextureSize();
-                err << ", size " << info.width() << "x" << info.height() << " max size "
-                    << maxTextureSize << " color type " << (int)info.colorType() << " has context "
-                    << (int)(mRenderThread.getGrContext() != nullptr);
-                errorHandler->onError(err.str());
-            }
-        }
-        return true;
-    }
-    return false;
-}
+    layerCanvas->androidFramework_setDeviceClipRestriction(layerDamage.toSkIRect());
 
-void SkiaPipeline::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) {
-    GrDirectContext* context = thread.getGrContext();
-    if (context && !bitmap->isHardware()) {
-        ATRACE_FORMAT("Bitmap#prepareToDraw %dx%d", bitmap->width(), bitmap->height());
-        auto image = bitmap->makeImage();
-        if (image.get()) {
-            skgpu::ganesh::PinAsTexture(context, image.get());
-            skgpu::ganesh::UnpinTexture(context, image.get());
-            // A submit is necessary as there may not be a frame coming soon, so without a call
-            // to submit these texture uploads can just sit in the queue building up until
-            // we run out of RAM
-            context->flushAndSubmit();
-        }
+    // TODO: put localized light center calculation and storage to a drawable related code.
+    // It does not seem right to store something localized in a global state
+    // fix here and in recordLayers
+    const Vector3 savedLightCenter(LightingInfo::getLightCenterRaw());
+    Vector3 transformedLightCenter(savedLightCenter);
+    // map current light center into RenderNode's coordinate space
+    layerNode->getSkiaLayer()->inverseTransformInWindow.mapPoint3d(transformedLightCenter);
+    LightingInfo::setLightCenterRaw(transformedLightCenter);
+
+    const RenderProperties& properties = layerNode->properties();
+    const SkRect bounds = SkRect::MakeWH(properties.getWidth(), properties.getHeight());
+    if (properties.getClipToBounds() && layerCanvas->quickReject(bounds)) {
+        return false;
     }
+
+    ATRACE_FORMAT("drawLayer [%s] %.1f x %.1f", layerNode->getName(), bounds.width(),
+                  bounds.height());
+
+    layerNode->getSkiaLayer()->hasRenderedSinceRepaint = false;
+    layerCanvas->clear(SK_ColorTRANSPARENT);
+
+    RenderNodeDrawable root(layerNode, layerCanvas, false);
+    root.forceDraw(layerCanvas);
+    layerCanvas->restoreToCount(saveCount);
+
+    LightingInfo::setLightCenterRaw(savedLightCenter);
+    return true;
 }
 
 static void savePictureAsync(const sk_sp<SkData>& data, const std::string& filename) {
@@ -599,45 +487,6 @@
     }
 }
 
-void SkiaPipeline::dumpResourceCacheUsage() const {
-    int resources;
-    size_t bytes;
-    mRenderThread.getGrContext()->getResourceCacheUsage(&resources, &bytes);
-    size_t maxBytes = mRenderThread.getGrContext()->getResourceCacheLimit();
-
-    SkString log("Resource Cache Usage:\n");
-    log.appendf("%8d items\n", resources);
-    log.appendf("%8zu bytes (%.2f MB) out of %.2f MB maximum\n", bytes,
-                bytes * (1.0f / (1024.0f * 1024.0f)), maxBytes * (1.0f / (1024.0f * 1024.0f)));
-
-    ALOGD("%s", log.c_str());
-}
-
-void SkiaPipeline::setHardwareBuffer(AHardwareBuffer* buffer) {
-    if (mHardwareBuffer) {
-        AHardwareBuffer_release(mHardwareBuffer);
-        mHardwareBuffer = nullptr;
-    }
-
-    if (buffer) {
-        AHardwareBuffer_acquire(buffer);
-        mHardwareBuffer = buffer;
-    }
-}
-
-sk_sp<SkSurface> SkiaPipeline::getBufferSkSurface(
-        const renderthread::HardwareBufferRenderParams& bufferParams) {
-    auto bufferColorSpace = bufferParams.getColorSpace();
-    if (mBufferSurface == nullptr || mBufferColorSpace == nullptr ||
-        !SkColorSpace::Equals(mBufferColorSpace.get(), bufferColorSpace.get())) {
-        mBufferSurface = SkSurfaces::WrapAndroidHardwareBuffer(
-                mRenderThread.getGrContext(), mHardwareBuffer, kTopLeft_GrSurfaceOrigin,
-                bufferColorSpace, nullptr, true);
-        mBufferColorSpace = bufferColorSpace;
-    }
-    return mBufferSurface;
-}
-
 void SkiaPipeline::setSurfaceColorProperties(ColorMode colorMode) {
     mColorMode = colorMode;
     switch (colorMode) {
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h
index befee89..cf14b1f 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.h
@@ -42,18 +42,9 @@
 
     void onDestroyHardwareResources() override;
 
-    bool pinImages(std::vector<SkImage*>& mutableImages) override;
-    bool pinImages(LsaVector<sk_sp<Bitmap>>& images) override { return false; }
-    void unpinImages() override;
-
     void renderLayers(const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
                       bool opaque, const LightInfo& lightInfo) override;
 
-    // If the given node didn't have a layer surface, or had one of the wrong size, this method
-    // creates a new one and returns true. Otherwise does nothing and returns false.
-    bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
-                             ErrorHandler* errorHandler) override;
-
     void setSurfaceColorProperties(ColorMode colorMode) override;
     SkColorType getSurfaceColorType() const override { return mSurfaceColorType; }
     sk_sp<SkColorSpace> getSurfaceColorSpace() override { return mSurfaceColorSpace; }
@@ -63,9 +54,8 @@
                      const Rect& contentDrawBounds, sk_sp<SkSurface> surface,
                      const SkMatrix& preTransform);
 
-    static void prepareToDraw(const renderthread::RenderThread& thread, Bitmap* bitmap);
-
-    void renderLayersImpl(const LayerUpdateQueue& layers, bool opaque);
+    bool renderLayerImpl(RenderNode* layerNode, const Rect& layerDamage);
+    virtual void renderLayersImpl(const LayerUpdateQueue& layers, bool opaque) = 0;
 
     // Sets the recording callback to the provided function and the recording mode
     // to CallbackAPI
@@ -75,19 +65,11 @@
         mCaptureMode = callback ? CaptureMode::CallbackAPI : CaptureMode::None;
     }
 
-    virtual void setHardwareBuffer(AHardwareBuffer* buffer) override;
-    bool hasHardwareBuffer() override { return mHardwareBuffer != nullptr; }
-
     void setTargetSdrHdrRatio(float ratio) override;
 
 protected:
-    sk_sp<SkSurface> getBufferSkSurface(
-            const renderthread::HardwareBufferRenderParams& bufferParams);
-    void dumpResourceCacheUsage() const;
-
     renderthread::RenderThread& mRenderThread;
 
-    AHardwareBuffer* mHardwareBuffer = nullptr;
     sk_sp<SkSurface> mBufferSurface = nullptr;
     sk_sp<SkColorSpace> mBufferColorSpace = nullptr;
 
@@ -125,8 +107,6 @@
     // Set up a multi frame capture.
     bool setupMultiFrameCapture();
 
-    std::vector<sk_sp<SkImage>> mPinnedImages;
-
     // Block of properties used only for debugging to record a SkPicture and save it in a file.
     // There are three possible ways of recording drawing commands.
     enum class CaptureMode {
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
index fd0a8e0..d06dba0 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "SkiaVulkanPipeline.h"
+#include "pipeline/skia/SkiaVulkanPipeline.h"
 
 #include <GrDirectContext.h>
 #include <GrTypes.h>
@@ -28,10 +28,10 @@
 #include "DeferredLayerUpdater.h"
 #include "LightingInfo.h"
 #include "Readback.h"
-#include "ShaderCache.h"
-#include "SkiaPipeline.h"
-#include "SkiaProfileRenderer.h"
-#include "VkInteropFunctorDrawable.h"
+#include "pipeline/skia/ShaderCache.h"
+#include "pipeline/skia/SkiaGpuPipeline.h"
+#include "pipeline/skia/SkiaProfileRenderer.h"
+#include "pipeline/skia/VkInteropFunctorDrawable.h"
 #include "renderstate/RenderState.h"
 #include "renderthread/Frame.h"
 #include "renderthread/IRenderPipeline.h"
@@ -42,7 +42,8 @@
 namespace uirenderer {
 namespace skiapipeline {
 
-SkiaVulkanPipeline::SkiaVulkanPipeline(renderthread::RenderThread& thread) : SkiaPipeline(thread) {
+SkiaVulkanPipeline::SkiaVulkanPipeline(renderthread::RenderThread& thread)
+        : SkiaGpuPipeline(thread) {
     thread.renderState().registerContextCallback(this);
 }
 
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h
deleted file mode 100644
index 624eaa5..0000000
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "SkRefCnt.h"
-#include "SkiaPipeline.h"
-#include "renderstate/RenderState.h"
-#include "renderthread/HardwareBufferRenderParams.h"
-#include "renderthread/VulkanManager.h"
-#include "renderthread/VulkanSurface.h"
-
-class SkBitmap;
-struct SkRect;
-
-namespace android {
-namespace uirenderer {
-namespace skiapipeline {
-
-class SkiaVulkanPipeline : public SkiaPipeline, public IGpuContextCallback {
-public:
-    explicit SkiaVulkanPipeline(renderthread::RenderThread& thread);
-    virtual ~SkiaVulkanPipeline();
-
-    renderthread::MakeCurrentResult makeCurrent() override;
-    renderthread::Frame getFrame() override;
-    renderthread::IRenderPipeline::DrawResult draw(
-            const renderthread::Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
-            const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
-            const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo,
-            const std::vector<sp<RenderNode> >& renderNodes, FrameInfoVisualizer* profiler,
-            const renderthread::HardwareBufferRenderParams& bufferParams,
-            std::mutex& profilerLock) override;
-    GrSurfaceOrigin getSurfaceOrigin() override { return kTopLeft_GrSurfaceOrigin; }
-    bool swapBuffers(const renderthread::Frame& frame, IRenderPipeline::DrawResult& drawResult,
-                     const SkRect& screenDirty, FrameInfo* currentFrameInfo,
-                     bool* requireSwap) override;
-    DeferredLayerUpdater* createTextureLayer() override;
-    [[nodiscard]] android::base::unique_fd flush() override;
-
-    bool setSurface(ANativeWindow* surface, renderthread::SwapBehavior swapBehavior) override;
-    void onStop() override;
-    bool isSurfaceReady() override;
-    bool isContextReady() override;
-    void setTargetSdrHdrRatio(float ratio) override;
-    const SkM44& getPixelSnapMatrix() const override;
-
-    static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor);
-    static sk_sp<Bitmap> allocateHardwareBitmap(renderthread::RenderThread& thread,
-                                                SkBitmap& skBitmap);
-
-protected:
-    void onContextDestroyed() override;
-
-private:
-    renderthread::VulkanManager& vulkanManager();
-    renderthread::VulkanSurface* mVkSurface = nullptr;
-    sp<ANativeWindow> mNativeWindow;
-};
-
-} /* namespace skiapipeline */
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/platform/android/pipeline/skia/SkiaGpuPipeline.h b/libs/hwui/platform/android/pipeline/skia/SkiaGpuPipeline.h
new file mode 100644
index 0000000..9159eae
--- /dev/null
+++ b/libs/hwui/platform/android/pipeline/skia/SkiaGpuPipeline.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "pipeline/skia/SkiaPipeline.h"
+
+namespace android {
+namespace uirenderer {
+namespace skiapipeline {
+
+class SkiaGpuPipeline : public SkiaPipeline {
+public:
+    SkiaGpuPipeline(renderthread::RenderThread& thread);
+    virtual ~SkiaGpuPipeline();
+
+    virtual GrSurfaceOrigin getSurfaceOrigin() = 0;
+
+    // If the given node didn't have a layer surface, or had one of the wrong size, this method
+    // creates a new one and returns true. Otherwise does nothing and returns false.
+    bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
+                             ErrorHandler* errorHandler) override;
+
+    bool pinImages(std::vector<SkImage*>& mutableImages) override;
+    bool pinImages(LsaVector<sk_sp<Bitmap>>& images) override { return false; }
+    void unpinImages() override;
+    void renderLayersImpl(const LayerUpdateQueue& layers, bool opaque) override;
+    void setHardwareBuffer(AHardwareBuffer* hardwareBuffer) override;
+    bool hasHardwareBuffer() override { return mHardwareBuffer != nullptr; }
+
+    static void prepareToDraw(const renderthread::RenderThread& thread, Bitmap* bitmap);
+
+protected:
+    sk_sp<SkSurface> getBufferSkSurface(
+            const renderthread::HardwareBufferRenderParams& bufferParams);
+    void dumpResourceCacheUsage() const;
+
+    AHardwareBuffer* mHardwareBuffer = nullptr;
+
+private:
+    std::vector<sk_sp<SkImage>> mPinnedImages;
+};
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/platform/android/pipeline/skia/SkiaOpenGLPipeline.h b/libs/hwui/platform/android/pipeline/skia/SkiaOpenGLPipeline.h
new file mode 100644
index 0000000..6e74782
--- /dev/null
+++ b/libs/hwui/platform/android/pipeline/skia/SkiaOpenGLPipeline.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <EGL/egl.h>
+#include <system/window.h>
+
+#include "pipeline/skia/SkiaGpuPipeline.h"
+#include "renderstate/RenderState.h"
+#include "renderthread/HardwareBufferRenderParams.h"
+
+namespace android {
+
+class Bitmap;
+
+namespace uirenderer {
+namespace skiapipeline {
+
+class SkiaOpenGLPipeline : public SkiaGpuPipeline, public IGpuContextCallback {
+public:
+    SkiaOpenGLPipeline(renderthread::RenderThread& thread);
+    virtual ~SkiaOpenGLPipeline();
+
+    renderthread::MakeCurrentResult makeCurrent() override;
+    renderthread::Frame getFrame() override;
+    renderthread::IRenderPipeline::DrawResult draw(
+            const renderthread::Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
+            const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
+            const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo,
+            const std::vector<sp<RenderNode> >& renderNodes, FrameInfoVisualizer* profiler,
+            const renderthread::HardwareBufferRenderParams& bufferParams,
+            std::mutex& profilerLock) override;
+    GrSurfaceOrigin getSurfaceOrigin() override { return kBottomLeft_GrSurfaceOrigin; }
+    bool swapBuffers(const renderthread::Frame& frame, IRenderPipeline::DrawResult& drawResult,
+                     const SkRect& screenDirty, FrameInfo* currentFrameInfo,
+                     bool* requireSwap) override;
+    DeferredLayerUpdater* createTextureLayer() override;
+    bool setSurface(ANativeWindow* surface, renderthread::SwapBehavior swapBehavior) override;
+    [[nodiscard]] android::base::unique_fd flush() override;
+    void onStop() override;
+    bool isSurfaceReady() override;
+    bool isContextReady() override;
+
+    const SkM44& getPixelSnapMatrix() const override {
+        // Small (~1/16th) nudge to ensure that pixel-aligned non-AA'd draws fill the
+        // desired fragment
+        static const SkScalar kOffset = 0.063f;
+        static const SkM44 sSnapMatrix = SkM44::Translate(kOffset, kOffset);
+        return sSnapMatrix;
+    }
+
+    static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor);
+
+protected:
+    void onContextDestroyed() override;
+
+private:
+    renderthread::EglManager& mEglManager;
+    EGLSurface mEglSurface = EGL_NO_SURFACE;
+    sp<ANativeWindow> mNativeWindow;
+    renderthread::SwapBehavior mSwapBehavior = renderthread::SwapBehavior::kSwap_discardBuffer;
+};
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/platform/android/pipeline/skia/SkiaVulkanPipeline.h b/libs/hwui/platform/android/pipeline/skia/SkiaVulkanPipeline.h
new file mode 100644
index 0000000..0d30df4
--- /dev/null
+++ b/libs/hwui/platform/android/pipeline/skia/SkiaVulkanPipeline.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "SkRefCnt.h"
+#include "pipeline/skia/SkiaGpuPipeline.h"
+#include "renderstate/RenderState.h"
+#include "renderthread/HardwareBufferRenderParams.h"
+#include "renderthread/VulkanManager.h"
+#include "renderthread/VulkanSurface.h"
+
+class SkBitmap;
+struct SkRect;
+
+namespace android {
+namespace uirenderer {
+namespace skiapipeline {
+
+class SkiaVulkanPipeline : public SkiaGpuPipeline, public IGpuContextCallback {
+public:
+    explicit SkiaVulkanPipeline(renderthread::RenderThread& thread);
+    virtual ~SkiaVulkanPipeline();
+
+    renderthread::MakeCurrentResult makeCurrent() override;
+    renderthread::Frame getFrame() override;
+    renderthread::IRenderPipeline::DrawResult draw(
+            const renderthread::Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
+            const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
+            const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo,
+            const std::vector<sp<RenderNode> >& renderNodes, FrameInfoVisualizer* profiler,
+            const renderthread::HardwareBufferRenderParams& bufferParams,
+            std::mutex& profilerLock) override;
+    GrSurfaceOrigin getSurfaceOrigin() override { return kTopLeft_GrSurfaceOrigin; }
+    bool swapBuffers(const renderthread::Frame& frame, IRenderPipeline::DrawResult& drawResult,
+                     const SkRect& screenDirty, FrameInfo* currentFrameInfo,
+                     bool* requireSwap) override;
+    DeferredLayerUpdater* createTextureLayer() override;
+    [[nodiscard]] android::base::unique_fd flush() override;
+
+    bool setSurface(ANativeWindow* surface, renderthread::SwapBehavior swapBehavior) override;
+    void onStop() override;
+    bool isSurfaceReady() override;
+    bool isContextReady() override;
+    void setTargetSdrHdrRatio(float ratio) override;
+    const SkM44& getPixelSnapMatrix() const override;
+
+    static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor);
+    static sk_sp<Bitmap> allocateHardwareBitmap(renderthread::RenderThread& thread,
+                                                SkBitmap& skBitmap);
+
+protected:
+    void onContextDestroyed() override;
+
+private:
+    renderthread::VulkanManager& vulkanManager();
+    renderthread::VulkanSurface* mVkSurface = nullptr;
+    sp<ANativeWindow> mNativeWindow;
+};
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/platform/host/android/api-level.h b/libs/hwui/platform/host/android/api-level.h
new file mode 120000
index 0000000..4fb4784
--- /dev/null
+++ b/libs/hwui/platform/host/android/api-level.h
@@ -0,0 +1 @@
+../../../../../../../bionic/libc/include/android/api-level.h
\ No newline at end of file
diff --git a/libs/hwui/platform/host/pipeline/skia/SkiaGpuPipeline.h b/libs/hwui/platform/host/pipeline/skia/SkiaGpuPipeline.h
new file mode 100644
index 0000000..a717265
--- /dev/null
+++ b/libs/hwui/platform/host/pipeline/skia/SkiaGpuPipeline.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "pipeline/skia/SkiaPipeline.h"
+#include "renderthread/Frame.h"
+
+namespace android {
+namespace uirenderer {
+namespace skiapipeline {
+
+class SkiaGpuPipeline : public SkiaPipeline {
+public:
+    SkiaGpuPipeline(renderthread::RenderThread& thread) : SkiaPipeline(thread) {}
+    ~SkiaGpuPipeline() {}
+
+    bool pinImages(std::vector<SkImage*>& mutableImages) override { return false; }
+    bool pinImages(LsaVector<sk_sp<Bitmap>>& images) override { return false; }
+    void unpinImages() override {}
+
+    // If the given node didn't have a layer surface, or had one of the wrong size, this method
+    // creates a new one and returns true. Otherwise does nothing and returns false.
+    bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
+                             ErrorHandler* errorHandler) override {
+        return false;
+    }
+    void renderLayersImpl(const LayerUpdateQueue& layers, bool opaque) override {}
+    void setHardwareBuffer(AHardwareBuffer* hardwareBuffer) override {}
+    bool hasHardwareBuffer() override { return false; }
+
+    renderthread::MakeCurrentResult makeCurrent() override {
+        return renderthread::MakeCurrentResult::Failed;
+    }
+    renderthread::Frame getFrame() override { return renderthread::Frame(0, 0, 0); }
+    renderthread::IRenderPipeline::DrawResult draw(
+            const renderthread::Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
+            const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
+            const Rect& contentDrawBounds, bool opaque, const LightInfo& lightInfo,
+            const std::vector<sp<RenderNode>>& renderNodes, FrameInfoVisualizer* profiler,
+            const renderthread::HardwareBufferRenderParams& bufferParams,
+            std::mutex& profilerLock) override {
+        return {false, IRenderPipeline::DrawResult::kUnknownTime, android::base::unique_fd(-1)};
+    }
+    bool swapBuffers(const renderthread::Frame& frame, IRenderPipeline::DrawResult& drawResult,
+                     const SkRect& screenDirty, FrameInfo* currentFrameInfo,
+                     bool* requireSwap) override {
+        return false;
+    }
+    DeferredLayerUpdater* createTextureLayer() override { return nullptr; }
+    bool setSurface(ANativeWindow* surface, renderthread::SwapBehavior swapBehavior) override {
+        return false;
+    }
+    [[nodiscard]] android::base::unique_fd flush() override {
+        return android::base::unique_fd(-1);
+    };
+    void onStop() override {}
+    bool isSurfaceReady() override { return false; }
+    bool isContextReady() override { return false; }
+
+    const SkM44& getPixelSnapMatrix() const override {
+        static const SkM44 sSnapMatrix = SkM44();
+        return sSnapMatrix;
+    }
+    static void prepareToDraw(const renderthread::RenderThread& thread, Bitmap* bitmap) {}
+};
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/platform/host/pipeline/skia/SkiaOpenGLPipeline.h b/libs/hwui/platform/host/pipeline/skia/SkiaOpenGLPipeline.h
new file mode 100644
index 0000000..4fafbcc
--- /dev/null
+++ b/libs/hwui/platform/host/pipeline/skia/SkiaOpenGLPipeline.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "pipeline/skia/SkiaGpuPipeline.h"
+
+namespace android {
+
+namespace uirenderer {
+namespace skiapipeline {
+
+class SkiaOpenGLPipeline : public SkiaGpuPipeline {
+public:
+    SkiaOpenGLPipeline(renderthread::RenderThread& thread) : SkiaGpuPipeline(thread) {}
+
+    static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor) {}
+};
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/platform/host/pipeline/skia/SkiaVulkanPipeline.h b/libs/hwui/platform/host/pipeline/skia/SkiaVulkanPipeline.h
new file mode 100644
index 0000000..d54caef
--- /dev/null
+++ b/libs/hwui/platform/host/pipeline/skia/SkiaVulkanPipeline.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "pipeline/skia/SkiaGpuPipeline.h"
+
+namespace android {
+
+namespace uirenderer {
+namespace skiapipeline {
+
+class SkiaVulkanPipeline : public SkiaGpuPipeline {
+public:
+    SkiaVulkanPipeline(renderthread::RenderThread& thread) : SkiaGpuPipeline(thread) {}
+
+    static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor) {}
+};
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index abf64d0..22de2f2 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -35,8 +35,8 @@
 #include "Properties.h"
 #include "RenderThread.h"
 #include "hwui/Canvas.h"
+#include "pipeline/skia/SkiaGpuPipeline.h"
 #include "pipeline/skia/SkiaOpenGLPipeline.h"
-#include "pipeline/skia/SkiaPipeline.h"
 #include "pipeline/skia/SkiaVulkanPipeline.h"
 #include "thread/CommonPool.h"
 #include "utils/GLUtils.h"
@@ -108,7 +108,7 @@
 }
 
 void CanvasContext::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) {
-    skiapipeline::SkiaPipeline::prepareToDraw(thread, bitmap);
+    skiapipeline::SkiaGpuPipeline::prepareToDraw(thread, bitmap);
 }
 
 CanvasContext::CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode,
@@ -777,6 +777,8 @@
                                  (std::min(syncDelayDuration, mLastDequeueBufferDuration)) -
                                  dequeueBufferDuration - idleDuration;
         mHintSessionWrapper->reportActualWorkDuration(actualDuration);
+        mHintSessionWrapper->setActiveFunctorThreads(
+                WebViewFunctorManager::instance().getRenderingThreadsForActiveFunctors());
     }
 
     mLastDequeueBufferDuration = dequeueBufferDuration;
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index 2904dfe..708b011 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -442,14 +442,17 @@
         }
 
         // TODO: maybe we want to get rid of the WCG check if overlay properties just works?
-        const bool canUseFp16 = DeviceInfo::get()->isSupportFp16ForHdr() ||
-                                DeviceInfo::get()->getWideColorType() == kRGBA_F16_SkColorType;
+        bool canUseFp16 = DeviceInfo::get()->isSupportFp16ForHdr() ||
+                DeviceInfo::get()->getWideColorType() == kRGBA_F16_SkColorType;
 
-        if (canUseFp16) {
-            if (mEglConfigF16 == EGL_NO_CONFIG_KHR) {
-                colorMode = ColorMode::Default;
-            } else {
-                config = mEglConfigF16;
+        if (colorMode == ColorMode::Hdr) {
+            if (canUseFp16 && !DeviceInfo::get()->isSupportRgba10101010ForHdr()) {
+                if (mEglConfigF16 == EGL_NO_CONFIG_KHR) {
+                    // If the driver doesn't support fp16 then fallback to 8-bit
+                    canUseFp16 = false;
+                } else {
+                    config = mEglConfigF16;
+                }
             }
         }
 
diff --git a/libs/hwui/renderthread/HintSessionWrapper.cpp b/libs/hwui/renderthread/HintSessionWrapper.cpp
index 2362331..6993d52 100644
--- a/libs/hwui/renderthread/HintSessionWrapper.cpp
+++ b/libs/hwui/renderthread/HintSessionWrapper.cpp
@@ -20,6 +20,7 @@
 #include <private/performance_hint_private.h>
 #include <utils/Log.h>
 
+#include <algorithm>
 #include <chrono>
 #include <vector>
 
@@ -49,6 +50,7 @@
     BIND_APH_METHOD(updateTargetWorkDuration);
     BIND_APH_METHOD(reportActualWorkDuration);
     BIND_APH_METHOD(sendHint);
+    BIND_APH_METHOD(setThreads);
 
     mInitialized = true;
 }
@@ -67,6 +69,10 @@
         mHintSession = mHintSessionFuture->get();
         mHintSessionFuture = std::nullopt;
     }
+    if (mSetThreadsFuture.has_value()) {
+        mSetThreadsFuture->wait();
+        mSetThreadsFuture = std::nullopt;
+    }
     if (mHintSession) {
         mBinding->closeSession(mHintSession);
         mSessionValid = true;
@@ -106,16 +112,16 @@
     APerformanceHintManager* manager = mBinding->getManager();
     if (!manager) return false;
 
-    std::vector<pid_t> tids = CommonPool::getThreadIds();
-    tids.push_back(mUiThreadId);
-    tids.push_back(mRenderThreadId);
+    mPermanentSessionTids = CommonPool::getThreadIds();
+    mPermanentSessionTids.push_back(mUiThreadId);
+    mPermanentSessionTids.push_back(mRenderThreadId);
 
     // Use the cached target value if there is one, otherwise use a default. This is to ensure
     // the cached target and target in PowerHAL are consistent, and that it updates correctly
     // whenever there is a change.
     int64_t targetDurationNanos =
             mLastTargetWorkDuration == 0 ? kDefaultTargetDuration : mLastTargetWorkDuration;
-    mHintSessionFuture = CommonPool::async([=, this, tids = std::move(tids)] {
+    mHintSessionFuture = CommonPool::async([=, this, tids = mPermanentSessionTids] {
         return mBinding->createSession(manager, tids.data(), tids.size(), targetDurationNanos);
     });
     return false;
@@ -143,6 +149,23 @@
     mLastFrameNotification = systemTime();
 }
 
+void HintSessionWrapper::setActiveFunctorThreads(std::vector<pid_t> threadIds) {
+    if (!init()) return;
+    if (!mBinding || !mHintSession) return;
+    // Sort the vector to make sure they're compared as sets.
+    std::sort(threadIds.begin(), threadIds.end());
+    if (threadIds == mActiveFunctorTids) return;
+    mActiveFunctorTids = std::move(threadIds);
+    std::vector<pid_t> combinedTids = mPermanentSessionTids;
+    std::copy(mActiveFunctorTids.begin(), mActiveFunctorTids.end(),
+              std::back_inserter(combinedTids));
+    mSetThreadsFuture = CommonPool::async([this, tids = std::move(combinedTids)] {
+        int ret = mBinding->setThreads(mHintSession, tids.data(), tids.size());
+        ALOGE_IF(ret != 0, "APerformaceHint_setThreads failed: %d", ret);
+        return ret;
+    });
+}
+
 void HintSessionWrapper::sendLoadResetHint() {
     static constexpr int kMaxResetsSinceLastReport = 2;
     if (!init()) return;
diff --git a/libs/hwui/renderthread/HintSessionWrapper.h b/libs/hwui/renderthread/HintSessionWrapper.h
index 41891cd..14e7a53 100644
--- a/libs/hwui/renderthread/HintSessionWrapper.h
+++ b/libs/hwui/renderthread/HintSessionWrapper.h
@@ -20,6 +20,7 @@
 
 #include <future>
 #include <optional>
+#include <vector>
 
 #include "utils/TimeUtils.h"
 
@@ -47,11 +48,15 @@
     nsecs_t getLastUpdate();
     void delayedDestroy(renderthread::RenderThread& rt, nsecs_t delay,
                         std::shared_ptr<HintSessionWrapper> wrapperPtr);
+    // Must be called on Render thread. Otherwise can cause a race condition.
+    void setActiveFunctorThreads(std::vector<pid_t> threadIds);
 
 private:
     APerformanceHintSession* mHintSession = nullptr;
     // This needs to work concurrently for testing
     std::optional<std::shared_future<APerformanceHintSession*>> mHintSessionFuture;
+    // This needs to work concurrently for testing
+    std::optional<std::shared_future<int>> mSetThreadsFuture;
 
     int mResetsSinceLastReport = 0;
     nsecs_t mLastFrameNotification = 0;
@@ -59,6 +64,8 @@
 
     pid_t mUiThreadId;
     pid_t mRenderThreadId;
+    std::vector<pid_t> mPermanentSessionTids;
+    std::vector<pid_t> mActiveFunctorTids;
 
     bool mSessionValid = true;
 
@@ -82,6 +89,8 @@
         void (*reportActualWorkDuration)(APerformanceHintSession* session,
                                          int64_t actualDuration) = nullptr;
         void (*sendHint)(APerformanceHintSession* session, int32_t hintId) = nullptr;
+        int (*setThreads)(APerformanceHintSession* session, const pid_t* tids,
+                          size_t size) = nullptr;
 
     private:
         bool mInitialized = false;
diff --git a/libs/hwui/renderthread/IRenderPipeline.h b/libs/hwui/renderthread/IRenderPipeline.h
index b8c3a4d..ee1d1f8 100644
--- a/libs/hwui/renderthread/IRenderPipeline.h
+++ b/libs/hwui/renderthread/IRenderPipeline.h
@@ -30,8 +30,6 @@
 #include "SwapBehavior.h"
 #include "hwui/Bitmap.h"
 
-class GrDirectContext;
-
 struct ANativeWindow;
 
 namespace android {
@@ -94,7 +92,6 @@
     virtual void setSurfaceColorProperties(ColorMode colorMode) = 0;
     virtual SkColorType getSurfaceColorType() const = 0;
     virtual sk_sp<SkColorSpace> getSurfaceColorSpace() = 0;
-    virtual GrSurfaceOrigin getSurfaceOrigin() = 0;
     virtual void setPictureCapturedCallback(
             const std::function<void(sk_sp<SkPicture>&&)>& callback) = 0;
 
diff --git a/libs/hwui/tests/unit/HintSessionWrapperTests.cpp b/libs/hwui/tests/unit/HintSessionWrapperTests.cpp
index 10a740a..c16602c 100644
--- a/libs/hwui/tests/unit/HintSessionWrapperTests.cpp
+++ b/libs/hwui/tests/unit/HintSessionWrapperTests.cpp
@@ -58,6 +58,7 @@
         MOCK_METHOD(void, fakeUpdateTargetWorkDuration, (APerformanceHintSession*, int64_t));
         MOCK_METHOD(void, fakeReportActualWorkDuration, (APerformanceHintSession*, int64_t));
         MOCK_METHOD(void, fakeSendHint, (APerformanceHintSession*, int32_t));
+        MOCK_METHOD(int, fakeSetThreads, (APerformanceHintSession*, const std::vector<pid_t>&));
         // Needs to be on the binding so it can be accessed from static methods
         std::promise<int> allowCreationToFinish;
     };
@@ -102,11 +103,20 @@
     static void stubSendHint(APerformanceHintSession* session, int32_t hintId) {
         sMockBinding->fakeSendHint(session, hintId);
     };
+    static int stubSetThreads(APerformanceHintSession* session, const pid_t* ids, size_t size) {
+        std::vector<pid_t> tids(ids, ids + size);
+        return sMockBinding->fakeSetThreads(session, tids);
+    }
     void waitForWrapperReady() {
         if (mWrapper->mHintSessionFuture.has_value()) {
             mWrapper->mHintSessionFuture->wait();
         }
     }
+    void waitForSetThreadsReady() {
+        if (mWrapper->mSetThreadsFuture.has_value()) {
+            mWrapper->mSetThreadsFuture->wait();
+        }
+    }
     void scheduleDelayedDestroyManaged() {
         TestUtils::runOnRenderThread([&](renderthread::RenderThread& rt) {
             // Guaranteed to be scheduled first, allows destruction to start
@@ -130,6 +140,7 @@
     mWrapper->mBinding = sMockBinding;
     EXPECT_CALL(*sMockBinding, fakeGetManager).WillOnce(Return(managerPtr));
     ON_CALL(*sMockBinding, fakeCreateSession).WillByDefault(Return(sessionPtr));
+    ON_CALL(*sMockBinding, fakeSetThreads).WillByDefault(Return(0));
 }
 
 void HintSessionWrapperTests::MockHintSessionBinding::init() {
@@ -141,6 +152,7 @@
     sMockBinding->updateTargetWorkDuration = &stubUpdateTargetWorkDuration;
     sMockBinding->reportActualWorkDuration = &stubReportActualWorkDuration;
     sMockBinding->sendHint = &stubSendHint;
+    sMockBinding->setThreads = &stubSetThreads;
 }
 
 void HintSessionWrapperTests::TearDown() {
@@ -339,4 +351,44 @@
     EXPECT_EQ(mWrapper->alive(), false);
 }
 
+TEST_F(HintSessionWrapperTests, setThreadsUpdatesSessionThreads) {
+    EXPECT_CALL(*sMockBinding, fakeCreateSession(managerPtr, _, Gt(1), _)).Times(1);
+    EXPECT_CALL(*sMockBinding, fakeSetThreads(sessionPtr, testing::IsSupersetOf({11, 22})))
+            .Times(1);
+    mWrapper->init();
+    waitForWrapperReady();
+
+    // This changes the overall set of threads in the session, so the session wrapper should call
+    // setThreads.
+    mWrapper->setActiveFunctorThreads({11, 22});
+    waitForSetThreadsReady();
+
+    // The set of threads doesn't change, so the session wrapper should not call setThreads this
+    // time. The order of the threads shouldn't matter.
+    mWrapper->setActiveFunctorThreads({22, 11});
+    waitForSetThreadsReady();
+}
+
+TEST_F(HintSessionWrapperTests, setThreadsDoesntCrashAfterDestroy) {
+    EXPECT_CALL(*sMockBinding, fakeCloseSession(sessionPtr)).Times(1);
+
+    mWrapper->init();
+    waitForWrapperReady();
+    // Init a second time just to grab the wrapper from the promise
+    mWrapper->init();
+    EXPECT_EQ(mWrapper->alive(), true);
+
+    // Then, kill the session
+    mWrapper->destroy();
+
+    // Verify it died
+    Mock::VerifyAndClearExpectations(sMockBinding.get());
+    EXPECT_EQ(mWrapper->alive(), false);
+
+    // setActiveFunctorThreads shouldn't do anything, and shouldn't crash.
+    EXPECT_CALL(*sMockBinding, fakeSetThreads(_, _)).Times(0);
+    mWrapper->setActiveFunctorThreads({11, 22});
+    waitForSetThreadsReady();
+}
+
 }  // namespace android::uirenderer::renderthread
\ No newline at end of file
diff --git a/libs/hwui/utils/Color.cpp b/libs/hwui/utils/Color.cpp
index 913af8a..f6c5792 100644
--- a/libs/hwui/utils/Color.cpp
+++ b/libs/hwui/utils/Color.cpp
@@ -16,22 +16,18 @@
 
 #include "Color.h"
 
+#include <Properties.h>
+#include <android/hardware_buffer.h>
+#include <android/native_window.h>
 #include <ui/ColorSpace.h>
 #include <utils/Log.h>
 
-#ifdef __ANDROID__ // Layoutlib does not support hardware buffers or native windows
-#include <android/hardware_buffer.h>
-#include <android/native_window.h>
-#endif
-
 #include <algorithm>
 #include <cmath>
-#include <Properties.h>
 
 namespace android {
 namespace uirenderer {
 
-#ifdef __ANDROID__ // Layoutlib does not support hardware buffers or native windows
 static inline SkImageInfo createImageInfo(int32_t width, int32_t height, int32_t format,
                                           sk_sp<SkColorSpace> colorSpace) {
     SkColorType colorType = kUnknown_SkColorType;
@@ -121,7 +117,6 @@
             return kUnknown_SkColorType;
     }
 }
-#endif
 
 namespace {
 static constexpr skcms_TransferFunction k2Dot6 = {2.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
diff --git a/libs/hwui/utils/Color.h b/libs/hwui/utils/Color.h
index 0fd61c7..08f1c93 100644
--- a/libs/hwui/utils/Color.h
+++ b/libs/hwui/utils/Color.h
@@ -92,7 +92,6 @@
     return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f);
 }
 
-#ifdef __ANDROID__ // Layoutlib does not support hardware buffers or native windows
 SkImageInfo ANativeWindowToImageInfo(const ANativeWindow_Buffer& buffer,
                                                  sk_sp<SkColorSpace> colorSpace);
 
@@ -101,7 +100,6 @@
 
 uint32_t ColorTypeToBufferFormat(SkColorType colorType);
 SkColorType BufferFormatToColorType(uint32_t bufferFormat);
-#endif
 
 ANDROID_API sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace);
 
diff --git a/libs/input/SpriteController.cpp b/libs/input/SpriteController.cpp
index 6a32c5a..a63453d 100644
--- a/libs/input/SpriteController.cpp
+++ b/libs/input/SpriteController.cpp
@@ -148,8 +148,9 @@
         if (update.state.wantSurfaceVisible()) {
             int32_t desiredWidth = update.state.icon.width();
             int32_t desiredHeight = update.state.icon.height();
-            if (update.state.surfaceWidth < desiredWidth
-                    || update.state.surfaceHeight < desiredHeight) {
+            // TODO(b/331260947): investigate using a larger surface width with smaller sprites.
+            if (update.state.surfaceWidth != desiredWidth ||
+                update.state.surfaceHeight != desiredHeight) {
                 needApplyTransaction = true;
 
                 update.state.surfaceControl->updateDefaultBufferSize(desiredWidth, desiredHeight);
diff --git a/media/OWNERS b/media/OWNERS
index 2e9276d..1e5a458 100644
--- a/media/OWNERS
+++ b/media/OWNERS
@@ -4,6 +4,7 @@
 [email protected]
 [email protected]
 [email protected]
[email protected]
 [email protected]
 [email protected]
 [email protected]
diff --git a/media/java/android/media/AudioDescriptor.java b/media/java/android/media/AudioDescriptor.java
index 85a653c..b5cae2c 100644
--- a/media/java/android/media/AudioDescriptor.java
+++ b/media/java/android/media/AudioDescriptor.java
@@ -99,7 +99,7 @@
      * When encapsulation is required, only playback with {@link android.media.AudioTrack} API is
      * supported. But playback with {@link android.media.MediaPlayer} is not.
      * When an encapsulation type is required, the {@link AudioFormat} encoding selected when
-     * creating the {@link AudioTrack} must match the encapsulation type, e.g
+     * creating the {@link AudioTrack} must match the encapsulation type, e.g.
      * AudioFormat#ENCODING_IEC61937 for AudioProfile.AUDIO_ENCAPSULATION_TYPE_IEC61937.
      *
      * @return an integer representing the encapsulation type
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 1fe3c2e..63b4538 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -3465,7 +3465,7 @@
 
     /* modes for setMode/getMode/setRoute/getRoute */
     /**
-     * Audio harware modes.
+     * Audio hardware modes.
      */
     /**
      * Invalid audio mode.
diff --git a/media/java/android/media/FadeManagerConfiguration.java b/media/java/android/media/FadeManagerConfiguration.java
index eaafa59..6d84e70 100644
--- a/media/java/android/media/FadeManagerConfiguration.java
+++ b/media/java/android/media/FadeManagerConfiguration.java
@@ -836,7 +836,7 @@
          */
         public Builder(@NonNull FadeManagerConfiguration fmc) {
             mFadeState = fmc.mFadeState;
-            mUsageToFadeWrapperMap = fmc.mUsageToFadeWrapperMap.clone();
+            copyUsageToFadeWrapperMapInternal(fmc.mUsageToFadeWrapperMap);
             mAttrToFadeWrapperMap = new ArrayMap<AudioAttributes, FadeVolumeShaperConfigsWrapper>(
                     fmc.mAttrToFadeWrapperMap);
             mFadeableUsages = fmc.mFadeableUsages.clone();
@@ -1459,6 +1459,14 @@
             }
         }
 
+        private  void copyUsageToFadeWrapperMapInternal(
+                SparseArray<FadeVolumeShaperConfigsWrapper> usageToFadeWrapperMap) {
+            for (int index = 0; index < usageToFadeWrapperMap.size(); index++) {
+                mUsageToFadeWrapperMap.put(usageToFadeWrapperMap.keyAt(index),
+                        new FadeVolumeShaperConfigsWrapper(usageToFadeWrapperMap.valueAt(index)));
+            }
+        }
+
         private void validateFadeState(int state) {
             switch(state) {
                 case FADE_STATE_DISABLED:
@@ -1551,6 +1559,12 @@
 
         FadeVolumeShaperConfigsWrapper() {}
 
+        FadeVolumeShaperConfigsWrapper(@NonNull FadeVolumeShaperConfigsWrapper wrapper) {
+            Objects.requireNonNull(wrapper, "Fade volume shaper configs wrapper cannot be null");
+            this.mFadeOutVolShaperConfig = wrapper.mFadeOutVolShaperConfig;
+            this.mFadeInVolShaperConfig = wrapper.mFadeInVolShaperConfig;
+        }
+
         public void setFadeOutVolShaperConfig(@Nullable VolumeShaper.Configuration fadeOutConfig) {
             mFadeOutVolShaperConfig = fadeOutConfig;
         }
diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl
index 7727078..63cb945 100644
--- a/media/java/android/media/IMediaRouterService.aidl
+++ b/media/java/android/media/IMediaRouterService.aidl
@@ -50,7 +50,7 @@
     // MediaRouterService.java for readability.
 
     // Methods for MediaRouter2
-    List<MediaRoute2Info> getSystemRoutes();
+    List<MediaRoute2Info> getSystemRoutes(String callerPackageName, boolean isProxyRouter);
     RoutingSessionInfo getSystemSessionInfo();
 
     void registerRouter2(IMediaRouter2 router, String packageName);
@@ -75,7 +75,8 @@
 
     // Methods for MediaRouter2Manager
     List<RoutingSessionInfo> getRemoteSessions(IMediaRouter2Manager manager);
-    RoutingSessionInfo getSystemSessionInfoForPackage(String packageName);
+    RoutingSessionInfo getSystemSessionInfoForPackage(String callerPackageName,
+        String targetPackageName);
     void registerManager(IMediaRouter2Manager manager, String packageName);
     void registerProxyRouter(IMediaRouter2Manager manager, String callingPackageName, String targetPackageName, in UserHandle targetUser);
     void unregisterManager(IMediaRouter2Manager manager);
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 1905fa8..ce7474c 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -65,6 +65,7 @@
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.function.Supplier;
 
 /**
  MediaCodec class can be used to access low-level media codecs, i.e. encoder/decoder components.
@@ -2014,6 +2015,23 @@
         }
     }
 
+    // HACKY(b/325389296): aconfig flag accessors may not work in all contexts where MediaCodec API
+    // is used, so allow accessors to fail. In those contexts use a default value, normally false.
+
+    /* package private */
+    static boolean GetFlag(Supplier<Boolean> flagValueSupplier) {
+        return GetFlag(flagValueSupplier, false /* defaultValue */);
+    }
+
+    /* package private */
+    static boolean GetFlag(Supplier<Boolean> flagValueSupplier, boolean defaultValue) {
+        try {
+            return flagValueSupplier.get();
+        } catch (java.lang.RuntimeException e) {
+            return defaultValue;
+        }
+    }
+
     private boolean mHasSurface = false;
 
     /**
@@ -2346,12 +2364,16 @@
         }
 
         // at the moment no codecs support detachable surface
-        if (android.media.codec.Flags.nullOutputSurface()) {
+        boolean canDetach = GetFlag(() -> android.media.codec.Flags.nullOutputSurfaceSupport());
+        if (GetFlag(() -> android.media.codec.Flags.nullOutputSurface())) {
             // Detached surface flag is only meaningful if surface is null. Otherwise, it is
             // ignored.
-            if (surface == null && (flags & CONFIGURE_FLAG_DETACHED_SURFACE) != 0) {
+            if (surface == null && (flags & CONFIGURE_FLAG_DETACHED_SURFACE) != 0 && !canDetach) {
                 throw new IllegalArgumentException("Codec does not support detached surface");
             }
+        } else {
+            // don't allow detaching if API is disabled
+            canDetach = false;
         }
 
         String[] keys = null;
@@ -2393,6 +2415,14 @@
         }
 
         native_configure(keys, values, surface, crypto, descramblerBinder, flags);
+
+        if (canDetach) {
+            // If we were able to configure native codec with a detached surface
+            // we now know that we have a surface.
+            if (surface == null && (flags & CONFIGURE_FLAG_DETACHED_SURFACE) != 0) {
+                mHasSurface = true;
+            }
+        }
     }
 
     /**
@@ -2437,12 +2467,19 @@
         if (!mHasSurface) {
             throw new IllegalStateException("codec was not configured for an output surface");
         }
+
         // note: we still have a surface in detached mode, so keep mHasSurface
         // we also technically allow calling detachOutputSurface multiple times in a row
-        throw new IllegalStateException("codec does not support detaching output surface");
-        // native_detachSurface();
+
+        if (GetFlag(() -> android.media.codec.Flags.nullOutputSurfaceSupport())) {
+            native_detachOutputSurface();
+        } else {
+            throw new IllegalStateException("codec does not support detaching output surface");
+        }
     }
 
+    private native void native_detachOutputSurface();
+
     /**
      * Create a persistent input surface that can be used with codecs that normally have an input
      * surface, such as video encoders. A persistent input can be reused by subsequent
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index abad460..8ff4305 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -23,6 +23,7 @@
 import static android.media.codec.Flags.FLAG_IN_PROCESS_SW_AUDIO_CODEC;
 import static android.media.codec.Flags.FLAG_NULL_OUTPUT_SURFACE;
 import static android.media.codec.Flags.FLAG_REGION_OF_INTEREST;
+import static android.media.MediaCodec.GetFlag;
 
 import android.annotation.FlaggedApi;
 import android.annotation.IntDef;
@@ -827,10 +828,10 @@
                 features.add(new Feature(FEATURE_MultipleFrames,   (1 << 5), false));
                 features.add(new Feature(FEATURE_DynamicTimestamp, (1 << 6), false));
                 features.add(new Feature(FEATURE_LowLatency,       (1 << 7), true));
-                if (android.media.codec.Flags.dynamicColorAspects()) {
+                if (GetFlag(() -> android.media.codec.Flags.dynamicColorAspects())) {
                     features.add(new Feature(FEATURE_DynamicColorAspects, (1 << 8), true));
                 }
-                if (android.media.codec.Flags.nullOutputSurface()) {
+                if (GetFlag(() -> android.media.codec.Flags.nullOutputSurface())) {
                     features.add(new Feature(FEATURE_DetachedSurface,     (1 << 9), true));
                 }
 
@@ -851,10 +852,10 @@
                 features.add(new Feature(FEATURE_QpBounds, (1 << 3), false));
                 features.add(new Feature(FEATURE_EncodingStatistics, (1 << 4), false));
                 features.add(new Feature(FEATURE_HdrEditing, (1 << 5), false));
-                if (android.media.codec.Flags.hlgEditing()) {
+                if (GetFlag(() -> android.media.codec.Flags.hlgEditing())) {
                     features.add(new Feature(FEATURE_HlgEditing, (1 << 6), true));
                 }
-                if (android.media.codec.Flags.regionOfInterest()) {
+                if (GetFlag(() -> android.media.codec.Flags.regionOfInterest())) {
                     features.add(new Feature(FEATURE_Roi, (1 << 7), true));
                 }
 
diff --git a/media/java/android/media/MediaDescription.java b/media/java/android/media/MediaDescription.java
index dece6bd..ec95279 100644
--- a/media/java/android/media/MediaDescription.java
+++ b/media/java/android/media/MediaDescription.java
@@ -397,8 +397,14 @@
          * @return a new media description.
          */
         public MediaDescription build() {
-            return new MediaDescription(mMediaId, mTitle, mSubtitle, mDescription, mIcon, mIconUri,
-                    mExtras, mMediaUri);
+            if (com.android.media.performance.flags.Flags.mediaDescriptionAshmemBitmap()) {
+                Bitmap icon = mIcon != null ? mIcon.asShared() : null;
+                return new MediaDescription(mMediaId, mTitle, mSubtitle, mDescription, icon,
+                        mIconUri, mExtras, mMediaUri);
+            } else {
+                return new MediaDescription(mMediaId, mTitle, mSubtitle, mDescription, mIcon,
+                        mIconUri, mExtras, mMediaUri);
+            }
         }
     }
 }
diff --git a/media/java/android/media/MediaRoute2ProviderService.java b/media/java/android/media/MediaRoute2ProviderService.java
index 1e3c154..cce3d4f 100644
--- a/media/java/android/media/MediaRoute2ProviderService.java
+++ b/media/java/android/media/MediaRoute2ProviderService.java
@@ -502,6 +502,10 @@
             return;
         }
 
+        if (mProviderInfo == null) {
+            return;
+        }
+
         try {
             mRemoteCallback.notifyProviderUpdated(mProviderInfo);
         } catch (RemoteException ex) {
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index e0258ba..5aa006b 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -613,7 +613,7 @@
         mImpl = new LocalMediaRouter2Impl(mContext.getPackageName());
         mHandler = new Handler(Looper.getMainLooper());
 
-        loadSystemRoutes();
+        loadSystemRoutes(/* isProxyRouter */ false);
 
         RoutingSessionInfo currentSystemSessionInfo = mImpl.getSystemSessionInfo();
         if (currentSystemSessionInfo == null) {
@@ -631,21 +631,22 @@
                 IMediaRouterService.Stub.asInterface(
                         ServiceManager.getService(Context.MEDIA_ROUTER_SERVICE));
 
-        loadSystemRoutes();
+        loadSystemRoutes(/* isProxyRouter */ true);
 
         mSystemController =
                 new SystemRoutingController(
                         ProxyMediaRouter2Impl.getSystemSessionInfoImpl(
-                                mMediaRouterService, clientPackageName));
+                                mMediaRouterService, mContext.getPackageName(), clientPackageName));
 
         mImpl = new ProxyMediaRouter2Impl(context, clientPackageName, user);
     }
 
     @GuardedBy("mLock")
-    private void loadSystemRoutes() {
+    private void loadSystemRoutes(boolean isProxyRouter) {
         List<MediaRoute2Info> currentSystemRoutes = null;
         try {
-            currentSystemRoutes = mMediaRouterService.getSystemRoutes();
+            currentSystemRoutes = mMediaRouterService.getSystemRoutes(mContext.getPackageName(),
+                    isProxyRouter);
         } catch (RemoteException ex) {
             ex.rethrowFromSystemServer();
         }
@@ -1308,18 +1309,24 @@
             return;
         }
 
-        RoutingController newController;
-        if (sessionInfo.isSystemSession()) {
-            newController = getSystemController();
-            newController.setRoutingSessionInfo(sessionInfo);
+        RoutingController newController = addRoutingController(sessionInfo);
+        notifyTransfer(oldController, newController);
+    }
+
+    @NonNull
+    private RoutingController addRoutingController(@NonNull RoutingSessionInfo session) {
+        RoutingController controller;
+        if (session.isSystemSession()) {
+            // mSystemController is never released, so we only need to update its status.
+            mSystemController.setRoutingSessionInfo(session);
+            controller = mSystemController;
         } else {
-            newController = new RoutingController(sessionInfo);
+            controller = new RoutingController(session);
             synchronized (mLock) {
-                mNonSystemRoutingControllers.put(newController.getId(), newController);
+                mNonSystemRoutingControllers.put(controller.getId(), controller);
             }
         }
-
-        notifyTransfer(oldController, newController);
+        return controller;
     }
 
     void updateControllerOnHandler(RoutingSessionInfo sessionInfo) {
@@ -1328,40 +1335,12 @@
             return;
         }
 
-        if (sessionInfo.isSystemSession()) {
-            // The session info is sent from SystemMediaRoute2Provider.
-            RoutingController systemController = getSystemController();
-            systemController.setRoutingSessionInfo(sessionInfo);
-            notifyControllerUpdated(systemController);
-            return;
+        RoutingController controller =
+                getMatchingController(sessionInfo, /* logPrefix */ "updateControllerOnHandler");
+        if (controller != null) {
+            controller.setRoutingSessionInfo(sessionInfo);
+            notifyControllerUpdated(controller);
         }
-
-        RoutingController matchingController;
-        synchronized (mLock) {
-            matchingController = mNonSystemRoutingControllers.get(sessionInfo.getId());
-        }
-
-        if (matchingController == null) {
-            Log.w(
-                    TAG,
-                    "updateControllerOnHandler: Matching controller not found. uniqueSessionId="
-                            + sessionInfo.getId());
-            return;
-        }
-
-        RoutingSessionInfo oldInfo = matchingController.getRoutingSessionInfo();
-        if (!TextUtils.equals(oldInfo.getProviderId(), sessionInfo.getProviderId())) {
-            Log.w(
-                    TAG,
-                    "updateControllerOnHandler: Provider IDs are not matched. old="
-                            + oldInfo.getProviderId()
-                            + ", new="
-                            + sessionInfo.getProviderId());
-            return;
-        }
-
-        matchingController.setRoutingSessionInfo(sessionInfo);
-        notifyControllerUpdated(matchingController);
     }
 
     void releaseControllerOnHandler(RoutingSessionInfo sessionInfo) {
@@ -1370,34 +1349,47 @@
             return;
         }
 
-        RoutingController matchingController;
-        synchronized (mLock) {
-            matchingController = mNonSystemRoutingControllers.get(sessionInfo.getId());
-        }
+        RoutingController matchingController =
+                getMatchingController(sessionInfo, /* logPrefix */ "releaseControllerOnHandler");
 
-        if (matchingController == null) {
-            if (DEBUG) {
-                Log.d(
-                        TAG,
-                        "releaseControllerOnHandler: Matching controller not found. "
-                                + "uniqueSessionId="
-                                + sessionInfo.getId());
+        if (matchingController != null) {
+            matchingController.releaseInternal(/* shouldReleaseSession= */ false);
+        }
+    }
+
+    @Nullable
+    private RoutingController getMatchingController(
+            RoutingSessionInfo sessionInfo, String logPrefix) {
+        if (sessionInfo.isSystemSession()) {
+            return getSystemController();
+        } else {
+            RoutingController controller;
+            synchronized (mLock) {
+                controller = mNonSystemRoutingControllers.get(sessionInfo.getId());
             }
-            return;
-        }
 
-        RoutingSessionInfo oldInfo = matchingController.getRoutingSessionInfo();
-        if (!TextUtils.equals(oldInfo.getProviderId(), sessionInfo.getProviderId())) {
-            Log.w(
-                    TAG,
-                    "releaseControllerOnHandler: Provider IDs are not matched. old="
-                            + oldInfo.getProviderId()
-                            + ", new="
-                            + sessionInfo.getProviderId());
-            return;
-        }
+            if (controller == null) {
+                Log.w(
+                        TAG,
+                        logPrefix
+                                + ": Matching controller not found. uniqueSessionId="
+                                + sessionInfo.getId());
+                return null;
+            }
 
-        matchingController.releaseInternal(/* shouldReleaseSession= */ false);
+            RoutingSessionInfo oldInfo = controller.getRoutingSessionInfo();
+            if (!TextUtils.equals(oldInfo.getProviderId(), sessionInfo.getProviderId())) {
+                Log.w(
+                        TAG,
+                        logPrefix
+                                + ": Provider IDs are not matched. old="
+                                + oldInfo.getProviderId()
+                                + ", new="
+                                + sessionInfo.getProviderId());
+                return null;
+            }
+            return controller;
+        }
     }
 
     void onRequestCreateControllerByManagerOnHandler(
@@ -2644,7 +2636,8 @@
 
         @Override
         public RoutingSessionInfo getSystemSessionInfo() {
-            return getSystemSessionInfoImpl(mMediaRouterService, mClientPackageName);
+            return getSystemSessionInfoImpl(
+                    mMediaRouterService, mContext.getPackageName(), mClientPackageName);
         }
 
         /**
@@ -3049,9 +3042,11 @@
          * <p>Extracted into a static method to allow calling this from the constructor.
          */
         /* package */ static RoutingSessionInfo getSystemSessionInfoImpl(
-                @NonNull IMediaRouterService service, @NonNull String clientPackageName) {
+                @NonNull IMediaRouterService service,
+                @NonNull String callerPackageName,
+                @NonNull String clientPackageName) {
             try {
-                return service.getSystemSessionInfoForPackage(clientPackageName);
+                return service.getSystemSessionInfoForPackage(callerPackageName, clientPackageName);
             } catch (RemoteException ex) {
                 throw ex.rethrowFromSystemServer();
             }
@@ -3125,20 +3120,8 @@
 
         private void onTransferred(
                 @NonNull RoutingSessionInfo oldSession, @NonNull RoutingSessionInfo newSession) {
-            if (!oldSession.isSystemSession()
-                    && !TextUtils.equals(
-                            getClientPackageName(), oldSession.getClientPackageName())) {
-                return;
-            }
-
-            if (!newSession.isSystemSession()
-                    && !TextUtils.equals(
-                            getClientPackageName(), newSession.getClientPackageName())) {
-                return;
-            }
-
-            // For successful in-session transfer, onControllerUpdated() handles it.
-            if (TextUtils.equals(oldSession.getId(), newSession.getId())) {
+            if (!isSessionRelatedToTargetPackageName(oldSession)
+                    || !isSessionRelatedToTargetPackageName(newSession)) {
                 return;
             }
 
@@ -3165,16 +3148,14 @@
 
         private void onTransferFailed(
                 @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) {
-            if (!session.isSystemSession()
-                    && !TextUtils.equals(getClientPackageName(), session.getClientPackageName())) {
+            if (!isSessionRelatedToTargetPackageName(session)) {
                 return;
             }
             notifyTransferFailure(route);
         }
 
         private void onSessionUpdated(@NonNull RoutingSessionInfo session) {
-            if (!session.isSystemSession()
-                    && !TextUtils.equals(getClientPackageName(), session.getClientPackageName())) {
+            if (!isSessionRelatedToTargetPackageName(session)) {
                 return;
             }
 
@@ -3189,6 +3170,15 @@
             notifyControllerUpdated(controller);
         }
 
+        /**
+         * Returns {@code true} if the session is a system session or if its client package name
+         * matches the proxy router's target package name.
+         */
+        private boolean isSessionRelatedToTargetPackageName(@NonNull RoutingSessionInfo session) {
+            return session.isSystemSession()
+                    || TextUtils.equals(getClientPackageName(), session.getClientPackageName());
+        }
+
         private void onSessionCreatedOnHandler(
                 int requestId, @NonNull RoutingSessionInfo sessionInfo) {
             MediaRouter2Manager.TransferRequest matchingRequest = null;
@@ -3233,19 +3223,19 @@
             }
         }
 
-        private void onSessionUpdatedOnHandler(@NonNull RoutingSessionInfo sessionInfo) {
+        private void onSessionUpdatedOnHandler(@NonNull RoutingSessionInfo updatedSession) {
             for (MediaRouter2Manager.TransferRequest request : mTransferRequests) {
                 String sessionId = request.mOldSessionInfo.getId();
-                if (!TextUtils.equals(sessionId, sessionInfo.getId())) {
+                if (!TextUtils.equals(sessionId, updatedSession.getId())) {
                     continue;
                 }
-                if (sessionInfo.getSelectedRoutes().contains(request.mTargetRoute.getId())) {
+
+                if (updatedSession.getSelectedRoutes().contains(request.mTargetRoute.getId())) {
                     mTransferRequests.remove(request);
-                    this.onTransferred(request.mOldSessionInfo, sessionInfo);
                     break;
                 }
             }
-            this.onSessionUpdated(sessionInfo);
+            this.onSessionUpdated(updatedSession);
         }
 
         private void onSessionReleasedOnHandler(@NonNull RoutingSessionInfo session) {
diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java
index 7756d93..e62d112 100644
--- a/media/java/android/media/MediaRouter2Manager.java
+++ b/media/java/android/media/MediaRouter2Manager.java
@@ -81,6 +81,7 @@
     @GuardedBy("sLock")
     private static MediaRouter2Manager sInstance;
 
+    private final Context mContext;
     private final MediaSessionManager mMediaSessionManager;
     private final Client mClient;
     private final IMediaRouterService mMediaRouterService;
@@ -120,6 +121,7 @@
     }
 
     private MediaRouter2Manager(Context context) {
+        mContext = context.getApplicationContext();
         mMediaRouterService = IMediaRouterService.Stub.asInterface(
                 ServiceManager.getService(Context.MEDIA_ROUTER_SERVICE));
         mMediaSessionManager = (MediaSessionManager) context
@@ -374,16 +376,17 @@
     }
 
     /**
-     * Gets the system routing session for the given {@code packageName}.
-     * Apps can select a route that is not the global route. (e.g. an app can select the device
-     * route while BT route is available.)
+     * Gets the system routing session for the given {@code targetPackageName}. Apps can select a
+     * route that is not the global route. (e.g. an app can select the device route while BT route
+     * is available.)
      *
-     * @param packageName the package name of the application.
+     * @param targetPackageName the package name of the application.
      */
     @Nullable
-    public RoutingSessionInfo getSystemRoutingSession(@Nullable String packageName) {
+    public RoutingSessionInfo getSystemRoutingSession(@Nullable String targetPackageName) {
         try {
-            return mMediaRouterService.getSystemSessionInfoForPackage(packageName);
+            return mMediaRouterService.getSystemSessionInfoForPackage(
+                    mContext.getPackageName(), targetPackageName);
         } catch (RemoteException ex) {
             throw ex.rethrowFromSystemServer();
         }
diff --git a/media/java/android/media/flags/media_better_together.aconfig b/media/java/android/media/flags/media_better_together.aconfig
index 40929f7..8d6982e 100644
--- a/media/java/android/media/flags/media_better_together.aconfig
+++ b/media/java/android/media/flags/media_better_together.aconfig
@@ -24,13 +24,6 @@
 }
 
 flag {
-    name: "disable_screen_off_broadcast_receiver"
-    namespace: "media_solutions"
-    description: "Disables the broadcast receiver that prevents scanning when the screen is off."
-    bug: "304234628"
-}
-
-flag {
     name: "fallback_to_default_handling_when_media_session_has_fixed_volume_handling"
     namespace: "media_solutions"
     description: "Fallbacks to the default handling for volume adjustment when media session has fixed volume handling and its app is in the foreground and setting a media controller."
@@ -107,6 +100,16 @@
 }
 
 flag {
+    name: "enable_mr2_service_non_main_bg_thread"
+    namespace: "media_solutions"
+    description: "Enables the use of a background thread in the media routing framework, instead of using the main thread."
+    bug: "310145678"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
+
+flag {
     name: "enable_screen_off_scanning"
     is_exported: true
     namespace: "media_solutions"
@@ -120,3 +123,13 @@
     description: "Enables apps owning a MediaBrowserService to disconnect all connected browsers."
     bug: "185136506"
 }
+
+flag {
+    name: "enable_prevention_of_manager_scans_when_no_apps_scan"
+    namespace: "media_solutions"
+    description: "Prevents waking up route providers when no apps are scanning, even if SysUI or Settings are scanning."
+    bug: "319604673"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/media/java/android/media/flags/performance.aconfig b/media/java/android/media/flags/performance.aconfig
new file mode 100644
index 0000000..9e9197e
--- /dev/null
+++ b/media/java/android/media/flags/performance.aconfig
@@ -0,0 +1,11 @@
+package: "com.android.media.performance.flags"
+
+flag {
+    name: "media_description_ashmem_bitmap"
+    namespace: "systemui"
+    description: "Use ashmem to pass bitmaps in MediaDescription to avoid excessive Bitmap copies."
+    bug: "288241280"
+    metadata {
+      purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 0fc80dd..82561f9 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -389,6 +389,14 @@
     return err;
 }
 
+status_t JMediaCodec::detachOutputSurface() {
+    status_t err = mCodec->detachOutputSurface();
+    if (err == OK) {
+        mSurfaceTextureClient.clear();
+    }
+    return err;
+}
+
 status_t JMediaCodec::createInputSurface(
         sp<IGraphicBufferProducer>* bufferProducer) {
     return mCodec->createInputSurface(bufferProducer);
@@ -1798,6 +1806,20 @@
     throwExceptionAsNecessary(env, err, codec);
 }
 
+static void android_media_MediaCodec_native_detachOutputSurface(
+        JNIEnv *env,
+        jobject thiz) {
+    sp<JMediaCodec> codec = getMediaCodec(env, thiz);
+
+    if (codec == NULL || codec->initCheck() != OK) {
+        throwExceptionAsNecessary(env, INVALID_OPERATION, codec);
+        return;
+    }
+
+    status_t err = codec->detachOutputSurface();
+    throwExceptionAsNecessary(env, err, codec);
+}
+
 sp<PersistentSurface> android_media_MediaCodec_getPersistentInputSurface(
         JNIEnv* env, jobject object) {
     sp<PersistentSurface> persistentSurface;
@@ -4107,6 +4129,10 @@
       "(Landroid/view/Surface;)V",
       (void *)android_media_MediaCodec_native_setSurface },
 
+    { "native_detachOutputSurface",
+      "()V",
+      (void *)android_media_MediaCodec_native_detachOutputSurface },
+
     { "createInputSurface", "()Landroid/view/Surface;",
       (void *)android_media_MediaCodec_createInputSurface },
 
diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h
index abb23f5..c9b6b7f6 100644
--- a/media/jni/android_media_MediaCodec.h
+++ b/media/jni/android_media_MediaCodec.h
@@ -80,6 +80,8 @@
     status_t setSurface(
             const sp<IGraphicBufferProducer> &surface);
 
+    status_t detachOutputSurface();
+
     status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer);
     status_t setInputSurface(const sp<PersistentSurface> &surface);
 
diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/FadeManagerConfigurationUnitTest.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/FadeManagerConfigurationUnitTest.java
index c48a956..74b5afe 100644
--- a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/FadeManagerConfigurationUnitTest.java
+++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/FadeManagerConfigurationUnitTest.java
@@ -196,8 +196,7 @@
         FadeManagerConfiguration fmcObj = new FadeManagerConfiguration
                 .Builder(TEST_FADE_OUT_DURATION_MS, TEST_FADE_IN_DURATION_MS).build();
 
-        FadeManagerConfiguration fmc = new FadeManagerConfiguration
-                .Builder(fmcObj).build();
+        FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder(fmcObj).build();
 
         expect.withMessage("Fade state for copy builder").that(fmc.getFadeState())
                 .isEqualTo(fmcObj.getFadeState());
@@ -249,6 +248,45 @@
     }
 
     @Test
+    public void build_withCopyConstructor_doesnotChangeOriginal() {
+        FadeManagerConfiguration copyConstructedFmc = new FadeManagerConfiguration.Builder(mFmc)
+                .setFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_OUT_DURATION_MS)
+                .setFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_IN_DURATION_MS)
+                .build();
+
+        expect.withMessage("Fade out duration for media usage of default constructor")
+                .that(mFmc.getFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA))
+                .isEqualTo(DEFAULT_FADE_OUT_DURATION_MS);
+        expect.withMessage("Fade out duration for media usage of default constructor")
+                .that(mFmc.getFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA))
+                .isEqualTo(DEFAULT_FADE_IN_DURATION_MS);
+        expect.withMessage("Fade out duration for media usage of copy constructor")
+                .that(copyConstructedFmc.getFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA))
+                .isEqualTo(TEST_FADE_OUT_DURATION_MS);
+        expect.withMessage("Fade out duration for media usage of copy constructor")
+                .that(copyConstructedFmc.getFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA))
+                .isEqualTo(TEST_FADE_IN_DURATION_MS);
+    }
+
+    @Test
+    public void build_withCopyConstructor_equals() {
+        FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+                .setFadeableUsages(List.of(AudioAttributes.USAGE_MEDIA,
+                        AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
+                        AudioAttributes.USAGE_ASSISTANT,
+                        AudioAttributes.USAGE_EMERGENCY))
+                .setFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_OUT_DURATION_MS)
+                .setFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_IN_DURATION_MS)
+                .build();
+
+        FadeManagerConfiguration copyConstructedFmc =
+                new FadeManagerConfiguration.Builder(fmc).build();
+
+        expect.withMessage("Fade manager config constructed using copy constructor").that(fmc)
+                .isEqualTo(copyConstructedFmc);
+    }
+
+    @Test
     public void testGetDefaultFadeOutDuration() {
         expect.withMessage("Default fade out duration")
                 .that(FadeManagerConfiguration.getDefaultFadeOutDurationMillis())
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
index e89becd..fc96896 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
@@ -16,6 +16,9 @@
 
 package com.android.mediaframeworktest.integration;
 
+import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT;
+import static android.content.Context.DEVICE_ID_DEFAULT;
+
 import android.hardware.CameraInfo;
 import android.hardware.ICamera;
 import android.hardware.ICameraClient;
@@ -75,8 +78,8 @@
 
     @SmallTest
     public void testNumberOfCameras() throws Exception {
-
-        int numCameras = mUtils.getCameraService().getNumberOfCameras(CAMERA_TYPE_ALL);
+        int numCameras = mUtils.getCameraService().getNumberOfCameras(CAMERA_TYPE_ALL,
+                DEVICE_ID_DEFAULT, DEVICE_POLICY_DEFAULT);
         assertTrue("At least this many cameras: " + mUtils.getGuessedNumCameras(),
                 numCameras >= mUtils.getGuessedNumCameras());
         Log.v(TAG, "Number of cameras " + numCameras);
@@ -85,9 +88,8 @@
     @SmallTest
     public void testCameraInfo() throws Exception {
         for (int cameraId = 0; cameraId < mUtils.getGuessedNumCameras(); ++cameraId) {
-
             CameraInfo info = mUtils.getCameraService().getCameraInfo(cameraId,
-                    /*overrideToPortrait*/false);
+                    /*overrideToPortrait*/false, DEVICE_ID_DEFAULT, DEVICE_POLICY_DEFAULT);
             assertTrue("Facing was not set for camera " + cameraId, info.info.facing != -1);
             assertTrue("Orientation was not set for camera " + cameraId,
                     info.info.orientation != -1);
@@ -163,7 +165,8 @@
                             ICameraService.USE_CALLING_PID,
                             getContext().getApplicationInfo().targetSdkVersion,
                             /*overrideToPortrait*/false,
-                            /*forceSlowJpegMode*/false);
+                            /*forceSlowJpegMode*/false,
+                            DEVICE_ID_DEFAULT, DEVICE_POLICY_DEFAULT);
             assertNotNull(String.format("Camera %s was null", cameraId), cameraUser);
 
             Log.v(TAG, String.format("Camera %s connected", cameraId));
@@ -184,7 +187,6 @@
         public void onDeviceError(int errorCode, CaptureResultExtras resultExtras)
                 throws RemoteException {
             // TODO Auto-generated method stub
-
         }
 
         /*
@@ -197,7 +199,6 @@
         public void onCaptureStarted(CaptureResultExtras resultExtras, long timestamp)
                 throws RemoteException {
             // TODO Auto-generated method stub
-
         }
 
         /*
@@ -211,7 +212,6 @@
         public void onResultReceived(CameraMetadataNative result, CaptureResultExtras resultExtras,
                 PhysicalCaptureResultInfo physicalResults[]) throws RemoteException {
             // TODO Auto-generated method stub
-
         }
 
         /*
@@ -221,7 +221,6 @@
         @Override
         public void onDeviceIdle() throws RemoteException {
             // TODO Auto-generated method stub
-
         }
 
         /*
@@ -231,7 +230,6 @@
         @Override
         public void onPrepared(int streamId) throws RemoteException {
             // TODO Auto-generated method stub
-
         }
 
         /*
@@ -241,7 +239,6 @@
         @Override
         public void onRequestQueueEmpty() throws RemoteException {
             // TODO Auto-generated method stub
-
         }
 
         /*
@@ -269,7 +266,7 @@
                         clientPackageName, clientAttributionTag,
                         ICameraService.USE_CALLING_UID, 0 /*oomScoreOffset*/,
                         getContext().getApplicationInfo().targetSdkVersion,
-                        /*overrideToPortrait*/false);
+                        /*overrideToPortrait*/false, DEVICE_ID_DEFAULT, DEVICE_POLICY_DEFAULT);
             assertNotNull(String.format("Camera %s was null", cameraId), cameraUser);
 
             Log.v(TAG, String.format("Camera %s connected", cameraId));
@@ -280,18 +277,18 @@
 
     static class DummyCameraServiceListener extends ICameraServiceListener.Stub {
         @Override
-        public void onStatusChanged(int status, String cameraId)
+        public void onStatusChanged(int status, String cameraId, int deviceId)
                 throws RemoteException {
             Log.v(TAG, String.format("Camera %s has status changed to 0x%x", cameraId, status));
         }
-        public void onTorchStatusChanged(int status, String cameraId)
+        public void onTorchStatusChanged(int status, String cameraId, int deviceId)
                 throws RemoteException {
             Log.v(TAG, String.format("Camera %s has torch status changed to 0x%x",
                     cameraId, status));
         }
         @Override
         public void onPhysicalCameraStatusChanged(int status, String cameraId,
-                String physicalCameraId) throws RemoteException {
+                String physicalCameraId, int deviceId) throws RemoteException {
             Log.v(TAG, String.format("Camera %s : %s has status changed to 0x%x",
                     cameraId, physicalCameraId, status));
         }
@@ -300,16 +297,16 @@
             Log.v(TAG, "Camera access permission change");
         }
         @Override
-        public void onCameraOpened(String cameraId, String clientPackageName) {
+        public void onCameraOpened(String cameraId, String clientPackageName, int deviceId) {
             Log.v(TAG, String.format("Camera %s is opened by client package %s",
                     cameraId, clientPackageName));
         }
         @Override
-        public void onCameraClosed(String cameraId) {
+        public void onCameraClosed(String cameraId, int deviceId) {
             Log.v(TAG, String.format("Camera %s is closed", cameraId));
         }
         @Override
-        public void onTorchStrengthLevelChanged(String cameraId, int torchStrength) {
+        public void onTorchStrengthLevelChanged(String cameraId, int torchStrength, int deviceId) {
             Log.v(TAG, String.format("Camera " + cameraId + " torch strength level changed to "
                     + torchStrength ));
         }
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
index eaa5a85..dc8647f 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java
@@ -16,6 +16,8 @@
 
 package com.android.mediaframeworktest.integration;
 
+import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT;
+import static android.content.Context.DEVICE_ID_DEFAULT;
 import static android.hardware.camera2.CameraDevice.TEMPLATE_PREVIEW;
 
 import static org.mockito.Mockito.any;
@@ -246,7 +248,7 @@
         mCameraUser = mUtils.getCameraService().connectDevice(mMockCb, mCameraId,
                 clientPackageName, clientAttributionTag, ICameraService.USE_CALLING_UID,
                 /*oomScoreOffset*/0, getContext().getApplicationInfo().targetSdkVersion,
-                /*overrideToPortrait*/false);
+                /*overrideToPortrait*/false, DEVICE_ID_DEFAULT, DEVICE_POLICY_DEFAULT);
         assertNotNull(String.format("Camera %s was null", mCameraId), mCameraUser);
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
@@ -272,7 +274,6 @@
 
         metadata = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW);
         assertFalse(metadata.isEmpty());
-
     }
 
     @SmallTest
@@ -306,7 +307,6 @@
 
     @SmallTest
     public void testCreateStreamTwo() throws Exception {
-
         // Create first stream
         int streamId = mCameraUser.createStream(mOutputConfiguration);
         assertEquals(0, streamId);
@@ -335,7 +335,6 @@
 
     @SmallTest
     public void testSubmitBadRequest() throws Exception {
-
         CaptureRequest.Builder builder = createDefaultBuilder(/* needStream */false);
         CaptureRequest request1 = builder.build();
         try {
@@ -361,7 +360,6 @@
 
     @SmallTest
     public void testSubmitGoodRequest() throws Exception {
-
         CaptureRequest.Builder builder = createDefaultBuilder(/* needStream */true);
         CaptureRequest request = builder.build();
 
@@ -370,12 +368,10 @@
         SubmitInfo requestInfo2 = submitCameraRequest(request, /* streaming */false);
         assertNotSame("Request IDs should be unique for multiple requests",
                 requestInfo1.getRequestId(), requestInfo2.getRequestId());
-
     }
 
     @SmallTest
     public void testSubmitStreamingRequest() throws Exception {
-
         CaptureRequest.Builder builder = createDefaultBuilder(/* needStream */true);
 
         CaptureRequest request = builder.build();
@@ -419,7 +415,8 @@
     @SmallTest
     public void testCameraCharacteristics() throws RemoteException {
         CameraMetadataNative info = mUtils.getCameraService().getCameraCharacteristics(mCameraId,
-                getContext().getApplicationInfo().targetSdkVersion, /*overrideToPortrait*/false);
+                getContext().getApplicationInfo().targetSdkVersion, /*overrideToPortrait*/false,
+                DEVICE_ID_DEFAULT, DEVICE_POLICY_DEFAULT);
 
         assertFalse(info.isEmpty());
         assertNotNull(info.get(CameraCharacteristics.SCALER_AVAILABLE_FORMATS));
@@ -512,7 +509,6 @@
 
         // And wait for more idle
         verify(mMockCb, timeout(WAIT_FOR_IDLE_TIMEOUT_MS).times(2)).onDeviceIdle();
-
     }
 
     @SmallTest
diff --git a/native/android/performance_hint.cpp b/native/android/performance_hint.cpp
index 8227bdb..882afca 100644
--- a/native/android/performance_hint.cpp
+++ b/native/android/performance_hint.cpp
@@ -41,16 +41,15 @@
 
 using namespace std::chrono_literals;
 
-using HalSessionHint = aidl::android::hardware::power::SessionHint;
-using HalSessionMode = aidl::android::hardware::power::SessionMode;
-using HalWorkDuration = aidl::android::hardware::power::WorkDuration;
+// Namespace for AIDL types coming from the PowerHAL
+namespace hal = aidl::android::hardware::power;
 
 using android::base::StringPrintf;
 
 struct APerformanceHintSession;
 
 constexpr int64_t SEND_HINT_TIMEOUT = std::chrono::nanoseconds(100ms).count();
-struct AWorkDuration : public HalWorkDuration {};
+struct AWorkDuration : public hal::WorkDuration {};
 
 struct APerformanceHintManager {
 public:
@@ -115,7 +114,7 @@
     // Last hint reported from sendHint indexed by hint value
     std::vector<int64_t> mLastHintSentTimestamp;
     // Cached samples
-    std::vector<HalWorkDuration> mActualWorkDurations;
+    std::vector<hal::WorkDuration> mActualWorkDurations;
     std::string mSessionName;
     static int32_t sIDCounter;
     // The most recent set of thread IDs
@@ -207,8 +206,9 @@
         mTargetDurationNanos(targetDurationNanos),
         mFirstTargetMetTimestamp(0),
         mLastTargetMetTimestamp(0) {
-    const std::vector<HalSessionHint> sessionHintRange{ndk::enum_range<HalSessionHint>().begin(),
-                                                       ndk::enum_range<HalSessionHint>().end()};
+    const std::vector<hal::SessionHint> sessionHintRange{ndk::enum_range<hal::SessionHint>()
+                                                                 .begin(),
+                                                         ndk::enum_range<hal::SessionHint>().end()};
 
     mLastHintSentTimestamp = std::vector<int64_t>(sessionHintRange.size(), 0);
     mSessionName = android::base::StringPrintf("ADPF Session %" PRId32, ++sIDCounter);
@@ -246,10 +246,10 @@
 }
 
 int APerformanceHintSession::reportActualWorkDuration(int64_t actualDurationNanos) {
-    HalWorkDuration workDuration{.durationNanos = actualDurationNanos,
-                                 .workPeriodStartTimestampNanos = 0,
-                                 .cpuDurationNanos = actualDurationNanos,
-                                 .gpuDurationNanos = 0};
+    hal::WorkDuration workDuration{.durationNanos = actualDurationNanos,
+                                   .workPeriodStartTimestampNanos = 0,
+                                   .cpuDurationNanos = actualDurationNanos,
+                                   .gpuDurationNanos = 0};
 
     return reportActualWorkDurationInternal(static_cast<AWorkDuration*>(&workDuration));
 }
@@ -323,7 +323,8 @@
 
 int APerformanceHintSession::setPreferPowerEfficiency(bool enabled) {
     ndk::ScopedAStatus ret =
-            mHintSession->setMode(static_cast<int32_t>(HalSessionMode::POWER_EFFICIENCY), enabled);
+            mHintSession->setMode(static_cast<int32_t>(hal::SessionMode::POWER_EFFICIENCY),
+                                  enabled);
 
     if (!ret.isOk()) {
         ALOGE("%s: HintSession setPreferPowerEfficiency failed: %s", __FUNCTION__,
diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp
index 9b1330f..6ce83cd 100644
--- a/native/android/surface_control.cpp
+++ b/native/android/surface_control.cpp
@@ -367,7 +367,7 @@
 
 void ASurfaceTransaction_setVisibility(ASurfaceTransaction* aSurfaceTransaction,
                                        ASurfaceControl* aSurfaceControl,
-                                       int8_t visibility) {
+                                       ASurfaceTransactionVisibility visibility) {
     CHECK_NOT_NULL(aSurfaceTransaction);
     CHECK_NOT_NULL(aSurfaceControl);
 
@@ -496,7 +496,7 @@
 
 void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* aSurfaceTransaction,
                                                ASurfaceControl* aSurfaceControl,
-                                               int8_t transparency) {
+                                               ASurfaceTransactionTransparency transparency) {
     CHECK_NOT_NULL(aSurfaceTransaction);
     CHECK_NOT_NULL(aSurfaceControl);
 
diff --git a/nfc/Android.bp b/nfc/Android.bp
index 0b3f291..c186804 100644
--- a/nfc/Android.bp
+++ b/nfc/Android.bp
@@ -39,6 +39,7 @@
     libs: [
         "unsupportedappusage", // for android.compat.annotation.UnsupportedAppUsage
         "framework-permission-s",
+        "framework-permission",
     ],
     static_libs: [
         "android.nfc.flags-aconfig-java",
diff --git a/nfc/TEST_MAPPING b/nfc/TEST_MAPPING
index 5b5ea37..49c778d2 100644
--- a/nfc/TEST_MAPPING
+++ b/nfc/TEST_MAPPING
@@ -5,6 +5,9 @@
     },
     {
       "name": "CtsNfcTestCases"
+    },
+    {
+      "name": "CtsNdefTestCases"
     }
   ]
 }
diff --git a/nfc/api/current.txt b/nfc/api/current.txt
index 80b2be2..6d4cc3a 100644
--- a/nfc/api/current.txt
+++ b/nfc/api/current.txt
@@ -194,13 +194,13 @@
 package android.nfc.cardemulation {
 
   public final class CardEmulation {
-    method @Deprecated public boolean categoryAllowsForegroundPreference(String);
+    method public boolean categoryAllowsForegroundPreference(String);
     method @Nullable @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) public java.util.List<java.lang.String> getAidsForPreferredPaymentService();
     method public java.util.List<java.lang.String> getAidsForService(android.content.ComponentName, String);
-    method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) public CharSequence getDescriptionForPreferredPaymentService();
+    method @Nullable @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) public CharSequence getDescriptionForPreferredPaymentService();
     method public static android.nfc.cardemulation.CardEmulation getInstance(android.nfc.NfcAdapter);
-    method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) public String getRouteDestinationForPreferredPaymentService();
-    method @Deprecated public int getSelectionModeForCategory(String);
+    method @Nullable @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) public String getRouteDestinationForPreferredPaymentService();
+    method public int getSelectionModeForCategory(String);
     method public boolean isDefaultServiceForAid(android.content.ComponentName, String);
     method public boolean isDefaultServiceForCategory(android.content.ComponentName, String);
     method public boolean registerAidsForService(android.content.ComponentName, String, java.util.List<java.lang.String>);
diff --git a/nfc/api/system-current.txt b/nfc/api/system-current.txt
index a72e539..310130e 100644
--- a/nfc/api/system-current.txt
+++ b/nfc/api/system-current.txt
@@ -9,6 +9,7 @@
     method @FlaggedApi("android.nfc.enable_nfc_reader_option") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableReaderOption(boolean);
     method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableSecureNfc(boolean);
     method @FlaggedApi("android.nfc.enable_nfc_mainline") public int getAdapterState();
+    method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull public android.nfc.NfcOemExtension getNfcOemExtension();
     method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public java.util.Map<java.lang.String,java.lang.Boolean> getTagIntentAppPreferenceForUser(int);
     method @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) public boolean isControllerAlwaysOn();
     method @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) public boolean isControllerAlwaysOnSupported();
@@ -55,6 +56,16 @@
     method public void onWlcStateChanged(@NonNull android.nfc.WlcListenerDeviceInfo);
   }
 
+  @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") @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 unregisterCallback(@NonNull android.nfc.NfcOemExtension.Callback);
+  }
+
+  public static interface NfcOemExtension.Callback {
+    method public void onTagConnected(boolean, @NonNull android.nfc.Tag);
+  }
+
 }
 
 package android.nfc.cardemulation {
diff --git a/nfc/java/android/nfc/INfcAdapter.aidl b/nfc/java/android/nfc/INfcAdapter.aidl
index c444740..b57d548 100644
--- a/nfc/java/android/nfc/INfcAdapter.aidl
+++ b/nfc/java/android/nfc/INfcAdapter.aidl
@@ -28,6 +28,7 @@
 import android.nfc.INfcTag;
 import android.nfc.INfcCardEmulation;
 import android.nfc.INfcFCardEmulation;
+import android.nfc.INfcOemExtensionCallback;
 import android.nfc.INfcUnlockHandler;
 import android.nfc.ITagRemovedCallback;
 import android.nfc.INfcDta;
@@ -47,8 +48,8 @@
     INfcAdapterExtras getNfcAdapterExtrasInterface(in String pkg);
     INfcDta getNfcDtaInterface(in String pkg);
     int getState();
-    boolean disable(boolean saveState);
-    boolean enable();
+    boolean disable(boolean saveState, in String pkg);
+    boolean enable(in String pkg);
     void pausePolling(int timeoutInMs);
     void resumePolling();
 
@@ -105,4 +106,7 @@
     int sendVendorNciMessage(int mt, int gid, int oid, in byte[] payload);
     void registerVendorExtensionCallback(in INfcVendorNciCallback callbacks);
     void unregisterVendorExtensionCallback(in INfcVendorNciCallback callbacks);
+    void registerOemExtensionCallback(INfcOemExtensionCallback callbacks);
+    void unregisterOemExtensionCallback(INfcOemExtensionCallback callbacks);
+    void clearPreference();
 }
diff --git a/nfc/java/android/nfc/INfcOemExtensionCallback.aidl b/nfc/java/android/nfc/INfcOemExtensionCallback.aidl
new file mode 100644
index 0000000..6c9096d
--- /dev/null
+++ b/nfc/java/android/nfc/INfcOemExtensionCallback.aidl
@@ -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.
+ */
+package android.nfc;
+
+import android.nfc.Tag;
+
+/**
+ * @hide
+ */
+interface INfcOemExtensionCallback {
+   void onTagConnected(boolean connected, in Tag tag);
+}
diff --git a/nfc/java/android/nfc/NfcAdapter.java b/nfc/java/android/nfc/NfcAdapter.java
index 0ebc3f5..b44a71b 100644
--- a/nfc/java/android/nfc/NfcAdapter.java
+++ b/nfc/java/android/nfc/NfcAdapter.java
@@ -581,6 +581,7 @@
     final Context mContext;
     final HashMap<NfcUnlockHandler, INfcUnlockHandler> mNfcUnlockHandlers;
     final Object mLock;
+    final NfcOemExtension mNfcOemExtension;
 
     ITagRemovedCallback mTagRemovedListener; // protected by mLock
 
@@ -891,6 +892,7 @@
         mControllerAlwaysOnListener = new NfcControllerAlwaysOnListener(getService());
         mNfcWlcStateListener = new NfcWlcStateListener(getService());
         mNfcVendorNciCallbackListener = new NfcVendorNciCallbackListener(getService());
+        mNfcOemExtension = new NfcOemExtension(mContext, this);
     }
 
     /**
@@ -1117,7 +1119,7 @@
     @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
     public boolean enable() {
         try {
-            return sService.enable();
+            return sService.enable(mContext.getPackageName());
         } catch (RemoteException e) {
             attemptDeadServiceRecovery(e);
             // Try one more time
@@ -1126,7 +1128,7 @@
                 return false;
             }
             try {
-                return sService.enable();
+                return sService.enable(mContext.getPackageName());
             } catch (RemoteException ee) {
                 Log.e(TAG, "Failed to recover NFC Service.");
             }
@@ -1156,7 +1158,7 @@
     @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
     public boolean disable() {
         try {
-            return sService.disable(true);
+            return sService.disable(true, mContext.getPackageName());
         } catch (RemoteException e) {
             attemptDeadServiceRecovery(e);
             // Try one more time
@@ -1165,7 +1167,7 @@
                 return false;
             }
             try {
-                return sService.disable(true);
+                return sService.disable(true, mContext.getPackageName());
             } catch (RemoteException ee) {
                 Log.e(TAG, "Failed to recover NFC Service.");
             }
@@ -1181,7 +1183,7 @@
     @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
     public boolean disable(boolean persist) {
         try {
-            return sService.disable(persist);
+            return sService.disable(persist, mContext.getPackageName());
         } catch (RemoteException e) {
             attemptDeadServiceRecovery(e);
             // Try one more time
@@ -1190,7 +1192,7 @@
                 return false;
             }
             try {
-                return sService.disable(persist);
+                return sService.disable(persist, mContext.getPackageName());
             } catch (RemoteException ee) {
                 Log.e(TAG, "Failed to recover NFC Service.");
             }
@@ -3163,4 +3165,19 @@
         void onVendorNciNotification(
                 @IntRange(from = 9, to = 15) int gid, int oid, @NonNull byte[] payload);
     }
+
+    /**
+     * Returns an instance of {@link NfcOemExtension} associated with {@link NfcAdapter} instance.
+     * @hide
+     */
+    @SystemApi
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @NonNull public NfcOemExtension getNfcOemExtension() {
+        synchronized (sLock) {
+            if (!sHasNfcFeature) {
+                throw new UnsupportedOperationException();
+            }
+        }
+        return mNfcOemExtension;
+    }
 }
diff --git a/nfc/java/android/nfc/NfcOemExtension.java b/nfc/java/android/nfc/NfcOemExtension.java
new file mode 100644
index 0000000..1eff58c
--- /dev/null
+++ b/nfc/java/android/nfc/NfcOemExtension.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.nfc;
+
+import android.annotation.CallbackExecutor;
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
+import android.content.Context;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Used for OEM extension APIs.
+ * This class holds all the APIs and callbacks defined for OEMs/vendors to extend the NFC stack
+ * for their proprietary features.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+@SystemApi
+public final class NfcOemExtension {
+    private static final String TAG = "NfcOemExtension";
+    private static final int OEM_EXTENSION_RESPONSE_THRESHOLD_MS = 2000;
+    private final NfcAdapter mAdapter;
+    private final NfcOemExtensionCallback mOemNfcExtensionCallback;
+    private final Context mContext;
+    private Executor mExecutor = null;
+    private Callback mCallback = null;
+    private final Object mLock = new Object();
+
+    /**
+     * Interface for Oem extensions for NFC.
+     */
+    public interface Callback {
+        /**
+         * Notify Oem to tag is connected or not
+         * ex - if tag is connected  notify cover and Nfctest app if app is in testing mode
+         *
+         * @param connected status of the tag true if tag is connected otherwise false
+         * @param tag Tag details
+         */
+        void onTagConnected(boolean connected, @NonNull Tag tag);
+    }
+
+
+    /**
+     * Constructor to be used only by {@link NfcAdapter}.
+     * @hide
+     */
+    public NfcOemExtension(@NonNull Context context, @NonNull NfcAdapter adapter) {
+        mContext = context;
+        mAdapter = adapter;
+        mOemNfcExtensionCallback = new NfcOemExtensionCallback();
+    }
+
+    /**
+     * Register an {@link Callback} to listen for UWB oem extension callbacks
+     * <p>The provided callback will be invoked by the given {@link Executor}.
+     *
+     * @param executor an {@link Executor} to execute given callback
+     * @param callback oem implementation of {@link Callback}
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    public void registerCallback(@NonNull @CallbackExecutor Executor executor,
+            @NonNull Callback callback) {
+        synchronized (mLock) {
+            if (mCallback != null) {
+                Log.e(TAG, "Callback already registered. Unregister existing callback before"
+                        + "registering");
+                throw new IllegalArgumentException();
+            }
+            try {
+                NfcAdapter.sService.registerOemExtensionCallback(mOemNfcExtensionCallback);
+                mCallback = callback;
+                mExecutor = executor;
+            } catch (RemoteException e) {
+                mAdapter.attemptDeadServiceRecovery(e);
+            }
+        }
+    }
+
+    /**
+     * Unregister the specified {@link Callback}
+     *
+     * <p>The same {@link Callback} object used when calling
+     * {@link #registerCallback(Executor, Callback)} must be used.
+     *
+     * <p>Callbacks are automatically unregistered when an application process goes away
+     *
+     * @param callback oem implementation of {@link Callback}
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    public void unregisterCallback(@NonNull Callback callback) {
+        synchronized (mLock) {
+            if (mCallback == null || mCallback != callback) {
+                Log.e(TAG, "Callback not registered");
+                throw new IllegalArgumentException();
+            }
+            try {
+                NfcAdapter.sService.unregisterOemExtensionCallback(mOemNfcExtensionCallback);
+                mCallback = null;
+                mExecutor = null;
+            } catch (RemoteException e) {
+                mAdapter.attemptDeadServiceRecovery(e);
+            }
+        }
+    }
+
+    /**
+     * Clear NfcService preference, interface method to clear NFC preference values on OEM specific
+     * events. For ex: on soft reset, Nfc default values needs to be overridden by OEM defaults.
+     */
+    @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+    public void clearPreference() {
+        try {
+            NfcAdapter.sService.clearPreference();
+        } catch (RemoteException e) {
+            mAdapter.attemptDeadServiceRecovery(e);
+        }
+    }
+
+    private final class NfcOemExtensionCallback extends INfcOemExtensionCallback.Stub {
+        @Override
+        public void onTagConnected(boolean connected, Tag tag) throws RemoteException {
+            synchronized (mLock) {
+                if (mCallback == null || mExecutor == null) {
+                    return;
+                }
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    mExecutor.execute(() -> mCallback.onTagConnected(connected, tag));
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+        }
+    }
+}
diff --git a/nfc/java/android/nfc/cardemulation/CardEmulation.java b/nfc/java/android/nfc/cardemulation/CardEmulation.java
index 67697a4..de9eada1 100644
--- a/nfc/java/android/nfc/cardemulation/CardEmulation.java
+++ b/nfc/java/android/nfc/cardemulation/CardEmulation.java
@@ -36,6 +36,7 @@
 import android.nfc.Flags;
 import android.nfc.INfcCardEmulation;
 import android.nfc.NfcAdapter;
+import android.os.Build;
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.provider.Settings;
@@ -271,30 +272,31 @@
     }
 
     /**
+     * <p>
      * Returns whether the user has allowed AIDs registered in the
      * specified category to be handled by a service that is preferred
      * by the foreground application, instead of by a pre-configured default.
      *
      * Foreground applications can set such preferences using the
      * {@link #setPreferredService(Activity, ComponentName)} method.
+     * <p class="note">
+     * Starting with {@link Build.VERSION_CODES#VANILLA_ICE_CREAM}, this method will always
+     * return true.
      *
      * @param category The category, e.g. {@link #CATEGORY_PAYMENT}
      * @return whether AIDs in the category can be handled by a service
      *         specified by the foreground app.
-     *
-     * @deprecated see {@link android.app.role.RoleManager#ROLE_WALLET}. The definition of the
-     * Preferred Payment service is no longer valid. All routings will be done in a AID
-     * category agnostic manner.
      */
     @SuppressWarnings("NonUserGetterCalled")
-    @Deprecated
     public boolean categoryAllowsForegroundPreference(String category) {
         Context contextAsUser = mContext.createContextAsUser(
                 UserHandle.of(UserHandle.myUserId()), 0);
+
         RoleManager roleManager = contextAsUser.getSystemService(RoleManager.class);
         if (roleManager.isRoleAvailable(RoleManager.ROLE_WALLET)) {
             return true;
         }
+
         if (CATEGORY_PAYMENT.equals(category)) {
             boolean preferForeground = false;
             try {
@@ -319,14 +321,14 @@
      *    every time what service they would like to use in this category.
      * <p>{@link #SELECTION_MODE_ASK_IF_CONFLICT} the user will only be asked
      *    to pick a service if there is a conflict.
+     *
+     * <p class="note">
+     * Starting with {@link Build.VERSION_CODES#VANILLA_ICE_CREAM}, the default service defined
+     * by the holder of {@link android.app.role.RoleManager#ROLE_WALLET} and is category agnostic.
+     *
      * @param category The category, for example {@link #CATEGORY_PAYMENT}
      * @return the selection mode for the passed in category
-     *
-     * @deprecated see {@link android.app.role.RoleManager#ROLE_WALLET}. The definition of the
-     * Preferred Payment service is no longer valid. All routings will be done in a AID
-     * category agnostic manner.
      */
-    @Deprecated
     public int getSelectionModeForCategory(String category) {
         if (CATEGORY_PAYMENT.equals(category)) {
             boolean paymentRegistered = false;
@@ -919,6 +921,13 @@
     /**
      * Retrieves the route destination for the preferred payment service.
      *
+     * <p class="note">
+     * Starting with {@link Build.VERSION_CODES#VANILLA_ICE_CREAM}, the preferred payment service
+     * no longer exists and is replaced by {@link android.app.role.RoleManager#ROLE_WALLET}. This
+     * will return the route for one of the services registered by the role holder (if any). If
+     * there are multiple services registered, it is unspecified which of those will be used to
+     * determine the route.
+     *
      * @return The route destination secure element name of the preferred payment service.
      *         HCE payment: "Host"
      *         OffHost payment: 1. String with prefix SIM or prefix eSE string.
@@ -931,15 +940,8 @@
      *                                               (e.g. eSE/eSE1, eSE2, etc.).
      *                          2. "OffHost" if the payment service does not specify secure element
      *                             name.
-     *
-     * @deprecated see {@link android.app.role.RoleManager#ROLE_WALLET}. The definition of the
-     * Preferred Payment service is no longer valid. All routings will go to the Wallet Holder app.
-     * A payment service will be selected automatically based on registered AIDs. In the case of
-     * multiple services that register for the same payment AID, the selection will be done on
-     * an alphabetical order based on the component names.
      */
     @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO)
-    @Deprecated
     @Nullable
     public String getRouteDestinationForPreferredPaymentService() {
         try {
@@ -981,16 +983,16 @@
     /**
      * Returns a user-visible description of the preferred payment service.
      *
-     * @return the preferred payment service description
+     * <p class="note">
+     * Starting with {@link Build.VERSION_CODES#VANILLA_ICE_CREAM}, the preferred payment service
+     * no longer exists and is replaced by {@link android.app.role.RoleManager#ROLE_WALLET}. This
+     * will return the description for one of the services registered by the role holder (if any).
+     * If there are multiple services registered, it is unspecified which of those will be used
+     * to obtain the service description here.
      *
-     * @deprecated see {@link android.app.role.RoleManager#ROLE_WALLET}. The definition of the
-     * Preferred Payment service is no longer valid. All routings will go to the Wallet Holder app.
-     * A payment service will be selected automatically based on registered AIDs. In the case of
-     * multiple services that register for the same payment AID, the selection will be done on
-     * an alphabetical order based on the component names.
+     * @return the preferred payment service description
      */
     @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO)
-    @Deprecated
     @Nullable
     public CharSequence getDescriptionForPreferredPaymentService() {
         try {
diff --git a/nfc/java/android/nfc/cardemulation/PollingFrame.java b/nfc/java/android/nfc/cardemulation/PollingFrame.java
index 654e8cc..c6861bf 100644
--- a/nfc/java/android/nfc/cardemulation/PollingFrame.java
+++ b/nfc/java/android/nfc/cardemulation/PollingFrame.java
@@ -171,7 +171,7 @@
         byte[] data = frame.getByteArray(KEY_POLLING_LOOP_DATA);
         mData = (data == null) ? new byte[0] : data;
         mGain = frame.getInt(KEY_POLLING_LOOP_GAIN, -1);
-        mTimestamp = frame.getInt(KEY_POLLING_LOOP_TIMESTAMP);
+        mTimestamp = frame.getLong(KEY_POLLING_LOOP_TIMESTAMP);
         mTriggeredAutoTransact = frame.containsKey(KEY_POLLING_LOOP_TRIGGERED_AUTOTRANSACT)
                 && frame.getBoolean(KEY_POLLING_LOOP_TRIGGERED_AUTOTRANSACT);
     }
diff --git a/nfc/java/android/nfc/flags.aconfig b/nfc/java/android/nfc/flags.aconfig
index 6d4a17c..778f07c 100644
--- a/nfc/java/android/nfc/flags.aconfig
+++ b/nfc/java/android/nfc/flags.aconfig
@@ -84,3 +84,11 @@
     description: "Enable NFC vendor command support"
     bug: "289879306"
 }
+
+flag {
+    name: "nfc_oem_extension"
+    is_exported: true
+    namespace: "nfc"
+    description: "Enable NFC OEM extension support"
+    bug: "331206243"
+}
diff --git a/packages/CompanionDeviceManager/res/values-af/strings.xml b/packages/CompanionDeviceManager/res/values-af/strings.xml
index 94d9aaa6..abfccb0 100644
--- a/packages/CompanionDeviceManager/res/values-af/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-af/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"toestel"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Hierdie app sal toegang tot hierdie toestemmings op jou <xliff:g id="DEVICE_NAME">%1$s</xliff:g> hê"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Gee &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang tot hierdie inligting op jou foon"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Laat &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toe om jou foon se apps te stroom?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s sal toegang hê tot enigiets wat sigbaar is of gespeel word op die foon, insluitend oudio, foto’s, wagwoorde en boodskappe.&lt;br/&gt;&lt;br/&gt;%1$s sal apps kan stroom totdat jy toegang tot hierdie toestemming verwyder."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Oorkruistoestel-dienste"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek tans namens jou <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> toestemming om apps tussen jou toestelle te stroom"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek toestemming namens jou <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> om apps tussen jou toestelle te vertoon en te stroom"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Gee &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang tot hierdie inligting op jou foon"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Dienste"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek tans namens jou <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> toegang tot jou foon se foto’s, media en kennisgewings"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Laat &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; toe om hierdie handeling uit te voer?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Laat &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; toe om jou foon se apps en stelselkenmerke te stroom?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s sal toegang hê tot enigiets wat sigbaar is of gespeel word op jou foon, insluitend oudio, foto’s, betaalinligting, wagwoorde en boodskappe.&lt;br/&gt;&lt;br/&gt;%1$s sal apps en stelselkenmerke kan stroom totdat jy toegang tot hierdie toestemming verwyder."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 na toestelle in die omtrek te stroom"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-am/strings.xml b/packages/CompanionDeviceManager/res/values-am/strings.xml
index b53ac74..0d69359 100644
--- a/packages/CompanionDeviceManager/res/values-am/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-am/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"መሣሪያ"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"ይህ መተግበሪያ በእርስዎ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ላይ እነዚህን ፈቃዶች እንዲደርስ ይፈቀድለታል"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ይህን መረጃ ከስልክዎ እንዲደርስበት ይፍቀዱለት"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; የስልክዎን መተግበሪያዎች በዥረት እንዲያስተላልፍ ይፈቀድለት?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s ኦዲዮ፣ ፎቶዎች፣ የይለፍ ቃላት እና መልዕክቶችን ጨምሮ በስልክ ላይ የሚታየውን ወይም የሚጫወተውን የማንኛውም ነገር መዳረሻ ይኖረዋል።&lt;br/&gt;&lt;br/&gt;%1$s ይህን ፈቃድ እስኪያስወግዱ ድረስ መተግበሪያዎችን በዥረት ማስተላለፍ ይችላል።"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"መሣሪያ ተሻጋሪ አገልግሎቶች"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> በእርስዎ መሣሪያዎች መካከል መተግበሪያዎችን በዥረት ለመልቀቅ የእርስዎን <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ወክሎ ፈቃድ እየጠየቀ ነው"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> የእርስዎን <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ይህን መረጃ ከስልክዎ ላይ እንዲደርስ ይፍቀዱለት"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"የGoogle Play አገልግሎቶች"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> የስልክዎን ፎቶዎች፣ ሚዲያ እና ማሳወቂያዎች ለመድረስ የእርስዎን <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ወክሎ ፈቃድ እየጠየቀ ነው"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ይህን እርምጃ እንዲወስድ ፈቃድ ይሰጠው?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; የስልክዎን መተግበሪያዎች እና የሥርዓት ባህሪያት በዥረት እንዲያስተላልፍ ይፈቀድለት?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s ኦዲዮ፣ ፎቶዎች፣ የክፍያ መረጃ፣ የይለፍ ቃላት እና መልዕክቶችን ጨምሮ በስልክዎ ላይ የሚታየውን ወይም የሚጫወተውን የማንኛውም ነገር መዳረሻ ይኖረዋል። የዚህን ፈቃድ መዳረሻ እስከሚያስወግዱ ድረስ &lt;br/&gt;&lt;br/&gt;%1$s መተግበሪያዎችን እና የሥርዓት ባህሪያትን በዥረት ለማስተላለፍ ይችላል።"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> የእርስዎን <xliff:g id="DEVICE_NAME">%2$s</xliff:g> በመወከል በአቅራቢያ ላሉ መሣሪያዎች መተግበሪያዎች እና ሌሎች የስርዓት ባህሪያትን በዥረት ለመልቀቅ ፈቃድ እየጠየቀ ነው"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"መሣሪያ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ይህ መተግበሪያ እንደ የሚደውል ሰው ስም ያለ መረጃን በስልክዎ እና በተመረጠው መሣሪያ መካከል ማስመር ይችላል"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ar/strings.xml b/packages/CompanionDeviceManager/res/values-ar/strings.xml
index a1e09b2..183965e 100644
--- a/packages/CompanionDeviceManager/res/values-ar/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ar/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"جهاز"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"سيتم السماح لهذا التطبيق بالوصول إلى هذه الأذونات على \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"‏السماح لتطبيق &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; بالوصول إلى هذه المعلومات من هاتفك"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"‏هل تريد منح &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; إذنًا لبث التطبيقات المُثبَّتة على هاتفك؟"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"‏سيتمكّن \"%1$s\" من الوصول إلى كل المحتوى المعروض أو الذي يتم تشغيله على الهاتف، بما في ذلك الملفات الصوتية والصور وكلمات المرور والرسائل.&lt;br/&gt;&lt;br/&gt;سيتمكّن \"%1$s\" من بث التطبيقات إلى أنّ توقف إمكانية استخدام هذا الإذن."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"الخدمات التي تعمل بين الأجهزة"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"يطلب تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" لبثّ محتوى التطبيقات بين أجهزتك."</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"يطلب \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن \"<xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"‏السماح لتطبيق &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; بالوصول إلى هذه المعلومات من هاتفك"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"‏خدمات Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"يطلب تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" للوصول إلى الصور والوسائط والإشعارات في هاتفك."</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"‏هل تريد السماح للتطبيق &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; باتّخاذ هذا الإجراء؟"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"‏هل تريد منح &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; إذنًا لبث التطبيقات والوصول إلى ميزات النظام على هاتفك؟"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"‏سيتمكّن \"%1$s\" من الوصول إلى كل المحتوى المعروض أو الذي يتم تشغيله على هاتفك، بما في ذلك الملفات الصوتية والصور ومعلومات الدفع وكلمات المرور والرسائل.&lt;br/&gt;&lt;br/&gt;سيتمكّن \"%1$s\" من بث التطبيقات والوصول إلى ميزات النظام إلى أنّ توقف إمكانية استخدام هذا الإذن."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"يطلب \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" لبثّ التطبيقات وميزات النظام الأخرى إلى أجهزتك المجاورة."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"جهاز"</string>
     <string name="summary_generic" msgid="1761976003668044801">"سيتمكّن هذا التطبيق من مزامنة المعلومات، مثل اسم المتصل، بين هاتفك والجهاز المحدّد."</string>
diff --git a/packages/CompanionDeviceManager/res/values-as/strings.xml b/packages/CompanionDeviceManager/res/values-as/strings.xml
index 481ce24..3d1554b 100644
--- a/packages/CompanionDeviceManager/res/values-as/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-as/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"ডিভাইচ"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"এই এপ্‌টোক আপোনাৰ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ত এই অনুমতিসমূহ এক্সেছ কৰিবলৈ অনুমতি দিয়া হ’ব"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ক আপোনাৰ ফ’নৰ পৰা এই তথ্যখিনি এক্সেছ কৰাৰ অনুমতি দিয়ক"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ক আপোনাৰ ফ’নৰ এপ্‌ ষ্ট্ৰীম কৰিবলৈ দিবনে?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$sএ আপোনাৰ ফ’নত দৃশ্যমান অথবা প্লে কৰা অডিঅ’, ফট’ পাছৱৰ্ড আৰু বাৰ্তাকে ধৰি যিকোনো বস্তু এক্সেছ কৰিব পাৰিব।&lt;br/&gt;&lt;br/&gt;%1$sএ আপুনি এই অনুমতিৰ এক্সেছ আঁতৰাই নিদিয়া পৰ্যন্ত এপ্‌সমূহ ষ্ট্ৰীম কৰিব পাৰিব।"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ক্ৰছ-ডিভাইচ সেৱাসমূহ"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>ৰ হৈ আপোনাৰ ডিভাইচসমূহৰ মাজত এপ্‌ ষ্ট্ৰীম কৰাৰ বাবে অনুৰোধ জনাইছে"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ক আপোনাৰ ফ’নৰ পৰা এই তথ্যখিনি এক্সেছ কৰাৰ অনুমতি দিয়ক"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play সেৱা"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>ৰ হৈ আপোনাৰ ফ’নৰ ফট’, মিডিয়া আৰু জাননী এক্সেছ কৰাৰ বাবে অনুৰোধ জনাইছে"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;ক এই কাৰ্যটো সম্পাদন কৰিবলৈ দিবনে?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;ক আপোনাৰ ফ’নৰ এপ্‌ আৰু ছিষ্টেমৰ সুবিধা ষ্ট্ৰীম কৰিবলৈ দিবনে?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$sএ আপোনাৰ ফ’নত দৃশ্যমান অথবা প্লে কৰা অডিঅ’, ফট’ পাছৱৰ্ড আৰু বাৰ্তাকে ধৰি যিকোনো বস্তু এক্সেছ কৰিব পাৰিব।&lt;br/&gt;&lt;br/&gt;%1$sএ আপুনি এই অনুমতিৰ এক্সেছ আঁতৰাই নিদিয়া পৰ্যন্ত এপ্‌সমূহ আৰু ছিষ্টেমৰ সুবিধাসমূহ ষ্ট্ৰীম কৰিব পাৰিব।"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DEVICE_NAME">%2$s</xliff:g>ৰ হৈ নিকটৱৰ্তী ডিভাইচত এপ্‌ আৰু ছিষ্টেমৰ অন্য সুবিধাসমূহ ষ্ট্ৰীম কৰাৰ অনুমতি দিবলৈ অনুৰোধ জনাইছে"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইচ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"এই এপ্‌টোৱে আপোনাৰ ফ’ন আৰু বাছনি কৰা ডিভাইচটোৰ মাজত কল কৰোঁতাৰ নামৰ দৰে তথ্য ছিংক কৰিব পাৰিব"</string>
diff --git a/packages/CompanionDeviceManager/res/values-az/strings.xml b/packages/CompanionDeviceManager/res/values-az/strings.xml
index 4e71b8c..6128c5c 100644
--- a/packages/CompanionDeviceManager/res/values-az/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-az/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"cihazda"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Bu tətbiq <xliff:g id="DEVICE_NAME">%1$s</xliff:g> bu icazələrə daxil ola biləcək"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tətbiqinə telefonunuzdan bu məlumata giriş icazəsi verin"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tətbiqinə telefon tətbiqlərini yayımlamaq icazəsi verilsin?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s audio, foto, parol və mesajlar daxil olmaqla telefonda görünən və ya oxudulan məzmuna giriş əldə edəcək.&lt;br/&gt;&lt;br/&gt;%1$s bu icazəyə giriş silinənədək tətbiqləri yayımlayacaq."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cihazlararası xidmətlər"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> adından cihazlar arasında tətbiqləri yayımlamaq icazəsi istəyir"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<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="DISPLAY_NAME">%2$s</xliff:g> əvəzinə icazə tələb edir"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tətbiqinə telefonunuzdan bu məlumata giriş icazəsi verin"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play xidmətləri"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> adından telefonun foto, media və bildirişlərinə giriş icazəsi istəyir"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; cihazına bu əməliyyatı yerinə yetirmək icazəsi verilsin?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; tətbiqinə telefon tətbiqlərini və sistem funksiyalarını yayımlamaq icazəsi verilsin?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s audio, foto, ödəniş məlumatı, parol və mesajlar daxil olmaqla telefonda görünən və ya oxudulan məzmuna giriş əldə edəcək.&lt;br/&gt;&lt;br/&gt;%1$s bu icazəyə giriş silinənədək tətbiqləri və sistem funksiyalarını yayımlayacaq."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%2$s</xliff:g> adından tətbiq və digər sistem funksiyalarını yaxınlıqdakı cihazlara yayımlamaq icazəsi sitəyir"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
index 6504ab4..dde4906 100644
--- a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"uređaj"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Ovoj aplikaciji će biti dozvoljeno da pristupa ovim dozvolama na vašem uređaju (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Dozvolite da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pristupa ovim informacijama sa telefona"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Želite li da dozvolite da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; strimuje aplikacije na telefonu?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s će imati pristup svemu što se vidi ili pušta na telefonu, uključujući zvuk, slike, lozinke i poruke.&lt;br/&gt;&lt;br/&gt;%1$s će moći da strimuje aplikacije dok ne uklonite pristup ovoj dozvoli."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usluge na više uređaja"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> zahteva dozvolu u ime uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> za strimovanje aplikacija između uređaja"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> traži dozvolu u ime uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> da prikazuje i strimuje aplikacije između uređaja"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Dozvolite da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pristupa ovim informacijama sa telefona"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play usluge"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> zahteva dozvolu u ime uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> za pristup slikama, medijskom sadržaju i obaveštenjima sa telefona"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Želite li da dozvolite da &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; obavi ovu radnju?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Želite li da dozvolite da &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; strimuje aplikacije i funkcije sistema na telefonu?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s će imati pristup svemu što se vidi ili pušta na telefonu, uključujući zvuk, slike, informacije o plaćanju, lozinke i poruke.&lt;br/&gt;&lt;br/&gt;%1$s će moći da strimuje aplikacije i funkcije sistema dok ne uklonite pristup ovoj dozvoli."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahteva dozvolu u ime uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> da strimuje aplikacije i druge sistemske funkcije na uređaje u blizini"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-be/strings.xml b/packages/CompanionDeviceManager/res/values-be/strings.xml
index fcc587a..266e6be 100644
--- a/packages/CompanionDeviceManager/res/values-be/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-be/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"прылада"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Гэтая праграма будзе мець на вашай прыладзе \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\" наступныя дазволы"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Дазвольце праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; мець доступ да гэтай інфармацыі з вашага тэлефона"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Дазволіць праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; трансліраваць праграмы з вашага тэлефона?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"Праграма \"%1$s\" будзе мець доступ да ўсяго, што адлюстроўваецца на экране тэлефона ці прайграецца на ім, уключаючы аўдыя, фота, паролі і паведамленні.&lt;br/&gt;&lt;br/&gt;Праграма \"%1$s\" зможа трансліраваць праграмы, пакуль вы не адклічаце гэты дазвол."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Сэрвісы для некалькіх прылад"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імя вашай прылады \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" на трансляцыю праграм паміж вашымі прыладамі"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імені вашай прылады \"<xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"Дазвольце праграме &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; мець доступ да гэтай інфармацыі з вашага тэлефона"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Сэрвісы Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імя вашай прылады \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" на доступ да фота, медыяфайлаў і апавяшчэнняў на вашым тэлефоне"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Дазволіць прыладзе &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; выканаць гэта дзеянне?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Дазволіць прыладзе &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; трансліраваць праграмы і сістэмныя функцыі з вашага тэлефона?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"Прылада \"%1$s\" будзе мець доступ да ўсяго, што адлюстроўваецца на экране тэлефона ці прайграецца на ім, уключаючы аўдыя, фота, плацежную інфармацыю, паролі і паведамленні.&lt;br/&gt;&lt;br/&gt;Прылада \"%1$s\" зможа трансліраваць праграмы і сістэмныя функцыі, пакуль вы не адклічаце гэты дазвол."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імя вашай прылады \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" на перадачу плынню змесціва праграм і іншых функцый сістэмы на прылады паблізу"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"прылада"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Гэта праграма зможа сінхранізаваць інфармацыю (напрыклад, імя таго, хто звоніць) паміж тэлефонам і выбранай прыладай"</string>
diff --git a/packages/CompanionDeviceManager/res/values-bn/strings.xml b/packages/CompanionDeviceManager/res/values-bn/strings.xml
index 30447ce..771f4ec 100644
--- a/packages/CompanionDeviceManager/res/values-bn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bn/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"ডিভাইস"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"এই অ্যাপ আপনার <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-এ এইসব অনুমতি অ্যাক্সেস করতে পারবে"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"আপনার ফোন থেকে &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; অ্যাপকে এই তথ্য অ্যাক্সেস করার অনুমতি দিন"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; আপনার ফোনের অ্যাপ স্ট্রিম করার অনুমতি দেবেন?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s, অডিও, ফটো, পাসওয়ার্ড এবং মেসেজ সহ ফোনে দেখা বা চালানো যায় এমন সব কিছু অ্যাক্সেস করতে পারবে।&lt;br/&gt;&lt;br/&gt;আপনি এই অনুমতি না সরানো পর্যন্ত %1$s অ্যাপ স্ট্রিম করতে পারবে।"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ক্রস-ডিভাইস পরিষেবা"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"আপনার ডিভাইসগুলির মধ্যে অ্যাপ স্ট্রিম করার জন্য <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-এর হয়ে অনুমতি চাইছে"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"আপনার ডিভাইসের মধ্যে অ্যাপ, ডিসপ্লে এবং স্ট্রিম করতে আপনার <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-এর হয়ে <xliff:g id="APP_NAME">%1$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="4693714143506569253">"আপনার ফোন থেকে &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-কে এই তথ্য অ্যাক্সেস করার অনুমতি দিন"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play পরিষেবা"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"আপনার ফোনের ফটো, মিডিয়া এবং তথ্য অ্যাক্সেস করার জন্য <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-এর হয়ে অনুমতি চাইছে"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;-কে এই কাজটি করতে দেবেন?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; আপনার ফোনের অ্যাপ এবং সিস্টেম ফিচার স্ট্রিম করার অনুমতি দেবেন?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s, অডিও, ফটো, পেমেন্টের তথ্য, পাসওয়ার্ড এবং মেসেজ সহ আপনার ফোনে দেখা বা চালানো যায় এমন সব কিছু অ্যাক্সেস করতে পারবে।&lt;br/&gt;&lt;br/&gt;আপনি এই অনুমতি না সরানো পর্যন্ত %1$s অ্যাপ এবং সিস্টেম ফিচার স্ট্রিম করতে পারবে।"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"আশেপাশের ডিভাইসে অ্যাপ ও অন্যান্য সিস্টেম ফিচার স্ট্রিম করার জন্য আপনার <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-এর হয়ে <xliff:g id="APP_NAME">%1$s</xliff:g> অনুমতি চেয়ে অনুরোধ করছে"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইস"</string>
     <string name="summary_generic" msgid="1761976003668044801">"এই অ্যাপ, আপনার ফোন এবং বেছে নেওয়া ডিভাইসের মধ্যে তথ্য সিঙ্ক করতে পারবে, যেমন কোনও কলারের নাম"</string>
diff --git a/packages/CompanionDeviceManager/res/values-bs/strings.xml b/packages/CompanionDeviceManager/res/values-bs/strings.xml
index 87c5349..231d395 100644
--- a/packages/CompanionDeviceManager/res/values-bs/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-bs/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"uređaj"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Aplikaciji će biti dozvoljen pristup ovim odobrenjima na uređaju <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Dozvolite da aplikacija &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pristupa ovim informacijama s telefona"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Dozvoliti aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da prenosi aplikacije telefona?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s će imati pristup svemu što je vidljivo ili se reproducira na telefonu, uključujući zvuk, fotografije, lozinke i poruke.&lt;br/&gt;&lt;br/&gt;%1$s će moći prenositi aplikacije dok ne uklonite pristup ovom odobrenju."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usluga na više uređaja"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> u ime uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> zahtijeva odobrenje da prenosi aplikacije između vaših uređaja"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> traži odobrenje u ime vašeg uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> da prikazuje i prenosi aplikacije između vaših uređaja"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Dozvolite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da pristupa ovim informacijama s vašeg telefona"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play usluge"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> u ime uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> zahtijeva odobrenje da pristupi fotografijama, medijima i obavještenjima na telefonu"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Dozvoliti uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; da poduzme ovu radnju?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Dozvoliti uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; da prenosi aplikacije telefona i funkcije sistema?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s će imati pristup svemu što je vidljivo ili se reproducira na telefonu, uključujući zvuk, fotografije, podatke o plaćanju, lozinke i poruke.&lt;br/&gt;&lt;br/&gt;%1$s će moći prenositi aplikacije i funkcije sistema dok ne uklonite pristup ovom odobrenju."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> u ime uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> traži odobrenje da prenosi aplikacije i druge funkcije sistema na uređajima u blizini"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-ca/strings.xml b/packages/CompanionDeviceManager/res/values-ca/strings.xml
index 40c6aac..ae9e23f 100644
--- a/packages/CompanionDeviceManager/res/values-ca/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ca/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositiu"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Aquesta aplicació podrà accedir a aquests permisos del dispositiu (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Permet que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; accedeixi a aquesta informació del telèfon"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Vols permetre que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; reprodueixi en continu les aplicacions del telèfon?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s podrà accedir a qualsevol cosa que sigui visible o que es reprodueixi al telèfon, inclosos àudios, fotos, contrasenyes i missatges.&lt;br/&gt;&lt;br/&gt;%1$s podrà reproduir en continu aplicacions fins que suprimeixis l\'accés a aquest permís."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serveis multidispositiu"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> demana permís en nom del teu dispositiu (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) per reproduir en continu aplicacions entre els dispositius"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> demana permís en nom del teu dispositiu <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> per mostrar i reproduir en continu aplicacions entre els dispositius"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Permet que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; accedeixi a aquesta informació del telèfon"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Serveis de Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> demana permís en nom del teu dispositiu (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) per accedir a les fotos, el contingut multimèdia i les notificacions del telèfon"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vols permetre que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; dugui a terme aquesta acció?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Vols permetre que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; reprodueixi en continu les aplicacions del telèfon i les funcions del sistema?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s podrà accedir a qualsevol cosa que sigui visible o que es reprodueixi al telèfon, inclosos àudios, fotos, informació de pagament, contrasenyes i missatges.&lt;br/&gt;&lt;br/&gt;%1$s podrà reproduir en continu aplicacions i funcions del sistema fins que suprimeixis l\'accés a aquest permís."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> sol·licita 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 en dispositius propers"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-cs/strings.xml b/packages/CompanionDeviceManager/res/values-cs/strings.xml
index 7d7d74f..94510e3 100644
--- a/packages/CompanionDeviceManager/res/values-cs/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-cs/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"zařízení"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Tato aplikace bude mít ve vašem <xliff:g id="DEVICE_NAME">%1$s</xliff:g> povolený přístup k těmto oprávněním"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"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 telefonu"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Povolit zařízení &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; streamovat aplikace telefonu?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"Aplikace %1$s bude mít přístup ke všemu, co zobrazíte nebo přehrajete na telefonu, včetně zvuku, fotek, hesel a zpráv.&lt;br/&gt;&lt;br/&gt;%1$s bude moci streamovat aplikace, dokud přístup k tomuto oprávnění neodeberete."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Služby pro více zařízení"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> požaduje za vaše zařízení <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> oprávnění ke streamování aplikací mezi zařízeními"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> požaduje za vaše zařízení <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> oprávnění k zobrazení a streamování obsahu mezi zařízeními"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"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 telefonu"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Služby Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> požaduje za vaše zařízení <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> oprávnění k přístupu k fotkám, médiím a oznámením v telefonu"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Povolit zařízení &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; podniknout tuto akci?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Povolit zařízení &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; streamovat aplikace a systémové funkce telefonu?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"Aplikace %1$s bude mít přístup ke všemu, co zobrazíte nebo přehrajete na telefonu, včetně zvuku, fotek, platebních údajů, hesel a zpráv.&lt;br/&gt;&lt;br/&gt;%1$s bude moci streamovat aplikace a systémové funkce, dokud přístup k tomuto oprávnění neodeberete."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> žádá jménem vašeho zařízení <xliff:g id="DEVICE_NAME">%2$s</xliff:g> o oprávnění streamovat aplikace a další systémové funkce do zařízení v okolí"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-da/strings.xml b/packages/CompanionDeviceManager/res/values-da/strings.xml
index c4fa73a..6b38bff 100644
--- a/packages/CompanionDeviceManager/res/values-da/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-da/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"enhed"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Denne app får adgang til disse tilladelser på din <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Giv &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; adgang til disse oplysninger fra din telefon"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Vil du give &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tilladelse til at streame din telefons apps?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s har adgang til alt, der er synligt eller afspilles på telefonen, herunder lyd, billeder, adgangskoder og beskeder.&lt;br/&gt;&lt;br/&gt;%1$s kan streame apps, indtil du fjerner adgangen til denne tilladelse."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Tjenester, som kan tilsluttes en anden enhed"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om tilladelse på vegne af din <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> til at streame apps mellem dine enheder"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om tilladelse på vegne af din <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> til at vise og streame apps mellem dine enheder"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Tillad, at &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; får adgang til disse oplysninger fra din telefon"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-tjenester"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om tilladelse på vegne af din <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> til at få adgang til din telefons billeder, medier og notifikationer"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vil du tillade, at &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; foretager denne handling?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Vil du give &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; tilladelse til at streame din telefons apps og systemfunktioner?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s har adgang til alt, der er synligt eller afspilles på din telefon, herunder lyd, billeder, adgangskoder og beskeder.&lt;br/&gt;&lt;br/&gt;%1$s kan streame apps og systemfunktioner, indtil du fjerner adgangen til denne tilladelse."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 til enheder i nærheden"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-de/strings.xml b/packages/CompanionDeviceManager/res/values-de/strings.xml
index d435829..65e923c 100644
--- a/packages/CompanionDeviceManager/res/values-de/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-de/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"Gerät"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Diese App darf dann auf diese Berechtigungen auf deinem <xliff:g id="DEVICE_NAME">%1$s</xliff:g> zugreifen:"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; Zugriff auf diese Informationen von deinem Smartphone gewähren"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; erlauben, die Apps auf deinem Smartphone zu streamen?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s hat dann Zugriff auf alle Inhalte, die auf deinem Smartphone sichtbar sind oder abgespielt werden, einschließlich Audio, Fotos, Passwörter und Nachrichten.&lt;br/&gt;&lt;br/&gt;%1$s kann so lange Apps streamen, bis du diese Berechtigung entfernst."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Geräteübergreifende Dienste"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet für dein <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> um die Berechtigung zum Streamen von Apps zwischen deinen Geräten"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet für dein <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> um die Berechtigung zum Anzeigen und Streamen von Apps zwischen deinen Geräten"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; Zugriff auf diese Informationen von deinem Smartphone gewähren"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-Dienste"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet im Namen deines <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> um die Berechtigung zum Zugriff auf die Fotos, Medien und Benachrichtigungen deines Smartphones"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Darf das Gerät &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; diese Aktion ausführen?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; erlauben, die Apps und Systemfunktionen auf deinem Smartphone zu streamen?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s hat dann Zugriff auf alle Inhalte, die auf deinem Smartphone sichtbar sind oder abgespielt werden, einschließlich Audio, Fotos, Zahlungsinformationen, Passwörter und Nachrichten.&lt;br/&gt;&lt;br/&gt;%1$s kann so lange Apps und Systemfunktionen streamen, bis du diese Berechtigung entfernst."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet für dein Gerät (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) um die Berechtigung, Apps und andere Systemfunktionen auf Geräte in der Nähe zu streamen"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-el/strings.xml b/packages/CompanionDeviceManager/res/values-el/strings.xml
index 2fbe353..2d27790 100644
--- a/packages/CompanionDeviceManager/res/values-el/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-el/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"συσκευή"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Αυτή η εφαρμογή θα μπορεί να έχει πρόσβαση σε αυτές τις άδειες στη συσκευή <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Να επιτρέπεται στο &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; η πρόσβαση σε αυτές τις πληροφορίες από το τηλέφωνό σας."</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Να επιτρέπεται στην εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; η μετάδοση σε ροή των εφαρμογών του τηλεφώνου σας;"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"Το %1$s θα έχει πρόσβαση σε οτιδήποτε είναι ορατό ή αναπαράγεται στο τηλέφωνο, συμπεριλαμβανομένων ήχων, φωτογραφιών, κωδικών πρόσβασης και μηνυμάτων.&lt;br/&gt;&lt;br/&gt;Το %1$s θα μπορεί να μεταδώσει εφαρμογές σε ροή μέχρι να καταργήσετε την πρόσβαση σε αυτή την άδεια."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Υπηρεσίες πολλών συσκευών"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά εκ μέρους της συσκευής σας <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> άδεια για ροή εφαρμογών μεταξύ των συσκευών σας"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά άδεια εκ μέρους της συσκευής <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"Επιτρέψτε στην εφαρμογή &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; να έχει πρόσβαση σε αυτές τις πληροφορίες από το τηλέφωνό σας"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Υπηρεσίες Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά εκ μέρους της συσκευής σας <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> άδεια για πρόσβαση στις φωτογραφίες, τα αρχεία μέσων και τις ειδοποιήσεις του τηλεφώνου σας"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Να επιτρέπεται στη συσκευή &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; να εκτελεί αυτή την ενέργεια;"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Να επιτρέπεται στη συσκευή &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; η μετάδοση σε ροή των εφαρμογών και των λειτουργιών συστήματος του τηλεφώνου σας;"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"Το %1$s θα έχει πρόσβαση σε οτιδήποτε είναι ορατό ή αναπαράγεται στο τηλέφωνο, συμπεριλαμβανομένων ήχων, φωτογραφιών, στοιχείων πληρωμής, κωδικών πρόσβασης και μηνυμάτων.&lt;br/&gt;&lt;br/&gt;Το %1$s θα μπορεί να μεταδώσει εφαρμογές και λειτουργίες συστήματος σε ροή μέχρι να καταργήσετε την πρόσβαση σε αυτή την άδεια."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά άδεια εκ μέρους της συσκευής σας <xliff:g id="DEVICE_NAME">%2$s</xliff:g> για ροή εφαρμογών και άλλων λειτουργιών του συστήματος σε συσκευές σε κοντινή απόσταση"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"συσκευή"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Αυτή η εφαρμογή θα μπορεί να συγχρονίζει πληροφορίες μεταξύ του τηλεφώνου και της επιλεγμένης συσκευής σας, όπως το όνομα ενός ατόμου που σας καλεί."</string>
diff --git a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
index ee8eca0..e23a48c 100644
--- a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your phone\'s apps?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s will have access to anything that\'s visible or played on the phone, including audio, photos, passwords and messages.&lt;br/&gt;&lt;br/&gt;%1$s will be able to stream apps until you remove access to this permission."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to stream apps between your devices"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to display and stream apps between your devices"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to access your phone’s photos, media and notifications"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; to take this action?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your phone\'s apps and system features?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s will have access to anything that\'s visible or played on your phone, including audio, photos, payment info, passwords and messages.&lt;br/&gt;&lt;br/&gt;%1$s will be able to stream apps and system features until you remove access to this permission."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 to nearby devices"</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>
diff --git a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
index ee8eca0..e23a48c 100644
--- a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your phone\'s apps?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s will have access to anything that\'s visible or played on the phone, including audio, photos, passwords and messages.&lt;br/&gt;&lt;br/&gt;%1$s will be able to stream apps until you remove access to this permission."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to stream apps between your devices"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to display and stream apps between your devices"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to access your phone’s photos, media and notifications"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; to take this action?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your phone\'s apps and system features?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s will have access to anything that\'s visible or played on your phone, including audio, photos, payment info, passwords and messages.&lt;br/&gt;&lt;br/&gt;%1$s will be able to stream apps and system features until you remove access to this permission."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 to nearby devices"</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>
diff --git a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
index ee8eca0..e23a48c 100644
--- a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your phone\'s apps?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s will have access to anything that\'s visible or played on the phone, including audio, photos, passwords and messages.&lt;br/&gt;&lt;br/&gt;%1$s will be able to stream apps until you remove access to this permission."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to stream apps between your devices"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to display and stream apps between your devices"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Allow &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; to access this information from your phone"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to access your phone’s photos, media and notifications"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; to take this action?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Allow &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; to stream your phone\'s apps and system features?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s will have access to anything that\'s visible or played on your phone, including audio, photos, payment info, passwords and messages.&lt;br/&gt;&lt;br/&gt;%1$s will be able to stream apps and system features until you remove access to this permission."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 to nearby devices"</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>
diff --git a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
index 51f1874..c0d1888 100644
--- a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Esta app podrá acceder a los siguientes permisos en tu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Permite que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información de tu teléfono"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"¿Quieres permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; transmita apps del teléfono?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s tendrá acceso a todo el contenido visible o que se reproduzca en el teléfono, lo que incluye audio, fotos, contraseñas y mensajes.&lt;br/&gt;&lt;br/&gt;%1$s podrá transmitir apps, a menos que se quite el acceso a este permiso."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servicios multidispositivo"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicita tu permiso en nombre de <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para transmitir apps entre dispositivos"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicita tu permiso en nombre de <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para mostrar y transmitir apps entre dispositivos"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Permite que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información de tu teléfono"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Servicios de Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicita tu permiso en nombre de <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para acceder a las fotos, el contenido multimedia y las notificaciones de tu teléfono"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"¿Permites que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; realice esta acción?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"¿Quieres permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; transmita funciones del sistema y apps del teléfono?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s tendrá acceso a todo el contenido visible o que se reproduzca en tu teléfono, lo que incluye audio, fotos, información de pago, contraseñas y mensajes.&lt;br/&gt;&lt;br/&gt;%1$s podrá transmitir apps y funciones del sistema, a menos que se quiete el acceso a este permiso."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nombre de tu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para transmitir apps y otras funciones del sistema a dispositivos cercanos"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-es/strings.xml b/packages/CompanionDeviceManager/res/values-es/strings.xml
index 3e157f0..cdabc6c 100644
--- a/packages/CompanionDeviceManager/res/values-es/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-es/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Esta aplicación podrá acceder a estos permisos de tu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información de tu teléfono"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"¿Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; emita las aplicaciones de tu dispositivo?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s tendrá acceso a todo lo que sea visible o se reproduzca en el teléfono, incluidos audio, fotos, contraseñas y mensajes.&lt;br/&gt;&lt;br/&gt;%1$s podrá emitir aplicaciones hasta que quites el acceso a este permiso."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servicios multidispositivo"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de tu <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para emitir aplicaciones en otros dispositivos tuyos"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de tu <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para mostrar y emitir aplicaciones en otros dispositivos tuyos"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información de tu teléfono"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Servicios de Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de tu <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para acceder a las fotos, los archivos multimedia y las notificaciones de tu teléfono"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"¿Permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; realice esta acción?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"¿Permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; emita las aplicaciones y funciones del sistema de tu dispositivo?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s tendrá acceso a todo lo que sea visible o se reproduzca en el teléfono, incluidos audio, fotos, información para pagos, contraseñas y mensajes.&lt;br/&gt;&lt;br/&gt;%1$s podrá emitir aplicaciones y funciones del sistema hasta que quites el acceso a este permiso."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 dispositivos cercanos"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-et/strings.xml b/packages/CompanionDeviceManager/res/values-et/strings.xml
index 28e8b0d..b7a9ff6 100644
--- a/packages/CompanionDeviceManager/res/values-et/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-et/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"seade"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Sellele rakendusele antakse need load teie seadmes <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Lubage rakendusel &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pääseda teie telefonis juurde sellele teabele"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Kas lubate rakendusel &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; oma telefoni rakendusi voogesitada?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s saab juurdepääsu kõigele, mis on telefonis nähtaval või esitatav, sh helile, fotodele, paroolidele ja sõnumitele.&lt;br/&gt;&lt;br/&gt;%1$s saab rakendusi voogesitada kuni eemaldate juurdepääsu sellele loale."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Seadmeülesed teenused"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nimel luba teie seadmete vahel rakendusi voogesitada"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nimel luba teie seadmete vahel rakendusi kuvada ja voogesitada"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Lubage rakendusel &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pääseda teie telefonis juurde sellele teabele"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play teenused"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nimel luba pääseda juurde telefoni fotodele, meediale ja märguannetele"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Kas lubada seadmel &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; teha seda toimingut?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Kas lubate rakendusel &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; oma telefoni rakenduste ja süsteemifunktsioonidel voogesitada?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s saab juurdepääsu kõigele, mis on teie telefonis nähtav või esitatav, sh heli, fotod, makseteave, paroolid ja sõnumid.&lt;br/&gt;&lt;br/&gt;%1$s saab voogesitada rakendusi ja süsteemifunktsioone, kuni eemaldate juurdepääsu sellele loale."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nimel luba voogesitada rakendusi ja muid süsteemi funktsioone läheduses olevatesse seadmetesse"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-eu/strings.xml b/packages/CompanionDeviceManager/res/values-eu/strings.xml
index 1884e04..d0dee9b 100644
--- a/packages/CompanionDeviceManager/res/values-eu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-eu/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"gailua"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Baimen hauek erabili ahalko ditu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>n aplikazioak:"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Eman informazioa telefonotik hartzeko baimena &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari zure telefonoko aplikazioak zuzenean igortzeko baimena eman nahi diozu?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s aplikazioak telefonoan ikusgai dagoen edo erreproduzitzen den eduki guztia atzitu ahal izango du, audioa, argazkiak, pasahitzak eta mezuak barne.&lt;br/&gt;&lt;br/&gt;%1$s aplikazioak zuzenean igortzeko gai izango da, baimen hori kentzen diozun arte."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Gailuarteko zerbitzuak"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Gailu batetik bestera aplikazioak igortzeko baimena eskatzen ari da <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> gailuaren izenean"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Aplikazioak gailuen artean bistaratzeko eta zuzenean igortzeko baimena eskatzen ari da <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> gailuaren izenean"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Eman telefonoko informazio hau erabiltzeko baimena &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Telefonoko argazkiak, multimedia-edukia eta jakinarazpenak erabiltzeko baimena eskatzen ari da <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> gailuaren izenean"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ekintza hau gauzatzeko baimena eman nahi diozu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; aplikazioari zure telefonoko aplikazioak eta sistemaren eginbideak zuzenean igortzeko baimena eman nahi diozu?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s aplikazioak telefonoan 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;%1$s aplikazioak eta sistemaren eginbideak zuzenean igortzeko gai izango da, baimen hori kentzen diozun arte."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikazioak eta sistemaren beste eginbide batzuk inguruko gailuetara 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>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-fa/strings.xml b/packages/CompanionDeviceManager/res/values-fa/strings.xml
index 9c5807b..b3432ed 100644
--- a/packages/CompanionDeviceManager/res/values-fa/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fa/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"دستگاه"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"این برنامه مجاز می‌شود به این اجازه‌ها در <xliff:g id="DEVICE_NAME">%1$s</xliff:g> شما دسترسی پیدا کند"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"‏اجازه دادن به &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; برای دسترسی به اطلاعات تلفن"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"‏به &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; اجازه می‌دهید برنامه‌های تلفنتان را جاری‌سازی کند؟"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"‏‫%1$s به هرچیزی که در تلفن نمایان است یا پخش می‌شود، ازجمله صداها، عکس‌ها، گذرواژه‌ها، و پیام‌ها دسترسی خواهد داشت.&lt;br/&gt;&lt;br/&gt;تا زمانی که دسترسی به این اجازه را حذف نکنید، %1$s می‌تواند برنامه‌ها را جاری‌سازی کند."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"سرویس‌های بین‌دستگاهی"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ازطرف <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> اجازه می‌خواهد برنامه‌ها را بین دستگاه‌های شما جاری‌سازی کند"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> ازطرف <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"‏به &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; اجازه دسترسی به این اطلاعات در دستگاهتان داده شود"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"‏خدمات Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ازطرف <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> اجازه می‌خواهد به عکس‌ها، رسانه‌ها، و اعلان‌های تلفن شما دسترسی پیدا کند"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"‏به &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; اجازه داده شود این اقدام را انجام دهد؟"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"‏به &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; اجازه می‌دهید برنامه‌های تلفنتان و ویژگی‌های سیستم را جاری‌سازی کند؟"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"‏‫%1$s به هرچیزی که در تلفن نمایان است یا پخش می‌شود، ازجمله صداها، عکس‌ها، اطلاعات پرداخت، گذرواژه‌ها، و پیام‌ها دسترسی خواهد داشت.&lt;br/&gt;&lt;br/&gt;تا زمانی که دسترسی به این اجازه را حذف نکنید، %1$s می‌تواند برنامه‌ها و ویژگی‌های سیستم را جاری‌سازی کند."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ازطرف <xliff:g id="DEVICE_NAME">%2$s</xliff:g> اجازه می‌خواهد تا برنامه‌ها و دیگر ویژگی‌های سیستم را در دستگاه‌های اطراف جاری‌سازی کند."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"دستگاه"</string>
     <string name="summary_generic" msgid="1761976003668044801">"این برنامه مجاز می‌شود اطلاعتی مثل نام شخصی را که تماس می‌گیرد بین تلفن شما و دستگاه انتخاب‌شده همگام‌سازی کند"</string>
diff --git a/packages/CompanionDeviceManager/res/values-fi/strings.xml b/packages/CompanionDeviceManager/res/values-fi/strings.xml
index ecde949..0671410 100644
--- a/packages/CompanionDeviceManager/res/values-fi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fi/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"laite"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Tämä sovellus saa käyttää näitä lupia laitteella (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Salli, että &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; saa pääsyn näihin puhelimesi tietoihin"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Saako &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; striimata puhelimen sovelluksia?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s saa pääsyn kaikkeen puhelimessa näkyvään tai pelattavaan, mukaan lukien audioon, kuviin, salasanoihin ja viesteihin.&lt;br/&gt;&lt;br/&gt;%1$s voi striimata sovelluksia, kunnes poistat luvan."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Laitteidenväliset palvelut"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää laitteesi (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) puolesta lupaa striimata sovelluksia laitteidesi välillä"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää laitteesi (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) puolesta lupaa näyttää ja striimata sovelluksia laitteidesi välillä"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Salli pääsy tähän tietoon puhelimellasi: &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Palvelut"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää laitteesi (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) puolesta lupaa päästä puhelimesi kuviin, mediaan ja ilmoituksiin"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Sallitko, että &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; voi suorittaa tämän toiminnon?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Saako &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; striimata puhelimen sovelluksia ja järjestelmäominaisuuksia?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s saa pääsyn kaikkeen puhelimessa näkyvään tai pelattavaan, mukaan lukien audioon, kuviin, maksutietoihin, salasanoihin ja viesteihin.&lt;br/&gt;&lt;br/&gt;%1$s voi striimata sovelluksia ja järjestelmäominaisuuksia, kunnes poistat luvan."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 lähellä oleviin laitteisiin."</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
index 5debbf3..97abef7 100644
--- a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"appareil"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Cette application pourra accéder à ces autorisations sur votre <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Autorisez &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à ces informations à partir de votre téléphone"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à diffuser les applications de votre téléphone?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s aura accès à tout ce qui est visible ou lu sur le téléphone, y compris l\'audio, les photos, les mots de passe et les messages.&lt;br/&gt;&lt;br/&gt;%1$s pourra diffuser des applications jusqu\'à ce que vous retiriez l\'accès à cette autorisation."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Services multiappareils"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> pour diffuser des applications entre vos appareils"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation, au nom de votre <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>, d\'afficher et de diffuser des applications entre vos appareils"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Autorisez &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à ces informations à partir de votre téléphone"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Services Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> pour accéder aux photos, aux fichiers multimédias et aux notifications de votre téléphone"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Autoriser &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; à effectuer cette action?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Autoriser &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; à diffuser les applications et les fonctionnalités du système de votre téléphone?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s aura accès à tout ce qui est visible ou lu sur le téléphone, y compris l\'audio, les photos, les renseignements de paiement, les mots de passe et les messages.&lt;br/&gt;&lt;br/&gt;%1$s pourra diffuser des applications jusqu\'à ce que vous retiriez l\'accès à cette autorisation."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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>, de diffuser des applications et d\'autres fonctionnalités du système sur des appareils à proximité"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Cette application pourra synchroniser des informations, comme le nom de l\'appelant, entre votre téléphone et l\'appareil sélectionné"</string>
diff --git a/packages/CompanionDeviceManager/res/values-fr/strings.xml b/packages/CompanionDeviceManager/res/values-fr/strings.xml
index 0403a4d..a33e0dc2 100644
--- a/packages/CompanionDeviceManager/res/values-fr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-fr/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"appareil"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Cette appli sera autorisée à accéder à ces autorisations sur votre <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à ces informations depuis votre téléphone"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à caster les applications de votre téléphone ?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s aura accès à tout ce qui est visible ou lu sur le téléphone, y compris les contenus audio, les photos, les mots de passe et les messages.&lt;br/&gt;&lt;br/&gt;%1$s pourra caster des applications jusqu\'à ce que vous supprimiez l\'accès à cette autorisation."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Services inter-appareils"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> pour caster des applis d\'un appareil à l\'autre"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> pour afficher et caster des applications d\'un appareil à l\'autre"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Autoriser &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; à accéder à ces informations depuis votre téléphone"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Services Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> pour accéder aux photos, contenus multimédias et notifications de votre téléphone"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Autoriser &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; à effectuer cette action ?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Autoriser &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; à caster les applications et les fonctionnalités système de votre téléphone ?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s aura accès à tout ce qui est visible ou lu sur le téléphone, y compris les contenus audio, les photos, les informations de paiement, les mots de passe et les messages.&lt;br/&gt;&lt;br/&gt;%1$s pourra caster des applications et des fonctionnalités système jusqu\'à ce que vous supprimiez l\'accès à cette autorisation."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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> de diffuser des applis et d\'autres fonctionnalités système en streaming sur des appareils à proximité"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-gl/strings.xml b/packages/CompanionDeviceManager/res/values-gl/strings.xml
index 5d9d7ee..da7d4a2 100644
--- a/packages/CompanionDeviceManager/res/values-gl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-gl/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Esta aplicación poderá acceder a estes permisos do dispositivo (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que a aplicación &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información desde o teu teléfono"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Queres permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; emita as aplicacións do teu teléfono?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s terá acceso a todo o que sexa visible ou se reproduza no teléfono, como audio, fotos, contrasinais e mensaxes.&lt;br/&gt;&lt;br/&gt;%1$s poderá emitir aplicacións ata que quites o acceso a este permiso."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servizos multidispositivo"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nome do teu dispositivo (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) para emitir contido de aplicacións entre os teus aparellos"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nome do teu dispositivo (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) para mostrar e emitir aplicacións noutros dispositivos teus"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acceda a esta información do teu teléfono"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Servizos de Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nome do teu dispositivo (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) para acceder ás fotos, ao contido multimedia e ás notificacións do teléfono"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Queres permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; leve a cabo esta acción?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Queres permitir que &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; emita as aplicacións e as funcións do sistema do teu teléfono?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s terá acceso a todo o que sexa visible ou se reproduza no teléfono, como audio, fotos, información de pago, contrasinais e mensaxes.&lt;br/&gt;&lt;br/&gt;%1$s poderá emitir aplicacións e funcións do sistema ata que quites o acceso a este permiso."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 o contido das aplicacións e doutras funcións do sistema en dispositivos próximos"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-gu/strings.xml b/packages/CompanionDeviceManager/res/values-gu/strings.xml
index e645f18..e34cf9a 100644
--- a/packages/CompanionDeviceManager/res/values-gu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-gu/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"ડિવાઇસ"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"આ ઍપને તમારા <xliff:g id="DEVICE_NAME">%1$s</xliff:g> પર આ પરવાનગીઓ ઍક્સેસ કરવાની મંજૂરી મળશે"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"તમારા ફોનમાંથી આ માહિતી ઍક્સેસ કરવા માટે, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ને મંજૂરી આપો"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"શું &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ને તમારા ફોનની ઍપને સ્ટ્રીમ કરવાની મંજૂરી આપીએ?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$sની પાસે એવી બધી બાબતોનો ઍક્સેસ રહેશે જે ફોન પર જોઈ શકાતી કે ચલાવી શકાતી હોય, જેમાં ઑડિયો, ફોટા, પાસવર્ડ અને મેસેજ શામેલ છે.&lt;br/&gt;&lt;br/&gt;%1$s ત્યાં સુધી ઍપને સ્ટ્રીમ કરી શકશે, જ્યાં સુધી તમે આ પરવાનગીનો ઍક્સેસ કાઢી નહીં નાખો."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ક્રોસ-ડિવાઇસ સેવાઓ"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> તમારા <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> વતી તમારા ડિવાઇસ વચ્ચે ઍપ સ્ટ્રીમ કરવાની પરવાનગીની વિનંતી કરી રહી છે"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"તમારા એક ડિવાઇસ પરથી બીજા ડિવાઇસ પર ઍપને ડિસ્પ્લે તેમજ સ્ટ્રીમ કરવા માટે, <xliff:g id="APP_NAME">%1$s</xliff:g> તમારા <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"તમારા ફોનમાંથી આ માહિતી ઍક્સેસ કરવા માટે, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ને મંજૂરી આપો"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play સેવાઓ"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> તમારા <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> વતી તમારા ફોનના ફોટા, મીડિયા અને નોટિફિકેશન ઍક્સેસ કરવાની પરવાનગીની વિનંતી કરી રહી છે"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;ને આ પગલું ભરવાની મંજૂરી આપીએ?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"શું &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;ને તમારા ફોનની ઍપ અને સિસ્ટમની સુવિધાઓને સ્ટ્રીમ કરવાની મંજૂરી આપીએ?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$sની પાસે એવી બધી બાબતોનો ઍક્સેસ રહેશે જે તમારા ફોન પર જોઈ શકાતી કે ચલાવી શકાતી હોય, જેમાં ઑડિયો, ફોટા, ચુકવણીની માહિતી, પાસવર્ડ અને મેસેજ શામેલ છે.&lt;br/&gt;&lt;br/&gt;%1$s ત્યાં સુધી ઍપ અને સિસ્ટમની સુવિધાઓને સ્ટ્રીમ કરી શકશે, જ્યાં સુધી તમે આ પરવાનગીનો ઍક્સેસ કાઢી નહીં નાખો."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> નજીકના ડિવાઇસ પર ઍપ અને સિસ્ટમની અન્ય સુવિધાઓ સ્ટ્રીમ કરવા તમારા <xliff:g id="DEVICE_NAME">%2$s</xliff:g> વતી પરવાનગીની વિનંતી કરી રહી છે"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ડિવાઇસ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"આ ઍપ તમારા ફોન અને પસંદ કરેલા ડિવાઇસ વચ્ચે, કૉલ કરનાર કોઈ વ્યક્તિનું નામ જેવી માહિતી સિંક કરી શકશે"</string>
diff --git a/packages/CompanionDeviceManager/res/values-hi/strings.xml b/packages/CompanionDeviceManager/res/values-hi/strings.xml
index f524b97..9b55669 100644
--- a/packages/CompanionDeviceManager/res/values-hi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hi/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"डिवाइस"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"यह ऐप्लिकेशन, आपके <xliff:g id="DEVICE_NAME">%1$s</xliff:g> पर इन अनुमतियों को ऐक्सेस कर पाएगा"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; को अपने फ़ोन से यह जानकारी ऐक्सेस करने की अनुमति दें"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; को आपके फ़ोन के ऐप्लिकेशन स्ट्रीम करने की अनुमति देनी है?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s के पास ऐसे कॉन्टेंट का ऐक्सेस होगा जो फ़ोन पर दिख रहा हो या चलाया गया हो. जैसे, ऑडियो, फ़ोटो, पासवर्ड, और मैसेज.&lt;br/&gt;&lt;br/&gt;%1$s तब तक ऐप्लिकेशन स्ट्रीम करेगा, जब तक आप इस अनुमति को हटा न दें."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"क्रॉस-डिवाइस से जुड़ी सेवाएं"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> आपके <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> की ओर से, आपके डिवाइसों के बीच ऐप्लिकेशन स्ट्रीम करने की अनुमति मांग रहा है"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> आपके <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; को अपने फ़ोन से यह जानकारी ऐक्सेस करने की अनुमति दें"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> आपके <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> की ओर से, आपने फ़ोन में मौजूद फ़ोटो, मीडिया, और सूचनाओं को ऐक्सेस करने की अनुमति मांग रहा है"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"क्या &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; को यह कार्रवाई करने की अनुमति देनी है?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; को आपके फ़ोन के ऐप्लिकेशन और सिस्टम की सुविधाएं स्ट्रीम करने की अनुमति देनी है?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s के पास ऐसे कॉन्टेंट का ऐक्सेस होगा जो फ़ोन पर दिख रहा हो या चलाया गया हो. जैसे, ऑडियो, फ़ोटो, पेमेंट से जुड़ी जानकारी, पासवर्ड, और मैसेज.&lt;br/&gt;&lt;br/&gt;%1$s तब तक ऐप्लिकेशन और सिस्टम की सुविधाओं को स्ट्रीम करेगा, जब तक आप इस अनुमति को हटा न दें."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> आपके <xliff:g id="DEVICE_NAME">%2$s</xliff:g> की ओर से, ऐप्लिकेशन और दूसरे सिस्टम की सुविधाओं को आस-पास मौजूद डिवाइसों पर स्ट्रीम करने की अनुमति मांग रहा है"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"डिवाइस"</string>
     <string name="summary_generic" msgid="1761976003668044801">"यह ऐप्लिकेशन, आपके फ़ोन और चुने हुए डिवाइस के बीच जानकारी सिंक करेगा. जैसे, कॉल करने वाले व्यक्ति का नाम"</string>
diff --git a/packages/CompanionDeviceManager/res/values-hr/strings.xml b/packages/CompanionDeviceManager/res/values-hr/strings.xml
index 5ed3eb2..b627998 100644
--- a/packages/CompanionDeviceManager/res/values-hr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hr/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"uređaj"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Aplikacija će moći pristupati ovim dopuštenjima na vašem uređaju <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Omogućite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da pristupa informacijama s vašeg telefona"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Želite li dopustiti aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da streama aplikacije vašeg telefona?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"Aplikacija %1$s imat će pristup svemu što je vidljivo ili se reproducira na telefonu, uključujući zvuk, fotografije, zaporke i poruke.&lt;br/&gt;&lt;br/&gt;Aplikacija %1$s moći će streamati aplikacije dok ne uklonite pristup za to dopuštenje."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usluge na različitim uređajima"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtijeva dopuštenje u ime vašeg uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> za stream aplikacija s jednog uređaja na drugi"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtijeva dopuštenje u ime vašeg uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> za prikaz i streaming aplikacija s jednog uređaja na drugi"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Omogućite aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; da pristupa informacijama s vašeg telefona"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Usluge za Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtijeva dopuštenje u ime vašeg uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> za pristup fotografijama, medijskim sadržajima i obavijestima na telefonu"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Želite li uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; dopustiti da izvrši tu radnju?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Želite li dopustiti uređaju &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; da streama aplikacije i značajke sustava vašeg telefona?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"Aplikacija %1$s imat će pristup svemu što je vidljivo ili se reproducira na telefonu, uključujući zvuk, fotografije, podatke o plaćanju, zaporke i poruke.&lt;br/&gt;&lt;br/&gt;Aplikacija %1$s moći će streamati aplikacije i značajke sustava dok ne uklonite pristup za to dopuštenje."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"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 emitiranje aplikacija i drugih značajki sustava na uređajima u blizini"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-hu/strings.xml b/packages/CompanionDeviceManager/res/values-hu/strings.xml
index 8082bb5..1c9c218 100644
--- a/packages/CompanionDeviceManager/res/values-hu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hu/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"eszköz"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Az alkalmazás hozzáférhet majd ezekhez az engedélyekhez az Ön <xliff:g id="DEVICE_NAME">%1$s</xliff:g> eszközén"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Engedélyezi a(z) „<xliff:g id="APP_NAME">%1$s</xliff:g>” alkalmazás számára az információhoz való hozzáférést a telefonról"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Engedélyezi a(z) &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; számára a telefonja alkalmazásainak streamelését?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"A(z) %1$s hozzáférhet mindenhez, ami a telefonon látható vagy lejátszható, így az audiotartalomhoz, 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) %1$s képes lesz majd az alkalmazások streamelésére."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Többeszközös szolgáltatások"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> engedélyt kér a(z) <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nevében az alkalmazások eszközök közötti streameléséhez"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> engedélyt kér a(z) <xliff:g id="DISPLAY_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>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Engedélyezi a(z) „<xliff:g id="APP_NAME">%1$s</xliff:g>” alkalmazás számára az információhoz való hozzáférést a telefonról"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-szolgáltatások"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> engedélyt kér a(z) <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nevében a telefonon tárolt fotókhoz, médiatartalmakhoz és értesítésekhez való hozzáféréshez"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Engedélyezi a(z) &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; számára ennek a műveletnek a végrehajtását?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Engedélyezi a(z) &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; számára a telefonja alkalmazásainak és rendszerfunkcióinak streamelését?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"A(z) %1$s hozzáférhet mindenhez, ami a telefonon látható vagy lejátszható, így az audiotartalomhoz, 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) %1$s képes lesz majd az alkalmazások és a rendszerfunkciók streamelésére."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"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ók közeli eszközökre történő streamelésére"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-hy/strings.xml b/packages/CompanionDeviceManager/res/values-hy/strings.xml
index fc8adee..c4de3cd 100644
--- a/packages/CompanionDeviceManager/res/values-hy/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-hy/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"սարք"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Այս հավելվածը կստանա հետևյալ թույլտվությունները ձեր <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ում"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Թույլատրեք &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին օգտագործել այս տեղեկությունները ձեր հեռախոսից"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Թույլատրե՞լ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին հեռարձակել ձեր հեռախոսի հավելվածները"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s հավելվածին հասանելի կլինի հեռախոսում ցուցադրվող կամ նվագարկվող բովանդակությունը՝ ներառյալ աուդիոն, լուսանկարները, գաղտնաբառերը և հաղորդագրությունները։&lt;br/&gt;&lt;br/&gt;%1$s հավելվածը կկարողանա հավելվածներ հեռարձակել, քանի դեռ չեք չեղարկել այս թույլտվությունը։"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Միջսարքային ծառայություններ"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> սարքի անունից թույլտվություն է խնդրում՝ ձեր սարքերի միջև հավելվածներ հեռարձակելու համար"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"Թույլատրեք &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին օգտագործել այս տեղեկությունները ձեր հեռախոսից"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play ծառայություններ"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> սարքի անունից թույլտվություն է խնդրում՝ ձեր հեռախոսի լուսանկարները, մեդիաֆայլերն ու ծանուցումները տեսնելու համար"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Թույլատրե՞լ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; հավելվածին կատարել այս գործողությունը"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Թույլատրե՞լ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; սարքին հեռարձակել ձեր հեռախոսի հավելվածները և համակարգի գործառույթները"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s սարքին հասանելի կլինի ձեր հեռախոսում ցուցադրվող կամ նվագարկվող բովանդակությունը՝ ներառյալ աուդիոն, լուսանկարները, վճարային տեղեկությունները, գաղտնաբառերը և հաղորդագրությունները։&lt;br/&gt;&lt;br/&gt;%1$s սարքը կկարողանա հավելվածներ և համակարգի գործառույթներ հեռարձակել, քանի դեռ չեք չեղարկել այս թույլտվությունը։"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DEVICE_NAME">%2$s</xliff:g> սարքի անունից թույլտվություն է խնդրում՝ մոտակա սարքերին հավելվածներ և համակարգի այլ գործառույթներ հեռարձակելու համար"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"սարք"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Այս հավելվածը կկարողանա համաժամացնել ձեր հեռախոսի և ընտրված սարքի տվյալները, օր․՝ զանգողի անունը"</string>
diff --git a/packages/CompanionDeviceManager/res/values-in/strings.xml b/packages/CompanionDeviceManager/res/values-in/strings.xml
index c281455..b1c4f5b 100644
--- a/packages/CompanionDeviceManager/res/values-in/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-in/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"perangkat"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Aplikasi ini akan diizinkan mengakses izin ini di <xliff:g id="DEVICE_NAME">%1$s</xliff:g> Anda"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Izinkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk mengakses informasi ini dari ponsel Anda"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Izinkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; melakukan streaming aplikasi di ponsel Anda?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s akan memiliki akses ke konten apa pun yang ditampilkan atau dimainkan di ponsel, termasuk audio, foto, sandi, dan pesan.&lt;br/&gt;&lt;br/&gt;%1$s akan dapat melakukan streaming aplikasi hingga Anda menghapus izin ini."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Layanan lintas perangkat"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta izin atas nama <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> untuk menstreaming aplikasi di antara perangkat Anda"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> menggantikan <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> meminta izin untuk menampilkan dan melakukan streaming aplikasi di antara perangkat Anda"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Izinkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; mengakses informasi ini dari ponsel Anda"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Layanan Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta izin atas nama <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> untuk mengakses foto, media, dan notifikasi ponsel Anda"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Izinkan &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; melakukan tindakan ini?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Izinkan &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; melakukan streaming aplikasi dan mengakses fitur sistem di ponsel Anda?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s akan memiliki akses ke konten apa pun yang ditampilkan atau dimainkan di ponsel Anda, termasuk audio, foto, info pembayaran, sandi, dan pesan.&lt;br/&gt;&lt;br/&gt;%1$s akan dapat melakukan streaming aplikasi dan mengakses fitur sistem hingga Anda menghapus izin ini."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta izin atas nama <xliff:g id="DEVICE_NAME">%2$s</xliff:g> untuk menstreaming aplikasi dan fitur sistem lainnya ke perangkat di sekitar"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-is/strings.xml b/packages/CompanionDeviceManager/res/values-is/strings.xml
index 42ca7da..befc55c 100644
--- a/packages/CompanionDeviceManager/res/values-is/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-is/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"tæki"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Þetta forrit fær aðgang að eftirfarandi heimildum í <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Veita &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aðgang að þessum upplýsingum úr símanum þínum"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Leyfa &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; að streyma forritum símans?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s fær aðgang að öllu sem er sýnilegt eða spilað í símanum, þ.m.t. hljóði, myndum, aðgangsorðum og skilaboðum.&lt;br/&gt;&lt;br/&gt;%1$s getur streymt forritum þar til þú fjarlægir aðgang að þessari heimild."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Þjónustur á milli tækja"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> biður um heimild fyrir <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> til að streyma forritum á milli tækjanna þinna"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> biður um heimild fyrir <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> til að birta og streyma forritum á milli tækjanna þinna"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Veita &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aðgang að þessum upplýsingum úr símanum þínum"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Þjónusta Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> sendir beiðni um aðgang að myndum, margmiðlunarefni og tilkynningum símans þíns fyrir hönd <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Leyfa &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; að framkvæma þessa aðgerð?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Leyfa &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; að streyma forritum og kerfiseiginleikum símans?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s fær aðgang að öllu sem er sýnilegt eða spilað í símanum, þ.m.t. hljóði, myndum, greiðsluupplýsingum, aðgangsorðum og skilaboðum.&lt;br/&gt;&lt;br/&gt;%1$s getur streymt forritum og kerfiseiginleikum þar til þú fjarlægir aðgang að þessari heimild."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 í nálægum tækjum"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-it/strings.xml b/packages/CompanionDeviceManager/res/values-it/strings.xml
index 06d58b6..40d3be5 100644
--- a/packages/CompanionDeviceManager/res/values-it/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-it/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Questa app potrà accedere alle seguenti autorizzazioni su <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Consenti a &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; di accedere a queste informazioni dal tuo telefono"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Consentire a &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; di riprodurre in streaming le app del tuo smartphone?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s avrà accesso a tutto ciò che è visibile o riprodotto sullo smartphone, inclusi audio, foto, password e messaggi.&lt;br/&gt;&lt;br/&gt;%1$s sarà in grado di riprodurre in streaming le app finché non rimuoverai l\'accesso a questa autorizzazione."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servizi cross-device"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede per conto del tuo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> l\'autorizzazione a trasmettere app in streaming tra i dispositivi"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede per conto del tuo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> l\'autorizzazione a visualizzare e riprodurre in streaming app tra i dispositivi"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Consenti a &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; di accedere a questa informazione dal tuo telefono"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede per conto del tuo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> l\'autorizzazione ad accedere a foto, contenuti multimediali e notifiche del telefono"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vuoi consentire a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; di compiere questa azione?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Consentire a &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; di riprodurre in streaming app e funzionalità di sistema del tuo smartphone?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s avrà accesso a tutto ciò che è visibile o riprodotto sullo smartphone, inclusi audio, foto, dati di pagamento, password e messaggi.&lt;br/&gt;&lt;br/&gt;%1$s sarà in grado di riprodurre in streaming app e funzionalità di sistema finché non rimuoverai l\'accesso a questa autorizzazione."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 trasmettere in streaming app e altre funzionalità di sistema ai dispositivi nelle vicinanze"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-iw/strings.xml b/packages/CompanionDeviceManager/res/values-iw/strings.xml
index 49d1f9e..f1eb5347 100644
--- a/packages/CompanionDeviceManager/res/values-iw/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-iw/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"מכשיר"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"האפליקציה הזו תוכל לגשת להרשאות האלה ב<xliff:g id="DEVICE_NAME">%1$s</xliff:g> שלך"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"‏מתן אישור לאפליקציה &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; לגשת למידע הזה מהטלפון שלך"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"‏לאשר לאפליקציית &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; לשדר את האפליקציות של הטלפון?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"‏ל-%1$s תהיה גישה לכל מה שרואים או מפעילים בטלפון, כולל אודיו, תמונות, סיסמאות והודעות.&lt;br/&gt;&lt;br/&gt;‎‏ל-%1$s תהיה אפשרות לשדר אפליקציות עד שהגישה להרשאה הזו תוסר."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"שירותים למספר מכשירים"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה עבור המכשיר <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> כדי לשדר אפליקציות בין המכשירים שלך"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה למכשיר <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"‏מתן אישור לאפליקציה &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; לגשת למידע הזה מהטלפון שלך"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה עבור המכשיר <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> כדי לגשת לתמונות, למדיה ולהתראות בטלפון שלך"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"‏לתת הרשאה למכשיר &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; לבצע את הפעולה הזו?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"‏לאשר לאפליקציית &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; לשדר את האפליקציות ואת תכונות המערכת של הטלפון?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"‏ל-%1$s תהיה גישה לכל מה שרואים או מפעילים בטלפון, כולל אודיו, תמונות, פרטי תשלום, סיסמאות והודעות.&lt;br/&gt;&lt;br/&gt;‎‏ל-%1$s תהיה אפשרות לשדר אפליקציות ותכונות מערכת עד שהגישה להרשאה הזו תוסר."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה עבור <xliff:g id="DEVICE_NAME">%2$s</xliff:g> כדי להעביר אפליקציות ותכונות מערכת אחרות בסטרימינג למכשירים בקרבת מקום"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"מכשיר"</string>
     <string name="summary_generic" msgid="1761976003668044801">"האפליקציה הזו תוכל לסנכרן מידע, כמו השם של מישהו שמתקשר, מהטלפון שלך למכשיר שבחרת"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ka/strings.xml b/packages/CompanionDeviceManager/res/values-ka/strings.xml
index 3ad80ba..ced2802 100644
--- a/packages/CompanionDeviceManager/res/values-ka/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ka/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"მოწყობილობა"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"ეს აპი შეძლებს ამ ნებართვებზე წვდომას თქვენს <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ში"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"ნება დართეთ, რომ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; აპს ჰქონდეს ამ ინფორმაციაზე წვდომა თქვენი ტელეფონიდან"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"გსურთ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-ს მისცეთ ტელეფონის აპების სტრიმინგის საშუალება?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s-ს ექნება წვდომა ყველაფერზე, რაც ჩანს ან უკრავს ტელეფონზე, მათ შორის, აუდიოზე, ფოტოებზე, პაროლებსა და შეტყობინებებზე.&lt;br/&gt;&lt;br/&gt;%1$s შეძლებს აპების გაშვებას მანამ, სანამ თქვენ არ გააუქმებთ წვდომას ამ ნებართვაზე."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"მოწყობილობათშორისი სერვისები"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს უფლებას თქვენი <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-ის სახელით, რომ მოწყობილობებს შორის სტრიმინგი შეძლოს"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს ნებართვას თქვენი (<xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"ნება დართეთ, რომ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; აპს ჰქონდეს ამ ინფორმაციაზე წვდომა თქვენი ტელეფონიდან"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს უფლებას თქვენი <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-ის სახელით, რომ წვდომა ჰქონდეს თქვენი ტელეფონის ფოტოებზე, მედიასა და შეტყობინებებზე"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"გსურთ ნება მისცეთ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ს&lt;/strong&gt; ამ მოქმედების შესასრულებლად?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"გსურთ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;-ს მისცეთ თქვენი ტელეფონის აპებისა და სისტემის ფუნქციების სტრიმინგის საშუალება?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s-ს ექნება წვდომა ყველაფერზე, რაც ჩანს ან უკრავს ტელეფონზე, მათ შორის, აუდიოზე, ფოტოებზე, გადახდის ინფორმაციაზე, პაროლებსა და შეტყობინებებზე.&lt;br/&gt;&lt;br/&gt;%1$s შეძლებს აპებისა და სისტემის ფუნქციების გაშვებას მანამ, სანამ თქვენ არ გააუქმებთ წვდომას ამ ნებართვაზე."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს თქვენი <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-ის სახელით აპების და სისტემის სხვა ფუნქციების ახლომახლო მოწყობილობებზე სტრიმინგის ნებართვას"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"მოწყობილობა"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ეს აპი შეძლებს ინფორმაციის სინქრონიზებას თქვენს ტელეფონსა და თქვენ მიერ არჩეულ მოწყობილობას შორის, მაგალითად, იმ ადამიანის სახელის, რომელიც გირეკავთ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-kk/strings.xml b/packages/CompanionDeviceManager/res/values-kk/strings.xml
index 4e4986e..b981bf4 100644
--- a/packages/CompanionDeviceManager/res/values-kk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kk/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"құрылғы"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Бұл қолданба <xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысында осы рұқсаттарды пайдалана алады."</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына телефоныңыздағы осы ақпаратты пайдалануға рұқсат беріңіз."</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына телефондағы қолданбаларды трансляциялауға рұқсат берілсін бе?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s телефонда көрінетін не ойнатылатын кез келген контентті (аудиофайлдарды, фотосуреттерді, құпия сөздер мен хабарларды қоса алғанда) пайдалана алады.&lt;br/&gt;&lt;br/&gt;Өзіңіз осы рұқсатты өшірмесеңіз, %1$s қолданбаларды трансляциялай алады."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Аралық құрылғы қызметтері"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> атынан құрылғылар арасында қолданбалар трансляциялау үшін рұқсат сұрайды."</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; қолданбасына телефоныңыздағы осы ақпаратты пайдалануға рұқсат беріңіз."</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play қызметтері"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> атынан телефондағы фотосуреттерді, медиафайлдар мен хабарландыруларды пайдалану үшін рұқсат сұрайды."</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; құрылғысына бұл әрекетті орындауға рұқсат беру керек пе?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; құрылғысына телефондағы қолданбаларды және жүйе функцияларын трансляциялауға рұқсат берілсін бе?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s телефонда көрінетін не ойнатылатын кез келген контентті (аудиофайлдарды, фотосуреттерді, төлем туралы ақпаратты, құпия сөздер мен хабарларды қоса алғанда) пайдалана алады.&lt;br/&gt;&lt;br/&gt;Өзіңіз осы рұқсатты өшірмесеңіз, %1$s қолданбалар мен жүйе функцияларын трансляциялай алады."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DEVICE_NAME">%2$s</xliff:g> атынан қолданбалар мен басқа да жүйе функцияларын маңайдағы құрылғыларға трансляциялау рұқсатын сұрап тұр."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"құрылғы"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Бұл қолданба телефон мен таңдалған құрылғы арасында деректі (мысалы, қоңырау шалушының атын) синхрондай алады."</string>
diff --git a/packages/CompanionDeviceManager/res/values-km/strings.xml b/packages/CompanionDeviceManager/res/values-km/strings.xml
index 4646e11..41cdf95 100644
--- a/packages/CompanionDeviceManager/res/values-km/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-km/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"ឧបករណ៍"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"កម្មវិធីនេះ​នឹងត្រូវបានអនុញ្ញាតឱ្យ​ចូលប្រើប្រាស់ការអនុញ្ញាតទាំងនេះ​នៅលើ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> របស់អ្នក"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ចូលប្រើព័ត៌មាននេះពីទូរសព្ទរបស់អ្នក"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ផ្សាយកម្មវិធីលើទូរសព្ទរបស់អ្នកឬ?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s នឹងមានសិទ្ធិចូលប្រើអ្វីៗដែលអាចមើលឃើញ ឬត្រូវបានចាក់នៅលើទូរសព្ទ រួមទាំងសំឡេង រូបថត ពាក្យសម្ងាត់ និងសារ។&lt;br/&gt;&lt;br/&gt;%1$s នឹងអាចផ្សាយកម្មវិធី រហូតទាល់តែអ្នកដកសិទ្ធិចូលប្រើការអនុញ្ញាតនេះចេញ។"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"សេវាកម្មឆ្លងកាត់ឧបករណ៍"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> របស់អ្នក ដើម្បីបញ្ចាំងកម្មវិធីរវាងឧបករណ៍របស់អ្នក"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ចូលមើលព័ត៌មាននេះពីទូរសព្ទរបស់អ្នក"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"សេវាកម្ម Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> របស់អ្នក ដើម្បីចូលប្រើរូបថត មេឌៀ និងការជូនដំណឹងរបស់ទូរសព្ទអ្នក"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ធ្វើសកម្មភាពនេះឬ?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"អនុញ្ញាតឱ្យ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ផ្សាយមុខងារប្រព័ន្ធ និងកម្មវិធីលើទូរសព្ទរបស់អ្នកឬ?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s នឹងមានសិទ្ធិចូលប្រើអ្វីៗដែលអាចមើលឃើញ ឬត្រូវបានចាក់នៅលើទូរសព្ទរបស់អ្នក រួមទាំងសំឡេង រូបថត ព័ត៌មាននៃការទូទាត់ប្រាក់ ពាក្យសម្ងាត់ និងសារ។&lt;br/&gt;&lt;br/&gt;%1$s នឹងអាចផ្សាយកម្មវិធី និងមុខងារប្រព័ន្ធ រហូតទាល់តែអ្នកដកសិទ្ធិចូលប្រើការអនុញ្ញាតនេះចេញ។"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំ​ការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> របស់អ្នក ដើម្បីចាក់ផ្សាយកម្មវិធី និងមុខងារប្រព័ន្ធផ្សេងទៀត​ទៅកាន់​ឧបករណ៍នៅជិត"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ឧបករណ៍"</string>
     <string name="summary_generic" msgid="1761976003668044801">"កម្មវិធីនេះនឹងអាច​ធ្វើសមកាលកម្មព័ត៌មាន ដូចជាឈ្មោះមនុស្សដែលហៅទូរសព្ទជាដើម​ រវាងឧបករណ៍ដែលបានជ្រើសរើស និងទូរសព្ទរបស់អ្នក"</string>
diff --git a/packages/CompanionDeviceManager/res/values-kn/strings.xml b/packages/CompanionDeviceManager/res/values-kn/strings.xml
index 4f2bdd2..7aace82 100644
--- a/packages/CompanionDeviceManager/res/values-kn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-kn/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"ಸಾಧನ"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"ನಿಮ್ಮ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ನಲ್ಲಿ ಈ ಅನುಮತಿಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಅನುಮತಿಸಲಾಗುತ್ತದೆ"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"ನಿಮ್ಮ ಫೋನ್ ಮೂಲಕ ಈ ಮಾಹಿತಿಯನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿನ ಆ್ಯಪ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"ಆಡಿಯೋ, ಫೋಟೋಗಳು, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಸಂದೇಶಗಳು ಸೇರಿದಂತೆ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಗೋಚರಿಸುವ ಅಥವಾ ಪ್ಲೇ ಆಗುವ ಯಾವುದೇ ಕಂಟೆಂಟ್‌ಗೆ %1$s ಆ್ಯಕ್ಸೆಸ್ ಹೊಂದಿರುತ್ತದೆ.&lt;br/&gt;&lt;br/&gt;ನೀವು ಈ ಅನುಮತಿಗೆ ಇರುವ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ತೆಗೆದುಹಾಕುವವರೆಗೆ %1$s ಗೆ ಆ್ಯಪ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ಕ್ರಾಸ್-ಡಿವೈಸ್ ಸೇವೆಗಳು"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"ನಿಮ್ಮ ಸಾಧನಗಳ ನಡುವೆ ಆ್ಯಪ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ನ ಪರವಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಿಕೊಳ್ಳುತ್ತಿದೆ"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"ನಿಮ್ಮ ಸಾಧನಗಳ ನಡುವೆ ಆ್ಯಪ್‌ಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲು ಮತ್ತು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ಪರವಾಗಿ <xliff:g id="APP_NAME">%1$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="4693714143506569253">"ನಿಮ್ಮ ಫೋನ್ ಮೂಲಕ ಈ ಮಾಹಿತಿಯನ್ನು ಪ್ರವೇಶಿಸಲು &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ಗೆ ಅನುಮತಿಸಿ"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play ಸೇವೆಗಳು"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"ನಿಮ್ಮ ಫೋನ್‌ನ ಫೋಟೋಗಳು, ಮೀಡಿಯಾ ಮತ್ತು ಅಧಿಸೂಚನೆಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ನ ಪರವಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಿಕೊಳ್ಳುತ್ತಿದೆ"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ಈ ಆ್ಯಕ್ಷನ್ ಅನ್ನು ತೆಗೆದುಕೊಳ್ಳಲು &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ಅನುಮತಿಸಬೇಕೇ?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿನ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಸಿಸ್ಟಮ್ ಫೀಚರ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"ಆಡಿಯೋ, ಫೋಟೋಗಳು, ಪಾವತಿ ಮಾಹಿತಿ, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಸಂದೇಶಗಳು ಸೇರಿದಂತೆ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಗೋಚರಿಸುವ ಅಥವಾ ಪ್ಲೇ ಆಗುವ ಯಾವುದೇ ಕಂಟೆಂಟ್‌ಗೆ.&lt;br/&gt;&lt;br/&gt;ನೀವು ಈ ಅನುಮತಿಗೆ ಇರುವ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ತೆಗೆದುಹಾಕುವವರೆಗೆ %1$s ಗೆ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಸಿಸ್ಟಮ್ ಫೀಚರ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"ಸಮೀಪದಲ್ಲಿರುವ ಸಾಧನಗಳಿಗೆ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಇತರ ಸಿಸ್ಟಂ ಫೀಚರ್‌ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ರ ಪರವಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸುತ್ತಿದೆ"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ಸಾಧನ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ಮೊಬೈಲ್ ಫೋನ್ ಮತ್ತು ಆಯ್ಕೆಮಾಡಿದ ಸಾಧನದ ನಡುವೆ, ಕರೆ ಮಾಡುವವರ ಹೆಸರಿನಂತಹ ಮಾಹಿತಿಯನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಈ ಆ್ಯಪ್‌ಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ko/strings.xml b/packages/CompanionDeviceManager/res/values-ko/strings.xml
index 9aa49d5..86679ac 100644
--- a/packages/CompanionDeviceManager/res/values-ko/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ko/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"기기"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"앱이 <xliff:g id="DEVICE_NAME">%1$s</xliff:g>에서 이러한 권한에 액세스할 수 있게 됩니다."</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;이 휴대전화의 이 정보에 액세스하도록 허용합니다."</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;에서 휴대전화의 앱을 스트리밍하도록 허용하시겠습니까?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s에서 오디오, 사진, 비밀번호, 메시지 등 휴대전화에 표시되거나 휴대전화에서 재생되는 모든 항목에 액세스할 수 있습니다.&lt;br/&gt;&lt;br/&gt;이 권한에 대한 액세스를 삭제할 때까지 %1$s에서 앱을 스트리밍할 수 있습니다."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"교차 기기 서비스"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 대신 기기 간에 앱을 스트리밍할 수 있는 권한을 요청하고 있습니다."</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;이 휴대전화에서 이 정보에 액세스하도록 허용"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play 서비스"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 대신 휴대전화의 사진, 미디어, 알림에 액세스할 수 있는 권한을 요청하고 있습니다."</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; 기기가 이 작업을 수행하도록 허용하시겠습니까?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;에서 휴대전화의 앱 및 시스템 기능을 스트리밍하도록 허용하시겠습니까?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s에서 오디오, 사진, 결제 정보, 비밀번호, 메시지 등 휴대전화에 표시되거나 휴대전화에서 재생되는 모든 항목에 액세스할 수 있습니다.&lt;br/&gt;&lt;br/&gt;이 권한에 대한 액세스를 삭제할 때까지 %1$s에서 앱 및 시스템 기능을 스트리밍할 수 있습니다."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DEVICE_NAME">%2$s</xliff:g> 대신 근처 기기로 앱 및 기타 시스템 기능을 스트리밍할 권한을 요청하고 있습니다."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"기기"</string>
     <string name="summary_generic" msgid="1761976003668044801">"이 앱에서 휴대전화와 선택한 기기 간에 정보(예: 발신자 이름)를 동기화할 수 있게 됩니다."</string>
diff --git a/packages/CompanionDeviceManager/res/values-ky/strings.xml b/packages/CompanionDeviceManager/res/values-ky/strings.xml
index bb1e1aa..932b5c5 100644
--- a/packages/CompanionDeviceManager/res/values-ky/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ky/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"түзмөк"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Бул колдонмого <xliff:g id="DEVICE_NAME">%1$s</xliff:g> түзмөгүңүздө төмөнкүлөрдү аткарууга уруксат берилет"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна телефонуңуздагы ушул маалыматты көрүүгө уруксат бериңиз"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна телефонуңуздагы колдонмолорду алып ойнотууга уруксат бересизби?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s телефондо көрүнгөн же ойнотулган бардык нерселерге, анын ичинде аудио, сүрөттөр, сырсөздөр жана билдирүүлөргө кире алат. Бул уруксатты алып салмайынча, &lt;br/&gt;&lt;br/&gt;%1$s колдонмолорду алып ойното алат."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Түзмөктөр аралык кызматтар"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> түзмөгүңүздүн атынан түзмөктөрүңүздүн ортосунда колдонмолорду алып ойнотууга уруксат сурап жатат"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосу <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна телефонуңуздагы ушул маалыматты көрүүгө уруксат бериңиз"</string>
@@ -41,16 +38,14 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play кызматтары"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосу <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> түзмөгүңүздүн атынан телефондогу сүрөттөрдү, медиа файлдарды жана билдирмелерди колдонууга уруксат сурап жатат"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; түзмөгүнө бул аракетти аткарууга уруксат бересизби?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; колдонмосуна телефонуңуздагы колдонмолорду жана тутумдун функцияларын алып ойнотууга уруксат бересизби?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s телефонуңузда көрүнгөн же ойнотулган бардык нерселерге, анын ичинде аудио, сүрөттөр, төлөм маалыматы, сырсөздөр жана билдирүүлөргө кире алат. Бул уруксатты алып салмайынча, &lt;br/&gt;&lt;br/&gt;%1$s колдонмолорду жана тутум функцияларын алып ойното алат."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%2$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>
     <string name="consent_no" msgid="2640796915611404382">"Уруксат берилбесин"</string>
-    <string name="consent_cancel" msgid="5655005528379285841">"Жокко чыгаруу"</string>
+    <string name="consent_cancel" msgid="5655005528379285841">"Жок"</string>
     <string name="consent_back" msgid="2560683030046918882">"Артка"</string>
     <string name="permission_expand" msgid="893185038020887411">"<xliff:g id="PERMISSION_TYPE">%1$s</xliff:g> жайып көрсөтүү"</string>
     <string name="permission_collapse" msgid="3320833884220844084">"<xliff:g id="PERMISSION_TYPE">%1$s</xliff:g> жыйыштыруу"</string>
diff --git a/packages/CompanionDeviceManager/res/values-lo/strings.xml b/packages/CompanionDeviceManager/res/values-lo/strings.xml
index 9a45460..4a97f0d 100644
--- a/packages/CompanionDeviceManager/res/values-lo/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lo/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"ອຸປະກອນ"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"ແອັບນີ້ຈະໄດ້ຮັບສິດເຂົ້າເຖິງການອະນຸຍາດເຫຼົ່ານີ້ຢູ່ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ຂອງທ່ານ"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"ອະນຸຍາດ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ໃຫ້ເຂົ້າເຖິງຂໍ້ມູນນີ້ຈາກໂທລະສັບຂອງທ່ານໄດ້"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"ອະນຸຍາດໃຫ້ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ສະ​ຕ​ຣີມແອັບຂອງໂທລະສັບຂອງທ່ານບໍ?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s ຈະມີສິດເຂົ້າເຖິງທຸກຢ່າງທີ່ເຫັນໄດ້ ຫຼື ຫຼິ້ນຢູ່ໂທລະສັບ, ຮວມທັງສຽງ, ຮູບພາບ, ລະຫັດຜ່ານ ແລະ ຂໍ້ຄວາມ.&lt;br/&gt;&lt;br/&gt;%1$s ຈະສາມາດສະ​ຕ​ຣີມແອັບໄດ້ຈົນກວ່າທ່ານຈະລຶບສິດເຂົ້າເຖິງການອະນຸຍາດນີ້ອອກ."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ບໍລິການຂ້າມອຸປະກອນ"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມຂອງ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ເພື່ອສະຕຣີມແອັບລະຫວ່າງອຸປະກອນຕ່າງໆຂອງທ່ານ"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກໍາລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມຂອງ <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"ອະນຸຍາດ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ໃຫ້ເຂົ້າເຖິງຂໍ້ມູນນີ້ຈາກໂທລະສັບຂອງທ່ານໄດ້"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"ບໍລິການ Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມຂອງ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ເພື່ອເຂົ້າເຖິງຮູບພາບ, ສື່ ແລະ ການແຈ້ງເຕືອນໃນໂທລະສັບຂອງທ່ານ"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ອະນຸຍາດ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ເພື່ອດຳເນີນຄຳສັ່ງນີ້ບໍ?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"ອະນຸຍາດໃຫ້ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ສະ​ຕ​ຣີມແອັບຂອງໂທລະສັບ ແລະ ຄຸນສົມບັດລະບົບຂອງທ່ານບໍ?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s ຈະມີສິດເຂົ້າເຖິງທຸກຢ່າງທີ່ເບິ່ງເຫັນ ຫຼື ຫຼິ້ນຢູ່ໂທລະສັບຂອງທ່ານ, ຮວມທັງສຽງ, ຮູບພາບ, ຂໍ້ມູນການຈ່າຍເງິນ, ລະຫັດຜ່ານ ແລະ ຂໍ້ຄວາມ.&lt;br/&gt;&lt;br/&gt;%1$s ຈະສາມາດສະ​ຕ​ຣີມແອັບ ແລະ ຄຸນສົມບັດຂອງລະບົບຈົນກວ່າທ່ານຈະລຶບສິດເຂົ້າເຖິງການອະນຸຍາດນີ້ອອກ."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກໍາລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ຂອງທ່ານເພື່ອສະຕຣີມແອັບ ແລະ ຄຸນສົມບັດລະບົບອື່ນໆໄປຫາອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງ"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ອຸປະກອນ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ແອັບນີ້ຈະສາມາດຊິ້ງຂໍ້ມູນ ເຊັ່ນ: ຊື່ຂອງຄົນທີ່ໂທເຂົ້າ, ລະຫວ່າງໂທລະສັບຂອງທ່ານ ແລະ ອຸປະກອນທີ່ເລືອກໄວ້ໄດ້"</string>
diff --git a/packages/CompanionDeviceManager/res/values-lt/strings.xml b/packages/CompanionDeviceManager/res/values-lt/strings.xml
index 58a9db9..e931353 100644
--- a/packages/CompanionDeviceManager/res/values-lt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lt/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"įrenginio"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Šiai programai bus leidžiama pasiekti toliau nurodytus <xliff:g id="DEVICE_NAME">%1$s</xliff:g> leidimus."</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Leisti &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pasiekti šią informaciją iš jūsų telefono"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Leisti programai &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; srautu perduoti telefono programas?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"„%1$s“ galės pasiekti visą telefone matomą ar leidžiamą turinį, įskaitant garso įrašus, nuotraukas, slaptažodžius ir pranešimus.&lt;br/&gt;&lt;br/&gt;„%1$s“ galės perduoti srautu programas, kol pašalinsite prieigą prie šio leidimo."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Pasl. keliuose įrenginiuose"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo leidimo jūsų „<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>“ vardu, kad galėtų srautu perduoti programas iš vieno įrenginio į kitą"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo leidimo jūsų „<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>“ vardu, kad galėtų rodyti ir srautu perduoti programas iš vieno įrenginio į kitą"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Leisti &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; pasiekti šią informaciją iš jūsų telefono"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"„Google Play“ paslaugos"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo leidimo jūsų „<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>“ vardu, kad galėtų pasiekti telefono nuotraukas, mediją ir pranešimus"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Leisti &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; atlikti šį veiksmą?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Leisti programai &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; srautu perduoti telefono programas ir sistemos funkcijas?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"„%1$s“ galės pasiekti visą telefone 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;„%1$s“ galės perduoti srautu programas ir sistemos funkcijas, kol pašalinsite prieigą prie šio leidimo."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"„<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 įrenginiams netoliese"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-lv/strings.xml b/packages/CompanionDeviceManager/res/values-lv/strings.xml
index 36908e4..20282b3 100644
--- a/packages/CompanionDeviceManager/res/values-lv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-lv/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"ierīce"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Šai lietotnei tiks sniegta piekļuve norādītajām atļaujām jūsu ierīcē (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)."</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"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 tālruņa"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Vai atļaut lietotnei &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; straumēt jūsu tālruņa lietotnes?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s varēs piekļūt visam saturam, kas ir redzams vai tiek atskaņots jūsu tālrunī, tostarp audio, fotoattēliem, parolēm un ziņojumiem.&lt;br/&gt;&lt;br/&gt;%1$s varēs straumēt lietotnes, līdz noņemsiet tās piekļuvi šai atļaujai."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Vairāku ierīču pakalpojumi"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju straumēt lietotnes starp jūsu ierīcēm šīs ierīces vārdā: <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>."</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju rādīt un straumēt lietotnes starp jūsu ierīcēm šīs ierīces vārdā: <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"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 tālruņa"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play pakalpojumi"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju piekļūt jūsu tālruņa fotoattēliem, multivides saturam un paziņojumiem šīs ierīces vārdā: <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>."</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vai atļaut ierīcei &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; veikt šo darbību?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Vai atļaut ierīcei &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; straumēt jūsu tālruņa lietotnes un sistēmas funkcijas?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s varēs piekļūt visam saturam, kas ir redzams vai tiek atskaņots jūsu tālrunī, tostarp audio, fotoattēliem, maksājumu informācijai, parolēm un ziņojumiem.&lt;br/&gt;&lt;br/&gt;%1$s varēs straumēt lietotnes un sistēmas funkcijas, līdz noņemsiet tās piekļuvi šai atļaujai."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju tuvumā esošās ierīcēs straumēt lietotnes un citas sistēmas funkcijas šīs ierīces vārdā: <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-mk/strings.xml b/packages/CompanionDeviceManager/res/values-mk/strings.xml
index b361ae2..2d7c2d3 100644
--- a/packages/CompanionDeviceManager/res/values-mk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mk/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"уред"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Апликацијава ќе може да пристапува до овие дозволи на <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Овозможете &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да пристапува до овие податоци на телефонот"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Да се дозволи &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да ги стримува апликациите од вашиот телефон?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s ќе има пристап до сè што е видливо или репродуцирано на телефонот, вклучувајќи ги и аудиото, фотографиите, лозинките и пораките.&lt;br/&gt;&lt;br/&gt;%1$s ќе може да стримува апликации додека не ја повлечете дозволава."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Повеќенаменски услуги"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> за да стримува апликации помеѓу вашите уреди"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"Дозволете &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; да пристапува до овие податоци на телефонот"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Услуги на Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> за да пристапува до фотографиите, аудиовизуелните содржини и известувањата на телефонот"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ќе дозволите &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; да го преземе ова дејство?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Да се дозволи &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; да ги стримува апликациите и системските функции од вашиот телефон?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s ќе има пристап до сè што е видливо или репродуцирано на телефонот, вклучувајќи ги и аудиото, фотографиите, податоците за плаќање, лозинките и пораките.&lt;br/&gt;&lt;br/&gt;%1$s ќе може да стримува апликации и системски функции додека не ја повлечете дозволава."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DEVICE_NAME">%2$s</xliff:g> за да стримува апликации и други системски функции на уредите во близина"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"уред"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Оваа апликација ќе може да ги синхронизира податоците како што се имињата на јавувачите помеѓу вашиот телефон и избраниот уред"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ml/strings.xml b/packages/CompanionDeviceManager/res/values-ml/strings.xml
index 485dc98..b1934af 100644
--- a/packages/CompanionDeviceManager/res/values-ml/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ml/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"ഉപകരണം"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"നിങ്ങളുടെ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> എന്നതിൽ ഇനിപ്പറയുന്ന അനുമതികൾ ആക്സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കും"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"നിങ്ങളുടെ ഫോണിൽ നിന്ന് ഈ വിവരങ്ങൾ ആക്‌സസ് ചെയ്യാൻ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"നിങ്ങളുടെ ഫോണിലെ ആപ്പുകൾ സ്ട്രീം ചെയ്യാൻ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; എന്നതിനെ അനുവദിക്കണോ?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"ഓഡിയോ, ഫോട്ടോകൾ, പാസ്‌വേഡുകൾ, സന്ദേശങ്ങൾ എന്നിവ ഉൾപ്പെടെ ഫോണിൽ ദൃശ്യമാകുന്നതോ പ്ലേ ചെയ്യുന്നതോ ആയ എല്ലാത്തിലേക്കും %1$s-ന് ആക്‌സസ് ഉണ്ടായിരിക്കും.&lt;br/&gt;&lt;br/&gt;നിങ്ങൾ ഈ അനുമതിയിലേക്കുള്ള ആക്സസ് നീക്കം ചെയ്യുന്നത് വരെ %1$s-ന് ആപ്പുകൾ സ്ട്രീം ചെയ്യാനാകും."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ക്രോസ്-ഉപകരണ സേവനങ്ങൾ"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"നിങ്ങളുടെ ഉപകരണങ്ങളിൽ ഒന്നിൽ നിന്ന് അടുത്തതിലേക്ക് ആപ്പുകൾ സ്ട്രീം ചെയ്യാൻ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> എന്ന ഉപകരണത്തിന് വേണ്ടി <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നത് അനുമതി അഭ്യർത്ഥിക്കുന്നു"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"നിങ്ങളുടെ ഉപകരണങ്ങൾക്കിടയിൽ ആപ്പുകൾ സ്ട്രീം ചെയ്യാനും പ്രദർശിപ്പിക്കാനും നിങ്ങളുടെ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> എന്ന ഉപകരണത്തിന് വേണ്ടി <xliff:g id="APP_NAME">%1$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="4693714143506569253">"നിങ്ങളുടെ ഫോണിൽ നിന്ന് ഈ വിവരങ്ങൾ ആക്‌സസ് ചെയ്യാൻ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ആപ്പിനെ അനുവദിക്കുക"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play സേവനങ്ങൾ"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"നിങ്ങളുടെ ഫോണിലെ ഫോട്ടോകൾ, മീഡിയ, അറിയിപ്പുകൾ എന്നിവ ആക്സസ് ചെയ്യാൻ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> എന്ന ഉപകരണത്തിന് വേണ്ടി <xliff:g id="APP_NAME">%1$s</xliff:g> അനുമതി അഭ്യർത്ഥിക്കുന്നു"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ഈ പ്രവർത്തനം നടത്താൻ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; എന്നതിനെ അനുവദിക്കണോ?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"നിങ്ങളുടെ ഫോണിലെ ആപ്പുകളും സിസ്റ്റം ഫീച്ചറുകളെയും സ്ട്രീം ചെയ്യാൻ, &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; എന്നതിനെ അനുവദിക്കണോ?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"ഓഡിയോ, ഫോട്ടോകൾ, പേയ്മെന്റ് വിവരങ്ങൾ, പാസ്‌വേഡുകൾ, സന്ദേശങ്ങൾ എന്നിവ ഉൾപ്പെടെ ഫോണിൽ ദൃശ്യമാകുന്നതോ പ്ലേ ചെയ്യുന്നതോ ആയ എല്ലാത്തിലേക്കും %1$s-ന് ആക്‌സസ് ഉണ്ടായിരിക്കും.&lt;br/&gt;&lt;br/&gt;നിങ്ങൾ ഈ അനുമതിയിലേക്കുള്ള ആക്സസ് നീക്കം ചെയ്യുന്നത് വരെ %1$s-ന് ആപ്പുകളും സിസ്റ്റം ഫീച്ചറുകളും സ്ട്രീം ചെയ്യാനാകും."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"സമീപമുള്ള ഉപകരണങ്ങളിൽ ആപ്പുകളും മറ്റ് സിസ്റ്റം ഫീച്ചറുകളും സ്ട്രീം ചെയ്യാൻ നിങ്ങളുടെ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> എന്നതിന് വേണ്ടി <xliff:g id="APP_NAME">%1$s</xliff:g> അനുമതി അഭ്യർത്ഥിക്കുന്നു"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ഉപകരണം"</string>
     <string name="summary_generic" msgid="1761976003668044801">"വിളിക്കുന്നയാളുടെ പേര് പോലുള്ള വിവരങ്ങൾ നിങ്ങളുടെ ഫോണിനും തിരഞ്ഞെടുത്ത ഉപകരണത്തിനും ഇടയിൽ സമന്വയിപ്പിക്കുന്നതിന് ഈ ആപ്പിന് കഴിയും"</string>
diff --git a/packages/CompanionDeviceManager/res/values-mn/strings.xml b/packages/CompanionDeviceManager/res/values-mn/strings.xml
index 13d52d6b..fe6e4cc 100644
--- a/packages/CompanionDeviceManager/res/values-mn/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mn/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"төхөөрөмж"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Энэ апп таны <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-н эдгээр зөвшөөрөлд хандах эрхтэй байх болно"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-д таны утаснаас энэ мэдээлэлд хандахыг зөвшөөрнө үү"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Таны утасны аппуудыг дамжуулахыг &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-д&lt;/strong&gt; зөвшөөрөх үү?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s аудио, зураг, нууц үг болон мессежүүдийг оруулаад утсан дээр харагдсан эсвэх тоглуулсан аливаа зүйлд хандах эрхтэй болно.&lt;br/&gt;&lt;br/&gt;%1$s таныг энэ зөвшөөрлийг хасах хүртэл аппуудыг дамжуулах боломжтой байх болно."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Төхөөрөмж хоорондын үйлчилгээ"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Таны төхөөрөмжүүд хооронд апп дамжуулахын тулд <xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-н өмнөөс зөвшөөрөл хүсэж байна"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;-д таны утаснаас энэ мэдээлэлд хандахыг зөвшөөрнө үү"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play үйлчилгээ"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Таны утасны зураг, медиа болон мэдэгдэлд хандахын тулд <xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-н өмнөөс зөвшөөрөл хүсэж байна"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;-д энэ үйлдлийг хийхийг зөвшөөрөх үү?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Таны утасны апп болон системийн онцлогуудыг дамжуулахыг &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-д&lt;/strong&gt; зөвшөөрөх үү?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s аудио, зураг, төлбөрийн мэдээлэл, нууц үг болон мессежүүдийг оруулаад утсан дээр харагдсан эсвэх тоглуулсан аливаа зүйлд хандах эрхтэй болно.&lt;br/&gt;&lt;br/&gt;%1$s таныг энэ зөвшөөрлийг хасах хүртэл апп болон системийн онцлогуудыг дамжуулах боломжтой байх болно."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-н өмнөөс аппууд болон системийн бусад онцлогийг ойролцоох төхөөрөмжүүд рүү дамжуулах зөвшөөрөл хүсэж байна"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"төхөөрөмж"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Энэ апп залгаж буй хүний нэр зэрэг мэдээллийг таны утас болон сонгосон төхөөрөмжийн хооронд синк хийх боломжтой болно"</string>
diff --git a/packages/CompanionDeviceManager/res/values-mr/strings.xml b/packages/CompanionDeviceManager/res/values-mr/strings.xml
index 7f77303..52a7a55 100644
--- a/packages/CompanionDeviceManager/res/values-mr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-mr/strings.xml
@@ -26,14 +26,13 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"डिव्हाइस"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"या अ‍ॅपला तुमच्या <xliff:g id="DEVICE_NAME">%1$s</xliff:g> वर या परवानग्या अ‍ॅक्सेस करण्याची अनुमती असेल"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ला ही माहिती तुमच्या फोनवरून अ‍ॅक्सेस करण्यासाठी अनुमती द्या"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ला तुमच्या फोनची अ‍ॅप्स स्ट्रीम करण्याची अनुमती द्यायची आहे का?"</string>
+    <!-- String.format failed for translation -->
     <!-- no translation found for summary_app_streaming (295548145144086753) -->
     <skip />
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"क्रॉस-डिव्हाइस सेवा"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"तुमच्या डिव्हाइसदरम्यान ॲप्स स्ट्रीम करण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> हे तुमच्या <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> च्या वतीने परवानगीची विनंती करत आहे"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"तुमच्या डिव्हाइसदरम्यान ॲप्स दाखवण्यासाठी आणि स्ट्रीम करण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> हे तुमच्या <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ला ही माहिती तुमच्या फोनवरून अ‍ॅक्सेस करण्यासाठी अनुमती द्या"</string>
@@ -41,8 +40,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play सेवा"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"तुमच्या फोनमधील फोटो, मीडिया आणि सूचना ॲक्सेस करण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> हे तुमच्या <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> च्या वतीने परवानगीची विनंती करत आहे"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ला ही कृती करण्याची अनुमती द्यायची आहे का?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ला तुमच्या फोनची अ‍ॅप्स आणि सिस्टीमची वैशिष्ट्ये स्ट्रीम करण्याची अनुमती द्यायची आहे का?"</string>
+    <!-- String.format failed for translation -->
     <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
     <skip />
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे जवळपासच्या डिव्हाइसवर अ‍ॅप्स आणि इतर सिस्टीम वैशिष्‍ट्ये स्ट्रीम करण्यासाठी तुमच्या <xliff:g id="DEVICE_NAME">%2$s</xliff:g> च्या वतीने परवानगीची विनंती करा"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ms/strings.xml b/packages/CompanionDeviceManager/res/values-ms/strings.xml
index 66f8caf4..21132a9 100644
--- a/packages/CompanionDeviceManager/res/values-ms/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ms/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"peranti"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Apl ini akan dibenarkan untuk mengakses kebenaran yang berikut pada <xliff:g id="DEVICE_NAME">%1$s</xliff:g> anda"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; mengakses maklumat ini daripada telefon anda"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk menstrim apl telefon anda?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s akan mendapat akses kepada semua perkara yang dipaparkan atau dimainkan pada telefon termasuk audio, foto, kata laluan dan mesej.&lt;br/&gt;&lt;br/&gt;%1$s akan dapat menstrim apl sehingga anda mengalih keluar akses kepada kebenaran ini."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Perkhidmatan silang peranti"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang meminta kebenaran bagi pihak <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> anda untuk menstrim apl antara peranti anda"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta kebenaran bagi pihak <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> anda untuk memaparkan dan menstrim apl antara peranti anda"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Benarkan &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk mengakses maklumat ini daripada telefon anda"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Perkhidmatan Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang meminta kebenaran bagi pihak <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> anda untuk mengakses foto, media dan pemberitahuan telefon anda"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Benarkan &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; mengambil tindakan ini?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Benarkan &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; untuk menstrim apl dan ciri sistem telefon anda?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s akan mendapat akses kepada semua perkara yang dipaparkan atau dimainkan pada telefon anda termasuk audio, foto, maklumat pembayaran, kata laluan dan mesej.&lt;br/&gt;&lt;br/&gt;%1$s akan dapat menstrim apl dan ciri sistem sehingga anda mengalih keluar akses kepada kebenaran ini."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 yang lain pada peranti berdekatan"</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>
diff --git a/packages/CompanionDeviceManager/res/values-my/strings.xml b/packages/CompanionDeviceManager/res/values-my/strings.xml
index 2192efa..12242b9 100644
--- a/packages/CompanionDeviceManager/res/values-my/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-my/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"စက်"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"သင့် <xliff:g id="DEVICE_NAME">%1$s</xliff:g> တွင် ၎င်းခွင့်ပြုချက်များရယူရန် ဤအက်ပ်ကိုခွင့်ပြုမည်"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ကို သင့်ဖုန်းမှ ဤအချက်အလက် သုံးခွင့်ပြုမည်"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ကို သင့်ဖုန်း၏ အက်ပ်များ တိုက်ရိုက်ဖွင့်ခွင့်ပြုမလား။"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s သည် အသံ၊ ဓာတ်ပုံ၊ စကားဝှက်၊ မက်ဆေ့ဂျ် အပါအဝင် ဖုန်းတွင် မြင်နိုင်သော (သို့) ဖွင့်ထားသော အရာအားလုံးကို သုံးခွင့်ရှိပါမည်။&lt;br/&gt;&lt;br/&gt;ဤခွင့်ပြုချက်သုံးခွင့်ကို သင်မဖယ်ရှားမချင်း %1$s သည် အက်ပ်များကို တိုက်ရိုက်ဖွင့်နိုင်ပါမည်။"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"စက်များကြားသုံး ဝန်ဆောင်မှုများ"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင်၏စက်များအကြား အက်ပ်များတိုက်ရိုက်လွှင့်ရန် <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ကိုယ်စား ခွင့်ပြုချက်တောင်းနေသည်"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင့်စက်များအကြား အက်ပ်များ ပြပြီး တိုက်ရိုက်ဖွင့်ရန် <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; အား သင့်ဖုန်းမှ ဤအချက်အလက် သုံးခွင့်ပြုခြင်း"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play ဝန်ဆောင်မှုများ"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင့်ဖုန်း၏ ဓာတ်ပုံ၊ မီဒီယာနှင့် အကြောင်းကြားချက်များသုံးရန် <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ကိုယ်စား ခွင့်ပြုချက်တောင်းနေသည်"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ကို ဤသို့လုပ်ဆောင်ခွင့်ပြုမလား။"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ကို သင့်ဖုန်း၏ အက်ပ်နှင့် စနစ်အင်္ဂါရပ်များ တိုက်ရိုက်ဖွင့်ခွင့်ပြုမလား။"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s သည် အသံ၊ ဓာတ်ပုံ၊ ငွေချေအချက်အလက်၊ စကားဝှက်နှင့် မက်ဆေ့ဂျ်များ အပါအဝင် ဖုန်းတွင် မြင်နိုင်သော (သို့) ဖွင့်ထားသော အရာအားလုံးကို သုံးခွင့်ရှိပါမည်။&lt;br/&gt;&lt;br/&gt;ဤခွင့်ပြုချက်သုံးခွင့်ကို သင်မဖယ်ရှားမချင်း %1$s သည် အက်ပ်နှင့် စနစ်အင်္ဂါရပ်များကို တိုက်ရိုက်ဖွင့်နိုင်ပါမည်။"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် အနီးတစ်ဝိုက်ရှိ အက်ပ်များနှင့် အခြားစနစ်အင်္ဂါရပ်များကို တိုက်ရိုက်ဖွင့်ရန် သင့် <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ကိုယ်စား ခွင့်ပြုချက်တောင်းနေသည်"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"စက်"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ဤအက်ပ်သည် သင့်ဖုန်းနှင့် ရွေးထားသောစက်အကြား ခေါ်ဆိုသူ၏အမည်ကဲ့သို့ အချက်အလက်ကို စင့်ခ်လုပ်နိုင်ပါမည်"</string>
diff --git a/packages/CompanionDeviceManager/res/values-nb/strings.xml b/packages/CompanionDeviceManager/res/values-nb/strings.xml
index 2ad0f32..d817df2 100644
--- a/packages/CompanionDeviceManager/res/values-nb/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nb/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"enheten"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Denne appen får disse tillatelsene på <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Gi &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tilgang til denne informasjonen fra telefonen din"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Vil du tillate at &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; strømmer appene på telefonen?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s får tilgang til alt som er synlig eller spilles av på telefonen, inkludert lyd, bilder, passord og meldinger.&lt;br/&gt;&lt;br/&gt;%1$s kan strømme apper til du fjerner denne tillatelsen."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Tjenester på flere enheter"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tillatelse til å strømme apper mellom enhetene dine, på vegne av <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<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="DISPLAY_NAME">%2$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="4693714143506569253">"Gi &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; tilgang til denne informasjonen fra telefonen din"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-tjenester"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tillatelse til å få tilgang til bilder, medier og varsler på telefonen din, på vegne av <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vil du la &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; gjøre dette?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Vil du tillate at &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; strømmer appene og systemfunksjonene på telefonen."</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s får tilgang til alt som er synlig eller spilles av på telefonen, inkludert lyd, bilder, betalingsopplysninger, passord og meldinger.&lt;br/&gt;&lt;br/&gt;%1$s kan strømme apper og systemfunksjoner til du fjerner denne tillatelsen."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tillatelse på vegne av <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til å strømme apper og andre systemfunksjoner til enheter i nærheten"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-ne/strings.xml b/packages/CompanionDeviceManager/res/values-ne/strings.xml
index 0d5cad8..fc28789 100644
--- a/packages/CompanionDeviceManager/res/values-ne/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ne/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"डिभाइस"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"तपाईंको <xliff:g id="DEVICE_NAME">%1$s</xliff:g> मा यो एपलाई निम्न अनुमति दिइने छ:"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई तपाईंको फोनमा भएको यो जानकारी हेर्ने तथा प्रयोग गर्ने अनुमति दिनुहोस्"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई तपाईंको फोनमा भएका एपहरू स्ट्रिम गर्न दिने हो?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s ले तपाईंको फोनमा देखिने वा प्ले गरिने अडियो, फोटो, पासवर्ड र म्यासेजलगायतका सबै कुरा प्रयोग गर्न सक्ने छ।&lt;br/&gt;&lt;br/&gt;तपाईंले यो अनुमति रद्द नगरेसम्म %1$s ले एपहरू स्ट्रिम गर्न पाइराख्ने छ।"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"क्रस-डिभाइस सेवाहरू"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> को तर्फबाट तपाईंका कुनै एउटा डिभाइसबाट अर्को डिभाइसमा एप स्ट्रिम गर्ने अनुमति माग्दै छ"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई तपाईंको फोनमा भएको यो जानकारी हेर्ने तथा प्रयोग गर्ने अनुमति दिनुहोस्"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> को तर्फबाट तपाईंको फोनमा भएका फोटो, मिडिया र सूचनाहरू हेर्ने तथा प्रयोग गर्ने अनुमति माग्दै छ"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई यो कार्य गर्ने अनुमति दिने हो?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; लाई तपाईंको फोनमा भएका एप तथा सिस्टमका सुविधाहरू स्ट्रिम गर्न दिने हो?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s ले तपाईंको फोनमा देखिने वा प्ले गरिने अडियो, फोटो, भुक्तानीसम्बन्धी जानकारी, पासवर्ड र म्यासेजलगायतका सबै कुरा प्रयोग गर्न सक्ने छ।&lt;br/&gt;&lt;br/&gt;तपाईंले यो अनुमति रद्द नगरेसम्म %1$s ले एप तथा सिस्टमका सुविधाहरू स्ट्रिम गर्न पाइराख्ने छ।"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DEVICE_NAME">%2$s</xliff:g> को तर्फबाट नजिकैका डिभाइसहरूमा एप र सिस्टमका अन्य सुविधाहरू स्ट्रिम गर्ने अनुमति माग्दै छ"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"यन्त्र"</string>
     <string name="summary_generic" msgid="1761976003668044801">"यो एपले तपाईंको फोन र तपाईंले छनौट गर्ने डिभाइसका बिचमा कल गर्ने व्यक्तिको नाम जस्ता जानकारी सिंक गर्न सक्ने छ।"</string>
diff --git a/packages/CompanionDeviceManager/res/values-nl/strings.xml b/packages/CompanionDeviceManager/res/values-nl/strings.xml
index b2c2818..4b17c7d 100644
--- a/packages/CompanionDeviceManager/res/values-nl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-nl/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"apparaat"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Deze app krijgt toegang tot deze rechten op je <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang geven tot deze informatie op je telefoon"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toestaan de apps van je telefoon te streamen?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s heeft toegang tot alles wat zichtbaar is of wordt afgespeeld op de telefoon, waaronder audio, foto\'s, wachtwoorden en berichten.&lt;br/&gt;&lt;br/&gt;%1$s kan apps streamen totdat je dit recht verwijdert."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device-services"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens jouw <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> toestemming om apps te streamen tussen je apparaten"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens jouw <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> toestemming om apps tussen je apparaten weer te geven en te streamen"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; toegang geven tot deze informatie op je telefoon"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens jouw <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> toegang tot de foto\'s, media en meldingen van je telefoon"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Toestaan dat &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; deze actie uitvoert?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; toestaan de apps en systeemfuncties van je telefoon te streamen?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s heeft toegang tot alles wat zichtbaar is of wordt afgespeeld op je telefoon, waaronder audio, foto\'s, betalingsgegevens, wachtwoorden en berichten.&lt;br/&gt;&lt;br/&gt;%1$s kan apps en systeemfuncties streamen totdat je dit recht verwijdert."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens je <xliff:g id="DEVICE_NAME">%2$s</xliff:g> toestemming om apps en andere systeemfuncties naar apparaten in de buurt te streamen"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-or/strings.xml b/packages/CompanionDeviceManager/res/values-or/strings.xml
index d5e9d85..c134cf1 100644
--- a/packages/CompanionDeviceManager/res/values-or/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-or/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"ଡିଭାଇସ"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"ଆପଣଙ୍କ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ରେ ଏହି ଅନୁମତିଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଆଯିବ"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"ଆପଣଙ୍କ ଫୋନରୁ ଏହି ସୂଚନାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"ଆପଣଙ୍କ ଫୋନର ଆପ୍ସକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"ଅଡିଓ, ଫଟୋ, ପାସୱାର୍ଡ ଏବଂ ମେସେଜ ସମେତ ଫୋନରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ %1$sର ଆକ୍ସେସ ରହିବ।&lt;br/&gt;&lt;br/&gt;ଆପଣ ଏହି ଅନୁମତିକୁ ଆକ୍ସେସ କାଢ଼ି ନଦେବା ପର୍ଯ୍ୟନ୍ତ %1$s ଆପ୍ସକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ ସକ୍ଷମ ହେବ।"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"କ୍ରସ-ଡିଭାଇସ ସେବାଗୁଡ଼ିକ"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"ଆପଣଙ୍କ ଡିଭାଇସଗୁଡ଼ିକ ମଧ୍ୟରେ ଆପ୍ସକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କର <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ତରଫରୁ ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରୁଛି"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"ଆପଣଙ୍କ ଡିଭାଇସଗୁଡ଼ିକ ମଧ୍ୟରେ ଆପ୍ସକୁ ଡିସପ୍ଲେ ଏବଂ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କର <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"ଆପଣଙ୍କ ଫୋନରୁ ଏହି ସୂଚନାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play ସେବାଗୁଡ଼ିକ"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"ଆପଣଙ୍କ ଫୋନର ଫଟୋ, ମିଡିଆ ଏବଂ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କର <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ତରଫରୁ ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରୁଛି"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ଏହି ପଦକ୍ଷେପ ନେବା ପାଇଁ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦେବେ?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"ଆପଣଙ୍କ ଫୋନର ଆପ୍ସ ଏବଂ ସିଷ୍ଟମ ଫିଚରଗୁଡ଼ିକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;କୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"ଅଡିଓ, ଫଟୋ, ପେମେଣ୍ଟ ସୂଚନା, ପାସୱାର୍ଡ ଏବଂ ମେସେଜ ସମେତ ଆପଣଙ୍କ ଫୋନରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ %1$sର ଆକ୍ସେସ ରହିବ।&lt;br/&gt;&lt;br/&gt;ଆପଣ ଏହି ଅନୁମତିକୁ ଆକ୍ସେସ କାଢ଼ି ନଦେବା ପର୍ଯ୍ୟନ୍ତ %1$s ଆପ୍ସ ଏବଂ ସିଷ୍ଟମ ଫିଚରଗୁଡ଼ିକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ ସକ୍ଷମ ହେବ।"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"ଆଖପାଖର ଡିଭାଇସଗୁଡ଼ିକରେ ଆପ୍ସ ଏବଂ ଅନ୍ୟ ସିଷ୍ଟମ ଫିଚରଗୁଡ଼ିକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ତରଫରୁ ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରୁଛି"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ଡିଭାଇସ୍"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ଆପଣଙ୍କ ଫୋନ ଏବଂ ବଛାଯାଇଥିବା ଡିଭାଇସ ମଧ୍ୟରେ, କଲ କରୁଥିବା ଯେ କୌଣସି ବ୍ୟକ୍ତିଙ୍କ ନାମ ପରି ସୂଚନା ସିଙ୍କ କରିବାକୁ ଏହି ଆପ ସକ୍ଷମ ହେବ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-pa/strings.xml b/packages/CompanionDeviceManager/res/values-pa/strings.xml
index 8a89f06..8394a82 100644
--- a/packages/CompanionDeviceManager/res/values-pa/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pa/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"ਡੀਵਾਈਸ"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"ਇਸ ਐਪ ਨੂੰ ਤੁਹਾਡੇ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> \'ਤੇ ਇਨ੍ਹਾਂ ਇਜਾਜ਼ਤਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਹੋਵੇਗੀ"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਤੋਂ ਇਸ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"ਕੀ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s ਕੋਲ ਆਡੀਓ, ਫ਼ੋਟੋਆਂ, ਪਾਸਵਰਡਾਂ ਅਤੇ ਸੁਨੇਹਿਆਂ ਸਮੇਤ, ਫ਼ੋਨ \'ਤੇ ਦਿਖਾਈ ਦੇਣ ਵਾਲੀ ਜਾਂ ਚਲਾਈ ਜਾਣ ਵਾਲੀ ਕਿਸੇ ਵੀ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੋਵੇਗੀ।&lt;br/&gt;&lt;br/&gt;%1$s ਐਪਾਂ ਨੂੰ ਉਦੋਂ ਤੱਕ ਸਟ੍ਰੀਮ ਕਰ ਸਕੇਗੀ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਇਸ ਇਜਾਜ਼ਤ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਹਟਾ ਦਿੰਦੇ।"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"ਕ੍ਰਾਸ-ਡੀਵਾਈਸ ਸੇਵਾਵਾਂ"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸਾਂ ਵਿਚਕਾਰ ਐਪਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਤੋਂ ਇਸ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play ਸੇਵਾਵਾਂ"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੀਆਂ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਸੂਚਨਾਵਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ਕੀ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਇਹ ਕਾਰਵਾਈ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"ਕੀ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰਨ ਅਤੇ ਸਿਸਟਮ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s ਕੋਲ ਆਡੀਓ, ਫ਼ੋਟੋਆਂ, ਭੁਗਤਾਨ ਜਾਣਕਾਰੀ, ਪਾਸਵਰਡਾਂ ਅਤੇ ਸੁਨੇਹਿਆਂ ਸਮੇਤ, ਫ਼ੋਨ \'ਤੇ ਦਿਖਾਈ ਦੇਣ ਵਾਲੀ ਜਾਂ ਚਲਾਈ ਜਾਣ ਵਾਲੀ ਕਿਸੇ ਵੀ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੋਵੇਗੀ।&lt;br/&gt;&lt;br/&gt;%1$s ਐਪਾਂ ਨੂੰ ਉਦੋਂ ਤੱਕ ਸਟ੍ਰੀਮ ਅਤੇ ਸਿਸਟਮ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕੇਗੀ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਇਸ ਇਜਾਜ਼ਤ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਹਟਾ ਦਿੰਦੇ।"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਨਜ਼ਦੀਕੀ ਡੀਵਾਈਸਾਂ \'ਤੇ ਐਪਾਂ ਅਤੇ ਹੋਰ ਸਿਸਟਮ ਸੰਬੰਧੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"ਡੀਵਾਈਸ"</string>
     <string name="summary_generic" msgid="1761976003668044801">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਫ਼ੋਨ ਅਤੇ ਚੁਣੇ ਗਏ ਡੀਵਾਈਸ ਵਿਚਕਾਰ ਕਾਲਰ ਦੇ ਨਾਮ ਵਰਗੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਿੰਕ ਕਰ ਸਕੇਗੀ"</string>
diff --git a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
index 41029b1..289d6e0 100644
--- a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"O app poderá acessar estas permissões no seu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse estas informações do smartphone"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; faça streaming dos apps do smartphone?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"O app %1$s terá acesso a tudo o que estiver visível ou for aberto no smartphone, incluindo áudios, fotos, senhas e mensagens. O app &lt;br/&gt;&lt;br/&gt;%1$s poderá fazer o streaming de apps até que você remova o acesso a essa permissão."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serviços entre dispositivos"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para fazer streaming de apps entre seus dispositivos"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para mostrar e fazer streaming de apps entre seus dispositivos"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Autorizar que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse estas informações do smartphone"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para acessar fotos, mídia e notificações do smartphone"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permitir que o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; realize esta ação?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Permitir que o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; faça streaming dos apps e recursos do sistema do smartphone?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"O app %1$s terá acesso a tudo o que estiver visível ou for aberto no smartphone, incluindo áudios, fotos, informações de pagamento, senhas e mensagens. O app &lt;br/&gt;&lt;br/&gt;%1$s poderá fazer o streaming de apps e recursos do sistema até que você remova o acesso a essa permissão."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer streaming de apps e de outros recursos do sistema para dispositivos por perto"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
index 60a625c..9d94de7 100644
--- a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Esta app vai poder aceder a estas autorizações no seu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"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 telemóvel"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"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 telemóvel?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s vai ter acesso a tudo o que seja visível ou reproduzido no telemóvel, incluindo áudio, fotos, palavras-passe e mensagens.&lt;br/&gt;&lt;br/&gt;%1$s vai poder fazer stream de apps até remover o acesso a esta autorização."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serviços entre dispositivos"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para fazer stream de apps entre os seus dispositivos"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para apresentar e fazer stream de apps entre os seus dispositivos"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Permita que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; aceda a estas informações do seu telemóvel"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Serviços do Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para aceder às fotos, ao conteúdo multimédia e às notificações do seu telemóvel"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permitir que o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; faça esta ação?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Permitir que o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; faça stream das apps e das funcionalidades do sistema do telemóvel?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s vai ter acesso a tudo o que seja visível ou reproduzido no telemóvel, incluindo áudio, fotos, informações de pagamento, palavras-passe e mensagens.&lt;br/&gt;&lt;br/&gt;%1$s vai poder fazer stream de apps e funcionalidades do sistema até remover o acesso a esta autorização."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer stream de apps e outras funcionalidades do sistema para dispositivos próximos"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-pt/strings.xml b/packages/CompanionDeviceManager/res/values-pt/strings.xml
index 41029b1..289d6e0 100644
--- a/packages/CompanionDeviceManager/res/values-pt/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-pt/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"O app poderá acessar estas permissões no seu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que o app &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse estas informações do smartphone"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Permitir que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; faça streaming dos apps do smartphone?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"O app %1$s terá acesso a tudo o que estiver visível ou for aberto no smartphone, incluindo áudios, fotos, senhas e mensagens. O app &lt;br/&gt;&lt;br/&gt;%1$s poderá fazer o streaming de apps até que você remova o acesso a essa permissão."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serviços entre dispositivos"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para fazer streaming de apps entre seus dispositivos"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para mostrar e fazer streaming de apps entre seus dispositivos"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Autorizar que &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; acesse estas informações do smartphone"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Services"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para acessar fotos, mídia e notificações do smartphone"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permitir que o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; realize esta ação?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Permitir que o dispositivo &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; faça streaming dos apps e recursos do sistema do smartphone?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"O app %1$s terá acesso a tudo o que estiver visível ou for aberto no smartphone, incluindo áudios, fotos, informações de pagamento, senhas e mensagens. O app &lt;br/&gt;&lt;br/&gt;%1$s poderá fazer o streaming de apps e recursos do sistema até que você remova o acesso a essa permissão."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer streaming de apps e de outros recursos do sistema para dispositivos por perto"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-ro/strings.xml b/packages/CompanionDeviceManager/res/values-ro/strings.xml
index 70fc090..99067df 100644
--- a/packages/CompanionDeviceManager/res/values-ro/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ro/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"dispozitiv"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Aplicația va putea să acceseze următoarele permisiuni pe <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Permite ca &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; să acceseze aceste informații de pe telefon"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Permiți ca &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; să poată reda în stream aplicațiile de pe telefonul tău?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s va avea acces la tot ce este vizibil sau redat pe telefon, inclusiv conținutul audio, fotografii, parole și mesaje.&lt;br/&gt;&lt;br/&gt;%1$s va putea reda în stream aplicații până când elimini accesul la această permisiune."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servicii pe mai multe dispozitive"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită permisiunea pentru <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> de a reda în stream aplicații între dispozitivele tale"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită permisiunea pentru <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> de a afișa și a reda în stream aplicații între dispozitive"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Permite ca &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; să acceseze aceste informații de pe telefon"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Servicii Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită permisiunea pentru <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> de a accesa fotografiile, conținutul media și notificările de pe telefon"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permiți ca &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; să realizeze această acțiune?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Permiți ca &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; să poată reda în stream aplicațiile și funcțiile de sistem de pe telefonul tău?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s va avea acces la tot ce este vizibil sau redat pe telefon, inclusiv conținutul audio, fotografii, informații de plată, parole și mesaje.&lt;br/&gt;&lt;br/&gt;%1$s va putea reda în stream aplicații și funcții de sistem până când elimini accesul la această permisiune."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 conținut din aplicații și alte funcții de sistem pe dispozitivele din apropiere"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-ru/strings.xml b/packages/CompanionDeviceManager/res/values-ru/strings.xml
index 2072f90..ce65c70 100644
--- a/packages/CompanionDeviceManager/res/values-ru/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ru/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"устройстве"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Это приложение получит указанные разрешения на <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Разрешите приложению &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; получать эту информацию с вашего телефона"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Разрешить приложению &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; транслировать приложения с вашего телефона?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"Приложение \"%1$s\" получит доступ ко всему, что показывается или воспроизводится на телефоне, включая аудиофайлы, фотографии, пароли и сообщения.&lt;br/&gt;&lt;br/&gt;Приложение \"%1$s\" сможет транслировать приложения, пока вы не отзовете это разрешение."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Сервисы стриминга приложений"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запрашивает разрешение от имени вашего устройства <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>, чтобы транслировать приложения между устройствами."</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запрашивает разрешение от имени вашего устройства <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"Разрешите приложению &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; получать эту информацию с вашего телефона"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Сервисы Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запрашивает разрешение от имени вашего устройства <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>, чтобы получить доступ к фотографиям, медиаконтенту и уведомлениям на телефоне."</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Разрешить приложению &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; выполнять это действие?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Разрешить приложению &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; транслировать приложения и системные функции с вашего телефона?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"Приложение \"%1$s\" получит доступ ко всему, что показывается или воспроизводится на вашем телефоне, включая аудиофайлы, фотографии, платежные данные, пароли и сообщения.&lt;br/&gt;&lt;br/&gt;Приложение \"%1$s\" сможет транслировать приложения и системные функции, пока вы не отзовете это разрешение."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" от имени вашего устройства \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" запрашивает разрешение транслировать приложения и системные функции на устройства поблизости."</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Приложение сможет синхронизировать информацию между телефоном и выбранным устройством, например данные из журнала звонков."</string>
diff --git a/packages/CompanionDeviceManager/res/values-si/strings.xml b/packages/CompanionDeviceManager/res/values-si/strings.xml
index 6d25260..c1d79e5 100644
--- a/packages/CompanionDeviceManager/res/values-si/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-si/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"උපාංගය"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"මෙම යෙදුමට ඔබේ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> මත මෙම අවසර වෙත ප්‍රවේශ වීමට ඉඩ දෙනු ලැබේ"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; හට ඔබගේ දුරකථනයෙන් මෙම තොරතුරුවලට ප්‍රවේශ වීමට ඉඩ දෙන්න"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"ඔබේ දුරකථනයේ යෙදුම් ප්‍රවාහ කිරීමට &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; හා ඉඩ දෙන්න ද?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"ශ්‍රව්‍ය, ඡායාරූප, මුරපද සහ පණිවිඩ ඇතුළු දුරකථනය මත දැකිය හැකි හෝ වාදනය කර ඇති ඕනෑම දෙයකට %1$s හට ප්‍රවේශය තිබෙනු ඇත. ඔබ මෙම අවසරය වෙත ප්‍රවේශය ඉවත් කරන තෙක් &lt;br/&gt;&lt;br/&gt;%1$s හට යෙදුම් ප්‍රවාහ කිරීමට හැකි වෙනු ඇත."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"හරස්-උපාංග සේවා"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> වෙනුවෙන් ඔබේ උපාංග අතර යෙදුම් ප්‍රවාහ කිරීමට අවසරය ඉල්ලමින් සිටියි"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"ඔබේ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> වෙනුවෙන් <xliff:g id="APP_NAME">%1$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="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; හට ඔබගේ දුරකථනයෙන් මෙම තොරතුරුවලට ප්‍රවේශ වීමට ඉඩ දෙන්න"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play සේවා"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> වෙනුවෙන් ඔබේ දුරකථනයේ ඡායාරූප, මාධ්‍ය, සහ දැනුම්දීම් වෙත ප්‍රවේශ වීමට අවසරය ඉල්ලමින් සිටියි"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"මෙම ක්‍රියාව කිරීමට &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; හට ඉඩ දෙන්න ද?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"ඔබේ දුරකථනයේ යෙදුම් සහ පද්ධති විශේෂාංග ප්‍රවාහ කිරීමට &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; හට ඉඩ දෙන්න ද?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"ශ්‍රව්‍ය, ඡායාරූප, ගෙවීම් තතු, මුරපද සහ පණිවිඩ ඇතුළු දුරකථනය මත දැකිය හැකි හෝ වාදනය කර ඇති ඕනෑම දෙයකට %1$s හට ප්‍රවේශය තිබෙනු ඇත. ඔබ මෙම අවසරය වෙත ප්‍රවේශය ඉවත් කරන තෙක් &lt;br/&gt;&lt;br/&gt;%1$s හට යෙදුම් සහ පද්ධති විශේෂාංග ප්‍රවාහ කිරීමට හැකි වෙනු ඇත."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> වෙනුවෙන් යෙදුම් සහ අනෙකුත් පද්ධති විශේෂාංග අවට උපාංග වෙත ප්‍රවාහ කිරීමට අවසර ඉල්ලයි"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"උපාංගය"</string>
     <string name="summary_generic" msgid="1761976003668044801">"මෙම යෙදුමට ඔබේ දුරකථනය සහ තෝරා ගත් උපාංගය අතර, අමතන කෙනෙකුගේ නම වැනි, තතු සමමුහුර්ත කිරීමට හැකි වනු ඇත"</string>
diff --git a/packages/CompanionDeviceManager/res/values-sk/strings.xml b/packages/CompanionDeviceManager/res/values-sk/strings.xml
index b165331..bbee596 100644
--- a/packages/CompanionDeviceManager/res/values-sk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sk/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"zariadenie"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Táto aplikácia bude mať prístup k týmto povoleniam v zariadení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"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 z vášho telefónu"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Chcete povoliť aplikácii &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; streamovať aplikácie vo svojom telefóne?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s bude mať prístup k všetkému obsahu viditeľnému alebo prehrávanému v telefóne vrátane zvuku, fotiek, hesiel a správ.&lt;br/&gt;&lt;br/&gt;%1$s bude môcť streamovať aplikácie, kým prístup k tomuto povoleniu neodstránite."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Služby pre viacero zariadení"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje pre zariadenie <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> povolenie streamovať aplikácie medzi vašimi zariadeniami."</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje pre zariadenie <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> povolenie zobrazovať a streamovať aplikácie medzi zariadeniami"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"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 z vášho telefónu"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Služby Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje pre zariadenie <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> povolenie na prístup k fotkám, médiám a upozorneniam vášho telefónu"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Chcete povoliť zariadeniu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; vykonať túto akciu?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Chcete povoliť aplikácii &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; streamovať aplikácie a systémové funkcie vo svojom telefóne?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s bude mať prístup k všetkému obsahu viditeľnému alebo prehrávanému v telefóne vrátane zvuku, fotiek, platobných údajov, hesiel a správ.&lt;br/&gt;&lt;br/&gt;%1$s bude môcť streamovať aplikácie, kým prístup k tomuto povoleniu neodstránite."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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 systémové funkcie do zariadení v okolí"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-sl/strings.xml b/packages/CompanionDeviceManager/res/values-sl/strings.xml
index 6972fb4..346fbae 100644
--- a/packages/CompanionDeviceManager/res/values-sl/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sl/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"naprava"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Ta aplikacija bo lahko dostopala do teh dovoljenj v napravi »<xliff:g id="DEVICE_NAME">%1$s</xliff:g>«."</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Dovolite, da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dostopa do teh podatkov v vašem telefonu"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Ali aplikaciji &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dovolite, da pretočno predvaja aplikacije telefona?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"Aplikacija %1$s bo imela dostop do vsega, kar je prikazano ali se predvaja v telefonu, vključno z zvokom, fotografijami, gesli in sporočili.&lt;br/&gt;&lt;br/&gt;Aplikacija %1$s bo lahko pretočno predvajala aplikacije, dokler ne odstranite dostopa do tega dovoljenja."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Storitve za zunanje naprave"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave »<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>« zahteva dovoljenje za pretočno predvajanje aplikacij v vaših napravah."</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave »<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>« zahteva dovoljenje za prikaz in pretočno predvajanje aplikacij v vaših napravah."</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Dovolite, da &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; dostopa do teh podatkov v vašem telefonu"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Storitve Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave »<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>« zahteva dovoljenje za dostop do fotografij, predstavnosti in obvestil v telefonu."</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ali napravi &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; dovolite izvedbo tega dejanja?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Ali napravi &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; dovolite, da pretočno predvaja aplikacije in sistemske funkcije telefona?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"Naprava %1$s bo imela dostop do vsega, kar je prikazano ali se predvaja v telefonu, vključno z zvokom, fotografijami, podatki za plačilo, gesli in sporočili.&lt;br/&gt;&lt;br/&gt;Naprava %1$s bo lahko pretočno predvajala aplikacije in sistemske funkcije, dokler ne odstranite dostopa do tega dovoljenja."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"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 napravah v bližini."</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>
diff --git a/packages/CompanionDeviceManager/res/values-sq/strings.xml b/packages/CompanionDeviceManager/res/values-sq/strings.xml
index 635e5c8..76f623a 100644
--- a/packages/CompanionDeviceManager/res/values-sq/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sq/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"pajisje"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Këtij aplikacioni do t\'i lejohet qasja te këto leje në <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Lejo që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; të ketë qasje në këtë informacion nga telefoni yt"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Të lejohet që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; të transmetojë aplikacionet e telefonit tënd?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s do të ketë qasje te çdo gjë që është e dukshme ose luhet në telefon, duke përfshirë audion, fotografitë, fjalëkalimet dhe mesazhet.&lt;br/&gt;&lt;br/&gt;%1$s do të mund të transmetojë aplikacionet derisa ta heqësh qasjen për këtë leje."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Shërbimet mes pajisjeve"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> për të transmetuar aplikacione ndërmjet pajisjeve të tua"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> për të shfaqur dhe transmetuar aplikacionet mes pajisjeve të tua"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Lejo që &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; të ketë qasje në këtë informacion nga telefoni yt"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Shërbimet e Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> për të marrë qasje te fotografitë, media dhe njoftimet e telefonit tënd"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Të lejohet që &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; të ndërmarrë këtë veprim?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Të lejohet që &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; të transmetojë aplikacionet dhe veçoritë e sistemit të telefonit tënd?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s do të ketë qasje te çdo gjë që është e dukshme ose luhet në telefon, duke përfshirë audion, fotografitë, informacionet për pagesën, fjalëkalimet dhe mesazhet.&lt;br/&gt;&lt;br/&gt;%1$s do të mund të transmetojë aplikacionet dhe veçoritë e sistemit derisa ta heqësh qasjen për këtë leje."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<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>) tënde për të transmetuar aplikacione dhe veçori të tjera të sistemit te pajisjet në afërsi"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-sr/strings.xml b/packages/CompanionDeviceManager/res/values-sr/strings.xml
index af9e194..22eafa5 100644
--- a/packages/CompanionDeviceManager/res/values-sr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sr/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"уређај"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Овој апликацији ће бити дозвољено да приступа овим дозволама на вашем уређају (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Дозволите да &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; приступа овим информацијама са телефона"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Желите ли да дозволите да &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; стримује апликације на телефону?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s ће имати приступ свему што се види или пушта на телефону, укључујући звук, слике, лозинке и поруке.&lt;br/&gt;&lt;br/&gt;%1$s ће моћи да стримује апликације док не уклоните приступ овој дозволи."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Услуге на више уређаја"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> захтева дозволу у име уређаја <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> за стримовање апликација између уређаја"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> тражи дозволу у име уређаја <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"Дозволите да &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; приступа овим информацијама са телефона"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play услуге"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> захтева дозволу у име уређаја <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> за приступ сликама, медијском садржају и обавештењима са телефона"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Желите ли да дозволите да &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; обави ову радњу?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Желите ли да дозволите да &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; стримује апликације и функције система на телефону?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s ће имати приступ свему што се види или пушта на телефону, укључујући звук, слике, информације о плаћању, лозинке и поруке.&lt;br/&gt;&lt;br/&gt;%1$s ће моћи да стримује апликације и функције система док не уклоните приступ овој дозволи."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> захтева дозволу у име уређаја <xliff:g id="DEVICE_NAME">%2$s</xliff:g> да стримује апликације и друге системске функције на уређаје у близини"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"уређај"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Ова апликација ће моћи да синхронизује податке, попут имена особе која упућује позив, између телефона и одабраног уређаја"</string>
diff --git a/packages/CompanionDeviceManager/res/values-sv/strings.xml b/packages/CompanionDeviceManager/res/values-sv/strings.xml
index fdde926..2c0f9c4 100644
--- a/packages/CompanionDeviceManager/res/values-sv/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sv/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"enhet"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Appen får tillåtelse att använda dessa behörigheter på din <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Ge &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; åtkomstbehörighet till denna information på telefonen"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Vill du tillåta &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; att streama telefonens appar?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s får åtkomst till allt som visas eller spelas på telefonen, inklusive ljud, foton, lösenord och meddelanden.&lt;br/&gt;&lt;br/&gt;%1$s kan streama appar tills du tar bort behörigheten."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Tjänster för flera enheter"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet att låta <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> streama appar mellan enheter"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet att visa och streama appar mellan enheter åt din <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"Ge &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; åtkomstbehörighet till denna information på telefonen"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-tjänster"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet att ge <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> åtkomst till foton, mediefiler och aviseringar på telefonen"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vill du tillåta att &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; utför denna åtgärd?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Vill du tillåta &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; att streama telefonens appar och systemfunktioner?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s får åtkomst till allt som visas eller spelas på telefonen, inklusive ljud, foton, betalningsuppgifter, lösenord och meddelanden.&lt;br/&gt;&lt;br/&gt;%1$s kan streama appar och systemfunktioner tills du tar bort behörigheten."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet att streama appar och andra systemfunktioner till enheter i närheten för din <xliff:g id="DEVICE_NAME">%2$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>
diff --git a/packages/CompanionDeviceManager/res/values-sw/strings.xml b/packages/CompanionDeviceManager/res/values-sw/strings.xml
index 2fb4677..5820279 100644
--- a/packages/CompanionDeviceManager/res/values-sw/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-sw/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"kifaa"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Programu hii itaruhusiwa kufikia ruhusa hizi kwenye <xliff:g id="DEVICE_NAME">%1$s</xliff:g> yako"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Ruhusu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ifikie maelezo haya kutoka kwenye simu yako"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Ungependa kuruhusu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; itiririshe programu za simu yako?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s itakuwa na uwezo wa kufikia chochote kinachoonekana au kuchezwa kwenye simu, ikiwa ni pamoja na sauti, picha, manenosiri na ujumbe.&lt;br/&gt;&lt;br/&gt;%1$s itaweza kutiririsha programu hadi uondoe ruhusa hii."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Huduma za kifaa kilichounganishwa kwingine"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> yako ili itiririshe programu kati ya vifaa vyako"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> yako ili ionyeshe na kutiririsha programu kati ya vifaa vyako"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Ruhusu &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ifikie maelezo haya kutoka kwenye simu yako"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Huduma za Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> yako ili ifikie picha, maudhui na arifa za simu yako"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ungependa kuruhusu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; itekeleze kitendo hiki?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Ungependa kuruhusu &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; itiririshe programu za simu na vipengele vya mfumo wako?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s itakuwa na uwezo wa kufikia chochote kinachoonekana au kuchezwa kwenye simu yako, ikiwa ni pamoja na sauti, picha, maelezo ya malipo, manenosiri na ujumbe.&lt;br/&gt;&lt;br/&gt;%1$s itaweza kutiririsha programu na vipengele vya mfumo hadi uondoe ruhusa hii."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DEVICE_NAME">%2$s</xliff:g> chako ili itiririshe programu na vipengele vingine vya mfumo kwenye vifaa vilivyo karibu"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-ta/strings.xml b/packages/CompanionDeviceManager/res/values-ta/strings.xml
index 62a9c33..5133073 100644
--- a/packages/CompanionDeviceManager/res/values-ta/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ta/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"சாதனம்"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"உங்கள் <xliff:g id="DEVICE_NAME">%1$s</xliff:g> சாதனத்தில் இந்த அனுமதிகளை அணுக இந்த ஆப்ஸ் அனுமதிக்கப்படும்"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"மொபைலில் உள்ள இந்தத் தகவல்களை அணுக, &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அனுமதிக்கவும்"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"உங்கள் மொபைலின் ஆப்ஸை ஸ்ட்ரீம் செய்ய &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"ஆடியோ, படங்கள், கடவுச்சொற்கள், மெசேஜ்கள் உட்பட மொபைலில் காட்டப்படுகின்ற அல்லது பிளே செய்யப்படுகின்ற அனைத்தையும் %1$s அணுகும்.&lt;br/&gt;&lt;br/&gt;இந்த அனுமதிக்கான அணுகலை நீங்கள் அகற்றும் வரை %1$s ஆல் ஆப்ஸை ஸ்ட்ரீம் செய்ய முடியும்."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"பன்முக சாதன சேவைகள்"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"உங்கள் சாதனங்களுக்கு இடையே ஆப்ஸை ஸ்ட்ரீம் செய்ய உங்கள் <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் அனுமதியைக் கோருகிறது"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"உங்கள் சாதனங்களுக்கு இடையே ஆப்ஸைக் காட்சிப்படுத்தவும் ஸ்ட்ரீம் செய்யவும் உங்கள் <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$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="4693714143506569253">"உங்கள் மொபைலிலிருந்து இந்தத் தகவலை அணுக &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அனுமதியுங்கள்"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play சேவைகள்"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"உங்கள் மொபைலில் உள்ள படங்கள், மீடியா, அறிவிப்புகள் ஆகியவற்றை அணுக உங்கள் <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் அனுமதியைக் கோருகிறது"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"இந்தச் செயலைச் செய்ய &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ஐ அனுமதிக்கவா?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"உங்கள் மொபைலின் ஆப்ஸ் மற்றும் சிஸ்டம் அம்சங்களை ஸ்ட்ரீம் செய்ய &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"ஆடியோ, படங்கள், பேமெண்ட் தகவல்கள், கடவுச்சொற்கள், மெசேஜ்கள் உட்பட உங்கள் மொபைலில் காட்டப்படுகின்ற அல்லது பிளே செய்யப்படுகின்ற அனைத்தையும் %1$s அணுகும்.&lt;br/&gt;&lt;br/&gt;இந்த அனுமதிக்கான அணுகலை நீங்கள் அகற்றும் வரை %1$s ஆல் ஆப்ஸ் மற்றும் சிஸ்டம் அம்சங்களை ஸ்ட்ரீம் செய்ய முடியும்."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"அருகிலுள்ள சாதனங்களுக்கு ஆப்ஸையும் பிற சிஸ்டம் அம்சங்களையும் ஸ்ட்ரீம் செய்ய உங்கள் <xliff:g id="DEVICE_NAME">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$s</xliff:g> அனுமதி கோருகிறது"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"சாதனம்"</string>
     <string name="summary_generic" msgid="1761976003668044801">"அழைப்பவரின் பெயர் போன்ற தகவலை உங்கள் மொபைல் மற்றும் தேர்வுசெய்த சாதனத்திற்கு இடையில் இந்த ஆப்ஸால் ஒத்திசைக்க முடியும்"</string>
diff --git a/packages/CompanionDeviceManager/res/values-te/strings.xml b/packages/CompanionDeviceManager/res/values-te/strings.xml
index 4e26141..ede266e 100644
--- a/packages/CompanionDeviceManager/res/values-te/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-te/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"పరికరం"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"మీ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>లో ఈ అనుమతులను యాక్సెస్ చేయడానికి ఈ యాప్ అనుమతించబడుతుంది"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"మీ ఫోన్ నుండి ఈ సమాచారాన్ని యాక్సెస్ చేయడానికి &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; యాప్‌ను అనుమతించండి"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"మీ ఫోన్ యాప్‌లను స్ట్రీమ్ చేయడానికి &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt;ను అనుమతించాలా?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"ఆడియో, ఫోటోలు, పాస్‌వర్డ్‌లు, మెసేజ్‌లతో సహా ఫోన్‌లో కనిపించే లేదా ప్లే అయ్యే దేనికైనా %1$sకు యాక్సెస్ ఉంటుంది.&lt;br/&gt;&lt;br/&gt;మీరు ఈ అనుమతికి యాక్సెస్‌ను తీసివేసే వరకు %1$s యాప్‌లను స్ట్రీమ్ చేయగలదు."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"మీ పరికరాల మధ్య యాప్‌లను స్ట్రీమ్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g> మీ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> తరఫున అనుమతిని రిక్వెస్ట్ చేస్తోంది"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"మీ పరికరాలలో యాప్‌లను డిస్‌ప్లే చేయడానికి, స్ట్రీమ్ చేయడానికి <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> తరఫున <xliff:g id="APP_NAME">%1$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="4693714143506569253">"మీ ఫోన్ నుండి ఈ సమాచారాన్ని యాక్సెస్ చేయడానికి &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; యాప్‌ను అనుమతించండి"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play సర్వీసులు"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> మీ ఫోన్‌లోని ఫోటోలను, మీడియాను, ఇంకా నోటిఫికేషన్‌లను యాక్సెస్ చేయడానికి మీ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> తరఫున అనుమతిని రిక్వెస్ట్ చేస్తోంది"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ఈ చర్యను అమలు చేయడానికి &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;‌ను అనుమతించాలా?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"మీ ఫోన్ యాప్‌లను, సిస్టమ్ ఫీచర్‌లను స్ట్రీమ్ చేయడానికి &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;ను అనుమతించాలా?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"ఆడియో, ఫోటోలు, పేమెంట్ సమాచారం, పాస్‌వర్డ్‌లు, మెసేజ్‌లతో సహా మీ ఫోన్‌లో కనిపించే లేదా ప్లే అయ్యే దేనికైనా %1$sకు యాక్సెస్ ఉంటుంది.&lt;br/&gt;&lt;br/&gt;మీరు ఈ అనుమతికి యాక్సెస్‌ను తీసివేసే వరకు %1$s యాప్‌లను, సిస్టమ్ ఫీచర్‌లను స్ట్రీమ్ చేయగలదు."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"సమీపంలోని పరికరాలకు యాప్‌లను, ఇతర సిస్టమ్ ఫీచర్‌లను స్ట్రీమ్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g> మీ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> తరఫున అనుమతిని రిక్వెస్ట్ చేస్తోంది"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"పరికరం"</string>
     <string name="summary_generic" msgid="1761976003668044801">"కాల్ చేస్తున్న వారి పేరు వంటి సమాచారాన్ని ఈ యాప్ మీ ఫోన్ కు, ఎంచుకున్న పరికరానికీ మధ్య సింక్ చేయగలుగుతుంది"</string>
diff --git a/packages/CompanionDeviceManager/res/values-th/strings.xml b/packages/CompanionDeviceManager/res/values-th/strings.xml
index 8be8b34..a2424ec 100644
--- a/packages/CompanionDeviceManager/res/values-th/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-th/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"อุปกรณ์"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"แอปนี้จะได้รับสิทธิ์ดังต่อไปนี้ใน<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ของคุณ"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"อนุญาตให้ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; เข้าถึงข้อมูลนี้จากโทรศัพท์ของคุณ"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"อนุญาตให้ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; สตรีมแอปในโทรศัพท์ของคุณไหม"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s จะมีสิทธิ์เข้าถึงทุกอย่างที่ปรากฏหรือเล่นบนโทรศัพท์ ซึ่งรวมถึงเสียง รูปภาพ รหัสผ่าน และข้อความ&lt;br/&gt;&lt;br/&gt;%1$s จะสามารถสตรีมแอปได้จนกว่าคุณจะนำสิทธิ์เข้าถึงนี้ออก"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"บริการข้ามอุปกรณ์"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> เพื่อสตรีมแอประหว่างอุปกรณ์ต่างๆ ของคุณ"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"อนุญาตให้ &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; เข้าถึงข้อมูลนี้จากโทรศัพท์ของคุณ"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"บริการ Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> เพื่อเข้าถึงรูปภาพ สื่อ และการแจ้งเตือนในโทรศัพท์ของคุณ"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"อนุญาตให้ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ทำงานนี้ไหม"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"อนุญาตให้ &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; สตรีมแอปและฟีเจอร์ของระบบในโทรศัพท์ไหม"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s จะมีสิทธิ์เข้าถึงทุกอย่างที่ปรากฏหรือเล่นบนโทรศัพท์ของคุณ ซึ่งรวมถึงเสียง รูปภาพ ข้อมูลการชำระเงิน รหัสผ่าน และข้อความ&lt;br/&gt;&lt;br/&gt;%1$s จะสามารถสตรีมแอปและฟีเจอร์ของระบบได้จนกว่าคุณจะนำสิทธิ์เข้าถึงนี้ออก"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> เพื่อสตรีมแอปและฟีเจอร์อื่นๆ ของระบบไปยังอุปกรณ์ที่อยู่ใกล้เคียง"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"อุปกรณ์"</string>
     <string name="summary_generic" msgid="1761976003668044801">"แอปนี้จะสามารถซิงค์ข้อมูล เช่น ชื่อของบุคคลที่โทรเข้ามา ระหว่างโทรศัพท์ของคุณและอุปกรณ์ที่เลือกไว้ได้"</string>
diff --git a/packages/CompanionDeviceManager/res/values-tr/strings.xml b/packages/CompanionDeviceManager/res/values-tr/strings.xml
index d5c51e8..3efc2992 100644
--- a/packages/CompanionDeviceManager/res/values-tr/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-tr/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"Cihaz"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Bu uygulamanın <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazınızda şu izinlere erişmesine izin verilecek:"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; uygulamasının, telefonunuzdaki bu bilgilere erişmesine izin verin"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; adlı uygulamanın telefonunuzdaki uygulamaları aktarmasına izin verilsin mi?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s; ses, fotoğraflar, şifreler ve mesajlar da dahil olmak üzere telefonda görünen veya oynatılan her şeye erişebilecek.&lt;br/&gt;&lt;br/&gt;%1$s siz bu iznin erişimini kaldırana kadar uygulamaları aktarabilecek."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cihazlar arası hizmetler"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g>, cihazlarınız arasında uygulama akışı gerçekleştirmek için <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> cihazınız adına izin istiyor"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g>, cihazlarınız arasında uygulamaları göstermek ve aktarmak için <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> cihazınız adına izin istiyor"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; uygulamasının, telefonunuzdaki bu bilgilere erişmesine izin verin"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Hizmetleri"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g>, telefonunuzdaki fotoğraf, medya ve bildirimlere erişmek için <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> cihazınız adına izin istiyor"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; cihazının bu işlemi yapmasına izin verilsin mi?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; adlı uygulamanın telefonunuzdaki uygulamaları ve sistem özelliklerini aktarmasına izin verilsin mi?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s; ses, fotoğraflar, ödeme bilgileri, şifreler ve mesajlar da dahil olmak üzere telefonunuzda görünen veya oynatılan her şeye erişebilecek.&lt;br/&gt;&lt;br/&gt;%1$s siz bu iznin erişimini kaldırana kadar uygulamaları ve diğer sistem özelliklerini aktarabilecek."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulaması <xliff:g id="DEVICE_NAME">%2$s</xliff:g> cihazınız adına uygulamaları ve diğer sistem özelliklerini yakındaki cihazlara aktarmak için izin istiyor"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-uk/strings.xml b/packages/CompanionDeviceManager/res/values-uk/strings.xml
index 97a3dbc..745e4f7 100644
--- a/packages/CompanionDeviceManager/res/values-uk/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-uk/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"пристрій"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Цей додаток матиме доступ до перелічених нижче дозволів на вашому <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Надайте додатку &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; доступ до цієї інформації з телефона"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Дозволити додатку &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; транслювати додатки телефона?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s матиме доступ до контенту, що відображається чи відтворюється на телефоні, зокрема до аудіо, фото, паролів і повідомлень.&lt;br/&gt;&lt;br/&gt;%1$s зможе транслювати додатки, поки ви не скасуєте цей дозвіл."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Сервіси для кількох пристроїв"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" запитує дозвіл на трансляцію додатків між вашими пристроями"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою \"<xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"Надайте пристрою &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; доступ до цієї інформації з телефона"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Сервіси Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" запитує дозвіл на доступ до фотографій, медіафайлів і сповіщень вашого телефона"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Дозволити додатку &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; виконувати цю дію?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Дозволити пристрою &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; транслювати додатки й системні функції телефона?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s матиме доступ до контенту, що відображається чи відтворюється на телефоні, зокрема до аудіо, фото, платіжної інформації, паролів і повідомлень.&lt;br/&gt;&lt;br/&gt;%1$s зможе транслювати додатки й системні функції, поки ви не скасуєте цей дозвіл."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) запитує дозвіл на трансляцію додатків та інших системних функцій на пристрої поблизу"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"пристрій"</string>
     <string name="summary_generic" msgid="1761976003668044801">"Цей додаток зможе синхронізувати інформацію (наприклад, ім’я абонента, який викликає) між телефоном і вибраним пристроєм"</string>
diff --git a/packages/CompanionDeviceManager/res/values-ur/strings.xml b/packages/CompanionDeviceManager/res/values-ur/strings.xml
index 52826b3..109a011 100644
--- a/packages/CompanionDeviceManager/res/values-ur/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ur/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"آلہ"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"اس ایپ کو آپ کے <xliff:g id="DEVICE_NAME">%1$s</xliff:g> پر ان اجازتوں تک رسائی کی اجازت ہوگی"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"‏اپنے فون سے ان معلومات تک رسائی حاصل کرنے کی &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; کو اجازت دیں"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"‏اجازت دیں&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; اپنے فون کی ایپس کو سلسلہ بندی کرنے کے لیے؟"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"‏%1$s کو فون پر دکھائی دینے والی یا چلائی جانے والی کسی بھی چیز تک رسائی حاصل ہوگی، بشمول آڈیو، تصاویر، پاس ورڈز اور پیغامات۔&lt;br/&gt;&lt;br/&gt;%1$s اس وقت تک ایپس کو اسٹریم کر سکے گید جب تک آپ اس اجازت تک رسائی کو ہٹا دیتے ہیں۔"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"کراس ڈیوائس سروسز"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ایپ آپ کے <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> کی جانب سے آپ کے آلات کے درمیان ایپس کی سلسلہ بندی کرنے کی اجازت کی درخواست کر رہی ہے"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> آپ کے <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"‏اپنے فون سے اس معلومات تک رسائی حاصل کرنے کی &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; کو اجازت دیں"</string>
@@ -41,8 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"‏Google Play سروسز"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ایپ آپ کے <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> کی جانب سے آپ کے فون کی تصاویر، میڈیا اور اطلاعات تک رسائی کی اجازت کی درخواست کر رہی ہے"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"‏&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; کو یہ کارروائی انجام دینے کی اجازت دیں؟"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"‏اجازت دیں &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; اپنے فون کی ایپس اور سسٹم کی خصوصیات کو سلسلہ بندی کرنے کے لیے؟"</string>
+    <!-- String.format failed for translation -->
     <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
     <skip />
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> آپ کے <xliff:g id="DEVICE_NAME">%2$s</xliff:g> کی جانب سے ایپس اور سسٹم کی دیگر خصوصیات کی سلسلہ بندی قریبی آلات پر کرنے کی اجازت طلب کر رہی ہے"</string>
diff --git a/packages/CompanionDeviceManager/res/values-uz/strings.xml b/packages/CompanionDeviceManager/res/values-uz/strings.xml
index b2c81e1..80cd92c 100644
--- a/packages/CompanionDeviceManager/res/values-uz/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-uz/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"qurilma"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Bu ilova <xliff:g id="DEVICE_NAME">%1$s</xliff:g> qurilmasida quyidagi ruxsatlarni oladi"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasiga telefondagi ushbu maʼlumot uchun ruxsat bering"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; telefondagi ilovalarni striming qilishiga ruxsat berasizmi?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s telefonda 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, %1$s ilovalarni striming qila oladi."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Qurilmalararo xizmatlar"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Qurilamalararo ilovalar strimingi uchun <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nomidan ruxsat soʻramoqda"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nomidan ilovalarni koʻrsatish va striming qilishga ruxsat soʻramoqda"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasiga telefondagi ushbu maʼlumot uchun ruxsat bering"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play xizmatlari"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"Telefoningizdagi rasm, media va bildirishnomalarga kirish uchun <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nomidan ruxsat soʻramoqda"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; ilovasiga bu amalni bajarish uchun ruxsat berilsinmi?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; telefondagi ilovalar va tizim funksiyalarini striming qilishiga ruxsat berasizmi?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s telefonda 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, %1$s ilovalarni va tizim funksiyalarini striming qila oladi."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DEVICE_NAME">%2$s</xliff:g> qurilmangizdan nomidan atrofdagi qurilmalarga ilova va boshqa tizim funksiyalarini uzatish uchun ruxsat olmoqchi"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-vi/strings.xml b/packages/CompanionDeviceManager/res/values-vi/strings.xml
index ae6fc7f..ca3f5cc 100644
--- a/packages/CompanionDeviceManager/res/values-vi/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-vi/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"thiết bị"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Ứng dụng này sẽ được phép dùng những quyền sau trên <xliff:g id="DEVICE_NAME">%1$s</xliff:g> của bạn"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"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 điện thoại của bạn"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"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 điện thoại của bạn?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s sẽ có quyền truy cập vào mọi nội dung hiển thị hoặc được phát trên điện thoại, bao gồm âm thanh, hình ảnh, mật khẩu và tin nhắn.&lt;br/&gt;&lt;br/&gt;%1$s sẽ có thể truyền trực tuyến các ứng dụng cho đến khi bạn ngừng cấp quyền này cho ứng dụng đó."</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Dịch vụ trên nhiều thiết bị"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang yêu cầu quyền thay cho <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> để truyền trực tuyến ứng dụng giữa các thiết bị của bạn"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang yêu cầu quyền thay mặt cho <xliff:g id="DISPLAY_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>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"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 điện thoại của bạn"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Dịch vụ Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang yêu cầu quyền thay cho <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> để truy cập vào ảnh, nội dung nghe nhìn và thông báo trên điện thoại của bạn"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Cho phép &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; thực hiện hành động này?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Cho phép &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; truyền trực tuyến các ứng dụng và tính năng hệ thống trên điện thoại của bạn?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s sẽ có quyền truy cập vào mọi nội dung hiển thị hoặc được phát trên điện thoại, bao gồm âm thanh, hình ảnh, thông tin thanh toán, mật khẩu và tin nhắn.&lt;br/&gt;&lt;br/&gt;%1$s sẽ có thể truyền trực tuyến các ứng dụng và tính năng hệ thống cho đến khi bạn ngừng cấp quyền này cho ứng dụng đó."</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang thay <xliff:g id="DEVICE_NAME">%2$s</xliff:g> yêu cầu quyền truyền trực tuyến ứng dụng và các tính năng khác của hệ thống đến các thiết bị ở gần"</string>
     <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>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
index 8bc8287..750ff0d 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"设备"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"该应用将可以获得您<xliff:g id="DEVICE_NAME">%1$s</xliff:g>上的以下权限"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”&lt;strong&gt;&lt;/strong&gt;访问您手机中的这项信息"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"允许 &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; 流式传输手机的应用?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"“%1$s”将能够访问手机上可见或播放的任何内容,包括音频、照片、密码和消息。&lt;br/&gt;&lt;br/&gt;“%1$s”将能够流式传输应用,除非您撤消此访问权限。"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"跨设备服务"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>请求在您的设备之间流式传输应用内容"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的<xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"允许 &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; 访问您手机中的这项信息"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play 服务"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>请求访问您手机上的照片、媒体内容和通知"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"允许&lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt;进行此操作?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"允许 &lt;strong&gt;<xliff:g id="DEVICE_NAME">%1$s</xliff:g>&lt;/strong&gt; 流式传输手机的应用和系统功能?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"“%1$s”将能够访问手机上可见或播放的任何内容,包括音频、照片、付款信息、密码和消息。&lt;br/&gt;&lt;br/&gt;“%1$s”将能够流式传输应用和系统功能,除非您撤消此访问权限。"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的<xliff:g id="DEVICE_NAME">%2$s</xliff:g>请求将应用和其他系统功能流式传输到附近的设备"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"设备"</string>
     <string name="summary_generic" msgid="1761976003668044801">"此应用将能在您的手机和所选设备之间同步信息,例如来电者的姓名"</string>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
index a085893..ad9b4a2 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"裝置"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"此應用程式將可在<xliff:g id="DEVICE_NAME">%1$s</xliff:g>上取得以下權限"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;存取你手機中的這項資料"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」串流手機應用程式內容嗎?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"%1$s 將能存取手機上顯示或播放的任何內容,包括音訊、相片、密碼和訊息。&lt;br/&gt;&lt;br/&gt;%1$s 將能串流應用程式內容,直至你移除此存取權限為止。"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"跨裝置服務"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 要求權限,以便在裝置間串流應用程式的內容"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表 <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;存取你手機中的這項資料"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play 服務"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 要求權限,以便存取手機上的相片、媒體和通知"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"要允許「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;執行此操作嗎?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"要允許「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」串流手機應用程式內容和系統功能嗎?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s 將能存取手機上顯示或播放的任何內容,包括音訊、相片、付款資料、密碼和訊息。&lt;br/&gt;&lt;br/&gt;%1$s 將能串流應用程式內容和系統功能,直至你移除此存取權限為止。"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」要求權限,才能在附近的裝置上串流播放應用程式和其他系統功能"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string>
     <string name="summary_generic" msgid="1761976003668044801">"此應用程式將可同步手機和所選裝置的資訊,例如來電者的名稱"</string>
diff --git a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
index a93034f..a5817c4 100644
--- a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml
@@ -26,14 +26,11 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"裝置"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"這個應用程式將可取得<xliff:g id="DEVICE_NAME">%1$s</xliff:g>上的這些權限"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;存取手機中的這項資訊"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
-    <!-- no translation found for summary_app_streaming (295548145144086753) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;串流傳輸手機的應用程式嗎?"</string>
+    <string name="summary_app_streaming" msgid="295548145144086753">"「%1$s」將可存取手機顯示或播放的所有內容,包括音訊、相片、密碼和訊息。&lt;br/&gt;&lt;br/&gt;「%1$s」將可串流傳輸應用程式,直到你移除這個權限為止。"</string>
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"跨裝置服務"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"為了在裝置間串流傳輸應用程式內容,「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 要求相關權限"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表你的 <xliff:g id="DISPLAY_NAME">%2$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="4693714143506569253">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;存取你手機中的這項資訊"</string>
@@ -41,10 +38,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Google Play 服務"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"為了存取手機上的相片、媒體和通知,「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 要求相關權限"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"要允許「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;執行這項操作嗎?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
-    <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"要允許「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」&lt;strong&gt;&lt;/strong&gt;串流傳輸手機的應用程式及存取系統功能嗎?"</string>
+    <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"「%1$s」將可存取手機顯示或播放的所有內容,包括音訊、相片、付款資訊、密碼和訊息。&lt;br/&gt;&lt;br/&gt;「%1$s」將可串流傳輸應用程式及存取系統功能,直到你移除這個權限為止。"</string>
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」要求必要權限,才能在鄰近裝置上串流播放應用程式和其他系統功能"</string>
     <string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string>
     <string name="summary_generic" msgid="1761976003668044801">"這個應用程式將可在手機和指定裝置間同步資訊,例如來電者名稱"</string>
diff --git a/packages/CompanionDeviceManager/res/values-zu/strings.xml b/packages/CompanionDeviceManager/res/values-zu/strings.xml
index ddda3e3..4b00dcb 100644
--- a/packages/CompanionDeviceManager/res/values-zu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-zu/strings.xml
@@ -26,14 +26,13 @@
     <string name="profile_name_glasses" msgid="3506504967216601277">"idivayisi"</string>
     <string name="summary_glasses" msgid="2872254734959842579">"Le-app izovunyelwa ukufinyelela lezi zimvume ku-<xliff:g id="DEVICE_NAME">%1$s</xliff:g> yakho"</string>
     <string name="title_app_streaming" msgid="2270331024626446950">"Vumela i-&lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ifinyelele lolu lwazi kusukela efonini yakho"</string>
-    <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) -->
-    <skip />
+    <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Vumela i-<xliff:g id="APP_NAME">%1$s</xliff:g> ukusakaza ama-app efoni yakho?"</string>
+    <!-- String.format failed for translation -->
     <!-- no translation found for summary_app_streaming (295548145144086753) -->
     <skip />
     <string name="helper_title_app_streaming" msgid="4151687003439969765">"Amasevisi amadivayisi amaningi"</string>
     <string name="helper_summary_app_streaming" msgid="2396773196949578425">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DISPLAY_NAME">%2$s</xliff:g> yakho ukuze isakaze-bukhoma ama-app phakathi kwamadivayisi akho"</string>
-    <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) -->
-    <skip />
+    <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DISPLAY_NAME">%2$s</xliff:g> yakho yokubonisa nokusakaza ama-app phakathi kwamadivayisi wakho"</string>
     <string name="title_automotive_projection" msgid="3296005598978412847"></string>
     <string name="summary_automotive_projection" msgid="8683801274662496164"></string>
     <string name="title_computer" msgid="4693714143506569253">"Vumela &lt;strong&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/strong&gt; ukufinyelela lolu lwazi kusuka efonini yakho"</string>
@@ -41,8 +40,8 @@
     <string name="helper_title_computer" msgid="4671071173916176037">"Amasevisi we-Google Play"</string>
     <string name="helper_summary_computer" msgid="8774832742608187072">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DISPLAY_NAME">%2$s</xliff:g> yakho ukuze ifinyelele izithombe zefoni yakho, imidiya nezaziso"</string>
     <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vumela i-<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ukwenza lesi senzo?"</string>
-    <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) -->
-    <skip />
+    <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Vumela i-<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ukuze usakaze ama-app wefoni yakho nezakhi zesistimu?"</string>
+    <!-- String.format failed for translation -->
     <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) -->
     <skip />
     <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DEVICE_NAME">%2$s</xliff:g> ukusakaza ama-app nezinye izakhi zesistimu kumadivayisi aseduze"</string>
diff --git a/packages/CompanionDeviceManager/res/values/styles.xml b/packages/CompanionDeviceManager/res/values/styles.xml
index 0af1080..e8e24f4 100644
--- a/packages/CompanionDeviceManager/res/values/styles.xml
+++ b/packages/CompanionDeviceManager/res/values/styles.xml
@@ -40,6 +40,7 @@
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
         <item name="android:gravity">center</item>
+        <item name="android:textDirection">locale</item>
         <item name="android:layout_marginLeft">14dp</item>
         <item name="android:layout_marginRight">14dp</item>
         <item name="android:textSize">20sp</item>
@@ -53,6 +54,7 @@
         <item name="android:layout_marginTop">18dp</item>
         <item name="android:layout_marginLeft">18dp</item>
         <item name="android:layout_marginRight">18dp</item>
+        <item name="android:textDirection">locale</item>
         <item name="android:textSize">14sp</item>
         <item name="android:textColor">?android:attr/textColorSecondary</item>
     </style>
diff --git a/packages/CrashRecovery/services/java/com/android/server/PackageWatchdog.java b/packages/CrashRecovery/services/java/com/android/server/PackageWatchdog.java
index a8d8f9a..75a8bdf 100644
--- a/packages/CrashRecovery/services/java/com/android/server/PackageWatchdog.java
+++ b/packages/CrashRecovery/services/java/com/android/server/PackageWatchdog.java
@@ -137,17 +137,6 @@
     static final int DEFAULT_BOOT_LOOP_TRIGGER_COUNT = 5;
 
     static final long DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS = TimeUnit.MINUTES.toMillis(10);
-    // Boot loop at which packageWatchdog starts first mitigation
-    private static final String BOOT_LOOP_THRESHOLD =
-            "persist.device_config.configuration.boot_loop_threshold";
-    @VisibleForTesting
-    static final int DEFAULT_BOOT_LOOP_THRESHOLD = 15;
-    // Once boot_loop_threshold is surpassed next mitigation would be triggered after
-    // specified number of reboots.
-    private static final String BOOT_LOOP_MITIGATION_INCREMENT =
-            "persist.device_config.configuration..boot_loop_mitigation_increment";
-    @VisibleForTesting
-    static final int DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT = 2;
 
     // Threshold level at which or above user might experience significant disruption.
     private static final String MAJOR_USER_IMPACT_LEVEL_THRESHOLD =
@@ -253,15 +242,8 @@
         mConnectivityModuleConnector = connectivityModuleConnector;
         mSystemClock = clock;
         mNumberOfNativeCrashPollsRemaining = NUMBER_OF_NATIVE_CRASH_POLLS;
-        if (Flags.recoverabilityDetection()) {
-            mBootThreshold = new BootThreshold(DEFAULT_BOOT_LOOP_TRIGGER_COUNT,
-                    DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS,
-                    SystemProperties.getInt(BOOT_LOOP_MITIGATION_INCREMENT,
-                            DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT));
-        } else {
-            mBootThreshold = new BootThreshold(DEFAULT_BOOT_LOOP_TRIGGER_COUNT,
-                    DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS);
-        }
+        mBootThreshold = new BootThreshold(DEFAULT_BOOT_LOOP_TRIGGER_COUNT,
+                DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS);
 
         loadFromFile();
         sPackageWatchdog = this;
@@ -526,10 +508,16 @@
     /**
      * Called when the system server boots. If the system server is detected to be in a boot loop,
      * query each observer and perform the mitigation action with the lowest user impact.
+     *
+     * Note: PackageWatchdog considers system_server restart loop as bootloop. Full reboots
+     * are not counted in bootloop.
      */
     @SuppressWarnings("GuardedBy")
     public void noteBoot() {
         synchronized (mLock) {
+            // if boot count has reached threshold, start mitigation.
+            // We wait until threshold number of restarts only for the first time. Perform
+            // mitigations for every restart after that.
             boolean mitigate = mBootThreshold.incrementAndTest();
             if (mitigate) {
                 if (!Flags.recoverabilityDetection()) {
@@ -557,17 +545,13 @@
                 }
                 if (currentObserverToNotify != null) {
                     if (Flags.recoverabilityDetection()) {
-                        if (currentObserverImpact < getUserImpactLevelLimit()
-                                || (currentObserverImpact >= getUserImpactLevelLimit()
-                                        && mBootThreshold.getCount() >= getBootLoopThreshold())) {
-                            int currentObserverMitigationCount =
-                                    currentObserverInternal.getBootMitigationCount() + 1;
-                            currentObserverInternal.setBootMitigationCount(
-                                    currentObserverMitigationCount);
-                            saveAllObserversBootMitigationCountToMetadata(METADATA_FILE);
-                            currentObserverToNotify.executeBootLoopMitigation(
-                                    currentObserverMitigationCount);
-                        }
+                        int currentObserverMitigationCount =
+                                currentObserverInternal.getBootMitigationCount() + 1;
+                        currentObserverInternal.setBootMitigationCount(
+                                currentObserverMitigationCount);
+                        saveAllObserversBootMitigationCountToMetadata(METADATA_FILE);
+                        currentObserverToNotify.executeBootLoopMitigation(
+                                currentObserverMitigationCount);
                     } else {
                         mBootThreshold.setMitigationCount(mitigationCount);
                         mBootThreshold.saveMitigationCountToMetadata();
@@ -647,11 +631,6 @@
                 DEFAULT_MAJOR_USER_IMPACT_LEVEL_THRESHOLD);
     }
 
-    private int getBootLoopThreshold() {
-        return SystemProperties.getInt(BOOT_LOOP_THRESHOLD,
-                DEFAULT_BOOT_LOOP_THRESHOLD);
-    }
-
     /** Possible severity values of the user impact of a {@link PackageHealthObserver#execute}. */
     @Retention(SOURCE)
     @IntDef(value = {PackageHealthObserverImpact.USER_IMPACT_LEVEL_0,
@@ -1827,16 +1806,10 @@
 
         private final int mBootTriggerCount;
         private final long mTriggerWindow;
-        private final int mBootMitigationIncrement;
 
         BootThreshold(int bootTriggerCount, long triggerWindow) {
-            this(bootTriggerCount, triggerWindow, /*bootMitigationIncrement=*/ 1);
-        }
-
-        BootThreshold(int bootTriggerCount, long triggerWindow, int bootMitigationIncrement) {
             this.mBootTriggerCount = bootTriggerCount;
             this.mTriggerWindow = triggerWindow;
-            this.mBootMitigationIncrement = bootMitigationIncrement;
         }
 
         public void reset() {
@@ -1915,6 +1888,7 @@
             } else {
                 readMitigationCountFromMetadataIfNecessary();
             }
+
             final long now = mSystemClock.uptimeMillis();
             if (now - getStart() < 0) {
                 Slog.e(TAG, "Window was less than zero. Resetting start to current time.");
@@ -1939,20 +1913,32 @@
                 setCount(count);
                 EventLogTags.writeRescueNote(Process.ROOT_UID, count, window);
                 if (Flags.recoverabilityDetection()) {
-                    boolean mitigate = (count >= mBootTriggerCount)
-                            && (count - mBootTriggerCount) % mBootMitigationIncrement == 0;
-                    return mitigate;
+                    // After a reboot (e.g. by WARM_REBOOT or mainline rollback) we apply
+                    // mitigations without waiting for DEFAULT_BOOT_LOOP_TRIGGER_COUNT.
+                    return (count >= mBootTriggerCount)
+                            || (performedMitigationsDuringWindow() && count > 1);
                 }
                 return count >= mBootTriggerCount;
             }
         }
 
         @GuardedBy("mLock")
+        private boolean performedMitigationsDuringWindow() {
+            for (ObserverInternal observerInternal: mAllObservers.values()) {
+                if (observerInternal.getBootMitigationCount() > 0) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        @GuardedBy("mLock")
         private void resetAllObserversBootMitigationCount() {
             for (int i = 0; i < mAllObservers.size(); i++) {
                 final ObserverInternal observer = mAllObservers.valueAt(i);
                 observer.setBootMitigationCount(0);
             }
+            saveAllObserversBootMitigationCountToMetadata(METADATA_FILE);
         }
 
         @GuardedBy("mLock")
diff --git a/packages/CrashRecovery/services/java/com/android/server/RescueParty.java b/packages/CrashRecovery/services/java/com/android/server/RescueParty.java
index 7093ba4..f86eb61 100644
--- a/packages/CrashRecovery/services/java/com/android/server/RescueParty.java
+++ b/packages/CrashRecovery/services/java/com/android/server/RescueParty.java
@@ -139,7 +139,7 @@
     static final String NAMESPACE_TO_PACKAGE_MAPPING_FLAG =
             "namespace_to_package_mapping";
     @VisibleForTesting
-    static final long DEFAULT_FACTORY_RESET_THROTTLE_DURATION_MIN = 10;
+    static final long DEFAULT_FACTORY_RESET_THROTTLE_DURATION_MIN = 1440;
 
     private static final String NAME = "rescue-party-observer";
 
diff --git a/packages/CredentialManager/AndroidManifest.xml b/packages/CredentialManager/AndroidManifest.xml
index 7a8c25b..1ac8e19 100644
--- a/packages/CredentialManager/AndroidManifest.xml
+++ b/packages/CredentialManager/AndroidManifest.xml
@@ -21,6 +21,7 @@
 
     <uses-permission android:name="android.permission.LAUNCH_CREDENTIAL_SELECTOR"/>
     <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
+    <uses-permission android:name="android.permission.SET_BIOMETRIC_DIALOG_ADVANCED"/>
     <uses-permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"/>
     <uses-permission android:name="android.permission.ACCESS_INSTANT_APPS" />
     <uses-permission android:name="android.permission.USE_BIOMETRIC" />
diff --git a/packages/CredentialManager/res/values-af/strings.xml b/packages/CredentialManager/res/values-af/strings.xml
index 5d9295b..a24134b3 100644
--- a/packages/CredentialManager/res/values-af/strings.xml
+++ b/packages/CredentialManager/res/values-af/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Wagwoorde sal steeds saam met toegangsleutels beskikbaar wees terwyl ons na ’n wagwoordlose toekoms beweeg."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Kies waar om jou <xliff:g id="CREATETYPES">%1$s</xliff:g> te stoor"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Kies ’n wagwoordbestuurder om jou inligting te stoor en volgende keer vinniger aan te meld"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Wil jy toegangsleutel skep om by <xliff:g id="APPNAME">%1$s</xliff:g> aan te meld?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Wil jy wagwoord stoor om by <xliff:g id="APPNAME">%1$s</xliff:g> aan te meld?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Stoor aanmeldinligting vir <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Skep toegangsleutel om by <xliff:g id="APP_NAME">%1$s</xliff:g> aan te meld?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Stoor wagwoord om by <xliff:g id="APP_NAME">%1$s</xliff:g> aan te meld?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Stoor aanmeldinligting vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"toegangsleutel"</string>
     <string name="password" msgid="6738570945182936667">"wagwoord"</string>
     <string name="passkeys" msgid="5733880786866559847">"toegangsleutels"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Maak toe"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gebruik jou gestoorde toegangsleutel vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Gebruik jou gestoorde wagwoord vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Gebruik jou skermslot om met <xliff:g id="USERNAME">%2$s</xliff:g> by <xliff:g id="APP_NAME">%1$s</xliff:g> aan te meld"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Gebruik jou aanmelding vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Ontsluit aanmeldingopsies vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Kies ’n gestoorde toegangsleutel vir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-am/strings.xml b/packages/CredentialManager/res/values-am/strings.xml
index 2e8021d..0554d81 100644
--- a/packages/CredentialManager/res/values-am/strings.xml
+++ b/packages/CredentialManager/res/values-am/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"ወደ የይለፍ ቃል የሌለው ወደፊት ስንሄድ የይለፍ ቃላት ከይለፍ ቁልፎች ጎን ለጎን ይገኛሉ።"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"የእርስዎን <xliff:g id="CREATETYPES">%1$s</xliff:g> የት እንደሚያስቀምጡ ይምረጡ"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"መረጃዎን ለማስቀመጥ እና በቀጣይ ጊዜ በፍጥነት በመለያ ለመግባት የሚስጥር ቁልፍ አስተዳዳሪን ይምረጡ"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"ወደ <xliff:g id="APPNAME">%1$s</xliff:g> ለመግባት የይለፍ ቁልፍ ይፈጠር?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"ወደ <xliff:g id="APPNAME">%1$s</xliff:g> ለመግባት የይለፍ ቃል ይቀመጥ?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"ለ<xliff:g id="APPNAME">%1$s</xliff:g> የመግቢያ መረጃ ይቀመጥ?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"ወደ <xliff:g id="APP_NAME">%1$s</xliff:g> ለመግባት የይለፍ ቁልፍ ይፈጠር?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"ወደ <xliff:g id="APP_NAME">%1$s</xliff:g> ለመግባት የይለፍ ቃል ይቀመጥ?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"የ<xliff:g id="APP_NAME">%1$s</xliff:g> የመግቢያ መረጃ ይቀመጥ?"</string>
     <string name="passkey" msgid="632353688396759522">"የይለፍ ቁልፍ"</string>
     <string name="password" msgid="6738570945182936667">"የይለፍ ቃል"</string>
     <string name="passkeys" msgid="5733880786866559847">"የይለፍ ቁልፎች"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"አሰናብት"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"የተቀመጠ የይለፍ ቁልፍዎን ለ<xliff:g id="APP_NAME">%1$s</xliff:g> ይጠቀሙ?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> የተቀመጠውን የይለፍ ቃልዎን ይጠቀሙ?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"በ<xliff:g id="USERNAME">%2$s</xliff:g> ወደ <xliff:g id="APP_NAME">%1$s</xliff:g> ለመግባት የማያ ገጽ መቆለፊያዎን ይጠቀሙ"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> መግቢያዎ ጥቅም ላይ ይዋል?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> የመግቢያ አማራጮች ይከፈቱ?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> የተቀመጠ የይለፍ ቁልፍ ይምረጡ"</string>
diff --git a/packages/CredentialManager/res/values-ar/strings.xml b/packages/CredentialManager/res/values-ar/strings.xml
index a2d328c..5e089fe 100644
--- a/packages/CredentialManager/res/values-ar/strings.xml
+++ b/packages/CredentialManager/res/values-ar/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"بينما ننطلق نحو مستقبل بدون كلمات مرور، ستظل كلمات المرور متوفّرة إلى جانب مفاتيح المرور."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"اختيار المكان الذي تريد حفظ <xliff:g id="CREATETYPES">%1$s</xliff:g> فيه"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"اختَر مدير كلمات مرور لحفظ معلوماتك وتسجيل الدخول بشكل أسرع في المرة القادمة."</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"هل تريد إنشاء مفتاح مرور لتسجيل الدخول إلى تطبيق <xliff:g id="APPNAME">%1$s</xliff:g>؟"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"هل تريد حفظ كلمة المرور لتسجيل الدخول إلى تطبيق <xliff:g id="APPNAME">%1$s</xliff:g>؟"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"هل تريد حفظ معلومات تسجيل الدخول لتطبيق \"<xliff:g id="APPNAME">%1$s</xliff:g>\"؟"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"هل تريد إنشاء مفتاح مرور لتسجيل الدخول إلى \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"هل تريد حفظ كلمة المرور لتسجيل الدخول إلى \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"هل تريد حفظ معلومات تسجيل الدخول إلى \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
     <string name="passkey" msgid="632353688396759522">"مفتاح المرور"</string>
     <string name="password" msgid="6738570945182936667">"كلمة المرور"</string>
     <string name="passkeys" msgid="5733880786866559847">"مفاتيح المرور"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"إغلاق"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"هل تريد استخدام مفتاح المرور المحفوظ لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"هل تريد استخدام كلمة المرور المحفوظة لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"استخدِم قفل الشاشة لتسجيل الدخول إلى \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" باستخدام <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"هل تريد استخدام معلومات تسجيل دخولك لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"هل تريد فتح القفل لاستعادة خيارات تسجيل الدخول لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"اختيار مفتاح مرور محفوظ لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
diff --git a/packages/CredentialManager/res/values-as/strings.xml b/packages/CredentialManager/res/values-as/strings.xml
index 3efcea8d..95a0e1b 100644
--- a/packages/CredentialManager/res/values-as/strings.xml
+++ b/packages/CredentialManager/res/values-as/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"আমি পাছৱৰ্ডবিহীন ভৱিষ্যতৰ দিশে আগবঢ়াৰ লগে লগে পাছকীৰ লগতে পাছৱৰ্ডসমূহো উপলব্ধ হ’ব।"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"আপোনাৰ <xliff:g id="CREATETYPES">%1$s</xliff:g> ক’ত ছেভ কৰিব লাগে সেয়া বাছনি কৰক"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"আপোনাৰ তথ্য ছেভ কৰি পৰৱৰ্তী সময়ত দ্ৰুতভাৱে ছাইন ইন কৰিবলৈ এটা পাছৱৰ্ড পৰিচালক বাছনি কৰক"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g>ত ছাইন ইন কৰিবলৈ পাছকী সৃষ্টি কৰিবনে?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g>ত ছাইন ইন কৰিবলৈ পাছৱৰ্ড ছেভ কৰিবনে?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g>ৰ বাবে ছাইন ইনৰ তথ্য ছেভ কৰিবনে?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g>ত ছাইন ইন কৰিবলৈ পাছকী সৃষ্টি কৰিবনে?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g>ত ছাইন ইন কৰিবলৈ পাছৱৰ্ড ছেভ কৰিবনে?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে ছাইন ইনৰ তথ্য ছেভ কৰিবনে?"</string>
     <string name="passkey" msgid="632353688396759522">"পাছকী"</string>
     <string name="password" msgid="6738570945182936667">"পাছৱৰ্ড"</string>
     <string name="passkeys" msgid="5733880786866559847">"পাছকী"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"অগ্ৰাহ্য কৰক"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে আপোনাৰ ছেভ হৈ থকা পাছকী ব্যৱহাৰ কৰিবনে?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে আপোনাৰ ছেভ কৰি থোৱা পাছৱৰ্ড ব্যৱহাৰ কৰিবনে?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g>ৰ জৰিয়তে <xliff:g id="APP_NAME">%1$s</xliff:g>ত ছাইন ইন কৰিবলৈ আপোনাৰ স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে ছাইন ইন কৰিবলৈ আপোনাৰ ক্ৰিডেনশ্বিয়েল ব্যৱহাৰ কৰিবনে?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে ছাইন ইনৰ বিকল্পসমূহ আনলক কৰিবনে?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে ছেভ হৈ থকা এটা পাছকী বাছনি কৰক"</string>
diff --git a/packages/CredentialManager/res/values-az/strings.xml b/packages/CredentialManager/res/values-az/strings.xml
index 627e2c0..00a6718 100644
--- a/packages/CredentialManager/res/values-az/strings.xml
+++ b/packages/CredentialManager/res/values-az/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Parolsuz gələcəyə doğru irəlilədikcə parollar hələ də açarlar ilə yanaşı əlçatan olacaq."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> elementinin saxlanacağı yeri seçin"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Məlumatlarınızı yadda saxlamaq və növbəti dəfə daha sürətli daxil olmaq üçün parol meneceri seçin"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> tətbiqinə daxil olmaq üçün giriş açarı yaradılsın?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> tətbiqinə daxil olmaq üçün parol yadda saxlansın?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> üçün giriş məlumatları yadda saxlansın?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə daxil olmaq üçün giriş açarı yaradılsın?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə daxil olmaq üçün parol yadda saxlansın?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün giriş məlumatları yadda saxlansın?"</string>
     <string name="passkey" msgid="632353688396759522">"açar"</string>
     <string name="password" msgid="6738570945182936667">"parol"</string>
     <string name="passkeys" msgid="5733880786866559847">"açarlar"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"İmtina edin"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanmış giriş açarı istifadə edilsin?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanmış parol istifadə edilsin?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə <xliff:g id="USERNAME">%2$s</xliff:g> ilə daxil olmaq üçün ekran kilidindən istifadə edin"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün giriş istifadə edilsin?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün giriş seçimləri kiliddən çıxarılsın?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanmış giriş açarı seçin"</string>
diff --git a/packages/CredentialManager/res/values-b+sr+Latn/strings.xml b/packages/CredentialManager/res/values-b+sr+Latn/strings.xml
index c4111e4..390c774 100644
--- a/packages/CredentialManager/res/values-b+sr+Latn/strings.xml
+++ b/packages/CredentialManager/res/values-b+sr+Latn/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Kako se krećemo ka budućnosti bez lozinki, lozinke će i dalje biti dostupne uz pristupne kodove."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Odaberite gde ćete sačuvati: <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Izaberite menadžera lozinki da biste sačuvali podatke i brže se prijavili sledeći put"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Želite da napravite pristupni ključ da biste se prijavili u <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Želite da sačuvate lozinku da biste se prijavili u <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Želite da sačuvate podatke za prijavljivanje za: <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Želite da napravite pristupni ključ da biste se prijavili u <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Želite da sačuvate lozinku da biste se prijavili u <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Želite da sačuvate podatke za prijavljivanje za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"pristupni kôd"</string>
     <string name="password" msgid="6738570945182936667">"lozinka"</string>
     <string name="passkeys" msgid="5733880786866559847">"pristupni kodovi"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Odbaci"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Želite da koristite sačuvani pristupni kôd za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Želite da koristite sačuvanu lozinku za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Koristite otključavanje ekrana da biste se prijavili u <xliff:g id="APP_NAME">%1$s</xliff:g> kao <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Želite li da koristite svoje podatke za prijavljivanje za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Želite da otključate opcije prijavljivanja za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Izaberite sačuvan pristupni ključ za: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-be/strings.xml b/packages/CredentialManager/res/values-be/strings.xml
index f970d16a..6922e70 100644
--- a/packages/CredentialManager/res/values-be/strings.xml
+++ b/packages/CredentialManager/res/values-be/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Хоць мы ўжо рухаемся ў бок будучыні без выкарыстання пароляў, яны па-ранейшаму застануцца даступнымі нароўні з ключамі доступу."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Выберыце, куды захаваць <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Выберыце менеджар пароляў, каб захаваць свае даныя і забяспечыць хуткі ўваход у наступныя разы"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Стварыць ключ доступу для ўваходу ў праграму \"<xliff:g id="APPNAME">%1$s</xliff:g>\"?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Захаваць пароль для ўваходу ў праграму \"<xliff:g id="APPNAME">%1$s</xliff:g>\"?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Захаваць інфармацыю пра спосаб уваходу ў праграму \"<xliff:g id="APPNAME">%1$s</xliff:g>\"?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Стварыць ключ доступу для ўваходу ў праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Захаваць пароль для ўваходу ў праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Захаваць даныя для ўваходу ў праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
     <string name="passkey" msgid="632353688396759522">"ключ доступу"</string>
     <string name="password" msgid="6738570945182936667">"пароль"</string>
     <string name="passkeys" msgid="5733880786866559847">"ключы доступу"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Закрыць"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Скарыстаць захаваны ключ доступу для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Выкарыстоўваць пароль, захаваны для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Выкарыстайце сродак разблакіроўкі экрана для ўваходу ў праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" як <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Скарыстаць ваш спосаб уваходу для праграмы <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Разблакіраваць варыянты ўваходу для праграмы\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Выберыце захаваны ключ доступу для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
diff --git a/packages/CredentialManager/res/values-bg/strings.xml b/packages/CredentialManager/res/values-bg/strings.xml
index e3758ea3..3d33c8f 100644
--- a/packages/CredentialManager/res/values-bg/strings.xml
+++ b/packages/CredentialManager/res/values-bg/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Паролите ще продължат да са налице заедно с ключовете за достъп по пътя ни към бъдеще без пароли."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Изберете къде да запазите своите <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Изберете мениджър на пароли, в който да се запазят данните ви, така че следващия път да влезете по-бързо в профила си"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Искате ли да създадете ключ за достъп, с който да влизате в(ъв) <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Искате ли да запазите паролата, за да влизате в(ъв) <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Да се запазят ли данните за вход за <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Искате ли да създадете ключ за достъп, с който да влизате в(ъв) <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Искате ли да запазите паролата за влизане в(ъв) <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Искате ли да запазите данните за вход за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"код за достъп"</string>
     <string name="password" msgid="6738570945182936667">"парола"</string>
     <string name="passkeys" msgid="5733880786866559847">"ключове за достъп"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Отхвърляне"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Да се използва ли запазеният ви код за достъп за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Искате ли да използвате запазената си парола за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Използвайте опцията си за заключване на екрана, за да влизате в(ъв) <xliff:g id="APP_NAME">%1$s</xliff:g> с профила <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Да се използват ли вашите данни за вход за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Искате ли да отключите опциите за влизане в профила за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Изберете запазен ключ за достъп за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-bn/strings.xml b/packages/CredentialManager/res/values-bn/strings.xml
index b6f9a88..fe42ed6 100644
--- a/packages/CredentialManager/res/values-bn/strings.xml
+++ b/packages/CredentialManager/res/values-bn/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"আমরা পাসওয়ার্ডবিহীন ভবিষ্যতের দিকে এগিয়ে গেলেও, এখনও \'পাসকী\'-এর পাশাপাশি পাসওয়ার্ড ব্যবহার করা যাবে।"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"আপনার <xliff:g id="CREATETYPES">%1$s</xliff:g> কোথায় সেভ করবেন তা বেছে নিন"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"আপনার তথ্য সেভ করতে একটি Password Manager বেছে নিন এবং পরের বার আরও দ্রুত সাইন-ইন করুন"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> অ্যাপে সাইন-ইন করার জন্য পাসকী তৈরি করবেন?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> অ্যাপে সাইন-ইন করার জন্য পাসওয়ার্ড সেভ করবেন?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g>-এর জন্য সাইন-ইন সংক্রান্ত তথ্য সেভ করবেন?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপে সাইন-ইন করার জন্য পাসকী তৈরি করবেন?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপে সাইন-ইন করার জন্য পাসওয়ার্ড সেভ করবেন?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপের জন্য সাইন-ইন সংক্রান্ত তথ্য সেভ করবেন?"</string>
     <string name="passkey" msgid="632353688396759522">"পাসকী"</string>
     <string name="password" msgid="6738570945182936667">"পাসওয়ার্ড"</string>
     <string name="passkeys" msgid="5733880786866559847">"পাসকী"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"বাতিল করুন"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য আপনার সেভ করা পাসকী ব্যবহার করবেন?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"আপনার সেভ করা পাসওয়ার্ড <xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য ব্যবহার করবেন?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"আপনার স্ক্রিন লক ব্যবহার করে <xliff:g id="USERNAME">%2$s</xliff:g>-এর মাধ্যমে <xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপে সাইন-ইন করুন"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য আপনার সাইন-ইন ক্রেডেনশিয়াল ব্যবহার করবেন?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য সাইন-ইন করার বিকল্প আনলক করতে চান?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য সেভ করা পাসকী বেছে নিন"</string>
diff --git a/packages/CredentialManager/res/values-bs/strings.xml b/packages/CredentialManager/res/values-bs/strings.xml
index 6c00ac0..f6e6d811 100644
--- a/packages/CredentialManager/res/values-bs/strings.xml
+++ b/packages/CredentialManager/res/values-bs/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Kako se krećemo prema budućnosti bez lozinki, lozinke će i dalje biti dostupne uz pristupne ključeve."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Odaberite gdje će se pohranjivati <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Odaberite upravitelja lozinki da sačuvate svoje informacije i brže se prijavite sljedeći put"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Kreirati pristupni ključ da se prijavite u aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Sačuvati lozinku da se prijavite u aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Sačuvati informacije o prijavi za aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Kreirati pristupni ključ da se prijavite u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Sačuvati lozinku da se prijavite u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Sačuvati podatke za prijavu u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"pristupni ključ"</string>
     <string name="password" msgid="6738570945182936667">"lozinka"</string>
     <string name="passkeys" msgid="5733880786866559847">"pristupni ključevi"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Odbacivanje"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Koristiti sačuvani pristupni ključ za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Koristiti sačuvanu lozinku za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Koristite zaključavanje ekrana da se prijavite u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> s korisničkim imenom <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Koristiti prijavu za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Otključati opcije prijave za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Odaberite sačuvani pristupni ključ za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ca/strings.xml b/packages/CredentialManager/res/values-ca/strings.xml
index 0d0850f..3809d92 100644
--- a/packages/CredentialManager/res/values-ca/strings.xml
+++ b/packages/CredentialManager/res/values-ca/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Tot i que avancem cap a un futur sense contrasenyes, continuaran estant disponibles juntament amb les claus d\'accés."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Tria on vols desar les <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecciona un gestor de contrasenyes per desar la teva informació i iniciar la sessió més ràpidament la pròxima vegada"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Vols crear una clau d\'accés per iniciar la sessió a <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Vols desar la contrasenya per iniciar la sessió a <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Vols desar la informació d\'inici de sessió per a <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Vols crear una clau d\'accés per iniciar la sessió a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Vols desar la contrasenya per iniciar la sessió a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Vols desar la informació d\'inici de sessió per a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"clau d\'accés"</string>
     <string name="password" msgid="6738570945182936667">"contrasenya"</string>
     <string name="passkeys" msgid="5733880786866559847">"claus d\'accés"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Ignora"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vols utilitzar la clau d\'accés desada per a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Vols utilitzar la contrasenya desada per a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Utilitza el bloqueig de pantalla per iniciar sessió a <xliff:g id="APP_NAME">%1$s</xliff:g> amb <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Vols utilitzar el teu inici de sessió per a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vols desbloquejar les opcions d\'inici de sessió per a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Tria una clau d\'accés desada per a <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-cs/strings.xml b/packages/CredentialManager/res/values-cs/strings.xml
index d21afe7..6e6857c 100644
--- a/packages/CredentialManager/res/values-cs/strings.xml
+++ b/packages/CredentialManager/res/values-cs/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Ačkoliv směřujeme k budoucnosti bez hesel, vedle přístupových klíčů budou stále k dispozici i hesla."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Určete, kam ukládat <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Vyberte správce hesel k uložení svých údajů, abyste se příště mohli přihlásit rychleji"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Vytvořit přístupový klíč k přihlašování do aplikace <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Uložit heslo k přihlašování do aplikace <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Uložit přihlašovací údaje pro aplikaci <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Vytvořit přístupový klíč k přihlašování do aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Uložit heslo k přihlašování do aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Uložit přihlašovací údaje pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"přístupový klíč"</string>
     <string name="password" msgid="6738570945182936667">"heslo"</string>
     <string name="passkeys" msgid="5733880786866559847">"přístupové klíče"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Zavřít"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Použít uložený přístupový klíč pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Použít pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> uložené heslo?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Přihlašovat se do aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> uživatelským jménem <xliff:g id="USERNAME">%2$s</xliff:g> pomocí zámku obrazovky"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Použít přihlášení pro <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Odemknout možnosti přihlášení pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Vyberte uložený přístupový klíč pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-da/strings.xml b/packages/CredentialManager/res/values-da/strings.xml
index c868a4b..ae7c3cf 100644
--- a/packages/CredentialManager/res/values-da/strings.xml
+++ b/packages/CredentialManager/res/values-da/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Selvom vi nærmer os en fremtid, hvor adgangskoder er mindre fremtrædende, kan de stadig bruges i samspil med adgangsnøgler."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Vælg, hvor du vil gemme dine <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Vælg en adgangskodeadministrator for at gemme dine oplysninger, så du kan logge ind hurtigere næste gang"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Vil du oprette en adgangsnøgle for at logge ind på <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Vil du gemme adgangskoden for at logge ind på <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Vil du gemme loginoplysningerne til <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Vil du oprette en adgangsnøgle for at logge ind på <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Vil du gemme adgangskoden for at logge ind på <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Vil du gemme loginoplysningerne til <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"adgangsnøgle"</string>
     <string name="password" msgid="6738570945182936667">"adgangskode"</string>
     <string name="passkeys" msgid="5733880786866559847">"adgangsnøgler"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Luk"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vil du bruge din gemte adgangsnøgle til <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Vil du bruge din gemte adgangskode til <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Brug din skærmlås til at logge ind på <xliff:g id="APP_NAME">%1$s</xliff:g> med <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Vil du bruge dine loginoplysninger til <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vil du låse enheden op for at se loginmetoder for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Vælg en gemt adgangsnøgle til <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-de/strings.xml b/packages/CredentialManager/res/values-de/strings.xml
index 4fba522..4fa669b 100644
--- a/packages/CredentialManager/res/values-de/strings.xml
+++ b/packages/CredentialManager/res/values-de/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Auch wenn wir uns auf eine passwortlose Zukunft zubewegen, werden neben Passkeys weiter Passwörter verfügbar sein."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Wähle aus, wo deine <xliff:g id="CREATETYPES">%1$s</xliff:g> gespeichert werden sollen"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Du kannst einen Passwortmanager auswählen, um deine Anmeldedaten zu speichern, damit du dich nächstes Mal schneller anmelden kannst"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Passkey zur Anmeldung in <xliff:g id="APPNAME">%1$s</xliff:g> erstellen?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Passwort zur Anmeldung in <xliff:g id="APPNAME">%1$s</xliff:g> speichern?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Anmeldedaten für <xliff:g id="APPNAME">%1$s</xliff:g> speichern?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Passkey zur Anmeldung in <xliff:g id="APP_NAME">%1$s</xliff:g> erstellen?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Passwort zur Anmeldung in <xliff:g id="APP_NAME">%1$s</xliff:g> speichern?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Anmeldedaten für <xliff:g id="APP_NAME">%1$s</xliff:g> speichern?"</string>
     <string name="passkey" msgid="632353688396759522">"Passkey"</string>
     <string name="password" msgid="6738570945182936667">"Passwort"</string>
     <string name="passkeys" msgid="5733880786866559847">"Passkeys"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Schließen"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gespeicherten Passkey für <xliff:g id="APP_NAME">%1$s</xliff:g> verwenden?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Soll dein gespeichertes Passwort für <xliff:g id="APP_NAME">%1$s</xliff:g> verwendet werden?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Du kannst die Displaysperre verwenden, um dich in <xliff:g id="APP_NAME">%1$s</xliff:g> als <xliff:g id="USERNAME">%2$s</xliff:g> anzumelden"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Anmeldedaten für <xliff:g id="APP_NAME">%1$s</xliff:g> verwenden?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Anmeldeoptionen für <xliff:g id="APP_NAME">%1$s</xliff:g> freischalten?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Einen gespeicherten Passkey für <xliff:g id="APP_NAME">%1$s</xliff:g> auswählen"</string>
diff --git a/packages/CredentialManager/res/values-el/strings.xml b/packages/CredentialManager/res/values-el/strings.xml
index ad6a424..b6b2728 100644
--- a/packages/CredentialManager/res/values-el/strings.xml
+++ b/packages/CredentialManager/res/values-el/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Καθώς κινούμαστε προς ένα μέλλον χωρίς κωδικούς πρόσβασης, οι κωδικοί πρόσβασης θα εξακολουθούν να είναι διαθέσιμοι μαζί με τα κλειδιά πρόσβασης."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Επιλέξτε πού θα αποθηκεύονται τα <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Επιλέξτε ένα πρόγραμμα διαχείρισης κωδικών πρόσβασης για να αποθηκεύσετε τα στοιχεία σας και να συνδεθείτε πιο γρήγορα την επόμενη φορά."</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Δημιουργία κλειδιού πρόσβασης για σύνδεση στην εφαρμογή <xliff:g id="APPNAME">%1$s</xliff:g>;"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Αποθήκευση κωδικού πρόσβασης για σύνδεση στην εφαρμογή <xliff:g id="APPNAME">%1$s</xliff:g>;"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Αποθήκευση στοιχείων σύνδεσης για <xliff:g id="APPNAME">%1$s</xliff:g>;"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Δημιουργία κλειδιού πρόσβασης για σύνδεση στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Αποθήκευση κωδικού πρόσβασης για σύνδεση στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Αποθήκευση πληροφοριών σύνδεσης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
     <string name="passkey" msgid="632353688396759522">"κλειδί πρόσβασης"</string>
     <string name="password" msgid="6738570945182936667">"κωδικός πρόσβασης"</string>
     <string name="passkeys" msgid="5733880786866559847">"κλειδιά πρόσβασης"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Παράβλεψη"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Να χρησιμοποιηθεί το αποθηκευμένο κλειδί πρόσβασης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Χρήση του αποθηκευμένου κωδικού πρόσβασης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Χρησιμοποιήστε το κλείδωμα οθόνης για να συνδεθείτε στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> με το όνομα χρήστη <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Χρήση της σύνδεσής σας για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Ξεκλείδωμα των επιλογών σύνδεσης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Επιλογή αποθηκευμένου κλειδιού πρόσβασης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-en-rAU/strings.xml b/packages/CredentialManager/res/values-en-rAU/strings.xml
index 6aa1b5e..f177cf9 100644
--- a/packages/CredentialManager/res/values-en-rAU/strings.xml
+++ b/packages/CredentialManager/res/values-en-rAU/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Create passkey to sign in to <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Save password to sign in to <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Save sign-in info for <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Create passkey to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Save password to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Save sign-in info for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"passkey"</string>
     <string name="password" msgid="6738570945182936667">"password"</string>
     <string name="passkeys" msgid="5733880786866559847">"passkeys"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dismiss"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Use your saved password for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use your screen lock to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g> with <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Use your sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Unlock sign-in options for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choose a saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-en-rCA/strings.xml b/packages/CredentialManager/res/values-en-rCA/strings.xml
index 10d95993..df4cd86 100644
--- a/packages/CredentialManager/res/values-en-rCA/strings.xml
+++ b/packages/CredentialManager/res/values-en-rCA/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Create passkey to sign in to <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Save password to sign in to <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Save sign-in info for <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Create passkey to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Save password to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Save sign-in info for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"passkey"</string>
     <string name="password" msgid="6738570945182936667">"password"</string>
     <string name="passkeys" msgid="5733880786866559847">"passkeys"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dismiss"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Use your saved password for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use your screen lock to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g> with <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Use your sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Unlock sign-in options for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choose a saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-en-rGB/strings.xml b/packages/CredentialManager/res/values-en-rGB/strings.xml
index 6aa1b5e..f177cf9 100644
--- a/packages/CredentialManager/res/values-en-rGB/strings.xml
+++ b/packages/CredentialManager/res/values-en-rGB/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Create passkey to sign in to <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Save password to sign in to <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Save sign-in info for <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Create passkey to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Save password to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Save sign-in info for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"passkey"</string>
     <string name="password" msgid="6738570945182936667">"password"</string>
     <string name="passkeys" msgid="5733880786866559847">"passkeys"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dismiss"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Use your saved password for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use your screen lock to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g> with <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Use your sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Unlock sign-in options for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choose a saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-en-rIN/strings.xml b/packages/CredentialManager/res/values-en-rIN/strings.xml
index 6aa1b5e..f177cf9 100644
--- a/packages/CredentialManager/res/values-en-rIN/strings.xml
+++ b/packages/CredentialManager/res/values-en-rIN/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Create passkey to sign in to <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Save password to sign in to <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Save sign-in info for <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Create passkey to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Save password to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Save sign-in info for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"passkey"</string>
     <string name="password" msgid="6738570945182936667">"password"</string>
     <string name="passkeys" msgid="5733880786866559847">"passkeys"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dismiss"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Use your saved password for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use your screen lock to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g> with <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Use your sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Unlock sign-in options for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choose a saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-en-rXC/strings.xml b/packages/CredentialManager/res/values-en-rXC/strings.xml
index 16c0d1d..77ae53a 100644
--- a/packages/CredentialManager/res/values-en-rXC/strings.xml
+++ b/packages/CredentialManager/res/values-en-rXC/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‏‎As we move towards a passwordless future, passwords will still be available alongside passkeys.‎‏‎‎‏‎"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‏‏‎‎‎Choose where to save your ‎‏‎‎‏‏‎<xliff:g id="CREATETYPES">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‎‎‏‎‏‎‏‎‎Select a password manager to save your info and sign in faster next time‎‏‎‎‏‎"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‏‎‎‏‎‎‏‏‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‏‎Create passkey to sign in to ‎‏‎‎‏‏‎<xliff:g id="APPNAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎‎‎Save password to sign in to ‎‏‎‎‏‏‎<xliff:g id="APPNAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‎‎‎‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎Save sign-in info for ‎‏‎‎‏‏‎<xliff:g id="APPNAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‎‏‏‏‏‏‎Create passkey to sign in to ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‎‎‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‎‎‎Save password to sign in to ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‎Save sign-in info for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
     <string name="passkey" msgid="632353688396759522">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‎passkey‎‏‎‎‏‎"</string>
     <string name="password" msgid="6738570945182936667">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‏‏‎‏‏‎‏‎‎‏‎‎‏‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‏‏‎password‎‏‎‎‏‎"</string>
     <string name="passkeys" msgid="5733880786866559847">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‏‎‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎passkeys‎‏‎‎‏‎"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‎Dismiss‎‏‎‎‏‎"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎Use your saved passkey for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‎‏‎‏‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‎‎‎Use your saved password for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‎Use your screen lock to sign in to ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ with ‎‏‎‎‏‏‎<xliff:g id="USERNAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎‎‏‎‎‎‎‎‏‏‎‎‎‏‎‎‏‎Use your sign-in for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‏‏‎‎‏‎‏‎‏‎‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎Unlock sign-in options for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‏‎‏‎‎Choose a saved passkey for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
diff --git a/packages/CredentialManager/res/values-es-rUS/strings.xml b/packages/CredentialManager/res/values-es-rUS/strings.xml
index 6bab1ae..6ccfec3 100644
--- a/packages/CredentialManager/res/values-es-rUS/strings.xml
+++ b/packages/CredentialManager/res/values-es-rUS/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"A medida que avanzamos hacia un futuro sin contraseñas, estas seguirán estando disponibles junto a las llaves de acceso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Elige dónde guardar tus <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecciona un administrador de contraseñas para guardar tu información y acceder más rápido la próxima vez"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"¿Quieres crear una llave de acceso para acceder a <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"¿Quieres guardar la contraseña para acceder a <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"¿Quieres guardar la información de acceso para <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"¿Quieres crear una llave de acceso para acceder a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"¿Quieres guardar la contraseña para acceder a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"¿Quieres guardar la información de acceso para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"llave de acceso"</string>
     <string name="password" msgid="6738570945182936667">"contraseña"</string>
     <string name="passkeys" msgid="5733880786866559847">"llaves de acceso"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Descartar"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"¿Quieres usar tu llave de acceso guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"¿Quieres usar la contraseña guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Usar el bloqueo de pantalla para acceder a <xliff:g id="APP_NAME">%1$s</xliff:g> con <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"¿Quieres usar tu acceso para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"¿Quieres desbloquear las opciones de acceso para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Elige una llave de acceso guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-es/strings.xml b/packages/CredentialManager/res/values-es/strings.xml
index a727f458..b2c1c6f 100644
--- a/packages/CredentialManager/res/values-es/strings.xml
+++ b/packages/CredentialManager/res/values-es/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Aunque nos dirigimos hacia un mundo sin contraseñas, estas seguirán estando disponibles junto con las llaves de acceso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Elige dónde guardar tus <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecciona un gestor de contraseñas para guardar tu información e iniciar sesión más rápido la próxima vez"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"¿Crear llave de acceso para iniciar sesión en <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"¿Guardar contraseña para iniciar sesión en <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"¿Guardar la información de inicio de sesión de <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"¿Crear llave de acceso para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"¿Guardar contraseña para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"¿Guardar la información de inicio de sesión de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"llave de acceso"</string>
     <string name="password" msgid="6738570945182936667">"contraseña"</string>
     <string name="passkeys" msgid="5733880786866559847">"llaves de acceso"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Cerrar"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"¿Usar la llave de acceso guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"¿Usar la contraseña que tienes guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Usa tu bloqueo de pantalla para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g> con el usuario <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"¿Usar tu inicio de sesión en <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"¿Desbloquear las opciones de inicio de sesión de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Elige una llave de acceso guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-et/strings.xml b/packages/CredentialManager/res/values-et/strings.xml
index 2727612..823a016 100644
--- a/packages/CredentialManager/res/values-et/strings.xml
+++ b/packages/CredentialManager/res/values-et/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Liikudes paroolivaba tuleviku poole, jäävad paroolid pääsuvõtmete kõrval siiski kättesaadavaks."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Valige, kuhu soovite oma <xliff:g id="CREATETYPES">%1$s</xliff:g> salvestada"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Valige paroolihaldur, et salvestada oma teave ja järgmisel korral kiiremini sisse logida"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Kas luua rakendusse <xliff:g id="APPNAME">%1$s</xliff:g> sisselogimiseks pääsuvõti?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Kas salvestada rakendusse <xliff:g id="APPNAME">%1$s</xliff:g> sisselogimiseks parool?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Kas salvestada rakenduse <xliff:g id="APPNAME">%1$s</xliff:g> jaoks sisselogimisandmed?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Kas luua rakendusse <xliff:g id="APP_NAME">%1$s</xliff:g> sisselogimiseks pääsuvõti?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Kas salvestada rakendusse <xliff:g id="APP_NAME">%1$s</xliff:g> sisselogimiseks parool?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Kas salvestada rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks sisselogimisteave?"</string>
     <string name="passkey" msgid="632353688396759522">"pääsuvõti"</string>
     <string name="password" msgid="6738570945182936667">"parool"</string>
     <string name="passkeys" msgid="5733880786866559847">"pääsuvõtmed"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Loobu"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Kas kasutada rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks salvestatud pääsuvõtit?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Kas kasutada rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> puhul salvestatud parooli?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Kasutage rakendusse <xliff:g id="APP_NAME">%1$s</xliff:g> kasutajanimega <xliff:g id="USERNAME">%2$s</xliff:g> sisselogimiseks ekraanilukku"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Kas soovite rakendusse <xliff:g id="APP_NAME">%1$s</xliff:g> sisselogimiseks kasutada oma mandaati?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Kas avada rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks sisselogimisvalikud?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Valige rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks salvestatud pääsuvõti"</string>
diff --git a/packages/CredentialManager/res/values-eu/strings.xml b/packages/CredentialManager/res/values-eu/strings.xml
index f0debcc..8507b3f 100644
--- a/packages/CredentialManager/res/values-eu/strings.xml
+++ b/packages/CredentialManager/res/values-eu/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Pasahitzik gabeko etorkizun baterantz goazen arren, pasahitzek sarbide-gakoen bizikide izaten jarraituko dute."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Aukeratu non gorde <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Hautatu informazioa gordetzeko pasahitz-kudeatzaile bat eta hasi saioa bizkorrago hurrengoan"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> aplikazioan saioa hasteko sarbide-gako bat sortu nahi duzu?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> aplikazioan saioa hasteko pasahitza gorde nahi duzu?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> aplikazioko saioa hasteko informazioa gorde nahi duzu?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioan saioa hasteko sarbide-gako bat sortu nahi duzu?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioan saioa hasteko pasahitza gorde nahi duzu?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioan saioa hasteko informazioa gorde nahi duzu?"</string>
     <string name="passkey" msgid="632353688396759522">"sarbide-gakoa"</string>
     <string name="password" msgid="6738570945182936667">"pasahitza"</string>
     <string name="passkeys" msgid="5733880786866559847">"sarbide-gakoak"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Baztertu"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gorde duzun sarbide-gakoa erabili nahi duzu?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gordetako pasahitza erabili nahi duzu?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Erabili pantailaren blokeoa <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioan <xliff:g id="USERNAME">%2$s</xliff:g> kontuarekin saioa hasteko"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> zerbitzuan saioa hasteko kredentzialak erabili nahi dituzu?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioan saioa hasteko aukerak desblokeatu nahi dituzu?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Aukeratu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gordetako sarbide-gakoa"</string>
diff --git a/packages/CredentialManager/res/values-fa/strings.xml b/packages/CredentialManager/res/values-fa/strings.xml
index a88b353..656c789 100644
--- a/packages/CredentialManager/res/values-fa/strings.xml
+++ b/packages/CredentialManager/res/values-fa/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"درحالی‌که به‌سوی آینده‌ای بی‌گذرواژه حرکت می‌کنیم، گذرواژه‌ها همچنان در کنار گذرکلیدها دردسترس خواهند بود"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"جایی را برای ذخیره کردن <xliff:g id="CREATETYPES">%1$s</xliff:g> انتخاب کنید"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"مدیر گذرواژه‌ای انتخاب کنید تا اطلاعاتتان را ذخیره کنید و دفعه بعد سریع‌تر به سیستم وارد شوید"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"برای ورود به سیستم <xliff:g id="APPNAME">%1$s</xliff:g>، گذرکلید ایجاد شود؟"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"برای ورود به سیستم <xliff:g id="APPNAME">%1$s</xliff:g>، گذرواژه ذخیره شود؟"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"اطلاعات ورود به سیستم <xliff:g id="APPNAME">%1$s</xliff:g> ذخیره شود؟"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"برای ورود به سیستم <xliff:g id="APP_NAME">%1$s</xliff:g>، گذرکلید ایجاد شود؟"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"برای ورود به سیستم <xliff:g id="APP_NAME">%1$s</xliff:g>، گذرواژه ذخیره شود؟"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"اطلاعات ورود به سیستم <xliff:g id="APP_NAME">%1$s</xliff:g> ذخیره شود؟"</string>
     <string name="passkey" msgid="632353688396759522">"گذرکلید"</string>
     <string name="password" msgid="6738570945182936667">"گذرواژه"</string>
     <string name="passkeys" msgid="5733880786866559847">"گذرکلیدها"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"بستن"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"از گذرکلید ذخیره‌شده برای «<xliff:g id="APP_NAME">%1$s</xliff:g>» استفاده شود؟"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"از گذرواژه ذخیره‌شده‌تان برای <xliff:g id="APP_NAME">%1$s</xliff:g> استفاده شود؟"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"برای ورود به سیستم <xliff:g id="APP_NAME">%1$s</xliff:g> با <xliff:g id="USERNAME">%2$s</xliff:g> از قفل صفحه استفاده کنید"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"از روش ورود به سیستم شما برای <xliff:g id="APP_NAME">%1$s</xliff:g> استفاده شود؟"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"گزینه‌های ورود به سیستم برای <xliff:g id="APP_NAME">%1$s</xliff:g> باز شود؟"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"گذرکلید ذخیره‌شده‌ای را برای <xliff:g id="APP_NAME">%1$s</xliff:g> انتخاب کنید"</string>
diff --git a/packages/CredentialManager/res/values-fi/strings.xml b/packages/CredentialManager/res/values-fi/strings.xml
index 82af70f..f2f1bfb 100644
--- a/packages/CredentialManager/res/values-fi/strings.xml
+++ b/packages/CredentialManager/res/values-fi/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Kehitys kulkee kohti salasanatonta tulevaisuutta, mutta salasanat ovat edelleen käytettävissä avainkoodien ohella."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Valitse, minne <xliff:g id="CREATETYPES">%1$s</xliff:g> tallennetaan"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Valitse salasanojen ylläpitotyökalu, niin voit tallentaa tietosi ja kirjautua ensi kerralla nopeammin sisään"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Luodaanko avainkoodi sisäänkirjautumista (<xliff:g id="APPNAME">%1$s</xliff:g>) varten?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Tallennetaanko salasana sisäänkirjautumista (<xliff:g id="APPNAME">%1$s</xliff:g>) varten?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Tallennetaanko kirjautumistiedot (<xliff:g id="APPNAME">%1$s</xliff:g>)?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Luodaanko avainkoodi sisäänkirjautumista (<xliff:g id="APP_NAME">%1$s</xliff:g>) varten?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Tallennetaanko salasana sisäänkirjautumista (<xliff:g id="APP_NAME">%1$s</xliff:g>) varten?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Tallennetaanko kirjautumistiedot (<xliff:g id="APP_NAME">%1$s</xliff:g>)?"</string>
     <string name="passkey" msgid="632353688396759522">"avainkoodi"</string>
     <string name="password" msgid="6738570945182936667">"salasana"</string>
     <string name="passkeys" msgid="5733880786866559847">"avainkoodit"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Sulje"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Käytetäänkö tallennettua avainkoodiasi täällä: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Käytetäänkö tallennettua salasanaasi sovelluksessa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Kirjaudu sisään (<xliff:g id="APP_NAME">%1$s</xliff:g>) käyttämällä näytön lukitusta tilillä <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Käytetäänkö kirjautumistapaa: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Avataanko kirjautumisvaihtoehdot (<xliff:g id="APP_NAME">%1$s</xliff:g>)?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g>: valitse tallennettu avainkoodi"</string>
diff --git a/packages/CredentialManager/res/values-fr-rCA/strings.xml b/packages/CredentialManager/res/values-fr-rCA/strings.xml
index 61f2204..891e987 100644
--- a/packages/CredentialManager/res/values-fr-rCA/strings.xml
+++ b/packages/CredentialManager/res/values-fr-rCA/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"À mesure que nous nous dirigeons vers un avenir sans mot de passe, ils resteront toujours utilisés parallèlement aux clés d\'accès."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Choisir où enregistrer vos <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Sélectionnez un gestionnaire de mots de passe pour enregistrer vos renseignements et vous connecter plus rapidement la prochaine fois"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Créer une clé d\'accès pour se connecter à <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Enregistrer un mot de passe pour se connecter à <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Enregistrer les renseignements de connexion pour <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Créer une clé d\'accès pour se connecter à <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Enregistrer un mot de passe pour se connecter à <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Enregistrer les renseignements de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"clé d\'accès"</string>
     <string name="password" msgid="6738570945182936667">"mot de passe"</string>
     <string name="passkeys" msgid="5733880786866559847">"clés d\'accès"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Fermer"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Utiliser votre clé d\'accès enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Utiliser votre mot de passe enregistré pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Utilisez votre verrouillage d\'écran pour vous connecter à <xliff:g id="APP_NAME">%1$s</xliff:g> avec <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Utiliser votre identifiant de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Déverrouiller les options de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choisissez une clé d\'accès enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-fr/strings.xml b/packages/CredentialManager/res/values-fr/strings.xml
index 15715f3..f2ca1fc 100644
--- a/packages/CredentialManager/res/values-fr/strings.xml
+++ b/packages/CredentialManager/res/values-fr/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Nous nous dirigeons vers un futur sans mots de passe, mais ceux-ci resteront disponibles en plus des clés d\'accès."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Choisissez où enregistrer vos <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Sélectionnez un gestionnaire de mots de passe pour enregistrer vos informations et vous connecter plus rapidement la prochaine fois"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Créer une clé d\'accès pour se connecter à <xliff:g id="APPNAME">%1$s</xliff:g> ?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Enregistrer un mot de passe pour se connecter à <xliff:g id="APPNAME">%1$s</xliff:g> ?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Enregistrer les informations de connexion pour <xliff:g id="APPNAME">%1$s</xliff:g> ?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Créer une clé d\'accès pour se connecter à <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Enregistrer un mot de passe pour se connecter à <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Enregistrer les informations de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
     <string name="passkey" msgid="632353688396759522">"clé d\'accès"</string>
     <string name="password" msgid="6738570945182936667">"mot de passe"</string>
     <string name="passkeys" msgid="5733880786866559847">"clés d\'accès"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Fermer"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Utiliser votre clé d\'accès enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Utiliser votre mot de passe enregistré pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Utiliser le verrouillage de l\'écran pour se connecter à <xliff:g id="APP_NAME">%1$s</xliff:g> avec <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Utiliser vos infos de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Déverrouiller les options de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choisir une clé d\'accès enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-gl/strings.xml b/packages/CredentialManager/res/values-gl/strings.xml
index 1ca0774..7117e1c 100644
--- a/packages/CredentialManager/res/values-gl/strings.xml
+++ b/packages/CredentialManager/res/values-gl/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Durante este percorrido cara a un futuro sen contrasinais, estes seguirán estando dispoñibles a canda as claves de acceso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Escolle onde queres gardar: <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecciona un xestor de contrasinais para gardar a túa información e iniciar sesión máis rápido a próxima vez"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Queres crear unha clave de acceso para iniciar sesión en <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Queres gardar o contrasinal para iniciar sesión en <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Queres gardar a información de inicio de sesión de <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Queres crear unha clave de acceso para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Queres gardar o contrasinal para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Queres gardar a información de inicio de sesión de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"clave de acceso"</string>
     <string name="password" msgid="6738570945182936667">"contrasinal"</string>
     <string name="passkeys" msgid="5733880786866559847">"claves de acceso"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Pechar"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Queres usar a clave de acceso gardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Queres usar o contrasinal gardado para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Usa o bloqueo de pantalla para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g> con <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Queres usar o teu inicio de sesión para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Queres desbloquear as opcións de inicio de sesión para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Escolle unha clave de acceso gardada para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-gu/strings.xml b/packages/CredentialManager/res/values-gu/strings.xml
index 7d8df9a..98b4686 100644
--- a/packages/CredentialManager/res/values-gu/strings.xml
+++ b/packages/CredentialManager/res/values-gu/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"આપણે પાસવર્ડ રહિત ભવિષ્ય તરફ આગળ વધી રહ્યાં છીએ, છતાં પાસકીની સાથોસાથ હજી પણ પાસવર્ડ ઉપલબ્ધ રહેશે."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"તમારી <xliff:g id="CREATETYPES">%1$s</xliff:g> ક્યાં સાચવવી તે પસંદ કરો"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"તમારી માહિતી સાચવવા માટે પાસવર્ડ મેનેજર પસંદ કરો અને આગલી વખતે વધુ ઝડપથી સાઇન ઇન કરો"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g>માં સાઇન ઇન કરવા માટે પાસકી બનાવીએ?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g>માં પાસવર્ડ સાચવવા માટે પાસકી બનાવીએ?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> માટે સાઇન-ઇન કરવાની માહિતી સાચવીએ?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g>માં સાઇન ઇન કરવા માટે પાસકી બનાવીએ?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g>માં સાઇન ઇન કરવા માટે પાસવર્ડ સાચવીએ?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે સાઇન-ઇન કરવાની માહિતી સાચવીએ?"</string>
     <string name="passkey" msgid="632353688396759522">"પાસકી"</string>
     <string name="password" msgid="6738570945182936667">"પાસવર્ડ"</string>
     <string name="passkeys" msgid="5733880786866559847">"પાસકી"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"છોડી દો"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે શું તમારી સાચવેલી પાસકીનો ઉપયોગ કરીએ?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"શું <xliff:g id="APP_NAME">%1$s</xliff:g> માટે તમારા સાચવેલા પાસવર્ડનો ઉપયોગ કરીએ?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> વડે <xliff:g id="APP_NAME">%1$s</xliff:g>માં સાઇન ઇન કરવા માટે તમારા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"શું <xliff:g id="APP_NAME">%1$s</xliff:g>માં સાઇન ઇન કરવા માટે તમારી આ લૉગ ઇન વિગતોનો ઉપયોગ કરીએ?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે સાઇન ઇન વિકલ્પો અનલૉક કરીએ?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે કોઈ સાચવેલી પાસકી પસંદ કરો"</string>
diff --git a/packages/CredentialManager/res/values-hi/strings.xml b/packages/CredentialManager/res/values-hi/strings.xml
index b644864..9bc5feb 100644
--- a/packages/CredentialManager/res/values-hi/strings.xml
+++ b/packages/CredentialManager/res/values-hi/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"आने वाले समय में बिना पासवर्ड वाली टेक्नोलॉजी यानी पासकी का इस्तेमाल बढ़ेगा, हालांकि इसके साथ-साथ पासवर्ड भी इस्तेमाल किए जा सकेंगे."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"चुनें कि अपनी <xliff:g id="CREATETYPES">%1$s</xliff:g> कहां सेव करनी हैं"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"अपनी जानकारी सेव करने के लिए, पासवर्ड मैनेजर चुनें और अगली बार ज़्यादा तेज़ी से साइन इन करें"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"क्या आपको <xliff:g id="APPNAME">%1$s</xliff:g> में साइन इन करने के लिए पासकी बनानी है?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"क्या आपको <xliff:g id="APPNAME">%1$s</xliff:g> में साइन इन करने के लिए पासवर्ड सेव करना है?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"क्या आपको <xliff:g id="APPNAME">%1$s</xliff:g> के लिए साइन-इन की जानकारी सेव करनी है?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के लिए पासकी बनानी है?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के लिए पासवर्ड सेव करना है?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> के लिए साइन-इन की जानकारी सेव करनी है?"</string>
     <string name="passkey" msgid="632353688396759522">"पासकी"</string>
     <string name="password" msgid="6738570945182936667">"पासवर्ड"</string>
     <string name="passkeys" msgid="5733880786866559847">"पासकी"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"खारिज करें"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> पर साइन इन करने के लिए, सेव की गई पासकी का इस्तेमाल करना है?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> के लिए सेव किया हुआ पासवर्ड इस्तेमाल करना है?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> से <xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के लिए, स्क्रीन लॉक का इस्तेमाल करें"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> के लिए अपने साइन-इन क्रेडेंशियल का इस्तेमाल करना है?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के विकल्पों को अनलॉक करना है?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> के लिए सेव की गई पासकी चुनें"</string>
diff --git a/packages/CredentialManager/res/values-hr/strings.xml b/packages/CredentialManager/res/values-hr/strings.xml
index 86d52d5..968a747 100644
--- a/packages/CredentialManager/res/values-hr/strings.xml
+++ b/packages/CredentialManager/res/values-hr/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Kako idemo u smjeru budućnosti bez zaporki, one će i dalje biti dostupne uz pristupne ključeve."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Odaberite gdje će se spremati <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Odaberite upravitelja zaporki kako biste spremili svoje informacije i drugi se put brže prijavili"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Želite li izraditi pristupni ključ za prijavu u aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Želite li spremiti zaporku za prijavu u aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Spremiti informacije o prijavi za <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Želite li izraditi pristupni ključ za prijavu u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Želite li spremiti zaporku za prijavu u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Želite li spremiti informacije o prijavi za <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"pristupni ključ"</string>
     <string name="password" msgid="6738570945182936667">"zaporka"</string>
     <string name="passkeys" msgid="5733880786866559847">"pristupni ključevi"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Odbaci"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Želite li upotrijebiti spremljeni pristupni ključ za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Želite li upotrijebiti spremljenu zaporku za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Upotrijebite zaključavanje zaslona da biste se prijavili u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> korisničkim imenom <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Želite li upotrijebiti prijavu za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Želite li otključati opcije za prijavu za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Odaberite spremljeni pristupni ključ za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-hu/strings.xml b/packages/CredentialManager/res/values-hu/strings.xml
index 539feb4..e601da6 100644
--- a/packages/CredentialManager/res/values-hu/strings.xml
+++ b/packages/CredentialManager/res/values-hu/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Miközben a jelszó nélküli jövő felé haladunk, a jelszavak továbbra is rendelkezésre állnak majd az azonosítókulcsok mellett."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Válassza ki, hogy hova szeretné menteni <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Válasszon jelszókezelőt, hogy menthesse az adatait, és gyorsabban jelentkezhessen be a következő alkalommal."</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Létrehoz azonosítókulcsot a következőbe való bejelentkezéshez: <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Menti a jelszót a következőbe való bejelentkezéshez: <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Menti a bejelentkezési adatokat a következőhöz: <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Létrehoz azonosítókulcsot a következőbe való bejelentkezéshez: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Menti a jelszót a következőbe való bejelentkezéshez: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Menti a bejelentkezési adatokat a következőhöz: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"azonosítókulcs"</string>
     <string name="password" msgid="6738570945182936667">"jelszó"</string>
     <string name="passkeys" msgid="5733880786866559847">"azonosítókulcsait"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Elvetés"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Szeretné a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz mentett azonosítókulcsot használni?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Szeretné az elmentett jelszavát használni a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"A képernyőzár használata a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazásba való bejelentkezéshez a következő felhasználónévvel: <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Szeretné használni bejelentkezési adatait a következőhöz: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Feloldja a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> bejelentkezési lehetőségeit?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Mentett azonosítókulcs kiválasztása a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz"</string>
diff --git a/packages/CredentialManager/res/values-hy/strings.xml b/packages/CredentialManager/res/values-hy/strings.xml
index 5f06a7a..79a2624 100644
--- a/packages/CredentialManager/res/values-hy/strings.xml
+++ b/packages/CredentialManager/res/values-hy/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Թեև մենք առանց գաղտնաբառերի ապագայի ճանապարհին ենք, դրանք դեռ հասանելի կլինեն անցաբառերի հետ մեկտեղ։"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Նշեք, թե որտեղ եք ուզում պահել ձեր <xliff:g id="CREATETYPES">%1$s</xliff:g>ը"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Ընտրեք գաղտնաբառերի կառավարիչ՝ ձեր տեղեկությունները պահելու և հաջորդ անգամ ավելի արագ մուտք գործելու համար"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Ստեղծե՞լ անցաբառ՝ <xliff:g id="APPNAME">%1$s</xliff:g> հավելված մուտք գործելու համար"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Պահե՞լ գաղտնաբառը՝ <xliff:g id="APPNAME">%1$s</xliff:g> հավելված մուտք գործելու համար"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Պահե՞լ «<xliff:g id="APPNAME">%1$s</xliff:g>» հավելվածի մուտքի տվյալները"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Ստեղծե՞լ անցաբառ՝ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելված մուտք գործելու համար"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Պահե՞լ գաղտնաբառը՝ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելված մուտք գործելու համար"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Պահե՞լ «<xliff:g id="APP_NAME">%1$s</xliff:g>» հավելվածի մուտքի տվյալները"</string>
     <string name="passkey" msgid="632353688396759522">"անցաբառ"</string>
     <string name="password" msgid="6738570945182936667">"գաղտնաբառ"</string>
     <string name="passkeys" msgid="5733880786866559847">"անցաբառեր"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Փակել"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Օգտագործե՞լ պահված անցաբառը <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի համար"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Օգտագործե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի համար պահված ձեր գաղտնաբառը"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Օգտագործեք ձեր էկրանի կողպումը՝ <xliff:g id="USERNAME">%2$s</xliff:g> հաշվի միջոցով <xliff:g id="APP_NAME">%1$s</xliff:g> հավելված մուտք գործելու համար"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Օգտագործե՞լ այս տվյալները <xliff:g id="APP_NAME">%1$s</xliff:g> հավելված մուտք գործելու համար"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Ապակողպե՞լ մուտքի տարբերակներ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի համար"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Ընտրեք պահված անցաբառ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի համար"</string>
diff --git a/packages/CredentialManager/res/values-in/strings.xml b/packages/CredentialManager/res/values-in/strings.xml
index ad8aeec..e7556b0 100644
--- a/packages/CredentialManager/res/values-in/strings.xml
+++ b/packages/CredentialManager/res/values-in/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Sandi akan tetap tersedia bersama kunci sandi seiring perjalanan menuju era di mana sandi tidak diperlukan lagi."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Pilih tempat penyimpanan <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Pilih pengelola sandi untuk menyimpan info Anda dan login lebih cepat lain kali"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Buat kunci sandi untuk login ke <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Simpan sandi untuk login ke <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Simpan info login untuk <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Buat kunci sandi untuk login ke <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Simpan sandi untuk login ke <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Simpan info login untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"kunci sandi"</string>
     <string name="password" msgid="6738570945182936667">"sandi"</string>
     <string name="passkeys" msgid="5733880786866559847">"kunci sandi"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Tutup"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gunakan kunci sandi tersimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Gunakan sandi tersimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Gunakan kunci layar untuk login ke <xliff:g id="APP_NAME">%1$s</xliff:g> dengan <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Gunakan login Anda untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Autentikasi opsi login untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Pilih kunci sandi tersimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-is/strings.xml b/packages/CredentialManager/res/values-is/strings.xml
index bc6bdfc..970a2e6 100644
--- a/packages/CredentialManager/res/values-is/strings.xml
+++ b/packages/CredentialManager/res/values-is/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Við stefnum að framtíð án aðgangsorða en aðgangsorð verða áfram í boði samhliða aðgangslyklum."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Veldu hvar þú vilt vista <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Veldu aðgangsorðastjórnun til að vista upplýsingarnar og vera fljótari að skrá þig inn næst"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Búa til aðgangslykil til að skrá þig inn á <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Vista aðgangsorð til að skrá þig inn á <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Viltu vista innskráningarupplýsingar fyrir <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Búa til aðgangslykil til að skrá þig inn á <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Vista aðgangsorð til að skrá þig inn á <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Viltu vista innskráningarupplýsingar fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"aðgangslykill"</string>
     <string name="password" msgid="6738570945182936667">"aðgangsorð"</string>
     <string name="passkeys" msgid="5733880786866559847">"aðgangslykla"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Hunsa"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Nota vistaðan aðgangslykil fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Nota vistaða aðgangsorðið þitt fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Notaðu skjálásinn þinn til að skrá þig inn á <xliff:g id="APP_NAME">%1$s</xliff:g> með <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Nota innskráningu fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Opna fyrir innskráningarvalkosti fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Veldu vistaðan aðgangslykil fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-it/strings.xml b/packages/CredentialManager/res/values-it/strings.xml
index 2b0d83c..a04a840 100644
--- a/packages/CredentialManager/res/values-it/strings.xml
+++ b/packages/CredentialManager/res/values-it/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Il futuro sarà senza password, ma per ora saranno ancora disponibili insieme alle passkey."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Scegli dove salvare le <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Seleziona un gestore delle password per salvare i tuoi dati e accedere più velocemente la prossima volta"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Creare passkey per accedere all\'app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Salvare password per accedere all\'app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Vuoi salvare i dati di accesso di <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Creare passkey per accedere all\'app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Salvare password per accedere all\'app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Vuoi salvare i dati di accesso di <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"passkey"</string>
     <string name="password" msgid="6738570945182936667">"password"</string>
     <string name="passkeys" msgid="5733880786866559847">"passkey"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Chiudi"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vuoi usare la passkey salvata per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Vuoi usare la password salvata per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Usa il blocco schermo per accedere a <xliff:g id="APP_NAME">%1$s</xliff:g> con <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Vuoi usare il tuo accesso per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vuoi sbloccare le opzioni di accesso per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Scegli una passkey salvata per <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-iw/strings.xml b/packages/CredentialManager/res/values-iw/strings.xml
index ee9dd5d..87dee5f 100644
--- a/packages/CredentialManager/res/values-iw/strings.xml
+++ b/packages/CredentialManager/res/values-iw/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"אנחנו מתקדמים לעבר עתיד ללא סיסמאות, אבל עדיין אפשר יהיה להשתמש בסיסמאות וגם במפתחות גישה."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"בחירת המקום לשמירה של <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"אפשר לבחור באחד משירותי ניהול הסיסמאות כדי לשמור את הפרטים ולהיכנס לחשבון מהר יותר בפעם הבאה"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"ליצור מפתח גישה כדי להיכנס לחשבון ב-<xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"לשמור את הסיסמה כדי להיכנס לחשבון ב-<xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"לשמור את פרטי הכניסה של <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"ליצור מפתח גישה כדי להיכנס לחשבון ב-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"לשמור את הסיסמה כדי להיכנס לחשבון ב-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"לשמור את פרטי הכניסה של <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"מפתח גישה"</string>
     <string name="password" msgid="6738570945182936667">"סיסמה"</string>
     <string name="passkeys" msgid="5733880786866559847">"מפתחות גישה"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"סגירה"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"להשתמש במפתח גישה שנשמר עבור <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"להשתמש בסיסמה השמורה של <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"שימוש בשיטה לביטול נעילת המסך כדי להיכנס לחשבון של <xliff:g id="USERNAME">%2$s</xliff:g> ב-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"להשתמש בחשבון שלך כדי להיכנס אל <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"לבטל את הנעילה של אפשרויות הכניסה אל <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"בחירת מפתח גישה שמור ל-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ja/strings.xml b/packages/CredentialManager/res/values-ja/strings.xml
index b60638b..71746dc 100644
--- a/packages/CredentialManager/res/values-ja/strings.xml
+++ b/packages/CredentialManager/res/values-ja/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"将来的にパスワードレスに移行するにあたり、パスワードもパスキーと並行して引き続きご利用いただけます。"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g>の保存先を選択"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"パスワード マネージャーを選択して情報を保存しておくと、次回からすばやくログインできます"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> にログインするためにパスキーを作成しますか?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> にログインするためにパスワードを保存しますか?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> のログイン情報を保存しますか?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> にログインするためにパスキーを作成しますか?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> にログインするためにパスワードを保存しますか?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> のログイン情報を保存しますか?"</string>
     <string name="passkey" msgid="632353688396759522">"パスキー"</string>
     <string name="password" msgid="6738570945182936667">"パスワード"</string>
     <string name="passkeys" msgid="5733880786866559847">"パスキー"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"閉じる"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> の保存したパスキーを使用しますか?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> の保存したパスワードを使用しますか?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"画面ロックを使用して <xliff:g id="USERNAME">%2$s</xliff:g> で <xliff:g id="APP_NAME">%1$s</xliff:g> にログインできます"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"この認証情報を使用して <xliff:g id="APP_NAME">%1$s</xliff:g> にログインしますか?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> がログイン方法を使用できるようにしますか?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> に使用するパスキーを選択してください"</string>
diff --git a/packages/CredentialManager/res/values-ka/strings.xml b/packages/CredentialManager/res/values-ka/strings.xml
index c089f4a..51f1332 100644
--- a/packages/CredentialManager/res/values-ka/strings.xml
+++ b/packages/CredentialManager/res/values-ka/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"უპაროლო მომავალში პაროლები კვლავ ხელმისაწვდომი იქნება, წვდომის გასაღებებთან ერთად."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"აირჩიეთ სად შეინახოთ თქვენი <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"აირჩიეთ პაროლების მმართველი თქვენი ინფორმაციის შესანახად, რომ მომავალში უფრო სწრაფად შეხვიდეთ."</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"შესასვლელად წვდომის გასაღების შექმნა: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"შესასვლელი პაროლის შენახვა: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"შეინახავთ <xliff:g id="APPNAME">%1$s</xliff:g> აპში შესვლის ინფორმაციას?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"შესასვლელად წვდომის გასაღების შექმნა: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"შესასვლელი პაროლის შენახვა: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"აპში შესვლის ინფორმაციის შენახვა: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="passkey" msgid="632353688396759522">"წვდომის გასაღები"</string>
     <string name="password" msgid="6738570945182936667">"პაროლი"</string>
     <string name="passkeys" msgid="5733880786866559847">"წვდომის გასაღები"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"დახურვა"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"გსურთ თქვენი დამახსოვრებული წვდომის გასაღების გამოყენება აპისთვის: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"გამოიყენებთ შენახულ პაროლს <xliff:g id="APP_NAME">%1$s</xliff:g>-სთვის?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"გამოიყენეთ თქვენი ეკრანის დაბლოკვის ფუნქცია <xliff:g id="APP_NAME">%1$s</xliff:g>-ში <xliff:g id="USERNAME">%2$s</xliff:g>-ით შესასვლელად"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"გსურთ შესვლის <xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის გამოყენება?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"გსურთ შესვლის ვარიანტების განბლოკვა <xliff:g id="APP_NAME">%1$s</xliff:g>-სთვის?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"აირჩიეთ შენახული წვდომის გასაღები <xliff:g id="APP_NAME">%1$s</xliff:g>-სთვის"</string>
diff --git a/packages/CredentialManager/res/values-kk/strings.xml b/packages/CredentialManager/res/values-kk/strings.xml
index 2200b18..7393ca0 100644
--- a/packages/CredentialManager/res/values-kk/strings.xml
+++ b/packages/CredentialManager/res/values-kk/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Құпия сөзсіз болашақ жақын болғанына қарамастан, келешекте құпия сөздерді кіру кілттерімен қатар қолдана беруге болады."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> қайда сақталатынын таңдаңыз"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Мәліметіңізді сақтап, келесіде жылдам кіру үшін құпия сөз менеджерін таңдаңыз."</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> қолданбасына кіру үшін кіру кілті жасалсын ба?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> қолданбасына кіру үшін құпия сөз сақталсын ба?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> үшін кіру мәліметін сақтау керек пе?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына кіру үшін кіру кілті жасалсын ба?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына кіру үшін құпия сөз сақталсын ба?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін кіру мәліметін сақтау керек пе?"</string>
     <string name="passkey" msgid="632353688396759522">"Кіру кілті"</string>
     <string name="password" msgid="6738570945182936667">"құпия сөз"</string>
     <string name="passkeys" msgid="5733880786866559847">"кіру кілттері"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Жабу"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін сақталған кіру кілті пайдаланылсын ба?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін сақталған құпия сөзіңізді пайдаланасыз ба?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына <xliff:g id="USERNAME">%2$s</xliff:g> аккаунтымен кіру үшін экран құлпын қолданыңыз."</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына кіру деректерін пайдаланасыз ба?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін кіру опциялары ашылсын ба?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін сақталған кіру кілтін таңдаңыз"</string>
diff --git a/packages/CredentialManager/res/values-km/strings.xml b/packages/CredentialManager/res/values-km/strings.xml
index d0faaec..ac0d427 100644
--- a/packages/CredentialManager/res/values-km/strings.xml
+++ b/packages/CredentialManager/res/values-km/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"នៅពេលដែលយើងឈានទៅរកអនាគតដែលគ្មានពាក្យសម្ងាត់ ពាក្យសម្ងាត់នៅតែអាចប្រើបានរួមជាមួយកូដសម្ងាត់។"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"ជ្រើសរើសកន្លែង​ដែលត្រូវរក្សាទុក<xliff:g id="CREATETYPES">%1$s</xliff:g>របស់អ្នក"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ជ្រើសរើស​កម្មវិធីគ្រប់គ្រងពាក្យសម្ងាត់ ដើម្បីរក្សាទុក​ព័ត៌មានរបស់អ្នក និងចូលគណនី​បានកាន់តែរហ័ស​នៅពេលលើកក្រោយ"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"បង្កើតកូដសម្ងាត់ ដើម្បីចូលគណនី <xliff:g id="APPNAME">%1$s</xliff:g> ឬ?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"រក្សាទុកពាក្យសម្ងាត់ ដើម្បីចូលគណនី <xliff:g id="APPNAME">%1$s</xliff:g> ឬ?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"រក្សាទុក​ព័ត៌មានអំពី​ការចូលគណនីសម្រាប់ <xliff:g id="APPNAME">%1$s</xliff:g> ឬ?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"បង្កើតកូដសម្ងាត់ ដើម្បីចូលគណនី <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"រក្សាទុកពាក្យសម្ងាត់ ដើម្បីចូលគណនី <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"រក្សាទុក​ព័ត៌មានចូលគណនីសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
     <string name="passkey" msgid="632353688396759522">"កូដសម្ងាត់"</string>
     <string name="password" msgid="6738570945182936667">"ពាក្យសម្ងាត់"</string>
     <string name="passkeys" msgid="5733880786866559847">"កូដសម្ងាត់"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ច្រានចោល"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ប្រើកូដសម្ងាត់ដែលបានរក្សាទុករបស់អ្នកសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"ប្រើពាក្យសម្ងាត់​ដែលអ្នកបាន​រក្សាទុកសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"ប្រើមុខងារចាក់សោអេក្រង់របស់អ្នក ដើម្បីចូល <xliff:g id="APP_NAME">%1$s</xliff:g> ដោយប្រើ <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"ប្រើការចូលគណនីរបស់អ្នកសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"ដោះ​សោជម្រើសចូល​គណនីសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"ជ្រើសរើសកូដសម្ងាត់ដែលបានរក្សាទុកសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-kn/strings.xml b/packages/CredentialManager/res/values-kn/strings.xml
index 59e3b5c..031fa65 100644
--- a/packages/CredentialManager/res/values-kn/strings.xml
+++ b/packages/CredentialManager/res/values-kn/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"ನಾವು ಪಾಸ್‌ವರ್ಡ್ ರಹಿತ ತಂತ್ರಜ್ಞಾನದ ಕಡೆಗೆ ಸಾಗುತ್ತಿರುವಾಗ, ಪಾಸ್‌ಕೀಗಳ ಜೊತೆಗೆ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಇನ್ನೂ ಲಭ್ಯವಿರುತ್ತವೆ."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"ನಿಮ್ಮ <xliff:g id="CREATETYPES">%1$s</xliff:g> ಎಲ್ಲಿ ಸೇವ್‌ ಆಗಬೇಕು ಎಂಬುದನ್ನು ಆರಿಸಿ"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ನಿಮ್ಮ ಮಾಹಿತಿಯನ್ನು ಉಳಿಸಲು ಪಾಸ್‌ವರ್ಡ್ ನಿರ್ವಾಹಕವನ್ನು ಆಯ್ಕೆಮಾಡಿ ಹಾಗೂ ಮುಂದಿನ ಬಾರಿ ವೇಗವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪಾಸ್‌ಕೀ ರಚಿಸುವುದೇ?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಸೇವ್ ಮಾಡುವುದೇ?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> ಗಾಗಿ ಸೈನ್-ಇನ್ ಮಾಹಿತಿಯನ್ನು ಉಳಿಸುವುದೇ?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪಾಸ್‌ಕೀ ಯನ್ನು ರಚಿಸಬೇಕೇ?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಸೇವ್ ಮಾಡಬೇಕೇ?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಸೈನ್-ಇನ್ ಮಾಹಿತಿಯನ್ನು ಸೇವ್ ಮಾಡಬೇಕೇ?"</string>
     <string name="passkey" msgid="632353688396759522">"ಪಾಸ್‌ಕೀ"</string>
     <string name="password" msgid="6738570945182936667">"ಪಾಸ್‌ವರ್ಡ್"</string>
     <string name="passkeys" msgid="5733880786866559847">"ಪಾಸ್‌ಕೀಗಳು"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ವಜಾಗೊಳಿಸಿ"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಉಳಿಸಲಾದ ನಿಮ್ಮ ಪಾಸ್‌ಕೀ ಅನ್ನು ಬಳಸಬೇಕೆ?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ನಿಮ್ಮ ಉಳಿಸಲಾದ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಬಳಸಬೇಕೇ?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ <xliff:g id="USERNAME">%2$s</xliff:g> ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಲು ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ನಿಮ್ಮ ಸೈನ್ ಇನ್ ಅನ್ನು ಬಳಸಬೇಕೇ?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಸೈನ್-ಇನ್ ಆಯ್ಕೆಗಳನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಬೇಕೇ?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಉಳಿಸಲಾದ ಪಾಸ್‌ಕೀ ಅನ್ನು ಆರಿಸಿ"</string>
diff --git a/packages/CredentialManager/res/values-ko/strings.xml b/packages/CredentialManager/res/values-ko/strings.xml
index fd48d18..e29ae68 100644
--- a/packages/CredentialManager/res/values-ko/strings.xml
+++ b/packages/CredentialManager/res/values-ko/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"비밀번호 없는 미래로 나아가는 과정에서 비밀번호는 여전히 패스키와 함께 사용될 것입니다."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> 저장 위치 선택"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"정보를 저장해서 다음에 더 빠르게 로그인하려면 비밀번호 관리자를 선택하세요."</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"패스키를 생성하여 <xliff:g id="APPNAME">%1$s</xliff:g>에 로그인하시겠습니까?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"비밀번호를 저장하여 <xliff:g id="APPNAME">%1$s</xliff:g>에 로그인하시겠습니까?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g>의 로그인 정보를 저장하시겠습니까?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"패스키를 생성하여 <xliff:g id="APP_NAME">%1$s</xliff:g>에 로그인하시겠습니까?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"비밀번호를 저장하여 <xliff:g id="APP_NAME">%1$s</xliff:g>에 로그인하시겠습니까?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 로그인 정보를 저장하시겠습니까?"</string>
     <string name="passkey" msgid="632353688396759522">"패스키"</string>
     <string name="password" msgid="6738570945182936667">"비밀번호"</string>
     <string name="passkeys" msgid="5733880786866559847">"패스키"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"닫기"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱용으로 저장된 패스키를 사용하시겠습니까?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"저장된 비밀번호를 <xliff:g id="APP_NAME">%1$s</xliff:g>에 사용할까요?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"화면 잠금을 사용하여 <xliff:g id="USERNAME">%2$s</xliff:g> 계정으로 <xliff:g id="APP_NAME">%1$s</xliff:g>에 로그인합니다."</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g>에 로그인을 사용하시겠습니까?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g>에 대해 로그인 옵션을 잠금 해제하시겠습니까?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g>에 대해 저장된 패스키 선택"</string>
diff --git a/packages/CredentialManager/res/values-ky/strings.xml b/packages/CredentialManager/res/values-ky/strings.xml
index 6a01462..5e48ae5 100644
--- a/packages/CredentialManager/res/values-ky/strings.xml
+++ b/packages/CredentialManager/res/values-ky/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Сырсөзсүз келечекти көздөй баратсак да, аларды киргизүүчү ачкычтар менен бирге колдоно берүүгө болот."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> кайда сакталарын тандаңыз"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Маалыматыңызды сактоо жана кийинки жолу тезирээк кирүү үчүн сырсөздөрдү башкаргычты тандаңыз"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> колдонмосуна кирүү үчүн киргизүүчү ачкычты түзөсүзбү?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> колдонмосуна кирүү үчүн сырсөздү сактайсызбы?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> үчүн кирүү маалыматы сакталсынбы?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна кирүү үчүн киргизүүчү ачкычты түзөсүзбү?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна кирүү үчүн сырсөздү сактайсызбы?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн кирүү маалыматы сакталсынбы?"</string>
     <string name="passkey" msgid="632353688396759522">"киргизүүчү ачкыч"</string>
     <string name="password" msgid="6738570945182936667">"сырсөз"</string>
     <string name="passkeys" msgid="5733880786866559847">"киргизүүчү ачкычтар"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Жабуу"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна кирүү үчүн сакталган ачкычты колдоносузбу?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн сакталган сырсөздү колдоносузбу?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна <xliff:g id="USERNAME">%2$s</xliff:g> аккаунту менен кирүү үчүн экрандын кулпусун колдонуңуз"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна төмөнкү аккаунт менен киресизби?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн кирүү параметрлеринин кулпусу ачылсынбы?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн сакталган киргизүүчү ачкычты тандаңыз"</string>
diff --git a/packages/CredentialManager/res/values-lo/strings.xml b/packages/CredentialManager/res/values-lo/strings.xml
index e71c60f..c3733a3 100644
--- a/packages/CredentialManager/res/values-lo/strings.xml
+++ b/packages/CredentialManager/res/values-lo/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"ໃນຂະນະທີ່ພວກເຮົາກ້າວໄປສູ່ອະນາຄົດທີ່ບໍ່ຕ້ອງໃຊ້ລະຫັດຜ່ານ, ລະຫັດຜ່ານຈະຍັງຄົງໃຊ້ໄດ້ຄວບຄູ່ໄປກັບກະແຈຜ່ານ."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"ເລືອກບ່ອນທີ່ຈະບັນທຶກ <xliff:g id="CREATETYPES">%1$s</xliff:g> ຂອງທ່ານ"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ເລືອກຕົວຈັດການລະຫັດຜ່ານເພື່ອບັນທຶກຂໍ້ມູນຂອງທ່ານ ແລະ ເຂົ້າສູ່ລະບົບໄວຂຶ້ນໃນເທື່ອຕໍ່ໄປ"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"ສ້າງກະແຈຜ່ານເພື່ອເຂົ້າສູ່ລະບົບ <xliff:g id="APPNAME">%1$s</xliff:g> ບໍ?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"ບັນທຶກລະຫັດຜ່ານເພື່ອເຂົ້າສູ່ລະບົບ <xliff:g id="APPNAME">%1$s</xliff:g> ບໍ?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"ບັນທຶກຂໍ້ມູນການເຂົ້າສູ່ລະບົບສຳລັບ <xliff:g id="APPNAME">%1$s</xliff:g> ບໍ?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"ສ້າງກະແຈຜ່ານເພື່ອເຂົ້າສູ່ລະບົບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"ບັນທຶກລະຫັດຜ່ານເພື່ອເຂົ້າສູ່ລະບົບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"ບັນທຶກຂໍ້ມູນການເຂົ້າສູ່ລະບົບສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
     <string name="passkey" msgid="632353688396759522">"ກະແຈຜ່ານ"</string>
     <string name="password" msgid="6738570945182936667">"ລະຫັດຜ່ານ"</string>
     <string name="passkeys" msgid="5733880786866559847">"ກະແຈຜ່ານ"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ປິດໄວ້"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ໃຊ້ກະແຈຜ່ານທີ່ບັນທຶກໄວ້ຂອງທ່ານສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"ໃຊ້ລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ຂອງທ່ານສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"ໃຊ້ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອເຂົ້າສູ່ລະບົບ <xliff:g id="APP_NAME">%1$s</xliff:g> ດ້ວຍ <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"ເລືອກການເຂົ້າສູ່ລະບົບຂອງທ່ານສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"ປົດລັອກຕົວເລືອກການເຂົ້າສູ່ລະບົບສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"ເລືອກກະແຈຜ່ານທີ່ບັນທຶກໄວ້ສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-lt/strings.xml b/packages/CredentialManager/res/values-lt/strings.xml
index 55c5cd2..453a0e0 100644
--- a/packages/CredentialManager/res/values-lt/strings.xml
+++ b/packages/CredentialManager/res/values-lt/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Kol stengiamės padaryti, kad ateityje nereikėtų naudoti slaptažodžių, jie vis dar bus pasiekiami kartu su prieigos raktais."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Pasirinkite, kur išsaugoti „<xliff:g id="CREATETYPES">%1$s</xliff:g>“"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Pasirinkite slaptažodžių tvarkyklę, kurią naudodami galėsite išsaugoti informaciją ir kitą kartą prisijungti greičiau"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Sukurti prieigos raktą, skirtą prisijungti prie „<xliff:g id="APPNAME">%1$s</xliff:g>“?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Sukurti slaptažodį, skirtą prisijungti prie „<xliff:g id="APPNAME">%1$s</xliff:g>“?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Išsaugoti prisijungimo prie „<xliff:g id="APPNAME">%1$s</xliff:g>“ informaciją?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Sukurti prieigos raktą, skirtą prisijungti prie „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Sukurti slaptažodį, skirtą prisijungti prie „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Išsaugoti prisijungimo prie „<xliff:g id="APP_NAME">%1$s</xliff:g>“ informaciją?"</string>
     <string name="passkey" msgid="632353688396759522">"„passkey“"</string>
     <string name="password" msgid="6738570945182936667">"slaptažodis"</string>
     <string name="passkeys" msgid="5733880786866559847">"prieigos raktas"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Atsisakyti"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Naudoti išsaugotą „passkey“ programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Naudoti išsaugotą slaptažodį programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Naudodami ekrano užraktą prisijunkite prie „<xliff:g id="APP_NAME">%1$s</xliff:g>“ kaip <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Naudoti prisijungimo informaciją programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Atrakinti prisijungimo prie „<xliff:g id="APP_NAME">%1$s</xliff:g>“ parinktis?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Išsaugoto prieigos rakto, skirto „<xliff:g id="APP_NAME">%1$s</xliff:g>“, pasirinkimas"</string>
diff --git a/packages/CredentialManager/res/values-lv/strings.xml b/packages/CredentialManager/res/values-lv/strings.xml
index 2c0f8e1..4da1051 100644
--- a/packages/CredentialManager/res/values-lv/strings.xml
+++ b/packages/CredentialManager/res/values-lv/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Lai arī pamazām notiek pāreja uz darbu bez parolēm, tās joprojām būs pieejamas līdzās piekļuves atslēgām."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Izvēlieties, kur saglabāt savas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Lai saglabātu informāciju un nākamreiz varētu pierakstīties ātrāk, atlasiet paroļu pārvaldnieku."</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Vai izveidot piekļuves atslēgu, lai pierakstītos lietotnē <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Vai saglabāt paroli, lai pierakstītos lietotnē <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Vai saglabāt pierakstīšanās informāciju lietotnei <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Vai izveidot piekļuves atslēgu, lai pierakstītos lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Vai saglabāt paroli, lai pierakstītos lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Vai saglabāt pierakstīšanās informāciju lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"piekļuves atslēga"</string>
     <string name="password" msgid="6738570945182936667">"parole"</string>
     <string name="passkeys" msgid="5733880786866559847">"piekļuves atslēgas"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Nerādīt"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vai izmantot saglabāto piekļuves atslēgu lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Vai izmantot jūsu saglabāto paroli lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Izmantot ekrāna bloķēšanu, lai lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> pierakstītos ar kontu <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Vai izmantot jūsu pierakstīšanās informāciju lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vai vēlaties atbloķēt lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> pierakstīšanās opcijas?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Saglabātas piekļuves atslēgas izvēle lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-mk/strings.xml b/packages/CredentialManager/res/values-mk/strings.xml
index 6f8f76b..95554a2 100644
--- a/packages/CredentialManager/res/values-mk/strings.xml
+++ b/packages/CredentialManager/res/values-mk/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Како што се движиме кон иднина без лозинки, лозинките сепак ќе бидат достапни покрај криптографските клучеви."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Изберете каде да ги зачувате вашите <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Изберете управник со лозинки за да ги зачувате вашите податоци и да се најавите побрзо следниот пат"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Да се создаде криптографски клуч за најавување на <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Да се зачува лозинката за најавување на <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Да се зачуваат податоците за најавување за <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Да се создаде криптографски клуч за најавување на <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Да се зачува лозинката за најавување на <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Да се зачуваат податоците за најавување за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"криптографски клуч"</string>
     <string name="password" msgid="6738570945182936667">"лозинка"</string>
     <string name="passkeys" msgid="5733880786866559847">"криптографски клучеви"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Отфрли"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Да се користи вашиот зачуван криптографски клуч за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Да се користат зачуваните лозинки за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Користете го заклучувањето екран за да се најавувате на <xliff:g id="APP_NAME">%1$s</xliff:g> со <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Да се користи вашето најавување за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Да се отклучат опциите за најавување за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Изберете зачуван криптографски клуч за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ml/strings.xml b/packages/CredentialManager/res/values-ml/strings.xml
index ab32bc9..eccfb51 100644
--- a/packages/CredentialManager/res/values-ml/strings.xml
+++ b/packages/CredentialManager/res/values-ml/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"നമ്മൾ പാസ്‍വേഡ് രഹിത ഭാവിയിലേക്ക് ചുവടുവെച്ചുകൊണ്ടിരിക്കുകയാണ് എങ്കിലും, പാസ്‌കീകൾക്കൊപ്പം പാസ്‍വേഡുകൾ തുടർന്നും ലഭ്യമായിരിക്കും."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"നിങ്ങളുടെ <xliff:g id="CREATETYPES">%1$s</xliff:g> എവിടെയാണ് സംരക്ഷിക്കേണ്ടതെന്ന് തിരഞ്ഞെടുക്കുക"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"നിങ്ങളുടെ വിവരങ്ങൾ സംരക്ഷിക്കാനും അടുത്ത തവണ വേഗത്തിൽ സൈൻ ഇൻ ചെയ്യാനും ഒരു പാസ്‌വേഡ് മാനേജർ തിരഞ്ഞെടുക്കുക"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> എന്നതിലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ പാസ്‌കീ സൃഷ്ടിക്കണോ?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> എന്നതിലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ പാസ്‌വേഡ് സംരക്ഷിക്കണോ?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> എന്നതിനായി സൈൻ ഇൻ വിവരങ്ങൾ സംരക്ഷിക്കണോ?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ പാസ്‌കീ സൃഷ്ടിക്കണോ?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ പാസ്‌വേഡ് സംരക്ഷിക്കണോ?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി സൈൻ ഇൻ വിവരങ്ങൾ സംരക്ഷിക്കണോ?"</string>
     <string name="passkey" msgid="632353688396759522">"പാസ്‌കീ"</string>
     <string name="password" msgid="6738570945182936667">"പാസ്‌വേഡ്"</string>
     <string name="passkeys" msgid="5733880786866559847">"പാസ്‌കീകൾ"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ഡിസ്‌മിസ് ചെയ്യുക"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി നിങ്ങൾ സംരക്ഷിച്ച പാസ്‌കീ ഉപയോഗിക്കണോ?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി നിങ്ങളുടെ സംരക്ഷിച്ച പാസ്‌വേഡ് ഉപയോഗിക്കണോ?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> എന്നയാളായി <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ നിങ്ങളുടെ സ്‌ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിനുള്ള നിങ്ങളുടെ സൈൻ ഇൻ ക്രെഡൻഷ്യലുകൾ ഉപയോഗിക്കണോ?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി സൈൻ ഇൻ ഓപ്‌ഷനുകൾ അൺലോക്ക് ചെയ്യണോ?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി ഒരു സംരക്ഷിച്ച പാസ്‌കീ തിരഞ്ഞെടുക്കുക"</string>
diff --git a/packages/CredentialManager/res/values-mn/strings.xml b/packages/CredentialManager/res/values-mn/strings.xml
index a704ea0..5b1cbe9 100644
--- a/packages/CredentialManager/res/values-mn/strings.xml
+++ b/packages/CredentialManager/res/values-mn/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Бид нууц үггүй ирээдүй рүү урагшлахын хэрээр нууц үг нь нэвтрэх түлхүүрийн хамтаар боломжтой хэвээр байх болно."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g>-г хаана хадгалахаа сонгоно уу"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Мэдээллээ хадгалж, дараагийн удаа илүү хурдан нэвтрэхийн тулд нууц үгний менежерийг сонгоно уу"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g>-д нэвтрэхийн тулд нэвтрэх түлхүүр үүсгэх үү?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g>-д нэвтрэхийн тулд нууц үгийг хадгалах уу?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g>-н нэвтрэх мэдээллийг хадгалах уу?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д нэвтрэхийн тулд нэвтрэх түлхүүр үүсгэх үү?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д нэвтрэхийн тулд нууц үгийг хадгалах уу?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н нэвтрэх мэдээллийг хадгалах уу?"</string>
     <string name="passkey" msgid="632353688396759522">"passkey"</string>
     <string name="password" msgid="6738570945182936667">"нууц үг"</string>
     <string name="passkeys" msgid="5733880786866559847">"нэвтрэх түлхүүрүүд"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Хаах"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д өөрийн хадгалсан passkey-г ашиглах уу?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д хадгалсан нууц үгээ ашиглах уу?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д <xliff:g id="USERNAME">%2$s</xliff:g>-р нэвтрэхийн тулд дэлгэцийн түгжээгээ ашиглана уу"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н нэвтрэлтээ ашиглах уу?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д нэвтрэлтийн сонголтын түгжээг тайлах уу?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д хадгалсан нэвтрэх түлхүүр сонгоно уу"</string>
diff --git a/packages/CredentialManager/res/values-mr/strings.xml b/packages/CredentialManager/res/values-mr/strings.xml
index d3e14dd..a0a4a7d 100644
--- a/packages/CredentialManager/res/values-mr/strings.xml
+++ b/packages/CredentialManager/res/values-mr/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"पासवर्ड न वापरणाऱ्या भविष्यात पुढे जाताना, पासवर्ड तरीही पासकीच्या बरोबरीने उपलब्ध असतील."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"तुमची <xliff:g id="CREATETYPES">%1$s</xliff:g> कुठे सेव्ह करायची ते निवडा"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"तुमची माहिती सेव्ह करण्यासाठी आणि पुढच्या वेळी जलद साइन इन करण्याकरिता Password Manager निवडा"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> मध्ये साइन इन करण्यासाठी पासकी तयार करायची आहे का?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> मध्ये साइन इन करण्यासाठी पासवर्ड सेव्ह करायचा आहे का?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> साठी साइन-इन माहिती सेव्ह करायची का?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> मध्ये साइन इन करण्यासाठी पासकी तयार करायची आहे का?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> मध्ये साइन इन करण्यासाठी पासवर्ड सेव्ह करायचा आहे का?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी साइन-इनसंबंधित माहिती सेव्ह करायची का?"</string>
     <string name="passkey" msgid="632353688396759522">"पासकी"</string>
     <string name="password" msgid="6738570945182936667">"पासवर्ड"</string>
     <string name="passkeys" msgid="5733880786866559847">"पासकी"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"डिसमिस करा"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी तुमची सेव्ह केलेली पासकी वापरायची का?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"तुमचा सेव्ह केलेला पासवर्ड <xliff:g id="APP_NAME">%1$s</xliff:g> साठी वापरायचा आहे का?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> सह <xliff:g id="APP_NAME">%1$s</xliff:g> मध्ये साइन इन करण्यासाठी तुमचे स्क्रीन लॉक वापरा"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी तुमचे साइन-इन वापरायचे आहे का?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी साइन-इन पर्याय अनलॉक करायचे आहेत का?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी सेव्ह केलेली पासकी निवडा"</string>
diff --git a/packages/CredentialManager/res/values-ms/strings.xml b/packages/CredentialManager/res/values-ms/strings.xml
index a491177..c866013 100644
--- a/packages/CredentialManager/res/values-ms/strings.xml
+++ b/packages/CredentialManager/res/values-ms/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Meskipun masa depan kita nanti tidak memerlukan kata laluan, kata laluan masih akan tersedia bersama dengan kunci laluan."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Pilih tempat untuk menyimpan <xliff:g id="CREATETYPES">%1$s</xliff:g> anda"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Pilih Password Manager untuk menyimpan maklumat anda dan log masuk lebih pantas pada kali seterusnya"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Buat kunci laluan untuk log masuk ke <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Simpan kata laluan untuk log masuk ke <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Simpan maklumat log masuk untuk <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Buat kunci laluan untuk log masuk ke <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Simpan kata laluan untuk log masuk ke <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Simpan maklumat log masuk untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"kunci laluan"</string>
     <string name="password" msgid="6738570945182936667">"kata laluan"</string>
     <string name="passkeys" msgid="5733880786866559847">"kunci laluan"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Ketepikan"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gunakan kunci laluan anda yang telah disimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Gunakan kata laluan anda yang disimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Gunakan kunci skrin anda untuk log masuk ke <xliff:g id="APP_NAME">%1$s</xliff:g> dengan <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Gunakan log masuk anda untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Buka kunci pilihan log masuk untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Pilih kunci laluan yang disimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-my/strings.xml b/packages/CredentialManager/res/values-my/strings.xml
index b427a58..a66e7b6 100644
--- a/packages/CredentialManager/res/values-my/strings.xml
+++ b/packages/CredentialManager/res/values-my/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"စကားဝှက်မသုံးခြင်း အနာဂတ်ဆီသို့ ရှေ့ဆက်ရာတွင် လျှို့ဝှက်ကီးများနှင့်အတူ စကားဝှက်များကို ဆက်လက်အသုံးပြုနိုင်ပါမည်။"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"သင်၏ <xliff:g id="CREATETYPES">%1$s</xliff:g> သိမ်းရန်နေရာ ရွေးခြင်း"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"သင့်အချက်အလက်သိမ်းပြီး နောက်တစ်ကြိမ်၌ ပိုမိုမြန်ဆန်စွာ လက်မှတ်ထိုးဝင်ရန် စကားဝှက်မန်နေဂျာကို ရွေးပါ"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> သို့ လက်မှတ်ထိုးဝင်ရန် လျှို့ဝှက်ကီး ပြုလုပ်မလား။"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> သို့ လက်မှတ်ထိုးဝင်ရန် စကားဝှက်ကို သိမ်းမလား။"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> အတွက် လက်မှတ်ထိုးဝင်သည့်အချက်အလက်ကို သိမ်းမလား။"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> သို့ လက်မှတ်ထိုးဝင်ရန် လျှို့ဝှက်ကီး ပြုလုပ်မလား။"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> သို့ လက်မှတ်ထိုးဝင်ရန် စကားဝှက်ကို သိမ်းမလား။"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် လက်မှတ်ထိုးဝင်ရန် အချက်အလက်ကို သိမ်းမလား။"</string>
     <string name="passkey" msgid="632353688396759522">"လျှို့ဝှက်ကီး"</string>
     <string name="password" msgid="6738570945182936667">"စကားဝှက်"</string>
     <string name="passkeys" msgid="5733880786866559847">"လျှို့ဝှက်ကီးများ"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ပယ်ရန်"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"သိမ်းထားသောလျှို့ဝှက်ကီးကို <xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သုံးမလား။"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သိမ်းထားသောစကားဝှက် သုံးမလား။"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> သို့ <xliff:g id="USERNAME">%2$s</xliff:g> ဖြင့် လက်မှတ်ထိုးဝင်ရန် သင့်ဖန်သားပြင်လော့ခ်ကို သုံးနိုင်သည်"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သင့်လက်မှတ်ထိုးဝင်မှုကို သုံးမလား။"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် လက်မှတ်ထိုးဝင်မှု ရွေးစရာကို ဖွင့်မလား။"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သိမ်းထားသော လျှို့ဝှက်ကီး ရွေးပါ"</string>
diff --git a/packages/CredentialManager/res/values-nb/strings.xml b/packages/CredentialManager/res/values-nb/strings.xml
index 1e780ee5..7f4fa6b 100644
--- a/packages/CredentialManager/res/values-nb/strings.xml
+++ b/packages/CredentialManager/res/values-nb/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Vi går mot en fremtid uten passord, men passord fortsetter å være tilgjengelige ved siden av passnøkler."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Velg hvor du vil lagre <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Velg et verktøy for passordlagring for å lagre informasjonen din og logge på raskere neste gang"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Vil du opprette en passnøkkel for å logge på <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Vil du lagre passordet for å logge på <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Vil du lagre påloggingsinformasjon for <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Vil du opprette en passnøkkel for å logge på <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Vil du lagre passordet for å logge på <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Vil du lagre påloggingsinformasjon for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"passnøkkel"</string>
     <string name="password" msgid="6738570945182936667">"passord"</string>
     <string name="passkeys" msgid="5733880786866559847">"passnøkler"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Lukk"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vil du bruke den lagrede tilgangsnøkkelen for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Vil du bruke det lagrede passordet ditt for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Bruk skjermlåsen til å logge på <xliff:g id="APP_NAME">%1$s</xliff:g> med <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Vil du bruke påloggingen for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vil du låse opp påloggingsalternativene for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Velg en lagret passnøkkel for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ne/strings.xml b/packages/CredentialManager/res/values-ne/strings.xml
index 55d4e87..6e69476 100644
--- a/packages/CredentialManager/res/values-ne/strings.xml
+++ b/packages/CredentialManager/res/values-ne/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"हामी पासवर्डरहित भविष्यतर्फ बढ्दै गर्दा पासकीका साथसाथै पासवर्ड पनि उपलब्ध हुने छ।"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"तपाईं आफ्ना <xliff:g id="CREATETYPES">%1$s</xliff:g> कहाँ सेभ गर्न चाहनुहुन्छ भन्ने कुरा छनौट गर्नुहोस्"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"कुनै पासवर्ड म्यानेजरमा आफ्नो जानकारी सेभ गरी अर्को पटक अझ छिटो साइन इन गर्नुहोस्"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> मा साइन इन गर्न पासकी बनाउने हो?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> मा साइन इन गर्न पासवर्ड सेभ गर्ने हो?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> मा साइन गर्न प्रयोग गरिनु पर्ने जानकारी सेभ गर्ने हो?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्न पासकी बनाउने हो?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्न पासवर्ड सेभ गर्ने हो?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन गर्न प्रयोग गरिने जानकारी सेभ गर्ने हो?"</string>
     <string name="passkey" msgid="632353688396759522">"पासकी"</string>
     <string name="password" msgid="6738570945182936667">"पासवर्ड"</string>
     <string name="passkeys" msgid="5733880786866559847">"पासकीहरू"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"हटाउनुहोस्"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"आफूले सेभ गरेको पासकी प्रयोग गरी <xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्ने हो?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्न सेभ गरिएको पासवर्ड प्रयोग गर्ने हो?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> प्रयोग गरी <xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्न आफ्नो स्क्रिन लक प्रयोग गर्नुहोस्"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्नका लागि तपाईंका क्रिडेन्सियलहरू प्रयोग गर्ने हो?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> का साइन इनसम्बन्धी विकल्पहरू अनलक गर्ने हो?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्न सेभ गरिएको पासकी छनौट गर्नुहोस्"</string>
diff --git a/packages/CredentialManager/res/values-nl/strings.xml b/packages/CredentialManager/res/values-nl/strings.xml
index 53b3d70..50eefc7 100644
--- a/packages/CredentialManager/res/values-nl/strings.xml
+++ b/packages/CredentialManager/res/values-nl/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"We zijn op weg naar een wachtwoordloze toekomst, maar naast toegangssleutels kun je nog steeds gebruikmaken van wachtwoorden."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Kiezen waar je je <xliff:g id="CREATETYPES">%1$s</xliff:g> wilt opslaan"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecteer een wachtwoordmanager om je informatie op te slaan en de volgende keer sneller in te loggen"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Toegangssleutel maken om in te loggen bij <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Wachtwoord opslaan om in te loggen bij <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Inloggegevens opslaan voor <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Toegangssleutel maken om in te loggen bij <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Wachtwoord opslaan om in te loggen bij <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Inloggegevens opslaan voor <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"Toegangssleutel"</string>
     <string name="password" msgid="6738570945182936667">"wachtwoord"</string>
     <string name="passkeys" msgid="5733880786866559847">"toegangssleutels"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Sluiten"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Je opgeslagen toegangssleutel gebruiken voor <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Je opgeslagen wachtwoord voor <xliff:g id="APP_NAME">%1$s</xliff:g> gebruiken?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Gebruik je schermvergrendeling om in te loggen bij <xliff:g id="APP_NAME">%1$s</xliff:g> met <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Je login voor <xliff:g id="APP_NAME">%1$s</xliff:g> gebruiken?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Inlogopties voor <xliff:g id="APP_NAME">%1$s</xliff:g> ontgrendelen?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Opgeslagen toegangssleutel kiezen voor <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-or/strings.xml b/packages/CredentialManager/res/values-or/strings.xml
index ad268c9..56e585d 100644
--- a/packages/CredentialManager/res/values-or/strings.xml
+++ b/packages/CredentialManager/res/values-or/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"ଆମେ ଏକ ପାସୱାର୍ଡବିହୀନ ଭବିଷ୍ୟତ ଆଡ଼କୁ ମୁଭ କରୁଥିବା ଯୋଗୁଁ ଏବେ ବି ପାସକୀଗୁଡ଼ିକ ସହିତ ପାସୱାର୍ଡ ଉପଲବ୍ଧ ହେବ।"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"ଆପଣଙ୍କ <xliff:g id="CREATETYPES">%1$s</xliff:g> କେଉଁଠାରେ ସେଭ କରିବେ ତାହା ବାଛନ୍ତୁ"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ଆପଣଙ୍କ ସୂଚନା ସେଭ କରି ପରବର୍ତ୍ତୀ ସମୟରେ ଶୀଘ୍ର ସାଇନ ଇନ କରିବା ପାଇଁ ଏକ Password Manager ଚୟନ କରନ୍ତୁ"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g>ରେ ସାଇନ ଇନ କରିବାକୁ ପାସକୀ ତିଆରି କରିବେ?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g>ରେ ସାଇନ ଇନ କରିବାକୁ ପାସୱାର୍ଡ ସେଭ କରିବେ?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> ପାଇଁ ସାଇନ-ଇନର ସୂଚନା ସେଭ କରିବେ?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g>ରେ ସାଇନ ଇନ କରିବାକୁ ପାସକୀ ତିଆରି କରିବେ?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g>ରେ ସାଇନ ଇନ କରିବାକୁ ପାସୱାର୍ଡ ସେଭ କରିବେ?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ସାଇନ-ଇନର ସୂଚନା ସେଭ କରିବେ?"</string>
     <string name="passkey" msgid="632353688396759522">"ପାସକୀ"</string>
     <string name="password" msgid="6738570945182936667">"ପାସୱାର୍ଡ"</string>
     <string name="passkeys" msgid="5733880786866559847">"ପାସକୀଗୁଡ଼ିକ"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ଖାରଜ କରନ୍ତୁ"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ସେଭ କରାଯାଇଥିବା ଆପଣଙ୍କ ପାସକୀ ବ୍ୟବହାର କରିବେ?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ଆପଣଙ୍କ ସେଭ କରାଯାଇଥିବା ପାସୱାର୍ଡକୁ ବ୍ୟବହାର କରିବେ?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> ମାଧ୍ୟମରେ <xliff:g id="APP_NAME">%1$s</xliff:g>ରେ ସାଇନ ଇନ କରିବା ପାଇଁ ଆପଣଙ୍କ ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ଆପଣଙ୍କ ସାଇନ-ଇନ ବ୍ୟବହାର କରିବେ?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ସାଇନ-ଇନ ବିକଳ୍ପଗୁଡ଼ିକୁ ଅନଲକ କରିବେ?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ସେଭ କରାଯାଇଥିବା ଏକ ପାସକୀ ବାଛନ୍ତୁ"</string>
diff --git a/packages/CredentialManager/res/values-pa/strings.xml b/packages/CredentialManager/res/values-pa/strings.xml
index 8328d47..d23d209 100644
--- a/packages/CredentialManager/res/values-pa/strings.xml
+++ b/packages/CredentialManager/res/values-pa/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"ਹਾਲਾਂਕਿ, ਅਸੀਂ ਪਾਸਵਰਡ ਰਹਿਤ ਭਵਿੱਖ ਵੱਲ ਵਧ ਰਹੇ ਹਾਂ, ਪਰ ਪਾਸਕੀਆਂ ਦੇ ਨਾਲ ਪਾਸਵਰਡ ਹਾਲੇ ਵੀ ਉਪਲਬਧ ਹੋਣਗੇ।"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"ਚੁਣੋ ਕਿ ਆਪਣੀਆਂ <xliff:g id="CREATETYPES">%1$s</xliff:g> ਨੂੰ ਕਿੱਥੇ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ਆਪਣੀ ਜਾਣਕਾਰੀ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਅਤੇ ਅਗਲੀ ਵਾਰ ਤੇਜ਼ੀ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਪ੍ਰਬੰਧਕ ਚੁਣੋ"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"ਕੀ <xliff:g id="APPNAME">%1$s</xliff:g> ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਪਾਸਕੀ ਬਣਾਉਣੀ ਹੈ?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"ਕੀ <xliff:g id="APPNAME">%1$s</xliff:g> ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"ਕੀ <xliff:g id="APPNAME">%1$s</xliff:g> ਲਈ ਸਾਈਨ-ਇਨ ਜਾਣਕਾਰੀ ਰੱਖਿਅਤ ਕਰਨੀ ਹੈ?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਪਾਸਕੀ ਬਣਾਉਣੀ ਹੈ?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਸਾਈਨ-ਇਨ ਜਾਣਕਾਰੀ ਰੱਖਿਅਤ ਕਰਨੀ ਹੈ?"</string>
     <string name="passkey" msgid="632353688396759522">"ਪਾਸਕੀ"</string>
     <string name="password" msgid="6738570945182936667">"ਪਾਸਵਰਡ"</string>
     <string name="passkeys" msgid="5733880786866559847">"ਪਾਸਕੀਆਂ"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ਖਾਰਜ ਕਰੋ"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਆਪਣੀ ਰੱਖਿਅਤ ਕੀਤੀ ਪਾਸਕੀ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਤੁਹਾਡਾ ਰੱਖਿਅਤ ਕੀਤਾ ਪਾਸਵਰਡ ਵਰਤਣਾ ਹੈ?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> ਨਾਲ <xliff:g id="APP_NAME">%1$s</xliff:g> ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਆਪਣੇ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਆਪਣਾ ਸਾਈਨ-ਇਨ ਕਰਨ ਦਾ ਵਿਕਲਪ ਵਰਤਣਾ ਹੈ?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਸਾਈਨ-ਇਨ ਵਿਕਲਪਾਂ ਨੂੰ ਅਣਲਾਕ ਕਰਨਾ ਹੈ?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਕੋਈ ਰੱਖਿਅਤ ਕੀਤੀ ਪਾਸਕੀ ਚੁਣੋ"</string>
diff --git a/packages/CredentialManager/res/values-pl/strings.xml b/packages/CredentialManager/res/values-pl/strings.xml
index 7114c3a..5fa26b4 100644
--- a/packages/CredentialManager/res/values-pl/strings.xml
+++ b/packages/CredentialManager/res/values-pl/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"W czasie przechodzenia na technologie niewymagające haseł możliwość stosowania haseł – niezależnie od kluczy dostępu – wciąż będzie dostępna."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Wybierz, gdzie zapisywać <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Wybierz menedżera haseł, aby zapisywać informacje i logować się szybciej"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Utworzyć klucz dostępu do logowania w aplikacji <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Zapisać hasło do logowania w aplikacji <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Zapisać dane logowania do aplikacji <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Utworzyć klucz dostępu do logowania w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Zapisać hasło do logowania w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Zapisać dane używane do logowania w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"klucz"</string>
     <string name="password" msgid="6738570945182936667">"hasło"</string>
     <string name="passkeys" msgid="5733880786866559847">"klucze dostępu"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Zamknij"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Użyć zapisanego klucza dla aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Użyć zapisanego hasła do aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Używaj metody odblokowywania ekranu, aby logować się do aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> za pomocą nazwy użytkownika <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Użyć tych danych logowania do aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Odblokować opcje logowania do aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Wybierz zapisany klucz dostępu do aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-pt-rBR/strings.xml b/packages/CredentialManager/res/values-pt-rBR/strings.xml
index 0b03f72..994bc55 100644
--- a/packages/CredentialManager/res/values-pt-rBR/strings.xml
+++ b/packages/CredentialManager/res/values-pt-rBR/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Estamos avançando em direção a um futuro sem senhas, mas elas ainda vão estar disponíveis junto às chaves de acesso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Escolha onde salvar suas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecione um gerenciador de senhas para salvar suas informações e fazer login mais rapidamente na próxima vez"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Criar chave de acesso para fazer login no app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Salvar senha para fazer login no app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Salvar informações de login do app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Criar chave de acesso para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Salvar senha para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Salvar informações de login do app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"chave de acesso"</string>
     <string name="password" msgid="6738570945182936667">"senha"</string>
     <string name="passkeys" msgid="5733880786866559847">"chaves de acesso"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dispensar"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Usar sua chave de acesso salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Usar a senha salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use o bloqueio de tela para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g> com a conta <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Usar seu login para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Desbloquear opções de login para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Escolha uma chave de acesso salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-pt-rPT/strings.xml b/packages/CredentialManager/res/values-pt-rPT/strings.xml
index b4cf374..26c6491 100644
--- a/packages/CredentialManager/res/values-pt-rPT/strings.xml
+++ b/packages/CredentialManager/res/values-pt-rPT/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"À medida que avançamos para um futuro sem palavras-passe, as palavras-passe continuam disponíveis juntamente com as chaves de acesso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Escolha onde guardar as suas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecione um gestor de palavras-passe para guardar as suas informações e iniciar sessão mais rapidamente da próxima vez"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Criar a chave de acesso para iniciar sessão na app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Guardar a palavra-passe para iniciar sessão na app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Guardar as informações de início de sessão da app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Criar a chave de acesso para iniciar sessão na app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Guardar a palavra-passe para iniciar sessão na app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Guardar as informações de início de sessão da app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"chave de acesso"</string>
     <string name="password" msgid="6738570945182936667">"palavra-passe"</string>
     <string name="passkeys" msgid="5733880786866559847">"chaves de acesso"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Ignorar"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Usar a sua chave de acesso guardada na app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Usar a sua palavra-passe guardada para a app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use o seu bloqueio de ecrã para iniciar sessão na app <xliff:g id="APP_NAME">%1$s</xliff:g> com <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Usar o seu início de sessão para a app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Desbloquear as opções de início de sessão para a app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Escolha uma chave de acesso guardada para a app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-pt/strings.xml b/packages/CredentialManager/res/values-pt/strings.xml
index 0b03f72..994bc55 100644
--- a/packages/CredentialManager/res/values-pt/strings.xml
+++ b/packages/CredentialManager/res/values-pt/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Estamos avançando em direção a um futuro sem senhas, mas elas ainda vão estar disponíveis junto às chaves de acesso."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Escolha onde salvar suas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selecione um gerenciador de senhas para salvar suas informações e fazer login mais rapidamente na próxima vez"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Criar chave de acesso para fazer login no app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Salvar senha para fazer login no app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Salvar informações de login do app <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Criar chave de acesso para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Salvar senha para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Salvar informações de login do app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"chave de acesso"</string>
     <string name="password" msgid="6738570945182936667">"senha"</string>
     <string name="passkeys" msgid="5733880786866559847">"chaves de acesso"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dispensar"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Usar sua chave de acesso salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Usar a senha salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use o bloqueio de tela para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g> com a conta <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Usar seu login para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Desbloquear opções de login para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Escolha uma chave de acesso salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ro/strings.xml b/packages/CredentialManager/res/values-ro/strings.xml
index 8c865c4..342b6ab 100644
--- a/packages/CredentialManager/res/values-ro/strings.xml
+++ b/packages/CredentialManager/res/values-ro/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Ne îndreptăm spre un viitor fără parole, însă acestea sunt încă disponibile, alături de cheile de acces."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Alege unde dorești să salvezi <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Selectează un manager de parole pentru a salva informațiile și a te conecta mai rapid data viitoare"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Creezi o cheie de acces pentru a te conecta la <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Salvezi parola pentru a te conecta la <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Salvezi informațiile de conectare pentru <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Creezi o cheie de acces pentru a te conecta la <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Salvezi parola pentru a te conecta la <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Salvezi informațiile de conectare pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"cheia de acces"</string>
     <string name="password" msgid="6738570945182936667">"parolă"</string>
     <string name="passkeys" msgid="5733880786866559847">"cheile de acces"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Închide"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Folosești cheia de acces salvată pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Folosești parola salvată pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Folosește blocarea ecranului ca să te conectezi la <xliff:g id="APP_NAME">%1$s</xliff:g> cu <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Folosești datele de conectare pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Deblochezi opțiunile de conectare pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Alege o cheie de acces salvată pentru <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ru/strings.xml b/packages/CredentialManager/res/values-ru/strings.xml
index 92eea32..e472695 100644
--- a/packages/CredentialManager/res/values-ru/strings.xml
+++ b/packages/CredentialManager/res/values-ru/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Хотя движение к будущему без паролей уже началось, их по-прежнему можно будет использовать наряду с ключами доступа."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Укажите, куда нужно сохранить <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Выберите менеджер паролей, чтобы сохранять учетные данные и быстро выполнять вход."</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Создать ключ доступа для входа в приложение \"<xliff:g id="APPNAME">%1$s</xliff:g>\"?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Сохранить ключ доступа для входа в приложение \"<xliff:g id="APPNAME">%1$s</xliff:g>\"?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Сохранить учетные данные для приложения \"<xliff:g id="APPNAME">%1$s</xliff:g>\"?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Создать ключ доступа для входа в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Сохранить пароль для входа в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Сохранить данные для входа в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
     <string name="passkey" msgid="632353688396759522">"ключ доступа"</string>
     <string name="password" msgid="6738570945182936667">"пароль"</string>
     <string name="passkeys" msgid="5733880786866559847">"ключи доступа"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Закрыть"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Использовать сохраненный ключ доступа для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Использовать сохраненный пароль для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Используйте способ разблокировки экрана для входа в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" (<xliff:g id="USERNAME">%2$s</xliff:g>)."</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Войти в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" с этими данными?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Разблокировать варианты входа для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Выберите сохраненный ключ доступа для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
diff --git a/packages/CredentialManager/res/values-si/strings.xml b/packages/CredentialManager/res/values-si/strings.xml
index ec47018..ce0b9cd 100644
--- a/packages/CredentialManager/res/values-si/strings.xml
+++ b/packages/CredentialManager/res/values-si/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"අපි මුරපද රහිත අනාගතයක් කරා ගමන් කරන විට, මුරයතුරු සමග මුරපද තවමත් පවතී."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"ඔබේ <xliff:g id="CREATETYPES">%1$s</xliff:g> සුරැකිය යුතු ස්ථානය තෝරා ගන්න"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"ඔබේ තතු සුරැකීමට සහ මීළඟ වතාවේ වේගයෙන් පුරනය වීමට මුරපද කළමනාකරුවෙකු තෝරන්න"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> වෙත පුරනය වීමට මුරයතුරක් තනන්න ද?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> වෙත පුරනය වීමට මුරපදය සුරකින්න ද?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> සඳහා පුරනය වීමේ තතු සුරකින්න ද?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> වෙත පුරනය වීමට මුරයතුරක් තනන්න ද?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> වෙත පුරනය වීමට මුරපදය සුරකින්න ද?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා පුරනය වීමේ තතු සුරකින්න ද?"</string>
     <string name="passkey" msgid="632353688396759522">"මුරයතුර"</string>
     <string name="password" msgid="6738570945182936667">"මුරපදය"</string>
     <string name="passkeys" msgid="5733880786866559847">"මුරයතුරු"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"අස් කරන්න"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා ඔබේ සුරැකි මුරයතුර භාවිතා කරන්න ද?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා ඔබේ සුරැකි මුරපදය භාවිත කරන්න ද?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> සමඟින් <xliff:g id="APP_NAME">%1$s</xliff:g> වෙත පුරනය වීමට ඔබේ තිර අගුල භාවිත කරන්න"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා ඔබේ පුරනය වීම භාවිතා කරන්න ද?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා පුරන විකල්ප අගුලු හරින්න ද?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා සුරකින ලද මුරයතුරක් තෝරන්න"</string>
diff --git a/packages/CredentialManager/res/values-sk/strings.xml b/packages/CredentialManager/res/values-sk/strings.xml
index 7426c97..62a2e69 100644
--- a/packages/CredentialManager/res/values-sk/strings.xml
+++ b/packages/CredentialManager/res/values-sk/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Blížime sa k budúcnosti bez hesiel, ale heslá budú popri prístupových kľúčoch stále k dispozícii."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Vyberte, kam sa majú ukladať <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Vyberte správcu hesiel, do ktorého sa budú ukladať vaše údaje, aby ste sa nabudúce mohli rýchlejšie prihlásiť"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Chcete vytvoriť prístupový kľúč na prihlasovanie do aplikácie <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Chcete uložiť heslo na prihlasovanie do aplikácie <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Chcete uložiť prihlasovacie údaje pre aplikáciu <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Chcete vytvoriť prístupový kľúč na prihlasovanie do aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Chcete uložiť heslo na prihlasovanie do aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Chcete uložiť prihlasovacie údaje pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"prístupový kľúč"</string>
     <string name="password" msgid="6738570945182936667">"heslo"</string>
     <string name="passkeys" msgid="5733880786866559847">"prístupové kľúče"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Zavrieť"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Chcete pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g> použiť uložený prístupový kľúč?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Chcete použiť uložené heslo aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Pomocou zámky obrazovky sa prihláste do aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g> používateľským menom <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Chcete použiť svoje prihlásenie pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Chcete odomknúť možnosti prihlásenia pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Vyberte uložený prístupový kľúč pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-sl/strings.xml b/packages/CredentialManager/res/values-sl/strings.xml
index 8e08512..d2aaf68 100644
--- a/packages/CredentialManager/res/values-sl/strings.xml
+++ b/packages/CredentialManager/res/values-sl/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Na poti v prihodnost brez gesel bodo poleg ključev za dostop še vedno v uporabi tudi gesla."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Izbira mesta za shranjevanje <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Izberite upravitelja gesel za shranjevanje podatkov za prijavo, da se boste naslednjič lahko hitreje prijavili."</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Želite ustvariti ključ za dostop za prijavo v aplikacijo <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Želite shraniti geslo za prijavo v aplikacijo <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Želite shraniti podatke za prijavo za aplikacijo <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Želite ustvariti ključ za dostop za prijavo v aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Želite shraniti geslo za prijavo v aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Želite shraniti podatke za prijavo za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"ključ za dostop"</string>
     <string name="password" msgid="6738570945182936667">"geslo"</string>
     <string name="passkeys" msgid="5733880786866559847">"ključi za dostop"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Opusti"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Želite uporabiti shranjeni ključ za dostop do aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Ali želite uporabiti shranjeno geslo za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Uporabite zaklepanje zaslona za prijavo v aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g> z uporabniškim imenom <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Želite uporabiti svojo prijavo za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Želite odkleniti možnosti prijave za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Izberite shranjeni ključ za dostop za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-sq/strings.xml b/packages/CredentialManager/res/values-sq/strings.xml
index 96f1ff0..f31d16a 100644
--- a/packages/CredentialManager/res/values-sq/strings.xml
+++ b/packages/CredentialManager/res/values-sq/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Teksa shkojmë drejt një të ardhmeje pa fjalëkalime, këto të fundit do të ofrohen ende së bashku me çelësat e kalimit."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Zgjidh se ku t\'i ruash <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Zgjidh një menaxher fjalëkalimesh për të ruajtur informacionet e tua dhe për t\'u identifikuar më shpejt herën tjetër"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Të krijohet një çelës kalimit për t\'u identifikuar në <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Të ruhet fjalëkalimi për t\'u identifikuar në <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Të ruhen informacionet e identifikimit për <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Të krijohet një çelës kalimi për t\'u identifikuar në <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Të ruhet fjalëkalimi për t\'u identifikuar në <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Të ruhen informacionet e identifikimit për <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"çelësin e kalimit"</string>
     <string name="password" msgid="6738570945182936667">"fjalëkalimi"</string>
     <string name="passkeys" msgid="5733880786866559847">"çelësat e kalimit"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Hiq"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Të përdoret fjalëkalimi yt i ruajtur për <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Të përdoret fjalëkalimi i ruajtur për <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Përdor kyçjen e ekranit për t\'u identifikuar në <xliff:g id="APP_NAME">%1$s</xliff:g> me <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Të përdoret identifikimi yt për <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Të shkyçen opsionet e identifikimit për <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Zgjidh një çelës kalimi të ruajtur për <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-sr/strings.xml b/packages/CredentialManager/res/values-sr/strings.xml
index dae62bc..e68a20c 100644
--- a/packages/CredentialManager/res/values-sr/strings.xml
+++ b/packages/CredentialManager/res/values-sr/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Како се крећемо ка будућности без лозинки, лозинке ће и даље бити доступне уз приступне кодове."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Одаберите где ћете сачувати: <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Изаберите менаџера лозинки да бисте сачували податке и брже се пријавили следећи пут"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Желите да направите приступни кључ да бисте се пријавили у <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Желите да сачувате лозинку да бисте се пријавили у <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Желите да сачувате податке за пријављивање за: <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Желите да направите приступни кључ да бисте се пријавили у <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Желите да сачувате лозинку да бисте се пријавили у <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Желите да сачувате податке за пријављивање за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"приступни кôд"</string>
     <string name="password" msgid="6738570945182936667">"лозинка"</string>
     <string name="passkeys" msgid="5733880786866559847">"приступни кодови"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Одбаци"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Желите да користите сачувани приступни кôд за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Желите да користите сачувану лозинку за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Користите откључавање екрана да бисте се пријавили у <xliff:g id="APP_NAME">%1$s</xliff:g> као <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Желите ли да користите своје податке за пријављивање за апликацију <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Желите да откључате опције пријављивања за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Изаберите сачуван приступни кључ за: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-sv/strings.xml b/packages/CredentialManager/res/values-sv/strings.xml
index 2326497..e18fea1 100644
--- a/packages/CredentialManager/res/values-sv/strings.xml
+++ b/packages/CredentialManager/res/values-sv/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Medan vi beger oss mot en lösenordslös framtid kommer lösenord fortfarande att vara tillgängliga utöver nycklar."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Välj var du vill spara <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Välj en lösenordshanterare för att spara dina uppgifter och logga in snabbare nästa gång"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Vill du skapa en nyckel för att logga in i <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Vill du spara lösenordet för att logga in i <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Vill du spara inloggningsuppgifterna för <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Vill du skapa en nyckel för att logga in i <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Vill du spara lösenordet för att logga in i <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Vill du spara inloggningsuppgifterna för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"nyckel"</string>
     <string name="password" msgid="6738570945182936667">"lösenord"</string>
     <string name="passkeys" msgid="5733880786866559847">"nycklar"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Stäng"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vill du använda din sparade nyckel för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Vill du använda det sparade lösenordet för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Använd skärmlåset för att logga in i <xliff:g id="APP_NAME">%1$s</xliff:g> med <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Vill du använda din inloggning för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vill du låsa upp inloggningsalternativ för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Välj en sparad nyckel för <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-sw/strings.xml b/packages/CredentialManager/res/values-sw/strings.xml
index 6c39509..65672d5 100644
--- a/packages/CredentialManager/res/values-sw/strings.xml
+++ b/packages/CredentialManager/res/values-sw/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Tunavyoelekea katika enzi isiyo ya manenosiri, manenosiri yataendelea kupatikana pamoja na funguo za siri."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Chagua ambako unahifadhi <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Chagua kidhibiti cha manenosiri ili uhifadhi taarifa zako na uingie kwenye akaunti kwa urahisi wakati mwingine"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Ungependa kuunda ufunguo wa siri ili uingie katika <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Ungependa kuhifadhi nenosiri ili uingie katika <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Ungependa kuhifadhi maelezo ya kuingia katika akaunti kwa ajili ya <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Ungependa kubuni ufunguo wa siri wa kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Ungependa kuhifadhi nenosiri la kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Ungependa kuhifadhi maelezo ya kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"ufunguo wa siri"</string>
     <string name="password" msgid="6738570945182936667">"nenosiri"</string>
     <string name="passkeys" msgid="5733880786866559847">"funguo za siri"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Ondoa"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Ungependa kutumia ufunguo wa siri uliohifadhiwa wa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Je, ungependa kutumia nenosiri lako lililohifadhiwa kuingia katika <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Tumia mbinu yako ya kufunga skrini kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g> ukitumia <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Ungependa kutumia kitambulisho chako cha kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Je, ungependa kuona chaguo za kuingia katika <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Chagua ufunguo wa siri uliohifadhiwa ambao ungependa kutumia kuingia katika <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ta/strings.xml b/packages/CredentialManager/res/values-ta/strings.xml
index 6feb66f..49d1710 100644
--- a/packages/CredentialManager/res/values-ta/strings.xml
+++ b/packages/CredentialManager/res/values-ta/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"கடவுச்சொல்லற்ற எதிர்காலத்தை நோக்கி நாம் பயணிக்கிறோம். கடவுச்சாவிகளைப் பயன்படுத்தும் இதே வேளையில் கடவுச்சொற்களையும் பயன்படுத்த முடியும்."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"உங்கள் <xliff:g id="CREATETYPES">%1$s</xliff:g> எங்கே சேமிக்கப்பட வேண்டும் என்பதைத் தேர்வுசெய்யுங்கள்"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"உங்கள் தகவல்களைச் சேமித்து அடுத்த முறை விரைவாக உள்நுழைய ஒரு கடவுச்சொல் நிர்வாகியைத் தேர்வுசெய்யுங்கள்"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> ஆப்ஸில் உள்நுழைய கடவுச்சாவியை உருவாக்கவா?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> ஆப்ஸில் உள்நுழைய கடவுச்சொல்லைச் சேமிக்கவா?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> ஆப்ஸுக்கான உள்நுழைவு விவரங்களைச் சேமிக்கவா?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸில் உள்நுழைய கடவுச்சாவியை உருவாக்கவா?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸில் உள்நுழைய கடவுச்சொல்லைச் சேமிக்கவா?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கான உள்நுழைவுத் தகவலைச் சேமிக்கவா?"</string>
     <string name="passkey" msgid="632353688396759522">"கடவுச்சாவி"</string>
     <string name="password" msgid="6738570945182936667">"கடவுச்சொல்"</string>
     <string name="passkeys" msgid="5733880786866559847">"கடவுச்சாவிகள்"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"நிராகரிக்கும்"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கு ஏற்கெனவே சேமிக்கப்பட்ட கடவுக்குறியீட்டைப் பயன்படுத்தவா?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்குச் சேமித்த கடவுச்சொல்லைப் பயன்படுத்தவா?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> ஐப் பயன்படுத்தி <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸில் உள்நுழைய உங்கள் திரைப் பூட்டைப் பயன்படுத்துங்கள்"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கு உங்கள் உள்நுழைவு விவரங்களைப் பயன்படுத்தவா?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கான உள்நுழைவு விருப்பங்களை அன்லாக் செய்யவா?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கான சேமிக்கப்பட்ட கடவுச்சாவியைத் தேர்ந்தெடுங்கள்"</string>
diff --git a/packages/CredentialManager/res/values-te/strings.xml b/packages/CredentialManager/res/values-te/strings.xml
index bf3c1e0..742a422 100644
--- a/packages/CredentialManager/res/values-te/strings.xml
+++ b/packages/CredentialManager/res/values-te/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"మనం భవిష్యత్తులో పాస్‌వర్డ్ రహిత టెక్నాలజీని ఉపయోగించినా, పాస్‌కీలతో పాటు పాస్‌వర్డ్‌లు కూడా అందుబాటులో ఉంటాయి."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"మీ <xliff:g id="CREATETYPES">%1$s</xliff:g> ఎక్కడ సేవ్ చేయాలో ఎంచుకోండి"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"తర్వాతిసారి మరింత వేగంగా సైన్ ఇన్ చేసేందుకు వీలుగా మీ సమాచారాన్ని సేవ్ చేయడం కోసం ఒక పాస్‌వర్డ్ మేనేజర్‌ను ఎంచుకోండి"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g>‌కు సైన్ ఇన్ చేయడానికి పాస్-కీని క్రియేట్ చేయాలా?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g>‌కు సైన్ ఇన్ చేయడానికి పాస్‌వర్డ్‌ను సేవ్ చేయాలా?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> కోసం సైన్ ఇన్ సమాచారాన్ని సేవ్ చేయాలా?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g>‌కు సైన్ ఇన్ చేయడానికి పాస్-కీని క్రియేట్ చేయాలా?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g>‌కు సైన్ ఇన్ చేయడానికి పాస్‌వర్డ్‌ను సేవ్ చేయాలా?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం సైన్ ఇన్ సమాచారాన్ని సేవ్ చేయాలా?"</string>
     <string name="passkey" msgid="632353688396759522">"పాస్-కీ"</string>
     <string name="password" msgid="6738570945182936667">"పాస్‌వర్డ్"</string>
     <string name="passkeys" msgid="5733880786866559847">"పాస్-కీలు"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"విస్మరించండి"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం మీ సేవ్ చేసిన పాస్-కీని ఉపయోగించాలా?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం మీ సేవ్ చేసిన పాస్‌వర్డ్‌ను ఉపయోగించాలా?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"మీ స్క్రీన్ లాక్‌ను ఉపయోగించి <xliff:g id="USERNAME">%2$s</xliff:g>‌తో <xliff:g id="APP_NAME">%1$s</xliff:g>‌కు సైన్ ఇన్ చేయండి"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం మీ సైన్ ఇన్ వివరాలను ఉపయోగించాలా?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం సైన్ ఇన్ ఆప్షన్‌లను అన్‌లాక్ చేయాలా?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం సేవ్ చేసిన పాస్-కీని ఎంచుకోండి"</string>
diff --git a/packages/CredentialManager/res/values-th/strings.xml b/packages/CredentialManager/res/values-th/strings.xml
index 4fc8ba0e..3f9de26 100644
--- a/packages/CredentialManager/res/values-th/strings.xml
+++ b/packages/CredentialManager/res/values-th/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"ในขณะที่เราก้าวไปสู่อนาคตที่ไม่ต้องใช้รหัสผ่านนั้น รหัสผ่านจะยังคงใช้ได้อยู่ควบคู่ไปกับการเปลี่ยนไปใช้พาสคีย์"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"เลือกว่าต้องการบันทึก<xliff:g id="CREATETYPES">%1$s</xliff:g>ไว้ที่ใด"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"เลือกเครื่องมือจัดการรหัสผ่านเพื่อบันทึกข้อมูลและลงชื่อเข้าใช้เร็วขึ้นในครั้งถัดไป"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"สร้างพาสคีย์เพื่อลงชื่อเข้าใช้ <xliff:g id="APPNAME">%1$s</xliff:g> ไหม"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"บันทึกรหัสผ่านเพื่อลงชื่อเข้าใช้ <xliff:g id="APPNAME">%1$s</xliff:g> ไหม"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"บันทึกข้อมูลการลงชื่อเข้าใช้สำหรับ <xliff:g id="APPNAME">%1$s</xliff:g> ไหม"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"สร้างพาสคีย์เพื่อลงชื่อเข้าใช้ <xliff:g id="APP_NAME">%1$s</xliff:g> ไหม"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"บันทึกรหัสผ่านเพื่อลงชื่อเข้าใช้ <xliff:g id="APP_NAME">%1$s</xliff:g> ไหม"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"บันทึกข้อมูลการลงชื่อเข้าใช้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ไหม"</string>
     <string name="passkey" msgid="632353688396759522">"พาสคีย์"</string>
     <string name="password" msgid="6738570945182936667">"รหัสผ่าน"</string>
     <string name="passkeys" msgid="5733880786866559847">"พาสคีย์"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ปิด"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ใช้พาสคีย์ที่บันทึกไว้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ใช่ไหม"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"ใช้รหัสผ่านที่บันทึกไว้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ใช่ไหม"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"ใช้การล็อกหน้าจอเพื่อลงชื่อเข้าใช้ <xliff:g id="APP_NAME">%1$s</xliff:g> ด้วย <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"ใช้การลงชื่อเข้าใช้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ใช่ไหม"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"ปลดล็อกตัวเลือกการลงชื่อเข้าใช้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ใช่ไหม"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"เลือกพาสคีย์ที่บันทึกไว้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-tl/strings.xml b/packages/CredentialManager/res/values-tl/strings.xml
index e6bcadd..659c1ec 100644
--- a/packages/CredentialManager/res/values-tl/strings.xml
+++ b/packages/CredentialManager/res/values-tl/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Habang lumalayo tayo sa mga password, magiging available pa rin ang mga password kasama ng mga passkey."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Piliin kung saan mo ise-save ang iyong <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Pumili ng password manager para ma-save ang iyong impormasyon at makapag-sign in nang mas mabilis sa susunod na pagkakataon"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Gumawa ng passkey para mag-sign in sa <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"I-save ang password para mag-sign in sa <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"I-save ang impormasyon sa pag-sign in para sa <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Gumawa ng passkey para mag-sign in sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"I-save ang password para mag-sign in sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"I-save ang impormasyon sa pag-sign in para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"passkey"</string>
     <string name="password" msgid="6738570945182936667">"password"</string>
     <string name="passkeys" msgid="5733880786866559847">"mga passkey"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"I-dismiss"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gamitin ang iyong naka-save na passkey para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Gamitin ang iyong naka-save na password para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Gamitin ang iyong lock ng screen para mag-sign in sa <xliff:g id="APP_NAME">%1$s</xliff:g> gamit ang <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Gamitin ang iyong sign-in para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"I-unlock ang mga opsyon sa pag-sign in para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Pumili ng naka-save na passkey para sa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-tr/strings.xml b/packages/CredentialManager/res/values-tr/strings.xml
index f9455e7..5139a67 100644
--- a/packages/CredentialManager/res/values-tr/strings.xml
+++ b/packages/CredentialManager/res/values-tr/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Şifresiz bir geleceğe doğru ilerlerken şifreler, geçiş anahtarlarıyla birlikte kullanılmaya devam edecektir."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> kaydedileceği yeri seçin"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Bilgilerinizi kaydedip bir dahaki sefere daha hızlı oturum açmak için bir şifre yöneticisi seçin"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> uygulamasında oturum açmak için geçiş anahtarı oluşturulsun mu?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> uygulamasında oturum açmak için şifre kaydedilsin mi?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> için oturum açma bilgileri kaydedilsin mi?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasında oturum açmak için geçiş anahtarı oluşturulsun mu?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasında oturum açmak için şifre kaydedilsin mi?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> için oturum açma bilgileri kaydedilsin mi?"</string>
     <string name="passkey" msgid="632353688396759522">"Geçiş anahtarı"</string>
     <string name="password" msgid="6738570945182936667">"Şifre"</string>
     <string name="passkeys" msgid="5733880786866559847">"Geçiş anahtarlarınızın"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Kapat"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı geçiş anahtarınız kullanılsın mı?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı şifreniz kullanılsın mı?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasında <xliff:g id="USERNAME">%2$s</xliff:g> hesabıyla oturum açmak için ekran kilidinizi kullanın"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> için oturum açma bilgileriniz kullanılsın mı?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> için oturum açma seçeneklerine izin verilsin mi?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı bir geçiş anahtarı kullanın"</string>
diff --git a/packages/CredentialManager/res/values-uk/strings.xml b/packages/CredentialManager/res/values-uk/strings.xml
index e804777..62eac9a 100644
--- a/packages/CredentialManager/res/values-uk/strings.xml
+++ b/packages/CredentialManager/res/values-uk/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"На шляху до безпарольного майбутнього паролі й надалі будуть використовуватися паралельно з ключами доступу."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Виберіть, де зберігати <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Виберіть менеджер паролів, щоб зберігати свої дані й надалі входити в облікові записи швидше"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Створити ключ доступу для входу в додаток <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Зберегти пароль для входу в додаток <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Зберегти дані для входу для додатка <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Створити ключ доступу для входу в додаток <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Зберегти пароль для входу в додаток <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Зберегти дані для входу для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"ключ доступу"</string>
     <string name="password" msgid="6738570945182936667">"пароль"</string>
     <string name="passkeys" msgid="5733880786866559847">"ключі доступу"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Закрити"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Використати збережений ключ доступу для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Використати ваш збережений пароль для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Використовуйте свій спосіб розблокування екрана, щоб входити в додаток <xliff:g id="APP_NAME">%1$s</xliff:g> як користувач <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Використовувати ваші дані для входу в додаток <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Розблокувати опції входу для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Виберіть збережений ключ доступу для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ur/strings.xml b/packages/CredentialManager/res/values-ur/strings.xml
index 9562fdf..9fad273 100644
--- a/packages/CredentialManager/res/values-ur/strings.xml
+++ b/packages/CredentialManager/res/values-ur/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"چونکہ ہم بغیر پاس ورڈ والے مستقبل کی طرف جا رہے ہیں اس کے باوجود پاس ورڈز پاس کیز کے ساتھ ہی دستیاب ہوں گے۔"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"منتخب کریں کہ آپ کی <xliff:g id="CREATETYPES">%1$s</xliff:g> کو کہاں محفوظ کرنا ہے"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"اپنی معلومات کو محفوظ کرنے اور اگلی بار تیزی سے سائن ان کرنے کے لیے پاس ورڈ مینیجر منتخب کریں"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> میں سائن ان کرنے کیلئے پاس کی تخلیق کریں؟"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> میں سائن ان کرنے کیلئے پاس ورڈ محفوظ کریں؟"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> کے لیے سائن ان کی معلومات محفوظ کریں؟"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> میں سائن ان کرنے کیلئے پاس کی تخلیق کریں؟"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> میں سائن ان کرنے کیلئے پاس ورڈ محفوظ کریں؟"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے سائن ان کی معلومات محفوظ کریں؟"</string>
     <string name="passkey" msgid="632353688396759522">"پاس کی"</string>
     <string name="password" msgid="6738570945182936667">"پاس ورڈ"</string>
     <string name="passkeys" msgid="5733880786866559847">"پاس کیز"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"برخاست کریں"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے اپنی محفوظ کردہ پاس کی استعمال کریں؟"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے آپ کا محفوظ کردہ پاس ورڈ استعمال کریں؟"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> کے ساتھ <xliff:g id="APP_NAME">%1$s</xliff:g> میں سائن ان کرنے کے لیے اپنا اسکرین لاک استعمال کریں"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے آپ کی سائن ان تفصیلات استعمال کریں؟"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے سائن ان کے اختیارات کو غیر مقفل کریں؟"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے ایک محفوظ کردہ پاس کی منتخب کریں"</string>
diff --git a/packages/CredentialManager/res/values-uz/strings.xml b/packages/CredentialManager/res/values-uz/strings.xml
index 8b9cecd..a3d2025 100644
--- a/packages/CredentialManager/res/values-uz/strings.xml
+++ b/packages/CredentialManager/res/values-uz/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Parolsiz kelajak sari harakatlanar ekanmiz, parollar kalitlar bilan birga ishlatilishda davom etadi."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Bu <xliff:g id="CREATETYPES">%1$s</xliff:g> qayerga saqlanishini tanlang"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Maʼlumotlaringizni saqlash va keyingi safar tez kirish uchun parollar menejerini tanlang"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"<xliff:g id="APPNAME">%1$s</xliff:g> ilovasiga kirish uchun kirish kaliti yaratilsinmi?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"<xliff:g id="APPNAME">%1$s</xliff:g> ilovasiga kirish uchun parol saqlansinmi?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"<xliff:g id="APPNAME">%1$s</xliff:g> uchun kirish maʼlumoti saqlansinmi?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga kirish uchun kirish kaliti yaratilsinmi?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga kirish uchun parol saqlansinmi?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun kirish maʼlumoti saqlansinmi?"</string>
     <string name="passkey" msgid="632353688396759522">"kalit"</string>
     <string name="password" msgid="6738570945182936667">"parol"</string>
     <string name="passkeys" msgid="5733880786866559847">"kalitlar"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Yopish"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun saqlangan kalit ishlatilsinmi?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun saqlangan parol ishlatilsinmi?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga <xliff:g id="USERNAME">%2$s</xliff:g> bilan kirish uchun ekran qulfini ishlating"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga bu maʼlumotlar bilan kirilsinmi?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun kirish usullari ochilsinmi?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun saqlangan kalitni tanlang"</string>
diff --git a/packages/CredentialManager/res/values-vi/strings.xml b/packages/CredentialManager/res/values-vi/strings.xml
index c774b93..da04efd 100644
--- a/packages/CredentialManager/res/values-vi/strings.xml
+++ b/packages/CredentialManager/res/values-vi/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Trong quá trình chúng tôi hướng đến tương lai không dùng mật khẩu, bạn vẫn sẽ dùng được mật khẩu cùng với khoá truy cập."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Chọn vị trí lưu <xliff:g id="CREATETYPES">%1$s</xliff:g> của bạn"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Hãy chọn một trình quản lý mật khẩu để lưu thông tin của bạn và đăng nhập nhanh hơn vào lần tới"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Tạo khoá truy cập để đăng nhập vào <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Lưu mật khẩu để đăng nhập vào <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Lưu thông tin đăng nhập cho <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Tạo khoá truy cập để đăng nhập vào <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Lưu mật khẩu để đăng nhập vào <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Lưu thông tin đăng nhập cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"khoá đăng nhập"</string>
     <string name="password" msgid="6738570945182936667">"mật khẩu"</string>
     <string name="passkeys" msgid="5733880786866559847">"khoá truy cập"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Đóng"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Dùng khoá đăng nhập bạn đã lưu cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Sử dụng mật khẩu bạn đã lưu cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Dùng phương thức khoá màn hình để đăng nhập vào <xliff:g id="APP_NAME">%1$s</xliff:g> bằng <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Dùng thông tin đăng nhập của bạn cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Mở khoá các tuỳ chọn đăng nhập cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Chọn khoá truy cập đã lưu cho <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-zh-rCN/strings.xml b/packages/CredentialManager/res/values-zh-rCN/strings.xml
index 11448e9..968e978 100644
--- a/packages/CredentialManager/res/values-zh-rCN/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rCN/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"在我们向无密码未来迈进的过程中,密码仍会与通行密钥并行使用。"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"选择保存<xliff:g id="CREATETYPES">%1$s</xliff:g>的位置"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"请选择一款密码管理工具来保存您的信息,以便下次更快地登录"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"要创建通行密钥以便登录 <xliff:g id="APPNAME">%1$s</xliff:g> 吗?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"要保存密码以便登录 <xliff:g id="APPNAME">%1$s</xliff:g> 吗?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"要保存“<xliff:g id="APPNAME">%1$s</xliff:g>”的登录信息吗?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"要创建通行密钥以便登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”吗?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"要保存密码以便登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”吗?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"要保存“<xliff:g id="APP_NAME">%1$s</xliff:g>”的登录信息吗?"</string>
     <string name="passkey" msgid="632353688396759522">"通行密钥"</string>
     <string name="password" msgid="6738570945182936667">"密码"</string>
     <string name="passkeys" msgid="5733880786866559847">"通行密钥"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"忽略"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"要使用您为“<xliff:g id="APP_NAME">%1$s</xliff:g>”保存的通行密钥吗?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"要使用已保存的密码登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”吗?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"使用您的屏锁以 <xliff:g id="USERNAME">%2$s</xliff:g> 的身份登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"是否使用您的<xliff:g id="APP_NAME">%1$s</xliff:g>登录凭据继续?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"要解锁“<xliff:g id="APP_NAME">%1$s</xliff:g>”的登录选项吗?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"选择一个已保存的通行密钥来登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
diff --git a/packages/CredentialManager/res/values-zh-rHK/strings.xml b/packages/CredentialManager/res/values-zh-rHK/strings.xml
index 8f69643..7a375c9 100644
--- a/packages/CredentialManager/res/values-zh-rHK/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rHK/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"我們將會改用無密碼技術,而密碼仍可與密鑰並行使用。"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"選擇儲存<xliff:g id="CREATETYPES">%1$s</xliff:g>的位置"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"選取密碼管理工具即可儲存自己的資料,縮短下次登入的時間"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"要建立密鑰以登入「<xliff:g id="APPNAME">%1$s</xliff:g>」嗎?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"要儲存密碼以登入「<xliff:g id="APPNAME">%1$s</xliff:g>」嗎?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"要儲存「<xliff:g id="APPNAME">%1$s</xliff:g>」的登入資料嗎?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"要建立密鑰以登入 <xliff:g id="APP_NAME">%1$s</xliff:g> 嗎?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"要儲存密碼以登入 <xliff:g id="APP_NAME">%1$s</xliff:g> 嗎?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"要儲存 <xliff:g id="APP_NAME">%1$s</xliff:g> 的登入資料嗎?"</string>
     <string name="passkey" msgid="632353688396759522">"密鑰"</string>
     <string name="password" msgid="6738570945182936667">"密碼"</string>
     <string name="passkeys" msgid="5733880786866559847">"密鑰"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"關閉"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密鑰嗎?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼嗎?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"使用螢幕鎖定方式以 <xliff:g id="USERNAME">%2$s</xliff:g> 登入 <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"要以此登入方式使用「<xliff:g id="APP_NAME">%1$s</xliff:g>」嗎?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"要解鎖「<xliff:g id="APP_NAME">%1$s</xliff:g>」的登入選項嗎?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"選擇已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密鑰"</string>
diff --git a/packages/CredentialManager/res/values-zh-rTW/strings.xml b/packages/CredentialManager/res/values-zh-rTW/strings.xml
index b5fa62c..0299088 100644
--- a/packages/CredentialManager/res/values-zh-rTW/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rTW/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"我們日後將改採無密碼技術,密碼仍可與密碼金鑰並行使用。"</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"選擇要將<xliff:g id="CREATETYPES">%1$s</xliff:g>存在哪裡"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"選取密碼管理工具並儲存資訊,下次就能更快登入"</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"要建立密碼金鑰以登入「<xliff:g id="APPNAME">%1$s</xliff:g>」嗎?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"要儲存密碼以登入「<xliff:g id="APPNAME">%1$s</xliff:g>」嗎?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"要儲存「<xliff:g id="APPNAME">%1$s</xliff:g>」的登入資訊嗎?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"要建立用於登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」的密碼金鑰嗎?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"要儲存用於登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」的密碼嗎?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"要儲存「<xliff:g id="APP_NAME">%1$s</xliff:g>」的登入資訊嗎?"</string>
     <string name="passkey" msgid="632353688396759522">"密碼金鑰"</string>
     <string name="password" msgid="6738570945182936667">"密碼"</string>
     <string name="passkeys" msgid="5733880786866559847">"密碼金鑰"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"關閉"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼金鑰嗎?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼嗎?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"用 <xliff:g id="USERNAME">%2$s</xliff:g> 登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」時使用螢幕鎖定功能進行驗證"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"要使用你的憑證登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」嗎?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"要解鎖「<xliff:g id="APP_NAME">%1$s</xliff:g>」的登入選項嗎?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"選擇已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼金鑰"</string>
diff --git a/packages/CredentialManager/res/values-zu/strings.xml b/packages/CredentialManager/res/values-zu/strings.xml
index 5915a73..4f888f4 100644
--- a/packages/CredentialManager/res/values-zu/strings.xml
+++ b/packages/CredentialManager/res/values-zu/strings.xml
@@ -39,9 +39,9 @@
     <string name="seamless_transition_detail" msgid="4475509237171739843">"Njengoba sibhekela kwikusasa elingenaphasiwedi, amagama ayimfihlo asazotholakala eceleni kokhiye bokudlula."</string>
     <string name="choose_provider_title" msgid="8870795677024868108">"Khetha lapho ongagcina khona i-<xliff:g id="CREATETYPES">%1$s</xliff:g> yakho"</string>
     <string name="choose_provider_body" msgid="4967074531845147434">"Khetha isiphathi sephasiwedi ukuze ulondoloze ulwazi lwakho futhi ungene ngemvume ngokushesha ngesikhathi esizayo."</string>
-    <string name="choose_create_option_passkey_title" msgid="7980430650778623135">"Sungula ukhiye wokudlula ukuze ungene ngemvume ku-<xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_password_title" msgid="6238446571944651980">"Londoloza iphasiwedi ukuze ungene ngemvume ku-<xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
-    <string name="choose_create_option_sign_in_title" msgid="4124872317613421249">"Londoloza ulwazi lokungena lwe-<xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Sungula ukhiye wokudlula ukuze ungene ngemvume ku-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_password_title" msgid="4481366993598649224">"Londoloza iphasiwedi ukuze ungene ngemvume ku-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Londoloza ulwazi lokungena lwe-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="passkey" msgid="632353688396759522">"ukhiye wokudlula"</string>
     <string name="password" msgid="6738570945182936667">"iphasiwedi"</string>
     <string name="passkeys" msgid="5733880786866559847">"okhiye bokudlula"</string>
@@ -70,6 +70,7 @@
     <string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Chitha"</string>
     <string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Sebenzisa ukhiye wakho wokungena olondoloziwe <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Sebenzisa iphasiwedi yakho elondoloziwe ye-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+    <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Sebenzisa ukukhiya kwakho kwesikrini ukuze ungene ngemvume ku-<xliff:g id="APP_NAME">%1$s</xliff:g> ngo-<xliff:g id="USERNAME">%2$s</xliff:g>"</string>
     <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Sebenzisa ukungena kwakho ngemvume ku-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vula ukungena ngemvume okukhethwa kukho kwe-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
     <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Khetha ukhiye wokudlula olondoloziwe we-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values/strings.xml b/packages/CredentialManager/res/values/strings.xml
index bc35a85..9fd386f 100644
--- a/packages/CredentialManager/res/values/strings.xml
+++ b/packages/CredentialManager/res/values/strings.xml
@@ -68,6 +68,13 @@
   <string name="choose_create_option_password_title">Save password to sign in to <xliff:g id="app_name" example="Tribank">%1$s</xliff:g>?</string>
   <!-- This appears as the title of the modal bottom sheet for users to choose the create option inside a provider when the credential type is others. [CHAR LIMIT=200] -->
   <string name="choose_create_option_sign_in_title">Save sign-in info for <xliff:g id="app_name" example="Tribank">%1$s</xliff:g>?</string>
+  <!-- This appears as a description of the modal bottom sheet when the single tap sign in flow is used for the create passkey flow. [CHAR LIMIT=200] -->
+  <string name="choose_create_single_tap_passkey_title">Use your screen lock to create a passkey for <xliff:g id="app_name" example="Shrine">%1$s</xliff:g>?</string>
+  <!-- This appears as a description of the modal bottom sheet when the single tap sign in flow is used for the create password flow. [CHAR LIMIT=200] -->
+  <string name="choose_create_single_tap_password_title">Use your screen lock to create a password for <xliff:g id="app_name" example="Shrine">%1$s</xliff:g>?</string>
+  <!-- This appears as a description of the modal bottom sheet when the single tap sign in flow is used for the create flow when the credential type is others. [CHAR LIMIT=200] -->
+  <!-- TODO(b/326243891) : Confirm with team on dynamically setting this based on recent product and ux discussions (does not disrupt e2e) -->
+  <string name="choose_create_single_tap_sign_in_title">Use your screen lock to save sign in info for <xliff:g id="app_name" example="Shrine">%1$s</xliff:g>?</string>
   <!-- Types which are inserted as a placeholder as credentialTypes for other strings. [CHAR LIMIT=200] -->
   <string name="passkey">passkey</string>
   <string name="password">password</string>
diff --git a/packages/CredentialManager/shared/project.config b/packages/CredentialManager/shared/project.config
new file mode 100644
index 0000000..f748d6c
--- /dev/null
+++ b/packages/CredentialManager/shared/project.config
@@ -0,0 +1,9 @@
+[notify "team"]
+	header = cc
+        email = [email protected]
+        email = [email protected]
+	email = [email protected]
+	email = [email protected]
+	email = [email protected]
+	type = new_changes
+	type = submitted_changes
\ No newline at end of file
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt
index f2c252e..9c8ec3b 100644
--- a/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt
@@ -51,6 +51,8 @@
 import com.android.credentialmanager.model.BiometricRequestInfo
 import com.android.credentialmanager.model.EntryInfo
 
+const val CREDENTIAL_ENTRY_PREFIX = "androidx.credentials.provider.credentialEntry."
+
 fun EntryInfo.getIntentSenderRequest(
     isAutoSelected: Boolean = false
 ): IntentSenderRequest? {
@@ -140,7 +142,8 @@
                     isDefaultIconPreferredAsSingleProvider =
                             credentialEntry.isDefaultIconPreferredAsSingleProvider,
                     affiliatedDomain = credentialEntry.affiliatedDomain?.toString(),
-                    biometricRequest = predetermineAndValidateBiometricFlow(it),
+                    biometricRequest = retrieveEntryBiometricRequest(it,
+                        CREDENTIAL_ENTRY_PREFIX),
                 )
                 )
             }
@@ -169,7 +172,8 @@
                     isDefaultIconPreferredAsSingleProvider =
                             credentialEntry.isDefaultIconPreferredAsSingleProvider,
                     affiliatedDomain = credentialEntry.affiliatedDomain?.toString(),
-                    biometricRequest = predetermineAndValidateBiometricFlow(it),
+                    biometricRequest = retrieveEntryBiometricRequest(it,
+                        CREDENTIAL_ENTRY_PREFIX),
                 )
                 )
             }
@@ -197,7 +201,8 @@
                     isDefaultIconPreferredAsSingleProvider =
                             credentialEntry.isDefaultIconPreferredAsSingleProvider,
                     affiliatedDomain = credentialEntry.affiliatedDomain?.toString(),
-                    biometricRequest = predetermineAndValidateBiometricFlow(it),
+                    biometricRequest = retrieveEntryBiometricRequest(it,
+                        CREDENTIAL_ENTRY_PREFIX),
                 )
                 )
             }
@@ -211,27 +216,32 @@
 }
 
 /**
- * This validates if this is a biometric flow or not, and if it is, this returns the expected
+ * This validates if the entry calling this method contains biometric info, and if so, returns a
  * [BiometricRequestInfo]. Namely, the biometric flow must have at least the
  * ALLOWED_AUTHENTICATORS bit passed from Jetpack.
  * Note that the required values, such as the provider info's icon or display name, or the entries
  * credential type or userName, and finally the display info's app name, are non-null and must
  * exist to run through the flow.
+ *
+ * @param hintPrefix a string prefix indicating the type of entry being utilized, since both create
+ * and get flows utilize slice params; includes the final '.' before the name of the type (e.g.
+ * androidx.credentials.provider.credentialEntry.SLICE_HINT_ALLOWED_AUTHENTICATORS must have
+ * 'hintPrefix' up to "androidx.credentials.provider.credentialEntry.")
  * // TODO(b/326243754) : Presently, due to dependencies, the opId bit is parsed but is never
  * // expected to be used. When it is added, it should be lightly validated.
  */
-private fun predetermineAndValidateBiometricFlow(
-    it: Entry
+fun retrieveEntryBiometricRequest(
+    entry: Entry,
+    hintPrefix: String,
 ): BiometricRequestInfo? {
     // TODO(b/326243754) : When available, use the official jetpack structured type
-    val allowedAuthenticators: Int? = it.slice.items.firstOrNull {
-        it.hasHint("androidx.credentials." +
-                "provider.credentialEntry.SLICE_HINT_ALLOWED_AUTHENTICATORS")
+    val allowedAuthenticators: Int? = entry.slice.items.firstOrNull {
+        it.hasHint(hintPrefix + "SLICE_HINT_ALLOWED_AUTHENTICATORS")
     }?.int
 
     // This is optional and does not affect validating the biometric flow in any case
-    val opId: Int? = it.slice.items.firstOrNull {
-        it.hasHint("androidx.credentials.provider.credentialEntry.SLICE_HINT_CRYPTO_OP_ID")
+    val opId: Int? = entry.slice.items.firstOrNull {
+        it.hasHint(hintPrefix + "SLICE_HINT_CRYPTO_OP_ID")
     }?.int
     if (allowedAuthenticators != null) {
         return BiometricRequestInfo(opId = opId, allowedAuthenticators = allowedAuthenticators)
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
index 28c40479..888777e 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
@@ -18,6 +18,7 @@
 
 import android.app.Activity
 import android.hardware.biometrics.BiometricPrompt
+import android.hardware.biometrics.BiometricPrompt.AuthenticationResult
 import android.os.IBinder
 import android.text.TextUtils
 import android.util.Log
@@ -29,6 +30,8 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.lifecycle.ViewModel
+import com.android.credentialmanager.common.BiometricFlowType
+import com.android.credentialmanager.common.BiometricPromptState
 import com.android.credentialmanager.common.BiometricResult
 import com.android.credentialmanager.common.BiometricState
 import com.android.credentialmanager.model.EntryInfo
@@ -39,6 +42,7 @@
 import com.android.credentialmanager.createflow.ActiveEntry
 import com.android.credentialmanager.createflow.CreateCredentialUiState
 import com.android.credentialmanager.createflow.CreateScreenState
+import com.android.credentialmanager.createflow.isBiometricFlow
 import com.android.credentialmanager.getflow.GetCredentialUiState
 import com.android.credentialmanager.getflow.GetScreenState
 import com.android.credentialmanager.logging.LifecycleEvent
@@ -301,10 +305,24 @@
     }
 
     fun createFlowOnEntrySelectedFromMoreOptionScreen(activeEntry: ActiveEntry) {
+        val isBiometricFlow = isBiometricFlow(activeEntry = activeEntry, isAutoSelectFlow = false)
+        if (isBiometricFlow) {
+            // This atomically ensures that the only edge case that *restarts* the biometric flow
+            // doesn't risk a configuration change bug on the more options page during create.
+            // Namely, it's atomic in that it happens only on a tap, and it is not possible to
+            // reproduce a tap and a rotation at the same time. However, even if it were, it would
+            // just be an alternate way to jump back into the biometric selection flow after this
+            // reset, and thus, the state machine is maintained.
+            onBiometricPromptStateChange(BiometricPromptState.INACTIVE)
+        }
         uiState = uiState.copy(
             createCredentialUiState = uiState.createCredentialUiState?.copy(
                 currentScreenState =
-                if (uiState.createCredentialUiState?.requestDisplayInfo?.userSetDefaultProviderIds
+                // An autoselect flow never makes it to the more options screen
+                if (isBiometricFlow) {
+                    CreateScreenState.BIOMETRIC_SELECTION
+                } else if (
+                    uiState.createCredentialUiState?.requestDisplayInfo?.userSetDefaultProviderIds
                         ?.contains(activeEntry.activeProvider.id) ?: true ||
                     !(uiState.createCredentialUiState?.foundCandidateFromUserDefaultProvider
                     ?: false) ||
@@ -330,7 +348,10 @@
         )
     }
 
-    fun createFlowOnEntrySelected(selectedEntry: EntryInfo) {
+    fun createFlowOnEntrySelected(
+        selectedEntry: EntryInfo,
+        authResult: AuthenticationResult? = null
+    ) {
         val providerId = selectedEntry.providerId
         val entryKey = selectedEntry.entryKey
         val entrySubkey = selectedEntry.entrySubkey
@@ -341,6 +362,9 @@
             uiState = uiState.copy(
                 selectedEntry = selectedEntry,
                 providerActivityState = ProviderActivityState.READY_TO_LAUNCH,
+                biometricState = if (authResult == null) uiState.biometricState else uiState
+                    .biometricState.copy(biometricResult = BiometricResult(
+                        biometricAuthenticationResult = authResult))
             )
         } else {
             credManRepo.onOptionSelected(
@@ -363,13 +387,48 @@
         }
     }
 
+    /**************************************************************************/
+    /*****                     Biometric Flow Callbacks                   *****/
+    /**************************************************************************/
+
+    /**
+     * This allows falling back from the biometric prompt screen to the normal get flow by applying
+     * a reset to all necessary states involved in the fallback.
+     */
+    fun fallbackFromBiometricToNormalFlow(biometricFlowType: BiometricFlowType) {
+        onBiometricPromptStateChange(BiometricPromptState.INACTIVE)
+        when (biometricFlowType) {
+            BiometricFlowType.GET -> getFlowOnBackToPrimarySelectionScreen()
+            BiometricFlowType.CREATE -> createFlowOnUseOnceSelected()
+        }
+    }
+
+    /**
+     * This method can be used to change the [BiometricPromptState] according to the necessity.
+     * For example, if resetting, one might use [BiometricPromptState.INACTIVE], but if the flow
+     * has just launched, to avoid configuration errors, one can use
+     * [BiometricPromptState.PENDING].
+     */
+    fun onBiometricPromptStateChange(biometricPromptState: BiometricPromptState) {
+        uiState = uiState.copy(
+            biometricState = uiState.biometricState.copy(
+                biometricStatus = biometricPromptState
+            )
+        )
+    }
+
+    /**
+     * This returns the present biometric state.
+     */
+    fun getBiometricPromptState(): BiometricPromptState =
+        uiState.biometricState.biometricStatus
+
+    /**************************************************************************/
+    /*****                     Misc. Callbacks/Logs                       *****/
+    /**************************************************************************/
+
     @Composable
     fun logUiEvent(uiEventEnum: UiEventEnum) {
         this.uiMetrics.log(uiEventEnum, credManRepo.requestInfo?.packageName)
     }
-
-    companion object {
-        // TODO(b/326243754) : Replace/remove once all failure flows added in
-        const val TEMPORARY_FAILURE_CODE = Integer.MIN_VALUE
-    }
 }
\ No newline at end of file
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
index fd6fc6a..c477f30 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
@@ -52,10 +52,12 @@
 import androidx.credentials.provider.RemoteEntry
 import org.json.JSONObject
 import android.credentials.flags.Flags
+import com.android.credentialmanager.createflow.isBiometricFlow
+import com.android.credentialmanager.createflow.isFlowAutoSelectable
 import com.android.credentialmanager.getflow.TopBrandingContent
+import com.android.credentialmanager.ktx.retrieveEntryBiometricRequest
 import java.time.Instant
 
-
 fun getAppLabel(
     pm: PackageManager,
     appPackageName: String
@@ -237,6 +239,9 @@
 
 class CreateFlowUtils {
     companion object {
+
+        private const val CREATE_ENTRY_PREFIX = "androidx.credentials.provider.createEntry."
+
         /**
          * Note: caller required handle empty list due to parsing error.
          */
@@ -417,12 +422,26 @@
                 }
             }
             val defaultProvider = defaultProviderPreferredByApp ?: defaultProviderSetByUser
+            val sortedCreateOptionsPairs = createOptionsPairs.sortedWith(
+                compareByDescending { it.first.lastUsedTime }
+            )
+            val activeEntry = toActiveEntry(
+                defaultProvider = defaultProvider,
+                sortedCreateOptionsPairs = sortedCreateOptionsPairs,
+                remoteEntry = remoteEntry,
+                remoteEntryProvider = remoteEntryProvider,
+            )
+            val isBiometricFlow = if (activeEntry == null) false else isBiometricFlow(activeEntry,
+                isFlowAutoSelectable(
+                    requestDisplayInfo = requestDisplayInfo,
+                    activeEntry = activeEntry,
+                    sortedCreateOptionsPairs = sortedCreateOptionsPairs
+                )
+            )
             val initialScreenState = toCreateScreenState(
                 createOptionSize = createOptionsPairs.size,
                 remoteEntry = remoteEntry,
-            )
-            val sortedCreateOptionsPairs = createOptionsPairs.sortedWith(
-                compareByDescending { it.first.lastUsedTime }
+                isBiometricFlow = isBiometricFlow
             )
             return CreateCredentialUiState(
                 enabledProviders = enabledProviders,
@@ -430,12 +449,7 @@
                 currentScreenState = initialScreenState,
                 requestDisplayInfo = requestDisplayInfo,
                 sortedCreateOptionsPairs = sortedCreateOptionsPairs,
-                activeEntry = toActiveEntry(
-                    defaultProvider = defaultProvider,
-                    sortedCreateOptionsPairs = sortedCreateOptionsPairs,
-                    remoteEntry = remoteEntry,
-                    remoteEntryProvider = remoteEntryProvider,
-                ),
+                activeEntry = activeEntry,
                 remoteEntry = remoteEntry,
                 foundCandidateFromUserDefaultProvider = defaultProviderSetByUser != null,
             )
@@ -444,9 +458,12 @@
         fun toCreateScreenState(
             createOptionSize: Int,
             remoteEntry: RemoteInfo?,
+            isBiometricFlow: Boolean,
         ): CreateScreenState {
             return if (createOptionSize == 0 && remoteEntry != null) {
                 CreateScreenState.EXTERNAL_ONLY_SELECTION
+            } else if (isBiometricFlow) {
+                CreateScreenState.BIOMETRIC_SELECTION
             } else {
                 CreateScreenState.CREATION_OPTION_SELECTION
             }
@@ -503,8 +520,8 @@
                         it.hasHint("androidx.credentials.provider.createEntry.SLICE_HINT_AUTO_" +
                             "SELECT_ALLOWED")
                     }?.text == "true",
-                    // TODO(b/326243754) : Handle this when the create flow is added; for now the
-                    // create flow does not support biometric values
+                    biometricRequest = retrieveEntryBiometricRequest(it,
+                        CREATE_ENTRY_PREFIX),
                 )
                 )
             }
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
index 6ba684d..1253ce3 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
@@ -47,6 +47,7 @@
 import android.util.Log
 import android.content.Intent
 import android.view.autofill.AutofillId
+import android.view.autofill.AutofillManager
 import android.view.autofill.IAutoFillManagerClient
 import android.widget.RemoteViews
 import android.widget.inline.InlinePresentationSpec
@@ -372,6 +373,7 @@
 
         fillResponseBuilder.addDataset(
                 Dataset.Builder()
+                        .setId(AutofillManager.PINNED_DATASET_ID)
                         .setField(
                                 autofillId,
                                 Field.Builder().setPresentations(
@@ -411,6 +413,7 @@
 
         fillResponseBuilder.addDataset(
                 dataSetBuilder
+                        .setId(AutofillManager.PINNED_DATASET_ID)
                         .setField(
                                 autofillId,
                                 Field.Builder().setPresentations(
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/BiometricFlowType.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/BiometricFlowType.kt
new file mode 100644
index 0000000..263cfd5
--- /dev/null
+++ b/packages/CredentialManager/src/com/android/credentialmanager/common/BiometricFlowType.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.credentialmanager.common
+
+enum class BiometricFlowType {
+    GET,
+    CREATE
+}
\ No newline at end of file
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/BiometricHandler.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/BiometricHandler.kt
index db5ab56..be3e043 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/common/BiometricHandler.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/common/BiometricHandler.kt
@@ -26,11 +26,14 @@
 import androidx.core.graphics.drawable.toBitmap
 import com.android.credentialmanager.R
 import com.android.credentialmanager.createflow.EnabledProviderInfo
+import com.android.credentialmanager.createflow.getCreateTitleResCode
 import com.android.credentialmanager.getflow.ProviderDisplayInfo
 import com.android.credentialmanager.getflow.RequestDisplayInfo
 import com.android.credentialmanager.getflow.generateDisplayTitleTextResCode
 import com.android.credentialmanager.model.BiometricRequestInfo
+import com.android.credentialmanager.model.CredentialType
 import com.android.credentialmanager.model.EntryInfo
+import com.android.credentialmanager.model.creation.CreateOptionInfo
 import com.android.credentialmanager.model.get.CredentialEntryInfo
 import com.android.credentialmanager.model.get.ProviderInfo
 import java.lang.Exception
@@ -39,14 +42,30 @@
  * Aggregates common display information used for the Biometric Flow.
  * Namely, this adds the ability to encapsulate the [providerIcon], the providers icon, the
  * [providerName], which represents the name of the provider, the [displayTitleText] which is
- * the large text displaying the flow in progress, and the [descriptionAboveBiometricButton], which
+ * the large text displaying the flow in progress, and the [descriptionForCredential], which
  * describes details of where the credential is being saved, and how.
+ * (E.g. assume a hypothetical provider 'Any Provider' for *passkey* flows with [email protected]:
+ *
+ * 'get' flow:
+ *     - [providerIcon] and [providerName] = 'Any Provider' (and it's icon)
+ *     - [displayTitleText] = "Use your saved passkey for Any Provider?"
+ *     - [descriptionForCredential] = "Use your screen lock to sign in to Any Provider with
+ *     [email protected]"
+ *
+ * 'create' flow:
+ *     - [providerIcon] and [providerName] = 'Any Provider' (and it's icon)
+ *     - [displayTitleText] = "Create passkey to sign in to Any Provider?"
+ *     - [descriptionForCredential] = "Use your screen lock to create a passkey for Any Provider?"
+ * ).
+ *
+ * The above are examples; the credential type can change depending on scenario.
+ * // TODO(b/333445112) : Finalize once all the strings and create flow is iterated to completion
  */
 data class BiometricDisplayInfo(
     val providerIcon: Bitmap,
     val providerName: String,
     val displayTitleText: String,
-    val descriptionAboveBiometricButton: String,
+    val descriptionForCredential: String,
     val biometricRequestInfo: BiometricRequestInfo,
 )
 
@@ -57,9 +76,7 @@
  */
 data class BiometricState(
     val biometricResult: BiometricResult? = null,
-    val biometricError: BiometricError? = null,
-    val biometricHelp: BiometricHelp? = null,
-    val biometricAcquireInfo: Int? = null,
+    val biometricStatus: BiometricPromptState = BiometricPromptState.INACTIVE
 )
 
 /**
@@ -88,55 +105,115 @@
 )
 
 /**
+ * This is the entry point to start the integrated biometric prompt for 'get' flows. It captures
+ * information specific to the get flow, along with required shared callbacks and more general
+ * info across both flows, such as the tapped [EntryInfo] or [sendDataToProvider].
+ */
+fun runBiometricFlowForGet(
+    biometricEntry: EntryInfo,
+    context: Context,
+    openMoreOptionsPage: () -> Unit,
+    sendDataToProvider: (EntryInfo, BiometricPrompt.AuthenticationResult) -> Unit,
+    onCancelFlowAndFinish: () -> Unit,
+    onIllegalStateAndFinish: (String) -> Unit,
+    getBiometricPromptState: () -> BiometricPromptState,
+    onBiometricPromptStateChange: (BiometricPromptState) -> Unit,
+    onBiometricFailureFallback: (BiometricFlowType) -> Unit,
+    getRequestDisplayInfo: RequestDisplayInfo? = null,
+    getProviderInfoList: List<ProviderInfo>? = null,
+    getProviderDisplayInfo: ProviderDisplayInfo? = null,
+) {
+    if (getBiometricPromptState() != BiometricPromptState.INACTIVE) {
+        // Screen is already up, do not re-launch
+        return
+    }
+    onBiometricPromptStateChange(BiometricPromptState.PENDING)
+    val biometricDisplayInfo = validateAndRetrieveBiometricGetDisplayInfo(
+        getRequestDisplayInfo,
+        getProviderInfoList,
+        getProviderDisplayInfo,
+        context, biometricEntry
+    )
+
+    if (biometricDisplayInfo == null) {
+        onBiometricFailureFallback(BiometricFlowType.GET)
+        return
+    }
+
+    val callback: BiometricPrompt.AuthenticationCallback =
+        setupBiometricAuthenticationCallback(sendDataToProvider, biometricEntry,
+            onCancelFlowAndFinish, onIllegalStateAndFinish, onBiometricPromptStateChange)
+
+    Log.d(TAG, "The BiometricPrompt API call begins.")
+    runBiometricFlow(context, biometricDisplayInfo, callback, openMoreOptionsPage,
+        onBiometricFailureFallback, BiometricFlowType.GET)
+}
+
+/**
+ * This is the entry point to start the integrated biometric prompt for 'create' flows. It captures
+ * information specific to the create flow, along with required shared callbacks and more general
+ * info across both flows, such as the tapped [EntryInfo] or [sendDataToProvider].
+ */
+fun runBiometricFlowForCreate(
+    biometricEntry: EntryInfo,
+    context: Context,
+    openMoreOptionsPage: () -> Unit,
+    sendDataToProvider: (EntryInfo, BiometricPrompt.AuthenticationResult) -> Unit,
+    onCancelFlowAndFinish: () -> Unit,
+    onIllegalStateAndFinish: (String) -> Unit,
+    getBiometricPromptState: () -> BiometricPromptState,
+    onBiometricPromptStateChange: (BiometricPromptState) -> Unit,
+    onBiometricFailureFallback: (BiometricFlowType) -> Unit,
+    createRequestDisplayInfo: com.android.credentialmanager.createflow
+    .RequestDisplayInfo? = null,
+    createProviderInfo: EnabledProviderInfo? = null,
+) {
+    if (getBiometricPromptState() != BiometricPromptState.INACTIVE) {
+        // Screen is already up, do not re-launch
+        return
+    }
+    onBiometricPromptStateChange(BiometricPromptState.PENDING)
+    val biometricDisplayInfo = validateAndRetrieveBiometricCreateDisplayInfo(
+        createRequestDisplayInfo,
+        createProviderInfo,
+        context, biometricEntry
+    )
+
+    if (biometricDisplayInfo == null) {
+        onBiometricFailureFallback(BiometricFlowType.CREATE)
+        return
+    }
+
+    val callback: BiometricPrompt.AuthenticationCallback =
+        setupBiometricAuthenticationCallback(sendDataToProvider, biometricEntry,
+            onCancelFlowAndFinish, onIllegalStateAndFinish, onBiometricPromptStateChange)
+
+    Log.d(TAG, "The BiometricPrompt API call begins.")
+    runBiometricFlow(context, biometricDisplayInfo, callback, openMoreOptionsPage,
+        onBiometricFailureFallback, BiometricFlowType.CREATE)
+}
+
+/**
  * This will handle the logic for integrating credential manager with the biometric prompt for the
  * single account biometric experience. This simultaneously handles both the get and create flows,
  * by retrieving all the data from credential manager, and properly parsing that data into the
  * biometric prompt.
  */
-fun runBiometricFlow(
-    biometricEntry: EntryInfo,
+private fun runBiometricFlow(
     context: Context,
+    biometricDisplayInfo: BiometricDisplayInfo,
+    callback: BiometricPrompt.AuthenticationCallback,
     openMoreOptionsPage: () -> Unit,
-    sendDataToProvider: (EntryInfo, BiometricPrompt.AuthenticationResult) -> Unit,
-    onCancelFlowAndFinish: (String) -> Unit,
-    getRequestDisplayInfo: RequestDisplayInfo? = null,
-    getProviderInfoList: List<ProviderInfo>? = null,
-    getProviderDisplayInfo: ProviderDisplayInfo? = null,
-    onBiometricFailureFallback: () -> Unit,
-    createRequestDisplayInfo: com.android.credentialmanager.createflow
-    .RequestDisplayInfo? = null,
-    createProviderInfo: EnabledProviderInfo? = null,
+    onBiometricFailureFallback: (BiometricFlowType) -> Unit,
+    biometricFlowType: BiometricFlowType
 ) {
-    var biometricDisplayInfo: BiometricDisplayInfo? = null
-    if (getRequestDisplayInfo != null) {
-        biometricDisplayInfo = validateAndRetrieveBiometricGetDisplayInfo(getRequestDisplayInfo,
-            getProviderInfoList,
-            getProviderDisplayInfo,
-            context, biometricEntry)
-    } else if (createRequestDisplayInfo != null) {
-        // TODO(b/326243754) : Create Flow to be implemented in follow up
-        biometricDisplayInfo = validateBiometricCreateFlow(
-            createRequestDisplayInfo,
-            createProviderInfo
-        )
-    }
-
-    if (biometricDisplayInfo == null) {
-        onBiometricFailureFallback()
-        return
-    }
-
     val biometricPrompt = setupBiometricPrompt(context, biometricDisplayInfo, openMoreOptionsPage,
-        biometricDisplayInfo.biometricRequestInfo.allowedAuthenticators)
-
-    val callback: BiometricPrompt.AuthenticationCallback =
-        setupBiometricAuthenticationCallback(sendDataToProvider, biometricEntry,
-            onCancelFlowAndFinish)
+        biometricDisplayInfo.biometricRequestInfo, biometricFlowType)
 
     val cancellationSignal = CancellationSignal()
     cancellationSignal.setOnCancelListener {
         Log.d(TAG, "Your cancellation signal was called.")
-        // TODO(b/326243754) : Migrate towards passing along the developer cancellation signal
+        // TODO(b/333445112) : Migrate towards passing along the developer cancellation signal
         // or validate the necessity for this
     }
 
@@ -146,43 +223,43 @@
         biometricPrompt.authenticate(cancellationSignal, executor, callback)
     } catch (e: IllegalArgumentException) {
         Log.w(TAG, "Calling the biometric prompt API failed with: /n${e.localizedMessage}\n")
-        onBiometricFailureFallback()
+        onBiometricFailureFallback(biometricFlowType)
     }
 }
 
 /**
  * Sets up the biometric prompt with the UI specific bits.
- * // TODO(b/326243754) : Pass in opId once dependency is confirmed via CryptoObject
- * // TODO(b/326243754) : Given fallbacks aren't allowed, for now we validate that device creds
- * // are NOT allowed to be passed in to avoid throwing an error. Later, however, once target
- * // alignments occur, we should add the bit back properly.
+ * // TODO(b/333445112) : Pass in opId once dependency is confirmed via CryptoObject
  */
 private fun setupBiometricPrompt(
     context: Context,
     biometricDisplayInfo: BiometricDisplayInfo,
     openMoreOptionsPage: () -> Unit,
-    requestAllowedAuthenticators: Int,
+    biometricRequestInfo: BiometricRequestInfo,
+    biometricFlowType: BiometricFlowType,
 ): BiometricPrompt {
-    val finalAuthenticators = removeDeviceCredential(requestAllowedAuthenticators)
+    val finalAuthenticators = removeDeviceCredential(biometricRequestInfo.allowedAuthenticators)
 
     val biometricPrompt = BiometricPrompt.Builder(context)
         .setTitle(biometricDisplayInfo.displayTitleText)
-        // TODO(b/326243754) : Migrate to using new methods recently aligned upon
-        .setNegativeButton(context.getString(R.string
-                .dropdown_presentation_more_sign_in_options_text),
+        // TODO(b/333445112) : Migrate to using new methods and strings recently aligned upon
+        .setNegativeButton(context.getString(if (biometricFlowType == BiometricFlowType.GET)
+            R.string
+                .dropdown_presentation_more_sign_in_options_text else R.string.string_more_options),
             getMainExecutor(context)) { _, _ ->
             openMoreOptionsPage()
         }
         .setAllowedAuthenticators(finalAuthenticators)
         .setConfirmationRequired(true)
-        // TODO(b/326243754) : Add logo back once new permission privileges sorted out
-        .setDescription(biometricDisplayInfo.descriptionAboveBiometricButton)
+        .setLogoBitmap(biometricDisplayInfo.providerIcon)
+        .setLogoDescription(biometricDisplayInfo.providerName)
+        .setDescription(biometricDisplayInfo.descriptionForCredential)
         .build()
 
     return biometricPrompt
 }
 
-// TODO(b/326243754) : Remove after larger level alignments made on fallback negative button
+// TODO(b/333445112) : Remove after larger level alignments made on fallback negative button
 // For the time being, we do not support the pin fallback until UX is decided.
 private fun removeDeviceCredential(requestAllowedAuthenticators: Int): Int {
     var finalAuthenticators = requestAllowedAuthenticators
@@ -210,47 +287,52 @@
 private fun setupBiometricAuthenticationCallback(
     sendDataToProvider: (EntryInfo, BiometricPrompt.AuthenticationResult) -> Unit,
     selectedEntry: EntryInfo,
-    onCancelFlowAndFinish: (String) -> Unit
+    onCancelFlowAndFinish: () -> Unit,
+    onIllegalStateAndFinish: (String) -> Unit,
+    onBiometricPromptStateChange: (BiometricPromptState) -> Unit
 ): BiometricPrompt.AuthenticationCallback {
     val callback: BiometricPrompt.AuthenticationCallback =
         object : BiometricPrompt.AuthenticationCallback() {
-            // TODO(b/326243754) : Validate remaining callbacks
+            // TODO(b/333445772) : Validate remaining callbacks
             override fun onAuthenticationSucceeded(
                 authResult: BiometricPrompt.AuthenticationResult?
             ) {
                 super.onAuthenticationSucceeded(authResult)
                 try {
                     if (authResult != null) {
+                        onBiometricPromptStateChange(BiometricPromptState.COMPLETE)
                         sendDataToProvider(selectedEntry, authResult)
                     } else {
-                        onCancelFlowAndFinish("The biometric flow succeeded but unexpectedly " +
+                        onIllegalStateAndFinish("The biometric flow succeeded but unexpectedly " +
                                 "returned a null value.")
-                        // TODO(b/326243754) : Propagate to provider
                     }
                 } catch (e: Exception) {
-                    onCancelFlowAndFinish("The biometric flow succeeded but failed on handling " +
+                    onIllegalStateAndFinish("The biometric flow succeeded but failed on handling " +
                             "the result. See: \n$e\n")
-                    // TODO(b/326243754) : Propagate to provider
                 }
             }
 
             override fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence?) {
                 super.onAuthenticationHelp(helpCode, helpString)
                 Log.d(TAG, "Authentication help discovered: $helpCode and $helpString")
-                // TODO(b/326243754) : Decide on strategy with provider (a simple log probably
-                // suffices here)
             }
 
             override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) {
                 super.onAuthenticationError(errorCode, errString)
                 Log.d(TAG, "Authentication error-ed out: $errorCode and $errString")
-                // TODO(b/326243754) : Propagate to provider
+                onBiometricPromptStateChange(BiometricPromptState.COMPLETE)
+                if (errorCode == BiometricPrompt.BIOMETRIC_ERROR_USER_CANCELED) {
+                    // Note that because the biometric prompt is imbued directly
+                    // into the selector, parity applies to the selector's cancellation instead
+                    // of the provider's biometric prompt cancellation.
+                    onCancelFlowAndFinish()
+                }
+                // TODO(b/333445772) : Propagate to provider
             }
 
             override fun onAuthenticationFailed() {
                 super.onAuthenticationFailed()
                 Log.d(TAG, "Authentication failed.")
-                // TODO(b/326243754) : Propagate to provider
             }
         }
     return callback
@@ -276,7 +358,7 @@
     if (getRequestDisplayInfo != null && getProviderInfoList != null &&
         getProviderDisplayInfo != null) {
         if (selectedEntry !is CredentialEntryInfo) { return null }
-        return getBiometricDisplayValues(getProviderInfoList,
+        return retrieveBiometricGetDisplayValues(getProviderInfoList,
             context, getRequestDisplayInfo, selectedEntry)
     }
     return null
@@ -285,16 +367,19 @@
 /**
  * Creates the [BiometricDisplayInfo] for create flows, and early handles conditional
  * checking between the two. The reason for this method matches the logic for the
- * [validateBiometricGetFlow] with the only difference being that this is for the create flow.
+ * [validateAndRetrieveBiometricGetDisplayInfo] with the only difference being that this is for
+ * the create flow.
  */
-private fun validateBiometricCreateFlow(
+private fun validateAndRetrieveBiometricCreateDisplayInfo(
     createRequestDisplayInfo: com.android.credentialmanager.createflow.RequestDisplayInfo?,
     createProviderInfo: EnabledProviderInfo?,
+    context: Context,
+    selectedEntry: EntryInfo,
 ): BiometricDisplayInfo? {
     if (createRequestDisplayInfo != null && createProviderInfo != null) {
-    } else if (createRequestDisplayInfo != null && createProviderInfo != null) {
-        // TODO(b/326243754) : Create Flow to be implemented in follow up
-        return createFlowDisplayValues()
+        if (selectedEntry !is CreateOptionInfo) { return null }
+        return retrieveBiometricCreateDisplayValues(createRequestDisplayInfo, createProviderInfo,
+            context, selectedEntry)
     }
     return null
 }
@@ -305,16 +390,16 @@
  * to the original selector. Note that these redundant checks are just failsafe; the original
  * flow should never reach here with invalid params.
  */
-private fun getBiometricDisplayValues(
+private fun retrieveBiometricGetDisplayValues(
     getProviderInfoList: List<ProviderInfo>,
     context: Context,
     getRequestDisplayInfo: RequestDisplayInfo,
     selectedEntry: CredentialEntryInfo,
 ): BiometricDisplayInfo? {
-    var icon: Bitmap? = null
-    var providerName: String? = null
-    var displayTitleText: String? = null
-    var descriptionText: String? = null
+    val icon: Bitmap?
+    val providerName: String?
+    val displayTitleText: String?
+    val descriptionText: String?
     val primaryAccountsProviderInfo = retrievePrimaryAccountProviderInfo(selectedEntry.providerId,
         getProviderInfoList)
     icon = primaryAccountsProviderInfo?.icon?.toBitmap()
@@ -339,17 +424,47 @@
         username
     )
     return BiometricDisplayInfo(providerIcon = icon, providerName = providerName,
-        displayTitleText = displayTitleText, descriptionAboveBiometricButton = descriptionText,
+        displayTitleText = displayTitleText, descriptionForCredential = descriptionText,
         biometricRequestInfo = selectedEntry.biometricRequest as BiometricRequestInfo)
 }
 
 /**
- * Handles the biometric sign in via the 'create credentials' flow, or early validates this flow
- * needs to fallback.
+ * Handles the biometric sign in via the create credentials flow. Stricter in the get flow in that
+ * if this is called, a result is guaranteed. Specifically, this is guaranteed to return a non-null
+ * value unlike the get counterpart.
  */
-private fun createFlowDisplayValues(): BiometricDisplayInfo? {
-    // TODO(b/326243754) : Create Flow to be implemented in follow up
-    return null
+private fun retrieveBiometricCreateDisplayValues(
+    createRequestDisplayInfo: com.android.credentialmanager.createflow.RequestDisplayInfo,
+    createProviderInfo: EnabledProviderInfo,
+    context: Context,
+    selectedEntry: CreateOptionInfo,
+): BiometricDisplayInfo {
+    val icon: Bitmap?
+    val providerName: String?
+    val displayTitleText: String?
+    icon = createProviderInfo.icon.toBitmap()
+    providerName = createProviderInfo.displayName
+    displayTitleText = context.getString(
+        getCreateTitleResCode(createRequestDisplayInfo),
+        createRequestDisplayInfo.appName
+    )
+    val descriptionText: String = context.getString(
+        when (createRequestDisplayInfo.type) {
+            CredentialType.PASSKEY ->
+                R.string.choose_create_single_tap_passkey_title
+
+            CredentialType.PASSWORD ->
+                R.string.choose_create_single_tap_password_title
+
+            CredentialType.UNKNOWN ->
+                R.string.choose_create_single_tap_sign_in_title
+        },
+        createRequestDisplayInfo.appName,
+    )
+    // TODO(b/333445112) : Add a subtitle and any other recently aligned ideas
+    return BiometricDisplayInfo(providerIcon = icon, providerName = providerName,
+        displayTitleText = displayTitleText, descriptionForCredential = descriptionText,
+        biometricRequestInfo = selectedEntry.biometricRequest as BiometricRequestInfo)
 }
 
 /**
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/BiometricPromptState.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/BiometricPromptState.kt
new file mode 100644
index 0000000..e1aa041
--- /dev/null
+++ b/packages/CredentialManager/src/com/android/credentialmanager/common/BiometricPromptState.kt
@@ -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.credentialmanager.common
+
+enum class BiometricPromptState {
+    /** The biometric prompt hasn't been activated. */
+    INACTIVE,
+    /** The biometric prompt is active but data hasn't been returned yet. */
+    PENDING,
+    /** The biometric prompt has closed and returned data we then send to the provider activity. */
+    COMPLETE
+}
\ No newline at end of file
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt
index e43b09e..f65a1b7 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt
@@ -20,7 +20,9 @@
 import androidx.compose.animation.animateContentSize
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.navigationBars
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.wrapContentHeight
 import androidx.compose.material3.ExperimentalMaterial3Api
@@ -69,6 +71,7 @@
                 },
                 scrimColor = MaterialTheme.colorScheme.scrim.copy(alpha = .32f),
                 shape = EntryShape.TopRoundedCorner,
+                windowInsets = WindowInsets.navigationBars,
                 dragHandle = null,
                 // Never take over the full screen. We always want to leave some top scrim space
                 // for exiting and viewing the underlying app to help a user gain context.
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/RemoteViewsFactory.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/RemoteViewsFactory.kt
index 3fb91522..7bb08d2 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/RemoteViewsFactory.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/RemoteViewsFactory.kt
@@ -17,6 +17,8 @@
 package com.android.credentialmanager.common.ui
 
 import android.content.Context
+import android.util.Log
+import com.android.credentialmanager.common.Constants
 import android.widget.RemoteViews
 import androidx.core.content.ContextCompat
 import com.android.credentialmanager.model.get.CredentialEntryInfo
@@ -29,7 +31,8 @@
         private const val SET_ADJUST_VIEW_BOUNDS_METHOD_NAME = "setAdjustViewBounds"
         private const val SET_MAX_HEIGHT_METHOD_NAME = "setMaxHeight"
         private const val SET_BACKGROUND_RESOURCE_METHOD_NAME = "setBackgroundResource"
-        private const val BULLET_POINT = "\u2022"
+        private const val SEPARATOR = " " + "\u2022" + " "
+
         // TODO(jbabs): RemoteViews#setViewPadding renders this as 8dp on the display. Debug why.
         private const val END_ITEMS_PADDING = 28
 
@@ -43,20 +46,14 @@
             var layoutId: Int = com.android.credentialmanager.R.layout
                     .credman_dropdown_presentation_layout
             val remoteViews = RemoteViews(context.packageName, layoutId)
-            if (credentialEntryInfo.credentialType == CredentialType.UNKNOWN) {
-                return remoteViews
-            }
             val displayName = credentialEntryInfo.displayName ?: credentialEntryInfo.userName
             remoteViews.setTextViewText(android.R.id.text1, displayName)
-            val secondaryText =
-                if (credentialEntryInfo.displayName != null
-                    && (credentialEntryInfo.displayName != credentialEntryInfo.userName))
-                    (credentialEntryInfo.userName + " " + BULLET_POINT + " "
-                            + credentialEntryInfo.credentialTypeDisplayName
-                            + " " + BULLET_POINT + " " + credentialEntryInfo.providerDisplayName)
-                else (credentialEntryInfo.credentialTypeDisplayName + " " + BULLET_POINT + " "
-                        + credentialEntryInfo.providerDisplayName)
-            remoteViews.setTextViewText(android.R.id.text2, secondaryText)
+            val secondaryText = getSecondaryText(credentialEntryInfo)
+            if (secondaryText.isNullOrBlank()) {
+                Log.w(Constants.LOG_TAG, "Secondary text for dropdown is null")
+            } else {
+                remoteViews.setTextViewText(android.R.id.text2, secondaryText)
+            }
             remoteViews.setImageViewIcon(android.R.id.icon1, icon);
             remoteViews.setBoolean(
                 android.R.id.icon1, SET_ADJUST_VIEW_BOUNDS_METHOD_NAME, true);
@@ -88,6 +85,26 @@
             return remoteViews
         }
 
+        /**
+         * Computes the secondary text for dropdown presentation based on available fields.
+         *
+         * <p> Format for secondary text is [username] . [credentialType] . [providerDisplayName]
+         * If display name and username are the same, we do not display username
+         * If credential type is missing as in the case with SiwG, we just display
+         * providerDisplayName. Both credential type and provider display name should not be empty.
+         */
+        private fun getSecondaryText(credentialEntryInfo: CredentialEntryInfo): String? {
+            return listOf(if (credentialEntryInfo.displayName != null
+                && (credentialEntryInfo.displayName != credentialEntryInfo.userName))
+                (credentialEntryInfo.userName) else null,
+                credentialEntryInfo.credentialTypeDisplayName,
+                credentialEntryInfo.providerDisplayName).filterNot { it.isNullOrBlank() }
+                    .let { itemsToDisplay ->
+                        if (itemsToDisplay.isEmpty()) null
+                        else itemsToDisplay.joinToString(separator = SEPARATOR)
+                    }
+        }
+
         fun createMoreSignInOptionsPresentation(context: Context): RemoteViews {
             var layoutId: Int = com.android.credentialmanager.R.layout
                     .credman_dropdown_bottom_sheet
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Texts.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Texts.kt
index 9111e61..68c2244 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Texts.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Texts.kt
@@ -23,6 +23,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.style.Hyphens
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextOverflow
 import com.android.compose.theme.LocalAndroidColorScheme
@@ -39,7 +40,7 @@
         text = text,
         color = LocalAndroidColorScheme.current.onSurface,
         textAlign = TextAlign.Center,
-        style = MaterialTheme.typography.headlineSmall,
+        style = MaterialTheme.typography.headlineSmall.copy(hyphens = Hyphens.Auto),
     )
 }
 
@@ -52,7 +53,7 @@
         modifier = modifier.wrapContentSize(),
         text = text,
         color = LocalAndroidColorScheme.current.onSurfaceVariant,
-        style = MaterialTheme.typography.bodyMedium,
+        style = MaterialTheme.typography.bodyMedium.copy(hyphens = Hyphens.Auto),
     )
 }
 
@@ -70,7 +71,7 @@
         modifier = modifier.wrapContentSize(),
         text = text,
         color = LocalAndroidColorScheme.current.onSurfaceVariant,
-        style = MaterialTheme.typography.bodySmall,
+        style = MaterialTheme.typography.bodySmall.copy(hyphens = Hyphens.Auto),
         overflow = TextOverflow.Ellipsis,
         maxLines = if (enforceOneLine) 1 else Int.MAX_VALUE,
         onTextLayout = onTextLayout,
@@ -86,7 +87,7 @@
         modifier = modifier.wrapContentSize(),
         text = text,
         color = LocalAndroidColorScheme.current.onSurface,
-        style = MaterialTheme.typography.titleLarge,
+        style = MaterialTheme.typography.titleLarge.copy(hyphens = Hyphens.Auto),
     )
 }
 
@@ -104,7 +105,7 @@
         modifier = modifier.wrapContentSize(),
         text = text,
         color = LocalAndroidColorScheme.current.onSurface,
-        style = MaterialTheme.typography.titleSmall,
+        style = MaterialTheme.typography.titleSmall.copy(hyphens = Hyphens.Auto),
         overflow = TextOverflow.Ellipsis,
         maxLines = if (enforceOneLine) 1 else Int.MAX_VALUE,
         onTextLayout = onTextLayout,
@@ -120,7 +121,7 @@
         modifier = modifier.wrapContentSize(),
         text = text,
         color = color,
-        style = MaterialTheme.typography.titleSmall,
+        style = MaterialTheme.typography.titleSmall.copy(hyphens = Hyphens.Auto),
     )
 }
 
@@ -133,7 +134,7 @@
         modifier = modifier.wrapContentSize(),
         text = text,
         color = MaterialTheme.colorScheme.inverseOnSurface,
-        style = MaterialTheme.typography.bodyMedium,
+        style = MaterialTheme.typography.bodyMedium.copy(hyphens = Hyphens.Auto),
     )
 }
 
@@ -146,7 +147,7 @@
         modifier = modifier.wrapContentSize(),
         text = text,
         color = MaterialTheme.colorScheme.inversePrimary,
-        style = MaterialTheme.typography.labelLarge,
+        style = MaterialTheme.typography.labelLarge.copy(hyphens = Hyphens.Auto),
     )
 }
 
@@ -160,7 +161,7 @@
         text = text,
         textAlign = TextAlign.Center,
         color = LocalAndroidColorScheme.current.onSurfaceVariant,
-        style = MaterialTheme.typography.labelLarge,
+        style = MaterialTheme.typography.labelLarge.copy(hyphens = Hyphens.Auto),
     )
 }
 
@@ -173,6 +174,6 @@
         modifier = modifier.wrapContentSize(),
         text = text,
         textAlign = TextAlign.Center,
-        style = MaterialTheme.typography.labelLarge,
+        style = MaterialTheme.typography.labelLarge.copy(hyphens = Hyphens.Auto),
     )
 }
\ No newline at end of file
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt
index af78573..122b896 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt
@@ -17,6 +17,7 @@
 package com.android.credentialmanager.createflow
 
 import android.credentials.flags.Flags.selectorUiImprovementsEnabled
+import android.hardware.biometrics.BiometricPrompt
 import android.text.TextUtils
 import androidx.activity.compose.ManagedActivityResultLauncher
 import androidx.activity.result.ActivityResult
@@ -26,7 +27,6 @@
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.wrapContentHeight
 import androidx.compose.material3.Divider
 import androidx.compose.material.icons.Icons
@@ -38,6 +38,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.asImageBitmap
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
@@ -45,10 +46,13 @@
 import com.android.compose.theme.LocalAndroidColorScheme
 import com.android.credentialmanager.CredentialSelectorViewModel
 import com.android.credentialmanager.R
+import com.android.credentialmanager.common.BiometricFlowType
+import com.android.credentialmanager.common.BiometricPromptState
 import com.android.credentialmanager.model.EntryInfo
 import com.android.credentialmanager.model.CredentialType
 import com.android.credentialmanager.common.ProviderActivityState
 import com.android.credentialmanager.common.material.ModalBottomSheetDefaults
+import com.android.credentialmanager.common.runBiometricFlowForCreate
 import com.android.credentialmanager.common.ui.ActionButton
 import com.android.credentialmanager.common.ui.BodyMediumText
 import com.android.credentialmanager.common.ui.BodySmallText
@@ -95,6 +99,26 @@
                                 viewModel::createFlowOnMoreOptionsSelectedOnCreationSelection,
                                 onLog = { viewModel.logUiEvent(it) },
                         )
+                        CreateScreenState.BIOMETRIC_SELECTION ->
+                            BiometricSelectionPage(
+                                biometricEntry = createCredentialUiState
+                                    .activeEntry?.activeEntryInfo,
+                                onCancelFlowAndFinish = viewModel::onUserCancel,
+                                onIllegalScreenStateAndFinish = viewModel::onIllegalUiState,
+                                onMoreOptionSelected =
+                                viewModel::createFlowOnMoreOptionsSelectedOnCreationSelection,
+                                requestDisplayInfo = createCredentialUiState.requestDisplayInfo,
+                                enabledProviderInfo = createCredentialUiState
+                                        .activeEntry?.activeProvider!!,
+                                onBiometricEntrySelected =
+                                viewModel::createFlowOnEntrySelected,
+                                fallbackToOriginalFlow =
+                                viewModel::fallbackFromBiometricToNormalFlow,
+                                getBiometricPromptState =
+                                viewModel::getBiometricPromptState,
+                                onBiometricPromptStateChange =
+                                viewModel::onBiometricPromptStateChange
+                            )
                         CreateScreenState.MORE_OPTIONS_SELECTION -> MoreOptionsSelectionCard(
                                 requestDisplayInfo = createCredentialUiState.requestDisplayInfo,
                                 enabledProviderList = createCredentialUiState.enabledProviders,
@@ -313,20 +337,9 @@
         item { Divider(thickness = 16.dp, color = Color.Transparent) }
         item {
             HeadlineText(
-                text = when (requestDisplayInfo.type) {
-                    CredentialType.PASSKEY -> stringResource(
-                        R.string.choose_create_option_passkey_title,
-                        requestDisplayInfo.appName
-                    )
-                    CredentialType.PASSWORD -> stringResource(
-                        R.string.choose_create_option_password_title,
-                        requestDisplayInfo.appName
-                    )
-                    CredentialType.UNKNOWN -> stringResource(
-                        R.string.choose_create_option_sign_in_title,
-                        requestDisplayInfo.appName
-                    )
-                }
+                text = stringResource(
+                    getCreateTitleResCode(requestDisplayInfo),
+                    requestDisplayInfo.appName)
             )
         }
         item { Divider(thickness = 24.dp, color = Color.Transparent) }
@@ -560,4 +573,36 @@
         iconImageVector = Icons.Outlined.QrCodeScanner,
         entryHeadlineText = stringResource(R.string.another_device),
     )
-}
\ No newline at end of file
+}
+
+@Composable
+internal fun BiometricSelectionPage(
+    biometricEntry: EntryInfo?,
+    onMoreOptionSelected: () -> Unit,
+    requestDisplayInfo: RequestDisplayInfo,
+    enabledProviderInfo: EnabledProviderInfo,
+    onBiometricEntrySelected: (EntryInfo, BiometricPrompt.AuthenticationResult) -> Unit,
+    onCancelFlowAndFinish: () -> Unit,
+    onIllegalScreenStateAndFinish: (String) -> Unit,
+    fallbackToOriginalFlow: (BiometricFlowType) -> Unit,
+    getBiometricPromptState: () -> BiometricPromptState,
+    onBiometricPromptStateChange: (BiometricPromptState) -> Unit,
+) {
+    if (biometricEntry == null) {
+        fallbackToOriginalFlow(BiometricFlowType.CREATE)
+        return
+    }
+    runBiometricFlowForCreate(
+        biometricEntry = biometricEntry,
+        context = LocalContext.current,
+        openMoreOptionsPage = onMoreOptionSelected,
+        sendDataToProvider = onBiometricEntrySelected,
+        onCancelFlowAndFinish = onCancelFlowAndFinish,
+        getBiometricPromptState = getBiometricPromptState,
+        onBiometricPromptStateChange = onBiometricPromptStateChange,
+        createRequestDisplayInfo = requestDisplayInfo,
+        createProviderInfo = enabledProviderInfo,
+        onBiometricFailureFallback = fallbackToOriginalFlow,
+        onIllegalStateAndFinish = onIllegalScreenStateAndFinish,
+    )
+}
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt
index 617a981..ddd4139 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt
@@ -16,9 +16,11 @@
 
 package com.android.credentialmanager.createflow
 
+import android.credentials.flags.Flags.credmanBiometricApiEnabled
 import android.graphics.drawable.Drawable
-import com.android.credentialmanager.model.EntryInfo
+import com.android.credentialmanager.R
 import com.android.credentialmanager.model.CredentialType
+import com.android.credentialmanager.model.EntryInfo
 import com.android.credentialmanager.model.creation.CreateOptionInfo
 import com.android.credentialmanager.model.creation.RemoteInfo
 
@@ -33,14 +35,94 @@
     val foundCandidateFromUserDefaultProvider: Boolean,
 )
 
+/**
+ * Checks if this create flow is a biometric flow. Note that this flow differs slightly from the
+ * autoselect 'get' flow. Namely, given there can be multiple providers, rather than multiple
+ * accounts, the idea is that autoselect is ever only enabled for a single provider (or even, in
+ * that case, a single 'type' (family only, or work only) for a provider). However, for all other
+ * cases, the biometric screen should always show up if that entry contains the biometric bit.
+ */
+internal fun findBiometricFlowEntry(
+    activeEntry: ActiveEntry,
+    isAutoSelectFlow: Boolean,
+): CreateOptionInfo? {
+    if (!credmanBiometricApiEnabled()) {
+        return null
+    }
+    if (isAutoSelectFlow) {
+        // Since this is the create flow, auto select will only ever be true for a single provider.
+        // However, for all other cases, biometric should be used if that bit is opted into. If
+        // they clash, autoselect is always preferred, but that's only if there's a single provider.
+        return null
+    }
+    val biometricEntry = getCreateEntry(activeEntry)
+    return if (biometricEntry?.biometricRequest != null) biometricEntry else null
+}
+
+/**
+ * Retrieves the activeEntry by validating it is a [CreateOptionInfo]. This is done by ensuring
+ * that the [activeEntry] exists as a [CreateOptionInfo] to retrieve its [EntryInfo].
+ */
+internal fun getCreateEntry(
+    activeEntry: ActiveEntry?,
+): CreateOptionInfo? {
+    val entry = activeEntry?.activeEntryInfo
+    if (entry !is CreateOptionInfo) {
+        return null
+    }
+    return entry
+}
+
+/**
+* Determines if the flow is a biometric flow by taking into account autoselect criteria.
+*/
+internal fun isBiometricFlow(
+    activeEntry: ActiveEntry,
+    isAutoSelectFlow: Boolean,
+) = findBiometricFlowEntry(activeEntry, isAutoSelectFlow) != null
+
+/**
+ * This utility presents the correct resource string for the create flows title conditionally.
+ * Similar to generateDisplayTitleTextResCode in the 'get' flow, but for the create flow instead.
+ * This is for the title, and is a shared resource, unlike the specific unlock request text.
+ * E.g. this will look something like: "Create passkey to sign in to Tribank."
+ * // TODO(b/330396140) : Validate approach and add dynamic auth strings
+ */
+internal fun getCreateTitleResCode(createRequestDisplayInfo: RequestDisplayInfo): Int =
+    when (createRequestDisplayInfo.type) {
+        CredentialType.PASSKEY ->
+            R.string.choose_create_option_passkey_title
+
+        CredentialType.PASSWORD ->
+            R.string.choose_create_option_password_title
+
+        CredentialType.UNKNOWN ->
+            R.string.choose_create_option_sign_in_title
+    }
+
 internal fun isFlowAutoSelectable(
     uiState: CreateCredentialUiState
 ): Boolean {
-  return uiState.requestDisplayInfo.isAutoSelectRequest &&
-      uiState.sortedCreateOptionsPairs.size == 1 &&
-      uiState.activeEntry?.activeEntryInfo?.let {
-        it is CreateOptionInfo && it.allowAutoSelect
-      } ?: false
+    return isFlowAutoSelectable(uiState.requestDisplayInfo, uiState.activeEntry,
+        uiState.sortedCreateOptionsPairs)
+}
+
+/**
+ * When initializing, the [CreateCredentialUiState] is generated after the initial screen is set.
+ * This overloaded method allows identifying if the flow is auto selectable prior to the creation
+ * of the [CreateCredentialUiState].
+ */
+internal fun isFlowAutoSelectable(
+    requestDisplayInfo: RequestDisplayInfo,
+    activeEntry: ActiveEntry?,
+    sortedCreateOptionsPairs: List<Pair<CreateOptionInfo, EnabledProviderInfo>>
+): Boolean {
+    val isAutoSelectRequest = requestDisplayInfo.isAutoSelectRequest
+    if (sortedCreateOptionsPairs.size != 1) {
+        return false
+    }
+    val singleEntry = getCreateEntry(activeEntry)
+    return isAutoSelectRequest && singleEntry?.allowAutoSelect == true
 }
 
 internal fun hasContentToDisplay(state: CreateCredentialUiState): Boolean {
@@ -95,6 +177,7 @@
 /** The name of the current screen. */
 enum class CreateScreenState {
   CREATION_OPTION_SELECTION,
+  BIOMETRIC_SELECTION,
   MORE_OPTIONS_SELECTION,
   DEFAULT_PROVIDER_CONFIRMATION,
   EXTERNAL_ONLY_SELECTION,
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
index b59ccc2..72b7814 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
@@ -52,9 +52,11 @@
 import androidx.core.graphics.drawable.toBitmap
 import com.android.credentialmanager.CredentialSelectorViewModel
 import com.android.credentialmanager.R
+import com.android.credentialmanager.common.BiometricFlowType
+import com.android.credentialmanager.common.BiometricPromptState
 import com.android.credentialmanager.common.ProviderActivityState
 import com.android.credentialmanager.common.material.ModalBottomSheetDefaults
-import com.android.credentialmanager.common.runBiometricFlow
+import com.android.credentialmanager.common.runBiometricFlowForGet
 import com.android.credentialmanager.common.ui.ActionButton
 import com.android.credentialmanager.common.ui.ActionEntry
 import com.android.credentialmanager.common.ui.ConfirmButton
@@ -144,18 +146,21 @@
                         } else if (credmanBiometricApiEnabled() && getCredentialUiState
                                 .currentScreenState == GetScreenState.BIOMETRIC_SELECTION) {
                             BiometricSelectionPage(
-                                // TODO(b/326243754) : Utilize expected entry for this flow, confirm
-                                // activeEntry will always be what represents the single tap flow
                                 biometricEntry = getCredentialUiState.activeEntry,
                                 onMoreOptionSelected = viewModel::getFlowOnMoreOptionSelected,
-                                onCancelFlowAndFinish = viewModel::onIllegalUiState,
+                                onCancelFlowAndFinish = viewModel::onUserCancel,
+                                onIllegalStateAndFinish = viewModel::onIllegalUiState,
                                 requestDisplayInfo = getCredentialUiState.requestDisplayInfo,
                                 providerInfoList = getCredentialUiState.providerInfoList,
                                 providerDisplayInfo = getCredentialUiState.providerDisplayInfo,
                                 onBiometricEntrySelected =
                                 viewModel::getFlowOnEntrySelected,
                                 fallbackToOriginalFlow =
-                                viewModel::getFlowOnBackToPrimarySelectionScreen,
+                                viewModel::fallbackFromBiometricToNormalFlow,
+                                getBiometricPromptState =
+                                viewModel::getBiometricPromptState,
+                                onBiometricPromptStateChange =
+                                viewModel::onBiometricPromptStateChange
                             )
                         } else {
                             AllSignInOptionCard(
@@ -212,24 +217,30 @@
 @Composable
 internal fun BiometricSelectionPage(
     biometricEntry: EntryInfo?,
-    onCancelFlowAndFinish: (String) -> Unit,
+    onCancelFlowAndFinish: () -> Unit,
+    onIllegalStateAndFinish: (String) -> Unit,
     onMoreOptionSelected: () -> Unit,
     requestDisplayInfo: RequestDisplayInfo,
     providerInfoList: List<ProviderInfo>,
     providerDisplayInfo: ProviderDisplayInfo,
     onBiometricEntrySelected: (EntryInfo, BiometricPrompt.AuthenticationResult?) -> Unit,
-    fallbackToOriginalFlow: () -> Unit,
+    fallbackToOriginalFlow: (BiometricFlowType) -> Unit,
+    getBiometricPromptState: () -> BiometricPromptState,
+    onBiometricPromptStateChange: (BiometricPromptState) -> Unit,
 ) {
     if (biometricEntry == null) {
-        fallbackToOriginalFlow()
+        fallbackToOriginalFlow(BiometricFlowType.GET)
         return
     }
-    runBiometricFlow(
+    runBiometricFlowForGet(
         biometricEntry = biometricEntry,
         context = LocalContext.current,
         openMoreOptionsPage = onMoreOptionSelected,
         sendDataToProvider = onBiometricEntrySelected,
         onCancelFlowAndFinish = onCancelFlowAndFinish,
+        onIllegalStateAndFinish = onIllegalStateAndFinish,
+        getBiometricPromptState = getBiometricPromptState,
+        onBiometricPromptStateChange = onBiometricPromptStateChange,
         getRequestDisplayInfo = requestDisplayInfo,
         getProviderInfoList = providerInfoList,
         getProviderDisplayInfo = providerDisplayInfo,
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt
index 6d5b52a..b03407b 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt
@@ -238,6 +238,7 @@
 /**
  * This generates the res code for the large display title text for the selector. For example, it
  * retrieves the resource for strings like: "Use your saved passkey for *rpName*".
+ * TODO(b/330396140) : Validate approach and add dynamic auth strings
  */
 internal fun generateDisplayTitleTextResCode(
     singleEntryType: CredentialType,
@@ -285,7 +286,7 @@
         GetScreenState.REMOTE_ONLY
     else if (isRequestForAllOptions)
         GetScreenState.ALL_SIGN_IN_OPTIONS
-    else if (isBiometricFlow(providerDisplayInfo))
+    else if (isBiometricFlow(providerDisplayInfo, isFlowAutoSelectable(providerDisplayInfo)))
         GetScreenState.BIOMETRIC_SELECTION
     else GetScreenState.PRIMARY_SELECTION
 }
@@ -293,9 +294,14 @@
 /**
  * Determines if the flow is a biometric flow by taking into account autoselect criteria.
  */
-internal fun isBiometricFlow(providerDisplayInfo: ProviderDisplayInfo) =
-    findBiometricFlowEntry(providerDisplayInfo,
-        findAutoSelectEntry(providerDisplayInfo) != null) != null
+internal fun isBiometricFlow(providerDisplayInfo: ProviderDisplayInfo, isAutoSelectFlow: Boolean) =
+    findBiometricFlowEntry(providerDisplayInfo, isAutoSelectFlow) != null
+
+/**
+ * Determines if the flow is an autoselect flow.
+ */
+internal fun isFlowAutoSelectable(providerDisplayInfo: ProviderDisplayInfo) =
+    findAutoSelectEntry(providerDisplayInfo) != null
 
 internal class CredentialEntryInfoComparatorByTypeThenTimestamp(
         val typePriorityMap: Map<String, Int>,
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorActivity.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorActivity.kt
index 283dc7d..0fe35e6 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorActivity.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorActivity.kt
@@ -38,7 +38,7 @@
         setContent {
             MaterialTheme {
                 WearApp(
-                    viewModel = viewModel,
+                    flowEngine = viewModel,
                     onCloseApp = { finish() },
                 )
             }
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorViewModel.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
index 9d97763..b7fa33e 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
@@ -24,9 +24,6 @@
 import com.android.credentialmanager.model.Request
 import com.android.credentialmanager.client.CredentialManagerClient
 import com.android.credentialmanager.model.EntryInfo
-import com.android.credentialmanager.model.get.ActionEntryInfo
-import com.android.credentialmanager.model.get.AuthenticationEntryInfo
-import com.android.credentialmanager.model.get.CredentialEntryInfo
 import com.android.credentialmanager.ui.mappers.toGet
 import android.util.Log
 import androidx.activity.compose.rememberLauncherForActivityResult
@@ -53,7 +50,7 @@
     private val shouldClose = MutableStateFlow(false)
     private lateinit var selectedEntry: EntryInfo
     private var isAutoSelected: Boolean = false
-    val uiState: StateFlow<CredentialSelectorUiState> =
+    override val uiState: StateFlow<CredentialSelectorUiState> =
         combine(
             credentialManagerClient.requests,
             isPrimaryScreen,
@@ -137,29 +134,3 @@
     }
 }
 
-sealed class CredentialSelectorUiState {
-    data object Idle : CredentialSelectorUiState()
-    sealed class Get : CredentialSelectorUiState() {
-        data class SingleEntry(val entry: CredentialEntryInfo) : Get()
-        data class SingleEntryPerAccount(
-            val sortedEntries: List<CredentialEntryInfo>,
-            val authenticationEntryList: List<AuthenticationEntryInfo>,
-            ) : Get()
-        data class MultipleEntry(
-            val accounts: List<PerUserNameEntries>,
-            val actionEntryList: List<ActionEntryInfo>,
-            val authenticationEntryList: List<AuthenticationEntryInfo>,
-        ) : Get() {
-            data class PerUserNameEntries(
-                val userName: String,
-                val sortedCredentialEntryList: List<CredentialEntryInfo>,
-            )
-        }
-
-        // TODO: b/301206470 add the remaining states
-    }
-
-    data object Create : CredentialSelectorUiState()
-    data class Cancel(val appName: String) : CredentialSelectorUiState()
-    data object Close : CredentialSelectorUiState()
-}
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt
index 2e80a7c..c05fc93 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt
@@ -20,9 +20,15 @@
 import androidx.activity.result.IntentSenderRequest
 import androidx.compose.runtime.Composable
 import com.android.credentialmanager.model.EntryInfo
+import com.android.credentialmanager.model.get.ActionEntryInfo
+import com.android.credentialmanager.model.get.AuthenticationEntryInfo
+import com.android.credentialmanager.model.get.CredentialEntryInfo
+import kotlinx.coroutines.flow.StateFlow
 
 /** Engine of the credential selecting flow. */
 interface FlowEngine {
+    /** UI state of the selector app */
+    val uiState: StateFlow<CredentialSelectorUiState>
     /** Back from previous stage. */
     fun back()
     /** Cancels the selection flow. */
@@ -54,4 +60,40 @@
      */
     @Composable
     fun getEntrySelector(): (entry: EntryInfo, isAutoSelected: Boolean) -> Unit
+}
+
+/** UI state of the selector app */
+sealed class CredentialSelectorUiState {
+    /** Idle UI state, no request is going on. */
+    data object Idle : CredentialSelectorUiState()
+    /** Getting credential UI state. */
+    sealed class Get : CredentialSelectorUiState() {
+        /** Getting credential UI state when there is only one credential available. */
+        data class SingleEntry(val entry: CredentialEntryInfo) : Get()
+        /**
+         * Getting credential UI state when there is only one account while with multiple
+         * credentials, with different types(eg, passkey vs password) or providers.
+         */
+        data class SingleEntryPerAccount(
+            val sortedEntries: List<CredentialEntryInfo>,
+            val authenticationEntryList: List<AuthenticationEntryInfo>,
+            ) : Get()
+        /** Getting credential UI state when there are multiple accounts available. */
+        data class MultipleEntry(
+            val accounts: List<PerUserNameEntries>,
+            val actionEntryList: List<ActionEntryInfo>,
+            val authenticationEntryList: List<AuthenticationEntryInfo>,
+        ) : Get() {
+            data class PerUserNameEntries(
+                val userName: String,
+                val sortedCredentialEntryList: List<CredentialEntryInfo>,
+            )
+        }
+    }
+    /** Creating credential UI state. */
+    data object Create : CredentialSelectorUiState()
+    /** Request is cancelling by [appName]. */
+    data class Cancel(val appName: String) : CredentialSelectorUiState()
+    /** Request is closed peacefully. */
+    data object Close : CredentialSelectorUiState()
 }
\ No newline at end of file
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/WearApp.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/WearApp.kt
index bf4c988..018db68 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/WearApp.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/WearApp.kt
@@ -32,7 +32,6 @@
 import com.android.credentialmanager.CredentialSelectorUiState.Get.SingleEntryPerAccount
 import com.android.credentialmanager.CredentialSelectorUiState.Get.SingleEntry
 import com.android.credentialmanager.CredentialSelectorUiState.Get.MultipleEntry
-import com.android.credentialmanager.CredentialSelectorViewModel
 import com.android.credentialmanager.FlowEngine
 import com.android.credentialmanager.TAG
 import com.android.credentialmanager.ui.screens.LoadingScreen
@@ -52,8 +51,7 @@
 @OptIn(ExperimentalHorologistApi::class)
 @Composable
 fun WearApp(
-    viewModel: CredentialSelectorViewModel,
-    flowEngine: FlowEngine = viewModel,
+    flowEngine: FlowEngine,
     onCloseApp: () -> Unit,
 ) {
     val navController = rememberSwipeDismissableNavController()
@@ -62,7 +60,7 @@
         rememberSwipeDismissableNavHostState(swipeToDismissBoxState = swipeToDismissBoxState)
     val selectEntry = flowEngine.getEntrySelector()
 
-    val uiState by viewModel.uiState.collectAsStateWithLifecycle()
+    val uiState by flowEngine.uiState.collectAsStateWithLifecycle()
     WearNavScaffold(
         startDestination = Screen.Loading.route,
         navController = navController,
@@ -112,7 +110,7 @@
         }
     }
         BackHandler(true) {
-            viewModel.back()
+            flowEngine.back()
         }
         Log.d(TAG, "uiState change, state: $uiState")
         when (val state = uiState) {
diff --git a/packages/EasterEgg/Android.bp b/packages/EasterEgg/Android.bp
index 6f4f9ca..ec1fe39 100644
--- a/packages/EasterEgg/Android.bp
+++ b/packages/EasterEgg/Android.bp
@@ -83,6 +83,7 @@
 aconfig_declarations {
     name: "easter_egg_flags",
     package: "com.android.egg.flags",
+    container: "system",
     srcs: [
         "easter_egg_flags.aconfig",
     ],
diff --git a/packages/EasterEgg/easter_egg_flags.aconfig b/packages/EasterEgg/easter_egg_flags.aconfig
index 3268a4f..7ddc238 100644
--- a/packages/EasterEgg/easter_egg_flags.aconfig
+++ b/packages/EasterEgg/easter_egg_flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.egg.flags"
+container: "system"
 
 flag {
     name: "flag_flag"
diff --git a/packages/InputDevices/res/raw/keyboard_layout_french.kcm b/packages/InputDevices/res/raw/keyboard_layout_french.kcm
index 636f98d..4f4fb1b 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_french.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_french.kcm
@@ -35,85 +35,97 @@
 }
 
 key 1 {
-    label:                              '1'
+    label:                              '&'
     base:                               '&'
-    shift:                              '1'
+    shift, capslock:                    '1'
+    shift+capslock:                     '&'
 }
 
 key 2 {
-    label:                              '2'
+    label:                              '\u00e9'
     base:                               '\u00e9'
-    shift:                              '2'
+    shift, capslock:                    '2'
+    shift+capslock:                     '\u00e9'
     ralt:                               '\u0303'
 }
 
 key 3 {
-    label:                              '3'
+    label:                              '"'
     base:                               '"'
-    shift:                              '3'
+    shift, capslock:                    '3'
+    shift+capslock:                     '"'
     ralt:                               '#'
 }
 
 key 4 {
-    label:                              '4'
+    label:                              '\''
     base:                               '\''
-    shift:                              '4'
+    shift, capslock:                    '4'
+    shift+capslock:                     '\''
     ralt:                               '{'
 }
 
 key 5 {
-    label:                              '5'
+    label:                              '('
     base:                               '('
-    shift:                              '5'
+    shift, capslock:                    '5'
+    shift+capslock:                     '('
     ralt:                               '['
 }
 
 key 6 {
-    label:                              '6'
+    label:                              '-'
     base:                               '-'
-    shift:                              '6'
+    shift, capslock:                    '6'
+    shift+capslock:                     '-'
     ralt:                               '|'
 }
 
 key 7 {
-    label:                              '7'
+    label:                              '\u00e8'
     base:                               '\u00e8'
-    shift:                              '7'
+    shift, capslock:                    '7'
+    shift+capslock:                     '\u00e8'
     ralt:                               '\u0300'
 }
 
 key 8 {
-    label:                              '8'
+    label:                              '_'
     base:                               '_'
-    shift:                              '8'
+    shift, capslock:                    '8'
+    shift+capslock:                     '_'
     ralt:                               '\\'
 }
 
 key 9 {
-    label:                              '9'
+    label:                              '\u00e7'
     base:                               '\u00e7'
-    shift:                              '9'
+    shift, capslock:                    '9'
+    shift+capslock:                     '\u00e7'
     ralt:                               '^'
 }
 
 key 0 {
-    label:                              '0'
+    label:                              '\u00e0'
     base:                               '\u00e0'
-    shift:                              '0'
+    shift, capslock:                    '0'
+    shift+capslock:                     '\u00e0'
     ralt:                               '@'
 }
 
 key MINUS {
     label:                              ')'
     base:                               ')'
-    shift:                              '\u00b0'
+    shift, capslock:                    '\u00b0'
+    shift+capslock:                     ')'
     ralt:                               ']'
 }
 
 key EQUALS {
     label:                              '='
     base:                               '='
-    shift:                              '+'
+    shift, capslock:                    '+'
+    shift+capslock:                     '='
     ralt:                               '}'
 }
 
@@ -193,13 +205,15 @@
 key LEFT_BRACKET {
     label:                              '\u02c6'
     base:                               '\u0302'
-    shift:                              '\u0308'
+    shift, capslock:                    '\u0308'
+    shift+capslock:                     '\u0302'
 }
 
 key RIGHT_BRACKET {
     label:                              '$'
     base:                               '$'
-    shift:                              '\u00a3'
+    shift, capslock:                    '\u00a3'
+    shift+capslock:                     '$'
     ralt:                               '\u00a4'
 }
 
@@ -278,13 +292,15 @@
 key APOSTROPHE {
     label:                              '\u00f9'
     base:                               '\u00f9'
-    shift:                              '%'
+    shift, capslock:                    '%'
+    shift+capslock:                     '\u00f9'
 }
 
 key BACKSLASH {
     label:                              '*'
     base:                               '*'
-    shift:                              '\u00b5'
+    shift, capslock:                    '\u00b5'
+    shift+capslock:                     '*'
 }
 
 ### ROW 4
@@ -340,23 +356,27 @@
 key COMMA {
     label:                              ','
     base:                               ','
-    shift:                              '?'
+    shift, capslock:                    '?'
+    shift+capslock:                     ','
 }
 
 key SEMICOLON {
     label:                              ';'
     base:                               ';'
-    shift:                              '.'
+    shift, capslock:                    '.'
+    shift+capslock:                     ';'
 }
 
 key PERIOD {
     label:                              ':'
     base:                               ':'
-    shift:                              '/'
+    shift, capslock:                    '/'
+    shift+capslock:                     ':'
 }
 
 key SLASH {
     label:                              '!'
     base:                               '!'
-    shift:                              '\u00a7'
+    shift, capslock:                    '\u00a7'
+    shift+capslock:                     '!'
 }
diff --git a/packages/InputDevices/res/raw/keyboard_layout_german.kcm b/packages/InputDevices/res/raw/keyboard_layout_german.kcm
index fbb9bb6..1fb0924 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_german.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_german.kcm
@@ -28,82 +28,93 @@
 
 key GRAVE {
     label:                              '^'
-    base:                               '^'
+    base:                               '\u0302'
     shift:                              '\u00b0'
 }
 
 key 1 {
     label:                              '1'
     base:                               '1'
-    shift:                              '!'
+    shift, capslock:                    '!'
+    shift+capslock:                     '1'
 }
 
 key 2 {
     label:                              '2'
     base:                               '2'
-    shift:                              '"'
+    shift, capslock:                    '"'
+    shift+capslock:                     '2'
     ralt:                               '\u00b2'
 }
 
 key 3 {
     label:                              '3'
     base:                               '3'
-    shift:                              '\u00a7'
+    shift, capslock:                    '\u00a7'
+    shift+capslock:                     '3'
     ralt:                               '\u00b3'
 }
 
 key 4 {
     label:                              '4'
     base:                               '4'
-    shift:                              '$'
+    shift, capslock:                    '$'
+    shift+capslock:                     '4'
 }
 
 key 5 {
     label:                              '5'
     base:                               '5'
-    shift:                              '%'
+    shift, capslock:                    '%'
+    shift+capslock:                     '5'
 }
 
 key 6 {
     label:                              '6'
     base:                               '6'
-    shift:                              '&'
+    shift, capslock:                    '&'
+    shift+capslock:                     '6'
 }
 
 key 7 {
     label:                              '7'
     base:                               '7'
-    shift:                              '/'
+    shift, capslock:                    '/'
+    shift+capslock:                     '7'
     ralt:                               '{'
 }
 
 key 8 {
     label:                              '8'
     base:                               '8'
-    shift:                              '('
+    shift, capslock:                    '('
+    shift+capslock:                     '8'
     ralt:                               '['
 }
 
 key 9 {
     label:                              '9'
     base:                               '9'
-    shift:                              ')'
+    shift, capslock:                    ')'
+    shift+capslock:                     '9'
     ralt:                               ']'
 }
 
 key 0 {
     label:                              '0'
     base:                               '0'
-    shift:                              '='
+    shift, capslock:                    '='
+    shift+capslock:                     '0'
     ralt:                               '}'
 }
 
 key SLASH {
     label:                              '\u00df'
     base:                               '\u00df'
-    capslock:                           '\u1e9e'
-    shift:                              '?'
+    shift, capslock:                    '?'
+    shift+capslock:                     '\u00df'
     ralt:                               '\\'
+    shift+ralt:                         '\u1e9e'
 }
 
 key EQUALS {
@@ -196,7 +207,8 @@
 key RIGHT_BRACKET {
     label:                              '+'
     base:                               '+'
-    shift:                              '*'
+    shift, capslock:                    '*'
+    shift+capslock:                     '+'
     ralt:                               '~'
 }
 
@@ -282,7 +294,8 @@
 key BACKSLASH {
     label:                              '#'
     base:                               '#'
-    shift:                              '\''
+    shift, capslock:                    '\''
+    shift+capslock:                     '#'
 }
 
 ### ROW 4
@@ -347,13 +360,15 @@
 key COMMA {
     label:                              ','
     base:                               ','
-    shift:                              ';'
+    shift, capslock:                    ';'
+    shift+capslock:                     ','
 }
 
 key PERIOD {
     label:                              '.'
     base:                               '.'
-    shift:                              ':'
+    shift, capslock:                    ':'
+    shift+capslock:                     '.'
 }
 
 key MINUS {
diff --git a/packages/PackageInstaller/Android.bp b/packages/PackageInstaller/Android.bp
index 79c810c..bd84b58 100644
--- a/packages/PackageInstaller/Android.bp
+++ b/packages/PackageInstaller/Android.bp
@@ -46,7 +46,6 @@
     sdk_version: "system_current",
     rename_resources_package: false,
     static_libs: [
-        "xz-java",
         "androidx.leanback_leanback",
         "androidx.annotation_annotation",
         "androidx.fragment_fragment",
@@ -79,7 +78,6 @@
     overrides: ["PackageInstaller"],
 
     static_libs: [
-        "xz-java",
         "androidx.leanback_leanback",
         "androidx.fragment_fragment",
         "androidx.lifecycle_lifecycle-livedata",
@@ -112,7 +110,6 @@
     overrides: ["PackageInstaller"],
 
     static_libs: [
-        "xz-java",
         "androidx.leanback_leanback",
         "androidx.annotation_annotation",
         "androidx.fragment_fragment",
diff --git a/packages/PackageInstaller/AndroidManifest.xml b/packages/PackageInstaller/AndroidManifest.xml
index bf69d3b..05f4d69 100644
--- a/packages/PackageInstaller/AndroidManifest.xml
+++ b/packages/PackageInstaller/AndroidManifest.xml
@@ -146,17 +146,6 @@
                 android:configChanges="mnc|mnc|touchscreen|navigation|screenLayout|screenSize|smallestScreenSize|orientation|locale|keyboard|keyboardHidden|fontScale|uiMode|layoutDirection|density"
                 android:exported="false" />
 
-        <!-- Wearable Components -->
-        <service android:name=".wear.WearPackageInstallerService"
-                 android:permission="com.google.android.permission.INSTALL_WEARABLE_PACKAGES"
-                 android:foregroundServiceType="systemExempted"
-                 android:exported="true"/>
-
-        <provider android:name=".wear.WearPackageIconProvider"
-                  android:authorities="com.google.android.packageinstaller.wear.provider"
-                  android:grantUriPermissions="true"
-                  android:exported="false" />
-
         <receiver android:name="androidx.profileinstaller.ProfileInstallReceiver"
             tools:node="remove" />
 
diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml
index eaae47d..149783d 100644
--- a/packages/PackageInstaller/res/values-nl/strings.xml
+++ b/packages/PackageInstaller/res/values-nl/strings.xml
@@ -83,8 +83,8 @@
     <string name="uninstall_failed" msgid="1847750968168364332">"Verwijdering mislukt."</string>
     <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> kan niet worden verwijderd."</string>
     <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-kloon verwijderen…"</string>
-    <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"Kan actieve apparaatbeheer-app niet verwijderen"</string>
-    <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"Kan actieve apparaatbeheer-app niet verwijderen voor <xliff:g id="USERNAME">%1$s</xliff:g>"</string>
+    <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"Kan actieve app voor apparaatbeheer niet verwijderen"</string>
+    <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"Kan actieve app voor apparaatbeheer niet verwijderen voor <xliff:g id="USERNAME">%1$s</xliff:g>"</string>
     <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"Deze app is vereist voor sommige gebruikers of profielen en is verwijderd voor andere"</string>
     <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"Deze app is vereist voor je profiel en kan niet worden verwijderd."</string>
     <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"Deze app is vereist door je apparaatbeheerder en kan niet worden verwijderd."</string>
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
index 7c313e8..a4c6ac7 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
@@ -80,7 +80,7 @@
         mUserManager = getSystemService(UserManager.class);
 
         Intent intent = getIntent();
-        String callingPackage = getCallingPackage();
+        String callingPackage = getLaunchedFromPackage();
         String callingAttributionTag = null;
 
         // Uid of the source package, coming from ActivityManager
@@ -89,30 +89,33 @@
             Log.w(TAG, "Could not determine the launching uid.");
         }
 
+        // The UID of the origin of the installation. Note that it can be different than the
+        // "installer" of the session. For instance, if a 3P caller launched PIA with an ACTION_VIEW
+        // intent, the originatingUid is the 3P caller, but the "installer" in this case would
+        // be PIA.
+        int originatingUid = callingUid;
+
         final boolean isSessionInstall =
                 PackageInstaller.ACTION_CONFIRM_PRE_APPROVAL.equals(intent.getAction())
                         || PackageInstaller.ACTION_CONFIRM_INSTALL.equals(intent.getAction());
 
-        // If the activity was started via a PackageInstaller session, we retrieve the calling
-        // package from that session
+        // If the activity was started via a PackageInstaller session, we retrieve the originating
+        // UID from that session
         final int sessionId = (isSessionInstall
                 ? intent.getIntExtra(PackageInstaller.EXTRA_SESSION_ID, SessionInfo.INVALID_ID)
                 : SessionInfo.INVALID_ID);
-        int originatingUidFromSession = callingUid;
-        if (callingPackage == null && sessionId != SessionInfo.INVALID_ID) {
+        if (sessionId != SessionInfo.INVALID_ID) {
             PackageInstaller.SessionInfo sessionInfo = mPackageInstaller.getSessionInfo(sessionId);
             if (sessionInfo != null) {
-                callingPackage = sessionInfo.getInstallerPackageName();
                 callingAttributionTag = sessionInfo.getInstallerAttributionTag();
-                originatingUidFromSession = sessionInfo.getOriginatingUid();
+                if (sessionInfo.getOriginatingUid() != Process.INVALID_UID) {
+                    originatingUid = sessionInfo.getOriginatingUid();
+                }
             }
         }
 
         final ApplicationInfo sourceInfo = getSourceInfo(callingPackage);
 
-        // Uid of the source package, with a preference to uid from ApplicationInfo
-        final int originatingUid = sourceInfo != null ? sourceInfo.uid : callingUid;
-
         if (callingUid == Process.INVALID_UID && sourceInfo == null) {
             Log.e(TAG, "Cannot determine caller since UID is invalid and sourceInfo is null");
             mAbortInstall = true;
@@ -125,28 +128,28 @@
         boolean isTrustedSource = false;
         if (sourceInfo != null && sourceInfo.isPrivilegedApp()) {
             isTrustedSource = intent.getBooleanExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, false) || (
-                    originatingUid != Process.INVALID_UID && checkPermission(
-                            Manifest.permission.INSTALL_PACKAGES, -1 /* pid */, originatingUid)
-                            == PackageManager.PERMISSION_GRANTED);
+                callingUid != Process.INVALID_UID && checkPermission(
+                    Manifest.permission.INSTALL_PACKAGES, -1 /* pid */, callingUid)
+                    == PackageManager.PERMISSION_GRANTED);
         }
 
         if (!isTrustedSource && !isSystemDownloadsProvider && !isDocumentsManager
-                && originatingUid != Process.INVALID_UID) {
-            final int targetSdkVersion = getMaxTargetSdkVersionForUid(this, originatingUid);
+                && callingUid != Process.INVALID_UID) {
+            final int targetSdkVersion = getMaxTargetSdkVersionForUid(this, callingUid);
             if (targetSdkVersion < 0) {
-                Log.e(TAG, "Cannot get target sdk version for uid " + originatingUid);
+                Log.e(TAG, "Cannot get target sdk version for uid " + callingUid);
                 // Invalid originating uid supplied. Abort install.
                 mAbortInstall = true;
             } else if (targetSdkVersion >= Build.VERSION_CODES.O && !isUidRequestingPermission(
-                    originatingUid, Manifest.permission.REQUEST_INSTALL_PACKAGES)) {
-                Log.e(TAG, "Requesting uid " + originatingUid + " needs to declare permission "
+                callingUid, Manifest.permission.REQUEST_INSTALL_PACKAGES)) {
+                Log.e(TAG, "Requesting uid " + callingUid + " needs to declare permission "
                         + Manifest.permission.REQUEST_INSTALL_PACKAGES);
                 mAbortInstall = true;
             }
         }
 
-        if (sessionId != -1 && !isCallerSessionOwner(originatingUid, sessionId)) {
-            Log.e(TAG, "UID " + originatingUid + " is not the owner of session " +
+        if (sessionId != -1 && !isCallerSessionOwner(callingUid, sessionId)) {
+            Log.e(TAG, "CallingUid " + callingUid + " is not the owner of session " +
                 sessionId);
             mAbortInstall = true;
         }
@@ -156,10 +159,9 @@
         final String installerPackageNameFromIntent = getIntent().getStringExtra(
                 Intent.EXTRA_INSTALLER_PACKAGE_NAME);
         if (installerPackageNameFromIntent != null) {
-            final String callingPkgName = getLaunchedFromPackage();
-            if (!TextUtils.equals(installerPackageNameFromIntent, callingPkgName)
+            if (!TextUtils.equals(installerPackageNameFromIntent, callingPackage)
                     && mPackageManager.checkPermission(Manifest.permission.INSTALL_PACKAGES,
-                    callingPkgName) != PackageManager.PERMISSION_GRANTED) {
+                    callingPackage) != PackageManager.PERMISSION_GRANTED) {
                 Log.e(TAG, "The given installer package name " + installerPackageNameFromIntent
                         + " is invalid. Remove it.");
                 EventLog.writeEvent(0x534e4554, "236687884", getLaunchedFromUid(),
@@ -187,8 +189,6 @@
                 callingAttributionTag);
         nextActivity.putExtra(PackageInstallerActivity.EXTRA_ORIGINAL_SOURCE_INFO, sourceInfo);
         nextActivity.putExtra(Intent.EXTRA_ORIGINATING_UID, originatingUid);
-        nextActivity.putExtra(PackageInstallerActivity.EXTRA_ORIGINATING_UID_FROM_SESSION_INFO,
-            originatingUidFromSession);
         nextActivity.putExtra(PackageInstallerActivity.EXTRA_IS_TRUSTED_SOURCE, isTrustedSource);
 
         if (isSessionInstall) {
@@ -291,8 +291,8 @@
         return false;
     }
 
-    private boolean isCallerSessionOwner(int originatingUid, int sessionId) {
-        if (originatingUid == Process.ROOT_UID) {
+    private boolean isCallerSessionOwner(int callingUid, int sessionId) {
+        if (callingUid == Process.ROOT_UID) {
             return true;
         }
         PackageInstaller.SessionInfo sessionInfo = mPackageInstaller.getSessionInfo(sessionId);
@@ -300,7 +300,7 @@
             return false;
         }
         int installerUid = sessionInfo.getInstallerUid();
-        return originatingUid == installerUid;
+        return callingUid == installerUid;
     }
 
     private void checkDevicePolicyRestrictions() {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
index 1b93c10..8bed945 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
@@ -84,8 +84,6 @@
     static final String EXTRA_ORIGINAL_SOURCE_INFO = "EXTRA_ORIGINAL_SOURCE_INFO";
     static final String EXTRA_STAGED_SESSION_ID = "EXTRA_STAGED_SESSION_ID";
     static final String EXTRA_APP_SNIPPET = "EXTRA_APP_SNIPPET";
-    static final String EXTRA_ORIGINATING_UID_FROM_SESSION_INFO =
-        "EXTRA_ORIGINATING_UID_FROM_SESSION_INFO";
     static final String EXTRA_IS_TRUSTED_SOURCE = "EXTRA_IS_TRUSTED_SOURCE";
     private static final String ALLOW_UNKNOWN_SOURCES_KEY =
             PackageInstallerActivity.class.getName() + "ALLOW_UNKNOWN_SOURCES_KEY";
@@ -99,10 +97,6 @@
      * The package name corresponding to #mOriginatingUid
      */
     private String mOriginatingPackage;
-    /**
-     * The package name corresponding to the app updater in the update-ownership confirmation dialog
-     */
-    private String mOriginatingPackageFromSessionInfo;
     private int mActivityResultCode = Activity.RESULT_CANCELED;
     private int mPendingUserActionReason = -1;
 
@@ -155,8 +149,7 @@
             viewToEnable = mDialog.requireViewById(R.id.install_confirm_question_update);
 
             final CharSequence existingUpdateOwnerLabel = getExistingUpdateOwnerLabel();
-            final CharSequence requestedUpdateOwnerLabel =
-                getApplicationLabel(mOriginatingPackageFromSessionInfo);
+            final CharSequence requestedUpdateOwnerLabel = getApplicationLabel(mOriginatingPackage);
             if (!TextUtils.isEmpty(existingUpdateOwnerLabel)
                     && mPendingUserActionReason == PackageInstaller.REASON_REMIND_OWNERSHIP) {
                 String updateOwnerString =
@@ -370,15 +363,9 @@
         mCallingPackage = intent.getStringExtra(EXTRA_CALLING_PACKAGE);
         mCallingAttributionTag = intent.getStringExtra(EXTRA_CALLING_ATTRIBUTION_TAG);
         mSourceInfo = intent.getParcelableExtra(EXTRA_ORIGINAL_SOURCE_INFO);
-        mOriginatingUid = intent.getIntExtra(Intent.EXTRA_ORIGINATING_UID,
-                Process.INVALID_UID);
+        mOriginatingUid = intent.getIntExtra(Intent.EXTRA_ORIGINATING_UID, Process.INVALID_UID);
         mOriginatingPackage = (mOriginatingUid != Process.INVALID_UID)
                 ? getPackageNameForUid(mOriginatingUid) : null;
-        int originatingUidFromSessionInfo =
-            intent.getIntExtra(EXTRA_ORIGINATING_UID_FROM_SESSION_INFO, Process.INVALID_UID);
-        mOriginatingPackageFromSessionInfo = (originatingUidFromSessionInfo != Process.INVALID_UID)
-            ? getPackageNameForUid(originatingUidFromSessionInfo) : mCallingPackage;
-
 
         final Object packageSource;
         if (PackageInstaller.ACTION_CONFIRM_INSTALL.equals(action)) {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java b/packages/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java
index 976a3ad..bcc737a 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java
@@ -30,6 +30,8 @@
 import android.content.pm.ProviderInfo;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.Bitmap.CompressFormat;
+import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
@@ -46,6 +48,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 
+import java.io.ByteArrayOutputStream;
 import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
@@ -135,10 +138,10 @@
 
     static final class AppSnippet implements Parcelable {
         @NonNull public CharSequence label;
-        @Nullable public Drawable icon;
+        @NonNull public Drawable icon;
         public int iconSize;
 
-        AppSnippet(@NonNull CharSequence label, @Nullable Drawable icon, Context context) {
+        AppSnippet(@NonNull CharSequence label, @NonNull Drawable icon, Context context) {
             this.label = label;
             this.icon = icon;
             final ActivityManager am = context.getSystemService(ActivityManager.class);
@@ -147,14 +150,15 @@
 
         private AppSnippet(Parcel in) {
             label = in.readString();
-            Bitmap bmp = in.readParcelable(getClass().getClassLoader(), Bitmap.class);
+            byte[] b = in.readBlob();
+            Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length);
             icon = new BitmapDrawable(Resources.getSystem(), bmp);
             iconSize = in.readInt();
         }
 
         @Override
         public String toString() {
-            return "AppSnippet[" + label + (icon != null ? "(has" : "(no ") + " icon)]";
+            return "AppSnippet[" + label + " (has icon)]";
         }
 
         @Override
@@ -165,16 +169,18 @@
         @Override
         public void writeToParcel(@NonNull Parcel dest, int flags) {
             dest.writeString(label.toString());
+
             Bitmap bmp = getBitmapFromDrawable(icon);
-            dest.writeParcelable(bmp, 0);
+            dest.writeBlob(getBytesFromBitmap(bmp));
+            bmp.recycle();
+
             dest.writeInt(iconSize);
         }
 
         private Bitmap getBitmapFromDrawable(Drawable drawable) {
             // Create an empty bitmap with the dimensions of our drawable
             final Bitmap bmp = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
-                    drawable.getIntrinsicHeight(),
-                    Bitmap.Config.ARGB_8888);
+                drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
             // Associate it with a canvas. This canvas will draw the icon on the bitmap
             final Canvas canvas = new Canvas(bmp);
             // Draw the drawable in the canvas. The canvas will ultimately paint the drawable in the
@@ -192,6 +198,23 @@
             return bmp;
         }
 
+        private byte[] getBytesFromBitmap(Bitmap bmp) {
+            ByteArrayOutputStream baos = null;
+            try {
+                baos = new ByteArrayOutputStream();
+                bmp.compress(CompressFormat.PNG, 100, baos);
+            } finally {
+                try {
+                    if (baos != null) {
+                        baos.close();
+                    }
+                } catch (IOException e) {
+                    Log.e(LOG_TAG, "ByteArrayOutputStream was not closed");
+                }
+            }
+            return baos.toByteArray();
+        }
+
         public static final Parcelable.Creator<AppSnippet> CREATOR = new Parcelable.Creator<>() {
             public AppSnippet createFromParcel(Parcel in) {
                 return new AppSnippet(in);
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
index 8f5d07c..407ab5f 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
@@ -245,8 +245,7 @@
     }
 
     private static boolean isArchivingEnabled() {
-        return android.content.pm.Flags.archiving()
-                || SystemProperties.getBoolean("pm.archiving.enabled", false);
+        return android.content.pm.Flags.archiving();
     }
 
     private boolean isCloneProfile(UserHandle userHandle) {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallRepository.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallRepository.kt
index e48c0f4..f7752ff 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallRepository.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallRepository.kt
@@ -60,6 +60,7 @@
 import com.android.packageinstaller.v2.model.PackageUtil.isCallerSessionOwner
 import com.android.packageinstaller.v2.model.PackageUtil.isInstallPermissionGrantedOrRequested
 import com.android.packageinstaller.v2.model.PackageUtil.isPermissionGranted
+import com.android.packageinstaller.v2.model.PackageUtil.localLogv
 import java.io.File
 import java.io.IOException
 import kotlinx.coroutines.DelicateCoroutinesApi
@@ -75,7 +76,6 @@
     private val devicePolicyManager: DevicePolicyManager? =
         context.getSystemService(DevicePolicyManager::class.java)
     private val appOpsManager: AppOpsManager? = context.getSystemService(AppOpsManager::class.java)
-    private val localLOGV = false
     private var isSessionInstall = false
     private var isTrustedSource = false
     private val _stagingResult = MutableLiveData<InstallStage>()
@@ -136,7 +136,7 @@
 
         callingPackage = callerInfo.packageName
 
-        if (callingPackage == null && sessionId != SessionInfo.INVALID_ID) {
+        if (sessionId != SessionInfo.INVALID_ID) {
             val sessionInfo: SessionInfo? = packageInstaller.getSessionInfo(sessionId)
             callingPackage = sessionInfo?.getInstallerPackageName()
             callingAttributionTag = sessionInfo?.getInstallerAttributionTag()
@@ -155,8 +155,18 @@
             originatingUid, callingAttributionTag
         )
 
+        if(localLogv) {
+            Log.i(LOG_TAG, "Intent: $intent\n" +
+                "sessionId: $sessionId\n" +
+                "staged sessionId: $stagedSessionId\n" +
+                "calling package: $callingPackage\n" +
+                "callingUid: $callingUid\n" +
+                "originatingUid: $originatingUid")
+        }
+
         if (callingUid == Process.INVALID_UID && sourceInfo == null) {
             // Caller's identity could not be determined. Abort the install
+            Log.e(LOG_TAG, "Cannot determine caller since UID is invalid and sourceInfo is null")
             return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
         }
 
@@ -165,6 +175,9 @@
             || (stagedSessionId != SessionInfo.INVALID_ID
                 && !isCallerSessionOwner(packageInstaller, Process.myUid(), stagedSessionId))
         ) {
+            Log.e(LOG_TAG, "UID is not the owner of the session:\n" +
+                "CallingUid: $originatingUid | SessionId: $sessionId\n" +
+                "My UID: ${Process.myUid()} | StagedSessionId: $stagedSessionId")
             return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
         }
 
@@ -173,6 +186,9 @@
                 context, callingUid, originatingUid, isTrustedSource
             )
         ) {
+            Log.e(LOG_TAG, "UID $originatingUid needs to declare " +
+                Manifest.permission.REQUEST_INSTALL_PACKAGES
+            )
             return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
         }
 
@@ -180,6 +196,7 @@
         if (restriction != null) {
             val adminSupportDetailsIntent =
                 devicePolicyManager!!.createAdminSupportIntent(restriction)
+            Log.e(LOG_TAG, "$restriction set in place. Cannot install." )
             return InstallAborted(
                 ABORT_REASON_POLICY, message = restriction, resultIntent = adminSupportDetailsIntent
             )
@@ -287,7 +304,7 @@
                         stagedSessionId = packageInstaller.createSession(params)
                     }
                 } catch (e: Exception) {
-                    Log.w(LOG_TAG, "Failed to create a staging session", e)
+                    Log.e(LOG_TAG, "Failed to create a staging session", e)
                     _stagingResult.value = InstallAborted(
                         ABORT_REASON_INTERNAL_ERROR,
                         resultIntent = Intent().putExtra(
@@ -308,6 +325,7 @@
                     _stagingResult.value = InstallReady()
                 } else {
                     cleanupStagingSession()
+                    Log.e(LOG_TAG, "Could not stage APK.")
                     _stagingResult.value = InstallAborted(
                         ABORT_REASON_INTERNAL_ERROR,
                         resultIntent = Intent().putExtra(
@@ -318,6 +336,7 @@
                 }
             }
         } else {
+            Log.e(LOG_TAG, "Invalid URI: ${if (uri == null) "null" else uri.scheme}")
             _stagingResult.value = InstallAborted(
                 ABORT_REASON_INTERNAL_ERROR,
                 resultIntent = Intent().putExtra(
@@ -403,8 +422,8 @@
      */
     fun requestUserConfirmation(): InstallStage {
         return if (isTrustedSource) {
-            if (localLOGV) {
-                Log.i(LOG_TAG, "install allowed")
+            if (localLogv) {
+                Log.i(LOG_TAG, "Install allowed")
             }
             // Returns InstallUserActionRequired stage if install details could be successfully
             // computed, else it returns InstallAborted.
@@ -428,7 +447,7 @@
             val info = packageInstaller.getSessionInfo(sessionId)
             val resolvedPath = info?.resolvedBaseApkPath
             if (info == null || !info.isSealed || resolvedPath == null) {
-                Log.w(LOG_TAG, "Session $sessionId in funky state; ignoring")
+                Log.e(LOG_TAG, "Session $sessionId in funky state; ignoring")
                 return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
             }
             packageSource = Uri.fromFile(File(resolvedPath))
@@ -440,7 +459,7 @@
         } else if (PackageInstaller.ACTION_CONFIRM_PRE_APPROVAL == intent.action) {
             val info = packageInstaller.getSessionInfo(sessionId)
             if (info == null || !info.isPreApprovalRequested) {
-                Log.w(LOG_TAG, "Session $sessionId in funky state; ignoring")
+                Log.e(LOG_TAG, "Session $sessionId in funky state; ignoring")
                 return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
             }
             packageSource = info
@@ -465,7 +484,7 @@
 
         // if there's nothing to do, quietly slip into the ether
         if (packageSource == null) {
-            Log.w(LOG_TAG, "Unspecified source")
+            Log.e(LOG_TAG, "Unspecified source")
             return InstallAborted(
                 ABORT_REASON_INTERNAL_ERROR,
                 resultIntent = Intent().putExtra(
@@ -509,7 +528,7 @@
         if (scheme == null) {
             return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
         }
-        if (localLOGV) {
+        if (localLogv) {
             Log.i(LOG_TAG, "processPackageUri(): uri = $packageUri, scheme = $scheme")
         }
         when (scheme) {
@@ -528,7 +547,7 @@
                     }
                 }
                 if (newPackageInfo == null) {
-                    Log.w(
+                    Log.e(
                         LOG_TAG, "Requested package " + packageUri.schemeSpecificPart
                             + " not available. Discontinuing installation"
                     )
@@ -542,7 +561,7 @@
                     )
                 }
                 appSnippet = getAppSnippet(context, newPackageInfo!!)
-                if (localLOGV) {
+                if (localLogv) {
                     Log.i(LOG_TAG, "Created snippet for " + appSnippet.label)
                 }
             }
@@ -569,7 +588,7 @@
                         activityResultCode = Activity.RESULT_FIRST_USER
                     )
                 }
-                if (localLOGV) {
+                if (localLogv) {
                     Log.i(LOG_TAG, "Creating snippet for local file $sourceFile")
                 }
                 appSnippet = getAppSnippet(context, newPackageInfo!!, sourceFile!!)
@@ -590,9 +609,7 @@
      * Use the SessionInfo and set up the installer for pre-commit install session.
      *
      * @param sessionInfo The SessionInfo to compose
-     * @return
-     *  * [InstallUserActionRequired] if source could be processed
-     *  * [InstallAborted] if source is invalid or there was an error is processing a source
+     * @return [InstallUserActionRequired]
      */
     private fun processSessionInfo(sessionInfo: SessionInfo, userActionReason: Int): InstallStage {
         newPackageInfo = generateStubPackageInfo(sessionInfo.getAppPackageName())
@@ -718,7 +735,7 @@
             appOpStr!!, requestInfo.originatingUid, requestInfo.callingPackage,
             requestInfo.attributionTag, "Started package installation activity"
         )
-        if (localLOGV) {
+        if (localLogv) {
             Log.i(LOG_TAG, "handleUnknownSources(): appMode=$appOpMode")
         }
 
@@ -764,6 +781,9 @@
     fun initiateInstall() {
         if (sessionId > 0) {
             packageInstaller.setPermissionsResult(sessionId, true)
+            if (localLogv) {
+                Log.i(LOG_TAG, "Install permission granted for session $sessionId")
+            }
             _installResult.value = InstallAborted(
                 ABORT_REASON_DONE, activityResultCode = Activity.RESULT_OK
             )
@@ -824,8 +844,13 @@
     private fun setStageBasedOnResult(
         statusCode: Int,
         legacyStatus: Int,
-        message: String?
+        message: String?,
     ) {
+        if (localLogv) {
+            Log.i(LOG_TAG, "Status code: $statusCode\n" +
+                "legacy status: $legacyStatus\n" +
+                "message: $message")
+        }
         if (statusCode == PackageInstaller.STATUS_SUCCESS) {
             val shouldReturnResult = intent.getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)
             val resultIntent = if (shouldReturnResult) {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt
index 8d8c2f1..bae6f68 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt
@@ -36,7 +36,8 @@
 object PackageUtil {
     private val LOG_TAG = InstallRepository::class.java.simpleName
     private const val DOWNLOADS_AUTHORITY = "downloads"
-    private const val SPLIT_BASE_APK_END_WITH = "base.apk"
+    private const val SPLIT_BASE_APK_SUFFIX = "base.apk"
+    const val localLogv = false
 
     /**
      * Determines if the UID belongs to the system downloads provider and returns the
@@ -394,7 +395,7 @@
     @JvmStatic
     fun getPackageInfo(context: Context, sourceFile: File, flags: Int): PackageInfo? {
         var filePath = sourceFile.absolutePath
-        if (filePath.endsWith(SPLIT_BASE_APK_END_WITH)) {
+        if (filePath.endsWith(SPLIT_BASE_APK_SUFFIX)) {
             val dir = sourceFile.parentFile
             if ((dir?.listFiles()?.size ?: 0) > 1) {
                 // split apks, use file directory to get archive info
@@ -436,5 +437,9 @@
      * The class to hold an incoming package's icon and label.
      * See [getAppSnippet]
      */
-    data class AppSnippet(var label: CharSequence?, var icon: Drawable?)
+    data class AppSnippet(var label: CharSequence?, var icon: Drawable?) {
+        override fun toString(): String {
+            return "AppSnippet[label = ${label}, hasIcon = ${icon != null}]"
+        }
+    }
 }
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/UninstallRepository.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/UninstallRepository.kt
index c6b6d36..0091a3e8 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/UninstallRepository.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/UninstallRepository.kt
@@ -226,18 +226,19 @@
                 userName
             )
             if (userManager!!.isSameProfileGroup(myUserHandle, uninstalledUser!!)) {
-                if (customUserManager!!.isManagedProfile()) {
+                if (customUserManager.isManagedProfile) {
                     messageString = context.getString(
                             R.string.uninstall_application_text_current_user_work_profile, userName
                     )
-                } else if (customUserManager!!.isCloneProfile()){
+                } else if (customUserManager.isCloneProfile){
                     isClonedApp = true
                     messageString = context.getString(
                             R.string.uninstall_application_text_current_user_clone_profile
                     )
                 } else if (Flags.allowPrivateProfile()
                         && android.multiuser.Flags.enablePrivateSpaceFeatures()
-                        && customUserManager!!.isPrivateProfile()) {
+                        && customUserManager.isPrivateProfile
+                ) {
                     // TODO(b/324244123): Get these Strings from a User Property API.
                     messageString = context.getString(
                             R.string.uninstall_application_text_current_user_private_profile
@@ -401,6 +402,7 @@
         uninstallData.putBoolean(Intent.EXTRA_UNINSTALL_ALL_USERS, uninstallFromAllUsers)
         uninstallData.putCharSequence(EXTRA_APP_LABEL, targetAppLabel)
         uninstallData.putBoolean(EXTRA_IS_CLONE_APP, isClonedApp)
+        uninstallData.putInt(EXTRA_TARGET_USER_ID, uninstalledUser!!.identifier)
         Log.i(LOG_TAG, "Uninstalling extras = $uninstallData")
 
         // Get a PendingIntent for result broadcast and issue an uninstall request
@@ -730,7 +732,7 @@
         }
     }
 
-    fun cancelInstall() {
+    fun cancelUninstall() {
         if (callback != null) {
             callback!!.onUninstallComplete(
                 targetPackageName!!,
@@ -749,6 +751,7 @@
         private const val EXTRA_IS_CLONE_APP = "com.android.packageinstaller.extra.IS_CLONE_APP"
         private const val EXTRA_PACKAGE_NAME =
             "com.android.packageinstaller.extra.EXTRA_PACKAGE_NAME"
+        private const val EXTRA_TARGET_USER_ID = "EXTRA_TARGET_USER_ID"
     }
 
     class CallerInfo(val activityName: String?, val uid: Int)
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/InstallLaunch.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/InstallLaunch.kt
index 6f8eca3..31b9ccb 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/InstallLaunch.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/InstallLaunch.kt
@@ -43,6 +43,7 @@
 import com.android.packageinstaller.v2.model.InstallStage
 import com.android.packageinstaller.v2.model.InstallSuccess
 import com.android.packageinstaller.v2.model.InstallUserActionRequired
+import com.android.packageinstaller.v2.model.PackageUtil.localLogv
 import com.android.packageinstaller.v2.ui.fragments.AnonymousSourceFragment
 import com.android.packageinstaller.v2.ui.fragments.ExternalSourcesBlockedFragment
 import com.android.packageinstaller.v2.ui.fragments.InstallConfirmationFragment
@@ -66,8 +67,6 @@
         private const val TAG_DIALOG = "dialog"
     }
 
-    private val localLOGV = false
-
     /**
      * A collection of unknown sources listeners that are actively listening for app ops mode
      * changes
@@ -199,14 +198,14 @@
         // admin enforcing the restriction for the affected user. If not enforced by the admin,
         // show the system dialog.
         if (adminSupportIntent != null) {
-            if (localLOGV) {
+            if (localLogv) {
                 Log.i(LOG_TAG, "Restriction set by admin, starting $adminSupportIntent")
             }
             startActivity(adminSupportIntent)
             // Finish the package installer app since the next dialog will not be shown by this app
             shouldFinish = true
         } else {
-            if (localLOGV) {
+            if (localLogv) {
                 Log.i(LOG_TAG, "Restriction set by system: $restriction")
             }
             val blockedByPolicyDialog = createDevicePolicyRestrictionDialog(restriction)
@@ -225,7 +224,7 @@
      * @return The dialog
      */
     private fun createDevicePolicyRestrictionDialog(restriction: String?): DialogFragment? {
-        if (localLOGV) {
+        if (localLogv) {
             Log.i(LOG_TAG, "createDialog($restriction)")
         }
         return when (restriction) {
@@ -259,6 +258,9 @@
     }
 
     override fun onPositiveResponse(reasonCode: Int) {
+        if (localLogv) {
+            Log.d(LOG_TAG, "Positive button clicked. ReasonCode: $reasonCode")
+        }
         when (reasonCode) {
             InstallUserActionRequired.USER_ACTION_REASON_ANONYMOUS_SOURCE ->
                 installViewModel!!.forcedSkipSourceCheck()
@@ -269,6 +271,9 @@
     }
 
     override fun onNegativeResponse(stageCode: Int) {
+        if (localLogv) {
+            Log.d(LOG_TAG, "Negative button clicked. StageCode: $stageCode")
+        }
         if (stageCode == InstallStage.STAGE_USER_ACTION_REQUIRED) {
             installViewModel!!.cleanupInstall()
         }
@@ -276,10 +281,16 @@
     }
 
     override fun onNegativeResponse(resultCode: Int, data: Intent?) {
+        if (localLogv) {
+            Log.d(LOG_TAG, "Negative button clicked. resultCode: $resultCode; Intent: $data")
+        }
         setResult(resultCode, data, true)
     }
 
     override fun sendUnknownAppsIntent(sourcePackageName: String) {
+        if (localLogv) {
+            Log.d(LOG_TAG, "Launching unknown-apps settings intent for $sourcePackageName")
+        }
         val settingsIntent = Intent()
         settingsIntent.setAction(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)
         val packageUri = Uri.parse("package:$sourcePackageName")
@@ -299,6 +310,9 @@
     }
 
     override fun openInstalledApp(intent: Intent?) {
+        if (localLogv) {
+            Log.d(LOG_TAG, "Opening $intent")
+        }
         setResult(Activity.RESULT_OK, intent, true)
         if (intent != null && intent.hasCategory(Intent.CATEGORY_LAUNCHER)) {
             startActivity(intent)
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/UninstallLaunch.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/UninstallLaunch.kt
index 0050c7e..c4ca272 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/UninstallLaunch.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/UninstallLaunch.kt
@@ -28,6 +28,7 @@
 import androidx.fragment.app.FragmentActivity
 import androidx.fragment.app.FragmentManager
 import androidx.lifecycle.ViewModelProvider
+import com.android.packageinstaller.v2.model.PackageUtil.localLogv
 import com.android.packageinstaller.v2.model.UninstallAborted
 import com.android.packageinstaller.v2.model.UninstallFailed
 import com.android.packageinstaller.v2.model.UninstallRepository
@@ -159,11 +160,17 @@
     }
 
     override fun onPositiveResponse(keepData: Boolean) {
+        if (localLogv) {
+            Log.d(LOG_TAG, "Staring uninstall")
+        }
         uninstallViewModel!!.initiateUninstall(keepData)
     }
 
     override fun onNegativeResponse() {
-        uninstallViewModel!!.cancelInstall()
+        if (localLogv) {
+            Log.d(LOG_TAG, "Cancelling uninstall")
+        }
+        uninstallViewModel!!.cancelUninstall()
         setResult(Activity.RESULT_FIRST_USER, null, true)
     }
 }
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/AnonymousSourceFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/AnonymousSourceFragment.java
index b29cb2a..cc40b0c 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/AnonymousSourceFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/AnonymousSourceFragment.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.util.Log;
 import androidx.annotation.NonNull;
 import androidx.fragment.app.DialogFragment;
 import com.android.packageinstaller.R;
@@ -33,7 +34,7 @@
  */
 public class AnonymousSourceFragment extends DialogFragment {
 
-    public static String TAG = AnonymousSourceFragment.class.getSimpleName();
+    public static final String LOG_TAG = AnonymousSourceFragment.class.getSimpleName();
     @NonNull
     private InstallActionListener mInstallActionListener;
     @NonNull
@@ -48,7 +49,8 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-       mDialog = new AlertDialog.Builder(requireContext())
+        Log.i(LOG_TAG, "Creating " + LOG_TAG);
+        mDialog = new AlertDialog.Builder(requireContext())
             .setMessage(R.string.anonymous_source_warning)
             .setPositiveButton(R.string.anonymous_source_continue,
                 ((dialog, which) -> mInstallActionListener.onPositiveResponse(
@@ -56,7 +58,7 @@
             .setNegativeButton(R.string.cancel,
                 ((dialog, which) -> mInstallActionListener.onNegativeResponse(
                     InstallStage.STAGE_USER_ACTION_REQUIRED))).create();
-       return mDialog;
+        return mDialog;
     }
 
     @Override
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ExternalSourcesBlockedFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ExternalSourcesBlockedFragment.java
index 2314d6b..a95137d 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ExternalSourcesBlockedFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ExternalSourcesBlockedFragment.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.util.Log;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.DialogFragment;
@@ -34,7 +35,7 @@
  */
 public class ExternalSourcesBlockedFragment extends DialogFragment {
 
-    private final String TAG = ExternalSourcesBlockedFragment.class.getSimpleName();
+    private static final String LOG_TAG = ExternalSourcesBlockedFragment.class.getSimpleName();
     @NonNull
     private final InstallUserActionRequired mDialogData;
     @NonNull
@@ -55,6 +56,7 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
         mDialog = new AlertDialog.Builder(requireContext())
             .setTitle(mDialogData.getAppLabel())
             .setIcon(mDialogData.getAppIcon())
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallConfirmationFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallConfirmationFragment.java
index 0a4aa48..99b1eec 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallConfirmationFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallConfirmationFragment.java
@@ -23,6 +23,7 @@
 import android.os.Bundle;
 import android.text.Html;
 import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
 import android.view.View;
 import android.widget.TextView;
 import androidx.annotation.NonNull;
@@ -37,8 +38,7 @@
  */
 public class InstallConfirmationFragment extends DialogFragment {
 
-    public static String TAG = InstallConfirmationFragment.class.getSimpleName();
-
+    public static final String LOG_TAG = InstallConfirmationFragment.class.getSimpleName();
     @NonNull
     private final InstallUserActionRequired mDialogData;
     @NonNull
@@ -59,6 +59,7 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
         View dialogView = getLayoutInflater().inflate(R.layout.install_content_view, null);
 
         int positiveBtnTextRes;
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallFailedFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallFailedFragment.java
index 4667a7a..7c9d98d 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallFailedFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallFailedFragment.java
@@ -38,7 +38,7 @@
  */
 public class InstallFailedFragment extends DialogFragment {
 
-    private static final String TAG = InstallFailedFragment.class.getSimpleName();
+    private static final String LOG_TAG = InstallFailedFragment.class.getSimpleName();
     private final InstallFailed mDialogData;
     private InstallActionListener mInstallActionListener;
 
@@ -55,6 +55,7 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
         View dialogView = getLayoutInflater().inflate(R.layout.install_content_view, null);
         AlertDialog dialog = new AlertDialog.Builder(requireContext())
             .setTitle(mDialogData.getAppLabel())
@@ -75,7 +76,7 @@
      * @param statusCode The status code from the package installer.
      */
     private void setExplanationFromErrorCode(int statusCode, View dialogView) {
-        Log.d(TAG, "Installation status code: " + statusCode);
+        Log.i(LOG_TAG, "Installation status code: " + statusCode);
 
         View viewToEnable;
         switch (statusCode) {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallInstallingFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallInstallingFragment.java
index 7327b5d..27210b7 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallInstallingFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallInstallingFragment.java
@@ -20,6 +20,7 @@
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.View;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -32,6 +33,7 @@
  */
 public class InstallInstallingFragment extends DialogFragment {
 
+    private static final String LOG_TAG = InstallInstallingFragment.class.getSimpleName();
     private final InstallInstalling mDialogData;
     private AlertDialog mDialog;
 
@@ -42,6 +44,7 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
         View dialogView = getLayoutInflater().inflate(R.layout.install_content_view, null);
         mDialog = new AlertDialog.Builder(requireContext())
             .setTitle(mDialogData.getAppLabel())
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallStagingFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallStagingFragment.java
index feb2428..3cab96b 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallStagingFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallStagingFragment.java
@@ -20,6 +20,7 @@
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.View;
 import android.widget.ProgressBar;
 import androidx.annotation.NonNull;
@@ -29,13 +30,14 @@
 
 public class InstallStagingFragment extends DialogFragment {
 
-    private static final String TAG = InstallStagingFragment.class.getSimpleName();
+    private static final String LOG_TAG = InstallStagingFragment.class.getSimpleName();
     private ProgressBar mProgressBar;
     private AlertDialog mDialog;
 
     @NonNull
     @Override
     public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        Log.i(LOG_TAG, "Creating " + LOG_TAG);
         View dialogView = getLayoutInflater().inflate(R.layout.install_content_view, null);
         dialogView.requireViewById(R.id.staging).setVisibility(View.VISIBLE);
 
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallSuccessFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallSuccessFragment.java
index e491f9c..28b5423b 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallSuccessFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallSuccessFragment.java
@@ -60,6 +60,7 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
         View dialogView = getLayoutInflater().inflate(R.layout.install_content_view, null);
         mDialog = new AlertDialog.Builder(requireContext())
             .setTitle(mDialogData.getAppLabel())
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ParseErrorFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ParseErrorFragment.java
index 68d48d6..cde3d8d 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ParseErrorFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ParseErrorFragment.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.util.Log;
 import androidx.annotation.NonNull;
 import androidx.fragment.app.DialogFragment;
 import com.android.packageinstaller.R;
@@ -29,7 +30,7 @@
 
 public class ParseErrorFragment extends DialogFragment {
 
-    private static final String TAG = ParseErrorFragment.class.getSimpleName();
+    private static final String LOG_TAG = ParseErrorFragment.class.getSimpleName();
     private final InstallAborted mDialogData;
     private InstallActionListener mInstallActionListener;
 
@@ -46,7 +47,8 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return new AlertDialog.Builder(getActivity())
+        Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
+        return new AlertDialog.Builder(requireContext())
             .setMessage(R.string.Parse_error_dlg_text)
             .setPositiveButton(R.string.ok,
                 (dialog, which) ->
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/SimpleErrorFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/SimpleErrorFragment.java
index 58b8b2d..66a353a 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/SimpleErrorFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/SimpleErrorFragment.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.util.Log;
 import androidx.annotation.NonNull;
 import androidx.fragment.app.DialogFragment;
 import com.android.packageinstaller.R;
@@ -29,7 +30,7 @@
 
 public class SimpleErrorFragment extends DialogFragment {
 
-    private static final String TAG = SimpleErrorFragment.class.getSimpleName();
+    private static final String LOG_TAG = SimpleErrorFragment.class.getSimpleName();
     private final int mMessageResId;
     private InstallActionListener mInstallActionListener;
 
@@ -46,7 +47,9 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return new AlertDialog.Builder(getActivity())
+        Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" +
+            "Dialog message: " + requireContext().getString(mMessageResId));
+        return new AlertDialog.Builder(requireContext())
             .setMessage(mMessageResId)
             .setPositiveButton(R.string.ok,
                 (dialog, which) ->
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallConfirmationFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallConfirmationFragment.java
index 32ac4a6..87af1ae 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallConfirmationFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallConfirmationFragment.java
@@ -23,6 +23,7 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.View;
 import android.widget.CheckBox;
 import android.widget.TextView;
@@ -37,7 +38,7 @@
  * Dialog to show while requesting user confirmation for uninstalling an app.
  */
 public class UninstallConfirmationFragment extends DialogFragment {
-
+    private static final String LOG_TAG = UninstallConfirmationFragment.class.getSimpleName();
     private final UninstallUserActionRequired mDialogData;
     private UninstallActionListener mUninstallActionListener;
 
@@ -56,6 +57,7 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
         AlertDialog.Builder builder = new AlertDialog.Builder(requireContext())
             .setTitle(mDialogData.getTitle())
             .setPositiveButton(R.string.ok,
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallErrorFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallErrorFragment.java
index eb7183d..51e16cb 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallErrorFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallErrorFragment.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.util.Log;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.DialogFragment;
@@ -33,6 +34,7 @@
  */
 public class UninstallErrorFragment extends DialogFragment {
 
+    private static final String LOG_TAG = UninstallErrorFragment.class.getSimpleName();
     private final UninstallAborted mDialogData;
     private UninstallActionListener mUninstallActionListener;
 
@@ -49,6 +51,7 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
         AlertDialog.Builder builder = new AlertDialog.Builder(requireContext())
             .setMessage(mDialogData.getDialogTextResource())
             .setNegativeButton(R.string.ok,
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallUninstallingFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallUninstallingFragment.java
index 835efc6..626ff6b 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallUninstallingFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallUninstallingFragment.java
@@ -19,6 +19,7 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.os.Bundle;
+import android.util.Log;
 import androidx.annotation.NonNull;
 import androidx.fragment.app.DialogFragment;
 import com.android.packageinstaller.R;
@@ -29,6 +30,7 @@
  */
 public class UninstallUninstallingFragment extends DialogFragment {
 
+    private static final String LOG_TAG = UninstallUninstallingFragment.class.getSimpleName();
     UninstallUninstalling mDialogData;
 
     public UninstallUninstallingFragment(UninstallUninstalling dialogData) {
@@ -38,6 +40,7 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
+        Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
         AlertDialog.Builder builder = new AlertDialog.Builder(requireContext())
             .setCancelable(false);
         if (mDialogData.isCloneUser()) {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/viewmodel/UninstallViewModel.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/viewmodel/UninstallViewModel.kt
index 80886e9..3081d7d 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/viewmodel/UninstallViewModel.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/viewmodel/UninstallViewModel.kt
@@ -56,7 +56,7 @@
         }
     }
 
-    fun cancelInstall() {
-        repository.cancelInstall()
+    fun cancelUninstall() {
+        repository.cancelUninstall()
     }
 }
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/wear/InstallTask.java b/packages/PackageInstaller/src/com/android/packageinstaller/wear/InstallTask.java
deleted file mode 100644
index 53a460d..0000000
--- a/packages/PackageInstaller/src/com/android/packageinstaller/wear/InstallTask.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.packageinstaller.wear;
-
-import android.content.Context;
-import android.content.IntentSender;
-import android.content.pm.PackageInstaller;
-import android.os.Looper;
-import android.os.ParcelFileDescriptor;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Task that installs an APK. This must not be called on the main thread.
- * This code is based off the Finsky/Wearsky implementation
- */
-public class InstallTask {
-    private static final String TAG = "InstallTask";
-
-    private static final int DEFAULT_BUFFER_SIZE = 8192;
-
-    private final Context mContext;
-    private String mPackageName;
-    private ParcelFileDescriptor mParcelFileDescriptor;
-    private PackageInstallerImpl.InstallListener mCallback;
-    private PackageInstaller.Session mSession;
-    private IntentSender mCommitCallback;
-
-    private Exception mException = null;
-    private int mErrorCode = 0;
-    private String mErrorDesc = null;
-
-    public InstallTask(Context context, String packageName,
-            ParcelFileDescriptor parcelFileDescriptor,
-            PackageInstallerImpl.InstallListener callback, PackageInstaller.Session session,
-            IntentSender commitCallback) {
-        mContext = context;
-        mPackageName = packageName;
-        mParcelFileDescriptor = parcelFileDescriptor;
-        mCallback = callback;
-        mSession = session;
-        mCommitCallback = commitCallback;
-    }
-
-    public boolean isError() {
-        return mErrorCode != InstallerConstants.STATUS_SUCCESS || !TextUtils.isEmpty(mErrorDesc);
-    }
-
-    public void execute() {
-        if (Looper.myLooper() == Looper.getMainLooper()) {
-            throw new IllegalStateException("This method cannot be called from the UI thread.");
-        }
-
-        OutputStream sessionStream = null;
-        try {
-            sessionStream = mSession.openWrite(mPackageName, 0, -1);
-
-            // 2b: Stream the asset to the installer. Note:
-            // Note: writeToOutputStreamFromAsset() always safely closes the input stream
-            writeToOutputStreamFromAsset(sessionStream);
-            mSession.fsync(sessionStream);
-        } catch (Exception e) {
-            mException = e;
-            mErrorCode = InstallerConstants.ERROR_INSTALL_COPY_STREAM;
-            mErrorDesc = "Could not write to stream";
-        } finally {
-            if (sessionStream != null) {
-                // 2c: close output stream
-                try {
-                    sessionStream.close();
-                } catch (Exception e) {
-                    // Ignore otherwise
-                    if (mException == null) {
-                        mException = e;
-                        mErrorCode = InstallerConstants.ERROR_INSTALL_CLOSE_STREAM;
-                        mErrorDesc = "Could not close session stream";
-                    }
-                }
-            }
-        }
-
-        if (mErrorCode != InstallerConstants.STATUS_SUCCESS) {
-            // An error occurred, we're done
-            Log.e(TAG, "Exception while installing " + mPackageName + ": " + mErrorCode + ", "
-                    + mErrorDesc + ", " + mException);
-            mSession.close();
-            mCallback.installFailed(mErrorCode, "[" + mPackageName + "]" + mErrorDesc);
-        } else {
-            // 3. Commit the session (this actually installs it.)  Session map
-            // will be cleaned up in the callback.
-            mCallback.installBeginning();
-            mSession.commit(mCommitCallback);
-            mSession.close();
-        }
-    }
-
-    /**
-     * {@code PackageInstaller} works with streams. Get the {@code FileDescriptor}
-     * corresponding to the {@code Asset} and then write the contents into an
-     * {@code OutputStream} that is passed in.
-     * <br>
-     * The {@code FileDescriptor} is closed but the {@code OutputStream} is not closed.
-     */
-    private boolean writeToOutputStreamFromAsset(OutputStream outputStream) {
-        if (outputStream == null) {
-            mErrorCode = InstallerConstants.ERROR_INSTALL_COPY_STREAM_EXCEPTION;
-            mErrorDesc = "Got a null OutputStream.";
-            return false;
-        }
-
-        if (mParcelFileDescriptor == null || mParcelFileDescriptor.getFileDescriptor() == null)  {
-            mErrorCode = InstallerConstants.ERROR_COULD_NOT_GET_FD;
-            mErrorDesc = "Could not get FD";
-            return false;
-        }
-
-        InputStream inputStream = null;
-        try {
-            byte[] inputBuf = new byte[DEFAULT_BUFFER_SIZE];
-            int bytesRead;
-            inputStream = new ParcelFileDescriptor.AutoCloseInputStream(mParcelFileDescriptor);
-
-            while ((bytesRead = inputStream.read(inputBuf)) > -1) {
-                if (bytesRead > 0) {
-                    outputStream.write(inputBuf, 0, bytesRead);
-                }
-            }
-
-            outputStream.flush();
-        } catch (IOException e) {
-            mErrorCode = InstallerConstants.ERROR_INSTALL_APK_COPY_FAILURE;
-            mErrorDesc = "Reading from Asset FD or writing to temp file failed: " + e;
-            return false;
-        } finally {
-            safeClose(inputStream);
-        }
-
-        return true;
-    }
-
-    /**
-     * Quietly close a closeable resource (e.g. a stream or file). The input may already
-     * be closed and it may even be null.
-     */
-    public static void safeClose(Closeable resource) {
-        if (resource != null) {
-            try {
-                resource.close();
-            } catch (IOException ioe) {
-                // Catch and discard the error
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/wear/InstallerConstants.java b/packages/PackageInstaller/src/com/android/packageinstaller/wear/InstallerConstants.java
deleted file mode 100644
index 3daf3d8..0000000
--- a/packages/PackageInstaller/src/com/android/packageinstaller/wear/InstallerConstants.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.packageinstaller.wear;
-
-/**
- * Constants for Installation / Uninstallation requests.
- * Using the same values as Finsky/Wearsky code for consistency in user analytics of failures
- */
-public class InstallerConstants {
-    /** Request succeeded */
-    public static final int STATUS_SUCCESS = 0;
-
-    /**
-     * The new PackageInstaller also returns a small set of less granular error codes, which
-     * we'll remap to the range -500 and below to keep away from existing installer codes
-     * (which run from -1 to -110).
-     */
-    public final static int ERROR_PACKAGEINSTALLER_BASE = -500;
-
-    public static final int ERROR_COULD_NOT_GET_FD = -603;
-    /** This node is not targeted by this request. */
-
-    /** The install did not complete because could not create PackageInstaller session */
-    public final static int ERROR_INSTALL_CREATE_SESSION = -612;
-    /** The install did not complete because could not open PackageInstaller session  */
-    public final static int ERROR_INSTALL_OPEN_SESSION = -613;
-    /** The install did not complete because could not open PackageInstaller output stream */
-    public final static int ERROR_INSTALL_OPEN_STREAM = -614;
-    /** The install did not complete because of an exception while streaming bytes */
-    public final static int ERROR_INSTALL_COPY_STREAM_EXCEPTION = -615;
-    /** The install did not complete because of an unexpected exception from PackageInstaller */
-    public final static int ERROR_INSTALL_SESSION_EXCEPTION = -616;
-    /** The install did not complete because of an unexpected userActionRequired callback */
-    public final static int ERROR_INSTALL_USER_ACTION_REQUIRED = -617;
-    /** The install did not complete because of an unexpected broadcast (missing fields) */
-    public final static int ERROR_INSTALL_MALFORMED_BROADCAST = -618;
-    /** The install did not complete because of an error while copying from downloaded file */
-    public final static int ERROR_INSTALL_APK_COPY_FAILURE = -619;
-    /** The install did not complete because of an error while copying to the PackageInstaller
-     * output stream */
-    public final static int ERROR_INSTALL_COPY_STREAM = -620;
-    /** The install did not complete because of an error while closing the PackageInstaller
-     * output stream */
-    public final static int ERROR_INSTALL_CLOSE_STREAM = -621;
-}
\ No newline at end of file
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/wear/PackageInstallerFactory.java b/packages/PackageInstaller/src/com/android/packageinstaller/wear/PackageInstallerFactory.java
deleted file mode 100644
index bdc22cf..0000000
--- a/packages/PackageInstaller/src/com/android/packageinstaller/wear/PackageInstallerFactory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.packageinstaller.wear;
-
-import android.content.Context;
-
-/**
- * Factory that creates a Package Installer.
- */
-public class PackageInstallerFactory {
-    private static PackageInstallerImpl sPackageInstaller;
-
-    /**
-     * Return the PackageInstaller shared object. {@code init} should have already been called.
-     */
-    public synchronized static PackageInstallerImpl getPackageInstaller(Context context) {
-        if (sPackageInstaller == null) {
-            sPackageInstaller = new PackageInstallerImpl(context);
-        }
-        return sPackageInstaller;
-    }
-}
\ No newline at end of file
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/wear/PackageInstallerImpl.java b/packages/PackageInstaller/src/com/android/packageinstaller/wear/PackageInstallerImpl.java
deleted file mode 100644
index 1e37f15..0000000
--- a/packages/PackageInstaller/src/com/android/packageinstaller/wear/PackageInstallerImpl.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.packageinstaller.wear;
-
-import android.annotation.TargetApi;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.IntentSender;
-import android.content.pm.PackageInstaller;
-import android.os.Build;
-import android.os.ParcelFileDescriptor;
-import android.util.Log;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Implementation of package manager installation using modern PackageInstaller api.
- *
- * Heavily copied from Wearsky/Finsky implementation
- */
-@TargetApi(Build.VERSION_CODES.LOLLIPOP)
-public class PackageInstallerImpl {
-    private static final String TAG = "PackageInstallerImpl";
-
-    /** Intent actions used for broadcasts from PackageInstaller back to the local receiver */
-    private static final String ACTION_INSTALL_COMMIT =
-            "com.android.vending.INTENT_PACKAGE_INSTALL_COMMIT";
-
-    private final Context mContext;
-    private final PackageInstaller mPackageInstaller;
-    private final Map<String, PackageInstaller.SessionInfo> mSessionInfoMap;
-    private final Map<String, PackageInstaller.Session> mOpenSessionMap;
-
-    public PackageInstallerImpl(Context context) {
-        mContext = context.getApplicationContext();
-        mPackageInstaller = mContext.getPackageManager().getPackageInstaller();
-
-        // Capture a map of known sessions
-        // This list will be pruned a bit later (stale sessions will be canceled)
-        mSessionInfoMap = new HashMap<String, PackageInstaller.SessionInfo>();
-        List<PackageInstaller.SessionInfo> mySessions = mPackageInstaller.getMySessions();
-        for (int i = 0; i < mySessions.size(); i++) {
-            PackageInstaller.SessionInfo sessionInfo = mySessions.get(i);
-            String packageName = sessionInfo.getAppPackageName();
-            PackageInstaller.SessionInfo oldInfo = mSessionInfoMap.put(packageName, sessionInfo);
-
-            // Checking for old info is strictly for logging purposes
-            if (oldInfo != null) {
-                Log.w(TAG, "Multiple sessions for " + packageName + " found. Removing " + oldInfo
-                        .getSessionId() + " & keeping " + mySessions.get(i).getSessionId());
-            }
-        }
-        mOpenSessionMap = new HashMap<String, PackageInstaller.Session>();
-    }
-
-    /**
-     * This callback will be made after an installation attempt succeeds or fails.
-     */
-    public interface InstallListener {
-        /**
-         * This callback signals that preflight checks have succeeded and installation
-         * is beginning.
-         */
-        void installBeginning();
-
-        /**
-         * This callback signals that installation has completed.
-         */
-        void installSucceeded();
-
-        /**
-         * This callback signals that installation has failed.
-         */
-        void installFailed(int errorCode, String errorDesc);
-    }
-
-    /**
-     * This is a placeholder implementation that bundles an entire "session" into a single
-     * call. This will be replaced by more granular versions that allow longer session lifetimes,
-     * download progress tracking, etc.
-     *
-     * This must not be called on main thread.
-     */
-    public void install(final String packageName, ParcelFileDescriptor parcelFileDescriptor,
-            final InstallListener callback) {
-        // 0. Generic try/catch block because I am not really sure what exceptions (other than
-        // IOException) might be thrown by PackageInstaller and I want to handle them
-        // at least slightly gracefully.
-        try {
-            // 1. Create or recover a session, and open it
-            // Try recovery first
-            PackageInstaller.Session session = null;
-            PackageInstaller.SessionInfo sessionInfo = mSessionInfoMap.get(packageName);
-            if (sessionInfo != null) {
-                // See if it's openable, or already held open
-                session = getSession(packageName);
-            }
-            // If open failed, or there was no session, create a new one and open it.
-            // If we cannot create or open here, the failure is terminal.
-            if (session == null) {
-                try {
-                    innerCreateSession(packageName);
-                } catch (IOException ioe) {
-                    Log.e(TAG, "Can't create session for " + packageName + ": " + ioe.getMessage());
-                    callback.installFailed(InstallerConstants.ERROR_INSTALL_CREATE_SESSION,
-                            "Could not create session");
-                    mSessionInfoMap.remove(packageName);
-                    return;
-                }
-                sessionInfo = mSessionInfoMap.get(packageName);
-                try {
-                    session = mPackageInstaller.openSession(sessionInfo.getSessionId());
-                    mOpenSessionMap.put(packageName, session);
-                } catch (SecurityException se) {
-                    Log.e(TAG, "Can't open session for " + packageName + ": " + se.getMessage());
-                    callback.installFailed(InstallerConstants.ERROR_INSTALL_OPEN_SESSION,
-                            "Can't open session");
-                    mSessionInfoMap.remove(packageName);
-                    return;
-                }
-            }
-
-            // 2. Launch task to handle file operations.
-            InstallTask task = new InstallTask( mContext, packageName, parcelFileDescriptor,
-                    callback, session,
-                    getCommitCallback(packageName, sessionInfo.getSessionId(), callback));
-            task.execute();
-            if (task.isError()) {
-                cancelSession(sessionInfo.getSessionId(), packageName);
-            }
-        } catch (Exception e) {
-            Log.e(TAG, "Unexpected exception while installing: " + packageName + ": "
-                    + e.getMessage());
-            callback.installFailed(InstallerConstants.ERROR_INSTALL_SESSION_EXCEPTION,
-                    "Unexpected exception while installing " + packageName);
-        }
-    }
-
-    /**
-     * Retrieve an existing session. Will open if needed, but does not attempt to create.
-     */
-    private PackageInstaller.Session getSession(String packageName) {
-        // Check for already-open session
-        PackageInstaller.Session session = mOpenSessionMap.get(packageName);
-        if (session != null) {
-            try {
-                // Probe the session to ensure that it's still open. This may or may not
-                // throw (if non-open), but it may serve as a canary for stale sessions.
-                session.getNames();
-                return session;
-            } catch (IOException ioe) {
-                Log.e(TAG, "Stale open session for " + packageName + ": " + ioe.getMessage());
-                mOpenSessionMap.remove(packageName);
-            } catch (SecurityException se) {
-                Log.e(TAG, "Stale open session for " + packageName + ": " + se.getMessage());
-                mOpenSessionMap.remove(packageName);
-            }
-        }
-        // Check to see if this is a known session
-        PackageInstaller.SessionInfo sessionInfo = mSessionInfoMap.get(packageName);
-        if (sessionInfo == null) {
-            return null;
-        }
-        // Try to open it. If we fail here, assume that the SessionInfo was stale.
-        try {
-            session = mPackageInstaller.openSession(sessionInfo.getSessionId());
-        } catch (SecurityException se) {
-            Log.w(TAG, "SessionInfo was stale for " + packageName + " - deleting info");
-            mSessionInfoMap.remove(packageName);
-            return null;
-        } catch (IOException ioe) {
-            Log.w(TAG, "IOException opening old session for " + ioe.getMessage()
-                    + " - deleting info");
-            mSessionInfoMap.remove(packageName);
-            return null;
-        }
-        mOpenSessionMap.put(packageName, session);
-        return session;
-    }
-
-    /** This version throws an IOException when the session cannot be created */
-    private void innerCreateSession(String packageName) throws IOException {
-        if (mSessionInfoMap.containsKey(packageName)) {
-            Log.w(TAG, "Creating session for " + packageName + " when one already exists");
-            return;
-        }
-        PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
-                PackageInstaller.SessionParams.MODE_FULL_INSTALL);
-        params.setAppPackageName(packageName);
-
-        // IOException may be thrown at this point
-        int sessionId = mPackageInstaller.createSession(params);
-        PackageInstaller.SessionInfo sessionInfo = mPackageInstaller.getSessionInfo(sessionId);
-        mSessionInfoMap.put(packageName, sessionInfo);
-    }
-
-    /**
-     * Cancel a session based on its sessionId. Package name is for logging only.
-     */
-    private void cancelSession(int sessionId, String packageName) {
-        // Close if currently held open
-        closeSession(packageName);
-        // Remove local record
-        mSessionInfoMap.remove(packageName);
-        try {
-            mPackageInstaller.abandonSession(sessionId);
-        } catch (SecurityException se) {
-            // The session no longer exists, so we can exit quietly.
-            return;
-        }
-    }
-
-    /**
-     * Close a session if it happens to be held open.
-     */
-    private void closeSession(String packageName) {
-        PackageInstaller.Session session = mOpenSessionMap.remove(packageName);
-        if (session != null) {
-            // Unfortunately close() is not idempotent. Try our best to make this safe.
-            try {
-                session.close();
-            } catch (Exception e) {
-                Log.w(TAG, "Unexpected error closing session for " + packageName + ": "
-                        + e.getMessage());
-            }
-        }
-    }
-
-    /**
-     * Creates a commit callback for the package install that's underway. This will be called
-     * some time after calling session.commit() (above).
-     */
-    private IntentSender getCommitCallback(final String packageName, final int sessionId,
-            final InstallListener callback) {
-        // Create a single-use broadcast receiver
-        BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                mContext.unregisterReceiver(this);
-                handleCommitCallback(intent, packageName, sessionId, callback);
-            }
-        };
-        // Create a matching intent-filter and register the receiver
-        String action = ACTION_INSTALL_COMMIT + "." + packageName;
-        IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(action);
-        mContext.registerReceiver(broadcastReceiver, intentFilter,
-                Context.RECEIVER_EXPORTED);
-
-        // Create a matching PendingIntent and use it to generate the IntentSender
-        Intent broadcastIntent = new Intent(action).setPackage(mContext.getPackageName());
-        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, packageName.hashCode(),
-                broadcastIntent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT
-                        | PendingIntent.FLAG_MUTABLE);
-        return pendingIntent.getIntentSender();
-    }
-
-    /**
-     * Examine the extras to determine information about the package update/install, decode
-     * the result, and call the appropriate callback.
-     *
-     * @param intent The intent, which the PackageInstaller will have added Extras to
-     * @param packageName The package name we created the receiver for
-     * @param sessionId The session Id we created the receiver for
-     * @param callback The callback to report success/failure to
-     */
-    private void handleCommitCallback(Intent intent, String packageName, int sessionId,
-            InstallListener callback) {
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Installation of " + packageName + " finished with extras "
-                    + intent.getExtras());
-        }
-        String statusMessage = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE);
-        int status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, Integer.MIN_VALUE);
-        if (status == PackageInstaller.STATUS_SUCCESS) {
-            cancelSession(sessionId, packageName);
-            callback.installSucceeded();
-        } else if (status == -1 /*PackageInstaller.STATUS_USER_ACTION_REQUIRED*/) {
-            // TODO - use the constant when the correct/final name is in the SDK
-            // TODO This is unexpected, so we are treating as failure for now
-            cancelSession(sessionId, packageName);
-            callback.installFailed(InstallerConstants.ERROR_INSTALL_USER_ACTION_REQUIRED,
-                    "Unexpected: user action required");
-        } else {
-            cancelSession(sessionId, packageName);
-            int errorCode = getPackageManagerErrorCode(status);
-            Log.e(TAG, "Error " + errorCode + " while installing " + packageName + ": "
-                    + statusMessage);
-            callback.installFailed(errorCode, null);
-        }
-    }
-
-    private int getPackageManagerErrorCode(int status) {
-        // This is a hack: because PackageInstaller now reports error codes
-        // with small positive values, we need to remap them into a space
-        // that is more compatible with the existing package manager error codes.
-        // See https://sites.google.com/a/google.com/universal-store/documentation
-        //       /android-client/download-error-codes
-        int errorCode;
-        if (status == Integer.MIN_VALUE) {
-            errorCode = InstallerConstants.ERROR_INSTALL_MALFORMED_BROADCAST;
-        } else {
-            errorCode = InstallerConstants.ERROR_PACKAGEINSTALLER_BASE - status;
-        }
-        return errorCode;
-    }
-}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageArgs.java b/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageArgs.java
deleted file mode 100644
index 2c289b2..0000000
--- a/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageArgs.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.packageinstaller.wear;
-
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-
-/**
- * Installation Util that contains a list of parameters that are needed for
- * installing/uninstalling.
- */
-public class WearPackageArgs {
-    private static final String KEY_PACKAGE_NAME =
-            "com.google.android.clockwork.EXTRA_PACKAGE_NAME";
-    private static final String KEY_ASSET_URI =
-            "com.google.android.clockwork.EXTRA_ASSET_URI";
-    private static final String KEY_START_ID =
-            "com.google.android.clockwork.EXTRA_START_ID";
-    private static final String KEY_PERM_URI =
-            "com.google.android.clockwork.EXTRA_PERM_URI";
-    private static final String KEY_CHECK_PERMS =
-            "com.google.android.clockwork.EXTRA_CHECK_PERMS";
-    private static final String KEY_SKIP_IF_SAME_VERSION =
-            "com.google.android.clockwork.EXTRA_SKIP_IF_SAME_VERSION";
-    private static final String KEY_COMPRESSION_ALG =
-            "com.google.android.clockwork.EXTRA_KEY_COMPRESSION_ALG";
-    private static final String KEY_COMPANION_SDK_VERSION =
-            "com.google.android.clockwork.EXTRA_KEY_COMPANION_SDK_VERSION";
-    private static final String KEY_COMPANION_DEVICE_VERSION =
-            "com.google.android.clockwork.EXTRA_KEY_COMPANION_DEVICE_VERSION";
-    private static final String KEY_SHOULD_CHECK_GMS_DEPENDENCY =
-            "com.google.android.clockwork.EXTRA_KEY_SHOULD_CHECK_GMS_DEPENDENCY";
-    private static final String KEY_SKIP_IF_LOWER_VERSION =
-            "com.google.android.clockwork.EXTRA_SKIP_IF_LOWER_VERSION";
-
-    public static String getPackageName(Bundle b) {
-        return b.getString(KEY_PACKAGE_NAME);
-    }
-
-    public static Bundle setPackageName(Bundle b, String packageName) {
-        b.putString(KEY_PACKAGE_NAME, packageName);
-        return b;
-    }
-
-    public static Uri getAssetUri(Bundle b) {
-        return b.getParcelable(KEY_ASSET_URI);
-    }
-
-    public static Uri getPermUri(Bundle b) {
-        return b.getParcelable(KEY_PERM_URI);
-    }
-
-    public static boolean checkPerms(Bundle b) {
-        return b.getBoolean(KEY_CHECK_PERMS);
-    }
-
-    public static boolean skipIfSameVersion(Bundle b) {
-        return b.getBoolean(KEY_SKIP_IF_SAME_VERSION);
-    }
-
-    public static int getCompanionSdkVersion(Bundle b) {
-        return b.getInt(KEY_COMPANION_SDK_VERSION);
-    }
-
-    public static int getCompanionDeviceVersion(Bundle b) {
-        return b.getInt(KEY_COMPANION_DEVICE_VERSION);
-    }
-
-    public static String getCompressionAlg(Bundle b) {
-        return b.getString(KEY_COMPRESSION_ALG);
-    }
-
-    public static int getStartId(Bundle b) {
-        return b.getInt(KEY_START_ID);
-    }
-
-    public static boolean skipIfLowerVersion(Bundle b) {
-        return b.getBoolean(KEY_SKIP_IF_LOWER_VERSION, false);
-    }
-
-    public static Bundle setStartId(Bundle b, int startId) {
-        b.putInt(KEY_START_ID, startId);
-        return b;
-    }
-}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageIconProvider.java b/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageIconProvider.java
deleted file mode 100644
index 02b9d29..0000000
--- a/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageIconProvider.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.packageinstaller.wear;
-
-import android.annotation.TargetApi;
-import android.app.ActivityManager;
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Binder;
-import android.os.Build;
-import android.os.ParcelFileDescriptor;
-import android.util.Log;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.List;
-
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-
-public class WearPackageIconProvider extends ContentProvider {
-    private static final String TAG = "WearPackageIconProvider";
-    public static final String AUTHORITY = "com.google.android.packageinstaller.wear.provider";
-
-    private static final String REQUIRED_PERMISSION =
-            "com.google.android.permission.INSTALL_WEARABLE_PACKAGES";
-
-    /** MIME types. */
-    public static final String ICON_TYPE = "vnd.android.cursor.item/cw_package_icon";
-
-    @Override
-    public boolean onCreate() {
-        return true;
-    }
-
-    @Override
-    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
-            String sortOrder) {
-        throw new UnsupportedOperationException("Query is not supported.");
-    }
-
-    @Override
-    public String getType(Uri uri) {
-        if (uri == null) {
-            throw new IllegalArgumentException("URI passed in is null.");
-        }
-
-        if (AUTHORITY.equals(uri.getEncodedAuthority())) {
-            return ICON_TYPE;
-        }
-        return null;
-    }
-
-    @Override
-    public Uri insert(Uri uri, ContentValues values) {
-        throw new UnsupportedOperationException("Insert is not supported.");
-    }
-
-    @Override
-    public int delete(Uri uri, String selection, String[] selectionArgs) {
-        if (uri == null) {
-            throw new IllegalArgumentException("URI passed in is null.");
-        }
-
-        enforcePermissions(uri);
-
-        if (ICON_TYPE.equals(getType(uri))) {
-            final File file = WearPackageUtil.getIconFile(
-                    this.getContext().getApplicationContext(), getPackageNameFromUri(uri));
-            if (file != null) {
-                file.delete();
-            }
-        }
-
-        return 0;
-    }
-
-    @Override
-    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-        throw new UnsupportedOperationException("Update is not supported.");
-    }
-
-    @Override
-    public ParcelFileDescriptor openFile(
-            Uri uri, @SuppressWarnings("unused") String mode) throws FileNotFoundException {
-        if (uri == null) {
-            throw new IllegalArgumentException("URI passed in is null.");
-        }
-
-        enforcePermissions(uri);
-
-        if (ICON_TYPE.equals(getType(uri))) {
-            final File file = WearPackageUtil.getIconFile(
-                    this.getContext().getApplicationContext(), getPackageNameFromUri(uri));
-            if (file != null) {
-                return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
-            }
-        }
-        return null;
-    }
-
-    public static Uri getUriForPackage(final String packageName) {
-        return Uri.parse("content://" + AUTHORITY + "/icons/" + packageName + ".icon");
-    }
-
-    private String getPackageNameFromUri(Uri uri) {
-        if (uri == null) {
-            return null;
-        }
-        List<String> pathSegments = uri.getPathSegments();
-        String packageName = pathSegments.get(pathSegments.size() - 1);
-
-        if (packageName.endsWith(".icon")) {
-            packageName = packageName.substring(0, packageName.lastIndexOf("."));
-        }
-        return packageName;
-    }
-
-    /**
-     * Make sure the calling app is either a system app or the same app or has the right permission.
-     * @throws SecurityException if the caller has insufficient permissions.
-     */
-    @TargetApi(Build.VERSION_CODES.BASE_1_1)
-    private void enforcePermissions(Uri uri) {
-        // Redo some of the permission check in {@link ContentProvider}. Just add an extra check to
-        // allow System process to access this provider.
-        Context context = getContext();
-        final int pid = Binder.getCallingPid();
-        final int uid = Binder.getCallingUid();
-        final int myUid = android.os.Process.myUid();
-
-        if (uid == myUid || isSystemApp(context, pid)) {
-            return;
-        }
-
-        if (context.checkPermission(REQUIRED_PERMISSION, pid, uid) == PERMISSION_GRANTED) {
-            return;
-        }
-
-        // last chance, check against any uri grants
-        if (context.checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_READ_URI_PERMISSION)
-                == PERMISSION_GRANTED) {
-            return;
-        }
-
-        throw new SecurityException("Permission Denial: reading "
-                + getClass().getName() + " uri " + uri + " from pid=" + pid
-                + ", uid=" + uid);
-    }
-
-    /**
-     * From the pid of the calling process, figure out whether this is a system app or not. We do
-     * this by checking the application information corresponding to the pid and then checking if
-     * FLAG_SYSTEM is set.
-     */
-    @TargetApi(Build.VERSION_CODES.CUPCAKE)
-    private boolean isSystemApp(Context context, int pid) {
-        // Get the Activity Manager Object
-        ActivityManager aManager =
-                (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
-        // Get the list of running Applications
-        List<ActivityManager.RunningAppProcessInfo> rapInfoList =
-                aManager.getRunningAppProcesses();
-        for (ActivityManager.RunningAppProcessInfo rapInfo : rapInfoList) {
-            if (rapInfo.pid == pid) {
-                try {
-                    PackageInfo pkgInfo = context.getPackageManager().getPackageInfo(
-                            rapInfo.pkgList[0], 0);
-                    if (pkgInfo != null && pkgInfo.applicationInfo != null &&
-                            (pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
-                        Log.d(TAG, pid + " is a system app.");
-                        return true;
-                    }
-                } catch (PackageManager.NameNotFoundException e) {
-                    Log.e(TAG, "Could not find package information.", e);
-                    return false;
-                }
-            }
-        }
-        return false;
-    }
-}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageInstallerService.java b/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageInstallerService.java
deleted file mode 100644
index ae0f4ec..0000000
--- a/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageInstallerService.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.packageinstaller.wear;
-
-import android.app.Notification;
-import android.app.NotificationChannel;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.FeatureInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageInstaller;
-import android.content.pm.PackageManager;
-import android.content.pm.VersionedPackage;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.ParcelFileDescriptor;
-import android.os.PowerManager;
-import android.os.Process;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.util.Pair;
-import androidx.annotation.Nullable;
-import com.android.packageinstaller.DeviceUtils;
-import com.android.packageinstaller.PackageUtil;
-import com.android.packageinstaller.R;
-import com.android.packageinstaller.common.EventResultPersister;
-import com.android.packageinstaller.common.UninstallEventReceiver;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Service that will install/uninstall packages. It will check for permissions and features as well.
- *
- * -----------
- *
- * Debugging information:
- *
- *  Install Action example:
- *  adb shell am startservice -a com.android.packageinstaller.wear.INSTALL_PACKAGE \
- *     -d package://com.google.android.gms \
- *     --eu com.google.android.clockwork.EXTRA_ASSET_URI content://com.google.android.clockwork.home.provider/host/com.google.android.wearable.app/wearable/com.google.android.gms/apk \
- *     --es android.intent.extra.INSTALLER_PACKAGE_NAME com.google.android.gms \
- *     --ez com.google.android.clockwork.EXTRA_CHECK_PERMS false \
- *     --eu com.google.android.clockwork.EXTRA_PERM_URI content://com.google.android.clockwork.home.provider/host/com.google.android.wearable.app/permissions \
- *     com.android.packageinstaller/com.android.packageinstaller.wear.WearPackageInstallerService
- *
- *  Uninstall Action example:
- *  adb shell am startservice -a com.android.packageinstaller.wear.UNINSTALL_PACKAGE \
- *     -d package://com.google.android.gms \
- *     com.android.packageinstaller/com.android.packageinstaller.wear.WearPackageInstallerService
- *
- *  Retry GMS:
- *  adb shell am startservice -a com.android.packageinstaller.wear.RETRY_GMS \
- *     com.android.packageinstaller/com.android.packageinstaller.wear.WearPackageInstallerService
- */
-public class WearPackageInstallerService extends Service
-        implements EventResultPersister.EventResultObserver {
-    private static final String TAG = "WearPkgInstallerService";
-
-    private static final String WEAR_APPS_CHANNEL = "wear_app_install_uninstall";
-    private static final String BROADCAST_ACTION =
-            "com.android.packageinstaller.ACTION_UNINSTALL_COMMIT";
-
-    private final int START_INSTALL = 1;
-    private final int START_UNINSTALL = 2;
-
-    private int mInstallNotificationId = 1;
-    private final Map<String, Integer> mNotifIdMap = new ArrayMap<>();
-    private final Map<Integer, UninstallParams> mServiceIdToParams = new HashMap<>();
-
-    private class UninstallParams {
-        public String mPackageName;
-        public PowerManager.WakeLock mLock;
-
-        UninstallParams(String packageName, PowerManager.WakeLock lock) {
-            mPackageName = packageName;
-            mLock = lock;
-        }
-    }
-
-    private final class ServiceHandler extends Handler {
-        public ServiceHandler(Looper looper) {
-            super(looper);
-        }
-
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case START_INSTALL:
-                    installPackage(msg.getData());
-                    break;
-                case START_UNINSTALL:
-                    uninstallPackage(msg.getData());
-                    break;
-            }
-        }
-    }
-    private ServiceHandler mServiceHandler;
-    private NotificationChannel mNotificationChannel;
-    private static volatile PowerManager.WakeLock lockStatic = null;
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return null;
-    }
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        HandlerThread thread = new HandlerThread("PackageInstallerThread",
-                Process.THREAD_PRIORITY_BACKGROUND);
-        thread.start();
-
-        mServiceHandler = new ServiceHandler(thread.getLooper());
-    }
-
-    @Override
-    public int onStartCommand(Intent intent, int flags, int startId) {
-        if (!DeviceUtils.isWear(this)) {
-            Log.w(TAG, "Not running on wearable.");
-            finishServiceEarly(startId);
-            return START_NOT_STICKY;
-        }
-
-        if (intent == null) {
-            Log.w(TAG, "Got null intent.");
-            finishServiceEarly(startId);
-            return START_NOT_STICKY;
-        }
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Got install/uninstall request " + intent);
-        }
-
-        Uri packageUri = intent.getData();
-        if (packageUri == null) {
-            Log.e(TAG, "No package URI in intent");
-            finishServiceEarly(startId);
-            return START_NOT_STICKY;
-        }
-
-        final String packageName = WearPackageUtil.getSanitizedPackageName(packageUri);
-        if (packageName == null) {
-            Log.e(TAG, "Invalid package name in URI (expected package:<pkgName>): " + packageUri);
-            finishServiceEarly(startId);
-            return START_NOT_STICKY;
-        }
-
-        PowerManager.WakeLock lock = getLock(this.getApplicationContext());
-        if (!lock.isHeld()) {
-            lock.acquire();
-        }
-
-        Bundle intentBundle = intent.getExtras();
-        if (intentBundle == null) {
-            intentBundle = new Bundle();
-        }
-        WearPackageArgs.setStartId(intentBundle, startId);
-        WearPackageArgs.setPackageName(intentBundle, packageName);
-        Message msg;
-        String notifTitle;
-        if (Intent.ACTION_INSTALL_PACKAGE.equals(intent.getAction())) {
-            msg = mServiceHandler.obtainMessage(START_INSTALL);
-            notifTitle = getString(R.string.installing);
-        } else if (Intent.ACTION_UNINSTALL_PACKAGE.equals(intent.getAction())) {
-            msg = mServiceHandler.obtainMessage(START_UNINSTALL);
-            notifTitle = getString(R.string.uninstalling);
-        } else {
-            Log.e(TAG, "Unknown action : " + intent.getAction());
-            finishServiceEarly(startId);
-            return START_NOT_STICKY;
-        }
-        Pair<Integer, Notification> notifPair = buildNotification(packageName, notifTitle);
-        startForeground(notifPair.first, notifPair.second);
-        msg.setData(intentBundle);
-        mServiceHandler.sendMessage(msg);
-        return START_NOT_STICKY;
-    }
-
-    private void installPackage(Bundle argsBundle) {
-        int startId = WearPackageArgs.getStartId(argsBundle);
-        final String packageName = WearPackageArgs.getPackageName(argsBundle);
-        final Uri assetUri = WearPackageArgs.getAssetUri(argsBundle);
-        final Uri permUri = WearPackageArgs.getPermUri(argsBundle);
-        boolean checkPerms = WearPackageArgs.checkPerms(argsBundle);
-        boolean skipIfSameVersion = WearPackageArgs.skipIfSameVersion(argsBundle);
-        int companionSdkVersion = WearPackageArgs.getCompanionSdkVersion(argsBundle);
-        int companionDeviceVersion = WearPackageArgs.getCompanionDeviceVersion(argsBundle);
-        String compressionAlg = WearPackageArgs.getCompressionAlg(argsBundle);
-        boolean skipIfLowerVersion = WearPackageArgs.skipIfLowerVersion(argsBundle);
-
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Installing package: " + packageName + ", assetUri: " + assetUri +
-                    ",permUri: " + permUri + ", startId: " + startId + ", checkPerms: " +
-                    checkPerms + ", skipIfSameVersion: " + skipIfSameVersion +
-                    ", compressionAlg: " + compressionAlg + ", companionSdkVersion: " +
-                    companionSdkVersion + ", companionDeviceVersion: " + companionDeviceVersion +
-                    ", skipIfLowerVersion: " + skipIfLowerVersion);
-        }
-        final PackageManager pm = getPackageManager();
-        File tempFile = null;
-        PowerManager.WakeLock lock = getLock(this.getApplicationContext());
-        boolean messageSent = false;
-        try {
-            PackageInfo existingPkgInfo = null;
-            try {
-                existingPkgInfo = pm.getPackageInfo(packageName,
-                        PackageManager.MATCH_ANY_USER | PackageManager.GET_PERMISSIONS);
-                if (existingPkgInfo != null) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Replacing package:" + packageName);
-                    }
-                }
-            } catch (PackageManager.NameNotFoundException e) {
-                // Ignore this exception. We could not find the package, will treat as a new
-                // installation.
-            }
-            // TODO(28021618): This was left as a temp file due to the fact that this code is being
-            //       deprecated and that we need the bare minimum to continue working moving forward
-            //       If this code is used as reference, this permission logic might want to be
-            //       reworked to use a stream instead of a file so that we don't need to write a
-            //       file at all.  Note that there might be some trickiness with opening a stream
-            //       for multiple users.
-            ParcelFileDescriptor parcelFd = getContentResolver()
-                    .openFileDescriptor(assetUri, "r");
-            tempFile = WearPackageUtil.getFileFromFd(WearPackageInstallerService.this,
-                    parcelFd, packageName, compressionAlg);
-            if (tempFile == null) {
-                Log.e(TAG, "Could not create a temp file from FD for " + packageName);
-                return;
-            }
-            PackageInfo pkgInfo = PackageUtil.getPackageInfo(this, tempFile,
-                    PackageManager.GET_PERMISSIONS | PackageManager.GET_CONFIGURATIONS);
-            if (pkgInfo == null) {
-                Log.e(TAG, "Could not parse apk information for " + packageName);
-                return;
-            }
-
-            if (!pkgInfo.packageName.equals(packageName)) {
-                Log.e(TAG, "Wearable Package Name has to match what is provided for " +
-                        packageName);
-                return;
-            }
-
-            ApplicationInfo appInfo = pkgInfo.applicationInfo;
-            appInfo.sourceDir = tempFile.getPath();
-            appInfo.publicSourceDir = tempFile.getPath();
-            getLabelAndUpdateNotification(packageName,
-                    getString(R.string.installing_app, appInfo.loadLabel(pm)));
-
-            List<String> wearablePerms = Arrays.asList(pkgInfo.requestedPermissions);
-
-            // Log if the installed pkg has a higher version number.
-            if (existingPkgInfo != null) {
-                long longVersionCode = pkgInfo.getLongVersionCode();
-                if (existingPkgInfo.getLongVersionCode() == longVersionCode) {
-                    if (skipIfSameVersion) {
-                        Log.w(TAG, "Version number (" + longVersionCode +
-                                ") of new app is equal to existing app for " + packageName +
-                                "; not installing due to versionCheck");
-                        return;
-                    } else {
-                        Log.w(TAG, "Version number of new app (" + longVersionCode +
-                                ") is equal to existing app for " + packageName);
-                    }
-                } else if (existingPkgInfo.getLongVersionCode() > longVersionCode) {
-                    if (skipIfLowerVersion) {
-                        // Starting in Feldspar, we are not going to allow downgrades of any app.
-                        Log.w(TAG, "Version number of new app (" + longVersionCode +
-                                ") is lower than existing app ( "
-                                + existingPkgInfo.getLongVersionCode() +
-                                ") for " + packageName + "; not installing due to versionCheck");
-                        return;
-                    } else {
-                        Log.w(TAG, "Version number of new app (" + longVersionCode +
-                                ") is lower than existing app ( "
-                                + existingPkgInfo.getLongVersionCode() + ") for " + packageName);
-                    }
-                }
-
-                // Following the Android Phone model, we should only check for permissions for any
-                // newly defined perms.
-                if (existingPkgInfo.requestedPermissions != null) {
-                    for (int i = 0; i < existingPkgInfo.requestedPermissions.length; ++i) {
-                        // If the permission is granted, then we will not ask to request it again.
-                        if ((existingPkgInfo.requestedPermissionsFlags[i] &
-                                PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) {
-                            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                                Log.d(TAG, existingPkgInfo.requestedPermissions[i] +
-                                        " is already granted for " + packageName);
-                            }
-                            wearablePerms.remove(existingPkgInfo.requestedPermissions[i]);
-                        }
-                    }
-                }
-            }
-
-            // Check that the wearable has all the features.
-            boolean hasAllFeatures = true;
-            for (FeatureInfo feature : pkgInfo.reqFeatures) {
-                if (feature.name != null && !pm.hasSystemFeature(feature.name) &&
-                        (feature.flags & FeatureInfo.FLAG_REQUIRED) != 0) {
-                    Log.e(TAG, "Wearable does not have required feature: " + feature +
-                            " for " + packageName);
-                    hasAllFeatures = false;
-                }
-            }
-
-            if (!hasAllFeatures) {
-                return;
-            }
-
-            // Check permissions on both the new wearable package and also on the already installed
-            // wearable package.
-            // If the app is targeting API level 23, we will also start a service in ClockworkHome
-            // which will ultimately prompt the user to accept/reject permissions.
-            if (checkPerms && !checkPermissions(pkgInfo, companionSdkVersion,
-                    companionDeviceVersion, permUri, wearablePerms, tempFile)) {
-                Log.w(TAG, "Wearable does not have enough permissions.");
-                return;
-            }
-
-            // Finally install the package.
-            ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(assetUri, "r");
-            PackageInstallerFactory.getPackageInstaller(this).install(packageName, fd,
-                    new PackageInstallListener(this, lock, startId, packageName));
-
-            messageSent = true;
-            Log.i(TAG, "Sent installation request for " + packageName);
-        } catch (FileNotFoundException e) {
-            Log.e(TAG, "Could not find the file with URI " + assetUri, e);
-        } finally {
-            if (!messageSent) {
-                // Some error happened. If the message has been sent, we can wait for the observer
-                // which will finish the service.
-                if (tempFile != null) {
-                    tempFile.delete();
-                }
-                finishService(lock, startId);
-            }
-        }
-    }
-
-    // TODO: This was left using the old PackageManager API due to the fact that this code is being
-    //       deprecated and that we need the bare minimum to continue working moving forward
-    //       If this code is used as reference, this logic should be reworked to use the new
-    //       PackageInstaller APIs similar to how installPackage was reworked
-    private void uninstallPackage(Bundle argsBundle) {
-        int startId = WearPackageArgs.getStartId(argsBundle);
-        final String packageName = WearPackageArgs.getPackageName(argsBundle);
-
-        PowerManager.WakeLock lock = getLock(this.getApplicationContext());
-
-        UninstallParams params = new UninstallParams(packageName, lock);
-        mServiceIdToParams.put(startId, params);
-
-        final PackageManager pm = getPackageManager();
-        try {
-            PackageInfo pkgInfo = pm.getPackageInfo(packageName, 0);
-            getLabelAndUpdateNotification(packageName,
-                    getString(R.string.uninstalling_app, pkgInfo.applicationInfo.loadLabel(pm)));
-
-            int uninstallId = UninstallEventReceiver.addObserver(this,
-                    EventResultPersister.GENERATE_NEW_ID, this);
-
-            Intent broadcastIntent = new Intent(BROADCAST_ACTION);
-            broadcastIntent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-            broadcastIntent.putExtra(EventResultPersister.EXTRA_ID, uninstallId);
-            broadcastIntent.putExtra(EventResultPersister.EXTRA_SERVICE_ID, startId);
-            broadcastIntent.setPackage(getPackageName());
-
-            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uninstallId,
-                    broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT
-                            | PendingIntent.FLAG_MUTABLE);
-
-            // Found package, send uninstall request.
-            pm.getPackageInstaller().uninstall(
-                    new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST),
-                    PackageManager.DELETE_ALL_USERS,
-                    pendingIntent.getIntentSender());
-
-            Log.i(TAG, "Sent delete request for " + packageName);
-        } catch (IllegalArgumentException | PackageManager.NameNotFoundException e) {
-            // Couldn't find the package, no need to call uninstall.
-            Log.w(TAG, "Could not find package, not deleting " + packageName, e);
-            finishService(lock, startId);
-        } catch (EventResultPersister.OutOfIdsException e) {
-            Log.e(TAG, "Fails to start uninstall", e);
-            finishService(lock, startId);
-        }
-    }
-
-    @Override
-    public void onResult(int status, int legacyStatus, @Nullable String message, int serviceId) {
-        if (mServiceIdToParams.containsKey(serviceId)) {
-            UninstallParams params = mServiceIdToParams.get(serviceId);
-            try {
-                if (status == PackageInstaller.STATUS_SUCCESS) {
-                    Log.i(TAG, "Package " + params.mPackageName + " was uninstalled.");
-                } else {
-                    Log.e(TAG, "Package uninstall failed " + params.mPackageName
-                            + ", returnCode " + legacyStatus);
-                }
-            } finally {
-                finishService(params.mLock, serviceId);
-            }
-        }
-    }
-
-    private boolean checkPermissions(PackageInfo pkgInfo, int companionSdkVersion,
-            int companionDeviceVersion, Uri permUri, List<String> wearablePermissions,
-            File apkFile) {
-        // Assumption: We are running on Android O.
-        // If the Phone App is targeting M, all permissions may not have been granted to the phone
-        // app. If the Wear App is then not targeting M, there may be permissions that are not
-        // granted on the Phone app (by the user) right now and we cannot just grant it for the Wear
-        // app.
-        if (pkgInfo.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.M) {
-            // Install the app if Wear App is ready for the new perms model.
-            return true;
-        }
-
-        if (!doesWearHaveUngrantedPerms(pkgInfo.packageName, permUri, wearablePermissions)) {
-            // All permissions requested by the watch are already granted on the phone, no need
-            // to do anything.
-            return true;
-        }
-
-        // Log an error if Wear is targeting < 23 and phone is targeting >= 23.
-        if (companionSdkVersion == 0 || companionSdkVersion >= Build.VERSION_CODES.M) {
-            Log.e(TAG, "MNC: Wear app's targetSdkVersion should be at least 23, if "
-                    + "phone app is targeting at least 23, will continue.");
-        }
-
-        return false;
-    }
-
-    /**
-     * Given a {@string packageName} corresponding to a phone app, query the provider for all the
-     * perms that are granted.
-     *
-     * @return true if the Wear App has any perms that have not been granted yet on the phone side.
-     * @return true if there is any error cases.
-     */
-    private boolean doesWearHaveUngrantedPerms(String packageName, Uri permUri,
-            List<String> wearablePermissions) {
-        if (permUri == null) {
-            Log.e(TAG, "Permission URI is null");
-            // Pretend there is an ungranted permission to avoid installing for error cases.
-            return true;
-        }
-        Cursor permCursor = getContentResolver().query(permUri, null, null, null, null);
-        if (permCursor == null) {
-            Log.e(TAG, "Could not get the cursor for the permissions");
-            // Pretend there is an ungranted permission to avoid installing for error cases.
-            return true;
-        }
-
-        Set<String> grantedPerms = new HashSet<>();
-        Set<String> ungrantedPerms = new HashSet<>();
-        while(permCursor.moveToNext()) {
-            // Make sure that the MatrixCursor returned by the ContentProvider has 2 columns and
-            // verify their types.
-            if (permCursor.getColumnCount() == 2
-                    && Cursor.FIELD_TYPE_STRING == permCursor.getType(0)
-                    && Cursor.FIELD_TYPE_INTEGER == permCursor.getType(1)) {
-                String perm = permCursor.getString(0);
-                Integer granted = permCursor.getInt(1);
-                if (granted == 1) {
-                    grantedPerms.add(perm);
-                } else {
-                    ungrantedPerms.add(perm);
-                }
-            }
-        }
-        permCursor.close();
-
-        boolean hasUngrantedPerm = false;
-        for (String wearablePerm : wearablePermissions) {
-            if (!grantedPerms.contains(wearablePerm)) {
-                hasUngrantedPerm = true;
-                if (!ungrantedPerms.contains(wearablePerm)) {
-                    // This is an error condition. This means that the wearable has permissions that
-                    // are not even declared in its host app. This is a developer error.
-                    Log.e(TAG, "Wearable " + packageName + " has a permission \"" + wearablePerm
-                            + "\" that is not defined in the host application's manifest.");
-                } else {
-                    Log.w(TAG, "Wearable " + packageName + " has a permission \"" + wearablePerm +
-                            "\" that is not granted in the host application.");
-                }
-            }
-        }
-        return hasUngrantedPerm;
-    }
-
-    /** Finishes the service after fulfilling obligation to call startForeground. */
-    private void finishServiceEarly(int startId) {
-        Pair<Integer, Notification> notifPair = buildNotification(
-                getApplicationContext().getPackageName(), "");
-        startForeground(notifPair.first, notifPair.second);
-        finishService(null, startId);
-    }
-
-    private void finishService(PowerManager.WakeLock lock, int startId) {
-        if (lock != null && lock.isHeld()) {
-            lock.release();
-        }
-        stopSelf(startId);
-    }
-
-    private synchronized PowerManager.WakeLock getLock(Context context) {
-        if (lockStatic == null) {
-            PowerManager mgr =
-                    (PowerManager) context.getSystemService(Context.POWER_SERVICE);
-            lockStatic = mgr.newWakeLock(
-                    PowerManager.PARTIAL_WAKE_LOCK, context.getClass().getSimpleName());
-            lockStatic.setReferenceCounted(true);
-        }
-        return lockStatic;
-    }
-
-    private class PackageInstallListener implements PackageInstallerImpl.InstallListener {
-        private Context mContext;
-        private PowerManager.WakeLock mWakeLock;
-        private int mStartId;
-        private String mApplicationPackageName;
-        private PackageInstallListener(Context context, PowerManager.WakeLock wakeLock,
-                int startId, String applicationPackageName) {
-            mContext = context;
-            mWakeLock = wakeLock;
-            mStartId = startId;
-            mApplicationPackageName = applicationPackageName;
-        }
-
-        @Override
-        public void installBeginning() {
-            Log.i(TAG, "Package " + mApplicationPackageName + " is being installed.");
-        }
-
-        @Override
-        public void installSucceeded() {
-            try {
-                Log.i(TAG, "Package " + mApplicationPackageName + " was installed.");
-
-                // Delete tempFile from the file system.
-                File tempFile = WearPackageUtil.getTemporaryFile(mContext, mApplicationPackageName);
-                if (tempFile != null) {
-                    tempFile.delete();
-                }
-            } finally {
-                finishService(mWakeLock, mStartId);
-            }
-        }
-
-        @Override
-        public void installFailed(int errorCode, String errorDesc) {
-            Log.e(TAG, "Package install failed " + mApplicationPackageName
-                    + ", errorCode " + errorCode);
-            finishService(mWakeLock, mStartId);
-        }
-    }
-
-    private synchronized Pair<Integer, Notification> buildNotification(final String packageName,
-            final String title) {
-        int notifId;
-        if (mNotifIdMap.containsKey(packageName)) {
-            notifId = mNotifIdMap.get(packageName);
-        } else {
-            notifId = mInstallNotificationId++;
-            mNotifIdMap.put(packageName, notifId);
-        }
-
-        if (mNotificationChannel == null) {
-            mNotificationChannel = new NotificationChannel(WEAR_APPS_CHANNEL,
-                    getString(R.string.wear_app_channel), NotificationManager.IMPORTANCE_MIN);
-            NotificationManager notificationManager = getSystemService(NotificationManager.class);
-            notificationManager.createNotificationChannel(mNotificationChannel);
-        }
-        return new Pair<>(notifId, new Notification.Builder(this, WEAR_APPS_CHANNEL)
-            .setSmallIcon(R.drawable.ic_file_download)
-            .setContentTitle(title)
-            .build());
-    }
-
-    private void getLabelAndUpdateNotification(String packageName, String title) {
-        // Update notification since we have a label now.
-        NotificationManager notificationManager = getSystemService(NotificationManager.class);
-        Pair<Integer, Notification> notifPair = buildNotification(packageName, title);
-        notificationManager.notify(notifPair.first, notifPair.second);
-    }
-}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageUtil.java b/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageUtil.java
deleted file mode 100644
index 6a9145d..0000000
--- a/packages/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageUtil.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.packageinstaller.wear;
-
-import android.content.Context;
-import android.net.Uri;
-import android.os.ParcelFileDescriptor;
-import android.system.ErrnoException;
-import android.system.Os;
-import android.text.TextUtils;
-import android.util.Log;
-
-import org.tukaani.xz.LZMAInputStream;
-import org.tukaani.xz.XZInputStream;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-public class WearPackageUtil {
-    private static final String TAG = "WearablePkgInstaller";
-
-    private static final String COMPRESSION_LZMA = "lzma";
-    private static final String COMPRESSION_XZ = "xz";
-
-    public static File getTemporaryFile(Context context, String packageName) {
-        try {
-            File newFileDir = new File(context.getFilesDir(), "tmp");
-            newFileDir.mkdirs();
-            Os.chmod(newFileDir.getAbsolutePath(), 0771);
-            File newFile = new File(newFileDir, packageName + ".apk");
-            return newFile;
-        }   catch (ErrnoException e) {
-            Log.e(TAG, "Failed to open.", e);
-            return null;
-        }
-    }
-
-    public static File getIconFile(final Context context, final String packageName) {
-        try {
-            File newFileDir = new File(context.getFilesDir(), "images/icons");
-            newFileDir.mkdirs();
-            Os.chmod(newFileDir.getAbsolutePath(), 0771);
-            return new File(newFileDir, packageName + ".icon");
-        }   catch (ErrnoException e) {
-            Log.e(TAG, "Failed to open.", e);
-            return null;
-        }
-    }
-
-    /**
-     * In order to make sure that the Wearable Asset Manager has a reasonable apk that can be used
-     * by the PackageManager, we will parse it before sending it to the PackageManager.
-     * Unfortunately, ParsingPackageUtils needs a file to parse. So, we have to temporarily convert
-     * the fd to a File.
-     *
-     * @param context
-     * @param fd FileDescriptor to convert to File
-     * @param packageName Name of package, will define the name of the file
-     * @param compressionAlg Can be null. For ALT mode the APK will be compressed. We will
-     *                       decompress it here
-     */
-    public static File getFileFromFd(Context context, ParcelFileDescriptor fd,
-            String packageName, String compressionAlg) {
-        File newFile = getTemporaryFile(context, packageName);
-        if (fd == null || fd.getFileDescriptor() == null)  {
-            return null;
-        }
-        InputStream fr = new ParcelFileDescriptor.AutoCloseInputStream(fd);
-        try {
-            if (TextUtils.equals(compressionAlg, COMPRESSION_XZ)) {
-                fr = new XZInputStream(fr);
-            } else if (TextUtils.equals(compressionAlg, COMPRESSION_LZMA)) {
-                fr = new LZMAInputStream(fr);
-            }
-        } catch (IOException e) {
-            Log.e(TAG, "Compression was set to " + compressionAlg + ", but could not decode ", e);
-            return null;
-        }
-
-        int nRead;
-        byte[] data = new byte[1024];
-        try {
-            final FileOutputStream fo = new FileOutputStream(newFile);
-            while ((nRead = fr.read(data, 0, data.length)) != -1) {
-                fo.write(data, 0, nRead);
-            }
-            fo.flush();
-            fo.close();
-            Os.chmod(newFile.getAbsolutePath(), 0644);
-            return newFile;
-        } catch (IOException e) {
-            Log.e(TAG, "Reading from Asset FD or writing to temp file failed ", e);
-            return null;
-        }   catch (ErrnoException e) {
-            Log.e(TAG, "Could not set permissions on file ", e);
-            return null;
-        } finally {
-            try {
-                fr.close();
-            } catch (IOException e) {
-                Log.e(TAG, "Failed to close the file from FD ", e);
-            }
-        }
-    }
-
-    /**
-     * @return com.google.com from expected formats like
-     * Uri: package:com.google.com, package:/com.google.com, package://com.google.com
-     */
-    public static String getSanitizedPackageName(Uri packageUri) {
-        String packageName = packageUri.getEncodedSchemeSpecificPart();
-        if (packageName != null) {
-            return packageName.replaceAll("^/+", "");
-        }
-        return packageName;
-    }
-}
diff --git a/packages/PrintSpooler/res/values-te/strings.xml b/packages/PrintSpooler/res/values-te/strings.xml
index ed0b6d4..18fdc73 100644
--- a/packages/PrintSpooler/res/values-te/strings.xml
+++ b/packages/PrintSpooler/res/values-te/strings.xml
@@ -31,7 +31,7 @@
     <string name="template_all_pages" msgid="3322235982020148762">"మొత్తం <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
     <string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> పరిధి"</string>
     <string name="pages_range_example" msgid="8558694453556945172">"ఉదా. 1—5,8,11—13"</string>
-    <string name="print_preview" msgid="8010217796057763343">"ముద్రణ ప్రివ్యూ"</string>
+    <string name="print_preview" msgid="8010217796057763343">"ప్రింట్ ప్రివ్యూ"</string>
     <string name="install_for_print_preview" msgid="6366303997385509332">"ప్రివ్యూ చేయడానికి PDF వ్యూయర్‌ను ఇన్‌స్టాల్ చేయండి"</string>
     <string name="printing_app_crashed" msgid="854477616686566398">"ముద్రణ యాప్ క్రాష్ అయ్యింది"</string>
     <string name="generating_print_job" msgid="3119608742651698916">"ముద్రణ జాబ్‌ను ఉత్పన్నం చేస్తోంది"</string>
diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp
index bd56aae..d6cbf2a 100644
--- a/packages/SettingsLib/Android.bp
+++ b/packages/SettingsLib/Android.bp
@@ -11,6 +11,7 @@
     name: "SettingsLib",
     defaults: [
         "SettingsLintDefaults",
+        "SettingsLibAvatarPickerDefaults",
     ],
 
     static_libs: [
@@ -21,7 +22,7 @@
         "guava",
 
         "WifiTrackerLibRes",
-        "iconloader",
+        "//frameworks/libs/systemui:iconloader",
         "setupdesign",
 
         "SettingsLibActionBarShadow",
@@ -87,6 +88,7 @@
 aconfig_declarations {
     name: "settingslib_media_flags",
     package: "com.android.settingslib.media.flags",
+    container: "system",
     srcs: [
         "aconfig/settingslib_media_flag_declarations.aconfig",
     ],
@@ -100,6 +102,7 @@
 aconfig_declarations {
     name: "settingslib_flags",
     package: "com.android.settingslib.flags",
+    container: "system",
     srcs: [
         "aconfig/settingslib.aconfig",
     ],
@@ -109,3 +112,32 @@
     name: "settingslib_flags_lib",
     aconfig_declarations: "settingslib_flags",
 }
+
+soong_config_module_type {
+    name: "avatar_picker_java_defaults",
+    module_type: "java_defaults",
+    config_namespace: "SettingsLib",
+    bool_variables: [
+        "legacy_avatar_picker_app_enabled",
+    ],
+    properties: [
+        "static_libs",
+        "manifest",
+    ],
+}
+
+soong_config_bool_variable {
+    name: "legacy_avatar_picker_app_enabled",
+}
+
+avatar_picker_java_defaults {
+    name: "SettingsLibAvatarPickerDefaults",
+    soong_config_variables: {
+        // If flag is enabled, add the library
+        legacy_avatar_picker_app_enabled: {
+            static_libs: [
+                "SettingsLibAvatarPicker",
+            ],
+        },
+    },
+}
diff --git a/packages/SettingsLib/AndroidManifest.xml b/packages/SettingsLib/AndroidManifest.xml
index 322d6cf..412ff29 100644
--- a/packages/SettingsLib/AndroidManifest.xml
+++ b/packages/SettingsLib/AndroidManifest.xml
@@ -21,9 +21,6 @@
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
 
     <application>
-        <activity
-            android:name="com.android.settingslib.users.AvatarPickerActivity"
-            android:theme="@style/SudThemeGlifV2.DayNight"/>
     </application>
 
 </manifest>
diff --git a/packages/SettingsLib/AvatarPicker/Android.bp b/packages/SettingsLib/AvatarPicker/Android.bp
new file mode 100644
index 0000000..1d42cd4
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/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: "SettingsLibAvatarPicker",
+    manifest: "AndroidManifest.xml",
+    use_resource_processor: true,
+    platform_apis: true,
+
+    defaults: [
+        "SettingsLintDefaults",
+    ],
+
+    static_libs: [
+        "SettingsLibSettingsTheme",
+        "setupdesign",
+        "guava",
+    ],
+
+    resource_dirs: ["res"],
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
+}
diff --git a/packages/SettingsLib/AvatarPicker/AndroidManifest.xml b/packages/SettingsLib/AvatarPicker/AndroidManifest.xml
new file mode 100644
index 0000000..73dd35b
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/AndroidManifest.xml
@@ -0,0 +1,32 @@
+<?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.avatarpicker">
+
+    <uses-sdk android:minSdkVersion="23" />
+    <application>
+        <activity
+            android:name=".AvatarPickerActivity"
+            android:theme="@style/SudThemeGlifV2.DayNight"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="com.android.avatarpicker.FULL_SCREEN_ACTIVITY" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/packages/SettingsLib/AvatarPicker/res/drawable/avatar_choose_photo_circled.xml b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_choose_photo_circled.xml
new file mode 100644
index 0000000..27bb87f
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_choose_photo_circled.xml
@@ -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.
+  -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape android:shape="oval">
+            <stroke
+                android:width="2dp"
+                android:color="?android:attr/colorPrimary" />
+        </shape>
+    </item>
+    <item
+        android:bottom="@dimen/avatar_picker_icon_inset"
+        android:drawable="@drawable/ic_avatar_choose_photo"
+        android:left="@dimen/avatar_picker_icon_inset"
+        android:right="@dimen/avatar_picker_icon_inset"
+        android:top="@dimen/avatar_picker_icon_inset" />
+</layer-list>
diff --git a/packages/SettingsLib/AvatarPicker/res/drawable/avatar_selector.xml b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_selector.xml
new file mode 100644
index 0000000..1fb521a
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_selector.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">
+    <item android:state_selected="true">
+        <shape android:shape="oval">
+            <stroke android:width="@dimen/avatar_picker_padding" android:color="?android:attr/colorPrimary" />
+        </shape>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/packages/SettingsLib/AvatarPicker/res/drawable/avatar_take_photo_circled.xml b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_take_photo_circled.xml
new file mode 100644
index 0000000..d678e9b
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_take_photo_circled.xml
@@ -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.
+  -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape android:shape="oval">
+            <stroke
+                android:width="2dp"
+                android:color="?android:attr/colorPrimary" />
+        </shape>
+    </item>
+    <item
+        android:bottom="@dimen/avatar_picker_icon_inset"
+        android:drawable="@drawable/ic_avatar_take_photo"
+        android:left="@dimen/avatar_picker_icon_inset"
+        android:right="@dimen/avatar_picker_icon_inset"
+        android:top="@dimen/avatar_picker_icon_inset" />
+</layer-list>
diff --git a/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle.xml b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle.xml
new file mode 100644
index 0000000..6421f91
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle.xml
@@ -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.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportHeight="24"
+    android:viewportWidth="24">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M5.85,17.1Q7.125,16.125 8.7,15.562Q10.275,15 12,15Q13.725,15 15.3,15.562Q16.875,16.125 18.15,17.1Q19.025,16.075 19.513,14.775Q20,13.475 20,12Q20,8.675 17.663,6.337Q15.325,4 12,4Q8.675,4 6.338,6.337Q4,8.675 4,12Q4,13.475 4.488,14.775Q4.975,16.075 5.85,17.1ZM12,13Q10.525,13 9.512,11.988Q8.5,10.975 8.5,9.5Q8.5,8.025 9.512,7.012Q10.525,6 12,6Q13.475,6 14.488,7.012Q15.5,8.025 15.5,9.5Q15.5,10.975 14.488,11.988Q13.475,13 12,13ZM12,22Q9.925,22 8.1,21.212Q6.275,20.425 4.925,19.075Q3.575,17.725 2.788,15.9Q2,14.075 2,12Q2,9.925 2.788,8.1Q3.575,6.275 4.925,4.925Q6.275,3.575 8.1,2.787Q9.925,2 12,2Q14.075,2 15.9,2.787Q17.725,3.575 19.075,4.925Q20.425,6.275 21.212,8.1Q22,9.925 22,12Q22,14.075 21.212,15.9Q20.425,17.725 19.075,19.075Q17.725,20.425 15.9,21.212Q14.075,22 12,22ZM12,20Q13.325,20 14.5,19.613Q15.675,19.225 16.65,18.5Q15.675,17.775 14.5,17.387Q13.325,17 12,17Q10.675,17 9.5,17.387Q8.325,17.775 7.35,18.5Q8.325,19.225 9.5,19.613Q10.675,20 12,20ZM12,11Q12.65,11 13.075,10.575Q13.5,10.15 13.5,9.5Q13.5,8.85 13.075,8.425Q12.65,8 12,8Q11.35,8 10.925,8.425Q10.5,8.85 10.5,9.5Q10.5,10.15 10.925,10.575Q11.35,11 12,11ZM12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5ZM12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Z" />
+</vector>
diff --git a/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_filled.xml b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_filled.xml
new file mode 100644
index 0000000..645fdf7
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_filled.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:viewportHeight="24"
+    android:viewportWidth="24">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM18.36,16.83c-1.43,-1.74 -4.9,-2.33 -6.36,-2.33s-4.93,0.59 -6.36,2.33A7.95,7.95 0,0 1,4 12c0,-4.41 3.59,-8 8,-8s8,3.59 8,8c0,1.82 -0.62,3.49 -1.64,4.83z" />
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M12,6c-1.94,0 -3.5,1.56 -3.5,3.5S10.06,13 12,13s3.5,-1.56 3.5,-3.5S13.94,6 12,6z" />
+</vector>
diff --git a/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_outline.xml b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_outline.xml
new file mode 100644
index 0000000..a5c1038
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_outline.xml
@@ -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.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportHeight="24"
+    android:viewportWidth="24">
+    <path
+        android:fillColor="?android:attr/colorPrimary"
+        android:pathData="M5.85,17.1q1.275,-0.975 2.85,-1.538Q10.275,15 12,15q1.725,0 3.3,0.563 1.575,0.562 2.85,1.537 0.875,-1.025 1.363,-2.325Q20,13.475 20,12q0,-3.325 -2.337,-5.662Q15.325,4 12,4T6.338,6.338Q4,8.675 4,12q0,1.475 0.487,2.775 0.488,1.3 1.363,2.325zM12,13q-1.475,0 -2.488,-1.012Q8.5,10.975 8.5,9.5t1.012,-2.487Q10.525,6 12,6t2.488,1.013Q15.5,8.024 15.5,9.5t-1.012,2.488Q13.475,13 12,13zM12,22q-2.075,0 -3.9,-0.788 -1.825,-0.787 -3.175,-2.137 -1.35,-1.35 -2.137,-3.175Q2,14.075 2,12t0.788,-3.9q0.787,-1.825 2.137,-3.175 1.35,-1.35 3.175,-2.137Q9.925,2 12,2t3.9,0.788q1.825,0.787 3.175,2.137 1.35,1.35 2.137,3.175Q22,9.925 22,12t-0.788,3.9q-0.787,1.825 -2.137,3.175 -1.35,1.35 -3.175,2.137Q14.075,22 12,22zM12,20q1.325,0 2.5,-0.387 1.175,-0.388 2.15,-1.113 -0.975,-0.725 -2.15,-1.113Q13.325,17 12,17t-2.5,0.387q-1.175,0.388 -2.15,1.113 0.975,0.725 2.15,1.113Q10.675,20 12,20zM12,11q0.65,0 1.075,-0.425 0.425,-0.425 0.425,-1.075 0,-0.65 -0.425,-1.075Q12.65,8 12,8q-0.65,0 -1.075,0.425Q10.5,8.85 10.5,9.5q0,0.65 0.425,1.075Q11.35,11 12,11zM12,9.5zM12,18.5z" />
+</vector>
+
diff --git a/packages/SettingsLib/AvatarPicker/res/layout/avatar_item.xml b/packages/SettingsLib/AvatarPicker/res/layout/avatar_item.xml
new file mode 100644
index 0000000..cc4e8a7
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/layout/avatar_item.xml
@@ -0,0 +1,23 @@
+<?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.
+  -->
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/avatar_image"
+    android:layout_width="@dimen/avatar_size_in_picker"
+    android:layout_height="@dimen/avatar_size_in_picker"
+    android:layout_gravity="center"
+    android:layout_margin="@dimen/avatar_picker_margin"
+    android:background="@drawable/avatar_selector"
+    android:padding="@dimen/avatar_picker_padding" />
diff --git a/packages/SettingsLib/AvatarPicker/res/layout/avatar_picker.xml b/packages/SettingsLib/AvatarPicker/res/layout/avatar_picker.xml
new file mode 100644
index 0000000..e9d375e
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/layout/avatar_picker.xml
@@ -0,0 +1,37 @@
+<?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.
+  -->
+<com.google.android.setupdesign.GlifLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/glif_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:icon="@drawable/ic_account_circle_outline"
+    app:sucHeaderText="@string/avatar_picker_title"
+    app:sucUsePartnerResource="true">
+
+    <LinearLayout
+        style="@style/SudContentFrame"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center_horizontal">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/avatar_grid"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+    </LinearLayout>
+
+</com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/AvatarPicker/res/values/arrays.xml b/packages/SettingsLib/AvatarPicker/res/values/arrays.xml
new file mode 100644
index 0000000..042bc41
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/values/arrays.xml
@@ -0,0 +1,27 @@
+<?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.
+
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <!-- Images offered as options in the avatar picker. If populated, the avatar_image_descriptions
+         array must also be populated with a content description for each image. -->
+    <array name="avatar_images" />
+
+    <!-- Content descriptions for each of the images in the avatar_images array. When overlaid
+         these values should be translated, but this empty array must not be translated or it may
+         replace the real descriptions with an empty array. -->
+    <string-array name="avatar_image_descriptions" translatable="false" />
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/AvatarPicker/res/values/dimens.xml b/packages/SettingsLib/AvatarPicker/res/values/dimens.xml
new file mode 100644
index 0000000..df54dc2
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/values/dimens.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
+  -->
+<resources>
+    <dimen name="avatar_size_in_picker">96dp</dimen>
+    <dimen name="avatar_picker_padding">6dp</dimen>
+    <dimen name="avatar_picker_margin">2dp</dimen>
+    <dimen name="avatar_picker_icon_inset">25dp</dimen>
+    <integer name="avatar_picker_columns">3</integer>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/AvatarPicker/res/values/strings.xml b/packages/SettingsLib/AvatarPicker/res/values/strings.xml
new file mode 100644
index 0000000..1ead128
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/values/strings.xml
@@ -0,0 +1,32 @@
+<?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">
+
+    <!-- An option in a photo selection dialog to choose a pre-existing image [CHAR LIMIT=50] -->
+    <string name="user_image_choose_photo">Choose an image</string>
+
+    <!-- An option in a photo selection dialog to take a new photo [CHAR LIMIT=50] -->
+    <string name="user_image_take_photo">Take a photo</string>
+
+    <!-- Title for a screen allowing the user to choose a profile picture. [CHAR LIMIT=NONE] -->
+    <string name="avatar_picker_title">Choose a profile picture</string>
+
+    <!-- Content description for a default user icon. [CHAR LIMIT=NONE] -->
+    <string name="default_user_icon_description">Default user icon</string>
+
+    <!-- Button label for generic Done action, to be pressed when an action has been completed [CHAR LIMIT=20] -->
+    <string name="done">Done</string>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/AvatarPicker/src/AvatarPhotoController.java b/packages/SettingsLib/AvatarPicker/src/AvatarPhotoController.java
new file mode 100644
index 0000000..c20392a
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/src/AvatarPhotoController.java
@@ -0,0 +1,400 @@
+/*
+ * 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.avatarpicker;
+
+import android.app.Activity;
+import android.content.ClipData;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.media.ExifInterface;
+import android.net.Uri;
+import android.os.StrictMode;
+import android.provider.MediaStore;
+import android.util.EventLog;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+import androidx.core.content.FileProvider;
+
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+
+import libcore.io.Streams;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+class AvatarPhotoController {
+
+    interface AvatarUi {
+        boolean isFinishing();
+
+        void returnUriResult(Uri uri);
+
+        void startActivityForResult(Intent intent, int resultCode);
+
+        boolean startSystemActivityForResult(Intent intent, int resultCode);
+
+        int getPhotoSize();
+    }
+
+    interface ContextInjector {
+        File getCacheDir();
+
+        Uri createTempImageUri(File parentDir, String fileName, boolean purge);
+
+        ContentResolver getContentResolver();
+
+        Context getContext();
+    }
+
+    private static final String TAG = "AvatarPhotoController";
+
+    static final int REQUEST_CODE_CHOOSE_PHOTO = 1001;
+    static final int REQUEST_CODE_TAKE_PHOTO = 1002;
+    static final int REQUEST_CODE_CROP_PHOTO = 1003;
+
+    /**
+     * Delay to allow the photo picker exit animation to complete before the crop activity opens.
+     */
+    private static final long DELAY_BEFORE_CROP_MILLIS = 150;
+
+    private static final String IMAGES_DIR = "multi_user";
+    private static final String PRE_CROP_PICTURE_FILE_NAME = "PreCropEditUserPhoto.jpg";
+    private static final String CROP_PICTURE_FILE_NAME = "CropEditUserPhoto.jpg";
+    private static final String TAKE_PICTURE_FILE_NAME = "TakeEditUserPhoto.jpg";
+
+    private final int mPhotoSize;
+
+    private final AvatarUi mAvatarUi;
+    private final ContextInjector mContextInjector;
+
+    private final File mImagesDir;
+    private final Uri mPreCropPictureUri;
+    private final Uri mCropPictureUri;
+    private final Uri mTakePictureUri;
+
+    AvatarPhotoController(AvatarUi avatarUi, ContextInjector contextInjector, boolean waiting) {
+        mAvatarUi = avatarUi;
+        mContextInjector = contextInjector;
+
+        mImagesDir = new File(mContextInjector.getCacheDir(), IMAGES_DIR);
+        mImagesDir.mkdir();
+        mPreCropPictureUri = mContextInjector
+                .createTempImageUri(mImagesDir, PRE_CROP_PICTURE_FILE_NAME, !waiting);
+        mCropPictureUri =
+                mContextInjector.createTempImageUri(mImagesDir, CROP_PICTURE_FILE_NAME, !waiting);
+        mTakePictureUri =
+                mContextInjector.createTempImageUri(mImagesDir, TAKE_PICTURE_FILE_NAME, !waiting);
+        mPhotoSize = mAvatarUi.getPhotoSize();
+    }
+
+    /**
+     * Handles activity result from containing activity/fragment after a take/choose/crop photo
+     * action result is received.
+     */
+    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (resultCode != Activity.RESULT_OK) {
+            return false;
+        }
+        final Uri pictureUri = data != null && data.getData() != null
+                ? data.getData() : mTakePictureUri;
+
+        // Check if the result is a content uri
+        if (!ContentResolver.SCHEME_CONTENT.equals(pictureUri.getScheme())) {
+            Log.e(TAG, "Invalid pictureUri scheme: " + pictureUri.getScheme());
+            EventLog.writeEvent(0x534e4554, "172939189", -1, pictureUri.getPath());
+            return false;
+        }
+
+        switch (requestCode) {
+            case REQUEST_CODE_CROP_PHOTO:
+                mAvatarUi.returnUriResult(pictureUri);
+                return true;
+            case REQUEST_CODE_TAKE_PHOTO:
+                if (mTakePictureUri.equals(pictureUri)) {
+                    cropPhoto(pictureUri);
+                } else {
+                    copyAndCropPhoto(pictureUri, false);
+                }
+                return true;
+            case REQUEST_CODE_CHOOSE_PHOTO:
+                copyAndCropPhoto(pictureUri, true);
+                return true;
+        }
+        return false;
+    }
+
+    void takePhoto() {
+        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE_SECURE);
+        appendOutputExtra(intent, mTakePictureUri);
+        mAvatarUi.startActivityForResult(intent, REQUEST_CODE_TAKE_PHOTO);
+    }
+
+    void choosePhoto() {
+        Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES, null);
+        intent.setType("image/*");
+        mAvatarUi.startActivityForResult(intent, REQUEST_CODE_CHOOSE_PHOTO);
+    }
+
+    private void copyAndCropPhoto(final Uri pictureUri, boolean delayBeforeCrop) {
+        ListenableFuture<Uri> future = ThreadUtils.getBackgroundExecutor().submit(() -> {
+            final ContentResolver cr = mContextInjector.getContentResolver();
+            try {
+                InputStream in = cr.openInputStream(pictureUri);
+                OutputStream out = cr.openOutputStream(mPreCropPictureUri);
+                Streams.copy(in, out);
+                return mPreCropPictureUri;
+            } catch (IOException e) {
+                Log.w(TAG, "Failed to copy photo", e);
+                return null;
+            }
+        });
+        Futures.addCallback(future, new FutureCallback<>() {
+            @Override
+            public void onSuccess(@Nullable Uri result) {
+                if (result == null) {
+                    return;
+                }
+                Runnable cropRunnable = () -> {
+                    if (!mAvatarUi.isFinishing()) {
+                        cropPhoto(mPreCropPictureUri);
+                    }
+                };
+                if (delayBeforeCrop) {
+                    mContextInjector.getContext().getMainThreadHandler()
+                            .postDelayed(cropRunnable, DELAY_BEFORE_CROP_MILLIS);
+                } else {
+                    cropRunnable.run();
+                }
+            }
+
+            @Override
+            public void onFailure(Throwable t) {
+                Log.e(TAG, "Error performing copy-and-crop", t);
+            }
+        }, mContextInjector.getContext().getMainExecutor());
+    }
+
+    private void cropPhoto(final Uri pictureUri) {
+        // TODO: Use a public intent, when there is one.
+        Intent intent = new Intent("com.android.camera.action.CROP");
+        intent.setDataAndType(pictureUri, "image/*");
+        appendOutputExtra(intent, mCropPictureUri);
+        appendCropExtras(intent);
+        try {
+            StrictMode.disableDeathOnFileUriExposure();
+            if (mAvatarUi.startSystemActivityForResult(intent, REQUEST_CODE_CROP_PHOTO)) {
+                return;
+            }
+        } finally {
+            StrictMode.enableDeathOnFileUriExposure();
+        }
+        onPhotoNotCropped(pictureUri);
+    }
+
+    private void appendOutputExtra(Intent intent, Uri pictureUri) {
+        intent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
+        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+                | Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        intent.setClipData(ClipData.newRawUri(MediaStore.EXTRA_OUTPUT, pictureUri));
+    }
+
+    private void appendCropExtras(Intent intent) {
+        intent.putExtra("crop", "true");
+        intent.putExtra("scale", true);
+        intent.putExtra("scaleUpIfNeeded", true);
+        intent.putExtra("aspectX", 1);
+        intent.putExtra("aspectY", 1);
+        intent.putExtra("outputX", mPhotoSize);
+        intent.putExtra("outputY", mPhotoSize);
+    }
+
+    private void onPhotoNotCropped(final Uri data) {
+        ListenableFuture<Bitmap> future = ThreadUtils.getBackgroundExecutor().submit(() -> {
+            // Scale and crop to a square aspect ratio
+            Bitmap croppedImage = Bitmap.createBitmap(mPhotoSize, mPhotoSize,
+                    Bitmap.Config.ARGB_8888);
+            Canvas canvas = new Canvas(croppedImage);
+            Bitmap fullImage;
+            try (InputStream imageStream = mContextInjector.getContentResolver()
+                    .openInputStream(data)) {
+                fullImage = BitmapFactory.decodeStream(imageStream);
+            }
+            if (fullImage == null) {
+                Log.e(TAG, "Image data could not be decoded");
+                return null;
+            }
+            int rotation = getRotation(data);
+            final int squareSize = Math.min(fullImage.getWidth(),
+                    fullImage.getHeight());
+            final int left = (fullImage.getWidth() - squareSize) / 2;
+            final int top = (fullImage.getHeight() - squareSize) / 2;
+
+            Matrix matrix = new Matrix();
+            RectF rectSource = new RectF(left, top,
+                    left + squareSize, top + squareSize);
+            RectF rectDest = new RectF(0, 0, mPhotoSize, mPhotoSize);
+            matrix.setRectToRect(rectSource, rectDest, Matrix.ScaleToFit.CENTER);
+            matrix.postRotate(rotation, mPhotoSize / 2f, mPhotoSize / 2f);
+            canvas.drawBitmap(fullImage, matrix, new Paint());
+            saveBitmapToFile(croppedImage, new File(mImagesDir, CROP_PICTURE_FILE_NAME));
+            return croppedImage;
+        });
+        Futures.addCallback(future, new FutureCallback<>() {
+            @Override
+            public void onSuccess(@Nullable Bitmap result) {
+                if (result != null) {
+                    mAvatarUi.returnUriResult(mCropPictureUri);
+                }
+            }
+
+            @Override
+            public void onFailure(Throwable t) {
+                Log.e(TAG, "Error performing internal crop", t);
+            }
+        }, mContextInjector.getContext().getMainExecutor());
+    }
+
+    /**
+     * Reads the image's exif data and determines the rotation degree needed to display the image
+     * in portrait mode.
+     */
+    private int getRotation(Uri selectedImage) {
+        int rotation = -1;
+        try {
+            InputStream imageStream =
+                    mContextInjector.getContentResolver().openInputStream(selectedImage);
+            ExifInterface exif = new ExifInterface(imageStream);
+            rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
+        } catch (IOException exception) {
+            Log.e(TAG, "Error while getting rotation", exception);
+        }
+
+        switch (rotation) {
+            case ExifInterface.ORIENTATION_ROTATE_90:
+                return 90;
+            case ExifInterface.ORIENTATION_ROTATE_180:
+                return 180;
+            case ExifInterface.ORIENTATION_ROTATE_270:
+                return 270;
+            default:
+                return 0;
+        }
+    }
+
+    private void saveBitmapToFile(Bitmap bitmap, File file) {
+        try {
+            OutputStream os = new FileOutputStream(file);
+            bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
+            os.flush();
+            os.close();
+        } catch (IOException e) {
+            Log.e(TAG, "Cannot create temp file", e);
+        }
+    }
+
+    static class AvatarUiImpl implements AvatarUi {
+        private final AvatarPickerActivity mActivity;
+
+        AvatarUiImpl(AvatarPickerActivity activity) {
+            mActivity = activity;
+        }
+
+        @Override
+        public boolean isFinishing() {
+            return mActivity.isFinishing() || mActivity.isDestroyed();
+        }
+
+        @Override
+        public void returnUriResult(Uri uri) {
+            mActivity.returnUriResult(uri);
+        }
+
+        @Override
+        public void startActivityForResult(Intent intent, int resultCode) {
+            mActivity.startActivityForResult(intent, resultCode);
+        }
+
+        @Override
+        public boolean startSystemActivityForResult(Intent intent, int code) {
+            List<ResolveInfo> resolveInfos = mActivity.getPackageManager()
+                    .queryIntentActivities(intent, PackageManager.MATCH_SYSTEM_ONLY);
+            if (resolveInfos.isEmpty()) {
+                Log.w(TAG, "No system package activity could be found for code " + code);
+                return false;
+            }
+            intent.setPackage(resolveInfos.get(0).activityInfo.packageName);
+            mActivity.startActivityForResult(intent, code);
+            return true;
+        }
+
+        @Override
+        public int getPhotoSize() {
+            return mActivity.getResources()
+                    .getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size);
+        }
+    }
+
+    static class ContextInjectorImpl implements ContextInjector {
+        private final Context mContext;
+        private final String mFileAuthority;
+
+        ContextInjectorImpl(Context context, String fileAuthority) {
+            mContext = context;
+            mFileAuthority = fileAuthority;
+        }
+
+        @Override
+        public File getCacheDir() {
+            return mContext.getCacheDir();
+        }
+
+        @Override
+        public Uri createTempImageUri(File parentDir, String fileName, boolean purge) {
+            final File fullPath = new File(parentDir, fileName);
+            if (purge) {
+                fullPath.delete();
+            }
+            return FileProvider.getUriForFile(mContext, mFileAuthority, fullPath);
+        }
+
+        @Override
+        public ContentResolver getContentResolver() {
+            return mContext.getContentResolver();
+        }
+
+        @Override
+        public Context getContext() {
+            return mContext;
+        }
+    }
+}
diff --git a/packages/SettingsLib/AvatarPicker/src/AvatarPickerActivity.java b/packages/SettingsLib/AvatarPicker/src/AvatarPickerActivity.java
new file mode 100644
index 0000000..de101b1
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/src/AvatarPickerActivity.java
@@ -0,0 +1,391 @@
+/*
+ * 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.avatarpicker;
+
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+import androidx.core.graphics.drawable.RoundedBitmapDrawable;
+import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.internal.util.UserIcons;
+
+import com.google.android.setupcompat.template.FooterBarMixin;
+import com.google.android.setupcompat.template.FooterButton;
+import com.google.android.setupdesign.GlifLayout;
+import com.google.android.setupdesign.util.ThemeHelper;
+import com.google.android.setupdesign.util.ThemeResolver;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Activity to allow the user to choose a user profile picture.
+ *
+ * <p>Options are provided to take a photo or choose a photo using the photo picker. In addition,
+ * preselected avatar images may be provided in the resource array {@code avatar_images}. If
+ * provided, every element of that array must be a bitmap drawable.
+ *
+ * <p>If preselected images are not provided, the default avatar will be shown instead, in a range
+ * of colors.
+ *
+ * <p>This activity should be started with startActivityForResult. If a photo or a preselected image
+ * is selected, a Uri will be returned in the data field of the result intent. If a colored default
+ * avatar is selected, the chosen color will be returned as {@code EXTRA_DEFAULT_ICON_TINT_COLOR}
+ * and the data field will be empty.
+ */
+public class AvatarPickerActivity extends Activity {
+
+    static final String EXTRA_FILE_AUTHORITY = "file_authority";
+    static final String EXTRA_DEFAULT_ICON_TINT_COLOR = "default_icon_tint_color";
+
+    private static final String KEY_AWAITING_RESULT = "awaiting_result";
+    private static final String KEY_SELECTED_POSITION = "selected_position";
+
+    private boolean mWaitingForActivityResult;
+
+    private FooterButton mDoneButton;
+    private AvatarAdapter mAdapter;
+
+    private AvatarPhotoController mAvatarPhotoController;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        boolean dayNightEnabled = ThemeHelper.isSetupWizardDayNightEnabled(this);
+        ThemeResolver themeResolver =
+                new ThemeResolver.Builder(ThemeResolver.getDefault())
+                        .setDefaultTheme(ThemeHelper.getSuwDefaultTheme(this))
+                        .setUseDayNight(true)
+                        .build();
+        int themeResId = themeResolver.resolve("", /* suppressDayNight= */ !dayNightEnabled);
+        setTheme(themeResId);
+        ThemeHelper.trySetDynamicColor(this);
+        setContentView(R.layout.avatar_picker);
+        setUpButtons();
+
+        RecyclerView recyclerView = findViewById(R.id.avatar_grid);
+        mAdapter = new AvatarAdapter();
+        recyclerView.setAdapter(mAdapter);
+        recyclerView.setLayoutManager(new GridLayoutManager(this,
+                getResources().getInteger(R.integer.avatar_picker_columns)));
+
+        restoreState(savedInstanceState);
+
+        mAvatarPhotoController = new AvatarPhotoController(
+                new AvatarPhotoController.AvatarUiImpl(this),
+                new AvatarPhotoController.ContextInjectorImpl(this, getFileAuthority()),
+                mWaitingForActivityResult);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mAdapter.onAdapterResume();
+    }
+
+    private void setUpButtons() {
+        GlifLayout glifLayout = findViewById(R.id.glif_layout);
+        FooterBarMixin mixin = glifLayout.getMixin(FooterBarMixin.class);
+
+        FooterButton secondaryButton =
+                new FooterButton.Builder(this)
+                        .setText(getString(android.R.string.cancel))
+                        .setListener(view -> cancel())
+                        .build();
+
+        mDoneButton =
+                new FooterButton.Builder(this)
+                        .setText(getString(R.string.done))
+                        .setListener(view -> mAdapter.returnSelectionResult())
+                        .build();
+        mDoneButton.setEnabled(false);
+
+        mixin.setSecondaryButton(secondaryButton);
+        mixin.setPrimaryButton(mDoneButton);
+    }
+
+    private String getFileAuthority() {
+        String authority = getIntent().getStringExtra(EXTRA_FILE_AUTHORITY);
+        if (authority == null) {
+            Log.e(this.getClass().getName(), "File authority must be provided");
+            finish();
+        }
+        return authority;
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        mWaitingForActivityResult = false;
+        mAvatarPhotoController.onActivityResult(requestCode, resultCode, data);
+    }
+
+    @Override
+    protected void onSaveInstanceState(@NonNull Bundle outState) {
+        outState.putBoolean(KEY_AWAITING_RESULT, mWaitingForActivityResult);
+        outState.putInt(KEY_SELECTED_POSITION, mAdapter.mSelectedPosition);
+        super.onSaveInstanceState(outState);
+    }
+
+    private void restoreState(Bundle savedInstanceState) {
+        if (savedInstanceState != null) {
+            mWaitingForActivityResult = savedInstanceState.getBoolean(KEY_AWAITING_RESULT, false);
+            mAdapter.mSelectedPosition =
+                    savedInstanceState.getInt(KEY_SELECTED_POSITION, AvatarAdapter.NONE);
+            mDoneButton.setEnabled(mAdapter.mSelectedPosition != AvatarAdapter.NONE);
+        }
+    }
+
+    @Override
+    public void startActivityForResult(Intent intent, int requestCode) {
+        mWaitingForActivityResult = true;
+        super.startActivityForResult(intent, requestCode);
+    }
+
+    void returnUriResult(Uri uri) {
+        Intent resultData = new Intent();
+        resultData.setData(uri);
+        setResult(RESULT_OK, resultData);
+        finish();
+    }
+
+    void returnColorResult(int color) {
+        Intent resultData = new Intent();
+        resultData.putExtra(EXTRA_DEFAULT_ICON_TINT_COLOR, color);
+        setResult(RESULT_OK, resultData);
+        finish();
+    }
+
+    private void cancel() {
+        setResult(RESULT_CANCELED);
+        finish();
+    }
+
+    private class AvatarAdapter extends RecyclerView.Adapter<AvatarViewHolder> {
+
+        private static final int NONE = -1;
+
+        private final int mTakePhotoPosition;
+        private final int mChoosePhotoPosition;
+        private final int mPreselectedImageStartPosition;
+
+        private final List<Drawable> mImageDrawables;
+        private final List<String> mImageDescriptions;
+        private final TypedArray mPreselectedImages;
+        private final int[] mUserIconColors;
+        private int mSelectedPosition = NONE;
+
+        private int mLastSelectedPosition = NONE;
+
+        AvatarAdapter() {
+            final boolean canTakePhoto =
+                    PhotoCapabilityUtils.canTakePhoto(AvatarPickerActivity.this);
+            final boolean canChoosePhoto =
+                    PhotoCapabilityUtils.canChoosePhoto(AvatarPickerActivity.this);
+            mTakePhotoPosition = (canTakePhoto ? 0 : NONE);
+            mChoosePhotoPosition = (canChoosePhoto ? (canTakePhoto ? 1 : 0) : NONE);
+            mPreselectedImageStartPosition = (canTakePhoto ? 1 : 0) + (canChoosePhoto ? 1 : 0);
+
+            mPreselectedImages = getResources().obtainTypedArray(R.array.avatar_images);
+            mUserIconColors = UserIcons.getUserIconColors(getResources());
+            mImageDrawables = buildDrawableList();
+            mImageDescriptions = buildDescriptionsList();
+        }
+
+        @NonNull
+        @Override
+        public AvatarViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) {
+            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
+            View itemView = layoutInflater.inflate(R.layout.avatar_item, parent, false);
+            return new AvatarViewHolder(itemView);
+        }
+
+        @Override
+        public void onBindViewHolder(@NonNull AvatarViewHolder viewHolder, int position) {
+            if (position == mTakePhotoPosition) {
+                viewHolder.setDrawable(getDrawable(R.drawable.avatar_take_photo_circled));
+                viewHolder.setContentDescription(getString(R.string.user_image_take_photo));
+
+            } else if (position == mChoosePhotoPosition) {
+                viewHolder.setDrawable(getDrawable(R.drawable.avatar_choose_photo_circled));
+                viewHolder.setContentDescription(getString(R.string.user_image_choose_photo));
+
+            } else if (position >= mPreselectedImageStartPosition) {
+                int index = indexFromPosition(position);
+                viewHolder.setSelected(position == mSelectedPosition);
+                viewHolder.setDrawable(mImageDrawables.get(index));
+                if (mImageDescriptions != null && index < mImageDescriptions.size()) {
+                    viewHolder.setContentDescription(mImageDescriptions.get(index));
+                } else {
+                    viewHolder.setContentDescription(getString(
+                            R.string.default_user_icon_description));
+                }
+            }
+            viewHolder.setClickListener(view -> onViewHolderSelected(position));
+        }
+
+        private void onViewHolderSelected(int position) {
+            if ((mTakePhotoPosition == position) && (mLastSelectedPosition != position)) {
+                mAvatarPhotoController.takePhoto();
+            } else if ((mChoosePhotoPosition == position) && (mLastSelectedPosition != position)) {
+                mAvatarPhotoController.choosePhoto();
+            } else {
+                if (mSelectedPosition == position) {
+                    deselect(position);
+                } else {
+                    select(position);
+                }
+            }
+            mLastSelectedPosition = position;
+        }
+
+        public void onAdapterResume() {
+            mLastSelectedPosition = NONE;
+        }
+
+        @Override
+        public int getItemCount() {
+            return mPreselectedImageStartPosition + mImageDrawables.size();
+        }
+
+        private List<Drawable> buildDrawableList() {
+            List<Drawable> result = new ArrayList<>();
+
+            for (int i = 0; i < mPreselectedImages.length(); i++) {
+                Drawable drawable = mPreselectedImages.getDrawable(i);
+                if (drawable instanceof BitmapDrawable) {
+                    result.add(circularDrawableFrom((BitmapDrawable) drawable));
+                } else {
+                    throw new IllegalStateException("Avatar drawables must be bitmaps");
+                }
+            }
+            if (!result.isEmpty()) {
+                return result;
+            }
+
+            // No preselected images. Use tinted default icon.
+            for (int i = 0; i < mUserIconColors.length; i++) {
+                result.add(UserIcons.getDefaultUserIconInColor(getResources(), mUserIconColors[i]));
+            }
+            return result;
+        }
+
+        private List<String> buildDescriptionsList() {
+            if (mPreselectedImages.length() > 0) {
+                return Arrays.asList(
+                        getResources().getStringArray(R.array.avatar_image_descriptions));
+            }
+
+            return null;
+        }
+
+        private Drawable circularDrawableFrom(BitmapDrawable drawable) {
+            Bitmap bitmap = drawable.getBitmap();
+
+            RoundedBitmapDrawable roundedBitmapDrawable =
+                    RoundedBitmapDrawableFactory.create(getResources(), bitmap);
+            roundedBitmapDrawable.setCircular(true);
+
+            return roundedBitmapDrawable;
+        }
+
+        private int indexFromPosition(int position) {
+            return position - mPreselectedImageStartPosition;
+        }
+
+        private void select(int position) {
+            final int oldSelection = mSelectedPosition;
+            mSelectedPosition = position;
+            notifyItemChanged(position);
+            if (oldSelection != NONE) {
+                notifyItemChanged(oldSelection);
+            } else {
+                mDoneButton.setEnabled(true);
+            }
+        }
+
+        private void deselect(int position) {
+            mSelectedPosition = NONE;
+            notifyItemChanged(position);
+            mDoneButton.setEnabled(false);
+        }
+
+        private void returnSelectionResult() {
+            int index = indexFromPosition(mSelectedPosition);
+            if (mPreselectedImages.length() > 0) {
+                int resourceId = mPreselectedImages.getResourceId(index, -1);
+                if (resourceId == -1) {
+                    throw new IllegalStateException("Preselected avatar images must be resources.");
+                }
+                returnUriResult(uriForResourceId(resourceId));
+            } else {
+                returnColorResult(
+                        mUserIconColors[index]);
+            }
+        }
+
+        private Uri uriForResourceId(int resourceId) {
+            return new Uri.Builder()
+                    .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
+                    .authority(getResources().getResourcePackageName(resourceId))
+                    .appendPath(getResources().getResourceTypeName(resourceId))
+                    .appendPath(getResources().getResourceEntryName(resourceId))
+                    .build();
+        }
+    }
+
+    private static class AvatarViewHolder extends RecyclerView.ViewHolder {
+        private final ImageView mImageView;
+
+        AvatarViewHolder(View view) {
+            super(view);
+            mImageView = view.findViewById(R.id.avatar_image);
+        }
+
+        public void setDrawable(Drawable drawable) {
+            mImageView.setImageDrawable(drawable);
+        }
+
+        public void setContentDescription(String desc) {
+            mImageView.setContentDescription(desc);
+        }
+
+        public void setClickListener(View.OnClickListener listener) {
+            mImageView.setOnClickListener(listener);
+        }
+
+        public void setSelected(boolean selected) {
+            mImageView.setSelected(selected);
+        }
+    }
+}
diff --git a/packages/SettingsLib/AvatarPicker/src/PhotoCapabilityUtils.java b/packages/SettingsLib/AvatarPicker/src/PhotoCapabilityUtils.java
new file mode 100644
index 0000000..43cb0f5
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/src/PhotoCapabilityUtils.java
@@ -0,0 +1,76 @@
+/*
+ * 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.avatarpicker;
+
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.provider.MediaStore;
+
+/**
+ * Utility class that contains helper methods to determine if the current user has permission and
+ * the device is in a proper state to start an activity for a given action.
+ */
+public class PhotoCapabilityUtils {
+
+    /**
+     * Check if the current user can perform any activity for
+     * android.media.action.IMAGE_CAPTURE action.
+     */
+    public static boolean canTakePhoto(Context context) {
+        return context.getPackageManager().queryIntentActivities(
+                new Intent(MediaStore.ACTION_IMAGE_CAPTURE),
+                PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
+    }
+
+    /**
+     * Check if the current user can perform any activity for
+     * ACTION_PICK_IMAGES action for images.
+     * Returns false if the device is currently locked and
+     * requires a PIN, pattern or password to unlock.
+     */
+    public static boolean canChoosePhoto(Context context) {
+        Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
+        intent.setType("image/*");
+        boolean canPerformActivityForGetImage =
+                context.getPackageManager().queryIntentActivities(intent, 0).size() > 0;
+        // on locked device we can't access the images
+        return canPerformActivityForGetImage && !isDeviceLocked(context);
+    }
+
+    /**
+     * Check if the current user can perform any activity for
+     * com.android.camera.action.CROP action for images.
+     * Returns false if the device is currently locked and
+     * requires a PIN, pattern or password to unlock.
+     */
+    public static boolean canCropPhoto(Context context) {
+        Intent intent = new Intent("com.android.camera.action.CROP");
+        intent.setType("image/*");
+        boolean canPerformActivityForCropping =
+                context.getPackageManager().queryIntentActivities(intent, 0).size() > 0;
+        // on locked device we can't start a cropping activity
+        return canPerformActivityForCropping && !isDeviceLocked(context);
+    }
+
+    private static boolean isDeviceLocked(Context context) {
+        KeyguardManager keyguardManager = context.getSystemService(KeyguardManager.class);
+        return keyguardManager == null || keyguardManager.isDeviceLocked();
+    }
+
+}
diff --git a/packages/SettingsLib/AvatarPicker/src/ThreadUtils.java b/packages/SettingsLib/AvatarPicker/src/ThreadUtils.java
new file mode 100644
index 0000000..dc19e66
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/src/ThreadUtils.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.avatarpicker;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executors;
+
+// copied from SettinsLib/utils
+public class ThreadUtils {
+
+    private static volatile Thread sMainThread;
+    private static volatile Handler sMainThreadHandler;
+    private static volatile ListeningExecutorService sListeningService;
+
+    /**
+     * Returns true if the current thread is the UI thread.
+     */
+    public static boolean isMainThread() {
+        if (sMainThread == null) {
+            sMainThread = Looper.getMainLooper().getThread();
+        }
+        return Thread.currentThread() == sMainThread;
+    }
+
+    /**
+     * Returns a shared UI thread handler.
+     */
+    @NonNull
+    public static Handler getUiThreadHandler() {
+        if (sMainThreadHandler == null) {
+            sMainThreadHandler = new Handler(Looper.getMainLooper());
+        }
+
+        return sMainThreadHandler;
+    }
+
+    /**
+     * Checks that the current thread is the UI thread. Otherwise throws an exception.
+     */
+    public static void ensureMainThread() {
+        if (!isMainThread()) {
+            throw new RuntimeException("Must be called on the UI thread");
+        }
+    }
+
+    /**
+     * Posts runnable in background using shared background thread pool.
+     *
+     * @return A future of the task that can be monitored for updates or cancelled.
+     */
+    @SuppressWarnings("rawtypes")
+    @NonNull
+    public static ListenableFuture postOnBackgroundThread(@NonNull Runnable runnable) {
+        return getBackgroundExecutor().submit(runnable);
+    }
+
+    /**
+     * Posts callable in background using shared background thread pool.
+     *
+     * @return A future of the task that can be monitored for updates or cancelled.
+     */
+    @NonNull
+    public static <T> ListenableFuture<T> postOnBackgroundThread(@NonNull Callable<T> callable) {
+        return getBackgroundExecutor().submit(callable);
+    }
+
+    /**
+     * Posts the runnable on the main thread.
+     *
+     * @deprecated moving work to the main thread should be done via the main executor provided to
+     * {@link com.google.common.util.concurrent.FutureCallback} via
+     * {@link android.content.Context#getMainExecutor()} or by calling an SDK method such as
+     * {@link android.app.Activity#runOnUiThread(Runnable)} or
+     * {@link android.content.Context#getMainThreadHandler()} where appropriate.
+     */
+    @Deprecated
+    public static void postOnMainThread(@NonNull Runnable runnable) {
+        getUiThreadHandler().post(runnable);
+    }
+
+    /**
+     * Provides a shared {@link ListeningExecutorService} created using a fixed thread pool executor
+     */
+    @NonNull
+    public static synchronized ListeningExecutorService getBackgroundExecutor() {
+        if (sListeningService == null) {
+            sListeningService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(
+                    Runtime.getRuntime().availableProcessors()));
+        }
+        return sListeningService;
+    }
+}
diff --git a/packages/SettingsLib/FooterPreference/res/drawable-v35/settingslib_ic_info_outline_24.xml b/packages/SettingsLib/FooterPreference/res/drawable-v35/settingslib_ic_info_outline_24.xml
new file mode 100644
index 0000000..c7fbb5f
--- /dev/null
+++ b/packages/SettingsLib/FooterPreference/res/drawable-v35/settingslib_ic_info_outline_24.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="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="@color/settingslib_materialColorOnSurfaceVariant"
+        android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z"/>
+</vector>
diff --git a/packages/SettingsLib/FooterPreference/res/layout-v35/preference_footer.xml b/packages/SettingsLib/FooterPreference/res/layout-v35/preference_footer.xml
new file mode 100644
index 0000000..a2b9648
--- /dev/null
+++ b/packages/SettingsLib/FooterPreference/res/layout-v35/preference_footer.xml
@@ -0,0 +1,74 @@
+<?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/listPreferredItemHeight"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:background="?android:attr/selectableItemBackground"
+    android:orientation="vertical"
+    android:clipToPadding="false">
+
+    <LinearLayout
+        android:id="@+id/icon_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:minWidth="56dp"
+        android:gravity="start|top"
+        android:orientation="horizontal"
+        android:paddingEnd="12dp"
+        android:paddingTop="16dp"
+        android:paddingBottom="4dp">
+        <ImageView
+            android:id="@android:id/icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+        <TextView
+            android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="start"
+            android:textAlignment="viewStart"
+            android:paddingTop="16dp"
+            android:paddingBottom="8dp"
+            android:textColor="@color/settingslib_materialColorOnSurfaceVariant"
+            android:hyphenationFrequency="normalFast"
+            android:lineBreakWordStyle="phrase"
+            android:ellipsize="marquee" />
+
+        <com.android.settingslib.widget.LinkTextView
+            android:id="@+id/settingslib_learn_more"
+            android:text="@string/settingslib_learn_more_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="start"
+            android:textAlignment="viewStart"
+            android:paddingBottom="8dp"
+            android:clickable="true"
+            android:visibility="gone" />
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/ProfileSelector/res/values-af/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-af/strings.xml
index 8055736..9b92007 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-af/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-af/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Persoonlik"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Werk"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privaat"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml
index 3b3f019..3dd41dae 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"የግል"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"ሥራ"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"የግል"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ar/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ar/strings.xml
index cae1f00..bef0caa 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ar/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ar/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"شخصي"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"للعمل"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"خاص"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-as/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-as/strings.xml
index 9ac55bbe..8a6d25a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-as/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-as/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"ব্যক্তিগত"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"কৰ্মস্থান"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"ব্যক্তিগত"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-az/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-az/strings.xml
index 5e9d3fb..6469f6f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-az/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-az/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Şəxsi"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"İş"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Şəxsi"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-b+sr+Latn/strings.xml
index 7f9cf21..4cc4c2c 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-b+sr+Latn/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Lično"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Posao"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privatno"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-be/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-be/strings.xml
index b7774de..e21f430 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-be/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-be/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Асабістыя"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Працоўныя"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Прыватнае"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-bg/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-bg/strings.xml
index f1ca6b2..38b596d 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-bg/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-bg/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Лични"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Служебни"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Частен"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-bn/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-bn/strings.xml
index 385a901..a6dba8a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-bn/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-bn/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"ব্যক্তিগত"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"অফিস"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"ব্যক্তিগত"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-bs/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-bs/strings.xml
index 19390c2..1afcbf0 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-bs/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-bs/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Lično"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Poslovno"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privatno"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ca/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ca/strings.xml
index 0190b91..89c6150 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ca/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ca/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Feina"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-cs/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-cs/strings.xml
index d5f920a..d50fc9a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-cs/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-cs/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Osobní"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Prácovní"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Soukromé"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-da/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-da/strings.xml
index 9d41b9c..2a6bdac 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-da/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-da/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personlig"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Arbejde"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-de/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-de/strings.xml
index d61ff96..bb9a6a9 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-de/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-de/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Privat"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Dienstlich"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-el/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-el/strings.xml
index 0832eab..628388d 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-el/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-el/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Προσωπικά"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Εργασία"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Ιδιωτικό"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-en-rAU/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-en-rAU/strings.xml
index 478e603..d67912f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-en-rAU/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Work"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Private"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-en-rCA/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-en-rCA/strings.xml
index 478e603..d67912f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-en-rCA/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Work"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Private"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-en-rGB/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-en-rGB/strings.xml
index 478e603..d67912f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-en-rGB/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Work"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Private"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-en-rIN/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-en-rIN/strings.xml
index 478e603..d67912f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-en-rIN/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Work"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Private"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-en-rXC/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-en-rXC/strings.xml
index 89b7183..187a4e7 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-en-rXC/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‎‏‏‎‎‏‏‎‎‎Personal‎‏‎‎‏‎"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‎‎‏‏‏‏‎‎‎‎‏‎‎‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‎‎‎Work‎‏‎‎‏‎"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‏‎‏‎‎Private‎‏‎‎‏‎"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-es-rUS/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-es-rUS/strings.xml
index b73026a..a76700a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-es-rUS/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Trabajo"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privado"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-es/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-es/strings.xml
index b73026a..a76700a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-es/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-es/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Trabajo"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privado"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-et/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-et/strings.xml
index e8fc44b..3328b47 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-et/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-et/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Isiklik"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Töö"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privaatne"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-eu/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-eu/strings.xml
index c22f4da..921874e 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-eu/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-eu/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Pertsonala"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Lanekoa"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Pribatua"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-fa/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-fa/strings.xml
index 6eaf057..07c0fac 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-fa/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-fa/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"شخصی"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"محل کار"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"خصوصی"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-fi/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-fi/strings.xml
index 8d0b9bf..df1db99 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-fi/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-fi/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Henkilökohtainen"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Työ"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Yksityinen"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-fr-rCA/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-fr-rCA/strings.xml
index 43e4a59..c9ba591 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-fr-rCA/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personnel"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Professionnel"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privé"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-fr/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-fr/strings.xml
index 43e4a59..c9ba591 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-fr/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-fr/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personnel"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Professionnel"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privé"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-gl/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-gl/strings.xml
index 364f15c..37759e7 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-gl/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-gl/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Persoal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Traballo"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privado"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-gu/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-gu/strings.xml
index 4aba6db..f495cde 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-gu/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-gu/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"વ્યક્તિગત"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"ઑફિસ"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"ખાનગી"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-hi/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-hi/strings.xml
index dc7818f..e55f48e 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-hi/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-hi/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"निजी ऐप्लिकेशन"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"वर्क"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"निजी"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-hr/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-hr/strings.xml
index cb434a8..1fd58cc 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-hr/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-hr/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Osobno"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Posao"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privatno"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-hu/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-hu/strings.xml
index 0127717..732527cb 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-hu/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-hu/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Személyes"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Munkahelyi"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privát"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-hy/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-hy/strings.xml
index 353a6d3..a36078c 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-hy/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-hy/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Անձնական"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Աշխատանքային"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Անձնական"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-in/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-in/strings.xml
index 173d56f..3859f87 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-in/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-in/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Pribadi"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Kerja"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Pribadi"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-is/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-is/strings.xml
index cc3bdd5..75668e8 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-is/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-is/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Persónulegt"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Vinna"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Lokað"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-it/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-it/strings.xml
index 1d1e70e..42dc312 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-it/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-it/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personale"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Lavoro"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privato"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-iw/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-iw/strings.xml
index 4245145..850c10c8 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-iw/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-iw/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"פרופיל אישי"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"פרופיל עבודה"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"פרטי"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ja/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ja/strings.xml
index f52d803..21419e6 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ja/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ja/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"個人用"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"仕事用"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"非公開"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ka/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ka/strings.xml
index e93adff..d6c2e6d 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ka/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ka/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"პირადი"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"სამსახური"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"პირადი"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-kk/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-kk/strings.xml
index 94eab4d..4741f21 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-kk/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-kk/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Жеке"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Жұмыс істейтін"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Жеке"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-km/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-km/strings.xml
index 40fe4ff..a8630695 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-km/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-km/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"ផ្ទាល់ខ្លួន"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"ការងារ"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"ឯកជន"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-kn/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-kn/strings.xml
index 41b70e8..7204586 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-kn/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-kn/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"ವೈಯಕ್ತಿಕ"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"ಕೆಲಸ"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"ಖಾಸಗಿ"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ko/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ko/strings.xml
index 3577efc..be305b1 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ko/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ko/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"개인"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"업무"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"비공개"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ky/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ky/strings.xml
index a65965c..4766066 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ky/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ky/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Жеке"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Жумуш"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Купуя"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-lo/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-lo/strings.xml
index 1e47347..2e199c4 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-lo/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-lo/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"ສ່ວນຕົວ"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"ບ່ອນເຮັດວຽກ"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"ສ່ວນຕົວ"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-lt/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-lt/strings.xml
index 3ea9004..6514c40 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-lt/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-lt/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Asmeninė"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Darbo"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privatus"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-lv/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-lv/strings.xml
index 528deeb..ffa9b81 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-lv/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-lv/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personīgais"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Darba"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privāts"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-mk/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-mk/strings.xml
index 773b3f1..07cf9c7 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-mk/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-mk/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Лични"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Работа"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Приватен"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ml/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ml/strings.xml
index 6ae94cc..0f8d8f0 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ml/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ml/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"വ്യക്തിപരം"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"ഔദ്യോഗികം"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"സ്വകാര്യം"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-mn/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-mn/strings.xml
index e2361b7..4bc230e 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-mn/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-mn/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Хувийн"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Ажил"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Хувийн"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-mr/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-mr/strings.xml
index 0a48d0f..0e412e0 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-mr/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-mr/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"वैयक्तिक"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"ऑफिस"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"खाजगी"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ms/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ms/strings.xml
index 607a290..e1145c3 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ms/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ms/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Peribadi"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Kerja"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Peribadi"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-my/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-my/strings.xml
index a6f8d23..060dc2e 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-my/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-my/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"ကိုယ်ရေးကိုယ်တာ"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"အလုပ်"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"သီးသန့်"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-nb/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-nb/strings.xml
index 0a6ff7d..a428099 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-nb/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-nb/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personlig"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Jobb"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ne/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ne/strings.xml
index 7c0d9e6..ca17836f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ne/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ne/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"व्यक्तिगत"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"कामसम्बन्धी"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"निजी"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-nl/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-nl/strings.xml
index 932057f..5ba850f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-nl/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-nl/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Persoonlijk"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Werk"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privé"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-or/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-or/strings.xml
index eea4177..fd2e491 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-or/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-or/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"ବ୍ୟକ୍ତିଗତ"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"ୱାର୍କ"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"ପ୍ରାଇଭେଟ"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-pa/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-pa/strings.xml
index 48d915e..025c1be 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-pa/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-pa/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"ਨਿੱਜੀ"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"ਕਾਰਜ"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"ਨਿੱਜੀ"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-pl/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-pl/strings.xml
index 8300df8..ac1f07b 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-pl/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-pl/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Osobiste"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Służbowe"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Prywatny"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-pt-rBR/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-pt-rBR/strings.xml
index 6e98dc9..eb33d57 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-pt-rBR/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Pessoal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Trabalho"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Particular"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-pt-rPT/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-pt-rPT/strings.xml
index a89bb04..f1ee0cd 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-pt-rPT/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Pessoal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Profissional"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privado"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-pt/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-pt/strings.xml
index 6e98dc9..eb33d57 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-pt/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-pt/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Pessoal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Trabalho"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Particular"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ro/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ro/strings.xml
index 317b4e3..1405b7d 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ro/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ro/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Serviciu"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ru/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ru/strings.xml
index 165fda1..ee4212f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ru/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ru/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Личный профиль"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Рабочий профиль"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Личное"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-si/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-si/strings.xml
index 746e6e7..c4425e7 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-si/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-si/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"පුද්ගලික"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"කාර්ය"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"පෞද්ගලික"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sk/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sk/strings.xml
index 5e882b5..da02fb9 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sk/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sk/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Osobné"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Pracovné"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Súkromné"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sl/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sl/strings.xml
index d239f44..93739db 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sl/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sl/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Osebno"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Delo"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Zasebno"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sq/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sq/strings.xml
index 84ce281..f69248e 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sq/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sq/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personale"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Puna"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sr/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sr/strings.xml
index 70b4793..9c5e09f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sr/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sr/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Лично"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Посао"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Приватно"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sv/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sv/strings.xml
index 8d1c657..8a570b2 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sv/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sv/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Privat"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Arbete"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sw/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sw/strings.xml
index 63d150c..acf0946 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sw/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sw/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Binafsi"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Kazini"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Faragha"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml
index ab360a9..e7e33d7 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"தனிப்பட்டவை"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"பணி"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"தனிப்பட்டவை"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-te/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-te/strings.xml
index 9a44dcf..3057a2a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-te/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-te/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"వ్యక్తిగతం"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"వర్క్"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"ప్రైవేట్"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-th/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-th/strings.xml
index f35e8fc..06b919bd 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-th/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-th/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"ส่วนตัว"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"งาน"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"ส่วนตัว"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-tl/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-tl/strings.xml
index 92b6f16..5a28b12 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-tl/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-tl/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Trabaho"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Pribado"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-tr/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-tr/strings.xml
index 680ebfe..59f21c8 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-tr/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-tr/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Kişisel"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"İş"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Gizli"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-uk/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-uk/strings.xml
index 953e72c..76ab328 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-uk/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-uk/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Особисті"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Робочі"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Приватний профіль"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ur/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ur/strings.xml
index 336a7e0..3b279bd 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ur/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ur/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"ذاتی"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"کام"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"نجی"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-uz/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-uz/strings.xml
index 5c1e4c0..50ccf1de 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-uz/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-uz/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Shaxsiy"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Ish"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Yopiq"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-vi/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-vi/strings.xml
index 7e04838..5f66706 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-vi/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-vi/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Cá nhân"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Công việc"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Riêng tư"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-zh-rCN/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-zh-rCN/strings.xml
index d5a1c03..1ea211b 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-zh-rCN/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"个人"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"工作"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"私密"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-zh-rHK/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-zh-rHK/strings.xml
index ec247c9..4da7cf5 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-zh-rHK/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"個人"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"工作"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"私人"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-zh-rTW/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-zh-rTW/strings.xml
index ec247c9..4da7cf5 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-zh-rTW/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"個人"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"工作"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"私人"</string>
 </resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-zu/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-zu/strings.xml
index c53aba8..ebf4f89 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-zu/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-zu/strings.xml
@@ -19,4 +19,5 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settingslib_category_personal" msgid="1142302328104700620">"Okomuntu siqu"</string>
     <string name="settingslib_category_work" msgid="4867750733682444676">"Umsebenzi"</string>
+    <string name="settingslib_category_private" msgid="5039276873477591386">"Okuyimfihlo"</string>
 </resources>
diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-ar/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-ar/strings.xml
index 42cf761..581b914 100644
--- a/packages/SettingsLib/RestrictedLockUtils/res/values-ar/strings.xml
+++ b/packages/SettingsLib/RestrictedLockUtils/res/values-ar/strings.xml
@@ -18,5 +18,5 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="enabled_by_admin" msgid="6630472777476410137">"يفعِّل المشرف هذا الإعداد."</string>
-    <string name="disabled_by_admin" msgid="4023569940620832713">"أوقف المشرف هذا الإعداد."</string>
+    <string name="disabled_by_admin" msgid="4023569940620832713">"أوقف المشرف هذا الإعداد"</string>
 </resources>
diff --git a/packages/SettingsLib/SearchWidget/res/values-or/strings.xml b/packages/SettingsLib/SearchWidget/res/values-or/strings.xml
index 4f92d02..07f090f 100644
--- a/packages/SettingsLib/SearchWidget/res/values-or/strings.xml
+++ b/packages/SettingsLib/SearchWidget/res/values-or/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">"ସେଟିଂସରେ ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
+    <string name="search_menu" msgid="1914043873178389845">"ସର୍ଚ୍ଚ ସେଟିଂସ"</string>
 </resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_arrow_drop_down.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_arrow_drop_down.xml
new file mode 100644
index 0000000..77979f0
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_arrow_drop_down.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:viewportWidth="18"
+        android:viewportHeight="18"
+        android:width="24dp"
+        android:height="24dp">
+    <path
+        android:pathData="M7 10l5 5 5 -5z"
+        android:fillColor="@color/settingslib_materialColorOnPrimaryContainer"/>
+</vector>
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_spinner_background.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_spinner_background.xml
new file mode 100644
index 0000000..20ee381
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_spinner_background.xml
@@ -0,0 +1,46 @@
+<?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="@color/settingslib_ripple_color">
+
+    <item android:id="@android:id/background">
+        <layer-list
+            android:paddingMode="stack"
+            android:paddingStart="0dp"
+            android:paddingEnd="24dp">
+            <item
+                android:top="8dp"
+                android:bottom="8dp">
+
+                <shape>
+                    <corners android:radius="28dp"/>
+                    <solid android:color="@color/settingslib_materialColorPrimaryContainer"/>
+                    <size android:height="@dimen/settingslib_spinner_height"/>
+                </shape>
+            </item>
+
+            <item
+                android:gravity="center|end"
+                android:width="18dp"
+                android:height="18dp"
+                android:end="12dp"
+                android:drawable="@drawable/settingslib_arrow_drop_down"/>
+        </layer-list>
+    </item>
+</ripple>
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_spinner_dropdown_background.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_spinner_dropdown_background.xml
new file mode 100644
index 0000000..b287c3b
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_spinner_dropdown_background.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.
+  -->
+
+<ripple
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="@color/settingslib_ripple_color">
+
+    <item android:id="@android:id/background">
+        <layer-list
+            android:paddingMode="stack"
+            android:paddingStart="0dp"
+            android:paddingEnd="12dp">
+
+            <item>
+                <shape>
+                    <corners android:radius="10dp"/>
+                    <solid android:color="@color/settingslib_materialColorSecondaryContainer"/>
+                </shape>
+            </item>
+        </layer-list>
+    </item>
+</ripple>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml
new file mode 100644
index 0000000..229d9e3
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml
@@ -0,0 +1,51 @@
+<?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_materialColorSurfaceContainerLowest">@android:color/system_surface_container_lowest_dark</color>
+    <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_on_secondary_container_dark</color>
+    <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_on_tertiary_container_dark</color>
+    <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_surface_container_low_dark</color>
+    <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_on_primary_container_dark</color>
+    <color name="settingslib_materialColorOnErrorContainer">@android:color/system_on_error_container_dark</color>
+    <color name="settingslib_materialColorOnSurfaceInverse">@android:color/system_on_surface_light</color>
+    <color name="settingslib_materialColorSecondaryContainer">@android:color/system_secondary_container_dark</color>
+    <color name="settingslib_materialColorErrorContainer">@android:color/system_error_container_dark</color>
+    <color name="settingslib_materialColorPrimaryInverse">@android:color/system_primary_light</color>
+    <color name="settingslib_materialColorSurfaceInverse">@android:color/system_surface_light</color>
+    <color name="settingslib_materialColorSurfaceVariant">@android:color/system_surface_variant_dark</color>
+    <color name="settingslib_materialColorTertiaryContainer">@android:color/system_tertiary_container_dark</color>
+    <color name="settingslib_materialColorPrimaryContainer">@android:color/system_primary_container_dark</color>
+    <color name="settingslib_materialColorOnBackground">@android:color/system_on_background_dark</color>
+    <color name="settingslib_materialColorOnSecondary">@android:color/system_on_secondary_dark</color>
+    <color name="settingslib_materialColorOnTertiary">@android:color/system_on_tertiary_dark</color>
+    <color name="settingslib_materialColorSurfaceDim">@android:color/system_surface_dim_dark</color>
+    <color name="settingslib_materialColorSurfaceBright">@android:color/system_surface_bright_dark</color>
+    <color name="settingslib_materialColorOnError">@android:color/system_on_error_dark</color>
+    <color name="settingslib_materialColorSurface">@android:color/system_surface_dark</color>
+    <color name="settingslib_materialColorSurfaceContainerHigh">@android:color/system_surface_container_high_dark</color>
+    <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_surface_container_highest_dark</color>
+    <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_on_surface_variant_dark</color>
+    <color name="settingslib_materialColorOutline">@android:color/system_outline_dark</color>
+    <color name="settingslib_materialColorOutlineVariant">@android:color/system_outline_variant_dark</color>
+    <color name="settingslib_materialColorOnPrimary">@android:color/system_on_primary_dark</color>
+    <color name="settingslib_materialColorOnSurface">@android:color/system_on_surface_dark</color>
+    <color name="settingslib_materialColorSurfaceContainer">@android:color/system_surface_container_dark</color>
+    <color name="settingslib_materialColorPrimary">@android:color/system_primary_dark</color>
+    <color name="settingslib_materialColorSecondary">@android:color/system_secondary_dark</color>
+    <color name="settingslib_materialColorTertiary">@android:color/system_tertiary_dark</color>
+</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml
new file mode 100644
index 0000000..2691344
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml
@@ -0,0 +1,69 @@
+<?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>
+    <!-- The text color of spinner title -->
+    <color name="settingslib_spinner_title_color">@color/settingslib_materialColorOnPrimaryContainer</color>
+    <!-- The text color of dropdown item title -->
+    <color name="settingslib_spinner_dropdown_color">@color/settingslib_materialColorOnPrimaryContainer</color>
+
+
+    <color name="settingslib_materialColorOnSecondaryFixedVariant">@android:color/system_on_secondary_fixed_variant</color>
+    <color name="settingslib_materialColorOnTertiaryFixedVariant">@android:color/system_on_tertiary_fixed_variant</color>
+    <color name="settingslib_materialColorSurfaceContainerLowest">@android:color/system_surface_container_lowest_light</color>
+    <color name="settingslib_materialColorOnPrimaryFixedVariant">@android:color/system_on_primary_fixed_variant</color>
+    <color name="settingslib_materialColorOnSecondaryContainer">@android:color/system_on_secondary_container_light</color>
+    <color name="settingslib_materialColorOnTertiaryContainer">@android:color/system_on_tertiary_container_light</color>
+    <color name="settingslib_materialColorSurfaceContainerLow">@android:color/system_surface_container_low_light</color>
+    <color name="settingslib_materialColorOnPrimaryContainer">@android:color/system_on_primary_container_light</color>
+    <color name="settingslib_materialColorSecondaryFixedDim">@android:color/system_secondary_fixed_dim</color>
+    <color name="settingslib_materialColorOnErrorContainer">@android:color/system_on_error_container_light</color>
+    <color name="settingslib_materialColorOnSecondaryFixed">@android:color/system_on_secondary_fixed</color>
+    <color name="settingslib_materialColorOnSurfaceInverse">@android:color/system_on_surface_dark</color>
+    <color name="settingslib_materialColorTertiaryFixedDim">@android:color/system_tertiary_fixed_dim</color>
+    <color name="settingslib_materialColorOnTertiaryFixed">@android:color/system_on_tertiary_fixed</color>
+    <color name="settingslib_materialColorPrimaryFixedDim">@android:color/system_primary_fixed_dim</color>
+    <color name="settingslib_materialColorSecondaryContainer">@android:color/system_secondary_container_light</color>
+    <color name="settingslib_materialColorErrorContainer">@android:color/system_error_container_light</color>
+    <color name="settingslib_materialColorOnPrimaryFixed">@android:color/system_on_primary_fixed</color>
+    <color name="settingslib_materialColorPrimaryInverse">@android:color/system_primary_dark</color>
+    <color name="settingslib_materialColorSecondaryFixed">@android:color/system_secondary_fixed</color>
+    <color name="settingslib_materialColorSurfaceInverse">@android:color/system_surface_dark</color>
+    <color name="settingslib_materialColorSurfaceVariant">@android:color/system_surface_variant_light</color>
+    <color name="settingslib_materialColorTertiaryContainer">@android:color/system_tertiary_container_light</color>
+    <color name="settingslib_materialColorTertiaryFixed">@android:color/system_tertiary_fixed</color>
+    <color name="settingslib_materialColorPrimaryContainer">@android:color/system_primary_container_light</color>
+    <color name="settingslib_materialColorOnBackground">@android:color/system_on_background_light</color>
+    <color name="settingslib_materialColorPrimaryFixed">@android:color/system_primary_fixed</color>
+    <color name="settingslib_materialColorOnSecondary">@android:color/system_on_secondary_light</color>
+    <color name="settingslib_materialColorOnTertiary">@android:color/system_on_tertiary_light</color>
+    <color name="settingslib_materialColorSurfaceDim">@android:color/system_surface_dim_light</color>
+    <color name="settingslib_materialColorSurfaceBright">@android:color/system_surface_bright_light</color>
+    <color name="settingslib_materialColorOnError">@android:color/system_on_error_light</color>
+    <color name="settingslib_materialColorSurface">@android:color/system_surface_light</color>
+    <color name="settingslib_materialColorSurfaceContainerHigh">@android:color/system_surface_container_high_light</color>
+    <color name="settingslib_materialColorSurfaceContainerHighest">@android:color/system_surface_container_highest_light</color>
+    <color name="settingslib_materialColorOnSurfaceVariant">@android:color/system_on_surface_variant_light</color>
+    <color name="settingslib_materialColorOutline">@android:color/system_outline_light</color>
+    <color name="settingslib_materialColorOutlineVariant">@android:color/system_outline_variant_light</color>
+    <color name="settingslib_materialColorOnPrimary">@android:color/system_on_primary_light</color>
+    <color name="settingslib_materialColorOnSurface">@android:color/system_on_surface_light</color>
+    <color name="settingslib_materialColorSurfaceContainer">@android:color/system_surface_container_light</color>
+    <color name="settingslib_materialColorPrimary">@android:color/system_primary_light</color>
+    <color name="settingslib_materialColorSecondary">@android:color/system_secondary_light</color>
+    <color name="settingslib_materialColorTertiary">@android:color/system_tertiary_light</color>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/styles.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/styles.xml
new file mode 100644
index 0000000..fff41c3
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/styles.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>
+    <style name="TextAppearance.TopIntroText"
+        parent="@android:style/TextAppearance.DeviceDefault">
+        <item name="android:textSize">14sp</item>
+        <item name="android:textColor">@color/settingslib_materialColorOnSurfaceVariant</item>
+    </style>
+
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/themes.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/themes.xml
new file mode 100644
index 0000000..01dfd7d
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/themes.xml
@@ -0,0 +1,31 @@
+<?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="Theme.SettingsBase" parent="Theme.SettingsBase_v31" >
+        <item name="android:spinnerStyle">@style/Spinner.SettingsLib</item>
+        <item name="android:spinnerItemStyle">@style/SpinnerItem.SettingsLib</item>
+        <item name="android:spinnerDropDownItemStyle">@style/SpinnerDropDownItem.SettingsLib</item>
+
+        <item name="android:colorAccent">@color/settingslib_materialColorPrimary</item>
+        <!-- component module background -->
+        <item name="android:colorBackground">@color/settingslib_materialColorSurfaceContainer</item>
+        <item name="android:textColorPrimary">@color/settingslib_materialColorOnSurface</item>
+        <item name="android:textColorSecondary">@color/settingslib_materialColorOnSurfaceVariant</item>
+        <item name="android:textColorTertiary">@color/settingslib_materialColorOutline</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/Spa/build.gradle.kts b/packages/SettingsLib/Spa/build.gradle.kts
index c755623..4147813 100644
--- a/packages/SettingsLib/Spa/build.gradle.kts
+++ b/packages/SettingsLib/Spa/build.gradle.kts
@@ -29,7 +29,7 @@
 
 allprojects {
     extra["androidTop"] = androidTop
-    extra["jetpackComposeVersion"] = "1.7.0-alpha04"
+    extra["jetpackComposeVersion"] = "1.7.0-alpha05"
 }
 
 subprojects {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsDropdownCheckBoxProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsDropdownCheckBoxProvider.kt
index 33ab75d..466ccf8 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsDropdownCheckBoxProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsDropdownCheckBoxProvider.kt
@@ -73,8 +73,8 @@
                 label = "With disabled item",
                 options = remember {
                     listOf(
-                        SettingsDropdownCheckOption("Item 1"),
-                        SettingsDropdownCheckOption("Item 2"),
+                        SettingsDropdownCheckOption("Enabled item 1"),
+                        SettingsDropdownCheckOption("Enabled item 2"),
                         SettingsDropdownCheckOption(
                             text = "Disabled item 1",
                             changeable = false,
@@ -101,8 +101,8 @@
                 remember {
                     listOf(
                         SettingsDropdownCheckOption("All", isSelectAll = true, changeable = false),
-                        SettingsDropdownCheckOption("Item 1"),
-                        SettingsDropdownCheckOption("Item 2"),
+                        SettingsDropdownCheckOption("Enabled item 1"),
+                        SettingsDropdownCheckOption("Enabled item 2"),
                         SettingsDropdownCheckOption(
                             text = "Disabled item 1",
                             changeable = false,
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/LoadingBarPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/LoadingBarPage.kt
deleted file mode 100644
index 247990c..0000000
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/LoadingBarPage.kt
+++ /dev/null
@@ -1,88 +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.foundation.layout.padding
-import androidx.compose.material3.Button
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-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.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.SettingsTheme
-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.CircularLoadingBar
-import com.android.settingslib.spa.widget.ui.LinearLoadingBar
-
-private const val TITLE = "Sample LoadingBar"
-
-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)
-                })
-            }
-    }
-
-    override fun getTitle(arguments: Bundle?): String {
-        return TITLE
-    }
-
-    @Composable
-    override fun Page(arguments: Bundle?) {
-        var loading by remember { mutableStateOf(true) }
-        RegularScaffold(title = getTitle(arguments)) {
-            Button(
-                onClick = { loading = !loading },
-                modifier = Modifier.padding(start = 20.dp)
-            ) {
-                if (loading) {
-                    Text(text = "Stop")
-                } else {
-                    Text(text = "Resume")
-                }
-            }
-        }
-
-        LinearLoadingBar(isLoading = loading, yOffset = 104.dp)
-        CircularLoadingBar(isLoading = loading)
-    }
-}
-
-@Preview(showBackground = true)
-@Composable
-private fun LoadingBarPagePreview() {
-    SettingsTheme {
-        LoadingBarPageProvider.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
new file mode 100644
index 0000000..f1cbc37
--- /dev/null
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/LoadingBarPageProvider.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.foundation.layout.Spacer
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.Button
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+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.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
+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.CircularLoadingBar
+import com.android.settingslib.spa.widget.ui.LinearLoadingBar
+
+private const val TITLE = "Sample LoadingBar"
+
+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)
+                })
+            }
+    }
+
+    override fun getTitle(arguments: Bundle?): String {
+        return TITLE
+    }
+
+    @Composable
+    override fun Page(arguments: Bundle?) {
+        var loading by remember { mutableStateOf(true) }
+        RegularScaffold(title = getTitle(arguments)) {
+            Button(
+                onClick = { loading = !loading },
+                modifier = Modifier.padding(start = 20.dp)
+            ) {
+                if (loading) {
+                    Text(text = "Stop")
+                } else {
+                    Text(text = "Resume")
+                }
+            }
+            Spacer(modifier = Modifier.height(SettingsDimension.itemPaddingVertical))
+            LinearLoadingBar(isLoading = loading)
+            Spacer(modifier = Modifier.height(SettingsDimension.itemPaddingVertical))
+            CircularLoadingBar(isLoading = loading)
+        }
+    }
+}
+
+@Preview(showBackground = true)
+@Composable
+private fun LoadingBarPagePreview() {
+    SettingsTheme {
+        LoadingBarPageProvider.Page(null)
+    }
+}
diff --git a/packages/SettingsLib/Spa/gradle/libs.versions.toml b/packages/SettingsLib/Spa/gradle/libs.versions.toml
index ff2a1e8..0ee9d59 100644
--- a/packages/SettingsLib/Spa/gradle/libs.versions.toml
+++ b/packages/SettingsLib/Spa/gradle/libs.versions.toml
@@ -15,11 +15,11 @@
 #
 
 [versions]
-agp = "8.3.0"
-compose-compiler = "1.5.10"
+agp = "8.3.1"
+compose-compiler = "1.5.11"
 dexmaker-mockito = "2.28.3"
 jvm = "17"
-kotlin = "1.9.22"
+kotlin = "1.9.23"
 truth = "1.1.5"
 
 [libraries]
diff --git a/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_landscape_mainSwitchPreference.png b/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_landscape_mainSwitchPreference.png
index 3e016f7..75c8e6e 100644
--- a/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_landscape_mainSwitchPreference.png
+++ b/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_landscape_mainSwitchPreference.png
Binary files differ
diff --git a/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_landscape_spinner.png b/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_landscape_spinner.png
index d156f95..06f0059 100644
--- a/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_landscape_spinner.png
+++ b/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_landscape_spinner.png
Binary files differ
diff --git a/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_mainSwitchPreference.png b/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_mainSwitchPreference.png
index b8bb25f..b72c8db 100644
--- a/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_mainSwitchPreference.png
+++ b/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_mainSwitchPreference.png
Binary files differ
diff --git a/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_spinner.png b/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_spinner.png
index d156f95..06f0059 100644
--- a/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_spinner.png
+++ b/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_spinner.png
Binary files differ
diff --git a/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_twoTargetSwitchPreference.png b/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_twoTargetSwitchPreference.png
index 9044208..e43f27d 100644
--- a/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_twoTargetSwitchPreference.png
+++ b/packages/SettingsLib/Spa/screenshot/robotests/assets/phone/light_portrait_twoTargetSwitchPreference.png
Binary files differ
diff --git a/packages/SettingsLib/Spa/screenshot/robotests/assets/tablet/dark_portrait_mainSwitchPreference.png b/packages/SettingsLib/Spa/screenshot/robotests/assets/tablet/dark_portrait_mainSwitchPreference.png
index 36cbadc..15c86dc 100644
--- a/packages/SettingsLib/Spa/screenshot/robotests/assets/tablet/dark_portrait_mainSwitchPreference.png
+++ b/packages/SettingsLib/Spa/screenshot/robotests/assets/tablet/dark_portrait_mainSwitchPreference.png
Binary files differ
diff --git a/packages/SettingsLib/Spa/screenshot/robotests/assets/tablet/dark_portrait_spinner.png b/packages/SettingsLib/Spa/screenshot/robotests/assets/tablet/dark_portrait_spinner.png
index a279481..5be3a21 100644
--- a/packages/SettingsLib/Spa/screenshot/robotests/assets/tablet/dark_portrait_spinner.png
+++ b/packages/SettingsLib/Spa/screenshot/robotests/assets/tablet/dark_portrait_spinner.png
Binary files differ
diff --git a/packages/SettingsLib/Spa/spa/build.gradle.kts b/packages/SettingsLib/Spa/spa/build.gradle.kts
index f2b9235..2f2ac24 100644
--- a/packages/SettingsLib/Spa/spa/build.gradle.kts
+++ b/packages/SettingsLib/Spa/spa/build.gradle.kts
@@ -57,13 +57,13 @@
     api("androidx.slice:slice-builders:1.1.0-alpha02")
     api("androidx.slice:slice-core:1.1.0-alpha02")
     api("androidx.slice:slice-view:1.1.0-alpha02")
-    api("androidx.compose.material3:material3:1.3.0-alpha02")
+    api("androidx.compose.material3:material3:1.3.0-alpha03")
     api("androidx.compose.material:material-icons-extended:$jetpackComposeVersion")
     api("androidx.compose.runtime:runtime-livedata:$jetpackComposeVersion")
     api("androidx.compose.ui:ui-tooling-preview:$jetpackComposeVersion")
     api("androidx.lifecycle:lifecycle-livedata-ktx")
     api("androidx.lifecycle:lifecycle-runtime-compose")
-    api("androidx.navigation:navigation-compose:2.8.0-alpha03")
+    api("androidx.navigation:navigation-compose:2.8.0-alpha05")
     api("com.github.PhilJay:MPAndroidChart:v3.1.0-alpha")
     api("com.google.android.material:material:1.7.0-alpha03")
     debugApi("androidx.compose.ui:ui-tooling:$jetpackComposeVersion")
diff --git a/packages/SettingsLib/Spa/spa/res/values/themes.xml b/packages/SettingsLib/Spa/spa/res/values/themes.xml
index b55dd1b..a6d8ca4 100644
--- a/packages/SettingsLib/Spa/spa/res/values/themes.xml
+++ b/packages/SettingsLib/Spa/spa/res/values/themes.xml
@@ -23,7 +23,10 @@
         <item name="android:windowNoTitle">true</item>
     </style>
 
-    <style name="Theme.SpaLib.Dialog" parent="Theme.Material3.DayNight.Dialog"/>
+    <style name="Theme.SpaLib.Dialog" parent="Theme.Material3.DayNight.Dialog">
+        <item name="android:windowBackground">@android:color/transparent</item>
+    </style>
+
     <style name="Theme.SpaLib.BottomSheetDialog" parent="Theme.SpaLib">
         <item name="android:windowBackground">@android:color/transparent</item>
         <item name="android:windowIsTranslucent">true</item>
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/SpaDialogWindowTypeActivity.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/SpaDialogWindowTypeActivity.kt
new file mode 100644
index 0000000..46975f5
--- /dev/null
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/SpaDialogWindowTypeActivity.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 com.android.settingslib.spa
+
+import android.content.Context
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.appcompat.app.AlertDialog
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.platform.ComposeView
+import com.android.settingslib.spa.framework.common.LogCategory
+import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
+import com.android.settingslib.spa.framework.theme.SettingsTheme
+
+/**
+ * Dialog activity when the dialog window type need to be override.
+ *
+ * Please use [SpaBaseDialogActivity] for all other use cases.
+ */
+abstract class SpaDialogWindowTypeActivity : ComponentActivity() {
+    private val spaEnvironment get() = SpaEnvironmentFactory.instance
+    private var dialog: AlertDialogWithType? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        spaEnvironment.logger.message(TAG, "onCreate", category = LogCategory.FRAMEWORK)
+
+        dialog = AlertDialogWithType(this).apply { show() }
+    }
+
+    override fun finish() {
+        dialog?.dismiss()
+        super.finish()
+    }
+
+    abstract val dialogWindowType: Int?
+
+    @Composable
+    abstract fun Content()
+
+    inner class AlertDialogWithType(context: Context) :
+        AlertDialog(context, R.style.Theme_SpaLib_Dialog) {
+
+        init {
+            setView(ComposeView(context).apply {
+                setContent {
+                    SettingsTheme {
+                        [email protected]()
+                    }
+                }
+            })
+            setOnDismissListener { finish() }
+        }
+
+        override fun onCreate(savedInstanceState: Bundle?) {
+            dialogWindowType?.let { window?.setType(it) }
+            super.onCreate(savedInstanceState)
+        }
+    }
+
+    companion object {
+        private const val TAG = "SpaBaseDialogActivity"
+    }
+}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsColors.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsColors.kt
index d72ec26..69aba71 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsColors.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsColors.kt
@@ -33,10 +33,6 @@
     val secondaryText: Color = Color.Unspecified,
     val primaryContainer: Color = Color.Unspecified,
     val onPrimaryContainer: Color = Color.Unspecified,
-    val spinnerHeaderContainer: Color = Color.Unspecified,
-    val onSpinnerHeaderContainer: Color = Color.Unspecified,
-    val spinnerItemContainer: Color = Color.Unspecified,
-    val onSpinnerItemContainer: Color = Color.Unspecified,
 )
 
 internal val LocalColorScheme = staticCompositionLocalOf { SettingsColorScheme() }
@@ -76,10 +72,6 @@
         secondaryText = tonalPalette.neutralVariant30,
         primaryContainer = tonalPalette.primary90,
         onPrimaryContainer = tonalPalette.neutral10,
-        spinnerHeaderContainer = tonalPalette.primary90,
-        onSpinnerHeaderContainer = tonalPalette.neutral10,
-        spinnerItemContainer = tonalPalette.secondary90,
-        onSpinnerItemContainer = tonalPalette.neutralVariant30,
     )
 }
 
@@ -103,10 +95,6 @@
         secondaryText = tonalPalette.neutralVariant80,
         primaryContainer = tonalPalette.secondary90,
         onPrimaryContainer = tonalPalette.neutral10,
-        spinnerHeaderContainer = tonalPalette.primary90,
-        onSpinnerHeaderContainer = tonalPalette.neutral10,
-        spinnerItemContainer = tonalPalette.secondary90,
-        onSpinnerItemContainer = tonalPalette.neutralVariant30,
     )
 }
 
@@ -121,10 +109,6 @@
         secondaryText = tonalPalette.neutralVariant80,
         primaryContainer = tonalPalette.secondary90,
         onPrimaryContainer = tonalPalette.neutral10,
-        spinnerHeaderContainer = tonalPalette.primary90,
-        onSpinnerHeaderContainer = tonalPalette.neutral10,
-        spinnerItemContainer = tonalPalette.secondary90,
-        onSpinnerItemContainer = tonalPalette.neutralVariant30,
     )
 }
 
@@ -139,9 +123,5 @@
         secondaryText = tonalPalette.neutralVariant30,
         primaryContainer = tonalPalette.primary90,
         onPrimaryContainer = tonalPalette.neutral10,
-        spinnerHeaderContainer = tonalPalette.primary90,
-        onSpinnerHeaderContainer = tonalPalette.neutral10,
-        spinnerItemContainer = tonalPalette.secondary90,
-        onSpinnerItemContainer = tonalPalette.neutralVariant30,
     )
 }
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/dialog/SettingsAlertDialogWithIcon.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/dialog/SettingsAlertDialogWithIcon.kt
index 1695e4f..030522d 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/dialog/SettingsAlertDialogWithIcon.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/dialog/SettingsAlertDialogWithIcon.kt
@@ -39,11 +39,17 @@
     confirmButton: AlertDialogButton?,
     dismissButton: AlertDialogButton?,
     title: String?,
+    icon: @Composable (() -> Unit)? = {
+        Icon(
+            Icons.Default.WarningAmber,
+            contentDescription = null
+        )
+    },
     text: @Composable (() -> Unit)?,
 ) {
     AlertDialog(
         onDismissRequest = onDismissRequest,
-        icon = { Icon(Icons.Default.WarningAmber, contentDescription = null) },
+        icon = icon,
         modifier = Modifier.width(getDialogWidth()),
         confirmButton = {
             confirmButton?.let {
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/dialog/SettingsAlterDialogContent.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/dialog/SettingsAlterDialogContent.kt
new file mode 100644
index 0000000..bef0bca
--- /dev/null
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/dialog/SettingsAlterDialogContent.kt
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.widget.dialog
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.WarningAmber
+import androidx.compose.material3.AlertDialogDefaults
+import androidx.compose.material3.Button
+import androidx.compose.material3.Icon
+import androidx.compose.material3.LocalContentColor
+import androidx.compose.material3.LocalTextStyle
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.OutlinedButton
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.Placeable
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastForEachIndexed
+import com.android.settingslib.spa.framework.theme.SettingsShape
+import kotlin.math.max
+
+@Composable
+fun SettingsAlertDialogContent(
+    confirmButton: AlertDialogButton?,
+    dismissButton: AlertDialogButton?,
+    title: String?,
+    icon: @Composable (() -> Unit)? = {
+        Icon(
+            Icons.Default.WarningAmber,
+            contentDescription = null
+        )
+    },
+    text: @Composable (() -> Unit)?,
+) {
+    SettingsAlertDialogContent(
+        buttons = {
+            AlertDialogFlowRow(
+                mainAxisSpacing = ButtonsMainAxisSpacing,
+                crossAxisSpacing = ButtonsCrossAxisSpacing
+            ) {
+                dismissButton?.let {
+                    OutlinedButton(onClick = it.onClick) {
+                        Text(it.text)
+                    }
+                }
+                confirmButton?.let {
+                    Button(
+                        onClick = {
+                            it.onClick()
+                        },
+                    ) {
+                        Text(it.text)
+                    }
+                }
+            }
+        },
+        icon = icon,
+        modifier = Modifier.width(getDialogWidth()),
+        title = title?.let {
+            {
+                Text(
+                    it,
+                    modifier = Modifier.fillMaxWidth(),
+                    textAlign = TextAlign.Center
+                )
+            }
+        },
+        text = text?.let {
+            {
+                Column(Modifier.verticalScroll(rememberScrollState())) {
+                    text()
+                }
+            }
+        },
+    )
+}
+
+@Composable
+internal fun SettingsAlertDialogContent(
+    buttons: @Composable () -> Unit,
+    modifier: Modifier = Modifier,
+    icon: (@Composable () -> Unit)?,
+    title: (@Composable () -> Unit)?,
+    text: @Composable (() -> Unit)?,
+) {
+    Surface(
+        modifier = modifier,
+        shape = SettingsShape.CornerExtraLarge,
+        color = MaterialTheme.colorScheme.surfaceContainerHigh,
+    ) {
+        Column(
+            modifier = Modifier.padding(DialogPadding)
+        ) {
+            icon?.let {
+                CompositionLocalProvider(
+                    LocalContentColor provides AlertDialogDefaults.iconContentColor,
+                ) {
+                    Box(
+                        Modifier
+                            .padding(IconPadding)
+                            .align(Alignment.CenterHorizontally)
+                    ) {
+                        icon()
+                    }
+                }
+            }
+            title?.let {
+                ProvideContentColorTextStyle(
+                    contentColor = AlertDialogDefaults.titleContentColor,
+                    textStyle = MaterialTheme.typography.headlineSmall,
+                ) {
+                    Box(
+                        // Align the title to the center when an icon is present.
+                        Modifier
+                            .padding(TitlePadding)
+                            .align(
+                                if (icon == null) {
+                                    Alignment.Start
+                                } else {
+                                    Alignment.CenterHorizontally
+                                }
+                            )
+                    ) {
+                        title()
+                    }
+                }
+            }
+            text?.let {
+                ProvideContentColorTextStyle(
+                    contentColor = AlertDialogDefaults.textContentColor,
+                    textStyle = MaterialTheme.typography.bodyMedium
+                ) {
+                    Box(
+                        Modifier
+                            .weight(weight = 1f, fill = false)
+                            .padding(TextPadding)
+                            .align(Alignment.Start)
+                    ) {
+                        text()
+                    }
+                }
+            }
+            Box(modifier = Modifier.align(Alignment.End)) {
+                ProvideContentColorTextStyle(
+                    contentColor = MaterialTheme.colorScheme.primary,
+                    textStyle = MaterialTheme.typography.labelLarge,
+                    content = buttons
+                )
+            }
+        }
+    }
+}
+
+@Composable
+internal fun AlertDialogFlowRow(
+    mainAxisSpacing: Dp,
+    crossAxisSpacing: Dp,
+    content: @Composable () -> Unit
+) {
+    Layout(content) { measurables, constraints ->
+        val sequences = mutableListOf<List<Placeable>>()
+        val crossAxisSizes = mutableListOf<Int>()
+        val crossAxisPositions = mutableListOf<Int>()
+
+        var mainAxisSpace = 0
+        var crossAxisSpace = 0
+
+        val currentSequence = mutableListOf<Placeable>()
+        var currentMainAxisSize = 0
+        var currentCrossAxisSize = 0
+
+        // Return whether the placeable can be added to the current sequence.
+        fun canAddToCurrentSequence(placeable: Placeable) =
+            currentSequence.isEmpty() || currentMainAxisSize + mainAxisSpacing.roundToPx() +
+                placeable.width <= constraints.maxWidth
+
+        // Store current sequence information and start a new sequence.
+        fun startNewSequence() {
+            if (sequences.isNotEmpty()) {
+                crossAxisSpace += crossAxisSpacing.roundToPx()
+            }
+            // Ensures that confirming actions appear above dismissive actions.
+            @Suppress("ListIterator")
+            sequences.add(0, currentSequence.toList())
+            crossAxisSizes += currentCrossAxisSize
+            crossAxisPositions += crossAxisSpace
+
+            crossAxisSpace += currentCrossAxisSize
+            mainAxisSpace = max(mainAxisSpace, currentMainAxisSize)
+
+            currentSequence.clear()
+            currentMainAxisSize = 0
+            currentCrossAxisSize = 0
+        }
+
+        measurables.fastForEach { measurable ->
+            // Ask the child for its preferred size.
+            val placeable = measurable.measure(constraints)
+
+            // Start a new sequence if there is not enough space.
+            if (!canAddToCurrentSequence(placeable)) startNewSequence()
+
+            // Add the child to the current sequence.
+            if (currentSequence.isNotEmpty()) {
+                currentMainAxisSize += mainAxisSpacing.roundToPx()
+            }
+            currentSequence.add(placeable)
+            currentMainAxisSize += placeable.width
+            currentCrossAxisSize = max(currentCrossAxisSize, placeable.height)
+        }
+
+        if (currentSequence.isNotEmpty()) startNewSequence()
+
+        val mainAxisLayoutSize = max(mainAxisSpace, constraints.minWidth)
+
+        val crossAxisLayoutSize = max(crossAxisSpace, constraints.minHeight)
+
+        val layoutWidth = mainAxisLayoutSize
+
+        val layoutHeight = crossAxisLayoutSize
+
+        layout(layoutWidth, layoutHeight) {
+            sequences.fastForEachIndexed { i, placeables ->
+                val childrenMainAxisSizes = IntArray(placeables.size) { j ->
+                    placeables[j].width +
+                        if (j < placeables.lastIndex) mainAxisSpacing.roundToPx() else 0
+                }
+                val arrangement = Arrangement.End
+                val mainAxisPositions = IntArray(childrenMainAxisSizes.size) { 0 }
+                with(arrangement) {
+                    arrange(
+                        mainAxisLayoutSize, childrenMainAxisSizes,
+                        layoutDirection, mainAxisPositions
+                    )
+                }
+                placeables.fastForEachIndexed { j, placeable ->
+                    placeable.place(
+                        x = mainAxisPositions[j],
+                        y = crossAxisPositions[i]
+                    )
+                }
+            }
+        }
+    }
+}
+
+// Paddings for each of the dialog's parts.
+private val DialogPadding = PaddingValues(all = 24.dp)
+private val IconPadding = PaddingValues(bottom = 16.dp)
+private val TitlePadding = PaddingValues(bottom = 16.dp)
+private val TextPadding = PaddingValues(bottom = 24.dp)
+
+private val ButtonsMainAxisSpacing = 8.dp
+private val ButtonsCrossAxisSpacing = 12.dp
+
+/**
+ * ProvideContentColorTextStyle
+ *
+ * A convenience method to provide values to both LocalContentColor and LocalTextStyle in
+ * one call. This is less expensive than nesting calls to CompositionLocalProvider.
+ *
+ * Text styles will be merged with the current value of LocalTextStyle.
+ */
+@Composable
+private fun ProvideContentColorTextStyle(
+    contentColor: Color,
+    textStyle: TextStyle,
+    content: @Composable () -> Unit
+) {
+    val mergedStyle = LocalTextStyle.current.merge(textStyle)
+    CompositionLocalProvider(
+        LocalContentColor provides contentColor,
+        LocalTextStyle provides mergedStyle,
+        content = content
+    )
+}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/DropdownTextBox.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/DropdownTextBox.kt
index 679c562..b471e50 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/DropdownTextBox.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/DropdownTextBox.kt
@@ -44,6 +44,7 @@
     text: String,
     enabled: Boolean = true,
     errorMessage: String? = null,
+    singleLine: Boolean = true,
     content: @Composable DropdownTextBoxScope.() -> Unit,
 ) {
     var expanded by remember { mutableStateOf(false) }
@@ -70,7 +71,7 @@
             onValueChange = { },
             label = { Text(text = label) },
             trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
-            singleLine = true,
+            singleLine = singleLine,
             readOnly = true,
             enabled = enabled,
             isError = errorMessage != null,
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsDropdownCheckBox.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsDropdownCheckBox.kt
index 0e7e499..a3ad402 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsDropdownCheckBox.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsDropdownCheckBox.kt
@@ -19,14 +19,19 @@
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.selection.toggleable
+import androidx.compose.material3.ButtonDefaults
 import androidx.compose.material3.Checkbox
+import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Text
-import androidx.compose.material3.TextButton
+import androidx.compose.material3.minimumInteractiveComponentSize
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.tooling.preview.Preview
 import com.android.settingslib.spa.framework.theme.SettingsDimension
 import com.android.settingslib.spa.framework.theme.SettingsOpacity.alphaForEnabled
@@ -69,6 +74,7 @@
         text = getDisplayText(options) ?: emptyText,
         enabled = enabled && options.changeable,
         errorMessage = errorMessage,
+        singleLine = false,
     ) {
         for (option in options) {
             CheckboxItem(option) {
@@ -110,22 +116,31 @@
     option: SettingsDropdownCheckOption,
     onClick: (SettingsDropdownCheckOption) -> Unit,
 ) {
-    TextButton(
-        onClick = { onClick(option) },
-        modifier = Modifier.fillMaxWidth(),
-    ) {
-        Row(
-            modifier = Modifier.fillMaxWidth(),
-            horizontalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingAround),
-            verticalAlignment = Alignment.CenterVertically
-        ) {
-            Checkbox(
-                checked = option.selected.value,
-                onCheckedChange = null,
+    Row(
+        modifier = Modifier
+            .fillMaxWidth()
+            .minimumInteractiveComponentSize()
+            .toggleable(
+                value = option.selected.value,
                 enabled = option.changeable,
+                role = Role.Checkbox,
+                onValueChange = { onClick(option) },
             )
-            Text(text = option.text, modifier = Modifier.alphaForEnabled(option.changeable))
-        }
+            .padding(ButtonDefaults.TextButtonContentPadding),
+        horizontalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingAround),
+        verticalAlignment = Alignment.CenterVertically,
+    ) {
+        Checkbox(
+            checked = option.selected.value,
+            onCheckedChange = null,
+            enabled = option.changeable,
+        )
+        Text(
+            text = option.text,
+            modifier = Modifier.alphaForEnabled(option.changeable),
+            color = MaterialTheme.colorScheme.primary,
+            style = MaterialTheme.typography.labelLarge,
+        )
     }
 }
 
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt
index 8b546b4..791893b 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/TwoTargetSwitchPreference.kt
@@ -23,7 +23,6 @@
 @Composable
 fun TwoTargetSwitchPreference(
     model: SwitchPreferenceModel,
-    icon: @Composable (() -> Unit)? = null,
     primaryEnabled: () -> Boolean = { true },
     primaryOnClick: (() -> Unit)?,
 ) {
@@ -33,7 +32,7 @@
             summary = model.summary,
             primaryEnabled = primaryEnabled,
             primaryOnClick = primaryOnClick,
-            icon = icon,
+            icon = model.icon,
         ) {
             SettingsSwitch(
                 checked = model.checked(),
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SuwScaffold.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SuwScaffold.kt
index 354b95d..f372a45 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SuwScaffold.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SuwScaffold.kt
@@ -40,7 +40,8 @@
 
 data class BottomAppBarButton(
     val text: String,
-    val onClick: () -> Unit,
+    val enabled: Boolean = true,
+    val onClick: () -> Unit
 )
 
 @Composable
@@ -122,13 +123,13 @@
 ) {
     Row(modifier = Modifier.padding(SettingsDimension.itemPaddingAround)) {
         dismissButton?.apply {
-            TextButton(onClick) {
+            TextButton(onClick = onClick, enabled = enabled) {
                 ActionText(text)
             }
         }
         Spacer(modifier = Modifier.weight(1f))
         actionButton?.apply {
-            Button(onClick) {
+            Button(onClick = onClick, enabled = enabled) {
                 ActionText(text)
             }
         }
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/LoadingBar.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/LoadingBar.kt
index 1741f13..be178ff 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/LoadingBar.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/LoadingBar.kt
@@ -17,7 +17,6 @@
 package com.android.settingslib.spa.widget.ui
 
 import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.absoluteOffset
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.material3.CircularProgressIndicator
@@ -25,23 +24,15 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.dp
 
 /**
  * Indeterminate linear progress bar. Expresses an unspecified wait time.
  */
 @Composable
-fun LinearLoadingBar(
-    isLoading: Boolean,
-    xOffset: Dp = 0.dp,
-    yOffset: Dp = 0.dp
-) {
+fun LinearLoadingBar(isLoading: Boolean) {
     if (isLoading) {
         LinearProgressIndicator(
-            modifier = Modifier
-                .fillMaxWidth()
-                .absoluteOffset(xOffset, yOffset)
+            modifier = Modifier.fillMaxWidth()
         )
     }
 }
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Spinner.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Spinner.kt
index 514ad669..c48a147 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Spinner.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/Spinner.kt
@@ -33,6 +33,7 @@
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.setValue
@@ -74,8 +75,8 @@
             modifier = Modifier.semantics { role = Role.DropdownList },
             onClick = { expanded = true },
             colors = ButtonDefaults.buttonColors(
-                containerColor = SettingsTheme.colorScheme.spinnerHeaderContainer,
-                contentColor = SettingsTheme.colorScheme.onSpinnerHeaderContainer,
+                containerColor = MaterialTheme.colorScheme.primaryContainer,
+                contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
             ),
             contentPadding = contentPadding,
         ) {
@@ -85,7 +86,7 @@
         DropdownMenu(
             expanded = expanded,
             onDismissRequest = { expanded = false },
-            modifier = Modifier.background(SettingsTheme.colorScheme.spinnerItemContainer),
+            modifier = Modifier.background(MaterialTheme.colorScheme.secondaryContainer),
         ) {
             for (option in options) {
                 DropdownMenuItem(
@@ -93,7 +94,7 @@
                         SpinnerText(
                             option = option,
                             modifier = Modifier.padding(end = 24.dp),
-                            color = SettingsTheme.colorScheme.onSpinnerItemContainer,
+                            color = MaterialTheme.colorScheme.onSecondaryContainer,
                         )
                     },
                     onClick = {
@@ -138,7 +139,7 @@
 @Composable
 private fun SpinnerPreview() {
     SettingsTheme {
-        var selectedId by rememberSaveable { mutableStateOf(1) }
+        var selectedId by rememberSaveable { mutableIntStateOf(1) }
         Spinner(
             options = (1..3).map { SpinnerOption(id = it, text = "Option $it") },
             selectedId = selectedId,
diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/theme/SettingsColorsTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/theme/SettingsColorsTest.kt
index 5ea92ab..625663d 100644
--- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/theme/SettingsColorsTest.kt
+++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/theme/SettingsColorsTest.kt
@@ -37,15 +37,11 @@
         assertThat(ls.categoryTitle).isNotEqualTo(ls.background)
         assertThat(ls.secondaryText).isNotEqualTo(ls.background)
         assertThat(ls.primaryContainer).isNotEqualTo(ls.onPrimaryContainer)
-        assertThat(ls.spinnerHeaderContainer).isNotEqualTo(ls.onSpinnerHeaderContainer)
-        assertThat(ls.spinnerItemContainer).isNotEqualTo(ls.onSpinnerItemContainer)
 
         val ds = dynamicDarkColorScheme(context)
         assertThat(ds.categoryTitle).isNotEqualTo(ds.background)
         assertThat(ds.secondaryText).isNotEqualTo(ds.background)
         assertThat(ds.primaryContainer).isNotEqualTo(ds.onPrimaryContainer)
-        assertThat(ds.spinnerHeaderContainer).isNotEqualTo(ds.onSpinnerHeaderContainer)
-        assertThat(ds.spinnerItemContainer).isNotEqualTo(ds.onSpinnerItemContainer)
     }
 
     @Test
@@ -58,10 +54,6 @@
         assertThat(ls.secondaryText).isEqualTo(Color(red = 73, green = 69, blue = 79))
         assertThat(ls.primaryContainer).isEqualTo(Color(red = 234, green = 221, blue = 255))
         assertThat(ls.onPrimaryContainer).isEqualTo(Color(red = 28, green = 27, blue = 31))
-        assertThat(ls.spinnerHeaderContainer).isEqualTo(Color(red = 234, green = 221, blue = 255))
-        assertThat(ls.onSpinnerHeaderContainer).isEqualTo(Color(red = 28, green = 27, blue = 31))
-        assertThat(ls.spinnerItemContainer).isEqualTo(Color(red = 232, green = 222, blue = 248))
-        assertThat(ls.onSpinnerItemContainer).isEqualTo(Color(red = 73, green = 69, blue = 79))
 
         val ds = darkColorScheme()
         assertThat(ds.background).isEqualTo(Color(red = 28, green = 27, blue = 31))
@@ -71,9 +63,5 @@
         assertThat(ds.secondaryText).isEqualTo(Color(red = 202, green = 196, blue = 208))
         assertThat(ds.primaryContainer).isEqualTo(Color(red = 232, green = 222, blue = 248))
         assertThat(ds.onPrimaryContainer).isEqualTo(Color(red = 28, green = 27, blue = 31))
-        assertThat(ds.spinnerHeaderContainer).isEqualTo(Color(red = 234, green = 221, blue = 255))
-        assertThat(ds.onSpinnerHeaderContainer).isEqualTo(Color(red = 28, green = 27, blue = 31))
-        assertThat(ds.spinnerItemContainer).isEqualTo(Color(red = 232, green = 222, blue = 248))
-        assertThat(ds.onSpinnerItemContainer).isEqualTo(Color(red = 73, green = 69, blue = 79))
     }
 }
diff --git a/packages/SettingsLib/SpaPrivileged/res/values-pt-rBR/strings.xml b/packages/SettingsLib/SpaPrivileged/res/values-pt-rBR/strings.xml
index ba92ebb6..6ae2928 100644
--- a/packages/SettingsLib/SpaPrivileged/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/SpaPrivileged/res/values-pt-rBR/strings.xml
@@ -21,7 +21,7 @@
     <string name="menu_show_system" msgid="906304605807554788">"Mostrar sistema"</string>
     <string name="menu_hide_system" msgid="374571689914923020">"Ocultar sistema"</string>
     <string name="app_permission_summary_allowed" msgid="6115213465364138103">"Permitido"</string>
-    <string name="app_permission_summary_not_allowed" msgid="58396132188553920">"Não permitido"</string>
+    <string name="app_permission_summary_not_allowed" msgid="58396132188553920">"Sem permissão"</string>
     <string name="version_text" msgid="4001669804596458577">"Versão <xliff:g id="VERSION_NUM">%1$s</xliff:g>"</string>
     <string name="cloned_app_info_label" msgid="1765651167024478391">"Clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/SettingsLib/SpaPrivileged/res/values-pt/strings.xml b/packages/SettingsLib/SpaPrivileged/res/values-pt/strings.xml
index ba92ebb6..6ae2928 100644
--- a/packages/SettingsLib/SpaPrivileged/res/values-pt/strings.xml
+++ b/packages/SettingsLib/SpaPrivileged/res/values-pt/strings.xml
@@ -21,7 +21,7 @@
     <string name="menu_show_system" msgid="906304605807554788">"Mostrar sistema"</string>
     <string name="menu_hide_system" msgid="374571689914923020">"Ocultar sistema"</string>
     <string name="app_permission_summary_allowed" msgid="6115213465364138103">"Permitido"</string>
-    <string name="app_permission_summary_not_allowed" msgid="58396132188553920">"Não permitido"</string>
+    <string name="app_permission_summary_not_allowed" msgid="58396132188553920">"Sem permissão"</string>
     <string name="version_text" msgid="4001669804596458577">"Versão <xliff:g id="VERSION_NUM">%1$s</xliff:g>"</string>
     <string name="cloned_app_info_label" msgid="1765651167024478391">"Clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string>
 </resources>
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt
index a395266..e1e1ee5 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt
@@ -151,7 +151,7 @@
     }
 
     private fun isArchivingEnabled(featureFlags: FeatureFlags) =
-            featureFlags.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false)
+            featureFlags.archiving()
 
     override fun showSystemPredicate(
         userIdFlow: Flow<Int>,
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListTwoTargetSwitchItem.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListTwoTargetSwitchItem.kt
index 5c2d770..1f7122e 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListTwoTargetSwitchItem.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListTwoTargetSwitchItem.kt
@@ -33,11 +33,13 @@
         model = object : SwitchPreferenceModel {
             override val title = label
             override val summary = [email protected]
+            override val icon = @Composable {
+                AppIcon(record.app, SettingsDimension.appIconItemSize)
+            }
             override val checked = checked
             override val changeable = changeable
             override val onCheckedChange = onCheckedChange
         },
-        icon = { AppIcon(record.app, SettingsDimension.appIconItemSize) },
         primaryOnClick = onClick,
     )
 }
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/preference/RestrictedSwitchPreferenceModel.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/preference/RestrictedSwitchPreferenceModel.kt
index 87cd2b8..c9934ad 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/preference/RestrictedSwitchPreferenceModel.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/preference/RestrictedSwitchPreferenceModel.kt
@@ -52,6 +52,8 @@
         checked = model.checked,
     )
 
+    override val icon = model.icon
+
     override val checked = when (restrictedMode) {
         null -> ({ null })
         is NoRestricted -> model.checked
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/preference/RestrictedTwoTargetSwitchPreference.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/preference/RestrictedTwoTargetSwitchPreference.kt
index e100773..1bed733 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/preference/RestrictedTwoTargetSwitchPreference.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/preference/RestrictedTwoTargetSwitchPreference.kt
@@ -29,14 +29,12 @@
 @Composable
 fun RestrictedTwoTargetSwitchPreference(
     model: SwitchPreferenceModel,
-    icon: @Composable (() -> Unit)? = null,
     restrictions: Restrictions,
     primaryEnabled: () -> Boolean = { true },
     primaryOnClick: (() -> Unit)?,
 ) {
     RestrictedTwoTargetSwitchPreference(
         model = model,
-        icon = icon,
         primaryEnabled = primaryEnabled,
         primaryOnClick = primaryOnClick,
         restrictions = restrictions,
@@ -48,21 +46,19 @@
 @Composable
 internal fun RestrictedTwoTargetSwitchPreference(
     model: SwitchPreferenceModel,
-    icon: @Composable (() -> Unit)? = null,
     primaryEnabled: () -> Boolean = { true },
     primaryOnClick: (() -> Unit)?,
     restrictions: Restrictions,
     restrictionsProviderFactory: RestrictionsProviderFactory,
 ) {
     if (restrictions.isEmpty()) {
-        TwoTargetSwitchPreference(model, icon, primaryEnabled, primaryOnClick)
+        TwoTargetSwitchPreference(model, primaryEnabled, primaryOnClick)
         return
     }
     val restrictedMode = restrictionsProviderFactory.rememberRestrictedMode(restrictions).value
     RestrictedSwitchWrapper(model, restrictedMode) { restrictedModel ->
         TwoTargetSwitchPreference(
             model = restrictedModel,
-            icon = icon,
             primaryEnabled = restrictedMode.restrictEnabled(primaryEnabled),
             primaryOnClick = restrictedMode.restrictOnClick(primaryOnClick),
         )
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt
index f812f95..5a6c0a1 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/compose/DisposableBroadcastReceiverAsUserTest.kt
@@ -27,9 +27,8 @@
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settingslib.spa.testutils.delay
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.runBlocking
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -72,12 +71,13 @@
                 DisposableBroadcastReceiverAsUser(INTENT_FILTER, USER_HANDLE) {}
             }
         }
+        composeTestRule.delay()
 
         assertThat(registeredBroadcastReceiver).isNotNull()
     }
 
     @Test
-    fun broadcastReceiver_isCalledOnReceive() = runBlocking {
+    fun broadcastReceiver_isCalledOnReceive() {
         var onReceiveIsCalled = false
         composeTestRule.setContent {
             CompositionLocalProvider(
@@ -91,7 +91,7 @@
         }
 
         registeredBroadcastReceiver!!.onReceive(context, Intent())
-        delay(100)
+        composeTestRule.delay()
 
         assertThat(onReceiveIsCalled).isTrue()
     }
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlowTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlowTest.kt
index 2e6a396..c1d298d 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlowTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlowTest.kt
@@ -48,18 +48,7 @@
     }
 
     @Test
-    fun settingsGlobalChangeFlow_collectAfterValueChanged_onlyKeepLatest() = runBlocking {
-        var value by context.settingsGlobalBoolean(TEST_NAME)
-        value = false
-
-        val flow = context.settingsGlobalChangeFlow(TEST_NAME)
-        value = true
-
-        assertThat(flow.toListWithTimeout()).hasSize(1)
-    }
-
-    @Test
-    fun settingsGlobalChangeFlow_collectBeforeValueChanged_getBoth() = runBlocking {
+    fun settingsGlobalChangeFlow_changed() = runBlocking {
         var value by context.settingsGlobalBoolean(TEST_NAME)
         value = false
 
@@ -69,7 +58,7 @@
         delay(100)
         value = true
 
-        assertThat(listDeferred.await()).hasSize(2)
+        assertThat(listDeferred.await().size).isAtLeast(2)
     }
 
     private companion object {
diff --git a/packages/SettingsLib/aconfig/settingslib.aconfig b/packages/SettingsLib/aconfig/settingslib.aconfig
index 54c5a14..9ec5caa 100644
--- a/packages/SettingsLib/aconfig/settingslib.aconfig
+++ b/packages/SettingsLib/aconfig/settingslib.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settingslib.flags"
+container: "system"
 
 flag {
     name: "new_status_bar_icons"
@@ -35,14 +36,14 @@
   name: "enable_le_audio_sharing"
   namespace: "pixel_cross_device_control"
   description: "Gates whether to enable LE audio sharing"
-  bug: "305620450"
+  bug: "323125723"
 }
 
 flag {
   name: "enable_le_audio_qr_code_private_broadcast_sharing"
   namespace: "pixel_cross_device_control"
   description: "Gates whether to enable LE audio private broadcast sharing via QR code"
-  bug: "308368124"
+  bug: "323125723"
 }
 
 flag {
diff --git a/packages/SettingsLib/aconfig/settingslib_media_flag_declarations.aconfig b/packages/SettingsLib/aconfig/settingslib_media_flag_declarations.aconfig
index f3e537b..4d70aec 100644
--- a/packages/SettingsLib/aconfig/settingslib_media_flag_declarations.aconfig
+++ b/packages/SettingsLib/aconfig/settingslib_media_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settingslib.media.flags"
+container: "system"
 
 flag {
   name: "use_media_router2_for_info_media_manager"
diff --git a/packages/SettingsLib/res/drawable/avatar_choose_photo_circled.xml b/packages/SettingsLib/res/drawable/avatar_choose_photo_circled.xml
deleted file mode 100644
index 97aec74..0000000
--- a/packages/SettingsLib/res/drawable/avatar_choose_photo_circled.xml
+++ /dev/null
@@ -1,30 +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.
-  -->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-    <item>
-        <shape android:shape="oval">
-            <stroke
-                android:width="2dp"
-                android:color="?android:attr/colorPrimary"/>
-        </shape>
-    </item>
-    <item
-        android:left="@dimen/avatar_picker_icon_inset"
-        android:right="@dimen/avatar_picker_icon_inset"
-        android:top="@dimen/avatar_picker_icon_inset"
-        android:bottom="@dimen/avatar_picker_icon_inset"
-        android:drawable="@drawable/ic_avatar_choose_photo"/>
-</layer-list>
diff --git a/packages/SettingsLib/res/drawable/avatar_selector.xml b/packages/SettingsLib/res/drawable/avatar_selector.xml
deleted file mode 100644
index ccde597..0000000
--- a/packages/SettingsLib/res/drawable/avatar_selector.xml
+++ /dev/null
@@ -1,25 +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.
-  -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_selected="true">
-        <shape android:shape="oval">
-            <stroke
-                android:color="?android:attr/colorPrimary"
-                android:width="@dimen/avatar_picker_padding"/>
-        </shape>
-    </item>
-</selector>
\ No newline at end of file
diff --git a/packages/SettingsLib/res/drawable/avatar_take_photo_circled.xml b/packages/SettingsLib/res/drawable/avatar_take_photo_circled.xml
deleted file mode 100644
index 7033aae..0000000
--- a/packages/SettingsLib/res/drawable/avatar_take_photo_circled.xml
+++ /dev/null
@@ -1,30 +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.
-  -->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-    <item>
-        <shape android:shape="oval">
-            <stroke
-                android:width="2dp"
-                android:color="?android:attr/colorPrimary"/>
-        </shape>
-    </item>
-    <item
-        android:left="@dimen/avatar_picker_icon_inset"
-        android:right="@dimen/avatar_picker_icon_inset"
-        android:top="@dimen/avatar_picker_icon_inset"
-        android:bottom="@dimen/avatar_picker_icon_inset"
-        android:drawable="@drawable/ic_avatar_take_photo"/>
-</layer-list>
diff --git a/packages/SettingsLib/res/layout/avatar_item.xml b/packages/SettingsLib/res/layout/avatar_item.xml
deleted file mode 100644
index c52f664..0000000
--- a/packages/SettingsLib/res/layout/avatar_item.xml
+++ /dev/null
@@ -1,24 +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.
-  -->
-<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/avatar_image"
-    android:layout_height="@dimen/avatar_size_in_picker"
-    android:layout_width="@dimen/avatar_size_in_picker"
-    android:layout_margin="@dimen/avatar_picker_margin"
-    android:layout_gravity="center"
-    android:padding="@dimen/avatar_picker_padding"
-    android:background="@drawable/avatar_selector"/>
diff --git a/packages/SettingsLib/res/layout/avatar_picker.xml b/packages/SettingsLib/res/layout/avatar_picker.xml
deleted file mode 100644
index 2d40bd0..0000000
--- a/packages/SettingsLib/res/layout/avatar_picker.xml
+++ /dev/null
@@ -1,38 +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.
-  -->
-<com.google.android.setupdesign.GlifLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/glif_layout"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    android:icon="@drawable/ic_account_circle_outline"
-    app:sucUsePartnerResource="true"
-    app:sucHeaderText="@string/avatar_picker_title">
-
-    <LinearLayout
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        android:gravity="center_horizontal"
-        style="@style/SudContentFrame">
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/avatar_grid"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"/>
-    </LinearLayout>
-
-</com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/res/layout/edit_user_info_dialog_content.xml b/packages/SettingsLib/res/layout/edit_user_info_dialog_content.xml
index 89d6ac3..3ed1724 100644
--- a/packages/SettingsLib/res/layout/edit_user_info_dialog_content.xml
+++ b/packages/SettingsLib/res/layout/edit_user_info_dialog_content.xml
@@ -53,7 +53,7 @@
     <EditText
         android:id="@+id/user_name"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/user_name_height_in_user_info_dialog"
+        android:layout_height="wrap_content"
         android:layout_gravity="center"
         android:minWidth="200dp"
         android:layout_marginStart="6dp"
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 5301985..eb3d4af 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktief, net links"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktief, net regs"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktief, links en regs"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Media-oudio"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Foonoproepe"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Lêeroordrag"</string>
@@ -117,7 +139,7 @@
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Teksboodskappe"</string>
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"SIM-toegang"</string>
     <string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"HD-oudio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
-    <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"HD oudio"</string>
+    <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"HD-oudio"</string>
     <string name="bluetooth_profile_hearing_aid" msgid="2607867572569689732">"Gehoortoestelle"</string>
     <string name="bluetooth_profile_le_audio" msgid="1725521360076451751">"LE-oudio"</string>
     <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="5757754050938807276">"Gekoppel aan gehoortoestelle"</string>
@@ -265,7 +287,7 @@
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Wys \'n knoppie in die kragkieslys om \'n foutverslag te doen"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"Bly wakker"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"Skerm sal nooit slaap terwyl dit laai nie"</string>
-    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Aktiveer Bluetooth HCI-loerloglêer"</string>
+    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Aktiveer Bluetooth HCI-snuffelloglêer"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Vang Bluetooth-pakkette vas. (Wissel Bluetooth nadat jy hierdie instelling verander het)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM-ontsluit"</string>
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Laat toe dat die selflaaiprogram ontsluit word"</string>
@@ -396,7 +418,7 @@
     <string name="transition_animation_scale_title" msgid="1278477690695439337">"Oorganganimasieskaal"</string>
     <string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator-tydsduurskaal"</string>
     <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simuleer sekondêre uitstallings"</string>
-    <string name="debug_applications_category" msgid="5394089406638954196">"Programme"</string>
+    <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string>
     <string name="immediately_destroy_activities" msgid="1826287490705167403">"Moenie aktiwiteite behou nie"</string>
     <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Vernietig elke aktiwiteit sodra die gebruiker dit verlaat"</string>
     <string name="app_process_limit_title" msgid="8361367869453043007">"Agtergrondproseslimiet"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Aanvaar dat programme moderne formate steun"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Wys kodewisselingkennisgewings"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Deaktiveer kodewisselingkas"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-instellings"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forseer terugskakeling na L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Kies vir geforseerde terugskakeling na L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Lopende dienste"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Sien en beheer dienste wat tans aktief is"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Gebruik stelseltale"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Kon nie instellings vir <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> oopmaak nie"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Die invoermetode kan dalk alle teks wat jy invoer, versamel, insluitend persoonlike data soos wagwoorde en kredietkaartnommers. Dit kom van die program <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Wil jy dié invoermetode gebruik?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Let wel: Ná \'n herselflaai kan hierdie program nie begin voordat jy jou foon ontsluit het nie"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Let wel: Ná \'n herselflaai kan hierdie app nie begin voordat jy jou foon ontsluit het nie"</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"IMS-registrasiestaat"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Geregistreer"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Nie geregistreer nie"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Kon nie \'n nuwe gebruiker skep nie"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Kon nie ’n nuwe gas skep nie"</string>
     <string name="user_nickname" msgid="262624187455825083">"Bynaam"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Die naam en prent wat jy kies sal sigbaar wees vir enigiemand wat hierdie toestel gebruik."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Voeg gebruiker by"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Voeg gas by"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Verwyder gas"</string>
@@ -631,7 +649,7 @@
     <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Verwyder"</string>
     <string name="guest_resetting" msgid="7822120170191509566">"Stel tans gassessie terug …"</string>
     <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"Stel gastesessie terug?"</string>
-    <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Dit sal ’n nuwe gastesessie begin en alle programme en data van die huidige sessie uitvee"</string>
+    <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Dit sal ’n nuwe gastesessie begin en alle apps en data van die huidige sessie uitvee"</string>
     <string name="guest_exit_dialog_title" msgid="1846494656849381804">"Verlaat gasmodus?"</string>
     <string name="guest_exit_dialog_message" msgid="1743218864242719783">"Dit sal programme en data in die huidige gastesessie uitvee"</string>
     <string name="grant_admin" msgid="4323199171790522574">"Ja, maak hulle ’n admin"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Alle aktiwiteit sal uitgevee word wanneer jy uitgaan"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Jy kan jou aktiwiteit stoor of uitvee wanneer jy uitgaan"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Stel terug om aktiwiteit nou uit te vee, of stoor of vee aktiwiteit uit wanneer jy uitgaan"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Neem \'n foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Kies \'n prent"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Kies foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Te veel verkeerde pogings. Hierdie toestel se data sal uitgevee word."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Te veel verkeerde pogings. Hierdie gebruiker sal uitgevee word."</string>
@@ -658,7 +674,7 @@
     <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>
-    <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"Bedraade oorfoon"</string>
+    <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"Bedrade oorfone"</string>
     <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>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet is ontkoppel."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Geen oproepe nie."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Kies \'n profielprent"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Verstekgebruikerikoon"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fisieke sleutelbord"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Kies sleutelborduitleg"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Verstek"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index c5c5cdd..bda0277 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ገቢር፣ ግራ ብቻ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ገቢር፣ ቀኝ ብቻ"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ገቢር፣ ግራ እና ቀኝ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"የማህደረ መረጃ ኦዲዮ"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"የስልክ ጥሪዎች"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ፋይል ማስተላለፍ"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"መተግበሪያዎች ዘመናዊ ቅርጸቶችን እንደሚደግፉ አድርገው ይቁጠሩ"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ትራንስኮዲንግ ማሳወቂያዎችን አሳይ"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"የትራንስኮዲንግ መሸጎጫን አሰናክል"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"የWidevine ቅንብሮች"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"የL3 ተመልሶ ወዳቂ ግዳጅ"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"የL3 ተመልሶ ወዳቂን ለማስገደድ ይምረጡ"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"አሂድ አገልግሎቶች"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"በአሁኑጊዜ እየሄዱ ያሉ አገልግሎቶችን ተቆጣጠር እና እይ"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"የWebView ትግበራ"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"አዲስ ተጠቃሚን መፍጠር አልተሳካም"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"አዲስ እንግዳ መፍጠር አልተሳካም"</string>
     <string name="user_nickname" msgid="262624187455825083">"ቅጽል ስም"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"የመረጡት ስም እና ምስል ይህን መሣሪያ ለሚጠቀም ለማንኛውም ሰው የሚታይ ይሆናል።"</string>
     <string name="user_add_user" msgid="7876449291500212468">"ተጠቃሚን አክል"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"እንግዳን አክል"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"እንግዳን አስወግድ"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"በሚወጡበት ጊዜ ሁሉም እንቅስቃሴዎች ይሰረዛሉ"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"በሚወጡበት ጊዜ እንቅስቃሴዎን ማስቀመጥ ወይም መሰረዝ ይችላሉ"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"የክፍለ-ጊዜ እንቅስቃሴን አሁን ለመሰረዝ ዳግም ያስጀምሩ፣ ወይም በሚወጡበት ጊዜ እንቅስቃሴን ማስቀመጥ ወይም መሰረዝ ይችላሉ"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ፎቶ አንሳ"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"ምስል ይምረጡ"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ፎቶ ይምረጡ"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"በጣም ብዙ ትክክል ያልሆኑ ሙከራዎች። የዚህ መሣሪያ ውሂብ ይሰረዛል።"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"በጣም ብዙ ትክክል ያልሆኑ ሙከራዎች። ይህ ተጠቃሚ ይሰረዛል።"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ኤተርኔት ተነቅሏል።"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ኢተርኔት።"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"መደወል የለም።"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"የመገለጫ ሥዕል ይምረጡ"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ነባሪ የተጠቃሚ አዶ"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"አካላዊ ቁልፍ ሰሌዳ"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"የቁልፍ ሰሌዳ አቀማመጥን ይምረጡ"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ነባሪ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 4fda845..ba93f65 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"السمّاعة الطبية اليسرى فقط مفعَّلة"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"السمّاعة الطبية اليمنى فقط مفعَّلة"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"السمّاعتان اليسرى واليمنى مفعَّلتان"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"الإعدادات الصوتية للوسائط"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"المكالمات الهاتفية"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"نقل الملف"</string>
@@ -411,7 +433,7 @@
     <string name="enable_freeform_support" msgid="7599125687603914253">"تفعيل النوافذ الحرة"</string>
     <string name="enable_freeform_support_summary" msgid="1822862728719276331">"إتاحة استخدام النوافذ الحرة التجريبية"</string>
     <string name="local_backup_password_title" msgid="4631017948933578709">"كلمة مرور احتياطية للكمبيوتر"</string>
-    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"النُسخ الاحتياطية الكاملة لسطح المكتب غير محمية في الوقت الحالي."</string>
+    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"النُسخ الاحتياطية الكاملة لسطح المكتب غير محمية في الوقت الحالي"</string>
     <string name="local_backup_password_summary_change" msgid="1707357670383995567">"انقر لتغيير كلمة مرور النسخ الاحتياطية الكاملة لسطح المكتب أو إزالتها."</string>
     <string name="local_backup_password_toast_success" msgid="4891666204428091604">"تم ضبط كلمة مرور احتياطية جديدة"</string>
     <string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"كلمة المرور الجديدة وتأكيدها لا يتطابقان"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"افتراض أن التطبيق يتوافق مع التنسيقات الحديثة"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"إظهار إشعارات تحويل الترميز"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"إيقاف ذاكرة التخزين المؤقت لميزة \"تحويل الترميز\""</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"‏إعدادات Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"‏فرض الرجوع إلى المستوى L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"‏اختيار فرض الرجوع إلى المستوى L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"الخدمات قيد التشغيل"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"عرض الخدمات قيد التشغيل في الوقت الحالي والتحكم فيها"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"‏تطبيق WebView"</string>
@@ -475,7 +494,7 @@
     <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"سيبقى شحن البطارية أكثر من <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)."</string>
     <string name="power_remaining_only_more_than_subtext" msgid="4873750633368888062">"سيبقى شحن البطارية أكثر من <xliff:g id="TIME_REMAINING">%1$s</xliff:g>."</string>
     <string name="power_charging" msgid="6727132649743436802">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
-    <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"يتبقّى <xliff:g id="TIME">%1$s</xliff:g> حتى اكتمال شحن البطارية."</string>
+    <string name="power_remaining_charging_duration_only" msgid="8085099012811384899">"يتبقّى <xliff:g id="TIME">%1$s</xliff:g> حتى اكتمال شحن البطارية"</string>
     <string name="power_charging_duration" msgid="6127154952524919719">"<xliff:g id="LEVEL">%1$s</xliff:g> - يتبقّى <xliff:g id="TIME">%2$s</xliff:g> حتى اكتمال شحن البطارية."</string>
     <string name="power_charging_limited" msgid="8202147604844938236">"<xliff:g id="LEVEL">%1$s</xliff:g> - تم تحسين الشحن"</string>
     <string name="power_charging_future_paused" msgid="1809543660923642799">"‫<xliff:g id="LEVEL">%1$s</xliff:g>: جارٍ الشحن"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"استخدام لغات النظام"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"تعذّر فتح الإعدادات لـ <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"يمكن أن يكون أسلوب الإدخال هذا قادرًا على جمع كل النصوص التي تكتبها، بما في ذلك البيانات الشخصية مثل كلمات المرور وأرقام بطاقات الائتمان. يتم الحصول على هذا الأسلوب من التطبيق <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. هل تريد استخدام أسلوب الإدخال هذا؟"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"ملاحظة: بعد إعادة التشغيل، يتعذر بدء هذا التطبيق إلى أن تلغي قفل هاتفك."</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"ملاحظة: بعد إعادة التشغيل، يتعذر بدء هذا التطبيق إلى أن تلغي قفل هاتفك"</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"‏حالة تسجيل IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"مُسجَّل"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"غير مُسجَّل"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"تعذّر إنشاء مستخدم جديد."</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"تعذّر إنشاء جلسة ضيف جديدة."</string>
     <string name="user_nickname" msgid="262624187455825083">"اللقب"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"بإمكان أي شخص يستخدم هذا الجهاز رؤية الاسم والصورة اللذين تختارهما."</string>
     <string name="user_add_user" msgid="7876449291500212468">"إضافة مستخدم"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"إضافة ضيف"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"إزالة جلسة الضيف"</string>
@@ -644,11 +662,9 @@
     <string name="guest_exit_button" msgid="5774985819191803960">"الخروج من وضع الضيف"</string>
     <string name="guest_reset_button" msgid="2515069346223503479">"إعادة ضبط جلسة الضيف"</string>
     <string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"الخروج من وضع الضيف"</string>
-    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"سيتم حذف جميع الأنشطة عند الخروج من وضع الضيف."</string>
+    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"سيتم حذف جميع الأنشطة عند الخروج من وضع الضيف"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"يمكنك حفظ نشاطك أو حذفه عند الخروج من وضع الضيف."</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"يمكنك إجراء إعادة ضبط لحذف نشاط الجلسة الآن، أو حِفظ النشاط أو حذفه عند الخروج من وضع الضيف."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"التقاط صورة"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"اختيار صورة"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"اختيار صورة"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"لقد استنفدت عدد المحاولات غير الصحيحة وسيتم حذف بيانات هذا الجهاز."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"لقد استنفدت عدد المحاولات غير الصحيحة وسيتم حذف حساب هذا المستخدم."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"‏تم قطع اتصال Ethernet."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"إيثرنت"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"لا يتم الاتصال."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"اختيار صورة الملف الشخصي"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"رمز المستخدم التلقائي"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"لوحة المفاتيح الخارجية"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"اختيار تنسيق لوحة مفاتيح"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"التنسيق التلقائي"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 2d14a82..ef53faf 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"কেৱল বাঁওফালৰটো সক্ৰিয় হৈছে"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"কেৱল সোঁফালৰটো সক্ৰিয় হৈছে"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"বাওঁ আৰু সোঁ দুয়োফালৰ সক্ৰিয় হৈছে"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"মিডিয়াৰ অডিঅ’"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ফ\'ন কলসমূহ"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ফাইল স্থানান্তৰণ"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"এপে আধুনিক ফৰ্মেট সমৰ্থন কৰে বুলি ধৰি লওক"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ট্ৰান্সক\'ডিঙৰ জাননী দেখুৱাওক"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ট্ৰান্সক\'ডিঙৰ কেশ্ব অক্ষম কৰক"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevineৰ ছেটিং"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"force L3 fallback সক্ষম কৰিবলৈ বাছনি কৰক"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"চলিত সেৱা"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"বৰ্তমান চলি থকা সেৱাসমূহ চাওক আৰু নিয়ন্ত্ৰণ কৰক"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"ৱেবভিউ প্ৰয়োগ"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"নতুন ব্যৱহাৰকাৰী সৃষ্টি কৰিব পৰা নগ’ল"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"নতুন অতিথি সৃষ্টি কৰিব পৰা নগ’ল"</string>
     <string name="user_nickname" msgid="262624187455825083">"উপনাম"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"এই ডিভাইচটো ব্যৱহাৰ কৰা যিকোনো লোকে আপুনি বাছনি কৰা নাম আৰু চিত্ৰখন দেখা পাব।"</string>
     <string name="user_add_user" msgid="7876449291500212468">"ব্যৱহাৰকাৰী যোগ দিয়ক"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"অতিথি যোগ দিয়ক"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"অতিথি আঁতৰাওক"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"বাহিৰ হওঁতে আটাইবোৰ কাৰ্যকলাপ মচা হ’ব"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"আপুনি বাহিৰ হওঁতে নিজৰ কাৰ্যকলাপ ছেভ কৰিব অথবা মচিব পাৰে"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"এতিয়াই ছেশ্বনৰ কাৰ্যকলাপ ৰিছেট কৰক অথবা মচক অথবা আপুনি বাহিৰ হওঁতে কাৰ্যকলাপ ছেভ কৰিব অথবা মচিব পাৰে"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"এখন ফট’ তোলক"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"এখন প্ৰতিচ্ছবি বাছনি কৰক"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ফট’ বাছনি কৰক"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"অতি বেছি ভুল প্ৰয়াস। ডিভাইচটোৰ ডেটা মচা হ’ব।"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"অতি বেছি ভুল প্ৰয়াস। এই ব্যৱহাৰকাৰীক মচা হ’ব।"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ইথাৰনেট সংযোগ বিচ্ছিন্ন হৈছে।"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ইথাৰনেট।"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"কল কৰা নহয়"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"এখন প্ৰ’ফাইল চিত্ৰ বাছনি কৰক"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ডিফ’ল্ট ব্যৱহাৰকাৰীৰ চিহ্ন"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"কায়িক কীব’ৰ্ড"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"কীব\'ৰ্ডৰ চানেকি বাছক"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ডিফ’ল্ট"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 0e3e99a..48c68f4 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, yalnız sol"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, yalnız sağ"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, sol və sağ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Media audio"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefon zəngləri"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Fayl transferi"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Tətbiqlərin müasir formatları dəstəklədiyini qəbul edin"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Kod dəyişmə bildirişlərini göstərin"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Keşin kodlaşdırılmasını deaktiv edin"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ayarları"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 alternativini məcburi tətbiq edin"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 alternativinin məcburi tətbiqi üçün seçim edin"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"İşləyən xidmətlər"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"İşlək xidmətlərə baxış və onların idarəedilməsi"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView servisi"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Yeni istifadəçi yaratmaq alınmadı"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Yeni qonaq yaratmaq alınmadı"</string>
     <string name="user_nickname" msgid="262624187455825083">"Ləqəb"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Seçdiyiniz ad və şəkil bu cihazı istifadə edən hər kəsə görünəcək."</string>
     <string name="user_add_user" msgid="7876449291500212468">"İstifadəçi əlavə edin"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Qonaq əlavə edin"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Qonağı silin"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Çıxış zamanı bütün fəaliyyətlər silinəcək"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Çıxışda fəaliyyətinizi saxlaya və ya silə bilərsiniz"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Sessiya fəaliyyətini indi silmək üçün sıfırlayın və ya çıxışda fəaliyyəti saxlaya və ya silə bilərsiniz"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Foto çəkin"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Şəkil seçin"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Foto seçin"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Həddindən artıq yanlış cəhd. Bu cihazın datası silinəcək."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Həddindən artıq yanlış cəhd. Bu istifadəçi silinəcək."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet bağlantısı kəsilib."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Zəng yoxdur."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Profil şəkli seçin"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Defolt istifadəçi ikonası"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fiziki klaviatura"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Klaviatura düzənini seçin"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Defolt"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index c674a44..04c6d94 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -106,11 +106,33 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo s leve strane"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, s desne strane"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, s leve i desne strane"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvuk medija"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonski pozivi"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Prenos datoteke"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Ulazni uređaj"</string>
-    <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Pristup Internetu"</string>
+    <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Pristup internetu"</string>
     <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Dozvoli kontakte i istoriju poziva"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Informacije će se koristiti za obaveštenja o pozivima i drugo"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Deljenje internet veze"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Podrazumevaj da aplikacije podržavaju moderne formate"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Prikazuj obaveštenja o transkodiranju"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Onemogući keš transkodiranja"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine podešavanja"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Prinudno primeni L3 rezervu"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Izaberite da biste prinudno primenili L3 rezervu"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Prikaz i kontrola trenutno pokrenutih usluga"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Primena WebView-a"</string>
@@ -611,16 +630,15 @@
     <string name="user_new_profile_name" msgid="2405500423304678841">"Novi profil"</string>
     <string name="user_info_settings_title" msgid="6351390762733279907">"Podaci o korisniku"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"Podaci o profilu"</string>
-    <string name="user_need_lock_message" msgid="4311424336209509301">"Da biste mogli da napravite ograničeni profil, treba da podesite zaključavanje ekrana da biste zaštitili aplikacije i lične podatke."</string>
-    <string name="user_set_lock_button" msgid="1427128184982594856">"Podesi zaključavanje"</string>
+    <string name="user_need_lock_message" msgid="4311424336209509301">"Da biste mogli da napravite ograničeni profil, treba da podesite otključavanje ekrana da biste zaštitili aplikacije i lične podatke."</string>
+    <string name="user_set_lock_button" msgid="1427128184982594856">"Podesi otključavanje"</string>
     <string name="user_switch_to_user" msgid="6975428297154968543">"Pređi na korisnika <xliff:g id="USER_NAME">%s</xliff:g>"</string>
     <string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Pravi se novi korisnik…"</string>
     <string name="creating_new_guest_dialog_message" msgid="1114905602181350690">"Pravi se novi gost…"</string>
     <string name="add_user_failed" msgid="4809887794313944872">"Pravljenje novog korisnika nije uspelo"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Pravljenje novog gosta nije uspelo"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nadimak"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Ime i sliku koje izaberete videće svako ko koristi ovaj uređaj."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Dodaj korisnika"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gosta"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Ukloni gosta"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Sve aktivnosti će biti izbrisane pri izlazu"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Možete da sačuvate ili izbrišete aktivnosti pri izlazu"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Resetujete za brisanje aktivnosti sesije, ili sačuvajte ili izbrišite aktivnosti pri izlazu"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Slikaj"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Odaberi sliku"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Izaberite sliku"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Previše netačnih pokušaja. Izbrisaćemo podatke sa ovog uređaja."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Previše netačnih pokušaja. Izbrisaćemo ovog korisnika."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Veza sa eternetom je prekinuta."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Eternet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Bez pozivanja."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Odaberite sliku profila"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Podrazumevana ikona korisnika"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fizička tastatura"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Odaberite raspored tastature"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Podrazumevano"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 9fe0680..f8c88e6 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Уключана, толькі для левага вуха"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Уключана, толькі для правага вуха"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Уключана, для левага і правага вуха"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Аўдыя медыяфайлаў"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Тэлефонныя выклікі"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Перадача файлаў"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Лічыца, што праграмы падтрымліваюць сучасныя фарматы"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Паказваць апавяшчэнні пра перакадзіраванне"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Адключыць кэш перакадзіравання"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Налады Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Прымусовы пераход на ўзровень бяспекі 3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Выберыце, каб прымусова пераходзіць на ўзровень бяспекі 3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Запушчаныя службы"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Прагляд запушчаных службаў i кіраванне iмi"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Рэалізацыя WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Не ўдалося стварыць новага карыстальніка"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Не ўдалося стварыць новага госця"</string>
     <string name="user_nickname" msgid="262624187455825083">"Псеўданім"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Выбраныя вамі імя і фота будуць бачыць усе карыстальнікі гэтай прылады."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Дадаць карыстальніка"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Дадаць госця"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Выдаліць госця"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Падчас выхаду будуць выдалены ўсе звесткі пра дзеянні"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Падчас выхаду можна захаваць ці выдаліць звесткі пра дзеянні"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Скіньце звесткі пра дзеянні падчас сеанса зараз. Вы таксама можаце захаваць ці выдаліць іх у час выхаду."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Зрабіць фота"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Выбраць відарыс"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Выбраць фота"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Занадта шмат няўдалых спроб. Даныя з гэтай прылады будуць выдалены."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Занадта шмат няўдалых спроб. Гэты карыстальнік будзе выдалены."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet адлучаны."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Ніякіх выклікаў."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Выберыце відарыс профілю"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Стандартны карыстальніцкі значок"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Фізічная клавіятура"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Выбар раскладкі клавіятуры"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Стандартна"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index b79c0e9..0457f10 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активно – само лявото"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активно – само дясното"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активно – лявото и дясното"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Мултимедийно аудио"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Телефонни обаждания"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Прехвърляне на файл"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Предполагане, че приложенията поддържат съвременни формати"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Показване на известията за прекодиране"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Деактивиране на кеша за прекодиране"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Настройки за Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Налагане на резервния вариант за L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Избиране на налагане на резервния вариант за L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Изпълнявани услуги"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Преглед и контрол върху изпълняващите се понастоящем услуги"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Внедряване на WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Неуспешно създаване на нов потребител"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Създаването на нов гост не бе успешно"</string>
     <string name="user_nickname" msgid="262624187455825083">"Псевдоним"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Избраните от вас име и снимка ще бъдат видими за всички, които използват това устройство."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Добавяне на потреби­тел"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Добавяне на гост"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Премахване на госта"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Цялата активност ще бъде изтрита при изход"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"При изход можете да запазите активността или да я изтриете"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Нулирайте, за да изтриете активността в сесията сега. Можете също да я запазите или изтриете при изход"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Правене на снимка"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Избиране на изображение"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Избиране на снимката"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Твърде много неправилни опити. Данните от това устройство ще бъдат изтрити."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Твърде много неправилни опити. Този потребител ще бъде изтрит."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Връзката с Ethernet е прекратена."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Без обаждания."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Изберете снимка на потребителския профил"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Икона за основния потребител"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Физическа клавиатура"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Избор на клавиатурна подредба"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"По подразбиране"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 31f693b..e9367ff 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"শুধুমাত্র বাঁদিকের হিয়ারিং এড অ্যাক্টিভ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"শুধুমাত্র ডানদিকের হিয়ারিং এড অ্যাক্টিভ"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"বাঁ ও ডানদিকের হিয়ারিং এড, অ্যাক্টিভ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"মিডিয়া অডিও"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ফোন কল"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ফাইল স্থানান্তর"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"অ্যাপ মর্ডার্ন ফর্ম্যাটে কাজ করবে বলে ধরে নিন"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ট্রান্সকোডিং বিজ্ঞপ্তি দেখুন"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ক্যাশে ট্রান্সকোডিং বন্ধ করুন"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"ওয়াইডভাইন সেটিংস"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"ফোর্স L3 ফলব্যাক"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ফোর্স L3 ফলব্যাক চালু করবেন কিনা তা বেছে নিন"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"এখন চলছে যে পরিষেবাগুলি"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"বর্তমান চলমান পরিষেবাগুলি দেখুন এবং নিয়ন্ত্রণ করুন"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"ওয়েবভিউ প্রয়োগ"</string>
@@ -609,7 +628,7 @@
     <string name="user_add_user_type_title" msgid="551279664052914497">"যোগ করুন"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"নতুন ব্যবহারকারী"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"নতুন প্রোফাইল"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"ব্যবহারকারী তথ্য"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"ব্যবহারকারীর তথ্য"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"প্রোফাইল তথ্য"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"আপনি একটি সীমাবদ্ধযুক্ত প্রোফাইল তৈরি করার আগে, আপনাকে আপনার অ্যাপ্লিকেশন এবং ব্যক্তিগত ডেটা সুরক্ষিত করার জন্য একটি স্ক্রিন লক সেট-আপ করতে হবে।"</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"লক সেট করুন"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"নতুন ব্যবহারকারী যোগ করা যায়নি"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"নতুন অতিথি তৈরি করা যায়নি"</string>
     <string name="user_nickname" msgid="262624187455825083">"বিশেষ নাম"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"আপনার বেছে নেওয়া নাম ও ছবি, এই ডিভাইস ব্যবহার করেন এমন যেকেউ দেখতে পাবেন।"</string>
     <string name="user_add_user" msgid="7876449291500212468">"ব্যবহারকারীর অ্যাকাউন্ট যোগ করুন"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"অতিথি যোগ করুন"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"অতিথি সরান"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"ছেড়ে বেরিয়ে যাওয়ার সময় সব অ্যাক্টিভিটি মুছে দেওয়া হবে"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"ছেড়ে বেরিয়ে যাওয়ার সময় আপনি অ্যাক্টিভিটি সেভ করতে পারবেন বা মুছতে পারবেন"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"সেশন অ্যাক্টিভিটি মুছে দিতে এখন রিসেট করুন বা ছেড়ে বেরিয়ে আসার সময় আপনি অ্যাক্টিভিটি সেভ করতে বা মুছতে পারবেন"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ফটো তুলুন"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"একটি ইমেজ বেছে নিন"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ফটো বেছে নিন"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"একাধিকবার ভুল ইনপুট দিয়েছেন। এই ডিভাইসের ডেটা মুছে ফেলা হবে।"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"একাধিকবার ভুল ইনপুট দিয়েছেন। এই ব্যবহারকারীর প্রোফাইল মুছে ফেলা হবে।"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ইথারনেটের সংযোগ বিচ্ছিন্ন হয়েছে৷"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ইথারনেট।"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"কল করবেন না।"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"একটি প্রোফাইল ছবি বেছে নিন"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ডিফল্ট ব্যবহারকারীর আইকন"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"ফিজিক্যাল কীবোর্ড"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"কীবোর্ড লেআউট বেছে নিন"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ডিফল্ট"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index db203d6e..7fb5225 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo lijevi"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, samo desni"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, lijevi i desni"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvuk medija"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonski pozivi"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Prenošenje fajla"</string>
@@ -265,7 +287,7 @@
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Vidite dugme za prijavu grešaka u meniju napajanja"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"Ne zaključavaj"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"Ekran neće prelaziti u stanje mirovanja tokom punjenja"</string>
-    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Omogući Bluetooth HCI snoop zapis"</string>
+    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Omogući Bluetooth HCI snoop zapisnik"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Snimite Bluetooth pakete. (Uključite/isključite Bluetooth nakon što promijenite ovu postavku)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM otključavanje"</string>
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Dozvoli otključavanje bootloadera"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Pretpostavi da aplikacije podržavaju moderne formate"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Prikaži obavještenja o transkodiranju"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Onemogućite keš memoriju za transkodiranje"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Postavke za Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Nametnite zamjenu L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Odaberite da nametnete zamjenu L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Prikaz i kontrola trenutno pokrenutih usluga"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Postavljanje WebViewa"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Koristi jezik sistema"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Otvaranje postavki za <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> nije uspjelo"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Ovaj način unosa može prikupiti sav tekst koji upišete, uključujući lične podatke kao što su lozinke i brojevi kreditnih kartica. Način omogućava aplikacija <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Da li želite koristiti ovaj način unosa?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Napomena: Nakon ponovnog pokretanja, ova aplikacija se neće moći pokrenuti dok ne otključate telefon"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Napomena: nakon ponovnog pokretanja ova aplikacija se neće moći pokrenuti dok ne otključate telefon"</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"Stanje IMS registracije"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Registrirano"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Nije registrirano"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Kreiranje novog korisnika nije uspjelo"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Kreiranje novog gosta nije uspjelo"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nadimak"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Ime i slika koje odaberete će biti vidljivi svima koji koriste ovaj uređaj."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Dodavanje korisnika"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Dodavanje gosta"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Ukloni gosta"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Sva aktivnost će se izbrisati pri napuštanju"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Možete sačuvati ili izbrisati svoju aktivnost pri izlasku"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Poništite da odmah izbrišete aktivnost iz sesije ili je možete sačuvati ili izbrisati pri izlasku"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Snimite fotografiju"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Odaberite sliku"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Odabir fotografije"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Previše je neispravnih pokušaja. Podaci ovog uređaja će se izbrisati."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Previše je neispravnih pokušaja. Ovaj korisnik će se izbrisati."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Veza sa Ethernetom je prekinuta."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Nema pozivanja."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Odaberite sliku profila"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Zadana ikona korisnika"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fizička tastatura"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Odaberite raspored tastature"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Zadano"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 262adba..18da1be 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Actiu, només l\'esquerre"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Actiu, només el dret"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Actiu, esquerre i dret"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Àudio multimèdia"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Trucades telefòniques"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferència de fitxers"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Assumeix que les aplicacions són compatibles amb formats moderns"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Mostra les notificacions de transcodificació"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Desactiva la memòria cau per a la transcodificació"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Configuració de Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Força l\'alternativa L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecciona per forçar l\'alternativa L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Serveis en execució"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualitza i controla els serveis en execució"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementació de WebView"</string>
@@ -481,9 +500,9 @@
     <string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g>: s\'està carregant"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"Desconegut"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"S\'està carregant"</string>
-    <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Carregant ràpidament"</string>
+    <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Càrrega ràpida"</string>
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Carregant lentament"</string>
-    <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Carregant sense fil"</string>
+    <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Càrrega sense fil"</string>
     <string name="battery_info_status_charging_dock" msgid="8573274094093364791">"S\'està carregant"</string>
     <string name="battery_info_status_discharging" msgid="6962689305413556485">"No s\'està carregant"</string>
     <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Connectat, però sense carregar"</string>
@@ -491,7 +510,7 @@
     <string name="battery_info_status_full_charged" msgid="3536054261505567948">"Totalment carregada"</string>
     <string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Càrrega en espera"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlat per l\'administrador"</string>
-    <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlat per la configuració restringida"</string>
+    <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlat per l\'opció de configuració restringida"</string>
     <string name="disabled" msgid="8017887509554714950">"Desactivat"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Amb permís"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Sense permís"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"No s\'ha pogut crear l\'usuari"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"No s\'ha pogut crear un convidat"</string>
     <string name="user_nickname" msgid="262624187455825083">"Àlies"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"El nom i la foto que triïs seran visibles per a qualsevol persona que faci servir aquest dispositiu."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Afegeix un usuari"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Afegeix un convidat"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Suprimeix el convidat"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Se suprimirà tota l\'activitat en sortir"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Pots desar o suprimir l\'activitat en sortir"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Restableix la sessió per suprimir l\'activitat ara, o desa o suprimeix l\'activitat en sortir."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Fes una foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Tria una imatge"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Selecciona una foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Has superat el nombre d\'intents incorrectes permesos. Les dades d\'aquest dispositiu se suprimiran."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Has superat el nombre d\'intents incorrectes permesos. Aquest usuari se suprimirà."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"S\'ha desconnectat l\'Ethernet."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Sense trucades."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Tria una foto de perfil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Icona d\'usuari predeterminat"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Teclat físic"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Tria una disposició de teclat"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Predeterminat"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 3845e98..f4bfe505c 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivní, pouze levé"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivní, pouze pravé"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivní, levé a pravé"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvuk médií"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonní hovory"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Přenos souborů"</string>
@@ -300,8 +322,8 @@
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3233402355917446304">"Kodek Bluetooth Audio LDAC: Kvalita přehrávání"</string>
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"Spustit zvukový kodek Bluetooth LDAC\nVýběr kodeku: kvalita přehrávání"</string>
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Streamování: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
-    <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Soukromé DNS"</string>
-    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Vyberte soukromý režim DNS"</string>
+    <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Soukromý DNS"</string>
+    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Režim výběru soukromého DNS"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Vypnuto"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automaticky"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"Název hostitele poskytovatele soukromého DNS"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Předpokládat, že aplikace podporují moderní formáty"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Zobrazit oznámení o překódování"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Deaktivovat mezipaměť pro překódování"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Nastavení Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Vynucení L3 fallback"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Vybrat vynucení L3 fallback"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Spuštěné služby"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Umožňuje zobrazit a ovládat aktuálně spuštěné služby"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementace WebView"</string>
@@ -555,7 +574,7 @@
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Tento tablet"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Dok s reproduktorem"</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>
     <string name="media_transfer_this_phone" msgid="7194341457812151531">"Tento telefon"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Nového uživatele se nepodařilo vytvořit"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Vytvoření nového hosta se nezdařilo"</string>
     <string name="user_nickname" msgid="262624187455825083">"Přezdívka"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Vybrané jméno a obrázek uvidí všichni, kdo toto zařízení používají."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Přidat uživatele"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Přidat hosta"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Odstranit hosta"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Veškerá aktivita bude při ukončení smazána"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Aktivitu můžete při ukončení uložit nebo smazat"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Aktivitu relace můžete ihned smazat resetováním, případně ji můžete uložit nebo smazat při ukončení"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Pořídit fotku"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Vybrat obrázek"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Vybrat fotku"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Příliš mnoho neplatných pokusů. Data v tomto zařízení budou smazána."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Příliš mnoho neplatných pokusů. Tento uživatel bude smazán."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Síť ethernet je odpojena."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Bez volání."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Vyberte profilový obrázek"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Výchozí uživatelská ikona"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fyzická klávesnice"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Zvolte rozložení klávesnice"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Výchozí"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 97676ad..d51f8b9 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, kun venstre"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, kun højre"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, venstre og højre"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Medielyd"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonopkald"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Filoverførsel"</string>
@@ -145,7 +167,7 @@
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Annuller"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Parring giver adgang til dine kontakter og din opkaldshistorik, når enhederne er forbundet."</string>
     <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"Der kunne ikke parres med <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"Kunne ikke parre med <xliff:g id="DEVICE_NAME">%1$s</xliff:g> pga. forkert pinkode eller adgangsnøgle."</string>
+    <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"Parring med <xliff:g id="DEVICE_NAME">%1$s</xliff:g> mislykkedes på grund af en forkert pinkode eller adgangsnøgle."</string>
     <string name="bluetooth_pairing_device_down_error_message" msgid="2554424863101358857">"Der kan ikke kommunikeres med <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
     <string name="bluetooth_pairing_rejected_error_message" msgid="5943444352777314442">"Parring afvist af <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
     <string name="bluetooth_talkback_computer" msgid="3736623135703893773">"Computer"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Gå ud fra, at apps understøtter moderne formater"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Vis notifikationer for omkodning"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Deaktiver omkodningscache"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-indstillinger"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Fremtving L3-alternativ"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Vælg for at fremtvinge L3-alternativ"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Kørende tjenester"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Vis og administrer kørende tjenester"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Der kunne ikke oprettes en ny bruger"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Der kunne ikke oprettes en ny gæst"</string>
     <string name="user_nickname" msgid="262624187455825083">"Kaldenavn"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Det navn og billede, du vælger, er synligt for alle, der bruger denne enhed."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Tilføj bruger"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Tilføj gæst"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Fjern gæsten"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Al aktivitet slettes ved afslutning"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Du kan gemme eller slette din aktivitet ved afslutning"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Nulstil for at slette sessionsaktiviteten nu, eller gem eller slet aktivitet ved afslutning"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Tag et billede"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Vælg et billede"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Vælg billede"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"For mange forkerte forsøg. Dataene på denne enhed slettes."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"For mange forkerte forsøg. Denne bruger slettes."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet er ikke tilsluttet."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Opkald er deaktiveret."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Vælg et profilbillede"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Ikon for standardbruger"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fysisk tastatur"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Vælg tastaturlayout"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Standard"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 02fd0e0..08ca14a 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -66,7 +66,7 @@
     <string name="connected_via_app" msgid="3532267661404276584">"Verbunden über <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="tap_to_sign_up" msgid="5356397741063740395">"Zum Anmelden tippen"</string>
     <string name="wifi_connected_no_internet" msgid="5087420713443350646">"Kein Internet"</string>
-    <string name="private_dns_broken" msgid="1984159464346556931">"Auf den privaten DNS-Server kann nicht zugegriffen werden"</string>
+    <string name="private_dns_broken" msgid="1984159464346556931">"Auf den Server des privaten DNS kann nicht zugegriffen werden"</string>
     <string name="wifi_limited_connection" msgid="1184778285475204682">"Eingeschränkte Verbindung"</string>
     <string name="wifi_status_no_internet" msgid="3799933875988829048">"Kein Internet"</string>
     <string name="wifi_status_sign_in_required" msgid="2236267500459526855">"Anmeldung erforderlich"</string>
@@ -106,12 +106,34 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, nur links"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, nur rechts"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, links und rechts"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Medien-Audio"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonanrufe"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Dateiübertragung"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Eingabegerät"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Internetzugriff"</string>
-    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Zugriff auf Kontakte und Anrufliste geben"</string>
+    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Zugriff auf Kontakte und Anrufliste gewähren"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Die Daten werden z. B. für Anrufbenachrichtigungen verwendet"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Freigabe der Internetverbindung"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"SMS"</string>
@@ -301,10 +323,10 @@
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"Bluetooth-Audio-LDAC-Codec auslösen\nAuswahl: Wiedergabequalität"</string>
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
     <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Privates DNS"</string>
-    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Privaten DNS-Modus auswählen"</string>
+    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Modus des privaten DNS auswählen"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Aus"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automatisch"</string>
-    <string name="private_dns_mode_provider" msgid="3619040641762557028">"Hostname des privaten DNS-Anbieters"</string>
+    <string name="private_dns_mode_provider" msgid="3619040641762557028">"Hostname des Anbieters des privaten DNS"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Hostname des DNS-Anbieters eingeben"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Verbindung nicht möglich"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Optionen zur Zertifizierung für kabellose Übertragung anzeigen"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Voraussetzen, dass Apps moderne Formate unterstützen"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Benachrichtigungen zur Transcodierung anzeigen"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Cache für Transcodierung deaktivieren"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-Einstellungen"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3-Fallback erzwingen"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Auswählen, um L3-Fallback zu erzwingen"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktive Dienste"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Momentan ausgeführte Dienste anzeigen und steuern"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-Implementierung"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Nutzer konnte nicht erstellt werden"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Fehler beim Erstellen eines neuen Gasts"</string>
     <string name="user_nickname" msgid="262624187455825083">"Alias"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Der gewählte Name und das gewählte Bild sind für jeden Nutzer dieses Geräts sichtbar."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Nutzer hinzufügen"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Gast hinzufügen"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Gast entfernen"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Beim Beenden werden alle Aktivitäten gelöscht"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Speichere oder lösche deine Aktivitäten beim Beenden"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Zurücksetzen, um jetzt die Sitzungsaktivitäten zu löschen, oder Aktivitäten beim Beenden speichern oder löschen"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Foto machen"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Bild auswählen"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Foto auswählen"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Zu viele Fehlversuche. Die Daten auf diesem Gerät werden gelöscht."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Zu viele Fehlversuche. Dieser Nutzer wird gelöscht."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet nicht verbunden"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Keine Anrufe."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Profilbild auswählen"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Standardmäßiges Nutzersymbol"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Physische Tastatur"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Tastaturlayout wählen"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Standard"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index ce81fb7..c38034a 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ενεργό, μόνο το αριστερό"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ενεργό, μόνο το δεξί"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ενεργό, αριστερό και δεξί"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Ήχος πολυμέσων"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Τηλεφωνικές κλήσεις"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Μεταφορά αρχείου"</string>
@@ -411,7 +433,7 @@
     <string name="enable_freeform_support" msgid="7599125687603914253">"Ενεργοποίηση παραθύρων ελεύθερης μορφής"</string>
     <string name="enable_freeform_support_summary" msgid="1822862728719276331">"Ενεργοποίηση υποστήριξης για πειραματικά παράθυρα ελεύθερης μορφής."</string>
     <string name="local_backup_password_title" msgid="4631017948933578709">"Εφ/κός κωδικός desktop"</string>
-    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Τα πλήρη αντίγραφα ασφαλείας επιφάνειας εργασίας δεν προστατεύονται αυτήν τη στιγμή"</string>
+    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Τα πλήρη αντίγραφα ασφαλείας επιφάνειας εργασίας δεν προστατεύονται αυτή τη στιγμή"</string>
     <string name="local_backup_password_summary_change" msgid="1707357670383995567">"Πατήστε για αλλαγή ή κατάργηση του κωδικού πρόσβασης για τα πλήρη αντίγραφα ασφαλείας επιφάνειας εργασίας"</string>
     <string name="local_backup_password_toast_success" msgid="4891666204428091604">"Ορίστηκε νέος εφεδρικός κωδικός πρόσβασης"</string>
     <string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"Ο νέος κωδικός πρόσβασης και η επιβεβαίωση δεν ταιριάζουν"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Να θεωρείται ότι οι εφαρμογές χρησιμοποιούν σύγχρονες μορφές"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Εμφάνιση ειδοποιήσεων διακωδικοποίησης"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Απενεργοποίηση κρυφής μνήμης για διακωδικοποίηση"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Ρυθμίσεις Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Επιβολή εναλλακτικής L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Επιλογή για επιβολή εναλλακτικής L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Υπηρεσίες που εκτελούνται"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Προβολή και έλεγχος των εφαρμογών που εκτελούνται αυτή τη στιγμή"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Υλοποίηση WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Η δημιουργία νέου χρήστη απέτυχε"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Αποτυχία δημιουργίας νέου επισκέπτη"</string>
     <string name="user_nickname" msgid="262624187455825083">"Ψευδώνυμο"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Το όνομα και η εικόνα που θα επιλέξετε θα είναι ορατά σε όλους όσους χρησιμοποιούν αυτή τη συσκευή."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Προσθήκη χρήστη"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Προσθήκη επισκέπτη"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Κατάργηση επισκέπτη"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Όλη η δραστηριότητα θα διαγραφεί κατά την έξοδο"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Αποθηκεύστε ή διαγράψτε τη δραστηριότητά σας κατά την έξοδο"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Επαναφορά για διαγραφή της δραστηριότητας της περιόδου σύνδεσης ή αποθήκευση ή διαγραφή κατά την έξοδο."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Λήψη φωτογραφίας"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Επιλογή εικόνας"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Επιλογή φωτογραφίας"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Πάρα πολλές ανεπιτυχείς προσπάθειες. Τα δεδομένα αυτής της συσκευής θα διαγραφούν."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Πάρα πολλές ανεπιτυχείς προσπάθειες. Αυτός ο χρήστης θα διαγραφεί."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Το Ethernet αποσυνδέθηκε."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Χωρίς κλήσεις."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Επιλογή φωτογραφ­ίας προφίλ"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Προεπιλεγμένο εικονίδιο χρήστη"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Φυσικό πληκτρολόγιο"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Επιλέξτε διάταξη πληκτρολογίου"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Προεπιλογή"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 78e5b61..c787c63 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Media audio"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Phone calls"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"File transfer"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Disable transcoding cache"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine settings"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Select to force L3 fallback"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Failed to create a new guest"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"The name and picture that you choose will be visible to anyone who uses this device."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Add user"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"All activity will be deleted on exit"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"You can save or delete your activity on exit"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Reset to delete session activity now, or you can save or delete activity on exit"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Take a photo"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Choose an image"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Select photo"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Too many incorrect attempts. This device\'s data will be deleted."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Too many incorrect attempts. This user will be deleted."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet disconnected."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"No calling."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Choose a profile picture"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Default user icon"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Physical keyboard"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Choose keyboard layout"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Default"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 920f7b1a..e5d2e29 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -106,6 +106,17 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
+    <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"Active (media only), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+    <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"Active (media only), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+    <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"Connected (supports audio sharing), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> battery"</string>
+    <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"Connected (supports audio sharing), L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> battery, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> battery"</string>
+    <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"Connected (supports audio sharing), left <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"Connected (supports audio sharing), right <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"Active (media only)"</string>
+    <string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"Supports audio sharing"</string>
+    <string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Active (media only), left only"</string>
+    <string name="bluetooth_hearing_aid_media_only_right_active" msgid="3854140683042617230">"Active (media only), right only"</string>
+    <string name="bluetooth_hearing_aid_media_only_left_and_right_active" msgid="1299913413062528417">"Active (media only), left and right"</string>
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Media audio"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Phone calls"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"File transfer"</string>
@@ -437,9 +448,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Disable transcoding cache"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine settings"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Select to force L3 fallback"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
@@ -619,8 +627,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Failed to create a new guest"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"The name and picture you choose will be visible to anyone who uses this device."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Add user"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string>
@@ -647,8 +654,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"All activity will be deleted on exit"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"You can save or delete your activity on exit"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Reset to delete session activity now, or you can save or delete activity on exit"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Take a photo"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Choose an image"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Select photo"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Too many incorrect attempts. This device\'s data will be deleted."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Too many incorrect attempts. This user will be deleted."</string>
@@ -688,8 +693,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet disconnected."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"No calling."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Choose a profile picture"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Default user icon"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Physical keyboard"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Choose keyboard layout"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Default"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 78e5b61..c787c63 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Media audio"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Phone calls"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"File transfer"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Disable transcoding cache"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine settings"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Select to force L3 fallback"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Failed to create a new guest"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"The name and picture that you choose will be visible to anyone who uses this device."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Add user"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"All activity will be deleted on exit"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"You can save or delete your activity on exit"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Reset to delete session activity now, or you can save or delete activity on exit"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Take a photo"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Choose an image"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Select photo"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Too many incorrect attempts. This device\'s data will be deleted."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Too many incorrect attempts. This user will be deleted."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet disconnected."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"No calling."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Choose a profile picture"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Default user icon"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Physical keyboard"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Choose keyboard layout"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Default"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 78e5b61..c787c63 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Active, left only"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, right only"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, left and right"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Media audio"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Phone calls"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"File transfer"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Disable transcoding cache"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine settings"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Select to force L3 fallback"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Failed to create a new guest"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"The name and picture that you choose will be visible to anyone who uses this device."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Add user"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"All activity will be deleted on exit"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"You can save or delete your activity on exit"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Reset to delete session activity now, or you can save or delete activity on exit"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Take a photo"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Choose an image"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Select photo"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Too many incorrect attempts. This device\'s data will be deleted."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Too many incorrect attempts. This user will be deleted."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet disconnected."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"No calling."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Choose a profile picture"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Default user icon"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Physical keyboard"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Choose keyboard layout"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Default"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index dd83259..5e14648 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -106,6 +106,17 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎Active, left only‎‏‎‎‏‎"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‎‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‏‏‏‏‏‏‎‎Active, right only‎‏‎‎‏‎"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎‎‏‎‏‎Active, left and right‎‏‎‎‏‎"</string>
+    <string name="bluetooth_active_media_only_battery_level" msgid="1164678961213251365">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‎‎‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎Active (media only), ‎‏‎‎‏‏‎<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ battery‎‏‎‎‏‎"</string>
+    <string name="bluetooth_active_media_only_battery_level_untethered" msgid="1345174295097854560">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‎‏‎‎‎‏‎‎‏‎‏‏‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎Active (media only), L: ‎‏‎‎‏‏‎<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ battery, R: ‎‏‎‎‏‏‎<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎ battery‎‏‎‎‏‎"</string>
+    <string name="bluetooth_battery_level_lea_support" msgid="8580950145907305436">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‏‎‏‎‏‎‎‎‏‎‏‏‎‎‎‏‏‎‏‎‎‎‏‎‎‎‏‎‎‏‎‎‎‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎Connected (supports audio sharing), ‎‏‎‎‏‏‎<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>‎‏‎‎‏‏‏‎ battery‎‏‎‎‏‎"</string>
+    <string name="bluetooth_battery_level_untethered_lea_support" msgid="8534816721698743015">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‎‏‎‏‏‎‏‏‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‏‏‏‎‎‏‏‏‎Connected (supports audio sharing), L: ‎‏‎‎‏‏‎<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ battery, R: ‎‏‎‎‏‏‎<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎ battery‎‏‎‎‏‎"</string>
+    <string name="bluetooth_battery_level_untethered_left_lea_support" msgid="6605320955858788855">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‎‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎Connected (supports audio sharing), left ‎‏‎‎‏‏‎<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="bluetooth_battery_level_untethered_right_lea_support" msgid="5717356160322149355">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‏‎‏‏‏‏‏‎‏‎‏‏‎Connected (supports audio sharing), right ‎‏‎‎‏‏‎<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="bluetooth_active_media_only_no_battery_level" msgid="71106861912593126">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‏‎‎Active (media only)‎‏‎‎‏‎"</string>
+    <string name="bluetooth_saved_device_lea_support" msgid="7231323139968285768">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‏‏‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎Supports audio sharing‎‏‎‎‏‎"</string>
+    <string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‏‎‏‎Active (media only), left only‎‏‎‎‏‎"</string>
+    <string name="bluetooth_hearing_aid_media_only_right_active" msgid="3854140683042617230">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‏‎‎‎‎‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎Active (media only), right only‎‏‎‎‏‎"</string>
+    <string name="bluetooth_hearing_aid_media_only_left_and_right_active" msgid="1299913413062528417">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‏‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‏‏‎‏‏‏‎‎‎‏‏‎‏‏‎‏‎‎‎‎‏‎Active (media only), left and right‎‏‎‎‏‎"</string>
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‎‎‎‎‎‏‎‏‏‏‎‏‎‎‎‏‏‏‏‎‏‏‎‎‎‏‏‎‎‎Media audio‎‏‎‎‏‎"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎‎‎‏‏‎Phone calls‎‏‎‎‏‎"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‏‎‎File transfer‎‏‎‎‏‎"</string>
@@ -437,9 +448,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‏‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‏‏‎‎‏‏‎Assume apps support modern formats‎‏‎‎‏‎"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎‎‎‎‎‏‎‎‎‎Show transcoding notifications‎‏‎‎‏‎"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‎‎‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎‏‎Disable transcoding cache‎‏‎‎‏‎"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‎Widevine settings‎‏‎‎‏‎"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‎Force L3 fallback‎‏‎‎‏‎"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‎‏‎‏‎‏‏‏‏‎‎‏‎‎‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎Select to force L3 fallback‎‏‎‎‏‎"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎Running services‎‏‎‎‏‎"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‏‏‏‎View and control currently running services‎‏‎‎‏‎"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‏‎WebView implementation‎‏‎‎‏‎"</string>
@@ -619,8 +627,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎Failed to create a new user‎‏‎‎‏‎"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‏‎‎‎‎‏‎‏‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‎Failed to create a new guest‎‏‎‎‏‎"</string>
     <string name="user_nickname" msgid="262624187455825083">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‏‏‏‎‏‏‎Nickname‎‏‎‎‏‎"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‎‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‎‎‏‏‏‏‎The name and picture you choose will be visible to anyone who uses this device.‎‏‎‎‏‎"</string>
     <string name="user_add_user" msgid="7876449291500212468">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‏‏‎‏‎‎‎Add user‎‏‎‎‏‎"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‎‏‎Add guest‎‏‎‎‏‎"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‎‎Remove guest‎‏‎‎‏‎"</string>
@@ -647,8 +654,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‎‎‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‎‏‏‏‏‏‎All activity will be deleted on exit‎‏‎‎‏‎"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‏‏‏‎‎‎‎‎‎‎‏‎‎You can save or delete your activity on exit‎‏‎‎‏‎"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‎‎Reset to delete session activity now, or you can save or delete activity on exit‎‏‎‎‏‎"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎‎‎‏‎‎‎‎‎‏‎‎‎‏‎‏‎‎‎‏‏‎‎‎‎‏‎‎‎‎‎‏‎‎Take a photo‎‏‎‎‏‎"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎Choose an image‎‏‎‎‏‎"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‎‎‎‏‎‏‎‏‎Select photo‎‏‎‎‏‎"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‎‏‎‎‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎‎‎‎‏‎Too many incorrect attempts. This device\'s data will be deleted.‎‏‎‎‏‎"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‏‏‎‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‏‎‎Too many incorrect attempts. This user will be deleted.‎‏‎‎‏‎"</string>
@@ -688,8 +693,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‏‎Ethernet disconnected.‎‏‎‎‏‎"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‏‎‎‎‏‏‏‎‏‏‎Ethernet.‎‏‎‎‏‎"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎No calling.‎‏‎‎‏‎"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‏‏‎‏‏‏‎‎‎Choose a profile picture‎‏‎‎‏‎"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎Default user icon‎‏‎‎‏‎"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎‎‎‏‎‏‎‏‎‏‎‎‎Physical keyboard‎‏‎‎‏‎"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‎‎‏‎‎Choose keyboard layout‎‏‎‎‏‎"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‏‏‎‏‎Default‎‏‎‎‏‎"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index a221d11..1903c6b 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -36,7 +36,7 @@
     <string name="wifi_security_none" msgid="7392696451280611452">"Ninguna"</string>
     <string name="wifi_security_wep" msgid="1413627788581122366">"WEP"</string>
     <string name="wifi_security_wpa" msgid="1072450904799930636">"WPA-Personal"</string>
-    <string name="wifi_security_wpa2" msgid="4038267581230425543">"WPA2 Personal"</string>
+    <string name="wifi_security_wpa2" msgid="4038267581230425543">"WPA2-Personal"</string>
     <string name="wifi_security_wpa_wpa2" msgid="946853615482465986">"WPA/WPA2-Personal"</string>
     <string name="wifi_security_eap" msgid="6179633834446852269">"WPA/WPA2/WPA3-Enterprise"</string>
     <string name="wifi_security_eap_wpa" msgid="6189023812330549957">"WPA-Enterprise"</string>
@@ -106,13 +106,35 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activo; solo oído izquierdo"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activo; solo oído derecho"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activo; oídos izquierdo y derecho"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audio multimedia"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Llamadas telefónicas"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferencia de archivos"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Dispositivo de entrada"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Acceso a Internet"</string>
-    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Permitir acc. a hist. de llam. y cont."</string>
-    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Se usará la inf. para anuncios de llamadas y otras funciones"</string>
+    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Acceso a contactos e historial de llamadas"</string>
+    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Se usará la información para anuncios de llamadas y más"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Compartir conexión a Internet"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Mensajes de texto"</string>
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Acceso a SIM"</string>
@@ -169,7 +191,7 @@
     <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"Aplicaciones eliminadas"</string>
     <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Aplicaciones y usuarios eliminados"</string>
     <string name="data_usage_ota" msgid="7984667793701597001">"Actualizaciones del sistema"</string>
-    <string name="tether_settings_title_usb" msgid="3728686573430917722">"Conexión a red por USB"</string>
+    <string name="tether_settings_title_usb" msgid="3728686573430917722">"Conexión mediante USB"</string>
     <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Hotspot portátil"</string>
     <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Conexión Bluetooth"</string>
     <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Compartir conexión"</string>
@@ -264,7 +286,7 @@
     <string name="bugreport_in_power" msgid="8664089072534638709">"Acceso directo para informes de errores"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Muestra un botón en el menú de encendido para realizar un informe de errores"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"Permanecer activo"</string>
-    <string name="keep_screen_on_summary" msgid="1510731514101925829">"La pantalla nunca quedará inactiva mientras el dispositivo se esté cargando."</string>
+    <string name="keep_screen_on_summary" msgid="1510731514101925829">"La pantalla nunca quedará inactiva mientras el dispositivo se esté cargando"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Registro de Bluetooth HCI"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Capturar paquetes de Bluetooth (activa/desactiva el Bluetooth después de cambiar esta configuración)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"Desbloqueo de OEM"</string>
@@ -305,7 +327,7 @@
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Desactivado"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automático"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"Nombre de host del proveedor de DNS privado"</string>
-    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Ingresa el host del proveedor de DNS"</string>
+    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Ingresa el nombre de host del proveedor de DNS"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"No se pudo establecer conexión"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Muestra opciones de certificación de pantalla inalámbrica"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumenta el nivel de registro Wi-Fi y se muestra por SSID RSSI en el selector de Wi-Fi"</string>
@@ -411,7 +433,7 @@
     <string name="enable_freeform_support" msgid="7599125687603914253">"Habilitar ventanas de forma libre"</string>
     <string name="enable_freeform_support_summary" msgid="1822862728719276331">"Permite la compatibilidad con ventanas de forma libre experimentales."</string>
     <string name="local_backup_password_title" msgid="4631017948933578709">"Contraseñas"</string>
-    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Tus copias de seguridad de escritorio no están protegidas por contraseña."</string>
+    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Tus copias de seguridad de escritorio no están protegidas por contraseña"</string>
     <string name="local_backup_password_summary_change" msgid="1707357670383995567">"Presiona para cambiar o quitar la contraseña de las copias de seguridad completas de tu escritorio."</string>
     <string name="local_backup_password_toast_success" msgid="4891666204428091604">"Nueva contraseña de copia de seguridad definida"</string>
     <string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"La nueva contraseña y la de confirmación no coinciden."</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Suponer que las apps admiten formatos modernos"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificaciones de transcodificación"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Inhabilitar caché de transcodificación"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Parámetros de configuración de Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forzar resguardo de nivel 3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Seleccionar para forzar un resguardo de nivel 3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"En ejecución"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver y controlar servicios actuales en ejecución"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string>
@@ -491,7 +510,7 @@
     <string name="battery_info_status_full_charged" msgid="3536054261505567948">"Carga completa"</string>
     <string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Se detuvo la carga"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string>
-    <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlada por la configuración restringida"</string>
+    <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Función controlada por configuración restringida"</string>
     <string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Con permiso"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"No permitida"</string>
@@ -555,7 +574,7 @@
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Esta tablet"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Conector de la bocina"</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>
     <string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"No se pudo crear el usuario nuevo"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"No se pudo crear un nuevo invitado"</string>
     <string name="user_nickname" msgid="262624187455825083">"Sobrenombre"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Cualquier persona que use este dispositivo podrá ver el nombre y la imagen que elijas."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Agregar usuario"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Agregar invitado"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Quitar invitado"</string>
@@ -630,7 +648,7 @@
     <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Restablecer"</string>
     <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Quitar"</string>
     <string name="guest_resetting" msgid="7822120170191509566">"Restableciendo invitado…"</string>
-    <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"¿Quieres restablecer la sesión de invitado?"</string>
+    <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"¿Restablecer la sesión de invitado?"</string>
     <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Esta acción comenzará una nueva sesión de invitado y borrará todas las apps y los datos de la sesión actual."</string>
     <string name="guest_exit_dialog_title" msgid="1846494656849381804">"¿Salir del modo de invitado?"</string>
     <string name="guest_exit_dialog_message" msgid="1743218864242719783">"Esta acción borrará todas las apps y los datos de la sesión de invitado actual."</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Cuando salgas, se borrará toda la actividad"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Puedes guardar o borrar la actividad cuando salgas"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Restablece la sesión para eliminar la actividad ahora; o guarda o borra la actividad cuando salgas"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Tomar una foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Elegir una imagen"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Seleccionar foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Hubo demasiados intentos incorrectos. Se borrarán los datos de este dispositivo."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Hubo demasiados intentos incorrectos. Se borrará este usuario."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desconectada"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Sin llamadas."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Elige una foto de perfil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Ícono de usuario predeterminado"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Teclado físico"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Elige el diseño de teclado"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Predeterminada"</string>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index 5046194..1489e5f 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -186,11 +186,11 @@
   </string-array>
   <string-array name="select_logd_size_summaries">
     <item msgid="409235464399258501">"Desactivado"</item>
-    <item msgid="4195153527464162486">"64 K/búfer registro"</item>
-    <item msgid="7464037639415220106">"256 K/búfer registro"</item>
-    <item msgid="8539423820514360724">"1 M/búfer registro"</item>
-    <item msgid="1984761927103140651">"4 M/búfer registro"</item>
-    <item msgid="2983219471251787208">"8 MB por búfer de registro"</item>
+    <item msgid="4195153527464162486">"64 K/búfer de registro"</item>
+    <item msgid="7464037639415220106">"256 K/búfer de registro"</item>
+    <item msgid="8539423820514360724">"1 M/búfer de registro"</item>
+    <item msgid="1984761927103140651">"4 M/búfer de registro"</item>
+    <item msgid="2983219471251787208">"8 MB/búfer de registro"</item>
   </string-array>
   <string-array name="select_logpersist_titles">
     <item msgid="704720725704372366">"Desactivado"</item>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index f6beab9..29b29b6 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activo, solo oído izquierdo"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activo, solo oído derecho"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activo, oídos izquierdo y derecho"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audio multimedia"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Llamadas de teléfono"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferencia de archivos"</string>
@@ -257,14 +279,14 @@
     <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Emparejando dispositivo…"</string>
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"No se ha podido emparejar el dispositivo. El código QR no era correcto o el dispositivo no estaba conectado a la misma red."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Dirección IP y puerto"</string>
-    <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Escanea el código QR"</string>
+    <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Escanear código QR"</string>
     <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Empareja un dispositivo mediante Wi‑Fi escaneando un código QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Conéctate a una red Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, depuración, desarrollo"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Acceso directo a informe de errores"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Muestra un botón en el menú de encendido para crear un informe de errores"</string>
-    <string name="keep_screen_on" msgid="1187161672348797558">"Pantalla siempre encendida al cargar"</string>
-    <string name="keep_screen_on_summary" msgid="1510731514101925829">"La pantalla nunca entra en modo de suspensión si el dispositivo se está cargando"</string>
+    <string name="keep_screen_on" msgid="1187161672348797558">"Pantalla activa"</string>
+    <string name="keep_screen_on_summary" msgid="1510731514101925829">"La pantalla nunca entra en modo Suspensión si el dispositivo se está cargando"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Habilitar registro de Bluetooth HCI"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Capturar paquetes de Bluetooth (después de cambiar esta opción, desactiva y activa el Bluetooth)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"Desbloqueo de OEM"</string>
@@ -313,7 +335,7 @@
     <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Si este modo está habilitado, es posible que la dirección MAC del dispositivo cambie cada vez que se conecte a una red que tenga habilitada la aleatorización de MAC."</string>
     <string name="wifi_metered_label" msgid="8737187690304098638">"Medida"</string>
     <string name="wifi_unmetered_label" msgid="6174142840934095093">"No medida"</string>
-    <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaños del búfer de registro"</string>
+    <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaños de los búferes de registro"</string>
     <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Elige el tamaño del Logger por búfer"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"¿Borrar almacenamiento continuo del registrador?"</string>
     <string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"Cuando ya no supervisamos la actividad con el registrador de forma continua, estamos obligados a borrar los datos del registrador almacenados en el dispositivo."</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Considerar que las aplicaciones admiten formatos modernos"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificaciones de transcodificación"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Inhabilitar almacenamiento en caché para transcodificaciones"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Ajustes de Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forzar respaldo a L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecciona para forzar el respaldo a L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Servicios en ejecución"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Consulta y controla los servicios en ejecución"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string>
@@ -498,9 +517,9 @@
     <string name="install_other_apps" msgid="3232595082023199454">"Instalar aplicaciones desconocidas"</string>
     <string name="home" msgid="973834627243661438">"Página principal de ajustes"</string>
   <string-array name="battery_labels">
-    <item msgid="7878690469765357158">"0%"</item>
-    <item msgid="8894873528875953317">"50%"</item>
-    <item msgid="7529124349186240216">"100%"</item>
+    <item msgid="7878690469765357158">"0 %"</item>
+    <item msgid="8894873528875953317">"50 %"</item>
+    <item msgid="7529124349186240216">"100 %"</item>
   </string-array>
     <string name="charge_length_format" msgid="6941645744588690932">"Hace <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="remaining_length_format" msgid="4310625772926171089">"Tiempo restante: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
@@ -555,7 +574,7 @@
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Esta tablet"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altavoz base"</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>
     <string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"No se ha podido crear el usuario"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"No se ha podido crear un nuevo invitado"</string>
     <string name="user_nickname" msgid="262624187455825083">"Apodo"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Cualquier persona que use este dispositivo podrá ver el nombre y la imagen que elijas."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Añadir usuario"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Añadir invitado"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Quitar invitado"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Toda la actividad se eliminará cuando salgas"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Puedes guardar o eliminar tu actividad al salir"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Restablece la sesión para eliminar la actividad ahora, o guarda o borra la actividad al salir"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Hacer foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Seleccionar una imagen"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Seleccionar foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Ha habido demasiados intentos fallidos. Los datos de este dispositivo se eliminarán."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Ha habido demasiados intentos fallidos. Este usuario se eliminará."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Conexión Ethernet desconectada."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Sin llamadas."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Elige una imagen de perfil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Icono de usuario predeterminado"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Teclado físico"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Elige el diseño del teclado"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Predeterminado"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index b6b9132..9f77bd9 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiivne, ainult vasak"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiivne, ainult parem"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiivne, vasak ja parem"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Meediaheli"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonikõned"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Failiedastus"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Oleta, et rakendused toetavad kaasaegseid vorminguid"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Kuva transkodeerimise märguanded"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Transkodeerimise vahemälu keelamine"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine\'i seaded"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Sundtaane tasemele L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Valige sundtaandeks tasemele L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Käitatud teenused"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Praegu käitatud teenuste vaatamine ja juhtimine"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView\' rakendamine"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Uue kasutaja loomine ebaõnnestus"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Uue külalise loomine ei õnnestunud"</string>
     <string name="user_nickname" msgid="262624187455825083">"Hüüdnimi"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Nimi ja pilt, mille valite, on nähtavad kõigile, kes seda seadet kasutavad."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Lisa kasutaja"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Lisa külaline"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Eemalda külaline"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Kõik tegevused kustutatakse väljumisel"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Võite tegevused väljumisel salvestada või kustutada."</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Seansi tegevuste kohe kustutamiseks lähtestage; või salvestage või kustutage need väljumisel."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Pildistage"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Valige pilt"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Valige foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Liiga palju valesid katseid. Selle seadme andmed kustutatakse."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Liiga palju valesid katseid. See kasutaja kustutatakse."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Etherneti-ühendus on katkestatud."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Helistamine pole võimalik."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Valige profiilipilt"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Vaikekasutajaikoon"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Füüsiline klaviatuur"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Klaviatuuri paigutuse valimine"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Vaikimisi"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index b61388d..05f3ac7 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktibo, ezkerrekoa soilik"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktibo, eskuinekoa soilik"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktibo, ezkerreko eta eskuineko audifonoak"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Euskarriaren audioa"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefono-deiak"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Fitxategi-transferentzia"</string>
@@ -403,7 +425,7 @@
     <string name="show_all_anrs" msgid="9160563836616468726">"Erakutsi atzeko planoko ANRak"</string>
     <string name="show_all_anrs_summary" msgid="8562788834431971392">"Erakutsi aplikazioak ez erantzutearen (ANR) leihoa atzeko planoan dabiltzan aplikazioen kasuan"</string>
     <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Erakutsi jakinarazpenen kanalen abisuak"</string>
-    <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bistaratu abisuak aplikazioek baliozko kanalik gabeko jakinarazpenak argitaratzean"</string>
+    <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bistaratu abisuak aplikazioek kanal baliodunik gabeko jakinarazpenak argitaratzean"</string>
     <string name="force_allow_on_external" msgid="9187902444231637880">"Behartu aplikazioak onartzera kanpoko memorian"</string>
     <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Aplikazioek kanpoko memorian idatz dezakete, ezarritako balioak kontuan izan gabe"</string>
     <string name="force_resizable_activities" msgid="7143612144399959606">"Behartu jardueren tamaina doitu ahal izatera"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Arduratu aplikazioek formatu modernoak onartzeaz"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Erakutsi transkodetze-jakinarazpenak"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Desgaitu transkodetze-cachea"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-ren ezarpenak"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Behartu L3 ordezko aukera"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Hautatu L3 ordezko aukera behartu nahi duzun"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Abian diren zerbitzuak"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ikusi eta kontrolatu une honetan abian diren zerbitzuak"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView inplementazioa"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Ezin izan da sortu erabiltzailea"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Ezin izan da sortu beste gonbidatu bat"</string>
     <string name="user_nickname" msgid="262624187455825083">"Goitizena"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Gailua erabiltzen duten guztiek ikusi ahal izango dituzte aukeratu dituzun izena eta irudia."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Gehitu erabiltzaile bat"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Gehitu gonbidatu bat"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Kendu gonbidatua"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Irtetean, jarduera guztiak ezabatuko dira"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Irtetean, jarduerak gorde edo ezabatu egin ditzakezu"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Berrezarri saioa jarduerak ezabatzeko; bestela, aukeratu jarduerak irtetean gordetzea edo ezabatzea"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Atera argazki bat"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Aukeratu irudi bat"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Hautatu argazki bat"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Saiakera oker gehiegi egin dituzu. Gailu honetako datuak ezabatu egingo dira."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Saiakera oker gehiegi egin dituzu. Erabiltzailea ezabatu egingo da."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet bidezko konexioa eten da."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Deirik ez."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Aukeratu profileko argazki bat"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Erabiltzaile lehenetsiaren ikonoa"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Teklatu fisikoa"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Aukeratu teklatuaren diseinua"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Lehenetsia"</string>
diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml
index 28826bf..5834982 100644
--- a/packages/SettingsLib/res/values-fa/arrays.xml
+++ b/packages/SettingsLib/res/values-fa/arrays.xml
@@ -153,13 +153,13 @@
     <item msgid="1333279807604675720">"استریو"</item>
   </string-array>
   <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_titles">
-    <item msgid="1241278021345116816">"بهینه‌شده برای کیفیت صوت (۹۹۰ کیلوبیت در ثانیه/۹۰۹ کیلوبیت در ثانیه)"</item>
+    <item msgid="1241278021345116816">"بهینه‌شده برای کیفیت صدا (۹۹۰ کیلوبیت درثانیه/۹۰۹ کیلوبیت درثانیه)"</item>
     <item msgid="3523665555859696539">"کیفیت متعادل صوت و اتصال (۶۶۰ کیلوبیت در ثانیه/۶۰۶ کیلوبیت در ثانیه)"</item>
     <item msgid="886408010459747589">"بهینه‌شده برای کیفیت اتصال (۳۳۰ کیلوبیت در ثانیه/۳۰۳ کیلوبیت در ثانیه)"</item>
     <item msgid="3808414041654351577">"بهترین حالت (نرخ بیت تطبیقی)"</item>
   </string-array>
   <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries">
-    <item msgid="804499336721569838">"بهینه‌شده برای کیفیت صوت"</item>
+    <item msgid="804499336721569838">"بهینه‌شده برای کیفیت صدا"</item>
     <item msgid="7451422070435297462">"کیفیت متعادل صوت و اتصال"</item>
     <item msgid="6173114545795428901">"بهینه‌شده برای کیفیت اتصال"</item>
     <item msgid="4349908264188040530">"بهترین حالت (نرخ بیت تطبیقی)"</item>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 7938bc6..658fb0f 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"فعال، فقط چپ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"فعال، فقط راست"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"فعال، چپ و راست"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"رسانه صوتی"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"تماس‌های تلفنی"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"انتقال فایل"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"فرض شود برنامه‌ها از قالب‌های مدرن پشتیبانی می‌کنند"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"نمایش اعلان‌های تراتبدیل"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"غیرفعال کردن حافظه پنهان تراتبدیل"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"‏تنظیمات Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"‏اجرای اجباری «بازگشت به L3»"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"‏برای اجرای اجباری «بازگشت به L3»، انتخاب کنید"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"سرویس‌های در حال اجرا"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"مشاهده و کنترل سرویس‌های در حال اجرای فعلی"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"اجرای وب‌نما"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"کاربر جدید ایجاد نشد"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"مهمان جدید ایجاد نشد"</string>
     <string name="user_nickname" msgid="262624187455825083">"نام مستعار"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"نام و تصویری که انتخاب می‌کنید برای همه افرادی که از این دستگاه استفاده می‌کنند قابل‌مشاهده خواهد بود."</string>
     <string name="user_add_user" msgid="7876449291500212468">"افزودن کاربر"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"افزودن مهمان"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"حذف مهمان"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"همه فعالیت‌ها هنگام خروج حذف خواهد شد"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"می‌توانید فعالیتتان را هنگام خروج ذخیره یا حذف کنید"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"برای حذف فعالیت جلسه در این لحظه، بازنشانی کنید یا می‌توانید فعالیت را هنگام خروج ذخیره یا حذف کنید"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"عکس گرفتن"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"انتخاب تصویر"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"انتخاب عکس"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"تلاش‌های نادرست بسیار زیادی انجام شده است. داده‌های این دستگاه حذف خواهد شد."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"تلاش‌های اشتباه بسیار زیادی انجام شده است. این کاربر حذف خواهد شد."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"اترنت قطع شد."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"اترنت."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"تماس گرفته نشود."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"انتخاب عکس نمایه"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"نماد کاربر پیش‌فرض"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"صفحه‌کلید فیزیکی"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"انتخاب جانمایی صفحه‌کلید"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"پیش‌فرض"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 3ee7dc1..14b1701e 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiivinen, vain vasen"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiivinen, vain oikea"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiivinen, vasen ja oikea"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Median ääni"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Puhelut"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Tiedostonsiirto"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Oleta, että sovellukset tukevat nykyaikaisia formaatteja"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Näytä transkoodausilmoituksia"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Poista välimuistin transkoodaus käytöstä"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-asetukset"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Pakota L3-varavaihtoehto"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Pakota L3-varavaihtoehto valitsemalla tämä"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Käynnissä olevat palvelut"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Tarkastele ja hallitse käynnissä olevia palveluita"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-käyttöönotto"</string>
@@ -539,7 +558,7 @@
     <string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Anna sovelluksen lisätä herätyksiä ja ajoittaa kiireellisiä tapahtumia. Näin sovellus voi toimia taustalla, mikä voi kuluttaa enemmän virtaa.\n\nIlman tätä lupaa sovelluksen ajoittamat herätykset ja aikaan perustuvat tapahtumat eivät toimi."</string>
     <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ajoitus, herätys, muistutus, kello"</string>
     <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ota käyttöön"</string>
-    <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ota Älä häiritse ‑tila käyttöön"</string>
+    <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Laita Älä häiritse ‑tila päälle"</string>
     <string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ei koskaan"</string>
     <string name="zen_interruption_level_priority" msgid="5392140786447823299">"Vain tärkeät"</string>
     <string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -597,7 +616,7 @@
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Rajoitettu profiili"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Lisätäänkö uusi käyttäjä?"</string>
     <string name="user_add_user_message_long" msgid="1527434966294733380">"Voit jakaa tämän laitteen muiden kanssa luomalla lisää käyttäjiä. Kullakin käyttäjällä on oma tilansa, jota he voivat muokata esimerkiksi omilla sovelluksilla ja taustakuvilla. Käyttäjät voivat myös muokata laiteasetuksia, kuten Wi‑Fi-asetuksia, jotka vaikuttavat laitteen kaikkiin käyttäjiin.\n\nKun lisäät uuden käyttäjän, hänen tulee määrittää oman tilansa asetukset.\n\nKaikki käyttäjät voivat päivittää muiden käyttäjien sovelluksia. Saavutettavuusominaisuuksia tai ‑palveluita ei välttämättä siirretä uudelle käyttäjälle."</string>
-    <string name="user_add_user_message_short" msgid="3295959985795716166">"Kun lisäät uuden käyttäjän, hänen tulee määrittää oman tilansa asetukset.\n\nKaikki käyttäjät voivat päivittää sovelluksia muille käyttäjille."</string>
+    <string name="user_add_user_message_short" msgid="3295959985795716166">"Kun lisäät uuden käyttäjän, hänen tulee valita oman tilansa asetukset.\n\nKaikki käyttäjät voivat päivittää sovelluksia muille käyttäjille."</string>
     <string name="user_grant_admin_title" msgid="5157031020083343984">"Tehdäänkö tästä käyttäjästä järjestelmänvalvoja?"</string>
     <string name="user_grant_admin_message" msgid="1673791931033486709">"Järjestelmänvalvojilla on enemmän oikeuksia kuin muilla. Järjestelmänvalvoja voi hallinnoida kaikkia käyttäjiä, päivittää tai nollata tämän laitteen, muokata asetuksia, nähdä asennetut sovellukset ja antaa tai peruuttaa järjestelmänvalvojan oikeudet muilta."</string>
     <string name="user_grant_admin_button" msgid="5441486731331725756">"Muuta järjestelmänvalvojaksi"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Uuden käyttäjän luominen epäonnistui"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Uutta vierasta ei voitu luoda"</string>
     <string name="user_nickname" msgid="262624187455825083">"Lempinimi"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Valitsemasi nimi ja kuva näkyvät kaikille tämän laitteen käyttäjille."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Lisää käyttäjä"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Lisää vieras"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Poista vieras"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Kaikki toiminta poistetaan uloskirjaamisen aikana"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Voit tallentaa tai poistaa toiminnan poistuessasi"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Nollaa poistaaksesi istunnon toiminnan nyt, tai voit tallentaa tai poistaa toimintaa poistuessasi"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Ota kuva"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Valitse kuva"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Valitse kuva"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Liian monta virheellistä yritystä. Laitteen data poistetaan."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Liian monta virheellistä yritystä. Tämä käyttäjä poistetaan."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet on irrotettu."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Ei puheluita."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Valitse profiilikuva"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Oletuskäyttäjäkuvake"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fyysinen näppäimistö"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Valitse näppäimistöasettelu"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Oletus"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 95a4e62..e4ae145 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Actif, gauche seulement"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Active, droite seulement"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Active, gauche et droite"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Paramètres audio du support"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Appels téléphoniques"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transfert de fichier"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Présumer que les applications prennent en charge les formats modernes"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Afficher les notifications de transcodage"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Désactiver le cache de transcodage"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Paramètres de Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forcer le traitement de secours L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Sélectionnez pour forcer le traitement de secours L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Services en cours d\'exécution"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Afficher et contrôler les services en cours d\'exécution"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Mise en œuvre WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Impossible de créer un utilisateur"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Impossible de créer un nouvel invité"</string>
     <string name="user_nickname" msgid="262624187455825083">"Pseudo"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Le nom et l\'image que vous choisissez seront visibles par toute personne qui utilise cet appareil."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Ajouter un utilisateur"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Ajouter un invité"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Supprimer l\'invité"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Toute l\'activité sera supprimée à la fin de la session"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Vous pouvez enregistrer ou supprimer votre activité à la fin"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Réinitialisez pour supprimer l\'activité de la session maintenant, ou vous pouvez enregistrer ou supprimer l\'activité à la fin de la session"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Prendre une photo"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Sélectionner une image"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Sélectionnez une photo"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Trop de tentatives incorrectes. Les données de cet appareil seront supprimées."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Trop de tentatives incorrectes. Cet utilisateur sera supprimé."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet déconnecté."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Aucun appel."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Choisir une photo de profil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Icône d\'utilisateur par défaut"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Clavier physique"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Sélectionner disposition du clavier"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Par défaut"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index e26e8b0..09b40ac 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -106,13 +106,35 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Actif, gauche uniquement"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Actif, droit uniquement"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Actifs, gauche et droit"</string>
-    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Multimédia"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
+    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audio multimédia"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Appels téléphoniques"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transfert de fichiers"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Périphérique d\'entrée"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Accès Internet"</string>
     <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Autoriser l\'accès aux contacts et à l\'historique des appels"</string>
-    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Les infos seront utilisées pour les notifications d\'appels, entre autres"</string>
+    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Ces infos seront utilisées pour les notifications d\'appels, entre autres"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Partage de connexion Internet"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"SMS"</string>
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Accès à la SIM"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Supposer que les applications sont compatibles avec les formats modernes"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Afficher les notifications de transcodage"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Désactiver la cache de transcodage"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Paramètres Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forcer le retour en arrière vers le niveau 3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Sélectionner pour forcer le retour en arrière vers le niveau 3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Services en cours d\'exécution"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Afficher et contrôler les services en cours d\'exécution"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Mise en œuvre WebView"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Utiliser les langues du système"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Échec de l\'ouverture des paramètres de l\'application <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>."</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Ce mode de saisie est susceptible d\'enregistrer le texte que vous saisissez, y compris vos données personnelles, telles que les mots de passe et les numéros de carte de paiement. Il provient de l\'application <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Voulez-vous vraiment l\'activer ?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Remarque : Après un redémarrage, vous ne pouvez pas lancer cette application tant que vous n\'avez pas déverrouillé votre téléphone."</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Remarque : Après un redémarrage, cette application ne peut pas démarrer tant que vous n\'avez pas déverrouillé votre téléphone."</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"État de l\'enregistrement IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Enregistré"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Non enregistré"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Échec de la création d\'un utilisateur"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Impossible de créer un profil invité"</string>
     <string name="user_nickname" msgid="262624187455825083">"Pseudo"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Toute personne utilisant cet appareil pourra voir votre nom ainsi que votre photo."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Ajouter un utilisateur"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Ajouter un invité"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Supprimer l\'invité"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Toute l\'activité sera supprimée à la fin de la session"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Vous pouvez enregistrer ou supprimer l\'activité en quittant"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Réinitialisez la session pour supprimer immédiatement l\'activité. Vous pourrez aussi l\'enregistrer ou la supprimer en quittant la session."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Prendre une photo"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Choisir une image"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Sélectionner une photo"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Trop de tentatives incorrectes. Les données de cet appareil vont être supprimées."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Trop de tentatives incorrectes. Ce compte utilisateur va être supprimé."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet déconnecté"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Pas d\'appels."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Choisissez une photo de profil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Icône de l\'utilisateur par défaut"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Clavier physique"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Sélectionner disposition du clavier"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Par défaut"</string>
diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml
index 5d6ef37..e6d098f 100644
--- a/packages/SettingsLib/res/values-gl/arrays.xml
+++ b/packages/SettingsLib/res/values-gl/arrays.xml
@@ -153,13 +153,13 @@
     <item msgid="1333279807604675720">"Estéreo"</item>
   </string-array>
   <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_titles">
-    <item msgid="1241278021345116816">"Optimizado para a calidade do audio (990 kb/s ou 909 kb/s)"</item>
+    <item msgid="1241278021345116816">"Optimizado para a calidade de audio (990 kb/s ou 909 kb/s)"</item>
     <item msgid="3523665555859696539">"Calidade equilibrada do audio e da conexión (660 kb/s ou 606 kb/s)"</item>
     <item msgid="886408010459747589">"Optimizado para a calidade da conexión (330 kb/s ou 303 kb/s)"</item>
     <item msgid="3808414041654351577">"Máxima (taxa de bits adaptable)"</item>
   </string-array>
   <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries">
-    <item msgid="804499336721569838">"Optimizado para a calidade do audio"</item>
+    <item msgid="804499336721569838">"Optimizado para a calidade de audio"</item>
     <item msgid="7451422070435297462">"Calidade equilibrada do audio e da conexión"</item>
     <item msgid="6173114545795428901">"Optimizado para a calidade da conexión"</item>
     <item msgid="4349908264188040530">"Máxima (taxa de bits adaptable)"</item>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 53332bf..db40500 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activo (só o esquerdo)"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activo (só o dereito)"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activos (o esquerdo e o dereito)"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audio multimedia"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Chamadas telefónicas"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferencia de ficheiros"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Considerar que as aplicacións admiten formatos modernos"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificacións de transcodificación"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Desactivar memoria caché para a transcodificación"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Configuración de Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forzar alternativa a L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Seleccionar para forzar a alternativa a L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Servizos en uso"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Comproba e controla os servizos actualmente en uso"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Usar idiomas do sistema"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Non se puido abrir a configuración de <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Este método de introdución de texto pode recompilar todo o que escribas, incluídos os datos persoais como os contrasinais e os números de tarxetas de crédito. Provén da aplicación <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Queres usar este método de introdución de texto?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Nota: Tras un reinicio, non se pode iniciar esta aplicación ata que desbloquees o teléfono"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Nota: Tras un reinicio, non se poderá iniciar esta aplicación ata que se desbloquee o teléfono"</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"Estado de rexistro de IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Rexistrado"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Non rexistrado"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Non se puido crear un novo usuario"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Produciuse un erro ao crear o convidado"</string>
     <string name="user_nickname" msgid="262624187455825083">"Alcume"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Calquera que use este dispositivo poderá ver o nome e a imaxe que selecciones."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Engadir usuario"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Engadir convidado"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Quitar convidado"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Eliminarase toda a actividade ao saír"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Podes gardar ou eliminar a túa actividade ao saír"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Restablece a sesión para eliminar a actividade agora, ou ben gárdaa ou elimínaa ao saír"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Tirar foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Escoller imaxe"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Seleccionar foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Realizaches demasiados intentos incorrectos. Eliminaranse os datos deste dispositivo."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Realizaches demasiados intentos incorrectos. Eliminarase este usuario."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Desconectouse a Ethernet."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Sen chamadas."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Escolle unha imaxe do perfil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Icona do usuario predeterminado"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Teclado físico"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Seleccionar deseño do teclado"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Predeterminado"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index e792e9f..c1eeca5 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"સક્રિય, માત્ર ડાબું"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"સક્રિય, માત્ર જમણું"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"સક્રિય, ડાબું અને જમણું બન્ને"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"મીડિયા ઑડિયો"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ફોન કૉલ"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ફાઇલ સ્થાનાંતરણ"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"ધારો કે ઍપ આધુનિક ફૉર્મેટ પર કામ કરે છે"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ફૉર્મેટ બદલવાની પ્રક્રિયાના નોટિફિકેશન બતાવો"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ફૉર્મેટ બદલવાની પ્રક્રિયાની કૅશ મેમરી બંધ કરો"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevineના સેટિંગ"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 ફૉલબૅકને ફરજ પાડો"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 ફૉલબૅકને ફરજ પાડવા માટે પસંદ કરો"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ચાલુ સેવાઓ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"હાલમાં ચાલતી સેવાઓ જુઓ અને નિયંત્રિત કરો"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView અમલીકરણ"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"નવો વપરાશકર્તા બનાવવામાં નિષ્ફળ"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"નવી અતિથિ બનાવવામાં નિષ્ફળ રહ્યાં"</string>
     <string name="user_nickname" msgid="262624187455825083">"ઉપનામ"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"તમે જે નામ અને ચિત્ર પસંદ કરો, તેને આ ડિવાઇસનો ઉપયોગ કરનારી કોઈપણ વ્યક્તિ જોઈ શકશે."</string>
     <string name="user_add_user" msgid="7876449291500212468">"વપરાશકર્તા ઉમેરો"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"અતિથિ ઉમેરો"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"અતિથિને કાઢી નાખો"</string>
@@ -644,11 +662,9 @@
     <string name="guest_exit_button" msgid="5774985819191803960">"અતિથિ મોડમાંથી બહાર નીકળો"</string>
     <string name="guest_reset_button" msgid="2515069346223503479">"અતિથિ સત્ર રીસેટ કરો"</string>
     <string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"અતિથિ મોડમાંથી બહાર નીકળો"</string>
-    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"બહાર નીકળતી વખતે તમામ પ્રવૃત્તિ ડિલીટ કરવામાં આવશે"</string>
+    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"બહાર નીકળતી વખતે તમામ ઍક્ટિવિટી ડિલીટ કરવામાં આવશે"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"બહાર નીકળતી વખતે તમે પ્રવૃત્તિ સાચવી કે ડિલીટ કરી શકશો"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"સત્રની પ્રવૃત્તિ હમણાં ડિલીટ કરવા માટે રીસેટ કરો અથવા બહાર નીકળતી વખતે તમે પ્રવૃત્તિ સાચવી કે ડિલીટ કરી શકશો"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ફોટો લો"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"છબી પસંદ કરો"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ફોટો પસંદ કરો"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"ઘણા બધા ખોટા પ્રયત્નો. આ ડિવાઇસનો ડેટા ડિલીટ કરવામાં આવશે."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"ઘણા બધા ખોટા પ્રયત્નો. આ વપરાશકર્તાને ડિલીટ કરવામાં આવશે."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ઇથરનેટ ડિસ્કનેક્ટ થયું."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ઇથરનેટ."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"કોઈ કૉલિંગ નહીં."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"પ્રોફાઇલ ફોટો પસંદ કરો"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ડિફૉલ્ટ વપરાશકર્તાનું આઇકન"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"ભૌતિક કીબોર્ડ"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"કીબોર્ડ લેઆઉટ પસંદ કરો"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ડિફૉલ્ટ"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index ae9e29a..a5b3c88 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -106,16 +106,38 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"सिर्फ़ बाईं तरफ़ वाला चालू है"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"सिर्फ़ दाईं तरफ़ वाला चालू है"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"बाईं और दाईं तरफ़ वाला चालू है"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"मीडिया ऑडियो"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"फ़ोन कॉल"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"फ़ाइल स्थानांतरण"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"इनपुट डिवाइस"</string>
-    <string name="bluetooth_profile_pan" msgid="1006235139308318188">"इंटरनेट ऐक्सेस"</string>
+    <string name="bluetooth_profile_pan" msgid="1006235139308318188">"इंटरनेट का ऐक्सेस"</string>
     <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"संपर्क और कॉल इतिहास का ऐक्सेस दें"</string>
-    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"जानकारी का इस्तेमाल कॉल की सूचना देने वगैरह के लिए होगा"</string>
+    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"इस जानकारी का इस्तेमाल, कॉल की सूचना देने और दूसरी चीज़ों के लिए किया जाएगा"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"इंटरनेट कनेक्शन साझाकरण"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"लेख संदेश"</string>
-    <string name="bluetooth_profile_sap" msgid="8304170950447934386">"सिम ऐक्सेस"</string>
+    <string name="bluetooth_profile_sap" msgid="8304170950447934386">"सिम का ऐक्सेस"</string>
     <string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"एचडी ऑडियो: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
     <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"एचडी ऑडियो"</string>
     <string name="bluetooth_profile_hearing_aid" msgid="2607867572569689732">"कान की मशीनें"</string>
@@ -180,7 +202,7 @@
     <string name="launch_defaults_some" msgid="3631650616557252926">"कुछ डिफ़ॉल्‍ट सेट हैं"</string>
     <string name="launch_defaults_none" msgid="8049374306261262709">"कोई डिफ़ॉल्‍ट सेट नहीं है"</string>
     <string name="tts_settings" msgid="8130616705989351312">"लेख से बोली सेटिंग"</string>
-    <string name="tts_settings_title" msgid="7602210956640483039">"लिखाई को बोली में बदलने की सुविधा"</string>
+    <string name="tts_settings_title" msgid="7602210956640483039">"लिखे गए शब्दों को सुनने की सुविधा"</string>
     <string name="tts_default_rate_title" msgid="3964187817364304022">"बोलने की दर"</string>
     <string name="tts_default_rate_summary" msgid="3781937042151716987">"बोलने की गति तय करें"</string>
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"पिच"</string>
@@ -264,7 +286,7 @@
     <string name="bugreport_in_power" msgid="8664089072534638709">"गड़बड़ी की रिपोर्ट का शॉर्टकट"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"गड़बड़ी की रिपोर्ट लेने के लिए पावर मेन्यू में कोई बटन दिखाएं"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"स्क्रीन को चालू रखें"</string>
-    <string name="keep_screen_on_summary" msgid="1510731514101925829">"चार्ज करते समय स्‍क्रीन कभी भी बंद नहीं होगी"</string>
+    <string name="keep_screen_on_summary" msgid="1510731514101925829">"चार्ज होते समय स्‍क्रीन कभी भी बंद नहीं होगी"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"ब्लूटूथ HCI स्‍नूप लॉग चालू करें"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"ब्लूटूथ पैकेट कैप्चर करें. (यह सेटिंग बदलने के बाद ब्लूटूथ टॉगल करें)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM अनलॉक करें"</string>
@@ -304,8 +326,8 @@
     <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"निजी डीएनएस मोड चुनें"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"बंद"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"अपने-आप"</string>
-    <string name="private_dns_mode_provider" msgid="3619040641762557028">"निजी डीएनएस सेवा देने वाले का होस्टनेम"</string>
-    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"डीएनएस सेवा देने वाले का होस्टनेम डालें"</string>
+    <string name="private_dns_mode_provider" msgid="3619040641762557028">"निजी डीएनएस प्रोवाइडर का होस्टनेम"</string>
+    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"डीएनएस प्रोवाइडर का होस्टनेम डालें"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"कनेक्‍ट नहीं हो सका"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"वायरलेस डिसप्ले सर्टिफ़िकेशन के विकल्प दिखाएं"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"वाई-फ़ाई लॉगिंग लेवल बढ़ाएं, वाई-फ़ाई पिकर में हर SSID के लिए RSSI दिखाएं"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"मानकर चलें कि ऐप्लिकेशन, नए फ़ॉर्मैट के साथ काम करेंगे"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ट्रांसकोडिंग की सूचनाएं दिखाएं"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"कैश को ट्रांसकोड करने की सुविधा बंद करें"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine की सेटिंग"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 फ़ॉलबैक लागू करें"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"कॉन्टेंट पर L3 फ़ॉलबैक लागू करने की सेटिंग चुनें"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"चालू सेवाएं"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"इस समय चल रही सेवाओं को देखें और कंट्रोल करें"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"वेबव्यू लागू करें"</string>
@@ -618,9 +637,8 @@
     <string name="creating_new_guest_dialog_message" msgid="1114905602181350690">"नया मेहमान खाता बनाया जा रहा है…"</string>
     <string name="add_user_failed" msgid="4809887794313944872">"नया उपयोगकर्ता जोड़ा नहीं जा सका"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"नया मेहमान खाता नहीं बनाया जा सका"</string>
-    <string name="user_nickname" msgid="262624187455825083">"प्रचलित नाम"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="user_nickname" msgid="262624187455825083">"निकनेम"</string>
+    <string name="edit_user_info_message" msgid="6677556031419002895">"आपकी चुनी गई फ़ोटो और नाम, उन सभी लोगों को दिखेगा जो इस डिवाइस का इस्तेमाल करते हैं."</string>
     <string name="user_add_user" msgid="7876449291500212468">"उपयोगकर्ता जोड़ें"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"मेहमान जोड़ें"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"मेहमान को हटाएं"</string>
@@ -631,7 +649,7 @@
     <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"हटाएं"</string>
     <string name="guest_resetting" msgid="7822120170191509566">"मेहमान के तौर पर ब्राउज़ करने का सेशन रीसेट किया जा रहा है…"</string>
     <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"क्या मेहमान मोड के मौजूदा सेशन को रीसेट करना है?"</string>
-    <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"ऐसा करने पर, मेहमान के तौर पर ब्राउज़ करने का एक नया सेशन शुरू हो जाएगा. साथ ही, मौजूदा सेशन का डेटा और इस्तेमाल किए जा रहे ऐप्लिकेशन को मिटा दिया जाएगा"</string>
+    <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"इससे मेहमान के तौर पर ब्राउज़ करने का नया सेशन शुरू हो जाएगा. इसके अलावा, इस्तेमाल किए जा रहे ऐप्लिकेशन पर की गई गतिविधि और मौजूदा सेशन का डेटा मिटा दिया जाएगा"</string>
     <string name="guest_exit_dialog_title" msgid="1846494656849381804">"मेहमान मोड से बाहर निकलना है?"</string>
     <string name="guest_exit_dialog_message" msgid="1743218864242719783">"इससे, मेहमान मोड के मौजूदा सेशन का डेटा और इसमें इस्तेमाल हो रहे ऐप्लिकेशन मिट जाएंगे"</string>
     <string name="grant_admin" msgid="4323199171790522574">"हां, इन्हें एडमिन बनाएं"</string>
@@ -644,11 +662,9 @@
     <string name="guest_exit_button" msgid="5774985819191803960">"मेहमान मोड से बाहर निकलें"</string>
     <string name="guest_reset_button" msgid="2515069346223503479">"मेहमान मोड के सेशन को रीसेट करें"</string>
     <string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"मेहमान मोड से बाहर निकलें"</string>
-    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"बाहर निकलने पर, सारी गतिविधि मिट जाएगी"</string>
+    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"बाहर निकलने पर, सभी गतिविधियां मिट जाएंगी"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"बाहर निकलने पर, गतिविधि को मिटाया या सेव किया जा सकता है"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"सेशन की गतिविधि को अभी मिटाने के लिए, रीसेट करें. इसके अलावा, बाहर निकलने पर, गतिविधि को मिटाया या सेव किया जा सकता है"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"फ़ोटो खींचें"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"कोई इमेज चुनें"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"फ़ोटो चुनें"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"कई बार गलत कोशिशें की गई हैं. इस डिवाइस का डेटा मिटा दिया जाएगा."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"कई बार गलत कोशिशें की गई हैं. इस उपयोगकर्ता को मिटा दिया जाएगा."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ईथरनेट डिस्‍कनेक्‍ट किया गया."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ईथरनेट."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"वॉइस कॉल की सुविधा उपलब्ध नहीं है."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"प्रोफ़ाइल फ़ोटो चुनें"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"उपयोगकर्ता के लिए डिफ़ॉल्ट आइकॉन"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"फ़िज़िकल कीबोर्ड"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"कीबोर्ड का लेआउट चुनें"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"डिफ़ॉल्ट"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 1e12d96..a504c9a0 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -106,7 +106,29 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo lijevo"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, samo desno"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, lijevo i desno"</string>
-    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Medijski zvuk"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
+    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvuk medija"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonski pozivi"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Prijenos datoteke"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Ulazni uređaj"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Pretpostavi da aplikacije podržavaju moderne formate"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Prikaži obavijesti o konvertiranju"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Onemogući predmemoriju za konvertiranje"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Postavke Widevinea"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Prisilna L3 zamjena"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Odaberite za prisilnu L3 zamjenu"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Pregledajte i kontrolirajte trenutačno pokrenute usluge"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementacija WebViewa"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Upotrijebi jezike sustava"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Otvaranje postavki za aplikaciju <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> nije uspjelo"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Ovaj način unosa možda može prikupljati sav tekst koji unosite, uključujući osobne podatke poput zaporki i brojeva kreditnih kartica. To omogućuje aplikacija <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Upotrijebiti taj način unosa?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Napomena: ova se aplikacija ne može pokrenuti nakon ponovnog pokretanja dok ne otključate telefon"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Napomena: nakon ponovnog pokretanja, ovu aplikaciju ne možete pokrenuti dok ne otključate telefon"</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"Stanje registracije IMS-a"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Registrirano"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Nije registrirano"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Izrada novog korisnika nije uspjela"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Izrada novog gosta nije uspjela"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nadimak"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Ime i slika koje odaberete bit će vidljivi svima koji koriste ovaj uređaj."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Dodajte korisnika"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Dodajte gosta"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Ukloni gosta"</string>
@@ -641,14 +659,12 @@
     <string name="guest_exit_dialog_message_non_ephemeral" msgid="223385323235719442">"Možete spremiti aktivnosti iz ove sesije ili izbrisati sve aplikacije i podatke"</string>
     <string name="guest_exit_clear_data_button" msgid="3425812652180679014">"Izbriši"</string>
     <string name="guest_exit_save_data_button" msgid="3690974510644963547">"Spremi"</string>
-    <string name="guest_exit_button" msgid="5774985819191803960">"Izlaz iz načina rada za goste"</string>
+    <string name="guest_exit_button" msgid="5774985819191803960">"Izađi iz načina rada za goste"</string>
     <string name="guest_reset_button" msgid="2515069346223503479">"Poništi gostujuću sesiju"</string>
     <string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"Izlaz iz gostujuće sesije"</string>
-    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Sve će se aktivnosti izbrisati na izlasku"</string>
+    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Sve će se aktivnosti izbrisati po izlasku"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Svoje aktivnosti možete spremiti ili izbrisati na izlasku"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Poništite da odmah izbrišete aktivnost sesije. Inače je možete spremiti ili izbrisati na izlasku."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Fotografiraj"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Odaberi sliku"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Odabir slike"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Previše netočnih pokušaja. S uređaja će se izbrisati podaci."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Previše netočnih pokušaja. Ovaj će se korisnik izbrisati."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Prekinuta je veza s ethernetom."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Bez poziva."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Odaberite profilnu sliku"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Ikona zadanog korisnika"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fizička tipkovnica"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Odaberite raspored tipkovnice"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Zadano"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 0e5b1de..3838d7d0 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -106,7 +106,29 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktív, csak bal"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktív, csak jobb"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktív, bal és jobb"</string>
-    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Média audió"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
+    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Médiahang"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonhívások"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Fájlátvitel"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Beviteli eszköz"</string>
@@ -263,9 +285,9 @@
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"Hibabejelentési gomb"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Gomb megjelenítése a bekapcsolási menüben hibajelentés készítéséhez"</string>
-    <string name="keep_screen_on" msgid="1187161672348797558">"Nem kapcsolódik ki"</string>
+    <string name="keep_screen_on" msgid="1187161672348797558">"Ne kapcsoljon ki"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"A képernyő soha nem kapcsol ki töltés során"</string>
-    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Bluetooth HCI snoop napló engedélyezése"</string>
+    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Bluetooth HCI kémlelésnapló engedélyezése"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Bluetooth-csomagok rögzítése. (Bluetooth be-, illetve kikapcsolása a beállítás módosítása után)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM-feloldás"</string>
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"A rendszerbetöltő feloldásának engedélyezése"</string>
@@ -341,7 +363,7 @@
     <string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Bekapcsolja az Enhanced Connectivity funkciót."</string>
     <string name="enable_terminal_title" msgid="3834790541986303654">"Helyi végpont"</string>
     <string name="enable_terminal_summary" msgid="2481074834856064500">"Végalkalmazás engedélyezése a helyi rendszerhéj eléréséhez"</string>
-    <string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP ellenőrzés"</string>
+    <string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP-ellenőrzés"</string>
     <string name="hdcp_checking_dialog_title" msgid="7691060297616217781">"HDCP-ellenőrzés beállítása"</string>
     <string name="debug_debugging_category" msgid="535341063709248842">"Hibakeresés"</string>
     <string name="debug_app" msgid="8903350241392391766">"Hibakereső alkalmazás kiválasztása"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Annak feltételezése, hogy az alkalmazások támogatják a modern formátumokat"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Átkódolási értesítések megjelenítése"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Átkódolási gyorsítótár kikapcsolása"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-beállítások"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 fallback kényszerítése"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Jelölje ki az L3 fallback kényszerítéséhez"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Futó szolgáltatások"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"A jelenleg futó szolgáltatások megtekintése és vezérlése"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-megvalósítás"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Az új felhasználó létrehozása sikertelen"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Az új vendég létrehozása nem sikerült"</string>
     <string name="user_nickname" msgid="262624187455825083">"Becenév"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"A kiválasztott név és kép mindenki számára látható lesz, aki ezt az eszközt használja."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Felhasználó hozzáadása"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Vendég hozzáadása"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Vendég munkamenet eltávolítása"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"A kilépéssel minden tevékenység törlődik"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"A kilépéskor mentheti vagy törölheti a tevékenységeket"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Visszaállítással azonnal törölheti, illetve kilépéskor mentheti vagy törölheti a tevékenységeket"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Fotó készítése"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Kép kiválasztása"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Fotó kiválasztása"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Túl sok sikertelen próbálkozás. A rendszer törli az adatokat az eszközről."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Túl sok sikertelen próbálkozás. A rendszer törli ezt a felhasználót."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet leválasztva."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Nem kezdeményezhet hanghívást."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Profilkép választása"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Alapértelmezett felhasználó ikonja"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fizikai billentyűzet"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Billentyűzetkiosztás kiválasztása"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Alapértelmezett"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 6e0dd49..0069175 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -106,12 +106,34 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ակտիվ, միայն ձախ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ակտիվ, միայն աջ"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ակտիվ, ձախ և աջ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Մեդիա աուդիո"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Հեռախոսազանգեր"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Ֆայլերի փոխանցում"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Ներմուծման սարք"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Ինտերնետի հասանելիություն"</string>
-    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Տրամադրել կոնտակտները և զանգերի պատմութ․"</string>
+    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Կոնտակտների և զանգերի մատյանի հասանելիություն"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Տվյալները կօգտագործվեն զանգերի ծանուցումների համար և այլն"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Ինտերնետ կապի տարածում"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"SMS հաղորդագրություններ"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Ենթադրել, որ հավելվածներն աջակցում են ժամանակակից ձևաչափեր"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Ցույց տալ տրանսկոդավորման մասին ծանուցումները"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Անջատել տրանսկոդավորման քեշը"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-ի կարգավորումներ"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 պահուստային տարբերակի ստիպողական գործարկում"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Ընտրեք՝ L3 պահուստային տարբերակը ստիպողաբար գործարկելու համար"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Աշխատող ծառայություններ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Դիտել և վերահսկել ընթացիկ աշխատող ծառայությունները"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ծառայություն"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Չհաջողվեց ստեղծել նոր օգտատեր"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Չհաջողվեց նոր հյուր ստեղծել"</string>
     <string name="user_nickname" msgid="262624187455825083">"Կեղծանուն"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Ձեր ընտրած անունն ու նկարը տեսանելի կլինեն այս սարքն օգտագործող բոլոր մարդկանց։"</string>
     <string name="user_add_user" msgid="7876449291500212468">"Ավելացնել օգտատեր"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Ավելացնել հյուր"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Հեռացնել հյուրին"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Եթե դուրս գաք, ամբողջ պատմությունը կջնջվի"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Դուրս գալիս կարող եք պահել կամ ջնջել ձեր պատմությունը"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Վերակայեք աշխատաշրջանի պատմությունը հիմա կամ պահեք/ջնջեք այն դուրս գալիս"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Լուսանկարել"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Ընտրել պատկեր"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Ընտրեք լուսանկար"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Չափից շատ սխալ փորձեր են արվել։ Այս սարքի տվյալները կջնջվեն։"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Չափից շատ սխալ փորձեր են արվել։ Oգտատիրոջ պրոֆիլը կջնջվի։"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet-ը անջատված է:"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet։"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Զանգել հնարավոր չէ։"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Ընտրեք պրոֆիլի նկար"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Օգտատիրոջ կանխադրված պատկերակ"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Ֆիզիկական ստեղնաշար"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Ընտրեք ստեղնաշարի դասավորությունը"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Կանխադրված"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 8afffaa..6254f7b 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -106,13 +106,35 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktif, hanya kiri"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktif, hanya kanan"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktif, kiri dan kanan"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audio media"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Panggilan telepon"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transfer file"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Perangkat masukan"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Akses Internet"</string>
     <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Izinkan akses ke kontak dan histori panggilan"</string>
-    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Info akan digunakan untuk pengumuman panggilan dan lainnya"</string>
+    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Info akan digunakan untuk pengumuman panggilan dan lain-lain"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Berbagi koneksi internet"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"SMS"</string>
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Akses SIM"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Asumsikan aplikasi mendukung format modern"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Tampilkan notifikasi transcoding"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Nonaktifkan cache transcoding"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Setelan Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Paksa penggantian L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Pilih untuk memaksa penggantian L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Layanan yang sedang berjalan"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Lihat dan kontrol layanan yang sedang berjalan"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Penerapan WebView"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Gunakan bahasa sistem"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Gagal membuka setelan untuk <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Metode masukan ini mungkin dapat mengumpulkan semua teks yang Anda ketik, termasuk data pribadi seperti sandi dan nomor kartu kredit. Metode ini berasal dari aplikasi <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Gunakan metode masukan ini?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Catatan: Setelah boot ulang, aplikasi ini tidak dapat dimulai hingga kunci ponsel dibuka"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Catatan: Setelah perangkat dimulai ulang, aplikasi ini tidak dapat mulai berjalan hingga kunci ponsel dibuka"</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"Status pendaftaran IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Terdaftar"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Tidak terdaftar"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Gagal membuat pengguna baru"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Gagal membuat tamu baru"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nama panggilan"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Nama dan gambar yang Anda pilih dapat dilihat oleh siapa saja yang menggunakan perangkat ini."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Tambahkan pengguna"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Tambahkan tamu"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Hapus tamu"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Semua aktivitas akan dihapus saat Anda keluar"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Anda dapat menyimpan atau menghapus aktivitas saat keluar"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Reset untuk hapus aktivitas sesi sekarang, atau simpan atau hapus aktivitas saat keluar"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Ambil foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Pilih gambar"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Pilih foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Terlalu banyak percobaan yang salah. Data perangkat ini akan dihapus."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Terlalu banyak percobaan yang salah. Pengguna ini akan dihapus."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet terputus."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Tidak ada panggilan."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Pilih foto profil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Ikon pengguna default"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Keyboard fisik"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Pilih tata letak keyboard"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Default"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index b322665..0f57670 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Virkt, aðeins vinstra"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Virkt, aðeins hægra"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Virkt, vinstra og hægra"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Hljóð efnis"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Símtöl"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Skráaflutningur"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Gera ráð fyrir að forrit styðji nútímasnið"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Sýna umkóðunartilkynningar"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Slökkva á skyndiminni umkóðunar"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Stillingar Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Þvinga fram L3 varaleið"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Veldu til að þvinga fram L3 varaleið"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Þjónustur í gangi"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Skoða og stjórna þjónustum í gangi"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Innleiðing WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Ekki tókst að stofna nýjan notanda"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Ekki tókst að búa til nýjan gest"</string>
     <string name="user_nickname" msgid="262624187455825083">"Gælunafn"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Allir sem nota þetta tæki geta séð nafnið og myndina sem þú velur."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Bæta notanda við"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Bæta gesti við"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Fjarlægja gest"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Öllum aðgerðum verður eytt þegar lotu er lokað"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Þú getur vistað eða eytt aðgerðum þegar þú lokar"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Endurstilltu til að eyða aðgerðum lotu núna, eða vistaðu eða eyddu aðgerðum þegar þú lokar"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Taka mynd"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Velja mynd"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Velja mynd"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Of margar rangar tilraunir. Gögnum tækisins verður eytt."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Of margar rangar tilraunir. Þessum notanda verður eytt."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet aftengt."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Engin símtöl."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Veldu prófílmynd"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Tákn sjálfgefins notanda"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Vélbúnaðarlyklaborð"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Veldu lyklaskipan"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Sjálfgefið"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 43aded0..9502374 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Attiva, solo sinistra"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Attiva, solo destra"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Attivo, destra e sinistra"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audio multimediale"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonate"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Trasferimento file"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Presupponi che le app supportino i formati moderni"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Mostra notifiche relative alla transcodifica"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Disattiva memorizzazione nella cache per la transcodifica"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Impostazioni Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forza riserva L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Seleziona per forzare riserva L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Servizi in esecuzione"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualizza e controlla i servizi attualmente in esecuzione"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementazione di WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Creazione nuovo utente non riuscita"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Impossibile creare un nuovo ospite"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Il nome e l\'immagine che scegli saranno visibili a chiunque utilizzi questo dispositivo."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Aggiungi utente"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Aggiungi ospite"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Rimuovi ospite"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Quando esci verrà eliminata tutta l\'attività"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Quando esci puoi salvare o eliminare la tua attività"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Reimposta la sessione per eliminare subito l\'attività, oppure salvala o eliminala quando esci"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Scatta una foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Scegli un\'immagine"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Seleziona la foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Troppi tentativi sbagliati. I dati del dispositivo verranno eliminati."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Troppi tentativi sbagliati. Questo utente verrà eliminato."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Connessione Ethernet annullata."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Chiamate non disponibili."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Scegli un\'immagine del profilo"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Icona dell\'utente predefinito"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Tastiera fisica"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Scegli layout tastiera"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Predefinito"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 990d9ac..dea8ca3 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"פועל: שמאל בלבד"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"פועל: ימין בלבד"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"פועל: ימין ושמאל"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"אודיו של מדיה"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"שיחות טלפון"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"העברת קבצים"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"הנחת העבודה היא שאפליקציות תומכות בפורמטים מודרניים"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"הצגת התראות לגבי המרת קידוד"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"השבתת השמירה של המרת הקידוד במטמון"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"‏הגדרות Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"‏חלופה ל-Force L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"‏בחירה להפעלת חלופה ל-Force L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"שירותים פועלים"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"הצגת השירותים הפועלים כעת ושליטה בהם"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"‏יישום WebView"</string>
@@ -555,7 +574,7 @@
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"הטאבלט הזה"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"הרמקול של אביזר העגינה"</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>
     <string name="media_transfer_this_phone" msgid="7194341457812151531">"הטלפון הזה"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"לא ניתן היה ליצור משתמש חדש"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"יצירת אורח חדש נכשלה"</string>
     <string name="user_nickname" msgid="262624187455825083">"כינוי"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"השם והתמונה שייבחרו יהיו גלויים לכל מי שמשתמש במכשיר הזה."</string>
     <string name="user_add_user" msgid="7876449291500212468">"הוספת משתמש"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"הוספת אורח"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"הסרת אורח"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"כל הפעילות תימחק ביציאה"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"אפשר לשמור או למחוק את הפעילות שלך ביציאה"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"ניתן לאפס כדי למחוק את הפעילות מהסשן כעת, או לשמור או למחוק את הפעילות ביציאה"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"צילום תמונה"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"לבחירת תמונה"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"בחירת תמונה"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"נעשו יותר מדי ניסיונות שגויים. הנתונים במכשיר יימחקו."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"נעשו יותר מדי ניסיונות שגויים. המשתמש הזה יימחק."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"אתרנט מנותק."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"אתרנט."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"אין שיחות."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"בחירה של תמונת פרופיל"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"סמל המשתמש שמוגדר כברירת מחדל"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"מקלדת פיזית"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"בחירה של פריסת המקלדת"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ברירת מחדל"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 7029f8c..c7f3c0a 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"有効、左のみ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"有効、右のみ"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"有効、左と右"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"メディアの音声"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"電話"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ファイル転送"</string>
@@ -145,7 +167,7 @@
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"キャンセル"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"ペア設定により、接続時に連絡先や通話履歴へのアクセスが許可されます。"</string>
     <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>をペアに設定できません。"</string>
-    <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"PINまたはパスキーが正しくないため、<xliff:g id="DEVICE_NAME">%1$s</xliff:g>をペアに設定できませんでした。"</string>
+    <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"PIN またはパスキーが正しくないため、<xliff:g id="DEVICE_NAME">%1$s</xliff:g> をペアに設定できませんでした。"</string>
     <string name="bluetooth_pairing_device_down_error_message" msgid="2554424863101358857">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>と通信できません。"</string>
     <string name="bluetooth_pairing_rejected_error_message" msgid="5943444352777314442">"ペア設定が<xliff:g id="DEVICE_NAME">%1$s</xliff:g>に拒否されました。"</string>
     <string name="bluetooth_talkback_computer" msgid="3736623135703893773">"コンピュータ"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"アプリによる最新形式のサポートを想定"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"コード変換に関する通知の表示"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"コード変換のキャッシュを無効にする"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine の設定"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 代替の強制"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 代替を強制するかどうか選択します"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"実行中のサービス"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"現在実行中のサービスを表示して制御する"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView の実装"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"新しいユーザーを作成できませんでした"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"新しいゲストを作成できませんでした"</string>
     <string name="user_nickname" msgid="262624187455825083">"ニックネーム"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"選択した名前と写真は、このデバイスを使用しているすべてのユーザーが見ることができます。"</string>
     <string name="user_add_user" msgid="7876449291500212468">"ユーザーを追加"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"ゲストを追加"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"ゲストを削除"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"終了時にすべてのアクティビティが削除されます"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"終了時にアクティビティを保存、削除できます"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"アクティビティは、リセットして今すぐ削除するか、終了時に保存または削除できます"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"写真を撮る"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"画像を選択"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"写真を選択"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"間違えた回数が上限を超えました。このデバイスのデータが削除されます。"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"間違えた回数が上限を超えました。このユーザーが削除されます。"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"イーサネット接続を解除しました。"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"イーサネット。"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"通話なし。"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"プロフィール写真の選択"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"デフォルト ユーザー アイコン"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"物理キーボード"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"キーボード レイアウトの選択"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"デフォルト"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 461f211..a94a401 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"აქტიური, მხოლოდ მარცხნივ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"აქტიური, მხოლოდ მარჯვნივ"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"აქტიური, მარცხნივ და მარჯვნივ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"მედია აუდიო"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"სატელეფონო ზარები"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ფაილების გადაცემა"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"დაშვება, რომ აპებს აქვთ თანამედროვე ფორმატების მხარდაჭერა"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ტრანსკოდირების შეტყობინებების ჩვენება"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ტრანსკოდირების ქეშის გათიშვა"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine პარამეტრები"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"აირჩიეთ force L3 fallback"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"მიმდინარე სერვისები"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ამჟამად მოქმედი სერვისების ნახვა და მართვა"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView რეალიზაცია"</string>
@@ -555,7 +574,7 @@
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ეს ტაბლეტი"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"დინამიკის სამაგრი"</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>
     <string name="media_transfer_this_phone" msgid="7194341457812151531">"ეს ტელეფონი"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"ახალი მომხმარებლის შექმნა ვერ მოხერხდა"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"ახალი სტუმრის შექმნა ვერ მოხერხდა"</string>
     <string name="user_nickname" msgid="262624187455825083">"მეტსახელი"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"სახელი და სურათი, რომელსაც აირჩევთ, ხილვადი იქნება ამ მოწყობილობით მოსარგებლე ნებისმიერი პირისთვის."</string>
     <string name="user_add_user" msgid="7876449291500212468">"მომხმარებლის დამატება"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"სტუმრის დამატება"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"სტუმრის ამოშლა"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"გასვლისას ყველა აქტივობა წაიშლება"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"გასვლისას შეგიძლიათ შეინახოთ ან წაშალოთ თქვენი აქტივობა"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"გადააყენეთ სესიის აქტივობის ახლა წასაშლელად. შენახვა/წაშლა გასვლისასაც შეიძლება."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ფოტოს გადაღება"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"აირჩიეთ სურათი"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ფოტოს არჩევა"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"დაფიქსირდა ზედმეტად ბევრი არასწორი მცდელობა. შედეგად, ამ მოწყობილობის მონაცემები წაიშლება."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"დაფიქსირდა ზედმეტად ბევრი არასწორი მცდელობა. შედეგად, ეს მომხმარებელი წაიშლება."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet კავშირი შეწყვეტილია."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"ზარების გარეშე."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"აირჩიეთ პროფილის სურათი"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"მომხმარებლის ნაგულისხმევი ხატულა"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"ფიზიკური კლავიატურა"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"აირჩიე კლავიატურის განლაგება"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ნაგულისხმევი"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 77d9f8b..1c80ad4 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -106,7 +106,29 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Тек сол жағы қосулы"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Тек оң жағы қосулы"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Екеуі де қосулы"</string>
-    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Meдиа аудиосы"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
+    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Mультимeдиа дыбысы"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Телефон қоңыраулары"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Файл жіберу"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Кіріс құрылғысы"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Қолданбалар қазіргі заманғы форматтарды қолдайды делік"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Қайта кодтау хабарландыруларын көрсету"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Қайта кодтау кэшін өшіру"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine параметрлері"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 баламасын мәжбүрлі түрде пайдалану"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 баламасын мәжбүрлі түрде пайдалануды таңдайсыз."</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Қосылып тұрған қызметтер"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Қазір істеп тұрған қызметтерді көру және басқару"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView қызметі"</string>
@@ -483,7 +502,7 @@
     <string name="battery_info_status_charging" msgid="4279958015430387405">"Зарядталуда"</string>
     <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Жылдам зарядтау"</string>
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Баяу зарядталуда"</string>
-    <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Сымсыз зарядталуда"</string>
+    <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Сымсыз зарядталып жатыр"</string>
     <string name="battery_info_status_charging_dock" msgid="8573274094093364791">"Зарядталып жатыр."</string>
     <string name="battery_info_status_discharging" msgid="6962689305413556485">"Зарядталу орындалып жатқан жоқ"</string>
     <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Құрылғы жалғанған, бірақ зарядталып жатқан жоқ."</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Жүйелік тілдерді пайдалану"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> қолданбасы үшін параметрлерді ашу орындалмады"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Бұл енгізу әдісі сіз терген барлық мәтінді, кілтсөз және кредит карта нөмірлері сияқты жеке ақпаратты қоса, жинауы мүмкін. Бұл <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> қолданбасы арқылы жасалады. Осы әдіс қолданылсын ба?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Ескертпе: қайта жүктегеннен кейін, телефонның құлпын ашпайынша, бұл қолданба іске қосылмайды"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Ескертпе: қайта жүктегеннен кейін, телефонның құлпын ашпайынша, бұл қолданба іске қосылмайды."</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"IMS тіркеу күйі"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Тіркелген"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Тіркелмеген"</string>
@@ -555,7 +574,7 @@
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Осы планшет"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Қондыру динамигі"</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>
     <string name="media_transfer_this_phone" msgid="7194341457812151531">"Осы телефон"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Жаңа пайдаланушы жасалмады."</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Жаңа қонақ профилі жасалмады."</string>
     <string name="user_nickname" msgid="262624187455825083">"Лақап ат"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Сіз таңдаған ат пен сурет осы құрылғыны пайдаланатын кез келген адамға көрінетін болады."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Пайда­ланушы қосу"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Қонақ қосу"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Қонақты жою"</string>
@@ -642,13 +660,11 @@
     <string name="guest_exit_clear_data_button" msgid="3425812652180679014">"Жою"</string>
     <string name="guest_exit_save_data_button" msgid="3690974510644963547">"Сақтау"</string>
     <string name="guest_exit_button" msgid="5774985819191803960">"Қонақ режимінен шығу"</string>
-    <string name="guest_reset_button" msgid="2515069346223503479">"Қонақ режимін қалпына келтіру"</string>
+    <string name="guest_reset_button" msgid="2515069346223503479">"Қонақ режимін бастапқы күйге қайтару"</string>
     <string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"Қонақ режимінен шығу"</string>
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Шыққанда барлық әрекет жойылады."</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Шыққанда барлық әрекетті сақтай немесе жоя аласыз."</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Сеанс дерегін жою үшін оны бастапқы күйге қайтарыңыз. Деректі шығар кезде де сақтауға не жоюға болады."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Фотосуретке түсіру"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Сурет таңдау"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Фотосурет таңдау"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Тым көп қате әрекет жасалды. Бұл құрылғының деректері жойылады."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Тым көп қате әрекет жасалды. Бұл пайдаланушы жойылады."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet ажыратылған."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Қоңырау шалу мүмкін емес."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Профиль суретін таңдау"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Әдепкі пайдаланушы белгішесі"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Пернетақта"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Пернетақтаның орналасу ретін таңдау"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Әдепкі"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 7e57b15..23bd55c 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"សកម្ម ខាងឆ្វេងតែប៉ុណ្ណោះ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"សកម្មខាងស្ដាំតែប៉ុណ្ណោះ"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"សកម្មខាងឆ្វេង និងស្ដាំ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"សំឡេង​មេឌៀ"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ការហៅ​ទូរសព្ទ"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ផ្ទេរ​ឯកសារ"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"សន្មតថាកម្មវិធី​អាចប្រើ​ទម្រង់ទំនើបបាន"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"បង្ហាញការជូនដំណឹង​អំពីការបំប្លែងកូដ"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"បិទ​ឃ្លាំងបម្រុង​សម្រាប់​ការបំប្លែងកូដ"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"ការកំណត់ Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"បង្ខំជម្រើសជំនួស L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ជ្រើសរើសដើម្បីបង្ខំជម្រើសជំនួស L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"សេវាកម្ម​កំពុង​ដំណើរការ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"មើល និង​គ្រប់គ្រង​សេវាកម្ម​កំពុង​ដំណើរការ​បច្ចុប្បន្ន"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"ការអនុវត្ត WebView"</string>
@@ -555,7 +574,7 @@
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"ថេប្លេតនេះ"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"ឧបករណ៍បំពងសំឡេងដែលមានជើងភ្ជាប់"</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>
     <string name="media_transfer_this_phone" msgid="7194341457812151531">"ទូរសព្ទនេះ"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"មិន​អាច​បង្កើត​អ្នកប្រើប្រាស់ថ្មី​បានទេ"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"មិនអាចបង្កើតភ្ញៀវថ្មីបានទេ"</string>
     <string name="user_nickname" msgid="262624187455825083">"ឈ្មោះ​ហៅក្រៅ"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"ឈ្មោះ និងរូបភាពដែលអ្នកជ្រើសរើសនឹងអាចមើលឃើញដោយអ្នកគ្រប់គ្នាដែលប្រើឧបករណ៍នេះ។"</string>
     <string name="user_add_user" msgid="7876449291500212468">"បញ្ចូល​អ្នក​ប្រើប្រាស់"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"បញ្ចូល​ភ្ញៀវ"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"ដកភ្ញៀវចេញ"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"សកម្មភាពទាំងអស់នឹងត្រូវលុបនៅពេលចាកចេញ"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"អ្នកអាចរក្សាទុក ឬលុបសកម្មភាពរបស់អ្នកនៅពេលចាកចេញ"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"កំណត់ឡើងវិញ ដើម្បីលុបសកម្មភាពក្នុងវគ្គឥឡូវនេះ ឬអ្នកអាចរក្សាទុកឬលុបសកម្មភាពនៅពេលចាកចេញ"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ថតរូប"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"ជ្រើសរើស​រូបភាព"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ជ្រើសរើស​​រូបថត"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"ដោយសារ​មានការព្យាយាម​ដោះសោ​មិនត្រឹមត្រូវ​ច្រើនដងពេក ទិន្នន័យ​របស់​ឧបករណ៍នេះ​នឹងត្រូវបាន​លុប។"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"ដោយសារមានការព្យាយាមដោះសោមិនត្រឹមត្រូវច្រើនដងពេក អ្នកប្រើប្រាស់នេះនឹងត្រូវបានលុប។"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"បានផ្តាច់អ៊ីសឺរណិត។"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"អ៊ីសឺរណិត។"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"គ្មាន​ការហៅ​ទូរសព្ទទេ​។"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"ជ្រើសរើស​រូបភាព​កម្រង​ព័ត៌មាន"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"រូបអ្នកប្រើប្រាស់លំនាំដើម"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"ក្ដារចុច​រូបវន្ត"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"ជ្រើសរើស​ប្លង់​ក្ដារចុច"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"លំនាំដើម"</string>
diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml
index 39c49a1..1c8112a 100644
--- a/packages/SettingsLib/res/values-kn/arrays.xml
+++ b/packages/SettingsLib/res/values-kn/arrays.xml
@@ -55,11 +55,11 @@
   </string-array>
   <string-array name="hdcp_checking_summaries">
     <item msgid="4045840870658484038">"HDCP ಪರಿಶೀಲನೆಯನ್ನು ಎಂದಿಗೂ ಬಳಸದಿರು"</item>
-    <item msgid="8254225038262324761">"DRM ವಿಷಯಗಳಿಗೆ ಮಾತ್ರ HDCP ಪರೀಕ್ಷಿಸುವಿಕೆಯನ್ನು ಬಳಸು"</item>
+    <item msgid="8254225038262324761">"DRM ಕಂಟೆಂಟ್‌ಗೆ ಮಾತ್ರ HDCP ಪರೀಕ್ಷಿಸುವಿಕೆಯನ್ನು ಬಳಸಿ"</item>
     <item msgid="6421717003037072581">"HDCP ಪರಿಶೀಲನೆಯನ್ನು ಯಾವಾಗಲೂ ಬಳಸು"</item>
   </string-array>
   <string-array name="bt_hci_snoop_log_entries">
-    <item msgid="695678520785580527">"ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ"</item>
+    <item msgid="695678520785580527">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</item>
     <item msgid="6336372935919715515">"ಫಿಲ್ಟರ್ ಮಾಡುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</item>
     <item msgid="2779123106632690576">"ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</item>
   </string-array>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 6737cdc..c636dd5 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ಎಡಕಿವಿಯ ಸಾಧನ ಮಾತ್ರ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ಬಲಕಿವಿಯ ಸಾಧನ ಮಾತ್ರ ಸಕ್ರಿಯವಾಗಿದೆ"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ಎಡ ಮತ್ತು ಬಲಕಿವಿಯ ಸಾಧನಗಳು ಸಕ್ರಿಯವಾಗಿವೆ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"ಮಾಧ್ಯಮ ಆಡಿಯೋ"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ಫೋನ್ ಕರೆಗಳು"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ಫೈಲ್ ವರ್ಗಾವಣೆ"</string>
@@ -115,7 +137,7 @@
     <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"ಮಾಹಿತಿಯನ್ನು ಕರೆ ಪ್ರಕಟಣೆಗಳು ಹಾಗೂ ಇತ್ಯಾದಿಗಳಿಗಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಹಂಚಿಕೊಳ್ಳುವಿಕೆ"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"ಪಠ್ಯ ಸಂದೇಶಗಳು"</string>
-    <string name="bluetooth_profile_sap" msgid="8304170950447934386">"ಸಿಮ್ ಆ್ಯಕ್ಸೆಸ್"</string>
+    <string name="bluetooth_profile_sap" msgid="8304170950447934386">"SIM ಆ್ಯಕ್ಸೆಸ್"</string>
     <string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"HD ಆಡಿಯೋ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
     <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"HD ಆಡಿಯೋ"</string>
     <string name="bluetooth_profile_hearing_aid" msgid="2607867572569689732">"ಶ್ರವಣ ಸಾಧನಗಳು"</string>
@@ -180,7 +202,7 @@
     <string name="launch_defaults_some" msgid="3631650616557252926">"ಕೆಲವು ಡೀಫಾಲ್ಟ್‌ಗಳನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ"</string>
     <string name="launch_defaults_none" msgid="8049374306261262709">"ಡೀಫಾಲ್ಟ್‌ಗಳನ್ನು ಹೊಂದಿಸಲಾಗಿಲ್ಲ"</string>
     <string name="tts_settings" msgid="8130616705989351312">"ಪಠ್ಯದಿಂದ ಧ್ವನಿಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
-    <string name="tts_settings_title" msgid="7602210956640483039">"ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಔಟ್‌ಪುಟ್‌"</string>
+    <string name="tts_settings_title" msgid="7602210956640483039">"ಟೆಕ್ಸ್ಟ್-ಟು-ಸ್ಪೀಚ್ ಔಟ್‌ಪುಟ್‌"</string>
     <string name="tts_default_rate_title" msgid="3964187817364304022">"ಧ್ವನಿಯ ಪ್ರಮಾಣ"</string>
     <string name="tts_default_rate_summary" msgid="3781937042151716987">"ಪಠ್ಯವನ್ನು ಹೇಳಿದ ವೇಗ"</string>
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"ಪಿಚ್"</string>
@@ -264,7 +286,7 @@
     <string name="bugreport_in_power" msgid="8664089072534638709">"ಬಗ್ ವರದಿಯ ಶಾರ್ಟ್‌ಕಟ್‌‌"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"ದೋಷ ವರದಿ ಮಾಡಲು ಪವರ್ ಮೆನುನಲ್ಲಿ ಬಟನ್ ತೋರಿಸು"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"ಎಚ್ಚರವಾಗಿರುವಿಕೆ"</string>
-    <string name="keep_screen_on_summary" msgid="1510731514101925829">"ಚಾರ್ಜ್ ಮಾಡುವಾಗ ಪರದೆಯು ಎಂದಿಗೂ ನಿದ್ರಾವಸ್ಥೆಗೆ ಹೋಗುವುದಿಲ್ಲ"</string>
+    <string name="keep_screen_on_summary" msgid="1510731514101925829">"ಚಾರ್ಜ್ ಮಾಡುತ್ತಿರುವಾಗ ಸ್ಕ್ರೀನ್ ಎಂದಿಗೂ ನಿದ್ರಾವಸ್ಥೆಗೆ ಹೋಗುವುದಿಲ್ಲ"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"ಬ್ಲೂಟೂತ್‌‌ HCI ಸ್ನೂಪ್‌ ಲಾಗ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"ಬ್ಲೂಟೂತ್ ಪ್ಯಾಕೆಟ್‌ಗಳನ್ನು ಕ್ಯಾಪ್ಚರ್‌ ಮಾಡಿ. (ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಿದ ನಂತರ ಬ್ಲೂಟೂತ್ ಟಾಗಲ್ ಮಾಡಿ)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM ಅನ್‌ಲಾಕ್‌ ಮಾಡುವಿಕೆ"</string>
@@ -411,7 +433,7 @@
     <string name="enable_freeform_support" msgid="7599125687603914253">"ಮುಕ್ತಸ್ವರೂಪದ ವಿಂಡೊಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="enable_freeform_support_summary" msgid="1822862728719276331">"ಪ್ರಾಯೋಗಿಕ ಫ್ರೀಫಾರ್ಮ್ ವಿಂಡೊಗಳಿಗೆ ಬೆಂಬಲವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ."</string>
     <string name="local_backup_password_title" msgid="4631017948933578709">"ಡೆಸ್ಕ್‌ಟಾಪ್ ಬ್ಯಾಕಪ್ ಪಾಸ್‌ವರ್ಡ್"</string>
-    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"ಡೆಸ್ಕ್‌ಟಾಪ್‌‌ನ ಪೂರ್ಣ ಬ್ಯಾಕಪ್‌‌ಗಳನ್ನು ಪ್ರಸ್ತುತ ರಕ್ಷಿಸಲಾಗಿಲ್ಲ"</string>
+    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"ಡೆಸ್ಕ್‌ಟಾಪ್‌‌ ಪೂರ್ಣ ಬ್ಯಾಕಪ್‌‌ಗಳನ್ನು ಪ್ರಸ್ತುತ ರಕ್ಷಿಸಲಾಗಿಲ್ಲ"</string>
     <string name="local_backup_password_summary_change" msgid="1707357670383995567">"ಡೆಸ್ಕ್‌ಟಾಪ್‌ನ ಪೂರ್ಣ ಬ್ಯಾಕಪ್‌ಗಳಿಗೆ ಪಾಸ್‌ವರ್ಡ್‌ ಬದಲಾಯಿಸಲು ಅಥವಾ ತೆಗೆದುಹಾಕಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
     <string name="local_backup_password_toast_success" msgid="4891666204428091604">"ಹೊಸ ಬ್ಯಾಕಪ್ ಪಾಸ್‌ವರ್ಡ್‌ ಹೊಂದಿಸಲಾಗಿದೆ"</string>
     <string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"ಹೊಸ ಪಾಸ್‌ವರ್ಡ್‌ ಮತ್ತು ದೃಢೀಕರಣ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿಲ್ಲ"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"ಆ್ಯಪ್‌ಗಳು ಆಧುನಿಕ ಫಾರ್ಮ್ಯಾಟ್‌ಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ ಎಂದು ಊಹಿಸಿ"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ಟ್ರಾನ್ಸ್‌ಕೋಡಿಂಗ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಿ"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ಟ್ರಾನ್ಸ್‌ಕೋಡಿಂಗ್ ಕ್ಯಾಷ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 ಫಾಲ್‌ಬ್ಯಾಕ್"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Force L3 ಫಾಲ್‌ಬ್ಯಾಕ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ರನ್‌ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳು"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ಈಗ ರನ್‌ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ಹೊಂದಿಸಿ"</string>
@@ -597,7 +616,7 @@
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"ನಿರ್ಬಂಧಿಸಿದ ಪ್ರೊಫೈಲ್"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಬೇಕೆ?"</string>
     <string name="user_add_user_message_long" msgid="1527434966294733380">"ನೀವು ಹೆಚ್ಚುವರಿ ಬಳಕೆದಾರರನ್ನು ರಚಿಸುವ ಮೂಲಕ ಇತರ ಜನರ ಜೊತೆಗೆ ಈ ಸಾಧನವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು. ಪ್ರತಿ ಬಳಕೆದಾರರು ತಮ್ಮದೇ ಸ್ಥಳವನ್ನು ಹೊಂದಿರುತ್ತಾರೆ, ಇದರಲ್ಲಿ ಅವರು ತಮ್ಮದೇ ಆ್ಯಪ್‌ಗಳು, ವಾಲ್‌ಪೇಪರ್ ಮತ್ತು ಮುಂತಾದವುಗಳ ಮೂಲಕ ಕಸ್ಟಮೈಸ್ ಮಾಡಿಕೊಳ್ಳಬಹುದು. ಎಲ್ಲರ ಮೇಲೂ ಪರಿಣಾಮ ಬೀರುವಂತೆ ವೈ-ಫೈ ರೀತಿಯ ಸಾಧನ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಕೆದಾರರು ಸರಿಹೊಂದಿಸಬಹುದು.\n\nನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ತಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗೆ ಆ್ಯಪ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು. ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಸೇವೆಗಳು ಹೊಸ ಬಳಕೆದಾರರಿಗೆ ವರ್ಗಾವಣೆ ಆಗದಿರಬಹುದು."</string>
-    <string name="user_add_user_message_short" msgid="3295959985795716166">"ನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ತಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು."</string>
+    <string name="user_add_user_message_short" msgid="3295959985795716166">"ನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ತಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರ ಬಳಕೆದಾರರಿಗಾಗಿ ಆ್ಯಪ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು."</string>
     <string name="user_grant_admin_title" msgid="5157031020083343984">"ಈ ಬಳಕೆದಾರರನ್ನು ನಿರ್ವಾಹಕರನ್ನಾಗಿ ಮಾಡಬೇಕೆ?"</string>
     <string name="user_grant_admin_message" msgid="1673791931033486709">"ನಿರ್ವಾಹಕರು ಇತರ ಬಳಕೆದಾರರಿಗೆ ಇಲ್ಲದ ವಿಶೇಷ ಸೌಲಭ್ಯಗಳನ್ನು ಹೊಂದಿದ್ದಾರೆ. ನಿರ್ವಾಹಕರು ಎಲ್ಲಾ ಬಳಕೆದಾರರನ್ನು ನಿರ್ವಹಿಸಬಹುದು, ಈ ಸಾಧನವನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು ಅಥವಾ ರೀಸೆಟ್ ಮಾಡಬಹುದು, ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಹೊಂದಿಸಬಹುದು, ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾದ ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು ಮತ್ತು ಇತರರಿಗೆ ನಿರ್ವಾಹಕರಿಗೆ ನೀಡಿರುವ ಸೌಲಭ್ಯಗಳನ್ನು ನೀಡಬಹುದು ಅಥವಾ ಹಿಂತೆಗೆದುಕೊಳ್ಳಬಹುದು."</string>
     <string name="user_grant_admin_button" msgid="5441486731331725756">"ನಿರ್ವಾಹಕರನ್ನಾಗಿ ಮಾಡಿ"</string>
@@ -619,14 +638,13 @@
     <string name="add_user_failed" msgid="4809887794313944872">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು ವಿಫಲವಾಗಿದೆ"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"ಹೊಸ ಅತಿಥಿಯನ್ನು ರಚಿಸಲು ವಿಫಲವಾಗಿದೆ"</string>
     <string name="user_nickname" msgid="262624187455825083">"ಅಡ್ಡ ಹೆಸರು"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"ನೀವು ಆಯ್ಕೆಮಾಡಿದ ಹೆಸರು ಮತ್ತು ಚಿತ್ರವನ್ನು ಈ ಸಾಧನವನ್ನು ಬಳಸುವ ಯಾರಾದರೂ ನೋಡಬಹುದು."</string>
     <string name="user_add_user" msgid="7876449291500212468">"ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"ಅತಿಥಿಯನ್ನು ಸೇರಿಸಿ"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"ಅತಿಥಿಯನ್ನು ಮರುಹೊಂದಿಸಿ"</string>
     <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"ಅತಿಥಿ ಬಳಕೆದಾರರನ್ನು ರೀಸೆಟ್ ಮಾಡಬೇಕೆ?"</string>
-    <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಬೇಕೇ?"</string>
+    <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಬೇಕೆ?"</string>
     <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"ರೀಸೆಟ್ ಮಾಡಿ"</string>
     <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"ತೆಗೆದುಹಾಕಿ"</string>
     <string name="guest_resetting" msgid="7822120170191509566">"ಅತಿಥಿ ಬಳಕೆದಾರರ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ರೀಸೆಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"ನಿರ್ಗಮಿಸುವಾಗ ಎಲ್ಲಾ ಚಟುವಟಿಕೆಯನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"ನಿರ್ಗಮಿಸುವಾಗ ನಿಮ್ಮ ಚಟುವಟಿಕೆಯನ್ನು ನೀವು ಉಳಿಸಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"ಸೆಶನ್ ಚಟುವಟಿಕೆಯನ್ನು ಈಗ ಅಳಿಸಲು ರೀಸೆಟ್ ಮಾಡಿ ಅಥವಾ ನಿರ್ಗಮಿಸುವಾಗ ನೀವು ಚಟುವಟಿಕೆಯನ್ನು ಉಳಿಸಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ಫೋಟೋ ತೆಗೆದುಕೊಳ್ಳಿ"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"ಚಿತ್ರವನ್ನು ಆರಿಸಿ"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ಫೋಟೋ ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"ಹಲವಾರು ಬಾರಿ ತಪ್ಪಾಗಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಈ ಸಾಧನದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"ಹಲವಾರು ಬಾರಿ ತಪ್ಪಾಗಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಈ ಬಳಕೆದಾರರನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ಇಥರ್ನೆಟ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ಇಥರ್ನೆಟ್."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"ಕರೆ ಮಾಡಲಾಗುವುದಿಲ್ಲ."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"ಪ್ರೊಫೈಲ್ ಚಿತ್ರವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ಡೀಫಾಲ್ಟ್ ಬಳಕೆದಾರರ ಐಕಾನ್"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಆರಿಸಿ"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ಡೀಫಾಲ್ಟ್"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index be472a1..f193fef 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"활성, 왼쪽만"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"활성, 오른쪽만"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"활성, 왼쪽 및 오른쪽"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"미디어 오디오"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"전화 통화"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"파일 전송"</string>
@@ -145,7 +167,7 @@
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"취소"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"페어링하면 연결 시 연락처 및 통화 기록에 액세스할 수 있습니다."</string>
     <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>와(과) 페어링하지 못했습니다."</string>
-    <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"PIN 또는 패스키가 잘못되어 <xliff:g id="DEVICE_NAME">%1$s</xliff:g>와 페어링하지 못했습니다."</string>
+    <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"PIN 또는 패스키가 잘못되어 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 기기와 페어링할 수 없습니다."</string>
     <string name="bluetooth_pairing_device_down_error_message" msgid="2554424863101358857">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>와(과) 통신할 수 없습니다."</string>
     <string name="bluetooth_pairing_rejected_error_message" msgid="5943444352777314442">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>에서 페어링을 거부했습니다."</string>
     <string name="bluetooth_talkback_computer" msgid="3736623135703893773">"컴퓨터"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"앱이 최신 형식을 지원하는 것으로 가정"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"트랜스코딩 알림 표시"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"트랜스코딩 캐시 사용 중지"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine 설정"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 대체 강제"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 대체를 강제하려면 선택하세요."</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"실행 중인 서비스"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"현재 실행 중인 서비스 보기 및 제어"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 구현"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"새 사용자를 만들지 못함"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"새 게스트 생성 실패"</string>
     <string name="user_nickname" msgid="262624187455825083">"닉네임"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"선택한 이름과 사진이 이 기기를 사용하는 모든 사용자에게 표시됩니다."</string>
     <string name="user_add_user" msgid="7876449291500212468">"사용자 추가"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"게스트 추가"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"게스트 삭제"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"종료하면 모든 활동이 삭제됩니다."</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"종료 시 활동을 저장하거나 삭제할 수 있습니다."</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"지금 재설정하여 활동 세션을 삭제하거나 종료 시 활동을 저장 또는 삭제할 수 있습니다."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"사진 찍기"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"이미지 선택"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"사진 선택"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"잘못된 시도 횟수가 너무 많습니다. 이 기기의 데이터가 삭제됩니다."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"잘못된 시도 횟수가 너무 많습니다. 이 사용자가 삭제됩니다."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"이더넷에서 연결 해제되었습니다."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"이더넷에 연결되었습니다."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"통화 모드가 없습니다."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"프로필 사진 선택하기"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"기본 사용자 아이콘"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"물리적 키보드"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"키보드 레이아웃 선택"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"기본"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 94c0fd1..86426fa 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Иштеп жатат, сол кулак гана"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Жигердүү, оң кулакчын гана"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Жигердүү, сол жана оң кулакчын"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Аудио"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Телефон чалуулар"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Файл алмашуу"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Колдонмолордо заманбап форматтар колдоого алынат"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Транскоддоо билдирмелерин көрсөтүү"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Транскоддоо кешин өчүрүү"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine параметрлери"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 деңгээлин мажбурлап артка кайтаруу"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 деңгээлин мажбурлап артка кайтаруу үчүн тандаңыз"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Иштеп жаткан кызматтар"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Учурда иштеп жаткан кызматтарды көрүп, көзөмөлдөп турасыз"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView кызматы"</string>
@@ -555,7 +574,7 @@
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Ушул планшет"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Док бекети үчүн динамик"</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>
     <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ушул телефон"</string>
@@ -619,18 +638,17 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Жаңы колдонуучу түзүлбөй калды"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Жаңы конок түзүлгөн жок"</string>
     <string name="user_nickname" msgid="262624187455825083">"Ылакап аты"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Сиз тандаган аталыш жана сүрөт ушул түзмөктү колдонгондордун баарына көрүнөт."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Колдонуучу кошуу"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Конок кошуу"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Конокту өчүрүү"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Конок сеансын баштапкы абалга келтирүү"</string>
-    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Конок сеансын баштапкы абалга келтиресизби?"</string>
+    <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Конок сеансын кайра коёсузбу?"</string>
     <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"Конокту өчүрөсүзбү?"</string>
-    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Баштапкы абалга келтирүү"</string>
+    <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Ооба"</string>
     <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Өчүрүү"</string>
     <string name="guest_resetting" msgid="7822120170191509566">"Конок сеансы баштапкы абалга келтирилүүдө…"</string>
-    <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"Конок сеансын баштапкы абалга келтиресизби?"</string>
+    <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"Конок сеансын кайра коёсузбу?"</string>
     <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Бул аракет жаңы конок сеансын баштап, учурдагы сеанстагы бардык колдонмолорду жана алардагы нерселерди жок кылат"</string>
     <string name="guest_exit_dialog_title" msgid="1846494656849381804">"Конок режиминен чыгасызбы?"</string>
     <string name="guest_exit_dialog_message" msgid="1743218864242719783">"Учурдагы конок сеансындагы бардык колдонмолор менен алардагы нерселер өчүп калат"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Чыксаңыз, бардык аракеттер өчүп калат"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Чыгуудан мурун аракеттериңизди сактап же жок кылсаңыз болот"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Сеанстагы аракеттерди азыр өчүрсөңүз болот же чыгып баратып өчүрүп же сактап коюңуз"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Сүрөткө тартуу"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Сүрөт тандаңыз"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Сүрөт тандаңыз"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Өтө көп жолу туура эмес аракет кылынды. Бул түзмөктүн дайындары жок кылынат."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Өтө көп жолу жаңылдыңыз. Бул колдонуучу өчүрүлөт."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet ажырады."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Чалуу жок."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Профилдин сүрөтүн тандоо"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Демейки колдонуучунун сүрөтчөсү"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Аппараттык баскычтоп"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Тергичтин жайылмасын тандоо"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Демейки"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 0368898..ad1529d 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ນຳໃຊ້ຢູ່, ຊ້າຍເທົ່ານັ້ນ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ນຳໃຊ້ຢູ່, ຂວາເທົ່ານັ້ນ"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ນຳໃຊ້ຢູ່, ຊ້າຍ ແລະ ຂວາ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"ສຽງ"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ການໂທ"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ການໂອນຍ້າຍໄຟລ໌"</string>
@@ -219,7 +241,7 @@
     <item msgid="6946761421234586000">"400%"</item>
   </string-array>
     <string name="choose_profile" msgid="343803890897657450">"ເລືອກໂປຣໄຟລ໌"</string>
-    <string name="category_personal" msgid="6236798763159385225">"​ສ່ວນ​ໂຕ"</string>
+    <string name="category_personal" msgid="6236798763159385225">"ສ່ວນຕົວ"</string>
     <string name="category_work" msgid="4014193632325996115">"​ບ່ອນ​ເຮັດ​ວຽກ"</string>
     <string name="category_private" msgid="4244892185452788977">"ສ່ວນຕົວ"</string>
     <string name="category_clone" msgid="1554511758987195974">"ໂຄລນ"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"ສົມມຸດວ່າແອັບຮອງຮັບຮູບແບບສະໄໝໃໝ່"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ສະແດງການແຈ້ງເຕືອນການ​ປ່ຽນ​ຮູບ​ແບບ​ລະ​ຫັດ"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ປິດການນຳໃຊ້ແຄສການ​ປ່ຽນ​ຮູບ​ແບບ​ລະ​ຫັດ"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"ການຕັ້ງຄ່າ Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"ບັງຄັບທາງເລືອກ L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ເລືອກເພື່ອບັງຄັບທາງເລືອກ L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ບໍລິການທີ່ເຮັດວຽກຢູ່"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ເບິ່ງ ແລະ ຈັດການບໍລິການທີ່ກຳລັງເຮັດວຽກຢູ່ໃນປັດຈຸບັນ"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"ການຈັດຕັ້ງປະຕິບັດ WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"ສ້າງຜູ້ໃຊ້ໃໝ່ບໍ່ສຳເລັດ"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"ສ້າງແຂກໃໝ່ບໍ່ສຳເລັດ"</string>
     <string name="user_nickname" msgid="262624187455825083">"ຊື່ຫຼິ້ນ"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"ທຸກຄົນທີ່ໃຊ້ອຸປະກອນນີ້ຈະເຫັນຊື່ ແລະ ຮູບທີ່ທ່ານເລືອກ."</string>
     <string name="user_add_user" msgid="7876449291500212468">"ເພີ່ມຜູ້ໃຊ້"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"ເພີ່ມແຂກ"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"ລຶບແຂກອອກ"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"ການເຄື່ອນໄຫວທັງໝົດຈະຖືກລຶບໃນຕອນອອກ"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"ທ່ານສາມາດບັນທຶກ ຫຼື ລຶບການເຄື່ອນໄຫວຂອງທ່ານໃນຕອນອອກໄດ້"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"ຣີເຊັດເພື່ອລຶບການເຄື່ອນໄຫວເຊດຊັນຕອນນີ້ ຫຼື ທ່ານສາມາດບັນທຶກ ຫຼື ລຶບການເຄື່ອນໄຫວໃນຕອນອອກໄດ້"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ຖ່າຍຮູບ"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"ເລືອກຮູບ"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ເລືອກຮູບ"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"ພະຍາຍາມປົດລັອກບໍ່ສຳເລັດຫຼາຍເທື່ອເກີນໄປ. ຂໍ້ມູນຂອງອຸປະກອນນີ້ຈະຖືກລຶບອອກ."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"ພະຍາຍາມປົດລັອກບໍ່ສຳເລັດຫຼາຍເທື່ອເກີນໄປ. ຜູ້ໃຊ້ນີ້ຈະຖືກລຶບຂໍ້ມູນອອກ."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ອີ​ເທີ​ເນັດ​ຕັດ​ເຊື່ອມ​ຕໍ່​ແລ້ວ."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ອີເທີເນັດ."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"ບໍ່ສາມາດໂທສຽງໄດ້."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"ເລືອກຮູບໂປຣໄຟລ໌"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ໄອຄອນຜູ້ໃຊ້ເລີ່ມຕົ້ນ"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"ແປ້ນພິມພາຍນອກ"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"ເລືອກຮູບແບບແປ້ນພິມ"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ຄ່າເລີ່ມຕົ້ນ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index de0add8..10ef2c4 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -106,7 +106,29 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktyvus, tik kairysis"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktyvus, tik dešinysis"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktyvus, kairysis ir dešinysis"</string>
-    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Laikmenos garsas"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
+    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Medijos garsas"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefono skambučiai"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Failo perkėlimas"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Įvesties įrenginys"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Manoma, kad programos palaiko modernius formatus"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Rodyti perkodavimo pranešimus"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Išjungti talpyklos perkodavimą"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"„Widevine“ nustatymai"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Priverstinai naudoti L3 kaip atsarginį variantą"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Pasirinkite, kad priverstinai naudoti L3 kaip atsarginį variantą"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Vykdomos paslaugos"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Žiūrėti ir valdyti dabar vykdomas paslaugas"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"„WebView“ diegimas"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Nepavyko sukurti naujo naudotojo"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Nepavyko sukurti naujo gesto"</string>
     <string name="user_nickname" msgid="262624187455825083">"Slapyvardis"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Pasirinktas vardas ir nuotrauka bus matomi visiems šio įrenginio naudotojams."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Pridėti naudotoją"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Pridėti svečią"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Pašalinti svečią"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Išėjus iš režimo visa veikla bus ištrinta"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Išeidami galite išsaugoti arba ištrinti savo veiklą"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Nustatykite iš naujo, jei norite ištrinti sesijos veiklą dabar, arba galite išeidami išsaugoti ar ištrinti veiklą"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Fotografuoti"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Pasirinkti vaizdą"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Pasirinkti nuotrauką"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Per daug netinkamų bandymų. Šio įrenginio duomenys bus ištrinti."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Per daug netinkamų bandymų. Šis naudotojas bus ištrintas."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Atsijungta nuo eterneto."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Eternetas."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Nekviečiama."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Pasirinkite profilio nuotrauką"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Numatytojo naudotojo piktograma"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fizinė klaviatūra"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Klaviatūros išdėstymo pasirinkimas"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Numatytasis"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 1d627f37..c52e9dd 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -106,12 +106,34 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ierīce aktīva, tikai kreisā auss"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ierīce aktīva, tikai labā auss"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ierīces aktīvas, kreisā un labā auss"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Multivides audio"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Tālruņa zvani"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Failu pārsūtīšana"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Ievades ierīce"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Piekļuve internetam"</string>
-    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Atļaujiet piekļuvi kontaktpersonām un vēsturei."</string>
+    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Atļaut piekļuvi kontaktpersonām un vēsturei"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Informācija tiks izmantota paziņojumiem par zvaniem u.c."</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Interneta savienojuma koplietošana"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Īsziņas"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Pieņemt, ka lietotnēs tiek atbalstīti moderni formāti"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Rādīt paziņojumus par pārkodēšanu"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Atspējot saglabāšanu kešatmiņā pārkodēšanai"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine iestatījumi"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Aktivizēt L3 atkāpšanos"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Atlasiet, lai aktivizētu L3 atkāpšanos"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktīvie pakalpojumi"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Pašreiz darbojošos pakalpojumu skatīšana un vadība"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ieviešana"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Neizdevās izveidot jaunu lietotāju"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Neizdevās izveidot jaunu viesa profilu"</string>
     <string name="user_nickname" msgid="262624187455825083">"Segvārds"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Jūsu izvēlētais vārds un attēls būs redzams visiem šīs ierīces lietotājiem."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Pievienot lietotāju"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Pievienot viesi"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Noņemt viesi"</string>
@@ -631,7 +649,7 @@
     <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Noņemt"</string>
     <string name="guest_resetting" msgid="7822120170191509566">"Notiek viesa sesijas atiestatīšana…"</string>
     <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"Vai atiestatīt viesa sesiju?"</string>
-    <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Tādējādi tiks sākta jauna viesa sesijas un visas pašreizējās sesijas lietotnes un dati tiks dzēsti"</string>
+    <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Tādējādi tiks sākta jauna viesa sesija un visas pašreizējās sesijas lietotnes un dati tiks dzēsti"</string>
     <string name="guest_exit_dialog_title" msgid="1846494656849381804">"Vai iziet no viesa režīma?"</string>
     <string name="guest_exit_dialog_message" msgid="1743218864242719783">"Tādējādi tiks dzēstas pašreizējās viesa sesijas lietotnes un dati."</string>
     <string name="grant_admin" msgid="4323199171790522574">"Jā, iestatīt kā administratoru"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Izejot tiks dzēstas visas darbības"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Izejot varat saglabāt vai dzēst savas darbības"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Atiestatiet, lai tagad dzēstu sesijas darbības. Izejot varēsiet saglabāt vai dzēst darbības."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Uzņemt fotoattēlu"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Izvēlēties attēlu"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Atlasīt fotoattēlu"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Pārāk daudz nesekmīgu mēģinājumu. Dati šajā ierīcē tiks dzēsti."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Pārāk daudz nesekmīgu mēģinājumu. Šis lietotājs tiks dzēsts."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Pārtraukts savienojums ar tīklu Ethernet."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Tīkls Ethernet"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Zvanīšana nav pieejama."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Profila attēla izvēle"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Noklusējuma lietotāja ikona"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fiziskā tastatūra"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Tastatūras izkārtojuma izvēle"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Noklusējums"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 3bcabd6..554b92e 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активно, само лево"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активно, само десно"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активно, лево и десно"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Звук на аудио/видео"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Телефонски повици"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Пренос на датотека"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Претпостави дека апликациите поддржуваат модерни формати"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Прикажувај известувања за транскодирање"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Оневозможи го кешот на транскодирањето"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Поставки за Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Наметни алтернативно безбедносно ниво L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Изберете за да се наметне алтернативно безбедносно ниво L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Активни услуги"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Погледнете и контролирајте услуги што се моментално активни"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Примена на WebView"</string>
@@ -498,9 +517,9 @@
     <string name="install_other_apps" msgid="3232595082023199454">"Непознати апликации"</string>
     <string name="home" msgid="973834627243661438">"Почетна страница за поставки"</string>
   <string-array name="battery_labels">
-    <item msgid="7878690469765357158">"0%"</item>
-    <item msgid="8894873528875953317">"50%"</item>
-    <item msgid="7529124349186240216">"100%"</item>
+    <item msgid="7878690469765357158">"0 %"</item>
+    <item msgid="8894873528875953317">"50 %"</item>
+    <item msgid="7529124349186240216">"100 %"</item>
   </string-array>
     <string name="charge_length_format" msgid="6941645744588690932">"Пред <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="remaining_length_format" msgid="4310625772926171089">"Преостануваат <xliff:g id="ID_1">%1$s</xliff:g>"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Не успеа да создаде нов корисник"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Не успеа создавањето нов гостин"</string>
     <string name="user_nickname" msgid="262624187455825083">"Прекар"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Името и сликата што ќе ги изберете ќе бидат видливи за секој што го користи уредов."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Додајте корисник"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Додајте гостин"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Отстрани гостин"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Целата активност ќе се избрише при излегувањето"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Може да ја зачувате или избришете вашата активност при излегувањето"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Ресетирајте за да ја избришете активноста на сесијата сега или може да ја зачувате или избришете активноста при излегувањето"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Фотографирајте"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Одберете слика"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Изберете фотографија"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Премногу неточни обиди. Податоците на уредов ќе се избришат."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Премногу погрешни обиди. Корисников ќе се избрише."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Етернетот е исклучен."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Етернет."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Без повици."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Изберете профилна слика"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Икона за стандарден корисник"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Физичка тастатура"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Избери распоред на тастатура"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Стандардно"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index b21d3cf..61bcc44 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"സജീവമാണ്, ഇടത്തേത് മാത്രം"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"സജീവമാണ്, വലത്തേത് മാത്രം"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"സജീവമാണ്, ഇടത്തേതും വലത്തേതും"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"മീഡിയ ഓഡിയോ"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ഫോണ്‍‌ കോളുകൾ"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ഫയൽ കൈമാറൽ"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"ആപ്പുകൾ ആധുനിക ഫോർമാറ്റുകളെ പിന്തുണയ്ക്കുമെന്ന് കരുതുക"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ട്രാൻസ്കോഡ് ചെയ്യൽ അറിയിപ്പുകൾ കാണിക്കുക"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ട്രാൻസ്കോഡ് ചെയ്യൽ കാഷെ പ്രവർത്തനരഹിതമാക്കുക"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"വൈഡ്‌ലൈൻ ക്രമീകരണം"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 ഫോൾബാക്ക് ഫോഴ്‌സ് ചെയ്യുക"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 ഫോൾബാക്ക് ഫോഴ്‌സ് ചെയ്യാൻ തിരഞ്ഞെടുക്കുക"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"പ്രവർത്തിക്കുന്ന സേവനങ്ങൾ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"നിലവിൽ പ്രവർത്തിക്കുന്ന സേവനങ്ങൾ കാണുക, നിയന്ത്രിക്കുക"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView നടപ്പാക്കൽ"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"പുതിയ ഉപയോക്താവിനെ സൃഷ്‌ടിക്കാനായില്ല"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"പുതിയ അതിഥിയെ സൃഷ്‌ടിക്കാനായില്ല"</string>
     <string name="user_nickname" msgid="262624187455825083">"വിളിപ്പേര്"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"നിങ്ങൾ തിരഞ്ഞെടുത്ത പേരും ചിത്രവും ഈ ഉപകരണം ഉപയോഗിക്കുന്ന എല്ലാവർക്കും ദൃശ്യമാകും."</string>
     <string name="user_add_user" msgid="7876449291500212468">"ഉപയോക്താവിനെ ചേർക്കുക"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"അതിഥിയെ ചേർക്കുക"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"അതിഥിയെ നീക്കം ചെയ്യുക"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"പുറത്തുകടക്കുമ്പോൾ എല്ലാ ആക്‌റ്റിവിറ്റിയും ഇല്ലാതാക്കും"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"പുറത്തുകടക്കുമ്പോൾ ആക്‌റ്റിവിറ്റി സംരക്ഷിക്കുകയോ ഇല്ലാതാക്കുകയോ ചെയ്യാം"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"സെഷൻ ആക്‌റ്റിവിറ്റി ഇപ്പോൾ ഇല്ലാതാക്കാൻ റീസെറ്റ് ചെയ്യുക അല്ലെങ്കിൽ പുറത്തുകടക്കുമ്പോൾ ആക്‌റ്റിവിറ്റി സംരക്ഷിക്കുകയോ ഇല്ലാതാക്കുകയോ ചെയ്യാം"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ഒരു ഫോട്ടോ എടുക്കുക"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"ഒരു ചിത്രം തിരഞ്ഞെടുക്കുക"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ഫോട്ടോ തിരഞ്ഞെടുക്കുക"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"ഒരുപാട് തെറ്റായ ശ്രമങ്ങൾ. ഈ ഉപകരണത്തിലെ ഡാറ്റ ഇല്ലാതാക്കപ്പെടും."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"ഒരുപാട് തെറ്റായ ശ്രമങ്ങൾ. ഈ ഉപയോക്താവ് ഇല്ലാതാക്കപ്പെടും."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ഇതർനെറ്റ് വിച്ഛേദിച്ചു."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ഇതർനെറ്റ്."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"വോയ്‌സ് കോൾ ലഭ്യമല്ല."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"പ്രൊഫൈൽ ചിത്രം തിരഞ്ഞെടുക്കുക"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ഡിഫോൾട്ട് ഉപയോക്തൃ ഐക്കൺ"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"ഫിസിക്കൽ കീബോർഡ്"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"കീബോർഡ് ലേഔട്ട് തിരഞ്ഞെടുക്കുക"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ഡിഫോൾട്ട്"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index dbdb694..c2c22e6 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Идэвхтэй, зөвхөн зүүн тал"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Идэвхтэй, зөвхөн баруун тал"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Идэвхтэй, зүүн болон баруун тал"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Медиа аудио"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Утасны дуудлага"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Файл дамжуулалт"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Аппыг орчин үеийн форматыг дэмждэг гэж үздэг"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Хөрвүүлгийн мэдэгдэл харуулах"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Хөрвүүлгийн завсрын санах ойг идэвхгүй болгох"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-н тохиргоо"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 нөөцийг хүчлэх"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 нөөцийг хүчлэхийг сонгоно уу"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Ажиллаж байгаа үйлчилгээнүүд"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Одоо ажиллаж байгаа үйлчилгээнүүдийг харах болон хянах"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView хэрэгжилт"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Шинэ хэрэглэгч үүсгэж чадсангүй"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Шинэ зочин үүсгэж чадсангүй"</string>
     <string name="user_nickname" msgid="262624187455825083">"Хоч"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Таны сонгосон нэр болон зураг энэ төхөөрөмжийг ашигладаг хүн бүрд харагдана."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Хэрэглэгч нэмэх"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Зочин нэмэх"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Зочин хасах"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Бүх үйл ажиллагааг гарах үед устгана"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Та гарахдаа үйл ажиллагаагаа хадгалах эсвэл устгах боломжтой"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Харилцан үйлдлийн үйл ажиллагааг одоо устгахын тулд шинэчлэх эсвэл та гарахдаа үйл ажиллагааг хадгалах, устгах боломжтой"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Зураг авах"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Зураг сонгох"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Зураг сонгох"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Түгжээг хэт олон удаа буруу оруулсан тул энэ төхөөрөмжийн өгөгдлийг устгах болно."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Түгжээг хэт олон удаа буруу оруулсан тул энэ хэрэглэгчийг устгах болно."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet саллаа."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Этернэт."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Дуудлага байхгүй."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Профайл зураг сонгох"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Өгөгдмөл хэрэглэгчийн дүрс тэмдэг"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Биет гар"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Гарын бүдүүвчийг сонгох"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Өгөгдмөл"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index b270f41..1e56118 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"फक्त डावे अ‍ॅक्टिव्ह आहे"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"फक्त उजवे अ‍ॅक्टिव्ह आहे"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"डावे आणि उजवे अ‍ॅक्टिव्ह आहे"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"मीडिया ऑडिओ"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"फोन कॉल"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"फाइल स्थानांतरण"</string>
@@ -264,7 +286,7 @@
     <string name="bugreport_in_power" msgid="8664089072534638709">"बग रिपोर्ट शॉर्टकट"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"बग रिपोर्ट घेण्यासाठी पॉवर मेनूमध्ये एक बटण दर्शवा"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"सक्रिय रहा"</string>
-    <string name="keep_screen_on_summary" msgid="1510731514101925829">"चार्ज होत असताना स्क्रीन कधीही निष्क्रिय होणार नाही"</string>
+    <string name="keep_screen_on_summary" msgid="1510731514101925829">"चार्ज होत असताना स्क्रीन कधीही स्लीप मोडवर जाणार नाही"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"ब्लूटूथ HCI स्नूप लॉग सुरू करा"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"ब्लूटूथ पॅकेट कॅप्चर करा (हे सेटिंग बदलल्यानंतर ब्ल्यूटूथ टॉगल करा)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM अनलॉक करणे"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"असे गृहीत धरा की, ॲप्स आधुनिक फॉरमॅटना सपोर्ट करतात"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ट्रान्सकोडिंग सूचना दाखवा"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ट्रान्सकोडिंग कॅशे बंद करा"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine सेटिंग्ज"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 फॉलबॅकची सक्ती करा"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 फॉलबॅकची सक्ती करण्यासाठी निवडा"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"सुरू सेवा"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"सध्या सुरू असलेल्या सेवा पहा आणि नियंत्रित करा"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"वेबदृश्य अंमलबजावणी"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"नवीन वापरकर्ता तयार करता आला नाही"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"नवीन अतिथी तयार करता आला नाही"</string>
     <string name="user_nickname" msgid="262624187455825083">"टोपणनाव"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"हे डिव्हाइस वापरणाऱ्या कोणत्याही व्यक्तीला तुम्ही निवडलेले नाव आणि फोटो दिसेल."</string>
     <string name="user_add_user" msgid="7876449291500212468">"वापरकर्ता जोडा"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"अतिथी जोडा"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"अतिथी काढून टाका"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"बाहेर पडल्यावर सर्व अ‍ॅक्टिव्हिटी हटवली जाईल"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"बाहेर पडल्यावर तुमची अ‍ॅक्टिव्हिटी सेव्ह करू किंवा हटवू शकता"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"सत्र अ‍ॅक्टिव्हिटी आता हटवण्यासाठी रीसेट करा किंवा तुम्ही बाहेर पडल्यावर अ‍ॅक्टिव्हिटी सेव्ह करू अथवा हटवू शकता"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"फोटो काढा"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"इमेज निवडा"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"फोटो निवडा"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"बरेच चुकीचे प्रयत्‍न. या डिव्‍हाइसचा डेटा हटवला जाईल."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"बरेच चुकीचे प्रयत्‍न. हा वापरकर्ता हटवला जाईल."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"इथरनेट डिस्कनेक्ट केले."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"इथरनेट."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"कॉलिंग उपलब्ध नाही."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"प्रोफाइल फोटो निवडा"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"डीफॉल्ट वापरकर्ता आयकन"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"वास्तविक कीबोर्ड"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"किबोर्ड लेआउट निवडा"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"डीफॉल्ट"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 1bc0f20..a93c459 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktif, kiri sahaja"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktif, kanan sahaja"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktif, kiri dan kanan"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audio media"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Panggilan telefon"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Pemindahan fail"</string>
@@ -264,7 +286,7 @@
     <string name="bugreport_in_power" msgid="8664089072534638709">"Pintasan laporan pepijat"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Tunjukkan butang dalam menu kuasa untuk mengambil laporan pepijat"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"Tetap berjaga"</string>
-    <string name="keep_screen_on_summary" msgid="1510731514101925829">"Skrin tidak sekali-kali akan tidur semasa pengecasan"</string>
+    <string name="keep_screen_on_summary" msgid="1510731514101925829">"Skrin tidak akan tidur semasa pengecasan"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Dayakan log intip HCI Bluetooth"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Tangkap paket Bluetooth. (Togol Bluetooth selepas menukar tetapan ini)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"Pembukaan kunci OEM"</string>
@@ -304,8 +326,8 @@
     <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Pilih Mod DNS Peribadi"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Mati"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automatik"</string>
-    <string name="private_dns_mode_provider" msgid="3619040641762557028">"Nama hos pembekal DNS peribadi"</string>
-    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Masukkan nama hos pembekal DNS"</string>
+    <string name="private_dns_mode_provider" msgid="3619040641762557028">"Nama hos penyedia DNS peribadi"</string>
+    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Masukkan nama hos penyedia DNS"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Tidak dapat menyambung"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Tunjukkan pilihan untuk pensijilan paparan wayarles"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Tingkatkan tahap pengelogan Wi-Fi, tunjuk setiap SSID RSSI dalam Pemilih Wi-Fi"</string>
@@ -410,8 +432,8 @@
     <string name="force_resizable_activities_summary" msgid="2490382056981583062">"Bolehkan semua saiz aktiviti diubah untuk berbilang tetingkap, tanpa mengambil kira nilai manifes."</string>
     <string name="enable_freeform_support" msgid="7599125687603914253">"Dayakan tetingkap bentuk bebas"</string>
     <string name="enable_freeform_support_summary" msgid="1822862728719276331">"Dayakan sokongan untuk tetingkap bentuk bebas percubaan."</string>
-    <string name="local_backup_password_title" msgid="4631017948933578709">"Kata laluan sandaran komputer meja"</string>
-    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Sandaran penuh komputer meja tidak dilindungi pada masa ini"</string>
+    <string name="local_backup_password_title" msgid="4631017948933578709">"Kata laluan sandaran desktop"</string>
+    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Sandaran penuh desktop tidak dilindungi pada masa ini"</string>
     <string name="local_backup_password_summary_change" msgid="1707357670383995567">"Ketik untuk menukar atau mengalih keluar kata laluan untuk sandaran penuh desktop"</string>
     <string name="local_backup_password_toast_success" msgid="4891666204428091604">"Kata laluan sandaran baharu telah ditetapkan"</string>
     <string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"Kata laluan baharu dan pengesahan tidak sepadan"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Mengambil alih sokongan apl format moden"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Tunjukkan pemberitahuan transpengekodan"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Lumpuhkan cache transpengekodan"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Tetapan Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Paksa sandaran L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Pilih untuk memaksa sandaran L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Perkhidmatan dijalankan"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Lihat dan kawal perkhidmatan yang sedang dijalankan"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Pelaksanaan WebView"</string>
@@ -481,7 +500,7 @@
     <string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> - Mengecas"</string>
     <string name="battery_info_status_unknown" msgid="268625384868401114">"Tidak diketahui"</string>
     <string name="battery_info_status_charging" msgid="4279958015430387405">"Mengecas"</string>
-    <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Mengecas dgn cepat"</string>
+    <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Mengecas pantas"</string>
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Mengecas perlahan"</string>
     <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Mengecas tanpa wayar"</string>
     <string name="battery_info_status_charging_dock" msgid="8573274094093364791">"Pengecasan"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Gagal membuat pengguna baharu"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Gagal membuat tetamu baharu"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nama panggilan"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Nama dan gambar yang anda pilih akan dipaparkan kepada sesiapa sahaja yang menggunakan peranti ini."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Tambah pengguna"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Tambah tetamu"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Alih keluar tetamu"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Semua aktiviti akan dipadamkan semasa keluar"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Aktiviti anda boleh disimpan atau dipadam semasa keluar"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Tetapkan semula sesi untuk memadamkan aktiviti sesi sekarang atau anda boleh menyimpan atau memadamkan aktiviti semasa keluar"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Ambil foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Pilih imej"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Pilih foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Terlalu banyak percubaan yang salah. Data peranti ini akan dipadamkan."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Terlalu banyak percubaan yang salah. Pengguna ini akan dipadamkan."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet diputuskan sambungan."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Tiada panggilan."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Pilih gambar profil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Ikon pengguna lalai"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Papan kekunci fizikal"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Pilih susun atur papan kekunci"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Lalai"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 2b9ae6d..7880c37 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ဖွင့်ထားသည်၊ ဘယ်သီးသန့်"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ဖွင့်ထားသည်၊ ညာသီးသန့်"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ဖွင့်ထားသည်၊ ဘယ်နှင့် ညာ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"မီဒီယာ အသံ"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ဖုန်းခေါ်ဆိုမှုများ"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ဖိုင်လွဲပြောင်းခြင်း"</string>
@@ -389,7 +411,7 @@
     <string name="show_non_rect_clip" msgid="7499758654867881817">"စတုဂံပုံမကျသော ဖြတ်ပိုင်း လုပ်ဆောင်ချက်များကို အမှားဖယ်ရှားရန်"</string>
     <string name="track_frame_time" msgid="522674651937771106">"HWUI ပရိုဖိုင် ဆောင်ရွက်ခြင်း"</string>
     <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU အမှားရှာအလွှာဖွင့်ရန်"</string>
-    <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"အမှားရှာအက်ပ်များအတွက် GPU အမှားရှာအလွှာများ ထည့်သွင်းခွင့်ပြုပါ"</string>
+    <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"အမှားရှာအက်ပ်များအတွက် GPU အမှားရှာအလွှာများ ဖွင့်ခွင့်ပြုသည်"</string>
     <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"အကျယ်ရှင်းလင်းချက်ပံ့ပိုးသူ မှတ်တမ်းဖွင့်ရန်"</string>
     <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"ချွတ်ယွင်းမှု အစီရင်ခံချက်တွင် စက်ပစ္စည်းအလိုက် ထုတ်လုပ်သူမှတ်တမ်းများကို ထည့်သွင်းခြင်းဖြင့် ကိုယ်ရေးကိုယ်တာ အချက်အလက်များ ပါဝင်ခြင်း၊ ဘက်ထရီပိုသုံးခြင်း နှင့်/သို့မဟုတ် သိုလှောင်ခန်းပိုသုံးခြင်းတို့ ဖြစ်စေနိုင်သည်။"</string>
     <string name="window_animation_scale_title" msgid="5236381298376812508">"လှုပ်ရှားသက်ဝင်ပုံစကေး"</string>
@@ -411,7 +433,7 @@
     <string name="enable_freeform_support" msgid="7599125687603914253">"ပုံစံမျိုးစုံ ဝင်းဒိုးများ ဖွင့်ရန်"</string>
     <string name="enable_freeform_support_summary" msgid="1822862728719276331">"ပုံစံမျိုးစုံဝင်းဒိုးများ စမ်းသပ်ခြင်းအတွက် ပံ့ပိုးမှုကို ဖွင့်သည်"</string>
     <string name="local_backup_password_title" msgid="4631017948933578709">"ဒက်စ်တော့ အရန်စကားဝှက်"</string>
-    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"ဒက်စ်တော့ အရန်သိမ်းဆည်းခြင်းအားလုံးကို လောလောဆယ် ကာကွယ်မထားပါ"</string>
+    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"ဒက်စ်တော့ တစ်ခုလုံး အရန်သိမ်းဆည်းခြင်းကို လက်ရှိတွင် ကာကွယ်မထားပါ"</string>
     <string name="local_backup_password_summary_change" msgid="1707357670383995567">"ဒက်စ်တော့ အပြည့်အဝ အရန်သိမ်းခြင်းအတွက် စကားဝှက်ကို ပြောင်းရန် သို့မဟုတ် ဖယ်ရှားရန် တို့ပါ။"</string>
     <string name="local_backup_password_toast_success" msgid="4891666204428091604">"အရန်သိမ်းဆည်းခြင်းအတွက် စကားဝှက်အသစ်ကို သတ်မှတ်ပြီးပြီ။"</string>
     <string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"စကားဝှက်အသစ်နှင့် အတည်ပြုချက် ကွဲလွဲနေသည်။"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"ဤအက်ပ်များက ဖော်မက်အသစ်များကို ပံ့ပိုးသည်"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"အမျိုးအစားပြောင်းခြင်း အကြောင်းကြားချက်များကို ပြရန်"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"အမျိူးအစားပြောင်းခြင်း ကက်ရှ်ကို ပိတ်ရန်"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ဆက်တင်များ"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 နောက်ပြန်ဆုတ်မှု မဖြစ်မနေလုပ်ခြင်း"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 နောက်ပြန်ဆုတ်မှု မဖြစ်မနေလုပ်ရန် ရွေးပါ"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"အလုပ်လုပ်နေသောဝန်ဆောင်မှုများ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"လက်ရှိ ဝန်ဆောင်မှုများကို ကြည့်ရှု ထိန်းသိမ်းသည်"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView အကောင်အထည်ဖော်မှု"</string>
@@ -491,7 +510,7 @@
     <string name="battery_info_status_full_charged" msgid="3536054261505567948">"အားအပြည့်သွင်းထားသည်"</string>
     <string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"အားသွင်းခြင်းကို ခဏရပ်ထားသည်"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"စီမံခန့်ခွဲသူမှ ထိန်းချုပ်ပါသည်"</string>
-    <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ကန့်သတ်ထားသော ဆက်တင်များဖြင့် ထိန်းချုပ်ထားသည်"</string>
+    <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ကန့်သတ်ဆက်တင်ဖြင့် ထိန်းချုပ်ထားသည်"</string>
     <string name="disabled" msgid="8017887509554714950">"ပိတ်ထားပြီး"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"ခွင့်ပြုထားသည်"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"ခွင့်မပြုပါ"</string>
@@ -597,7 +616,7 @@
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"ကန့်သတ်ထားသော ကိုယ်ရေးအချက်အလက်များ"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"အသုံးပြုသူအသစ် ထည့်မလား။"</string>
     <string name="user_add_user_message_long" msgid="1527434966294733380">"နောက်ထပ် အသုံးပြုသူများ ထည့်သွင်းခြင်းဖြင့် ဤစက်ပစ္စည်းကို အခြားသူများနှင့် မျှဝေအသုံးပြုနိုင်သည်။ အသုံးပြုသူတိုင်းသည် မိမိတို့ကိုယ်ပိုင်နေရာ ရရှိမည်ဖြစ်ပြီး အက်ပ်၊ နောက်ခံပုံနှင့် အခြားအရာတို့ဖြင့် စိတ်ကြိုက်ပြင်ဆင်နိုင်ပါမည်။ အားလုံးကို အကျိုးသက်ရောက်မှု ရှိစေနိုင်သည့် Wi-Fi ကဲ့သို့ ဆက်တင်များကိုလည်း ချိန်ညှိနိုင်ပါမည်။\n\nအသုံးပြုသူအသစ် ထည့်သည့်အခါ ထိုသူသည် မိမိ၏ကိုယ်ပိုင်နေရာကို သတ်မှတ်ရပါမည်။\n\nအသုံးပြုသူ မည်သူမဆို အခြားအသုံးပြုသူများအတွက် အက်ပ်များကို အပ်ဒိတ်လုပ်နိုင်သည်။ အများသုံးစွဲနိုင်မှုဆက်တင်များနှင့် ဝန်ဆောင်မှုများကို အသုံးပြုသူအသစ်ထံသို့ လွှဲပြောင်းပေးမည် မဟုတ်ပါ။"</string>
-    <string name="user_add_user_message_short" msgid="3295959985795716166">"သင်က အသုံးပြုသူအသစ် ထည့်လိုက်လျှင် ထိုသူသည် ၎င်း၏ နေရာကို သတ်မှတ်စီစဉ်ရပါမည်။\n\n အသုံးပြုသူတိုင်းက ကျန်အသုံးပြုသူ အားလုံးအတွက် အက်ပ်များကို အပ်ဒိတ်လုပ်နိုင်သည်။"</string>
+    <string name="user_add_user_message_short" msgid="3295959985795716166">"သင်ထည့်လိုက်သည့် အသုံးပြုသူအသစ်သည် ၎င်း၏ နေရာကို သတ်မှတ်စီစဉ်ရပါမည်။\n\n အသုံးပြုသူတိုင်းက ကျန်အသုံးပြုသူ အားလုံးအတွက် အက်ပ်များကို အပ်ဒိတ်လုပ်နိုင်သည်။"</string>
     <string name="user_grant_admin_title" msgid="5157031020083343984">"ဤအသုံးပြုသူကို စီမံခန့်ခွဲသူအဖြစ် သတ်မှတ်မလား။"</string>
     <string name="user_grant_admin_message" msgid="1673791931033486709">"စီမံခန့်ခွဲသူများ၌ အခြားအသုံးပြုသူများတွင်မရှိသော အထူးဆောင်ရွက်ခွင့်များရှိသည်။ စီမံခန့်ခွဲသူက အသုံးပြုသူအားလုံးကို စီမံခြင်း၊ ဤစက်ပစ္စည်းကို အပ်ဒိတ်လုပ်ခြင်း (သို့) ပြင်ဆင်သတ်မှတ်ခြင်း၊ ဆက်တင်များပြင်ဆင်ခြင်း၊ ထည့်သွင်းထားသောအက်ပ်အားလုံးကို ကြည့်ခြင်းနှင့် အခြားသူများအတွက် စီမံခန့်ခွဲသူ ဆောင်ရွက်ခွင့်များပေးခြင်း (သို့) ရုပ်သိမ်းခြင်းတို့ လုပ်နိုင်သည်။"</string>
     <string name="user_grant_admin_button" msgid="5441486731331725756">"စီမံခန့်ခွဲသူအဖြစ် သတ်မှတ်ရန်"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"အသုံးပြုသူအသစ် ပြုလုပ်၍မရပါ"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"ဧည့်သည်သစ် ပြုလုပ်၍မရပါ"</string>
     <string name="user_nickname" msgid="262624187455825083">"နာမည်ပြောင်"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"သင်ရွေးသော အမည်နှင့်ပုံကို ဤစက်သုံးသူ မည်သူမဆို မြင်နိုင်သည်။"</string>
     <string name="user_add_user" msgid="7876449291500212468">"အသုံးပြုသူ ထည့်ရန်"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"ဧည့်သည် ထည့်ရန်"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"ဧည့်သည်ကို ဖယ်ရှားရန်"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"ထွက်သည့်အခါ လုပ်ဆောင်ချက်အားလုံးကို ဖျက်လိုက်မည်"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"ထွက်သည့်အခါ လုပ်ဆောင်ချက်ကို သိမ်းနိုင် (သို့) ဖျက်နိုင်သည်"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"စက်ရှင်လုပ်ဆောင်ချက်ကို ယခုဖျက်ရန် ပြင်ဆင်သတ်မှတ်နိုင်သည် (သို့) ထွက်သည့်အခါ သိမ်းနိုင်၊ ဖျက်နိုင်သည်"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ဓာတ်ပုံရိုက်ရန်"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"ပုံရွေးရန်"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ဓာတ်ပုံရွေးရန်"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"မှားယွင်းသည့် အကြိမ်ရေ အလွန်များနေပါပြီ။ ဤစက်၏ ဒေတာကို ဖျက်လိုက်ပါမည်။"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"မှားယွင်းသည့် အကြိမ်ရေ အလွန်များနေပါပြီ။ ဤအသုံးပြုသူကို ဖျက်လိုက်ပါမည်။"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet နှင့်ချိတ်ဆက်မှုပြတ်တောက်"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"အီသာနက်။"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"ခေါ်ဆိုမှု မရှိပါ။"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"ပရိုဖိုင်ပုံ ရွေးပါ"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"မူရင်းအသုံးပြုသူ သင်္ကေတ"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"ပကတိ ကီးဘုတ်"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"လက်ကွက်အပြင်အဆင်ရွေးချယ်ခြင်း"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"မူရင်း"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 4a3363f..0eacc5e 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, bare venstre"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, bare høyre"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, venstre og høyre"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Medielyd"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonsamtaler"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Filoverføring"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Anta at apper støtter moderne formater"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Vis omkodingsvarsler"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Slå av omkodingsbuffer"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-innstillinger"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Tving bruk av L3-reservealternativet"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Velg for å tvinge bruk av L3-reservealternativet"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktive tjenester"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Se og kontroller tjenester som kjører"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Kunne ikke opprette noen ny bruker"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Kunne ikke opprette en ny gjest"</string>
     <string name="user_nickname" msgid="262624187455825083">"Kallenavn"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Navnet og bildet du velger, blir synlige for alle som bruker denne enheten."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Legg til bruker"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Legg til gjest"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Fjern gjesten"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"All aktivitet slettes når du avslutter"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Du kan lagre eller slette aktiviteten når du avslutter"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Tilbakestill for å slette øktaktivitet nå, eller du kan lagre eller slette aktivitet når du avslutter"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Ta et bilde"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Velg et bilde"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Velg et bilde"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"For mange mislykkede forsøk. Dataene på denne enheten blir slettet."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"For mange mislykkede forsøk. Denne brukeren blir slettet."</string>
@@ -658,7 +674,7 @@
     <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>
-    <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"Hodetelefoner med kabel"</string>
+    <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"hodetelefoner med kabel"</string>
     <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>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet er frakoblet."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Ingen ringing."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Velg et profilbilde"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Standard brukerikon"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fysisk tastatur"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Velg et tastaturoppsett"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Standard"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 7ba6ca0..e2236cc 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"बायाँ मात्र अन छ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"सक्रिय, दायाँ मात्र"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"सक्रिय, बायाँ र दायाँ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"मिडिया अडियो"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"फोन कलहरू"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"फाइल स्थानान्तरण"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"एपहरूमा आधुनिक फर्म्याट प्रयोग गर्न मिल्छ भनी मान्नुहोस्"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ट्रान्सकोडिङसम्बन्धी सूचना देखाइयोस्"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ट्रान्सकोडिङको क्यास अफ गर्नुहोस्"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine को सेटिङ"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 फलब्याक बलपूर्वक अन गर्नुहोस्"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 फलब्याकमा बलपूर्वक अन गर्ने कि नगर्ने भन्ने विकल्प चयन गर्नुहोस्"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"चलिरहेका सेवाहरू"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"हाल चालु भइरहेका सेवाहरू हेर्नुहोस् र नियन्त्रण गर्नुहोस्"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView कार्यान्वयन"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"सिष्टममा भएका भाषा प्रयोग गरियोस्"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>का लागि सेटिङहरू खोल्न विफल भयो।"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"यस इनपुट विधिले तपाईँले टाइप गर्नुहुने सम्पूर्ण पाठ बटु्ल्न सक्छ, व्यक्तिगत डेटा जस्तै पासवर्ड र क्रेडिट कार्ड नम्बर लगायतका। यो <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> अनुप्रयोगबाट आउँदछ। यो इनपुट विधि प्रयोग गर्ने हो?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"टिपोट: पुनःबुट पछि तपाईँले आफ्नो फोनलाई अनलक नगरेसम्म यो एप सुरु हुन सक्दैन"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"नोट: रिबुट गरेपछि तपाईंले आफ्नो फोन अनलक नगरेसम्म यो एप सुरु हुँदैन"</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"IMS दर्ताको स्थिति"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"दर्ता गरिएको"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"दर्ता नगरिएको"</string>
@@ -609,7 +628,7 @@
     <string name="user_add_user_type_title" msgid="551279664052914497">"थप्नुहोस्"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"नयाँ प्रयोगकर्ता"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"नयाँ प्रोफाइल"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"प्रयोगकर्ता जानकारी"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"प्रयोगकर्ताको विवरण"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"प्रोफाइलको जानकारी"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"निषेधयुक्त प्रोफाइल बनाउनु अघि तपाईँको एप र व्यक्तिगत डेटा सुरक्षा गर्नाका लागि तपाईँले स्क्रिन लक सेटअप गर्नु पर्दछ ।"</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"लक सेट गर्नुहोस्"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"नयाँ प्रयोगकर्ता सिर्जना गर्न सकिएन"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"नयाँ अतिथि बनाउन सकिएन"</string>
     <string name="user_nickname" msgid="262624187455825083">"उपनाम"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"यो डिभाइस प्रयोग गर्ने सबै जना तपाईंले छनौट गर्ने नाम र फोटो देख्न सक्ने छन्।"</string>
     <string name="user_add_user" msgid="7876449291500212468">"प्रयोगकर्ता कनेक्ट गर्नुहोस्"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"अतिथि कनेक्ट गर्नुहोस्"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"गेस्ट मोडबाट बाहिर निस्कियोस्"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"अतिथि मोडबाट बाहिरिँदा सबै क्रियाकलाप मेटाइने छ"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"तपाईं अतिथि मोडबाट बाहिरिँदा आफ्ना क्रियाकलाप सेभ गर्ने वा मेटाउने विकल्प रोज्न सक्नुहुन्छ"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"यो सत्रमा गरिएका क्रियाकलाप अहिले नै मेटाउन रिसेट गर्नुहोस्, अथवा तपाईं अतिथि मोडबाट बाहिरिँदा आफ्ना क्रियाकलाप सेभ गर्ने वा मेटाउने विकल्प रोज्न सक्नुहुन्छ"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"फोटो खिच्नुहोस्"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"कुनै फोटो छनौट गर्नुहोस्"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"फोटो चयन गर्नुहोस्"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"धेरै पटक गलत तरिकाले अनलक गर्ने प्रयास गरियो। यो डिभाइसमा भएको डेटा मेटाइने छ।"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"धेरै पटक गलत तरिकाले अनलक गर्ने प्रयास गरियो। यो प्रयोगकर्ता मेटाइने छ।"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"इथरनेट विच्छेद भयो।"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"इथरनेट।"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"कल गर्ने सुविधा उपलब्ध छैन।"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"प्रोफाइल फोटो छान्नुहोस्"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"प्रयोगकर्ताको डिफल्ट आइकन"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"भौतिक किबोर्ड"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"किबोर्ड लेआउट छान्नुहोस्"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"डिफल्ट"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 79d918a..801c73f 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Actief, alleen links"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Actief, alleen rechts"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Actief, links en rechts"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Media-audio"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefoongesprekken"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Bestandsoverdracht"</string>
@@ -115,7 +137,7 @@
     <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"De informatie wordt onder andere gebruikt voor gespreksaankondigingen"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Internetverbinding delen"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Sms-berichten"</string>
-    <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Sim-toegang"</string>
+    <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Simtoegang"</string>
     <string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"HD-audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
     <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"HD-audio"</string>
     <string name="bluetooth_profile_hearing_aid" msgid="2607867572569689732">"Hoortoestellen"</string>
@@ -133,7 +155,7 @@
     <string name="bluetooth_pan_nap_profile_summary_connected" msgid="3744773111299503493">"Lokale internetverbinding delen met apparaat"</string>
     <string name="bluetooth_pan_profile_summary_use_for" msgid="7422039765025340313">"Gebruik voor internettoegang"</string>
     <string name="bluetooth_map_profile_summary_use_for" msgid="4453622103977592583">"Gebruiken voor kaart"</string>
-    <string name="bluetooth_sap_profile_summary_use_for" msgid="6204902866176714046">"Gebruiken voor sim-toegang"</string>
+    <string name="bluetooth_sap_profile_summary_use_for" msgid="6204902866176714046">"Gebruiken voor simtoegang"</string>
     <string name="bluetooth_a2dp_profile_summary_use_for" msgid="7324694226276491807">"Gebruiken voor audio van medium"</string>
     <string name="bluetooth_headset_profile_summary_use_for" msgid="808970643123744170">"Gebruiken voor audio van telefoon"</string>
     <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Gebruiken voor bestandsoverdracht"</string>
@@ -180,7 +202,7 @@
     <string name="launch_defaults_some" msgid="3631650616557252926">"Enkele standaardwaarden ingesteld"</string>
     <string name="launch_defaults_none" msgid="8049374306261262709">"Geen standaardwaarden ingesteld"</string>
     <string name="tts_settings" msgid="8130616705989351312">"Instellingen tekst-naar-spraak"</string>
-    <string name="tts_settings_title" msgid="7602210956640483039">"Tekst-naar-spraakuitvoer"</string>
+    <string name="tts_settings_title" msgid="7602210956640483039">"Tekst-naar-spraak-uitvoer"</string>
     <string name="tts_default_rate_title" msgid="3964187817364304022">"Spreeksnelheid"</string>
     <string name="tts_default_rate_summary" msgid="3781937042151716987">"Snelheid waarmee de tekst wordt gesproken"</string>
     <string name="tts_default_pitch_title" msgid="6988592215554485479">"Toonhoogte"</string>
@@ -305,7 +327,7 @@
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Uit"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automatisch"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"Hostnaam van privé-DNS-provider"</string>
-    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Geef hostnaam van DNS-provider op"</string>
+    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Voer de hostnaam van de DNS-provider in"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Kan geen verbinding maken"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Toon opties voor certificering van draadloze weergave"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Verhoog het logniveau voor wifi, toon per SSID RSSI in wifi-kiezer"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Aannemen dat apps moderne indelingen ondersteunen"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Transcoderingsmeldingen tonen"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Transcodering van cache uitzetten"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-instellingen"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3-fallback afdwingen"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecteren om L3-fallback af te dwingen"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Actieve services"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Bekijk en beheer services die momenteel actief zijn"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementatie"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Gebruik systeemtalen"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Instellingen openen voor <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> mislukt"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Deze invoermethode verzamelt mogelijk alle tekst die je typt, inclusief persoonsgegevens zoals wachtwoorden en creditcardnummers. De methode is afkomstig uit de app <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Deze invoermethode aanzetten?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Opmerking: Wanneer je telefoon opnieuw is opgestart, kan deze app pas worden gestart nadat je je telefoon hebt ontgrendeld"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Opmerking: Nadat je de telefoon opnieuw opstart, wordt deze app pas gestart nadat je de telefoon ontgrendelt"</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"IMS-registratiestatus"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Geregistreerd"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Niet geregistreerd"</string>
@@ -596,7 +615,7 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"Gebruiker"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"Beperkt profiel"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"Nieuwe gebruiker toevoegen?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"Je kunt dit apparaat met anderen delen door extra gebruikers toe te voegen. Elke gebruiker heeft een eigen profiel met zelf gekozen apps, achtergrond, enzovoort. Gebruikers kunnen ook apparaatinstellingen aanpassen die van invloed zijn op alle gebruikers, zoals wifi.\n\nWanneer je een nieuwe gebruiker toevoegt, moet die persoon een eigen profiel instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers. Toegankelijkheidsinstellingen en -services worden mogelijk niet overgezet naar de nieuwe gebruiker."</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"Je kunt dit apparaat met anderen delen door extra gebruikers toe te voegen. Elke gebruiker heeft een eigen profiel met zelf gekozen apps, achtergrond, enzovoort. Gebruikers kunnen ook apparaatinstellingen aanpassen die van invloed zijn op alle gebruikers, zoals wifi.\n\nWanneer je een nieuwe gebruiker toevoegt, moet die persoon een eigen ruimte instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers. Toegankelijkheidsinstellingen en -services worden mogelijk niet overgezet naar de nieuwe gebruiker."</string>
     <string name="user_add_user_message_short" msgid="3295959985795716166">"Wanneer je een nieuwe gebruiker toevoegt, moet die persoon een eigen profiel instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers."</string>
     <string name="user_grant_admin_title" msgid="5157031020083343984">"Deze gebruiker beheerder maken?"</string>
     <string name="user_grant_admin_message" msgid="1673791931033486709">"Beheerders hebben speciale rechten die andere gebruikers niet hebben. Een beheerder kan alle gebruikers beheren, dit apparaat updaten of resetten, instellingen wijzigen, alle geïnstalleerde apps bekijken en beheerdersrechten toekennen of intrekken voor anderen."</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Kan geen nieuwe gebruiker maken"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Kan geen nieuwe gast maken"</string>
     <string name="user_nickname" msgid="262624187455825083">"Bijnaam"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"De naam en afbeelding die je kiest, zijn zichtbaar voor iedereen die dit apparaat gebruikt."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Gebruiker toevoegen"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Gast toevoegen"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Gast verwijderen"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Alle activiteit wordt na het afsluiten verwijderd"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Je kunt je activiteit bij afsluiten opslaan of verwijderen"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Voer een reset uit om de sessie-activiteit nu te verwijderen of verwijder of sla je activiteit op bij afsluiten"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Foto maken"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Afbeelding kiezen"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Foto selecteren"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Te veel onjuiste pogingen. De gegevens van dit apparaat worden verwijderd."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Te veel onjuiste pogingen. Deze gebruiker wordt verwijderd."</string>
@@ -658,7 +674,7 @@
     <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Uit"</string>
     <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aan"</string>
     <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_usb_device_name" msgid="7699141088423210903">"Bedrade hoofdtelefoon"</string>
+    <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"Bedrade koptelefoon"</string>
     <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>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernetverbinding verbroken."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Geen gesprekken."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Kies een profielfoto"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Standaard gebruikersicoon"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fysiek toetsenbord"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Toetsenbordindeling kiezen"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Standaard"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 9ab80d0..3cbbc05 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ସକ୍ରିୟ, କେବଳ ବାମ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ସକ୍ରିୟ, କେବଳ ଡାହାଣ"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ସକ୍ରିୟ, ବାମ ଏବଂ ଡାହାଣ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"ମିଡିଆ ଅଡିଓ"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ଫୋନ୍‌ କଲ୍‌‌ଗୁଡ଼ିକ"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ଫାଇଲ୍‌ ଟ୍ରାନ୍ସଫର୍‌"</string>
@@ -264,7 +286,7 @@
     <string name="bugreport_in_power" msgid="8664089072534638709">"ବଗ୍ ରିପୋର୍ଟ ସର୍ଟକଟ୍‌"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"ବଗ୍ ରିପୋର୍ଟ ଦେବା ପାଇଁ ପାୱାର୍‌ ମେନୁରେ ଏକ ବଟନ୍‌ ଦେଖାନ୍ତୁ"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"ସତର୍କ ରୁହନ୍ତୁ"</string>
-    <string name="keep_screen_on_summary" msgid="1510731514101925829">"ଚାର୍ଜ ହେବାବେଳେ ସ୍କ୍ରୀନ୍‌ ଆଦୌ ବନ୍ଦ ହେବନାହିଁ"</string>
+    <string name="keep_screen_on_summary" msgid="1510731514101925829">"ଚାର୍ଜ ହେବାବେଳେ ସ୍କ୍ରିନ କେବେ ବି ବନ୍ଦ ହେବନାହିଁ"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"ବ୍ଲୁଟୂଥ୍‍‌ HCI ସ୍ନୁପ୍‌ ଲଗ୍‌ ସକ୍ଷମ କରନ୍ତୁ"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"ବ୍ଲୁଟୁଥ୍‌ ପ୍ୟାକେଟ୍ କ୍ୟାପଚର୍ କରନ୍ତୁ (ଏହି ସେଟିଂ ବଦଳାଇବା ପରେ ବ୍ଲୁଟୁଥ୍‍‌କୁ ଟୋଗଲ୍ କରନ୍ତୁ)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM ଅନଲକ୍‌ କରିବା"</string>
@@ -300,10 +322,10 @@
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3233402355917446304">"ବ୍ଲୁଟୂଥ୍‍‌ ଅଡିଓ LDAC କୋଡେକ୍‌: ପ୍ଲେବ୍ୟାକ୍‌ ଗୁଣବତ୍ତା"</string>
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"ବ୍ଲୁ-ଟୁଥ୍‌ ଅଡିଓ LDAC\nକୋଡେକ୍‌ ଚୟନକୁ ଗତିଶୀଳ କରନ୍ତୁ: ପ୍ଲେବ୍ୟାକ୍‌ କ୍ୱାଲିଟୀ"</string>
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"ଷ୍ଟ୍ରିମ୍ କରୁଛି: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
-    <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"ବ୍ୟକ୍ତିଗତ DNS"</string>
+    <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"ପ୍ରାଇଭେଟ DNS"</string>
     <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"ବ୍ୟକ୍ତିଗତ DNS ମୋଡ୍‌ ବାଛନ୍ତୁ"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"ବନ୍ଦ"</string>
-    <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"ଅଟୋମେଟିକ"</string>
+    <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"ସ୍ୱତଃ"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"ବ୍ୟକ୍ତିଗତ DNS ପ୍ରଦାତା ହୋଷ୍ଟନାମ"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS ପ୍ରଦାନକାରୀଙ୍କ ହୋଷ୍ଟନାମ ଲେଖନ୍ତୁ"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"କନେକ୍ଟ କରିହେଲା ନାହିଁ"</string>
@@ -341,7 +363,7 @@
     <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="hdcp_checking_title" msgid="3155692785074095986">"HDCP ଯାଞ୍ଚ କରୁଛି"</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>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"ଧରିନିଅନ୍ତୁ ଆପଗୁଡ଼ିକ ଆଧୁନିକ ଫର୍ମାଟଗୁଡ଼ିକୁ ସମର୍ଥନ କରେ"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ଟ୍ରାନ୍ସକୋଡିଂ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ଟ୍ରାନ୍ସକୋଡିଂ କ୍ୟାଶକୁ ଅକ୍ଷମ କରନ୍ତୁ"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ସେଟିଂସ"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"ଫୋର୍ସ L3 ଫଲବେକ"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ଫୋର୍ସ L3 ଫଲବେକ ଚୟନ କରନ୍ତୁ"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ଏବେ ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ ଓ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"ୱେବ୍‌ଭ୍ୟୁ ପ୍ରୟୋଗ"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି କରିବାକୁ ବିଫଳ ହେଲା"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"ଜଣେ ନୂଆ ଅତିଥି ତିଆରି କରିବାରେ ବିଫଳ ହୋଇଛି"</string>
     <string name="user_nickname" msgid="262624187455825083">"ଡାକନାମ"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"ଆପଣ ବାଛିଥିବା ନାମ ଏବଂ ଛବି ଏହି ଡିଭାଇସ ବ୍ୟବହାର କରୁଥିବା ଯେ କୌଣସି ବ୍ୟକ୍ତିଙ୍କୁ ଦେଖାଯିବ।"</string>
     <string name="user_add_user" msgid="7876449291500212468">"ୟୁଜର ଯୋଗ କରନ୍ତୁ"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"ଅତିଥି ଯୋଗ କରନ୍ତୁ"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"ଅତିଥିଙ୍କୁ କାଢ଼ି ଦିଅନ୍ତୁ"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"ବାହାରିବା ସମୟରେ ସମସ୍ତ କାର୍ଯ୍ୟକଳାପକୁ ଡିଲିଟ କରାଯିବ"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"ବାହାରିବା ସମୟରେ ଆପଣଙ୍କର କାର୍ଯ୍ୟକଳାପକୁ ସେଭ ବା ଡିଲିଟ କରିପାରିବେ"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"ବର୍ତ୍ତମାନ ସେସନ କାର୍ଯ୍ୟକଳାପକୁ ଡିଲିଟ କରିବାକୁ ରିସେଟ କରନ୍ତୁ କିମ୍ବା ବାହାରିବା ସମୟରେ ଆପଣ କାର୍ଯ୍ୟକଳାପକୁ ସେଭ କିମ୍ବା ଡିଲିଟ କରିପାରିବେ"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ଗୋଟିଏ ଫଟୋ ଉଠାନ୍ତୁ"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"ଏକ ଛବି ବାଛନ୍ତୁ"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ଫଟୋ ବାଛନ୍ତୁ"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"ଅନେକଗୁଡ଼ିଏ ଭୁଲ ପ୍ରଚେଷ୍ଟା। ଏହି ଡିଭାଇସର ଡାଟା ଡିଲିଟ ହୋଇଯିବ।"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"ଅନେକଗୁଡ଼ିଏ ଭୁଲ ପ୍ରଚେଷ୍ଟା। ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଡିଲିଟ କରିଦିଆଯିବ।"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ଇଥରନେଟ୍‍ ବିଚ୍ଛିନ୍ନ ହୋଇଛି।"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ଇଥରନେଟ୍।"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"କୌଣସି କଲିଂ ନାହିଁ।"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"ଏକ ପ୍ରୋଫାଇଲ ଛବି ବାଛନ୍ତୁ"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ଡିଫଲ୍ଟ ୟୁଜର ଆଇକନ"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"ଫିଜିକାଲ କୀବୋର୍ଡ"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"କୀବୋର୍ଡ ଲେଆଉଟ ବାଛନ୍ତୁ"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ଡିଫଲ୍ଟ"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 29323382..2105852 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ਕਿਰਿਆਸ਼ੀਲ, ਸਿਰਫ਼ ਖੱਬਾ"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ਕਿਰਿਆਸ਼ੀਲ, ਸਿਰਫ਼ ਸੱਜਾ"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ਕਿਰਿਆਸ਼ੀਲ, ਖੱਬਾ ਅਤੇ ਸੱਜਾ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"ਮੀਡੀਆ  ਆਡੀਓ"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ਫ਼ੋਨ ਕਾਲਾਂ"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"ਮੰਨ ਲਓ ਕਿ ਐਪਾਂ ਆਧੁਨਿਕ ਫਾਰਮੈਟਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦੀਆਂ ਹਨ"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਸੂਚਨਾਵਾਂ ਦਿਖਾਓ"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਕੈਸ਼ੇ ਬੰਦ ਕਰੋ"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ਸੈਟਿੰਗਾਂ"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"ਜ਼ਬਰਦਸਤੀ L3 ਫਾਲਬੈਕ ਕਰੋ"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ਜ਼ਬਰਦਸਤੀ L3 ਫਾਲਬੈਕ ਕਰਨ ਲਈ ਚੁਣੋ"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ਇਸ ਵੇਲੇ ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ ਦੇਖੋ ਅਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ਅਮਲੀਕਰਨ"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣਾ ਅਸਫਲ ਰਿਹਾ"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"ਨਵਾਂ ਮਹਿਮਾਨ ਪ੍ਰੋਫਾਈਲ ਬਣਾਉਣਾ ਅਸਫਲ ਰਿਹਾ"</string>
     <string name="user_nickname" msgid="262624187455825083">"ਉਪਨਾਮ"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਚੁਣਿਆ ਗਿਆ ਨਾਮ ਅਤੇ ਤਸਵੀਰ ਇਸ ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵਾਲੇ ਕਿਸੇ ਵੀ ਵਿਅਕਤੀ ਨੂੰ ਦਿਖਾਈ ਦੇਵੇਗੀ।"</string>
     <string name="user_add_user" msgid="7876449291500212468">"ਵਰਤੋਂਕਾਰ ਨੂੰ ਸ਼ਾਮਲ ਕਰੋ"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"ਮਹਿਮਾਨ ਸ਼ਾਮਲ ਕਰੋ"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"ਮਹਿਮਾਨ ਹਟਾਓ"</string>
@@ -644,11 +662,9 @@
     <string name="guest_exit_button" msgid="5774985819191803960">"ਮਹਿਮਾਨ ਮੋਡ ਤੋਂ ਬਾਹਰ ਜਾਓ"</string>
     <string name="guest_reset_button" msgid="2515069346223503479">"ਮਹਿਮਾਨ ਸੈਸ਼ਨ ਨੂੰ ਰੀਸੈੱਟ ਕਰੋ"</string>
     <string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"ਮਹਿਮਾਨ ਮੋਡ ਤੋਂ ਬਾਹਰ ਜਾਓ"</string>
-    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"ਬਾਹਰ ਜਾਣ \'ਤੇ ਸਾਰੀ ਸਰਗਰਮੀ ਮਿਟਾਈ ਜਾਵੇਗੀ"</string>
+    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"ਬਾਹਰ ਜਾਣ \'ਤੇ ਸਾਰੀ ਸਰਗਰਮੀ ਮਿਟਾ ਦਿੱਤੀ ਜਾਵੇਗੀ"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"ਤੁਸੀਂ ਬਾਹਰ ਜਾਣ \'ਤੇ ਆਪਣੀ ਸਰਗਰਮੀ ਰੱਖਿਅਤ ਕਰ ਜਾਂ ਮਿਟਾ ਸਕਦੇ ਹੋ"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"ਸੈਸ਼ਨ ਦੀ ਸਰਗਰਮੀ ਹੁਣੇ ਮਿਟਾਉਣ ਲਈ ਰੀਸੈੱਟ ਕਰੋ ਜਾਂ ਤੁਸੀਂ ਬਾਹਰ ਜਾਣ \'ਤੇ ਸਰਗਰਮੀ ਨੂੰ ਰੱਖਿਅਤ ਕਰ ਜਾਂ ਮਿਟਾ ਸਕਦੇ ਹੋ"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ਇੱਕ ਫ਼ੋਟੋ ਖਿੱਚੋ"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"ਕੋਈ ਚਿੱਤਰ ਚੁਣੋ"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ਫ਼ੋਟੋ ਚੁਣੋ"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"ਬਹੁਤ ਸਾਰੀਆਂ ਗਲਤ ਕੋਸ਼ਿਸ਼ਾਂ। ਇਸ ਡੀਵਾਈਸ ਦਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"ਬਹੁਤ ਸਾਰੀਆਂ ਗਲਤ ਕੋਸ਼ਿਸ਼ਾਂ। ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ਈਥਰਨੈੱਟ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ।"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ਈਥਰਨੈੱਟ।"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"ਕਾਲਿੰਗ ਸੇਵਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"ਕੋਈ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਚੁਣੋ"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਰਤੋਂਕਾਰ ਪ੍ਰਤੀਕ"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"ਭੌਤਿਕ ਕੀ-ਬੋਰਡ"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"ਕੀ-ਬੋਰਡ ਖਾਕਾ ਚੁਣੋ"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ਪੂਰਵ-ਨਿਰਧਾਰਿਤ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index a7d59cf..93e65af 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktywne, tylko lewa strona"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktywne, tylko prawa strona"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktywny, lewa i prawa strona"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Dźwięk multimediów"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Połączenia telefoniczne"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Przesyłanie pliku"</string>
@@ -257,7 +279,7 @@
     <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Paruję urządzenie…"</string>
     <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Nie udało się sparować z urządzeniem. Kod QR jest nieprawidłowy albo urządzenie nie jest podłączone do tej samej sieci."</string>
     <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Adres IP i port"</string>
-    <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Skaner kodów QR"</string>
+    <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Zeskanuj kod QR"</string>
     <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Sparuj urządzenia przez Wi-Fi, skanując kod QR"</string>
     <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Połącz się z siecią Wi-Fi"</string>
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Zakładaj, że aplikacje obsługują nowoczesne formaty"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Pokaż powiadomienia transkodowania"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Wyłącz pamięć podręczną transkodowania"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Ustawienia Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Wymuszaj kreację zastępczą L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Wybierz wymuszanie kreacji zastępczej L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Uruchomione usługi"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Wyświetl obecnie uruchomione usługi i nimi zarządzaj"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementacja WebView"</string>
@@ -491,7 +510,7 @@
     <string name="battery_info_status_full_charged" msgid="3536054261505567948">"Bateria w pełni naładowana"</string>
     <string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Ładowanie wstrzymane"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolowane przez administratora"</string>
-    <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolowane przez ograniczone ustawienia"</string>
+    <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Obowiązują ustawienia z ograniczonym dostępem"</string>
     <string name="disabled" msgid="8017887509554714950">"Wyłączone"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"Dozwolone"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"Niedozwolone"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Użyj języków systemu"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Nie udało się otworzyć ustawień aplikacji <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Ta metoda wprowadzania tekstu może gromadzić cały wpisywany tekst, w tym dane osobowe takie jak hasła czy numery kart kredytowych. Pochodzi ona z aplikacji <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Użyć jej?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Uwaga: po restarcie ta aplikacja będzie mogła uruchomić się dopiero po odblokowaniu telefonu"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Uwaga: po restarcie ta aplikacja będzie mogła uruchomić się dopiero, gdy odblokujesz telefon."</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"Stan rejestracji IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Zarejestrowane"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Niezarejestrowane"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Nie udało się utworzyć nowego użytkownika"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Nie udało się utworzyć nowego gościa"</string>
     <string name="user_nickname" msgid="262624187455825083">"Pseudonim"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Nazwa i zdjęcie, które wybierzesz, będą widoczne dla każdego, kto używa tego urządzenia."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Dodaj użytkownika"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gościa"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Usuń gościa"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Po zamknięciu cała aktywność zostanie usunięta"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Możesz zapisać lub usunąć swoją aktywność podczas zamykania."</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Zresetuj, aby teraz usunąć aktywność z tej sesji. Możesz też ją zapisać lub usunąć podczas zamykania sesji."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Zrób zdjęcie"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Wybierz obraz"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Wybierz zdjęcie"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Zbyt wiele nieudanych prób. Dane na urządzeniu zostaną usunięte."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Zbyt wiele nieudanych prób. Użytkownik zostanie usunięty."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Rozłączono z siecią Ethernet."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Brak połączenia."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Wybierz zdjęcie profilowe"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Ikona domyślnego użytkownika"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Klawiatura fizyczna"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Wybierz układ klawiatury"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Domyślny"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index bb83c2b..811c04a 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ativo, apenas o esquerdo"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ativo, apenas o direito"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ativo, esquerdo e direito"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Áudio da mídia"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Chamadas telefônicas"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferência de arquivo"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Considerar que os apps são compatíveis com formatos modernos"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificações de transcodificação"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Desativar cache da transcodificação"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Configurações o Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forçar substituição do L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecione para forçar a substituição do L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver e controlar os serviços em execução no momento"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação do WebView"</string>
@@ -522,7 +541,7 @@
     <string name="ims_reg_title" msgid="8197592958123671062">"Estado do registro de IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Registrado"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Não registrado"</string>
-    <string name="status_unavailable" msgid="5279036186589861608">"Não disponível"</string>
+    <string name="status_unavailable" msgid="5279036186589861608">"Indisponível"</string>
     <string name="wifi_status_mac_randomized" msgid="466382542497832189">"O MAC é randomizado"</string>
     <string name="wifi_tether_connected_summary" msgid="5100712926640492336">"{count,plural, =1{1 dispositivo conectado}one{# dispositivo conectado}other{# dispositivos conectados}}"</string>
     <string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Mais tempo."</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Falha ao criar um novo usuário"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Falha ao criar um novo convidado"</string>
     <string name="user_nickname" msgid="262624187455825083">"Apelido"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"O nome e a foto que você escolher ficarão visíveis para qualquer pessoa que usar este dispositivo."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Adicionar usuário"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Adicionar visitante"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Remover visitante"</string>
@@ -642,13 +660,11 @@
     <string name="guest_exit_clear_data_button" msgid="3425812652180679014">"Excluir"</string>
     <string name="guest_exit_save_data_button" msgid="3690974510644963547">"Salvar"</string>
     <string name="guest_exit_button" msgid="5774985819191803960">"Sair do modo visitante"</string>
-    <string name="guest_reset_button" msgid="2515069346223503479">"Redefinir Sessão de visitante"</string>
+    <string name="guest_reset_button" msgid="2515069346223503479">"Redefinir sessão de visitante"</string>
     <string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"Sair do modo visitante"</string>
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Todas as atividades serão excluídas ao sair"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Você pode salvar ou excluir sua atividade ao sair"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Redefina para excluir a atividade da sessão agora. Salve ou exclua a atividade ao sair"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Tirar uma foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Escolher uma imagem"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Selecionar foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Excesso de tentativas incorretas. Os dados deste dispositivo serão excluídos."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Excesso de tentativas incorretas. O usuário será excluído."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desconectada."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Sem chamadas."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Escolher a foto do perfil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Ícone de usuário padrão"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Teclado físico"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Escolha o layout do teclado"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Padrão"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 4554f85..4c88683 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -106,12 +106,34 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ativo, apenas esquerdo"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ativo, apenas direito"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ativo, esquerdo e direito"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Áudio de multimédia"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Chamadas telefónicas"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferência do ficheiro"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Dispositivo de entrada"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Acesso à internet"</string>
-    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Perm. acesso a contactos e histór. cham."</string>
+    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Acesso a contactos e histórico de chamadas"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"As informações são usadas para anúncios de chamadas e outros"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Partilha da ligação à internet"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Mensagens de texto"</string>
@@ -140,7 +162,7 @@
     <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Usar para entrada"</string>
     <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="3374057355721486932">"Usar para aparelhos auditivos"</string>
     <string name="bluetooth_le_audio_profile_summary_use_for" msgid="2778318636027348572">"Usar para LE_AUDIO"</string>
-    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Sincr."</string>
+    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Sincronizar"</string>
     <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"SINCRONIZAR"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Cancelar"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"A sincronização concede acesso aos seus contactos e ao histórico de chamadas quando tem uma ligação estabelecida."</string>
@@ -265,7 +287,7 @@
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Mostrar um botão no menu ligar/desligar para criar um relatório de erro"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"Manter ativo"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"O ecrã nunca entrará em suspensão durante o carregamento"</string>
-    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Ativar registo de monit. Bluetooth HCI"</string>
+    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Ativar registo de monitorização Bluetooth HCI"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Capturar os pacotes Bluetooth (ative/desative o Bluetooth após alterar esta definição)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"Desbloqueio de OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Permitir o desbloqueio do carregador de arranque"</string>
@@ -305,7 +327,7 @@
     <string name="private_dns_mode_off" msgid="7065962499349997041">"Desativado"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automático"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"Nome do anfitrião do fornecedor DNS privado"</string>
-    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Introduza nome - anfitrião do fornecedor DNS"</string>
+    <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Introduza o nome de anfitrião do fornecedor DNS"</string>
     <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Não foi possível estabelecer ligação"</string>
     <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opções da certificação de display sem fios"</string>
     <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar o nível de reg. de Wi-Fi, mostrar por RSSI de SSID no Selec. de Wi-Fi"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Assumir que as apps suportam formatos modernos"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificações de transcodificação"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Desativar cache de transcodificação"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Definições do Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forçar utilização alternativa do L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecione para forçar a utilização alternativa do L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver e controlar os serviços actualmente em execução"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação WebView"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Usar idiomas do sistema"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Falha ao abrir as definições para <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Este método de introdução pode permitir a recolha de todo o texto que digitar, incluindo dados pessoais como, por exemplo, palavras-passe e números de cartões de crédito. Decorre da aplicação <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Usar este método de introdução?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Nota: após reiniciar, só é possível iniciar esta aplicação quando o telemóvel for desbloqueado."</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Nota: após um reinício, só é possível iniciar esta app com o telemóvel desbloqueado."</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"Estado do registo IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Registado"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Não registado"</string>
@@ -555,7 +574,7 @@
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Este tablet"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altifalante estação carregam."</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>
     <string name="media_transfer_this_phone" msgid="7194341457812151531">"Este telemóvel"</string>
@@ -619,14 +638,13 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Falha ao criar um novo utilizador"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Falha ao criar um novo convidado"</string>
     <string name="user_nickname" msgid="262624187455825083">"Alcunha"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"O nome e a imagem que escolher ficam visíveis para qualquer pessoa que use este dispositivo."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Adicionar utilizador"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Adicionar convidado"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string>
     <string name="guest_reset_guest" msgid="6110013010356013758">"Repor convidado"</string>
     <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Quer repor o convidado?"</string>
-    <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"Remover o convidado?"</string>
+    <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"Remover convidado?"</string>
     <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Repor"</string>
     <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Remover"</string>
     <string name="guest_resetting" msgid="7822120170191509566">"A repor o convidado…"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Toda a atividade é eliminada ao sair"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Pode guardar ou eliminar a sua atividade ao sair"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Reponha para eliminar agora a atividade da sessão. Pode ainda guardar ou eliminar a atividade ao sair"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Tirar uma foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Escolher uma imagem"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Selecionar foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Demasiadas tentativas incorretas. Os dados deste dispositivo vão ser eliminados."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Demasiadas tentativas incorretas. Este utilizador vai ser eliminado."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desligada."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Sem chamadas."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Escolha uma imagem do perfil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Ícone do utilizador predefinido"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Teclado físico"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Escolha um esquema de teclado"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Predefinição"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index bb83c2b..811c04a 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Ativo, apenas o esquerdo"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Ativo, apenas o direito"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Ativo, esquerdo e direito"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Áudio da mídia"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Chamadas telefônicas"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferência de arquivo"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Considerar que os apps são compatíveis com formatos modernos"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificações de transcodificação"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Desativar cache da transcodificação"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Configurações o Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forçar substituição do L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecione para forçar a substituição do L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver e controlar os serviços em execução no momento"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação do WebView"</string>
@@ -522,7 +541,7 @@
     <string name="ims_reg_title" msgid="8197592958123671062">"Estado do registro de IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Registrado"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Não registrado"</string>
-    <string name="status_unavailable" msgid="5279036186589861608">"Não disponível"</string>
+    <string name="status_unavailable" msgid="5279036186589861608">"Indisponível"</string>
     <string name="wifi_status_mac_randomized" msgid="466382542497832189">"O MAC é randomizado"</string>
     <string name="wifi_tether_connected_summary" msgid="5100712926640492336">"{count,plural, =1{1 dispositivo conectado}one{# dispositivo conectado}other{# dispositivos conectados}}"</string>
     <string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Mais tempo."</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Falha ao criar um novo usuário"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Falha ao criar um novo convidado"</string>
     <string name="user_nickname" msgid="262624187455825083">"Apelido"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"O nome e a foto que você escolher ficarão visíveis para qualquer pessoa que usar este dispositivo."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Adicionar usuário"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Adicionar visitante"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Remover visitante"</string>
@@ -642,13 +660,11 @@
     <string name="guest_exit_clear_data_button" msgid="3425812652180679014">"Excluir"</string>
     <string name="guest_exit_save_data_button" msgid="3690974510644963547">"Salvar"</string>
     <string name="guest_exit_button" msgid="5774985819191803960">"Sair do modo visitante"</string>
-    <string name="guest_reset_button" msgid="2515069346223503479">"Redefinir Sessão de visitante"</string>
+    <string name="guest_reset_button" msgid="2515069346223503479">"Redefinir sessão de visitante"</string>
     <string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"Sair do modo visitante"</string>
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Todas as atividades serão excluídas ao sair"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Você pode salvar ou excluir sua atividade ao sair"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Redefina para excluir a atividade da sessão agora. Salve ou exclua a atividade ao sair"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Tirar uma foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Escolher uma imagem"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Selecionar foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Excesso de tentativas incorretas. Os dados deste dispositivo serão excluídos."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Excesso de tentativas incorretas. O usuário será excluído."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet desconectada."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Sem chamadas."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Escolher a foto do perfil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Ícone de usuário padrão"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Teclado físico"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Escolha o layout do teclado"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Padrão"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 1482ee5..1233afd 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -106,12 +106,34 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Activ, numai stânga"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Activ, numai dreapta"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Activ, stânga și dreapta"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Conținut media audio"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Apeluri telefonice"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transfer de fișiere"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Dispozitiv de intrare"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Acces la internet"</string>
-    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Permite accesul la agendă și la istoric"</string>
+    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Oferă acces la agendă și istoric apeluri"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Informațiile se vor folosi pentru notificări de apeluri etc."</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Distribuirea conexiunii la internet"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Mesaje text"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Presupune că aplicațiile acceptă formatele moderne"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Vezi notificările privind transcodarea"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Dezactivează memoria cache pentru transcodare"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Setări Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forțează alternativa L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selectează pentru a forța alternativa L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Servicii în curs de funcționare"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Vezi și controlează serviciile care funcționează în prezent"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementare WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Nu s-a creat noul utilizator"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Nu s-a putut crea un invitat nou"</string>
     <string name="user_nickname" msgid="262624187455825083">"Pseudonim"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Toată lumea care folosește dispozitivul va vedea numele și fotografia pe care le-ai ales."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Adaugă un utilizator"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Adaugă un invitat"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Șterge invitatul"</string>
@@ -628,7 +646,7 @@
     <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Resetezi invitatul?"</string>
     <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"Excluzi invitatul?"</string>
     <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Resetează"</string>
-    <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Elimină"</string>
+    <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Exclude"</string>
     <string name="guest_resetting" msgid="7822120170191509566">"Se resetează invitatul…"</string>
     <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"Resetezi sesiunea pentru invitați?"</string>
     <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Astfel, va începe o nouă sesiune pentru invitați și se vor șterge toate aplicațiile și datele din sesiunea actuală"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Toate activitățile vor fi șterse la ieșire"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Poți să salvezi sau să ștergi activitatea la ieșire"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Resetează pentru a șterge acum activitatea din sesiune sau salvează ori șterge activitatea la ieșire"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Fă o fotografie"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Alege o imagine"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Selectează fotografia"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Prea multe încercări incorecte. Datele de pe acest dispozitiv vor fi șterse."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Prea multe încercări incorecte. Acest utilizator va fi șters."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet deconectat."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Apelarea nu este disponibilă."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Alege o fotografie de profil"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Pictograma prestabilită a utilizatorului"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Tastatură fizică"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Alege aspectul tastaturii"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Prestabilit"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 7fa3f18..43645f4 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активен, только левое ухо"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активен, только правое ухо"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активен, оба уха"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Профиль A2DP"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Звонки"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Профиль OPP"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Считать, что приложения поддерживают современные форматы кодирования"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Показывать уведомления о перекодировании"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Отключить кеш перекодирования"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Настройки Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Принудительный переход к L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Выберите, чтобы использовать принудительный переход к L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Работающие службы"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Просмотр работающих служб и управление ими"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Сервис WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Не удалось создать пользователя"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Не удалось создать гостя."</string>
     <string name="user_nickname" msgid="262624187455825083">"Псевдоним"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Выбранные вами имя пользователя и фото профиля будут видны всем, кто использует это устройство."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Добавить пользователя"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Добавить гостя"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Удалить аккаунт гостя"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"История будет удалена сразу после выхода"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"При выходе вы можете сохранить или удалить историю"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Можно сбросить историю сеанса прямо сейчас, либо удалить или сохранить ее при выходе."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Сделать снимок"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Выбрать фото"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Выбрать фотографию"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Слишком много неудачных попыток. С устройства будут удалены все данные."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Слишком много неудачных попыток. Этот пользователь будет удален."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Устройство отключено от Ethernet."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Совершение вызовов невозможно."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Выберите фото профиля"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Значок пользователя по умолчанию"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Физическая клавиатура"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Выберите раскладку клавиатуры"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"По умолчанию"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index ec40926..d965b73 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"සක්‍රිය, වම පමණි"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"සක්‍රිය, දකුණ පමණි"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"සක්‍රිය, වම සහ දකුණ"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"මාධ්‍ය ශ්‍රව්‍ය"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"දුරකථන ඇමතුම්"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ගොනු හුවමාරුව"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"යෙදුම් නවීන ආකෘති සඳහා සහාය දක්වයි යැයි උපකල්පනය කරමු"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ට්‍රාන්ස්කෝඩින් දැනුම්දීම් පෙන්වන්න"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ට්‍රාන්ස්කොඩින් හැඹිලිය අබල කරන්න"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine සැකසීම්"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 පසුබැසීමට බල කරන්න"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 පසුබැසීමට බල කිරීමට තෝරන්න"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"ධාවනය වන සේවා"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"දැනට ධාවනය වන සේවා බලන්න සහ පාලනය කරන්න"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ක්‍රියාත්මක කිරීම"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"නව පරිශීලකයෙකු තැනීමට අසමත් විය"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"නව අමුත්තකු තැනීම අසාර්ථක විය"</string>
     <string name="user_nickname" msgid="262624187455825083">"අපනාමය"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"ඔබ තෝරා ගන්නා නම සහ පින්තූරය මෙම උපාංගය භාවිතා කරන ඕනෑම කෙනෙකුට දෘශ්‍යමාන වනු ඇත."</string>
     <string name="user_add_user" msgid="7876449291500212468">"පරිශීලකයා එක් කරන්න"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"අමුත්තා එක් කරන්න"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"අමුත්තා ඉවත් කරන්න"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"පිටවීමේදී සියලු ක්‍රියාකාරකම් මකනු ඇත"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"ඔබට පිටවීමේදී ඔබගේ ක්‍රියාකාරකම් සුරැකීමට හෝ මැකීමට හැකිය"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"දැන් සැසි ක්‍රියාකාරකම් මැකීමට යළි සකසන්න, නැතහොත් ඔබට පිටවීමේදී ක්‍රියාකාරකම් සුරැකීමට හෝ මැකීමට හැකිය"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ඡායාරූපයක් ගන්න"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"රූපයක් තෝරන්න"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ඡායාරූපය තෝරන්න"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"වැරදි උත්සාහයන් ඉතා වැඩි ගණනකි. මෙම උපාංගයෙහි දත්ත මකනු ඇත."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"වැරදි උත්සාහයන් ඉතා වැඩි ගණනකි. මෙම පරිශීලකයා මකනු ඇත."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ඊතර්නෙට් විසන්ධි කරන ලදී."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ඊතර්නෙට්."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"ඇමතුම් නැත."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"පැතිකඩ පින්තූරයක් තේරීම"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"පෙරනිමි පරිශීලක නිරූපකය"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"භෞතික යතුරු පුවරුව"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"යතුරු පුවරු පිරිසැලසුම තෝරන්න"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"පෙරනිමි"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 4b90a91..77c265e 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -106,12 +106,34 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktívne, iba ľavá strana"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktívne, iba pravá strana"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktívne, ľavá aj pravá strana"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvuk médií"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonické hovory"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Prenos súborov"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Vstupné zariadenie"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Prístup na internet"</string>
-    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Povoľte aj prístup ku kontaktom a histórii hovorov"</string>
+    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Povoliť prístup ku kontaktom a histórii hovorov"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Pomocou informácií sa budú oznamovať hovory a viac"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Zdieľanie pripojenia na Internet"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Textové správy"</string>
@@ -140,7 +162,7 @@
     <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Použiť pre vstup"</string>
     <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="3374057355721486932">"Používať pre načúvadlá"</string>
     <string name="bluetooth_le_audio_profile_summary_use_for" msgid="2778318636027348572">"Používať s profilom LE_AUDIO"</string>
-    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Párovať"</string>
+    <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Spárovať"</string>
     <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"PÁROVAŤ"</string>
     <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Zrušiť"</string>
     <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Párovaním udelíte zariadeniam po pripojení prístup k svojim kontaktom a histórii hovorov."</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Prepdokladať, že aplikácie podporujú moderné formáty"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Zobraziť upozornenia prekódovania"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Deaktivácia vyrovnávacej pamäte prekódovania"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Nastavenia softvéru Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Vynútiť zálohu L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Vyberte, keď chcete vynútiť zálohu L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Spustené služby"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Zobrazovať a riadiť aktuálne spustené služby"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementácia WebView"</string>
@@ -483,7 +502,7 @@
     <string name="battery_info_status_charging" msgid="4279958015430387405">"Nabíja sa"</string>
     <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Rýchle nabíjanie"</string>
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Pomalé nabíjanie"</string>
-    <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Nabíja sa bezdrôtovo"</string>
+    <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Bezdrôtové nabíjanie"</string>
     <string name="battery_info_status_charging_dock" msgid="8573274094093364791">"Nabíja sa"</string>
     <string name="battery_info_status_discharging" msgid="6962689305413556485">"Nenabíja sa"</string>
     <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Pripojené, ale nenabíja sa"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Nového použív. sa nepodarilo vytvoriť"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Nového hosťa sa nepodarilo vytvoriť"</string>
     <string name="user_nickname" msgid="262624187455825083">"Prezývka"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Meno a obrázok, ktorý vyberiete, uvidia všetci používatelia tohto zariadenia."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Pridať používateľa"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Pridať hosťa"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Odobrať hosťa"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Pri ukončení sa všetka aktivita odstráni"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Aktivitu môžete pri ukončení uložiť alebo odstrániť"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Resetovaním ihneď odstránite aktivitu relácie alebo ju uložte či odstráňte pri ukončení relácie"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Odfotiť"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Vybrať obrázok"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Vybrať fotku"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Príliš veľa chybných pokusov. Údaje tohto zariadenia budú odstránené."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Príliš veľa chybných pokusov. Tento používateľ bude odobraný."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Sieť ethernet je odpojená"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Žiadne volanie."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Výber profilovej fotky"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Predvolená ikona používateľa"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fyzická klávesnica"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Vyberte rozloženie klávesnice"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Predvolené"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index f04e839..abca26f 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktivno, samo levo"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktivno, samo desno"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktivno, levo in desno"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvok predstavnosti"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonski klici"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Prenos datoteke"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Aplikacije naj bi podpirale sodobne oblike zapisov"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Prikaz obvestil o prekodiranju"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Onemogoči predpomnilnik za prekodiranje"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Nastavitve za Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Vsili nadomestno varnostno raven L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Izbira vsiljenja nadomestne varnostne ravni L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Zagnane storitve"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Preglejte in nadzorujte storitve, ki so trenutno zagnane."</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Izvedba spletnega pogleda"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Ustvarjanje novega uporabnika ni uspelo."</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Ustvarjanje novega gosta ni uspelo."</string>
     <string name="user_nickname" msgid="262624187455825083">"Vzdevek"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Ime in slika, ki ju izberete, bosta vidna vsem, ki uporabljajo to napravo."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Dodaj uporabnika"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gosta"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Odstrani gosta"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Ko zaprete način za goste, bo vsa dejavnost izbrisana."</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Ob zaprtju načina lahko shranite ali izbrišete dejavnost."</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Ponastavite za izbris dejavnosti v seji zdaj, lahko pa jo shranite ali izbrišete, ko zaprete način za goste."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Fotografiranje"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Izberi sliko"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Izbira fotografije"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Preveč napačnih poskusov. Podatki v napravi bodo izbrisani."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Preveč napačnih poskusov. Uporabnik bo izbrisan."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernetna povezava je prekinjena."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Klicanje ni mogoče."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Izbira profilne slike"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Privzeta ikona uporabnika"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fizična tipkovnica"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Izbira razporeditve tipkovnice"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Privzeto"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 6721987..0f48e42c9 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -106,7 +106,29 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktive, vetëm majtas"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktive, vetëm djathtas"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktive, majtas dhe djathtas"</string>
-    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audioja e klipit \"media\""</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
+    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audioja e medias"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonatat"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferimi i skedarëve"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Pajisja e hyrjes"</string>
@@ -410,8 +432,8 @@
     <string name="force_resizable_activities_summary" msgid="2490382056981583062">"Bëj që të gjitha aktivitetet të kenë madhësi të ndryshueshme për përdorimin me shumë dritare, pavarësisht vlerave të manifestit."</string>
     <string name="enable_freeform_support" msgid="7599125687603914253">"Aktivizo dritaret me formë të lirë"</string>
     <string name="enable_freeform_support_summary" msgid="1822862728719276331">"Aktivizo mbështetjen për dritaret eksperimentale me formë të lirë."</string>
-    <string name="local_backup_password_title" msgid="4631017948933578709">"Fjalëkalimi rezervë i kompjuterit"</string>
-    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Rezervimet e plota në kompjuter nuk janë të mbrojtura aktualisht"</string>
+    <string name="local_backup_password_title" msgid="4631017948933578709">"Fjalëkalimi i rezervimit të desktopit"</string>
+    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Rezervimet e plota të desktopit nuk janë të mbrojtura aktualisht"</string>
     <string name="local_backup_password_summary_change" msgid="1707357670383995567">"Trokit për të ndryshuar ose hequr fjalëkalimin për rezervime të plota të desktopit"</string>
     <string name="local_backup_password_toast_success" msgid="4891666204428091604">"Fjalëkalimi i ri u vendos"</string>
     <string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"Fjalëkalimi i ri dhe konfirmimi nuk përputhen"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Supozo se aplikacionet i mbështetin formatet moderne"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Shfaq njoftimet e transkodimit"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Çaktivizo memorien specifike të transkodimit"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Cilësimet e Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Detyro kalimin përsëri te L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Zgjidh që të detyrosh kalimin përsëri te L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Shërbimet në ekzekutim"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Shiko dhe kontrollo shërbimet që po ekzekutohen aktualisht"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Zbatimi i WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Krijimi i një përdoruesi të ri dështoi"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Profili i vizitorit të ri nuk u krijua"</string>
     <string name="user_nickname" msgid="262624187455825083">"Pseudonimi"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Emri dhe fotografia që zgjedh ti do të jenë të dukshme për çdo person që përdor këtë pajisje."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Shto përdorues"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Shto vizitor"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Hiq vizitorin"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Të gjitha aktivitetet do të fshihen kur të dalësh"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Mund ta ruash ose ta fshish aktivitetin tënd kur të dalësh"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Rivendose për të fshirë aktivitetin e sesionit tani ose mund ta ruash ose ta fshish aktivitetin kur të dalësh"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Bëj një fotografi"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Zgjidh një imazh"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Zgjidh një fotografi"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Shumë tentativa të pasakta. Të dhënat e kësaj pajisjeje do të fshihen."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Shumë tentativa të pasakta. Ky përdorues do të fshihet."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Lidhja e eternetit u shkëput."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Eternet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Telefonatat nuk ofrohen"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Zgjidh një fotografi profili"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Ikona e parazgjedhur e përdoruesit"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Tastiera fizike"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Zgjidh strukturën e tastierës"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Parazgjedhja"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 5497c6e..d309036c 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -106,11 +106,33 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активно, само с леве стране"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активно, с десне стране"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активно, с леве и десне стране"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Звук медија"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Телефонски позиви"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Пренос датотеке"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Улазни уређај"</string>
-    <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Приступ Интернету"</string>
+    <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Приступ интернету"</string>
     <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Дозволи контакте и историју позива"</string>
     <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Информације ће се користити за обавештења о позивима и друго"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Дељење интернет везе"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Подразумевај да апликације подржавају модерне формате"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Приказуј обавештења о транскодирању"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Онемогући кеш транскодирања"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine подешавања"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Принудно примени L3 резерву"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Изаберите да бисте принудно применили L3 резерву"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Покренуте услуге"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Приказ и контрола тренутно покренутих услуга"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Примена WebView-а"</string>
@@ -611,16 +630,15 @@
     <string name="user_new_profile_name" msgid="2405500423304678841">"Нови профил"</string>
     <string name="user_info_settings_title" msgid="6351390762733279907">"Подаци о кориснику"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"Подаци о профилу"</string>
-    <string name="user_need_lock_message" msgid="4311424336209509301">"Да бисте могли да направите ограничени профил, треба да подесите закључавање екрана да бисте заштитили апликације и личне податке."</string>
-    <string name="user_set_lock_button" msgid="1427128184982594856">"Подеси закључавање"</string>
+    <string name="user_need_lock_message" msgid="4311424336209509301">"Да бисте могли да направите ограничени профил, треба да подесите откључавање екрана да бисте заштитили апликације и личне податке."</string>
+    <string name="user_set_lock_button" msgid="1427128184982594856">"Подеси откључавање"</string>
     <string name="user_switch_to_user" msgid="6975428297154968543">"Пређи на корисника <xliff:g id="USER_NAME">%s</xliff:g>"</string>
     <string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Прави се нови корисник…"</string>
     <string name="creating_new_guest_dialog_message" msgid="1114905602181350690">"Прави се нови гост…"</string>
     <string name="add_user_failed" msgid="4809887794313944872">"Прављење новог корисника није успело"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Прављење новог госта није успело"</string>
     <string name="user_nickname" msgid="262624187455825083">"Надимак"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Име и слику које изаберете видеће свако ко користи овај уређај."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Додај корисника"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Додај госта"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Уклони госта"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Све активности ће бити избрисане при излазу"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Можете да сачувате или избришете активности при излазу"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Ресетујете за брисање активности сесије, или сачувајте или избришите активности при излазу"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Сликај"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Одабери слику"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Изаберите слику"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Превише нетачних покушаја. Избрисаћемо податке са овог уређаја."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Превише нетачних покушаја. Избрисаћемо овог корисника."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Веза са етернетом је прекинута."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Етернет."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Без позивања."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Одаберите слику профила"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Подразумевана икона корисника"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Физичка тастатура"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Одаберите распоред тастатуре"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Подразумевано"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index a331bc6..363396a 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktiv, bara vänster"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktiv, bara höger"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktiv, vänster och höger"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Medialjud"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonsamtal"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Filöverföring"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Anta att appar har stöd för moderna format"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Visa aviseringar för omkodning"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Inaktivera cacheminne för omkodning"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-inställningar"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Tvinga L3-alternativ"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Välj för att tvinga L3-alternativ"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktiva tjänster"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visa och styr aktiva tjänster"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Använd systemspråk"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Det gick inte att öppna inställningarna för <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"Den här inmatningsmetoden kan samla all text som du skriver, inklusive personliga uppgifter som lösenord och kreditkortsnummer. Den kommer från appen <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Vill du använda inmatningsmetoden?"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Obs! När du har startat om enheten måste du låsa upp mobilen innan du kan starta den här appen"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Obs! När du har startat om enheten måste du låsa upp telefonen innan du kan starta den här appen"</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"IMS-registrering"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"Registrerad"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Ej registrerad"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Det gick inte att skapa en ny användare"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Det gick inte att skapa en ny gäst"</string>
     <string name="user_nickname" msgid="262624187455825083">"Smeknamn"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Namnet och bilden du väljer visas för alla som använder den här enheten."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Lägg till användare"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Lägg till gäst"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Ta bort gäst"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"All aktivitet raderas när du avslutar"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Du kan spara eller radera aktivitet när du avslutar"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Återställ om du vill radera sessionsaktiviteten nu, eller spara eller radera aktivitet när du avslutar"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Ta ett foto"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Välj en bild"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Välj foto"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"För många felaktiga försök. Enhetens data raderas."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"För många felaktiga försök. Den här användaren raderas."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet har kopplats från."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Inga anrop."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Välj en profilbild"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Ikon för standardanvändare"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fysiskt tangentbord"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Välj en tangentbordslayout"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Standard"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 53481a2..ebff38b 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Inatumika, kushoto pekee"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Inatumika, kulia pekee"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Inatumika, kushoto na kulia"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Sauti ya maudhui"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Simu"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Uhamishaji wa faili"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Chukulia kuwa programu zinatumia miundo ya kisasa"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Onyesha arifa za kubadilisha muundo wa faili"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Zima kipengele cha akiba ya kubadilisha muundo wa faili"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Mipangilio ya Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Lazimisha chaguo mbadala ya L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Teua ili ulazimishe chaguo mbadala ya L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Huduma zinazoendeshwa"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Onyesha na udhibiti huduma zinazoendeshwa kwa sasa"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Utekelezaji wa WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Imeshindwa kuweka mtumiaji mpya"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Imeshindwa kuunda wasifu mpya wa mgeni"</string>
     <string name="user_nickname" msgid="262624187455825083">"Jina wakilishi"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Jina na picha unayochagua itaonwa na mtu yeyote anayetumia kifaa hiki."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Ongeza mtumiaji"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Ongeza mgeni"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Ondoa mgeni"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Shughuli zote zitafutwa wakati wa kufunga"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Unaweza kuhifadhi au kufuta shughuli zako wakati wa kufunga"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Weka upya ili ufute shughuli za kipindi sasa au unaweza kuhifadhi au kufuta shughuli wakati wa kufunga"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Piga picha"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Chagua picha"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Chagua picha"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Umejaribu kufungua mara nyingi mno kwa njia isiyo sahihi. Data iliyo kwenye kifaa hiki itafutwa."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Umejaribu kufungua mara nyingi mno kwa njia isiyo sahihi. Maelezo ya mtumiaji huyu yatafutwa."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethaneti imeondolewa."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethaneti."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Huwezi kupiga wala kupokea simu."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Chagua picha ya wasifu"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Aikoni chaguomsingi ya mtumiaji"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Kibodi halisi"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Chagua mpangilio wa kibodi"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Chaguomsingi"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 204da0c..1648de0 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"இடது பக்கம் மட்டும் செயலில் உள்ளது"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"வலது பக்கம் மட்டும் செயலில் உள்ளது"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"வலது மற்றும் இடது பக்கம் செயலில் உள்ளது"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"மீடியா ஆடியோ"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ஃபோன் அழைப்புகள்"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ஃபைல் இடமாற்றம்"</string>
@@ -265,7 +287,7 @@
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"பிழை அறிக்கையைப் பெற பவர் மெனுவில் விருப்பத்தைக் காட்டு"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"செயலில் வைத்திரு"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"சார்ஜ் ஏறும்போது திரை எப்போதும் உறக்கநிலைக்குச் செல்லாது"</string>
-    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"புளூடூத் HCI ஸ்னுப் பதிவை இயக்கு"</string>
+    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"புளூடூத் HCI ஸ்னுப் பதிவை இயக்குதல்"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"புளூடூத் பேக்கெட்டுகளைக் கண்டறி. (இந்த அமைப்பை மாற்றிய பின்பு, புளூடூத்தை மாற்று)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM திறத்தல்"</string>
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"பூட்லோடரைத் திறக்க அனுமதி"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"ஆப்ஸ் மாடர்ன் வடிவங்களை ஆதரிக்கும்படி அமை"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"குறிமாற்ற அறிவிப்புகளைக் காட்டு"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"குறிமாற்றத்திற்கான தற்காலிக சேமிப்பை முடக்குதல்"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine அமைப்புகள்"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 ஃபால்பேக்கை இயக்குதல்"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 ஃபால்பேக்கை இயக்குவதற்குத் தேர்ந்தெடுக்கலாம்"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"இயங்கும் சேவைகள்"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"தற்போது இயக்கத்தில் இருக்கும் சேவைகளைப் பார்த்து கட்டுப்படுத்து"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView செயல்படுத்தல்"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"புதிய பயனரை உருவாக்க முடியவில்லை"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"புதிய விருந்தினரை உருவாக்க முடியவில்லை"</string>
     <string name="user_nickname" msgid="262624187455825083">"புனைப்பெயர்"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"நீங்கள் தேர்வுசெய்யும் பெயரையும் படத்தையும் இந்தச் சாதனத்தைப் பயன்படுத்தும் அனைவரும் பார்க்கலாம்."</string>
     <string name="user_add_user" msgid="7876449291500212468">"பயனரைச் சேர்"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"கெஸ்ட்டைச் சேர்"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"கெஸ்ட்டை அகற்று"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"வெளியேறியவுடன் அனைத்துச் செயல்பாடுகளும் நீக்கப்படும்"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"வெளியேறும்போது செயல்பாடுகளைச் சேமிக்கலாம் அல்லது நீக்கலாம்"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"அமர்வின் செயல்பாடுகளை இப்போதே நீக்க ரீசெட் செய்யவும் அல்லது வெளியேறும்போது செயல்பாடுகளைச் சேமிக்கலாம் அல்லது நீக்கலாம்"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"படமெடுங்கள்"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"படத்தைத் தேர்வுசெய்யுங்கள்"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"படத்தைத் தேர்ந்தெடுங்கள்"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"பலமுறை தவறாக முயன்ற காரணத்தால் இந்தச் சாதனத்தின் தரவு நீக்கப்படும்."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"பலமுறை தவறாக முயன்ற காரணத்தால் இந்தப் பயனர் நீக்கப்படுவார்."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ஈத்தர்நெட் துண்டிக்கப்பட்டது."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ஈதர்நெட்."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"அழைப்பை மேற்கொள்ள முடியவில்லை."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"சுயவிவரப் படத்தைத் தேர்வுசெய்யுங்கள்"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"இயல்புநிலைப் பயனர் ஐகான்"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"கீபோர்டு"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"கீபோர்டு தளவமைப்பைத் தேர்வுசெய்தல்"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"இயல்பு"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index f576c8d..7ee57cf 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"యాక్టివ్‌గా ఉంది, ఎడమవైపు మాత్రమే యాక్టివ్‌గా ఉంది"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"యాక్టివ్‌గా ఉంది, కుడివైపు యాక్టివ్‌గా ఉంది"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"యాక్టివ్‌గా ఉంది, ఎడమవైపు, కుడివైపు యాక్టివ్‌గా ఉంది"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"మీడియా ఆడియో"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ఫోన్ కాల్స్‌"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ఫైల్ బదిలీ"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"యాప్‌లు ఆధునిక ఫార్మాట్‌లకు సపోర్ట్ చేస్తాయని అనుకోండి"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ట్రాన్స్‌కోడింగ్ నోటిఫికేషన్‌లను చూపండి"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ట్రాన్స్‌కోడింగ్ కాష్‌ను డిజేబుల్ చేయండి"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine సెట్టింగ్‌లు"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"ఫోర్స్ L3 ఫాల్‌బ్యాక్"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ఫోర్స్ L3 ఫాల్‌బ్యాక్‌ను ఎంచుకోండి"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"అమలులో ఉన్న సర్వీస్‌లు"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ప్రస్తుతం అమలులో ఉన్న సర్వీస్‌లను చూడండి, కంట్రోల్‌ చేయండి"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"వెబ్ వీక్షణ అమలు"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"కొత్త యూజర్‌ను క్రియేట్ చేయడం విఫలమైంది"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"కొత్త అతిథిని క్రియేట్ చేయడం విఫలమైంది"</string>
     <string name="user_nickname" msgid="262624187455825083">"మారుపేరు"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"మీరు ఎంచుకున్న పేరు, ఇమేజ్ ఈ పరికరాన్ని ఉపయోగించే ఎవరికైనా కనిపిస్తాయి."</string>
     <string name="user_add_user" msgid="7876449291500212468">"యూజర్‌ను జోడించండి"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"గెస్ట్‌ను జోడించండి"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"గెస్ట్‌ను తీసివేయండి"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"వైదొలగినప్పుడు యాక్టివిటీ అంతా తొలగించబడుతుంది"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"మీరు వైదొలగేటప్పుడు, యాక్టివిటీని సేవ్ చేయవచ్చు లేదా తొలగించవచ్చు"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"సెషన్ యాక్టివిటీని తొలగించడానికి ఇప్పుడే రీసెట్ చేయండి లేదా మీరు నిష్క్రమించేటప్పుడు యాక్టివిటీని సేవ్ చేయవచ్చు లేదా తొలగించవచ్చు"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ఒక ఫోటో తీయండి"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"ఇమేజ్‌ను ఎంచుకోండి"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"ఫోటోను ఎంచుకోండి"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"చాలా ఎక్కువ తప్పు ప్రయత్నాలు చేశారు. ఈ పరికరం డేటా తొలగించబడుతుంది."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"చాలా ఎక్కువ తప్పు ప్రయత్నాలు చేశారు. ఈ యూజర్ తొలగించబడతారు."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ఈథర్‌నెట్ డిస్‌కనెక్ట్ చేయబడింది."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ఈథర్‌నెట్."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"కాలింగ్ మోడ్ ఆఫ్‌లో ఉంది."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"ప్రొఫైల్ ఫోటోను ఎంచుకోండి"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ఆటోమేటిక్ సెట్టింగ్ యూజర్ చిహ్నం"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"భౌతిక కీబోర్డ్"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"కీబోర్డ్ లేఅవుట్‌ను ఎంచుకోండి"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ఆటోమేటిక్ సెట్టింగ్"</string>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index 480aee4..bf73a22 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -59,7 +59,7 @@
     <item msgid="6421717003037072581">"ใช้การตรวจสอบ HDCP เสมอ"</item>
   </string-array>
   <string-array name="bt_hci_snoop_log_entries">
-    <item msgid="695678520785580527">"ปิดใช้"</item>
+    <item msgid="695678520785580527">"ปิดใช้อยู่"</item>
     <item msgid="6336372935919715515">"เปิดใช้รายการที่กรอง"</item>
     <item msgid="2779123106632690576">"เปิดใช้"</item>
   </string-array>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 42e6c05..55b57db 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -106,13 +106,35 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"ใช้งานอยู่ เฉพาะข้างซ้าย"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"ใช้งานอยู่ เฉพาะข้างขวา"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"ใช้งานอยู่ ข้างซ้ายและขวา"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"เสียงของสื่อ"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"โทรศัพท์"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"การถ่ายโอนไฟล์"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"อุปกรณ์อินพุต"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"การเข้าถึงอินเทอร์เน็ต"</string>
     <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"ให้เข้าถึงรายชื่อติดต่อและประวัติการโทร"</string>
-    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"จะมีการใช้ข้อมูลเพื่อประกาศการติดต่อและอื่นๆ"</string>
+    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"จะมีการใช้ข้อมูลเพื่อประกาศการโทรและอื่นๆ"</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"การแชร์การเชื่อมต่ออินเทอร์เน็ต"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"ข้อความ"</string>
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"การเข้าถึงซิม"</string>
@@ -239,7 +261,7 @@
     <string name="adb_wireless_settings" msgid="2295017847215680229">"การแก้ไขข้อบกพร่องผ่าน Wi-Fi"</string>
     <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"หากต้องการดูและใช้อุปกรณ์ที่มีอยู่ ให้เปิดการแก้ไขข้อบกพร่องผ่าน Wi-Fi"</string>
     <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"จับคู่อุปกรณ์ด้วยคิวอาร์โค้ด"</string>
-    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"จับคู่อุปกรณ์เครื่องใหม่โดยใช้เครื่องมือสแกนคิวอาร์โค้ด"</string>
+    <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"จับคู่อุปกรณ์เครื่องใหม่โดยใช้แอปสแกนคิวอาร์โค้ด"</string>
     <string name="adb_pair_method_code_title" msgid="1122590300445142904">"จับคู่อุปกรณ์ด้วยรหัสการจับคู่"</string>
     <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"จับคู่อุปกรณ์เครื่องใหม่โดยใช้รหัสตัวเลข 6 หลัก"</string>
     <string name="adb_paired_devices_title" msgid="5268997341526217362">"อุปกรณ์ที่จับคู่"</string>
@@ -263,9 +285,9 @@
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, แก้ไขข้อบกพร่อง, พัฒนา"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"ทางลัดรายงานข้อบกพร่อง"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"แสดงปุ่มในเมนูเปิด/ปิดสำหรับการใช้รายงานข้อบกพร่อง"</string>
-    <string name="keep_screen_on" msgid="1187161672348797558">"เปิดหน้าจอค้าง"</string>
+    <string name="keep_screen_on" msgid="1187161672348797558">"เปิดหน้าจอค้างไว้"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"หน้าจอจะไม่เข้าสู่โหมดสลีปขณะชาร์จ"</string>
-    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"เปิดใช้งานบันทึก HCI Snoop ของบลูทูธ"</string>
+    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"เปิดใช้บันทึก HCI Snoop ของบลูทูธ"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"บันทึกแพ็กเก็ตบลูทูธ (ปิด-เปิดบลูทูธหลังจากเปลี่ยนการตั้งค่านี้)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"การปลดล็อก OEM"</string>
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"อนุญาตให้ปลดล็อกตัวโหลดการเปิดเครื่อง"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"ถือว่าแอปรองรับรูปแบบสมัยใหม่"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"แสดงการแจ้งเตือนการแปลง"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ปิดใช้แคชสำหรับการแปลง"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"การตั้งค่า Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 สำรอง"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"เลือกเพื่อเปิดใช้ Force L3 สำรอง"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"บริการที่ทำงานอยู่"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"ดูและควบคุมบริการที่ทำงานอยู่"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"การใช้งาน WebView"</string>
@@ -518,7 +537,7 @@
     <string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"ใช้ภาษาของระบบ"</string>
     <string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"ไม่สามารถเปิดการตั้งค่าสำหรับ <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
     <string name="ime_security_warning" msgid="6547562217880551450">"วิธีการป้อนข้อมูลนี้อาจเก็บข้อความทั้งหมดที่คุณพิมพ์ รวมถึงข้อมูลส่วนบุคคล เช่น รหัสผ่านและหมายเลขบัตรเครดิต โดยมาจากแอปพลิเคชัน <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> ใช้วิธีการป้อนข้อมูลนี้หรือไม่"</string>
-    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"หมายเหตุ: หลังจากเริ่มต้นใหม่ แอปนี้จะไม่สามารถเริ่มการทำงานได้จนกว่าคุณจะปลดล็อกโทรศัพท์"</string>
+    <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"หมายเหตุ: หลังจากรีบูต แอปนี้จะไม่สามารถเริ่มการทำงานได้จนกว่าคุณจะปลดล็อกโทรศัพท์"</string>
     <string name="ims_reg_title" msgid="8197592958123671062">"สถานะการลงทะเบียน IMS"</string>
     <string name="ims_reg_status_registered" msgid="884916398194885457">"ลงทะเบียนแล้ว"</string>
     <string name="ims_reg_status_not_registered" msgid="2989287366045704694">"ไม่ได้ลงทะเบียน"</string>
@@ -555,7 +574,7 @@
     <string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"แท็บเล็ตเครื่องนี้"</string>
     <!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
     <skip />
-    <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"แท่นวางลำโพง"</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>
     <string name="media_transfer_this_phone" msgid="7194341457812151531">"โทรศัพท์เครื่องนี้"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"สร้างผู้ใช้ใหม่ไม่ได้"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"สร้างผู้เข้าร่วมใหม่ไม่สำเร็จ"</string>
     <string name="user_nickname" msgid="262624187455825083">"ชื่อเล่น"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"ทุกคนที่ใช้อุปกรณ์เครื่องนี้จะเห็นชื่อและรูปภาพที่คุณเลือก"</string>
     <string name="user_add_user" msgid="7876449291500212468">"เพิ่มผู้ใช้"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"เพิ่มผู้ใช้ชั่วคราว"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"นำผู้ใช้ชั่วคราวออก"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"ระบบจะลบกิจกรรมทั้งหมดเมื่อออก"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"คุณสามารถบันทึกหรือลบกิจกรรมเมื่อออก"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"รีเซ็ตเพื่อลบกิจกรรมของเซสชันตอนนี้เลย หรือจะ​บันทึกหรือลบกิจกรรมเมื่อออกก็ได้"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ถ่ายรูป"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"เลือกรูปภาพ"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"เลือกรูปภาพ"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"ใช้ความพยายามหลายครั้งเกินไป ระบบจะลบข้อมูลในอุปกรณ์เครื่องนี้"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"ใช้ความพยายามหลายครั้งเกินไป ระบบจะลบผู้ใช้รายนี้"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ยกเลิกการเชื่อมต่ออีเทอร์เน็ตแล้ว"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"อีเทอร์เน็ต"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"ไม่มีการโทร"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"เลือกรูปโปรไฟล์"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ไอคอนผู้ใช้เริ่มต้น"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"แป้นพิมพ์จริง"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"เลือกรูปแบบแป้นพิมพ์"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ค่าเริ่มต้น"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 73db0c5..c34588d 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Aktibo, kaliwa lang"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Aktibo, kanan lang"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Aktibo, kaliwa at kanan"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audio ng media"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Mga tawag sa telepono"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Paglilipat ng file"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Ipagpalagay na sinusuportahan ng mga app ang mga modernong format"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Ipakita ang mga notification sa pag-transcode"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"I-disable ang cache ng pag-transcode"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Mga setting ng Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Puwersahin ang L3 fallback"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Piliin para puwersahin ang L3 fallback"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Mga tumatakbong serbisyo"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Tingnan at kontrolin ang mga kasalukuyang tumatakbong serbisyo"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Pagpapatupad sa WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Hindi nakagawa ng bagong user"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Hindi nakagawa ng bagong guest"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nickname"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Makikita ng sinumang gumagamit ng device na ito ang pangalan at larawang pipiliin mo."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Magdagdag ng user"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Magdagdag ng bisita"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Alisin ang bisita"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Made-delete ang lahat ng aktibidad kapag umalis"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Puwede mong i-save o i-delete ang aktibidad pagkaalis"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Mag-reset para mag-delete ng aktibidad ng session ngayon, o puwede kang mag-save o mag-delete ng aktibidad pagkaalis"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Kumuha ng larawan"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Pumili ng larawan"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Pumili ng larawan"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Masyadong maraming maling pagsubok. Made-delete ang data ng device na ito."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Masyadong maraming maling pagsubok. Made-delete ang user na ito."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Nadiskonekta ang Ethernet."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Hindi makakatawag."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Pumili ng larawan sa profile"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Icon ng default na user"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Pisikal na keyboard"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Pumili ng layout ng keyboard"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Default"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 98cfe35..4315241 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Yalnızca sol tarafta etkin"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Yalnızca sağ tarafta etkin"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Sol ve sağ tarafta etkin"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Medya sesi"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefon aramaları"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Dosya aktarımı"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Uygulamaların modern biçimleri desteklediğini varsay"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Kod dönüştürme bildirimlerini göster"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Kod dönüştürme önbelleğini devre dışı bırak"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ayarları"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 yedeğiniz zorunlu tut"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 yedeğini zorunlu tutmak için seçin"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Çalışan hizmetler"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Şu anda çalışan hizmetleri görüntüle ve denetle"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Web Görünümü kullanımı"</string>
@@ -484,7 +503,7 @@
     <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Hızlı şarj oluyor"</string>
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Yavaş şarj oluyor"</string>
     <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Kablosuz şarj oluyor"</string>
-    <string name="battery_info_status_charging_dock" msgid="8573274094093364791">"Şarj Etme"</string>
+    <string name="battery_info_status_charging_dock" msgid="8573274094093364791">"Şarj oluyor"</string>
     <string name="battery_info_status_discharging" msgid="6962689305413556485">"Şarj olmuyor"</string>
     <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Bağlı ancak şarj olmuyor"</string>
     <string name="battery_info_status_full" msgid="1339002294876531312">"Şarj oldu"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Yeni kullanıcı oluşturulamadı"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Yeni misafir oluşturulamadı"</string>
     <string name="user_nickname" msgid="262624187455825083">"Takma ad"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Seçtiğiniz ad ve resim bu cihazı kullanan herkese görünür."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Kullanıcı ekle"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Misafir ekle"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Misafir oturumunu kaldır"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Çıkış yapıldığında tüm etkinlikler silinir"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Etkinliklerinizi çıkarken kaydedebilir veya silebilirsiniz"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Oturum etkinliklerini silmek için sıfırlayabilir ya da çıkarken kaydedebilir veya silebilirsiniz"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Fotoğraf çek"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Resim seç"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Fotoğraf seç"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Çok fazla sayıda hatalı deneme yapıldı. Bu cihazın verileri silinecek."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Çok fazla sayıda hatalı deneme yapıldı. Bu kullanıcı silinecek."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet bağlantısı kesildi."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Çağrı yok."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Profil fotoğrafı seçin"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Varsayılan kullanıcı simgesi"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Fiziksel klavye"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Klavye düzenini seçin"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Varsayılan"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 3321c78..ac9edc5 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -106,7 +106,29 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Активовано, лише лівий"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Активовано, лише правий"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Активовано, лівий і правий"</string>
-    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Звук медіа-файлів"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
+    <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Звук медіафайлів"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Телефонні дзвінки"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Передавання файлів"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Пристрій введення"</string>
@@ -265,7 +287,7 @@
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Показувати в меню живлення кнопку створення звіту про помилки"</string>
     <string name="keep_screen_on" msgid="1187161672348797558">"Залишати активним"</string>
     <string name="keep_screen_on_summary" msgid="1510731514101925829">"Екран не засинатиме під час заряджання"</string>
-    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Журнал інтерфейсу Bluetooth"</string>
+    <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Увімкнути журнал перехоплення даних інтерфейсу Bluetooth"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Отримання пакетів Bluetooth. (Змінивши це налаштування, увімкніть Bluetooth.)"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"Розблокування виробником"</string>
     <string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Дозволити розблокування завантажувача"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Вважати, що додатки підтримують сучасні формати"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Показувати сповіщення про перекодування"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Вимкнути кеш перекодування"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Налаштування Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Примусово повернутися на рівень безпеки 3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Виберіть, щоб примусово повернутися на рівень безпеки 3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Запущені сервіси"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Переглянути й налаштувати запущені сервіси"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Застосування WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Не вдалося створити користувача"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Не вдалося створити гостя"</string>
     <string name="user_nickname" msgid="262624187455825083">"Псевдонім"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Вибрані вами ім’я і зображення бачитимуть усі, хто користується вашим пристроєм."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Додати ​користувача"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Додати гостя"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Видалити гостя"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Під час виходу буде видалено історію всіх дій"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Під час виходу можна зберегти або видалити ваші дії"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Можна скинути історію сеансу просто зараз або видалити чи зберегти її під час виходу."</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Зробити фотографію"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Вибрати зображення"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Вибрати фотографію"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Забагато невдалих спроб. Дані на цьому пристрої буде видалено."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Забагато невдалих спроб. Цього користувача буде видалено."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Ethernet відключено."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Виклики недоступні."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Виберіть зображення профілю"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Значок користувача за умовчанням"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Фізична клавіатура"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Вибрати розкладку клавіатури"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"За умовчанням"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index dadb9bc..d2fc32a 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"فعال، صرف بائیں طرف"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"فعال، صرف دائیں طرف"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"فعال، صرف بائیں اور دائیں طرف"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"میڈيا آڈیو"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"فون کالز"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"فائل کی منتقلی"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"فرض کریں کہ ایپس جدید فارمیٹس کو سپورٹ کرتی ہیں"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"ٹرانسکوڈنگ اطلاعات دکھائیں"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"ٹرانسکوڈنگ کیش غیر فعال کریں"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"‏Widevine کی ترتیبات"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"‏Force L3 fallback منتخب کریں"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"چل رہی سروسز"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"فی الحال چل رہی سروسز دیکھیں اور انہیں کنٹرول کریں"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"‏WebView کا نفاذ"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"نیا صارف بنانے میں ناکام"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"نیا مہمان بنانے میں ناکام"</string>
     <string name="user_nickname" msgid="262624187455825083">"عرفی نام"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"آپ کی جانب سے منتخب کردہ نام اور تصویر، اس آلے کے استعمال کرنے والے ہر شخص کو نظر آئے گی۔"</string>
     <string name="user_add_user" msgid="7876449291500212468">"صارف کو شامل کریں"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"مہمان کو شامل کریں"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"مہمان کو ہٹائیں"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"باہر نکلنے پر تمام سرگرمیاں حذف کر دی جائیں گی"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"باہر نکلنے پر آپ اپنی سرگرمی کو محفوظ یا حذف کر سکتے ہیں"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"سیشن کی سرگرمی کو ابھی حذف کرنے کے لیے ری سیٹ کریں، یا باہر نکلنے پر آپ اپنی سرگرمی کو محفوظ یا حذف کر سکتے ہیں"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"ایک تصویر لیں"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"ایک تصویر منتخب کریں"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"تصویر منتخب کریں"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"بہت زیادہ غلط کوششیں۔ اس آلے کا ڈیٹا حذف کر دیا جائے گا۔"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"بہت زیادہ غلط کوششیں۔ اس صارف کو حذف کر دیا جائے گا۔"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"ایتھرنیٹ منقطع ہے۔"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"ایتھرنیٹ۔"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"کوئی کالنگ نہیں ہے۔"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"پروفائل کی تصویر منتخب کریں"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"ڈیفالٹ صارف کا آئیکن"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"فزیکل کی بورڈ"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"کی بورڈ لے آؤٹ منتخب کریں"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ڈیفالٹ"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 2254132..3c8e249 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Faol, faqat chap"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Faol, faqat oʻng"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Faol, chap va oʻng"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"A2DP profili"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefon chaqiruvlari"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Fayl uzatish"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Ilovalarda zamonaviy kodlash formatlari ishlaydi deb hisoblash"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Transkripsiya bildirishnomalarini chiqarish"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Transkripsiya keshini faolsizlantirish"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine sozlamalari"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Majburiy L3 zaxirasi"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Majburiy L3 zaxirasini tanlash"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Ishlab turgan ilovalar"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ishlab turgan ilovalarni ko‘rish va boshqarish"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ta’minotchisi"</string>
@@ -609,7 +628,7 @@
     <string name="user_add_user_type_title" msgid="551279664052914497">"Qo‘shish"</string>
     <string name="user_new_user_name" msgid="60979820612818840">"Yangi foydalanuvchi"</string>
     <string name="user_new_profile_name" msgid="2405500423304678841">"Yangi profil"</string>
-    <string name="user_info_settings_title" msgid="6351390762733279907">"Foydalanuvchi ma‘lumoti"</string>
+    <string name="user_info_settings_title" msgid="6351390762733279907">"Foydalanuvchi haqida"</string>
     <string name="profile_info_settings_title" msgid="105699672534365099">"Profil haqida axborot"</string>
     <string name="user_need_lock_message" msgid="4311424336209509301">"Cheklangan profil yaratish uchun, shaxsiy ilovlar va ma‘lumotlarni himoyalash maqsadida avval ekran qulfini yaratish lozim."</string>
     <string name="user_set_lock_button" msgid="1427128184982594856">"Qulf o‘rnatish"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Yangi foydalanuvchi yaratilmadi"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Yangi mehmon yaratilmadi"</string>
     <string name="user_nickname" msgid="262624187455825083">"Nik"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Tanlangan nom va rasm bu qurilmaning barcha foydalanuvchilariga koʻrinadi"</string>
     <string name="user_add_user" msgid="7876449291500212468">"Foydalanuvchi kiritish"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Mehmon kiritish"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Mehmonni olib tashlash"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Chiqishda faolliklar tarixi tozalab tashlanadi"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Chiqish vaqtida faoliyatni saqlash yoki tozalash mumkin"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Faoliyat hozir tozalanib tiklanishi yoki chiqish vaqtida saqlanishi yoki tozalanishi mumkin"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Suratga olish"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Rasm tanlash"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Surat tanlash"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Juda koʻp marta muvaffaqiyatsiz urinishlar amalga oshirildi. Bu qurilmadagi maʼlumotlar o‘chirib tashlanadi."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Juda koʻp marta muvaffaqiyatsiz urindingiz. Bu foydalanuvchi oʻchirib tashlanadi."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Qurilma Ethernet tarmog‘idan uzildi."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Chaqiruv imkonsiz."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Profil rasmini tanlash"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Foydalanuvchining standart belgisi"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Tashqi klaviatura"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Klaviatura sxemasini tanlang"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Asosiy"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index c98dcec..b3d70cc 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -106,13 +106,35 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Đang hoạt động, chỉ tai bên trái"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Đang hoạt động, chỉ tai phải"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Đang hoạt động, cả tai phải và tai trái"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Âm thanh nội dung nghe nhìn"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Cuộc gọi điện thoại"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Chuyển tệp"</string>
     <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Thiết bị đầu vào"</string>
     <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Truy cập Internet"</string>
-    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Cho truy cập danh bạ và nhật ký cuộc gọi"</string>
-    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Thông tin được dùng cho tính năng thông báo cuộc gọi, v.v."</string>
+    <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Cho phép truy cập danh bạ và nhật ký cuộc gọi"</string>
+    <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Thông tin sẽ được dùng cho tính năng thông báo cuộc gọi, v.v."</string>
     <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Chia sẻ kết nối internet"</string>
     <string name="bluetooth_profile_map" msgid="8907204701162107271">"Tin nhắn văn bản"</string>
     <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Truy cập SIM"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Giả định rằng các ứng dụng hỗ trợ định dạng hiện đại"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Hiện thông báo chuyển mã"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Vô hiệu hóa bộ nhớ đệm dùng để chuyển mã"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Cài đặt Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Buộc sử dụng mức bảo mật L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Chọn để buộc sử dụng mức bảo mật L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Các dịch vụ đang chạy"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Xem và kiểm soát các dịch vụ đang chạy"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Triển khai WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Không tạo được người dùng mới"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Không tạo được khách mới"</string>
     <string name="user_nickname" msgid="262624187455825083">"Biệt hiệu"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Bất kỳ ai dùng thiết bị này đều sẽ nhìn thấy tên và hình ảnh bạn chọn."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Thêm người dùng"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Thêm khách"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Xóa khách"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Mọi hoạt động sẽ bị xoá khi thoát"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Bạn có thể lưu hoặc xoá hoạt động của mình khi thoát"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Đặt lại để xoá hoạt động trong phiên ngay bây giờ, hoặc bạn có thể lưu hoặc xoá hoạt động khi thoát"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Chụp ảnh"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Chọn một hình ảnh"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Chọn ảnh"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Quá nhiều lần thử không chính xác. Dữ liệu trên thiết bị này sẽ bị xoá."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Quá nhiều lần thử không chính xác. Người dùng này sẽ bị xoá."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Đã ngắt kết nối Ethernet."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Không thể gọi điện."</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Chọn một ảnh hồ sơ"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Biểu tượng người dùng mặc định"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Bàn phím thực"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Chọn bố cục bàn phím"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Mặc định"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 136586d..6a9a18c 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"使用中,仅左耳助听器"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"使用中,仅右耳助听器"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"使用中,左右耳助听器"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"媒体音频"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"通话"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"文件传输"</string>
@@ -301,7 +323,7 @@
     <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"触发蓝牙音频 LDAC\n编解码器选择:播放质量"</string>
     <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"正在流式传输:<xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
     <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"专用 DNS"</string>
-    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"选择私人 DNS 模式"</string>
+    <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"选择专用 DNS 模式"</string>
     <string name="private_dns_mode_off" msgid="7065962499349997041">"已关闭"</string>
     <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"自动"</string>
     <string name="private_dns_mode_provider" msgid="3619040641762557028">"专用 DNS 提供商主机名"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"假设应用支持现代格式"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"显示转码通知"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"停用转码缓存"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine 设置"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"强制执行 L3 回退"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"选择即可强制执行 L3 回退"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"正在运行的服务"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看和控制当前正在运行的服务"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 实现"</string>
@@ -596,8 +615,8 @@
     <string name="user_add_user_item_title" msgid="2394272381086965029">"用户"</string>
     <string name="user_add_profile_item_title" msgid="3111051717414643029">"受限个人资料"</string>
     <string name="user_add_user_title" msgid="5457079143694924885">"要添加新用户吗?"</string>
-    <string name="user_add_user_message_long" msgid="1527434966294733380">"创建新用户后,您就能够与其他人共用此设备。每位用户都有自己的专属空间,而且在自己的个人空间内还可以自行安装自己想要的应用、设置壁纸等。此外,用户还可以调整会影响所有用户的设备设置(例如 WLAN 设置)。\n\n当您添加新用户后,该用户需要自行设置个人空间。\n\n任何用户都可以为所有其他用户更新应用。无障碍功能设置和服务可能无法转移给新用户。"</string>
-    <string name="user_add_user_message_short" msgid="3295959985795716166">"当您添加新用户后,该用户需要自行设置个人空间。\n\n任何用户都可以为所有其他用户更新应用。"</string>
+    <string name="user_add_user_message_long" msgid="1527434966294733380">"创建新用户后,您就能够与其他人共用此设备。每位用户都有自己的专属空间,而且在自己的个人空间内还可以自行安装自己想要的应用、设置壁纸等。此外,用户还可以调整会影响所有用户的设备设置(例如 WLAN 设置)。\n\n新添加的用户需要自行设置个人空间。\n\n任何用户都可为所有其他用户更新应用。无障碍功能设置和服务可能无法转移给新用户。"</string>
+    <string name="user_add_user_message_short" msgid="3295959985795716166">"新添加的用户需要自行设置个人空间。\n\n任何用户都可为所有其他用户更新应用。"</string>
     <string name="user_grant_admin_title" msgid="5157031020083343984">"将此用户设为管理员?"</string>
     <string name="user_grant_admin_message" msgid="1673791931033486709">"管理员拥有其他用户没有的特殊权限。管理员可以管理所有用户、更新或重置此设备、修改设置、查看所有已安装的应用,以及授予或撤消其他用户的管理员权限。"</string>
     <string name="user_grant_admin_button" msgid="5441486731331725756">"设为管理员"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"无法创建新用户"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"未能创建新的访客"</string>
     <string name="user_nickname" msgid="262624187455825083">"昵称"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"使用此设备的任何用户都能看到您选择的名称和照片。"</string>
     <string name="user_add_user" msgid="7876449291500212468">"添加用户"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"添加访客"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"移除访客"</string>
@@ -644,11 +662,9 @@
     <string name="guest_exit_button" msgid="5774985819191803960">"退出访客模式"</string>
     <string name="guest_reset_button" msgid="2515069346223503479">"重置访客会话"</string>
     <string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"退出访客模式"</string>
-    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"退出时所有活动都将被删除"</string>
+    <string name="guest_notification_ephemeral" msgid="7263252466950923871">"退出时所有活动记录都将被删除"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"您可以在退出时保存或删除您的活动"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"请立即重置以删除会话活动记录;或者,您也可以在退出时保存或删除活动记录"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"拍摄照片"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"选择图片"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"选择照片"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"错误次数过多。系统将删除此设备上的数据。"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"错误次数过多。系统将删除此用户。"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"以太网已断开连接。"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"以太网。"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"不启用通话。"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"选择个人资料照片"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"默认用户图标"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"实体键盘"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"选择键盘布局"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"默认"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index a32e51e..ecdfa62 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"使用中,僅左耳"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"使用中,僅右耳"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"使用中,左右耳"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"媒體音效"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"通話"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"檔案傳輸"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"假設應用程式支援新型格式"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"顯示轉碼通知"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"停用轉碼快取"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine 設定"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"強制退回 L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"選取即可強制退回 L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"執行中的服務"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看並控制目前正在執行中的服務"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 設置"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"無法建立新使用者"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"無法建立新訪客"</string>
     <string name="user_nickname" msgid="262624187455825083">"暱稱"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"此裝置的任何使用者都能看到你選擇的名稱和圖片。"</string>
     <string name="user_add_user" msgid="7876449291500212468">"新增使用者"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"新增訪客"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"移除訪客"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"結束時將會刪除所有活動"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"你可以在結束時儲存或刪除活動"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"重設可立即刪除工作階段活動,或者你可以在結束時儲存或刪除活動"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"拍照"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"選擇圖片"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"揀相"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"錯誤次數太多,系統將會刪除此裝置上的資料。"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"錯誤次數太多,系統將會刪除此使用者。"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"以太網連接中斷。"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"以太網絡。"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"不啟用通話。"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"選擇個人檔案相片"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"預設使用者圖示"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"實體鍵盤"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"選擇鍵盤配置"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"預設"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index b5f5e2e..99fe41e 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"使用中,僅左耳"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"使用中,僅右耳"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"使用中,左右耳"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"媒體音訊"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"通話"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"檔案傳輸"</string>
@@ -263,8 +285,8 @@
     <string name="keywords_adb_wireless" msgid="6507505581882171240">"ADB, 偵錯, 開發"</string>
     <string name="bugreport_in_power" msgid="8664089072534638709">"錯誤回報捷徑"</string>
     <string name="bugreport_in_power_summary" msgid="1885529649381831775">"在電源選單中顯示取得錯誤報告的按鈕"</string>
-    <string name="keep_screen_on" msgid="1187161672348797558">"螢幕不休眠"</string>
-    <string name="keep_screen_on_summary" msgid="1510731514101925829">"充電時螢幕不會進入休眠"</string>
+    <string name="keep_screen_on" msgid="1187161672348797558">"不鎖定螢幕"</string>
+    <string name="keep_screen_on_summary" msgid="1510731514101925829">"充電時螢幕不會鎖定"</string>
     <string name="bt_hci_snoop_log" msgid="7291287955649081448">"啟用藍牙 HCI 窺探記錄"</string>
     <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"擷取藍牙數據包 (變更這項設定後請切換藍牙)。"</string>
     <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM 解鎖"</string>
@@ -411,7 +433,7 @@
     <string name="enable_freeform_support" msgid="7599125687603914253">"啟用自由形式視窗"</string>
     <string name="enable_freeform_support_summary" msgid="1822862728719276331">"啟用實驗版自由形式視窗的支援功能。"</string>
     <string name="local_backup_password_title" msgid="4631017948933578709">"電腦備份密碼"</string>
-    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"目前尚未設定密碼來保護完整的備份檔案 (透過電腦備份的檔案)"</string>
+    <string name="local_backup_password_summary_none" msgid="7646898032616361714">"尚未設定密碼保護電腦的完整備份"</string>
     <string name="local_backup_password_summary_change" msgid="1707357670383995567">"輕觸即可變更或移除電腦完整備份的密碼"</string>
     <string name="local_backup_password_toast_success" msgid="4891666204428091604">"已設定新備份密碼"</string>
     <string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"新密碼與確認密碼不符。"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"假設應用程式支援新格式"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"顯示轉碼通知"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"停用轉碼快取"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine 設定"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"強制退回 L3"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"選取即可強制退回 L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"正在運作的服務"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看並管理目前正在執行的服務"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 實作"</string>
@@ -483,7 +502,7 @@
     <string name="battery_info_status_charging" msgid="4279958015430387405">"充電中"</string>
     <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"快速充電中"</string>
     <string name="battery_info_status_charging_slow" msgid="3190803837168962319">"慢速充電中"</string>
-    <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"正在進行無線充電"</string>
+    <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"正在無線充電"</string>
     <string name="battery_info_status_charging_dock" msgid="8573274094093364791">"充電中"</string>
     <string name="battery_info_status_discharging" msgid="6962689305413556485">"非充電中"</string>
     <string name="battery_info_status_not_charging" msgid="1103084691314264664">"已連接,但未充電"</string>
@@ -491,7 +510,7 @@
     <string name="battery_info_status_full_charged" msgid="3536054261505567948">"充電完成"</string>
     <string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"目前暫停充電"</string>
     <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"已由管理員停用"</string>
-    <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由限制設定控管"</string>
+    <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由受限制的設定控管"</string>
     <string name="disabled" msgid="8017887509554714950">"已停用"</string>
     <string name="external_source_trusted" msgid="1146522036773132905">"允許"</string>
     <string name="external_source_untrusted" msgid="5037891688911672227">"不允許"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"無法建立新的使用者"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"無法建立新訪客"</string>
     <string name="user_nickname" msgid="262624187455825083">"暱稱"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"這部裝置的所有使用者都能看到你選擇的名稱和相片。"</string>
     <string name="user_add_user" msgid="7876449291500212468">"新增使用者"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"新增訪客"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"移除訪客"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"結束時將刪除所有活動"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"你可以在結束時儲存或刪除活動"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"重設即可立即刪除工作階段活動,你也可以在結束時儲存或刪除活動"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"拍照"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"選擇圖片"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"選取相片"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"錯誤次數過多,系統將刪除這部裝置中的資料。"</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"錯誤次數過多,系統將刪除這位使用者。"</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"未連上乙太網路。"</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"乙太網路。"</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"不顯示在螢幕上。"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"選擇個人資料相片"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"預設使用者圖示"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"實體鍵盤"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"選擇鍵盤配置"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"預設"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 19dbebf..6f06e1f 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -106,6 +106,28 @@
     <string name="bluetooth_hearing_aid_left_active" msgid="7084887715570971441">"Iyasebenza, ngakwesokunxele kuphela"</string>
     <string name="bluetooth_hearing_aid_right_active" msgid="8574683234077567230">"Iyasebenza, ngakwesokudla kuphela"</string>
     <string name="bluetooth_hearing_aid_left_and_right_active" msgid="407704460573163973">"Iyasebenza, ngakwesokunxele nakwesokudla"</string>
+    <!-- no translation found for bluetooth_active_media_only_battery_level (1164678961213251365) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_battery_level_untethered (1345174295097854560) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_lea_support (8580950145907305436) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_lea_support (8534816721698743015) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_left_lea_support (6605320955858788855) -->
+    <skip />
+    <!-- no translation found for bluetooth_battery_level_untethered_right_lea_support (5717356160322149355) -->
+    <skip />
+    <!-- no translation found for bluetooth_active_media_only_no_battery_level (71106861912593126) -->
+    <skip />
+    <!-- no translation found for bluetooth_saved_device_lea_support (7231323139968285768) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_active (1632152540901488645) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_right_active (3854140683042617230) -->
+    <skip />
+    <!-- no translation found for bluetooth_hearing_aid_media_only_left_and_right_active (1299913413062528417) -->
+    <skip />
     <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Umsindo wemidiya"</string>
     <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Amakholi efoni"</string>
     <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Dlulisa ifayela"</string>
@@ -437,9 +459,6 @@
     <string name="transcode_default" msgid="3784803084573509491">"Kuthathe njengokungathi izinhlelo zokusebenza zisekela amafomethi esimanje"</string>
     <string name="transcode_notification" msgid="5560515979793436168">"Bonisa izaziso zokudlulisela ikhodi"</string>
     <string name="transcode_disable_cache" msgid="3160069309377467045">"Khubaza inqolobane yokudlulisela ikhodi"</string>
-    <string name="widevine_settings_title" msgid="4023329801172572917">"Amasethingi e-Widevine"</string>
-    <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
-    <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Khetha ukuphoqa isihibe sika-L3"</string>
     <string name="runningservices_settings_title" msgid="6460099290493086515">"Amasevisi asebenzayo"</string>
     <string name="runningservices_settings_summary" msgid="1046080643262665743">"Buka futhi ulawule amasevisi  asebenzayo okwamanje"</string>
     <string name="select_webview_provider_title" msgid="3917815648099445503">"Ukufakwa ke-WebView"</string>
@@ -619,8 +638,7 @@
     <string name="add_user_failed" msgid="4809887794313944872">"Yehlulekile ukudala umsebenzisi omusha"</string>
     <string name="add_guest_failed" msgid="8074548434469843443">"Yehlulekile ukusungula isimenywa esisha"</string>
     <string name="user_nickname" msgid="262624187455825083">"Isiteketiso"</string>
-    <!-- no translation found for edit_user_info_message (6677556031419002895) -->
-    <skip />
+    <string name="edit_user_info_message" msgid="6677556031419002895">"Igama nesithombe osikhethayo sizobonakala kunoma ubani osebenzisa le divayisi."</string>
     <string name="user_add_user" msgid="7876449291500212468">"Engeza umsebenzisi"</string>
     <string name="guest_new_guest" msgid="3482026122932643557">"Engeza isivakashi"</string>
     <string name="guest_exit_guest" msgid="5908239569510734136">"Susa isihambeli"</string>
@@ -647,8 +665,6 @@
     <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Wonke umsebenzi uzosulwa lapho uphuma"</string>
     <string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Ungalondoloza noma usule umsebenzi wakho lapho uphuma"</string>
     <string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Setha kabusha ukuze usule umsebenzi wesikhathi manje, noma ungalondoloza noma usule umsebenzi lapho uphuma"</string>
-    <string name="user_image_take_photo" msgid="467512954561638530">"Thatha isithombe"</string>
-    <string name="user_image_choose_photo" msgid="1363820919146782908">"Khetha isithombe"</string>
     <string name="user_image_photo_selector" msgid="433658323306627093">"Khetha isithombe"</string>
     <string name="failed_attempts_now_wiping_device" msgid="4016329172216428897">"Imizamo eminingi kakhulu engalungile. Le datha yedivayisi izosulwa."</string>
     <string name="failed_attempts_now_wiping_user" msgid="469060411789668050">"Imizamo eminingi kakhulu engalungile. Lo msebenzisi uzosulwa."</string>
@@ -688,8 +704,6 @@
     <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"I-Ethernet inqanyuliwe."</string>
     <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"I-Ethernet."</string>
     <string name="accessibility_no_calling" msgid="3540827068323895748">"Akukho ukwenza ikholi"</string>
-    <string name="avatar_picker_title" msgid="8492884172713170652">"Khetha isithombe sephrofayela"</string>
-    <string name="default_user_icon_description" msgid="6554047177298972638">"Isithonjana somsebenzisi sokuzenzakalelayo"</string>
     <string name="physical_keyboard_title" msgid="4811935435315835220">"Ikhibhodi ephathekayo"</string>
     <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Khetha isendlalelo sekhibhodi"</string>
     <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Zenzekela"</string>
diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml
index 1b29e83..5a4d3ce 100644
--- a/packages/SettingsLib/res/values/arrays.xml
+++ b/packages/SettingsLib/res/values/arrays.xml
@@ -639,15 +639,6 @@
         <item>disabled</item>
     </array>
 
-    <!-- Images offered as options in the avatar picker. If populated, the avatar_image_descriptions
-         array must also be populated with a content description for each image. -->
-    <array name="avatar_images"/>
-
-    <!-- Content descriptions for each of the images in the avatar_images array. When overlaid
-         these values should be translated, but this empty array must not be translated or it may
-         replace the real descriptions with an empty array. -->
-    <string-array name="avatar_image_descriptions" translatable="false"/>
-
     <!-- NOTE: if you change this, you must also add the corresponding scale key and lookup table to
      frameworks/base/core/java/android/content/res/FontScaleConverterFactory.java -->
     <string-array name="entryvalues_font_size" translatable="false">
diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml
index 07854bd..ab04904 100644
--- a/packages/SettingsLib/res/values/dimens.xml
+++ b/packages/SettingsLib/res/values/dimens.xml
@@ -82,14 +82,6 @@
     <dimen name="add_a_photo_circled_padding">6dp</dimen>
     <dimen name="user_photo_size_in_user_info_dialog">112dp</dimen>
     <dimen name="add_a_photo_icon_size_in_user_info_dialog">32dp</dimen>
-    <dimen name="user_name_height_in_user_info_dialog">48sp</dimen>
-
-    <integer name="avatar_picker_columns">3</integer>
-    <dimen name="avatar_size_in_picker">96dp</dimen>
-    <dimen name="avatar_picker_padding">6dp</dimen>
-    <dimen name="avatar_picker_margin">2dp</dimen>
-
-    <dimen name="avatar_picker_icon_inset">25dp</dimen>
 
     <!-- Minimum increment between density scales. -->
     <fraction name="display_density_min_scale_interval">9%</fraction>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 8a5dfef..7e6b004 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -222,6 +222,30 @@
     <!-- Connected device settings. Message when the left-side and right-side hearing aids device are active. [CHAR LIMIT=NONE] -->
     <string name="bluetooth_hearing_aid_left_and_right_active">Active, left and right</string>
 
+    <!-- Connected devices settings. Message when Bluetooth is connected and active for media only, showing remote device status and battery level. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_active_media_only_battery_level">Active (media only), <xliff:g id="battery_level_as_percentage">%1$s</xliff:g> battery</string>
+    <!-- Connected devices settings. Message when Bluetooth is connected and active for media only, showing remote device status and battery level for untethered headset. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_active_media_only_battery_level_untethered">Active (media only), L: <xliff:g id="battery_level_as_percentage" example="25%">%1$s</xliff:g> battery, R: <xliff:g id="battery_level_as_percentage" example="25%">%2$s</xliff:g> battery</string>
+    <!-- Connected devices settings. Message when Bluetooth is connected but not in use, showing remote device battery level, supports audio sharing. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_battery_level_lea_support">Connected (supports audio sharing), <xliff:g id="battery_level_as_percentage">%1$s</xliff:g> battery</string>
+    <!-- Connected devices settings. Message when Bluetooth is connected but not in use, showing remote device battery level for untethered headset, supports audio sharing. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_battery_level_untethered_lea_support">Connected (supports audio sharing), L: <xliff:g id="battery_level_as_percentage" example="25%">%1$s</xliff:g> battery, R: <xliff:g id="battery_level_as_percentage" example="25%">%2$s</xliff:g> battery</string>
+    <!-- Connected devices settings. Message when Bluetooth is connected but not in use, showing remote device battery level for the left part of the untethered headset, supports audio sharing. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_battery_level_untethered_left_lea_support">Connected (supports audio sharing), left <xliff:g id="battery_level_as_percentage" example="25%">%1$s</xliff:g></string>
+    <!-- Connected devices settings. Message when Bluetooth is connected but not in use, showing remote device battery level for the right part of the untethered headset, supports audio sharing. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_battery_level_untethered_right_lea_support">Connected (supports audio sharing), right <xliff:g id="battery_level_as_percentage" example="25%">%1$s</xliff:g></string>
+    <!-- Connected devices settings. Message when Bluetooth is connected and active for media only but no battery information, showing remote device status. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_active_media_only_no_battery_level">Active (media only)</string>
+    <!-- Connected devices settings. Message shown when bluetooth device is disconnected but is a known, previously connected device, supports audio sharing [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_saved_device_lea_support">Supports audio sharing</string>
+
+    <!-- Connected device settings. Message when the left-side hearing aid device is active for media only. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_hearing_aid_media_only_left_active">Active (media only), left only</string>
+    <!-- Connected device settings. Message when the right-side hearing aid device is active for media only. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_hearing_aid_media_only_right_active">Active (media only), right only</string>
+    <!-- Connected device settings. Message when the left-side and right-side hearing aids device are active for media only. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_hearing_aid_media_only_left_and_right_active">Active (media only), left and right</string>
+
     <!-- Bluetooth settings.  The user-visible string that is used whenever referring to the A2DP profile. -->
     <string name="bluetooth_profile_a2dp">Media audio</string>
     <!-- Bluetooth settings.  The user-visible string that is used whenever referring to the headset or handsfree profile. -->
@@ -1030,13 +1054,6 @@
     <!-- Settings item title to select whether to disable cache for transcoding. [CHAR LIMIT=85] -->
     <string name="transcode_disable_cache">Disable transcoding cache</string>
 
-    <!-- Developer settings title: widevine settings screen. [CHAR LIMIT=50] -->
-    <string name="widevine_settings_title">Widevine settings</string>
-     <!-- Developer settings title: select whether to enable Force L3 fallback. [CHAR LIMIT=50] -->
-    <string name="force_l3_fallback_title">Force L3 fallback</string>
-     <!-- Developer settings summary: select whether to enable Force L3 fallback.[CHAR LIMIT=NONE] -->
-    <string name="force_l3_fallback_summary">Select to force L3 fallback</string>
-
     <!-- Services settings screen, setting option name for the user to go to the screen to view running services -->
     <string name="runningservices_settings_title">Running services</string>
     <!-- Services settings screen, setting option summary for the user to go to the screen to view running services  -->
@@ -1547,10 +1564,6 @@
     <string name="guest_notification_non_ephemeral_non_first_login">Reset to delete session
         activity now, or you can save or delete activity on exit</string>
 
-    <!-- An option in a photo selection dialog to take a new photo [CHAR LIMIT=50] -->
-    <string name="user_image_take_photo">Take a photo</string>
-    <!-- An option in a photo selection dialog to choose a pre-existing image [CHAR LIMIT=50] -->
-    <string name="user_image_choose_photo">Choose an image</string>
     <!-- Accessibility message for the photo selector which is a button/popup with the current photo [CHAR LIMIT=50] -->
     <string name="user_image_photo_selector">Select photo</string>
 
@@ -1668,12 +1681,6 @@
     <string name="accessibility_no_calling">No calling.</string>
 
 
-    <!-- Title for a screen allowing the user to choose a profile picture. [CHAR LIMIT=NONE] -->
-    <string name="avatar_picker_title">Choose a profile picture</string>
-
-    <!-- Content description for a default user icon. [CHAR LIMIT=NONE] -->
-    <string name="default_user_icon_description">Default user icon</string>
-
     <!-- Title for the 'physical keyboard' settings screen. [CHAR LIMIT=35] -->
     <string name="physical_keyboard_title">Physical keyboard</string>
     <!-- Title for the keyboard layout preference dialog. [CHAR LIMIT=35] -->
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java
index f36da19..1597a4b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java
@@ -28,6 +28,7 @@
 import android.app.AppOpsManager;
 import android.app.admin.DevicePolicyManager;
 import android.app.ecm.EnhancedConfirmationManager;
+import android.app.admin.PackagePolicy;
 import android.app.role.RoleManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -57,6 +58,7 @@
 
 import com.android.internal.widget.LockPatternUtils;
 
+import java.util.HashSet;
 import java.util.List;
 
 /**
@@ -144,7 +146,8 @@
                         uid, packageName);
                 final boolean ecmEnabled = context.getResources().getBoolean(
                         com.android.internal.R.bool.config_enhancedConfirmationModeEnabled);
-                return ecmEnabled && mode != AppOpsManager.MODE_ALLOWED;
+                return ecmEnabled && mode != AppOpsManager.MODE_ALLOWED
+                        && mode != AppOpsManager.MODE_DEFAULT;
             } catch (Exception e) {
                 // Fallback in case if app ops is not available in testing.
                 return false;
@@ -827,6 +830,29 @@
     }
 
     /**
+     * Check if there are restrictions on an application from being a Credential Manager provider.
+     *
+     * @return EnforcedAdmin Object containing the enforced admin component and admin user details,
+     * or {@code null} if the setting is not managed.
+     */
+    public static @Nullable EnforcedAdmin checkIfApplicationCanBeCredentialManagerProvider(
+            @NonNull Context context, @NonNull String packageName) {
+        final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+        final PackagePolicy pp = dpm.getCredentialManagerPolicy();
+
+        if (pp == null || pp.isPackageAllowed(packageName, new HashSet<>())) {
+            return null;
+        }
+
+        EnforcedAdmin admin = RestrictedLockUtilsInternal.getDeviceOwner(context);
+        if (admin != null) {
+            return admin;
+        }
+        int profileId = getManagedProfileId(context, UserHandle.USER_SYSTEM);
+        return RestrictedLockUtils.getProfileOrDeviceOwner(context, UserHandle.of(profileId));
+    }
+
+    /**
      * Static {@link LockPatternUtils} and {@link DevicePolicyManager} wrapper for testing purposes.
      * {@link LockPatternUtils} is an internal API not supported by robolectric.
      * {@link DevicePolicyManager} has a {@code getProfileParent} not yet suppored by robolectric.
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSelectorWithWidgetPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSelectorWithWidgetPreference.java
new file mode 100644
index 0000000..c52c7ea
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedSelectorWithWidgetPreference.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.util.AttributeSet;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
+
+/**
+ * Selector with widget preference that can be disabled by a device admin using a user restriction.
+ */
+public class RestrictedSelectorWithWidgetPreference extends SelectorWithWidgetPreference {
+    private RestrictedPreferenceHelper mHelper;
+
+    /**
+     * Perform inflation from XML and apply a class-specific base style.
+     *
+     * @param context The {@link Context} this is associated with, through which it can access the
+     *     current theme, resources, {@link SharedPreferences}, etc.
+     * @param attrs The attributes of the XML tag that is inflating the preference
+     * @param defStyle An attribute in the current theme that contains a reference to a style
+     *     resource that supplies default values for the view. Can be 0 to not look for defaults.
+     */
+    public RestrictedSelectorWithWidgetPreference(
+            @NonNull Context context, @NonNull AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        mHelper = new RestrictedPreferenceHelper(context, /* preference= */ this, attrs);
+    }
+
+    /**
+     * Perform inflation from XML and apply a class-specific base style.
+     *
+     * @param context The {@link Context} this is associated with, through which it can access the
+     *     current theme, resources, {@link SharedPreferences}, etc.
+     * @param attrs The attributes of the XML tag that is inflating the preference
+     */
+    public RestrictedSelectorWithWidgetPreference(
+            @NonNull Context context, @NonNull AttributeSet attrs) {
+        super(context, attrs);
+        mHelper = new RestrictedPreferenceHelper(context, /* preference= */ this, attrs);
+    }
+
+    /**
+     * Constructor to create a preference, which will display with a checkbox style.
+     *
+     * @param context The {@link Context} this is associated with.
+     * @param isCheckbox Whether this preference should display as a checkbox.
+     */
+    public RestrictedSelectorWithWidgetPreference(@NonNull Context context, boolean isCheckbox) {
+        super(context, null);
+        mHelper =
+                new RestrictedPreferenceHelper(context, /* preference= */ this, /* attrs= */ null);
+    }
+
+    /**
+     * Constructor to create a preference.
+     *
+     * @param context The Context this is associated with.
+     */
+    public RestrictedSelectorWithWidgetPreference(@NonNull Context context) {
+        this(context, null);
+        mHelper =
+                new RestrictedPreferenceHelper(context, /* preference= */ this, /* attrs= */ null);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        mHelper.onBindViewHolder(holder);
+    }
+
+    @Override
+    public void performClick() {
+        if (!mHelper.performClick()) {
+            super.performClick();
+        }
+    }
+
+    @Override
+    protected void onAttachedToHierarchy(@NonNull PreferenceManager preferenceManager) {
+        mHelper.onAttachedToHierarchy();
+        super.onAttachedToHierarchy(preferenceManager);
+    }
+
+    /**
+     * Set the user restriction and disable this preference.
+     *
+     * @param userRestriction constant from {@link android.os.UserManager}
+     */
+    public void checkRestrictionAndSetDisabled(@NonNull String userRestriction) {
+        mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId());
+    }
+
+    /**
+     * Set the user restriction and disable this preference for the given user.
+     *
+     * @param userRestriction constant from {@link android.os.UserManager}
+     * @param userId user to check the restriction for.
+     */
+    public void checkRestrictionAndSetDisabled(@NonNull String userRestriction, int userId) {
+        mHelper.checkRestrictionAndSetDisabled(userRestriction, userId);
+    }
+
+    /**
+     * 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
+     */
+    public void checkEcmRestrictionAndSetDisabled(
+            @NonNull String settingIdentifier, @NonNull String packageName) {
+        mHelper.checkEcmRestrictionAndSetDisabled(settingIdentifier, packageName);
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        if (enabled && isDisabledByAdmin()) {
+            mHelper.setDisabledByAdmin(/* admin= */ null);
+            return;
+        }
+        super.setEnabled(enabled);
+    }
+
+    /**
+     * Check whether this preference is disabled by admin.
+     *
+     * @return true if this preference is disabled by admin.
+     */
+    public boolean isDisabledByAdmin() {
+        return mHelper.isDisabledByAdmin();
+    }
+
+    /**
+     * Disable preference based on the enforce admin.
+     *
+     * @param admin details of the admin who enforced the restriction. If it is {@code null}, then
+     *     this preference will be enabled. Otherwise, it will be disabled.
+     */
+    public void setDisabledByAdmin(@Nullable EnforcedAdmin admin) {
+        if (mHelper.setDisabledByAdmin(admin)) {
+            notifyChanged();
+        }
+    }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
index 0c54c19..45754eb 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
@@ -289,7 +289,8 @@
                 uid, packageName);
         final boolean ecmEnabled = getContext().getResources().getBoolean(
                 com.android.internal.R.bool.config_enhancedConfirmationModeEnabled);
-        final boolean appOpsAllowed = !ecmEnabled || mode == AppOpsManager.MODE_ALLOWED;
+        final boolean appOpsAllowed = !ecmEnabled || mode == AppOpsManager.MODE_ALLOWED
+                || mode == AppOpsManager.MODE_DEFAULT;
         if (!isEnableAllowed && !isEnabled) {
             setEnabled(false);
         } else if (isEnabled) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index 60a0529..e95a506 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -42,7 +42,6 @@
 import android.os.UserManager;
 import android.print.PrintManager;
 import android.provider.Settings;
-import android.provider.Settings.Secure;
 import android.telephony.AccessNetworkConstants;
 import android.telephony.NetworkRegistrationInfo;
 import android.telephony.ServiceState;
@@ -68,7 +67,6 @@
 import com.android.settingslib.fuelgauge.BatteryStatus;
 import com.android.settingslib.utils.BuildCompatUtils;
 
-import java.time.Duration;
 import java.util.List;
 
 public class Utils {
@@ -77,21 +75,10 @@
 
     public static final String INCOMPATIBLE_CHARGER_WARNING_DISABLED =
             "incompatible_charger_warning_disabled";
-    public static final String WIRELESS_CHARGING_NOTIFICATION_TIMESTAMP =
-            "wireless_charging_notification_timestamp";
 
     @VisibleForTesting
     static final String STORAGE_MANAGER_ENABLED_PROPERTY = "ro.storage_manager.enabled";
 
-    @VisibleForTesting static final long WIRELESS_CHARGING_DEFAULT_TIMESTAMP = -1L;
-
-    @VisibleForTesting
-    static final long WIRELESS_CHARGING_NOTIFICATION_THRESHOLD_MILLIS =
-            Duration.ofDays(30).toMillis();
-
-    @VisibleForTesting
-    static final String WIRELESS_CHARGING_WARNING_ENABLED = "wireless_charging_warning_enabled";
-
     private static Signature[] sSystemSignature;
     private static String sPermissionControllerPackageName;
     private static String sServicesSystemSharedLibPackageName;
@@ -784,29 +771,4 @@
         }
         return false;
     }
-
-    /** Whether to show the wireless charging warning in Settings. */
-    public static boolean shouldShowWirelessChargingWarningTip(
-            @NonNull Context context, @NonNull String tag) {
-        try {
-            return Secure.getInt(context.getContentResolver(), WIRELESS_CHARGING_WARNING_ENABLED, 0)
-                    == 1;
-        } catch (Exception e) {
-            Log.e(tag, "shouldShowWirelessChargingWarningTip()", e);
-        }
-        return false;
-    }
-
-    /** Stores the state of whether the wireless charging warning in Settings is enabled. */
-    public static void updateWirelessChargingWarningEnabled(
-            @NonNull Context context, boolean enabled, @NonNull String tag) {
-        try {
-            Secure.putInt(
-                    context.getContentResolver(),
-                    WIRELESS_CHARGING_WARNING_ENABLED,
-                    enabled ? 1 : 0);
-        } catch (Exception e) {
-            Log.e(tag, "setWirelessChargingWarningEnabled()", e);
-        }
-    }
 }
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index 2889ce2..56118da 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -51,9 +51,11 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.text.format.Formatter;
+import android.util.ArrayMap;
 import android.util.Log;
 import android.util.SparseArray;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.LifecycleObserver;
@@ -990,11 +992,22 @@
                 apps = new ArrayList<>(mAppEntries);
             }
 
+            ArrayMap<UserHandle, Boolean> profileHideInQuietModeStatus = new ArrayMap<>();
             ArrayList<AppEntry> filteredApps = new ArrayList<>();
             if (DEBUG) {
                 Log.i(TAG, "Rebuilding...");
             }
             for (AppEntry entry : apps) {
+                if (android.multiuser.Flags.enablePrivateSpaceFeatures()
+                        && android.multiuser.Flags.handleInterleavedSettingsForPrivateSpace()) {
+                    UserHandle userHandle = UserHandle.of(UserHandle.getUserId(entry.info.uid));
+                    if (!profileHideInQuietModeStatus.containsKey(userHandle)) {
+                        profileHideInQuietModeStatus.put(
+                                userHandle, isHideInQuietEnabledForProfile(mUm, userHandle));
+                    }
+                    filter.refreshAppEntryOnRebuild(
+                            entry, profileHideInQuietModeStatus.get(userHandle));
+                }
                 if (entry != null && (filter == null || filter.filterApp(entry))) {
                     synchronized (mEntriesMap) {
                         if (DEBUG_LOCKING) {
@@ -1648,6 +1661,11 @@
          */
         public boolean isHomeApp;
 
+        /**
+         * Whether the app should be hidden for user when quiet mode is enabled.
+         */
+        public boolean hideInQuietMode;
+
         public String getNormalizedLabel() {
             if (normalizedLabel != null) {
                 return normalizedLabel;
@@ -1691,6 +1709,7 @@
             UserInfo userInfo = um.getUserInfo(UserHandle.getUserId(info.uid));
             mProfileType = userInfo.userType;
             this.showInPersonalTab = shouldShowInPersonalTab(um, info.uid);
+            hideInQuietMode = shouldHideInQuietMode(um, info.uid);
         }
 
         public boolean isClonedProfile() {
@@ -1800,12 +1819,32 @@
                 this.labelDescription = this.label;
             }
         }
+
+        /**
+         * Returns true if profile is in quiet mode and the profile should not be visible when the
+         * quiet mode is enabled, false otherwise.
+         */
+        private boolean shouldHideInQuietMode(@NonNull UserManager userManager, int uid) {
+            if (android.multiuser.Flags.enablePrivateSpaceFeatures()
+                    && android.multiuser.Flags.handleInterleavedSettingsForPrivateSpace()) {
+                UserHandle userHandle = UserHandle.of(UserHandle.getUserId(uid));
+                return isHideInQuietEnabledForProfile(userManager, userHandle);
+            }
+            return false;
+        }
     }
 
     private static boolean hasFlag(int flags, int flag) {
         return (flags & flag) != 0;
     }
 
+    private static boolean isHideInQuietEnabledForProfile(
+            UserManager userManager, UserHandle userHandle) {
+        return userManager.isQuietModeEnabled(userHandle)
+                && userManager.getUserProperties(userHandle).getShowInQuietMode()
+                == UserProperties.SHOW_IN_QUIET_MODE_HIDDEN;
+    }
+
     /**
      * Compare by label, then package name, then uid.
      */
@@ -1868,6 +1907,15 @@
         }
 
         boolean filterApp(AppEntry info);
+
+        /**
+         * Updates AppEntry based on whether quiet mode is enabled and should not be
+         * visible for the corresponding profile.
+         */
+        default void refreshAppEntryOnRebuild(
+                @NonNull AppEntry appEntry,
+                boolean hideInQuietMode) {
+        }
     }
 
     public static final AppFilter FILTER_PERSONAL = new AppFilter() {
@@ -2010,6 +2058,25 @@
         }
     };
 
+    public static final AppFilter FILTER_ENABLED_NOT_QUIET = new AppFilter() {
+        @Override
+        public void init() {
+        }
+
+        @Override
+        public boolean filterApp(@NonNull AppEntry entry) {
+            return entry.info.enabled && !AppUtils.isInstant(entry.info)
+                    && !entry.hideInQuietMode;
+        }
+
+        @Override
+        public void refreshAppEntryOnRebuild(
+                @NonNull AppEntry appEntry,
+                boolean hideInQuietMode) {
+            appEntry.hideInQuietMode = hideInQuietMode;
+        }
+    };
+
     public static final AppFilter FILTER_EVERYTHING = new AppFilter() {
         @Override
         public void init() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java b/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
index 6b833cc..0282f03 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
@@ -16,6 +16,7 @@
 
 package com.android.settingslib.applications;
 
+import android.annotation.NonNull;
 import android.app.usage.StorageStats;
 import android.app.usage.StorageStatsManager;
 import android.content.Context;
@@ -25,6 +26,7 @@
 import androidx.annotation.VisibleForTesting;
 
 import java.io.IOException;
+import java.util.UUID;
 
 /**
  * StorageStatsSource wraps the StorageStatsManager for testability purposes.
@@ -59,6 +61,10 @@
         return mStorageStatsManager.getCacheQuotaBytes(volumeUuid, uid);
     }
 
+    public long getTotalBytes(@NonNull UUID storageUuid) throws IOException {
+        return mStorageStatsManager.getTotalBytes(storageUuid);
+    }
+
     /**
      * Static class that provides methods for querying the amount of external storage available as
      * well as breaking it up into several media types.
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
index 09b1eaf..a906875 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
@@ -3,10 +3,13 @@
 import static com.android.settingslib.widget.AdaptiveOutlineDrawable.ICON_TYPE_ADVANCED;
 
 import android.annotation.SuppressLint;
+import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothClass;
 import android.bluetooth.BluetoothCsipSetCoordinator;
 import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothLeBroadcastReceiveState;
 import android.bluetooth.BluetoothProfile;
+import android.bluetooth.BluetoothStatusCodes;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -30,6 +33,7 @@
 import androidx.core.graphics.drawable.IconCompat;
 
 import com.android.settingslib.R;
+import com.android.settingslib.flags.Flags;
 import com.android.settingslib.widget.AdaptiveIcon;
 import com.android.settingslib.widget.AdaptiveOutlineDrawable;
 
@@ -46,14 +50,14 @@
     private static final String TAG = "BluetoothUtils";
 
     public static final boolean V = false; // verbose logging
-    public static final boolean D = true;  // regular logging
+    public static final boolean D = true; // regular logging
 
     public static final int META_INT_ERROR = -1;
     public static final String BT_ADVANCED_HEADER_ENABLED = "bt_advanced_header_enabled";
     private static final int METADATA_FAST_PAIR_CUSTOMIZED_FIELDS = 25;
     private static final String KEY_HEARABLE_CONTROL_SLICE = "HEARABLE_CONTROL_SLICE_WITH_WIDTH";
-    private static final Set<String> EXCLUSIVE_MANAGERS = ImmutableSet.of(
-            "com.google.android.gms.dck");
+    private static final Set<String> EXCLUSIVE_MANAGERS =
+            ImmutableSet.of("com.google.android.gms.dck");
 
     private static ErrorListener sErrorListener;
 
@@ -89,23 +93,23 @@
     /**
      * @param context to access resources from
      * @param cachedDevice to get class from
-     * @return pair containing the drawable and the description of the Bluetooth class
-     *         of the device.
+     * @return pair containing the drawable and the description of the Bluetooth class of the
+     *     device.
      */
-    public static Pair<Drawable, String> getBtClassDrawableWithDescription(Context context,
-            CachedBluetoothDevice cachedDevice) {
+    public static Pair<Drawable, String> getBtClassDrawableWithDescription(
+            Context context, CachedBluetoothDevice cachedDevice) {
         BluetoothClass btClass = cachedDevice.getBtClass();
         if (btClass != null) {
             switch (btClass.getMajorDeviceClass()) {
                 case BluetoothClass.Device.Major.COMPUTER:
-                    return new Pair<>(getBluetoothDrawable(context,
-                            com.android.internal.R.drawable.ic_bt_laptop),
+                    return new Pair<>(
+                            getBluetoothDrawable(
+                                    context, com.android.internal.R.drawable.ic_bt_laptop),
                             context.getString(R.string.bluetooth_talkback_computer));
 
                 case BluetoothClass.Device.Major.PHONE:
                     return new Pair<>(
-                            getBluetoothDrawable(context,
-                                    com.android.internal.R.drawable.ic_phone),
+                            getBluetoothDrawable(context, com.android.internal.R.drawable.ic_phone),
                             context.getString(R.string.bluetooth_talkback_phone));
 
                 case BluetoothClass.Device.Major.PERIPHERAL:
@@ -115,8 +119,8 @@
 
                 case BluetoothClass.Device.Major.IMAGING:
                     return new Pair<>(
-                            getBluetoothDrawable(context,
-                                    com.android.internal.R.drawable.ic_settings_print),
+                            getBluetoothDrawable(
+                                    context, com.android.internal.R.drawable.ic_settings_print),
                             context.getString(R.string.bluetooth_talkback_imaging));
 
                 default:
@@ -125,8 +129,9 @@
         }
 
         if (cachedDevice.isHearingAidDevice()) {
-            return new Pair<>(getBluetoothDrawable(context,
-                    com.android.internal.R.drawable.ic_bt_hearing_aid),
+            return new Pair<>(
+                    getBluetoothDrawable(
+                            context, com.android.internal.R.drawable.ic_bt_hearing_aid),
                     context.getString(R.string.bluetooth_talkback_hearing_aids));
         }
 
@@ -138,7 +143,8 @@
                 // The device should show hearing aid icon if it contains any hearing aid related
                 // profiles
                 if (profile instanceof HearingAidProfile || profile instanceof HapClientProfile) {
-                    return new Pair<>(getBluetoothDrawable(context, profileResId),
+                    return new Pair<>(
+                            getBluetoothDrawable(context, profileResId),
                             context.getString(R.string.bluetooth_talkback_hearing_aids));
                 }
                 if (resId == 0) {
@@ -153,42 +159,40 @@
         if (btClass != null) {
             if (doesClassMatch(btClass, BluetoothClass.PROFILE_HEADSET)) {
                 return new Pair<>(
-                        getBluetoothDrawable(context,
-                                com.android.internal.R.drawable.ic_bt_headset_hfp),
+                        getBluetoothDrawable(
+                                context, com.android.internal.R.drawable.ic_bt_headset_hfp),
                         context.getString(R.string.bluetooth_talkback_headset));
             }
             if (doesClassMatch(btClass, BluetoothClass.PROFILE_A2DP)) {
                 return new Pair<>(
-                        getBluetoothDrawable(context,
-                                com.android.internal.R.drawable.ic_bt_headphones_a2dp),
+                        getBluetoothDrawable(
+                                context, com.android.internal.R.drawable.ic_bt_headphones_a2dp),
                         context.getString(R.string.bluetooth_talkback_headphone));
             }
         }
         return new Pair<>(
-                getBluetoothDrawable(context,
-                        com.android.internal.R.drawable.ic_settings_bluetooth).mutate(),
+                getBluetoothDrawable(context, com.android.internal.R.drawable.ic_settings_bluetooth)
+                        .mutate(),
                 context.getString(R.string.bluetooth_talkback_bluetooth));
     }
 
-    /**
-     * Get bluetooth drawable by {@code resId}
-     */
+    /** Get bluetooth drawable by {@code resId} */
     public static Drawable getBluetoothDrawable(Context context, @DrawableRes int resId) {
         return context.getDrawable(resId);
     }
 
-    /**
-     * Get colorful bluetooth icon with description
-     */
-    public static Pair<Drawable, String> getBtRainbowDrawableWithDescription(Context context,
-            CachedBluetoothDevice cachedDevice) {
+    /** Get colorful bluetooth icon with description */
+    public static Pair<Drawable, String> getBtRainbowDrawableWithDescription(
+            Context context, CachedBluetoothDevice cachedDevice) {
         final Resources resources = context.getResources();
-        final Pair<Drawable, String> pair = BluetoothUtils.getBtDrawableWithDescription(context,
-                cachedDevice);
+        final Pair<Drawable, String> pair =
+                BluetoothUtils.getBtDrawableWithDescription(context, cachedDevice);
 
         if (pair.first instanceof BitmapDrawable) {
-            return new Pair<>(new AdaptiveOutlineDrawable(
-                    resources, ((BitmapDrawable) pair.first).getBitmap()), pair.second);
+            return new Pair<>(
+                    new AdaptiveOutlineDrawable(
+                            resources, ((BitmapDrawable) pair.first).getBitmap()),
+                    pair.second);
         }
 
         int hashCode;
@@ -198,15 +202,12 @@
             hashCode = cachedDevice.getAddress().hashCode();
         }
 
-        return new Pair<>(buildBtRainbowDrawable(context,
-                pair.first, hashCode), pair.second);
+        return new Pair<>(buildBtRainbowDrawable(context, pair.first, hashCode), pair.second);
     }
 
-    /**
-     * Build Bluetooth device icon with rainbow
-     */
-    private static Drawable buildBtRainbowDrawable(Context context, Drawable drawable,
-            int hashCode) {
+    /** Build Bluetooth device icon with rainbow */
+    private static Drawable buildBtRainbowDrawable(
+            Context context, Drawable drawable, int hashCode) {
         final Resources resources = context.getResources();
 
         // Deal with normal headset
@@ -222,38 +223,37 @@
         return adaptiveIcon;
     }
 
-    /**
-     * Get bluetooth icon with description
-     */
-    public static Pair<Drawable, String> getBtDrawableWithDescription(Context context,
-            CachedBluetoothDevice cachedDevice) {
-        final Pair<Drawable, String> pair = BluetoothUtils.getBtClassDrawableWithDescription(
-                context, cachedDevice);
+    /** Get bluetooth icon with description */
+    public static Pair<Drawable, String> getBtDrawableWithDescription(
+            Context context, CachedBluetoothDevice cachedDevice) {
+        final Pair<Drawable, String> pair =
+                BluetoothUtils.getBtClassDrawableWithDescription(context, cachedDevice);
         final BluetoothDevice bluetoothDevice = cachedDevice.getDevice();
-        final int iconSize = context.getResources().getDimensionPixelSize(
-                R.dimen.bt_nearby_icon_size);
+        final int iconSize =
+                context.getResources().getDimensionPixelSize(R.dimen.bt_nearby_icon_size);
         final Resources resources = context.getResources();
 
         // Deal with advanced device icon
         if (isAdvancedDetailsHeader(bluetoothDevice)) {
-            final Uri iconUri = getUriMetaData(bluetoothDevice,
-                    BluetoothDevice.METADATA_MAIN_ICON);
+            final Uri iconUri = getUriMetaData(bluetoothDevice, BluetoothDevice.METADATA_MAIN_ICON);
             if (iconUri != null) {
                 try {
-                    context.getContentResolver().takePersistableUriPermission(iconUri,
-                            Intent.FLAG_GRANT_READ_URI_PERMISSION);
+                    context.getContentResolver()
+                            .takePersistableUriPermission(
+                                    iconUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
                 } catch (SecurityException e) {
                     Log.e(TAG, "Failed to take persistable permission for: " + iconUri, e);
                 }
                 try {
-                    final Bitmap bitmap = MediaStore.Images.Media.getBitmap(
-                            context.getContentResolver(), iconUri);
+                    final Bitmap bitmap =
+                            MediaStore.Images.Media.getBitmap(
+                                    context.getContentResolver(), iconUri);
                     if (bitmap != null) {
-                        final Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, iconSize,
-                                iconSize, false);
+                        final Bitmap resizedBitmap =
+                                Bitmap.createScaledBitmap(bitmap, iconSize, iconSize, false);
                         bitmap.recycle();
-                        return new Pair<>(new BitmapDrawable(resources,
-                                resizedBitmap), pair.second);
+                        return new Pair<>(
+                                new BitmapDrawable(resources, resizedBitmap), pair.second);
                     }
                 } catch (IOException e) {
                     Log.e(TAG, "Failed to get drawable for: " + iconUri, e);
@@ -280,8 +280,8 @@
             return true;
         }
         // The metadata is for Android S
-        String deviceType = getStringMetaData(bluetoothDevice,
-                BluetoothDevice.METADATA_DEVICE_TYPE);
+        String deviceType =
+                getStringMetaData(bluetoothDevice, BluetoothDevice.METADATA_DEVICE_TYPE);
         if (TextUtils.equals(deviceType, BluetoothDevice.DEVICE_TYPE_UNTETHERED_HEADSET)
                 || TextUtils.equals(deviceType, BluetoothDevice.DEVICE_TYPE_WATCH)
                 || TextUtils.equals(deviceType, BluetoothDevice.DEVICE_TYPE_DEFAULT)
@@ -306,8 +306,8 @@
             return true;
         }
         // The metadata is for Android S
-        String deviceType = getStringMetaData(bluetoothDevice,
-                BluetoothDevice.METADATA_DEVICE_TYPE);
+        String deviceType =
+                getStringMetaData(bluetoothDevice, BluetoothDevice.METADATA_DEVICE_TYPE);
         if (TextUtils.equals(deviceType, BluetoothDevice.DEVICE_TYPE_UNTETHERED_HEADSET)) {
             Log.d(TAG, "isAdvancedUntetheredDevice: is untethered device ");
             return true;
@@ -321,15 +321,15 @@
      * @param device Must be one of the public constants in {@link BluetoothClass.Device}
      * @return true if device class matches, false otherwise.
      */
-    public static boolean isDeviceClassMatched(@NonNull BluetoothDevice bluetoothDevice,
-            int device) {
+    public static boolean isDeviceClassMatched(
+            @NonNull BluetoothDevice bluetoothDevice, int device) {
         final BluetoothClass bluetoothClass = bluetoothDevice.getBluetoothClass();
         return bluetoothClass != null && bluetoothClass.getDeviceClass() == device;
     }
 
     private static boolean isAdvancedHeaderEnabled() {
-        if (!DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI, BT_ADVANCED_HEADER_ENABLED,
-                true)) {
+        if (!DeviceConfig.getBoolean(
+                DeviceConfig.NAMESPACE_SETTINGS_UI, BT_ADVANCED_HEADER_ENABLED, true)) {
             Log.d(TAG, "isAdvancedDetailsHeader: advancedEnabled is false");
             return false;
         }
@@ -345,9 +345,7 @@
         return false;
     }
 
-    /**
-     * Create an Icon pointing to a drawable.
-     */
+    /** Create an Icon pointing to a drawable. */
     public static IconCompat createIconWithDrawable(Drawable drawable) {
         Bitmap bitmap;
         if (drawable instanceof BitmapDrawable) {
@@ -355,19 +353,15 @@
         } else {
             final int width = drawable.getIntrinsicWidth();
             final int height = drawable.getIntrinsicHeight();
-            bitmap = createBitmap(drawable,
-                    width > 0 ? width : 1,
-                    height > 0 ? height : 1);
+            bitmap = createBitmap(drawable, width > 0 ? width : 1, height > 0 ? height : 1);
         }
         return IconCompat.createWithBitmap(bitmap);
     }
 
-    /**
-     * Build device icon with advanced outline
-     */
+    /** Build device icon with advanced outline */
     public static Drawable buildAdvancedDrawable(Context context, Drawable drawable) {
-        final int iconSize = context.getResources().getDimensionPixelSize(
-                R.dimen.advanced_icon_size);
+        final int iconSize =
+                context.getResources().getDimensionPixelSize(R.dimen.advanced_icon_size);
         final Resources resources = context.getResources();
 
         Bitmap bitmap = null;
@@ -376,14 +370,12 @@
         } else {
             final int width = drawable.getIntrinsicWidth();
             final int height = drawable.getIntrinsicHeight();
-            bitmap = createBitmap(drawable,
-                    width > 0 ? width : 1,
-                    height > 0 ? height : 1);
+            bitmap = createBitmap(drawable, width > 0 ? width : 1, height > 0 ? height : 1);
         }
 
         if (bitmap != null) {
-            final Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, iconSize,
-                    iconSize, false);
+            final Bitmap resizedBitmap =
+                    Bitmap.createScaledBitmap(bitmap, iconSize, iconSize, false);
             bitmap.recycle();
             return new AdaptiveOutlineDrawable(resources, resizedBitmap, ICON_TYPE_ADVANCED);
         }
@@ -391,9 +383,7 @@
         return drawable;
     }
 
-    /**
-     * Creates a drawable with specified width and height.
-     */
+    /** Creates a drawable with specified width and height. */
     public static Bitmap createBitmap(Drawable drawable, int width, int height) {
         final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
         final Canvas canvas = new Canvas(bitmap);
@@ -487,11 +477,8 @@
     }
 
     /**
-     * Check if the Bluetooth device is an AvailableMediaBluetoothDevice, which means:
-     * 1) currently connected
-     * 2) is Hearing Aid or LE Audio
-     *    OR
-     * 3) connected profile matches currentAudioProfile
+     * Check if the Bluetooth device is an AvailableMediaBluetoothDevice, which means: 1) currently
+     * connected 2) is Hearing Aid or LE Audio OR 3) connected profile matches currentAudioProfile
      *
      * @param cachedDevice the CachedBluetoothDevice
      * @param audioManager audio manager to get the current audio profile
@@ -519,8 +506,11 @@
             // It would show in Available Devices group.
             if (cachedDevice.isConnectedAshaHearingAidDevice()
                     || cachedDevice.isConnectedLeAudioDevice()) {
-                Log.d(TAG, "isFilterMatched() device : "
-                        + cachedDevice.getName() + ", the profile is connected.");
+                Log.d(
+                        TAG,
+                        "isFilterMatched() device : "
+                                + cachedDevice.getName()
+                                + ", the profile is connected.");
                 return true;
             }
             // According to the current audio profile type,
@@ -541,12 +531,100 @@
         return isFilterMatched;
     }
 
+    /** Returns if the le audio sharing is enabled. */
+    public static boolean isAudioSharingEnabled() {
+        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+        return Flags.enableLeAudioSharing()
+                && adapter.isLeAudioBroadcastSourceSupported()
+                        == BluetoothStatusCodes.FEATURE_SUPPORTED
+                && adapter.isLeAudioBroadcastAssistantSupported()
+                        == BluetoothStatusCodes.FEATURE_SUPPORTED;
+    }
+
+    /** Returns if the broadcast is on-going. */
+    @WorkerThread
+    public static boolean isBroadcasting(@Nullable LocalBluetoothManager manager) {
+        if (manager == null) return false;
+        LocalBluetoothLeBroadcast broadcast =
+                manager.getProfileManager().getLeAudioBroadcastProfile();
+        return broadcast != null && broadcast.isEnabled(null);
+    }
+
     /**
-     * Check if the Bluetooth device is a ConnectedBluetoothDevice, which means:
-     * 1) currently connected
-     * 2) is not Hearing Aid or LE Audio
-     *    AND
-     * 3) connected profile does not match currentAudioProfile
+     * Check if {@link CachedBluetoothDevice} has connected to a broadcast source.
+     *
+     * @param cachedDevice The cached bluetooth device to check.
+     * @param localBtManager The BT manager to provide BT functions.
+     * @return Whether the device has connected to a broadcast source.
+     */
+    @WorkerThread
+    public static boolean hasConnectedBroadcastSource(
+            CachedBluetoothDevice cachedDevice, LocalBluetoothManager localBtManager) {
+        if (localBtManager == null) {
+            Log.d(TAG, "Skip check hasConnectedBroadcastSource due to bt manager is null");
+            return false;
+        }
+        LocalBluetoothLeBroadcastAssistant assistant =
+                localBtManager.getProfileManager().getLeAudioBroadcastAssistantProfile();
+        if (assistant == null) {
+            Log.d(TAG, "Skip check hasConnectedBroadcastSource due to assistant profile is null");
+            return false;
+        }
+        List<BluetoothLeBroadcastReceiveState> sourceList =
+                assistant.getAllSources(cachedDevice.getDevice());
+        if (!sourceList.isEmpty() && sourceList.stream().anyMatch(BluetoothUtils::isConnected)) {
+            Log.d(
+                    TAG,
+                    "Lead device has connected broadcast source, device = "
+                            + cachedDevice.getDevice().getAnonymizedAddress());
+            return true;
+        }
+        // Return true if member device is in broadcast.
+        for (CachedBluetoothDevice device : cachedDevice.getMemberDevice()) {
+            List<BluetoothLeBroadcastReceiveState> list =
+                    assistant.getAllSources(device.getDevice());
+            if (!list.isEmpty() && list.stream().anyMatch(BluetoothUtils::isConnected)) {
+                Log.d(
+                        TAG,
+                        "Member device has connected broadcast source, device = "
+                                + device.getDevice().getAnonymizedAddress());
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /** Checks the connectivity status based on the provided broadcast receive state. */
+    @WorkerThread
+    public static boolean isConnected(BluetoothLeBroadcastReceiveState state) {
+        return state.getBisSyncState().stream().anyMatch(bitmap -> bitmap != 0);
+    }
+
+    /**
+     * Checks if the Bluetooth device is an available hearing device, which means: 1) currently
+     * connected 2) is Hearing Aid 3) connected profile match hearing aid related profiles (e.g.
+     * ASHA, HAP)
+     *
+     * @param cachedDevice the CachedBluetoothDevice
+     * @return if the device is Available hearing device
+     */
+    @WorkerThread
+    public static boolean isAvailableHearingDevice(CachedBluetoothDevice cachedDevice) {
+        if (isDeviceConnected(cachedDevice) && cachedDevice.isConnectedHearingAidDevice()) {
+            Log.d(
+                    TAG,
+                    "isFilterMatched() device : "
+                            + cachedDevice.getName()
+                            + ", the profile is connected.");
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Check if the Bluetooth device is a ConnectedBluetoothDevice, which means: 1) currently
+     * connected 2) is not Hearing Aid or LE Audio AND 3) connected profile does not match
+     * currentAudioProfile
      *
      * @param cachedDevice the CachedBluetoothDevice
      * @param audioManager audio manager to get the current audio profile
@@ -656,29 +734,28 @@
     }
 
     /**
-     * Returns the BluetoothDevice's exclusive manager
-     * ({@link BluetoothDevice.METADATA_EXCLUSIVE_MANAGER} in metadata) if it exists and is in the
-     * given set, otherwise null.
+     * Returns the BluetoothDevice's exclusive manager ({@link
+     * BluetoothDevice.METADATA_EXCLUSIVE_MANAGER} in metadata) if it exists and is in the given
+     * set, otherwise null.
      */
     @Nullable
     private static String getAllowedExclusiveManager(BluetoothDevice bluetoothDevice) {
-        byte[] exclusiveManagerNameBytes = bluetoothDevice.getMetadata(
-                BluetoothDevice.METADATA_EXCLUSIVE_MANAGER);
+        byte[] exclusiveManagerNameBytes =
+                bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER);
         if (exclusiveManagerNameBytes == null) {
-            Log.d(TAG, "Bluetooth device " + bluetoothDevice.getName()
-                    + " doesn't have exclusive manager");
+            Log.d(
+                    TAG,
+                    "Bluetooth device "
+                            + bluetoothDevice.getName()
+                            + " doesn't have exclusive manager");
             return null;
         }
         String exclusiveManagerName = new String(exclusiveManagerNameBytes);
-        return getExclusiveManagers().contains(exclusiveManagerName) ? exclusiveManagerName
-                : null;
+        return getExclusiveManagers().contains(exclusiveManagerName) ? exclusiveManagerName : null;
     }
 
-    /**
-     * Checks if given package is installed
-     */
-    private static boolean isPackageInstalled(Context context,
-            String packageName) {
+    /** Checks if given package is installed */
+    private static boolean isPackageInstalled(Context context, String packageName) {
         PackageManager packageManager = context.getPackageManager();
         try {
             packageManager.getPackageInfo(packageName, 0);
@@ -690,13 +767,12 @@
     }
 
     /**
-     * A BluetoothDevice is exclusively managed if
-     * 1) it has field {@link BluetoothDevice.METADATA_EXCLUSIVE_MANAGER} in metadata.
-     * 2) the exclusive manager app name is in the allowlist.
-     * 3) the exclusive manager app is installed.
+     * A BluetoothDevice is exclusively managed if 1) it has field {@link
+     * BluetoothDevice.METADATA_EXCLUSIVE_MANAGER} in metadata. 2) the exclusive manager app name is
+     * in the allowlist. 3) the exclusive manager app is installed.
      */
-    public static boolean isExclusivelyManagedBluetoothDevice(@NonNull Context context,
-            @NonNull BluetoothDevice bluetoothDevice) {
+    public static boolean isExclusivelyManagedBluetoothDevice(
+            @NonNull Context context, @NonNull BluetoothDevice bluetoothDevice) {
         String exclusiveManagerName = getAllowedExclusiveManager(bluetoothDevice);
         if (exclusiveManagerName == null) {
             return false;
@@ -709,9 +785,7 @@
         }
     }
 
-    /**
-     * Return the allowlist for exclusive manager names.
-     */
+    /** Return the allowlist for exclusive manager names. */
     @NonNull
     public static Set<String> getExclusiveManagers() {
         return EXCLUSIVE_MANAGERS;
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java
index 64cf5c64..6c12cb7 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java
@@ -78,6 +78,7 @@
     public static final String ACTION_LE_AUDIO_SHARING_STATE_CHANGE =
             "com.android.settings.action.BLUETOOTH_LE_AUDIO_SHARING_STATE_CHANGE";
     public static final String EXTRA_LE_AUDIO_SHARING_STATE = "BLUETOOTH_LE_AUDIO_SHARING_STATE";
+    public static final String EXTRA_BLUETOOTH_DEVICE = "BLUETOOTH_DEVICE";
     public static final int BROADCAST_STATE_UNKNOWN = 0;
     public static final int BROADCAST_STATE_ON = 1;
     public static final int BROADCAST_STATE_OFF = 2;
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
index e34c50e..9b1e4b7 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
@@ -174,6 +174,7 @@
 
     public void startScan() {
         mMediaDevices.clear();
+        registerRouter();
         startScanOnRouter();
         updateRouteListingPreference();
         refreshDevices();
@@ -188,10 +189,19 @@
         }
     }
 
-    public abstract void stopScan();
+    public final void stopScan() {
+        stopScanOnRouter();
+        unregisterRouter();
+    }
+
+    protected abstract void stopScanOnRouter();
 
     protected abstract void startScanOnRouter();
 
+    protected abstract void registerRouter();
+
+    protected abstract void unregisterRouter();
+
     protected abstract void transferToRoute(@NonNull MediaRoute2Info route);
 
     protected abstract void selectRoute(
@@ -244,8 +254,6 @@
     protected abstract List<MediaRoute2Info> getTransferableRoutes(@NonNull String packageName);
 
     protected final void rebuildDeviceList() {
-        mMediaDevices.clear();
-        mCurrentConnectedDevice = null;
         buildAvailableRoutes();
     }
 
@@ -514,17 +522,27 @@
     // MediaRoute2Info.getType was made public on API 34, but exists since API 30.
     @SuppressWarnings("NewApi")
     private synchronized void buildAvailableRoutes() {
-        for (MediaRoute2Info route : getAvailableRoutes()) {
+        mMediaDevices.clear();
+        RoutingSessionInfo activeSession = getActiveRoutingSession();
+
+        for (MediaRoute2Info route : getAvailableRoutes(activeSession)) {
             if (DEBUG) {
                 Log.d(TAG, "buildAvailableRoutes() route : " + route.getName() + ", volume : "
                         + route.getVolume() + ", type : " + route.getType());
             }
-            addMediaDevice(route);
+            addMediaDevice(route, activeSession);
+        }
+
+        // In practice, mMediaDevices should always have at least one route.
+        if (!mMediaDevices.isEmpty()) {
+            // First device on the list is always the first selected route.
+            mCurrentConnectedDevice = mMediaDevices.get(0);
         }
     }
-    private synchronized List<MediaRoute2Info> getAvailableRoutes() {
+
+    private synchronized List<MediaRoute2Info> getAvailableRoutes(
+            RoutingSessionInfo activeSession) {
         List<MediaRoute2Info> availableRoutes = new ArrayList<>();
-        RoutingSessionInfo activeSession = getActiveRoutingSession();
 
         List<MediaRoute2Info> selectedRoutes = getSelectedRoutes(activeSession);
         availableRoutes.addAll(selectedRoutes);
@@ -562,7 +580,7 @@
     // MediaRoute2Info.getType was made public on API 34, but exists since API 30.
     @SuppressWarnings("NewApi")
     @VisibleForTesting
-    void addMediaDevice(MediaRoute2Info route) {
+    void addMediaDevice(MediaRoute2Info route, RoutingSessionInfo activeSession) {
         final int deviceType = route.getType();
         MediaDevice mediaDevice = null;
         switch (deviceType) {
@@ -627,14 +645,10 @@
                 break;
         }
 
-        if (mediaDevice != null
-                && getActiveRoutingSession().getSelectedRoutes().contains(route.getId())) {
-            mediaDevice.setState(STATE_SELECTED);
-            if (mCurrentConnectedDevice == null) {
-                mCurrentConnectedDevice = mediaDevice;
-            }
-        }
         if (mediaDevice != null) {
+            if (activeSession.getSelectedRoutes().contains(route.getId())) {
+                mediaDevice.setState(STATE_SELECTED);
+            }
             mMediaDevices.add(mediaDevice);
         }
     }
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java
index c4fac35..23063da 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/ManagerInfoMediaManager.java
@@ -62,22 +62,30 @@
     @Override
     protected void startScanOnRouter() {
         if (!mIsScanning) {
-            mRouterManager.registerCallback(mExecutor, mMediaRouterCallback);
             mRouterManager.registerScanRequest();
             mIsScanning = true;
         }
     }
 
     @Override
-    public void stopScan() {
+    protected void registerRouter() {
+        mRouterManager.registerCallback(mExecutor, mMediaRouterCallback);
+    }
+
+    @Override
+    protected void stopScanOnRouter() {
         if (mIsScanning) {
-            mRouterManager.unregisterCallback(mMediaRouterCallback);
             mRouterManager.unregisterScanRequest();
             mIsScanning = false;
         }
     }
 
     @Override
+    protected void unregisterRouter() {
+        mRouterManager.unregisterCallback(mMediaRouterCallback);
+    }
+
+    @Override
     protected void transferToRoute(@NonNull MediaRoute2Info route) {
         // TODO: b/279555229 - provide real user handle of a caller.
         mRouterManager.transfer(mPackageName, route, android.os.Process.myUserHandle());
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java
index 2b8c2dd..cf11c6d 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/NoOpInfoMediaManager.java
@@ -63,12 +63,22 @@
     }
 
     @Override
-    public void stopScan() {
+    protected void startScanOnRouter() {
         // Do nothing.
     }
 
     @Override
-    protected void startScanOnRouter() {
+    protected void registerRouter() {
+        // Do nothing.
+    }
+
+    @Override
+    protected void stopScanOnRouter() {
+        // Do nothing.
+    }
+
+    @Override
+    protected void unregisterRouter() {
         // Do nothing.
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java
index 9c82cb1..0dceeba 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java
@@ -97,11 +97,6 @@
 
     @Override
     protected void startScanOnRouter() {
-        mRouter.registerRouteCallback(mExecutor, mRouteCallback, RouteDiscoveryPreference.EMPTY);
-        mRouter.registerRouteListingPreferenceUpdatedCallback(
-                mExecutor, mRouteListingPreferenceCallback);
-        mRouter.registerTransferCallback(mExecutor, mTransferCallback);
-        mRouter.registerControllerCallback(mExecutor, mControllerCallback);
         if (Flags.enableScreenOffScanning()) {
             MediaRouter2.ScanRequest request = new MediaRouter2.ScanRequest.Builder().build();
             mScanToken.compareAndSet(null, mRouter.requestScan(request));
@@ -111,7 +106,16 @@
     }
 
     @Override
-    public void stopScan() {
+    protected void registerRouter() {
+        mRouter.registerRouteCallback(mExecutor, mRouteCallback, RouteDiscoveryPreference.EMPTY);
+        mRouter.registerRouteListingPreferenceUpdatedCallback(
+                mExecutor, mRouteListingPreferenceCallback);
+        mRouter.registerTransferCallback(mExecutor, mTransferCallback);
+        mRouter.registerControllerCallback(mExecutor, mControllerCallback);
+    }
+
+    @Override
+    protected void stopScanOnRouter() {
         if (Flags.enableScreenOffScanning()) {
             MediaRouter2.ScanToken token = mScanToken.getAndSet(null);
             if (token != null) {
@@ -120,6 +124,10 @@
         } else {
             mRouter.stopScan();
         }
+    }
+
+    @Override
+    protected void unregisterRouter() {
         mRouter.unregisterControllerCallback(mControllerCallback);
         mRouter.unregisterTransferCallback(mTransferCallback);
         mRouter.unregisterRouteListingPreferenceUpdatedCallback(mRouteListingPreferenceCallback);
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java b/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java
deleted file mode 100644
index f165c9f..0000000
--- a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java
+++ /dev/null
@@ -1,401 +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.users;
-
-import android.app.Activity;
-import android.content.ClipData;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.RectF;
-import android.media.ExifInterface;
-import android.net.Uri;
-import android.os.StrictMode;
-import android.provider.MediaStore;
-import android.util.EventLog;
-import android.util.Log;
-
-import androidx.annotation.Nullable;
-import androidx.core.content.FileProvider;
-
-import com.android.settingslib.utils.ThreadUtils;
-
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-
-import libcore.io.Streams;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.List;
-
-class AvatarPhotoController {
-
-    interface AvatarUi {
-        boolean isFinishing();
-
-        void returnUriResult(Uri uri);
-
-        void startActivityForResult(Intent intent, int resultCode);
-
-        boolean startSystemActivityForResult(Intent intent, int resultCode);
-
-        int getPhotoSize();
-    }
-
-    interface ContextInjector {
-        File getCacheDir();
-
-        Uri createTempImageUri(File parentDir, String fileName, boolean purge);
-
-        ContentResolver getContentResolver();
-
-        Context getContext();
-    }
-
-    private static final String TAG = "AvatarPhotoController";
-
-    static final int REQUEST_CODE_CHOOSE_PHOTO = 1001;
-    static final int REQUEST_CODE_TAKE_PHOTO = 1002;
-    static final int REQUEST_CODE_CROP_PHOTO = 1003;
-
-    /**
-     * Delay to allow the photo picker exit animation to complete before the crop activity opens.
-     */
-    private static final long DELAY_BEFORE_CROP_MILLIS = 150;
-
-    private static final String IMAGES_DIR = "multi_user";
-    private static final String PRE_CROP_PICTURE_FILE_NAME = "PreCropEditUserPhoto.jpg";
-    private static final String CROP_PICTURE_FILE_NAME = "CropEditUserPhoto.jpg";
-    private static final String TAKE_PICTURE_FILE_NAME = "TakeEditUserPhoto.jpg";
-
-    private final int mPhotoSize;
-
-    private final AvatarUi mAvatarUi;
-    private final ContextInjector mContextInjector;
-
-    private final File mImagesDir;
-    private final Uri mPreCropPictureUri;
-    private final Uri mCropPictureUri;
-    private final Uri mTakePictureUri;
-
-    AvatarPhotoController(AvatarUi avatarUi, ContextInjector contextInjector, boolean waiting) {
-        mAvatarUi = avatarUi;
-        mContextInjector = contextInjector;
-
-        mImagesDir = new File(mContextInjector.getCacheDir(), IMAGES_DIR);
-        mImagesDir.mkdir();
-        mPreCropPictureUri = mContextInjector
-                .createTempImageUri(mImagesDir, PRE_CROP_PICTURE_FILE_NAME, !waiting);
-        mCropPictureUri =
-                mContextInjector.createTempImageUri(mImagesDir, CROP_PICTURE_FILE_NAME, !waiting);
-        mTakePictureUri =
-                mContextInjector.createTempImageUri(mImagesDir, TAKE_PICTURE_FILE_NAME, !waiting);
-        mPhotoSize = mAvatarUi.getPhotoSize();
-    }
-
-    /**
-     * Handles activity result from containing activity/fragment after a take/choose/crop photo
-     * action result is received.
-     */
-    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (resultCode != Activity.RESULT_OK) {
-            return false;
-        }
-        final Uri pictureUri = data != null && data.getData() != null
-                ? data.getData() : mTakePictureUri;
-
-        // Check if the result is a content uri
-        if (!ContentResolver.SCHEME_CONTENT.equals(pictureUri.getScheme())) {
-            Log.e(TAG, "Invalid pictureUri scheme: " + pictureUri.getScheme());
-            EventLog.writeEvent(0x534e4554, "172939189", -1, pictureUri.getPath());
-            return false;
-        }
-
-        switch (requestCode) {
-            case REQUEST_CODE_CROP_PHOTO:
-                mAvatarUi.returnUriResult(pictureUri);
-                return true;
-            case REQUEST_CODE_TAKE_PHOTO:
-                if (mTakePictureUri.equals(pictureUri)) {
-                    cropPhoto(pictureUri);
-                } else {
-                    copyAndCropPhoto(pictureUri, false);
-                }
-                return true;
-            case REQUEST_CODE_CHOOSE_PHOTO:
-                copyAndCropPhoto(pictureUri, true);
-                return true;
-        }
-        return false;
-    }
-
-    void takePhoto() {
-        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE_SECURE);
-        appendOutputExtra(intent, mTakePictureUri);
-        mAvatarUi.startActivityForResult(intent, REQUEST_CODE_TAKE_PHOTO);
-    }
-
-    void choosePhoto() {
-        Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES, null);
-        intent.setType("image/*");
-        mAvatarUi.startActivityForResult(intent, REQUEST_CODE_CHOOSE_PHOTO);
-    }
-
-    private void copyAndCropPhoto(final Uri pictureUri, boolean delayBeforeCrop) {
-        ListenableFuture<Uri> future = ThreadUtils.getBackgroundExecutor().submit(() -> {
-            final ContentResolver cr = mContextInjector.getContentResolver();
-            try (InputStream in = cr.openInputStream(pictureUri);
-                    OutputStream out = cr.openOutputStream(mPreCropPictureUri)) {
-                Streams.copy(in, out);
-                return mPreCropPictureUri;
-            } catch (IOException e) {
-                Log.w(TAG, "Failed to copy photo", e);
-                return null;
-            }
-        });
-        Futures.addCallback(future, new FutureCallback<>() {
-            @Override
-            public void onSuccess(@Nullable Uri result) {
-                if (result == null) {
-                    return;
-                }
-                Runnable cropRunnable = () -> {
-                    if (!mAvatarUi.isFinishing()) {
-                        cropPhoto(mPreCropPictureUri);
-                    }
-                };
-                if (delayBeforeCrop) {
-                    mContextInjector.getContext().getMainThreadHandler()
-                            .postDelayed(cropRunnable, DELAY_BEFORE_CROP_MILLIS);
-                } else {
-                    cropRunnable.run();
-                }
-            }
-
-            @Override
-            public void onFailure(Throwable t) {
-                Log.e(TAG, "Error performing copy-and-crop", t);
-            }
-        }, mContextInjector.getContext().getMainExecutor());
-    }
-
-    private void cropPhoto(final Uri pictureUri) {
-        // TODO: Use a public intent, when there is one.
-        Intent intent = new Intent("com.android.camera.action.CROP");
-        intent.setDataAndType(pictureUri, "image/*");
-        appendOutputExtra(intent, mCropPictureUri);
-        appendCropExtras(intent);
-        try {
-            StrictMode.disableDeathOnFileUriExposure();
-            if (mAvatarUi.startSystemActivityForResult(intent, REQUEST_CODE_CROP_PHOTO)) {
-                return;
-            }
-        } finally {
-            StrictMode.enableDeathOnFileUriExposure();
-        }
-        onPhotoNotCropped(pictureUri);
-    }
-
-    private void appendOutputExtra(Intent intent, Uri pictureUri) {
-        intent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
-        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION
-                | Intent.FLAG_GRANT_READ_URI_PERMISSION);
-        intent.setClipData(ClipData.newRawUri(MediaStore.EXTRA_OUTPUT, pictureUri));
-    }
-
-    private void appendCropExtras(Intent intent) {
-        intent.putExtra("crop", "true");
-        intent.putExtra("scale", true);
-        intent.putExtra("scaleUpIfNeeded", true);
-        intent.putExtra("aspectX", 1);
-        intent.putExtra("aspectY", 1);
-        intent.putExtra("outputX", mPhotoSize);
-        intent.putExtra("outputY", mPhotoSize);
-    }
-
-    private void onPhotoNotCropped(final Uri data) {
-        ListenableFuture<Bitmap> future = ThreadUtils.getBackgroundExecutor().submit(() -> {
-            // Scale and crop to a square aspect ratio
-            Bitmap croppedImage = Bitmap.createBitmap(mPhotoSize, mPhotoSize,
-                    Bitmap.Config.ARGB_8888);
-            Canvas canvas = new Canvas(croppedImage);
-            Bitmap fullImage;
-            try (InputStream imageStream = mContextInjector.getContentResolver()
-                    .openInputStream(data)) {
-                fullImage = BitmapFactory.decodeStream(imageStream);
-            }
-            if (fullImage == null) {
-                Log.e(TAG, "Image data could not be decoded");
-                return null;
-            }
-            int rotation = getRotation(data);
-            final int squareSize = Math.min(fullImage.getWidth(),
-                    fullImage.getHeight());
-            final int left = (fullImage.getWidth() - squareSize) / 2;
-            final int top = (fullImage.getHeight() - squareSize) / 2;
-
-            Matrix matrix = new Matrix();
-            RectF rectSource = new RectF(left, top,
-                    left + squareSize, top + squareSize);
-            RectF rectDest = new RectF(0, 0, mPhotoSize, mPhotoSize);
-            matrix.setRectToRect(rectSource, rectDest, Matrix.ScaleToFit.CENTER);
-            matrix.postRotate(rotation, mPhotoSize / 2f, mPhotoSize / 2f);
-            canvas.drawBitmap(fullImage, matrix, new Paint());
-            saveBitmapToFile(croppedImage, new File(mImagesDir, CROP_PICTURE_FILE_NAME));
-            return croppedImage;
-        });
-        Futures.addCallback(future, new FutureCallback<>() {
-            @Override
-            public void onSuccess(@Nullable Bitmap result) {
-                if (result != null) {
-                    mAvatarUi.returnUriResult(mCropPictureUri);
-                }
-            }
-
-            @Override
-            public void onFailure(Throwable t) {
-                Log.e(TAG, "Error performing internal crop", t);
-            }
-        }, mContextInjector.getContext().getMainExecutor());
-    }
-
-    /**
-     * Reads the image's exif data and determines the rotation degree needed to display the image
-     * in portrait mode.
-     */
-    private int getRotation(Uri selectedImage) {
-        int rotation = -1;
-        try {
-            InputStream imageStream =
-                    mContextInjector.getContentResolver().openInputStream(selectedImage);
-            ExifInterface exif = new ExifInterface(imageStream);
-            rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
-        } catch (IOException exception) {
-            Log.e(TAG, "Error while getting rotation", exception);
-        }
-
-        switch (rotation) {
-            case ExifInterface.ORIENTATION_ROTATE_90:
-                return 90;
-            case ExifInterface.ORIENTATION_ROTATE_180:
-                return 180;
-            case ExifInterface.ORIENTATION_ROTATE_270:
-                return 270;
-            default:
-                return 0;
-        }
-    }
-
-    private void saveBitmapToFile(Bitmap bitmap, File file) {
-        try {
-            OutputStream os = new FileOutputStream(file);
-            bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
-            os.flush();
-            os.close();
-        } catch (IOException e) {
-            Log.e(TAG, "Cannot create temp file", e);
-        }
-    }
-
-    static class AvatarUiImpl implements AvatarUi {
-        private final AvatarPickerActivity mActivity;
-
-        AvatarUiImpl(AvatarPickerActivity activity) {
-            mActivity = activity;
-        }
-
-        @Override
-        public boolean isFinishing() {
-            return mActivity.isFinishing() || mActivity.isDestroyed();
-        }
-
-        @Override
-        public void returnUriResult(Uri uri) {
-            mActivity.returnUriResult(uri);
-        }
-
-        @Override
-        public void startActivityForResult(Intent intent, int resultCode) {
-            mActivity.startActivityForResult(intent, resultCode);
-        }
-
-        @Override
-        public boolean startSystemActivityForResult(Intent intent, int code) {
-            List<ResolveInfo> resolveInfos = mActivity.getPackageManager()
-                    .queryIntentActivities(intent, PackageManager.MATCH_SYSTEM_ONLY);
-            if (resolveInfos.isEmpty()) {
-                Log.w(TAG, "No system package activity could be found for code " + code);
-                return false;
-            }
-            intent.setPackage(resolveInfos.get(0).activityInfo.packageName);
-            mActivity.startActivityForResult(intent, code);
-            return true;
-        }
-
-        @Override
-        public int getPhotoSize() {
-            return mActivity.getResources()
-                    .getDimensionPixelSize(com.android.internal.R.dimen.user_icon_size);
-        }
-    }
-
-    static class ContextInjectorImpl implements ContextInjector {
-        private final Context mContext;
-        private final String mFileAuthority;
-
-        ContextInjectorImpl(Context context, String fileAuthority) {
-            mContext = context;
-            mFileAuthority = fileAuthority;
-        }
-
-        @Override
-        public File getCacheDir() {
-            return mContext.getCacheDir();
-        }
-
-        @Override
-        public Uri createTempImageUri(File parentDir, String fileName, boolean purge) {
-            final File fullPath = new File(parentDir, fileName);
-            if (purge) {
-                fullPath.delete();
-            }
-            return FileProvider.getUriForFile(mContext, mFileAuthority, fullPath);
-        }
-
-        @Override
-        public ContentResolver getContentResolver() {
-            return mContext.getContentResolver();
-        }
-
-        @Override
-        public Context getContext() {
-            return mContext;
-        }
-    }
-}
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java b/packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java
deleted file mode 100644
index 61c8ee7..0000000
--- a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java
+++ /dev/null
@@ -1,392 +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.users;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.Intent;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-
-import androidx.annotation.NonNull;
-import androidx.core.graphics.drawable.RoundedBitmapDrawable;
-import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
-import androidx.recyclerview.widget.GridLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.internal.util.UserIcons;
-import com.android.settingslib.R;
-
-import com.google.android.setupcompat.template.FooterBarMixin;
-import com.google.android.setupcompat.template.FooterButton;
-import com.google.android.setupdesign.GlifLayout;
-import com.google.android.setupdesign.util.ThemeHelper;
-import com.google.android.setupdesign.util.ThemeResolver;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Activity to allow the user to choose a user profile picture.
- *
- * <p>Options are provided to take a photo or choose a photo using the photo picker. In addition,
- * preselected avatar images may be provided in the resource array {@code avatar_images}. If
- * provided, every element of that array must be a bitmap drawable.
- *
- * <p>If preselected images are not provided, the default avatar will be shown instead, in a range
- * of colors.
- *
- * <p>This activity should be started with startActivityForResult. If a photo or a preselected image
- * is selected, a Uri will be returned in the data field of the result intent. If a colored default
- * avatar is selected, the chosen color will be returned as {@code EXTRA_DEFAULT_ICON_TINT_COLOR}
- * and the data field will be empty.
- */
-public class AvatarPickerActivity extends Activity {
-
-    static final String EXTRA_FILE_AUTHORITY = "file_authority";
-    static final String EXTRA_DEFAULT_ICON_TINT_COLOR = "default_icon_tint_color";
-
-    private static final String KEY_AWAITING_RESULT = "awaiting_result";
-    private static final String KEY_SELECTED_POSITION = "selected_position";
-
-    private boolean mWaitingForActivityResult;
-
-    private FooterButton mDoneButton;
-    private AvatarAdapter mAdapter;
-
-    private AvatarPhotoController mAvatarPhotoController;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        boolean dayNightEnabled = ThemeHelper.isSetupWizardDayNightEnabled(this);
-        ThemeResolver themeResolver =
-                new ThemeResolver.Builder(ThemeResolver.getDefault())
-                        .setDefaultTheme(ThemeHelper.getSuwDefaultTheme(this))
-                        .setUseDayNight(true)
-                        .build();
-        int themeResId = themeResolver.resolve("", /* suppressDayNight= */ !dayNightEnabled);
-        setTheme(themeResId);
-        ThemeHelper.trySetDynamicColor(this);
-        setContentView(R.layout.avatar_picker);
-        setUpButtons();
-
-        RecyclerView recyclerView = findViewById(R.id.avatar_grid);
-        mAdapter = new AvatarAdapter();
-        recyclerView.setAdapter(mAdapter);
-        recyclerView.setLayoutManager(new GridLayoutManager(this,
-                getResources().getInteger(R.integer.avatar_picker_columns)));
-
-        restoreState(savedInstanceState);
-
-        mAvatarPhotoController = new AvatarPhotoController(
-                new AvatarPhotoController.AvatarUiImpl(this),
-                new AvatarPhotoController.ContextInjectorImpl(this, getFileAuthority()),
-                mWaitingForActivityResult);
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        mAdapter.onAdapterResume();
-    }
-
-    private void setUpButtons() {
-        GlifLayout glifLayout = findViewById(R.id.glif_layout);
-        FooterBarMixin mixin = glifLayout.getMixin(FooterBarMixin.class);
-
-        FooterButton secondaryButton =
-                new FooterButton.Builder(this)
-                        .setText(getString(android.R.string.cancel))
-                        .setListener(view -> cancel())
-                        .build();
-
-        mDoneButton =
-                new FooterButton.Builder(this)
-                        .setText(getString(R.string.done))
-                        .setListener(view -> mAdapter.returnSelectionResult())
-                        .build();
-        mDoneButton.setEnabled(false);
-
-        mixin.setSecondaryButton(secondaryButton);
-        mixin.setPrimaryButton(mDoneButton);
-    }
-
-    private String getFileAuthority() {
-        String authority = getIntent().getStringExtra(EXTRA_FILE_AUTHORITY);
-        if (authority == null) {
-            Log.e(this.getClass().getName(), "File authority must be provided");
-            finish();
-        }
-        return authority;
-    }
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        mWaitingForActivityResult = false;
-        mAvatarPhotoController.onActivityResult(requestCode, resultCode, data);
-    }
-
-    @Override
-    protected void onSaveInstanceState(@NonNull Bundle outState) {
-        outState.putBoolean(KEY_AWAITING_RESULT, mWaitingForActivityResult);
-        outState.putInt(KEY_SELECTED_POSITION, mAdapter.mSelectedPosition);
-        super.onSaveInstanceState(outState);
-    }
-
-    private void restoreState(Bundle savedInstanceState) {
-        if (savedInstanceState != null) {
-            mWaitingForActivityResult = savedInstanceState.getBoolean(KEY_AWAITING_RESULT, false);
-            mAdapter.mSelectedPosition =
-                    savedInstanceState.getInt(KEY_SELECTED_POSITION, AvatarAdapter.NONE);
-            mDoneButton.setEnabled(mAdapter.mSelectedPosition != AvatarAdapter.NONE);
-        }
-    }
-
-    @Override
-    public void startActivityForResult(Intent intent, int requestCode) {
-        mWaitingForActivityResult = true;
-        super.startActivityForResult(intent, requestCode);
-    }
-
-    void returnUriResult(Uri uri) {
-        Intent resultData = new Intent();
-        resultData.setData(uri);
-        setResult(RESULT_OK, resultData);
-        finish();
-    }
-
-    void returnColorResult(int color) {
-        Intent resultData = new Intent();
-        resultData.putExtra(EXTRA_DEFAULT_ICON_TINT_COLOR, color);
-        setResult(RESULT_OK, resultData);
-        finish();
-    }
-
-    private void cancel() {
-        setResult(RESULT_CANCELED);
-        finish();
-    }
-
-    private class AvatarAdapter extends RecyclerView.Adapter<AvatarViewHolder> {
-
-        private static final int NONE = -1;
-
-        private final int mTakePhotoPosition;
-        private final int mChoosePhotoPosition;
-        private final int mPreselectedImageStartPosition;
-
-        private final List<Drawable> mImageDrawables;
-        private final List<String> mImageDescriptions;
-        private final TypedArray mPreselectedImages;
-        private final int[] mUserIconColors;
-        private int mSelectedPosition = NONE;
-
-        private int mLastSelectedPosition = NONE;
-
-        AvatarAdapter() {
-            final boolean canTakePhoto =
-                    PhotoCapabilityUtils.canTakePhoto(AvatarPickerActivity.this);
-            final boolean canChoosePhoto =
-                    PhotoCapabilityUtils.canChoosePhoto(AvatarPickerActivity.this);
-            mTakePhotoPosition = (canTakePhoto ? 0 : NONE);
-            mChoosePhotoPosition = (canChoosePhoto ? (canTakePhoto ? 1 : 0) : NONE);
-            mPreselectedImageStartPosition = (canTakePhoto ? 1 : 0) + (canChoosePhoto ? 1 : 0);
-
-            mPreselectedImages = getResources().obtainTypedArray(R.array.avatar_images);
-            mUserIconColors = UserIcons.getUserIconColors(getResources());
-            mImageDrawables = buildDrawableList();
-            mImageDescriptions = buildDescriptionsList();
-        }
-
-        @NonNull
-        @Override
-        public AvatarViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) {
-            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
-            View itemView = layoutInflater.inflate(R.layout.avatar_item, parent, false);
-            return new AvatarViewHolder(itemView);
-        }
-
-        @Override
-        public void onBindViewHolder(@NonNull AvatarViewHolder viewHolder, int position) {
-            if (position == mTakePhotoPosition) {
-                viewHolder.setDrawable(getDrawable(R.drawable.avatar_take_photo_circled));
-                viewHolder.setContentDescription(getString(R.string.user_image_take_photo));
-
-            } else if (position == mChoosePhotoPosition) {
-                viewHolder.setDrawable(getDrawable(R.drawable.avatar_choose_photo_circled));
-                viewHolder.setContentDescription(getString(R.string.user_image_choose_photo));
-
-            } else if (position >= mPreselectedImageStartPosition) {
-                int index = indexFromPosition(position);
-                viewHolder.setSelected(position == mSelectedPosition);
-                viewHolder.setDrawable(mImageDrawables.get(index));
-                if (mImageDescriptions != null && index < mImageDescriptions.size()) {
-                    viewHolder.setContentDescription(mImageDescriptions.get(index));
-                } else {
-                    viewHolder.setContentDescription(getString(
-                            R.string.default_user_icon_description));
-                }
-            }
-            viewHolder.setClickListener(view -> onViewHolderSelected(position));
-        }
-
-        private void onViewHolderSelected(int position) {
-            if ((mTakePhotoPosition == position) && (mLastSelectedPosition != position)) {
-                mAvatarPhotoController.takePhoto();
-            } else if ((mChoosePhotoPosition == position) && (mLastSelectedPosition != position)) {
-                mAvatarPhotoController.choosePhoto();
-            } else {
-                if (mSelectedPosition == position) {
-                    deselect(position);
-                } else {
-                    select(position);
-                }
-            }
-            mLastSelectedPosition = position;
-        }
-
-        public void onAdapterResume() {
-            mLastSelectedPosition = NONE;
-        }
-
-        @Override
-        public int getItemCount() {
-            return mPreselectedImageStartPosition + mImageDrawables.size();
-        }
-
-        private List<Drawable> buildDrawableList() {
-            List<Drawable> result = new ArrayList<>();
-
-            for (int i = 0; i < mPreselectedImages.length(); i++) {
-                Drawable drawable = mPreselectedImages.getDrawable(i);
-                if (drawable instanceof BitmapDrawable) {
-                    result.add(circularDrawableFrom((BitmapDrawable) drawable));
-                } else {
-                    throw new IllegalStateException("Avatar drawables must be bitmaps");
-                }
-            }
-            if (!result.isEmpty()) {
-                return result;
-            }
-
-            // No preselected images. Use tinted default icon.
-            for (int i = 0; i < mUserIconColors.length; i++) {
-                result.add(UserIcons.getDefaultUserIconInColor(getResources(), mUserIconColors[i]));
-            }
-            return result;
-        }
-
-        private List<String> buildDescriptionsList() {
-            if (mPreselectedImages.length() > 0) {
-                return Arrays.asList(
-                        getResources().getStringArray(R.array.avatar_image_descriptions));
-            }
-
-            return null;
-        }
-
-        private Drawable circularDrawableFrom(BitmapDrawable drawable) {
-            Bitmap bitmap = drawable.getBitmap();
-
-            RoundedBitmapDrawable roundedBitmapDrawable =
-                    RoundedBitmapDrawableFactory.create(getResources(), bitmap);
-            roundedBitmapDrawable.setCircular(true);
-
-            return roundedBitmapDrawable;
-        }
-
-        private int indexFromPosition(int position) {
-            return position - mPreselectedImageStartPosition;
-        }
-
-        private void select(int position) {
-            final int oldSelection = mSelectedPosition;
-            mSelectedPosition = position;
-            notifyItemChanged(position);
-            if (oldSelection != NONE) {
-                notifyItemChanged(oldSelection);
-            } else {
-                mDoneButton.setEnabled(true);
-            }
-        }
-
-        private void deselect(int position) {
-            mSelectedPosition = NONE;
-            notifyItemChanged(position);
-            mDoneButton.setEnabled(false);
-        }
-
-        private void returnSelectionResult() {
-            int index = indexFromPosition(mSelectedPosition);
-            if (mPreselectedImages.length() > 0) {
-                int resourceId = mPreselectedImages.getResourceId(index, -1);
-                if (resourceId == -1) {
-                    throw new IllegalStateException("Preselected avatar images must be resources.");
-                }
-                returnUriResult(uriForResourceId(resourceId));
-            } else {
-                returnColorResult(
-                        mUserIconColors[index]);
-            }
-        }
-
-        private Uri uriForResourceId(int resourceId) {
-            return new Uri.Builder()
-                    .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
-                    .authority(getResources().getResourcePackageName(resourceId))
-                    .appendPath(getResources().getResourceTypeName(resourceId))
-                    .appendPath(getResources().getResourceEntryName(resourceId))
-                    .build();
-        }
-    }
-
-    private static class AvatarViewHolder extends RecyclerView.ViewHolder {
-        private final ImageView mImageView;
-
-        AvatarViewHolder(View view) {
-            super(view);
-            mImageView = view.findViewById(R.id.avatar_image);
-        }
-
-        public void setDrawable(Drawable drawable) {
-            mImageView.setImageDrawable(drawable);
-        }
-
-        public void setContentDescription(String desc) {
-            mImageView.setContentDescription(desc);
-        }
-
-        public void setClickListener(View.OnClickListener listener) {
-            mImageView.setOnClickListener(listener);
-        }
-
-        public void setSelected(boolean selected) {
-            mImageView.setSelected(selected);
-        }
-    }
-}
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
index b2de5a9..cdc3f12 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
@@ -62,6 +62,9 @@
 
     private static final String AVATAR_PICKER_ACTION = "com.android.avatarpicker"
             + ".FULL_SCREEN_ACTIVITY";
+    private static final String EXTRA_FILE_AUTHORITY = "file_authority";
+    private static final String EXTRA_DEFAULT_ICON_TINT_COLOR = "default_icon_tint_color";
+
     static final String EXTRA_IS_USER_NEW = "is_user_new";
 
     private final Activity mActivity;
@@ -73,10 +76,12 @@
     private Bitmap mNewUserPhotoBitmap;
     private Drawable mNewUserPhotoDrawable;
     private String mCachedDrawablePath;
+
     public EditUserPhotoController(Activity activity, ActivityStarter activityStarter,
             ImageView view, Bitmap savedBitmap, Drawable savedDrawable, String fileAuthority) {
         this(activity, activityStarter, view, savedBitmap, savedDrawable, fileAuthority, true);
     }
+
     public EditUserPhotoController(Activity activity, ActivityStarter activityStarter,
             ImageView view, Bitmap savedBitmap, Drawable savedDrawable, String fileAuthority,
             boolean isUserNew) {
@@ -104,9 +109,9 @@
         }
 
         if (requestCode == REQUEST_CODE_PICK_AVATAR) {
-            if (data.hasExtra(AvatarPickerActivity.EXTRA_DEFAULT_ICON_TINT_COLOR)) {
+            if (data.hasExtra(EXTRA_DEFAULT_ICON_TINT_COLOR)) {
                 int tintColor =
-                        data.getIntExtra(AvatarPickerActivity.EXTRA_DEFAULT_ICON_TINT_COLOR, -1);
+                        data.getIntExtra(EXTRA_DEFAULT_ICON_TINT_COLOR, -1);
                 onDefaultIconSelected(tintColor);
                 return true;
             }
@@ -123,15 +128,16 @@
     }
 
     private void showAvatarPicker(boolean isUserNew) {
-        Intent intent;
+        Intent intent = new Intent(AVATAR_PICKER_ACTION);
+        intent.addCategory(Intent.CATEGORY_DEFAULT);
         if (Flags.avatarSync()) {
-            intent = new Intent(AVATAR_PICKER_ACTION);
-            intent.addCategory(Intent.CATEGORY_DEFAULT);
             intent.putExtra(EXTRA_IS_USER_NEW, isUserNew);
         } else {
-            intent = new Intent(mImageView.getContext(), AvatarPickerActivity.class);
+            // SettingsLib is used by multiple apps therefore we need to know out of all apps
+            // using settingsLib which one is the one we return value to.
+            intent.setPackage(mImageView.getContext().getApplicationContext().getPackageName());
         }
-        intent.putExtra(AvatarPickerActivity.EXTRA_FILE_AUTHORITY, mFileAuthority);
+        intent.putExtra(EXTRA_FILE_AUTHORITY, mFileAuthority);
         mActivityStarter.startActivityForResult(intent, REQUEST_CODE_PICK_AVATAR);
     }
 
@@ -183,7 +189,8 @@
             }
 
             @Override
-            public void onFailure(Throwable t) {}
+            public void onFailure(Throwable t) {
+            }
         }, mImageView.getContext().getMainExecutor());
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/PhotoCapabilityUtils.java b/packages/SettingsLib/src/com/android/settingslib/users/PhotoCapabilityUtils.java
deleted file mode 100644
index b8615a7..0000000
--- a/packages/SettingsLib/src/com/android/settingslib/users/PhotoCapabilityUtils.java
+++ /dev/null
@@ -1,76 +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.users;
-
-import android.app.KeyguardManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.provider.MediaStore;
-
-/**
- * Utility class that contains helper methods to determine if the current user has permission and
- * the device is in a proper state to start an activity for a given action.
- */
-public class PhotoCapabilityUtils {
-
-    /**
-     * Check if the current user can perform any activity for
-     * android.media.action.IMAGE_CAPTURE action.
-     */
-    public static boolean canTakePhoto(Context context) {
-        return context.getPackageManager().queryIntentActivities(
-                new Intent(MediaStore.ACTION_IMAGE_CAPTURE),
-                PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
-    }
-
-    /**
-     * Check if the current user can perform any activity for
-     * ACTION_PICK_IMAGES action for images.
-     * Returns false if the device is currently locked and
-     * requires a PIN, pattern or password to unlock.
-     */
-    public static boolean canChoosePhoto(Context context) {
-        Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
-        intent.setType("image/*");
-        boolean canPerformActivityForGetImage =
-                context.getPackageManager().queryIntentActivities(intent, 0).size() > 0;
-        // on locked device we can't access the images
-        return canPerformActivityForGetImage && !isDeviceLocked(context);
-    }
-
-    /**
-     * Check if the current user can perform any activity for
-     * com.android.camera.action.CROP action for images.
-     * Returns false if the device is currently locked and
-     * requires a PIN, pattern or password to unlock.
-     */
-    public static boolean canCropPhoto(Context context) {
-        Intent intent = new Intent("com.android.camera.action.CROP");
-        intent.setType("image/*");
-        boolean canPerformActivityForCropping =
-                context.getPackageManager().queryIntentActivities(intent, 0).size() > 0;
-        // on locked device we can't start a cropping activity
-        return canPerformActivityForCropping && !isDeviceLocked(context);
-    }
-
-    private static boolean isDeviceLocked(Context context) {
-        KeyguardManager keyguardManager = context.getSystemService(KeyguardManager.class);
-        return keyguardManager == null || keyguardManager.isDeviceLocked();
-    }
-
-}
diff --git a/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt b/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt
index e7fec69..65a5317 100644
--- a/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt
@@ -73,6 +73,10 @@
     suspend fun setVolume(audioStream: AudioStream, volume: Int)
 
     suspend fun setMuted(audioStream: AudioStream, isMuted: Boolean)
+
+    suspend fun setRingerMode(audioStream: AudioStream, mode: RingerMode)
+
+    suspend fun isAffectedByMute(audioStream: AudioStream): Boolean
 }
 
 class AudioRepositoryImpl(
@@ -169,6 +173,16 @@
             )
         }
 
+    override suspend fun setRingerMode(audioStream: AudioStream, mode: RingerMode) {
+        withContext(backgroundCoroutineContext) { audioManager.ringerMode = mode.value }
+    }
+
+    override suspend fun isAffectedByMute(audioStream: AudioStream): Boolean {
+        return withContext(backgroundCoroutineContext) {
+            audioManager.isStreamAffectedByMute(audioStream.value)
+        }
+    }
+
     private fun getMinVolume(stream: AudioStream): Int =
         try {
             audioManager.getStreamMinVolume(stream.value)
diff --git a/packages/SettingsLib/src/com/android/settingslib/volume/domain/interactor/AudioVolumeInteractor.kt b/packages/SettingsLib/src/com/android/settingslib/volume/domain/interactor/AudioVolumeInteractor.kt
index 778653b..33f917e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/volume/domain/interactor/AudioVolumeInteractor.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/volume/domain/interactor/AudioVolumeInteractor.kt
@@ -49,8 +49,14 @@
     suspend fun setVolume(audioStream: AudioStream, volume: Int) =
         audioRepository.setVolume(audioStream, volume)
 
-    suspend fun setMuted(audioStream: AudioStream, isMuted: Boolean) =
+    suspend fun setMuted(audioStream: AudioStream, isMuted: Boolean) {
+        if (audioStream.value == AudioManager.STREAM_RING) {
+            val mode =
+                if (isMuted) AudioManager.RINGER_MODE_VIBRATE else AudioManager.RINGER_MODE_NORMAL
+            audioRepository.setRingerMode(audioStream, RingerMode(mode))
+        }
         audioRepository.setMuted(audioStream, isMuted)
+    }
 
     /** Checks if the volume can be changed via the UI. */
     fun canChangeVolume(audioStream: AudioStream): Flow<Boolean> {
@@ -66,9 +72,8 @@
         }
     }
 
-    fun isMutable(audioStream: AudioStream): Boolean =
-        // Alarm stream doesn't support muting
-        audioStream.value != AudioManager.STREAM_ALARM
+    suspend fun isAffectedByMute(audioStream: AudioStream): Boolean =
+        audioRepository.isAffectedByMute(audioStream)
 
     private suspend fun processVolume(
         audioStreamModel: AudioStreamModel,
diff --git a/packages/SettingsLib/tests/integ/Android.bp b/packages/SettingsLib/tests/integ/Android.bp
index f303ab5..33d23a3 100644
--- a/packages/SettingsLib/tests/integ/Android.bp
+++ b/packages/SettingsLib/tests/integ/Android.bp
@@ -57,6 +57,7 @@
         "mockito-target-extended-minus-junit4",
         "platform-test-annotations",
         "truth",
+        "SettingsLibAvatarPicker",
         "SettingsLibDeviceStateRotationLock",
         "SettingsLibSettingsSpinner",
         "SettingsLibUsageProgressBarPreference",
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java
index fe83ffb..b974888 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/applications/ApplicationsStateTest.java
@@ -267,6 +267,16 @@
     }
 
     @Test
+    public void testEnabledFilterNotQuietRejectsInstantApp() {
+        mSetFlagsRule.enableFlags(android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE,
+                android.multiuser.Flags.FLAG_HANDLE_INTERLEAVED_SETTINGS_FOR_PRIVATE_SPACE);
+        mEntry.info.enabled = true;
+        assertThat(ApplicationsState.FILTER_ENABLED_NOT_QUIET.filterApp(mEntry)).isTrue();
+        when(mEntry.info.isInstantApp()).thenReturn(true);
+        assertThat(ApplicationsState.FILTER_ENABLED_NOT_QUIET.filterApp(mEntry)).isFalse();
+    }
+
+    @Test
     public void testFilterWithDomainUrls() {
         mEntry.info.privateFlags |= ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
         // should included updated system apps
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java
index d988111..995314e 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
-package com.android.settingslib.users;
+package com.android.settingslib.avatarpicker;
 
-import static com.android.settingslib.users.AvatarPhotoController.REQUEST_CODE_CHOOSE_PHOTO;
-import static com.android.settingslib.users.AvatarPhotoController.REQUEST_CODE_CROP_PHOTO;
-import static com.android.settingslib.users.AvatarPhotoController.REQUEST_CODE_TAKE_PHOTO;
+import static com.android.settingslib.avatarpicker.AvatarPhotoController.REQUEST_CODE_CHOOSE_PHOTO;
+import static com.android.settingslib.avatarpicker.AvatarPhotoController.REQUEST_CODE_CROP_PHOTO;
+import static com.android.settingslib.avatarpicker.AvatarPhotoController.REQUEST_CODE_TAKE_PHOTO;
 
 import static com.google.common.truth.Truth.assertThat;
 
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
index 6f31fad..5136e26 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
@@ -16,7 +16,6 @@
 package com.android.settingslib;
 
 import static com.android.settingslib.Utils.STORAGE_MANAGER_ENABLED_PROPERTY;
-import static com.android.settingslib.Utils.shouldShowWirelessChargingWarningTip;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -73,7 +72,6 @@
     private static final String PERCENTAGE_49 = "49%";
     private static final String PERCENTAGE_50 = "50%";
     private static final String PERCENTAGE_100 = "100%";
-    private static final long CURRENT_TIMESTAMP = System.currentTimeMillis();
 
     private AudioManager mAudioManager;
     private Context mContext;
@@ -543,20 +541,6 @@
         assertThat(Utils.containsIncompatibleChargers(mContext, TAG)).isFalse();
     }
 
-    @Test
-    public void shouldShowWirelessChargingWarningTip_enabled_returnTrue() {
-        Utils.updateWirelessChargingWarningEnabled(mContext, true, TAG);
-
-        assertThat(shouldShowWirelessChargingWarningTip(mContext, TAG)).isTrue();
-    }
-
-    @Test
-    public void shouldShowWirelessChargingWarningTip_disabled_returnFalse() {
-        Utils.updateWirelessChargingWarningEnabled(mContext, false, TAG);
-
-        assertThat(shouldShowWirelessChargingWarningTip(mContext, TAG)).isFalse();
-    }
-
     private void setupIncompatibleCharging() {
         setupIncompatibleCharging(UsbPortStatus.COMPLIANCE_WARNING_DEBUG_ACCESSORY);
     }
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 475a6d6..f197f9e 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
@@ -17,6 +17,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.spy;
@@ -25,6 +26,7 @@
 
 import android.bluetooth.BluetoothClass;
 import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothLeBroadcastReceiveState;
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
@@ -44,6 +46,9 @@
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @RunWith(RobolectricTestRunner.class)
 public class BluetoothUtilsTest {
 
@@ -55,6 +60,16 @@
     private AudioManager mAudioManager;
     @Mock
     private PackageManager mPackageManager;
+    @Mock
+    private LocalBluetoothLeBroadcast mBroadcast;
+    @Mock
+    private LocalBluetoothProfileManager mProfileManager;
+    @Mock
+    private LocalBluetoothManager mLocalBluetoothManager;
+    @Mock
+    private LocalBluetoothLeBroadcastAssistant mAssistant;
+    @Mock
+    private BluetoothLeBroadcastReceiveState mLeBroadcastReceiveState;
 
     private Context mContext;
     private static final String STRING_METADATA = "string_metadata";
@@ -72,6 +87,9 @@
         MockitoAnnotations.initMocks(this);
 
         mContext = spy(RuntimeEnvironment.application);
+        when(mLocalBluetoothManager.getProfileManager()).thenReturn(mProfileManager);
+        when(mProfileManager.getLeAudioBroadcastProfile()).thenReturn(mBroadcast);
+        when(mProfileManager.getLeAudioBroadcastAssistantProfile()).thenReturn(mAssistant);
     }
 
     @Test
@@ -430,4 +448,38 @@
         assertThat(BluetoothUtils.isExclusivelyManagedBluetoothDevice(mContext,
                 mBluetoothDevice)).isEqualTo(true);
     }
+
+    @Test
+    public void testIsBroadcasting_broadcastEnabled_returnTrue() {
+        when(mBroadcast.isEnabled(any())).thenReturn(true);
+        assertThat(BluetoothUtils.isBroadcasting(mLocalBluetoothManager)).isEqualTo(true);
+    }
+
+    @Test
+    public void testHasConnectedBroadcastSource_deviceConnectedToBroadcastSource() {
+        when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
+
+        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);
+
+        assertThat(
+                BluetoothUtils.hasConnectedBroadcastSource(
+                        mCachedBluetoothDevice, mLocalBluetoothManager))
+                .isEqualTo(true);
+    }
+
+    @Test
+    public void isAvailableHearingDevice_isConnectedHearingAid_returnTure() {
+        when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true);
+        when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
+        when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+        when(mBluetoothDevice.isConnected()).thenReturn(true);
+
+        assertThat(BluetoothUtils.isAvailableHearingDevice(mCachedBluetoothDevice)).isEqualTo(true);
+    }
 }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java
index d85d253..d793867 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java
@@ -86,6 +86,41 @@
     private static final String TEST_DUPLICATED_ID_2 = "test_duplicated_id_2";
     private static final String TEST_DUPLICATED_ID_3 = "test_duplicated_id_3";
 
+    private static final String TEST_SYSTEM_ROUTE_ID = "TEST_SYSTEM_ROUTE_ID";
+    private static final String TEST_BLUETOOTH_ROUTE_ID = "TEST_BT_ROUTE_ID";
+
+    private static final RoutingSessionInfo TEST_SYSTEM_ROUTING_SESSION =
+            new RoutingSessionInfo.Builder("FAKE_SYSTEM_ROUTING_SESSION_ID", TEST_PACKAGE_NAME)
+                    .addSelectedRoute(TEST_SYSTEM_ROUTE_ID)
+                    .addTransferableRoute(TEST_BLUETOOTH_ROUTE_ID)
+                    .setSystemSession(true)
+                    .build();
+
+    private static final MediaRoute2Info TEST_SELECTED_SYSTEM_ROUTE =
+            new MediaRoute2Info.Builder(TEST_SYSTEM_ROUTE_ID, "SELECTED_SYSTEM_ROUTE")
+                    .setSystemRoute(true)
+                    .addFeature(MediaRoute2Info.FEATURE_LIVE_AUDIO)
+                    .build();
+
+    private static final MediaRoute2Info TEST_BLUETOOTH_ROUTE =
+            new MediaRoute2Info.Builder(TEST_BLUETOOTH_ROUTE_ID, "BLUETOOTH_ROUTE")
+                    .setSystemRoute(true)
+                    .addFeature(MediaRoute2Info.FEATURE_LIVE_AUDIO)
+                    .setType(TYPE_BLUETOOTH_A2DP)
+                    .setAddress("00:00:00:00:00:00")
+                    .build();
+
+    private static final RoutingSessionInfo TEST_REMOTE_ROUTING_SESSION =
+            new RoutingSessionInfo.Builder("FAKE_REMOTE_ROUTING_SESSION_ID", TEST_PACKAGE_NAME)
+                    .addSelectedRoute(TEST_ID_1)
+                    .build();
+
+    private static final MediaRoute2Info TEST_REMOTE_ROUTE =
+            new MediaRoute2Info.Builder(TEST_ID_1, "REMOTE_ROUTE")
+                    .setSystemRoute(true)
+                    .addFeature(MediaRoute2Info.FEATURE_LIVE_AUDIO)
+                    .build();
+
     @Mock
     private MediaRouter2Manager mRouterManager;
     @Mock
@@ -127,7 +162,10 @@
         RoutingSessionInfo sessionInfo = mock(RoutingSessionInfo.class);
         mInfoMediaManager.mRouterManager = mRouterManager;
         // Since test is running in Robolectric, return a fake session to avoid NPE.
-        when(mRouterManager.getRoutingSessions(anyString())).thenReturn(List.of(sessionInfo));
+        when(mRouterManager.getRoutingSessions(anyString()))
+                .thenReturn(List.of(TEST_SYSTEM_ROUTING_SESSION));
+        when(mRouterManager.getSelectedRoutes(any()))
+                .thenReturn(List.of(TEST_SELECTED_SYSTEM_ROUTE));
 
         mInfoMediaManager.startScan();
         mInfoMediaManager.stopScan();
@@ -167,52 +205,27 @@
 
     @Test
     public void onSessionReleased_shouldUpdateConnectedDevice() {
-        final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
-        final RoutingSessionInfo sessionInfo1 = mock(RoutingSessionInfo.class);
-        routingSessionInfos.add(sessionInfo1);
-        final RoutingSessionInfo sessionInfo2 = mock(RoutingSessionInfo.class);
-        routingSessionInfos.add(sessionInfo2);
+        mInfoMediaManager.mRouterManager = mRouterManager;
 
-        final List<String> selectedRoutesSession1 = new ArrayList<>();
-        selectedRoutesSession1.add(TEST_ID_1);
-        when(sessionInfo1.getSelectedRoutes()).thenReturn(selectedRoutesSession1);
-
-        final List<String> selectedRoutesSession2 = new ArrayList<>();
-        selectedRoutesSession2.add(TEST_ID_2);
-        when(sessionInfo2.getSelectedRoutes()).thenReturn(selectedRoutesSession2);
-
-        mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
-
-        final MediaRoute2Info info1 = mock(MediaRoute2Info.class);
-        when(info1.getId()).thenReturn(TEST_ID_1);
-        when(info1.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
-
-        final MediaRoute2Info info2 = mock(MediaRoute2Info.class);
-        when(info2.getId()).thenReturn(TEST_ID_2);
-        when(info2.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
-
-        final List<MediaRoute2Info> routes = new ArrayList<>();
-        routes.add(info1);
-        routes.add(info2);
-        mShadowRouter2Manager.setAllRoutes(routes);
-        mShadowRouter2Manager.setTransferableRoutes(routes);
-
-        final MediaDevice mediaDevice1 = mInfoMediaManager.findMediaDevice(TEST_ID_1);
-        assertThat(mediaDevice1).isNull();
-        final MediaDevice mediaDevice2 = mInfoMediaManager.findMediaDevice(TEST_ID_2);
-        assertThat(mediaDevice2).isNull();
+        // Active routing session is last one in list.
+        when(mRouterManager.getRoutingSessions(anyString()))
+                .thenReturn(List.of(TEST_SYSTEM_ROUTING_SESSION, TEST_REMOTE_ROUTING_SESSION));
+        when(mRouterManager.getSelectedRoutes(TEST_SYSTEM_ROUTING_SESSION))
+                .thenReturn(List.of(TEST_SELECTED_SYSTEM_ROUTE));
+        when(mRouterManager.getSelectedRoutes(TEST_REMOTE_ROUTING_SESSION))
+                .thenReturn(List.of(TEST_REMOTE_ROUTE));
 
         mInfoMediaManager.mMediaRouterCallback.onRoutesUpdated();
-        final MediaDevice infoDevice1 = mInfoMediaManager.mMediaDevices.get(0);
-        assertThat(infoDevice1.getId()).isEqualTo(TEST_ID_1);
-        final MediaDevice infoDevice2 = mInfoMediaManager.mMediaDevices.get(1);
-        assertThat(infoDevice2.getId()).isEqualTo(TEST_ID_2);
-        // The active routing session is the last one in the list, which maps to infoDevice2.
-        assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice2);
+        MediaDevice remoteDevice = mInfoMediaManager.findMediaDevice(TEST_REMOTE_ROUTE.getId());
+        assertThat(remoteDevice).isNotNull();
+        assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(remoteDevice);
 
-        routingSessionInfos.remove(sessionInfo2);
-        mInfoMediaManager.mMediaRouterCallback.onSessionReleased(sessionInfo2);
-        assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice1);
+        when(mRouterManager.getRoutingSessions(anyString()))
+                .thenReturn(List.of(TEST_SYSTEM_ROUTING_SESSION));
+        mInfoMediaManager.mMediaRouterCallback.onSessionReleased(TEST_REMOTE_ROUTING_SESSION);
+        MediaDevice systemRoute = mInfoMediaManager.findMediaDevice(TEST_SYSTEM_ROUTE_ID);
+        assertThat(systemRoute).isNotNull();
+        assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(systemRoute);
     }
 
     @Test
@@ -770,18 +783,16 @@
 
     @Test
     public void onSessionUpdated_shouldDispatchDeviceListAdded() {
-        final MediaRoute2Info info = mock(MediaRoute2Info.class);
-        when(info.getId()).thenReturn(TEST_ID);
-        when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
-        when(info.isSystemRoute()).thenReturn(true);
-
-        final List<MediaRoute2Info> routes = new ArrayList<>();
-        routes.add(info);
-        mShadowRouter2Manager.setAllRoutes(routes);
+        mInfoMediaManager.mRouterManager = mRouterManager;
+        // Since test is running in Robolectric, return a fake session to avoid NPE.
+        when(mRouterManager.getRoutingSessions(anyString()))
+                .thenReturn(List.of(TEST_SYSTEM_ROUTING_SESSION));
+        when(mRouterManager.getSelectedRoutes(any()))
+                .thenReturn(List.of(TEST_SELECTED_SYSTEM_ROUTE));
 
         mInfoMediaManager.registerCallback(mCallback);
 
-        mInfoMediaManager.mMediaRouterCallback.onSessionUpdated(mock(RoutingSessionInfo.class));
+        mInfoMediaManager.mMediaRouterCallback.onSessionUpdated(TEST_SYSTEM_ROUTING_SESSION);
 
         verify(mCallback).onDeviceListAdded(any());
     }
@@ -795,19 +806,19 @@
 
         when(route2Info.getType()).thenReturn(TYPE_REMOTE_SPEAKER);
         when(route2Info.getId()).thenReturn(TEST_ID);
-        mInfoMediaManager.addMediaDevice(route2Info);
+        mInfoMediaManager.addMediaDevice(route2Info, TEST_SYSTEM_ROUTING_SESSION);
         assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof InfoMediaDevice).isTrue();
 
         when(route2Info.getType()).thenReturn(TYPE_USB_DEVICE);
         when(route2Info.getId()).thenReturn(TEST_ID);
         mInfoMediaManager.mMediaDevices.clear();
-        mInfoMediaManager.addMediaDevice(route2Info);
+        mInfoMediaManager.addMediaDevice(route2Info, TEST_SYSTEM_ROUTING_SESSION);
         assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue();
 
         when(route2Info.getType()).thenReturn(TYPE_WIRED_HEADSET);
         when(route2Info.getId()).thenReturn(TEST_ID);
         mInfoMediaManager.mMediaDevices.clear();
-        mInfoMediaManager.addMediaDevice(route2Info);
+        mInfoMediaManager.addMediaDevice(route2Info, TEST_SYSTEM_ROUTING_SESSION);
         assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue();
 
         when(route2Info.getType()).thenReturn(TYPE_BLUETOOTH_A2DP);
@@ -818,12 +829,12 @@
         when(cachedBluetoothDeviceManager.findDevice(any(BluetoothDevice.class)))
                 .thenReturn(cachedDevice);
         mInfoMediaManager.mMediaDevices.clear();
-        mInfoMediaManager.addMediaDevice(route2Info);
+        mInfoMediaManager.addMediaDevice(route2Info, TEST_SYSTEM_ROUTING_SESSION);
         assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof BluetoothMediaDevice).isTrue();
 
         when(route2Info.getType()).thenReturn(TYPE_BUILTIN_SPEAKER);
         mInfoMediaManager.mMediaDevices.clear();
-        mInfoMediaManager.addMediaDevice(route2Info);
+        mInfoMediaManager.addMediaDevice(route2Info, TEST_SYSTEM_ROUTING_SESSION);
         assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue();
     }
 
@@ -841,34 +852,35 @@
                 .thenReturn(null);
 
         mInfoMediaManager.mMediaDevices.clear();
-        mInfoMediaManager.addMediaDevice(route2Info);
+        mInfoMediaManager.addMediaDevice(route2Info, TEST_SYSTEM_ROUTING_SESSION);
 
         assertThat(mInfoMediaManager.mMediaDevices.size()).isEqualTo(0);
     }
 
     @Test
-    public void addMediaDevice_deviceIncludedInSelectedDevices_shouldSetAsCurrentConnected() {
-        final MediaRoute2Info route2Info = mock(MediaRoute2Info.class);
+    public void onRoutesUpdated_setsFirstSelectedRouteAsCurrentConnectedDevice() {
         final CachedBluetoothDeviceManager cachedBluetoothDeviceManager =
                 mock(CachedBluetoothDeviceManager.class);
-        final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class);
-        final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
-        final RoutingSessionInfo sessionInfo = mock(RoutingSessionInfo.class);
-        routingSessionInfos.add(sessionInfo);
 
-        when(mRouterManager.getRoutingSessions(TEST_PACKAGE_NAME)).thenReturn(routingSessionInfos);
-        when(sessionInfo.getSelectedRoutes()).thenReturn(ImmutableList.of(TEST_ID));
-        when(route2Info.getType()).thenReturn(TYPE_BLUETOOTH_A2DP);
-        when(route2Info.getAddress()).thenReturn("00:00:00:00:00:00");
-        when(route2Info.getId()).thenReturn(TEST_ID);
+        final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class);
+        RoutingSessionInfo selectedBtSession =
+                new RoutingSessionInfo.Builder(TEST_SYSTEM_ROUTING_SESSION)
+                        .clearSelectedRoutes()
+                        .clearTransferableRoutes()
+                        .addSelectedRoute(TEST_BLUETOOTH_ROUTE_ID)
+                        .addTransferableRoute(TEST_SYSTEM_ROUTE_ID)
+                        .build();
+
+        when(mRouterManager.getRoutingSessions(TEST_PACKAGE_NAME))
+                .thenReturn(List.of(selectedBtSession));
+        when(mRouterManager.getSelectedRoutes(any())).thenReturn(List.of(TEST_BLUETOOTH_ROUTE));
         when(mLocalBluetoothManager.getCachedDeviceManager())
                 .thenReturn(cachedBluetoothDeviceManager);
         when(cachedBluetoothDeviceManager.findDevice(any(BluetoothDevice.class)))
                 .thenReturn(cachedDevice);
         mInfoMediaManager.mRouterManager = mRouterManager;
 
-        mInfoMediaManager.mMediaDevices.clear();
-        mInfoMediaManager.addMediaDevice(route2Info);
+        mInfoMediaManager.mMediaRouterCallback.onRoutesUpdated();
 
         MediaDevice device = mInfoMediaManager.mMediaDevices.get(0);
 
diff --git a/packages/SettingsProvider/Android.bp b/packages/SettingsProvider/Android.bp
index bf4f60d..e9c2672 100644
--- a/packages/SettingsProvider/Android.bp
+++ b/packages/SettingsProvider/Android.bp
@@ -32,6 +32,7 @@
         "unsupportedappusage",
     ],
     static_libs: [
+        "aconfig_demo_flags_java_lib",
         "device_config_service_flags_java",
         "libaconfig_java_proto_lite",
         "SettingsLibDeviceStateRotationLock",
@@ -87,6 +88,7 @@
 aconfig_declarations {
     name: "device_config_service_flags",
     package: "com.android.providers.settings",
+    container: "system",
     srcs: [
         "src/com/android/providers/settings/device_config_service.aconfig",
     ],
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index 5629a7b..a33c160 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -258,6 +258,7 @@
         Settings.Secure.ACCESSIBILITY_FONT_SCALING_HAS_BEEN_CHANGED,
         Settings.Secure.SEARCH_ALL_ENTRYPOINTS_ENABLED,
         Settings.Secure.HUB_MODE_TUTORIAL_STATE,
+        Settings.Secure.GLANCEABLE_HUB_ENABLED,
         Settings.Secure.STYLUS_BUTTONS_ENABLED,
         Settings.Secure.STYLUS_HANDWRITING_ENABLED,
         Settings.Secure.DEFAULT_NOTE_TASK_PROFILE,
@@ -269,6 +270,8 @@
         Settings.Secure.CAMERA_EXTENSIONS_FALLBACK,
         Settings.Secure.VISUAL_QUERY_ACCESSIBILITY_DETECTION_ENABLED,
         Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS,
-        Settings.Secure.AUDIO_DEVICE_INVENTORY
+        Settings.Secure.AUDIO_DEVICE_INVENTORY,
+        Settings.Secure.SCREEN_RESOLUTION_MODE,
+        Settings.Secure.ACCESSIBILITY_FLOATING_MENU_TARGETS
     };
 }
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
index 6def40b..c274534 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
@@ -161,10 +161,6 @@
                 Global.DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD, PERCENTAGE_INTEGER_VALIDATOR);
         VALIDATORS.put(Global.BLUETOOTH_ON, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Global.CLOCKWORK_HOME_READY, ANY_STRING_VALIDATOR);
-        VALIDATORS.put(Global.ENABLE_TARE,
-                new DiscreteValueValidator(new String[] {"0", "1", "2"}));
-        VALIDATORS.put(Global.TARE_ALARM_MANAGER_CONSTANTS, ANY_STRING_VALIDATOR);
-        VALIDATORS.put(Global.TARE_JOB_SCHEDULER_CONSTANTS, ANY_STRING_VALIDATOR);
         VALIDATORS.put(Global.PRIVATE_DNS_MODE, ANY_STRING_VALIDATOR);
         VALIDATORS.put(Global.PRIVATE_DNS_SPECIFIER, ANY_STRING_VALIDATOR);
         VALIDATORS.put(Global.SOFT_AP_TIMEOUT_ENABLED, BOOLEAN_VALIDATOR);
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index b8d95eb..1bff592 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -326,6 +326,9 @@
                 Secure.ACCESSIBILITY_BUTTON_TARGETS,
                 ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR);
         VALIDATORS.put(
+                Secure.ACCESSIBILITY_FLOATING_MENU_TARGETS,
+                ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR);
+        VALIDATORS.put(
                 Secure.ACCESSIBILITY_QS_TARGETS,
                 ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR);
         VALIDATORS.put(Secure.ACCESSIBILITY_FORCE_INVERT_COLOR_ENABLED, BOOLEAN_VALIDATOR);
@@ -413,6 +416,7 @@
                 BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.DND_CONFIGS_MIGRATED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.HUB_MODE_TUTORIAL_STATE, NON_NEGATIVE_INTEGER_VALIDATOR);
+        VALIDATORS.put(Secure.GLANCEABLE_HUB_ENABLED, new InclusiveIntegerRangeValidator(0, 1));
         VALIDATORS.put(Secure.STYLUS_BUTTONS_ENABLED, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.STYLUS_HANDWRITING_ENABLED,
                 new DiscreteValueValidator(new String[] {"-1", "0", "1"}));
@@ -424,5 +428,7 @@
         VALIDATORS.put(Secure.CAMERA_EXTENSIONS_FALLBACK, BOOLEAN_VALIDATOR);
         VALIDATORS.put(Secure.IMMERSIVE_MODE_CONFIRMATIONS, ANY_STRING_VALIDATOR);
         VALIDATORS.put(Secure.AUDIO_DEVICE_INVENTORY, ANY_STRING_VALIDATOR);
+        VALIDATORS.put(Secure.SCREEN_RESOLUTION_MODE, new InclusiveIntegerRangeValidator(
+                Secure.RESOLUTION_MODE_UNKNOWN, Secure.RESOLUTION_MODE_FULL));
     }
 }
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index e5d62f8..8e32005 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -75,7 +75,10 @@
 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.AtomicInteger;
+import java.util.function.Consumer;
 import java.util.zip.CRC32;
 
 /**
@@ -103,6 +106,7 @@
     // fatal crash. Creating a backup with a different key will prevent Android 12 versions from
     // restoring this data.
     private static final String KEY_SIM_SPECIFIC_SETTINGS_2 = "sim_specific_settings_2";
+    private static final String KEY_WIFI_SETTINGS_BACKUP_DATA = "wifi_settings_backup_data";
 
     // Versioning of the state file.  Increment this version
     // number any time the set of state items is altered.
@@ -126,8 +130,9 @@
     private static final int STATE_WIFI_NEW_CONFIG       = 9;
     private static final int STATE_DEVICE_CONFIG         = 10;
     private static final int STATE_SIM_SPECIFIC_SETTINGS = 11;
+    private static final int STATE_WIFI_SETTINGS         = 12;
 
-    private static final int STATE_SIZE                  = 12; // The current number of state items
+    private static final int STATE_SIZE                  = 13; // The current number of state items
 
     // Number of entries in the checksum array at various version numbers
     private static final int STATE_SIZES[] = {
@@ -140,7 +145,8 @@
             9,              // version 6 added STATE_NETWORK_POLICIES
             10,             // version 7 added STATE_WIFI_NEW_CONFIG
             11,             // version 8 added STATE_DEVICE_CONFIG
-            STATE_SIZE      // version 9 added STATE_SIM_SPECIFIC_SETTINGS
+            12,             // version 9 added STATE_SIM_SPECIFIC_SETTINGS
+            STATE_SIZE      // version 10 added STATE_WIFI_SETTINGS
     };
 
     private static final int FULL_BACKUP_ADDED_GLOBAL = 2;  // added the "global" entry
@@ -230,6 +236,7 @@
         byte[] wifiFullConfigData = getNewWifiConfigData();
         byte[] deviceSpecificInformation = getDeviceSpecificConfiguration();
         byte[] simSpecificSettingsData = getSimSpecificSettingsData();
+        byte[] wifiSettingsData = getWifiSettingsBackupData();
 
         long[] stateChecksums = readOldChecksums(oldState);
 
@@ -265,6 +272,9 @@
         stateChecksums[STATE_SIM_SPECIFIC_SETTINGS] =
                 writeIfChanged(stateChecksums[STATE_SIM_SPECIFIC_SETTINGS],
                         KEY_SIM_SPECIFIC_SETTINGS_2, simSpecificSettingsData, data);
+        stateChecksums[STATE_WIFI_SETTINGS] =
+                writeIfChanged(stateChecksums[STATE_WIFI_SETTINGS],
+                        KEY_WIFI_SETTINGS_BACKUP_DATA, wifiSettingsData, data);
 
         writeNewChecksums(stateChecksums, newState);
     }
@@ -413,7 +423,13 @@
                     data.readEntityData(restoredSimSpecificSettings, 0, size);
                     restoreSimSpecificSettings(restoredSimSpecificSettings);
                     break;
-
+                case KEY_WIFI_SETTINGS_BACKUP_DATA:
+                    byte[] restoredWifiData = new byte[size];
+                    data.readEntityData(restoredWifiData, 0, size);
+                    if (!isWatch()) {
+                        restoreWifiData(restoredWifiData);
+                    }
+                    break;
                 default :
                     data.skipEntityData();
 
@@ -1346,6 +1362,45 @@
         }
     }
 
+    private static final class Mutable<E> {
+        public volatile E value;
+
+        Mutable() {
+            value = null;
+        }
+    }
+
+    private byte[] getWifiSettingsBackupData() {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final Mutable<byte[]> backupWifiData = new Mutable<byte[]>();
+
+        try {
+            mWifiManager.retrieveWifiBackupData(getBaseContext().getMainExecutor(),
+                    new Consumer<byte[]>() {
+                        @Override
+                        public void accept(byte[] value) {
+                            backupWifiData.value = value;
+                            latch.countDown();
+                        }
+                    });
+            // cts requires B&R with 10 seconds
+            if (latch.await(10, TimeUnit.SECONDS) && backupWifiData.value != null) {
+                return backupWifiData.value;
+            }
+        } catch (InterruptedException ie) {
+            Log.e(TAG, "fail to retrieveWifiBackupData, " + ie);
+        }
+        Log.e(TAG, "fail to retrieveWifiBackupData");
+        return new byte[0];
+    }
+
+    private void restoreWifiData(byte[] data) {
+        if (DEBUG_BACKUP) {
+            Log.v(TAG, "Applying restored all wifi data");
+        }
+        mWifiManager.restoreWifiBackupData(data);
+    }
+
     private void updateWindowManagerIfNeeded(Integer previousDensity) {
         int newDensity;
         try {
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index 1eb04ac..9e9350b 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -99,6 +99,7 @@
         sBroadcastOnRestore.add(Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED);
         sBroadcastOnRestore.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
         sBroadcastOnRestore.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
+        sBroadcastOnRestore.add(Settings.Secure.SCREEN_RESOLUTION_MODE);
         sBroadcastOnRestoreSystemUI = new ArraySet<String>(2);
         sBroadcastOnRestoreSystemUI.add(Settings.Secure.QS_TILES);
         sBroadcastOnRestoreSystemUI.add(Settings.Secure.QS_AUTO_ADDED_TILES);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index dba3bac..46cee6b 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -1838,6 +1838,9 @@
                 Settings.Secure.ACCESSIBILITY_FLOATING_MENU_FADE_ENABLED,
                 SecureSettingsProto.Accessibility.ACCESSIBILITY_FLOATING_MENU_FADE_ENABLED);
         dumpSetting(s, p,
+                Settings.Secure.ACCESSIBILITY_FLOATING_MENU_TARGETS,
+                SecureSettingsProto.Accessibility.ACCESSIBILITY_FLOATING_MENU_TARGETS);
+        dumpSetting(s, p,
                 Settings.Secure.ODI_CAPTIONS_VOLUME_UI_ENABLED,
                 SecureSettingsProto.Accessibility.ODI_CAPTIONS_VOLUME_UI_ENABLED);
         dumpSetting(s, p,
@@ -2109,6 +2112,12 @@
                 Settings.Secure.DOUBLE_TAP_TO_WAKE,
                 SecureSettingsProto.DOUBLE_TAP_TO_WAKE);
 
+        final long displayToken = p.start(SecureSettingsProto.DISPLAY);
+        dumpSetting(s, p,
+                Settings.Secure.SCREEN_RESOLUTION_MODE,
+                SecureSettingsProto.Display.SCREEN_RESOLUTION_MODE);
+        p.end(displayToken);
+
         final long dozeToken = p.start(SecureSettingsProto.DOZE);
         dumpSetting(s, p,
                 Settings.Secure.DOZE_ENABLED,
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
index b151a53..68167e1 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
@@ -60,16 +60,17 @@
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
-import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.PosixFileAttributes;
+import java.nio.file.attribute.PosixFilePermission;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -165,8 +166,8 @@
 
     private static final String STORAGE_MIGRATION_FLAG =
             "core_experiments_team_internal/com.android.providers.settings.storage_test_mission_1";
-    private static final String STORAGE_MIGRATION_LOG =
-            "/metadata/aconfig/flags/storage_migration.log";
+    private static final String STORAGE_MIGRATION_MARKER_FILE =
+            "/metadata/aconfig/storage_test_mission_1";
 
     /**
      * This tag is applied to all aconfig default value-loaded flags.
@@ -600,14 +601,25 @@
         }
 
         Setting oldState = mSettings.get(name);
+        String previousOwningPackage = (oldState != null) ? oldState.packageName : null;
+        // If the old state doesn't exist, no need to handle the owning package change
+        final boolean owningPackageChanged = previousOwningPackage != null
+                && !previousOwningPackage.equals(packageName);
+
         String oldValue = (oldState != null) ? oldState.value : null;
         String oldDefaultValue = (oldState != null) ? oldState.defaultValue : null;
         String newDefaultValue = makeDefault ? value : oldDefaultValue;
 
-        int newSize = getNewMemoryUsagePerPackageLocked(packageName,
-                oldValue == null ? name.length() : 0 /* deltaKeySize */,
-                oldValue, value, oldDefaultValue, newDefaultValue);
-        checkNewMemoryUsagePerPackageLocked(packageName, newSize);
+        int newSizeForCurrentPackage = getNewMemoryUsagePerPackageLocked(packageName,
+                /* deltaKeyLength= */ (oldState == null || owningPackageChanged) ? name.length() : 0,
+                /* oldValue= */ owningPackageChanged ? null : oldValue,
+                /* newValue= */ value,
+                /* oldDefaultValue= */ owningPackageChanged ? null : oldDefaultValue,
+                /* newDefaultValue = */ newDefaultValue);
+        // Only check the memory usage for the current package. Even if the owning package
+        // has changed, the previous owning package will only have a reduced memory usage, so
+        // there is no need to check its memory usage.
+        checkNewMemoryUsagePerPackageLocked(packageName, newSizeForCurrentPackage);
 
         Setting newState;
 
@@ -629,7 +641,17 @@
 
         addHistoricalOperationLocked(HISTORICAL_OPERATION_UPDATE, newState);
 
-        updateMemoryUsagePerPackageLocked(packageName, newSize);
+        updateMemoryUsagePerPackageLocked(packageName, newSizeForCurrentPackage);
+
+        if (owningPackageChanged) {
+            int newSizeForPreviousPackage = getNewMemoryUsagePerPackageLocked(previousOwningPackage,
+                    /* deltaKeyLength= */ -name.length(),
+                    /* oldValue= */ oldValue,
+                    /* newValue= */ null,
+                    /* oldDefaultValue= */ oldDefaultValue,
+                    /* newDefaultValue = */ null);
+            updateMemoryUsagePerPackageLocked(previousOwningPackage, newSizeForPreviousPackage);
+        }
 
         scheduleWriteIfNeededLocked();
 
@@ -1105,7 +1127,7 @@
                     Slog.i(LOG_TAG, "[PERSIST END]");
                 }
             } catch (Throwable t) {
-                Slog.wtf(LOG_TAG, "Failed to write settings, restoring old file", t);
+                Slog.e(LOG_TAG, "Failed to write settings, restoring old file", t);
                 if (t instanceof IOException) {
                     if (t.getMessage().contains("Couldn't create directory")) {
                         if (DEBUG) {
@@ -1446,16 +1468,29 @@
                     }
                 }
 
-                if (name != null && name.equals(STORAGE_MIGRATION_FLAG) && value.equals("true")) {
-                    File file = new File(STORAGE_MIGRATION_LOG);
-                    if (!file.exists()) {
-                        try (BufferedWriter writer =
-                                new BufferedWriter(new FileWriter(STORAGE_MIGRATION_LOG))) {
-                            final long timestamp = System.currentTimeMillis();
-                            String entry = String.format("%d | Log init", timestamp);
-                            writer.write(entry);
-                        } catch (IOException e) {
-                            Slog.e(LOG_TAG, "failed to write storage migration file", e);
+                if (isConfigSettingsKey(mKey) && name != null
+                        && name.equals(STORAGE_MIGRATION_FLAG)) {
+                    if (value.equals("true")) {
+                        Path path = Paths.get(STORAGE_MIGRATION_MARKER_FILE);
+                        if (!Files.exists(path)) {
+                            Files.createFile(path);
+                        }
+
+                        Set<PosixFilePermission> perms =
+                                Files.readAttributes(path, PosixFileAttributes.class).permissions();
+                        perms.add(PosixFilePermission.OWNER_WRITE);
+                        perms.add(PosixFilePermission.OWNER_READ);
+                        perms.add(PosixFilePermission.GROUP_READ);
+                        perms.add(PosixFilePermission.OTHERS_READ);
+                        try {
+                            Files.setPosixFilePermissions(path, perms);
+                        } catch (Exception e) {
+                            Slog.e(LOG_TAG, "failed to set permissions on migration marker", e);
+                        }
+                    } else {
+                        java.nio.file.Path path = Paths.get(STORAGE_MIGRATION_MARKER_FILE);
+                        if (Files.exists(path)) {
+                            Files.delete(path);
                         }
                     }
                 }
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/device_config_service.aconfig b/packages/SettingsProvider/src/com/android/providers/settings/device_config_service.aconfig
index c572bdb..d20fbf5 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/device_config_service.aconfig
+++ b/packages/SettingsProvider/src/com/android/providers/settings/device_config_service.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.providers.settings"
+container: "system"
 
 flag {
     name: "support_overrides"
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index 8cafe5f..c891dfc 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_TARE,
                     Settings.Global.DYNAMIC_POWER_SAVINGS_ENABLED,
                     Settings.Global.DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD,
                     Settings.Global.SMART_REPLIES_IN_NOTIFICATIONS_FLAGS,
@@ -408,7 +407,6 @@
                     Settings.Global.SHOW_PEOPLE_SPACE,
                     Settings.Global.SHOW_NEW_NOTIF_DISMISS,
                     Settings.Global.SHOW_RESTART_IN_CRASH_DIALOG,
-                    Settings.Global.SHOW_TARE_DEVELOPER_OPTIONS,
                     Settings.Global.SHOW_TEMPERATURE_WARNING,
                     Settings.Global.SHOW_USB_TEMPERATURE_ALARM,
                     Settings.Global.SIGNED_CONFIG_VERSION,
@@ -435,8 +433,6 @@
                     Settings.Global.SYS_UIDCPUPOWER,
                     Settings.Global.SYS_TRACED,
                     Settings.Global.FPS_DEVISOR,
-                    Settings.Global.TARE_ALARM_MANAGER_CONSTANTS,
-                    Settings.Global.TARE_JOB_SCHEDULER_CONSTANTS,
                     Settings.Global.TCP_DEFAULT_INIT_RWND,
                     Settings.Global.TETHER_DUN_APN,
                     Settings.Global.TETHER_DUN_REQUIRED,
@@ -844,6 +840,8 @@
                         Settings.Secure.BIOMETRIC_APP_ENABLED,
                         Settings.Secure.BIOMETRIC_KEYGUARD_ENABLED,
                         Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED,
+                        Settings.Secure.BIOMETRIC_FINGERPRINT_VIRTUAL_ENABLED,
+                        Settings.Secure.BIOMETRIC_FACE_VIRTUAL_ENABLED,
                         Settings.Secure.BLUETOOTH_ADDR_VALID,
                         Settings.Secure.BLUETOOTH_ADDRESS,
                         Settings.Secure.BLUETOOTH_NAME,
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
index e0e31d7..5db97c6 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
@@ -585,9 +585,9 @@
                 * Character.BYTES;
         assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2));
 
-        // Test system package
+        // Let system package take over testKey1 which is no longer subject to memory usage counting
         settingsState.insertSettingLocked(testKey1, testValue1, null, true, SYSTEM_PACKAGE);
-        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE));
+        assertEquals(0, settingsState.getMemoryUsage(TEST_PACKAGE));
         assertEquals(expectedMemUsage2, settingsState.getMemoryUsage(testPackage2));
         assertEquals(0, settingsState.getMemoryUsage(SYSTEM_PACKAGE));
 
@@ -599,7 +599,7 @@
         } catch (IllegalStateException ex) {
             assertTrue(ex.getMessage().contains("You are adding too many system settings"));
         }
-        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE));
+        assertEquals(0, settingsState.getMemoryUsage(TEST_PACKAGE));
 
         // Test invalid key
         try {
@@ -609,7 +609,7 @@
         } catch (IllegalStateException ex) {
             assertTrue(ex.getMessage().contains("You are adding too many system settings"));
         }
-        assertEquals(expectedMemUsage, settingsState.getMemoryUsage(TEST_PACKAGE));
+        assertEquals(0, settingsState.getMemoryUsage(TEST_PACKAGE));
     }
 
     @Test
@@ -902,4 +902,49 @@
             assertEquals("false", s.getValue());
         }
     }
+
+    @Test
+    public void testMemoryUsagePerPackage_SameSettingUsedByDifferentPackages() {
+        SettingsState settingsState =
+                new SettingsState(
+                        InstrumentationRegistry.getContext(), mLock, mSettingsFile, 1,
+                        SettingsState.MAX_BYTES_PER_APP_PACKAGE_LIMITED, Looper.getMainLooper());
+        final String testKey1 = SETTING_NAME;
+        final String testKey2 = SETTING_NAME + "_2";
+        final String testValue1 = Strings.repeat("A", 100);
+        final String testValue2 = Strings.repeat("A", 50);
+        final String package1 = "p1";
+        final String package2 = "p2";
+
+        settingsState.insertSettingLocked(testKey1, testValue1, null, false, package1);
+        settingsState.insertSettingLocked(testKey2, testValue1, null, true, package2);
+        // Package1's usage should be remain the same Package2 owns a different setting
+        int expectedMemUsageForPackage1 = (testKey1.length() + testValue1.length())
+                * Character.BYTES;
+        int expectedMemUsageForPackage2 = (testKey2.length() + testValue1.length()
+                + testValue1.length() /* size for default */) * Character.BYTES;
+        assertEquals(expectedMemUsageForPackage1, settingsState.getMemoryUsage(package1));
+        assertEquals(expectedMemUsageForPackage2, settingsState.getMemoryUsage(package2));
+
+        settingsState.insertSettingLocked(testKey1, testValue2, null, false, package2);
+        // Package1's usage should be cleared because the setting is taken over by another package
+        expectedMemUsageForPackage1 = 0;
+        assertEquals(expectedMemUsageForPackage1, settingsState.getMemoryUsage(package1));
+        // Package2 now owns two settings
+        expectedMemUsageForPackage2 = (testKey1.length() + testValue2.length()
+                + testKey2.length() + testValue1.length()
+                + testValue1.length() /* size for default */)
+                * Character.BYTES;
+        assertEquals(expectedMemUsageForPackage2, settingsState.getMemoryUsage(package2));
+
+        settingsState.insertSettingLocked(testKey1, testValue1, null, true, package1);
+        // Package1 now owns setting1
+        expectedMemUsageForPackage1 = (testKey1.length() + testValue1.length()
+                + testValue1.length() /* size for default */) * Character.BYTES;
+        assertEquals(expectedMemUsageForPackage1, settingsState.getMemoryUsage(package1));
+        // Package2 now only own setting2
+        expectedMemUsageForPackage2 = (testKey2.length() + testValue1.length()
+                + testValue1.length() /* size for default */) * Character.BYTES;
+        assertEquals(expectedMemUsageForPackage2, settingsState.getMemoryUsage(package2));
+    }
 }
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 5804071..b94e224 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -896,7 +896,6 @@
 
     <!-- Permissions required for CTS test - CtsVoiceInteractionTestCases -->
     <uses-permission android:name="android.permission.RESET_HOTWORD_TRAINING_DATA_EGRESS_COUNT" />
-    <uses-permission android:name="android.permission.RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA" />
     <uses-permission android:name="android.permission.RECEIVE_SANDBOX_TRIGGER_AUDIO" />
 
     <uses-permission android:name="android.permission.GET_BINDING_UID_IMPORTANCE" />
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 42952de..5ac0e44 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -50,7 +50,6 @@
 import android.os.Binder;
 import android.os.BugreportManager;
 import android.os.BugreportManager.BugreportCallback;
-import android.os.BugreportManager.BugreportCallback.BugreportErrorCode;
 import android.os.BugreportParams;
 import android.os.Bundle;
 import android.os.FileUtils;
@@ -169,6 +168,8 @@
     static final String EXTRA_DESCRIPTION = "android.intent.extra.DESCRIPTION";
     static final String EXTRA_ORIGINAL_INTENT = "android.intent.extra.ORIGINAL_INTENT";
     static final String EXTRA_INFO = "android.intent.extra.INFO";
+    static final String EXTRA_EXTRA_ATTACHMENT_URI =
+            "android.intent.extra.EXTRA_ATTACHMENT_URI";
 
     private static final int MSG_SERVICE_COMMAND = 1;
     private static final int MSG_DELAYED_SCREENSHOT = 2;
@@ -634,9 +635,10 @@
         long nonce = intent.getLongExtra(EXTRA_BUGREPORT_NONCE, 0);
         String baseName = getBugreportBaseName(bugreportType);
         String name = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());
+        Uri extraAttachment = intent.getParcelableExtra(EXTRA_EXTRA_ATTACHMENT_URI, Uri.class);
 
-        BugreportInfo info = new BugreportInfo(mContext, baseName, name,
-                shareTitle, shareDescription, bugreportType, mBugreportsDir, nonce);
+        BugreportInfo info = new BugreportInfo(mContext, baseName, name, shareTitle,
+                shareDescription, bugreportType, mBugreportsDir, nonce, extraAttachment);
         synchronized (mLock) {
             if (info.bugreportFile.exists()) {
                 Log.e(TAG, "Failed to start bugreport generation, the requested bugreport file "
@@ -1184,6 +1186,10 @@
             clipData.addItem(new ClipData.Item(null, null, null, screenshotUri));
             attachments.add(screenshotUri);
         }
+        if (info.extraAttachment != null) {
+            clipData.addItem(new ClipData.Item(null, null, null, info.extraAttachment));
+            attachments.add(info.extraAttachment);
+        }
         intent.setClipData(clipData);
         intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, attachments);
 
@@ -2042,6 +2048,9 @@
          */
         final long nonce;
 
+        @Nullable
+        public Uri extraAttachment = null;
+
         private final Object mLock = new Object();
 
         /**
@@ -2049,7 +2058,8 @@
          */
         BugreportInfo(Context context, String baseName, String name,
                 @Nullable String shareTitle, @Nullable String shareDescription,
-                @BugreportParams.BugreportMode int type, File bugreportsDir, long nonce) {
+                @BugreportParams.BugreportMode int type, File bugreportsDir, long nonce,
+                @Nullable Uri extraAttachment) {
             this.context = context;
             this.name = this.initialName = name;
             this.shareTitle = shareTitle == null ? "" : shareTitle;
@@ -2058,6 +2068,7 @@
             this.nonce = nonce;
             this.baseName = baseName;
             this.bugreportFile = new File(bugreportsDir, getFileName(this, ".zip"));
+            this.extraAttachment = extraAttachment;
         }
 
         void createBugreportFile() {
diff --git a/packages/SoundPicker/res/values-nl/strings.xml b/packages/SoundPicker/res/values-nl/strings.xml
index 5b6fb70..d38858c 100644
--- a/packages/SoundPicker/res/values-nl/strings.xml
+++ b/packages/SoundPicker/res/values-nl/strings.xml
@@ -18,7 +18,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="ringtone_default" msgid="798836092118824500">"Standaardbeltoon"</string>
     <string name="notification_sound_default" msgid="8133121186242636840">"Standaard meldingsgeluid"</string>
-    <string name="alarm_sound_default" msgid="4787646764557462649">"Standaard alarmgeluid"</string>
+    <string name="alarm_sound_default" msgid="4787646764557462649">"Standaard wekkergeluid"</string>
     <string name="add_ringtone_text" msgid="6642389991738337529">"Ringtone toevoegen"</string>
     <string name="add_alarm_text" msgid="3545497316166999225">"Wekker toevoegen"</string>
     <string name="add_notification_text" msgid="4431129543300614788">"Melding toevoegen"</string>
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index 617df74..40db52e 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -57,6 +57,7 @@
         "src-release/**/*.kt",
         "src-release/**/*.java",
     ],
+    visibility: ["//visibility:private"],
 }
 
 filegroup {
@@ -65,6 +66,7 @@
         "src-debug/**/*.kt",
         "src-debug/**/*.java",
     ],
+    visibility: ["//visibility:private"],
 }
 
 //Create a library to expose SystemUI's resources to other modules.
@@ -105,6 +107,7 @@
     },
     use_resource_processor: true,
     static_libs: [
+        "//frameworks/libs/systemui:compilelib",
         "SystemUI-res",
         "WifiTrackerLib",
         "WindowManager-Shell",
@@ -117,7 +120,7 @@
         "SystemUI-statsd",
         "SettingsLib",
         "com_android_systemui_flags_lib",
-        "com_android_systemui_shared_flags_lib",
+        "//frameworks/libs/systemui:com_android_systemui_shared_flags_lib",
         "androidx.core_core-ktx",
         "androidx.viewpager2_viewpager2",
         "androidx.legacy_legacy-support-v4",
@@ -145,7 +148,7 @@
         "device_state_flags_lib",
         "kotlinx_coroutines_android",
         "kotlinx_coroutines",
-        "iconloader_base",
+        "//frameworks/libs/systemui:iconloader_base",
         "SystemUI-tags",
         "SystemUI-proto",
         "monet",
@@ -156,7 +159,7 @@
         "lottie",
         "LowLightDreamLib",
         "TraceurCommon",
-        "motion_tool_lib",
+        "//frameworks/libs/systemui:motion_tool_lib",
         "notification_flags_lib",
         "PlatformComposeCore",
         "PlatformComposeSceneTransitionLayout",
@@ -188,7 +191,6 @@
         extra_check_modules: ["SystemUILintChecker"],
         warning_checks: ["MissingApacheLicenseDetector"],
     },
-    skip_jarjar_repackage: true,
 }
 
 filegroup {
@@ -198,12 +200,29 @@
 }
 
 filegroup {
+    name: "kosmos-src",
+    srcs: ["tests/utils/kosmos/src/**/*.kt"],
+    path: "tests/utils/kosmos",
+}
+
+java_library {
+    name: "kosmos",
+    host_supported: true,
+    srcs: [":kosmos-src"],
+    static_libs: [
+        "kotlin-reflect",
+        "kotlin-stdlib",
+    ],
+}
+
+filegroup {
     name: "SystemUI-tests-utils",
     srcs: [
         "tests/utils/src/**/*.java",
         "tests/utils/src/**/*.kt",
+        ":kosmos-src",
     ],
-    path: "tests/utils/src",
+    path: "tests/utils",
 }
 
 filegroup {
@@ -233,6 +252,9 @@
     resource_dirs: [
         "tests/res",
     ],
+    asset_dirs: [
+        "tests/goldens",
+    ],
     static_libs: [
         "SystemUI-res",
         "WifiTrackerLib",
@@ -244,7 +266,7 @@
         "SystemUI-statsd",
         "SettingsLib",
         "com_android_systemui_flags_lib",
-        "com_android_systemui_shared_flags_lib",
+        "//frameworks/libs/systemui:com_android_systemui_shared_flags_lib",
         "flag-junit-base",
         "platform-parametric-runner-lib",
         "androidx.viewpager2_viewpager2",
@@ -274,7 +296,7 @@
         "kotlinx-coroutines-core",
         "kotlinx_coroutines_test",
         "kotlin-reflect",
-        "iconloader_base",
+        "//frameworks/libs/systemui:iconloader_base",
         "SystemUI-tags",
         "SystemUI-proto",
         "metrics-helper-lib",
@@ -288,8 +310,8 @@
         "jsr330",
         "WindowManager-Shell",
         "LowLightDreamLib",
-        "motion_tool_lib",
-        "androidx.core_core-animation-testing-nodeps",
+        "//frameworks/libs/systemui:motion_tool_lib",
+        "androidx.core_core-animation-testing",
         "androidx.compose.ui_ui",
         "flag-junit",
         "ravenwood-junit",
@@ -304,7 +326,6 @@
         "androidx.compose.animation_animation-graphics",
         "TraceurCommon",
     ],
-    skip_jarjar_repackage: true,
 }
 
 android_library {
@@ -326,15 +347,20 @@
         "compose/facade/enabled/src/**/*.kt",
     ],
     static_libs: [
+        "//frameworks/libs/systemui:compilelib",
         "SystemUI-tests-base",
         "androidx.test.uiautomator_uiautomator",
         "androidx.core_core-animation-testing",
         "mockito-target-extended-minus-junit4",
+        "mockito-kotlin2",
         "androidx.test.ext.junit",
         "androidx.test.ext.truth",
         "kotlin-test",
+        "platform-screenshot-diff-core",
+        "PlatformMotionTesting",
         "SystemUICustomizationTestUtils",
         "androidx.compose.runtime_runtime",
+        "kosmos",
     ],
     libs: [
         "android.test.runner",
@@ -355,7 +381,6 @@
         test: true,
         extra_check_modules: ["SystemUILintChecker"],
     },
-    skip_jarjar_repackage: true,
 }
 
 android_app {
@@ -377,6 +402,7 @@
         "compose/facade/enabled/src/**/*.kt",
     ],
     static_libs: [
+        "//frameworks/libs/systemui:compilelib",
         "SystemUI-tests-base",
         "androidx.compose.runtime_runtime",
     ],
@@ -418,6 +444,7 @@
         "inline-mockito-robolectric-prebuilt",
         "platform-parametric-runner-lib",
         "SystemUICustomizationTestUtils",
+        "kosmos",
     ],
     libs: [
         "android.test.runner",
@@ -451,6 +478,7 @@
         "androidx.test.uiautomator_uiautomator",
         "androidx.core_core-animation-testing",
         "androidx.test.ext.junit",
+        "kosmos",
     ],
     libs: [
         "android.test.runner",
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index e346e72..bbc9fe4 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -1059,6 +1059,13 @@
             </intent-filter>
         </receiver>
 
+        <receiver android:name=".accessibility.hearingaid.HearingDevicesDialogReceiver"
+            android:exported="false">
+            <intent-filter android:priority="1">
+                <action android:name="com.android.systemui.action.LAUNCH_HEARING_DEVICES_DIALOG" />
+            </intent-filter>
+        </receiver>
+
         <activity android:name=".logcat.LogAccessDialogActivity"
                   android:theme="@android:style/Theme.Translucent.NoTitleBar"
                   android:excludeFromRecents="true"
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/AndroidManifest.xml b/packages/SystemUI/accessibility/accessibilitymenu/AndroidManifest.xml
index 648cc3b..a98625f 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/AndroidManifest.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/AndroidManifest.xml
@@ -40,7 +40,7 @@
             android:exported="true"
             android:label="@string/accessibility_menu_settings_name"
             android:launchMode="singleTop"
-            android:theme="@style/Theme.SettingsBase">
+            android:theme="@style/SettingsTheme">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
 
@@ -59,4 +59,4 @@
             <action android:name="android.intent.action.VOICE_COMMAND" />
         </intent>
     </queries>
-</manifest>
\ No newline at end of file
+</manifest>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/aconfig/Android.bp b/packages/SystemUI/accessibility/accessibilitymenu/aconfig/Android.bp
index f74e59a..0ff856e 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/aconfig/Android.bp
+++ b/packages/SystemUI/accessibility/accessibilitymenu/aconfig/Android.bp
@@ -5,6 +5,7 @@
 aconfig_declarations {
     name: "com_android_a11y_menu_flags",
     package: "com.android.systemui.accessibility.accessibilitymenu",
+    container: "system",
     srcs: [
         "accessibility.aconfig",
     ],
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/aconfig/accessibility.aconfig b/packages/SystemUI/accessibility/accessibilitymenu/aconfig/accessibility.aconfig
index f5db6a4..d868d5c 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/aconfig/accessibility.aconfig
+++ b/packages/SystemUI/accessibility/accessibilitymenu/aconfig/accessibility.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.systemui.accessibility.accessibilitymenu"
+container: "system"
 
 # NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
 
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml
index c29002b..2647498 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Ponuka dostupnosti"</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Ponuka Dostupnosť"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Ponukou dostupnosti sa rozumie veľká ponuka na obrazovke, pomocou ktorej môžete ovládať zariadenie. Môžete ho uzamknúť, ovládať hlasitosť a jas, vytvárať snímky obrazovky a mnoho ďalšieho."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Asistent"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Asistent"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sv/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sv/strings.xml
index c02bbb2..fa43e4f 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sv/strings.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sv/strings.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Till- gänglighetsmeny"</string>
+    <string name="accessibility_menu_service_name" msgid="730136711554740131">"Tillgänglighetsmeny"</string>
     <string name="accessibility_menu_intro" msgid="3164193281544042394">"Tillgänglighetsmenyn är en stor meny på skärmen som du kan styra enheten med. Du kan låsa enheten, ställa in volym och ljusstyrka, ta skärmbilder och annat."</string>
     <string name="assistant_label" msgid="6796392082252272356">"Assistent"</string>
     <string name="assistant_utterance" msgid="65509599221141377">"Assistent"</string>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values/styles.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values/styles.xml
index 4169155..a138fa9 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values/styles.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values/styles.xml
@@ -21,6 +21,11 @@
     <item name="android:colorControlNormal">@color/colorControlNormal</item>
   </style>
 
+  <style name="SettingsTheme" parent="Theme.SettingsBase">
+    <!-- Quick fix so that the preference page doesn't render under its parent header. -->
+    <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
+  </style>
+
   <!--The basic theme for service and test case only-->
   <style name="A11yMenuBaseTheme" parent="android:Theme.DeviceDefault.Light">
     <item name="android:windowActionBar">false</item>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
index 4dd029c..f5baae2 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
@@ -375,6 +375,10 @@
         unregisterReceiver(mToggleMenuReceiver);
         mPrefs.unregisterOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener);
         sInitialized = false;
+        if (mA11yMenuLayout != null) {
+            mA11yMenuLayout.clearLayout();
+            mA11yMenuLayout = null;
+        }
         return super.onUnbind(intent);
     }
 
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
index edd6a48..1be04f8 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
@@ -151,6 +151,14 @@
         return mLayout;
     }
 
+    public void clearLayout() {
+        if (mLayout != null) {
+            mWindowManager.removeView(mLayout);
+            mLayout.setOnTouchListener(null);
+            mLayout = null;
+        }
+    }
+
     /** Updates view layout with new layout parameters only. */
     public void updateViewLayout() {
         if (mLayout == null || mLayoutParameter == null) {
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/tests/src/com/android/systemui/accessibility/accessibilitymenu/tests/AccessibilityMenuServiceTest.java b/packages/SystemUI/accessibility/accessibilitymenu/tests/src/com/android/systemui/accessibility/accessibilitymenu/tests/AccessibilityMenuServiceTest.java
index f70ad9e..0ab99fa 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/tests/src/com/android/systemui/accessibility/accessibilitymenu/tests/AccessibilityMenuServiceTest.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/tests/src/com/android/systemui/accessibility/accessibilitymenu/tests/AccessibilityMenuServiceTest.java
@@ -30,8 +30,6 @@
 import static com.android.systemui.accessibility.accessibilitymenu.AccessibilityMenuService.INTENT_TOGGLE_MENU;
 import static com.android.systemui.accessibility.accessibilitymenu.AccessibilityMenuService.PACKAGE_NAME;
 
-import static com.google.common.truth.Truth.assertThat;
-
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.Instrumentation;
 import android.app.KeyguardManager;
@@ -62,6 +60,7 @@
 import org.junit.Assume;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -448,10 +447,15 @@
         closeScreen();
         wakeUpScreen();
 
-        assertThat(isMenuVisible()).isFalse();
+        TestUtils.waitUntil("Menu did not close.",
+                TIMEOUT_UI_CHANGE_S,
+                () -> !isMenuVisible()
+        );
     }
 
     @Test
+    @Ignore("Test failure in pre/postsubmit cannot be replicated on local devices. "
+            + "Coverage is low-impact.")
     public void testOnScreenLock_cannotOpenMenu() throws Throwable {
         closeScreen();
         wakeUpScreen();
diff --git a/packages/SystemUI/aconfig/Android.bp b/packages/SystemUI/aconfig/Android.bp
index 76cb6bd..1858c80 100644
--- a/packages/SystemUI/aconfig/Android.bp
+++ b/packages/SystemUI/aconfig/Android.bp
@@ -25,6 +25,8 @@
         "//visibility:override",
         "//frameworks/base/packages/SystemUI:__subpackages__",
         "//frameworks/libs/systemui/tracinglib:__subpackages__",
+        "//frameworks/base/services/accessibility:__subpackages__",
+        "//frameworks/base/services/tests:__subpackages__",
         "//platform_testing:__subpackages__",
         "//vendor:__subpackages__",
         "//cts:__subpackages__",
@@ -34,6 +36,7 @@
 aconfig_declarations {
     name: "com_android_systemui_flags",
     package: "com.android.systemui",
+    container: "system",
     srcs: [
         "*.aconfig",
     ],
@@ -42,4 +45,5 @@
 java_aconfig_library {
     name: "com_android_systemui_flags_lib",
     aconfig_declarations: "com_android_systemui_flags",
+    sdk_version: "system_current",
 }
diff --git a/packages/SystemUI/aconfig/accessibility.aconfig b/packages/SystemUI/aconfig/accessibility.aconfig
index 866aa89..8137e40 100644
--- a/packages/SystemUI/aconfig/accessibility.aconfig
+++ b/packages/SystemUI/aconfig/accessibility.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.systemui"
+container: "system"
 
 # NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
 
diff --git a/packages/SystemUI/aconfig/biometrics_framework.aconfig b/packages/SystemUI/aconfig/biometrics_framework.aconfig
index 7cc0c83..bd1a442 100644
--- a/packages/SystemUI/aconfig/biometrics_framework.aconfig
+++ b/packages/SystemUI/aconfig/biometrics_framework.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.systemui"
+container: "system"
 
 # NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
 
@@ -14,4 +15,4 @@
     namespace: "biometrics_framework"
     description: "Refactors Biometric Prompt to use a ConstraintLayout"
     bug: "288175072"
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/aconfig/communal.aconfig b/packages/SystemUI/aconfig/communal.aconfig
index 2c6ff97..2e9af7e 100644
--- a/packages/SystemUI/aconfig/communal.aconfig
+++ b/packages/SystemUI/aconfig/communal.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.systemui"
+container: "system"
 
 flag {
     name: "communal_hub"
diff --git a/packages/SystemUI/aconfig/cross_device_control.aconfig b/packages/SystemUI/aconfig/cross_device_control.aconfig
index d3f14c1..5f9a4f4 100644
--- a/packages/SystemUI/aconfig/cross_device_control.aconfig
+++ b/packages/SystemUI/aconfig/cross_device_control.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.systemui"
+container: "system"
 
 flag {
     name: "legacy_le_audio_sharing"
diff --git a/packages/SystemUI/aconfig/predictive_back.aconfig b/packages/SystemUI/aconfig/predictive_back.aconfig
index 7bbe82c..46eb9e1 100644
--- a/packages/SystemUI/aconfig/predictive_back.aconfig
+++ b/packages/SystemUI/aconfig/predictive_back.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.systemui"
+container: "system"
 
 flag {
     name: "predictive_back_sysui"
@@ -26,4 +27,4 @@
     namespace: "systemui"
     description: "Enable Predictive Back Animation for SysUI dialogs"
     bug: "327721544"
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index f057acc..fd2fa07 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.systemui"
+container: "system"
 
 flag {
     name: "example_flag"
@@ -25,6 +26,21 @@
 }
 
 flag {
+   name: "refactor_keyguard_dismiss_intent"
+   namespace: "systemui"
+   description: "Update how keyguard dismiss intents are stored."
+   bug: "275069969"
+}
+
+flag {
+
+    name: "notification_heads_up_cycling"
+    namespace: "systemui"
+    description: "Heads-up notification cycling animation for the Notification Avalanche feature."
+    bug: "316404716"
+}
+
+flag {
    name: "notification_minimalism_prototype"
    namespace: "systemui"
    description: "Prototype of notification minimalism; the new 'Intermediate' lockscreen customization proposal."
@@ -132,6 +148,16 @@
 }
 
 flag {
+   name: "pss_app_selector_recents_split_screen"
+   namespace: "systemui"
+   description: "Allows recent apps selected for partial screenshare to be launched in split screen mode"
+   bug: "320449039"
+   metadata {
+        purpose: PURPOSE_BUGFIX
+   }
+}
+
+flag {
     name: "notifications_background_icons"
     namespace: "systemui"
     description: "Moves part of the notification icon updates to the background."
@@ -255,6 +281,13 @@
 }
 
 flag {
+   name: "qs_new_tiles_future"
+   namespace: "systemui"
+   description: "Use the new tiles in the Quick Settings that are still under development. This flag will not be used to gate release but to prevent tiles under development from reaching teamfood."
+   bug: "311147395"
+}
+
+flag {
     name: "coroutine_tracing"
     namespace: "systemui"
     description: "Adds thread-local data to System UI's global coroutine scopes to "
@@ -305,6 +338,16 @@
 }
 
 flag {
+    name: "status_bar_monochrome_icons_fix"
+    namespace: "systemui"
+    description: "Fixes the status bar icon size when drawing InsetDrawables (ie. monochrome icons)"
+    bug: "329091967"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
+
+flag {
     name: "compose_bouncer"
     namespace: "systemui"
     description: "Use the new compose bouncer in SystemUI"
@@ -504,13 +547,6 @@
 }
 
 flag {
-   name: "enable_contextual_tips_frequency_cap"
-   description: "Enables frequency capping for contextual tips, e.g. 1x/day, 2x/week, 3x/lifetime."
-   namespace: "systemui"
-   bug: "322891421"
-}
-
-flag {
    name: "disable_contextual_tips_frequency_check"
    description: "Disables frequency capping check for contextual tips."
    namespace: "systemui"
@@ -525,13 +561,6 @@
 }
 
 flag {
-   name: "disable_contextual_tips_first_30d_check"
-   description: "Disables condition check which only show tips within 30 days after phone setup."
-   namespace: "systemui"
-   bug: "322891421"
-}
-
-flag {
    name: "enable_contextual_tips"
    description: "Enables showing contextual tips."
    namespace: "systemui"
@@ -699,9 +728,26 @@
 }
 
 flag {
+  name: "screenshare_notification_hiding_bug_fix"
+  namespace: "systemui"
+  description: "Various bug fixes for notification redaction while screensharing"
+  bug: "312784809"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
+
+flag {
     name: "qs_ui_refactor"
     namespace: "systemui"
     description: "Enables the new QS UI pipeline that follows recommended architecture and uses"
       " Compose for the UI."
     bug: "325099249"
 }
+
+flag {
+    name: "keyboard_docking_indicator"
+    namespace: "systemui"
+    description: "Glow bar indicator reveals upon keyboard docking."
+    bug: "324600132"
+}
diff --git a/packages/SystemUI/animation/Android.bp b/packages/SystemUI/animation/Android.bp
index 2268d16..dec664f 100644
--- a/packages/SystemUI/animation/Android.bp
+++ b/packages/SystemUI/animation/Android.bp
@@ -41,13 +41,14 @@
     ],
 
     static_libs: [
-        "androidx.core_core-animation-nodeps",
+        "androidx.core_core-animation",
         "androidx.core_core-ktx",
         "androidx.annotation_annotation",
         "com_android_systemui_flags_lib",
         "SystemUIShaderLib",
         "WindowManager-Shell-shared",
-        "animationlib",
+        "//frameworks/libs/systemui:animationlib",
+        "//frameworks/libs/systemui:com_android_systemui_shared_flags_lib",
     ],
 
     manifest: "AndroidManifest.xml",
@@ -64,7 +65,7 @@
     ],
 
     static_libs: [
-        "androidx.core_core-animation-nodeps",
+        "androidx.core_core-animation",
         "androidx.core_core-ktx",
         "androidx.annotation_annotation",
     ],
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt
index ea1cb34..9ce30fd 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt
@@ -790,7 +790,7 @@
                     controller,
                     endState,
                     windowBackgroundColor,
-                    fadeOutWindowBackgroundLayer = !controller.isBelowAnimatingWindow,
+                    fadeWindowBackgroundLayer = !controller.isBelowAnimatingWindow,
                     drawHole = !controller.isBelowAnimatingWindow,
                 )
         }
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 dbdf970..b89ebfc 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogTransitionAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogTransitionAnimator.kt
@@ -711,7 +711,6 @@
         dialog.setDismissOverride(this::onDialogDismissed)
 
         if (featureFlags.isPredictiveBackQsDialogAnim) {
-            // TODO(b/265923095) Improve animations for QS dialogs on configuration change
             dialog.registerAnimationOnBackInvoked(targetView = dialogContentWithBackground)
         }
 
@@ -917,6 +916,12 @@
                         endController.transitionContainer = value
                     }
 
+                // We tell TransitionController that this is always a launch, and handle the launch
+                // vs return logic internally.
+                // TODO(b/323863002): maybe move the launch vs return logic out of this class and
+                //     delegate it to TransitionController?
+                override val isLaunching: Boolean = true
+
                 override fun createAnimatorState(): TransitionAnimator.State {
                     return startController.createAnimatorState()
                 }
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewTransitionAnimatorController.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewTransitionAnimatorController.kt
index 3f57f88..9ad0fc5 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewTransitionAnimatorController.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewTransitionAnimatorController.kt
@@ -64,6 +64,7 @@
     private var interactionJankMonitor: InteractionJankMonitor =
         InteractionJankMonitor.getInstance(),
 ) : ActivityTransitionAnimator.Controller {
+    override val isLaunching: Boolean = true
 
     /** The container to which we will add the ghost view and expanding background. */
     override var transitionContainer = ghostedView.rootView as ViewGroup
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 5e4276c..9bf6b34 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/TransitionAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/TransitionAnimator.kt
@@ -28,7 +28,9 @@
 import android.view.View
 import android.view.ViewGroup
 import android.view.animation.Interpolator
+import androidx.annotation.VisibleForTesting
 import com.android.app.animation.Interpolators.LINEAR
+import com.android.systemui.shared.Flags.returnAnimationFrameworkLibrary
 import kotlin.math.roundToInt
 
 private const val TAG = "TransitionAnimator"
@@ -70,13 +72,14 @@
     interface Controller {
         /**
          * The container in which the view that started the animation will be animating together
-         * with the opening window.
+         * with the opening or closing window.
          *
          * This will be used to:
          * - Get the associated [Context].
-         * - Compute whether we are expanding fully above the transition container.
-         * - Get to overlay to which we initially put the window background layer, until the opening
-         *   window is made visible (see [openingWindowSyncView]).
+         * - Compute whether we are expanding to or contracting from fully above the transition
+         *   container.
+         * - Get the overlay into which we put the window background layer, while the animating
+         *   window is not visible (see [openingWindowSyncView]).
          *
          * This container can be changed to force this [Controller] to animate the expanding view
          * inside a different location, for instance to ensure correct layering during the
@@ -84,12 +87,17 @@
          */
         var transitionContainer: ViewGroup
 
+        /** Whether the animation being controlled is a launch or a return. */
+        val isLaunching: Boolean
+
         /**
-         * The [View] with which the opening app window should be synchronized with once it starts
-         * to be visible.
+         * If [isLaunching], the [View] with which the opening app window should be synchronized
+         * once it starts to be visible. Otherwise, the [View] with which the closing app window
+         * should be synchronized until it stops being visible.
          *
          * We will also move the window background layer to this view's overlay once the opening
-         * window is visible.
+         * window is visible (if [isLaunching]), or from this view's overlay once the closing window
+         * stop being visible (if ![isLaunching]).
          *
          * If null, this will default to [transitionContainer].
          */
@@ -203,17 +211,56 @@
      * layer with [windowBackgroundColor] will fade in then (optionally) fade out above the
      * expanding view, and should be the same background color as the opening (or closing) window.
      *
-     * If [fadeOutWindowBackgroundLayer] is true, then this intermediary layer will fade out during
-     * the second half of the animation, and will have SRC blending mode (ultimately punching a hole
-     * in the [transition container][Controller.transitionContainer]) iff [drawHole] is true.
+     * If [fadeWindowBackgroundLayer] is true, then this intermediary layer will fade out during the
+     * second half of the animation (if [Controller.isLaunching] or fade in during the first half of
+     * the animation (if ![Controller.isLaunching]), and will have SRC blending mode (ultimately
+     * punching a hole in the [transition container][Controller.transitionContainer]) iff [drawHole]
+     * is true.
      */
     fun startAnimation(
         controller: Controller,
         endState: State,
         windowBackgroundColor: Int,
-        fadeOutWindowBackgroundLayer: Boolean = true,
+        fadeWindowBackgroundLayer: Boolean = true,
         drawHole: Boolean = false,
     ): Animation {
+        if (!controller.isLaunching) checkReturnAnimationFrameworkFlag()
+
+        // We add an extra layer with the same color as the dialog/app splash screen background
+        // color, which is usually the same color of the app background. We first fade in this layer
+        // to hide the expanding view, then we fade it out with SRC mode to draw a hole in the
+        // transition container and reveal the opening window.
+        val windowBackgroundLayer =
+            GradientDrawable().apply {
+                setColor(windowBackgroundColor)
+                alpha = 0
+            }
+
+        val animator =
+            createAnimator(
+                controller,
+                endState,
+                windowBackgroundLayer,
+                fadeWindowBackgroundLayer,
+                drawHole
+            )
+        animator.start()
+
+        return object : Animation {
+            override fun cancel() {
+                animator.cancel()
+            }
+        }
+    }
+
+    @VisibleForTesting
+    fun createAnimator(
+        controller: Controller,
+        endState: State,
+        windowBackgroundLayer: GradientDrawable,
+        fadeWindowBackgroundLayer: Boolean = true,
+        drawHole: Boolean = false
+    ): ValueAnimator {
         val state = controller.createAnimatorState()
 
         // Start state.
@@ -255,31 +302,24 @@
         val transitionContainer = controller.transitionContainer
         val isExpandingFullyAbove = isExpandingFullyAbove(transitionContainer, endState)
 
-        // We add an extra layer with the same color as the dialog/app splash screen background
-        // color, which is usually the same color of the app background. We first fade in this layer
-        // to hide the expanding view, then we fade it out with SRC mode to draw a hole in the
-        // transition container and reveal the opening window.
-        val windowBackgroundLayer =
-            GradientDrawable().apply {
-                setColor(windowBackgroundColor)
-                alpha = 0
-            }
-
         // Update state.
         val animator = ValueAnimator.ofFloat(0f, 1f)
         animator.duration = timings.totalDuration
         animator.interpolator = LINEAR
 
         // Whether we should move the [windowBackgroundLayer] into the overlay of
-        // [Controller.openingWindowSyncView] once the opening app window starts to be visible.
+        // [Controller.openingWindowSyncView] once the opening app window starts to be visible, or
+        // from it once the closing app window stops being visible.
+        // This is necessary as a one-off sync so we can avoid syncing at every frame, especially
+        // in complex interactions like launching an activity from a dialog. See
+        // b/214961273#comment2 for more details.
         val openingWindowSyncView = controller.openingWindowSyncView
         val openingWindowSyncViewOverlay = openingWindowSyncView?.overlay
-        val moveBackgroundLayerWhenAppIsVisible =
+        val moveBackgroundLayerWhenAppVisibilityChanges =
             openingWindowSyncView != null &&
                 openingWindowSyncView.viewRootImpl != controller.transitionContainer.viewRootImpl
 
         val transitionContainerOverlay = transitionContainer.overlay
-        var cancelled = false
         var movedBackgroundLayer = false
 
         animator.addListener(
@@ -293,7 +333,11 @@
                     // Add the drawable to the transition container overlay. Overlays always draw
                     // drawables after views, so we know that it will be drawn above any view added
                     // by the controller.
-                    transitionContainerOverlay.add(windowBackgroundLayer)
+                    if (controller.isLaunching || openingWindowSyncViewOverlay == null) {
+                        transitionContainerOverlay.add(windowBackgroundLayer)
+                    } else {
+                        openingWindowSyncViewOverlay.add(windowBackgroundLayer)
+                    }
                 }
 
                 override fun onAnimationEnd(animation: Animator) {
@@ -303,7 +347,7 @@
                     controller.onTransitionAnimationEnd(isExpandingFullyAbove)
                     transitionContainerOverlay.remove(windowBackgroundLayer)
 
-                    if (moveBackgroundLayerWhenAppIsVisible) {
+                    if (moveBackgroundLayerWhenAppVisibilityChanges && controller.isLaunching) {
                         openingWindowSyncViewOverlay?.remove(windowBackgroundLayer)
                     }
                 }
@@ -311,12 +355,6 @@
         )
 
         animator.addUpdateListener { animation ->
-            if (cancelled) {
-                // TODO(b/184121838): Cancel the animator directly instead of just skipping the
-                // update.
-                return@addUpdateListener
-            }
-
             maybeUpdateEndState()
 
             // TODO(b/184121838): Use reverse interpolators to get the same path/arc as the non
@@ -338,20 +376,34 @@
             state.bottomCornerRadius =
                 MathUtils.lerp(startBottomCornerRadius, endBottomCornerRadius, progress)
 
-            // The expanding view can/should be hidden once it is completely covered by the opening
-            // window.
             state.visible =
-                getProgress(
-                    timings,
-                    linearProgress,
-                    timings.contentBeforeFadeOutDelay,
-                    timings.contentBeforeFadeOutDuration
-                ) < 1
+                if (controller.isLaunching) {
+                    // The expanding view can/should be hidden once it is completely covered by the
+                    // opening window.
+                    getProgress(
+                        timings,
+                        linearProgress,
+                        timings.contentBeforeFadeOutDelay,
+                        timings.contentBeforeFadeOutDuration
+                    ) < 1
+                } else {
+                    getProgress(
+                        timings,
+                        linearProgress,
+                        timings.contentAfterFadeInDelay,
+                        timings.contentAfterFadeInDuration
+                    ) > 0
+                }
 
-            if (moveBackgroundLayerWhenAppIsVisible && !state.visible && !movedBackgroundLayer) {
-                // The expanding view is not visible, so the opening app is visible. If this is the
-                // first frame when it happens, trigger a one-off sync and move the background layer
-                // in its new container.
+            if (
+                controller.isLaunching &&
+                    moveBackgroundLayerWhenAppVisibilityChanges &&
+                    !state.visible &&
+                    !movedBackgroundLayer
+            ) {
+                // The expanding view is not visible, so the opening app is visible. If this is
+                // the first frame when it happens, trigger a one-off sync and move the
+                // background layer in its new container.
                 movedBackgroundLayer = true
 
                 transitionContainerOverlay.remove(windowBackgroundLayer)
@@ -362,6 +414,25 @@
                     openingWindowSyncView,
                     then = {}
                 )
+            } else if (
+                !controller.isLaunching &&
+                    moveBackgroundLayerWhenAppVisibilityChanges &&
+                    state.visible &&
+                    !movedBackgroundLayer
+            ) {
+                // The contracting view is now visible, so the closing app is not. If this is
+                // the first frame when it happens, trigger a one-off sync and move the
+                // background layer in its new container.
+                movedBackgroundLayer = true
+
+                openingWindowSyncViewOverlay!!.remove(windowBackgroundLayer)
+                transitionContainerOverlay.add(windowBackgroundLayer)
+
+                ViewRootSync.synchronizeNextDraw(
+                    openingWindowSyncView,
+                    transitionContainer,
+                    then = {}
+                )
             }
 
             val container =
@@ -376,19 +447,14 @@
                 state,
                 linearProgress,
                 container,
-                fadeOutWindowBackgroundLayer,
-                drawHole
+                fadeWindowBackgroundLayer,
+                drawHole,
+                controller.isLaunching
             )
             controller.onTransitionAnimationProgress(state, progress, linearProgress)
         }
 
-        animator.start()
-        return object : Animation {
-            override fun cancel() {
-                cancelled = true
-                animator.cancel()
-            }
-        }
+        return animator
     }
 
     /** Return whether we are expanding fully above the [transitionContainer]. */
@@ -405,8 +471,9 @@
         state: State,
         linearProgress: Float,
         transitionContainer: View,
-        fadeOutWindowBackgroundLayer: Boolean,
-        drawHole: Boolean
+        fadeWindowBackgroundLayer: Boolean,
+        drawHole: Boolean,
+        isLaunching: Boolean
     ) {
         // Update position.
         transitionContainer.getLocationOnScreen(transitionContainerLocation)
@@ -437,27 +504,64 @@
                 timings.contentBeforeFadeOutDelay,
                 timings.contentBeforeFadeOutDuration
             )
-        if (fadeInProgress < 1) {
-            val alpha =
-                interpolators.contentBeforeFadeOutInterpolator.getInterpolation(fadeInProgress)
-            drawable.alpha = (alpha * 0xFF).roundToInt()
-        } else if (fadeOutWindowBackgroundLayer) {
-            val fadeOutProgress =
-                getProgress(
-                    timings,
-                    linearProgress,
-                    timings.contentAfterFadeInDelay,
-                    timings.contentAfterFadeInDuration
-                )
-            val alpha =
-                1 - interpolators.contentAfterFadeInInterpolator.getInterpolation(fadeOutProgress)
-            drawable.alpha = (alpha * 0xFF).roundToInt()
 
-            if (drawHole) {
-                drawable.setXfermode(SRC_MODE)
+        if (isLaunching) {
+            if (fadeInProgress < 1) {
+                val alpha =
+                    interpolators.contentBeforeFadeOutInterpolator.getInterpolation(fadeInProgress)
+                drawable.alpha = (alpha * 0xFF).roundToInt()
+            } else if (fadeWindowBackgroundLayer) {
+                val fadeOutProgress =
+                    getProgress(
+                        timings,
+                        linearProgress,
+                        timings.contentAfterFadeInDelay,
+                        timings.contentAfterFadeInDuration
+                    )
+                val alpha =
+                    1 -
+                        interpolators.contentAfterFadeInInterpolator.getInterpolation(
+                            fadeOutProgress
+                        )
+                drawable.alpha = (alpha * 0xFF).roundToInt()
+
+                if (drawHole) {
+                    drawable.setXfermode(SRC_MODE)
+                }
+            } else {
+                drawable.alpha = 0xFF
             }
         } else {
-            drawable.alpha = 0xFF
+            if (fadeInProgress < 1 && fadeWindowBackgroundLayer) {
+                val alpha =
+                    interpolators.contentBeforeFadeOutInterpolator.getInterpolation(fadeInProgress)
+                drawable.alpha = (alpha * 0xFF).roundToInt()
+
+                if (drawHole) {
+                    drawable.setXfermode(SRC_MODE)
+                }
+            } else {
+                val fadeOutProgress =
+                    getProgress(
+                        timings,
+                        linearProgress,
+                        timings.contentAfterFadeInDelay,
+                        timings.contentAfterFadeInDuration
+                    )
+                val alpha =
+                    1 -
+                        interpolators.contentAfterFadeInInterpolator.getInterpolation(
+                            fadeOutProgress
+                        )
+                drawable.alpha = (alpha * 0xFF).roundToInt()
+                drawable.setXfermode(null)
+            }
+        }
+    }
+
+    private fun checkReturnAnimationFrameworkFlag() {
+        check(returnAnimationFrameworkLibrary()) {
+            "isLaunching cannot be false when the returnAnimationFrameworkLibrary flag is disabled"
         }
     }
 }
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpec.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpec.kt
index dd32851..4d327e1 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpec.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpec.kt
@@ -37,7 +37,7 @@
 
 /** Create a [BackAnimationSpec] from [displayMetrics] and design specs. */
 fun BackAnimationSpec.Companion.createFloatingSurfaceAnimationSpec(
-    displayMetrics: DisplayMetrics,
+    displayMetricsProvider: () -> DisplayMetrics,
     maxMarginXdp: Float,
     maxMarginYdp: Float,
     minScale: Float,
@@ -45,18 +45,19 @@
     translateYEasing: Interpolator = Interpolators.LINEAR,
     scaleEasing: Interpolator = Interpolators.STANDARD_DECELERATE,
 ): BackAnimationSpec {
-    val screenWidthPx = displayMetrics.widthPixels
-    val screenHeightPx = displayMetrics.heightPixels
-
-    val maxMarginXPx = maxMarginXdp.dpToPx(displayMetrics)
-    val maxMarginYPx = maxMarginYdp.dpToPx(displayMetrics)
-    val maxTranslationXByScale = (screenWidthPx - screenWidthPx * minScale) / 2
-    val maxTranslationX = maxTranslationXByScale - maxMarginXPx
-    val maxTranslationYByScale = (screenHeightPx - screenHeightPx * minScale) / 2
-    val maxTranslationY = maxTranslationYByScale - maxMarginYPx
-    val minScaleReversed = 1f - minScale
-
     return BackAnimationSpec { backEvent, progressY, result ->
+        val displayMetrics = displayMetricsProvider()
+        val screenWidthPx = displayMetrics.widthPixels
+        val screenHeightPx = displayMetrics.heightPixels
+
+        val maxMarginXPx = maxMarginXdp.dpToPx(displayMetrics)
+        val maxMarginYPx = maxMarginYdp.dpToPx(displayMetrics)
+        val maxTranslationXByScale = (screenWidthPx - screenWidthPx * minScale) / 2
+        val maxTranslationX = maxTranslationXByScale - maxMarginXPx
+        val maxTranslationYByScale = (screenHeightPx - screenHeightPx * minScale) / 2
+        val maxTranslationY = maxTranslationYByScale - maxMarginYPx
+        val minScaleReversed = 1f - minScale
+
         val direction = if (backEvent.swipeEdge == BackEvent.EDGE_LEFT) 1 else -1
         val progressX = backEvent.progress
 
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpecForSysUi.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpecForSysUi.kt
index c6b7073..b057296 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpecForSysUi.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpecForSysUi.kt
@@ -23,10 +23,10 @@
  * https://carbon.googleplex.com/predictive-back-for-apps/pages/st-1-dismiss-app
  */
 fun BackAnimationSpec.Companion.dismissAppForSysUi(
-    displayMetrics: DisplayMetrics,
+    displayMetricsProvider: () -> DisplayMetrics,
 ): BackAnimationSpec =
     BackAnimationSpec.createFloatingSurfaceAnimationSpec(
-        displayMetrics = displayMetrics,
+        displayMetricsProvider = displayMetricsProvider,
         maxMarginXdp = 8f,
         maxMarginYdp = 8f,
         minScale = 0.8f,
@@ -37,10 +37,10 @@
  * https://carbon.googleplex.com/predictive-back-for-apps/pages/st-2-cross-task
  */
 fun BackAnimationSpec.Companion.crossTaskForSysUi(
-    displayMetrics: DisplayMetrics,
+    displayMetricsProvider: () -> DisplayMetrics,
 ): BackAnimationSpec =
     BackAnimationSpec.createFloatingSurfaceAnimationSpec(
-        displayMetrics = displayMetrics,
+        displayMetricsProvider = displayMetricsProvider,
         maxMarginXdp = 8f,
         maxMarginYdp = 8f,
         minScale = 0.8f,
@@ -51,10 +51,10 @@
  * https://carbon.googleplex.com/predictive-back-for-apps/pages/st-3-inner-area-dismiss
  */
 fun BackAnimationSpec.Companion.innerAreaDismissForSysUi(
-    displayMetrics: DisplayMetrics,
+    displayMetricsProvider: () -> DisplayMetrics,
 ): BackAnimationSpec =
     BackAnimationSpec.createFloatingSurfaceAnimationSpec(
-        displayMetrics = displayMetrics,
+        displayMetricsProvider = displayMetricsProvider,
         maxMarginXdp = 0f,
         maxMarginYdp = 0f,
         minScale = 0.9f,
@@ -65,11 +65,11 @@
  * https://carbon.googleplex.com/predictive-back-for-apps/pages/st-4-floating-system-surfaces
  */
 fun BackAnimationSpec.Companion.floatingSystemSurfacesForSysUi(
-    displayMetrics: DisplayMetrics,
+    displayMetricsProvider: () -> DisplayMetrics,
 ): BackAnimationSpec =
     BackAnimationSpec.createFloatingSurfaceAnimationSpec(
-        displayMetrics = displayMetrics,
+        displayMetricsProvider = displayMetricsProvider,
         maxMarginXdp = 8f,
         maxMarginYdp = 8f,
-        minScale = 0.8f,
+        minScale = 0.9f,
     )
diff --git a/packages/SystemUI/animation/src/com/android/systemui/util/Dialog.kt b/packages/SystemUI/animation/src/com/android/systemui/util/Dialog.kt
index 0f63548..9dd2328 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/util/Dialog.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/util/Dialog.kt
@@ -39,7 +39,7 @@
     targetView: View,
     backAnimationSpec: BackAnimationSpec =
         BackAnimationSpec.floatingSystemSurfacesForSysUi(
-            displayMetrics = targetView.resources.displayMetrics,
+            displayMetricsProvider = { targetView.resources.displayMetrics },
         ),
 ) {
     targetView.registerOnBackInvokedCallbackOnViewAttached(
diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/ExpandableController.kt b/packages/SystemUI/compose/core/src/com/android/compose/animation/ExpandableController.kt
index 974ee3a..c7f0a96 100644
--- a/packages/SystemUI/compose/core/src/com/android/compose/animation/ExpandableController.kt
+++ b/packages/SystemUI/compose/core/src/com/android/compose/animation/ExpandableController.kt
@@ -168,6 +168,9 @@
 
             override var transitionContainer: ViewGroup = composeViewRoot.rootView as ViewGroup
 
+            // TODO(b/323863002): update to be dependant on usage.
+            override val isLaunching: Boolean = true
+
             override fun onTransitionAnimationEnd(isExpandingFullyAbove: Boolean) {
                 animatorState.value = null
             }
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 a1d8c29..bdd888f 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
@@ -8,12 +8,15 @@
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.dimensionResource
 import com.android.compose.animation.scene.Edge
 import com.android.compose.animation.scene.ElementKey
 import com.android.compose.animation.scene.FixedSizeEdgeDetector
 import com.android.compose.animation.scene.LowestZIndexScenePicker
+import com.android.compose.animation.scene.MutableSceneTransitionLayoutState
 import com.android.compose.animation.scene.SceneKey
 import com.android.compose.animation.scene.SceneScope
 import com.android.compose.animation.scene.SceneTransitionLayout
@@ -21,12 +24,13 @@
 import com.android.compose.animation.scene.SwipeDirection
 import com.android.compose.animation.scene.observableTransitionState
 import com.android.compose.animation.scene.transitions
-import com.android.compose.animation.scene.updateSceneTransitionLayoutState
 import com.android.compose.theme.LocalAndroidColorScheme
 import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.communal.ui.viewmodel.BaseCommunalViewModel
 import com.android.systemui.communal.ui.viewmodel.CommunalViewModel
 import com.android.systemui.res.R
+import com.android.systemui.scene.shared.model.SceneDataSourceDelegator
+import com.android.systemui.scene.ui.composable.SceneTransitionLayoutDataSource
 import com.android.systemui.statusbar.phone.SystemUIDialogFactory
 
 object Communal {
@@ -63,27 +67,35 @@
 fun CommunalContainer(
     modifier: Modifier = Modifier,
     viewModel: CommunalViewModel,
+    dataSourceDelegator: SceneDataSourceDelegator,
     dialogFactory: SystemUIDialogFactory,
 ) {
-    val currentScene: SceneKey by viewModel.currentScene.collectAsState(CommunalScenes.Blank)
-    val sceneTransitionLayoutState =
-        updateSceneTransitionLayoutState(
-            currentScene,
-            onChangeScene = { viewModel.onSceneChanged(it) },
+    val coroutineScope = rememberCoroutineScope()
+    val currentSceneKey: SceneKey by viewModel.currentScene.collectAsState(CommunalScenes.Blank)
+    val touchesAllowed by viewModel.touchesAllowed.collectAsState(initial = false)
+    val state: MutableSceneTransitionLayoutState = remember {
+        MutableSceneTransitionLayoutState(
+            initialScene = currentSceneKey,
             transitions = sceneTransitions,
             enableInterruptions = false,
         )
-    val touchesAllowed by viewModel.touchesAllowed.collectAsState(initial = false)
+    }
+
+    DisposableEffect(state) {
+        val dataSource = SceneTransitionLayoutDataSource(state, coroutineScope)
+        dataSourceDelegator.setDelegate(dataSource)
+        onDispose { dataSourceDelegator.setDelegate(null) }
+    }
 
     // This effect exposes the SceneTransitionLayout's observable transition state to the rest of
     // the system, and unsets it when the view is disposed to avoid a memory leak.
-    DisposableEffect(viewModel, sceneTransitionLayoutState) {
-        viewModel.setTransitionState(sceneTransitionLayoutState.observableTransitionState())
+    DisposableEffect(viewModel, state) {
+        viewModel.setTransitionState(state.observableTransitionState())
         onDispose { viewModel.setTransitionState(null) }
     }
 
     SceneTransitionLayout(
-        state = sceneTransitionLayoutState,
+        state = state,
         modifier = modifier.fillMaxSize(),
         swipeSourceDetector =
             FixedSizeEdgeDetector(
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 6a510bd..32c0313 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
@@ -17,9 +17,11 @@
 package com.android.systemui.communal.ui.compose
 
 import android.appwidget.AppWidgetHostView
+import android.content.res.Configuration
 import android.graphics.drawable.Icon
 import android.os.Bundle
 import android.util.SizeF
+import android.view.ViewGroup
 import android.widget.FrameLayout
 import androidx.compose.animation.AnimatedVisibility
 import androidx.compose.animation.core.animateFloatAsState
@@ -76,7 +78,6 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
-import androidx.compose.runtime.snapshotFlow
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
@@ -93,6 +94,7 @@
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.onSizeChanged
 import androidx.compose.ui.layout.positionInWindow
+import androidx.compose.ui.platform.LocalConfiguration
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
@@ -155,11 +157,14 @@
         derivedStateOf { selectedKey.value != null || reorderingWidgets }
     }
     var isButtonToEditWidgetsShowing by remember { mutableStateOf(false) }
+    val isEmptyState by viewModel.isEmptyState.collectAsState(initial = false)
 
     val contentPadding = gridContentPadding(viewModel.isEditMode, toolbarSize)
     val contentOffset = beforeContentPadding(contentPadding).toOffset()
 
-    ScrollOnNewSmartspaceEffect(viewModel, gridState)
+    if (!viewModel.isEditMode) {
+        ScrollOnUpdatedLiveContentEffect(communalContent, gridState)
+    }
 
     Box(
         modifier =
@@ -177,7 +182,7 @@
                         viewModel.setSelectedKey(key)
                     }
                 }
-                .thenIf(!viewModel.isEditMode) {
+                .thenIf(!viewModel.isEditMode && !isEmptyState) {
                     Modifier.pointerInput(
                             gridState,
                             contentOffset,
@@ -218,26 +223,33 @@
                         .motionEventSpy { onMotionEvent(viewModel) }
                 },
     ) {
-        CommunalHubLazyGrid(
-            communalContent = communalContent,
-            viewModel = viewModel,
-            contentPadding = contentPadding,
-            contentOffset = contentOffset,
-            setGridCoordinates = { gridCoordinates = it },
-            updateDragPositionForRemove = { offset ->
-                isDraggingToRemove =
-                    isPointerWithinCoordinates(
-                        offset = gridCoordinates?.let { it.positionInWindow() + offset },
-                        containerToCheck = removeButtonCoordinates
-                    )
-                isDraggingToRemove
-            },
-            onOpenWidgetPicker = onOpenWidgetPicker,
-            gridState = gridState,
-            contentListState = contentListState,
-            selectedKey = selectedKey,
-            widgetConfigurator = widgetConfigurator,
-        )
+        if (!viewModel.isEditMode && isEmptyState) {
+            EmptyStateCta(
+                contentPadding = contentPadding,
+                viewModel = viewModel,
+            )
+        } else {
+            CommunalHubLazyGrid(
+                communalContent = communalContent,
+                viewModel = viewModel,
+                contentPadding = contentPadding,
+                contentOffset = contentOffset,
+                setGridCoordinates = { gridCoordinates = it },
+                updateDragPositionForRemove = { offset ->
+                    isDraggingToRemove =
+                        isPointerWithinCoordinates(
+                            offset = gridCoordinates?.let { it.positionInWindow() + offset },
+                            containerToCheck = removeButtonCoordinates
+                        )
+                    isDraggingToRemove
+                },
+                onOpenWidgetPicker = onOpenWidgetPicker,
+                gridState = gridState,
+                contentListState = contentListState,
+                selectedKey = selectedKey,
+                widgetConfigurator = widgetConfigurator,
+            )
+        }
 
         // TODO(b/326060686): Remove this once keyguard indication area can persist over hub
         if (viewModel is CommunalViewModel) {
@@ -331,31 +343,33 @@
     viewModel.signalUserInteraction()
 }
 
+/**
+ * Observes communal content and scrolls to any added or updated live content, e.g. a new media
+ * session is started, or a paused timer is resumed.
+ */
 @Composable
-private fun ScrollOnNewSmartspaceEffect(
-    viewModel: BaseCommunalViewModel,
-    gridState: LazyGridState
+private fun ScrollOnUpdatedLiveContentEffect(
+    communalContent: List<CommunalContentModel>,
+    gridState: LazyGridState,
 ) {
-    val communalContent by viewModel.communalContent.collectAsState(initial = emptyList())
-    var smartspaceCount by remember { mutableStateOf(0) }
+    val coroutineScope = rememberCoroutineScope()
+    val liveContentKeys = remember { mutableListOf<String>() }
 
     LaunchedEffect(communalContent) {
-        snapshotFlow { gridState.firstVisibleItemIndex }
-            .collect { index ->
-                val existingSmartspaceCount = smartspaceCount
-                smartspaceCount = communalContent.count { it.isSmartspace() }
-                val firstIndex = communalContent.indexOfFirst { it.isSmartspace() }
+        val prevLiveContentKeys = liveContentKeys.toList()
+        liveContentKeys.clear()
+        liveContentKeys.addAll(communalContent.filter { it.isLiveContent() }.map { it.key })
 
-                // Scroll to the beginning of the smartspace area whenever the number of
-                // smartspace elements grows
-                if (
-                    existingSmartspaceCount < smartspaceCount &&
-                        !viewModel.isEditMode &&
-                        index > firstIndex
-                ) {
-                    gridState.animateScrollToItem(firstIndex)
-                }
-            }
+        // Find the first updated content
+        val indexOfFirstUpdatedContent =
+            liveContentKeys.indexOfFirst { !prevLiveContentKeys.contains(it) }
+
+        // Scroll if current position is behind the first updated content
+        if (indexOfFirstUpdatedContent in 0 until gridState.firstVisibleItemIndex) {
+            // Launching with a scope to prevent the job from being canceled in the case of a
+            // recomposition during scrolling
+            coroutineScope.launch { gridState.animateScrollToItem(indexOfFirstUpdatedContent) }
+        }
     }
 }
 
@@ -457,6 +471,67 @@
     }
 }
 
+/**
+ * The empty state displays a fullscreen call-to-action (CTA) tile when no widgets are available.
+ */
+@Composable
+private fun EmptyStateCta(
+    contentPadding: PaddingValues,
+    viewModel: BaseCommunalViewModel,
+) {
+    val colors = LocalAndroidColorScheme.current
+    Card(
+        modifier = Modifier.height(Dimensions.GridHeight).padding(contentPadding),
+        colors = CardDefaults.cardColors(containerColor = Color.Transparent),
+        border = BorderStroke(3.dp, colors.secondary),
+        shape = RoundedCornerShape(size = 80.dp)
+    ) {
+        Column(
+            modifier = Modifier.fillMaxSize().padding(horizontal = 110.dp),
+            verticalArrangement =
+                Arrangement.spacedBy(Dimensions.Spacing, Alignment.CenterVertically),
+            horizontalAlignment = Alignment.CenterHorizontally,
+        ) {
+            Text(
+                text = stringResource(R.string.title_for_empty_state_cta),
+                style = MaterialTheme.typography.displaySmall,
+                textAlign = TextAlign.Center,
+                color = colors.secondary,
+            )
+            Row(
+                modifier = Modifier.fillMaxWidth(),
+                horizontalArrangement = Arrangement.Center,
+            ) {
+                Button(
+                    modifier = Modifier.height(56.dp),
+                    colors =
+                        ButtonDefaults.buttonColors(
+                            containerColor = colors.primary,
+                            contentColor = colors.onPrimary,
+                        ),
+                    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)
+                    )
+                    Spacer(Modifier.width(ButtonDefaults.IconSpacing))
+                    Text(
+                        text = stringResource(R.string.label_for_button_in_empty_state_cta),
+                        style = MaterialTheme.typography.titleSmall,
+                    )
+                }
+            }
+        }
+    }
+}
+
 @Composable
 private fun LockStateIcon(
     isUnlocked: Boolean,
@@ -511,7 +586,7 @@
         horizontalArrangement = Arrangement.SpaceBetween,
         verticalAlignment = Alignment.CenterVertically
     ) {
-        val spacerModifier = Modifier.width(Dimensions.ToolbarButtonSpaceBetween)
+        val spacerModifier = Modifier.width(ButtonDefaults.IconSpacing)
         Button(
             onClick = onOpenWidgetPicker,
             colors = filledButtonColors(),
@@ -666,8 +741,6 @@
         is CommunalContentModel.WidgetContent.DisabledWidget ->
             DisabledWidgetPlaceholder(model, viewModel, modifier)
         is CommunalContentModel.CtaTileInViewMode -> CtaTileInViewModeContent(viewModel, modifier)
-        is CommunalContentModel.CtaTileInEditMode ->
-            CtaTileInEditModeContent(modifier, onOpenWidgetPicker)
         is CommunalContentModel.Smartspace -> SmartspaceContent(model, modifier)
         is CommunalContentModel.Tutorial -> TutorialContent(modifier)
         is CommunalContentModel.Umo -> Umo(viewModel, modifier)
@@ -753,45 +826,6 @@
     }
 }
 
-/** Presents a CTA tile at the end of the hub in edit mode, to add more widgets. */
-@Composable
-private fun CtaTileInEditModeContent(
-    modifier: Modifier = Modifier,
-    onOpenWidgetPicker: (() -> Unit)? = null,
-) {
-    if (onOpenWidgetPicker == null) {
-        throw IllegalArgumentException("onOpenWidgetPicker should not be null.")
-    }
-    val colors = LocalAndroidColorScheme.current
-    Card(
-        modifier = modifier,
-        colors = CardDefaults.cardColors(containerColor = Color.Transparent),
-        border = BorderStroke(1.dp, colors.primary),
-        shape = RoundedCornerShape(200.dp),
-        onClick = onOpenWidgetPicker,
-    ) {
-        Column(
-            modifier = Modifier.fillMaxSize(),
-            verticalArrangement =
-                Arrangement.spacedBy(Dimensions.Spacing, Alignment.CenterVertically),
-            horizontalAlignment = Alignment.CenterHorizontally,
-        ) {
-            Icon(
-                imageVector = Icons.Outlined.Widgets,
-                contentDescription = stringResource(R.string.cta_label_to_open_widget_picker),
-                tint = colors.primary,
-                modifier = Modifier.size(Dimensions.IconSize),
-            )
-            Text(
-                text = stringResource(R.string.cta_label_to_open_widget_picker),
-                style = MaterialTheme.typography.titleLarge,
-                color = colors.primary,
-                textAlign = TextAlign.Center,
-            )
-        }
-    }
-}
-
 @Composable
 private fun WidgetContent(
     viewModel: BaseCommunalViewModel,
@@ -801,6 +835,13 @@
     widgetConfigurator: WidgetConfigurator?,
     modifier: Modifier = Modifier,
 ) {
+    var widgetId: Int by remember { mutableStateOf(-1) }
+    var configuration: Configuration? by remember { mutableStateOf(null) }
+
+    // In addition to returning the current configuration, this also causes a recompose on
+    // configuration change.
+    val currentConfiguration = LocalConfiguration.current
+
     Box(
         modifier =
             modifier.thenIf(!viewModel.isEditMode && model.inQuietMode) {
@@ -816,18 +857,48 @@
         AndroidView(
             modifier = Modifier.fillMaxSize().allowGestures(allowed = !viewModel.isEditMode),
             factory = { context ->
-                model.appWidgetHost
-                    .createViewForCommunal(context, model.appWidgetId, model.providerInfo)
-                    .apply {
-                        updateAppWidgetSize(Bundle.EMPTY, listOf(size))
-                        // Remove the extra padding applied to AppWidgetHostView to allow widgets to
-                        // occupy the entire box.
-                        setPadding(0)
-                    }
+                // This FrameLayout becomes the container view for the AppWidgetHostView we add as a
+                // child in update below. Having a container view allows for updating the contained
+                // host view as needed (e.g. on configuration changes).
+                FrameLayout(context).apply {
+                    layoutParams =
+                        ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.MATCH_PARENT,
+                            ViewGroup.LayoutParams.MATCH_PARENT
+                        )
+                    setPadding(0)
+                }
+            },
+            update = { widgetContainer: ViewGroup ->
+                if (widgetId == model.appWidgetId && currentConfiguration.equals(configuration)) {
+                    return@AndroidView
+                }
+
+                // Add the widget's host view to the FrameLayout parent (after removing any
+                // previously added host view).
+                widgetContainer.removeAllViews()
+                widgetContainer.addView(
+                    model.appWidgetHost
+                        .createViewForCommunal(
+                            widgetContainer.context,
+                            model.appWidgetId,
+                            model.providerInfo
+                        )
+                        .apply {
+                            updateAppWidgetSize(Bundle.EMPTY, listOf(size))
+                            // Remove the extra padding applied to AppWidgetHostView to allow
+                            // widgets to occupy the entire box.
+                            setPadding(0)
+                        }
+                )
+
+                widgetId = model.appWidgetId
+                configuration = currentConfiguration
             },
             // For reusing composition in lazy lists.
             onReset = {},
         )
+
         if (
             viewModel is CommunalEditModeViewModel &&
                 model.reconfigurable &&
@@ -1042,7 +1113,6 @@
     val ToolbarPaddingHorizontal = 16.dp
     val ToolbarButtonPaddingHorizontal = 24.dp
     val ToolbarButtonPaddingVertical = 16.dp
-    val ToolbarButtonSpaceBetween = 8.dp
     val ButtonPadding =
         PaddingValues(
             vertical = ToolbarButtonPaddingVertical,
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 1adb335..e7bfee3 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
@@ -34,10 +34,12 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.input.pointer.pointerInteropFilter
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.toOffset
 import androidx.compose.ui.unit.toSize
@@ -235,6 +237,7 @@
 }
 
 /** Wrap LazyGrid item with additional modifier needed for drag and drop. */
+@OptIn(ExperimentalComposeUiApi::class)
 @ExperimentalFoundationApi
 @Composable
 fun LazyGridItemScope.DraggableItem(
@@ -269,7 +272,11 @@
     Box(modifier) {
         Box(draggingModifier) { content(dragging) }
         AnimatedVisibility(
-            modifier = Modifier.matchParentSize(),
+            modifier =
+                Modifier.matchParentSize()
+                    // Do not consume motion events in the highlighted item and pass them down to
+                    // the content.
+                    .pointerInteropFilter { false },
             visible = (dragging || selected) && !dragDropState.isDraggingToRemove,
             enter = fadeIn(),
             exit = fadeOut()
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 1178cc8..4bef9ef 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
@@ -16,7 +16,6 @@
 
 package com.android.systemui.keyguard.ui.composable
 
-import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.collectAsState
@@ -24,9 +23,7 @@
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalView
-import com.android.compose.animation.scene.SceneKey
-import com.android.compose.animation.scene.SceneTransitionLayout
-import com.android.compose.animation.scene.transitions
+import com.android.compose.animation.scene.SceneScope
 import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
 import com.android.systemui.keyguard.ui.composable.blueprint.ComposableLockscreenSceneBlueprint
 import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel
@@ -45,16 +42,12 @@
     private val blueprints: Set<@JvmSuppressWildcards ComposableLockscreenSceneBlueprint>,
     private val clockInteractor: KeyguardClockInteractor,
 ) {
-
-    private val sceneKeyByBlueprint: Map<ComposableLockscreenSceneBlueprint, SceneKey> by lazy {
-        blueprints.associateWith { blueprint -> SceneKey(blueprint.id) }
-    }
-    private val sceneKeyByBlueprintId: Map<String, SceneKey> by lazy {
-        sceneKeyByBlueprint.entries.associate { (blueprint, sceneKey) -> blueprint.id to sceneKey }
+    private val blueprintByBlueprintId: Map<String, ComposableLockscreenSceneBlueprint> by lazy {
+        blueprints.associateBy { it.id }
     }
 
     @Composable
-    fun Content(
+    fun SceneScope.Content(
         modifier: Modifier = Modifier,
     ) {
         val coroutineScope = rememberCoroutineScope()
@@ -66,19 +59,7 @@
             onDispose { clockInteractor.clockEventController.unregisterListeners() }
         }
 
-        // Switch smoothly between blueprints, any composable tagged with element() will be
-        // transition-animated between any two blueprints, if they both display the same element.
-        SceneTransitionLayout(
-            currentScene = checkNotNull(sceneKeyByBlueprintId[blueprintId]),
-            onChangeScene = {},
-            transitions =
-                transitions { sceneKeyByBlueprintId.values.forEach { sceneKey -> to(sceneKey) } },
-            modifier = modifier,
-            enableInterruptions = false,
-        ) {
-            sceneKeyByBlueprint.entries.forEach { (blueprint, sceneKey) ->
-                scene(sceneKey) { with(blueprint) { Content(Modifier.fillMaxSize()) } }
-            }
-        }
+        val blueprint = blueprintByBlueprintId[blueprintId] ?: return
+        with(blueprint) { Content(modifier) }
     }
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt
index 7acb4d5..c241f9c 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt
@@ -66,9 +66,5 @@
         key = QuickSettings.SharedValues.TilesSquishiness,
     )
 
-    lockscreenContent
-        .get()
-        .Content(
-            modifier = modifier.fillMaxSize(),
-        )
+    with(lockscreenContent.get()) { Content(modifier = modifier.fillMaxSize()) }
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/BurnInState.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/BurnInState.kt
index 7a73c58..8129e41 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/BurnInState.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/BurnInState.kt
@@ -71,7 +71,6 @@
 
     return remember(clock, topInset, topmostTop) {
         BurnInParameters(
-            clockControllerProvider = { clock },
             topInset = topInset,
             minViewY = topmostTop,
         )
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ClockTransition.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ClockTransition.kt
index a12f099..acd9e3d 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ClockTransition.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ClockTransition.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.keyguard.ui.composable.blueprint
 
+import androidx.compose.animation.core.LinearEasing
 import androidx.compose.animation.core.tween
 import com.android.compose.animation.scene.ElementKey
 import com.android.compose.animation.scene.SceneKey
@@ -39,7 +40,7 @@
             transitioningToSmallClock()
         }
         from(ClockScenes.splitShadeLargeClockScene, to = ClockScenes.largeClockScene) {
-            spec = tween(1000)
+            spec = tween(1000, easing = LinearEasing)
         }
     }
 
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt
index 320c455..28e92aa 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt
@@ -16,10 +16,15 @@
 
 package com.android.systemui.keyguard.ui.composable.blueprint
 
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.unit.IntRect
@@ -28,6 +33,7 @@
 import com.android.systemui.keyguard.ui.composable.section.AmbientIndicationSection
 import com.android.systemui.keyguard.ui.composable.section.BottomAreaSection
 import com.android.systemui.keyguard.ui.composable.section.LockSection
+import com.android.systemui.keyguard.ui.composable.section.NotificationSection
 import com.android.systemui.keyguard.ui.composable.section.SettingsMenuSection
 import com.android.systemui.keyguard.ui.composable.section.StatusBarSection
 import com.android.systemui.keyguard.ui.composable.section.TopAreaSection
@@ -52,6 +58,7 @@
     private val bottomAreaSection: BottomAreaSection,
     private val settingsMenuSection: SettingsMenuSection,
     private val topAreaSection: TopAreaSection,
+    private val notificationSection: NotificationSection,
 ) : ComposableLockscreenSceneBlueprint {
 
     override val id: String = "default"
@@ -59,6 +66,8 @@
     @Composable
     override fun SceneScope.Content(modifier: Modifier) {
         val isUdfpsVisible = viewModel.isUdfpsVisible
+        val shouldUseSplitNotificationShade by
+            viewModel.shouldUseSplitNotificationShade.collectAsState()
 
         LockscreenLongPress(
             viewModel = viewModel.longPress,
@@ -68,10 +77,32 @@
                 content = {
                     // Constrained to above the lock icon.
                     Column(
-                        modifier = Modifier.fillMaxWidth(),
+                        modifier = Modifier.fillMaxSize(),
                     ) {
                         with(statusBarSection) { StatusBar(modifier = Modifier.fillMaxWidth()) }
-                        with(topAreaSection) { DefaultClockLayoutWithNotifications() }
+
+                        Box {
+                            with(topAreaSection) { DefaultClockLayout() }
+                            if (shouldUseSplitNotificationShade) {
+                                with(notificationSection) {
+                                    Notifications(
+                                        burnInParams = null,
+                                        modifier =
+                                            Modifier.fillMaxWidth(0.5f)
+                                                .fillMaxHeight()
+                                                .align(alignment = Alignment.TopEnd)
+                                    )
+                                }
+                            }
+                        }
+                        if (!shouldUseSplitNotificationShade) {
+                            with(notificationSection) {
+                                Notifications(
+                                    burnInParams = null,
+                                    modifier = Modifier.weight(weight = 1f)
+                                )
+                            }
+                        }
                         if (!isUdfpsVisible && ambientIndicationSectionOptional.isPresent) {
                             with(ambientIndicationSectionOptional.get()) {
                                 AmbientIndication(modifier = Modifier.fillMaxWidth())
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ShortcutsBesideUdfpsBlueprint.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ShortcutsBesideUdfpsBlueprint.kt
index 64c2cb3..b8f00dc 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ShortcutsBesideUdfpsBlueprint.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ShortcutsBesideUdfpsBlueprint.kt
@@ -16,10 +16,15 @@
 
 package com.android.systemui.keyguard.ui.composable.blueprint
 
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.unit.IntRect
@@ -28,6 +33,7 @@
 import com.android.systemui.keyguard.ui.composable.section.AmbientIndicationSection
 import com.android.systemui.keyguard.ui.composable.section.BottomAreaSection
 import com.android.systemui.keyguard.ui.composable.section.LockSection
+import com.android.systemui.keyguard.ui.composable.section.NotificationSection
 import com.android.systemui.keyguard.ui.composable.section.SettingsMenuSection
 import com.android.systemui.keyguard.ui.composable.section.StatusBarSection
 import com.android.systemui.keyguard.ui.composable.section.TopAreaSection
@@ -52,6 +58,7 @@
     private val bottomAreaSection: BottomAreaSection,
     private val settingsMenuSection: SettingsMenuSection,
     private val topAreaSection: TopAreaSection,
+    private val notificationSection: NotificationSection,
 ) : ComposableLockscreenSceneBlueprint {
 
     override val id: String = "shortcuts-besides-udfps"
@@ -59,6 +66,8 @@
     @Composable
     override fun SceneScope.Content(modifier: Modifier) {
         val isUdfpsVisible = viewModel.isUdfpsVisible
+        val shouldUseSplitNotificationShade by
+            viewModel.shouldUseSplitNotificationShade.collectAsState()
 
         LockscreenLongPress(
             viewModel = viewModel.longPress,
@@ -68,11 +77,32 @@
                 content = {
                     // Constrained to above the lock icon.
                     Column(
-                        modifier = Modifier.fillMaxWidth(),
+                        modifier = Modifier.fillMaxSize(),
                     ) {
                         with(statusBarSection) { StatusBar(modifier = Modifier.fillMaxWidth()) }
-                        with(topAreaSection) { DefaultClockLayoutWithNotifications() }
 
+                        Box {
+                            with(topAreaSection) { DefaultClockLayout() }
+                            if (shouldUseSplitNotificationShade) {
+                                with(notificationSection) {
+                                    Notifications(
+                                        burnInParams = null,
+                                        modifier =
+                                            Modifier.fillMaxWidth(0.5f)
+                                                .fillMaxHeight()
+                                                .align(alignment = Alignment.TopEnd)
+                                    )
+                                }
+                            }
+                        }
+                        if (!shouldUseSplitNotificationShade) {
+                            with(notificationSection) {
+                                Notifications(
+                                    burnInParams = null,
+                                    modifier = Modifier.weight(weight = 1f)
+                                )
+                            }
+                        }
                         if (!isUdfpsVisible && ambientIndicationSectionOptional.isPresent) {
                             with(ambientIndicationSectionOptional.get()) {
                                 AmbientIndication(modifier = Modifier.fillMaxWidth())
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/WeatherClockBlueprint.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/WeatherClockBlueprint.kt
index fe774a0..cba5453 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/WeatherClockBlueprint.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/WeatherClockBlueprint.kt
@@ -86,6 +86,7 @@
         val burnIn = rememberBurnIn(clockInteractor)
         val resources = LocalContext.current.resources
         val currentClockState = clockViewModel.currentClock.collectAsState()
+        val areNotificationsVisible by viewModel.areNotificationsVisible.collectAsState()
         LockscreenLongPress(
             viewModel = viewModel.longPress,
             modifier = modifier,
@@ -145,9 +146,10 @@
 
                         with(mediaCarouselSection) { MediaCarousel() }
 
-                        if (viewModel.areNotificationsVisible) {
+                        if (areNotificationsVisible) {
                             with(notificationSection) {
                                 Notifications(
+                                    burnInParams = burnIn.parameters,
                                     modifier = Modifier.fillMaxWidth().weight(weight = 1f)
                                 )
                             }
@@ -374,6 +376,7 @@
                                         )
                                     }
                                 Notifications(
+                                    burnInParams = burnIn.parameters,
                                     modifier =
                                         Modifier.fillMaxHeight()
                                             .weight(weight = 1f)
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/BottomAreaSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/BottomAreaSection.kt
index 97d5b41..467dbca 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/BottomAreaSection.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/BottomAreaSection.kt
@@ -32,6 +32,7 @@
 import com.android.compose.animation.scene.ElementKey
 import com.android.compose.animation.scene.SceneScope
 import com.android.systemui.animation.view.LaunchableImageView
+import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.keyguard.ui.binder.KeyguardIndicationAreaBinder
 import com.android.systemui.keyguard.ui.binder.KeyguardQuickAffordanceViewBinder
 import com.android.systemui.keyguard.ui.view.KeyguardIndicationArea
@@ -43,6 +44,7 @@
 import com.android.systemui.statusbar.KeyguardIndicationController
 import com.android.systemui.statusbar.VibratorHelper
 import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.DisposableHandle
 import kotlinx.coroutines.flow.Flow
 
@@ -54,6 +56,7 @@
     private val vibratorHelper: VibratorHelper,
     private val indicationController: KeyguardIndicationController,
     private val indicationAreaViewModel: KeyguardIndicationAreaViewModel,
+    @Main private val mainImmediateDispatcher: CoroutineDispatcher,
 ) {
     /**
      * Renders a single lockscreen shortcut.
@@ -161,6 +164,7 @@
                         transitionAlpha,
                         falsingManager,
                         vibratorHelper,
+                        mainImmediateDispatcher,
                     ) {
                         indicationController.showTransientIndication(it)
                     }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt
index 2781f39..eb389e6 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.keyguard.ui.composable.section
 
+import android.content.res.Resources
 import android.view.View
 import android.view.ViewGroup
 import android.widget.FrameLayout
@@ -23,6 +24,7 @@
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
@@ -32,10 +34,11 @@
 import androidx.core.view.contains
 import com.android.compose.animation.scene.SceneScope
 import com.android.compose.modifiers.padding
-import com.android.systemui.customization.R as customizationR
 import com.android.systemui.customization.R
 import com.android.systemui.keyguard.ui.composable.blueprint.ClockElementKeys.largeClockElementKey
 import com.android.systemui.keyguard.ui.composable.blueprint.ClockElementKeys.smallClockElementKey
+import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.largeClockScene
+import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.splitShadeLargeClockScene
 import com.android.systemui.keyguard.ui.composable.modifier.burnInAware
 import com.android.systemui.keyguard.ui.composable.modifier.onTopPlacementChanged
 import com.android.systemui.keyguard.ui.viewmodel.AodBurnInViewModel
@@ -61,32 +64,25 @@
             return
         }
         val context = LocalContext.current
-        MovableElement(key = smallClockElementKey, modifier = modifier) {
-            content {
-                AndroidView(
-                    factory = { context ->
-                        FrameLayout(context).apply {
-                            ensureClockViewExists(checkNotNull(currentClock).smallClock.view)
-                        }
-                    },
-                    update = {
-                        it.ensureClockViewExists(checkNotNull(currentClock).smallClock.view)
-                    },
-                    modifier =
-                        Modifier.height(dimensionResource(R.dimen.small_clock_height))
-                            .padding(
-                                horizontal =
-                                    dimensionResource(customizationR.dimen.clock_padding_start)
-                            )
-                            .padding(top = { viewModel.getSmallClockTopMargin(context) })
-                            .onTopPlacementChanged(onTopChanged)
-                            .burnInAware(
-                                viewModel = aodBurnInViewModel,
-                                params = burnInParams,
-                            ),
-                )
-            }
-        }
+        AndroidView(
+            factory = { context ->
+                FrameLayout(context).apply {
+                    ensureClockViewExists(checkNotNull(currentClock).smallClock.view)
+                }
+            },
+            update = { it.ensureClockViewExists(checkNotNull(currentClock).smallClock.view) },
+            modifier =
+                modifier
+                    .height(dimensionResource(R.dimen.small_clock_height))
+                    .padding(horizontal = dimensionResource(R.dimen.clock_padding_start))
+                    .padding(top = { viewModel.getSmallClockTopMargin(context) })
+                    .onTopPlacementChanged(onTopChanged)
+                    .burnInAware(
+                        viewModel = aodBurnInViewModel,
+                        params = burnInParams,
+                    )
+                    .element(smallClockElementKey),
+        )
     }
 
     @Composable
@@ -95,6 +91,36 @@
         if (currentClock?.largeClock?.view == null) {
             return
         }
+
+        // Centering animation for clocks that have custom position animations.
+        LaunchedEffect(layoutState.currentTransition?.progress) {
+            val transition = layoutState.currentTransition ?: return@LaunchedEffect
+            if (currentClock?.largeClock?.config?.hasCustomPositionUpdatedAnimation != true) {
+                return@LaunchedEffect
+            }
+
+            // If we are not doing the centering animation, do not animate.
+            val progress =
+                if (transition.isTransitioningBetween(largeClockScene, splitShadeLargeClockScene)) {
+                    transition.progress
+                } else {
+                    1f
+                }
+
+            val distance =
+                if (transition.toScene == splitShadeLargeClockScene) {
+                        -getClockCenteringDistance()
+                    } else {
+                        getClockCenteringDistance()
+                    }
+                    .toFloat()
+            val largeClock = checkNotNull(currentClock).largeClock
+            largeClock.animations.onPositionUpdated(
+                distance = distance,
+                fraction = progress,
+            )
+        }
+
         MovableElement(key = largeClockElementKey, modifier = modifier) {
             content {
                 AndroidView(
@@ -120,4 +146,8 @@
         (clockView.parent as? ViewGroup)?.removeView(clockView)
         addView(clockView)
     }
+
+    fun getClockCenteringDistance(): Float {
+        return Resources.getSystem().displayMetrics.widthPixels / 4f
+    }
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/LockSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/LockSection.kt
index 9f02201..48684a0 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/LockSection.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/LockSection.kt
@@ -34,6 +34,7 @@
 import com.android.keyguard.LockIconViewController
 import com.android.systemui.biometrics.AuthController
 import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
 import com.android.systemui.flags.FeatureFlagsClassic
 import com.android.systemui.flags.Flags
@@ -50,12 +51,14 @@
 import com.android.systemui.statusbar.VibratorHelper
 import dagger.Lazy
 import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 
 class LockSection
 @Inject
 constructor(
     @Application private val applicationScope: CoroutineScope,
+    @Main private val mainImmediateDispatcher: CoroutineDispatcher,
     private val windowManager: WindowManager,
     private val authController: AuthController,
     private val featureFlags: FeatureFlagsClassic,
@@ -93,6 +96,7 @@
                                 deviceEntryBackgroundViewModel.get(),
                                 falsingManager.get(),
                                 vibratorHelper.get(),
+                                mainImmediateDispatcher,
                             )
                         }
                     } else {
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt
index 6b86a48..f48fa88 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt
@@ -17,12 +17,28 @@
 package com.android.systemui.keyguard.ui.composable.section
 
 import android.view.ViewGroup
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
+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 com.android.compose.animation.scene.SceneScope
+import com.android.compose.modifiers.thenIf
+import com.android.systemui.Flags
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.keyguard.MigrateClocksToBlueprint
-import com.android.systemui.notifications.ui.composable.NotificationStack
+import com.android.systemui.keyguard.ui.composable.modifier.burnInAware
+import com.android.systemui.keyguard.ui.viewmodel.AodBurnInViewModel
+import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters
+import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel
+import com.android.systemui.notifications.ui.composable.ConstrainedNotificationStack
+import com.android.systemui.res.R
+import com.android.systemui.shade.LargeScreenHeaderHelper
 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
 import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
 import com.android.systemui.statusbar.notification.stack.ui.viewbinder.SharedNotificationContainerBinder
@@ -35,10 +51,12 @@
 @Inject
 constructor(
     private val viewModel: NotificationsPlaceholderViewModel,
+    private val aodBurnInViewModel: AodBurnInViewModel,
     sharedNotificationContainer: SharedNotificationContainer,
     sharedNotificationContainerViewModel: SharedNotificationContainerViewModel,
     stackScrollLayout: NotificationStackScrollLayout,
     sharedNotificationContainerBinder: SharedNotificationContainerBinder,
+    private val lockscreenContentViewModel: LockscreenContentViewModel,
 ) {
 
     init {
@@ -63,11 +81,45 @@
         )
     }
 
+    /**
+     * @param burnInParams params to make this view adaptive to burn-in, `null` to disable burn-in
+     *   adjustment
+     */
     @Composable
-    fun SceneScope.Notifications(modifier: Modifier = Modifier) {
-        NotificationStack(
+    fun SceneScope.Notifications(burnInParams: BurnInParameters?, modifier: Modifier = Modifier) {
+        val shouldUseSplitNotificationShade by
+            lockscreenContentViewModel.shouldUseSplitNotificationShade.collectAsState()
+        val areNotificationsVisible by
+            lockscreenContentViewModel.areNotificationsVisible.collectAsState()
+        val splitShadeTopMargin: Dp =
+            if (Flags.centralizedStatusBarHeightFix()) {
+                LargeScreenHeaderHelper.getLargeScreenHeaderHeight(LocalContext.current).dp
+            } else {
+                dimensionResource(id = R.dimen.large_screen_shade_header_height)
+            }
+
+        if (!areNotificationsVisible) {
+            return
+        }
+
+        ConstrainedNotificationStack(
             viewModel = viewModel,
-            modifier = modifier,
+            modifier =
+                modifier
+                    .fillMaxWidth()
+                    .thenIf(shouldUseSplitNotificationShade) {
+                        Modifier.padding(top = splitShadeTopMargin)
+                    }
+                    .let {
+                        if (burnInParams == null) {
+                            it
+                        } else {
+                            it.burnInAware(
+                                viewModel = aodBurnInViewModel,
+                                params = burnInParams,
+                            )
+                        }
+                    },
         )
     }
 }
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 d72d5ca..f8e6341 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
@@ -17,25 +17,20 @@
 package com.android.systemui.keyguard.ui.composable.section
 
 import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
-import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-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.unit.IntOffset
+import com.android.compose.animation.scene.SceneScope
 import com.android.compose.animation.scene.SceneTransitionLayout
-import com.android.systemui.Flags
+import com.android.compose.modifiers.thenIf
 import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
-import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes
 import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.largeClockScene
 import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.smallClockScene
 import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.splitShadeLargeClockScene
@@ -43,8 +38,6 @@
 import com.android.systemui.keyguard.ui.composable.blueprint.ClockTransition
 import com.android.systemui.keyguard.ui.composable.blueprint.rememberBurnIn
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
-import com.android.systemui.res.R
-import com.android.systemui.shade.LargeScreenHeaderHelper
 import javax.inject.Inject
 
 class TopAreaSection
@@ -53,16 +46,16 @@
     private val clockViewModel: KeyguardClockViewModel,
     private val smartSpaceSection: SmartSpaceSection,
     private val mediaCarouselSection: MediaCarouselSection,
-    private val notificationSection: NotificationSection,
     private val clockSection: DefaultClockSection,
     private val clockInteractor: KeyguardClockInteractor,
 ) {
     @Composable
-    fun DefaultClockLayoutWithNotifications(
+    fun DefaultClockLayout(
         modifier: Modifier = Modifier,
     ) {
-        val isLargeClockVisible by clockViewModel.isLargeClockVisible.collectAsState()
         val currentClockLayout by clockViewModel.currentClockLayout.collectAsState()
+        val hasCustomPositionUpdatedAnimation by
+            clockViewModel.hasCustomPositionUpdatedAnimation.collectAsState()
         val currentScene =
             when (currentClockLayout) {
                 KeyguardClockViewModel.ClockLayout.SPLIT_SHADE_LARGE_CLOCK ->
@@ -73,123 +66,83 @@
                 KeyguardClockViewModel.ClockLayout.SMALL_CLOCK -> smallClockScene
             }
 
-        val splitShadeTopMargin: Dp =
-            if (Flags.centralizedStatusBarHeightFix()) {
-                LargeScreenHeaderHelper.getLargeScreenHeaderHeight(LocalContext.current).dp
-            } else {
-                dimensionResource(id = R.dimen.large_screen_shade_header_height)
+        SceneTransitionLayout(
+            modifier = modifier,
+            currentScene = currentScene,
+            onChangeScene = {},
+            transitions = ClockTransition.defaultClockTransitions,
+            enableInterruptions = false,
+        ) {
+            scene(splitShadeLargeClockScene) {
+                LargeClockWithSmartSpace(
+                    shouldOffSetClockToOneHalf = !hasCustomPositionUpdatedAnimation
+                )
             }
+
+            scene(splitShadeSmallClockScene) {
+                SmallClockWithSmartSpace(modifier = Modifier.fillMaxWidth(0.5f))
+            }
+
+            scene(smallClockScene) { SmallClockWithSmartSpace() }
+
+            scene(largeClockScene) { LargeClockWithSmartSpace() }
+        }
+    }
+
+    @Composable
+    private fun SceneScope.SmallClockWithSmartSpace(modifier: Modifier = Modifier) {
         val burnIn = rememberBurnIn(clockInteractor)
 
+        Column(modifier = modifier) {
+            with(clockSection) {
+                SmallClock(
+                    burnInParams = burnIn.parameters,
+                    onTopChanged = burnIn.onSmallClockTopChanged,
+                    modifier = Modifier.wrapContentSize()
+                )
+            }
+            with(smartSpaceSection) {
+                SmartSpace(
+                    burnInParams = burnIn.parameters,
+                    onTopChanged = burnIn.onSmartspaceTopChanged,
+                )
+            }
+            with(mediaCarouselSection) { MediaCarousel() }
+        }
+    }
+
+    @Composable
+    private fun SceneScope.LargeClockWithSmartSpace(shouldOffSetClockToOneHalf: Boolean = false) {
+        val burnIn = rememberBurnIn(clockInteractor)
+        val isLargeClockVisible by clockViewModel.isLargeClockVisible.collectAsState()
+
         LaunchedEffect(isLargeClockVisible) {
             if (isLargeClockVisible) {
                 burnIn.onSmallClockTopChanged(null)
             }
         }
 
-        SceneTransitionLayout(
-            modifier = modifier.fillMaxSize(),
-            currentScene = currentScene,
-            onChangeScene = {},
-            transitions = ClockTransition.defaultClockTransitions,
-            enableInterruptions = false,
-        ) {
-            scene(ClockScenes.splitShadeLargeClockScene) {
-                Row(
-                    modifier = Modifier.fillMaxSize(),
-                ) {
-                    Column(
-                        modifier = Modifier.fillMaxHeight().weight(weight = 1f),
-                        horizontalAlignment = Alignment.CenterHorizontally,
-                    ) {
-                        with(smartSpaceSection) {
-                            SmartSpace(
-                                burnInParams = burnIn.parameters,
-                                onTopChanged = burnIn.onSmartspaceTopChanged,
-                            )
-                        }
-                        with(clockSection) { LargeClock(modifier = Modifier.fillMaxWidth()) }
-                    }
-                    with(notificationSection) {
-                        Notifications(
-                            modifier =
-                                Modifier.fillMaxHeight()
-                                    .weight(weight = 1f)
-                                    .padding(top = splitShadeTopMargin)
-                        )
-                    }
-                }
+        Column {
+            with(smartSpaceSection) {
+                SmartSpace(
+                    burnInParams = burnIn.parameters,
+                    onTopChanged = burnIn.onSmartspaceTopChanged,
+                )
             }
-
-            scene(ClockScenes.splitShadeSmallClockScene) {
-                Row(
-                    modifier = Modifier.fillMaxSize(),
-                ) {
-                    Column(
-                        modifier = Modifier.fillMaxHeight().weight(weight = 1f),
-                        horizontalAlignment = Alignment.CenterHorizontally,
-                    ) {
-                        with(clockSection) {
-                            SmallClock(
-                                burnInParams = burnIn.parameters,
-                                onTopChanged = burnIn.onSmallClockTopChanged,
-                                modifier = Modifier.fillMaxWidth()
-                            )
+            with(clockSection) {
+                LargeClock(
+                    modifier =
+                        Modifier.fillMaxSize().thenIf(shouldOffSetClockToOneHalf) {
+                            // If we do not have a custom position animation, we want
+                            // the clock to be on one half of the screen.
+                            Modifier.offset {
+                                IntOffset(
+                                    x = -clockSection.getClockCenteringDistance().toInt(),
+                                    y = 0,
+                                )
+                            }
                         }
-                        with(smartSpaceSection) {
-                            SmartSpace(
-                                burnInParams = burnIn.parameters,
-                                onTopChanged = burnIn.onSmartspaceTopChanged,
-                            )
-                        }
-                        with(mediaCarouselSection) { MediaCarousel() }
-                    }
-                    with(notificationSection) {
-                        Notifications(
-                            modifier =
-                                Modifier.fillMaxHeight()
-                                    .weight(weight = 1f)
-                                    .padding(top = splitShadeTopMargin)
-                        )
-                    }
-                }
-            }
-
-            scene(ClockScenes.smallClockScene) {
-                Column {
-                    with(clockSection) {
-                        SmallClock(
-                            burnInParams = burnIn.parameters,
-                            onTopChanged = burnIn.onSmallClockTopChanged,
-                            modifier = Modifier.fillMaxWidth()
-                        )
-                    }
-                    with(smartSpaceSection) {
-                        SmartSpace(
-                            burnInParams = burnIn.parameters,
-                            onTopChanged = burnIn.onSmartspaceTopChanged,
-                        )
-                    }
-                    with(mediaCarouselSection) { MediaCarousel() }
-                    with(notificationSection) {
-                        Notifications(
-                            modifier =
-                                androidx.compose.ui.Modifier.fillMaxWidth().weight(weight = 1f)
-                        )
-                    }
-                }
-            }
-
-            scene(ClockScenes.largeClockScene) {
-                Column {
-                    with(smartSpaceSection) {
-                        SmartSpace(
-                            burnInParams = burnIn.parameters,
-                            onTopChanged = burnIn.onSmartspaceTopChanged,
-                        )
-                    }
-                    with(clockSection) { LargeClock(modifier = Modifier.fillMaxWidth()) }
-                }
+                )
             }
         }
     }
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 9ba5e3b..579e837 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
@@ -36,12 +36,14 @@
 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
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 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
@@ -60,7 +62,6 @@
 import androidx.compose.ui.res.dimensionResource
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntOffset
-import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.util.lerp
 import com.android.compose.animation.scene.ElementKey
@@ -68,20 +69,21 @@
 import com.android.compose.animation.scene.SceneScope
 import com.android.compose.modifiers.height
 import com.android.systemui.common.ui.compose.windowinsets.LocalScreenCornerRadius
-import com.android.systemui.notifications.ui.composable.Notifications.Form
 import com.android.systemui.notifications.ui.composable.Notifications.TransitionThresholds.EXPANSION_FOR_MAX_CORNER_RADIUS
 import com.android.systemui.notifications.ui.composable.Notifications.TransitionThresholds.EXPANSION_FOR_MAX_SCRIM_ALPHA
 import com.android.systemui.res.R
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.shade.ui.composable.ShadeHeader
-import com.android.systemui.statusbar.notification.stack.shared.model.StackRounding
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimRounding
 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
 import kotlin.math.roundToInt
 
 object Notifications {
     object Elements {
         val NotificationScrim = ElementKey("NotificationScrim")
-        val NotificationPlaceholder = ElementKey("NotificationPlaceholder")
+        val NotificationStackPlaceholder = ElementKey("NotificationStackPlaceholder")
+        val HeadsUpNotificationPlaceholder = ElementKey("HeadsUpNotificationPlaceholder")
         val ShelfSpace = ElementKey("ShelfSpace")
     }
 
@@ -91,12 +93,6 @@
         const val EXPANSION_FOR_MAX_CORNER_RADIUS = 0.1f
         const val EXPANSION_FOR_MAX_SCRIM_ALPHA = 0.3f
     }
-
-    enum class Form {
-        HunFromTop,
-        Stack,
-        HunFromBottom,
-    }
 }
 
 /**
@@ -109,24 +105,48 @@
     modifier: Modifier = Modifier,
     isPeekFromBottom: Boolean = false,
 ) {
-    NotificationPlaceholder(
-        viewModel = viewModel,
-        form = if (isPeekFromBottom) Form.HunFromBottom else Form.HunFromTop,
-        modifier = modifier,
-    )
+    val headsUpHeight = viewModel.headsUpHeight.collectAsState()
+
+    Element(
+        Notifications.Elements.HeadsUpNotificationPlaceholder,
+        modifier =
+            modifier
+                .height { headsUpHeight.value.roundToInt() }
+                .fillMaxWidth()
+                .debugBackground(viewModel, DEBUG_HUN_COLOR)
+                .onGloballyPositioned { coordinates: LayoutCoordinates ->
+                    val boundsInWindow = coordinates.boundsInWindow()
+                    debugLog(viewModel) {
+                        "HUNS onGloballyPositioned:" +
+                            " size=${coordinates.size}" +
+                            " bounds=$boundsInWindow"
+                    }
+                    viewModel.onHeadsUpTopChanged(boundsInWindow.top)
+                }
+    ) {
+        content {}
+    }
 }
 
 /** Adds the space where notification stack should appear in the scene. */
 @Composable
-fun SceneScope.NotificationStack(
+fun SceneScope.ConstrainedNotificationStack(
     viewModel: NotificationsPlaceholderViewModel,
     modifier: Modifier = Modifier,
 ) {
-    NotificationPlaceholder(
-        viewModel = viewModel,
-        form = Form.Stack,
-        modifier = modifier,
-    )
+    Box(
+        modifier =
+            modifier.onSizeChanged { viewModel.onConstrainedAvailableSpaceChanged(it.height) }
+    ) {
+        NotificationPlaceholder(
+            viewModel = viewModel,
+            modifier = Modifier.fillMaxSize(),
+        )
+        HeadsUpNotificationSpace(
+            viewModel = viewModel,
+            modifier = Modifier.align(Alignment.TopCenter),
+        )
+    }
 }
 
 /**
@@ -157,9 +177,9 @@
                 .toPx()
         } + navBarHeight
 
-    val contentHeight = viewModel.intrinsicContentHeight.collectAsState()
+    val stackHeight = viewModel.stackHeight.collectAsState()
 
-    val stackRounding = viewModel.stackRounding.collectAsState(StackRounding())
+    val scrimRounding = viewModel.shadeScrimRounding.collectAsState(ShadeScrimRounding())
 
     // the offset for the notifications scrim. Its upper bound is 0, and its lower bound is
     // calculated in minScrimOffset. The scrim is the same height as the screen minus the
@@ -169,6 +189,9 @@
     // entire height of the scrim is visible on screen.
     val scrimOffset = remember { mutableStateOf(0f) }
 
+    // set the bounds to null when the scrim disappears
+    DisposableEffect(Unit) { onDispose { viewModel.onScrimBoundsChanged(null) } }
+
     val minScrimTop = with(density) { ShadeHeader.Dimensions.CollapsedHeight.toPx() }
 
     // The minimum offset for the scrim. The scrim is considered fully expanded when it
@@ -186,8 +209,8 @@
 
     // if contentHeight drops below minimum visible scrim height while scrim is
     // expanded, reset scrim offset.
-    LaunchedEffect(contentHeight, scrimOffset) {
-        snapshotFlow { contentHeight.value < minVisibleScrimHeight() && scrimOffset.value < 0f }
+    LaunchedEffect(stackHeight, scrimOffset) {
+        snapshotFlow { stackHeight.value < minVisibleScrimHeight() && scrimOffset.value < 0f }
             .collect { shouldCollapse -> if (shouldCollapse) scrimOffset.value = 0f }
     }
 
@@ -232,9 +255,25 @@
                                 { expansionFraction },
                                 layoutState.isTransitioningBetween(Scenes.Gone, Scenes.Shade)
                             )
-                            .let { stackRounding.value.toRoundedCornerShape(it) }
+                            .let { scrimRounding.value.toRoundedCornerShape(it) }
                     clip = true
                 }
+                .onGloballyPositioned { coordinates ->
+                    val boundsInWindow = coordinates.boundsInWindow()
+                    debugLog(viewModel) {
+                        "SCRIM onGloballyPositioned:" +
+                            " size=${coordinates.size}" +
+                            " bounds=$boundsInWindow"
+                    }
+                    viewModel.onScrimBoundsChanged(
+                        ShadeScrimBounds(
+                            left = boundsInWindow.left,
+                            top = boundsInWindow.top,
+                            right = boundsInWindow.right,
+                            bottom = boundsInWindow.bottom,
+                        )
+                    )
+                }
     ) {
         // Creates a cutout in the background scrim in the shape of the notifications scrim.
         // Only visible when notif scrim alpha < 1, during shade expansion.
@@ -254,11 +293,10 @@
                             } else 1f
                     }
                     .background(MaterialTheme.colorScheme.surface)
-                    .debugBackground(viewModel, Color(0.5f, 0.5f, 0f, 0.2f))
+                    .debugBackground(viewModel, DEBUG_BOX_COLOR)
         ) {
             NotificationPlaceholder(
                 viewModel = viewModel,
-                form = Form.Stack,
                 modifier =
                     Modifier.verticalNestedScrollToScene(
                             topBehavior = NestedScrollBehavior.EdgeWithPreview,
@@ -274,16 +312,17 @@
                                     onScrimOffsetChanged = { scrimOffset.value = it },
                                     minScrimOffset = minScrimOffset,
                                     maxScrimOffset = 0f,
-                                    contentHeight = { contentHeight.value },
+                                    contentHeight = { stackHeight.value },
                                     minVisibleScrimHeight = minVisibleScrimHeight,
                                 )
                             }
                         )
                         .verticalScroll(scrollState)
                         .fillMaxWidth()
-                        .height { (contentHeight.value + navBarHeight).roundToInt() },
+                        .height { (stackHeight.value + navBarHeight).roundToInt() },
             )
         }
+        HeadsUpNotificationSpace(viewModel = viewModel)
     }
 }
 
@@ -304,14 +343,10 @@
         modifier
             .element(key = Notifications.Elements.ShelfSpace)
             .fillMaxWidth()
-            .onSizeChanged { size: IntSize ->
-                debugLog(viewModel) { "SHELF onSizeChanged: size=$size" }
-            }
             .onPlaced { coordinates: LayoutCoordinates ->
                 debugLog(viewModel) {
                     ("SHELF onPlaced:" +
                         " size=${coordinates.size}" +
-                        " position=${coordinates.positionInWindow()}" +
                         " bounds=${coordinates.boundsInWindow()}")
                 }
             }
@@ -326,32 +361,26 @@
 @Composable
 private fun SceneScope.NotificationPlaceholder(
     viewModel: NotificationsPlaceholderViewModel,
-    form: Form,
     modifier: Modifier = Modifier,
 ) {
-    val elementKey = Notifications.Elements.NotificationPlaceholder
     Element(
-        elementKey,
+        Notifications.Elements.NotificationStackPlaceholder,
         modifier =
             modifier
-                .debugBackground(viewModel)
-                .onSizeChanged { size: IntSize ->
-                    debugLog(viewModel) { "STACK onSizeChanged: size=$size" }
-                }
+                .debugBackground(viewModel, DEBUG_STACK_COLOR)
+                .onSizeChanged { size -> debugLog(viewModel) { "STACK onSizeChanged: size=$size" } }
                 .onGloballyPositioned { coordinates: LayoutCoordinates ->
-                    viewModel.onContentTopChanged(coordinates.positionInWindow().y)
+                    val positionInWindow = coordinates.positionInWindow()
                     debugLog(viewModel) {
                         "STACK onGloballyPositioned:" +
                             " size=${coordinates.size}" +
-                            " position=${coordinates.positionInWindow()}" +
+                            " position=$positionInWindow" +
                             " bounds=${coordinates.boundsInWindow()}"
                     }
-                    val boundsInWindow = coordinates.boundsInWindow()
-                    viewModel.onBoundsChanged(
-                        left = boundsInWindow.left,
-                        top = boundsInWindow.top,
-                        right = boundsInWindow.right,
-                        bottom = boundsInWindow.bottom,
+                    // NOTE: positionInWindow.y scrolls off screen, but boundsInWindow.top will not
+                    viewModel.onStackBoundsChanged(
+                        top = positionInWindow.y,
+                        bottom = positionInWindow.y + coordinates.size.height,
                     )
                 }
     ) {
@@ -388,7 +417,7 @@
 
 private fun Modifier.debugBackground(
     viewModel: NotificationsPlaceholderViewModel,
-    color: Color = DEBUG_COLOR,
+    color: Color,
 ): Modifier =
     if (viewModel.isVisualDebuggingEnabled) {
         background(color)
@@ -396,9 +425,9 @@
         this
     }
 
-fun StackRounding.toRoundedCornerShape(radius: Dp): RoundedCornerShape {
-    val topRadius = if (roundTop) radius else 0.dp
-    val bottomRadius = if (roundBottom) radius else 0.dp
+fun ShadeScrimRounding.toRoundedCornerShape(radius: Dp): RoundedCornerShape {
+    val topRadius = if (isTopRounded) radius else 0.dp
+    val bottomRadius = if (isBottomRounded) radius else 0.dp
     return RoundedCornerShape(
         topStart = topRadius,
         topEnd = topRadius,
@@ -408,4 +437,6 @@
 }
 
 private const val TAG = "FlexiNotifs"
-private val DEBUG_COLOR = Color(1f, 0f, 0f, 0.2f)
+private val DEBUG_STACK_COLOR = Color(1f, 0f, 0f, 0.2f)
+private val DEBUG_HUN_COLOR = Color(0f, 0f, 1f, 0.2f)
+private val DEBUG_BOX_COLOR = Color(0f, 1f, 0f, 0.2f)
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/BrightnessMirror.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/BrightnessMirror.kt
new file mode 100644
index 0000000..ca6b343
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/BrightnessMirror.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.qs.ui.composable
+
+import androidx.compose.animation.core.animateFloatAsState
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.offset
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.viewinterop.AndroidView
+import com.android.compose.modifiers.height
+import com.android.compose.modifiers.width
+import com.android.systemui.qs.ui.adapter.QSSceneAdapter
+import com.android.systemui.settings.brightness.ui.binder.BrightnessMirrorInflater
+import com.android.systemui.settings.brightness.ui.viewModel.BrightnessMirrorViewModel
+
+@Composable
+fun BrightnessMirror(
+    viewModel: BrightnessMirrorViewModel,
+    qsSceneAdapter: QSSceneAdapter,
+    modifier: Modifier = Modifier,
+) {
+    val isShowing by viewModel.isShowing.collectAsState()
+    val mirrorAlpha by
+        animateFloatAsState(
+            targetValue = if (isShowing) 1f else 0f,
+            label = "alphaAnimationBrightnessMirrorShowing",
+        )
+    val mirrorOffsetAndSize by viewModel.locationAndSize.collectAsState()
+    val offset = IntOffset(0, mirrorOffsetAndSize.yOffset)
+
+    Box(modifier = modifier.fillMaxSize().graphicsLayer { alpha = mirrorAlpha }) {
+        QuickSettingsTheme {
+            // The assumption for using this AndroidView is that there will be only one in view at
+            // a given time (which is a reasonable assumption). Because `QSSceneAdapter` (actually
+            // `BrightnessSliderController` only supports a single mirror).
+            // The benefit of doing it like this is that if the configuration changes or QSImpl is
+            // re-inflated, it's not relevant to the composable, as we'll always get a new one.
+            AndroidView(
+                modifier =
+                    Modifier.align(Alignment.TopCenter)
+                        .offset { offset }
+                        .width { mirrorOffsetAndSize.width }
+                        .height { mirrorOffsetAndSize.height },
+                factory = { context ->
+                    val (view, controller) =
+                        BrightnessMirrorInflater.inflate(context, viewModel.sliderControllerFactory)
+                    viewModel.setToggleSlider(controller)
+                    view
+                },
+                update = { qsSceneAdapter.setBrightnessMirrorController(viewModel) },
+                onRelease = { qsSceneAdapter.setBrightnessMirrorController(null) }
+            )
+        }
+    }
+}
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 244861c..a87a8df 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
@@ -146,7 +146,7 @@
             modifier.fillMaxWidth().layout { measurable, constraints ->
                 val placeable = measurable.measure(constraints)
                 // Use the height of the correct view based on the scene it is being composed in
-                val height = heightProvider()
+                val height = heightProvider().coerceAtLeast(0)
 
                 layout(placeable.width, height) { placeable.placeRelative(0, 0) }
             }
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 5b9213a..a376834 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
@@ -17,7 +17,9 @@
 package com.android.systemui.qs.ui.composable
 
 import android.view.ViewGroup
+import androidx.activity.compose.BackHandler
 import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.core.animateFloatAsState
 import androidx.compose.animation.core.tween
 import androidx.compose.animation.expandVertically
 import androidx.compose.animation.fadeIn
@@ -48,6 +50,7 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.res.colorResource
@@ -119,9 +122,28 @@
     statusBarIconController: StatusBarIconController,
     modifier: Modifier = Modifier,
 ) {
+    val brightnessMirrorShowing by viewModel.brightnessMirrorViewModel.isShowing.collectAsState()
+    val contentAlpha by
+        animateFloatAsState(
+            targetValue = if (brightnessMirrorShowing) 0f else 1f,
+            label = "alphaAnimationBrightnessMirrorContentHiding",
+        )
+
+    BrightnessMirror(
+        viewModel = viewModel.brightnessMirrorViewModel,
+        qsSceneAdapter = viewModel.qsSceneAdapter
+    )
+
     // TODO(b/280887232): implement the real UI.
-    Box(modifier = modifier.fillMaxSize()) {
+    Box(modifier = modifier.fillMaxSize().graphicsLayer { alpha = contentAlpha }) {
         val isCustomizing by viewModel.qsSceneAdapter.isCustomizing.collectAsState()
+
+        BackHandler(
+            enabled = isCustomizing,
+        ) {
+            viewModel.qsSceneAdapter.requestCloseCustomizer()
+        }
+
         val collapsedHeaderHeight =
             with(LocalDensity.current) { ShadeHeader.Dimensions.CollapsedHeight.roundToPx() }
         val lifecycleOwner = LocalLifecycleOwner.current
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 dea9485..4c656b0 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,6 +1,9 @@
 package com.android.systemui.scene.ui.composable
 
+import androidx.compose.foundation.gestures.Orientation
 import com.android.compose.animation.scene.transitions
+import com.android.systemui.bouncer.ui.composable.Bouncer
+import com.android.systemui.notifications.ui.composable.Notifications
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.shared.model.TransitionKeys.CollapseShadeInstantly
 import com.android.systemui.scene.shared.model.TransitionKeys.SlightlyFasterShadeCollapse
@@ -27,6 +30,9 @@
  * Please keep the list sorted alphabetically.
  */
 val SceneContainerTransitions = transitions {
+
+    // Scene transitions
+
     from(Scenes.Bouncer, to = Scenes.Gone) { bouncerToGoneTransition() }
     from(Scenes.Gone, to = Scenes.Shade) { goneToShadeTransition() }
     from(
@@ -64,4 +70,13 @@
     from(Scenes.Lockscreen, to = Scenes.QuickSettings) { lockscreenToQuickSettingsTransition() }
     from(Scenes.Lockscreen, to = Scenes.Gone) { lockscreenToGoneTransition() }
     from(Scenes.Shade, to = Scenes.QuickSettings) { shadeToQuickSettingsTransition() }
+
+    // Scene overscroll
+
+    overscroll(Scenes.Bouncer, Orientation.Vertical) {
+        translate(Bouncer.Elements.Content, y = { absoluteDistance })
+    }
+    overscroll(Scenes.Shade, Orientation.Vertical) {
+        translate(Notifications.Elements.NotificationScrim, y = { absoluteDistance })
+    }
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt
index 12b07a3..02a12e4 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt
@@ -32,6 +32,7 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.layout.widthIn
+import androidx.compose.material3.ColorScheme
 import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.collectAsState
@@ -40,6 +41,7 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.layout.Layout
@@ -52,9 +54,9 @@
 import com.android.compose.animation.scene.ElementKey
 import com.android.compose.animation.scene.LowestZIndexScenePicker
 import com.android.compose.animation.scene.SceneScope
+import com.android.compose.animation.scene.TransitionState
 import com.android.compose.animation.scene.ValueKey
 import com.android.compose.animation.scene.animateElementFloatAsState
-import com.android.compose.animation.scene.animateSceneFloatAsState
 import com.android.compose.windowsizeclass.LocalWindowSizeClass
 import com.android.settingslib.Utils
 import com.android.systemui.battery.BatteryMeterView
@@ -85,10 +87,6 @@
         val ShadeCarrierGroup = ElementKey("ShadeCarrierGroup")
     }
 
-    object Keys {
-        val transitionProgress = ValueKey("ShadeHeaderTransitionProgress")
-    }
-
     object Values {
         val ClockScale = ValueKey("ShadeHeaderClockScale")
     }
@@ -97,6 +95,11 @@
         val CollapsedHeight = 48.dp
         val ExpandedHeight = 120.dp
     }
+
+    object Colors {
+        val ColorScheme.shadeHeaderText: Color
+            get() = Color.White
+    }
 }
 
 @Composable
@@ -107,19 +110,22 @@
     statusBarIconController: StatusBarIconController,
     modifier: Modifier = Modifier,
 ) {
-    val formatProgress =
-        animateSceneFloatAsState(0f, ShadeHeader.Keys.transitionProgress)
-            .unsafeCompositionState(initialValue = 0f)
+    val isDisabled by viewModel.isDisabled.collectAsState()
+    if (isDisabled) {
+        return
+    }
 
     val cutoutWidth = LocalDisplayCutout.current.width()
     val cutoutLocation = LocalDisplayCutout.current.location
 
     val useExpandedFormat by
-        remember(formatProgress) {
+        remember(cutoutLocation) {
             derivedStateOf {
-                cutoutLocation != CutoutLocation.CENTER || formatProgress.value > 0.5f
+                cutoutLocation != CutoutLocation.CENTER ||
+                    shouldUseExpandedFormat(layoutState.transitionState)
             }
         }
+
     val isPrivacyChipVisible by viewModel.isPrivacyChipVisible.collectAsState()
 
     // This layout assumes it is globally positioned at (0, 0) and is the
@@ -195,7 +201,7 @@
 
         val screenWidth = constraints.maxWidth
         val cutoutWidthPx = cutoutWidth.roundToPx()
-        val height = ShadeHeader.Dimensions.CollapsedHeight.roundToPx()
+        val height = CollapsedHeight.roundToPx()
         val childConstraints = Constraints.fixed((screenWidth - cutoutWidthPx) / 2, height)
 
         val startMeasurable = measurables[0][0]
@@ -244,11 +250,15 @@
     statusBarIconController: StatusBarIconController,
     modifier: Modifier = Modifier,
 ) {
-    val formatProgress =
-        animateSceneFloatAsState(1f, ShadeHeader.Keys.transitionProgress)
-            .unsafeCompositionState(initialValue = 1f)
-    val useExpandedFormat by
-        remember(formatProgress) { derivedStateOf { formatProgress.value > 0.5f } }
+    val isDisabled by viewModel.isDisabled.collectAsState()
+    if (isDisabled) {
+        return
+    }
+
+    val useExpandedFormat by remember {
+        derivedStateOf { shouldUseExpandedFormat(layoutState.transitionState) }
+    }
+
     val isPrivacyChipVisible by viewModel.isPrivacyChipVisible.collectAsState()
 
     Box(modifier = modifier) {
@@ -325,7 +335,10 @@
         val animatedScale by animateElementFloatAsState(scale, ClockScale, canOverflow = false)
         AndroidView(
             factory = { context ->
-                Clock(ContextThemeWrapper(context, R.style.TextAppearance_QS_Status), null)
+                Clock(
+                    ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings_Header),
+                    null,
+                )
             },
             modifier =
                 modifier
@@ -430,11 +443,16 @@
 
     AndroidView(
         factory = { context ->
-            val iconContainer = StatusIconContainer(context, null)
+            val themedContext =
+                ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings_Header)
+            val iconContainer = StatusIconContainer(themedContext, null)
             val iconManager = createTintedIconManager(iconContainer, StatusBarLocation.QS)
             iconManager.setTint(
-                Utils.getColorAttrDefaultColor(context, android.R.attr.textColorPrimary),
-                Utils.getColorAttrDefaultColor(context, android.R.attr.textColorPrimaryInverse),
+                Utils.getColorAttrDefaultColor(themedContext, android.R.attr.textColorPrimary),
+                Utils.getColorAttrDefaultColor(
+                    themedContext,
+                    android.R.attr.textColorPrimaryInverse
+                ),
             )
             statusBarIconController.addIconGroup(iconManager)
 
@@ -505,3 +523,15 @@
         modifier = modifier.element(ShadeHeader.Elements.PrivacyChip),
     )
 }
+
+private fun shouldUseExpandedFormat(state: TransitionState): Boolean {
+    return when (state) {
+        is TransitionState.Idle -> {
+            state.currentScene == Scenes.QuickSettings
+        }
+        is TransitionState.Transition -> {
+            (state.isTransitioning(Scenes.Shade, Scenes.QuickSettings) && state.progress >= 0.5) ||
+                (state.isTransitioning(Scenes.QuickSettings, Scenes.Shade) && state.progress < 0.5)
+        }
+    }
+}
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 85798ac..9bd6f81 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
@@ -17,6 +17,7 @@
 package com.android.systemui.shade.ui.composable
 
 import android.view.ViewGroup
+import androidx.compose.animation.core.animateFloatAsState
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.clipScrollableContainer
@@ -33,6 +34,7 @@
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.navigationBars
+import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.shape.RoundedCornerShape
@@ -45,6 +47,7 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.layout
 import androidx.compose.ui.platform.LocalDensity
@@ -70,6 +73,7 @@
 import com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL
 import com.android.systemui.notifications.ui.composable.NotificationScrollingStack
 import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibility
+import com.android.systemui.qs.ui.composable.BrightnessMirror
 import com.android.systemui.qs.ui.composable.QuickSettings
 import com.android.systemui.res.R
 import com.android.systemui.scene.shared.model.Scenes
@@ -302,12 +306,25 @@
         }
     }
 
+    val brightnessMirrorShowing by viewModel.brightnessMirrorViewModel.isShowing.collectAsState()
+    val contentAlpha by
+        animateFloatAsState(
+            targetValue = if (brightnessMirrorShowing) 0f else 1f,
+            label = "alphaAnimationBrightnessMirrorContentHiding",
+        )
+
+    val brightnessMirrorShowingModifier = Modifier.graphicsLayer { alpha = contentAlpha }
+
     Box(
         modifier =
             modifier
                 .fillMaxSize()
                 .element(Shade.Elements.BackgroundScrim)
-                .background(colorResource(R.color.shade_scrim_background_dark))
+                // Cannot set the alpha of the whole element to 0, because the mirror should be
+                // in the QS column.
+                .background(
+                    colorResource(R.color.shade_scrim_background_dark).copy(alpha = contentAlpha)
+                )
     ) {
         Column(
             modifier = Modifier.fillMaxSize(),
@@ -317,61 +334,80 @@
                 createTintedIconManager = createTintedIconManager,
                 createBatteryMeterViewController = createBatteryMeterViewController,
                 statusBarIconController = statusBarIconController,
-                modifier = Modifier.padding(horizontal = Shade.Dimensions.HorizontalPadding)
+                modifier =
+                    Modifier.padding(horizontal = Shade.Dimensions.HorizontalPadding)
+                        .then(brightnessMirrorShowingModifier)
             )
 
             Row(modifier = Modifier.fillMaxWidth().weight(1f)) {
-                Column(
-                    verticalArrangement = Arrangement.Top,
-                    modifier =
-                        Modifier.weight(1f).fillMaxSize().thenIf(!isCustomizing) {
-                            Modifier.padding(bottom = navBarBottomHeight)
-                        },
-                ) {
+                Box(modifier = Modifier.weight(1f)) {
+                    BrightnessMirror(
+                        viewModel = viewModel.brightnessMirrorViewModel,
+                        qsSceneAdapter = viewModel.qsSceneAdapter,
+                        // Need to remove the offset of the header height, as the mirror uses
+                        // the position of the Brightness slider in the window
+                        modifier = Modifier.offset(y = -ShadeHeader.Dimensions.CollapsedHeight)
+                    )
                     Column(
+                        verticalArrangement = Arrangement.Top,
                         modifier =
-                            Modifier.fillMaxSize().weight(1f).thenIf(!isCustomizing) {
-                                Modifier.verticalNestedScrollToScene()
-                                    .verticalScroll(
-                                        quickSettingsScrollState,
-                                        enabled = isScrollable
-                                    )
-                                    .clipScrollableContainer(Orientation.Horizontal)
-                            }
+                            Modifier.fillMaxSize().thenIf(!isCustomizing) {
+                                Modifier.padding(bottom = navBarBottomHeight)
+                            },
                     ) {
-                        Box(
+                        Column(
                             modifier =
-                                Modifier.element(QuickSettings.Elements.SplitShadeQuickSettings)
+                                Modifier.fillMaxSize()
+                                    .weight(1f)
+                                    .thenIf(!isCustomizing) {
+                                        Modifier.verticalNestedScrollToScene()
+                                            .verticalScroll(
+                                                quickSettingsScrollState,
+                                                enabled = isScrollable
+                                            )
+                                            .clipScrollableContainer(Orientation.Horizontal)
+                                    }
+                                    .then(brightnessMirrorShowingModifier)
                         ) {
-                            QuickSettings(
-                                qsSceneAdapter = viewModel.qsSceneAdapter,
-                                heightProvider = { viewModel.qsSceneAdapter.qsHeight },
-                                isSplitShade = true,
+                            Box(
+                                modifier =
+                                    Modifier.element(QuickSettings.Elements.SplitShadeQuickSettings)
+                            ) {
+                                QuickSettings(
+                                    qsSceneAdapter = viewModel.qsSceneAdapter,
+                                    heightProvider = { viewModel.qsSceneAdapter.qsHeight },
+                                    isSplitShade = true,
+                                    modifier = Modifier.fillMaxWidth(),
+                                    squishiness = tileSquishiness,
+                                )
+                            }
+
+                            MediaIfVisible(
+                                viewModel = viewModel,
+                                mediaCarouselController = mediaCarouselController,
+                                mediaHost = mediaHost,
                                 modifier = Modifier.fillMaxWidth(),
-                                squishiness = tileSquishiness,
                             )
                         }
-
-                        MediaIfVisible(
-                            viewModel = viewModel,
-                            mediaCarouselController = mediaCarouselController,
-                            mediaHost = mediaHost,
-                            modifier = Modifier.fillMaxWidth(),
+                        FooterActionsWithAnimatedVisibility(
+                            viewModel = footerActionsViewModel,
+                            isCustomizing = isCustomizing,
+                            lifecycleOwner = lifecycleOwner,
+                            modifier =
+                                Modifier.align(Alignment.CenterHorizontally)
+                                    .then(brightnessMirrorShowingModifier),
                         )
                     }
-                    FooterActionsWithAnimatedVisibility(
-                        viewModel = footerActionsViewModel,
-                        isCustomizing = isCustomizing,
-                        lifecycleOwner = lifecycleOwner,
-                        modifier = Modifier.align(Alignment.CenterHorizontally),
-                    )
                 }
 
                 NotificationScrollingStack(
                     viewModel = viewModel.notifications,
                     maxScrimTop = { 0f },
                     modifier =
-                        Modifier.weight(1f).fillMaxHeight().padding(bottom = navBarBottomHeight),
+                        Modifier.weight(1f)
+                            .fillMaxHeight()
+                            .padding(bottom = navBarBottomHeight)
+                            .then(brightnessMirrorShowingModifier),
                 )
             }
         }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/VariableDayDate.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/VariableDayDate.kt
index 799dbd6..5e107c6 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/VariableDayDate.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/VariableDayDate.kt
@@ -4,9 +4,9 @@
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.Layout
+import com.android.systemui.shade.ui.composable.ShadeHeader.Colors.shadeHeaderText
 import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel
 
 @Composable
@@ -23,16 +23,16 @@
                 {
                     Text(
                         text = longerText.value,
-                        style = MaterialTheme.typography.titleSmall,
-                        color = MaterialTheme.colorScheme.onBackground,
+                        style = MaterialTheme.typography.bodyMedium,
+                        color = MaterialTheme.colorScheme.shadeHeaderText,
                         maxLines = 1,
                     )
                 },
                 {
                     Text(
                         text = shorterText.value,
-                        style = MaterialTheme.typography.titleSmall,
-                        color = MaterialTheme.colorScheme.onBackground,
+                        style = MaterialTheme.typography.bodyMedium,
+                        color = MaterialTheme.colorScheme.shadeHeaderText,
                         maxLines = 1,
                     )
                 },
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/AncModule.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/AncModule.kt
index ccb5d36..fa052e8 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/AncModule.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/AncModule.kt
@@ -17,15 +17,12 @@
 package com.android.systemui.volume.panel.component.anc
 
 import com.android.systemui.volume.panel.component.anc.domain.AncAvailabilityCriteria
-import com.android.systemui.volume.panel.component.anc.ui.composable.AncPopup
-import com.android.systemui.volume.panel.component.anc.ui.viewmodel.AncViewModel
-import com.android.systemui.volume.panel.component.button.ui.composable.ButtonComponent
+import com.android.systemui.volume.panel.component.anc.ui.composable.AncButtonComponent
 import com.android.systemui.volume.panel.component.shared.model.VolumePanelComponents
 import com.android.systemui.volume.panel.domain.ComponentAvailabilityCriteria
 import com.android.systemui.volume.panel.shared.model.VolumePanelUiComponent
 import dagger.Binds
 import dagger.Module
-import dagger.Provides
 import dagger.multibindings.IntoMap
 import dagger.multibindings.StringKey
 
@@ -40,14 +37,8 @@
         criteria: AncAvailabilityCriteria
     ): ComponentAvailabilityCriteria
 
-    companion object {
-
-        @Provides
-        @IntoMap
-        @StringKey(VolumePanelComponents.ANC)
-        fun provideVolumePanelUiComponent(
-            viewModel: AncViewModel,
-            popup: AncPopup,
-        ): VolumePanelUiComponent = ButtonComponent(viewModel.button, popup::show)
-    }
+    @Binds
+    @IntoMap
+    @StringKey(VolumePanelComponents.ANC)
+    fun bindVolumePanelUiComponent(component: AncButtonComponent): VolumePanelUiComponent
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/AncButtonComponent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/AncButtonComponent.kt
new file mode 100644
index 0000000..00225fc
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/AncButtonComponent.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.volume.panel.component.anc.ui.composable
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.semantics.clearAndSetSemantics
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.role
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.dp
+import com.android.systemui.res.R
+import com.android.systemui.volume.panel.component.anc.ui.viewmodel.AncViewModel
+import com.android.systemui.volume.panel.ui.composable.ComposeVolumePanelUiComponent
+import com.android.systemui.volume.panel.ui.composable.VolumePanelComposeScope
+import javax.inject.Inject
+
+class AncButtonComponent
+@Inject
+constructor(
+    private val viewModel: AncViewModel,
+    private val ancPopup: AncPopup,
+) : ComposeVolumePanelUiComponent {
+
+    @Composable
+    override fun VolumePanelComposeScope.Content(modifier: Modifier) {
+        val slice by viewModel.buttonSlice.collectAsState()
+        val label = stringResource(R.string.volume_panel_noise_control_title)
+        Column(
+            modifier = modifier,
+            verticalArrangement = Arrangement.spacedBy(12.dp),
+            horizontalAlignment = Alignment.CenterHorizontally,
+        ) {
+            SliceAndroidView(
+                modifier =
+                    Modifier.height(64.dp)
+                        .fillMaxWidth()
+                        .semantics {
+                            role = Role.Button
+                            contentDescription = label
+                        }
+                        .clip(RoundedCornerShape(28.dp)),
+                slice = slice,
+                onWidthChanged = viewModel::onButtonSliceWidthChanged,
+                onClick = { ancPopup.show(null) }
+            )
+            Text(
+                modifier = Modifier.clearAndSetSemantics {},
+                text = label,
+                style = MaterialTheme.typography.labelMedium,
+                maxLines = 1,
+                overflow = TextOverflow.Ellipsis,
+            )
+        }
+    }
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/AncPopup.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/AncPopup.kt
index b1fbe35..2af042a 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/AncPopup.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/AncPopup.kt
@@ -16,9 +16,7 @@
 
 package com.android.systemui.volume.panel.component.anc.ui.composable
 
-import android.content.Context
-import android.view.ContextThemeWrapper
-import android.view.View
+import androidx.compose.foundation.basicMarquee
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Text
@@ -29,9 +27,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.text.style.TextAlign
-import androidx.compose.ui.viewinterop.AndroidView
 import androidx.slice.Slice
-import androidx.slice.widget.SliceView
 import com.android.systemui.animation.Expandable
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.phone.SystemUIDialog
@@ -48,13 +44,14 @@
 ) {
 
     /** Shows a popup with the [expandable] animation. */
-    fun show(expandable: Expandable) {
+    fun show(expandable: Expandable?) {
         volumePanelPopup.show(expandable, { Title() }, { Content(it) })
     }
 
     @Composable
     private fun Title() {
         Text(
+            modifier = Modifier.basicMarquee(),
             text = stringResource(R.string.volume_panel_noise_control_title),
             style = MaterialTheme.typography.titleMedium,
             textAlign = TextAlign.Center,
@@ -64,49 +61,18 @@
 
     @Composable
     private fun Content(dialog: SystemUIDialog) {
-        val slice: Slice? by viewModel.slice.collectAsState()
+        val isAvailable by viewModel.isAvailable.collectAsState(true)
 
-        if (slice == null) {
+        if (!isAvailable) {
             SideEffect { dialog.dismiss() }
             return
         }
 
-        AndroidView<SliceView>(
+        val slice by viewModel.popupSlice.collectAsState()
+        SliceAndroidView(
             modifier = Modifier.fillMaxWidth(),
-            factory = { context: Context ->
-                SliceView(ContextThemeWrapper(context, R.style.Widget_SliceView_VolumePanel))
-                    .apply {
-                        mode = SliceView.MODE_LARGE
-                        isScrollable = false
-                        importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
-                        setShowTitleItems(true)
-                        addOnLayoutChangeListener(
-                            OnWidthChangedLayoutListener(viewModel::changeSliceWidth)
-                        )
-                    }
-            },
-            update = { sliceView: SliceView -> sliceView.slice = slice }
+            slice = slice,
+            onWidthChanged = viewModel::onPopupSliceWidthChanged
         )
     }
-
-    private class OnWidthChangedLayoutListener(private val widthChanged: (Int) -> Unit) :
-        View.OnLayoutChangeListener {
-        override fun onLayoutChange(
-            v: View?,
-            left: Int,
-            top: Int,
-            right: Int,
-            bottom: Int,
-            oldLeft: Int,
-            oldTop: Int,
-            oldRight: Int,
-            oldBottom: Int
-        ) {
-            val newWidth = right - left
-            val oldWidth = oldRight - oldLeft
-            if (oldWidth != newWidth) {
-                widthChanged(newWidth)
-            }
-        }
-    }
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/SliceAndroidView.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/SliceAndroidView.kt
new file mode 100644
index 0000000..f354b80
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/SliceAndroidView.kt
@@ -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.systemui.volume.panel.component.anc.ui.composable
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.view.ContextThemeWrapper
+import android.view.MotionEvent
+import android.view.View
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.viewinterop.AndroidView
+import androidx.slice.Slice
+import androidx.slice.widget.SliceView
+import com.android.systemui.res.R
+
+@Composable
+fun SliceAndroidView(
+    slice: Slice?,
+    modifier: Modifier = Modifier,
+    onWidthChanged: ((Int) -> Unit)? = null,
+    onClick: (() -> Unit)? = null,
+) {
+    AndroidView(
+        modifier = modifier,
+        factory = { context: Context ->
+            ClickableSliceView(
+                    ContextThemeWrapper(context, R.style.Widget_SliceView_VolumePanel),
+                    onClick,
+                )
+                .apply {
+                    mode = SliceView.MODE_LARGE
+                    isScrollable = false
+                    importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
+                    setShowTitleItems(true)
+                    if (onWidthChanged != null) {
+                        addOnLayoutChangeListener(OnWidthChangedLayoutListener(onWidthChanged))
+                    }
+                    if (onClick != null) {
+                        setOnClickListener { onClick() }
+                    }
+                }
+        },
+        update = { sliceView: SliceView -> sliceView.slice = slice }
+    )
+}
+
+class OnWidthChangedLayoutListener(private val widthChanged: (Int) -> Unit) :
+    View.OnLayoutChangeListener {
+
+    override fun onLayoutChange(
+        v: View?,
+        left: Int,
+        top: Int,
+        right: Int,
+        bottom: Int,
+        oldLeft: Int,
+        oldTop: Int,
+        oldRight: Int,
+        oldBottom: Int
+    ) {
+        val newWidth = right - left
+        val oldWidth = oldRight - oldLeft
+        if (oldWidth != newWidth) {
+            widthChanged(newWidth)
+        }
+    }
+}
+
+/**
+ * [SliceView] that prioritises [onClick] when its clicked instead of passing the event to the slice
+ * first.
+ */
+@SuppressLint("ViewConstructor") // only used in this class
+private class ClickableSliceView(
+    context: Context,
+    private val onClick: (() -> Unit)?,
+) : SliceView(context) {
+
+    init {
+        if (onClick != null) {
+            setOnClickListener {}
+        }
+    }
+
+    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
+        return onClick != null || super.onInterceptTouchEvent(ev)
+    }
+
+    override fun onClick(v: View?) {
+        onClick?.let { it() } ?: super.onClick(v)
+    }
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/BottomComponentButtonSurface.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/BottomComponentButtonSurface.kt
new file mode 100644
index 0000000..167eb65
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/BottomComponentButtonSurface.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.volume.panel.component.button.ui.composable
+
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+
+/**
+ * Container to create a rim around the button. Both `Expandable` and `OutlinedIconToggleButton`
+ * have antialiasing problem when used with [androidx.compose.foundation.BorderStroke] and some
+ * contrast container color.
+ */
+// TODO(b/331584069): Remove this once antialiasing bug is fixed
+@Composable
+fun BottomComponentButtonSurface(modifier: Modifier = Modifier, content: @Composable () -> Unit) {
+    Surface(
+        modifier = modifier.height(64.dp),
+        shape = RoundedCornerShape(28.dp),
+        color = MaterialTheme.colorScheme.surface,
+        content = content,
+    )
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/ButtonComponent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/ButtonComponent.kt
index b721e41..fc511e1 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/ButtonComponent.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/ButtonComponent.kt
@@ -16,13 +16,12 @@
 
 package com.android.systemui.volume.panel.component.button.ui.composable
 
-import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.basicMarquee
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.material3.MaterialTheme
@@ -37,7 +36,6 @@
 import androidx.compose.ui.semantics.contentDescription
 import androidx.compose.ui.semantics.role
 import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
 import com.android.compose.animation.Expandable
 import com.android.systemui.animation.Expandable
@@ -64,28 +62,28 @@
             verticalArrangement = Arrangement.spacedBy(12.dp),
             horizontalAlignment = Alignment.CenterHorizontally,
         ) {
-            Expandable(
-                modifier =
-                    Modifier.height(64.dp).fillMaxWidth().semantics {
-                        role = Role.Button
-                        contentDescription = label
-                    },
-                color = MaterialTheme.colorScheme.primaryContainer,
-                shape = RoundedCornerShape(28.dp),
-                contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
-                borderStroke = BorderStroke(8.dp, MaterialTheme.colorScheme.surface),
-                onClick = onClick,
-            ) {
-                Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                    Icon(modifier = Modifier.size(24.dp), icon = viewModel.icon)
+            BottomComponentButtonSurface {
+                Expandable(
+                    modifier =
+                        Modifier.fillMaxSize().padding(8.dp).semantics {
+                            role = Role.Button
+                            contentDescription = label
+                        },
+                    color = MaterialTheme.colorScheme.primaryContainer,
+                    shape = RoundedCornerShape(28.dp),
+                    contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
+                    onClick = onClick,
+                ) {
+                    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
+                        Icon(modifier = Modifier.size(24.dp), icon = viewModel.icon)
+                    }
                 }
             }
             Text(
-                modifier = Modifier.clearAndSetSemantics {},
+                modifier = Modifier.clearAndSetSemantics {}.basicMarquee(),
                 text = label,
                 style = MaterialTheme.typography.labelMedium,
-                maxLines = 1,
-                overflow = TextOverflow.Ellipsis,
+                maxLines = 2,
             )
         }
     }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/ToggleButtonComponent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/ToggleButtonComponent.kt
index 28fd785..780e3f2 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/ToggleButtonComponent.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/ToggleButtonComponent.kt
@@ -16,26 +16,28 @@
 
 package com.android.systemui.volume.panel.component.button.ui.composable
 
-import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.basicMarquee
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material3.IconButtonDefaults
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
 import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.OutlinedIconToggleButton
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.clearAndSetSemantics
 import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.role
 import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
 import com.android.systemui.common.ui.compose.Icon
 import com.android.systemui.volume.panel.component.button.ui.viewmodel.ToggleButtonViewModel
@@ -60,29 +62,38 @@
             verticalArrangement = Arrangement.spacedBy(12.dp),
             horizontalAlignment = Alignment.CenterHorizontally,
         ) {
-            OutlinedIconToggleButton(
-                modifier =
-                    Modifier.height(64.dp).fillMaxWidth().semantics { contentDescription = label },
-                checked = viewModel.isChecked,
-                onCheckedChange = onCheckedChange,
-                shape = RoundedCornerShape(28.dp),
-                colors =
-                    IconButtonDefaults.outlinedIconToggleButtonColors(
-                        containerColor = MaterialTheme.colorScheme.surface,
-                        contentColor = MaterialTheme.colorScheme.onSurfaceVariant,
-                        checkedContainerColor = MaterialTheme.colorScheme.primaryContainer,
-                        checkedContentColor = MaterialTheme.colorScheme.onPrimaryContainer,
-                    ),
-                border = BorderStroke(8.dp, MaterialTheme.colorScheme.surface),
-            ) {
-                Icon(modifier = Modifier.size(24.dp), icon = viewModel.icon)
+            BottomComponentButtonSurface {
+                val colors =
+                    if (viewModel.isChecked) {
+                        ButtonDefaults.buttonColors(
+                            containerColor = MaterialTheme.colorScheme.primaryContainer,
+                            contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
+                        )
+                    } else {
+                        ButtonDefaults.buttonColors(
+                            containerColor = Color.Transparent,
+                            contentColor = MaterialTheme.colorScheme.onSurfaceVariant,
+                        )
+                    }
+                Button(
+                    modifier =
+                        Modifier.fillMaxSize().padding(8.dp).semantics {
+                            role = Role.Switch
+                            contentDescription = label
+                        },
+                    onClick = { onCheckedChange(!viewModel.isChecked) },
+                    shape = RoundedCornerShape(28.dp),
+                    colors = colors
+                ) {
+                    Icon(modifier = Modifier.size(24.dp), icon = viewModel.icon)
+                }
             }
+
             Text(
-                modifier = Modifier.clearAndSetSemantics {},
+                modifier = Modifier.clearAndSetSemantics {}.basicMarquee(),
                 text = label,
                 style = MaterialTheme.typography.labelMedium,
-                maxLines = 1,
-                overflow = TextOverflow.Ellipsis,
+                maxLines = 2,
             )
         }
     }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/popup/ui/composable/VolumePanelPopup.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/popup/ui/composable/VolumePanelPopup.kt
index 26086d1..b489dfc 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/popup/ui/composable/VolumePanelPopup.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/popup/ui/composable/VolumePanelPopup.kt
@@ -33,6 +33,8 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.paneTitle
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.dp
 import com.android.systemui.animation.DialogTransitionAnimator
 import com.android.systemui.animation.Expandable
@@ -57,7 +59,7 @@
      * @param content is the popup body
      */
     fun show(
-        expandable: Expandable,
+        expandable: Expandable?,
         title: @Composable (SystemUIDialog) -> Unit,
         content: @Composable (SystemUIDialog) -> Unit,
     ) {
@@ -68,7 +70,7 @@
             ) {
                 PopupComposable(it, title, content)
             }
-        val controller = expandable.dialogTransitionController()
+        val controller = expandable?.dialogTransitionController()
         if (controller == null) {
             dialog.show()
         } else {
@@ -82,7 +84,8 @@
         title: @Composable (SystemUIDialog) -> Unit,
         content: @Composable (SystemUIDialog) -> Unit,
     ) {
-        Box(Modifier.fillMaxWidth()) {
+        val paneTitle = stringResource(R.string.accessibility_volume_settings)
+        Box(Modifier.fillMaxWidth().semantics(properties = { this.paneTitle = paneTitle })) {
             Column(
                 modifier = Modifier.fillMaxWidth().padding(vertical = 20.dp),
                 verticalArrangement = Arrangement.spacedBy(20.dp),
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/selector/ui/composable/VolumePanelRadioButtons.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/selector/ui/composable/VolumePanelRadioButtons.kt
index 98d1afd..c743314 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/selector/ui/composable/VolumePanelRadioButtons.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/selector/ui/composable/VolumePanelRadioButtons.kt
@@ -19,10 +19,13 @@
 import androidx.compose.animation.core.Animatable
 import androidx.compose.animation.core.VectorConverter
 import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.shape.CornerSize
@@ -32,6 +35,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.layout.Layout
@@ -42,6 +46,12 @@
 import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.layout.layoutId
 import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.semantics.clearAndSetSemantics
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.role
+import androidx.compose.ui.semantics.selected
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntOffset
@@ -108,11 +118,24 @@
                 horizontalArrangement = Arrangement.spacedBy(spacing)
             ) {
                 for (itemIndex in items.indices) {
-                    TextButton(
-                        modifier = Modifier.weight(1f),
-                        onClick = { items[itemIndex].onItemSelected() },
+                    val item = items[itemIndex]
+                    Row(
+                        modifier =
+                            Modifier.height(48.dp)
+                                .weight(1f)
+                                .semantics {
+                                    item.contentDescription?.let { contentDescription = it }
+                                    role = Role.Switch
+                                    selected = itemIndex == scope.selectedIndex
+                                }
+                                .clickable(
+                                    interactionSource = null,
+                                    indication = null,
+                                    onClick = { items[itemIndex].onItemSelected() }
+                                ),
+                        horizontalArrangement = Arrangement.Center,
+                        verticalAlignment = Alignment.CenterVertically,
                     ) {
-                        val item = items[itemIndex]
                         if (item.icon !== Empty) {
                             with(items[itemIndex]) { icon() }
                         }
@@ -126,13 +149,17 @@
                             start = indicatorBackgroundPadding,
                             top = labelIndicatorBackgroundSpacing,
                             end = indicatorBackgroundPadding
-                        ),
+                        )
+                        .clearAndSetSemantics {},
                 horizontalArrangement = Arrangement.spacedBy(spacing),
             ) {
                 for (itemIndex in items.indices) {
+                    val cornersRadius = 4.dp
                     TextButton(
                         modifier = Modifier.weight(1f),
                         onClick = { items[itemIndex].onItemSelected() },
+                        shape = RoundedCornerShape(cornersRadius),
+                        contentPadding = PaddingValues(cornersRadius)
                     ) {
                         val item = items[itemIndex]
                         if (item.icon !== Empty) {
@@ -246,7 +273,7 @@
     val DefaultSpacing = 24.dp
     val DefaultLabelIndicatorBackgroundSpacing = 12.dp
     val DefaultIndicatorCornerRadius = 20.dp
-    val DefaultIndicatorBackgroundCornerRadius = 20.dp
+    val DefaultIndicatorBackgroundCornerRadius = 28.dp
 
     /**
      * Returns the default VolumePanelRadioButtonBar colors.
@@ -281,6 +308,7 @@
         onItemSelected: () -> Unit,
         icon: @Composable RowScope.() -> Unit = Empty,
         label: @Composable RowScope.() -> Unit = Empty,
+        contentDescription: String? = null,
     )
 }
 
@@ -302,6 +330,7 @@
         onItemSelected: () -> Unit,
         icon: @Composable RowScope.() -> Unit,
         label: @Composable RowScope.() -> Unit,
+        contentDescription: String?,
     ) {
         require(!isSelected || !hasSelectedItem) { "Only one item should be selected at a time" }
         if (isSelected) {
@@ -312,6 +341,7 @@
                 onItemSelected = onItemSelected,
                 icon = icon,
                 label = label,
+                contentDescription = contentDescription,
             )
         )
     }
@@ -325,6 +355,7 @@
     val onItemSelected: () -> Unit,
     val icon: @Composable RowScope.() -> Unit,
     val label: @Composable RowScope.() -> Unit,
+    val contentDescription: String?,
 )
 
 private const val UNSET_OFFSET = -1
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/spatialaudio/ui/composable/SpatialAudioPopup.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/spatialaudio/ui/composable/SpatialAudioPopup.kt
index 71b3e8a..eed54da 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/spatialaudio/ui/composable/SpatialAudioPopup.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/spatialaudio/ui/composable/SpatialAudioPopup.kt
@@ -16,12 +16,14 @@
 
 package com.android.systemui.volume.panel.component.spatialaudio.ui.composable
 
+import androidx.compose.foundation.basicMarquee
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.SideEffect
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.text.style.TextAlign
 import com.android.systemui.animation.Expandable
@@ -49,6 +51,7 @@
     @Composable
     private fun Title() {
         Text(
+            modifier = Modifier.basicMarquee(),
             text = stringResource(R.string.volume_panel_spatial_audio_title),
             style = MaterialTheme.typography.titleMedium,
             textAlign = TextAlign.Center,
@@ -71,9 +74,11 @@
         }
         VolumePanelRadioButtonBar {
             for (buttonViewModel in enabledModelStates) {
+                val label = buttonViewModel.button.label.toString()
                 item(
                     isSelected = buttonViewModel.button.isChecked,
                     onItemSelected = { viewModel.setEnabled(buttonViewModel.model) },
+                    contentDescription = label,
                     icon = {
                         Icon(
                             icon = buttonViewModel.button.icon,
@@ -82,9 +87,12 @@
                     },
                     label = {
                         Text(
-                            text = buttonViewModel.button.label.toString(),
+                            modifier = Modifier.basicMarquee(),
+                            text = label,
                             style = MaterialTheme.typography.labelMedium,
                             color = buttonViewModel.labelColor.toColor(),
+                            textAlign = TextAlign.Center,
+                            maxLines = 2
                         )
                     }
                 )
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/ColumnVolumeSliders.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/ColumnVolumeSliders.kt
index e1cf3a5..f89669c 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/ColumnVolumeSliders.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/ColumnVolumeSliders.kt
@@ -28,9 +28,8 @@
 import androidx.compose.animation.scaleIn
 import androidx.compose.animation.scaleOut
 import androidx.compose.animation.shrinkVertically
-import androidx.compose.animation.slideInVertically
-import androidx.compose.animation.slideOutVertically
 import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.fillMaxWidth
@@ -57,6 +56,8 @@
 
 private const val EXPAND_DURATION_MILLIS = 500
 private const val COLLAPSE_DURATION_MILLIS = 300
+private const val SHRINK_FRACTION = 0.55f
+private const val SCALE_FRACTION = 0.9f
 
 /** Volume sliders laid out in a collapsable column */
 @OptIn(ExperimentalAnimationApi::class)
@@ -107,34 +108,33 @@
         transition.AnimatedVisibility(
             visible = { it },
             enter =
-                expandVertically(
-                    animationSpec = tween(durationMillis = EXPAND_DURATION_MILLIS),
-                    expandFrom = Alignment.CenterVertically,
-                ),
+                expandVertically(animationSpec = tween(durationMillis = EXPAND_DURATION_MILLIS)),
             exit =
-                shrinkVertically(
-                    animationSpec = tween(durationMillis = COLLAPSE_DURATION_MILLIS),
-                    shrinkTowards = Alignment.CenterVertically,
-                ),
+                shrinkVertically(animationSpec = tween(durationMillis = COLLAPSE_DURATION_MILLIS)),
         ) {
-            Column(modifier = Modifier.fillMaxWidth()) {
-                for (index in 1..viewModels.lastIndex) {
-                    val sliderViewModel: SliderViewModel = viewModels[index]
-                    val sliderState by sliderViewModel.slider.collectAsState()
-                    transition.AnimatedVisibility(
-                        visible = { it },
-                        enter = enterTransition(index = index, totalCount = viewModels.size),
-                        exit = exitTransition(index = index, totalCount = viewModels.size)
-                    ) {
-                        VolumeSlider(
-                            modifier = Modifier.fillMaxWidth().padding(top = 16.dp),
-                            state = sliderState,
-                            onValueChange = { newValue: Float ->
-                                sliderViewModel.onValueChanged(sliderState, newValue)
-                            },
-                            onIconTapped = { sliderViewModel.toggleMuted(sliderState) },
-                            sliderColors = sliderColors,
-                        )
+            // This box allows sliders to slide towards top when the container is shrinking and
+            // slide from top when the container is expanding.
+            Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.BottomCenter) {
+                Column {
+                    for (index in 1..viewModels.lastIndex) {
+                        val sliderViewModel: SliderViewModel = viewModels[index]
+                        val sliderState by sliderViewModel.slider.collectAsState()
+                        transition.AnimatedVisibility(
+                            modifier = Modifier.padding(top = 16.dp),
+                            visible = { it },
+                            enter = enterTransition(index = index, totalCount = viewModels.size),
+                            exit = exitTransition(index = index, totalCount = viewModels.size)
+                        ) {
+                            VolumeSlider(
+                                modifier = Modifier.fillMaxWidth(),
+                                state = sliderState,
+                                onValueChange = { newValue: Float ->
+                                    sliderViewModel.onValueChanged(sliderState, newValue)
+                                },
+                                onIconTapped = { sliderViewModel.toggleMuted(sliderState) },
+                                sliderColors = sliderColors,
+                            )
+                        }
                     }
                 }
             }
@@ -175,19 +175,14 @@
 private fun enterTransition(index: Int, totalCount: Int): EnterTransition {
     val enterDelay = ((totalCount - index + 1) * 10).coerceAtLeast(0)
     val enterDuration = (EXPAND_DURATION_MILLIS - enterDelay).coerceAtLeast(100)
-    return slideInVertically(
-        initialOffsetY = { (it * 0.25).toInt() },
+    return scaleIn(
+        initialScale = SCALE_FRACTION,
         animationSpec = tween(durationMillis = enterDuration, delayMillis = enterDelay),
     ) +
-        scaleIn(
-            initialScale = 0.9f,
-            animationSpec = tween(durationMillis = enterDuration, delayMillis = enterDelay),
-        ) +
         expandVertically(
-            initialHeight = { (it * 0.65).toInt() },
+            initialHeight = { (it * SHRINK_FRACTION).toInt() },
             animationSpec = tween(durationMillis = enterDuration, delayMillis = enterDelay),
             clip = false,
-            expandFrom = Alignment.CenterVertically,
         ) +
         fadeIn(
             animationSpec = tween(durationMillis = enterDuration, delayMillis = enterDelay),
@@ -196,19 +191,14 @@
 
 private fun exitTransition(index: Int, totalCount: Int): ExitTransition {
     val exitDuration = (COLLAPSE_DURATION_MILLIS - (totalCount - index + 1) * 10).coerceAtLeast(100)
-    return slideOutVertically(
-        targetOffsetY = { (it * 0.25).toInt() },
+    return scaleOut(
+        targetScale = SCALE_FRACTION,
         animationSpec = tween(durationMillis = exitDuration),
     ) +
-        scaleOut(
-            targetScale = 0.9f,
-            animationSpec = tween(durationMillis = exitDuration),
-        ) +
         shrinkVertically(
-            targetHeight = { (it * 0.65).toInt() },
+            targetHeight = { (it * SHRINK_FRACTION).toInt() },
             animationSpec = tween(durationMillis = exitDuration),
             clip = false,
-            shrinkTowards = Alignment.CenterVertically,
         ) +
         fadeOut(animationSpec = tween(durationMillis = exitDuration))
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt
index d31064a..19d3f59 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt
@@ -17,10 +17,10 @@
 package com.android.systemui.volume.panel.component.volume.ui.composable
 
 import androidx.compose.animation.core.animateFloatAsState
+import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.size
-import androidx.compose.material3.IconButton
-import androidx.compose.material3.IconButtonColors
 import androidx.compose.material3.LocalContentColor
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
@@ -32,7 +32,6 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.semantics.ProgressBarRangeInfo
 import androidx.compose.ui.semantics.clearAndSetSemantics
 import androidx.compose.ui.semantics.contentDescription
@@ -130,24 +129,20 @@
     isTappable: Boolean,
     modifier: Modifier = Modifier
 ) {
-    if (isTappable) {
-        IconButton(
-            modifier = modifier,
-            onClick = onIconTapped,
-            colors =
-                IconButtonColors(
-                    contentColor = LocalContentColor.current,
-                    containerColor = Color.Transparent,
-                    disabledContentColor = LocalContentColor.current,
-                    disabledContainerColor = Color.Transparent,
-                ),
-            content = { Icon(modifier = Modifier.size(24.dp), icon = icon) },
-        )
-    } else {
-        Box(
-            modifier = modifier,
-            contentAlignment = Alignment.Center,
-            content = { Icon(modifier = Modifier.size(24.dp), icon = icon) },
-        )
-    }
+    val boxModifier =
+        if (isTappable) {
+                modifier.clickable(
+                    onClick = onIconTapped,
+                    interactionSource = null,
+                    indication = null
+                )
+            } else {
+                modifier
+            }
+            .fillMaxSize()
+    Box(
+        modifier = boxModifier,
+        contentAlignment = Alignment.Center,
+        content = { Icon(modifier = Modifier.size(24.dp), icon = icon) },
+    )
 }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSliderContent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSliderContent.kt
index 6b9af23..4ae4eb8 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSliderContent.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSliderContent.kt
@@ -108,15 +108,20 @@
             measurables
                 .fastFirst { it.layoutId == VolumeSliderContentComponent.Label }
                 .measure(constraints)
-        val layoutWidth: Int = constraints.maxWidth
+        val layoutWidth: Int =
+            if (isEnabled) {
+                labelPlaceable.width
+            } else {
+                constraints.maxWidth
+            }
         val fullLayoutWidth: Int =
             if (isEnabled) {
                 // PlatformSlider uses half of the available space for the enabled state.
                 // This is using it to allow disabled message to take whole space when animating to
                 // prevent it from jumping left to right
-                layoutWidth * 2
+                constraints.maxWidth * 2
             } else {
-                layoutWidth
+                constraints.maxWidth
             }
 
         val disabledMessagePlaceable =
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/ui/composable/VerticalVolumePanelContent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/ui/composable/VerticalVolumePanelContent.kt
index dd76781..9ea20b9 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/ui/composable/VerticalVolumePanelContent.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/ui/composable/VerticalVolumePanelContent.kt
@@ -20,6 +20,7 @@
 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.fillMaxWidth
 import androidx.compose.foundation.layout.wrapContentHeight
 import androidx.compose.foundation.rememberScrollState
@@ -27,6 +28,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastSumBy
 import com.android.systemui.volume.panel.ui.layout.ComponentsLayout
 
 @Composable
@@ -53,6 +55,14 @@
                 modifier = Modifier.fillMaxWidth().wrapContentHeight(),
                 horizontalArrangement = Arrangement.spacedBy(if (isLargeScreen) 28.dp else 20.dp),
             ) {
+                val visibleComponentsCount =
+                    layout.footerComponents.fastSumBy { if (it.isVisible) 1 else 0 }
+
+                // Center footer component if there is only one present
+                if (visibleComponentsCount == 1) {
+                    Spacer(modifier = Modifier.weight(0.5f))
+                }
+
                 for (component in layout.footerComponents) {
                     AnimatedVisibility(
                         visible = component.isVisible,
@@ -63,6 +73,10 @@
                         }
                     }
                 }
+
+                if (visibleComponentsCount == 1) {
+                    Spacer(modifier = Modifier.weight(0.5f))
+                }
             }
         }
     }
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt
index 69f1d45..a8a1d88 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt
@@ -261,16 +261,19 @@
     scene: Scene,
     element: Element,
 ): Boolean {
-    val transition = layoutImpl.state.currentTransition
+    val transition = layoutImpl.state.currentTransition ?: return true
 
-    // Always draw the element if there is no ongoing transition or if the element is not shared or
-    // if the current scene is the one that is currently over scrolling with [OverscrollSpec].
-    if (
-        transition == null ||
-            transition.fromScene !in element.sceneStates ||
-            transition.toScene !in element.sceneStates ||
-            transition.currentOverscrollSpec?.scene == scene.key
-    ) {
+    val inFromScene = transition.fromScene in element.sceneStates
+    val inToScene = transition.toScene in element.sceneStates
+
+    // If an element is not present in any scene, it should not be drawn.
+    if (!inFromScene && !inToScene) {
+        return false
+    }
+
+    // Always draw if the element is not shared or if the current scene is the one that is currently
+    // over scrolling with [OverscrollSpec].
+    if (!inFromScene || !inToScene || transition.currentOverscrollSpec?.scene == scene.key) {
         return true
     }
 
@@ -385,6 +388,7 @@
             transformation = { it.alpha },
             idleValue = 1f,
             currentValue = { 1f },
+            isSpecified = { true },
             ::lerp,
         )
         .fastCoerceIn(0f, 1f)
@@ -422,6 +426,7 @@
             transformation = { it.size },
             idleValue = lookaheadSize,
             currentValue = { measurable.measure(constraints).also { maybePlaceable = it }.size() },
+            isSpecified = { it != Element.SizeUnspecified },
             ::lerp,
         )
 
@@ -447,6 +452,7 @@
         transformation = { it.drawScale },
         idleValue = Scale.Default,
         currentValue = { Scale.Default },
+        isSpecified = { true },
         ::lerp,
     )
 }
@@ -487,6 +493,7 @@
                 transformation = { it.offset },
                 idleValue = targetOffsetInScene,
                 currentValue = { currentOffset },
+                isSpecified = { it != Offset.Unspecified },
                 ::lerp,
             )
 
@@ -533,6 +540,7 @@
     transformation: (ElementTransformations) -> PropertyTransformation<T>?,
     idleValue: T,
     currentValue: () -> T,
+    isSpecified: (T) -> Boolean,
     lerp: (T, T, Float) -> T,
 ): T {
     val transition =
@@ -598,6 +606,11 @@
         val start = sceneValue(fromState!!)
         val end = sceneValue(toState!!)
 
+        // TODO(b/316901148): Remove checks to isSpecified() once the lookahead pass runs for all
+        // nodes before the intermediate layout pass.
+        if (!isSpecified(start)) return end
+        if (!isSpecified(end)) return start
+
         // Make sure we don't read progress if values are the same and we don't need to interpolate,
         // so we don't invalidate the phase where this is read.
         return if (start == end) start else lerp(start, end, transition.progress)
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt
index 2453e25..458a2b9 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt
@@ -45,6 +45,7 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.intermediateLayout
 import androidx.compose.ui.platform.LocalViewConfiguration
+import androidx.compose.ui.test.assertIsNotDisplayed
 import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
@@ -175,6 +176,60 @@
     }
 
     @Test
+    fun elementsNotInTransition_shouldNotBeDrawn() {
+        val nFrames = 20
+        val frameDuration = 16L
+        val tween = tween<Float>(nFrames * frameDuration.toInt())
+        val layoutSize = 100.dp
+        val elementSize = 50.dp
+        val elementOffset = 20.dp
+
+        lateinit var changeScene: (SceneKey) -> Unit
+
+        rule.testTransition(
+            from = TestScenes.SceneA,
+            to = TestScenes.SceneB,
+            transitionLayout = { currentScene, onChangeScene ->
+                changeScene = onChangeScene
+
+                SceneTransitionLayout(
+                    currentScene,
+                    onChangeScene,
+                    transitions {
+                        from(TestScenes.SceneA, to = TestScenes.SceneB) { spec = tween }
+                        from(TestScenes.SceneB, to = TestScenes.SceneC) { spec = tween }
+                    },
+                ) {
+                    scene(TestScenes.SceneA) {
+                        Box(Modifier.size(layoutSize)) {
+                            // Transformed element
+                            Element(
+                                TestElements.Bar,
+                                elementSize,
+                                elementOffset,
+                            )
+                        }
+                    }
+                    scene(TestScenes.SceneB) { Box(Modifier.size(layoutSize)) }
+                    scene(TestScenes.SceneC) { Box(Modifier.size(layoutSize)) }
+                }
+            },
+        ) {
+            // Start transition from SceneA to SceneB
+            at(1 * frameDuration) {
+                onElement(TestElements.Bar).assertExists()
+
+                // Start transition from SceneB to SceneC
+                changeScene(TestScenes.SceneC)
+            }
+
+            at(2 * frameDuration) { onElement(TestElements.Bar).assertIsNotDisplayed() }
+
+            at(3 * frameDuration) { onElement(TestElements.Bar).assertDoesNotExist() }
+        }
+    }
+
+    @Test
     fun onlyMovingElements_noLayout_onlyPlacement() {
         val nFrames = 20
         val layoutSize = 100.dp
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 cea49e1..003c572 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
@@ -27,7 +27,9 @@
 import android.text.format.DateFormat
 import android.util.AttributeSet
 import android.util.MathUtils.constrainedMap
+import android.util.TypedValue
 import android.view.View
+import android.view.View.MeasureSpec.EXACTLY
 import android.widget.TextView
 import com.android.app.animation.Interpolators
 import com.android.internal.annotations.VisibleForTesting
@@ -42,6 +44,7 @@
 import java.util.Calendar
 import java.util.Locale
 import java.util.TimeZone
+import kotlin.math.min
 
 /**
  * Displays the time with the hour positioned above the minutes. (ie: 09 above 30 is 9:30)
@@ -85,6 +88,8 @@
     private var textAnimator: TextAnimator? = null
     private var onTextAnimatorInitialized: Runnable? = null
 
+    // last text size which is not constrained by view height
+    private var lastUnconstrainedTextSize: Float = Float.MAX_VALUE
     @VisibleForTesting var textAnimatorFactory: (Layout, () -> Unit) -> TextAnimator =
         { layout, invalidateCb ->
             TextAnimator(layout, NUM_CLOCK_FONT_ANIMATION_STEPS, invalidateCb) }
@@ -185,9 +190,22 @@
         refreshFormat()
     }
 
+    override fun setTextSize(type: Int, size: Float) {
+        super.setTextSize(type, size)
+        if (type == TypedValue.COMPLEX_UNIT_PX) {
+            lastUnconstrainedTextSize = size
+        }
+    }
+
     @SuppressLint("DrawAllocation")
     override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
         logger.d("onMeasure")
+        if (migratedClocks && !isSingleLineInternal &&
+                MeasureSpec.getMode(heightMeasureSpec) == EXACTLY) {
+            // Call straight into TextView.setTextSize to avoid setting lastUnconstrainedTextSize
+            super.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+                    min(lastUnconstrainedTextSize, MeasureSpec.getSize(heightMeasureSpec) / 2F))
+        }
         super.onMeasure(widthMeasureSpec, heightMeasureSpec)
         val animator = textAnimator
         if (animator == null) {
@@ -517,24 +535,12 @@
         val currentMoveAmount = left - clockStartLeft
         val digitOffsetDirection = if (isLayoutRtl) -1 else 1
         for (i in 0 until NUM_DIGITS) {
-            // The delay for the digit, in terms of fraction (i.e. the digit should not move
-            // during 0.0 - 0.1).
-            val digitInitialDelay =
-                    if (isMovingToCenter) {
-                        moveToCenterDelays[i] * MOVE_DIGIT_STEP
-                    } else {
-                        moveToSideDelays[i] * MOVE_DIGIT_STEP
-                    }
             val digitFraction =
-                    MOVE_INTERPOLATOR.getInterpolation(
-                            constrainedMap(
-                                    0.0f,
-                                    1.0f,
-                                    digitInitialDelay,
-                                    digitInitialDelay + AVAILABLE_ANIMATION_TIME,
-                                    moveFraction
-                            )
-                    )
+                getDigitFraction(
+                    digit = i,
+                    isMovingToCenter = isMovingToCenter,
+                    fraction = moveFraction,
+                )
             val moveAmountForDigit = currentMoveAmount * digitFraction
             val moveAmountDeltaForDigit = moveAmountForDigit - currentMoveAmount
             glyphOffsets[i] = digitOffsetDirection * moveAmountDeltaForDigit
@@ -542,6 +548,57 @@
         invalidate()
     }
 
+    /**
+     * Offsets the glyphs of the clock for the step clock animation.
+     *
+     * The animation makes the glyphs of the clock move at different speeds, when the clock is
+     * moving horizontally. This method uses direction, distance, and fraction to determine offset.
+     *
+     * @param distance is the total distance in pixels to offset the glyphs when animation
+     *   completes. Negative distance means we are animating the position towards the center.
+     * @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,
+    ) {
+        for (i in 0 until NUM_DIGITS) {
+            val dir = if (isLayoutRtl) -1 else 1
+            val digitFraction =
+                getDigitFraction(digit = i, isMovingToCenter = distance > 0, fraction = fraction)
+            val moveAmountForDigit = dir * distance * digitFraction
+            glyphOffsets[i] = moveAmountForDigit
+
+            if (distance > 0) {
+                // If distance > 0 then we are moving from the left towards the center.
+                // We need ensure that the glyphs are offset to the initial position.
+                glyphOffsets[i] -= dir * distance
+            }
+        }
+        invalidate()
+    }
+
+    private fun getDigitFraction(digit: Int, isMovingToCenter: Boolean, fraction: Float): Float {
+        // The delay for the digit, in terms of fraction (i.e. the digit should not move
+        // during 0.0 - 0.1).
+        val digitInitialDelay =
+            if (isMovingToCenter) {
+                moveToCenterDelays[digit] * MOVE_DIGIT_STEP
+            } else {
+                moveToSideDelays[digit] * MOVE_DIGIT_STEP
+            }
+        return MOVE_INTERPOLATOR.getInterpolation(
+                constrainedMap(
+                    0.0f,
+                    1.0f,
+                    digitInitialDelay,
+                    digitInitialDelay + AVAILABLE_ANIMATION_TIME,
+                    fraction,
+                )
+            )
+    }
+
     // DateFormat.getBestDateTimePattern is extremely expensive, and refresh is called often.
     // This is an optimization to ensure we only recompute the patterns when the inputs change.
     private object Patterns {
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
index 54c7a08..b392014 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
@@ -232,6 +232,10 @@
         fun offsetGlyphsForStepClockAnimation(fromLeft: Int, direction: Int, fraction: Float) {
             view.offsetGlyphsForStepClockAnimation(fromLeft, direction, fraction)
         }
+
+        fun offsetGlyphsForStepClockAnimation(distance: Float, fraction: Float) {
+            view.offsetGlyphsForStepClockAnimation(distance, fraction)
+        }
     }
 
     inner class DefaultClockEvents : ClockEvents {
@@ -316,6 +320,8 @@
         }
 
         override fun onPositionUpdated(fromLeft: Int, direction: Int, fraction: Float) {}
+
+        override fun onPositionUpdated(distance: Float, fraction: Float) {}
     }
 
     inner class LargeClockAnimations(
@@ -326,6 +332,10 @@
         override fun onPositionUpdated(fromLeft: Int, direction: Int, fraction: Float) {
             largeClock.offsetGlyphsForStepClockAnimation(fromLeft, direction, fraction)
         }
+
+        override fun onPositionUpdated(distance: Float, fraction: Float) {
+            largeClock.offsetGlyphsForStepClockAnimation(distance, fraction)
+        }
     }
 
     class AnimationState(
diff --git a/packages/SystemUI/docs/scene.md b/packages/SystemUI/docs/scene.md
index 105e438..f331c9bf 100644
--- a/packages/SystemUI/docs/scene.md
+++ b/packages/SystemUI/docs/scene.md
@@ -65,25 +65,23 @@
 [`SceneContainerFlags.kt`](https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt)
 file evalutes to `true`.
 
-1.  Set **`SCENE_CONTAINER_ENABLED`** to `true` in the
-    [`Flags.kt`](https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/packages/SystemUI/src/com/android/systemui/flags/Flags.kt)
-    file
-2.  Set the **`migrate_keyguard_status_bar_view`** classic flag to `true` by
+1.  Set the **`migrate_keyguard_status_bar_view`** classic flag to `true` by
     running: `console $ adb shell statusbar cmd migrate_keyguard_status_bar_view
     true`
-3.  Set a collection of **aconfig flags** to `true` by running the following
+2.  Set a collection of **aconfig flags** to `true` by running the following
     commands:
     ```console
     $ adb shell device_config put systemui com.android.systemui.scene_container true
+    $ adb shell device_config put systemui com.android.systemui.compose_lockscreen true
     $ adb shell device_config put systemui com.android.systemui.keyguard_bottom_area_refactor true
-    $ adb shell device_config put systemui com.android.systemui.keyguard_shade_migration_nssl true
     $ adb shell device_config put systemui com.android.systemui.media_in_scene_container true
+    $ adb shell device_config put systemui com.android.systemui.migrate_clocks_to_blueprint true
     ```
-4.  **Restart** System UI by issuing the following command:
+3.  **Restart** System UI by issuing the following command:
     ```console
     $ adb shell am crash com.android.systemui
     ```
-5.  **Verify** that the scene framework was turned on. There are two ways to do
+4.  **Verify** that the scene framework was turned on. There are two ways to do
     this:
 
     *(a)* look for the sash/ribbon UI at the bottom-right corner of the display:
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
index 9dbeeda..2d4b63e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
@@ -47,15 +47,16 @@
 import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants
 import com.android.systemui.classifier.FalsingA11yDelegate
 import com.android.systemui.classifier.FalsingCollector
-import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
 import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
 import com.android.systemui.flags.FakeFeatureFlags
 import com.android.systemui.flags.Flags
 import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository
+import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.log.SessionTracker
@@ -65,6 +66,7 @@
 import com.android.systemui.scene.domain.interactor.SceneInteractor
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
+import com.android.systemui.scene.shared.flag.sceneContainerFlags
 import com.android.systemui.scene.shared.model.FakeSceneDataSource
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.shared.model.fakeSceneDataSource
@@ -208,7 +210,6 @@
 
         val keyguardKeyboardInteractor = KeyguardKeyboardInteractor(FakeKeyboardRepository())
         featureFlags = FakeFeatureFlags()
-        featureFlags.set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false)
         featureFlags.set(Flags.LOCKSCREEN_ENABLE_LANDSCAPE, false)
 
         mSetFlagsRule.enableFlags(
@@ -216,7 +217,8 @@
         )
         mSetFlagsRule.disableFlags(
             FLAG_SIDEFPS_CONTROLLER_REFACTOR,
-            AConfigFlags.FLAG_KEYGUARD_WM_STATE_REFACTOR
+            AConfigFlags.FLAG_KEYGUARD_WM_STATE_REFACTOR,
+            AConfigFlags.FLAG_REFACTOR_KEYGUARD_DISMISS_INTENT,
         )
 
         keyguardPasswordViewController =
@@ -266,7 +268,7 @@
                 falsingManager,
                 userSwitcherController,
                 featureFlags,
-                kosmos.fakeSceneContainerFlags,
+                kosmos.sceneContainerFlags,
                 globalSettings,
                 sessionTracker,
                 Optional.of(sideFpsController),
@@ -832,7 +834,9 @@
 
             // While listening, going from the bouncer scene to the gone scene, does dismiss the
             // keyguard.
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             runCurrent()
             fakeSceneDataSource.pause()
             sceneInteractor.changeScene(Scenes.Gone, "reason")
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt
index cb8cebf..81878aa 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt
@@ -179,10 +179,14 @@
                 setAutoConfirmFeatureEnabled(true)
             }
             assertThat(isAutoConfirmEnabled).isTrue()
-            val shorterPin =
-                FakeAuthenticationRepository.DEFAULT_PIN.toMutableList().apply { removeLast() }
+            val defaultPin = FakeAuthenticationRepository.DEFAULT_PIN.toMutableList()
 
-            assertSkipped(underTest.authenticate(shorterPin, tryAutoConfirm = true))
+            assertSkipped(
+                underTest.authenticate(
+                    defaultPin.subList(0, defaultPin.size - 1),
+                    tryAutoConfirm = true
+                )
+            )
             assertThat(underTest.lockoutEndTimestamp).isNull()
             assertThat(kosmos.fakeAuthenticationRepository.lockoutStartedReportCount).isEqualTo(0)
         }
@@ -201,7 +205,6 @@
 
             assertFailed(
                 underTest.authenticate(wrongPin, tryAutoConfirm = true),
-                assertNoResultEvents = true,
             )
         }
 
@@ -219,7 +222,6 @@
 
             assertFailed(
                 underTest.authenticate(longerPin, tryAutoConfirm = true),
-                assertNoResultEvents = true,
             )
         }
 
@@ -547,14 +549,9 @@
 
     private fun assertFailed(
         authenticationResult: AuthenticationResult,
-        assertNoResultEvents: Boolean = false,
     ) {
         assertThat(authenticationResult).isEqualTo(AuthenticationResult.FAILED)
-        if (assertNoResultEvents) {
-            assertThat(onAuthenticationResult).isNull()
-        } else {
-            assertThat(onAuthenticationResult).isFalse()
-        }
+        assertThat(onAuthenticationResult).isFalse()
     }
 
     private fun assertSkipped(
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 343280d..289896e01 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
@@ -444,6 +444,17 @@
                 AdditionalMatchers.aryEq(credentialAttestation));
     }
 
+    @Test
+    public void testSendsReasonContentViewMoreOptions_whenButtonPressed() throws Exception {
+        showDialog(new int[]{1} /* sensorIds */, false /* credentialAllowed */);
+        mAuthController.onDismissed(AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS,
+                null, /* credentialAttestation */
+                mAuthController.mCurrentDialog.getRequestId());
+        verify(mReceiver).onDialogDismissed(
+                eq(BiometricPrompt.DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS),
+                eq(null) /* credentialAttestation */);
+    }
+
     // Statusbar tests
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
index f8321b7..07e9815 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
@@ -60,9 +60,12 @@
 import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractorImpl
 import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
 import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
 import com.android.systemui.display.data.repository.FakeDisplayRepository
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.res.R
 import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
@@ -158,6 +161,9 @@
                 FakeBiometricSettingsRepository(),
                 FakeSystemClock(),
                 mock(KeyguardUpdateMonitor::class.java),
+                { mock(DeviceEntryFingerprintAuthInteractor::class.java) },
+                { mock(KeyguardInteractor::class.java) },
+                { mock(KeyguardTransitionInteractor::class.java) },
                 testScope.backgroundScope,
             )
         displayStateInteractor =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java
index 324534f..7986051 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java
@@ -105,7 +105,7 @@
         when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(false);
         when(mView.getUnpausedAlpha()).thenReturn(255);
         when(mShadeExpansionStateManager.addExpansionListener(any())).thenReturn(
-                new ShadeExpansionChangeEvent(0, false, false, 0));
+                new ShadeExpansionChangeEvent(0, false, false));
         mController = createUdfpsKeyguardViewController();
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
index b253309..d88260f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
@@ -24,14 +24,18 @@
 import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
 import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository
 import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepositoryImpl
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
 import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
 import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.log.table.TableLogBuffer
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.statusbar.policy.KeyguardStateController
 import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.time.FakeSystemClock
 import com.android.systemui.util.time.SystemClock
+import dagger.Lazy
 import kotlinx.coroutines.test.TestScope
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
@@ -39,6 +43,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mock
+import org.mockito.Mockito.mock
 import org.mockito.MockitoAnnotations
 
 @SmallTest
@@ -81,10 +86,19 @@
                 biometricSettingsRepository,
                 systemClock,
                 keyguardUpdateMonitor,
+                Lazy { mock(DeviceEntryFingerprintAuthInteractor::class.java) },
+                Lazy { mock(KeyguardInteractor::class.java) },
+                Lazy { mock(KeyguardTransitionInteractor::class.java) },
                 TestScope().backgroundScope,
             )
     }
 
+    @Test(expected = IllegalStateException::class)
+    fun enableUdfpsRefactor_deprecatedShowMethod_throwsIllegalStateException() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
+        underTest.show()
+    }
+
     @Test
     fun canShowAlternateBouncerForFingerprint_givenCanShow() {
         givenCanShowAlternateBouncer()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModelTest.kt
index 16ec9aa..f9f7df8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModelTest.kt
@@ -122,7 +122,6 @@
             repeat(FakeAuthenticationRepository.MAX_FAILED_AUTH_TRIES_BEFORE_LOCKOUT) {
                 bouncerInteractor.authenticate(WRONG_PIN)
             }
-            assertThat(message?.isUpdateAnimated).isFalse()
 
             val lockoutEndMs = authenticationInteractor.lockoutEndTimestamp ?: 0
             advanceTimeBy(lockoutEndMs - testScope.currentTime)
@@ -133,6 +132,7 @@
     fun lockoutMessage() =
         testScope.runTest {
             val message by collectLastValue(underTest.message)
+            val lockoutSeconds = FakeAuthenticationRepository.LOCKOUT_DURATION_SECONDS
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(Pin)
             assertThat(kosmos.fakeAuthenticationRepository.lockoutEndTimestamp).isNull()
             runCurrent()
@@ -140,14 +140,14 @@
             repeat(FakeAuthenticationRepository.MAX_FAILED_AUTH_TRIES_BEFORE_LOCKOUT) { times ->
                 bouncerInteractor.authenticate(WRONG_PIN)
                 runCurrent()
-                if (times < FakeAuthenticationRepository.MAX_FAILED_AUTH_TRIES_BEFORE_LOCKOUT - 1) {
+                if (times == FakeAuthenticationRepository.MAX_FAILED_AUTH_TRIES_BEFORE_LOCKOUT) {
+                    assertTryAgainMessage(message?.text, lockoutSeconds)
+                    assertThat(message?.isUpdateAnimated).isFalse()
+                } else {
                     assertThat(message?.text).isEqualTo("Wrong PIN. Try again.")
                     assertThat(message?.isUpdateAnimated).isTrue()
                 }
             }
-            val lockoutSeconds = FakeAuthenticationRepository.LOCKOUT_DURATION_SECONDS
-            assertTryAgainMessage(message?.text, lockoutSeconds)
-            assertThat(message?.isUpdateAnimated).isFalse()
 
             repeat(FakeAuthenticationRepository.LOCKOUT_DURATION_SECONDS) { time ->
                 advanceTimeBy(1.seconds)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt
index 71c5785..c28cf34 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt
@@ -27,7 +27,6 @@
 import com.android.systemui.bouncer.domain.interactor.bouncerInteractor
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.coroutines.collectValues
-import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
 import com.android.systemui.inputmethod.data.model.InputMethodModel
 import com.android.systemui.inputmethod.data.repository.fakeInputMethodRepository
 import com.android.systemui.inputmethod.domain.interactor.inputMethodInteractor
@@ -153,7 +152,6 @@
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Password
             )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(false)
             switchToScene(Scenes.Bouncer)
 
             // No input entered.
@@ -329,7 +327,6 @@
         kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
             AuthenticationMethodModel.Password
         )
-        kosmos.fakeDeviceEntryRepository.setUnlocked(false)
         switchToScene(Scenes.Bouncer)
     }
 
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 51b73ee9..14d3634 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
@@ -28,7 +28,6 @@
 import com.android.systemui.authentication.shared.model.AuthenticationPatternCoordinate as Point
 import com.android.systemui.bouncer.domain.interactor.bouncerInteractor
 import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.res.R
 import com.android.systemui.scene.domain.interactor.sceneInteractor
@@ -373,7 +372,6 @@
         kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
             AuthenticationMethodModel.Pattern
         )
-        kosmos.fakeDeviceEntryRepository.setUnlocked(false)
         switchToScene(Scenes.Bouncer)
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt
index 5647954..5bb36a0 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt
@@ -28,7 +28,6 @@
 import com.android.systemui.bouncer.domain.interactor.bouncerInteractor
 import com.android.systemui.bouncer.domain.interactor.simBouncerInteractor
 import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.res.R
 import com.android.systemui.scene.domain.interactor.sceneInteractor
@@ -253,7 +252,14 @@
     @Test
     fun onAutoConfirm_whenCorrect() =
         testScope.runTest {
+            // TODO(b/332768183) remove this after the bug if fixed.
+            // Collect the flow so that it is hot, in the real application this is done by using a
+            // refreshingFlow that relies on the UI to make this flow hot.
+            val autoConfirmEnabled by
+                collectLastValue(authenticationInteractor.isAutoConfirmEnabled)
             kosmos.fakeAuthenticationRepository.setAutoConfirmFeatureEnabled(true)
+
+            assertThat(autoConfirmEnabled).isTrue()
             val authResult by collectLastValue(authenticationInteractor.onAuthenticationResult)
             lockDeviceAndOpenPinBouncer()
 
@@ -265,9 +271,17 @@
     @Test
     fun onAutoConfirm_whenWrong() =
         testScope.runTest {
+            // TODO(b/332768183) remove this after the bug if fixed.
+            // Collect the flow so that it is hot, in the real application this is done by using a
+            // refreshingFlow that relies on the UI to make this flow hot.
+            val autoConfirmEnabled by
+                collectLastValue(authenticationInteractor.isAutoConfirmEnabled)
+
             val currentScene by collectLastValue(sceneInteractor.currentScene)
             val pin by collectLastValue(underTest.pinInput.map { it.getPin() })
             kosmos.fakeAuthenticationRepository.setAutoConfirmFeatureEnabled(true)
+
+            assertThat(autoConfirmEnabled).isTrue()
             lockDeviceAndOpenPinBouncer()
 
             FakeAuthenticationRepository.DEFAULT_PIN.dropLast(1).forEach { digit ->
@@ -387,7 +401,6 @@
 
     private fun TestScope.lockDeviceAndOpenPinBouncer() {
         kosmos.fakeAuthenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Pin)
-        kosmos.fakeDeviceEntryRepository.setUnlocked(false)
         switchToScene(Scenes.Bouncer)
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/data/repository/BrightnessPolicyRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/data/repository/BrightnessPolicyRepositoryImplTest.kt
new file mode 100644
index 0000000..312c14d
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/data/repository/BrightnessPolicyRepositoryImplTest.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.brightness.data.repository
+
+import android.content.applicationContext
+import android.os.UserManager
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+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.user.data.repository.userRepository
+import com.android.systemui.util.mockito.any
+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.utils.PolicyRestriction
+import com.android.systemui.utils.UserRestrictionChecker
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyString
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class BrightnessPolicyRepositoryImplTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+
+    private val fakeUserRepository = kosmos.fakeUserRepository
+
+    private val mockUserRestrictionChecker: UserRestrictionChecker = mock {
+        whenever(checkIfRestrictionEnforced(any(), anyString(), anyInt())).thenReturn(null)
+        whenever(hasBaseUserRestriction(any(), anyString(), anyInt())).thenReturn(false)
+    }
+
+    private val underTest =
+        with(kosmos) {
+            BrightnessPolicyRepositoryImpl(
+                userRepository,
+                mockUserRestrictionChecker,
+                applicationContext,
+                testDispatcher,
+            )
+        }
+
+    @Test
+    fun noRestrictionByDefaultForAllUsers() =
+        with(kosmos) {
+            testScope.runTest {
+                val restrictions by collectLastValue(underTest.restrictionPolicy)
+
+                assertThat(restrictions).isEqualTo(PolicyRestriction.NoRestriction)
+
+                fakeUserRepository.asMainUser()
+
+                assertThat(restrictions).isEqualTo(PolicyRestriction.NoRestriction)
+            }
+        }
+
+    @Test
+    fun restrictDefaultUser() =
+        with(kosmos) {
+            testScope.runTest {
+                val enforcedAdmin: EnforcedAdmin =
+                    EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(RESTRICTION)
+
+                whenever(
+                        mockUserRestrictionChecker.checkIfRestrictionEnforced(
+                            any(),
+                            eq(RESTRICTION),
+                            eq(userRepository.getSelectedUserInfo().id)
+                        )
+                    )
+                    .thenReturn(enforcedAdmin)
+
+                val restrictions by collectLastValue(underTest.restrictionPolicy)
+
+                assertThat(restrictions).isEqualTo(PolicyRestriction.Restricted(enforcedAdmin))
+
+                fakeUserRepository.asMainUser()
+
+                assertThat(restrictions).isEqualTo(PolicyRestriction.NoRestriction)
+            }
+        }
+
+    @Test
+    fun restrictMainUser() =
+        with(kosmos) {
+            testScope.runTest {
+                val enforcedAdmin: EnforcedAdmin =
+                    EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(RESTRICTION)
+
+                whenever(
+                        mockUserRestrictionChecker.checkIfRestrictionEnforced(
+                            any(),
+                            eq(RESTRICTION),
+                            eq(userRepository.mainUserId)
+                        )
+                    )
+                    .thenReturn(enforcedAdmin)
+
+                val restrictions by collectLastValue(underTest.restrictionPolicy)
+
+                assertThat(restrictions).isEqualTo(PolicyRestriction.NoRestriction)
+
+                fakeUserRepository.asMainUser()
+
+                assertThat(restrictions).isEqualTo(PolicyRestriction.Restricted(enforcedAdmin))
+            }
+        }
+
+    private companion object {
+        val RESTRICTION = UserManager.DISALLOW_CONFIG_BRIGHTNESS
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/data/repository/ScreenBrightnessDisplayManagerRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/data/repository/ScreenBrightnessDisplayManagerRepositoryTest.kt
new file mode 100644
index 0000000..e39ad4f
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/data/repository/ScreenBrightnessDisplayManagerRepositoryTest.kt
@@ -0,0 +1,249 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.brightness.data.repository
+
+import android.hardware.display.BrightnessInfo
+import android.hardware.display.BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE
+import android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF
+import android.hardware.display.DisplayManager
+import android.hardware.display.DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS
+import android.view.Display
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.brightness.data.model.LinearBrightness
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
+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.whenever
+import com.google.common.truth.Truth.assertThat
+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.ArgumentMatchers.anyFloat
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.Mock
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class ScreenBrightnessDisplayManagerRepositoryTest : SysuiTestCase() {
+    @Rule @JvmField val mockitoRule: MockitoRule = MockitoJUnit.rule()
+
+    private val kosmos = testKosmos()
+
+    private var currentBrightnessInfo = BrightnessInfo()
+
+    @Mock private lateinit var displayManager: DisplayManager
+    @Mock private lateinit var display: Display
+
+    private val displayId = 0
+
+    private lateinit var underTest: ScreenBrightnessDisplayManagerRepository
+
+    @Before
+    fun setUp() {
+        underTest =
+            ScreenBrightnessDisplayManagerRepository(
+                displayId,
+                displayManager,
+                kosmos.applicationCoroutineScope,
+                kosmos.testDispatcher,
+            )
+
+        whenever(displayManager.getDisplay(displayId)).thenReturn(display)
+        // Using then answer so it will be retrieved in every call
+        whenever(display.brightnessInfo).thenAnswer { currentBrightnessInfo }
+    }
+
+    @Test
+    fun startingBrightnessInfo() =
+        with(kosmos) {
+            testScope.runTest {
+                val brightness by collectLastValue(underTest.linearBrightness)
+                val minBrightness by collectLastValue(underTest.minLinearBrightness)
+                val maxBrightness by collectLastValue(underTest.maxLinearBrightness)
+                runCurrent()
+
+                assertThat(brightness?.floatValue).isEqualTo(currentBrightnessInfo.brightness)
+                assertThat(minBrightness?.floatValue)
+                    .isEqualTo(currentBrightnessInfo.brightnessMinimum)
+                assertThat(maxBrightness?.floatValue)
+                    .isEqualTo(currentBrightnessInfo.brightnessMaximum)
+            }
+        }
+
+    @Test
+    fun followsChangingBrightnessInfo() =
+        with(kosmos) {
+            testScope.runTest {
+                val listenerCaptor = argumentCaptor<DisplayManager.DisplayListener>()
+
+                val brightness by collectLastValue(underTest.linearBrightness)
+                val minBrightness by collectLastValue(underTest.minLinearBrightness)
+                val maxBrightness by collectLastValue(underTest.maxLinearBrightness)
+                runCurrent()
+
+                verify(displayManager)
+                    .registerDisplayListener(
+                        capture(listenerCaptor),
+                        eq(null),
+                        eq(EVENT_FLAG_DISPLAY_BRIGHTNESS),
+                    )
+
+                val newBrightness = BrightnessInfo(0.6f, 0.3f, 0.9f)
+                changeBrightnessInfoAndNotify(newBrightness, listenerCaptor.value)
+
+                assertThat(brightness?.floatValue).isEqualTo(currentBrightnessInfo.brightness)
+                assertThat(minBrightness?.floatValue)
+                    .isEqualTo(currentBrightnessInfo.brightnessMinimum)
+                assertThat(maxBrightness?.floatValue)
+                    .isEqualTo(currentBrightnessInfo.brightnessMaximum)
+            }
+        }
+
+    @Test
+    fun minMaxWhenNotCollecting() =
+        with(kosmos) {
+            testScope.runTest {
+                currentBrightnessInfo = BrightnessInfo(0.5f, 0.1f, 0.7f)
+                val (min, max) = underTest.getMinMaxLinearBrightness()
+                assertThat(min.floatValue).isEqualTo(currentBrightnessInfo.brightnessMinimum)
+                assertThat(max.floatValue).isEqualTo(currentBrightnessInfo.brightnessMaximum)
+            }
+        }
+
+    @Test
+    fun minMaxWhenCollecting() =
+        with(kosmos) {
+            testScope.runTest {
+                val listenerCaptor = argumentCaptor<DisplayManager.DisplayListener>()
+
+                val brightness by collectLastValue(underTest.linearBrightness)
+                runCurrent()
+
+                verify(displayManager)
+                    .registerDisplayListener(
+                        capture(listenerCaptor),
+                        eq(null),
+                        eq(EVENT_FLAG_DISPLAY_BRIGHTNESS),
+                    )
+
+                changeBrightnessInfoAndNotify(
+                    BrightnessInfo(0.5f, 0.1f, 0.7f),
+                    listenerCaptor.value
+                )
+                runCurrent()
+
+                val (min, max) = underTest.getMinMaxLinearBrightness()
+                assertThat(min.floatValue).isEqualTo(currentBrightnessInfo.brightnessMinimum)
+                assertThat(max.floatValue).isEqualTo(currentBrightnessInfo.brightnessMaximum)
+            }
+        }
+
+    @Test
+    fun setTemporaryBrightness_insideBounds() =
+        with(kosmos) {
+            testScope.runTest {
+                val brightness = 0.3f
+                underTest.setTemporaryBrightness(LinearBrightness(brightness))
+                runCurrent()
+
+                verify(displayManager).setTemporaryBrightness(displayId, brightness)
+                verify(displayManager, never()).setBrightness(anyInt(), anyFloat())
+            }
+        }
+
+    @Test
+    fun setTemporaryBrightness_outsideBounds() =
+        with(kosmos) {
+            testScope.runTest {
+                val brightness = 1.3f
+                underTest.setTemporaryBrightness(LinearBrightness(brightness))
+                runCurrent()
+
+                verify(displayManager)
+                    .setTemporaryBrightness(displayId, currentBrightnessInfo.brightnessMaximum)
+                verify(displayManager, never()).setBrightness(anyInt(), anyFloat())
+            }
+        }
+
+    @Test
+    fun setBrightness_insideBounds() =
+        with(kosmos) {
+            testScope.runTest {
+                val brightness = 0.3f
+                underTest.setBrightness(LinearBrightness(brightness))
+                runCurrent()
+
+                verify(displayManager).setBrightness(displayId, brightness)
+                verify(displayManager, never()).setTemporaryBrightness(anyInt(), anyFloat())
+            }
+        }
+
+    @Test
+    fun setBrightness_outsideBounds() =
+        with(kosmos) {
+            testScope.runTest {
+                val brightness = 1.3f
+                underTest.setBrightness(LinearBrightness(brightness))
+                runCurrent()
+
+                verify(displayManager)
+                    .setBrightness(displayId, currentBrightnessInfo.brightnessMaximum)
+                verify(displayManager, never()).setTemporaryBrightness(anyInt(), anyFloat())
+            }
+        }
+
+    private fun changeBrightnessInfoAndNotify(
+        newValue: BrightnessInfo,
+        listener: DisplayManager.DisplayListener,
+    ) {
+        currentBrightnessInfo = newValue
+        listener.onDisplayChanged(displayId)
+    }
+
+    companion object {
+        fun BrightnessInfo(
+            brightness: Float = 0f,
+            minBrightness: Float = 0f,
+            maxBrightness: Float = 1f,
+        ): BrightnessInfo {
+            return BrightnessInfo(
+                brightness,
+                minBrightness,
+                maxBrightness,
+                HIGH_BRIGHTNESS_MODE_OFF,
+                1f,
+                BRIGHTNESS_MAX_REASON_NONE,
+            )
+        }
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/domain/interactor/BrightnessPolicyEnforcementInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/domain/interactor/BrightnessPolicyEnforcementInteractorTest.kt
new file mode 100644
index 0000000..85a4bcf
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/domain/interactor/BrightnessPolicyEnforcementInteractorTest.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.systemui.brightness.domain.interactor
+
+import android.content.ComponentName
+import android.content.Intent
+import android.os.UserHandle
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.settingslib.RestrictedLockUtils
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.brightness.data.repository.BrightnessPolicyRepository
+import com.android.systemui.brightness.data.repository.brightnessPolicyRepository
+import com.android.systemui.brightness.data.repository.fakeBrightnessPolicyRepository
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.plugins.activityStarter
+import com.android.systemui.testKosmos
+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.utils.PolicyRestriction
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.verify
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class BrightnessPolicyEnforcementInteractorTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+
+    private val mockActivityStarter = kosmos.activityStarter
+    private val fakeBrightnessPolicyEnforcementInteractor = kosmos.fakeBrightnessPolicyRepository
+
+    private val underTest =
+        with(kosmos) {
+            BrightnessPolicyEnforcementInteractor(
+                brightnessPolicyRepository,
+                activityStarter,
+            )
+        }
+
+    @Test
+    fun restriction() =
+        with(kosmos) {
+            testScope.runTest {
+                fakeBrightnessPolicyRepository.setCurrentUserUnrestricted()
+
+                val restriction by collectLastValue(underTest.brightnessPolicyRestriction)
+
+                assertThat(restriction).isEqualTo(PolicyRestriction.NoRestriction)
+
+                fakeBrightnessPolicyRepository.setCurrentUserRestricted()
+
+                assertThat(restriction).isInstanceOf(PolicyRestriction.Restricted::class.java)
+            }
+        }
+
+    @Test
+    fun startRestrictionDialog() =
+        with(kosmos) {
+            testScope.runTest {
+                val enforcedAdmin =
+                    EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(
+                            BrightnessPolicyRepository.RESTRICTION
+                        )
+                        .apply {
+                            component = TEST_COMPONENT
+                            user = UserHandle.of(TEST_USER)
+                        }
+
+                underTest.startAdminSupportDetailsDialog(
+                    PolicyRestriction.Restricted(enforcedAdmin)
+                )
+
+                val intentCaptor = argumentCaptor<Intent>()
+
+                verify(mockActivityStarter)
+                    .postStartActivityDismissingKeyguard(
+                        capture(intentCaptor),
+                        eq(0),
+                    )
+
+                val expectedIntent =
+                    RestrictedLockUtils.getShowAdminSupportDetailsIntent(enforcedAdmin)
+
+                with(intentCaptor.value) {
+                    assertThat(action).isEqualTo(expectedIntent.action)
+                    assertThat(extras!!.kindofEquals(expectedIntent.extras)).isTrue()
+                }
+            }
+        }
+
+    private companion object {
+        val TEST_COMPONENT = ComponentName("pkg", ".cls")
+        val TEST_USER = 10
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorTest.kt
new file mode 100644
index 0000000..33c44f8
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorTest.kt
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.brightness.domain.interactor
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.settingslib.display.BrightnessUtils
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.brightness.data.model.LinearBrightness
+import com.android.systemui.brightness.data.repository.fakeScreenBrightnessRepository
+import com.android.systemui.brightness.data.repository.screenBrightnessRepository
+import com.android.systemui.brightness.shared.GammaBrightness
+import com.android.systemui.coroutines.collectLastValue
+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
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class ScreenBrightnessInteractorTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+
+    private val underTest = ScreenBrightnessInteractor(kosmos.screenBrightnessRepository)
+
+    @Test
+    fun gammaBrightness() =
+        with(kosmos) {
+            testScope.runTest {
+                val gammaBrightness by collectLastValue(underTest.gammaBrightness)
+
+                val brightness = 0.3f
+                val min = 0f
+                val max = 1f
+
+                with(fakeScreenBrightnessRepository) {
+                    setBrightness(LinearBrightness(brightness))
+                    setMinMaxBrightness(LinearBrightness(min), LinearBrightness(max))
+                }
+                runCurrent()
+
+                assertThat(gammaBrightness?.value)
+                    .isEqualTo(BrightnessUtils.convertLinearToGammaFloat(brightness, min, max))
+            }
+        }
+
+    @Test
+    fun gammaBrightness_constrained() =
+        with(kosmos) {
+            testScope.runTest {
+                val gammaBrightness by collectLastValue(underTest.gammaBrightness)
+
+                val brightness = 0.3f
+                val min = 0.2f
+                val max = 0.8f
+
+                with(fakeScreenBrightnessRepository) {
+                    setBrightness(LinearBrightness(brightness))
+                    setMinMaxBrightness(LinearBrightness(min), LinearBrightness(max))
+                }
+                runCurrent()
+
+                assertThat(gammaBrightness?.value)
+                    .isEqualTo(BrightnessUtils.convertLinearToGammaFloat(brightness, min, max))
+            }
+        }
+
+    @Test
+    fun setTemporaryBrightness() =
+        with(kosmos) {
+            testScope.runTest {
+                val temporaryBrightness by
+                    collectLastValue(fakeScreenBrightnessRepository.temporaryBrightness)
+                val brightness by collectLastValue(underTest.gammaBrightness)
+
+                val gammaBrightness = 30000
+                underTest.setTemporaryBrightness(GammaBrightness(gammaBrightness))
+
+                val (min, max) = fakeScreenBrightnessRepository.getMinMaxLinearBrightness()
+
+                val expectedTemporaryBrightness =
+                    BrightnessUtils.convertGammaToLinearFloat(
+                        gammaBrightness,
+                        min.floatValue,
+                        max.floatValue
+                    )
+                assertThat(temporaryBrightness!!.floatValue)
+                    .isWithin(1e-5f)
+                    .of(expectedTemporaryBrightness)
+                assertThat(brightness!!.value).isNotEqualTo(gammaBrightness)
+            }
+        }
+
+    @Test
+    fun setBrightness() =
+        with(kosmos) {
+            testScope.runTest {
+                val brightness by collectLastValue(fakeScreenBrightnessRepository.linearBrightness)
+
+                val gammaBrightness = 30000
+                underTest.setBrightness(GammaBrightness(gammaBrightness))
+
+                val (min, max) = fakeScreenBrightnessRepository.getMinMaxLinearBrightness()
+
+                val expectedBrightness =
+                    BrightnessUtils.convertGammaToLinearFloat(
+                        gammaBrightness,
+                        min.floatValue,
+                        max.floatValue
+                    )
+                assertThat(brightness!!.floatValue).isWithin(1e-5f).of(expectedBrightness)
+            }
+        }
+
+    @Test
+    fun maxGammaBrightness() {
+        assertThat(underTest.maxGammaBrightness)
+            .isEqualTo(GammaBrightness(BrightnessUtils.GAMMA_SPACE_MAX))
+    }
+
+    @Test
+    fun minGammaBrightness() {
+        assertThat(underTest.minGammaBrightness)
+            .isEqualTo(GammaBrightness(BrightnessUtils.GAMMA_SPACE_MIN))
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt
new file mode 100644
index 0000000..0058ee4
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.brightness.ui.viewmodel
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.settingslib.display.BrightnessUtils
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.brightness.data.model.LinearBrightness
+import com.android.systemui.brightness.data.repository.fakeScreenBrightnessRepository
+import com.android.systemui.brightness.domain.interactor.brightnessPolicyEnforcementInteractor
+import com.android.systemui.brightness.domain.interactor.screenBrightnessInteractor
+import com.android.systemui.brightness.shared.GammaBrightness
+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.coroutines.collectLastValue
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.res.R
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class BrightnessSliderViewModelTest : SysuiTestCase() {
+
+    private val minBrightness = 0f
+    private val maxBrightness = 1f
+
+    private val kosmos = testKosmos()
+
+    private val underTest =
+        with(kosmos) {
+            BrightnessSliderViewModel(
+                screenBrightnessInteractor,
+                brightnessPolicyEnforcementInteractor,
+            )
+        }
+
+    @Before
+    fun setUp() {
+        kosmos.fakeScreenBrightnessRepository.setMinMaxBrightness(
+            LinearBrightness(minBrightness),
+            LinearBrightness(maxBrightness)
+        )
+    }
+
+    @Test
+    fun brightnessChangeInRepository_changeInFlow() =
+        with(kosmos) {
+            testScope.runTest {
+                val gammaBrightness by collectLastValue(underTest.currentBrightness)
+
+                var brightness = 0.6f
+                fakeScreenBrightnessRepository.setBrightness(LinearBrightness(brightness))
+
+                assertThat(gammaBrightness!!.value)
+                    .isEqualTo(
+                        BrightnessUtils.convertLinearToGammaFloat(
+                            brightness,
+                            minBrightness,
+                            maxBrightness
+                        )
+                    )
+
+                brightness = 0.2f
+                fakeScreenBrightnessRepository.setBrightness(LinearBrightness(brightness))
+
+                assertThat(gammaBrightness!!.value)
+                    .isEqualTo(
+                        BrightnessUtils.convertLinearToGammaFloat(
+                            brightness,
+                            minBrightness,
+                            maxBrightness
+                        )
+                    )
+            }
+        }
+
+    @Test
+    fun maxGammaBrightness() {
+        assertThat(underTest.maxBrightness)
+            .isEqualTo(GammaBrightness(BrightnessUtils.GAMMA_SPACE_MAX))
+    }
+
+    @Test
+    fun minGammaBrightness() {
+        assertThat(underTest.minBrightness)
+            .isEqualTo(GammaBrightness(BrightnessUtils.GAMMA_SPACE_MIN))
+    }
+
+    @Test
+    fun dragging_temporaryBrightnessSet_currentBrightnessDoesntChange() =
+        with(kosmos) {
+            testScope.runTest {
+                val temporaryBrightness by
+                    collectLastValue(fakeScreenBrightnessRepository.temporaryBrightness)
+                val brightness by collectLastValue(underTest.currentBrightness)
+
+                val newBrightness = underTest.maxBrightness.value / 3
+                val expectedTemporaryBrightness =
+                    BrightnessUtils.convertGammaToLinearFloat(
+                        newBrightness,
+                        minBrightness,
+                        maxBrightness
+                    )
+                val drag = Drag.Dragging(GammaBrightness(newBrightness))
+
+                underTest.onDrag(drag)
+
+                assertThat(temporaryBrightness!!.floatValue)
+                    .isWithin(1e-5f)
+                    .of(expectedTemporaryBrightness)
+                assertThat(brightness!!.value).isNotEqualTo(newBrightness)
+            }
+        }
+
+    @Test
+    fun draggingStopped_currentBrightnessChanges() =
+        with(kosmos) {
+            testScope.runTest {
+                val brightness by collectLastValue(underTest.currentBrightness)
+
+                val newBrightness = underTest.maxBrightness.value / 3
+                val drag = Drag.Stopped(GammaBrightness(newBrightness))
+
+                underTest.onDrag(drag)
+
+                assertThat(brightness!!.value).isEqualTo(newBrightness)
+            }
+        }
+
+    @Test
+    fun label() {
+        assertThat(underTest.label)
+            .isEqualTo(Text.Resource(R.string.quick_settings_brightness_dialog_title))
+    }
+
+    @Test
+    fun icon() {
+        assertThat(underTest.icon)
+            .isEqualTo(
+                Icon.Resource(
+                    R.drawable.ic_brightness_full,
+                    ContentDescription.Resource(underTest.label.res),
+                )
+            )
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt
index 43266bf..a944afb 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt
@@ -88,7 +88,7 @@
             testScope.runTest {
                 val scene by collectLastValue(communalInteractor.desiredScene)
 
-                communalInteractor.onSceneChanged(CommunalScenes.Communal)
+                communalInteractor.changeScene(CommunalScenes.Communal)
                 assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
                 fakeKeyguardTransitionRepository.sendTransitionSteps(
@@ -158,7 +158,7 @@
         with(kosmos) {
             testScope.runTest {
                 val scene by collectLastValue(communalInteractor.desiredScene)
-                communalInteractor.onSceneChanged(CommunalScenes.Communal)
+                communalInteractor.changeScene(CommunalScenes.Communal)
                 assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
                 fakeKeyguardTransitionRepository.sendTransitionSteps(
@@ -179,7 +179,7 @@
         with(kosmos) {
             testScope.runTest {
                 val scene by collectLastValue(communalInteractor.desiredScene)
-                communalInteractor.onSceneChanged(CommunalScenes.Communal)
+                communalInteractor.changeScene(CommunalScenes.Communal)
                 assertThat(scene).isEqualTo(CommunalScenes.Communal)
 
                 fakeKeyguardTransitionRepository.sendTransitionSteps(
@@ -207,7 +207,7 @@
     fun dockingOnLockscreen_forcesCommunal() =
         with(kosmos) {
             testScope.runTest {
-                communalInteractor.onSceneChanged(CommunalScenes.Blank)
+                communalInteractor.changeScene(CommunalScenes.Blank)
                 val scene by collectLastValue(communalInteractor.desiredScene)
 
                 // device is docked while on the lockscreen
@@ -229,7 +229,7 @@
     fun dockingOnLockscreen_doesNotForceCommunalIfDreamStarts() =
         with(kosmos) {
             testScope.runTest {
-                communalInteractor.onSceneChanged(CommunalScenes.Blank)
+                communalInteractor.changeScene(CommunalScenes.Blank)
                 val scene by collectLastValue(communalInteractor.desiredScene)
 
                 // device is docked while on the lockscreen
@@ -261,7 +261,7 @@
             testScope.runTest {
                 // Device is dreaming and on communal.
                 fakeKeyguardRepository.setDreaming(true)
-                communalInteractor.onSceneChanged(CommunalScenes.Communal)
+                communalInteractor.changeScene(CommunalScenes.Communal)
 
                 val scene by collectLastValue(communalInteractor.desiredScene)
                 assertThat(scene).isEqualTo(CommunalScenes.Communal)
@@ -278,7 +278,7 @@
             testScope.runTest {
                 // Device is not dreaming and on communal.
                 fakeKeyguardRepository.setDreaming(false)
-                communalInteractor.onSceneChanged(CommunalScenes.Communal)
+                communalInteractor.changeScene(CommunalScenes.Communal)
 
                 // Scene stays as Communal
                 advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
@@ -293,7 +293,7 @@
             testScope.runTest {
                 // Device is dreaming and on communal.
                 fakeKeyguardRepository.setDreaming(true)
-                communalInteractor.onSceneChanged(CommunalScenes.Communal)
+                communalInteractor.changeScene(CommunalScenes.Communal)
 
                 val scene by collectLastValue(communalInteractor.desiredScene)
                 assertThat(scene).isEqualTo(CommunalScenes.Communal)
@@ -316,7 +316,7 @@
             testScope.runTest {
                 // Device is on communal, but not dreaming.
                 fakeKeyguardRepository.setDreaming(false)
-                communalInteractor.onSceneChanged(CommunalScenes.Communal)
+                communalInteractor.changeScene(CommunalScenes.Communal)
 
                 val scene by collectLastValue(communalInteractor.desiredScene)
                 assertThat(scene).isEqualTo(CommunalScenes.Communal)
@@ -338,7 +338,7 @@
             testScope.runTest {
                 // Device is dreaming and on communal.
                 fakeKeyguardRepository.setDreaming(true)
-                communalInteractor.onSceneChanged(CommunalScenes.Communal)
+                communalInteractor.changeScene(CommunalScenes.Communal)
 
                 val scene by collectLastValue(communalInteractor.desiredScene)
                 assertThat(scene).isEqualTo(CommunalScenes.Communal)
@@ -367,7 +367,7 @@
 
                 // Device is dreaming and on communal.
                 fakeKeyguardRepository.setDreaming(true)
-                communalInteractor.onSceneChanged(CommunalScenes.Communal)
+                communalInteractor.changeScene(CommunalScenes.Communal)
 
                 val scene by collectLastValue(communalInteractor.desiredScene)
                 assertThat(scene).isEqualTo(CommunalScenes.Communal)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalPrefsRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalPrefsRepositoryImplTest.kt
index 6bff0dc7..5e120b5 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalPrefsRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalPrefsRepositoryImplTest.kt
@@ -16,11 +16,15 @@
 
 package com.android.systemui.communal.data.repository
 
+import android.content.Context
+import android.content.Intent
 import android.content.SharedPreferences
 import android.content.pm.UserInfo
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.backup.BackupHelper
+import com.android.systemui.broadcast.broadcastDispatcher
 import com.android.systemui.communal.data.repository.CommunalPrefsRepositoryImpl.Companion.FILE_NAME
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.kosmos.testDispatcher
@@ -34,16 +38,22 @@
 import com.android.systemui.util.FakeSharedPreferences
 import com.google.common.truth.Truth.assertThat
 import java.io.File
+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
+import org.mockito.Mockito.atLeastOnce
+import org.mockito.Mockito.clearInvocations
+import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(AndroidJUnit4::class)
[email protected]
 class CommunalPrefsRepositoryImplTest : SysuiTestCase() {
     @Mock private lateinit var tableLogBuffer: TableLogBuffer
 
@@ -69,20 +79,12 @@
                     USER_INFOS[1].id to FakeSharedPreferences()
                 )
             )
-        underTest =
-            CommunalPrefsRepositoryImpl(
-                testScope.backgroundScope,
-                kosmos.testDispatcher,
-                userRepository,
-                userFileManager,
-                logcatLogBuffer("CommunalPrefsRepositoryImplTest"),
-                tableLogBuffer,
-            )
     }
 
     @Test
     fun isCtaDismissedValue_byDefault_isFalse() =
         testScope.runTest {
+            underTest = createCommunalPrefsRepositoryImpl(userFileManager)
             val isCtaDismissed by collectLastValue(underTest.isCtaDismissed)
             assertThat(isCtaDismissed).isFalse()
         }
@@ -90,6 +92,7 @@
     @Test
     fun isCtaDismissedValue_onSet_isTrue() =
         testScope.runTest {
+            underTest = createCommunalPrefsRepositoryImpl(userFileManager)
             val isCtaDismissed by collectLastValue(underTest.isCtaDismissed)
 
             underTest.setCtaDismissedForCurrentUser()
@@ -99,6 +102,7 @@
     @Test
     fun isCtaDismissedValue_whenSwitchUser() =
         testScope.runTest {
+            underTest = createCommunalPrefsRepositoryImpl(userFileManager)
             val isCtaDismissed by collectLastValue(underTest.isCtaDismissed)
             underTest.setCtaDismissedForCurrentUser()
 
@@ -118,6 +122,44 @@
             assertThat(isCtaDismissed).isTrue()
         }
 
+    @Test
+    fun getSharedPreferences_whenFileRestored() =
+        testScope.runTest {
+            val userFileManagerSpy = Mockito.spy(userFileManager)
+            underTest = createCommunalPrefsRepositoryImpl(userFileManagerSpy)
+
+            val isCtaDismissed by collectLastValue(underTest.isCtaDismissed)
+            userRepository.setSelectedUserInfo(USER_INFOS[0])
+            assertThat(isCtaDismissed).isFalse()
+            clearInvocations(userFileManagerSpy)
+
+            // Received restore finished event.
+            kosmos.broadcastDispatcher.sendIntentToMatchingReceiversOnly(
+                context,
+                Intent(BackupHelper.ACTION_RESTORE_FINISHED),
+            )
+            runCurrent()
+
+            // Get shared preferences from the restored file.
+            verify(userFileManagerSpy, atLeastOnce())
+                .getSharedPreferences(
+                    FILE_NAME,
+                    Context.MODE_PRIVATE,
+                    userRepository.getSelectedUserInfo().id
+                )
+        }
+
+    private fun createCommunalPrefsRepositoryImpl(userFileManager: UserFileManager) =
+        CommunalPrefsRepositoryImpl(
+            testScope.backgroundScope,
+            kosmos.testDispatcher,
+            userRepository,
+            userFileManager,
+            kosmos.broadcastDispatcher,
+            logcatLogBuffer("CommunalPrefsRepositoryImplTest"),
+            tableLogBuffer,
+        )
+
     private class FakeUserFileManager(private val sharedPrefs: Map<Int, SharedPreferences>) :
         UserFileManager {
         override fun getFile(fileName: String, userId: Int): File {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalRepositoryImplTest.kt
index 43acf31..2d78a9b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalRepositoryImplTest.kt
@@ -22,36 +22,26 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.applicationCoroutineScope
 import com.android.systemui.kosmos.testScope
-import com.android.systemui.scene.data.repository.sceneContainerRepository
-import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
+import com.android.systemui.scene.shared.model.sceneDataSource
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.runTest
-import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class CommunalRepositoryImplTest : SysuiTestCase() {
-    private lateinit var underTest: CommunalRepositoryImpl
 
     private val kosmos = testKosmos()
     private val testScope = kosmos.testScope
-    private val sceneContainerRepository = kosmos.sceneContainerRepository
-
-    @Before
-    fun setUp() {
-        underTest = createRepositoryImpl(false)
-    }
-
-    private fun createRepositoryImpl(sceneContainerEnabled: Boolean): CommunalRepositoryImpl {
-        return CommunalRepositoryImpl(
-            testScope.backgroundScope,
-            kosmos.fakeSceneContainerFlags.apply { enabled = sceneContainerEnabled },
-            sceneContainerRepository,
+    private val underTest by lazy {
+        CommunalRepositoryImpl(
+            kosmos.applicationCoroutineScope,
+            kosmos.sceneDataSource,
         )
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalSettingsRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalSettingsRepositoryImplTest.kt
index 6b28319..f71121c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalSettingsRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalSettingsRepositoryImplTest.kt
@@ -25,13 +25,13 @@
 import android.content.pm.UserInfo
 import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
+import android.provider.Settings
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.broadcast.broadcastDispatcher
 import com.android.systemui.communal.data.model.DisabledReason
-import com.android.systemui.communal.data.repository.CommunalSettingsRepositoryImpl.Companion.GLANCEABLE_HUB_ENABLED
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.flags.Flags.COMMUNAL_SERVICE_ENABLED
 import com.android.systemui.flags.fakeFeatureFlagsClassic
@@ -95,15 +95,27 @@
     @Test
     fun hubIsDisabledByUser() =
         testScope.runTest {
-            kosmos.fakeSettings.putIntForUser(GLANCEABLE_HUB_ENABLED, 0, PRIMARY_USER.id)
+            kosmos.fakeSettings.putIntForUser(
+                Settings.Secure.GLANCEABLE_HUB_ENABLED,
+                0,
+                PRIMARY_USER.id
+            )
             val enabledState by collectLastValue(underTest.getEnabledState(PRIMARY_USER))
             assertThat(enabledState?.enabled).isFalse()
             assertThat(enabledState).containsExactly(DisabledReason.DISABLED_REASON_USER_SETTING)
 
-            kosmos.fakeSettings.putIntForUser(GLANCEABLE_HUB_ENABLED, 1, SECONDARY_USER.id)
+            kosmos.fakeSettings.putIntForUser(
+                Settings.Secure.GLANCEABLE_HUB_ENABLED,
+                1,
+                SECONDARY_USER.id
+            )
             assertThat(enabledState?.enabled).isFalse()
 
-            kosmos.fakeSettings.putIntForUser(GLANCEABLE_HUB_ENABLED, 1, PRIMARY_USER.id)
+            kosmos.fakeSettings.putIntForUser(
+                Settings.Secure.GLANCEABLE_HUB_ENABLED,
+                1,
+                PRIMARY_USER.id
+            )
             assertThat(enabledState?.enabled).isTrue()
         }
 
@@ -126,7 +138,11 @@
             val enabledState by collectLastValue(underTest.getEnabledState(PRIMARY_USER))
             assertThat(enabledState?.enabled).isTrue()
 
-            kosmos.fakeSettings.putIntForUser(GLANCEABLE_HUB_ENABLED, 0, PRIMARY_USER.id)
+            kosmos.fakeSettings.putIntForUser(
+                Settings.Secure.GLANCEABLE_HUB_ENABLED,
+                0,
+                PRIMARY_USER.id
+            )
             setKeyguardFeaturesDisabled(PRIMARY_USER, KEYGUARD_DISABLE_WIDGETS_ALL)
 
             assertThat(enabledState?.enabled).isFalse()
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 a5707e1..e7ccde2 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
@@ -482,7 +482,7 @@
             assertThat(desiredScene()).isEqualTo(CommunalScenes.Blank)
 
             val targetScene = CommunalScenes.Communal
-            communalRepository.setDesiredScene(targetScene)
+            communalRepository.changeScene(targetScene)
             desiredScene = collectLastValue(underTest.desiredScene)
             runCurrent()
             assertThat(desiredScene()).isEqualTo(targetScene)
@@ -493,9 +493,9 @@
         testScope.runTest {
             val targetScene = CommunalScenes.Communal
 
-            underTest.onSceneChanged(targetScene)
+            underTest.changeScene(targetScene)
 
-            val desiredScene = collectLastValue(communalRepository.desiredScene)
+            val desiredScene = collectLastValue(communalRepository.currentScene)
             runCurrent()
             assertThat(desiredScene()).isEqualTo(targetScene)
         }
@@ -508,7 +508,7 @@
 
             val desiredScene by collectLastValue(underTest.desiredScene)
 
-            underTest.onSceneChanged(CommunalScenes.Communal)
+            underTest.changeScene(CommunalScenes.Communal)
             assertThat(desiredScene).isEqualTo(CommunalScenes.Communal)
 
             kosmos.setCommunalAvailable(false)
@@ -659,7 +659,7 @@
             runCurrent()
             assertThat(isCommunalShowing()).isEqualTo(false)
 
-            underTest.onSceneChanged(CommunalScenes.Communal)
+            underTest.changeScene(CommunalScenes.Communal)
 
             isCommunalShowing = collectLastValue(underTest.isCommunalShowing)
             runCurrent()
@@ -683,12 +683,12 @@
             assertThat(isCommunalShowing).isFalse()
 
             // Verify scene changes (without the flag) to communal sets the value to true
-            underTest.onSceneChanged(CommunalScenes.Communal)
+            underTest.changeScene(CommunalScenes.Communal)
             runCurrent()
             assertThat(isCommunalShowing).isTrue()
 
             // Verify scene changes (without the flag) to blank sets the value back to false
-            underTest.onSceneChanged(CommunalScenes.Blank)
+            underTest.changeScene(CommunalScenes.Blank)
             runCurrent()
             assertThat(isCommunalShowing).isFalse()
         }
@@ -704,7 +704,7 @@
             assertThat(isCommunalShowing).isFalse()
 
             // Verify scene changes without the flag doesn't have any impact
-            underTest.onSceneChanged(CommunalScenes.Communal)
+            underTest.changeScene(CommunalScenes.Communal)
             runCurrent()
             assertThat(isCommunalShowing).isFalse()
 
@@ -817,6 +817,13 @@
         }
 
     @Test
+    fun showWidgetEditor_openWidgetPickerOnStart_startsActivity() =
+        testScope.runTest {
+            underTest.showWidgetEditor(shouldOpenWidgetPickerOnStart = true)
+            verify(editWidgetsActivityStarter).startActivity(shouldOpenWidgetPickerOnStart = true)
+        }
+
+    @Test
     fun navigateToCommunalWidgetSettings_startsActivity() =
         testScope.runTest {
             underTest.navigateToCommunalWidgetSettings()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractorTest.kt
index 50b8da6..3a23e14 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractorTest.kt
@@ -158,7 +158,7 @@
             kosmos.setCommunalAvailable(true)
             communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_NOT_STARTED)
 
-            communalInteractor.onSceneChanged(CommunalScenes.Blank)
+            communalInteractor.changeScene(CommunalScenes.Blank)
 
             assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_NOT_STARTED)
         }
@@ -171,7 +171,7 @@
             goToCommunal()
             communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_STARTED)
 
-            communalInteractor.onSceneChanged(CommunalScenes.Blank)
+            communalInteractor.changeScene(CommunalScenes.Blank)
 
             assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_COMPLETED)
         }
@@ -184,13 +184,13 @@
             goToCommunal()
             communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_COMPLETED)
 
-            communalInteractor.onSceneChanged(CommunalScenes.Blank)
+            communalInteractor.changeScene(CommunalScenes.Blank)
 
             assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_COMPLETED)
         }
 
     private suspend fun goToCommunal() {
         kosmos.setCommunalAvailable(true)
-        communalInteractor.onSceneChanged(CommunalScenes.Communal)
+        communalInteractor.changeScene(CommunalScenes.Communal)
     }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt
index a7e98ea..9aebc30 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt
@@ -149,13 +149,11 @@
             val communalContent by collectLastValue(underTest.communalContent)
 
             // Only Widgets and CTA tile are shown.
-            assertThat(communalContent?.size).isEqualTo(3)
+            assertThat(communalContent?.size).isEqualTo(2)
             assertThat(communalContent?.get(0))
                 .isInstanceOf(CommunalContentModel.WidgetContent::class.java)
             assertThat(communalContent?.get(1))
                 .isInstanceOf(CommunalContentModel.WidgetContent::class.java)
-            assertThat(communalContent?.get(2))
-                .isInstanceOf(CommunalContentModel.CtaTileInEditMode::class.java)
         }
 
     @Test
@@ -195,24 +193,20 @@
             val communalContent by collectLastValue(underTest.communalContent)
 
             // Widgets and CTA tile are shown.
-            assertThat(communalContent?.size).isEqualTo(3)
+            assertThat(communalContent?.size).isEqualTo(2)
             assertThat(communalContent?.get(0))
                 .isInstanceOf(CommunalContentModel.WidgetContent::class.java)
             assertThat(communalContent?.get(1))
                 .isInstanceOf(CommunalContentModel.WidgetContent::class.java)
-            assertThat(communalContent?.get(2))
-                .isInstanceOf(CommunalContentModel.CtaTileInEditMode::class.java)
 
             underTest.onDeleteWidget(widgets.get(0).appWidgetId)
 
             // Only one widget and CTA tile remain.
-            assertThat(communalContent?.size).isEqualTo(2)
+            assertThat(communalContent?.size).isEqualTo(1)
             val item = communalContent?.get(0)
             val appWidgetId =
                 if (item is CommunalContentModel.WidgetContent) item.appWidgetId else null
             assertThat(appWidgetId).isEqualTo(widgets.get(1).appWidgetId)
-            assertThat(communalContent?.get(1))
-                .isInstanceOf(CommunalContentModel.CtaTileInEditMode::class.java)
         }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt
index 8f802b8..5be765d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt
@@ -194,6 +194,41 @@
         }
 
     @Test
+    fun isEmptyState_isTrue_noWidgetButActiveLiveContent() =
+        testScope.runTest {
+            tutorialRepository.setTutorialSettingState(Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED)
+
+            widgetRepository.setCommunalWidgets(emptyList())
+            // UMO playing
+            mediaRepository.mediaActive()
+            smartspaceRepository.setCommunalSmartspaceTargets(emptyList())
+
+            val isEmptyState by collectLastValue(underTest.isEmptyState)
+            assertThat(isEmptyState).isTrue()
+        }
+
+    @Test
+    fun isEmptyState_isFalse_withWidgets() =
+        testScope.runTest {
+            tutorialRepository.setTutorialSettingState(Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED)
+
+            widgetRepository.setCommunalWidgets(
+                listOf(
+                    CommunalWidgetContentModel(
+                        appWidgetId = 1,
+                        priority = 1,
+                        providerInfo = providerInfo,
+                    )
+                ),
+            )
+            mediaRepository.mediaInactive()
+            smartspaceRepository.setCommunalSmartspaceTargets(emptyList())
+
+            val isEmptyState by collectLastValue(underTest.isEmptyState)
+            assertThat(isEmptyState).isFalse()
+        }
+
+    @Test
     fun dismissCta_hidesCtaTileAndShowsPopup_thenHidesPopupAfterTimeout() =
         testScope.runTest {
             tutorialRepository.setTutorialSettingState(Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostStartableTest.kt
index 2c9d72c..6cae5d3 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostStartableTest.kt
@@ -19,11 +19,11 @@
 import android.appwidget.AppWidgetProviderInfo
 import android.content.pm.UserInfo
 import android.os.UserHandle
+import android.provider.Settings
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.communal.data.repository.CommunalSettingsRepositoryImpl.Companion.GLANCEABLE_HUB_ENABLED
 import com.android.systemui.communal.data.repository.fakeCommunalWidgetRepository
 import com.android.systemui.communal.domain.interactor.communalInteractor
 import com.android.systemui.communal.shared.model.CommunalWidgetContentModel
@@ -220,7 +220,11 @@
             fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
             fakeKeyguardRepository.setKeyguardShowing(true)
             val settingsValue = if (available) 1 else 0
-            fakeSettings.putIntForUser(GLANCEABLE_HUB_ENABLED, settingsValue, MAIN_USER_INFO.id)
+            fakeSettings.putIntForUser(
+                Settings.Secure.GLANCEABLE_HUB_ENABLED,
+                settingsValue,
+                MAIN_USER_INFO.id
+            )
         }
 
     private fun createWidgetForUser(appWidgetId: Int, userId: Int): CommunalWidgetContentModel =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepositoryTest.kt
index 36919d0..8bc6a00 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepositoryTest.kt
@@ -32,7 +32,6 @@
 import android.hardware.face.FaceSensorProperties
 import android.hardware.face.FaceSensorPropertiesInternal
 import android.os.CancellationSignal
-import android.view.Display
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.internal.logging.InstanceId.fakeInstanceId
@@ -54,7 +53,6 @@
 import com.android.systemui.deviceentry.shared.model.FaceDetectionStatus
 import com.android.systemui.deviceentry.shared.model.HelpFaceAuthenticationStatus
 import com.android.systemui.deviceentry.shared.model.SuccessFaceAuthenticationStatus
-import com.android.systemui.display.data.repository.display
 import com.android.systemui.display.data.repository.displayRepository
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.flags.FakeFeatureFlags
@@ -697,9 +695,7 @@
             )
             runCurrent()
 
-            displayRepository.emit(setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_OFF)))
-            displayRepository.emitDisplayChangeEvent(Display.DEFAULT_DISPLAY)
-
+            displayRepository.setDefaultDisplayOff(true)
             runCurrent()
 
             assertThat(canFaceAuthRun()).isTrue()
@@ -717,10 +713,7 @@
                 )
                 runCurrent()
 
-                displayRepository.emit(
-                    setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_OFF))
-                )
-                displayRepository.emitDisplayChangeEvent(Display.DEFAULT_DISPLAY)
+                displayRepository.setDefaultDisplayOff(true)
             }
         }
 
@@ -1161,8 +1154,7 @@
         faceLockoutResetCallback.value.onLockoutReset(0)
         bouncerRepository.setAlternateVisible(true)
         keyguardRepository.setKeyguardShowing(true)
-        displayRepository.emit(setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_ON)))
-        displayRepository.emitDisplayChangeEvent(Display.DEFAULT_DISPLAY)
+        displayRepository.setDefaultDisplayOff(false)
         keyguardTransitionRepository.sendTransitionSteps(
             from = KeyguardState.AOD,
             to = KeyguardState.LOCKSCREEN,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepositoryTest.kt
index 9536084..73373d55 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepositoryTest.kt
@@ -5,15 +5,11 @@
 import androidx.test.filters.SmallTest
 import com.android.internal.widget.LockPatternUtils
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
 import com.android.systemui.kosmos.testDispatcher
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.statusbar.phone.KeyguardBypassController
-import com.android.systemui.statusbar.policy.KeyguardStateController
 import com.android.systemui.testKosmos
 import com.android.systemui.user.data.repository.FakeUserRepository
-import com.android.systemui.util.mockito.argumentCaptor
 import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.mockito.withArgCaptor
 import com.google.common.truth.Truth.assertThat
@@ -25,7 +21,6 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mock
-import org.mockito.Mockito
 import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
 
@@ -37,12 +32,10 @@
 
     @Mock private lateinit var lockPatternUtils: LockPatternUtils
     @Mock private lateinit var keyguardBypassController: KeyguardBypassController
-    @Mock private lateinit var keyguardStateController: KeyguardStateController
 
     private val kosmos = testKosmos()
     private val testScope = kosmos.testScope
     private val userRepository = FakeUserRepository()
-    private val keyguardRepository = FakeKeyguardRepository()
 
     private lateinit var underTest: DeviceEntryRepository
 
@@ -59,35 +52,9 @@
                 userRepository = userRepository,
                 lockPatternUtils = lockPatternUtils,
                 keyguardBypassController = keyguardBypassController,
-                keyguardStateController = keyguardStateController,
-                keyguardRepository = keyguardRepository,
             )
         testScope.runCurrent()
     }
-
-    @Test
-    fun isUnlocked() =
-        testScope.runTest {
-            whenever(keyguardStateController.isUnlocked).thenReturn(false)
-            val isUnlocked by collectLastValue(underTest.isUnlocked)
-
-            runCurrent()
-            assertThat(isUnlocked).isFalse()
-
-            val captor = argumentCaptor<KeyguardStateController.Callback>()
-            verify(keyguardStateController, Mockito.atLeastOnce()).addCallback(captor.capture())
-
-            whenever(keyguardStateController.isUnlocked).thenReturn(true)
-            captor.value.onUnlockedChanged()
-            runCurrent()
-            assertThat(isUnlocked).isTrue()
-
-            whenever(keyguardStateController.isUnlocked).thenReturn(false)
-            captor.value.onKeyguardShowingChanged()
-            runCurrent()
-            assertThat(isUnlocked).isFalse()
-        }
-
     @Test
     fun isLockscreenEnabled() =
         testScope.runTest {
@@ -102,17 +69,6 @@
         }
 
     @Test
-    fun reportSuccessfulAuthentication_updatesIsUnlocked() =
-        testScope.runTest {
-            val isUnlocked by collectLastValue(underTest.isUnlocked)
-            assertThat(isUnlocked).isFalse()
-
-            underTest.reportSuccessfulAuthentication()
-
-            assertThat(isUnlocked).isTrue()
-        }
-
-    @Test
     fun isBypassEnabled_disabledInController() =
         testScope.runTest {
             whenever(keyguardBypassController.isBypassEnabled).thenAnswer { false }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt
index 70ceb2a..5caf35b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt
@@ -41,8 +41,10 @@
 import com.android.systemui.flags.fakeSystemPropertiesHelper
 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.fakeTrustRepository
 import com.android.systemui.keyguard.shared.model.AuthenticationFlags
+import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
@@ -89,22 +91,8 @@
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.None
             )
-            kosmos.fakeDeviceEntryRepository.apply {
-                setLockscreenEnabled(false)
-
-                // Toggle isUnlocked, twice.
-                //
-                // This is done because the underTest.isUnlocked flow doesn't receive values from
-                // just changing the state above; the actual isUnlocked state needs to change to
-                // cause the logic under test to "pick up" the current state again.
-                //
-                // It is done twice to make sure that we don't actually change the isUnlocked state
-                // from what it originally was.
-                setUnlocked(!isUnlocked.value)
-                runCurrent()
-                setUnlocked(!isUnlocked.value)
-                runCurrent()
-            }
+            kosmos.fakeDeviceEntryRepository.apply { setLockscreenEnabled(false) }
+            runCurrent()
 
             val isUnlocked by collectLastValue(underTest.isUnlocked)
             assertThat(isUnlocked).isTrue()
@@ -125,7 +113,9 @@
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Sim
             )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
 
             val isUnlocked by collectLastValue(underTest.isUnlocked)
             assertThat(isUnlocked).isFalse()
@@ -271,7 +261,6 @@
     @Test
     fun isAuthenticationRequired_lockedAndSecured_true() =
         testScope.runTest {
-            kosmos.fakeDeviceEntryRepository.setUnlocked(false)
             runCurrent()
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Password
@@ -283,7 +272,6 @@
     @Test
     fun isAuthenticationRequired_lockedAndNotSecured_false() =
         testScope.runTest {
-            kosmos.fakeDeviceEntryRepository.setUnlocked(false)
             runCurrent()
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.None
@@ -295,7 +283,9 @@
     @Test
     fun isAuthenticationRequired_unlockedAndSecured_false() =
         testScope.runTest {
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             runCurrent()
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Password
@@ -307,7 +297,9 @@
     @Test
     fun isAuthenticationRequired_unlockedAndNotSecured_false() =
         testScope.runTest {
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             runCurrent()
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.None
@@ -333,7 +325,9 @@
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Pin
             )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             runCurrent()
 
             underTest.attemptDeviceEntry()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractorTest.kt
index 51db451..a7a7bea3 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractorTest.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.deviceentry.domain.interactor
 
+import android.content.pm.UserInfo
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
@@ -24,16 +25,30 @@
 import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
+import com.android.systemui.deviceentry.shared.model.DeviceUnlockSource
+import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFaceAuthRepository
+import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
+import com.android.systemui.keyguard.data.repository.fakeTrustRepository
+import com.android.systemui.keyguard.domain.interactor.trustInteractor
+import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
 import com.android.systemui.kosmos.testScope
+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.testKosmos
+import com.android.systemui.user.data.model.SelectionStatus
+import com.android.systemui.user.data.repository.fakeUserRepository
 import com.google.common.truth.Truth.assertThat
+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
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(AndroidJUnit4::class)
[email protected]
 class DeviceUnlockedInteractorTest : SysuiTestCase() {
 
     private val kosmos = testKosmos()
@@ -46,71 +61,170 @@
             applicationScope = testScope.backgroundScope,
             authenticationInteractor = kosmos.authenticationInteractor,
             deviceEntryRepository = deviceEntryRepository,
+            trustInteractor = kosmos.trustInteractor,
+            faceAuthInteractor = kosmos.deviceEntryFaceAuthInteractor,
+            fingerprintAuthInteractor = kosmos.deviceEntryFingerprintAuthInteractor,
+            powerInteractor = kosmos.powerInteractor,
         )
 
-    @Test
-    fun isDeviceUnlocked_whenUnlockedAndAuthMethodIsNone_isTrue() =
-        testScope.runTest {
-            val isUnlocked by collectLastValue(underTest.isDeviceUnlocked)
+    @Before
+    fun setup() {
+        kosmos.fakeUserRepository.setUserInfos(listOf(primaryUser, secondaryUser))
+    }
 
-            deviceEntryRepository.setUnlocked(true)
+    @Test
+    fun deviceUnlockStatus_whenUnlockedAndAuthMethodIsNone_isTrue() =
+        testScope.runTest {
+            val deviceUnlockStatus by collectLastValue(underTest.deviceUnlockStatus)
+
             authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.None)
 
-            assertThat(isUnlocked).isTrue()
+            assertThat(deviceUnlockStatus?.isUnlocked).isTrue()
+            assertThat(deviceUnlockStatus?.deviceUnlockSource).isNull()
         }
 
     @Test
-    fun isDeviceUnlocked_whenUnlockedAndAuthMethodIsPin_isTrue() =
+    fun deviceUnlockStatus_whenUnlockedAndAuthMethodIsPin_isTrue() =
         testScope.runTest {
-            val isUnlocked by collectLastValue(underTest.isDeviceUnlocked)
+            val deviceUnlockStatus by collectLastValue(underTest.deviceUnlockStatus)
 
-            deviceEntryRepository.setUnlocked(true)
             authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Pin)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
+            runCurrent()
 
-            assertThat(isUnlocked).isTrue()
+            assertThat(deviceUnlockStatus?.isUnlocked).isTrue()
+            assertThat(deviceUnlockStatus?.deviceUnlockSource)
+                .isEqualTo(DeviceUnlockSource.Fingerprint)
         }
 
     @Test
-    fun isDeviceUnlocked_whenUnlockedAndAuthMethodIsSim_isFalse() =
+    fun deviceUnlockStatus_whenUnlockedAndAuthMethodIsSim_isFalse() =
         testScope.runTest {
-            val isUnlocked by collectLastValue(underTest.isDeviceUnlocked)
+            val deviceUnlockStatus by collectLastValue(underTest.deviceUnlockStatus)
 
-            deviceEntryRepository.setUnlocked(true)
             authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Sim)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
+            runCurrent()
 
-            assertThat(isUnlocked).isFalse()
+            assertThat(deviceUnlockStatus?.isUnlocked).isFalse()
         }
 
     @Test
-    fun isDeviceUnlocked_whenLockedAndAuthMethodIsNone_isTrue() =
+    fun deviceUnlockStatus_whenLockedAndAuthMethodIsNone_isTrue() =
         testScope.runTest {
-            val isUnlocked by collectLastValue(underTest.isDeviceUnlocked)
+            val deviceUnlockStatus by collectLastValue(underTest.deviceUnlockStatus)
 
-            deviceEntryRepository.setUnlocked(false)
             authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.None)
 
-            assertThat(isUnlocked).isTrue()
+            assertThat(deviceUnlockStatus?.isUnlocked).isTrue()
         }
 
     @Test
-    fun isDeviceUnlocked_whenLockedAndAuthMethodIsPin_isFalse() =
+    fun deviceUnlockStatus_whenLockedAndAuthMethodIsPin_isFalse() =
         testScope.runTest {
-            val isUnlocked by collectLastValue(underTest.isDeviceUnlocked)
+            val deviceUnlockStatus by collectLastValue(underTest.deviceUnlockStatus)
 
-            deviceEntryRepository.setUnlocked(false)
             authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Pin)
 
-            assertThat(isUnlocked).isFalse()
+            assertThat(deviceUnlockStatus?.isUnlocked).isFalse()
         }
 
     @Test
-    fun isDeviceUnlocked_whenLockedAndAuthMethodIsSim_isFalse() =
+    fun deviceUnlockStatus_whenLockedAndAuthMethodIsSim_isFalse() =
         testScope.runTest {
-            val isUnlocked by collectLastValue(underTest.isDeviceUnlocked)
+            val deviceUnlockStatus by collectLastValue(underTest.deviceUnlockStatus)
 
-            deviceEntryRepository.setUnlocked(false)
             authenticationRepository.setAuthenticationMethod(AuthenticationMethodModel.Sim)
 
-            assertThat(isUnlocked).isFalse()
+            assertThat(deviceUnlockStatus?.isUnlocked).isFalse()
         }
+
+    @Test
+    fun deviceUnlockStatus_whenFaceIsAuthenticatedWhileAwakeWithBypass_isTrue() =
+        testScope.runTest {
+            val deviceUnlockStatus by collectLastValue(underTest.deviceUnlockStatus)
+            kosmos.powerInteractor.setAwakeForTest()
+
+            kosmos.fakeDeviceEntryFaceAuthRepository.isAuthenticated.value = true
+            kosmos.fakeDeviceEntryRepository.setBypassEnabled(true)
+            runCurrent()
+
+            assertThat(deviceUnlockStatus?.isUnlocked).isTrue()
+            assertThat(deviceUnlockStatus?.deviceUnlockSource)
+                .isEqualTo(DeviceUnlockSource.FaceWithBypass)
+        }
+
+    @Test
+    fun deviceUnlockStatus_whenFaceIsAuthenticatedWithoutBypass_providesThatInfo() =
+        testScope.runTest {
+            val deviceUnlockStatus by collectLastValue(underTest.deviceUnlockStatus)
+
+            kosmos.fakeDeviceEntryFaceAuthRepository.isAuthenticated.value = true
+            kosmos.fakeDeviceEntryRepository.setBypassEnabled(false)
+            runCurrent()
+
+            assertThat(deviceUnlockStatus?.isUnlocked).isTrue()
+            assertThat(deviceUnlockStatus?.deviceUnlockSource)
+                .isEqualTo(DeviceUnlockSource.FaceWithoutBypass)
+        }
+
+    @Test
+    fun deviceUnlockStatus_whenFingerprintIsAuthenticated_providesThatInfo() =
+        testScope.runTest {
+            val deviceUnlockStatus by collectLastValue(underTest.deviceUnlockStatus)
+
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
+            runCurrent()
+
+            assertThat(deviceUnlockStatus?.isUnlocked).isTrue()
+            assertThat(deviceUnlockStatus?.deviceUnlockSource)
+                .isEqualTo(DeviceUnlockSource.Fingerprint)
+        }
+
+    @Test
+    fun deviceUnlockStatus_whenUnlockedByTrustAgent_providesThatInfo() =
+        testScope.runTest {
+            val deviceUnlockStatus by collectLastValue(underTest.deviceUnlockStatus)
+            kosmos.fakeUserRepository.setSelectedUserInfo(
+                primaryUser,
+                SelectionStatus.SELECTION_COMPLETE
+            )
+
+            kosmos.fakeTrustRepository.setCurrentUserTrusted(true)
+            runCurrent()
+
+            assertThat(deviceUnlockStatus?.isUnlocked).isTrue()
+            assertThat(deviceUnlockStatus?.deviceUnlockSource)
+                .isEqualTo(DeviceUnlockSource.TrustAgent)
+        }
+
+    @Test
+    fun deviceUnlockStatus_isResetToFalse_whenDeviceGoesToSleep() =
+        testScope.runTest {
+            val deviceUnlockStatus by collectLastValue(underTest.deviceUnlockStatus)
+
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
+            runCurrent()
+            assertThat(deviceUnlockStatus?.isUnlocked).isTrue()
+
+            kosmos.powerInteractor.setAsleepForTest()
+            runCurrent()
+
+            assertThat(deviceUnlockStatus?.isUnlocked).isFalse()
+        }
+
+    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/multivalentTests/src/com/android/systemui/dreams/homecontrols/HomeControlsComponentInteractorKosmos.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/homecontrols/HomeControlsComponentInteractorKosmos.kt
index 2c890f4..7d7841f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/homecontrols/HomeControlsComponentInteractorKosmos.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/homecontrols/HomeControlsComponentInteractorKosmos.kt
@@ -15,6 +15,7 @@
  */
 package com.android.systemui.dreams.homecontrols
 
+import android.os.powerManager
 import android.service.dream.dreamManager
 import com.android.systemui.common.domain.interactor.packageChangeInteractor
 import com.android.systemui.controls.dagger.ControlsComponent
@@ -37,6 +38,7 @@
             userRepository = fakeUserRepository,
             bgScope = applicationCoroutineScope,
             systemClock = fakeSystemClock,
+            powerManager = powerManager,
             dreamManager = dreamManager,
             packageChangeInteractor = packageChangeInteractor,
         )
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/homecontrols/HomeControlsComponentInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/homecontrols/HomeControlsComponentInteractorTest.kt
index 298ce70..feb7298 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/homecontrols/HomeControlsComponentInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/homecontrols/HomeControlsComponentInteractorTest.kt
@@ -20,7 +20,9 @@
 import android.content.pm.ApplicationInfo
 import android.content.pm.ServiceInfo
 import android.content.pm.UserInfo
+import android.os.PowerManager
 import android.os.UserHandle
+import android.os.powerManager
 import android.service.dream.dreamManager
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
@@ -50,6 +52,8 @@
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.Mockito.anyLong
 import org.mockito.Mockito.never
 import org.mockito.Mockito.verify
 
@@ -196,7 +200,7 @@
                 )
                 fakeSystemClock.advanceTime(MAX_UPDATE_CORRELATION_DELAY.inWholeMilliseconds)
                 // Task fragment becomes empty as a result of the update.
-                underTest.onTaskFragmentEmpty()
+                underTest.onDreamEndUnexpectedly()
 
                 runCurrent()
                 verify(dreamManager, never()).startDream()
@@ -240,7 +244,7 @@
                 )
                 fakeSystemClock.advanceTime(MAX_UPDATE_CORRELATION_DELAY.inWholeMilliseconds + 100)
                 // Task fragment becomes empty as a result of the update.
-                underTest.onTaskFragmentEmpty()
+                underTest.onDreamEndUnexpectedly()
 
                 runCurrent()
                 verify(dreamManager, never()).startDream()
@@ -258,6 +262,25 @@
             }
         }
 
+    @Test
+    fun testDreamUnexpectedlyEnds_triggersUserActivity() =
+        with(kosmos) {
+            testScope.runTest {
+                fakeSystemClock.setUptimeMillis(100000L)
+                verify(powerManager, never()).userActivity(anyLong(), anyInt(), anyInt())
+
+                // Dream ends unexpectedly
+                underTest.onDreamEndUnexpectedly()
+
+                verify(powerManager)
+                    .userActivity(
+                        100000L,
+                        PowerManager.USER_ACTIVITY_EVENT_OTHER,
+                        PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS
+                    )
+            }
+        }
+
     private fun runServicesUpdate(hasPanelBoolean: Boolean = true) {
         val listings =
             listOf(ControlsServiceInfo(TEST_COMPONENT, "panel", hasPanel = hasPanelBoolean))
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java
index 5827671..0f8fc38 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java
@@ -63,7 +63,6 @@
 
 import java.util.Collections;
 import java.util.Optional;
-
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class BouncerSwipeTouchHandlerTest extends SysuiTestCase {
@@ -119,6 +118,7 @@
     private static final float TOUCH_REGION = .3f;
     private static final int SCREEN_WIDTH_PX = 1024;
     private static final int SCREEN_HEIGHT_PX = 100;
+    private static final float MIN_BOUNCER_HEIGHT = .05f;
 
     private static final Rect SCREEN_BOUNDS = new Rect(0, 0, 1024, 100);
     private static final UserInfo CURRENT_USER_INFO = new UserInfo(
@@ -142,6 +142,7 @@
                 mFlingAnimationUtils,
                 mFlingAnimationUtilsClosing,
                 TOUCH_REGION,
+                MIN_BOUNCER_HEIGHT,
                 mUiEventLogger);
 
         when(mScrimManager.getCurrentController()).thenReturn(mScrimController);
@@ -160,9 +161,9 @@
      */
     @Test
     public void testSessionStart() {
-        mTouchHandler.getTouchInitiationRegion(SCREEN_BOUNDS, mRegion);
+        mTouchHandler.getTouchInitiationRegion(SCREEN_BOUNDS, mRegion, null);
 
-        verify(mRegion).op(mRectCaptor.capture(), eq(Region.Op.UNION));
+        verify(mRegion).union(mRectCaptor.capture());
         final Rect bounds = mRectCaptor.getValue();
 
         final Rect expected = new Rect();
@@ -194,6 +195,85 @@
         UP,
     }
 
+    @Test
+    public void testSwipeUp_whenBouncerInitiallyShowing_reduceHeightWithExclusionRects() {
+        mTouchHandler.getTouchInitiationRegion(SCREEN_BOUNDS, mRegion,
+                new Rect(0, 0, SCREEN_WIDTH_PX, SCREEN_HEIGHT_PX));
+        verify(mRegion).union(mRectCaptor.capture());
+        final Rect bounds = mRectCaptor.getValue();
+
+        final Rect expected = new Rect();
+        final float minBouncerHeight =
+                SCREEN_HEIGHT_PX * MIN_BOUNCER_HEIGHT;
+        final int minAllowableBottom = SCREEN_HEIGHT_PX - Math.round(minBouncerHeight);
+
+        expected.set(0, minAllowableBottom , SCREEN_WIDTH_PX, SCREEN_HEIGHT_PX);
+
+        assertThat(bounds).isEqualTo(expected);
+
+        onSessionStartHelper(mTouchHandler, mTouchSession, mNotificationShadeWindowController);
+    }
+
+    @Test
+    public void testSwipeUp_exclusionRectAtTop_doesNotIntersectGestureArea() {
+        mTouchHandler.getTouchInitiationRegion(SCREEN_BOUNDS, mRegion,
+                new Rect(0, 0, SCREEN_WIDTH_PX, SCREEN_HEIGHT_PX / 4));
+        verify(mRegion).union(mRectCaptor.capture());
+        final Rect bounds = mRectCaptor.getValue();
+
+        final Rect expected = new Rect();
+        final int gestureAreaTop = SCREEN_HEIGHT_PX - Math.round(SCREEN_HEIGHT_PX * TOUCH_REGION);
+        expected.set(0, gestureAreaTop, SCREEN_WIDTH_PX, SCREEN_HEIGHT_PX);
+
+        assertThat(bounds).isEqualTo(expected);
+        onSessionStartHelper(mTouchHandler, mTouchSession, mNotificationShadeWindowController);
+    }
+
+    @Test
+    public void testSwipeUp_exclusionRectBetweenNormalAndMinimumSwipeArea() {
+        final int normalSwipeAreaTop = SCREEN_HEIGHT_PX
+                - Math.round(SCREEN_HEIGHT_PX * TOUCH_REGION);
+        final int minimumSwipeAreaTop = SCREEN_HEIGHT_PX
+                - Math.round(SCREEN_HEIGHT_PX * MIN_BOUNCER_HEIGHT);
+
+        Rect exclusionRect = new Rect(0, 0, SCREEN_WIDTH_PX,
+                (normalSwipeAreaTop + minimumSwipeAreaTop) / 2);
+
+        mTouchHandler.getTouchInitiationRegion(SCREEN_BOUNDS, mRegion, exclusionRect);
+
+        verify(mRegion).union(mRectCaptor.capture());
+
+        final Rect bounds = mRectCaptor.getValue();
+        final Rect expected = new Rect();
+
+        final int expectedSwipeAreaBottom = exclusionRect.bottom;
+        expected.set(0, expectedSwipeAreaBottom, SCREEN_WIDTH_PX, SCREEN_HEIGHT_PX);
+
+        assertThat(bounds).isEqualTo(expected);
+
+        onSessionStartHelper(mTouchHandler, mTouchSession, mNotificationShadeWindowController);
+    }
+
+    private static void onSessionStartHelper(BouncerSwipeTouchHandler touchHandler,
+            DreamTouchHandler.TouchSession touchSession,
+            NotificationShadeWindowController notificationShadeWindowController) {
+        touchHandler.onSessionStart(touchSession);
+        verify(notificationShadeWindowController).setForcePluginOpen(eq(true), any());
+        ArgumentCaptor<InputChannelCompat.InputEventListener> eventListenerCaptor =
+                ArgumentCaptor.forClass(InputChannelCompat.InputEventListener.class);
+        ArgumentCaptor<GestureDetector.OnGestureListener> gestureListenerCaptor =
+                ArgumentCaptor.forClass(GestureDetector.OnGestureListener.class);
+        verify(touchSession).registerGestureListener(gestureListenerCaptor.capture());
+        verify(touchSession).registerInputListener(eventListenerCaptor.capture());
+
+        // A touch within range at the bottom of the screen should trigger listening
+        assertThat(gestureListenerCaptor.getValue()
+                .onScroll(Mockito.mock(MotionEvent.class),
+                        Mockito.mock(MotionEvent.class),
+                        1,
+                        2)).isTrue();
+    }
+
     /**
      * Makes sure swiping up when bouncer initially showing doesn't change the expansion amount.
      */
@@ -376,7 +456,7 @@
         // Ensure correct expansion passed in.
         ShadeExpansionChangeEvent event =
                 new ShadeExpansionChangeEvent(
-                        expansion, /* expanded= */ false, /* tracking= */ true, dragDownAmount);
+                        expansion, /* expanded= */ false, /* tracking= */ true);
         verify(mScrimController).expand(event);
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/scrim/BouncerlessScrimControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/scrim/BouncerlessScrimControllerTest.java
index 97052a8..7cdd478 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/scrim/BouncerlessScrimControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/scrim/BouncerlessScrimControllerTest.java
@@ -59,7 +59,7 @@
         final BouncerlessScrimController scrimController =
                 new BouncerlessScrimController(mExecutor, mPowerManager);
         scrimController.addCallback(mCallback);
-        scrimController.expand(new ShadeExpansionChangeEvent(.5f, true, false, 0.0f));
+        scrimController.expand(new ShadeExpansionChangeEvent(.5f, true, false));
         mExecutor.runAllReady();
         verify(mPowerManager).wakeUp(anyLong(), eq(PowerManager.WAKE_REASON_GESTURE), any());
         verify(mCallback).onWakeup();
@@ -71,7 +71,7 @@
                 new BouncerlessScrimController(mExecutor, mPowerManager);
         scrimController.addCallback(mCallback);
         final ShadeExpansionChangeEvent expansionEvent =
-                new ShadeExpansionChangeEvent(0.5f, false, false, 0.0f);
+                new ShadeExpansionChangeEvent(0.5f, false, false);
         scrimController.expand(expansionEvent);
         mExecutor.runAllReady();
         verify(mCallback).onExpansion(eq(expansionEvent));
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
index a9541d9..1dd5d07 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
@@ -38,8 +38,10 @@
 import com.android.systemui.power.domain.interactor.PowerInteractorFactory
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
+import com.android.systemui.scene.shared.flag.sceneContainerFlags
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.shade.data.repository.FakeShadeRepository
+import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -74,13 +76,17 @@
             repository = repository,
             commandQueue = commandQueue,
             powerInteractor = PowerInteractorFactory.create().powerInteractor,
-            sceneContainerFlags = kosmos.fakeSceneContainerFlags,
+            sceneContainerFlags = kosmos.sceneContainerFlags,
             bouncerRepository = bouncerRepository,
             configurationInteractor = ConfigurationInteractor(FakeConfigurationRepository()),
             shadeRepository = shadeRepository,
             keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor,
             sceneInteractorProvider = { sceneInteractor },
             fromGoneTransitionInteractor = { fromGoneTransitionInteractor },
+            sharedNotificationContainerInteractor = {
+                kosmos.sharedNotificationContainerInteractor
+            },
+            applicationScope = testScope,
         )
     }
 
@@ -209,14 +215,16 @@
             )
 
             repository.setStatusBarState(StatusBarState.KEYGUARD)
-            shadeRepository.setLegacyShadeExpansion(1f)
+            // User begins to swipe up
+            shadeRepository.setLegacyShadeExpansion(0.99f)
 
             // When not dismissable, no alpha value (null) should emit
             repository.setKeyguardDismissible(false)
             assertThat(dismissAlpha).isNull()
 
             repository.setKeyguardDismissible(true)
-            assertThat(dismissAlpha).isGreaterThan(0.95f)
+            shadeRepository.setLegacyShadeExpansion(0.98f)
+            assertThat(dismissAlpha).isGreaterThan(0.5f)
         }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractorTest.kt
new file mode 100644
index 0000000..0f5e458
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractorTest.kt
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.domain.interactor
+
+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.shared.model.AuthenticationMethodModel
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.coroutines.collectValues
+import com.android.systemui.flags.EnableSceneContainer
+import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.deviceEntryFingerprintAuthRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
+import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
+import com.android.systemui.keyguard.shared.model.TransitionState
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.power.domain.interactor.PowerInteractor
+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.statusbar.domain.interactor.keyguardOcclusionInteractor
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import junit.framework.Assert.assertFalse
+import junit.framework.Assert.assertTrue
+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
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class KeyguardOcclusionInteractorTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+
+    private lateinit var underTest: KeyguardOcclusionInteractor
+    private lateinit var powerInteractor: PowerInteractor
+    private lateinit var transitionRepository: FakeKeyguardTransitionRepository
+
+    @Before
+    fun setUp() {
+        powerInteractor = kosmos.powerInteractor
+        transitionRepository = kosmos.fakeKeyguardTransitionRepository
+        underTest = kosmos.keyguardOcclusionInteractor
+    }
+
+    @Test
+    fun transitionFromPowerGesture_whileGoingToSleep_isTrue() =
+        testScope.runTest {
+            powerInteractor.setAwakeForTest()
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.LOCKSCREEN,
+                to = KeyguardState.AOD,
+                testScope = testScope,
+                throughTransitionState = TransitionState.RUNNING
+            )
+
+            powerInteractor.onCameraLaunchGestureDetected()
+            runCurrent()
+
+            assertTrue(underTest.shouldTransitionFromPowerButtonGesture())
+        }
+
+    @Test
+    fun transitionFromPowerGesture_whileAsleep_isTrue() =
+        testScope.runTest {
+            powerInteractor.setAwakeForTest()
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.LOCKSCREEN,
+                to = KeyguardState.AOD,
+                testScope = testScope,
+            )
+
+            powerInteractor.onCameraLaunchGestureDetected()
+            runCurrent()
+
+            assertTrue(underTest.shouldTransitionFromPowerButtonGesture())
+        }
+
+    @Test
+    fun transitionFromPowerGesture_whileWaking_isFalse() =
+        testScope.runTest {
+            powerInteractor.setAwakeForTest()
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.LOCKSCREEN,
+                to = KeyguardState.AOD,
+                testScope = testScope,
+            )
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.AOD,
+                to = KeyguardState.LOCKSCREEN,
+                testScope = testScope,
+                throughTransitionState = TransitionState.RUNNING
+            )
+
+            powerInteractor.onCameraLaunchGestureDetected()
+            runCurrent()
+
+            assertFalse(underTest.shouldTransitionFromPowerButtonGesture())
+        }
+
+    @Test
+    fun transitionFromPowerGesture_whileAwake_isFalse() =
+        testScope.runTest {
+            powerInteractor.setAwakeForTest()
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.LOCKSCREEN,
+                to = KeyguardState.AOD,
+                testScope = testScope,
+            )
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.AOD,
+                to = KeyguardState.LOCKSCREEN,
+                testScope = testScope,
+            )
+
+            powerInteractor.onCameraLaunchGestureDetected()
+            runCurrent()
+
+            assertFalse(underTest.shouldTransitionFromPowerButtonGesture())
+        }
+
+    @Test
+    fun showWhenLockedActivityLaunchedFromPowerGesture_notTrueSecondTime() =
+        testScope.runTest {
+            val values by collectValues(underTest.showWhenLockedActivityLaunchedFromPowerGesture)
+            powerInteractor.setAsleepForTest()
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.LOCKSCREEN,
+                to = KeyguardState.AOD,
+                testScope = testScope,
+            )
+
+            powerInteractor.onCameraLaunchGestureDetected()
+            powerInteractor.setAwakeForTest()
+            runCurrent()
+
+            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true)
+            runCurrent()
+
+            assertThat(values)
+                .containsExactly(
+                    false,
+                    true,
+                )
+
+            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(false)
+            runCurrent()
+
+            assertThat(values)
+                .containsExactly(
+                    false,
+                    true,
+                    false,
+                )
+
+            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true)
+            runCurrent()
+
+            assertThat(values)
+                .containsExactly(
+                    false,
+                    true,
+                    // Power button gesture was not triggered a second time, so this should remain
+                    // false.
+                    false,
+                )
+        }
+
+    @Test
+    fun showWhenLockedActivityLaunchedFromPowerGesture_falseIfReturningToGone() =
+        testScope.runTest {
+            val values by collectValues(underTest.showWhenLockedActivityLaunchedFromPowerGesture)
+            powerInteractor.setAwakeForTest()
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.LOCKSCREEN,
+                to = KeyguardState.GONE,
+                testScope = testScope,
+            )
+
+            powerInteractor.setAsleepForTest()
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.GONE,
+                to = KeyguardState.AOD,
+                testScope = testScope,
+                throughTransitionState = TransitionState.RUNNING
+            )
+
+            powerInteractor.onCameraLaunchGestureDetected()
+            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true)
+            powerInteractor.setAwakeForTest()
+            runCurrent()
+
+            transitionRepository.sendTransitionSteps(
+                from = KeyguardState.AOD,
+                to = KeyguardState.GONE,
+                testScope = testScope,
+            )
+
+            assertThat(values)
+                .containsExactly(
+                    false,
+                )
+        }
+
+    @Test
+    @EnableSceneContainer
+    fun occludingActivityWillDismissKeyguard() =
+        testScope.runTest {
+            val occludingActivityWillDismissKeyguard by
+                collectLastValue(underTest.occludingActivityWillDismissKeyguard)
+            assertThat(occludingActivityWillDismissKeyguard).isFalse()
+            kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
+                AuthenticationMethodModel.Pin
+            )
+            runCurrent()
+
+            // Unlock device:
+            kosmos.deviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
+            runCurrent()
+            assertThat(occludingActivityWillDismissKeyguard).isTrue()
+
+            // Re-lock device:
+            kosmos.powerInteractor.setAsleepForTest()
+            runCurrent()
+            assertThat(occludingActivityWillDismissKeyguard).isFalse()
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt
index 36458ed..15c9cf7 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt
@@ -22,6 +22,7 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectValues
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
 import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING
 import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
@@ -37,6 +38,7 @@
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
 import junit.framework.Assert.assertEquals
+import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
 import org.junit.Test
@@ -242,7 +244,8 @@
     @Test
     fun transitionValue() =
         testScope.runTest {
-            val startedSteps by collectValues(underTest.transitionValue(state = DOZING))
+            resetTransitionValueReplayCache(setOf(AOD, DOZING, LOCKSCREEN))
+            val transitionValues by collectValues(underTest.transitionValue(state = DOZING))
 
             val toSteps =
                 listOf(
@@ -266,12 +269,14 @@
                 runCurrent()
             }
 
-            assertThat(startedSteps).isEqualTo(listOf(0f, 0.5f, 1f, 1f, 0.5f, 0f))
+            assertThat(transitionValues).isEqualTo(listOf(0f, 0.5f, 1f, 1f, 0.5f, 0f))
         }
 
     @Test
     fun transitionValue_canceled_toAnotherState() =
         testScope.runTest {
+            resetTransitionValueReplayCache(setOf(AOD, GONE, LOCKSCREEN))
+
             val transitionValuesGone by collectValues(underTest.transitionValue(state = GONE))
             val transitionValuesAod by collectValues(underTest.transitionValue(state = AOD))
             val transitionValuesLs by collectValues(underTest.transitionValue(state = LOCKSCREEN))
@@ -297,6 +302,8 @@
     @Test
     fun transitionValue_canceled_backToOriginalState() =
         testScope.runTest {
+            resetTransitionValueReplayCache(setOf(AOD, GONE))
+
             val transitionValuesGone by collectValues(underTest.transitionValue(state = GONE))
             val transitionValuesAod by collectValues(underTest.transitionValue(state = AOD))
 
@@ -1395,4 +1402,8 @@
             testScope.runCurrent()
         }
     }
+
+    private fun resetTransitionValueReplayCache(states: Set<KeyguardState>) {
+        states.forEach { (underTest.transitionValue(it) as MutableSharedFlow).resetReplayCache() }
+    }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelTest.kt
index 0cc0c2f..5bf0f4b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelTest.kt
@@ -30,11 +30,13 @@
 import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING
 import com.android.systemui.keyguard.shared.model.TransitionStep
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.statusbar.sysuiStatusBarStateController
 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.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -44,15 +46,19 @@
 class AlternateBouncerToGoneTransitionViewModelTest : SysuiTestCase() {
     val kosmos =
         testKosmos().apply {
-            fakeFeatureFlagsClassic.apply {
-                set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false)
-                set(Flags.FULL_SCREEN_USER_SWITCHER, false)
-            }
+            fakeFeatureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) }
         }
+
     private val testScope = kosmos.testScope
     private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+    private val sysuiStatusBarStateController = kosmos.sysuiStatusBarStateController
     private val underTest by lazy { kosmos.alternateBouncerToGoneTransitionViewModel }
 
+    @Before
+    fun setup() {
+        mSetFlagsRule.disableFlags(com.android.systemui.Flags.FLAG_REFACTOR_KEYGUARD_DISMISS_INTENT)
+    }
+
     @Test
     fun deviceEntryParentViewDisappear() =
         testScope.runTest {
@@ -112,6 +118,21 @@
         }
 
     @Test
+    fun notificationAlpha_leaveShadeOpen() =
+        testScope.runTest {
+            val values by collectValues(underTest.notificationAlpha(ViewStateAccessor()))
+            runCurrent()
+
+            sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(true)
+
+            keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+            keyguardTransitionRepository.sendTransitionStep(step(1f))
+
+            assertThat(values.size).isEqualTo(2)
+            values.forEach { assertThat(it).isEqualTo(1f) }
+        }
+
+    @Test
     fun lockscreenAlpha_zeroInitialAlpha() =
         testScope.runTest {
             // ViewState starts at 0 alpha.
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelTest.kt
index ff41ea2..854a478 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToPrimaryBouncerTransitionViewModelTest.kt
@@ -32,6 +32,7 @@
 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
 
@@ -41,15 +42,17 @@
 class AlternateBouncerToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() {
     private val kosmos =
         testKosmos().apply {
-            fakeFeatureFlagsClassic.apply {
-                set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false)
-                set(Flags.FULL_SCREEN_USER_SWITCHER, false)
-            }
+            fakeFeatureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) }
         }
     private val testScope = kosmos.testScope
     private val keyguardTransitionRepository by lazy { kosmos.fakeKeyguardTransitionRepository }
     private val underTest by lazy { kosmos.alternateBouncerToPrimaryBouncerTransitionViewModel }
 
+    @Before
+    fun setup() {
+        mSetFlagsRule.disableFlags(com.android.systemui.Flags.FLAG_REFACTOR_KEYGUARD_DISMISS_INTENT)
+    }
+
     @Test
     fun deviceEntryParentViewDisappear() =
         testScope.runTest {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt
index f517cec..31337a6 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModelTest.kt
@@ -23,6 +23,7 @@
 import com.android.systemui.Flags as AConfigFlags
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.keyguard.data.repository.fakeKeyguardClockRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
 import com.android.systemui.keyguard.domain.interactor.BurnInInteractor
 import com.android.systemui.keyguard.domain.interactor.burnInInteractor
@@ -60,10 +61,7 @@
     private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
     private lateinit var underTest: AodBurnInViewModel
 
-    private var burnInParameters =
-        BurnInParameters(
-            clockControllerProvider = { clockController },
-        )
+    private var burnInParameters = BurnInParameters()
     private val burnInFlow = MutableStateFlow(BurnInModel())
 
     @Before
@@ -76,6 +74,7 @@
         whenever(goneToAodTransitionViewModel.enterFromTopTranslationY(anyInt()))
             .thenReturn(emptyFlow())
         kosmos.goneToAodTransitionViewModel = goneToAodTransitionViewModel
+        kosmos.fakeKeyguardClockRepository.setCurrentClock(clockController)
 
         underTest = kosmos.aodBurnInViewModel
     }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt
index ad2ae8b..ee217a6 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt
@@ -20,6 +20,7 @@
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.bouncer.domain.interactor.mockPrimaryBouncerInteractor
+import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.coroutines.collectValues
 import com.android.systemui.flags.Flags
 import com.android.systemui.flags.fakeFeatureFlagsClassic
@@ -56,10 +57,7 @@
 
     private val kosmos =
         testKosmos().apply {
-            fakeFeatureFlagsClassic.apply {
-                set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false)
-                set(Flags.FULL_SCREEN_USER_SWITCHER, false)
-            }
+            fakeFeatureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) }
         }
     private val testScope = kosmos.testScope
     private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
@@ -71,6 +69,7 @@
     @Before
     fun setUp() {
         MockitoAnnotations.initMocks(this)
+        mSetFlagsRule.disableFlags(com.android.systemui.Flags.FLAG_REFACTOR_KEYGUARD_DISMISS_INTENT)
         whenever(primaryBouncerInteractor.willRunDismissFromKeyguard()).thenReturn(false)
         sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(false)
     }
@@ -149,6 +148,38 @@
         }
 
     @Test
+    fun showAllNotifications_isTrue_whenLeaveShadeOpen() =
+        testScope.runTest {
+            val showAllNotifications by
+                collectLastValue(underTest.showAllNotifications(500.milliseconds, PRIMARY_BOUNCER))
+
+            sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(true)
+
+            keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+            keyguardTransitionRepository.sendTransitionStep(step(0.1f))
+
+            assertThat(showAllNotifications).isTrue()
+            keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED))
+            assertThat(showAllNotifications).isFalse()
+        }
+
+    @Test
+    fun showAllNotifications_isFalse_whenLeaveShadeIsNotOpen() =
+        testScope.runTest {
+            val showAllNotifications by
+                collectLastValue(underTest.showAllNotifications(500.milliseconds, PRIMARY_BOUNCER))
+
+            sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(false)
+
+            keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+            keyguardTransitionRepository.sendTransitionStep(step(0.1f))
+
+            assertThat(showAllNotifications).isFalse()
+            keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED))
+            assertThat(showAllNotifications).isFalse()
+        }
+
+    @Test
     fun scrimBehindAlpha_doNotLeaveShadeOpen() =
         testScope.runTest {
             val values by collectValues(underTest.scrimAlpha(500.milliseconds, PRIMARY_BOUNCER))
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 fc604aa..973e496 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
@@ -30,11 +30,8 @@
 import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
-import com.android.systemui.flags.Flags
-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.keyguardInteractor
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.keyguard.shared.model.TransitionStep
@@ -60,13 +57,9 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class KeyguardRootViewModelTest : SysuiTestCase() {
-    private val kosmos =
-        testKosmos().apply {
-            fakeFeatureFlagsClassic.apply { set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false) }
-        }
+    private val kosmos = testKosmos()
     private val testScope = kosmos.testScope
     private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
-    private val keyguardInteractor = kosmos.keyguardInteractor
     private val keyguardRepository = kosmos.fakeKeyguardRepository
     private val communalRepository = kosmos.communalRepository
     private val screenOffAnimationController = kosmos.screenOffAnimationController
@@ -82,7 +75,10 @@
     fun setUp() {
         mSetFlagsRule.enableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
         mSetFlagsRule.enableFlags(FLAG_NEW_AOD_TRANSITION)
-        mSetFlagsRule.disableFlags(AConfigFlags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT)
+        mSetFlagsRule.disableFlags(
+            AConfigFlags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT,
+            AConfigFlags.FLAG_REFACTOR_KEYGUARD_DISMISS_INTENT,
+        )
     }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt
index 751ac1d..e9a8257 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt
@@ -21,6 +21,7 @@
 import com.android.keyguard.KeyguardClockSwitch
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.biometrics.authController
+import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.flags.Flags
 import com.android.systemui.flags.fakeFeatureFlagsClassic
 import com.android.systemui.keyguard.data.repository.fakeKeyguardClockRepository
@@ -96,7 +97,7 @@
                 shadeRepository.setShadeMode(ShadeMode.Split)
                 kosmos.fakeKeyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE)
 
-                assertThat(underTest.areNotificationsVisible).isTrue()
+                assertThat(collectLastValue(underTest.areNotificationsVisible).invoke()).isTrue()
             }
         }
     @Test
@@ -104,7 +105,7 @@
         with(kosmos) {
             testScope.runTest {
                 kosmos.fakeKeyguardClockRepository.setClockSize(KeyguardClockSwitch.SMALL)
-                assertThat(underTest.areNotificationsVisible).isTrue()
+                assertThat(collectLastValue(underTest.areNotificationsVisible).invoke()).isTrue()
             }
         }
 
@@ -113,7 +114,7 @@
         with(kosmos) {
             testScope.runTest {
                 kosmos.fakeKeyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE)
-                assertThat(underTest.areNotificationsVisible).isFalse()
+                assertThat(collectLastValue(underTest.areNotificationsVisible).invoke()).isFalse()
             }
         }
 
@@ -122,7 +123,8 @@
         with(kosmos) {
             testScope.runTest {
                 shadeRepository.setShadeMode(ShadeMode.Split)
-                assertThat(underTest.shouldUseSplitNotificationShade).isTrue()
+                assertThat(collectLastValue(underTest.shouldUseSplitNotificationShade).invoke())
+                    .isTrue()
             }
         }
 
@@ -131,16 +133,8 @@
         with(kosmos) {
             testScope.runTest {
                 shadeRepository.setShadeMode(ShadeMode.Single)
-                assertThat(underTest.shouldUseSplitNotificationShade).isFalse()
-            }
-        }
-
-    @Test
-    fun sceneKey() =
-        with(kosmos) {
-            testScope.runTest {
-                shadeRepository.setShadeMode(ShadeMode.Single)
-                assertThat(underTest.shouldUseSplitNotificationShade).isFalse()
+                assertThat(collectLastValue(underTest.shouldUseSplitNotificationShade).invoke())
+                    .isFalse()
             }
         }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt
index 2fd2ef1..66f7e01 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt
@@ -121,7 +121,6 @@
                     AuthenticationMethodModel.Pin
                 }
             )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(canSwipeToEnter)
             sceneInteractor.changeScene(Scenes.Lockscreen, "reason")
             kosmos.shadeRepository.setShadeMode(
                 if (isSingleShade) {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelTest.kt
index 857b9f8..26cb485 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelTest.kt
@@ -26,6 +26,7 @@
 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.statusbar.sysuiStatusBarStateController
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -40,6 +41,7 @@
     private val kosmos = testKosmos()
     private val testScope = kosmos.testScope
     private val repository = kosmos.fakeKeyguardTransitionRepository
+    private val sysuiStatusBarStateController = kosmos.sysuiStatusBarStateController
     private val underTest = kosmos.lockscreenToGoneTransitionViewModel
 
     @Test
@@ -90,6 +92,20 @@
             assertThat(alpha).isEqualTo(0f)
         }
 
+    @Test
+    fun notificationAlpha_leaveShadeOpen() =
+        testScope.runTest {
+            val values by collectValues(underTest.notificationAlpha(ViewStateAccessor()))
+
+            sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(true)
+
+            repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+            repository.sendTransitionStep(step(1f))
+
+            assertThat(values.size).isEqualTo(2)
+            values.forEach { assertThat(it).isEqualTo(1f) }
+        }
+
     private fun step(
         value: Float,
         state: TransitionState = TransitionState.RUNNING
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt
index db1d5d9..18e9009 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt
@@ -44,10 +44,7 @@
 class PrimaryBouncerToGoneTransitionViewModelTest : SysuiTestCase() {
     val kosmos =
         testKosmos().apply {
-            fakeFeatureFlagsClassic.apply {
-                set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false)
-                set(Flags.FULL_SCREEN_USER_SWITCHER, false)
-            }
+            fakeFeatureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) }
         }
     val testScope = kosmos.testScope
 
@@ -58,6 +55,7 @@
 
     @Before
     fun setUp() {
+        mSetFlagsRule.disableFlags(com.android.systemui.Flags.FLAG_REFACTOR_KEYGUARD_DISMISS_INTENT)
         whenever(primaryBouncerInteractor.willRunDismissFromKeyguard()).thenReturn(false)
         sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(false)
     }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/MediaTestHelper.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/MediaTestHelper.kt
index 8e44932..720bcb5 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/MediaTestHelper.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/MediaTestHelper.kt
@@ -16,9 +16,7 @@
 
 package com.android.systemui.media.controls
 
-import android.R
 import android.app.smartspace.SmartspaceAction
-import android.content.Context
 import android.graphics.drawable.Icon
 import com.android.systemui.util.mockito.mock
 import com.android.systemui.util.mockito.whenever
@@ -26,17 +24,9 @@
 class MediaTestHelper {
     companion object {
         /** Returns a list of three mocked recommendations */
-        fun getValidRecommendationList(context: Context): List<SmartspaceAction> {
+        fun getValidRecommendationList(mediaIcon: Icon): List<SmartspaceAction> {
             val mediaRecommendationItem =
-                mock<SmartspaceAction> {
-                    whenever(icon)
-                        .thenReturn(
-                            Icon.createWithResource(
-                                context,
-                                R.drawable.ic_media_play,
-                            )
-                        )
-                }
+                mock<SmartspaceAction> { whenever(icon).thenReturn(mediaIcon) }
             return listOf(mediaRecommendationItem, mediaRecommendationItem, mediaRecommendationItem)
         }
     }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaDataRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaDataRepositoryTest.kt
index 6c41bc3..2864f04 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaDataRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaDataRepositoryTest.kt
@@ -16,6 +16,8 @@
 
 package com.android.systemui.media.controls.data.repository
 
+import android.R
+import android.graphics.drawable.Icon
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
@@ -81,11 +83,12 @@
         testScope.runTest {
             kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, true)
             val smartspaceData by collectLastValue(underTest.smartspaceMediaData)
+            val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
             val recommendation =
                 SmartspaceMediaData(
                     targetId = KEY_MEDIA_SMARTSPACE,
                     isActive = true,
-                    recommendations = MediaTestHelper.getValidRecommendationList(context),
+                    recommendations = MediaTestHelper.getValidRecommendationList(icon),
                 )
 
             underTest.setRecommendation(recommendation)
@@ -102,11 +105,12 @@
     fun dismissRecommendation() =
         testScope.runTest {
             val smartspaceData by collectLastValue(underTest.smartspaceMediaData)
+            val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
             val recommendation =
                 SmartspaceMediaData(
                     targetId = KEY_MEDIA_SMARTSPACE,
                     isActive = true,
-                    recommendations = MediaTestHelper.getValidRecommendationList(context),
+                    recommendations = MediaTestHelper.getValidRecommendationList(icon),
                 )
 
             underTest.setRecommendation(recommendation)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt
index d39e77d..956ef66 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt
@@ -16,8 +16,11 @@
 
 package com.android.systemui.media.controls.data.repository
 
+import android.R
+import android.graphics.drawable.Icon
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
+import com.android.internal.logging.InstanceId
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.kosmos.testScope
@@ -44,16 +47,17 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(underTest.selectedUserEntries)
 
-            val userMedia = MediaData().copy(active = true)
+            val instanceId = InstanceId.fakeInstanceId(123)
+            val userMedia = MediaData().copy(active = true, instanceId = instanceId)
 
-            underTest.addSelectedUserMediaEntry(KEY, userMedia)
+            underTest.addSelectedUserMediaEntry(userMedia)
 
-            assertThat(selectedUserEntries?.get(KEY)).isEqualTo(userMedia)
+            assertThat(selectedUserEntries?.get(instanceId)).isEqualTo(userMedia)
 
-            underTest.addSelectedUserMediaEntry(KEY, userMedia.copy(active = false))
+            underTest.addSelectedUserMediaEntry(userMedia.copy(active = false))
 
-            assertThat(selectedUserEntries?.get(KEY)).isNotEqualTo(userMedia)
-            assertThat(selectedUserEntries?.get(KEY)?.active).isFalse()
+            assertThat(selectedUserEntries?.get(instanceId)).isNotEqualTo(userMedia)
+            assertThat(selectedUserEntries?.get(instanceId)?.active).isFalse()
         }
 
     @Test
@@ -61,13 +65,14 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(underTest.selectedUserEntries)
 
-            val userMedia = MediaData()
+            val instanceId = InstanceId.fakeInstanceId(123)
+            val userMedia = MediaData().copy(instanceId = instanceId)
 
-            underTest.addSelectedUserMediaEntry(KEY, userMedia)
+            underTest.addSelectedUserMediaEntry(userMedia)
 
-            assertThat(selectedUserEntries?.get(KEY)).isEqualTo(userMedia)
+            assertThat(selectedUserEntries?.get(instanceId)).isEqualTo(userMedia)
 
-            assertThat(underTest.removeSelectedUserMediaEntry(KEY, userMedia)).isTrue()
+            assertThat(underTest.removeSelectedUserMediaEntry(instanceId, userMedia)).isTrue()
         }
 
     @Test
@@ -75,13 +80,14 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(underTest.selectedUserEntries)
 
-            val userMedia = MediaData()
+            val instanceId = InstanceId.fakeInstanceId(123)
+            val userMedia = MediaData().copy(instanceId = instanceId)
 
-            underTest.addSelectedUserMediaEntry(KEY, userMedia)
+            underTest.addSelectedUserMediaEntry(userMedia)
 
-            assertThat(selectedUserEntries?.get(KEY)).isEqualTo(userMedia)
+            assertThat(selectedUserEntries?.get(instanceId)).isEqualTo(userMedia)
 
-            assertThat(underTest.removeSelectedUserMediaEntry(KEY)).isEqualTo(userMedia)
+            assertThat(underTest.removeSelectedUserMediaEntry(instanceId)).isEqualTo(userMedia)
         }
 
     @Test
@@ -120,11 +126,12 @@
         testScope.runTest {
             val smartspaceMediaData by collectLastValue(underTest.smartspaceMediaData)
 
+            val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
             val mediaRecommendation =
                 SmartspaceMediaData(
                     targetId = KEY_MEDIA_SMARTSPACE,
                     isActive = true,
-                    recommendations = MediaTestHelper.getValidRecommendationList(context),
+                    recommendations = MediaTestHelper.getValidRecommendationList(icon),
                 )
 
             underTest.setRecommendation(mediaRecommendation)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
index 6e67000..d9d84f2 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
@@ -16,6 +16,8 @@
 
 package com.android.systemui.media.controls.domain.interactor
 
+import android.R
+import android.graphics.drawable.Icon
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
@@ -56,13 +58,13 @@
 
             val userMedia = MediaData().copy(active = true)
 
-            mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia)
+            mediaFilterRepository.addSelectedUserMediaEntry(userMedia)
 
             assertThat(hasActiveMediaOrRecommendation).isTrue()
             assertThat(hasActiveMedia).isTrue()
             assertThat(hasAnyMedia).isTrue()
 
-            mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia.copy(active = false))
+            mediaFilterRepository.addSelectedUserMediaEntry(userMedia.copy(active = false))
 
             assertThat(hasActiveMediaOrRecommendation).isFalse()
             assertThat(hasActiveMedia).isFalse()
@@ -78,14 +80,16 @@
             val hasAnyMedia by collectLastValue(underTest.hasAnyMedia)
 
             val userMedia = MediaData().copy(active = false)
+            val instanceId = userMedia.instanceId
 
-            mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia)
+            mediaFilterRepository.addSelectedUserMediaEntry(userMedia)
 
             assertThat(hasActiveMediaOrRecommendation).isFalse()
             assertThat(hasActiveMedia).isFalse()
             assertThat(hasAnyMedia).isTrue()
 
-            assertThat(mediaFilterRepository.removeSelectedUserMediaEntry(KEY, userMedia)).isTrue()
+            assertThat(mediaFilterRepository.removeSelectedUserMediaEntry(instanceId, userMedia))
+                .isTrue()
 
             assertThat(hasActiveMediaOrRecommendation).isFalse()
             assertThat(hasActiveMedia).isFalse()
@@ -101,11 +105,12 @@
                 collectLastValue(underTest.hasAnyMediaOrRecommendation)
             kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, false)
 
+            val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
             val userMediaRecommendation =
                 SmartspaceMediaData(
                     targetId = KEY_MEDIA_SMARTSPACE,
                     isActive = true,
-                    recommendations = MediaTestHelper.getValidRecommendationList(context),
+                    recommendations = MediaTestHelper.getValidRecommendationList(icon),
                 )
             val userMedia = MediaData().copy(active = false)
 
@@ -114,7 +119,7 @@
             assertThat(hasActiveMediaOrRecommendation).isTrue()
             assertThat(hasAnyMediaOrRecommendation).isTrue()
 
-            mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia)
+            mediaFilterRepository.addSelectedUserMediaEntry(userMedia)
 
             assertThat(hasActiveMediaOrRecommendation).isTrue()
             assertThat(hasAnyMediaOrRecommendation).isTrue()
@@ -129,11 +134,12 @@
                 collectLastValue(underTest.hasAnyMediaOrRecommendation)
             kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, false)
 
+            val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
             val mediaRecommendation =
                 SmartspaceMediaData(
                     targetId = KEY_MEDIA_SMARTSPACE,
                     isActive = true,
-                    recommendations = MediaTestHelper.getValidRecommendationList(context),
+                    recommendations = MediaTestHelper.getValidRecommendationList(icon),
                 )
 
             mediaFilterRepository.setRecommendation(mediaRecommendation)
@@ -156,11 +162,12 @@
                 collectLastValue(underTest.hasAnyMediaOrRecommendation)
             kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, false)
 
+            val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
             val mediaRecommendation =
                 SmartspaceMediaData(
                     targetId = KEY_MEDIA_SMARTSPACE,
                     isActive = true,
-                    recommendations = MediaTestHelper.getValidRecommendationList(context),
+                    recommendations = MediaTestHelper.getValidRecommendationList(icon),
                 )
 
             mediaFilterRepository.setRecommendation(mediaRecommendation)
@@ -193,7 +200,6 @@
         testScope.runTest { assertThat(underTest.hasActiveMediaOrRecommendation.value).isFalse() }
 
     companion object {
-        private const val KEY = "KEY"
         private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
     }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaControlInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaControlInteractorTest.kt
new file mode 100644
index 0000000..a1cee8a
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaControlInteractorTest.kt
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.media.controls.domain.interactor
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.internal.logging.InstanceId
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.media.controls.domain.pipeline.MediaDataFilterImpl
+import com.android.systemui.media.controls.domain.pipeline.interactor.MediaControlInteractor
+import com.android.systemui.media.controls.domain.pipeline.interactor.mediaControlInteractor
+import com.android.systemui.media.controls.domain.pipeline.mediaDataFilter
+import com.android.systemui.media.controls.shared.model.MediaData
+import com.android.systemui.media.controls.util.mediaInstanceId
+import com.android.systemui.statusbar.notificationLockscreenUserManager
+import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class MediaControlInteractorTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+
+    private val mediaDataFilter: MediaDataFilterImpl = kosmos.mediaDataFilter
+    private val instanceId: InstanceId = kosmos.mediaInstanceId
+    private val notificationLockscreenUserManager = kosmos.notificationLockscreenUserManager
+
+    private val underTest: MediaControlInteractor = kosmos.mediaControlInteractor
+
+    @Test
+    fun onMediaDataUpdated() =
+        testScope.runTest {
+            whenever(notificationLockscreenUserManager.isCurrentProfile(USER_ID)).thenReturn(true)
+            whenever(notificationLockscreenUserManager.isProfileAvailable(USER_ID)).thenReturn(true)
+            val controlModel by collectLastValue(underTest.mediaControl)
+            var mediaData =
+                MediaData(userId = USER_ID, instanceId = instanceId, artist = SESSION_ARTIST)
+
+            mediaDataFilter.onMediaDataLoaded(KEY, KEY, mediaData)
+
+            assertThat(controlModel?.instanceId).isEqualTo(instanceId)
+            assertThat(controlModel?.artistName).isEqualTo(SESSION_ARTIST)
+
+            mediaData =
+                MediaData(userId = USER_ID, instanceId = instanceId, artist = SESSION_ARTIST_2)
+
+            mediaDataFilter.onMediaDataLoaded(KEY, KEY, mediaData)
+
+            assertThat(controlModel?.instanceId).isEqualTo(instanceId)
+            assertThat(controlModel?.artistName).isEqualTo(SESSION_ARTIST_2)
+
+            mediaData =
+                MediaData(
+                    userId = USER_ID,
+                    instanceId = InstanceId.fakeInstanceId(2),
+                    artist = SESSION_ARTIST
+                )
+
+            mediaDataFilter.onMediaDataLoaded(KEY, KEY, mediaData)
+
+            assertThat(controlModel?.instanceId).isNotEqualTo(mediaData.instanceId)
+            assertThat(controlModel?.artistName).isEqualTo(SESSION_ARTIST_2)
+        }
+
+    companion object {
+        private const val USER_ID = 0
+        private const val KEY = "key"
+        private const val SESSION_ARTIST = "artist"
+        private const val SESSION_ARTIST_2 = "artist2"
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaRecommendationsInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaRecommendationsInteractorTest.kt
new file mode 100644
index 0000000..9656511
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaRecommendationsInteractorTest.kt
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.media.controls.domain.interactor
+
+import android.R
+import android.content.ComponentName
+import android.content.Intent
+import android.content.applicationContext
+import android.graphics.drawable.Icon
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.Expandable
+import com.android.systemui.broadcast.broadcastSender
+import com.android.systemui.broadcast.mockBroadcastSender
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.flags.Flags
+import com.android.systemui.flags.fakeFeatureFlagsClassic
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.media.controls.MediaTestHelper
+import com.android.systemui.media.controls.domain.pipeline.MediaDataFilterImpl
+import com.android.systemui.media.controls.domain.pipeline.interactor.MediaRecommendationsInteractor
+import com.android.systemui.media.controls.domain.pipeline.interactor.MediaRecommendationsInteractor.Companion.EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME
+import com.android.systemui.media.controls.domain.pipeline.interactor.mediaRecommendationsInteractor
+import com.android.systemui.media.controls.domain.pipeline.mediaDataFilter
+import com.android.systemui.media.controls.shared.model.MediaRecModel
+import com.android.systemui.media.controls.shared.model.MediaRecommendationsModel
+import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
+import com.android.systemui.plugins.activityStarter
+import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.doNothing
+import org.mockito.Mockito.spy
+import org.mockito.Mockito.verify
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class MediaRecommendationsInteractorTest : SysuiTestCase() {
+
+    private val spyContext = spy(context)
+    private val kosmos = testKosmos().apply { applicationContext = spyContext }
+    private val testScope = kosmos.testScope
+
+    private val mediaDataFilter: MediaDataFilterImpl = kosmos.mediaDataFilter
+    private val activityStarter = kosmos.activityStarter
+    private val icon: Icon = Icon.createWithResource(context, R.drawable.ic_media_play)
+    private val smartspaceMediaData: SmartspaceMediaData =
+        SmartspaceMediaData(
+            targetId = KEY_MEDIA_SMARTSPACE,
+            isActive = true,
+            packageName = PACKAGE_NAME,
+            recommendations = MediaTestHelper.getValidRecommendationList(icon),
+        )
+
+    private val underTest: MediaRecommendationsInteractor =
+        with(kosmos) {
+            broadcastSender = mockBroadcastSender
+            kosmos.mediaRecommendationsInteractor
+        }
+
+    @Test
+    fun addRecommendation_smartspaceMediaDataUpdate() =
+        testScope.runTest {
+            val recommendations by collectLastValue(underTest.recommendations)
+
+            val model =
+                MediaRecommendationsModel(
+                    key = KEY_MEDIA_SMARTSPACE,
+                    packageName = PACKAGE_NAME,
+                    areRecommendationsValid = true,
+                    mediaRecs =
+                        listOf(
+                            MediaRecModel(icon = icon),
+                            MediaRecModel(icon = icon),
+                            MediaRecModel(icon = icon)
+                        )
+                )
+
+            mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, smartspaceMediaData)
+
+            assertThat(recommendations).isEqualTo(model)
+        }
+
+    @Test
+    fun setRecommendationInactive_isActiveUpdate() =
+        testScope.runTest {
+            kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, true)
+            val isActive by collectLastValue(underTest.isActive)
+
+            mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, smartspaceMediaData)
+            assertThat(isActive).isTrue()
+
+            mediaDataFilter.onSmartspaceMediaDataLoaded(
+                KEY_MEDIA_SMARTSPACE,
+                smartspaceMediaData.copy(isActive = false)
+            )
+            assertThat(isActive).isFalse()
+        }
+
+    @Test
+    fun addInvalidRecommendation() =
+        testScope.runTest {
+            val recommendations by collectLastValue(underTest.recommendations)
+            val inValidData = smartspaceMediaData.copy(recommendations = listOf())
+
+            mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, smartspaceMediaData)
+            assertThat(recommendations?.areRecommendationsValid).isTrue()
+
+            mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, inValidData)
+            assertThat(recommendations?.areRecommendationsValid).isFalse()
+            assertThat(recommendations?.mediaRecs?.isEmpty()).isTrue()
+        }
+
+    @Test
+    fun removeRecommendation_noTrampolineActivity() {
+        val intent = Intent()
+
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+
+        underTest.removeMediaRecommendations(KEY_MEDIA_SMARTSPACE, intent, 0)
+
+        verify(kosmos.mockBroadcastSender).sendBroadcast(eq(intent))
+    }
+
+    @Test
+    fun removeRecommendation_usingTrampolineActivity() {
+        doNothing().whenever(spyContext).startActivity(any())
+        val intent = Intent()
+
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+        intent.component = ComponentName(PACKAGE_NAME, EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME)
+
+        underTest.removeMediaRecommendations(KEY_MEDIA_SMARTSPACE, intent, 0)
+
+        verify(spyContext).startActivity(eq(intent))
+    }
+
+    @Test
+    fun startSettings() {
+        underTest.startSettings()
+
+        verify(activityStarter).startActivity(any(), eq(true))
+    }
+
+    @Test
+    fun startClickIntent() {
+        doNothing().whenever(spyContext).startActivity(any())
+        val intent = Intent()
+        val expandable = mock<Expandable>()
+
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+
+        underTest.startClickIntent(expandable, intent)
+
+        verify(spyContext).startActivity(eq(intent))
+    }
+
+    companion object {
+        private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
+        private const val PACKAGE_NAME = "com.example.app"
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModelTest.kt
new file mode 100644
index 0000000..51b1911
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModelTest.kt
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.media.controls.ui.viewmodel
+
+import android.R
+import android.content.packageManager
+import android.content.pm.ApplicationInfo
+import android.graphics.drawable.Icon
+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.media.controls.MediaTestHelper
+import com.android.systemui.media.controls.domain.pipeline.MediaDataFilterImpl
+import com.android.systemui.media.controls.domain.pipeline.mediaDataFilter
+import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
+import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers
+import org.mockito.Mockito
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class MediaRecommendationsViewModelTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+
+    private val mediaDataFilter: MediaDataFilterImpl = kosmos.mediaDataFilter
+    private val packageManager = kosmos.packageManager
+    private val icon: Icon = Icon.createWithResource(context, R.drawable.ic_media_play)
+    private val drawable = context.getDrawable(R.drawable.ic_media_play)
+    private val smartspaceMediaData: SmartspaceMediaData =
+        SmartspaceMediaData(
+            targetId = KEY_MEDIA_SMARTSPACE,
+            isActive = true,
+            packageName = PACKAGE_NAME,
+            recommendations = MediaTestHelper.getValidRecommendationList(icon),
+        )
+
+    private val underTest: MediaRecommendationsViewModel = kosmos.mediaRecommendationsViewModel
+
+    @Test
+    fun loadRecommendations_recsCardViewModelIsLoaded() =
+        testScope.runTest {
+            whenever(packageManager.getApplicationIcon(Mockito.anyString())).thenReturn(drawable)
+            whenever(packageManager.getApplicationIcon(any(ApplicationInfo::class.java)))
+                .thenReturn(drawable)
+            whenever(packageManager.getApplicationInfo(eq(PACKAGE_NAME), ArgumentMatchers.anyInt()))
+                .thenReturn(ApplicationInfo())
+            whenever(packageManager.getApplicationLabel(any())).thenReturn(PACKAGE_NAME)
+            val recsCardViewModel by collectLastValue(underTest.mediaRecsCard)
+
+            context.setMockPackageManager(packageManager)
+
+            mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, smartspaceMediaData)
+
+            assertThat(recsCardViewModel).isNotNull()
+            assertThat(recsCardViewModel?.mediaRecs?.size)
+                .isEqualTo(smartspaceMediaData.recommendations.size)
+        }
+
+    companion object {
+        private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
+        private const val PACKAGE_NAME = "com.example.app"
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/logging/QSTileLoggerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/logging/QSTileLoggerTest.kt
index 4a39ba2..b7e08da 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/logging/QSTileLoggerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/logging/QSTileLoggerTest.kt
@@ -104,6 +104,7 @@
         underTest.logUserActionRejectedByPolicy(
             QSTileUserAction.Click(null),
             TileSpec.create("test_spec"),
+            "test_restriction",
         )
 
         assertThat(logBuffer.getStringBuffer()).contains("tile click: rejected by policy")
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/interactor/SensorPrivacyToggleTileDataInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/interactor/SensorPrivacyToggleTileDataInteractorTest.kt
new file mode 100644
index 0000000..d0cd56fc
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/interactor/SensorPrivacyToggleTileDataInteractorTest.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.qs.tiles.impl.sensorprivacy.domain.interactor
+
+import android.hardware.SensorPrivacyManager.Sensors.CAMERA
+import android.hardware.SensorPrivacyManager.Sensors.MICROPHONE
+import android.os.UserHandle
+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.qs.tiles.base.interactor.DataUpdateTrigger
+import com.android.systemui.qs.tiles.impl.sensorprivacy.SensorPrivacyToggleTileDataInteractor
+import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController
+import com.android.systemui.util.mockito.argumentCaptor
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.toCollection
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.Mockito.verify
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class SensorPrivacyToggleTileDataInteractorTest : SysuiTestCase() {
+    private val kosmos = Kosmos()
+    private val testScope = kosmos.testScope
+    private val mockSensorPrivacyController =
+        mock<IndividualSensorPrivacyController> {
+            whenever(isSensorBlocked(eq(CAMERA))).thenReturn(false) // determines initial value
+        }
+    private val testUser = UserHandle.of(1)
+    private val underTest =
+        SensorPrivacyToggleTileDataInteractor(
+            testScope.testScheduler,
+            mockSensorPrivacyController,
+            CAMERA
+        )
+
+    @Test
+    fun availability_isTrue() =
+        testScope.runTest {
+            whenever(mockSensorPrivacyController.supportsSensorToggle(eq(CAMERA))).thenReturn(true)
+
+            val availability = underTest.availability(testUser).toCollection(mutableListOf())
+            runCurrent()
+
+            assertThat(availability).hasSize(1)
+            assertThat(availability.last()).isTrue()
+        }
+
+    @Test
+    fun tileData_matchesPrivacyControllerIsSensorBlocked() =
+        testScope.runTest {
+            val callbackCaptor = argumentCaptor<IndividualSensorPrivacyController.Callback>()
+            val data by
+                collectLastValue(
+                    underTest.tileData(testUser, flowOf(DataUpdateTrigger.InitialRequest))
+                )
+            runCurrent()
+            verify(mockSensorPrivacyController).addCallback(callbackCaptor.capture())
+            val callback = callbackCaptor.value
+
+            runCurrent()
+            assertThat(data!!.isBlocked).isFalse()
+
+            callback.onSensorBlockedChanged(CAMERA, true)
+            runCurrent()
+            assertThat(data!!.isBlocked).isTrue()
+
+            callback.onSensorBlockedChanged(CAMERA, false)
+            runCurrent()
+            assertThat(data!!.isBlocked).isFalse()
+
+            callback.onSensorBlockedChanged(MICROPHONE, true)
+            runCurrent()
+            assertThat(data!!.isBlocked).isFalse() // We're NOT listening for MIC sensor changes
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/interactor/SensorPrivacyToggleTileUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/interactor/SensorPrivacyToggleTileUserActionInteractorTest.kt
new file mode 100644
index 0000000..562e6eb
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/interactor/SensorPrivacyToggleTileUserActionInteractorTest.kt
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.impl.sensorprivacy.domain.interactor
+
+import android.hardware.SensorPrivacyManager
+import android.hardware.SensorPrivacyManager.Sensors.CAMERA
+import android.hardware.SensorPrivacyManager.Sensors.MICROPHONE
+import android.provider.Settings
+import android.safetycenter.SafetyCenterManager
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
+import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.plugins.activityStarter
+import com.android.systemui.qs.tiles.base.actions.FakeQSTileIntentUserInputHandler
+import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandlerSubject
+import com.android.systemui.qs.tiles.base.interactor.QSTileInputTestKtx
+import com.android.systemui.qs.tiles.impl.sensorprivacy.domain.SensorPrivacyToggleTileUserActionInteractor
+import com.android.systemui.qs.tiles.impl.sensorprivacy.domain.model.SensorPrivacyToggleTileModel
+import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.eq
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class SensorPrivacyToggleTileUserActionInteractorTest : SysuiTestCase() {
+    private val kosmos = Kosmos()
+    private val inputHandler = FakeQSTileIntentUserInputHandler()
+    private val keyguardInteractor = kosmos.keyguardInteractor
+    // The keyguard repository below is the same one kosmos used to create the interactor above
+    private val keyguardRepository = kosmos.fakeKeyguardRepository
+    private val mockActivityStarter = kosmos.activityStarter
+    private val mockSensorPrivacyController = mock<IndividualSensorPrivacyController>()
+    private val fakeSafetyCenterManager = mock<SafetyCenterManager>()
+
+    private val underTest =
+        SensorPrivacyToggleTileUserActionInteractor(
+            inputHandler,
+            keyguardInteractor,
+            mockActivityStarter,
+            mockSensorPrivacyController,
+            fakeSafetyCenterManager,
+            CAMERA
+        )
+
+    @Test
+    fun handleClickWhenNotBlocked() = runTest {
+        val originalIsBlocked = false
+
+        underTest.handleInput(
+            QSTileInputTestKtx.click(SensorPrivacyToggleTileModel(originalIsBlocked))
+        )
+
+        verify(mockSensorPrivacyController)
+            .setSensorBlocked(
+                eq(SensorPrivacyManager.Sources.QS_TILE),
+                eq(CAMERA),
+                eq(!originalIsBlocked)
+            )
+    }
+
+    @Test
+    fun handleClickWhenBlocked() = runTest {
+        val originalIsBlocked = true
+
+        underTest.handleInput(
+            QSTileInputTestKtx.click(SensorPrivacyToggleTileModel(originalIsBlocked))
+        )
+
+        verify(mockSensorPrivacyController)
+            .setSensorBlocked(
+                eq(SensorPrivacyManager.Sources.QS_TILE),
+                eq(CAMERA),
+                eq(!originalIsBlocked)
+            )
+    }
+
+    @Test
+    fun handleClick_whenKeyguardIsDismissableAndShowing_whenControllerRequiresAuth() = runTest {
+        whenever(mockSensorPrivacyController.requiresAuthentication()).thenReturn(true)
+        keyguardRepository.setKeyguardDismissible(true)
+        keyguardRepository.setKeyguardShowing(true)
+        val originalIsBlocked = true
+
+        underTest.handleInput(
+            QSTileInputTestKtx.click(SensorPrivacyToggleTileModel(originalIsBlocked))
+        )
+
+        verify(mockSensorPrivacyController, never())
+            .setSensorBlocked(
+                eq(SensorPrivacyManager.Sources.QS_TILE),
+                eq(CAMERA),
+                eq(!originalIsBlocked)
+            )
+        verify(mockActivityStarter).postQSRunnableDismissingKeyguard(any())
+    }
+
+    @Test
+    fun handleLongClick_whenSafetyManagerEnabled_privacyControlsIntent() = runTest {
+        whenever(fakeSafetyCenterManager.isSafetyCenterEnabled).thenReturn(true)
+
+        underTest.handleInput(QSTileInputTestKtx.longClick(SensorPrivacyToggleTileModel(false)))
+
+        QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput {
+            assertThat(it.intent.action).isEqualTo(Settings.ACTION_PRIVACY_CONTROLS)
+        }
+    }
+
+    @Test
+    fun handleLongClick_whenSafetyManagerDisabled_privacySettingsIntent() = runTest {
+        whenever(fakeSafetyCenterManager.isSafetyCenterEnabled).thenReturn(false)
+
+        underTest.handleInput(QSTileInputTestKtx.longClick(SensorPrivacyToggleTileModel(false)))
+
+        QSTileIntentUserInputHandlerSubject.assertThat(inputHandler).handledOneIntentInput {
+            assertThat(it.intent.action).isEqualTo(Settings.ACTION_PRIVACY_SETTINGS)
+        }
+    }
+
+    @Test
+    fun handleClick_microphone_flipsController() = runTest {
+        val micUserActionInteractor =
+            SensorPrivacyToggleTileUserActionInteractor(
+                inputHandler,
+                keyguardInteractor,
+                mockActivityStarter,
+                mockSensorPrivacyController,
+                fakeSafetyCenterManager,
+                MICROPHONE
+            )
+
+        micUserActionInteractor.handleInput(
+            QSTileInputTestKtx.click(SensorPrivacyToggleTileModel(false))
+        )
+        verify(mockSensorPrivacyController)
+            .setSensorBlocked(eq(SensorPrivacyManager.Sources.QS_TILE), eq(MICROPHONE), eq(true))
+
+        micUserActionInteractor.handleInput(
+            QSTileInputTestKtx.click(SensorPrivacyToggleTileModel(true))
+        )
+        verify(mockSensorPrivacyController)
+            .setSensorBlocked(eq(SensorPrivacyManager.Sources.QS_TILE), eq(MICROPHONE), eq(false))
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/sensorprivacy/ui/SensorPrivacyToggleTileMapperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/sensorprivacy/ui/SensorPrivacyToggleTileMapperTest.kt
new file mode 100644
index 0000000..5e7aadc
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/sensorprivacy/ui/SensorPrivacyToggleTileMapperTest.kt
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.impl.sensorprivacy.ui
+
+import android.graphics.drawable.TestStubDrawable
+import android.hardware.SensorPrivacyManager.Sensors.CAMERA
+import android.hardware.SensorPrivacyManager.Sensors.MICROPHONE
+import android.widget.Switch
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.qs.tiles.impl.custom.QSTileStateSubject
+import com.android.systemui.qs.tiles.impl.sensorprivacy.domain.model.SensorPrivacyToggleTileModel
+import com.android.systemui.qs.tiles.impl.sensorprivacy.qsCameraSensorPrivacyToggleTileConfig
+import com.android.systemui.qs.tiles.impl.sensorprivacy.qsMicrophoneSensorPrivacyToggleTileConfig
+import com.android.systemui.qs.tiles.impl.sensorprivacy.ui.SensorPrivacyTileResources.CameraPrivacyTileResources
+import com.android.systemui.qs.tiles.impl.sensorprivacy.ui.SensorPrivacyTileResources.MicrophonePrivacyTileResources
+import com.android.systemui.qs.tiles.viewmodel.QSTileState
+import com.android.systemui.res.R
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class SensorPrivacyToggleTileMapperTest : SysuiTestCase() {
+    private val kosmos = Kosmos()
+    private val cameraConfig = kosmos.qsCameraSensorPrivacyToggleTileConfig
+    private val micConfig = kosmos.qsMicrophoneSensorPrivacyToggleTileConfig
+
+    @Test
+    fun mapCamera_notBlocked() {
+        val mapper = createMapper(CameraPrivacyTileResources)
+        val inputModel = SensorPrivacyToggleTileModel(false)
+
+        val outputState = mapper.map(cameraConfig, inputModel)
+
+        val expectedState =
+            createSensorPrivacyToggleTileState(
+                QSTileState.ActivationState.ACTIVE,
+                context.getString(R.string.quick_settings_camera_mic_available),
+                R.drawable.qs_camera_access_icon_on,
+                null,
+                CAMERA
+            )
+        QSTileStateSubject.assertThat(outputState).isEqualTo(expectedState)
+    }
+
+    @Test
+    fun mapCamera_blocked() {
+        val mapper = createMapper(CameraPrivacyTileResources)
+        val inputModel = SensorPrivacyToggleTileModel(true)
+
+        val outputState = mapper.map(cameraConfig, inputModel)
+
+        val expectedState =
+            createSensorPrivacyToggleTileState(
+                QSTileState.ActivationState.INACTIVE,
+                context.getString(R.string.quick_settings_camera_mic_blocked),
+                R.drawable.qs_camera_access_icon_off,
+                null,
+                CAMERA
+            )
+        QSTileStateSubject.assertThat(outputState).isEqualTo(expectedState)
+    }
+
+    @Test
+    fun mapMic_notBlocked() {
+        val mapper = createMapper(MicrophonePrivacyTileResources)
+        val inputModel = SensorPrivacyToggleTileModel(false)
+
+        val outputState = mapper.map(micConfig, inputModel)
+
+        val expectedState =
+            createSensorPrivacyToggleTileState(
+                QSTileState.ActivationState.ACTIVE,
+                context.getString(R.string.quick_settings_camera_mic_available),
+                R.drawable.qs_mic_access_on,
+                null,
+                MICROPHONE
+            )
+        QSTileStateSubject.assertThat(outputState).isEqualTo(expectedState)
+    }
+
+    @Test
+    fun mapMic_blocked() {
+        val mapper = createMapper(MicrophonePrivacyTileResources)
+        val inputModel = SensorPrivacyToggleTileModel(true)
+
+        val outputState = mapper.map(micConfig, inputModel)
+
+        val expectedState =
+            createSensorPrivacyToggleTileState(
+                QSTileState.ActivationState.INACTIVE,
+                context.getString(R.string.quick_settings_camera_mic_blocked),
+                R.drawable.qs_mic_access_off,
+                null,
+                MICROPHONE
+            )
+        QSTileStateSubject.assertThat(outputState).isEqualTo(expectedState)
+    }
+
+    private fun createMapper(
+        sensorResources: SensorPrivacyTileResources
+    ): SensorPrivacyToggleTileMapper {
+        val mapper =
+            SensorPrivacyToggleTileMapper(
+                context.orCreateTestableResources
+                    .apply {
+                        addOverride(R.drawable.qs_camera_access_icon_off, TestStubDrawable())
+                        addOverride(R.drawable.qs_camera_access_icon_on, TestStubDrawable())
+                        addOverride(R.drawable.qs_mic_access_off, TestStubDrawable())
+                        addOverride(R.drawable.qs_mic_access_on, TestStubDrawable())
+                    }
+                    .resources,
+                context.theme,
+                sensorResources,
+            )
+        return mapper
+    }
+
+    private fun createSensorPrivacyToggleTileState(
+        activationState: QSTileState.ActivationState,
+        secondaryLabel: String,
+        iconRes: Int,
+        stateDescription: CharSequence?,
+        sensorId: Int,
+    ): QSTileState {
+        val label =
+            if (sensorId == CAMERA) context.getString(R.string.quick_settings_camera_label)
+            else context.getString(R.string.quick_settings_mic_label)
+
+        return QSTileState(
+            { Icon.Loaded(context.getDrawable(iconRes)!!, null) },
+            label,
+            activationState,
+            secondaryLabel,
+            setOf(QSTileState.UserAction.CLICK, QSTileState.UserAction.LONG_CLICK),
+            label,
+            stateDescription,
+            QSTileState.SideViewIcon.None,
+            QSTileState.EnabledState.ENABLED,
+            Switch::class.qualifiedName
+        )
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt
index a8bc8d6..9ce2e0f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt
@@ -60,7 +60,9 @@
     @Mock private lateinit var qsTileAnalytics: QSTileAnalytics
 
     private val tileConfig =
-        QSTileConfigTestBuilder.build { policy = QSTilePolicy.Restricted("test_restriction") }
+        QSTileConfigTestBuilder.build {
+            policy = QSTilePolicy.Restricted(listOf("test_restriction"))
+        }
 
     private val userRepository = FakeUserRepository()
     private val tileDataInteractor = FakeQSTileDataInteractor<String>()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelUserInputTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelUserInputTest.kt
index 18cdd71..6066d24 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelUserInputTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelUserInputTest.kt
@@ -16,18 +16,17 @@
 
 package com.android.systemui.qs.tiles.viewmodel
 
-import android.platform.test.annotations.EnabledOnRavenwood
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
-import com.android.settingslib.RestrictedLockUtils
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.classifier.FalsingManagerFake
 import com.android.systemui.common.shared.model.ContentDescription
 import com.android.systemui.common.shared.model.Icon
 import com.android.systemui.qs.tiles.base.analytics.QSTileAnalytics
 import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger
-import com.android.systemui.qs.tiles.base.interactor.DisabledByPolicyInteractor
 import com.android.systemui.qs.tiles.base.interactor.FakeDisabledByPolicyInteractor
+import com.android.systemui.qs.tiles.base.interactor.FakeDisabledByPolicyInteractor.Companion.DISABLED_RESTRICTION
+import com.android.systemui.qs.tiles.base.interactor.FakeDisabledByPolicyInteractor.Companion.ENABLED_RESTRICTION
 import com.android.systemui.qs.tiles.base.interactor.FakeQSTileDataInteractor
 import com.android.systemui.qs.tiles.base.interactor.FakeQSTileUserActionInteractor
 import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper
@@ -54,7 +53,6 @@
 
 /** Tests all possible [QSTileUserAction]s. If you need */
 @MediumTest
-@EnabledOnRavenwood
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalCoroutinesApi::class)
 class QSTileViewModelUserInputTest : SysuiTestCase() {
@@ -65,8 +63,10 @@
     // TODO(b/299909989): this should be parametrised. b/299096521 blocks this.
     private val userAction: QSTileUserAction = QSTileUserAction.Click(null)
 
-    private val tileConfig =
-        QSTileConfigTestBuilder.build { policy = QSTilePolicy.Restricted("test_restriction") }
+    private var tileConfig =
+        QSTileConfigTestBuilder.build {
+            policy = QSTilePolicy.Restricted(listOf(ENABLED_RESTRICTION))
+        }
 
     private val userRepository = FakeUserRepository()
     private val tileDataInteractor = FakeQSTileDataInteractor<String>()
@@ -112,11 +112,13 @@
     @Test
     fun disabledByPolicyUserInputIsSkipped() =
         testScope.runTest {
+            tileConfig =
+                QSTileConfigTestBuilder.build {
+                    policy = QSTilePolicy.Restricted(listOf(DISABLED_RESTRICTION))
+                }
+            underTest = createViewModel(testScope)
             underTest.state.launchIn(backgroundScope)
-            disabledByPolicyInteractor.policyResult =
-                DisabledByPolicyInteractor.PolicyResult.TileDisabled(
-                    RestrictedLockUtils.EnforcedAdmin()
-                )
+
             runCurrent()
 
             underTest.onActionPerformed(userAction)
@@ -125,7 +127,81 @@
             assertThat(tileDataInteractor.triggers.last())
                 .isNotInstanceOf(DataUpdateTrigger.UserInput::class.java)
             verify(qsTileLogger)
-                .logUserActionRejectedByPolicy(eq(userAction), eq(tileConfig.tileSpec))
+                .logUserActionRejectedByPolicy(
+                    eq(userAction),
+                    eq(tileConfig.tileSpec),
+                    eq(DISABLED_RESTRICTION)
+                )
+            verify(qsTileAnalytics, never()).trackUserAction(any(), any())
+        }
+
+    @Test
+    fun disabledByPolicySecondRestriction_userInputIsSkipped() =
+        testScope.runTest {
+            tileConfig =
+                QSTileConfigTestBuilder.build {
+                    policy =
+                        QSTilePolicy.Restricted(listOf(ENABLED_RESTRICTION, DISABLED_RESTRICTION))
+                }
+
+            underTest = createViewModel(testScope)
+
+            underTest.state.launchIn(backgroundScope)
+
+            runCurrent()
+
+            underTest.onActionPerformed(userAction)
+            runCurrent()
+
+            assertThat(tileDataInteractor.triggers.last())
+                .isNotInstanceOf(DataUpdateTrigger.UserInput::class.java)
+            verify(qsTileLogger)
+                .logUserActionRejectedByPolicy(
+                    eq(userAction),
+                    eq(tileConfig.tileSpec),
+                    eq(DISABLED_RESTRICTION)
+                )
+            verify(qsTileAnalytics, never()).trackUserAction(any(), any())
+        }
+
+    /** This tests that the policies are applied sequentially */
+    @Test
+    fun disabledByPolicySecondRestriction_onlyFirstIsTriggered() =
+        testScope.runTest {
+            tileConfig =
+                QSTileConfigTestBuilder.build {
+                    policy =
+                        QSTilePolicy.Restricted(
+                            listOf(
+                                DISABLED_RESTRICTION,
+                                FakeDisabledByPolicyInteractor.DISABLED_RESTRICTION_2
+                            )
+                        )
+                }
+
+            underTest = createViewModel(testScope)
+
+            underTest.state.launchIn(backgroundScope)
+
+            runCurrent()
+
+            underTest.onActionPerformed(userAction)
+            runCurrent()
+
+            assertThat(tileDataInteractor.triggers.last())
+                .isNotInstanceOf(DataUpdateTrigger.UserInput::class.java)
+            verify(qsTileLogger)
+                .logUserActionRejectedByPolicy(
+                    eq(userAction),
+                    eq(tileConfig.tileSpec),
+                    eq(DISABLED_RESTRICTION)
+                )
+            verify(qsTileLogger, never())
+                .logUserActionRejectedByPolicy(
+                    eq(userAction),
+                    eq(tileConfig.tileSpec),
+                    eq(FakeDisabledByPolicyInteractor.DISABLED_RESTRICTION_2)
+                )
             verify(qsTileAnalytics, never()).trackUserAction(any(), any())
         }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt
index 27c4ec1..f2eb7f4 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt
@@ -35,6 +35,7 @@
 import com.android.systemui.qs.QSImpl
 import com.android.systemui.qs.dagger.QSComponent
 import com.android.systemui.qs.dagger.QSSceneComponent
+import com.android.systemui.settings.brightness.MirrorController
 import com.android.systemui.shade.data.repository.fakeShadeRepository
 import com.android.systemui.shade.domain.interactor.shadeInteractor
 import com.android.systemui.shade.shared.model.ShadeMode
@@ -496,4 +497,33 @@
             runCurrent()
             verify(qsImpl!!).setInSplitShade(true)
         }
+
+    @Test
+    fun requestCloseCustomizer() =
+        testScope.runTest {
+            val qsImpl by collectLastValue(underTest.qsImpl)
+
+            underTest.inflate(context)
+            runCurrent()
+
+            underTest.requestCloseCustomizer()
+            verify(qsImpl!!).closeCustomizer()
+        }
+
+    @Test
+    fun setBrightnessMirrorController() =
+        testScope.runTest {
+            val qsImpl by collectLastValue(underTest.qsImpl)
+
+            underTest.inflate(context)
+            runCurrent()
+
+            val mirrorController = mock<MirrorController>()
+            underTest.setBrightnessMirrorController(mirrorController)
+
+            verify(qsImpl!!).setBrightnessMirrorController(mirrorController)
+
+            underTest.setBrightnessMirrorController(null)
+            verify(qsImpl!!).setBrightnessMirrorController(null)
+        }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
index 6108904..139289a 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
@@ -31,9 +31,12 @@
 import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel
 import com.android.systemui.qs.ui.adapter.FakeQSSceneAdapter
 import com.android.systemui.res.R
+import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.settings.brightness.ui.viewmodel.brightnessMirrorViewModel
 import com.android.systemui.shade.domain.interactor.privacyChipInteractor
 import com.android.systemui.shade.domain.interactor.shadeHeaderClockInteractor
+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 com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
@@ -86,6 +89,7 @@
             flags,
             scope = testScope.backgroundScope,
         )
+    private val sceneInteractor = kosmos.sceneInteractor
 
     private lateinit var shadeHeaderViewModel: ShadeHeaderViewModel
 
@@ -97,6 +101,7 @@
             ShadeHeaderViewModel(
                 applicationScope = testScope.backgroundScope,
                 context = context,
+                shadeInteractor = kosmos.shadeInteractor,
                 mobileIconsInteractor = mobileIconsInteractor,
                 mobileIconsViewModel = mobileIconsViewModel,
                 privacyChipInteractor = kosmos.privacyChipInteractor,
@@ -106,16 +111,18 @@
 
         underTest =
             QuickSettingsSceneViewModel(
+                brightnessMirrorViewModel = kosmos.brightnessMirrorViewModel,
                 shadeHeaderViewModel = shadeHeaderViewModel,
                 qsSceneAdapter = qsFlexiglassAdapter,
                 notifications = kosmos.notificationsPlaceholderViewModel,
                 footerActionsViewModelFactory = footerActionsViewModelFactory,
                 footerActionsController = footerActionsController,
+                sceneInteractor = sceneInteractor,
             )
     }
 
     @Test
-    fun destinationsNotCustomizing() =
+    fun destinations_whenNotCustomizing() =
         testScope.runTest {
             overrideResource(R.bool.config_use_split_notification_shade, false)
             val destinations by collectLastValue(underTest.destinationScenes)
@@ -131,18 +138,36 @@
         }
 
     @Test
-    fun destinationsCustomizing() =
+    fun destinations_whenNotCustomizing_withPreviousSceneLockscreen() =
+        testScope.runTest {
+            overrideResource(R.bool.config_use_split_notification_shade, false)
+            qsFlexiglassAdapter.setCustomizing(false)
+            val destinations by collectLastValue(underTest.destinationScenes)
+
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val previousScene by collectLastValue(sceneInteractor.previousScene)
+            sceneInteractor.changeScene(Scenes.Lockscreen, "reason")
+            sceneInteractor.changeScene(Scenes.QuickSettings, "reason")
+            assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
+            assertThat(previousScene).isEqualTo(Scenes.Lockscreen)
+
+            assertThat(destinations)
+                .isEqualTo(
+                    mapOf(
+                        Back to UserActionResult(Scenes.Lockscreen),
+                        Swipe(SwipeDirection.Up) to UserActionResult(Scenes.Lockscreen),
+                    )
+                )
+        }
+
+    @Test
+    fun destinations_whenCustomizing_noDestinations() =
         testScope.runTest {
             overrideResource(R.bool.config_use_split_notification_shade, false)
             val destinations by collectLastValue(underTest.destinationScenes)
             qsFlexiglassAdapter.setCustomizing(true)
 
-            assertThat(destinations)
-                .isEqualTo(
-                    mapOf(
-                        Back to UserActionResult(Scenes.QuickSettings),
-                    )
-                )
+            assertThat(destinations).isEmpty()
         }
 
     @Test
@@ -162,18 +187,13 @@
         }
 
     @Test
-    fun destinations_whenCustomizing_inSplitShade() =
+    fun destinations_whenCustomizing_inSplitShade_noDestinations() =
         testScope.runTest {
             overrideResource(R.bool.config_use_split_notification_shade, true)
             val destinations by collectLastValue(underTest.destinationScenes)
             qsFlexiglassAdapter.setCustomizing(true)
 
-            assertThat(destinations)
-                .isEqualTo(
-                    mapOf(
-                        Back to UserActionResult(Scenes.QuickSettings),
-                    )
-                )
+            assertThat(destinations).isEmpty()
         }
 
     @Test
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 af9abcd..9856f90 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
@@ -48,7 +48,9 @@
 import com.android.systemui.communal.domain.interactor.communalInteractor
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryFaceAuthInteractor
 import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
+import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
 import com.android.systemui.flags.Flags
 import com.android.systemui.flags.fakeFeatureFlagsClassic
 import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
@@ -64,6 +66,7 @@
 import com.android.systemui.qs.footerActionsController
 import com.android.systemui.qs.footerActionsViewModelFactory
 import com.android.systemui.qs.ui.adapter.FakeQSSceneAdapter
+import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.domain.startable.SceneContainerStartable
 import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
@@ -71,6 +74,7 @@
 import com.android.systemui.scene.shared.model.fakeSceneDataSource
 import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
 import com.android.systemui.settings.FakeDisplayTracker
+import com.android.systemui.settings.brightness.ui.viewmodel.brightnessMirrorViewModel
 import com.android.systemui.shade.domain.interactor.privacyChipInteractor
 import com.android.systemui.shade.domain.interactor.shadeHeaderClockInteractor
 import com.android.systemui.shade.domain.interactor.shadeInteractor
@@ -86,7 +90,6 @@
 import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
 import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
 import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
-import com.android.systemui.statusbar.policy.data.repository.fakeDeviceProvisioningRepository
 import com.android.systemui.statusbar.policy.domain.interactor.deviceProvisioningInteractor
 import com.android.systemui.telephony.data.repository.fakeTelephonyRepository
 import com.android.systemui.testKosmos
@@ -242,6 +245,7 @@
             ShadeHeaderViewModel(
                 applicationScope = testScope.backgroundScope,
                 context = context,
+                shadeInteractor = kosmos.shadeInteractor,
                 mobileIconsInteractor = mobileIconsInteractor,
                 mobileIconsViewModel = mobileIconsViewModel,
                 privacyChipInteractor = kosmos.privacyChipInteractor,
@@ -256,14 +260,14 @@
                 shadeHeaderViewModel = shadeHeaderViewModel,
                 qsSceneAdapter = qsFlexiglassAdapter,
                 notifications = kosmos.notificationsPlaceholderViewModel,
+                brightnessMirrorViewModel = kosmos.brightnessMirrorViewModel,
                 mediaDataManager = mediaDataManager,
                 shadeInteractor = kosmos.shadeInteractor,
                 footerActionsController = kosmos.footerActionsController,
                 footerActionsViewModelFactory = kosmos.footerActionsViewModelFactory,
+                sceneInteractor = sceneInteractor,
             )
 
-        kosmos.fakeDeviceEntryRepository.setUnlocked(false)
-
         val displayTracker = FakeDisplayTracker(context)
         val sysUiState = SysUiState(displayTracker, kosmos.sceneContainerPlugin)
         val startable =
@@ -286,6 +290,9 @@
                 deviceProvisioningInteractor = kosmos.deviceProvisioningInteractor,
                 centralSurfaces = mock(),
                 headsUpInteractor = kosmos.headsUpNotificationInteractor,
+                occlusionInteractor = kosmos.sceneContainerOcclusionInteractor,
+                faceUnlockInteractor = kosmos.deviceEntryFaceAuthInteractor,
+                deviceUnlockedInteractor = kosmos.deviceUnlockedInteractor,
             )
         startable.start()
 
@@ -366,8 +373,11 @@
     fun swipeUpOnShadeScene_withAuthMethodSwipe_lockscreenDismissed_goesToGone() =
         testScope.runTest {
             val destinationScenes by collectLastValue(shadeSceneViewModel.destinationScenes)
+            val canSwipeToEnter by collectLastValue(deviceEntryInteractor.canSwipeToEnter)
+
             setAuthMethod(AuthenticationMethodModel.None, enableLockscreen = true)
-            assertThat(deviceEntryInteractor.canSwipeToEnter.value).isTrue()
+
+            assertThat(canSwipeToEnter).isTrue()
             assertCurrentScene(Scenes.Lockscreen)
 
             // Emulate a user swipe to dismiss the lockscreen.
@@ -432,17 +442,6 @@
         }
 
     @Test
-    fun deviceWakesUpWhileUnlocked_dismissesLockscreen() =
-        testScope.runTest {
-            unlockDevice()
-            assertCurrentScene(Scenes.Gone)
-            putDeviceToSleep(instantlyLockDevice = false)
-            assertCurrentScene(Scenes.Lockscreen)
-            wakeUpDevice()
-            assertCurrentScene(Scenes.Gone)
-        }
-
-    @Test
     fun swipeUpOnLockscreenWhileUnlocked_dismissesLockscreen() =
         testScope.runTest {
             unlockDevice()
@@ -535,7 +534,11 @@
             fakeSceneDataSource.pause()
             introduceLockedSim()
             emulatePendingTransitionProgress(expectedVisible = true)
-            enterSimPin(authMethodAfterSimUnlock = AuthenticationMethodModel.None)
+            enterSimPin(
+                authMethodAfterSimUnlock = AuthenticationMethodModel.None,
+                enableLockscreen = false
+            )
+
             assertCurrentScene(Scenes.Gone)
         }
 
@@ -549,21 +552,6 @@
             assertCurrentScene(Scenes.Lockscreen)
         }
 
-    @Test
-    fun deviceProvisioningAndFactoryResetProtection() =
-        testScope.runTest {
-            val isVisible by collectLastValue(sceneContainerViewModel.isVisible)
-            kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(false)
-            kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(true)
-            assertThat(isVisible).isFalse()
-
-            kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(false)
-            assertThat(isVisible).isFalse()
-
-            kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(true)
-            assertThat(isVisible).isTrue()
-        }
-
     /**
      * Asserts that the current scene in the view-model matches what's expected.
      *
@@ -718,7 +706,6 @@
             .that(authMethod.isSecure)
             .isTrue()
 
-        kosmos.fakeDeviceEntryRepository.setUnlocked(false)
         runCurrent()
     }
 
@@ -731,9 +718,7 @@
         emulateUserDrivenTransition(Scenes.Bouncer)
         fakeSceneDataSource.pause()
         enterPin()
-        // This repository state is not changed by the AuthInteractor, it relies on
-        // KeyguardStateController.
-        kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+
         emulatePendingTransitionProgress(
             expectedVisible = false,
         )
@@ -773,7 +758,8 @@
      * Does not assert that the device is locked or unlocked.
      */
     private fun TestScope.enterSimPin(
-        authMethodAfterSimUnlock: AuthenticationMethodModel = AuthenticationMethodModel.None
+        authMethodAfterSimUnlock: AuthenticationMethodModel = AuthenticationMethodModel.None,
+        enableLockscreen: Boolean = true,
     ) {
         assertWithMessage("Cannot enter PIN when not on the Bouncer scene!")
             .that(getCurrentSceneInUi())
@@ -788,9 +774,11 @@
             pinBouncerViewModel.onPinButtonClicked(digit)
         }
         pinBouncerViewModel.onAuthenticateButtonClicked()
-        setAuthMethod(authMethodAfterSimUnlock)
         kosmos.fakeMobileConnectionsRepository.isAnySimSecure.value = false
         runCurrent()
+
+        setAuthMethod(authMethodAfterSimUnlock, enableLockscreen)
+        runCurrent()
     }
 
     /** Changes device wakefulness state from asleep to awake, going through intermediary states. */
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt
index 3d66192..ae31058 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt
@@ -140,4 +140,23 @@
                     ObservableTransitionState.Idle(kosmos.sceneContainerConfig.initialSceneKey)
                 )
         }
+
+    @Test
+    fun previousScene() =
+        testScope.runTest {
+            val underTest = kosmos.sceneContainerRepository
+            val currentScene by collectLastValue(underTest.currentScene)
+            val previousScene by collectLastValue(underTest.previousScene)
+
+            assertThat(previousScene).isNull()
+
+            val firstScene = currentScene
+            underTest.changeScene(Scenes.Shade)
+            assertThat(previousScene).isEqualTo(firstScene)
+            assertThat(currentScene).isEqualTo(Scenes.Shade)
+
+            underTest.changeScene(Scenes.QuickSettings)
+            assertThat(previousScene).isEqualTo(Scenes.Shade)
+            assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
+        }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractorTest.kt
new file mode 100644
index 0000000..c3366ad
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractorTest.kt
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.domain.interactor
+
+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.coroutines.collectLastValue
+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.testScope
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.shared.model.sceneDataSource
+import com.android.systemui.statusbar.domain.interactor.keyguardOcclusionInteractor
+import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.mock
+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.flow.flowOf
+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 SceneContainerOcclusionInteractorTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+    private val keyguardOcclusionInteractor = kosmos.keyguardOcclusionInteractor
+    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+    private val keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor
+    private val mutableTransitionState =
+        MutableStateFlow<ObservableTransitionState>(
+            ObservableTransitionState.Idle(Scenes.Lockscreen)
+        )
+    private val sceneInteractor =
+        kosmos.sceneInteractor.apply { setTransitionState(mutableTransitionState) }
+    private val sceneDataSource =
+        kosmos.sceneDataSource.apply { changeScene(toScene = Scenes.Lockscreen) }
+
+    private val underTest = kosmos.sceneContainerOcclusionInteractor
+
+    @Test
+    fun invisibleDueToOcclusion() =
+        testScope.runTest {
+            val invisibleDueToOcclusion by collectLastValue(underTest.invisibleDueToOcclusion)
+            val keyguardState by collectLastValue(keyguardTransitionInteractor.currentKeyguardState)
+
+            // Assert that we have the desired preconditions:
+            assertThat(keyguardState).isEqualTo(KeyguardState.LOCKSCREEN)
+            assertThat(sceneInteractor.currentScene.value).isEqualTo(Scenes.Lockscreen)
+            assertThat(sceneInteractor.transitionState.value)
+                .isEqualTo(ObservableTransitionState.Idle(Scenes.Lockscreen))
+            assertWithMessage("Should start unoccluded").that(invisibleDueToOcclusion).isFalse()
+
+            // Actual testing starts here:
+            showOccludingActivity()
+            assertWithMessage("Should become occluded when occluding activity is shown")
+                .that(invisibleDueToOcclusion)
+                .isTrue()
+
+            transitionIntoAod {
+                assertWithMessage("Should become unoccluded when transitioning into AOD")
+                    .that(invisibleDueToOcclusion)
+                    .isFalse()
+            }
+            assertWithMessage("Should stay unoccluded when in AOD")
+                .that(invisibleDueToOcclusion)
+                .isFalse()
+
+            transitionOutOfAod {
+                assertWithMessage("Should remain unoccluded while transitioning away from AOD")
+                    .that(invisibleDueToOcclusion)
+                    .isFalse()
+            }
+            assertWithMessage("Should become occluded now that no longer in AOD")
+                .that(invisibleDueToOcclusion)
+                .isTrue()
+
+            expandShade {
+                assertWithMessage("Should become unoccluded once shade begins to expand")
+                    .that(invisibleDueToOcclusion)
+                    .isFalse()
+            }
+            assertWithMessage("Should be unoccluded when shade is fully expanded")
+                .that(invisibleDueToOcclusion)
+                .isFalse()
+
+            collapseShade {
+                assertWithMessage("Should remain unoccluded while shade is collapsing")
+                    .that(invisibleDueToOcclusion)
+                    .isFalse()
+            }
+            assertWithMessage("Should become occluded now that shade is fully collapsed")
+                .that(invisibleDueToOcclusion)
+                .isTrue()
+
+            hideOccludingActivity()
+            assertWithMessage("Should become unoccluded once the occluding activity is hidden")
+                .that(invisibleDueToOcclusion)
+                .isFalse()
+        }
+
+    /** Simulates the appearance of a show-when-locked `Activity` in the foreground. */
+    private fun TestScope.showOccludingActivity() {
+        keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop(
+            showWhenLockedActivityOnTop = true,
+            taskInfo = mock(),
+        )
+        runCurrent()
+    }
+
+    /** Simulates the disappearance of a show-when-locked `Activity` from the foreground. */
+    private fun TestScope.hideOccludingActivity() {
+        keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop(
+            showWhenLockedActivityOnTop = false,
+        )
+        runCurrent()
+    }
+
+    /** Simulates a user-driven gradual expansion of the shade. */
+    private fun TestScope.expandShade(
+        assertMidTransition: () -> Unit = {},
+    ) {
+        val progress = MutableStateFlow(0f)
+        mutableTransitionState.value =
+            ObservableTransitionState.Transition(
+                fromScene = sceneDataSource.currentScene.value,
+                toScene = Scenes.Shade,
+                progress = progress,
+                isInitiatedByUserInput = true,
+                isUserInputOngoing = flowOf(true),
+            )
+        runCurrent()
+
+        progress.value = 0.5f
+        runCurrent()
+        assertMidTransition()
+
+        progress.value = 1f
+        runCurrent()
+
+        mutableTransitionState.value = ObservableTransitionState.Idle(Scenes.Shade)
+        runCurrent()
+    }
+
+    /** Simulates a user-driven gradual collapse of the shade. */
+    private fun TestScope.collapseShade(
+        assertMidTransition: () -> Unit = {},
+    ) {
+        val progress = MutableStateFlow(0f)
+        mutableTransitionState.value =
+            ObservableTransitionState.Transition(
+                fromScene = Scenes.Shade,
+                toScene = Scenes.Lockscreen,
+                progress = progress,
+                isInitiatedByUserInput = true,
+                isUserInputOngoing = flowOf(true),
+            )
+        runCurrent()
+
+        progress.value = 0.5f
+        runCurrent()
+        assertMidTransition()
+
+        progress.value = 1f
+        runCurrent()
+
+        mutableTransitionState.value = ObservableTransitionState.Idle(Scenes.Lockscreen)
+        runCurrent()
+    }
+
+    /** Simulates a transition into AOD. */
+    private suspend fun TestScope.transitionIntoAod(
+        assertMidTransition: () -> Unit = {},
+    ) {
+        val currentKeyguardState = keyguardTransitionInteractor.getCurrentState()
+        keyguardTransitionRepository.sendTransitionStep(
+            TransitionStep(
+                from = currentKeyguardState,
+                to = KeyguardState.AOD,
+                value = 0f,
+                transitionState = TransitionState.STARTED,
+            )
+        )
+        runCurrent()
+
+        keyguardTransitionRepository.sendTransitionStep(
+            TransitionStep(
+                from = currentKeyguardState,
+                to = KeyguardState.AOD,
+                value = 0.5f,
+                transitionState = TransitionState.RUNNING,
+            )
+        )
+        runCurrent()
+        assertMidTransition()
+
+        keyguardTransitionRepository.sendTransitionStep(
+            TransitionStep(
+                from = currentKeyguardState,
+                to = KeyguardState.AOD,
+                value = 1f,
+                transitionState = TransitionState.FINISHED,
+            )
+        )
+        runCurrent()
+    }
+
+    /** Simulates a transition away from AOD. */
+    private suspend fun TestScope.transitionOutOfAod(
+        assertMidTransition: () -> Unit = {},
+    ) {
+        keyguardTransitionRepository.sendTransitionStep(
+            TransitionStep(
+                from = KeyguardState.AOD,
+                to = KeyguardState.LOCKSCREEN,
+                value = 0f,
+                transitionState = TransitionState.STARTED,
+            )
+        )
+        runCurrent()
+
+        keyguardTransitionRepository.sendTransitionStep(
+            TransitionStep(
+                from = KeyguardState.AOD,
+                to = KeyguardState.LOCKSCREEN,
+                value = 0.5f,
+                transitionState = TransitionState.RUNNING,
+            )
+        )
+        runCurrent()
+        assertMidTransition()
+
+        keyguardTransitionRepository.sendTransitionStep(
+            TransitionStep(
+                from = KeyguardState.AOD,
+                to = KeyguardState.LOCKSCREEN,
+                value = 1f,
+                transitionState = TransitionState.FINISHED,
+            )
+        )
+        runCurrent()
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt
index f645f1c..b179c30 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt
@@ -23,7 +23,8 @@
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
+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.scene.data.repository.sceneContainerRepository
 import com.android.systemui.scene.sceneContainerConfig
@@ -79,7 +80,9 @@
             val currentScene by collectLastValue(underTest.currentScene)
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
 
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             runCurrent()
 
             underTest.changeScene(Scenes.Gone, "reason")
@@ -88,11 +91,7 @@
 
     @Test(expected = IllegalStateException::class)
     fun changeScene_toGoneWhenStillLocked_throws() =
-        testScope.runTest {
-            kosmos.fakeDeviceEntryRepository.setUnlocked(false)
-
-            underTest.changeScene(Scenes.Gone, "reason")
-        }
+        testScope.runTest { underTest.changeScene(Scenes.Gone, "reason") }
 
     @Test
     fun sceneChanged_inDataSource() =
@@ -292,4 +291,19 @@
 
             assertThat(isVisible).isFalse()
         }
+
+    @Test
+    fun previousScene() =
+        testScope.runTest {
+            val currentScene by collectLastValue(underTest.currentScene)
+            val previousScene by collectLastValue(underTest.previousScene)
+            assertThat(previousScene).isNull()
+
+            val firstScene = currentScene
+            underTest.changeScene(toScene = Scenes.Shade, "reason")
+            assertThat(previousScene).isEqualTo(firstScene)
+
+            underTest.changeScene(toScene = Scenes.QuickSettings, "reason")
+            assertThat(previousScene).isEqualTo(Scenes.Shade)
+        }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
index f018cc1..3fd5306 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
@@ -37,20 +37,28 @@
 import com.android.systemui.classifier.falsingManager
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryFaceAuthInteractor
 import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
+import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
+import com.android.systemui.keyguard.data.repository.deviceEntryFingerprintAuthRepository
 import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFaceAuthRepository
+import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
 import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
+import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
 import com.android.systemui.kosmos.testScope
-import com.android.systemui.model.SysUiState
+import com.android.systemui.model.sysUiState
 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.PowerInteractorFactory
+import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.shared.model.fakeSceneDataSource
+import com.android.systemui.shared.system.QuickStepContract
 import com.android.systemui.statusbar.NotificationShadeWindowController
+import com.android.systemui.statusbar.domain.interactor.keyguardOcclusionInteractor
 import com.android.systemui.statusbar.notification.data.repository.FakeHeadsUpRowRepository
 import com.android.systemui.statusbar.notification.data.repository.HeadsUpRowRepository
 import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository
@@ -76,6 +84,7 @@
 import org.mockito.Mock
 import org.mockito.Mockito.clearInvocations
 import org.mockito.Mockito.never
+import org.mockito.Mockito.spy
 import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
@@ -97,7 +106,7 @@
     private val faceAuthRepository by lazy { kosmos.fakeDeviceEntryFaceAuthRepository }
     private val deviceEntryInteractor by lazy { kosmos.deviceEntryInteractor }
     private val keyguardInteractor by lazy { kosmos.keyguardInteractor }
-    private val sysUiState: SysUiState = mock()
+    private val sysUiState = spy(kosmos.sysUiState)
     private val falsingCollector: FalsingCollector = mock()
     private val powerInteractor = PowerInteractorFactory.create().powerInteractor
     private val fakeSceneDataSource = kosmos.fakeSceneDataSource
@@ -128,6 +137,9 @@
                 deviceProvisioningInteractor = kosmos.deviceProvisioningInteractor,
                 centralSurfaces = centralSurfaces,
                 headsUpInteractor = kosmos.headsUpNotificationInteractor,
+                occlusionInteractor = kosmos.sceneContainerOcclusionInteractor,
+                faceUnlockInteractor = kosmos.deviceEntryFaceAuthInteractor,
+                deviceUnlockedInteractor = kosmos.deviceUnlockedInteractor,
             )
     }
 
@@ -138,6 +150,7 @@
             val isVisible by collectLastValue(sceneInteractor.isVisible)
             val transitionStateFlow =
                 prepareState(
+                    authenticationMethod = AuthenticationMethodModel.Pin,
                     isDeviceUnlocked = true,
                     initialSceneKey = Scenes.Gone,
                 )
@@ -187,27 +200,43 @@
         }
 
     @Test
-    fun hydrateVisibility_basedOnDeviceProvisioningAndFactoryResetProtection() =
+    fun hydrateVisibility_basedOnDeviceProvisioning() =
         testScope.runTest {
             val isVisible by collectLastValue(sceneInteractor.isVisible)
             prepareState(
+                authenticationMethod = AuthenticationMethodModel.Pin,
                 isDeviceUnlocked = true,
                 initialSceneKey = Scenes.Lockscreen,
                 isDeviceProvisioned = false,
-                isFrpActive = true,
             )
 
             underTest.start()
             assertThat(isVisible).isFalse()
 
-            kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(false)
-            assertThat(isVisible).isFalse()
-
             kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(true)
             assertThat(isVisible).isTrue()
+        }
 
-            kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(true)
+    @Test
+    fun hydrateVisibility_basedOnOcclusion() =
+        testScope.runTest {
+            val isVisible by collectLastValue(sceneInteractor.isVisible)
+            prepareState(
+                isDeviceUnlocked = true,
+                initialSceneKey = Scenes.Lockscreen,
+            )
+
+            underTest.start()
+            assertThat(isVisible).isTrue()
+
+            kosmos.keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop(
+                true,
+                mock()
+            )
             assertThat(isVisible).isFalse()
+
+            kosmos.keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop(false)
+            assertThat(isVisible).isTrue()
         }
 
     @Test
@@ -227,14 +256,14 @@
         testScope.runTest {
             val currentSceneKey by collectLastValue(sceneInteractor.currentScene)
             prepareState(
+                authenticationMethod = AuthenticationMethodModel.Pin,
                 isDeviceUnlocked = true,
                 initialSceneKey = Scenes.Gone,
+                startsAwake = false,
             )
             assertThat(currentSceneKey).isEqualTo(Scenes.Gone)
             underTest.start()
 
-            kosmos.fakeDeviceEntryRepository.setUnlocked(false)
-
             assertThat(currentSceneKey).isEqualTo(Scenes.Lockscreen)
         }
 
@@ -243,13 +272,16 @@
         testScope.runTest {
             val currentSceneKey by collectLastValue(sceneInteractor.currentScene)
             prepareState(
+                authenticationMethod = AuthenticationMethodModel.Pin,
                 isDeviceUnlocked = false,
                 initialSceneKey = Scenes.Bouncer,
             )
             assertThat(currentSceneKey).isEqualTo(Scenes.Bouncer)
             underTest.start()
 
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
 
             assertThat(currentSceneKey).isEqualTo(Scenes.Gone)
         }
@@ -259,13 +291,16 @@
         testScope.runTest {
             val currentSceneKey by collectLastValue(sceneInteractor.currentScene)
             prepareState(
+                authenticationMethod = AuthenticationMethodModel.Pin,
                 isBypassEnabled = true,
                 initialSceneKey = Scenes.Lockscreen,
             )
             assertThat(currentSceneKey).isEqualTo(Scenes.Lockscreen)
             underTest.start()
 
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
 
             assertThat(currentSceneKey).isEqualTo(Scenes.Gone)
         }
@@ -283,7 +318,6 @@
 
             // Authenticate using a passive auth method like face auth while bypass is disabled.
             faceAuthRepository.isAuthenticated.value = true
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
 
             assertThat(currentSceneKey).isEqualTo(Scenes.Lockscreen)
         }
@@ -305,7 +339,9 @@
             transitionStateFlowValue.value = ObservableTransitionState.Idle(Scenes.Shade)
             assertThat(currentSceneKey).isEqualTo(Scenes.Shade)
 
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             runCurrent()
 
             assertThat(currentSceneKey).isEqualTo(Scenes.Shade)
@@ -324,7 +360,6 @@
 
             // Authenticate using a passive auth method like face auth while bypass is disabled.
             faceAuthRepository.isAuthenticated.value = true
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
 
             assertThat(currentSceneKey).isEqualTo(Scenes.Gone)
         }
@@ -361,7 +396,9 @@
                 )
                 .forEachIndexed { index, sceneKey ->
                     if (sceneKey == Scenes.Gone) {
-                        kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+                        kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                            SuccessFingerprintAuthenticationStatus(0, true)
+                        )
                         runCurrent()
                     }
                     fakeSceneDataSource.pause()
@@ -380,6 +417,46 @@
         }
 
     @Test
+    fun hydrateSystemUiState_onLockscreen_basedOnOcclusion() =
+        testScope.runTest {
+            prepareState(
+                initialSceneKey = Scenes.Lockscreen,
+            )
+            underTest.start()
+            runCurrent()
+            clearInvocations(sysUiState)
+
+            kosmos.keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop(
+                true,
+                mock()
+            )
+            runCurrent()
+            assertThat(
+                    sysUiState.flags and
+                        QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED != 0
+                )
+                .isTrue()
+            assertThat(
+                    sysUiState.flags and
+                        QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING != 0
+                )
+                .isFalse()
+
+            kosmos.keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop(false)
+            runCurrent()
+            assertThat(
+                    sysUiState.flags and
+                        QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED != 0
+                )
+                .isFalse()
+            assertThat(
+                    sysUiState.flags and
+                        QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING != 0
+                )
+                .isTrue()
+        }
+
+    @Test
     fun switchToGoneWhenDeviceStartsToWakeUp_authMethodNone() =
         testScope.runTest {
             val currentSceneKey by collectLastValue(sceneInteractor.currentScene)
@@ -391,6 +468,7 @@
             assertThat(currentSceneKey).isEqualTo(Scenes.Lockscreen)
             underTest.start()
             powerInteractor.setAwakeForTest()
+            runCurrent()
 
             assertThat(currentSceneKey).isEqualTo(Scenes.Gone)
         }
@@ -412,7 +490,7 @@
         }
 
     @Test
-    fun doesNotSwitchToGoneWhenDeviceStartsToWakeUp_authMethodSecure() =
+    fun doesNotSwitchToGone_whenDeviceStartsToWakeUp_authMethodSecure() =
         testScope.runTest {
             val currentSceneKey by collectLastValue(sceneInteractor.currentScene)
             prepareState(
@@ -427,6 +505,34 @@
         }
 
     @Test
+    fun doesNotSwitchToGone_whenDeviceStartsToWakeUp_ifAlreadyTransitioningToLockscreen() =
+        testScope.runTest {
+            val currentSceneKey by collectLastValue(sceneInteractor.currentScene)
+            val transitioningTo by collectLastValue(sceneInteractor.transitioningTo)
+            val transitionStateFlow =
+                prepareState(
+                    isDeviceUnlocked = true,
+                    initialSceneKey = Scenes.Gone,
+                    authenticationMethod = AuthenticationMethodModel.Pin,
+                )
+            transitionStateFlow.value =
+                ObservableTransitionState.Transition(
+                    fromScene = Scenes.Gone,
+                    toScene = Scenes.Lockscreen,
+                    progress = flowOf(0.1f),
+                    isInitiatedByUserInput = false,
+                    isUserInputOngoing = flowOf(false),
+                )
+            assertThat(currentSceneKey).isEqualTo(Scenes.Gone)
+            assertThat(transitioningTo).isEqualTo(Scenes.Lockscreen)
+            underTest.start()
+            powerInteractor.setAwakeForTest()
+
+            assertThat(currentSceneKey).isEqualTo(Scenes.Gone)
+            assertThat(transitioningTo).isEqualTo(Scenes.Lockscreen)
+        }
+
+    @Test
     fun switchToGoneWhenDeviceStartsToWakeUp_authMethodSecure_deviceUnlocked() =
         testScope.runTest {
             val currentSceneKey by collectLastValue(sceneInteractor.currentScene)
@@ -439,7 +545,9 @@
             assertThat(currentSceneKey).isEqualTo(Scenes.Lockscreen)
             underTest.start()
 
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             runCurrent()
             powerInteractor.setAwakeForTest()
             runCurrent()
@@ -474,7 +582,9 @@
                 }
 
             // Changing to the Gone scene should report a successful unlock.
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             runCurrent()
             sceneInteractor.changeScene(Scenes.Gone, "reason")
             runCurrent()
@@ -669,7 +779,9 @@
             runCurrent()
             verify(falsingCollector).onBouncerShown()
 
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             runCurrent()
             sceneInteractor.changeScene(Scenes.Gone, "reason")
             runCurrent()
@@ -740,6 +852,7 @@
             val currentDesiredSceneKey by collectLastValue(sceneInteractor.currentScene)
             val transitionStateFlow =
                 prepareState(
+                    authenticationMethod = AuthenticationMethodModel.Pin,
                     isDeviceUnlocked = true,
                     initialSceneKey = Scenes.Gone,
                 )
@@ -895,6 +1008,7 @@
         testScope.runTest {
             val transitionStateFlow =
                 prepareState(
+                    authenticationMethod = AuthenticationMethodModel.Pin,
                     isDeviceUnlocked = true,
                     initialSceneKey = Scenes.Gone,
                 )
@@ -991,6 +1105,28 @@
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
         }
 
+    @Test
+    fun handleBouncerOverscroll() =
+        testScope.runTest {
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            val transitionStateFlow = prepareState()
+            underTest.start()
+            emulateSceneTransition(transitionStateFlow, toScene = Scenes.Bouncer)
+            assertThat(currentScene).isEqualTo(Scenes.Bouncer)
+
+            transitionStateFlow.value =
+                ObservableTransitionState.Transition(
+                    fromScene = Scenes.Bouncer,
+                    toScene = Scenes.Lockscreen,
+                    progress = flowOf(-0.4f),
+                    isInitiatedByUserInput = true,
+                    isUserInputOngoing = flowOf(true),
+                )
+            runCurrent()
+
+            assertThat(kosmos.fakeDeviceEntryFaceAuthRepository.isAuthRunning.value).isTrue()
+        }
+
     private fun TestScope.emulateSceneTransition(
         transitionStateFlow: MutableStateFlow<ObservableTransitionState>,
         toScene: SceneKey,
@@ -1030,12 +1166,16 @@
         isLockscreenEnabled: Boolean = true,
         startsAwake: Boolean = true,
         isDeviceProvisioned: Boolean = true,
-        isFrpActive: Boolean = false,
     ): MutableStateFlow<ObservableTransitionState> {
         if (authenticationMethod?.isSecure == true) {
             assert(isLockscreenEnabled) {
                 "Lockscreen cannot be disabled while having a secure authentication method"
             }
+            if (isDeviceUnlocked) {
+                kosmos.deviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                    SuccessFingerprintAuthenticationStatus(0, true)
+                )
+            }
         }
 
         check(initialSceneKey != Scenes.Gone || isDeviceUnlocked) {
@@ -1043,8 +1183,13 @@
         }
 
         sceneContainerFlags.enabled = true
-        kosmos.fakeDeviceEntryRepository.setUnlocked(isDeviceUnlocked)
         kosmos.fakeDeviceEntryRepository.setBypassEnabled(isBypassEnabled)
+        authenticationMethod?.let {
+            kosmos.fakeAuthenticationRepository.setAuthenticationMethod(authenticationMethod)
+            kosmos.fakeDeviceEntryRepository.setLockscreenEnabled(
+                isLockscreenEnabled = isLockscreenEnabled
+            )
+        }
         runCurrent()
         val transitionStateFlow =
             MutableStateFlow<ObservableTransitionState>(
@@ -1055,12 +1200,6 @@
             transitionStateFlow.value = ObservableTransitionState.Idle(it)
             sceneInteractor.changeScene(it, "reason")
         }
-        authenticationMethod?.let {
-            kosmos.fakeAuthenticationRepository.setAuthenticationMethod(authenticationMethod)
-            kosmos.fakeDeviceEntryRepository.setLockscreenEnabled(
-                isLockscreenEnabled = isLockscreenEnabled
-            )
-        }
         if (startsAwake) {
             powerInteractor.setAwakeForTest()
         } else {
@@ -1068,7 +1207,6 @@
         }
 
         kosmos.fakeDeviceProvisioningRepository.setDeviceProvisioned(isDeviceProvisioned)
-        kosmos.fakeDeviceProvisioningRepository.setFactoryResetProtectionActive(isFrpActive)
 
         runCurrent()
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagParameterizationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagParameterizationTest.kt
new file mode 100644
index 0000000..db31ad5
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagParameterizationTest.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.scene.shared.flag
+
+import android.platform.test.flag.junit.FlagsParameterization
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.Flags.FLAG_COMPOSE_LOCKSCREEN
+import com.android.systemui.Flags.FLAG_EXAMPLE_FLAG
+import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.flags.andSceneContainer
+import com.google.common.truth.Truth
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+internal class SceneContainerFlagParameterizationTest : SysuiTestCase() {
+
+    @Test
+    fun emptyAndSceneContainer() {
+        val result = FlagsParameterization.allCombinationsOf().andSceneContainer()
+        Truth.assertThat(result).hasSize(2)
+        Truth.assertThat(result[0].mOverrides[FLAG_SCENE_CONTAINER]).isFalse()
+        Truth.assertThat(result[1].mOverrides[FLAG_SCENE_CONTAINER]).isTrue()
+    }
+
+    @Test
+    fun oneUnrelatedAndSceneContainer() {
+        val unrelatedFlag = FLAG_EXAMPLE_FLAG
+        val result = FlagsParameterization.allCombinationsOf(unrelatedFlag).andSceneContainer()
+        Truth.assertThat(result).hasSize(4)
+        Truth.assertThat(result[0].mOverrides[unrelatedFlag]).isFalse()
+        Truth.assertThat(result[0].mOverrides[FLAG_SCENE_CONTAINER]).isFalse()
+        Truth.assertThat(result[1].mOverrides[unrelatedFlag]).isFalse()
+        Truth.assertThat(result[1].mOverrides[FLAG_SCENE_CONTAINER]).isTrue()
+        Truth.assertThat(result[2].mOverrides[unrelatedFlag]).isTrue()
+        Truth.assertThat(result[2].mOverrides[FLAG_SCENE_CONTAINER]).isFalse()
+        Truth.assertThat(result[3].mOverrides[unrelatedFlag]).isTrue()
+        Truth.assertThat(result[3].mOverrides[FLAG_SCENE_CONTAINER]).isTrue()
+    }
+
+    @Test
+    fun oneDependencyAndSceneContainer() {
+        val dependentFlag = FLAG_COMPOSE_LOCKSCREEN
+        val result = FlagsParameterization.allCombinationsOf(dependentFlag).andSceneContainer()
+        Truth.assertThat(result).hasSize(3)
+        Truth.assertThat(result[0].mOverrides[dependentFlag]).isFalse()
+        Truth.assertThat(result[0].mOverrides[FLAG_SCENE_CONTAINER]).isFalse()
+        Truth.assertThat(result[1].mOverrides[dependentFlag]).isTrue()
+        Truth.assertThat(result[1].mOverrides[FLAG_SCENE_CONTAINER]).isFalse()
+        Truth.assertThat(result[2].mOverrides[dependentFlag]).isTrue()
+        Truth.assertThat(result[2].mOverrides[FLAG_SCENE_CONTAINER]).isTrue()
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/data/repository/BrightnessMirrorShowingRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/data/repository/BrightnessMirrorShowingRepositoryTest.kt
new file mode 100644
index 0000000..a1af70b
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/data/repository/BrightnessMirrorShowingRepositoryTest.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.settings.brightness.data.repository
+
+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.testKosmos
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class BrightnessMirrorShowingRepositoryTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+
+    private val underTest = BrightnessMirrorShowingRepository()
+
+    @Test
+    fun isShowing_setAndFlow() =
+        kosmos.testScope.runTest {
+            val isShowing by collectLastValue(underTest.isShowing)
+
+            assertThat(isShowing).isFalse()
+
+            underTest.setMirrorShowing(true)
+            assertThat(isShowing).isTrue()
+
+            underTest.setMirrorShowing(false)
+            assertThat(isShowing).isFalse()
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/domain/interactor/BrightnessMirrorShowingInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/domain/interactor/BrightnessMirrorShowingInteractorTest.kt
new file mode 100644
index 0000000..31d6df2
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/domain/interactor/BrightnessMirrorShowingInteractorTest.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.settings.brightness.domain.interactor
+
+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.settings.brightness.data.repository.brightnessMirrorShowingRepository
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class BrightnessMirrorShowingInteractorTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+
+    private val underTest =
+        BrightnessMirrorShowingInteractor(kosmos.brightnessMirrorShowingRepository)
+
+    @Test
+    fun isShowing_setAndFlow() =
+        kosmos.testScope.runTest {
+            val isShowing by collectLastValue(underTest.isShowing)
+
+            assertThat(isShowing).isFalse()
+
+            underTest.setMirrorShowing(true)
+            assertThat(isShowing).isTrue()
+
+            underTest.setMirrorShowing(false)
+            assertThat(isShowing).isFalse()
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/ui/binder/BrightnessMirrorInflaterTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/ui/binder/BrightnessMirrorInflaterTest.kt
new file mode 100644
index 0000000..6de7f40
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/ui/binder/BrightnessMirrorInflaterTest.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.settings.brightness.ui.binder
+
+import android.content.applicationContext
+import android.view.ContextThemeWrapper
+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.res.R
+import com.android.systemui.settings.brightnessSliderControllerFactory
+import com.android.systemui.testKosmos
+import com.android.systemui.util.Assert
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class BrightnessMirrorInflaterTest : SysuiTestCase() {
+    private val kosmos = testKosmos()
+
+    private val themedContext =
+        ContextThemeWrapper(kosmos.applicationContext, R.style.Theme_SystemUI_QuickSettings)
+
+    @Test
+    fun inflate_sliderViewAddedToFrame() {
+        Assert.setTestThread(Thread.currentThread())
+
+        val (frame, sliderController) =
+            BrightnessMirrorInflater.inflate(
+                themedContext,
+                kosmos.brightnessSliderControllerFactory
+            )
+
+        assertThat(sliderController.rootView.parent).isSameInstanceAs(frame)
+
+        Assert.setTestThread(null)
+    }
+
+    @Test
+    fun inflate_frameAndSliderViewVisible() {
+        Assert.setTestThread(Thread.currentThread())
+
+        val (frame, sliderController) =
+            BrightnessMirrorInflater.inflate(
+                themedContext,
+                kosmos.brightnessSliderControllerFactory,
+            )
+
+        assertThat(frame.visibility).isEqualTo(View.VISIBLE)
+        assertThat(sliderController.rootView.visibility).isEqualTo(View.VISIBLE)
+
+        Assert.setTestThread(null)
+    }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/ui/viewmodel/BrightnessMirrorViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/ui/viewmodel/BrightnessMirrorViewModelTest.kt
new file mode 100644
index 0000000..09fc6f9
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/ui/viewmodel/BrightnessMirrorViewModelTest.kt
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.settings.brightness.ui.viewmodel
+
+import android.content.applicationContext
+import android.content.res.mainResources
+import android.view.ContextThemeWrapper
+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.coroutines.collectLastValue
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.res.R
+import com.android.systemui.settings.brightness.domain.interactor.brightnessMirrorShowingInteractor
+import com.android.systemui.settings.brightness.ui.binder.BrightnessMirrorInflater
+import com.android.systemui.settings.brightness.ui.viewModel.BrightnessMirrorViewModel
+import com.android.systemui.settings.brightness.ui.viewModel.LocationAndSize
+import com.android.systemui.settings.brightnessSliderControllerFactory
+import com.android.systemui.testKosmos
+import com.android.systemui.util.Assert
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class BrightnessMirrorViewModelTest : SysuiTestCase() {
+
+    private val kosmos = testKosmos()
+
+    private val themedContext =
+        ContextThemeWrapper(kosmos.applicationContext, R.style.Theme_SystemUI_QuickSettings)
+
+    private val underTest =
+        with(kosmos) {
+            BrightnessMirrorViewModel(
+                brightnessMirrorShowingInteractor,
+                mainResources,
+                brightnessSliderControllerFactory,
+            )
+        }
+
+    @Test
+    fun showHideMirror_isShowing() =
+        with(kosmos) {
+            testScope.runTest {
+                val showing by collectLastValue(underTest.isShowing)
+
+                assertThat(showing).isFalse()
+
+                underTest.showMirror()
+                assertThat(showing).isTrue()
+
+                underTest.hideMirror()
+                assertThat(showing).isFalse()
+            }
+        }
+
+    @Test
+    fun setLocationInWindow_correctLocationAndSize() =
+        with(kosmos) {
+            testScope.runTest {
+                val locationAndSize by collectLastValue(underTest.locationAndSize)
+
+                val x = 20
+                val y = 100
+                val height = 50
+                val width = 200
+                val padding =
+                    mainResources.getDimensionPixelSize(R.dimen.rounded_slider_background_padding)
+
+                val mockView =
+                    mock<View> {
+                        whenever(getLocationInWindow(any())).then {
+                            it.getArgument<IntArray>(0).apply {
+                                this[0] = x
+                                this[1] = y
+                            }
+                            Unit
+                        }
+
+                        whenever(measuredHeight).thenReturn(height)
+                        whenever(measuredWidth).thenReturn(width)
+                    }
+
+                underTest.setLocationAndSize(mockView)
+
+                assertThat(locationAndSize)
+                    .isEqualTo(
+                        // Adjust for padding around the view
+                        LocationAndSize(
+                            yOffset = y - padding,
+                            width = width + 2 * padding,
+                            height = height + 2 * padding,
+                        )
+                    )
+            }
+        }
+
+    @Test
+    fun setLocationInWindow_paddingSetToRootView() =
+        with(kosmos) {
+            Assert.setTestThread(Thread.currentThread())
+            val padding =
+                mainResources.getDimensionPixelSize(R.dimen.rounded_slider_background_padding)
+
+            val view = mock<View>()
+
+            val (_, sliderController) =
+                BrightnessMirrorInflater.inflate(
+                    themedContext,
+                    brightnessSliderControllerFactory,
+                )
+            underTest.setToggleSlider(sliderController)
+
+            underTest.setLocationAndSize(view)
+
+            with(sliderController.rootView) {
+                assertThat(paddingBottom).isEqualTo(padding)
+                assertThat(paddingTop).isEqualTo(padding)
+                assertThat(paddingLeft).isEqualTo(padding)
+                assertThat(paddingRight).isEqualTo(padding)
+            }
+
+            Assert.setTestThread(null)
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ShadeControllerSceneImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ShadeControllerSceneImplTest.kt
index cd79ed1..cbbcce9 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ShadeControllerSceneImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ShadeControllerSceneImplTest.kt
@@ -21,10 +21,11 @@
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.SceneKey
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
 import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
 import com.android.systemui.flags.Flags
 import com.android.systemui.flags.fakeFeatureFlagsClassic
+import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
+import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.testCase
 import com.android.systemui.kosmos.testScope
@@ -38,6 +39,7 @@
 import com.google.common.truth.Truth.assertThat
 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
@@ -53,7 +55,7 @@
 class ShadeControllerSceneImplTest : SysuiTestCase() {
     private val kosmos = Kosmos()
     private val testScope = kosmos.testScope
-    private val sceneInteractor = kosmos.sceneInteractor
+    private val sceneInteractor by lazy { kosmos.sceneInteractor }
     private val deviceEntryInteractor by lazy { kosmos.deviceEntryInteractor }
 
     private lateinit var shadeInteractor: ShadeInteractor
@@ -68,7 +70,9 @@
             set(Flags.NSSL_DEBUG_LINES, false)
             set(Flags.FULL_SCREEN_USER_SWITCHER, false)
         }
-        kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+        kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+            SuccessFingerprintAuthenticationStatus(0, true)
+        )
         testScope.runCurrent()
         shadeInteractor = kosmos.shadeInteractor
         underTest = kosmos.shadeControllerSceneImpl
@@ -161,6 +165,10 @@
         testScope.runTest {
             // GIVEN shade is collapsed and a post-collapse action is enqueued
             val testRunnable = mock<Runnable>()
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
+            runCurrent()
             setCollapsed()
             underTest.postOnShadeExpanded(testRunnable)
 
@@ -179,7 +187,14 @@
         testScope.runCurrent()
     }
 
-    private fun setDeviceEntered(isEntered: Boolean) {
+    private fun TestScope.setDeviceEntered(isEntered: Boolean) {
+        if (isEntered) {
+            // Unlock the device marking the device has entered.
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
+            runCurrent()
+        }
         setScene(
             if (isEntered) {
                 Scenes.Gone
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImplTest.kt
index 16b68cc..6485c47 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImplTest.kt
@@ -24,9 +24,12 @@
 import com.android.compose.animation.scene.SceneKey
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
 import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
+import com.android.systemui.deviceentry.shared.model.DeviceUnlockSource
+import com.android.systemui.deviceentry.shared.model.DeviceUnlockStatus
 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.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.shared.model.Scenes
@@ -49,9 +52,9 @@
 
     private val kosmos = testKosmos()
     private val testScope = kosmos.testScope
-    private val deviceEntryRepository = kosmos.fakeDeviceEntryRepository
     private val deviceUnlockedInteractor = kosmos.deviceUnlockedInteractor
     private val sceneInteractor = kosmos.sceneInteractor
+    private val shadeAnimationInteractor = kosmos.shadeAnimationInteractor
     private val transitionState =
         MutableStateFlow<ObservableTransitionState>(
             ObservableTransitionState.Idle(Scenes.Lockscreen)
@@ -70,7 +73,6 @@
     fun legacyPanelExpansion_whenIdle_whenLocked() =
         testScope.runTest {
             underTest = kosmos.panelExpansionInteractorImpl
-            setUnlocked(false)
             val panelExpansion by collectLastValue(underTest.legacyPanelExpansion)
 
             changeScene(Scenes.Lockscreen) { assertThat(panelExpansion).isEqualTo(1f) }
@@ -94,7 +96,15 @@
     fun legacyPanelExpansion_whenIdle_whenUnlocked() =
         testScope.runTest {
             underTest = kosmos.panelExpansionInteractorImpl
-            setUnlocked(true)
+            val unlockStatus by collectLastValue(deviceUnlockedInteractor.deviceUnlockStatus)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
+            runCurrent()
+
+            assertThat(unlockStatus)
+                .isEqualTo(DeviceUnlockStatus(true, DeviceUnlockSource.Fingerprint))
+
             val panelExpansion by collectLastValue(underTest.legacyPanelExpansion)
 
             changeScene(Scenes.Gone) { assertThat(panelExpansion).isEqualTo(0f) }
@@ -112,13 +122,39 @@
             changeScene(Scenes.Communal) { assertThat(panelExpansion).isEqualTo(1f) }
             assertThat(panelExpansion).isEqualTo(1f)
         }
-    private fun TestScope.setUnlocked(isUnlocked: Boolean) {
-        val isDeviceUnlocked by collectLastValue(deviceUnlockedInteractor.isDeviceUnlocked)
-        deviceEntryRepository.setUnlocked(isUnlocked)
-        runCurrent()
 
-        assertThat(isDeviceUnlocked).isEqualTo(isUnlocked)
-    }
+    @Test
+    @EnableSceneContainer
+    fun shouldHideStatusBarIconsWhenExpanded_goneScene() =
+        testScope.runTest {
+            underTest = kosmos.panelExpansionInteractorImpl
+            shadeAnimationInteractor.setIsLaunchingActivity(false)
+            changeScene(Scenes.Gone)
+
+            assertThat(underTest.shouldHideStatusBarIconsWhenExpanded()).isFalse()
+        }
+
+    @Test
+    @EnableSceneContainer
+    fun shouldHideStatusBarIconsWhenExpanded_lockscreenScene() =
+        testScope.runTest {
+            underTest = kosmos.panelExpansionInteractorImpl
+            shadeAnimationInteractor.setIsLaunchingActivity(false)
+            changeScene(Scenes.Lockscreen)
+
+            assertThat(underTest.shouldHideStatusBarIconsWhenExpanded()).isTrue()
+        }
+
+    @Test
+    @EnableSceneContainer
+    fun shouldHideStatusBarIconsWhenExpanded_activityLaunch() =
+        testScope.runTest {
+            underTest = kosmos.panelExpansionInteractorImpl
+            changeScene(Scenes.Gone)
+            shadeAnimationInteractor.setIsLaunchingActivity(true)
+
+            assertThat(underTest.shouldHideStatusBarIconsWhenExpanded()).isFalse()
+        }
 
     private fun TestScope.changeScene(
         toScene: SceneKey,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeBackActionInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeBackActionInteractorImplTest.kt
index d309c6b..e759b50 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeBackActionInteractorImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeBackActionInteractorImplTest.kt
@@ -22,7 +22,6 @@
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.SceneKey
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
@@ -48,7 +47,6 @@
     val kosmos = testKosmos().apply { fakeSceneContainerFlags.enabled = true }
     val testScope = kosmos.testScope
     val sceneInteractor = kosmos.sceneInteractor
-    val deviceEntryRepository = kosmos.fakeDeviceEntryRepository
     val underTest = kosmos.shadeBackActionInteractor
 
     @Before
@@ -78,7 +76,6 @@
     @Test
     fun animateCollapseQs_fullyCollapse_locked() =
         testScope.runTest {
-            deviceEntryRepository.setUnlocked(false)
             setScene(Scenes.QuickSettings)
             underTest.animateCollapseQs(true)
             runCurrent()
@@ -95,7 +92,6 @@
         }
 
     private fun enterDevice() {
-        deviceEntryRepository.setUnlocked(true)
         testScope.runCurrent()
         setScene(Scenes.Gone)
     }
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 4e82feb..757a6c9 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
@@ -326,7 +326,7 @@
         }
 
     @Test
-    fun shadeExpansionWhenNotInSplitShadeAndQsExpanded() =
+    fun shadeExpansionWhenNotInSplitShadeAndQsPartiallyExpanded() =
         testScope.runTest {
             val actual by collectLastValue(underTest.shadeExpansion)
 
@@ -338,6 +338,22 @@
             runCurrent()
 
             // THEN shade expansion is zero
+            assertThat(actual).isEqualTo(.5f)
+        }
+
+    @Test
+    fun shadeExpansionWhenNotInSplitShadeAndQsFullyExpanded() =
+        testScope.runTest {
+            val actual by collectLastValue(underTest.shadeExpansion)
+
+            // WHEN split shade is not enabled and QS is expanded
+            keyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            overrideResource(R.bool.config_use_split_notification_shade, false)
+            shadeRepository.setQsExpansion(1f)
+            shadeRepository.setLegacyShadeExpansion(1f)
+            runCurrent()
+
+            // THEN shade expansion is zero
             assertThat(actual).isEqualTo(0f)
         }
 
@@ -603,20 +619,6 @@
         }
 
     @Test
-    fun isShadeTouchable_isFalse_whenFrpIsActive() =
-        testScope.runTest {
-            deviceProvisioningRepository.setFactoryResetProtectionActive(true)
-            keyguardTransitionRepository.sendTransitionStep(
-                TransitionStep(
-                    transitionState = TransitionState.STARTED,
-                )
-            )
-            val isShadeTouchable by collectLastValue(underTest.isShadeTouchable)
-            runCurrent()
-            assertThat(isShadeTouchable).isFalse()
-        }
-
-    @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 682c4ef..0ae95e7 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
@@ -95,14 +95,14 @@
         }
 
     @Test
-    fun shadeExpansionWhenNotInSplitShadeAndQsExpanded() =
+    fun shadeExpansionWhenNotInSplitShadeAndQsFullyExpanded() =
         testScope.runTest {
             val actual by collectLastValue(underTest.shadeExpansion)
 
             // WHEN split shade is not enabled and QS is expanded
             keyguardRepository.setStatusBarState(StatusBarState.SHADE)
             overrideResource(R.bool.config_use_split_notification_shade, false)
-            shadeRepository.setQsExpansion(.5f)
+            shadeRepository.setQsExpansion(1f)
             shadeRepository.setLegacyShadeExpansion(1f)
             runCurrent()
 
@@ -111,16 +111,34 @@
         }
 
     @Test
+    fun shadeExpansionWhenNotInSplitShadeAndQsPartlyExpanded() =
+        testScope.runTest {
+            val actual by collectLastValue(underTest.shadeExpansion)
+
+            // WHEN split shade is not enabled and QS partly expanded
+            keyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            overrideResource(R.bool.config_use_split_notification_shade, false)
+            shadeRepository.setQsExpansion(.4f)
+            shadeRepository.setLegacyShadeExpansion(1f)
+            runCurrent()
+
+            // THEN shade expansion is the difference
+            assertThat(actual).isEqualTo(.6f)
+        }
+
+    @Test
     fun shadeExpansionWhenNotInSplitShadeAndQsCollapsed() =
         testScope.runTest {
             val actual by collectLastValue(underTest.shadeExpansion)
 
-            // WHEN split shade is not enabled and QS is expanded
+            // WHEN split shade is not enabled and QS collapsed
             keyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            overrideResource(R.bool.config_use_split_notification_shade, false)
             shadeRepository.setQsExpansion(0f)
             shadeRepository.setLegacyShadeExpansion(.6f)
+            runCurrent()
 
-            // THEN shade expansion is zero
+            // THEN shade expansion is the legacy one
             assertThat(actual).isEqualTo(.6f)
         }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt
index 31dacdd..2ab934c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt
@@ -18,27 +18,54 @@
 
 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.systemui.SysuiTestCase
+import com.android.systemui.authentication.data.repository.fakeAuthenticationRepository
+import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
 import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
 import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
+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.res.R
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.shared.model.fakeSceneDataSource
+import com.android.systemui.shade.ShadeExpansionChangeEvent
+import com.android.systemui.shade.ShadeExpansionListener
 import com.android.systemui.shade.domain.interactor.shadeInteractor
 import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
 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.Test
 import org.junit.runner.RunWith
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class ShadeStartableTest : SysuiTestCase() {
-
     private val kosmos = testKosmos()
     private val testScope = kosmos.testScope
     private val shadeInteractor = kosmos.shadeInteractor
+    private val sceneInteractor = kosmos.sceneInteractor
+    private val shadeExpansionStateManager = kosmos.shadeExpansionStateManager
+    private val deviceEntryRepository = kosmos.fakeDeviceEntryRepository
+    private val deviceUnlockedInteractor = kosmos.deviceUnlockedInteractor
     private val fakeConfigurationRepository = kosmos.fakeConfigurationRepository
+    private val fakeSceneDataSource = kosmos.fakeSceneDataSource
 
     private val underTest = kosmos.shadeStartable
 
@@ -59,4 +86,88 @@
             fakeConfigurationRepository.onAnyConfigurationChange()
             assertThat(shadeMode).isEqualTo(ShadeMode.Single)
         }
+
+    @Test
+    @EnableSceneContainer
+    fun hydrateShadeExpansionStateManager() =
+        testScope.runTest {
+            val expansionListener = mock<ShadeExpansionListener>()
+            var latestChangeEvent: ShadeExpansionChangeEvent? = null
+            whenever(expansionListener.onPanelExpansionChanged(any())).thenAnswer {
+                latestChangeEvent = it.arguments[0] as ShadeExpansionChangeEvent
+                Unit
+            }
+            shadeExpansionStateManager.addExpansionListener(expansionListener)
+
+            underTest.start()
+
+            kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
+                AuthenticationMethodModel.Pin
+            )
+            runCurrent()
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
+            runCurrent()
+            val transitionState =
+                MutableStateFlow<ObservableTransitionState>(
+                    ObservableTransitionState.Idle(Scenes.Gone)
+                )
+            sceneInteractor.setTransitionState(transitionState)
+
+            changeScene(Scenes.Gone, transitionState)
+            val currentScene by collectLastValue(sceneInteractor.currentScene)
+            assertThat(currentScene).isEqualTo(Scenes.Gone)
+
+            assertThat(latestChangeEvent)
+                .isEqualTo(
+                    ShadeExpansionChangeEvent(
+                        fraction = 0f,
+                        expanded = false,
+                        tracking = false,
+                    )
+                )
+
+            changeScene(Scenes.Shade, transitionState) { progress ->
+                assertThat(latestChangeEvent?.fraction).isEqualTo(progress)
+            }
+        }
+
+    private fun TestScope.changeScene(
+        toScene: SceneKey,
+        transitionState: MutableStateFlow<ObservableTransitionState>,
+        assertDuringProgress: ((progress: Float) -> Unit) = {},
+    ) {
+        val currentScene by collectLastValue(sceneInteractor.currentScene)
+        val progressFlow = MutableStateFlow(0f)
+        transitionState.value =
+            ObservableTransitionState.Transition(
+                fromScene = checkNotNull(currentScene),
+                toScene = toScene,
+                progress = progressFlow,
+                isInitiatedByUserInput = true,
+                isUserInputOngoing = flowOf(true),
+            )
+        runCurrent()
+        assertDuringProgress(progressFlow.value)
+
+        progressFlow.value = 0.2f
+        runCurrent()
+        assertDuringProgress(progressFlow.value)
+
+        progressFlow.value = 0.6f
+        runCurrent()
+        assertDuringProgress(progressFlow.value)
+
+        progressFlow.value = 1f
+        runCurrent()
+        assertDuringProgress(progressFlow.value)
+
+        transitionState.value = ObservableTransitionState.Idle(toScene)
+        fakeSceneDataSource.changeScene(toScene)
+        runCurrent()
+        assertDuringProgress(progressFlow.value)
+
+        assertThat(currentScene).isEqualTo(toScene)
+    }
 }
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 062741d..4c573d3 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
@@ -13,6 +13,7 @@
 import com.android.systemui.plugins.activityStarter
 import com.android.systemui.shade.domain.interactor.privacyChipInteractor
 import com.android.systemui.shade.domain.interactor.shadeHeaderClockInteractor
+import com.android.systemui.shade.domain.interactor.shadeInteractor
 import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
 import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
 import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel
@@ -69,6 +70,7 @@
             ShadeHeaderViewModel(
                 applicationScope = testScope.backgroundScope,
                 context = context,
+                shadeInteractor = kosmos.shadeInteractor,
                 mobileIconsInteractor = mobileIconsInteractor,
                 mobileIconsViewModel = mobileIconsViewModel,
                 privacyChipInteractor = kosmos.privacyChipInteractor,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
index d1c4ec3..7a681b3 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
@@ -29,6 +29,8 @@
 import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
 import com.android.systemui.flags.FakeFeatureFlagsClassic
 import com.android.systemui.flags.Flags
+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.media.controls.domain.pipeline.MediaDataManager
 import com.android.systemui.qs.footerActionsController
@@ -37,6 +39,7 @@
 import com.android.systemui.res.R
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.settings.brightness.ui.viewmodel.brightnessMirrorViewModel
 import com.android.systemui.shade.data.repository.shadeRepository
 import com.android.systemui.shade.domain.interactor.privacyChipInteractor
 import com.android.systemui.shade.domain.interactor.shadeHeaderClockInteractor
@@ -110,6 +113,7 @@
             ShadeHeaderViewModel(
                 applicationScope = testScope.backgroundScope,
                 context = context,
+                shadeInteractor = kosmos.shadeInteractor,
                 mobileIconsInteractor = mobileIconsInteractor,
                 mobileIconsViewModel = mobileIconsViewModel,
                 privacyChipInteractor = kosmos.privacyChipInteractor,
@@ -124,10 +128,12 @@
                 shadeHeaderViewModel = shadeHeaderViewModel,
                 qsSceneAdapter = qsSceneAdapter,
                 notifications = kosmos.notificationsPlaceholderViewModel,
+                brightnessMirrorViewModel = kosmos.brightnessMirrorViewModel,
                 mediaDataManager = mediaDataManager,
                 shadeInteractor = kosmos.shadeInteractor,
                 footerActionsViewModelFactory = kosmos.footerActionsViewModelFactory,
                 footerActionsController = kosmos.footerActionsController,
+                sceneInteractor = kosmos.sceneInteractor,
             )
     }
 
@@ -138,7 +144,6 @@
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Pin
             )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(false)
 
             assertThat(destinationScenes?.get(Swipe(SwipeDirection.Up))?.toScene)
                 .isEqualTo(Scenes.Lockscreen)
@@ -151,7 +156,9 @@
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Pin
             )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
 
             assertThat(destinationScenes?.get(Swipe(SwipeDirection.Up))?.toScene)
                 .isEqualTo(Scenes.Gone)
@@ -176,7 +183,6 @@
         testScope.runTest {
             val destinationScenes by collectLastValue(underTest.destinationScenes)
             kosmos.fakeDeviceEntryRepository.setLockscreenEnabled(true)
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.None
             )
@@ -194,7 +200,9 @@
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Pin
             )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             runCurrent()
 
             assertThat(isClickable).isFalse()
@@ -207,40 +215,23 @@
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Pin
             )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(false)
             runCurrent()
 
             assertThat(isClickable).isTrue()
         }
 
     @Test
-    fun onContentClicked_deviceUnlocked_switchesToGone() =
+    fun onContentClicked_deviceLockedSecurely_switchesToLockscreen() =
         testScope.runTest {
             val currentScene by collectLastValue(sceneInteractor.currentScene)
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Pin
             )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
             runCurrent()
 
             underTest.onContentClicked()
 
-            assertThat(currentScene).isEqualTo(Scenes.Gone)
-        }
-
-    @Test
-    fun onContentClicked_deviceLockedSecurely_switchesToBouncer() =
-        testScope.runTest {
-            val currentScene by collectLastValue(sceneInteractor.currentScene)
-            kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
-                AuthenticationMethodModel.Pin
-            )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(false)
-            runCurrent()
-
-            underTest.onContentClicked()
-
-            assertThat(currentScene).isEqualTo(Scenes.Bouncer)
+            assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
         }
 
     @Test
@@ -280,17 +271,17 @@
 
     @Test
     fun upTransitionSceneKey_customizing_noTransition() =
-            testScope.runTest {
-                val destinationScenes by collectLastValue(underTest.destinationScenes)
+        testScope.runTest {
+            val destinationScenes by collectLastValue(underTest.destinationScenes)
 
-                qsSceneAdapter.setCustomizing(true)
-                assertThat(
-                        destinationScenes!!
-                                .keys
-                                .filterIsInstance<Swipe>()
-                                .filter { it.direction == SwipeDirection.Up }
-                ).isEmpty()
-            }
+            qsSceneAdapter.setCustomizing(true)
+            assertThat(
+                    destinationScenes!!.keys.filterIsInstance<Swipe>().filter {
+                        it.direction == SwipeDirection.Up
+                    }
+                )
+                .isEmpty()
+        }
 
     @Test
     fun shadeMode() =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt
index 94539a3..a3cf929 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt
@@ -30,8 +30,9 @@
 import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.scene.shared.model.fakeSceneDataSource
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
-import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationStackAppearanceViewModel
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimShape
+import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationScrollViewModel
 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModel
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
@@ -57,27 +58,44 @@
         }
     private val testScope = kosmos.testScope
     private val placeholderViewModel by lazy { kosmos.notificationsPlaceholderViewModel }
-    private val appearanceViewModel by lazy { kosmos.notificationStackAppearanceViewModel }
+    private val appearanceViewModel by lazy { kosmos.notificationScrollViewModel }
     private val sceneInteractor by lazy { kosmos.sceneInteractor }
     private val fakeSceneDataSource by lazy { kosmos.fakeSceneDataSource }
 
     @Test
     fun updateBounds() =
         testScope.runTest {
-            val clipping by collectLastValue(appearanceViewModel.stackClipping)
+            val radius = MutableStateFlow(32)
+            val leftOffset = MutableStateFlow(0)
+            val shape by collectLastValue(appearanceViewModel.shadeScrimShape(radius, leftOffset))
 
-            val top = 200f
-            val left = 0f
-            val bottom = 550f
-            val right = 100f
-            placeholderViewModel.onBoundsChanged(
-                left = left,
-                top = top,
-                right = right,
-                bottom = bottom
+            placeholderViewModel.onScrimBoundsChanged(
+                ShadeScrimBounds(left = 0f, top = 200f, right = 100f, bottom = 550f)
             )
-            assertThat(clipping?.bounds)
-                .isEqualTo(StackBounds(left = left, top = top, right = right, bottom = bottom))
+            assertThat(shape)
+                .isEqualTo(
+                    ShadeScrimShape(
+                        bounds =
+                            ShadeScrimBounds(left = 0f, top = 200f, right = 100f, bottom = 550f),
+                        topRadius = 32,
+                        bottomRadius = 0
+                    )
+                )
+
+            leftOffset.value = 200
+            radius.value = 24
+            placeholderViewModel.onScrimBoundsChanged(
+                ShadeScrimBounds(left = 210f, top = 200f, right = 300f, bottom = 550f)
+            )
+            assertThat(shape)
+                .isEqualTo(
+                    ShadeScrimShape(
+                        bounds =
+                            ShadeScrimBounds(left = 10f, top = 200f, right = 100f, bottom = 550f),
+                        topRadius = 24,
+                        bottomRadius = 0
+                    )
+                )
         }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorTest.kt
index e3fa89c..50b77dc 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorTest.kt
@@ -23,8 +23,8 @@
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.shade.data.repository.shadeRepository
 import com.android.systemui.shade.shared.model.ShadeMode
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
-import com.android.systemui.statusbar.notification.stack.shared.model.StackRounding
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimRounding
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.test.runTest
@@ -42,42 +42,44 @@
     @Test
     fun stackBounds() =
         testScope.runTest {
-            val stackBounds by collectLastValue(underTest.stackBounds)
+            val stackBounds by collectLastValue(underTest.shadeScrimBounds)
 
             val bounds1 =
-                StackBounds(
+                ShadeScrimBounds(
                     top = 100f,
                     bottom = 200f,
                 )
-            underTest.setStackBounds(bounds1)
+            underTest.setShadeScrimBounds(bounds1)
             assertThat(stackBounds).isEqualTo(bounds1)
 
             val bounds2 =
-                StackBounds(
+                ShadeScrimBounds(
                     top = 200f,
                     bottom = 300f,
                 )
-            underTest.setStackBounds(bounds2)
+            underTest.setShadeScrimBounds(bounds2)
             assertThat(stackBounds).isEqualTo(bounds2)
         }
 
     @Test
     fun stackRounding() =
         testScope.runTest {
-            val stackRounding by collectLastValue(underTest.stackRounding)
+            val stackRounding by collectLastValue(underTest.shadeScrimRounding)
 
             kosmos.shadeRepository.setShadeMode(ShadeMode.Single)
-            assertThat(stackRounding).isEqualTo(StackRounding(roundTop = true, roundBottom = false))
+            assertThat(stackRounding)
+                .isEqualTo(ShadeScrimRounding(isTopRounded = true, isBottomRounded = false))
 
             kosmos.shadeRepository.setShadeMode(ShadeMode.Split)
-            assertThat(stackRounding).isEqualTo(StackRounding(roundTop = true, roundBottom = true))
+            assertThat(stackRounding)
+                .isEqualTo(ShadeScrimRounding(isTopRounded = true, isBottomRounded = true))
         }
 
     @Test(expected = IllegalStateException::class)
     fun setStackBounds_withImproperBounds_throwsException() =
         testScope.runTest {
-            underTest.setStackBounds(
-                StackBounds(
+            underTest.setShadeScrimBounds(
+                ShadeScrimBounds(
                     top = 100f,
                     bottom = 99f,
                 )
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
new file mode 100644
index 0000000..7ac549a
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt
@@ -0,0 +1,615 @@
+/*
+ * 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.statusbar.notification.stack.ui.viewmodel
+
+import android.app.NotificationManager.Policy
+import android.platform.test.annotations.EnableFlags
+import android.provider.Settings
+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.flags.Flags
+import com.android.systemui.flags.fakeFeatureFlagsClassic
+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.power.data.repository.fakePowerRepository
+import com.android.systemui.power.shared.model.WakefulnessState
+import com.android.systemui.res.R
+import com.android.systemui.shade.data.repository.fakeShadeRepository
+import com.android.systemui.statusbar.data.repository.fakeRemoteInputRepository
+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.footer.shared.FooterViewRefactor
+import com.android.systemui.statusbar.notification.shared.NotificationsHeadsUpRefactor
+import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository
+import com.android.systemui.statusbar.notification.stack.data.repository.setNotifications
+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
+import com.android.systemui.util.ui.value
+import com.google.common.truth.Truth.assertThat
+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.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@EnableFlags(FooterViewRefactor.FLAG_NAME)
+class NotificationListViewModelTest : SysuiTestCase() {
+    private val kosmos =
+        testKosmos().apply {
+            fakeFeatureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) }
+        }
+    private val testScope = kosmos.testScope
+
+    private val activeNotificationListRepository = kosmos.activeNotificationListRepository
+    private val fakeConfigurationController = kosmos.fakeConfigurationController
+    private val fakeKeyguardRepository = kosmos.fakeKeyguardRepository
+    private val fakePowerRepository = kosmos.fakePowerRepository
+    private val fakeRemoteInputRepository = kosmos.fakeRemoteInputRepository
+    private val fakeShadeRepository = kosmos.fakeShadeRepository
+    private val fakeUserSetupRepository = kosmos.fakeUserSetupRepository
+    private val headsUpRepository = kosmos.headsUpNotificationRepository
+    private val zenModeRepository = kosmos.zenModeRepository
+
+    val underTest = kosmos.notificationListViewModel
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+    }
+
+    @Test
+    fun isImportantForAccessibility_falseWhenNoNotifs() =
+        testScope.runTest {
+            val important by collectLastValue(underTest.isImportantForAccessibility)
+
+            // WHEN on lockscreen
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
+            // AND has no notifs
+            activeNotificationListRepository.setActiveNotifs(count = 0)
+            testScope.runCurrent()
+
+            // THEN not important
+            assertThat(important).isFalse()
+        }
+
+    @Test
+    fun isImportantForAccessibility_trueWhenNotifs() =
+        testScope.runTest {
+            val important by collectLastValue(underTest.isImportantForAccessibility)
+
+            // WHEN on lockscreen
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
+            // AND has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            runCurrent()
+
+            // THEN is important
+            assertThat(important).isTrue()
+        }
+
+    @Test
+    fun isImportantForAccessibility_trueWhenNotKeyguard() =
+        testScope.runTest {
+            val important by collectLastValue(underTest.isImportantForAccessibility)
+
+            // WHEN not on lockscreen
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            // AND has no notifs
+            activeNotificationListRepository.setActiveNotifs(count = 0)
+            runCurrent()
+
+            // THEN is still important
+            assertThat(important).isTrue()
+        }
+
+    @Test
+    fun shouldIncludeEmptyShadeView_trueWhenNoNotifs() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
+
+            // WHEN has no notifs
+            activeNotificationListRepository.setActiveNotifs(count = 0)
+            runCurrent()
+
+            // THEN empty shade is visible
+            assertThat(shouldInclude).isTrue()
+        }
+
+    @Test
+    fun shouldIncludeEmptyShadeView_falseWhenNotifs() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
+
+            // WHEN has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            runCurrent()
+
+            // THEN empty shade is not visible
+            assertThat(shouldInclude).isFalse()
+        }
+
+    @Test
+    fun shouldIncludeEmptyShadeView_falseWhenQsExpandedDefault() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
+
+            // WHEN has no notifs
+            activeNotificationListRepository.setActiveNotifs(count = 0)
+            // AND quick settings are expanded
+            fakeShadeRepository.legacyQsFullscreen.value = true
+            runCurrent()
+
+            // THEN empty shade is not visible
+            assertThat(shouldInclude).isFalse()
+        }
+
+    @Test
+    fun shouldIncludeEmptyShadeView_trueWhenQsExpandedInSplitShade() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
+
+            // WHEN has no notifs
+            activeNotificationListRepository.setActiveNotifs(count = 0)
+            // AND quick settings are expanded
+            fakeShadeRepository.setQsExpansion(1f)
+            // AND split shade is enabled
+            overrideResource(R.bool.config_use_split_notification_shade, true)
+            fakeConfigurationController.notifyConfigurationChanged()
+            runCurrent()
+
+            // THEN empty shade is visible
+            assertThat(shouldInclude).isTrue()
+        }
+
+    @Test
+    fun shouldIncludeEmptyShadeView_trueWhenLockedShade() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
+
+            // WHEN has no notifs
+            activeNotificationListRepository.setActiveNotifs(count = 0)
+            // AND shade is open
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE_LOCKED)
+            runCurrent()
+
+            // THEN empty shade is visible
+            assertThat(shouldInclude).isTrue()
+        }
+
+    @Test
+    fun shouldIncludeEmptyShadeView_falseWhenKeyguard() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
+
+            // WHEN has no notifs
+            activeNotificationListRepository.setActiveNotifs(count = 0)
+            // AND shade is open
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
+            runCurrent()
+
+            // THEN empty shade is not visible
+            assertThat(shouldInclude).isFalse()
+        }
+
+    @Test
+    fun shouldIncludeEmptyShadeView_falseWhenStartingToSleep() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
+
+            // WHEN has no notifs
+            activeNotificationListRepository.setActiveNotifs(count = 0)
+            // AND shade is open
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            // AND device is starting to go to sleep
+            fakePowerRepository.updateWakefulness(WakefulnessState.STARTING_TO_SLEEP)
+            runCurrent()
+
+            // THEN empty shade is not visible
+            assertThat(shouldInclude).isFalse()
+        }
+
+    @Test
+    fun areNotificationsHiddenInShade_true() =
+        testScope.runTest {
+            val hidden by collectLastValue(underTest.areNotificationsHiddenInShade)
+
+            zenModeRepository.setSuppressedVisualEffects(Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST)
+            zenModeRepository.zenMode.value = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
+            runCurrent()
+
+            assertThat(hidden).isTrue()
+        }
+
+    @Test
+    fun areNotificationsHiddenInShade_false() =
+        testScope.runTest {
+            val hidden by collectLastValue(underTest.areNotificationsHiddenInShade)
+
+            zenModeRepository.setSuppressedVisualEffects(Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST)
+            zenModeRepository.zenMode.value = 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 shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
+
+            // WHEN has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            // AND shade is open
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            fakeShadeRepository.setLegacyShadeExpansion(1f)
+            runCurrent()
+
+            // THEN footer is visible
+            assertThat(shouldInclude?.value).isTrue()
+        }
+
+    @Test
+    fun shouldIncludeFooterView_trueWhenLockedShade() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
+
+            // WHEN has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            // AND shade is open on lockscreen
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE_LOCKED)
+            fakeShadeRepository.setLegacyShadeExpansion(1f)
+            runCurrent()
+
+            // THEN footer is visible
+            assertThat(shouldInclude?.value).isTrue()
+        }
+
+    @Test
+    fun shouldIncludeFooterView_falseWhenKeyguard() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
+
+            // WHEN has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            // AND is on keyguard
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
+            runCurrent()
+
+            // THEN footer is not visible
+            assertThat(shouldInclude?.value).isFalse()
+        }
+
+    @Test
+    fun shouldIncludeFooterView_falseWhenUserNotSetUp() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
+
+            // WHEN has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            // AND shade is open
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            fakeShadeRepository.setLegacyShadeExpansion(1f)
+            // AND user is not set up
+            fakeUserSetupRepository.setUserSetUp(false)
+            runCurrent()
+
+            // THEN footer is not visible
+            assertThat(shouldInclude?.value).isFalse()
+        }
+
+    @Test
+    fun shouldIncludeFooterView_falseWhenStartingToSleep() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
+
+            // WHEN has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            // AND shade is open
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            fakeShadeRepository.setLegacyShadeExpansion(1f)
+            // AND device is starting to go to sleep
+            fakePowerRepository.updateWakefulness(WakefulnessState.STARTING_TO_SLEEP)
+            runCurrent()
+
+            // THEN footer is not visible
+            assertThat(shouldInclude?.value).isFalse()
+        }
+
+    @Test
+    fun shouldIncludeFooterView_falseWhenQsExpandedDefault() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
+
+            // WHEN has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            // AND shade is open
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            fakeShadeRepository.setLegacyShadeExpansion(1f)
+            // AND quick settings are expanded
+            fakeShadeRepository.setQsExpansion(1f)
+            fakeShadeRepository.legacyQsFullscreen.value = true
+            runCurrent()
+
+            // THEN footer is not visible
+            assertThat(shouldInclude?.value).isFalse()
+        }
+
+    @Test
+    fun shouldIncludeFooterView_trueWhenQsExpandedSplitShade() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
+
+            // WHEN has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            // AND shade is open
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            fakeShadeRepository.setLegacyShadeExpansion(1f)
+            // AND quick settings are expanded
+            fakeShadeRepository.setQsExpansion(1f)
+            // AND split shade is enabled
+            overrideResource(R.bool.config_use_split_notification_shade, true)
+            fakeConfigurationController.notifyConfigurationChanged()
+            runCurrent()
+
+            // THEN footer is visible
+            assertThat(shouldInclude?.value).isTrue()
+        }
+
+    @Test
+    fun shouldIncludeFooterView_falseWhenRemoteInputActive() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
+
+            // WHEN has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            // AND shade is open
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            fakeShadeRepository.setLegacyShadeExpansion(1f)
+            // AND remote input is active
+            fakeRemoteInputRepository.isRemoteInputActive.value = true
+            runCurrent()
+
+            // THEN footer is not visible
+            assertThat(shouldInclude?.value).isFalse()
+        }
+
+    @Test
+    fun shouldIncludeFooterView_animatesWhenShade() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
+
+            // WHEN has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            // AND shade is open and fully expanded
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            fakeShadeRepository.setLegacyShadeExpansion(1f)
+            runCurrent()
+
+            // THEN footer visibility animates
+            assertThat(shouldInclude?.isAnimating).isTrue()
+        }
+
+    @Test
+    fun shouldIncludeFooterView_notAnimatingOnKeyguard() =
+        testScope.runTest {
+            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
+
+            // WHEN has notifs
+            activeNotificationListRepository.setActiveNotifs(count = 2)
+            // AND we are on the keyguard
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
+            fakeShadeRepository.setLegacyShadeExpansion(1f)
+            runCurrent()
+
+            // THEN footer visibility does not animate
+            assertThat(shouldInclude?.isAnimating).isFalse()
+        }
+
+    @Test
+    fun shouldHideFooterView_trueWhenShadeIsClosed() =
+        testScope.runTest {
+            val shouldHide by collectLastValue(underTest.shouldHideFooterView)
+
+            // WHEN shade is closed
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            fakeShadeRepository.setLegacyShadeExpansion(0f)
+            runCurrent()
+
+            // THEN footer is hidden
+            assertThat(shouldHide).isTrue()
+        }
+
+    @Test
+    fun shouldHideFooterView_falseWhenShadeIsOpen() =
+        testScope.runTest {
+            val shouldHide by collectLastValue(underTest.shouldHideFooterView)
+
+            // WHEN shade is open
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            fakeShadeRepository.setLegacyShadeExpansion(1f)
+            runCurrent()
+
+            // THEN footer is hidden
+            assertThat(shouldHide).isFalse()
+        }
+
+    @Test
+    fun shouldHideFooterView_falseWhenQSPartiallyOpen() =
+        testScope.runTest {
+            val shouldHide by collectLastValue(underTest.shouldHideFooterView)
+
+            // WHEN QS partially open
+            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
+            fakeShadeRepository.setQsExpansion(0.5f)
+            fakeShadeRepository.setLegacyShadeExpansion(0.5f)
+            runCurrent()
+
+            // THEN footer is hidden
+            assertThat(shouldHide).isFalse()
+        }
+
+    @Test
+    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
+    fun pinnedHeadsUpRows_filtersForPinnedItems() =
+        testScope.runTest {
+            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRows)
+
+            // WHEN there are no pinned rows
+            val rows =
+                arrayListOf(
+                    fakeHeadsUpRowRepository(key = "0"),
+                    fakeHeadsUpRowRepository(key = "1"),
+                    fakeHeadsUpRowRepository(key = "2"),
+                )
+            headsUpRepository.setNotifications(
+                rows,
+            )
+            runCurrent()
+
+            // THEN the list is empty
+            assertThat(pinnedHeadsUpRows).isEmpty()
+
+            // WHEN a row gets pinned
+            rows[0].isPinned.value = true
+            runCurrent()
+
+            // THEN it's added to the list
+            assertThat(pinnedHeadsUpRows).containsExactly(rows[0])
+
+            // WHEN more rows are pinned
+            rows[1].isPinned.value = true
+            runCurrent()
+
+            // THEN they are all in the list
+            assertThat(pinnedHeadsUpRows).containsExactly(rows[0], rows[1])
+
+            // WHEN a row gets unpinned
+            rows[0].isPinned.value = false
+            runCurrent()
+
+            // THEN it's removed from the list
+            assertThat(pinnedHeadsUpRows).containsExactly(rows[1])
+        }
+
+    @Test
+    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
+    fun hasPinnedHeadsUpRows_true() =
+        testScope.runTest {
+            val hasPinnedHeadsUpRow by collectLastValue(underTest.hasPinnedHeadsUpRow)
+
+            headsUpRepository.setNotifications(
+                fakeHeadsUpRowRepository(key = "0", isPinned = true),
+                fakeHeadsUpRowRepository(key = "1")
+            )
+            runCurrent()
+
+            assertThat(hasPinnedHeadsUpRow).isTrue()
+        }
+
+    @Test
+    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
+    fun hasPinnedHeadsUpRows_false() =
+        testScope.runTest {
+            val hasPinnedHeadsUpRow by collectLastValue(underTest.hasPinnedHeadsUpRow)
+
+            headsUpRepository.setNotifications(
+                fakeHeadsUpRowRepository(key = "0"),
+                fakeHeadsUpRowRepository(key = "1"),
+            )
+            runCurrent()
+
+            assertThat(hasPinnedHeadsUpRow).isFalse()
+        }
+
+    @Test
+    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
+    fun topHeadsUpRow_emptyList_null() =
+        testScope.runTest {
+            val topHeadsUpRow by collectLastValue(underTest.topHeadsUpRow)
+
+            headsUpRepository.setNotifications(emptyList())
+            runCurrent()
+
+            assertThat(topHeadsUpRow).isNull()
+        }
+
+    @Test
+    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
+    fun headsUpAnimationsEnabled_true() =
+        testScope.runTest {
+            val animationsEnabled by collectLastValue(underTest.headsUpAnimationsEnabled)
+
+            fakeShadeRepository.setQsExpansion(0.0f)
+            fakeKeyguardRepository.setKeyguardShowing(false)
+            runCurrent()
+
+            assertThat(animationsEnabled).isTrue()
+        }
+
+    @Test
+    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
+    fun headsUpAnimationsEnabled_keyguardShowing_false() =
+        testScope.runTest {
+            val animationsEnabled by collectLastValue(underTest.headsUpAnimationsEnabled)
+
+            fakeShadeRepository.setQsExpansion(0.0f)
+            fakeKeyguardRepository.setKeyguardShowing(true)
+            runCurrent()
+
+            assertThat(animationsEnabled).isFalse()
+        }
+
+    private fun fakeHeadsUpRowRepository(key: String, isPinned: Boolean = false) =
+        FakeHeadsUpRowRepository(key = key, elementKey = Any()).apply {
+            this.isPinned.value = isPinned
+        }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelTest.kt
index 2ccc8b4..1f0812d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelTest.kt
@@ -19,12 +19,13 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.common.shared.model.NotificationContainerBounds
-import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.testScope
 import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackAppearanceInteractor
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
 import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -33,17 +34,23 @@
 class NotificationsPlaceholderViewModelTest : SysuiTestCase() {
     private val kosmos = testKosmos()
     private val underTest = kosmos.notificationsPlaceholderViewModel
+
     @Test
-    fun onBoundsChanged_setsNotificationContainerBounds() {
-        underTest.onBoundsChanged(left = 5f, top = 5f, right = 5f, bottom = 5f)
-        assertThat(kosmos.keyguardInteractor.notificationContainerBounds.value)
-            .isEqualTo(NotificationContainerBounds(top = 5f, bottom = 5f))
-        assertThat(kosmos.notificationStackAppearanceInteractor.stackBounds.value)
-            .isEqualTo(StackBounds(left = 5f, top = 5f, right = 5f, bottom = 5f))
-    }
+    fun onBoundsChanged() =
+        kosmos.testScope.runTest {
+            val bounds = ShadeScrimBounds(left = 5f, top = 15f, right = 25f, bottom = 35f)
+            underTest.onScrimBoundsChanged(bounds)
+            val stackBounds by
+                collectLastValue(kosmos.notificationStackAppearanceInteractor.shadeScrimBounds)
+            assertThat(stackBounds).isEqualTo(bounds)
+        }
+
     @Test
-    fun onContentTopChanged_setsContentTop() {
-        underTest.onContentTopChanged(padding = 5f)
-        assertThat(kosmos.notificationStackAppearanceInteractor.contentTop.value).isEqualTo(5f)
-    }
+    fun onStackBoundsChanged() =
+        kosmos.testScope.runTest {
+            underTest.onStackBoundsChanged(top = 5f, bottom = 500f)
+            assertThat(kosmos.notificationStackAppearanceInteractor.stackTop.value).isEqualTo(5f)
+            assertThat(kosmos.notificationStackAppearanceInteractor.stackBottom.value)
+                .isEqualTo(500f)
+        }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt
index 5256bb9..aef1d71 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt
@@ -19,15 +19,21 @@
 
 package com.android.systemui.statusbar.notification.stack.ui.viewmodel
 
-import androidx.test.ext.junit.runners.AndroidJUnit4
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.FlagsParameterization
 import androidx.test.filters.SmallTest
 import com.android.systemui.Flags.FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX
+import com.android.systemui.Flags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT
+import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.common.shared.model.NotificationContainerBounds
 import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.coroutines.collectValues
+import com.android.systemui.flags.EnableSceneContainer
 import com.android.systemui.flags.Flags
+import com.android.systemui.flags.andSceneContainer
 import com.android.systemui.flags.fakeFeatureFlagsClassic
 import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
 import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
@@ -61,19 +67,36 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito.mock
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
 
 @SmallTest
-@RunWith(AndroidJUnit4::class)
-class SharedNotificationContainerViewModelTest : SysuiTestCase() {
+@RunWith(ParameterizedAndroidJunit4::class)
+// SharedNotificationContainerViewModel is only bound when FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT is on
+@EnableFlags(FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT)
+class SharedNotificationContainerViewModelTest(flags: FlagsParameterization?) : SysuiTestCase() {
+
+    companion object {
+        @JvmStatic
+        @Parameters(name = "{0}")
+        fun getParams(): List<FlagsParameterization> {
+            return FlagsParameterization.allCombinationsOf(
+                    FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX,
+                )
+                .andSceneContainer()
+        }
+    }
+
+    init {
+        mSetFlagsRule.setFlagsParameterization(flags!!)
+    }
+
     val aodBurnInViewModel = mock(AodBurnInViewModel::class.java)
     lateinit var movementFlow: MutableStateFlow<BurnInModel>
 
     val kosmos =
         testKosmos().apply {
-            fakeFeatureFlagsClassic.apply {
-                set(Flags.FULL_SCREEN_USER_SWITCHER, false)
-                set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false)
-            }
+            fakeFeatureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) }
         }
 
     init {
@@ -81,14 +104,22 @@
     }
 
     val testScope = kosmos.testScope
-    val configurationRepository = kosmos.fakeConfigurationRepository
-    val keyguardRepository = kosmos.fakeKeyguardRepository
-    val keyguardInteractor = kosmos.keyguardInteractor
-    val keyguardRootViewModel = kosmos.keyguardRootViewModel
-    val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
-    val shadeRepository = kosmos.shadeRepository
-    val sharedNotificationContainerInteractor = kosmos.sharedNotificationContainerInteractor
-    val largeScreenHeaderHelper = kosmos.mockLargeScreenHeaderHelper
+    val configurationRepository
+        get() = kosmos.fakeConfigurationRepository
+    val keyguardRepository
+        get() = kosmos.fakeKeyguardRepository
+    val keyguardInteractor
+        get() = kosmos.keyguardInteractor
+    val keyguardRootViewModel
+        get() = kosmos.keyguardRootViewModel
+    val keyguardTransitionRepository
+        get() = kosmos.fakeKeyguardTransitionRepository
+    val shadeRepository
+        get() = kosmos.shadeRepository
+    val sharedNotificationContainerInteractor
+        get() = kosmos.sharedNotificationContainerInteractor
+    val largeScreenHeaderHelper
+        get() = kosmos.mockLargeScreenHeaderHelper
 
     lateinit var underTest: SharedNotificationContainerViewModel
 
@@ -127,38 +158,38 @@
         }
 
     @Test
+    @DisableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
     fun validatePaddingTopInSplitShade_refactorFlagOff_usesLargeHeaderResource() =
         testScope.runTest {
-            mSetFlagsRule.disableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
             whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight()).thenReturn(5)
             overrideResource(R.bool.config_use_split_notification_shade, true)
             overrideResource(R.bool.config_use_large_screen_shade_header, true)
             overrideResource(R.dimen.large_screen_shade_header_height, 10)
             overrideResource(R.dimen.keyguard_split_shade_top_margin, 50)
 
-            val dimens by collectLastValue(underTest.configurationBasedDimensions)
+            val paddingTop by collectLastValue(underTest.paddingTopDimen)
 
             configurationRepository.onAnyConfigurationChange()
 
             // Should directly use the header height (flagged off value)
-            assertThat(dimens!!.paddingTop).isEqualTo(10)
+            assertThat(paddingTop).isEqualTo(10)
         }
 
     @Test
+    @EnableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
     fun validatePaddingTopInSplitShade_refactorFlagOn_usesLargeHeaderHelper() =
         testScope.runTest {
-            mSetFlagsRule.enableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
             whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight()).thenReturn(5)
             overrideResource(R.bool.config_use_split_notification_shade, true)
             overrideResource(R.bool.config_use_large_screen_shade_header, true)
             overrideResource(R.dimen.large_screen_shade_header_height, 10)
             overrideResource(R.dimen.keyguard_split_shade_top_margin, 50)
 
-            val dimens by collectLastValue(underTest.configurationBasedDimensions)
+            val paddingTop by collectLastValue(underTest.paddingTopDimen)
             configurationRepository.onAnyConfigurationChange()
 
             // Should directly use the header height (flagged on value)
-            assertThat(dimens!!.paddingTop).isEqualTo(5)
+            assertThat(paddingTop).isEqualTo(5)
         }
 
     @Test
@@ -168,11 +199,11 @@
             overrideResource(R.dimen.large_screen_shade_header_height, 10)
             overrideResource(R.dimen.keyguard_split_shade_top_margin, 50)
 
-            val dimens by collectLastValue(underTest.configurationBasedDimensions)
+            val paddingTop by collectLastValue(underTest.paddingTopDimen)
 
             configurationRepository.onAnyConfigurationChange()
 
-            assertThat(dimens!!.paddingTop).isEqualTo(0)
+            assertThat(paddingTop).isEqualTo(0)
         }
 
     @Test
@@ -200,9 +231,9 @@
         }
 
     @Test
+    @DisableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX, FLAG_SCENE_CONTAINER)
     fun validateMarginTopWithLargeScreenHeader_refactorFlagOff_usesResource() =
         testScope.runTest {
-            mSetFlagsRule.disableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
             val headerResourceHeight = 50
             val headerHelperHeight = 100
             whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight())
@@ -219,9 +250,30 @@
         }
 
     @Test
+    @DisableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
+    @EnableSceneContainer
+    fun validateMarginTopWithLargeScreenHeader_refactorFlagOff_sceneContainerFlagOn_stillZero() =
+        testScope.runTest {
+            val headerResourceHeight = 50
+            val headerHelperHeight = 100
+            whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight())
+                .thenReturn(headerHelperHeight)
+            overrideResource(R.bool.config_use_large_screen_shade_header, true)
+            overrideResource(R.dimen.large_screen_shade_header_height, headerResourceHeight)
+            overrideResource(R.dimen.notification_panel_margin_top, 0)
+
+            val dimens by collectLastValue(underTest.configurationBasedDimensions)
+
+            configurationRepository.onAnyConfigurationChange()
+
+            assertThat(dimens!!.marginTop).isEqualTo(0)
+        }
+
+    @Test
+    @DisableFlags(FLAG_SCENE_CONTAINER)
+    @EnableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
     fun validateMarginTopWithLargeScreenHeader_refactorFlagOn_usesHelper() =
         testScope.runTest {
-            mSetFlagsRule.enableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
             val headerResourceHeight = 50
             val headerHelperHeight = 100
             whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight())
@@ -238,6 +290,26 @@
         }
 
     @Test
+    @EnableSceneContainer
+    @EnableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
+    fun validateMarginTopWithLargeScreenHeader_sceneContainerFlagOn_stillZero() =
+        testScope.runTest {
+            val headerResourceHeight = 50
+            val headerHelperHeight = 100
+            whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight())
+                .thenReturn(headerHelperHeight)
+            overrideResource(R.bool.config_use_large_screen_shade_header, true)
+            overrideResource(R.dimen.large_screen_shade_header_height, headerResourceHeight)
+            overrideResource(R.dimen.notification_panel_margin_top, 0)
+
+            val dimens by collectLastValue(underTest.configurationBasedDimensions)
+
+            configurationRepository.onAnyConfigurationChange()
+
+            assertThat(dimens!!.marginTop).isEqualTo(0)
+        }
+
+    @Test
     fun glanceableHubAlpha_lockscreenToHub() =
         testScope.runTest {
             val alpha by collectLastValue(underTest.glanceableHubAlpha)
@@ -290,10 +362,15 @@
         testScope.runTest {
             val alpha by collectLastValue(underTest.glanceableHubAlpha)
 
-            // Start on dream
-            showDream()
+            // Start on lockscreen, notifications should be unhidden.
+            showLockscreen()
             assertThat(alpha).isEqualTo(1f)
 
+            // Transition to dream, notifications should be hidden so that transition
+            // from dream->hub doesn't cause notification flicker.
+            showDream()
+            assertThat(alpha).isEqualTo(0f)
+
             // Start transitioning to glanceable hub
             val progress = 0.6f
             keyguardTransitionRepository.sendTransitionStep(
@@ -454,6 +531,7 @@
         }
 
     @Test
+    @DisableFlags(FLAG_SCENE_CONTAINER)
     fun boundsOnLockscreenNotInSplitShade() =
         testScope.runTest {
             val bounds by collectLastValue(underTest.bounds)
@@ -474,9 +552,9 @@
         }
 
     @Test
+    @DisableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX, FLAG_SCENE_CONTAINER)
     fun boundsOnLockscreenInSplitShade_refactorFlagOff_usesLargeHeaderResource() =
         testScope.runTest {
-            mSetFlagsRule.disableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
             val bounds by collectLastValue(underTest.bounds)
 
             // When in split shade
@@ -493,18 +571,25 @@
             showLockscreen()
 
             keyguardInteractor.setNotificationContainerBounds(
-                NotificationContainerBounds(top = 1f, bottom = 2f)
+                NotificationContainerBounds(top = 1f, bottom = 52f)
             )
             runCurrent()
 
             // Top should be equal to bounds (1) - padding adjustment (10)
-            assertThat(bounds).isEqualTo(NotificationContainerBounds(top = -9f, bottom = 2f))
+            assertThat(bounds)
+                .isEqualTo(
+                    NotificationContainerBounds(
+                        top = -9f,
+                        bottom = 2f,
+                    )
+                )
         }
 
     @Test
+    @EnableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
+    @DisableFlags(FLAG_SCENE_CONTAINER)
     fun boundsOnLockscreenInSplitShade_refactorFlagOn_usesLargeHeaderHelper() =
         testScope.runTest {
-            mSetFlagsRule.enableFlags(FLAG_CENTRALIZED_STATUS_BAR_HEIGHT_FIX)
             val bounds by collectLastValue(underTest.bounds)
 
             // When in split shade
@@ -521,7 +606,7 @@
             showLockscreen()
 
             keyguardInteractor.setNotificationContainerBounds(
-                NotificationContainerBounds(top = 1f, bottom = 2f)
+                NotificationContainerBounds(top = 1f, bottom = 52f)
             )
             runCurrent()
 
@@ -530,6 +615,7 @@
         }
 
     @Test
+    @DisableFlags(FLAG_SCENE_CONTAINER)
     fun boundsOnShade() =
         testScope.runTest {
             val bounds by collectLastValue(underTest.bounds)
@@ -545,6 +631,7 @@
         }
 
     @Test
+    @DisableFlags(FLAG_SCENE_CONTAINER)
     fun boundsOnQS() =
         testScope.runTest {
             val bounds by collectLastValue(underTest.bounds)
@@ -580,6 +667,12 @@
             notificationCount = 25
             sharedNotificationContainerInteractor.notificationStackChanged()
             assertThat(maxNotifications).isEqualTo(25)
+
+            // Also ensure another collection starts with the same value. As an example, folding
+            // then unfolding will restart the coroutine and it must get the last value immediately.
+            val newMaxNotifications by
+                collectLastValue(underTest.getMaxNotifications(calculateSpace))
+            assertThat(newMaxNotifications).isEqualTo(25)
         }
 
     @Test
@@ -638,6 +731,7 @@
         }
 
     @Test
+    @DisableFlags(FLAG_SCENE_CONTAINER)
     fun translationYUpdatesOnKeyguardForBurnIn() =
         testScope.runTest {
             val translationY by collectLastValue(underTest.translationY(BurnInParameters()))
@@ -650,6 +744,7 @@
         }
 
     @Test
+    @DisableFlags(FLAG_SCENE_CONTAINER)
     fun translationYUpdatesOnKeyguard() =
         testScope.runTest {
             val translationY by collectLastValue(underTest.translationY(BurnInParameters()))
@@ -670,6 +765,7 @@
         }
 
     @Test
+    @DisableFlags(FLAG_SCENE_CONTAINER)
     fun translationYDoesNotUpdateWhenShadeIsExpanded() =
         testScope.runTest {
             val translationY by collectLastValue(underTest.translationY(BurnInParameters()))
@@ -690,6 +786,7 @@
         }
 
     @Test
+    @DisableFlags(FLAG_SCENE_CONTAINER)
     fun updateBounds_fromKeyguardRoot() =
         testScope.runTest {
             val bounds by collectLastValue(underTest.bounds)
@@ -755,6 +852,41 @@
         }
 
     @Test
+    fun alphaDoesNotUpdateWhileOcclusionTransitionIsRunning() =
+        testScope.runTest {
+            val viewState = ViewStateAccessor()
+            val alpha by collectLastValue(underTest.keyguardAlpha(viewState))
+
+            showLockscreen()
+            // OCCLUDED transition gets to 90% complete
+            keyguardTransitionRepository.sendTransitionStep(
+                TransitionStep(
+                    from = KeyguardState.LOCKSCREEN,
+                    to = KeyguardState.OCCLUDED,
+                    transitionState = TransitionState.STARTED,
+                    value = 0f,
+                )
+            )
+            runCurrent()
+            keyguardTransitionRepository.sendTransitionStep(
+                TransitionStep(
+                    from = KeyguardState.LOCKSCREEN,
+                    to = KeyguardState.OCCLUDED,
+                    transitionState = TransitionState.RUNNING,
+                    value = 0.9f,
+                )
+            )
+            runCurrent()
+
+            // At this point, alpha should be zero
+            assertThat(alpha).isEqualTo(0f)
+
+            // An attempt to override by the shade should be ignored
+            shadeRepository.setQsExpansion(0.5f)
+            assertThat(alpha).isEqualTo(0f)
+        }
+
+    @Test
     fun alphaWhenGoneIsSetToOne() =
         testScope.runTest {
             val viewState = ViewStateAccessor()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
index 781a9a8..7e5205b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/DozeServiceHostTest.java
@@ -36,7 +36,6 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.keyguard.LockIconViewController;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.biometrics.AuthController;
@@ -93,7 +92,6 @@
     @Mock private NotificationShadeWindowViewController mNotificationShadeWindowViewController;
     @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
     @Mock private ShadeLockscreenInteractor mShadeLockscreenInteractor;
-    @Mock private LockIconViewController mLockIconViewController;
     @Mock private View mAmbientIndicationContainer;
     @Mock private BiometricUnlockController mBiometricUnlockController;
     @Mock private AuthController mAuthController;
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt
index 30564bb..29f286f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt
@@ -22,6 +22,7 @@
 import androidx.test.filters.SmallTest
 import com.android.internal.logging.testing.UiEventLoggerFake
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.dump.DumpManager
 import com.android.systemui.log.logcatLogBuffer
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
 import com.android.systemui.statusbar.notification.shared.NotificationThrottleHun
@@ -47,12 +48,14 @@
 @EnableFlags(NotificationThrottleHun.FLAG_NAME)
 class AvalancheControllerTest : SysuiTestCase() {
 
-    private val mAvalancheController = AvalancheController()
-
     // For creating mocks
     @get:Rule var rule: MockitoRule = MockitoJUnit.rule()
     @Mock private val runnableMock: Runnable? = null
 
+    // For creating AvalancheController
+    @Mock private lateinit var dumpManager: DumpManager
+    private lateinit var mAvalancheController: AvalancheController
+
     // For creating TestableHeadsUpManager
     @Mock private val mAccessibilityMgr: AccessibilityManagerWrapper? = null
     private val mUiEventLoggerFake = UiEventLoggerFake()
@@ -73,7 +76,10 @@
             )
             .then { i: InvocationOnMock -> i.getArgument(0) }
 
-        // Initialize TestableHeadsUpManager here instead of at declaration, when mocks will be null
+        // Initialize AvalancheController and TestableHeadsUpManager during setUp instead of
+        // declaration, where mocks are null
+        mAvalancheController = AvalancheController(dumpManager)
+
         testableHeadsUpManager =
             TestableHeadsUpManager(
                 mContext,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/BaseHeadsUpManagerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/BaseHeadsUpManagerTest.java
index 3dc4495..7c130be 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/BaseHeadsUpManagerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/BaseHeadsUpManagerTest.java
@@ -45,6 +45,7 @@
 
 import com.android.internal.logging.testing.UiEventLoggerFake;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.dump.DumpManager;
 import com.android.systemui.res.R;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
@@ -73,7 +74,9 @@
 
     private UiEventLoggerFake mUiEventLoggerFake = new UiEventLoggerFake();
     private final HeadsUpManagerLogger mLogger = spy(new HeadsUpManagerLogger(logcatLogBuffer()));
-    private AvalancheController mAvalancheController = new AvalancheController();
+
+    @Mock private DumpManager dumpManager;
+    private AvalancheController mAvalancheController;
 
     @Mock private AccessibilityManagerWrapper mAccessibilityMgr;
 
@@ -130,6 +133,7 @@
     public void SysuiSetup() throws Exception {
         super.SysuiSetup();
         mSetFlagsRule.disableFlags(NotificationThrottleHun.FLAG_NAME);
+        mAvalancheController = new AvalancheController(dumpManager);
     }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerPhoneTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerPhoneTest.java
index 61a79d8..a8a75c0 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerPhoneTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerPhoneTest.java
@@ -32,6 +32,7 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.logging.UiEventLogger;
+import com.android.systemui.dump.DumpManager;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.res.R;
 import com.android.systemui.shade.domain.interactor.ShadeInteractor;
@@ -76,7 +77,8 @@
     @Mock private UiEventLogger mUiEventLogger;
     @Mock private JavaAdapter mJavaAdapter;
     @Mock private ShadeInteractor mShadeInteractor;
-    private AvalancheController mAvalancheController = new AvalancheController();
+    @Mock private DumpManager dumpManager;
+    private AvalancheController mAvalancheController;
 
     private static final class TestableHeadsUpManagerPhone extends HeadsUpManagerPhone {
         TestableHeadsUpManagerPhone(
@@ -154,6 +156,8 @@
         mDependency.injectMockDependency(NotificationShadeWindowController.class);
         mContext.getOrCreateTestableResources().addOverride(
                 R.integer.ambient_notification_extension_time, 500);
+
+        mAvalancheController = new AvalancheController(dumpManager);
     }
 
     @Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioVolumeInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioVolumeInteractorTest.kt
index 5358a6d..fa79e7f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioVolumeInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioVolumeInteractorTest.kt
@@ -201,11 +201,38 @@
     }
 
     @Test
-    fun alarmStream_isNotMutable() {
+    fun streamNotAffectedByMute_isNotMutable() {
         with(kosmos) {
-            val isMutable = underTest.isMutable(AudioStream(AudioManager.STREAM_ALARM))
+            testScope.runTest {
+                audioRepository.setIsAffectedByMute(audioStream, false)
+                val isMutable = underTest.isAffectedByMute(audioStream)
 
-            assertThat(isMutable).isFalse()
+                assertThat(isMutable).isFalse()
+            }
+        }
+    }
+
+    @Test
+    fun muteRingerStream_ringerMode_vibrate() {
+        with(kosmos) {
+            testScope.runTest {
+                val ringerMode by collectLastValue(audioRepository.ringerMode)
+                underTest.setMuted(AudioStream(AudioManager.STREAM_RING), true)
+
+                assertThat(ringerMode).isEqualTo(RingerMode(AudioManager.RINGER_MODE_VIBRATE))
+            }
+        }
+    }
+
+    @Test
+    fun unMuteRingerStream_ringerMode_normal() {
+        with(kosmos) {
+            testScope.runTest {
+                val ringerMode by collectLastValue(audioRepository.ringerMode)
+                underTest.setMuted(AudioStream(AudioManager.STREAM_RING), false)
+
+                assertThat(ringerMode).isEqualTo(RingerMode(AudioManager.RINGER_MODE_NORMAL))
+            }
         }
     }
 
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/anc/data/repository/AncSliceRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/anc/data/repository/AncSliceRepositoryTest.kt
index e31cdcd..dc96139 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/anc/data/repository/AncSliceRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/anc/data/repository/AncSliceRepositoryTest.kt
@@ -72,7 +72,7 @@
             testScope.runTest {
                 localMediaRepository.updateCurrentConnectedDevice(null)
 
-                val slice by collectLastValue(underTest.ancSlice(1))
+                val slice by collectLastValue(underTest.ancSlice(1, false, false))
                 runCurrent()
 
                 assertThat(slice).isNull()
@@ -86,7 +86,7 @@
             testScope.runTest {
                 localMediaRepository.updateCurrentConnectedDevice(createMediaDevice())
 
-                val slice by collectLastValue(underTest.ancSlice(1))
+                val slice by collectLastValue(underTest.ancSlice(1, false, false))
                 runCurrent()
 
                 assertThat(slice).isNotNull()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/anc/domain/interactor/AncSliceInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/anc/domain/interactor/AncSliceInteractorTest.kt
index 53f0bc9..81e6ac4 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/anc/domain/interactor/AncSliceInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/anc/domain/interactor/AncSliceInteractorTest.kt
@@ -24,6 +24,7 @@
 import com.android.systemui.testKosmos
 import com.android.systemui.volume.panel.component.anc.FakeSliceFactory
 import com.android.systemui.volume.panel.component.anc.ancSliceRepository
+import com.android.systemui.volume.panel.component.anc.domain.model.AncSlices
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runCurrent
@@ -57,10 +58,10 @@
                     FakeSliceFactory.createSlice(hasError = true, hasSliceItem = true)
                 )
 
-                val slice by collectLastValue(underTest.ancSlice)
+                val slice by collectLastValue(underTest.ancSlices)
                 runCurrent()
 
-                assertThat(slice).isNull()
+                assertThat(slice).isInstanceOf(AncSlices.Unavailable::class.java)
             }
         }
     }
@@ -74,10 +75,10 @@
                     FakeSliceFactory.createSlice(hasError = false, hasSliceItem = false)
                 )
 
-                val slice by collectLastValue(underTest.ancSlice)
+                val slice by collectLastValue(underTest.ancSlices)
                 runCurrent()
 
-                assertThat(slice).isNull()
+                assertThat(slice).isInstanceOf(AncSlices.Unavailable::class.java)
             }
         }
     }
@@ -91,10 +92,10 @@
                     FakeSliceFactory.createSlice(hasError = false, hasSliceItem = true)
                 )
 
-                val slice by collectLastValue(underTest.ancSlice)
+                val slice by collectLastValue(underTest.ancSlices)
                 runCurrent()
 
-                assertThat(slice).isNotNull()
+                assertThat(slice).isInstanceOf(AncSlices.Ready::class.java)
             }
         }
     }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/bottombar/ui/viewmodel/BottomBarViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/bottombar/ui/viewmodel/BottomBarViewModelTest.kt
index 8e92557..2cc1ad3 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/bottombar/ui/viewmodel/BottomBarViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/bottombar/ui/viewmodel/BottomBarViewModelTest.kt
@@ -84,8 +84,17 @@
 
                 runCurrent()
 
-                verify(activityStarter).startActivity(capture(intentCaptor), eq(true),
-                        capture(activityStartedCaptor))
+                verify(activityStarter)
+                    .startActivityDismissingKeyguard(
+                        /* intent = */ capture(intentCaptor),
+                        /* onlyProvisioned = */ eq(false),
+                        /* dismissShade = */ eq(true),
+                        /* disallowEnterPictureInPictureWhileLaunching = */ eq(false),
+                        /* callback = */ capture(activityStartedCaptor),
+                        /* flags = */ eq(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT),
+                        /* animationController = */ eq(null),
+                        /* userHandle = */ eq(null),
+                    )
                 assertThat(intentCaptor.value.action).isEqualTo(Settings.ACTION_SOUND_SETTINGS)
 
                 activityStartedCaptor.value.onActivityStarted(ActivityManager.START_SUCCESS)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModelTest.kt
index 6f7f20b..462f36d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModelTest.kt
@@ -35,7 +35,6 @@
 import com.android.systemui.volume.mediaDeviceSessionInteractor
 import com.android.systemui.volume.mediaOutputActionsInteractor
 import com.android.systemui.volume.mediaOutputInteractor
-import com.android.systemui.volume.panel.volumePanelViewModel
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runCurrent
@@ -62,7 +61,6 @@
                 MediaOutputViewModel(
                     applicationContext,
                     testScope.backgroundScope,
-                    volumePanelViewModel,
                     mediaOutputActionsInteractor,
                     mediaDeviceSessionInteractor,
                     mediaOutputInteractor,
diff --git a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
index c99cb39..83658d3 100644
--- a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
+++ b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
@@ -129,6 +129,11 @@
         void setDozeAmount(float amount);
 
         /**
+         * Set if the screen is on.
+         */
+        default void setScreenOn(boolean screenOn) {}
+
+        /**
          * Set if dozing is true or false
          */
         default void setDozing(boolean dozing) {}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt
index fd7a7f3..8e2bd9b 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt
@@ -188,10 +188,21 @@
      *   negative means left.
      * @param fraction fraction of the clock movement. 0 means it is at the beginning, and 1 means
      *   it finished moving.
+     * @deprecated use {@link #onPositionUpdated(float, float)} instead.
      */
     fun onPositionUpdated(fromLeft: Int, direction: Int, fraction: Float)
 
     /**
+     * Runs when the clock's position changed during the move animation.
+     *
+     * @param distance is the total distance in pixels to offset the glyphs when animation
+     *   completes. Negative distance means we are animating the position towards the center.
+     * @param fraction fraction of the clock movement. 0 means it is at the beginning, and 1 means
+     *   it finished moving.
+     */
+    fun onPositionUpdated(distance: Float, fraction: Float)
+
+    /**
      * Runs when swiping clock picker, swipingFraction: 1.0 -> clock is scaled up in the preview,
      * 0.0 -> clock is scaled down in the shade; previewRatio is previewSize / screenSize
      */
diff --git a/packages/SystemUI/res-keyguard/layout/alternate_bouncer.xml b/packages/SystemUI/res-keyguard/layout/alternate_bouncer.xml
index 41fb57a..cf9ca15 100644
--- a/packages/SystemUI/res-keyguard/layout/alternate_bouncer.xml
+++ b/packages/SystemUI/res-keyguard/layout/alternate_bouncer.xml
@@ -22,8 +22,7 @@
     android:focusable="true"
     android:clickable="true"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:visibility="invisible">
+    android:layout_height="match_parent">
 
     <com.android.systemui.scrim.ScrimView
         android:id="@+id/alternate_bouncer_scrim"
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_password_motion_layout.xml b/packages/SystemUI/res-keyguard/layout/keyguard_password_motion_layout.xml
index 173d57b..3b6b5a0 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_password_motion_layout.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_password_motion_layout.xml
@@ -91,6 +91,7 @@
                 android:layout_height="wrap_content"
                 android:contentDescription="@string/keyguard_accessibility_password"
                 android:gravity="center_horizontal"
+                android:layout_gravity="center"
                 android:imeOptions="flagForceAscii|actionDone"
                 android:inputType="textPassword"
                 android:maxLength="500"
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_password_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_password_view.xml
index 909d4fc..5aac653 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_password_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_password_view.xml
@@ -55,6 +55,7 @@
              android:layout_height="wrap_content"
              android:contentDescription="@string/keyguard_accessibility_password"
              android:gravity="center"
+             android:layout_gravity="center"
              android:singleLine="true"
              android:textStyle="normal"
              android:inputType="textPassword"
diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml
index b4d89ab..6f60d84 100644
--- a/packages/SystemUI/res-keyguard/values-af/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-af/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Gebruik eerder ’n patroon vir bykomende sekuriteit"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Gebruik eerder ’n PIN vir bykomende sekuriteit"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Gebruik eerder ’n wagwoord vir bykomende sekuriteit"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN word vir bykomende sekuriteit vereis"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Patroon word vir bykomende sekuriteit vereis"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Wagwoord word vir bykomende sekuriteit vereis"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Toestel is deur administrateur gesluit"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Toestel is handmatig gesluit"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nie herken nie"</string>
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index bfe918f..529d609 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ለተጨማሪ ደህንነት በምትኩ ስርዓተ ጥለት ይጠቀሙ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ለተጨማሪ ደህንነት በምትኩ ፒን ይጠቀሙ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ለተጨማሪ ደህንነት በምትኩ የይለፍ ቃል ይጠቀሙ"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"ፒን ለተጨማሪ ደህንነት ያስፈልጋል"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"ሥርዓተ ጥለት ለተጨማሪ ደህንነት ያስፈልጋል"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"የይለፍ ቃል ለተጨማሪ ደህንነት ያስፈልጋል"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"መሣሪያ በአስተዳዳሪ ተቆልፏል"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"መሣሪያ በተጠቃሚው ራሱ ተቆልፏል"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"አልታወቀም"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index e4dc86d..d07c5b5 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"لمزيد من الأمان، استخدِم النقش بدلاً من ذلك."</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"لمزيد من الأمان، أدخِل رقم التعريف الشخصي بدلاً من ذلك."</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"لمزيد من الأمان، أدخِل كلمة المرور بدلاً من ذلك."</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"يجب إدخال رقم التعريف الشخصي لمزيد من الأمان"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"يجب رسم النقش لمزيد من الأمان"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"يجب إدخال كلمة المرور لمزيد من الأمان"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"اختار المشرف قفل الجهاز"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"تم حظر الجهاز يدويًا"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"لم يتم التعرّف عليه."</string>
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
index 7a12aef..ce8ebd3 100644
--- a/packages/SystemUI/res-keyguard/values-as/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"অতিৰিক্ত সুৰক্ষাৰ বাবে, ইয়াৰ পৰিৱৰ্তে আৰ্হি ব্যৱহাৰ কৰক"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"অতিৰিক্ত সুৰক্ষাৰ বাবে, ইয়াৰ পৰিৱৰ্তে পিন ব্যৱহাৰ কৰক"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"অতিৰিক্ত সুৰক্ষাৰ বাবে, ইয়াৰ পৰিৱৰ্তে পাছৱৰ্ড ব্যৱহাৰ কৰক"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"অতিৰিক্ত সুৰক্ষাৰ বাবে পিন দিয়াটো বাধ্যতামূলক"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"অতিৰিক্ত সুৰক্ষাৰ বাবে আর্হি দিয়াটো বাধ্যতামূলক"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"অতিৰিক্ত সুৰক্ষাৰ বাবে পাছৱর্ড দিয়াটো বাধ্যতামূলক"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"প্ৰশাসকে ডিভাইচ লক কৰি ৰাখিছে"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ডিভাইচটো মেনুৱেলভাৱে লক কৰা হৈছিল"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"চিনাক্ত কৰিব পৰা নাই"</string>
diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml
index ba07b27..832391c 100644
--- a/packages/SystemUI/res-keyguard/values-az/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-az/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Əlavə təhlükəsizlik üçün modeldən istifadə edin"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Əlavə təhlükəsizlik üçün PIN istifadə edin"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Əlavə təhlükəsizlik üçün paroldan istifadə edin"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Əlavə təhlükəsizlik üçün PIN tələb olunur"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Əlavə təhlükəsizlik üçün model tələb olunur"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Əlavə təhlükəsizlik üçün parol tələb olunur"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Cihaz admin tərəfindən kilidlənib"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Cihaz əl ilə kilidləndi"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tanınmır"</string>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index 9d6fdfa..ee27e83 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Za dodatnu bezbednost koristite šablon"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Za dodatnu bezbednost koristite PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Za dodatnu bezbednost koristite lozinku"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Treba da unesete PIN radi dodatne bezbednosti"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Treba da unesete šablon radi dodatne bezbednosti"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Treba da unesete lozinku radi dodatne bezbednosti"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrator je zaključao uređaj"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznat"</string>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index 0a27f5e..7d37e6e 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"У мэтах дадатковай бяспекі скарыстайце ўзор разблакіроўкі"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"У мэтах дадатковай бяспекі скарыстайце PIN-код"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"У мэтах дадатковай бяспекі скарыстайце пароль"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Для дадатковай бяспекі неабходна ўвесці PIN-код"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Для дадатковай бяспекі неабходна ўвесці ўзор разблакіроўкі"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Для дадатковай бяспекі неабходна ўвесці пароль"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Прылада заблакіравана адміністратарам"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Прылада была заблакіравана ўручную"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Не распазнана"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index 8fa334d..5b804e2 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"অতিরিক্ত সুরক্ষার জন্য, এর বদলে প্যাটার্ন ব্যবহার করুন"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"অতিরিক্ত সুরক্ষার জন্য, এর বদলে পিন ব্যবহার করুন"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"অতিরিক্ত সুরক্ষার জন্য, এর বদলে পাসওয়ার্ড ব্যবহার করুন"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"অতিরিক্ত নিরাপত্তার জন্য পিন দিতে হবে"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"অতিরিক্ত নিরাপত্তার জন্য প্যাটার্ন দিতে হবে"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"অতিরিক্ত নিরাপত্তার জন্য পাসওয়ার্ড দিতে হবে"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"প্রশাসক ডিভাইসটি লক করেছেন"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ডিভাইসটিকে ম্যানুয়ালি লক করা হয়েছে"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"শনাক্ত করা যায়নি"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index 7290a60..96779450 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Radi dodatne zaštite, umjesto toga koristite uzorak"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Radi dodatne zaštite, umjesto toga koristite PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Radi dodatne zašitite, umjesto toga koristite lozinku"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN je potreban radi dodatne sigurnosti"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Uzorak je potreban radi dodatne sigurnosti"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Lozinka je potrebna radi dodatne sigurnosti"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Uređaj je zaključao administrator"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznato"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index 1b91b09..226d193 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Per a més seguretat, utilitza el patró"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Per a més seguretat, utilitza el PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Per a més seguretat, utilitza la contrasenya"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Cal introduir el PIN per disposar de més seguretat"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Cal introduir el patró per disposar de més seguretat"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Cal introduir la contrasenya per disposar de més seguretat"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"L\'administrador ha bloquejat el dispositiu"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositiu s\'ha bloquejat manualment"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"No s\'ha reconegut"</string>
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index c62e9dd..8e97e84 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Z bezpečnostních důvodů raději použijte gesto"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Z bezpečnostních důvodů raději použijte PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Z bezpečnostních důvodů raději použijte heslo"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Pro ještě lepší zabezpečení je vyžadován kód PIN"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Pro ještě lepší zabezpečení je vyžadováno gesto"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Pro ještě lepší zabezpečení je vyžadováno heslo"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Zařízení je uzamknuto administrátorem"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Zařízení bylo ručně uzamčeno"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nerozpoznáno"</string>
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index f776d2e..3053e70 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Øg sikkerheden ved at bruge dit oplåsningsmønter i stedet"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Øg sikkerheden ved at bruge din pinkode i stedet"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Øg sikkerheden ved at bruge din adgangskode i stedet"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Der kræves en pinkode som ekstra beskyttelse"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Der kræves et mønster som ekstra beskyttelse"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Der kræves en adgangskode som ekstra beskyttelse"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Enheden er blevet låst af administratoren"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheden blev låst manuelt"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ikke genkendt"</string>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 633eab5..2245710 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Verwende für mehr Sicherheit stattdessen dein Muster"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Verwende für mehr Sicherheit stattdessen deine PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Verwende für mehr Sicherheit stattdessen dein Passwort"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Zur Verbesserung der Sicherheit ist eine PIN erforderlich"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Zur Verbesserung der Sicherheit ist ein Muster erforderlich"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Zur Verbesserung der Sicherheit ist ein Passwort erforderlich"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Gerät vom Administrator gesperrt"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Gerät manuell gesperrt"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nicht erkannt"</string>
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index 4f69be1..aa804635 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Για πρόσθετη ασφάλεια, χρησιμοποιήστε εναλλακτικά μοτίβο"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Για πρόσθετη ασφάλεια, χρησιμοποιήστε εναλλακτικά PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Για πρόσθετη ασφάλεια, χρησιμοποιήστε εναλλακτικά κωδικό πρόσβασης"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Απαιτείται PIN για πρόσθετη ασφάλεια"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Απαιτείται μοτίβο για πρόσθετη ασφάλεια"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Απαιτείται κωδικός πρόσβασης για πρόσθετη ασφάλεια"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Η συσκευή κλειδώθηκε από τον διαχειριστή"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Η συσκευή κλειδώθηκε με μη αυτόματο τρόπο"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Δεν αναγνωρίστηκε"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
index f9ed764..2a93dfe 100644
--- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN required for additional security"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Pattern required for additional security"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Password required for additional security"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
index f9ed764..2a93dfe 100644
--- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN required for additional security"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Pattern required for additional security"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Password required for additional security"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string>
diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
index f9ed764..2a93dfe 100644
--- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN required for additional security"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Pattern required for additional security"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Password required for additional security"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index 5da50fd6..45e2a9d 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para seguridad adicional, usa un patrón"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para seguridad adicional, usa un PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para seguridad adicional, usa una contraseña"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Se requiere el PIN por razones de seguridad"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Se requiere el patrón por razones de seguridad"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Se requiere la contraseña por razones de seguridad"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado por el administrador"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se bloqueó de forma manual"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoció"</string>
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index 9a67b07..3a09852 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para mayor seguridad, usa el patrón"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para mayor seguridad, usa el PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para mayor seguridad, usa la contraseña"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Debes introducir el PIN como medida de seguridad adicional"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Debes introducir el patrón como medida de seguridad adicional"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Debes introducir la contraseña como medida de seguridad adicional"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado por el administrador"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se ha bloqueado manualmente"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoce"</string>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index 446b927..0b8ad02 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Kasutage tugevama turvalisuse huvides hoopis mustrit"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Kasutage tugevama turvalisuse huvides hoopis PIN-koodi"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Kasutage tugevama turvalisuse huvides hoopis parooli"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Lisaturvalisuse huvides tuleb sisestada PIN-kood"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Lisaturvalisuse huvides tuleb sisestada muster"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Lisaturvalisuse huvides tuleb sisestada parool"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administraator lukustas seadme"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Seade lukustati käsitsi"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ei tuvastatud"</string>
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index ad20008..41c3e06 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Babestuago egoteko, erabili eredua"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Babestuago egoteko, erabili PINa"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Babestuago egoteko, erabili pasahitza"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PINa behar da gailua babestuago izateko"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Eredua behar da gailua babestuago izateko"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Pasahitza behar da gailua babestuago izateko"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administratzaileak blokeatu egin du gailua"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Eskuz blokeatu da gailua"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ez da ezagutu"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index 087e45f..917e131 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"برای امنیت بیشتر، به‌جای آن از الگو استفاده کنید"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"برای امنیت بیشتر، به‌جای آن از پین استفاده کنید"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"برای امنیت بیشتر، به‌جای آن از گذرواژه استفاده کنید"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"برای ایمنی بیشتر باید پین وارد شود"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"برای ایمنی بیشتر باید الگو وارد شود"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"برای ایمنی بیشتر باید گذرواژه وارد شود"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"دستگاه توسط سرپرست سیستم قفل شده است"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"دستگاه به‌صورت دستی قفل شده است"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"شناسایی نشد"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml
index b5e8fb5..ea1dd13 100644
--- a/packages/SystemUI/res-keyguard/values-fi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Lisäsuojaa saat, kun käytät sen sijaan kuviota"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Lisäsuojaa saat, kun käytät sen sijaan PIN-koodia"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Lisäsuojaa saat, kun käytät sen sijaan salasanaa"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN-koodi vaaditaan suojauksen parantamiseksi."</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Kuvio vaaditaan suojauksen parantamiseksi."</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Salasana vaaditaan suojauksen parantamiseksi."</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Järjestelmänvalvoja lukitsi laitteen."</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Laite lukittiin manuaalisesti"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ei tunnistettu"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index ea61070..6eea6c9 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Pour plus de sécurité, utilisez plutôt un schéma"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Pour plus de sécurité, utilisez plutôt un NIP"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Pour plus de sécurité, utilisez plutôt un mot de passe"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Le NIP est exigé pour plus de sécurité"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Le schéma est exigé pour plus de sécurité"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Le mot de passe est exigé pour plus de sécurité"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"L\'appareil a été verrouillé par l\'administrateur"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"L\'appareil a été verrouillé manuellement"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Doigt non reconnu"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index 40e10ef..188a76a 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Pour plus de sécurité, utilisez plutôt un schéma"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Pour plus de sécurité, utilisez plutôt un code"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Pour plus de sécurité, utilisez plutôt un mot de passe"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Veuillez saisir le code pour renforcer la sécurité"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Veuillez dessiner le schéma pour renforcer la sécurité"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Veuillez saisir le mot de passe pour renforcer la sécurité"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Appareil verrouillé par l\'administrateur"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Appareil verrouillé manuellement"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non reconnu"</string>
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index 2eb0323..6b51ac2 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Utiliza un padrón para obter maior seguranza"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Utiliza un PIN para obter maior seguranza"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Utiliza un contrasinal para obter maior seguranza"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"É necesario poñer o PIN como medida de seguranza adicional"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"É necesario poñer o padrón como medida de seguranza adicional"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"É necesario poñer o contrasinal como medida de seguranza adicional"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"O administrador bloqueou o dispositivo"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo bloqueouse manualmente"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non se recoñeceu"</string>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index 5f01e28..4645f03 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"વધારાની સુરક્ષા માટે, તેના બદલે પૅટર્નનો ઉપયોગ કરો"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"વધારાની સુરક્ષા માટે, તેના બદલે પિનનો ઉપયોગ કરો"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"વધારાની સુરક્ષા માટે, તેના બદલે પાસવર્ડનો ઉપયોગ કરો"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"વધારાની સુરક્ષા માટે પિન જરૂરી છે"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"વધારાની સુરક્ષા માટે પૅટર્ન જરૂરી છે"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"વધારાની સુરક્ષા માટે પાસવર્ડ જરૂરી છે"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"વ્યવસ્થાપકે ઉપકરણ લૉક કરેલું છે"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ઉપકરણ મેન્યુઅલી લૉક કર્યું હતું"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"ઓળખાયેલ નથી"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index 11e608c..a762b49 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ज़्यादा सुरक्षा के लिए, इसके बजाय पैटर्न का इस्तेमाल करें"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ज़्यादा सुरक्षा के लिए, इसके बजाय पिन का इस्तेमाल करें"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ज़्यादा सुरक्षा के लिए, इसके बजाय पासवर्ड का इस्तेमाल करें"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"अतिरिक्त सुरक्षा के लिए पिन ज़रूरी है"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"अतिरिक्त सुरक्षा के लिए पैटर्न ज़रूरी है"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"अतिरिक्त सुरक्षा के लिए पासवर्ड ज़रूरी है"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"व्यवस्थापक ने डिवाइस को लॉक किया है"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"डिवाइस को मैन्युअल रूप से लॉक किया गया था"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"पहचान नहीं हो पाई"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 274fdee..b4b2a19 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Za dodatnu sigurnost upotrijebite uzorak"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Za dodatnu sigurnost upotrijebite PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Za dodatnu sigurnost upotrijebite zaporku"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Unesite PIN radi dodatne sigurnosti"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Unesite uzorak radi dodatne sigurnosti"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Unesite zaporku radi dodatne sigurnosti"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrator je zaključao uređaj"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznato"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index 0a5ac59..bc4fe05 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"A nagyobb biztonság érdekében használjon inkább mintát"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"A nagyobb biztonság érdekében használjon inkább PIN-kódot"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"A nagyobb biztonság érdekében használjon inkább jelszót"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"A nagyobb biztonság érdekében PIN-kód szükséges"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"A nagyobb biztonság érdekében minta szükséges"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"A nagyobb biztonság érdekében jelszó szükséges"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"A rendszergazda zárolta az eszközt"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Az eszközt manuálisan lezárták"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nem ismerhető fel"</string>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index 28344c9..4a375e2 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Լրացուցիչ անվտանգության համար օգտագործեք նախշ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Լրացուցիչ անվտանգության համար օգտագործեք PIN կոդ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Լրացուցիչ անվտանգության համար օգտագործեք գաղտնաբառ"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Անվտանգության նկատառումներից ելնելով անհրաժեշտ է մուտքագրել PIN կոդը"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Անվտանգության նկատառումներից ելնելով անհրաժեշտ է մուտքագրել նախշը"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Անվտանգության նկատառումներից ելնելով անհրաժեշտ է մուտքագրել գաղտնաբառը"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Սարքը կողպված է ադմինիստրատորի կողմից"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Սարքը կողպվել է ձեռքով"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Չհաջողվեց ճանաչել"</string>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index 2a8d8a9..dc5b0b8 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Untuk keamanan tambahan, gunakan pola"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Untuk keamanan tambahan, gunakan PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Untuk keamanan tambahan, gunakan sandi"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN diperlukan untuk keamanan tambahan"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Pola diperlukan untuk keamanan tambahan"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Sandi diperlukan untuk keamanan tambahan"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Perangkat dikunci oleh admin"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Perangkat dikunci secara manual"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tidak dikenali"</string>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index 0c14e6c..20808db 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Fyrir aukið öryggi skaltu nota mynstur í staðinn"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Fyrir aukið öryggi skaltu nota PIN-númer í staðinn"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Fyrir aukið öryggi skaltu nota aðgangsorð í staðinn"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN-númers er krafist af öryggisástæðum"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Mynsturs er krafist af öryggisástæðum"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Aðgangsorðs er krafist af öryggisástæðum"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Kerfisstjóri læsti tæki"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Tækinu var læst handvirkt"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Þekktist ekki"</string>
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index 2c2bacc..722d43d 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Per maggior sicurezza, usa invece la sequenza"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Per maggior sicurezza, usa invece il PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Per maggior sicurezza, usa invece la password"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN obbligatorio per maggiore sicurezza"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Sequenza obbligatoria per maggiore sicurezza"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Password obbligatoria per maggiore sicurezza"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloccato dall\'amministratore"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Il dispositivo è stato bloccato manualmente"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non riconosciuto"</string>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index 6e54ba9..71a60a8 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"כדי להגביר את רמת האבטחה, כדאי להשתמש בקו ביטול נעילה במקום זאת"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"כדי להגביר את רמת האבטחה, כדאי להשתמש בקוד אימות במקום זאת"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"כדי להגביר את רמת האבטחה, כדאי להשתמש בסיסמה במקום זאת"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"נדרש קוד אימות כדי לשפר את רמת האבטחה"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"נדרש קו ביטול נעילה כדי לשפר את רמת האבטחה"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"נדרשת סיסמה כדי לשפר את רמת האבטחה"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"המנהל של המכשיר נהל אותו"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"המכשיר ננעל באופן ידני"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"לא זוהתה"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index db99d96..562726f 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"დამატებითი უსაფრთხოებისთვის გამოიყენეთ ნიმუში"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"დამატებითი უსაფრთხოებისთვის გამოიყენეთ PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"დამატებითი უსაფრთხოებისთვის გამოიყენეთ პაროლი"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"დამატებითი უსაფრთხოებისთვის საჭიროა PIN-კოდის შეყვანა"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"დამატებითი უსაფრთხოებისთვის საჭიროა ნიმუშის შეყვანა"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"დამატებითი უსაფრთხოებისთვის საჭიროა პაროლის შეყვანა"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"მოწყობილობა ჩაკეტილია ადმინისტრატორის მიერ"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"მოწყობილობა ხელით ჩაიკეტა"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"არ არის ამოცნობილი"</string>
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index 7bf93ae..103f8ad 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Қосымша қауіпсіздік үшін өрнекті пайдаланыңыз."</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Қосымша қауіпсіздік үшін PIN кодын пайдаланыңыз."</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Қосымша қауіпсіздік үшін құпия сөзді пайдаланыңыз."</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Қосымша қауіпсіздік шарасы ретінде PIN кодын енгізу қажет."</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Қосымша қауіпсіздік шарасы ретінде өрнекті енгізу қажет."</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Қосымша қауіпсіздік шарасы ретінде құпия сөзді енгізу қажет."</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Құрылғыны әкімші құлыптаған"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Құрылғы қолмен құлыпталды"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Танылмады"</string>
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index b326f4c..b816748 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ដើម្បីសុវត្ថិភាពបន្ថែម សូមប្រើលំនាំជំនួសវិញ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ដើម្បីសុវត្ថិភាពបន្ថែម សូមប្រើកូដ PIN ជំនួសវិញ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ដើម្បីសុវត្ថិភាពបន្ថែម សូមប្រើពាក្យសម្ងាត់ជំនួសវិញ"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"តម្រូវឱ្យបញ្ចូលកូដ PIN ដើម្បីទទួលបានសុវត្ថិភាពបន្ថែម"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"តម្រូវឱ្យប្រើលំនាំ ដើម្បីទទួលបានសុវត្ថិភាពបន្ថែម"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"តម្រូវឱ្យបញ្ចូលពាក្យសម្ងាត់ ដើម្បីទទួលបានសុវត្ថិភាពបន្ថែម"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ឧបករណ៍​ត្រូវបាន​ចាក់សោ​ដោយអ្នក​គ្រប់គ្រង"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ឧបករណ៍ត្រូវបានចាក់សោដោយអ្នកប្រើផ្ទាល់"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"មិនអាចសម្គាល់បានទេ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index 10bd9bf5..7560621 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ, ಬದಲಿಗೆ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಬಳಸಿ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ, ಬದಲಿಗೆ ಪಿನ್ ಬಳಸಿ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ, ಬದಲಿಗೆ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ ಪಿನ್ ಅಗತ್ಯವಿದೆ"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ ಪ್ಯಾಟರ್ನ್ ಅಗತ್ಯವಿದೆ"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ನಿರ್ವಾಹಕರು ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಿದ್ದಾರೆ"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ಸಾಧನವನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಲಾಕ್‌ ಮಾಡಲಾಗಿದೆ"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index 6304539..8d86a8d 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"보안 강화를 위해 대신 패턴 사용"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"보안 강화를 위해 대신 PIN 사용"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"보안 강화를 위해 대신 비밀번호 사용"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"보안 강화를 위해 PIN이 필요합니다."</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"보안 강화를 위해 패턴이 필요합니다."</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"보안 강화를 위해 비밀번호가 필요합니다."</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"관리자가 기기를 잠갔습니다."</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"기기가 수동으로 잠금 설정되었습니다."</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"인식할 수 없음"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index 8575d60..6bfbd64 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Кошумча коопсуздук үчүн анын ордуна графикалык ачкычты колдонуңуз"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Кошумча коопсуздук үчүн анын ордуна PIN кодду колдонуңуз"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Кошумча коопсуздук үчүн анын ордуна сырсөздү колдонуңуз"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Коопсуздукту бекемдөө үчүн PIN код талап кылынат"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Коопсуздукту бекемдөө үчүн графикалык ачкыч талап кылынат"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Коопсуздукту бекемдөө үчүн сырсөз талап кылынат"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Түзмөктү администратор кулпулап койгон"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Түзмөк кол менен кулпуланды"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Таанылган жок"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index 984cc56..d567794 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ, ໃຫ້ໃຊ້ຮູບແບບແທນ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ, ໃຫ້ໃຊ້ PIN ແທນ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ, ໃຫ້ໃຊ້ລະຫັດຜ່ານແທນ"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"ຈຳເປັນຕ້ອງມີ PIN ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"ຈຳເປັນຕ້ອງມີແບບຮູບເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"ຈຳເປັນຕ້ອງມີລະຫັດຜ່ານເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ອຸປະກອນຖືກລັອກໂດຍຜູ້ເບິ່ງແຍງລະບົບ"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ອຸປະກອນຖືກສັ່ງໃຫ້ລັອກ"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"ບໍ່ຮູ້ຈັກ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index 96dc266..0cf3294 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Papildomai saugai užtikrinti geriau naudokite atrakinimo piešinį"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Papildomai saugai užtikrinti geriau naudokite PIN kodą"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Papildomai saugai užtikrinti geriau naudokite slaptažodį"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Norint užtikrinti papildomą saugą būtinas PIN kodas"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Norint užtikrinti papildomą saugą būtinas atrakinimo piešinys"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Norint užtikrinti papildomą saugą būtinas slaptažodis"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Įrenginį užrakino administratorius"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Įrenginys užrakintas neautomatiškai"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Neatpažinta"</string>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index 9ca5c6e..da1f62c 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Papildu drošībai izmantojiet kombināciju"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Papildu drošībai izmantojiet PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Papildu drošībai izmantojiet paroli"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Papildu drošībai ir jāievada PIN kods"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Papildu drošībai ir jāievada atbloķēšanas kombinācija"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Papildu drošībai ir jāievada parole"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrators bloķēja ierīci."</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Ierīce tika bloķēta manuāli."</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nav atpazīts"</string>
diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml
index 421637f..3e110b5 100644
--- a/packages/SystemUI/res-keyguard/values-mk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"За дополнителна безбедност, користете шема"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"За дополнителна безбедност, користете PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"За дополнителна безбедност, користете лозинка"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Потребен е PIN за дополнителна безбедност"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Потребна е шема за дополнителна безбедност"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Потребна е лозинка за дополнителна безбедност"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Уредот е заклучен од администраторот"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Уредот е заклучен рачно"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Непознат"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index 9bb1c60..2861d7c 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"അധിക സുരക്ഷയ്ക്കായി, പകരം പാറ്റേൺ ഉപയോഗിക്കുക"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"അധിക സുരക്ഷയ്ക്കായി, പകരം പിൻ ഉപയോഗിക്കുക"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"അധിക സുരക്ഷയ്ക്കായി, പകരം പാസ്‍വേഡ് ഉപയോഗിക്കുക"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"അധിക സുരക്ഷയ്ക്ക് പിൻ ആവശ്യമാണ്"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"അധിക സുരക്ഷയ്ക്ക് പാറ്റേൺ ആവശ്യമാണ്"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"അധിക സുരക്ഷയ്ക്ക് പാസ്‌വേഡ് ആവശ്യമാണ്"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ഉപകരണം അഡ്‌മിൻ ലോക്കുചെയ്തു"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ഉപകരണം നേരിട്ട് ലോക്കുചെയ്തു"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"തിരിച്ചറിയുന്നില്ല"</string>
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 443e028..83ce698 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Нэмэлт аюулгүй байдлын үүднээс оронд нь хээ ашиглана уу"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Нэмэлт аюулгүй байдлын үүднээс оронд нь ПИН ашиглана уу"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Нэмэлт аюулгүй байдлын үүднээс оронд нь нууц үг ашиглана уу"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Нэмэлт аюулгүй байдлын үүднээс ПИН шаардлагатай"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Нэмэлт аюулгүй байдлын үүднээс хээ шаардлагатай"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Нэмэлт аюулгүй байдлын үүднээс нууц үг шаардлагатай"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Админ төхөөрөмжийг түгжсэн"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Төхөөрөмжийг гараар түгжсэн"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Таньж чадсангүй"</string>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index 8b23abe8..3f65cdb 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"अतिरिक्त सुरक्षेसाठी, त्याऐवजी पॅटर्न वापरा"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"अतिरिक्त सुरक्षेसाठी, त्याऐवजी पिन वापरा"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"अतिरिक्त सुरक्षेसाठी, त्याऐवजी पासवर्ड वापरा"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"अतिरिक्त सुरक्षेसाठी पिन आवश्‍यक आहे"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"अतिरिक्त सुरक्षेसाठी पॅटर्न आवश्‍यक आहे"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"अतिरिक्त सुरक्षेसाठी पासवर्ड आवश्‍यक आहे"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"प्रशासकाद्वारे लॉक केलेले डिव्हाइस"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"डिव्हाइस मॅन्युअली लॉक केले होते"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"ओळखले नाही"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index 3291bd4..ecf843d 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Untuk keselamatan tambahan, gunakan corak"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Untuk keselamatan tambahan, gunakan PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Untuk keselamatan tambahan, gunakan kata laluan"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN diperlukan untuk keselamatan tambahan"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Corak diperlukan untuk keselamatan tambahan"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Kata laluan diperlukan untuk keselamatan tambahan"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Peranti dikunci oleh pentadbir"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Peranti telah dikunci secara manual"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tidak dikenali"</string>
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index 9d83323..95d638e 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ထပ်ဆောင်းလုံခြုံရေးအတွက် ၎င်းအစား ပုံစံသုံးပါ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ထပ်ဆောင်းလုံခြုံရေးအတွက် ၎င်းအစား ပင်နံပါတ်သုံးပါ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ထပ်ဆောင်းလုံခြုံရေးအတွက် ၎င်းအစား စကားဝှက်သုံးပါ"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"ထပ်ဆောင်း လုံခြုံရေးအတွက် ပင်နံပါတ် လိုအပ်သည်"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"ထပ်ဆောင်း လုံခြုံရေးအတွက် ပုံဖော်ခြင်း လိုအပ်သည်"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"ထပ်ဆောင်း လုံခြုံရေးအတွက် စကားဝှက် လိုအပ်သည်"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"စက်ပစ္စည်းကို စီမံခန့်ခွဲသူက လော့ခ်ချထားပါသည်"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"စက်ပစ္စည်းကို ကိုယ်တိုင်ကိုယ်ကျ လော့ခ်ချထားခဲ့သည်"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"မသိ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index 1aefaa9..b6aa09d 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Bruk mønster i stedet, for å øke sikkerheten"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Bruk PIN-kode i stedet, for å øke sikkerheten"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Bruk passord i stedet, for å øke sikkerheten"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Du må skrive inn PIN-koden for ekstra sikkerhet"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Du må tegne mønsteret for ekstra sikkerhet"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Du må skrive inn passordet for ekstra sikkerhet"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Enheten er låst av administratoren"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheten ble låst manuelt"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ikke gjenkjent"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index 16d23ef..219072b 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"अतिरिक्त सुरक्षाका लागि यो प्रमाणीकरण विधिको साटो प्याटर्न प्रयोग गर्नुहोस्"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"अतिरिक्त सुरक्षाका लागि यो प्रमाणीकरण विधिको साटो पिन प्रयोग गर्नुहोस्"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"अतिरिक्त सुरक्षाका लागि यो प्रमाणीकरण विधिको साटो पासवर्ड प्रयोग गर्नुहोस्"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"अतिरिक्त सुरक्षाका लागि PIN चाहिन्छ"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"अतिरिक्त सुरक्षाका लागि प्याटर्न चाहिन्छ"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"अतिरिक्त सुरक्षाका लागि पासवर्ड चाहिन्छ"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"प्रशासकले यन्त्रलाई लक गर्नुभएको छ"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"यन्त्रलाई म्यानुअल तरिकाले लक गरिएको थियो"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"पहिचान भएन"</string>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index 77b5b57..0206403 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -21,10 +21,10 @@
 <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">"Geef je pincode op"</string>
-    <string name="keyguard_enter_pin" msgid="8114529922480276834">"Geef de pincode op"</string>
+    <string name="keyguard_enter_pin" msgid="8114529922480276834">"Voer pincode in"</string>
     <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Geef je patroon op"</string>
     <string name="keyguard_enter_pattern" msgid="7616595160901084119">"Teken het patroon"</string>
-    <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Geef je wachtwoord op"</string>
+    <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Voer je wachtwoord in"</string>
     <string name="keyguard_enter_password" msgid="6483623792371009758">"Geef het wachtwoord op"</string>
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ongeldige kaart."</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"Opgeladen"</string>
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Gebruik in plaats daarvan het patroon voor extra beveiliging"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Gebruik de pincode voor extra beveiliging"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Gebruik in plaats daarvan het wachtwoord voor extra beveiliging"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Pincode vereist voor extra beveiliging"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Patroon vereist voor extra beveiliging"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Wachtwoord vereist voor extra beveiliging"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Apparaat vergrendeld door beheerder"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Apparaat is handmatig vergrendeld"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Niet herkend"</string>
diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml
index 73ed727..bb3da3a 100644
--- a/packages/SystemUI/res-keyguard/values-or/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-or/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ଏହା ପରିବର୍ତ୍ତେ ପାଟର୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ଏହା ପରିବର୍ତ୍ତେ PIN ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ଏହା ପରିବର୍ତ୍ତେ ପାସୱାର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ PIN ଆବଶ୍ୟକ ଅଟେ"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ ପାଟର୍ନ ଆବଶ୍ୟକ"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ ପାସ୍‌ୱର୍ଡ ଆବଶ୍ୟକ"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ଡିଭାଇସ୍‍ ଆଡମିନଙ୍କ ଦ୍ୱାରା ଲକ୍‍ କରାଯାଇଛି"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ଡିଭାଇସ୍‍ ମାନୁଆଲ ଭାବେ ଲକ୍‍ କରାଗଲା"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index 2e4d190..f0d9596 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ, ਇਸਦੀ ਬਜਾਏ ਪੈਟਰਨ ਵਰਤੋ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ, ਇਸਦੀ ਬਜਾਏ ਪਿੰਨ ਵਰਤੋ"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ, ਇਸਦੀ ਬਜਾਏ ਪਾਸਵਰਡ ਵਰਤੋ"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ ਪਿੰਨ ਦੀ ਲੋੜ ਹੈ"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ ਪੈਟਰਨ ਦੀ ਲੋੜ ਹੈ"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੈ"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਡੀਵਾਈਸ ਨੂੰ ਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ਡੀਵਾਈਸ ਨੂੰ ਹੱਥੀਂ ਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index 92cee60..e04cef1 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para ter mais segurança, use o padrão"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para ter mais segurança, use o PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para ter mais segurança, use a senha"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"O PIN é necessário para aumentar a segurança"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"O padrão é necessário para aumentar a segurança"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"A senha é necessária para aumentar a segurança"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo administrador"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index cc5ccd8..1ae1aeb 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para uma segurança adicional, use antes o padrão"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para uma segurança adicional, use antes o PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para uma segurança adicional, use antes a palavra-passe"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Para segurança adicional, é necessária um PIN"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Para segurança adicional, é necessário um padrão"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Para segurança adicional, é necessária uma palavra-passe"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo gestor"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido."</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index 92cee60..e04cef1 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para ter mais segurança, use o padrão"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para ter mais segurança, use o PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para ter mais segurança, use a senha"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"O PIN é necessário para aumentar a segurança"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"O padrão é necessário para aumentar a segurança"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"A senha é necessária para aumentar a segurança"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo administrador"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml
index 7d07480..bc74e0a 100644
--- a/packages/SystemUI/res-keyguard/values-ro/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Pentru mai multă securitate, folosește modelul"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Pentru mai multă securitate, folosește codul PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Pentru mai multă securitate, folosește parola"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Codul PIN este necesar pentru securitate suplimentară"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Modelul este necesar pentru securitate suplimentară"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Parola este necesară pentru securitate suplimentară"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispozitiv blocat de administrator"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Dispozitivul a fost blocat manual"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nu este recunoscut"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index d91cf97..aa2d080 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"В целях дополнительной безопасности используйте графический ключ"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"В целях дополнительной безопасности используйте PIN-код"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"В целях дополнительной безопасности используйте пароль"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"В целях безопасности введите PIN-код."</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"В целях безопасности введите графический ключ."</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"В целях безопасности введите пароль."</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Устройство заблокировано администратором"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Устройство было заблокировано вручную"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Не распознано"</string>
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index a9fc70a..343902a 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"අතිරේක ආරක්ෂාව සඳහා, ඒ වෙනුවට රටාව භාවිතා කරන්න"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"අතිරේක ආරක්ෂාව සඳහා, ඒ වෙනුවට PIN භාවිතා කරන්න"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"අතිරේක ආරක්ෂාව සඳහා, ඒ වෙනුවට මුරපදය භාවිතා කරන්න"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"අමතර ආරක්ෂාව සඳහා PIN අංකය අවශ්‍යයි"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"අමතර ආරක්ෂාව සඳහා රටාව අවශ්‍යයි"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"අමතර ආරක්ෂාව සඳහා මුරපදය අවශ්‍යයි"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ඔබගේ පරිපාලක විසින් උපාංගය අගුළු දමා ඇත"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"උපාංගය හස්තීයව අගුලු දමන ලදී"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"හඳුනා නොගන්නා ලදී"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index e1b83ee..5725fe0 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"V rámci zvýšenia zabezpečenia použite radšej vzor"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"V rámci zvýšenia zabezpečenia použite radšej PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"V rámci zvýšenia zabezpečenia použite radšej heslo"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Zvýšenie zabezpečenia vyžaduje kód PIN"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Zvýšenie zabezpečenia vyžaduje vzor"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Zvýšenie zabezpečenia vyžaduje heslo"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Zariadenie zamkol správca"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Zariadenie bolo uzamknuté ručne"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nerozpoznané"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index 383153b..c761799 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Za dodatno varnost raje uporabite vzorec."</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Za dodatno varnost raje uporabite kodo PIN."</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Za dodatno varnost raje uporabite geslo."</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Zaradi dodatne varnosti morate vnesti kodo PIN"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Zaradi dodatne varnosti morate vnesti vzorec"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Zaradi dodatne varnosti morate vnesti geslo"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Napravo je zaklenil skrbnik"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Naprava je bila ročno zaklenjena"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ni prepoznano"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index 9f291f3..be1d4aa 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Për më shumë siguri, përdor motivin më mirë"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Për më shumë siguri, përdor kodin PIN më mirë"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Për më shumë siguri, përdor fjalëkalimin më mirë"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Kërkohet kodi PIN për më shumë siguri"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Kërkohet motivi për më shumë siguri"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Kërkohet fjalëkalimi për më shumë siguri"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Pajisja është e kyçur nga administratori"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Pajisja është kyçur manualisht"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nuk njihet"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index 404ff9d..34c9311 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"За додатну безбедност користите шаблон"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"За додатну безбедност користите PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"За додатну безбедност користите лозинку"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Треба да унесете PIN ради додатне безбедности"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Треба да унесете шаблон ради додатне безбедности"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Треба да унесете лозинку ради додатне безбедности"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Администратор је закључао уређај"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Уређај је ручно закључан"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Није препознат"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index b891de7..3a89ff5 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"För ytterligare säkerhet använder du mönstret i stället"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"För ytterligare säkerhet använder du pinkoden i stället"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"För ytterligare säkerhet använder du lösenordet i stället"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Du måste ange en pinkod för ytterligare säkerhet"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Du måste ange ett mönster för ytterligare säkerhet"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Du måste ange ett lösenord för ytterligare säkerhet"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administratören har låst enheten"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheten har låsts manuellt"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Identifierades inte"</string>
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index 7dd3180..20080a3 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Kwa usalama wa ziada, tumia mchoro badala yake"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Kwa usalama wa ziada, tumia PIN badala yake"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Kwa usalama wa ziada, tumia nenosiri badala yake"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN inahitajika ili kuongeza usalama"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Mchoro unahitajika ili kuongeza usalama"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Nenosiri linahitajika ili kuongeza usalama"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Msimamizi amefunga kifaa"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Umefunga kifaa mwenyewe"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Haitambuliwi"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index 14969d5..60f60c4 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"கூடுதல் பாதுகாப்பிற்குப் பேட்டர்னைப் பயன்படுத்தவும்"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"கூடுதல் பாதுகாப்பிற்குப் பின்னை (PIN) பயன்படுத்தவும்"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"கூடுதல் பாதுகாப்பிற்குக் கடவுச்சொல்லைப் பயன்படுத்தவும்"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"கூடுதல் பாதுகாப்பிற்குப் பின் தேவை"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"கூடுதல் பாதுகாப்பிற்குப் பேட்டர்ன் தேவை"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"கூடுதல் பாதுகாப்பிற்குக் கடவுச்சொல் தேவை"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"நிர்வாகி சாதனத்தைப் பூட்டியுள்ளார்"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"பயனர் சாதனத்தைப் பூட்டியுள்ளார்"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"அடையாளங்காணபடவில்லை"</string>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index a117a5c..0a6476fc 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"అదనపు సెక్యూరిటీ కోసం, బదులుగా ఆకృతిని ఉపయోగించండి"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"అదనపు సెక్యూరిటీ కోసం, బదులుగా PINను ఉపయోగించండి"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"అదనపు సెక్యూరిటీ కోసం, బదులుగా పాస్‌వర్డ్‌ను ఉపయోగించండి"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"అదనపు సెక్యూరిటీ కోసం PIN ఎంటర్ చేయాలి"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"అదనపు సెక్యూరిటీ కోసం ఆకృతి అవసరం"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"అదనపు సెక్యూరిటీ కోసం పాస్‌వర్డ్‌ను ఎంటర్ చేయాలి"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"పరికరం నిర్వాహకుల ద్వారా లాక్ చేయబడింది"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"పరికరం మాన్యువల్‌గా లాక్ చేయబడింది"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"గుర్తించలేదు"</string>
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index d9f8d99..96b3a46 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ใช้รูปแบบแทนเพื่อเพิ่มความปลอดภัย"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ใช้ PIN แทนเพื่อเพิ่มความปลอดภัย"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ใช้รหัสผ่านแทนเพื่อเพิ่มความปลอดภัย"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"ต้องระบุ PIN เพื่อเป็นการรักษาความปลอดภัยเพิ่มเติม"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"ต้องใช้รูปแบบเพื่อเป็นการรักษาความปลอดภัยเพิ่มเติม"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"ต้องป้อนรหัสผ่านเพื่อเป็นการรักษาความปลอดภัยเพิ่มเติม"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ผู้ดูแลระบบล็อกอุปกรณ์"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"มีการล็อกอุปกรณ์ด้วยตัวเอง"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"ไม่รู้จักลายนิ้วมือ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index e23d036..84c32ee 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Ek güvenlik için bunun yerine desen kullanın"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Ek güvenlik için bunun yerine PIN kullanın"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Ek güvenlik için bunun yerine şifre kullanın"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Ek güvenlik için PIN gerekir"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Ek güvenlik için desen gerekir"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Ek güvenlik için şifre gerekir"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Cihaz, yönetici tarafından kilitlendi"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Cihazın manuel olarak kilitlendi"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tanınmadı"</string>
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index d519601..6e8c11f 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"З міркувань додаткової безпеки скористайтеся ключем"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"З міркувань додаткової безпеки скористайтеся PIN-кодом"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"З міркувань додаткової безпеки скористайтеся паролем"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Для додаткового захисту потрібно ввести PIN-код"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Для додаткового захисту потрібно ввести ключ"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Для додаткового захисту потрібно ввести пароль"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Адміністратор заблокував пристрій"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Пристрій заблоковано вручну"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Не розпізнано"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index 27d422f..fa2a234 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"اضافی سیکیورٹی کے لئے، اس کے بجائے پیٹرن استعمال کریں"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"‏اضافی سیکیورٹی کے لئے، اس کے بجائے PIN استعمال کریں"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"اضافی سیکیورٹی کے لئے، اس کے بجائے پاس ورڈ استعمال کریں"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"‏اضافی سیکیورٹی کیلئے PIN درکار ہے"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"اضافی سیکیورٹی کیلئے پیٹرن درکار ہے"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"اضافی سیکیورٹی کیلئے پاس ورڈ درکار ہے"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"آلہ منتظم کی جانب سے مقفل ہے"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"آلہ کو دستی طور پر مقفل کیا گیا تھا"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"تسلیم شدہ نہیں ہے"</string>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index c34619f..85eb52f 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Qoʻshimcha xavfsizlik maqsadida oʻrniga grafik kalitdan foydalaning"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Qoʻshimcha xavfsizlik maqsadida oʻrniga PIN koddan foydalaning"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Qoʻshimcha xavfsizlik maqsadida oʻrniga paroldan foydalaning"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Qoʻshimcha xavfsizlik chorasi sifatida PIN kod talab qilinadi"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Qoʻshimcha xavfsizlik chorasi sifatida grafik kalit talab qilinadi"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Qoʻshimcha xavfsizlik chorasi sifatida parol talab qilinadi"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Qurilma administrator tomonidan bloklangan"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Qurilma qo‘lda qulflangan"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Aniqlanmadi"</string>
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index 52b71a7..bbd319c3 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Để tăng cường bảo mật, hãy sử dụng hình mở khoá"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Để tăng cường bảo mật, hãy sử dụng mã PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Để tăng cường bảo mật, hãy sử dụng mật khẩu"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Yêu cầu mã PIN để tăng cường bảo mật"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Yêu cầu hình mở khoá để tăng cường bảo mật"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Yêu cầu mật khẩu để tăng cường bảo mật"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Thiết bị đã bị quản trị viên khóa"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Thiết bị đã bị khóa theo cách thủ công"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Không nhận dạng được"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index 70a9117..a316e8c 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"为增强安全性,请改用图案"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"为增强安全性,请改用 PIN 码"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"为增强安全性,请改用密码"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"需要输入 PIN 码以进一步确保安全"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"需要绘制解锁图案以进一步确保安全"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"需要输入密码以进一步确保安全"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"管理员已锁定设备"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"此设备已手动锁定"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"无法识别"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index d1e70f4..abef8df 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"為提升安全性,請改用圖案"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"為提升安全性,請改用 PIN"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"為提升安全性,請改用密碼"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"請務必輸入 PIN,以進一步確保安全"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"請務必畫出上鎖圖案,以進一步確保安全"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"請務必輸入密碼,以進一步確保安全"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"裝置已由管理員鎖定"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"使用者已手動將裝置上鎖"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"未能識別"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index bd223d6..bc047be 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -24,7 +24,7 @@
     <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>
-    <string name="keyguard_enter_your_password" msgid="7225626204122735501">"輸入密碼"</string>
+    <string name="keyguard_enter_your_password" msgid="7225626204122735501">"請輸入密碼"</string>
     <string name="keyguard_enter_password" msgid="6483623792371009758">"輸入密碼"</string>
     <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"卡片無效。"</string>
     <string name="keyguard_charged" msgid="5478247181205188995">"充電完成"</string>
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"為強化安全性,請改用解鎖圖案"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"為強化安全性,請改用 PIN 碼"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"為強化安全性,請改用密碼"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"請輸入 PIN 碼,加強安全防護"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"請畫出解鎖圖案,加強安全防護"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"請輸入密碼,加強安全防護"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"管理員已鎖定裝置"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"裝置已手動鎖定"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"無法識別"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index ccc1606..e4c3cbf 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -111,12 +111,9 @@
     <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Ukuze uthole ukuvikeleka okwengeziwe, sebenzisa iphetheni esikhundleni salokho"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Ukuze uthole ukuvikeleka okwengeziwe, sebenzisa i-PIN esikhundleni salokho"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Ukuze uthole ukuvikeleka okwengeziwe, sebenzisa iphasiwedi esikhundleni salokho"</string>
-    <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) -->
-    <skip />
-    <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) -->
-    <skip />
+    <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Kudingeka iphinikhodi ngokuvikeleka okwengeziwe"</string>
+    <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Kudingeka iphethini ngokuvikeleka okwengeziwe"</string>
+    <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Iphasiwedi idingelwa ukuvikeleka okwengeziwe"</string>
     <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Idivayisi ikhiywe ngumlawuli"</string>
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Idivayisi ikhiywe ngokwenza"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Akwaziwa"</string>
diff --git a/packages/SystemUI/res-product/values-ja/strings.xml b/packages/SystemUI/res-product/values-ja/strings.xml
index 1fc8775..9d054c9 100644
--- a/packages/SystemUI/res-product/values-ja/strings.xml
+++ b/packages/SystemUI/res-product/values-ja/strings.xml
@@ -46,9 +46,9 @@
     <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"お使いのスマートフォンは現在、正常に動作しています。\nタップして詳細を表示"</string>
     <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"お使いのデバイスは現在、正常に動作しています。\nタップして詳細を表示"</string>
     <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"お使いのタブレットは現在、正常に動作しています。\nタップして詳細を表示"</string>
-    <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"スマートフォンが熱くなりすぎたため電源が OFF になりました。現在は正常に動作しています。\n\nスマートフォンは以下の場合に熱くなる場合があります。\n	• リソースを集中的に使用する機能やアプリ(ゲームアプリ、動画アプリ、ナビアプリなど)を使用\n	• サイズの大きいファイルをダウンロードまたはアップロード\n	• 高温の場所で使用"</string>
-    <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"デバイスが熱くなりすぎたため電源が OFF になりました。現在は正常に動作しています。\n\nデバイスは以下の場合に熱くなる場合があります。\n	• リソースを集中的に使用する機能やアプリ(ゲームアプリ、動画アプリ、ナビアプリなど)を使用\n	• サイズの大きいファイルをダウンロードまたはアップロード\n	• 高温の場所で使用"</string>
-    <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"タブレットが熱くなりすぎたため電源が OFF になりました。現在は正常に動作しています。\n\nタブレットは以下の場合に熱くなる場合があります。\n	• リソースを集中的に使用する機能やアプリ(ゲームアプリ、動画アプリ、ナビアプリなど)を使用\n	• サイズの大きいファイルをダウンロードまたはアップロード\n	• 高温の場所で使用"</string>
+    <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"スマートフォンの温度上昇により電源が OFF になりました。現在は正常に動作しています。\n\nスマートフォンは以下の場合に熱くなる場合があります。\n	• リソースを集中的に使用する機能やアプリ(ゲームアプリ、動画アプリ、ナビアプリなど)を使用\n	• サイズの大きいファイルをダウンロードまたはアップロード\n	• 高温の場所で使用"</string>
+    <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"デバイスの温度上昇により電源が OFF になりました。現在は正常に動作しています。\n\nデバイスは以下の場合に熱くなる場合があります。\n	• リソースを集中的に使用する機能やアプリ(ゲームアプリ、動画アプリ、ナビアプリなど)を使用\n	• サイズの大きいファイルをダウンロードまたはアップロード\n	• 高温の場所で使用"</string>
+    <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"タブレットの温度上昇により電源が OFF になりました。現在は正常に動作しています。\n\nタブレットは以下の場合に熱くなる場合があります。\n	• リソースを集中的に使用する機能やアプリ(ゲームアプリ、動画アプリ、ナビアプリなど)を使用\n	• サイズの大きいファイルをダウンロードまたはアップロード\n	• 高温の場所で使用"</string>
     <string name="high_temp_title" product="default" msgid="5365000411304924115">"スマートフォンの温度が上昇中"</string>
     <string name="high_temp_title" product="device" msgid="6622009907401563664">"デバイスの温度が上昇中"</string>
     <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"タブレットの温度が上昇中"</string>
diff --git a/packages/SystemUI/res/anim/slide_in_up.xml b/packages/SystemUI/res/anim/slide_in_up.xml
new file mode 100644
index 0000000..6089a28
--- /dev/null
+++ b/packages/SystemUI/res/anim/slide_in_up.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.
+-->
+
+<translate
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:fromYDelta="100%p"
+    android:toYDelta="0"
+    android:duration="@android:integer/config_shortAnimTime" />
diff --git a/packages/SystemUI/res/anim/slide_out_down.xml b/packages/SystemUI/res/anim/slide_out_down.xml
new file mode 100644
index 0000000..5a7b591
--- /dev/null
+++ b/packages/SystemUI/res/anim/slide_out_down.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.
+-->
+
+<translate
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:fromYDelta="0"
+    android:toYDelta="100%p"
+    android:duration="@android:integer/config_shortAnimTime" />
diff --git a/packages/SystemUI/res/color/menu_item_text.xml b/packages/SystemUI/res/color/menu_item_text.xml
new file mode 100644
index 0000000..0d05650
--- /dev/null
+++ b/packages/SystemUI/res/color/menu_item_text.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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+
+    <item android:state_enabled="false"
+          android:color="?androidprv:attr/materialColorOnSurface"
+          android:alpha="0.38" />
+
+    <item android:color="?androidprv:attr/materialColorOnSurface"/>
+</selector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/accessibility_fullscreen_magnification_border_background.xml b/packages/SystemUI/res/drawable/accessibility_fullscreen_magnification_border_background.xml
new file mode 100644
index 0000000..edfbe7b
--- /dev/null
+++ b/packages/SystemUI/res/drawable/accessibility_fullscreen_magnification_border_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.
+  -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:radius="@*android:dimen/rounded_corner_radius" />
+    <!-- Since the device corners are not perfectly rounded, we create the stroke with offset
+         to fill up the space between border and device corner -->
+    <stroke
+        android:color="@color/magnification_border_color"
+        android:width="@dimen/magnifier_border_width_fullscreen_with_offset"/>
+</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.xml b/packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.xml
new file mode 100644
index 0000000..fdafe6d
--- /dev/null
+++ b/packages/SystemUI/res/drawable/biometric_prompt_vertical_list_content_view_background.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.
+  -->
+
+<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/materialColorSurfaceContainerHigh"/>
+    <corners android:radius="@dimen/biometric_prompt_content_corner_radius"/>
+</shape>
diff --git a/packages/SystemUI/res/drawable/ic_bugreport.xml b/packages/SystemUI/res/drawable/ic_bugreport.xml
new file mode 100644
index 0000000..ed1c6c7
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_bugreport.xml
@@ -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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24.0dp"
+    android:height="24.0dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0"
+    android:tint="?attr/colorControlNormal">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M20,10V8h-2.81c-0.45,-0.78 -1.07,-1.46 -1.82,-1.96L17,4.41L15.59,3l-2.17,2.17c-0.03,-0.01 -0.05,-0.01 -0.08,-0.01c-0.16,-0.04 -0.32,-0.06 -0.49,-0.09c-0.06,-0.01 -0.11,-0.02 -0.17,-0.03C12.46,5.02 12.23,5 12,5h0c-0.49,0 -0.97,0.07 -1.42,0.18l0.02,-0.01L8.41,3L7,4.41l1.62,1.63l0.01,0C7.88,6.54 7.26,7.22 6.81,8H4v2h2.09C6.03,10.33 6,10.66 6,11v1H4v2h2v1c0,0.34 0.04,0.67 0.09,1H4v2h2.81c1.04,1.79 2.97,3 5.19,3h0c2.22,0 4.15,-1.21 5.19,-3H20v-2h-2.09l0,0c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1l0,0H20zM16,15c0,2.21 -1.79,4 -4,4c-2.21,0 -4,-1.79 -4,-4v-4c0,-2.21 1.79,-4 4,-4h0c2.21,0 4,1.79 4,4V15z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M10,14h4v2h-4z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M10,10h4v2h-4z"/>
+</vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/ic_finder_active.xml b/packages/SystemUI/res/drawable/ic_finder_active.xml
index 8ca221a..2423e34 100644
--- a/packages/SystemUI/res/drawable/ic_finder_active.xml
+++ b/packages/SystemUI/res/drawable/ic_finder_active.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     android:width="24dp"
     android:height="24dp"
     android:viewportWidth="24"
@@ -10,5 +11,6 @@
   <path
       android:pathData="M12.797,4.005C11.949,3.936 11.203,4.597 11.203,5.467V6.659C8.855,7.001 6.998,8.856 6.653,11.203H5.467C4.597,11.203 3.936,11.948 4.005,12.796L4.006,12.802L4.006,12.809C4.38,16.605 7.399,19.625 11.195,20C12.051,20.087 12.803,19.404 12.803,18.547V17.355C15.154,17.012 17.013,15.154 17.355,12.803H18.54C19.406,12.803 20.079,12.058 19.992,11.196C19.618,7.4 16.606,4.388 12.812,4.006L12.804,4.006L12.797,4.005ZM11.203,9.344V8.283C9.741,8.591 8.588,9.741 8.278,11.203H9.344C9.585,10.4 10.179,9.754 10.942,9.437C11.027,9.402 11.114,9.371 11.203,9.344ZM11.998,13.171C11.358,13.175 10.828,12.651 10.827,12.004H10.827C10.827,11.959 10.83,11.915 10.835,11.871C10.885,11.427 11.185,11.056 11.59,10.902C11.694,10.863 11.806,10.838 11.921,10.83C11.948,10.833 11.976,10.834 12.003,10.834C12.65,10.834 13.177,11.356 13.179,12.007C13.177,12.622 12.695,13.13 12.091,13.175C12.06,13.172 12.029,13.17 11.998,13.171ZM17.353,11.203H18.383C18.028,8.289 15.72,5.979 12.804,5.616V6.658C15.153,7 17.004,8.852 17.353,11.203ZM14.663,11.203C14.395,10.311 13.692,9.611 12.804,9.344V8.283C14.265,8.59 15.414,9.736 15.727,11.203H14.663ZM5.615,12.803H6.654C7.001,15.15 8.855,17.002 11.203,17.346V18.391C8.287,18.034 5.972,15.719 5.615,12.803ZM11.203,14.666C10.316,14.394 9.613,13.692 9.345,12.803H8.279C8.591,14.264 9.741,15.412 11.203,15.721V14.666ZM14.661,12.811H15.729C15.418,14.272 14.266,15.422 12.804,15.73V14.662C13.689,14.396 14.391,13.699 14.661,12.811Z"
       android:fillColor="#ffffff"
-      android:fillType="evenOdd"/>
+      android:fillType="evenOdd"
+      tools:ignore="VectorPath" />
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_noise_aware.xml b/packages/SystemUI/res/drawable/ic_noise_aware.xml
deleted file mode 100644
index 5482641..0000000
--- a/packages/SystemUI/res/drawable/ic_noise_aware.xml
+++ /dev/null
@@ -1,26 +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.
-  -->
-
-<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="M440,82Q450,81 460,80.5Q470,80 480,80Q491,80 500.5,80.5Q510,81 520,82L520,162Q510,160 500.5,160Q491,160 480,160Q469,160 459.5,160Q450,160 440,162L440,82ZM272,138Q289,127 306.5,119Q324,111 343,104L378,176Q358,182 340.5,190.5Q323,199 306,210L272,138ZM654,210Q637,199 619.5,190.5Q602,182 582,176L617,104Q636,111 653.5,119Q671,127 688,138L654,210ZM753,311Q742,294 729,278.5Q716,263 702,249L765,199Q779,213 792,228.5Q805,244 816,261L753,311ZM143,263Q154,246 166.5,230.5Q179,215 193,201L256,251Q242,265 229.5,280.5Q217,296 206,313L143,263ZM83,428Q85,408 90,388.5Q95,369 101,350L180,368Q173,387 168.5,406.5Q164,426 162,446L83,428ZM799,449Q797,429 792.5,409Q788,389 781,370L859,352Q865,371 870,390.5Q875,410 877,430L799,449ZM781,590Q788,571 792,552Q796,533 798,513L877,531Q875,551 870,570.5Q865,590 859,609L781,590ZM162,514Q164,534 168.5,553.5Q173,573 180,592L101,610Q95,591 90,571.5Q85,552 83,532L162,514ZM705,708Q719,694 731,678.5Q743,663 754,646L818,696Q807,713 794.5,728.5Q782,744 768,758L705,708ZM194,760Q180,746 167.5,730Q155,714 144,697L206,647Q217,664 229.5,680Q242,696 256,710L194,760ZM583,783Q603,776 620,768Q637,760 654,749L689,821Q672,832 654.5,840.5Q637,849 618,856L583,783ZM344,857Q325,850 307,841.5Q289,833 272,822L307,750Q324,761 341.5,769.5Q359,778 379,784L344,857ZM480,880Q470,880 460,879.5Q450,879 440,878L440,798Q453,800 480,800Q491,800 500.5,800Q510,800 520,798L520,878Q510,879 500.5,879.5Q491,880 480,880ZM520,720Q482,720 450.5,697Q419,674 406,638Q403,629 399.5,620.5Q396,612 389,605L334,550Q308,524 294,490.5Q280,457 280,420Q280,345 332.5,292.5Q385,240 460,240Q529,240 580,285.5Q631,331 639,400L558,400Q551,365 523.5,342.5Q496,320 460,320Q418,320 389,349Q360,378 360,420Q360,440 368,459.5Q376,479 391,494L445,548Q459,562 467.5,578.5Q476,595 482,612Q487,625 497,632.5Q507,640 520,640Q537,640 548.5,628.5Q560,617 560,600L640,600Q640,650 605.5,685Q571,720 520,720ZM540,560Q515,560 497.5,542.5Q480,525 480,500Q480,474 497.5,457Q515,440 540,440Q566,440 583,457Q600,474 600,500Q600,525 583,542.5Q566,560 540,560Z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml b/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml
index 1b12e74..0406f0e 100644
--- a/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml
+++ b/packages/SystemUI/res/drawable/ic_shortcutlist_search.xml
@@ -14,12 +14,15 @@
   limitations under the License
   -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="48"
         android:viewportHeight="48"
-        android:tint="?android:attr/textColorSecondary">
+        android:tint="?androidprv:attr/materialColorOnSurfaceVariant">
     <path
         android:fillColor="@android:color/white"
+        android:strokeColor="@android:color/white"
+        android:strokeWidth="2"
         android:pathData="M39.8,41.95 L26.65,28.8Q25.15,30.1 23.15,30.825Q21.15,31.55 18.9,31.55Q13.5,31.55 9.75,27.8Q6,24.05 6,18.75Q6,13.45 9.75,9.7Q13.5,5.95 18.85,5.95Q24.15,5.95 27.875,9.7Q31.6,13.45 31.6,18.75Q31.6,20.9 30.9,22.9Q30.2,24.9 28.8,26.65L42,39.75ZM18.85,28.55Q22.9,28.55 25.75,25.675Q28.6,22.8 28.6,18.75Q28.6,14.7 25.75,11.825Q22.9,8.95 18.85,8.95Q14.75,8.95 11.875,11.825Q9,14.7 9,18.75Q9,22.8 11.875,25.675Q14.75,28.55 18.85,28.55Z"/>
-</vector>
\ No newline at end of file
+</vector>
diff --git a/packages/SystemUI/res/drawable/qs_hearing_devices_icon.xml b/packages/SystemUI/res/drawable/qs_hearing_devices_icon.xml
new file mode 100644
index 0000000..c1573a3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/qs_hearing_devices_icon.xml
@@ -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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="18dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="#ffffff"
+        android:pathData="M17,20c-0.29,0 -0.56,-0.06 -0.76,-0.15 -0.71,-0.37 -1.21,-0.88 -1.71,-2.38 -0.51,-1.56 -1.47,-2.29 -2.39,-3 -0.79,-0.61 -1.61,-1.24 -2.32,-2.53C9.29,10.98 9,9.93 9,9c0,-2.8 2.2,-5 5,-5s5,2.2 5,5h2c0,-3.93 -3.07,-7 -7,-7S7,5.07 7,9c0,1.26 0.38,2.65 1.07,3.9 0.91,1.65 1.98,2.48 2.85,3.15 0.81,0.62 1.39,1.07 1.71,2.05 0.6,1.82 1.37,2.84 2.73,3.55 0.51,0.23 1.07,0.35 1.64,0.35 2.21,0 4,-1.79 4,-4h-2c0,1.1 -0.9,2 -2,2zM7.64,2.64L6.22,1.22C4.23,3.21 3,5.96 3,9s1.23,5.79 3.22,7.78l1.41,-1.41C6.01,13.74 5,11.49 5,9s1.01,-4.74 2.64,-6.36zM11.5,9c0,1.38 1.12,2.5 2.5,2.5s2.5,-1.12 2.5,-2.5 -1.12,-2.5 -2.5,-2.5 -2.5,1.12 -2.5,2.5z"/>
+</vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml b/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml
index 9a02296..321a04a 100644
--- a/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml
+++ b/packages/SystemUI/res/drawable/screenrecord_options_spinner_popup_background.xml
@@ -17,5 +17,5 @@
         xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
         android:shape="rectangle">
     <corners android:radius="@dimen/screenrecord_spinner_background_radius"/>
-    <solid android:color="?androidprv:attr/colorAccentSecondary" />
+    <solid android:color="?androidprv:attr/materialColorSurfaceContainer" />
 </shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/shortcut_button_colored.xml b/packages/SystemUI/res/drawable/shortcut_button_colored.xml
index bf90853..2e2d9b9 100644
--- a/packages/SystemUI/res/drawable/shortcut_button_colored.xml
+++ b/packages/SystemUI/res/drawable/shortcut_button_colored.xml
@@ -21,7 +21,7 @@
         android:color="?android:attr/colorControlHighlight">
         <item>
             <shape android:shape="rectangle">
-                <corners android:radius="16dp"/>
+              <corners android:radius="@dimen/ksh_button_corner_radius"/>
                 <solid android:color="?androidprv:attr/materialColorSurfaceBright"/>
             </shape>
         </item>
diff --git a/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml b/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml
index f692ed97..5b88bb9 100644
--- a/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml
+++ b/packages/SystemUI/res/drawable/shortcut_button_focus_colored.xml
@@ -21,7 +21,7 @@
         android:color="?android:attr/colorControlHighlight">
         <item>
             <shape android:shape="rectangle">
-                <corners android:radius="16dp"/>
+              <corners android:radius="@dimen/ksh_button_corner_radius"/>
                 <solid android:color="?androidprv:attr/materialColorPrimary"/>
             </shape>
         </item>
diff --git a/packages/SystemUI/res/drawable/shortcut_dialog_bg.xml b/packages/SystemUI/res/drawable/shortcut_dialog_bg.xml
index 6ce3eae..aa0b268 100644
--- a/packages/SystemUI/res/drawable/shortcut_dialog_bg.xml
+++ b/packages/SystemUI/res/drawable/shortcut_dialog_bg.xml
@@ -17,8 +17,8 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
     <solid android:color="?android:attr/colorBackground"/>
-    <corners android:topLeftRadius="16dp"
-             android:topRightRadius="16dp"
+    <corners android:topLeftRadius="@dimen/ksh_dialog_top_corner_radius"
+             android:topRightRadius="@dimen/ksh_dialog_top_corner_radius"
              android:bottomLeftRadius="0dp"
              android:bottomRightRadius="0dp"/>
-</shape>
\ No newline at end of file
+</shape>
diff --git a/packages/SystemUI/res/drawable/shortcut_search_background.xml b/packages/SystemUI/res/drawable/shortcut_search_background.xml
index 66fc191..d6847f0 100644
--- a/packages/SystemUI/res/drawable/shortcut_search_background.xml
+++ b/packages/SystemUI/res/drawable/shortcut_search_background.xml
@@ -19,8 +19,8 @@
     xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
     <item>
         <shape android:shape="rectangle">
-            <solid android:color="?androidprv:attr/colorSurface" />
-            <corners android:radius="24dp" />
+            <solid android:color="?androidprv:attr/materialColorSurfaceBright" />
+            <corners android:radius="@dimen/ksh_search_box_corner_radius" />
         </shape>
     </item>
-</layer-list>
\ No newline at end of file
+</layer-list>
diff --git a/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml b/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml
index 6c4d4fb..2675906 100644
--- a/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml
+++ b/packages/SystemUI/res/drawable/shortcut_search_cancel_button.xml
@@ -20,7 +20,7 @@
     <shape android:shape="oval">
       <size android:width="24dp"
         android:height="24dp" />
-      <solid android:color="?androidprv:attr/colorSurface"/>
+      <solid android:color="?androidprv:attr/materialColorSurfaceBright"/>
     </shape>
   </item>
 </ripple>
diff --git a/packages/SystemUI/res/drawable/tv_volume_row_seek_thumb.xml b/packages/SystemUI/res/drawable/tv_volume_row_seek_thumb.xml
index 3c31861..a706c65 100644
--- a/packages/SystemUI/res/drawable/tv_volume_row_seek_thumb.xml
+++ b/packages/SystemUI/res/drawable/tv_volume_row_seek_thumb.xml
@@ -19,9 +19,4 @@
     <solid android:color="@color/tv_volume_dialog_accent" />
     <size android:width="@dimen/tv_volume_seek_bar_thumb_diameter"
           android:height="@dimen/tv_volume_seek_bar_thumb_diameter" />
-    <stroke android:width="@dimen/tv_volume_seek_bar_thumb_focus_ring_width"
-            android:color="@color/tv_volume_dialog_seek_thumb_focus_ring"/>
-    <item name="android:shadowColor">@color/tv_volume_dialog_seek_thumb_shadow</item>
-    <item name="android:shadowRadius">@dimen/tv_volume_seek_bar_thumb_shadow_radius</item>
-    <item name="android:shadowDy">@dimen/tv_volume_seek_bar_thumb_shadow_dy</item>
 </shape>
diff --git a/packages/SystemUI/res/layout-land/auth_credential_password_pin_content_view.xml b/packages/SystemUI/res/layout-land/auth_credential_password_pin_content_view.xml
index 24222f7..1517f83 100644
--- a/packages/SystemUI/res/layout-land/auth_credential_password_pin_content_view.xml
+++ b/packages/SystemUI/res/layout-land/auth_credential_password_pin_content_view.xml
@@ -53,6 +53,15 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
 
+    <LinearLayout
+        android:id="@+id/customized_view_container"
+        android:orientation="vertical"
+        android:gravity="center_vertical"
+        android:layout_below="@id/subtitle"
+        android:layout_alignParentLeft="true"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
   </RelativeLayout>
 
   <FrameLayout
diff --git a/packages/SystemUI/res/layout-land/auth_credential_pattern_view.xml b/packages/SystemUI/res/layout-land/auth_credential_pattern_view.xml
index d5af377..dd0c584 100644
--- a/packages/SystemUI/res/layout-land/auth_credential_pattern_view.xml
+++ b/packages/SystemUI/res/layout-land/auth_credential_pattern_view.xml
@@ -60,6 +60,15 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"/>
 
+        <LinearLayout
+            android:id="@+id/customized_view_container"
+            android:orientation="vertical"
+            android:gravity="center_vertical"
+            android:layout_below="@id/subtitle"
+            android:layout_alignParentLeft="true"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
         <TextView
             android:id="@+id/error"
             style="?errorTextAppearanceLand"
diff --git a/packages/SystemUI/res/layout-land/biometric_prompt_constraint_layout.xml b/packages/SystemUI/res/layout-land/biometric_prompt_constraint_layout.xml
index 2d63c8d..dabfe9d 100644
--- a/packages/SystemUI/res/layout-land/biometric_prompt_constraint_layout.xml
+++ b/packages/SystemUI/res/layout-land/biometric_prompt_constraint_layout.xml
@@ -2,6 +2,8 @@
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
+xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+android:id="@+id/biometric_prompt_constraint_layout"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 
@@ -19,7 +21,7 @@
         android:id="@+id/panel"
         android:layout_width="0dp"
         android:layout_height="0dp"
-        android:background="?android:attr/colorBackgroundFloating"
+        android:background="?androidprv:attr/materialColorSurfaceBright"
         android:clickable="true"
         android:clipToOutline="true"
         android:importantForAccessibility="no"
@@ -37,7 +39,6 @@
         android:layout_height="wrap_content"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintHorizontal_bias="0.8"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
         tools:srcCompat="@tools:sample/avatars" />
@@ -58,11 +59,12 @@
         android:id="@+id/scrollView"
         android:layout_width="0dp"
         android:layout_height="0dp"
-        android:fillViewport="true"
-        android:padding="24dp"
-        app:layout_constrainedHeight="true"
-        app:layout_constrainedWidth="true"
-        app:layout_constraintBottom_toTopOf="@+id/buttonBarrier"
+        android:paddingBottom="16dp"
+        android:paddingLeft="24dp"
+        android:paddingRight="12dp"
+        android:paddingTop="24dp"
+        android:fadeScrollbars="false"
+        app:layout_constraintBottom_toTopOf="@+id/button_bar"
         app:layout_constraintEnd_toStartOf="@+id/midGuideline"
         app:layout_constraintStart_toStartOf="@id/leftGuideline"
         app:layout_constraintTop_toTopOf="@+id/topGuideline">
@@ -74,8 +76,9 @@
 
             <ImageView
                 android:id="@+id/logo"
-                android:layout_width="@dimen/biometric_auth_icon_size"
-                android:layout_height="@dimen/biometric_auth_icon_size"
+                android:contentDescription="@string/biometric_dialog_logo"
+                android:layout_width="@dimen/biometric_prompt_logo_size"
+                android:layout_height="@dimen/biometric_prompt_logo_size"
                 android:layout_gravity="center"
                 android:scaleType="fitXY"
                 android:visibility="visible"
@@ -84,25 +87,16 @@
 
             <TextView
                 android:id="@+id/logo_description"
+                style="@style/TextAppearance.AuthCredential.LogoDescription"
                 android:layout_width="0dp"
                 android:layout_height="wrap_content"
-                android:ellipsize="marquee"
-                android:gravity="@integer/biometric_dialog_text_gravity"
-                android:marqueeRepeatLimit="1"
-                android:singleLine="true"
                 android:textAlignment="viewStart"
-                android:paddingLeft="8dp"
+                android:paddingLeft="16dp"
                 app:layout_constraintBottom_toBottomOf="@+id/logo"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toEndOf="@+id/logo"
                 app:layout_constraintTop_toTopOf="@+id/logo" />
 
-            <Space
-                android:id="@+id/space_above_content"
-                android:layout_width="match_parent"
-                android:layout_height="@dimen/biometric_prompt_space_above_content"
-                android:visibility="gone" />
-
             <TextView
                 android:id="@+id/title"
                 style="@style/TextAppearance.AuthCredential.Title"
@@ -125,7 +119,7 @@
                 style="@style/TextAppearance.AuthCredential.Subtitle"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="12dp"
+                android:layout_marginTop="16dp"
                 android:gravity="@integer/biometric_dialog_text_gravity"
                 android:paddingHorizontal="0dp"
                 android:textAlignment="viewStart"
@@ -137,11 +131,11 @@
 
             <LinearLayout
                 android:id="@+id/customized_view_container"
-                android:layout_width="wrap_content"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
+                android:layout_marginTop="24dp"
                 android:gravity="center_vertical"
                 android:orientation="vertical"
-                android:paddingHorizontal="0dp"
                 android:visibility="gone"
                 app:layout_constraintBottom_toBottomOf="parent"
                 app:layout_constraintEnd_toEndOf="parent"
@@ -155,6 +149,7 @@
                 style="@style/TextAppearance.AuthCredential.Description"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginTop="24dp"
                 android:gravity="@integer/biometric_dialog_text_gravity"
                 android:paddingHorizontal="0dp"
                 android:textAlignment="viewStart"
@@ -165,7 +160,6 @@
                 app:layout_constraintTop_toBottomOf="@+id/subtitle"
                 app:layout_constraintVertical_bias="0.0" />
 
-
             <androidx.constraintlayout.widget.Barrier
                 android:id="@+id/contentBarrier"
                 android:layout_width="wrap_content"
@@ -179,17 +173,15 @@
 
     <TextView
         android:id="@+id/indicator"
+        style="@style/TextAppearance.AuthCredential.Indicator"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="24dp"
         android:accessibilityLiveRegion="polite"
         android:fadingEdge="horizontal"
         android:gravity="center_horizontal"
-        android:marqueeRepeatLimit="marquee_forever"
         android:scrollHorizontally="true"
-        android:textColor="@color/biometric_dialog_gray"
-        android:textSize="12sp"
-        app:layout_constraintBottom_toTopOf="@+id/buttonBarrier"
+        app:layout_constraintBottom_toTopOf="@+id/button_bar"
         app:layout_constraintEnd_toEndOf="@+id/biometric_icon"
         app:layout_constraintStart_toStartOf="@+id/biometric_icon"
         app:layout_constraintTop_toBottomOf="@+id/biometric_icon"
@@ -199,7 +191,7 @@
         android:id="@+id/button_bar"
         layout="@layout/biometric_prompt_button_bar"
         android:layout_width="0dp"
-        android:layout_height="0dp"
+        android:layout_height="wrap_content"
         app:layout_constraintBottom_toTopOf="@id/bottomGuideline"
         app:layout_constraintEnd_toEndOf="@id/scrollView"
         app:layout_constraintStart_toStartOf="@id/scrollView"
@@ -214,14 +206,6 @@
         app:barrierDirection="top"
         app:constraint_referenced_ids="scrollView" />
 
-    <androidx.constraintlayout.widget.Barrier
-        android:id="@+id/buttonBarrier"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        app:barrierAllowsGoneWidgets="false"
-        app:barrierDirection="top"
-        app:constraint_referenced_ids="button_bar" />
-
     <androidx.constraintlayout.widget.Guideline
         android:id="@+id/leftGuideline"
         android:layout_width="wrap_content"
@@ -248,13 +232,13 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
-        app:layout_constraintGuide_end="@dimen/biometric_dialog_border_padding" />
+        app:layout_constraintGuide_end="40dp" />
 
     <androidx.constraintlayout.widget.Guideline
         android:id="@+id/topGuideline"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:orientation="horizontal"
-        app:layout_constraintGuide_begin="@dimen/biometric_dialog_border_padding" />
+        app:layout_constraintGuide_begin="0dp" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/packages/SystemUI/res/layout-sw600dp/biometric_prompt_constraint_layout.xml b/packages/SystemUI/res/layout-sw600dp/biometric_prompt_constraint_layout.xml
index 329fc46..240abab 100644
--- a/packages/SystemUI/res/layout-sw600dp/biometric_prompt_constraint_layout.xml
+++ b/packages/SystemUI/res/layout-sw600dp/biometric_prompt_constraint_layout.xml
@@ -2,6 +2,8 @@
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:id="@+id/biometric_prompt_constraint_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
@@ -19,7 +21,7 @@
         android:id="@+id/panel"
         android:layout_width="0dp"
         android:layout_height="0dp"
-        android:background="?android:attr/colorBackgroundFloating"
+        android:background="?androidprv:attr/materialColorSurfaceBright"
         android:clickable="true"
         android:clipToOutline="true"
         android:importantForAccessibility="no"
@@ -27,28 +29,31 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toStartOf="@+id/rightGuideline"
         app:layout_constraintStart_toStartOf="@+id/leftGuideline"
-        app:layout_constraintTop_toTopOf="@+id/topBarrier" />
+        app:layout_constraintTop_toTopOf="@+id/topBarrier"
+        app:layout_constraintWidth_max="640dp" />
 
     <include
-        layout="@layout/biometric_prompt_button_bar"
         android:id="@+id/button_bar"
+        layout="@layout/biometric_prompt_button_bar"
         android:layout_width="0dp"
-        android:layout_height="match_parent"
-        app:layout_constraintBottom_toTopOf="@id/bottomGuideline"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="40dp"
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="@id/panel"
-        app:layout_constraintStart_toStartOf="@id/panel"/>
+        app:layout_constraintStart_toStartOf="@id/panel" />
 
     <ScrollView
         android:id="@+id/scrollView"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
+        android:fadeScrollbars="false"
         android:fillViewport="true"
-        android:paddingBottom="36dp"
-        android:paddingHorizontal="24dp"
+        android:paddingBottom="32dp"
+        android:paddingHorizontal="32dp"
         android:paddingTop="24dp"
         app:layout_constrainedHeight="true"
         app:layout_constrainedWidth="true"
-        app:layout_constraintBottom_toTopOf="@+id/biometric_icon"
+        app:layout_constraintBottom_toTopOf="@+id/scrollBarrier"
         app:layout_constraintEnd_toEndOf="@id/panel"
         app:layout_constraintStart_toStartOf="@id/panel"
         app:layout_constraintTop_toTopOf="@+id/topGuideline"
@@ -61,9 +66,10 @@
 
             <ImageView
                 android:id="@+id/logo"
-                android:layout_width="@dimen/biometric_auth_icon_size"
-                android:layout_height="@dimen/biometric_auth_icon_size"
+                android:layout_width="@dimen/biometric_prompt_logo_size"
+                android:layout_height="@dimen/biometric_prompt_logo_size"
                 android:layout_gravity="center"
+                android:contentDescription="@string/biometric_dialog_logo"
                 android:scaleType="fitXY"
                 android:visibility="visible"
                 app:layout_constraintBottom_toTopOf="@+id/logo_description"
@@ -73,24 +79,15 @@
 
             <TextView
                 android:id="@+id/logo_description"
+                style="@style/TextAppearance.AuthCredential.LogoDescription"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:ellipsize="marquee"
-                android:gravity="@integer/biometric_dialog_text_gravity"
-                android:marqueeRepeatLimit="1"
-                android:singleLine="true"
                 android:paddingTop="16dp"
                 app:layout_constraintBottom_toTopOf="@+id/title"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@+id/logo" />
 
-            <Space
-                android:id="@+id/space_above_content"
-                android:layout_width="match_parent"
-                android:layout_height="@dimen/biometric_prompt_space_above_content"
-                android:visibility="gone" />
-
             <TextView
                 android:id="@+id/title"
                 style="@style/TextAppearance.AuthCredential.Title"
@@ -117,11 +114,11 @@
 
             <LinearLayout
                 android:id="@+id/customized_view_container"
-                android:layout_width="wrap_content"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:gravity="center_vertical"
                 android:orientation="vertical"
-                android:paddingHorizontal="@dimen/biometric_prompt_content_container_padding_horizontal"
+                android:paddingTop="24dp"
                 android:visibility="gone"
                 app:layout_constraintBottom_toBottomOf="parent"
                 app:layout_constraintEnd_toEndOf="parent"
@@ -134,6 +131,8 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:gravity="@integer/biometric_dialog_text_gravity"
+                android:paddingTop="16dp"
+                android:textAlignment="viewStart"
                 app:layout_constraintBottom_toBottomOf="parent"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
@@ -153,17 +152,15 @@
     <!-- Cancel Button, replaces negative button when biometric is accepted -->
     <TextView
         android:id="@+id/indicator"
+        style="@style/TextAppearance.AuthCredential.Indicator"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="24dp"
         android:accessibilityLiveRegion="polite"
         android:fadingEdge="horizontal"
         android:gravity="center_horizontal"
-        android:marqueeRepeatLimit="marquee_forever"
         android:scrollHorizontally="true"
-        android:textColor="@color/biometric_dialog_gray"
-        android:textSize="12sp"
-        app:layout_constraintBottom_toTopOf="@+id/buttonBarrier"
+        app:layout_constraintBottom_toTopOf="@+id/button_bar"
         app:layout_constraintEnd_toEndOf="@+id/panel"
         app:layout_constraintStart_toStartOf="@+id/panel"
         app:layout_constraintTop_toBottomOf="@+id/biometric_icon"
@@ -182,12 +179,12 @@
 
     <!-- Try Again Button -->
     <androidx.constraintlayout.widget.Barrier
-        android:id="@+id/buttonBarrier"
+        android:id="@+id/scrollBarrier"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:barrierAllowsGoneWidgets="false"
         app:barrierDirection="top"
-        app:constraint_referenced_ids="button_bar" />
+        app:constraint_referenced_ids="biometric_icon, button_bar" />
 
     <!-- Guidelines for setting panel border -->
     <androidx.constraintlayout.widget.Guideline
@@ -209,14 +206,14 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
-        app:layout_constraintGuide_end="@dimen/biometric_dialog_border_padding" />
+        app:layout_constraintGuide_end="40dp" />
 
     <androidx.constraintlayout.widget.Guideline
         android:id="@+id/topGuideline"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:orientation="horizontal"
-        app:layout_constraintGuide_percent="0.25171" />
+        app:layout_constraintGuide_begin="56dp" />
 
     <com.android.systemui.biometrics.BiometricPromptLottieViewWrapper
         android:id="@+id/biometric_icon"
@@ -226,7 +223,7 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintVertical_bias="0.8"
+        app:layout_constraintVertical_bias="1.0"
         tools:srcCompat="@tools:sample/avatars" />
 
     <com.android.systemui.biometrics.BiometricPromptLottieViewWrapper
diff --git a/packages/SystemUI/res/layout/auth_credential_password_pin_content_view.xml b/packages/SystemUI/res/layout/auth_credential_password_pin_content_view.xml
index 11284fd..9f4fcb3 100644
--- a/packages/SystemUI/res/layout/auth_credential_password_pin_content_view.xml
+++ b/packages/SystemUI/res/layout/auth_credential_password_pin_content_view.xml
@@ -55,6 +55,13 @@
           android:layout_height="wrap_content"
           android:layout_below="@id/subtitle" />
 
+      <LinearLayout
+          android:id="@+id/customized_view_container"
+          android:orientation="vertical"
+          android:gravity="center_vertical"
+          android:layout_below="@id/subtitle"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content" />
     </RelativeLayout>
 
   </ScrollView>
diff --git a/packages/SystemUI/res/layout/auth_credential_pattern_view.xml b/packages/SystemUI/res/layout/auth_credential_pattern_view.xml
index 59828fd..baeb94e 100644
--- a/packages/SystemUI/res/layout/auth_credential_pattern_view.xml
+++ b/packages/SystemUI/res/layout/auth_credential_pattern_view.xml
@@ -56,6 +56,14 @@
             android:layout_below="@id/subtitle"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"/>
+
+        <LinearLayout
+            android:id="@+id/customized_view_container"
+            android:orientation="vertical"
+            android:gravity="center_vertical"
+            android:layout_below="@id/subtitle"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
     </RelativeLayout>
 
     <RelativeLayout
diff --git a/packages/SystemUI/res/layout/biometric_prompt_button_bar.xml b/packages/SystemUI/res/layout/biometric_prompt_button_bar.xml
index 810c7433..4d2310a 100644
--- a/packages/SystemUI/res/layout/biometric_prompt_button_bar.xml
+++ b/packages/SystemUI/res/layout/biometric_prompt_button_bar.xml
@@ -17,12 +17,13 @@
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:theme="@style/Theme.SystemUI.Dialog"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <!-- Negative Button, reserved for app -->
     <Button
         android:id="@+id/button_negative"
-        style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
+        style="@style/Widget.Dialog.Button.BorderButton"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
@@ -36,7 +37,7 @@
     <!-- Cancel Button, replaces negative button when biometric is accepted -->
     <Button
         android:id="@+id/button_cancel"
-        style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
+        style="@style/Widget.Dialog.Button.BorderButton"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
@@ -49,7 +50,7 @@
     <!-- "Use Credential" Button, replaces if device credential is allowed -->
     <Button
         android:id="@+id/button_use_credential"
-        style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
+        style="@style/Widget.Dialog.Button.BorderButton"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
@@ -61,7 +62,7 @@
     <!-- Positive Button -->
     <Button
         android:id="@+id/button_confirm"
-        style="@*android:style/Widget.DeviceDefault.Button.Colored"
+        style="@style/Widget.Dialog.Button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
@@ -76,7 +77,7 @@
     <!-- Try Again Button -->
     <Button
         android:id="@+id/button_try_again"
-        style="@*android:style/Widget.DeviceDefault.Button.Colored"
+        style="@style/Widget.Dialog.Button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
diff --git a/packages/SystemUI/res/layout/biometric_prompt_constraint_layout.xml b/packages/SystemUI/res/layout/biometric_prompt_constraint_layout.xml
index 6391813..8e3cf4d 100644
--- a/packages/SystemUI/res/layout/biometric_prompt_constraint_layout.xml
+++ b/packages/SystemUI/res/layout/biometric_prompt_constraint_layout.xml
@@ -2,6 +2,8 @@
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:id="@+id/biometric_prompt_constraint_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
@@ -19,7 +21,7 @@
         android:id="@+id/panel"
         android:layout_width="0dp"
         android:layout_height="0dp"
-        android:background="?android:attr/colorBackgroundFloating"
+        android:background="?androidprv:attr/materialColorSurfaceBright"
         android:clickable="true"
         android:clipToOutline="true"
         android:importantForAccessibility="no"
@@ -33,24 +35,26 @@
         android:id="@+id/button_bar"
         layout="@layout/biometric_prompt_button_bar"
         android:layout_width="0dp"
-        android:layout_height="match_parent"
-        app:layout_constraintBottom_toTopOf="@id/bottomGuideline"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="40dp"
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="@id/panel"
         app:layout_constraintStart_toStartOf="@id/panel" />
 
     <ScrollView
         android:id="@+id/scrollView"
-        android:layout_width="match_parent"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:fillViewport="true"
+        android:fadeScrollbars="false"
         android:paddingBottom="36dp"
         android:paddingHorizontal="24dp"
         android:paddingTop="24dp"
         app:layout_constrainedHeight="true"
         app:layout_constrainedWidth="true"
-        app:layout_constraintBottom_toTopOf="@+id/biometric_icon"
-        app:layout_constraintEnd_toEndOf="@id/rightGuideline"
-        app:layout_constraintStart_toStartOf="@id/leftGuideline"
+        app:layout_constraintBottom_toTopOf="@+id/scrollBarrier"
+        app:layout_constraintEnd_toEndOf="@id/panel"
+        app:layout_constraintStart_toStartOf="@id/panel"
         app:layout_constraintTop_toTopOf="@+id/topGuideline"
         app:layout_constraintVertical_bias="1.0">
 
@@ -61,10 +65,12 @@
 
             <ImageView
                 android:id="@+id/logo"
-                android:layout_width="@dimen/biometric_auth_icon_size"
-                android:layout_height="@dimen/biometric_auth_icon_size"
+                android:contentDescription="@string/biometric_dialog_logo"
+                android:layout_width="@dimen/biometric_prompt_logo_size"
+                android:layout_height="@dimen/biometric_prompt_logo_size"
                 android:layout_gravity="center"
                 android:scaleType="fitXY"
+                android:importantForAccessibility="no"
                 app:layout_constraintBottom_toTopOf="@+id/logo_description"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
@@ -73,21 +79,15 @@
 
             <TextView
                 android:id="@+id/logo_description"
+                style="@style/TextAppearance.AuthCredential.LogoDescription"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:gravity="@integer/biometric_dialog_text_gravity"
-                android:singleLine="true"
+                android:paddingTop="8dp"
                 app:layout_constraintBottom_toTopOf="@+id/title"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@+id/logo" />
 
-            <Space
-                android:id="@+id/space_above_content"
-                android:layout_width="match_parent"
-                android:layout_height="@dimen/biometric_prompt_space_above_content"
-                android:visibility="gone" />
-
             <TextView
                 android:id="@+id/title"
                 style="@style/TextAppearance.AuthCredential.Title"
@@ -118,8 +118,8 @@
                 android:layout_height="wrap_content"
                 android:gravity="center_vertical"
                 android:orientation="vertical"
+                android:paddingTop="24dp"
                 android:visibility="gone"
-                android:paddingTop="8dp"
                 app:layout_constraintBottom_toBottomOf="parent"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toStartOf="parent"
@@ -131,6 +131,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:gravity="@integer/biometric_dialog_text_gravity"
+                android:textAlignment="viewStart"
                 android:paddingTop="16dp"
                 app:layout_constraintBottom_toBottomOf="parent"
                 app:layout_constraintEnd_toEndOf="parent"
@@ -150,6 +151,7 @@
 
     <TextView
         android:id="@+id/indicator"
+        style="@style/TextAppearance.AuthCredential.Indicator"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="24dp"
@@ -157,7 +159,7 @@
         android:fadingEdge="horizontal"
         android:gravity="center_horizontal"
         android:scrollHorizontally="true"
-        app:layout_constraintBottom_toTopOf="@+id/buttonBarrier"
+        app:layout_constraintBottom_toTopOf="@+id/button_bar"
         app:layout_constraintEnd_toEndOf="@+id/panel"
         app:layout_constraintStart_toStartOf="@+id/panel"
         app:layout_constraintTop_toBottomOf="@+id/biometric_icon"
@@ -172,12 +174,12 @@
         app:constraint_referenced_ids="scrollView" />
 
     <androidx.constraintlayout.widget.Barrier
-        android:id="@+id/buttonBarrier"
+        android:id="@+id/scrollBarrier"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:barrierAllowsGoneWidgets="false"
         app:barrierDirection="top"
-        app:constraint_referenced_ids="button_bar" />
+        app:constraint_referenced_ids="biometric_icon, button_bar" />
 
     <androidx.constraintlayout.widget.Guideline
         android:id="@+id/leftGuideline"
@@ -198,14 +200,14 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
-        app:layout_constraintGuide_end="@dimen/biometric_dialog_border_padding" />
+        app:layout_constraintGuide_end="40dp" />
 
     <androidx.constraintlayout.widget.Guideline
         android:id="@+id/topGuideline"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:orientation="horizontal"
-        app:layout_constraintGuide_percent="0.25" />
+        app:layout_constraintGuide_begin="119dp" />
 
     <com.android.systemui.biometrics.BiometricPromptLottieViewWrapper
         android:id="@+id/biometric_icon"
@@ -215,7 +217,7 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintVertical_bias="0.8"
+        app:layout_constraintVertical_bias="1.0"
         tools:srcCompat="@tools:sample/avatars" />
 
     <com.android.systemui.biometrics.BiometricPromptLottieViewWrapper
@@ -229,5 +231,4 @@
         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_content_layout.xml b/packages/SystemUI/res/layout/biometric_prompt_content_layout.xml
deleted file mode 100644
index 3908757..0000000
--- a/packages/SystemUI/res/layout/biometric_prompt_content_layout.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  ~ 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.
-  -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/customized_view"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:gravity="center_vertical"
-    android:orientation="vertical"
-    style="@style/AuthCredentialContentLayoutStyle">
-
-    <TextView
-        android:id="@+id/customized_view_title"
-        style="@style/TextAppearance.AuthCredential.ContentViewTitle"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:ellipsize="marquee"
-        android:marqueeRepeatLimit="1"
-        android:singleLine="true" />
-</LinearLayout>
diff --git a/packages/SystemUI/res/layout/biometric_prompt_content_row_item_text_view.xml b/packages/SystemUI/res/layout/biometric_prompt_content_row_item_text_view.xml
index e39f60f..bc82708 100644
--- a/packages/SystemUI/res/layout/biometric_prompt_content_row_item_text_view.xml
+++ b/packages/SystemUI/res/layout/biometric_prompt_content_row_item_text_view.xml
@@ -17,5 +17,5 @@
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
     style="@style/TextAppearance.AuthCredential.ContentViewListItem"
     android:layout_width="0dp"
-    android:layout_height="match_parent"
+    android:layout_height="wrap_content"
     android:layout_weight="1.0" />
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/biometric_prompt_content_row_layout.xml b/packages/SystemUI/res/layout/biometric_prompt_content_row_layout.xml
index 6c86736..f0125b6 100644
--- a/packages/SystemUI/res/layout/biometric_prompt_content_row_layout.xml
+++ b/packages/SystemUI/res/layout/biometric_prompt_content_row_layout.xml
@@ -16,6 +16,6 @@
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="@dimen/biometric_prompt_content_list_row_height"
+    android:layout_height="wrap_content"
     android:gravity="center_vertical|start"
     android:orientation="horizontal" />
diff --git a/packages/SystemUI/res/layout/biometric_prompt_content_with_button_layout.xml b/packages/SystemUI/res/layout/biometric_prompt_content_with_button_layout.xml
new file mode 100644
index 0000000..81f4bcc
--- /dev/null
+++ b/packages/SystemUI/res/layout/biometric_prompt_content_with_button_layout.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ 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.
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/customized_view"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    style="@style/AuthCredentialContentViewStyle">
+
+    <TextView
+        android:id="@+id/customized_view_description"
+        style="@style/TextAppearance.AuthCredential.ContentViewWithButtonDescription"
+        android:paddingBottom="16dp"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+    <Button
+        android:id="@+id/customized_view_more_options_button"
+        style="@style/AuthCredentialContentViewMoreOptionsButtonStyle"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/biometric_dialog_content_view_more_options_button"/>
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/biometric_prompt_layout.xml b/packages/SystemUI/res/layout/biometric_prompt_layout.xml
index 9842109..ff89ed9 100644
--- a/packages/SystemUI/res/layout/biometric_prompt_layout.xml
+++ b/packages/SystemUI/res/layout/biometric_prompt_layout.xml
@@ -44,7 +44,7 @@
         android:singleLine="true"
         android:marqueeRepeatLimit="1"
         android:ellipsize="marquee"
-        style="@style/TextAppearance.AuthCredential.Title"/>
+        style="@style/TextAppearance.AuthCredential.OldTitle"/>
 
     <TextView
         android:id="@+id/subtitle"
@@ -54,20 +54,21 @@
         android:singleLine="true"
         android:marqueeRepeatLimit="1"
         android:ellipsize="marquee"
-        style="@style/TextAppearance.AuthCredential.Subtitle"/>
+        style="@style/TextAppearance.AuthCredential.OldSubtitle"/>
 
     <TextView
         android:id="@+id/description"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:gravity="@integer/biometric_dialog_text_gravity"
         android:scrollbars ="vertical"
         android:importantForAccessibility="no"
-        style="@style/TextAppearance.AuthCredential.Description"/>
+        style="@style/TextAppearance.AuthCredential.OldDescription"/>
 
     <Space
         android:id="@+id/space_above_content"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/biometric_prompt_space_above_content"
+        android:layout_height="24dp"
         android:visibility="gone" />
 
     <LinearLayout
@@ -77,7 +78,6 @@
         android:fadeScrollbars="false"
         android:gravity="center_vertical"
         android:orientation="vertical"
-        android:paddingHorizontal="@dimen/biometric_prompt_content_container_padding_horizontal"
         android:scrollbars="vertical"
         android:visibility="gone" />
 
diff --git a/packages/SystemUI/res/layout/biometric_prompt_vertical_list_content_layout.xml b/packages/SystemUI/res/layout/biometric_prompt_vertical_list_content_layout.xml
new file mode 100644
index 0000000..a754cb4
--- /dev/null
+++ b/packages/SystemUI/res/layout/biometric_prompt_vertical_list_content_layout.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ 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.
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/customized_view"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    style="@style/AuthCredentialVerticalListContentViewStyle">
+
+    <TextView
+        android:id="@+id/customized_view_description"
+        style="@style/TextAppearance.AuthCredential.VerticalListContentViewDescription"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml b/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml
index ae24313..14b3b55 100644
--- a/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml
+++ b/packages/SystemUI/res/layout/clipboard_edit_text_activity.xml
@@ -3,6 +3,7 @@
     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"
+    android:id="@+id/editor_root"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
diff --git a/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml b/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml
index 6de10b4..6538725 100644
--- a/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml
+++ b/packages/SystemUI/res/layout/dream_overlay_complication_clock_time.xml
@@ -37,4 +37,6 @@
     app:ambientShadowOffsetY="@dimen/dream_overlay_clock_ambient_text_shadow_dy"
     app:ambientShadowAlpha="0.3"
     app:removeTextDescent="true"
-    app:textDescentExtraPadding="@dimen/dream_overlay_clock_text_descent_extra_padding" />
+    app:textDescentExtraPadding="@dimen/dream_overlay_clock_text_descent_extra_padding"
+    android:clickable="false"
+/>
diff --git a/packages/SystemUI/res/layout/fullscreen_magnification_border.xml b/packages/SystemUI/res/layout/fullscreen_magnification_border.xml
new file mode 100644
index 0000000..5f738c0
--- /dev/null
+++ b/packages/SystemUI/res/layout/fullscreen_magnification_border.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.
+  -->
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/magnification_fullscreen_border"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="false"
+    android:background="@drawable/accessibility_fullscreen_magnification_border_background"/>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/global_actions_grid_lite.xml b/packages/SystemUI/res/layout/global_actions_grid_lite.xml
index a64c9ae..9a7108a 100644
--- a/packages/SystemUI/res/layout/global_actions_grid_lite.xml
+++ b/packages/SystemUI/res/layout/global_actions_grid_lite.xml
@@ -19,6 +19,7 @@
     android:id="@+id/global_actions_container"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:clipChildren="false"
     android:gravity="center"
     android:layout_gravity="center">
   <com.android.systemui.globalactions.GlobalActionsLayoutLite
diff --git a/packages/SystemUI/res/layout/hearing_devices_tile_dialog.xml b/packages/SystemUI/res/layout/hearing_devices_tile_dialog.xml
new file mode 100644
index 0000000..a5cdaeb
--- /dev/null
+++ b/packages/SystemUI/res/layout/hearing_devices_tile_dialog.xml
@@ -0,0 +1,56 @@
+<!--
+    Copyright (C) 2024 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT 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:id="@+id/root"
+    style="@style/Widget.SliceView.Panel"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/device_list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintBottom_toTopOf="@id/pair_new_device_button" />
+
+    <Button
+        android:id="@+id/pair_new_device_button"
+        style="@style/BluetoothTileDialog.Device"
+        android:paddingEnd="0dp"
+        android:paddingStart="20dp"
+        android:background="@drawable/bluetooth_tile_dialog_bg_off"
+        android:layout_width="0dp"
+        android:layout_height="64dp"
+        android:contentDescription="@string/accessibility_hearing_device_pair_new_device"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/device_list"
+        android:drawableStart="@drawable/ic_add"
+        android:drawablePadding="20dp"
+        android:drawableTint="?android:attr/textColorPrimary"
+        android:text="@string/quick_settings_pair_hearing_devices"
+        android:textSize="14sp"
+        android:textAppearance="@style/TextAppearance.Dialog.Title"
+        android:textDirection="locale"
+        android:textAlignment="viewStart"
+        android:maxLines="1"
+        android:ellipsize="end" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml b/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml
index a005100..5ab2327 100644
--- a/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml
+++ b/packages/SystemUI/res/layout/keyboard_shortcut_app_item.xml
@@ -15,13 +15,14 @@
   ~ limitations under the License
   -->
 <com.android.systemui.statusbar.KeyboardShortcutAppItemLayout
+        xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:orientation="horizontal"
         android:background="@drawable/list_item_background"
         android:focusable="true"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:minHeight="48dp"
+        android:minHeight="@dimen/ksh_app_item_minimum_height"
         android:paddingBottom="8dp">
     <ImageView
             android:id="@+id/keyboard_shortcuts_icon"
@@ -39,7 +40,8 @@
             android:layout_height="wrap_content"
             android:paddingEnd="12dp"
             android:paddingBottom="4dp"
-            android:textColor="?android:attr/textColorPrimary"
+            android:textColor="?androidprv:attr/materialColorOnSurface"
+            android:textAppearance="?android:attr/textAppearanceMedium"
             android:textSize="16sp"
             android:maxLines="5"
             android:singleLine="false"
diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_category_short_separator.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_category_short_separator.xml
index 530e46e..76e5b12 100644
--- a/packages/SystemUI/res/layout/keyboard_shortcuts_category_short_separator.xml
+++ b/packages/SystemUI/res/layout/keyboard_shortcuts_category_short_separator.xml
@@ -15,6 +15,6 @@
   limitations under the License
   -->
 <View xmlns:android="http://schemas.android.com/apk/res/android"
-      android:layout_marginTop="8dp"
-      android:layout_marginBottom="0dp"
+      android:layout_marginTop="@dimen/ksh_category_separator_margin"
+      android:layout_marginBottom="@dimen/ksh_category_separator_margin"
       style="@style/ShortcutHorizontalDivider" />
diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml
index 4f100f6..6e7fde6 100644
--- a/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml
+++ b/packages/SystemUI/res/layout/keyboard_shortcuts_category_title.xml
@@ -16,10 +16,12 @@
   ~ limitations under the License
   -->
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
+          android:textAppearance="?android:attr/textAppearanceMedium"
           android:textSize="14sp"
-          android:fontFamily="sans-serif-medium"
+          android:textColor="?androidprv:attr/materialColorPrimary"
           android:importantForAccessibility="yes"
           android:paddingTop="20dp"
           android:paddingBottom="10dp"/>
diff --git a/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml b/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml
index f6042e4..2cfd644 100644
--- a/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml
+++ b/packages/SystemUI/res/layout/keyboard_shortcuts_search_view.xml
@@ -16,15 +16,21 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
     android:background="@drawable/shortcut_dialog_bg"
     android:layout_width="@dimen/ksh_layout_width"
     android:layout_height="wrap_content"
     android:orientation="vertical">
+
+    <com.google.android.material.bottomsheet.BottomSheetDragHandleView
+        android:id="@+id/drag_handle"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
     <TextView
         android:id="@+id/shortcut_title"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginTop="40dp"
         android:layout_gravity="center_horizontal"
         android:textAppearance="?android:attr/textAppearanceLarge"
         android:textColor="?android:attr/textColorPrimary"
@@ -39,44 +45,47 @@
             android:layout_height="wrap_content"
             android:layout_marginTop="24dp"
             android:layout_marginBottom="24dp"
-            android:layout_marginStart="49dp"
-            android:layout_marginEnd="49dp"
+            android:layout_marginStart="@dimen/ksh_container_horizontal_margin"
+            android:layout_marginEnd="@dimen/ksh_container_horizontal_margin"
             android:padding="16dp"
             android:background="@drawable/shortcut_search_background"
             android:drawableStart="@drawable/ic_shortcutlist_search"
             android:drawablePadding="15dp"
             android:singleLine="true"
-            android:textColor="?android:attr/textColorPrimary"
+            android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
             android:inputType="text"
             android:textDirection="locale"
             android:textAlignment="viewStart"
             android:hint="@string/keyboard_shortcut_search_list_hint"
-            android:textColorHint="?android:attr/textColorTertiary" />
+            android:textAppearance="@android:style/TextAppearance.Material"
+            android:textSize="16sp"
+            android:textColorHint="?androidprv:attr/materialColorOutline" />
 
         <ImageButton
             android:id="@+id/keyboard_shortcuts_search_cancel"
             android:layout_gravity="center_vertical|end"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginEnd="49dp"
+            android:layout_marginEnd="@dimen/ksh_container_horizontal_margin"
             android:padding="16dp"
             android:contentDescription="@string/keyboard_shortcut_clear_text"
             android:src="@drawable/ic_shortcutlist_search_button_cancel"
             android:background="@drawable/shortcut_search_cancel_button"
             style="@android:style/Widget.Material.Button.Borderless.Small"
-            android:pointerIcon="arrow" />
+            android:pointerIcon="arrow"
+            android:visibility="gone" />
     </FrameLayout>
 
     <HorizontalScrollView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginStart="49dp"
+        android:layout_marginStart="@dimen/ksh_container_horizontal_margin"
         android:layout_marginEnd="0dp"
         android:scrollbars="none">
         <LinearLayout
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:gravity="center_vertical"
+            android:layout_gravity="center_vertical"
             android:orientation="horizontal">
             <Button
                 android:id="@+id/shortcut_system"
@@ -113,29 +122,29 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="50dp"
-        android:layout_marginStart="49dp"
-        android:layout_marginEnd="49dp"
+        android:layout_marginStart="@dimen/ksh_container_horizontal_margin"
+        android:layout_marginEnd="@dimen/ksh_container_horizontal_margin"
         android:layout_gravity="center_horizontal"
         android:textAppearance="?android:attr/textAppearanceMedium"
         android:textColor="?android:attr/textColorPrimary"
         android:text="@string/keyboard_shortcut_search_list_no_result"/>
 
-    <ScrollView
+    <androidx.core.widget.NestedScrollView
         android:id="@+id/keyboard_shortcuts_scroll_view"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginTop="16dp"
-        android:layout_marginStart="49dp"
-        android:layout_marginEnd="49dp"
+        android:layout_marginStart="@dimen/ksh_container_horizontal_margin"
+        android:layout_marginEnd="@dimen/ksh_container_horizontal_margin"
         android:overScrollMode="never"
-        android:layout_marginBottom="16dp"
+        android:clipToPadding="false"
         android:scrollbars="none">
         <LinearLayout
             android:id="@+id/keyboard_shortcuts_container"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical"/>
-    </ScrollView>
+    </androidx.core.widget.NestedScrollView>
     <!-- Required for stretching to full available height when the items in the scroll view
          occupy less space then the full height -->
     <View
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
index 91550b3..e95c6a7 100644
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -34,6 +34,5 @@
             android:paddingEnd="0dp"
             android:progressDrawable="@drawable/brightness_progress_drawable"
             android:splitTrack="false"
-            android:clickable="true"
         />
     </com.android.systemui.settings.brightness.BrightnessSliderView>
diff --git a/packages/SystemUI/res/layout/record_issue_dialog.xml b/packages/SystemUI/res/layout/record_issue_dialog.xml
index 53ad9f1..30d7b0a 100644
--- a/packages/SystemUI/res/layout/record_issue_dialog.xml
+++ b/packages/SystemUI/res/layout/record_issue_dialog.xml
@@ -54,6 +54,7 @@
             android:layout_weight="0"
             android:src="@drawable/ic_screenrecord"
             app:tint="?androidprv:attr/materialColorOnSurface"
+            android:importantForAccessibility="no"
             android:layout_gravity="center"
             android:layout_marginEnd="@dimen/screenrecord_option_padding" />
 
@@ -78,4 +79,44 @@
             android:layout_weight="0"
             android:contentDescription="@string/quick_settings_screen_record_label" />
     </LinearLayout>
+
+    <!-- Bug Report Switch -->
+    <LinearLayout
+        android:id="@+id/bugreport_switch_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/qqs_layout_margin_top"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:layout_width="@dimen/screenrecord_option_icon_size"
+            android:layout_height="@dimen/screenrecord_option_icon_size"
+            android:layout_weight="0"
+            android:src="@drawable/ic_bugreport"
+            app:tint="?androidprv:attr/materialColorOnSurface"
+            android:importantForAccessibility="no"
+            android:layout_gravity="center"
+            android:layout_marginEnd="@dimen/screenrecord_option_padding" />
+
+        <TextView
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:minHeight="@dimen/screenrecord_option_icon_size"
+            android:layout_weight="1"
+            android:layout_gravity="fill_vertical"
+            android:gravity="center"
+            android:text="@string/qs_record_issue_bug_report"
+            android:textAppearance="@style/TextAppearance.Dialog.Body.Message"
+            android:importantForAccessibility="no"/>
+
+        <Switch
+            android:id="@+id/bugreport_switch"
+            android:layout_width="wrap_content"
+            android:minHeight="@dimen/screenrecord_option_icon_size"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:layout_gravity="fill_vertical"
+            android:layout_weight="0"
+            android:contentDescription="@string/qs_record_issue_bug_report" />
+    </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml b/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml
index 1e5b249..8c31713 100644
--- a/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml
+++ b/packages/SystemUI/res/layout/screen_share_dialog_spinner_item_text.xml
@@ -30,7 +30,7 @@
         android:ellipsize="marquee"
         android:singleLine="true"
         android:textAppearance="?android:attr/textAppearanceMedium"
-        android:textColor="?androidprv:attr/textColorOnAccent" />
+        android:textColor="@color/menu_item_text" />
 
     <TextView
         android:id="@android:id/text2"
@@ -39,6 +39,6 @@
         android:ellipsize="marquee"
         android:singleLine="true"
         android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="?androidprv:attr/colorError" />
+        android:textColor="?androidprv:attr/materialColorError" />
 
 </LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/screenshot_shelf.xml b/packages/SystemUI/res/layout/screenshot_shelf.xml
index ef1a21f..eeb64bd8 100644
--- a/packages/SystemUI/res/layout/screenshot_shelf.xml
+++ b/packages/SystemUI/res/layout/screenshot_shelf.xml
@@ -28,7 +28,7 @@
         android:elevation="4dp"
         android:background="@drawable/action_chip_container_background"
         android:layout_marginStart="@dimen/overlay_action_container_margin_horizontal"
-        android:layout_marginBottom="@dimen/overlay_action_container_margin_bottom"
+        android:layout_marginBottom="@dimen/screenshot_shelf_vertical_margin"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="@+id/actions_container"
         app:layout_constraintEnd_toEndOf="@+id/actions_container"
@@ -38,43 +38,35 @@
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginEnd="@dimen/overlay_action_container_margin_horizontal"
-        android:paddingEnd="@dimen/overlay_action_container_padding_end"
+        android:paddingHorizontal="@dimen/overlay_action_container_padding_end"
         android:paddingVertical="@dimen/overlay_action_container_padding_vertical"
         android:elevation="4dp"
         android:scrollbars="none"
         app:layout_constraintHorizontal_bias="0"
         app:layout_constraintWidth_percent="1.0"
         app:layout_constraintWidth_max="wrap"
-        app:layout_constraintStart_toEndOf="@+id/screenshot_preview_border"
+        app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintBottom_toBottomOf="@id/actions_container_background">
         <LinearLayout
             android:id="@+id/screenshot_actions"
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content">
-            <include layout="@layout/overlay_action_chip"
-                     android:id="@+id/screenshot_share_chip"/>
-            <include layout="@layout/overlay_action_chip"
-                     android:id="@+id/screenshot_edit_chip"/>
-            <include layout="@layout/overlay_action_chip"
-                     android:id="@+id/screenshot_scroll_chip"
-                     android:visibility="gone" />
-        </LinearLayout>
+            android:layout_height="wrap_content" />
     </HorizontalScrollView>
     <View
         android:id="@+id/screenshot_preview_border"
         android:layout_width="0dp"
         android:layout_height="0dp"
-        android:layout_marginStart="16dp"
+        android:layout_marginStart="@dimen/overlay_action_container_margin_horizontal"
         android:layout_marginTop="@dimen/overlay_border_width_neg"
         android:layout_marginEnd="@dimen/overlay_border_width_neg"
-        android:layout_marginBottom="14dp"
+        android:layout_marginBottom="@dimen/screenshot_shelf_vertical_margin"
         android:elevation="8dp"
         android:background="@drawable/overlay_border"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="@id/screenshot_preview"
         app:layout_constraintEnd_toEndOf="@id/screenshot_preview"
-        app:layout_constraintBottom_toBottomOf="parent"/>
+        app:layout_constraintBottom_toTopOf="@id/actions_container"/>
     <ImageView
         android:id="@+id/screenshot_preview"
         android:layout_width="@dimen/overlay_x_scale"
diff --git a/packages/SystemUI/res/layout/super_notification_shade.xml b/packages/SystemUI/res/layout/super_notification_shade.xml
index c998535..221b791 100644
--- a/packages/SystemUI/res/layout/super_notification_shade.xml
+++ b/packages/SystemUI/res/layout/super_notification_shade.xml
@@ -120,10 +120,6 @@
         android:inflatedId="@+id/multi_shade"
         android:layout="@layout/multi_shade" />
 
-    <include layout="@layout/alternate_bouncer"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
-
     <com.android.systemui.biometrics.AuthRippleView
         android:id="@+id/auth_ripple"
         android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/raw/widget.rec b/packages/SystemUI/res/raw/widget.rec
new file mode 100644
index 0000000..a38b23b
--- /dev/null
+++ b/packages/SystemUI/res/raw/widget.rec
Binary files differ
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 9bc1445..2027d16 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Die neem van skermskote word deur jou IT-admin geblokkeer"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Wysig"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Wysig skermkiekie"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Deel"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Deel skermskoot"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Vang meer vas"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Maak skermkiekie toe"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Skandeer tans gesig"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Stuur"</string>
     <string name="cancel" msgid="1089011503403416730">"Kanselleer"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Applogo"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bevestig"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Probeer weer"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tik om stawing te kanselleer"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gesig is herken. Druk die ontsluitikoon om voort te gaan."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Gestaaf"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Kanselleer stawing"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Meer opsies"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gebruik PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gebruik patroon"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gebruik wagwoord"</string>
@@ -279,7 +282,7 @@
     <string name="quick_settings_bluetooth_secondary_label_input" msgid="3887552721233148132">"Invoer"</string>
     <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="5553051568867097111">"Gehoortoestelle"</string>
     <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"Skakel tans aan …"</string>
-    <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"Outo-draai"</string>
+    <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"Outodraai"</string>
     <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Outodraai skerm"</string>
     <string name="quick_settings_location_label" msgid="2621868789013389163">"Ligging"</string>
     <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Sluimerskerm"</string>
@@ -289,7 +292,7 @@
     <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Geblokkeer"</string>
     <string name="quick_settings_media_device_label" msgid="8034019242363789941">"Mediatoestel"</string>
     <string name="quick_settings_user_title" msgid="8673045967216204537">"Gebruiker"</string>
-    <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
+    <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-fi"</string>
     <string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
     <string name="quick_settings_networks_available" msgid="1875138606855420438">"Netwerke is beskikbaar"</string>
     <string name="quick_settings_networks_unavailable" msgid="1167847013337940082">"Netwerke is nie beskikbaar nie"</string>
@@ -360,11 +363,19 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standaard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medium"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Hoog"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Deblokkeer toestelmikrofoon?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Deblokkeer toestelkamera?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Deblokkeer toestelkamera en mikrofoon?"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Dit deblokkeer toegang vir alle programme en dienste wat toegelaat word om jou mikrofoon te gebruik."</string>
-    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Dit deblokkeer toegang vir alle programme en dienste wat toegelaat word om jou kamera te gebruik."</string>
+    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Dit deblokkeer toegang vir alle apps en dienste wat toegelaat word om jou mikrofoon te gebruik."</string>
+    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Dit deblokkeer toegang vir alle apps en dienste wat toegelaat word om jou kamera te gebruik."</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Dit deblokkeer toegang vir alle programme en dienste wat toegelaat word om jou kamera of mikrofoon te gebruik."</string>
     <string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Mikrofoon is geblokkeer"</string>
     <string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Kamera is geblokkeer"</string>
@@ -437,6 +448,10 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Verwyder"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Voeg legstuk by"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Klaar"</string>
+    <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+    <skip />
+    <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+    <skip />
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Laat enige legstuk op die sluitskerm toe?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Maak instellings oop"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Hervat werkapps?"</string>
@@ -538,10 +553,11 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Hierdie toestel word deur jou ouer bestuur. Jou ouer kan inligting sien en bestuur soos die programme wat jy gebruik, jou ligging en jou skermtyd."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Ontsluit gehou deur TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Diefstalbeskerming\nToestel gesluit; te veel pogings om te ontsluit"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Toestel is gesluit; te veel stawingpogings"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Toestel is gesluit\nKon nie staaf nie"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Klankinstellings"</string>
-    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Gee outomaties mediaopskrifte"</string>
+    <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Verskaf outomaties onderskrifte vir media"</string>
     <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"Maak wenk oor onderskrifte toe"</string>
     <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Onderskrifteoorlegger"</string>
     <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktiveer"</string>
@@ -583,10 +599,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Demp"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Saai uit"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Onbeskikbaar omdat luitoon gedemp is"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Onbeskikbaar want Moenie Steur Nie is aan"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Onbeskikbaar want Moenie Steur Nie is aan"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tik om te ontdemp."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tik om op vibreer te stel. Toeganklikheidsdienste kan dalk gedemp wees."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tik om te demp. Toeganklikheidsdienste kan dalk gedemp wees."</string>
@@ -603,16 +617,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibreer"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s volumekontroles"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Oproepe en kennisgewings sal lui (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Voer uitsetinstellings in"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Volumeglyers is uitgevou"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Volumeglyers is ingevou"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"demp %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"ontdemp %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> speel tans op"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Oudio sal speel op"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Stelsel-UI-ontvanger"</string>
@@ -759,7 +768,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Beweeg vorentoe deur onlangse apps"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Beweeg terug deur onlangse apps"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Maak appslys oop"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Wys taakbalk"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Maak instellings oop"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Maak Assistent oop"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Sluit skerm"</string>
@@ -768,6 +776,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Gaan by verdeelde skerm in met huidige app aan die regterkant"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Gaan by verdeelde skerm in met huidige app aan die linkerkant"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skakel oor van verdeelde skerm na volskerm"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Skakel oor na app regs of onder terwyl jy verdeelde skerm gebruik"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Skakel oor na app links of bo terwyl jy verdeelde skerm gebruik"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Tydens verdeelde skerm: verplaas ’n app van een skerm na ’n ander"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Invoer"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Skakel oor na volgende taal"</string>
@@ -894,12 +904,12 @@
     <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> loop tans"</string>
     <string name="instant_apps_message" msgid="6112428971833011754">"Program is oopgemaak sonder dat dit geïnstalleer is."</string>
     <string name="instant_apps_message_with_help" msgid="1816952263531203932">"Program is oopgemaak sonder dat dit geïnstalleer is. Tik om meer te wete te kom."</string>
-    <string name="app_info" msgid="5153758994129963243">"Programinligting"</string>
+    <string name="app_info" msgid="5153758994129963243">"Appinligting"</string>
     <string name="go_to_web" msgid="636673528981366511">"Gaan na blaaier"</string>
     <string name="mobile_data" msgid="4564407557775397216">"Mobiele data"</string>
     <string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string>
     <string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
-    <string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi is af"</string>
+    <string name="wifi_is_off" msgid="5389597396308001471">"Wi-fi is af"</string>
     <string name="bt_is_off" msgid="7436344904889461591">"Bluetooth is af"</string>
     <string name="dnd_is_off" msgid="3185706903793094463">"Moenie Steur Nie is af"</string>
     <string name="dnd_is_on" msgid="7009368176361546279">"Moenie Steur Nie is aan"</string>
@@ -1075,7 +1085,7 @@
     <string name="controls_error_removed" msgid="6675638069846014366">"Nie gekry nie"</string>
     <string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrole is nie beskikbaar nie"</string>
     <string name="controls_error_removed_message" msgid="2885911717034750542">"Kon nie by <xliff:g id="DEVICE">%1$s</xliff:g> ingaan nie. Gaan die <xliff:g id="APPLICATION">%2$s</xliff:g>-program na om seker te maak dat die kontrole steeds beskikbaar is en dat die programinstellings nie verander het nie."</string>
-    <string name="controls_open_app" msgid="483650971094300141">"Maak program oop"</string>
+    <string name="controls_open_app" msgid="483650971094300141">"Maak app oop"</string>
     <string name="controls_error_generic" msgid="352500456918362905">"Kan nie status laai nie"</string>
     <string name="controls_error_failed" msgid="960228639198558525">"Fout, probeer weer"</string>
     <string name="controls_menu_add" msgid="4447246119229920050">"Voeg kontroles by"</string>
@@ -1239,7 +1249,7 @@
     <string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Minstens een toestel of toestelpaneel is beskikbaar"</string>
     <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Kies ’n versteknotasapp om die notaneemkortpad te gebruik"</string>
     <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Kies app"</string>
-    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Raak en hou kortpad"</string>
+    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Raak-en-hou-kortpad"</string>
     <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Kanselleer"</string>
     <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Wissel skerms nou"</string>
     <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Ontvou foon"</string>
@@ -1266,8 +1276,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera is geblokkeer"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera en mikrofoon is geblokkeer"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoon is geblokkeer"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Moenie steur nie"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Gebruikerteenwoordigheid is bespeur"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Stel versteknotasapp in Instellings"</string>
     <string name="install_app" msgid="5066668100199613936">"Installeer app"</string>
diff --git a/packages/SystemUI/res/values-af/tiles_states_strings.xml b/packages/SystemUI/res/values-af/tiles_states_strings.xml
index 1427574..8f0532e 100644
--- a/packages/SystemUI/res/values-af/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-af/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Af"</item>
     <item msgid="5137565285664080143">"Aan"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index c333483..a3700f2 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ቅጽበታዊ ገፅ እይታዎችን ማንሳት በእርስዎ አይቲ አስተዳዳሪ ታግዷል"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"አርትዕ ያድርጉ"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"ቅጽበታዊ ገፅ ዕይታን አርትዕ ያድርጉ"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"አጋራ"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"ቅጽበታዊ ገፅ እይታን ያጋሩ"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"ተጨማሪ ይቅረጹ"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ቅጽበታዊ ገፅ ዕይታን አሰናብት"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"የቅኝት ፊት"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ላክ"</string>
     <string name="cancel" msgid="1089011503403416730">"ይቅር"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"የመተግበሪያ ዓርማ"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"አረጋግጥ"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"እንደገና ይሞክሩ"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ማረጋገጥን ለመሰረዝ መታ ያድርጉ"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"መልክ ተለይቶ ታውቋል። ለመቀጠል የመክፈቻ አዶውን ይጫኑ።"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"የተረጋገጠ"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ማረጋገጥን ሰርዝ"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ተጨማሪ አማራጮች"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ፒን ይጠቀሙ"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ሥርዓተ ጥለትን ተጠቀም"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"የይለፍ ቃልን ተጠቀም"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"መደበኛ"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"መካከለኛ"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"ከፍተኛ"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"የመስሚያ መሣሪያዎች"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"የመሣሪያ ማይክሮፎን እገዳ ይነሳ?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"የመሣሪያ ካሜራ እገዳ ይነሳ?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"የመሣሪያ ካሜራ እና ማይክሮፎን እገዳ ይነሳ?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"አስወግድ"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ምግብር አክል"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ተከናውኗል"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"ምግብሮችን ያክሉ"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"ጡባዊዎን ሳይከፍቱ የሚወዷቸው የመተግበሪያ ምግብሮች ፈጣን መዳረሻን ያግኙ።"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"በማያ ገጽ ቁልፍ ላይ ማንኛውንም ምግብር ይፈቀድ?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"ቅንብሮችን ክፈት"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"የሥራ መተግበሪያዎች ከቆሙበት ይቀጥሉ?"</string>
@@ -538,7 +550,8 @@
     <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="1265107698772588299">"የስርቆት መከላከያ\nመሳሪያ ተቆልፏል፣ በጣም ብዙ የመክፈት ሙከራዎች"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"መሣሪያው ተቆልፏል፣ ከልክ በላይ ብዙ የማረጋገጫ ሙከራዎች"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"መሣሪያው ተቆልፏል\nማረጋገጥ አልተሳካም"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>። <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"የድምፅ ቅንብሮች"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"ራስሰር የሥዕል መግለጫ ጽሑፍን ሚዲያ"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ድምጸ-ከል አድርግ"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"የጥሪ ድምጽ ስለተዘጋ አይገኝም"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"አትረብሽ ስለበራ አይገኝም"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"አትረብሽ ስለበራ አይገኝም"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s። ወደ ንዝረት ለማቀናበር መታ ያድርጉ። የተደራሽነት አገልግሎቶች ድምጸ-ከል ሊደረግባቸው ይችላል።"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ። የተደራሽነት አገልግሎቶች ድምጸ-ከል ሊደረግባቸው ይችላል።"</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ንዘር"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s የድምፅ መቆጣጠሪያዎች"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ጥሪዎች እና ማሳወቂያዎች (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>) ላይ ይደውላሉ"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"የውጽዓት ቅንብሮችን ያስገቡ"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"የድምጽ ተንሸራታቾች ተዘርግቷል"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"የድምጽ ተንሸራታቾች ተሰብስቧል"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s ላይ ድምፀ-ከል አድርግ"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"የ%s ድምፀ-ከል አንሳ"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> እየተጫወተ ያለው በ"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"ኦዲዮ ይጫወታል በ"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"የስርዓት በይነገጽ መቃኛ"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"የቅርብ ጊዜ መተግበሪያዎች ላይ ወደ ፊት ዑደት ማድረግ።"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"የቅርብ ጊዜ መተግበሪያዎች ላይ ወደ ኋላ ዑደት ማድረግ።"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"የመተግበሪያ ዝርዝር ክፈት"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"የተግባር አሞሌን አሳይ"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"ቅንብሮችን ክፈት"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"ረዳትን ክፈት"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"ማያ ገፅ ቁልፍ"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"ለአርኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገጽ ግባ"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"ለኤልኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገጽ ይግቡ"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"ከየተከፈለ ማያ ገጽ ወደ ሙሉ ገጽ ዕይታ ቀይር"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"የተከፈለ ማያ ገጽን ሲጠቀሙ በቀኝ ወይም ከታች ወዳለ መተግበሪያ ይቀይሩ"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"የተከፈለ ማያ ገጽን ሲጠቀሙ በቀኝ ወይም ከላይ ወዳለ መተግበሪያ ይቀይሩ"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"በተከፈለ ማያ ገጽ ወቅት፡- መተግበሪያን ከአንዱ ወደ ሌላው ተካ"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ግቤት"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"ወደ ቀጣዩ ቋንቋ ቀይር"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ካሜራ ታግዷል"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ካሜራ እና ማይክሮፎን ታግደዋል"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ማይክሮፎን ታግዷል"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"አትረብሽ"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"የተጠቃሚ ተገኝነት ታውቋል"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"በቅንብሮች ውስጥ ነባሪ የማስታወሻዎች መተግበሪያን ያቀናብሩ"</string>
     <string name="install_app" msgid="5066668100199613936">"መተግበሪያን ጫን"</string>
diff --git a/packages/SystemUI/res/values-am/tiles_states_strings.xml b/packages/SystemUI/res/values-am/tiles_states_strings.xml
index ab0b68b..a3c590c 100644
--- a/packages/SystemUI/res/values-am/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-am/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"ጠፍቷል"</item>
     <item msgid="5137565285664080143">"በርቷል"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"አይገኝም"</item>
+    <item msgid="3079622119444911877">"አጥፋ"</item>
+    <item msgid="3028994095749238254">"አብራ"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 9a36bcf..767e909 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"حَظَر مشرف تكنولوجيا المعلومات عملية أخذ لقطات للشاشة."</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"تعديل"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"تعديل لقطة الشاشة"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"مشاركة"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"مشاركة لقطة الشاشة"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"التقاط المزيد من المحتوى"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"إغلاق لقطة الشاشة"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"مسح الوجه"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"إرسال"</string>
     <string name="cancel" msgid="1089011503403416730">"إلغاء"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"شعار التطبيق"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"تأكيد"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"إعادة المحاولة"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"انقر لإلغاء المصادقة."</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"تم التعرّف على الوجه. للمتابعة، اضغط على رمز فتح القفل."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"مصادقة"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"إلغاء المصادقة"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"مزيد من الخيارات"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"استخدام رقم تعريف شخصي"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"استخدام نقش"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"استخدام كلمة المرور"</string>
@@ -262,7 +265,7 @@
     <string name="quick_settings_dnd_label" msgid="7728690179108024338">"عدم الإزعاج"</string>
     <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"بلوتوث"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"لا يتوفر أي أجهزة مقترنة"</string>
-    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"انقر لربط جهاز أو إلغاء ربطه."</string>
+    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"انقر لربط جهاز أو إلغاء ربطه"</string>
     <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"إقران جهاز جديد"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"عرض الكل"</string>
     <string name="turn_on_bluetooth" msgid="5681370462180289071">"استخدام البلوتوث"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"عادي"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"متوسط"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"مرتفع"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"هل تريد إزالة حظر ميكروفون الجهاز؟"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"هل تريد إزالة حظر كاميرا الجهاز؟"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"هل تريد إزالة حظر الكاميرا والميكروفون؟"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"إزالة"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"إضافة تطبيق مصغّر"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"تم"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"إضافة تطبيقات مصغّرة"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"يمكنك الوصول سريعًا إلى تطبيقاتك المصغّرة المفضّلة بدون فتح قفل جهازك اللوحي."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"هل تريد السماح بعرض أي تطبيق مصغّر على شاشة القفل؟"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"فتح الإعدادات"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"أتريد إعادة تفعيل تطبيقات العمل؟"</string>
@@ -449,7 +462,7 @@
     <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"البدء من جديد"</string>
     <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"نعم، متابعة"</string>
     <string name="guest_notification_app_name" msgid="2110425506754205509">"وضع الضيف"</string>
-    <string name="guest_notification_session_active" msgid="5567273684713471450">"أنت تستخدِم وضع الضيف."</string>
+    <string name="guest_notification_session_active" msgid="5567273684713471450">"أنت تستخدِم وضع الضيف"</string>
     <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"ستؤدي إضافة مُستخدِم جديد إلى الخروج من وضع الضيف وحذف كل التطبيقات والبيانات من جلسة الضيف الحالية."</string>
     <string name="user_limit_reached_title" msgid="2429229448830346057">"تم الوصول إلى أقصى عدد للمستخدمين"</string>
     <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{يمكن إنشاء مستخدم واحد فقط.}zero{يمكنك إضافة ما يصل إلى # مستخدم}two{يمكنك إضافة ما يصل إلى مستخدمَين}few{يمكنك إضافة ما يصل إلى # مستخدمِين}many{يمكنك إضافة ما يصل إلى # مستخدمًا}other{يمكنك إضافة ما يصل إلى # مستخدم}}"</string>
@@ -492,7 +505,7 @@
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"محو جميع الإشعارات الصامتة"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"تم إيقاف الإشعارات مؤقتًا وفقًا لإعداد \"عدم الإزعاج\""</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"البدء الآن"</string>
-    <string name="empty_shade_text" msgid="8935967157319717412">"ما مِن إشعارات."</string>
+    <string name="empty_shade_text" msgid="8935967157319717412">"ما مِن إشعارات"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"ما مِن إشعارات جديدة"</string>
     <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"افتَح قفل الشاشة لعرض الإشعارات الأقدم."</string>
     <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"يتولّى أحد الوالدين إدارة هذا الجهاز."</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"يتولّى أحد الوالدين إدارة هذا الجهاز. يمكن للوالدين عرض وإدارة معلوماتك، مثلاً التطبيقات التي تستخدمها وموقعك الجغرافي ووقت النظر إلى الشاشة."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"شبكة افتراضية خاصة"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"‏فتح القفل باستمرار بواسطة TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"تم قفل الجهاز\nلحمايته من السرقة بسبب إجراء العديد من محاولات إلغاء القفل."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"تم قفل الجهاز بسبب إجراء العديد من محاولات المصادقة"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"تم قفل الجهاز\nتعذّرت المصادقة"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"إعدادات الصوت"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"شرح تلقائي للوسائط"</string>
@@ -582,11 +596,9 @@
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"اهتزاز"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"كتم الصوت"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"البثّ"</string>
-    <string name="stream_notification_unavailable" msgid="4313854556205836435">"يتعذّر التغيير بسبب كتم صوت الرنين."</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_notification_unavailable" msgid="4313854556205836435">"غير متاح بسبب كتم صوت الرنين"</string>
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"مستوى الصوت غير متاح بسبب تفعيل وضع \"عدم الإزعاج\""</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"مستوى الصوت غير متاح لأنّ وضع \"عدم الإزعاج\" مفعّل"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"‏%1$s. انقر لإلغاء التجاهل."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"‏%1$s. انقر للتعيين على الاهتزاز. قد يتم تجاهل خدمات \"سهولة الاستخدام\"."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"‏%1$s. انقر للتجاهل. قد يتم تجاهل خدمات \"سهولة الاستخدام\"."</string>
@@ -594,8 +606,8 @@
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"‏%1$s. انقر لكتم الصوت."</string>
     <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"التحكُّم في مستوى الضجيج"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"الصوت المكاني"</string>
-    <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"إيقاف"</string>
-    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"مفعّل"</string>
+    <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"غير مفعّل"</string>
+    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"تفعيل"</string>
     <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"تتبُّع حركة الرأس"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"انقر لتغيير وضع الرنين."</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"كتم الصوت"</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"اهتزاز"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"‏%s عنصر للتحكم في مستوى الصوت"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"سيصدر الهاتف رنينًا عند تلقي المكالمات والإشعارات (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)."</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"الدخول إلى إعدادات إخراج الصوت"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"تم توسيع أشرطة تمرير الصوت"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"تم تصغير أشرطة تمرير الصوت"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"‏كتم صوت \"%s\""</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"‏إعادة صوت \"%s\""</string>
     <string name="media_output_label_title" msgid="872824698593182505">"تشغيل <xliff:g id="LABEL">%s</xliff:g> على"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"سيتم تشغيل الصوت على"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"أداة ضبط واجهة مستخدم النظام"</string>
@@ -625,7 +632,7 @@
     <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>
-    <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"انقر لفتح قفل الجهاز."</string>
+    <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"انقر لفتح قفل الجهاز"</string>
     <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"جارٍ تحديث تطبيق المحفظة"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"فتح القفل للاستخدام"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"حدثت مشكلة أثناء الحصول على البطاقات، يُرجى إعادة المحاولة لاحقًا."</string>
@@ -671,7 +678,7 @@
     <string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"‏&lt;b&gt;الحالة:&lt;/b&gt; تم خفض الترتيب"</string>
     <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"تظهر في أعلى إشعارات المحادثات وكصورة ملف شخصي على شاشة القفل."</string>
     <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"تظهر في أعلى إشعارات المحادثات وكصورة ملف شخصي على شاشة القفل وتظهر على شكل فقاعة."</string>
-    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"تظهر في أعلى إشعارات المحادثات وكصورة ملف شخصي على شاشة القفل، وتقاطع ميزة \"عدم الإزعاج\"."</string>
+    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"تظهر في أعلى إشعارات المحادثات وكصورة ملف شخصي على شاشة القفل، وتُقاطع ميزة \"عدم الإزعاج\""</string>
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"تظهر في أعلى إشعارات المحادثات وكصورة ملف شخصي على شاشة القفل وتظهر على شكل فقاعة لمقاطعة ميزة \"عدم الإزعاج\"."</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"الأولوية"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"لا يدعم تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> ميزات المحادثات."</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"التنقّل للأمام بين التطبيقات المُستخدَمة مؤخرًا"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"التنقّل للوراء بين التطبيقات المُستخدَمة مؤخرًا"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"فتح قائمة التطبيقات"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"عرض شريط التطبيقات"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"فتح الإعدادات"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"‏فتح \"مساعد Google\""</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"شاشة القفل"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"تفعيل وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يسار الشاشة"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"تفعيل وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يمين الشاشة"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"التبديل من وضع \"تقسيم الشاشة\" إلى وضع \"ملء الشاشة\""</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"التبديل إلى التطبيق على اليسار أو الأسفل أثناء استخدام \"تقسيم الشاشة\""</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"التبديل إلى التطبيق على اليمين أو الأعلى أثناء استخدام \"تقسيم الشاشة\""</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"استبدال تطبيق بآخر في وضع \"تقسيم الشاشة\""</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"إدخال"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"التبديل إلى اللغة التالية"</string>
@@ -1116,8 +1124,8 @@
     <string name="build_number_copy_toast" msgid="877720921605503046">"تم نسخ رقم الإصدار إلى الحافظة."</string>
     <string name="basic_status" msgid="2315371112182658176">"محادثة مفتوحة"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"التطبيقات المصغّرة للمحادثات"</string>
-    <string name="select_conversation_text" msgid="3376048251434956013">"انقر على محادثة لإضافتها إلى \"الشاشة الرئيسية\"."</string>
-    <string name="no_conversations_text" msgid="5354115541282395015">"ستظهر هنا المحادثات الحديثة."</string>
+    <string name="select_conversation_text" msgid="3376048251434956013">"انقر على محادثة لإضافتها إلى \"الشاشة الرئيسية\""</string>
+    <string name="no_conversations_text" msgid="5354115541282395015">"ستظهر هنا المحادثات الحديثة"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"المحادثات ذات الأولوية"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"المحادثات الحديثة"</string>
     <string name="days_timestamp" msgid="5821854736213214331">"قبل <xliff:g id="DURATION">%1$s</xliff:g> يوم"</string>
@@ -1152,7 +1160,7 @@
     <string name="person_available" msgid="2318599327472755472">"متاح"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"حدثت مشكلة أثناء قراءة مقياس مستوى شحن البطارية."</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"انقر للحصول على مزيد من المعلومات."</string>
-    <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"لم يتم ضبط منبّه."</string>
+    <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"لم يتم ضبط منبّه"</string>
     <string name="accessibility_bouncer" msgid="5896923685673320070">"إدخال الرمز لفتح القفل"</string>
     <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"مستشعر بصمات الإصبع"</string>
     <string name="accessibility_authenticate_hint" msgid="798914151813205721">"المصادقة"</string>
@@ -1165,7 +1173,7 @@
     <string name="mobile_data_connection_active" msgid="944490013299018227">"متصلة بالإنترنت"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"متصلة مؤقتًا"</string>
     <string name="mobile_data_poor_connection" msgid="819617772268371434">"الاتصال ضعيف"</string>
-    <string name="mobile_data_off_summary" msgid="3663995422004150567">"لن يتم تلقائيًا الاتصال ببيانات الجوّال."</string>
+    <string name="mobile_data_off_summary" msgid="3663995422004150567">"لن يتم تلقائيًا الاتصال ببيانات الجوّال"</string>
     <string name="mobile_data_no_connection" msgid="1713872434869947377">"لا يتوفّر اتصال بالإنترنت"</string>
     <string name="non_carrier_network_unavailable" msgid="770049357024492372">"لا تتوفّر شبكات أخرى."</string>
     <string name="all_network_unavailable" msgid="4112774339909373349">"لا تتوفّر أي شبكات."</string>
@@ -1239,7 +1247,7 @@
     <string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• توفُّر جهاز واحد أو لوحة جهاز واحدة على الأقل"</string>
     <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"اختَر تطبيقًا تلقائيًا لتدوين الملاحظات لاستخدام اختصار تدوين الملاحظات."</string>
     <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"اختيار تطبيق"</string>
-    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"انقر مع الاستمرار على الاختصار."</string>
+    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"انقر مع الاستمرار على الاختصار"</string>
     <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"إلغاء"</string>
     <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"تبديل الشاشتَين الآن"</string>
     <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"فتح الهاتف"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"استخدام الكاميرا محظور."</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"استخدام الكاميرا والميكروفون محظور."</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"استخدام الميكروفون محظور."</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"عدم الإزعاج"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"تم رصد تواجد المستخدم."</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"يمكنك ضبط تطبيق تدوين الملاحظات التلقائي في \"الإعدادات\"."</string>
     <string name="install_app" msgid="5066668100199613936">"تثبيت التطبيق"</string>
diff --git a/packages/SystemUI/res/values-ar/tiles_states_strings.xml b/packages/SystemUI/res/values-ar/tiles_states_strings.xml
index 364737d..307a26e 100644
--- a/packages/SystemUI/res/values-ar/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ar/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"الخيار غير مفعَّل"</item>
     <item msgid="5137565285664080143">"الخيار مفعَّل"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index a211d1e..5a083ab 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"স্ক্ৰীনশ্বট লোৱাটো আপোনাৰ আইটি প্ৰশাসকে অৱৰোধ কৰিছে"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"সম্পাদনা কৰক"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"স্ক্ৰীনশ্বট সম্পাদনা কৰক"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"শ্বেয়াৰ কৰক"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"স্ক্ৰীনশ্বট শ্বেয়াৰ কৰক"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"অধিক কেপচাৰ কৰক"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"স্ক্ৰীনশ্বট অগ্ৰাহ্য কৰক"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"চেহেৰা স্কেন কৰি থকা হৈছে"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"পঠিয়াওক"</string>
     <string name="cancel" msgid="1089011503403416730">"বাতিল কৰক"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"এপৰ ল’গ’"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"নিশ্চিত কৰক"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"আকৌ চেষ্টা কৰক"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ বাতিল কৰিবলৈ টিপক"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"মুখাৱয়ব চিনাক্ত কৰা হৈছে। অব্যাহত ৰাখিবলৈ আনলক কৰক চিহ্নটোত টিপক।"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰা হ’ল"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ বাতিল কৰক"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"অধিক বিকল্প"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"পিন ব্যৱহাৰ কৰক"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"আৰ্হি ব্যৱহাৰ কৰক"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"পাছৱৰ্ড ব্যৱহাৰ কৰক"</string>
@@ -262,7 +265,7 @@
     <string name="quick_settings_dnd_label" msgid="7728690179108024338">"অসুবিধা নিদিব"</string>
     <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ব্লুটুথ"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"কোনো যোৰা লগোৱা ডিভাইচ উপলব্ধ নহয়।"</string>
-    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"এটা ডিভাইচৰ সংযোগ কৰিবলৈ অথবা ডিভাইচটোৰ সৈতে সংযোগ বিচ্ছিন্ন কৰিবলৈ টিপক"</string>
+    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"ডিভাইচ সংযোগ কৰিবলৈ অথবা সংযোগ বিচ্ছিন্ন কৰিবলৈ টিপক"</string>
     <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"নতুন ডিভাইচ পেয়াৰ কৰক"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"আটাইবোৰ চাওক"</string>
     <string name="turn_on_bluetooth" msgid="5681370462180289071">"ব্লুটুথ ব্যৱহাৰ কৰক"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"মানক"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"মধ্যমীয়া"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"উচ্চ"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"শুনাৰ ডিভাইচ"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ডিভাইচৰ মাইক্ৰ\'ফ\'ন অৱৰোধৰ পৰা আঁতৰাবনে?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ডিভাইচৰ কেমেৰা অৱৰোধৰ পৰা আঁতৰাবনে?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ডিভাইচৰ কেমেৰা আৰু মাইক্ৰ\'ফ\'ন অৱৰোধৰ পৰা আঁতৰাবনে?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"আঁতৰাওক"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ৱিজেট যোগ দিয়ক"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"কৰা হ’ল"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"ৱিজেট যোগ দিয়ক"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"আপোনাৰ টেবলেটটো আনলক নকৰাকৈ আপোনাৰ প্ৰিয় এপৰ ৱিজেটসমূহলৈ ক্ষিপ্ৰভাৱে এক্সেছ পাওক।"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"লক স্ক্ৰীনত যিকোনো ৱিজেটৰ অনুমতি দিবনে?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"ছেটিং খোলক"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"কাম সম্পৰ্কীয় এপ্ আনপজ কৰিবনে?"</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"এই ডিভাইচটো আপোনাৰ অভিভাৱকে পৰিচালনা কৰে। আপোনাৰ অভিভাৱকে আপুনি ব্যৱহাৰ কৰা এপ্‌, আপোনাৰ অৱস্থান আৰু আপুনি ডিভাইচত অতিবাহিত কৰা সময়ৰ দৰে তথ্য চাব আৰু পৰিচালনা কৰিব পাৰে।"</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"ভিপিএন"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgentএ আনলক কৰি ৰাখিছে"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"চুৰিৰ পৰা সুৰক্ষা\nডিভাইচ লক আছে, বহুবাৰ আনলকৰ চেষ্টা কৰা হৈছে"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ডিভাইচ লক কৰা হৈছে, বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ অতি বেছিসংখ্যক প্ৰয়াস"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ডিভাইচ লক কৰা হৈছে\nবিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰিব পৰা নগ’ল"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ধ্বনিৰ ছেটিং"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"স্বয়ংক্ৰিয় কেপশ্বন মিডিয়া"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"মিউট"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"কাষ্ট কৰক"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"ৰিং মিউট কৰি থোৱাৰ বাবে উপলব্ধ নহয়"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"অসুবিধা নিদিব অন থকাৰ কাৰণে উপলব্ধ নহয়"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"অসুবিধা নিদিব অন থকাৰ কাৰণে উপলব্ধ নহয়"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s। আনমিউট কৰিবৰ বাবে টিপক।"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s। কম্পনৰ বাবে টিপক। দিব্য়াংগসকলৰ বাবে থকা সেৱা মিউট হৈ থাকিব পাৰে।"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s। মিউট কৰিবলৈ টিপক। দিব্য়াংগসকলৰ বাবে থকা সেৱা মিউট হৈ থাকিব পাৰে।"</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"কম্পন কৰক"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s ধ্বনি নিয়ন্ত্ৰণসমূহ"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"কল আৰু জাননীবোৰ ইমান ভলিউমত বাজিব (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"আউটপুট ছেটিং খোলক"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"ভলিউমৰ শ্লাইডাৰ বিস্তাৰ কৰা আছে"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"ভলিউমৰ শ্লাইডাৰ সংকোচন কৰা আছে"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s মিউট কৰক"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s আনমিউট কৰক"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"ইয়াত <xliff:g id="LABEL">%s</xliff:g> প্লে’ হৈ আছে"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"অডিঅ’ ইয়াত প্লে’ হ’ব"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"শেহতীয়া এপ্‌সমূহ আগলৈ এটা এটাকৈ চাওক"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"শেহতীয়া এপ্‌সমূহ পিছলৈ এটা এটাকৈ চাওক"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"এপৰ সূচী খোলক"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"টাস্কবাৰ দেখুৱাওক"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"ছেটিং খোলক"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant খোলক"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"লক স্ক্ৰীন"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ সোঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ বাওঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"বিভাজিত স্ক্ৰীনৰ পৰা পূৰ্ণ স্ক্ৰীনলৈ সলনি কৰক"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰাৰ সময়ত সোঁফালে অথবা তলত থকা এপলৈ সলনি কৰক"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰাৰ সময়ত বাওঁফালে অথবা ওপৰত থকা এপলৈ সলনি কৰক"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"বিভাজিত স্ক্ৰীনৰ ব্যৱহাৰ কৰাৰ সময়ত: কোনো এপ্ এখন স্ক্ৰীনৰ পৰা আনখনলৈ নিয়ক"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ইনপুট"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"পৰৱৰ্তী ভাষাটোলৈ সলনি কৰক"</string>
@@ -900,7 +907,7 @@
     <string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string>
     <string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
     <string name="wifi_is_off" msgid="5389597396308001471">"ৱাই-ফাই অফ অৱস্থাত আছে"</string>
-    <string name="bt_is_off" msgid="7436344904889461591">"ব্লুটুথ অফ অৱস্থাত আছে"</string>
+    <string name="bt_is_off" msgid="7436344904889461591">"ব্লুটুথ অফ আছে"</string>
     <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>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"কেমেৰা অৱৰোধ কৰা আছে"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"কেমেৰা আৰু মাইক্ৰ’ফ’ন অৱৰোধ কৰা আছে"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"মাইক্ৰ’ফ’ন অৱৰোধ কৰা আছে"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"অসুবিধা নিদিব"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"ব্যৱহাৰকাৰীৰ উপস্থিতি চিনাক্ত কৰা হৈছে"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ছেটিঙত টোকাৰ ডিফ’ল্ট এপ্ ছেট কৰক"</string>
     <string name="install_app" msgid="5066668100199613936">"এপ্‌টো ইনষ্টল কৰক"</string>
diff --git a/packages/SystemUI/res/values-as/tiles_states_strings.xml b/packages/SystemUI/res/values-as/tiles_states_strings.xml
index 767b34d..e978fe2 100644
--- a/packages/SystemUI/res/values-as/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-as/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"অফ আছে"</item>
     <item msgid="5137565285664080143">"অন আছে"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"উপলব্ধ নহয়"</item>
+    <item msgid="3079622119444911877">"অফ আছে"</item>
+    <item msgid="3028994095749238254">"অন আছে"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 0b0788a5..7faec8a 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Skrinşot çəkilməsi İT admininiz tərəfindən bloklanıb"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Redaktə edin"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Skrinşota düzəliş edin"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Paylaşın"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Skrinşotu paylaşın"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Genişləndirin"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekran şəklini ötürün"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Üzün skan edilməsi"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Göndərin"</string>
     <string name="cancel" msgid="1089011503403416730">"Ləğv edin"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Tətbiq loqosu"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Təsdiq"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Yenidən cəhd edin"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Doğrulanmanı ləğv etmək üçün toxunun"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Üz tanınıb. \"Kiliddən çıxar\" ikonasına basıb davam edin."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Doğrulandı"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"İdentifikasiyanı ləğv edin"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Digər seçimlər"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN istifadə edin"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Model istifadə edin"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Parol istifadə edin"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standart"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Orta"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Yüksək"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Cihaz mikrofonu blokdan çıxarılsın?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Cihaz kamerası blokdan çıxarılsın?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Cihaz kamerası və mikrofonu blokdan çıxarılsın?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Silin"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Vidcet əlavə edin"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hazırdır"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Vidcetlər əlavə edin"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Planşeti kiliddən çıxarmadan sevimli tətbiq vidcetlərinizə sürətli giriş əldə edin."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Kilid ekranında istənilən vidcetə icazə verilsin?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Ayarları açın"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"İş tətbiqi üzrə pauza bitsin?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Bu cihaz valideyniniz tərəfindən idarə olunur. Valideyniniz işlətdiyiniz tətbiqlər, məkanınız və ekran vaxtınız kimi bilgiləri görə və idarə edə bilər."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN (Virtual Şəxsi Şəbəkələr)"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent ilə açıq saxlayın"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Oğurluqdan qoruma\nCihaz kilidləndi. Çoxlu kilidaçma cəhdi"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Cihaz kilidlənib, həddindən çox identifikasiya cəhdi"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Cihaz kilidləndi\nDoğrulama uğursuz oldu"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Səs ayarları"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Avtomatik başlıq mediası"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Susdurun"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Yayım"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Zəng səssiz edildiyi üçün əlçatan deyil"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Narahat Etməyin aktiv olduğu üçün əlçatan deyil"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Narahat Etməyin aktiv olduğu üçün əlçatan deyil"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Səsli etmək üçün tıklayın."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Vibrasiyanı ayarlamaq üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiş ola bilər."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Səssiz etmək üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiş ola bilər."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrasiya"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s səs nəzarətləri"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Çağrı və bildirişlər zəng çalacaq (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Çıxış ayarlarını daxil edin"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Səs slayderləri genişləndirildi"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Səs slayderləri yığcamlaşdırıldı"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s seçimini səssiz edin"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s seçimini səssiz rejimdən çıxarın"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> tətbiqində oxudulur"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio oxudulacaq"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Son tətbiqlər boyunca irəli keçin"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Son tətbiqlər boyunca geri keçin"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Tətbiq siyahısını açın"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"İşləmə panelini göstərin"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ayarları açın"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistenti açın"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Kilid ekranı"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Cari tətbiq sağda olmaqla bölünmüş ekrana daxil olun"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Cari tətbiq solda olmaqla bölünmüş ekrana daxil olun"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bölünmüş ekrandan tam ekrana keçin"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Bölünmüş ekran istifadə edərkən sağda və ya aşağıda tətbiqə keçin"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Bölünmüş ekran istifadə edərkən solda və ya yuxarıda tətbiqə keçin"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Bölünmüş ekran rejimində: tətbiqi birindən digərinə dəyişin"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Daxiletmə"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Növbəti dilə keçin"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera bloklanıb"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera və mikrofon bloklanıb"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon bloklanıb"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Narahat etməyin"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"İstifadəçi mövcudluğu aşkarlandı"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ayarlarda defolt qeydlər tətbiqi ayarlayın"</string>
     <string name="install_app" msgid="5066668100199613936">"Tətbiqi quraşdırın"</string>
diff --git a/packages/SystemUI/res/values-az/tiles_states_strings.xml b/packages/SystemUI/res/values-az/tiles_states_strings.xml
index 3457a71..f390369 100644
--- a/packages/SystemUI/res/values-az/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-az/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Deaktiv"</item>
     <item msgid="5137565285664080143">"Aktiv"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 48caa06..cd5dc26 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"IT administrator blokira pravljenje snimaka ekrana"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Izmeni"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Izmenite snimak ekrana"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Delite"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Delite snimak ekrana"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimite još"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacite snimak ekrana"</string>
@@ -104,8 +105,8 @@
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrađujemo video snimka ekrana"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obaveštenje o sesiji snimanja ekrana je aktivno"</string>
     <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Želite da započnete snimanje?"</string>
-    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju dok snimate. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Kada snimate aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
+    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju dok snimate. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Kada snimate aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Započni snimanje"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Snimaj zvuk"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk uređaja"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Skeniranje lica"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Pošalji"</string>
     <string name="cancel" msgid="1089011503403416730">"Otkaži"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotip aplikacije"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potvrdi"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Probaj ponovo"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Dodirnite da biste otkazali potvrdu identiteta"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice prepoznato. Pritisnite ikonu otključavanja za nastavak."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Identitet je potvrđen"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Otkažite potvrdu identiteta"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Još opcija"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristite PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristite šablon"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Koristite lozinku"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardno"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Srednje"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Visoko"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Slušni aparati"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Želite da odblokirate mikrofon uređaja?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Želite da odblokirate kameru uređaja?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Želite da odblokirate kameru i mikrofon uređaja?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Ukloni"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodaj vidžet"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotovo"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Dodaj vidžete"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Brzo pristupajte omiljenim vidžetima za aplikacije bez otključavanja tableta."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Želite da dozvolite sve vidžete na zaključanom ekranu?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvori podešavanja"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Uključiti poslovne aplikacije?"</string>
@@ -464,17 +476,17 @@
     <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Jedna aplikacija"</string>
     <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Delite ili snimite aplikaciju"</string>
     <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Želite da počnete snimanje ili prebacivanje pomoću aplikacije <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Kada delite, snimate ili prebacujete, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Kada delite, snimate ili prebacujete aplikaciju, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Kada delite, snimate ili prebacujete, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Kada delite, snimate ili prebacujete aplikaciju, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Pokreni"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je onemogućila ovu opciju"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Želite da započnete prebacivanje?"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Kada prebacujete, Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Kada prebacujete aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Kada prebacujete, Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Kada prebacujete aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Započni prebacivanje"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Želite da počnete da delite?"</string>
-    <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kada delite, snimate ili prebacujete, Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
-    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kada delite, snimate ili prebacujete aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
+    <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kada delite, snimate ili prebacujete, Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
+    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kada delite, snimate ili prebacujete aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
     <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Pokreni"</string>
     <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Deljenje se zaustavlja kada menjate aplikacije"</string>
     <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Deli ovu aplikaciju"</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Ovim uređajem upravlja roditelj. Roditelj može da vidi informacije, kao što su aplikacije koje koristiš, tvoju lokaciju i vreme ispred ekrana, i da upravlja njima."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Pouzdani agent sprečava zaključavanje"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Zaštita od krađe\nZaklj. uređaj, previše pokušaja otključavanja"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Uređaj je zaključan, previše pokušaja potvrde identiteta"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Uređaj je zaključan\nPotvrda identiteta nije uspela"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Podešavanja zvuka"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatski titl za medije"</string>
@@ -583,16 +596,14 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Isključi zvuk"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Prebacivanje"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nedostupno jer je zvuk isključen"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nedostupno jer je uključen režim Ne uznemiravaj"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Nedostupno jer je uključen režim Ne uznemiravaj"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Dodirnite da biste uključili zvuk."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Dodirnite da biste podesili na vibraciju. Zvuk usluga pristupačnosti će možda biti isključen."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Dodirnite da biste isključili zvuk. Zvuk usluga pristupačnosti će možda biti isključen."</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Dodirnite da biste podesili na vibraciju."</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Dodirnite da biste isključili zvuk."</string>
-    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kontrola šuma"</string>
+    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kontrola buke"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Prostorni zvuk"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Isključeno"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fiksno"</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibracija"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Kontrole za jačinu zvuka za %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Melodija zvona za pozive i obaveštenja je uključena (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Unesite podešavanja izlaznog signala"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Klizači za jačinu zvuka su prošireni"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Klizači za jačinu zvuka su skupljeni"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"isključite zvuk za: %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"uključite zvuk za: %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> se pušta na"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk se pušta na"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Tjuner za korisnički interfejs sistema"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Pregledaj nedavno korišćene aplikacije unapred"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Pregledaj nedavno korišćene aplikacije unazad"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvori listu aplikacija"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Prikaži traku zadataka"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvori podešavanja"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvori pomoćnika"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Zaključavanje ekrana"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Pokreni podeljeni ekran za aktuelnu aplikaciju na desnoj strani"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Pokreni podeljeni ekran za aktuelnu aplikaciju na levoj strani"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Pređi sa podeljenog ekrana na ceo ekran"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Pređite u aplikaciju zdesna ili ispod dok koristite podeljeni ekran"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Pređite u aplikaciju sleva ili iznad dok koristite podeljeni ekran"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"U režimu podeljenog ekrana: zamena jedne aplikacije drugom"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Pređi na sledeći jezik"</string>
@@ -1153,7 +1160,7 @@
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem sa očitavanjem merača baterije"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dodirnite za više informacija"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nije podešen"</string>
-    <string name="accessibility_bouncer" msgid="5896923685673320070">"unesite zaključavanje ekrana"</string>
+    <string name="accessibility_bouncer" msgid="5896923685673320070">"unesite otključavanje ekrana"</string>
     <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Senzor za otisak prsta"</string>
     <string name="accessibility_authenticate_hint" msgid="798914151813205721">"potvrdite identitet"</string>
     <string name="accessibility_enter_hint" msgid="2617864063504824834">"unesite uređaj"</string>
@@ -1175,7 +1182,7 @@
     <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Traže se mreže…"</string>
     <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Povezivanje sa mrežom nije uspelo"</string>
     <string name="wifi_wont_autoconnect_for_now" msgid="5782282612749867762">"WiFi trenutno ne može da se automatski poveže"</string>
-    <string name="see_all_networks" msgid="3773666844913168122">"Pogledajte sve"</string>
+    <string name="see_all_networks" msgid="3773666844913168122">"Prikaži sve"</string>
     <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Da biste promenili mrežu, prekinite eternet vezu"</string>
     <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Radi boljeg doživljaja uređaja, aplikacije i usluge i dalje mogu da traže WiFi mreže u bilo kom trenutku, čak i kada je WiFi isključen. To možete da promenite u podešavanjima WiFi skeniranja. "<annotation id="link">"Promenite"</annotation></string>
     <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Isključi režim rada u avionu"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon su blokirani"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Ne uznemiravaj"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Prisustvo korisnika može da se otkrije"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Podesite podrazumevanu aplikaciju za beleške u Podešavanjima"</string>
     <string name="install_app" msgid="5066668100199613936">"Instaliraj aplikaciju"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
index 75fb325..df0b786 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Isključeno"</item>
     <item msgid="5137565285664080143">"Uključeno"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Nedostupno"</item>
+    <item msgid="3079622119444911877">"Isključeno"</item>
+    <item msgid="3028994095749238254">"Uključeno"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index cf35a24..a76c38b 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Абагуліць"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Абагуліць здымак экрана"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Захапіць больш"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Адхіліць здымак экрана"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Сканіраванне твару"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Адправіць"</string>
     <string name="cancel" msgid="1089011503403416730">"Скасаваць"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Лагатып праграмы"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Пацвердзіць"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Паўтарыць спробу"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Націсніце, каб скасаваць аўтэнтыфікацыю"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Твар распазнаны. Для працягу націсніце значок разблакіроўкі."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Распазнана"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Скасаваць аўтэнтыфікацыю"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Іншыя варыянты"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Увесці PIN-код"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Выкарыстаць узор разблакіроўкі"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Выкарыстаць пароль"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандартная"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Сярэдняя"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Высокая"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Разблакіраваць мікрафон прылады?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Разблакіраваць камеру прылады?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Разблакіраваць камеру і мікрафон прылады?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Выдаліць"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Дадаць віджэт"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Гатова"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Дадаць віджэты"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Доступ да віджэтаў любімых праграм без разблакіроўкі планшэта."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Дазволіць размяшчаць на экране блакіроўкі любыя віджэты?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Адкрыць налады"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Уключыць працоўныя праграмы?"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"Абарона ад крадзяжу\nПрылада заблакіравана з-за няўдалых спроб"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Прылада заблакіравана, бо было занадта многа спроб аўтэнтыфікацыі"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Прылада заблакіравана\nАўтэнтыфікацыя не пройдзена"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Налады гуку"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Аўтаматычныя субцітры"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Гук выключаны"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Трансляцыя"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недаступна, бо выключаны гук выклікаў"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Недаступна, бо ўключаны рэжым \"Не турбаваць\""</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Недаступна, бо ўключаны рэжым \"Не турбаваць\""</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Дакраніцеся, каб уключыць гук."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Дакраніцеся, каб уключыць вібрацыю. Можа быць адключаны гук службаў спецыяльных магчымасцей."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Дакраніцеся, каб адключыць гук. Можа быць адключаны гук службаў спецыяльных магчымасцей."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"вібрыраваць"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Рэгулятар гучнасці %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Для выклікаў і апавяшчэнняў уключаны гук (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Перайсці да налад вываду"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Меню з паўзункамі гучнасці разгорнута"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Меню з паўзункамі гучнасці згорнута"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"выключыць гук (%s)"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"уключыць гук (%s)"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> прайграецца тут:"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аўдыявыхад:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Наладка сістэмнага інтэрфейсу карыстальніка"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Пераходзіць паміж нядаўнімі праграмамі, перамяшчаючыся ўперад"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Пераходзіць паміж нядаўнімі праграмамі, перамяшчаючыся назад"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Адкрыць спіс праграм"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Паказаць панэль задач"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Адкрыць налады"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Выклікаць Памочніка"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Экран блакіроўкі"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай справа"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай злева"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Пераключыцца з рэжыму падзеленага экрана на поўнаэкранны рэжым"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Пераключыцца на праграму справа або ўнізе на падзеленым экране"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Пераключыцца на праграму злева або ўверсе на падзеленым экране"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"У рэжыме падзеленага экрана замяніць адну праграму на іншую"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Увод"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Пераключыцца на наступную мову"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера заблакіравана"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера і мікрафон заблакіраваны"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Мікрафон заблакіраваны"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Не турбаваць"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Выяўлена прысутнасць карыстальніка"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайце ў Наладах стандартную праграму для нататак"</string>
     <string name="install_app" msgid="5066668100199613936">"Усталяваць праграму"</string>
diff --git a/packages/SystemUI/res/values-be/tiles_states_strings.xml b/packages/SystemUI/res/values-be/tiles_states_strings.xml
index 74fc7c6..32619ef 100644
--- a/packages/SystemUI/res/values-be/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-be/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Выключана"</item>
     <item msgid="5137565285664080143">"Уключана"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index c8539e6..f8793b3 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Правенето на екранни снимки е блокирано от системния ви администратор"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Редактиране"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Редактиране на екранната снимка"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Споделяне"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Споделяне на екранната снимка"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Заснемане на още"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Отхвърляне на екранната снимка"</string>
@@ -108,10 +109,10 @@
     <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Докато записвате дадено приложение, Android има достъп до всичко, което се показва или възпроизвежда в него. Затова бъдете внимателни с неща като пароли, подробности за начини на плащане, съобщения, снимки, аудио и видео."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Стартиране на записването"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Записване на звук"</string>
-    <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Аудио от устройството"</string>
+    <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Звук от устройството"</string>
     <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Звук от устройството ви, като например музика, обаждания и мелодии"</string>
     <string name="screenrecord_mic_label" msgid="2111264835791332350">"Микрофон"</string>
-    <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Аудио от устройството и микрофона"</string>
+    <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Звук от устройството и микрофона"</string>
     <string name="screenrecord_continue" msgid="4055347133700593164">"Стартиране"</string>
     <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Екранът се записва"</string>
     <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Екранът и аудиото се записват"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Извършва се сканиране на лице"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Изпращане"</string>
     <string name="cancel" msgid="1089011503403416730">"Отказ"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Лого на приложението"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Потвърждаване"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Нов опит"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Докоснете, за да анулирате удостоверяването"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицето бе разпознато. Продължете чрез иконата за отключване."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Удостоверено"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Анулиране на удостоверяването"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Още опции"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Използване на ПИН"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Използване на фигура"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Използване на парола"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандартен"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Среден"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Висок"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Да се отблокира ли микрофонът на устройството?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Да се отблокира ли камерата на устройството?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Да се отблокират ли камерата и микрофонът на устройството?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Премахване"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Добавяне на приспособление"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Добавяне на приспособления"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Получете бърз достъп до любимите си приспособления за приложения, без да отключвате таблета си."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Да се разреши ли което и да е приспособление на заключения екран?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Отваряне на настройките"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Отмяна на паузата за служ. прил.?"</string>
@@ -538,7 +551,8 @@
     <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">"Поддържа се отключено от надежден агент"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Защита от кражба\nУ-вото е закл., твърде много опити за откл."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Устройството бе заключено. Твърде много опити за удостоверяване"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Устройството е заключено\nНеуспешно удостоверяване"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Настройки за звука"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Медия с автоматични надписи"</string>
@@ -584,7 +598,7 @@
     <string name="media_device_cast" msgid="4786241789687569892">"Предаване"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Не е налице, защото звъненето е спряно"</string>
     <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Не е налице, защото режимът „Не безпокойте“ е вкл."</string>
-    <string name="stream_media_unavailable" msgid="6823020894438959853">"Не е налице, защото режимът „Не безпокойте“ е вкл."</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Не е налице, защото „Не безпокойте“ е вкл."</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Докоснете, за да включите отново звука."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Докоснете, за да зададете вибриране. Възможно е звукът на услугите за достъпност да бъде заглушен."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Докоснете, за да заглушите звука. Възможно е звукът на услугите за достъпност да бъде заглушен."</string>
@@ -752,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Превъртане напред през скорошните приложения"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Превъртане назад през скорошните приложения"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Отваряне на списъка с приложения"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Показване на лентата на задачите"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Отваряне на настройките"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Отваряне на Асистент"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Заключване на екрана"</string>
@@ -761,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Преминаване към разделен екран с текущото приложение отдясно"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Преминаване към разделен екран с текущото приложение отляво"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Превключване от разделен към цял екран"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Превключване към приложението вдясно/отдолу в режима на разделен екран"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Превключване към приложението вляво/отгоре в режима на разделен екран"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"При разделен екран: замяна на дадено приложение с друго"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Въвеждане"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Превключване към следващия език"</string>
@@ -1259,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Достъпът до камерата е блокиран"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Достъпът до камерата и микрофона е блокиран"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Достъпът до микрофона е блокиран"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Не безпокойте"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Установено е присъствие на потребител"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайте стандартно приложение за бележки от настройките"</string>
     <string name="install_app" msgid="5066668100199613936">"Инсталиране на приложението"</string>
diff --git a/packages/SystemUI/res/values-bg/tiles_states_strings.xml b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
index ddd0c3f..381b0f0 100644
--- a/packages/SystemUI/res/values-bg/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Изключено"</item>
     <item msgid="5137565285664080143">"Включено"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index dac69cb..f6de0e3 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"আপনার আইটি অ্যাডমিন স্ক্রিনশট নেওয়ার সুবিধা ব্লক করেছেন"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"এডিট করুন"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"স্ক্রিনশট এডিট করুন"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"শেয়ার করুন"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"স্ক্রিনশট শেয়ার করুন"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"আরও বেশি ক্যাপচার করুন"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"স্ক্রিনশট বাতিল করুন"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"ফেস স্ক্যান করা হচ্ছে"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"পাঠান"</string>
     <string name="cancel" msgid="1089011503403416730">"বাতিল করুন"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"অ্যাপের লোগো"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"কনফার্ম করুন"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"আবার চেষ্টা করুন"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"যাচাইকরণ বাতিল করতে ট্যাপ করুন"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ফেস শনাক্ত করা হয়েছে। চালিয়ে যেতে আনলক আইকন প্রেস করুন।"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"প্রমাণীকৃত"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"যাচাইকরণ বাতিল করুন"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"আরও বিকল্প"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"পিন ব্যবহার করুন"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"প্যাটার্ন ব্যবহার করুন"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"পাসওয়ার্ড ব্যবহার করুন"</string>
@@ -360,11 +363,19 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"স্ট্যান্ডার্ড"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"মিডিয়াম"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"হাই"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ডিভাইসের মাইক্রোফোন আনব্লক করতে চান?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ডিভাইসের ক্যামেরা আনব্লক করতে চান?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ডিভাইসের ক্যামেরা এবং মাইক্রোফোন আনব্লক করতে চান?"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"এটার জন্য মাইক্রোফোনের অ্যাক্সেস সেই সব অ্যাপ এবং পরিষেবার জন্য আনব্লক হয়ে যাবে, যাতে আপনার মাইক্রোফোন ব্যবহার করার অনুমতি দেওয়া হয়েছে।"</string>
-    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"এটার জন্য ক্যামেরার অ্যাক্সেস সেই সব অ্যাপ এবং পরিষেবার জন্য আনব্লক হয়ে যাবে, যাতে আপনার ক্যামেরা ব্যবহারের অনুমতি দেওয়া হয়েছে।"</string>
+    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"এর ফলে মাইক্রোফোনের অ্যাক্সেস সেই সব অ্যাপ এবং পরিষেবার জন্য আনব্লক হয়ে যাবে, যাতে আপনার মাইক্রোফোন ব্যবহার করার অনুমতি দেওয়া আছে।"</string>
+    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"এর ফলে ক্যামেরার অ্যাক্সেস সেই সব অ্যাপ এবং পরিষেবার জন্য আনব্লক হয়ে যাবে, যাতে আপনার ক্যামেরা ব্যবহারের অনুমতি দেওয়া আছে।"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"এটার জন্য ক্যামেরা অথবা মাইক্রোফোনের অ্যাক্সেস সেই সব অ্যাপ এবং পরিষেবার জন্য আনব্লক হয়ে যাবে, যাতে আপনার ক্যামেরা অথবা মাইক্রোফোন ব্যবহারের অনুমতি দেওয়া হয়েছে।"</string>
     <string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"মাইক্রোফোন ব্লক করা আছে"</string>
     <string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"ক্যামেরা ব্লক করা আছে"</string>
@@ -437,10 +448,10 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"সরান"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"উইজেট যোগ করুন"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"হয়ে গেছে"</string>
-    <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) -->
-    <skip />
-    <!-- no translation found for button_text_to_open_settings (1987729256950941628) -->
-    <skip />
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"উইজেট যোগ করুন"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"নিজের ট্যাবলেট আনলক বা করেই আপনার প্রিয় অ্যাপ উইজেটে দ্রুত অ্যাক্সেস পান।"</string>
+    <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"লক স্ক্রিনে যেকোনও উইজেটকে অনুমতি দেবেন?"</string>
+    <string name="button_text_to_open_settings" msgid="1987729256950941628">"সেটিংস খুলুন"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"অফিসের অ্যাপ আনপজ করতে চান?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"আনপজ করুন"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ব্যবহারকারী পাল্টে দিন"</string>
@@ -540,7 +551,8 @@
     <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="1265107698772588299">"চুরি থেকে সুরক্ষা\nডিভাইস লক করা আছে, আনলক করার জন্য অনেকবার চেষ্টা করা হয়েছে"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ডিভাইস লক করা আছে, যাচাইকরণের জন্য অনেক বেশিবার চেষ্টা করা হয়েছে"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ডিভাইস লক করা আছে\nযাচাইকরণ করা যায়নি"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"সাউন্ড সেটিংস"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"অটোমেটিক মিডিয়া ক্যাপশন দেখুন"</string>
@@ -585,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"মিউট"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"কাস্ট করুন"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"রিং মিউট করা হয়েছে বলে উপলভ্য নেই"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"\'বিরক্ত করবে না\' মোড চালু থাকার জন্য উপলভ্য নেই"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"\'বিরক্ত করবে না\' মোড চালু থাকার জন্য উপলভ্য নেই"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s। সশব্দ করতে আলতো চাপুন।"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s। কম্পন এ সেট করতে আলতো চাপুন। অ্যাক্সেসযোগ্যতার পরিষেবাগুলিকে মিউট করা হতে পারে।"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s। মিউট করতে আলতো চাপুন। অ্যাক্সেসযোগ্যতার পরিষেবাগুলিকে মিউট করা হতে পারে।"</string>
@@ -605,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ভাইব্রেট করান"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s ভলিউম নিয়ন্ত্রণ"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"কল এবং বিজ্ঞপ্তির রিং হবে (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"আউটপুট সেটিংস লিখুন"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"ভলিউম স্লাইডার বড় করা হয়েছে"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"ভলিউম স্লাইডার আড়াল করা হয়েছে"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s মিউট করুন"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s আনমিউট করুন"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>-এ প্লে করা হচ্ছে"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"অডিও প্লে করা হবে"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"সিস্টেম UI টিউনার"</string>
@@ -761,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"সাম্প্রতিক অ্যাপের মাধ্যমে পরবর্তী জায়গায় যান"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"সাম্প্রতিক অ্যাপের মাধ্যমে আগের জায়গায় ফিরুন"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"অ্যাপের তালিকা খুলুন"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"টাস্কবার দেখুন"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"সেটিংস খুলুন"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant খুলুন"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"লক স্ক্রিন"</string>
@@ -770,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"ডানদিকে থাকা বর্তমান অ্যাপ ব্যবহার করে \'স্প্লিট স্ক্রিন\' যোগ করুন"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"বাঁদিকে থাকা বর্তমান অ্যাপ ব্যবহার করে \'স্প্লিট স্ক্রিন\' যোগ করুন"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"\'স্প্লিট স্ক্রিন\' থেকে ফুল স্ক্রিনে পাল্টান"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"স্প্লিট স্ক্রিন ব্যবহার করার সময় ডানদিকের বা নিচের অ্যাপে পাল্টে নিন"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"স্প্লিট স্ক্রিন ব্যবহার করার সময় বাঁদিকের বা উপরের অ্যাপে পাল্টে নিন"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"\'স্প্লিট স্ক্রিন\' থাকাকালীন: একটি অ্যাপ থেকে অন্যটিতে পাল্টান"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ইনপুট"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"পরবর্তী ভাষায় পাল্টান"</string>
@@ -1268,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ক্যামেরার অ্যাক্সেস ব্লক করা আছে"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ক্যামেরা এবং মাইক্রোফোনের অ্যাক্সেস ব্লক করা আছে"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"মাইক্রোফোনের অ্যাক্সেস ব্লক করা আছে"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"বিরক্ত করবে না"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"ব্যবহারকারীর উপস্থিতি শনাক্ত করা হয়েছে"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"\'সেটিংস\' থেকে ডিফল্ট নোট নেওয়ার অ্যাপ সেট করুন"</string>
     <string name="install_app" msgid="5066668100199613936">"অ্যাপ ইনস্টল করুন"</string>
diff --git a/packages/SystemUI/res/values-bn/tiles_states_strings.xml b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
index ad32560..2eebd97 100644
--- a/packages/SystemUI/res/values-bn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"বন্ধ আছে"</item>
     <item msgid="5137565285664080143">"চালু আছে"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index dd4fee0..9347757 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Snimanje ekrana je blokirao IT administrator"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Uredite"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Uredite snimak ekrana"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Dijeli"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Dijeljenje snimka ekrana"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimi više"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacite snimak ekrana"</string>
@@ -107,9 +108,9 @@
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Dok snimate, Android ima pristup svemu što je vidljivo na ekranu ili što se reproducira na uređaju. Stoga budite oprezni s informacijama kao što su lozinke, podaci o plaćanju, poruke, fotografije, zvukovi i videozapisi."</string>
     <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Dok snimate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga budite oprezni s informacijama kao što su lozinke, podaci o plaćanju, poruke, fotografije, zvukovi i videozapisi."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Pokreni snimanje"</string>
-    <string name="screenrecord_audio_label" msgid="6183558856175159629">"Snimi zvučni zapis"</string>
+    <string name="screenrecord_audio_label" msgid="6183558856175159629">"Snimanje zvuka"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk na uređaju"</string>
-    <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Zvuk s vašeg uređaja, naprimjer muzika, pozivi i melodije zvona"</string>
+    <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Zvuk s vašeg uređaja, npr. muzika, pozivi i melodije zvona"</string>
     <string name="screenrecord_mic_label" msgid="2111264835791332350">"Mikrofon"</string>
     <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Zvuk na uređaju i mikrofon"</string>
     <string name="screenrecord_continue" msgid="4055347133700593164">"Pokreni"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Skeniranje lica"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Pošalji"</string>
     <string name="cancel" msgid="1089011503403416730">"Otkaži"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotip aplikacije"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potvrdite"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Pokušaj ponovo"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Dodirnite da otkažete autentifikaciju"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice prepoznato. Pritisnite ikonu za otklj. da nastavite."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentificirano"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Otkažite autentifikaciju"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Više opcija"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristi PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristi uzorak"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Koristi lozinku"</string>
@@ -262,7 +265,7 @@
     <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne ometaj"</string>
     <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nema dostupnih uparenih uređaja"</string>
-    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da povežete uređaj ili prekinete njegovu povezanost"</string>
+    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da povežete ili prekinete povezanost uređaja"</string>
     <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Upari novi uređaj"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Prikaži sve"</string>
     <string name="turn_on_bluetooth" msgid="5681370462180289071">"Koristi Bluetooth"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardno"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Srednje"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Visoko"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Deblokirati mikrofon uređaja?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Deblokirati kameru uređaja?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Deblokirati kameru i mikrofon uređaja?"</string>
@@ -437,7 +448,9 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Uklanjanje"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodajte vidžet"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotovo"</string>
-    <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Želite li dopustiti bilo koji widget na zaključanom zaslonu?"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Dodaj widgete"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Brzo pristupajte widgetima omiljenih aplikacija bez otključavanja tableta."</string>
+    <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Dozvoliti bilo koji vidžet na zaključanom ekranu?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvori postavke"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Pokrenuti poslovne aplikacije?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"Ponovo pokreni"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Ovim uređajem upravlja tvoj roditelj. Roditelj može vidjeti i upravljati informacijama kao što su aplikacije koje koristiš, lokacija i vrijeme korištenja uređaja."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Pouzdani agent sprečava zaključavanje"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Zaštita od krađe\nUređaj je zaključan, previše pokušaja otključ."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Uređaj je zaključan zbog previše pokušaja autentifikacije"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Uređaj je zaključan\nAutentifikacija nije uspjela"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Postavke zvuka"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatski titlovi za medije"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Isključi zvuk"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Emitiraj"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nedostupno zbog isključenog zvona"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nedostupno jer je funkcija Ne ometaj uključena"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Nedostupno jer je funkcija Ne ometaj uključena"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Dodirnite da uključite zvukove."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Dodirnite za postavljanje vibracije. Zvukovi usluga pristupačnosti mogu biti isključeni."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Dodirnite da isključite zvuk. Zvukovi usluga pristupačnosti mogu biti isključeni."</string>
@@ -603,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibriranje"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Kontrole glasnoće za %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Pozivi i obavještenja će zvoniti jačinom (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Unos postavki izlaza"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Klizači jačine zvuka su prošireni"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Klizači jačine zvuka su suženi"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"isključivanje parametra %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"uključivanje parametra %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Reproduciranje: <xliff:g id="LABEL">%s</xliff:g>"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk će se reprod. na:"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Reprodukcija zvuka na"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Podešavač za korisnički interfejs sistema"</string>
     <string name="status_bar" msgid="4357390266055077437">"Statusna traka"</string>
     <string name="demo_mode" msgid="263484519766901593">"Demo način rada Sistemskog UI-ja"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Kruženje kroz nedavne aplikacije unaprijed"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Kruženje kroz nedavne aplikacije unazad"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvaranje liste aplikacija"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Prikaz trake zadataka"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvaranje postavki"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvaranje Asistenta"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Zaključavanje ekrana"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na desnoj strani"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na lijevoj strani"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prebacivanje s podijeljenog ekrana na prikaz preko cijelog ekrana"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Pređite u aplikaciju desno ili ispod dok koristite podijeljeni ekran"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Pređite u aplikaciju lijevo ili iznad dok koristite podijeljeni ekran"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Za vrijeme podijeljenog ekrana: zamjena jedne aplikacije drugom"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Prebacivanje na sljedeći jezik"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon su blokirani"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Ne ometaj"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Otkriveno je prisustvo korisnika"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Postavite zadanu aplikaciju za bilješke u Postavkama"</string>
     <string name="install_app" msgid="5066668100199613936">"Instaliraj aplikaciju"</string>
diff --git a/packages/SystemUI/res/values-bs/tiles_states_strings.xml b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
index 75fb325..e09cab5 100644
--- a/packages/SystemUI/res/values-bs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Isključeno"</item>
     <item msgid="5137565285664080143">"Uključeno"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index bf5e58c..40532ca 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"El teu administrador de TI ha bloquejat les captures de pantalla"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Edita"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Edita la captura de pantalla"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Comparteix"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Comparteix la captura de pantalla"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Captura més"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignora la captura de pantalla"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"S\'està escanejant la cara"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Envia"</string>
     <string name="cancel" msgid="1089011503403416730">"Cancel·la"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotip de l\'aplicació"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirma"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Torna-ho a provar"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toca per cancel·lar l\'autenticació"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"S\'ha reconegut la cara. Prem la icona per continuar."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticat"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel·la l\'autenticació"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Més opcions"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utilitza el PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utilitza el patró"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utilitza la contrasenya"</string>
@@ -272,7 +275,7 @@
     <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activa"</string>
     <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Torna\'l a activar automàticament demà"</string>
     <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funcions com ara Quick Share, Troba el meu dispositiu i la ubicació del dispositiu utilitzen el Bluetooth"</string>
-    <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth s\'activarà a les 5:00 h demà"</string>
+    <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"El Bluetooth s\'activarà demà a les 5:00 h"</string>
     <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de bateria"</string>
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Àudio"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Auriculars"</string>
@@ -360,12 +363,20 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Estàndard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Mitjà"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Alt"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vols desbloquejar el micròfon del dispositiu?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vols desbloquejar la càmera del dispositiu?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vols desbloquejar la càmera i el micròfon del dispositiu?"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Aquesta opció desbloqueja l\'accés de tots els serveis i aplicacions que tenen permís per utilitzar el micròfon."</string>
-    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Aquesta opció desbloqueja l\'accés de tots els serveis i aplicacions que tenen permís per utilitzar la càmera."</string>
-    <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Aquesta opció desbloqueja l\'accés de tots els serveis i aplicacions que tenen permís per utilitzar la càmera o el micròfon."</string>
+    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Si ho fas, tots els serveis i les aplicacions que tenen permís podran utilitzar el micròfon."</string>
+    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Si ho fas, tots els serveis i les aplicacions que tenen permís podran utilitzar la càmera."</string>
+    <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Si ho fas, tots els serveis i les aplicacions que tenen permís podran utilitzar la càmera o el micròfon."</string>
     <string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"El micròfon està bloquejat"</string>
     <string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"La càmera està bloquejada"</string>
     <string name="sensor_privacy_start_use_mic_camera_blocked_dialog_title" msgid="195236134743281973">"El micròfon i la càmera estan bloquejats"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Suprimeix"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Afegeix un widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Fet"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Afegeix widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Accedeix ràpidament als teus widgets d\'aplicacions preferits sense desbloquejar la tauleta."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vols permetre qualsevol widget a la pantalla de bloqueig?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Obre la configuració"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Reactivar les apps de treball?"</string>
@@ -465,7 +478,7 @@
     <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Comparteix o grava una aplicació"</string>
     <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Vols començar a gravar o emetre contingut amb <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
     <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Quan comparteixes, graves o emets contingut, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> té accés a qualsevol cosa que es vegi a la pantalla o que es reprodueixi al dispositiu. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Quan comparteixes, graves o emets contingut, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> té accés a qualsevol cosa que es vegi a la pantalla o que es reprodueixi a l\'aplicació. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Quan comparteixes, graves o emets una aplicació, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> té accés a qualsevol cosa que es mostri o que es reprodueixi en aquella aplicació. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Inicia"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ha desactivat aquesta opció"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Vols iniciar una emissió?"</string>
@@ -474,7 +487,7 @@
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Inicia una emissió"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Vols començar a compartir?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Quan comparteixes, graves o emets contingut, Android té accés a qualsevol cosa que es vegi a la pantalla o que es reprodueixi al dispositiu. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
-    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Quan comparteixes, graves o emets contingut, Android té accés a qualsevol cosa que es vegi a la pantalla o que es reprodueixi a l\'aplicació. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
+    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Quan comparteixes, graves o emets una aplicació, Android té accés a qualsevol cosa que es mostri o que es reprodueixi en aquella aplicació. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
     <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Inicia"</string>
     <string name="media_projection_task_switcher_text" msgid="590885489897412359">"La compartició es posa en pausa quan canvies d\'aplicació"</string>
     <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Comparteix aquesta aplicació"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"El teu pare o mare gestionen aquest dispositiu, i poden veure i gestionar informació com ara les aplicacions que utilitzes, la teva ubicació i el teu temps de connexió."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Desbloquejat per TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Protecció antirobatoris\nDispositiu bloquejat; massa intents"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"El dispositiu s\'ha bloquejat; massa intents d\'autenticació"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"El dispositiu s\'ha bloquejat\nHa fallat l\'autenticació"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Configuració del so"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Subtitula el contingut multimèdia automàticament"</string>
@@ -571,7 +585,7 @@
     <string name="screen_pinning_exit" msgid="4553787518387346893">"S\'ha deixat de fixar l\'aplicació"</string>
     <string name="stream_voice_call" msgid="7468348170702375660">"Trucada"</string>
     <string name="stream_system" msgid="7663148785370565134">"Sistema"</string>
-    <string name="stream_ring" msgid="7550670036738697526">"To de trucada"</string>
+    <string name="stream_ring" msgid="7550670036738697526">"So"</string>
     <string name="stream_music" msgid="2188224742361847580">"Multimèdia"</string>
     <string name="stream_alarm" msgid="16058075093011694">"Alarma"</string>
     <string name="stream_notification" msgid="7930294049046243939">"Notificació"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Silencia"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Emet"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"No disponible perquè el so està silenciat"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"No disponible perquè No molestis està activat"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"No disponible perquè No molestis està activat"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toca per activar el so."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toca per activar la vibració. Pot ser que els serveis d\'accessibilitat se silenciïn."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toca per silenciar el so. Pot ser que els serveis d\'accessibilitat se silenciïn."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Controls de volum %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Les trucades i les notificacions sonaran (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Introdueix opcions de configuració de sortida"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Els controls lliscants de volum s\'han desplegat"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Els controls lliscants de volum s\'han replegat"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"silencia %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"deixa de silenciar %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"S\'està reproduint <xliff:g id="LABEL">%s</xliff:g> a"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Es reproduirà a"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Personalitzador d\'interfície d\'usuari"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Desplaça\'t cap endavant per les aplicacions recents"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Desplaça\'t cap enrere per les aplicacions recents"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Obre la llista d\'aplicacions"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostra la barra de tasques"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Obre la configuració"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Obre l\'Assistent"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueig"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Entra al mode de pantalla dividida amb l\'aplicació actual a la dreta"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Entra al mode de pantalla dividida amb l\'aplicació actual a l\'esquerra"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Canvia de pantalla dividida a pantalla completa"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Canvia a l\'aplicació de la dreta o de sota amb la pantalla dividida"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Canvia a l\'aplicació de l\'esquerra o de dalt amb la pantalla dividida"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Durant el mode de pantalla dividida: substitueix una app per una altra"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Canvia a l\'idioma següent"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"La càmera està bloquejada"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"La càmera i el micròfon estan bloquejats"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"El micròfon està bloquejat"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"No molestis"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"S\'ha detectat la presència d\'usuaris"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defineix l\'aplicació de notes predeterminada a Configuració"</string>
     <string name="install_app" msgid="5066668100199613936">"Instal·la l\'aplicació"</string>
diff --git a/packages/SystemUI/res/values-ca/tiles_states_strings.xml b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
index c926e9e..6a36b6f 100644
--- a/packages/SystemUI/res/values-ca/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Desactivat"</item>
     <item msgid="5137565285664080143">"Activat"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 5e8acfa..16c2914 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Pořizování snímků obrazovky je blokováno administrátorem IT"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Upravit"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Upravit snímek obrazovky"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Sdílet"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Sdílet snímek obrazovky"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Zvětšit záběr snímku"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zavřít snímek obrazovky"</string>
@@ -100,12 +101,12 @@
     <string name="screenshot_detected_template" msgid="7940376642921719915">"Aplikace <xliff:g id="APPNAME">%1$s</xliff:g> objevila tento snímek obrazovky."</string>
     <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> a ostatní otevřené aplikace objevily tento snímek obrazovky."</string>
     <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Přidat do poznámky"</string>
-    <string name="screenrecord_title" msgid="4257171601439507792">"Rekordér obrazovky"</string>
+    <string name="screenrecord_title" msgid="4257171601439507792">"Nahrávání obrazovky"</string>
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Záznam obrazovky se zpracovává"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Trvalé oznámení o relaci nahrávání"</string>
     <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Začít nahrávat?"</string>
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Během nahrávání má Android přístup k veškerému obsahu, který je viditelný na obrazovce nebo se přehrává v zařízení. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Během nahrávání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Během nahrávání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s informacemi, jako jsou hesla, platební údaje, zprávy, fotky, zvukové záznamy nebo videa."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Začít nahrávat"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Nahrávat zvuk"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk zařízení"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Skenování obličeje"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Odeslat"</string>
     <string name="cancel" msgid="1089011503403416730">"Zrušit"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo aplikace"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potvrdit"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Zkusit znovu"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Klepnutím zrušíte ověření"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Obličej rozpoznán. Klepněte na ikonu odemknutí."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Ověřeno"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Zrušit ověření"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Další možnosti"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Použít kód PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Použít gesto"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Použít heslo"</string>
@@ -262,7 +265,7 @@
     <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Nerušit"</string>
     <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nejsou dostupná žádná spárovaná zařízení"</string>
-    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Klepnutím připojíte nebo odpojíte zařízení"</string>
+    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Klepnutím zařízení připojíte nebo odpojíte"</string>
     <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Spárovat nové zařízení"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Zobrazit vše"</string>
     <string name="turn_on_bluetooth" msgid="5681370462180289071">"Použít Bluetooth"</string>
@@ -291,7 +294,7 @@
     <string name="quick_settings_user_title" msgid="8673045967216204537">"Uživatel"</string>
     <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
     <string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
-    <string name="quick_settings_networks_available" msgid="1875138606855420438">"Sítě jsou k dispozici"</string>
+    <string name="quick_settings_networks_available" msgid="1875138606855420438">"Sítě k dispozici"</string>
     <string name="quick_settings_networks_unavailable" msgid="1167847013337940082">"Sítě nejsou k dispozici"</string>
     <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"Žádné sítě Wi-Fi nejsou k dispozici"</string>
     <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Zapínání…"</string>
@@ -341,7 +344,7 @@
     <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je vypnuto"</string>
     <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je zapnuto"</string>
-    <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Rekordér obrazovky"</string>
+    <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Nahrávání obrazovky"</string>
     <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Spustit"</string>
     <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ukončit"</string>
     <string name="qs_record_issue_label" msgid="8166290137285529059">"Zaznamenat problém"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardní"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Střední"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Vysoká"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Odblokovat mikrofon zařízení?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Odblokovat fotoaparát zařízení?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Odblokovat fotoaparát a mikrofon zařízení?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Odstranit"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Přidat widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hotovo"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Přidat widgety"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Získejte rychlý přístup ke svým oblíbeným widgetům aplikací bez odemykání tabletu."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Povolit jakýkoli widget na obrazovce uzamčení?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otevřít nastavení"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Zrušit pozastavení pracovních aplikací?"</string>
@@ -470,11 +483,11 @@
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> tuto možnost zakázala"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Začít odesílat?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Během odesílání má Android přístup ke všemu, co je viditelné na obrazovce nebo se přehrává v zařízení. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Během odesílání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Během odesílání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s informacemi, jako jsou hesla, platební údaje, zprávy, fotky, zvukové záznamy a videa."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Začít odesílat"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Začít sdílet?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Během sdílení, nahrávání nebo odesílání má Android přístup k veškerému obsahu, který je viditelný na obrazovce nebo se přehrává v zařízení. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
-    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Během sdílení, nahrávání nebo odesílání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
+    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Během sdílení, nahrávání nebo odesílání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s informacemi, jako jsou hesla, platební údaje, zprávy, fotky, zvukové záznamy a videa."</string>
     <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Začít"</string>
     <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Když přepnete aplikace, sdílení se pozastaví"</string>
     <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Sdílet aplikaci"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Toto zařízení spravuje rodič. Rodič může zobrazit údaje, jako jsou používané aplikace, tvá poloha a čas strávený na zařízení."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Odemknutí udržováno funkcí TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Ochrana před odcizením\nZamknuto, moc pokusů o odemknutí"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Zařízení uzamčeno, příliš mnoho pokusů o ověření"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Zařízení uzamčeno\nOvěření se nezdařilo"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Nastavení zvuku"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatické přepisy médií"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Ztlumení"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Odesílání"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nedostupné, protože vyzvánění je ztlumené"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nedostupné, protože je zapnutý režim Nerušit"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Nedostupné – je zapnutý režim Nerušit"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Klepnutím zapnete zvuk."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Klepnutím aktivujete režim vibrací. Služby přístupnosti mohou být ztlumeny."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Klepnutím vypnete zvuk. Služby přístupnosti mohou být ztlumeny."</string>
@@ -595,7 +607,7 @@
     <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Omezení hluku"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Prostorový zvuk"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Vypnuto"</string>
-    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Pevné"</string>
+    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Pevný"</string>
     <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Sledování hlavy"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"Klepnutím změníte režim vyzvánění"</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"vypnout zvuk"</string>
@@ -603,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrovat"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Ovládací prvky hlasitosti %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Volání a oznámení budou vyzvánět (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Otevřít nastavení výstupu"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Posuvníky hlasitosti jsou rozbalené"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Posuvníky hlasitosti jsou sbalené"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"ztlumíte %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"zapnete zvuk %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Přehrávání <xliff:g id="LABEL">%s</xliff:g> na"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk se přehraje na"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk se přehraje přes"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Nástroj na ladění uživatelského rozhraní systému"</string>
     <string name="status_bar" msgid="4357390266055077437">"Stavový řádek"</string>
     <string name="demo_mode" msgid="263484519766901593">"Ukázkový režim uživatelského rozhraní systému"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Procházet nedávné aplikace směrem vpřed"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Procházet nedávné aplikace směrem zpět"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otevřít seznam aplikací"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Zobrazit panel aplikací"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otevřít nastavení"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otevřít Asistenta"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Uzamknout obrazovku"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi napravo"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi nalevo"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Přepnout z rozdělené obrazovky na celou obrazovku"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Přechod na aplikaci vpravo nebo dole v režimu rozdělené obrazovky"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Přechod na aplikaci vlevo nebo nahoře v režimu rozdělené obrazovky"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"V režimu rozdělené obrazovky: nahradit jednu aplikaci druhou"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vstup"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Přepnout na další jazyk"</string>
@@ -1165,7 +1173,7 @@
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Připojeno"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Dočasně připojeno"</string>
     <string name="mobile_data_poor_connection" msgid="819617772268371434">"Nekvalitní připojení"</string>
-    <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobilní data se nebudou připojovat automaticky"</string>
+    <string name="mobile_data_off_summary" msgid="3663995422004150567">"Bez automatického připojení přes mobilní data"</string>
     <string name="mobile_data_no_connection" msgid="1713872434869947377">"Žádné připojení"</string>
     <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Žádné další sítě nejsou k dispozici"</string>
     <string name="all_network_unavailable" msgid="4112774339909373349">"Nejsou k dispozici žádné sítě"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokována"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera a mikrofon jsou blokovány"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokován"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Režim Nerušit"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Je zjištěna přítomnost uživatele"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Výchozí aplikaci pro poznámky nastavíte v Nastavení"</string>
     <string name="install_app" msgid="5066668100199613936">"Nainstalovat aplikaci"</string>
diff --git a/packages/SystemUI/res/values-cs/tiles_states_strings.xml b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
index 5345569..02a0f5f 100644
--- a/packages/SystemUI/res/values-cs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Vypnuto"</item>
     <item msgid="5137565285664080143">"Zapnuto"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 8e178e8..4754dbb 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Din it-administrator har blokeret screenshot-funktionen"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Rediger"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Rediger screenshot"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Del"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Del screenshottet"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Medtag mere"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Luk screenshot"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanner ansigt"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
     <string name="cancel" msgid="1089011503403416730">"Annuller"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Applogo"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bekræft"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Prøv igen"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tryk for at annullere godkendelsen"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansigt genkendt. Tryk på oplåsningsikonet for at fortsætte."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Godkendt"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Annuller godkendelsen"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Flere valgmuligheder"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Brug pinkode"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Brug mønster"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Brug adgangskode"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Middel"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Høj"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vil du fjerne blokeringen af enhedens mikrofon?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vil du fjerne blokeringen af enhedens kamera?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vil du fjerne blokeringen af enhedens kamera og mikrofon?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Fjern"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Tilføj widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Udfør"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Tilføj widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Få hurtig adgang til dine foretrukne appwidgets uden at låse din tablet op."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vil du tillade alle widgets på låseskærmen?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Åbn Indstillinger"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Vil du genoptage arbejdsapps?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Denne enhed administreres af din forælder. Din forælder kan se og administrere oplysninger såsom de apps, du bruger, din lokation og din skærmtid."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Holdes oplåst af TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Tyveribeskyttelse\nLåst enhed (for mange oplåsningsforsøg)"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Enheden er låst efter for mange forsøg på godkendelse"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Enheden er låst\nGodkendelsen mislykkedes"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Lydindstillinger"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Undertekster til medier"</string>
@@ -571,22 +585,20 @@
     <string name="screen_pinning_exit" msgid="4553787518387346893">"Appen er frigjort"</string>
     <string name="stream_voice_call" msgid="7468348170702375660">"Ring op"</string>
     <string name="stream_system" msgid="7663148785370565134">"System"</string>
-    <string name="stream_ring" msgid="7550670036738697526">"Ring"</string>
+    <string name="stream_ring" msgid="7550670036738697526">"Ringetone"</string>
     <string name="stream_music" msgid="2188224742361847580">"Medie"</string>
     <string name="stream_alarm" msgid="16058075093011694">"Alarm"</string>
     <string name="stream_notification" msgid="7930294049046243939">"Notifikation"</string>
     <string name="stream_bluetooth_sco" msgid="6234562365528664331">"Bluetooth"</string>
     <string name="stream_dtmf" msgid="7322536356554673067">"Tonesignalfrekvens (DTMF)"</string>
     <string name="stream_accessibility" msgid="3873610336741987152">"Hjælpefunktioner"</string>
-    <string name="volume_ringer_status_normal" msgid="1339039682222461143">"Ring"</string>
+    <string name="volume_ringer_status_normal" msgid="1339039682222461143">"Ringetone"</string>
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Vibration"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Slå lyden fra"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ikke muligt, da ringetonen er slået fra"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Ikke tilgængelig, fordi Forstyr ikke er aktiveret"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Ikke tilgængelig, fordi Forstyr ikke er aktiveret"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tryk for at slå lyden til."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tryk for at konfigurere til at vibrere. Tilgængelighedstjenester kan blive deaktiveret."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tryk for at slå lyden fra. Lyden i tilgængelighedstjenester kan blive slået fra."</string>
@@ -596,23 +608,18 @@
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Rumlig lyd"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Fra"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fast"</string>
-    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Reg. af hovedbevægelser"</string>
+    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Register. af hoved­bevægelser"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"Tryk for at ændre ringetilstand"</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"slå lyden fra"</string>
     <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"slå lyden til"</string>
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrer"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s lydstyrkeknapper"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Der afspilles lyd ved opkald og notifikationer (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Angiv indstillinger for output"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Lydstyrkeskydere er udvidet"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Lydstyrkeskydere er skjult"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"slå lyden fra for %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"slå lyden til for %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Afspiller <xliff:g id="LABEL">%s</xliff:g> på"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Lyden afspilles på"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Gå frem i dine seneste apps"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Gå tilbage i dine seneste apps"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Åbn appfortegnelse"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Vis proceslinje"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Åbn indstillinger"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Åbn Assistent"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Lås skærm"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Start opdelt skærm med aktuel app til højre"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Start opdelt skærm med aktuel app til venstre"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skift fra opdelt skærm til fuld skærm"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Skift til en app til højre eller nedenfor, når du bruger opdelt skærm"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Skift til en app til venstre eller ovenfor, når du bruger opdelt skærm"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Ved opdelt skærm: Udskift én app med en anden"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Skift til næste sprog"</string>
@@ -1008,8 +1016,8 @@
     <string name="accessibility_control_favorite" msgid="8694362691985545985">"Angivet som favorit"</string>
     <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Angivet som favorit. Position <xliff:g id="NUMBER">%d</xliff:g>"</string>
     <string name="accessibility_control_not_favorite" msgid="1291760269563092359">"Fjernet fra favoritter"</string>
-    <string name="accessibility_control_change_favorite" msgid="2943178027582253261">"markér som favorit"</string>
-    <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"fjern fra favoritter"</string>
+    <string name="accessibility_control_change_favorite" msgid="2943178027582253261">"markere som favorit"</string>
+    <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"fjerne som favorit"</string>
     <string name="accessibility_control_move" msgid="8980344493796647792">"Flyt til position <xliff:g id="NUMBER">%d</xliff:g>"</string>
     <string name="controls_favorite_default_title" msgid="967742178688938137">"Betjeningselementer"</string>
     <string name="controls_favorite_subtitle" msgid="5818709315630850796">"Vælg, hvilke enhedsindstillinger du vil have hurtig adgang til"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kameraet er blokeret"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Der er blokeret for kameraet og mikrofonen"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen er blokeret"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Forstyr ikke"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Brugertilstedeværelse er registreret"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Angiv standardapp til noter i Indstillinger"</string>
     <string name="install_app" msgid="5066668100199613936">"Installer app"</string>
diff --git a/packages/SystemUI/res/values-da/tiles_states_strings.xml b/packages/SystemUI/res/values-da/tiles_states_strings.xml
index 5a53149..598fcfe 100644
--- a/packages/SystemUI/res/values-da/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-da/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Fra"</item>
     <item msgid="5137565285664080143">"Til"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index a61e802..2fd26bc 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Dein IT-Administrator hat das Erstellen von Screenshots blockiert"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Bearbeiten"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Screenshot bearbeiten"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Teilen"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Screenshot teilen"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Mehr aufnehmen"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Screenshot schließen"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Gesicht wird gescannt"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Senden"</string>
     <string name="cancel" msgid="1089011503403416730">"Abbrechen"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"App-Logo"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bestätigen"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Noch einmal versuchen"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Zum Abbrechen der Authentifizierung tippen"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gesicht erkannt. Tippe zum Fortfahren auf das Symbol „Entsperren“."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authentifiziert"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Authentifizierung abbrechen"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Weitere Optionen"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN verwenden"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Muster verwenden"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Passwort verwenden"</string>
@@ -326,7 +329,7 @@
     <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Geschäftliche Apps"</string>
     <string name="quick_settings_work_mode_paused_state" msgid="6681788236383735976">"Pausiert"</string>
     <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Nachtlicht"</string>
-    <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"An bei Sonnenuntergang"</string>
+    <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"An: Sonnenuntergang"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Bis Sonnenaufgang"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"An um <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Bis <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Mittel"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Hoch"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Blockierung des Gerätemikrofons aufheben?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Blockierung der Gerätekamera aufheben?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Blockierung von Gerätekamera und Gerätemikrofon aufheben?"</string>
@@ -437,6 +448,10 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Entfernen"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Widget hinzufügen"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Fertig"</string>
+    <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+    <skip />
+    <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+    <skip />
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Beliebige Widgets auf Sperrbildschirm zulassen?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Einstellungen öffnen"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Geschäftliche Apps nicht mehr pausieren?"</string>
@@ -538,7 +553,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Dieses Gerät wird von deinen Eltern verwaltet. Sie können unter anderem Informationen über deine genutzten Apps, deinen Standort und deine Bildschirmzeit einsehen und verwalten."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Durch TrustAgent entsperrt"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Diebstahlschutz\nGerät gesperrt – zu viele Entsperrversuche"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Das Gerät wurde aufgrund zu vieler Authentifizierungsversuche gesperrt"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Gerät gesperrt\nAuthentifizierung fehlgeschlagen"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Toneinstellungen"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Medien autom. untertiteln"</string>
@@ -569,7 +585,7 @@
     <string name="screen_pinning_negative" msgid="6882816864569211666">"Nein danke"</string>
     <string name="screen_pinning_start" msgid="7483998671383371313">"Bildschirm wurde fixiert"</string>
     <string name="screen_pinning_exit" msgid="4553787518387346893">"App vom Bildschirm losgelöst"</string>
-    <string name="stream_voice_call" msgid="7468348170702375660">"Anruf"</string>
+    <string name="stream_voice_call" msgid="7468348170702375660">"Anrufen"</string>
     <string name="stream_system" msgid="7663148785370565134">"System"</string>
     <string name="stream_ring" msgid="7550670036738697526">"Klingelton"</string>
     <string name="stream_music" msgid="2188224742361847580">"Medien"</string>
@@ -583,36 +599,29 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Stummschalten"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Stream"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nicht verfügbar, da Klingelton stumm"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nicht verfügbar, weil „Bitte nicht stören“ an ist"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Nicht verfügbar, weil „Bitte nicht stören“ an"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Zum Aufheben der Stummschaltung tippen."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tippen, um Vibrieren festzulegen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Zum Stummschalten tippen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Zum Aktivieren der Vibration tippen."</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Zum Stummschalten tippen."</string>
-    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Geräuschunterdrückung"</string>
+    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Geräusch­unterdrückung"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Spatial Audio"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Aus"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Statisch"</string>
-    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Erfassung von Kopfbewegungen"</string>
+    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Erfassung von Kopfbewe­gungen"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"Zum Ändern des Klingeltonmodus tippen"</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"Stummschalten"</string>
     <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"Aufheben der Stummschaltung"</string>
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"Vibrieren lassen"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Lautstärkeregler von %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Gerät klingelt bei Anrufen und Benachrichtigungen (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Ausgabeeinstellungen angeben"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Lautstärkeregler maximiert"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Lautstärkeregler minimiert"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s stummzuschalten"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"Stummschaltung von %s aufzuheben"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Wiedergabe von <xliff:g id="LABEL">%s</xliff:g> über"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audiowiedergabe über"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +768,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Zuletzt verwendete Apps vorwärts durchgehen"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Zuletzt verwendete Apps rückwärts durchgehen"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Liste der Apps öffnen"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Taskleiste anzeigen"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Einstellungen öffnen"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant öffnen"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Sperrbildschirm"</string>
@@ -768,6 +776,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Splitscreen aktivieren, aktuelle App rechts"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Splitscreen aktivieren, aktuelle App links"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Vom Splitscreen zum Vollbild wechseln"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Im Splitscreen-Modus rechts oder unten zu einer App wechseln"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Im Splitscreen-Modus links oder oben zu einer App wechseln"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Im Splitscreen: eine App durch eine andere ersetzen"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Eingabe"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Zur nächsten Sprache wechseln"</string>
@@ -1266,8 +1276,7 @@
     <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>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Bitte nicht stören"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Anwesenheit des Nutzers wurde erkannt"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standard-Notizen-App in den Einstellungen einrichten"</string>
     <string name="install_app" msgid="5066668100199613936">"App installieren"</string>
diff --git a/packages/SystemUI/res/values-de/tiles_states_strings.xml b/packages/SystemUI/res/values-de/tiles_states_strings.xml
index e5f8655..4b4eed5 100644
--- a/packages/SystemUI/res/values-de/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-de/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Aus"</item>
     <item msgid="5137565285664080143">"An"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 3167843..0c3f0d5 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Κοινή χρήση"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Κοινοποίηση στιγμιότυπου οθόνης"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Περισσότερα"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Παράβλεψη στιγμιότυπου οθόνης"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Σάρωση προσώπου"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Αποστολή"</string>
     <string name="cancel" msgid="1089011503403416730">"Ακύρωση"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Λογότυπο εφαρμογής"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Επιβεβαίωση"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Δοκιμάστε ξανά"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Πατήστε για ακύρωση του ελέγχου ταυτότητας"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Το πρόσωπο αναγνωρ. Πατήστε το εικον. ξεκλειδ. για συνέχεια."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Ολοκληρώθηκε ο έλεγχος ταυτότητας"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Ακύρωση ελέγχου ταυτότητας"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Περισσότερες επιλογές"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Χρήση PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Χρήση μοτίβου"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Χρήση κωδικού πρόσβασης"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Τυπική"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Μέτρια"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Υψηλή"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Κατάργηση αποκλεισμού μικροφώνου συσκευής;"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Κατάργηση αποκλεισμού κάμερας συσκευής;"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Κατάργηση αποκλεισμού κάμερας και μικροφώνου συσκευής;"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Κατάργηση"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Προσθήκη γραφικού στοιχείου"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Τέλος"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Προσθήκη γραφικών στοιχείων"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Αποκτήστε γρήγορα πρόσβαση στα αγαπημένα σας γραφικά στοιχεία εφαρμογών χωρίς να ξεκλειδώσετε το tablet σας."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Να επιτρέπονται όλα τα γραφικά στοιχεία στην οθόνη κλειδώματος;"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Άνοιγμα ρυθμίσεων"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Αναίρ. παύσης εφαρμ. εργασιών;"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"Προστασία από κλοπή\nΗ συσκ. κλειδ., πάρα πολλές προσπ. ξεκλ."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Η συσκευή ήταν κλειδωμένη, πάρα πολλές προσπάθειες ελέγχου ταυτότητας"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Η συσκευή είναι κλειδωμένη\nΟ έλεγχος ταυτότητας απέτυχε"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Ρυθμίσεις ήχου"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Αυτόματοι υπότιτλοι στο μέσο"</string>
@@ -571,7 +585,7 @@
     <string name="screen_pinning_exit" msgid="4553787518387346893">"Η εφαρμογή ξεκαρφιτσώθηκε."</string>
     <string name="stream_voice_call" msgid="7468348170702375660">"Κλήση"</string>
     <string name="stream_system" msgid="7663148785370565134">"Σύστημα"</string>
-    <string name="stream_ring" msgid="7550670036738697526">"Κλήση"</string>
+    <string name="stream_ring" msgid="7550670036738697526">"Ήχος κλήσης"</string>
     <string name="stream_music" msgid="2188224742361847580">"Μέσα"</string>
     <string name="stream_alarm" msgid="16058075093011694">"Ξυπνητήρι"</string>
     <string name="stream_notification" msgid="7930294049046243939">"Ειδοποίηση"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Σίγαση"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Μετάδοση"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Μη διαθέσιμο λόγω σίγασης ήχου κλήσης"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Μη διαθ. επειδή η λειτ. Μην ενοχλείτε είναι ενεργή"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Μη διαθ. επειδή η λειτ. Μην ενοχλείτε είναι ενεργή"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Πατήστε για κατάργηση σίγασης."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Πατήστε για ενεργοποιήσετε τη δόνηση. Οι υπηρεσίες προσβασιμότητας ενδέχεται να τεθούν σε σίγαση."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Πατήστε για σίγαση. Οι υπηρεσίες προσβασιμότητας ενδέχεται να τεθούν σε σίγαση."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"δόνηση"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s στοιχεία ελέγχου έντασης ήχου"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Θα υπάρχει ηχητική ειδοποίηση για κλήσεις και ειδοποιήσεις (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Εισαγωγή ρυθμίσεων εξόδου"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Τα ρυθμιστικά έντασης ήχου αναπτύχθηκαν"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Τα ρυθμιστικά έντασης ήχου συμπτύχθηκαν"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"σίγαση %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"κατάργηση σίγασης %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Αναπαραγωγή <xliff:g id="LABEL">%s</xliff:g> σε"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Ο ήχος θα παίξει σε"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Περιήγηση προς τα εμπρός σε πρόσφατες εφαρμογές"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Περιήγηση προς τα πίσω σε πρόσφατες εφαρμογές"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Άνοιγμα λίστας εφαρμογών"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Εμφάνιση γραμμής εργαλείων"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Άνοιγμα ρυθμίσεων"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Άνοιγμα Βοηθού"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Κλείδωμα οθόνης"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα δεξιά"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα αριστερά"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Εναλλαγή από διαχωρισμό οθόνης σε πλήρη οθόνη"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Εναλλαγή στην εφαρμογή δεξιά ή κάτω κατά τη χρήση διαχωρισμού οθόνης"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Εναλλαγή σε εφαρμογή αριστερά ή επάνω κατά τη χρήση διαχωρισμού οθόνης"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Κατά τον διαχωρισμό οθόνης: αντικατάσταση μιας εφαρμογής με άλλη"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Είσοδος"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Εναλλαγή στην επόμενη γλώσσα"</string>
@@ -1177,7 +1185,7 @@
     <string name="wifi_wont_autoconnect_for_now" msgid="5782282612749867762">"Δεν θα γίνεται προς το παρόν αυτόματη σύνδεση Wi-Fi."</string>
     <string name="see_all_networks" msgid="3773666844913168122">"Εμφάνιση όλων"</string>
     <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Για εναλλαγή δικτύων, αποσυνδέστε το ethernet"</string>
-    <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Για βελτίωση της εμπειρίας στη συσκευή, οι εφαρμογές και οι υπηρεσίες μπορούν ακόμα να εκτελούν σάρωση για δίκτυα Wi‑Fi ανά πάσα στιγμή, ακόμα και όταν το Wi‑Fi είναι απενεργοποιημένο. Μπορείτε να αλλάξετε αυτήν τη ρύθμιση στις ρυθμίσεις της Σάρωσης Wi‑Fi. "<annotation id="link">"Αλλαγή"</annotation></string>
+    <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Για βελτίωση της εμπειρίας στη συσκευή, οι εφαρμογές και οι υπηρεσίες μπορούν ακόμα να εκτελούν σάρωση για δίκτυα Wi‑Fi ανά πάσα στιγμή, ακόμα και όταν το Wi‑Fi είναι απενεργοποιημένο. Μπορείτε να αλλάξετε αυτή τη ρύθμιση στις ρυθμίσεις της Σάρωσης Wi‑Fi. "<annotation id="link">"Αλλαγή"</annotation></string>
     <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Απενεργοποίηση λειτουργίας πτήσης"</string>
     <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"Η εφαρμογή <xliff:g id="APPNAME">%1$s</xliff:g> θέλει να προσθέσει το παρακάτω πλακίδιο στις Γρήγορες ρυθμίσεις"</string>
     <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Προσθήκη πλακιδίου"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Η κάμερα έχει αποκλειστεί"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Η κάμερα και το μικρόφωνο έχουν αποκλειστεί"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Το μικρόφωνο έχει αποκλειστεί"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Μην ενοχλείτε"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Εντοπίστηκε παρουσία χρήστη"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ορίστε την προεπιλεγμένη εφαρμογή σημειώσεων στις Ρυθμίσεις"</string>
     <string name="install_app" msgid="5066668100199613936">"Εγκατάσταση εφαρμογής"</string>
diff --git a/packages/SystemUI/res/values-el/tiles_states_strings.xml b/packages/SystemUI/res/values-el/tiles_states_strings.xml
index a697711..e4c6854 100644
--- a/packages/SystemUI/res/values-el/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-el/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Ανενεργό"</item>
     <item msgid="5137565285664080143">"Ενεργό"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 6d79b47..a8848a5 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Taking screenshots is blocked by your IT admin"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Edit screenshot"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Share"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Share screenshot"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capture more"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanning face"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
     <string name="cancel" msgid="1089011503403416730">"Cancel"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"App logo"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirm"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Try again"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tap to cancel authentication"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel authentication"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"More options"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medium"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"High"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Unblock device microphone?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Unblock device camera?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Unblock device camera and microphone?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Add widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Get quick access to your favourite app widgets without unlocking your tablet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on the lock screen?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
@@ -470,7 +483,7 @@
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> has disabled this option"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Start casting?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"When you’re casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. Be careful with things like passwords, payment details, messages, photos, audio and video."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Start casting"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Start sharing?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"When you’re sharing, recording or casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"This device is managed by your parent. Your parent can see and manage information such as the apps that you use, your location and your screen time."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Kept unlocked by trust agent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Theft protection\nDevice locked, too many unlock attempts"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Device was locked, too many authentication attempts"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Device locked\nFailed authentication"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Sound settings"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatically caption media"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Mute"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Unavailable because ring is muted"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Unavailable because Do Not Disturb is on"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Unavailable because Do Not Disturb is on"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tap to unmute."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tap to mute. Accessibility services may be muted."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrate"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s volume controls"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Calls and notifications will ring (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Enter output settings"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Volume sliders expanded"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Volume sliders collapsed"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"mute %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"unmute %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Playing <xliff:g id="LABEL">%s</xliff:g> on"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio will play on"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forwards through recent apps"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backwards through recent apps"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open Assistant"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Switch to the app on the right or below while using split screen"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Switch to the app on the left or above while using split screen"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Do not disturb"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
     <string name="install_app" msgid="5066668100199613936">"Install app"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
index d97c4c9..304abe1 100644
--- a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Off"</item>
     <item msgid="5137565285664080143">"On"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 62e0e57..4b69255 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Taking screenshots is blocked by your IT admin"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Edit screenshot"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Share"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Share screenshot"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capture more"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanning face"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
     <string name="cancel" msgid="1089011503403416730">"Cancel"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"App logo"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirm"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Try again"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tap to cancel authentication"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognized. Press the unlock icon to continue."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel Authentication"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"More Options"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -360,6 +363,10 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medium"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"High"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Hearing devices"</string>
+    <string name="quick_settings_hearing_devices_dialog_title" msgid="9004774017688484981">"Hearing devices"</string>
+    <string name="quick_settings_pair_hearing_devices" msgid="5987105102207447322">"Pair new device"</string>
+    <string name="accessibility_hearing_device_pair_new_device" msgid="8440082580186130090">"Click to pair new device"</string>
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Unblock device microphone?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Unblock device camera?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Unblock device camera and microphone?"</string>
@@ -437,6 +444,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Add widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Get quick access to your favorite app widgets without unlocking your tablet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on lock screen?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
@@ -538,7 +547,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"This device is managed by your parent. Your parent can see and manage information such as the apps you use, your location, and your screen time."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Kept unlocked by TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Theft protection\nDevice locked, too many unlock attempts"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Device was locked, too many authentication attempts"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Device locked\nFailed authentication"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Sound settings"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatically caption media"</string>
@@ -752,7 +762,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forward through recent apps"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backward through recent apps"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open assistant"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
@@ -761,6 +770,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Switch to app on right or below while using split screen"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Switch to app on left or above while using split screen"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: replace an app from one to another"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
index d97c4c9..39dd7c8 100644
--- a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Off"</item>
     <item msgid="5137565285664080143">"On"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Unavailable"</item>
+    <item msgid="3079622119444911877">"Off"</item>
+    <item msgid="3028994095749238254">"On"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 6d79b47..a8848a5 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Taking screenshots is blocked by your IT admin"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Edit screenshot"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Share"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Share screenshot"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capture more"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanning face"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
     <string name="cancel" msgid="1089011503403416730">"Cancel"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"App logo"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirm"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Try again"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tap to cancel authentication"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel authentication"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"More options"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medium"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"High"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Unblock device microphone?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Unblock device camera?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Unblock device camera and microphone?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Add widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Get quick access to your favourite app widgets without unlocking your tablet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on the lock screen?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
@@ -470,7 +483,7 @@
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> has disabled this option"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Start casting?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"When you’re casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. Be careful with things like passwords, payment details, messages, photos, audio and video."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Start casting"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Start sharing?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"When you’re sharing, recording or casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"This device is managed by your parent. Your parent can see and manage information such as the apps that you use, your location and your screen time."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Kept unlocked by trust agent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Theft protection\nDevice locked, too many unlock attempts"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Device was locked, too many authentication attempts"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Device locked\nFailed authentication"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Sound settings"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatically caption media"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Mute"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Unavailable because ring is muted"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Unavailable because Do Not Disturb is on"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Unavailable because Do Not Disturb is on"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tap to unmute."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tap to mute. Accessibility services may be muted."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrate"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s volume controls"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Calls and notifications will ring (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Enter output settings"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Volume sliders expanded"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Volume sliders collapsed"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"mute %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"unmute %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Playing <xliff:g id="LABEL">%s</xliff:g> on"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio will play on"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forwards through recent apps"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backwards through recent apps"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open Assistant"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Switch to the app on the right or below while using split screen"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Switch to the app on the left or above while using split screen"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Do not disturb"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
     <string name="install_app" msgid="5066668100199613936">"Install app"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
index d97c4c9..304abe1 100644
--- a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Off"</item>
     <item msgid="5137565285664080143">"On"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 6d79b47..a8848a5 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Taking screenshots is blocked by your IT admin"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Edit screenshot"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Share"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Share screenshot"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capture more"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanning face"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
     <string name="cancel" msgid="1089011503403416730">"Cancel"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"App logo"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirm"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Try again"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tap to cancel authentication"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel authentication"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"More options"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medium"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"High"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Unblock device microphone?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Unblock device camera?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Unblock device camera and microphone?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Add widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Get quick access to your favourite app widgets without unlocking your tablet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on the lock screen?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
@@ -470,7 +483,7 @@
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> has disabled this option"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Start casting?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"When you’re casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. Be careful with things like passwords, payment details, messages, photos, audio and video."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Start casting"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Start sharing?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"When you’re sharing, recording or casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"This device is managed by your parent. Your parent can see and manage information such as the apps that you use, your location and your screen time."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Kept unlocked by trust agent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Theft protection\nDevice locked, too many unlock attempts"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Device was locked, too many authentication attempts"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Device locked\nFailed authentication"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Sound settings"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatically caption media"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Mute"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Unavailable because ring is muted"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Unavailable because Do Not Disturb is on"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Unavailable because Do Not Disturb is on"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tap to unmute."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tap to mute. Accessibility services may be muted."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrate"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s volume controls"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Calls and notifications will ring (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Enter output settings"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Volume sliders expanded"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Volume sliders collapsed"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"mute %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"unmute %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Playing <xliff:g id="LABEL">%s</xliff:g> on"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio will play on"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forwards through recent apps"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backwards through recent apps"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open Assistant"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Switch to the app on the right or below while using split screen"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Switch to the app on the left or above while using split screen"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Do not disturb"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
     <string name="install_app" msgid="5066668100199613936">"Install app"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
index d97c4c9..304abe1 100644
--- a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Off"</item>
     <item msgid="5137565285664080143">"On"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 8b3a37f..3ed9fc5 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‏‎‎‎‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‎‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‏‎Taking screenshots is blocked by your IT admin‎‏‎‎‏‎"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‎‎‎‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‎‏‎‎Edit‎‏‎‎‏‎"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎Edit screenshot‎‏‎‎‏‎"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‏‎‏‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎Share‎‏‎‎‏‎"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‏‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‎‏‎‎‎Share screenshot‎‏‎‎‏‎"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎‏‎‎‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‏‏‎‏‎‏‎‏‏‏‎Capture more‎‏‎‎‏‎"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‎‎‏‎‎‎‎‏‎‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎Dismiss screenshot‎‏‎‎‏‎"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‎‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎Scanning face‎‏‎‎‏‎"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‏‎‏‎Send‎‏‎‎‏‎"</string>
     <string name="cancel" msgid="1089011503403416730">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‏‎‎‎‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎Cancel‎‏‎‎‏‎"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‎‎‏‏‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‏‎App logo‎‏‎‎‏‎"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‎‎‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‎Confirm‎‏‎‎‏‎"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‎‎Try again‎‏‎‎‏‎"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‎‎‏‎‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‎Tap to cancel authentication‎‏‎‎‏‎"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‏‏‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎Face recognized. Press the unlock icon to continue.‎‏‎‎‏‎"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‎‎‎Authenticated‎‏‎‎‏‎"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‎Cancel Authentication‎‏‎‎‏‎"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎More Options‎‏‎‎‏‎"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‎‏‎Use PIN‎‏‎‎‏‎"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎‏‏‏‎‏‎‎Use pattern‎‏‎‎‏‎"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‎‏‏‎Use password‎‏‎‎‏‎"</string>
@@ -360,6 +363,10 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‎‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‎‎‎Standard‎‏‎‎‏‎"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‏‏‎‎‏‏‎‎Medium‎‏‎‎‏‎"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎High‎‏‎‎‏‎"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‏‏‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎Hearing devices‎‏‎‎‏‎"</string>
+    <string name="quick_settings_hearing_devices_dialog_title" msgid="9004774017688484981">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‎‏‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‏‎‏‎Hearing devices‎‏‎‎‏‎"</string>
+    <string name="quick_settings_pair_hearing_devices" msgid="5987105102207447322">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‏‏‎‎‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‏‎‏‎‎Pair new device‎‏‎‎‏‎"</string>
+    <string name="accessibility_hearing_device_pair_new_device" msgid="8440082580186130090">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‎‏‎‏‎‏‎‏‎‎Click to pair new device‎‏‎‎‏‎"</string>
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‎‎‏‏‏‎‎‏‏‎‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‏‏‎‎‎‎‎Unblock device microphone?‎‏‎‎‏‎"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‎‎‏‏‏‏‏‏‏‎‎‏‎‏‏‎Unblock device camera?‎‏‎‎‏‎"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎‏‎‎‏‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‏‏‏‏‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎Unblock device camera and microphone?‎‏‎‎‏‎"</string>
@@ -437,6 +444,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎Remove‎‏‎‎‏‎"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‏‎Add widget‎‏‎‎‏‎"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‏‎‎‏‎‎‎‎‏‏‎Done‎‏‎‎‏‎"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‎‎‎‎‏‎‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‏‎Add widgets‎‏‎‎‏‎"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‎‎‏‎‎Get quick access to your favorite app widgets without unlocking your tablet.‎‏‎‎‏‎"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‎‏‏‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‎‎Allow any widget on lock screen?‎‏‎‎‏‎"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‎‎‏‏‏‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎Open settings‎‏‎‎‏‎"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‎‎‏‏‎‎‎‎‏‎Unpause work apps?‎‏‎‎‏‎"</string>
@@ -538,7 +547,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‏‎‏‎‎This device is managed by your parent. Your parent can see and manage information such as the apps you use, your location, and your screen time.‎‏‎‎‏‎"</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‎‏‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎VPN‎‏‎‎‏‎"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‎‎‎‎‏‏‎‏‏‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‎Kept unlocked by TrustAgent‎‏‎‎‏‎"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎Theft protection‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Device locked, too many unlock attempts‎‏‎‎‏‎"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‏‎‎‏‎‏‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‎‏‎‎‎‏‏‎‏‎‎‎‎Device was locked, too many authentication attempts‎‏‎‎‏‎"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‎‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎Device locked‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Failed authentication‎‏‎‎‏‎"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‎‏‎‎‎‎‎‎‏‏‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‎‎‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="ZEN_MODE">%1$s</xliff:g>‎‏‎‎‏‏‏‎. ‎‏‎‎‏‏‎<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‎‎Sound settings‎‏‎‎‏‎"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‏‏‎‎‏‎‏‎‏‏‎‏‎‏‏‎‏‏‏‎‏‎Automatically caption media‎‏‎‎‏‎"</string>
@@ -752,7 +762,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‏‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‏‎‏‏‎‏‏‏‏‎‏‎Cycle forward through recent apps‎‏‎‎‏‎"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎Cycle backward through recent apps‎‏‎‎‏‎"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‏‏‏‎‎‏‏‏‎‏‏‏‎‏‎Open apps list‎‏‎‎‏‎"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎‎‏‎‎‎‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‏‎Show taskbar‎‏‎‎‏‎"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‎‎‎‎‏‎Open settings‎‏‎‎‏‎"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‎Open assistant‎‏‎‎‏‎"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎Lock screen‎‏‎‎‏‎"</string>
@@ -761,6 +770,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‎‎‎‎‎‏‎Enter split screen with current app to RHS‎‏‎‎‏‎"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎Enter split screen with current app to LHS‎‏‎‎‏‎"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‎‎Switch from split screen to full screen‎‏‎‎‏‎"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‏‎‎‎Switch to app on right or below while using split screen‎‏‎‎‏‎"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‎‎‎‏‏‎‎‎‏‏‎‏‏‏‎‏‏‎‎Switch to app on left or above while using split screen‎‏‎‎‏‎"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎During split screen: replace an app from one to another‎‏‎‎‏‎"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‎‎‎‎‎‏‏‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‏‎‎Input‎‏‎‎‏‎"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎Switch to next language‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
index 2facf58..35ab88b 100644
--- a/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‎‎‎‏‎‎‏‏‎‎‎‏‎Off‎‏‎‎‏‎"</item>
     <item msgid="5137565285664080143">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‎‏‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‎On‎‏‎‎‏‎"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‏‏‎‏‎‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‎‎‏‎‏‎Unavailable‎‏‎‎‏‎"</item>
+    <item msgid="3079622119444911877">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‎Off‎‏‎‎‏‎"</item>
+    <item msgid="3028994095749238254">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‏‎‎‏‎‎‏‎‎‏‏‎‎‎‎‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‏‎‏‏‏‏‎‏‏‏‎‎On‎‏‎‎‏‎"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index ddeae20..3755fb6 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Tu administrador de TI bloquea las capturas de pantalla"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de pantalla"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Compartir"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Compartir captura"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar más"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Descartar captura de pantalla"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Escaneando rostro"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
     <string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotipo de la app"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Volver a intentarlo"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Presiona para cancelar la autenticación"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rostro reconocido. Presiona el desbloqueo para continuar."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticación"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Más opciones"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar patrón"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar contraseña"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Estándar"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medio"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"¿Quieres desbloquear el micrófono del dispositivo?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"¿Quieres desbloquear la cámara del dispositivo?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"¿Quieres desbloquear la cámara y el micrófono del dispositivo?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Quitar"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Agregar widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Listo"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Agregar widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Accede rápidamente a los widgets de tus apps favoritas sin desbloquear la tablet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"¿Quieres permitir cualquier widget en la pantalla de bloqueo?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir configuración"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"¿Reanudar apps de trabajo?"</string>
@@ -448,7 +461,7 @@
     <string name="guest_wipe_session_message" msgid="3393823610257065457">"¿Quieres retomar la sesión?"</string>
     <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Volver a empezar"</string>
     <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"Sí, continuar"</string>
-    <string name="guest_notification_app_name" msgid="2110425506754205509">"Modo de Invitado"</string>
+    <string name="guest_notification_app_name" msgid="2110425506754205509">"Modo de invitado"</string>
     <string name="guest_notification_session_active" msgid="5567273684713471450">"Estás en el modo de invitado"</string>
     <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Si agregas un usuario nuevo, se desactivará el modo de invitado y se borrarán todas las apps y los datos de la sesión de invitado actual."</string>
     <string name="user_limit_reached_title" msgid="2429229448830346057">"Alcanzaste el límite de usuarios"</string>
@@ -468,10 +481,10 @@
     <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Cuando compartas, grabes o transmitas una app, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> podrá acceder a todo el contenido que se muestre o que reproduzcas en ella. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Iniciar"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> inhabilitó esta opción"</string>
-    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"¿Quieres comenzar a transmitir contenido?"</string>
+    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"¿Empezar a transmitir contenido?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Cuando transmitas contenido, Android podrá acceder a todo lo que sea visible en la pantalla o que reproduzcas en el dispositivo. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Cuando transmitas una app, Android podrá acceder a todo el contenido que se muestre o que reproduzcas en ella. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
-    <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Comenzar a transmitir contenido"</string>
+    <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Empezar"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"¿Quieres empezar a compartir?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Cuando compartas, grabes o transmitas contenido, Android podrá acceder a todo lo que sea visible en la pantalla o que reproduzcas en el dispositivo. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Cuando compartas, grabes o transmitas una app, Android podrá acceder a todo el contenido que se muestre o que reproduzcas en ella. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Tu padre o madre administra este dispositivo. Esa persona puede ver y administrar información, como las apps que usas, tu ubicación y el tiempo de uso."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent lo mantiene desbloqueado"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Protección antirrobo\nDispositivo bloqueado; muchos intentos"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Se bloqueó el dispositivo; demasiados intentos de autenticación"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispositivo bloqueado\nFalló la autenticación"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Configuración de sonido"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Muestra subtítulos automáticos"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Silenciar"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Transmisión"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"No disponible por timbre silenciado"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"No disponible si está activado No interrumpir"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"No disponible si está activado No interrumpir"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Presiona para dejar de silenciar."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Presiona para establecer el modo vibración. Es posible que los servicios de accesibilidad estén silenciados."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Presiona para silenciar. Es posible que los servicios de accesibilidad estén silenciados."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Controles de volumen %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Sonarán las llamadas y notificaciones (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Ingresar configuración de salida"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Controles deslizantes del volumen expandidos"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Controles deslizantes del volumen colapsados"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"silenciar %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"activar sonido %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Reproduciendo <xliff:g id="LABEL">%s</xliff:g> en"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Se reproducirá en"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizador de IU del sistema"</string>
@@ -625,7 +632,7 @@
     <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>
-    <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"Presiona para abrir"</string>
+    <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"Toca para abrir"</string>
     <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Actualizando"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Desbloquear para usar"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Ocurrió un problema al obtener las tarjetas; vuelve a intentarlo más tarde"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Desplazar por las apps recientes (adelante)"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Desplazar por las apps recientes (atrás)"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar Barra de tareas"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configuración"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir Asistente"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Bloquear la pantalla"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Activar pantalla dividida con la app actual en el lado derecho (RHS)"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Activar pantalla dividida con la app actual en el lado izquierdo (LHS)"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Ubica la app a la derecha o abajo cuando usas la pantalla dividida"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Ubica la app a la izquierda o arriba cuando usas la pantalla dividida"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Durante pantalla dividida: Reemplaza una app con otra"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar al próximo idioma"</string>
@@ -1165,7 +1173,7 @@
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Conexión establecida"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Conectado temporalmente"</string>
     <string name="mobile_data_poor_connection" msgid="819617772268371434">"Conexión deficiente"</string>
-    <string name="mobile_data_off_summary" msgid="3663995422004150567">"No se conectarán automáticamente los datos móviles"</string>
+    <string name="mobile_data_off_summary" msgid="3663995422004150567">"Los datos móviles no se conectarán automáticamente"</string>
     <string name="mobile_data_no_connection" msgid="1713872434869947377">"Sin conexión"</string>
     <string name="non_carrier_network_unavailable" msgid="770049357024492372">"No hay otras redes disponibles"</string>
     <string name="all_network_unavailable" msgid="4112774339909373349">"No hay redes disponibles"</string>
@@ -1266,8 +1274,7 @@
     <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>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"No interrumpir"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Se detectó la presencia del usuario"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Configura la app de notas predeterminada en Configuración"</string>
     <string name="install_app" msgid="5066668100199613936">"Instalar app"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
index 6446bdf..71efef9 100644
--- a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Desactivado"</item>
     <item msgid="5137565285664080143">"Activado"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index db65640..01afa29 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Tu administrador de TI ha bloqueado las capturas de pantalla"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de pantalla"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Compartir"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Compartir captura de pantalla"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar más"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Cerrar captura de pantalla"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Escaneando cara"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
     <string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotipo de la aplicación"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Reintentar"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toca para cancelar la autenticación"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Cara reconocida. Pulsa el icono de desbloquear para continuar."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Se ha autenticado"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticación"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Más opciones"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar patrón"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar contraseña"</string>
@@ -263,7 +266,7 @@
     <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"No hay dispositivos vinculados disponibles"</string>
     <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Toca para conectar o desconectar un dispositivo"</string>
-    <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Emparejar un nuevo dispositivo"</string>
+    <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Emparejar nuevo dispositivo"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Ver todos"</string>
     <string name="turn_on_bluetooth" msgid="5681370462180289071">"Usar Bluetooth"</string>
     <string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Conectado"</string>
@@ -284,7 +287,7 @@
     <string name="quick_settings_location_label" msgid="2621868789013389163">"Ubicación"</string>
     <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Salvapantallas"</string>
     <string name="quick_settings_camera_label" msgid="5612076679385269339">"Acceso a cámara"</string>
-    <string name="quick_settings_mic_label" msgid="8392773746295266375">"Acceso al micro"</string>
+    <string name="quick_settings_mic_label" msgid="8392773746295266375">"Acceso a micro"</string>
     <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Disponible"</string>
     <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Bloqueado"</string>
     <string name="quick_settings_media_device_label" msgid="8034019242363789941">"Dispositivo multimedia"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Estándar"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medio"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"¿Desbloquear el micrófono del dispositivo?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"¿Desbloquear la cámara del dispositivo?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"¿Desbloquear la cámara y el micrófono del dispositivo?"</string>
@@ -437,10 +448,10 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Quitar"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Añadir widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hecho"</string>
-    <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) -->
-    <skip />
-    <!-- no translation found for button_text_to_open_settings (1987729256950941628) -->
-    <skip />
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Añadir widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Accede rápidamente a los widgets de tus aplicaciones favoritas sin desbloquear la tablet."</string>
+    <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"¿Permitir cualquier widget en la pantalla de bloqueo?"</string>
+    <string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir ajustes"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"¿Reactivar apps de trabajo?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"Reactivar"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar de usuario"</string>
@@ -540,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Tu padre o madre gestionan este dispositivo y pueden ver y controlar cierta información, como las aplicaciones que utilizas, tu ubicación y tu tiempo de pantalla."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Desbloqueado por TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Protección antirrobo\nDispositivo bloqueado por nº de intentos"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Dispositivo bloqueado; demasiados intentos de autenticación"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispositivo bloqueado\nError de autenticación"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Ajustes de sonido"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Subtitular automáticamente"</string>
@@ -585,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Silenciar"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Enviar"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"No disponible (el tono está silenciado)"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"No disponible porque No molestar está activado"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"No disponible porque No molestar está activado"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toca para activar el sonido."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toca para poner el dispositivo en vibración. Los servicios de accesibilidad pueden silenciarse."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toca para silenciar. Los servicios de accesibilidad pueden silenciarse."</string>
@@ -605,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Controles de volumen %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Las llamadas y las notificaciones sonarán (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Introducir los ajustes de salida"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Controles deslizantes de volumen desplegados"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Controles deslizantes de volumen contraídos"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"silenciar %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"dejar de silenciar %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Reproduciendo <xliff:g id="LABEL">%s</xliff:g> en"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Se reproducirá en"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Configurador de UI del sistema"</string>
@@ -761,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Desplazarse por aplicaciones recientes (adelante)"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Desplazarse por aplicaciones recientes (atrás)"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de aplicaciones"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar barra de tareas"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir ajustes"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir el Asistente"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueo"</string>
@@ -770,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Iniciar pantalla dividida con esta aplicación en el lado derecho"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Iniciar pantalla dividida con esta aplicación en el lado izquierdo"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Cambiar a la app de la derecha o de abajo en pantalla dividida"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Cambiar a la app de la izquierda o de arriba en pantalla dividida"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Con pantalla dividida: reemplazar una aplicación por otra"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar a siguiente idioma"</string>
@@ -1268,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Cámara bloqueada"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Cámara y micrófono bloqueados"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micrófono bloqueado"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"No molestar"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Se ha detectado la presencia de usuarios"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Configura la aplicación de notas predeterminada en Ajustes"</string>
     <string name="install_app" msgid="5066668100199613936">"Instalar aplicación"</string>
diff --git a/packages/SystemUI/res/values-es/tiles_states_strings.xml b/packages/SystemUI/res/values-es/tiles_states_strings.xml
index 4cc0c67..bd90056 100644
--- a/packages/SystemUI/res/values-es/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Desactivado"</item>
     <item msgid="5137565285664080143">"Activado"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 04a2a9c..52cbb0f 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"IT-administraator on ekraanipiltide jäädvustamise blokeerinud"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Muutmine"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Ekraanipildi muutmine"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Jaga"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Jaga ekraanipilti"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Jäädvusta rohkem"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekraanipildist loobumine"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Näo skannimine"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Saada"</string>
     <string name="cancel" msgid="1089011503403416730">"Tühista"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Rakenduse logo"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Kinnita"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Proovi uuesti"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Puudutage autentimise tühistamiseks"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Nägu tuvastati. Jätkamiseks vajutage avamise ikooni."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenditud"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Tühista autentimine"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Rohkem valikuid"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Kasuta PIN-koodi"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Kasuta mustrit"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Kasuta parooli"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Tavaline"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Keskmine"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Kõrge"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Kas tühistada seadme mikrofoni blokeerimine?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Kas tühistada seadme kaamera blokeerimine?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Kas tühistada seadme kaamera ja mikrofoni blokeerimine?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Eemalda"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Lisa vidin"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Valmis"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Vidinate lisamine"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Pääsege kiiresti juurde rakenduse lemmikvidinatele ilma tahvelarvutit avamata."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Kas lubada lukustuskuval kõik vidinad?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Ava seaded"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Kas lõpetada töörakenduste peatamine?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Seda seadet haldab sinu vanem. Sinu vanem näeb ja saab hallata teavet, näiteks kasutatavaid rakendusi, sinu asukohta ja ekraaniaega."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Avatuna hoiab TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Vargusvastane kaitse\nSeade lukus – liiga palju avamiskatseid"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Seade lukustati, liiga palju autentimiskatseid"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Seade on lukustatud\nAutentimine ebaõnnestus"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Heliseaded"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automaatsed subtiitrid"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Vaigistatud"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Ülekandmine"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Pole saadaval, kuna helin on vaigistatud"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Pole saadaval, kuna režiim Mitte segada on sees"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Pole saadaval, kuna režiim Mitte segada on sees"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Puudutage vaigistuse tühistamiseks."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Puudutage värinarežiimi määramiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Puudutage vaigistamiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string>
@@ -603,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibreerimine"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Helitugevuse juhtnupud: %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Kõnede ja märguannete puhul telefon heliseb (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Sisestage väljundseaded"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Helitugevuse liugurid laiendatud"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Helitugevuse liugurid ahendatud"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"vaigistab %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"tühistab %s vaigistuse"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Esitamine jätkub seadmes <xliff:g id="LABEL">%s</xliff:g>"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Heli esitamine jätkub"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Heli esitatakse seadmes"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Süsteemi kasutajaliidese tuuner"</string>
     <string name="status_bar" msgid="4357390266055077437">"Olekuriba"</string>
     <string name="demo_mode" msgid="263484519766901593">"Süsteemi kasutajaliidese demorežiim"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Hiljutiste rakenduste hulgas edasi liikumine"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Hiljutiste rakenduste hulgas tagasi liikumine"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Rakenduste loendi avamine"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Tegumiriba kuvamine"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Seadete avamine"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistendi avamine"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Lukustuskuva"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Ekraanikuva jagamine, nii et praegune rakendus on paremal"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Ekraanikuva jagamine, nii et praegune rakendus on vasakul"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Jagatud ekraanikuvalt täisekraanile lülitamine"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Paremale või alumisele rakendusele lülitamine jagatud ekraani ajal"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Vasakule või ülemisele rakendusele lülitamine jagatud ekraani ajal"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Ekraanikuva jagamise ajal: ühe rakenduse asendamine teisega"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Sisend"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Järgmisele keelele lülitamine"</string>
@@ -1178,7 +1186,7 @@
     <string name="see_all_networks" msgid="3773666844913168122">"Kuva kõik"</string>
     <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Võrkude vahetamiseks katkestage Etherneti-ühendus"</string>
     <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Seadme kasutuskogemuse parandamiseks võivad rakendused ja teenused siiski alati otsida WiFi-võrke isegi siis, kui WiFi on väljas. Seda saab muuta WiFi-skannimise seadetes. "<annotation id="link">"Muuda"</annotation></string>
-    <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Lennureżiimi väljalülitamine"</string>
+    <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Lülita lennukireżiim välja"</string>
     <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> soovib kiirseadetesse lisada järgmise paani"</string>
     <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Lisa paan"</string>
     <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ära lisa paani"</string>
@@ -1239,7 +1247,7 @@
     <string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Vähemalt üks seade või seadmepaneel on saadaval"</string>
     <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Valige märkmete tegemise vaikerakendus, et kasutada märkmete tegemise otseteed"</string>
     <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Valige rakendus"</string>
-    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pikalt puudutamise otsetee"</string>
+    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Puudutage otseteed pikalt"</string>
     <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Tühista"</string>
     <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Vaheta ekraane kohe"</string>
     <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Telefoni lahtivoltimine"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kaamera on blokeeritud"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kaamera ja mikrofon on blokeeritud"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon on blokeeritud"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Mitte segada"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Tuvastati kasutaja kohalolu"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Määrake seadetes märkmete vaikerakendus."</string>
     <string name="install_app" msgid="5066668100199613936">"Installi rakendus"</string>
diff --git a/packages/SystemUI/res/values-et/tiles_states_strings.xml b/packages/SystemUI/res/values-et/tiles_states_strings.xml
index f16d552..55bff30 100644
--- a/packages/SystemUI/res/values-et/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-et/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Väljas"</item>
     <item msgid="5137565285664080143">"Sees"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index faffa93..b0056f6 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"IKT saileko administratzaileak blokeatu egin dizu pantaila-argazkiak ateratzeko aukera"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Editatu"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Editatu pantaila-argazkia"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Partekatu"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Partekatu pantaila-argazkia"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Kapturatu eduki gehiago"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Baztertu pantaila-argazkia"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Aurpegia eskaneatzen"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Bidali"</string>
     <string name="cancel" msgid="1089011503403416730">"Utzi"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Aplikazioaren logotipoa"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Berretsi"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Saiatu berriro"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Sakatu hau autentifikazioa bertan behera uzteko"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ezagutu da aurpegia. Aurrera egiteko, sakatu desblokeatzeko ikonoa."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikatuta"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Utzi bertan behera autentifikazioa"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Aukera gehiago"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Erabili PINa"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Erabili eredua"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Erabili pasahitza"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Arrunta"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Tartekoa"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Altua"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Gailuaren mikrofonoa desblokeatu nahi duzu?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Gailuaren kamera desblokeatu nahi duzu?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Gailuaren kamera eta mikrofonoa desblokeatu nahi dituzu?"</string>
@@ -437,10 +448,10 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Kendu"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Gehitu widget bat"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Eginda"</string>
-    <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) -->
-    <skip />
-    <!-- no translation found for button_text_to_open_settings (1987729256950941628) -->
-    <skip />
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Gehitu widgetak"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Atzitu gogoko aplikazioen widgetak bizkor, tableta desblokeatu gabe."</string>
+    <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Pantaila blokeatuan edozein widget erakusteko baimena eman nahi duzu?"</string>
+    <string name="button_text_to_open_settings" msgid="1987729256950941628">"Ireki ezarpenak"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Laneko aplikazioak berraktibatu?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"Berraktibatu"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Aldatu erabiltzailea"</string>
@@ -540,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Zure gurasoak kudeatzen du gailua. Zure gurasoak gailuko informazioa ikusi eta kudea dezake; besteak beste, zer aplikazio erabiltzen dituzun, zure kokapena zein den eta pantaila aurrean zenbat eta noiz egoten zaren."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPNa"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent bidez desblokeatuta"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Lapurreten aurkako babesa\nGailua blokeatuta dago, desblokeatzeko saiakera gehiegi"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Blokeatu egin da gailua. Autentifikatze-saiakera gehiegi egin dira."</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Gailua blokeatuta dago\nEzin izan da autentifikatu"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Soinuaren ezarpenak"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Ezarri azpitituluak automatikoki"</string>
@@ -585,16 +597,14 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Ez jo tonua"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Igorri"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ez dago erabilgarri, tonua desaktibatuta dagoelako"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Ez dago erabilgarri, ez molestatzeko modua aktibatuta baitago"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Ez dago erabilgarri, ez molestatzeko modua aktibatuta baitago"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Sakatu audioa aktibatzeko."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Sakatu dardara ezartzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Sakatu audioa desaktibatzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Sakatu hau dardara ezartzeko."</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Sakatu hau audioa desaktibatzeko."</string>
-    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Zarata-murrizketa"</string>
+    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Zarata-kontrola"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Audio espaziala"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Desaktibatuta"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Finkoa"</string>
@@ -605,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"dardara"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s gailuaren bolumena kontrolatzeko aukerak"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Tonuak jo egingo du deiak eta jakinarazpenak jasotzean (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Ireki emaitzaren ezarpenak"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Bolumenaren botoi lerrakorrak zabalduta daude"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Bolumenaren botoi lerrakorrak tolestuta daude"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"desaktibatu honen audioa: %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"aktibatu honen audioa: %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> hemen erreproduzitzen:"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audioa erreproduzitzen jarraituko du"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audioak abian jarraituko du hemen:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Sistemaren erabiltzaile-interfazearen konfiguratzailea"</string>
     <string name="status_bar" msgid="4357390266055077437">"Egoera-barra"</string>
     <string name="demo_mode" msgid="263484519766901593">"Sistemaren erabiltzaile-interfazearen demo modua"</string>
@@ -761,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Ikusi azken aplikazioak banan-banan (aurrerantz)"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Ikusi azken aplikazioak banan-banan (atzerantz)"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ireki aplikazioen zerrenda"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Erakutsi zereginen barra"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ireki ezarpenak"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Ireki Laguntzailea"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Blokeatu pantaila"</string>
@@ -770,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Sartu pantaila zatituaren eskuineko aldean oraingo aplikazioarekin"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Sartu pantaila zatituaren ezkerreko aldean oraingo aplikazioarekin"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Aldatu pantaila zatitutik pantaila osora"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Aldatu eskuineko edo beheko aplikaziora pantaila zatitua erabiltzean"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Aldatu ezkerreko edo goiko aplikaziora pantaila zatitua erabiltzean"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Pantaila zatituan zaudela, ordeztu aplikazio bat beste batekin"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Sarrera"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Aldatu hurrengo hizkuntzara"</string>
@@ -1154,7 +1160,7 @@
     <string name="person_available" msgid="2318599327472755472">"Konektatuta"</string>
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Arazo bat izan da bateria-neurgailua irakurtzean"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Informazio gehiago lortzeko, sakatu hau"</string>
-    <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ez da ezarri alarmarik"</string>
+    <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Alarmarik ez"</string>
     <string name="accessibility_bouncer" msgid="5896923685673320070">"erabili pantailaren blokeoa"</string>
     <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Hatz-marken sentsorea"</string>
     <string name="accessibility_authenticate_hint" msgid="798914151813205721">"autentifikatu"</string>
@@ -1167,7 +1173,7 @@
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Konektatuta"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Aldi baterako konektatuta"</string>
     <string name="mobile_data_poor_connection" msgid="819617772268371434">"Konexio ahula"</string>
-    <string name="mobile_data_off_summary" msgid="3663995422004150567">"Ez da automatikoki aktibatuko datu-konexioa"</string>
+    <string name="mobile_data_off_summary" msgid="3663995422004150567">"Datu-konexioa ez da automatikoki aktibatuko"</string>
     <string name="mobile_data_no_connection" msgid="1713872434869947377">"Konexiorik gabe"</string>
     <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Ez dago beste sare erabilgarririk"</string>
     <string name="all_network_unavailable" msgid="4112774339909373349">"Ez dago sare erabilgarririk"</string>
@@ -1268,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera blokeatuta dago"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera eta mikrofonoa blokeatuta daude"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonoa blokeatuta dago"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Ez molestatzeko modua"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Erabiltzailearen presentzia hauteman da"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ezarri oharren aplikazio lehenetsia ezarpenetan"</string>
     <string name="install_app" msgid="5066668100199613936">"Instalatu aplikazioa"</string>
diff --git a/packages/SystemUI/res/values-eu/tiles_states_strings.xml b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
index 0f6570c..7f38d44 100644
--- a/packages/SystemUI/res/values-eu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Desaktibatuta"</item>
     <item msgid="5137565285664080143">"Aktibatuta"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 1e24158..de97db35 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"سرپرست فناوری اطلاعات گرفتن نماگرفت را مسدود کرده است"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"ویرایش"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"ویرایش نماگرفت"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"هم‌رسانی"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"هم‌رسانی نماگرفت"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"ضبط محتوای بیشتر"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"رد کردن نماگرفت"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"درحال اسکن کردن چهره"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ارسال"</string>
     <string name="cancel" msgid="1089011503403416730">"لغو"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"نشان‌واره برنامه"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"تأیید"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"امتحان مجدد"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"برای لغو راستی‌آزمایی ضربه بزنید"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"چهره شناسایی شد. برای ادامه، نماد قفل‌گشایی را فشار دهید."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"راستی‌آزمایی‌شده"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"لغو اصالت‌سنجی"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"گزینه‌های بیشتر"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"استفاده از پین"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"استفاده از الگو"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"استفاده از گذرواژه"</string>
@@ -272,7 +275,7 @@
     <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"فعال کردن"</string>
     <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"فردا دوباره به‌طور خودکار روشن شود"</string>
     <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"ویژگی‌هایی مثل «هم‌رسانی سریع»، «پیدا کردن دستگاهم»، و مکان دستگاه از بلوتوث استفاده می‌کنند"</string>
-    <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"بلوتوث فردا ۵ ق.ظ. روشن خواهد شد"</string>
+    <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"بلوتوث فردا ۵ ق.ظ روشن خواهد شد"</string>
     <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"شارژ باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
     <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"صوت"</string>
     <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"هدست"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"استاندارد"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"متوسط"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"بالا"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"میکروفون دستگاه لغو انسداد شود؟"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"دوربین دستگاه لغو انسداد شود؟"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"دوربین و میکروفون دستگاه لغو انسداد شود؟"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"برداشتن"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"افزودن ابزارک"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"تمام"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"افزودن ابزارک‌ها"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"بدون باز کردن قفل رایانه لوحی، به ابزارک برنامه‌های دلخواهتان فوراً دسترسی پیدا کنید."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"هر نوع ابزارکی در صفحه قفل مجاز شود؟"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"باز کردن تنظیمات"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"مکث برنامه‌های کاری لغو شود؟"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"محافظت دربرابر سرقت\nدستگاه قفل شد، تعداد تلاش‌ها قفل‌گشایی از حد مجاز بیشتر بود"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"دستگاه قفل شد، تعداد تلاش‌ها برای اصالت‌سنجی بسیار زیاد بود"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"دستگاه قفل شد\nاصالت‌سنجی ناموفق بود"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. ‏<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"تنظیمات صدا"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"رسانه زیرنویس خودکار"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"صامت"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"ارسال محتوا"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"دردسترس نیست، چون زنگ بی‌صدا شده است"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"دردسترس نیست زیرا «مزاحم نشوید» روشن است"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"دردسترس نیست زیرا «مزاحم نشوید» روشن است"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"‏%1$s. برای باصدا کردن ضربه بزنید."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"‏%1$s. برای تنظیم روی لرزش ضربه بزنید. ممکن است سرویس‌های دسترس‌پذیری بی‌صدا شوند."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"‏%1$s. برای صامت کردن ضربه بزنید. ممکن است سرویس‌های دسترس‌پذیری صامت شود."</string>
@@ -603,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"لرزش"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"‏%s کنترل‌های میزان صدا"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"تماس‌ها و اعلان‌ها زنگ می‌خورند (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"تنظیمات خروجی را وارد کنید"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"لغزنده‌های صدا ازهم باز شدند"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"لغزنده‌های صدا جمع شدند"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"‏بی‌صدا کردن %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"‏باصدا کردن %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"درحال پخش <xliff:g id="LABEL">%s</xliff:g> در"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"صدا پخش می‌شود در"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"صدا در این دستگاه پخش می‌شود:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"تنظیم‌کننده واسط کاربری سیستم"</string>
     <string name="status_bar" msgid="4357390266055077437">"نوار وضعیت"</string>
     <string name="demo_mode" msgid="263484519766901593">"حالت نمایشی واسط کاربری سیستم"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"چرخش به جلو در برنامه‌های اخیر"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"چرخش به عقب در برنامه‌های اخیر"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"باز کردن فهرست برنامه‌ها"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"نمایش نوار وظیفه"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"باز کردن تنظیمات"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"باز کردن «دستیار»"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"قفل صفحه"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت راست"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت چپ"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"جابه‌جایی از صفحهٔ دونیمه به تمام صفحه"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"رفتن به برنامه سمت راست یا پایین درحین استفاده از صفحهٔ دونیمه"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"رفتن به برنامه سمت چپ یا بالا درحین استفاده از صفحهٔ دونیمه"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"درحین صفحهٔ دونیمه: برنامه‌ای را با دیگری جابه‌جا می‌کند"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ورودی"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"رفتن به زبان بعدی"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"دوربین مسدود شده است"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"دوربین و میکروفون مسدود شده‌اند"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"میکروفون مسدود شده است"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"مزاحم نشوید"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"حضور کاربر شناسایی می‌شود"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"برنامه پیش‌فرض یادداشت را در «تنظیمات» تنظیم کنید"</string>
     <string name="install_app" msgid="5066668100199613936">"نصب برنامه"</string>
diff --git a/packages/SystemUI/res/values-fa/tiles_states_strings.xml b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
index 6d6954e..9a6b1af 100644
--- a/packages/SystemUI/res/values-fa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"خاموش"</item>
     <item msgid="5137565285664080143">"روشن"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 26d7bcb..55413a0 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"IT-järjestelmänvalvoja on estänyt kuvakaappauksien ottamisen."</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Muuta"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Muokkaa kuvakaappausta"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Jaa"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Jaa kuvakaappaus"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Kuvaa enemmän"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Hylkää kuvakaappaus"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Kasvojen skannaus"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Lähetä"</string>
     <string name="cancel" msgid="1089011503403416730">"Peru"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Sovelluksen logo"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Vahvista"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Yritä uudelleen"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Peru todennus napauttamalla"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Kasvot tunnistettu. Jatka lukituksen avauskuvakkeella."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Todennettu"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Peruuta todennus"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Lisää vaihtoehtoja"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Käytä PIN-koodia"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Käytä kuviota"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Käytä salasanaa"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Tavallinen"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Keskitaso"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Suuri"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Kumotaanko laitteen mikrofonin esto?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Kumotaanko laitteen kameran esto?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Kumotaanko laitteen kameran ja mikrofonin esto?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Poista"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Lisää widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Valmis"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Lisää widgetejä"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Pääset nopeasti tuttuihin sovelluswidgeteihin avaamatta tabletin lukitusta."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Sallitaanko kaikki widgetit lukitusnäytöllä?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Avaa asetukset"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Laita työsovellukset päälle?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Vanhempasi ylläpitää tätä laitetta. Vanhempasi voi nähdä ja ylläpitää tietoja, esim. käyttämiäsi sovelluksia, sijaintiasi ja käyttöaikaasi."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent pitää lukitusta avattuna"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Varkaussuoja\nLaite lukittu, liian monta avausyritystä"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Laite lukittiin, liian monta todennusyritystä"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Laite lukittu\nTodennus epäonnistui"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Ääniasetukset"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Tekstitä media automaatt."</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Äänetön"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Striimaa"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ei käytettävissä, soittoääni mykistetty"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Ei saatavilla, koska Älä häiritse on päällä"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Ei saatavilla, koska Älä häiritse on päällä"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Poista mykistys koskettamalla."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Siirry värinätilaan koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Mykistä koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"värinä"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Äänenvoimakkuuden säädin: %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Puhelut ja ilmoitukset soivat (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Lisää tuloasetukset"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Äänenvoimakkuuden liukusäätimet laajennettu"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Äänenvoimakkuuden liukusäätimet tiivistetty"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"mykistä: %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"poista mykistys: %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Toistetaan: <xliff:g id="LABEL">%s</xliff:g>"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audiota toistetaan laitteella"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Siirry eteenpäin viimeaikaisten sovellusten kautta"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Siirry takaisin viimeaikaisten sovellusten kautta"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Avaa sovelluslista"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Näytä tehtäväpalkki"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Avaa asetukset"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Avaa Assistant"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Lukitusnäyttö"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Siirry jaettuun näyttöön (sovellus oikeanpuoleiseen näyttöön)"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Siirry jaettuun näyttöön (sovellus vasemmanpuoleiseen näyttöön)"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Vaihda jaetusta näytöstä koko näyttöön"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Vaihda sovellukseen oikealla tai alapuolella jaetun näytön avulla"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Vaihda sovellukseen vasemmalla tai yläpuolella jaetun näytön avulla"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Jaetun näytön aikana: korvaa sovellus toisella"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Syöttötapa"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Vaihda seuraavaan kieleen"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera estetty"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera ja mikrofoni estetty"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoni estetty"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Älä häiritse"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Käyttäjän läsnäolo havaittu"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Aseta oletusmuistiinpanosovellus Asetuksista"</string>
     <string name="install_app" msgid="5066668100199613936">"Asenna sovellus"</string>
diff --git a/packages/SystemUI/res/values-fi/tiles_states_strings.xml b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
index 545abc9..f1e3e61 100644
--- a/packages/SystemUI/res/values-fi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Pois päältä"</item>
     <item msgid="5137565285664080143">"Päällä"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index d6aaf08..272e00e 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"La prise de captures d\'écran est bloquée par votre administrateur informatique"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Modifier"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Modifier la capture d\'écran"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Partager"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Partagez la capture d\'écran"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturer plus"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Fermer la capture d\'écran"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Numérisation du visage"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Envoyer"</string>
     <string name="cancel" msgid="1089011503403416730">"Annuler"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo de l\'application"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmer"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Réessayer"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Touchez ici pour annuler l\'authentification"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Visage reconnu. Appuyez sur Déverrouiller pour continuer."</string>
     <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 NIP"</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>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Moyen"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Élevé"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Débloquer le microphone de l\'appareil?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Débloquer l\'appareil photo de l\'appareil?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Débloquer l\'appareil photo et le microphone?"</string>
@@ -437,10 +448,12 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Retirer"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ajouter un widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Terminé"</string>
-    <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) -->
+    <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
     <skip />
-    <!-- no translation found for button_text_to_open_settings (1987729256950941628) -->
+    <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
     <skip />
+    <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Autoriser n\'importe quel widget sur l\'écran de verrouillage?"</string>
+    <string name="button_text_to_open_settings" msgid="1987729256950941628">"Ouvrir les paramètres"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Réactiver les applis pros?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"Réactiver"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Changer d\'utilisateur"</string>
@@ -540,7 +553,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Cet appareil est géré par ton parent. Ton parent peut voir et gérer de l\'information, comme les applications que tu utilises, ta position et ton temps d\'utilisation des écrans."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"RPV"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Maintenu déverrouillé par TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Protection c. le vol\nAppareil verrouillé, trop de tentatives"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"L\'appareil a été verrouillé, trop de tentatives d\'authentification"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Appareil verrouillé\nÉchec de l\'authentification"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Paramètres sonores"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Sous-titrer automatiquement"</string>
@@ -585,10 +599,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Sonnerie désactivée"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Diffuser"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Inaccessible : sonnerie en sourdine"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Inaccessible parce que Ne pas déranger est activée"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Inaccessible parce que Ne pas déranger est activée"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Touchez pour réactiver le son."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Touchez pour activer les vibrations. Il est possible de couper le son des services d\'accessibilité."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Touchez pour couper le son. Il est possible de couper le son des services d\'accessibilité."</string>
@@ -605,16 +617,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibration"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Commandes de volume de %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Les appels et les notifications seront annoncés par une sonnerie (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Entrer les paramètres de sortie"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Curseurs de volume développés"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Curseurs de volume réduits"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"Désactivez le son de %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"Réactivez le son de %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Lecture de <xliff:g id="LABEL">%s</xliff:g> sur"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Lecture audio sur"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -761,7 +768,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Parcourir les applications récentes"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Parcourir les applications récentes en sens inverse"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ouvrir la liste des applications"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Afficher la barre des tâches"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ouvrir les paramètres"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Ouvrir l\'Assistant"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Écran de verrouillage"</string>
@@ -770,6 +776,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Passer à l\'écran divisé avec l\'application actuelle à droite"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Passer à l\'écran divisé avec l\'application actuelle à gauche"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passer de l\'écran divisé au plein écran"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Passer à l\'application à droite ou en dessous avec l\'Écran divisé"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Passer à l\'application à gauche ou au-dessus avec l\'Écran divisé"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"En mode d\'écran divisé : remplacer une application par une autre"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrée"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passer à la langue suivante"</string>
@@ -1268,8 +1276,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Appareil photo bloqué"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Appareil photo et microphone bloqués"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone bloqué"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Ne pas déranger"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"La présence d\'un utilisateur est détectée"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Définir l\'application de prise de notes par défaut dans les Paramètres"</string>
     <string name="install_app" msgid="5066668100199613936">"Installer l\'application"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
index d89484d..dfea45a 100644
--- a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Désactivée"</item>
     <item msgid="5137565285664080143">"Activée"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 7f6bdda..41f9249 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"La capture d\'écran est bloquée par votre administrateur informatique"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Modifier"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Modifier la capture d\'écran"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Partager"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Partager la capture d\'écran"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturer plus"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Fermer la capture d\'écran"</string>
@@ -109,7 +110,7 @@
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Lancer l\'enregistrement"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Enregistrer l\'audio"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Audio de l\'appareil"</string>
-    <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Son provenant de l\'appareil (musique, appels et sonneries, etc.)"</string>
+    <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Son provenant de l\'appareil (musique, appels, sonneries, etc.)"</string>
     <string name="screenrecord_mic_label" msgid="2111264835791332350">"Micro"</string>
     <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Audio de l\'appareil et micro"</string>
     <string name="screenrecord_continue" msgid="4055347133700593164">"Commencer"</string>
@@ -144,12 +145,13 @@
     <string name="accessibility_phone_button" msgid="4256353121703100427">"Téléphoner"</string>
     <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"Assistance vocale"</string>
     <string name="accessibility_wallet_button" msgid="1458258783460555507">"Wallet"</string>
-    <string name="accessibility_qr_code_scanner_button" msgid="7521277927692910795">"Lecteur de code QR"</string>
+    <string name="accessibility_qr_code_scanner_button" msgid="7521277927692910795">"Lecteur code QR"</string>
     <string name="accessibility_unlock_button" msgid="3613812140816244310">"Déverrouillé"</string>
     <string name="accessibility_lock_icon" msgid="661492842417875775">"Appareil verrouillé"</string>
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Analyse du visage en cours"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Envoyer"</string>
     <string name="cancel" msgid="1089011503403416730">"Annuler"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo de l\'appli"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmer"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Réessayer"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Appuyer pour annuler l\'authentification"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Visage reconnu. Appuyez sur l\'icône de déverrouillage pour continuer."</string>
     <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_pattern" msgid="2315593393167211194">"Utiliser un schéma"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utiliser un mot de passe"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Moyen"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Élevé"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Débloquer le micro de l\'appareil ?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Débloquer la caméra de l\'appareil ?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Débloquer l\'appareil photo et le micro de l\'appareil ?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Supprimer"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ajouter un widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"OK"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Ajouter des widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Accéder rapidement aux widgets de vos applis préférées sans déverrouiller votre tablette."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Autoriser n\'importe quel widget sur l\'écran de verrouillage ?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Ouvrir les paramètres"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Réactiver les applis pro ?"</string>
@@ -461,7 +474,7 @@
     <string name="media_projection_sys_service_dialog_title" msgid="3751133258891897878">"Commencer à enregistrer ou à caster ?"</string>
     <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"Le service qui fournit cette fonction aura accès à toutes les infos visibles sur votre écran ou lues depuis votre appareil pendant un enregistrement ou une diffusion de contenu. Il peut s\'agir de mots de passe, détails de mode de paiement, photos, messages ou encore contenus audio lus."</string>
     <string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"Tout l\'écran"</string>
-    <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Une seule appli"</string>
+    <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Uniquement l\'appli"</string>
     <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Partager ou enregistrer une appli"</string>
     <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Commencer à enregistrer ou à caster avec <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ?"</string>
     <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Lorsque vous partagez, enregistrez ou castez, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> a accès à tout ce qui est visible sur votre écran ou lu sur votre appareil. Faites donc attention aux éléments tels que les mots de passe, détails de mode de paiement, messages, photos et contenus audio et vidéo."</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Cet appareil est géré par tes parents. Ils peuvent voir et gérer certaines informations, telles que les applications que tu utilises, ta position et ton temps d\'utilisation de l\'appareil."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Maintenu déverrouillé par TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Protection contre le vol\nAppareil verrouillé, trop de tentatives de déverrouillage"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"L\'appareil a été verrouillé, trop de tentatives d\'authentification"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Appareil verrouillé\nÉchec de l\'authentification"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Paramètres audio"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Sous-titrer automatiquement"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Couper le son"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Caster"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponible, car la sonnerie est coupée"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Indisponible car Ne pas déranger est activé"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Indisponible car Ne pas déranger est activé"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Appuyez pour ne plus ignorer."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Appuyez pour mettre en mode vibreur. Vous pouvez ignorer les services d\'accessibilité."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Appuyez pour ignorer. Vous pouvez ignorer les services d\'accessibilité."</string>
@@ -596,25 +608,20 @@
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Son spatial"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Désactivé"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Activé"</string>
-    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Suivi des mouvements de la tête"</string>
+    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Suivi de la tête"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"Appuyez pour changer le mode de la sonnerie"</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"couper le son"</string>
     <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"réactiver le son"</string>
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"activer le vibreur"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Commandes de volume %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Les appels et les notifications sonneront (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Accéder aux paramètres de sortie"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Curseurs de volume développés"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Curseurs de volume réduits"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"couper le son de %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"réactiver le son de %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Diffusion de <xliff:g id="LABEL">%s</xliff:g> sur"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"L\'audio se mettra en marche"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Lecture audio sur"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
     <string name="status_bar" msgid="4357390266055077437">"Barre d\'état"</string>
     <string name="demo_mode" msgid="263484519766901593">"Mode démo de l\'UI du système"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Avancer dans les applications récentes"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Revenir sur les applications récentes"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ouvrir la liste d\'applications"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Afficher la barre des tâches"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ouvrir les paramètres"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Ouvrir l\'Assistant"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Verrouiller l\'écran"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Passer en écran partagé avec l\'appli actuelle affichée à droite"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Passer en écran partagé avec l\'appli actuelle affichée à gauche"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passer de l\'écran partagé au plein écran"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Passez à l\'appli à droite ou en dessous avec l\'écran partagé"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Passez à l\'appli à gauche ou au-dessus avec l\'écran partagé"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"En mode écran partagé : Remplacer une appli par une autre"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Saisie"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passer à la langue suivante"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Caméra bloquée"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Caméra et micro bloqués"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micro bloqué"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Ne pas déranger"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"La présence de l\'utilisateur est détectée"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Définir une appli de notes par défaut dans les paramètres"</string>
     <string name="install_app" msgid="5066668100199613936">"Installer l\'appli"</string>
diff --git a/packages/SystemUI/res/values-fr/tiles_states_strings.xml b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
index a560ff0..34ccb75 100644
--- a/packages/SystemUI/res/values-fr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
@@ -58,7 +58,7 @@
   </string-array>
   <string-array name="tile_states_flashlight">
     <item msgid="3465257127433353857">"Indisponible"</item>
-    <item msgid="5044688398303285224">"Désactivé"</item>
+    <item msgid="5044688398303285224">"Désactivée"</item>
     <item msgid="8527389108867454098">"Activée"</item>
   </string-array>
   <string-array name="tile_states_rotation">
@@ -79,7 +79,7 @@
   <string-array name="tile_states_location">
     <item msgid="3316542218706374405">"Indisponible"</item>
     <item msgid="4813655083852587017">"Désactivé"</item>
-    <item msgid="6744077414775180687">"Activé"</item>
+    <item msgid="6744077414775180687">"Activée"</item>
   </string-array>
   <string-array name="tile_states_hotspot">
     <item msgid="3145597331197351214">"Indisponible"</item>
@@ -113,7 +113,7 @@
   </string-array>
   <string-array name="tile_states_cast">
     <item msgid="6032026038702435350">"Indisponible"</item>
-    <item msgid="1488620600954313499">"Désactivé"</item>
+    <item msgid="1488620600954313499">"Désactivée"</item>
     <item msgid="588467578853244035">"Activé"</item>
   </string-array>
   <string-array name="tile_states_night">
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Désactivé"</item>
     <item msgid="5137565285664080143">"Activé"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 97980e5..189f048 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"O teu administrador de TI bloqueou a opción de facer capturas de pantalla"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Editar a captura de pantalla"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Compartir"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Compartir captura de pantalla"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar máis"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignorar a captura de pantalla"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Analizando cara"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
     <string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotipo da aplicación"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Tentar de novo"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toca para cancelar a autenticación"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Recoñeceuse a cara. Preme a icona de desbloquear."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar a autenticación"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Máis opcións"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrón"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar contrasinal"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Nivel estándar"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Nivel medio"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Nivel alto"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Queres desbloquear o micrófono do dispositivo?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Queres desbloquear a cámara do dispositivo?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Queres desbloquear a cámara e o micrófono do dispositivo?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Quitar"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Engadir widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Feito"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Engadir widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Accede rapidamente aos widgets das túas aplicacións favoritas sen desbloquear a tableta."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Queres permitir calquera widget na pantalla de bloqueo?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir configuración"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Reactivar apps do traballo?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"O teu pai ou nai xestiona este dispositivo e pode ver e xestionar información como as aplicacións que usas, a túa localización e o tempo diante da pantalla."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Desbloqueado por un axente de confianza"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Protección antirroubo\nDisp. bloq., demasiados intentos desb."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Bloqueouse o dispositivo por un exceso de intentos de autenticación"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Bloqueouse o dispositivo\nProduciuse un erro na autenticación"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Configuración do son"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Crear subtítulos automáticos"</string>
@@ -571,7 +585,7 @@
     <string name="screen_pinning_exit" msgid="4553787518387346893">"Deixouse de fixar a aplicación"</string>
     <string name="stream_voice_call" msgid="7468348170702375660">"Chamada"</string>
     <string name="stream_system" msgid="7663148785370565134">"Sistema"</string>
-    <string name="stream_ring" msgid="7550670036738697526">"Ton"</string>
+    <string name="stream_ring" msgid="7550670036738697526">"Son"</string>
     <string name="stream_music" msgid="2188224742361847580">"Multimedia"</string>
     <string name="stream_alarm" msgid="16058075093011694">"Alarma"</string>
     <string name="stream_notification" msgid="7930294049046243939">"Notificación"</string>
@@ -582,11 +596,9 @@
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Vibrar"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Silenciar"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Emitir"</string>
-    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Non dispoñible (o son está silenciado)"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Non dispoñible: o son está silenciado"</string>
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Non dispoñible: Non molestar está activado"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Non dispoñible: Non molestar está activado"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toca para activar o son."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toca para establecer a vibración. Pódense silenciar os servizos de accesibilidade."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toca para silenciar. Pódense silenciar os servizos de accesibilidade."</string>
@@ -603,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Controis de volume de %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"As chamadas e as notificacións soarán (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Introducir a configuración de saída"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Controis desprazables de volume despregados"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Controis desprazables de volume contraídos"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"silenciar %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"activar o son de %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Reproducindo <xliff:g id="LABEL">%s</xliff:g> en"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio reproducido en"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Reproducirase en"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Configurador da IU do sistema"</string>
     <string name="status_bar" msgid="4357390266055077437">"Barra de estado"</string>
     <string name="demo_mode" msgid="263484519766901593">"Modo de demostración da IU do sistema"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Percorrer aplicacións recentes cara adiante"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Percorrer aplicacións recentes cara atrás"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de aplicacións"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar barra de tarefas"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configuración"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir Asistente"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueo"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Activar pantalla dividida con esta aplicación no lado dereito"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Activar pantalla dividida con esta aplicación no lado esquerdo"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Cambiar á aplicación da dereita ou de abaixo coa pantalla dividida"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Cambiar á aplicación da esquerda ou de arriba coa pantalla dividida"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"En modo de pantalla dividida: Substituír unha aplicación por outra"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar ao seguinte idioma"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"A cámara está bloqueada"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"A cámara e o micrófono están bloqueados"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"O micrófono está bloqueado"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Modo Non molestar"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Detectouse a presenza de usuarios"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Establece a aplicación de notas predeterminada en Configuración"</string>
     <string name="install_app" msgid="5066668100199613936">"Instalar aplicación"</string>
diff --git a/packages/SystemUI/res/values-gl/tiles_states_strings.xml b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
index 1cde1ab..de8ee63 100644
--- a/packages/SystemUI/res/values-gl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Desactivado"</item>
     <item msgid="5137565285664080143">"Activado"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index e47b324..54312e1 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"શેર કરો"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"સ્ક્રીનશૉટ શેર કરો"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"વધુ કૅપ્ચર કરો"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"સ્ક્રીનશૉટ છોડી દો"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"ચહેરો સ્કૅન કરવો"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"મોકલો"</string>
     <string name="cancel" msgid="1089011503403416730">"રદ કરો"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"ઍપનો લોગો"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"કન્ફર્મ કરો"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ફરી પ્રયાસ કરો"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"પ્રમાણીકરણ રદ કરવા માટે ટૅપ કરો"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ચહેરો ઓળખ્યો. આગળ વધવા \'અનલૉક કરો\' આઇકન દબાવો."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"પ્રમાણિત"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"પ્રમાણીકરણ રદ કરો"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"વધુ વિકલ્પો"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"પિનનો ઉપયોગ કરો"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"પૅટર્નનો ઉપયોગ કરો"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"પાસવર્ડનો ઉપયોગ કરો"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"સ્ટૅન્ડર્ડ"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"મધ્યમ"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"વધુ"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ડિવાઇસના માઇક્રોફોનને અનબ્લૉક કરીએ?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ડિવાઇસના કૅમેરાને અનબ્લૉક કરીએ?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ડિવાઇસના કૅમેરા અને માઇક્રોફોનને અનબ્લૉક કરીએ?"</string>
@@ -437,10 +448,10 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"કાઢી નાખો"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"વિજેટ ઉમેરો"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"થઈ ગયું"</string>
-    <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) -->
-    <skip />
-    <!-- no translation found for button_text_to_open_settings (1987729256950941628) -->
-    <skip />
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"વિજેટ ઉમેરો"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"તમારું ટૅબ્લેટ અનલૉક કર્યા વિના તમારા મનપસંદ ઍપ વિજેટનો ઝડપી ઍક્સેસ મેળવો."</string>
+    <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"લૉક સ્ક્રીન પર કોઈપણ વિજેટને મંજૂરી આપીએ?"</string>
+    <string name="button_text_to_open_settings" msgid="1987729256950941628">"સેટિંગ ખોલો"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"ઑફિસની થોભાવેલી ઍપ ચાલુ કરીએ?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"ફરી ચાલુ કરો"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"વપરાશકર્તા સ્વિચ કરો"</string>
@@ -540,7 +551,8 @@
     <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="1265107698772588299">"ચોરીથી સુરક્ષા\nડિવાઇસ અનલૉક કર્યું, અનલૉક કરવાના ઘણા પ્રયાસો"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"પ્રમાણીકરણના ઘણા પ્રયાસો કરવામાં આવ્યા, તેથી ડિવાઇસ લૉક કરવામાં આવ્યું"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ડિવાઇસ લૉક કર્યું\nપ્રમાણીકરણ નિષ્ફળ થયું છે"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"સાઉન્ડ સેટિંગ"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"મીડિયામાં કૅપ્શન ઑટોમૅટિક રીતે ઉમેરો"</string>
@@ -585,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"મ્યૂટ કરો"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"કાસ્ટ કરો"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"રિંગ મ્યૂટ કરી હોવાના કારણે અનુપલબ્ધ છે"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"ઉપલબ્ધ નથી, કારણ કે ખલેલ પાડશો નહીં મોડ ચાલુ છે"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"ઉપલબ્ધ નથી, કારણ કે ખલેલ પાડશો નહીં મોડ ચાલુ છે"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. અનમ્યૂટ કરવા માટે ટૅપ કરો."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. વાઇબ્રેટ પર સેટ કરવા માટે ટૅપ કરો. ઍક્સેસિબિલિટી સેવાઓ મ્યૂટ કરવામાં આવી શકે છે."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. મ્યૂટ કરવા માટે ટૅપ કરો. ઍક્સેસિબિલિટી સેવાઓ મ્યૂટ કરવામાં આવી શકે છે."</string>
@@ -596,25 +606,20 @@
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. મ્યૂટ કરવા માટે ટૅપ કરો."</string>
     <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"અવાજનું નિયંત્રણ"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"સ્પેશલ ઑડિયો"</string>
-    <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"બંધ કરો"</string>
+    <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"બંધ"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ફિક્સ્ડ"</string>
-    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"હેડ ટ્રૅકિંગ"</string>
+    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"હૅડ ટ્રૅકિંગ"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"રિંગર મોડ બદલવા માટે ટૅપ કરો"</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"મ્યૂટ કરો"</string>
     <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"અનમ્યૂટ કરો"</string>
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"વાઇબ્રેટ"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s વૉલ્યૂમ નિયંત્રણો"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"કૉલ અને નોટિફિકેશનની રિંગ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>) પર વાગશે"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"આઉટપુટના સેટિંગ દાખલ કરો"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"વૉલ્યૂમના સ્લાઇડર મોટા કરવામાં આવ્યા"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"વૉલ્યૂમના સ્લાઇડર નાના કરવામાં આવ્યા"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%sને મ્યૂટ કરો"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%sને અનમ્યૂટ કરો"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> વગાડી રહ્યાં છીએ"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"ઑડિયો આની પર વાગશે"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"સિસ્ટમ UI ટ્યૂનર"</string>
@@ -761,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"તાજેતરની ઍપ પર આગળ જાઓ"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"તાજેતરની ઍપ પર પાછળ જાઓ"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ઍપની સૂચિ ખોલો"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ટાસ્કબાર બતાવો"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"સેટિંગ ખોલો"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ખોલો"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"લૉક સ્ક્રીન"</string>
@@ -770,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"જમણી બાજુ પર હાલની ઍપ સાથે વિભાજિત સ્ક્રીનમાં દાખલ થાઓ"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"ડાબી બાજુ પર હાલની ઍપ સાથે વિભાજિત સ્ક્રીનમાં દાખલ થાઓ"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"વિભાજિત સ્ક્રીનથી પૂર્ણ સ્ક્રીન પર સ્વિચ કરો"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"વિભાજિત સ્ક્રીનનો ઉપયોગ કરતી વખતે જમણી બાજુ કે નીચેની ઍપ પર સ્વિચ કરો"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"વિભાજિત સ્ક્રીનનો ઉપયોગ કરતી વખતે ડાબી બાજુની કે ઉપરની ઍપ પર સ્વિચ કરો"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"વિભાજિત સ્ક્રીન દરમિયાન: એક ઍપને બીજી ઍપમાં બદલો"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ઇનપુટ"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"આગલી ભાષા પર સ્વિચ કરો"</string>
@@ -1268,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"કૅમેરા બ્લૉક કરેલો છે"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"કૅમેરા અને માઇક્રોફોન બ્લૉક કરેલા છે"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"માઇક્રોફોન બ્લૉક કરેલો છે"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"ખલેલ પાડશો નહીં"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"વપરાશકર્તાની હાજરીની ભાળ મળી છે"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"સેટિંગમાં નોંધની ડિફૉલ્ટ ઍપ સેટ કરો"</string>
     <string name="install_app" msgid="5066668100199613936">"ઍપ ઇન્સ્ટૉલ કરો"</string>
diff --git a/packages/SystemUI/res/values-gu/tiles_states_strings.xml b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
index 65b6133..c6a86e5 100644
--- a/packages/SystemUI/res/values-gu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"બંધ"</item>
     <item msgid="5137565285664080143">"ચાલુ"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index c36b6f9..ee3e40b 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"आईटी एडमिन ने स्क्रीनशॉट लेने पर रोक लगाई है"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"बदलाव करें"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रीनशॉट में बदलाव करें"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"शेयर करें"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"स्क्रीनशॉट शेयर करें"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"ज़्यादा कॉन्टेंट कैप्चर करें"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट को खारिज करें"</string>
@@ -103,7 +104,7 @@
     <string name="screenrecord_title" msgid="4257171601439507792">"स्क्रीन रिकॉर्डर"</string>
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रीन रिकॉर्डिंग को प्रोसेस किया जा रहा है"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रिकॉर्ड सेशन के लिए जारी सूचना"</string>
-    <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"क्या स्क्रीन रिकॉर्ड करनी है?"</string>
+    <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"क्या रिकॉर्डिंग शुरू करनी है?"</string>
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"रिकॉर्ड करते समय, Android के पास स्क्रीन पर दिख रहे कॉन्टेंट या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
     <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"किसी ऐप्लिकेशन को रिकॉर्ड करते समय, Android के पास उस ऐप्लिकेशन पर दिख रहे कॉन्टेंट या उस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"रिकॉर्ड करें"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"डिवाइस अनलॉक करने के लिए चेहरा स्कैन किया जाता है"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"भेजें"</string>
     <string name="cancel" msgid="1089011503403416730">"रद्द करें"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"ऐप्लिकेशन का लोगो"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"पुष्टि करें"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"फिर से कोशिश करें"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"पुष्टि की प्रक्रिया रद्द करने के लिए टैप करें"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"चेहरे की पहचान हो गई. जारी रखने के लिए अनलॉक आइकॉन को टैप करें."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"पुष्टि हो गई"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"पुष्टि करने की प्रोसेस को रद्द करें"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ज़्यादा विकल्प"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"पिन इस्तेमाल करें"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"पैटर्न इस्तेमाल करें"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"पासवर्ड इस्तेमाल करें"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"स्टैंडर्ड"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"सामान्य"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"ज़्यादा"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"क्या आपको डिवाइस का माइक्रोफ़ोन अनब्लॉक करना है?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"क्या आपको डिवाइस का कैमरा अनब्लॉक करना है?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"क्या आप डिवाइस का कैमरा और माइक्रोफ़ोन अनब्लॉक करना चाहते हैं?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"हटाएं"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"विजेट जोड़ें"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"हो गया"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"विजेट जोड़ें"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"अपने टैबलेट को अनलॉक किए बिना, अपने पसंदीदा ऐप्लिकेशन विजेट को तुरंत ऐक्सेस करें."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"लॉक स्क्रीन पर किसी भी विजेट को अनुमति देनी है?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"सेटिंग खोलें"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"वर्क ऐप्लिकेशन चालू करने हैं?"</string>
@@ -462,15 +475,15 @@
     <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"रिकॉर्ड या कास्ट करते समय, इस सुविधा को उपलब्ध कराने वाली सेवा के पास आपकी स्क्रीन पर दिख रही जानकारी या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. जैसे, पासवर्ड, पेमेंट के तरीके की जानकारी, फ़ोटो, मैसेज, और डिवाइस पर चल रहा ऑडियो."</string>
     <string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"पूरी स्क्रीन"</string>
     <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"सिर्फ़ एक ऐप्लिकेशन"</string>
-    <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"रिकॉर्ड या शेयर करने के लिए ऐप्लिकेशन चुनें"</string>
+    <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"ऐप्लिकेशन शेयर करें या उसकी रिकॉर्डिंग करें"</string>
     <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"क्या <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> का इस्तेमाल करके रिकॉर्ड या कास्ट करना है?"</string>
     <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"शेयर, रिकॉर्ड या कास्ट करते समय, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> के पास स्क्रीन पर दिख रहे कॉन्टेंट या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
     <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"किसी ऐप्लिकेशन को शेयर, रिकॉर्ड या कास्ट करते समय, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> के पास उस ऐप्लिकेशन पर दिख रहे कॉन्टेंट या उस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"शुरू करें"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ने इस विकल्प को बंद कर दिया है"</string>
-    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"क्या मीडिया कास्ट करना है?"</string>
+    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"क्या कास्टिंग शुरू करनी है?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"कास्ट करते समय, Android के पास स्क्रीन पर दिख रहे कॉन्टेंट या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"किसी ऐप्लिकेशन को कास्ट करते समय, Android के पास उस ऐप्लिकेशन पर दिख रहे कॉन्टेंट या उस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"जब किसी ऐप्लिकेशन को कास्ट किया जाता है, तब उस पर दिख रहे कॉन्टेंट या चल रहे हर मीडिया का ऐक्सेस Android के पास होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर आपको सावधानी बरतनी चाहिए."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"कास्ट करें"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"क्या मीडिया शेयर करना है?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"शेयर, रिकॉर्ड या कास्ट करते समय, Android के पास स्क्रीन पर दिख रहे कॉन्टेंट या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"इस डिवाइस का प्रबंधन आपके अभिभावक करते हैं. अभिभावक आपके डिवाइस से जुड़ी जानकारी देख सकते हैं. साथ ही, इसे प्रबंधित कर सकते हैं. इनमें आपके इस्तेमाल किए गए ऐप्लिकेशन, जगह की जानकारी, और डिवाइस के इस्तेमाल में बिताए गए समय जैसी जानकारी शामिल है."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"वीपीएन"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent की वजह से अनलॉक रखा गया है"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"चोरी से सुरक्षा\nडिवाइस लॉक हो गया, अनलॉक की कई कोशिशें की गईं"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"कई बार पुष्टि करने की कोशिश की वजह से, डिवाइस लॉक है"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"डिवाइस लॉक है\nपुष्टि नहीं की जा सकी."</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"साउंड सेटिंग"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"ऑडियो-वीडियो से अपने-आप कैप्शन बनना"</string>
@@ -571,7 +585,7 @@
     <string name="screen_pinning_exit" msgid="4553787518387346893">"ऐप्लिकेशन अनपिन किया गया"</string>
     <string name="stream_voice_call" msgid="7468348170702375660">"कॉल करें"</string>
     <string name="stream_system" msgid="7663148785370565134">"सिस्‍टम"</string>
-    <string name="stream_ring" msgid="7550670036738697526">"घंटी बजाएं"</string>
+    <string name="stream_ring" msgid="7550670036738697526">"रिंग"</string>
     <string name="stream_music" msgid="2188224742361847580">"मीडिया"</string>
     <string name="stream_alarm" msgid="16058075093011694">"अलार्म"</string>
     <string name="stream_notification" msgid="7930294049046243939">"सूचना"</string>
@@ -582,11 +596,9 @@
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"वाइब्रेशन"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"आवाज़ बंद है"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"कास्ट करें"</string>
-    <string name="stream_notification_unavailable" msgid="4313854556205836435">"रिंग म्यूट होने से आवाज़ नहीं सुनाई दी"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_notification_unavailable" msgid="4313854556205836435">"आवाज़ नहीं आएगी, क्योंकि रिंग म्यूट है"</string>
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"सुविधा बंद है, क्योंकि \'परेशान न करें\' मोड चालू है"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"आवाज़ बंद है, क्योंकि \'परेशान न करें\' मोड चालू है"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. अनम्यूट करने के लिए टैप करें."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. कंपन पर सेट करने के लिए टैप करें. सुलभता सेवाएं म्यूट हो सकती हैं."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. म्यूट करने के लिए टैप करें. सुलभता सेवाएं म्यूट हो सकती हैं."</string>
@@ -594,27 +606,22 @@
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. म्यूट करने के लिए टैप करें."</string>
     <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"शोर को कंट्रोल करने की सुविधा"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"स्पेशल ऑडियो"</string>
-    <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"बंद करें"</string>
-    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"चालू करें"</string>
-    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"सिर हिलना ट्रैक करें"</string>
+    <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"बंद है"</string>
+    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"चालू है"</string>
+    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"हेड ट्रैकिंग चालू है"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"रिंगर मोड बदलने के लिए टैप करें"</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"म्यूट करें"</string>
     <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"अनम्यूट करें"</string>
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"वाइब्रेशन की सुविधा चालू करें"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s की आवाज़ कम या ज़्यादा करने की सुविधा"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"कॉल और सूचनाएं आने पर घंटी बजेगी (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"आउटपुट की सेटिंग डालें"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"आवाज़ के स्लाइडर को बड़ा किया गया"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"आवाज़ के स्लाइडर को छोटा किया गया"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s को म्यूट करें"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s को अनम्यूट करें"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> को चलाया जा रहा है"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"ऑडियो इसमें चलेगा"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"ऑडियो इस पर चलेगा"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"सिस्टम यूज़र इंटरफ़ेस (यूआई) ट्यूनर"</string>
     <string name="status_bar" msgid="4357390266055077437">"स्टेटस बार"</string>
     <string name="demo_mode" msgid="263484519766901593">"सिस्टम यूज़र इंटरफ़ेस (यूआई) डेमो मोड"</string>
@@ -625,7 +632,7 @@
     <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>
-    <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"अनलॉक करने के लिए टैप करें"</string>
+    <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"खोलने के लिए टैप करें"</string>
     <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"अपडेट हो रहा है"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"इस्तेमाल करने के लिए, डिवाइस अनलॉक करें"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"आपके कार्ड की जानकारी पाने में कोई समस्या हुई है. कृपया बाद में कोशिश करें"</string>
@@ -633,7 +640,7 @@
     <string name="qr_code_scanner_title" msgid="1938155688725760702">"क्यूआर कोड स्कैनर"</string>
     <string name="qr_code_scanner_updating_secondary_label" msgid="8344598017007876352">"अपडेट हो रहा है"</string>
     <string name="status_bar_work" msgid="5238641949837091056">"वर्क प्रोफ़ाइल"</string>
-    <string name="status_bar_airplane" msgid="4848702508684541009">"हवाई जहाज़ मोड"</string>
+    <string name="status_bar_airplane" msgid="4848702508684541009">"फ़्लाइट मोड"</string>
     <string name="zen_alarm_warning" msgid="7844303238486849503">"आपको <xliff:g id="WHEN">%1$s</xliff:g> पर अपना अगला अलार्म नहीं सुनाई देगा"</string>
     <string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> बजे"</string>
     <string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> पर"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन के अगले पेज पर जाने के लिए"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन के पिछले पेज पर जाने के लिए"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ऐप्लिकेशन की सूची खोलने के लिए"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"टास्कबार दिखाने के लिए"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"सेटिंग खोलने के लिए"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Google Assistant खोलने के लिए"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"लॉक स्क्रीन"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"स्प्लिट स्क्रीन का इस्तेमाल करके, मौजूदा ऐप्लिकेशन को दाईं ओर ले जाएं"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"स्प्लिट स्क्रीन का इस्तेमाल करके, मौजूदा ऐप्लिकेशन को बाईं ओर ले जाएं"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीन से फ़ुल स्क्रीन मोड पर स्विच करने के लिए"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"स्प्लिट स्क्रीन इस्तेमाल करते समय दाईं ओर या नीचे के ऐप पर स्विच करें"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"स्प्लिट स्क्रीन इस्तेमाल करते समय बाईं ओर या ऊपर के ऐप पर स्विच करें"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रीन के दौरान: एक ऐप्लिकेशन को दूसरे ऐप्लिकेशन से बदलें"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"अगली भाषा पर स्विच करने के लिए"</string>
@@ -1178,7 +1186,7 @@
     <string name="see_all_networks" msgid="3773666844913168122">"सभी देखें"</string>
     <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"नेटवर्क बदलने के लिए, पहले ईथरनेट को डिसकनेक्ट करें"</string>
     <string name="wifi_scan_notify_message" msgid="3753839537448621794">"डिवाइस इस्तेमाल करने के अनुभव काे बेहतर बनाने के लिए, ऐप्लिकेशन और सेवाओं की मदद से, किसी भी समय वाई-फ़ाई नेटवर्क स्कैन किए जा सकते हैं. ऐसा वाई-फ़ाई बंद होने पर भी किया जा सकता है. वाई-फ़ाई स्कैनिंग की सेटिंग में जाकर, इसे बदला जा सकता है. "<annotation id="link">"बदलें"</annotation></string>
-    <string name="turn_off_airplane_mode" msgid="8425587763226548579">"हवाई जहाज़ मोड बंद करें"</string>
+    <string name="turn_off_airplane_mode" msgid="8425587763226548579">"फ़्लाइट मोड बंद करें"</string>
     <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> इस टाइल को \'फटाफट सेटिंग\' में जोड़ने के लिए अनुमति चाहता है"</string>
     <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"टाइल जोड़ें"</string>
     <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"टाइल न जोड़ें"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"कैमरे का ऐक्सेस नहीं है"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"कैमरे और माइक्रोफ़ोन का ऐक्सेस नहीं है"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"माइक्रोफ़ोन का ऐक्सेस नहीं है"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"\'परेशान न करें\' मोड"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"उपयोगकर्ता की मौजूदगी का पता लगाया गया"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिंग में जाकर, नोट लेने की सुविधा देने वाले ऐप्लिकेशन को डिफ़ॉल्ट के तौर पर सेट करें"</string>
     <string name="install_app" msgid="5066668100199613936">"ऐप्लिकेशन इंस्टॉल करें"</string>
diff --git a/packages/SystemUI/res/values-hi/tiles_states_strings.xml b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
index b49d3b9..0cb06c0 100644
--- a/packages/SystemUI/res/values-hi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"बंद है"</item>
     <item msgid="5137565285664080143">"चालू है"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 2d44e1c..a1d885a 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Izradu snimki zaslona blokirao je IT administrator"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Uredi"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Uređivanje snimke zaslona"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Podijelite"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Podijeli snimku zaslona"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimi više"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacivanje snimke zaslona"</string>
@@ -104,8 +105,8 @@
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrada snimanja zaslona"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Tekuća obavijest za sesiju snimanja zaslona"</string>
     <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Želite li pokrenuti snimanje?"</string>
-    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Dok snimate, Android ima pristup svemu što je vidljivo na vašem zaslonu ili se reproducira na vašem uređaju. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Dok snimate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
+    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Dok snimate, Android ima pristup svemu što je vidljivo na zaslonu ili se reproducira na uređaju. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Dok snimate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Pokreni snimanje"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Snimanje zvuka"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk na uređaju"</string>
@@ -140,7 +141,7 @@
     <string name="accessibility_accessibility_button" msgid="4089042473497107709">"Pristupačnost"</string>
     <string name="accessibility_rotate_button" msgid="1238584767612362586">"Zakretanje zaslona"</string>
     <string name="accessibility_recent" msgid="901641734769533575">"Pregled"</string>
-    <string name="accessibility_camera_button" msgid="2938898391716647247">"Fotoaparat"</string>
+    <string name="accessibility_camera_button" msgid="2938898391716647247">"Kamera"</string>
     <string name="accessibility_phone_button" msgid="4256353121703100427">"Telefon"</string>
     <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"Glasovna pomoć"</string>
     <string name="accessibility_wallet_button" msgid="1458258783460555507">"Wallet"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Skeniranje lica"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Pošalji"</string>
     <string name="cancel" msgid="1089011503403416730">"Odustani"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotip aplikacije"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potvrdi"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Pokušaj ponovo"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Dodirnite da biste otkazali autentifikaciju"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice je prepoznato. Pritisnite ikonu otključavanja da biste nastavili."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikacija izvršena"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Otkaži autentifikaciju"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Više opcija"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristite PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristite uzorak"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Koristite zaporku"</string>
@@ -262,10 +265,10 @@
     <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Ne uznemiravaj"</string>
     <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Upareni uređaji nisu dostupni"</string>
-    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da biste povezali uređaj ili prekinuli vezu uređaja"</string>
-    <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Upari novi uređaj"</string>
+    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da biste povezali uređaj ili prekinuli vezu s njim"</string>
+    <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Uparite novi uređaj"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Pogledajte sve"</string>
-    <string name="turn_on_bluetooth" msgid="5681370462180289071">"Uključi"</string>
+    <string name="turn_on_bluetooth" msgid="5681370462180289071">"Koristi Bluetooth"</string>
     <string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Povezano"</string>
     <string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Spremljeno"</string>
     <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"prekini vezu"</string>
@@ -283,7 +286,7 @@
     <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Automatsko zakretanje zaslona"</string>
     <string name="quick_settings_location_label" msgid="2621868789013389163">"Lokacija"</string>
     <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Čuvar zaslona"</string>
-    <string name="quick_settings_camera_label" msgid="5612076679385269339">"Pristup fotoaparatu"</string>
+    <string name="quick_settings_camera_label" msgid="5612076679385269339">"Pristup kameri"</string>
     <string name="quick_settings_mic_label" msgid="8392773746295266375">"Pristup mikrofonu"</string>
     <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Dostupno"</string>
     <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Blokirano"</string>
@@ -291,7 +294,7 @@
     <string name="quick_settings_user_title" msgid="8673045967216204537">"Korisnik"</string>
     <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
     <string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
-    <string name="quick_settings_networks_available" msgid="1875138606855420438">"Mreže su dostupne"</string>
+    <string name="quick_settings_networks_available" msgid="1875138606855420438">"Dostupne su mreže"</string>
     <string name="quick_settings_networks_unavailable" msgid="1167847013337940082">"Mreže nisu dostupne"</string>
     <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"Nije dostupna nijedna Wi-Fi mreža"</string>
     <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Uključivanje…"</string>
@@ -345,7 +348,7 @@
     <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Početak"</string>
     <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Zaustavi"</string>
     <string name="qs_record_issue_label" msgid="8166290137285529059">"Zabilježi poteškoću"</string>
-    <string name="qs_record_issue_start" msgid="2979831312582567056">"Početak"</string>
+    <string name="qs_record_issue_start" msgid="2979831312582567056">"Pokreni"</string>
     <string name="qs_record_issue_stop" msgid="3531747965741982657">"Zaustavi"</string>
     <string name="qs_record_issue_dropdown_header" msgid="5995983175678658329">"Na koji dio doživljaja na uređaju to utjecalo?"</string>
     <string name="qs_record_issue_dropdown_prompt" msgid="2526949919167046219">"Odaberite vrstu problema"</string>
@@ -360,12 +363,20 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardni"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Srednji"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Visoki"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Želite li deblokirati mikrofon uređaja?"</string>
-    <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Želite li deblokirati fotoaparat uređaja?"</string>
-    <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Želite li deblokirati fotoaparat i mikrofon uređaja?"</string>
+    <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Želite li deblokirati kameru uređaja?"</string>
+    <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Želite li deblokirati kameru i mikrofon uređaja?"</string>
     <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Time se deblokira pristup za sve aplikacije i usluge kojima je dopuštena upotreba vašeg mikrofona."</string>
-    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Time se deblokira pristup za sve aplikacije i usluge kojima je dopuštena upotreba vašeg fotoaparata."</string>
-    <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Time se deblokira pristup za sve aplikacije i usluge kojima je dopuštena upotreba vašeg fotoaparata ili mikrofona."</string>
+    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Time se deblokira pristup za sve aplikacije i usluge kojima je dopuštena upotreba vaše kamere."</string>
+    <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Time se deblokira pristup za sve aplikacije i usluge kojima je dopuštena upotreba vaše kamere ili mikrofona."</string>
     <string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Mikrofon je blokiran"</string>
     <string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Kamera je blokirana"</string>
     <string name="sensor_privacy_start_use_mic_camera_blocked_dialog_title" msgid="195236134743281973">"Mikrofon i kamera su blokirani"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Ukloni"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodaj widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotovo"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Dodaj widgete"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Brzo pristupajte widgetima omiljenih aplikacija bez otključavanja tableta."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Želite li dopustiti bilo koji widget na zaključanom zaslonu?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvori postavke"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Pokrenuti poslovne aplikacije?"</string>
@@ -464,17 +477,17 @@
     <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Jedna aplikacija"</string>
     <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Dijeljenje ili snimanje aplikacije"</string>
     <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Želite li započeti snimanje ili emitiranje pomoću aplikacije <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Kad dijelite, snimate ili emitirate, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup svemu što je vidljivo na vašem zaslonu ili se reproducira na vašem uređaju. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Kad dijelite, snimate ili emitirate aplikaciju, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Kad dijelite, snimate ili emitirate, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup svemu što je vidljivo na zaslonu ili se reproducira na uređaju. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Kad dijelite, snimate ili emitirate aplikaciju, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Pokreni"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> onemogućila je ovu opciju"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Želite li pokrenuti emitiranje?"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Kad emitirate, Android ima pristup svemu što je vidljivo na vašem zaslonu ili se reproducira na vašem uređaju. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Kad emitirate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Kad emitirate, Android ima pristup svemu što je vidljivo na zaslonu ili se reproducira na uređaju. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Kad emitirate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Pokreni emitiranje"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Želite li pokrenuti dijeljenje?"</string>
-    <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kad dijelite, snimate ili emitirate, Android ima pristup svemu što je vidljivo na vašem zaslonu ili se reproducira na vašem uređaju. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
-    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kad dijelite, snimate ili emitirate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
+    <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kad dijelite, snimate ili emitirate, Android ima pristup svemu što je vidljivo na zaslonu ili se reproducira na uređaju. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
+    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kad dijelite, snimate ili emitirate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
     <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Pokreni"</string>
     <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Dijeljenje pauza tijekom prebacivanja aplikacija"</string>
     <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Umjesto toga podijelite ovu aplikaciju"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Ovim uređajem upravlja tvoj roditelj. Tvoj roditelj može vidjeti podatke kao što su aplikacije kojima se koristiš, lokaciju i vrijeme upotrebe te upravljati njima."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Otključano održava TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Zaštita od krađe\nUređaj zaključan, previše pokušaja otključavanja"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Uređaj je bio zaključan zbog previše pokušaja autentifikacije"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Uređaj je zaključan\nAutentifikacija nije uspjela"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Postavke zvuka"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatski titlovi za medije"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Zvuk je isključen"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Emitiraj"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nedostupno jer je zvono utišano"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nedostupno jer je uključen način Ne uznemiravaj"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Nedostupno jer je uključen način Ne uznemiravaj"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Dodirnite da biste uključili zvuk."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Dodirnite da biste postavili na vibraciju. Usluge pristupačnosti možda neće imati zvuk."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Dodirnite da biste isključili zvuk. Usluge pristupačnosti možda neće imati zvuk."</string>
@@ -595,7 +607,7 @@
     <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kontrola buke"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Prostorni zvuk"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Isključeno"</string>
-    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Otklonjeno"</string>
+    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fiksno"</string>
     <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Praćenje glave"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"Dodirnite da biste promijenili način softvera zvona"</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"isključivanje zvuka"</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibriranje"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Kontrole glasnoće – %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Telefon će zvoniti za pozive i obavijesti (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Unesite postavke izlaza"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Proširivanje klizača za glasnoću"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Sažimanje klizača za glasnoću"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"isključili zvuk za sljedeće: %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"uključili zvuk za sljedeće: %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Reproducira se – <xliff:g id="LABEL">%s</xliff:g>"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk će se reproducirati"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Ugađanje korisničkog sučelja sustava"</string>
@@ -662,7 +669,7 @@
     <string name="notification_automatic_title" msgid="3745465364578762652">"Automatski"</string>
     <string name="notification_channel_summary_low" msgid="4860617986908931158">"Bez zvuka ili vibracije"</string>
     <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Bez zvuka ili vibracije i prikazuje se pri dnu odjeljka razgovora"</string>
-    <string name="notification_channel_summary_default" msgid="777294388712200605">"Možda će zvoniti ili vibrirati, ovisno o postavkama uređaja"</string>
+    <string name="notification_channel_summary_default" msgid="777294388712200605">"Može zvoniti ili vibrirati ovisno o postavkama uređaja"</string>
     <string name="notification_channel_summary_default_with_bubbles" msgid="3482483084451555344">"Možda će zvoniti ili vibrirati, ovisno o postavkama uređaja. Razgovori iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> prikazuju se u oblačiću prema zadanim postavkama."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Neka sustav odredi treba li obavijest najaviti zvukom ili vibracijom"</string>
     <string name="notification_channel_summary_automatic_alerted" msgid="954166812246932240">"&lt;b&gt;Status:&lt;/b&gt; promaknuta u zadanu"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Kruži unaprijed kroz nedavne aplikacije"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Kruži unatrag kroz nedavne aplikacije"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvori popis aplikacija"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Pokaži traku sa zadacima"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvori postavke"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvori Asistenta"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Zaključavanje zaslona"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Otvori podijeljeni zaslon s trenutačnom aplikacijom s desne strane"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Otvori podijeljeni zaslon s trenutačnom aplikacijom s lijeve strane"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prijeđi s podijeljenog zaslona na cijeli zaslon"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Prijeđite na aplikaciju zdesna ili ispod uz podijeljeni zaslon"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Prijeđite na aplikaciju slijeva ili iznad uz podijeljeni zaslon"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Tijekom podijeljenog zaslona: zamijeni aplikaciju drugom"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Prijeđi na sljedeći jezik"</string>
@@ -936,7 +944,7 @@
     <string name="ongoing_privacy_dialog_attribution_text" msgid="4738795925380373994">"(putem apl. <xliff:g id="APPLICATION_NAME_S_">%s</xliff:g>)"</string>
     <string name="ongoing_privacy_dialog_attribution_label" msgid="3385241594101496292">"(<xliff:g id="ATTRIBUTION_LABEL">%s</xliff:g>)"</string>
     <string name="ongoing_privacy_dialog_attribution_proxy_label" msgid="1111829599659403249">"(<xliff:g id="ATTRIBUTION_LABEL">%1$s</xliff:g> • <xliff:g id="PROXY_LABEL">%2$s</xliff:g>)"</string>
-    <string name="privacy_type_camera" msgid="7974051382167078332">"fotoaparat"</string>
+    <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string>
     <string name="privacy_type_location" msgid="7991481648444066703">"lokaciju"</string>
     <string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string>
     <string name="privacy_type_media_projection" msgid="8136723828804251547">"snimanje zaslona"</string>
@@ -1239,7 +1247,7 @@
     <string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Dostupan je najmanje jedan uređaj ili ploča uređaja"</string>
     <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Odaberite zadanu aplikaciju za bilješke da biste koristili prečac za pisanje bilježaka"</string>
     <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Odaberite aplikaciju"</string>
-    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Prečac za dodirnuti i zadržati"</string>
+    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Dodirnite i zadržite prečac"</string>
     <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Odustani"</string>
     <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Promijenite zaslon odmah"</string>
     <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Otklopite telefon"</string>
@@ -1260,14 +1268,13 @@
     <string name="call_from_work_profile_action" msgid="2937701298133010724">"Prijeđite na poslovni profil"</string>
     <string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"Instaliraj poslovnu aplikaciju telefona"</string>
     <string name="call_from_work_profile_close" msgid="5830072964434474143">"Odustani"</string>
-    <string name="lock_screen_settings" msgid="6152703934761402399">"Prilagodi zaključavanje zaslona"</string>
+    <string name="lock_screen_settings" msgid="6152703934761402399">"Prilagodite zaključavanje zaslona"</string>
     <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Otključajte da biste prilagodili zaključani zaslon"</string>
     <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi nije dostupan"</string>
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Blokirani su kamera i mikrofon"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Ne uznemiravaj"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Otkrivena je prisutnost korisnika"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Postavite zadanu aplikaciju za bilješke u postavkama"</string>
     <string name="install_app" msgid="5066668100199613936">"Instalacija"</string>
diff --git a/packages/SystemUI/res/values-hr/tiles_states_strings.xml b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
index 75fb325..e09cab5 100644
--- a/packages/SystemUI/res/values-hr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Isključeno"</item>
     <item msgid="5137565285664080143">"Uključeno"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 98565c0..baea240 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"A képernyőkép készítésének lehetőségét a rendszergazda letiltotta"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Szerkesztés"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Képernyőkép szerkesztése"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Megosztás"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Képernyőkép megosztása"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Több rögzítése"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Képernyőkép elvetése"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Arc keresése"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Küldés"</string>
     <string name="cancel" msgid="1089011503403416730">"Mégse"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Alkalmazás emblémája"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Megerősítés"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Újrapróbálkozás"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Koppintson a hitelesítés visszavonásához"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Arc felismerve. A folytatáshoz koppintson a Feloldásra."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Hitelesítve"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Hitelesítés megszakítása"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"További lehetőségek"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-kód használata"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Minta használata"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Jelszó használata"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Normál"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Közepes"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Nagy"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Feloldja az eszköz mikrofonjának letiltását?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Feloldja az eszköz kamerájának letiltását?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Feloldja az eszköz kamerájának és mikrofonjának letiltását?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Eltávolítás"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Modul hozzáadása"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Kész"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Modulok hozzáadása"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Táblagépe feloldása nélkül, gyorsan hozzáférhet kedvenc alkalmazásmoduljaihoz."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Minden modult engedélyez a lezárási képernyőn?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Beállítások megnyitása"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Feloldja a munkahelyi appokat?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Az eszközt a szülőd felügyeli. A szülőd megtekintheti és kezelheti például a használt alkalmazásokra, a tartózkodási helyre és a képernyőidőre vonatkozó adatokat."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Feloldva tartva TrustAgent által"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Lopásgátlás\nTúl sok feloldási kísérlet, eszköz zárolva"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Az eszköz túl sok hitelesítési kísérlet miatt zárolva lett."</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Eszköz zárolva\nSikertelen hitelesítés"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Hangbeállítások"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatikus feliratozás"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Néma"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Átküldés"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nem lehetséges, a csörgés le van némítva"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nem működik, mert be van kapcsolva a Ne zavarjanak"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Nem működik, mert be van kapcsolva a Ne zavarjanak"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Koppintson a némítás megszüntetéséhez."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Koppintson a rezgés beállításához. Előfordulhat, hogy a kisegítő lehetőségek szolgáltatásai le vannak némítva."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Koppintson a némításhoz. Előfordulhat, hogy a kisegítő lehetőségek szolgáltatásai le vannak némítva."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"rezgés"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s hangerőszabályzók"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"A hívásoknál és értesítéseknél csörög a telefon (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Kimenet beállításainak megadása"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Hangerő-szabályozók kibontva"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Hangerő-szabályozók összecsukva"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s némítása"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s némításának feloldása"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> lejátszása itt:"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Hang lejátszása itt:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Kezelőfelület-hangoló"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Lépegetés előrefelé a legutóbbi alkalmazások között"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Lépegetés visszafelé a legutóbbi alkalmazások között"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Alkalmazáslista megnyitása"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Feladatsáv megjelenítése"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Beállítások megnyitása"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"A Segéd megnyitása"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Lezárási képernyő"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Osztott képernyő aktiválása; az aktuális alkalmazás kerüljön jobbra"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Osztott képernyő aktiválása; az aktuális alkalmazás kerüljön balra"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Váltás osztott képernyőről teljes képernyőre"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Váltás a jobb oldalt, illetve lent lévő appra osztott képernyő esetén"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Váltás a bal oldalt, illetve fent lévő appra osztott képernyő esetén"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Osztott képernyőn: az egyik alkalmazás lecserélése egy másikra"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Bevitel"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Váltás a következő nyelvre"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera letiltva"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera és mikrofon letiltva"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon letiltva"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Ne zavarjanak"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Felhasználói jelenlét észlelve"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Állítson be alapértelmezett jegyzetkészítő alkalmazást a Beállításokban"</string>
     <string name="install_app" msgid="5066668100199613936">"Alkalmazás telepítése"</string>
diff --git a/packages/SystemUI/res/values-hu/tiles_states_strings.xml b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
index 3ca3914..8f75dc6 100644
--- a/packages/SystemUI/res/values-hu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Ki"</item>
     <item msgid="5137565285664080143">"Be"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 5d88e0d..3f88746 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Ձեր ՏՏ ադմինիստրատորն արգելափակել է սքրինշոթներ անելու հնարավորությունը"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Փոփոխել"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Փոփոխել սքրինշոթը"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Կիսվել"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Ուղարկել սքրինշոթ"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Մեծացնել սքրինշոթի տարածքը"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Փակել սքրինշոթը"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Դեմքի սկանավորում"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Ուղարկել"</string>
     <string name="cancel" msgid="1089011503403416730">"Չեղարկել"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Հավելվածի լոգո"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Հաստատել"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Նորից փորձել"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Հպեք՝ նույնականացումը չեղարկելու համար"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Դեմքը ճանաչվեց։ Սեղմեք ապակողպման պատկերակը։"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Նույնականացված է"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Չեղարկել իսկորոշումը"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Լրացուցիչ ընտրանքներ"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Օգտագործել PIN կոդ"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Օգտագործել նախշ"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Օգտագործել գաղտնաբառ"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Սովորական"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Միջին"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Բարձր"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Արգելահանե՞լ սարքի խոսափողը"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Արգելահանե՞լ սարքի տեսախցիկը"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Արգելահանե՞լ սարքի տեսախցիկը և խոսափողը"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Հեռացնել"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ավելացնել վիջեթ"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Պատրաստ է"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Ավելացնել վիջեթներ"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Արագ բացեք հավելվածների ձեր սիրելի վիջեթները առանց ապակողպելու պլանշետը։"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Թույլատրե՞լ վիջեթների ցուցադրումը կողպէկրանին"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Բացել կարգավորումները"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Վերսկսե՞լ աշխ. հավելվածները"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"Գողությունից պաշտպանություն\nՍարքը կողպվել է, ապակողպման շատ փորձեր"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Սարքը կողպվել է․ իսկորոշման չափազանց շատ փորձեր են արվել"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Սարքը կողպվել է\nՉհաջողվեց իսկորոշել"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Ձայնի կարգավորումներ"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Ավտոմատ ավելացնել ենթագրեր"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Անձայն"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Հեռարձակում"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Հասանելի չէ, երբ զանգի ձայնն անջատված է"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Հասանելի չէ․ «Չանհանգստացնել» ռեժիմը միացված է"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Հասանելի չէ․ «Չանհանգստացնել» ռեժիմը միացված է"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s: Հպեք՝ ձայնը միացնելու համար:"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s: Հպեք՝ թրթռումը միացնելու համար: Մատչելիության ծառայությունների ձայնը կարող է անջատվել:"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s: Հպեք՝ ձայնն անջատելու համար: Մատչելիության ծառայությունների ձայնը կարող է անջատվել:"</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"միացնել թրթռոցը"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Ձայնի ուժգնության կառավարներ` %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Զանգերի և ծանուցումների համար հեռախոսի ձայնը միացված է (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Բացել նվագարկման կարգավորումները"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Ձայնի ուժգնության սահիչները ծավալված են"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Ձայնի ուժգնության սահիչները ծալված են"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"անջատել ձայնը (%s)"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"միացնել ձայնը (%s)"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>. նվագարկվում է"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Աուդիոն կնվագարկվի"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Համակարգի ՕՄ-ի կարգավորիչ"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Առաջ անցնել վերջին հավելվածների միջով"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Հետ անցնել վերջին հավելվածների միջով"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Բացել հավելվածների ցանկը"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Ցուցադրել հավելվածների վահանակը"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Բացել կարգավորումները"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Բացել Օգնականը"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Կողպէկրան"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածն աջ կողմում"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածը ձախ կողմում"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Տրոհված էկրանից անցնել լիաէկրան ռեժիմ"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Անցեք աջ կողմի կամ ներքևի հավելվածին տրոհված էկրանի միջոցով"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Անցեք աջ կողմի կամ վերևի հավելվածին տրոհված էկրանի միջոցով"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Տրոհված էկրանի ռեժիմում մեկ հավելվածը փոխարինել մյուսով"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ներածում"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Անցնել հաջորդ լեզվին"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Տեսախցիկն արգելափակված է"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Տեսախցիկն ու խոսափողը արգելափակված են"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Խոսափողն արգելափակված է"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Չանհանգստացնել"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Հայտնաբերվել է օգտատեր"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Կարգավորեք նշումների կանխադրված հավելված Կարգավորումներում"</string>
     <string name="install_app" msgid="5066668100199613936">"Տեղադրել հավելվածը"</string>
diff --git a/packages/SystemUI/res/values-hy/tiles_states_strings.xml b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
index 89a94e8..118915d 100644
--- a/packages/SystemUI/res/values-hy/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Անջատված է"</item>
     <item msgid="5137565285664080143">"Միացված է"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 5c3eb53..0b07a32 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Mengambil screenshot diblokir oleh admin IT Anda"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Mengedit screenshot"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Bagikan"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Bagikan screenshot"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Ambil screenshot lagi"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Menutup screenshot"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Memindai wajah"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Kirim"</string>
     <string name="cancel" msgid="1089011503403416730">"Batal"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo aplikasi"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Konfirmasi"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Coba lagi"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Ketuk untuk membatalkan autentikasi"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Wajah dikenali. Tekan ikon buka kunci untuk melanjutkan."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Diautentikasi"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Batalkan Autentikasi"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Opsi Lainnya"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gunakan PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gunakan pola"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gunakan sandi"</string>
@@ -262,7 +265,7 @@
     <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Jangan Ganggu"</string>
     <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Perangkat yang disandingkan tak tersedia"</string>
-    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Ketuk untuk menghubungkan atau memutuskan koneksi perangkat"</string>
+    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Ketuk untuk memulai atau menghentikan koneksi perangkat"</string>
     <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Sambungkan perangkat baru"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Lihat semua"</string>
     <string name="turn_on_bluetooth" msgid="5681370462180289071">"Gunakan Bluetooth"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standar"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Sedang"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Tinggi"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Berhenti memblokir mikrofon perangkat?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Berhenti memblokir kamera perangkat?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Berhenti memblokir kamera dan mikrofon perangkat?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Hapus"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Tambahkan widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Selesai"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Tambahkan widget"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Dapatkan akses cepat ke widget aplikasi favorit Anda tanpa perlu membuka kunci tablet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Izinkan widget di layar kunci?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Buka setelan"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Batalkan jeda aplikasi kerja?"</string>
@@ -468,10 +481,10 @@
     <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Jika Anda membagikan, merekam, atau mentransmisikan suatu aplikasi, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan memiliki akses ke semua hal yang ditampilkan atau yang diputar di aplikasi tersebut. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio dan video."</string>
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Mulai"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> telah menonaktifkan opsi ini"</string>
-    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Mulai mentransmisikan?"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Jika mentransmisikan, Android akan memiliki akses ke semua hal yang ditampilkan di layar atau yang diputar di perangkat Anda. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
+    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Mulai transmisi?"</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Jika Anda melakukan transmisi, Android akan memiliki akses ke semua hal yang ditampilkan di layar atau yang diputar di perangkat Anda. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Jika Anda mentransmisikan aplikasi, Android akan memiliki akses ke semua hal yang ditampilkan atau yang diputar di aplikasi tersebut. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
-    <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Mulai mentransmisikan"</string>
+    <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Mulai transmisi"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Mulai berbagi?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Jika Anda membagikan, merekam, atau mentransmisikan, Android akan memiliki akses ke semua hal yang ditampilkan di layar atau yang diputar di perangkat Anda. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Jika Anda membagikan, merekam, atau mentransmisikan suatu aplikasi, Android akan memiliki akses ke semua hal yang ditampilkan atau yang diputar di aplikasi tersebut. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Perangkat ini dikelola oleh orang tuamu. Orang tuamu bisa melihat dan mengelola berbagai informasi, seperti aplikasi yang kamu gunakan, lokasimu, dan lama pemakaian perangkat."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Tetap terbuka kuncinya oleh TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Perlindungan pencurian\nPerangkat dikunci, terlalu banyak upaya pembukaan kunci"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Perangkat dikunci, terlalu banyak upaya autentikasi"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Perangkat dikunci\nAutentikasi gagal"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Setelan suara"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Otomatis beri teks di media"</string>
@@ -582,11 +596,9 @@
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Getar"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Nonaktifkan"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Transmisi"</string>
-    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Tidak tersedia karena volume dering dibisukan"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Tidak tersedia - Volume dering dibisukan"</string>
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Tidak tersedia - Fitur Jangan Ganggu aktif"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Tidak tersedia - Fitur Jangan Ganggu aktif"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Ketuk untuk menyuarakan."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Ketuk untuk menyetel agar bergetar. Layanan aksesibilitas mungkin dibisukan."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Ketuk untuk membisukan. Layanan aksesibilitas mungkin dibisukan."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"getar"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s kontrol volume"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Panggilan telepon dan notifikasi akan berdering (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Masukkan setelan perangkat output"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Penggeser volume diluaskan"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Penggeser volume diciutkan"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"membisukan %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"membunyikan %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Memutar <xliff:g id="LABEL">%s</xliff:g> di"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio akan diputar di"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Penyetel Antarmuka Pengguna Sistem"</string>
@@ -669,10 +676,10 @@
     <string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"&lt;b&gt;Status:&lt;/b&gt; Didemosikan menjadi Senyap"</string>
     <string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"&lt;b&gt;Status:&lt;/b&gt; Diberi Peringkat Lebih Tinggi"</string>
     <string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Status:&lt;/b&gt; Diberi Peringkat Lebih Rendah"</string>
-    <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Muncul di atas notifikasi percakapan dan sebagai foto profil di layar kunci"</string>
-    <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Muncul di atas notifikasi percakapan dan sebagai foto profil di layar kunci, ditampilkan sebagai balon"</string>
-    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Muncul di atas notifikasi percakapan dan sebagai foto profil di layar kunci, mengganggu mode Jangan Ganggu"</string>
-    <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Muncul di atas notifikasi percakapan dan sebagai foto profil di layar kunci, ditampilkan sebagai balon, mengganggu mode Jangan Ganggu"</string>
+    <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Muncul teratas di notifikasi percakapan dan sebagai foto profil di layar kunci"</string>
+    <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Muncul teratas di notifikasi percakapan dan sebagai foto profil di layar kunci, ditampilkan sebagai balon"</string>
+    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Muncul teratas di notifikasi percakapan dan sebagai foto profil di layar kunci, menimpa mode Jangan Ganggu"</string>
+    <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Muncul teratas di notifikasi percakapan dan sebagai foto profil di layar kunci, ditampilkan sebagai balon, menimpa mode Jangan Ganggu"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Prioritas"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak mendukung fitur percakapan"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Notifikasi ini tidak dapat diubah."</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Menavigasi maju pada aplikasi terbaru"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Menavigasi mundur pada aplikasi terbaru"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Buka daftar aplikasi"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Tampilkan taskbar"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Buka setelan"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Buka Asisten"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Kunci layar"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Masuk ke layar terpisah dengan aplikasi saat ini ke RHS"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Masuk ke layar terpisah dengan aplikasi saat ini ke LHS"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Beralih dari layar terpisah ke layar penuh"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Beralih ke aplikasi di bagian kanan atau bawah saat menggunakan layar terpisah"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Beralih ke aplikasi di bagian kiri atau atas saat menggunakan layar terpisah"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Dalam layar terpisah: ganti salah satu aplikasi dengan yang lain"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Beralih ke bahasa berikutnya"</string>
@@ -1117,7 +1125,7 @@
     <string name="basic_status" msgid="2315371112182658176">"Membuka percakapan"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"Widget Percakapan"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"Ketuk percakapan untuk menambahkannya ke Layar utama"</string>
-    <string name="no_conversations_text" msgid="5354115541282395015">"Percakapan terbaru Anda akan ditampilkan di sini"</string>
+    <string name="no_conversations_text" msgid="5354115541282395015">"Percakapan terbaru akan muncul di sini"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"Percakapan prioritas"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"Percakapan terbaru"</string>
     <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> hari lalu"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera diblokir"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dan mikrofon diblokir"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon diblokir"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Jangan ganggu"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Kehadiran pengguna terdeteksi"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setel aplikasi catatan default di Setelan"</string>
     <string name="install_app" msgid="5066668100199613936">"Instal aplikasi"</string>
diff --git a/packages/SystemUI/res/values-in/tiles_states_strings.xml b/packages/SystemUI/res/values-in/tiles_states_strings.xml
index e1d5338..bd429c1 100644
--- a/packages/SystemUI/res/values-in/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-in/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Nonaktif"</item>
     <item msgid="5137565285664080143">"Aktif"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index ea0726b..56ea0d5 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Kerfisstjórinn lokaði á skjámyndatöku"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Breyta"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Breyta skjámynd"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Deila"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Deila skjámynd"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Mynda meira"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Loka skjámynd"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Andlit skannað"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Senda"</string>
     <string name="cancel" msgid="1089011503403416730">"Hætta við"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Lógó forrits"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Staðfesta"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Reyna aftur"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Ýttu til að hætta við auðkenningu"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Andlitið var greint. Ýttu á opnunartáknið til að halda áfr."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Auðkennt"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Hætta við auðkenningu"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Fleiri valkostir"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Nota PIN-númer"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Nota mynstur"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Nota aðgangsorð"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Staðlað"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Miðlungs"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Mikið"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Opna fyrir hljóðnema tækisins?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Opna fyrir myndavél tækisins?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Opna fyrir myndavél og hljóðnema tækisins?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Fjarlægja"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Bæta græju við"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Lokið"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Bæta við græjum"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Fáðu skjótan aðgang að eftirlætis forritagræjunum án þess að taka spjaldtölvuna úr lás."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Leyfa allar græjur á lásskjá?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Opna stillingar"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Ljúka hléi vinnuforrita?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Foreldri þitt stjórnar þessu tæki. Foreldri þitt getur séð og stjórnað upplýsingum eins og forritunum sem þú notar, staðsetningu þinni og skjátímanum."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Haldið opnu af TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Þjófavörn\nTækinu var læst vegna of margra tilrauna til að taka það úr lás"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Tæki var læst, of margar auðkenningartilraunir"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Tæki læst\nAuðkenning mistókst"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Hljóðstillingar"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Sjálfvirkir skjátextar"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Hljóð af"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Senda út"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ekki í boði þar sem hringing er þögguð"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Ekki í boði því að kveikt er á „Ónáðið ekki“"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Ekki í boði því að kveikt er á „Ónáðið ekki“"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Ýttu til að hætta að þagga."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Ýttu til að stilla á titring. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Ýttu til að þagga. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"titringur"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s stýringar á hljóstyrk"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Símhringingar og tilkynningar heyrast (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Færa inn stillingar úttaks"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Stækkaðir hljóðstyrkssleðar"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Minnkaðir hljóðstyrkssleðar"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"þagga %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"kveikja á hljóði %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Í spilun í <xliff:g id="LABEL">%s</xliff:g>"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Hljóð heldur áfram að spilast"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Fínstillingar kerfisviðmóts"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Fletta áfram í gegnum nýleg forrit"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Fletta aftur á bak í gegnum nýleg forrit"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Opna forritalista"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Sýna forritastiku"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Opna stillingar"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Opna Hjálpara"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Lásskjár"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Opna skjáskiptingu hægra megin með núverandi forriti"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Opna skjáskiptingu vinstra megin með núverandi forriti"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skipta úr skjáskiptingu yfir á allan skjáinn"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Skiptu í forrit til hægri eða fyrir neðan þegar skjáskipting er notuð"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Skiptu í forrit til vinstri eða fyrir ofan þegar skjáskipting er notuð"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Í skjáskiptingu: Skipta forriti út fyrir annað forrit"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Innsláttur"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Skipta yfir í næsta tungumál"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Lokað fyrir myndavél"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Lokað fyrir myndavél og hljóðnema"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Lokað fyrir hljóðnema"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Ónáðið ekki"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Viðvera notanda greindist"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Stilltu sjálfgefið glósuforrit í stillingunum"</string>
     <string name="install_app" msgid="5066668100199613936">"Setja upp forrit"</string>
diff --git a/packages/SystemUI/res/values-is/tiles_states_strings.xml b/packages/SystemUI/res/values-is/tiles_states_strings.xml
index 1bd38ba..abdc3e7 100644
--- a/packages/SystemUI/res/values-is/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-is/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Slökkt"</item>
     <item msgid="5137565285664080143">"Kveikt"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index b2eb5f9..08f07ef 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"L\'acquisizione di screenshot è stata bloccata dall\'amministratore IT"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Modifica"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Modifica screenshot"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Condividi"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Condividi screenshot"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Acquisisci di più"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignora screenshot"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Scansione del viso"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Invia"</string>
     <string name="cancel" msgid="1089011503403416730">"Annulla"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo dell\'app"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Conferma"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Riprova"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tocca per annullare l\'autenticazione"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Volto riconosciuto. Premi l\'icona Sblocca e continua."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticazione eseguita"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Annulla autenticazione"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Altre opzioni"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utilizza PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usa sequenza"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utilizza password"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medio"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Apparecchi acustici"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vuoi sbloccare il microfono del dispositivo?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vuoi sbloccare la fotocamera del dispositivo?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vuoi sbloccare la fotocamera e il microfono del dispositivo?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Rimuovi"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Aggiungi widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Fine"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Aggiungi widget"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Accedi rapidamente ai widget delle tue app preferite senza sbloccare il tablet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Consentire tutti i widget nella schermata di blocco?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Apri impostazioni"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Riattivare le app di lavoro?"</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Questo dispositivo è gestito da uno dei tuoi genitori, il quale può visualizzare e gestire informazioni come le app che usi, la tua posizione e il tuo tempo di utilizzo."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Sbloccato da TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Protezione da furti\nDisp. bloccato, troppi tentat. di sblocco"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Dispositivo bloccato, troppi tentativi di autenticazione"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispositivo bloccato\nAutenticazione non riuscita"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Impostazioni audio"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Sottotitoli automatici"</string>
@@ -572,7 +585,7 @@
     <string name="stream_voice_call" msgid="7468348170702375660">"Chiamata"</string>
     <string name="stream_system" msgid="7663148785370565134">"Sistema"</string>
     <string name="stream_ring" msgid="7550670036738697526">"Suoneria"</string>
-    <string name="stream_music" msgid="2188224742361847580">"Supporti multimediali"</string>
+    <string name="stream_music" msgid="2188224742361847580">"Contenuti multimediali"</string>
     <string name="stream_alarm" msgid="16058075093011694">"Sveglia"</string>
     <string name="stream_notification" msgid="7930294049046243939">"Notifica"</string>
     <string name="stream_bluetooth_sco" msgid="6234562365528664331">"Bluetooth"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Silenzia"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Trasmissione"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Non disponibile con l\'audio disattivato"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Non disponibile: modalità Non disturbare attiva"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Non disponibili con \"Non disturbare\" attiva"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tocca per riattivare l\'audio."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tocca per attivare la vibrazione. L\'audio dei servizi di accessibilità può essere disattivato."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tocca per disattivare l\'audio. L\'audio dei servizi di accessibilità può essere disattivato."</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrazione"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Controlli del volume %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"La suoneria sarà attiva per chiamate e notifiche (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Inserisci impostazioni di uscita"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Cursori volume espansi"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Cursori volume compressi"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"disattivare audio di %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"riattivare audio di %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> in riproduzione su"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio riprodotto su:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Ottimizzatore UI di sistema"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Spostati avanti tra le app recenti"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Spostati indietro tra le app recenti"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Apri elenco di app"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostra barra delle app"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Apri impostazioni"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Apri l\'assistente"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Blocca lo schermo"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Attiva lo schermo diviso con l\'app corrente a destra"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Attiva lo schermo diviso con l\'app corrente a sinistra"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passa da schermo diviso a schermo intero"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Passa all\'app a destra o sotto mentre usi lo schermo diviso"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Passa all\'app a sinistra o sopra mentre usi lo schermo diviso"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Con lo schermo diviso: sostituisci un\'app con un\'altra"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Inserimento"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passa alla lingua successiva"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Videocamera bloccata"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Videocamera e microfono bloccati"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfono bloccato"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Non disturbare"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Viene rilevata la presenza dell\'utente"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Imposta l\'app per le note predefinita nelle Impostazioni"</string>
     <string name="install_app" msgid="5066668100199613936">"Installa app"</string>
diff --git a/packages/SystemUI/res/values-it/tiles_states_strings.xml b/packages/SystemUI/res/values-it/tiles_states_strings.xml
index f7abea5..aa76983 100644
--- a/packages/SystemUI/res/values-it/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-it/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Off"</item>
     <item msgid="5137565285664080143">"On"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Non disponibile"</item>
+    <item msgid="3079622119444911877">"Off"</item>
+    <item msgid="3028994095749238254">"On"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 2881bad..24ec785 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"שיתוף"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"שיתוף של צילום מסך"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"צילום תוכן נוסף"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"סגירת צילום מסך"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"סורק פנים"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"שליחה"</string>
     <string name="cancel" msgid="1089011503403416730">"ביטול"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"לוגו של האפליקציה"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"אישור"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ניסיון נוסף"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"יש להקיש כדי לבטל את האימות"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"הפנים זוהו. להמשך יש ללחוץ על סמל ביטול הנעילה."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"מאומת"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ביטול האימות"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"אפשרויות נוספות"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"שימוש בקוד אימות"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"שימוש בקו ביטול נעילה"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"שימוש בסיסמה"</string>
@@ -326,7 +329,7 @@
     <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"אפליקציות לעבודה"</string>
     <string name="quick_settings_work_mode_paused_state" msgid="6681788236383735976">"בהשהיה"</string>
     <string name="quick_settings_night_display_label" msgid="8180030659141778180">"תאורת לילה"</string>
-    <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"התכונה מופעלת בשקיעה"</string>
+    <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"מופעלת בשקיעה"</string>
     <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>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"רגילה"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"בינונית"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"גבוהה"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"לבטל את חסימת המיקרופון של המכשיר?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"לבטל את חסימת המצלמה של המכשיר?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"לבטל את חסימת המצלמה והמיקרופון של המכשיר?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"הסרה"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"הוספת ווידג\'ט"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"סיום"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"הוספת ווידג\'טים"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"קבלת גישה מהירה לווידג\'טים של האפליקציות המועדפות עליך בלי לבטל את נעילת הטאבלט."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"לאפשר להציג כל ווידג\'ט במסך הנעילה?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"לפתיחת ההגדרות"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"להפעיל את האפליקציות לעבודה?"</string>
@@ -538,7 +551,8 @@
     <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">"הנעילה נמנעת על ידי סביבה מהימנה"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"הגנה מפני גניבה\nהמכשיר ננעל, יותר מדי ניסיונות לביטול הנעילה"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"המכשיר ננעל, יותר מדי ניסיונות אימות"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"המכשיר ננעל\nהאימות נכשל"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>‏. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"הגדרות צליל"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"הוספת כתוביות באופן אוטומטי למדיה"</string>
@@ -583,16 +597,14 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"השתקה"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"‏הפעלת Cast"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"לא זמין כי הצלצול מושתק"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"לא זמין כי התכונה \'נא לא להפריע\' מופעלת"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"לא זמין כי התכונה \'נא לא להפריע\' מופעלת"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"‏%1$s. יש להקיש כדי לבטל את ההשתקה."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"‏%1$s. צריך להקיש כדי להגדיר רטט. ייתכן ששירותי הנגישות מושתקים."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"‏%1$s. יש להקיש כדי להשתיק. ייתכן ששירותי הנגישות יושתקו."</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"‏%1$s. יש להקיש כדי להעביר למצב רטט."</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"‏%1$s. יש להקיש כדי להשתיק."</string>
-    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"בקרת הרעש"</string>
+    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"בקרת רעש"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"אודיו מרחבי"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"השבתה"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"מצב קבוע"</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"רטט"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"‏בקרי עוצמת קול של %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"הטלפון יצלצל כשמתקבלות שיחות והתראות (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"הזנה של הגדרות הפלט"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"פסי ההזזה של עוצמת הקול במצב מורחב"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"פסי ההזזה של עוצמת הקול במצב מכווץ"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"‏השתקה של %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"‏ביטול ההשתקה של %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"הפעלה של <xliff:g id="LABEL">%s</xliff:g> במכשיר"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"האודיו יופעל במכשיר"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"דפדוף קדימה באפליקציות האחרונות"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"דפדוף אחורה באפליקציות האחרונות"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"פתיחה של רשימת האפליקציות"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"הצגת סרגל האפליקציות"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"פתיחת ההגדרות"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"‏לפתיחת Google Assistant"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"מסך הנעילה"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"‏כניסה למסך מפוצל עם האפליקציה הנוכחית ל-RHS"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"‏כניסה למסך מפוצל עם האפליקציה הנוכחית ל-LHS"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"החלפה ממסך מפוצל למסך מלא"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"מעבר לאפליקציה משמאל או למטה בזמן שימוש במסך מפוצל"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"מעבר לאפליקציה מימין או למעלה בזמן שימוש במסך מפוצל"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"כשהמסך מפוצל: החלפה בין אפליקציה אחת לאחרת"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"קלט"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"מעבר לשפה הבאה"</string>
@@ -839,15 +847,15 @@
   </string-array>
     <string name="tuner_low_priority" msgid="8412666814123009820">"הצגת סמלי התראות בעדיפות נמוכה"</string>
     <string name="other" msgid="429768510980739978">"אחר"</string>
-    <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"הסרת האריח"</string>
-    <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"הוספת האריח בסוף הרשימה"</string>
-    <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"העברת האריח"</string>
-    <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"הוספת אריח"</string>
+    <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"הסרת הלחצן"</string>
+    <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"הוספת הלחצן בסוף הרשימה"</string>
+    <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"העברת הלחצן"</string>
+    <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"הוספת לחצן"</string>
     <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"העברה למיקום <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"הוספה למיקום <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="accessibility_qs_edit_position" msgid="4509277359815711830">"מיקום <xliff:g id="POSITION">%1$d</xliff:g>"</string>
-    <string name="accessibility_qs_edit_tile_added" msgid="9067146040380836334">"האריח נוסף"</string>
-    <string name="accessibility_qs_edit_tile_removed" msgid="1175925632436612036">"האריח הוסר"</string>
+    <string name="accessibility_qs_edit_tile_added" msgid="9067146040380836334">"הלחצן נוסף"</string>
+    <string name="accessibility_qs_edit_tile_removed" msgid="1175925632436612036">"הלחצן הוסר"</string>
     <string name="accessibility_desc_quick_settings_edit" msgid="741658939453595297">"עורך הגדרות מהירות."</string>
     <string name="accessibility_desc_notification_icon" msgid="7331265967584178674">"התראות <xliff:g id="ID_1">%1$s</xliff:g>: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
     <string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"פתיחת הגדרות."</string>
@@ -1179,9 +1187,9 @@
     <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"כדי לעבור בין רשתות, צריך לנתק את האתרנט"</string>
     <string name="wifi_scan_notify_message" msgid="3753839537448621794">"‏כדי לשפר את חוויית השימוש במכשיר, אפליקציות ושירותים יוכלו לחפש רשתות Wi-Fi בכל שלב, גם כאשר ה-Wi-Fi כבוי. אפשר לשנות זאת בהגדרות של חיפוש נקודות Wi-Fi. "<annotation id="link">"שינוי"</annotation></string>
     <string name="turn_off_airplane_mode" msgid="8425587763226548579">"השבתה של מצב טיסה"</string>
-    <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"האפליקציה <xliff:g id="APPNAME">%1$s</xliff:g> מבקשת להוסיף להגדרות המהירות את האריח הבא"</string>
-    <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"הוספת אריח"</string>
-    <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"לא להוסיף אריח"</string>
+    <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"אפליקציית <xliff:g id="APPNAME">%1$s</xliff:g> מבקשת להוסיף להגדרות המהירות את הלחצן הבא"</string>
+    <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"להוסיף לחצן"</string>
+    <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"לא להוסיף לחצן"</string>
     <string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"בחירת משתמש"</string>
     <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{אפליקציה אחת (#) פעילה}one{# אפליקציות פעילות}two{# אפליקציות פעילות}other{# אפליקציות פעילות}}"</string>
     <string name="fgs_dot_content_description" msgid="2865071539464777240">"מידע חדש"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"המצלמה חסומה"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"המצלמה והמיקרופון חסומים"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"המיקרופון חסום"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"נא לא להפריע"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"נוכחות המשתמש זוהתה"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"צריך להגדיר את אפליקציית ברירת המחדל לפתקים ב\'הגדרות\'"</string>
     <string name="install_app" msgid="5066668100199613936">"התקנת האפליקציה"</string>
diff --git a/packages/SystemUI/res/values-iw/tiles_states_strings.xml b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
index 1948685..196a6c2 100644
--- a/packages/SystemUI/res/values-iw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"מושבת"</item>
     <item msgid="5137565285664080143">"מופעל"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 070713a..6e2ca40 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"共有"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"スクリーンショットを共有"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"キャプチャ範囲を拡大"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"スクリーンショットを閉じます"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"顔のスキャン"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"送信"</string>
     <string name="cancel" msgid="1089011503403416730">"キャンセル"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"アプリのロゴ"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"確認"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"再試行"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"タップすると認証をキャンセルします"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"顔を認識しました。ロック解除アイコンを押して続行します。"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"認証済み"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"認証をキャンセルします"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"その他のオプション"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN を使用"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"パターンを使用"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"パスワードを使用"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"標準"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"中"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"高"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"補聴器"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"デバイスのマイクのブロックを解除しますか?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"デバイスのカメラのブロックを解除しますか?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"デバイスのカメラとマイクのブロックを解除しますか?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"削除"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ウィジェットを追加"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完了"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"ウィジェットを追加"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"タブレットのロックを解除せずにお気に入りのアプリ ウィジェットにすばやくアクセスできます。"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ロック画面でのウィジェットを許可しますか?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"設定を開く"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"仕事用アプリの停止解除"</string>
@@ -468,7 +480,7 @@
     <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"アプリの共有、録画、キャスト中は、そのアプリで表示または再生される内容に <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> がアクセスできるため、パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"開始"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> がこのオプションを無効にしています"</string>
-    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"キャスト開始しますか?"</string>
+    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"キャストを開始しますか?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"キャスト中は、画面に表示される内容やデバイスで再生される内容に Android がアクセスできるため、パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"アプリのキャスト中は、そのアプリで表示または再生される内容に Android がアクセスできるため、パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"キャストを開始"</string>
@@ -538,7 +550,8 @@
     <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">"信頼エージェントがロック解除を管理"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"盗難防止\nデバイスをロック - ロック解除に繰り返し失敗"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"認証の試行回数が上限を超えたため、デバイスがロックされました"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"デバイスがロックされました\n認証に失敗しました"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"音声の設定"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"メディアの自動字幕起こし"</string>
@@ -606,8 +619,8 @@
     <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"音量スライダーを閉じました"</string>
     <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s をミュート"</string>
     <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s のミュートを解除"</string>
-    <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> を再生:"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"音声の再生形式:"</string>
+    <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> の再生先:"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"音声の再生先"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"システムUI調整ツール"</string>
     <string name="status_bar" msgid="4357390266055077437">"ステータスバー"</string>
     <string name="demo_mode" msgid="263484519766901593">"システム UI デモモード"</string>
@@ -653,7 +666,7 @@
     <string name="notification_silence_title" msgid="8608090968400832335">"サイレント"</string>
     <string name="notification_alert_title" msgid="3656229781017543655">"デフォルト"</string>
     <string name="notification_automatic_title" msgid="3745465364578762652">"自動"</string>
-    <string name="notification_channel_summary_low" msgid="4860617986908931158">"着信音もバイブレーションも無効になります"</string>
+    <string name="notification_channel_summary_low" msgid="4860617986908931158">"着信音もバイブレーションも OFF になります"</string>
     <string name="notification_conversation_summary_low" msgid="1734433426085468009">"着信音もバイブレーションも無効になり会話セクションの下に表示されます"</string>
     <string name="notification_channel_summary_default" msgid="777294388712200605">"デバイスの設定を基に着信音またはバイブレーションが有効になります"</string>
     <string name="notification_channel_summary_default_with_bubbles" msgid="3482483084451555344">"デバイスの設定を基に着信音またはバイブレーションが有効になります。デフォルトでは <xliff:g id="APP_NAME">%1$s</xliff:g> からの会話がふきだしで表示されます。"</string>
@@ -752,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"最近使ったアプリを確認する"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"最近使ったアプリを確認する(逆方向)"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"アプリの一覧を開く"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"タスクバーを表示する"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"設定を開く"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"アシスタントを開く"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"画面をロック"</string>
@@ -761,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"分割画面にして現在のアプリを右側に設定する"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"分割画面にして現在のアプリを左側に設定する"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"分割画面から全画面に切り替える"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"分割画面の使用時に右側または下部のアプリに切り替える"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"分割画面の使用時に左側または上部のアプリに切り替える"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"分割画面中: アプリを順に置換する"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"入力"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"次の言語に切り替える"</string>
@@ -1259,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"カメラはブロックされています"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"カメラとマイクはブロックされています"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"マイクはブロックされています"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"サイレント モード"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"会話を始められます"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"[設定] でデフォルトのメモアプリを設定してください"</string>
     <string name="install_app" msgid="5066668100199613936">"アプリをインストール"</string>
diff --git a/packages/SystemUI/res/values-ja/tiles_states_strings.xml b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
index dd78c5e..790445c 100644
--- a/packages/SystemUI/res/values-ja/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"OFF"</item>
     <item msgid="5137565285664080143">"ON"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"使用不可"</item>
+    <item msgid="3079622119444911877">"OFF"</item>
+    <item msgid="3028994095749238254">"ON"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 5a11a75..b2295f3 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"გაზიარება"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"ეკრანის ანაბეჭდის გაზიარება"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"მეტის აღბეჭდვა"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ეკრანის ანაბეჭდის დახურვა"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"მიმდინარეობს სახის სკანირება"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"გაგზავნა"</string>
     <string name="cancel" msgid="1089011503403416730">"გაუქმება"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"აპის ლოგო"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"დადასტურება"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ხელახლა ცდა"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"შეეხეთ ავტორიზაციის გასაუქმებლად"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ამოცნობილია სახით. გასაგრძელებლად დააჭირეთ განბლოკვის ხატულას."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ავტორიზებულია"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ავტორიზაციის გაუქმება"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"სხვა ვარიანტები"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-კოდის გამოყენება"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ნიმუშის გამოყენება"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"პაროლის გამოყენება"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"სტანდარტული"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"საშუალო"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"მაღალი"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"სმენის აპარატები"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"გსურთ მოწყობილობის მიკროფონის განბლოკვა?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"გსურთ მოწყობილობის კამერის განბლოკვა?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"გსურთ მოწყობილობის კამერის და მიკროფონის განბლოკვა?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"ამოშლა"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ვიჯეტის დამატება"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"მზადაა"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"ვიჯეტების დამატება"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"მიიღეთ წვდომა თქვენი რჩეული აპების ვიჯეტებზე ტაბლეტის განბლოკვის გარეშე."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ნებისმიერი ვიჯეტის დაშვება ჩაკეტილ ეკრანზე"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"პარამეტრების გახსნა"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"კვლავ გააქტიურდეს სამსახურის აპები?"</string>
@@ -538,7 +550,8 @@
     <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="1265107698772588299">"მოპარვისაგან დაცვა\nდაიბლოკა განბლოკვის ბევრი მცდელობის გამო."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"მოწყობილობა ჩაიკეტა, დაფიქსირდა ავტორიზაციის მეტისმეტად ბევრი მცდელობა"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"მოწყობილობა ჩაკეტილია\nავტორიზაცია ვერ შესრულდა"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ხმის პარამეტრები"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"მედიის ავტომ. სუბტიტრირება"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"დადუმება"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"ტრანსლირება"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"ზარის დადუმების გამო ხელმისაწვდომი არაა"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"მიუწვდომელია, ჩართულია „არ შემაწუხოთ“ რეჟიმი"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"მიუწვდომელია, ჩართულია „არ შემაწუხოთ“ რეჟიმი"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. შეეხეთ დადუმების გასაუქმებლად."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. შეეხეთ ვიბრაციაზე დასაყენებლად. შეიძლება დადუმდეს მარტივი წვდომის სერვისებიც."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. შეეხეთ დასადუმებლად. შეიძლება დადუმდეს მარტივი წვდომის სერვისებიც."</string>
@@ -596,23 +607,18 @@
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"სივრცითი აუდიო"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"გამორთული"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ფიქსირებული"</string>
-    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"თავის მოძრ. თვალყურის დევნა"</string>
+    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ხმის მიდევნებით"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"შეეხეთ მრეკავის რეჟიმის შესაცვლელად"</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"დადუმება"</string>
     <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"დადუმების მოხსნა"</string>
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ვიბრაცია"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s-ის ხმის მართვის საშუალებები"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ზარებისა და შეტყობინებების მიღებისას დაირეკება (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"აუდიოს გამოსვლის პარამეტრების გახსნა"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"ხმის სლაიდერების გაფართოება"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"ხმის სლაიდერების ჩაკეცვა"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s-ის დადუმება"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s-ის დადუმების მოხსნა"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"უკრავს <xliff:g id="LABEL">%s</xliff:g>:"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"აუდიო დაიკვრება"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"სისტემის UI ტუნერი"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"წინ გადასვლა ბოლოდროინდელი აპების მეშვეობით"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"უკან გადასვლა ბოლოდროინდელი აპების მეშვეობით"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"აპების სიის გახსნა"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ამოცანათა ზოლის ჩვენება"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"პარამეტრების გახსნა"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"ასისტენტის გახსნა"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"ჩაკეტილი ეკრანი"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით RHS-ში"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით LHS-ში"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"გადართვა ეკრანის გაყოფიდან სრულ ეკრანზე"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ეკრანის გაყოფის გამოყენებისას აპზე მარჯვნივ ან ქვემოთ გადართვა"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ეკრანის გაყოფის გამოყენებისას აპზე მარცხნივ ან ზემოთ გადართვა"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"ეკრანის გაყოფის დროს: ერთი აპის მეორით ჩანაცვლება"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"შეყვანა"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"შემდეგ ენაზე გადართვა"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"კამერა დაბლოკილია"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"კამერა და მიკროფონი დაბლოკილია"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"მიკროფონი დაბლოკილია"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"არ შემაწუხოთ"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"აღმოჩენილია მომხმარებლის ყოფნა"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"დააყენეთ ნაგულისხმევი შენიშვნების აპი პარამეტრებში"</string>
     <string name="install_app" msgid="5066668100199613936">"აპის ინსტალაცია"</string>
diff --git a/packages/SystemUI/res/values-ka/tiles_states_strings.xml b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
index 2691b69..21f8102 100644
--- a/packages/SystemUI/res/values-ka/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"გამორთული"</item>
     <item msgid="5137565285664080143">"ჩართული"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"მიუწვდომელია"</item>
+    <item msgid="3079622119444911877">"გამორთულია"</item>
+    <item msgid="3028994095749238254">"ჩართულია"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 781dbbf..127e81e 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Әкімшіңіз скриншот жасауға тыйым салды."</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Өзгерту"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Скриншотты өзгерту"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Бөлісу"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Скриншотты бөлісу"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Тағы суретке түсіру"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Скриншотты жабу"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Бетті сканерлеу"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Жіберу"</string>
     <string name="cancel" msgid="1089011503403416730">"Бас тарту"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Қолданба логотипі"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Растау"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Қайта көру"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Аутентификациядан бас тарту үшін түртіңіз."</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Бет танылды. Жалғастыру үшін құлыпты ашу белгішесін басыңыз."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аутентификацияланған"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Аутентификациядан бас тарту"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Қосымша опциялар"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN кодын пайдалану"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Өрнекті пайдалану"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Құпия сөзді пайдалану"</string>
@@ -360,11 +363,18 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандартты режим"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Орташа"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Жоғары"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Есту құрылғылары"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Құрылғы микрофонын блоктан шығару керек пе?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Құрылғы камерасын блоктан шығару керек пе?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Құрылғы камерасы мен микрофонын блоктан шығару керек пе?"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Микрофоныңызды пайдалануға рұқсат берілген барлық қолданба мен қызметтің бөгеуі алынады."</string>
-    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Камераңызды пайдалануға рұқсат берілген барлық қолданба мен қызметтің бөгеуі алынады."</string>
+    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Микрофоныңызды пайдалануға рұқсат берілген барлық қолданба мен қызмет блоктан шығарылады."</string>
+    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Камераңызды пайдалануға рұқсат берілген барлық қолданба мен қызмет блоктан шығарылады."</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Камераңызды немесе микрофоныңызды пайдалануға рұқсат берілген барлық қолданба мен қызметтің бөгеуі алынады."</string>
     <string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Микрофон блокталған"</string>
     <string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Камера блокталған"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Өшіру"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Виджет қосу"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Дайын"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Виджеттер қосу"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Таңдаулы қолданба виджеттерін планшет құлпын ашпай-ақ жылдам пайдаланыңыз."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Құлыптаулы экранда кез келген виджетке рұқсат беру керек пе?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Параметрлерді ашу"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Жұмыс қолданбаларын қайта қосасыз ба?"</string>
@@ -470,7 +482,7 @@
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы осы опцияны өшірді."</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Трансляциялау басталсын ба?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Трансляциялау кезінде Android жүйесі экраныңызда көрінетін не құрылғыңызда ойнатылатын барлық нәрсені пайдалана алады. Сондықтан құпия сөздерді, төлем туралы мәліметті, хабарларды немесе басқа құпия ақпаратты енгізген кезде сақ болыңыз."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Қолданба экранын трансляциялау кезінде Android жүйесі қолданбада көрінетін не ойнатылатын барлық нәрсені пайдалана алады. Сондықтан құпия сөздерді, төлем туралы мәліметті, хабарларды немесе басқа құпия ақпаратты енгізген кезде сақ болыңыз."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Қолданба экранын трансляциялау кезінде Android қолданбада көрінетін не ойнатылатын барлық контентті пайдалана алады. Сондықтан құпия сөздер, төлем туралы мәлімет, хабарлар, фотосуреттер, дыбыстар мен бейнелер сияқты ақпаратқа сақ болыңыз."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Трансляциялауды бастау"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Бөлісу басталсын ба?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Бөлісу, жазу не трансляциялау кезінде Android жүйесі экраныңызда көрінетін не құрылғыңызда ойнатылатын барлық нәрсені пайдалана алады. Сондықтан құпия сөздерді, төлем туралы мәліметті, хабарларды немесе басқа құпия ақпаратты енгізген кезде сақ болыңыз."</string>
@@ -538,7 +550,8 @@
     <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="1265107698772588299">"Ұрлықтан қорғау\nҚұрылғы құлыпталған, құлыпты ашуға тым көп әрекет жасалды."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Құрылғы құлыпталды, тым көп аутентификациялау талпынысы жасалды."</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Құрылғы құлыпталды\nАутентификация орындалмады"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Дыбыс параметрлері"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматты субтитр қосу"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Дыбысын өшіру"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Трансляциялау"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Қолжетімді емес, шылдырлату өшірулі."</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Мазаламау режимі қосылғандықтан өзгерту мүмкін емес."</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Мазаламау режимі қосылғандықтан өзгерту мүмкін емес."</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Дыбысын қосу үшін түртіңіз."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Діріл режимін орнату үшін түртіңіз. Арнайы мүмкіндік қызметтерінің дыбысы өшуі мүмкін."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Дыбысын өшіру үшін түртіңіз. Арнайы мүмкіндік қызметтерінің дыбысы өшуі мүмкін."</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"дірілдету"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Дыбысты басқару элементтері: %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Қоңыраулар мен хабарландырулар дыбысы қосулы (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Шығыс параметрлерін енгізу"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Дыбыс деңгейінің жүгірткі реттегіштері жайылды."</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Дыбыс деңгейінің жүгірткі реттегіштері жиылды."</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s дыбысын өшіру"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s дыбысын қосу"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> ойнатылатын құрылғы:"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудио ойнатылатын құрылғы:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Жүйелік пайдаланушылық интерфейс тюнері"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Соңғы қолданбаларға алға өту"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Соңғы қолданбаларға артқа өту"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Қолданбалар тізімін ашу"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Тапсырмалар жолағын көрсету"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Параметрлерді ашу"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant-ті ашу"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Экранды құлыптау"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Бөлінген экран режиміне кіру (ағымдағы қолданбаны оңға орналастыру)"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Бөлінген экран режиміне кіру (ағымдағы қолданбаны солға орналастыру)"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Бөлінген экран режимінен толық экран режиміне ауысу"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Экранды бөлуді қолданғанда, оң не жоғары жақтағы қолданбаға ауысыңыз"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Экранды бөлуді қолданғанда, сол не жоғары жақтағы қолданбаға ауысыңыз"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Экранды бөлу кезінде: бір қолданбаны басқасымен алмастыру"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Енгізу"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Келесі тілге ауысу"</string>
@@ -1056,7 +1063,7 @@
     <string name="controls_media_button_pause" msgid="8614887780950376258">"Кідірту"</string>
     <string name="controls_media_button_prev" msgid="8126822360056482970">"Алдыңғы трек"</string>
     <string name="controls_media_button_next" msgid="6662636627525947610">"Келесі трек"</string>
-    <string name="controls_media_button_connecting" msgid="3138354625847598095">"Жалғануда"</string>
+    <string name="controls_media_button_connecting" msgid="3138354625847598095">"Жалғанып жатыр"</string>
     <string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Ойнату"</string>
     <string name="controls_media_smartspace_rec_description" msgid="4136242327044070732">"<xliff:g id="APP_LABEL">%1$s</xliff:g> қолданбасын ашу"</string>
     <string name="controls_media_smartspace_rec_item_description" msgid="2189271793070870883">"<xliff:g id="APP_LABEL">%3$s</xliff:g> қолданбасында <xliff:g id="ARTIST_NAME">%2$s</xliff:g> орындайтын \"<xliff:g id="SONG_NAME">%1$s</xliff:g>\" әнін ойнату"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера блокталған."</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера мен микрофон блокталған."</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон блокталған."</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Мазаламау"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Пайдаланушы анықталды."</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Параметрлерден әдепкі жазба қолданбасын орнатыңыз."</string>
     <string name="install_app" msgid="5066668100199613936">"Қолданбаны орнату"</string>
diff --git a/packages/SystemUI/res/values-kk/tiles_states_strings.xml b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
index b37e982..cf3aa69 100644
--- a/packages/SystemUI/res/values-kk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Өшірулі"</item>
     <item msgid="5137565285664080143">"Қосулы"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Қолжетімді емес"</item>
+    <item msgid="3079622119444911877">"Өшірулі"</item>
+    <item msgid="3028994095749238254">"Қосулы"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 60a1970..f2596db 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ការថតអេក្រង់ត្រូវបានទប់ស្កាត់ដោយអ្នកគ្រប់គ្រង​ផ្នែកព័ត៌មានវិទ្យារបស់អ្នក"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"កែ"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"កែ​រូបថត​អេក្រង់"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"ចែករំលែក"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"ចែករំលែករូបថតអេក្រង់"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"ថត​ច្រើនទៀត"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ច្រានចោល​រូបថត​អេក្រង់"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"ការ​ស្កេន​មុខ"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ផ្ញើ"</string>
     <string name="cancel" msgid="1089011503403416730">"បោះបង់"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"និមិត្តសញ្ញាកម្មវិធី"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"បញ្ជាក់"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ព្យាយាម​ម្ដង​ទៀត"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ចុចដើម្បីបោះបង់​ការផ្ទៀងផ្ទាត់"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"បានស្គាល់មុខ។ សូមចុចរូបដោះសោ ដើម្បីបន្ត។"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"បាន​ផ្ទៀងផ្ទាត់"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"បោះបង់ការផ្ទៀងផ្ទាត់"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ជម្រើស​ច្រើន​ទៀត"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ប្រើកូដ PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ប្រើ​លំនាំ"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"ប្រើពាក្យសម្ងាត់"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ស្តង់ដារ"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"មធ្យម"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"ខ្ពស់"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"ឧបករណ៍ជំនួយការស្ដាប់"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ឈប់ទប់ស្កាត់​មីក្រូហ្វូន​របស់ឧបករណ៍ឬ?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ឈប់ទប់ស្កាត់​កាមេរ៉ា​របស់ឧបករណ៍ឬ?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ឈប់ទប់ស្កាត់​កាមេរ៉ា និងមីក្រូហ្វូន​របស់ឧបករណ៍ឬ?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"ដកចេញ"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"បញ្ចូលធាតុ​ក្រាហ្វិក"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"រួចរាល់"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"បញ្ចូលធាតុក្រាហ្វិក"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"ទទួលបានសិទ្ធិចូល​ប្រើប្រាស់​រហ័សទៅកាន់ធាតុក្រាហ្វិកកម្មវិធីដែលអ្នកចូលចិត្តដោយមិនចាំបាច់ដោះសោថេប្លេតរបស់អ្នក។"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"អនុញ្ញាត​ធាតុក្រាហ្វិក​នៅលើ​អេក្រង់ចាក់សោឬ?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"បើកការកំណត់"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"ឈប់ផ្អាកកម្មវិធីការងារឬ?"</string>
@@ -538,7 +550,8 @@
     <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">"បាន​ដោះសោ​ដោយភ្នាក់ងារ​​ទុកចិត្ត"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"ការការពារ​ចោរ​លួច\nបានចាក់សោឧបករណ៍ ការព្យាយាមដោះសោច្រើនដងពេក"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ឧបករណ៍ត្រូវបានចាក់សោ ដោយសារមានការព្យាយាមផ្ទៀងផ្ទាត់ច្រើនដងពេក"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"បានចាក់សោឧបករណ៍\nការផ្ទៀងផ្ទាត់មិនបានសម្រេច"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ការកំណត់សំឡេង"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"ដាក់អក្សររត់លើមេឌៀដោយស្វ័យប្រវត្តិ"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"បិទសំឡេង"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"បញ្ជូន"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"មិន​អាច​ប្រើ​បាន​ទេ​ ព្រោះ​សំឡេង​រោទ៍​ត្រូវ​បាន​បិទ"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"មិនអាចប្រើបានទេ ដោយសារមុខងារកុំ​រំខានត្រូវបានបើក"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"មិនអាចប្រើបានទេ ដោយសារមុខងារកុំ​រំខានត្រូវបានបើក"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s។ ប៉ះដើម្បីបើកសំឡេង។"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s។ ប៉ះដើម្បីកំណត់ឲ្យញ័រ។ សេវាកម្មលទ្ធភាពប្រើប្រាស់អាចនឹងត្រូវបានបិទសំឡេង។"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s។ ប៉ះដើម្បីបិទសំឡេង។ សេវាកម្មលទ្ធភាពប្រើប្រាស់អាចនឹងត្រូវបានបិទសំឡេង។"</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ញ័រ"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s របារ​បញ្ជា​កម្រិត​សំឡេង"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ការ​ហៅ​ទូរសព្ទ និង​ការជូន​ដំណឹង​នឹង​រោទ៍ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"ចូលការកំណត់ឧបករណ៍មេឌៀ"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"បានពង្រីកគ្រាប់រំកិលកម្រិតសំឡេង"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"បានបង្រួមគ្រាប់រំកិលកម្រិតសំឡេង"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"បិទសំឡេង %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"បើក​សំឡេង %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"កំពុងចាក់​​ <xliff:g id="LABEL">%s</xliff:g> នៅ​លើ"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"សំឡេងនឹងលេងនៅលើ"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"កម្មវិធីសម្រួល UI ប្រព័ន្ធ"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"រុករកទៅមុខ ដើម្បីមើលកម្មវិធីថ្មីៗ"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"រុករកថយក្រោយ ដើម្បីមើលកម្មវិធីថ្មីៗ"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"បើកបញ្ជីកម្មវិធី"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"បង្ហាញរបារកិច្ចការ"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"បើកការកំណត់"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"បើក​ជំនួយការ"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"ចាក់​សោ​អេក្រង់"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"ចូលក្នុងមុខងារបំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅខាងស្ដាំដៃ"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"ចូលក្នុងមុខងារ​បំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅខាងឆ្វេងដៃ"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"ប្ដូរពីមុខងារ​បំបែកអេក្រង់ទៅជាអេក្រង់ពេញ"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ប្ដូរទៅកម្មវិធីនៅខាងស្ដាំ ឬខាងក្រោម ពេលកំពុងប្រើមុខងារ​បំបែកអេក្រង់"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ប្ដូរទៅកម្មវិធីនៅខាងឆ្វេង ឬខាងលើ ពេលកំពុងប្រើមុខងារ​បំបែកអេក្រង់"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"ក្នុងអំឡុងពេលប្រើមុខងារបំបែកអេក្រង់៖ ជំនួសកម្មវិធីពីមួយទៅមួយទៀត"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"បញ្ចូល"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"ប្ដូរទៅភាសាបន្ទាប់"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"បាន​ទប់ស្កាត់​កាមេរ៉ា"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"បានទប់ស្កាត់​កាមេរ៉ា និង​មីក្រូហ្វូន"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"បាន​ទប់ស្កាត់​មីក្រូហ្វូន"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"កុំ​រំខាន"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"វត្តមានអ្នកប្រើប្រាស់ត្រូវបានចាប់ដឹង"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"កំណត់កម្មវិធីកំណត់ចំណាំលំនាំដើមនៅក្នុងការកំណត់"</string>
     <string name="install_app" msgid="5066668100199613936">"ដំឡើង​កម្មវិធី"</string>
diff --git a/packages/SystemUI/res/values-km/tiles_states_strings.xml b/packages/SystemUI/res/values-km/tiles_states_strings.xml
index 0b2d5b3..54790f6a 100644
--- a/packages/SystemUI/res/values-km/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-km/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"បិទ"</item>
     <item msgid="5137565285664080143">"បើក"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"មិនមានទេ"</item>
+    <item msgid="3079622119444911877">"បិទ"</item>
+    <item msgid="3028994095749238254">"បើក"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index e498ca4..7323450 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"ಹಂಚಿಕೊಳ್ಳಿ"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಿ"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"ಇನ್ನಷ್ಟು ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಅನ್ನು ವಜಾಗೊಳಿಸಿ"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"ಮುಖವನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ಕಳುಹಿಸಿ"</string>
     <string name="cancel" msgid="1089011503403416730">"ರದ್ದುಮಾಡಿ"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"ಆ್ಯಪ್ ಲೋಗೋ"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"ದೃಢೀಕರಿಸಿ"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ದೃಢೀಕರಣವನ್ನು ರದ್ದುಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ಮುಖ ಗುರುತಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಯಲು ಅನ್‌ಲಾಕ್ ಐಕಾನ್ ಅನ್ನು ಒತ್ತಿ."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ದೃಢೀಕರಿಸಲಾಗಿದೆ"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ದೃಢೀಕರಣವನ್ನು ರದ್ದುಗೊಳಿಸಿ"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ಪಿನ್ ಬಳಸಿ"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ಪ್ಯಾಟರ್ನ್ ಬಳಸಿ"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"ಪಾಸ್‌ವರ್ಡ್ ಬಳಸಿ"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ಪ್ರಮಾಣಿತ"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ಮಧ್ಯಮ"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"ಹೆಚ್ಚು"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ಸಾಧನದ ಮೈಕ್ರೋಫೋನ್ ನಿರ್ಬಂಧವನ್ನು ತೆಗೆಯಬೇಕೆ?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ಸಾಧನದ ಕ್ಯಾಮರಾ ನಿರ್ಬಂಧವನ್ನು ತೆಗೆಯಬೇಕೆ?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ಸಾಧನದ ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಅನ್‍ಬ್ಲಾಕ್ ಮಾಡಬೇಕೇ?"</string>
@@ -437,13 +448,15 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"ತೆಗೆದುಹಾಕಿ"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ವಿಜೆಟ್ ಅನ್ನು ಸೇರಿಸಿ"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ಮುಗಿದಿದೆ"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"ವಿಜೆಟ್‌ಗಳನ್ನು ಸೇರಿಸಿ"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡದೆಯೇ ನಿಮ್ಮ ಮೆಚ್ಚಿನ ಆ್ಯಪ್ ವಿಜೆಟ್‌ಗಳಿಗೆ ತ್ವರಿತ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಪಡೆಯಿರಿ."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ಲಾಕ್ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಯಾವುದೇ ವಿಜೆಟ್ ಅನ್ನು ಅನುಮತಿಸಬೇಕೇ?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"ಕೆಲಸದ ಆ್ಯಪ್ ವಿರಾಮ ರದ್ದುಮಾಡಬೇಕೇ"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"ವಿರಾಮವನ್ನು ರದ್ದುಗೊಳಿಸಿ"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ಬಳಕೆದಾರರನ್ನು ಬದಲಿಸಿ"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ಪುಲ್‌ಡೌನ್ ಮೆನು"</string>
-    <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ಈ ಸೆಷನ್‌ನಲ್ಲಿನ ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string>
+    <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ಈ ಸೆಶನ್‌ನಲ್ಲಿನ ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string>
     <string name="guest_wipe_session_title" msgid="7147965814683990944">"ಮತ್ತೆ ಸುಸ್ವಾಗತ, ಅತಿಥಿ!"</string>
     <string name="guest_wipe_session_message" msgid="3393823610257065457">"ನಿಮ್ಮ ಸೆಷನ್‌ ಮುಂದುವರಿಸಲು ಇಚ್ಚಿಸುವಿರಾ?"</string>
     <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"ಪ್ರಾರಂಭಿಸಿ"</string>
@@ -468,8 +481,8 @@
     <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಿರುವಾಗ, ರೆಕಾರ್ಡಿಂಗ್ ಮಾಡುತ್ತಿರುವಾಗ ಅಥವಾ ಕ್ಯಾಸ್ಟ್ ಮಾಡುತ್ತಿರುವಾಗ, ಆ ಆ್ಯಪ್‌ನಲ್ಲಿ ತೋರಿಸುವ ಅಥವಾ ಪ್ಲೇ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯಕ್ಕೆ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಹಾಗೂ ಆಡಿಯೊ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಕುರಿತು ಜಾಗರೂಕರಾಗಿರಿ."</string>
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"ಪ್ರಾರಂಭಿಸಿ"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಈ ಆಯ್ಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದೆ"</string>
-    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"ಕ್ಯಾಸ್ಟ್ ಮಾಡಲು ಪ್ರಾರಂಭಿಸಬೇಕೇ?"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"ನೀವು ಕ್ಯಾಸ್ಟ್ ಮಾಡುವಾಗ, ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಕಾಣಿಸುವ ಅಥವಾ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯಕ್ಕೆ Android ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಹಾಗೂ ಆಡಿಯೊ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಕುರಿತು ಜಾಗರೂಕರಾಗಿರಿ."</string>
+    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"ಕ್ಯಾಸ್ಟ್ ಮಾಡಲು ಪ್ರಾರಂಭಿಸಬೇಕೆ?"</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"ನೀವು ಕ್ಯಾಸ್ಟ್ ಮಾಡುತ್ತಿರುವಾಗ, ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಕಾಣಿಸುವ ಅಥವಾ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯಕ್ಕೆ Android ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಹಾಗೂ ಆಡಿಯೊ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಕುರಿತು ಜಾಗರೂಕರಾಗಿರಿ."</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಕ್ಯಾಸ್ಟ್ ಮಾಡುತ್ತಿರುವಾಗ, ಆ ಆ್ಯಪ್‌ನಲ್ಲಿ ತೋರಿಸುವ ಅಥವಾ ಪ್ಲೇ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯಕ್ಕೆ Android ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಹಾಗೂ ಆಡಿಯೊ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಕುರಿತು ಜಾಗರೂಕರಾಗಿರಿ."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"ಕ್ಯಾಸ್ಟ್ ಮಾಡಲು ಪ್ರಾರಂಭಿಸಿ"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"ಹಂಚಿಕೊಳ್ಳಲು ಪ್ರಾರಂಭಿಸಬೇಕೇ?"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"ಕಳ್ಳತನದ ರಕ್ಷಣೆ\nಸಾಧನ ಲಾಕ್ ಆಗಿದೆ, ಅನ್‌ಲಾಕ್‌ಗೆ ಹೆಚ್ಚು ಪ್ರಯತ್ನ..."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಲಾಗಿದೆ, ಹಲವಾರು ದೃಢೀಕರಣ ಪ್ರಯತ್ನಗಳು"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಲಾಗಿದೆ\nದೃಢೀಕರಣ ವಿಫಲವಾಗಿದೆ"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ಸೌಂಡ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"ಸ್ವಯಂಚಾಲಿತ ಶೀರ್ಷಿಕೆ ಮಾಧ್ಯಮ"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ಮ್ಯೂಟ್"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"ಬಿತ್ತರಿಸಿ"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"ರಿಂಗ್ ಮ್ಯೂಟ್ ಆಗಿರುವ ಕಾರಣ ಲಭ್ಯವಿಲ್ಲ"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಫೀಚರ್ ಆನ್ ಆಗಿರುವುದರಿಂದ ಲಭ್ಯವಿಲ್ಲ"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಫೀಚರ್ ಆನ್ ಆಗಿರುವುದರಿಂದ ಲಭ್ಯವಿಲ್ಲ"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. ಅನ್‌ಮ್ಯೂಟ್‌ ಮಾಡುವುದಕ್ಕಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. ಕಂಪನಕ್ಕೆ ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್‌ ಮಾಡಬಹುದು."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್‌ ಮಾಡಬಹುದು."</string>
@@ -603,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ವೈಬ್ರೇಟ್‌"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಕಗಳು"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"(<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>) ನಲ್ಲಿ ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು ರಿಂಗ್ ಆಗುತ್ತವೆ"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"ಔಟ್‌ಪುಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"ವಾಲ್ಯೂಮ್ ಸ್ಲೈಡರ್‌ಗಳನ್ನು ವಿಸ್ತೃತಗೊಳಿಸಲಾಗಿದೆ"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"ವಾಲ್ಯೂಮ್ ಸ್ಲೈಡರ್‌ಗಳನ್ನು ಕುಗ್ಗಿಸಲಾಗಿದೆ"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s ಮ್ಯೂಟ್ ಮಾಡಿ"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s ಅನ್‌ಮ್ಯೂಟ್ ಮಾಡಿ"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> ನಲ್ಲಿ ಪ್ಲೇ ಆಗು..."</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"ಇಲ್ಲಿ ಆಡಿಯೋ ಪ್ಲೇ..."</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"ಇದರಲ್ಲಿ ಪ್ಲೇ ಆಗುತ್ತದೆ"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"ಸಿಸ್ಟಂ UI ಟ್ಯೂನರ್"</string>
     <string name="status_bar" msgid="4357390266055077437">"ಸ್ಥಿತಿ ಪಟ್ಟಿ"</string>
     <string name="demo_mode" msgid="263484519766901593">"ಸಿಸ್ಟಂ UI ಡೆಮೋ ಮೋಡ್"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"ಇತ್ತೀಚೆಗೆ ಬಳಸಿದ ಆ್ಯಪ್‌ಗಳ ಸಹಾಯದಿಂದ ಮುಂದಕ್ಕೆ ಹೋಗಿ"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"ಇತ್ತೀಚೆಗೆ ಬಳಸಿದ ಆ್ಯಪ್‌ಗಳ ಸಹಾಯದಿಂದ ಹಿಂದಕ್ಕೆ ಹೋಗಿ"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ಆ್ಯಪ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ತೆರೆಯಿರಿ"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ಟಾಸ್ಕ್‌ಬಾರ್ ಅನ್ನು ತೋರಿಸಿ"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"ಸೆಟ್ಟಿಂಗ್‍ಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"assistant ಅನ್ನು ತೆರೆಯಿರಿ"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಮಾಡಿ"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS ಗೆ ಇರುವ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಸಹಾಯದಿಂದ ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ನಮೂದಿಸಿ"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS ಗೆ ಇರುವ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಸಹಾಯದಿಂದ ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ನಮೂದಿಸಿ"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್‌ನಿಂದ ಪೂರ್ಣ ಸ್ಕ್ರೀನ್‌ಗೆ ಬದಲಿಸಿ"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ಪರದೆ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಬಳಸುವಾಗ ಬಲಭಾಗ ಅಥವಾ ಕೆಳಭಾಗದಲ್ಲಿರುವ ಆ್ಯಪ್‌ಗೆ ಬದಲಿಸಿ"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ಪರದೆ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಬಳಸುವಾಗ ಎಡಭಾಗ ಅಥವಾ ಮೇಲ್ಭಾಗದಲ್ಲಿರುವ ಆ್ಯಪ್‌ಗೆ ಬದಲಿಸಿ"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸುವ ಸಮಯದಲ್ಲಿ: ಒಂದು ಆ್ಯಪ್‌ನಿಂದ ಮತ್ತೊಂದು ಆ್ಯಪ್‌ಗೆ ಬದಲಿಸಿ"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ಇನ್‌ಪುಟ್"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"ಮುಂದಿನ ಭಾಷೆಗೆ ಬದಲಿಸಿ"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ಕ್ಯಾಮರಾವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್‌ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"ಬಳಕೆದಾರರ ಉಪಸ್ಥಿತಿಯನ್ನು ಪತ್ತೆಹಚ್ಚಲಾಗಿದೆ"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಡೀಫಾಲ್ಟ್ ಟಿಪ್ಪಣಿಗಳ ಆ್ಯಪ್ ಅನ್ನು ಸೆಟ್ ಮಾಡಿ"</string>
     <string name="install_app" msgid="5066668100199613936">"ಆ್ಯಪ್ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
diff --git a/packages/SystemUI/res/values-kn/tiles_states_strings.xml b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
index 3ae6578..9628323 100644
--- a/packages/SystemUI/res/values-kn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"ಆಫ್ ಆಗಿದೆ"</item>
     <item msgid="5137565285664080143">"ಆನ್ ಆಗಿದೆ"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 75a6808..9a4c60b 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"공유"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"스크린샷 공유"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"더 캡처하기"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"스크린샷 닫기"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"얼굴 스캔 중"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"보내기"</string>
     <string name="cancel" msgid="1089011503403416730">"취소"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"앱 로고"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"확인"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"다시 시도하세요."</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"탭하여 인증 취소"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"얼굴이 인식되었습니다. 계속하려면 아이콘을 누르세요."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"인증됨"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"인증 취소"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"옵션 더보기"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN 사용"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"패턴 사용"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"비밀번호 사용"</string>
@@ -360,7 +363,15 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"표준"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"보통"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"높음"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"기기 마이크를 &amp;#173;차단 해제하시겠습니까?"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
+    <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"기기 마이크를 차단 해제하시겠습니까?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"기기 카메라를 차단 해제하시겠습니까?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"기기 카메라 및 마이크를 차단 해제하시겠습니까?"</string>
     <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"마이크를 사용할 수 있는 모든 앱 및 서비스에 대해 액세스가 차단 해제됩니다."</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"삭제"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"위젯 추가"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"완료"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"위젯 추가"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"태블릿을 잠금 해제하지 않고도 즐겨 사용하는 앱 위젯에 빠르게 액세스하세요"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"잠금 화면에서 위젯 사용을 허용하시겠습니까?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"설정 열기"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"직장 앱 일시중지를 해제하시겠습니까?"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"도난 방지\n기기 잠김, 잠금 해제 시도 횟수가 너무 많음"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"인증 시도 횟수가 너무 많아 기기가 잠겼습니다."</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"기기 잠김\n인증에 실패함"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"소리 설정"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"미디어 자막 자동 생성"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"음소거"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"전송"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"벨소리가 음소거되어 있으므로 사용할 수 없음"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"방해 금지 모드로 설정되어 있어 사용할 수 없음"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"방해 금지 모드로 설정되어 있어 사용할 수 없음"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. 탭하여 음소거를 해제하세요."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. 탭하여 진동으로 설정하세요. 접근성 서비스가 음소거될 수 있습니다."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. 탭하여 음소거로 설정하세요. 접근성 서비스가 음소거될 수 있습니다."</string>
@@ -602,17 +614,12 @@
     <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"음소거 해제"</string>
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"진동"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s 볼륨 컨트롤"</string>
-    <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"전화 및 알림이 오면 벨소리가 울림(<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"전화 및 알림이 오면 벨소리가 울립니다(<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)."</string>
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"출력 설정 열기"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"볼륨 슬라이더 펼침"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"볼륨 슬라이더 접힘"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s 음소거"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s 음소거 해제"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> 재생 위치:"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"오디오 재생 위치:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"시스템 UI 튜너"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"최근 앱 간 앞으로 순환"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"최근 앱 간 뒤로 순환"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"앱 목록 열기"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"태스크 바 표시"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"설정 열기"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"어시스턴트 열기"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"잠금 화면"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"현재 앱을 오른쪽으로 보내는 화면 분할 입력"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"현재 앱을 왼쪽으로 보내는 화면 분할 입력"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"화면 분할에서 전체 화면으로 전환"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"화면 분할을 사용하는 중에 오른쪽 또는 아래쪽에 있는 앱으로 전환하기"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"화면 분할을 사용하는 중에 왼쪽 또는 위쪽에 있는 앱으로 전환하기"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"화면 분할 중: 다른 앱으로 바꾸기"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"입력"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"다음 언어로 전환"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"카메라 차단됨"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"카메라 및 마이크 차단됨"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"마이크 차단됨"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"방해 금지 모드"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"사용자 정보가 감지되었습니다."</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"설정에서 기본 메모 앱 설정"</string>
     <string name="install_app" msgid="5066668100199613936">"앱 설치"</string>
diff --git a/packages/SystemUI/res/values-ko/tiles_states_strings.xml b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
index 002efb2..d30aff2 100644
--- a/packages/SystemUI/res/values-ko/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"사용 안함"</item>
     <item msgid="5137565285664080143">"사용"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 74bc943..d893887 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Бөлүшүү"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Скриншотту бөлүшүү"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Көбүрөөк тартуу"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Скриншотту четке кагуу"</string>
@@ -105,7 +106,7 @@
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды жаздыруу сеансы боюнча учурдагы билдирме"</string>
     <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Жаздырып баштайсызбы?"</string>
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Жаздырып жатканыңызда Android экраныңызда көрүнүп жана түзмөктө ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Колдонмону жаздырып жатканда Android ал колдонмодо көрсөтүлүп жана ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Колдонмону жаздырып жатканда Android анда көрүнүп же ойноп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Жаздырып баштоо"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Аудио жаздыруу"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Түзмөктөгү аудиолор"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Жүз скандалууда"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Жөнөтүү"</string>
     <string name="cancel" msgid="1089011503403416730">"Баш тартуу"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Колдонмонун логотиби"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Ырастоо"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Кайталоо"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Аныктыгын текшерүүнү жокко чыгаруу үчүн таптаңыз"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Жүз таанылды. Улантуу үчүн кулпусун ачуу сүрөтчөсүн басыңыз."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аныктыгы текшерилди"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Аныктыгын текшерүүнү жокко чыгаруу"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Дагы параметрлер"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN кодду колдонуу"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Графикалык ачкычты колдонуу"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Сырсөз колдонуу"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Кадимки"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Орточо"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Жогору"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Түзмөктүн микрофонун бөгөттөн чыгарасызбы?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Түзмөктүн камерасын бөгөттөн чыгарасызбы?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Түзмөктүн камерасы менен микрофону бөгөттөн чыгарылсынбы?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Өчүрүү"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Виджет кошуу"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Бүттү"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Виджеттерди кошуу"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Тандалма колдонмолордун виджеттерин планшеттин кулпусун ачпастан эле, ыкчам колдонуңуз."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Бардык виджеттер кулпуланган экранда көрсөтүлсүнбү?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Параметрлерди ачуу"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Жумуш колдонмолорун иштетесизби?"</string>
@@ -465,16 +478,16 @@
     <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Колдонмону бөлүшүү же жаздыруу"</string>
     <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу аркылуу жаздырып же тышкы экранга чыгарып баштайсызбы?"</string>
     <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Бөлүшүп, жаздырып же тышкы экранга чыгарып жатканда <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу экраныңыздагы бардык маалыматты же түзмөктө ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Колдонмону бөлүшүп, жаздырып же тышкы экранга чыгарганда <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу ал колдонмодо көрсөтүлүп жана ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Колдонмону бөлүшүп, жаздырып же тышкы экранга чыгарганда <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу анда көрүнүп же ойноп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Баштоо"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> бул параметрди өчүрүп койду"</string>
-    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Тышкы экранга чыгаруу башталсынбы?"</string>
+    <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Тышкы экранга чыгарып баштайсызбы?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Тышкы экранга чыгарганда Android экраныңызда көрүнүп жана түзмөктө ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Колдонмону тышкы экранга чыгарганда Android ал колдонмодо көрсөтүлүп жана ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Колдонмону тышкы экранга чыгарганда Android анда көрүнүп же ойноп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Тышкы экранга чыгарып баштоо"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Бөлүшүү башталсынбы?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Бөлүшүп, жаздырып же тышкы экранга чыгарып жатканда Android экраныңыздагы бардык маалыматты же түзмөктө ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
-    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Колдонмону бөлүшүп, жаздырып же тышкы экранга чыгарганда Android ал колдонмодо көрсөтүлүп жана ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
+    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Колдонмону бөлүшүп, жаздырып же тышкы экранга чыгарганда Android анда көрүнүп же ойноп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
     <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Баштоо"</string>
     <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Колдонмо которулганда бөлүшүү тындырылат"</string>
     <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Анын ордуна бул колдонмону бөлүшүү"</string>
@@ -538,7 +551,8 @@
     <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">"Ишеним агенти кулпусун ачты"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Түзмөктүн уурдалышынан коргоо\nТүзмөк кулпуланды. Кулпуну ачууга өтө көп аракет жасалды"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Түзмөк кулпуланды. Аутентификациядан өтүүгө өтө көп аракет жасалды"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Түзмөк кулпуланды\nАутентификациядан өткөн жоксуз"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Добуштун параметрлери"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматтык коштомо жазуулар"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Үнсүз"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Тышкы экранга чыгруу"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Үнсүз режимде жеткиликсиз"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"\"Тынчымды алба\" режими күйүк болгондуктан, жеткиликсиз"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"\"Тынчымды алба\" режими күйүк болгондуктан, жеткиликсиз"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Үнүн чыгаруу үчүн таптап коюңуз."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Дирилдөөгө коюу үчүн таптап коюңуз. Атайын мүмкүнчүлүктөр кызматынын үнүн өчүрүп койсо болот."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Үнүн өчүрүү үчүн таптап коюңуз. Атайын мүмкүнчүлүктөр кызматынын үнүн өчүрүп койсо болот."</string>
@@ -603,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"дирилдөө"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s үндү башкаруу элементтери"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Чалуулар менен эскертмелердин үнү чыгарылат (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Чыгаруу параметрлерин киргизүү"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Үндүн катуулугунун сыдырмалары жайып көрсөтүлдү"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Үндүн катуулугунун сыдырмалары жыйыштырылды"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s үнүн басуу"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s үнүн чыгаруу"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> аркылуу ойнотулууда"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудио төмөнкүдө ойнотулат:"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудио кайсы жерде ойнотулат:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
     <string name="status_bar" msgid="4357390266055077437">"Абал тилкеси"</string>
     <string name="demo_mode" msgid="263484519766901593">"Системанын интерфейсинин демо режими"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Соңку колдонмолордо алдыга өтүү"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Соңку колдонмолордо артка кайтуу"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Колдонмолордун тизмесин ачуу"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Тапшырмалар панелин көрсөтүү"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Параметрлерди ачуу"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Жардамчыны ачуу"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Экранды кулпулоо"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Учурда оң жактагы колдонмо менен экранды бөлүүнү иштетүү"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Учурда сол жактагы колдонмо менен экранды бөлүүнү иштетүү"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Экранды бөлүү режиминен толук экранга которулуу"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Бөлүнгөн экранды колдонуп жатканда сол же төмөн жактагы колдонмого которулуңуз"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Бөлүнгөн экранды колдонуп жатканда сол же жогору жактагы колдонмого которулуңуз"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Экранды бөлүү режиминде бир колдонмону экинчисине алмаштыруу"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Киргизүү"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Кийинки тилге которулуу"</string>
@@ -1165,7 +1173,7 @@
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Туташты"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Убактылуу туташып турат"</string>
     <string name="mobile_data_poor_connection" msgid="819617772268371434">"Байланыш начар"</string>
-    <string name="mobile_data_off_summary" msgid="3663995422004150567">"Мобилдик трафик автоматтык түрдө туташтырылбайт"</string>
+    <string name="mobile_data_off_summary" msgid="3663995422004150567">"Мобилдик Интернетке автоматтык түрдө өтпөйт"</string>
     <string name="mobile_data_no_connection" msgid="1713872434869947377">"Байланыш жок"</string>
     <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Башка тармактар жеткиликсиз"</string>
     <string name="all_network_unavailable" msgid="4112774339909373349">"Тармактар жеткиликтүү эмес"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера бөгөттөлдү"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера менен микрофон бөгөттөлдү"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон бөгөттөлдү"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Тынчымды алба"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Колдонуучу аныкталды"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Параметрлерден демейки кыска жазуулар колдонмосун тууралаңыз"</string>
     <string name="install_app" msgid="5066668100199613936">"Колдонмону орнотуу"</string>
diff --git a/packages/SystemUI/res/values-ky/tiles_states_strings.xml b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
index bb03d0a..35795b7 100644
--- a/packages/SystemUI/res/values-ky/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Өчүк"</item>
     <item msgid="5137565285664080143">"Күйүк"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-land-television/dimens.xml b/packages/SystemUI/res/values-land-television/dimens.xml
index 52f591f..d3bafbc 100644
--- a/packages/SystemUI/res/values-land-television/dimens.xml
+++ b/packages/SystemUI/res/values-land-television/dimens.xml
@@ -28,9 +28,6 @@
   <dimen name="tv_volume_dialog_bubble_size">36dp</dimen>
   <dimen name="tv_volume_dialog_row_padding">6dp</dimen>
   <dimen name="tv_volume_number_text_size">16sp</dimen>
-  <dimen name="tv_volume_seek_bar_thumb_diameter">24dp</dimen>
-  <dimen name="tv_volume_seek_bar_thumb_focus_ring_width">8dp</dimen>
+  <dimen name="tv_volume_seek_bar_thumb_diameter">16dp</dimen>
   <dimen name="tv_volume_icons_size">20dp</dimen>
-  <dimen name="tv_volume_seek_bar_thumb_shadow_radius">4.0</dimen>
-  <dimen name="tv_volume_seek_bar_thumb_shadow_dy">4.0</dimen>
 </resources>
diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml
index 55606aa..56ebc06 100644
--- a/packages/SystemUI/res/values-land/dimens.xml
+++ b/packages/SystemUI/res/values-land/dimens.xml
@@ -94,4 +94,7 @@
 
     <dimen name="keyguard_indication_margin_bottom">8dp</dimen>
     <dimen name="lock_icon_margin_bottom">24dp</dimen>
+
+    <!-- Keyboard shortcuts helper -->
+    <dimen name="ksh_container_horizontal_margin">48dp</dimen>
 </resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 6652200..873d75e 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານບລັອກການຖ່າຍຮູບໜ້າຈໍໄວ້."</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"ແກ້ໄຂ"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"ແກ້ໄຂຮູບໜ້າຈໍ"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"ແບ່ງປັນ"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"ແບ່ງປັນຮູບໜ້າຈໍ"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"ຖ່າຍຮູບເພີ່ມເຕີມ"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ປິດຮູບໜ້າຈໍ"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"ການສະແກນໜ້າ"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ສົ່ງ"</string>
     <string name="cancel" msgid="1089011503403416730">"ຍົກເລີກ"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"ໂລໂກ້ແອັບ"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"ຢືນຢັນ"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ລອງໃໝ່"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ແຕະເພື່ອຍົກເລີກການກວດສອບຄວາມຖືກຕ້ອງ"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ຈຳແນກໜ້າໄດ້ແລ້ວ. ກົດໄອຄອນປົດລັອກເພື່ອສືບຕໍ່."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ຮັບຮອງຄວາມຖືກຕ້ອງແລ້ວ"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ຍົກເລີກການພິສູດຢືນຢັນ"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ຕົວເລືອກເພີ່ມເຕີມ"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ໃຊ້ PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ໃຊ້ຮູບແບບ"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"ໃຊ້ລະຫັດຜ່ານ"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ມາດຕະຖານ"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ປານກາງ"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"ສູງ"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"ອຸປະກອນຊ່ວຍຟັງ"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ປົດບລັອກໄມໂຄຣໂຟນອຸປະກອນບໍ?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ປົດບລັອກກ້ອງຖ່າຍຮູບອຸ​ປະ​ກອນບໍ?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ຍົກເລີກການບລັອກກ້ອງຖ່າຍຮູບ ຫຼື ໄມໂຄຣໂຟນອຸ​ປະ​ກອນບໍ?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"ລຶບອອກ"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ເພີ່ມວິດເຈັດ"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ແລ້ວໆ"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"ເພີ່ມວິດເຈັດ"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"ຮັບການເຂົ້າເຖິງດ່ວນຫາແອັບວິດເຈັດທີ່ທ່ານມັກໂດຍບໍ່ຕ້ອງປົດລັອກແທັບເລັດຂອງທ່ານ."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ອະນຸຍາດວິດເຈັດໃດກໍຕາມຢູ່ໜ້າຈໍລັອກບໍ?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"ເປີດການຕັ້ງຄ່າ"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"ຍົກເລີກການຢຸດຊົ່ວຄາວແອັບບ່ອນເຮັດວຽກບໍ?"</string>
@@ -538,7 +550,8 @@
     <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="1265107698772588299">"ການປ້ອງກັນການຖືກລັກ\nຂອງອຸປະກອນຖືກລັອກ, ພະຍາຍາມປົດລັອກຫຼາຍເທື່ອເກີນໄປ"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ອຸປະກອນຖືກລັອກແລ້ວ, ພະຍາຍາມເຮັດການພິສູດຢືນຢັນຫຼາຍເທື່ອເກີນໄປ"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ລັອກອຸປະກອນແລ້ວ\nການພິສູດຢືນຢັນບໍ່ສຳເລັດ"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ການຕັ້ງຄ່າສຽງ"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"ສ້າງຄຳບັນຍາຍມີເດຍໂດຍອັດຕະໂນມັດ"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ປິດ"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"ສົ່ງສັນຍານ"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"ບໍ່ມີໃຫ້ໃຊ້ເນື່ອງຈາກມີການປິດສຽງໂທເຂົ້າ"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"ບໍ່ມີໃຫ້ຍ້ອນວ່າຫ້າມລົບກວນເປີດຢູ່"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"ບໍ່ມີໃຫ້ຍ້ອນວ່າຫ້າມລົບກວນເປີດຢູ່"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. ແຕະເພື່ອເຊົາປິດສຽງ."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. ແຕະເພື່ອຕັ້ງເປັນສັ່ນ. ບໍລິການຊ່ວຍເຂົ້າເຖິງອາດຖືກປິດສຽງໄວ້."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. ແຕະເພື່ອປິດສຽງ. ບໍລິການຊ່ວຍເຂົ້າເຖິງອາດຖືກປິດສຽງໄວ້."</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ສັ່ນເຕືອນ"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"ການຄວບຄຸມສຽງ %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ການໂທ ແລະ ການແຈ້ງເຕືອນຈະມີສຽງດັງ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"ໃສ່ການຄັ້ງຄ່າເອົ້າພຸດ"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"ຂະຫຍາຍສະໄລເດີລະດັບສຽງແລ້ວ"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"ຫຍໍ້ສະໄລເດີລະດັບສຽງລົງແລ້ວ"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"ປິດສຽງ %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"ເຊົາປິດສຽງ %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"ກຳລັງຫຼິ້ນ <xliff:g id="LABEL">%s</xliff:g> ໃນ"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"ສຽງຈະຫຼິ້ນຕໍ່ໄປ"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"ສະຫຼັບລະຫວ່າງແອັບຫຼ້າສຸດແບບໄປໜ້າ"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"ສະຫຼັບລະຫວ່າງແອັບຫຼ້າສຸດແບບກັບຫຼັງ"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ເປີດລາຍຊື່ແອັບ"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ສະແດງແຖບໜ້າວຽກ"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"ເປີດການຕັ້ງຄ່າ"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"ເປີດຜູ້ຊ່ວຍ"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"ໜ້າຈໍລັອກ"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ RHS"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ LHS"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"ສະຫຼັບຈາກແບ່ງໜ້າຈໍໄປເປັນເຕັມຈໍ"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ສະຫຼັບໄປໃຊ້ແອັບຢູ່ຂວາ ຫຼື ທາງລຸ່ມໃນຂະນະທີ່ໃຊ້ແບ່ງໜ້າຈໍ"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ສະຫຼັບໄປໃຊ້ແອັບຢູ່ຊ້າຍ ຫຼື ທາງເທິງໃນຂະນະທີ່ໃຊ້ແບ່ງໜ້າຈໍ"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"ໃນລະຫວ່າງແບ່ງໜ້າຈໍ: ໃຫ້ປ່ຽນຈາກແອັບໜຶ່ງເປັນອີກແອັບໜຶ່ງ"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ການປ້ອນຂໍ້ມູນ"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"ສະຫຼັບເປັນພາສາຖັດໄປ"</string>
@@ -791,7 +798,7 @@
     <string name="accessibility_long_click_tile" msgid="210472753156768705">"ເປີດການຕັ້ງຄ່າ"</string>
     <string name="accessibility_status_bar_headphones" msgid="1304082414912647414">"ເຊື່ອມຕໍ່ຊຸດຫູຟັງແລ້ວ"</string>
     <string name="accessibility_status_bar_headset" msgid="2699275863720926104">"ເຊື່ອມ​ຕໍ່ຊຸດ​ຫູ​ຟັງແລ້ວ"</string>
-    <string name="data_saver" msgid="3484013368530820763">"ຕົວປະຢັດອິນເຕີເນັດ"</string>
+    <string name="data_saver" msgid="3484013368530820763">"ຕົວປະຢັດຂໍ້ມູນ"</string>
     <string name="accessibility_data_saver_on" msgid="5394743820189757731">"ເປີດຕົວປະຢັດອິນເຕີເນັດຢູ່"</string>
     <string name="switch_bar_on" msgid="1770868129120096114">"ເປີດ"</string>
     <string name="switch_bar_off" msgid="5669805115416379556">"ປິດ"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ກ້ອງຖ່າຍຮູບຖືກບລັອກຢູ່"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ກ້ອງຖ່າຍຮູບ ແລະ ໄມໂຄຣໂຟນຖືກບລັອກຢູ່"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ໄມໂຄຣໂຟນຖືກບລັອກຢູ່"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"ຫ້າມລົບກວນ"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"ກວດພົບຕົວຕົນຜູ້ໃຊ້"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ຕັ້ງຄ່າແອັບຈົດບັນທຶກເລີ່ມຕົ້ນໃນການຕັ້ງຄ່າ"</string>
     <string name="install_app" msgid="5066668100199613936">"ຕິດຕັ້ງແອັບ"</string>
diff --git a/packages/SystemUI/res/values-lo/tiles_states_strings.xml b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
index 3c288fc..9386e00a 100644
--- a/packages/SystemUI/res/values-lo/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"ປິດ"</item>
     <item msgid="5137565285664080143">"ເປີດ"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"ບໍ່ພ້ອມໃຫ້ນຳໃຊ້"</item>
+    <item msgid="3079622119444911877">"ປິດ"</item>
+    <item msgid="3028994095749238254">"ເປີດ"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index aae13c9..d5d7929 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Jūsų IT administratorius užblokavo galimybę daryti ekrano kopijas."</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Redaguoti"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Redaguoti ekrano kopiją"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Bendrinti"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Bendrinti ekrano kopiją"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Fiksuoti daugiau"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Praleisti ekrano kopiją"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Nuskaitomas veidas"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Siųsti"</string>
     <string name="cancel" msgid="1089011503403416730">"Atšaukti"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Programos logotipas"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Patvirtinkite"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Bandyti dar kartą"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Palieskite, jei norite atšaukti autentifikavimą"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Veidas atpažintas. Tęskite paspaudę atrakinimo piktogramą."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikuota"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Atšaukti autentifikavimą"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Daugiau parinkčių"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Naudoti PIN kodą"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Naudoti atrakinimo piešinį"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Naudoti slaptažodį"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Įprastas"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Vidutinis"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Aukštas"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Panaikinti įrenginio mikrofono blokavimą?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Panaikinti įrenginio fotoaparato blokavimą?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Panaikinti įrenginio fotoaparato ir mikrofono blokavimą?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Pašalinti"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Pridėti valdiklį"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Atlikta"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Pridėti valdiklių"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Sparčiai pasiekite mėgstamiausius programų valdiklius neatrakinę planšetinio kompiuterio."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Leisti visus valdiklius užrakinimo ekrane?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Atidaryti nustatymus"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Atš. darbo progr. pristabd.?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Šį įrenginį tvarko vienas iš tavo tėvų. Jis gali peržiūrėti ir tvarkyti informaciją, pvz., tavo naudojamas programas, vietovę ir įrenginio naudojimo laiką."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Atrakinta taikant „TrustAgent“"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Apsauga nuo vagystės\nĮrenginys užrakintas, per daug bandymų atrakinti"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Įrenginys užrakintas, nes atlikta per daug bandymų autentifikuoti"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Įrenginys užrakintas\nAutentifikuoti nepavyko"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Garso nustatymai"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Taikyti aut. medij. subtitr."</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Nutildyti"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Perdavimas"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nepasiekiama, nes skambutis nutildytas"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nepasiekiama, nes įjungtas netrukdymo režimas"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Nepasiekiama, nes įjungtas netrukdymo režimas"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Palieskite, kad įjungtumėte garsą."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Palieskite, kad nustatytumėte vibravimą. Gali būti nutildytos pritaikymo neįgaliesiems paslaugos."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Palieskite, kad nutildytumėte. Gali būti nutildytos pritaikymo neįgaliesiems paslaugos."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibruoti"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Garsumo valdikliai: %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Skambučiai ir pranešimai skambės (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Įveskite išvesties nustatymus"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Garsumo šliaužikliai išskleisti"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Garsumo šliaužikliai sutraukti"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"nutildyti %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"įjungti garsą %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Leidžiama „<xliff:g id="LABEL">%s</xliff:g>“"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Garsas bus leidžiamas"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Sistemos naudotojo sąsajos derinimo priemonė"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Pereiti į priekį per naujausias programas"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Pereiti atgal per naujausias programas"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Atidaryti programų sąrašą"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Rodyti užduočių juostą"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Atidaryti nustatymus"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Atidaryti Padėjėją"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Užrakinti ekraną"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Eiti į išskaidyto ekrano režimą su dabartine programa dešinėje"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Eiti į išskaidyto ekrano režimą su dabartine programa kairėje"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Perjungti iš išskaidyto ekrano režimo į viso ekrano režimą"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Perjunkite į programą dešinėje arba apačioje išskaidyto ekrano režimu"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Perjunkite į programą kairėje arba viršuje išskaidyto ekrano režimu"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Išskaidyto ekrano režimu: pakeisti iš vienos programos į kitą"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Įvestis"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Perjungti į kitą kalbą"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Fotoaparatas užblokuotas"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Fotoaparatas ir mikrofonas užblokuoti"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonas užblokuotas"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Netrukdymo režimas"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Aptikta naudotojo veikla"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nustatykite numatytąją užrašų programą Nustatymuose"</string>
     <string name="install_app" msgid="5066668100199613936">"Įdiegti programą"</string>
diff --git a/packages/SystemUI/res/values-lt/tiles_states_strings.xml b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
index 8c4515b..cfa5552 100644
--- a/packages/SystemUI/res/values-lt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Išjungta"</item>
     <item msgid="5137565285664080143">"Įjungta"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index abe280d..4413780 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Jūsu IT administrators ir bloķējis ekrānuzņēmumu izveidi"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Rediģēt"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Rediģēt ekrānuzņēmumu"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Kopīgot"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Kopīgot ekrānuzņēmumu"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Tvert vairāk"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Nerādīt ekrānuzņēmumu"</string>
@@ -105,8 +106,8 @@
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Aktīvs paziņojums par ekrāna ierakstīšanas sesiju"</string>
     <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Vai sākt ierakstīšanu?"</string>
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Ierakstīšanas laikā Android var piekļūt visam, kas tiek rādīts jūsu ekrānā vai atskaņots jūsu ierīcē. Tāpēc piesardzīgi apejieties ar parolēm, maksājumu informāciju, ziņojumiem, fotoattēliem un audio un video saturu."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Lietotnes ierakstīšanas laikā Android var piekļūt visam, kas tiek rādīts vai atskaņots attiecīgajā lietotnē. Tāpēc piesardzīgi apejieties ar parolēm, maksājumu informāciju, ziņojumiem, fotoattēliem un audio un video saturu."</string>
-    <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Sāk ierakstīšanu"</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Lietotnes ierakstīšanas laikā Android var piekļūt visam, kas tiek rādīts vai atskaņots attiecīgajā lietotnē. Tāpēc ar parolēm, maksājumu informāciju, ziņojumiem, fotoattēliem un audio un video saturu rīkojieties piesardzīgi."</string>
+    <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Sākt ierakstīšanu"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Ierakstīt audio"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Ierīces audio"</string>
     <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Skaņa no jūsu ierīces, piemēram, mūzika, sarunas un zvana signāli"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Sejas skenēšana"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Sūtīt"</string>
     <string name="cancel" msgid="1089011503403416730">"Atcelt"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Lietotnes logotips"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Apstiprināt"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Mēģināt vēlreiz"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Pieskarieties, lai atceltu autentifikāciju."</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Seja atpazīta. Lai turpinātu, nospiediet atbloķēšanas ikonu."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikācija veikta"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Atcelt autentificēšanu"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Citas opcijas"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Izmantot PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Izmantot kombināciju"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Izmantot paroli"</string>
@@ -263,7 +266,7 @@
     <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Nav pieejama neviena pārī savienota ierīce."</string>
     <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Lai pievienotu vai atvienotu kādu ierīci, pieskarieties."</string>
-    <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Savienošana pārī ar jaunu ierīci"</string>
+    <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Savienot pārī ar jaunu ierīci"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Skatīt visas"</string>
     <string name="turn_on_bluetooth" msgid="5681370462180289071">"Izmantot Bluetooth"</string>
     <string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Savienojums izveidots"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standarta"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Vidējs"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Augsts"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vai atbloķēt ierīces mikrofonu?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vai vēlaties atbloķēt ierīces kameru?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vai atbloķēt ierīces kameru un mikrofonu?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Noņemt"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Pievienot logrīku"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gatavs"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Pievienot logrīkus"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Ātri piekļūstiet saviem iecienītākajiem lietotņu logrīkiem, neatbloķējot planšetdatoru."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vai atļaut jebkāda veida logrīkus bloķēšanas ekrānā?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Atvērt iestatījumus"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Vai aktivizēt darba lietotnes?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Šo ierīci pārvalda viens no jūsu vecākiem. Vecāki var skatīt un pārvaldīt tādu informāciju kā jūsu izmantotās lietotnes, atrašanās vieta un izmantošanas ilgums."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Bloķēšanu liedzis TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Aizsardzība pret zādzību\nIerīce bloķēta; pārāk daudz atbloķēšanas mēģinājumu"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Ierīce tika bloķēta; pārāk daudz autentifikācijas mēģinājumu."</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Ierīce bloķēta\nAutentifikācija neizdevās"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Skaņas iestatījumi"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Autom. paraksti multividei"</string>
@@ -571,7 +585,7 @@
     <string name="screen_pinning_exit" msgid="4553787518387346893">"Lietotne tika atsprausta"</string>
     <string name="stream_voice_call" msgid="7468348170702375660">"Zvans"</string>
     <string name="stream_system" msgid="7663148785370565134">"Sistēma"</string>
-    <string name="stream_ring" msgid="7550670036738697526">"Zvans"</string>
+    <string name="stream_ring" msgid="7550670036738697526">"Skaņas signāls"</string>
     <string name="stream_music" msgid="2188224742361847580">"Multivide"</string>
     <string name="stream_alarm" msgid="16058075093011694">"Signāls"</string>
     <string name="stream_notification" msgid="7930294049046243939">"Paziņojums"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Izslēgt skaņu"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Apraide"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nevar mainīt, jo izslēgts skaņas signāls"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nav pieejams, jo ir ieslēgts režīms Netraucēt"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Nav pieejams, jo ir ieslēgts režīms Netraucēt"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Pieskarieties, lai ieslēgtu skaņu."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Pieskarieties, lai iestatītu uz vibrozvanu. Var tikt izslēgti pieejamības pakalpojumu signāli."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Pieskarieties, lai izslēgtu skaņu. Var tikt izslēgti pieejamības pakalpojumu signāli."</string>
@@ -596,23 +608,18 @@
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Telpiskais audio"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Izslēgts"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fiksēts"</string>
-    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Galvas kustību reģistrēšana"</string>
+    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Seko galvai"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"Pieskarieties, lai mainītu zvanītāja režīmu."</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"izslēgt skaņu"</string>
     <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ieslēgt skaņu"</string>
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrēt"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s skaļuma vadīklas"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Zvani un paziņojumi aktivizēs zvana signālu (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Atvērt izvades iestatījumus"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Skaļuma slīdņi izvērsti"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Skaļuma slīdņi sakļauti"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"izslēgt skaņu straumei %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"ieslēgt skaņu straumei %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> — atskaņošana šeit:"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio tiks atskaņots šeit:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Sistēmas saskarnes regulators"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Secīgi pārlūkot nesen izmantotās lietotnes (pāriet uz nākamo)"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Secīgi pārlūkot nesen izmantotās lietotnes (pāriet uz iepriekšējo)"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Atvērt lietotņu sarakstu"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Rādīt uzdevumu joslu"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Atvērt iestatījumus"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Atvērt Asistentu"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Bloķēt ekrānu"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa labi"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa kreisi"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Pārslēgties no ekrāna sadalīšanas režīma uz pilnekrāna režīmu"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Pāriet uz lietotni pa labi/lejā, kamēr izmantojat sadalīto ekrānu."</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Pāriet uz lietotni pa kreisi/augšā, kamēr izmantojat sadalīto ekrānu."</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Ekrāna sadalīšanas režīmā: pārvietot lietotni no viena ekrāna uz otru"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ievade"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Pārslēgt uz nākamo valodu"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera ir bloķēta"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameras un mikrofona lietošana ir bloķēta"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofons ir bloķēts"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Režīms “Netraucēt”"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Konstatēta lietotāja klātbūtne"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Iestatījumos iestatiet noklusējuma piezīmju lietotni."</string>
     <string name="install_app" msgid="5066668100199613936">"Instalēt lietotni"</string>
diff --git a/packages/SystemUI/res/values-lv/tiles_states_strings.xml b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
index a75e9d85..e6b4dea 100644
--- a/packages/SystemUI/res/values-lv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Izslēgts"</item>
     <item msgid="5137565285664080143">"Ieslēgts"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index c3690efd..4f5bf6c 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Сподели"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Споделете слика од екранот"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Сними повеќе"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Отфрлете ја сликата од екранот"</string>
@@ -105,7 +106,7 @@
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Тековно известување за сесија за снимање на екранот"</string>
     <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Да се започне со снимање?"</string>
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Додека снимате, Android има пристап до сѐ што е видливо на вашиот екран или пуштено на вашиот уред. Затоа, бидете внимателни со работи како лозинки, детали за плаќање, пораки, фотографии и аудио и видео."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Додека снимате апликација, Android има пристап до сѐ што се прикажува или пушта на таа апликација. Затоа, бидете внимателни со лозинки, детали за плаќање, пораки фотографии и аудио и видео."</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Додека снимате апликација, Android има пристап до сѐ што се прикажува или пушта на таа апликација. Затоа, бидете внимателни со лозинки, детали за плаќање, пораки, фотографии и аудио и видео."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Започни со снимање"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Снимај аудио"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Аудио од уредот"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Скенирање лице"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Испрати"</string>
     <string name="cancel" msgid="1089011503403416730">"Откажи"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Лого на апликацијата"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Потврди"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Обиди се повторно"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Допрете за да ја откажете проверката"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицето е препознаено. Притиснете ја иконата за отклучување за да продолжите."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Проверена"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Откажување автентикација"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Повеќе опции"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Користи PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Користи шема"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Користи лозинка"</string>
@@ -262,7 +265,7 @@
     <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не вознемирувај"</string>
     <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Нема достапни спарени уреди"</string>
-    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Допрете за да поврзете уред или да ја прекинете врската со уред"</string>
+    <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Допрете за да воспоставите или да прекинете врска со уред"</string>
     <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Спарете нов уред"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Прикажи ги сите"</string>
     <string name="turn_on_bluetooth" msgid="5681370462180289071">"Користи Bluetooth"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандарден"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Среден"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Висок"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Да се одблокира пристапот до микрофонот на уредот?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Да се одблокира пристапот до камерата на уредот?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Да се одблокира пристапот до камерата и микрофонот на уредот?"</string>
@@ -437,13 +448,15 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Отстранува"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Додајте виџет"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Додајте виџети"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Добијте брз пристап до вашите омилени виџети за апликации без да го отклучите таблетот."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Да се дозволи каков било виџет на заклучен екран?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Отвори ги поставките"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Да се актив. работните аплик.?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"Прекини ја паузата"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Промени го корисникот"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"паѓачко мени"</string>
-    <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Сите апликации и податоци во сесијата ќе се избришат."</string>
+    <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Сите апликации и податоци во сесијава ќе се избришат."</string>
     <string name="guest_wipe_session_title" msgid="7147965814683990944">"Добре дојде пак, гостине!"</string>
     <string name="guest_wipe_session_message" msgid="3393823610257065457">"Дали сакате да продолжите со сесијата?"</string>
     <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Почни одново"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Родителот управува со уредов. Родителот може да прегледува и управува со податоците, како што се апликациите што ги користиш, твојата локација и времето поминато на уредот."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"ВПН"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Се одржува отклучен од TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Заштита од кражби\nЗаклучено. Премногу обиди за отклучување."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Уредот се заклучи, премногу обиди за автентикација"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Уредот е заклучен\nАвтентикацијата не успеа"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Поставки за звукот"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматски титлови"</string>
@@ -572,7 +586,7 @@
     <string name="stream_voice_call" msgid="7468348170702375660">"Повик"</string>
     <string name="stream_system" msgid="7663148785370565134">"Систем"</string>
     <string name="stream_ring" msgid="7550670036738697526">"Ѕвони"</string>
-    <string name="stream_music" msgid="2188224742361847580">"Аудио-визуелни содржини"</string>
+    <string name="stream_music" msgid="2188224742361847580">"Аудиовизуелни содржини"</string>
     <string name="stream_alarm" msgid="16058075093011694">"Аларм"</string>
     <string name="stream_notification" msgid="7930294049046243939">"Известување"</string>
     <string name="stream_bluetooth_sco" msgid="6234562365528664331">"Bluetooth"</string>
@@ -582,17 +596,15 @@
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Вибрации"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Исклучи звук"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Емитување"</string>
-    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недостапно бидејќи ѕвонењето е исклучено"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недостапно бидејќи звукот е исклучен"</string>
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Недостапно бидејќи е вклучено „Не вознемирувај“"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Недостапно бидејќи е вклучено „Не вознемирувај“"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Допрете за да вклучите звук."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Допрете за да поставите на вибрации. Можеби ќе се исклучи звукот на услугите за достапност."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Допрете за да исклучите звук. Можеби ќе се исклучи звукот на услугите за достапност."</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Допрете за да се постави на вибрации."</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Допрете за да се исклучи звукот."</string>
-    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контрола на бучавата"</string>
+    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контрола на шум"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Просторен звук"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Исклучено"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Фиксно"</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"вибрации"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Контроли на јачината на звукот за %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Повиците и известувањата ќе ѕвонат (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Внесете ги поставките за излез"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Лизгачите за јачина на звукот се проширени"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Лизгачите за јачина на звукот се собрани"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"исклучување звук на %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"вклучување звук на %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>: пуштено на"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудиото ќе се пушти на"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Адаптер на УИ на системот"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Прелистувајте ги неодамнешните апликации нанапред"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Прелистувајте ги неодамнешните апликации наназад"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Отворете го списокот со апликации"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Прикажи „Лента со задачи“"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Отворете „Поставки“"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Отворете го „Помошникот“"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Заклучен екран"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Активирајте поделен екран со тековната апликација десно"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Активирајте поделен екран со тековната апликација лево"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Префрлете од поделен екран во цел екран"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Префрлете на апликацијата десно или долу при користењето поделен екран"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Префрлете на апликацијата лево или горе при користењето поделен екран"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"При поделен екран: префрлете ги аплик. од едната на другата страна"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Внесување"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Префрлете на следниот јазик"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камерата е блокирана"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камерата и микрофонот се блокирани"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофонот е блокиран"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Не вознемирувај"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Откриено е присуство на корисник"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Поставете стандардна апликација за белешки во „Поставки“"</string>
     <string name="install_app" msgid="5066668100199613936">"Инсталирајте ја апликацијата"</string>
diff --git a/packages/SystemUI/res/values-mk/tiles_states_strings.xml b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
index 4dd9e73..0d81120 100644
--- a/packages/SystemUI/res/values-mk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Исклучено"</item>
     <item msgid="5137565285664080143">"Вклучено"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 3637953..8ce3796 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"സ്ക്രീൻഷോട്ടുകൾ എടുക്കുന്നത് നിങ്ങളുടെ ഐടി അഡ്‌മിൻ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"എഡിറ്റ് ചെയ്യുക"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"സ്ക്രീൻഷോട്ട് എഡിറ്റ് ചെയ്യുക"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"പങ്കിടുക"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"സ്‌ക്രീൻഷോട്ട് പങ്കിടുക"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"കൂടുതൽ ക്യാപ്‌ചർ ചെയ്യുക"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"സ്ക്രീൻഷോട്ട് ഡിസ്‌മിസ് ചെയ്യുക"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"മുഖം സ്കാൻ ചെയ്യുന്നു"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"അയയ്ക്കുക"</string>
     <string name="cancel" msgid="1089011503403416730">"റദ്ദാക്കുക"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"ആപ്പ് ലോഗോ"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"സ്ഥിരീകരിക്കുക"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"വീണ്ടും ശ്രമിക്കുക"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"പരിശോധിച്ചുറപ്പിക്കൽ റദ്ദാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"മുഖം തിരിച്ചറിഞ്ഞു. തുടരാൻ അൺലോക്ക് ഐക്കൺ അമർത്തുക."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"പരിശോധിച്ചുറപ്പിച്ചു"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"പരിശോധിച്ചുറപ്പിക്കൽ റദ്ദാക്കുക"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"കൂടുതൽ ഓപ്‌ഷനുകൾ"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"പിൻ ഉപയോഗിക്കുക"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"പാറ്റേൺ ഉപയോഗിക്കുക"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"പാസ്‌വേഡ് ഉപയോഗിക്കുക"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"സ്‌റ്റാൻഡേർഡ്"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ഇടത്തരം"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"കൂടുതൽ"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"കേൾവിക്കുള്ള ഉപകരണങ്ങൾ"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ഉപകരണ മൈക്രോഫോൺ അൺബ്ലോക്ക് ചെയ്യണോ?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ഉപകരണ ക്യാമറ അൺബ്ലോക്ക് ചെയ്യണോ?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ഉപകരണ ക്യാമറയോ മൈക്രോഫോണോ അൺബ്ലോക്ക് ചെയ്യണോ?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"നീക്കം ചെയ്യുക"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"വിജറ്റ് ചേർക്കുക"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"പൂർത്തിയായി"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"വിജറ്റുകൾ ചേർക്കുക"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"ടാബ്‌ലെറ്റ് അൺലോക്ക് ചെയ്യാതെ തന്നെ നിങ്ങളുടെ പ്രിയപ്പെട്ട ആപ്പ് വിജറ്റുകളിലേക്ക് പെട്ടെന്ന് ആക്‌സസ് നേടുക."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ലോക്ക് സ്ക്രീനിൽ ഏതെങ്കിലും വിജറ്റ് അനുവദിക്കണോ?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"ക്രമീകരണം തുറക്കുക"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"വർക്ക് ആപ്പുകൾ പുനരാരംഭിക്കണോ?"</string>
@@ -538,7 +550,8 @@
     <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="1265107698772588299">"മോഷണ പരിരക്ഷ\nഉപകരണം ലോക്ക് ചെയ്തു, നിരവധി അൺലോക്ക് ശ്രമങ്ങൾ"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ഉപകരണം ലോക്ക് ചെയ്തു, നിരവധി തവണ പരിശോധിച്ചുറപ്പിക്കാൻ ശ്രമിച്ചു"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ഉപകരണം ലോക്ക് ചെയ്തു\nപരിശോധിച്ചുറപ്പിക്കൽ പരാജയപ്പെട്ടു"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ശബ്‌ദ ക്രമീകരണം"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"മീഡിയയ്ക്ക് സ്വയമേവ ക്യാപ്ഷൻ"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"മ്യൂട്ട് ചെയ്യുക"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"കാസ്റ്റ് ചെയ്യുക"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"റിംഗ് മ്യൂട്ട് ചെയ്തതിനാൽ ലഭ്യമല്ല"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"ശല്യപ്പെടുത്തരുത് ഓണായതിനാൽ ലഭ്യമല്ല"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"ശല്യപ്പെടുത്തരുത് ഓണായതിനാൽ ലഭ്യമല്ല"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. അൺമ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. വൈബ്രേറ്റിലേക്ക് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം."</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"വൈബ്രേറ്റ് ചെയ്യുക"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s ശബ്‌ദ നിയന്ത്രണങ്ങൾ"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"കോളുകളും അറിയിപ്പുകളും ലഭിക്കുമ്പോൾ റിംഗ് ചെയ്യും (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"ഔട്ട്പുട്ട് ക്രമീകരണം നൽകുക"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"വോളിയം സ്ലൈഡറുകൾ വികസിപ്പിച്ചു"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"വോളിയം സ്ലൈഡറുകൾ ചുരുക്കി"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s മ്യൂട്ട് ചെയ്യുക"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s അൺമ്യൂട്ട് ചെയ്യുക"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> എന്നതിൽ പ്ലേ ചെയ്യുന്നു"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"ഓഡിയോ പ്ലേ ചെയ്യും"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"സിസ്റ്റം UI ട്യൂണർ"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"സമീപകാലത്തെ ആപ്പുകളിലൂടെ പോകുക (മുന്നോട്ട്)"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"സമീപകാലത്തെ ആപ്പുകളിലൂടെ പോകുക (പിന്നോട്ട്)"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ആപ്പ് ലിസ്റ്റ് തുറക്കുക"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ടാസ്‌ക്ബാർ കാണിക്കുക"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"ക്രമീകരണം തുറക്കുക"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant തുറക്കുക"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"ലോക്ക് സ്‌ക്രീൻ"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"നിലവിലെ ആപ്പ് വലതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"നിലവിലെ ആപ്പ് ഇടതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"സ്‌ക്രീൻ വിഭജന മോഡിൽ നിന്ന് പൂർണ്ണ സ്ക്രീനിലേക്ക് മാറുക"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുമ്പോൾ വലതുവശത്തെ/താഴത്തെ ആപ്പിലേക്ക് മാറൂ"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുമ്പോൾ ഇടതുവശത്തെ/മുകളിലെ ആപ്പിലേക്ക് മാറൂ"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"സ്‌ക്രീൻ വിഭജന മോഡിൽ: ഒരു ആപ്പിൽ നിന്ന് മറ്റൊന്നിലേക്ക് മാറുക"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ഇൻപുട്ട്"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"അടുത്ത ഭാഷയിലേക്ക് മാറുക"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ക്യാമറ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ക്യാമറയും മൈക്രോഫോണും ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"മൈക്രോഫോൺ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"ശല്യപ്പെടുത്തരുത്"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"ഉപയോക്താവിന്റെ സാന്നിധ്യം കണ്ടെത്തി"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ക്രമീകരണത്തിൽ കുറിപ്പുകൾക്കുള്ള ഡിഫോൾട്ട് ആപ്പ് സജ്ജീകരിക്കുക"</string>
     <string name="install_app" msgid="5066668100199613936">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യൂ"</string>
diff --git a/packages/SystemUI/res/values-ml/tiles_states_strings.xml b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
index 18e7b29..609fdde 100644
--- a/packages/SystemUI/res/values-ml/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"ഓഫാണ്"</item>
     <item msgid="5137565285664080143">"ഓണാണ്"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"ലഭ്യമല്ല"</item>
+    <item msgid="3079622119444911877">"ഓഫാണ്"</item>
+    <item msgid="3028994095749238254">"ഓണാണ്"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 26c5027..1a2e4b1f 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Хуваалцах"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Дэлгэцийн агшныг хуваалцах"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Ихийг багтаасан зураг авах"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Дэлгэцийн агшныг хаах"</string>
@@ -115,7 +116,7 @@
     <string name="screenrecord_continue" msgid="4055347133700593164">"Эхлүүлэх"</string>
     <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Дэлгэцийг бичиж байна"</string>
     <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Дэлгэц болон аудиог бичиж байна"</string>
-    <string name="screenrecord_taps_label" msgid="1595690528298857649">"Дэлгэц дээр мэдрэгчийг харуулах"</string>
+    <string name="screenrecord_taps_label" msgid="1595690528298857649">"Дэлгэц дээр хүрэхийг харуулах"</string>
     <string name="screenrecord_stop_label" msgid="72699670052087989">"Зогсоох"</string>
     <string name="screenrecord_share_label" msgid="5025590804030086930">"Хуваалцах"</string>
     <string name="screenrecord_save_title" msgid="1886652605520893850">"Дэлгэцийн бичлэгийг хадгалсан"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Скан хийх нүүр царай"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Илгээх"</string>
     <string name="cancel" msgid="1089011503403416730">"Цуцлах"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Аппын лого"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Баталгаажуулах"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Дахин оролдох"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Нотолгоог цуцлахын тулд товшино уу"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Царайг таньсан. Үргэлжлүүлэх бол түгжээг тайлах дүрсийг дар."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Баталгаажуулагдсан"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Баталгаажуулалтыг цуцлах"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Бусад сонголт"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ПИН ашиглах"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Хээ ашиглах"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Нууц үг ашиглах"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандарт"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Дунд зэрэг"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Өндөр"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Төхөөрөмжийн микрофоныг блокоос гаргах уу?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Төхөөрөмжийн камерыг блокоос гаргах уу?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Төхөөрөмжийн камер болон микрофоныг блокоос гаргах уу?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Хасах"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Виджет нэмэх"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Болсон"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Виджетүүд нэмэх"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Таблетынхаа түгжээг тайлалгүйгээр дуртай аппынхаа виджетүүдэд шуурхай хандах эрх аваарай."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Түгжээтэй дэлгэц дээр дурын виджетийг зөвшөөрөх үү?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Тохиргоог нээх"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Ажлын аппыг үргэлжлүүлэх үү?"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"Хулгайн хамгаалалт\nТөхөөрөмж түгжигдсэн, түгжээг тайлах хэт олон оролдлого"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Төхөөрөмжийг түгжсэн. Хэт олон удаа баталгаажуулах оролдлого хийсэн"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Төхөөрөмжийг түгжсэн\nБаталгаажуулж чадсангүй"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Дууны тохиргоо"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Медиад автоматаар тайлбар нэмэх"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Хаах"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Дамжуулах"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Хонхны дууг хаасан тул боломжгүй"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Бүү саад бол асаалттай тул боломжгүй"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Бүү саад бол асаалттай тул боломжгүй"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Дууг нь нээхийн тулд товшино уу."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Чичиргээнд тохируулахын тулд товшино уу. Хүртээмжийн үйлчилгээний дууг хаасан."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Дууг нь хаахын тулд товшино уу. Хүртээмжийн үйлчилгээний дууг хаасан."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"чичрэх"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s түвшний хяналт"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Дуудлага болон мэдэгдлийн хонх дуугарна (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Оролтын тохиргоог оруулах"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Дууны түвшний гулсуулагчдыг дэлгэсэн"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Дууны түвшний гулсуулагчдыг хураасан"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s-н дууг хаах"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s-н дууг нээх"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> дээр тоглуулж байна"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудиог дараахад тоглуулна"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Системийн UI Тохируулагч"</string>
@@ -671,7 +678,7 @@
     <string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Төлөв:&lt;/b&gt; Доогуур зэрэглэл хийсэн"</string>
     <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"Харилцан ярианы дээд талд болон түгжигдсэн дэлгэц дээр профайл зураг байдлаар харуулна"</string>
     <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"Харилцан ярианы мэдэгдлийн дээд талд болон түгжигдсэн дэлгэц дээр профайл зураг байдлаар харуулах бөгөөд бөмбөлөг хэлбэрээр харагдана"</string>
-    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Харилцан ярианы мэдэгдлийн дээд талд болон түгжигдсэн дэлгэц дээр профайл зураг байдлаар харуулах бөгөөд Бүү саад бол горимыг тасалдуулна"</string>
+    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"Харилцан ярианы мэдэгдлийн дээд талд болон түгжээтэй дэлгэц дээр профайл зураг байдлаар харуулах бөгөөд Бүү саад бол горимыг тасалдуулна"</string>
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Харилцан ярианы мэдэгдлийн дээд талд болон түгжигдсэн дэлгэц дээр профайл зураг байдлаар харуулах бөгөөд бөмбөлөг хэлбэрээр харагдана. Бүү саад бол горимыг тасалдуулна"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Чухал"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> нь харилцан ярианы онцлогуудыг дэмждэггүй"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Саяхны аппуудаар урагш гүйлгэх"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Саяхны аппуудаар арагш гүйлгэх"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Аппуудын жагсаалтыг нээх"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Ажлын хэсгийг харуулах"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Тохиргоог нээх"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Туслахыг нээх"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Түгжээтэй дэлгэц"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Одоогийн аппаар баруун гар талд дэлгэц хуваахад орох"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Одоогийн аппаар зүүн гар талд дэлгэц хуваахад орох"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Дэлгэц хуваахаас бүтэн дэлгэц рүү сэлгэх"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Дэлгэц хуваахыг ашиглаж байхдаа баруун эсвэл доор байх апп руу сэлгэ"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Дэлгэц хуваахыг ашиглаж байхдаа зүүн эсвэл дээр байх апп руу сэлгэ"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Дэлгэц хуваах үеэр: аппыг нэгээс нөгөөгөөр солих"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Оролт"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Дараагийн хэл рүү сэлгэх"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камерыг блоклосон"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камер болон микрофоныг блоклосон"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофоныг блоклосон"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Бүү саад бол"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Хэрэглэгч байгааг илрүүлсэн"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Тохиргоонд тэмдэглэлийн өгөгдмөл апп тохируулна уу"</string>
     <string name="install_app" msgid="5066668100199613936">"Аппыг суулгах"</string>
diff --git a/packages/SystemUI/res/values-mn/tiles_states_strings.xml b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
index 95f835e..cfaf693 100644
--- a/packages/SystemUI/res/values-mn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Унтраалттай"</item>
     <item msgid="5137565285664080143">"Асаалттай"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 11f42af..2e21fd0 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"तुमच्या आयटी ॲडमिनने स्क्रीनशॉट घेणे ब्लॉक केले आहे"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"संपादित करा"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रीनशॉट संपादित करा"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"शेअर करा"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"स्क्रीनशॉट शेअर करा"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"आणखी गोष्टी कॅप्चर करा"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट डिसमिस करा"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"चेहरा स्कॅन करत आहे"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"पाठवा"</string>
     <string name="cancel" msgid="1089011503403416730">"रद्द करा"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"अ‍ॅप लोगो"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"कन्फर्म करा"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"पुन्हा प्रयत्न करा"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ऑथेंटिकेशन रद्द करण्यासाठी टॅप करा"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"चेहरा ओळखला आहे. पुढे सुरू ठेवण्यासाठी अनलॉक करा आयकन प्रेस करा."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ऑथेंटिकेशन केलेले"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ऑथेंटिकेशन रद्द करा"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"अधिक पर्याय"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"पिन वापरा"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"पॅटर्न वापरा"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"पासवर्ड वापरा"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"साधारण"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"मध्यम"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"उच्च"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"डिव्हाइसचा मायक्रोफोन अनब्लॉक करायचा आहे का?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"डिव्हाइसचा कॅमेरा अनब्लॉक करायचा आहे का?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"डिव्हाइसचा कॅमेरा आणि मायक्रोफोन अनब्लॉक करायचा आहे का?"</string>
@@ -437,10 +448,10 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"काढून टाका"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"विजेट जोडा"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"पूर्ण झाले"</string>
-    <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) -->
-    <skip />
-    <!-- no translation found for button_text_to_open_settings (1987729256950941628) -->
-    <skip />
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"विजेट जोडा"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"तुमचा टॅबलेट अनलॉक न करता तुमच्या आवडत्या ॲपची विजेट झटपट अ‍ॅक्सेस करा."</string>
+    <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"लॉक स्क्रीनवर कोणत्याही विजेटला अनुमती द्यायची आहे का?"</string>
+    <string name="button_text_to_open_settings" msgid="1987729256950941628">"सेटिंग्ज उघडा"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"वर्क ॲप्स पुन्हा सुरू करायची?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"पुन्हा सुरू करा"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"वापरकर्ता स्विच करा"</string>
@@ -540,7 +551,8 @@
     <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="1265107698772588299">"चोरीपासून संरक्षण\nडिव्हाइस लॉक केले, अनलॉक करायचे खूप प्रयत्न"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"डिव्हाइस लॉक केले होते, ऑथेंटिकेशनचे खूप वेळा प्रयत्न केले गेले"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"डिव्हाइस लॉक केले आहे\nऑथेंटिकेशन यशस्वी झाले नाही"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"आवाज सेटिंग्ज"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"मीडियाला आपोआप सबटायटल द्या"</string>
@@ -585,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"म्यूट करा"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"कास्ट करा"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"रिंग म्यूट केल्यामुळे उपलब्ध नाही"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"व्यत्यय आणू नका हे सुरू असल्यामुळे उपलब्ध नाही"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"व्यत्यय आणू नका हे सुरू असल्यामुळे उपलब्ध नाही"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. अनम्यूट करण्यासाठी टॅप करा."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. व्हायब्रेट सेट करण्यासाठी टॅप करा. प्रवेशयोग्यता सेवा म्यूट केल्या जाऊ शकतात."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. म्यूट करण्यासाठी टॅप करा. प्रवेशक्षमता सेवा म्यूट केल्या जाऊ शकतात."</string>
@@ -605,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"व्हायब्रेट करा"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s व्हॉल्यूम नियंत्रण"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"कॉल आणि सूचना वाजतील (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"आउटपुट सेटिंग्ज एंटर करा"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"व्हॉल्यूम स्लायडर विस्तारित केले आहेत"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"व्हॉल्यूम स्लायडर कोलॅप्स केले आहेत"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s म्यूट करा"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s अनम्यूट करा"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> वर प्ले करत आहे"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"यावर ऑडिओ प्ले होईल"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"सिस्टम UI ट्युनर"</string>
@@ -673,7 +678,7 @@
     <string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;स्थिती&lt;/b&gt; ला थोडी कमी म्हणून रँक केले गेले"</string>
     <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"संभाषण सूचनांच्या वरती आणि लॉक स्क्रीनवरील प्रोफाइल फोटो म्हणून दिसते"</string>
     <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"संभाषण सूचनांच्या वरती आणि लॉक स्क्रीनवरील प्रोफाइल फोटो म्हणून दिसते, बबल म्हणून दिसते"</string>
-    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"संभाषण सूचनांच्या वरती आणि लॉक स्क्रीनवरील प्रोफाइल फोटो म्हणून दिसते, व्यत्यय आणू नका यामध्ये अडथळा आणते"</string>
+    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"संभाषण नोटिफिकेशनच्या वरती आणि लॉक स्क्रीनवरील प्रोफाइल फोटो म्हणून दिसते, व्यत्यय आणू नका यामध्ये अडथळा आणते"</string>
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"संभाषण सूचनांच्या वरती आणि लॉक स्क्रीनवरील प्रोफाइल फोटो म्हणून दिसते, बबल म्हणून दिसते, व्यत्यय आणू नका यामध्ये अडथळा आणते"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"प्राधान्य"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे संभाषण वैशिष्ट्यांना सपोर्ट करत नाही"</string>
@@ -761,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"अलीकडील ॲप्सवरून पुढे जा"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"अलीकडील ॲप्सवरून मागे जा"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ॲप्सची सूची उघडा"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"टास्कबार दाखवा"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"सेटिंग्ज उघडा"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant उघडा"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"लॉक स्क्रीन"</string>
@@ -770,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"उजव्या बाजूला सध्याचे अ‍ॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"डाव्या बाजूला सध्याचे अ‍ॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीनवरून फुल स्क्रीनवर स्विच करा"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"स्प्लिट स्क्रीन वापरताना उजवीकडील किंवा खालील अ‍ॅपवर स्विच करा"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"स्प्लिट स्क्रीन वापरताना डावीकडील किंवा वरील अ‍ॅपवर स्विच करा"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रीनदरम्यान: एक अ‍ॅप दुसऱ्या अ‍ॅपने बदला"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"पुढील भाषेवर स्विच करा"</string>
@@ -944,7 +950,7 @@
     <string name="privacy_type_media_projection" msgid="8136723828804251547">"स्क्रीन रेकॉर्डिंग"</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_dialog_title" msgid="6273107303850248375">"फॉंटचा आकार"</string>
     <string name="font_scaling_smaller" msgid="1012032217622008232">"आणखी लहान करा"</string>
     <string name="font_scaling_larger" msgid="5476242157436806760">"आणखी मोठे करा"</string>
     <string name="magnification_window_title" msgid="4863914360847258333">"मॅग्निफिकेशन विंडो"</string>
@@ -1268,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"कॅमेरा ब्लॉक केला"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"कॅमेरा आणि मायक्रोफोन ब्लॉक केले आहेत"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"मायक्रोफोन ब्लॉक केला"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"व्यत्यय आणू नका"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"वापरकर्त्याची उपस्थिती डिटेक्ट केली"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिंग्ज मध्ये डीफॉल्ट टिपा अ‍ॅप सेट करा"</string>
     <string name="install_app" msgid="5066668100199613936">"अ‍ॅप इंस्टॉल करा"</string>
diff --git a/packages/SystemUI/res/values-mr/tiles_states_strings.xml b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
index 6902a2f..abb7ace 100644
--- a/packages/SystemUI/res/values-mr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"बंद आहे"</item>
     <item msgid="5137565285664080143">"सुरू आहे"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index e7e3057..9ae774f 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Pengambilan tangkapan skrin disekat oleh pentadbir IT anda"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Edit tangkapan skrin"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Kongsi"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Kongsi tangkapan skrin"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Tangkap imej lagi"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ketepikan tangkapan skrin"</string>
@@ -104,8 +105,8 @@
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Memproses rakaman skrin"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pemberitahuan breterusan untuk sesi rakaman skrin"</string>
     <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Mulakan Rakaman?"</string>
-    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Apabila anda membuat rakaman, Android boleh mengakses apa-apa sahaja yang boleh dilihat pada skrin anda atau dimainkan pada peranti anda. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Semasa anda merakam apl, Android boleh mengakses apa-apa sahaja yang ditunjukan atau dimainkan pada apl itu. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
+    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Apabila anda merakam, Android boleh mengakses apa-apa sahaja yang kelihatan pada skrin anda atau dimainkan pada peranti anda. Oleh hal yang demikian, berhati-hati apabila memasukkan kata laluan, butiran pembayaran, mesej, foto, audio dan video."</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Semasa anda merakam apl, Android boleh mengakses apa-apa sahaja yang ditunjukkan atau dimainkan pada apl itu. Oleh hal yang demikian, berhati-hati ketika memasukkan kata laluan, butiran pembayaran, mesej, foto, audio dan video."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Mulakan rakaman"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Rakam audio"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Audio peranti"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Mengimbas wajah"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Hantar"</string>
     <string name="cancel" msgid="1089011503403416730">"Batal"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo apl"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Sahkan"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Cuba lagi"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Ketik untuk membatalkan pengesahan"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Wajah dicam. Tekan ikon buka kunci untuk meneruskan."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Disahkan"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Batalkan Pengesahan"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Lagi Pilihan"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gunakan PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gunakan corak"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gunakan kata laluan"</string>
@@ -326,7 +329,7 @@
     <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Apl kerja"</string>
     <string name="quick_settings_work_mode_paused_state" msgid="6681788236383735976">"Dijeda"</string>
     <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Cahaya Malam"</string>
-    <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Dihidupkan pd senja"</string>
+    <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Hidup waktu senja"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Hingga matahari terbit"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Dihidupkan pada <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Hingga <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Sederhana"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Tinggi"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Peranti pendengaran"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Nyahsekat mikrofon peranti?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Nyahsekat kamera peranti?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Nyahsekat kamera dan mikrofon peranti?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Alih keluar"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Tambahkan widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Selesai"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Tambahkan widget"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Dapatkan akses pantas kepada widget apl kegemaran anda tanpa membuka kunci tablet anda."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Benarkan sebarang widget pada skrin kunci?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Buka tetapan"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Nyahjeda apl kerja?"</string>
@@ -469,8 +481,8 @@
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Mula"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> telah melumpuhkan pilihan ini"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Mulakan penghantaran?"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Apabila anda membuat penghantaran, Android boleh mengakses apa-apa sahaja yang boleh dilihat pada skrin anda atau dimainkan pada peranti anda. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Apabila anda menghantar apl, Android boleh mengakses apa-apa sahaja yang ditunjukan atau dimainkan pada apl itu. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Apabila anda membuat penghantaran, Android boleh mengakses apa-apa sahaja yang kelihatan pada skrin atau dimainkan pada peranti anda. Oleh hal yang demikian, berhati-hati apabila memasukkan kata laluan, butiran pembayaran, mesej, foto, audio dan video."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Apabila anda menghantar apl, Android boleh mengakses apa-apa sahaja yang ditunjukkan atau dimainkan pada apl itu. Oleh hal yang demikian, berhati-hati apabila memasukkan kata laluan, butiran pembayaran, mesej, foto, audio dan video."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Mulakan penghantaran"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Mulakan perkongsian?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Apabila anda membuat perkongsian, rakaman atau penghantaran, Android boleh mengakses apa-apa sahaja yang boleh dilihat pada skrin anda atau dimainkan pada peranti anda. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Peranti ini diurus oleh ibu bapa anda. Ibu bapa anda dapat melihat dan mengurus maklumat seperti apl yang anda gunakan, lokasi dan masa skrin anda."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Dibiarkan tidak berkunci oleh TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Perlindungan kecurian\nDikunci, banyak percubaan membuka kunci"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Peranti telah dikunci, terlalu banyak percubaan pengesahan"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Peranti dikunci\nPengesahan gagal"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Tetapan bunyi"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Sari kata media automatik"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Redam"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Hantar"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Tidak tersedia kerana deringan diredam"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Tidak tersedia kerana Jangan Ganggu dihidupkan"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Tidak tersedia kerana Jangan Ganggu dihidupkan"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Ketik untuk menyahredam."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Ketik untuk menetapkan pada getar. Perkhidmatan kebolehaksesan mungkin diredamkan."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Ketik untuk meredam. Perkhidmatan kebolehaksesan mungkin diredamkan."</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"getar"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s kawalan kelantangan"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Panggilan dan pemberitahuan akan berdering (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Masukkan tetapan output"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Peluncur kelantangan dikembangkan"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Peluncur kelantangan dikuncupkan"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"redamkan %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"nyahredamkan %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Memainkan <xliff:g id="LABEL">%s</xliff:g> pada"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio dimainkan pada"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Penala UI Sistem"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Kitar ke hadapan menerusi apl terbaharu"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Kitar ke belakang menerusi apl terbaharu"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Buka senarai apl"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Tunjukkan bar tugas"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Buka tetapan"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Buka Assistant"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Kunci skrin"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Masuk skrin pisah dengan apl semasa pada sisi kanan"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Masuk skrin pisah dengan apl semasa pada sisi kiri"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Beralih daripada skrin pisah kepada skrin penuh"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Tukar kepada apl di sebelah kanan/bawah semasa menggunakan skrin pisah"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Tukar kepada apl di sebelah kiri/atas semasa menggunakan skrin pisah"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Semasa skrin pisah: gantikan apl daripada satu apl kepada apl lain"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Beralih kepada bahasa seterusnya"</string>
@@ -1239,7 +1246,7 @@
     <string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Sekurang-kurangnya satu peranti atau panel peranti tersedia"</string>
     <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Pilih apl nota lalai untuk menggunakan pintasan pengambilan nota"</string>
     <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Pilih apl"</string>
-    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pintasan sentuh &amp; tahan"</string>
+    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Sentuh &amp; tahan pintasan"</string>
     <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Batal"</string>
     <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Tukar skrin sekarang"</string>
     <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Buka telefon"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera disekat"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dan mikrofon disekat"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon disekat"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Jangan ganggu"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Kehadiran pengguna dikesan"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Tetapkan apl nota lalai dalam Tetapan"</string>
     <string name="install_app" msgid="5066668100199613936">"Pasang apl"</string>
diff --git a/packages/SystemUI/res/values-ms/tiles_states_strings.xml b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
index a280916..174e416e 100644
--- a/packages/SystemUI/res/values-ms/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Mati"</item>
     <item msgid="5137565285664080143">"Hidup"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Tidak tersedia"</item>
+    <item msgid="3079622119444911877">"Mati"</item>
+    <item msgid="3028994095749238254">"Hidup"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 109d674..1249885 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"မျှဝေရန်"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"ဖန်သားပြင်ဓာတ်ပုံကို မျှဝေနိုင်သည်"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"နောက်ထပ် ရိုက်ကူးရန်"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ဖန်သားပြင်ဓာတ်ပုံကို ပယ်သည်"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"မျက်နှာ စကင်ဖတ်နေသည်"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ပို့ရန်"</string>
     <string name="cancel" msgid="1089011503403416730">"မလုပ်တော့"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"အက်ပ်လိုဂို"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"အတည်ပြုရန်"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ထပ်စမ်းကြည့်ရန်"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"အထောက်အထားစိစစ်ခြင်းကို ပယ်ဖျက်ရန် တို့ပါ"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"မျက်နှာ မှတ်မိသည်။ ရှေ့ဆက်ရန် လော့ခ်ဖွင့်သင်္ကေတကို နှိပ်ပါ။"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"အထောက်အထားစိစစ်ပြီးပြီ"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"အထောက်အထားစိစစ်ခြင်းကို ပယ်ဖျက်ရန်"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"နောက်ထပ်ရွေးစရာများ"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ပင်နံပါတ်သုံးရန်"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ပုံစံကို သုံးရန်"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"စကားဝှက် သုံးရန်"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ပုံမှန်"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"အသင့်အတင့်"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"များ"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"နားကြားကိရိယာ"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"စက်၏မိုက်ခရိုဖုန်းကို ပြန်ဖွင့်မလား။"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"စက်၏ကင်မရာကို ပြန်ဖွင့်မလား။"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"စက်၏ကင်မရာနှင့် မိုက်ခရိုဖုန်းကို ပြန်ဖွင့်မလား။"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"ဖယ်ရှားရန်"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ဝိဂျက်ထည့်ရန်"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ပြီးပြီ"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"ဝိဂျက်များ ထည့်ရန်"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"တက်ဘလက်မဖွင့်ဘဲ သင့်အကြိုက်ဆုံး အက်ပ်ဝိဂျက်များကို အမြန်သုံးခွင့် ရယူပါ။"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"လော့ခ်မျက်နှာပြင်ရှိ ဝိဂျက်အားလုံးကို ခွင့်ပြုမလား။"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"ဆက်တင်များ ဖွင့်ရန်"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"အလုပ်သုံးအက်ပ် ပြန်ဖွင့်မလား။"</string>
@@ -538,7 +550,8 @@
     <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="1265107698772588299">"သူခိုးကာကွယ်ရေး\nစက်လော့ခ်ကျ၊ အကြိမ်များစွာဖွင့်ရန်ကြိုးစားထား"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"စက်လော့ခ်ကျနေသည်၊ အထောက်အထားစိစစ်ရန် ကြိုးပမ်းမှုအကြိမ်ရေ များလွန်းသည်"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"စက်လော့ခ်ကျနေသည်\nအထောက်အထားစိစစ်၍ မရပါ"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>။ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"အသံဆက်တင်များ"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"အလိုအလျောက် စာတန်းထိုးရန်"</string>
@@ -571,7 +584,7 @@
     <string name="screen_pinning_exit" msgid="4553787518387346893">"အက်ပ်ကို ပင်ဖြုတ်လိုက်သည်"</string>
     <string name="stream_voice_call" msgid="7468348170702375660">"ဖုန်းခေါ်ရန်"</string>
     <string name="stream_system" msgid="7663148785370565134">"စနစ်"</string>
-    <string name="stream_ring" msgid="7550670036738697526">"အသံမြည်စေသည်"</string>
+    <string name="stream_ring" msgid="7550670036738697526">"ဖုန်းမြည်သံ"</string>
     <string name="stream_music" msgid="2188224742361847580">"မီဒီယာ"</string>
     <string name="stream_alarm" msgid="16058075093011694">"နှိုးစက်"</string>
     <string name="stream_notification" msgid="7930294049046243939">"အကြောင်းကြားချက်"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"အသံတိတ်သည်"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"ကာစ်လုပ်ရန်"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"ဖုန်းမြည်သံပိတ်ထားသဖြင့် မရနိုင်ပါ"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"‘မနှောင့်ယှက်ရ’ ဖွင့်ထားသောကြောင့် မရနိုင်ပါ"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"‘မနှောင့်ယှက်ရ’ ဖွင့်ထားသောကြောင့် မရနိုင်ပါ"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s။ အသံပြန်ဖွင့်ရန် တို့ပါ။"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s။ တုန်ခါမှုကို သတ်မှတ်ရန် တို့ပါ။ အများသုံးနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s။ အသံပိတ်ရန် တို့ပါ။ အများသုံးနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string>
@@ -595,26 +606,21 @@
     <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ဆူညံသံ ထိန်းချုပ်ရန်"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"ထောင့်စုံအော်ဒီယို"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ပိတ်"</string>
-    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ဖွင့်ပြီးပြီ"</string>
-    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ဦးခေါင်းလှုပ်ရှားမှု စောင့်ကြည့်ခြင်း"</string>
+    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ပုံသေ"</string>
+    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ခေါင်းလှုပ်ရှားမှု စောင့်ကြည့်ခြင်း"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"ဖုန်းခေါ်သံမုဒ်သို့ ပြောင်းရန် တို့ပါ"</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"အသံပိတ်ရန်"</string>
     <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"အသံဖွင့်ရန်"</string>
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"တုန်ခါမှု"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s အသံအတိုးအလျှော့ ခလုတ်များ"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ခေါ်ဆိုမှုများနှင့် အကြောင်းကြားချက်များအတွက် အသံမြည်နှုန်း (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>) ဖြစ်သည်"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"အထွက် ဆက်တင်များ ထည့်ရန်"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"အသံအတိုးအကျယ် ရွှေ့တုံးများ ပိုပြထားသည်"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"အသံအတိုးအကျယ် ရွှေ့တုံးများ လျှော့ပြထားသည်"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s အသံပိတ်ရန်"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s အသံပြန်ဖွင့်ရန်"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> ကို ဖွင့်နေသည်"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"အောက်တွင်အသံဖွင့်မည်"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"အသံဖွင့်မည့်နေရာ"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"စနစ် UI ဖမ်းစက်"</string>
     <string name="status_bar" msgid="4357390266055077437">"အခြေအနေပြနေရာ"</string>
     <string name="demo_mode" msgid="263484519766901593">"စနစ် UI စရုပ်ပြမုဒ်"</string>
@@ -671,7 +677,7 @@
     <string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;အခြေအနေ-&lt;/b&gt; အဆင့်လျှော့ထားသည်"</string>
     <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"စကားဝိုင်း အကြောင်းကြားချက်များ၏ ထိပ်ပိုင်းတွင် ပြ၍ လော့ခ်မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံအဖြစ် ပြသည်"</string>
     <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"စကားဝိုင်း အကြောင်းကြားချက်များ၏ ထိပ်ပိုင်းတွင် ပြ၍ လော့ခ်မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံအဖြစ် ပြကာ ပူဖောင်းကွက်အဖြစ် မြင်ရသည်"</string>
-    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"စကားဝိုင်း အကြောင်းကြားချက်များ၏ ထိပ်ပိုင်းနှင့် ပရိုဖိုင်ပုံအဖြစ် လော့ခ်မျက်နှာပြင်တွင် ပြသည်။ ပူဖောင်းကွက်အဖြစ် မြင်ရပြီး ‘မနှောင့်ယှက်ရ’ ကို ကြားဖြတ်သည်"</string>
+    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"စကားဝိုင်း အကြောင်းကြားချက်များ၏ ထိပ်ပိုင်းတွင်နှင့် လော့ခ်မျက်နှာပြင်တွင် ပရိုဖိုင်ပုံအဖြစ်  ပြသည်။ ‘မနှောင့်ယှက်ရ’ ကို ကြားဖြတ်သည်"</string>
     <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"စကားဝိုင်း အကြောင်းကြားချက်များ၏ ထိပ်ပိုင်းနှင့် ပရိုဖိုင်ပုံအဖြစ် လော့ခ်မျက်နှာပြင်တွင် ပြသည်။ ပူဖောင်းကွက်အဖြစ် မြင်ရပြီး ‘မနှောင့်ယှက်ရ’ ကို ကြားဖြတ်သည်"</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"ဦးစားပေး"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> က စကားဝိုင်းဝန်ဆောင်မှုများကို မပံ့ပိုးပါ"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"မကြာသေးမီက အက်ပ်များကို အဝိုင်းပုံရှေ့သို့လှည့်ရန်"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"မကြာသေးမီက အက်ပ်များကို အဝိုင်းပုံနောက်ပြန်လှည့်ရန်"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"အက်ပ်ပြသမှု ဖွင့်ရန်"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Taskbar ပြပါ"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"ဆက်တင်များ ဖွင့်ရန်"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ဖွင့်ရန်"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"လော့ခ်မျက်နှာပြင်"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"လက်ရှိအက်ပ်ကို မျက်နှာပြင် ခွဲ၍ပြသမှု၏ ညာဘက်တွင်ထည့်ရန်"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"လက်ရှိအက်ပ်ကို မျက်နှာပြင် ခွဲ၍ပြသမှု၏ ဘယ်ဘက်တွင်ထည့်ရန်"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"မျက်နှာပြင် ခွဲ၍ပြသမှုမှ မျက်နှာပြင်အပြည့်သို့ ပြောင်းရန်"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"မျက်နှာပြင်ခွဲ၍ပြသခြင်း သုံးစဉ် ညာ (သို့) အောက်ရှိအက်ပ်သို့ ပြောင်းရန်"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းသုံးစဉ် ဘယ် (သို့) အထက်ရှိအက်ပ်သို့ ပြောင်းရန်"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"မျက်နှာပြင် ခွဲ၍ပြသစဉ်- အက်ပ်တစ်ခုကို နောက်တစ်ခုနှင့် အစားထိုးရန်"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"စာရိုက်ခြင်း"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"နောက်ဘာသာစကားသို့ ပြောင်းရန်"</string>
@@ -1112,7 +1119,7 @@
     <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"သိမ်း၍မရပါ။"</string>
     <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"အနည်းဆုံး အက္ခရာ ၄ လုံး သုံးရန်"</string>
     <string name="media_output_broadcast_edit_hint_no_more_than_max" msgid="3923625800037673922">"အက္ခရာ <xliff:g id="LENGTH">%1$d</xliff:g> လုံးအောက် သုံးရန်"</string>
-    <string name="build_number_clip_data_label" msgid="3623176728412560914">"တည်ဆောက်မှုနံပါတ်"</string>
+    <string name="build_number_clip_data_label" msgid="3623176728412560914">"တည်ဆောက်ပုံအမှတ်"</string>
     <string name="build_number_copy_toast" msgid="877720921605503046">"တည်ဆောက်မှုနံပါတ်ကို ကလစ်ဘုတ်သို့ မိတ္တူကူးပြီးပါပြီ။"</string>
     <string name="basic_status" msgid="2315371112182658176">"စကားဝိုင်းကို ဖွင့်ရန်"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"စကားဝိုင်း ဝိဂျက်များ"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ကင်မရာကို ပိတ်ထားသည်"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ကင်မရာနှင့် မိုက်ခရိုဖုန်းကို ပိတ်ထားသည်"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"မိုက်ခရိုဖုန်းကို ပိတ်ထားသည်"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"မနှောင့်ယှက်ရ"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"အသုံးပြုသူရှိကြောင်း တွေ့ရသည်"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ဆက်တင်များတွင် မူရင်းမှတ်စုများအက်ပ် သတ်မှတ်ပါ"</string>
     <string name="install_app" msgid="5066668100199613936">"အက်ပ် ထည့်သွင်းရန်"</string>
diff --git a/packages/SystemUI/res/values-my/tiles_states_strings.xml b/packages/SystemUI/res/values-my/tiles_states_strings.xml
index ce10c42..f665a00a 100644
--- a/packages/SystemUI/res/values-my/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-my/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"ပိတ်"</item>
     <item msgid="5137565285664080143">"ဖွင့်"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"မရနိုင်ပါ"</item>
+    <item msgid="3079622119444911877">"ပိတ်"</item>
+    <item msgid="3028994095749238254">"ဖွင့်"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 57b40b9..0f9bb46 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Funksjonen for å ta skjermdumper er blokkert av IT-administratoren din"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Rediger"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Rediger skjermdumpen"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Del"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Del skjermdumpen"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Utvidet skjermdump"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Avvis skjermdumpen"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Skanning av ansikt"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
     <string name="cancel" msgid="1089011503403416730">"Avbryt"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Applogo"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bekreft"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Prøv på nytt"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Trykk for å avbryte autentiseringen"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansiktet er gjenkjent. Trykk på lås opp-ikon for å fortsette"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentisert"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Avbryt autentisering"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Flere alternativer"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Bruk PIN-kode"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Bruk mønster"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Bruk passord"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Middels"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Høy"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vil du oppheve blokkeringen av enhetsmikrofonen?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vil du oppheve blokkeringen av enhetskameraet?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vil du oppheve blokkeringen av enhetskameraet og -mikrofonen?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Fjern"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Legg til modul"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Ferdig"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Legg til moduler"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Få rask tilgang til appmoduler uten å låse opp nettbrettet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vil du tillate alle moduler på låseskjermen?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Åpne innstillingene"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Vil du slå på jobbapper igjen?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Denne enheten administreres av forelderen din. Forelderen din kan se og administrere informasjon, for eksempel appene du bruker, posisjonen din og skjermtiden din."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Holdes opplåst med TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Tyveribeskyttelse\nEnheten er låst – mange opplåsingsforsøk"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Enheten var låst – for mange autentiseringsforsøk"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Enheten er låst\nKunne ikke autentisere"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Lydinnstillinger"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatisk medieteksting"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Ignorer"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Utilgjengelig fordi ringelyden er kuttet"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Utilgjengelig fordi «Ikke forstyrr» er på"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Utilgjengelig fordi «Ikke forstyrr» er på"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Trykk for å slå på lyden."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Trykk for å angi vibrasjon. Lyden kan bli slått av for tilgjengelighetstjenestene."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Trykk for å slå av lyden. Lyden kan bli slått av for tilgjengelighetstjenestene."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrer"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s volumkontroller"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Anrop og varsler ringer (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Angi utdatainnstillinger"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Glidebrytere for volum er skjult"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Glidebrytere for volum er skjult"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"kutt lyden til %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"slå på lyden til %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Spiller av <xliff:g id="LABEL">%s</xliff:g> på"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Lyden spilles av på"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Gå forover gjennom nylige apper"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Gå bakover gjennom nylige apper"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Åpne applisten"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Vis oppgavelinje"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Åpne innstillingene"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Åpne assistenten"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Låseskjerm"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Åpne delt skjerm med den aktive appen til høyre"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Åpne delt skjerm med den aktive appen til venstre"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bytt fra delt skjerm til fullskjerm"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Bytt til appen til høyre eller under mens du bruker delt skjerm"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Bytt til appen til venstre eller over mens du bruker delt skjerm"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"I delt skjerm: Bytt ut en app"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Skrivespråk"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Bytt til neste språk"</string>
@@ -858,7 +866,7 @@
     <string name="data_connection_no_internet" msgid="691058178914184544">"Ingen internettilkobling"</string>
     <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Åpne <xliff:g id="ID_1">%s</xliff:g>-innstillingene."</string>
     <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Endre rekkefølgen på innstillingene."</string>
-    <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Av/på-meny"</string>
+    <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"På/av-meny"</string>
     <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Side <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g>"</string>
     <string name="tuner_lock_screen" msgid="2267383813241144544">"Låseskjerm"</string>
     <string name="finder_active" msgid="7907846989716941952">"Du kan finne denne telefonen med Finn enheten min, selv når den er slått av"</string>
@@ -1239,7 +1247,7 @@
     <string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Minst én enhet eller ett enhetspanel er tilgjengelig"</string>
     <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Velg en standard notatapp du vil bruke med notatsnarveien"</string>
     <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Velg app"</string>
-    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Trykk på og hold inne snarveien"</string>
+    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Trykk på snarveien og hold den inne"</string>
     <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Avbryt"</string>
     <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Bytt skjerm nå"</string>
     <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Åpne telefonen"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kameraet er blokkert"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameraet og mikrofonen er blokkert"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen er blokkert"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Ikke forstyrr"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Det er registrert at brukeren er til stede"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Du kan velge en standardapp for notater i Innstillinger"</string>
     <string name="install_app" msgid="5066668100199613936">"Installer appen"</string>
diff --git a/packages/SystemUI/res/values-nb/tiles_states_strings.xml b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
index 71160d0..af00423 100644
--- a/packages/SystemUI/res/values-nb/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Av"</item>
     <item msgid="5137565285664080143">"På"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index b682e44..5f51a91 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"सेयर गर्नुहोस्"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"स्क्रिनसट सेयर गर्नुहोस्"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"अन्य कुराहरू खिच्नुहोस्"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रिनसट हटाउनुहोस्"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"अनुहार स्क्यान गर्दै"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"पठाउनुहोस्"</string>
     <string name="cancel" msgid="1089011503403416730">"रद्द गर्नुहोस्"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"एपको लोगो"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"पुष्टि गर्नुहोस्"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"फेरि प्रयास गर्नुहोस्"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"प्रमाणीकरण रद्द गर्न ट्याप गर्नुहोस्"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"अनुहार पहिचान गरियो। जारी राख्न अनलक आइकनमा थिच्नुहोस्।"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"प्रमाणीकरण गरियो"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"प्रमाणीकरण रद्द गर्नुहोस्"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"थप विकल्पहरू"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN प्रयोग गर्नुहोस्"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ढाँचा प्रयोग गर्नुहोस्"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"पासवर्ड प्रयोग गर्नुहोस्"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"डिफल्ट"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"मध्यम"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"उच्च"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"डिभाइसको माइक्रोफोन अनब्लक गर्ने हो?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"डिभाइसको क्यामेरा अनब्लक गर्ने हो?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"डिभाइसको क्यामेरा र माइक्रोफोन अनब्लक गर्ने हो?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"हटाउनुहोस्"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"विजेट हाल्नुहोस्"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"पूरा भयो"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"विजेट हाल्नुहोस्"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"ट्याब्लेट अनलक नगरिकनै आफूलाई मन पर्ने एपका विजेटहरू तुरुन्तै एक्सेस गर्नुहोस्।"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"लक स्क्रिनमा कुनै विजेट देखाउने हो?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"सेटिङ खोल्नुहोस्"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"कामसम्बन्धी एपहरू अनपज गर्ने हो?"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"चोरीबाट सुरक्षा\nडिभाइस लक गरिएको छ, अत्यधिक धेरै पटक अनलक गर्ने प्रयास गरिएको छ"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"डिभाइस लक गरिएको छ, प्रमाणीकरण गर्ने निकै धेरै प्रयास गरिएका छन्"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"डिभाइस लक गरिएको छ\nप्रमाणीकरण गर्न सकिएन"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ध्वनिसम्बन्धी सेटिङहरू"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"मिडियाको स्वत: क्याप्सन बनाउनुहोस्"</string>
@@ -583,16 +597,14 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"म्युट गर्नुहोस्"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"कास्ट गर्नुहोस्"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"डिभाइस म्युट गरिएकाले यो सुविधा उपलब्ध छैन"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Do Not Disturb अन भएकाले भोल्युम बढाउन मिल्दैन"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Do Not Disturb अन भएकाले भोल्युम बढाउन मिल्दैन"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s। अनम्यूट गर्नाका लागि ट्याप गर्नुहोस्।"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s। कम्पनमा सेट गर्नाका लागि ट्याप गर्नुहोस्। पहुँच सम्बन्धी सेवाहरू म्यूट हुन सक्छन्।"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s। म्यूट गर्नाका लागि ट्याप गर्नुहोस्। पहुँच सम्बन्धी सेवाहरू म्यूट हुन सक्छन्।"</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s। कम्पन मोडमा सेट गर्न ट्याप गर्नुहोस्।"</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s। म्यूट गर्न ट्याप गर्नुहोस्।"</string>
-    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"नोइज कन्ट्रोल"</string>
+    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"न्वाइज कन्ट्रोल"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"स्पेसियल अडियो"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"अफ छ"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"निश्चित"</string>
@@ -603,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"कम्पन गर्नुहोस्"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s भोल्युमका नियन्त्रणहरू"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"कल तथा सूचनाहरू आउँदा घन्टी बज्ने छ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"आउटपुटसम्बन्धी सेटिङमा जानुहोस्"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"भोल्युम स्लाइडरहरू एक्स्पान्ड गरिएका छन्"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"भोल्युम स्लाइडरहरू कोल्याप्स गरिएका छन्"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s म्युट गर्नुहोस्"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s अनम्युट गर्नुहोस्"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> प्ले गरिँदै छ"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"अडियो प्ले भइरहने छ"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"अडियो यसमा प्ले हुने छ"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"सिस्टम UI ट्युनर"</string>
     <string name="status_bar" msgid="4357390266055077437">"स्थिति पट्टी"</string>
     <string name="demo_mode" msgid="263484519766901593">"सिस्टम UI को डेमो मोड"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"हालसालै चलाइएका एपहरू अगाडिबाट हेर्दै जानुहोस्"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"हालसालै चलाइएका एपहरू पछाडिबाट हेर्दै जानुहोस्"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"एपहरूको सूची खोल्नुहोस्"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"टास्कबार देखाइयोस्"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"सेटिङ खोल्नुहोस्"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"एसिस्टेन्ट खोल्नुहोस्"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"स्क्रिन लक गर्नुहोस्"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"हालको एप दायाँतर्फ रहने गरी स्प्लिट स्क्रिन मोड सुरु गर्नुहोस्"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"हालको एप बायाँतर्फ रहने गरी स्प्लिट स्क्रिन मोड सुरु गर्नुहोस्"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रिनको साटो फुल स्क्रिन प्रयोग गर्नुहोस्"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"स्प्लिट स्क्रिन प्रयोग गर्दै गर्दा दायाँ वा तलको एप चलाउनुहोस्"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"स्प्लिट स्क्रिन प्रयोग गर्दै गर्दा बायाँ वा माथिको एप चलाउनुहोस्"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रिन प्रयोग गरिएका बेला: एउटा स्क्रिनमा भएको एप अर्कोमा लैजानुहोस्"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"अर्को भाषा प्रयोग गर्नुहोस्"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"क्यामेरा ब्लक गरिएको छ"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"क्यामेरा र माइक्रोफोन ब्लक गरिएको छ"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"माइक्रोफोन ब्लक गरिएको छ"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Do Not Disturb"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"प्रयोगकर्ता उपस्थित भएको कुरा पत्ता लागेको छ"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिङमा गई नोट बनाउने डिफल्ट एप तोक्नुहोस्"</string>
     <string name="install_app" msgid="5066668100199613936">"एप इन्स्टल गर्नुहोस्"</string>
diff --git a/packages/SystemUI/res/values-ne/tiles_states_strings.xml b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
index 1977706..005a473 100644
--- a/packages/SystemUI/res/values-ne/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"अफ छ"</item>
     <item msgid="5137565285664080143">"अन छ"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index dd56a2e..1f780b3 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Screenshots maken is geblokkeerd door je IT-beheerder"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Bewerken"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Screenshot bewerken"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Delen"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Screenshot delen"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Meer opnemen"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Screenshot sluiten"</string>
@@ -104,8 +105,8 @@
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Schermopname verwerken"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Doorlopende melding voor een schermopname-sessie"</string>
     <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Opname starten?"</string>
-    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Als je opneemt, heeft Android toegang tot alles dat zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Als je een app opneemt, heeft Android toegang tot alles dat wordt getoond of afgespeeld in die app. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
+    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Terwijl je aan het opnemen bent, heeft Android toegang tot alles dat zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Terwijl je een app aan het opnemen bent, heeft Android toegang tot alles dat wordt getoond of afgespeeld in die app. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Opname starten"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Audio opnemen"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Audio van apparaat"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Gezicht scannen"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Verzenden"</string>
     <string name="cancel" msgid="1089011503403416730">"Annuleren"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"App-logo"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bevestigen"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Opnieuw proberen"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tik om de verificatie te annuleren"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gezicht herkend. Druk op het ontgrendelicoon."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Geverifieerd"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Verificatie annuleren"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Meer opties"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Pincode gebruiken"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Patroon gebruiken"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Wachtwoord gebruiken"</string>
@@ -360,11 +363,19 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standaard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Gemiddeld"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Hoog"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Blokkeren van apparaatmicrofoon opheffen?"</string>
-    <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Blokkeren van apparaatcamera opheffen?"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
+    <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Microfoon van apparaat niet meer blokkeren?"</string>
+    <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Apparaatcamera niet meer blokkeren?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Blokkeren van apparaatcamera en -microfoon opheffen?"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Hiermee hef je de toegangsblokkering op voor alle apps en services die rechten hebben om je microfoon te gebruiken."</string>
-    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Hiermee hef je de toegangsblokkering op voor alle apps en services die rechten hebben om je camera te gebruiken."</string>
+    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Alle apps en services die je microfoon mogen gebruiken, krijgen dan toegang tot de microfoon."</string>
+    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Alle apps en services die je camera mogen gebruiken, krijgen dan toegang tot de camera."</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Hiermee hef je de toegangsblokkering op voor alle apps en services die rechten hebben om je camera of microfoon te gebruiken."</string>
     <string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Microfoon is geblokkeerd"</string>
     <string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Camera is geblokkeerd"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Verwijderen"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Widget toevoegen"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Klaar"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Widgets toevoegen"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Krijg snel toegang tot je favoriete app-widgets zonder je tablet te ontgrendelen."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Elke widget toestaan op het vergrendelscherm?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Instellingen openen"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Werk-apps hervatten?"</string>
@@ -470,7 +483,7 @@
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Voor <xliff:g id="APP_NAME">%1$s</xliff:g> staat deze optie uit"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Casten starten?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Als je cast, heeft Android toegang tot alles dat zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Als je een app cast, heeft Android toegang tot alles dat zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Als je een app cast, heeft Android toegang tot alles dat wordt getoond of afgespeeld in die app. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Casten starten"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Delen starten?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Als je deelt, opneemt of cast, heeft Android toegang tot alles dat zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Dit apparaat wordt beheerd door je ouder. Je ouder kan informatie bekijken en beheren, zoals de apps die je gebruikt, je locatie en je schermtijd."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Ontgrendeld gehouden door TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Diefstalbeveiliging\nApparaat vergrendeld, te veel ontgrendelpogingen"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Het apparaat is vergrendeld na te veel verificatiepogingen"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Apparaat vergrendeld\nVerificatie mislukt"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Geluidsinstellingen"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatisch ondertitelen"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Geluid staat uit"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Casten"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Niet beschikbaar, belgeluid staat uit"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Niet beschikbaar omdat Niet storen aanstaat"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Niet beschikbaar omdat Niet storen aanstaat"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tik om dempen op te heffen."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tik om in te stellen op trillen. Het geluid van toegankelijkheidsservices kan hierdoor uitgaan."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tik om te dempen. Het geluid van toegankelijkheidsservices kan hierdoor uitgaan."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"trillen"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s-volumeknoppen"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Geluid bij gesprekken en meldingen (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Uitvoerinstellingen invoeren"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Volumeschuifregelaars uitgevouwen"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Volumeschuifregelaars samengevouwen"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"geluid van %s uitzetten"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"geluid van %s aanzetten"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> wordt afgespeeld op"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio wordt afgespeeld op"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Systeem-UI-tuner"</string>
@@ -630,7 +637,7 @@
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Ontgrendelen om te gebruiken"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Er is een probleem opgetreden bij het ophalen van je kaarten. Probeer het later opnieuw."</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Instellingen voor vergrendelscherm"</string>
-    <string name="qr_code_scanner_title" msgid="1938155688725760702">"QR-code-scanner"</string>
+    <string name="qr_code_scanner_title" msgid="1938155688725760702">"QR-codescanner"</string>
     <string name="qr_code_scanner_updating_secondary_label" msgid="8344598017007876352">"Updaten"</string>
     <string name="status_bar_work" msgid="5238641949837091056">"Werkprofiel"</string>
     <string name="status_bar_airplane" msgid="4848702508684541009">"Vliegtuig­modus"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Vooruitbladeren door recente apps"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Terugbladeren door recente apps"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Lijst met apps openen"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Taakbalk tonen"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Instellingen openen"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistent openen"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Scherm vergrendelen"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Gesplitst scherm openen met huidige app rechts"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Gesplitst scherm openen met huidige app links"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Van gesplitst scherm naar volledig scherm schakelen"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Ga naar de app rechts of onderaan als je een gesplitst scherm gebruikt"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Ga naar de app links of bovenaan als je een gesplitst scherm gebruikt"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Tijdens gesplitst scherm: een app vervangen door een andere"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Invoer"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Overschakelen naar volgende taal"</string>
@@ -1037,7 +1045,7 @@
     <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Pincode bevat letters of symbolen"</string>
     <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> verifiëren"</string>
     <string name="controls_pin_wrong" msgid="6162694056042164211">"Onjuiste pincode"</string>
-    <string name="controls_pin_instructions" msgid="6363309783822475238">"Geef de pincode op"</string>
+    <string name="controls_pin_instructions" msgid="6363309783822475238">"Voer pincode in"</string>
     <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Andere pincode proberen"</string>
     <string name="controls_confirmation_message" msgid="7744104992609594859">"Bevestig de wijziging voor <xliff:g id="DEVICE">%s</xliff:g>"</string>
     <string name="controls_structure_tooltip" msgid="4355922222944447867">"Swipe om meer te zien"</string>
@@ -1117,7 +1125,7 @@
     <string name="basic_status" msgid="2315371112182658176">"Gesprek openen"</string>
     <string name="select_conversation_title" msgid="6716364118095089519">"Gesprekswidgets"</string>
     <string name="select_conversation_text" msgid="3376048251434956013">"Tik op een gesprek om het toe te voegen aan je startscherm"</string>
-    <string name="no_conversations_text" msgid="5354115541282395015">"Je ziet je recente gesprekken hier"</string>
+    <string name="no_conversations_text" msgid="5354115541282395015">"Hier staan je recente gesprekken"</string>
     <string name="priority_conversations" msgid="3967482288896653039">"Prioriteitsgesprekken"</string>
     <string name="recent_conversations" msgid="8531874684782574622">"Recente gesprekken"</string>
     <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> dagen geleden"</string>
@@ -1177,7 +1185,7 @@
     <string name="wifi_wont_autoconnect_for_now" msgid="5782282612749867762">"Wifi maakt momenteel niet automatisch verbinding"</string>
     <string name="see_all_networks" msgid="3773666844913168122">"Alles tonen"</string>
     <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Verbreek de ethernetverbinding om van netwerk te wisselen"</string>
-    <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Apps en services kunnen nog steeds op elk moment scannen op wifi-netwerken, zelfs als wifi uitstaat, om de apparaatfunctionaliteit te verbeteren. Je kunt dit aanpassen in de instellingen voor wifi-scannen. "<annotation id="link">"Wijzigen"</annotation></string>
+    <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Apps en services kunnen nog steeds op elk gewenst moment zoeken naar apparaten in de buurt om de apparaatfunctionaliteit te verbeteren, zelfs als bluetooth uitstaat. Je kunt dit aanpassen in de instellingen voor wifi-scannen. "<annotation id="link">"Wijzigen"</annotation></string>
     <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Vliegtuigmodus uitzetten"</string>
     <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> wil de volgende tegel toevoegen aan Snelle instellingen"</string>
     <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Tegel toevoegen"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera geblokkeerd"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera en microfoon geblokkeerd"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfoon geblokkeerd"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Niet storen"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Gebruikersaanwezigheid is waargenomen"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standaard notitie-app instellen in Instellingen"</string>
     <string name="install_app" msgid="5066668100199613936">"App installeren"</string>
diff --git a/packages/SystemUI/res/values-nl/tiles_states_strings.xml b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
index 7737794..1b286f3 100644
--- a/packages/SystemUI/res/values-nl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Uit"</item>
     <item msgid="5137565285664080143">"Aan"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 40683a7..9a602b8 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"ସେୟାର କରନ୍ତୁ"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"ସ୍କ୍ରିନସଟ ସେୟାର କରନ୍ତୁ"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"ଅଧିକ କେପଚର କରନ୍ତୁ"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ସ୍କ୍ରିନସଟ୍ ଖାରଜ କରନ୍ତୁ"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"ଫେସ୍ ସ୍କାନିଙ୍ଗ କରାଯାଉଛି"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ପଠାନ୍ତୁ"</string>
     <string name="cancel" msgid="1089011503403416730">"ବାତିଲ କରନ୍ତୁ"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"ଆପ ଲୋଗୋ"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ପ୍ରାମାଣିକତା ବାତିଲ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ଫେସ ଚିହ୍ନଟ କରାଯାଇଛି। ଜାରି ରଖିବାକୁ ଅନଲକ ଆଇକନ ଦବାନ୍ତୁ।"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ପ୍ରାମାଣିକତା ହୋଇଛି"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ପ୍ରମାଣୀକରଣକୁ ବାତିଲ କରନ୍ତୁ"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ଅଧିକ ବିକଳ୍ପ"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ପାଟର୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"ପାସ୍‌ୱାର୍ଡ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ଷ୍ଟାଣ୍ଡାର୍ଡ"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ମଧ୍ୟମ"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"ଅଧିକ"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ଡିଭାଇସର ମାଇକ୍ରୋଫୋନକୁ ଅନବ୍ଲକ କରିବେ?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ଡିଭାଇସର କେମେରାକୁ ଅନବ୍ଲକ କରିବେ?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ଡିଭାଇସର କ୍ୟାମେରା ଏବଂ ମାଇକ୍ରୋଫୋନକୁ ଅନବ୍ଲକ୍ କରିବେ?"</string>
@@ -437,10 +448,10 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"କାଢ଼ି ଦିଅନ୍ତୁ"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ୱିଜେଟ ଯୋଗ କରନ୍ତୁ"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ହୋଇଗଲା"</string>
-    <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) -->
-    <skip />
-    <!-- no translation found for button_text_to_open_settings (1987729256950941628) -->
-    <skip />
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"ୱିଜେଟଗୁଡ଼ିକୁ ଯୋଗ କରନ୍ତୁ"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"ଆପଣଙ୍କ ଟାବଲେଟକୁ ଅନଲକ ନକରି ଆପଣଙ୍କ ପସନ୍ଦର ଆପ ୱିଜେଟଗୁଡ଼ିକୁ କୁଇକ ଆକ୍ସେସ ପାଆନ୍ତୁ।"</string>
+    <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ଲକସ୍କ୍ରିନରେ ଯେ କୌଣସି ୱିଜେଟକୁ ଅନୁମତି ଦେବେ?"</string>
+    <string name="button_text_to_open_settings" msgid="1987729256950941628">"ସେଟିଂସ ଖୋଲନ୍ତୁ"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"ୱାର୍କ ଆପ୍ସକୁ ପୁଣି ଚାଲୁ କରିବେ?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ୟୁଜର୍‍ ବଦଳାନ୍ତୁ"</string>
@@ -472,7 +483,7 @@
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଏହି ବିକଳ୍ପକୁ ଅକ୍ଷମ କରିଛି"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"କାଷ୍ଟିଂ ଆରମ୍ଭ କରିବେ?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"ଆପଣ କାଷ୍ଟ କରିବା ସମୟରେ, ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ଆପଣଙ୍କ ଡିଭାଇସରେ ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ Androidର ଆକ୍ସେସ ଅଛି। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପ୍ରତି ସତର୍କ ରୁହନ୍ତୁ।"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"ଆପଣ ଏକ ଆପ କାଷ୍ଟ କରିବା ସମୟରେ, ସେହି ଆପରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ Androidର ଆକ୍ସେସ ଅଛି। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପ୍ରତି ସତର୍କ ରୁହନ୍ତୁ।"</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"ଆପଣ ଏକ ଆପ କାଷ୍ଟ କରିବା ସମୟରେ, ସେହି ଆପରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ Androidର ଆକ୍ସେସ ଅଛି। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପାଇଁ ସତର୍କ ରୁହନ୍ତୁ।"</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"କାଷ୍ଟିଂ ଆରମ୍ଭ କରନ୍ତୁ"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"ସେୟାରିଂ ଆରମ୍ଭ କରିବେ?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"ଆପଣ ସେୟାର, ରେକର୍ଡ କିମ୍ବା କାଷ୍ଟ କରିବା ସମୟରେ, ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ଆପଣଙ୍କ ଡିଭାଇସରେ ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ Androidର ଆକ୍ସେସ ଅଛି। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପ୍ରତି ସତର୍କ ରୁହନ୍ତୁ।"</string>
@@ -540,7 +551,8 @@
     <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="1265107698772588299">"ଥେଫ୍ଟ ସୁରକ୍ଷା\nଡିଭାଇସ ଲକ କରାଯାଇଛି, ଅନେକଗୁଡ଼ିଏ ଅନଲକ ପ୍ରଚେଷ୍ଟା"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ଡିଭାଇସ ଲକ କରାଯାଇଛି, ଅନେକଗୁଡ଼ିଏ ପ୍ରମାଣୀକରଣ ପ୍ରଚେଷ୍ଟା କରାଯାଇଛି"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ଡିଭାଇସ ଲକ ହୋଇଛି\nପ୍ରମାଣୀକରଣ ବିଫଳ ହୋଇଛି"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ସାଉଣ୍ଡ ସେଟିଂସ୍"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"ସ୍ବଚାଳିତ କ୍ୟାପ୍ସନ୍ ମିଡିଆ"</string>
@@ -571,11 +583,11 @@
     <string name="screen_pinning_negative" msgid="6882816864569211666">"ନାହିଁ, ଥାଉ"</string>
     <string name="screen_pinning_start" msgid="7483998671383371313">"ଆପ୍ ପିନ୍ କରାଯାଇଛି"</string>
     <string name="screen_pinning_exit" msgid="4553787518387346893">"ଆପ୍ ଅନପିନ୍ କରାଯାଇଛି"</string>
-    <string name="stream_voice_call" msgid="7468348170702375660">"କଲ୍ କରନ୍ତୁ"</string>
+    <string name="stream_voice_call" msgid="7468348170702375660">"କଲ କରନ୍ତୁ"</string>
     <string name="stream_system" msgid="7663148785370565134">"ସିଷ୍ଟମ"</string>
     <string name="stream_ring" msgid="7550670036738697526">"ରିଙ୍ଗ"</string>
     <string name="stream_music" msgid="2188224742361847580">"ମିଡିଆ"</string>
-    <string name="stream_alarm" msgid="16058075093011694">"ଆଲାରାମ୍"</string>
+    <string name="stream_alarm" msgid="16058075093011694">"ଆଲାରାମ"</string>
     <string name="stream_notification" msgid="7930294049046243939">"ବିଜ୍ଞପ୍ତି"</string>
     <string name="stream_bluetooth_sco" msgid="6234562365528664331">"ବ୍ଲୁଟୁଥ୍‍‌"</string>
     <string name="stream_dtmf" msgid="7322536356554673067">"ଡୁଆଲ୍‍ ମଲ୍ଟି ଟୋନ୍‍ ଫ୍ରିକ୍ୱେନ୍ସୀ"</string>
@@ -585,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ମ୍ୟୁଟ"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"କାଷ୍ଟ କରନ୍ତୁ"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"ରିଂକୁ ମ୍ୟୁଟ କରାଯାଇଥିବା ଯୋଗୁଁ ଉପଲବ୍ଧ ନାହିଁ"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"\'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\' ଚାଲୁ ଥିବା ଯୋଗୁଁ ଉପଲବ୍ଧ ନାହିଁ"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"\'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\' ଚାଲୁ ଥିବା ଯୋଗୁଁ ଉପଲବ୍ଧ ନାହିଁ"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s। ଅନମ୍ୟୁଟ୍‍ କରିବା ପାଇଁ ଟାପ୍‍ କରନ୍ତୁ।"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s। ଭାଇବ୍ରେଟ୍‍ ସେଟ୍‍ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ। ଆକ୍ସେସିବିଲିଟୀ ସର୍ଭିସ୍‌ ମ୍ୟୁଟ୍‍ କରାଯାଇପାରେ।"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s। ମ୍ୟୁଟ୍‍ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ। ଆକ୍ସେସିବିଲିଟୀ ସର୍ଭିସ୍‌ ମ୍ୟୁଟ୍‍ କରାଯାଇପାରେ।"</string>
@@ -605,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ଭାଇବ୍ରେଟ୍"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s ଭଲ୍ୟୁମ୍ ନିୟନ୍ତ୍ରଣ"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"କଲ୍ ଓ ବିଜ୍ଞପ୍ତି ପାଇଁ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)ରେ ରିଙ୍ଗ ହେବ"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"ଆଉଟପୁଟ ସେଟିଂସ ଲେଖନ୍ତୁ"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"ଭଲ୍ୟୁମ ସ୍ଲାଇଡରଗୁଡ଼ିକୁ ବିସ୍ତାର କରାଯାଇଛି"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"ଭଲ୍ୟୁମ ସ୍ଲାଇଡରଗୁଡ଼ିକୁ ସଙ୍କୁଚିତ କରାଯାଇଛି"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%sକୁ ମ୍ୟୁଟ କରନ୍ତୁ"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%sକୁ ଅନମ୍ୟୁଟ କରନ୍ତୁ"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>ରେ ପ୍ଲେ କରାଯାଉଛି"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"ଅଡିଓ ପ୍ଲେ ହେବ"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"ଅଡିଓ ଏଥିରେ ପ୍ଲେ ହେବ"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"ସିଷ୍ଟମ୍ UI ଟ୍ୟୁନର୍‍"</string>
     <string name="status_bar" msgid="4357390266055077437">"ଷ୍ଟାଟସ୍‍ ବାର୍‍"</string>
     <string name="demo_mode" msgid="263484519766901593">"ସିଷ୍ଟମ୍‌ UI ଡେମୋ ମୋଡ୍‌"</string>
@@ -761,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"ବର୍ତ୍ତମାନର ଆପ୍ସ ମଧ୍ୟରେ ଆଗକୁ ଯାଆନ୍ତୁ"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"ବର୍ତ୍ତମାନର ଆପ୍ସ ମଧ୍ୟରେ ପଛକୁ ଯାଆନ୍ତୁ"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ଆପ୍ସ ତାଲିକା ଖୋଲନ୍ତୁ"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ଟାସ୍କବାର ଦେଖାନ୍ତୁ"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"ସେଟିଂସ ଖୋଲନ୍ତୁ"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ଖୋଲନ୍ତୁ"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"ଲକ ସ୍କ୍ରିନ"</string>
@@ -770,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନରୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନକୁ ସୁଇଚ କରନ୍ତୁ"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ବ୍ୟବହାର କରିବା ସମୟରେ ଡାହାଣପଟର ବା ତଳର ଆପକୁ ସୁଇଚ କରନ୍ତୁ"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ବ୍ୟବହାର କରିବା ସମୟରେ ବାମପଟର ବା ଉପରର ଆପକୁ ସୁଇଚ କରନ୍ତୁ"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ସମୟରେ: କୌଣସି ଆପକୁ ଗୋଟିଏରୁ ଅନ୍ୟ ଏକ ଆପରେ ବଦଳାନ୍ତୁ"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ଇନପୁଟ କରନ୍ତୁ"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"ପରବର୍ତ୍ତୀ ଭାଷାକୁ ସୁଇଚ କରନ୍ତୁ"</string>
@@ -902,7 +908,7 @@
     <string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string>
     <string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
     <string name="wifi_is_off" msgid="5389597396308001471">"ୱାଇ-ଫାଇ ବନ୍ଦ ଅଛି"</string>
-    <string name="bt_is_off" msgid="7436344904889461591">"ବ୍ଲୁଟୂଥ୍‍‌ ଅଫ୍ ଅଛି"</string>
+    <string name="bt_is_off" msgid="7436344904889461591">"ବ୍ଲୁଟୁଥ ବନ୍ଦ ଅଛି"</string>
     <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>
@@ -1268,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"କେମେରାକୁ ବ୍ଲକ କରାଯାଇଛି"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"କେମେରା ଏବଂ ମାଇକ୍ରୋଫୋନକୁ ବ୍ଲକ କରାଯାଇଛି"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ମାଇକ୍ରୋଫୋନକୁ ବ୍ଲକ କରାଯାଇଛି"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"ୟୁଜରଙ୍କ ଉପସ୍ଥିତି ଚିହ୍ନଟ କରାଯାଇଛି"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ସେଟିଂସରେ ଡିଫଲ୍ଟ ନୋଟ୍ସ ଆପ ସେଟ କରନ୍ତୁ"</string>
     <string name="install_app" msgid="5066668100199613936">"ଆପ ଇନଷ୍ଟଲ କରନ୍ତୁ"</string>
diff --git a/packages/SystemUI/res/values-or/tiles_states_strings.xml b/packages/SystemUI/res/values-or/tiles_states_strings.xml
index 046db2f..fd727bf 100644
--- a/packages/SystemUI/res/values-or/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-or/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"ବନ୍ଦ ଅଛି"</item>
     <item msgid="5137565285664080143">"ଚାଲୁ ଅଛି"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index b2296b2..40efd0b 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ਤੁਹਾਡੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਦੀ ਸੁਵਿਧਾ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"ਸੰਪਾਦਨ ਕਰੋ"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"ਸਾਂਝਾ ਕਰੋ"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸਾਂਝਾ ਕਰੋ"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"ਹੋਰ ਕੈਪਚਰ ਕਰੋ"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਖਾਰਜ ਕਰੋ"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"ਚਿਹਰਾ ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ਭੇਜੋ"</string>
     <string name="cancel" msgid="1089011503403416730">"ਰੱਦ ਕਰੋ"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"ਐਪ ਲੋਗੋ"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"ਤਸਦੀਕ ਕਰੋ"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ਪ੍ਰਮਾਣੀਕਰਨ ਰੱਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਹੋਈ। ਜਾਰੀ ਰੱਖਣ ਲਈ \'ਅਣਲਾਕ ਕਰੋ\' ਪ੍ਰਤੀਕ ਨੂੰ ਦਬਾਓ।"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ਪ੍ਰਮਾਣਿਤ ਹੋਇਆ"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ਪ੍ਰਮਾਣੀਕਰਨ ਰੱਦ ਕਰੋ"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ਹੋਰ ਵਿਕਲਪ"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ਪਿੰਨ ਵਰਤੋ"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ਪੈਟਰਨ ਵਰਤੋ"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"ਪਾਸਵਰਡ ਵਰਤੋ"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ਮਿਆਰੀ"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ਦਰਮਿਆਨਾ"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"ਜ਼ਿਆਦਾ"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ਕੀ ਡੀਵਾਈਸ ਦੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਨੂੰ ਅਣਬਲਾਕ ਕਰਨਾ ਹੈ?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ਕੀ ਡੀਵਾਈਸ ਦੇ ਕੈਮਰੇ ਨੂੰ ਅਣਬਲਾਕ ਕਰਨਾ ਹੈ?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ਕੀ ਡੀਵਾਈਸ ਦੇ ਕੈਮਰੇ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਨੂੰ ਅਣਬਲਾਕ ਕਰਨਾ ਹੈ?"</string>
@@ -437,15 +448,15 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"ਹਟਾਓ"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ਵਿਜੇਟ ਸ਼ਾਮਲ ਕਰੋ"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ਹੋ ਗਿਆ"</string>
-    <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) -->
-    <skip />
-    <!-- no translation found for button_text_to_open_settings (1987729256950941628) -->
-    <skip />
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"ਵਿਜੇਟ ਸ਼ਾਮਲ ਕਰੋ"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"ਆਪਣੇ ਟੈਬਲੈੱਟ ਨੂੰ ਅਣਲਾਕ ਕੀਤੇ ਬਿਨਾਂ ਆਪਣੇ ਮਨਪਸੰਦ ਐਪ ਵਿਜੇਟ ਤੱਕ ਤਤਕਾਲ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ।"</string>
+    <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ਕੀ ਲਾਕ-ਸਕ੍ਰੀਨ \'ਤੇ ਕਿਸੇ ਵੀ ਵਿਜੇਟ ਨੂੰ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
+    <string name="button_text_to_open_settings" msgid="1987729256950941628">"ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਤੋਂ ਰੋਕ ਹਟਾਈਏ?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"ਰੋਕ ਹਟਾਓ"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ਵਰਤੋਂਕਾਰ ਸਵਿੱਚ ਕਰੋ"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ਪੁੱਲਡਾਊਨ ਮੀਨੂ"</string>
-    <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ਇਸ ਸੈਸ਼ਨ ਵਿਚਲੀਆਂ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਡਾਟਾ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string>
+    <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ਇਸ ਸੈਸ਼ਨ ਵਿਚਲੀਆਂ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਡਾਟੇ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string>
     <string name="guest_wipe_session_title" msgid="7147965814683990944">"ਮਹਿਮਾਨ, ਫਿਰ ਤੁਹਾਡਾ ਸੁਆਗਤ ਹੈ!"</string>
     <string name="guest_wipe_session_message" msgid="3393823610257065457">"ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਸੈਸ਼ਨ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
     <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ"</string>
@@ -472,7 +483,7 @@
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਨੇ ਇਸ ਵਿਕਲਪ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"ਕੀ ਕਾਸਟ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰਨਾ ਹੈ?"</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਾਸਟ ਕਰਨ \'ਤੇ, Android ਕੋਲ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਵਾਲੀ ਜਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚਲਾਈ ਜਾਣ ਵਾਲੀ ਹਰੇਕ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੁੰਦੀ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਵਾਸਤੇ ਸਾਵਧਾਨ ਰਹੋ।"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਾਸਟ ਕਰਨ \'ਤੇ, Android ਕੋਲ ਉਸ ਐਪ \'ਤੇ ਦਿਖਾਈ ਗਈ ਜਾਂ ਚਲਾਈ ਗਈ ਹਰੇਕ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੁੰਦੀ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਸੰਬੰਧੀ ਸਾਵਧਾਨ ਰਹੋ।"</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਿਸੇ ਐਪ ਨੂੰ ਕਾਸਟ ਕਰਨ \'ਤੇ, Android ਕੋਲ ਉਸ ਐਪ \'ਤੇ ਦਿਖਾਈ ਗਈ ਜਾਂ ਚਲਾਈ ਗਈ ਹਰੇਕ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੁੰਦੀ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਸੰਬੰਧੀ ਸਾਵਧਾਨ ਰਹੋ।"</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"ਕਾਸਟ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰੋ"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"ਕੀ ਸਾਂਝਾਕਰਨ ਸ਼ੁਰੂ ਕਰਨਾ ਹੈ?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਾਂਝਾ ਕਰਨ, ਰਿਕਾਰਡ ਕਰਨ, ਜਾਂ ਕਾਸਟ ਕਰਨ \'ਤੇ, Android ਕੋਲ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਦੀ ਜਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚਲਾਈ ਗਈ ਹਰੇਕ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੁੰਦੀ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਵਾਸਤੇ ਸਾਵਧਾਨ ਰਹੋ।"</string>
@@ -494,7 +505,7 @@
     <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ਸਾਰੀਆਂ ਸ਼ਾਂਤ ਸੂਚਨਾਵਾਂ ਕਲੀਅਰ ਕਰੋ"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"ਹੁਣੇ ਸ਼ੁਰੂ ਕਰੋ"</string>
-    <string name="empty_shade_text" msgid="8935967157319717412">"ਕੋਈ ਸੂਚਨਾਵਾਂ ਨਹੀਂ"</string>
+    <string name="empty_shade_text" msgid="8935967157319717412">"ਕੋਈ ਸੂਚਨਾ ਨਹੀਂ"</string>
     <string name="no_unseen_notif_text" msgid="395512586119868682">"ਕੋਈ ਨਵੀਂ ਸੂਚਨਾ ਨਹੀਂ ਹੈ"</string>
     <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"ਪੁਰਾਣੀਆਂ ਸੂਚਨਾਵਾਂ ਦੇਖਣ ਲਈ ਅਣਲਾਕ ਕਰੋ"</string>
     <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਮਾਂ-ਪਿਓ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"</string>
@@ -540,7 +551,8 @@
     <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">"ਟਰੱਸਟ-ਏਜੰਟ ਵੱਲੋਂ ਅਣਲਾਕ ਰੱਖਿਆ ਗਿਆ"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"ਚੋਰੀ ਤੋਂ ਸੁਰੱਖਿਆ\nਡੀਵਾਈਸ ਲਾਕ ਹੋ ਗਿਆ, ਅਣਲਾਕ ਕਰਨ ਦੀਆਂ ਕਈ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਗਈਆਂ"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ਡੀਵਾਈਸ ਲਾਕ ਕੀਤਾ ਗਿਆ ਸੀ, ਬਹੁਤ ਸਾਰੀਆਂ ਪ੍ਰਮਾਣੀਕਰਨ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਗਈਆਂ"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ਡੀਵਾਈਸ ਲਾਕ ਹੈ\nਪ੍ਰਮਾਣੀਕਰਨ ਅਸਫਲ ਰਿਹਾ"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ਧੁਨੀ ਸੈਟਿੰਗਾਂ"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"ਸਵੈਚਲਿਤ ਸੁਰਖੀ ਮੀਡੀਆ"</string>
@@ -585,16 +597,14 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ਮਿਊਟ"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"ਕਾਸਟ ਕਰੋ"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਘੰਟੀ ਮਿਊਟ ਕੀਤੀ ਹੋਈ ਹੈ"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਵਿਸ਼ੇਸ਼ਤਾ ਚਾਲੂ ਹੈ"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਵਿਸ਼ੇਸ਼ਤਾ ਚਾਲੂ ਹੈ"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s। ਅਣਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s। ਥਰਥਰਾਹਟ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਪਹੁੰਚਯੋਗਤਾ ਸੇਵਾਵਾਂ ਮਿਊਟ ਹੋ ਸਕਦੀਆਂ ਹਨ।"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s। ਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਪਹੁੰਚਯੋਗਤਾ ਸੇਵਾਵਾਂ ਮਿਊਟ ਹੋ ਸਕਦੀਆਂ ਹਨ।"</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s। ਥਰਥਰਾਹਟ \'ਤੇ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s। ਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
-    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ਸ਼ੋਰ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"</string>
+    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ਨੋਇਸ ਕੰਟਰੋਲ"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"ਸਪੇਸ਼ਿਅਲ ਆਡੀਓ"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ਬੰਦ"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ਸਥਿਰ"</string>
@@ -605,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ਥਰਥਰਾਹਟ"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s ਵੌਲਿਊਮ ਕੰਟਰੋਲ"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ਕਾਲਾਂ ਆਉਣ ਅਤੇ ਸੂਚਨਾਵਾਂ ਮਿਲਣ \'ਤੇ ਘੰਟੀ ਵਜੇਗੀ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"ਆਊਟਪੁੱਟ ਸੈਟਿੰਗਾਂ ਦਾਖਲ ਕਰੋ"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"ਅਵਾਜ਼ ਸਲਾਈਡਰਾਂ ਵਿਸਤਾਰ ਕੀਤਾ ਗਿਆ"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"ਅਵਾਜ਼ ਸਲਾਈਡਰਾਂ ਨੂੰ ਸਮੇਟਿਆ ਗਿਆ"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s ਨੂੰ ਮਿਊਟ ਕਰੋ"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s ਨੂੰ ਅਣਮਿਊਟ ਕਰੋ"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> ਚਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"ਆਡੀਓ ਇਸ \'ਤੇ ਚੱਲੇਗੀ"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI ਟਿਊਨਰ"</string>
@@ -761,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"ਹਾਲ ਹੀ ਵਿੱਚ ਖੋਲ੍ਹੀਆਂ ਗਈਆਂ ਐਪਾਂ \'ਤੇ ਅੱਗੇ ਜਾਓ"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"ਹਾਲ ਹੀ ਵਿੱਚ ਖੋਲ੍ਹੀਆਂ ਗਈਆਂ ਐਪਾਂ \'ਤੇ ਵਾਪਸ ਜਾਓ"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ਐਪਾਂ ਦੀ ਸੂਚੀ ਖੋਲ੍ਹੋ"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ਟਾਸਕਬਾਰ ਦਿਖਾਓ"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ਖੋਲ੍ਹੋ"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"ਲਾਕ ਸਕ੍ਰੀਨ"</string>
@@ -770,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਤੋਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵੇਲੇ ਸੱਜੇ ਜਾਂ ਹੇਠਾਂ ਮੌਜੂਦ ਐਪ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵੇਲੇ ਖੱਬੇ ਜਾਂ ਉੱਪਰ ਮੌਜੂਦ ਐਪ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੌਰਾਨ: ਇੱਕ ਐਪ ਨਾਲ ਦੂਜੀ ਐਪ ਨੂੰ ਬਦਲੋ"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ਇਨਪੁੱਟ"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"ਅਗਲੀ ਭਾਸ਼ਾ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
@@ -1268,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ਕੈਮਰਾ ਬਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ਕੈਮਰਾ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬਲਾਕ ਕੀਤੇ ਗਏ"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"ਵਰਤੋਂਕਾਰ ਦੀ ਮੌਜੂਦਗੀ ਦਾ ਪਤਾ ਲਗਾਇਆ ਜਾਂਦਾ ਹੈ"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਨੋਟ ਐਪ ਨੂੰ ਸੈੱਟ ਕਰੋ"</string>
     <string name="install_app" msgid="5066668100199613936">"ਐਪ ਸਥਾਪਤ ਕਰੋ"</string>
diff --git a/packages/SystemUI/res/values-pa/tiles_states_strings.xml b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
index df870cd..afb1e8b 100644
--- a/packages/SystemUI/res/values-pa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
@@ -152,7 +152,7 @@
     <item msgid="8998632451221157987">"ਚਾਲੂ ਹੈ"</item>
   </string-array>
   <string-array name="tile_states_controls">
-    <item msgid="8199009425335668294">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+    <item msgid="8199009425335668294">"ਅਣਉਪਲਬਧ ਹਨ"</item>
     <item msgid="4544919905196727508">"ਬੰਦ ਹੈ"</item>
     <item msgid="3422023746567004609">"ਚਾਲੂ ਹੈ"</item>
   </string-array>
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"ਬੰਦ"</item>
     <item msgid="5137565285664080143">"ਚਾਲੂ"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index a08e473..48262a0 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Robienie zrzutów ekranu zostało zablokowane przez administratora IT"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Edytuj"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Edytuj zrzut ekranu"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Udostępnij"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Udostępnij zrzut ekranu"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Zarejestruj więcej danych"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zamknij zrzut ekranu"</string>
@@ -104,8 +105,8 @@
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Przetwarzam nagrywanie ekranu"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Stałe powiadomienie o sesji rejestrowania zawartości ekranu"</string>
     <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Rozpocząć nagrywanie?"</string>
-    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Podczas nagrywania Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Podczas nagrywania treści z aplikacji Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
+    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Podczas nagrywania Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Podczas nagrywania treści z aplikacji Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Zacznij nagrywać"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Nagrywaj dźwięk"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Dźwięki z urządzenia"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Skanowanie twarzy"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Wyślij"</string>
     <string name="cancel" msgid="1089011503403416730">"Anuluj"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo aplikacji"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potwierdź"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Spróbuj jeszcze raz"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Kliknij, by anulować uwierzytelnianie"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Twarz rozpoznana. Aby kontynuować, kliknij ikonę odblokowywania."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Uwierzytelniono"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Anuluj uwierzytelnianie"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Więcej opcji"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Użyj kodu PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Użyj wzoru"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Użyj hasła"</string>
@@ -265,7 +268,7 @@
     <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Kliknij, aby podłączyć lub odłączyć urządzenie"</string>
     <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Sparuj nowe urządzenie"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Pokaż wszystkie"</string>
-    <string name="turn_on_bluetooth" msgid="5681370462180289071">"Użyj Bluetootha"</string>
+    <string name="turn_on_bluetooth" msgid="5681370462180289071">"Używaj Bluetootha"</string>
     <string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Połączone"</string>
     <string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Zapisane"</string>
     <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"rozłącz"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardowy"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Średni"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Wysoki"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Odblokować mikrofon urządzenia?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Odblokować aparat urządzenia?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Odblokować aparat i mikrofon urządzenia?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Usuń"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodaj widżet"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotowe"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Dodaj widżety"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Uzyskaj szybki dostęp do ulubionych widżetów aplikacji bez odblokowywania tabletu."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Zezwolić na dowolny widżet na ekranie blokady?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otwórz ustawienia"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Cofnąć wstrzymanie aplikacji służbowych?"</string>
@@ -464,17 +477,17 @@
     <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Pojedyncza aplikacja"</string>
     <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Udostępnianie i nagrywanie aplikacji"</string>
     <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Rozpocząć nagrywanie lub przesyłanie za pomocą aplikacji <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Podczas udostępniania, nagrywania lub przesyłania treści aplikacja <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Podczas udostępniania, nagrywania lub przesyłania treści aplikacja <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Podczas udostępniania, nagrywania lub przesyłania treści aplikacja <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Podczas udostępniania, nagrywania lub przesyłania treści aplikacja <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Rozpocznij"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ma wyłączoną tę opcję"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Rozpocząć przesyłanie?"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Podczas przesyłania, Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Podczas przesyłania treści z aplikacji Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Podczas przesyłania, Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Podczas przesyłania treści z aplikacji Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Rozpocznij przesyłanie"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Rozpocząć udostępnianie?"</string>
-    <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Podczas udostępniania, nagrywania lub przesyłania treści Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
-    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Podczas udostępniania, nagrywania lub przesyłania treści Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
+    <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Podczas udostępniania, nagrywania lub przesyłania treści Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
+    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Podczas udostępniania, nagrywania lub przesyłania treści Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
     <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Rozpocznij"</string>
     <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Udostępnianie zostanie wstrzymane, gdy przełączysz aplikacje"</string>
     <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Udostępnij tę aplikację"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Tym urządzeniem zarządza Twój rodzic. Rodzic może zobaczyć różne informacje, np. o aplikacjach, których używasz, lokalizacji i czasie korzystania z urządzenia, a także zarządzać tymi danymi."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Blokada anulowana przez agenta zaufania"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Ochrona przed kradzieżą\nZablokowano – za dużo prób logowania."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Urządzenie zostało zablokowane, zbyt wiele prób uwierzytelnienia"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Urządzenie zostało zablokowane\nNie udało się uwierzytelnić"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Ustawienia dźwięku"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Autom. napisy do multimediów"</string>
@@ -583,8 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Wyciszenie"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Przesyłanie"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Niedostępne, bo dzwonek jest wyciszony"</string>
-    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Niedostępne, bo włączone jest „Nie przeszkadzać”"</string>
-    <string name="stream_media_unavailable" msgid="6823020894438959853">"Niedostępne, bo włączone jest „Nie przeszkadzać”"</string>
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Niedostępne, włączone jest „Nie przeszkadzać”"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Niedostępne, włączone jest „Nie przeszkadzać”"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Kliknij, by wyłączyć wyciszenie."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Kliknij, by włączyć wibracje. Ułatwienia dostępu mogą być wyciszone."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Kliknij, by wyciszyć. Ułatwienia dostępu mogą być wyciszone."</string>
@@ -594,7 +608,7 @@
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Dźwięk przestrzenny"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Wyłączony"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Stały"</string>
-    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Monitorowanie głowy"</string>
+    <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Śledzenie głowy"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"Kliknij, aby zmienić tryb dzwonka"</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"wycisz"</string>
     <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"wyłącz wyciszenie"</string>
@@ -654,9 +668,9 @@
     <string name="notification_alert_title" msgid="3656229781017543655">"Domyślne"</string>
     <string name="notification_automatic_title" msgid="3745465364578762652">"Automatycznie"</string>
     <string name="notification_channel_summary_low" msgid="4860617986908931158">"Bez dźwięku i wibracji"</string>
-    <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Brak dźwięku i wibracji, wyświetla się niżej w sekcji rozmów"</string>
-    <string name="notification_channel_summary_default" msgid="777294388712200605">"Może włączać dzwonek lub wibracje w zależności od ustawień urządzenia"</string>
-    <string name="notification_channel_summary_default_with_bubbles" msgid="3482483084451555344">"Może włączyć dzwonek lub wibracje w zależności od ustawień urządzenia. Rozmowy z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> są domyślnie wyświetlane jako dymki."</string>
+    <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Brak dźwięku i wibracji, wyświetlają się niżej w sekcji rozmów"</string>
+    <string name="notification_channel_summary_default" msgid="777294388712200605">"Mogą włączać dzwonek lub wibracje w zależności od ustawień urządzenia"</string>
+    <string name="notification_channel_summary_default_with_bubbles" msgid="3482483084451555344">"Mogą włączyć dzwonek lub wibracje w zależności od ustawień urządzenia. Rozmowy z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> są domyślnie wyświetlane jako dymki."</string>
     <string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Pozwól systemowi decydować, czy o powiadomieniu powinien informować dźwięk czy wibracja"</string>
     <string name="notification_channel_summary_automatic_alerted" msgid="954166812246932240">"&lt;b&gt;Stan:&lt;/b&gt; zmieniony na Domyślny"</string>
     <string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"&lt;b&gt;Stan:&lt;/b&gt; zmieniono na Ciche"</string>
@@ -752,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Przełączanie się do przodu między ostatnimi aplikacjami"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Przełączanie się wstecz między ostatnimi aplikacjami"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otwieranie listy aplikacji"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Pokazywanie paska aplikacji"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otwieranie ustawień"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otwieranie asystenta"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Blokada ekranu"</string>
@@ -761,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Uruchamianie trybu podzielonego ekranu z bieżącą aplikacją po prawej"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Uruchamianie trybu podzielonego ekranu z bieżącą aplikacją po lewej"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Przełącz podzielony ekran na pełny ekran"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Przełącz się na aplikację po prawej lub poniżej na podzielonym ekranie"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Przełącz się na aplikację po lewej lub powyżej na podzielonym ekranie"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Podczas podzielonego ekranu: zastępowanie aplikacji"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Wprowadzanie"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Przełączanie na następny język"</string>
@@ -1232,7 +1247,7 @@
     <string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Dostępne jest co najmniej 1 urządzenie lub panel urządzenia"</string>
     <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Wybierz domyślną aplikację do obsługi notatek, której skrótu będziesz używać do funkcji notowania"</string>
     <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Wybierz aplikację"</string>
-    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Skrót – naciśnij i przytrzymaj"</string>
+    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Naciśnij i przytrzymaj skrót"</string>
     <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Anuluj"</string>
     <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Przełącz ekrany teraz"</string>
     <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Otwieranie telefonu"</string>
@@ -1259,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera jest zablokowana"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon są zablokowane"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon jest zablokowany"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Nie przeszkadzać"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Wykryto obecność użytkownika"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ustaw domyślną aplikację do obsługi notatek w Ustawieniach"</string>
     <string name="install_app" msgid="5066668100199613936">"Zainstaluj aplikację"</string>
diff --git a/packages/SystemUI/res/values-pl/tiles_states_strings.xml b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
index c667b99..5d1c02e 100644
--- a/packages/SystemUI/res/values-pl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Wyłączono"</item>
     <item msgid="5137565285664080143">"Włączono"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 83d523a..04bdf14 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"As capturas de tela foram bloqueadas pelo administrador de TI"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de tela"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Compartilhar"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Compartilhar captura de tela"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar mais"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dispensar captura de tela"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Verificando rosto"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
     <string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotipo do app"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Tentar novamente"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toque para cancelar a autenticação"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Pressione o ícone para continuar."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticação"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Mais opções"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrão"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar senha"</string>
@@ -355,11 +358,19 @@
     <item msgid="1627504621139124393">"Interface do usuário"</item>
     <item msgid="8309220355268900335">"Bateria"</item>
   </string-array>
-    <string name="quick_settings_onehanded_label" msgid="2416537930246274991">"Modo para uma mão"</string>
+    <string name="quick_settings_onehanded_label" msgid="2416537930246274991">"Modo uma mão"</string>
     <string name="quick_settings_contrast_label" msgid="988087460210159123">"Contraste"</string>
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Padrão"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Médio"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Desbloquear o microfone do dispositivo?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Desbloquear a câmera do dispositivo?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Desbloquear a câmera e o microfone do dispositivo?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Remover"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adicionar widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Concluído"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Adicionar widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Tenha acesso rápido aos widgets de seus apps favoritos sem desbloquear o tablet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permitir qualquer widget na tela de bloqueio?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir as configurações"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Reativar apps de trabalho?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Este dispositivo é gerenciado pelo seu familiar responsável, que pode ver e gerenciar informações como os apps que você usa, sua localização e seu tempo de uso."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Desbloqueado pelo TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Proteção contra roubo\nDispositivo bloqueado por tentativas de desbloqueio em excesso"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"O dispositivo foi bloqueado devido a muitas tentativas de autenticação"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispositivo bloqueado\nA autenticação falhou"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Configurações de som"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Transcrição automática"</string>
@@ -582,11 +596,9 @@
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Vibrar"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Desativar som"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Transmitir"</string>
-    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponível com o toque foi silenciado"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponível com o toque silenciado"</string>
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Indisponível porque o Não perturbe está ativado"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Indisponível porque o Não perturbe está ativado"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toque para ativar o som."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toque para configurar para vibrar. É possível que os serviços de acessibilidade sejam silenciados."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Controles de volume %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Chamadas e notificações farão o smartphone tocar (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Inserir configurações de saída"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Controles deslizantes de volume abertos"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Controles deslizantes de volume fechados"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"desativar o som de %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"ativar o som de %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Tocando <xliff:g id="LABEL">%s</xliff:g> em"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"O áudio vai tocar em"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizador System UI"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Avançar pela lista de apps recentes"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Voltar pela lista de apps recentes"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar a Barra de tarefas"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configurações"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir o Google Assistente"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Tela de bloqueio"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Usar a tela dividida com o app atual à direita"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Usar a tela dividida com o app atual à esquerda"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar da tela dividida para a tela cheia"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Mude para o app à direita ou abaixo ao usar a tela dividida"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Mude para o app à esquerda ou acima ao usar a tela dividida"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Com a tela dividida: substituir um app por outro"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para o próximo idioma"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Câmara bloqueada"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmera e microfone bloqueados"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Não perturbe"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Presença do usuário detectada"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defina o app de notas padrão nas Configurações"</string>
     <string name="install_app" msgid="5066668100199613936">"Instalar o app"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
index ae2bd05..453d813 100644
--- a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Desativado"</item>
     <item msgid="5137565285664080143">"Ativado"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 44637a3..b627090 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"A capacidade de fazer capturas de ecrã foi bloqueada pelo administrador de TI"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de ecrã"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Partilhar"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Partilhar captura de ecrã"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar mais"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignorar captura de ecrã"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"A analisar o rosto…"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
     <string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logótipo da app"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Tentar novamente"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toque para cancelar a autenticação."</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Prima ícone de desbloqueio para continuar"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticação"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Mais opções"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrão"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar palavra-passe"</string>
@@ -257,7 +260,7 @@
     <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"O ecrã está bloqueado na orientação horizontal."</string>
     <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"O ecrã está bloqueado na orientação vertical."</string>
     <string name="dessert_case" msgid="9104973640704357717">"Vitrina de sobremesas"</string>
-    <string name="start_dreams" msgid="9131802557946276718">"Proteção de ecrã"</string>
+    <string name="start_dreams" msgid="9131802557946276718">"Proteção ecrã"</string>
     <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
     <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Não incomodar"</string>
     <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
@@ -282,9 +285,9 @@
     <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"Rotação auto."</string>
     <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Rodar o ecrã automaticamente"</string>
     <string name="quick_settings_location_label" msgid="2621868789013389163">"Localização"</string>
-    <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Proteção de ecrã"</string>
+    <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Proteção ecrã"</string>
     <string name="quick_settings_camera_label" msgid="5612076679385269339">"Acesso câmara"</string>
-    <string name="quick_settings_mic_label" msgid="8392773746295266375">"Ac. microfone"</string>
+    <string name="quick_settings_mic_label" msgid="8392773746295266375">"Acesso micro"</string>
     <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Disponível"</string>
     <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Bloqueado"</string>
     <string name="quick_settings_media_device_label" msgid="8034019242363789941">"Dispositivo multimédia"</string>
@@ -326,13 +329,13 @@
     <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Apps trabalho"</string>
     <string name="quick_settings_work_mode_paused_state" msgid="6681788236383735976">"Pausado"</string>
     <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Luz noturna"</string>
-    <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Ativ. ao pôr-do-sol"</string>
+    <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Ativa ao pôr do sol"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Até ao amanhecer"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Ativada à(s) <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Até à(s) <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"Tema escuro"</string>
     <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"Poup. bateria"</string>
-    <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"Ativ. ao pôr do sol"</string>
+    <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"Ativa ao pôr do sol"</string>
     <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Até ao amanhecer"</string>
     <string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Ativado à(s) <xliff:g id="TIME">%s</xliff:g>."</string>
     <string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Até à(s) <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -360,12 +363,19 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Padrão"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Médio"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Dispositivos auditivos"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Desbloquear o microfone do dispositivo?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Desbloquear a câmara do dispositivo?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Quer desbloquear a câmara e o microfone?"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar o seu microfone."</string>
-    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar a sua câmara."</string>
-    <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar a sua câmara ou microfone."</string>
+    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Esta ação desbloqueia o acesso de todas as apps e serviços com autorização para usar o microfone."</string>
+    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Esta ação desbloqueia o acesso de todas as apps e serviços com autorização para usar a câmara."</string>
+    <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Esta ação desbloqueia o acesso de todas as apps e serviços com autorização para usar a câmara ou microfone."</string>
     <string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"O microfone está bloqueado"</string>
     <string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"A câmara está bloqueada"</string>
     <string name="sensor_privacy_start_use_mic_camera_blocked_dialog_title" msgid="195236134743281973">"O microfone e a câmara estão bloqueados"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Remover"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adicionar widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Concluir"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Adicionar widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Tenha acesso rápido aos widgets das suas apps favoritas sem desbloquear o tablet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permitir qualquer widget no ecrã de bloqueio?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir definições"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Retomar apps de trabalho?"</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Este dispositivo é gerido pelos teus pais, que podem ver e gerir informações como as apps que utilizas, a tua localização e o tempo de utilização."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Mantido desbloqueado pelo TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Proteção contra roubo\nDisp. bloq., muitas tentativas de desb."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"O dispositivo foi bloqueado; demasiadas tentativas de autenticação"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispositivo bloqueado\nA autenticação falhou"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Definições de som"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Multim. legendas automáticas"</string>
@@ -566,7 +579,7 @@
     <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Para soltar esta app, toque sem soltar nos botões Anterior e Página inicial."</string>
     <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Para soltar esta app, deslize rapidamente para cima sem soltar."</string>
     <string name="screen_pinning_positive" msgid="3285785989665266984">"OK"</string>
-    <string name="screen_pinning_negative" msgid="6882816864569211666">"Não, obrigado"</string>
+    <string name="screen_pinning_negative" msgid="6882816864569211666">"Não"</string>
     <string name="screen_pinning_start" msgid="7483998671383371313">"App fixada"</string>
     <string name="screen_pinning_exit" msgid="4553787518387346893">"App solta"</string>
     <string name="stream_voice_call" msgid="7468348170702375660">"Chamada"</string>
@@ -582,11 +595,9 @@
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Vibrar"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Desativar som"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Transmitir"</string>
-    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponível porque o toque está desat."</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponível com toque desativado"</string>
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Indisponível porque Não incomodar está ativado"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Indisponível com Não incomodar ativado"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toque para reativar o som."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toque para ativar a vibração. Os serviços de acessibilidade podem ser silenciados."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toque para desativar o som. Os serviços de acessibilidade podem ser silenciados."</string>
@@ -603,18 +614,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Controlos de volume de %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"As chamadas e as notificações tocam (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Introduzir definições de saída"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Controlos de deslize do volume expandidos"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Controlos de deslize do volume reduzidos"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"desativar o som de %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"reativar o som de %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"A ouvir <xliff:g id="LABEL">%s</xliff:g> em"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"O áudio será ouv. em"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Áudio ouvido em:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizador da interface do sistema"</string>
     <string name="status_bar" msgid="4357390266055077437">"Barra de estado"</string>
     <string name="demo_mode" msgid="263484519766901593">"Modo de demonstração da IU do sistema"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Percorrer apps recentes para a frente"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Percorrer apps recentes para trás"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar barra de tarefas"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir definições"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir Assistente"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Ecrã de bloqueio"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Aceder ao ecrã dividido com a app atual para RHS"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Aceder ao ecrã dividido com a app atual para LHS"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar de ecrã dividido para ecrã inteiro"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Mude para a app à direita ou abaixo enquanto usa o ecrã dividido"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Mude para a app à esquerda ou acima enquanto usa o ecrã dividido"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Durante o ecrã dividido: substituir uma app por outra"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para idioma seguinte"</string>
@@ -1088,7 +1095,7 @@
     <string name="media_output_dialog_multiple_devices" msgid="1093771040315422350">"<xliff:g id="COUNT">%1$d</xliff:g> dispositivos selecionados"</string>
     <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(desligado)"</string>
     <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Não é possível mudar. Toque para tentar novamente."</string>
-    <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Ligue um dispositivo"</string>
+    <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Ligar um dispositivo"</string>
     <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Para transmitir esta sessão, abra a app."</string>
     <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App desconhecida"</string>
     <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Parar transmissão"</string>
@@ -1260,14 +1267,13 @@
     <string name="call_from_work_profile_action" msgid="2937701298133010724">"Mudar para perfil de trabalho"</string>
     <string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"Instalar app telefone de trabalho"</string>
     <string name="call_from_work_profile_close" msgid="5830072964434474143">"Cancelar"</string>
-    <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar o ecrã de bloqueio"</string>
+    <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar ecrã de bloqueio"</string>
     <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloqueie para personalizar o ecrã de bloqueio"</string>
     <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi indisponível"</string>
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Câmara bloqueada"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmara e microfone bloqueados"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Não incomodar"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Quando deteta a presença do utilizador"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Predefina a app de notas nas Definições"</string>
     <string name="install_app" msgid="5066668100199613936">"Instalar app"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
index 666963b..34a5ed7 100644
--- a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
@@ -63,8 +63,8 @@
   </string-array>
   <string-array name="tile_states_rotation">
     <item msgid="4578491772376121579">"Indisponível"</item>
-    <item msgid="5776427577477729185">"Desligado"</item>
-    <item msgid="7105052717007227415">"Ligado"</item>
+    <item msgid="5776427577477729185">"Desligada"</item>
+    <item msgid="7105052717007227415">"Ligada"</item>
   </string-array>
   <string-array name="tile_states_bt">
     <item msgid="5330252067413512277">"Indisponível"</item>
@@ -118,7 +118,7 @@
   </string-array>
   <string-array name="tile_states_night">
     <item msgid="7857498964264855466">"Indisponível"</item>
-    <item msgid="2744885441164350155">"Desligado"</item>
+    <item msgid="2744885441164350155">"Desligada"</item>
     <item msgid="151121227514952197">"Ligado"</item>
   </string-array>
   <string-array name="tile_states_screenrecord">
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Desativado"</item>
     <item msgid="5137565285664080143">"Ativado"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Indisponíveis"</item>
+    <item msgid="3079622119444911877">"Desativados"</item>
+    <item msgid="3028994095749238254">"Ativados"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 83d523a..04bdf14 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"As capturas de tela foram bloqueadas pelo administrador de TI"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de tela"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Compartilhar"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Compartilhar captura de tela"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar mais"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dispensar captura de tela"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Verificando rosto"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
     <string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotipo do app"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Tentar novamente"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toque para cancelar a autenticação"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Pressione o ícone para continuar."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticação"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Mais opções"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrão"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar senha"</string>
@@ -355,11 +358,19 @@
     <item msgid="1627504621139124393">"Interface do usuário"</item>
     <item msgid="8309220355268900335">"Bateria"</item>
   </string-array>
-    <string name="quick_settings_onehanded_label" msgid="2416537930246274991">"Modo para uma mão"</string>
+    <string name="quick_settings_onehanded_label" msgid="2416537930246274991">"Modo uma mão"</string>
     <string name="quick_settings_contrast_label" msgid="988087460210159123">"Contraste"</string>
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Padrão"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Médio"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Desbloquear o microfone do dispositivo?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Desbloquear a câmera do dispositivo?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Desbloquear a câmera e o microfone do dispositivo?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Remover"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adicionar widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Concluído"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Adicionar widgets"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Tenha acesso rápido aos widgets de seus apps favoritos sem desbloquear o tablet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permitir qualquer widget na tela de bloqueio?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir as configurações"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Reativar apps de trabalho?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Este dispositivo é gerenciado pelo seu familiar responsável, que pode ver e gerenciar informações como os apps que você usa, sua localização e seu tempo de uso."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Desbloqueado pelo TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Proteção contra roubo\nDispositivo bloqueado por tentativas de desbloqueio em excesso"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"O dispositivo foi bloqueado devido a muitas tentativas de autenticação"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispositivo bloqueado\nA autenticação falhou"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Configurações de som"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Transcrição automática"</string>
@@ -582,11 +596,9 @@
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Vibrar"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Desativar som"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Transmitir"</string>
-    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponível com o toque foi silenciado"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponível com o toque silenciado"</string>
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Indisponível porque o Não perturbe está ativado"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Indisponível porque o Não perturbe está ativado"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toque para ativar o som."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toque para configurar para vibrar. É possível que os serviços de acessibilidade sejam silenciados."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Controles de volume %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Chamadas e notificações farão o smartphone tocar (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Inserir configurações de saída"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Controles deslizantes de volume abertos"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Controles deslizantes de volume fechados"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"desativar o som de %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"ativar o som de %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Tocando <xliff:g id="LABEL">%s</xliff:g> em"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"O áudio vai tocar em"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizador System UI"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Avançar pela lista de apps recentes"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Voltar pela lista de apps recentes"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar a Barra de tarefas"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configurações"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir o Google Assistente"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Tela de bloqueio"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Usar a tela dividida com o app atual à direita"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Usar a tela dividida com o app atual à esquerda"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar da tela dividida para a tela cheia"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Mude para o app à direita ou abaixo ao usar a tela dividida"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Mude para o app à esquerda ou acima ao usar a tela dividida"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Com a tela dividida: substituir um app por outro"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para o próximo idioma"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Câmara bloqueada"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmera e microfone bloqueados"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Não perturbe"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Presença do usuário detectada"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defina o app de notas padrão nas Configurações"</string>
     <string name="install_app" msgid="5066668100199613936">"Instalar o app"</string>
diff --git a/packages/SystemUI/res/values-pt/tiles_states_strings.xml b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
index ae2bd05..453d813 100644
--- a/packages/SystemUI/res/values-pt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Desativado"</item>
     <item msgid="5137565285664080143">"Ativado"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 24bec4a..7d65f96a 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Administratorul IT a blocat crearea capturilor de ecran"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Editează"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Editează captura de ecran"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Distribuie"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Trimite captura de ecran"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Surprinde mai mult"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Închide captura de ecran"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanarea chipului"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Trimite"</string>
     <string name="cancel" msgid="1089011503403416730">"Anulează"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Sigla aplicației"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmă"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Încearcă din nou"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Atinge pentru a anula autentificarea"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Chip recunoscut. Apasă pictograma Deblocare ca să continui."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentificat"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Anulează autentificarea"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Mai multe opțiuni"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Folosește PIN-ul"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Folosește modelul"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Folosește parola"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Mediu"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Ridicat"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Deblochezi microfonul dispozitivului?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Deblochezi camera dispozitivului?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Deblochezi camera și microfonul dispozitivului?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Elimină"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adaugă un widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gata"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Adaugă widgeturi"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Accesează rapid widgeturile aplicațiilor preferate fără să deblochezi tableta."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permiți vreun widget pe ecranul de blocare?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Deschide setările"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Reactivezi aplicații de lucru?"</string>
@@ -449,13 +462,13 @@
     <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Începe din nou"</string>
     <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"Da, continuă"</string>
     <string name="guest_notification_app_name" msgid="2110425506754205509">"Modul pentru invitați"</string>
-    <string name="guest_notification_session_active" msgid="5567273684713471450">"Folosește modul pentru invitați"</string>
+    <string name="guest_notification_session_active" msgid="5567273684713471450">"Folosești modul pentru invitați"</string>
     <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Dacă adaugi un utilizator nou, vei ieși din modul pentru invitați și se vor șterge toate aplicațiile și datele din sesiunea actuală pentru invitați."</string>
     <string name="user_limit_reached_title" msgid="2429229448830346057">"Ai atins limita de utilizatori"</string>
     <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Se poate crea doar un utilizator.}few{Poți adăuga până la # utilizatori.}other{Poți adăuga până la # de utilizatori.}}"</string>
     <string name="user_remove_user_title" msgid="9124124694835811874">"Excluzi utilizatorul?"</string>
     <string name="user_remove_user_message" msgid="6702834122128031833">"Toate aplicațiile și datele acestui utilizator vor fi șterse."</string>
-    <string name="user_remove_user_remove" msgid="8387386066949061256">"Elimină"</string>
+    <string name="user_remove_user_remove" msgid="8387386066949061256">"Exclude"</string>
     <string name="media_projection_dialog_title" msgid="3316063622495360646">"Începi să înregistrezi sau să proiectezi cu <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
     <string name="media_projection_dialog_warning" msgid="1303664408388363598">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrezi sau proiectezi. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redai."</string>
     <string name="media_projection_sys_service_dialog_title" msgid="3751133258891897878">"Începi să înregistrezi sau să proiectezi?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Dispozitivul este gestionat de unul dintre părinți. Părintele poate să vadă și să gestioneze informații cum ar fi aplicațiile pe care le folosești, locația ta și durata de folosire a dispozitivului."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Deblocat de TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Protecție anti-furt\nDispozitiv blocat, prea multe încercări de deblocare"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Dispozitivul a fost blocat. Prea multe încercări de autentificare."</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispozitiv blocat\nAutentificare nereușită"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Setări de sunet"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Adaugă subtitrări automate la fișierele media"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Blochează"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Proiectează"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponibil; soneria este dezactivată"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Indisponibil; funcția Nu deranja e activată"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Indisponibil; funcția Nu deranja e activată"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Atinge pentru a activa sunetul."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Atinge pentru a seta vibrarea. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Atinge pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrații"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Comenzi de volum pentru %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Apelurile și notificările vor suna (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Introdu setările de ieșire"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Glisoare de volum extinse"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Glisoare de volum restrânse"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"dezactivează sunetul pentru %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"activează sunetul pentru %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Se redă <xliff:g id="LABEL">%s</xliff:g> pe"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Conținutul audio se va reda pe"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Parcurge aplicațiile recente înainte"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Parcurge aplicațiile recente înapoi"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Deschide lista de aplicații"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Afișează bara de activități"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Deschide setările"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Deschide Asistentul"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Ecranul de blocare"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Accesează ecranul împărțit cu aplicația actuală în dreapta"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Accesează ecranul împărțit cu aplicația actuală în stânga"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Comută de la ecranul împărțit la ecranul complet"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Treci la aplicația din dreapta sau de mai jos cu ecranul împărțit"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Treci la aplicația din stânga sau de mai sus cu ecranul împărțit"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"În modul ecran împărțit: înlocuiește o aplicație cu alta"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Introducere"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Comută la următoarea limbă"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera foto a fost blocată"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera foto și microfonul sunt blocate"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfonul a fost blocat"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Nu deranja"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"S-a detectat prezența utilizatorului"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setează aplicația prestabilită de note din Setări"</string>
     <string name="install_app" msgid="5066668100199613936">"Instalează aplicația"</string>
diff --git a/packages/SystemUI/res/values-ro/tiles_states_strings.xml b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
index ed8285d..5b96618 100644
--- a/packages/SystemUI/res/values-ro/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Dezactivat"</item>
     <item msgid="5137565285664080143">"Activat"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 584a7da..5e47464 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Системный администратор запретил делать скриншоты."</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Изменить"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Изменить скриншот"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Поделиться"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Поделиться скриншотом"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Увеличить площадь скриншота"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Закрыть скриншот"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Сканирование лица"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Отправить"</string>
     <string name="cancel" msgid="1089011503403416730">"Отмена"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Логотип приложения"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Подтвердить"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Повторить попытку"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Нажмите, чтобы отменить аутентификацию"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицо распознано. Нажмите на значок разблокировки."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аутентификация выполнена"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Отмена распознавания лица"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Ещё"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-код"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Использовать графический ключ"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Использовать пароль"</string>
@@ -285,7 +288,7 @@
     <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Заставка"</string>
     <string name="quick_settings_camera_label" msgid="5612076679385269339">"Доступ к камере"</string>
     <string name="quick_settings_mic_label" msgid="8392773746295266375">"Доступ к микрофону"</string>
-    <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Доступно"</string>
+    <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Есть"</string>
     <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Заблокировано"</string>
     <string name="quick_settings_media_device_label" msgid="8034019242363789941">"Режим медиа"</string>
     <string name="quick_settings_user_title" msgid="8673045967216204537">"Пользователь"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандартная"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Средняя"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Высокая"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Разблокировать микрофон устройства?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Разблокировать камеру устройства?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Разблокировать камеру и микрофон устройства?"</string>
@@ -437,10 +448,10 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Удалить"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Добавить виджет"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string>
-    <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) -->
-    <skip />
-    <!-- no translation found for button_text_to_open_settings (1987729256950941628) -->
-    <skip />
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Добавить виджеты"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Быстрый доступ к виджетам любимых приложений, даже когда планшет заблокирован"</string>
+    <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Разрешить добавлять любые виджеты на заблокированный экран?"</string>
+    <string name="button_text_to_open_settings" msgid="1987729256950941628">"Открыть настройки"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Включить рабочие приложения?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"Включить"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Сменить пользователя."</string>
@@ -540,7 +551,8 @@
     <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">"Разблокировано агентом доверия"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Защита от кражи\nУстр-во заблокировано. Слишком много попыток."</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Устройство заблокировано. Слишком много попыток аутентификации."</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Устройство заблокировано\nСбой аутентификации"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Настройки звука"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматически добавлять субтитры"</string>
@@ -584,11 +596,9 @@
     <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Вибрация"</string>
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Без звука"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Трансляция"</string>
-    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недоступно, когда отключен звук вызовов"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недоступно в беззвучном режиме"</string>
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Недоступно при включенном режиме \"Не беспокоить\"."</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Недоступно при включенном режиме \"Не беспокоить\"."</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Нажмите, чтобы включить звук."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Нажмите, чтобы включить вибрацию. Специальные возможности могут прекратить работу."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Нажмите, чтобы выключить звук. Специальные возможности могут прекратить работу."</string>
@@ -605,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"включить вибрацию"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s: регулировка громкости"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Для звонков и уведомлений включен звук (уровень громкости: <xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Перейти к настройкам вывода аудио"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Ползунки для регулировки громкости развернуты"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Ползунки для регулировки громкости свернуты"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"отключить звук: %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"включить звук: %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> – запущено здесь:"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Проигрывание аудио:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -761,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Прокрутить вперед список недавних приложений"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Прокрутить назад список недавних приложений"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Открыть список приложений"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Показать панель задач"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Открыть настройки"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Открыть Ассистента"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Заблокировать экран"</string>
@@ -770,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Включить разделение экрана с текущим приложением справа"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Включить разделение экрана с текущим приложением слева"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Изменить режим разделения экрана на полноэкранный режим"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Перейти к приложению справа или внизу на разделенном экране"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Перейти к приложению слева или вверху на разделенном экране"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"В режиме разделения экрана заменить одно приложение другим"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ввод"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Выбрать следующий язык"</string>
@@ -1268,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера заблокирована"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера и микрофон заблокированы"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон заблокирован"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Не беспокоить"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Обнаружен пользователь"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайте стандартное приложение для заметок в настройках."</string>
     <string name="install_app" msgid="5066668100199613936">"Установить приложение"</string>
diff --git a/packages/SystemUI/res/values-ru/tiles_states_strings.xml b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
index 48ecf26..cdc4a98 100644
--- a/packages/SystemUI/res/values-ru/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Выключено"</item>
     <item msgid="5137565285664080143">"Включено"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 30f7db3..5eea02c 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"බෙදා ගන්න"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"තිර රුව බෙදා ගන්න"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"තව ග්‍රහණය කරන්න"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"තිර රුව ඉවත ලන්න"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"මුහුණ ස්කෑන් කිරීම"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"යවන්න"</string>
     <string name="cancel" msgid="1089011503403416730">"අවලංගු කරන්න"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"යෙදුම් ලාංඡනය"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"තහවුරු කරන්න"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"නැවත උත්සාහ කරන්න"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"සත්‍යාපනය අවලංගු කිරීමට තට්ටු කරන්න"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"මුහුණ හඳුනා ගන්නා ලදි. ඉදිරියට යාමට අගුලු හැරීමේ නිරූපකය ඔබන්න."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"සත්‍යාපනය විය"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"සත්‍යාපනය අවලංගු කරන්න"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"තවත් විකල්ප"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN භාවිත කරන්න"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"රටාව භාවිත කරන්න"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"මුරපදය භාවිත කරන්න"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"සම්මත"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"මධ්‍යම"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"ඉහළ"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"උපාංග මයික්‍රෆෝනය අවහිර කිරීම ඉවත් කරන්නද?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"උපාංග කැමරාව අවහිර කිරීම ඉවත් කරන්නද?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"උපාංග කැමරාව සහ මයික්‍රෆෝනය අවහිර කිරීම ඉවත් කරන්නද?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"ඉවත් කරන්න"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"විජට්ටුව එක් කරන්න"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"නිමයි"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"විජට් එක් කරන්න"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"ඔබේ ටැබ්ලටය අගුළු හැරීමෙන් තොරව ඔබේ ප්‍රියතම යෙදුම් විජට් වෙත ඉක්මන් ප්‍රවේශය ලබා ගන්න."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"අගුළු තිරය මත ඕනෑම විජට් එකකට ඉඩ දෙන්න"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"සැකසීම් විවෘත කරන්න"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"කාර්ය යෙදුම් විරාම නොකරන්න ද?"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"සොරකම් ආරක්ෂණය\nඋපාංගය අගුළු දමා ඇත, අගුළු හැරීමේ උත්සාහයන් වැඩියි"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"උපාංගය අගුළු දමා ඇත, බොහෝ සත්‍යාපන උත්සාහයන් ගණනකි"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"උපාංගය අගුළු දමා ඇත\nසත්‍යාපනය අසමත් විය"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ශබ්ද සැකසීම්"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"මාධ්‍ය ස්වයංක්‍රීයව සිරස්තල"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"නිහඬ කරන්න"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"විකාශය"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"නාදය නිහඬ කර ඇති නිසා නොලැබේ"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"බාධා නොකරන්න ක්‍රියාත්මකව ඇති බැවින් ලද නොහැක"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"බාධා නොකරන්න ක්‍රියාත්මකව ඇති බැවින් ලද නොහැක"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. නිහඬ කිරීම ඉවත් කිරීමට තට්ටු කරන්න."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. කම්පනය කිරීමට තට්ටු කරන්න. ප්‍රවේශ්‍යතා සේවා නිහඬ කළ හැකිය."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. නිහඬ කිරීමට තට්ටු කරන්න. ප්‍රවේශ්‍යතා සේවා නිහඬ කළ හැකිය."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"කම්පනය"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"හඬ පරිමා පාලන %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ඇමතුම් සහ දැනුම්දීම් (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>) නාද කරනු ඇත"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"ප්‍රතිදාන සැකසීම් ඇතුල් කරන්න"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"හඬ ස්ලයිඩර දිගහැර ඇත"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"හඬ ස්ලයිඩර හකුළා ඇත"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s නිහඬ කරන්න"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s නිහඬ නොකරන්න"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> වාදනය කරන්නේ"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"ශ්‍රව්‍ය වාදනය වනු ඇත්තේ"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"පද්ධති UI සුසරකය"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"මෑත යෙදුම් හරහා ඉදිරියට කාලක්‍රම කරන්න"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"මෑත යෙදුම් හරහා ආපස්සට කාලක්‍රම කරන්න"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"යෙදුම් ලැයිස්තුව විවෘත කරන්න"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"කාර්ය තීරුව පෙන්වන්න"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"සැකසීම් විවෘත කරන්න"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"සහායක විවෘත කරන්න"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"තිරය අගුළු දමන්න"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"බෙදුම් තිරයේ සිට පූර්ණ තිරයට මාරු වන්න"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"බෙදුම් තිරය භාවිත කරන අතරතුර දකුණේ හෝ පහළින් ඇති යෙදුමට මාරු වන්න"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"බෙදුම් තිරය භාවිත කරන අතරතුර වමේ හෝ ඉහළ ඇති යෙදුමට මාරු වන්න"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"බෙදුම් තිරය අතරතුර: යෙදුමක් එකකින් තවත් එකක් ප්‍රතිස්ථාපනය කරන්න"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ආදානය"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"මීළඟ භාෂාවට මාරු වන්න"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"කැමරාව අවහිරයි"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"කැමරාව සහ මයික්‍රොෆෝනය අවහිරයි"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"මයික්‍රොෆෝනය අවහිරයි"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"බාධා නොකරන්න"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"පරිශීලක රූපාකාරය අනාවරණය වේ"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"සැකසීම් තුළ පෙරනිමි සටහන් යෙදුම සකසන්න"</string>
     <string name="install_app" msgid="5066668100199613936">"යෙදුම ස්ථාපනය කරන්න"</string>
diff --git a/packages/SystemUI/res/values-si/tiles_states_strings.xml b/packages/SystemUI/res/values-si/tiles_states_strings.xml
index cbbc0e7..e7e9034 100644
--- a/packages/SystemUI/res/values-si/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-si/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"ක්‍රියාවිරහිතයි"</item>
     <item msgid="5137565285664080143">"ක්‍රියාත්මකයි"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 21a0122..ea1a8f8 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Vytváranie snímok obrazovky zablokoval váš správca IT"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Upraviť"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Upraviť snímku obrazovky"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Zdieľať"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Zdieľať snímku obrazovky"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Zachytiť viac"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zavrieť snímku obrazovky"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Skenovanie tváre"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Odoslať"</string>
     <string name="cancel" msgid="1089011503403416730">"Zrušiť"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo aplikácie"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potvrdiť"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Skúsiť znova"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Klepnutím zrušíte overenie"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Tvár bola rozpoznaná. Pokračujte stlačením ikony odomknutia"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Overené"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Zrušiť overenie"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Ďalšie možnosti"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Použiť PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Použiť vzor"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Použiť heslo"</string>
@@ -326,7 +329,7 @@
     <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Pracovné aplikácie"</string>
     <string name="quick_settings_work_mode_paused_state" msgid="6681788236383735976">"Pozastavené"</string>
     <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Nočný režim"</string>
-    <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Zap. pri záp. slnka"</string>
+    <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Pri západe slnka"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Do východu slnka"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Od <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Štandardný"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Stredný"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Vysoký"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Načúvacie zariadenia"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Chcete odblokovať mikrofón zariadenia?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Chcete odblokovať kameru zariadenia?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Chcete odblokovať fotoaparát a mikrofón zariadenia?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Odstrániť"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Pridať miniaplikáciu"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hotovo"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Pridať miniaplikácie"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Majte k dispozícii rýchly prístup k svojim obľúbeným miniaplikáciám bez odomykania tabletu"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Chcete povoliť akúkoľvek miniaplikáciu na uzamknutej obrazovke?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvoriť nastavenia"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Zrušiť pozast. prac. aplikácií?"</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Toto zariadenie spravuje tvoj rodič. Vidí a môže spravovať informácie, napríklad aplikácie, ktoré používaš, tvoju polohu a čas používania."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Odomknutie udržiava TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Ochrana pred krádežou\nUzamknuté, priveľa pokusov o odomknutie"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Zariadenie bolo uzamknuté, príliš mnoho pokusov o overenie"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Zariadenie je uzamknuté\nOverenie sa nepodarilo"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Nastavenia zvuku"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatické titulkovanie médií"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Vypnúť zvuk"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Prenos"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nedostupné, pretože je vypnuté zvonenie"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nedostupné, pretože je zapnutý režim bez vyrušení"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Nedostupné, zapnutý režim bez vyrušení"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Klepnutím zapnite zvuk."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Klepnutím aktivujte režim vibrovania. Služby dostupnosti je možné stlmiť."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Klepnutím vypnite zvuk. Služby dostupnosti je možné stlmiť."</string>
@@ -603,18 +614,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"zapnite vibrovanie"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Ovládacie prvky hlasitosti %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Hovory a upozornenia spustia zvonenie (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Zadať nastavenia výstupu"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Posúvače hlasitosti sú rozbalené"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Posúvače hlasitosti sú zbalené"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"vypnete zvuk %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"zapnete zvuk %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> sa prehráva v:"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk sa prehrá v:"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk sa prehrá cez"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Tuner používateľského rozhrania systému"</string>
     <string name="status_bar" msgid="4357390266055077437">"Stavový riadok"</string>
     <string name="demo_mode" msgid="263484519766901593">"Ukážka používateľského rozhrania systému"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cyklické prechádzanie dopredu po nedávnych aplikáciách"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Cyklické prechádzanie dozadu po nedávnych aplikáciách"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvorenie zoznamu aplikácií"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Zobrazenie panela aplikácií"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvorenie nastavení"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvorenie Asistenta"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Zamknúť obrazovku"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Rozdelenie obrazovky s aktuálnou aplikáciou vpravo"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Rozdelenie obrazovky s aktuálnou aplikáciou vľavo"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prepnutie rozdelenej obrazovky na celú"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Prechod na aplikáciu vpravo alebo dole pri rozdelenej obrazovke"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Prechod na aplikáciu vľavo alebo hore pri rozdelenej obrazovke"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Počas rozdelenej obrazovky: nahradenie aplikácie inou"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vstup"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Prepnutie na ďalší jazyk"</string>
@@ -1165,7 +1172,7 @@
     <string name="mobile_data_connection_active" msgid="944490013299018227">"Pripojené"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Dočasne pripojené"</string>
     <string name="mobile_data_poor_connection" msgid="819617772268371434">"Slabé pripojenie"</string>
-    <string name="mobile_data_off_summary" msgid="3663995422004150567">"Automatické pripojenie cez mobilné dáta nefunguje"</string>
+    <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobilné dáta sa nepripájajú automaticky"</string>
     <string name="mobile_data_no_connection" msgid="1713872434869947377">"Bez pripojenia"</string>
     <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nie sú k dispozícii žiadne ďalšie siete"</string>
     <string name="all_network_unavailable" msgid="4112774339909373349">"Nie sú k dispozícii žiadne siete"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokovaná"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera a mikrofón sú blokované"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofón je blokovaný"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Režim bez vyrušení"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Bola rozpoznaná prítomnosť používateľa"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nastavte predvolenú aplikáciu na poznámky v Nastaveniach"</string>
     <string name="install_app" msgid="5066668100199613936">"Inštalovať aplikáciu"</string>
diff --git a/packages/SystemUI/res/values-sk/tiles_states_strings.xml b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
index 50f5c25..6b5af80 100644
--- a/packages/SystemUI/res/values-sk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Vypnuté"</item>
     <item msgid="5137565285664080143">"Zapnuté"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Nedostupné"</item>
+    <item msgid="3079622119444911877">"Vypnuté"</item>
+    <item msgid="3028994095749238254">"Zapnuté"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 06774ed..514d2f9 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Skrbnik za IT je onemogočil zajemanje posnetkov zaslona."</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Uredi"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Urejanje posnetka zaslona"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Deli"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Deljenje posnetka zaslona"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Zajemi več"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Opusti posnetek zaslona"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Optično branje obraza"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Pošlji"</string>
     <string name="cancel" msgid="1089011503403416730">"Prekliči"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotip aplikacije"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potrdite"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Poskusi znova"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Če želite preklicati preverjanje pristnosti, se dotaknite"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Obraz je prepoznan. Za nadaljevanje pritisnite ikono za odklepanje."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Preverjena pristnost"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Prekliči preverjanje pristnosti"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Več možnosti"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Uporabi kodo PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Uporabi vzorec"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Uporabi geslo"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardni"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Srednji"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Visok"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Želite odblokirati mikrofon v napravi?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Želite odblokirati fotoaparat v napravi?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Želite odblokirati fotoaparat in mikrofon v napravi?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Odstrani"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodajanje pripomočka"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Končano"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Dodajte pripomočke"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Hitro dostopajte do priljubljenih pripomočkov za aplikacije brez odklepanja tabličnega računalnika."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Želite dovoliti poljubne pripomočke na zaklenjenem zaslonu?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Odpri nastavitve"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Želite znova aktivirati delovne aplikacije?"</string>
@@ -469,7 +482,7 @@
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Začni"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je onemogočila to možnost"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Želite začeti predvajati?"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Pri predvajanju ima Android dostop do vsega, kar je prikazano na zaslonu ali se predvaja v napravi. Zato bodite previdni z gesli, podatki za plačilo, sporočili, fotografijami ter z zvokom in videom."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Pri predvajanju ima Android dostop do vsega, kar je prikazano na zaslonu ali se predvaja v napravi, zato bodite previdni z gesli, podatki za plačilo, sporočili, fotografijami ter z zvokom in videom."</string>
     <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Pri predvajanju aplikacije ima Android dostop do vsega, kar je prikazano ali predvajano v tej aplikaciji, zato bodite previdni z gesli, podatki za plačilo, sporočili, fotografijami ter z zvokom in videom."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Začni predvajanje"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Želite začeti deliti?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"To napravo upravlja tvoj starš. Lahko si ogleda in upravlja podatke, na primer katere aplikacije uporabljaš, tvojo lokacijo in koliko časa uporabljaš napravo."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent ohranja odklenjeno"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Zaščita pred krajo\nNaprava je zaklenjena, preveč poskusov odklepanja"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Naprava se je zaklenila, preveč poskusov preverjanja pristnosti"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Naprava se je zaklenila\nPreverjanje pristnosti ni uspelo"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Nastavitve zvoka"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Sam. podnapisi predstavnosti"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Utišano"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Predvajanje"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ni na voljo, ker je zvonjenje izklopljeno"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Ni na voljo, ker je vklopljen način »Ne moti«"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Ni na voljo, ker je vklopljen način »Ne moti«"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Dotaknite se, če želite vklopiti zvok."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Dotaknite se, če želite nastaviti vibriranje. V storitvah za dostopnost bo morda izklopljen zvok."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Dotaknite se, če želite izklopiti zvok. V storitvah za dostopnost bo morda izklopljen zvok."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibriranje"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Kontrolniki glasnosti za %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Klici in obvestila bodo pozvonili (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Vnos izhodnih nastavitev"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Razširitev drsnikov za glasnost"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Strnitev drsnikov za glasnost"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"izklop zvoka %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"vklop zvoka %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Predvajanje »<xliff:g id="LABEL">%s</xliff:g>« v"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvok bo predvajan v"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Uglaševalnik uporabniškega vmesnika sistema"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Pomikanje naprej po nedavnih aplikacijah"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Pomikanje nazaj po nedavnih aplikacijah"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Odpiranje seznama aplikacij"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Prikaz opravilne vrstice"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Odpiranje nastavitev"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Odpiranje Pomočnika"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Zaklepanje zaslona"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Vklop razdeljenega zaslona s trenutno aplikacijo na desni"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Vklop razdeljenega zaslona s trenutno aplikacijo na levi"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Preklop iz razdeljenega zaslona v celozaslonski način"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Preklop na aplikacijo desno ali spodaj med uporabo razdeljenega zaslona"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Preklop na aplikacijo levo ali zgoraj med uporabo razdeljenega zaslona"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Pri razdeljenem zaslonu: medsebojna zamenjava aplikacij"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vnosna naprava"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Preklop na naslednji jezik"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Fotoaparat je blokiran."</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Fotoaparat in mikrofon sta blokirana."</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran."</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Ne moti"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Zaznana je prisotnost uporabnika"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nastavite privzeto aplikacijo za zapiske v nastavitvah."</string>
     <string name="install_app" msgid="5066668100199613936">"Namesti aplikacijo"</string>
diff --git a/packages/SystemUI/res/values-sl/tiles_states_strings.xml b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
index 33ba216..9f9175e 100644
--- a/packages/SystemUI/res/values-sl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Izklopljeno"</item>
     <item msgid="5137565285664080143">"Vklopljeno"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index b541c47e..c13d76b 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Shkrepja e pamjeve të ekranit është bllokuar nga administratori i teknologjisë së informacionit"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Modifiko"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Modifiko pamjen e ekranit"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Ndaj"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Ndaj pamjen e ekranit"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Regjistro më shumë"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Hiq pamjen e ekranit"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Po skanon fytyrën"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Dërgo"</string>
     <string name="cancel" msgid="1089011503403416730">"Anulo"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logoja e aplikacionit"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Konfirmo"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Provo përsëri"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Trokit për të anuluar vërtetimin"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Fytyra u njoh. Shtyp ikonën e shkyçjes për të vazhduar."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"U vërtetua"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Anulo vërtetimin"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Opsione të tjera…"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Përdor kodin PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Përdor motivin"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Përdor fjalëkalimin"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Mesatar"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"I lartë"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Të zhbllokohet mikrofoni i pajisjes?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Të zhbllokohet kamera e pajisjes?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Të zhbllokohen kamera dhe mikrofoni i pajisjes?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Hiq"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Shto miniaplikacionin"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"U krye"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Shto miniaplikacionet"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Merr qasjen e shpejtë në miniaplikacionet e tua të preferuara pa e shkyçur tabletin."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Të lejohet ndonjë miniaplikacion te ekrani i kyçjes?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Hap cilësimet"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Hiq nga pauza apl. e punës?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Kjo pajisje menaxhohet nga prindi yt. Prindi yt mund të shikojë dhe menaxhojë informacionet, si p.sh. aplikacionet që përdor, vendndodhjen tënde dhe kohën para ekranit."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Mbajtur shkyçur nga TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Mbrojtje nga vjedhja\nPajisja u kyç. Shumë përpjekje shkyçjeje"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Pajisja u kyç. Shumë përpjekje vërtetimi"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Pajisja është kyçur\nVërtetimi dështoi"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Cilësimet e zërit"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Media me titra automatike"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Pa zë"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Transmeto"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nuk ofrohet; ziles i është hequr zëri"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nuk ofrohet; \"Mos shqetëso\" është aktiv"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Nuk ofrohet; \"Mos shqetëso\" është aktiv"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Trokit për të aktivizuar."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Trokit për ta caktuar te dridhja. Shërbimet e qasshmërisë mund të çaktivizohen."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Trokit për të çaktivizuar. Shërbimet e qasshmërisë mund të çaktivizohen."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"lësho dridhje"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Kontrollet e volumit %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Do të bjerë zilja për telefonatat dhe njoftimet (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Hyr te cilësimet e daljes"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Rrëshqitësit e volumit u zgjeruan"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Rrëshqitësit e volumit u palosën"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"çaktivizo audion: %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"aktivizo audion: %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Po luhet <xliff:g id="LABEL">%s</xliff:g> në"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Do të luhet audio në"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Lëviz përpara përmes aplikacioneve të fundit"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Lëviz prapa përmes aplikacioneve të fundit"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Hap listën e aplikacioneve"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Shfaq shiritin e detyrave"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Hap cilësimet"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Hap \"Asistentin\""</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Ekrani i kyçjes"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Hyr në ekranin e ndarë me aplikacionin aktual në anën e djathtë"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Hyr në ekranin e ndarë me aplikacionin aktual në anën e majtë"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Kalo nga ekrani i ndarë në ekranin e plotë"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Kalo tek aplikacioni djathtas ose poshtë kur përdor ekranin e ndarë"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Kalo tek aplikacioni në të majtë ose sipër kur përdor ekranin e ndarë"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Gjatë ekranit të ndarë: zëvendëso një aplikacion me një tjetër"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Hyrja"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Kalo te gjuha tjetër"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera u bllokua"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dhe mikrofoni u bllokuan"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoni u bllokua"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Mos shqetëso"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Është zbuluar prania e përdoruesit"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Cakto aplikacionin e parazgjedhur të shënimeve te \"Cilësimet\""</string>
     <string name="install_app" msgid="5066668100199613936">"Instalo aplikacionin"</string>
diff --git a/packages/SystemUI/res/values-sq/tiles_states_strings.xml b/packages/SystemUI/res/values-sq/tiles_states_strings.xml
index fa06795..aa4832d 100644
--- a/packages/SystemUI/res/values-sq/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sq/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Joaktive"</item>
     <item msgid="5137565285664080143">"Aktive"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 3ae30b5..bc6642a 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ИТ администратор блокира прављење снимака екрана"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Измени"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Измените снимак екрана"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Делите"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Делите снимак екрана"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Снимите још"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Одбаците снимак екрана"</string>
@@ -104,8 +105,8 @@
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Обрађујемо видео снимка екрана"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"Обавештење о сесији снимања екрана је активно"</string>
     <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Желите да започнете снимање?"</string>
-    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају док снимате. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Када снимате апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
+    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају док снимате. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Када снимате апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Започни снимање"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Снимај звук"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Звук уређаја"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Скенирање лица"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Пошаљи"</string>
     <string name="cancel" msgid="1089011503403416730">"Откажи"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Логотип апликације"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Потврди"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Пробај поново"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Додирните да бисте отказали потврду идентитета"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лице препознато. Притисните икону откључавања за наставак."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Идентитет је потврђен"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Откажите потврду идентитета"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Још опција"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Користите PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Користите шаблон"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Користите лозинку"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандардно"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Средње"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Високо"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Слушни апарати"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Желите да одблокирате микрофон уређаја?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Желите да одблокирате камеру уређаја?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Желите да одблокирате камеру и микрофон уређаја?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Уклони"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Додај виџет"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Додај виџете"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Брзо приступајте омиљеним виџетима за апликације без откључавања таблета."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Желите да дозволите све виџете на закључаном екрану?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Отвори подешавања"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Укључити пословне апликације?"</string>
@@ -464,17 +476,17 @@
     <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Једна апликација"</string>
     <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Делите или снимите апликацију"</string>
     <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Желите да почнете снимање или пребацивање помоћу апликације <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Када делите, снимате или пребацујете, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
-    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Када делите, снимате или пребацујете апликацију, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Када делите, снимате или пребацујете, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
+    <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Када делите, снимате или пребацујете апликацију, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Покрени"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> је онемогућила ову опцију"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Желите да започнете пребацивање?"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Када пребацујете, Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Када пребацујете апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Када пребацујете, Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Када пребацујете апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Започни пребацивање"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Желите да почнете да делите?"</string>
-    <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Када делите, снимате или пребацујете, Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
-    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Када делите, снимате или пребацујете апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
+    <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Када делите, снимате или пребацујете, Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
+    <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Када делите, снимате или пребацујете апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
     <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Покрени"</string>
     <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Дељење се зауставља када мењате апликације"</string>
     <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Дели ову апликацију"</string>
@@ -538,7 +550,8 @@
     <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">"Поуздани агент спречава закључавање"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Заштита од крађе\nЗакљ. уређај, превише покушаја откључавања"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Уређај је закључан, превише покушаја потврде идентитета"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Уређај је закључан\nПотврда идентитета није успела"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Подешавања звука"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Аутоматски титл за медије"</string>
@@ -583,16 +596,14 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Искључи звук"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Пребацивање"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недоступно јер је звук искључен"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Недоступно јер је укључен режим Не узнемиравај"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Недоступно јер је укључен режим Не узнемиравај"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Додирните да бисте укључили звук."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Додирните да бисте подесили на вибрацију. Звук услуга приступачности ће можда бити искључен."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Додирните да бисте искључили звук. Звук услуга приступачности ће можда бити искључен."</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Додирните да бисте подесили на вибрацију."</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Додирните да бисте искључили звук."</string>
-    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контрола шума"</string>
+    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контрола буке"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Просторни звук"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Искључено"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Фиксно"</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"вибрација"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Контроле за јачину звука за %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Мелодија звона за позиве и обавештења је укључена (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Унесите подешавања излазног сигнала"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Клизачи за јачину звука су проширени"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Клизачи за јачину звука су скупљени"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"искључите звук за: %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"укључите звук за: %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> се пушта на"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Звук се пушта на"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Тјунер за кориснички интерфејс система"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Прегледај недавно коришћене апликације унапред"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Прегледај недавно коришћене апликације уназад"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Отвори листу апликација"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Прикажи траку задатака"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Отвори подешавања"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Отвори помоћника"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Закључавање екрана"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Покрени подељени екран за актуелну апликацију на десној страни"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Покрени подељени екран за актуелну апликацију на левој страни"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Пређи са подељеног екрана на цео екран"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Пређите у апликацију здесна или испод док користите подељени екран"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Пређите у апликацију слева или изнад док користите подељени екран"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"У режиму подељеног екрана: замена једне апликације другом"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Унос"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Пређи на следећи језик"</string>
@@ -1153,7 +1160,7 @@
     <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Проблем са очитавањем мерача батерије"</string>
     <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Додирните за више информација"</string>
     <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Није подешен"</string>
-    <string name="accessibility_bouncer" msgid="5896923685673320070">"унесите закључавање екрана"</string>
+    <string name="accessibility_bouncer" msgid="5896923685673320070">"унесите откључавање екрана"</string>
     <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Сензор за отисак прста"</string>
     <string name="accessibility_authenticate_hint" msgid="798914151813205721">"потврдите идентитет"</string>
     <string name="accessibility_enter_hint" msgid="2617864063504824834">"унесите уређај"</string>
@@ -1175,7 +1182,7 @@
     <string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Траже се мреже…"</string>
     <string name="wifi_failed_connect_message" msgid="4161863112079000071">"Повезивање са мрежом није успело"</string>
     <string name="wifi_wont_autoconnect_for_now" msgid="5782282612749867762">"WiFi тренутно не може да се аутоматски повеже"</string>
-    <string name="see_all_networks" msgid="3773666844913168122">"Погледајте све"</string>
+    <string name="see_all_networks" msgid="3773666844913168122">"Прикажи све"</string>
     <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Да бисте променили мрежу, прекините етернет везу"</string>
     <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Ради бољег доживљаја уређаја, апликације и услуге и даље могу да траже WiFi мреже у било ком тренутку, чак и када је WiFi искључен. То можете да промените у подешавањима WiFi скенирања. "<annotation id="link">"Промените"</annotation></string>
     <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Искључи режим рада у авиону"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера је блокирана"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера и микрофон су блокирани"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон је блокиран"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Не узнемиравај"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Присуство корисника може да се открије"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Подесите подразумевану апликацију за белешке у Подешавањима"</string>
     <string name="install_app" msgid="5066668100199613936">"Инсталирај апликацију"</string>
diff --git a/packages/SystemUI/res/values-sr/tiles_states_strings.xml b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
index 55f5a3f..2acf1d2 100644
--- a/packages/SystemUI/res/values-sr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Искључено"</item>
     <item msgid="5137565285664080143">"Укључено"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Недоступно"</item>
+    <item msgid="3079622119444911877">"Искључено"</item>
+    <item msgid="3028994095749238254">"Укључено"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index e8f0d2c3..15c370c 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Möjligheten att ta skärmbilder blockeras av IT-administratören"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Redigera"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Redigera skärmbild"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Dela"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Dela skärmbild"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Fånga mer"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Stäng skärmbild"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Registrerar ansikte"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Skicka"</string>
     <string name="cancel" msgid="1089011503403416730">"Avbryt"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Appens logotyp"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bekräfta"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Försök igen"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tryck för att avbryta autentiseringen"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansiktet har identifierats. Tryck på ikonen lås upp."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentiserad"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Avbryt autentiseringen"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Fler alternativ"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Använd pinkod"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Använd mönster"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Använd lösenord"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medelhög"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Hög"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vill du återaktivera enhetens mikrofon?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vill du återaktivera enhetens kamera?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vill du återaktivera enhetens kamera och mikrofon?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Ta bort"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Lägg till widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Klar"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Lägg till widgetar"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Få snabbåtkomst till appwidgetar utan att låsa upp surfplattan."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vill du tillåta alla widgetar på låsskärmen?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Öppna inställningarna"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Vill du återuppta jobbappar?"</string>
@@ -538,7 +551,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Den här enheten hanteras av din förälder. Föräldern kan se och hantera information som vilka appar du använder, din plats och din skärmtid."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Hålls olåst med TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Stöldskydd\nEnheten har låsts på grund av för många försök"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Enheten låstes på grund av för många autentiseringsförsök"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Enheten har låsts\nAutentiseringen misslyckades"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Ljudinställningar"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Texta media automatiskt"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Dölj"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Casta"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Otillgängligt eftersom ringljudet är av"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Inte tillgängligt eftersom Stör ej är aktiverat"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Inte tillgängligt eftersom Stör ej är aktiverat"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tryck här om du vill slå på ljudet."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tryck här om du vill sätta på vibrationen. Tillgänglighetstjänster kanske inaktiveras."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tryck här om du vill stänga av ljudet. Tillgänglighetstjänsterna kanske inaktiveras."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibration"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Volymkontroller för %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Ringsignal används för samtal och aviseringar (volym: <xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Ange inställningar för utdata"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Volymreglagen har utökats"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Volymreglagen har komprimerats"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"stäng av ljudet för %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"slå på ljudet för %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Spelar upp <xliff:g id="LABEL">%s</xliff:g> på"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Ljud spelas upp på"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Inställningar för systemgränssnitt"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Bläddra framåt bland de senaste apparna"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Bläddra bakåt bland de senaste apparna"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Öppna applistan"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Se aktivitetsfält"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Öppna inställningarna"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Öppna assistenten"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Lås skärmen"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Öppna delad skärm med aktuell app till höger"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Öppna delad skärm med aktuell app till vänster"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Byt mellan delad skärm och helskärm"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Byt till appen till vänster eller nedanför när du använder delad skärm"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Byt till appen till vänster eller ovanför när du använder delad skärm"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Med delad skärm: ersätt en app med en annan"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Inmatning"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Byt till nästa språk"</string>
@@ -899,7 +907,7 @@
     <string name="mobile_data" msgid="4564407557775397216">"Mobildata"</string>
     <string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string>
     <string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
-    <string name="wifi_is_off" msgid="5389597396308001471">"wifi är inaktiverat"</string>
+    <string name="wifi_is_off" msgid="5389597396308001471">"Wifi är inaktiverat"</string>
     <string name="bt_is_off" msgid="7436344904889461591">"Bluetooth är inaktiverat"</string>
     <string name="dnd_is_off" msgid="3185706903793094463">"Stör ej är inaktiverat"</string>
     <string name="dnd_is_on" msgid="7009368176361546279">"Stör ej har aktiverats"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kameran är blockerad"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameran och mikrofonen är blockerade"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen är blockerad"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Stör ej"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Användarnärvaro har upptäckts"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ställ in en standardapp för anteckningar i inställningarna"</string>
     <string name="install_app" msgid="5066668100199613936">"Installera appen"</string>
diff --git a/packages/SystemUI/res/values-sv/tiles_states_strings.xml b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
index f921f27..522538a 100644
--- a/packages/SystemUI/res/values-sv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Av"</item>
     <item msgid="5137565285664080143">"På"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 19685b1..41bac7b 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Kupiga picha za skrini kumezuiwa na Msimamizi wako wa TEHAMA"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Badilisha"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Badilisha picha ya skrini"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Tuma"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Shiriki picha ya skrini"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Nasa zaidi"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ondoa picha ya skrini"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Inachanganua uso"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Tuma"</string>
     <string name="cancel" msgid="1089011503403416730">"Ghairi"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Nembo ya programu"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Thibitisha"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Jaribu tena"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Gusa ili ughairi uthibitishaji"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Uso umetambuliwa. Bonyeza aikoni ya kufungua ili uendelee."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Umethibitishwa"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Ghairi Uthibitishaji"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Chaguo Zaidi"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Tumia PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Tumia mchoro"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Tumia nenosiri"</string>
@@ -360,8 +363,15 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Kawaida"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Wastani"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Juu"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Vifaa vya kusikilizia"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Ungependa kuwacha kuzuia maikrofoni ya kifaa?"</string>
-    <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Ungependa kuwacha kuzuia kamera ya kifaa?"</string>
+    <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Ungependa kuacha kuzuia kamera ya kifaa?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Ungependa kuwacha kuzuia kamera na maikrofoni ya kifaa?"</string>
     <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Hatua hii huruhusu programu na huduma zote zenye idhini zitumie maikrofoni yako."</string>
     <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Hatua hii huruhusu programu na huduma zote zenye idhini zitumie kamera yako."</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Ondoa"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ongeza wijeti"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Nimemaliza"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Weka wijeti"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Fikia haraka wijeti za programu unazopenda bila kufungua kishikwambi chako."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Ungependa kuruhusu wijeti yoyote kwenye skrini iliyofungwa?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Fungua mipangilio"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Je, ungependa kuacha kusitisha programu za kazini?"</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Kifaa hiki kinadhibitiwa na mzazi wako. Mzazi wako anaweza kuona na kudhibiti maelezo kama vile programu unazotumia, mahali ulipo na muda unaotumia kwenye kifaa."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Imefunguliwa na kipengele cha kutathmini hali ya kuaminika"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Kifaa cha ulinzi\ndhidi ya wizi kimefungwa, kuna majaribio mengi mno ya kukifungua"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Kifaa kimefungwa, majaribio ya uthibitishaji ni mengi mno"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Kifaa kimefungwa\nImeshindwa kuthibitisha"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Mipangilio ya sauti"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Wekea maudhui manukuu kiotomatiki"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Zima sauti"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Tuma"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Halipatikani kwa sababu sauti imezimwa"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Imeshindwa kwa sababu Usinisumbue imewashwa"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Imeshindwa kwa sababu Usinisumbue imewashwa"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Gusa ili urejeshe."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Gusa ili uweke mtetemo. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Gusa ili ukomeshe. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"tetema"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Vidhibiti %s vya sauti"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Itatoa mlio arifa ikitumwa na simu ikipigwa (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Weka mipangilio ya sauti inayotoka"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Vitelezi vya sauti vimepanuliwa"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Vitelezi vya kiwango cha sauti vimekunjwa"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"zima sauti ya %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"rejesha sauti ya %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Inacheza <xliff:g id="LABEL">%s</xliff:g> kwenye"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Sauti itacheza kwenye"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Kirekebishi cha kiolesura cha mfumo"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Nenda mbele kwenye programu ulizofungua awali"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Rudi nyuma kwenye programu ulizofungua awali"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Fungua orodha ya programu"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Onyesha upauzana"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Fungua mipangilio"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Fungua programu ya Mratibu wa Google"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Funga skrini"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Tumia programu kwenye skrini iliyogawanywa upande wa kulia"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Tumia programu kwenye skrini iliyogawanywa upande wa kushoto"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Badilisha kutoka skrini iliyogawanywa utumie skrini nzima"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Badilisha ili uende kwenye programu iliyo kulia au chini unapotumia hali ya kugawa skrini"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Badilisha uende kwenye programu iliyo kushoto au juu unapotumia hali ya kugawa skrini"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Ukigawanya skrini: badilisha kutoka programu moja hadi nyingine"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vifaa vya kuingiza data"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Badilisha utumie lugha inayofuata"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera imezuiwa"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera na maikrofoni zimezuiwa"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Maikrofoni imezuiwa"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Usinisumbue"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Imetambua uwepo wa mtumiaji"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Teua programu chaguomsingi ya madokezo katika Mipangilio"</string>
     <string name="install_app" msgid="5066668100199613936">"Sakinisha programu"</string>
diff --git a/packages/SystemUI/res/values-sw/tiles_states_strings.xml b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
index 227eee8..15de7f8 100644
--- a/packages/SystemUI/res/values-sw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Umezima"</item>
     <item msgid="5137565285664080143">"Umewasha"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Havipatikani"</item>
+    <item msgid="3079622119444911877">"Vimezimwa"</item>
+    <item msgid="3028994095749238254">"Vimewashwa"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml
index 1e54fc9..2cfba01 100644
--- a/packages/SystemUI/res/values-sw600dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp/dimens.xml
@@ -110,4 +110,6 @@
     <dimen name="controls_content_padding">24dp</dimen>
     <dimen name="control_list_vertical_spacing">8dp</dimen>
     <dimen name="control_list_horizontal_spacing">16dp</dimen>
+    <!-- For portrait direction in unfold foldable device, we don't need keyguard_smartspace_top_offset-->
+    <dimen name="keyguard_smartspace_top_offset">0dp</dimen>
 </resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 742e88f..019dddc 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"பகிர்"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"ஸ்கிரீன்ஷாட்டைப் பகிர்"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"கூடுதலாக படமெடு"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ஸ்கிரீன்ஷாட்டை நிராகரிக்கும்"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"முகத்தை ஸ்கேன் செய்கிறது"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"அனுப்பு"</string>
     <string name="cancel" msgid="1089011503403416730">"ரத்துசெய்"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"ஆப்ஸ் லோகோ"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"உறுதிப்படுத்துக"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"மீண்டும் முயல்க"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"பயோமெட்ரிக் அடையாளத்தை ரத்துசெய்ய தட்டவும்"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"முகம் அங்கீகரிக்கப்பட்டது. தொடர அன்லாக் ஐகானை அழுத்தவும்."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"அங்கீகரிக்கப்பட்டது"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"அங்கீகரிப்பை ரத்துசெய்"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"கூடுதல் விருப்பங்கள்"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"பின்னைப் பயன்படுத்து"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"பேட்டர்னைப் பயன்படுத்து"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"கடவுச்சொல்லைப் பயன்படுத்து"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"இயல்புநிலை"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"நடுத்தரம்"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"அதிகம்"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"சாதனத்தின் மைக்ரோஃபோனுக்கான தடுப்பை நீக்கவா?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"சாதனத்தின் கேமராவுக்கான தடுப்பை நீக்கவா?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"சாதனத்தின் கேமராவுக்கும் மைக்ரோஃபோனுக்குமான தடுப்பை நீக்கவா?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"அகற்றும்"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"விட்ஜெட்டைச் சேர்"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"முடிந்தது"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"விட்ஜெட்களைச் சேர்"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"டேப்லெட்டை அன்லாக் செய்யாமலே உங்களுக்கு விருப்பமான ஆப்ஸ் விட்ஜெட்களுக்கு விரைவு அணுகலைப் பெறுங்கள்."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"பூட்டுத் திரையில் எந்தவொரு விட்ஜெட்டையும் அனுமதிக்கவா?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"அமைப்புகளைத் திற"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"பணி ஆப்ஸை மீண்டும் இயக்கவா?"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"திருட்டைத் தடுக்க\nசாதனம் பூட்டப்பட்டது, அதிகமான அன்லாக் முயற்சிகள்"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"அளவுக்கதிகமான அங்கீகரிப்பு முயற்சிகளால் சாதனம் பூட்டப்பட்டது"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"சாதனம் பூட்டப்பட்டது\nஅங்கீகரிக்க முடியவில்லை"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ஒலி அமைப்புகள்"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"வசன உரைகளைத் தானாக எழுதும்"</string>
@@ -571,7 +585,7 @@
     <string name="screen_pinning_exit" msgid="4553787518387346893">"ஆப்ஸ் பின்னிலிருந்து அகற்றப்பட்டது"</string>
     <string name="stream_voice_call" msgid="7468348170702375660">"அழைப்பு"</string>
     <string name="stream_system" msgid="7663148785370565134">"சிஸ்டம்"</string>
-    <string name="stream_ring" msgid="7550670036738697526">"ரிங் செய்"</string>
+    <string name="stream_ring" msgid="7550670036738697526">"அழைப்பு ஒலி"</string>
     <string name="stream_music" msgid="2188224742361847580">"மீடியா"</string>
     <string name="stream_alarm" msgid="16058075093011694">"அலாரம்"</string>
     <string name="stream_notification" msgid="7930294049046243939">"அறிவிப்பு"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"அமைதி"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"அலைபரப்பு"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"\'ரிங்\' மியூட்டில் உள்ளதால் கிடைக்கவில்லை"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"\'தொந்தரவு செய்ய வேண்டாம்\' ஆனில் இருப்பதால் இல்லை"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"\'தொந்தரவு செய்ய வேண்டாம்\' ஆனில் இருப்பதால் இல்லை"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. ஒலி இயக்க, தட்டவும்."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. அதிர்விற்கு அமைக்க, தட்டவும். அணுகல்தன்மை சேவைகள் ஒலியடக்கப்படக்கூடும்."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. ஒலியடக்க, தட்டவும். அணுகல்தன்மை சேவைகள் ஒலியடக்கப்படக்கூடும்."</string>
@@ -603,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"அதிர்வுறும்"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s ஒலியளவுக் கட்டுப்பாடுகள்"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"அழைப்புகளும் அறிவிப்புகளும் வரும்போது ஒலிக்கச் செய்யும் (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"வெளியீட்டு அமைப்புகளுக்குச் செல்லும்"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"ஒலியளவு ஸ்லைடர்கள் விரிவாக்கப்பட்டன"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"ஒலியளவு ஸ்லைடர்கள் சுருக்கப்பட்டன"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s ஐ ஒலியடக்கும்"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s ஐ ஒலி இயக்கும்"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"இதில் <xliff:g id="LABEL">%s</xliff:g> பிளே ஆகிறது"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"இல் ஆடியோ பிளே ஆகும்"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"ஆடியோ இதில் பிளே ஆகும்"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
     <string name="status_bar" msgid="4357390266055077437">"நிலைப் பட்டி"</string>
     <string name="demo_mode" msgid="263484519766901593">"சிஸ்டம் பயனர் இடைமுக டெமோ பயன்முறை"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"சமீபத்திய ஆப்ஸுக்கு முன்னோக்கிச் செல்லுதல்"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"சமீபத்திய ஆப்ஸுக்குப் பின்னோக்கிச் செல்லுதல்"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ஆப்ஸ் பட்டியலைத் திறத்தல்"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"செயல் பட்டியைக் காட்டுதல்"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"அமைப்புகளைத் திறத்தல்"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistantடைத் திறத்தல்"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"பூட்டுத் திரை"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"வலதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"இடதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"திரைப் பிரிப்பு பயன்முறையிலிருந்து முழுத்திரைக்கு மாற்றுதல்"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"திரைப் பிரிப்பைப் பயன்படுத்தும்போது வலது/கீழ் உள்ள ஆப்ஸுக்கு மாறுங்கள்"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"திரைப் பிரிப்பைப் பயன்படுத்தும்போது இடது/மேலே உள்ள ஆப்ஸுக்கு மாறுங்கள்"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"திரைப் பிரிப்பின்போது: ஓர் ஆப்ஸுக்குப் பதிலாக மற்றொன்றை மாற்றுதல்"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"உள்ளீடு"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"அடுத்த மொழிக்கு மாற்றுதல்"</string>
@@ -1088,7 +1096,7 @@
     <string name="media_output_dialog_multiple_devices" msgid="1093771040315422350">"<xliff:g id="COUNT">%1$d</xliff:g> சாதனங்கள் தேர்ந்தெடுக்கப்பட்டுள்ளன"</string>
     <string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(துண்டிக்கப்பட்டது)"</string>
     <string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"இணைக்க முடியவில்லை. மீண்டும் முயல தட்டவும்."</string>
-    <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"சாதனத்தை இணைத்தல்"</string>
+    <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"சாதனத்தை இணை"</string>
     <string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"இந்த அமர்வை அலைபரப்ப ஆப்ஸைத் திறங்கள்."</string>
     <string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"அறியப்படாத ஆப்ஸ்"</string>
     <string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"அலைபரப்புவதை நிறுத்து"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"கேமரா தடுக்கப்பட்டுள்ளது"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"கேமராவும் மைக்ரோஃபோனும் தடுக்கப்பட்டுள்ளன"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"மைக்ரோஃபோன் தடுக்கப்பட்டுள்ளது"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"தொந்தரவு செய்ய வேண்டாம்"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"பயனர் கண்டறியப்பட்டுள்ளார்"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"குறிப்பு எடுப்பதற்கான இயல்புநிலை ஆப்ஸை அமைப்புகளில் அமையுங்கள்"</string>
     <string name="install_app" msgid="5066668100199613936">"ஆப்ஸை நிறுவுங்கள்"</string>
diff --git a/packages/SystemUI/res/values-ta/tiles_states_strings.xml b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
index 6043cf2..cacde5e 100644
--- a/packages/SystemUI/res/values-ta/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"முடக்கப்பட்டுள்ளது"</item>
     <item msgid="5137565285664080143">"இயக்கப்பட்டுள்ளது"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 0ec2a0e..1b3c5e2 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"షేర్ చేయండి"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"స్క్రీన్‌షాట్‌ను షేర్ చేయండి"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"మరిన్ని క్యాప్చర్ చేయండి"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"స్క్రీన్‌షాట్‌ను విస్మరించు"</string>
@@ -105,7 +106,7 @@
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"స్క్రీన్ రికార్డ్ సెషన్ కోసం ఆన్‌గోయింగ్ నోటిఫికేషన్"</string>
     <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"రికార్డింగ్‌ను ప్రారంభించాలా?"</string>
     <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"మీరు రికార్డ్ చేసేటప్పుడు, మీ స్క్రీన్‌పై కనిపించే దేనికైనా లేదా మీ పరికరంలో ప్లే అయిన దేనికైనా Androidకు యాక్సెస్ ఉంటుంది. కాబట్టి పాస్‌వర్డ్‌లు, పేమెంట్ వివరాలు, మెసేజ్‌లు, ఫోటోలు, ఆడియో, ఇంకా వీడియో వంటి విషయాల్లో జాగ్రత్త వహించండి."</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"మీరు ఏదైనా యాప్‌ను రికార్డ్ చేసేటప్పుడు, ఆ యాప్‌లో చూపబడిన దేనికైనా లేదా ప్లే అయిన దేనికైనా Androidకు యాక్సెస్ ఉంటుంది. కాబట్టి పాస్‌వర్డ్‌లు, పేమెంట్ వివరాలు, మెసేజ్‌లు, ఫోటోలు, ఆడియో, ఇంకా వీడియో వంటి విషయాల్లో జాగ్రత్త వహించండి."</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"మీరు ఏదైనా యాప్‌ను రికార్డ్ చేసేటప్పుడు, ఆ యాప్‌లో చూపబడిన లేదా ప్లే అవుతున్న దేనినైనా Android యాక్సెస్ చేయగలదు. కాబట్టి పాస్‌వర్డ్‌లు, పేమెంట్ వివరాలు, మెసేజ్‌లు, ఫోటోలు, ఆడియో, వీడియో వంటి విషయాల్లో జాగ్రత్త వహించండి."</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"రికార్డింగ్‌ను ప్రారంభించండి"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"ఆడియోను రికార్డ్ చేయండి"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"పరికరం ఆడియో"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"ముఖాన్ని స్కాన్ చేస్తోంది"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"పంపండి"</string>
     <string name="cancel" msgid="1089011503403416730">"రద్దు చేయండి"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"యాప్ లోగో"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"నిర్ధారించండి"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"మళ్లీ ట్రై చేయండి"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ప్రామాణీకరణను రద్దు చేయడానికి నొక్కండి"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ముఖం గుర్తించబడింది. కొనసాగడానికి అన్‌లాక్ చిహ్నం నొక్కండి."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ప్రామాణీకరించబడింది"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ప్రామాణీకరణను రద్దు చేయండి"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"మరిన్ని ఆప్షన్‌లు"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PINను ఉపయోగించండి"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ఆకృతిని ఉపయోగించండి"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"పాస్‌వర్డ్‌ను ఉపయోగించండి"</string>
@@ -306,7 +309,7 @@
     <string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ఫాంట్ సైజ్"</string>
     <string name="quick_settings_more_user_settings" msgid="7634653308485206306">"యూజర్‌లను మేనేజ్ చేయండి"</string>
     <string name="quick_settings_done" msgid="2163641301648855793">"పూర్తయింది"</string>
-    <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"మూసివేయి"</string>
+    <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"మూసివేయండి"</string>
     <string name="quick_settings_connected" msgid="3873605509184830379">"కనెక్ట్ చేయబడినది"</string>
     <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"కనెక్ట్ చేయబడింది, బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="quick_settings_connecting" msgid="2381969772953268809">"కనెక్ట్ అవుతోంది..."</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"స్టాండర్డ్"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"మధ్యస్థం"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"అధికం"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"పరికరం మైక్రోఫోన్‌ను అన్‌బ్లాక్ చేయమంటారా?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"పరికరంలోని కెమెరాను అన్‌బ్లాక్ చేయమంటారా?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"పరికరంలోని కెమెరా, మైక్రోఫోన్‌లను అన్‌బ్లాక్ చేయమంటారా?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"తీసివేయండి"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"విడ్జెట్‌ను జోడించండి"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"పూర్తయింది"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"విడ్జెట్‌లను జోడించండి"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"మీ టాబ్లెట్‌ను అన్‌లాక్ చేయకుండానే మీకు ఇష్టమైన యాప్ విడ్జెట్‌లకు క్విక్ యాక్సెస్‌ను పొందండి."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"లాక్ స్క్రీన్‌లో ఏదైనా విడ్జెట్‌ను అనుమతించాలా?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"సెట్టింగ్‌లను తెరవండి"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"వర్క్ యాప్స్ అన్‌పాజ్ చేయాలా?"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"దొంగతనం చేయడం నుండి రక్షణ\nపరికరం లాక్ చేయబడింది, చాలా ఎక్కువ అన్‌లాక్ ప్రయత్నాలు జరిగాయి"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"చాలాసార్లు ప్రామాణీకరించడానికి ప్రయత్నించినందున పరికరం లాక్ అయింది"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ప్రామాణీకరణ విఫలమైంది\nపరికరం లాక్ అయింది"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"ధ్వని సెట్టింగ్‌లు"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"మీడియాకు ఆటోమేటిక్ క్యాప్షన్‌లు"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"మ్యూట్"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"ప్రసారం చేయండి"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"వాల్యూమ్ మ్యూట్ అయినందున అందుబాటులో లేదు"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"అంతరాయంకలిగించవద్దు ఆన్‌లో ఉన్నందున అందుబాటులోలేదు"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"అంతరాయంకలిగించవద్దు ఆన్‌లో ఉన్నందున అందుబాటులోలేదు"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. అన్‌మ్యూట్ చేయడానికి నొక్కండి."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. వైబ్రేషన్‌కు సెట్ చేయడానికి నొక్కండి. యాక్సెస్ సామర్థ్య సేవలు మ్యూట్ చేయబడవచ్చు."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. మ్యూట్ చేయడానికి నొక్కండి. యాక్సెస్ సామర్థ్య సేవలు మ్యూట్ చేయబడవచ్చు."</string>
@@ -595,7 +607,7 @@
     <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"నాయిస్ కంట్రోల్"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"స్పేషియల్ ఆడియో"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ఆఫ్ చేయండి"</string>
-    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ఆరంభించండి"</string>
+    <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ఫిక్స్‌డ్"</string>
     <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"హెడ్ ట్రాకింగ్"</string>
     <string name="volume_ringer_change" msgid="3574969197796055532">"రింగర్ మోడ్‌ను మార్చడానికి ట్యాప్ చేయండి"</string>
     <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"మ్యూట్ చేయి"</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"వైబ్రేట్"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s వాల్యూమ్ నియంత్రణలు"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"కాల్స్‌ మరియు నోటిఫికేషన్‌లు రింగ్ అవుతాయి (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"అవుట్‌పుట్ సెట్టింగ్‌లను ఎంటర్ చేయండి"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"వాల్యూమ్ స్లయిడర్‌లు విస్తరించబడ్డాయి"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"వాల్యూమ్ స్లయిడర్‌లు కుదించబడ్డాయి"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%sను మ్యూట్ చేయండి"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%sను అన్‌మ్యూట్ చేయండి"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>‌లో ప్లే అవుతోంది"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"ఆడియో ప్లే అవుతుంది"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"సిస్టమ్ UI ట్యూనర్"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"ఇటీవల ఉపయోగించిన యాప్‌ల తదుపరి పేజీకి వెళ్లండి"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"ఇటీవల ఉపయోగించిన యాప్‌ల మునుపటి పేజీకి వెళ్లండి"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"యాప్‌ల లిస్ట్‌ను తెరవండి"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"టాస్క్‌బార్‌ను చూపండి"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"సెట్టింగ్‌లను తెరవండి"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"అసిస్టెంట్‌ను తెరవండి"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"లాక్ స్క్రీన్"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHSకు ప్రస్తుత యాప్‌తో స్ప్లిట్ స్క్రీన్‌ను ఎంటర్ చేయండి"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHSకు ప్రస్తుత యాప్‌తో స్ప్లిట్ స్క్రీన్‌ను ఎంటర్ చేయండి"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"స్ప్లిట్ స్క్రీన్‌ను ఫుల్ స్క్రీన్‌కు మార్చండి"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"స్ప్లిట్ స్క్రీన్ ఉపయోగిస్తున్నప్పుడు కుడి లేదా పైన యాప్‌నకు మారండి"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"స్ప్లిట్ స్క్రీన్ ఉపయోగిస్తున్నప్పుడు ఎడమ లేదా పైన యాప్‌నకు మారండి"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"స్ప్లిట్ స్క్రీన్ సమయంలో: ఒక దాన్నుండి మరో దానికి యాప్ రీప్లేస్ చేయండి"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ఇన్‌పుట్"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"తర్వాత భాషకు స్విచ్ అవ్వండి"</string>
@@ -1239,7 +1247,7 @@
     <string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• కనీసం ఒక పరికరం లేదా పరికర ప్యానెల్ అందుబాటులో ఉండాలి"</string>
     <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"నోట్‌టేకింగ్ షార్ట్‌కట్‌ను ఉపయోగించడానికి ఆటోమేటిక్ సెట్టింగ్ నోట్స్ యాప్‌ను ఎంచుకోండి"</string>
     <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"యాప్‌ను ఎంచుకోండి"</string>
-    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"షార్ట్‌కట్‌ను తాకి, నొక్కి ఉంచు"</string>
+    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"షార్ట్‌కట్‌ను నొక్కి, పట్టుకోండి"</string>
     <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"రద్దు చేయండి"</string>
     <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"ఇప్పుడే స్క్రీన్‌లను మార్చండి"</string>
     <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ఫోన్‌ను అన్‌ఫోల్డ్ చేయండి"</string>
@@ -1260,14 +1268,13 @@
     <string name="call_from_work_profile_action" msgid="2937701298133010724">"వర్క్ ప్రొఫైల్‌కు మారండి"</string>
     <string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"ఆఫీస్ ఫోన్ యాప్‌ను ఇన్‌స్టాల్ చేయండి"</string>
     <string name="call_from_work_profile_close" msgid="5830072964434474143">"రద్దు చేయండి"</string>
-    <string name="lock_screen_settings" msgid="6152703934761402399">"లాక్ స్క్రీన్‌ను అనుకూలీకరించండి"</string>
+    <string name="lock_screen_settings" msgid="6152703934761402399">"లాక్ స్క్రీన్ అనుకూలంగా మార్చండి"</string>
     <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"లాక్ స్క్రీన్‌ను అనుకూలంగా మార్చుకోవడానికి అన్‌లాక్ చేయండి"</string>
     <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi అందుబాటులో లేదు"</string>
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"కెమెరా బ్లాక్ చేయబడింది"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"కెమెరా, మైక్రోఫోన్ బ్లాక్ చేయబడ్డాయి"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"మైక్రోఫోన్ బ్లాక్ చేయబడింది"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"అంతరాయం కలిగించవద్దు"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"యూజర్ ఉనికి గుర్తించబడింది"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"సెట్టింగ్‌లలో ఆటోమేటిక్‌గా ఉండేలా ఒక నోట్స్ యాప్‌ను సెట్ చేసుకోండి"</string>
     <string name="install_app" msgid="5066668100199613936">"యాప్‌ను ఇన్‌స్టాల్ చేయండి"</string>
diff --git a/packages/SystemUI/res/values-te/tiles_states_strings.xml b/packages/SystemUI/res/values-te/tiles_states_strings.xml
index 370aeb0..a1ee29f 100644
--- a/packages/SystemUI/res/values-te/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-te/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"ఆఫ్‌లో ఉంది"</item>
     <item msgid="5137565285664080143">"ఆన్‌లో ఉంది"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 835c5bb..e8d376d 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"การจับภาพหน้าจอถูกบล็อกโดยผู้ดูแลระบบไอทีของคุณ"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"แก้ไข"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"แก้ไขภาพหน้าจอ"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"แชร์"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"แชร์ภาพหน้าจอ"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"จับภาพได้มากขึ้น"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ปิดภาพหน้าจอ"</string>
@@ -144,12 +145,13 @@
     <string name="accessibility_phone_button" msgid="4256353121703100427">"โทรศัพท์"</string>
     <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"ตัวช่วยเสียง"</string>
     <string name="accessibility_wallet_button" msgid="1458258783460555507">"Wallet"</string>
-    <string name="accessibility_qr_code_scanner_button" msgid="7521277927692910795">"เครื่องมือสแกนคิวอาร์โค้ด"</string>
+    <string name="accessibility_qr_code_scanner_button" msgid="7521277927692910795">"แอปสแกนคิวอาร์โค้ด"</string>
     <string name="accessibility_unlock_button" msgid="3613812140816244310">"ปลดล็อกแล้ว"</string>
     <string name="accessibility_lock_icon" msgid="661492842417875775">"อุปกรณ์ถูกล็อก"</string>
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"กำลังสแกนใบหน้า"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ส่ง"</string>
     <string name="cancel" msgid="1089011503403416730">"ยกเลิก"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"โลโก้แอป"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"ยืนยัน"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ลองอีกครั้ง"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"แตะเพื่อยกเลิกการตรวจสอบสิทธิ์"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"จดจำใบหน้าได้ กดไอคอนปลดล็อกเพื่อดำเนินการต่อ"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ตรวจสอบสิทธิ์แล้ว"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ยกเลิกการตรวจสอบสิทธิ์"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ตัวเลือกเพิ่มเติม"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ใช้ PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ใช้รูปแบบ"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"ใช้รหัสผ่าน"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"มาตรฐาน"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ปานกลาง"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"สูง"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"เลิกบล็อกไมโครโฟนของอุปกรณ์ใช่ไหม"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"เลิกบล็อกกล้องของอุปกรณ์ใช่ไหม"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"เลิกบล็อกกล้องและไมโครโฟนของอุปกรณ์ใช่ไหม"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"นำออก"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"เพิ่มวิดเจ็ต"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"เสร็จสิ้น"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"เพิ่มวิดเจ็ต"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"เข้าถึงวิดเจ็ตแอปโปรดได้อย่างรวดเร็วโดยไม่ต้องปลดล็อกแท็บเล็ต"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"อนุญาตวิดเจ็ตบนหน้าจอล็อกไหม"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"เปิดการตั้งค่า"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"ยกเลิกการหยุดแอปงานชั่วคราวไหม"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"การป้องกันการโจรกรรม\nอุปกรณ์ถูกล็อก ลองปลดล็อกหลายครั้งเกินไป"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ล็อกอุปกรณ์แล้ว เนื่องจากตรวจสอบสิทธิ์หลายครั้งเกินไป"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ล็อกอุปกรณ์แล้ว\nการตรวจสอบสิทธิ์ไม่สำเร็จ"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g> <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"การตั้งค่าเสียง"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"แสดงคำบรรยายสื่อโดยอัตโนมัติ"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ปิดเสียง"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"แคสต์"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"เปลี่ยนไม่ได้เนื่องจากปิดเสียงเรียกเข้า"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"ไม่พร้อมใช้งานเนื่องจากโหมดห้ามรบกวนเปิดอยู่"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"ไม่พร้อมใช้งานเนื่องจากโหมดห้ามรบกวนเปิดอยู่"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s แตะเพื่อเปิดเสียง"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s แตะเพื่อตั้งค่าให้สั่น อาจมีการปิดเสียงบริการการเข้าถึง"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s แตะเพื่อปิดเสียง อาจมีการปิดเสียงบริการการเข้าถึง"</string>
@@ -603,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"สั่น"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"ตัวควบคุมระดับเสียง %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"สายเรียกเข้าและการแจ้งเตือนจะส่งเสียง (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"เข้าสู่การตั้งค่าเอาต์พุต"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"ขยายแถบเลื่อนระดับเสียงแล้ว"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"ยุบแถบเลื่อนระดับเสียงแล้ว"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"ปิดเสียง%s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"เปิดเสียง%s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"กำลังเล่น <xliff:g id="LABEL">%s</xliff:g> ใน"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"เสียงจะเล่นต่อไป"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"เสียงจะเล่นต่อใน"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"ตัวรับสัญญาณ UI ระบบ"</string>
     <string name="status_bar" msgid="4357390266055077437">"แถบสถานะ"</string>
     <string name="demo_mode" msgid="263484519766901593">"โหมดสาธิต UI ของระบบ"</string>
@@ -630,7 +637,7 @@
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ปลดล็อกเพื่อใช้"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"เกิดปัญหาในการดึงข้อมูลบัตรของคุณ โปรดลองอีกครั้งในภายหลัง"</string>
     <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"การตั้งค่าหน้าจอล็อก"</string>
-    <string name="qr_code_scanner_title" msgid="1938155688725760702">"เครื่องมือสแกนคิวอาร์โค้ด"</string>
+    <string name="qr_code_scanner_title" msgid="1938155688725760702">"แอปสแกนคิวอาร์โค้ด"</string>
     <string name="qr_code_scanner_updating_secondary_label" msgid="8344598017007876352">"กำลังอัปเดต"</string>
     <string name="status_bar_work" msgid="5238641949837091056">"โปรไฟล์งาน"</string>
     <string name="status_bar_airplane" msgid="4848702508684541009">"โหมดบนเครื่องบิน"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"สลับระหว่างแอปล่าสุดแบบไปข้างหน้า"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"สลับระหว่างแอปล่าสุดแบบกลับหลัง"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"เปิดรายชื่อแอป"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"แสดงแถบงาน"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"เปิดการตั้งค่า"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"เปิด Assistant"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"ล็อกหน้าจอ"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านขวา"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านซ้าย"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"เปลี่ยนจากโหมดแยกหน้าจอเป็นเต็มหน้าจอ"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"เปลี่ยนไปใช้แอปทางด้านขวาหรือด้านล่างขณะใช้โหมดแยกหน้าจอ"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"เปลี่ยนไปใช้แอปทางด้านซ้ายหรือด้านบนขณะใช้โหมดแยกหน้าจอ"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"ระหว่างใช้โหมดแยกหน้าจอ: เปลี่ยนแอปหนึ่งเป็นอีกแอปหนึ่ง"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"อินพุต"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"เปลี่ยนเป็นภาษาถัดไป"</string>
@@ -1239,7 +1247,7 @@
     <string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• มีอุปกรณ์หรือแผงอุปกรณ์พร้อมใช้งานอย่างน้อย 1 รายการ"</string>
     <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"เลือกแอปโน้ตเริ่มต้นเพื่อใช้ทางลัดการจดบันทึก"</string>
     <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"เลือกแอป"</string>
-    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"แตะแป้นพิมพ์ลัดค้างไว้"</string>
+    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"แตะทางลัดค้างไว้"</string>
     <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ยกเลิก"</string>
     <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"สลับหน้าจอเลย"</string>
     <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"กางโทรศัพท์ออก"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"กล้องถูกบล็อกอยู่"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"กล้องและไมโครโฟนถูกบล็อกอยู่"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ไมโครโฟนถูกบล็อกอยู่"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"ห้ามรบกวน"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"ตรวจพบการแสดงข้อมูลของผู้ใช้"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"กำหนดแอปการจดบันทึกเริ่มต้นในการตั้งค่า"</string>
     <string name="install_app" msgid="5066668100199613936">"ติดตั้งแอป"</string>
diff --git a/packages/SystemUI/res/values-th/tiles_states_strings.xml b/packages/SystemUI/res/values-th/tiles_states_strings.xml
index acaf9f0..d6351ce 100644
--- a/packages/SystemUI/res/values-th/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-th/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"ปิด"</item>
     <item msgid="5137565285664080143">"เปิด"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index ec3e2b6..54bb74b 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -59,7 +59,7 @@
     <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Hiniling ng ibang device na palitan ang wika ng system"</string>
     <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Palitan ang wika"</string>
     <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Huwag palitan ang wika"</string>
-    <string name="share_wifi_button_text" msgid="1285273973812029240">"Ibahagi ang Wi‑Fi"</string>
+    <string name="share_wifi_button_text" msgid="1285273973812029240">"I-share ang Wi‑Fi"</string>
     <string name="wifi_debugging_title" msgid="7300007687492186076">"Payagan ang wireless na pag-debug sa network na ito?"</string>
     <string name="wifi_debugging_message" msgid="5461204211731802995">"Pangalan ng Network (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nAddress ng Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
     <string name="wifi_debugging_always" msgid="2968383799517975155">"Palaging payagan sa network na ito"</string>
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Na-block ng iyong IT admin ang pagkuha ng mga screenshot"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"I-edit"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"I-edit ang screenshot"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Ibahagi"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Ibahagi ang screenshot"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Mag-capture pa"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"I-dismiss ang screenshot"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Sina-scan ang mukha"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Ipadala"</string>
     <string name="cancel" msgid="1089011503403416730">"Kanselahin"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo ng app"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Kumpirmahin"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Subukang muli"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"I-tap para kanselahin ang pag-authenticate"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Nakilala ang mukha. Pindutin ang unlock para magpatuloy."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Na-authenticate"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Kanselahin ang Pag-authenticate"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Higit Pang Opsyon"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gumamit ng PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gumamit ng pattern"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gumamit ng password"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Katamtaman"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Mataas"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Mga hearing device"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"I-unblock ang mikropono ng device?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"I-unblock ang camera ng device?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"I-unblock ang camera at mikropono ng device?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Alisin"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Magdagdag ng widget"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Tapos na"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Magdagdag ng mga widget"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Makakuha ng mabilis na access sa paborito mong mga widget ng app nang hindi ina-unlock ang iyong tablet."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Payagan ang anumang widget sa lock screen?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Buksan ang mga setting"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"I-unpause ang mga work app?"</string>
@@ -462,7 +474,7 @@
     <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"Ang serbisyong nagbibigay ng function na ito ay magkakaroon ng access sa lahat ng impormasyong nakikita sa iyong screen o pine-play mula sa device mo habang nagre-record o nagka-cast. Kasama rito ang impormasyong tulad ng mga password, detalye ng pagbabayad, larawan, mensahe, at audio na pine-play mo."</string>
     <string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"Buong screen"</string>
     <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Isang app"</string>
-    <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Ibahagi o i-record ang isang app"</string>
+    <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"I-share o i-record ang isang app"</string>
     <string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Simulang mag-record o mag-cast gamit ang <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
     <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Kapag nagbabahagi, nagre-record, o nagka-cast ka, may access ang <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sa kahit anong nakikita sa iyong screen o pine-play sa device mo. Kaya mag-ingat sa mga bagay-bagay tulad ng mga password, detalye ng pagbabayad, mensahe, larawan, at audio at video."</string>
     <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Kapag nagbabahagi, nagre-record, o nagka-cast ka ng app, may access ang <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sa kahit anong ipinapakita o pine-play sa app na iyon. Kaya mag-ingat sa mga bagay-bagay tulad ng mga password, detalye ng pagbabayad, mensahe, larawan, at audio at video."</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Pinapamahalaan ng iyong magulang ang device na ito. Makikita at mapapamahalaan ng iyong magulang ang impormasyon tulad ng mga app na ginagamit mo, iyong lokasyon, at tagal ng paggamit mo sa device."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Pinanatiling naka-unlock ng TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Theft protection\nNa-lock ang device, sobrang pag-unlock"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Na-lock ang device, masyadong maraming pagsubok sa pag-authenticate"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Na-lock ang device\nHindi pumasa sa pag-authenticate"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Mga setting ng tunog"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"I-autocaption ang media"</string>
@@ -752,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Mag-cycle pasulong sa mga kamakailang app"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Mag-cycle pabalik sa mga kamakailang app"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Buksan ang listahan ng mga app"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Ipakita ang taskbar"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Buksan ang mga setting"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Buksan ang assistant"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"I-lock ang screen"</string>
@@ -761,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Lumipat sa split screen nang nasa RHS ang kasalukuyang app"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Lumipat sa split screen nang nasa LHS ang kasalukuyang app"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Lumipat sa full screen mula sa split screen"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Lumipat sa app sa kanan o ibaba habang ginagamit ang split screen"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Lumipat sa app sa kaliwa o itaas habang ginagamit ang split screen"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Habang nasa split screen: magpalit-palit ng app"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Lumipat sa susunod na wika"</string>
@@ -1259,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Naka-block ang camera"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Naka-block ang camera at mikropono"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Naka-block ang mikropono"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Huwag istorbohin"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Na-detect ang presensya ng user"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Magtakda ng default na app sa pagtatala sa Mga Setting"</string>
     <string name="install_app" msgid="5066668100199613936">"I-install ang app"</string>
diff --git a/packages/SystemUI/res/values-tl/tiles_states_strings.xml b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
index 6de62df..fe2827f 100644
--- a/packages/SystemUI/res/values-tl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Naka-off"</item>
     <item msgid="5137565285664080143">"Naka-on"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Hindi available"</item>
+    <item msgid="3079622119444911877">"Naka-off"</item>
+    <item msgid="3028994095749238254">"Naka-on"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 3c9d479..5364c83 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -59,7 +59,7 @@
     <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Başka bir cihaz tarafından sistem dilinin değiştirilmesi istendi"</string>
     <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Dili değiştir"</string>
     <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Mevcut dili koru"</string>
-    <string name="share_wifi_button_text" msgid="1285273973812029240">"Kablosuz ağı paylaşın"</string>
+    <string name="share_wifi_button_text" msgid="1285273973812029240">"Kablosuz ağı paylaş"</string>
     <string name="wifi_debugging_title" msgid="7300007687492186076">"Bu ağda kablosuz hata ayıklamaya izin verilsin mi?"</string>
     <string name="wifi_debugging_message" msgid="5461204211731802995">"Ağ Adı (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nKablosuz Adresi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
     <string name="wifi_debugging_always" msgid="2968383799517975155">"Bu ağda her zaman izin ver"</string>
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"BT yöneticiniz ekran görüntüsü almayı engelledi"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Düzenle"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Ekran görüntüsünü düzenle"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Paylaş"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Ekranı paylaş"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Alanı genişlet"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekran görüntüsünü kapat"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Yüz taranıyor"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Gönder"</string>
     <string name="cancel" msgid="1089011503403416730">"İptal"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Uygulama logosu"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Onayla"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Tekrar dene"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Kimlik doğrulama işlemini iptal etmek için dokunun"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Yüzünüz tanındı. Kilit açma simgesine basın."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Kimliği Doğrulandı"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Kimlik doğrulamayı iptal et"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Diğer Seçenekler"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN kullan"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Deseni kullan"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Şifre kullan"</string>
@@ -263,7 +266,7 @@
     <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
     <string name="quick_settings_bluetooth_detail_empty_text" msgid="5760239584390514322">"Kullanılabilir eşlenmiş cihaz yok"</string>
     <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Cihaz bağlamak veya cihazın bağlantısını kesmek için dokunun"</string>
-    <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Yeni cihaz eşleme"</string>
+    <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Yeni cihaz eşle"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Tümünü göster"</string>
     <string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth\'u kullan"</string>
     <string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Bağlandı"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standart"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Orta"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Yüksek"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"İşitme cihazları"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Cihaz mikrofonunun engellemesi kaldırılsın mı?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Cihaz kamerasının engellemesi kaldırılsın mı?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Cihaz kamerası ile mikrofonunun engellemesi kaldırılsın mı?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Kaldır"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Widget ekle"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Bitti"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Widget ekleme"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Tabletinizin kilidini açmadan favori uygulama widget\'larınıza hızlıca erişin."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Kilit ekranında tüm widget\'lara izin verilsin mi?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Ayarları açın"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"İş uygulamaları devam ettirilsin mi?"</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Bu cihaz ebeveyniniz tarafından yönetiliyor. Kullandığınız uygulamalar, konumunuz ve ekran başında kalma süreniz gibi bilgiler ebeveyniniz tarafından görülüp yönetilebilir."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent tarafından kilit açık tutuldu"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Hırsızlık koruması\nCihaz kilitlendi, çok fazla kilit açma denemesi"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Cihaz kilitlendi. Çok fazla sayıda kimlik doğrulama denemesi yapıldı."</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Cihaz kilitli\nKimlik doğrulama yapılamadı"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Ses ayarları"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Otomatik medya altyazısı"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Sesi kapat"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Yayınla"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Zil sesi kapatıldığı için kullanılamıyor"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Rahatsız Etmeyin açık olduğu için kullanılamıyor"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Rahatsız Etmeyin açık olduğu için kullanılamıyor"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Sesi açmak için dokunun."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Titreşime ayarlamak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Sesi kapatmak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"titreşim"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s ses denetimleri"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Aramalar ve bildirimler telefonun zilini çaldıracak (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Çıkış ayarlarını gir"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Ses seviyesi kaydırma çubukları genişletildi"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Ses seviyesi kaydırma çubukları daraltıldı"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s sesini kapatma"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s sesini açma"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> şurada çalacak:"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Ses şurada çalacak:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Sistem Arayüzü Ayarlayıcısı"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Son uygulamalarda ileriye doğru git"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Son uygulamalarda geriye doğru git"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Uygulama listesini aç"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Görev çubuğunu göster"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ayarları aç"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Asistan\'ı aç"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Kilit ekranı"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Mevcut uygulamayı sağ tarafa alarak bölünmüş ekrana geç"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Mevcut uygulamayı sol tarafa alarak bölünmüş ekrana geç"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bölünmüş ekrandan tam ekrana geç"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Bölünmüş ekran kullanırken sağdaki veya alttaki uygulamaya geçiş yapın"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Bölünmüş ekran kullanırken soldaki veya üstteki uygulamaya geçiş yapın"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Bölünmüş ekran etkinken: Bir uygulamayı başkasıyla değiştir"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Giriş"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Sonraki dile geç"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera engellendi"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera ve mikrofon engellendi"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon engellendi"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Rahatsız etmeyin"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Kullanıcı varlığı algılandı"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ayarlar\'ı kullanarak varsayılan notlar ayarlayın"</string>
     <string name="install_app" msgid="5066668100199613936">"Uygulamayı yükle"</string>
diff --git a/packages/SystemUI/res/values-tr/tiles_states_strings.xml b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
index 0c086f8..1ed106f 100644
--- a/packages/SystemUI/res/values-tr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Kapalı"</item>
     <item msgid="5137565285664080143">"Açık"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Yok"</item>
+    <item msgid="3079622119444911877">"Kapalı"</item>
+    <item msgid="3028994095749238254">"Açık"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index bc557c6..da1dfa4 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Системний адміністратор заблокував можливість робити знімки екрана"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Редагувати"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Редагувати знімок екрана"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Поділитися"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Поділитися знімком екрана"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Включити більше деталей"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Закрити знімок екрана"</string>
@@ -109,9 +110,9 @@
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Почати записування"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"Записувати звук"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Звук із пристрою"</string>
-    <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Звук із пристрою, зокрема музика, виклики та сигнали дзвінка"</string>
+    <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Звук із пристрою, зокрема музика, виклики й сигнали дзвінка"</string>
     <string name="screenrecord_mic_label" msgid="2111264835791332350">"Мікрофон"</string>
-    <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Звук із пристрою та мікрофона"</string>
+    <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Звук із пристрою і мікрофона"</string>
     <string name="screenrecord_continue" msgid="4055347133700593164">"Почати"</string>
     <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Запис екрана"</string>
     <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Запис екрана та звуку"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Сканування обличчя"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Надіслати"</string>
     <string name="cancel" msgid="1089011503403416730">"Скасувати"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Логотип додатка"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Підтвердити"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Повторити спробу"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Натисніть, щоб скасувати автентифікацію"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Обличчя розпізнано. Натисніть значок розблокування."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Автентифіковано"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Скасувати автентифікацію"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Інші опції"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Ввести PIN-код"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Намалювати ключ"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Ввести пароль"</string>
@@ -360,12 +363,20 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандартний"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Середній"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Високий"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Надати доступ до мікрофона?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Надати доступ до камери пристрою?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Надати доступ до камери й мікрофона?"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Усі додатки та сервіси, яким дозволено користуватися вашим мікрофоном, отримають доступ."</string>
-    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Усі додатки та сервіси, яким дозволено користуватися вашою камерою, отримають доступ."</string>
-    <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Усі додатки та сервіси, яким дозволено користуватися вашою камерою чи мікрофоном, отримають доступ."</string>
+    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Усі додатки й сервіси, яким дозволено користуватися вашим мікрофоном, отримають доступ."</string>
+    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Усі додатки й сервіси, яким дозволено користуватися вашою камерою, отримають доступ."</string>
+    <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Усі додатки й сервіси, яким дозволено користуватися вашою камерою чи мікрофоном, отримають доступ."</string>
     <string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Мікрофон заблоковано"</string>
     <string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Камеру заблоковано"</string>
     <string name="sensor_privacy_start_use_mic_camera_blocked_dialog_title" msgid="195236134743281973">"Мікрофон і камеру заблоковано"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Видалити"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Додати віджет"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Додати віджети"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Отримуйте швидкий доступ до віджетів улюблених додатків, не розблоковуючи планшет."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Дозволити використовувати будь-який віджет на заблокованому екрані?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Відкрити налаштування"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Увімкнути робочі додатки?"</string>
@@ -538,7 +551,8 @@
     <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">"Розблоковує довірчий агент"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Захист від крадіжки\nПристрій заблоковано (забагато спроб)"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Пристрій заблоковано. Забагато спроб автентифікації."</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Пристрій заблоковано\nПомилка автентифікації"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Налаштування звуку"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматичні субтитри (медіа)"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Без звуку"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Трансляція"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недоступно: звук дзвінків вимкнено"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Недоступно: увімкнено режим \"Не турбувати\""</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Недоступно: увімкнено режим \"Не турбувати\""</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Торкніться, щоб увімкнути звук."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Торкніться, щоб налаштувати вібросигнал. Спеціальні можливості може бути вимкнено."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Торкніться, щоб вимкнути звук. Спеціальні можливості може бути вимкнено."</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"увімкнути вібросигнал"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Регуляторів гучності: %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Для викликів і сповіщень налаштовано звуковий сигнал (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Відкрити налаштування відтворення"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Повзунки гучності розгорнуто"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Повзунки гучності згорнуто"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"вимкнути звук %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"увімкнути звук %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Відтворюється <xliff:g id="LABEL">%s</xliff:g> на:"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудіо гратиме на:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
@@ -669,10 +676,10 @@
     <string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"&lt;b&gt;Статус&lt;/b&gt;: знижено до \"Без звуку\""</string>
     <string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"&lt;b&gt;Статус&lt;/b&gt;: пріоритет підвищено"</string>
     <string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"&lt;b&gt;Статус&lt;/b&gt;: пріоритет знижено"</string>
-    <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"З’являється вгорі сповіщень про розмови та як зображення профілю на заблокованому екрані"</string>
-    <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"З’являється вгорі сповіщень про розмови та як зображення профілю на заблокованому екрані, показується у вигляді спливаючої підказки"</string>
-    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"З’являється вгорі сповіщень про розмови та як зображення профілю на заблокованому екрані, показується навіть у режимі \"Не турбувати\""</string>
-    <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"З’являється вгорі сповіщень про розмови та як зображення профілю на заблокованому екрані, відображається як спливаючий чат, перериває режим \"Не турбувати\""</string>
+    <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"З’являється вгорі сповіщень про розмови і як зображення профілю на заблокованому екрані"</string>
+    <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"З’являється вгорі сповіщень про розмови і як зображення профілю на заблокованому екрані, показується у вигляді спливаючої підказки"</string>
+    <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"З’являється вгорі сповіщень про розмови і як зображення профілю на заблокованому екрані, показується навіть у режимі \"Не турбувати\""</string>
+    <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"З’являється вгорі сповіщень про розмови і як зображення профілю на заблокованому екрані, відображається як спливаючий чат, перериває режим \"Не турбувати\""</string>
     <string name="notification_priority_title" msgid="2079708866333537093">"Пріоритет"</string>
     <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не підтримує функції розмов"</string>
     <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ці сповіщення не можна змінити."</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Перемикатися між нещодавніми додатками вперед"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Перемикатися між нещодавніми додатками назад"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Відкрити список додатків"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Показати панель завдань"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Відкрити налаштування"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Відкрити додаток Асистент"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Заблокувати екран"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Розділити екран із поточним додатком праворуч"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Розділити екран із поточним додатком ліворуч"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Перейти з розділення екрана на весь екран"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Під час розділення екрана перемикатися на додаток праворуч або внизу"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Під час розділення екрана перемикатися на додаток ліворуч або вгорі"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Під час розділення екрана: замінити додаток іншим"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Метод введення"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Вибрати наступну мову"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камеру заблоковано"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камеру й мікрофон заблоковано"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Мікрофон заблоковано"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Не турбувати"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Виявлено присутність користувача"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Призначте стандартний додаток для нотаток у налаштуваннях"</string>
     <string name="install_app" msgid="5066668100199613936">"Установити додаток"</string>
diff --git a/packages/SystemUI/res/values-uk/tiles_states_strings.xml b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
index fd3fb08..be779eb 100644
--- a/packages/SystemUI/res/values-uk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"Вимкнено"</item>
     <item msgid="5137565285664080143">"Увімкнено"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 5bd251d..fa4bd02 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"اشتراک کریں"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"اسکرین شاٹ کا اشتراک کریں"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"مزید کیپچر کریں"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"اسکرین شاٹ برخاست کریں"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"اسکیننگ چہرہ"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"بھیجیں"</string>
     <string name="cancel" msgid="1089011503403416730">"منسوخ کريں"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"ایپ لوگو"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"تصدیق کریں"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"دوبارہ کوشش کریں"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"تصدیق کو منسوخ کرنے کے لیے تھپتھپائیں"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"چہرے کی شناخت ہو گئی۔ جاری رکھنے کیلئے انلاک آئیکن دبائیں۔"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"تصدیق کردہ"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"تصدیق کو منسوخ کریں"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"مزید اختیارات"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"‏PIN استعمال کریں"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"پیٹرن کا استعمال کریں"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"پاس ورڈ استعمال کریں"</string>
@@ -265,7 +268,7 @@
     <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"کسی آلے کو منسلک یا غیر منسلک کرنے کے لیے تھپتھپائیں"</string>
     <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"نئے آلے کا جوڑا بنائیں"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"سبھی دیکھیں"</string>
-    <string name="turn_on_bluetooth" msgid="5681370462180289071">"استعمال کریں"</string>
+    <string name="turn_on_bluetooth" msgid="5681370462180289071">"بلوٹوتھ استعمال کریں"</string>
     <string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"منسلک ہے"</string>
     <string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"محفوظ ہے"</string>
     <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"غیر منسلک کریں"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"معیاری"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"متوسط"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"زیادہ"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"سماعت کے آلات"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"آلے کا مائیکروفون غیر مسدود کریں؟"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"آلے کا کیمرا غیر مسدود کریں؟"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"آلے کا کیمرا اور مائیکروفون غیر مسدود کریں؟"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"ہٹائیں"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ویجیٹ شامل کریں"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ہو گیا"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"ویجٹس شامل کریں"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"اپنے ٹیبلیٹ کو غیر مقفل کیے بغیر اپنے پسندیدہ ایپ ویجیٹس تک فوری رسائی حاصل کریں۔"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"مقفل اسکرین پر کسی ویجیٹ کی اجازت دیں؟"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"ترتیبات کھولیں"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"ورک ایپس کو غیر موقوف کریں؟"</string>
@@ -538,7 +550,8 @@
     <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">"ٹرسٹ ایجنٹ نے غیر مقفل رکھا ہے"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"چوری سے تحفظ\n آلہ مقفل ہے، بہت زیادہ غیر مقفل کرنے کی کوششیں"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"آلہ مقفل ہو گیا، تصدیق کی کافی زیادہ کوششیں کی گئیں"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"آلہ مقفل ہو گیا\nتصدیق ناکام ہو گئی"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>۔ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"صوتی ترتیبات"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"خودکار طور پر میڈیا پر کیپشن لگائیں"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"خاموش کریں"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"کاسٹ"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"دستیاب نہیں ہے کیونکہ رنگ خاموش ہے"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"غیر دستیاب ہے کیونکہ ڈسٹرب نہ کریں آن ہے"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"غیر دستیاب ہے کیونکہ ڈسٹرب نہ کریں آن ہے"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"‏‎%1$s۔ آواز چالو کرنے کیلئے تھپتھپائیں۔"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"‏‎%1$s۔ ارتعاش پر سیٹ کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"‏‎%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔"</string>
@@ -603,18 +614,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"وائبریٹ"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"‏‎%s والیوم کے کنٹرولز"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"کالز اور اطلاعات موصول ہونے پر گھنٹی بجے گی (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"آؤٹ پٹ کی ترتیبات درج کریں"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"والیوم سلائیڈرز کو پھیلا دیا گیا"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"والیوم سلائیڈرز سکیڑا گیا"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"‏%s خاموش کریں"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"‏%s غیر خاموش کریں"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> پر چل رہی ہے"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"آڈیو چلتی رہے گی"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"آڈیو اس پر چلے گی"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"‏سسٹم UI ٹیونر"</string>
     <string name="status_bar" msgid="4357390266055077437">"اسٹیٹس بار"</string>
     <string name="demo_mode" msgid="263484519766901593">"‏سسٹم UI ڈیمو موڈ"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"حالیہ ایپس کے ذریعے آگے کی طرف سائیکل کریں"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"حالیہ ایپس کے ذریعے پیچھے کی طرف سائیکل کریں"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ایپس کی فہرست کھولیں"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ٹاسک بار دکھائیں"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"ترتیبات کھولیں"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"اسسٹنٹ کھولیں"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"مقفل اسکرین"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"موجودہ ایپ کے ساتھ دائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"موجودہ ایپ کے ساتھ بائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"اسپلٹ اسکرین سے پوری سکرین پر سوئچ کریں"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"اسپلٹ اسکرین کا استعمال کرتے ہوئے دائیں یا نیچے ایپ پر سوئچ کریں"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"اسپلٹ اسکرین کا استعمال کرتے ہوئے بائیں یا اوپر ایپ پر سوئچ کریں"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"اسپلٹ اسکرین کے دوران: ایک ایپ کو دوسرے سے تبدیل کریں"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ان پٹ"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"اگلی زبان پر سوئچ کریں"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"کیمرا مسدود ہے"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"کیمرا اور مائیکروفون مسدود ہے"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"مائیکروفون مسدود ہے"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"ڈسٹرب نہ کریں"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"صارف کی موجودگی کا پتہ چلا ہے"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ترتیبات میں ڈیفالٹ نوٹس ایپ سیٹ کریں"</string>
     <string name="install_app" msgid="5066668100199613936">"ایپ انسٹال کریں"</string>
diff --git a/packages/SystemUI/res/values-ur/tiles_states_strings.xml b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
index 4957e59..ebbc30e 100644
--- a/packages/SystemUI/res/values-ur/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"آف ہے"</item>
     <item msgid="5137565285664080143">"آن ہے"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"دستیاب نہیں ہے"</item>
+    <item msgid="3079622119444911877">"آف ہے"</item>
+    <item msgid="3028994095749238254">"آن ہے"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 7d3f2af..195b044 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Skrinshot olishni AT administratori taqiqlagan"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Tahrirlash"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Skrinshotni tahrirlash"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Ulashish"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Skrinshot yuborish"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Skrinshot sohasini kengaytirish"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Skrinshotni yopish"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Yuzni skanerlash"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Yuborish"</string>
     <string name="cancel" msgid="1089011503403416730">"Bekor qilish"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Ilova logotipi"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"OK"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Qayta urinish"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tekshiruvni bekor qilish uchun bosing"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Yuz aniqlandi. Davom etish uchun ochish belgisini bosing."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Tasdiqlandi"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Autentifikatsiyani bekor qilish"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Boshqa parametrlar"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN kod kiritish"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Grafik kalitdan foydalanish"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Paroldan foydalanish"</string>
@@ -266,7 +269,7 @@
     <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Yangi qurilmani ulash"</string>
     <string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Hammasi"</string>
     <string name="turn_on_bluetooth" msgid="5681370462180289071">"Bluetooth ishlatish"</string>
-    <string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Ulandi"</string>
+    <string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Ulangan"</string>
     <string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Saqlangan"</string>
     <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"uzish"</string>
     <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"faollashtirish"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standart"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Oʻrtacha"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Yuqori"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Eshitish qurilmalari"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Qurilma mikrofoni blokdan chiqarilsinmi?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Qurilma kamerasi blokdan chiqarilsinmi?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Qurilma kamerasi va mikrofoni blokdan chiqarilsinmi?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Olib tashlash"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Vidjet kiritish"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Tayyor"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Vidjetlar qoʻshish"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Planshetingiz qulflangan boʻlsa ham sevimli ilova vidjetlariga tezkor kira olasiz"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Ekran qulfida istalgan vidjet chiqsinmi?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Sozlamalarni ochish"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Ishga oid ilovalar qaytarilsinmi?"</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Bu – ota-onangiz tomonidan boshqariladigan qurilma. Ota-onangiz siz foydalangan ilovalar, joylashuvingiz va qurilmadan foydalanish vaqti kabi axborotlarni koʻrishi va boshqarishi mumkin."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent tomonidan ochilgan"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Oʻgʻirlanishdan himoya\nQurilma qulflandi, juda koʻp urinildi"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Qurilma qulflandi. Juda koʻp marta hisob tekshiruvi uchun urinildi"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Qurilma qulflandi\nHisob tekshiruvi amalga oshmadi"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Tovush sozlamalari"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Avtomatik taglavha yaratish"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Ovozsiz"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Translatsiya"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Jiringlash ovozsizligi uchun ishlamaydi"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Bezovta qilinmasin yoniqligi sababli ishlamaydi"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Bezovta qilinmasin yoniqligi sababli ishlamaydi"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Ovozini yoqish uchun ustiga bosing."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tebranishni yoqish uchun ustiga bosing. Qulayliklar ishlamasligi mumkin."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Ovozini o‘chirish uchun ustiga bosing. Qulayliklar ishlamasligi mumkin."</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"tebranish"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s tovush balandligi tugmalari"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Chaqiruvlar va bildirishnomalar jiringlaydi (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Chiqarish sozlamalarini kiritish"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Tovush slayderlari yoyilgan"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Tovush slayderlari yigʻilgan"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%sni ovozsiz qilish"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s ovozini chiqarish"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>da ijro etilmoqda"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio ijro etiladi"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"SystemUI Tuner"</string>
@@ -625,7 +631,7 @@
     <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>
-    <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"Ochish uchun ustiga bosing"</string>
+    <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"Ochish uchun bosing"</string>
     <string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Yangilanmoqda"</string>
     <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Foydalanish uchun qulfdan chiqarish"</string>
     <string name="wallet_error_generic" msgid="257704570182963611">"Bildirgilarni yuklashda xatolik yuz berdi, keyinroq qaytadan urining"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Oxirgi ilovalarni oldinga varaqlash"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Oxirgi ilovalarni orqaga varaqlash"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ilovalar roʻyxatini ochish"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Vazifalar panelini chiqarish"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Sozlamalarni ochish"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistentni ochish"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Ekran qulfi"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Oʻng tomondagi ajratilgan ekran rejimiga kirish"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Chap tomondagi ajratilgan ekran rejimiga kirish"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Ajratilgan ekran rejimidan butun ekranga almashtirish"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Ajratilgan ekranda oʻngdagi yoki pastdagi ilovaga almashish"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Ajratilgan ekranda chapdagi yoki yuqoridagi ilovaga almashish"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Ajratilgan rejimda ilovalarni oʻzaro almashtirish"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Kiritish"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Keyingi tilga almashtirish"</string>
@@ -1162,7 +1169,7 @@
     <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Joriy telefon chaqiruvi"</string>
     <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobil internet"</string>
     <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string>
-    <string name="mobile_data_connection_active" msgid="944490013299018227">"Ulandi"</string>
+    <string name="mobile_data_connection_active" msgid="944490013299018227">"Ulangan"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Vaqtincha ulangan"</string>
     <string name="mobile_data_poor_connection" msgid="819617772268371434">"Aloqa beqaror"</string>
     <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobil internetga avtomatik ulanmaydi"</string>
@@ -1239,7 +1246,7 @@
     <string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Kamida bitta qurilma yoki qurilma paneli mavjud"</string>
     <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Qayd yozish yorligʻidan foydalanish uchun birlamchi qayd ilovasini tanlang"</string>
     <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Ilovani tanlang"</string>
-    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Bosib turish yorligʻi"</string>
+    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Yorliqni bosib turing"</string>
     <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Bekor qilish"</string>
     <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Ekranlarni hozir almashtirish"</string>
     <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Telefonni yoying"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera bloklangan"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera va mikrofon bloklangan"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon bloklangan"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Bezovta qilinmasin"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Foydalanuvchi aniqlandi"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standart qaydlar ilovasini Sozlamalar orqali tanlang"</string>
     <string name="install_app" msgid="5066668100199613936">"Ilovani oʻrnatish"</string>
diff --git a/packages/SystemUI/res/values-uz/tiles_states_strings.xml b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
index 670c56c..2ae81123 100644
--- a/packages/SystemUI/res/values-uz/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Oʻchiq"</item>
     <item msgid="5137565285664080143">"Yoniq"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Ishlamayapti"</item>
+    <item msgid="3079622119444911877">"Oʻchiq"</item>
+    <item msgid="3028994095749238254">"Yoniq"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 0a9cbb4..469430b 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Quản trị viên CNTT chặn tính năng chụp ảnh màn hình"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Chỉnh sửa"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Chỉnh sửa ảnh chụp màn hình"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Chia sẻ"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Chia sẻ ảnh chụp màn hình"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Chụp thêm"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Đóng ảnh chụp màn hình"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Quét tìm khuôn mặt"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Gửi"</string>
     <string name="cancel" msgid="1089011503403416730">"Hủy"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Biểu trưng của ứng dụng"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Xác nhận"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Thử lại"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Nhấn để hủy quá trình xác thực"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Đã nhận diện khuôn mặt. Nhấn biểu tượng mở khoá để tiếp tục."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Đã xác thực"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Huỷ quy trình xác thực"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Tuỳ chọn khác"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Dùng mã PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Dùng hình mở khóa"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Dùng mật khẩu"</string>
@@ -360,11 +363,18 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Chuẩn"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Vừa"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Cao"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Thiết bị trợ thính"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Bỏ chặn micrô của thiết bị?"</string>
-    <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Bỏ chặn máy ảnh của thiết bị?"</string>
+    <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Bỏ chặn camera của thiết bị?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Bỏ chặn máy ảnh và micrô của thiết bị?"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Sau khi được bỏ chặn, mọi ứng dụng và dịch vụ có quyền sẽ có thể sử dụng micrô của bạn."</string>
-    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Sau khi được bỏ chặn, mọi ứng dụng và dịch vụ có quyền sẽ có thể sử dụng máy ảnh của bạn."</string>
+    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Sau khi được bỏ chặn, mọi ứng dụng và dịch vụ có quyền sẽ có thể sử dụng micrô trên thiết bị của bạn."</string>
+    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Sau khi được bỏ chặn, mọi ứng dụng và dịch vụ có quyền sẽ có thể sử dụng camera trên thiết bị của bạn."</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Thao tác này sẽ bỏ chặn quyền truy cập cho mọi ứng dụng và dịch vụ được phép sử dụng máy ảnh hoặc micrô của bạn."</string>
     <string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Micrô bị chặn"</string>
     <string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Máy ảnh bị chặn"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Xoá"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Thêm tiện ích"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Xong"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Thêm tiện ích"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Truy cập nhanh vào các tiện ích ứng dụng bạn yêu thích mà không cần mở khoá máy tính bảng."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Cho phép mọi tiện ích trên màn hình khoá?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Mở phần Cài đặt"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Tiếp tục dùng ứng dụng công việc?"</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Thiết bị này do cha mẹ bạn quản lý. Cha mẹ có thể có thể xem và quản lý những thông tin như ứng dụng bạn dùng, vị trí của bạn và thời gian bạn sử dụng thiết bị."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Luôn được TrustAgent mở khóa"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Chống trộm\nĐã khoá thiết bị, quá nhiều lần mở khoá"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Thiết bị đã bị khoá do quá nhiều lần thử xác thực"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Thiết bị đã bị khoá\nKhông xác thực được"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Cài đặt âm thanh"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Tự động tạo phụ đề cho nội dung nghe nhìn"</string>
@@ -572,7 +585,7 @@
     <string name="stream_voice_call" msgid="7468348170702375660">"Gọi"</string>
     <string name="stream_system" msgid="7663148785370565134">"Hệ thống"</string>
     <string name="stream_ring" msgid="7550670036738697526">"Chuông"</string>
-    <string name="stream_music" msgid="2188224742361847580">"Phương tiện"</string>
+    <string name="stream_music" msgid="2188224742361847580">"Nội dung nghe nhìn"</string>
     <string name="stream_alarm" msgid="16058075093011694">"Báo thức"</string>
     <string name="stream_notification" msgid="7930294049046243939">"Thông báo"</string>
     <string name="stream_bluetooth_sco" msgid="6234562365528664331">"Bluetooth"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Tắt tiếng"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Truyền"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Không hoạt động vì chuông bị tắt"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Bị tắt vì đang bật chế độ Không làm phiền"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Bị tắt vì đang bật chế độ Không làm phiền"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Nhấn để bật tiếng."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Nhấn để đặt chế độ rung. Bạn có thể tắt tiếng dịch vụ trợ năng."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Nhấn để tắt tiếng. Bạn có thể tắt tiếng dịch vụ trợ năng."</string>
@@ -603,18 +614,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"rung"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"Điều khiển âm lượng %s"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Cuộc gọi và thông báo sẽ đổ chuông (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Mở phần cài đặt thiết bị đầu ra"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Đã mở rộng thanh trượt âm lượng"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Đã thu gọn thanh trượt âm lượng"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"tắt tiếng %s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"bật tiếng %s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Đang phát <xliff:g id="LABEL">%s</xliff:g> trên"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Âm thanh sẽ phát ra"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"Âm thanh sẽ phát trên"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Bộ điều hướng giao diện người dùng hệ thống"</string>
     <string name="status_bar" msgid="4357390266055077437">"Thanh trạng thái"</string>
     <string name="demo_mode" msgid="263484519766901593">"Chế độ thử nghiệm giao diện người dùng hệ thống"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Di chuyển tiến trong danh sách các ứng dụng gần đây"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Di chuyển lùi trong danh sách các ứng dụng gần đây"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Mở danh sách ứng dụng"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Hiện thanh tác vụ"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Mở phần cài đặt"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Mở Trợ lý"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Màn hình khoá"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Vào chế độ chia đôi màn hình, ứng dụng hiện tại ở màn hình bên phải"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Vào chế độ chia đôi màn hình, ứng dụng hiện tại ở màn hình bên trái"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Chuyển từ chế độ chia đôi màn hình sang chế độ toàn màn hình"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Chuyển sang ứng dụng bên phải hoặc ở dưới khi đang chia đôi màn hình"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Chuyển sang ứng dụng bên trái hoặc ở trên khi đang chia đôi màn hình"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Trong chế độ chia đôi màn hình: thay một ứng dụng bằng ứng dụng khác"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Đầu vào"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Chuyển sang ngôn ngữ tiếp theo"</string>
@@ -1239,7 +1246,7 @@
     <string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Ít nhất phải có một thiết bị hoặc bảng điều khiển thiết bị"</string>
     <string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Chọn một ứng dụng ghi chú mặc định để dùng lối tắt ghi chú"</string>
     <string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Chọn ứng dụng"</string>
-    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Chạm và giữ phím tắt"</string>
+    <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Chạm và giữ lối tắt"</string>
     <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Huỷ"</string>
     <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Chuyển đổi màn hình ngay"</string>
     <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Mở điện thoại"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Máy ảnh bị chặn"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Máy ảnh và micrô bị chặn"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micrô bị chặn"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Không làm phiền"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Phát hiện thấy người dùng đang hiện diện"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Đặt ứng dụng ghi chú mặc định trong phần Cài đặt"</string>
     <string name="install_app" msgid="5066668100199613936">"Cài đặt ứng dụng"</string>
diff --git a/packages/SystemUI/res/values-vi/tiles_states_strings.xml b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
index 4df2d910..d9d8af1 100644
--- a/packages/SystemUI/res/values-vi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Đang tắt"</item>
     <item msgid="5137565285664080143">"Đang bật"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Không có"</item>
+    <item msgid="3079622119444911877">"Đang tắt"</item>
+    <item msgid="3028994095749238254">"Đang bật"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 874286a..6765d1e 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"分享"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"分享屏幕截图"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"截取更多内容"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"关闭屏幕截图"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"正在扫描面孔"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"发送"</string>
     <string name="cancel" msgid="1089011503403416730">"取消"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"应用徽标"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"确认"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"重试"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"点按即可取消身份验证"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"识别出面孔。按下解锁图标即可继续。"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"已经过身份验证"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"取消身份验证"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"更多选项"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN 码"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用图案"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"使用密码"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"标准"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"中"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"高"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要解锁设备麦克风吗?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"要解锁设备摄像头吗?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"要解锁设备摄像头和麦克风吗?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"移除"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"添加微件"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完成"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"添加微件"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"无需解锁平板电脑,即可快速使用您喜爱的应用微件。"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"允许在锁屏状态下显示任何微件?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"打开设置"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"是否为工作应用解除暂停状态?"</string>
@@ -489,7 +502,7 @@
     <string name="notification_section_header_gentle" msgid="6804099527336337197">"静音"</string>
     <string name="notification_section_header_alerting" msgid="5581175033680477651">"通知"</string>
     <string name="notification_section_header_conversations" msgid="821834744538345661">"对话"</string>
-    <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有无声通知"</string>
+    <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有静音通知"</string>
     <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"勿扰模式暂停的通知"</string>
     <string name="media_projection_action_text" msgid="3634906766918186440">"立即开始"</string>
     <string name="empty_shade_text" msgid="8935967157319717412">"没有通知"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"防盗保护\n设备已锁定,因为尝试解锁的次数过多"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"尝试验证身份的次数过多,设备已锁定"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"设备已锁定\n未能验证身份"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>(<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>)"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"声音设置"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"自动生成媒体字幕"</string>
@@ -583,16 +597,14 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"静音"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"投屏"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"该功能无法使用,因为铃声被静音"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"“勿扰”模式已开启,因此无法调整音量"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"“勿扰”模式已开启,因此无法调整音量"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s。点按即可取消静音。"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s。点按即可设为振动,但可能会同时将无障碍服务设为静音。"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s。点按即可设为静音,但可能会同时将无障碍服务设为静音。"</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s。点按即可设为振动。"</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s。点按即可设为静音。"</string>
-    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"噪声控制"</string>
+    <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"降噪"</string>
     <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"空间音频"</string>
     <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"关闭"</string>
     <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"固定"</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"振动"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s音量控件"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"有来电和通知时会响铃 (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"进入输出设置"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"音量滑块已展开"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"音量滑块已收起"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"静音“%s”"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"取消静音“%s”"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>播放位置:"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"音频播放位置:"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"系统界面调节工具"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"向前循环浏览最近用过的应用"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"向后循环浏览最近用过的应用"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"打开应用列表"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"显示任务栏"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"打开设置"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"打开 Google 助理"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"锁定屏幕"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"进入分屏模式,当前应用显示于右侧"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"进入分屏模式,当前应用显示于左侧"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"从分屏模式切换为全屏"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"使用分屏模式时,切换到右侧或下方的应用"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"使用分屏模式时,切换到左侧或上方的应用"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"在分屏期间:将一个应用替换为另一个应用"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"输入"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"切换到下一种语言"</string>
@@ -1165,7 +1173,7 @@
     <string name="mobile_data_connection_active" msgid="944490013299018227">"已连接"</string>
     <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"已暂时连接"</string>
     <string name="mobile_data_poor_connection" msgid="819617772268371434">"连接状况不佳"</string>
-    <string name="mobile_data_off_summary" msgid="3663995422004150567">"系统将不会自动连接到移动数据网络"</string>
+    <string name="mobile_data_off_summary" msgid="3663995422004150567">"不会自动连接到移动数据网络"</string>
     <string name="mobile_data_no_connection" msgid="1713872434869947377">"无网络连接"</string>
     <string name="non_carrier_network_unavailable" msgid="770049357024492372">"没有其他可用网络"</string>
     <string name="all_network_unavailable" msgid="4112774339909373349">"没有可用网络"</string>
@@ -1260,14 +1268,13 @@
     <string name="call_from_work_profile_action" msgid="2937701298133010724">"切换到工作资料"</string>
     <string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"安装工作电话应用"</string>
     <string name="call_from_work_profile_close" msgid="5830072964434474143">"取消"</string>
-    <string name="lock_screen_settings" msgid="6152703934761402399">"自定义锁屏状态"</string>
+    <string name="lock_screen_settings" msgid="6152703934761402399">"自定义锁屏"</string>
     <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"解锁以自定义锁定屏幕"</string>
     <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"没有 WLAN 连接"</string>
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已禁用摄像头"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已禁用摄像头和麦克风"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已禁用麦克风"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"勿扰"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"检测到用户存在"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在设置中设置默认记事应用"</string>
     <string name="install_app" msgid="5066668100199613936">"安装应用"</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 08a1551..a9a377a 100644
--- a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"已关闭"</item>
     <item msgid="5137565285664080143">"已开启"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index bb7919b..d4891d5 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"分享"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"分享螢幕截圖"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"擷取更大範圍的螢幕內容"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"關閉螢幕截圖"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"掃瞄緊面孔"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"傳送"</string>
     <string name="cancel" msgid="1089011503403416730">"取消"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"應用程式標誌"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"確認"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"請再試一次"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"輕按即可取消驗證"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"已識別面孔。按解鎖圖示即可繼續。"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"驗證咗"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"取消驗證"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"更多選項"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用圖案"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"使用密碼"</string>
@@ -360,6 +363,14 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"標準"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"中"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"高"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要解除封鎖裝置麥克風嗎?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"要解除封鎖裝置相機嗎?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"要解除封鎖裝置相機和麥克風嗎?"</string>
@@ -437,6 +448,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"移除"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"新增小工具"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完成"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"新增小工具"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"無需解鎖平板電腦,就能快速使用最愛的應用程式小工具。"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"要允許在上鎖畫面上顯示任何小工具嗎?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"開啟設定"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"要取消暫停工作應用程式嗎?"</string>
@@ -538,7 +551,8 @@
     <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">"由信任的代理保持解鎖狀態"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"防盜保護\n嘗試解鎖次數過多,裝置已上鎖"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"嘗試驗證次數過多,裝置已鎖定"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"裝置已鎖定\n驗證失敗"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"音效設定"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"自動為媒體加入字幕"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"靜音"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"投放"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"鈴聲已設定為靜音,因此無法使用"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"「請勿騷擾」已開啟,因此無法使用"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"「請勿騷擾」已開啟,因此無法使用"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s。輕按即可取消靜音。"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s。輕按即可設為震動。無障礙功能服務可能已經設為靜音。"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s。輕按即可設為靜音。無障礙功能服務可能已經設為靜音。"</string>
@@ -603,16 +615,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"震動"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s音量控制項"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"有來電和通知時會發出鈴聲 (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"輸入輸出設定"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"打開咗音量滑桿"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"閂埋咗音量滑桿"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"將%s設定為靜音"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"取消%s的靜音設定"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"正在播放「<xliff:g id="LABEL">%s</xliff:g>」的裝置:"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"音訊播放媒體"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"系統使用者介面調諧器"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"輪流切換最近使用的應用程式 (向前)"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"輪流切換最近使用的應用程式 (向後)"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"開啟應用程式清單"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"顯示工作列"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"開啟設定"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"開啟「Google 助理」"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"上鎖畫面"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"進入分割螢幕模式,並將目前的應用程式顯示在右側"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"進入分割螢幕模式,並將目前的應用程式顯示在左側"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"將分割螢幕切換為全螢幕"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"使用分割螢幕時,切換至右邊或下方的應用程式"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"使用分割螢幕時,切換至左邊或上方的應用程式"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"使用分割螢幕期間:更換應用程式"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"輸入"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"切換至下一個語言"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已封鎖相機"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已封鎖相機和麥克風"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已封鎖麥克風"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"請勿騷擾"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"偵測到使用者動態"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在「設定」中指定預設筆記應用程式"</string>
     <string name="install_app" msgid="5066668100199613936">"安裝應用程式"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
index e29d230..f0ccd9e 100644
--- a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"關閉"</item>
     <item msgid="5137565285664080143">"開啟"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index e48e483..bc59988 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -86,6 +86,7 @@
     <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>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"分享"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"分享螢幕截圖"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"擴大螢幕截圖範圍"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"關閉螢幕截圖"</string>
@@ -103,19 +104,19 @@
     <string name="screenrecord_title" msgid="4257171601439507792">"螢幕錄影器"</string>
     <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"處理螢幕錄影內容"</string>
     <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示螢幕畫面錄製工作階段通知"</string>
-    <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"要開始錄製嗎?"</string>
-    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"當你錄製內容時,Android 可存取畫面上顯示的任何資訊或裝置播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
-    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"當你錄製應用程式內容時,Android 可存取應用程式中顯示的任何資訊或播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
+    <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"要開始錄影嗎?"</string>
+    <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"你在錄影時,Android 可存取畫面上的所有資訊或裝置播放的所有內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音等內容。"</string>
+    <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"當你錄製應用程式畫面時,Android 可存取應用程式中顯示或播放的所有內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音等內容。"</string>
     <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"開始錄影"</string>
     <string name="screenrecord_audio_label" msgid="6183558856175159629">"錄音"</string>
     <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"裝置音訊"</string>
-    <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"裝置所播放的音效,例如音樂、通話和鈴聲等等"</string>
+    <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"來自裝置的音訊,例如音樂、通話和鈴聲等等"</string>
     <string name="screenrecord_mic_label" msgid="2111264835791332350">"麥克風"</string>
     <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"裝置音訊和麥克風"</string>
     <string name="screenrecord_continue" msgid="4055347133700593164">"開始"</string>
     <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"正在錄製螢幕畫面"</string>
     <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"錄製螢幕畫面和音訊"</string>
-    <string name="screenrecord_taps_label" msgid="1595690528298857649">"顯示輕觸螢幕的位置"</string>
+    <string name="screenrecord_taps_label" msgid="1595690528298857649">"顯示在螢幕上點按的位置"</string>
     <string name="screenrecord_stop_label" msgid="72699670052087989">"停止"</string>
     <string name="screenrecord_share_label" msgid="5025590804030086930">"分享"</string>
     <string name="screenrecord_save_title" msgid="1886652605520893850">"已儲存螢幕錄影檔"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"掃描臉孔"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"傳送"</string>
     <string name="cancel" msgid="1089011503403416730">"取消"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"應用程式標誌"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"確認"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"再試一次"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"輕觸即可取消驗證"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"臉孔辨識完成,按下「解鎖」圖示即可繼續操作。"</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"已通過驗證"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"取消驗證"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"更多選項"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN 碼"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用解鎖圖案"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"使用密碼"</string>
@@ -360,12 +363,20 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"標準"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"中"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"高"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要將裝置麥克風解除封鎖嗎?"</string>
-    <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"要將裝置相機解除封鎖嗎?"</string>
+    <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+    <skip />
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
+    <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要解除封鎖裝置麥克風嗎?"</string>
+    <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"要解除封鎖裝置相機嗎?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"要將裝置的相機和麥克風解除封鎖嗎?"</string>
-    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"這麼做可允許所有應用程式和服務使用麥克風。"</string>
-    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"這麼做可允許所有應用程式和服務使用相機。"</string>
-    <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"這麼做可允許所有應用程式和服務使用相機或麥克風。"</string>
+    <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"執行後,具備麥克風存取權的所有應用程式和服務,都將可使用麥克風。"</string>
+    <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"執行後,具備相機存取權的所有應用程式和服務,都將可使用相機。"</string>
+    <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"執行後,具備相機或麥克風存取權的所有應用程式和服務,都將可使用這兩項功能。"</string>
     <string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"無法使用麥克風"</string>
     <string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"無法使用攝影機"</string>
     <string name="sensor_privacy_start_use_mic_camera_blocked_dialog_title" msgid="195236134743281973">"無法使用麥克風和相機"</string>
@@ -437,13 +448,15 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"移除"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"新增小工具"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完成"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"新增小工具"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"快速使用喜愛的應用程式小工具,不必解鎖平板電腦。"</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"要允許在螢幕鎖定畫面上顯示任何小工具嗎?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"開啟設定"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"要解除工作應用程式的暫停狀態嗎?"</string>
     <string name="work_mode_turn_on" msgid="907813741770247267">"取消暫停"</string>
     <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切換使用者"</string>
     <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"下拉式選單"</string>
-    <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"這個工作階段中的所有應用程式和資料都會遭到刪除。"</string>
+    <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"這個工作階段中的所有應用程式和資料都會刪除。"</string>
     <string name="guest_wipe_session_title" msgid="7147965814683990944">"訪客你好,歡迎回來!"</string>
     <string name="guest_wipe_session_message" msgid="3393823610257065457">"你要繼續這個工作階段嗎?"</string>
     <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"重新開始"</string>
@@ -469,8 +482,8 @@
     <string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"開始"</string>
     <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」已停用此選項"</string>
     <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"要開始投放嗎?"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"當你投放內容時,Android 可存取畫面上顯示的任何資訊或裝置播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
-    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"當你投放應用程式內容時,Android 可存取應用程式中顯示的任何資訊或播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"投放時,Android 可存取畫面上顯示的任何資訊或裝置播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音等內容。"</string>
+    <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"當你投放應用程式時,Android 可存取應用程式顯示的任何資訊或播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音等內容。"</string>
     <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"開始投放"</string>
     <string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"要開始分享嗎?"</string>
     <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"當你分享、錄製或投放內容時,Android 將可存取畫面上顯示的任何資訊或裝置播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
@@ -538,7 +551,8 @@
     <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="1265107698772588299">"防盜保護\n解鎖失敗次數過多,裝置已鎖定"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"驗證錯誤次數過多,裝置已鎖定"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"裝置已鎖定\n驗證失敗"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"音效設定"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"自動產生媒體字幕"</string>
@@ -583,10 +597,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"靜音"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"投放"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"鈴聲已設為靜音,因此無法使用"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"「零打擾」模式已開啟,因此無法調整音量"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"「零打擾」模式已開啟,因此無法調整音量"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s。輕觸即可取消靜音。"</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s。輕觸即可設為震動,但系統可能會將無障礙服務一併設為靜音。"</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s。輕觸即可設為靜音,但系統可能會將無障礙服務一併設為靜音。"</string>
@@ -603,18 +615,13 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"震動"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"「%s」音量控制項"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"有來電和通知時會響鈴 (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"進入輸出設定"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"音量滑桿已展開"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"音量滑桿已收合"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"將%s設為靜音"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"將%s取消靜音"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"正在播放「<xliff:g id="LABEL">%s</xliff:g>」的裝置:"</string>
-    <string name="media_output_title_without_playing" msgid="3825663683169305013">"將播放音訊的媒體:"</string>
+    <string name="media_output_title_without_playing" msgid="3825663683169305013">"音訊播放位置"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"系統使用者介面調整精靈"</string>
     <string name="status_bar" msgid="4357390266055077437">"狀態列"</string>
     <string name="demo_mode" msgid="263484519766901593">"系統 UI 展示模式"</string>
@@ -759,7 +766,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"前往最近開啟的應用程式"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"返回最近開啟的應用程式"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"開啟應用程式清單"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"顯示工作列"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"開啟設定"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"開啟 Google 助理"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"螢幕鎖定"</string>
@@ -768,6 +774,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"進入分割畫面模式,並將目前的應用程式顯示於右側"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"進入分割畫面模式,並將目前的應用程式顯示於左側"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"從分割畫面切換到完整畫面"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"使用分割畫面時,切換到右邊或上方的應用程式"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"使用分割畫面時,切換到左邊或上方的應用程式"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"使用分割畫面期間:更換應用程式"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"輸入"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"切換到下一個語言"</string>
@@ -1266,8 +1274,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已封鎖攝影機"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已封鎖攝影機和麥克風"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已封鎖麥克風"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"零打擾"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"偵測到使用者"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在「設定」中指定預設記事應用程式"</string>
     <string name="install_app" msgid="5066668100199613936">"安裝應用程式"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
index 85e1796..2c474f6 100644
--- a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
@@ -186,4 +186,7 @@
     <item msgid="2478289035899842865">"關閉"</item>
     <item msgid="5137565285664080143">"開啟"</item>
   </string-array>
+    <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+    <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+    <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
 </resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index da75c5d..780fe94 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -86,6 +86,7 @@
     <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Ukuthatha isithombe-skrini kuvinjwe umlawuli wakho we-IT"</string>
     <string name="screenshot_edit_label" msgid="8754981973544133050">"Hlela"</string>
     <string name="screenshot_edit_description" msgid="3333092254706788906">"Hlela isithombe-skrini"</string>
+    <string name="screenshot_share_label" msgid="1653061117238861559">"Yabelana"</string>
     <string name="screenshot_share_description" msgid="2861628935812656612">"Yabelana ngesithombe-skrini"</string>
     <string name="screenshot_scroll_label" msgid="2930198809899329367">"Thwebula okuningi"</string>
     <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Cashisa isithombe-skrini"</string>
@@ -150,6 +151,7 @@
     <string name="accessibility_scanning_face" msgid="3093828357921541387">"Ukuskena ubuso"</string>
     <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Thumela"</string>
     <string name="cancel" msgid="1089011503403416730">"Khansela"</string>
+    <string name="biometric_dialog_logo" msgid="7681107853070774595">"Ilogo ye-app"</string>
     <string name="biometric_dialog_confirm" msgid="2005978443007344895">"Qinisekisa"</string>
     <string name="biometric_dialog_try_again" msgid="8575345628117768844">"Zama futhi"</string>
     <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Thepha ukuze ukhansele ukufakazela ubuqiniso"</string>
@@ -164,6 +166,7 @@
     <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ubuso buyaziwa. Cindezela isithonjana sokuvula ukuze uqhubeke."</string>
     <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Kugunyaziwe"</string>
     <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Khansela Ukuqinisekisa"</string>
+    <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Okukhethwayo Okwengeziwe"</string>
     <string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Sebenzisa iphinikhodi"</string>
     <string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Sebenzisa iphethini"</string>
     <string name="biometric_dialog_use_password" msgid="3445033859393474779">"Sebenzisa iphasiwedi"</string>
@@ -360,6 +363,13 @@
     <string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Okujwayelekile"</string>
     <string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Okuphakathi"</string>
     <string name="quick_settings_contrast_high" msgid="656049259587494499">"Phezulu"</string>
+    <string name="quick_settings_hearing_devices_label" msgid="7277170419679404129">"Izinsizakuzwa"</string>
+    <!-- no translation found for quick_settings_hearing_devices_dialog_title (9004774017688484981) -->
+    <skip />
+    <!-- no translation found for quick_settings_pair_hearing_devices (5987105102207447322) -->
+    <skip />
+    <!-- no translation found for accessibility_hearing_device_pair_new_device (8440082580186130090) -->
+    <skip />
     <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vulela imakrofoni yedivayisi?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vulela ikhamera yedivayisi?"</string>
     <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vulela ikhamera yedivayisi nemakrofoni?"</string>
@@ -437,6 +447,8 @@
     <string name="button_to_remove_widget" msgid="3948204829181214098">"Susa"</string>
     <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Engeza iwijethi"</string>
     <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Kwenziwe"</string>
+    <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Faka iwijethi"</string>
+    <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Thola ukufinyelela okusheshayo kumawijethi e-app akho owathandayo ngaphandle kokuvula ithebhulethi yakho."</string>
     <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vumela noma iyiphi iwijethi ekukhiyeni isikrini?"</string>
     <string name="button_text_to_open_settings" msgid="1987729256950941628">"Vula amasethingi"</string>
     <string name="work_mode_off_title" msgid="5794818421357835873">"Susa ukumisa ama-app omsebenzi?"</string>
@@ -538,7 +550,8 @@
     <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Le divayisi iphethwe ngumzali wakho. Umzali wakho angabona futhi aphathe ulwazi olunjengezinhlelo zokusebenza ozisebenzisayo, indawo yakho, kanye nesikhathi sesikrini."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"I-VPN"</string>
     <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Igcinwa ivuliwe ngo-TrustAgent"</string>
-    <string name="kg_prompt_after_adaptive_auth_lock" msgid="1265107698772588299">"Isivikelo sokweba\nIdivayisi ikhiyiwe, imizamo yokuvula eminingi kakhulu"</string>
+    <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Idivayisi ibikhiyiwe, imizamo eminingi kakhulu yokufakazela ubuqiniso"</string>
+    <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Idivayisi ikhiyiwe\nUkufakazela ubuqiniso kwehlulekile"</string>
     <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
     <string name="accessibility_volume_settings" msgid="1458961116951564784">"Izilungiselelo zomsindo"</string>
     <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Yenza amagama-ngcazo ngokuzenzakalela emidiya"</string>
@@ -583,10 +596,8 @@
     <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Thulisa"</string>
     <string name="media_device_cast" msgid="4786241789687569892">"Sakaza"</string>
     <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ayitholakali ngoba ukukhala kuthulisiwe"</string>
-    <!-- no translation found for stream_alarm_unavailable (4059817189292197839) -->
-    <skip />
-    <!-- no translation found for stream_media_unavailable (6823020894438959853) -->
-    <skip />
+    <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Ayitholakali ngoba okuthi Ungaphazamisi kuvuliwe"</string>
+    <string name="stream_media_unavailable" msgid="6823020894438959853">"Ayitholakali ngoba okuthi Ungaphazamisi kuvuliwe"</string>
     <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Thepha ukuze ususe ukuthula."</string>
     <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Thepha ukuze usethe ukudlidliza. Amasevisi okufinyelela angathuliswa."</string>
     <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Thepha ukuze uthulise. Amasevisi okufinyelela angathuliswa."</string>
@@ -603,16 +614,11 @@
     <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"dlidliza"</string>
     <string name="volume_dialog_title" msgid="6502703403483577940">"%s izilawuli zevolomu"</string>
     <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Amakholi nezaziso zizokhala (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
-    <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) -->
-    <skip />
-    <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) -->
-    <skip />
-    <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_mute (6962563028495243738) -->
-    <skip />
-    <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) -->
-    <skip />
+    <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Faka amasethingi wokuphumayo"</string>
+    <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Izilayidi zevolumu zinwetshiwe"</string>
+    <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Izilayidi zevolumu zigoqiwe"</string>
+    <string name="volume_panel_hint_mute" msgid="6962563028495243738">"thulisa i-%s"</string>
+    <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"susa ukuthula kwe-%s"</string>
     <string name="media_output_label_title" msgid="872824698593182505">"Idlala ku-<xliff:g id="LABEL">%s</xliff:g>"</string>
     <string name="media_output_title_without_playing" msgid="3825663683169305013">"Umsindo uzodlala"</string>
     <string name="system_ui_tuner" msgid="1471348823289954729">"Isishuni se-UI yesistimu"</string>
@@ -759,7 +765,6 @@
     <string name="group_system_cycle_forward" msgid="5478663965957647805">"Zungeza ubheke phambili ngama-app akamuva"</string>
     <string name="group_system_cycle_back" msgid="8194102916946802902">"Zungeza ubuyele emuva ngama-app akamuva"</string>
     <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Vula uhlu lwama-app"</string>
-    <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Bonisa i-taskbar"</string>
     <string name="group_system_access_system_settings" msgid="8731721963449070017">"Vula amasethingi"</string>
     <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Vula umsizi"</string>
     <string name="group_system_lock_screen" msgid="7391191300363416543">"Khiya isikrini"</string>
@@ -768,6 +773,8 @@
     <string name="system_multitasking_rhs" msgid="2454557648974553729">"Faka ukuhlukanisa isikrini nge-app yamanje kuya ku-RHS"</string>
     <string name="system_multitasking_lhs" msgid="3516599774920979402">"Faka ukuhlukanisa isikrini nge-app yamanje kuya ku-LHS"</string>
     <string name="system_multitasking_full_screen" msgid="336048080383640562">"Shintsha usuka ekuhlukaniseni isikrini uye kusikrini esigcwele"</string>
+    <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Shintshela ku-app ngakwesokudla noma ngezansi ngenkathi usebenzisa uhlukanisa isikrini"</string>
+    <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Shintshela ku-app ngakwesokunxele noma ngaphezulu ngenkathi usebenzisa ukuhlukanisa isikrini"</string>
     <string name="system_multitasking_replace" msgid="7410071959803642125">"Ngesikhathi sokuhlukaniswa kwesikrini: shintsha i-app ngenye"</string>
     <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Okokufaka"</string>
     <string name="input_switch_input_language_next" msgid="3782155659868227855">"Shintshela olimini olulandelayo"</string>
@@ -1266,8 +1273,7 @@
     <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Ikhamera ivinjiwe"</string>
     <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Ikhamera nemakrofoni zivinjiwe"</string>
     <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Imakrofoni ivinjiwe"</string>
-    <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) -->
-    <skip />
+    <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Ungaphazamisi"</string>
     <string name="assistant_attention_content_description" msgid="4166330881435263596">"Ubukhona bomsebenzisi butholakele"</string>
     <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setha i-app yamanothi azenzakalelayo Kumsethingi"</string>
     <string name="install_app" msgid="5066668100199613936">"Faka i-app"</string>
diff --git a/packages/SystemUI/res/values-zu/tiles_states_strings.xml b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
index 5c5a67c..a795ee8 100644
--- a/packages/SystemUI/res/values-zu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
@@ -186,4 +186,9 @@
     <item msgid="2478289035899842865">"Valiwe"</item>
     <item msgid="5137565285664080143">"Vuliwe"</item>
   </string-array>
+  <string-array name="tile_states_hearing_devices">
+    <item msgid="1235334096484287173">"Ayitholakali"</item>
+    <item msgid="3079622119444911877">"Kuvaliwe"</item>
+    <item msgid="3028994095749238254">"Kuvuliwe"</item>
+  </string-array>
 </resources>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 307a619..590dc68 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -140,9 +140,6 @@
     <color name="biometric_dialog_gray">#ff757575</color>
     <color name="biometric_dialog_accent">@color/material_dynamic_primary40</color>
     <color name="biometric_dialog_error">#ffd93025</color>                  <!-- red 600 -->
-    <!-- Color for biometric prompt content view -->
-    <color name="biometric_prompt_content_background_color">#8AB4F8</color>
-    <color name="biometric_prompt_content_list_item_bullet_color">#1d873b</color>
 
     <!-- SFPS colors -->
     <color name="sfps_chevron_fill">@color/material_dynamic_primary90</color>
diff --git a/packages/SystemUI/res/values/colors_tv.xml b/packages/SystemUI/res/values/colors_tv.xml
index 2bab3cb..5d45607 100644
--- a/packages/SystemUI/res/values/colors_tv.xml
+++ b/packages/SystemUI/res/values/colors_tv.xml
@@ -28,8 +28,6 @@
 
     <color name="red">#FFCC0000</color>
     <color name="tv_volume_dialog_circle">#08FFFFFF</color>
-    <color name="tv_volume_dialog_seek_thumb_focus_ring">#1AFFFFFF</color>
-    <color name="tv_volume_dialog_seek_thumb_shadow">#40000000</color>
     <color name="tv_volume_dialog_seek_bar_background">#A03C4043</color>
     <color name="tv_volume_dialog_seek_bar_fill">#FFF8F9FA</color>
     <color name="tv_volume_dialog_accent">#FFDADCE0</color>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 35f6a08..a6f6d4d 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -101,7 +101,7 @@
 
     <!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" -->
     <string name="quick_settings_tiles_stock" translatable="false">
-        internet,bt,flashlight,dnd,alarm,airplane,controls,wallet,rotation,battery,cast,screenrecord,mictoggle,cameratoggle,location,hotspot,inversion,saver,dark,work,night,reverse,reduce_brightness,qr_code_scanner,onehanded,color_correction,dream,font_scaling,record_issue
+        internet,bt,flashlight,dnd,alarm,airplane,controls,wallet,rotation,battery,cast,screenrecord,mictoggle,cameratoggle,location,hotspot,inversion,saver,dark,work,night,reverse,reduce_brightness,qr_code_scanner,onehanded,color_correction,dream,font_scaling,record_issue,hearing_devices
     </string>
 
     <!-- The tiles to display in QuickSettings -->
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 2285550..af327d2 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -164,8 +164,9 @@
     so the width of the icon should be 13.0sp * (12.0 / 20.0) -->
     <dimen name="status_bar_battery_icon_width">7.8sp</dimen>
 
-    <dimen name="status_bar_battery_unified_icon_width">24sp</dimen>
-    <dimen name="status_bar_battery_unified_icon_height">14sp</dimen>
+    <!-- Original canvas is 24x14. These dimens reflect that ratio, with 12sp height instead  -->
+    <dimen name="status_bar_battery_unified_icon_width">20.6sp</dimen>
+    <dimen name="status_bar_battery_unified_icon_height">12sp</dimen>
 
     <!-- The battery icon is 13sp tall, but the other system icons are 15sp tall (see
          @*android:dimen/status_bar_system_icon_size) with some top and bottom padding embedded in
@@ -448,6 +449,7 @@
     <dimen name="overlay_action_container_padding_end">8dp</dimen>
     <dimen name="overlay_dismiss_button_tappable_size">48dp</dimen>
     <dimen name="overlay_dismiss_button_margin">8dp</dimen>
+    <dimen name="screenshot_shelf_vertical_margin">8dp</dimen>
     <!-- must be kept aligned with overlay_border_width_neg, below;
          overlay_border_width = overlay_border_width_neg * -1 -->
     <dimen name="overlay_border_width">4dp</dimen>
@@ -976,6 +978,7 @@
     <dimen name="assist_disclosure_shadow_thickness">1.5dp</dimen>
 
     <!-- Keyboard shortcuts helper -->
+    <dimen name="ksh_container_horizontal_margin">32dp</dimen>
     <dimen name="ksh_layout_width">@dimen/match_parent</dimen>
     <dimen name="ksh_item_text_size">14sp</dimen>
     <dimen name="ksh_item_padding">0dp</dimen>
@@ -983,6 +986,11 @@
     <dimen name="ksh_icon_scaled_size">18dp</dimen>
     <dimen name="ksh_key_view_padding_vertical">4dp</dimen>
     <dimen name="ksh_key_view_padding_horizontal">12dp</dimen>
+    <dimen name="ksh_button_corner_radius">12dp</dimen>
+    <dimen name="ksh_dialog_top_corner_radius">28dp</dimen>
+    <dimen name="ksh_search_box_corner_radius">100dp</dimen>
+    <dimen name="ksh_app_item_minimum_height">64dp</dimen>
+    <dimen name="ksh_category_separator_margin">16dp</dimen>
 
     <!-- The size of corner radius of the arrow in the onboarding toast. -->
     <dimen name="recents_onboarding_toast_arrow_corner_radius">2dp</dimen>
@@ -1083,7 +1091,7 @@
     <dimen name="remote_input_history_extra_height">60dp</dimen>
 
     <!-- Biometric Dialog values -->
-    <dimen name="biometric_dialog_face_icon_size">64dp</dimen>
+    <dimen name="biometric_dialog_face_icon_size">54dp</dimen>
     <dimen name="biometric_dialog_fingerprint_icon_width">80dp</dimen>
     <dimen name="biometric_dialog_fingerprint_icon_height">80dp</dimen>
     <dimen name="biometric_dialog_button_negative_max_width">160dp</dimen>
@@ -1101,15 +1109,31 @@
     <dimen name="biometric_dialog_width">240dp</dimen>
     <dimen name="biometric_dialog_height">240dp</dimen>
 
-    <!-- Dimensions for biometric prompt content view. -->
-    <dimen name="biometric_prompt_space_above_content">48dp</dimen>
-    <dimen name="biometric_prompt_content_container_padding_horizontal">24dp</dimen>
-    <dimen name="biometric_prompt_content_padding_horizontal">10dp</dimen>
-    <dimen name="biometric_prompt_content_list_row_height">24dp</dimen>
-    <dimen name="biometric_prompt_content_list_item_padding_horizontal">10dp</dimen>
-    <dimen name="biometric_prompt_content_list_item_text_size">14sp</dimen>
-    <dimen name="biometric_prompt_content_list_item_bullet_gap_width">10dp</dimen>
-    <dimen name="biometric_prompt_content_list_item_bullet_radius">5dp</dimen>
+    <!-- Dimensions for biometric prompt panel padding -->
+    <dimen name="biometric_prompt_small_horizontal_guideline_padding">344dp</dimen>
+    <dimen name="biometric_prompt_udfps_horizontal_guideline_padding">114dp</dimen>
+    <dimen name="biometric_prompt_udfps_mid_guideline_padding">409dp</dimen>
+    <dimen name="biometric_prompt_medium_horizontal_guideline_padding">640dp</dimen>
+    <dimen name="biometric_prompt_medium_mid_guideline_padding">330dp</dimen>
+
+    <!-- Dimensions for biometric prompt icon padding -->
+    <dimen name="biometric_prompt_portrait_small_bottom_padding">60dp</dimen>
+    <dimen name="biometric_prompt_portrait_medium_bottom_padding">160dp</dimen>
+    <dimen name="biometric_prompt_portrait_large_screen_bottom_padding">176dp</dimen>
+    <dimen name="biometric_prompt_landscape_small_bottom_padding">192dp</dimen>
+    <dimen name="biometric_prompt_landscape_small_horizontal_padding">145dp</dimen>
+    <dimen name="biometric_prompt_landscape_medium_bottom_padding">148dp</dimen>
+    <dimen name="biometric_prompt_landscape_medium_horizontal_padding">125dp</dimen>
+
+    <!-- Dimensions for biometric prompt custom content view. -->
+    <dimen name="biometric_prompt_logo_size">32dp</dimen>
+    <dimen name="biometric_prompt_content_corner_radius">28dp</dimen>
+    <dimen name="biometric_prompt_content_padding_horizontal">24dp</dimen>
+    <dimen name="biometric_prompt_content_padding_vertical">16dp</dimen>
+    <dimen name="biometric_prompt_content_space_width_between_items">16dp</dimen>
+    <dimen name="biometric_prompt_content_list_item_padding_top">12dp</dimen>
+    <dimen name="biometric_prompt_content_list_item_bullet_gap_width">8.5dp</dimen>
+    <dimen name="biometric_prompt_content_list_item_bullet_radius">1.5dp</dimen>
 
     <!-- Biometric Auth Credential values -->
     <dimen name="biometric_auth_icon_size">48dp</dimen>
@@ -1266,6 +1290,8 @@
     <dimen name="magnifier_corner_radius">28dp</dimen>
     <dimen name="magnifier_edit_corner_radius">16dp</dimen>
     <dimen name="magnifier_edit_outer_corner_radius">18dp</dimen>
+    <dimen name="magnifier_border_width_fullscreen_with_offset">12dp</dimen>
+    <dimen name="magnifier_border_width_fullscreen">6dp</dimen>
     <dimen name="magnifier_border_width">8dp</dimen>
     <dimen name="magnifier_stroke_width">2dp</dimen>
     <dimen name="magnifier_edit_dash_gap">20dp</dimen>
@@ -1863,6 +1889,10 @@
         .2
     </item>
 
+    <item name="dream_overlay_bouncer_min_region_screen_percentage" format="float" type="dimen">
+        .05
+    </item>
+
     <!-- The padding applied to the dream overlay container -->
     <dimen name="dream_overlay_container_padding_start">0dp</dimen>
     <dimen name="dream_overlay_container_padding_end">0dp</dimen>
@@ -1971,4 +2001,7 @@
 
     <!-- SliceView grid gutter for ANC Slice -->
     <dimen name="abc_slice_grid_gutter">0dp</dimen>
+    <!-- SliceView icon size -->
+    <dimen name="abc_slice_big_pic_min_height">64dp</dimen>
+    <dimen name="abc_slice_big_pic_max_height">64dp</dimen>
 </resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 3029888..af661aa 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -380,6 +380,8 @@
     <!-- Button name for "Cancel". [CHAR LIMIT=NONE] -->
     <string name="cancel">Cancel</string>
 
+    <!-- Content description for the app logo icon on biometric prompt. [CHAR LIMIT=NONE] -->
+    <string name="biometric_dialog_logo">App logo</string>
     <!-- Message shown when a biometric is authenticated, asking the user to confirm authentication [CHAR LIMIT=30] -->
     <string name="biometric_dialog_confirm">Confirm</string>
     <!-- Button name on BiometricPrompt shown when a biometric is detected but not authenticated. Tapping the button resumes authentication [CHAR LIMIT=30] -->
@@ -408,6 +410,8 @@
     <string name="biometric_dialog_authenticated">Authenticated</string>
     <!-- Talkback string when a canceling authentication [CHAR LIMIT=NONE] -->
     <string name="biometric_dialog_cancel_authentication">Cancel Authentication</string>
+    <!-- Content description for the more options button on biometric prompt content view. [CHAR LIMIT=60] -->
+    <string name="biometric_dialog_content_view_more_options_button">More Options</string>
 
     <!-- Button text shown on BiometricPrompt giving the user the option to use an alternate form of authentication (Pin) [CHAR LIMIT=30] -->
     <string name="biometric_dialog_use_pin">Use PIN</string>
@@ -868,6 +872,8 @@
     <string name="qs_record_issue_start">Start</string>
     <!-- QuickSettings: Text to prompt the user to stop an ongoing recording [CHAR LIMIT=20] -->
     <string name="qs_record_issue_stop">Stop</string>
+    <!-- QuickSettings: Should user take a bugreport or only share trace files [CHAR LIMIT=20] -->
+    <string name="qs_record_issue_bug_report">Bug Report</string>
 
     <!-- QuickSettings: Issue Type Drop down options in Record Issue Start Dialog [CHAR LIMIT=50] -->
     <string name="qs_record_issue_dropdown_header">What part of your device experience was affected?</string>
@@ -895,6 +901,16 @@
     <!-- QuickSettings: Contrast tile description: high [CHAR LIMIT=NONE] -->
     <string name="quick_settings_contrast_high">High</string>
 
+    <!-- Hearing devices -->
+    <!-- QuickSettings: Hearing devices [CHAR LIMIT=NONE] -->
+    <string name="quick_settings_hearing_devices_label">Hearing devices</string>
+    <!-- QuickSettings: Quick Settings Hearing devices dialog title [CHAR LIMIT=30] -->
+    <string name="quick_settings_hearing_devices_dialog_title">Hearing devices</string>
+    <!-- QuickSettings: Hearing devices dialog pair new device [CHAR LIMIT=NONE]-->
+    <string name="quick_settings_pair_hearing_devices">Pair new device</string>
+    <!-- QuickSettings: Content description of the hearing devices dialog pair new device [CHAR LIMIT=NONE] -->
+    <string name="accessibility_hearing_device_pair_new_device">Click to pair new device</string>
+
     <!--- Title of dialog triggered if the microphone is disabled but an app tried to access it. [CHAR LIMIT=150] -->
     <string name="sensor_privacy_start_use_mic_dialog_title">Unblock device microphone?</string>
     <!--- Title of dialog triggered if the camera is disabled but an app tried to access it. [CHAR LIMIT=150] -->
@@ -1115,15 +1131,15 @@
     <!-- Indicator on keyguard to start the communal tutorial. [CHAR LIMIT=100] -->
     <string name="communal_tutorial_indicator_text">Swipe left to start the communal tutorial</string>
 
-    <!-- Text for CTA button that launches the hub mode widget editor on click. [CHAR LIMIT=50] -->
+    <!-- Text for call-to-action button that launches the hub mode widget editor on click. [CHAR LIMIT=50] -->
     <string name="cta_tile_button_to_open_widget_editor">Customize</string>
-    <!-- Text for CTA button that dismisses the tile on click. [CHAR LIMIT=50] -->
+    <!-- Text for call-to-action button that dismisses the tile on click. [CHAR LIMIT=50] -->
     <string name="cta_tile_button_to_dismiss">Dismiss</string>
-    <!-- Label for CTA tile to edit the glanceable hub [CHAR LIMIT=100] -->
+    <!-- Label for call-to-action tile to edit the glanceable hub [CHAR LIMIT=100] -->
     <string name="cta_label_to_edit_widget">Add, remove, and reorder your widgets in this space</string>
-    <!-- Label for CTA tile that opens widget picker on click in edit mode [CHAR LIMIT=50] -->
+    <!-- Label for call-to-action tile that opens widget picker on click in edit mode [CHAR LIMIT=50] -->
     <string name="cta_label_to_open_widget_picker">Add more widgets</string>
-    <!-- Text for the popup to be displayed after dismissing the CTA tile. [CHAR LIMIT=50] -->
+    <!-- Text for the popup to be displayed after dismissing the call-to-action tile. [CHAR LIMIT=50] -->
     <string name="popup_on_dismiss_cta_tile_text">Long press to customize widgets</string>
     <!-- Text for the button to configure widgets after long press. [CHAR LIMIT=50] -->
     <string name="button_to_configure_widgets_text">Customize widgets</string>
@@ -1137,6 +1153,10 @@
     <string name="hub_mode_add_widget_button_text">Add widget</string>
     <!-- Text for the button that exits the hub mode editing mode. [CHAR LIMIT=50] -->
     <string name="hub_mode_editing_exit_button_text">Done</string>
+    <!-- Label for the button in the empty state call-to-action tile that will open the widget picker. [CHAR LIMIT=NONE] -->
+    <string name="label_for_button_in_empty_state_cta">Add widgets</string>
+    <!-- Title for the empty state call-to-action when no widgets are available in the hub. [CHAR LIMIT=NONE] -->
+    <string name="title_for_empty_state_cta">Get quick access to your favorite app widgets without unlocking your tablet.</string>
     <!-- Title for the dialog that redirects users to change allowed widget category in settings. [CHAR LIMIT=NONE] -->
     <string name="dialog_title_to_allow_any_widget">Allow any widget on lock screen?</string>
     <!-- Text for the button in the dialog that opens when tapping on disabled widgets. [CHAR LIMIT=NONE] -->
@@ -1953,7 +1973,7 @@
     <!-- Content description for the clear search button in shortcut search list. [CHAR LIMIT=NONE] -->
     <string name="keyboard_shortcut_clear_text">Clear search query</string>
     <!-- The title for keyboard shortcut search list [CHAR LIMIT=25] -->
-    <string name="keyboard_shortcut_search_list_title">Shortcuts</string>
+    <string name="keyboard_shortcut_search_list_title">Keyboard Shortcuts</string>
     <!-- The hint for keyboard shortcut search list [CHAR LIMIT=25] -->
     <string name="keyboard_shortcut_search_list_hint">Search shortcuts</string>
     <!-- The description for no shortcuts results [CHAR LIMIT=25] -->
@@ -2005,12 +2025,12 @@
     <!-- User visible title for the keyboard shortcut that pulls up Notes app for quick memo. [CHAR LIMIT=70] -->
     <string name="group_system_quick_memo">Take a note</string>
 
-    <!-- User visible title for the system multitasking keyboard shortcuts list. [CHAR LIMIT=70] -->
-    <string name="keyboard_shortcut_group_system_multitasking">System multitasking</string>
-    <!-- User visible title for the keyboard shortcut that enters split screen with current app to RHS [CHAR LIMIT=70] -->
-    <string name="system_multitasking_rhs">Enter split screen with current app to RHS</string>
-    <!-- User visible title for the keyboard shortcut that enters split screen with current app to LHS [CHAR LIMIT=70] -->
-    <string name="system_multitasking_lhs">Enter split screen with current app to LHS</string>
+    <!-- User visible title for the multitasking keyboard shortcuts list. [CHAR LIMIT=70] -->
+    <string name="keyboard_shortcut_group_system_multitasking">Multitasking</string>
+    <!-- User visible title for the keyboard shortcut that enters split screen with current app on the right [CHAR LIMIT=70] -->
+    <string name="system_multitasking_rhs">Use split screen with current app on the right</string>
+    <!-- User visible title for the keyboard shortcut that enters split screen with current app on the left [CHAR LIMIT=70] -->
+    <string name="system_multitasking_lhs">Use split screen with current app on the left</string>
     <!-- User visible title for the keyboard shortcut that switches from split screen to full screen [CHAR LIMIT=70] -->
     <string name="system_multitasking_full_screen">Switch from split screen to full screen</string>
     <!-- User visible title for the keyboard shortcut that switches to app on right or below while using split screen [CHAR LIMIT=70] -->
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 0483a07..2c9006e 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -174,43 +174,64 @@
         <item name="android:textColor">?android:attr/textColorPrimary</item>
     </style>
 
-    <style name="TextAppearance.AuthCredential.Title">
+    <style name="TextAppearance.AuthCredential.OldTitle">
         <item name="android:fontFamily">google-sans</item>
         <item name="android:paddingTop">12dp</item>
         <item name="android:paddingHorizontal">24dp</item>
         <item name="android:textSize">24sp</item>
     </style>
 
-    <style name="TextAppearance.AuthCredential.Subtitle">
+    <style name="TextAppearance.AuthCredential.OldSubtitle">
         <item name="android:fontFamily">google-sans</item>
         <item name="android:paddingTop">8dp</item>
         <item name="android:paddingHorizontal">24dp</item>
         <item name="android:textSize">16sp</item>
     </style>
 
-    <style name="TextAppearance.AuthCredential.Description">
+    <style name="TextAppearance.AuthCredential.OldDescription">
         <item name="android:fontFamily">google-sans</item>
         <item name="android:paddingTop">8dp</item>
         <item name="android:paddingHorizontal">24dp</item>
         <item name="android:textSize">14sp</item>
     </style>
 
-    <style name="TextAppearance.AuthCredential.ContentViewTitle">
-        <item name="android:fontFamily">google-sans</item>
-        <item name="android:paddingTop">8dp</item>
-        <item name="android:paddingHorizontal">24dp</item>
-        <item name="android:textSize">14sp</item>
-        <item name="android:gravity">start</item>
+    <style name="TextAppearance.AuthCredential.LogoDescription" parent="TextAppearance.Material3.LabelLarge" >
+        <item name="android:ellipsize">marquee</item>
+        <item name="android:gravity">@integer/biometric_dialog_text_gravity</item>
+        <item name="android:marqueeRepeatLimit">1</item>
+        <item name="android:singleLine">true</item>
+        <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
     </style>
 
-    <style name="TextAppearance.AuthCredential.ContentViewListItem">
-        <item name="android:fontFamily">google-sans</item>
-        <item name="android:paddingTop">8dp</item>
-        <item name="android:paddingHorizontal">
-            @dimen/biometric_prompt_content_list_item_padding_horizontal
-        </item>
-        <item name="android:textSize">@dimen/biometric_prompt_content_list_item_text_size</item>
-        <item name="android:gravity">start</item>
+    <style name="TextAppearance.AuthCredential.Title" parent="TextAppearance.Material3.HeadlineSmall" >
+        <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+    </style>
+
+    <style name="TextAppearance.AuthCredential.Subtitle" parent="TextAppearance.Material3.BodyMedium" >
+        <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+    </style>
+
+    <style name="TextAppearance.AuthCredential.Description" parent="TextAppearance.Material3.BodyMedium" >
+        <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+    </style>
+
+    <style name="TextAppearance.AuthCredential.VerticalListContentViewDescription" parent="TextAppearance.Material3.TitleSmall">
+        <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+    </style>
+
+    <style name="TextAppearance.AuthCredential.ContentViewWithButtonDescription" parent="TextAppearance.AuthCredential.Description" />
+
+    <style name="TextAppearance.AuthCredential.ContentViewListItem" parent="TextAppearance.Material3.BodySmall">
+        <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
+        <item name="android:paddingTop">@dimen/biometric_prompt_content_list_item_padding_top</item>
+        <item name="android:breakStrategy">high_quality</item>
+    </style>
+
+    <style name="TextAppearance.AuthCredential.Indicator" parent="TextAppearance.Material3.BodyMedium">
+        <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+        <item name="android:marqueeRepeatLimit">marquee_forever</item>
+        <item name="android:singleLine">true</item>
+        <item name="android:ellipsize">marquee</item>
     </style>
 
     <style name="TextAppearance.AuthCredential.Error">
@@ -312,9 +333,27 @@
         <item name="android:textSize">16sp</item>
     </style>
 
-    <style name="AuthCredentialContentLayoutStyle">
-        <item name="android:background">@color/biometric_prompt_content_background_color</item>
+    <style name="AuthCredentialContentViewStyle">
+        <item name="android:gravity">center_vertical</item>
+        <item name="android:orientation">vertical</item>
+    </style>
+
+    <style name="AuthCredentialVerticalListContentViewStyle" parent="AuthCredentialContentViewStyle">
+        <item name="android:background">@drawable/biometric_prompt_vertical_list_content_view_background</item>
         <item name="android:paddingHorizontal">@dimen/biometric_prompt_content_padding_horizontal</item>
+        <item name="android:paddingVertical">@dimen/biometric_prompt_content_padding_vertical</item>
+    </style>
+
+    <style name="AuthCredentialContentViewMoreOptionsButtonStyle" parent="TextAppearance.Material3.LabelLarge">
+        <item name="android:background">@color/transparent</item>
+        <item name="android:gravity">start</item>
+        <item name="enforceTextAppearance">false</item>
+        <item name="android:height">40dp</item>
+        <item name="android:maxWidth">@dimen/m3_btn_max_width</item>
+        <item name="android:minWidth">48dp</item>
+        <item name="android:paddingLeft">0dp</item>
+        <item name="android:paddingRight">12dp</item>
+        <item name="android:textColor">?androidprv:attr/materialColorPrimary</item>
     </style>
 
     <style name="DeviceManagementDialogTitle">
@@ -329,6 +368,21 @@
         <item name="android:layout_height">wrap_content</item>
     </style>
 
+    <style name="KeyboardShortcutHelper" parent="@android:style/Theme.DeviceDefault.Settings">
+        <!-- Needed to be able to use BottomSheetDragHandleView -->
+        <item name="android:windowActionBar">false</item>
+        <item name="bottomSheetDragHandleStyle">@style/KeyboardShortcutHelper.BottomSheet.DragHandle</item>
+    </style>
+
+    <style name="KeyboardShortcutHelper.BottomSheet.DragHandle" parent="Widget.Material3.BottomSheet.DragHandle">
+        <item name="tint">?androidprv:attr/materialColorOutlineVariant</item>
+    </style>
+
+    <style name="KeyboardShortcutHelper.BottomSheetDialogAnimation">
+        <item name="android:windowEnterAnimation">@anim/slide_in_up</item>
+        <item name="android:windowExitAnimation">@anim/slide_out_down</item>
+    </style>
+
     <style name="BrightnessDialogContainer" parent="@style/BaseBrightnessDialogContainer" />
 
     <style name="Animation" />
@@ -951,6 +1005,11 @@
         <!-- Setting a placeholder will avoid using the SystemUI icon on the splash screen -->
         <item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_blank</item>
         <item name="wallpaperTextColor">@*android:color/primary_text_material_dark</item>
+
+        <!--
+            TODO(b/309578419): Make the activity handle insets properly and then remove this.
+        -->
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
     </style>
 
     <style name="Theme.VolumePanelActivity" parent="@android:style/Theme.DeviceDefault.DayNight">
@@ -1556,14 +1615,15 @@
         <item name="android:layout_marginEnd">12dp</item>
         <item name="android:paddingLeft">24dp</item>
         <item name="android:paddingRight">24dp</item>
-        <item name="android:minHeight">40dp</item>
+        <item name="android:minHeight">36dp</item>
+        <item name="android:minWidth">120dp</item>
         <item name="android:stateListAnimator">@*android:anim/flat_button_state_list_anim_material</item>
         <item name="android:pointerIcon">arrow</item>
     </style>
 
     <style name="ShortcutHorizontalDivider">
-        <item name="android:layout_width">120dp</item>
-        <item name="android:layout_height">1dp</item>
+        <item name="android:layout_width">132dp</item>
+        <item name="android:layout_height">2dp</item>
         <item name="android:layout_gravity">center_horizontal</item>
         <item name="android:background">?android:attr/dividerHorizontal</item>
     </style>
diff --git a/packages/SystemUI/res/values/tiles_states_strings.xml b/packages/SystemUI/res/values/tiles_states_strings.xml
index 9036a35..ad09b46 100644
--- a/packages/SystemUI/res/values/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values/tiles_states_strings.xml
@@ -338,4 +338,14 @@
         <item>Off</item>
         <item>On</item>
     </string-array>
+
+    <!-- State names for hearing devices tile: unavailable, off, on.
+         This subtitle is shown when the tile is in that particular state but does not set its own
+         subtitle, so some of these may never appear on screen. They should still be translated as
+         if they could appear. [CHAR LIMIT=32] -->
+    <string-array name="tile_states_hearing_devices">
+        <item>Unavailable</item>
+        <item>Off</item>
+        <item>On</item>
+    </string-array>
 </resources>
\ No newline at end of file
diff --git a/packages/SystemUI/shared/Android.bp b/packages/SystemUI/shared/Android.bp
index 42ba05c..fbe1399 100644
--- a/packages/SystemUI/shared/Android.bp
+++ b/packages/SystemUI/shared/Android.bp
@@ -58,7 +58,7 @@
         "SystemUIUnfoldLib",
         "SystemUISharedLib-Keyguard",
         "WindowManager-Shell-shared",
-        "tracinglib-platform",
+        "//frameworks/libs/systemui:tracinglib-platform",
         "androidx.dynamicanimation_dynamicanimation",
         "androidx.concurrent_concurrent-futures",
         "androidx.lifecycle_lifecycle-runtime-ktx",
@@ -68,7 +68,7 @@
         "kotlinx_coroutines",
         "dagger2",
         "jsr330",
-        "com_android_systemui_shared_flags_lib",
+        "//frameworks/libs/systemui:com_android_systemui_shared_flags_lib",
     ],
     resource_dirs: [
         "res",
diff --git a/packages/SystemUI/shared/biometrics/src/com/android/systemui/biometrics/UdfpsUtils.java b/packages/SystemUI/shared/biometrics/src/com/android/systemui/biometrics/UdfpsUtils.java
index 9574fba..829dc4f 100644
--- a/packages/SystemUI/shared/biometrics/src/com/android/systemui/biometrics/UdfpsUtils.java
+++ b/packages/SystemUI/shared/biometrics/src/com/android/systemui/biometrics/UdfpsUtils.java
@@ -54,8 +54,9 @@
     }
 
     /**
-     * Gets the touch in native coordinates. Map the touch to portrait mode if the device is in
-     * landscape mode.
+     * Gets the touch in native coordinates.
+     *
+     * Maps the touch to portrait mode if the device is in landscape mode.
      *
      * @param idx                The pointer identifier.
      * @param event              The MotionEvent object containing full information about the event.
@@ -64,35 +65,87 @@
      */
     public Point getTouchInNativeCoordinates(int idx, MotionEvent event,
             UdfpsOverlayParams udfpsOverlayParams) {
-        Point portraitTouch = getPortraitTouch(idx, event, udfpsOverlayParams);
+        return getTouchInNativeCoordinates(idx, event, udfpsOverlayParams, true);
+    }
+
+    /**
+     * Gets the touch in native coordinates.
+     *
+     * Optionally map the touch to portrait mode if the device is in landscape mode.
+     *
+     * @param idx                The pointer identifier.
+     * @param event              The MotionEvent object containing full information about the event.
+     * @param udfpsOverlayParams The [UdfpsOverlayParams] used.
+     * @param rotateToPortrait   Whether to rotate the touch to portrait orientation.
+     * @return The mapped touch event.
+     */
+    public Point getTouchInNativeCoordinates(int idx, MotionEvent event,
+            UdfpsOverlayParams udfpsOverlayParams, boolean rotateToPortrait) {
+        Point touch;
+        if (rotateToPortrait) {
+            touch = getPortraitTouch(idx, event, udfpsOverlayParams);
+        } else {
+            touch = new Point((int) event.getRawX(idx), (int) event.getRawY(idx));
+        }
 
         // Scale the coordinates to native resolution.
         float scale = udfpsOverlayParams.getScaleFactor();
-        portraitTouch.x = (int) (portraitTouch.x / scale);
-        portraitTouch.y = (int) (portraitTouch.y / scale);
-        return portraitTouch;
+        touch.x = (int) (touch.x / scale);
+        touch.y = (int) (touch.y / scale);
+        return touch;
     }
 
     /**
      * @param idx                The pointer identifier.
      * @param event              The MotionEvent object containing full information about the event.
      * @param udfpsOverlayParams The [UdfpsOverlayParams] used.
-     * @return Whether the touch event is within sensor area.
+     * @return Whether the touch event (that needs to be rotated to portrait) is within sensor area.
      */
     public boolean isWithinSensorArea(int idx, MotionEvent event,
             UdfpsOverlayParams udfpsOverlayParams) {
-        Point portraitTouch = getPortraitTouch(idx, event, udfpsOverlayParams);
-        return udfpsOverlayParams.getSensorBounds().contains(portraitTouch.x, portraitTouch.y);
+        return isWithinSensorArea(idx, event, udfpsOverlayParams, true);
+    }
+
+    /**
+     * @param idx                The pointer identifier.
+     * @param event              The MotionEvent object containing full information about the event.
+     * @param udfpsOverlayParams The [UdfpsOverlayParams] used.
+     * @param rotateTouchToPortrait Whether to rotate the touch coordinates to portrait.
+     * @return Whether the touch event is within sensor area.
+     */
+    public boolean isWithinSensorArea(int idx, MotionEvent event,
+            UdfpsOverlayParams udfpsOverlayParams, boolean rotateTouchToPortrait) {
+        Point touch;
+        if (rotateTouchToPortrait) {
+            touch = getPortraitTouch(idx, event, udfpsOverlayParams);
+        } else {
+            touch = new Point((int) event.getRawX(idx), (int) event.getRawY(idx));
+        }
+        return udfpsOverlayParams.getSensorBounds().contains(touch.x, touch.y);
+    }
+
+    /**
+     * This function computes the angle of touch relative to the sensor, rotated to portrait,
+     * and maps the angle to a list of help messages which are announced if accessibility is
+     * enabled.
+     *
+     * @return announcement string
+     */
+    public String onTouchOutsideOfSensorArea(boolean touchExplorationEnabled, Context context,
+            int scaledTouchX, int scaledTouchY, UdfpsOverlayParams udfpsOverlayParams) {
+        return onTouchOutsideOfSensorArea(touchExplorationEnabled, context, scaledTouchX,
+                scaledTouchY, udfpsOverlayParams, true);
     }
 
     /**
      * This function computes the angle of touch relative to the sensor and maps the angle to a list
      * of help messages which are announced if accessibility is enabled.
      *
-     * @return Whether the announcing string is null
+     * @return announcement string
      */
     public String onTouchOutsideOfSensorArea(boolean touchExplorationEnabled, Context context,
-            int scaledTouchX, int scaledTouchY, UdfpsOverlayParams udfpsOverlayParams) {
+            int scaledTouchX, int scaledTouchY, UdfpsOverlayParams udfpsOverlayParams,
+            boolean touchRotatedToPortrait) {
         if (!touchExplorationEnabled) {
             return null;
         }
@@ -116,7 +169,8 @@
                         scaledTouchY,
                         scaledSensorX,
                         scaledSensorY,
-                        udfpsOverlayParams.getRotation()
+                        udfpsOverlayParams.getRotation(),
+                        touchRotatedToPortrait
                 );
         Log.v(TAG, "Announcing touch outside : $theStr");
         return theStr;
@@ -132,7 +186,7 @@
      * touchHints[1] = "Move Fingerprint down" And so on.
      */
     private String onTouchOutsideOfSensorAreaImpl(String[] touchHints, float touchX,
-            float touchY, float sensorX, float sensorY, int rotation) {
+            float touchY, float sensorX, float sensorY, int rotation, boolean rotatedToPortrait) {
         float xRelativeToSensor = touchX - sensorX;
         // Touch coordinates are with respect to the upper left corner, so reverse
         // this calculation
@@ -153,13 +207,16 @@
         int index = (int) ((degrees + halfBucketDegrees) % 360 / degreesPerBucket);
         index %= touchHints.length;
 
-        // A rotation of 90 degrees corresponds to increasing the index by 1.
-        if (rotation == Surface.ROTATION_90) {
-            index = (index + 1) % touchHints.length;
+        if (rotatedToPortrait) {
+            // A rotation of 90 degrees corresponds to increasing the index by 1.
+            if (rotation == Surface.ROTATION_90) {
+                index = (index + 1) % touchHints.length;
+            }
+            if (rotation == Surface.ROTATION_270) {
+                index = (index + 3) % touchHints.length;
+            }
         }
-        if (rotation == Surface.ROTATION_270) {
-            index = (index + 3) % touchHints.length;
-        }
+
         return touchHints[index];
     }
 
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
index 4632914..dcc1440 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
@@ -155,5 +155,10 @@
      */
     oneway void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) = 54;
 
-    // Next id = 55
+    /**
+     * Set the override value for home button long press duration in ms and slop multiplier.
+     */
+    oneway void setOverrideHomeButtonLongPress(long duration, float slopMultiplier) = 55;
+
+    // Next id = 56
 }
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java
index 751a3f8..68d2eb3 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java
@@ -22,6 +22,7 @@
 
 import android.annotation.TargetApi;
 import android.content.Context;
+import android.content.res.Resources;
 import android.graphics.Color;
 import android.graphics.Rect;
 import android.inputmethodservice.InputMethodService;
@@ -138,11 +139,15 @@
     /** @return whether or not {@param context} represents that of a large screen device or not */
     @TargetApi(Build.VERSION_CODES.R)
     public static boolean isLargeScreen(Context context) {
-        final WindowManager windowManager = context.getSystemService(WindowManager.class);
+        return isLargeScreen(context.getSystemService(WindowManager.class), context.getResources());
+    }
+
+    /** @return whether or not {@param context} represents that of a large screen device or not */
+    public static boolean isLargeScreen(WindowManager windowManager, Resources resources) {
         final Rect bounds = windowManager.getCurrentWindowMetrics().getBounds();
 
         float smallestWidth = dpiFromPx(Math.min(bounds.width(), bounds.height()),
-                context.getResources().getConfiguration().densityDpi);
+                resources.getConfiguration().densityDpi);
         return smallestWidth >= TABLET_MIN_DPS;
     }
 
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java
index d6a5477..3250a0c 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java
@@ -85,4 +85,10 @@
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return;
         InteractionJankMonitor.getInstance().cancel(cujType);
     }
+
+    /** Return true if currently instrumenting a trace session. */
+    public static boolean isInstrumenting(@Cuj.CujType int cujType) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return false;
+        return InteractionJankMonitor.getInstance().isInstrumenting(cujType);
+    }
 }
diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/system/SystemUnfoldSharedModule.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/system/SystemUnfoldSharedModule.kt
index 7af9917..d0d5caf 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/unfold/system/SystemUnfoldSharedModule.kt
+++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/system/SystemUnfoldSharedModule.kt
@@ -32,6 +32,8 @@
 import dagger.Provides
 import java.util.concurrent.Executor
 import javax.inject.Singleton
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.android.asCoroutineDispatcher
 
 /**
  * Dagger module with system-only dependencies for the unfold animation. The code that is used to
@@ -78,6 +80,13 @@
         @Provides
         @UnfoldBg
         @Singleton
+        fun unfoldBgDispatcher(@UnfoldBg handler: Handler): CoroutineDispatcher {
+            return handler.asCoroutineDispatcher("@UnfoldBg Dispatcher")
+        }
+
+        @Provides
+        @UnfoldBg
+        @Singleton
         fun provideBgLooper(): Looper {
             return HandlerThread("UnfoldBg", Process.THREAD_PRIORITY_FOREGROUND)
                 .apply { start() }
diff --git a/packages/SystemUI/src-debug/com/android/systemui/util/Compile.java b/packages/SystemUI/src-debug/com/android/systemui/util/Compile.java
deleted file mode 100644
index dc804ca..0000000
--- a/packages/SystemUI/src-debug/com/android/systemui/util/Compile.java
+++ /dev/null
@@ -1,23 +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.util;
-
-/** Constants that vary by compilation configuration. */
-public class Compile {
-    /** Whether SystemUI was compiled in debug mode, and supports debug features */
-    public static final boolean IS_DEBUG = true;
-}
diff --git a/packages/SystemUI/src-release/com/android/systemui/util/Compile.java b/packages/SystemUI/src-release/com/android/systemui/util/Compile.java
deleted file mode 100644
index 8a63763..0000000
--- a/packages/SystemUI/src-release/com/android/systemui/util/Compile.java
+++ /dev/null
@@ -1,23 +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.util;
-
-/** Constants that vary by compilation configuration. */
-public class Compile {
-    /** Whether SystemUI was compiled in debug mode, and supports debug features */
-    public static final boolean IS_DEBUG = false;
-}
diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
index 48271de..eca932c 100644
--- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
+++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
@@ -31,6 +31,7 @@
 import androidx.annotation.VisibleForTesting
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.broadcast.BroadcastDispatcher
 import com.android.systemui.customization.R
 import com.android.systemui.dagger.qualifiers.Background
@@ -65,6 +66,7 @@
 import java.util.TimeZone
 import java.util.concurrent.Executor
 import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.DisposableHandle
 import kotlinx.coroutines.Job
@@ -72,7 +74,6 @@
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.merge
-import kotlinx.coroutines.launch
 
 /**
  * Controller for a Clock provided by the registry and used on the keyguard. Instantiated by
@@ -90,6 +91,7 @@
     @DisplaySpecific private val resources: Resources,
     private val context: Context,
     @Main private val mainExecutor: DelayableExecutor,
+    @Main private val mainImmediateDispatcher: CoroutineDispatcher,
     @Background private val bgExecutor: Executor,
     private val clockBuffers: ClockMessageBuffers,
     private val featureFlags: FeatureFlagsClassic,
@@ -424,12 +426,13 @@
         keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback)
         zenModeController.addCallback(zenModeCallback)
         disposableHandle =
-            parent.repeatWhenAttached {
+            parent.repeatWhenAttached(mainImmediateDispatcher) {
                 repeatOnLifecycle(Lifecycle.State.CREATED) {
                     listenForDozing(this)
                     if (MigrateClocksToBlueprint.isEnabled) {
                         listenForDozeAmountTransition(this)
                         listenForAnyStateToAodTransition(this)
+                        listenForAnyStateToLockscreenTransition(this)
                     } else {
                         listenForDozeAmount(this)
                     }
@@ -529,18 +532,22 @@
 
     @VisibleForTesting
     internal fun listenForDozeAmount(scope: CoroutineScope): Job {
-        return scope.launch { keyguardInteractor.dozeAmount.collect { handleDoze(it) } }
+        return scope.launch("$TAG#listenForDozeAmount") {
+            keyguardInteractor.dozeAmount.collect { handleDoze(it) }
+        }
     }
 
     @VisibleForTesting
     internal fun listenForDozeAmountTransition(scope: CoroutineScope): Job {
-        return scope.launch {
+        return scope.launch("$TAG#listenForDozeAmountTransition") {
             merge(
                     keyguardTransitionInteractor.aodToLockscreenTransition.map { step ->
                         step.copy(value = 1f - step.value)
                     },
                     keyguardTransitionInteractor.lockscreenToAodTransition,
-                )
+                ).filter {
+                    it.transitionState != TransitionState.FINISHED
+                }
                 .collect { handleDoze(it.value) }
         }
     }
@@ -550,7 +557,7 @@
      */
     @VisibleForTesting
     internal fun listenForAnyStateToAodTransition(scope: CoroutineScope): Job {
-        return scope.launch {
+        return scope.launch("$TAG#listenForAnyStateToAodTransition") {
             keyguardTransitionInteractor
                 .transitionStepsToState(AOD)
                 .filter { it.transitionState == TransitionState.STARTED }
@@ -560,8 +567,19 @@
     }
 
     @VisibleForTesting
+    internal fun listenForAnyStateToLockscreenTransition(scope: CoroutineScope): Job {
+        return scope.launch("$TAG#listenForAnyStateToLockscreenTransition") {
+            keyguardTransitionInteractor
+                    .transitionStepsToState(LOCKSCREEN)
+                    .filter { it.transitionState == TransitionState.STARTED }
+                    .filter { it.from != AOD }
+                    .collect { handleDoze(0f) }
+        }
+    }
+
+    @VisibleForTesting
     internal fun listenForDozing(scope: CoroutineScope): Job {
-        return scope.launch {
+        return scope.launch("$TAG#listenForDozing") {
             combine(
                     keyguardInteractor.dozeAmount,
                     keyguardInteractor.isDozing,
@@ -626,7 +644,7 @@
     }
 
     companion object {
-        private val TAG = ClockEventController::class.simpleName!!
-        private val DOZE_TICKRATE_THRESHOLD = 0.99f
+        private const val TAG = "ClockEventController"
+        private const val DOZE_TICKRATE_THRESHOLD = 0.99f
     }
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/EmptyLockIconViewController.kt b/packages/SystemUI/src/com/android/keyguard/EmptyLockIconViewController.kt
new file mode 100644
index 0000000..b792db3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/EmptyLockIconViewController.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.keyguard
+
+import android.view.MotionEvent
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.ui.view.KeyguardRootView
+import com.android.systemui.res.R
+import dagger.Lazy
+import javax.inject.Inject
+
+/**
+ * Lock icon view logic now lives in DeviceEntryIconViewBinder and ViewModels. Icon is positioned in
+ * [com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection].
+ *
+ * This class is to bridge the gap between the logic when the DeviceEntryUdfpsRefactor is enabled
+ * and the KeyguardBottomAreaRefactor is NOT enabled. This class can and should be removed when both
+ * flags are enabled.
+ */
+@SysUISingleton
+class EmptyLockIconViewController
+@Inject
+constructor(
+    private val keyguardRootView: Lazy<KeyguardRootView>,
+) : LockIconViewController {
+    private val deviceEntryIconViewId = R.id.device_entry_icon_view
+    override fun setLockIconView(lockIconView: LockIconView) {
+        // no-op
+    }
+
+    override fun getTop(): Float {
+        return keyguardRootView.get().getViewById(deviceEntryIconViewId)?.top?.toFloat() ?: 0f
+    }
+
+    override fun getBottom(): Float {
+        return keyguardRootView.get().getViewById(deviceEntryIconViewId)?.bottom?.toFloat() ?: 0f
+    }
+
+    override fun dozeTimeTick() {
+        // no-op
+    }
+
+    override fun setAlpha(alpha: Float) {
+        // no-op
+    }
+
+    override fun willHandleTouchWhileDozing(event: MotionEvent): Boolean {
+        return false
+    }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
index 5b8eb9d..790a843 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
@@ -250,7 +250,6 @@
             mLargeClockFrame = mView.findViewById(R.id.lockscreen_clock_view_large);
         }
 
-
         if (!mOnlyClock) {
             mDumpManager.unregisterDumpable(getClass().getSimpleName()); // unregister previous
             mDumpManager.registerDumpable(getClass().getSimpleName(), this);
@@ -282,7 +281,9 @@
     protected void onViewAttached() {
         mClockRegistry.registerClockChangeListener(mClockChangedListener);
         setClock(mClockRegistry.createCurrentClock());
-        mClockEventController.registerListeners(mView);
+        if (!MigrateClocksToBlueprint.isEnabled()) {
+            mClockEventController.registerListeners(mView);
+        }
         mKeyguardSmallClockTopMargin =
                 mView.getResources().getDimensionPixelSize(R.dimen.keyguard_clock_top_margin);
         mKeyguardLargeClockTopMargin =
@@ -365,7 +366,9 @@
     @Override
     protected void onViewDetached() {
         mClockRegistry.unregisterClockChangeListener(mClockChangedListener);
-        mClockEventController.unregisterListeners();
+        if (!MigrateClocksToBlueprint.isEnabled()) {
+            mClockEventController.unregisterListeners();
+        }
         setClock(null);
 
         mBgExecutor.execute(() -> {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index 25d7713..c509356 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -83,9 +83,9 @@
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor;
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor;
 import com.android.systemui.flags.FeatureFlags;
-import com.android.systemui.flags.Flags;
 import com.android.systemui.keyguard.KeyguardWmStateRefactor;
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
+import com.android.systemui.keyguard.shared.RefactorKeyguardDismissIntent;
 import com.android.systemui.log.SessionTracker;
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.FalsingManager;
@@ -101,6 +101,8 @@
 import com.android.systemui.util.kotlin.JavaAdapter;
 import com.android.systemui.util.settings.GlobalSettings;
 
+import dagger.Lazy;
+
 import java.io.File;
 import java.util.Arrays;
 import java.util.Optional;
@@ -108,7 +110,6 @@
 import javax.inject.Inject;
 import javax.inject.Provider;
 
-import dagger.Lazy;
 import kotlinx.coroutines.Job;
 
 /** Controller for {@link KeyguardSecurityContainer} */
@@ -310,7 +311,7 @@
          */
         @Override
         public void finish(int targetUserId) {
-            if (!mFeatureFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+            if (!RefactorKeyguardDismissIntent.isEnabled()) {
                 // If there's a pending runnable because the user interacted with a widget
                 // and we're leaving keyguard, then run it.
                 boolean deferKeyguardDone = false;
@@ -649,7 +650,7 @@
      * @param action callback to be invoked when keyguard disappear animation completes.
      */
     public void setOnDismissAction(ActivityStarter.OnDismissAction action, Runnable cancelAction) {
-        if (mFeatureFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+        if (RefactorKeyguardDismissIntent.isEnabled()) {
             return;
         }
         if (mCancelAction != null) {
@@ -943,7 +944,7 @@
             mUiEventLogger.log(uiEvent, getSessionId());
         }
 
-        if (mFeatureFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+        if (RefactorKeyguardDismissIntent.isEnabled()) {
             if (authenticatedWithPrimaryAuth) {
                 mPrimaryBouncerInteractor.get()
                         .notifyKeyguardAuthenticatedPrimaryAuth(targetUserId);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 8c51a4e..4987724 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -225,7 +225,7 @@
     protected static final int BIOMETRIC_STATE_STOPPED = 0;
 
     /** Biometric authentication state: Listening. */
-    private static final int BIOMETRIC_STATE_RUNNING = 1;
+    protected static final int BIOMETRIC_STATE_RUNNING = 1;
 
     /**
      * Biometric authentication: Cancelling and waiting for the relevant biometric service to
@@ -1145,7 +1145,6 @@
         if (getUserCanSkipBouncer(userId)) {
             mTrustManager.unlockedByBiometricForUser(userId, FACE);
         }
-        updateFingerprintListeningState(BIOMETRIC_ACTION_UPDATE);
         mLogger.d("onFaceAuthenticated");
         for (int i = 0; i < mCallbacks.size(); i++) {
             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -1156,6 +1155,12 @@
             }
         }
 
+        // Intentionally update the fingerprint running state after sending the
+        // onBiometricAuthenticated callback to listeners. Updating the fingerprint listening state
+        // can update the state of the device which listeners to the callback may rely on.
+        // For example, the alternate bouncer visibility state or udfps finger down state.
+        updateFingerprintListeningState(BIOMETRIC_ACTION_UPDATE);
+
         // Only authenticate face once when assistant is visible
         mAssistantVisible = false;
 
diff --git a/packages/SystemUI/src/com/android/keyguard/LegacyLockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LegacyLockIconViewController.java
new file mode 100644
index 0000000..4e5df35
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/LegacyLockIconViewController.java
@@ -0,0 +1,846 @@
+/*
+ * 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 android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
+import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT;
+
+import static com.android.keyguard.LockIconView.ICON_FINGERPRINT;
+import static com.android.keyguard.LockIconView.ICON_LOCK;
+import static com.android.keyguard.LockIconView.ICON_UNLOCK;
+import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
+import static com.android.systemui.flags.Flags.DOZING_MIGRATION_1;
+import static com.android.systemui.flags.Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED;
+import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricSourceType;
+import android.os.VibrationAttributes;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.util.MathUtils;
+import android.view.HapticFeedbackConstants;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.WindowInsets;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
+
+import com.android.systemui.Dumpable;
+import com.android.systemui.biometrics.AuthController;
+import com.android.systemui.biometrics.AuthRippleController;
+import com.android.systemui.biometrics.UdfpsController;
+import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
+import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
+import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor;
+import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor;
+import com.android.systemui.dump.DumpManager;
+import com.android.systemui.flags.FeatureFlags;
+import com.android.systemui.flags.Flags;
+import com.android.systemui.keyguard.KeyguardBottomAreaRefactor;
+import com.android.systemui.keyguard.MigrateClocksToBlueprint;
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
+import com.android.systemui.keyguard.shared.model.TransitionStep;
+import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.res.R;
+import com.android.systemui.scene.shared.flag.SceneContainerFlags;
+import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.VibratorHelper;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.concurrency.DelayableExecutor;
+
+import dagger.Lazy;
+
+import java.io.PrintWriter;
+import java.util.Objects;
+import java.util.function.Consumer;
+
+import javax.inject.Inject;
+
+import kotlinx.coroutines.ExperimentalCoroutinesApi;
+
+/**
+ * Controls when to show the LockIcon affordance (lock/unlocked icon or circle) on lock screen.
+ *
+ * For devices with UDFPS, the lock icon will show at the sensor location. Else, the lock
+ * icon will show a set distance from the bottom of the device.
+ */
+@SysUISingleton
+public class LegacyLockIconViewController implements Dumpable, LockIconViewController {
+    private static final String TAG = "LockIconViewController";
+    private static final float sDefaultDensity =
+            (float) DisplayMetrics.DENSITY_DEVICE_STABLE / (float) DisplayMetrics.DENSITY_DEFAULT;
+    private static final int sLockIconRadiusPx = (int) (sDefaultDensity * 36);
+    private static final VibrationAttributes TOUCH_VIBRATION_ATTRIBUTES =
+            VibrationAttributes.createForUsage(VibrationAttributes.USAGE_TOUCH);
+
+    private static final long FADE_OUT_DURATION_MS = 250L;
+
+    private final long mLongPressTimeout;
+    @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+    @NonNull private final KeyguardViewController mKeyguardViewController;
+    @NonNull private final StatusBarStateController mStatusBarStateController;
+    @NonNull private final KeyguardStateController mKeyguardStateController;
+    @NonNull private final FalsingManager mFalsingManager;
+    @NonNull private final AuthController mAuthController;
+    @NonNull private final AccessibilityManager mAccessibilityManager;
+    @NonNull private final ConfigurationController mConfigurationController;
+    @NonNull private final DelayableExecutor mExecutor;
+    private boolean mUdfpsEnrolled;
+    private Resources mResources;
+    private Context mContext;
+    @NonNull private CharSequence mUnlockedLabel;
+    @NonNull private CharSequence mLockedLabel;
+    @NonNull private final VibratorHelper mVibrator;
+    @Nullable private final AuthRippleController mAuthRippleController;
+    @NonNull private final FeatureFlags mFeatureFlags;
+    @NonNull private final PrimaryBouncerInteractor mPrimaryBouncerInteractor;
+    @NonNull private final KeyguardTransitionInteractor mTransitionInteractor;
+    @NonNull private final KeyguardInteractor mKeyguardInteractor;
+    @NonNull private final View.AccessibilityDelegate mAccessibilityDelegate;
+    @NonNull private final Lazy<DeviceEntryInteractor> mDeviceEntryInteractor;
+    @NonNull private final SceneContainerFlags mSceneContainerFlags;
+
+    // Tracks the velocity of a touch to help filter out the touches that move too fast.
+    private VelocityTracker mVelocityTracker;
+    // The ID of the pointer for which ACTION_DOWN has occurred. -1 means no pointer is active.
+    private int mActivePointerId = -1;
+
+    private boolean mIsDozing;
+    private boolean mIsActiveDreamLockscreenHosted;
+    private boolean mIsBouncerShowing;
+    private boolean mRunningFPS;
+    private boolean mCanDismissLockScreen;
+    private int mStatusBarState;
+    private boolean mIsKeyguardShowing;
+    private Runnable mLongPressCancelRunnable;
+
+    private boolean mUdfpsSupported;
+    private float mHeightPixels;
+    private float mWidthPixels;
+    private int mBottomPaddingPx;
+    private int mDefaultPaddingPx;
+
+    private boolean mShowUnlockIcon;
+    private boolean mShowLockIcon;
+
+    // for udfps when strong auth is required or unlocked on AOD
+    private boolean mShowAodLockIcon;
+    private boolean mShowAodUnlockedIcon;
+    private final int mMaxBurnInOffsetX;
+    private final int mMaxBurnInOffsetY;
+    private float mInterpolatedDarkAmount;
+
+    private boolean mDownDetected;
+    private final Rect mSensorTouchLocation = new Rect();
+    private LockIconView mView;
+
+    @VisibleForTesting
+    final Consumer<TransitionStep> mDozeTransitionCallback = (TransitionStep step) -> {
+        mInterpolatedDarkAmount = step.getValue();
+        mView.setDozeAmount(step.getValue());
+        updateBurnInOffsets();
+    };
+
+    @VisibleForTesting
+    final Consumer<Boolean> mIsDozingCallback = (Boolean isDozing) -> {
+        mIsDozing = isDozing;
+        updateBurnInOffsets();
+        updateVisibility();
+    };
+
+    @VisibleForTesting
+    final Consumer<Boolean> mIsActiveDreamLockscreenHostedCallback =
+            (Boolean isLockscreenHosted) -> {
+                mIsActiveDreamLockscreenHosted = isLockscreenHosted;
+                updateVisibility();
+            };
+
+    @Inject
+    public LegacyLockIconViewController(
+            @NonNull StatusBarStateController statusBarStateController,
+            @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
+            @NonNull KeyguardViewController keyguardViewController,
+            @NonNull KeyguardStateController keyguardStateController,
+            @NonNull FalsingManager falsingManager,
+            @NonNull AuthController authController,
+            @NonNull DumpManager dumpManager,
+            @NonNull AccessibilityManager accessibilityManager,
+            @NonNull ConfigurationController configurationController,
+            @NonNull @Main DelayableExecutor executor,
+            @NonNull VibratorHelper vibrator,
+            @Nullable AuthRippleController authRippleController,
+            @NonNull @Main Resources resources,
+            @NonNull KeyguardTransitionInteractor transitionInteractor,
+            @NonNull KeyguardInteractor keyguardInteractor,
+            @NonNull FeatureFlags featureFlags,
+            PrimaryBouncerInteractor primaryBouncerInteractor,
+            Context context,
+            Lazy<DeviceEntryInteractor> deviceEntryInteractor,
+            SceneContainerFlags sceneContainerFlags
+    ) {
+        mStatusBarStateController = statusBarStateController;
+        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
+        mAuthController = authController;
+        mKeyguardViewController = keyguardViewController;
+        mKeyguardStateController = keyguardStateController;
+        mFalsingManager = falsingManager;
+        mAccessibilityManager = accessibilityManager;
+        mConfigurationController = configurationController;
+        mExecutor = executor;
+        mVibrator = vibrator;
+        mAuthRippleController = authRippleController;
+        mTransitionInteractor = transitionInteractor;
+        mKeyguardInteractor = keyguardInteractor;
+        mFeatureFlags = featureFlags;
+        mPrimaryBouncerInteractor = primaryBouncerInteractor;
+
+        mMaxBurnInOffsetX = resources.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_x);
+        mMaxBurnInOffsetY = resources.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_y);
+        mUnlockedLabel = resources.getString(R.string.accessibility_unlock_button);
+        mLockedLabel = resources.getString(R.string.accessibility_lock_icon);
+        mLongPressTimeout = resources.getInteger(R.integer.config_lockIconLongPress);
+        dumpManager.registerDumpable(TAG, this);
+        mResources = resources;
+        mContext = context;
+        mDeviceEntryInteractor = deviceEntryInteractor;
+        mSceneContainerFlags = sceneContainerFlags;
+
+        mAccessibilityDelegate = new View.AccessibilityDelegate() {
+            private final AccessibilityNodeInfo.AccessibilityAction mAccessibilityAuthenticateHint =
+                    new AccessibilityNodeInfo.AccessibilityAction(
+                            AccessibilityNodeInfoCompat.ACTION_CLICK,
+                            mResources.getString(R.string.accessibility_authenticate_hint));
+            private final AccessibilityNodeInfo.AccessibilityAction mAccessibilityEnterHint =
+                    new AccessibilityNodeInfo.AccessibilityAction(
+                            AccessibilityNodeInfoCompat.ACTION_CLICK,
+                            mResources.getString(R.string.accessibility_enter_hint));
+            public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) {
+                super.onInitializeAccessibilityNodeInfo(v, info);
+                if (isActionable()) {
+                    if (mShowLockIcon) {
+                        info.addAction(mAccessibilityAuthenticateHint);
+                    } else if (mShowUnlockIcon) {
+                        info.addAction(mAccessibilityEnterHint);
+                    }
+                }
+            }
+        };
+    }
+
+    /** Sets the LockIconView to the controller and rebinds any that depend on it. */
+    @SuppressLint("ClickableViewAccessibility")
+    @Override
+    public void setLockIconView(LockIconView lockIconView) {
+        mView = lockIconView;
+        mView.setAccessibilityDelegate(mAccessibilityDelegate);
+
+        if (mFeatureFlags.isEnabled(DOZING_MIGRATION_1)) {
+            collectFlow(mView, mTransitionInteractor.getDozeAmountTransition(),
+                    mDozeTransitionCallback);
+            collectFlow(mView, mKeyguardInteractor.isDozing(), mIsDozingCallback);
+        }
+
+        if (mFeatureFlags.isEnabled(LOCKSCREEN_WALLPAPER_DREAM_ENABLED)) {
+            collectFlow(mView, mKeyguardInteractor.isActiveDreamLockscreenHosted(),
+                    mIsActiveDreamLockscreenHostedCallback);
+        }
+
+        updateIsUdfpsEnrolled();
+        updateConfiguration();
+        updateKeyguardShowing();
+
+        mIsBouncerShowing = mKeyguardViewController.isBouncerShowing();
+        mIsDozing = mStatusBarStateController.isDozing();
+        mInterpolatedDarkAmount = mStatusBarStateController.getDozeAmount();
+        mRunningFPS = mKeyguardUpdateMonitor.isFingerprintDetectionRunning();
+        mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
+        mStatusBarState = mStatusBarStateController.getState();
+
+        updateColors();
+        mDownDetected = false;
+        updateBurnInOffsets();
+        updateVisibility();
+
+        updateAccessibility();
+
+        lockIconView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
+            @Override
+            public void onViewAttachedToWindow(View view) {
+                registerCallbacks();
+            }
+
+            @Override
+            public void onViewDetachedFromWindow(View view) {
+                unregisterCallbacks();
+            }
+        });
+
+        if (lockIconView.isAttachedToWindow()) {
+            registerCallbacks();
+        }
+
+        lockIconView.setOnTouchListener((view, motionEvent) -> onTouchEvent(motionEvent));
+    }
+
+    private void registerCallbacks() {
+        mConfigurationController.addCallback(mConfigurationListener);
+        mAuthController.addCallback(mAuthControllerCallback);
+        mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback);
+        mStatusBarStateController.addCallback(mStatusBarStateListener);
+        mKeyguardStateController.addCallback(mKeyguardStateCallback);
+        mAccessibilityManager.addAccessibilityStateChangeListener(
+                mAccessibilityStateChangeListener);
+
+    }
+
+    private void unregisterCallbacks() {
+        mAuthController.removeCallback(mAuthControllerCallback);
+        mConfigurationController.removeCallback(mConfigurationListener);
+        mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
+        mStatusBarStateController.removeCallback(mStatusBarStateListener);
+        mKeyguardStateController.removeCallback(mKeyguardStateCallback);
+        mAccessibilityManager.removeAccessibilityStateChangeListener(
+                mAccessibilityStateChangeListener);
+
+    }
+
+    private void updateAccessibility() {
+        if (mAccessibilityManager.isEnabled()) {
+            mView.setOnClickListener(mA11yClickListener);
+        } else {
+            mView.setOnClickListener(null);
+        }
+    }
+
+    @Override
+    public float getTop() {
+        return mView.getLocationTop();
+    }
+
+    @Override
+    public float getBottom() {
+        return mView.getLocationBottom();
+    }
+
+    private void updateVisibility() {
+        if (!mIsKeyguardShowing && !mIsDozing) {
+            mView.setVisibility(View.INVISIBLE);
+            return;
+        }
+
+        if (mIsKeyguardShowing && mIsActiveDreamLockscreenHosted) {
+            mView.setVisibility(View.INVISIBLE);
+            return;
+        }
+
+        boolean wasShowingFpIcon = mUdfpsEnrolled && !mShowUnlockIcon && !mShowLockIcon
+                && !mShowAodUnlockedIcon && !mShowAodLockIcon;
+        mShowLockIcon = !mCanDismissLockScreen && isLockScreen()
+                && (!mUdfpsEnrolled || !mRunningFPS);
+        mShowUnlockIcon = mCanDismissLockScreen && isLockScreen();
+        mShowAodUnlockedIcon = mIsDozing && mUdfpsEnrolled && !mRunningFPS && mCanDismissLockScreen;
+        mShowAodLockIcon = mIsDozing && mUdfpsEnrolled && !mRunningFPS && !mCanDismissLockScreen;
+
+        final CharSequence prevContentDescription = mView.getContentDescription();
+        if (mShowLockIcon) {
+            if (wasShowingFpIcon) {
+                // fp icon was shown by UdfpsView, and now we still want to animate the transition
+                // in this drawable
+                mView.updateIcon(ICON_FINGERPRINT, false);
+            }
+            mView.updateIcon(ICON_LOCK, false);
+            mView.setContentDescription(mLockedLabel);
+            mView.setVisibility(View.VISIBLE);
+        } else if (mShowUnlockIcon) {
+            if (wasShowingFpIcon) {
+                // fp icon was shown by UdfpsView, and now we still want to animate the transition
+                // in this drawable
+                mView.updateIcon(ICON_FINGERPRINT, false);
+            }
+            mView.updateIcon(ICON_UNLOCK, false);
+            mView.setContentDescription(mUnlockedLabel);
+            mView.setVisibility(View.VISIBLE);
+        } else if (mShowAodUnlockedIcon) {
+            mView.updateIcon(ICON_UNLOCK, true);
+            mView.setContentDescription(mUnlockedLabel);
+            mView.setVisibility(View.VISIBLE);
+        } else if (mShowAodLockIcon) {
+            mView.updateIcon(ICON_LOCK, true);
+            mView.setContentDescription(mLockedLabel);
+            mView.setVisibility(View.VISIBLE);
+        } else {
+            mView.clearIcon();
+            mView.setVisibility(View.INVISIBLE);
+            mView.setContentDescription(null);
+        }
+
+        boolean accessibilityEnabled =
+                !mPrimaryBouncerInteractor.isAnimatingAway() && mView.isVisibleToUser();
+        mView.setImportantForAccessibility(
+                accessibilityEnabled ? View.IMPORTANT_FOR_ACCESSIBILITY_YES
+                        : View.IMPORTANT_FOR_ACCESSIBILITY_NO);
+
+        if (!Objects.equals(prevContentDescription, mView.getContentDescription())
+                && mView.getContentDescription() != null && accessibilityEnabled) {
+            mView.announceForAccessibility(mView.getContentDescription());
+        }
+    }
+
+    private boolean isLockScreen() {
+        return !mIsDozing
+                && !mIsBouncerShowing
+                && mStatusBarState == StatusBarState.KEYGUARD;
+    }
+
+    private void updateKeyguardShowing() {
+        mIsKeyguardShowing = mKeyguardStateController.isShowing()
+                && !mKeyguardStateController.isKeyguardGoingAway();
+    }
+
+    private void updateColors() {
+        mView.updateColorAndBackgroundVisibility();
+    }
+
+    private void updateConfiguration() {
+        WindowManager windowManager = mContext.getSystemService(WindowManager.class);
+        Rect bounds = windowManager.getCurrentWindowMetrics().getBounds();
+        mWidthPixels = bounds.right;
+        if (mFeatureFlags.isEnabled(Flags.LOCKSCREEN_ENABLE_LANDSCAPE)) {
+            // Assumed to be initially neglected as there are no left or right insets in portrait
+            // However, on landscape, these insets need to included when calculating the midpoint
+            WindowInsets insets = windowManager.getCurrentWindowMetrics().getWindowInsets();
+            mWidthPixels -= insets.getSystemWindowInsetLeft() + insets.getSystemWindowInsetRight();
+        }
+        mHeightPixels = bounds.bottom;
+        mBottomPaddingPx = mResources.getDimensionPixelSize(R.dimen.lock_icon_margin_bottom);
+        mDefaultPaddingPx = mResources.getDimensionPixelSize(R.dimen.lock_icon_padding);
+        mUnlockedLabel = mResources.getString(
+                R.string.accessibility_unlock_button);
+        mLockedLabel = mResources.getString(R.string.accessibility_lock_icon);
+        updateLockIconLocation();
+    }
+
+    private void updateLockIconLocation() {
+        final float scaleFactor = mAuthController.getScaleFactor();
+        final int scaledPadding = (int) (mDefaultPaddingPx * scaleFactor);
+        if (KeyguardBottomAreaRefactor.isEnabled() || MigrateClocksToBlueprint.isEnabled()) {
+            // positioning in this case is handled by [DefaultDeviceEntrySection]
+            mView.getLockIcon().setPadding(scaledPadding, scaledPadding, scaledPadding,
+                    scaledPadding);
+        } else {
+            if (mUdfpsSupported) {
+                mView.setCenterLocation(mAuthController.getUdfpsLocation(),
+                        mAuthController.getUdfpsRadius(), scaledPadding);
+            } else {
+                mView.setCenterLocation(
+                        new Point((int) mWidthPixels / 2,
+                                (int) (mHeightPixels
+                                        - ((mBottomPaddingPx + sLockIconRadiusPx) * scaleFactor))),
+                        sLockIconRadiusPx * scaleFactor, scaledPadding);
+            }
+        }
+    }
+
+    @Override
+    public void dump(@NonNull PrintWriter pw, @NonNull String[] args) {
+        pw.println("mUdfpsSupported: " + mUdfpsSupported);
+        pw.println("mUdfpsEnrolled: " + mUdfpsEnrolled);
+        pw.println("mIsKeyguardShowing: " + mIsKeyguardShowing);
+        pw.println();
+        pw.println(" mShowUnlockIcon: " + mShowUnlockIcon);
+        pw.println(" mShowLockIcon: " + mShowLockIcon);
+        pw.println(" mShowAodUnlockedIcon: " + mShowAodUnlockedIcon);
+        pw.println();
+        pw.println(" mIsDozing: " + mIsDozing);
+        pw.println(" isFlagEnabled(DOZING_MIGRATION_1): "
+                + mFeatureFlags.isEnabled(DOZING_MIGRATION_1));
+        pw.println(" mIsBouncerShowing: " + mIsBouncerShowing);
+        pw.println(" mRunningFPS: " + mRunningFPS);
+        pw.println(" mCanDismissLockScreen: " + mCanDismissLockScreen);
+        pw.println(" mStatusBarState: " + StatusBarState.toString(mStatusBarState));
+        pw.println(" mInterpolatedDarkAmount: " + mInterpolatedDarkAmount);
+        pw.println(" mSensorTouchLocation: " + mSensorTouchLocation);
+        pw.println(" mDefaultPaddingPx: " + mDefaultPaddingPx);
+        pw.println(" mIsActiveDreamLockscreenHosted: " + mIsActiveDreamLockscreenHosted);
+
+        if (mView != null) {
+            mView.dump(pw, args);
+        }
+    }
+
+    /** Every minute, update the aod icon's burn in offset */
+    @Override
+    public void dozeTimeTick() {
+        updateBurnInOffsets();
+    }
+
+    private void updateBurnInOffsets() {
+        float offsetX = MathUtils.lerp(0f,
+                getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */)
+                        - mMaxBurnInOffsetX, mInterpolatedDarkAmount);
+        float offsetY = MathUtils.lerp(0f,
+                getBurnInOffset(mMaxBurnInOffsetY * 2, false /* xAxis */)
+                        - mMaxBurnInOffsetY, mInterpolatedDarkAmount);
+
+        mView.setTranslationX(offsetX);
+        mView.setTranslationY(offsetY);
+    }
+
+    private void updateIsUdfpsEnrolled() {
+        boolean wasUdfpsSupported = mUdfpsSupported;
+        boolean wasUdfpsEnrolled = mUdfpsEnrolled;
+
+        mUdfpsSupported = mKeyguardUpdateMonitor.isUdfpsSupported();
+        mView.setUseBackground(mUdfpsSupported);
+
+        mUdfpsEnrolled = mKeyguardUpdateMonitor.isUdfpsEnrolled();
+        if (wasUdfpsSupported != mUdfpsSupported || wasUdfpsEnrolled != mUdfpsEnrolled) {
+            updateVisibility();
+        }
+    }
+
+    private StatusBarStateController.StateListener mStatusBarStateListener =
+            new StatusBarStateController.StateListener() {
+                @Override
+                public void onDozeAmountChanged(float linear, float eased) {
+                    if (!mFeatureFlags.isEnabled(DOZING_MIGRATION_1)) {
+                        mInterpolatedDarkAmount = eased;
+                        mView.setDozeAmount(eased);
+                        updateBurnInOffsets();
+                    }
+                }
+
+                @Override
+                public void onDozingChanged(boolean isDozing) {
+                    if (!mFeatureFlags.isEnabled(DOZING_MIGRATION_1)) {
+                        mIsDozing = isDozing;
+                        updateBurnInOffsets();
+                        updateVisibility();
+                    }
+                }
+
+                @Override
+                public void onStateChanged(int statusBarState) {
+                    mStatusBarState = statusBarState;
+                    updateVisibility();
+                }
+            };
+
+    private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback =
+            new KeyguardUpdateMonitorCallback() {
+                @Override
+                public void onKeyguardBouncerStateChanged(boolean bouncer) {
+                    mIsBouncerShowing = bouncer;
+                    updateVisibility();
+                }
+
+                @Override
+                public void onBiometricRunningStateChanged(boolean running,
+                        BiometricSourceType biometricSourceType) {
+                    final boolean wasRunningFps = mRunningFPS;
+
+                    if (biometricSourceType == FINGERPRINT) {
+                        mRunningFPS = running;
+                    }
+
+                    if (wasRunningFps != mRunningFPS) {
+                        updateVisibility();
+                    }
+                }
+            };
+
+    private final KeyguardStateController.Callback mKeyguardStateCallback =
+            new KeyguardStateController.Callback() {
+        @Override
+        public void onUnlockedChanged() {
+            mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
+            updateKeyguardShowing();
+            updateVisibility();
+        }
+
+        @Override
+        public void onKeyguardShowingChanged() {
+            // Reset values in case biometrics were removed (ie: pin/pattern/password => swipe).
+            // If biometrics were removed, local vars mCanDismissLockScreen and
+            // mUserUnlockedWithBiometric may not be updated.
+            mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
+
+            // reset mIsBouncerShowing state in case it was preemptively set
+            // onLongPress
+            mIsBouncerShowing = mKeyguardViewController.isBouncerShowing();
+
+            updateKeyguardShowing();
+            updateVisibility();
+        }
+
+        @Override
+        public void onKeyguardFadingAwayChanged() {
+            updateKeyguardShowing();
+            updateVisibility();
+        }
+    };
+
+    private final ConfigurationController.ConfigurationListener mConfigurationListener =
+            new ConfigurationController.ConfigurationListener() {
+        @Override
+        public void onUiModeChanged() {
+            updateColors();
+        }
+
+        @Override
+        public void onThemeChanged() {
+            updateColors();
+        }
+
+        @Override
+        public void onConfigChanged(Configuration newConfig) {
+            updateConfiguration();
+            updateColors();
+        }
+    };
+
+    /**
+     * Handles the touch if {@link #isActionable()} is true.
+     * Subsequently, will trigger {@link #onLongPress()} if a touch is continuously in the lock icon
+     * area for {@link #mLongPressTimeout} ms.
+     *
+     * Touch speed debouncing mimics logic from the velocity tracker in {@link UdfpsController}.
+     */
+    private boolean onTouchEvent(MotionEvent event) {
+        if (!actionableDownEventStartedOnView(event)) {
+            cancelTouches();
+            return false;
+        }
+
+        switch(event.getActionMasked()) {
+            case MotionEvent.ACTION_DOWN:
+            case MotionEvent.ACTION_HOVER_ENTER:
+                if (!mDownDetected && mAccessibilityManager.isTouchExplorationEnabled()) {
+                    vibrateOnTouchExploration();
+                }
+
+                // The pointer that causes ACTION_DOWN is always at index 0.
+                // We need to persist its ID to track it during ACTION_MOVE that could include
+                // data for many other pointers because of multi-touch support.
+                mActivePointerId = event.getPointerId(0);
+                if (mVelocityTracker == null) {
+                    // To simplify the lifecycle of the velocity tracker, make sure it's never null
+                    // after ACTION_DOWN, and always null after ACTION_CANCEL or ACTION_UP.
+                    mVelocityTracker = VelocityTracker.obtain();
+                } else {
+                    // 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();
+                }
+                mVelocityTracker.addMovement(event);
+
+                mDownDetected = true;
+                mLongPressCancelRunnable = mExecutor.executeDelayed(
+                        this::onLongPress, mLongPressTimeout);
+                break;
+            case MotionEvent.ACTION_MOVE:
+            case MotionEvent.ACTION_HOVER_MOVE:
+                mVelocityTracker.addMovement(event);
+                // Compute pointer velocity in pixels per second.
+                mVelocityTracker.computeCurrentVelocity(1000);
+                float velocity = computePointerSpeed(mVelocityTracker,
+                        mActivePointerId);
+                if (event.getClassification() != MotionEvent.CLASSIFICATION_DEEP_PRESS
+                        && exceedsVelocityThreshold(velocity)) {
+                    Log.v(TAG, "lock icon long-press rescheduled due to "
+                            + "high pointer velocity=" + velocity);
+                    mLongPressCancelRunnable.run();
+                    mLongPressCancelRunnable = mExecutor.executeDelayed(
+                            this::onLongPress, mLongPressTimeout);
+                }
+                break;
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL:
+            case MotionEvent.ACTION_HOVER_EXIT:
+                cancelTouches();
+                break;
+        }
+
+        return true;
+    }
+
+    /**
+     * Calculate the pointer speed given a velocity tracker and the pointer id.
+     * This assumes that the velocity tracker has already been passed all relevant motion events.
+     */
+    private static float computePointerSpeed(@NonNull VelocityTracker tracker, int pointerId) {
+        final float vx = tracker.getXVelocity(pointerId);
+        final float vy = tracker.getYVelocity(pointerId);
+        return (float) Math.sqrt(Math.pow(vx, 2.0) + Math.pow(vy, 2.0));
+    }
+
+    /**
+     * Whether the velocity exceeds the acceptable UDFPS debouncing threshold.
+     */
+    private static boolean exceedsVelocityThreshold(float velocity) {
+        return velocity > 750f;
+    }
+
+    private boolean actionableDownEventStartedOnView(MotionEvent event) {
+        if (!isActionable()) {
+            return false;
+        }
+
+        if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+            return true;
+        }
+
+        return mDownDetected;
+    }
+
+    @ExperimentalCoroutinesApi
+    @VisibleForTesting
+    protected void onLongPress() {
+        cancelTouches();
+        if (mFalsingManager.isFalseLongTap(FalsingManager.LOW_PENALTY)) {
+            Log.v(TAG, "lock icon long-press rejected by the falsing manager.");
+            return;
+        }
+
+        // pre-emptively set to true to hide view
+        mIsBouncerShowing = true;
+        if (!DeviceEntryUdfpsRefactor.isEnabled()
+                && mUdfpsSupported && mShowUnlockIcon && mAuthRippleController != null) {
+            mAuthRippleController.showUnlockRipple(FINGERPRINT);
+        }
+        updateVisibility();
+
+        // play device entry haptic (consistent with UDFPS controller longpress)
+        vibrateOnLongPress();
+
+        if (mSceneContainerFlags.isEnabled()) {
+            mDeviceEntryInteractor.get().attemptDeviceEntry();
+        } else {
+            mKeyguardViewController.showPrimaryBouncer(/* scrim */ true);
+        }
+    }
+
+
+    private void cancelTouches() {
+        mDownDetected = false;
+        if (mLongPressCancelRunnable != null) {
+            mLongPressCancelRunnable.run();
+        }
+        if (mVelocityTracker != null) {
+            mVelocityTracker.recycle();
+            mVelocityTracker = null;
+        }
+    }
+
+    private boolean isActionable() {
+        if (mIsBouncerShowing) {
+            Log.v(TAG, "lock icon long-press ignored, bouncer already showing.");
+            // a long press gestures from AOD may have already triggered the bouncer to show,
+            // so this touch is no longer actionable
+            return false;
+        }
+        return mUdfpsSupported || mShowUnlockIcon;
+    }
+
+    /**
+     * Set the alpha of this view.
+     */
+    @Override
+    public void setAlpha(float alpha) {
+        mView.setAlpha(alpha);
+    }
+
+    private void updateUdfpsConfig() {
+        // must be called from the main thread since it may update the views
+        mExecutor.execute(() -> {
+            updateIsUdfpsEnrolled();
+            updateConfiguration();
+        });
+    }
+
+    @VisibleForTesting
+    void vibrateOnTouchExploration() {
+        mVibrator.performHapticFeedback(
+                mView,
+                HapticFeedbackConstants.CONTEXT_CLICK
+        );
+    }
+
+    @VisibleForTesting
+    void vibrateOnLongPress() {
+        mVibrator.performHapticFeedback(mView, UdfpsController.LONG_PRESS);
+    }
+
+    private final AuthController.Callback mAuthControllerCallback = new AuthController.Callback() {
+        @Override
+        public void onAllAuthenticatorsRegistered(@BiometricAuthenticator.Modality int modality) {
+            if (modality == TYPE_FINGERPRINT) {
+                updateUdfpsConfig();
+            }
+        }
+
+        @Override
+        public void onEnrollmentsChanged(@BiometricAuthenticator.Modality int modality) {
+            if (modality == TYPE_FINGERPRINT) {
+                updateUdfpsConfig();
+            }
+        }
+
+        @Override
+        public void onUdfpsLocationChanged(UdfpsOverlayParams udfpsOverlayParams) {
+            updateUdfpsConfig();
+        }
+    };
+
+    /**
+     * Whether the lock icon will handle a touch while dozing.
+     */
+    @Override
+    public boolean willHandleTouchWhileDozing(MotionEvent event) {
+        // is in lock icon area
+        mView.getHitRect(mSensorTouchLocation);
+        final boolean inLockIconArea =
+                mSensorTouchLocation.contains((int) event.getX(), (int) event.getY())
+                        && mView.getVisibility() == View.VISIBLE;
+
+        return inLockIconArea && actionableDownEventStartedOnView(event);
+    }
+
+    private final View.OnClickListener mA11yClickListener = v -> onLongPress();
+
+    private final AccessibilityManager.AccessibilityStateChangeListener
+            mAccessibilityStateChangeListener = enabled -> updateAccessibility();
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
deleted file mode 100644
index 8f1a5f7..0000000
--- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
+++ /dev/null
@@ -1,839 +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 android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
-import static android.hardware.biometrics.BiometricSourceType.FINGERPRINT;
-
-import static com.android.keyguard.LockIconView.ICON_FINGERPRINT;
-import static com.android.keyguard.LockIconView.ICON_LOCK;
-import static com.android.keyguard.LockIconView.ICON_UNLOCK;
-import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
-import static com.android.systemui.flags.Flags.DOZING_MIGRATION_1;
-import static com.android.systemui.flags.Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED;
-import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.hardware.biometrics.BiometricAuthenticator;
-import android.hardware.biometrics.BiometricSourceType;
-import android.os.VibrationAttributes;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.util.MathUtils;
-import android.view.HapticFeedbackConstants;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.WindowInsets;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityNodeInfo;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
-
-import com.android.systemui.Dumpable;
-import com.android.systemui.biometrics.AuthController;
-import com.android.systemui.biometrics.AuthRippleController;
-import com.android.systemui.biometrics.UdfpsController;
-import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
-import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor;
-import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor;
-import com.android.systemui.dump.DumpManager;
-import com.android.systemui.flags.FeatureFlags;
-import com.android.systemui.flags.Flags;
-import com.android.systemui.keyguard.KeyguardBottomAreaRefactor;
-import com.android.systemui.keyguard.MigrateClocksToBlueprint;
-import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
-import com.android.systemui.keyguard.shared.model.TransitionStep;
-import com.android.systemui.plugins.FalsingManager;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.res.R;
-import com.android.systemui.scene.shared.flag.SceneContainerFlags;
-import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.statusbar.VibratorHelper;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.util.concurrency.DelayableExecutor;
-
-import dagger.Lazy;
-
-import java.io.PrintWriter;
-import java.util.Objects;
-import java.util.function.Consumer;
-
-import javax.inject.Inject;
-
-import kotlinx.coroutines.ExperimentalCoroutinesApi;
-
-/**
- * Controls when to show the LockIcon affordance (lock/unlocked icon or circle) on lock screen.
- *
- * For devices with UDFPS, the lock icon will show at the sensor location. Else, the lock
- * icon will show a set distance from the bottom of the device.
- */
-@SysUISingleton
-public class LockIconViewController implements Dumpable {
-    private static final String TAG = "LockIconViewController";
-    private static final float sDefaultDensity =
-            (float) DisplayMetrics.DENSITY_DEVICE_STABLE / (float) DisplayMetrics.DENSITY_DEFAULT;
-    private static final int sLockIconRadiusPx = (int) (sDefaultDensity * 36);
-    private static final VibrationAttributes TOUCH_VIBRATION_ATTRIBUTES =
-            VibrationAttributes.createForUsage(VibrationAttributes.USAGE_TOUCH);
-
-    private static final long FADE_OUT_DURATION_MS = 250L;
-
-    private final long mLongPressTimeout;
-    @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
-    @NonNull private final KeyguardViewController mKeyguardViewController;
-    @NonNull private final StatusBarStateController mStatusBarStateController;
-    @NonNull private final KeyguardStateController mKeyguardStateController;
-    @NonNull private final FalsingManager mFalsingManager;
-    @NonNull private final AuthController mAuthController;
-    @NonNull private final AccessibilityManager mAccessibilityManager;
-    @NonNull private final ConfigurationController mConfigurationController;
-    @NonNull private final DelayableExecutor mExecutor;
-    private boolean mUdfpsEnrolled;
-    private Resources mResources;
-    private Context mContext;
-    @NonNull private CharSequence mUnlockedLabel;
-    @NonNull private CharSequence mLockedLabel;
-    @NonNull private final VibratorHelper mVibrator;
-    @Nullable private final AuthRippleController mAuthRippleController;
-    @NonNull private final FeatureFlags mFeatureFlags;
-    @NonNull private final PrimaryBouncerInteractor mPrimaryBouncerInteractor;
-    @NonNull private final KeyguardTransitionInteractor mTransitionInteractor;
-    @NonNull private final KeyguardInteractor mKeyguardInteractor;
-    @NonNull private final View.AccessibilityDelegate mAccessibilityDelegate;
-    @NonNull private final Lazy<DeviceEntryInteractor> mDeviceEntryInteractor;
-    @NonNull private final SceneContainerFlags mSceneContainerFlags;
-
-    // Tracks the velocity of a touch to help filter out the touches that move too fast.
-    private VelocityTracker mVelocityTracker;
-    // The ID of the pointer for which ACTION_DOWN has occurred. -1 means no pointer is active.
-    private int mActivePointerId = -1;
-
-    private boolean mIsDozing;
-    private boolean mIsActiveDreamLockscreenHosted;
-    private boolean mIsBouncerShowing;
-    private boolean mRunningFPS;
-    private boolean mCanDismissLockScreen;
-    private int mStatusBarState;
-    private boolean mIsKeyguardShowing;
-    private Runnable mLongPressCancelRunnable;
-
-    private boolean mUdfpsSupported;
-    private float mHeightPixels;
-    private float mWidthPixels;
-    private int mBottomPaddingPx;
-    private int mDefaultPaddingPx;
-
-    private boolean mShowUnlockIcon;
-    private boolean mShowLockIcon;
-
-    // for udfps when strong auth is required or unlocked on AOD
-    private boolean mShowAodLockIcon;
-    private boolean mShowAodUnlockedIcon;
-    private final int mMaxBurnInOffsetX;
-    private final int mMaxBurnInOffsetY;
-    private float mInterpolatedDarkAmount;
-
-    private boolean mDownDetected;
-    private final Rect mSensorTouchLocation = new Rect();
-    private LockIconView mView;
-
-    @VisibleForTesting
-    final Consumer<TransitionStep> mDozeTransitionCallback = (TransitionStep step) -> {
-        mInterpolatedDarkAmount = step.getValue();
-        mView.setDozeAmount(step.getValue());
-        updateBurnInOffsets();
-    };
-
-    @VisibleForTesting
-    final Consumer<Boolean> mIsDozingCallback = (Boolean isDozing) -> {
-        mIsDozing = isDozing;
-        updateBurnInOffsets();
-        updateVisibility();
-    };
-
-    @VisibleForTesting
-    final Consumer<Boolean> mIsActiveDreamLockscreenHostedCallback =
-            (Boolean isLockscreenHosted) -> {
-                mIsActiveDreamLockscreenHosted = isLockscreenHosted;
-                updateVisibility();
-            };
-
-    @Inject
-    public LockIconViewController(
-            @NonNull StatusBarStateController statusBarStateController,
-            @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor,
-            @NonNull KeyguardViewController keyguardViewController,
-            @NonNull KeyguardStateController keyguardStateController,
-            @NonNull FalsingManager falsingManager,
-            @NonNull AuthController authController,
-            @NonNull DumpManager dumpManager,
-            @NonNull AccessibilityManager accessibilityManager,
-            @NonNull ConfigurationController configurationController,
-            @NonNull @Main DelayableExecutor executor,
-            @NonNull VibratorHelper vibrator,
-            @Nullable AuthRippleController authRippleController,
-            @NonNull @Main Resources resources,
-            @NonNull KeyguardTransitionInteractor transitionInteractor,
-            @NonNull KeyguardInteractor keyguardInteractor,
-            @NonNull FeatureFlags featureFlags,
-            PrimaryBouncerInteractor primaryBouncerInteractor,
-            Context context,
-            Lazy<DeviceEntryInteractor> deviceEntryInteractor,
-            SceneContainerFlags sceneContainerFlags
-    ) {
-        mStatusBarStateController = statusBarStateController;
-        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
-        mAuthController = authController;
-        mKeyguardViewController = keyguardViewController;
-        mKeyguardStateController = keyguardStateController;
-        mFalsingManager = falsingManager;
-        mAccessibilityManager = accessibilityManager;
-        mConfigurationController = configurationController;
-        mExecutor = executor;
-        mVibrator = vibrator;
-        mAuthRippleController = authRippleController;
-        mTransitionInteractor = transitionInteractor;
-        mKeyguardInteractor = keyguardInteractor;
-        mFeatureFlags = featureFlags;
-        mPrimaryBouncerInteractor = primaryBouncerInteractor;
-
-        mMaxBurnInOffsetX = resources.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_x);
-        mMaxBurnInOffsetY = resources.getDimensionPixelSize(R.dimen.udfps_burn_in_offset_y);
-        mUnlockedLabel = resources.getString(R.string.accessibility_unlock_button);
-        mLockedLabel = resources.getString(R.string.accessibility_lock_icon);
-        mLongPressTimeout = resources.getInteger(R.integer.config_lockIconLongPress);
-        dumpManager.registerDumpable(TAG, this);
-        mResources = resources;
-        mContext = context;
-        mDeviceEntryInteractor = deviceEntryInteractor;
-        mSceneContainerFlags = sceneContainerFlags;
-
-        mAccessibilityDelegate = new View.AccessibilityDelegate() {
-            private final AccessibilityNodeInfo.AccessibilityAction mAccessibilityAuthenticateHint =
-                    new AccessibilityNodeInfo.AccessibilityAction(
-                            AccessibilityNodeInfoCompat.ACTION_CLICK,
-                            mResources.getString(R.string.accessibility_authenticate_hint));
-            private final AccessibilityNodeInfo.AccessibilityAction mAccessibilityEnterHint =
-                    new AccessibilityNodeInfo.AccessibilityAction(
-                            AccessibilityNodeInfoCompat.ACTION_CLICK,
-                            mResources.getString(R.string.accessibility_enter_hint));
-            public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) {
-                super.onInitializeAccessibilityNodeInfo(v, info);
-                if (isActionable()) {
-                    if (mShowLockIcon) {
-                        info.addAction(mAccessibilityAuthenticateHint);
-                    } else if (mShowUnlockIcon) {
-                        info.addAction(mAccessibilityEnterHint);
-                    }
-                }
-            }
-        };
-    }
-
-    /** Sets the LockIconView to the controller and rebinds any that depend on it. */
-    @SuppressLint("ClickableViewAccessibility")
-    public void setLockIconView(LockIconView lockIconView) {
-        mView = lockIconView;
-        mView.setAccessibilityDelegate(mAccessibilityDelegate);
-
-        if (mFeatureFlags.isEnabled(DOZING_MIGRATION_1)) {
-            collectFlow(mView, mTransitionInteractor.getDozeAmountTransition(),
-                    mDozeTransitionCallback);
-            collectFlow(mView, mKeyguardInteractor.isDozing(), mIsDozingCallback);
-        }
-
-        if (mFeatureFlags.isEnabled(LOCKSCREEN_WALLPAPER_DREAM_ENABLED)) {
-            collectFlow(mView, mKeyguardInteractor.isActiveDreamLockscreenHosted(),
-                    mIsActiveDreamLockscreenHostedCallback);
-        }
-
-        updateIsUdfpsEnrolled();
-        updateConfiguration();
-        updateKeyguardShowing();
-
-        mIsBouncerShowing = mKeyguardViewController.isBouncerShowing();
-        mIsDozing = mStatusBarStateController.isDozing();
-        mInterpolatedDarkAmount = mStatusBarStateController.getDozeAmount();
-        mRunningFPS = mKeyguardUpdateMonitor.isFingerprintDetectionRunning();
-        mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
-        mStatusBarState = mStatusBarStateController.getState();
-
-        updateColors();
-        mDownDetected = false;
-        updateBurnInOffsets();
-        updateVisibility();
-
-        updateAccessibility();
-
-        lockIconView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
-            @Override
-            public void onViewAttachedToWindow(View view) {
-                registerCallbacks();
-            }
-
-            @Override
-            public void onViewDetachedFromWindow(View view) {
-                unregisterCallbacks();
-            }
-        });
-
-        if (lockIconView.isAttachedToWindow()) {
-            registerCallbacks();
-        }
-
-        lockIconView.setOnTouchListener((view, motionEvent) -> onTouchEvent(motionEvent));
-    }
-
-    private void registerCallbacks() {
-        mConfigurationController.addCallback(mConfigurationListener);
-        mAuthController.addCallback(mAuthControllerCallback);
-        mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback);
-        mStatusBarStateController.addCallback(mStatusBarStateListener);
-        mKeyguardStateController.addCallback(mKeyguardStateCallback);
-        mAccessibilityManager.addAccessibilityStateChangeListener(
-                mAccessibilityStateChangeListener);
-
-    }
-
-    private void unregisterCallbacks() {
-        mAuthController.removeCallback(mAuthControllerCallback);
-        mConfigurationController.removeCallback(mConfigurationListener);
-        mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
-        mStatusBarStateController.removeCallback(mStatusBarStateListener);
-        mKeyguardStateController.removeCallback(mKeyguardStateCallback);
-        mAccessibilityManager.removeAccessibilityStateChangeListener(
-                mAccessibilityStateChangeListener);
-
-    }
-
-    private void updateAccessibility() {
-        if (mAccessibilityManager.isEnabled()) {
-            mView.setOnClickListener(mA11yClickListener);
-        } else {
-            mView.setOnClickListener(null);
-        }
-    }
-
-    public float getTop() {
-        return mView.getLocationTop();
-    }
-
-    public float getBottom() {
-        return mView.getLocationBottom();
-    }
-
-    private void updateVisibility() {
-        if (!mIsKeyguardShowing && !mIsDozing) {
-            mView.setVisibility(View.INVISIBLE);
-            return;
-        }
-
-        if (mIsKeyguardShowing && mIsActiveDreamLockscreenHosted) {
-            mView.setVisibility(View.INVISIBLE);
-            return;
-        }
-
-        boolean wasShowingFpIcon = mUdfpsEnrolled && !mShowUnlockIcon && !mShowLockIcon
-                && !mShowAodUnlockedIcon && !mShowAodLockIcon;
-        mShowLockIcon = !mCanDismissLockScreen && isLockScreen()
-                && (!mUdfpsEnrolled || !mRunningFPS);
-        mShowUnlockIcon = mCanDismissLockScreen && isLockScreen();
-        mShowAodUnlockedIcon = mIsDozing && mUdfpsEnrolled && !mRunningFPS && mCanDismissLockScreen;
-        mShowAodLockIcon = mIsDozing && mUdfpsEnrolled && !mRunningFPS && !mCanDismissLockScreen;
-
-        final CharSequence prevContentDescription = mView.getContentDescription();
-        if (mShowLockIcon) {
-            if (wasShowingFpIcon) {
-                // fp icon was shown by UdfpsView, and now we still want to animate the transition
-                // in this drawable
-                mView.updateIcon(ICON_FINGERPRINT, false);
-            }
-            mView.updateIcon(ICON_LOCK, false);
-            mView.setContentDescription(mLockedLabel);
-            mView.setVisibility(View.VISIBLE);
-        } else if (mShowUnlockIcon) {
-            if (wasShowingFpIcon) {
-                // fp icon was shown by UdfpsView, and now we still want to animate the transition
-                // in this drawable
-                mView.updateIcon(ICON_FINGERPRINT, false);
-            }
-            mView.updateIcon(ICON_UNLOCK, false);
-            mView.setContentDescription(mUnlockedLabel);
-            mView.setVisibility(View.VISIBLE);
-        } else if (mShowAodUnlockedIcon) {
-            mView.updateIcon(ICON_UNLOCK, true);
-            mView.setContentDescription(mUnlockedLabel);
-            mView.setVisibility(View.VISIBLE);
-        } else if (mShowAodLockIcon) {
-            mView.updateIcon(ICON_LOCK, true);
-            mView.setContentDescription(mLockedLabel);
-            mView.setVisibility(View.VISIBLE);
-        } else {
-            mView.clearIcon();
-            mView.setVisibility(View.INVISIBLE);
-            mView.setContentDescription(null);
-        }
-
-        boolean accessibilityEnabled =
-                !mPrimaryBouncerInteractor.isAnimatingAway() && mView.isVisibleToUser();
-        mView.setImportantForAccessibility(
-                accessibilityEnabled ? View.IMPORTANT_FOR_ACCESSIBILITY_YES
-                        : View.IMPORTANT_FOR_ACCESSIBILITY_NO);
-
-        if (!Objects.equals(prevContentDescription, mView.getContentDescription())
-                && mView.getContentDescription() != null && accessibilityEnabled) {
-            mView.announceForAccessibility(mView.getContentDescription());
-        }
-    }
-
-    private boolean isLockScreen() {
-        return !mIsDozing
-                && !mIsBouncerShowing
-                && mStatusBarState == StatusBarState.KEYGUARD;
-    }
-
-    private void updateKeyguardShowing() {
-        mIsKeyguardShowing = mKeyguardStateController.isShowing()
-                && !mKeyguardStateController.isKeyguardGoingAway();
-    }
-
-    private void updateColors() {
-        mView.updateColorAndBackgroundVisibility();
-    }
-
-    private void updateConfiguration() {
-        WindowManager windowManager = mContext.getSystemService(WindowManager.class);
-        Rect bounds = windowManager.getCurrentWindowMetrics().getBounds();
-        mWidthPixels = bounds.right;
-        if (mFeatureFlags.isEnabled(Flags.LOCKSCREEN_ENABLE_LANDSCAPE)) {
-            // Assumed to be initially neglected as there are no left or right insets in portrait
-            // However, on landscape, these insets need to included when calculating the midpoint
-            WindowInsets insets = windowManager.getCurrentWindowMetrics().getWindowInsets();
-            mWidthPixels -= insets.getSystemWindowInsetLeft() + insets.getSystemWindowInsetRight();
-        }
-        mHeightPixels = bounds.bottom;
-        mBottomPaddingPx = mResources.getDimensionPixelSize(R.dimen.lock_icon_margin_bottom);
-        mDefaultPaddingPx = mResources.getDimensionPixelSize(R.dimen.lock_icon_padding);
-        mUnlockedLabel = mResources.getString(
-                R.string.accessibility_unlock_button);
-        mLockedLabel = mResources.getString(R.string.accessibility_lock_icon);
-        updateLockIconLocation();
-    }
-
-    private void updateLockIconLocation() {
-        final float scaleFactor = mAuthController.getScaleFactor();
-        final int scaledPadding = (int) (mDefaultPaddingPx * scaleFactor);
-        if (KeyguardBottomAreaRefactor.isEnabled() || MigrateClocksToBlueprint.isEnabled()) {
-            mView.getLockIcon().setPadding(scaledPadding, scaledPadding, scaledPadding,
-                    scaledPadding);
-        } else {
-            if (mUdfpsSupported) {
-                mView.setCenterLocation(mAuthController.getUdfpsLocation(),
-                        mAuthController.getUdfpsRadius(), scaledPadding);
-            } else {
-                mView.setCenterLocation(
-                        new Point((int) mWidthPixels / 2,
-                                (int) (mHeightPixels
-                                        - ((mBottomPaddingPx + sLockIconRadiusPx) * scaleFactor))),
-                        sLockIconRadiusPx * scaleFactor, scaledPadding);
-            }
-        }
-    }
-
-    @Override
-    public void dump(@NonNull PrintWriter pw, @NonNull String[] args) {
-        pw.println("mUdfpsSupported: " + mUdfpsSupported);
-        pw.println("mUdfpsEnrolled: " + mUdfpsEnrolled);
-        pw.println("mIsKeyguardShowing: " + mIsKeyguardShowing);
-        pw.println();
-        pw.println(" mShowUnlockIcon: " + mShowUnlockIcon);
-        pw.println(" mShowLockIcon: " + mShowLockIcon);
-        pw.println(" mShowAodUnlockedIcon: " + mShowAodUnlockedIcon);
-        pw.println();
-        pw.println(" mIsDozing: " + mIsDozing);
-        pw.println(" isFlagEnabled(DOZING_MIGRATION_1): "
-                + mFeatureFlags.isEnabled(DOZING_MIGRATION_1));
-        pw.println(" mIsBouncerShowing: " + mIsBouncerShowing);
-        pw.println(" mRunningFPS: " + mRunningFPS);
-        pw.println(" mCanDismissLockScreen: " + mCanDismissLockScreen);
-        pw.println(" mStatusBarState: " + StatusBarState.toString(mStatusBarState));
-        pw.println(" mInterpolatedDarkAmount: " + mInterpolatedDarkAmount);
-        pw.println(" mSensorTouchLocation: " + mSensorTouchLocation);
-        pw.println(" mDefaultPaddingPx: " + mDefaultPaddingPx);
-        pw.println(" mIsActiveDreamLockscreenHosted: " + mIsActiveDreamLockscreenHosted);
-
-        if (mView != null) {
-            mView.dump(pw, args);
-        }
-    }
-
-    /** Every minute, update the aod icon's burn in offset */
-    public void dozeTimeTick() {
-        updateBurnInOffsets();
-    }
-
-    private void updateBurnInOffsets() {
-        float offsetX = MathUtils.lerp(0f,
-                getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */)
-                        - mMaxBurnInOffsetX, mInterpolatedDarkAmount);
-        float offsetY = MathUtils.lerp(0f,
-                getBurnInOffset(mMaxBurnInOffsetY * 2, false /* xAxis */)
-                        - mMaxBurnInOffsetY, mInterpolatedDarkAmount);
-
-        mView.setTranslationX(offsetX);
-        mView.setTranslationY(offsetY);
-    }
-
-    private void updateIsUdfpsEnrolled() {
-        boolean wasUdfpsSupported = mUdfpsSupported;
-        boolean wasUdfpsEnrolled = mUdfpsEnrolled;
-
-        mUdfpsSupported = mKeyguardUpdateMonitor.isUdfpsSupported();
-        mView.setUseBackground(mUdfpsSupported);
-
-        mUdfpsEnrolled = mKeyguardUpdateMonitor.isUdfpsEnrolled();
-        if (wasUdfpsSupported != mUdfpsSupported || wasUdfpsEnrolled != mUdfpsEnrolled) {
-            updateVisibility();
-        }
-    }
-
-    private StatusBarStateController.StateListener mStatusBarStateListener =
-            new StatusBarStateController.StateListener() {
-                @Override
-                public void onDozeAmountChanged(float linear, float eased) {
-                    if (!mFeatureFlags.isEnabled(DOZING_MIGRATION_1)) {
-                        mInterpolatedDarkAmount = eased;
-                        mView.setDozeAmount(eased);
-                        updateBurnInOffsets();
-                    }
-                }
-
-                @Override
-                public void onDozingChanged(boolean isDozing) {
-                    if (!mFeatureFlags.isEnabled(DOZING_MIGRATION_1)) {
-                        mIsDozing = isDozing;
-                        updateBurnInOffsets();
-                        updateVisibility();
-                    }
-                }
-
-                @Override
-                public void onStateChanged(int statusBarState) {
-                    mStatusBarState = statusBarState;
-                    updateVisibility();
-                }
-            };
-
-    private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback =
-            new KeyguardUpdateMonitorCallback() {
-                @Override
-                public void onKeyguardBouncerStateChanged(boolean bouncer) {
-                    mIsBouncerShowing = bouncer;
-                    updateVisibility();
-                }
-
-                @Override
-                public void onBiometricRunningStateChanged(boolean running,
-                        BiometricSourceType biometricSourceType) {
-                    final boolean wasRunningFps = mRunningFPS;
-
-                    if (biometricSourceType == FINGERPRINT) {
-                        mRunningFPS = running;
-                    }
-
-                    if (wasRunningFps != mRunningFPS) {
-                        updateVisibility();
-                    }
-                }
-            };
-
-    private final KeyguardStateController.Callback mKeyguardStateCallback =
-            new KeyguardStateController.Callback() {
-        @Override
-        public void onUnlockedChanged() {
-            mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
-            updateKeyguardShowing();
-            updateVisibility();
-        }
-
-        @Override
-        public void onKeyguardShowingChanged() {
-            // Reset values in case biometrics were removed (ie: pin/pattern/password => swipe).
-            // If biometrics were removed, local vars mCanDismissLockScreen and
-            // mUserUnlockedWithBiometric may not be updated.
-            mCanDismissLockScreen = mKeyguardStateController.canDismissLockScreen();
-
-            // reset mIsBouncerShowing state in case it was preemptively set
-            // onLongPress
-            mIsBouncerShowing = mKeyguardViewController.isBouncerShowing();
-
-            updateKeyguardShowing();
-            updateVisibility();
-        }
-
-        @Override
-        public void onKeyguardFadingAwayChanged() {
-            updateKeyguardShowing();
-            updateVisibility();
-        }
-    };
-
-    private final ConfigurationController.ConfigurationListener mConfigurationListener =
-            new ConfigurationController.ConfigurationListener() {
-        @Override
-        public void onUiModeChanged() {
-            updateColors();
-        }
-
-        @Override
-        public void onThemeChanged() {
-            updateColors();
-        }
-
-        @Override
-        public void onConfigChanged(Configuration newConfig) {
-            updateConfiguration();
-            updateColors();
-        }
-    };
-
-    /**
-     * Handles the touch if {@link #isActionable()} is true.
-     * Subsequently, will trigger {@link #onLongPress()} if a touch is continuously in the lock icon
-     * area for {@link #mLongPressTimeout} ms.
-     *
-     * Touch speed debouncing mimics logic from the velocity tracker in {@link UdfpsController}.
-     */
-    private boolean onTouchEvent(MotionEvent event) {
-        if (!actionableDownEventStartedOnView(event)) {
-            cancelTouches();
-            return false;
-        }
-
-        switch(event.getActionMasked()) {
-            case MotionEvent.ACTION_DOWN:
-            case MotionEvent.ACTION_HOVER_ENTER:
-                if (!mDownDetected && mAccessibilityManager.isTouchExplorationEnabled()) {
-                    vibrateOnTouchExploration();
-                }
-
-                // The pointer that causes ACTION_DOWN is always at index 0.
-                // We need to persist its ID to track it during ACTION_MOVE that could include
-                // data for many other pointers because of multi-touch support.
-                mActivePointerId = event.getPointerId(0);
-                if (mVelocityTracker == null) {
-                    // To simplify the lifecycle of the velocity tracker, make sure it's never null
-                    // after ACTION_DOWN, and always null after ACTION_CANCEL or ACTION_UP.
-                    mVelocityTracker = VelocityTracker.obtain();
-                } else {
-                    // 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();
-                }
-                mVelocityTracker.addMovement(event);
-
-                mDownDetected = true;
-                mLongPressCancelRunnable = mExecutor.executeDelayed(
-                        this::onLongPress, mLongPressTimeout);
-                break;
-            case MotionEvent.ACTION_MOVE:
-            case MotionEvent.ACTION_HOVER_MOVE:
-                mVelocityTracker.addMovement(event);
-                // Compute pointer velocity in pixels per second.
-                mVelocityTracker.computeCurrentVelocity(1000);
-                float velocity = computePointerSpeed(mVelocityTracker,
-                        mActivePointerId);
-                if (event.getClassification() != MotionEvent.CLASSIFICATION_DEEP_PRESS
-                        && exceedsVelocityThreshold(velocity)) {
-                    Log.v(TAG, "lock icon long-press rescheduled due to "
-                            + "high pointer velocity=" + velocity);
-                    mLongPressCancelRunnable.run();
-                    mLongPressCancelRunnable = mExecutor.executeDelayed(
-                            this::onLongPress, mLongPressTimeout);
-                }
-                break;
-            case MotionEvent.ACTION_UP:
-            case MotionEvent.ACTION_CANCEL:
-            case MotionEvent.ACTION_HOVER_EXIT:
-                cancelTouches();
-                break;
-        }
-
-        return true;
-    }
-
-    /**
-     * Calculate the pointer speed given a velocity tracker and the pointer id.
-     * This assumes that the velocity tracker has already been passed all relevant motion events.
-     */
-    private static float computePointerSpeed(@NonNull VelocityTracker tracker, int pointerId) {
-        final float vx = tracker.getXVelocity(pointerId);
-        final float vy = tracker.getYVelocity(pointerId);
-        return (float) Math.sqrt(Math.pow(vx, 2.0) + Math.pow(vy, 2.0));
-    }
-
-    /**
-     * Whether the velocity exceeds the acceptable UDFPS debouncing threshold.
-     */
-    private static boolean exceedsVelocityThreshold(float velocity) {
-        return velocity > 750f;
-    }
-
-    private boolean actionableDownEventStartedOnView(MotionEvent event) {
-        if (!isActionable()) {
-            return false;
-        }
-
-        if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
-            return true;
-        }
-
-        return mDownDetected;
-    }
-
-    @ExperimentalCoroutinesApi
-    @VisibleForTesting
-    protected void onLongPress() {
-        cancelTouches();
-        if (mFalsingManager.isFalseLongTap(FalsingManager.LOW_PENALTY)) {
-            Log.v(TAG, "lock icon long-press rejected by the falsing manager.");
-            return;
-        }
-
-        // pre-emptively set to true to hide view
-        mIsBouncerShowing = true;
-        if (!DeviceEntryUdfpsRefactor.isEnabled()
-                && mUdfpsSupported && mShowUnlockIcon && mAuthRippleController != null) {
-            mAuthRippleController.showUnlockRipple(FINGERPRINT);
-        }
-        updateVisibility();
-
-        // play device entry haptic (consistent with UDFPS controller longpress)
-        vibrateOnLongPress();
-
-        if (mSceneContainerFlags.isEnabled()) {
-            mDeviceEntryInteractor.get().attemptDeviceEntry();
-        } else {
-            mKeyguardViewController.showPrimaryBouncer(/* scrim */ true);
-        }
-    }
-
-
-    private void cancelTouches() {
-        mDownDetected = false;
-        if (mLongPressCancelRunnable != null) {
-            mLongPressCancelRunnable.run();
-        }
-        if (mVelocityTracker != null) {
-            mVelocityTracker.recycle();
-            mVelocityTracker = null;
-        }
-    }
-
-    private boolean isActionable() {
-        if (mIsBouncerShowing) {
-            Log.v(TAG, "lock icon long-press ignored, bouncer already showing.");
-            // a long press gestures from AOD may have already triggered the bouncer to show,
-            // so this touch is no longer actionable
-            return false;
-        }
-        return mUdfpsSupported || mShowUnlockIcon;
-    }
-
-    /**
-     * Set the alpha of this view.
-     */
-    public void setAlpha(float alpha) {
-        mView.setAlpha(alpha);
-    }
-
-    private void updateUdfpsConfig() {
-        // must be called from the main thread since it may update the views
-        mExecutor.execute(() -> {
-            updateIsUdfpsEnrolled();
-            updateConfiguration();
-        });
-    }
-
-    @VisibleForTesting
-    void vibrateOnTouchExploration() {
-        mVibrator.performHapticFeedback(
-                mView,
-                HapticFeedbackConstants.CONTEXT_CLICK
-        );
-    }
-
-    @VisibleForTesting
-    void vibrateOnLongPress() {
-        mVibrator.performHapticFeedback(mView, UdfpsController.LONG_PRESS);
-    }
-
-    private final AuthController.Callback mAuthControllerCallback = new AuthController.Callback() {
-        @Override
-        public void onAllAuthenticatorsRegistered(@BiometricAuthenticator.Modality int modality) {
-            if (modality == TYPE_FINGERPRINT) {
-                updateUdfpsConfig();
-            }
-        }
-
-        @Override
-        public void onEnrollmentsChanged(@BiometricAuthenticator.Modality int modality) {
-            if (modality == TYPE_FINGERPRINT) {
-                updateUdfpsConfig();
-            }
-        }
-
-        @Override
-        public void onUdfpsLocationChanged(UdfpsOverlayParams udfpsOverlayParams) {
-            updateUdfpsConfig();
-        }
-    };
-
-    /**
-     * Whether the lock icon will handle a touch while dozing.
-     */
-    public boolean willHandleTouchWhileDozing(MotionEvent event) {
-        // is in lock icon area
-        mView.getHitRect(mSensorTouchLocation);
-        final boolean inLockIconArea =
-                mSensorTouchLocation.contains((int) event.getX(), (int) event.getY())
-                        && mView.getVisibility() == View.VISIBLE;
-
-        return inLockIconArea && actionableDownEventStartedOnView(event);
-    }
-
-    private final View.OnClickListener mA11yClickListener = v -> onLongPress();
-
-    private final AccessibilityManager.AccessibilityStateChangeListener
-            mAccessibilityStateChangeListener = enabled -> updateAccessibility();
-}
diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.kt b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.kt
new file mode 100644
index 0000000..10d5a0c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.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.keyguard
+
+import android.view.MotionEvent
+
+/** Controls the [LockIconView]. */
+interface LockIconViewController {
+    fun setLockIconView(lockIconView: LockIconView)
+    fun getTop(): Float
+    fun getBottom(): Float
+    fun dozeTimeTick()
+    fun setAlpha(alpha: Float)
+    fun willHandleTouchWhileDozing(event: MotionEvent): Boolean
+}
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 3e03fb8..b8af59d 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -401,8 +401,6 @@
         mExecutor = mThreadFactory.buildDelayableExecutorOnHandler(mHandler);
         mExecutor.execute(this::startOnScreenDecorationsThread);
         mDotViewController.setUiExecutor(mExecutor);
-        mJavaAdapter.alwaysCollectFlow(mFacePropertyRepository.getSensorLocation(),
-                this::onFaceSensorLocationChanged);
         mCommandRegistry.registerCommand(ScreenDecorCommand.SCREEN_DECOR_CMD_NAME,
                 () -> new ScreenDecorCommand(mScreenDecorCommandCallback));
     }
@@ -579,6 +577,8 @@
         };
         mDisplayTracker.addDisplayChangeCallback(mDisplayListener, new HandlerExecutor(mHandler));
         updateConfiguration();
+        mJavaAdapter.alwaysCollectFlow(mFacePropertyRepository.getSensorLocation(),
+                this::onFaceSensorLocationChanged);
         Trace.endSection();
     }
 
@@ -1320,10 +1320,18 @@
     @VisibleForTesting
     void onFaceSensorLocationChanged(Point location) {
         mLogger.onSensorLocationChanged();
+
         if (mExecutor != null) {
             mExecutor.execute(
-                    () -> updateOverlayProviderViews(
-                            new Integer[]{mFaceScanningViewId}));
+                    () -> {
+                        if (getOverlayView(mFaceScanningViewId) == null) {
+                            // face sensor location was just initialized
+                            setupDecorations();
+                        } else {
+                            updateOverlayProviderViews(new Integer[]{mFaceScanningViewId});
+                        }
+                    }
+            );
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index 22bd207..27b2b92 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -18,6 +18,7 @@
 
 import static androidx.dynamicanimation.animation.DynamicAnimation.TRANSLATION_X;
 import static androidx.dynamicanimation.animation.FloatPropertyCompat.createFloatPropertyCompat;
+
 import static com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS;
 import static com.android.systemui.flags.Flags.SWIPE_UNCLEARED_TRANSIENT_VIEW_FIX;
 import static com.android.systemui.statusbar.notification.NotificationUtils.logKey;
@@ -54,8 +55,8 @@
 import com.android.systemui.res.R;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.wm.shell.animation.FlingAnimationUtils;
-import com.android.wm.shell.animation.PhysicsAnimator;
-import com.android.wm.shell.animation.PhysicsAnimator.SpringConfig;
+import com.android.wm.shell.shared.animation.PhysicsAnimator;
+import com.android.wm.shell.shared.animation.PhysicsAnimator.SpringConfig;
 
 import java.io.PrintWriter;
 import java.util.function.Consumer;
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index ea8fe59..fb88f0e 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -300,7 +300,7 @@
 
                 Class<?> cls = entry.getKey();
                 Dependencies dep = cls.getAnnotation(Dependencies.class);
-                Class<? extends CoreStartable>[] deps = (dep == null ? null : dep.value());
+                Class<?>[] deps = (dep == null ? null : dep.value());
                 if (deps == null || startedStartables.containsAll(Arrays.asList(deps))) {
                     String clsName = cls.getName();
                     int i = serviceIndex;  // Copied to make lambda happy.
@@ -324,7 +324,7 @@
                 Map.Entry<Class<?>, Provider<CoreStartable>> entry = nextQueue.removeFirst();
                 Class<?> cls = entry.getKey();
                 Dependencies dep = cls.getAnnotation(Dependencies.class);
-                Class<? extends CoreStartable>[] deps = (dep == null ? null : dep.value());
+                Class<?>[] deps = (dep == null ? null : dep.value());
                 StringJoiner stringJoiner = new StringJoiner(", ");
                 for (int i = 0; deps != null && i < deps.length; i++) {
                     if (!startedStartables.contains(deps[i])) {
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java b/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java
index 1a9b01f..7e94804 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIInitializer.java
@@ -29,8 +29,8 @@
 import com.android.systemui.util.InitializationChecker;
 import com.android.wm.shell.dagger.WMShellConcurrencyModule;
 import com.android.wm.shell.keyguard.KeyguardTransitions;
+import com.android.wm.shell.shared.ShellTransitions;
 import com.android.wm.shell.sysui.ShellInterface;
-import com.android.wm.shell.transition.ShellTransitions;
 
 import java.util.Optional;
 import java.util.concurrent.ExecutionException;
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIService.java b/packages/SystemUI/src/com/android/systemui/SystemUIService.java
index b26be0c..0cc3be2 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIService.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIService.java
@@ -99,9 +99,10 @@
         if (Build.IS_DEBUGGABLE) {
             // b/71353150 - looking for leaked binder proxies
             BinderInternal.nSetBinderProxyCountEnabled(true);
-            BinderInternal.nSetBinderProxyCountWatermarks(1000,900);
+            BinderInternal.nSetBinderProxyCountWatermarks(
+                    /* high= */ 1000, /* low= */ 900, /* warning= */ 950);
             BinderInternal.setBinderProxyCountCallback(
-                    new BinderInternal.BinderProxyLimitListener() {
+                    new BinderInternal.BinderProxyCountEventListener() {
                         @Override
                         public void onLimitReached(int uid) {
                             Slog.w(SystemUIApplication.TAG,
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java
new file mode 100644
index 0000000..af8149f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 static android.view.WindowManager.LayoutParams;
+
+import android.annotation.UiContext;
+import android.content.Context;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.Region;
+import android.view.AttachedSurfaceControl;
+import android.view.LayoutInflater;
+import android.view.SurfaceControl;
+import android.view.SurfaceControlViewHost;
+import android.view.View;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
+
+import androidx.annotation.UiThread;
+
+import com.android.systemui.res.R;
+
+import java.util.function.Supplier;
+
+class FullscreenMagnificationController {
+
+    private final Context mContext;
+    private final AccessibilityManager mAccessibilityManager;
+    private final WindowManager mWindowManager;
+    private Supplier<SurfaceControlViewHost> mScvhSupplier;
+    private SurfaceControlViewHost mSurfaceControlViewHost;
+    private Rect mWindowBounds;
+    private SurfaceControl.Transaction mTransaction;
+    private View mFullscreenBorder = null;
+    private int mBorderOffset;
+    private final int mDisplayId;
+    private static final Region sEmptyRegion = new Region();
+
+    FullscreenMagnificationController(
+            @UiContext Context context,
+            AccessibilityManager accessibilityManager,
+            WindowManager windowManager,
+            Supplier<SurfaceControlViewHost> scvhSupplier) {
+        mContext = context;
+        mAccessibilityManager = accessibilityManager;
+        mWindowManager = windowManager;
+        mWindowBounds = mWindowManager.getCurrentWindowMetrics().getBounds();
+        mTransaction = new SurfaceControl.Transaction();
+        mScvhSupplier = scvhSupplier;
+        mBorderOffset = mContext.getResources().getDimensionPixelSize(
+                R.dimen.magnifier_border_width_fullscreen_with_offset)
+                - mContext.getResources().getDimensionPixelSize(
+                R.dimen.magnifier_border_width_fullscreen);
+        mDisplayId = mContext.getDisplayId();
+    }
+
+    @UiThread
+    void onFullscreenMagnificationActivationChanged(boolean activated) {
+        if (activated) {
+            createFullscreenMagnificationBorder();
+        } else {
+            removeFullscreenMagnificationBorder();
+        }
+    }
+
+    @UiThread
+    private void removeFullscreenMagnificationBorder() {
+        if (mSurfaceControlViewHost != null) {
+            mSurfaceControlViewHost.release();
+            mSurfaceControlViewHost = null;
+        }
+
+        if (mFullscreenBorder != null) {
+            mFullscreenBorder = null;
+        }
+    }
+
+    /**
+     * Since the device corners are not perfectly rounded, we would like to create a thick stroke,
+     * and set negative offset to the border view to fill up the spaces between the border and the
+     * device corners.
+     */
+    @UiThread
+    private void createFullscreenMagnificationBorder() {
+        mFullscreenBorder = LayoutInflater.from(mContext)
+                .inflate(R.layout.fullscreen_magnification_border, null);
+        mSurfaceControlViewHost = mScvhSupplier.get();
+        mSurfaceControlViewHost.setView(mFullscreenBorder, getBorderLayoutParams());
+
+        SurfaceControl surfaceControl = mSurfaceControlViewHost
+                .getSurfacePackage().getSurfaceControl();
+
+        mTransaction
+                .setPosition(surfaceControl, -mBorderOffset, -mBorderOffset)
+                .setLayer(surfaceControl, Integer.MAX_VALUE)
+                .show(surfaceControl)
+                .apply();
+
+        mAccessibilityManager.attachAccessibilityOverlayToDisplay(mDisplayId, surfaceControl);
+
+        applyTouchableRegion();
+    }
+
+    private LayoutParams getBorderLayoutParams() {
+        LayoutParams params =  new LayoutParams(
+                mWindowBounds.width() + 2 * mBorderOffset,
+                mWindowBounds.height() + 2 * mBorderOffset,
+                LayoutParams.TYPE_ACCESSIBILITY_OVERLAY,
+                LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE,
+                PixelFormat.TRANSPARENT);
+        params.setTrustedOverlay();
+        return params;
+    }
+
+    private void applyTouchableRegion() {
+        // Sometimes this can get posted and run after deleteWindowMagnification() is called.
+        if (mFullscreenBorder == null) return;
+
+        AttachedSurfaceControl surfaceControl = mSurfaceControlViewHost.getRootSurfaceControl();
+
+        // The touchable region of the mFullscreenBorder will be empty since we are going to allow
+        // all touch events to go through this view.
+        surfaceControl.setTouchableRegion(sEmptyRegion);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java
index 88fa2de..70165f3 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java
@@ -34,6 +34,7 @@
 import android.view.Display;
 import android.view.SurfaceControl;
 import android.view.SurfaceControlViewHost;
+import android.view.WindowManager;
 import android.view.WindowManagerGlobal;
 import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.IMagnificationConnection;
@@ -134,6 +135,37 @@
     @VisibleForTesting
     DisplayIdIndexSupplier<WindowMagnificationController> mWindowMagnificationControllerSupplier;
 
+    private static class FullscreenMagnificationControllerSupplier extends
+            DisplayIdIndexSupplier<FullscreenMagnificationController> {
+
+        private final Context mContext;
+
+        FullscreenMagnificationControllerSupplier(Context context, Handler handler,
+                DisplayManager displayManager, SysUiState sysUiState,
+                SecureSettings secureSettings) {
+            super(displayManager);
+            mContext = context;
+        }
+
+        @Override
+        protected FullscreenMagnificationController createInstance(Display display) {
+            final Context windowContext = mContext.createWindowContext(display,
+                    TYPE_ACCESSIBILITY_OVERLAY, /* options */ null);
+            Supplier<SurfaceControlViewHost> scvhSupplier = () -> new SurfaceControlViewHost(
+                    mContext, mContext.getDisplay(), new InputTransferToken(), TAG);
+            windowContext.setTheme(com.android.systemui.res.R.style.Theme_SystemUI);
+            return new FullscreenMagnificationController(
+                    windowContext,
+                    windowContext.getSystemService(AccessibilityManager.class),
+                    windowContext.getSystemService(WindowManager.class),
+                    scvhSupplier);
+        }
+    }
+
+    @VisibleForTesting
+    DisplayIdIndexSupplier<FullscreenMagnificationController>
+            mFullscreenMagnificationControllerSupplier;
+
     private static class SettingsSupplier extends
             DisplayIdIndexSupplier<MagnificationSettingsController> {
 
@@ -185,6 +217,8 @@
         mWindowMagnificationControllerSupplier = new WindowMagnificationControllerSupplier(context,
                 mHandler, mWindowMagnifierCallback,
                 displayManager, sysUiState, secureSettings);
+        mFullscreenMagnificationControllerSupplier = new FullscreenMagnificationControllerSupplier(
+                context, mHandler, displayManager, sysUiState, secureSettings);
         mMagnificationSettingsSupplier = new SettingsSupplier(context,
                 mMagnificationSettingsControllerCallback, displayManager, secureSettings);
 
@@ -273,8 +307,13 @@
         }
     }
 
+    @MainThread
     void onFullscreenMagnificationActivationChanged(int displayId, boolean activated) {
-        // Do nothing
+        final FullscreenMagnificationController fullscreenMagnificationController =
+                mFullscreenMagnificationControllerSupplier.get(displayId);
+        if (fullscreenMagnificationController != null) {
+            fullscreenMagnificationController.onFullscreenMagnificationActivationChanged(activated);
+        }
     }
 
     @MainThread
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java
index 0f4d63c..7e96e48 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java
@@ -149,7 +149,7 @@
             if (mState == STATE_ENABLING || mState == STATE_DISABLING) {
                 mValueAnimator.cancel();
             }
-            mController.enableWindowMagnificationInternal(scale, centerX, centerY,
+            mController.updateWindowMagnificationInternal(scale, centerX, centerY,
                     mMagnificationFrameOffsetRatioX, mMagnificationFrameOffsetRatioY);
             updateState();
             return;
@@ -159,7 +159,7 @@
 
         if (mEndSpec.equals(mStartSpec)) {
             if (mState == STATE_DISABLED) {
-                mController.enableWindowMagnificationInternal(scale, centerX, centerY,
+                mController.updateWindowMagnificationInternal(scale, centerX, centerY,
                         mMagnificationFrameOffsetRatioX, mMagnificationFrameOffsetRatioY);
             } else if (mState == STATE_ENABLING || mState == STATE_DISABLING) {
                 mValueAnimator.cancel();
@@ -306,7 +306,7 @@
         // If the animation is playing backwards, mStartSpec will be the final spec we would
         // like to reach.
         AnimationSpec spec = isReverse ? mStartSpec : mEndSpec;
-        mController.enableWindowMagnificationInternal(
+        mController.updateWindowMagnificationInternal(
                 spec.mScale, spec.mCenterX, spec.mCenterY,
                 mMagnificationFrameOffsetRatioX, mMagnificationFrameOffsetRatioY);
 
@@ -358,7 +358,7 @@
                 mStartSpec.mCenterX + (mEndSpec.mCenterX - mStartSpec.mCenterX) * fract;
         final float centerY =
                 mStartSpec.mCenterY + (mEndSpec.mCenterY - mStartSpec.mCenterY) * fract;
-        mController.enableWindowMagnificationInternal(sentScale, centerX, centerY,
+        mController.updateWindowMagnificationInternal(sentScale, centerX, centerY,
                 mMagnificationFrameOffsetRatioX, mMagnificationFrameOffsetRatioY);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
index d65cd5c..a847c3d 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
@@ -148,7 +148,7 @@
     /**
      * SourceBound is the bound of the magnified region which projects the magnified content.
      * SourceBound's center is equal to the parameters centerX and centerY in
-     * {@link WindowMagnificationController#enableWindowMagnificationInternal(float, float, float)}}
+     * {@link WindowMagnificationController#updateWindowMagnificationInternal(float, float, float)}}
      * but it is calculated from {@link #mMagnificationFrame}'s center in the runtime.
      */
     private final Rect mSourceBounds = new Rect();
@@ -566,7 +566,7 @@
         // window size changed not caused by rotation.
         if (isActivated() && reCreateWindow) {
             deleteWindowMagnification();
-            enableWindowMagnificationInternal(Float.NaN, Float.NaN, Float.NaN);
+            updateWindowMagnificationInternal(Float.NaN, Float.NaN, Float.NaN);
         }
     }
 
@@ -1317,7 +1317,7 @@
     }
 
     /**
-     * Wraps {@link WindowMagnificationController#enableWindowMagnificationInternal(float, float,
+     * Wraps {@link WindowMagnificationController#updateWindowMagnificationInternal(float, float,
      * float, float, float)}
      * with transition animation. If the window magnification is not enabled, the scale will start
      * from 1.0 and the center won't be changed during the animation. If animator is
@@ -1344,10 +1344,12 @@
     }
 
     /**
-     * Enables window magnification with specified parameters. If the given scale is <strong>less
-     * than or equal to 1.0f</strong>, then
+     * Updates window magnification status with specified parameters. If the given scale is
+     * <strong>less than 1.0f</strong>, then
      * {@link WindowMagnificationController#deleteWindowMagnification()} will be called instead to
-     * be consistent with the behavior of display magnification.
+     * be consistent with the behavior of display magnification. If the given scale is
+     * <strong>larger than or equal to 1.0f</strong>, and the window magnification is not activated
+     * yet, window magnification will be enabled.
      *
      * @param scale   the target scale, or {@link Float#NaN} to leave unchanged
      * @param centerX the screen-relative X coordinate around which to center for magnification,
@@ -1355,16 +1357,17 @@
      * @param centerY the screen-relative Y coordinate around which to center for magnification,
      *                or {@link Float#NaN} to leave unchanged.
      */
-    void enableWindowMagnificationInternal(float scale, float centerX, float centerY) {
-        enableWindowMagnificationInternal(scale, centerX, centerY, Float.NaN, Float.NaN);
+    void updateWindowMagnificationInternal(float scale, float centerX, float centerY) {
+        updateWindowMagnificationInternal(scale, centerX, centerY, Float.NaN, Float.NaN);
     }
 
     /**
-     * Enables window magnification with specified parameters. If the given scale is <strong>less
-     * than 1.0f</strong>, then
+     * Updates window magnification status with specified parameters. If the given scale is
+     * <strong>less than 1.0f</strong>, then
      * {@link WindowMagnificationController#deleteWindowMagnification()} will be called instead to
-     * be consistent with the behavior of display magnification.
-     *
+     * be consistent with the behavior of display magnification. If the given scale is
+     * <strong>larger than or equal to 1.0f</strong>, and the window magnification is not activated
+     * yet, window magnification will be enabled.
      * @param scale   the target scale, or {@link Float#NaN} to leave unchanged
      * @param centerX the screen-relative X coordinate around which to center for magnification,
      *                or {@link Float#NaN} to leave unchanged.
@@ -1377,7 +1380,7 @@
      *                                       between frame position Y and centerY,
      *                                       or {@link Float#NaN} to leave unchanged.
      */
-    void enableWindowMagnificationInternal(float scale, float centerX, float centerY,
+    void updateWindowMagnificationInternal(float scale, float centerX, float centerY,
                 float magnificationFrameOffsetRatioX, float magnificationFrameOffsetRatioY) {
         if (Float.compare(scale, 1.0f) < 0) {
             deleteWindowMagnification();
@@ -1433,7 +1436,7 @@
             return;
         }
 
-        enableWindowMagnificationInternal(scale, Float.NaN, Float.NaN);
+        updateWindowMagnificationInternal(scale, Float.NaN, Float.NaN);
         mHandler.removeCallbacks(mUpdateStateDescriptionRunnable);
         mHandler.postDelayed(mUpdateStateDescriptionRunnable, UPDATE_STATE_DESCRIPTION_DELAY_MS);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSizePrefs.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSizePrefs.java
index 4d7ad264..a401f2a 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSizePrefs.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSizePrefs.java
@@ -23,7 +23,7 @@
 /**
  * Class to handle SharedPreference for window magnification size.
  */
-public final class WindowMagnificationSizePrefs {
+final class WindowMagnificationSizePrefs {
 
     private static final String WINDOW_MAGNIFICATION_PREFERENCES =
             "window_magnification_preferences";
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DragToInteractView.kt b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DragToInteractView.kt
index a90d4b2..c1b3962 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DragToInteractView.kt
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DragToInteractView.kt
@@ -39,9 +39,9 @@
 import androidx.dynamicanimation.animation.SpringForce.DAMPING_RATIO_LOW_BOUNCY
 import androidx.dynamicanimation.animation.SpringForce.STIFFNESS_LOW
 import com.android.wm.shell.R
-import com.android.wm.shell.animation.PhysicsAnimator
 import com.android.wm.shell.common.bubbles.DismissCircleView
 import com.android.wm.shell.common.bubbles.DismissView
+import com.android.wm.shell.shared.animation.PhysicsAnimator
 
 /**
  * View that handles interactions between DismissCircleView and BubbleStackView.
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java
index 0538e7d..1018f70 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java
@@ -21,8 +21,8 @@
 import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_OPACITY;
 import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE;
 import static android.provider.Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
 
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
 import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets;
 import static com.android.systemui.accessibility.floatingmenu.MenuFadeEffectInfoKt.DEFAULT_FADE_EFFECT_IS_ENABLED;
 import static com.android.systemui.accessibility.floatingmenu.MenuFadeEffectInfoKt.DEFAULT_OPACITY_VALUE;
@@ -182,7 +182,7 @@
     }
 
     void loadMenuTargetFeatures(OnInfoReady<List<AccessibilityTarget>> callback) {
-        callback.onReady(getTargets(mContext, ACCESSIBILITY_BUTTON));
+        callback.onReady(getTargets(mContext, SOFTWARE));
     }
 
     void loadMenuSizeType(OnInfoReady<Integer> callback) {
@@ -223,7 +223,7 @@
 
     private void onTargetFeaturesChanged() {
         mSettingsContentsCallback.onTargetFeaturesChanged(
-                getTargets(mContext, ACCESSIBILITY_BUTTON));
+                getTargets(mContext, SOFTWARE));
     }
 
     private Position getStartPosition() {
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuMessageView.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuMessageView.java
index 35fe6b1..c464c82 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuMessageView.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuMessageView.java
@@ -22,7 +22,6 @@
 import android.annotation.IntDef;
 import android.content.ComponentCallbacks;
 import android.content.Context;
-import android.content.res.ColorStateList;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Rect;
@@ -37,7 +36,6 @@
 
 import androidx.annotation.NonNull;
 
-import com.android.settingslib.Utils;
 import com.android.systemui.res.R;
 
 import java.lang.annotation.Retention;
@@ -171,9 +169,9 @@
         mTextView.setTextColor(textColor);
         mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL);
 
-        final ColorStateList colorAccent = Utils.getColorAccent(getContext());
         mUndoButton.setText(res.getString(R.string.accessibility_floating_button_undo));
         mUndoButton.setTextSize(COMPLEX_UNIT_PX, textSize);
-        mUndoButton.setTextColor(colorAccent);
+        mUndoButton.setTextColor(textColor);
+        mUndoButton.setAllCaps(true);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java
index 1f5a0bf..be75e10 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java
@@ -36,7 +36,6 @@
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.internal.accessibility.dialog.AccessibilityTarget;
-import com.android.internal.annotations.VisibleForTesting;
 import com.android.modules.expresslog.Counter;
 import com.android.systemui.Flags;
 import com.android.systemui.util.settings.SecureSettings;
@@ -418,18 +417,11 @@
         onPositionChanged();
     }
 
-    void incrementTexMetricForAllTargets(String metric) {
+    void incrementTexMetric(String metric) {
         if (!Flags.floatingMenuDragToEdit()) {
             return;
         }
-        for (AccessibilityTarget target : mTargetFeatures) {
-            incrementTexMetric(metric, target.getUid());
-        }
-    }
-
-    @VisibleForTesting
-    void incrementTexMetric(String metric, int uid) {
-        Counter.logIncrementWithUid(metric, uid);
+        Counter.logIncrement(metric);
     }
 
     private InstantInsetLayerDrawable getContainerViewInsetLayer() {
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java
index 85bf784..6dce1bb 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java
@@ -17,13 +17,13 @@
 package com.android.systemui.accessibility.floatingmenu;
 
 import static android.view.WindowInsets.Type.ime;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
 
 import static androidx.core.view.WindowInsetsCompat.Type;
 
 import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_BUTTON_COMPONENT_NAME;
 import static com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType.INVISIBLE_TOGGLE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
 import static com.android.internal.accessibility.util.AccessibilityUtils.getAccessibilityServiceFragmentType;
 import static com.android.internal.accessibility.util.AccessibilityUtils.setAccessibilityServiceState;
 import static com.android.systemui.accessibility.floatingmenu.MenuMessageView.Index;
@@ -105,14 +105,14 @@
      *
      * <p>Defined in frameworks/proto_logging/stats/express/catalog/accessibility.cfg.
      */
-    static final String TEX_METRIC_DISMISS = "accessibility.value_fab_shortcut_action_dismiss";
+    static final String TEX_METRIC_DISMISS = "accessibility.value_fab_shortcut_dismiss";
 
     /**
      * Counter indicating the FAB was dragged to the Edit action button.
      *
      * <p>Defined in frameworks/proto_logging/stats/express/catalog/accessibility.cfg.
      */
-    static final String TEX_METRIC_EDIT = "accessibility.value_fab_shortcut_action_edit";
+    static final String TEX_METRIC_EDIT = "accessibility.value_fab_shortcut_edit";
 
     private final WindowManager mWindowManager;
     private final MenuView mMenuView;
@@ -175,8 +175,8 @@
                 mAccessibilityManager.enableShortcutsForTargets(
                         /* enable= */ false,
                         ShortcutConstants.UserShortcutType.SOFTWARE,
-                        new ArraySet<>(mAccessibilityManager.getAccessibilityShortcutTargets(
-                                ACCESSIBILITY_BUTTON)),
+                        new ArraySet<>(
+                                mAccessibilityManager.getAccessibilityShortcutTargets(SOFTWARE)),
                         mSecureSettings.getRealUserHandle(UserHandle.USER_CURRENT)
                 );
             } else {
@@ -185,8 +185,7 @@
                         UserHandle.USER_CURRENT);
 
                 final List<ComponentName> hardwareKeyShortcutComponents =
-                        mAccessibilityManager.getAccessibilityShortcutTargets(
-                                        ACCESSIBILITY_SHORTCUT_KEY)
+                        mAccessibilityManager.getAccessibilityShortcutTargets(HARDWARE)
                                 .stream()
                                 .map(ComponentName::unflattenFromString)
                                 .toList();
@@ -492,11 +491,11 @@
             } else {
                 hideMenuAndShowMessage();
             }
-            mMenuView.incrementTexMetricForAllTargets(TEX_METRIC_DISMISS);
+            mMenuView.incrementTexMetric(TEX_METRIC_DISMISS);
         } else if (id == R.id.action_edit
                 && Flags.floatingMenuDragToEdit()) {
             gotoEditScreen();
-            mMenuView.incrementTexMetricForAllTargets(TEX_METRIC_EDIT);
+            mMenuView.incrementTexMetric(TEX_METRIC_EDIT);
         }
         mDismissView.hide();
         mDragToInteractView.hide();
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java
new file mode 100644
index 0000000..475bb2c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.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.systemui.accessibility.hearingaid;
+
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+import static java.util.Collections.emptyList;
+
+import android.content.Context;
+import android.content.Intent;
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.Settings;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.Visibility;
+import android.widget.Button;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.settingslib.bluetooth.BluetoothCallback;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.systemui.accessibility.hearingaid.HearingDevicesListAdapter.HearingDeviceItemCallback;
+import com.android.systemui.animation.DialogTransitionAnimator;
+import com.android.systemui.bluetooth.qsdialog.ActiveHearingDeviceItemFactory;
+import com.android.systemui.bluetooth.qsdialog.AvailableHearingDeviceItemFactory;
+import com.android.systemui.bluetooth.qsdialog.ConnectedDeviceItemFactory;
+import com.android.systemui.bluetooth.qsdialog.DeviceItem;
+import com.android.systemui.bluetooth.qsdialog.DeviceItemFactory;
+import com.android.systemui.bluetooth.qsdialog.SavedHearingDeviceItemFactory;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.res.R;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
+
+import dagger.assisted.Assisted;
+import dagger.assisted.AssistedFactory;
+import dagger.assisted.AssistedInject;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * Dialog for showing hearing devices controls.
+ */
+public class HearingDevicesDialogDelegate implements SystemUIDialog.Delegate,
+        HearingDeviceItemCallback, BluetoothCallback {
+
+    @VisibleForTesting
+    static final String ACTION_BLUETOOTH_DEVICE_DETAILS =
+            "com.android.settings.BLUETOOTH_DEVICE_DETAIL_SETTINGS";
+    private static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":settings:show_fragment_args";
+    private static final String KEY_BLUETOOTH_ADDRESS = "device_address";
+    private final SystemUIDialog.Factory mSystemUIDialogFactory;
+    private final DialogTransitionAnimator mDialogTransitionAnimator;
+    private final ActivityStarter mActivityStarter;
+    private final boolean mShowPairNewDevice;
+    private final LocalBluetoothManager mLocalBluetoothManager;
+    private final Handler mMainHandler;
+    private final AudioManager mAudioManager;
+
+    private HearingDevicesListAdapter mDeviceListAdapter;
+    private SystemUIDialog mDialog;
+    private RecyclerView mDeviceList;
+    private Button mPairButton;
+    private final List<DeviceItemFactory> mHearingDeviceItemFactoryList = List.of(
+            new ActiveHearingDeviceItemFactory(),
+            new AvailableHearingDeviceItemFactory(),
+            // TODO(b/331305850): setHearingAidInfo() for connected but not connect to profile
+            // hearing device only called from
+            // settings/bluetooth/DeviceListPreferenceFragment#handleLeScanResult, so we don't know
+            // it is connected but not yet connect to profile hearing device in systemui.
+            // Show all connected but not connect to profile bluetooth device for now.
+            new ConnectedDeviceItemFactory(),
+            new SavedHearingDeviceItemFactory()
+    );
+
+    /** Factory to create a {@link HearingDevicesDialogDelegate} dialog instance. */
+    @AssistedFactory
+    public interface Factory {
+        /** Create a {@link HearingDevicesDialogDelegate} instance */
+        HearingDevicesDialogDelegate create(
+                boolean showPairNewDevice);
+    }
+
+    @AssistedInject
+    public HearingDevicesDialogDelegate(
+            @Assisted boolean showPairNewDevice,
+            SystemUIDialog.Factory systemUIDialogFactory,
+            ActivityStarter activityStarter,
+            DialogTransitionAnimator dialogTransitionAnimator,
+            @Nullable LocalBluetoothManager localBluetoothManager,
+            @Main Handler handler,
+            AudioManager audioManager) {
+        mShowPairNewDevice = showPairNewDevice;
+        mSystemUIDialogFactory = systemUIDialogFactory;
+        mActivityStarter = activityStarter;
+        mDialogTransitionAnimator = dialogTransitionAnimator;
+        mLocalBluetoothManager = localBluetoothManager;
+        mMainHandler = handler;
+        mAudioManager = audioManager;
+    }
+
+    @Override
+    public SystemUIDialog createDialog() {
+        SystemUIDialog dialog = mSystemUIDialogFactory.create(this);
+        dismissDialogIfExists();
+        mDialog = dialog;
+
+        return dialog;
+    }
+
+    @Override
+    public void onDeviceItemGearClicked(@NonNull  DeviceItem deviceItem, @NonNull View view) {
+        dismissDialogIfExists();
+        Intent intent = new Intent(ACTION_BLUETOOTH_DEVICE_DETAILS);
+        Bundle bundle = new Bundle();
+        bundle.putString(KEY_BLUETOOTH_ADDRESS, deviceItem.getCachedBluetoothDevice().getAddress());
+        intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, bundle);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+        mActivityStarter.postStartActivityDismissingKeyguard(intent, /* delay= */ 0,
+                mDialogTransitionAnimator.createActivityTransitionController(view));
+    }
+
+    @Override
+    public void onDeviceItemOnClicked(@NonNull  DeviceItem deviceItem, @NonNull View view) {
+        CachedBluetoothDevice cachedBluetoothDevice = deviceItem.getCachedBluetoothDevice();
+        switch (deviceItem.getType()) {
+            case ACTIVE_MEDIA_BLUETOOTH_DEVICE, CONNECTED_BLUETOOTH_DEVICE ->
+                    cachedBluetoothDevice.disconnect();
+            case AVAILABLE_MEDIA_BLUETOOTH_DEVICE -> cachedBluetoothDevice.setActive();
+            case SAVED_BLUETOOTH_DEVICE -> cachedBluetoothDevice.connect();
+        }
+    }
+
+    @Override
+    public void onActiveDeviceChanged(@Nullable CachedBluetoothDevice activeDevice,
+            int bluetoothProfile) {
+        mMainHandler.post(() -> mDeviceListAdapter.refreshDeviceItemList(getHearingDevicesList()));
+    }
+
+    @Override
+    public void onProfileConnectionStateChanged(@NonNull CachedBluetoothDevice cachedDevice,
+            int state, int bluetoothProfile) {
+        mMainHandler.post(() -> mDeviceListAdapter.refreshDeviceItemList(getHearingDevicesList()));
+    }
+
+    @Override
+    public void onAclConnectionStateChanged(@NonNull CachedBluetoothDevice cachedDevice,
+            int state) {
+        mMainHandler.post(() -> mDeviceListAdapter.refreshDeviceItemList(getHearingDevicesList()));
+    }
+
+    @Override
+    public void beforeCreate(@NonNull SystemUIDialog dialog, @Nullable Bundle savedInstanceState) {
+        dialog.setTitle(R.string.quick_settings_hearing_devices_dialog_title);
+        dialog.setView(LayoutInflater.from(dialog.getContext()).inflate(
+                R.layout.hearing_devices_tile_dialog, null));
+        dialog.setPositiveButton(
+                R.string.quick_settings_done,
+                /* onClick = */ null,
+                /* dismissOnClick = */ true
+        );
+    }
+
+    @Override
+    public void onCreate(@NonNull SystemUIDialog dialog, @Nullable Bundle savedInstanceState) {
+        mPairButton = dialog.requireViewById(R.id.pair_new_device_button);
+        mDeviceList = dialog.requireViewById(R.id.device_list);
+
+        setupDeviceListView(dialog);
+        setupPairNewDeviceButton(dialog, mShowPairNewDevice ? VISIBLE : GONE);
+    }
+
+    @Override
+    public void onStart(@NonNull SystemUIDialog dialog) {
+        if (mLocalBluetoothManager == null) {
+            return;
+        }
+        mLocalBluetoothManager.getEventManager().registerCallback(this);
+    }
+
+    @Override
+    public void onStop(@NonNull SystemUIDialog dialog) {
+        if (mLocalBluetoothManager == null) {
+            return;
+        }
+        mLocalBluetoothManager.getEventManager().unregisterCallback(this);
+    }
+
+    private void setupDeviceListView(SystemUIDialog dialog) {
+        mDeviceList.setLayoutManager(new LinearLayoutManager(dialog.getContext()));
+        mDeviceListAdapter = new HearingDevicesListAdapter(getHearingDevicesList(), this);
+        mDeviceList.setAdapter(mDeviceListAdapter);
+    }
+
+    private void setupPairNewDeviceButton(SystemUIDialog dialog, @Visibility int visibility) {
+        if (visibility == VISIBLE) {
+            mPairButton.setOnClickListener(v -> {
+                dismissDialogIfExists();
+                final Intent intent = new Intent(Settings.ACTION_HEARING_DEVICE_PAIRING_SETTINGS);
+                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+                mActivityStarter.postStartActivityDismissingKeyguard(intent, /* delay= */ 0,
+                        mDialogTransitionAnimator.createActivityTransitionController(dialog));
+            });
+        } else {
+            mPairButton.setVisibility(GONE);
+        }
+    }
+
+    private List<DeviceItem> getHearingDevicesList() {
+        if (mLocalBluetoothManager == null
+                || !mLocalBluetoothManager.getBluetoothAdapter().isEnabled()) {
+            return emptyList();
+        }
+
+        return mLocalBluetoothManager.getCachedDeviceManager().getCachedDevicesCopy().stream()
+                .map(this::createHearingDeviceItem)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+    }
+
+    private DeviceItem createHearingDeviceItem(CachedBluetoothDevice cachedDevice) {
+        final Context context = mDialog.getContext();
+        if (cachedDevice == null) {
+            return null;
+        }
+        for (DeviceItemFactory itemFactory : mHearingDeviceItemFactoryList) {
+            if (itemFactory.isFilterMatched(context, cachedDevice, mAudioManager)) {
+                return itemFactory.create(context, cachedDevice);
+            }
+        }
+        return null;
+    }
+
+    private void dismissDialogIfExists() {
+        if (mDialog != null) {
+            mDialog.dismiss();
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManager.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManager.java
new file mode 100644
index 0000000..623b40f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManager.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.systemui.accessibility.hearingaid;
+
+import android.bluetooth.BluetoothDevice;
+import android.util.Log;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import com.android.internal.jank.InteractionJankMonitor;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.systemui.animation.DialogCuj;
+import com.android.systemui.animation.DialogTransitionAnimator;
+import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
+
+import javax.inject.Inject;
+
+/**
+ * Factory to create {@link HearingDevicesDialogDelegate} objects and manage its lifecycle.
+ */
+@SysUISingleton
+public class HearingDevicesDialogManager {
+
+    private static final boolean DEBUG = true;
+    private static final String TAG = "HearingDevicesDialogManager";
+    private static final String INTERACTION_JANK_TAG = "hearing_devices_tile";
+    private SystemUIDialog mDialog;
+    private final DialogTransitionAnimator mDialogTransitionAnimator;
+    private final HearingDevicesDialogDelegate.Factory mDialogFactory;
+    private final LocalBluetoothManager mLocalBluetoothManager;
+
+    @Inject
+    public HearingDevicesDialogManager(
+            DialogTransitionAnimator dialogTransitionAnimator,
+            HearingDevicesDialogDelegate.Factory dialogFactory,
+            @Nullable LocalBluetoothManager localBluetoothManager) {
+        mDialogTransitionAnimator = dialogTransitionAnimator;
+        mDialogFactory = dialogFactory;
+        mLocalBluetoothManager = localBluetoothManager;
+    }
+
+    /**
+     * Shows the dialog.
+     *
+     * @param view The view from which the dialog is shown.
+     */
+    public void showDialog(View view) {
+        if (mDialog != null) {
+            if (DEBUG) {
+                Log.d(TAG, "HearingDevicesDialog already showing. Destroy it first.");
+            }
+            destroyDialog();
+        }
+
+        mDialog = mDialogFactory.create(!isAnyBondedHearingDevice()).createDialog();
+
+        if (view != null) {
+            mDialogTransitionAnimator.showFromView(mDialog, view,
+                    new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
+                            INTERACTION_JANK_TAG), /* animateBackgroundBoundsChange= */ true);
+        } else {
+            mDialog.show();
+        }
+    }
+
+    private void destroyDialog() {
+        mDialog.dismiss();
+        mDialog = null;
+    }
+
+    private boolean isAnyBondedHearingDevice() {
+        if (mLocalBluetoothManager == null) {
+            return false;
+        }
+        if (!mLocalBluetoothManager.getBluetoothAdapter().isEnabled()) {
+            return false;
+        }
+
+        return mLocalBluetoothManager.getCachedDeviceManager().getCachedDevicesCopy().stream()
+                .anyMatch(device -> device.isHearingAidDevice()
+                        && device.getBondState() != BluetoothDevice.BOND_NONE);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogReceiver.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogReceiver.java
new file mode 100644
index 0000000..6a34d19
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogReceiver.java
@@ -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.accessibility.hearingaid;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.systemui.Flags;
+
+import javax.inject.Inject;
+
+/**
+ * BroadcastReceiver for handling hearing devices dialog intent.
+ *
+ * <p> This is not exported. Need to call from framework and use SYSTEM user to send the intent.
+ */
+public class HearingDevicesDialogReceiver extends BroadcastReceiver {
+    public static String ACTION = "com.android.systemui.action.LAUNCH_HEARING_DEVICES_DIALOG";
+
+    private final HearingDevicesDialogManager mDialogManager;
+    @Inject
+    public HearingDevicesDialogReceiver(
+            HearingDevicesDialogManager hearingDevicesDialogManager) {
+        mDialogManager = hearingDevicesDialogManager;
+    }
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (!Flags.hearingAidsQsTileDialog()) {
+            return;
+        }
+
+        if (ACTION.equals(intent.getAction())) {
+            mDialogManager.showDialog(/* view= */ null);
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java
new file mode 100644
index 0000000..737805b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.hearingaid;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.systemui.bluetooth.qsdialog.DeviceItem;
+import com.android.systemui.res.R;
+
+import kotlin.Pair;
+
+import java.util.List;
+
+/**
+ * Adapter for showing hearing device item list {@link DeviceItem}.
+ */
+public class HearingDevicesListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+    private final List<DeviceItem> mItemList;
+    private final HearingDeviceItemCallback mCallback;
+
+    public HearingDevicesListAdapter(List<DeviceItem> itemList,
+            HearingDeviceItemCallback callback) {
+        mItemList = itemList;
+        mCallback = callback;
+    }
+
+    @NonNull
+    @Override
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
+        View view = LayoutInflater.from(viewGroup.getContext()).inflate(
+                R.layout.bluetooth_device_item, viewGroup, false);
+        return new DeviceItemViewHolder(view, viewGroup.getContext());
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
+        DeviceItem item = mItemList.get(position);
+        ((DeviceItemViewHolder) viewHolder).bindView(item, mCallback);
+    }
+
+    @Override
+    public int getItemCount() {
+        return mItemList.size();
+    }
+
+    /**
+     * Updates items in the adapter.
+     *
+     * @param itemList bluetooth device item list
+     */
+    public void refreshDeviceItemList(List<DeviceItem> itemList) {
+        mItemList.clear();
+        mItemList.addAll(itemList);
+        notifyDataSetChanged();
+    }
+
+    /**
+     * Interface to provide callbacks when click on the device item in hearing device quick
+     * settings tile.
+     */
+    public interface HearingDeviceItemCallback {
+        /**
+         * Called when gear view in device item is clicked.
+         *
+         * @param deviceItem bluetooth device item
+         * @param view       the view that was clicked
+         */
+        void onDeviceItemGearClicked(@NonNull DeviceItem deviceItem, @NonNull View view);
+
+        /**
+         * Called when device item is clicked.
+         *
+         * @param deviceItem bluetooth device item
+         * @param view       the view that was clicked
+         */
+        void onDeviceItemOnClicked(@NonNull DeviceItem deviceItem, @NonNull View view);
+    }
+
+    private static class DeviceItemViewHolder extends RecyclerView.ViewHolder {
+        private final Context mContext;
+        private final View mContainer;
+        private final TextView mNameView;
+        private final TextView mSummaryView;
+        private final ImageView mIconView;
+        private final View mGearView;
+
+        DeviceItemViewHolder(@NonNull View itemView, Context context) {
+            super(itemView);
+            mContext = context;
+            mContainer = itemView.requireViewById(R.id.bluetooth_device_row);
+            mNameView = itemView.requireViewById(R.id.bluetooth_device_name);
+            mSummaryView = itemView.requireViewById(R.id.bluetooth_device_summary);
+            mIconView = itemView.requireViewById(R.id.bluetooth_device_icon);
+            mGearView = itemView.requireViewById(R.id.gear_icon);
+        }
+
+        public void bindView(DeviceItem item, HearingDeviceItemCallback callback) {
+            mContainer.setEnabled(item.isEnabled());
+            mContainer.setOnClickListener(view -> callback.onDeviceItemOnClicked(item, view));
+            Integer backgroundResId = item.getBackground();
+            if (backgroundResId != null) {
+                mContainer.setBackground(mContext.getDrawable(item.getBackground()));
+            }
+            mNameView.setText(item.getDeviceName());
+            mSummaryView.setText(item.getConnectionSummary());
+            Pair<Drawable, String> iconPair = item.getIconWithDescription();
+            if (iconPair != null) {
+                mIconView.setImageDrawable(iconPair.getFirst());
+                mIconView.setContentDescription(iconPair.getSecond());
+            }
+            mGearView.setOnClickListener(view -> callback.onDeviceItemGearClicked(item, view));
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/qs/QSAccessibilityModule.kt b/packages/SystemUI/src/com/android/systemui/accessibility/qs/QSAccessibilityModule.kt
index 4047623..7cb028a 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/qs/QSAccessibilityModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/qs/QSAccessibilityModule.kt
@@ -23,6 +23,7 @@
 import com.android.systemui.qs.tiles.ColorInversionTile
 import com.android.systemui.qs.tiles.DreamTile
 import com.android.systemui.qs.tiles.FontScalingTile
+import com.android.systemui.qs.tiles.HearingDevicesTile
 import com.android.systemui.qs.tiles.NightDisplayTile
 import com.android.systemui.qs.tiles.OneHandedModeTile
 import com.android.systemui.qs.tiles.ReduceBrightColorsTile
@@ -94,6 +95,12 @@
     @StringKey(FontScalingTile.TILE_SPEC)
     fun bindFontScalingTile(fontScalingTile: FontScalingTile): QSTileImpl<*>
 
+    /** Inject HearingDevicesTile into tileMap in QSModule */
+    @Binds
+    @IntoMap
+    @StringKey(HearingDevicesTile.TILE_SPEC)
+    fun bindHearingDevicesTile(hearingDevicesTile: HearingDevicesTile): QSTileImpl<*>
+
     companion object {
         const val COLOR_CORRECTION_TILE_SPEC = "color_correction"
         const val COLOR_INVERSION_TILE_SPEC = "inversion"
diff --git a/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt b/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt
index 8ca083f..5df7fc9 100644
--- a/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt
@@ -243,12 +243,6 @@
         }
 
         // Authentication failed.
-
-        if (tryAutoConfirm) {
-            // Auto-confirm is active, the failed attempt should have no side-effects.
-            return AuthenticationResult.FAILED
-        }
-
         repository.reportAuthenticationAttempt(isSuccessful = false)
 
         if (authenticationResult.lockoutDurationMs > 0) {
diff --git a/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt b/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
index 6721c5d..a667de2 100644
--- a/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
@@ -27,10 +27,15 @@
 import android.os.ParcelFileDescriptor
 import android.os.UserHandle
 import android.util.Log
+import com.android.app.tracing.traceSection
+import com.android.systemui.Flags.communalHub
+import com.android.systemui.backup.BackupHelper.Companion.ACTION_RESTORE_FINISHED
+import com.android.systemui.communal.domain.backup.CommunalPrefsBackupHelper
 import com.android.systemui.controls.controller.AuxiliaryPersistenceWrapper
 import com.android.systemui.controls.controller.ControlsFavoritePersistenceWrapper
 import com.android.systemui.keyguard.domain.backup.KeyguardQuickAffordanceBackupHelper
 import com.android.systemui.people.widget.PeopleBackupHelper
+import com.android.systemui.res.R
 import com.android.systemui.settings.UserFileManagerImpl
 
 /**
@@ -52,6 +57,8 @@
         private const val PEOPLE_TILES_BACKUP_KEY = "systemui.people.shared_preferences"
         private const val KEYGUARD_QUICK_AFFORDANCES_BACKUP_KEY =
             "systemui.keyguard.quickaffordance.shared_preferences"
+        private const val COMMUNAL_PREFS_BACKUP_KEY =
+            "systemui.communal.shared_preferences"
         val controlsDataLock = Any()
         const val ACTION_RESTORE_FINISHED = "com.android.systemui.backup.RESTORE_FINISHED"
         const val PERMISSION_SELF = "com.android.systemui.permission.SELF"
@@ -74,6 +81,15 @@
                 userId = userHandle.identifier,
             ),
         )
+        if (communalEnabled()) {
+            addHelper(
+                COMMUNAL_PREFS_BACKUP_KEY,
+                CommunalPrefsBackupHelper(
+                    context = this,
+                    userId = userHandle.identifier,
+                )
+            )
+        }
     }
 
     override fun onRestoreFinished() {
@@ -99,6 +115,10 @@
         }
     }
 
+    private fun communalEnabled(): Boolean {
+        return resources.getBoolean(R.bool.config_communalServiceEnabled) && communalHub()
+    }
+
     /**
      * Helper class for restoring files ONLY if they are not present.
      *
@@ -119,14 +139,22 @@
     ) : FileBackupHelper(context, *fileNamesAndPostProcess.keys.toTypedArray()) {
 
         override fun restoreEntity(data: BackupDataInputStream) {
+            Log.d(TAG, "Starting restore for ${data.key} for user ${context.userId}")
             val file = Environment.buildPath(context.filesDir, data.key)
             if (file.exists()) {
                 Log.w(TAG, "File " + data.key + " already exists. Skipping restore.")
                 return
             }
             synchronized(lock) {
-                super.restoreEntity(data)
-                fileNamesAndPostProcess.get(data.key)?.invoke()
+                traceSection("File restore: ${data.key}") {
+                    super.restoreEntity(data)
+                }
+                Log.d(TAG, "Finishing restore for ${data.key} for user ${context.userId}. " +
+                        "Starting postProcess.")
+                traceSection("Postprocess: ${data.key}") {
+                    fileNamesAndPostProcess.get(data.key)?.invoke()
+                }
+                Log.d(TAG, "Finishing postprocess for ${data.key} for user ${context.userId}.")
             }
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
index 01c2cc4..5c53234 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
@@ -27,6 +27,7 @@
 import android.annotation.IntDef;
 import android.annotation.IntRange;
 import android.annotation.Nullable;
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -52,6 +53,7 @@
 import com.android.systemui.battery.unified.BatteryColors;
 import com.android.systemui.battery.unified.BatteryDrawableState;
 import com.android.systemui.battery.unified.BatteryLayersDrawable;
+import com.android.systemui.battery.unified.ColorProfile;
 import com.android.systemui.plugins.DarkIconDispatcher;
 import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
 import com.android.systemui.res.R;
@@ -252,7 +254,7 @@
                     new BatteryDrawableState(
                             level,
                             mUnifiedBatteryState.getShowPercent(),
-                            level <= 20,
+                            getCurrentColorProfile(),
                             attr
                     );
 
@@ -261,6 +263,7 @@
     }
 
     // Potentially reloads any attribution. Should not be called if the state hasn't changed
+    @SuppressLint("UseCompatLoadingForDrawables")
     private Drawable getBatteryAttribution(boolean isCharging) {
         if (!newStatusBarIcons()) return null;
 
@@ -281,6 +284,30 @@
         return attr;
     }
 
+    /** Calculate the appropriate color for the current state */
+    private ColorProfile getCurrentColorProfile() {
+        return getColorProfile(
+                mPowerSaveEnabled,
+                mIsBatteryDefender && mDisplayShieldEnabled,
+                mPluggedIn,
+                mLevel <= 20);
+    }
+
+    /** pure function to compute the correct color profile for our battery icon */
+    private ColorProfile getColorProfile(
+            boolean isPowerSave,
+            boolean isBatteryDefender,
+            boolean isCharging,
+            boolean isLowBattery
+    ) {
+        if (isCharging)  return ColorProfile.Active;
+        if (isPowerSave) return ColorProfile.Warning;
+        if (isBatteryDefender) return ColorProfile.None;
+        if (isLowBattery) return ColorProfile.Error;
+
+        return ColorProfile.None;
+    }
+
     void onPowerSaveChanged(boolean isPowerSave) {
         if (isPowerSave == mPowerSaveEnabled) {
             return;
@@ -293,7 +320,7 @@
                     new BatteryDrawableState(
                             mUnifiedBatteryState.getLevel(),
                             mUnifiedBatteryState.getShowPercent(),
-                            mUnifiedBatteryState.getShowErrorState(),
+                            getCurrentColorProfile(),
                             getBatteryAttribution(isCharging())
                     )
             );
@@ -318,7 +345,7 @@
                     new BatteryDrawableState(
                             mUnifiedBatteryState.getLevel(),
                             mUnifiedBatteryState.getShowPercent(),
-                            mUnifiedBatteryState.getShowErrorState(),
+                            getCurrentColorProfile(),
                             getBatteryAttribution(isCharging())
                     )
             );
@@ -334,7 +361,7 @@
                         new BatteryDrawableState(
                                 mUnifiedBatteryState.getLevel(),
                                 mUnifiedBatteryState.getShowPercent(),
-                                mUnifiedBatteryState.getShowErrorState(),
+                                getCurrentColorProfile(),
                                 getBatteryAttribution(isCharging())
                         )
                 );
@@ -522,7 +549,7 @@
                 new BatteryDrawableState(
                         mUnifiedBatteryState.getLevel(),
                         shouldShow,
-                        mUnifiedBatteryState.getShowErrorState(),
+                        mUnifiedBatteryState.getColor(),
                         mUnifiedBatteryState.getAttribution()
                 )
         );
@@ -755,6 +782,9 @@
         pw.println("    mPluggedIn: " + mPluggedIn);
         pw.println("    mLevel: " + mLevel);
         pw.println("    mMode: " + mShowPercentMode);
+        if (newStatusBarIcons()) {
+            pw.println("    mUnifiedBatteryState: " + mUnifiedBatteryState);
+        }
     }
 
     @VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryDrawableState.kt b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryDrawableState.kt
index 9f13e6d..9f594fe 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryDrawableState.kt
+++ b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryDrawableState.kt
@@ -20,6 +20,21 @@
 import android.graphics.drawable.Drawable
 
 /**
+ * States that might set a color profile (e.g., red for low battery) and are mutually exclusive.
+ * This enum allows us to address which colors we want to use based on their function.
+ */
+enum class ColorProfile {
+    // Grayscale is the default color
+    None,
+    // Green for e.g., charging
+    Active,
+    // Yellow for e.g., battery saver
+    Warning,
+    // Red for e.g., low battery
+    Error,
+}
+
+/**
  * Encapsulates all drawing information needed by BatteryMeterDrawable to render properly. Rendered
  * state will be equivalent to the most recent state passed in.
  */
@@ -28,12 +43,9 @@
     val level: Int,
     /** Whether or not to render the percent as a foreground text layer */
     val showPercent: Boolean,
-    /**
-     * In an error state, the drawable will use the error colors and removes the third layer. If
-     * [showPercent] is false, then the fill will be rendered in the foreground error color. Else
-     * the fill is not rendered.
-     */
-    val showErrorState: Boolean,
+
+    /** Set the [ColorProfile] to get the appropriate fill colors */
+    val color: ColorProfile = ColorProfile.None,
 
     /**
      * An attribution is a drawable that shows either alongside the percent, or centered in the
@@ -59,7 +71,6 @@
             BatteryDrawableState(
                 level = 50,
                 showPercent = false,
-                showErrorState = false,
                 attribution = null,
             )
     }
@@ -82,12 +93,14 @@
      */
     val fillOnly: Int
 
-    /** Error colors are used for low battery states typically */
-    val errorForeground: Int
-    val errorBackground: Int
+    /** Used when charging */
+    val activeFill: Int
 
-    /** Currently unused */
-    val warnBackground: Int
+    /** Warning color is used for battery saver mode */
+    val warnFill: Int
+
+    /** Error colors are used for low battery states typically */
+    val errorFill: Int
 
     /** Color scheme appropriate for light mode (dark icons) */
     data object LightThemeColors : BatteryColors {
@@ -95,18 +108,17 @@
         // 22% alpha white
         override val bg: Int = Color.valueOf(1f, 1f, 1f, 0.22f).toArgb()
 
-        // 18% alpha black
-        override val fill = Color.valueOf(0f, 0f, 0f, 0.18f).toArgb()
-        // GM Gray 700
-        override val fillOnly = Color.parseColor("#5F6368")
+        // GM Gray 500
+        override val fill = Color.parseColor("#9AA0A6")
+        // GM Gray 600
+        override val fillOnly = Color.parseColor("#80868B")
 
-        // GM Red 600
-        override val errorForeground = Color.parseColor("#D93025")
-        // GM Red 100
-        override val errorBackground = Color.parseColor("#FAD2CF")
-
+        // GM Green 500
+        override val activeFill = Color.parseColor("#34A853")
         // GM Yellow 500
-        override val warnBackground = Color.parseColor("#FBBC04")
+        override val warnFill = Color.parseColor("#FBBC04")
+        // GM Red 500
+        override val errorFill = Color.parseColor("#EA4335")
     }
 
     /** Color scheme appropriate for dark mode (light icons) */
@@ -115,17 +127,17 @@
         // 18% alpha black
         override val bg: Int = Color.valueOf(0f, 0f, 0f, 0.18f).toArgb()
 
-        // 22% alpha white
-        override val fill = Color.valueOf(1f, 1f, 1f, 0.22f).toArgb()
+        // GM Gray 700
+        override val fill = Color.parseColor("#5F6368")
         // GM Gray 400
         override val fillOnly = Color.parseColor("#BDC1C6")
 
-        // GM Red 600
-        override val errorForeground = Color.parseColor("#D93025")
-        // GM Red 200
-        override val errorBackground = Color.parseColor("#F6AEA9")
-        // GM Yellow
-        override val warnBackground = Color.parseColor("#FBBC04")
+        // GM Green 700
+        override val activeFill = Color.parseColor("#188038")
+        // GM Yellow 700
+        override val warnFill = Color.parseColor("#F29900")
+        // GM Red 700
+        override val errorFill = Color.parseColor("#C5221F")
     }
 
     companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryFillDrawable.kt b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryFillDrawable.kt
index 5e34d29..63ff6cb 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryFillDrawable.kt
+++ b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryFillDrawable.kt
@@ -34,7 +34,7 @@
 /**
  * Draws a right-to-left fill inside of the given [framePath]. This fill is designed to exactly fill
  * the usable space inside of [framePath], given that the stroke width of the path is 1.5, and we
- * want an extra 0.25 (canvas units) of a gap between the fill and the stroke
+ * want an extra 0.5 (canvas units) of a gap between the fill and the stroke
  */
 class BatteryFillDrawable(private val framePath: Path) : Drawable() {
     private var hScale = 1f
@@ -44,6 +44,29 @@
     private var scaledLeftOffset = 0f
     private var scaledRightInset = 0f
 
+    /** Scale this to the viewport so we fill correctly! */
+    private val fillRectNotScaled = RectF()
+    private var leftInsetNotScaled = 0f
+    private var rightInsetNotScaled = 0f
+
+    /**
+     * Configure how much space between the battery frame (drawn at 1.5dp stroke width) and the
+     * inner fill. This is accomplished by tracing the exact same path as the frame, but using
+     * [BlendMode.CLEAR] as the blend mode.
+     *
+     * This value also affects the overall width of the fill, so it requires us to re-draw
+     * everything
+     */
+    var fillInsetAmount = -1f
+        set(value) {
+            if (field != value) {
+                field = value
+                updateInsets()
+                updateScale()
+                invalidateSelf()
+            }
+        }
+
     // Drawable.level cannot be overloaded
     var batteryLevel = 0
         set(value) {
@@ -61,7 +84,6 @@
     private val clearPaint =
         Paint(Paint.ANTI_ALIAS_FLAG).also { p ->
             p.style = Paint.Style.STROKE
-            p.strokeWidth = 5f
             p.blendMode = BlendMode.CLEAR
         }
 
@@ -88,12 +110,32 @@
         updateScale()
     }
 
+    /**
+     * To support dynamic insets, we have to keep mutable references to the left/right unscaled
+     * insets, as well as the fill rect.
+     */
+    private fun updateInsets() {
+        leftInsetNotScaled = LeftFillOffsetExcludingPadding + fillInsetAmount
+        rightInsetNotScaled = RightFillInsetExcludingPadding + fillInsetAmount
+
+        fillRectNotScaled.set(
+            leftInsetNotScaled,
+            0f,
+            Metrics.ViewportWidth - rightInsetNotScaled,
+            Metrics.ViewportHeight
+        )
+    }
+
     private fun updateScale() {
         framePath.transform(/* matrix = */ scaleMatrix, /* dst = */ scaledPath)
-        scaleMatrix.mapRect(/* dst = */ scaledFillRect, /* src = */ FillRect)
+        scaleMatrix.mapRect(/* dst = */ scaledFillRect, /* src = */ fillRectNotScaled)
 
-        scaledLeftOffset = LeftFillOffset * hScale
-        scaledRightInset = RightFillInset * hScale
+        scaledLeftOffset = leftInsetNotScaled * hScale
+        scaledRightInset = rightInsetNotScaled * hScale
+
+        // stroke width = 1.5 (same as the outer frame) + 2x fillInsetAmount, since N px of padding
+        // requires the entire stroke to be 2N px wider
+        clearPaint.strokeWidth = (1.5f + 2 * fillInsetAmount) * hScale
     }
 
     override fun draw(canvas: Canvas) {
@@ -155,23 +197,13 @@
     override fun setAlpha(alpha: Int) {}
 
     companion object {
-        // 3.75f =
+        // 3.5f =
         //       2.75 (left-most edge of the frame path)
         //     + 0.75 (1/2 of the stroke width)
-        //     + 0.25 (padding between stroke and fill edge)
-        private const val LeftFillOffset = 3.75f
+        private const val LeftFillOffsetExcludingPadding = 3.5f
 
-        // 1.75, calculated the same way, but from the right edge (without the battery cap), which
+        // 1.5, calculated the same way, but from the right edge (without the battery cap), which
         // consumes 2 units of width.
-        private const val RightFillInset = 1.75f
-
-        /** Scale this to the viewport so we fill correctly! */
-        private val FillRect =
-            RectF(
-                LeftFillOffset,
-                0f,
-                Metrics.ViewportWidth - RightFillInset,
-                Metrics.ViewportHeight
-            )
+        private const val RightFillInsetExcludingPadding = 1.5f
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryLayersDrawable.kt b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryLayersDrawable.kt
index 706b9ec..a179c35 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryLayersDrawable.kt
+++ b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryLayersDrawable.kt
@@ -56,9 +56,6 @@
  *          - The internal space is divided into 12x10 and 6x6 rectangles
  *          - The attribution is aligned left
  *          - The percent text is scaled based on the number of characters (1,2, or 3) in the string
- *
- * When [BatteryDrawableState.showErrorState] is true, we will only show either the percent text OR
- * the battery fill, in order to maximize contrast when using the error colors.
  */
 @Suppress("RtlHardcoded")
 class BatteryLayersDrawable(
@@ -91,7 +88,7 @@
     var colors: BatteryColors = BatteryColors.LightThemeColors
         set(value) {
             field = value
-            updateColors(batteryState.showErrorState, value)
+            updateColorProfile(batteryState.hasForegroundContent(), batteryState.color, value)
         }
 
     init {
@@ -101,53 +98,66 @@
     }
 
     private fun handleUpdateState(old: BatteryDrawableState, new: BatteryDrawableState) {
-        if (new.showErrorState != old.showErrorState) {
-            updateColors(new.showErrorState, colors)
-        }
-
         if (new.level != old.level) {
             fill.batteryLevel = new.level
             textOnly.batteryLevel = new.level
             spaceSharingText.batteryLevel = new.level
         }
 
+        val shouldUpdateColors =
+            new.color != old.color ||
+                new.attribution != attribution.drawable ||
+                new.hasForegroundContent() != old.hasForegroundContent()
+
         if (new.attribution != null && new.attribution != attribution.drawable) {
             attribution.drawable = new.attribution
-            updateColors(new.showErrorState, colors)
         }
 
         if (new.hasForegroundContent() != old.hasForegroundContent()) {
-            setFillColor(new.hasForegroundContent(), new.showErrorState, colors)
+            setFillInsets(new.hasForegroundContent())
+        }
+
+        // Finally, update colors last if any of the above conditions were met, so that everything
+        // is properly tinted
+        if (shouldUpdateColors) {
+            updateColorProfile(new.hasForegroundContent(), new.color, colors)
         }
     }
 
-    /** In error states, we don't draw fill unless there is no foreground content (e.g., percent) */
-    private fun updateColors(showErrorState: Boolean, colorInfo: BatteryColors) {
-        frameBg.setTint(if (showErrorState) colorInfo.errorBackground else colorInfo.bg)
-        frame.setTint(colorInfo.fg)
-        attribution.setTint(if (showErrorState) colorInfo.errorForeground else colorInfo.fg)
-        textOnly.setTint(if (showErrorState) colorInfo.errorForeground else colorInfo.fg)
-        spaceSharingText.setTint(if (showErrorState) colorInfo.errorForeground else colorInfo.fg)
-        setFillColor(batteryState.hasForegroundContent(), showErrorState, colorInfo)
-    }
-
-    /**
-     * If there is a foreground layer, then we draw the fill with the low opacity
-     * [BatteryColors.fill] color. Otherwise, if there is no other foreground layer, we will use
-     * either the error or fillOnly colors for more contrast
-     */
-    private fun setFillColor(
+    private fun updateColorProfile(
         hasFg: Boolean,
-        error: Boolean,
+        color: ColorProfile,
         colorInfo: BatteryColors,
     ) {
-        if (hasFg) {
-            fill.fillColor = colorInfo.fill
-        } else {
-            fill.fillColor = if (error) colorInfo.errorForeground else colorInfo.fillOnly
+        frame.setTint(colorInfo.fg)
+        frameBg.setTint(colorInfo.bg)
+        textOnly.setTint(colorInfo.fg)
+        spaceSharingText.setTint(colorInfo.fg)
+        attribution.setTint(colorInfo.fg)
+
+        when (color) {
+            ColorProfile.None -> {
+                fill.fillColor = if (hasFg) colorInfo.fill else colorInfo.fillOnly
+            }
+            ColorProfile.Active -> {
+                fill.fillColor = colorInfo.activeFill
+            }
+            ColorProfile.Warning -> {
+                fill.fillColor = colorInfo.warnFill
+            }
+            ColorProfile.Error -> {
+                fill.fillColor = colorInfo.errorFill
+            }
         }
     }
 
+    private fun setFillInsets(
+        hasFg: Boolean,
+    ) {
+        // Extra padding around the fill if there is nothing in the foreground
+        fill.fillInsetAmount = if (hasFg) 0f else 1.5f
+    }
+
     override fun onBoundsChange(bounds: Rect) {
         super.onBoundsChange(bounds)
 
@@ -200,10 +210,9 @@
         // 2. Then the frame itself
         frame.draw(canvas)
 
-        // 3. Fill it the appropriate amount if non-error state or error + no attribute
-        if (!batteryState.showErrorState || !batteryState.hasForegroundContent()) {
-            fill.draw(canvas)
-        }
+        // 3. Fill it the appropriate amount
+        fill.draw(canvas)
+
         // 4. Decide what goes inside
         if (batteryState.showPercent && batteryState.attribution != null) {
             // 4a. percent & attribution. Implies space-sharing
@@ -309,6 +318,7 @@
          *
          * See [BatteryDrawableState] for how to set the properties of the resulting class
          */
+        @Suppress("UseCompatLoadingForDrawables")
         fun newBatteryDrawable(
             context: Context,
             initialState: BatteryDrawableState = BatteryDrawableState.DefaultInitialState,
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
index 99cdc01..fd0e7fc 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
@@ -218,6 +218,11 @@
         }
 
         @Override
+        public void onContentViewMoreOptionsButtonPressed() {
+            animateAway(AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS);
+        }
+
+        @Override
         public void onError() {
             animateAway(AuthDialogCallback.DISMISSED_ERROR);
         }
@@ -513,7 +518,8 @@
                 mConfig.mOpPackageName);
         final CredentialViewModel vm = mCredentialViewModelProvider.get();
         vm.setAnimateContents(animateContents);
-        ((CredentialView) mCredentialView).init(vm, this, mPanelController, animatePanel);
+        ((CredentialView) mCredentialView).init(vm, this, mPanelController, animatePanel,
+                mBiometricCallback);
 
         mLayout.addView(mCredentialView);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index a40b4d7..d85b81d 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -205,12 +205,12 @@
             if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
                 String reason = intent.getStringExtra("reason");
                 reason = (reason != null) ? reason : "unknown";
-                closeDioalog(reason);
+                closeDialog(reason);
             }
         }
     };
 
-    private void closeDioalog(String reason) {
+    private void closeDialog(String reason) {
         if (isShowing()) {
             Log.i(TAG, "Close BP, reason :" + reason);
             mCurrentDialog.dismissWithoutCallback(true /* animate */);
@@ -571,6 +571,11 @@
                         credentialAttestation);
                 break;
 
+            case AuthDialogCallback.DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS:
+                sendResultAndCleanUp(
+                        BiometricPrompt.DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS,
+                        credentialAttestation);
+                break;
             default:
                 Log.e(TAG, "Unhandled reason: " + reason);
                 break;
@@ -579,7 +584,7 @@
 
     @Override
     public void handleShowGlobalActionsMenu() {
-        closeDioalog("PowerMenu shown");
+        closeDialog("PowerMenu shown");
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogCallback.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogCallback.java
index 9a21940..024c6ea 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogCallback.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogCallback.java
@@ -32,6 +32,7 @@
     int DISMISSED_ERROR = 5;
     int DISMISSED_BY_SYSTEM_SERVER = 6;
     int DISMISSED_CREDENTIAL_AUTHENTICATED = 7;
+    int DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS = 8;
 
     @IntDef({DISMISSED_USER_CANCELED,
             DISMISSED_BUTTON_NEGATIVE,
@@ -39,7 +40,8 @@
             DISMISSED_BIOMETRIC_AUTHENTICATED,
             DISMISSED_ERROR,
             DISMISSED_BY_SYSTEM_SERVER,
-            DISMISSED_CREDENTIAL_AUTHENTICATED})
+            DISMISSED_CREDENTIAL_AUTHENTICATED,
+            DISMISSED_BUTTON_CONTENT_VIEW_MORE_OPTIONS})
     @interface DismissedReason {}
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 2c3ebe9..b25c3da 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -400,14 +400,22 @@
         if (!mOverlayParams.equals(overlayParams)) {
             mOverlayParams = overlayParams;
 
-            final boolean wasShowingAlternateBouncer = mAlternateBouncerInteractor.isVisibleState();
-
-            // When the bounds change it's always necessary to re-create the overlay's window with
-            // new LayoutParams. If the overlay needs to be shown, this will re-create and show the
-            // overlay with the updated LayoutParams. Otherwise, the overlay will remain hidden.
-            redrawOverlay();
-            if (wasShowingAlternateBouncer) {
-                mKeyguardViewManager.showBouncer(true);
+            if (DeviceEntryUdfpsRefactor.isEnabled()) {
+                if (mOverlay != null && mOverlay.getRequestReason() == REASON_AUTH_KEYGUARD) {
+                    mOverlay.updateOverlayParams(mOverlayParams);
+                } else {
+                    redrawOverlay();
+                }
+            } else {
+                final boolean wasShowingAlternateBouncer =
+                        mAlternateBouncerInteractor.isVisibleState();
+                // When the bounds change it's always to re-create the overlay's window with new
+                // LayoutParams. If the overlay needs to be shown, this will re-create and show the
+                // overlay with the updated LayoutParams. Otherwise, the overlay will remain hidden.
+                redrawOverlay();
+                if (wasShowingAlternateBouncer) {
+                    mKeyguardViewManager.showBouncer(true);
+                }
             }
         }
     }
@@ -850,7 +858,6 @@
 
         mOverlay = null;
         mOrientationListener.disable();
-
     }
 
     private void unconfigureDisplay(View view) {
@@ -859,7 +866,7 @@
         }
         if (DeviceEntryUdfpsRefactor.isEnabled()) {
             if (mUdfpsDisplayMode != null) {
-                mUdfpsDisplayMode.disable(null); // beverlt
+                mUdfpsDisplayMode.disable(null);
             }
         } else {
             if (view != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
index 16865ca..3a45db1 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
@@ -318,6 +318,15 @@
         addViewRunnable = null
     }
 
+    fun updateOverlayParams(updatedOverlayParams: UdfpsOverlayParams) {
+        DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode()
+        overlayParams = updatedOverlayParams
+        sensorBounds = updatedOverlayParams.sensorBounds
+        getTouchOverlay()?.let {
+            windowManager.updateViewLayout(it, coreLayoutParams.updateDimensions(null))
+        }
+    }
+
     fun inflateUdfpsAnimation(
         view: UdfpsView,
         controller: UdfpsController
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt b/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt
index 307b985..20e81c2 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt
@@ -39,6 +39,7 @@
 import com.android.systemui.biometrics.udfps.OverlapDetector
 import com.android.systemui.biometrics.ui.binder.SideFpsOverlayViewBinder
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.ui.binder.AlternateBouncerViewBinder
 import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
 import com.android.systemui.util.concurrency.ThreadFactory
 import dagger.Binds
@@ -70,6 +71,11 @@
     fun bindsSideFpsOverlayViewBinder(viewBinder: SideFpsOverlayViewBinder): CoreStartable
 
     @Binds
+    @IntoMap
+    @ClassKey(AlternateBouncerViewBinder::class)
+    fun bindAlternateBouncerViewBinder(viewBinder: AlternateBouncerViewBinder): CoreStartable
+
+    @Binds
     @SysUISingleton
     fun faceSettings(impl: FaceSettingsRepositoryImpl): FaceSettingsRepository
 
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/PromptRepository.kt b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/PromptRepository.kt
index 4d88f49..9ad3f43 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/PromptRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/PromptRepository.kt
@@ -155,7 +155,8 @@
                 constraintBp() &&
                 !Utils.isBiometricAllowed(promptInfo) &&
                 isDeviceCredentialAllowed(promptInfo) &&
-                promptInfo.contentView != null
+                promptInfo.contentView != null &&
+                !promptInfo.isContentViewMoreOptionsButtonUsed
         _showBpWithoutIconForCredential.value = showBpForCredential && !hasCredentialViewShown
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractor.kt
index 7d67219..591da40 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractor.kt
@@ -18,7 +18,6 @@
 
 import android.content.Context
 import android.content.res.Configuration
-import android.view.Display
 import com.android.systemui.biometrics.data.repository.DisplayStateRepository
 import com.android.systemui.biometrics.shared.model.DisplayRotation
 import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
@@ -28,7 +27,6 @@
 import com.android.systemui.display.data.repository.DisplayRepository
 import com.android.systemui.unfold.compat.ScreenSizeFoldProvider
 import com.android.systemui.unfold.updates.FoldProvider
-import com.android.systemui.util.kotlin.sample
 import java.util.concurrent.Executor
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
@@ -36,8 +34,6 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.filter
-import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.stateIn
 
 /** Aggregates display state information. */
@@ -129,16 +125,7 @@
         screenSizeFoldProvider.onConfigurationChange(newConfig)
     }
 
-    private val defaultDisplay =
-        displayRepository.displays.map { displays ->
-            displays.firstOrNull { it.displayId == Display.DEFAULT_DISPLAY }
-        }
-
-    override val isDefaultDisplayOff =
-        displayRepository.displayChangeEvent
-            .filter { it == Display.DEFAULT_DISPLAY }
-            .sample(defaultDisplay)
-            .map { it?.state == Display.STATE_OFF }
+    override val isDefaultDisplayOff = displayRepository.defaultDisplayOff
 
     override val isLargeScreen: Flow<Boolean> = displayStateRepository.isLargeScreen
 
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt
index 5ae2ff0..3112b67 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractor.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.biometrics.domain.interactor
 
 import android.content.Context
+import android.graphics.Rect
 import android.hardware.biometrics.SensorLocationInternal
 import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository
 import com.android.systemui.biometrics.shared.model.SensorLocation
@@ -43,6 +44,7 @@
     repository: FingerprintPropertyRepository,
     configurationInteractor: ConfigurationInteractor,
     displayStateInteractor: DisplayStateInteractor,
+    udfpsOverlayInteractor: UdfpsOverlayInteractor,
 ) {
     val propertiesInitialized: StateFlow<Boolean> = repository.propertiesInitialized
     val isUdfps: StateFlow<Boolean> =
@@ -103,4 +105,13 @@
             sensorLocation.scale = scale
             sensorLocation
         }
+
+    /**
+     * Sensor location for the:
+     * - current physical display
+     * - current screen resolution
+     * - device's current orientation
+     */
+    val udfpsSensorBounds: Flow<Rect> =
+        udfpsOverlayInteractor.udfpsOverlayParams.map { it.sensorBounds }.distinctUntilChanged()
 }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractor.kt
index 94cea57..b7c0fa8 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractor.kt
@@ -30,11 +30,11 @@
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.lastOrNull
+import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.withContext
 
@@ -61,11 +61,12 @@
     val isShowing: Flow<Boolean> = biometricPromptRepository.isShowing
 
     /**
-     * If biometric prompt without icon needs to show for displaying content prior to credential
-     * view.
+     * If vertical list content view is shown, credential view should hide subtitle and content view
      */
-    val showBpWithoutIconForCredential: StateFlow<Boolean> =
-        biometricPromptRepository.showBpWithoutIconForCredential
+    val showTitleOnly: Flow<Boolean> =
+        biometricPromptRepository.promptInfo.map { promptInfo ->
+            promptInfo?.contentView != null && !promptInfo.isContentViewMoreOptionsButtonUsed
+        }
 
     /** Metadata about the current credential prompt, including app-supplied preferences. */
     val prompt: Flow<BiometricPromptRequest.Credential?> =
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt
index 2f493ac..b28733f 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt
@@ -10,10 +10,11 @@
 import android.view.accessibility.AccessibilityManager
 import android.widget.LinearLayout
 import android.widget.TextView
-import com.android.systemui.res.R
 import com.android.systemui.biometrics.AuthPanelController
 import com.android.systemui.biometrics.ui.binder.CredentialViewBinder
+import com.android.systemui.biometrics.ui.binder.Spaghetti
 import com.android.systemui.biometrics.ui.viewmodel.CredentialViewModel
+import com.android.systemui.res.R
 
 /** PIN or password credential view for BiometricPrompt. */
 class CredentialPasswordView(context: Context, attrs: AttributeSet?) :
@@ -31,8 +32,16 @@
         host: CredentialView.Host,
         panelViewController: AuthPanelController,
         animatePanel: Boolean,
+        legacyCallback: Spaghetti.Callback,
     ) {
-        CredentialViewBinder.bind(this, host, viewModel, panelViewController, animatePanel)
+        CredentialViewBinder.bind(
+            this,
+            host,
+            viewModel,
+            panelViewController,
+            animatePanel,
+            legacyCallback
+        )
     }
 
     override fun onFinishInflate() {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPatternView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPatternView.kt
index 1086897..d9d286f 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPatternView.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPatternView.kt
@@ -9,6 +9,7 @@
 import android.widget.LinearLayout
 import com.android.systemui.biometrics.AuthPanelController
 import com.android.systemui.biometrics.ui.binder.CredentialViewBinder
+import com.android.systemui.biometrics.ui.binder.Spaghetti
 import com.android.systemui.biometrics.ui.viewmodel.CredentialViewModel
 
 /** Pattern credential view for BiometricPrompt. */
@@ -21,8 +22,16 @@
         host: CredentialView.Host,
         panelViewController: AuthPanelController,
         animatePanel: Boolean,
+        legacyCallback: Spaghetti.Callback,
     ) {
-        CredentialViewBinder.bind(this, host, viewModel, panelViewController, animatePanel)
+        CredentialViewBinder.bind(
+            this,
+            host,
+            viewModel,
+            panelViewController,
+            animatePanel,
+            legacyCallback
+        )
     }
 
     override fun onFinishInflate() {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialView.kt
index b7c6a45..e2f9895 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialView.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialView.kt
@@ -1,6 +1,7 @@
 package com.android.systemui.biometrics.ui
 
 import com.android.systemui.biometrics.AuthPanelController
+import com.android.systemui.biometrics.ui.binder.Spaghetti
 import com.android.systemui.biometrics.ui.viewmodel.CredentialViewModel
 
 /** A credential variant of BiometricPrompt. */
@@ -27,5 +28,6 @@
         host: Host,
         panelViewController: AuthPanelController,
         animatePanel: Boolean,
+        legacyCallback: Spaghetti.Callback,
     )
 }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt
index e58c8ff..7ccac03 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricCustomizedViewBinder.kt
@@ -18,101 +18,154 @@
 
 import android.content.Context
 import android.content.res.Resources
-import android.content.res.Resources.Theme
-import android.graphics.Paint
 import android.hardware.biometrics.PromptContentItem
 import android.hardware.biometrics.PromptContentItemBulletedText
 import android.hardware.biometrics.PromptContentItemPlainText
 import android.hardware.biometrics.PromptContentView
+import android.hardware.biometrics.PromptContentViewWithMoreOptionsButton
 import android.hardware.biometrics.PromptVerticalListContentView
 import android.text.SpannableString
 import android.text.Spanned
+import android.text.TextPaint
 import android.text.style.BulletSpan
 import android.view.LayoutInflater
 import android.view.View
+import android.view.ViewGroup.LayoutParams.MATCH_PARENT
+import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
+import android.view.ViewTreeObserver
+import android.widget.Button
 import android.widget.LinearLayout
 import android.widget.Space
 import android.widget.TextView
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.repeatOnLifecycle
+import com.android.settingslib.Utils
 import com.android.systemui.biometrics.ui.BiometricPromptLayout
-import com.android.systemui.biometrics.ui.viewmodel.PromptViewModel
 import com.android.systemui.lifecycle.repeatWhenAttached
 import com.android.systemui.res.R
 import kotlin.math.ceil
-import kotlinx.coroutines.flow.first
-import kotlinx.coroutines.launch
+
+private const val TAG = "BiometricCustomizedViewBinder"
 
 /** Sub-binder for [BiometricPromptLayout.customized_view_container]. */
 object BiometricCustomizedViewBinder {
-    fun bind(customizedViewContainer: LinearLayout, spaceAbove: Space, viewModel: PromptViewModel) {
-        customizedViewContainer.repeatWhenAttached {
-            repeatOnLifecycle(Lifecycle.State.CREATED) {
-                launch {
-                    val contentView: PromptContentView? = viewModel.contentView.first()
+    fun bind(
+        customizedViewContainer: LinearLayout,
+        contentView: PromptContentView?,
+        legacyCallback: Spaghetti.Callback
+    ) {
+        customizedViewContainer.repeatWhenAttached { containerView ->
+            if (contentView == null) {
+                containerView.visibility = View.GONE
+                return@repeatWhenAttached
+            }
 
-                    if (contentView != null) {
-                        val context = customizedViewContainer.context
-                        customizedViewContainer.addView(contentView.toView(context))
-                        customizedViewContainer.visibility = View.VISIBLE
-                        spaceAbove.visibility = View.VISIBLE
-                    } else {
-                        customizedViewContainer.visibility = View.GONE
-                        spaceAbove.visibility = View.GONE
-                    }
+            containerView.width { containerWidth ->
+                if (containerWidth == 0) {
+                    return@width
                 }
+                (containerView as LinearLayout).addView(
+                    contentView.toView(containerView.context, containerWidth, legacyCallback),
+                    LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT)
+                )
+                containerView.visibility = View.VISIBLE
             }
         }
     }
 }
 
-private fun PromptContentView.toView(context: Context): View {
-    val resources = context.resources
-    val inflater = LayoutInflater.from(context)
-    when (this) {
-        is PromptVerticalListContentView -> {
-            val contentView =
-                inflater.inflate(R.layout.biometric_prompt_content_layout, null) as LinearLayout
-
-            val descriptionView = contentView.requireViewById<TextView>(R.id.customized_view_title)
-            if (!description.isNullOrEmpty()) {
-                descriptionView.text = description
-            } else {
-                descriptionView.visibility = View.GONE
-            }
-
-            // Show two column by default, once there is an item exceeding max lines, show single
-            // item instead.
-            val showTwoColumn = listItems.all { !it.doesExceedMaxLinesIfTwoColumn(resources) }
-            var currRowView = createNewRowLayout(inflater)
-            for (item in listItems) {
-                val itemView = item.toView(resources, inflater, context.theme)
-                currRowView.addView(itemView)
-
-                if (!showTwoColumn || currRowView.childCount == 2) {
-                    contentView.addView(currRowView)
-                    currRowView = createNewRowLayout(inflater)
-                }
-            }
-            if (currRowView.childCount > 0) {
-                contentView.addView(currRowView)
-            }
-
-            return contentView
-        }
+private fun PromptContentView.toView(
+    context: Context,
+    containerViewWidth: Int,
+    legacyCallback: Spaghetti.Callback
+): View {
+    return when (this) {
+        is PromptVerticalListContentView -> initLayout(context, containerViewWidth)
+        is PromptContentViewWithMoreOptionsButton -> initLayout(context, legacyCallback)
         else -> {
             throw IllegalStateException("No such PromptContentView: $this")
         }
     }
 }
 
+private fun LayoutInflater.inflateContentView(id: Int, description: String?): LinearLayout {
+    val contentView = inflate(id, null) as LinearLayout
+
+    val descriptionView = contentView.requireViewById<TextView>(R.id.customized_view_description)
+    if (!description.isNullOrEmpty()) {
+        descriptionView.text = description
+    } else {
+        descriptionView.visibility = View.GONE
+    }
+    return contentView
+}
+
+private fun PromptContentViewWithMoreOptionsButton.initLayout(
+    context: Context,
+    legacyCallback: Spaghetti.Callback
+): View {
+    val inflater = LayoutInflater.from(context)
+    val contentView =
+        inflater.inflateContentView(
+            R.layout.biometric_prompt_content_with_button_layout,
+            description
+        )
+    val buttonView = contentView.requireViewById<Button>(R.id.customized_view_more_options_button)
+    buttonView.setOnClickListener { legacyCallback.onContentViewMoreOptionsButtonPressed() }
+    return contentView
+}
+
+private fun PromptVerticalListContentView.initLayout(
+    context: Context,
+    containerViewWidth: Int
+): View {
+    val inflater = LayoutInflater.from(context)
+    context.resources
+    val contentView =
+        inflater.inflateContentView(
+            R.layout.biometric_prompt_vertical_list_content_layout,
+            description
+        )
+    val listItemsToShow = ArrayList<PromptContentItem>(listItems)
+    // Show two column by default, once there is an item exceeding max lines, show single
+    // item instead.
+    val showTwoColumn =
+        listItemsToShow.all { !it.doesExceedMaxLinesIfTwoColumn(context, containerViewWidth) }
+    // If should show two columns and there are more than one items, make listItems always have odd
+    // number items.
+    if (showTwoColumn && listItemsToShow.size > 1 && listItemsToShow.size % 2 == 1) {
+        listItemsToShow.add(dummyItem())
+    }
+    var currRow = createNewRowLayout(inflater)
+    for (i in 0 until listItemsToShow.size) {
+        val item = listItemsToShow[i]
+        val itemView = item.toView(context, inflater)
+        contentView.removeTopPaddingForFirstRow(description, itemView)
+
+        // If there should be two column, and there is already one item in the current row, add
+        // space between two items.
+        if (showTwoColumn && currRow.childCount == 1) {
+            currRow.addSpaceViewBetweenListItem()
+        }
+        currRow.addView(itemView)
+
+        // If there should be one column, or there are already two items (plus the space view) in
+        // the current row, or it's already the last item, start a new row
+        if (!showTwoColumn || currRow.childCount == 3 || i == listItemsToShow.size - 1) {
+            contentView.addView(currRow)
+            currRow = createNewRowLayout(inflater)
+        }
+    }
+    return contentView
+}
+
 private fun createNewRowLayout(inflater: LayoutInflater): LinearLayout {
     return inflater.inflate(R.layout.biometric_prompt_content_row_layout, null) as LinearLayout
 }
 
 private fun PromptContentItem.doesExceedMaxLinesIfTwoColumn(
-    resources: Resources,
+    context: Context,
+    containerViewWidth: Int,
 ): Boolean {
+    val resources = context.resources
     val passedInText: String =
         when (this) {
             is PromptContentItemPlainText -> text
@@ -125,32 +178,29 @@
     when (this) {
         is PromptContentItemPlainText,
         is PromptContentItemBulletedText -> {
-            val dialogMargin =
-                resources.getDimensionPixelSize(R.dimen.biometric_dialog_border_padding)
-            val halfDialogWidth =
-                Resources.getSystem().displayMetrics.widthPixels / 2 - dialogMargin
-            val containerPadding =
-                resources.getDimensionPixelSize(
-                    R.dimen.biometric_prompt_content_container_padding_horizontal
-                )
-            val contentPadding =
+            val contentViewPadding =
                 resources.getDimensionPixelSize(R.dimen.biometric_prompt_content_padding_horizontal)
             val listItemPadding = getListItemPadding(resources)
-            val maxWidth = halfDialogWidth - containerPadding - contentPadding - listItemPadding
+            var maxWidth = containerViewWidth / 2 - contentViewPadding - listItemPadding
+            // Reduce maxWidth a bit since paint#measureText is not accurate. See b/330909104 for
+            // more context.
+            maxWidth -= contentViewPadding / 2
 
-            val text = "$passedInText"
-            val textSize =
-                resources.getDimensionPixelSize(
-                    R.dimen.biometric_prompt_content_list_item_text_size
+            val paint = TextPaint()
+            val attributes =
+                context.obtainStyledAttributes(
+                    R.style.TextAppearance_AuthCredential_ContentViewListItem,
+                    intArrayOf(android.R.attr.textSize)
                 )
-            val paint = Paint()
-            paint.textSize = textSize.toFloat()
+            paint.textSize = attributes.getDimensionPixelSize(0, 0).toFloat()
+            val textWidth = paint.measureText(passedInText)
+            attributes.recycle()
 
             val maxLines =
                 resources.getInteger(
                     R.integer.biometric_prompt_content_list_item_max_lines_if_two_column
                 )
-            val numLines = ceil(paint.measureText(text).toDouble() / maxWidth).toInt()
+            val numLines = ceil(textWidth / maxWidth).toInt()
             return numLines > maxLines
         }
         else -> {
@@ -160,10 +210,11 @@
 }
 
 private fun PromptContentItem.toView(
-    resources: Resources,
+    context: Context,
     inflater: LayoutInflater,
-    theme: Theme,
 ): TextView {
+    val resources = context.resources
+    // Somehow xml layout params settings doesn't work, set it again here.
     val textView =
         inflater.inflate(R.layout.biometric_prompt_content_row_item_text_view, null) as TextView
     val lp = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1f)
@@ -178,7 +229,7 @@
             val span =
                 BulletSpan(
                     getListItemBulletGapWidth(resources),
-                    getListItemBulletColor(resources, theme),
+                    getListItemBulletColor(context),
                     getListItemBulletRadius(resources)
                 )
             bulletedText.setSpan(span, 0 /* start */, text.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
@@ -191,11 +242,34 @@
     return textView
 }
 
+/* [contentView] function */
+private fun LinearLayout.addSpaceViewBetweenListItem() =
+    addView(
+        Space(context),
+        LinearLayout.LayoutParams(
+            resources.getDimensionPixelSize(
+                R.dimen.biometric_prompt_content_space_width_between_items
+            ),
+            MATCH_PARENT
+        )
+    )
+
+/* [contentView] function*/
+private fun LinearLayout.removeTopPaddingForFirstRow(description: String?, itemView: TextView) {
+    // If this item will be in the first row (contentView only has description view and
+    // description is empty), remove top padding of this item.
+    if (description.isNullOrEmpty() && childCount == 1) {
+        itemView.setPadding(itemView.paddingLeft, 0, itemView.paddingRight, itemView.paddingBottom)
+    }
+}
+
+private fun dummyItem(): PromptContentItem = PromptContentItemPlainText("")
+
 private fun PromptContentItem.getListItemPadding(resources: Resources): Int {
     var listItemPadding =
         resources.getDimensionPixelSize(
-            R.dimen.biometric_prompt_content_list_item_padding_horizontal
-        ) * 2
+            R.dimen.biometric_prompt_content_space_width_between_items
+        ) / 2
     when (this) {
         is PromptContentItemPlainText -> {}
         is PromptContentItemBulletedText -> {
@@ -215,5 +289,20 @@
 private fun getListItemBulletGapWidth(resources: Resources): Int =
     resources.getDimensionPixelSize(R.dimen.biometric_prompt_content_list_item_bullet_gap_width)
 
-private fun getListItemBulletColor(resources: Resources, theme: Theme): Int =
-    resources.getColor(R.color.biometric_prompt_content_list_item_bullet_color, theme)
+private fun getListItemBulletColor(context: Context): Int =
+    Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.materialColorOnSurface)
+
+private fun <T : View> T.width(function: (Int) -> Unit) {
+    if (width == 0)
+        viewTreeObserver.addOnGlobalLayoutListener(
+            object : ViewTreeObserver.OnGlobalLayoutListener {
+                override fun onGlobalLayout() {
+                    if (measuredWidth > 0) {
+                        viewTreeObserver.removeOnGlobalLayoutListener(this)
+                    }
+                    function(measuredWidth)
+                }
+            }
+        )
+    else function(measuredWidth)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt
index 7bb75bf..072fe47 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt
@@ -135,7 +135,7 @@
         val confirmationButton = view.requireViewById<Button>(R.id.button_confirm)
         val retryButton = view.requireViewById<Button>(R.id.button_try_again)
 
-        // TODO(b/251476085): temporary workaround for the unsafe callbacks & legacy controllers
+        // TODO(b/330788871): temporary workaround for the unsafe callbacks & legacy controllers
         val adapter =
             Spaghetti(
                 view = view,
@@ -171,8 +171,8 @@
             if (Flags.customBiometricPrompt() && constraintBp()) {
                 BiometricCustomizedViewBinder.bind(
                     customizedViewContainer,
-                    view.requireViewById(R.id.space_above_content),
-                    viewModel
+                    viewModel.contentView.first(),
+                    legacyCallback
                 )
             }
 
@@ -288,12 +288,14 @@
                 // set padding
                 launch {
                     viewModel.promptPadding.collect { promptPadding ->
-                        view.setPadding(
-                            promptPadding.left,
-                            promptPadding.top,
-                            promptPadding.right,
-                            promptPadding.bottom
-                        )
+                        if (!constraintBp()) {
+                            view.setPadding(
+                                promptPadding.left,
+                                promptPadding.top,
+                                promptPadding.right,
+                                promptPadding.bottom
+                            )
+                        }
                     }
                 }
 
@@ -461,6 +463,23 @@
                         }
                     }
                 }
+
+                // Retry and confirmation when finger on sensor
+                launch {
+                    combine(
+                            viewModel.canTryAgainNow,
+                            viewModel.hasFingerOnSensor,
+                            viewModel.isPendingConfirmation,
+                            ::Triple
+                        )
+                        .collect { (canRetry, fingerAcquired, pendingConfirmation) ->
+                            if (canRetry && fingerAcquired) {
+                                legacyCallback.onButtonTryAgain()
+                            } else if (pendingConfirmation && fingerAcquired) {
+                                viewModel.confirmAuthenticated()
+                            }
+                        }
+                }
             }
         }
 
@@ -476,7 +495,7 @@
  *
  * Do not reference the [view] for anything other than [asView].
  */
-@Deprecated("TODO(b/251476085): remove after replacing AuthContainerView")
+@Deprecated("TODO(b/330788871): remove after replacing AuthContainerView")
 class Spaghetti(
     private val view: View,
     private val viewModel: PromptViewModel,
@@ -484,19 +503,20 @@
     private val applicationScope: CoroutineScope,
 ) {
 
-    @Deprecated("TODO(b/251476085): remove after replacing AuthContainerView")
+    @Deprecated("TODO(b/330788871): remove after replacing AuthContainerView")
     interface Callback {
         fun onAuthenticated()
         fun onUserCanceled()
         fun onButtonNegative()
         fun onButtonTryAgain()
+        fun onContentViewMoreOptionsButtonPressed()
         fun onError()
         fun onUseDeviceCredential()
         fun onStartDelayedFingerprintSensor()
         fun onAuthenticatedAndConfirmed()
     }
 
-    @Deprecated("TODO(b/251476085): remove after replacing AuthContainerView")
+    @Deprecated("TODO(b/330788871): remove after replacing AuthContainerView")
     enum class BiometricState {
         /** Authentication hardware idle. */
         STATE_IDLE,
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 1dfd2e5f..f380746 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
@@ -20,7 +20,6 @@
 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
@@ -47,17 +46,14 @@
 import com.android.systemui.biometrics.ui.viewmodel.PromptPosition
 import com.android.systemui.biometrics.ui.viewmodel.PromptSize
 import com.android.systemui.biometrics.ui.viewmodel.PromptViewModel
-import com.android.systemui.biometrics.ui.viewmodel.isBottom
 import com.android.systemui.biometrics.ui.viewmodel.isLarge
 import com.android.systemui.biometrics.ui.viewmodel.isLeft
 import com.android.systemui.biometrics.ui.viewmodel.isMedium
 import com.android.systemui.biometrics.ui.viewmodel.isNullOrNotSmall
-import com.android.systemui.biometrics.ui.viewmodel.isRight
 import com.android.systemui.biometrics.ui.viewmodel.isSmall
-import com.android.systemui.biometrics.ui.viewmodel.isTop
 import com.android.systemui.lifecycle.repeatWhenAttached
 import com.android.systemui.res.R
-import kotlin.math.min
+import kotlin.math.abs
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.launch
 
@@ -97,8 +93,6 @@
         if (constraintBp()) {
             val leftGuideline = view.requireViewById<Guideline>(R.id.leftGuideline)
             val rightGuideline = view.requireViewById<Guideline>(R.id.rightGuideline)
-            val bottomGuideline = view.requireViewById<Guideline>(R.id.bottomGuideline)
-            val topGuideline = view.requireViewById<Guideline>(R.id.topGuideline)
             val midGuideline = view.findViewById<Guideline>(R.id.midGuideline)
 
             val iconHolderView = view.requireViewById<View>(R.id.biometric_icon)
@@ -121,171 +115,18 @@
 
             val largeConstraintSet = ConstraintSet()
             largeConstraintSet.clone(mediumConstraintSet)
-            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)
+            largeConstraintSet.constrainMaxWidth(R.id.panel, view.width)
 
             // TODO: Investigate better way to handle 180 rotations
             val flipConstraintSet = ConstraintSet()
-            flipConstraintSet.clone(mediumConstraintSet)
-            flipConstraintSet.connect(
-                R.id.scrollView,
-                ConstraintSet.START,
-                R.id.midGuideline,
-                ConstraintSet.START
-            )
-            flipConstraintSet.connect(
-                R.id.scrollView,
-                ConstraintSet.END,
-                R.id.rightGuideline,
-                ConstraintSet.END
-            )
-            flipConstraintSet.setHorizontalBias(R.id.biometric_icon, .2f)
-
-            // Round the panel outline
-            panelView.outlineProvider =
-                object : ViewOutlineProvider() {
-                    override fun getOutline(view: View, outline: Outline) {
-                        outline.setRoundRect(
-                            0,
-                            0,
-                            view.width,
-                            view.height + cornerRadiusPx,
-                            cornerRadiusPx.toFloat()
-                        )
-                    }
-                }
 
             view.doOnLayout {
-                val windowBounds = windowManager.maximumWindowMetrics.bounds
-                val bottomInset =
-                    windowManager.maximumWindowMetrics.windowInsets
-                        .getInsets(WindowInsets.Type.navigationBars())
-                        .bottom
-
-                // TODO: Move to viewmodel
-                fun measureBounds(position: PromptPosition) {
-                    val density = windowManager.currentWindowMetrics.density
-                    val width = min((640 * density).toInt(), windowBounds.width())
-
-                    var left = -1
-                    var right = -1
-                    var bottom = -1
-                    var mid = -1
-
-                    when {
-                        position.isTop -> {
-                            // Round bottom corners
-                            panelView.outlineProvider =
-                                object : ViewOutlineProvider() {
-                                    override fun getOutline(view: View, outline: Outline) {
-                                        outline.setRoundRect(
-                                            0,
-                                            -cornerRadiusPx,
-                                            view.width,
-                                            view.height,
-                                            cornerRadiusPx.toFloat()
-                                        )
-                                    }
-                                }
-                            left = windowBounds.centerX() - width / 2 + viewModel.promptMargin
-                            right = windowBounds.centerX() - width / 2 + viewModel.promptMargin
-                            bottom = iconHolderView.centerY() * 2 - iconHolderView.centerY() / 4
-                        }
-                        position.isBottom -> {
-                            // Round top corners
-                            panelView.outlineProvider =
-                                object : ViewOutlineProvider() {
-                                    override fun getOutline(view: View, outline: Outline) {
-                                        outline.setRoundRect(
-                                            0,
-                                            0,
-                                            view.width,
-                                            view.height + cornerRadiusPx,
-                                            cornerRadiusPx.toFloat()
-                                        )
-                                    }
-                                }
-
-                            left = windowBounds.centerX() - width / 2
-                            right = windowBounds.centerX() - width / 2
-                            bottom = if (view.isLandscape()) bottomInset else 0
-                        }
-                        position.isLeft -> {
-                            // Round right corners
-                            panelView.outlineProvider =
-                                object : ViewOutlineProvider() {
-                                    override fun getOutline(view: View, outline: Outline) {
-                                        outline.setRoundRect(
-                                            -cornerRadiusPx,
-                                            0,
-                                            view.width,
-                                            view.height,
-                                            cornerRadiusPx.toFloat()
-                                        )
-                                    }
-                                }
-
-                            left = 0
-                            mid = (windowBounds.width() * .85).toInt() / 2
-                            right = windowBounds.width() - (windowBounds.width() * .85).toInt()
-                            bottom = if (view.isLandscape()) bottomInset else 0
-                        }
-                        position.isRight -> {
-                            // Round left corners
-                            panelView.outlineProvider =
-                                object : ViewOutlineProvider() {
-                                    override fun getOutline(view: View, outline: Outline) {
-                                        outline.setRoundRect(
-                                            0,
-                                            0,
-                                            view.width + cornerRadiusPx,
-                                            view.height,
-                                            cornerRadiusPx.toFloat()
-                                        )
-                                    }
-                                }
-
-                            left = windowBounds.width() - (windowBounds.width() * .85).toInt()
-                            right = 0
-                            bottom = if (view.isLandscape()) bottomInset else 0
-                            mid = windowBounds.width() - (windowBounds.width() * .85).toInt() / 2
-                        }
-                    }
-
-                    val bounds = Rect(left, mid, right, bottom)
-                    if (bounds.shouldAdjustLeftGuideline()) {
-                        leftGuideline.setGuidelineBegin(bounds.left)
-                        smallConstraintSet.setGuidelineBegin(leftGuideline.id, bounds.left)
-                        mediumConstraintSet.setGuidelineBegin(leftGuideline.id, bounds.left)
-                    }
-                    if (bounds.shouldAdjustRightGuideline()) {
-                        rightGuideline.setGuidelineEnd(bounds.right)
-                        smallConstraintSet.setGuidelineEnd(rightGuideline.id, bounds.right)
-                        mediumConstraintSet.setGuidelineEnd(rightGuideline.id, bounds.right)
-                    }
-                    if (bounds.shouldAdjustBottomGuideline()) {
-                        bottomGuideline.setGuidelineEnd(bounds.bottom)
-                        smallConstraintSet.setGuidelineEnd(bottomGuideline.id, bounds.bottom)
-                        mediumConstraintSet.setGuidelineEnd(bottomGuideline.id, bounds.bottom)
-                    }
-
-                    if (position.isBottom) {
-                        topGuideline.setGuidelinePercent(.25f)
-                        mediumConstraintSet.setGuidelinePercent(topGuideline.id, .25f)
-                    } else {
-                        topGuideline.setGuidelinePercent(0f)
-                        mediumConstraintSet.setGuidelinePercent(topGuideline.id, 0f)
-                    }
-
-                    if (mid != -1 && midGuideline != null) {
-                        midGuideline.setGuidelineBegin(mid)
-                    }
-                }
-
                 fun setVisibilities(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 (viewModel.showBpWithoutIconForCredential.value) {
                         smallConstraintSet.setVisibility(iconHolderView.id, View.GONE)
@@ -297,36 +138,151 @@
                     }
                 }
 
+                fun roundCorners(size: PromptSize, position: PromptPosition) {
+                    var left = 0
+                    var top = 0
+                    var right = 0
+                    var bottom = 0
+                    when (size) {
+                        PromptSize.SMALL,
+                        PromptSize.MEDIUM ->
+                            when (position) {
+                                PromptPosition.Right -> {
+                                    left = 0
+                                    top = 0
+                                    right = view.width + cornerRadiusPx
+                                    bottom = view.height
+                                }
+                                PromptPosition.Left -> {
+                                    left = -cornerRadiusPx
+                                    top = 0
+                                    right = view.width
+                                    bottom = view.height
+                                }
+                                PromptPosition.Top -> {
+                                    left = 0
+                                    top = -cornerRadiusPx
+                                    right = panelView.width
+                                    bottom = view.height
+                                }
+                                PromptPosition.Bottom -> {
+                                    left = 0
+                                    top = 0
+                                    right = panelView.width
+                                    bottom = view.height + cornerRadiusPx
+                                }
+                            }
+                        PromptSize.LARGE -> {
+                            left = 0
+                            top = 0
+                            right = view.width
+                            bottom = view.height
+                        }
+                    }
+
+                    // Round the panel outline
+                    panelView.outlineProvider =
+                        object : ViewOutlineProvider() {
+                            override fun getOutline(view: View, outline: Outline) {
+                                outline.setRoundRect(
+                                    left,
+                                    top,
+                                    right,
+                                    bottom,
+                                    cornerRadiusPx.toFloat()
+                                )
+                            }
+                        }
+                }
+
                 view.repeatWhenAttached {
                     var currentSize: PromptSize? = null
 
                     lifecycleScope.launch {
+                        viewModel.guidelineBounds.collect { bounds ->
+                            if (bounds.left >= 0) {
+                                mediumConstraintSet.setGuidelineBegin(leftGuideline.id, bounds.left)
+                                smallConstraintSet.setGuidelineBegin(leftGuideline.id, bounds.left)
+                            } else if (bounds.left < 0) {
+                                mediumConstraintSet.setGuidelineEnd(
+                                    leftGuideline.id,
+                                    abs(bounds.left)
+                                )
+                                smallConstraintSet.setGuidelineEnd(
+                                    leftGuideline.id,
+                                    abs(bounds.left)
+                                )
+                            }
+
+                            if (bounds.right >= 0) {
+                                mediumConstraintSet.setGuidelineEnd(rightGuideline.id, bounds.right)
+                                smallConstraintSet.setGuidelineEnd(rightGuideline.id, bounds.right)
+                            } else if (bounds.right < 0) {
+                                mediumConstraintSet.setGuidelineBegin(
+                                    rightGuideline.id,
+                                    abs(bounds.right)
+                                )
+                                smallConstraintSet.setGuidelineBegin(
+                                    rightGuideline.id,
+                                    abs(bounds.right)
+                                )
+                            }
+
+                            if (midGuideline != null) {
+                                if (bounds.bottom >= 0) {
+                                    midGuideline.setGuidelineEnd(bounds.bottom)
+                                    mediumConstraintSet.setGuidelineEnd(
+                                        midGuideline.id,
+                                        bounds.bottom
+                                    )
+                                } else if (bounds.bottom < 0) {
+                                    midGuideline.setGuidelineBegin(abs(bounds.bottom))
+                                    mediumConstraintSet.setGuidelineBegin(
+                                        midGuideline.id,
+                                        abs(bounds.bottom)
+                                    )
+                                }
+                            }
+                        }
+                    }
+
+                    lifecycleScope.launch {
                         combine(viewModel.position, viewModel.size, ::Pair).collect {
                             (position, size) ->
                             view.doOnAttach {
+                                setVisibilities(size)
+
                                 if (position.isLeft) {
-                                    flipConstraintSet.applyTo(view)
-                                } else if (position.isRight) {
-                                    mediumConstraintSet.applyTo(view)
+                                    if (size.isSmall) {
+                                        flipConstraintSet.clone(smallConstraintSet)
+                                    } else {
+                                        flipConstraintSet.clone(mediumConstraintSet)
+                                    }
+
+                                    // Move all content to other panel
+                                    flipConstraintSet.connect(
+                                        R.id.scrollView,
+                                        ConstraintSet.START,
+                                        R.id.midGuideline,
+                                        ConstraintSet.START
+                                    )
+                                    flipConstraintSet.connect(
+                                        R.id.scrollView,
+                                        ConstraintSet.END,
+                                        R.id.rightGuideline,
+                                        ConstraintSet.END
+                                    )
                                 }
 
-                                measureBounds(position)
-                                setVisibilities(size)
+                                roundCorners(size, position)
+
                                 when {
                                     size.isSmall -> {
-                                        val ratio =
-                                            if (view.isLandscape()) {
-                                                (windowBounds.height() -
-                                                        bottomInset -
-                                                        viewModel.promptMargin)
-                                                    .toFloat() / windowBounds.height()
-                                            } else {
-                                                (windowBounds.height() - viewModel.promptMargin)
-                                                    .toFloat() / windowBounds.height()
-                                            }
-                                        smallConstraintSet.setVerticalBias(iconHolderView.id, ratio)
-
-                                        smallConstraintSet.applyTo(view as ConstraintLayout?)
+                                        if (position.isLeft) {
+                                            flipConstraintSet.applyTo(view)
+                                        } else {
+                                            smallConstraintSet.applyTo(view)
+                                        }
                                     }
                                     size.isMedium && currentSize.isSmall -> {
                                         val autoTransition = AutoTransition()
@@ -338,7 +294,19 @@
                                             view,
                                             autoTransition
                                         )
-                                        mediumConstraintSet.applyTo(view)
+
+                                        if (position.isLeft) {
+                                            flipConstraintSet.applyTo(view)
+                                        } else {
+                                            mediumConstraintSet.applyTo(view)
+                                        }
+                                    }
+                                    size.isMedium -> {
+                                        if (position.isLeft) {
+                                            flipConstraintSet.applyTo(view)
+                                        } else {
+                                            mediumConstraintSet.applyTo(view)
+                                        }
                                     }
                                     size.isLarge -> {
                                         val autoTransition = AutoTransition()
@@ -551,20 +519,6 @@
         }
 }
 
-private fun View.centerX(): Int {
-    return (x + width / 2).toInt()
-}
-
-private fun View.centerY(): Int {
-    return (y + height / 2).toInt()
-}
-
-private fun Rect.shouldAdjustLeftGuideline(): Boolean = left != -1
-
-private fun Rect.shouldAdjustRightGuideline(): Boolean = right != -1
-
-private fun Rect.shouldAdjustBottomGuideline(): Boolean = bottom != -1
-
 private fun View.asVerticalAnimator(
     duration: Long,
     toY: Float,
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt
index ce52e1d..18e2a56 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt
@@ -1,20 +1,23 @@
 package com.android.systemui.biometrics.ui.binder
 
+import android.hardware.biometrics.Flags
 import android.view.View
 import android.view.ViewGroup
 import android.widget.Button
 import android.widget.ImageView
+import android.widget.LinearLayout
 import android.widget.TextView
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
 import com.android.app.animation.Interpolators
-import com.android.systemui.res.R
+import com.android.systemui.Flags.constraintBp
 import com.android.systemui.biometrics.AuthPanelController
 import com.android.systemui.biometrics.ui.CredentialPasswordView
 import com.android.systemui.biometrics.ui.CredentialPatternView
 import com.android.systemui.biometrics.ui.CredentialView
 import com.android.systemui.biometrics.ui.viewmodel.CredentialViewModel
 import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.res.R
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.filter
@@ -40,12 +43,15 @@
         viewModel: CredentialViewModel,
         panelViewController: AuthPanelController,
         animatePanel: Boolean,
+        legacyCallback: Spaghetti.Callback,
         maxErrorDuration: Long = 3_000L,
         requestFocusForInput: Boolean = true,
     ) {
         val titleView: TextView = view.requireViewById(R.id.title)
         val subtitleView: TextView = view.requireViewById(R.id.subtitle)
         val descriptionView: TextView = view.requireViewById(R.id.description)
+        val customizedViewContainer: LinearLayout =
+            view.requireViewById(R.id.customized_view_container)
         val iconView: ImageView? = view.findViewById(R.id.icon)
         val errorView: TextView = view.requireViewById(R.id.error)
         val cancelButton: Button? = view.findViewById(R.id.cancel_button)
@@ -76,6 +82,13 @@
 
                         subtitleView.textOrHide = header.subtitle
                         descriptionView.textOrHide = header.description
+                        if (Flags.customBiometricPrompt() && constraintBp()) {
+                            BiometricCustomizedViewBinder.bind(
+                                customizedViewContainer,
+                                header.contentView,
+                                legacyCallback
+                            )
+                        }
 
                         iconView?.setImageDrawable(header.icon)
 
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/PromptIconViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/PromptIconViewBinder.kt
index d8265c7..66b7d7a 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/PromptIconViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/PromptIconViewBinder.kt
@@ -37,7 +37,6 @@
 import com.android.systemui.util.kotlin.Utils.Companion.toTriple
 import com.android.systemui.util.kotlin.sample
 import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.launch
 
 /** Sub-binder for [BiometricPromptLayout.iconView]. */
@@ -127,14 +126,22 @@
                         if (constraintBp() && position != Rect()) {
                             val iconParams = iconView.layoutParams as ConstraintLayout.LayoutParams
 
-                            if (position.left != -1) {
+                            if (position.left != 0) {
                                 iconParams.endToEnd = ConstraintSet.UNSET
                                 iconParams.leftMargin = position.left
                             }
-                            if (position.top != -1) {
+                            if (position.top != 0) {
                                 iconParams.bottomToBottom = ConstraintSet.UNSET
                                 iconParams.topMargin = position.top
                             }
+                            if (position.right != 0) {
+                                iconParams.startToStart = ConstraintSet.UNSET
+                                iconParams.rightMargin = position.right
+                            }
+                            if (position.bottom != 0) {
+                                iconParams.topToTop = ConstraintSet.UNSET
+                                iconParams.bottomMargin = position.bottom
+                            }
                             iconView.layoutParams = iconParams
                         }
                     }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialHeaderViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialHeaderViewModel.kt
index c6d9085..8b8c90a 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialHeaderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialHeaderViewModel.kt
@@ -1,6 +1,7 @@
 package com.android.systemui.biometrics.ui.viewmodel
 
 import android.graphics.drawable.Drawable
+import android.hardware.biometrics.PromptContentView
 import com.android.systemui.biometrics.shared.model.BiometricUserInfo
 
 /** View model for the top-level header / info area of BiometricPrompt. */
@@ -9,6 +10,7 @@
     val title: String
     val subtitle: String
     val description: String
+    val contentView: PromptContentView?
     val icon: Drawable
     val showEmergencyCallButton: Boolean
 }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt
index 46be8c7..31af126 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/CredentialViewModel.kt
@@ -2,8 +2,11 @@
 
 import android.content.Context
 import android.graphics.drawable.Drawable
+import android.hardware.biometrics.Flags.customBiometricPrompt
+import android.hardware.biometrics.PromptContentView
 import android.text.InputType
 import com.android.internal.widget.LockPatternView
+import com.android.systemui.Flags.constraintBp
 import com.android.systemui.biometrics.Utils
 import com.android.systemui.biometrics.domain.interactor.CredentialStatus
 import com.android.systemui.biometrics.domain.interactor.PromptCredentialInteractor
@@ -34,14 +37,19 @@
     val header: Flow<CredentialHeaderViewModel> =
         combine(
             credentialInteractor.prompt.filterIsInstance<BiometricPromptRequest.Credential>(),
-            credentialInteractor.showBpWithoutIconForCredential
-        ) { request, showBpWithoutIconForCredential ->
+            credentialInteractor.showTitleOnly
+        ) { request, showTitleOnly ->
+            val flagEnabled = customBiometricPrompt() && constraintBp()
+            val showTitleOnlyForCredential = showTitleOnly && flagEnabled
             BiometricPromptHeaderViewModelImpl(
                 request,
                 user = request.userInfo,
                 title = request.title,
-                subtitle = if (showBpWithoutIconForCredential) "" else request.subtitle,
-                description = if (showBpWithoutIconForCredential) "" else request.description,
+                subtitle = if (showTitleOnlyForCredential) "" else request.subtitle,
+                contentView =
+                    if (flagEnabled && !showTitleOnlyForCredential) request.contentView else null,
+                description =
+                    if (flagEnabled && request.contentView != null) "" else request.description,
                 icon = applicationContext.asLockIcon(request.userInfo.deviceCredentialOwnerId),
                 showEmergencyCallButton = request.showEmergencyCallButton
             )
@@ -188,6 +196,7 @@
     override val title: String,
     override val subtitle: String,
     override val description: String,
+    override val contentView: PromptContentView?,
     override val icon: Drawable,
     override val showEmergencyCallButton: Boolean,
 ) : CredentialHeaderViewModel
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModel.kt
index 71066743..2797b7b 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModel.kt
@@ -38,19 +38,14 @@
     alternateBouncerInteractor: AlternateBouncerInteractor,
     systemUIDialogManager: SystemUIDialogManager,
 ) : UdfpsTouchOverlayViewModel {
-    private val showingUdfpsAffordance: Flow<Boolean> =
+    override val shouldHandleTouches: Flow<Boolean> =
         combine(
             deviceEntryIconViewModel.deviceEntryViewAlpha,
             alternateBouncerInteractor.isVisible,
-        ) { deviceEntryViewAlpha, alternateBouncerVisible ->
-            deviceEntryViewAlpha > ALLOW_TOUCH_ALPHA_THRESHOLD || alternateBouncerVisible
-        }
-    override val shouldHandleTouches: Flow<Boolean> =
-        combine(
-            showingUdfpsAffordance,
-            systemUIDialogManager.hideAffordancesRequest,
-        ) { showingUdfpsAffordance, dialogRequestingHideAffordances ->
-            showingUdfpsAffordance && !dialogRequestingHideAffordances
+            systemUIDialogManager.hideAffordancesRequest
+        ) { deviceEntryViewAlpha, alternateBouncerVisible, hideAffordancesRequest ->
+            (deviceEntryViewAlpha > ALLOW_TOUCH_ALPHA_THRESHOLD && !hideAffordancesRequest) ||
+                alternateBouncerVisible
         }
 
     companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptIconViewModel.kt
index d0c140b..8dbed5f 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptIconViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptIconViewModel.kt
@@ -94,25 +94,76 @@
                     params.naturalDisplayHeight,
                     rotation.ordinal
                 )
-                rotatedBounds
+                Rect(
+                    rotatedBounds.left,
+                    rotatedBounds.top,
+                    params.logicalDisplayWidth - rotatedBounds.right,
+                    params.logicalDisplayHeight - rotatedBounds.bottom
+                )
             }
             .distinctUntilChanged()
 
     val iconPosition: Flow<Rect> =
-        combine(udfpsSensorBounds, promptViewModel.size, promptViewModel.modalities) {
-            sensorBounds,
-            size,
-            modalities ->
-            // If not Udfps, icon does not change from default layout position
-            if (!modalities.hasUdfps) {
-                Rect() // Empty rect, don't offset from default position
-            } else if (size.isSmall) {
-                // When small with Udfps, only set horizontal position
-                Rect(sensorBounds.left, -1, sensorBounds.right, -1)
-            } else {
-                sensorBounds
+        combine(
+                udfpsSensorBounds,
+                promptViewModel.size,
+                promptViewModel.position,
+                promptViewModel.modalities
+            ) { sensorBounds, size, position, modalities ->
+                when (position) {
+                    PromptPosition.Bottom ->
+                        if (size.isSmall) {
+                            Rect(0, 0, 0, promptViewModel.portraitSmallBottomPadding)
+                        } else if (size.isMedium && modalities.hasUdfps) {
+                            Rect(0, 0, 0, sensorBounds.bottom)
+                        } else if (size.isMedium) {
+                            Rect(0, 0, 0, promptViewModel.portraitMediumBottomPadding)
+                        } else {
+                            // Large screen
+                            Rect(0, 0, 0, promptViewModel.portraitLargeScreenBottomPadding)
+                        }
+                    PromptPosition.Right ->
+                        if (size.isSmall || modalities.hasFaceOnly) {
+                            Rect(
+                                0,
+                                0,
+                                promptViewModel.landscapeSmallHorizontalPadding,
+                                promptViewModel.landscapeSmallBottomPadding
+                            )
+                        } else if (size.isMedium && modalities.hasUdfps) {
+                            Rect(0, 0, sensorBounds.right, sensorBounds.bottom)
+                        } else {
+                            // SFPS
+                            Rect(
+                                0,
+                                0,
+                                promptViewModel.landscapeMediumHorizontalPadding,
+                                promptViewModel.landscapeMediumBottomPadding
+                            )
+                        }
+                    PromptPosition.Left ->
+                        if (size.isSmall || modalities.hasFaceOnly) {
+                            Rect(
+                                promptViewModel.landscapeSmallHorizontalPadding,
+                                0,
+                                0,
+                                promptViewModel.landscapeSmallBottomPadding
+                            )
+                        } else if (size.isMedium && modalities.hasUdfps) {
+                            Rect(sensorBounds.left, 0, 0, sensorBounds.bottom)
+                        } else {
+                            // SFPS
+                            Rect(
+                                promptViewModel.landscapeMediumHorizontalPadding,
+                                0,
+                                0,
+                                promptViewModel.landscapeMediumBottomPadding
+                            )
+                        }
+                    PromptPosition.Top -> Rect()
+                }
             }
-        }
+            .distinctUntilChanged()
 
     /** Whether an error message is currently being shown. */
     val showingError = promptViewModel.showingError
@@ -162,10 +213,11 @@
 
     val iconSize: Flow<Pair<Int, Int>> =
         combine(
+            promptViewModel.position,
             activeAuthType,
             promptViewModel.fingerprintSensorWidth,
             promptViewModel.fingerprintSensorHeight,
-        ) { activeAuthType, fingerprintSensorWidth, fingerprintSensorHeight ->
+        ) { _, activeAuthType, fingerprintSensorWidth, fingerprintSensorHeight ->
             if (activeAuthType == AuthType.Face) {
                 Pair(promptViewModel.faceIconWidth, promptViewModel.faceIconHeight)
             } else {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt
index fbd87fd..4e9acbd 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt
@@ -22,6 +22,7 @@
 import android.graphics.Rect
 import android.graphics.drawable.BitmapDrawable
 import android.graphics.drawable.Drawable
+import android.hardware.biometrics.BiometricFingerprintConstants
 import android.hardware.biometrics.BiometricPrompt
 import android.hardware.biometrics.Flags.customBiometricPrompt
 import android.hardware.biometrics.PromptContentView
@@ -32,6 +33,7 @@
 import com.android.systemui.Flags.constraintBp
 import com.android.systemui.biometrics.UdfpsUtils
 import com.android.systemui.biometrics.Utils
+import com.android.systemui.biometrics.domain.interactor.BiometricStatusInteractor
 import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
 import com.android.systemui.biometrics.domain.interactor.PromptSelectorInteractor
 import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor
@@ -40,6 +42,7 @@
 import com.android.systemui.biometrics.shared.model.DisplayRotation
 import com.android.systemui.biometrics.shared.model.PromptKind
 import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.keyguard.shared.model.AcquiredFingerprintAuthenticationStatus
 import com.android.systemui.res.R
 import javax.inject.Inject
 import kotlinx.coroutines.Job
@@ -66,6 +69,7 @@
     promptSelectorInteractor: PromptSelectorInteractor,
     @Application private val context: Context,
     private val udfpsOverlayInteractor: UdfpsOverlayInteractor,
+    private val biometricStatusInteractor: BiometricStatusInteractor,
     private val udfpsUtils: UdfpsUtils
 ) {
     /** The set of modalities available for this prompt */
@@ -86,6 +90,36 @@
     val faceIconHeight: Int =
         context.resources.getDimensionPixelSize(R.dimen.biometric_dialog_face_icon_size)
 
+    /** Padding for placing icons */
+    val portraitSmallBottomPadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_portrait_small_bottom_padding
+        )
+    val portraitMediumBottomPadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_portrait_medium_bottom_padding
+        )
+    val portraitLargeScreenBottomPadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_portrait_large_screen_bottom_padding
+        )
+    val landscapeSmallBottomPadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_landscape_small_bottom_padding
+        )
+    val landscapeSmallHorizontalPadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_landscape_small_horizontal_padding
+        )
+    val landscapeMediumBottomPadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_landscape_medium_bottom_padding
+        )
+    val landscapeMediumHorizontalPadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_landscape_medium_horizontal_padding
+        )
+
     val fingerprintSensorWidth: Flow<Int> =
         combine(modalities, udfpsOverlayInteractor.udfpsOverlayParams) { modalities, overlayParams
             ->
@@ -111,9 +145,6 @@
     /** Hint for talkback directional guidance */
     val accessibilityHint: Flow<String> = _accessibilityHint.asSharedFlow()
 
-    val promptMargin: Int =
-        context.resources.getDimensionPixelSize(R.dimen.biometric_dialog_border_padding)
-
     private val _isAuthenticating: MutableStateFlow<Boolean> = MutableStateFlow(false)
 
     /** If the user is currently authenticating (i.e. at least one biometric is scanning). */
@@ -158,6 +189,24 @@
     /** Fingerprint sensor state. */
     val fingerprintStartMode: Flow<FingerprintStartMode> = _fingerprintStartMode.asStateFlow()
 
+    /** Whether a finger has been acquired by the sensor */
+    // TODO(b/331948073): Add support for detecting SFPS finger without authentication running
+    val hasFingerBeenAcquired: Flow<Boolean> =
+        combine(biometricStatusInteractor.fingerprintAcquiredStatus, modalities) {
+                status,
+                modalities ->
+                modalities.hasSfps &&
+                    status is AcquiredFingerprintAuthenticationStatus &&
+                    status.acquiredInfo == BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START
+            }
+            .distinctUntilChanged()
+
+    /** Whether there is currently a finger on the sensor */
+    val hasFingerOnSensor: Flow<Boolean> =
+        combine(hasFingerBeenAcquired, _isOverlayTouched) { hasFingerBeenAcquired, overlayTouched ->
+            hasFingerBeenAcquired || overlayTouched
+        }
+
     private val _forceLargeSize = MutableStateFlow(false)
     private val _forceMediumSize = MutableStateFlow(false)
 
@@ -205,6 +254,66 @@
             }
             .distinctUntilChanged()
 
+    /** Prompt panel size padding */
+    private val smallHorizontalGuidelinePadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_small_horizontal_guideline_padding
+        )
+    private val udfpsHorizontalGuidelinePadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_udfps_horizontal_guideline_padding
+        )
+    private val udfpsMidGuidelinePadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_udfps_mid_guideline_padding
+        )
+    private val mediumHorizontalGuidelinePadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_medium_horizontal_guideline_padding
+        )
+    private val mediumMidGuidelinePadding =
+        context.resources.getDimensionPixelSize(
+            R.dimen.biometric_prompt_medium_mid_guideline_padding
+        )
+
+    /**
+     * Rect for positioning prompt guidelines (left, top, right, mid)
+     *
+     * Negative values are used to signify that guideline measuring should be flipped, measuring
+     * from opposite side of the screen
+     */
+    val guidelineBounds: Flow<Rect> =
+        combine(size, position, modalities) { size, position, modalities ->
+                if (position.isBottom) {
+                    Rect(0, 0, 0, 0)
+                } else if (position.isRight) {
+                    if (size.isSmall) {
+                        Rect(-smallHorizontalGuidelinePadding, 0, 0, 0)
+                    } else if (modalities.hasUdfps) {
+                        Rect(udfpsHorizontalGuidelinePadding, 0, 0, udfpsMidGuidelinePadding)
+                    } else if (modalities.isEmpty) {
+                        // TODO: Temporary fix until no biometric landscape layout is added
+                        Rect(-mediumHorizontalGuidelinePadding, 0, 0, 6)
+                    } else {
+                        Rect(-mediumHorizontalGuidelinePadding, 0, 0, mediumMidGuidelinePadding)
+                    }
+                } else if (position.isLeft) {
+                    if (size.isSmall) {
+                        Rect(0, 0, -smallHorizontalGuidelinePadding, 0)
+                    } else if (modalities.hasUdfps) {
+                        Rect(0, 0, udfpsHorizontalGuidelinePadding, -udfpsMidGuidelinePadding)
+                    } else if (modalities.isEmpty) {
+                        // TODO: Temporary fix until no biometric landscape layout is added
+                        Rect(0, 0, -mediumHorizontalGuidelinePadding, -6)
+                    } else {
+                        Rect(0, 0, -mediumHorizontalGuidelinePadding, -mediumMidGuidelinePadding)
+                    }
+                } else {
+                    Rect()
+                }
+            }
+            .distinctUntilChanged()
+
     /**
      * If the API caller or the user's personal preferences require explicit confirmation after
      * successful authentication. Confirmation always required when in explicit flow.
@@ -424,7 +533,7 @@
             isAuthenticated,
             promptSelectorInteractor.isCredentialAllowed,
         ) { size, _, authState, credentialAllowed ->
-            size.isNotSmall && authState.isNotAuthenticated && credentialAllowed
+            size.isMedium && authState.isNotAuthenticated && credentialAllowed
         }
 
     private val history = PromptHistoryImpl()
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt
index cfda75c..b72b1f3 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModel.kt
@@ -28,6 +28,7 @@
 import android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION
 import android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY
 import com.airbnb.lottie.model.KeyPath
+import com.android.systemui.Flags.constraintBp
 import com.android.systemui.biometrics.Utils
 import com.android.systemui.biometrics.domain.interactor.BiometricStatusInteractor
 import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
@@ -155,17 +156,19 @@
             ->
             val topLeft = Point(sensorLocation.left, sensorLocation.top)
 
-            if (sensorLocation.isSensorVerticalInDefaultOrientation) {
-                if (displayRotation == DisplayRotation.ROTATION_0) {
-                    topLeft.x -= bounds!!.width()
-                } else if (displayRotation == DisplayRotation.ROTATION_270) {
-                    topLeft.y -= bounds!!.height()
-                }
-            } else {
-                if (displayRotation == DisplayRotation.ROTATION_180) {
-                    topLeft.y -= bounds!!.height()
-                } else if (displayRotation == DisplayRotation.ROTATION_270) {
-                    topLeft.x -= bounds!!.width()
+            if (!constraintBp()) {
+                if (sensorLocation.isSensorVerticalInDefaultOrientation) {
+                    if (displayRotation == DisplayRotation.ROTATION_0) {
+                        topLeft.x -= bounds!!.width()
+                    } else if (displayRotation == DisplayRotation.ROTATION_270) {
+                        topLeft.y -= bounds!!.height()
+                    }
+                } else {
+                    if (displayRotation == DisplayRotation.ROTATION_180) {
+                        topLeft.y -= bounds!!.height()
+                    } else if (displayRotation == DisplayRotation.ROTATION_270) {
+                        topLeft.x -= bounds!!.width()
+                    }
                 }
             }
             defaultOverlayViewParams.apply {
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnInteractor.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnInteractor.kt
new file mode 100644
index 0000000..f86cad5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnInteractor.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.bluetooth.qsdialog
+
+import android.util.Log
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+
+/** Interactor class responsible for interacting with the Bluetooth Auto-On feature. */
+@SysUISingleton
+class BluetoothAutoOnInteractor
+@Inject
+constructor(
+    private val bluetoothAutoOnRepository: BluetoothAutoOnRepository,
+) {
+
+    val isEnabled = bluetoothAutoOnRepository.isAutoOn
+
+    /** Checks if the auto on feature is supported. */
+    suspend fun isAutoOnSupported(): Boolean = bluetoothAutoOnRepository.isAutoOnSupported()
+
+    /**
+     * Sets enabled or disabled based on the provided value.
+     *
+     * @param value `true` to enable the feature, `false` to disable it.
+     */
+    suspend fun setEnabled(value: Boolean) {
+        if (!isAutoOnSupported()) {
+            Log.e(TAG, "Trying to set toggle value while feature not available.")
+        } else {
+            bluetoothAutoOnRepository.setAutoOn(value)
+        }
+    }
+
+    companion object {
+        private const val TAG = "BluetoothAutoOnInteractor"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnRepository.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnRepository.kt
new file mode 100644
index 0000000..81fe2a5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnRepository.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.systemui.bluetooth.qsdialog
+
+import android.bluetooth.BluetoothAdapter
+import android.util.Log
+import com.android.settingslib.bluetooth.BluetoothCallback
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
+import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Background
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.withContext
+
+/**
+ * Repository class responsible for managing the Bluetooth Auto-On feature settings for the current
+ * user.
+ */
+@SysUISingleton
+class BluetoothAutoOnRepository
+@Inject
+constructor(
+    localBluetoothManager: LocalBluetoothManager?,
+    private val bluetoothAdapter: BluetoothAdapter?,
+    @Application private val coroutineScope: CoroutineScope,
+    @Background private val backgroundDispatcher: CoroutineDispatcher,
+) {
+
+    // Flow representing the auto on state for the current user
+    internal val isAutoOn: Flow<Boolean> =
+        localBluetoothManager?.eventManager?.let { eventManager ->
+            conflatedCallbackFlow {
+                    val listener =
+                        object : BluetoothCallback {
+                            override fun onAutoOnStateChanged(autoOnState: Int) {
+                                super.onAutoOnStateChanged(autoOnState)
+                                if (
+                                    autoOnState == BluetoothAdapter.AUTO_ON_STATE_ENABLED ||
+                                        autoOnState == BluetoothAdapter.AUTO_ON_STATE_DISABLED
+                                ) {
+                                    trySendWithFailureLogging(
+                                        autoOnState == BluetoothAdapter.AUTO_ON_STATE_ENABLED,
+                                        TAG,
+                                        "onAutoOnStateChanged"
+                                    )
+                                }
+                            }
+                        }
+                    eventManager.registerCallback(listener)
+                    awaitClose { eventManager.unregisterCallback(listener) }
+                }
+                .onStart { emit(isAutoOnEnabled()) }
+                .flowOn(backgroundDispatcher)
+                .stateIn(
+                    coroutineScope,
+                    SharingStarted.WhileSubscribed(replayExpirationMillis = 0),
+                    initialValue = false
+                )
+        }
+            ?: flowOf(false)
+
+    /**
+     * Checks if the auto on feature is supported for the current user.
+     *
+     * @throws Exception if an error occurs while checking auto-on support.
+     */
+    suspend fun isAutoOnSupported(): Boolean =
+        withContext(backgroundDispatcher) {
+            try {
+                bluetoothAdapter?.isAutoOnSupported ?: false
+            } catch (e: Exception) {
+                // Server could throw TimeoutException, InterruptedException or ExecutionException
+                Log.e(TAG, "Error calling isAutoOnSupported", e)
+                false
+            }
+        }
+
+    /** Sets the Bluetooth Auto-On for the current user. */
+    suspend fun setAutoOn(value: Boolean) {
+        withContext(backgroundDispatcher) {
+            try {
+                bluetoothAdapter?.setAutoOnEnabled(value)
+            } catch (e: Exception) {
+                // Server could throw IllegalStateException, TimeoutException, InterruptedException
+                // or ExecutionException
+                Log.e(TAG, "Error calling setAutoOnEnabled", e)
+            }
+        }
+    }
+
+    private suspend fun isAutoOnEnabled() =
+        withContext(backgroundDispatcher) {
+            try {
+                bluetoothAdapter?.isAutoOnEnabled ?: false
+            } catch (e: Exception) {
+                // Server could throw IllegalStateException, TimeoutException, InterruptedException
+                // or ExecutionException
+                Log.e(TAG, "Error calling isAutoOnEnabled", e)
+                false
+            }
+        }
+
+    private companion object {
+        const val TAG = "BluetoothAutoOnRepository"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothStateInteractor.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothStateInteractor.kt
new file mode 100644
index 0000000..94d7af7
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothStateInteractor.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.bluetooth.qsdialog
+
+import android.bluetooth.BluetoothAdapter
+import android.bluetooth.BluetoothAdapter.STATE_OFF
+import android.bluetooth.BluetoothAdapter.STATE_ON
+import com.android.settingslib.bluetooth.BluetoothCallback
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
+import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.stateIn
+
+/** Holds business logic for the Bluetooth Dialog's bluetooth and device connection state */
+@SysUISingleton
+internal class BluetoothStateInteractor
+@Inject
+constructor(
+    private val localBluetoothManager: LocalBluetoothManager?,
+    private val logger: BluetoothTileDialogLogger,
+    @Application private val coroutineScope: CoroutineScope,
+) {
+
+    internal val bluetoothStateUpdate: StateFlow<Boolean?> =
+        conflatedCallbackFlow {
+                val listener =
+                    object : BluetoothCallback {
+                        override fun onBluetoothStateChanged(bluetoothState: Int) {
+                            if (bluetoothState == STATE_ON || bluetoothState == STATE_OFF) {
+                                super.onBluetoothStateChanged(bluetoothState)
+                                logger.logBluetoothState(
+                                    BluetoothStateStage.BLUETOOTH_STATE_CHANGE_RECEIVED,
+                                    BluetoothAdapter.nameForState(bluetoothState)
+                                )
+                                trySendWithFailureLogging(
+                                    bluetoothState == STATE_ON,
+                                    TAG,
+                                    "onBluetoothStateChanged"
+                                )
+                            }
+                        }
+                    }
+                localBluetoothManager?.eventManager?.registerCallback(listener)
+                awaitClose { localBluetoothManager?.eventManager?.unregisterCallback(listener) }
+            }
+            .stateIn(
+                coroutineScope,
+                SharingStarted.WhileSubscribed(replayExpirationMillis = 0),
+                initialValue = null
+            )
+
+    internal var isBluetoothEnabled: Boolean
+        get() = localBluetoothManager?.bluetoothAdapter?.isEnabled == true
+        set(value) {
+            if (isBluetoothEnabled != value) {
+                localBluetoothManager?.bluetoothAdapter?.apply {
+                    if (value) enable() else disable()
+                    logger.logBluetoothState(
+                        BluetoothStateStage.BLUETOOTH_STATE_VALUE_SET,
+                        value.toString()
+                    )
+                }
+            }
+        }
+
+    companion object {
+        private const val TAG = "BtStateInteractor"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt
new file mode 100644
index 0000000..c7d171d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt
@@ -0,0 +1,423 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.bluetooth.qsdialog
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.View.AccessibilityDelegate
+import android.view.View.GONE
+import android.view.View.INVISIBLE
+import android.view.View.VISIBLE
+import android.view.ViewGroup
+import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
+import android.view.accessibility.AccessibilityNodeInfo
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction
+import android.widget.ImageView
+import android.widget.ProgressBar
+import android.widget.Switch
+import android.widget.TextView
+import androidx.annotation.StringRes
+import androidx.recyclerview.widget.AsyncListDiffer
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.android.internal.logging.UiEventLogger
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.phone.SystemUIDialog
+import com.android.systemui.util.time.SystemClock
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asSharedFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.isActive
+import kotlinx.coroutines.withContext
+
+/** Dialog for showing active, connected and saved bluetooth devices. */
+class BluetoothTileDialogDelegate
+@AssistedInject
+internal constructor(
+    @Assisted private val initialUiProperties: BluetoothTileDialogViewModel.UiProperties,
+    @Assisted private val cachedContentHeight: Int,
+    @Assisted private val bluetoothToggleInitialValue: Boolean,
+    @Assisted private val bluetoothTileDialogCallback: BluetoothTileDialogCallback,
+    @Assisted private val dismissListener: Runnable,
+    @Main private val mainDispatcher: CoroutineDispatcher,
+    private val systemClock: SystemClock,
+    private val uiEventLogger: UiEventLogger,
+    private val logger: BluetoothTileDialogLogger,
+    private val systemuiDialogFactory: SystemUIDialog.Factory,
+) : SystemUIDialog.Delegate {
+
+    private val mutableBluetoothStateToggle: MutableStateFlow<Boolean> =
+        MutableStateFlow(bluetoothToggleInitialValue)
+    internal val bluetoothStateToggle
+        get() = mutableBluetoothStateToggle.asStateFlow()
+
+    private val mutableBluetoothAutoOnToggle: MutableStateFlow<Boolean?> = MutableStateFlow(null)
+    internal val bluetoothAutoOnToggle
+        get() = mutableBluetoothAutoOnToggle.asStateFlow()
+
+    private val mutableDeviceItemClick: MutableSharedFlow<DeviceItem> =
+        MutableSharedFlow(extraBufferCapacity = 1)
+    internal val deviceItemClick
+        get() = mutableDeviceItemClick.asSharedFlow()
+
+    private val mutableContentHeight: MutableSharedFlow<Int> =
+        MutableSharedFlow(extraBufferCapacity = 1)
+    internal val contentHeight
+        get() = mutableContentHeight.asSharedFlow()
+
+    private val deviceItemAdapter: Adapter = Adapter(bluetoothTileDialogCallback)
+
+    private var lastUiUpdateMs: Long = -1
+
+    private var lastItemRow: Int = -1
+
+    @AssistedFactory
+    internal interface Factory {
+        fun create(
+            initialUiProperties: BluetoothTileDialogViewModel.UiProperties,
+            cachedContentHeight: Int,
+            bluetoothEnabled: Boolean,
+            dialogCallback: BluetoothTileDialogCallback,
+            dimissListener: Runnable
+        ): BluetoothTileDialogDelegate
+    }
+
+    override fun createDialog(): SystemUIDialog {
+        return systemuiDialogFactory.create(this)
+    }
+
+    override fun onCreate(dialog: SystemUIDialog, savedInstanceState: Bundle?) {
+        SystemUIDialog.registerDismissListener(dialog, dismissListener)
+        uiEventLogger.log(BluetoothTileDialogUiEvent.BLUETOOTH_TILE_DIALOG_SHOWN)
+        val context = dialog.context
+
+        LayoutInflater.from(context).inflate(R.layout.bluetooth_tile_dialog, null).apply {
+            accessibilityPaneTitle = context.getText(R.string.accessibility_desc_quick_settings)
+            dialog.setContentView(this)
+        }
+
+        setupToggle(dialog)
+        setupRecyclerView(dialog)
+
+        getSubtitleTextView(dialog).text = context.getString(initialUiProperties.subTitleResId)
+        dialog.requireViewById<View>(R.id.done_button).setOnClickListener { dialog.dismiss() }
+        getSeeAllButton(dialog).setOnClickListener {
+            bluetoothTileDialogCallback.onSeeAllClicked(it)
+        }
+        getPairNewDeviceButton(dialog).setOnClickListener {
+            bluetoothTileDialogCallback.onPairNewDeviceClicked(it)
+        }
+        getScrollViewContent(dialog).apply {
+            minimumHeight =
+                resources.getDimensionPixelSize(initialUiProperties.scrollViewMinHeightResId)
+            layoutParams.height = maxOf(cachedContentHeight, minimumHeight)
+        }
+    }
+
+    override fun onStart(dialog: SystemUIDialog) {
+        lastUiUpdateMs = systemClock.elapsedRealtime()
+    }
+
+    override fun onStop(dialog: SystemUIDialog) {
+        mutableContentHeight.tryEmit(getScrollViewContent(dialog).measuredHeight)
+    }
+
+    internal suspend fun animateProgressBar(dialog: SystemUIDialog, animate: Boolean) {
+        withContext(mainDispatcher) {
+            if (animate) {
+                showProgressBar(dialog)
+            } else {
+                delay(PROGRESS_BAR_ANIMATION_DURATION_MS)
+                hideProgressBar(dialog)
+            }
+        }
+    }
+
+    internal suspend fun onDeviceItemUpdated(
+        dialog: SystemUIDialog,
+        deviceItem: List<DeviceItem>,
+        showSeeAll: Boolean,
+        showPairNewDevice: Boolean
+    ) {
+        withContext(mainDispatcher) {
+            val start = systemClock.elapsedRealtime()
+            val itemRow = deviceItem.size + showSeeAll.toInt() + showPairNewDevice.toInt()
+            // If not the first load, add a slight delay for smoother dialog height change
+            if (itemRow != lastItemRow && lastItemRow != -1) {
+                delay(MIN_HEIGHT_CHANGE_INTERVAL_MS - (start - lastUiUpdateMs))
+            }
+            if (isActive) {
+                deviceItemAdapter.refreshDeviceItemList(deviceItem) {
+                    getSeeAllButton(dialog).visibility = if (showSeeAll) VISIBLE else GONE
+                    getPairNewDeviceButton(dialog).visibility =
+                        if (showPairNewDevice) VISIBLE else GONE
+                    // Update the height after data is updated
+                    getScrollViewContent(dialog).layoutParams.height = WRAP_CONTENT
+                    lastUiUpdateMs = systemClock.elapsedRealtime()
+                    lastItemRow = itemRow
+                    logger.logDeviceUiUpdate(lastUiUpdateMs - start)
+                }
+            }
+        }
+    }
+
+    internal fun onBluetoothStateUpdated(
+        dialog: SystemUIDialog,
+        isEnabled: Boolean,
+        uiProperties: BluetoothTileDialogViewModel.UiProperties
+    ) {
+        getToggleView(dialog).apply {
+            isChecked = isEnabled
+            setEnabled(true)
+            alpha = ENABLED_ALPHA
+        }
+        getSubtitleTextView(dialog).text = dialog.context.getString(uiProperties.subTitleResId)
+        getAutoOnToggleView(dialog).visibility = uiProperties.autoOnToggleVisibility
+    }
+
+    internal fun onBluetoothAutoOnUpdated(
+        dialog: SystemUIDialog,
+        isEnabled: Boolean,
+        @StringRes infoResId: Int
+    ) {
+        getAutoOnToggle(dialog).apply {
+            isChecked = isEnabled
+            setEnabled(true)
+            alpha = ENABLED_ALPHA
+        }
+        getAutoOnToggleInfoTextView(dialog).text = dialog.context.getString(infoResId)
+    }
+
+    private fun setupToggle(dialog: SystemUIDialog) {
+        val toggleView = getToggleView(dialog)
+        toggleView.isChecked = bluetoothToggleInitialValue
+        toggleView.setOnCheckedChangeListener { view, isChecked ->
+            mutableBluetoothStateToggle.value = isChecked
+            view.apply {
+                isEnabled = false
+                alpha = DISABLED_ALPHA
+            }
+            logger.logBluetoothState(BluetoothStateStage.USER_TOGGLED, isChecked.toString())
+            uiEventLogger.log(BluetoothTileDialogUiEvent.BLUETOOTH_TOGGLE_CLICKED)
+        }
+
+        getAutoOnToggleView(dialog).visibility = initialUiProperties.autoOnToggleVisibility
+        getAutoOnToggle(dialog).setOnCheckedChangeListener { view, isChecked ->
+            mutableBluetoothAutoOnToggle.value = isChecked
+            view.apply {
+                isEnabled = false
+                alpha = DISABLED_ALPHA
+            }
+            uiEventLogger.log(BluetoothTileDialogUiEvent.BLUETOOTH_AUTO_ON_TOGGLE_CLICKED)
+        }
+    }
+
+    private fun getToggleView(dialog: SystemUIDialog): Switch {
+        return dialog.requireViewById(R.id.bluetooth_toggle)
+    }
+
+    private fun getSubtitleTextView(dialog: SystemUIDialog): TextView {
+        return dialog.requireViewById(R.id.bluetooth_tile_dialog_subtitle)
+    }
+
+    private fun getSeeAllButton(dialog: SystemUIDialog): View {
+        return dialog.requireViewById(R.id.see_all_button)
+    }
+
+    private fun getPairNewDeviceButton(dialog: SystemUIDialog): View {
+        return dialog.requireViewById(R.id.pair_new_device_button)
+    }
+
+    private fun getDeviceListView(dialog: SystemUIDialog): RecyclerView {
+        return dialog.requireViewById(R.id.device_list)
+    }
+
+    private fun getAutoOnToggle(dialog: SystemUIDialog): Switch {
+        return dialog.requireViewById(R.id.bluetooth_auto_on_toggle)
+    }
+
+    private fun getAutoOnToggleView(dialog: SystemUIDialog): View {
+        return dialog.requireViewById(R.id.bluetooth_auto_on_toggle_layout)
+    }
+
+    private fun getAutoOnToggleInfoTextView(dialog: SystemUIDialog): TextView {
+        return dialog.requireViewById(R.id.bluetooth_auto_on_toggle_info_text)
+    }
+
+    private fun getProgressBarAnimation(dialog: SystemUIDialog): ProgressBar {
+        return dialog.requireViewById(R.id.bluetooth_tile_dialog_progress_animation)
+    }
+
+    private fun getProgressBarBackground(dialog: SystemUIDialog): View {
+        return dialog.requireViewById(R.id.bluetooth_tile_dialog_progress_animation)
+    }
+
+    private fun getScrollViewContent(dialog: SystemUIDialog): View {
+        return dialog.requireViewById(R.id.scroll_view)
+    }
+
+    private fun setupRecyclerView(dialog: SystemUIDialog) {
+        getDeviceListView(dialog).apply {
+            layoutManager = LinearLayoutManager(dialog.context)
+            adapter = deviceItemAdapter
+        }
+    }
+
+    private fun showProgressBar(dialog: SystemUIDialog) {
+        val progressBarAnimation = getProgressBarAnimation(dialog)
+        val progressBarBackground = getProgressBarBackground(dialog)
+        if (progressBarAnimation.visibility != VISIBLE) {
+            progressBarAnimation.visibility = VISIBLE
+            progressBarBackground.visibility = INVISIBLE
+        }
+    }
+
+    private fun hideProgressBar(dialog: SystemUIDialog) {
+        val progressBarAnimation = getProgressBarAnimation(dialog)
+        val progressBarBackground = getProgressBarBackground(dialog)
+        if (progressBarAnimation.visibility != INVISIBLE) {
+            progressBarAnimation.visibility = INVISIBLE
+            progressBarBackground.visibility = VISIBLE
+        }
+    }
+
+    internal inner class Adapter(private val onClickCallback: BluetoothTileDialogCallback) :
+        RecyclerView.Adapter<Adapter.DeviceItemViewHolder>() {
+
+        private val diffUtilCallback =
+            object : DiffUtil.ItemCallback<DeviceItem>() {
+                override fun areItemsTheSame(
+                    deviceItem1: DeviceItem,
+                    deviceItem2: DeviceItem
+                ): Boolean {
+                    return deviceItem1.cachedBluetoothDevice == deviceItem2.cachedBluetoothDevice
+                }
+
+                override fun areContentsTheSame(
+                    deviceItem1: DeviceItem,
+                    deviceItem2: DeviceItem
+                ): Boolean {
+                    return deviceItem1.type == deviceItem2.type &&
+                        deviceItem1.cachedBluetoothDevice == deviceItem2.cachedBluetoothDevice &&
+                        deviceItem1.deviceName == deviceItem2.deviceName &&
+                        deviceItem1.connectionSummary == deviceItem2.connectionSummary &&
+                        // Ignored the icon drawable
+                        deviceItem1.iconWithDescription?.second ==
+                            deviceItem2.iconWithDescription?.second &&
+                        deviceItem1.background == deviceItem2.background &&
+                        deviceItem1.isEnabled == deviceItem2.isEnabled &&
+                        deviceItem1.actionAccessibilityLabel == deviceItem2.actionAccessibilityLabel
+                }
+            }
+
+        private val asyncListDiffer = AsyncListDiffer(this, diffUtilCallback)
+
+        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DeviceItemViewHolder {
+            val view =
+                LayoutInflater.from(parent.context)
+                    .inflate(R.layout.bluetooth_device_item, parent, false)
+            return DeviceItemViewHolder(view)
+        }
+
+        override fun getItemCount() = asyncListDiffer.currentList.size
+
+        override fun onBindViewHolder(holder: DeviceItemViewHolder, position: Int) {
+            val item = getItem(position)
+            holder.bind(item, onClickCallback)
+        }
+
+        internal fun getItem(position: Int) = asyncListDiffer.currentList[position]
+
+        internal fun refreshDeviceItemList(updated: List<DeviceItem>, callback: () -> Unit) {
+            asyncListDiffer.submitList(updated, callback)
+        }
+
+        internal inner class DeviceItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+            private val container = view.requireViewById<View>(R.id.bluetooth_device_row)
+            private val nameView = view.requireViewById<TextView>(R.id.bluetooth_device_name)
+            private val summaryView = view.requireViewById<TextView>(R.id.bluetooth_device_summary)
+            private val iconView = view.requireViewById<ImageView>(R.id.bluetooth_device_icon)
+            private val gearView = view.requireViewById<View>(R.id.gear_icon)
+
+            internal fun bind(
+                item: DeviceItem,
+                deviceItemOnClickCallback: BluetoothTileDialogCallback
+            ) {
+                container.apply {
+                    isEnabled = item.isEnabled
+                    background = item.background?.let { context.getDrawable(it) }
+                    setOnClickListener {
+                        mutableDeviceItemClick.tryEmit(item)
+                        uiEventLogger.log(BluetoothTileDialogUiEvent.DEVICE_CLICKED)
+                    }
+                    accessibilityDelegate =
+                        object : AccessibilityDelegate() {
+                            override fun onInitializeAccessibilityNodeInfo(
+                                host: View,
+                                info: AccessibilityNodeInfo
+                            ) {
+                                super.onInitializeAccessibilityNodeInfo(host, info)
+                                info.addAction(
+                                    AccessibilityAction(
+                                        AccessibilityAction.ACTION_CLICK.id,
+                                        item.actionAccessibilityLabel
+                                    )
+                                )
+                            }
+                        }
+                }
+                nameView.text = item.deviceName
+                summaryView.text = item.connectionSummary
+                iconView.apply {
+                    item.iconWithDescription?.let {
+                        setImageDrawable(it.first)
+                        contentDescription = it.second
+                    }
+                }
+                gearView.setOnClickListener {
+                    deviceItemOnClickCallback.onDeviceItemGearClicked(item, it)
+                }
+            }
+        }
+    }
+
+    internal companion object {
+        const val MIN_HEIGHT_CHANGE_INTERVAL_MS = 800L
+        const val MAX_DEVICE_ITEM_ENTRY = 3
+        const val ACTION_BLUETOOTH_DEVICE_DETAILS =
+            "com.android.settings.BLUETOOTH_DEVICE_DETAIL_SETTINGS"
+        const val ACTION_PREVIOUSLY_CONNECTED_DEVICE =
+            "com.android.settings.PREVIOUSLY_CONNECTED_DEVICE"
+        const val ACTION_PAIR_NEW_DEVICE = "android.settings.BLUETOOTH_PAIRING_SETTINGS"
+        const val DISABLED_ALPHA = 0.3f
+        const val ENABLED_ALPHA = 1f
+        const val PROGRESS_BAR_ANIMATION_DURATION_MS = 1500L
+
+        private fun Boolean.toInt(): Int {
+            return if (this) 1 else 0
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogLogger.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogLogger.kt
new file mode 100644
index 0000000..c30aea0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogLogger.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.
+ */
+
+package com.android.systemui.bluetooth.qsdialog
+
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.core.LogLevel.DEBUG
+import com.android.systemui.log.dagger.BluetoothTileDialogLog
+import javax.inject.Inject
+
+private const val TAG = "BluetoothTileDialogLog"
+
+enum class BluetoothStateStage {
+    USER_TOGGLED,
+    BLUETOOTH_STATE_VALUE_SET,
+    BLUETOOTH_STATE_CHANGE_RECEIVED
+}
+
+enum class DeviceFetchTrigger {
+    FIRST_LOAD,
+    BLUETOOTH_STATE_CHANGE_RECEIVED,
+    BLUETOOTH_CALLBACK_RECEIVED
+}
+
+enum class JobStatus {
+    FINISHED,
+    CANCELLED
+}
+
+class BluetoothTileDialogLogger
+@Inject
+constructor(@BluetoothTileDialogLog private val logBuffer: LogBuffer) {
+
+    fun logBluetoothState(stage: BluetoothStateStage, state: String) =
+        logBuffer.log(
+            TAG,
+            DEBUG,
+            {
+                str1 = stage.toString()
+                str2 = state
+            },
+            { "BluetoothState. stage=$str1 state=$str2" }
+        )
+
+    fun logDeviceClick(address: String, type: DeviceItemType) =
+        logBuffer.log(
+            TAG,
+            DEBUG,
+            {
+                str1 = address
+                str2 = type.toString()
+            },
+            { "DeviceClick. address=$str1 type=$str2" }
+        )
+
+    fun logActiveDeviceChanged(address: String?, profileId: Int) =
+        logBuffer.log(
+            TAG,
+            DEBUG,
+            {
+                str1 = address
+                int1 = profileId
+            },
+            { "ActiveDeviceChanged. address=$str1 profileId=$int1" }
+        )
+
+    fun logProfileConnectionStateChanged(address: String, state: String, profileId: Int) =
+        logBuffer.log(
+            TAG,
+            DEBUG,
+            {
+                str1 = address
+                str2 = state
+                int1 = profileId
+            },
+            { "ProfileConnectionStateChanged. address=$str1 state=$str2 profileId=$int1" }
+        )
+
+    fun logDeviceFetch(status: JobStatus, trigger: DeviceFetchTrigger, duration: Long) =
+        logBuffer.log(
+            TAG,
+            DEBUG,
+            {
+                str1 = status.toString()
+                str2 = trigger.toString()
+                long1 = duration
+            },
+            { "DeviceFetch. status=$str1 trigger=$str2 duration=$long1" }
+        )
+
+    fun logDeviceUiUpdate(duration: Long) =
+        logBuffer.log(TAG, DEBUG, { long1 = duration }, { "DeviceUiUpdate. duration=$long1" })
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogRepository.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogRepository.kt
new file mode 100644
index 0000000..6e51915
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogRepository.kt
@@ -0,0 +1,45 @@
+/*
+ * 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.bluetooth.qsdialog
+
+import android.bluetooth.BluetoothAdapter
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+
+/** Repository to get CachedBluetoothDevices for the Bluetooth Dialog. */
+@SysUISingleton
+internal class BluetoothTileDialogRepository
+@Inject
+constructor(
+    private val localBluetoothManager: LocalBluetoothManager?,
+    private val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
+) {
+    internal val cachedDevices: Collection<CachedBluetoothDevice>
+        get() {
+            return if (
+                localBluetoothManager == null ||
+                    bluetoothAdapter == null ||
+                    !bluetoothAdapter.isEnabled
+            ) {
+                emptyList()
+            } else {
+                localBluetoothManager.cachedDeviceManager.cachedDevicesCopy
+            }
+        }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogUiEvent.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogUiEvent.kt
new file mode 100644
index 0000000..add1647
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogUiEvent.kt
@@ -0,0 +1,38 @@
+/*
+ * 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.bluetooth.qsdialog
+
+import com.android.internal.logging.UiEvent
+import com.android.internal.logging.UiEventLogger
+
+/** UI Events for the bluetooth tile dialog. */
+enum class BluetoothTileDialogUiEvent(val metricId: Int) : UiEventLogger.UiEventEnum {
+    @UiEvent(doc = "The bluetooth tile dialog is shown") BLUETOOTH_TILE_DIALOG_SHOWN(1493),
+    @UiEvent(doc = "The master toggle is clicked") BLUETOOTH_TOGGLE_CLICKED(1494),
+    @UiEvent(doc = "Pair new device is clicked") PAIR_NEW_DEVICE_CLICKED(1495),
+    @UiEvent(doc = "See all is clicked") SEE_ALL_CLICKED(1496),
+    @UiEvent(doc = "Gear icon clicked") DEVICE_GEAR_CLICKED(1497),
+    @UiEvent(doc = "Device clicked") DEVICE_CLICKED(1498),
+    @UiEvent(doc = "Connected device clicked to active") CONNECTED_DEVICE_SET_ACTIVE(1499),
+    @UiEvent(doc = "Saved clicked to connect") SAVED_DEVICE_CONNECT(1500),
+    @UiEvent(doc = "Active device clicked to disconnect") ACTIVE_DEVICE_DISCONNECT(1507),
+    @UiEvent(doc = "Connected other device clicked to disconnect")
+    CONNECTED_OTHER_DEVICE_DISCONNECT(1508),
+    @UiEvent(doc = "The auto on toggle is clicked") BLUETOOTH_AUTO_ON_TOGGLE_CLICKED(1617);
+
+    override fun getId() = metricId
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt
new file mode 100644
index 0000000..e65b657
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt
@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.bluetooth.qsdialog
+
+import android.content.Intent
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.View
+import android.view.View.GONE
+import android.view.View.VISIBLE
+import android.view.ViewGroup
+import androidx.annotation.DimenRes
+import androidx.annotation.StringRes
+import androidx.annotation.VisibleForTesting
+import com.android.internal.jank.InteractionJankMonitor
+import com.android.internal.logging.UiEventLogger
+import com.android.systemui.Prefs
+import com.android.systemui.animation.DialogCuj
+import com.android.systemui.animation.DialogTransitionAnimator
+import com.android.systemui.bluetooth.qsdialog.BluetoothTileDialogDelegate.Companion.ACTION_BLUETOOTH_DEVICE_DETAILS
+import com.android.systemui.bluetooth.qsdialog.BluetoothTileDialogDelegate.Companion.ACTION_PAIR_NEW_DEVICE
+import com.android.systemui.bluetooth.qsdialog.BluetoothTileDialogDelegate.Companion.ACTION_PREVIOUSLY_CONNECTED_DEVICE
+import com.android.systemui.bluetooth.qsdialog.BluetoothTileDialogDelegate.Companion.MAX_DEVICE_ITEM_ENTRY
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.res.R
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.channels.produce
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+/** ViewModel for Bluetooth Dialog after clicking on the Bluetooth QS tile. */
+@SysUISingleton
+internal class BluetoothTileDialogViewModel
+@Inject
+constructor(
+    private val deviceItemInteractor: DeviceItemInteractor,
+    private val bluetoothStateInteractor: BluetoothStateInteractor,
+    private val bluetoothAutoOnInteractor: BluetoothAutoOnInteractor,
+    private val dialogTransitionAnimator: DialogTransitionAnimator,
+    private val activityStarter: ActivityStarter,
+    private val uiEventLogger: UiEventLogger,
+    @Application private val coroutineScope: CoroutineScope,
+    @Main private val mainDispatcher: CoroutineDispatcher,
+    @Background private val backgroundDispatcher: CoroutineDispatcher,
+    @Main private val sharedPreferences: SharedPreferences,
+    private val bluetoothDialogDelegateFactory: BluetoothTileDialogDelegate.Factory,
+) : BluetoothTileDialogCallback {
+
+    private var job: Job? = null
+
+    /**
+     * Shows the dialog.
+     *
+     * @param view The view from which the dialog is shown.
+     */
+    @kotlinx.coroutines.ExperimentalCoroutinesApi
+    fun showDialog(view: View?) {
+        cancelJob()
+
+        job =
+            coroutineScope.launch(mainDispatcher) {
+                var updateDeviceItemJob: Job?
+                var updateDialogUiJob: Job? = null
+                val dialogDelegate = createBluetoothTileDialog()
+                val dialog = dialogDelegate.createDialog()
+                val context = dialog.context
+
+                view?.let {
+                    dialogTransitionAnimator.showFromView(
+                        dialog,
+                        it,
+                        animateBackgroundBoundsChange = true,
+                        cuj =
+                            DialogCuj(
+                                InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
+                                INTERACTION_JANK_TAG
+                            )
+                    )
+                }
+                    ?: dialog.show()
+
+                updateDeviceItemJob = launch {
+                    deviceItemInteractor.updateDeviceItems(context, DeviceFetchTrigger.FIRST_LOAD)
+                }
+
+                // deviceItemUpdate is emitted when device item list is done fetching, update UI and
+                // stop the progress bar.
+                deviceItemInteractor.deviceItemUpdate
+                    .onEach {
+                        updateDialogUiJob?.cancel()
+                        updateDialogUiJob = launch {
+                            dialogDelegate.apply {
+                                onDeviceItemUpdated(
+                                    dialog,
+                                    it.take(MAX_DEVICE_ITEM_ENTRY),
+                                    showSeeAll = it.size > MAX_DEVICE_ITEM_ENTRY,
+                                    showPairNewDevice = bluetoothStateInteractor.isBluetoothEnabled
+                                )
+                                animateProgressBar(dialog, false)
+                            }
+                        }
+                    }
+                    .launchIn(this)
+
+                // deviceItemUpdateRequest is emitted when a bluetooth callback is called, re-fetch
+                // the device item list and animiate the progress bar.
+                deviceItemInteractor.deviceItemUpdateRequest
+                    .onEach {
+                        dialogDelegate.animateProgressBar(dialog, true)
+                        updateDeviceItemJob?.cancel()
+                        updateDeviceItemJob = launch {
+                            deviceItemInteractor.updateDeviceItems(
+                                context,
+                                DeviceFetchTrigger.BLUETOOTH_CALLBACK_RECEIVED
+                            )
+                        }
+                    }
+                    .launchIn(this)
+
+                // bluetoothStateUpdate is emitted when bluetooth on/off state is changed, re-fetch
+                // the device item list.
+                bluetoothStateInteractor.bluetoothStateUpdate
+                    .filterNotNull()
+                    .onEach {
+                        dialogDelegate.onBluetoothStateUpdated(
+                            dialog,
+                            it,
+                            UiProperties.build(it, isAutoOnToggleFeatureAvailable())
+                        )
+                        updateDeviceItemJob?.cancel()
+                        updateDeviceItemJob = launch {
+                            deviceItemInteractor.updateDeviceItems(
+                                context,
+                                DeviceFetchTrigger.BLUETOOTH_STATE_CHANGE_RECEIVED
+                            )
+                        }
+                    }
+                    .launchIn(this)
+
+                // bluetoothStateToggle is emitted when user toggles the bluetooth state switch,
+                // send the new value to the bluetoothStateInteractor and animate the progress bar.
+                dialogDelegate.bluetoothStateToggle
+                    .onEach {
+                        dialogDelegate.animateProgressBar(dialog, true)
+                        bluetoothStateInteractor.isBluetoothEnabled = it
+                    }
+                    .launchIn(this)
+
+                // deviceItemClick is emitted when user clicked on a device item.
+                dialogDelegate.deviceItemClick
+                    .onEach { deviceItemInteractor.updateDeviceItemOnClick(it) }
+                    .launchIn(this)
+
+                // contentHeight is emitted when the dialog is dismissed.
+                dialogDelegate.contentHeight
+                    .onEach {
+                        withContext(backgroundDispatcher) {
+                            sharedPreferences.edit().putInt(CONTENT_HEIGHT_PREF_KEY, it).apply()
+                        }
+                    }
+                    .launchIn(this)
+
+                if (isAutoOnToggleFeatureAvailable()) {
+                    // bluetoothAutoOnUpdate is emitted when bluetooth auto on on/off state is
+                    // changed.
+                    bluetoothAutoOnInteractor.isEnabled
+                        .onEach {
+                            dialogDelegate.onBluetoothAutoOnUpdated(
+                                dialog,
+                                it,
+                                if (it) R.string.turn_on_bluetooth_auto_info_enabled
+                                else R.string.turn_on_bluetooth_auto_info_disabled
+                            )
+                        }
+                        .launchIn(this)
+
+                    // bluetoothAutoOnToggle is emitted when user toggles the bluetooth auto on
+                    // switch, send the new value to the bluetoothAutoOnInteractor.
+                    dialogDelegate.bluetoothAutoOnToggle
+                        .filterNotNull()
+                        .onEach { bluetoothAutoOnInteractor.setEnabled(it) }
+                        .launchIn(this)
+                }
+
+                produce<Unit> { awaitClose { dialog.cancel() } }
+            }
+    }
+
+    private suspend fun createBluetoothTileDialog(): BluetoothTileDialogDelegate {
+        val cachedContentHeight =
+            withContext(backgroundDispatcher) {
+                sharedPreferences.getInt(
+                    CONTENT_HEIGHT_PREF_KEY,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
+                )
+            }
+
+        return bluetoothDialogDelegateFactory.create(
+            UiProperties.build(
+                bluetoothStateInteractor.isBluetoothEnabled,
+                isAutoOnToggleFeatureAvailable()
+            ),
+            cachedContentHeight,
+            bluetoothStateInteractor.isBluetoothEnabled,
+            this@BluetoothTileDialogViewModel,
+            { cancelJob() }
+        )
+    }
+
+    override fun onDeviceItemGearClicked(deviceItem: DeviceItem, view: View) {
+        uiEventLogger.log(BluetoothTileDialogUiEvent.DEVICE_GEAR_CLICKED)
+        val intent =
+            Intent(ACTION_BLUETOOTH_DEVICE_DETAILS).apply {
+                putExtra(
+                    ":settings:show_fragment_args",
+                    Bundle().apply {
+                        putString("device_address", deviceItem.cachedBluetoothDevice.address)
+                    }
+                )
+            }
+        startSettingsActivity(intent, view)
+    }
+
+    override fun onSeeAllClicked(view: View) {
+        uiEventLogger.log(BluetoothTileDialogUiEvent.SEE_ALL_CLICKED)
+        startSettingsActivity(Intent(ACTION_PREVIOUSLY_CONNECTED_DEVICE), view)
+    }
+
+    override fun onPairNewDeviceClicked(view: View) {
+        uiEventLogger.log(BluetoothTileDialogUiEvent.PAIR_NEW_DEVICE_CLICKED)
+        startSettingsActivity(Intent(ACTION_PAIR_NEW_DEVICE), view)
+    }
+
+    private fun cancelJob() {
+        job?.cancel()
+        job = null
+    }
+
+    private fun startSettingsActivity(intent: Intent, view: View) {
+        if (job?.isActive == true) {
+            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
+            activityStarter.postStartActivityDismissingKeyguard(
+                intent,
+                0,
+                dialogTransitionAnimator.createActivityTransitionController(view)
+            )
+        }
+    }
+
+    @VisibleForTesting
+    internal suspend fun isAutoOnToggleFeatureAvailable() =
+        bluetoothAutoOnInteractor.isAutoOnSupported()
+
+    companion object {
+        private const val INTERACTION_JANK_TAG = "bluetooth_tile_dialog"
+        private const val CONTENT_HEIGHT_PREF_KEY = Prefs.Key.BLUETOOTH_TILE_DIALOG_CONTENT_HEIGHT
+        private fun getSubtitleResId(isBluetoothEnabled: Boolean) =
+            if (isBluetoothEnabled) R.string.quick_settings_bluetooth_tile_subtitle
+            else R.string.bt_is_off
+    }
+
+    internal data class UiProperties(
+        @StringRes val subTitleResId: Int,
+        val autoOnToggleVisibility: Int,
+        @DimenRes val scrollViewMinHeightResId: Int,
+    ) {
+        companion object {
+            internal fun build(
+                isBluetoothEnabled: Boolean,
+                isAutoOnToggleFeatureAvailable: Boolean
+            ) =
+                UiProperties(
+                    subTitleResId = getSubtitleResId(isBluetoothEnabled),
+                    autoOnToggleVisibility =
+                        if (isAutoOnToggleFeatureAvailable && !isBluetoothEnabled) VISIBLE
+                        else GONE,
+                    scrollViewMinHeightResId =
+                        if (isAutoOnToggleFeatureAvailable)
+                            R.dimen.bluetooth_dialog_scroll_view_min_height_with_auto_on
+                        else R.dimen.bluetooth_dialog_scroll_view_min_height
+                )
+        }
+    }
+}
+
+interface BluetoothTileDialogCallback {
+    fun onDeviceItemGearClicked(deviceItem: DeviceItem, view: View)
+    fun onSeeAllClicked(view: View)
+    fun onPairNewDeviceClicked(view: View)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItem.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItem.kt
new file mode 100644
index 0000000..dc5efef
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItem.kt
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+/*
+ * 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.bluetooth.qsdialog
+
+import android.graphics.drawable.Drawable
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+
+enum class DeviceItemType {
+    ACTIVE_MEDIA_BLUETOOTH_DEVICE,
+    AVAILABLE_MEDIA_BLUETOOTH_DEVICE,
+    CONNECTED_BLUETOOTH_DEVICE,
+    SAVED_BLUETOOTH_DEVICE,
+}
+
+data class DeviceItem(
+    val type: DeviceItemType,
+    val cachedBluetoothDevice: CachedBluetoothDevice,
+    val deviceName: String = "",
+    val connectionSummary: String = "",
+    val iconWithDescription: Pair<Drawable, String>? = null,
+    val background: Int? = null,
+    var isEnabled: Boolean = true,
+    var actionAccessibilityLabel: String = "",
+)
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactory.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactory.kt
new file mode 100644
index 0000000..f04ba75
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactory.kt
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.bluetooth.qsdialog
+
+import android.bluetooth.BluetoothDevice
+import android.content.Context
+import android.media.AudioManager
+import com.android.settingslib.bluetooth.BluetoothUtils
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.settingslib.flags.Flags
+import com.android.systemui.res.R
+
+private val backgroundOn = R.drawable.settingslib_switch_bar_bg_on
+private val backgroundOff = R.drawable.bluetooth_tile_dialog_bg_off
+private val backgroundOffBusy = R.drawable.bluetooth_tile_dialog_bg_off_busy
+private val connected = R.string.quick_settings_bluetooth_device_connected
+private val saved = R.string.quick_settings_bluetooth_device_saved
+private val actionAccessibilityLabelActivate =
+    R.string.accessibility_quick_settings_bluetooth_device_tap_to_activate
+private val actionAccessibilityLabelDisconnect =
+    R.string.accessibility_quick_settings_bluetooth_device_tap_to_disconnect
+
+/** Factories to create different types of Bluetooth device items from CachedBluetoothDevice. */
+internal abstract class DeviceItemFactory {
+    abstract fun isFilterMatched(
+        context: Context,
+        cachedDevice: CachedBluetoothDevice,
+        audioManager: AudioManager?
+    ): Boolean
+
+    abstract fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem
+}
+
+internal open class ActiveMediaDeviceItemFactory : DeviceItemFactory() {
+    override fun isFilterMatched(
+        context: Context,
+        cachedDevice: CachedBluetoothDevice,
+        audioManager: AudioManager?
+    ): Boolean {
+        return BluetoothUtils.isActiveMediaDevice(cachedDevice) &&
+            BluetoothUtils.isAvailableMediaBluetoothDevice(cachedDevice, audioManager)
+    }
+
+    override fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem {
+        return DeviceItem(
+            type = DeviceItemType.ACTIVE_MEDIA_BLUETOOTH_DEVICE,
+            cachedBluetoothDevice = cachedDevice,
+            deviceName = cachedDevice.name,
+            connectionSummary = cachedDevice.connectionSummary ?: "",
+            iconWithDescription =
+                BluetoothUtils.getBtClassDrawableWithDescription(context, cachedDevice).let { p ->
+                    Pair(p.first, p.second)
+                },
+            background = backgroundOn,
+            isEnabled = !cachedDevice.isBusy,
+            actionAccessibilityLabel = context.getString(actionAccessibilityLabelDisconnect),
+        )
+    }
+}
+
+internal class ActiveHearingDeviceItemFactory : ActiveMediaDeviceItemFactory() {
+    override fun isFilterMatched(
+        context: Context,
+        cachedDevice: CachedBluetoothDevice,
+        audioManager: AudioManager?
+    ): Boolean {
+        return BluetoothUtils.isActiveMediaDevice(cachedDevice) &&
+            BluetoothUtils.isAvailableHearingDevice(cachedDevice)
+    }
+}
+
+internal open class AvailableMediaDeviceItemFactory : DeviceItemFactory() {
+    override fun isFilterMatched(
+        context: Context,
+        cachedDevice: CachedBluetoothDevice,
+        audioManager: AudioManager?
+    ): Boolean {
+        return !BluetoothUtils.isActiveMediaDevice(cachedDevice) &&
+            BluetoothUtils.isAvailableMediaBluetoothDevice(cachedDevice, audioManager)
+    }
+
+    // TODO(b/298124674): move create() to the abstract class to reduce duplicate code
+    override fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem {
+        return DeviceItem(
+            type = DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE,
+            cachedBluetoothDevice = cachedDevice,
+            deviceName = cachedDevice.name,
+            connectionSummary = cachedDevice.connectionSummary.takeUnless { it.isNullOrEmpty() }
+                    ?: context.getString(connected),
+            iconWithDescription =
+                BluetoothUtils.getBtClassDrawableWithDescription(context, cachedDevice).let { p ->
+                    Pair(p.first, p.second)
+                },
+            background = if (cachedDevice.isBusy) backgroundOffBusy else backgroundOff,
+            isEnabled = !cachedDevice.isBusy,
+            actionAccessibilityLabel = context.getString(actionAccessibilityLabelActivate),
+        )
+    }
+}
+
+internal class AvailableHearingDeviceItemFactory : ActiveMediaDeviceItemFactory() {
+    override fun isFilterMatched(
+        context: Context,
+        cachedDevice: CachedBluetoothDevice,
+        audioManager: AudioManager?
+    ): Boolean {
+        return !BluetoothUtils.isActiveMediaDevice(cachedDevice) &&
+            BluetoothUtils.isAvailableHearingDevice(cachedDevice)
+    }
+}
+
+internal class ConnectedDeviceItemFactory : DeviceItemFactory() {
+    override fun isFilterMatched(
+        context: Context,
+        cachedDevice: CachedBluetoothDevice,
+        audioManager: AudioManager?
+    ): Boolean {
+        return if (Flags.enableHideExclusivelyManagedBluetoothDevice()) {
+            !BluetoothUtils.isExclusivelyManagedBluetoothDevice(
+                context,
+                cachedDevice.getDevice()
+            ) && BluetoothUtils.isConnectedBluetoothDevice(cachedDevice, audioManager)
+        } else {
+            BluetoothUtils.isConnectedBluetoothDevice(cachedDevice, audioManager)
+        }
+    }
+
+    override fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem {
+        return DeviceItem(
+            type = DeviceItemType.CONNECTED_BLUETOOTH_DEVICE,
+            cachedBluetoothDevice = cachedDevice,
+            deviceName = cachedDevice.name,
+            connectionSummary = cachedDevice.connectionSummary.takeUnless { it.isNullOrEmpty() }
+                    ?: context.getString(connected),
+            iconWithDescription =
+                BluetoothUtils.getBtClassDrawableWithDescription(context, cachedDevice).let { p ->
+                    Pair(p.first, p.second)
+                },
+            background = if (cachedDevice.isBusy) backgroundOffBusy else backgroundOff,
+            isEnabled = !cachedDevice.isBusy,
+            actionAccessibilityLabel = context.getString(actionAccessibilityLabelDisconnect),
+        )
+    }
+}
+
+internal open class SavedDeviceItemFactory : DeviceItemFactory() {
+    override fun isFilterMatched(
+        context: Context,
+        cachedDevice: CachedBluetoothDevice,
+        audioManager: AudioManager?
+    ): Boolean {
+        return if (Flags.enableHideExclusivelyManagedBluetoothDevice()) {
+            !BluetoothUtils.isExclusivelyManagedBluetoothDevice(
+                context,
+                cachedDevice.getDevice()
+            ) && cachedDevice.bondState == BluetoothDevice.BOND_BONDED && !cachedDevice.isConnected
+        } else {
+            cachedDevice.bondState == BluetoothDevice.BOND_BONDED && !cachedDevice.isConnected
+        }
+    }
+
+    override fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem {
+        return DeviceItem(
+            type = DeviceItemType.SAVED_BLUETOOTH_DEVICE,
+            cachedBluetoothDevice = cachedDevice,
+            deviceName = cachedDevice.name,
+            connectionSummary = cachedDevice.connectionSummary.takeUnless { it.isNullOrEmpty() }
+                    ?: context.getString(saved),
+            iconWithDescription =
+                BluetoothUtils.getBtClassDrawableWithDescription(context, cachedDevice).let { p ->
+                    Pair(p.first, p.second)
+                },
+            background = if (cachedDevice.isBusy) backgroundOffBusy else backgroundOff,
+            isEnabled = !cachedDevice.isBusy,
+            actionAccessibilityLabel = context.getString(actionAccessibilityLabelActivate),
+        )
+    }
+}
+
+internal class SavedHearingDeviceItemFactory : SavedDeviceItemFactory() {
+    override fun isFilterMatched(
+        context: Context,
+        cachedDevice: CachedBluetoothDevice,
+        audioManager: AudioManager?
+    ): Boolean {
+        return if (Flags.enableHideExclusivelyManagedBluetoothDevice()) {
+            !BluetoothUtils.isExclusivelyManagedBluetoothDevice(
+                context,
+                cachedDevice.getDevice()
+            ) &&
+                cachedDevice.isHearingAidDevice &&
+                cachedDevice.bondState == BluetoothDevice.BOND_BONDED &&
+                !cachedDevice.isConnected
+        } else {
+            cachedDevice.isHearingAidDevice &&
+                cachedDevice.bondState == BluetoothDevice.BOND_BONDED &&
+                !cachedDevice.isConnected
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractor.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractor.kt
new file mode 100644
index 0000000..4e28caf
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractor.kt
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.bluetooth.qsdialog
+
+import android.bluetooth.BluetoothAdapter
+import android.bluetooth.BluetoothDevice
+import android.content.Context
+import android.media.AudioManager
+import com.android.internal.logging.UiEventLogger
+import com.android.settingslib.bluetooth.BluetoothCallback
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
+import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.util.time.SystemClock
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.SharedFlow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.asSharedFlow
+import kotlinx.coroutines.flow.shareIn
+import kotlinx.coroutines.isActive
+import kotlinx.coroutines.withContext
+
+/** Holds business logic for the Bluetooth Dialog after clicking on the Bluetooth QS tile. */
+@SysUISingleton
+internal class DeviceItemInteractor
+@Inject
+constructor(
+    private val bluetoothTileDialogRepository: BluetoothTileDialogRepository,
+    private val audioManager: AudioManager,
+    private val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter(),
+    private val localBluetoothManager: LocalBluetoothManager?,
+    private val systemClock: SystemClock,
+    private val uiEventLogger: UiEventLogger,
+    private val logger: BluetoothTileDialogLogger,
+    @Application private val coroutineScope: CoroutineScope,
+    @Background private val backgroundDispatcher: CoroutineDispatcher,
+) {
+
+    private val mutableDeviceItemUpdate: MutableSharedFlow<List<DeviceItem>> =
+        MutableSharedFlow(extraBufferCapacity = 1)
+    internal val deviceItemUpdate
+        get() = mutableDeviceItemUpdate.asSharedFlow()
+
+    internal val deviceItemUpdateRequest: SharedFlow<Unit> =
+        conflatedCallbackFlow {
+                val listener =
+                    object : BluetoothCallback {
+                        override fun onActiveDeviceChanged(
+                            activeDevice: CachedBluetoothDevice?,
+                            bluetoothProfile: Int
+                        ) {
+                            super.onActiveDeviceChanged(activeDevice, bluetoothProfile)
+                            logger.logActiveDeviceChanged(activeDevice?.address, bluetoothProfile)
+                            trySendWithFailureLogging(Unit, TAG, "onActiveDeviceChanged")
+                        }
+
+                        override fun onProfileConnectionStateChanged(
+                            cachedDevice: CachedBluetoothDevice,
+                            state: Int,
+                            bluetoothProfile: Int
+                        ) {
+                            super.onProfileConnectionStateChanged(
+                                cachedDevice,
+                                state,
+                                bluetoothProfile
+                            )
+                            logger.logProfileConnectionStateChanged(
+                                cachedDevice.address,
+                                state.toString(),
+                                bluetoothProfile
+                            )
+                            trySendWithFailureLogging(Unit, TAG, "onProfileConnectionStateChanged")
+                        }
+
+                        override fun onAclConnectionStateChanged(
+                            cachedDevice: CachedBluetoothDevice,
+                            state: Int
+                        ) {
+                            super.onAclConnectionStateChanged(cachedDevice, state)
+                            // Listen only when a device is disconnecting
+                            if (state == 0) {
+                                trySendWithFailureLogging(Unit, TAG, "onAclConnectionStateChanged")
+                            }
+                        }
+                    }
+                localBluetoothManager?.eventManager?.registerCallback(listener)
+                awaitClose { localBluetoothManager?.eventManager?.unregisterCallback(listener) }
+            }
+            .shareIn(coroutineScope, SharingStarted.WhileSubscribed(replayExpirationMillis = 0))
+
+    private var deviceItemFactoryList: List<DeviceItemFactory> =
+        listOf(
+            ActiveMediaDeviceItemFactory(),
+            AvailableMediaDeviceItemFactory(),
+            ConnectedDeviceItemFactory(),
+            SavedDeviceItemFactory()
+        )
+
+    private var displayPriority: List<DeviceItemType> =
+        listOf(
+            DeviceItemType.ACTIVE_MEDIA_BLUETOOTH_DEVICE,
+            DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE,
+            DeviceItemType.CONNECTED_BLUETOOTH_DEVICE,
+            DeviceItemType.SAVED_BLUETOOTH_DEVICE,
+        )
+
+    internal suspend fun updateDeviceItems(context: Context, trigger: DeviceFetchTrigger) {
+        withContext(backgroundDispatcher) {
+            val start = systemClock.elapsedRealtime()
+            val deviceItems =
+                bluetoothTileDialogRepository.cachedDevices
+                    .mapNotNull { cachedDevice ->
+                        deviceItemFactoryList
+                            .firstOrNull { it.isFilterMatched(context, cachedDevice, audioManager) }
+                            ?.create(context, cachedDevice)
+                    }
+                    .sort(displayPriority, bluetoothAdapter?.mostRecentlyConnectedDevices)
+            // Only emit when the job is not cancelled
+            if (isActive) {
+                mutableDeviceItemUpdate.tryEmit(deviceItems)
+                logger.logDeviceFetch(
+                    JobStatus.FINISHED,
+                    trigger,
+                    systemClock.elapsedRealtime() - start
+                )
+            } else {
+                logger.logDeviceFetch(
+                    JobStatus.CANCELLED,
+                    trigger,
+                    systemClock.elapsedRealtime() - start
+                )
+            }
+        }
+    }
+
+    private fun List<DeviceItem>.sort(
+        displayPriority: List<DeviceItemType>,
+        mostRecentlyConnectedDevices: List<BluetoothDevice>?
+    ): List<DeviceItem> {
+        return this.sortedWith(
+            compareBy<DeviceItem> { displayPriority.indexOf(it.type) }
+                .thenBy {
+                    mostRecentlyConnectedDevices?.indexOf(it.cachedBluetoothDevice.device) ?: 0
+                }
+        )
+    }
+
+    internal suspend fun updateDeviceItemOnClick(deviceItem: DeviceItem) {
+        withContext(backgroundDispatcher) {
+            logger.logDeviceClick(deviceItem.cachedBluetoothDevice.address, deviceItem.type)
+
+            deviceItem.cachedBluetoothDevice.apply {
+                when (deviceItem.type) {
+                    DeviceItemType.ACTIVE_MEDIA_BLUETOOTH_DEVICE -> {
+                        disconnect()
+                        uiEventLogger.log(BluetoothTileDialogUiEvent.ACTIVE_DEVICE_DISCONNECT)
+                    }
+                    DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE -> {
+                        setActive()
+                        uiEventLogger.log(BluetoothTileDialogUiEvent.CONNECTED_DEVICE_SET_ACTIVE)
+                    }
+                    DeviceItemType.CONNECTED_BLUETOOTH_DEVICE -> {
+                        disconnect()
+                        uiEventLogger.log(
+                            BluetoothTileDialogUiEvent.CONNECTED_OTHER_DEVICE_DISCONNECT
+                        )
+                    }
+                    DeviceItemType.SAVED_BLUETOOTH_DEVICE -> {
+                        connect()
+                        uiEventLogger.log(BluetoothTileDialogUiEvent.SAVED_DEVICE_CONNECT)
+                    }
+                }
+            }
+        }
+    }
+
+    internal fun setDeviceItemFactoryListForTesting(list: List<DeviceItemFactory>) {
+        deviceItemFactoryList = list
+    }
+
+    internal fun setDisplayPriorityForTesting(list: List<DeviceItemType>) {
+        displayPriority = list
+    }
+
+    companion object {
+        private const val TAG = "DeviceItemInteractor"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt
index 000f03a..7525ce0 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt
@@ -21,16 +21,27 @@
 import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
 import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
 import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+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.plugins.statusbar.StatusBarStateController
 import com.android.systemui.statusbar.policy.KeyguardStateController
 import com.android.systemui.util.time.SystemClock
+import dagger.Lazy
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.SharingStarted.Companion.WhileSubscribed
 import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.stateIn
 
@@ -46,12 +57,15 @@
     private val biometricSettingsRepository: BiometricSettingsRepository,
     private val systemClock: SystemClock,
     private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
+    private val deviceEntryFingerprintAuthInteractor: Lazy<DeviceEntryFingerprintAuthInteractor>,
+    private val keyguardInteractor: Lazy<KeyguardInteractor>,
+    keyguardTransitionInteractor: Lazy<KeyguardTransitionInteractor>,
     @Application scope: CoroutineScope,
 ) {
     var receivedDownTouch = false
     val isVisible: Flow<Boolean> = bouncerRepository.alternateBouncerVisible
     private val alternateBouncerUiAvailableFromSource: HashSet<String> = HashSet()
-    private val alternateBouncerSupported: StateFlow<Boolean> =
+    val alternateBouncerSupported: StateFlow<Boolean> =
         if (DeviceEntryUdfpsRefactor.isEnabled) {
             fingerprintPropertyRepository.sensorType
                 .map { sensorType -> sensorType.isUdfps() || sensorType.isPowerButton() }
@@ -63,13 +77,80 @@
         } else {
             bouncerRepository.alternateBouncerUIAvailable
         }
+    private val isDozingOrAod: Flow<Boolean> =
+        keyguardTransitionInteractor
+            .get()
+            .transitions
+            .map {
+                it.to == KeyguardState.DOZING ||
+                    it.to == KeyguardState.AOD ||
+                    ((it.from == KeyguardState.DOZING || it.from == KeyguardState.AOD) &&
+                        it.transitionState != TransitionState.FINISHED)
+            }
+            .distinctUntilChanged()
+
+    /**
+     * Whether the current biometric, bouncer, and keyguard states allow the alternate bouncer to
+     * show.
+     */
+    val canShowAlternateBouncer: StateFlow<Boolean> =
+        alternateBouncerSupported
+            .flatMapLatest { alternateBouncerSupported ->
+                if (alternateBouncerSupported) {
+                    keyguardTransitionInteractor.get().currentKeyguardState.flatMapLatest {
+                        currentKeyguardState ->
+                        if (currentKeyguardState == KeyguardState.GONE) {
+                            flowOf(false)
+                        } else {
+                            combine(
+                                deviceEntryFingerprintAuthInteractor
+                                    .get()
+                                    .isFingerprintAuthCurrentlyAllowed,
+                                keyguardInteractor.get().isKeyguardDismissible,
+                                bouncerRepository.primaryBouncerShow,
+                                isDozingOrAod
+                            ) {
+                                fingerprintAllowed,
+                                keyguardDismissible,
+                                primaryBouncerShowing,
+                                dozing ->
+                                fingerprintAllowed &&
+                                    !keyguardDismissible &&
+                                    !primaryBouncerShowing &&
+                                    !dozing
+                            }
+                        }
+                    }
+                } else {
+                    flowOf(false)
+                }
+            }
+            .stateIn(
+                scope = scope,
+                started = WhileSubscribed(),
+                initialValue = false,
+            )
+
+    /**
+     * Always shows the alternate bouncer. Requesters must check [canShowAlternateBouncer]` before
+     * calling this.
+     */
+    fun forceShow() {
+        if (DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode()) {
+            show()
+            return
+        }
+        bouncerRepository.setAlternateVisible(true)
+    }
 
     /**
      * Sets the correct bouncer states to show the alternate bouncer if it can show.
      *
      * @return whether alternateBouncer is visible
+     * @deprecated use [forceShow] and manually check [canShowAlternateBouncer] beforehand
      */
     fun show(): Boolean {
+        DeviceEntryUdfpsRefactor.assertInLegacyMode()
         bouncerRepository.setAlternateVisible(canShowAlternateBouncerForFingerprint())
         return isVisibleState()
     }
@@ -105,6 +186,9 @@
     }
 
     fun canShowAlternateBouncerForFingerprint(): Boolean {
+        if (DeviceEntryUdfpsRefactor.isEnabled) {
+            return canShowAlternateBouncer.value
+        }
         return alternateBouncerSupported.value &&
             biometricSettingsRepository.isFingerprintAuthCurrentlyAllowed.value &&
             !keyguardUpdateMonitor.isFingerprintLockedOut &&
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt
index 893887f..d88b3dc 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt
@@ -45,6 +45,7 @@
 import com.android.systemui.keyguard.data.repository.TrustRepository
 import com.android.systemui.plugins.ActivityStarter
 import com.android.systemui.res.R
+import com.android.systemui.scene.shared.flag.SceneContainerFlag
 import com.android.systemui.shared.system.SysUiStatsLog
 import com.android.systemui.statusbar.policy.KeyguardStateController
 import com.android.systemui.user.domain.interactor.SelectedUserInteractor
@@ -158,6 +159,10 @@
     /** Show the bouncer if necessary and set the relevant states. */
     @JvmOverloads
     fun show(isScrimmed: Boolean) {
+        // When the scene container framework is enabled, instead of calling this, call
+        // SceneInteractor#changeScene(Scenes.Bouncer, ...).
+        SceneContainerFlag.assertInLegacyMode()
+
         if (primaryBouncerView.delegate == null && !Flags.composeBouncer()) {
             Log.d(
                 TAG,
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerViewBinder.kt
index f1a0e5e..78811a9 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerViewBinder.kt
@@ -12,14 +12,15 @@
 import com.android.systemui.bouncer.ui.viewmodel.BouncerViewModel
 import com.android.systemui.bouncer.ui.viewmodel.KeyguardBouncerViewModel
 import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.flags.Flags.COMPOSE_BOUNCER_ENABLED
 import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel
 import com.android.systemui.log.BouncerLogger
 import com.android.systemui.user.domain.interactor.SelectedUserInteractor
 import dagger.Lazy
 import javax.inject.Inject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 
 /** Helper data class that allows to lazy load all the dependencies of the legacy bouncer. */
+@OptIn(ExperimentalCoroutinesApi::class)
 @SysUISingleton
 data class LegacyBouncerDependencies
 @Inject
@@ -59,7 +60,7 @@
     private val composeBouncerDependencies: Lazy<ComposeBouncerDependencies>,
 ) {
     fun bind(view: ViewGroup) {
-        if (COMPOSE_BOUNCER_ENABLED && composeBouncerFlags.isOnlyComposeBouncerEnabled()) {
+        if (composeBouncerFlags.isOnlyComposeBouncerEnabled()) {
             val deps = composeBouncerDependencies.get()
             ComposeBouncerViewBinder.bind(
                 view,
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt
index 62da5c0..12cac92 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt
@@ -99,7 +99,7 @@
             .map { if (it) ActionButtonAppearance.Hidden else ActionButtonAppearance.Shown }
             .stateIn(
                 scope = viewModelScope,
-                started = SharingStarted.Eagerly,
+                started = SharingStarted.WhileSubscribed(),
                 initialValue = ActionButtonAppearance.Hidden,
             )
 
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/dagger/ScreenBrightnessModule.kt b/packages/SystemUI/src/com/android/systemui/brightness/dagger/ScreenBrightnessModule.kt
new file mode 100644
index 0000000..2b9fc73
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/brightness/dagger/ScreenBrightnessModule.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.brightness.dagger
+
+import com.android.systemui.brightness.data.repository.BrightnessPolicyRepository
+import com.android.systemui.brightness.data.repository.BrightnessPolicyRepositoryImpl
+import com.android.systemui.brightness.data.repository.ScreenBrightnessDisplayManagerRepository
+import com.android.systemui.brightness.data.repository.ScreenBrightnessRepository
+import dagger.Binds
+import dagger.Module
+
+@Module
+interface ScreenBrightnessModule {
+
+    @Binds
+    fun bindScreenBrightnessRepository(
+        impl: ScreenBrightnessDisplayManagerRepository
+    ): ScreenBrightnessRepository
+
+    @Binds
+    fun bindPolicyRepository(impl: BrightnessPolicyRepositoryImpl): BrightnessPolicyRepository
+}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/data/model/LinearBrightness.kt b/packages/SystemUI/src/com/android/systemui/brightness/data/model/LinearBrightness.kt
new file mode 100644
index 0000000..608f301
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/brightness/data/model/LinearBrightness.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.brightness.data.model
+
+@JvmInline
+value class LinearBrightness(val floatValue: Float) {
+    fun clamp(min: LinearBrightness, max: LinearBrightness): LinearBrightness {
+        return if (floatValue < min.floatValue) {
+            min
+        } else if (floatValue > max.floatValue) {
+            max
+        } else {
+            this
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/data/repository/BrightnessPolicyRepository.kt b/packages/SystemUI/src/com/android/systemui/brightness/data/repository/BrightnessPolicyRepository.kt
new file mode 100644
index 0000000..c018ecb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/brightness/data/repository/BrightnessPolicyRepository.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.brightness.data.repository
+
+import android.content.Context
+import android.os.UserManager
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.user.data.repository.UserRepository
+import com.android.systemui.utils.PolicyRestriction
+import com.android.systemui.utils.UserRestrictionChecker
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.mapLatest
+
+/** Checks whether the current user is restricted to change the brightness ([RESTRICTION]) */
+interface BrightnessPolicyRepository {
+
+    /**
+     * Indicates whether the current user is restricted to change the brightness. As there is no way
+     * to determine when a restriction has been added/removed. This value may be fetched eagerly and
+     * not updated (unless the user changes) per flow.
+     */
+    val restrictionPolicy: Flow<PolicyRestriction>
+
+    companion object {
+        const val RESTRICTION = UserManager.DISALLOW_CONFIG_BRIGHTNESS
+    }
+}
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SysUISingleton
+class BrightnessPolicyRepositoryImpl
+@Inject
+constructor(
+    userRepository: UserRepository,
+    private val userRestrictionChecker: UserRestrictionChecker,
+    @Application private val applicationContext: Context,
+    @Background private val backgroundDispatcher: CoroutineDispatcher,
+) : BrightnessPolicyRepository {
+    override val restrictionPolicy =
+        userRepository.selectedUserInfo
+            .mapLatest { user ->
+                userRestrictionChecker
+                    .checkIfRestrictionEnforced(
+                        applicationContext,
+                        BrightnessPolicyRepository.RESTRICTION,
+                        user.id
+                    )
+                    ?.let { PolicyRestriction.Restricted(it) }
+                    ?: PolicyRestriction.NoRestriction
+            }
+            .flowOn(backgroundDispatcher)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt b/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt
new file mode 100644
index 0000000..9ed11d1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.brightness.data.repository
+
+import android.annotation.SuppressLint
+import android.hardware.display.BrightnessInfo
+import android.hardware.display.DisplayManager
+import com.android.systemui.brightness.data.model.LinearBrightness
+import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dagger.qualifiers.DisplayId
+import javax.inject.Inject
+import kotlin.coroutines.CoroutineContext
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.channels.Channel.Factory.UNLIMITED
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.flow.shareIn
+import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+/**
+ * Repository for tracking brightness in the current display.
+ *
+ * Values are in a linear space, as used by [DisplayManager].
+ */
+interface ScreenBrightnessRepository {
+    /** Current brightness as a value between [minLinearBrightness] and [maxLinearBrightness] */
+    val linearBrightness: Flow<LinearBrightness>
+
+    /** Current minimum value for the brightness */
+    val minLinearBrightness: Flow<LinearBrightness>
+
+    /** Current maximum value for the brightness */
+    val maxLinearBrightness: Flow<LinearBrightness>
+
+    /** Gets the current values for min and max brightness */
+    suspend fun getMinMaxLinearBrightness(): Pair<LinearBrightness, LinearBrightness>
+
+    /**
+     * Sets the temporary value for the brightness. This should change the display brightness but
+     * not trigger any updates.
+     */
+    fun setTemporaryBrightness(value: LinearBrightness)
+
+    /** Sets the brightness definitively. */
+    fun setBrightness(value: LinearBrightness)
+}
+
+@SuppressLint("MissingPermission")
+@SysUISingleton
+class ScreenBrightnessDisplayManagerRepository
+@Inject
+constructor(
+    @DisplayId private val displayId: Int,
+    private val displayManager: DisplayManager,
+    @Application private val applicationScope: CoroutineScope,
+    @Background private val backgroundContext: CoroutineContext,
+) : ScreenBrightnessRepository {
+
+    private val apiQueue =
+        Channel<SetBrightnessMethod>(
+            capacity = UNLIMITED,
+        )
+
+    init {
+        applicationScope.launch(backgroundContext) {
+            for (call in apiQueue) {
+                val bounds = getMinMaxLinearBrightness()
+                val value = call.value.clamp(bounds.first, bounds.second).floatValue
+                when (call) {
+                    is SetBrightnessMethod.Temporary -> {
+                        displayManager.setTemporaryBrightness(displayId, value)
+                    }
+                    is SetBrightnessMethod.Permanent -> {
+                        displayManager.setBrightness(displayId, value)
+                    }
+                }
+            }
+        }
+    }
+
+    private val brightnessInfo: StateFlow<BrightnessInfo?> =
+        conflatedCallbackFlow {
+                val listener =
+                    object : DisplayManager.DisplayListener {
+                        override fun onDisplayAdded(displayId: Int) {}
+
+                        override fun onDisplayRemoved(displayId: Int) {}
+
+                        override fun onDisplayChanged(displayId: Int) {
+                            if (
+                                displayId == [email protected]
+                            ) {
+                                trySend(Unit)
+                            }
+                        }
+                    }
+                displayManager.registerDisplayListener(
+                    listener,
+                    null,
+                    DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS,
+                )
+
+                awaitClose { displayManager.unregisterDisplayListener(listener) }
+            }
+            .onStart { emit(Unit) }
+            .map { brightnessInfoValue() }
+            .flowOn(backgroundContext)
+            .stateIn(
+                applicationScope,
+                SharingStarted.WhileSubscribed(replayExpirationMillis = 0L),
+                null,
+            )
+
+    private suspend fun brightnessInfoValue(): BrightnessInfo? {
+        return withContext(backgroundContext) {
+            displayManager.getDisplay(displayId).brightnessInfo
+        }
+    }
+
+    override val minLinearBrightness =
+        brightnessInfo
+            .filterNotNull()
+            .map { LinearBrightness(it.brightnessMinimum) }
+            .shareIn(applicationScope, SharingStarted.WhileSubscribed())
+
+    override val maxLinearBrightness =
+        brightnessInfo
+            .filterNotNull()
+            .map { LinearBrightness(it.brightnessMaximum) }
+            .shareIn(applicationScope, SharingStarted.WhileSubscribed())
+
+    override suspend fun getMinMaxLinearBrightness(): Pair<LinearBrightness, LinearBrightness> {
+        val brightnessInfo = brightnessInfo.value ?: brightnessInfoValue()
+        val min = brightnessInfo?.brightnessMinimum ?: 0f
+        val max = brightnessInfo?.brightnessMaximum ?: 1f
+        return LinearBrightness(min) to LinearBrightness(max)
+    }
+
+    override val linearBrightness =
+        brightnessInfo
+            .filterNotNull()
+            .map { LinearBrightness(it.brightness) }
+            .shareIn(applicationScope, SharingStarted.WhileSubscribed())
+
+    override fun setTemporaryBrightness(value: LinearBrightness) {
+        apiQueue.trySend(SetBrightnessMethod.Temporary(value))
+    }
+
+    override fun setBrightness(value: LinearBrightness) {
+        apiQueue.trySend(SetBrightnessMethod.Permanent(value))
+    }
+
+    private sealed interface SetBrightnessMethod {
+        val value: LinearBrightness
+        @JvmInline
+        value class Temporary(override val value: LinearBrightness) : SetBrightnessMethod
+        @JvmInline
+        value class Permanent(override val value: LinearBrightness) : SetBrightnessMethod
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/domain/interactor/BrightnessPolicyEnforcementInteractor.kt b/packages/SystemUI/src/com/android/systemui/brightness/domain/interactor/BrightnessPolicyEnforcementInteractor.kt
new file mode 100644
index 0000000..fb00edf
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/brightness/domain/interactor/BrightnessPolicyEnforcementInteractor.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.brightness.domain.interactor
+
+import com.android.settingslib.RestrictedLockUtils
+import com.android.systemui.brightness.data.repository.BrightnessPolicyRepository
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.utils.PolicyRestriction
+import javax.inject.Inject
+
+/** Interactor for enforcing the policy that may disallow brightness changing. */
+@SysUISingleton
+class BrightnessPolicyEnforcementInteractor
+@Inject
+constructor(
+    brightnessPolicyRepository: BrightnessPolicyRepository,
+    private val activityStarter: ActivityStarter,
+) {
+
+    /** Brightness policy restriction for the current user. */
+    val brightnessPolicyRestriction = brightnessPolicyRepository.restrictionPolicy
+
+    /**
+     * Starts the dialog with details about the current restriction for changing brightness. Should
+     * be triggered when a restricted user tries to change the brightness.
+     */
+    fun startAdminSupportDetailsDialog(restriction: PolicyRestriction.Restricted) {
+        val intent = RestrictedLockUtils.getShowAdminSupportDetailsIntent(restriction.admin)
+        activityStarter.postStartActivityDismissingKeyguard(intent, 0)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractor.kt b/packages/SystemUI/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractor.kt
new file mode 100644
index 0000000..799a0a1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractor.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.brightness.domain.interactor
+
+import com.android.settingslib.display.BrightnessUtils
+import com.android.systemui.brightness.data.model.LinearBrightness
+import com.android.systemui.brightness.data.repository.ScreenBrightnessRepository
+import com.android.systemui.brightness.shared.GammaBrightness
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+import kotlinx.coroutines.flow.combine
+
+/**
+ * Converts between [GammaBrightness] and [LinearBrightness].
+ *
+ * @see BrightnessUtils
+ */
+@SysUISingleton
+class ScreenBrightnessInteractor
+@Inject
+constructor(
+    private val screenBrightnessRepository: ScreenBrightnessRepository,
+) {
+    /** Maximum value in the Gamma space for brightness */
+    val maxGammaBrightness = GammaBrightness(BrightnessUtils.GAMMA_SPACE_MAX)
+
+    /** Minimum value in the Gamma space for brightness */
+    val minGammaBrightness = GammaBrightness(BrightnessUtils.GAMMA_SPACE_MIN)
+
+    /**
+     * Brightness in the Gamma space for the current display. It will always represent a value
+     * between [minGammaBrightness] and [maxGammaBrightness]
+     */
+    val gammaBrightness =
+        with(screenBrightnessRepository) {
+            combine(
+                linearBrightness,
+                minLinearBrightness,
+                maxLinearBrightness,
+            ) { brightness, min, max ->
+                brightness.toGammaBrightness(min, max)
+            }
+        }
+
+    /** Sets the brightness temporarily, while the user is changing it. */
+    suspend fun setTemporaryBrightness(gammaBrightness: GammaBrightness) {
+        screenBrightnessRepository.setTemporaryBrightness(
+            gammaBrightness.clamp().toLinearBrightness()
+        )
+    }
+
+    /** Sets the brightness definitely. */
+    suspend fun setBrightness(gammaBrightness: GammaBrightness) {
+        screenBrightnessRepository.setBrightness(gammaBrightness.clamp().toLinearBrightness())
+    }
+
+    private suspend fun GammaBrightness.toLinearBrightness(): LinearBrightness {
+        val bounds = screenBrightnessRepository.getMinMaxLinearBrightness()
+        return LinearBrightness(
+            BrightnessUtils.convertGammaToLinearFloat(
+                value,
+                bounds.first.floatValue,
+                bounds.second.floatValue
+            )
+        )
+    }
+
+    private fun GammaBrightness.clamp(): GammaBrightness {
+        return GammaBrightness(value.coerceIn(minGammaBrightness.value, maxGammaBrightness.value))
+    }
+
+    private fun LinearBrightness.toGammaBrightness(
+        min: LinearBrightness,
+        max: LinearBrightness,
+    ): GammaBrightness {
+        return GammaBrightness(
+            BrightnessUtils.convertLinearToGammaFloat(floatValue, min.floatValue, max.floatValue)
+        )
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/shared/GammaBrightness.kt b/packages/SystemUI/src/com/android/systemui/brightness/shared/GammaBrightness.kt
new file mode 100644
index 0000000..e20d003
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/brightness/shared/GammaBrightness.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.brightness.shared
+
+import androidx.annotation.IntRange
+import com.android.settingslib.display.BrightnessUtils
+
+@JvmInline
+value class GammaBrightness(
+    @IntRange(
+        from = BrightnessUtils.GAMMA_SPACE_MIN.toLong(),
+        to = BrightnessUtils.GAMMA_SPACE_MAX.toLong()
+    )
+    val value: Int
+)
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt b/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt
new file mode 100644
index 0000000..c1be37a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt
@@ -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.systemui.brightness.ui.compose
+
+import androidx.compose.animation.core.animateIntAsState
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.size
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
+import com.android.compose.PlatformSlider
+import com.android.systemui.brightness.shared.GammaBrightness
+import com.android.systemui.brightness.ui.viewmodel.BrightnessSliderViewModel
+import com.android.systemui.brightness.ui.viewmodel.Drag
+import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.common.shared.model.Text
+import com.android.systemui.common.ui.compose.Icon
+import com.android.systemui.utils.PolicyRestriction
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.launch
+
+@Composable
+private fun BrightnessSlider(
+    gammaValue: Int,
+    valueRange: IntRange,
+    label: Text.Resource,
+    icon: Icon,
+    restriction: PolicyRestriction,
+    onRestrictedClick: (PolicyRestriction.Restricted) -> Unit,
+    onDrag: (Int) -> Unit,
+    onStop: (Int) -> Unit,
+    modifier: Modifier = Modifier,
+    formatter: (Int) -> String = { "$it" },
+) {
+    var value by remember(gammaValue) { mutableIntStateOf(gammaValue) }
+    val animatedValue by
+        animateIntAsState(targetValue = value, label = "BrightnessSliderAnimatedValue")
+    val floatValueRange = valueRange.first.toFloat()..valueRange.last.toFloat()
+    val isRestricted = restriction is PolicyRestriction.Restricted
+
+    PlatformSlider(
+        value = animatedValue.toFloat(),
+        valueRange = floatValueRange,
+        enabled = !isRestricted,
+        onValueChange = {
+            if (!isRestricted) {
+                value = it.toInt()
+                onDrag(value)
+            }
+        },
+        onValueChangeFinished = {
+            if (!isRestricted) {
+                onStop(value)
+            }
+        },
+        modifier =
+            modifier.clickable(
+                enabled = isRestricted,
+            ) {
+                if (restriction is PolicyRestriction.Restricted) {
+                    onRestrictedClick(restriction)
+                }
+            },
+        icon = { isDragging ->
+            if (isDragging) {
+                Text(text = formatter(value))
+            } else {
+                Icon(modifier = Modifier.size(24.dp), icon = icon)
+            }
+        },
+        label = {
+            Text(
+                text = stringResource(id = label.res),
+                style = MaterialTheme.typography.titleMedium,
+                maxLines = 1,
+            )
+        },
+    )
+}
+
+@Composable
+fun BrightnessSliderContainer(
+    viewModel: BrightnessSliderViewModel,
+    modifier: Modifier = Modifier,
+) {
+    val gamma: Int by viewModel.currentBrightness.map { it.value }.collectAsState(initial = 0)
+    val coroutineScope = rememberCoroutineScope()
+    val restriction by
+        viewModel.policyRestriction.collectAsState(initial = PolicyRestriction.NoRestriction)
+
+    BrightnessSlider(
+        gammaValue = gamma,
+        valueRange = viewModel.minBrightness.value..viewModel.maxBrightness.value,
+        label = viewModel.label,
+        icon = viewModel.icon,
+        restriction = restriction,
+        onRestrictedClick = viewModel::showPolicyRestrictionDialog,
+        onDrag = { coroutineScope.launch { viewModel.onDrag(Drag.Dragging(GammaBrightness(it))) } },
+        onStop = { coroutineScope.launch { viewModel.onDrag(Drag.Stopped(GammaBrightness(it))) } },
+        modifier = modifier.fillMaxWidth(),
+        formatter = viewModel::formatValue,
+    )
+}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt
new file mode 100644
index 0000000..f0988ba
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.brightness.ui.viewmodel
+
+import com.android.systemui.brightness.domain.interactor.BrightnessPolicyEnforcementInteractor
+import com.android.systemui.brightness.domain.interactor.ScreenBrightnessInteractor
+import com.android.systemui.brightness.shared.GammaBrightness
+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.dagger.SysUISingleton
+import com.android.systemui.res.R
+import com.android.systemui.utils.PolicyRestriction
+import javax.inject.Inject
+
+@SysUISingleton
+class BrightnessSliderViewModel
+@Inject
+constructor(
+    private val screenBrightnessInteractor: ScreenBrightnessInteractor,
+    private val brightnessPolicyEnforcementInteractor: BrightnessPolicyEnforcementInteractor,
+) {
+    val currentBrightness = screenBrightnessInteractor.gammaBrightness
+
+    val maxBrightness = screenBrightnessInteractor.maxGammaBrightness
+    val minBrightness = screenBrightnessInteractor.minGammaBrightness
+
+    val label = Text.Resource(R.string.quick_settings_brightness_dialog_title)
+
+    val icon = Icon.Resource(R.drawable.ic_brightness_full, ContentDescription.Resource(label.res))
+
+    val policyRestriction = brightnessPolicyEnforcementInteractor.brightnessPolicyRestriction
+
+    fun showPolicyRestrictionDialog(restriction: PolicyRestriction.Restricted) {
+        brightnessPolicyEnforcementInteractor.startAdminSupportDetailsDialog(restriction)
+    }
+
+    /**
+     * As a brightness slider is dragged, the corresponding events should be sent using this method.
+     */
+    suspend fun onDrag(drag: Drag) {
+        when (drag) {
+            is Drag.Dragging -> screenBrightnessInteractor.setTemporaryBrightness(drag.brightness)
+            is Drag.Stopped -> screenBrightnessInteractor.setBrightness(drag.brightness)
+        }
+    }
+
+    /**
+     * Format the current value of brightness as a percentage between the minimum and maximum gamma.
+     */
+    fun formatValue(value: Int): String {
+        val min = minBrightness.value
+        val max = maxBrightness.value
+        val coercedValue = value.coerceIn(min, max)
+        val percentage = (coercedValue - min) * 100 / (max - min)
+        // This is not finalized UI so using fixed string
+        return "$percentage%"
+    }
+}
+
+/** Represents a drag event in a brightness slider. */
+sealed interface Drag {
+    val brightness: GammaBrightness
+    @JvmInline value class Dragging(override val brightness: GammaBrightness) : Drag
+    @JvmInline value class Stopped(override val brightness: GammaBrightness) : Drag
+}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
index 357eca3..d2caefd 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java
@@ -398,6 +398,7 @@
                 || mAccessibilityManager.isTouchExplorationEnabled()
                 || mDataProvider.isA11yAction()
                 || mDataProvider.isFromTrackpad()
+                || mDataProvider.isFromKeyboard()
                 || (mFeatureFlags.isEnabled(Flags.FALSING_OFF_FOR_UNFOLDED)
                     && mDataProvider.isUnfolded());
     }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java
index a79a654..76b228d 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.classifier;
 
+import android.view.KeyEvent;
 import android.view.MotionEvent;
 
 /**
@@ -50,6 +51,14 @@
     void onBouncerHidden();
 
     /**
+     * Call this to record a KeyEvent in the {@link com.android.systemui.plugins.FalsingManager}.
+     *
+     * This may decide to only collect certain KeyEvents and ignore others. Do not assume all
+     * KeyEvents are collected.
+     */
+    void onKeyEvent(KeyEvent ev);
+
+    /**
      * Call this to record a MotionEvent in the {@link com.android.systemui.plugins.FalsingManager}.
      *
      * Be sure to call {@link #onMotionEventComplete()} after the rest of SystemUI is done with the
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java
index d6b9a11..dcd4195 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.classifier;
 
+import android.view.KeyEvent;
 import android.view.MotionEvent;
 
 import javax.inject.Inject;
@@ -23,6 +24,8 @@
 /** */
 public class FalsingCollectorFake implements FalsingCollector {
 
+    public KeyEvent lastKeyEvent = null;
+
     @Override
     public void init() {
     }
@@ -70,6 +73,11 @@
     }
 
     @Override
+    public void onKeyEvent(KeyEvent ev) {
+        lastKeyEvent = ev;
+    }
+
+    @Override
     public void onTouchEvent(MotionEvent ev) {
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
index 4f4f3d0..beaa170 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
@@ -21,6 +21,7 @@
 import android.hardware.SensorManager;
 import android.hardware.biometrics.BiometricSourceType;
 import android.util.Log;
+import android.view.KeyEvent;
 import android.view.MotionEvent;
 
 import androidx.annotation.VisibleForTesting;
@@ -49,7 +50,10 @@
 
 import dagger.Lazy;
 
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
 
 import javax.inject.Inject;
 
@@ -61,6 +65,14 @@
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
     private static final long GESTURE_PROCESSING_DELAY_MS = 100;
 
+    private final Set<Integer> mAcceptedKeycodes = new HashSet<>(Arrays.asList(
+        KeyEvent.KEYCODE_ENTER,
+        KeyEvent.KEYCODE_ESCAPE,
+        KeyEvent.KEYCODE_SHIFT_LEFT,
+        KeyEvent.KEYCODE_SHIFT_RIGHT,
+        KeyEvent.KEYCODE_SPACE
+    ));
+
     private final FalsingDataProvider mFalsingDataProvider;
     private final FalsingManager mFalsingManager;
     private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@@ -279,6 +291,14 @@
     }
 
     @Override
+    public void onKeyEvent(KeyEvent ev) {
+        // Only collect if it is an ACTION_UP action and is allow-listed
+        if (ev.getAction() == KeyEvent.ACTION_UP && mAcceptedKeycodes.contains(ev.getKeyCode())) {
+            mFalsingDataProvider.onKeyEvent(ev);
+        }
+    }
+
+    @Override
     public void onTouchEvent(MotionEvent ev) {
         logDebug("REAL: onTouchEvent(" + ev.getActionMasked() + ")");
         if (!mKeyguardStateController.isShowing()) {
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorNoOp.kt b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorNoOp.kt
index c5d8c79..b289fa4 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorNoOp.kt
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorNoOp.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.classifier
 
+import android.view.KeyEvent
 import android.view.MotionEvent
 import com.android.systemui.classifier.FalsingCollectorImpl.logDebug
 import com.android.systemui.dagger.SysUISingleton
@@ -59,6 +60,10 @@
         logDebug("NOOP: onBouncerHidden")
     }
 
+    override fun onKeyEvent(ev: KeyEvent) {
+        logDebug("NOOP: onKeyEvent(${ev.action}")
+    }
+
     override fun onTouchEvent(ev: MotionEvent) {
         logDebug("NOOP: onTouchEvent(${ev.actionMasked})")
     }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java
index 809d5b2..1501701 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java
@@ -20,6 +20,7 @@
 
 import android.hardware.devicestate.DeviceStateManager.FoldStateListener;
 import android.util.DisplayMetrics;
+import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.MotionEvent.PointerCoords;
 import android.view.MotionEvent.PointerProperties;
@@ -41,6 +42,7 @@
 public class FalsingDataProvider {
 
     private static final long MOTION_EVENT_AGE_MS = 1000;
+    private static final long KEY_EVENT_AGE_MS = 500;
     private static final long DROP_EVENT_THRESHOLD_MS = 50;
     private static final float THREE_HUNDRED_SIXTY_DEG = (float) (2 * Math.PI);
 
@@ -56,8 +58,10 @@
     private final List<MotionEventListener> mMotionEventListeners = new ArrayList<>();
     private final List<GestureFinalizedListener> mGestureFinalizedListeners = new ArrayList<>();
 
-    private TimeLimitedMotionEventBuffer mRecentMotionEvents =
-            new TimeLimitedMotionEventBuffer(MOTION_EVENT_AGE_MS);
+    private TimeLimitedInputEventBuffer<MotionEvent> mRecentMotionEvents =
+            new TimeLimitedInputEventBuffer<>(MOTION_EVENT_AGE_MS);
+    private final TimeLimitedInputEventBuffer<KeyEvent> mRecentKeyEvents =
+            new TimeLimitedInputEventBuffer<>(KEY_EVENT_AGE_MS);
     private List<MotionEvent> mPriorMotionEvents = new ArrayList<>();
 
     private boolean mDirty = true;
@@ -89,6 +93,10 @@
         FalsingClassifier.logInfo("width, height: " + getWidthPixels() + ", " + getHeightPixels());
     }
 
+    void onKeyEvent(KeyEvent keyEvent) {
+        mRecentKeyEvents.add(keyEvent);
+    }
+
     void onMotionEvent(MotionEvent motionEvent) {
         List<MotionEvent> motionEvents = unpackMotionEvent(motionEvent);
         FalsingClassifier.logVerbose("Unpacked into: " + motionEvents.size());
@@ -109,6 +117,10 @@
         // previous ACTION_MOVE event and when it happens, it makes some classifiers fail.
         mDropLastEvent = shouldDropEvent(motionEvent);
 
+        if (!motionEvents.isEmpty() && !mRecentKeyEvents.isEmpty()) {
+            recycleAndClearRecentKeyEvents();
+        }
+
         mRecentMotionEvents.addAll(motionEvents);
 
         FalsingClassifier.logVerbose("Size: " + mRecentMotionEvents.size());
@@ -141,7 +153,7 @@
                     mRecentMotionEvents.get(mRecentMotionEvents.size() - 1).getEventTime()));
 
             mPriorMotionEvents = mRecentMotionEvents;
-            mRecentMotionEvents = new TimeLimitedMotionEventBuffer(MOTION_EVENT_AGE_MS);
+            mRecentMotionEvents = new TimeLimitedInputEventBuffer<>(MOTION_EVENT_AGE_MS);
         }
         mDropLastEvent = false;
         mA11YAction = false;
@@ -261,6 +273,13 @@
         return mLastMotionEvent.getY() < mFirstRecentMotionEvent.getY();
     }
 
+    /**
+     * If it's a specific set of keys as collected from {@link FalsingCollector}
+     */
+    public boolean isFromKeyboard() {
+        return !mRecentKeyEvents.isEmpty();
+    }
+
     public boolean isFromTrackpad() {
         if (mRecentMotionEvents.isEmpty()) {
             return false;
@@ -318,6 +337,14 @@
         }
     }
 
+    private void recycleAndClearRecentKeyEvents() {
+        for (KeyEvent ev : mRecentKeyEvents) {
+            ev.recycle();
+        }
+
+        mRecentKeyEvents.clear();
+    }
+
     private List<MotionEvent> unpackMotionEvent(MotionEvent motionEvent) {
         List<MotionEvent> motionEvents = new ArrayList<>();
         List<PointerProperties> pointerPropertiesList = new ArrayList<>();
@@ -416,6 +443,8 @@
 
         mRecentMotionEvents.clear();
 
+        recycleAndClearRecentKeyEvents();
+
         mDirty = true;
 
         mSessionListeners.forEach(SessionListener::onSessionEnded);
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/TimeLimitedInputEventBuffer.java b/packages/SystemUI/src/com/android/systemui/classifier/TimeLimitedInputEventBuffer.java
new file mode 100644
index 0000000..7627ad1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/classifier/TimeLimitedInputEventBuffer.java
@@ -0,0 +1,242 @@
+/*
+ * 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.classifier;
+
+import android.view.InputEvent;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * Maintains an ordered list of the last N milliseconds of InputEvents.
+ *
+ * This class is simply a convenience class designed to look like a simple list, but that
+ * automatically discards old InputEvents. It functions much like a queue - first in first out -
+ * but does not have a fixed size like a circular buffer.
+ */
+public class TimeLimitedInputEventBuffer<T extends InputEvent> implements List<T> {
+
+    private final List<T> mInputEvents;
+    private final long mMaxAgeMs;
+
+    public TimeLimitedInputEventBuffer(long maxAgeMs) {
+        super();
+        mMaxAgeMs = maxAgeMs;
+        mInputEvents = new ArrayList<>();
+    }
+
+    private void ejectOldEvents() {
+        if (mInputEvents.isEmpty()) {
+            return;
+        }
+        Iterator<T> iter = listIterator();
+        long mostRecentMs = mInputEvents.get(mInputEvents.size() - 1).getEventTime();
+        while (iter.hasNext()) {
+            T ev = iter.next();
+            if (mostRecentMs - ev.getEventTime() > mMaxAgeMs) {
+                iter.remove();
+                ev.recycle();
+            }
+        }
+    }
+
+    @Override
+    public void add(int index, T element) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public T remove(int index) {
+        return mInputEvents.remove(index);
+    }
+
+    @Override
+    public int indexOf(Object o) {
+        return mInputEvents.indexOf(o);
+    }
+
+    @Override
+    public int lastIndexOf(Object o) {
+        return mInputEvents.lastIndexOf(o);
+    }
+
+    @Override
+    public int size() {
+        return mInputEvents.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return mInputEvents.isEmpty();
+    }
+
+    @Override
+    public boolean contains(Object o) {
+        return mInputEvents.contains(o);
+    }
+
+    @Override
+    public Iterator<T> iterator() {
+        return mInputEvents.iterator();
+    }
+
+    @Override
+    public Object[] toArray() {
+        return mInputEvents.toArray();
+    }
+
+    @Override
+    public <T2> T2[] toArray(T2[] a) {
+        return mInputEvents.toArray(a);
+    }
+
+    @Override
+    public boolean add(T element) {
+        boolean result = mInputEvents.add(element);
+        ejectOldEvents();
+        return result;
+    }
+
+    @Override
+    public boolean remove(Object o) {
+        return mInputEvents.remove(o);
+    }
+
+    @Override
+    public boolean containsAll(Collection<?> c) {
+        return mInputEvents.containsAll(c);
+    }
+
+    @Override
+    public boolean addAll(Collection<? extends T> collection) {
+        boolean result = mInputEvents.addAll(collection);
+        ejectOldEvents();
+        return result;
+    }
+
+    @Override
+    public boolean addAll(int index, Collection<? extends T> elements) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean removeAll(Collection<?> c) {
+        return mInputEvents.removeAll(c);
+    }
+
+    @Override
+    public boolean retainAll(Collection<?> c) {
+        return mInputEvents.retainAll(c);
+    }
+
+    @Override
+    public void clear() {
+        mInputEvents.clear();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        return mInputEvents.equals(o);
+    }
+
+    @Override
+    public int hashCode() {
+        return mInputEvents.hashCode();
+    }
+
+    @Override
+    public T get(int index) {
+        return mInputEvents.get(index);
+    }
+
+    @Override
+    public T set(int index, T element) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ListIterator<T> listIterator() {
+        return new Iter(0);
+    }
+
+    @Override
+    public ListIterator<T> listIterator(int index) {
+        return new Iter(index);
+    }
+
+    @Override
+    public List<T> subList(int fromIndex, int toIndex) {
+        return mInputEvents.subList(fromIndex, toIndex);
+    }
+
+    class Iter implements ListIterator<T> {
+
+        private final ListIterator<T> mIterator;
+
+        Iter(int index) {
+            this.mIterator = mInputEvents.listIterator(index);
+        }
+
+        @Override
+        public boolean hasNext() {
+            return mIterator.hasNext();
+        }
+
+        @Override
+        public T next() {
+            return mIterator.next();
+        }
+
+        @Override
+        public boolean hasPrevious() {
+            return mIterator.hasPrevious();
+        }
+
+        @Override
+        public T previous() {
+            return mIterator.previous();
+        }
+
+        @Override
+        public int nextIndex() {
+            return mIterator.nextIndex();
+        }
+
+        @Override
+        public int previousIndex() {
+            return mIterator.previousIndex();
+        }
+
+        @Override
+        public void remove() {
+            mIterator.remove();
+        }
+
+        @Override
+        public void set(T inputEvent) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void add(T element) {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/TimeLimitedMotionEventBuffer.java b/packages/SystemUI/src/com/android/systemui/classifier/TimeLimitedMotionEventBuffer.java
deleted file mode 100644
index 51aede7..0000000
--- a/packages/SystemUI/src/com/android/systemui/classifier/TimeLimitedMotionEventBuffer.java
+++ /dev/null
@@ -1,242 +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.classifier;
-
-import android.view.MotionEvent;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * Maintains an ordered list of the last N milliseconds of MotionEvents.
- *
- * This class is simply a convenience class designed to look like a simple list, but that
- * automatically discards old MotionEvents. It functions much like a queue - first in first out -
- * but does not have a fixed size like a circular buffer.
- */
-public class TimeLimitedMotionEventBuffer implements List<MotionEvent> {
-
-    private final List<MotionEvent> mMotionEvents;
-    private final long mMaxAgeMs;
-
-    public TimeLimitedMotionEventBuffer(long maxAgeMs) {
-        super();
-        mMaxAgeMs = maxAgeMs;
-        mMotionEvents = new ArrayList<>();
-    }
-
-    private void ejectOldEvents() {
-        if (mMotionEvents.isEmpty()) {
-            return;
-        }
-        Iterator<MotionEvent> iter = listIterator();
-        long mostRecentMs = mMotionEvents.get(mMotionEvents.size() - 1).getEventTime();
-        while (iter.hasNext()) {
-            MotionEvent ev = iter.next();
-            if (mostRecentMs - ev.getEventTime() > mMaxAgeMs) {
-                iter.remove();
-                ev.recycle();
-            }
-        }
-    }
-
-    @Override
-    public void add(int index, MotionEvent element) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public MotionEvent remove(int index) {
-        return mMotionEvents.remove(index);
-    }
-
-    @Override
-    public int indexOf(Object o) {
-        return mMotionEvents.indexOf(o);
-    }
-
-    @Override
-    public int lastIndexOf(Object o) {
-        return mMotionEvents.lastIndexOf(o);
-    }
-
-    @Override
-    public int size() {
-        return mMotionEvents.size();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return mMotionEvents.isEmpty();
-    }
-
-    @Override
-    public boolean contains(Object o) {
-        return mMotionEvents.contains(o);
-    }
-
-    @Override
-    public Iterator<MotionEvent> iterator() {
-        return mMotionEvents.iterator();
-    }
-
-    @Override
-    public Object[] toArray() {
-        return mMotionEvents.toArray();
-    }
-
-    @Override
-    public <T> T[] toArray(T[] a) {
-        return mMotionEvents.toArray(a);
-    }
-
-    @Override
-    public boolean add(MotionEvent element) {
-        boolean result = mMotionEvents.add(element);
-        ejectOldEvents();
-        return result;
-    }
-
-    @Override
-    public boolean remove(Object o) {
-        return mMotionEvents.remove(o);
-    }
-
-    @Override
-    public boolean containsAll(Collection<?> c) {
-        return mMotionEvents.containsAll(c);
-    }
-
-    @Override
-    public boolean addAll(Collection<? extends MotionEvent> collection) {
-        boolean result = mMotionEvents.addAll(collection);
-        ejectOldEvents();
-        return result;
-    }
-
-    @Override
-    public boolean addAll(int index, Collection<? extends MotionEvent> elements) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public boolean removeAll(Collection<?> c) {
-        return mMotionEvents.removeAll(c);
-    }
-
-    @Override
-    public boolean retainAll(Collection<?> c) {
-        return mMotionEvents.retainAll(c);
-    }
-
-    @Override
-    public void clear() {
-        mMotionEvents.clear();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        return mMotionEvents.equals(o);
-    }
-
-    @Override
-    public int hashCode() {
-        return mMotionEvents.hashCode();
-    }
-
-    @Override
-    public MotionEvent get(int index) {
-        return mMotionEvents.get(index);
-    }
-
-    @Override
-    public MotionEvent set(int index, MotionEvent element) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public ListIterator<MotionEvent> listIterator() {
-        return new Iter(0);
-    }
-
-    @Override
-    public ListIterator<MotionEvent> listIterator(int index) {
-        return new Iter(index);
-    }
-
-    @Override
-    public List<MotionEvent> subList(int fromIndex, int toIndex) {
-        return mMotionEvents.subList(fromIndex, toIndex);
-    }
-
-    class Iter implements ListIterator<MotionEvent> {
-
-        private final ListIterator<MotionEvent> mIterator;
-
-        Iter(int index) {
-            this.mIterator = mMotionEvents.listIterator(index);
-        }
-
-        @Override
-        public boolean hasNext() {
-            return mIterator.hasNext();
-        }
-
-        @Override
-        public MotionEvent next() {
-            return mIterator.next();
-        }
-
-        @Override
-        public boolean hasPrevious() {
-            return mIterator.hasPrevious();
-        }
-
-        @Override
-        public MotionEvent previous() {
-            return mIterator.previous();
-        }
-
-        @Override
-        public int nextIndex() {
-            return mIterator.nextIndex();
-        }
-
-        @Override
-        public int previousIndex() {
-            return mIterator.previousIndex();
-        }
-
-        @Override
-        public void remove() {
-            mIterator.remove();
-        }
-
-        @Override
-        public void set(MotionEvent motionEvent) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void add(MotionEvent element) {
-            throw new UnsupportedOperationException();
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java
index bb201b6..a43447f 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/EditTextActivity.java
@@ -23,14 +23,20 @@
 import android.content.ClipDescription;
 import android.content.ClipboardManager;
 import android.content.pm.PackageManager;
+import android.graphics.Insets;
 import android.os.Bundle;
 import android.os.PersistableBundle;
 import android.text.Editable;
 import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowInsets;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
+
 import com.android.systemui.res.R;
 
 /**
@@ -53,6 +59,24 @@
         mEditText = findViewById(R.id.edit_text);
         mAttribution = findViewById(R.id.attribution);
         mClipboardManager = requireNonNull(getSystemService(ClipboardManager.class));
+
+        findViewById(R.id.editor_root).setOnApplyWindowInsetsListener(
+                new View.OnApplyWindowInsetsListener() {
+                    @NonNull
+                    @Override
+                    public WindowInsets onApplyWindowInsets(@NonNull View view,
+                            @NonNull WindowInsets windowInsets) {
+                        Insets insets = windowInsets.getInsets(WindowInsets.Type.systemBars());
+                        ViewGroup.MarginLayoutParams layoutParams =
+                                (ViewGroup.MarginLayoutParams) view.getLayoutParams();
+                        layoutParams.leftMargin = insets.left;
+                        layoutParams.bottomMargin = insets.bottom;
+                        layoutParams.rightMargin = insets.right;
+                        layoutParams.topMargin = insets.top;
+                        view.setLayoutParams(layoutParams);
+                        return WindowInsets.CONSUMED;
+                    }
+                });
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/view/ViewExt.kt b/packages/SystemUI/src/com/android/systemui/common/ui/view/ViewExt.kt
index ce798ba..f7ea25c 100644
--- a/packages/SystemUI/src/com/android/systemui/common/ui/view/ViewExt.kt
+++ b/packages/SystemUI/src/com/android/systemui/common/ui/view/ViewExt.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.common.ui.view
 
 import android.view.View
+import kotlinx.coroutines.DisposableHandle
 
 /**
  * Set this view's [View#importantForAccessibility] to [View#IMPORTANT_FOR_ACCESSIBILITY_YES] or
@@ -43,3 +44,27 @@
     }
     return null
 }
+
+/** Adds a [View.OnLayoutChangeListener] and provides a [DisposableHandle] for teardown. */
+fun View.onLayoutChanged(onLayoutChanged: (v: View) -> Unit): DisposableHandle =
+    onLayoutChanged { v, _, _, _, _, _, _, _, _ ->
+        onLayoutChanged(v)
+    }
+
+/** Adds the [View.OnLayoutChangeListener] and provides a [DisposableHandle] for teardown. */
+fun View.onLayoutChanged(listener: View.OnLayoutChangeListener): DisposableHandle {
+    addOnLayoutChangeListener(listener)
+    return DisposableHandle { removeOnLayoutChangeListener(listener) }
+}
+
+/** Adds a [View.OnApplyWindowInsetsListener] and provides a [DisposableHandle] for teardown. */
+fun View.onApplyWindowInsets(listener: View.OnApplyWindowInsetsListener): DisposableHandle {
+    setOnApplyWindowInsetsListener(listener)
+    return DisposableHandle { setOnApplyWindowInsetsListener(null) }
+}
+
+/** Adds a [View.OnTouchListener] and provides a [DisposableHandle] for teardown. */
+fun View.onTouchListener(listener: View.OnTouchListener): DisposableHandle {
+    setOnTouchListener(listener)
+    return DisposableHandle { setOnTouchListener(null) }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
index ef686f9..4d328d6 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
@@ -72,7 +72,7 @@
             .filterNotNull()
             // TODO(b/322787129): Also set a custom transition animation here to avoid the regular
             // slide-in animation when setting the scene programmatically
-            .onEach { nextScene -> communalInteractor.onSceneChanged(nextScene) }
+            .onEach { nextScene -> communalInteractor.changeScene(nextScene) }
             .launchIn(applicationScope)
 
         // TODO(b/322787129): re-enable once custom animations are in place
@@ -129,7 +129,7 @@
                 .sample(keyguardInteractor.isDreaming, ::Pair)
                 .collect { (shouldTimeout, isDreaming) ->
                     if (isDreaming && shouldTimeout) {
-                        communalInteractor.onSceneChanged(CommunalScenes.Blank)
+                        communalInteractor.changeScene(CommunalScenes.Blank)
                     }
                 }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/dagger/Communal.kt b/packages/SystemUI/src/com/android/systemui/communal/dagger/Communal.kt
new file mode 100644
index 0000000..5e41a1b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/communal/dagger/Communal.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.dagger
+
+import javax.inject.Qualifier
+
+@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class Communal
diff --git a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt
index 82d9437..72dcb26 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt
@@ -23,11 +23,19 @@
 import com.android.systemui.communal.data.repository.CommunalSettingsRepositoryModule
 import com.android.systemui.communal.data.repository.CommunalTutorialRepositoryModule
 import com.android.systemui.communal.data.repository.CommunalWidgetRepositoryModule
+import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.communal.widgets.CommunalWidgetModule
 import com.android.systemui.communal.widgets.EditWidgetsActivityStarter
 import com.android.systemui.communal.widgets.EditWidgetsActivityStarterImpl
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.scene.shared.model.SceneContainerConfig
+import com.android.systemui.scene.shared.model.SceneDataSource
+import com.android.systemui.scene.shared.model.SceneDataSourceDelegator
 import dagger.Binds
 import dagger.Module
+import dagger.Provides
+import kotlinx.coroutines.CoroutineScope
 
 @Module(
     includes =
@@ -47,4 +55,24 @@
     fun bindEditWidgetsActivityStarter(
         starter: EditWidgetsActivityStarterImpl
     ): EditWidgetsActivityStarter
+
+    @Binds
+    @Communal
+    fun bindCommunalSceneDataSource(@Communal delegator: SceneDataSourceDelegator): SceneDataSource
+
+    companion object {
+        @Provides
+        @Communal
+        @SysUISingleton
+        fun providesCommunalSceneDataSourceDelegator(
+            @Application applicationScope: CoroutineScope
+        ): SceneDataSourceDelegator {
+            val config =
+                SceneContainerConfig(
+                    sceneKeys = listOf(CommunalScenes.Blank, CommunalScenes.Communal),
+                    initialSceneKey = CommunalScenes.Blank
+                )
+            return SceneDataSourceDelegator(applicationScope, config)
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalPrefsRepository.kt b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalPrefsRepository.kt
index 0e9b32f..40d7440 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalPrefsRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalPrefsRepository.kt
@@ -17,8 +17,11 @@
 package com.android.systemui.communal.data.repository
 
 import android.content.Context
+import android.content.IntentFilter
 import android.content.SharedPreferences
 import android.content.pm.UserInfo
+import com.android.systemui.backup.BackupHelper
+import com.android.systemui.broadcast.BroadcastDispatcher
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.log.LogBuffer
@@ -30,15 +33,18 @@
 import com.android.systemui.settings.UserFileManager
 import com.android.systemui.user.data.repository.UserRepository
 import com.android.systemui.util.kotlin.SharedPreferencesExt.observe
+import com.android.systemui.util.kotlin.emitOnStart
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.flow.onStart
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.withContext
@@ -65,14 +71,36 @@
     @Background private val bgDispatcher: CoroutineDispatcher,
     private val userRepository: UserRepository,
     private val userFileManager: UserFileManager,
+    broadcastDispatcher: BroadcastDispatcher,
     @CommunalLog logBuffer: LogBuffer,
     @CommunalTableLog tableLogBuffer: TableLogBuffer,
 ) : CommunalPrefsRepository {
 
     private val logger = Logger(logBuffer, "CommunalPrefsRepositoryImpl")
 
+    /**
+     * Emits an event each time a Backup & Restore restoration job is completed. Does not emit an
+     * initial value.
+     */
+    private val backupRestorationEvents: Flow<Unit> =
+        broadcastDispatcher.broadcastFlow(
+            filter = IntentFilter(BackupHelper.ACTION_RESTORE_FINISHED),
+            flags = Context.RECEIVER_NOT_EXPORTED,
+            permission = BackupHelper.PERMISSION_SELF,
+        )
+
     override val isCtaDismissed: Flow<Boolean> =
-        userRepository.selectedUserInfo
+        combine(
+                userRepository.selectedUserInfo,
+                // Make sure combine can emit even if we never get a Backup & Restore event,
+                // which is the most common case as restoration only happens on initial device
+                // setup.
+                backupRestorationEvents.emitOnStart().onEach {
+                    logger.i("Restored state for communal preferences.")
+                },
+            ) { user, _ ->
+                user
+            }
             .flatMapLatest(::observeCtaDismissState)
             .logDiffsForTable(
                 tableLogBuffer = tableLogBuffer,
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalRepository.kt b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalRepository.kt
index 201ce83..8bfd8d9 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalRepository.kt
@@ -18,11 +18,12 @@
 
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.SceneKey
+import com.android.compose.animation.scene.TransitionKey
+import com.android.systemui.communal.dagger.Communal
 import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
-import com.android.systemui.scene.data.repository.SceneContainerRepository
-import com.android.systemui.scene.shared.flag.SceneContainerFlags
+import com.android.systemui.scene.shared.model.SceneDataSource
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -30,7 +31,6 @@
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.stateIn
@@ -38,16 +38,15 @@
 /** Encapsulates the state of communal mode. */
 interface CommunalRepository {
     /**
-     * Target scene as requested by the underlying [SceneTransitionLayout] or through
-     * [setDesiredScene].
+     * Target scene as requested by the underlying [SceneTransitionLayout] or through [changeScene].
      */
-    val desiredScene: StateFlow<SceneKey>
+    val currentScene: StateFlow<SceneKey>
 
     /** Exposes the transition state of the communal [SceneTransitionLayout]. */
     val transitionState: StateFlow<ObservableTransitionState>
 
     /** Updates the requested scene. */
-    fun setDesiredScene(desiredScene: SceneKey)
+    fun changeScene(toScene: SceneKey, transitionKey: TransitionKey? = null)
 
     /**
      * Updates the transition state of the hub [SceneTransitionLayout].
@@ -63,12 +62,10 @@
 @Inject
 constructor(
     @Background backgroundScope: CoroutineScope,
-    sceneContainerFlags: SceneContainerFlags,
-    sceneContainerRepository: SceneContainerRepository,
+    @Communal private val sceneDataSource: SceneDataSource,
 ) : CommunalRepository {
 
-    private val _desiredScene: MutableStateFlow<SceneKey> = MutableStateFlow(CommunalScenes.Default)
-    override val desiredScene: StateFlow<SceneKey> = _desiredScene.asStateFlow()
+    override val currentScene: StateFlow<SceneKey> = sceneDataSource.currentScene
 
     private val defaultTransitionState = ObservableTransitionState.Idle(CommunalScenes.Default)
     private val _transitionState = MutableStateFlow<Flow<ObservableTransitionState>?>(null)
@@ -81,8 +78,8 @@
                 initialValue = defaultTransitionState,
             )
 
-    override fun setDesiredScene(desiredScene: SceneKey) {
-        _desiredScene.value = desiredScene
+    override fun changeScene(toScene: SceneKey, transitionKey: TransitionKey?) {
+        sceneDataSource.changeScene(toScene, transitionKey)
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalSettingsRepository.kt b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalSettingsRepository.kt
index 7c65d21..c724244 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalSettingsRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalSettingsRepository.kt
@@ -21,6 +21,7 @@
 import android.appwidget.AppWidgetProviderInfo
 import android.content.IntentFilter
 import android.content.pm.UserInfo
+import android.provider.Settings
 import com.android.systemui.Flags.communalHub
 import com.android.systemui.broadcast.BroadcastDispatcher
 import com.android.systemui.communal.data.model.CommunalEnabledState
@@ -116,12 +117,12 @@
 
     private fun getEnabledByUser(user: UserInfo): Flow<Boolean> =
         secureSettings
-            .observerFlow(userId = user.id, names = arrayOf(GLANCEABLE_HUB_ENABLED))
+            .observerFlow(userId = user.id, names = arrayOf(Settings.Secure.GLANCEABLE_HUB_ENABLED))
             // Force an update
             .onStart { emit(Unit) }
             .map {
                 secureSettings.getIntForUser(
-                    GLANCEABLE_HUB_ENABLED,
+                    Settings.Secure.GLANCEABLE_HUB_ENABLED,
                     ENABLED_SETTING_DEFAULT,
                     user.id,
                 ) == 1
@@ -138,7 +139,6 @@
             .map { devicePolicyManager.areKeyguardWidgetsAllowed(user.id) }
 
     companion object {
-        const val GLANCEABLE_HUB_ENABLED = "glanceable_hub_enabled"
         const val GLANCEABLE_HUB_CONTENT_SETTING = "glanceable_hub_content_setting"
         private const val ENABLED_SETTING_DEFAULT = 1
     }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/backup/CommunalPrefsBackupHelper.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/backup/CommunalPrefsBackupHelper.kt
new file mode 100644
index 0000000..55c6ec8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/communal/domain/backup/CommunalPrefsBackupHelper.kt
@@ -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.systemui.communal.domain.backup
+
+import android.app.backup.SharedPreferencesBackupHelper
+import android.content.Context
+import com.android.systemui.communal.data.repository.CommunalPrefsRepositoryImpl.Companion.FILE_NAME
+import com.android.systemui.settings.UserFileManagerImpl
+
+/** Helper to backup & restore the shared preferences in glanceable hub for the current user. */
+class CommunalPrefsBackupHelper(
+    context: Context,
+    userId: Int,
+) :
+    SharedPreferencesBackupHelper(
+        context,
+        UserFileManagerImpl.createFile(
+                userId = userId,
+                fileName = FILE_NAME,
+            )
+            .path
+    )
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 52025b1..246d5d9 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
@@ -25,6 +25,7 @@
 import android.provider.Settings
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.SceneKey
+import com.android.compose.animation.scene.TransitionKey
 import com.android.systemui.broadcast.BroadcastDispatcher
 import com.android.systemui.communal.data.repository.CommunalMediaRepository
 import com.android.systemui.communal.data.repository.CommunalPrefsRepository
@@ -80,6 +81,7 @@
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.flow.shareIn
+import kotlinx.coroutines.flow.stateIn
 
 /** Encapsulates business-logic related to communal mode. */
 @OptIn(ExperimentalCoroutinesApi::class)
@@ -142,13 +144,12 @@
             )
 
     /**
-     * Target scene as requested by the underlying [SceneTransitionLayout] or through
-     * [onSceneChanged].
+     * Target scene as requested by the underlying [SceneTransitionLayout] or through [changeScene].
      *
      * If [isCommunalAvailable] is false, will return [CommunalScenes.Blank]
      */
     val desiredScene: Flow<SceneKey> =
-        communalRepository.desiredScene.combine(isCommunalAvailable) { scene, available ->
+        communalRepository.currentScene.combine(isCommunalAvailable) { scene, available ->
             if (available) scene else CommunalScenes.Blank
         }
 
@@ -239,10 +240,14 @@
      * This will not be true while transitioning to the hub and will turn false immediately when a
      * swipe to exit the hub starts.
      */
-    val isIdleOnCommunal: Flow<Boolean> =
-        communalRepository.transitionState.map {
-            it is ObservableTransitionState.Idle && it.scene == CommunalScenes.Communal
-        }
+    val isIdleOnCommunal: StateFlow<Boolean> =
+        communalRepository.transitionState
+            .map { it is ObservableTransitionState.Idle && it.scene == CommunalScenes.Communal }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.Eagerly,
+                initialValue = false,
+            )
 
     /**
      * Flow that emits a boolean if any portion of the communal UI is visible at all.
@@ -254,9 +259,12 @@
             !(it is ObservableTransitionState.Idle && it.scene == CommunalScenes.Blank)
         }
 
-    /** Callback received whenever the [SceneTransitionLayout] finishes a scene transition. */
-    fun onSceneChanged(newScene: SceneKey) {
-        communalRepository.setDesiredScene(newScene)
+    /**
+     * Asks for an asynchronous scene witch to [newScene], which will use the corresponding
+     * installed transition or the one specified by [transitionKey], if provided.
+     */
+    fun changeScene(newScene: SceneKey, transitionKey: TransitionKey? = null) {
+        communalRepository.changeScene(newScene, transitionKey)
     }
 
     fun setEditModeOpen(isOpen: Boolean) {
@@ -264,8 +272,11 @@
     }
 
     /** Show the widget editor Activity. */
-    fun showWidgetEditor(preselectedKey: String? = null) {
-        editWidgetsActivityStarter.startActivity(preselectedKey)
+    fun showWidgetEditor(
+        preselectedKey: String? = null,
+        shouldOpenWidgetPickerOnStart: Boolean = false,
+    ) {
+        editWidgetsActivityStarter.startActivity(preselectedKey, shouldOpenWidgetPickerOnStart)
     }
 
     /**
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 5fabd3c..7061227 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
@@ -91,13 +91,6 @@
         override val size = CommunalContentSize.HALF
     }
 
-    /** A CTA tile in the glanceable hub edit model which remains visible in the grid. */
-    class CtaTileInEditMode : CommunalContentModel {
-        override val key: String = KEY.CTA_TILE_IN_EDIT_MODE_KEY
-        // Same as widget size.
-        override val size = CommunalContentSize.HALF
-    }
-
     class Tutorial(
         id: Int,
         override var size: CommunalContentSize,
@@ -154,5 +147,5 @@
 
     fun isWidgetContent() = this is WidgetContent
 
-    fun isSmartspace() = this is Smartspace
+    fun isLiveContent() = this is Smartspace || this is Umo
 }
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 c913300..095222a 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
@@ -49,8 +49,8 @@
         communalInteractor.signalUserInteraction()
     }
 
-    fun onSceneChanged(scene: SceneKey) {
-        communalInteractor.onSceneChanged(scene)
+    fun changeScene(scene: SceneKey) {
+        communalInteractor.changeScene(scene)
     }
 
     /**
@@ -87,6 +87,9 @@
     /** Whether the popup message triggered by dismissing the CTA tile is showing. */
     open val isPopupOnDismissCtaShowing: Flow<Boolean> = flowOf(false)
 
+    /** Whether the communal hub is empty with no widget available. */
+    open val isEmptyState: Flow<Boolean> = flowOf(false)
+
     /** Hide the popup message triggered by dismissing the CTA tile. */
     open fun onHidePopupAfterDismissCta() {}
 
@@ -103,7 +106,10 @@
     open fun onReorderWidgets(widgetIdToPriorityMap: Map<Int, Int>) {}
 
     /** Called as the UI requests opening the widget editor with an optional preselected widget. */
-    open fun onOpenWidgetEditor(preselectedKey: String? = null) {}
+    open fun onOpenWidgetEditor(
+        preselectedKey: String? = null,
+        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 afa7c37..b3002cd 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
@@ -43,7 +43,6 @@
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.first
-import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.withContext
 
@@ -66,11 +65,9 @@
 
     // Only widgets are editable. The CTA tile comes last in the list and remains visible.
     override val communalContent: Flow<List<CommunalContentModel>> =
-        communalInteractor.widgetContent
-            .map { widgets -> widgets + listOf(CommunalContentModel.CtaTileInEditMode()) }
-            .onEach { models ->
-                logger.d({ "Content updated: $str1" }) { str1 = models.joinToString { it.key } }
-            }
+        communalInteractor.widgetContent.onEach { models ->
+            logger.d({ "Content updated: $str1" }) { str1 = models.joinToString { it.key } }
+        }
 
     private val _reorderingWidgets = MutableStateFlow(false)
 
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt
index 6e69ed7..c73d738 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt
@@ -41,8 +41,10 @@
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.launch
 
@@ -83,6 +85,12 @@
                 logger.d({ "Content updated: $str1" }) { str1 = models.joinToString { it.key } }
             }
 
+    override val isEmptyState: Flow<Boolean> =
+        communalInteractor.widgetContent
+            .map { it.isEmpty() }
+            .distinctUntilChanged()
+            .onEach { logger.d("isEmptyState: $it") }
+
     private val _isPopupOnDismissCtaShowing: MutableStateFlow<Boolean> = MutableStateFlow(false)
     override val isPopupOnDismissCtaShowing: Flow<Boolean> =
         _isPopupOnDismissCtaShowing.asStateFlow()
@@ -112,8 +120,10 @@
         }
     }
 
-    override fun onOpenWidgetEditor(preselectedKey: String?) =
-        communalInteractor.showWidgetEditor(preselectedKey)
+    override fun onOpenWidgetEditor(
+        preselectedKey: String?,
+        shouldOpenWidgetPickerOnStart: Boolean,
+    ) = communalInteractor.showWidgetEditor(preselectedKey, shouldOpenWidgetPickerOnStart)
 
     override fun onDismissCtaTile() {
         scope.launch {
diff --git a/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt b/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt
index ba18f01..5f4b394 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt
@@ -31,7 +31,6 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.ui.Modifier
 import androidx.lifecycle.lifecycleScope
-import com.android.app.tracing.coroutines.launch
 import com.android.compose.theme.LocalAndroidColorScheme
 import com.android.compose.theme.PlatformTheme
 import com.android.internal.logging.UiEventLogger
@@ -60,12 +59,15 @@
         private const val TAG = "EditWidgetsActivity"
         private const val EXTRA_IS_PENDING_WIDGET_DRAG = "is_pending_widget_drag"
         const val EXTRA_PRESELECTED_KEY = "preselected_key"
+        const val EXTRA_OPEN_WIDGET_PICKER_ON_START = "open_widget_picker_on_start"
     }
 
     private val logger = Logger(logBuffer, "EditWidgetsActivity")
 
     private val widgetConfigurator by lazy { widgetConfiguratorFactory.create(this) }
 
+    private var shouldOpenWidgetPickerOnStart = false
+
     private val addWidgetActivityLauncher: ActivityResultLauncher<Intent> =
         registerForActivityResult(StartActivityForResult()) { result ->
             when (result.resultCode) {
@@ -112,6 +114,9 @@
         window.setDecorFitsSystemWindows(false)
 
         val preselectedKey = intent.getStringExtra(EXTRA_PRESELECTED_KEY)
+        shouldOpenWidgetPickerOnStart =
+            intent.getBooleanExtra(EXTRA_OPEN_WIDGET_PICKER_ON_START, false)
+
         communalViewModel.setSelectedKey(preselectedKey)
 
         setContent {
@@ -144,7 +149,7 @@
 
     private fun onEditDone() {
         try {
-            communalViewModel.onSceneChanged(CommunalScenes.Communal)
+            communalViewModel.changeScene(CommunalScenes.Communal)
             checkNotNull(windowManagerService).lockNow(/* options */ null)
             finish()
         } catch (e: RemoteException) {
@@ -162,6 +167,11 @@
     override fun onStart() {
         super.onStart()
 
+        if (shouldOpenWidgetPickerOnStart) {
+            onOpenWidgetPicker()
+            shouldOpenWidgetPickerOnStart = false
+        }
+
         logger.i("Starting the communal widget editor activity")
         uiEventLogger.log(CommunalUiEvent.COMMUNAL_HUB_EDIT_MODE_SHOWN)
     }
diff --git a/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivityStarter.kt b/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivityStarter.kt
index d1843af..76be005 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivityStarter.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivityStarter.kt
@@ -18,13 +18,17 @@
 
 import android.content.Context
 import android.content.Intent
+import com.android.systemui.communal.widgets.EditWidgetsActivity.Companion.EXTRA_OPEN_WIDGET_PICKER_ON_START
 import com.android.systemui.communal.widgets.EditWidgetsActivity.Companion.EXTRA_PRESELECTED_KEY
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.plugins.ActivityStarter
 import javax.inject.Inject
 
 interface EditWidgetsActivityStarter {
-    fun startActivity(preselectedKey: String? = null)
+    fun startActivity(
+        preselectedKey: String? = null,
+        shouldOpenWidgetPickerOnStart: Boolean = false,
+    )
 }
 
 class EditWidgetsActivityStarterImpl
@@ -34,11 +38,14 @@
     private val activityStarter: ActivityStarter,
 ) : EditWidgetsActivityStarter {
 
-    override fun startActivity(preselectedKey: String?) {
+    override fun startActivity(preselectedKey: String?, shouldOpenWidgetPickerOnStart: Boolean) {
         activityStarter.startActivityDismissingKeyguard(
             Intent(applicationContext, EditWidgetsActivity::class.java)
                 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
-                .apply { preselectedKey?.let { putExtra(EXTRA_PRESELECTED_KEY, preselectedKey) } },
+                .apply {
+                    preselectedKey?.let { putExtra(EXTRA_PRESELECTED_KEY, preselectedKey) }
+                    putExtra(EXTRA_OPEN_WIDGET_PICKER_ON_START, shouldOpenWidgetPickerOnStart)
+                },
             /* onlyProvisioned = */ true,
             /* dismissShade = */ true,
         )
diff --git a/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java b/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java
index dc32a59..c709e34 100644
--- a/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java
+++ b/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java
@@ -130,15 +130,9 @@
         }
 
         @Override
-        protected void onViewAttached() {
-            mView.setOnClickListener(this::onClick);
-        }
+        protected void onViewAttached() {}
 
         @Override
         protected void onViewDetached() {}
-
-        private void onClick(View v) {
-            mUiEventLogger.log(DreamOverlayUiEvent.DREAM_CLOCK_TAPPED);
-        }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/complication/DreamOverlayUiEvent.kt b/packages/SystemUI/src/com/android/systemui/complication/DreamOverlayUiEvent.kt
index 17cc829..4d41262 100644
--- a/packages/SystemUI/src/com/android/systemui/complication/DreamOverlayUiEvent.kt
+++ b/packages/SystemUI/src/com/android/systemui/complication/DreamOverlayUiEvent.kt
@@ -23,7 +23,6 @@
 enum class DreamOverlayUiEvent(private val mId: Int) : UiEventEnum {
     @UiEvent(doc = "The home controls on the screensaver has been tapped.")
     DREAM_HOME_CONTROLS_TAPPED(1212),
-    @UiEvent(doc = "The clock on the screensaver has been tapped") DREAM_CLOCK_TAPPED(1440),
     @UiEvent(doc = "The weather on the screensaver has been tapped") DREAM_WEATHER_TAPPED(1441);
 
     override fun getId(): Int {
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java
index 6aa5e8b..2fa42ec 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java
@@ -19,6 +19,7 @@
 import android.content.BroadcastReceiver;
 
 import com.android.systemui.GuestResetOrExitSessionReceiver;
+import com.android.systemui.accessibility.hearingaid.HearingDevicesDialogReceiver;
 import com.android.systemui.media.dialog.MediaOutputDialogReceiver;
 import com.android.systemui.people.widget.PeopleSpaceWidgetPinnedReceiver;
 import com.android.systemui.people.widget.PeopleSpaceWidgetProvider;
@@ -88,4 +89,13 @@
     @ClassKey(GuestResetOrExitSessionReceiver.class)
     public abstract BroadcastReceiver bindGuestResetOrExitSessionReceiver(
             GuestResetOrExitSessionReceiver broadcastReceiver);
+
+    /**
+     *
+     */
+    @Binds
+    @IntoMap
+    @ClassKey(HearingDevicesDialogReceiver.class)
+    public abstract BroadcastReceiver bindHearingDevicesDialogReceiver(
+            HearingDevicesDialogReceiver broadcastReceiver);
 }
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
index 3b0c281..e1041669 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
@@ -36,11 +36,11 @@
 import com.android.wm.shell.onehanded.OneHanded;
 import com.android.wm.shell.pip.Pip;
 import com.android.wm.shell.recents.RecentTasks;
+import com.android.wm.shell.shared.ShellTransitions;
 import com.android.wm.shell.splitscreen.SplitScreen;
 import com.android.wm.shell.startingsurface.StartingSurface;
 import com.android.wm.shell.sysui.ShellInterface;
 import com.android.wm.shell.taskview.TaskViewFactory;
-import com.android.wm.shell.transition.ShellTransitions;
 
 import dagger.BindsInstance;
 import dagger.Subcomponent;
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index 19af371..7d86e06 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -43,12 +43,14 @@
 import com.android.systemui.bouncer.data.repository.BouncerRepositoryModule;
 import com.android.systemui.bouncer.domain.interactor.BouncerInteractorModule;
 import com.android.systemui.bouncer.ui.BouncerViewModule;
+import com.android.systemui.brightness.dagger.ScreenBrightnessModule;
 import com.android.systemui.classifier.FalsingModule;
 import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlayModule;
 import com.android.systemui.common.data.CommonDataLayerModule;
 import com.android.systemui.communal.dagger.CommunalModule;
 import com.android.systemui.complication.dagger.ComplicationComponent;
 import com.android.systemui.controls.dagger.ControlsModule;
+import com.android.systemui.dagger.qualifiers.Application;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dagger.qualifiers.SystemUser;
 import com.android.systemui.dagger.qualifiers.UiBackground;
@@ -89,6 +91,7 @@
 import com.android.systemui.recents.Recents;
 import com.android.systemui.recordissue.RecordIssueModule;
 import com.android.systemui.retail.dagger.RetailModeModule;
+import com.android.systemui.scene.shared.model.SceneContainerConfig;
 import com.android.systemui.scene.shared.model.SceneDataSource;
 import com.android.systemui.scene.shared.model.SceneDataSourceDelegator;
 import com.android.systemui.scene.ui.view.WindowRootViewComponent;
@@ -165,6 +168,8 @@
 
 import javax.inject.Named;
 
+import kotlinx.coroutines.CoroutineScope;
+
 /**
  * A dagger module for injecting components of System UI that are required by System UI.
  *
@@ -225,6 +230,7 @@
         RecordIssueModule.class,
         ReferenceModule.class,
         RetailModeModule.class,
+        ScreenBrightnessModule.class,
         ScreenshotModule.class,
         SensorModule.class,
         SecurityRepositoryModule.class,
@@ -402,6 +408,13 @@
     @ClassKey(SystemUISecondaryUserService.class)
     abstract Service bindsSystemUISecondaryUserService(SystemUISecondaryUserService service);
 
+    @Provides
+    @SysUISingleton
+    static SceneDataSourceDelegator providesSceneDataSourceDelegator(
+            @Application CoroutineScope applicationScope, SceneContainerConfig config) {
+        return new SceneDataSourceDelegator(applicationScope, config);
+    }
+
     @Binds
     abstract SceneDataSource bindSceneDataSource(SceneDataSourceDelegator delegator);
 }
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
index dfec771..e04a0e5 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java
@@ -23,7 +23,6 @@
 import com.android.systemui.SystemUIInitializer;
 import com.android.wm.shell.back.BackAnimation;
 import com.android.wm.shell.bubbles.Bubbles;
-import com.android.wm.shell.common.annotations.ShellMainThread;
 import com.android.wm.shell.dagger.WMShellModule;
 import com.android.wm.shell.dagger.WMSingleton;
 import com.android.wm.shell.desktopmode.DesktopMode;
@@ -32,11 +31,12 @@
 import com.android.wm.shell.onehanded.OneHanded;
 import com.android.wm.shell.pip.Pip;
 import com.android.wm.shell.recents.RecentTasks;
+import com.android.wm.shell.shared.ShellTransitions;
+import com.android.wm.shell.shared.annotations.ShellMainThread;
 import com.android.wm.shell.splitscreen.SplitScreen;
 import com.android.wm.shell.startingsurface.StartingSurface;
 import com.android.wm.shell.sysui.ShellInterface;
 import com.android.wm.shell.taskview.TaskViewFactory;
-import com.android.wm.shell.transition.ShellTransitions;
 
 import dagger.BindsInstance;
 import dagger.Subcomponent;
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt
index 71b5ab2..b8c03c0 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt
@@ -1,9 +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.deviceentry
 
+import com.android.keyguard.EmptyLockIconViewController
+import com.android.keyguard.LegacyLockIconViewController
+import com.android.keyguard.LockIconViewController
+import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.deviceentry.data.repository.DeviceEntryRepositoryModule
 import com.android.systemui.deviceentry.data.repository.FaceWakeUpTriggersConfigModule
+import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
 import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
+import dagger.Lazy
 import dagger.Module
+import dagger.Provides
 import dagger.multibindings.Multibinds
 
 @Module(
@@ -18,4 +41,19 @@
      * A set of DeviceEntryIconTransitions. Ensures that this can be injected even if it's empty.
      */
     @Multibinds abstract fun deviceEntryIconTransitionSet(): Set<DeviceEntryIconTransition>
+
+    companion object {
+        @Provides
+        @SysUISingleton
+        fun provideLockIconViewController(
+            legacyLockIconViewController: Lazy<LegacyLockIconViewController>,
+            emptyLockIconViewController: Lazy<EmptyLockIconViewController>,
+        ): LockIconViewController {
+            return if (DeviceEntryUdfpsRefactor.isEnabled) {
+                emptyLockIconViewController.get()
+            } else {
+                legacyLockIconViewController.get()
+            }
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepository.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepository.kt
index 8283438..f779ac8 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepository.kt
@@ -1,15 +1,11 @@
 package com.android.systemui.deviceentry.data.repository
 
-import android.util.Log
 import com.android.internal.widget.LockPatternUtils
-import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
 import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.dagger.qualifiers.Background
-import com.android.systemui.keyguard.data.repository.KeyguardRepository
 import com.android.systemui.statusbar.phone.KeyguardBypassController
-import com.android.systemui.statusbar.policy.KeyguardStateController
 import com.android.systemui.user.data.repository.UserRepository
 import dagger.Binds
 import dagger.Module
@@ -17,38 +13,20 @@
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.withContext
 
 /** Interface for classes that can access device-entry-related application state. */
 interface DeviceEntryRepository {
     /**
-     * Whether the device is unlocked.
-     *
-     * A device that is not yet unlocked requires unlocking by completing an authentication
-     * challenge according to the current authentication method, unless in cases when the current
-     * authentication method is not "secure" (for example, None); in such cases, the value of this
-     * flow will always be `true`, even if the lockscreen is showing and still needs to be dismissed
-     * by the user to proceed.
-     */
-    val isUnlocked: StateFlow<Boolean>
-
-    /**
      * Whether the lockscreen is enabled for the current user. This is `true` whenever the user has
      * chosen any secure authentication method and even if they set the lockscreen to be dismissed
      * when the user swipes on it.
      */
     suspend fun isLockscreenEnabled(): Boolean
 
-    /** Report successful authentication for device entry. */
-    fun reportSuccessfulAuthentication()
-
     /**
      * Whether lockscreen bypass is enabled. When enabled, the lockscreen will be automatically
      * dismissed once the authentication challenge is completed.
@@ -73,53 +51,8 @@
     private val userRepository: UserRepository,
     private val lockPatternUtils: LockPatternUtils,
     private val keyguardBypassController: KeyguardBypassController,
-    keyguardStateController: KeyguardStateController,
-    keyguardRepository: KeyguardRepository,
 ) : DeviceEntryRepository {
 
-    private val _isUnlocked = MutableStateFlow(false)
-
-    private val isUnlockedReportedByLegacyKeyguard =
-        conflatedCallbackFlow {
-                val callback =
-                    object : KeyguardStateController.Callback {
-                        override fun onUnlockedChanged() {
-                            trySendWithFailureLogging(
-                                keyguardStateController.isUnlocked,
-                                TAG,
-                                "updated isUnlocked due to onUnlockedChanged"
-                            )
-                        }
-
-                        override fun onKeyguardShowingChanged() {
-                            trySendWithFailureLogging(
-                                keyguardStateController.isUnlocked,
-                                TAG,
-                                "updated isUnlocked due to onKeyguardShowingChanged"
-                            )
-                        }
-                    }
-
-                keyguardStateController.addCallback(callback)
-                // Adding the callback does not send an initial update.
-                trySendWithFailureLogging(
-                    keyguardStateController.isUnlocked,
-                    TAG,
-                    "initial isKeyguardUnlocked"
-                )
-
-                awaitClose { keyguardStateController.removeCallback(callback) }
-            }
-            .distinctUntilChanged()
-            .onEach { _isUnlocked.value = it }
-            .stateIn(
-                applicationScope,
-                SharingStarted.Eagerly,
-                initialValue = false,
-            )
-
-    override val isUnlocked: StateFlow<Boolean> = _isUnlocked.asStateFlow()
-
     override suspend fun isLockscreenEnabled(): Boolean {
         return withContext(backgroundDispatcher) {
             val selectedUserId = userRepository.getSelectedUserInfo().id
@@ -127,11 +60,6 @@
         }
     }
 
-    override fun reportSuccessfulAuthentication() {
-        Log.d(TAG, "Successful authentication reported.")
-        _isUnlocked.value = true
-    }
-
     override val isBypassEnabled: StateFlow<Boolean> =
         conflatedCallbackFlow {
                 val listener =
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractor.kt
index c4e0ef7..ec574d2 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFingerprintAuthInteractor.kt
@@ -24,6 +24,7 @@
 import com.android.systemui.keyguard.shared.model.FailFingerprintAuthenticationStatus
 import com.android.systemui.keyguard.shared.model.FingerprintAuthenticationStatus
 import com.android.systemui.keyguard.shared.model.HelpFingerprintAuthenticationStatus
+import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
 import javax.inject.Inject
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
@@ -58,6 +59,9 @@
     val fingerprintHelp: Flow<HelpFingerprintAuthenticationStatus> =
         repository.authenticationStatus.filterIsInstance<HelpFingerprintAuthenticationStatus>()
 
+    val fingerprintSuccess: Flow<SuccessFingerprintAuthenticationStatus> =
+        repository.authenticationStatus.filterIsInstance<SuccessFingerprintAuthenticationStatus>()
+
     /**
      * Whether fingerprint authentication is currently allowed for the user. This is true if the
      * user has fingerprint auth enabled, enrolled, it is not disabled by any security timeouts by
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt
index fa2421a..5c1ca64 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt
@@ -26,7 +26,6 @@
 import com.android.systemui.flags.SystemPropertiesHelper
 import com.android.systemui.keyguard.domain.interactor.TrustInteractor
 import com.android.systemui.scene.domain.interactor.SceneInteractor
-import com.android.systemui.scene.shared.flag.SceneContainerFlags
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.util.kotlin.Quad
 import javax.inject.Inject
@@ -35,14 +34,11 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.merge
-import kotlinx.coroutines.flow.onStart
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.launch
 
@@ -65,8 +61,7 @@
     private val fingerprintAuthInteractor: DeviceEntryFingerprintAuthInteractor,
     private val biometricSettingsInteractor: DeviceEntryBiometricSettingsInteractor,
     private val trustInteractor: TrustInteractor,
-    flags: SceneContainerFlags,
-    deviceUnlockedInteractor: DeviceUnlockedInteractor,
+    private val deviceUnlockedInteractor: DeviceUnlockedInteractor,
     private val systemPropertiesHelper: SystemPropertiesHelper,
 ) {
     /**
@@ -78,7 +73,14 @@
      * of this flow will always be `true`, even if the lockscreen is showing and still needs to be
      * dismissed by the user to proceed.
      */
-    val isUnlocked: StateFlow<Boolean> = deviceUnlockedInteractor.isDeviceUnlocked
+    val isUnlocked: StateFlow<Boolean> =
+        deviceUnlockedInteractor.deviceUnlockStatus
+            .map { it.isUnlocked }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.WhileSubscribed(),
+                initialValue = deviceUnlockedInteractor.deviceUnlockStatus.value.isUnlocked,
+            )
 
     /**
      * Whether the device has been entered (i.e. the lockscreen has been dismissed, by any method).
@@ -100,17 +102,6 @@
             )
 
     /**
-     * Whether the user is currently authenticated by a TrustAgent like trusted device, location,
-     * etc., or by face auth.
-     */
-    private val isPassivelyAuthenticated =
-        merge(
-                trustInteractor.isTrusted,
-                faceAuthInteractor.authenticated,
-            )
-            .onStart { emit(false) }
-
-    /**
      * Whether it's currently possible to swipe up to enter the device without requiring
      * authentication or when the device is already authenticated using a passive authentication
      * mechanism like face or trust manager. This returns `false` whenever the lockscreen has been
@@ -129,10 +120,13 @@
                 authenticationInteractor.authenticationMethod.map {
                     it == AuthenticationMethodModel.None && repository.isLockscreenEnabled()
                 },
-                isPassivelyAuthenticated,
+                deviceUnlockedInteractor.deviceUnlockStatus,
                 isDeviceEntered
-            ) { isSwipeAuthMethod, isPassivelyAuthenticated, isDeviceEntered ->
-                (isSwipeAuthMethod || isPassivelyAuthenticated) && !isDeviceEntered
+            ) { isSwipeAuthMethod, deviceUnlockStatus, isDeviceEntered ->
+                (isSwipeAuthMethod ||
+                    (deviceUnlockStatus.isUnlocked &&
+                        deviceUnlockStatus.deviceUnlockSource?.dismissesLockscreen == false)) &&
+                    !isDeviceEntered
             }
             .stateIn(
                 scope = applicationScope,
@@ -235,7 +229,8 @@
      * `false` if the device can be entered without authenticating first.
      */
     suspend fun isAuthenticationRequired(): Boolean {
-        return !isUnlocked.value && authenticationInteractor.getAuthenticationMethod().isSecure
+        return !deviceUnlockedInteractor.deviceUnlockStatus.value.isUnlocked &&
+            authenticationInteractor.getAuthenticationMethod().isSecure
     }
 
     /**
@@ -246,18 +241,6 @@
      */
     val isBypassEnabled: StateFlow<Boolean> = repository.isBypassEnabled
 
-    init {
-        if (flags.isEnabled()) {
-            applicationScope.launch {
-                authenticationInteractor.onAuthenticationResult.collectLatest { isSuccessful ->
-                    if (isSuccessful) {
-                        repository.reportSuccessfulAuthentication()
-                    }
-                }
-            }
-        }
-    }
-
     private val wasRebootedForMainlineUpdate
         get() = systemPropertiesHelper.get(SYS_BOOT_REASON_PROP) == REBOOT_MAINLINE_UPDATE
 
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractor.kt
index b0495fb..098ede3 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractor.kt
@@ -21,13 +21,23 @@
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.deviceentry.data.repository.DeviceEntryRepository
+import com.android.systemui.deviceentry.shared.model.DeviceUnlockSource
+import com.android.systemui.deviceentry.shared.model.DeviceUnlockStatus
+import com.android.systemui.keyguard.domain.interactor.TrustInteractor
+import com.android.systemui.power.domain.interactor.PowerInteractor
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.merge
 import kotlinx.coroutines.flow.stateIn
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @SysUISingleton
 class DeviceUnlockedInteractor
 @Inject
@@ -35,28 +45,63 @@
     @Application private val applicationScope: CoroutineScope,
     authenticationInteractor: AuthenticationInteractor,
     deviceEntryRepository: DeviceEntryRepository,
+    trustInteractor: TrustInteractor,
+    faceAuthInteractor: DeviceEntryFaceAuthInteractor,
+    fingerprintAuthInteractor: DeviceEntryFingerprintAuthInteractor,
+    private val powerInteractor: PowerInteractor,
 ) {
 
+    private val deviceUnlockSource =
+        merge(
+            fingerprintAuthInteractor.fingerprintSuccess.map { DeviceUnlockSource.Fingerprint },
+            faceAuthInteractor.authenticated
+                .filter { it }
+                .map {
+                    if (deviceEntryRepository.isBypassEnabled.value) {
+                        DeviceUnlockSource.FaceWithBypass
+                    } else {
+                        DeviceUnlockSource.FaceWithoutBypass
+                    }
+                },
+            trustInteractor.isTrusted.filter { it }.map { DeviceUnlockSource.TrustAgent },
+            authenticationInteractor.onAuthenticationResult
+                .filter { it }
+                .map { DeviceUnlockSource.BouncerInput }
+        )
+
     /**
-     * Whether the device is unlocked.
+     * Whether the device is unlocked or not, along with the information about the authentication
+     * method that was used to unlock the device.
      *
      * A device that is not yet unlocked requires unlocking by completing an authentication
      * challenge according to the current authentication method, unless in cases when the current
      * authentication method is not "secure" (for example, None and Swipe); in such cases, the value
-     * of this flow will always be `true`, even if the lockscreen is showing and still needs to be
-     * dismissed by the user to proceed.
+     * of this flow will always be an instance of [DeviceUnlockStatus] with
+     * [DeviceUnlockStatus.deviceUnlockSource] as null and [DeviceUnlockStatus.isUnlocked] set to
+     * true, even if the lockscreen is showing and still needs to be dismissed by the user to
+     * proceed.
      */
-    val isDeviceUnlocked: StateFlow<Boolean> =
-        combine(
-                deviceEntryRepository.isUnlocked,
-                authenticationInteractor.authenticationMethod,
-            ) { isUnlocked, authenticationMethod ->
-                (!authenticationMethod.isSecure || isUnlocked) &&
-                    authenticationMethod != AuthenticationMethodModel.Sim
+    val deviceUnlockStatus: StateFlow<DeviceUnlockStatus> =
+        authenticationInteractor.authenticationMethod
+            .flatMapLatest { authMethod ->
+                if (!authMethod.isSecure) {
+                    flowOf(DeviceUnlockStatus(true, null))
+                } else if (authMethod == AuthenticationMethodModel.Sim) {
+                    // Device is locked if SIM is locked.
+                    flowOf(DeviceUnlockStatus(false, null))
+                } else {
+                    powerInteractor.isAsleep.flatMapLatest { isAsleep ->
+                        if (isAsleep) {
+                            flowOf(DeviceUnlockStatus(false, null))
+                        } else {
+                            deviceUnlockSource.map { DeviceUnlockStatus(true, it) }
+                        }
+                    }
+                }
             }
             .stateIn(
                 scope = applicationScope,
                 started = SharingStarted.Eagerly,
-                initialValue = false,
+                initialValue = DeviceUnlockStatus(false, null),
             )
 }
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractor.kt
index 289dbd9..195aa5f 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractor.kt
@@ -74,8 +74,13 @@
                     keyguardInteractor.isKeyguardShowing,
                     primaryBouncerInteractor.isShowing,
                     alternateBouncerInteractor.isVisible,
-                ) { occluded, showing, primaryBouncerShowing, alternateBouncerVisible ->
-                    occluded && showing && !primaryBouncerShowing && !alternateBouncerVisible
+                    keyguardInteractor.isDozing,
+                ) { occluded, showing, primaryBouncerShowing, alternateBouncerVisible, dozing ->
+                    occluded &&
+                        showing &&
+                        !primaryBouncerShowing &&
+                        !alternateBouncerVisible &&
+                        !dozing
                 }
                 .distinctUntilChanged()
         }
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/shared/model/DeviceUnlockSource.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/shared/model/DeviceUnlockSource.kt
new file mode 100644
index 0000000..619c240
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/shared/model/DeviceUnlockSource.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.deviceentry.shared.model
+
+/**
+ * Source of the device unlock.
+ *
+ * @property dismissesLockscreen whether unlock with this authentication method dismisses the
+ *   lockscreen and enters the device.
+ */
+sealed class DeviceUnlockSource(val dismissesLockscreen: Boolean) {
+
+    data object Fingerprint : DeviceUnlockSource(true)
+    data object FaceWithBypass : DeviceUnlockSource(dismissesLockscreen = true)
+    data object FaceWithoutBypass : DeviceUnlockSource(dismissesLockscreen = false)
+    data object TrustAgent : DeviceUnlockSource(dismissesLockscreen = false)
+    data object BouncerInput : DeviceUnlockSource(dismissesLockscreen = true)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/shared/model/DeviceUnlockStatus.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/shared/model/DeviceUnlockStatus.kt
new file mode 100644
index 0000000..f694c33
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/shared/model/DeviceUnlockStatus.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.deviceentry.shared.model
+
+/**
+ * Wrapper class that combines whether device is unlocked or not, along with the authentication
+ * method used to unlock the device.
+ *
+ * @property isUnlocked whether device is unlocked or not.
+ * @property deviceUnlockSource source that unlocked the device, null if lockscreen is not secure or
+ *   if [isUnlocked] is false.
+ */
+data class DeviceUnlockStatus(
+    val isUnlocked: Boolean,
+    val deviceUnlockSource: DeviceUnlockSource?
+) {
+    init {
+        assert(isUnlocked || deviceUnlockSource == null) {
+            "deviceUnlockSource must be null when device is locked."
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/ui/viewmodel/UdfpsAccessibilityOverlayViewModel.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/ui/viewmodel/UdfpsAccessibilityOverlayViewModel.kt
index f5a8870..191d612 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/ui/viewmodel/UdfpsAccessibilityOverlayViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/ui/viewmodel/UdfpsAccessibilityOverlayViewModel.kt
@@ -54,9 +54,21 @@
     fun onHoverEvent(v: View, event: MotionEvent): Boolean {
         val overlayParams = udfpsOverlayParams.value
         val scaledTouch: Point =
-            udfpsUtils.getTouchInNativeCoordinates(event.getPointerId(0), event, overlayParams)
+            udfpsUtils.getTouchInNativeCoordinates(
+                event.getPointerId(0),
+                event,
+                overlayParams, /* rotateToPortrait */
+                false
+            )
 
-        if (!udfpsUtils.isWithinSensorArea(event.getPointerId(0), event, overlayParams)) {
+        if (
+            !udfpsUtils.isWithinSensorArea(
+                event.getPointerId(0),
+                event,
+                overlayParams,
+                /* rotateTouchToPortrait */ false
+            )
+        ) {
             // view only receives motionEvents when [visible] which requires touchExplorationEnabled
             val announceStr =
                 udfpsUtils.onTouchOutsideOfSensorArea(
@@ -65,6 +77,7 @@
                     scaledTouch.x,
                     scaledTouch.y,
                     overlayParams,
+                    /* touchRotatedToPortrait */ false
                 )
             if (announceStr != null) {
                 v.announceForAccessibility(announceStr)
diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt
index 1230156..4ac0c56 100644
--- a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayRepository.kt
@@ -42,6 +42,7 @@
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.filterIsInstance
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.map
@@ -67,6 +68,9 @@
      */
     val pendingDisplay: Flow<PendingDisplay?>
 
+    /** Whether the default display is currently off. */
+    val defaultDisplayOff: Flow<Boolean>
+
     /** Represents a connected display that has not been enabled yet. */
     interface PendingDisplay {
         /** Id of the pending display. */
@@ -290,6 +294,11 @@
             }
             .debugLog("pendingDisplay")
 
+    override val defaultDisplayOff: Flow<Boolean> =
+        displays
+            .map { displays -> displays.firstOrNull { it.displayId == Display.DEFAULT_DISPLAY } }
+            .map { it?.state == Display.STATE_OFF }
+
     private fun <T> Flow<T>.debugLog(flowName: String): Flow<T> {
         return if (DEBUG) {
             traceEach(flowName, logcat = true, traceEmissionCount = true)
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index 424bd0a..9a9e698 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -209,6 +209,15 @@
     }
 
     /**
+     * Logs cancelation requests for time ticks
+     * @param isPending is an unschedule request pending?
+     * @param isTimeTickScheduled is a time tick request scheduled
+     */
+    public void tracePendingUnscheduleTimeTick(boolean isPending, boolean isTimeTickScheduled) {
+        mLogger.logPendingUnscheduleTimeTick(isPending, isTimeTickScheduled);
+    }
+
+    /**
      * Appends keyguard visibility change event to the logs
      * @param showing whether the keyguard is now showing
      */
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt b/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt
index 75b8e51..9d6693e 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt
@@ -162,6 +162,15 @@
         })
     }
 
+    fun logPendingUnscheduleTimeTick(isPending: Boolean, isTimeTickScheduled: Boolean) {
+        buffer.log(TAG, INFO, {
+            bool1 = isPending
+            bool2 = isTimeTickScheduled
+        }, {
+            "Pending unschedule time tick, isPending=$bool1, isTimeTickScheduled:$bool2"
+        })
+    }
+
     fun logDozeStateChanged(state: DozeMachine.State) {
         buffer.log(TAG, INFO, {
             str1 = state.name
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
index 34a80e8..1a855d7 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
@@ -26,11 +26,12 @@
 import android.text.format.Formatter;
 import android.util.Log;
 
-import com.android.systemui.DejankUtils;
+import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.doze.dagger.DozeScope;
 import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.util.AlarmTimeout;
+import com.android.systemui.util.concurrency.DelayableExecutor;
 import com.android.systemui.util.wakelock.WakeLock;
 
 import java.util.Calendar;
@@ -52,14 +53,19 @@
     private final boolean mCanAnimateTransition;
     private final DozeParameters mDozeParameters;
     private final DozeLog mDozeLog;
+    private final DelayableExecutor mBgExecutor;
 
+    private Runnable mCancelRunnable = null;
     private long mLastTimeTickElapsed = 0;
     // If time tick is scheduled and there's not a pending runnable to cancel:
-    private boolean mTimeTickScheduled;
+    private volatile boolean mTimeTickScheduled;
     private final Runnable mCancelTimeTickerRunnable =  new Runnable() {
         @Override
         public void run() {
-            mTimeTicker.cancel();
+            mDozeLog.tracePendingUnscheduleTimeTick(false, mTimeTickScheduled);
+            if (!mTimeTickScheduled) {
+                mTimeTicker.cancel();
+            }
         }
     };
 
@@ -67,11 +73,13 @@
     public DozeUi(Context context, AlarmManager alarmManager,
             WakeLock wakeLock, DozeHost host, @Main Handler handler,
             DozeParameters params,
+            @Background DelayableExecutor bgExecutor,
             DozeLog dozeLog) {
         mContext = context;
         mWakeLock = wakeLock;
         mHost = host;
         mHandler = handler;
+        mBgExecutor = bgExecutor;
         mCanAnimateTransition = !params.getDisplayNeedsBlanking();
         mDozeParameters = params;
         mTimeTicker = new AlarmTimeout(alarmManager, this::onTimeTick, "doze_time_tick", handler);
@@ -166,7 +174,6 @@
             return;
         }
         mTimeTickScheduled = true;
-        DejankUtils.removeCallbacks(mCancelTimeTickerRunnable);
 
         long time = System.currentTimeMillis();
         long delta = roundToNextMinute(time) - System.currentTimeMillis();
@@ -182,7 +189,8 @@
             return;
         }
         mTimeTickScheduled = false;
-        DejankUtils.postAfterTraversal(mCancelTimeTickerRunnable);
+        mDozeLog.tracePendingUnscheduleTimeTick(true, mTimeTickScheduled);
+        mBgExecutor.execute(mCancelTimeTickerRunnable);
     }
 
     private void verifyLastTimeTick() {
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamService.kt b/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamService.kt
index 376d312..ee8e205 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamService.kt
+++ b/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamService.kt
@@ -81,7 +81,7 @@
                     activity = activity,
                     onCreateCallback = this::onTaskFragmentCreated,
                     onInfoChangedCallback = this::onTaskFragmentInfoChanged,
-                    hide = { finish() }
+                    hide = { endDream() }
                 )
                 .apply { createTaskFragment() }
 
@@ -91,11 +91,15 @@
     private fun onTaskFragmentInfoChanged(taskFragmentInfo: TaskFragmentInfo) {
         if (taskFragmentInfo.isEmpty) {
             logger.d("Finishing dream due to TaskFragment being empty")
-            finish()
-            homeControlsComponentInteractor.onTaskFragmentEmpty()
+            endDream()
         }
     }
 
+    private fun endDream() {
+        homeControlsComponentInteractor.onDreamEndUnexpectedly()
+        wakeUp()
+    }
+
     private fun onTaskFragmentCreated(taskFragmentInfo: TaskFragmentInfo) {
         val setting = controlsSettingsRepository.allowActionOnTrivialControlsInLockscreen.value
         val componentName = homeControlsComponentInteractor.panelComponent.value
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/domain/interactor/HomeControlsComponentInteractor.kt b/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/domain/interactor/HomeControlsComponentInteractor.kt
index f0067dc..74452d1 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/domain/interactor/HomeControlsComponentInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/domain/interactor/HomeControlsComponentInteractor.kt
@@ -19,6 +19,7 @@
 import android.annotation.SuppressLint
 import android.app.DreamManager
 import android.content.ComponentName
+import android.os.PowerManager
 import android.os.UserHandle
 import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
 import com.android.systemui.common.domain.interactor.PackageChangeInteractor
@@ -66,6 +67,7 @@
     userRepository: UserRepository,
     private val packageChangeInteractor: PackageChangeInteractor,
     private val systemClock: SystemClock,
+    private val powerManager: PowerManager,
     private val dreamManager: DreamManager,
     @Background private val bgScope: CoroutineScope
 ) {
@@ -135,7 +137,12 @@
     private val taskFragmentFinished =
         MutableSharedFlow<Long>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
 
-    fun onTaskFragmentEmpty() {
+    fun onDreamEndUnexpectedly() {
+        powerManager.userActivity(
+            systemClock.uptimeMillis(),
+            PowerManager.USER_ACTIVITY_EVENT_OTHER,
+            PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS,
+        )
         taskFragmentFinished.tryEmit(systemClock.currentTimeMillis())
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java
index 7f3b5eb..75c50fd 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java
@@ -19,6 +19,7 @@
 import static com.android.systemui.dreams.touch.dagger.BouncerSwipeModule.SWIPE_TO_BOUNCER_FLING_ANIMATION_UTILS_CLOSING;
 import static com.android.systemui.dreams.touch.dagger.BouncerSwipeModule.SWIPE_TO_BOUNCER_FLING_ANIMATION_UTILS_OPENING;
 import static com.android.systemui.dreams.touch.dagger.BouncerSwipeModule.SWIPE_TO_BOUNCER_START_REGION;
+import static com.android.systemui.dreams.touch.dagger.BouncerSwipeModule.MIN_BOUNCER_ZONE_SCREEN_PERCENTAGE;
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
@@ -81,6 +82,7 @@
     private final LockPatternUtils mLockPatternUtils;
     private final UserTracker mUserTracker;
     private final float mBouncerZoneScreenPercentage;
+    private final float mMinBouncerZoneScreenPercentage;
 
     private final ScrimManager mScrimManager;
     private ScrimController mCurrentScrimController;
@@ -172,19 +174,18 @@
                     final float screenTravelPercentage = Math.abs(e1.getY() - e2.getY())
                             / mTouchSession.getBounds().height();
                     setPanelExpansion(mBouncerInitiallyShowing
-                            ? screenTravelPercentage : 1 - screenTravelPercentage, dragDownAmount);
+                            ? screenTravelPercentage : 1 - screenTravelPercentage);
                     return true;
                 }
             };
 
-    private void setPanelExpansion(float expansion, float dragDownAmount) {
+    private void setPanelExpansion(float expansion) {
         mCurrentExpansion = expansion;
         ShadeExpansionChangeEvent event =
                 new ShadeExpansionChangeEvent(
                         /* fraction= */ mCurrentExpansion,
                         /* expanded= */ mExpanded,
-                        /* tracking= */ true,
-                        /* dragDownPxAmount= */ dragDownAmount);
+                        /* tracking= */ true);
         mCurrentScrimController.expand(event);
     }
 
@@ -223,6 +224,7 @@
             @Named(SWIPE_TO_BOUNCER_FLING_ANIMATION_UTILS_CLOSING)
                     FlingAnimationUtils flingAnimationUtilsClosing,
             @Named(SWIPE_TO_BOUNCER_START_REGION) float swipeRegionPercentage,
+            @Named(MIN_BOUNCER_ZONE_SCREEN_PERCENTAGE) float minRegionPercentage,
             UiEventLogger uiEventLogger) {
         mCentralSurfaces = centralSurfaces;
         mScrimManager = scrimManager;
@@ -230,6 +232,7 @@
         mLockPatternUtils = lockPatternUtils;
         mUserTracker = userTracker;
         mBouncerZoneScreenPercentage = swipeRegionPercentage;
+        mMinBouncerZoneScreenPercentage = minRegionPercentage;
         mFlingAnimationUtils = flingAnimationUtils;
         mFlingAnimationUtilsClosing = flingAnimationUtilsClosing;
         mValueAnimatorCreator = valueAnimatorCreator;
@@ -238,24 +241,27 @@
     }
 
     @Override
-    public void getTouchInitiationRegion(Rect bounds, Region region) {
+    public void getTouchInitiationRegion(Rect bounds, Region region, Rect exclusionRect) {
         final int width = bounds.width();
         final int height = bounds.height();
+        final float minBouncerHeight = height * mMinBouncerZoneScreenPercentage;
+        final int minAllowableBottom = Math.round(height * (1 - mMinBouncerZoneScreenPercentage));
 
-        if (mCentralSurfaces.map(CentralSurfaces::isBouncerShowing).orElse(false)) {
-            region.op(new Rect(0, 0, width,
-                            Math.round(
-                                    height * mBouncerZoneScreenPercentage)),
-                    Region.Op.UNION);
-        } else {
-            region.op(new Rect(0,
-                            Math.round(height * (1 - mBouncerZoneScreenPercentage)),
-                            width,
-                            height),
-                    Region.Op.UNION);
+        final boolean isBouncerShowing =
+                mCentralSurfaces.map(CentralSurfaces::isBouncerShowing).orElse(false);
+        final Rect normalRegion = isBouncerShowing
+                ? new Rect(0, 0, width, Math.round(height * mBouncerZoneScreenPercentage))
+                : new Rect(0, Math.round(height * (1 - mBouncerZoneScreenPercentage)),
+                        width, height);
+
+        if (!isBouncerShowing && exclusionRect != null) {
+            int lowestBottom = Math.min(Math.max(0, exclusionRect.bottom), minAllowableBottom);
+            normalRegion.top = Math.max(normalRegion.top, lowestBottom);
         }
+        region.union(normalRegion);
     }
 
+
     @Override
     public void onSessionStart(TouchSession session) {
         mVelocityTracker = mVelocityTrackerFactory.obtain();
@@ -333,7 +339,7 @@
                 animation -> {
                     float expansionFraction = (float) animation.getAnimatedValue();
                     float dragDownAmount = expansionFraction * expansionHeight;
-                    setPanelExpansion(expansionFraction, dragDownAmount);
+                    setPanelExpansion(expansionFraction);
                 });
         if (!mBouncerInitiallyShowing
                 && targetExpansion == KeyguardBouncerConstants.EXPANSION_VISIBLE) {
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java
index e5c705f..13588c2 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java
@@ -87,7 +87,7 @@
     }
 
     @Override
-    public void getTouchInitiationRegion(Rect bounds, Region region) {
+    public void getTouchInitiationRegion(Rect bounds, Region region, Rect exclusionRect) {
         final Rect outBounds = new Rect(bounds);
         outBounds.inset(outBounds.width() - mInitiationWidth, 0, 0, 0);
         region.op(outBounds, Region.Op.UNION);
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java
index 55a9c0c..3b22b31 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitor.java
@@ -18,9 +18,15 @@
 
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
 
+import static com.android.systemui.shared.Flags.bouncerAreaExclusion;
+
 import android.graphics.Rect;
 import android.graphics.Region;
+import android.os.RemoteException;
+import android.util.Log;
 import android.view.GestureDetector;
+import android.view.ISystemGestureExclusionListener;
+import android.view.IWindowManager;
 import android.view.InputEvent;
 import android.view.MotionEvent;
 
@@ -31,6 +37,8 @@
 import androidx.lifecycle.LifecycleObserver;
 import androidx.lifecycle.LifecycleOwner;
 
+import com.android.systemui.dagger.qualifiers.Background;
+import com.android.systemui.dagger.qualifiers.DisplayId;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dreams.touch.dagger.InputSessionComponent;
 import com.android.systemui.shared.system.InputChannelCompat;
@@ -58,8 +66,23 @@
 public class DreamOverlayTouchMonitor {
     // This executor is used to protect {@code mActiveTouchSessions} from being modified
     // concurrently. Any operation that adds or removes values should use this executor.
-    private final Executor mExecutor;
+    public String TAG = "DreamOverlayTouchMonitor";
+    private final Executor mMainExecutor;
+    private final Executor mBackgroundExecutor;
     private final Lifecycle mLifecycle;
+    private Rect mExclusionRect = null;
+
+    private ISystemGestureExclusionListener mGestureExclusionListener =
+            new ISystemGestureExclusionListener.Stub() {
+                @Override
+                public void onSystemGestureExclusionChanged(int displayId,
+                        Region systemGestureExclusion,
+                        Region systemGestureExclusionUnrestricted) {
+                    mExclusionRect = systemGestureExclusion.getBounds();
+                }
+            };
+
+
 
     /**
      * Adds a new {@link TouchSessionImpl} to participate in receiving future touches and gestures.
@@ -67,7 +90,7 @@
     private ListenableFuture<DreamTouchHandler.TouchSession> push(
             TouchSessionImpl touchSessionImpl) {
         return CallbackToFutureAdapter.getFuture(completer -> {
-            mExecutor.execute(() -> {
+            mMainExecutor.execute(() -> {
                 if (!mActiveTouchSessions.remove(touchSessionImpl)) {
                     completer.set(null);
                     return;
@@ -90,7 +113,7 @@
     private ListenableFuture<DreamTouchHandler.TouchSession> pop(
             TouchSessionImpl touchSessionImpl) {
         return CallbackToFutureAdapter.getFuture(completer -> {
-            mExecutor.execute(() -> {
+            mMainExecutor.execute(() -> {
                 if (mActiveTouchSessions.remove(touchSessionImpl)) {
                     touchSessionImpl.onRemoved();
 
@@ -240,6 +263,17 @@
      */
     private void startMonitoring() {
         stopMonitoring(true);
+        if (bouncerAreaExclusion()) {
+            mBackgroundExecutor.execute(() -> {
+                try {
+                    mWindowManagerService.registerSystemGestureExclusionListener(
+                            mGestureExclusionListener, mDisplayId);
+                } catch (RemoteException e) {
+                    // Handle the exception
+                    Log.e(TAG, "Failed to register gesture exclusion listener", e);
+                }
+            });
+        }
         mCurrentInputSession = mInputSessionFactory.create(
                 "dreamOverlay",
                 mInputEventListener,
@@ -252,6 +286,18 @@
      * Destroys any active {@link InputSession}.
      */
     private void stopMonitoring(boolean force) {
+        mExclusionRect = null;
+        if (bouncerAreaExclusion()) {
+            mBackgroundExecutor.execute(() -> {
+                try {
+                    mWindowManagerService.unregisterSystemGestureExclusionListener(
+                            mGestureExclusionListener, mDisplayId);
+                } catch (RemoteException e) {
+                    // Handle the exception
+                    Log.e(TAG, "unregisterSystemGestureExclusionListener: failed", e);
+                }
+            });
+        }
         if (mCurrentInputSession == null) {
             return;
         }
@@ -263,7 +309,7 @@
 
         // When we stop monitoring touches, we must ensure that all active touch sessions and
         // descendants informed of the removal so any cleanup for active tracking can proceed.
-        mExecutor.execute(() -> mActiveTouchSessions.forEach(touchSession -> {
+        mMainExecutor.execute(() -> mActiveTouchSessions.forEach(touchSession -> {
             while (touchSession != null) {
                 touchSession.onRemoved();
                 touchSession = touchSession.getPredecessor();
@@ -295,11 +341,15 @@
                             if (!handler.isEnabled()) {
                                 continue;
                             }
-                    final Rect maxBounds = mDisplayHelper.getMaxBounds(ev.getDisplayId(),
-                            TYPE_APPLICATION_OVERLAY);
-
-                    final Region initiationRegion = Region.obtain();
-                    handler.getTouchInitiationRegion(maxBounds, initiationRegion);
+                            final Rect maxBounds = mDisplayHelper.getMaxBounds(ev.getDisplayId(),
+                                    TYPE_APPLICATION_OVERLAY);
+                            final Region initiationRegion = Region.obtain();
+                            Rect exclusionRect = null;
+                            if (bouncerAreaExclusion()) {
+                                exclusionRect = getCurrentExclusionRect();
+                            }
+                            handler.getTouchInitiationRegion(
+                                            maxBounds, initiationRegion, exclusionRect);
 
                     if (!initiationRegion.isEmpty()) {
                         // Initiation regions require a motion event to determine pointer location
@@ -335,6 +385,9 @@
                     .flatMap(Collection::stream)
                     .forEach(inputEventListener -> inputEventListener.onInputEvent(ev));
         }
+                    private Rect getCurrentExclusionRect() {
+                        return mExclusionRect;
+                    }
     };
 
     /**
@@ -416,6 +469,9 @@
 
     private InputSessionComponent.Factory mInputSessionFactory;
     private InputSession mCurrentInputSession;
+    private final int mDisplayId;
+    private final IWindowManager mWindowManagerService;
+
 
     /**
      * Designated constructor for {@link DreamOverlayTouchMonitor}
@@ -432,15 +488,21 @@
     @Inject
     public DreamOverlayTouchMonitor(
             @Main Executor executor,
+            @Background Executor backgroundExecutor,
             Lifecycle lifecycle,
             InputSessionComponent.Factory inputSessionFactory,
             DisplayHelper displayHelper,
-            Set<DreamTouchHandler> handlers) {
+            Set<DreamTouchHandler> handlers,
+            IWindowManager windowManagerService,
+            @DisplayId int displayId) {
+        mDisplayId = displayId;
         mHandlers = handlers;
         mInputSessionFactory = inputSessionFactory;
-        mExecutor = executor;
+        mMainExecutor = executor;
+        mBackgroundExecutor = backgroundExecutor;
         mLifecycle = lifecycle;
         mDisplayHelper = displayHelper;
+        mWindowManagerService = windowManagerService;
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java
index 72ad45d..1ec0008 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/DreamTouchHandler.java
@@ -104,7 +104,7 @@
      * indicating the entire screen should be considered.
      * @param region A {@link Region} that is passed in to the target entry touch region.
      */
-    default void getTouchInitiationRegion(Rect bounds, Region region) {
+    default void getTouchInitiationRegion(Rect bounds, Region region, Rect exclusionRect) {
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/ShadeTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/ShadeTouchHandler.java
index 6f05e83..e0bf52e 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/ShadeTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/ShadeTouchHandler.java
@@ -82,7 +82,7 @@
     }
 
     @Override
-    public void getTouchInitiationRegion(Rect bounds, Region region) {
+    public void getTouchInitiationRegion(Rect bounds, Region region, Rect exclusionRect) {
         final Rect outBounds = new Rect(bounds);
         outBounds.inset(0, 0, 0, outBounds.height() - mInitiationHeight);
         region.op(outBounds, Region.Op.UNION);
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/dagger/BouncerSwipeModule.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/dagger/BouncerSwipeModule.java
index 8cf11a9..a5db2ff 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/touch/dagger/BouncerSwipeModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/dagger/BouncerSwipeModule.java
@@ -21,10 +21,10 @@
 import android.util.TypedValue;
 import android.view.VelocityTracker;
 
-import com.android.systemui.res.R;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dreams.touch.BouncerSwipeTouchHandler;
 import com.android.systemui.dreams.touch.DreamTouchHandler;
+import com.android.systemui.res.R;
 import com.android.systemui.shade.ShadeViewController;
 import com.android.wm.shell.animation.FlingAnimationUtils;
 
@@ -46,6 +46,9 @@
      */
     public static final String SWIPE_TO_BOUNCER_START_REGION = "swipe_to_bouncer_start_region";
 
+    public static final String MIN_BOUNCER_ZONE_SCREEN_PERCENTAGE =
+            "min_bouncer_zone_screen_percentage";
+
     /**
      * The {@link android.view.animation.AnimationUtils} for animating the bouncer closing.
      */
@@ -110,6 +113,18 @@
     }
 
     /**
+     * Provides the minimum region to start wipe gestures from.
+     */
+    @Provides
+    @Named(MIN_BOUNCER_ZONE_SCREEN_PERCENTAGE)
+    public static float providesMinBouncerZoneScreenPercentage(@Main Resources resources) {
+        TypedValue typedValue = new TypedValue();
+        resources.getValue(R.dimen.dream_overlay_bouncer_min_region_screen_percentage,
+                typedValue, true);
+        return typedValue.getFloat();
+    }
+
+    /**
      * Provides the default {@link BouncerSwipeTouchHandler.ValueAnimatorCreator}, which is simply
      * a wrapper around {@link ValueAnimator}.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/ui/viewmodel/DreamViewModel.kt b/packages/SystemUI/src/com/android/systemui/dreams/ui/viewmodel/DreamViewModel.kt
index 1b832d4..037c23b 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/ui/viewmodel/DreamViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/dreams/ui/viewmodel/DreamViewModel.kt
@@ -57,7 +57,7 @@
                 !keyguardUpdateMonitor.isEncryptedOrLockdown(userTracker.userId)
         if (showGlanceableHub) {
             toGlanceableHubTransitionViewModel.startTransition()
-            communalInteractor.onSceneChanged(CommunalScenes.Communal)
+            communalInteractor.changeScene(CommunalScenes.Communal)
         } else {
             toLockscreenTransitionViewModel.startTransition()
         }
diff --git a/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt b/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
index 1bcee74..8b1f8d3 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
@@ -53,7 +53,7 @@
 
         // SceneContainer dependencies
         SceneContainerFlag.getFlagDependencies().forEach { (alpha, beta) -> alpha dependsOn beta }
-        SceneContainerFlag.getMainStaticFlag() dependsOn MIGRATE_KEYGUARD_STATUS_BAR_VIEW
+        SceneContainerFlag.getMainAconfigFlag() dependsOn MIGRATE_KEYGUARD_STATUS_BAR_VIEW
 
         // ComposeLockscreen dependencies
         ComposeLockscreen.token dependsOn KeyguardBottomAreaRefactor.token
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
index 19a44cc..612ae6c 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
@@ -153,11 +153,6 @@
     // TODO(b/267722622): Tracking Bug
     @JvmField val WALLPAPER_PICKER_UI_FOR_AIWP = releasedFlag("wallpaper_picker_ui_for_aiwp")
 
-    /** Whether to use a new data source for intents to run on keyguard dismissal. */
-    // TODO(b/275069969): Tracking bug.
-    @JvmField
-    val REFACTOR_KEYGUARD_DISMISS_INTENT = unreleasedFlag("refactor_keyguard_dismiss_intent")
-
     /** Whether to allow long-press on the lock screen to directly open wallpaper picker. */
     // TODO(b/277220285): Tracking bug.
     @JvmField
@@ -387,17 +382,9 @@
     // TODO(b/273800936): Tracking Bug
     @JvmField val TRACKPAD_GESTURE_COMMON = releasedFlag("trackpad_gesture_common")
 
-    // 1300 - screenshots
-    // TODO(b/264916608): Tracking Bug
-    @JvmField val SCREENSHOT_METADATA = unreleasedFlag("screenshot_metadata")
-
     // TODO(b/251205791): Tracking Bug
     @JvmField val SCREENSHOT_APP_CLIPS = releasedFlag("screenshot_app_clips")
 
-    /** TODO(b/295143676): Tracking bug. When enable, captures a screenshot for each display. */
-    @JvmField
-    val MULTI_DISPLAY_SCREENSHOT = releasedFlag("multi_display_screenshot")
-
     // 1400 - columbus
     // TODO(b/254512756): Tracking Bug
     val QUICK_TAP_IN_PCC = releasedFlag("quick_tap_in_pcc")
@@ -418,21 +405,6 @@
     val CLIPBOARD_SHARED_TRANSITIONS =
             unreleasedFlag("clipboard_shared_transitions", teamfood = true)
 
-    /**
-     * Whether the scene container (Flexiglass) is enabled. Note that SceneContainerFlags#isEnabled
-     * should be checked and toggled together with [SCENE_CONTAINER_ENABLED] so that ProGuard can
-     * remove unused code from our APK at compile time.
-     */
-    // TODO(b/283300105): Tracking Bug
-    @JvmField val SCENE_CONTAINER_ENABLED = false
-
-    /**
-     * Whether the compose bouncer is enabled. This ensures ProGuard can
-     * remove unused code from our APK at compile time.
-     */
-    // TODO(b/280877228): Tracking Bug
-    @JvmField val COMPOSE_BOUNCER_ENABLED = false
-
     // 1900
     @JvmField val NOTE_TASKS = releasedFlag("keycode_flag")
 
diff --git a/packages/SystemUI/src/com/android/systemui/haptics/qs/QSLongPressEffectViewBinder.kt b/packages/SystemUI/src/com/android/systemui/haptics/qs/QSLongPressEffectViewBinder.kt
index e298154..f4998a7 100644
--- a/packages/SystemUI/src/com/android/systemui/haptics/qs/QSLongPressEffectViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/haptics/qs/QSLongPressEffectViewBinder.kt
@@ -18,45 +18,59 @@
 
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.lifecycle.repeatWhenAttached
 import com.android.systemui.qs.tileimpl.QSTileViewImpl
-import kotlinx.coroutines.launch
+import kotlinx.coroutines.DisposableHandle
 
-object QSLongPressEffectViewBinder {
+class QSLongPressEffectViewBinder {
+
+    private var handle: DisposableHandle? = null
+    val isBound: Boolean
+        get() = handle != null
 
     fun bind(
         tile: QSTileViewImpl,
+        tileSpec: String?,
         effect: QSLongPressEffect?,
     ) {
         if (effect == null) return
 
-        tile.repeatWhenAttached {
-            repeatOnLifecycle(Lifecycle.State.STARTED) {
-                effect.scope = this
+        handle =
+            tile.repeatWhenAttached {
+                repeatOnLifecycle(Lifecycle.State.CREATED) {
+                    effect.scope = this
+                    val tag = "${tileSpec ?: "unknownTileSpec"}#LongPressEffect"
 
-                launch {
-                    effect.effectProgress.collect { progress ->
-                        progress?.let {
-                            if (it == 0f) {
-                                tile.bringToFront()
+                    launch("$tag#progress") {
+                        effect.effectProgress.collect { progress ->
+                            progress?.let {
+                                if (it == 0f) {
+                                    tile.bringToFront()
+                                }
+                                tile.updateLongPressEffectProperties(it)
                             }
-                            tile.updateLongPressEffectProperties(it)
                         }
                     }
-                }
 
-                launch {
-                    effect.actionType.collect { action ->
-                        action?.let {
-                            when (it) {
-                                QSLongPressEffect.ActionType.CLICK -> tile.performClick()
-                                QSLongPressEffect.ActionType.LONG_PRESS -> tile.performLongClick()
+                    launch("$tag#action") {
+                        effect.actionType.collect { action ->
+                            action?.let {
+                                when (it) {
+                                    QSLongPressEffect.ActionType.CLICK -> tile.performClick()
+                                    QSLongPressEffect.ActionType.LONG_PRESS ->
+                                        tile.performLongClick()
+                                }
+                                effect.clearActionType()
                             }
-                            effect.clearActionType()
                         }
                     }
                 }
             }
-        }
+    }
+
+    fun dispose() {
+        handle?.dispose()
+        handle = null
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
index 3134e35..6b53f4e 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
@@ -84,8 +84,8 @@
 import com.android.systemui.power.shared.model.ScreenPowerState;
 import com.android.systemui.settings.DisplayTracker;
 import com.android.wm.shell.shared.CounterRotator;
+import com.android.wm.shell.shared.ShellTransitions;
 import com.android.wm.shell.shared.TransitionUtil;
-import com.android.wm.shell.transition.ShellTransitions;
 import com.android.wm.shell.transition.Transitions;
 
 import java.util.ArrayList;
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
index 53c81e5..cf83582 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
@@ -20,7 +20,7 @@
 import android.animation.AnimatorListenerAdapter
 import android.animation.ValueAnimator
 import android.app.WallpaperManager
-import android.content.Context
+import android.content.res.Resources
 import android.graphics.Matrix
 import android.graphics.Rect
 import android.os.DeadObjectException
@@ -32,16 +32,18 @@
 import android.view.SurfaceControl
 import android.view.SyncRtSurfaceTransactionApplier
 import android.view.View
+import android.view.WindowManager
 import androidx.annotation.VisibleForTesting
 import androidx.core.math.MathUtils
 import com.android.app.animation.Interpolators
 import com.android.internal.R
 import com.android.keyguard.KeyguardClockSwitchController
 import com.android.keyguard.KeyguardViewController
+import com.android.systemui.Flags.fastUnlockTransition
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.flags.FeatureFlags
 import com.android.systemui.flags.Flags
-import com.android.systemui.Flags.fastUnlockTransition
 import com.android.systemui.plugins.BcSmartspaceDataPlugin
 import com.android.systemui.shared.recents.utilities.Utilities
 import com.android.systemui.shared.system.ActivityManagerWrapper
@@ -145,17 +147,18 @@
  */
 @SysUISingleton
 class KeyguardUnlockAnimationController @Inject constructor(
-    private val context: Context,
-    private val keyguardStateController: KeyguardStateController,
-    private val
+        private val windowManager: WindowManager,
+        @Main private val resources: Resources,
+        private val keyguardStateController: KeyguardStateController,
+        private val
     keyguardViewMediator: Lazy<KeyguardViewMediator>,
-    private val keyguardViewController: KeyguardViewController,
-    private val featureFlags: FeatureFlags,
-    private val biometricUnlockControllerLazy: Lazy<BiometricUnlockController>,
-    private val statusBarStateController: SysuiStatusBarStateController,
-    private val notificationShadeWindowController: NotificationShadeWindowController,
-    private val powerManager: PowerManager,
-    private val wallpaperManager: WallpaperManager
+        private val keyguardViewController: KeyguardViewController,
+        private val featureFlags: FeatureFlags,
+        private val biometricUnlockControllerLazy: Lazy<BiometricUnlockController>,
+        private val statusBarStateController: SysuiStatusBarStateController,
+        private val notificationShadeWindowController: NotificationShadeWindowController,
+        private val powerManager: PowerManager,
+        private val wallpaperManager: WallpaperManager
 ) : KeyguardStateController.Callback, ISysuiUnlockAnimationController.Stub() {
 
     interface KeyguardUnlockAnimationListener {
@@ -399,7 +402,7 @@
         keyguardStateController.addCallback(this)
 
         roundedCornerRadius =
-            context.resources.getDimensionPixelSize(R.dimen.rounded_corner_radius).toFloat()
+            resources.getDimensionPixelSize(R.dimen.rounded_corner_radius).toFloat()
     }
 
     /**
@@ -438,7 +441,7 @@
         Log.wtf(TAG, "  !notificationShadeWindowController.isLaunchingActivity: " +
                 "${!notificationShadeWindowController.isLaunchingActivity}")
         Log.wtf(TAG, "  launcherUnlockController != null: ${launcherUnlockController != null}")
-        Log.wtf(TAG, "  !isFoldable(context): ${!isFoldable(context)}")
+        Log.wtf(TAG, "  !isFoldable(context): ${!isFoldable(resources)}")
     }
 
     /**
@@ -1100,7 +1103,7 @@
 
         // We don't do the shared element on large screens because the smartspace has to fly across
         // large distances, which is distracting.
-        if (Utilities.isLargeScreen(context)) {
+        if (Utilities.isLargeScreen(windowManager, resources)) {
             return false
         }
 
@@ -1180,8 +1183,8 @@
 
     companion object {
 
-        fun isFoldable(context: Context): Boolean {
-            return context.resources.getIntArray(R.array.config_foldedDeviceStates).isNotEmpty()
+        fun isFoldable(resources: Resources): Boolean {
+            return resources.getIntArray(R.array.config_foldedDeviceStates).isNotEmpty()
         }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
index d9d7470..e6e6ff6 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
@@ -29,18 +29,21 @@
 import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
 import androidx.constraintlayout.widget.ConstraintSet.START
 import androidx.constraintlayout.widget.ConstraintSet.TOP
+import com.android.compose.animation.scene.SceneKey
+import com.android.compose.animation.scene.SceneTransitionLayout
+import com.android.compose.animation.scene.transitions
 import com.android.internal.jank.InteractionJankMonitor
 import com.android.keyguard.KeyguardStatusView
 import com.android.keyguard.KeyguardStatusViewController
+import com.android.keyguard.LegacyLockIconViewController
 import com.android.keyguard.LockIconView
-import com.android.keyguard.LockIconViewController
 import com.android.keyguard.dagger.KeyguardStatusViewComponent
 import com.android.systemui.CoreStartable
 import com.android.systemui.common.ui.ConfigurationState
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryHapticsInteractor
 import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
-import com.android.systemui.flags.FeatureFlagsClassic
 import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
 import com.android.systemui.keyguard.shared.ComposeLockscreen
 import com.android.systemui.keyguard.shared.model.LockscreenSceneBlueprint
@@ -52,7 +55,6 @@
 import com.android.systemui.keyguard.ui.view.KeyguardIndicationArea
 import com.android.systemui.keyguard.ui.view.KeyguardRootView
 import com.android.systemui.keyguard.ui.view.layout.KeyguardBlueprintCommandListener
-import com.android.systemui.keyguard.ui.viewmodel.AodAlphaViewModel
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardBlueprintViewModel
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardIndicationAreaViewModel
@@ -71,6 +73,7 @@
 import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator
 import dagger.Lazy
 import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.DisposableHandle
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 
@@ -84,7 +87,6 @@
     private val keyguardRootViewModel: KeyguardRootViewModel,
     private val keyguardIndicationAreaViewModel: KeyguardIndicationAreaViewModel,
     private val notificationShadeWindowView: NotificationShadeWindowView,
-    private val featureFlags: FeatureFlagsClassic,
     private val indicationController: KeyguardIndicationController,
     private val screenOffAnimationController: ScreenOffAnimationController,
     private val occludingAppDeviceEntryMessageViewModel: OccludingAppDeviceEntryMessageViewModel,
@@ -95,23 +97,25 @@
     private val configuration: ConfigurationState,
     private val context: Context,
     private val keyguardIndicationController: KeyguardIndicationController,
-    private val lockIconViewController: Lazy<LockIconViewController>,
+    private val lockIconViewController: Lazy<LegacyLockIconViewController>,
     private val shadeInteractor: ShadeInteractor,
     private val interactionJankMonitor: InteractionJankMonitor,
     private val deviceEntryHapticsInteractor: DeviceEntryHapticsInteractor,
     private val vibratorHelper: VibratorHelper,
     private val falsingManager: FalsingManager,
-    private val aodAlphaViewModel: AodAlphaViewModel,
     private val keyguardClockViewModel: KeyguardClockViewModel,
     private val smartspaceViewModel: KeyguardSmartspaceViewModel,
     private val lockscreenContentViewModel: LockscreenContentViewModel,
     private val lockscreenSceneBlueprintsLazy: Lazy<Set<LockscreenSceneBlueprint>>,
     private val keyguardBlueprintViewBinder: KeyguardBlueprintViewBinder,
     private val clockInteractor: KeyguardClockInteractor,
+    private val keyguardViewMediator: KeyguardViewMediator,
+    @Main private val mainImmediateDispatcher: CoroutineDispatcher,
 ) : CoreStartable {
 
     private var rootViewHandle: DisposableHandle? = null
     private var indicationAreaHandle: DisposableHandle? = null
+    private val sceneKey = SceneKey("root-view-scene-key")
 
     var keyguardStatusViewController: KeyguardStatusViewController? = null
         get() {
@@ -204,11 +208,13 @@
                 chipbarCoordinator,
                 screenOffAnimationController,
                 shadeInteractor,
-                { keyguardStatusViewController!!.getClockController() },
+                clockInteractor,
                 interactionJankMonitor,
                 deviceEntryHapticsInteractor,
                 vibratorHelper,
                 falsingManager,
+                keyguardViewMediator,
+                mainImmediateDispatcher,
             )
     }
 
@@ -221,12 +227,25 @@
             blueprints.mapNotNull { it as? ComposableLockscreenSceneBlueprint }.toSet()
         return ComposeView(context).apply {
             setContent {
-                LockscreenContent(
-                        viewModel = viewModel,
-                        blueprints = sceneBlueprints,
-                        clockInteractor = clockInteractor
-                    )
-                    .Content(modifier = Modifier.fillMaxSize())
+                // STL is used solely to provide a SceneScope to enable us to invoke SceneScope
+                // composables.
+                SceneTransitionLayout(
+                    currentScene = sceneKey,
+                    onChangeScene = {},
+                    transitions = transitions {},
+                ) {
+                    scene(sceneKey) {
+                        with(
+                            LockscreenContent(
+                                viewModel = viewModel,
+                                blueprints = sceneBlueprints,
+                                clockInteractor = clockInteractor
+                            )
+                        ) {
+                            Content(modifier = Modifier.fillMaxSize())
+                        }
+                    }
+                }
             }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index a293afc..654610e 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -139,6 +139,7 @@
 import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dagger.qualifiers.UiBackground;
+import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor;
 import com.android.systemui.dreams.DreamOverlayStateController;
 import com.android.systemui.dreams.ui.viewmodel.DreamViewModel;
 import com.android.systemui.dump.DumpManager;
@@ -177,8 +178,6 @@
 import com.android.systemui.wallpapers.data.repository.WallpaperRepository;
 import com.android.wm.shell.keyguard.KeyguardTransitions;
 
-import dagger.Lazy;
-
 import java.io.PrintWriter;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -188,6 +187,7 @@
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
 
+import dagger.Lazy;
 import kotlinx.coroutines.CoroutineDispatcher;
 
 /**
@@ -963,6 +963,13 @@
     @VisibleForTesting
     final ActivityTransitionAnimator.Controller mOccludeAnimationController =
             new ActivityTransitionAnimator.Controller() {
+                private boolean mIsLaunching = true;
+
+                @Override
+                public boolean isLaunching() {
+                    return mIsLaunching;
+                }
+
                 @Override
                 public void onTransitionAnimationStart(boolean isExpandingFullyAbove) {
                     mOccludeAnimationPlaying = true;
@@ -2146,13 +2153,6 @@
         mInteractionJankMonitor.cancel(CUJ_LOCKSCREEN_TRANSITION_FROM_AOD);
 
         synchronized (KeyguardViewMediator.this) {
-            if (mHiding && isOccluded) {
-                // We're in the process of going away but WindowManager wants to show a
-                // SHOW_WHEN_LOCKED activity instead.
-                // TODO(bc-unlock): Migrate to remote animation.
-                startKeyguardExitAnimation(0, 0);
-            }
-
             mPowerGestureIntercepted =
                     isOccluded && mUpdateMonitor.isSecureCameraLaunchedOverKeyguard();
 
@@ -2519,18 +2519,8 @@
             String message = "";
             switch (msg.what) {
                 case SHOW:
-                    // There is a potential race condition when SysUI starts up. CentralSurfaces
-                    // must invoke #registerCentralSurfaces on this class before any messages can be
-                    // processed. If this happens, repost the message with a small delay and try
-                    // again.
-                    if (mCentralSurfaces == null) {
-                        message = "DELAYING SHOW";
-                        Message newMsg = mHandler.obtainMessage(SHOW, (Bundle) msg.obj);
-                        mHandler.sendMessageDelayed(newMsg, 100);
-                    } else {
-                        message = "SHOW";
-                        handleShow((Bundle) msg.obj);
-                    }
+                    message = "SHOW";
+                    handleShow((Bundle) msg.obj);
                     break;
                 case HIDE:
                     message = "HIDE";
@@ -2617,18 +2607,8 @@
                     Trace.endSection();
                     break;
                 case SYSTEM_READY:
-                    // There is a potential race condition when SysUI starts up. CentralSurfaces
-                    // must invoke #registerCentralSurfaces on this class before any messages can be
-                    // processed. If this happens, repost the message with a small delay and try
-                    // again.
-                    if (mCentralSurfaces == null) {
-                        message = "DELAYING SYSTEM_READY";
-                        Message newMsg = mHandler.obtainMessage(SYSTEM_READY);
-                        mHandler.sendMessageDelayed(newMsg, 100);
-                    } else {
-                        message = "SYSTEM_READY";
-                        handleSystemReady();
-                    }
+                    message = "SYSTEM_READY";
+                    handleSystemReady();
                     break;
             }
             Log.d(TAG, "KeyguardViewMediator queue processing message: " + message);
@@ -3404,7 +3384,8 @@
 
         // Ensure that keyguard becomes visible if the going away animation is canceled
         if (showKeyguard && !KeyguardWmStateRefactor.isEnabled()
-                && MigrateClocksToBlueprint.isEnabled()) {
+                && (MigrateClocksToBlueprint.isEnabled()
+                    || DeviceEntryUdfpsRefactor.isEnabled())) {
             mKeyguardInteractor.showKeyguard();
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerOcclusionManager.kt b/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerOcclusionManager.kt
index aab90c3..585bd6a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerOcclusionManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/WindowManagerOcclusionManager.kt
@@ -263,6 +263,7 @@
     @VisibleForTesting
     val occludeAnimationController: ActivityTransitionAnimator.Controller =
         object : ActivityTransitionAnimator.Controller {
+            override val isLaunching: Boolean = true
 
             override var transitionContainer: ViewGroup
                 get() = keyguardViewController.get().getViewRootImpl().view as ViewGroup
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt
index 88eadd7..b3d9a76 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt
@@ -92,7 +92,8 @@
                 walletController.setupWalletChangeObservers(
                     callback,
                     QuickAccessWalletController.WalletChangeEvent.WALLET_PREFERENCE_CHANGE,
-                    QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE
+                    QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE,
+                    QuickAccessWalletController.WalletChangeEvent.DEFAULT_WALLET_APP_CHANGE
                 )
 
                 withContext(backgroundDispatcher) {
@@ -104,7 +105,8 @@
                 awaitClose {
                     walletController.unregisterWalletChangeObservers(
                         QuickAccessWalletController.WalletChangeEvent.WALLET_PREFERENCE_CHANGE,
-                        QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE
+                        QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE,
+                        QuickAccessWalletController.WalletChangeEvent.DEFAULT_WALLET_APP_CHANGE
                     )
                 }
             }
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 a36bf8b..4c54bfd 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
@@ -22,7 +22,9 @@
 import android.annotation.FloatRange
 import android.os.Trace
 import android.util.Log
+import com.android.app.tracing.coroutines.withContext
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.TransitionInfo
 import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
@@ -30,10 +32,14 @@
 import com.android.systemui.keyguard.shared.model.TransitionStep
 import java.util.UUID
 import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.channels.BufferOverflow
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asSharedFlow
+import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.filter
 
@@ -65,6 +71,9 @@
      */
     val transitions: Flow<TransitionStep>
 
+    /** The [TransitionInfo] of the most recent call to [startTransition]. */
+    val currentTransitionInfoInternal: StateFlow<TransitionInfo>
+
     /**
      * Interactors that require information about changes between [KeyguardState]s will call this to
      * register themselves for flowable [TransitionStep]s when that transition occurs.
@@ -77,7 +86,7 @@
      * Begin a transition from one state to another. Transitions are interruptible, and will issue a
      * [TransitionStep] with state = [TransitionState.CANCELED] before beginning the next one.
      */
-    fun startTransition(info: TransitionInfo): UUID?
+    suspend fun startTransition(info: TransitionInfo): UUID?
 
     /**
      * Allows manual control of a transition. When calling [startTransition], the consumer must pass
@@ -95,7 +104,11 @@
 }
 
 @SysUISingleton
-class KeyguardTransitionRepositoryImpl @Inject constructor() : KeyguardTransitionRepository {
+class KeyguardTransitionRepositoryImpl
+@Inject
+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].
@@ -110,6 +123,17 @@
     private var lastStep: TransitionStep = TransitionStep()
     private var lastAnimator: ValueAnimator? = null
 
+    private val _currentTransitionInfo: MutableStateFlow<TransitionInfo> =
+        MutableStateFlow(
+            TransitionInfo(
+                ownerName = "",
+                from = KeyguardState.OFF,
+                to = KeyguardState.LOCKSCREEN,
+                animator = null
+            )
+        )
+    override var currentTransitionInfoInternal = _currentTransitionInfo.asStateFlow()
+
     /*
      * When manual control of the transition is requested, a unique [UUID] is used as the handle
      * to permit calls to [updateTransition]
@@ -122,77 +146,85 @@
         initialTransitionSteps.forEach(::emitTransition)
     }
 
-    override fun startTransition(info: TransitionInfo): UUID? {
-        if (lastStep.from == info.from && lastStep.to == info.to) {
-            Log.i(TAG, "Duplicate call to start the transition, rejecting: $info")
-            return null
-        }
-        val startingValue =
-            if (lastStep.transitionState != TransitionState.FINISHED) {
-                Log.i(TAG, "Transition still active: $lastStep, canceling")
-                when (info.modeOnCanceled) {
-                    TransitionModeOnCanceled.LAST_VALUE -> lastStep.value
-                    TransitionModeOnCanceled.RESET -> 0f
-                    TransitionModeOnCanceled.REVERSE -> 1f - lastStep.value
+    override suspend fun startTransition(info: TransitionInfo): UUID? {
+        _currentTransitionInfo.value = info
+
+        // Animators must be started on the main thread.
+        return withContext("$TAG#startTransition", mainDispatcher) {
+            if (lastStep.from == info.from && lastStep.to == info.to) {
+                Log.i(TAG, "Duplicate call to start the transition, rejecting: $info")
+                return@withContext null
+            }
+            val startingValue =
+                if (lastStep.transitionState != TransitionState.FINISHED) {
+                    Log.i(TAG, "Transition still active: $lastStep, canceling")
+                    when (info.modeOnCanceled) {
+                        TransitionModeOnCanceled.LAST_VALUE -> lastStep.value
+                        TransitionModeOnCanceled.RESET -> 0f
+                        TransitionModeOnCanceled.REVERSE -> 1f - lastStep.value
+                    }
+                } else {
+                    0f
                 }
-            } else {
-                0f
+
+            lastAnimator?.cancel()
+            lastAnimator = info.animator
+
+            // Cancel any existing manual transitions
+            updateTransitionId?.let { uuid ->
+                updateTransition(uuid, lastStep.value, TransitionState.CANCELED)
             }
 
-        lastAnimator?.cancel()
-        lastAnimator = info.animator
-
-        // Cancel any existing manual transitions
-        updateTransitionId?.let { uuid ->
-            updateTransition(uuid, lastStep.value, TransitionState.CANCELED)
-        }
-
-        info.animator?.let { animator ->
-            // An animator was provided, so use it to run the transition
-            animator.setFloatValues(startingValue, 1f)
-            animator.duration = ((1f - startingValue) * animator.duration).toLong()
-            val updateListener = AnimatorUpdateListener { animation ->
-                emitTransition(
-                    TransitionStep(
-                        info,
-                        (animation.animatedValue as Float),
-                        TransitionState.RUNNING
+            info.animator?.let { animator ->
+                // An animator was provided, so use it to run the transition
+                animator.setFloatValues(startingValue, 1f)
+                animator.duration = ((1f - startingValue) * animator.duration).toLong()
+                val updateListener = AnimatorUpdateListener { animation ->
+                    emitTransition(
+                        TransitionStep(
+                            info,
+                            (animation.animatedValue as Float),
+                            TransitionState.RUNNING
+                        )
                     )
-                )
-            }
-            val adapter =
-                object : AnimatorListenerAdapter() {
-                    override fun onAnimationStart(animation: Animator) {
-                        emitTransition(TransitionStep(info, startingValue, TransitionState.STARTED))
-                    }
-
-                    override fun onAnimationCancel(animation: Animator) {
-                        endAnimation(lastStep.value, TransitionState.CANCELED)
-                    }
-
-                    override fun onAnimationEnd(animation: Animator) {
-                        endAnimation(1f, TransitionState.FINISHED)
-                    }
-
-                    private fun endAnimation(value: Float, state: TransitionState) {
-                        emitTransition(TransitionStep(info, value, state))
-                        animator.removeListener(this)
-                        animator.removeUpdateListener(updateListener)
-                        lastAnimator = null
-                    }
                 }
-            animator.addListener(adapter)
-            animator.addUpdateListener(updateListener)
-            animator.start()
-            return@startTransition null
-        }
-            ?: run {
-                emitTransition(TransitionStep(info, startingValue, TransitionState.STARTED))
 
-                // No animator, so it's manual. Provide a mechanism to callback
-                updateTransitionId = UUID.randomUUID()
-                return@startTransition updateTransitionId
+                val adapter =
+                    object : AnimatorListenerAdapter() {
+                        override fun onAnimationStart(animation: Animator) {
+                            emitTransition(
+                                TransitionStep(info, startingValue, TransitionState.STARTED)
+                            )
+                        }
+
+                        override fun onAnimationCancel(animation: Animator) {
+                            endAnimation(lastStep.value, TransitionState.CANCELED)
+                        }
+
+                        override fun onAnimationEnd(animation: Animator) {
+                            endAnimation(1f, TransitionState.FINISHED)
+                        }
+
+                        private fun endAnimation(value: Float, state: TransitionState) {
+                            emitTransition(TransitionStep(info, value, state))
+                            animator.removeListener(this)
+                            animator.removeUpdateListener(updateListener)
+                            lastAnimator = null
+                        }
+                    }
+                animator.addListener(adapter)
+                animator.addUpdateListener(updateListener)
+                animator.start()
+                return@withContext null
             }
+                ?: run {
+                    emitTransition(TransitionStep(info, startingValue, TransitionState.STARTED))
+
+                    // No animator, so it's manual. Provide a mechanism to callback
+                    updateTransitionId = UUID.randomUUID()
+                    return@withContext updateTransitionId
+                }
+        }
     }
 
     override fun updateTransition(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/backup/KeyguardQuickAffordanceBackupHelper.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/backup/KeyguardQuickAffordanceBackupHelper.kt
index fa6efa5..f763e62 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/backup/KeyguardQuickAffordanceBackupHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/backup/KeyguardQuickAffordanceBackupHelper.kt
@@ -17,14 +17,17 @@
 
 package com.android.systemui.keyguard.domain.backup
 
+import android.app.backup.BackupDataInputStream
 import android.app.backup.SharedPreferencesBackupHelper
 import android.content.Context
+import android.util.Log
+import com.android.app.tracing.traceSection
 import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceSelectionManager
 import com.android.systemui.settings.UserFileManagerImpl
 
 /** Handles backup & restore for keyguard quick affordances. */
 class KeyguardQuickAffordanceBackupHelper(
-    context: Context,
+    private val context: Context,
     userId: Int,
 ) :
     SharedPreferencesBackupHelper(
@@ -34,4 +37,17 @@
                 fileName = KeyguardQuickAffordanceSelectionManager.FILE_NAME,
             )
             .getPath()
-    )
+    ) {
+
+    override fun restoreEntity(data: BackupDataInputStream?) {
+        Log.d(TAG, "Starting restore for ${data?.key} for user ${context.userId}")
+        traceSection("$TAG File restore: ${data?.key}") {
+            super.restoreEntity(data)
+        }
+        Log.d(TAG, "Finished restore for ${data?.key} for user ${context.userId}")
+    }
+
+    companion object {
+        private const val TAG = "KeyguardQuickAffordanceBackupHelper"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractor.kt
index e017129..bf1f074 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractor.kt
@@ -26,6 +26,9 @@
 import com.android.systemui.keyguard.data.repository.BiometricType
 import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository
 import com.android.systemui.res.R
+import com.android.systemui.scene.domain.interactor.SceneInteractor
+import com.android.systemui.scene.shared.flag.SceneContainerFlags
+import com.android.systemui.scene.shared.model.Scenes
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
@@ -33,6 +36,7 @@
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.merge
 import kotlinx.coroutines.launch
@@ -48,6 +52,8 @@
     @Application private val applicationScope: CoroutineScope,
     @Application private val context: Context,
     deviceEntryFingerprintAuthRepository: DeviceEntryFingerprintAuthRepository,
+    private val sceneContainerFlags: SceneContainerFlags,
+    private val sceneInteractor: SceneInteractor,
     private val primaryBouncerInteractor: PrimaryBouncerInteractor,
     alternateBouncerInteractor: AlternateBouncerInteractor,
     private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
@@ -65,16 +71,35 @@
         }
     }
 
+    private val isSideFpsIndicatorOnPrimaryBouncerEnabled: Boolean
+        get() = context.resources.getBoolean(R.bool.config_show_sidefps_hint_on_bouncer)
+
+    private val isBouncerSceneActive: Flow<Boolean> =
+        if (sceneContainerFlags.isEnabled()) {
+            sceneInteractor.currentScene.map { it == Scenes.Bouncer }.distinctUntilChanged()
+        } else {
+            flowOf(false)
+        }
+
     private val showIndicatorForPrimaryBouncer: Flow<Boolean> =
         merge(
+                // Legacy bouncer visibility changes.
                 primaryBouncerInteractor.isShowing,
                 primaryBouncerInteractor.startingToHide,
                 primaryBouncerInteractor.startingDisappearAnimation.filterNotNull(),
+                // Bouncer scene visibility changes.
+                isBouncerSceneActive,
                 deviceEntryFingerprintAuthRepository.shouldUpdateIndicatorVisibility.filter { it }
             )
-            .map { shouldShowIndicatorForPrimaryBouncer() }
+            .map {
+                isBouncerActive() &&
+                    isSideFpsIndicatorOnPrimaryBouncerEnabled &&
+                    keyguardUpdateMonitor.isFingerprintDetectionRunning &&
+                    keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed
+            }
 
     private val showIndicatorForAlternateBouncer: Flow<Boolean> =
+        // Note: this interactor internally verifies that SideFPS is enabled and running.
         alternateBouncerInteractor.isVisible
 
     /**
@@ -89,16 +114,11 @@
             }
             .distinctUntilChanged()
 
-    private fun shouldShowIndicatorForPrimaryBouncer(): Boolean {
-        val sfpsEnabled: Boolean =
-            context.resources.getBoolean(R.bool.config_show_sidefps_hint_on_bouncer)
-        val sfpsDetectionRunning = keyguardUpdateMonitor.isFingerprintDetectionRunning
-        val isUnlockingWithFpAllowed = keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed
-
+    private fun isBouncerActive(): Boolean {
+        if (sceneContainerFlags.isEnabled()) {
+            return sceneInteractor.currentScene.value == Scenes.Bouncer
+        }
         return primaryBouncerInteractor.isBouncerShowing() &&
-            sfpsEnabled &&
-            sfpsDetectionRunning &&
-            isUnlockingWithFpAllowed &&
             !primaryBouncerInteractor.isAnimatingAway()
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt
index 47f8046a..dfe56c8 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt
@@ -100,40 +100,30 @@
                 .onEach { delay(150L) }
                 .sampleCombine(
                     keyguardInteractor.primaryBouncerShowing,
-                    startedKeyguardTransitionStep,
                     powerInteractor.isAwake,
                     keyguardInteractor.isAodAvailable,
                     communalInteractor.isIdleOnCommunal
                 )
-                .collect {
-                    (
-                        isAlternateBouncerShowing,
-                        isPrimaryBouncerShowing,
-                        lastStartedTransitionStep,
-                        isAwake,
-                        isAodAvailable,
-                        isIdleOnCommunal) ->
-                    if (
-                        !isAlternateBouncerShowing &&
-                            !isPrimaryBouncerShowing &&
-                            lastStartedTransitionStep.to == KeyguardState.ALTERNATE_BOUNCER
-                    ) {
-                        val to =
-                            if (!isAwake) {
-                                if (isAodAvailable) {
-                                    KeyguardState.AOD
-                                } else {
-                                    KeyguardState.DOZING
-                                }
+                .filterRelevantKeyguardStateAnd {
+                    (isAlternateBouncerShowing, isPrimaryBouncerShowing, _, _, _) ->
+                    !isAlternateBouncerShowing && !isPrimaryBouncerShowing
+                }
+                .collect { (_, _, isAwake, isAodAvailable, isIdleOnCommunal) ->
+                    val to =
+                        if (!isAwake) {
+                            if (isAodAvailable) {
+                                KeyguardState.AOD
                             } else {
-                                if (isIdleOnCommunal) {
-                                    KeyguardState.GLANCEABLE_HUB
-                                } else {
-                                    KeyguardState.LOCKSCREEN
-                                }
+                                KeyguardState.DOZING
                             }
-                        startTransitionTo(to)
-                    }
+                        } else {
+                            if (isIdleOnCommunal) {
+                                KeyguardState.GLANCEABLE_HUB
+                            } else {
+                                KeyguardState.LOCKSCREEN
+                            }
+                        }
+                    startTransitionTo(to)
                 }
         }
     }
@@ -158,15 +148,10 @@
     private fun listenForAlternateBouncerToPrimaryBouncer() {
         scope.launch {
             keyguardInteractor.primaryBouncerShowing
-                .sampleUtil(startedKeyguardTransitionStep, ::Pair)
-                .collect { (isPrimaryBouncerShowing, startedKeyguardState) ->
-                    if (
-                        isPrimaryBouncerShowing &&
-                            startedKeyguardState.to == KeyguardState.ALTERNATE_BOUNCER
-                    ) {
-                        startTransitionTo(KeyguardState.PRIMARY_BOUNCER)
-                    }
+                .filterRelevantKeyguardStateAnd { isPrimaryBouncerShowing ->
+                    isPrimaryBouncerShowing
                 }
+                .collect { startTransitionTo(KeyguardState.PRIMARY_BOUNCER) }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt
index d09ee54..f359525 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt
@@ -18,27 +18,22 @@
 
 import android.animation.ValueAnimator
 import com.android.app.animation.Interpolators
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.keyguard.KeyguardWmStateRefactor
 import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
 import com.android.systemui.keyguard.shared.model.BiometricUnlockModel.Companion.isWakeAndUnlock
-import com.android.systemui.keyguard.shared.model.DozeStateModel
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
-import com.android.systemui.keyguard.shared.model.TransitionStep
 import com.android.systemui.power.domain.interactor.PowerInteractor
 import com.android.systemui.util.kotlin.Utils.Companion.sample
-import com.android.systemui.util.kotlin.sample
-import java.util.UUID
 import javax.inject.Inject
 import kotlin.time.Duration.Companion.milliseconds
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.debounce
-import kotlinx.coroutines.flow.filter
-import kotlinx.coroutines.launch
 
 @SysUISingleton
 class FromAodTransitionInteractor
@@ -74,80 +69,73 @@
      * Listen for the signal that we're waking up and figure what state we need to transition to.
      */
     private fun listenForAodToAwake() {
-        val transitionToLockscreen: suspend (TransitionStep) -> UUID? =
-            { startedStep: TransitionStep ->
-                val modeOnCanceled =
-                    if (startedStep.from == KeyguardState.LOCKSCREEN) {
-                        TransitionModeOnCanceled.REVERSE
-                    } else if (startedStep.from == KeyguardState.GONE) {
-                        TransitionModeOnCanceled.RESET
-                    } else {
-                        TransitionModeOnCanceled.LAST_VALUE
-                    }
-                startTransitionTo(
-                    toState = KeyguardState.LOCKSCREEN,
-                    modeOnCanceled = modeOnCanceled,
+        // Use PowerInteractor's wakefulness, which is the earliest wake signal available. We
+        // have all of the information we need at this time to make a decision about where to
+        // transition.
+        scope.launch("$TAG#listenForAodToAwake") {
+            powerInteractor.detailedWakefulness
+                .filterRelevantKeyguardStateAnd { wakefulness -> wakefulness.isAwake() }
+                .sample(
+                    startedKeyguardTransitionStep,
+                    keyguardInteractor.biometricUnlockState,
+                    keyguardInteractor.primaryBouncerShowing,
+                    keyguardInteractor.isKeyguardShowing,
+                    keyguardInteractor.isKeyguardOccluded,
+                    keyguardInteractor.isKeyguardDismissible,
                 )
-            }
+                .collect {
+                    (
+                        _,
+                        startedStep,
+                        biometricUnlockState,
+                        primaryBouncerShowing,
+                        _,
+                        isKeyguardOccludedLegacy,
+                        _) ->
+                    if (!maybeHandleInsecurePowerGesture()) {
+                        val shouldTransitionToLockscreen =
+                            if (KeyguardWmStateRefactor.isEnabled) {
+                                // Check with the superclass to see if an occlusion transition is
+                                // needed. Also, don't react to wake and unlock events, as we'll be
+                                // receiving a call to #dismissAod() shortly when the authentication
+                                // completes.
+                                !maybeStartTransitionToOccludedOrInsecureCamera() &&
+                                    !isWakeAndUnlock(biometricUnlockState) &&
+                                    !primaryBouncerShowing
+                            } else {
+                                !isKeyguardOccludedLegacy &&
+                                    !isWakeAndUnlock(biometricUnlockState) &&
+                                    !primaryBouncerShowing
+                            }
 
-        if (KeyguardWmStateRefactor.isEnabled) {
-            // The refactor uses PowerInteractor's wakefulness, which is the earliest wake signal
-            // available. We have all of the information we need at this time to make a decision
-            // about where to transition.
-            scope.launch {
-                powerInteractor.detailedWakefulness
-                    // React only to wake events.
-                    .filter { it.isAwake() }
-                    .sample(
-                        startedKeyguardTransitionStep,
-                        keyguardInteractor.biometricUnlockState,
-                        keyguardInteractor.primaryBouncerShowing,
-                    )
-                    // Make sure we've at least STARTED a transition to AOD.
-                    .filter { (_, startedStep, _, _) -> startedStep.to == KeyguardState.AOD }
-                    .collect { (_, startedStep, biometricUnlockState, primaryBouncerShowing) ->
-                        // Check with the superclass to see if an occlusion transition is needed.
-                        // Also, don't react to wake and unlock events, as we'll be receiving a call
-                        // to #dismissAod() shortly when the authentication completes.
-                        if (
-                            !maybeStartTransitionToOccludedOrInsecureCamera() &&
-                                !isWakeAndUnlock(biometricUnlockState) &&
-                                !primaryBouncerShowing
-                        ) {
-                            transitionToLockscreen(startedStep)
+                        // With the refactor enabled, maybeStartTransitionToOccludedOrInsecureCamera
+                        // handles transitioning to OCCLUDED.
+                        val shouldTransitionToOccluded =
+                            !KeyguardWmStateRefactor.isEnabled && isKeyguardOccludedLegacy
+
+                        if (shouldTransitionToLockscreen) {
+                            val modeOnCanceled =
+                                if (startedStep.from == KeyguardState.LOCKSCREEN) {
+                                    TransitionModeOnCanceled.REVERSE
+                                } else if (startedStep.from == KeyguardState.GONE) {
+                                    TransitionModeOnCanceled.RESET
+                                } else {
+                                    TransitionModeOnCanceled.LAST_VALUE
+                                }
+
+                            startTransitionTo(
+                                toState = KeyguardState.LOCKSCREEN,
+                                modeOnCanceled = modeOnCanceled,
+                                ownerReason = "listen for aod to awake"
+                            )
+                        } else if (shouldTransitionToOccluded) {
+                            startTransitionTo(
+                                toState = KeyguardState.OCCLUDED,
+                                ownerReason = "waking up and isOccluded=true",
+                            )
                         }
                     }
-            }
-        } else {
-            scope.launch {
-                keyguardInteractor
-                    .dozeTransitionTo(DozeStateModel.FINISH)
-                    .sample(
-                        keyguardInteractor.isKeyguardShowing,
-                        startedKeyguardTransitionStep,
-                        keyguardInteractor.isKeyguardOccluded,
-                        keyguardInteractor.biometricUnlockState,
-                        keyguardInteractor.primaryBouncerShowing,
-                    )
-                    .collect {
-                        (
-                            _,
-                            isKeyguardShowing,
-                            lastStartedStep,
-                            occluded,
-                            biometricUnlockState,
-                            primaryBouncerShowing) ->
-                        if (
-                            lastStartedStep.to == KeyguardState.AOD &&
-                                !occluded &&
-                                !isWakeAndUnlock(biometricUnlockState) &&
-                                isKeyguardShowing &&
-                                !primaryBouncerShowing
-                        ) {
-                            transitionToLockscreen(lastStartedStep)
-                        }
-                    }
-            }
+                }
         }
     }
 
@@ -162,16 +150,15 @@
             return
         }
 
-        scope.launch {
+        scope.launch("$TAG#listenForAodToOccluded") {
             keyguardInteractor.isKeyguardOccluded
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { (isOccluded, lastStartedStep) ->
-                    if (isOccluded && lastStartedStep.to == KeyguardState.AOD) {
-                        startTransitionTo(
-                            toState = KeyguardState.OCCLUDED,
-                            modeOnCanceled = TransitionModeOnCanceled.RESET
-                        )
-                    }
+                .filterRelevantKeyguardStateAnd { isOccluded -> isOccluded }
+                .collect {
+                    startTransitionTo(
+                        toState = KeyguardState.OCCLUDED,
+                        modeOnCanceled = TransitionModeOnCanceled.RESET,
+                        ownerReason = "isOccluded = true",
+                    )
                 }
         }
     }
@@ -181,14 +168,10 @@
      * PRIMARY_BOUNCER.
      */
     private fun listenForAodToPrimaryBouncer() {
-        scope.launch {
+        scope.launch("$TAG#listenForAodToPrimaryBouncer") {
             keyguardInteractor.primaryBouncerShowing
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { (isBouncerShowing, lastStartedTransitionStep) ->
-                    if (isBouncerShowing && lastStartedTransitionStep.to == KeyguardState.AOD) {
-                        startTransitionTo(KeyguardState.PRIMARY_BOUNCER)
-                    }
-                }
+                .filterRelevantKeyguardStateAnd { primaryBouncerShowing -> primaryBouncerShowing }
+                .collect { startTransitionTo(KeyguardState.PRIMARY_BOUNCER) }
         }
     }
 
@@ -198,26 +181,20 @@
             return
         }
 
-        scope.launch {
+        scope.launch("$TAG#listenForAodToGone") {
             powerInteractor.isAwake
                 .debounce(50L)
+                .filterRelevantKeyguardState()
                 .sample(
                     keyguardInteractor.biometricUnlockState,
-                    startedKeyguardTransitionStep,
                     keyguardInteractor.isKeyguardShowing,
                     keyguardInteractor.isKeyguardDismissible,
                 )
-                .collect {
-                    (
-                        isAwake,
-                        biometricUnlockState,
-                        lastStartedTransitionStep,
-                        isKeyguardShowing,
-                        isKeyguardDismissible) ->
+                .collect { (isAwake, biometricUnlockState, isKeyguardShowing, isKeyguardDismissible)
+                    ->
                     KeyguardWmStateRefactor.assertInLegacyMode()
                     if (
                         isAwake &&
-                            lastStartedTransitionStep.to == KeyguardState.AOD &&
                             (isWakeAndUnlock(biometricUnlockState) ||
                                 (!isKeyguardShowing && isKeyguardDismissible))
                     ) {
@@ -232,7 +209,7 @@
      * AOD.
      */
     fun dismissAod() {
-        scope.launch { startTransitionTo(KeyguardState.GONE) }
+        scope.launch("$TAG#dismissAod") { startTransitionTo(KeyguardState.GONE) }
     }
 
     override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator {
@@ -247,7 +224,7 @@
     }
 
     companion object {
-        const val TAG = "FromAodTransitionInteractor"
+        private const val TAG = "FromAodTransitionInteractor"
         private val DEFAULT_DURATION = 500.milliseconds
         val TO_LOCKSCREEN_DURATION = 500.milliseconds
         val TO_GONE_DURATION = DEFAULT_DURATION
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt
index 57b2a63..ca7fc66 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt
@@ -35,7 +35,6 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.debounce
-import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.launch
 
 @SysUISingleton
@@ -83,9 +82,9 @@
         scope.launch {
             powerInteractor.isAwake
                 .debounce(50L)
+                .filterRelevantKeyguardStateAnd { isAwake -> isAwake }
                 .sample(
                     keyguardInteractor.biometricUnlockState,
-                    startedKeyguardTransitionStep,
                     keyguardInteractor.isKeyguardOccluded,
                     communalInteractor.isIdleOnCommunal,
                     canDismissLockScreen,
@@ -93,16 +92,12 @@
                 )
                 .collect {
                     (
-                        isAwake,
+                        _,
                         biometricUnlockState,
-                        lastStartedTransition,
                         occluded,
                         isIdleOnCommunal,
                         canDismissLockScreen,
                         primaryBouncerShowing) ->
-                    if (!(isAwake && lastStartedTransition.to == KeyguardState.DOZING)) {
-                        return@collect
-                    }
                     startTransitionTo(
                         if (isWakeAndUnlock(biometricUnlockState)) {
                             KeyguardState.GONE
@@ -130,20 +125,16 @@
 
         scope.launch {
             powerInteractor.detailedWakefulness
-                .filter { it.isAwake() }
+                .filterRelevantKeyguardStateAnd { it.isAwake() }
                 .sample(
-                    startedKeyguardTransitionStep,
                     communalInteractor.isIdleOnCommunal,
                     keyguardInteractor.biometricUnlockState,
                     canDismissLockScreen,
                     keyguardInteractor.primaryBouncerShowing,
                 )
-                // If we haven't at least STARTED a transition to DOZING, ignore.
-                .filter { (_, startedStep, _, _) -> startedStep.to == KeyguardState.DOZING }
                 .collect {
                     (
                         _,
-                        _,
                         isIdleOnCommunal,
                         biometricUnlockState,
                         canDismissLockscreen,
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt
index 6433d0e..10d1e15 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt
@@ -26,14 +26,12 @@
 import com.android.systemui.keyguard.shared.model.DozeStateModel
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.power.domain.interactor.PowerInteractor
-import com.android.systemui.util.kotlin.Utils.Companion.toTriple
 import com.android.systemui.util.kotlin.sample
 import javax.inject.Inject
 import kotlin.time.Duration.Companion.milliseconds
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.launch
 
@@ -73,91 +71,50 @@
                 // Add a slight delay to prevent transitioning to lockscreen from happening too soon
                 // as dozing can arrive in a slight gap after the lockscreen hosted dream stops.
                 .onEach { delay(50) }
-                .sample(
-                    combine(
-                        keyguardInteractor.dozeTransitionModel,
-                        startedKeyguardTransitionStep,
-                        ::Pair
-                    ),
-                    ::toTriple
-                )
-                .collect {
-                    (isActiveDreamLockscreenHosted, dozeTransitionModel, lastStartedTransition) ->
-                    if (
-                        !isActiveDreamLockscreenHosted &&
-                            DozeStateModel.isDozeOff(dozeTransitionModel.to) &&
-                            lastStartedTransition.to == KeyguardState.DREAMING_LOCKSCREEN_HOSTED
-                    ) {
-                        startTransitionTo(KeyguardState.LOCKSCREEN)
-                    }
+                .sample(keyguardInteractor.dozeTransitionModel, ::Pair)
+                .filterRelevantKeyguardStateAnd {
+                    (isActiveDreamLockscreenHosted, dozeTransitionModel) ->
+                    !isActiveDreamLockscreenHosted &&
+                        DozeStateModel.isDozeOff(dozeTransitionModel.to)
                 }
+                .collect { startTransitionTo(KeyguardState.LOCKSCREEN) }
         }
     }
 
     private fun listenForDreamingLockscreenHostedToOccluded() {
         scope.launch {
             keyguardInteractor.isActiveDreamLockscreenHosted
-                .sample(
-                    combine(
-                        keyguardInteractor.isKeyguardOccluded,
-                        startedKeyguardTransitionStep,
-                        ::Pair,
-                    ),
-                    ::toTriple
-                )
-                .collect { (isActiveDreamLockscreenHosted, isOccluded, lastStartedTransition) ->
-                    if (
-                        isOccluded &&
-                            !isActiveDreamLockscreenHosted &&
-                            lastStartedTransition.to == KeyguardState.DREAMING_LOCKSCREEN_HOSTED
-                    ) {
-                        startTransitionTo(KeyguardState.OCCLUDED)
-                    }
+                .sample(keyguardInteractor.isKeyguardOccluded, ::Pair)
+                .filterRelevantKeyguardStateAnd { (isActiveDreamLockscreenHosted, isOccluded) ->
+                    isOccluded && !isActiveDreamLockscreenHosted
                 }
+                .collect { startTransitionTo(KeyguardState.OCCLUDED) }
         }
     }
 
     private fun listenForDreamingLockscreenHostedToPrimaryBouncer() {
         scope.launch {
             keyguardInteractor.primaryBouncerShowing
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { (isBouncerShowing, lastStartedTransitionStep) ->
-                    if (
-                        isBouncerShowing &&
-                            lastStartedTransitionStep.to == KeyguardState.DREAMING_LOCKSCREEN_HOSTED
-                    ) {
-                        startTransitionTo(KeyguardState.PRIMARY_BOUNCER)
-                    }
-                }
+                .filterRelevantKeyguardStateAnd { isBouncerShowing -> isBouncerShowing }
+                .collect { startTransitionTo(KeyguardState.PRIMARY_BOUNCER) }
         }
     }
 
     private fun listenForDreamingLockscreenHostedToGone() {
         scope.launch {
             keyguardInteractor.biometricUnlockState
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { (biometricUnlockState, lastStartedTransitionStep) ->
-                    if (
-                        lastStartedTransitionStep.to == KeyguardState.DREAMING_LOCKSCREEN_HOSTED &&
-                            biometricUnlockState == BiometricUnlockModel.WAKE_AND_UNLOCK_FROM_DREAM
-                    ) {
-                        startTransitionTo(KeyguardState.GONE)
-                    }
+                .filterRelevantKeyguardStateAnd { biometricUnlockState ->
+                    biometricUnlockState == BiometricUnlockModel.WAKE_AND_UNLOCK_FROM_DREAM
                 }
+                .collect { startTransitionTo(KeyguardState.GONE) }
         }
     }
 
     private fun listenForDreamingLockscreenHostedToDozing() {
         scope.launch {
-            combine(keyguardInteractor.dozeTransitionModel, startedKeyguardTransitionStep, ::Pair)
-                .collect { (dozeTransitionModel, lastStartedTransitionStep) ->
-                    if (
-                        dozeTransitionModel.to == DozeStateModel.DOZE &&
-                            lastStartedTransitionStep.to == KeyguardState.DREAMING_LOCKSCREEN_HOSTED
-                    ) {
-                        startTransitionTo(KeyguardState.DOZING)
-                    }
-                }
+            keyguardInteractor.dozeTransitionModel
+                .filterRelevantKeyguardStateAnd { it.to == DozeStateModel.DOZE }
+                .collect { startTransitionTo(KeyguardState.DOZING) }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
index 1f24fc2..bef5ee5 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
@@ -29,17 +29,15 @@
 import com.android.systemui.keyguard.shared.model.DozeStateModel
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.power.domain.interactor.PowerInteractor
-import com.android.systemui.util.kotlin.Utils
 import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine
-import com.android.systemui.util.kotlin.Utils.Companion.toTriple
-import com.android.systemui.util.kotlin.sample
 import javax.inject.Inject
 import kotlin.time.Duration.Companion.milliseconds
 import kotlin.time.Duration.Companion.seconds
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.FlowPreview
 import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.flow.debounce
 import kotlinx.coroutines.launch
 
 @SysUISingleton
@@ -110,6 +108,7 @@
         }
     }
 
+    @OptIn(FlowPreview::class)
     private fun listenForDreamingToOccluded() {
         if (KeyguardWmStateRefactor.isEnabled) {
             scope.launch {
@@ -118,28 +117,30 @@
                         keyguardOcclusionInteractor.isShowWhenLockedActivityOnTop,
                         ::Pair
                     )
-                    .sample(startedKeyguardTransitionStep, ::toTriple)
-                    .filter { (isDreaming, _, startedStep) ->
-                        !isDreaming && startedStep.to == KeyguardState.DREAMING
-                    }
+                    .filterRelevantKeyguardStateAnd { (isDreaming, _) -> !isDreaming }
                     .collect { maybeStartTransitionToOccludedOrInsecureCamera() }
             }
         } else {
             scope.launch {
                 combine(
                         keyguardInteractor.isKeyguardOccluded,
-                        keyguardInteractor.isDreaming,
+                        keyguardInteractor.isDreaming
+                            // Debounce the dreaming signal since there is a race condition between
+                            // the occluded and dreaming signals. We therefore add a small delay
+                            // to give enough time for occluded to flip to false when the dream
+                            // ends, to avoid transitioning to OCCLUDED erroneously when exiting
+                            // the dream.
+                            .debounce(100.milliseconds),
                         ::Pair
                     )
-                    .sample(startedKeyguardTransitionStep, Utils.Companion::toTriple)
-                    .collect { (isOccluded, isDreaming, lastStartedTransition) ->
-                        if (
-                            isOccluded &&
-                                !isDreaming &&
-                                lastStartedTransition.to == KeyguardState.DREAMING
-                        ) {
-                            startTransitionTo(KeyguardState.OCCLUDED)
-                        }
+                    .filterRelevantKeyguardStateAnd { (isOccluded, isDreaming) ->
+                        isOccluded && !isDreaming
+                    }
+                    .collect {
+                        startTransitionTo(
+                            toState = KeyguardState.OCCLUDED,
+                            ownerReason = "Occluded but no longer dreaming",
+                        )
                     }
             }
         }
@@ -152,13 +153,8 @@
 
         scope.launch {
             keyguardOcclusionInteractor.isShowWhenLockedActivityOnTop
-                .filter { onTop -> !onTop }
-                .sample(startedKeyguardState)
-                .collect { startedState ->
-                    if (startedState == KeyguardState.DREAMING) {
-                        startTransitionTo(KeyguardState.LOCKSCREEN)
-                    }
-                }
+                .filterRelevantKeyguardStateAnd { onTop -> !onTop }
+                .collect { startTransitionTo(KeyguardState.LOCKSCREEN) }
         }
     }
 
@@ -168,49 +164,35 @@
                 .sampleCombine(
                     keyguardInteractor.isKeyguardShowing,
                     keyguardInteractor.isKeyguardDismissible,
-                    startedKeyguardTransitionStep,
                 )
-                .collect {
-                    (isDreaming, isKeyguardShowing, isKeyguardDismissible, lastStartedTransition) ->
-                    if (
-                        !isDreaming &&
-                            lastStartedTransition.to == KeyguardState.DREAMING &&
-                            isKeyguardDismissible &&
-                            !isKeyguardShowing
-                    ) {
-                        startTransitionTo(KeyguardState.GONE)
-                    }
+                .filterRelevantKeyguardStateAnd {
+                    (isDreaming, isKeyguardShowing, isKeyguardDismissible) ->
+                    !isDreaming && isKeyguardDismissible && !isKeyguardShowing
                 }
+                .collect { startTransitionTo(KeyguardState.GONE) }
         }
     }
 
     private fun listenForDreamingToGoneFromBiometricUnlock() {
         scope.launch {
             keyguardInteractor.biometricUnlockState
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { (biometricUnlockState, lastStartedTransitionStep) ->
-                    if (
-                        lastStartedTransitionStep.to == KeyguardState.DREAMING &&
-                            biometricUnlockState == BiometricUnlockModel.WAKE_AND_UNLOCK_FROM_DREAM
-                    ) {
-                        startTransitionTo(KeyguardState.GONE)
-                    }
+                .filterRelevantKeyguardStateAnd { biometricUnlockState ->
+                    biometricUnlockState == BiometricUnlockModel.WAKE_AND_UNLOCK_FROM_DREAM
                 }
+                .collect { startTransitionTo(KeyguardState.GONE) }
         }
     }
 
     private fun listenForDreamingToAodOrDozing() {
         scope.launch {
-            combine(keyguardInteractor.dozeTransitionModel, finishedKeyguardState, ::Pair)
-                .collect { (dozeTransitionModel, keyguardState) ->
-                    if (keyguardState == KeyguardState.DREAMING) {
-                        if (dozeTransitionModel.to == DozeStateModel.DOZE) {
-                            startTransitionTo(KeyguardState.DOZING)
-                        } else if (dozeTransitionModel.to == DozeStateModel.DOZE_AOD) {
-                            startTransitionTo(KeyguardState.AOD)
-                        }
-                    }
+            keyguardInteractor.dozeTransitionModel.filterRelevantKeyguardState().collect {
+                dozeTransitionModel ->
+                if (dozeTransitionModel.to == DozeStateModel.DOZE) {
+                    startTransitionTo(KeyguardState.DOZING)
+                } else if (dozeTransitionModel.to == DozeStateModel.DOZE_AOD) {
+                    startTransitionTo(KeyguardState.AOD)
                 }
+            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt
index 51bc3ae..54d9a78 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt
@@ -30,13 +30,11 @@
 import com.android.systemui.power.domain.interactor.PowerInteractor
 import com.android.systemui.util.kotlin.BooleanFlowOperators.and
 import com.android.systemui.util.kotlin.BooleanFlowOperators.not
-import com.android.systemui.util.kotlin.sample
 import javax.inject.Inject
 import kotlin.time.Duration.Companion.seconds
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.collectLatest
-import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 
@@ -113,46 +111,31 @@
     private fun listenForHubToPrimaryBouncer() {
         scope.launch("$TAG#listenForHubToPrimaryBouncer") {
             keyguardInteractor.primaryBouncerShowing
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { pair ->
-                    val (isBouncerShowing, lastStartedTransitionStep) = pair
-                    if (
-                        isBouncerShowing &&
-                            lastStartedTransitionStep.to == KeyguardState.GLANCEABLE_HUB
-                    ) {
-                        startTransitionTo(KeyguardState.PRIMARY_BOUNCER)
-                    }
-                }
+                .filterRelevantKeyguardStateAnd { primaryBouncerShowing -> primaryBouncerShowing }
+                .collect { startTransitionTo(KeyguardState.PRIMARY_BOUNCER) }
         }
     }
 
     private fun listenForHubToAlternateBouncer() {
         scope.launch("$TAG#listenForHubToAlternateBouncer") {
             keyguardInteractor.alternateBouncerShowing
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { pair ->
-                    val (isAlternateBouncerShowing, lastStartedTransitionStep) = pair
-                    if (
-                        isAlternateBouncerShowing &&
-                            lastStartedTransitionStep.to == KeyguardState.GLANCEABLE_HUB
-                    ) {
-                        startTransitionTo(KeyguardState.ALTERNATE_BOUNCER)
-                    }
+                .filterRelevantKeyguardStateAnd { alternateBouncerShowing ->
+                    alternateBouncerShowing
                 }
+                .collect { pair -> startTransitionTo(KeyguardState.ALTERNATE_BOUNCER) }
         }
     }
 
     private fun listenForHubToDozing() {
         scope.launch {
-            powerInteractor.isAsleep.sample(startedKeyguardTransitionStep, ::Pair).collect {
-                (isAsleep, lastStartedStep) ->
-                if (lastStartedStep.to == fromState && isAsleep) {
+            powerInteractor.isAsleep
+                .filterRelevantKeyguardStateAnd { isAsleep -> isAsleep }
+                .collect {
                     startTransitionTo(
                         toState = KeyguardState.DOZING,
                         modeOnCanceled = TransitionModeOnCanceled.LAST_VALUE,
                     )
                 }
-            }
         }
     }
 
@@ -160,22 +143,17 @@
         if (KeyguardWmStateRefactor.isEnabled) {
             scope.launch {
                 keyguardOcclusionInteractor.isShowWhenLockedActivityOnTop
-                    .filter { onTop -> onTop }
-                    .sample(startedKeyguardState)
-                    .collect {
-                        if (it == KeyguardState.GLANCEABLE_HUB) {
-                            maybeStartTransitionToOccludedOrInsecureCamera()
-                        }
-                    }
+                    .filterRelevantKeyguardStateAnd { onTop -> onTop }
+                    .collect { maybeStartTransitionToOccludedOrInsecureCamera() }
             }
         } else {
             scope.launch {
                 and(keyguardInteractor.isKeyguardOccluded, not(keyguardInteractor.isDreaming))
-                    .sample(startedKeyguardState, ::Pair)
-                    .collect { (isOccludedAndNotDreaming, keyguardState) ->
-                        if (isOccludedAndNotDreaming && keyguardState == fromState) {
-                            startTransitionTo(KeyguardState.OCCLUDED)
-                        }
+                    .filterRelevantKeyguardStateAnd { isOccludedAndNotDreaming ->
+                        isOccludedAndNotDreaming
+                    }
+                    .collect { isOccludedAndNotDreaming ->
+                        startTransitionTo(KeyguardState.OCCLUDED)
                     }
             }
         }
@@ -184,12 +162,8 @@
     private fun listenForHubToGone() {
         scope.launch {
             keyguardInteractor.isKeyguardGoingAway
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { (isKeyguardGoingAway, lastStartedStep) ->
-                    if (isKeyguardGoingAway && lastStartedStep.to == fromState) {
-                        startTransitionTo(KeyguardState.GONE)
-                    }
-                }
+                .filterRelevantKeyguardStateAnd { isKeyguardGoingAway -> isKeyguardGoingAway }
+                .collect { startTransitionTo(KeyguardState.GONE) }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt
index 4a3232e..c2c095b 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt
@@ -18,6 +18,7 @@
 
 import android.animation.ValueAnimator
 import com.android.app.animation.Interpolators
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
@@ -28,16 +29,12 @@
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
 import com.android.systemui.power.domain.interactor.PowerInteractor
-import com.android.systemui.util.kotlin.Utils.Companion.sample
-import com.android.systemui.util.kotlin.Utils.Companion.toTriple
 import com.android.systemui.util.kotlin.sample
 import javax.inject.Inject
 import kotlin.time.Duration.Companion.milliseconds
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.launch
 
 @SysUISingleton
@@ -72,93 +69,69 @@
     }
 
     fun showKeyguard() {
-        scope.launch { startTransitionTo(KeyguardState.LOCKSCREEN) }
+        scope.launch("$TAG#showKeyguard") { startTransitionTo(KeyguardState.LOCKSCREEN) }
     }
 
     // Primarily for when the user chooses to lock down the device
     private fun listenForGoneToLockscreenOrHub() {
         if (KeyguardWmStateRefactor.isEnabled) {
-            scope.launch {
+            scope.launch("$TAG#listenForGoneToLockscreenOrHub") {
                 biometricSettingsRepository.isCurrentUserInLockdown
                     .distinctUntilChanged()
-                    .filter { inLockdown -> inLockdown }
-                    .sample(
-                        startedKeyguardState,
-                        communalInteractor.isIdleOnCommunal,
-                    )
-                    .collect { (_, startedState, isIdleOnCommunal) ->
-                        if (startedState == KeyguardState.GONE) {
-                            val to =
-                                if (isIdleOnCommunal) {
-                                    KeyguardState.GLANCEABLE_HUB
-                                } else {
-                                    KeyguardState.LOCKSCREEN
-                                }
-                            startTransitionTo(to, ownerReason = "User initiated lockdown")
-                        }
+                    .filterRelevantKeyguardStateAnd { inLockdown -> inLockdown }
+                    .sample(communalInteractor.isIdleOnCommunal, ::Pair)
+                    .collect { (_, isIdleOnCommunal) ->
+                        val to =
+                            if (isIdleOnCommunal) {
+                                KeyguardState.GLANCEABLE_HUB
+                            } else {
+                                KeyguardState.LOCKSCREEN
+                            }
+                        startTransitionTo(to, ownerReason = "User initiated lockdown")
                     }
             }
         } else {
-            scope.launch {
+            scope.launch("$TAG#listenForGoneToLockscreenOrHub") {
                 keyguardInteractor.isKeyguardShowing
-                    .sample(
-                        startedKeyguardState,
-                        communalInteractor.isIdleOnCommunal,
-                    )
-                    .collect { (isKeyguardShowing, startedState, isIdleOnCommunal) ->
-                        if (isKeyguardShowing && startedState == KeyguardState.GONE) {
-                            val to =
-                                if (isIdleOnCommunal) {
-                                    KeyguardState.GLANCEABLE_HUB
-                                } else {
-                                    KeyguardState.LOCKSCREEN
-                                }
-                            startTransitionTo(to)
-                        }
+                    .filterRelevantKeyguardStateAnd { isKeyguardShowing -> isKeyguardShowing }
+                    .sample(communalInteractor.isIdleOnCommunal, ::Pair)
+                    .collect { (_, isIdleOnCommunal) ->
+                        val to =
+                            if (isIdleOnCommunal) {
+                                KeyguardState.GLANCEABLE_HUB
+                            } else {
+                                KeyguardState.LOCKSCREEN
+                            }
+                        startTransitionTo(to)
                     }
             }
         }
     }
 
     private fun listenForGoneToDreamingLockscreenHosted() {
-        scope.launch {
+        scope.launch("$TAG#listenForGoneToDreamingLockscreenHosted") {
             keyguardInteractor.isActiveDreamLockscreenHosted
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { (isActiveDreamLockscreenHosted, lastStartedStep) ->
-                    if (isActiveDreamLockscreenHosted && lastStartedStep.to == KeyguardState.GONE) {
-                        startTransitionTo(KeyguardState.DREAMING_LOCKSCREEN_HOSTED)
-                    }
+                .filterRelevantKeyguardStateAnd { isActiveDreamLockscreenHosted ->
+                    isActiveDreamLockscreenHosted
                 }
+                .collect { startTransitionTo(KeyguardState.DREAMING_LOCKSCREEN_HOSTED) }
         }
     }
 
     private fun listenForGoneToDreaming() {
-        scope.launch {
+        scope.launch("$TAG#listenForGoneToDreaming") {
             keyguardInteractor.isAbleToDream
-                .sample(
-                    combine(
-                        startedKeyguardTransitionStep,
-                        keyguardInteractor.isActiveDreamLockscreenHosted,
-                        ::Pair
-                    ),
-                    ::toTriple
-                )
-                .collect { (isAbleToDream, lastStartedStep, isActiveDreamLockscreenHosted) ->
-                    if (
-                        isAbleToDream &&
-                            lastStartedStep.to == KeyguardState.GONE &&
-                            !isActiveDreamLockscreenHosted
-                    ) {
-                        startTransitionTo(KeyguardState.DREAMING)
-                    }
+                .sample(keyguardInteractor.isActiveDreamLockscreenHosted, ::Pair)
+                .filterRelevantKeyguardStateAnd { (isAbleToDream, isActiveDreamLockscreenHosted) ->
+                    isAbleToDream && !isActiveDreamLockscreenHosted
                 }
+                .collect { startTransitionTo(KeyguardState.DREAMING) }
         }
     }
 
     private fun listenForGoneToAodOrDozing() {
-        scope.launch {
+        scope.launch("$TAG#listenForGoneToAodOrDozing") {
             listenForSleepTransition(
-                from = KeyguardState.GONE,
                 modeOnCanceledFromStartedStep = { TransitionModeOnCanceled.RESET },
             )
         }
@@ -179,6 +152,7 @@
     }
 
     companion object {
+        private const val TAG = "FromGoneTransitionInteractor"
         private val DEFAULT_DURATION = 500.milliseconds
         val TO_DREAMING_DURATION = 933.milliseconds
         val TO_AOD_DURATION = 1300.milliseconds
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 2649d43..56261e0 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
@@ -19,6 +19,7 @@
 import android.animation.ValueAnimator
 import android.util.MathUtils
 import com.android.app.animation.Interpolators
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.dagger.qualifiers.Main
@@ -32,8 +33,7 @@
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.power.domain.interactor.PowerInteractor
 import com.android.systemui.shade.data.repository.ShadeRepository
-import com.android.systemui.util.kotlin.Utils.Companion.toQuad
-import com.android.systemui.util.kotlin.sample
+import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine
 import java.util.UUID
 import javax.inject.Inject
 import kotlin.time.Duration.Companion.milliseconds
@@ -41,14 +41,11 @@
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onStart
 import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 
 @SysUISingleton
 class FromLockscreenTransitionInteractor
@@ -123,27 +120,24 @@
         }
 
         val invalidFromStates = setOf(KeyguardState.AOD, KeyguardState.DOZING)
-        scope.launch {
+        scope.launch("$TAG#listenForLockscreenToDreaming") {
             keyguardInteractor.isAbleToDream
-                .sample(
-                    combine(
-                        startedKeyguardTransitionStep,
-                        finishedKeyguardState,
-                        keyguardInteractor.isActiveDreamLockscreenHosted,
-                        ::Triple
-                    ),
-                    ::toQuad
+                .filterRelevantKeyguardState()
+                .sampleCombine(
+                    transitionInteractor.currentTransitionInfoInternal,
+                    finishedKeyguardState,
+                    keyguardInteractor.isActiveDreamLockscreenHosted,
                 )
                 .collect {
                     (
                         isAbleToDream,
-                        lastStartedTransition,
+                        transitionInfo,
                         finishedKeyguardState,
                         isActiveDreamLockscreenHosted) ->
                     val isOnLockscreen = finishedKeyguardState == KeyguardState.LOCKSCREEN
                     val isTransitionInterruptible =
-                        lastStartedTransition.to == KeyguardState.LOCKSCREEN &&
-                            !invalidFromStates.contains(lastStartedTransition.from)
+                        transitionInfo.to == KeyguardState.LOCKSCREEN &&
+                            !invalidFromStates.contains(transitionInfo.from)
                     if (isAbleToDream && (isOnLockscreen || isTransitionInterruptible)) {
                         if (isActiveDreamLockscreenHosted) {
                             startTransitionTo(KeyguardState.DREAMING_LOCKSCREEN_HOSTED)
@@ -156,118 +150,108 @@
     }
 
     private fun listenForLockscreenToPrimaryBouncer() {
-        scope.launch {
+        scope.launch("$TAG#listenForLockscreenToPrimaryBouncer") {
             keyguardInteractor.primaryBouncerShowing
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { pair ->
-                    val (isBouncerShowing, lastStartedTransitionStep) = pair
-                    if (
-                        isBouncerShowing && lastStartedTransitionStep.to == KeyguardState.LOCKSCREEN
-                    ) {
-                        startTransitionTo(
-                            KeyguardState.PRIMARY_BOUNCER,
-                            ownerReason = "#listenForLockscreenToPrimaryBouncer"
-                        )
-                    }
+                .filterRelevantKeyguardStateAnd { isBouncerShowing -> isBouncerShowing }
+                .collect {
+                    startTransitionTo(
+                        KeyguardState.PRIMARY_BOUNCER,
+                        ownerReason = "#listenForLockscreenToPrimaryBouncer"
+                    )
                 }
         }
     }
 
     private fun listenForLockscreenToAlternateBouncer() {
-        scope.launch {
+        scope.launch("$TAG#listenForLockscreenToAlternateBouncer") {
             keyguardInteractor.alternateBouncerShowing
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { pair ->
-                    val (isAlternateBouncerShowing, lastStartedTransitionStep) = pair
-                    if (
-                        isAlternateBouncerShowing &&
-                            lastStartedTransitionStep.to == KeyguardState.LOCKSCREEN
-                    ) {
-                        startTransitionTo(KeyguardState.ALTERNATE_BOUNCER)
-                    }
+                .filterRelevantKeyguardStateAnd { isAlternateBouncerShowing ->
+                    isAlternateBouncerShowing
                 }
+                .collect { pair -> startTransitionTo(KeyguardState.ALTERNATE_BOUNCER) }
         }
     }
 
     /* Starts transitions when manually dragging up the bouncer from the lockscreen. */
     private fun listenForLockscreenToPrimaryBouncerDragging() {
         var transitionId: UUID? = null
-        scope.launch {
+        scope.launch("$TAG#listenForLockscreenToPrimaryBouncerDragging") {
             shadeRepository.legacyShadeExpansion
-                .sample(
-                    combine(
-                        startedKeyguardTransitionStep,
-                        keyguardInteractor.statusBarState,
-                        keyguardInteractor.isKeyguardDismissible,
-                        ::Triple
-                    ),
-                    ::toQuad
+                .sampleCombine(
+                    startedKeyguardTransitionStep,
+                    transitionInteractor.currentTransitionInfoInternal,
+                    keyguardInteractor.statusBarState,
+                    keyguardInteractor.isKeyguardDismissible,
                 )
-                .collect { (shadeExpansion, keyguardState, statusBarState, isKeyguardUnlocked) ->
-                    withContext(mainDispatcher) {
-                        val id = transitionId
-                        if (id != null) {
-                            if (keyguardState.to == KeyguardState.PRIMARY_BOUNCER) {
-                                // An existing `id` means a transition is started, and calls to
-                                // `updateTransition` will control it until FINISHED or CANCELED
-                                var nextState =
-                                    if (shadeExpansion == 0f) {
-                                        TransitionState.FINISHED
-                                    } else if (shadeExpansion == 1f) {
-                                        TransitionState.CANCELED
-                                    } 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,
-                                )
-
-                                if (
-                                    nextState == TransitionState.CANCELED ||
-                                        nextState == TransitionState.FINISHED
-                                ) {
-                                    transitionId = null
+                .collect {
+                    (
+                        shadeExpansion,
+                        startedStep,
+                        currentTransitionInfo,
+                        statusBarState,
+                        isKeyguardUnlocked) ->
+                    val id = transitionId
+                    if (id != null) {
+                        if (startedStep.to == KeyguardState.PRIMARY_BOUNCER) {
+                            // An existing `id` means a transition is started, and calls to
+                            // `updateTransition` will control it until FINISHED or CANCELED
+                            var nextState =
+                                if (shadeExpansion == 0f) {
+                                    TransitionState.FINISHED
+                                } else if (shadeExpansion == 1f) {
+                                    TransitionState.CANCELED
+                                } 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,
+                            )
 
-                                // If canceled, just put the state back
-                                // TODO(b/278086361): This logic should happen in
-                                //  FromPrimaryBouncerInteractor.
-                                if (nextState == TransitionState.CANCELED) {
-                                    transitionRepository.startTransition(
-                                        TransitionInfo(
-                                            ownerName = name,
-                                            from = KeyguardState.PRIMARY_BOUNCER,
-                                            to = KeyguardState.LOCKSCREEN,
-                                            animator =
-                                                getDefaultAnimatorForTransitionsToState(
-                                                        KeyguardState.LOCKSCREEN
-                                                    )
-                                                    .apply { duration = 0 }
-                                        )
-                                    )
-                                }
-                            }
-                        } else {
-                            // TODO (b/251849525): Remove statusbarstate check when that state is
-                            // integrated into KeyguardTransitionRepository
                             if (
-                                keyguardState.to == KeyguardState.LOCKSCREEN &&
-                                    shadeRepository.legacyShadeTracking.value &&
-                                    !isKeyguardUnlocked &&
-                                    statusBarState == KEYGUARD
+                                nextState == TransitionState.CANCELED ||
+                                    nextState == TransitionState.FINISHED
                             ) {
-                                transitionId =
-                                    startTransitionTo(
-                                        toState = KeyguardState.PRIMARY_BOUNCER,
-                                        animator = null, // transition will be manually controlled,
-                                        ownerReason = "#listenForLockscreenToPrimaryBouncerDragging"
-                                    )
+                                transitionId = null
                             }
+
+                            // If canceled, just put the state back
+                            // TODO(b/278086361): This logic should happen in
+                            //  FromPrimaryBouncerInteractor.
+                            if (nextState == TransitionState.CANCELED) {
+                                transitionRepository.startTransition(
+                                    TransitionInfo(
+                                        ownerName = name,
+                                        from = KeyguardState.PRIMARY_BOUNCER,
+                                        to = KeyguardState.LOCKSCREEN,
+                                        animator =
+                                            getDefaultAnimatorForTransitionsToState(
+                                                    KeyguardState.LOCKSCREEN
+                                                )
+                                                .apply { duration = 0 }
+                                    )
+                                )
+                            }
+                        }
+                    } else {
+                        // TODO (b/251849525): Remove statusbarstate check when that state is
+                        // integrated into KeyguardTransitionRepository
+                        if (
+                            // Use currentTransitionInfo to decide whether to start the transition.
+                            currentTransitionInfo.to == KeyguardState.LOCKSCREEN &&
+                                shadeRepository.legacyShadeTracking.value &&
+                                !isKeyguardUnlocked &&
+                                statusBarState == KEYGUARD
+                        ) {
+                            transitionId =
+                                startTransitionTo(
+                                    toState = KeyguardState.PRIMARY_BOUNCER,
+                                    animator = null, // transition will be manually controlled,
+                                    ownerReason = "#listenForLockscreenToPrimaryBouncerDragging"
+                                )
                         }
                     }
                 }
@@ -275,7 +259,7 @@
     }
 
     fun dismissKeyguard() {
-        scope.launch { startTransitionTo(KeyguardState.GONE) }
+        scope.launch("$TAG#dismissKeyguard") { startTransitionTo(KeyguardState.GONE) }
     }
 
     private fun listenForLockscreenToGone() {
@@ -283,17 +267,14 @@
             return
         }
 
-        scope.launch {
+        scope.launch("$TAG#listenForLockscreenToGone") {
             keyguardInteractor.isKeyguardGoingAway
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { pair ->
-                    val (isKeyguardGoingAway, lastStartedStep) = pair
-                    if (isKeyguardGoingAway && lastStartedStep.to == KeyguardState.LOCKSCREEN) {
-                        startTransitionTo(
-                            KeyguardState.GONE,
-                            modeOnCanceled = TransitionModeOnCanceled.RESET,
-                        )
-                    }
+                .filterRelevantKeyguardStateAnd { isKeyguardGoingAway -> isKeyguardGoingAway }
+                .collect {
+                    startTransitionTo(
+                        KeyguardState.GONE,
+                        modeOnCanceled = TransitionModeOnCanceled.RESET,
+                    )
                 }
         }
     }
@@ -301,49 +282,42 @@
     private fun listenForLockscreenToGoneDragging() {
         if (KeyguardWmStateRefactor.isEnabled) {
             // When the refactor is enabled, we no longer use isKeyguardGoingAway.
-            scope.launch {
-                swipeToDismissInteractor.dismissFling.filterNotNull().collect { _ ->
-                    startTransitionTo(KeyguardState.GONE)
-                }
+            scope.launch("$TAG#listenForLockscreenToGoneDragging") {
+                swipeToDismissInteractor.dismissFling
+                    .filterNotNull()
+                    .filterRelevantKeyguardState()
+                    .collect { _ -> startTransitionTo(KeyguardState.GONE) }
             }
         }
     }
 
     private fun listenForLockscreenToOccludedOrDreaming() {
         if (KeyguardWmStateRefactor.isEnabled) {
-            scope.launch {
+            scope.launch("$TAG#listenForLockscreenToOccludedOrDreaming") {
                 keyguardOcclusionInteractor.showWhenLockedActivityInfo
-                    .filter { it.isOnTop }
-                    .sample(startedKeyguardState, ::Pair)
-                    .collect { (taskInfo, startedState) ->
-                        if (startedState == KeyguardState.LOCKSCREEN) {
-                            startTransitionTo(
-                                if (taskInfo.isDream()) {
-                                    KeyguardState.DREAMING
-                                } else {
-                                    KeyguardState.OCCLUDED
-                                }
-                            )
-                        }
+                    .filterRelevantKeyguardStateAnd { it.isOnTop }
+                    .collect { taskInfo ->
+                        startTransitionTo(
+                            if (taskInfo.isDream()) {
+                                KeyguardState.DREAMING
+                            } else {
+                                KeyguardState.OCCLUDED
+                            }
+                        )
                     }
             }
         } else {
-            scope.launch {
+            scope.launch("$TAG#listenForLockscreenToOccludedOrDreaming") {
                 keyguardInteractor.isKeyguardOccluded
-                    .sample(startedKeyguardState, ::Pair)
-                    .collect { (isOccluded, keyguardState) ->
-                        if (isOccluded && keyguardState == KeyguardState.LOCKSCREEN) {
-                            startTransitionTo(KeyguardState.OCCLUDED)
-                        }
-                    }
+                    .filterRelevantKeyguardStateAnd { isOccluded -> isOccluded }
+                    .collect { startTransitionTo(KeyguardState.OCCLUDED) }
             }
         }
     }
 
     private fun listenForLockscreenToAodOrDozing() {
-        scope.launch {
+        scope.launch("$TAG#listenForLockscreenToAodOrDozing") {
             listenForSleepTransition(
-                from = KeyguardState.LOCKSCREEN,
                 modeOnCanceledFromStartedStep = { startedStep ->
                     if (
                         transitionInteractor.asleepKeyguardState.value == KeyguardState.AOD &&
@@ -394,7 +368,7 @@
     }
 
     companion object {
-        const val TAG = "FromLockscreenTransitionInteractor"
+        private const val TAG = "FromLockscreenTransitionInteractor"
         private val DEFAULT_DURATION = 400.milliseconds
         val TO_DOZING_DURATION = 500.milliseconds
         val TO_DREAMING_DURATION = 933.milliseconds
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 f10327e..b6289d4 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
@@ -32,7 +32,6 @@
 import kotlin.time.Duration.Companion.milliseconds
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.launch
 
 @SysUISingleton
@@ -70,25 +69,16 @@
     private fun listenForOccludedToPrimaryBouncer() {
         scope.launch {
             keyguardInteractor.primaryBouncerShowing
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { (isBouncerShowing, lastStartedTransitionStep) ->
-                    if (
-                        isBouncerShowing && lastStartedTransitionStep.to == KeyguardState.OCCLUDED
-                    ) {
-                        startTransitionTo(KeyguardState.PRIMARY_BOUNCER)
-                    }
-                }
+                .filterRelevantKeyguardStateAnd { isBouncerShowing -> isBouncerShowing }
+                .collect { startTransitionTo(KeyguardState.PRIMARY_BOUNCER) }
         }
     }
 
     private fun listenForOccludedToDreaming() {
         scope.launch {
-            keyguardInteractor.isAbleToDream.sample(finishedKeyguardState, ::Pair).collect {
-                (isAbleToDream, keyguardState) ->
-                if (isAbleToDream && keyguardState == KeyguardState.OCCLUDED) {
-                    startTransitionTo(KeyguardState.DREAMING)
-                }
-            }
+            keyguardInteractor.isAbleToDream
+                .filterRelevantKeyguardStateAnd { isAbleToDream -> isAbleToDream }
+                .collect { startTransitionTo(KeyguardState.DREAMING) }
         }
     }
 
@@ -96,23 +86,18 @@
         if (KeyguardWmStateRefactor.isEnabled) {
             scope.launch {
                 keyguardOcclusionInteractor.isShowWhenLockedActivityOnTop
-                    .filter { onTop -> !onTop }
-                    .sample(
-                        startedKeyguardState,
-                        communalInteractor.isIdleOnCommunal,
-                    )
-                    .collect { (_, startedState, isIdleOnCommunal) ->
+                    .filterRelevantKeyguardStateAnd { onTop -> !onTop }
+                    .sample(communalInteractor.isIdleOnCommunal, ::Pair)
+                    .collect { (_, isIdleOnCommunal) ->
                         // Occlusion signals come from the framework, and should interrupt any
                         // existing transition
-                        if (startedState == KeyguardState.OCCLUDED) {
-                            val to =
-                                if (isIdleOnCommunal) {
-                                    KeyguardState.GLANCEABLE_HUB
-                                } else {
-                                    KeyguardState.LOCKSCREEN
-                                }
-                            startTransitionTo(to)
-                        }
+                        val to =
+                            if (isIdleOnCommunal) {
+                                KeyguardState.GLANCEABLE_HUB
+                            } else {
+                                KeyguardState.LOCKSCREEN
+                            }
+                        startTransitionTo(to)
                     }
             }
         } else {
@@ -120,26 +105,21 @@
                 keyguardInteractor.isKeyguardOccluded
                     .sample(
                         keyguardInteractor.isKeyguardShowing,
-                        startedKeyguardTransitionStep,
                         communalInteractor.isIdleOnCommunal,
                     )
-                    .collect { (isOccluded, isShowing, lastStartedKeyguardState, isIdleOnCommunal)
-                        ->
+                    .filterRelevantKeyguardStateAnd { (isOccluded, isShowing, _) ->
+                        !isOccluded && isShowing
+                    }
+                    .collect { (_, _, isIdleOnCommunal) ->
                         // Occlusion signals come from the framework, and should interrupt any
                         // existing transition
-                        if (
-                            !isOccluded &&
-                                isShowing &&
-                                lastStartedKeyguardState.to == KeyguardState.OCCLUDED
-                        ) {
-                            val to =
-                                if (isIdleOnCommunal) {
-                                    KeyguardState.GLANCEABLE_HUB
-                                } else {
-                                    KeyguardState.LOCKSCREEN
-                                }
-                            startTransitionTo(to)
-                        }
+                        val to =
+                            if (isIdleOnCommunal) {
+                                KeyguardState.GLANCEABLE_HUB
+                            } else {
+                                KeyguardState.LOCKSCREEN
+                            }
+                        startTransitionTo(to)
                     }
             }
         }
@@ -156,20 +136,12 @@
 
         scope.launch {
             keyguardInteractor.isKeyguardOccluded
-                .sample(
-                    keyguardInteractor.isKeyguardShowing,
-                    startedKeyguardTransitionStep,
-                )
-                .collect { (isOccluded, isShowing, lastStartedKeyguardState) ->
+                .sample(keyguardInteractor.isKeyguardShowing, ::Pair)
+                .filterRelevantKeyguardStateAnd { (occluded, showing) -> !occluded && !showing }
+                .collect {
                     // Occlusion signals come from the framework, and should interrupt any
                     // existing transition
-                    if (
-                        !isOccluded &&
-                            !isShowing &&
-                            lastStartedKeyguardState.to == KeyguardState.OCCLUDED
-                    ) {
-                        startTransitionTo(KeyguardState.GONE)
-                    }
+                    startTransitionTo(KeyguardState.GONE)
                 }
         }
     }
@@ -179,21 +151,16 @@
     }
 
     private fun listenForOccludedToAsleep() {
-        scope.launch { listenForSleepTransition(from = KeyguardState.OCCLUDED) }
+        scope.launch { listenForSleepTransition() }
     }
 
     private fun listenForOccludedToAlternateBouncer() {
         scope.launch {
             keyguardInteractor.alternateBouncerShowing
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { (isAlternateBouncerShowing, lastStartedTransitionStep) ->
-                    if (
-                        isAlternateBouncerShowing &&
-                            lastStartedTransitionStep.to == KeyguardState.OCCLUDED
-                    ) {
-                        startTransitionTo(KeyguardState.ALTERNATE_BOUNCER)
-                    }
+                .filterRelevantKeyguardStateAnd { isAlternateBouncerShowing ->
+                    isAlternateBouncerShowing
                 }
+                .collect { startTransitionTo(KeyguardState.ALTERNATE_BOUNCER) }
         }
     }
 
@@ -218,5 +185,6 @@
         private val DEFAULT_DURATION = 500.milliseconds
         val TO_LOCKSCREEN_DURATION = 933.milliseconds
         val TO_AOD_DURATION = DEFAULT_DURATION
+        val TO_DOZING_DURATION = DEFAULT_DURATION
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt
index c7fafba..181a551 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt
@@ -30,7 +30,6 @@
 import com.android.systemui.power.domain.interactor.PowerInteractor
 import com.android.systemui.user.domain.interactor.SelectedUserInteractor
 import com.android.systemui.util.kotlin.Utils.Companion.sample
-import com.android.systemui.util.kotlin.Utils.Companion.toTriple
 import com.android.systemui.util.kotlin.sample
 import com.android.wm.shell.animation.Interpolators
 import javax.inject.Inject
@@ -40,7 +39,6 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.onStart
 import kotlinx.coroutines.launch
 
@@ -104,21 +102,14 @@
             scope.launch {
                 keyguardInteractor.primaryBouncerShowing
                     .sample(
-                        startedKeyguardTransitionStep,
                         powerInteractor.isAwake,
                         keyguardInteractor.isActiveDreamLockscreenHosted,
                         communalInteractor.isIdleOnCommunal
                     )
-                    .filter { (_, startedStep, _, _) ->
-                        startedStep.to == KeyguardState.PRIMARY_BOUNCER
-                    }
+                    .filterRelevantKeyguardState()
                     .collect {
-                        (
-                            isBouncerShowing,
-                            _,
-                            isAwake,
-                            isActiveDreamLockscreenHosted,
-                            isIdleOnCommunal) ->
+                        (isBouncerShowing, isAwake, isActiveDreamLockscreenHosted, isIdleOnCommunal)
+                        ->
                         if (
                             !maybeStartTransitionToOccludedOrInsecureCamera() &&
                                 !isBouncerShowing &&
@@ -140,69 +131,45 @@
                 keyguardInteractor.primaryBouncerShowing
                     .sample(
                         powerInteractor.isAwake,
-                        startedKeyguardTransitionStep,
                         keyguardInteractor.isKeyguardOccluded,
                         keyguardInteractor.isDreaming,
                         keyguardInteractor.isActiveDreamLockscreenHosted,
                         communalInteractor.isIdleOnCommunal,
                     )
-                    .collect {
-                        (
-                            isBouncerShowing,
-                            isAwake,
-                            lastStartedTransitionStep,
-                            occluded,
-                            isDreaming,
-                            isActiveDreamLockscreenHosted,
-                            isIdleOnCommunal) ->
-                        if (
-                            !isBouncerShowing &&
-                                lastStartedTransitionStep.to == KeyguardState.PRIMARY_BOUNCER &&
-                                isAwake &&
-                                !isActiveDreamLockscreenHosted
-                        ) {
-                            val toState =
-                                if (occluded && !isDreaming) {
-                                    KeyguardState.OCCLUDED
-                                } else if (isIdleOnCommunal) {
-                                    KeyguardState.GLANCEABLE_HUB
-                                } else if (isDreaming) {
-                                    KeyguardState.DREAMING
-                                } else {
-                                    KeyguardState.LOCKSCREEN
-                                }
-                            startTransitionTo(toState)
-                        }
+                    .filterRelevantKeyguardStateAnd {
+                        (isBouncerShowing, isAwake, _, _, isActiveDreamLockscreenHosted, _) ->
+                        !isBouncerShowing && isAwake && !isActiveDreamLockscreenHosted
+                    }
+                    .collect { (_, _, occluded, isDreaming, _, isIdleOnCommunal) ->
+                        val toState =
+                            if (occluded && !isDreaming) {
+                                KeyguardState.OCCLUDED
+                            } else if (isIdleOnCommunal) {
+                                KeyguardState.GLANCEABLE_HUB
+                            } else if (isDreaming) {
+                                KeyguardState.DREAMING
+                            } else {
+                                KeyguardState.LOCKSCREEN
+                            }
+                        startTransitionTo(toState)
                     }
             }
         }
     }
 
     private fun listenForPrimaryBouncerToAsleep() {
-        scope.launch { listenForSleepTransition(from = KeyguardState.PRIMARY_BOUNCER) }
+        scope.launch { listenForSleepTransition() }
     }
 
     private fun listenForPrimaryBouncerToDreamingLockscreenHosted() {
         scope.launch {
             keyguardInteractor.primaryBouncerShowing
-                .sample(
-                    combine(
-                        keyguardInteractor.isActiveDreamLockscreenHosted,
-                        startedKeyguardTransitionStep,
-                        ::Pair
-                    ),
-                    ::toTriple
-                )
-                .collect {
-                    (isBouncerShowing, isActiveDreamLockscreenHosted, lastStartedTransitionStep) ->
-                    if (
-                        !isBouncerShowing &&
-                            isActiveDreamLockscreenHosted &&
-                            lastStartedTransitionStep.to == KeyguardState.PRIMARY_BOUNCER
-                    ) {
-                        startTransitionTo(KeyguardState.DREAMING_LOCKSCREEN_HOSTED)
-                    }
+                .sample(keyguardInteractor.isActiveDreamLockscreenHosted, ::Pair)
+                .filterRelevantKeyguardStateAnd { (isBouncerShowing, isActiveDreamLockscreenHosted)
+                    ->
+                    !isBouncerShowing && isActiveDreamLockscreenHosted
                 }
+                .collect { startTransitionTo(KeyguardState.DREAMING_LOCKSCREEN_HOSTED) }
         }
     }
 
@@ -216,33 +183,28 @@
 
         scope.launch {
             keyguardInteractor.isKeyguardGoingAway
-                .sample(startedKeyguardTransitionStep, ::Pair)
-                .collect { (isKeyguardGoingAway, lastStartedTransitionStep) ->
-                    if (
-                        isKeyguardGoingAway &&
-                            lastStartedTransitionStep.to == KeyguardState.PRIMARY_BOUNCER
-                    ) {
-                        val securityMode =
-                            keyguardSecurityModel.getSecurityMode(
-                                selectedUserInteractor.getSelectedUserId()
-                            )
-                        // IME for password requires a slightly faster animation
-                        val duration =
-                            if (securityMode == KeyguardSecurityModel.SecurityMode.Password) {
-                                TO_GONE_SHORT_DURATION
-                            } else {
-                                TO_GONE_DURATION
-                            }
-
-                        startTransitionTo(
-                            toState = KeyguardState.GONE,
-                            animator =
-                                getDefaultAnimatorForTransitionsToState(KeyguardState.GONE).apply {
-                                    this.duration = duration.inWholeMilliseconds
-                                },
-                            modeOnCanceled = TransitionModeOnCanceled.RESET,
+                .filterRelevantKeyguardStateAnd { isKeyguardGoingAway -> isKeyguardGoingAway }
+                .collect {
+                    val securityMode =
+                        keyguardSecurityModel.getSecurityMode(
+                            selectedUserInteractor.getSelectedUserId()
                         )
-                    }
+                    // IME for password requires a slightly faster animation
+                    val duration =
+                        if (securityMode == KeyguardSecurityModel.SecurityMode.Password) {
+                            TO_GONE_SHORT_DURATION
+                        } else {
+                            TO_GONE_DURATION
+                        }
+
+                    startTransitionTo(
+                        toState = KeyguardState.GONE,
+                        animator =
+                            getDefaultAnimatorForTransitionsToState(KeyguardState.GONE).apply {
+                                this.duration = duration.inWholeMilliseconds
+                            },
+                        modeOnCanceled = TransitionModeOnCanceled.RESET,
+                    )
                 }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
index d492135..d551c9b 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
@@ -17,7 +17,9 @@
 
 package com.android.systemui.keyguard.domain.interactor
 
+import android.util.Log
 import com.android.keyguard.ClockEventController
+import com.android.keyguard.KeyguardClockSwitch
 import com.android.keyguard.KeyguardClockSwitch.ClockSize
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.keyguard.data.repository.KeyguardClockRepository
@@ -29,8 +31,7 @@
 import kotlinx.coroutines.flow.StateFlow
 
 private val TAG = KeyguardClockInteractor::class.simpleName
-/** Manages keyguard clock for the lockscreen root view. */
-/** Encapsulates business-logic related to the keyguard clock. */
+/** Manages and ecapsulates the clock components of the lockscreen root view. */
 @SysUISingleton
 class KeyguardClockInteractor
 @Inject
@@ -46,6 +47,8 @@
 
     val previewClock: Flow<ClockController> = keyguardClockRepository.previewClock
 
+    val clockEventController: ClockEventController by keyguardClockRepository::clockEventController
+
     var clock: ClockController? by keyguardClockRepository.clockEventController::clock
 
     val clockSize: StateFlow<Int> = keyguardClockRepository.clockSize
@@ -53,8 +56,19 @@
         keyguardClockRepository.setClockSize(size)
     }
 
-    val clockEventController: ClockEventController
+    val renderedClockId: ClockId
         get() {
-            return keyguardClockRepository.clockEventController
+            return clock?.let { clock -> clock.config.id }
+                ?: run {
+                    Log.e(TAG, "No clock is available")
+                    KeyguardClockSwitch.MISSING_CLOCK_ID
+                }
         }
+
+    fun animateFoldToAod(foldFraction: Float) {
+        clock?.let { clock ->
+            clock.smallClock.animations.fold(foldFraction)
+            clock.largeClock.animations.fold(foldFraction)
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
index 283f160..2182fe3 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
@@ -29,6 +29,8 @@
 import com.android.systemui.common.shared.model.NotificationContainerBounds
 import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.keyguard.MigrateClocksToBlueprint
 import com.android.systemui.keyguard.data.repository.KeyguardRepository
 import com.android.systemui.keyguard.shared.model.BiometricUnlockModel
 import com.android.systemui.keyguard.shared.model.BiometricUnlockSource
@@ -46,14 +48,18 @@
 import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.shade.data.repository.ShadeRepository
 import com.android.systemui.statusbar.CommandQueue
+import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor
+import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine
 import com.android.systemui.util.kotlin.sample
 import javax.inject.Inject
 import javax.inject.Provider
+import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.combine
@@ -66,6 +72,7 @@
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.merge
 import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.flow.stateIn
 
 /**
  * Encapsulates business-logic related to the keyguard but not to a more specific part within it.
@@ -84,16 +91,33 @@
     keyguardTransitionInteractor: KeyguardTransitionInteractor,
     sceneInteractorProvider: Provider<SceneInteractor>,
     private val fromGoneTransitionInteractor: Provider<FromGoneTransitionInteractor>,
+    sharedNotificationContainerInteractor: Provider<SharedNotificationContainerInteractor>,
+    @Application applicationScope: CoroutineScope,
 ) {
     // TODO(b/296118689): move to a repository
-    private val _sharedNotificationContainerBounds = MutableStateFlow(NotificationContainerBounds())
+    private val _notificationPlaceholderBounds = MutableStateFlow(NotificationContainerBounds())
 
     /** Bounds of the notification container. */
-    val notificationContainerBounds: StateFlow<NotificationContainerBounds> =
-        _sharedNotificationContainerBounds.asStateFlow()
+    val notificationContainerBounds: StateFlow<NotificationContainerBounds> by lazy {
+        combine(
+                _notificationPlaceholderBounds,
+                sharedNotificationContainerInteractor.get().configurationBasedDimensions,
+            ) { bounds, cfg ->
+                // We offset the placeholder bounds by the configured top margin to account for
+                // legacy placement behavior within notifications for splitshade.
+                if (MigrateClocksToBlueprint.isEnabled && cfg.useSplitShade) {
+                    bounds.copy(bottom = bounds.bottom - cfg.keyguardSplitShadeTopMargin)
+                } else bounds
+            }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.WhileSubscribed(),
+                initialValue = NotificationContainerBounds(),
+            )
+    }
 
     fun setNotificationContainerBounds(position: NotificationContainerBounds) {
-        _sharedNotificationContainerBounds.value = position
+        _notificationPlaceholderBounds.value = position
     }
 
     /**
@@ -169,7 +193,7 @@
     val isKeyguardShowing: Flow<Boolean> = repository.isKeyguardShowing
 
     /** Whether the keyguard is dismissible or not. */
-    val isKeyguardDismissible: Flow<Boolean> = repository.isKeyguardDismissible
+    val isKeyguardDismissible: StateFlow<Boolean> = repository.isKeyguardDismissible
 
     /** Whether the keyguard is occluded (covered by an activity). */
     @Deprecated("Use KeyguardTransitionInteractor + KeyguardState.OCCLUDED")
@@ -256,12 +280,16 @@
      * signal should be sent directly to transitions.
      */
     val dismissAlpha: Flow<Float?> =
-        combine(
-                shadeRepository.legacyShadeExpansion,
+        shadeRepository.legacyShadeExpansion
+            .filter { it < 1f }
+            .sampleCombine(
                 statusBarState,
                 keyguardTransitionInteractor.currentKeyguardState,
                 isKeyguardDismissible,
-            ) { legacyShadeExpansion, statusBarState, currentKeyguardState, isKeyguardDismissible ->
+            )
+            .map {
+                (legacyShadeExpansion, statusBarState, currentKeyguardState, isKeyguardDismissible)
+                ->
                 if (
                     statusBarState == StatusBarState.KEYGUARD &&
                         isKeyguardDismissible &&
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt
index 82c28ff..65b42e6 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt
@@ -74,6 +74,14 @@
      * exit bouncer.
      */
     fun dispatchKeyEventPreIme(event: KeyEvent): Boolean {
+        when (event.action) {
+            KeyEvent.ACTION_DOWN -> {
+                val device = event.getDevice()
+                if (device != null && device.isFullKeyboard() && device.isExternal()) {
+                    powerInteractor.onUserTouch()
+                }
+            }
+        }
         when (event.keyCode) {
             KeyEvent.KEYCODE_BACK ->
                 if (
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt
index 9aa2202..4abd6c6 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt
@@ -19,13 +19,17 @@
 import android.app.ActivityManager.RunningTaskInfo
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor
 import com.android.systemui.keyguard.data.repository.KeyguardOcclusionRepository
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.power.domain.interactor.PowerInteractor
+import com.android.systemui.scene.shared.flag.SceneContainerFlag
 import com.android.systemui.util.kotlin.sample
+import dagger.Lazy
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.map
@@ -45,11 +49,12 @@
 class KeyguardOcclusionInteractor
 @Inject
 constructor(
-    @Application scope: CoroutineScope,
-    val repository: KeyguardOcclusionRepository,
-    val powerInteractor: PowerInteractor,
-    val transitionInteractor: KeyguardTransitionInteractor,
-    val keyguardInteractor: KeyguardInteractor,
+    @Application applicationScope: CoroutineScope,
+    private val repository: KeyguardOcclusionRepository,
+    private val powerInteractor: PowerInteractor,
+    private val transitionInteractor: KeyguardTransitionInteractor,
+    keyguardInteractor: KeyguardInteractor,
+    deviceUnlockedInteractor: Lazy<DeviceUnlockedInteractor>,
 ) {
     val showWhenLockedActivityInfo = repository.showWhenLockedActivityInfo.asStateFlow()
 
@@ -94,14 +99,19 @@
                 // Emit false once that activity goes away.
                 isShowWhenLockedActivityOnTop.filter { !it }.map { false }
             )
-            .stateIn(scope, SharingStarted.Eagerly, false)
+            .stateIn(applicationScope, SharingStarted.Eagerly, false)
 
     /**
      * Whether launching an occluding activity will automatically dismiss keyguard. This happens if
      * the keyguard is dismissable.
      */
-    val occludingActivityWillDismissKeyguard =
-        keyguardInteractor.isKeyguardDismissible.stateIn(scope, SharingStarted.Eagerly, false)
+    val occludingActivityWillDismissKeyguard: StateFlow<Boolean> =
+        if (SceneContainerFlag.isEnabled) {
+                deviceUnlockedInteractor.get().deviceUnlockStatus.map { it.isUnlocked }
+            } else {
+                keyguardInteractor.isKeyguardDismissible
+            }
+            .stateIn(scope = applicationScope, SharingStarted.Eagerly, false)
 
     /**
      * Called to let System UI know that WM says a SHOW_WHEN_LOCKED activity is on top (or no longer
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt
index 68ea5d0..141cca3 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt
@@ -21,6 +21,7 @@
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.log.core.LogLevel.VERBOSE
 import com.android.systemui.power.domain.interactor.PowerInteractor
+import com.android.systemui.scene.shared.flag.SceneContainerFlag
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.SharedNotificationContainerViewModel
 import javax.inject.Inject
@@ -69,9 +70,11 @@
             }
         }
 
-        scope.launch {
-            sharedNotificationContainerViewModel.bounds.collect {
-                logger.log(TAG, VERBOSE, "Notif: bounds", it)
+        if (!SceneContainerFlag.isEnabled) {
+            scope.launch {
+                sharedNotificationContainerViewModel.bounds.collect {
+                    logger.log(TAG, VERBOSE, "Notif: bounds", it)
+                }
             }
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt
index 0cd7d18..97081d9 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt
@@ -35,6 +35,7 @@
 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.TransitionInfo
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.keyguard.shared.model.TransitionStep
 import com.android.systemui.util.kotlin.pairwise
@@ -85,9 +86,11 @@
     private fun getTransitionValueFlow(state: KeyguardState): MutableSharedFlow<Float> {
         return transitionValueCache.getOrPut(state) {
             MutableSharedFlow<Float>(
-                extraBufferCapacity = 2,
-                onBufferOverflow = BufferOverflow.DROP_OLDEST
-            )
+                    replay = 1,
+                    extraBufferCapacity = 2,
+                    onBufferOverflow = BufferOverflow.DROP_OLDEST
+                )
+                .also { it.tryEmit(0f) }
         }
     }
 
@@ -389,6 +392,31 @@
             .distinctUntilChanged()
             .shareIn(scope, SharingStarted.Eagerly, replay = 1)
 
+    /**
+     * The [TransitionInfo] of the most recent call to
+     * [KeyguardTransitionRepository.startTransition].
+     *
+     * This should only be used by keyguard transition internals (From*TransitionInteractor and
+     * related classes). Other consumers of keyguard state in System UI should use
+     * [startedKeyguardState], [currentKeyguardState], and related flows.
+     *
+     * Keyguard internals use this to determine the most up-to-date KeyguardState that we've
+     * requested a transition to, even if the animator running the transition on the main thread has
+     * not yet emitted the STARTED TransitionStep.
+     *
+     * For example: if we're finished in GONE and press the power button twice very quickly, we may
+     * request a transition to AOD, but then receive the second power button press prior to the
+     * STARTED -> AOD transition step emitting. We still need the FromAodTransitionInteractor to
+     * request a transition from AOD -> LOCKSCREEN in response to the power press, even though the
+     * main thread animator hasn't emitted STARTED > AOD yet (which means [startedKeyguardState] is
+     * still GONE, which is not relevant to FromAodTransitionInteractor). In this case, the
+     * interactor can use this current transition info to determine that a STARTED -> AOD step
+     * *will* be emitted, and therefore that it can safely request an AOD -> LOCKSCREEN transition
+     * which will subsequently cancel GONE -> AOD.
+     */
+    internal val currentTransitionInfoInternal: StateFlow<TransitionInfo> =
+        repository.currentTransitionInfoInternal
+
     /** Whether we've currently STARTED a transition and haven't yet FINISHED it. */
     val isInTransitionToAnyState = isInTransitionWhere({ true }, { true })
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/ToAodFoldTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/ToAodFoldTransitionInteractor.kt
new file mode 100644
index 0000000..6729246
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/ToAodFoldTransitionInteractor.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.keyguard.domain.interactor
+
+import android.animation.ValueAnimator
+import android.view.ViewGroup
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
+import com.android.systemui.keyguard.shared.model.TransitionInfo
+import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
+import com.android.systemui.shade.NotificationPanelViewController
+import com.android.systemui.shade.ShadeFoldAnimator
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+
+@SysUISingleton
+class ToAodFoldTransitionInteractor
+@Inject
+constructor(
+    private val keyguardClockInteractor: KeyguardClockInteractor,
+    private val transitionInteractor: KeyguardTransitionInteractor,
+    private val transitionRepository: KeyguardTransitionRepository,
+    @Application private val mainScope: CoroutineScope,
+    @Main private val mainDispatcher: CoroutineDispatcher,
+) {
+    private var parentAnimator: NotificationPanelViewController.ShadeFoldAnimatorImpl? = null
+
+    // TODO(b/331770313): Migrate to PowerInteractor; Deprecate ShadeFoldAnimator again
+    val foldAnimator =
+        object : ShadeFoldAnimator {
+            override val view: ViewGroup?
+                get() = throw NotImplementedError("Deprecated. Do not call.")
+
+            override fun prepareFoldToAodAnimation() {
+                forceToAod()
+                parentAnimator?.prepareFoldToAodAnimation()
+            }
+
+            override fun startFoldToAodAnimation(
+                startAction: Runnable,
+                endAction: Runnable,
+                cancelAction: Runnable
+            ) {
+                parentAnimator?.let {
+                    it.buildViewAnimator(startAction, endAction, cancelAction)
+                        .setUpdateListener {
+                            keyguardClockInteractor.animateFoldToAod(it.animatedFraction)
+                        }
+                        .start()
+                }
+            }
+
+            override fun cancelFoldToAodAnimation() {
+                parentAnimator?.cancelFoldToAodAnimation()
+            }
+        }
+
+    fun initialize(parentAnimator: ShadeFoldAnimator) {
+        this.parentAnimator =
+            parentAnimator as? NotificationPanelViewController.ShadeFoldAnimatorImpl?
+    }
+
+    /** Forces the keyguard into AOD or Doze */
+    private fun forceToAod() {
+        mainScope.launch(mainDispatcher) {
+            transitionRepository.startTransition(
+                TransitionInfo(
+                    "$TAG (Fold transition triggered)",
+                    transitionInteractor.getCurrentState(),
+                    transitionInteractor.asleepKeyguardState.value,
+                    ValueAnimator().apply { duration = 0 },
+                    TransitionModeOnCanceled.LAST_VALUE,
+                )
+            )
+        }
+    }
+
+    companion object {
+        private val TAG = ToAodFoldTransitionInteractor::class.simpleName!!
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt
index 375df3e..e456a55 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt
@@ -29,11 +29,11 @@
 import java.util.UUID
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 
 /**
  * Each TransitionInteractor is responsible for determining under which conditions to notify
@@ -78,32 +78,38 @@
         // a bugreport.
         ownerReason: String = "",
     ): UUID? {
-        if (
-            fromState != transitionInteractor.startedKeyguardState.replayCache.last() &&
-                fromState != transitionInteractor.finishedKeyguardState.replayCache.last()
-        ) {
+        if (fromState != transitionInteractor.currentTransitionInfoInternal.value.to) {
             Log.e(
                 name,
-                "startTransition: We were asked to transition from " +
-                    "$fromState to $toState, however we last finished a transition to " +
-                    "${transitionInteractor.finishedKeyguardState.replayCache.last()}, " +
-                    "and last started a transition to " +
-                    "${transitionInteractor.startedKeyguardState.replayCache.last()}. " +
-                    "Ignoring startTransition, but this should never happen."
+                "Ignoring startTransition: This interactor asked to transition from " +
+                    "$fromState -> $toState, but we last transitioned to " +
+                    "${transitionInteractor.currentTransitionInfoInternal.value.to}, not " +
+                    "$fromState. This should never happen - check currentTransitionInfoInternal " +
+                    "or use filterRelevantKeyguardState before starting transitions."
             )
+
+            if (fromState == transitionInteractor.finishedKeyguardState.replayCache.last()) {
+                Log.e(
+                    name,
+                    "This transition would not have been ignored prior to ag/26681239, since we " +
+                        "are FINISHED in $fromState (but have since started another transition). " +
+                        "If ignoring this transition has caused a regression, fix it by ensuring " +
+                        "that transitions are exclusively started from the most recently started " +
+                        "state."
+                )
+            }
             return null
         }
-        return withContext(mainDispatcher) {
-            transitionRepository.startTransition(
-                TransitionInfo(
-                    name + if (ownerReason.isNotBlank()) "($ownerReason)" else "",
-                    fromState,
-                    toState,
-                    animator,
-                    modeOnCanceled,
-                )
+
+        return transitionRepository.startTransition(
+            TransitionInfo(
+                name + if (ownerReason.isNotBlank()) "($ownerReason)" else "",
+                fromState,
+                toState,
+                animator,
+                modeOnCanceled,
             )
-        }
+        )
     }
 
     /**
@@ -114,25 +120,15 @@
      * Returns true if a transition was started, false otherwise.
      */
     suspend fun maybeStartTransitionToOccludedOrInsecureCamera(): Boolean {
+        // The refactor is required for the occlusion interactor to work.
+        KeyguardWmStateRefactor.isUnexpectedlyInLegacyMode()
+
+        // Check if we should start a transition from the power gesture.
         if (keyguardOcclusionInteractor.shouldTransitionFromPowerButtonGesture()) {
-            if (transitionInteractor.getCurrentState() == KeyguardState.GONE) {
-                // If the current state is GONE when the launch gesture is triggered, it means we
-                // were in transition from GONE -> DOZING/AOD due to the first power button tap. The
-                // second tap indicates that the user's intent was actually to launch the unlocked
-                // (insecure) camera, so we should transition back to GONE.
-                startTransitionTo(
-                    KeyguardState.GONE,
-                    ownerReason = "Power button gesture while GONE"
-                )
-            } else if (keyguardOcclusionInteractor.occludingActivityWillDismissKeyguard.value) {
-                // The double tap gesture occurred while not GONE (AOD/LOCKSCREEN/etc.), but the
-                // keyguard is dismissable. The activity launch will dismiss the keyguard, so we
-                // should transition to GONE.
-                startTransitionTo(
-                    KeyguardState.GONE,
-                    ownerReason = "Power button gesture on dismissable keyguard"
-                )
-            } else {
+            // See if we handled the insecure power gesture. If not, then we'll be launching the
+            // secure camera. Once KeyguardWmStateRefactor is fully enabled, we can clean up this
+            // code path by pulling maybeHandleInsecurePowerGesture() into this conditional.
+            if (!maybeHandleInsecurePowerGesture()) {
                 // Otherwise, the double tap gesture occurred while not GONE and not dismissable,
                 // which means we will launch the secure camera, which OCCLUDES the keyguard.
                 startTransitionTo(
@@ -159,6 +155,43 @@
     }
 
     /**
+     * Transition to [KeyguardState.GONE] for the insecure power button launch gesture, if the
+     * conditions to do so are met.
+     *
+     * Called from [FromAodTransitionInteractor] if [KeyguardWmStateRefactor] is not enabled, or
+     * [maybeStartTransitionToOccludedOrInsecureCamera] if it's enabled.
+     */
+    @Deprecated("Will be merged into maybeStartTransitionToOccludedOrInsecureCamera")
+    suspend fun maybeHandleInsecurePowerGesture(): Boolean {
+        if (keyguardOcclusionInteractor.shouldTransitionFromPowerButtonGesture()) {
+            if (transitionInteractor.getCurrentState() == KeyguardState.GONE) {
+                // If the current state is GONE when the launch gesture is triggered, it means we
+                // were in transition from GONE -> DOZING/AOD due to the first power button tap. The
+                // second tap indicates that the user's intent was actually to launch the unlocked
+                // (insecure) camera, so we should transition back to GONE.
+                startTransitionTo(
+                    KeyguardState.GONE,
+                    ownerReason = "Power button gesture while GONE"
+                )
+
+                return true
+            } else if (keyguardOcclusionInteractor.occludingActivityWillDismissKeyguard.value) {
+                // The double tap gesture occurred while not GONE (AOD/LOCKSCREEN/etc.), but the
+                // keyguard is dismissable. The activity launch will dismiss the keyguard, so we
+                // should transition to GONE.
+                startTransitionTo(
+                    KeyguardState.GONE,
+                    ownerReason = "Power button gesture on dismissable keyguard"
+                )
+
+                return true
+            }
+        }
+
+        return false
+    }
+
+    /**
      * Transition to the appropriate state when the device goes to sleep while in [from].
      *
      * We could also just use [fromState], but it's more readable in the From*TransitionInteractor
@@ -166,15 +199,14 @@
      * state, [startTransitionTo] would complain anyway.
      */
     suspend fun listenForSleepTransition(
-        from: KeyguardState,
         modeOnCanceledFromStartedStep: (TransitionStep) -> TransitionModeOnCanceled = {
             TransitionModeOnCanceled.LAST_VALUE
         }
     ) {
         powerInteractor.isAsleep
             .filter { isAsleep -> isAsleep }
+            .filterRelevantKeyguardState()
             .sample(startedKeyguardTransitionStep)
-            .filter { startedStep -> startedStep.to == from }
             .map(modeOnCanceledFromStartedStep)
             .collect { modeOnCanceled ->
                 startTransitionTo(
@@ -211,6 +243,34 @@
     }
 
     /**
+     * Whether we're in the KeyguardState relevant to this From*TransitionInteractor (which we know
+     * from [fromState]).
+     *
+     * This uses [KeyguardTransitionInteractor.currentTransitionInfoInternal], which is more up to
+     * date than [startedKeyguardState] as it does not wait for the emission of the first STARTED
+     * step.
+     */
+    fun inOrTransitioningToRelevantKeyguardState(): Boolean {
+        return transitionInteractor.currentTransitionInfoInternal.value.to == fromState
+    }
+
+    /**
+     * Filters emissions whenever we're not in a KeyguardState relevant to this
+     * From*TransitionInteractor (which we know from [fromState]).
+     */
+    fun <T> Flow<T>.filterRelevantKeyguardState(): Flow<T> {
+        return filter { inOrTransitioningToRelevantKeyguardState() }
+    }
+
+    /**
+     * Filters emissions whenever we're not in a KeyguardState relevant to this
+     * From*TransitionInteractor (which we know from [fromState]).
+     */
+    fun <T> Flow<T>.filterRelevantKeyguardStateAnd(predicate: (T) -> Boolean): Flow<T> {
+        return filter { inOrTransitioningToRelevantKeyguardState() && predicate.invoke(it) }
+    }
+
+    /**
      * Returns a ValueAnimator to be used for transitions to [toState], if one is not explicitly
      * passed to [startTransitionTo].
      */
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/RefactorKeyguardDismissIntent.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/RefactorKeyguardDismissIntent.kt
new file mode 100644
index 0000000..a43eb71
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/RefactorKeyguardDismissIntent.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.shared
+
+import com.android.systemui.Flags
+import com.android.systemui.flags.FlagToken
+import com.android.systemui.flags.RefactorFlagUtils
+
+/** Helper for reading or using the refactor_keyguard_dismiss_intent flag. */
+@Suppress("NOTHING_TO_INLINE")
+object RefactorKeyguardDismissIntent {
+    /** The aconfig flag name */
+    const val FLAG_NAME = Flags.FLAG_REFACTOR_KEYGUARD_DISMISS_INTENT
+
+    /** A token used for dependency declaration */
+    val token: FlagToken
+        get() = FlagToken(FLAG_NAME, isEnabled)
+
+    /** Is the refactor enabled */
+    @JvmStatic
+    inline val isEnabled
+        get() = Flags.refactorKeyguardDismissIntent()
+
+    /**
+     * 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/keyguard/ui/binder/AlternateBouncerMessageAreaViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerMessageAreaViewBinder.kt
index 9186dde..fe5f632 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerMessageAreaViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerMessageAreaViewBinder.kt
@@ -18,6 +18,7 @@
 
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.keyguard.AuthKeyguardMessageArea
 import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerMessageAreaViewModel
 import com.android.systemui.lifecycle.repeatWhenAttached
@@ -36,14 +37,18 @@
         view.setIsVisible(true)
         view.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.STARTED) {
-                viewModel.message.collect { biometricMsg ->
-                    if (biometricMsg == null) {
-                        view.setMessage("", true)
-                    } else {
-                        view.setMessage(biometricMsg.message, true)
+                launch("$TAG#viewModel.message") {
+                    viewModel.message.collect { biometricMsg ->
+                        if (biometricMsg == null) {
+                            view.setMessage("", true)
+                        } else {
+                            view.setMessage(biometricMsg.message, true)
+                        }
                     }
                 }
             }
         }
     }
+
+    private const val TAG = "AlternateBouncerMessageAreaViewBinder"
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt
index c749818..9dc77d3 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt
@@ -21,12 +21,12 @@
 import android.view.View
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
 import com.android.systemui.keyguard.ui.view.DeviceEntryIconView
 import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerUdfpsIconViewModel
 import com.android.systemui.lifecycle.repeatWhenAttached
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.launch
 
 @ExperimentalCoroutinesApi
 object AlternateBouncerUdfpsViewBinder {
@@ -45,9 +45,14 @@
 
         view.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.STARTED) {
-                viewModel.accessibilityDelegateHint.collect { hint ->
-                    view.accessibilityHintType = hint
+                view.alpha = 0f
+                launch("$TAG#viewModel.accessibilityDelegateHint") {
+                    viewModel.accessibilityDelegateHint.collect { hint ->
+                        view.accessibilityHintType = hint
+                    }
                 }
+
+                launch("$TAG#viewModel.alpha") { viewModel.alpha.collect { view.alpha = it } }
             }
         }
 
@@ -72,13 +77,17 @@
         bgView.visibility = View.VISIBLE
         bgView.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.STARTED) {
-                launch {
+                launch("$TAG#viewModel.bgColor") {
                     viewModel.bgColor.collect { color ->
                         bgView.imageTintList = ColorStateList.valueOf(color)
                     }
                 }
-                launch { viewModel.bgAlpha.collect { alpha -> bgView.alpha = alpha } }
+                launch("$TAG#viewModel.bgAlpha") {
+                    viewModel.bgAlpha.collect { alpha -> bgView.alpha = alpha }
+                }
             }
         }
     }
+
+    private const val TAG = "AlternateBouncerUdfpsViewBinder"
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
index 3a2781c..53f0132 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
@@ -16,13 +16,22 @@
 
 package com.android.systemui.keyguard.ui.binder
 
+import android.graphics.PixelFormat
+import android.view.Gravity
+import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.view.WindowManager
+import android.window.OnBackInvokedCallback
+import android.window.OnBackInvokedDispatcher
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.constraintlayout.widget.ConstraintSet
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
-import com.android.systemui.classifier.Classifier
+import com.android.app.tracing.coroutines.launch
+import com.android.systemui.CoreStartable
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
 import com.android.systemui.deviceentry.ui.binder.UdfpsAccessibilityOverlayBinder
 import com.android.systemui.deviceentry.ui.view.UdfpsAccessibilityOverlay
@@ -30,24 +39,127 @@
 import com.android.systemui.keyguard.ui.view.DeviceEntryIconView
 import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerDependencies
 import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerUdfpsIconViewModel
+import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerWindowViewModel
 import com.android.systemui.lifecycle.repeatWhenAttached
-import com.android.systemui.plugins.FalsingManager
 import com.android.systemui.res.R
 import com.android.systemui.scrim.ScrimView
 import dagger.Lazy
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.launch
 
 /**
- * Binds the alternate bouncer view to its view-model.
+ * When necessary, adds the alternate bouncer window above most other windows (including the
+ * notification shade, system UI dialogs) but below the UDFPS touch overlay and SideFPS indicator.
+ * Also binds the alternate bouncer view to its view-model.
  *
- * For devices that support UDFPS, this includes a UDFPS view.
+ * For devices that support UDFPS, this view includes a UDFPS view.
  */
-@ExperimentalCoroutinesApi
-object AlternateBouncerViewBinder {
+@OptIn(ExperimentalCoroutinesApi::class)
+@SysUISingleton
+class AlternateBouncerViewBinder
+@Inject
+constructor(
+    @Application private val applicationScope: CoroutineScope,
+    private val alternateBouncerWindowViewModel: Lazy<AlternateBouncerWindowViewModel>,
+    private val alternateBouncerDependencies: Lazy<AlternateBouncerDependencies>,
+    private val windowManager: Lazy<WindowManager>,
+    private val layoutInflater: Lazy<LayoutInflater>,
+) : CoreStartable {
+    private val layoutParams: WindowManager.LayoutParams
+        get() =
+            WindowManager.LayoutParams(
+                    WindowManager.LayoutParams.MATCH_PARENT,
+                    WindowManager.LayoutParams.MATCH_PARENT,
+                    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
+                    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or
+                        WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
+                    PixelFormat.TRANSLUCENT,
+                )
+                .apply {
+                    title = "AlternateBouncerView"
+                    fitInsetsTypes = 0 // overrides default, avoiding status bars during layout
+                    gravity = Gravity.TOP or Gravity.LEFT
+                    layoutInDisplayCutoutMode =
+                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+                    privateFlags =
+                        WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY or
+                            WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION
+                }
+    private var alternateBouncerView: ConstraintLayout? = null
+
+    override fun start() {
+        if (!DeviceEntryUdfpsRefactor.isEnabled) {
+            return
+        }
+        applicationScope.launch("$TAG#alternateBouncerWindowViewModel") {
+            alternateBouncerWindowViewModel.get().alternateBouncerWindowRequired.collect {
+                addAlternateBouncerWindowView ->
+                if (addAlternateBouncerWindowView) {
+                    addViewToWindowManager()
+                    val scrim =
+                        alternateBouncerView!!.requireViewById(R.id.alternate_bouncer_scrim)
+                            as ScrimView
+                    scrim.viewAlpha = 0f
+                    bind(alternateBouncerView!!, alternateBouncerDependencies.get())
+                } else {
+                    removeViewFromWindowManager()
+                    alternateBouncerDependencies.get().viewModel.hideAlternateBouncer()
+                }
+            }
+        }
+    }
+
+    private fun removeViewFromWindowManager() {
+        if (alternateBouncerView == null || !alternateBouncerView!!.isAttachedToWindow) {
+            return
+        }
+
+        windowManager.get().removeView(alternateBouncerView)
+        alternateBouncerView!!.removeOnAttachStateChangeListener(onAttachAddBackGestureHandler)
+        alternateBouncerView = null
+    }
+
+    private val onAttachAddBackGestureHandler =
+        object : View.OnAttachStateChangeListener {
+            private val onBackInvokedCallback: OnBackInvokedCallback = OnBackInvokedCallback {
+                onBackRequested()
+            }
+
+            override fun onViewAttachedToWindow(view: View) {
+                view
+                    .findOnBackInvokedDispatcher()
+                    ?.registerOnBackInvokedCallback(
+                        OnBackInvokedDispatcher.PRIORITY_OVERLAY,
+                        onBackInvokedCallback,
+                    )
+            }
+
+            override fun onViewDetachedFromWindow(view: View) {
+                view
+                    .findOnBackInvokedDispatcher()
+                    ?.unregisterOnBackInvokedCallback(onBackInvokedCallback)
+            }
+
+            fun onBackRequested() {
+                alternateBouncerDependencies.get().viewModel.hideAlternateBouncer()
+            }
+        }
+
+    private fun addViewToWindowManager() {
+        if (alternateBouncerView?.isAttachedToWindow == true) {
+            return
+        }
+
+        alternateBouncerView =
+            layoutInflater.get().inflate(R.layout.alternate_bouncer, null, false)
+                as ConstraintLayout
+
+        windowManager.get().addView(alternateBouncerView, layoutParams)
+        alternateBouncerView!!.addOnAttachStateChangeListener(onAttachAddBackGestureHandler)
+    }
 
     /** Binds the view to the view-model, continuing to update the former based on the latter. */
-    @JvmStatic
     fun bind(
         view: ConstraintLayout,
         alternateBouncerDependencies: AlternateBouncerDependencies,
@@ -71,27 +183,20 @@
         val viewModel = alternateBouncerDependencies.viewModel
         val swipeUpAnywhereGestureHandler =
             alternateBouncerDependencies.swipeUpAnywhereGestureHandler
-        val falsingManager = alternateBouncerDependencies.falsingManager
         val tapGestureDetector = alternateBouncerDependencies.tapGestureDetector
         view.repeatWhenAttached { alternateBouncerViewContainer ->
             repeatOnLifecycle(Lifecycle.State.STARTED) {
-                scrim.viewAlpha = 0f
-
-                launch {
+                launch("$TAG#viewModel.registerForDismissGestures") {
                     viewModel.registerForDismissGestures.collect { registerForDismissGestures ->
                         if (registerForDismissGestures) {
                             swipeUpAnywhereGestureHandler.addOnGestureDetectedCallback(swipeTag) { _
                                 ->
-                                if (
-                                    !falsingManager.isFalseTouch(Classifier.ALTERNATE_BOUNCER_SWIPE)
-                                ) {
-                                    viewModel.showPrimaryBouncer()
-                                }
+                                alternateBouncerDependencies.powerInteractor.onUserTouch()
+                                viewModel.showPrimaryBouncer()
                             }
                             tapGestureDetector.addOnGestureDetectedCallback(tapTag) { _ ->
-                                if (!falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
-                                    viewModel.showPrimaryBouncer()
-                                }
+                                alternateBouncerDependencies.powerInteractor.onUserTouch()
+                                viewModel.showPrimaryBouncer()
                             }
                         } else {
                             swipeUpAnywhereGestureHandler.removeOnGestureDetectedCallback(swipeTag)
@@ -100,22 +205,13 @@
                     }
                 }
 
-                launch {
-                    viewModel.scrimAlpha.collect {
-                        val wasVisible = alternateBouncerViewContainer.visibility == View.VISIBLE
-                        alternateBouncerViewContainer.visibility =
-                            if (it < .1f) View.INVISIBLE else View.VISIBLE
-                        scrim.viewAlpha = it
-                        if (
-                            wasVisible && alternateBouncerViewContainer.visibility == View.INVISIBLE
-                        ) {
-                            // view is no longer visible
-                            viewModel.hideAlternateBouncer()
-                        }
-                    }
+                launch("$TAG#viewModel.scrimAlpha") {
+                    viewModel.scrimAlpha.collect { scrim.viewAlpha = it }
                 }
 
-                launch { viewModel.scrimColor.collect { scrim.tint = it } }
+                launch("$TAG#viewModel.scrimColor") {
+                    viewModel.scrimColor.collect { scrim.tint = it }
+                }
             }
         }
     }
@@ -127,7 +223,7 @@
     ) {
         view.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.CREATED) {
-                launch {
+                launch("$TAG#udfpsIconViewModel.iconLocation") {
                     udfpsIconViewModel.iconLocation.collect { iconLocation ->
                         // add UDFPS a11y overlay
                         val udfpsA11yOverlayViewId =
@@ -200,7 +296,9 @@
             }
         }
     }
+    companion object {
+        private const val TAG = "AlternateBouncerViewBinder"
+        private const val swipeTag = "AlternateBouncer-SWIPE"
+        private const val tapTag = "AlternateBouncer-TAP"
+    }
 }
-
-private const val swipeTag = "AlternateBouncer-SWIPE"
-private const val tapTag = "AlternateBouncer-TAP"
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt
index f46a207..e423fe0 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt
@@ -25,6 +25,7 @@
 import androidx.core.view.isInvisible
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.common.ui.view.LongPressHandlingView
 import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
 import com.android.systemui.keyguard.ui.view.DeviceEntryIconView
@@ -34,13 +35,15 @@
 import com.android.systemui.lifecycle.repeatWhenAttached
 import com.android.systemui.plugins.FalsingManager
 import com.android.systemui.statusbar.VibratorHelper
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.launch
 
 @ExperimentalCoroutinesApi
 object DeviceEntryIconViewBinder {
 
+    private const val TAG = "DeviceEntryIconViewBinder"
+
     /**
      * Updates UI for:
      * - device entry containing view (parent view for the below views)
@@ -58,6 +61,7 @@
         bgViewModel: DeviceEntryBackgroundViewModel,
         falsingManager: FalsingManager,
         vibratorHelper: VibratorHelper,
+        mainImmediateDispatcher: CoroutineDispatcher,
     ) {
         DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode()
         val longPressHandlingView = view.longPressHandlingView
@@ -73,31 +77,33 @@
                         view,
                         HapticFeedbackConstants.CONFIRM,
                     )
-                    applicationScope.launch { viewModel.onLongPress() }
+                    applicationScope.launch("$TAG#viewModel.onLongPress") {
+                        viewModel.onLongPress()
+                    }
                 }
             }
 
-        view.repeatWhenAttached {
+        view.repeatWhenAttached(mainImmediateDispatcher) {
             // Repeat on CREATED so that the view will always observe the entire
             // GONE => AOD transition (even though the view may not be visible until the middle
             // of the transition.
             repeatOnLifecycle(Lifecycle.State.CREATED) {
-                launch {
+                launch("$TAG#viewModel.isVisible") {
                     viewModel.isVisible.collect { isVisible ->
                         longPressHandlingView.isInvisible = !isVisible
                     }
                 }
-                launch {
+                launch("$TAG#viewModel.isLongPressEnabled") {
                     viewModel.isLongPressEnabled.collect { isEnabled ->
                         longPressHandlingView.setLongPressHandlingEnabled(isEnabled)
                     }
                 }
-                launch {
+                launch("$TAG#viewModel.accessibilityDelegateHint") {
                     viewModel.accessibilityDelegateHint.collect { hint ->
                         view.accessibilityHintType = hint
                     }
                 }
-                launch {
+                launch("$TAG#viewModel.useBackgroundProtection") {
                     viewModel.useBackgroundProtection.collect { useBackgroundProtection ->
                         if (useBackgroundProtection) {
                             bgView.visibility = View.VISIBLE
@@ -106,7 +112,7 @@
                         }
                     }
                 }
-                launch {
+                launch("$TAG#viewModel.burnInOffsets") {
                     viewModel.burnInOffsets.collect { burnInOffsets ->
                         view.translationX = burnInOffsets.x.toFloat()
                         view.translationY = burnInOffsets.y.toFloat()
@@ -114,15 +120,17 @@
                     }
                 }
 
-                launch { viewModel.deviceEntryViewAlpha.collect { alpha -> view.alpha = alpha } }
+                launch("$TAG#viewModel.deviceEntryViewAlpha") {
+                    viewModel.deviceEntryViewAlpha.collect { alpha -> view.alpha = alpha }
+                }
             }
         }
 
-        fgIconView.repeatWhenAttached {
+        fgIconView.repeatWhenAttached(mainImmediateDispatcher) {
             repeatOnLifecycle(Lifecycle.State.STARTED) {
                 // Start with an empty state
                 fgIconView.setImageState(StateSet.NOTHING, /* merge */ false)
-                launch {
+                launch("$TAG#fgViewModel.viewModel") {
                     fgViewModel.viewModel.collect { viewModel ->
                         fgIconView.setImageState(
                             view.getIconState(viewModel.type, viewModel.useAodVariant),
@@ -142,8 +150,10 @@
 
         bgView.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.CREATED) {
-                launch { bgViewModel.alpha.collect { alpha -> bgView.alpha = alpha } }
-                launch {
+                launch("$TAG#bgViewModel.alpha") {
+                    bgViewModel.alpha.collect { alpha -> bgView.alpha = alpha }
+                }
+                launch("$TAG#bgViewModel.color") {
                     bgViewModel.color.collect { color ->
                         bgView.imageTintList = ColorStateList.valueOf(color)
                     }
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 7e3ddf9..b5d6177 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
@@ -26,6 +26,7 @@
 import androidx.constraintlayout.widget.ConstraintSet
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.keyguard.KeyguardBottomAreaRefactor
@@ -39,7 +40,6 @@
 import com.android.systemui.res.R
 import javax.inject.Inject
 import kotlin.math.max
-import kotlinx.coroutines.launch
 
 private const val TAG = "KeyguardBlueprintViewBinder"
 private const val DEBUG = false
@@ -90,7 +90,7 @@
     ) {
         constraintLayout.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.CREATED) {
-                launch {
+                launch("$TAG#viewModel.blueprint") {
                     viewModel.blueprint.collect { blueprint ->
                         Trace.beginSection("KeyguardBlueprintViewBinder#applyBlueprint")
                         val prevBluePrint = viewModel.currentBluePrint
@@ -137,7 +137,7 @@
                     }
                 }
 
-                launch {
+                launch("$TAG#viewModel.refreshTransition") {
                     viewModel.refreshTransition.collect { transition ->
                         Trace.beginSection("KeyguardBlueprintViewBinder#refreshTransition")
                         val cs =
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
index 397cbe5..660a650 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
@@ -36,6 +36,7 @@
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
 import com.android.app.animation.Interpolators
+import com.android.app.tracing.coroutines.launch
 import com.android.settingslib.Utils
 import com.android.systemui.animation.ActivityTransitionAnimator
 import com.android.systemui.animation.Expandable
@@ -61,7 +62,6 @@
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.launch
 
 /**
  * Binds a keyguard bottom area view to its view-model.
@@ -77,6 +77,7 @@
     private const val EXIT_DOZE_BUTTON_REVEAL_ANIMATION_DURATION_MS = 250L
     private const val SCALE_SELECTED_BUTTON = 1.23f
     private const val DIM_ALPHA = 0.3f
+    private const val TAG = "KeyguardBottomAreaViewBinder"
 
     /**
      * Defines interface for an object that acts as the binding between the view and its view-model.
@@ -171,7 +172,7 @@
             view.repeatWhenAttached {
                 repeatOnLifecycle(Lifecycle.State.STARTED) {
                     // If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
-                    launch {
+                    launch("$TAG#viewModel.startButton") {
                         viewModel.startButton.collect { buttonModel ->
                             updateButton(
                                 view = startButton,
@@ -184,7 +185,7 @@
                     }
 
                     // If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
-                    launch {
+                    launch("$TAG#viewModel.endButton") {
                         viewModel.endButton.collect { buttonModel ->
                             updateButton(
                                 view = endButton,
@@ -196,7 +197,7 @@
                         }
                     }
 
-                    launch {
+                    launch("$TAG#viewModel.isOverlayContainerVisible") {
                         viewModel.isOverlayContainerVisible.collect { isVisible ->
                             overlayContainer.visibility =
                                 if (isVisible) {
@@ -207,7 +208,7 @@
                         }
                     }
 
-                    launch {
+                    launch("$TAG#viewModel.alpha") {
                         viewModel.alpha.collect { alpha ->
                             ambientIndicationArea?.apply {
                                 this.importantForAccessibility =
@@ -222,7 +223,7 @@
                     }
 
                     // If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
-                    launch {
+                    launch("$TAG#updateButtonAlpha") {
                         updateButtonAlpha(
                             view = startButton,
                             viewModel = viewModel.startButton,
@@ -231,7 +232,7 @@
                     }
 
                     // If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
-                    launch {
+                    launch("$TAG#updateButtonAlpha") {
                         updateButtonAlpha(
                             view = endButton,
                             viewModel = viewModel.endButton,
@@ -239,13 +240,13 @@
                         )
                     }
 
-                    launch {
+                    launch("$TAG#viewModel.indicationAreaTranslationX") {
                         viewModel.indicationAreaTranslationX.collect { translationX ->
                             ambientIndicationArea?.translationX = translationX
                         }
                     }
 
-                    launch {
+                    launch("$TAG#viewModel.indicationAreaTranslationY") {
                         configurationBasedDimensions
                             .map { it.defaultBurnInPreventionYOffsetPx }
                             .flatMapLatest { defaultBurnInOffsetY ->
@@ -257,7 +258,7 @@
                     }
 
                     // If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
-                    launch {
+                    launch("$TAG#startButton.updateLayoutParams<ViewGroup") {
                         configurationBasedDimensions.collect { dimensions ->
                             startButton.updateLayoutParams<ViewGroup.LayoutParams> {
                                 width = dimensions.buttonSizePx.width
@@ -270,7 +271,7 @@
                         }
                     }
 
-                    launch {
+                    launch("$TAG#viewModel.settingsMenuViewModel") {
                         viewModel.settingsMenuViewModel.isVisible.distinctUntilChanged().collect {
                             isVisible ->
                             settingsMenu.animateVisibility(visible = isVisible)
@@ -297,7 +298,7 @@
                     // shows up in the Wallpaper Picker app. If we do that, then the
                     // settings menu should never be visible.
                     if (activityStarter != null) {
-                        launch {
+                        launch("$TAG#viewModel.settingsMenuViewModel") {
                             viewModel.settingsMenuViewModel.shouldOpenSettings
                                 .filter { it }
                                 .collect {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt
index 6255f0d4..1b06a69 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt
@@ -26,6 +26,7 @@
 import androidx.constraintlayout.widget.ConstraintSet
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.keyguard.KeyguardClockSwitch.LARGE
 import com.android.keyguard.KeyguardClockSwitch.SMALL
 import com.android.systemui.keyguard.MigrateClocksToBlueprint
@@ -37,10 +38,10 @@
 import com.android.systemui.lifecycle.repeatWhenAttached
 import com.android.systemui.plugins.clocks.ClockController
 import com.android.systemui.shared.clocks.DEFAULT_CLOCK_ID
-import kotlinx.coroutines.launch
+import kotlinx.coroutines.DisposableHandle
 
 object KeyguardClockViewBinder {
-    private val TAG = KeyguardClockViewBinder::class.simpleName!!
+    private const val TAG = "KeyguardClockViewBinder"
     // When changing to new clock, we need to remove old clock views from burnInLayer
     private var lastClock: ClockController? = null
     @JvmStatic
@@ -50,15 +51,12 @@
         viewModel: KeyguardClockViewModel,
         keyguardClockInteractor: KeyguardClockInteractor,
         blueprintInteractor: KeyguardBlueprintInteractor,
-    ) {
-        keyguardRootView.repeatWhenAttached {
+    ): DisposableHandle {
+        keyguardClockInteractor.clockEventController.registerListeners(keyguardRootView)
+
+        return keyguardRootView.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.CREATED) {
-                keyguardClockInteractor.clockEventController.registerListeners(keyguardRootView)
-            }
-        }
-        keyguardRootView.repeatWhenAttached {
-            repeatOnLifecycle(Lifecycle.State.CREATED) {
-                launch {
+                launch("$TAG#viewModel.currentClock") {
                     if (!MigrateClocksToBlueprint.isEnabled) return@launch
                     viewModel.currentClock.collect { currentClock ->
                         cleanupClockViews(currentClock, keyguardRootView, viewModel.burnInLayer)
@@ -67,14 +65,14 @@
                         applyConstraints(clockSection, keyguardRootView, true)
                     }
                 }
-                launch {
+                launch("$TAG#viewModel.clockSize") {
                     if (!MigrateClocksToBlueprint.isEnabled) return@launch
                     viewModel.clockSize.collect {
                         updateBurnInLayer(keyguardRootView, viewModel)
                         blueprintInteractor.refreshBlueprint(Type.ClockSize)
                     }
                 }
-                launch {
+                launch("$TAG#viewModel.clockShouldBeCentered") {
                     if (!MigrateClocksToBlueprint.isEnabled) return@launch
                     viewModel.clockShouldBeCentered.collect { clockShouldBeCentered ->
                         viewModel.currentClock.value?.let {
@@ -91,7 +89,7 @@
                         }
                     }
                 }
-                launch {
+                launch("$TAG#viewModel.isAodIconsVisible") {
                     if (!MigrateClocksToBlueprint.isEnabled) return@launch
                     viewModel.isAodIconsVisible.collect { isAodIconsVisible ->
                         viewModel.currentClock.value?.let {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissActionBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissActionBinder.kt
index d5add61..93b3ba5 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissActionBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissActionBinder.kt
@@ -19,9 +19,8 @@
 import com.android.systemui.CoreStartable
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.flags.FeatureFlagsClassic
-import com.android.systemui.flags.Flags
 import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor
+import com.android.systemui.keyguard.shared.RefactorKeyguardDismissIntent
 import com.android.systemui.log.core.LogLevel
 import com.android.systemui.util.kotlin.sample
 import javax.inject.Inject
@@ -38,11 +37,10 @@
     private val interactor: KeyguardDismissActionInteractor,
     @Application private val scope: CoroutineScope,
     private val keyguardLogger: KeyguardLogger,
-    private val featureFlags: FeatureFlagsClassic,
 ) : CoreStartable {
 
     override fun start() {
-        if (!featureFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+        if (!RefactorKeyguardDismissIntent.isEnabled) {
             return
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissBinder.kt
index 87d8164..f77d012 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissBinder.kt
@@ -21,8 +21,8 @@
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.flags.FeatureFlagsClassic
-import com.android.systemui.flags.Flags
 import com.android.systemui.keyguard.domain.interactor.KeyguardDismissInteractor
+import com.android.systemui.keyguard.shared.RefactorKeyguardDismissIntent
 import com.android.systemui.keyguard.shared.model.KeyguardDone
 import com.android.systemui.log.core.LogLevel
 import com.android.systemui.user.domain.interactor.SelectedUserInteractor
@@ -44,7 +44,7 @@
 ) : CoreStartable {
 
     override fun start() {
-        if (!featureFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+        if (!RefactorKeyguardDismissIntent.isEnabled) {
             return
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
index 267d68e..23c2491 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
@@ -22,6 +22,7 @@
 import android.widget.TextView
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.keyguard.KeyguardBottomAreaRefactor
 import com.android.systemui.keyguard.MigrateClocksToBlueprint
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardIndicationAreaViewModel
@@ -34,7 +35,6 @@
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.launch
 
 /**
  * Binds a keyguard indication area view to its view-model.
@@ -66,7 +66,7 @@
         val disposableHandle =
             view.repeatWhenAttached {
                 repeatOnLifecycle(Lifecycle.State.STARTED) {
-                    launch {
+                    launch("$TAG#viewModel.alpha") {
                         // Do not independently apply alpha, as [KeyguardRootViewModel] should work
                         // for this and all its children
                         if (
@@ -77,13 +77,13 @@
                         }
                     }
 
-                    launch {
+                    launch("$TAG#viewModel.indicationAreaTranslationX") {
                         viewModel.indicationAreaTranslationX.collect { translationX ->
                             view.translationX = translationX
                         }
                     }
 
-                    launch {
+                    launch("$TAG#viewModel.isIndicationAreaPadded") {
                         combine(
                                 viewModel.isIndicationAreaPadded,
                                 configurationBasedDimensions.map { it.indicationAreaPaddingPx },
@@ -97,7 +97,7 @@
                             .collect { paddingPx -> view.setPadding(paddingPx, 0, paddingPx, 0) }
                     }
 
-                    launch {
+                    launch("$TAG#viewModel.indicationAreaTranslationY") {
                         configurationBasedDimensions
                             .map { it.defaultBurnInPreventionYOffsetPx }
                             .flatMapLatest { defaultBurnInOffsetY ->
@@ -106,7 +106,7 @@
                             .collect { translationY -> view.translationY = translationY }
                     }
 
-                    launch {
+                    launch("$TAG#indicationText.setTextSize") {
                         configurationBasedDimensions.collect { dimensions ->
                             indicationText.setTextSize(
                                 TypedValue.COMPLEX_UNIT_PX,
@@ -119,7 +119,7 @@
                         }
                     }
 
-                    launch {
+                    launch("$TAG#viewModel.configurationChange") {
                         viewModel.configurationChange.collect {
                             configurationBasedDimensions.value = loadFromResources(view)
                         }
@@ -147,4 +147,6 @@
         val indicationAreaPaddingPx: Int,
         val indicationTextSizePx: Int,
     )
+
+    private const val TAG = "KeyguardIndicationAreaBinder"
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt
index 9cc503c..09fe067 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt
@@ -20,11 +20,11 @@
 import android.view.View
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.common.ui.view.LongPressHandlingView
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel
 import com.android.systemui.lifecycle.repeatWhenAttached
 import com.android.systemui.plugins.FalsingManager
-import kotlinx.coroutines.launch
 
 object KeyguardLongPressViewBinder {
     /**
@@ -64,7 +64,7 @@
 
         view.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.STARTED) {
-                launch {
+                launch("$TAG#viewModel.isLongPressHandlingEnabled") {
                     viewModel.isLongPressHandlingEnabled.collect { isEnabled ->
                         view.setLongPressHandlingEnabled(isEnabled)
                     }
@@ -72,4 +72,6 @@
             }
         }
     }
+
+    private const val TAG = "KeyguardLongPressViewBinder"
 }
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 d9f12c3..486320a 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
@@ -18,6 +18,7 @@
 package com.android.systemui.keyguard.ui.binder
 
 import android.content.Context
+import android.util.DisplayMetrics
 import android.view.View
 import android.view.View.INVISIBLE
 import android.view.View.VISIBLE
@@ -32,6 +33,8 @@
 import androidx.core.view.isVisible
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
+import com.android.internal.policy.SystemBarUtils
 import com.android.systemui.customization.R as customizationR
 import com.android.systemui.keyguard.shared.model.SettingsClockSize
 import com.android.systemui.keyguard.ui.preview.KeyguardPreviewRenderer
@@ -43,7 +46,6 @@
 import com.android.systemui.res.R
 import com.android.systemui.util.Utils
 import kotlin.reflect.KSuspendFunction1
-import kotlinx.coroutines.launch
 
 /** Binder for the small clock view, large clock view. */
 object KeyguardPreviewClockViewBinder {
@@ -55,13 +57,17 @@
     ) {
         largeClockHostView.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.STARTED) {
-                viewModel.isLargeClockVisible.collect { largeClockHostView.isVisible = it }
+                launch("$TAG#viewModel.isLargeClockVisible") {
+                    viewModel.isLargeClockVisible.collect { largeClockHostView.isVisible = it }
+                }
             }
         }
 
         smallClockHostView.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.STARTED) {
-                viewModel.isSmallClockVisible.collect { smallClockHostView.isVisible = it }
+                launch("$TAG#viewModel.isSmallClockVisible") {
+                    viewModel.isSmallClockVisible.collect { smallClockHostView.isVisible = it }
+                }
             }
         }
     }
@@ -75,7 +81,7 @@
     ) {
         rootView.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.STARTED) {
-                launch {
+                launch("$TAG#viewModel.previewClock") {
                     var lastClock: ClockController? = null
                     viewModel.previewClock.collect { currentClock ->
                         lastClock?.let { clock ->
@@ -109,9 +115,9 @@
     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.WRAP_CONTENT)
+            constrainHeight(R.id.lockscreen_clock_view_large, ConstraintSet.MATCH_CONSTRAINT)
             val largeClockTopMargin =
-                context.resources.getDimensionPixelSize(R.dimen.status_bar_height) +
+                SystemBarUtils.getStatusBarHeight(context) +
                     context.resources.getDimensionPixelSize(
                         customizationR.dimen.small_clock_padding_top
                     ) +
@@ -129,7 +135,29 @@
                 ConstraintSet.END
             )
 
-            connect(R.id.lockscreen_clock_view_large, BOTTOM, R.id.lock_icon_view, TOP)
+            // In preview, we'll show UDFPS icon for UDFPS devices
+            // and nothing for non-UDFPS devices,
+            // but we need position of device entry icon to constrain clock
+            if (getConstraint(R.id.lock_icon_view) != null) {
+                connect(R.id.lockscreen_clock_view_large, BOTTOM, R.id.lock_icon_view, TOP)
+            } else {
+                // Copied calculation codes from applyConstraints in DefaultDeviceEntrySection
+                val bottomPaddingPx =
+                    context.resources.getDimensionPixelSize(R.dimen.lock_icon_margin_bottom)
+                val defaultDensity =
+                    DisplayMetrics.DENSITY_DEVICE_STABLE.toFloat() /
+                        DisplayMetrics.DENSITY_DEFAULT.toFloat()
+                val lockIconRadiusPx = (defaultDensity * 36).toInt()
+                val clockBottomMargin = bottomPaddingPx + 2 * lockIconRadiusPx
+                connect(
+                    R.id.lockscreen_clock_view_large,
+                    BOTTOM,
+                    PARENT_ID,
+                    BOTTOM,
+                    clockBottomMargin
+                )
+            }
+
             constrainWidth(R.id.lockscreen_clock_view, WRAP_CONTENT)
             constrainHeight(
                 R.id.lockscreen_clock_view,
@@ -184,4 +212,5 @@
 
     private const val DATE_WEATHER_VIEW_HEIGHT = "date_weather_view_height"
     private const val ENHANCED_SMARTSPACE_HEIGHT = "enhanced_smartspace_height"
+    private const val TAG = "KeyguardPreviewClockViewBinder"
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewSmartspaceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewSmartspaceViewBinder.kt
index f5e4c6a..88d9074 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewSmartspaceViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewSmartspaceViewBinder.kt
@@ -17,27 +17,49 @@
 
 package com.android.systemui.keyguard.ui.binder
 
+import android.content.Context
 import android.view.View
 import androidx.core.view.isInvisible
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
+import com.android.systemui.keyguard.shared.model.SettingsClockSize
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardPreviewSmartspaceViewModel
 import com.android.systemui.lifecycle.repeatWhenAttached
-import kotlinx.coroutines.launch
 
 /** Binder for the small clock view, large clock view and smartspace. */
 object KeyguardPreviewSmartspaceViewBinder {
 
     @JvmStatic
     fun bind(
+        previewContext: Context,
         smartspace: View,
+        splitShadePreview: Boolean,
         viewModel: KeyguardPreviewSmartspaceViewModel,
     ) {
         smartspace.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.STARTED) {
-                launch { viewModel.smartspaceTopPadding.collect { smartspace.setTopPadding(it) } }
-
-                launch { viewModel.shouldHideSmartspace.collect { smartspace.isInvisible = it } }
+                launch("$TAG#viewModel.selectedClockSize") {
+                    viewModel.selectedClockSize.collect {
+                        val topPadding =
+                            when (it) {
+                                SettingsClockSize.DYNAMIC ->
+                                    viewModel.getLargeClockSmartspaceTopPadding(
+                                        splitShadePreview,
+                                        previewContext,
+                                    )
+                                SettingsClockSize.SMALL ->
+                                    viewModel.getSmallClockSmartspaceTopPadding(
+                                        splitShadePreview,
+                                        previewContext,
+                                    )
+                            }
+                        smartspace.setTopPadding(topPadding)
+                    }
+                }
+                launch("$TAG#viewModel.shouldHideSmartspace") {
+                    viewModel.shouldHideSmartspace.collect { smartspace.isInvisible = it }
+                }
             }
         }
     }
@@ -45,4 +67,6 @@
     private fun View.setTopPadding(padding: Int) {
         setPaddingRelative(paddingStart, padding, paddingEnd, paddingBottom)
     }
+
+    private const val TAG = "KeyguardPreviewSmartspaceViewBinder"
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
index abd79ab..6c21e6c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
@@ -30,6 +30,7 @@
 import androidx.core.view.updateLayoutParams
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.settingslib.Utils
 import com.android.systemui.animation.Expandable
 import com.android.systemui.animation.view.LaunchableImageView
@@ -41,11 +42,11 @@
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.VibratorHelper
 import com.android.systemui.util.doOnEnd
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.launch
 
 /** This is only for a SINGLE Quick affordance */
 object KeyguardQuickAffordanceViewBinder {
@@ -53,6 +54,7 @@
     private const val EXIT_DOZE_BUTTON_REVEAL_ANIMATION_DURATION_MS = 250L
     private const val SCALE_SELECTED_BUTTON = 1.23f
     private const val DIM_ALPHA = 0.3f
+    private const val TAG = "KeyguardQuickAffordanceViewBinder"
 
     /**
      * Defines interface for an object that acts as the binding between the view and its view-model.
@@ -74,14 +76,15 @@
         alpha: Flow<Float>,
         falsingManager: FalsingManager?,
         vibratorHelper: VibratorHelper?,
+        mainImmediateDispatcher: CoroutineDispatcher,
         messageDisplayer: (Int) -> Unit,
     ): Binding {
         val button = view as ImageView
         val configurationBasedDimensions = MutableStateFlow(loadFromResources(view))
         val disposableHandle =
-            view.repeatWhenAttached {
+            view.repeatWhenAttached(mainImmediateDispatcher) {
                 repeatOnLifecycle(Lifecycle.State.STARTED) {
-                    launch {
+                    launch("$TAG#viewModel.collect") {
                         viewModel.collect { buttonModel ->
                             updateButton(
                                 view = button,
@@ -93,7 +96,7 @@
                         }
                     }
 
-                    launch {
+                    launch("$TAG#updateButtonAlpha") {
                         updateButtonAlpha(
                             view = button,
                             viewModel = viewModel,
@@ -101,7 +104,7 @@
                         )
                     }
 
-                    launch {
+                    launch("$TAG#configurationBasedDimensions") {
                         configurationBasedDimensions.collect { dimensions ->
                             button.updateLayoutParams<ViewGroup.LayoutParams> {
                                 width = dimensions.buttonSizePx.width
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
index 0ed42ef..44fd582 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
@@ -33,18 +33,23 @@
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
 import com.android.app.animation.Interpolators
+import com.android.app.tracing.coroutines.launch
 import com.android.internal.jank.InteractionJankMonitor
 import com.android.internal.jank.InteractionJankMonitor.CUJ_SCREEN_OFF_SHOW_AOD
-import com.android.keyguard.KeyguardClockSwitch.MISSING_CLOCK_ID
 import com.android.systemui.Flags.newAodTransition
 import com.android.systemui.common.shared.model.Icon
 import com.android.systemui.common.shared.model.Text
 import com.android.systemui.common.shared.model.TintedIcon
 import com.android.systemui.common.ui.ConfigurationState
+import com.android.systemui.common.ui.view.onApplyWindowInsets
+import com.android.systemui.common.ui.view.onLayoutChanged
+import com.android.systemui.common.ui.view.onTouchListener
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryHapticsInteractor
 import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
 import com.android.systemui.keyguard.KeyguardBottomAreaRefactor
+import com.android.systemui.keyguard.KeyguardViewMediator
 import com.android.systemui.keyguard.MigrateClocksToBlueprint
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters
@@ -53,7 +58,6 @@
 import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor
 import com.android.systemui.lifecycle.repeatWhenAttached
 import com.android.systemui.plugins.FalsingManager
-import com.android.systemui.plugins.clocks.ClockController
 import com.android.systemui.res.R
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.statusbar.CrossFadeHelper
@@ -63,12 +67,13 @@
 import com.android.systemui.temporarydisplay.ViewPriority
 import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator
 import com.android.systemui.temporarydisplay.chipbar.ChipbarInfo
+import com.android.systemui.util.kotlin.DisposableHandles
 import com.android.systemui.util.ui.AnimatedValue
 import com.android.systemui.util.ui.isAnimating
 import com.android.systemui.util.ui.stopAnimating
 import com.android.systemui.util.ui.value
-import javax.inject.Provider
 import kotlin.math.min
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.DisposableHandle
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.coroutineScope
@@ -76,12 +81,10 @@
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.flow.update
-import kotlinx.coroutines.launch
 
 /** Bind occludingAppDeviceEntryMessageViewModel to run whenever the keyguard view is attached. */
 @OptIn(ExperimentalCoroutinesApi::class)
 object KeyguardRootViewBinder {
-
     @SuppressLint("ClickableViewAccessibility")
     @JvmStatic
     fun bind(
@@ -92,30 +95,27 @@
         chipbarCoordinator: ChipbarCoordinator,
         screenOffAnimationController: ScreenOffAnimationController,
         shadeInteractor: ShadeInteractor,
-        clockControllerProvider: Provider<ClockController>?,
+        clockInteractor: KeyguardClockInteractor,
         interactionJankMonitor: InteractionJankMonitor?,
         deviceEntryHapticsInteractor: DeviceEntryHapticsInteractor?,
         vibratorHelper: VibratorHelper?,
         falsingManager: FalsingManager?,
+        keyguardViewMediator: KeyguardViewMediator?,
+        mainImmediateDispatcher: CoroutineDispatcher,
     ): DisposableHandle {
-        var onLayoutChangeListener: OnLayoutChange? = null
+        val disposables = DisposableHandles()
         val childViews = mutableMapOf<Int, View>()
-        val statusViewId = R.id.keyguard_status_view
-        val burnInLayerId = R.id.burn_in_layer
-        val aodNotificationIconContainerId = R.id.aod_notification_icon_container
-        val largeClockId = R.id.lockscreen_clock_view_large
-        val indicationArea = R.id.keyguard_indication_area
-        val startButton = R.id.start_button
-        val endButton = R.id.end_button
-        val lockIcon = R.id.lock_icon_view
 
         if (KeyguardBottomAreaRefactor.isEnabled) {
-            view.setOnTouchListener { _, event ->
-                if (falsingManager?.isFalseTap(FalsingManager.LOW_PENALTY) == false) {
-                    viewModel.setRootViewLastTapPosition(Point(event.x.toInt(), event.y.toInt()))
+            disposables +=
+                view.onTouchListener { _, event ->
+                    if (falsingManager?.isFalseTap(FalsingManager.LOW_PENALTY) == false) {
+                        viewModel.setRootViewLastTapPosition(
+                            Point(event.x.toInt(), event.y.toInt())
+                        )
+                    }
+                    false
                 }
-                false
-            }
         }
 
         val burnInParams = MutableStateFlow(BurnInParameters())
@@ -124,10 +124,10 @@
                 alpha = { view.alpha },
             )
 
-        val disposableHandle =
-            view.repeatWhenAttached {
+        disposables +=
+            view.repeatWhenAttached(mainImmediateDispatcher) {
                 repeatOnLifecycle(Lifecycle.State.CREATED) {
-                    launch {
+                    launch("$TAG#occludingAppDeviceEntryMessageViewModel.message") {
                         occludingAppDeviceEntryMessageViewModel.message.collect { biometricMessage
                             ->
                             if (biometricMessage?.message != null) {
@@ -146,7 +146,7 @@
                     if (
                         KeyguardBottomAreaRefactor.isEnabled || DeviceEntryUdfpsRefactor.isEnabled
                     ) {
-                        launch {
+                        launch("$TAG#viewModel.alpha") {
                             viewModel.alpha(viewState).collect { alpha ->
                                 view.alpha = alpha
                                 if (KeyguardBottomAreaRefactor.isEnabled) {
@@ -158,21 +158,21 @@
                     }
 
                     if (MigrateClocksToBlueprint.isEnabled) {
-                        launch {
+                        launch("$TAG#viewModel.burnInLayerVisibility") {
                             viewModel.burnInLayerVisibility.collect { visibility ->
                                 childViews[burnInLayerId]?.visibility = visibility
                                 childViews[aodNotificationIconContainerId]?.visibility = visibility
                             }
                         }
 
-                        launch {
+                        launch("$TAG#viewModel.burnInLayerAlpha") {
                             viewModel.burnInLayerAlpha.collect { alpha ->
                                 childViews[statusViewId]?.alpha = alpha
                                 childViews[aodNotificationIconContainerId]?.alpha = alpha
                             }
                         }
 
-                        launch {
+                        launch("$TAG#viewModel.topClippingBounds") {
                             val clipBounds = Rect()
                             viewModel.topClippingBounds.collect { clipTop ->
                                 if (clipTop == null) {
@@ -189,13 +189,13 @@
                             }
                         }
 
-                        launch {
+                        launch("$TAG#viewModel.lockscreenStateAlpha") {
                             viewModel.lockscreenStateAlpha(viewState).collect { alpha ->
                                 childViews[statusViewId]?.alpha = alpha
                             }
                         }
 
-                        launch {
+                        launch("$TAG#viewModel.translationY") {
                             // When translation happens in burnInLayer, it won't be weather clock
                             // large clock isn't added to burnInLayer due to its scale transition
                             // so we also need to add translation to it here
@@ -207,12 +207,12 @@
                             }
                         }
 
-                        launch {
+                        launch("$TAG#viewModel.translationX") {
                             viewModel.translationX.collect { state ->
                                 val px = state.value ?: return@collect
                                 when {
                                     state.isToOrFrom(KeyguardState.AOD) -> {
-                                        childViews[largeClockId]?.translationX = px
+                                        // Large Clock is not translated in the x direction
                                         childViews[burnInLayerId]?.translationX = px
                                         childViews[aodNotificationIconContainerId]?.translationX =
                                             px
@@ -234,7 +234,7 @@
                             }
                         }
 
-                        launch {
+                        launch("$TAG#viewModel.scale") {
                             viewModel.scale.collect { scaleViewModel ->
                                 if (scaleViewModel.scaleClockOnly) {
                                     // For clocks except weather clock, we have scale transition
@@ -265,7 +265,7 @@
                         }
 
                         if (NotificationIconContainerRefactor.isEnabled) {
-                            launch {
+                            launch("$TAG#viewModel.isNotifIconContainerVisible") {
                                 val iconsAppearTranslationPx =
                                     configuration
                                         .getDimensionPixelSize(R.dimen.shelf_appear_translation)
@@ -282,24 +282,25 @@
                         }
 
                         interactionJankMonitor?.let { jankMonitor ->
-                            launch {
+                            launch("$TAG#viewModel.goneToAodTransition") {
                                 viewModel.goneToAodTransition.collect {
                                     when (it.transitionState) {
                                         TransitionState.STARTED -> {
-                                            val clockId =
-                                                clockControllerProvider?.get()?.config?.id
-                                                    ?: MISSING_CLOCK_ID
+                                            val clockId = clockInteractor.renderedClockId
                                             val builder =
                                                 InteractionJankMonitor.Configuration.Builder
                                                     .withView(CUJ_SCREEN_OFF_SHOW_AOD, view)
                                                     .setTag(clockId)
-
                                             jankMonitor.begin(builder)
                                         }
                                         TransitionState.CANCELED ->
                                             jankMonitor.cancel(CUJ_SCREEN_OFF_SHOW_AOD)
-                                        TransitionState.FINISHED ->
+                                        TransitionState.FINISHED -> {
+                                            if (MigrateClocksToBlueprint.isEnabled) {
+                                                keyguardViewMediator?.maybeHandlePendingLock()
+                                            }
                                             jankMonitor.end(CUJ_SCREEN_OFF_SHOW_AOD)
+                                        }
                                         TransitionState.RUNNING -> Unit
                                     }
                                 }
@@ -307,7 +308,7 @@
                         }
                     }
 
-                    launch {
+                    launch("$TAG#shadeInteractor.isAnyFullyExpanded") {
                         shadeInteractor.isAnyFullyExpanded.collect { isFullyAnyExpanded ->
                             view.visibility =
                                 if (isFullyAnyExpanded) {
@@ -318,10 +319,12 @@
                         }
                     }
 
-                    launch { burnInParams.collect { viewModel.updateBurnInParams(it) } }
+                    launch("$TAG#burnInParams.collect") {
+                        burnInParams.collect { viewModel.updateBurnInParams(it) }
+                    }
 
                     if (deviceEntryHapticsInteractor != null && vibratorHelper != null) {
-                        launch {
+                        launch("$TAG#deviceEntryHapticsInteractor.playSuccessHaptic") {
                             deviceEntryHapticsInteractor.playSuccessHaptic.collect {
                                 vibratorHelper.performHapticFeedback(
                                     view,
@@ -331,7 +334,7 @@
                             }
                         }
 
-                        launch {
+                        launch("$TAG#deviceEntryHapticsInteractor.playErrorHaptic") {
                             deviceEntryHapticsInteractor.playErrorHaptic.collect {
                                 vibratorHelper.performHapticFeedback(
                                     view,
@@ -344,20 +347,13 @@
                 }
             }
 
-        if (!MigrateClocksToBlueprint.isEnabled) {
-            burnInParams.update { current ->
-                current.copy(clockControllerProvider = clockControllerProvider)
-            }
-        }
-
         if (MigrateClocksToBlueprint.isEnabled) {
             burnInParams.update { current ->
                 current.copy(translationY = { childViews[burnInLayerId]?.translationY })
             }
         }
 
-        onLayoutChangeListener = OnLayoutChange(viewModel, childViews, burnInParams)
-        view.addOnLayoutChangeListener(onLayoutChangeListener)
+        disposables += view.onLayoutChanged(OnLayoutChange(viewModel, childViews, burnInParams))
 
         // Views will be added or removed after the call to bind(). This is needed to avoid many
         // calls to findViewById
@@ -372,24 +368,21 @@
                 }
             }
         )
-
-        view.setOnApplyWindowInsetsListener { v: View, insets: WindowInsets ->
-            val insetTypes = WindowInsets.Type.systemBars() or WindowInsets.Type.displayCutout()
-            burnInParams.update { current ->
-                current.copy(topInset = insets.getInsetsIgnoringVisibility(insetTypes).top)
-            }
-            insets
+        disposables += DisposableHandle {
+            view.setOnHierarchyChangeListener(null)
+            childViews.clear()
         }
 
-        return object : DisposableHandle {
-            override fun dispose() {
-                disposableHandle.dispose()
-                view.removeOnLayoutChangeListener(onLayoutChangeListener)
-                view.setOnHierarchyChangeListener(null)
-                view.setOnApplyWindowInsetsListener(null)
-                childViews.clear()
+        disposables +=
+            view.onApplyWindowInsets { _: View, insets: WindowInsets ->
+                val insetTypes = WindowInsets.Type.systemBars() or WindowInsets.Type.displayCutout()
+                burnInParams.update { current ->
+                    current.copy(topInset = insets.getInsetsIgnoringVisibility(insetTypes).top)
+                }
+                insets
             }
-        }
+
+        return disposables
     }
 
     /**
@@ -430,7 +423,7 @@
             oldRight: Int,
             oldBottom: Int
         ) {
-            childViews[R.id.nssl_placeholder]?.let { notificationListPlaceholder ->
+            childViews[nsslPlaceholderId]?.let { notificationListPlaceholder ->
                 // After layout, ensure the notifications are positioned correctly
                 viewModel.onNotificationContainerBoundsChanged(
                     notificationListPlaceholder.top.toFloat(),
@@ -454,14 +447,14 @@
                                 )
                             }
                         } else {
-                            childViews[R.id.keyguard_status_view]?.top ?: 0
+                            childViews[statusViewId]?.top ?: 0
                         }
                 )
             }
         }
 
         private fun isUserVisible(view: View): Boolean {
-            return view.id != R.id.burn_in_layer &&
+            return view.id != burnInLayerId &&
                 view.visibility == VISIBLE &&
                 view.width > 0 &&
                 view.height > 0
@@ -583,6 +576,18 @@
     private fun ViewPropertyAnimator.animateInIconTranslation(): ViewPropertyAnimator =
         setInterpolator(Interpolators.DECELERATE_QUINT).translationY(0f)
 
+    private val statusViewId = R.id.keyguard_status_view
+    private val burnInLayerId = R.id.burn_in_layer
+    private val aodNotificationIconContainerId = R.id.aod_notification_icon_container
+    private val largeClockId = R.id.lockscreen_clock_view_large
+    private val smallClockId = R.id.lockscreen_clock_view
+    private val indicationArea = R.id.keyguard_indication_area
+    private val startButton = R.id.start_button
+    private val endButton = R.id.end_button
+    private val lockIcon = R.id.lock_icon_view
+    private val nsslPlaceholderId = R.id.nssl_placeholder
+
     private const val ID = "occluding_app_device_entry_unlock_msg"
     private const val AOD_ICONS_APPEAR_DURATION: Long = 200
+    private const val TAG = "KeyguardRootViewBinder"
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt
index b1adef4..fa57565 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt
@@ -22,6 +22,7 @@
 import androidx.core.view.isVisible
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.animation.ActivityTransitionAnimator
 import com.android.systemui.common.ui.binder.IconViewBinder
 import com.android.systemui.common.ui.binder.TextViewBinder
@@ -38,7 +39,6 @@
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.filterNotNull
-import kotlinx.coroutines.launch
 
 object KeyguardSettingsViewBinder {
     fun bind(
@@ -52,7 +52,7 @@
         val disposableHandle =
             view.repeatWhenAttached {
                 repeatOnLifecycle(Lifecycle.State.STARTED) {
-                    launch {
+                    launch("$TAG#viewModel.isVisible") {
                         viewModel.isVisible.distinctUntilChanged().collect { isVisible ->
                             view.animateVisibility(visible = isVisible)
                             if (isVisible) {
@@ -78,7 +78,7 @@
                     // shows up in the Wallpaper Picker app. If we do that, then the
                     // settings menu should never be visible.
                     if (activityStarter != null) {
-                        launch {
+                        launch("$TAG#viewModel.shouldOpenSettings") {
                             viewModel.shouldOpenSettings
                                 .filter { it }
                                 .collect {
@@ -91,7 +91,7 @@
                         }
                     }
 
-                    launch {
+                    launch("$TAG#rootViewModel?.lastRootViewTapPosition") {
                         rootViewModel?.lastRootViewTapPosition?.filterNotNull()?.collect { point ->
                             if (view.isVisible) {
                                 val hitRect = Rect()
@@ -136,4 +136,6 @@
             }
             .start()
     }
+
+    private const val TAG = "KeyguardSettingsViewBinder"
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
index 9aebf66..6b11dc5 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
@@ -21,6 +21,7 @@
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.keyguard.MigrateClocksToBlueprint
 import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
 import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Config
@@ -30,7 +31,6 @@
 import com.android.systemui.lifecycle.repeatWhenAttached
 import com.android.systemui.res.R
 import com.android.systemui.shared.R as sharedR
-import kotlinx.coroutines.launch
 
 object KeyguardSmartspaceViewBinder {
     @JvmStatic
@@ -42,7 +42,7 @@
     ) {
         keyguardRootView.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.CREATED) {
-                launch {
+                launch("$TAG#clockViewModel.hasCustomWeatherDataDisplay") {
                     if (!MigrateClocksToBlueprint.isEnabled) return@launch
                     clockViewModel.hasCustomWeatherDataDisplay.collect { hasCustomWeatherDataDisplay
                         ->
@@ -61,7 +61,7 @@
                     }
                 }
 
-                launch {
+                launch("$TAG#smartspaceViewModel.bcSmartspaceVisibility") {
                     if (!MigrateClocksToBlueprint.isEnabled) return@launch
                     smartspaceViewModel.bcSmartspaceVisibility.collect {
                         updateBCSmartspaceInBurnInLayer(keyguardRootView, clockViewModel)
@@ -148,4 +148,6 @@
             }
         }
     }
+
+    private const val TAG = "KeyguardSmartspaceViewBinder"
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSurfaceBehindViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSurfaceBehindViewBinder.kt
index 599f69f..fd27dc3 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSurfaceBehindViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSurfaceBehindViewBinder.kt
@@ -16,10 +16,10 @@
 
 package com.android.systemui.keyguard.ui.binder
 
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.keyguard.WindowManagerLockscreenVisibilityManager
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardSurfaceBehindViewModel
 import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
 
 /**
  * Binds the [WindowManagerLockscreenVisibilityManager] "view", which manages the visibility of the
@@ -32,6 +32,10 @@
         applier: KeyguardSurfaceBehindParamsApplier,
         scope: CoroutineScope
     ) {
-        scope.launch { viewModel.surfaceBehindViewParams.collect { applier.viewParams = it } }
+        scope.launch("$TAG#viewModel.surfaceBehindViewParams") {
+            viewModel.surfaceBehindViewParams.collect { applier.viewParams = it }
+        }
     }
+
+    private const val TAG = "KeyguardSurfaceBehindViewBinder"
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/LightRevealScrimViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/LightRevealScrimViewBinder.kt
index f1da882..b2ee689 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/LightRevealScrimViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/LightRevealScrimViewBinder.kt
@@ -18,6 +18,7 @@
 
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.keyguard.ui.viewmodel.LightRevealScrimViewModel
 import com.android.systemui.lifecycle.repeatWhenAttached
 import com.android.systemui.statusbar.LightRevealScrim
@@ -28,11 +29,11 @@
     fun bind(revealScrim: LightRevealScrim, viewModel: LightRevealScrimViewModel) {
         revealScrim.repeatWhenAttached {
             repeatOnLifecycle(Lifecycle.State.CREATED) {
-                launch {
+                launch("$TAG#viewModel.revealAmount") {
                     viewModel.revealAmount.collect { amount -> revealScrim.revealAmount = amount }
                 }
 
-                launch {
+                launch("$TAG#viewModel.lightRevealEffect") {
                     viewModel.lightRevealEffect.collect { effect ->
                         revealScrim.revealEffect = effect
                     }
@@ -40,4 +41,6 @@
             }
         }
     }
+
+    private const val TAG = "LightRevealScrimViewBinder"
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityViewBinder.kt
index fc0c78a..ae46dd3 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityViewBinder.kt
@@ -16,39 +16,41 @@
 
 package com.android.systemui.keyguard.ui.binder
 
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.keyguard.WindowManagerLockscreenVisibilityManager
 import com.android.systemui.keyguard.ui.viewmodel.WindowManagerLockscreenVisibilityViewModel
 import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
 
 /**
  * Binds the [WindowManagerLockscreenVisibilityManager] "view", which manages the visibility of the
  * surface behind the keyguard.
  */
 object WindowManagerLockscreenVisibilityViewBinder {
+    private const val TAG = "WindowManagerLockscreenVisibilityViewBinder"
+
     @JvmStatic
     fun bind(
         viewModel: WindowManagerLockscreenVisibilityViewModel,
         lockscreenVisibilityManager: WindowManagerLockscreenVisibilityManager,
         scope: CoroutineScope
     ) {
-        scope.launch {
+        scope.launch("$TAG#viewModel.surfaceBehindVisibility") {
             viewModel.surfaceBehindVisibility.collect {
                 lockscreenVisibilityManager.setSurfaceBehindVisibility(it)
             }
         }
 
-        scope.launch {
+        scope.launch("$TAG#viewModel.lockscreenVisibility") {
             viewModel.lockscreenVisibility.collect {
                 lockscreenVisibilityManager.setLockscreenShown(it)
             }
         }
 
-        scope.launch {
+        scope.launch("$TAG#viewModel.aodVisibility") {
             viewModel.aodVisibility.collect { lockscreenVisibilityManager.setAodVisible(it) }
         }
 
-        scope.launch {
+        scope.launch("$TAG#viewModel.surfaceBehindAnimating") {
             viewModel.surfaceBehindAnimating.collect {
                 lockscreenVisibilityManager.setUsingGoingAwayRemoteAnimation(it)
             }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
index 14ab17f..40ea445 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
@@ -46,8 +46,8 @@
 import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
 import androidx.constraintlayout.widget.ConstraintSet.START
 import androidx.constraintlayout.widget.ConstraintSet.TOP
-import androidx.constraintlayout.widget.ConstraintSet.WRAP_CONTENT
 import androidx.core.view.isInvisible
+import com.android.internal.policy.SystemBarUtils
 import com.android.keyguard.ClockEventController
 import com.android.keyguard.KeyguardClockSwitch
 import com.android.systemui.animation.view.LaunchableImageView
@@ -61,6 +61,7 @@
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.keyguard.KeyguardBottomAreaRefactor
 import com.android.systemui.keyguard.MigrateClocksToBlueprint
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
 import com.android.systemui.keyguard.ui.binder.KeyguardPreviewClockViewBinder
 import com.android.systemui.keyguard.ui.binder.KeyguardPreviewSmartspaceViewBinder
 import com.android.systemui.keyguard.ui.binder.KeyguardQuickAffordanceViewBinder
@@ -141,6 +142,7 @@
     private val secureSettings: SecureSettings,
     private val communalTutorialViewModel: CommunalTutorialIndicatorViewModel,
     private val defaultShortcutsSection: DefaultShortcutsSection,
+    private val keyguardClockInteractor: KeyguardClockInteractor,
 ) {
     val hostToken: IBinder? = bundle.getBinder(KEY_HOST_TOKEN)
     private val width: Int = bundle.getInt(KEY_VIEW_WIDTH)
@@ -325,13 +327,12 @@
         smartSpaceView = lockscreenSmartspaceController.buildAndConnectDateView(parentView)
 
         val topPadding: Int =
-            KeyguardPreviewSmartspaceViewModel.getLargeClockSmartspaceTopPadding(
-                previewContext.resources,
+            smartspaceViewModel.getLargeClockSmartspaceTopPadding(
+                previewInSplitShade(),
+                previewContext,
             )
-        val startPadding: Int =
-            previewContext.resources.getDimensionPixelSize(R.dimen.below_clock_padding_start)
-        val endPadding: Int =
-            previewContext.resources.getDimensionPixelSize(R.dimen.below_clock_padding_end)
+        val startPadding: Int = smartspaceViewModel.getSmartspaceStartPadding(previewContext)
+        val endPadding: Int = smartspaceViewModel.getSmartspaceEndPadding(previewContext)
 
         smartSpaceView?.let {
             it.setPaddingRelative(startPadding, topPadding, endPadding, 0)
@@ -369,6 +370,7 @@
             ),
         )
     }
+
     @OptIn(ExperimentalCoroutinesApi::class)
     private fun setupKeyguardRootView(previewContext: Context, rootView: FrameLayout) {
         val keyguardRootView = KeyguardRootView(previewContext, null)
@@ -382,11 +384,13 @@
                     chipbarCoordinator,
                     screenOffAnimationController,
                     shadeInteractor,
-                    null, // clock provider only needed for burn in
+                    keyguardClockInteractor,
                     null, // jank monitor not required for preview mode
                     null, // device entry haptics not required preview mode
                     null, // device entry haptics not required for preview mode
                     null, // falsing manager not required for preview mode
+                    null, // keyguard view mediator is not required for preview mode
+                    mainDispatcher,
                 )
         }
         rootView.addView(
@@ -410,7 +414,7 @@
             setUpClock(previewContext, rootView)
             if (MigrateClocksToBlueprint.isEnabled) {
                 KeyguardPreviewClockViewBinder.bind(
-                    context,
+                    previewContext,
                     keyguardRootView,
                     clockViewModel,
                     ::updateClockAppearance
@@ -425,7 +429,15 @@
         }
 
         setUpSmartspace(previewContext, rootView)
-        smartSpaceView?.let { KeyguardPreviewSmartspaceViewBinder.bind(it, smartspaceViewModel) }
+
+        smartSpaceView?.let {
+            KeyguardPreviewSmartspaceViewBinder.bind(
+                previewContext,
+                it,
+                previewInSplitShade(),
+                smartspaceViewModel
+            )
+        }
         setupCommunalTutorialIndicator(keyguardRootView)
     }
 
@@ -445,6 +457,7 @@
                     alpha = flowOf(1f),
                     falsingManager = falsingManager,
                     vibratorHelper = vibratorHelper,
+                    mainImmediateDispatcher = mainDispatcher,
                 ) { message ->
                     indicationController.showTransientIndication(message)
                 }
@@ -459,6 +472,7 @@
                     alpha = flowOf(1f),
                     falsingManager = falsingManager,
                     vibratorHelper = vibratorHelper,
+                    mainImmediateDispatcher = mainDispatcher,
                 ) { message ->
                     indicationController.showTransientIndication(message)
                 }
@@ -529,7 +543,7 @@
                     )
                 )
             layoutParams.topMargin =
-                KeyguardPreviewSmartspaceViewModel.getStatusBarHeight(resources) +
+                SystemBarUtils.getStatusBarHeight(previewContext) +
                     resources.getDimensionPixelSize(
                         com.android.systemui.customization.R.dimen.small_clock_padding_top
                     )
@@ -610,7 +624,9 @@
     }
 
     private suspend fun updateClockAppearance(clock: ClockController) {
-        clockController.clock = clock
+        if (!MigrateClocksToBlueprint.isEnabled) {
+            clockController.clock = clock
+        }
         val colors = wallpaperColors
         if (clockRegistry.seedColor == null && colors != null) {
             // Seed color null means users do not override any color on the clock. The default
@@ -628,6 +644,11 @@
                 if (isWallpaperDark) lightClockColor else darkClockColor
             )
         }
+        // In clock preview, we should have a seed color for clock
+        // before setting clock to clockEventController to avoid updateColor with seedColor == null
+        if (MigrateClocksToBlueprint.isEnabled) {
+            clockController.clock = clock
+        }
     }
     private fun onClockChanged() {
         if (MigrateClocksToBlueprint.isEnabled) {
@@ -704,6 +725,14 @@
         smallClockHostView.addView(clock.smallClock.view)
     }
 
+    /*
+     * When multi_crop_preview_ui_flag is on, we can preview portrait in split shadow direction
+     * or vice versa. So we need to decide preview direction by width and height
+     */
+    private fun previewInSplitShade(): Boolean {
+        return width > height
+    }
+
     companion object {
         private const val TAG = "KeyguardPreviewRenderer"
         private const val OVERLAY_CATEGORY_THEME_STYLE = "android.theme.customization.theme_style"
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AlignShortcutsToUdfpsSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AlignShortcutsToUdfpsSection.kt
index 2e96638..5404729 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AlignShortcutsToUdfpsSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AlignShortcutsToUdfpsSection.kt
@@ -36,6 +36,7 @@
 import com.android.systemui.statusbar.KeyguardIndicationController
 import com.android.systemui.statusbar.VibratorHelper
 import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
 
 class AlignShortcutsToUdfpsSection
 @Inject
@@ -47,6 +48,7 @@
     private val falsingManager: FalsingManager,
     private val indicationController: KeyguardIndicationController,
     private val vibratorHelper: VibratorHelper,
+    @Main private val mainImmediateDispatcher: CoroutineDispatcher,
 ) : BaseShortcutSection() {
     override fun addViews(constraintLayout: ConstraintLayout) {
         if (KeyguardBottomAreaRefactor.isEnabled) {
@@ -64,6 +66,7 @@
                     keyguardQuickAffordancesCombinedViewModel.transitionAlpha,
                     falsingManager,
                     vibratorHelper,
+                    mainImmediateDispatcher,
                 ) {
                     indicationController.showTransientIndication(it)
                 }
@@ -74,6 +77,7 @@
                     keyguardQuickAffordancesCombinedViewModel.transitionAlpha,
                     falsingManager,
                     vibratorHelper,
+                    mainImmediateDispatcher,
                 ) {
                     indicationController.showTransientIndication(it)
                 }
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 881467f..e0bf815 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
@@ -25,6 +25,7 @@
 import androidx.constraintlayout.widget.ConstraintSet.BOTTOM
 import androidx.constraintlayout.widget.ConstraintSet.END
 import androidx.constraintlayout.widget.ConstraintSet.GONE
+import androidx.constraintlayout.widget.ConstraintSet.MATCH_CONSTRAINT
 import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
 import androidx.constraintlayout.widget.ConstraintSet.START
 import androidx.constraintlayout.widget.ConstraintSet.TOP
@@ -42,10 +43,9 @@
 import com.android.systemui.plugins.clocks.ClockFaceLayout
 import com.android.systemui.res.R
 import com.android.systemui.shared.R as sharedR
-import com.android.systemui.statusbar.policy.SplitShadeStateController
-import com.android.systemui.util.Utils
 import dagger.Lazy
 import javax.inject.Inject
+import kotlinx.coroutines.DisposableHandle
 
 internal fun ConstraintSet.setVisibility(
     views: Iterable<View>,
@@ -63,23 +63,26 @@
     private val clockInteractor: KeyguardClockInteractor,
     protected val keyguardClockViewModel: KeyguardClockViewModel,
     private val context: Context,
-    private val splitShadeStateController: SplitShadeStateController,
     val smartspaceViewModel: KeyguardSmartspaceViewModel,
     val blueprintInteractor: Lazy<KeyguardBlueprintInteractor>,
 ) : KeyguardSection() {
+    private var handle: DisposableHandle? = null
+
     override fun addViews(constraintLayout: ConstraintLayout) {}
 
     override fun bindData(constraintLayout: ConstraintLayout) {
         if (!MigrateClocksToBlueprint.isEnabled) {
             return
         }
-        KeyguardClockViewBinder.bind(
-            this,
-            constraintLayout,
-            keyguardClockViewModel,
-            clockInteractor,
-            blueprintInteractor.get()
-        )
+        handle?.dispose()
+        handle =
+            KeyguardClockViewBinder.bind(
+                this,
+                constraintLayout,
+                keyguardClockViewModel,
+                clockInteractor,
+                blueprintInteractor.get()
+            )
     }
 
     override fun applyConstraints(constraintSet: ConstraintSet) {
@@ -91,7 +94,13 @@
         }
     }
 
-    override fun removeViews(constraintLayout: ConstraintLayout) {}
+    override fun removeViews(constraintLayout: ConstraintLayout) {
+        if (!MigrateClocksToBlueprint.isEnabled) {
+            return
+        }
+        handle?.dispose()
+        handle = null
+    }
 
     private fun buildConstraints(
         clock: ClockController,
@@ -160,19 +169,14 @@
         constraints.apply {
             connect(R.id.lockscreen_clock_view_large, START, PARENT_ID, START)
             connect(R.id.lockscreen_clock_view_large, END, guideline, END)
-            connect(R.id.lockscreen_clock_view_large, BOTTOM, R.id.lock_icon_view, TOP)
-            var largeClockTopMargin =
-                context.resources.getDimensionPixelSize(R.dimen.status_bar_height) +
-                    context.resources.getDimensionPixelSize(
-                        customizationR.dimen.small_clock_padding_top
-                    ) +
-                    context.resources.getDimensionPixelSize(R.dimen.keyguard_smartspace_top_offset)
+            connect(R.id.lockscreen_clock_view_large, BOTTOM, R.id.device_entry_icon_view, TOP)
+            var largeClockTopMargin = KeyguardClockViewModel.getLargeClockTopMargin(context)
             largeClockTopMargin += getDimen(DATE_WEATHER_VIEW_HEIGHT)
             largeClockTopMargin += getDimen(ENHANCED_SMARTSPACE_HEIGHT)
 
             connect(R.id.lockscreen_clock_view_large, TOP, PARENT_ID, TOP, largeClockTopMargin)
             constrainWidth(R.id.lockscreen_clock_view_large, WRAP_CONTENT)
-            constrainHeight(R.id.lockscreen_clock_view_large, WRAP_CONTENT)
+            constrainHeight(R.id.lockscreen_clock_view_large, MATCH_CONSTRAINT)
             constrainWidth(R.id.lockscreen_clock_view, WRAP_CONTENT)
             constrainHeight(
                 R.id.lockscreen_clock_view,
@@ -186,14 +190,7 @@
                 context.resources.getDimensionPixelSize(customizationR.dimen.clock_padding_start) +
                     context.resources.getDimensionPixelSize(R.dimen.status_view_margin_horizontal)
             )
-            val smallClockTopMargin =
-                if (splitShadeStateController.shouldUseSplitNotificationShade(context.resources)) {
-                    context.resources.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin)
-                } else {
-                    context.resources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin) +
-                        Utils.getStatusBarHeaderHeightKeyguard(context)
-                }
-
+            val smallClockTopMargin = keyguardClockViewModel.getSmallClockTopMargin(context)
             create(R.id.small_clock_guideline_top, ConstraintSet.HORIZONTAL_GUIDELINE)
             setGuidelineBegin(R.id.small_clock_guideline_top, smallClockTopMargin)
             connect(R.id.lockscreen_clock_view, TOP, R.id.small_clock_guideline_top, BOTTOM)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt
index 4c846e4..865e989 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt
@@ -30,10 +30,12 @@
 import com.android.keyguard.LockIconViewController
 import com.android.systemui.biometrics.AuthController
 import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
 import com.android.systemui.flags.FeatureFlags
 import com.android.systemui.flags.Flags
 import com.android.systemui.keyguard.KeyguardBottomAreaRefactor
+import com.android.systemui.keyguard.MigrateClocksToBlueprint
 import com.android.systemui.keyguard.shared.model.KeyguardSection
 import com.android.systemui.keyguard.ui.binder.DeviceEntryIconViewBinder
 import com.android.systemui.keyguard.ui.view.DeviceEntryIconView
@@ -46,6 +48,7 @@
 import com.android.systemui.statusbar.VibratorHelper
 import dagger.Lazy
 import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 
@@ -66,13 +69,14 @@
     private val deviceEntryBackgroundViewModel: Lazy<DeviceEntryBackgroundViewModel>,
     private val falsingManager: Lazy<FalsingManager>,
     private val vibratorHelper: Lazy<VibratorHelper>,
+    @Main private val mainImmediateDispatcher: CoroutineDispatcher,
 ) : KeyguardSection() {
     private val deviceEntryIconViewId = R.id.device_entry_icon_view
 
     override fun addViews(constraintLayout: ConstraintLayout) {
         if (
             !KeyguardBottomAreaRefactor.isEnabled &&
-                !DeviceEntryUdfpsRefactor.isEnabled &&
+                !MigrateClocksToBlueprint.isEnabled &&
                 !DeviceEntryUdfpsRefactor.isEnabled
         ) {
             return
@@ -103,6 +107,7 @@
                     deviceEntryBackgroundViewModel.get(),
                     falsingManager.get(),
                     vibratorHelper.get(),
+                    mainImmediateDispatcher,
                 )
             }
         } else {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultShortcutsSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultShortcutsSection.kt
index 45b8257..27ca5cd 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultShortcutsSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultShortcutsSection.kt
@@ -35,6 +35,7 @@
 import com.android.systemui.statusbar.KeyguardIndicationController
 import com.android.systemui.statusbar.VibratorHelper
 import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
 
 class DefaultShortcutsSection
 @Inject
@@ -46,6 +47,7 @@
     private val falsingManager: FalsingManager,
     private val indicationController: KeyguardIndicationController,
     private val vibratorHelper: VibratorHelper,
+    @Main private val mainImmediateDispatcher: CoroutineDispatcher,
 ) : BaseShortcutSection() {
     override fun addViews(constraintLayout: ConstraintLayout) {
         if (KeyguardBottomAreaRefactor.isEnabled) {
@@ -63,6 +65,7 @@
                     keyguardQuickAffordancesCombinedViewModel.transitionAlpha,
                     falsingManager,
                     vibratorHelper,
+                    mainImmediateDispatcher,
                 ) {
                     indicationController.showTransientIndication(it)
                 }
@@ -73,6 +76,7 @@
                     keyguardQuickAffordancesCombinedViewModel.transitionAlpha,
                     falsingManager,
                     vibratorHelper,
+                    mainImmediateDispatcher,
                 ) {
                     indicationController.showTransientIndication(it)
                 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/NotificationStackScrollLayoutSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/NotificationStackScrollLayoutSection.kt
index 2b601cd..edcf97a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/NotificationStackScrollLayoutSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/NotificationStackScrollLayoutSection.kt
@@ -25,7 +25,6 @@
 import androidx.constraintlayout.widget.ConstraintSet
 import androidx.constraintlayout.widget.ConstraintSet.BOTTOM
 import androidx.constraintlayout.widget.ConstraintSet.TOP
-import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
 import com.android.systemui.keyguard.MigrateClocksToBlueprint
 import com.android.systemui.keyguard.shared.model.KeyguardSection
 import com.android.systemui.res.R
@@ -51,21 +50,18 @@
      * indication area, whichever is higher.
      */
     protected fun addNotificationPlaceholderBarrier(constraintSet: ConstraintSet) {
-        val lockId =
-            if (DeviceEntryUdfpsRefactor.isEnabled) {
-                R.id.device_entry_icon_view
-            } else {
-                R.id.lock_icon_view
-            }
-
         constraintSet.apply {
             createBarrier(
                 R.id.nssl_placeholder_barrier_bottom,
                 Barrier.TOP,
                 0,
-                *intArrayOf(lockId, R.id.ambient_indication_container)
+                *intArrayOf(
+                    R.id.device_entry_icon_view,
+                    R.id.lock_icon_view,
+                    R.id.ambient_indication_container
+                )
             )
-            connect(R.id.nssl_placeholder, BOTTOM, R.id.nssl_placeholder_barrier_bottom, TOP)
+            connect(placeHolderId, BOTTOM, R.id.nssl_placeholder_barrier_bottom, TOP)
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt
index 1847d27..eaa5e33 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt
@@ -96,12 +96,8 @@
     override fun applyConstraints(constraintSet: ConstraintSet) {
         if (!MigrateClocksToBlueprint.isEnabled) return
         if (!keyguardSmartspaceViewModel.isSmartspaceEnabled) return
-        val horizontalPaddingStart =
-            context.resources.getDimensionPixelSize(R.dimen.below_clock_padding_start) +
-                context.resources.getDimensionPixelSize(R.dimen.status_view_margin_horizontal)
-        val horizontalPaddingEnd =
-            context.resources.getDimensionPixelSize(R.dimen.below_clock_padding_end) +
-                context.resources.getDimensionPixelSize(R.dimen.status_view_margin_horizontal)
+        val horizontalPaddingStart = KeyguardSmartspaceViewModel.getSmartspaceStartMargin(context)
+        val horizontalPaddingEnd = KeyguardSmartspaceViewModel.getSmartspaceEndMargin(context)
         constraintSet.apply {
             // migrate addDateWeatherView, addWeatherView from KeyguardClockSwitchController
             constrainHeight(sharedR.id.date_smartspace_view, ConstraintSet.WRAP_CONTENT)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerDependencies.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerDependencies.kt
index 065c20a..b432417 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerDependencies.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerDependencies.kt
@@ -18,7 +18,7 @@
 
 import com.android.systemui.deviceentry.ui.viewmodel.AlternateBouncerUdfpsAccessibilityOverlayViewModel
 import com.android.systemui.keyguard.ui.SwipeUpAnywhereGestureHandler
-import com.android.systemui.plugins.FalsingManager
+import com.android.systemui.power.domain.interactor.PowerInteractor
 import com.android.systemui.statusbar.gesture.TapGestureDetector
 import dagger.Lazy
 import javax.inject.Inject
@@ -30,11 +30,11 @@
 @Inject
 constructor(
     val viewModel: AlternateBouncerViewModel,
-    val falsingManager: FalsingManager,
     val swipeUpAnywhereGestureHandler: SwipeUpAnywhereGestureHandler,
     val tapGestureDetector: TapGestureDetector,
     val udfpsIconViewModel: AlternateBouncerUdfpsIconViewModel,
     val udfpsAccessibilityOverlayViewModel:
         Lazy<AlternateBouncerUdfpsAccessibilityOverlayViewModel>,
     val messageAreaViewModel: AlternateBouncerMessageAreaViewModel,
+    val powerInteractor: PowerInteractor,
 )
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModel.kt
index ac2713d..8c6be98 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModel.kt
@@ -24,6 +24,7 @@
 import com.android.systemui.keyguard.shared.model.ScrimAlpha
 import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
 import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
+import com.android.systemui.statusbar.SysuiStatusBarStateController
 import javax.inject.Inject
 import kotlin.time.Duration.Companion.milliseconds
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -40,6 +41,7 @@
 constructor(
     bouncerToGoneFlows: BouncerToGoneFlows,
     animationFlow: KeyguardTransitionAnimationFlow,
+    private val statusBarStateController: SysuiStatusBarStateController,
 ) : DeviceEntryIconTransition {
     private val transitionAnimation =
         animationFlow.setup(
@@ -59,6 +61,30 @@
         )
     }
 
+    fun notificationAlpha(viewState: ViewStateAccessor): Flow<Float> {
+        var startAlpha = 1f
+        var leaveShadeOpen = false
+
+        return transitionAnimation.sharedFlow(
+            duration = 200.milliseconds,
+            onStart = {
+                leaveShadeOpen = statusBarStateController.leaveOpenOnKeyguardHide()
+                startAlpha = viewState.alpha()
+            },
+            onStep = {
+                if (leaveShadeOpen) {
+                    1f
+                } else {
+                    MathUtils.lerp(startAlpha, 0f, it)
+                }
+            },
+        )
+    }
+
+    /** See [BouncerToGoneFlows#showAllNotifications] */
+    val showAllNotifications: Flow<Boolean> =
+        bouncerToGoneFlows.showAllNotifications(TO_GONE_DURATION, ALTERNATE_BOUNCER)
+
     /** Scrim alpha values */
     val scrimAlpha: Flow<ScrimAlpha> =
         bouncerToGoneFlows.scrimAlpha(TO_GONE_DURATION, ALTERNATE_BOUNCER)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerUdfpsIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerUdfpsIconViewModel.kt
index ce45112..df0b3dc 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerUdfpsIconViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerUdfpsIconViewModel.kt
@@ -23,6 +23,7 @@
 import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
 import com.android.systemui.keyguard.ui.view.DeviceEntryIconView
+import com.android.systemui.shared.recents.utilities.Utilities.clamp
 import javax.inject.Inject
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
@@ -44,8 +45,13 @@
     deviceEntryBackgroundViewModel: DeviceEntryBackgroundViewModel,
     fingerprintPropertyInteractor: FingerprintPropertyInteractor,
     udfpsOverlayInteractor: UdfpsOverlayInteractor,
+    alternateBouncerViewModel: AlternateBouncerViewModel,
 ) {
     private val isSupported: Flow<Boolean> = deviceEntryUdfpsInteractor.isUdfpsSupported
+    val alpha: Flow<Float> =
+        alternateBouncerViewModel.transitionToAlternateBouncerProgress.map {
+            clamp(it * 2f, 0f, 1f)
+        }
 
     /**
      * UDFPS icon location in pixels for the current display and screen resolution, in natural
@@ -54,12 +60,12 @@
     val iconLocation: Flow<IconLocation> =
         isSupported.flatMapLatest { supportsUI ->
             if (supportsUI) {
-                fingerprintPropertyInteractor.sensorLocation.map { sensorLocation ->
+                fingerprintPropertyInteractor.udfpsSensorBounds.map { bounds ->
                     IconLocation(
-                        left = (sensorLocation.centerX - sensorLocation.radius).toInt(),
-                        top = (sensorLocation.centerY - sensorLocation.radius).toInt(),
-                        right = (sensorLocation.centerX + sensorLocation.radius).toInt(),
-                        bottom = (sensorLocation.centerY + sensorLocation.radius).toInt(),
+                        left = bounds.left,
+                        top = bounds.top,
+                        right = bounds.right,
+                        bottom = bounds.bottom,
                     )
                 }
             } else {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt
index 10a9e3b..06a0c72 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt
@@ -71,7 +71,7 @@
             )
 
     /** Progress to a fully transitioned alternate bouncer. 1f represents fully transitioned. */
-    private val transitionToAlternateBouncerProgress =
+    val transitionToAlternateBouncerProgress =
         merge(fromAlternateBouncerTransition, toAlternateBouncerTransition)
 
     val forcePluginOpen: Flow<Boolean> =
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModel.kt
new file mode 100644
index 0000000..7814576
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModel.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.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
+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 javax.inject.Inject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.map
+
+@ExperimentalCoroutinesApi
+class AlternateBouncerWindowViewModel
+@Inject
+constructor(
+    alternateBouncerInteractor: AlternateBouncerInteractor,
+    keyguardTransitionInteractor: KeyguardTransitionInteractor,
+) {
+    private val deviceSupportsAlternateBouncer: Flow<Boolean> =
+        alternateBouncerInteractor.alternateBouncerSupported
+    private val isTransitioningToOrFromOrShowingAlternateBouncer: Flow<Boolean> =
+        keyguardTransitionInteractor.transitions
+            .map {
+                it.to == KeyguardState.ALTERNATE_BOUNCER ||
+                    (it.from == KeyguardState.ALTERNATE_BOUNCER &&
+                        it.transitionState != TransitionState.FINISHED)
+            }
+            .distinctUntilChanged()
+
+    val alternateBouncerWindowRequired: Flow<Boolean> =
+        deviceSupportsAlternateBouncer.flatMapLatest { deviceSupportsAlternateBouncer ->
+            if (deviceSupportsAlternateBouncer) {
+                isTransitioningToOrFromOrShowingAlternateBouncer
+            } else {
+                flowOf(false)
+            }
+        }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt
index 2054932..4ddd5711 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodBurnInViewModel.kt
@@ -33,10 +33,8 @@
 import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING
 import com.android.systemui.keyguard.shared.model.TransitionState.STARTED
 import com.android.systemui.keyguard.ui.StateToValue
-import com.android.systemui.plugins.clocks.ClockController
 import com.android.systemui.res.R
 import javax.inject.Inject
-import javax.inject.Provider
 import kotlin.math.max
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
@@ -128,12 +126,12 @@
                 yDimenResourceId = R.dimen.burn_in_prevention_offset_y
             ),
         ) { interpolated, burnIn ->
+            val useAltAod =
+                keyguardClockViewModel.currentClock.value?.let { clock ->
+                    clock.config.useAlternateSmartspaceAODTransition
+                } == true
             val useScaleOnly =
-                (clockController(params.clockControllerProvider)
-                    ?.get()
-                    ?.config
-                    ?.useAlternateSmartspaceAODTransition
-                    ?: false) && keyguardClockViewModel.clockSize.value == KeyguardClockSwitch.LARGE
+                useAltAod && keyguardClockViewModel.clockSize.value == KeyguardClockSwitch.LARGE
 
             if (useScaleOnly) {
                 BurnInModel(
@@ -164,21 +162,10 @@
             }
         }
     }
-
-    private fun clockController(
-        provider: Provider<ClockController>?,
-    ): Provider<ClockController>? {
-        return if (MigrateClocksToBlueprint.isEnabled) {
-            Provider { keyguardClockViewModel.currentClock.value }
-        } else {
-            provider
-        }
-    }
 }
 
 /** UI-sourced parameters to pass into the various methods of [AodBurnInViewModel]. */
 data class BurnInParameters(
-    val clockControllerProvider: Provider<ClockController>? = null,
     /** System insets that keyguard needs to stay out of */
     val topInset: Int = 0,
     /** The min y-value of the visible elements on lockscreen */
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt
index 924fc5d..6d0f96c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt
@@ -18,9 +18,8 @@
 
 import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE
 import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
-import com.android.systemui.flags.FeatureFlagsClassic
-import com.android.systemui.flags.Flags
 import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor
+import com.android.systemui.keyguard.shared.RefactorKeyguardDismissIntent
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
 import com.android.systemui.keyguard.shared.model.ScrimAlpha
@@ -32,6 +31,7 @@
 import kotlin.time.Duration
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.map
 
@@ -43,13 +43,12 @@
     private val statusBarStateController: SysuiStatusBarStateController,
     private val primaryBouncerInteractor: PrimaryBouncerInteractor,
     private val keyguardDismissActionInteractor: Lazy<KeyguardDismissActionInteractor>,
-    private val featureFlags: FeatureFlagsClassic,
     private val shadeInteractor: ShadeInteractor,
     private val animationFlow: KeyguardTransitionAnimationFlow,
 ) {
     /** Common fade for scrim alpha values during *BOUNCER->GONE */
     fun scrimAlpha(duration: Duration, fromState: KeyguardState): Flow<ScrimAlpha> {
-        return if (featureFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+        return if (RefactorKeyguardDismissIntent.isEnabled) {
             keyguardDismissActionInteractor
                 .get()
                 .willAnimateDismissActionOnLockscreen
@@ -63,6 +62,31 @@
         }
     }
 
+    /**
+     * When the shade is expanded, make sure that all notifications can be seen immediately during a
+     * transition to GONE. This matters especially when the user has chosen to not show
+     * notifications on the lockscreen and then pulls down the shade, which presents them with an
+     * immediate auth prompt, followed by a notification animation.
+     */
+    fun showAllNotifications(duration: Duration, from: KeyguardState): Flow<Boolean> {
+        var leaveShadeOpen = false
+        return animationFlow
+            .setup(
+                duration = duration,
+                from = from,
+                to = GONE,
+            )
+            .sharedFlow(
+                duration = duration,
+                onStart = { leaveShadeOpen = statusBarStateController.leaveOpenOnKeyguardHide() },
+                onStep = { if (leaveShadeOpen) 1f else 0f },
+                onFinish = { 0f },
+                onCancel = { 0f },
+            )
+            .map { it == 1f }
+            .distinctUntilChanged()
+    }
+
     private fun createScrimAlphaFlow(
         duration: Duration,
         fromState: KeyguardState,
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 1b91c49..87324a2 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
@@ -20,6 +20,7 @@
 import android.content.Context
 import com.android.settingslib.Utils
 import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
+import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import javax.inject.Inject
@@ -34,6 +35,7 @@
 /** Models the UI state for the device entry icon background view. */
 @Suppress("WHEN_ENUM_CAN_BE_NULL_IN_JAVA")
 @ExperimentalCoroutinesApi
+@SysUISingleton
 class DeviceEntryBackgroundViewModel
 @Inject
 constructor(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryForegroundViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryForegroundViewModel.kt
index 6281097..0aa6d12 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryForegroundViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryForegroundViewModel.kt
@@ -21,6 +21,7 @@
 import com.android.settingslib.Utils
 import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor
 import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
+import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.shared.model.KeyguardState
@@ -39,6 +40,7 @@
 
 /** Models the UI state for the device entry icon foreground view (displayed icon). */
 @ExperimentalCoroutinesApi
+@SysUISingleton
 class DeviceEntryForegroundViewModel
 @Inject
 constructor(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt
index bc4fd1c..49fffdd 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt
@@ -19,6 +19,7 @@
 import android.animation.FloatEvaluator
 import android.animation.IntEvaluator
 import com.android.keyguard.KeyguardViewController
+import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntrySourceInteractor
@@ -52,6 +53,7 @@
 
 /** Models the UI state for the containing device entry icon & long-press handling view. */
 @ExperimentalCoroutinesApi
+@SysUISingleton
 class DeviceEntryIconViewModel
 @Inject
 constructor(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt
index 1c1c33a..c9251c7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt
@@ -17,9 +17,12 @@
 package com.android.systemui.keyguard.ui.viewmodel
 
 import android.content.Context
+import androidx.annotation.VisibleForTesting
 import androidx.constraintlayout.helper.widget.Layer
+import com.android.internal.policy.SystemBarUtils
 import com.android.keyguard.KeyguardClockSwitch.LARGE
 import com.android.keyguard.KeyguardClockSwitch.SMALL
+import com.android.systemui.customization.R as customizationR
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
@@ -47,7 +50,7 @@
     private val keyguardClockInteractor: KeyguardClockInteractor,
     @Application private val applicationScope: CoroutineScope,
     notifsKeyguardInteractor: NotificationsKeyguardInteractor,
-    private val shadeInteractor: ShadeInteractor,
+    @VisibleForTesting val shadeInteractor: ShadeInteractor,
 ) {
     var burnInLayer: Layer? = null
     val useLargeClock: Boolean
@@ -130,6 +133,17 @@
                 initialValue = ClockLayout.SMALL_CLOCK
             )
 
+    val hasCustomPositionUpdatedAnimation: StateFlow<Boolean> =
+        combine(currentClock, isLargeClockVisible) { currentClock, isLargeClockVisible ->
+                isLargeClockVisible &&
+                    currentClock?.largeClock?.config?.hasCustomPositionUpdatedAnimation == true
+            }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.WhileSubscribed(),
+                initialValue = false
+            )
+
     /** Calculates the top margin for the small clock. */
     fun getSmallClockTopMargin(context: Context): Int {
         var topMargin: Int
@@ -150,6 +164,16 @@
         return topMargin
     }
 
+    companion object {
+        fun getLargeClockTopMargin(context: Context): Int {
+            return SystemBarUtils.getStatusBarHeight(context) +
+                context.resources.getDimensionPixelSize(
+                    customizationR.dimen.small_clock_padding_top
+                ) +
+                context.resources.getDimensionPixelSize(R.dimen.keyguard_smartspace_top_offset)
+        }
+    }
+
     enum class ClockLayout {
         LARGE_CLOCK,
         SMALL_CLOCK,
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewClockViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewClockViewModel.kt
index 4f2c6f5..7300152 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewClockViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewClockViewModel.kt
@@ -16,13 +16,10 @@
 
 package com.android.systemui.keyguard.ui.viewmodel
 
-import android.content.Context
-import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
 import com.android.systemui.keyguard.shared.model.SettingsClockSize
 import com.android.systemui.plugins.clocks.ClockController
 import javax.inject.Inject
-import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.map
@@ -31,9 +28,7 @@
 class KeyguardPreviewClockViewModel
 @Inject
 constructor(
-    @Application private val context: Context,
     interactor: KeyguardClockInteractor,
-    @Application private val applicationScope: CoroutineScope,
 ) {
 
     var shouldHighlightSelectedAffordance: Boolean = false
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewSmartspaceViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewSmartspaceViewModel.kt
index 33718c41..528b14c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewSmartspaceViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewSmartspaceViewModel.kt
@@ -17,13 +17,12 @@
 package com.android.systemui.keyguard.ui.viewmodel
 
 import android.content.Context
-import android.content.res.Resources
-import com.android.systemui.res.R
-import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
 import com.android.systemui.keyguard.shared.model.SettingsClockSize
+import com.android.systemui.res.R
 import javax.inject.Inject
 import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.map
 
@@ -31,17 +30,12 @@
 class KeyguardPreviewSmartspaceViewModel
 @Inject
 constructor(
-    @Application private val context: Context,
     interactor: KeyguardClockInteractor,
+    val smartspaceViewModel: KeyguardSmartspaceViewModel,
+    val clockViewModel: KeyguardClockViewModel,
 ) {
 
-    val smartspaceTopPadding: Flow<Int> =
-        interactor.selectedClockSize.map {
-            when (it) {
-                SettingsClockSize.DYNAMIC -> getLargeClockSmartspaceTopPadding(context.resources)
-                SettingsClockSize.SMALL -> getSmallClockSmartspaceTopPadding(context.resources)
-            }
-        }
+    val selectedClockSize: StateFlow<SettingsClockSize> = interactor.selectedClockSize
 
     val shouldHideSmartspace: Flow<Boolean> =
         combine(
@@ -59,34 +53,37 @@
                 }
             }
 
-    companion object {
-        fun getLargeClockSmartspaceTopPadding(resources: Resources): Int {
-            return with(resources) {
-                getDimensionPixelSize(R.dimen.status_bar_header_height_keyguard) +
-                    getDimensionPixelSize(R.dimen.keyguard_smartspace_top_offset) +
-                    getDimensionPixelSize(R.dimen.keyguard_clock_top_margin)
-            }
-        }
+    fun getSmartspaceStartPadding(context: Context): Int {
+        return KeyguardSmartspaceViewModel.getSmartspaceStartMargin(context)
+    }
 
-        fun getSmallClockSmartspaceTopPadding(resources: Resources): Int {
-            return with(resources) {
-                getStatusBarHeight(this) +
-                    getDimensionPixelSize(
-                        com.android.systemui.customization.R.dimen.small_clock_padding_top
-                    ) +
-                    getDimensionPixelSize(
-                        com.android.systemui.customization.R.dimen.small_clock_height
-                    )
-            }
-        }
+    fun getSmartspaceEndPadding(context: Context): Int {
+        return KeyguardSmartspaceViewModel.getSmartspaceEndMargin(context)
+    }
 
-        fun getStatusBarHeight(resource: Resources): Int {
-            var result = 0
-            val resourceId: Int = resource.getIdentifier("status_bar_height", "dimen", "android")
-            if (resourceId > 0) {
-                result = resource.getDimensionPixelSize(resourceId)
+    fun getSmallClockSmartspaceTopPadding(splitShadePreview: Boolean, context: Context): Int {
+        return getSmallClockTopPadding(splitShadePreview, context) +
+            context.resources.getDimensionPixelSize(
+                com.android.systemui.customization.R.dimen.small_clock_height
+            )
+    }
+
+    fun getLargeClockSmartspaceTopPadding(splitShadePreview: Boolean, context: Context): Int {
+        return getSmallClockTopPadding(splitShadePreview, context)
+    }
+
+    /*
+     * SmallClockTopPadding decides the top position of smartspace
+     */
+    private fun getSmallClockTopPadding(splitShadePreview: Boolean, context: Context): Int {
+        return with(context.resources) {
+            if (splitShadePreview) {
+                getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin)
+            } else {
+                getDimensionPixelSize(R.dimen.keyguard_clock_top_margin) +
+                    getDimensionPixelSize(R.dimen.status_bar_header_height_keyguard) +
+                    getDimensionPixelSize(R.dimen.keyguard_smartspace_top_offset)
             }
-            return result
         }
     }
 }
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 5337ca3..64e1565 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,6 +20,7 @@
 import android.graphics.Point
 import android.util.MathUtils
 import android.view.View.VISIBLE
+import com.android.app.tracing.coroutines.launch
 import com.android.systemui.Flags.newAodTransition
 import com.android.systemui.common.shared.model.NotificationContainerBounds
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
@@ -102,6 +103,7 @@
     private val lockscreenToPrimaryBouncerTransitionViewModel:
         LockscreenToPrimaryBouncerTransitionViewModel,
     private val occludedToAodTransitionViewModel: OccludedToAodTransitionViewModel,
+    private val occludedToDozingTransitionViewModel: OccludedToDozingTransitionViewModel,
     private val occludedToLockscreenTransitionViewModel: OccludedToLockscreenTransitionViewModel,
     private val primaryBouncerToAodTransitionViewModel: PrimaryBouncerToAodTransitionViewModel,
     private val primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel,
@@ -228,6 +230,7 @@
                         lockscreenToOccludedTransitionViewModel.lockscreenAlpha,
                         lockscreenToPrimaryBouncerTransitionViewModel.lockscreenAlpha,
                         occludedToAodTransitionViewModel.lockscreenAlpha,
+                        occludedToDozingTransitionViewModel.lockscreenAlpha,
                         occludedToLockscreenTransitionViewModel.lockscreenAlpha,
                         primaryBouncerToAodTransitionViewModel.lockscreenAlpha,
                         primaryBouncerToGoneTransitionViewModel.lockscreenAlpha,
@@ -266,7 +269,9 @@
         burnInJob?.cancel()
 
         burnInJob =
-            scope.launch { aodBurnInViewModel.movement(params).collect { burnInModel.value = it } }
+            scope.launch("$TAG#aodBurnInViewModel") {
+                aodBurnInViewModel.movement(params).collect { burnInModel.value = it }
+            }
     }
 
     val scale: Flow<BurnInScaleViewModel> =
@@ -366,4 +371,8 @@
     fun setRootViewLastTapPosition(point: Point) {
         keyguardInteractor.setLastRootViewTapPosition(point)
     }
+
+    companion object {
+        private const val TAG = "KeyguardRootViewModel"
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt
index e8c1ab5..9e7dbd4 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt
@@ -16,9 +16,11 @@
 
 package com.android.systemui.keyguard.ui.viewmodel
 
+import android.content.Context
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.keyguard.domain.interactor.KeyguardSmartspaceInteractor
+import com.android.systemui.res.R
 import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
@@ -83,4 +85,16 @@
 
     /* trigger clock and smartspace constraints change when smartspace appears */
     var bcSmartspaceVisibility: StateFlow<Int> = smartspaceInteractor.bcSmartspaceVisibility
+
+    companion object {
+        fun getSmartspaceStartMargin(context: Context): Int {
+            return context.resources.getDimensionPixelSize(R.dimen.below_clock_padding_start) +
+                context.resources.getDimensionPixelSize(R.dimen.status_view_margin_horizontal)
+        }
+
+        fun getSmartspaceEndMargin(context: Context): Int {
+            return context.resources.getDimensionPixelSize(R.dimen.below_clock_padding_end) +
+                context.resources.getDimensionPixelSize(R.dimen.status_view_margin_horizontal)
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt
index 1f80441..36896f9 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt
@@ -18,8 +18,10 @@
 
 import android.content.res.Resources
 import com.android.keyguard.KeyguardClockSwitch
+import com.android.keyguard.KeyguardClockSwitch.SMALL
 import com.android.systemui.biometrics.AuthController
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
 import com.android.systemui.res.R
@@ -29,6 +31,7 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.stateIn
@@ -42,6 +45,7 @@
     private val authController: AuthController,
     val longPress: KeyguardLongPressViewModel,
     val shadeInteractor: ShadeInteractor,
+    @Application private val applicationScope: CoroutineScope,
 ) {
     private val clockSize = clockInteractor.clockSize
 
@@ -50,11 +54,26 @@
     val isLargeClockVisible: Boolean
         get() = clockSize.value == KeyguardClockSwitch.LARGE
 
-    val areNotificationsVisible: Boolean
-        get() = !isLargeClockVisible || shouldUseSplitNotificationShade
+    val shouldUseSplitNotificationShade: StateFlow<Boolean> =
+        shadeInteractor.shadeMode
+            .map { it == ShadeMode.Split }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.WhileSubscribed(),
+                initialValue = false,
+            )
 
-    val shouldUseSplitNotificationShade: Boolean
-        get() = shadeInteractor.shadeMode.value == ShadeMode.Split
+    val areNotificationsVisible: StateFlow<Boolean> =
+        combine(clockSize, shouldUseSplitNotificationShade) {
+                clockSize,
+                shouldUseSplitNotificationShade ->
+                clockSize == SMALL || shouldUseSplitNotificationShade
+            }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.WhileSubscribed(),
+                initialValue = false,
+            )
 
     fun getSmartSpacePaddingTop(resources: Resources): Int {
         return if (isLargeClockVisible) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt
index 4e6aa03..f03625e 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt
@@ -23,6 +23,7 @@
 import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
 import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow.FlowBuilder
 import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
+import com.android.systemui.statusbar.SysuiStatusBarStateController
 import javax.inject.Inject
 import kotlin.time.Duration.Companion.milliseconds
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -37,6 +38,7 @@
 @Inject
 constructor(
     animationFlow: KeyguardTransitionAnimationFlow,
+    private val statusBarStateController: SysuiStatusBarStateController,
 ) : DeviceEntryIconTransition {
 
     private val transitionAnimation: FlowBuilder =
@@ -54,6 +56,26 @@
             onCancel = { 1f },
         )
 
+    fun notificationAlpha(viewState: ViewStateAccessor): Flow<Float> {
+        var startAlpha = 1f
+        var leaveShadeOpen = false
+
+        return transitionAnimation.sharedFlow(
+            duration = 200.milliseconds,
+            onStart = {
+                leaveShadeOpen = statusBarStateController.leaveOpenOnKeyguardHide()
+                startAlpha = viewState.alpha()
+            },
+            onStep = {
+                if (leaveShadeOpen) {
+                    1f
+                } else {
+                    MathUtils.lerp(startAlpha, 0f, it)
+                }
+            },
+        )
+    }
+
     fun lockscreenAlpha(viewState: ViewStateAccessor): Flow<Float> {
         var startAlpha = 1f
         return transitionAnimation.sharedFlow(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToDozingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToDozingTransitionViewModel.kt
new file mode 100644
index 0000000..91554e3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToDozingTransitionViewModel.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.keyguard.ui.viewmodel
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.domain.interactor.FromOccludedTransitionInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
+import javax.inject.Inject
+import kotlin.time.Duration.Companion.milliseconds
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+
+/**
+ * Breaks down OCCLUDED->DOZING transition into discrete steps for corresponding views to consume.
+ */
+@ExperimentalCoroutinesApi
+@SysUISingleton
+class OccludedToDozingTransitionViewModel
+@Inject
+constructor(
+    animationFlow: KeyguardTransitionAnimationFlow,
+) {
+    private val transitionAnimation =
+        animationFlow.setup(
+            duration = FromOccludedTransitionInteractor.TO_DOZING_DURATION,
+            from = KeyguardState.OCCLUDED,
+            to = KeyguardState.DOZING,
+        )
+
+    /** Lockscreen views alpha */
+    val lockscreenAlpha: Flow<Float> =
+        transitionAnimation.sharedFlow(
+            startTime = 233.milliseconds,
+            duration = 250.milliseconds,
+            onStep = { it },
+        )
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt
index 53f4488..a08a234 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt
@@ -18,10 +18,9 @@
 
 import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
 import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.flags.FeatureFlagsClassic
-import com.android.systemui.flags.Flags
 import com.android.systemui.keyguard.domain.interactor.FromPrimaryBouncerTransitionInteractor.Companion.TO_GONE_DURATION
 import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor
+import com.android.systemui.keyguard.shared.RefactorKeyguardDismissIntent
 import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
 import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER
 import com.android.systemui.keyguard.shared.model.ScrimAlpha
@@ -46,7 +45,6 @@
     private val statusBarStateController: SysuiStatusBarStateController,
     private val primaryBouncerInteractor: PrimaryBouncerInteractor,
     keyguardDismissActionInteractor: Lazy<KeyguardDismissActionInteractor>,
-    featureFlags: FeatureFlagsClassic,
     bouncerToGoneFlows: BouncerToGoneFlows,
     animationFlow: KeyguardTransitionAnimationFlow,
 ) {
@@ -60,6 +58,10 @@
     private var leaveShadeOpen: Boolean = false
     private var willRunDismissFromKeyguard: Boolean = false
 
+    /** See [BouncerToGoneFlows#showAllNotifications] */
+    val showAllNotifications: Flow<Boolean> =
+        bouncerToGoneFlows.showAllNotifications(TO_GONE_DURATION, PRIMARY_BOUNCER)
+
     val notificationAlpha: Flow<Float> =
         transitionAnimation.sharedFlow(
             duration = 200.milliseconds,
@@ -78,7 +80,7 @@
 
     /** Bouncer container alpha */
     val bouncerAlpha: Flow<Float> =
-        if (featureFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+        if (RefactorKeyguardDismissIntent.isEnabled) {
             keyguardDismissActionInteractor
                 .get()
                 .willAnimateDismissActionOnLockscreen
@@ -102,7 +104,7 @@
 
     /** Lockscreen alpha */
     val lockscreenAlpha: Flow<Float> =
-        if (featureFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+        if (RefactorKeyguardDismissIntent.isEnabled) {
             keyguardDismissActionInteractor
                 .get()
                 .willAnimateDismissActionOnLockscreen
diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt
index 1c11178..5dafd94 100644
--- a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt
+++ b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt
@@ -26,7 +26,9 @@
 import androidx.lifecycle.lifecycleScope
 import com.android.app.tracing.coroutines.createCoroutineTracingContext
 import com.android.app.tracing.coroutines.launch
+import com.android.systemui.Flags.coroutineTracing
 import com.android.systemui.util.Assert
+import com.android.systemui.util.Compile
 import kotlin.coroutines.CoroutineContext
 import kotlin.coroutines.EmptyCoroutineContext
 import kotlinx.coroutines.Dispatchers
@@ -69,6 +71,12 @@
     // presumably want to call view methods that require being called from said UI thread.
     val lifecycleCoroutineContext =
         Dispatchers.Main + createCoroutineTracingContext() + coroutineContext
+    val traceName =
+        if (Compile.IS_DEBUG && coroutineTracing()) {
+            traceSectionName()
+        } else {
+            DEFAULT_TRACE_NAME
+        }
     var lifecycleOwner: ViewLifecycleOwner? = null
     val onAttachListener =
         object : View.OnAttachStateChangeListener {
@@ -77,6 +85,7 @@
                 lifecycleOwner?.onDestroy()
                 lifecycleOwner =
                     createLifecycleOwnerAndRun(
+                        traceName,
                         view,
                         lifecycleCoroutineContext,
                         block,
@@ -93,6 +102,7 @@
     if (view.isAttachedToWindow) {
         lifecycleOwner =
             createLifecycleOwnerAndRun(
+                traceName,
                 view,
                 lifecycleCoroutineContext,
                 block,
@@ -109,18 +119,14 @@
 }
 
 private fun createLifecycleOwnerAndRun(
+    nameForTrace: String,
     view: View,
     coroutineContext: CoroutineContext,
     block: suspend LifecycleOwner.(View) -> Unit,
 ): ViewLifecycleOwner {
     return ViewLifecycleOwner(view).apply {
         onCreate()
-        lifecycleScope.launch(
-            "ViewLifecycleOwner(${view::class.java.simpleName})",
-            coroutineContext
-        ) {
-            block(view)
-        }
+        lifecycleScope.launch(nameForTrace, coroutineContext) { block(view) }
     }
 }
 
@@ -186,3 +192,24 @@
             }
     }
 }
+
+private fun isFrameInteresting(frame: StackWalker.StackFrame): Boolean =
+    frame.className != CURRENT_CLASS_NAME && frame.className != JAVA_ADAPTER_CLASS_NAME
+
+/** Get a name for the trace section include the name of the call site. */
+private fun traceSectionName(): String {
+    val interestingFrame =
+        StackWalker.getInstance().walk { stream ->
+            stream.filter(::isFrameInteresting).limit(5).findFirst()
+        }
+    if (interestingFrame.isPresent) {
+        val frame = interestingFrame.get()
+        return "${frame.className}#${frame.methodName}:${frame.lineNumber} [$DEFAULT_TRACE_NAME]"
+    } else {
+        return DEFAULT_TRACE_NAME
+    }
+}
+
+private const val DEFAULT_TRACE_NAME = "repeatWhenAttached"
+private const val CURRENT_CLASS_NAME = "com.android.systemui.lifecycle.RepeatWhenAttachedKt"
+private const val JAVA_ADAPTER_CLASS_NAME = "com.android.systemui.util.kotlin.JavaAdapterKt"
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt b/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt
index b94a4af..df34169 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.media.controls.data.repository
 
+import com.android.internal.logging.InstanceId
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.media.controls.shared.model.MediaData
 import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
@@ -28,17 +29,18 @@
 @SysUISingleton
 class MediaFilterRepository @Inject constructor() {
 
-    /** Key of media control that recommendations card reactivated. */
-    private val _reactivatedKey: MutableStateFlow<String?> = MutableStateFlow(null)
-    val reactivatedKey: StateFlow<String?> = _reactivatedKey.asStateFlow()
+    /** Instance id of media control that recommendations card reactivated. */
+    private val _reactivatedId: MutableStateFlow<InstanceId?> = MutableStateFlow(null)
+    val reactivatedId: StateFlow<InstanceId?> = _reactivatedId.asStateFlow()
 
     private val _smartspaceMediaData: MutableStateFlow<SmartspaceMediaData> =
         MutableStateFlow(SmartspaceMediaData())
     val smartspaceMediaData: StateFlow<SmartspaceMediaData> = _smartspaceMediaData.asStateFlow()
 
-    private val _selectedUserEntries: MutableStateFlow<Map<String, MediaData>> =
+    private val _selectedUserEntries: MutableStateFlow<Map<InstanceId, MediaData>> =
         MutableStateFlow(LinkedHashMap())
-    val selectedUserEntries: StateFlow<Map<String, MediaData>> = _selectedUserEntries.asStateFlow()
+    val selectedUserEntries: StateFlow<Map<InstanceId, MediaData>> =
+        _selectedUserEntries.asStateFlow()
 
     private val _allUserEntries: MutableStateFlow<Map<String, MediaData>> =
         MutableStateFlow(LinkedHashMap())
@@ -62,9 +64,9 @@
         return mediaData
     }
 
-    fun addSelectedUserMediaEntry(key: String, data: MediaData) {
-        val entries = LinkedHashMap<String, MediaData>(_selectedUserEntries.value)
-        entries[key] = data
+    fun addSelectedUserMediaEntry(data: MediaData) {
+        val entries = LinkedHashMap<InstanceId, MediaData>(_selectedUserEntries.value)
+        entries[data.instanceId] = data
         _selectedUserEntries.value = entries
     }
 
@@ -73,8 +75,8 @@
      *
      * @return media data if an entry is actually removed, `null` otherwise.
      */
-    fun removeSelectedUserMediaEntry(key: String): MediaData? {
-        val entries = LinkedHashMap<String, MediaData>(_selectedUserEntries.value)
+    fun removeSelectedUserMediaEntry(key: InstanceId): MediaData? {
+        val entries = LinkedHashMap<InstanceId, MediaData>(_selectedUserEntries.value)
         val mediaData = entries.remove(key)
         _selectedUserEntries.value = entries
         return mediaData
@@ -85,8 +87,8 @@
      *
      * @return true if media data is removed, false otherwise.
      */
-    fun removeSelectedUserMediaEntry(key: String, data: MediaData): Boolean {
-        val entries = LinkedHashMap<String, MediaData>(_selectedUserEntries.value)
+    fun removeSelectedUserMediaEntry(key: InstanceId, data: MediaData): Boolean {
+        val entries = LinkedHashMap<InstanceId, MediaData>(_selectedUserEntries.value)
         val succeed = entries.remove(key, data)
         if (!succeed) {
             return false
@@ -105,7 +107,7 @@
     }
 
     /** Updates media control key that recommendations card reactivated. */
-    fun setReactivatedKey(key: String?) {
-        _reactivatedKey.value = key
+    fun setReactivatedId(instanceId: InstanceId?) {
+        _reactivatedId.value = instanceId
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt
index a65db35..d40069c 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt
@@ -22,6 +22,7 @@
 import android.util.Log
 import com.android.internal.annotations.KeepForWeakReference
 import com.android.internal.annotations.VisibleForTesting
+import com.android.internal.logging.InstanceId
 import com.android.systemui.broadcast.BroadcastSender
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.media.controls.data.repository.MediaFilterRepository
@@ -66,8 +67,8 @@
     private val mediaFlags: MediaFlags,
     private val mediaFilterRepository: MediaFilterRepository,
 ) : MediaDataManager.Listener {
-    private val _listeners: MutableSet<MediaDataManager.Listener> = mutableSetOf()
-    val listeners: Set<MediaDataManager.Listener>
+    private val _listeners: MutableSet<Listener> = mutableSetOf()
+    val listeners: Set<Listener>
         get() = _listeners.toSet()
     lateinit var mediaDataManager: MediaDataManager
 
@@ -108,13 +109,10 @@
             return
         }
 
-        if (oldKey != null && oldKey != key) {
-            mediaFilterRepository.removeSelectedUserMediaEntry(oldKey)
-        }
-        mediaFilterRepository.addSelectedUserMediaEntry(key, data)
+        mediaFilterRepository.addSelectedUserMediaEntry(data)
 
         // Notify listeners
-        listeners.forEach { it.onMediaDataLoaded(key, oldKey, data) }
+        listeners.forEach { it.onMediaDataLoaded(data.instanceId) }
     }
 
     override fun onSmartspaceMediaDataLoaded(
@@ -160,11 +158,11 @@
             // It could happen there are existing active media resume cards, then we don't need to
             // reactivate.
             if (shouldReactivate) {
-                val lastActiveKey = sorted.lastKey() // most recently active
+                val lastActiveId = sorted.lastKey() // most recently active id
                 // Notify listeners to consider this media active
-                Log.d(TAG, "reactivating $lastActiveKey instead of smartspace")
-                mediaFilterRepository.setReactivatedKey(lastActiveKey)
-                val mediaData = sorted[lastActiveKey]!!.copy(active = true)
+                Log.d(TAG, "reactivating $lastActiveId instead of smartspace")
+                mediaFilterRepository.setReactivatedId(lastActiveId)
+                val mediaData = sorted[lastActiveId]!!.copy(active = true)
                 logger.logRecommendationActivated(
                     mediaData.appUid,
                     mediaData.packageName,
@@ -172,9 +170,7 @@
                 )
                 listeners.forEach {
                     it.onMediaDataLoaded(
-                        lastActiveKey,
-                        lastActiveKey,
-                        mediaData,
+                        lastActiveId,
                         receivedSmartspaceCardLatency =
                             (systemClock.currentTimeMillis() - data.headphoneConnectionTimeMillis)
                                 .toInt(),
@@ -196,27 +192,28 @@
             smartspaceMediaData.packageName,
             smartspaceMediaData.instanceId
         )
-        listeners.forEach { it.onSmartspaceMediaDataLoaded(key, data, shouldPrioritizeMutable) }
+        listeners.forEach { it.onSmartspaceMediaDataLoaded(key, shouldPrioritizeMutable) }
     }
 
     override fun onMediaDataRemoved(key: String) {
-        mediaFilterRepository.removeMediaEntry(key)
-        mediaFilterRepository.removeSelectedUserMediaEntry(key)?.let {
-            // Only notify listeners if something actually changed
-            listeners.forEach { it.onMediaDataRemoved(key) }
+        mediaFilterRepository.removeMediaEntry(key)?.let { mediaData ->
+            val instanceId = mediaData.instanceId
+            mediaFilterRepository.removeSelectedUserMediaEntry(instanceId)?.let {
+                // Only notify listeners if something actually changed
+                listeners.forEach { it.onMediaDataRemoved(instanceId) }
+            }
         }
     }
 
     override fun onSmartspaceMediaDataRemoved(key: String, immediately: Boolean) {
         // First check if we had reactivated media instead of forwarding smartspace
-        mediaFilterRepository.reactivatedKey.value?.let {
-            val lastActiveKey = it
-            mediaFilterRepository.setReactivatedKey(null)
-            Log.d(TAG, "expiring reactivated key $lastActiveKey")
+        mediaFilterRepository.reactivatedId.value?.let { lastActiveId ->
+            mediaFilterRepository.setReactivatedId(null)
+            Log.d(TAG, "expiring reactivated key $lastActiveId")
             // Notify listeners to update with actual active value
-            mediaFilterRepository.selectedUserEntries.value[lastActiveKey]?.let { mediaData ->
+            mediaFilterRepository.selectedUserEntries.value[lastActiveId]?.let {
                 listeners.forEach { listener ->
-                    listener.onMediaDataLoaded(lastActiveKey, lastActiveKey, mediaData, immediately)
+                    listener.onMediaDataLoaded(lastActiveId, immediately)
                 }
             }
         }
@@ -240,8 +237,8 @@
             if (!lockscreenUserManager.isProfileAvailable(data.userId)) {
                 // Only remove media when the profile is unavailable.
                 if (DEBUG) Log.d(TAG, "Removing $key after profile change")
-                mediaFilterRepository.removeSelectedUserMediaEntry(key, data)
-                listeners.forEach { listener -> listener.onMediaDataRemoved(key) }
+                mediaFilterRepository.removeSelectedUserMediaEntry(data.instanceId, data)
+                listeners.forEach { listener -> listener.onMediaDataRemoved(data.instanceId) }
             }
         }
     }
@@ -254,16 +251,16 @@
         // Clear the list first, to make sure callbacks from listeners if we have any entries
         // are up to date
         mediaFilterRepository.clearSelectedUserMedia()
-        keyCopy.forEach {
-            if (DEBUG) Log.d(TAG, "Removing $it after user change")
-            listenersCopy.forEach { listener -> listener.onMediaDataRemoved(it) }
+        keyCopy.forEach { instanceId ->
+            if (DEBUG) Log.d(TAG, "Removing $instanceId after user change")
+            listenersCopy.forEach { listener -> listener.onMediaDataRemoved(instanceId) }
         }
 
         mediaFilterRepository.allUserEntries.value.forEach { (key, data) ->
             if (lockscreenUserManager.isCurrentProfile(data.userId)) {
                 if (DEBUG) Log.d(TAG, "Re-adding $key after user change")
-                mediaFilterRepository.addSelectedUserMediaEntry(key, data)
-                listenersCopy.forEach { listener -> listener.onMediaDataLoaded(key, null, data) }
+                mediaFilterRepository.addSelectedUserMediaEntry(data)
+                listenersCopy.forEach { listener -> listener.onMediaDataLoaded(data.instanceId) }
             }
         }
     }
@@ -271,10 +268,12 @@
     /** Invoked when the user has dismissed the media carousel */
     fun onSwipeToDismiss() {
         if (DEBUG) Log.d(TAG, "Media carousel swiped away")
-        val mediaKeys = mediaFilterRepository.selectedUserEntries.value.keys.toSet()
-        mediaKeys.forEach {
-            // Force updates to listeners, needed for re-activated card
-            mediaDataManager.setInactive(it, timedOut = true, forceUpdate = true)
+        val mediaEntries = mediaFilterRepository.allUserEntries.value.entries
+        mediaEntries.forEach { (key, data) ->
+            if (mediaFilterRepository.selectedUserEntries.value.containsKey(data.instanceId)) {
+                // Force updates to listeners, needed for re-activated card
+                mediaDataManager.setInactive(key, timedOut = true, forceUpdate = true)
+            }
         }
         val smartspaceMediaData = mediaFilterRepository.smartspaceMediaData.value
         if (smartspaceMediaData.isActive) {
@@ -312,10 +311,10 @@
     }
 
     /** Add a listener for filtered [MediaData] changes */
-    fun addListener(listener: MediaDataManager.Listener) = _listeners.add(listener)
+    fun addListener(listener: Listener) = _listeners.add(listener)
 
     /** Remove a listener that was registered with addListener */
-    fun removeListener(listener: MediaDataManager.Listener) = _listeners.remove(listener)
+    fun removeListener(listener: Listener) = _listeners.remove(listener)
 
     /**
      * Return the time since last active for the most-recent media.
@@ -325,15 +324,57 @@
      *   the present. MAX_VALUE will be returned if there is no media.
      */
     private fun timeSinceActiveForMostRecentMedia(
-        sortedEntries: SortedMap<String, MediaData>
+        sortedEntries: SortedMap<InstanceId, MediaData>
     ): Long {
         if (sortedEntries.isEmpty()) {
             return Long.MAX_VALUE
         }
 
         val now = systemClock.elapsedRealtime()
-        val lastActiveKey = sortedEntries.lastKey() // most recently active
-        return sortedEntries[lastActiveKey]?.let { now - it.lastActive } ?: Long.MAX_VALUE
+        val lastActiveInstanceId = sortedEntries.lastKey() // most recently active
+        return sortedEntries[lastActiveInstanceId]?.let { now - it.lastActive } ?: Long.MAX_VALUE
+    }
+
+    interface Listener {
+        /**
+         * Called whenever there's new MediaData Loaded for the consumption in views.
+         *
+         * @param immediately indicates should apply the UI changes immediately, otherwise wait
+         *   until the next refresh-round before UI becomes visible. True by default to take in
+         *   place immediately.
+         * @param receivedSmartspaceCardLatency is the latency between headphone connects and sysUI
+         *   displays Smartspace media targets. Will be 0 if the data is not activated by Smartspace
+         *   signal.
+         * @param isSsReactivated indicates resume media card is reactivated by Smartspace
+         *   recommendation signal
+         */
+        fun onMediaDataLoaded(
+            instanceId: InstanceId,
+            immediately: Boolean = true,
+            receivedSmartspaceCardLatency: Int = 0,
+            isSsReactivated: Boolean = false,
+        )
+
+        /**
+         * Called whenever there's new Smartspace media data loaded.
+         *
+         * @param shouldPrioritize indicates the sorting priority of the Smartspace card. If true,
+         *   it will be prioritized as the first card. Otherwise, it will show up as the last card
+         *   as default.
+         */
+        fun onSmartspaceMediaDataLoaded(key: String, shouldPrioritize: Boolean = false)
+
+        /** Called whenever a previously existing Media notification was removed. */
+        fun onMediaDataRemoved(instanceId: InstanceId)
+
+        /**
+         * Called whenever a previously existing Smartspace media data was removed.
+         *
+         * @param immediately indicates should apply the UI changes immediately, otherwise wait
+         *   until the next refresh-round before UI becomes visible. True by default to take in
+         *   place immediately.
+         */
+        fun onSmartspaceMediaDataRemoved(key: String, immediately: Boolean = true)
     }
 
     companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt
index 2b1070c..2331aa2 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt
@@ -27,10 +27,10 @@
 interface MediaDataManager {
 
     /** Add a listener for changes in this class */
-    fun addListener(listener: Listener)
+    fun addListener(listener: Listener) {}
 
     /** Remove a listener for changes in this class */
-    fun removeListener(listener: Listener)
+    fun removeListener(listener: Listener) {}
 
     /**
      * Called whenever the player has been paused or stopped for a while, or swiped from QQS. This
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt
index 4a92b71..7dbca0a 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt
@@ -70,7 +70,7 @@
         combine(
                 mediaFilterRepository.selectedUserEntries,
                 mediaFilterRepository.smartspaceMediaData,
-                mediaFilterRepository.reactivatedKey
+                mediaFilterRepository.reactivatedId
             ) { entries, smartspaceMediaData, reactivatedKey ->
                 entries.any { it.value.active } ||
                     (smartspaceMediaData.isActive &&
@@ -142,14 +142,6 @@
         mediaDataFilter.mediaDataManager = this
     }
 
-    override fun addListener(listener: MediaDataManager.Listener) {
-        mediaDataFilter.addListener(listener)
-    }
-
-    override fun removeListener(listener: MediaDataManager.Listener) {
-        mediaDataFilter.removeListener(listener)
-    }
-
     override fun setInactive(key: String, timedOut: Boolean, forceUpdate: Boolean) {
         mediaDataProcessor.setInactive(key, timedOut, forceUpdate)
     }
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractor.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractor.kt
new file mode 100644
index 0000000..5a0388d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractor.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.media.controls.domain.pipeline.interactor
+
+import com.android.internal.logging.InstanceId
+import com.android.systemui.media.controls.data.repository.MediaFilterRepository
+import com.android.systemui.media.controls.domain.pipeline.MediaDataProcessor
+import com.android.systemui.media.controls.shared.model.MediaControlModel
+import com.android.systemui.media.controls.shared.model.MediaData
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
+
+/** Encapsulates business logic for single media control. */
+class MediaControlInteractor(
+    instanceId: InstanceId,
+    repository: MediaFilterRepository,
+    private val mediaDataProcessor: MediaDataProcessor,
+) {
+
+    val mediaControl: Flow<MediaControlModel?> =
+        repository.selectedUserEntries
+            .map { entries -> entries[instanceId]?.let { toMediaControlModel(it) } }
+            .distinctUntilChanged()
+
+    fun removeMediaControl(key: String, delayMs: Long): Boolean {
+        return mediaDataProcessor.dismissMediaData(key, delayMs)
+    }
+
+    private fun toMediaControlModel(data: MediaData): MediaControlModel {
+        return with(data) {
+            MediaControlModel(
+                uid = appUid,
+                packageName = packageName,
+                instanceId = instanceId,
+                token = token,
+                appIcon = appIcon,
+                clickIntent = clickIntent,
+                appName = app,
+                songName = song,
+                artistName = artist,
+                artwork = artwork,
+                deviceData = device,
+                semanticActionButtons = semanticActions,
+                notificationActionButtons = actions,
+                actionsToShowInCollapsed = actionsToShowInCompact,
+                isResume = resumption,
+                resumeProgress = resumeProgress,
+            )
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractor.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractor.kt
new file mode 100644
index 0000000..d57b049
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractor.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.media.controls.domain.pipeline.interactor
+
+import android.content.Context
+import android.content.Intent
+import android.provider.Settings
+import android.util.Log
+import androidx.annotation.VisibleForTesting
+import com.android.internal.jank.InteractionJankMonitor
+import com.android.systemui.animation.Expandable
+import com.android.systemui.broadcast.BroadcastSender
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.media.controls.data.repository.MediaFilterRepository
+import com.android.systemui.media.controls.domain.pipeline.MediaDataProcessor
+import com.android.systemui.media.controls.shared.model.MediaRecModel
+import com.android.systemui.media.controls.shared.model.MediaRecommendationsModel
+import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
+import com.android.systemui.plugins.ActivityStarter
+import java.net.URISyntaxException
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.stateIn
+
+/** Encapsulates business logic for media recommendation */
+@SysUISingleton
+class MediaRecommendationsInteractor
+@Inject
+constructor(
+    @Application applicationScope: CoroutineScope,
+    @Application private val applicationContext: Context,
+    repository: MediaFilterRepository,
+    private val mediaDataProcessor: MediaDataProcessor,
+    private val broadcastSender: BroadcastSender,
+    private val activityStarter: ActivityStarter,
+) {
+
+    val recommendations: Flow<MediaRecommendationsModel> =
+        repository.smartspaceMediaData.map { toRecommendationsModel(it) }.distinctUntilChanged()
+
+    /** Indicates whether the recommendations card is active. */
+    val isActive: StateFlow<Boolean> =
+        repository.smartspaceMediaData
+            .map { it.isActive }
+            .distinctUntilChanged()
+            .stateIn(applicationScope, SharingStarted.WhileSubscribed(), false)
+
+    fun removeMediaRecommendations(key: String, dismissIntent: Intent?, delayMs: Long) {
+        mediaDataProcessor.dismissSmartspaceRecommendation(key, delayMs)
+        if (dismissIntent == null) {
+            Log.w(TAG, "Cannot create dismiss action click action: extras missing dismiss_intent.")
+            return
+        }
+
+        val className = dismissIntent.component?.className
+        if (className == EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME) {
+            // Dismiss the card Smartspace data through Smartspace trampoline activity.
+            applicationContext.startActivity(dismissIntent)
+        } else {
+            broadcastSender.sendBroadcast(dismissIntent)
+        }
+    }
+
+    fun startSettings() {
+        activityStarter.startActivity(SETTINGS_INTENT, /* dismissShade= */ true)
+    }
+
+    fun startClickIntent(expandable: Expandable, intent: Intent) {
+        if (shouldActivityOpenInForeground(intent)) {
+            // Request to unlock the device if the activity needs to be opened in foreground.
+            activityStarter.postStartActivityDismissingKeyguard(
+                intent,
+                0 /* delay */,
+                expandable.activityTransitionController(
+                    InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER
+                )
+            )
+        } else {
+            // Otherwise, open the activity in background directly.
+            applicationContext.startActivity(intent)
+        }
+    }
+
+    /** Returns if the action will open the activity in foreground. */
+    private fun shouldActivityOpenInForeground(intent: Intent): Boolean {
+        val intentString = intent.extras?.getString(EXTRAS_SMARTSPACE_INTENT) ?: return false
+        try {
+            val wrapperIntent = Intent.parseUri(intentString, Intent.URI_INTENT_SCHEME)
+            return wrapperIntent.getBooleanExtra(KEY_SMARTSPACE_OPEN_IN_FOREGROUND, false)
+        } catch (e: URISyntaxException) {
+            Log.wtf(TAG, "Failed to create intent from URI: $intentString")
+            e.printStackTrace()
+        }
+        return false
+    }
+
+    private fun toRecommendationsModel(data: SmartspaceMediaData): MediaRecommendationsModel {
+        val mediaRecs = ArrayList<MediaRecModel>()
+        data.recommendations.forEach {
+            with(it) { mediaRecs.add(MediaRecModel(intent, title, subtitle, icon, extras)) }
+        }
+        return with(data) {
+            MediaRecommendationsModel(
+                key = targetId,
+                uid = getUid(applicationContext),
+                packageName = packageName,
+                instanceId = instanceId,
+                appName = getAppName(applicationContext),
+                dismissIntent = dismissIntent,
+                areRecommendationsValid = isValid(),
+                mediaRecs = mediaRecs,
+            )
+        }
+    }
+
+    companion object {
+
+        private const val TAG = "MediaRecommendationsInteractor"
+
+        // TODO (b/237284176) : move AGSA reference out.
+        private const val EXTRAS_SMARTSPACE_INTENT =
+            "com.google.android.apps.gsa.smartspace.extra.SMARTSPACE_INTENT"
+        @VisibleForTesting
+        const val EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME =
+            "com.google.android.apps.gsa.staticplugins.opa.smartspace." +
+                "ExportedSmartspaceTrampolineActivity"
+
+        private const val KEY_SMARTSPACE_OPEN_IN_FOREGROUND = "KEY_OPEN_IN_FOREGROUND"
+
+        private val SETTINGS_INTENT = Intent(Settings.ACTION_MEDIA_CONTROLS_SETTINGS)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaControlModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaControlModel.kt
new file mode 100644
index 0000000..d4e34b5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaControlModel.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.media.controls.shared.model
+
+import android.app.Notification
+import android.app.PendingIntent
+import android.graphics.drawable.Icon
+import android.media.session.MediaSession
+import android.os.Process
+import com.android.internal.logging.InstanceId
+
+data class MediaControlModel(
+    val uid: Int = Process.INVALID_UID,
+    val packageName: String,
+    val instanceId: InstanceId,
+    val token: MediaSession.Token?,
+    val appIcon: Icon?,
+    val clickIntent: PendingIntent?,
+    val appName: String?,
+    val songName: CharSequence?,
+    val artistName: CharSequence?,
+    val artwork: Icon?,
+    val deviceData: MediaDeviceData?,
+    /** [MediaButton] contains [MediaAction] objects which represent specific buttons in the UI */
+    val semanticActionButtons: MediaButton?,
+    val notificationActionButtons: List<MediaAction>,
+    /**
+     * List of [notificationActionButtons] indices shown on smaller version of media player. Check
+     * [Notification.MediaStyle.setShowActionsInCompactView].
+     */
+    val actionsToShowInCollapsed: List<Int>,
+    /** Whether player is in resumption state. */
+    val isResume: Boolean,
+    /** Track seek bar progress (0 - 1) when [isResume] is true. */
+    val resumeProgress: Double?,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaRecommendationsModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaRecommendationsModel.kt
new file mode 100644
index 0000000..43bd32d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaRecommendationsModel.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.media.controls.shared.model
+
+import android.content.Intent
+import android.graphics.drawable.Icon
+import android.os.Bundle
+import android.os.Process
+import com.android.internal.logging.InstanceId
+
+data class MediaRecommendationsModel(
+    val key: String,
+    val uid: Int = Process.INVALID_UID,
+    val packageName: String,
+    val instanceId: InstanceId? = null,
+    val appName: CharSequence? = null,
+    val dismissIntent: Intent? = null,
+    /** Whether the model contains enough number of valid recommendations. */
+    val areRecommendationsValid: Boolean = false,
+    val mediaRecs: List<MediaRecModel>,
+)
+
+/** Represents smartspace media recommendation action */
+data class MediaRecModel(
+    val intent: Intent? = null,
+    val title: CharSequence? = null,
+    val subtitle: CharSequence? = null,
+    val icon: Icon? = null,
+    val extras: Bundle? = null,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/SmartspaceMediaData.kt b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/SmartspaceMediaData.kt
index b446585..9e15dbb 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/SmartspaceMediaData.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/SmartspaceMediaData.kt
@@ -20,6 +20,7 @@
 import android.content.Context
 import android.content.Intent
 import android.content.pm.PackageManager
+import android.os.Process
 import android.text.TextUtils
 import android.util.Log
 import androidx.annotation.VisibleForTesting
@@ -87,6 +88,15 @@
             null
         }
     }
+
+    fun getUid(context: Context): Int {
+        return try {
+            context.packageManager.getApplicationInfo(packageName, 0 /* flags */).uid
+        } catch (e: PackageManager.NameNotFoundException) {
+            Log.w(TAG, "Fail to get media recommendation's app info", e)
+            Process.INVALID_UID
+        }
+    }
 }
 
 /** Key to indicate whether this card should be used to re-show recent media */
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/util/MediaArtworkHelper.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/util/MediaArtworkHelper.kt
new file mode 100644
index 0000000..eec43a6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/util/MediaArtworkHelper.kt
@@ -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 com.android.systemui.media.controls.ui.util
+
+import android.app.WallpaperColors
+import android.content.Context
+import android.graphics.Rect
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.GradientDrawable
+import android.graphics.drawable.Icon
+import android.graphics.drawable.LayerDrawable
+import android.util.Log
+import com.android.systemui.media.controls.ui.animation.backgroundEndFromScheme
+import com.android.systemui.media.controls.ui.animation.backgroundStartFromScheme
+import com.android.systemui.monet.ColorScheme
+import com.android.systemui.util.getColorWithAlpha
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.withContext
+
+object MediaArtworkHelper {
+
+    /**
+     * This method should be called from a background thread. WallpaperColors.fromBitmap takes a
+     * good amount of time. We do that work on the background executor to avoid stalling animations
+     * on the UI Thread.
+     */
+    suspend fun getWallpaperColor(
+        applicationContext: Context,
+        backgroundDispatcher: CoroutineDispatcher,
+        artworkIcon: Icon?,
+        tag: String,
+    ): WallpaperColors? =
+        withContext(backgroundDispatcher) {
+            return@withContext artworkIcon?.let {
+                if (it.type == Icon.TYPE_BITMAP || it.type == Icon.TYPE_ADAPTIVE_BITMAP) {
+                    // Avoids extra processing if this is already a valid bitmap
+                    it.bitmap.let { artworkBitmap ->
+                        if (artworkBitmap.isRecycled) {
+                            Log.d(tag, "Cannot load wallpaper color from a recycled bitmap")
+                            null
+                        } else {
+                            WallpaperColors.fromBitmap(artworkBitmap)
+                        }
+                    }
+                } else {
+                    it.loadDrawable(applicationContext)?.let { artworkDrawable ->
+                        WallpaperColors.fromDrawable(artworkDrawable)
+                    }
+                }
+            }
+        }
+
+    /**
+     * Returns a scaled [Drawable] of a given [Icon] centered in [width]x[height] background size.
+     */
+    fun getScaledBackground(context: Context, icon: Icon, width: Int, height: Int): Drawable? {
+        val drawable = icon.loadDrawable(context)
+        val bounds = Rect(0, 0, width, height)
+        if (bounds.width() > width || bounds.height() > height) {
+            val offsetX = (bounds.width() - width) / 2.0f
+            val offsetY = (bounds.height() - height) / 2.0f
+            bounds.offset(-offsetX.toInt(), -offsetY.toInt())
+        }
+        drawable?.bounds = bounds
+        return drawable
+    }
+
+    /** Adds [gradient] on a given [albumArt] drawable using [colorScheme]. */
+    fun setUpGradientColorOnDrawable(
+        albumArt: Drawable?,
+        gradient: GradientDrawable,
+        colorScheme: ColorScheme,
+        startAlpha: Float,
+        endAlpha: Float
+    ): LayerDrawable {
+        gradient.colors =
+            intArrayOf(
+                getColorWithAlpha(backgroundStartFromScheme(colorScheme), startAlpha),
+                getColorWithAlpha(backgroundEndFromScheme(colorScheme), endAlpha)
+            )
+        return LayerDrawable(arrayOf(albumArt, gradient))
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandler.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandler.kt
index c033e46..b531ecf 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandler.kt
@@ -37,7 +37,7 @@
 import com.android.systemui.qs.PageIndicator
 import com.android.systemui.res.R
 import com.android.systemui.util.concurrency.DelayableExecutor
-import com.android.wm.shell.animation.PhysicsAnimator
+import com.android.wm.shell.shared.animation.PhysicsAnimator
 
 private const val FLING_SLOP = 1000000
 private const val DISMISS_DELAY = 100L
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaScrollView.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaScrollView.kt
index b625908..b08ee16 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaScrollView.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaScrollView.kt
@@ -24,7 +24,7 @@
 import android.view.ViewGroup
 import android.widget.HorizontalScrollView
 import com.android.systemui.Gefingerpoken
-import com.android.wm.shell.animation.physicsAnimator
+import com.android.wm.shell.shared.animation.physicsAnimator
 
 /**
  * A ScrollView used in Media that doesn't limit itself to the childs bounds. This is useful when
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/GutsViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/GutsViewModel.kt
new file mode 100644
index 0000000..e508e1b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/GutsViewModel.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.media.controls.ui.viewmodel
+
+import android.annotation.ColorInt
+import android.graphics.drawable.Drawable
+
+/** Models UI state for media guts menu */
+data class GutsViewModel(
+    val gutsText: CharSequence,
+    @ColorInt val textColor: Int,
+    @ColorInt val buttonBackgroundColor: Int,
+    @ColorInt val buttonTextColor: Int,
+    val isDismissEnabled: Boolean = true,
+    val onDismissClicked: () -> Unit,
+    val cancelTextBackground: Drawable?,
+    val onSettingsClicked: () -> Unit,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecViewModel.kt
new file mode 100644
index 0000000..2f9fc9b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecViewModel.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.media.controls.ui.viewmodel
+
+import android.annotation.ColorInt
+import android.graphics.drawable.Drawable
+import com.android.systemui.animation.Expandable
+
+/** Models UI state for media recommendation item */
+data class MediaRecViewModel(
+    val contentDescription: CharSequence,
+    val title: CharSequence = "",
+    @ColorInt val titleColor: Int,
+    val subtitle: CharSequence = "",
+    @ColorInt val subtitleColor: Int,
+    /** track progress [0 - 100] for the recommendation album. */
+    val progress: Int = 0,
+    @ColorInt val progressColor: Int,
+    val albumIcon: Drawable? = null,
+    val appIcon: Drawable? = null,
+    val onClicked: ((Expandable, Int) -> Unit),
+)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModel.kt
new file mode 100644
index 0000000..19ea00d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModel.kt
@@ -0,0 +1,353 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.media.controls.ui.viewmodel
+
+import android.app.WallpaperColors
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.graphics.Bitmap
+import android.graphics.Color
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.ColorDrawable
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.GradientDrawable
+import android.graphics.drawable.Icon
+import android.graphics.drawable.LayerDrawable
+import android.os.Process
+import android.util.Log
+import androidx.appcompat.content.res.AppCompatResources
+import com.android.internal.logging.InstanceId
+import com.android.systemui.animation.Expandable
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.media.controls.domain.pipeline.interactor.MediaRecommendationsInteractor
+import com.android.systemui.media.controls.shared.model.MediaRecModel
+import com.android.systemui.media.controls.shared.model.MediaRecommendationsModel
+import com.android.systemui.media.controls.ui.animation.accentPrimaryFromScheme
+import com.android.systemui.media.controls.ui.animation.surfaceFromScheme
+import com.android.systemui.media.controls.ui.animation.textPrimaryFromScheme
+import com.android.systemui.media.controls.ui.animation.textSecondaryFromScheme
+import com.android.systemui.media.controls.ui.controller.MediaViewController.Companion.GUTS_ANIMATION_DURATION
+import com.android.systemui.media.controls.ui.util.MediaArtworkHelper
+import com.android.systemui.media.controls.util.MediaDataUtils
+import com.android.systemui.media.controls.util.MediaUiEventLogger
+import com.android.systemui.monet.ColorScheme
+import com.android.systemui.monet.Style
+import com.android.systemui.res.R
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.withContext
+
+/** Models UI state and handles user input for media recommendations */
+@SysUISingleton
+class MediaRecommendationsViewModel
+@Inject
+constructor(
+    @Application private val applicationContext: Context,
+    @Background private val backgroundDispatcher: CoroutineDispatcher,
+    private val interactor: MediaRecommendationsInteractor,
+    private val logger: MediaUiEventLogger,
+) {
+
+    val mediaRecsCard: Flow<MediaRecsCardViewModel?> =
+        interactor.recommendations
+            .map { recsCard -> toRecsViewModel(recsCard) }
+            .distinctUntilChanged()
+            .flowOn(backgroundDispatcher)
+
+    /**
+     * Called whenever the recommendation has been expired or removed by the user. This method
+     * removes the recommendation card entirely from the carousel.
+     */
+    private fun onMediaRecommendationsDismissed(
+        key: String,
+        uid: Int,
+        packageName: String,
+        dismissIntent: Intent?,
+        instanceId: InstanceId?
+    ) {
+        // TODO (b/330897926) log smartspace card reported (SMARTSPACE_CARD_DISMISS_EVENT).
+        logger.logLongPressDismiss(uid, packageName, instanceId)
+        interactor.removeMediaRecommendations(key, dismissIntent, GUTS_DISMISS_DELAY_MS_DURATION)
+    }
+
+    private fun onClicked(
+        expandable: Expandable,
+        intent: Intent?,
+        packageName: String,
+        instanceId: InstanceId?,
+        index: Int
+    ) {
+        if (intent == null || intent.extras == null) {
+            Log.e(TAG, "No tap action can be set up")
+            return
+        }
+
+        if (index == -1) {
+            logger.logRecommendationCardTap(packageName, instanceId)
+        } else {
+            logger.logRecommendationItemTap(packageName, instanceId, index)
+        }
+        // TODO (b/330897926) log smartspace card reported (SMARTSPACE_CARD_CLICK_EVENT).
+        interactor.startClickIntent(expandable, intent)
+    }
+
+    private suspend fun toRecsViewModel(model: MediaRecommendationsModel): MediaRecsCardViewModel? {
+        if (!model.areRecommendationsValid) {
+            Log.e(TAG, "Received an invalid recommendation list")
+            return null
+        }
+        if (model.appName == null || model.uid == Process.INVALID_UID) {
+            Log.w(TAG, "Fail to get media recommendation's app info")
+            return null
+        }
+
+        val scheme = getColorScheme(model.packageName) ?: return null
+
+        // Capture width & height from views in foreground for artwork scaling in background
+        val width =
+            applicationContext.resources.getDimensionPixelSize(R.dimen.qs_media_rec_album_width)
+        val height =
+            applicationContext.resources.getDimensionPixelSize(
+                R.dimen.qs_media_rec_album_height_expanded
+            )
+
+        val appIcon = applicationContext.packageManager.getApplicationIcon(model.packageName)
+        val textPrimaryColor = textPrimaryFromScheme(scheme)
+        val textSecondaryColor = textSecondaryFromScheme(scheme)
+        val backgroundColor = surfaceFromScheme(scheme)
+
+        var areTitlesVisible = false
+        var areSubtitlesVisible = false
+        val mediaRecs =
+            model.mediaRecs.map { mediaRecModel ->
+                areTitlesVisible = areTitlesVisible || !mediaRecModel.title.isNullOrEmpty()
+                areSubtitlesVisible = areSubtitlesVisible || !mediaRecModel.subtitle.isNullOrEmpty()
+                val progress = MediaDataUtils.getDescriptionProgress(mediaRecModel.extras) ?: 0.0
+                MediaRecViewModel(
+                    contentDescription =
+                        setUpMediaRecContentDescription(mediaRecModel, model.appName),
+                    title = mediaRecModel.title ?: "",
+                    titleColor = textPrimaryColor,
+                    subtitle = mediaRecModel.subtitle ?: "",
+                    subtitleColor = textSecondaryColor,
+                    progress = (progress * 100).toInt(),
+                    progressColor = textPrimaryColor,
+                    albumIcon =
+                        getRecCoverBackground(
+                            mediaRecModel.icon,
+                            width,
+                            height,
+                        ),
+                    appIcon = appIcon,
+                    onClicked = { expandable, index ->
+                        onClicked(
+                            expandable,
+                            mediaRecModel.intent,
+                            model.packageName,
+                            model.instanceId,
+                            index,
+                        )
+                    }
+                )
+            }
+        // Subtitles should only be visible if titles are visible.
+        areSubtitlesVisible = areTitlesVisible && areSubtitlesVisible
+
+        return MediaRecsCardViewModel(
+            contentDescription = { gutsVisible ->
+                if (gutsVisible) {
+                    applicationContext.getString(
+                        R.string.controls_media_close_session,
+                        model.appName
+                    )
+                } else {
+                    applicationContext.getString(R.string.controls_media_smartspace_rec_header)
+                }
+            },
+            cardColor = backgroundColor,
+            cardTitleColor = textPrimaryColor,
+            onClicked = { expandable ->
+                onClicked(
+                    expandable,
+                    model.dismissIntent,
+                    model.packageName,
+                    model.instanceId,
+                    index = -1
+                )
+            },
+            onLongClicked = {
+                logger.logLongPressOpen(model.uid, model.packageName, model.instanceId)
+            },
+            mediaRecs = mediaRecs,
+            areTitlesVisible = areTitlesVisible,
+            areSubtitlesVisible = areSubtitlesVisible,
+            gutsMenu = toGutsViewModel(model, scheme),
+        )
+    }
+
+    private fun toGutsViewModel(
+        model: MediaRecommendationsModel,
+        scheme: ColorScheme
+    ): GutsViewModel {
+        return GutsViewModel(
+            gutsText =
+                applicationContext.getString(R.string.controls_media_close_session, model.appName),
+            textColor = textPrimaryFromScheme(scheme),
+            buttonBackgroundColor = accentPrimaryFromScheme(scheme),
+            buttonTextColor = surfaceFromScheme(scheme),
+            onDismissClicked = {
+                onMediaRecommendationsDismissed(
+                    model.key,
+                    model.uid,
+                    model.packageName,
+                    model.dismissIntent,
+                    model.instanceId
+                )
+            },
+            cancelTextBackground =
+                applicationContext.getDrawable(R.drawable.qs_media_outline_button),
+            onSettingsClicked = {
+                logger.logLongPressSettings(model.uid, model.packageName, model.instanceId)
+                interactor.startSettings()
+            },
+        )
+    }
+
+    /** Returns the recommendation album cover of [width]x[height] size. */
+    private suspend fun getRecCoverBackground(icon: Icon?, width: Int, height: Int): Drawable =
+        withContext(backgroundDispatcher) {
+            return@withContext MediaArtworkHelper.getWallpaperColor(
+                    applicationContext,
+                    backgroundDispatcher,
+                    icon,
+                    TAG,
+                )
+                ?.let { wallpaperColors ->
+                    addGradientToRecommendationAlbum(
+                        icon!!,
+                        ColorScheme(wallpaperColors, true, Style.CONTENT),
+                        width,
+                        height
+                    )
+                }
+                ?: ColorDrawable(Color.TRANSPARENT)
+        }
+
+    private fun addGradientToRecommendationAlbum(
+        artworkIcon: Icon,
+        mutableColorScheme: ColorScheme,
+        width: Int,
+        height: Int
+    ): LayerDrawable {
+        // First try scaling rec card using bitmap drawable.
+        // If returns null, set drawable bounds.
+        val albumArt =
+            getScaledRecommendationCover(artworkIcon, width, height)
+                ?: MediaArtworkHelper.getScaledBackground(
+                    applicationContext,
+                    artworkIcon,
+                    width,
+                    height
+                )
+        val gradient =
+            AppCompatResources.getDrawable(applicationContext, R.drawable.qs_media_rec_scrim)
+                ?.mutate() as GradientDrawable
+        return MediaArtworkHelper.setUpGradientColorOnDrawable(
+            albumArt,
+            gradient,
+            mutableColorScheme,
+            MEDIA_REC_SCRIM_START_ALPHA,
+            MEDIA_REC_SCRIM_END_ALPHA
+        )
+    }
+
+    private fun setUpMediaRecContentDescription(
+        mediaRec: MediaRecModel,
+        appName: CharSequence?
+    ): CharSequence {
+        // Set up the accessibility label for the media item.
+        val artistName = mediaRec.extras?.getString(KEY_SMARTSPACE_ARTIST_NAME, "")
+        return if (artistName.isNullOrEmpty()) {
+            applicationContext.getString(
+                R.string.controls_media_smartspace_rec_item_no_artist_description,
+                mediaRec.title,
+                appName
+            )
+        } else {
+            applicationContext.getString(
+                R.string.controls_media_smartspace_rec_item_description,
+                mediaRec.title,
+                artistName,
+                appName
+            )
+        }
+    }
+
+    private fun getColorScheme(packageName: String): ColorScheme? {
+        // Set up recommendation card's header.
+        return try {
+            val packageManager = applicationContext.packageManager
+            val applicationInfo = packageManager.getApplicationInfo(packageName, 0 /* flags */)
+            // Set up media source app's logo.
+            val icon = packageManager.getApplicationIcon(applicationInfo)
+            ColorScheme(WallpaperColors.fromDrawable(icon), darkTheme = true)
+        } catch (e: PackageManager.NameNotFoundException) {
+            Log.w(TAG, "Fail to get media recommendation's app info", e)
+            null
+        }
+    }
+
+    /** Returns a [Drawable] of a given [artworkIcon] scaled to [width]x[height] size, . */
+    private fun getScaledRecommendationCover(
+        artworkIcon: Icon,
+        width: Int,
+        height: Int
+    ): Drawable? {
+        check(width > 0) { "Width must be a positive number but was $width" }
+        check(height > 0) { "Height must be a positive number but was $height" }
+
+        return if (
+            artworkIcon.type == Icon.TYPE_BITMAP || artworkIcon.type == Icon.TYPE_ADAPTIVE_BITMAP
+        ) {
+            artworkIcon.bitmap?.let {
+                val bitmap = Bitmap.createScaledBitmap(it, width, height, false)
+                BitmapDrawable(applicationContext.resources, bitmap)
+            }
+        } else {
+            null
+        }
+    }
+
+    companion object {
+        private const val TAG = "MediaRecommendationsViewModel"
+        private const val KEY_SMARTSPACE_ARTIST_NAME = "artist_name"
+        private const val MEDIA_REC_SCRIM_START_ALPHA = 0.15f
+        private const val MEDIA_REC_SCRIM_END_ALPHA = 1.0f
+        /**
+         * Delay duration is based on [GUTS_ANIMATION_DURATION], it should have 100 ms increase in
+         * order to let the animation end.
+         */
+        private const val GUTS_DISMISS_DELAY_MS_DURATION = 334L
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecsCardViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecsCardViewModel.kt
new file mode 100644
index 0000000..d1713b5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecsCardViewModel.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.media.controls.ui.viewmodel
+
+import android.annotation.ColorInt
+import com.android.systemui.animation.Expandable
+
+/** Models UI state for media recommendations card. */
+data class MediaRecsCardViewModel(
+    val contentDescription: (Boolean) -> CharSequence,
+    @ColorInt val cardColor: Int,
+    @ColorInt val cardTitleColor: Int,
+    val onClicked: (Expandable) -> Unit,
+    val onLongClicked: () -> Unit,
+    val mediaRecs: List<MediaRecViewModel>,
+    val areTitlesVisible: Boolean,
+    val areSubtitlesVisible: Boolean,
+    val gutsMenu: GutsViewModel,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaUiEventLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaUiEventLogger.kt
index 2c25fe2..09f973c 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaUiEventLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaUiEventLogger.kt
@@ -99,15 +99,15 @@
         logger.log(MediaUiEvent.DISMISS_SWIPE)
     }
 
-    fun logLongPressOpen(uid: Int, packageName: String, instanceId: InstanceId) {
+    fun logLongPressOpen(uid: Int, packageName: String, instanceId: InstanceId?) {
         logger.logWithInstanceId(MediaUiEvent.OPEN_LONG_PRESS, uid, packageName, instanceId)
     }
 
-    fun logLongPressDismiss(uid: Int, packageName: String, instanceId: InstanceId) {
+    fun logLongPressDismiss(uid: Int, packageName: String, instanceId: InstanceId?) {
         logger.logWithInstanceId(MediaUiEvent.DISMISS_LONG_PRESS, uid, packageName, instanceId)
     }
 
-    fun logLongPressSettings(uid: Int, packageName: String, instanceId: InstanceId) {
+    fun logLongPressSettings(uid: Int, packageName: String, instanceId: InstanceId?) {
         logger.logWithInstanceId(
             MediaUiEvent.OPEN_SETTINGS_LONG_PRESS,
             uid,
@@ -188,7 +188,7 @@
         )
     }
 
-    fun logRecommendationItemTap(packageName: String, instanceId: InstanceId, position: Int) {
+    fun logRecommendationItemTap(packageName: String, instanceId: InstanceId?, position: Int) {
         logger.logWithInstanceIdAndPosition(
             MediaUiEvent.MEDIA_RECOMMENDATION_ITEM_TAP,
             0,
@@ -198,7 +198,7 @@
         )
     }
 
-    fun logRecommendationCardTap(packageName: String, instanceId: InstanceId) {
+    fun logRecommendationCardTap(packageName: String, instanceId: InstanceId?) {
         logger.logWithInstanceId(
             MediaUiEvent.MEDIA_RECOMMENDATION_CARD_TAP,
             0,
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
index adee7f2c..4db89d1 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
@@ -1200,9 +1200,7 @@
     }
 
     boolean isVolumeControlEnabled(@NonNull MediaDevice device) {
-        return (isPlayBackInfoLocal()
-                || device.getDeviceType() != MediaDevice.MediaDeviceType.TYPE_CAST_GROUP_DEVICE)
-                && !device.isVolumeFixed();
+        return !device.isVolumeFixed();
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt
index d247122..f08bc17 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt
@@ -25,8 +25,8 @@
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.mediaprojection.appselector.data.ActivityTaskManagerLabelLoader
 import com.android.systemui.mediaprojection.appselector.data.ActivityTaskManagerThumbnailLoader
-import com.android.systemui.mediaprojection.appselector.data.AppIconLoader
-import com.android.systemui.mediaprojection.appselector.data.IconLoaderLibAppIconLoader
+import com.android.systemui.mediaprojection.appselector.data.BasicAppIconLoader
+import com.android.systemui.mediaprojection.appselector.data.BasicPackageManagerAppIconLoader
 import com.android.systemui.mediaprojection.appselector.data.RecentTaskLabelLoader
 import com.android.systemui.mediaprojection.appselector.data.RecentTaskListProvider
 import com.android.systemui.mediaprojection.appselector.data.RecentTaskThumbnailLoader
@@ -102,7 +102,7 @@
 
     @Binds
     @MediaProjectionAppSelectorScope
-    fun bindAppIconLoader(impl: IconLoaderLibAppIconLoader): AppIconLoader
+    fun bindAppIconLoader(impl: BasicPackageManagerAppIconLoader): BasicAppIconLoader
 
     @Binds
     @IntoSet
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/AppIconLoader.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/AppIconLoader.kt
deleted file mode 100644
index b85d628..0000000
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/AppIconLoader.kt
+++ /dev/null
@@ -1,61 +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.mediaprojection.appselector.data
-
-import android.content.ComponentName
-import android.content.Context
-import android.content.pm.PackageManager
-import android.graphics.drawable.Drawable
-import android.os.UserHandle
-import com.android.launcher3.icons.BaseIconFactory.IconOptions
-import com.android.launcher3.icons.IconFactory
-import com.android.systemui.dagger.qualifiers.Background
-import com.android.systemui.shared.system.PackageManagerWrapper
-import javax.inject.Inject
-import javax.inject.Provider
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.withContext
-
-interface AppIconLoader {
-    suspend fun loadIcon(userId: Int, component: ComponentName): Drawable?
-}
-
-class IconLoaderLibAppIconLoader
-@Inject
-constructor(
-    @Background private val backgroundDispatcher: CoroutineDispatcher,
-    private val context: Context,
-    // Use wrapper to access hidden API that allows to get ActivityInfo for any user id
-    private val packageManagerWrapper: PackageManagerWrapper,
-    private val packageManager: PackageManager,
-    private val iconFactoryProvider: Provider<IconFactory>
-) : AppIconLoader {
-
-    override suspend fun loadIcon(userId: Int, component: ComponentName): Drawable? =
-        withContext(backgroundDispatcher) {
-            iconFactoryProvider.get().use<IconFactory, Drawable?> { iconFactory ->
-                val activityInfo =
-                    packageManagerWrapper.getActivityInfo(component, userId)
-                        ?: return@withContext null
-                val icon = activityInfo.loadIcon(packageManager) ?: return@withContext null
-                val userHandler = UserHandle.of(userId)
-                val options = IconOptions().apply { setUser(userHandler) }
-                val badgedIcon = iconFactory.createBadgedIconBitmap(icon, options)
-                badgedIcon.newIcon(context)
-            }
-        }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/BadgedAppIconLoader.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/BadgedAppIconLoader.kt
new file mode 100644
index 0000000..ca5b5f8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/BadgedAppIconLoader.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.appselector.data
+
+import android.content.ComponentName
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.os.UserHandle
+import com.android.launcher3.icons.BaseIconFactory
+import com.android.launcher3.icons.IconFactory
+import com.android.launcher3.util.UserIconInfo
+import com.android.systemui.dagger.qualifiers.Background
+import javax.inject.Inject
+import javax.inject.Provider
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.withContext
+
+class BadgedAppIconLoader
+@Inject
+constructor(
+    private val basicAppIconLoader: BasicAppIconLoader,
+    @Background private val backgroundDispatcher: CoroutineDispatcher,
+    private val context: Context,
+    private val iconFactoryProvider: Provider<IconFactory>,
+) {
+
+    suspend fun loadIcon(
+        userId: Int,
+        userType: RecentTask.UserType,
+        componentName: ComponentName
+    ): Drawable? =
+        withContext(backgroundDispatcher) {
+            iconFactoryProvider.get().use<IconFactory, Drawable?> { iconFactory ->
+                val icon =
+                    basicAppIconLoader.loadIcon(userId, componentName) ?: return@withContext null
+                val userHandler = UserHandle.of(userId)
+                val iconType = getIconType(userType)
+                val options =
+                    BaseIconFactory.IconOptions().apply {
+                        setUser(UserIconInfo(userHandler, iconType))
+                    }
+                val badgedIcon = iconFactory.createBadgedIconBitmap(icon, options)
+                badgedIcon.newIcon(context)
+            }
+        }
+
+    private fun getIconType(userType: RecentTask.UserType): Int =
+        when (userType) {
+            RecentTask.UserType.CLONED -> UserIconInfo.TYPE_CLONED
+            RecentTask.UserType.WORK -> UserIconInfo.TYPE_WORK
+            RecentTask.UserType.PRIVATE -> UserIconInfo.TYPE_PRIVATE
+            RecentTask.UserType.STANDARD -> UserIconInfo.TYPE_MAIN
+        }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/BasicAppIconLoader.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/BasicAppIconLoader.kt
new file mode 100644
index 0000000..03f6f01
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/BasicAppIconLoader.kt
@@ -0,0 +1,45 @@
+/*
+ * 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.mediaprojection.appselector.data
+
+import android.content.ComponentName
+import android.content.pm.PackageManager
+import android.graphics.drawable.Drawable
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.shared.system.PackageManagerWrapper
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.withContext
+
+interface BasicAppIconLoader {
+    suspend fun loadIcon(userId: Int, component: ComponentName): Drawable?
+}
+
+class BasicPackageManagerAppIconLoader
+@Inject
+constructor(
+    @Background private val backgroundDispatcher: CoroutineDispatcher,
+    // Use wrapper to access hidden API that allows to get ActivityInfo for any user id
+    private val packageManagerWrapper: PackageManagerWrapper,
+    private val packageManager: PackageManager,
+) : BasicAppIconLoader {
+
+    override suspend fun loadIcon(userId: Int, component: ComponentName): Drawable? =
+        withContext(backgroundDispatcher) {
+            packageManagerWrapper.getActivityInfo(component, userId)?.loadIcon(packageManager)
+        }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTask.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTask.kt
index e9b4582..2dbe2aa 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTask.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTask.kt
@@ -18,7 +18,9 @@
 
 import android.annotation.ColorInt
 import android.annotation.UserIdInt
+import android.app.ActivityManager.RecentTaskInfo
 import android.content.ComponentName
+import com.android.wm.shell.util.SplitBounds
 
 data class RecentTask(
     val taskId: Int,
@@ -28,4 +30,30 @@
     val baseIntentComponent: ComponentName?,
     @ColorInt val colorBackground: Int?,
     val isForegroundTask: Boolean,
-)
+    val userType: UserType,
+    val splitBounds: SplitBounds?,
+) {
+    constructor(
+        taskInfo: RecentTaskInfo,
+        isForegroundTask: Boolean,
+        userType: UserType,
+        splitBounds: SplitBounds? = null
+    ) : this(
+        taskInfo.taskId,
+        taskInfo.displayId,
+        taskInfo.userId,
+        taskInfo.topActivity,
+        taskInfo.baseIntent?.component,
+        taskInfo.taskDescription?.backgroundColor,
+        isForegroundTask,
+        userType,
+        splitBounds
+    )
+
+    enum class UserType {
+        STANDARD,
+        WORK,
+        PRIVATE,
+        CLONED
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt
index 5dde14b..596c18f 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt
@@ -17,6 +17,8 @@
 package com.android.systemui.mediaprojection.appselector.data
 
 import android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE
+import android.content.pm.UserInfo
+import android.os.UserManager
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.settings.UserTracker
 import com.android.systemui.util.kotlin.getOrNull
@@ -41,7 +43,8 @@
     @Background private val coroutineDispatcher: CoroutineDispatcher,
     @Background private val backgroundExecutor: Executor,
     private val recentTasks: Optional<RecentTasks>,
-    private val userTracker: UserTracker
+    private val userTracker: UserTracker,
+    private val userManager: UserManager,
 ) : RecentTaskListProvider {
 
     private val recents by lazy { recentTasks.getOrNull() }
@@ -55,19 +58,27 @@
             val foregroundTaskId1 = foregroundGroup?.taskInfo1?.taskId
             val foregroundTaskId2 = foregroundGroup?.taskInfo2?.taskId
             val foregroundTaskIds = listOfNotNull(foregroundTaskId1, foregroundTaskId2)
-            groupedTasks
-                .flatMap { listOfNotNull(it.taskInfo1, it.taskInfo2) }
-                .map {
+            groupedTasks.flatMap {
+                val task1 =
                     RecentTask(
-                        it.taskId,
-                        it.displayId,
-                        it.userId,
-                        it.topActivity,
-                        it.baseIntent?.component,
-                        it.taskDescription?.backgroundColor,
-                        isForegroundTask = it.taskId in foregroundTaskIds && it.isVisible
+                        it.taskInfo1,
+                        it.taskInfo1.taskId in foregroundTaskIds && it.taskInfo1.isVisible,
+                        userManager.getUserInfo(it.taskInfo1.userId).toUserType(),
+                        it.splitBounds
                     )
-                }
+
+                val task2 =
+                    if (it.taskInfo2 != null) {
+                        RecentTask(
+                            it.taskInfo2!!,
+                            it.taskInfo2!!.taskId in foregroundTaskIds && it.taskInfo2!!.isVisible,
+                            userManager.getUserInfo(it.taskInfo2!!.userId).toUserType(),
+                            it.splitBounds
+                        )
+                    } else null
+
+                listOfNotNull(task1, task2)
+            }
         }
 
     private suspend fun RecentTasks.getTasks(): List<GroupedRecentTaskInfo> =
@@ -81,4 +92,15 @@
                 continuation.resume(tasks)
             }
         }
+
+    private fun UserInfo.toUserType(): RecentTask.UserType =
+        if (isCloneProfile) {
+            RecentTask.UserType.CLONED
+        } else if (isManagedProfile) {
+            RecentTask.UserType.WORK
+        } else if (isPrivateProfile) {
+            RecentTask.UserType.PRIVATE
+        } else {
+            RecentTask.UserType.STANDARD
+        }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt
index 7c7efd0..9549ab1 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt
@@ -24,9 +24,12 @@
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.window.RemoteTransition
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.android.systemui.Flags.pssAppSelectorAbruptExitFix
+import com.android.systemui.Flags.pssAppSelectorRecentsSplitScreen
+import com.android.systemui.display.naturalBounds
 import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorResultHandler
 import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorScope
 import com.android.systemui.mediaprojection.appselector.data.RecentTask
@@ -34,6 +37,11 @@
 import com.android.systemui.mediaprojection.appselector.view.TaskPreviewSizeProvider.TaskPreviewSizeListener
 import com.android.systemui.res.R
 import com.android.systemui.util.recycler.HorizontalSpacerItemDecoration
+import com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT
+import com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT
+import com.android.wm.shell.splitscreen.SplitScreen
+import com.android.wm.shell.util.SplitBounds
+import java.util.Optional
 import javax.inject.Inject
 
 /**
@@ -48,6 +56,7 @@
     private val taskViewSizeProvider: TaskPreviewSizeProvider,
     private val activityTaskManager: IActivityTaskManager,
     private val resultHandler: MediaProjectionAppSelectorResultHandler,
+    private val splitScreen: Optional<SplitScreen>,
 ) : RecentTaskClickListener, TaskPreviewSizeListener {
 
     private var views: Views? = null
@@ -63,11 +72,11 @@
     fun createView(parent: ViewGroup): ViewGroup =
         views?.root
             ?: createRecentViews(parent)
-                .also {
-                    views = it
-                    lastBoundData?.let { recents -> bind(recents) }
-                }
-                .root
+                    .also {
+                        views = it
+                        lastBoundData?.let { recents -> bind(recents) }
+                    }
+                    .root
 
     fun bind(recentTasks: List<RecentTask>) {
         views?.apply {
@@ -93,8 +102,10 @@
     private fun createRecentViews(parent: ViewGroup): Views {
         val recentsRoot =
             LayoutInflater.from(parent.context)
-                .inflate(R.layout.media_projection_recent_tasks, parent, /* attachToRoot= */ false)
-                as ViewGroup
+                    .inflate(R.layout.media_projection_recent_tasks,
+                        parent, /* attachToRoot= */
+                        false)
+                    as ViewGroup
 
         val container =
             recentsRoot.requireViewById<View>(R.id.media_projection_recent_tasks_container)
@@ -121,18 +132,34 @@
         return Views(recentsRoot, container, progress, recycler)
     }
 
+    private fun RecentTask.isLaunchingInSplitScreen(): Boolean {
+        return splitScreen.isPresent && splitBounds != null
+    }
+
     override fun onRecentAppClicked(task: RecentTask, view: View) {
         val launchCookie = LaunchCookie()
         val activityOptions = createAnimation(task, view)
         activityOptions.pendingIntentBackgroundActivityStartMode =
             MODE_BACKGROUND_ACTIVITY_START_ALLOWED
-        activityOptions.setLaunchCookie(launchCookie)
         activityOptions.launchDisplayId = task.displayId
+        activityOptions.setLaunchCookie(launchCookie)
 
-        activityTaskManager.startActivityFromRecents(task.taskId, activityOptions.toBundle())
-        resultHandler.returnSelectedApp(launchCookie)
+        val handleResult: () -> Unit = { resultHandler.returnSelectedApp(launchCookie)}
+
+        val taskId = task.taskId
+        val splitBounds = task.splitBounds
+
+        if (pssAppSelectorRecentsSplitScreen() &&
+            task.isLaunchingInSplitScreen() &&
+            !task.isForegroundTask) {
+            startSplitScreenTask(view, taskId, splitBounds!!, handleResult, activityOptions)
+        } else {
+            activityTaskManager.startActivityFromRecents(taskId, activityOptions.toBundle())
+            handleResult()
+        }
     }
 
+
     private fun createAnimation(task: RecentTask, view: View): ActivityOptions =
         if (pssAppSelectorAbruptExitFix() && task.isForegroundTask) {
             // When the selected task is in the foreground, the scale up animation doesn't work.
@@ -145,7 +172,14 @@
                 /* startedListener = */ null,
                 /* finishedListener = */ null
             )
+        } else if (task.isLaunchingInSplitScreen()) {
+            // When the selected task isn't in the foreground, but is launching in split screen,
+            // then we don't need to specify an animation, since we'll already be passing a
+            // manually built remote animation to SplitScreenController
+            ActivityOptions.makeBasic()
         } else {
+            // The default case is a selected task not in the foreground and launching fullscreen,
+            // so for this we can use the default ActivityOptions animation
             ActivityOptions.makeScaleUpAnimation(
                 view,
                 /* startX= */ 0,
@@ -155,6 +189,29 @@
             )
         }
 
+    private fun startSplitScreenTask(
+        view: View,
+        taskId: Int,
+        splitBounds: SplitBounds,
+        handleResult: () -> Unit,
+        activityOptions: ActivityOptions,
+    ) {
+        val isLeftTopTask = taskId == splitBounds.leftTopTaskId
+        val task2Id =
+            if (isLeftTopTask) splitBounds.rightBottomTaskId else splitBounds.leftTopTaskId
+        val splitPosition =
+            if (isLeftTopTask) SPLIT_POSITION_TOP_OR_LEFT else SPLIT_POSITION_BOTTOM_OR_RIGHT
+
+        val animationRunner = RemoteRecentSplitTaskTransitionRunner(taskId, task2Id,
+            view.locationOnScreen, view.context.display.naturalBounds, handleResult)
+        val remoteTransition = RemoteTransition(animationRunner,
+            view.context.iApplicationThread, "startSplitScreenTask")
+
+        splitScreen.get().startTasks(taskId, activityOptions.toBundle(), task2Id, null,
+            splitPosition, splitBounds.snapPosition, remoteTransition, null)
+    }
+
+
     override fun onTaskSizeChanged(size: Rect) {
         views?.recentsContainer?.setTaskHeightSize()
     }
@@ -163,12 +220,12 @@
         val thumbnailHeight = taskViewSizeProvider.size.height()
         val itemHeight =
             thumbnailHeight +
-                context.resources.getDimensionPixelSize(
-                    R.dimen.media_projection_app_selector_task_icon_size
-                ) +
-                context.resources.getDimensionPixelSize(
-                    R.dimen.media_projection_app_selector_task_icon_margin
-                ) * 2
+                    context.resources.getDimensionPixelSize(
+                        R.dimen.media_projection_app_selector_task_icon_size
+                    ) +
+                    context.resources.getDimensionPixelSize(
+                        R.dimen.media_projection_app_selector_task_icon_margin
+                    ) * 2
 
         layoutParams = layoutParams.apply { height = itemHeight }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt
index 3fe040a..3b84d2c 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt
@@ -21,12 +21,12 @@
 import android.view.ViewGroup
 import android.widget.ImageView
 import androidx.recyclerview.widget.RecyclerView.ViewHolder
-import com.android.systemui.res.R
 import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelector
-import com.android.systemui.mediaprojection.appselector.data.AppIconLoader
+import com.android.systemui.mediaprojection.appselector.data.BadgedAppIconLoader
 import com.android.systemui.mediaprojection.appselector.data.RecentTask
 import com.android.systemui.mediaprojection.appselector.data.RecentTaskLabelLoader
 import com.android.systemui.mediaprojection.appselector.data.RecentTaskThumbnailLoader
+import com.android.systemui.res.R
 import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
@@ -39,7 +39,7 @@
 @AssistedInject
 constructor(
     @Assisted private val root: ViewGroup,
-    private val iconLoader: AppIconLoader,
+    private val iconLoader: BadgedAppIconLoader,
     private val thumbnailLoader: RecentTaskThumbnailLoader,
     private val labelLoader: RecentTaskLabelLoader,
     private val taskViewSizeProvider: TaskPreviewSizeProvider,
@@ -63,7 +63,7 @@
             scope.launch {
                 task.baseIntentComponent?.let { component ->
                     launch {
-                        val icon = iconLoader.loadIcon(task.userId, component)
+                        val icon = iconLoader.loadIcon(task.userId, task.userType, component)
                         iconView.setImageDrawable(icon)
                     }
                     launch {
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RemoteRecentSplitTaskTransitionRunner.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RemoteRecentSplitTaskTransitionRunner.kt
new file mode 100644
index 0000000..9514c4a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RemoteRecentSplitTaskTransitionRunner.kt
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.appselector.view
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.AnimatorSet
+import android.animation.ValueAnimator
+import android.annotation.UiThread
+import android.graphics.Rect
+import android.os.IBinder
+import android.os.RemoteException
+import android.util.Log
+import android.view.SurfaceControl
+import android.view.animation.DecelerateInterpolator
+import android.window.IRemoteTransition
+import android.window.IRemoteTransitionFinishedCallback
+import android.window.TransitionInfo
+import android.window.WindowContainerToken
+import com.android.app.viewcapture.ViewCapture
+import com.android.internal.policy.TransitionAnimation
+import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorActivity.Companion.TAG
+
+class RemoteRecentSplitTaskTransitionRunner(
+    private val firstTaskId: Int,
+    private val secondTaskId: Int,
+    private val viewPosition: IntArray,
+    private val screenBounds: Rect,
+    private val handleResult: () -> Unit,
+) : IRemoteTransition.Stub() {
+    override fun startAnimation(
+        transition: IBinder?,
+        info: TransitionInfo?,
+        t: SurfaceControl.Transaction?,
+        finishedCallback: IRemoteTransitionFinishedCallback
+    ) {
+        val launchAnimation = AnimatorSet()
+        var rootCandidate =
+            info!!.changes.firstOrNull {
+                it.taskInfo?.taskId == firstTaskId || it.taskInfo?.taskId == secondTaskId
+            }
+
+        // If we could not find a proper root candidate, something went wrong.
+        check(rootCandidate != null) { "Could not find a split root candidate" }
+
+        // Recurse up the tree until parent is null, then we've found our root.
+        var parentToken: WindowContainerToken? = rootCandidate.parent
+        while (parentToken != null) {
+            rootCandidate = info.getChange(parentToken) ?: break
+            parentToken = rootCandidate.parent
+        }
+
+        // Make sure nothing weird happened, like getChange() returning null.
+        check(rootCandidate != null) { "Failed to find a root leash" }
+
+        // Ending position is the full device screen.
+        val startingScale = 0.25f
+
+        val startX = viewPosition[0]
+        val startY = viewPosition[1]
+        val endX = screenBounds.left
+        val endY = screenBounds.top
+
+        ViewCapture.MAIN_EXECUTOR.execute {
+            val progressUpdater = ValueAnimator.ofFloat(0f, 1f)
+            with(progressUpdater) {
+                interpolator = DecelerateInterpolator(1.5f)
+                setDuration(TransitionAnimation.DEFAULT_APP_TRANSITION_DURATION.toLong())
+
+                addUpdateListener { valueAnimator ->
+                    val progress = valueAnimator.animatedFraction
+
+                    val x = startX + ((endX - startX) * progress)
+                    val y = startY + ((endY - startY) * progress)
+                    val scale = startingScale + ((1 - startingScale) * progress)
+
+                    t!!
+                        .setPosition(rootCandidate.leash, x, y)
+                        .setScale(rootCandidate.leash, scale, scale)
+                        .setAlpha(rootCandidate.leash, progress)
+                        .apply()
+                }
+
+                addListener(
+                    object : AnimatorListenerAdapter() {
+                        override fun onAnimationEnd(animation: Animator) {
+                            try {
+                                onTransitionFinished()
+                                finishedCallback.onTransitionFinished(null, null)
+                            } catch (e: RemoteException) {
+                                Log.e(TAG, "Failed to call transition finished callback", e)
+                            }
+                        }
+                    }
+                )
+            }
+
+            launchAnimation.play(progressUpdater)
+            launchAnimation.start()
+        }
+    }
+
+    override fun mergeAnimation(
+        transition: IBinder?,
+        info: TransitionInfo?,
+        t: SurfaceControl.Transaction?,
+        mergeTarget: IBinder?,
+        finishedCallback: IRemoteTransitionFinishedCallback?
+    ) {}
+
+    @Throws(RemoteException::class)
+    override fun onTransitionConsumed(transition: IBinder, aborted: Boolean) {
+        Log.w(TAG, "unexpected consumption of app selector transition: aborted=$aborted")
+    }
+
+    @UiThread
+    private fun onTransitionFinished() {
+        // After finished transition, then invoke callback to close the app selector, so that
+        // finish animation of app selector does not override the launch animation of the split
+        // tasks
+        handleResult()
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialogDelegate.kt
index 8aed535..d87b612 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDisabledDialogDelegate.kt
@@ -15,6 +15,8 @@
  */
 package com.android.systemui.mediaprojection.devicepolicy
 
+import android.app.AlertDialog
+import android.content.Context
 import android.content.DialogInterface.BUTTON_POSITIVE
 import android.content.res.Resources
 import com.android.systemui.dagger.qualifiers.Main
@@ -23,22 +25,33 @@
 import javax.inject.Inject
 
 /** Dialog that shows that screen capture is disabled on this device. */
-class ScreenCaptureDisabledDialogDelegate @Inject constructor(
-        @Main private val resources: Resources,
-        private val systemUIDialogFactory: SystemUIDialog.Factory
-) : SystemUIDialog.Delegate {
+class ScreenCaptureDisabledDialogDelegate
+@Inject
+constructor(
+    private val context: Context,
+    @Main private val resources: Resources,
+) {
 
-    override fun createDialog(): SystemUIDialog {
-        val dialog = systemUIDialogFactory.create(this)
-        dialog.setTitle(resources.getString(R.string.screen_capturing_disabled_by_policy_dialog_title))
+    fun createPlainDialog(): AlertDialog {
+        return AlertDialog.Builder(context, R.style.Theme_SystemUI_Dialog).create().also {
+            initDialog(it)
+        }
+    }
+
+    fun createSysUIDialog(): AlertDialog {
+        return SystemUIDialog(context).also { initDialog(it) }
+    }
+
+    private fun initDialog(dialog: AlertDialog) {
+        dialog.setTitle(
+            resources.getString(R.string.screen_capturing_disabled_by_policy_dialog_title)
+        )
         dialog.setMessage(
             resources.getString(R.string.screen_capturing_disabled_by_policy_dialog_description)
         )
         dialog.setIcon(R.drawable.ic_cast)
-        dialog.setButton(BUTTON_POSITIVE, resources.getString(android.R.string.ok)) {
-            _, _ -> dialog.cancel()
+        dialog.setButton(BUTTON_POSITIVE, resources.getString(android.R.string.ok)) { _, _ ->
+            dialog.cancel()
         }
-
-        return dialog
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/BaseMediaProjectionPermissionDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/BaseMediaProjectionPermissionDialogDelegate.kt
index 1983a67..6224170 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/BaseMediaProjectionPermissionDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/BaseMediaProjectionPermissionDialogDelegate.kt
@@ -47,25 +47,25 @@
     private val mediaProjectionMetricsLogger: MediaProjectionMetricsLogger,
     @DrawableRes private val dialogIconDrawable: Int? = null,
     @ColorRes private val dialogIconTint: Int? = null,
+    @ScreenShareMode val defaultSelectedMode: Int = screenShareOptions.first().mode,
 ) : DialogDelegate<T>, AdapterView.OnItemSelectedListener {
     private lateinit var dialogTitle: TextView
     private lateinit var startButton: TextView
     private lateinit var cancelButton: TextView
     private lateinit var warning: TextView
     private lateinit var screenShareModeSpinner: Spinner
-    private var hasCancelBeenLogged: Boolean = false
     protected lateinit var dialog: AlertDialog
-    var selectedScreenShareOption: ScreenShareOption = screenShareOptions.first()
+    private var shouldLogCancel: Boolean = true
+    var selectedScreenShareOption: ScreenShareOption =
+        screenShareOptions.first { it.mode == defaultSelectedMode }
 
     @CallSuper
     override fun onStop(dialog: T) {
         // onStop can be called multiple times and we only want to log once.
-        if (hasCancelBeenLogged) {
-            return
+        if (shouldLogCancel) {
+            mediaProjectionMetricsLogger.notifyProjectionRequestCancelled(hostUid)
+            shouldLogCancel = false
         }
-
-        mediaProjectionMetricsLogger.notifyProjectionRequestCancelled(hostUid)
-        hasCancelBeenLogged = true
     }
 
     @CallSuper
@@ -94,7 +94,7 @@
     }
 
     private fun initScreenShareOptions() {
-        selectedScreenShareOption = screenShareOptions.first()
+        selectedScreenShareOption = screenShareOptions.first { it.mode == defaultSelectedMode }
         warning.text = warningText
         initScreenShareSpinner()
     }
@@ -120,6 +120,8 @@
                 }
             }
         screenShareModeSpinner.isLongClickable = false
+        val defaultModePosition = screenShareOptions.indexOfFirst { it.mode == defaultSelectedMode }
+        screenShareModeSpinner.setSelection(defaultModePosition, /* animate= */ false)
     }
 
     override fun onItemSelected(adapterView: AdapterView<*>?, view: View, pos: Int, id: Long) {
@@ -140,7 +142,10 @@
     }
 
     protected fun setStartButtonOnClickListener(listener: View.OnClickListener?) {
-        startButton.setOnClickListener(listener)
+        startButton.setOnClickListener { view ->
+            shouldLogCancel = false
+            listener?.onClick(view)
+        }
     }
 
     protected fun setCancelButtonOnClickListener(listener: View.OnClickListener?) {
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 17f9caf..da9e00d 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java
@@ -319,7 +319,7 @@
         final UserHandle hostUserHandle = getHostUserHandle();
         if (mScreenCaptureDevicePolicyResolver.get()
                 .isScreenCaptureCompletelyDisabled(hostUserHandle)) {
-            AlertDialog dialog = mScreenCaptureDisabledDialogDelegate.createDialog();
+            AlertDialog dialog = mScreenCaptureDisabledDialogDelegate.createPlainDialog();
             setUpDialog(dialog);
             dialog.show();
             return true;
diff --git a/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt b/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt
index e7b6e63..1704812 100644
--- a/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt
+++ b/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt
@@ -19,6 +19,7 @@
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.SceneKey
 import com.android.systemui.dagger.SysUISingleton
+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.Scenes
@@ -27,6 +28,7 @@
 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.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING
+import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED
 import dagger.Lazy
 import javax.inject.Inject
 
@@ -38,8 +40,10 @@
 class SceneContainerPlugin
 @Inject
 constructor(
-    private val interactor: Lazy<SceneInteractor>,
+    private val sceneInteractor: Lazy<SceneInteractor>,
+    private val occlusionInteractor: Lazy<SceneContainerOcclusionInteractor>,
 ) {
+
     /**
      * Returns an override value for the given [flag] or `null` if the scene framework isn't enabled
      * or if the flag value doesn't need to be overridden.
@@ -49,10 +53,18 @@
             return null
         }
 
-        val transitionState = interactor.get().transitionState.value
+        val transitionState = sceneInteractor.get().transitionState.value
         val idleTransitionStateOrNull = transitionState as? ObservableTransitionState.Idle
         val currentSceneOrNull = idleTransitionStateOrNull?.scene
-        return currentSceneOrNull?.let { sceneKey -> EvaluatorByFlag[flag]?.invoke(sceneKey) }
+        val invisibleDueToOcclusion = occlusionInteractor.get().invisibleDueToOcclusion.value
+        return currentSceneOrNull?.let { sceneKey ->
+            EvaluatorByFlag[flag]?.invoke(
+                SceneContainerPluginState(
+                    scene = sceneKey,
+                    invisibleDueToOcclusion = invisibleDueToOcclusion,
+                )
+            )
+        }
     }
 
     companion object {
@@ -67,12 +79,24 @@
          * to be overridden by the scene framework.
          */
         val EvaluatorByFlag =
-            mapOf<Int, (SceneKey) -> Boolean>(
-                SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE to { it != Scenes.Gone },
-                SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED to { it == Scenes.Shade },
-                SYSUI_STATE_QUICK_SETTINGS_EXPANDED to { it == Scenes.QuickSettings },
-                SYSUI_STATE_BOUNCER_SHOWING to { it == Scenes.Bouncer },
-                SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING to { it == Scenes.Lockscreen },
+            mapOf<Int, (SceneContainerPluginState) -> Boolean>(
+                SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE to { it.scene != Scenes.Gone },
+                SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED to { it.scene == Scenes.Shade },
+                SYSUI_STATE_QUICK_SETTINGS_EXPANDED to { it.scene == Scenes.QuickSettings },
+                SYSUI_STATE_BOUNCER_SHOWING to { it.scene == Scenes.Bouncer },
+                SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING to
+                    {
+                        it.scene == Scenes.Lockscreen && !it.invisibleDueToOcclusion
+                    },
+                SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED to
+                    {
+                        it.scene == Scenes.Lockscreen && it.invisibleDueToOcclusion
+                    },
             )
     }
+
+    data class SceneContainerPluginState(
+        val scene: SceneKey,
+        val invisibleDueToOcclusion: Boolean,
+    )
 }
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
index d49a513..63989ef 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
@@ -56,6 +56,7 @@
 
 import androidx.annotation.NonNull;
 
+import com.android.internal.accessibility.common.ShortcutConstants;
 import com.android.systemui.Dumpable;
 import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
 import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
@@ -380,7 +381,7 @@
             // permission
             final List<String> a11yButtonTargets =
                     mAccessibilityManager.getAccessibilityShortcutTargets(
-                            AccessibilityManager.ACCESSIBILITY_BUTTON);
+                            ShortcutConstants.UserShortcutType.SOFTWARE);
             final int requestingServices = a11yButtonTargets.size();
 
             clickable = requestingServices >= 1;
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index 4fe3a11..ade56c4 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -85,6 +85,7 @@
 import android.view.MotionEvent;
 import android.view.Surface;
 import android.view.View;
+import android.view.ViewConfiguration;
 import android.view.ViewTreeObserver;
 import android.view.ViewTreeObserver.InternalInsetsInfo;
 import android.view.ViewTreeObserver.OnComputeInternalInsetsListener;
@@ -186,6 +187,7 @@
     /** Allow some time inbetween the long press for back and recents. */
     private static final int LOCK_TO_APP_GESTURE_TOLERANCE = 200;
     private static final long AUTODIM_TIMEOUT_MS = 2250;
+    private static final float QUICKSTEP_TOUCH_SLOP_RATIO_TWO_BUTTON = 3f;
 
     private final Context mContext;
     private final Bundle mSavedState;
@@ -223,6 +225,7 @@
     private final int mNavColorSampleMargin;
     private EdgeBackGestureHandler mEdgeBackGestureHandler;
     private NavigationBarFrame mFrame;
+    private MotionEvent mCurrentDownEvent;
 
     private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
 
@@ -238,6 +241,8 @@
     private int mLayoutDirection;
 
     private Optional<Long> mHomeButtonLongPressDurationMs;
+    private Optional<Long> mOverrideHomeButtonLongPressDurationMs = Optional.empty();
+    private Optional<Float> mOverrideHomeButtonLongPressSlopMultiplier = Optional.empty();
 
     /** @see android.view.WindowInsetsController#setSystemBarsAppearance(int, int) */
     private @Appearance int mAppearance;
@@ -405,6 +410,25 @@
         }
 
         @Override
+        public void setOverrideHomeButtonLongPress(long duration, float slopMultiplier) {
+            mOverrideHomeButtonLongPressDurationMs = Optional.of(duration)
+                    .filter(value -> value > 0);
+            mOverrideHomeButtonLongPressSlopMultiplier = Optional.of(slopMultiplier)
+                    .filter(value -> value > 0);
+            if (mOverrideHomeButtonLongPressDurationMs.isPresent()) {
+                Log.d(TAG, "Receive duration override: "
+                        + mOverrideHomeButtonLongPressDurationMs.get());
+            }
+            if (mOverrideHomeButtonLongPressSlopMultiplier.isPresent()) {
+                Log.d(TAG, "Receive slop multiplier override: "
+                        + mOverrideHomeButtonLongPressSlopMultiplier.get());
+            }
+            if (mView != null) {
+                reconfigureHomeLongClick();
+            }
+        }
+
+        @Override
         public void onHomeRotationEnabled(boolean enabled) {
             mView.getRotationButtonController().setHomeRotationEnabled(enabled);
         }
@@ -1016,7 +1040,10 @@
         if (mView.getHomeButton().getCurrentView() == null) {
             return;
         }
-        if (mHomeButtonLongPressDurationMs.isPresent() || !mLongPressHomeEnabled) {
+        if (mHomeButtonLongPressDurationMs.isPresent()
+                || mOverrideHomeButtonLongPressDurationMs.isPresent()
+                || mOverrideHomeButtonLongPressSlopMultiplier.isPresent()
+                || !mLongPressHomeEnabled) {
             mView.getHomeButton().getCurrentView().setLongClickable(false);
             mView.getHomeButton().getCurrentView().setHapticFeedbackEnabled(false);
             mView.getHomeButton().setOnLongClickListener(null);
@@ -1038,6 +1065,10 @@
         pw.println("  mStartingQuickSwitchRotation=" + mStartingQuickSwitchRotation);
         pw.println("  mCurrentRotation=" + mCurrentRotation);
         pw.println("  mHomeButtonLongPressDurationMs=" + mHomeButtonLongPressDurationMs);
+        pw.println("  mOverrideHomeButtonLongPressDurationMs="
+                + mOverrideHomeButtonLongPressDurationMs);
+        pw.println("  mOverrideHomeButtonLongPressSlopMultiplier="
+                + mOverrideHomeButtonLongPressSlopMultiplier);
         pw.println("  mLongPressHomeEnabled=" + mLongPressHomeEnabled);
         pw.println("  mNavigationBarWindowState="
                 + windowStateToString(mNavigationBarWindowState));
@@ -1331,6 +1362,10 @@
         final Optional<CentralSurfaces> centralSurfacesOptional = mCentralSurfacesOptionalLazy.get();
         switch (event.getAction()) {
             case MotionEvent.ACTION_DOWN:
+                if (mCurrentDownEvent != null) {
+                    mCurrentDownEvent.recycle();
+                }
+                mCurrentDownEvent = MotionEvent.obtain(event);
                 mHomeBlockedThisTouch = false;
                 if (mTelecomManagerOptional.isPresent()
                         && mTelecomManagerOptional.get().isRinging()) {
@@ -1342,9 +1377,45 @@
                     }
                 }
                 if (mLongPressHomeEnabled) {
-                    mHomeButtonLongPressDurationMs.ifPresent(longPressDuration -> {
-                        mHandler.postDelayed(mOnVariableDurationHomeLongClick, longPressDuration);
-                    });
+                    if (mOverrideHomeButtonLongPressDurationMs.isPresent()) {
+                        Log.d(TAG, "ACTION_DOWN Launcher override duration: "
+                                + mOverrideHomeButtonLongPressDurationMs.get());
+                        mHandler.postDelayed(mOnVariableDurationHomeLongClick,
+                                mOverrideHomeButtonLongPressDurationMs.get());
+                    } else if (mOverrideHomeButtonLongPressSlopMultiplier.isPresent()) {
+                        // If override timeout doesn't exist but override touch slop exists, we use
+                        // system default long press duration
+                        Log.d(TAG, "ACTION_DOWN default duration: "
+                                + ViewConfiguration.getLongPressTimeout());
+                        mHandler.postDelayed(mOnVariableDurationHomeLongClick,
+                                ViewConfiguration.getLongPressTimeout());
+                    } else {
+                        mHomeButtonLongPressDurationMs.ifPresent(longPressDuration -> {
+                            Log.d(TAG, "ACTION_DOWN original duration: " + longPressDuration);
+                            mHandler.postDelayed(mOnVariableDurationHomeLongClick,
+                                    longPressDuration);
+                        });
+                    }
+                }
+                break;
+            case MotionEvent.ACTION_MOVE:
+                if (!mHandler.hasCallbacks(mOnVariableDurationHomeLongClick)) {
+                    Log.w(TAG, "No callback. Don't handle touch slop.");
+                    break;
+                }
+                float customSlopMultiplier = mOverrideHomeButtonLongPressSlopMultiplier.orElse(1f);
+                float touchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();
+                float calculatedTouchSlop =
+                        customSlopMultiplier * QUICKSTEP_TOUCH_SLOP_RATIO_TWO_BUTTON * touchSlop;
+                float touchSlopSquared = calculatedTouchSlop * calculatedTouchSlop;
+
+                float dx = event.getX() - mCurrentDownEvent.getX();
+                float dy = event.getY() - mCurrentDownEvent.getY();
+                double distanceSquared = (dx * dx) + (dy * dy);
+                if (distanceSquared > touchSlopSquared) {
+                    Log.i(TAG, "Touch slop passed. Abort.");
+                    mView.abortCurrentGesture();
+                    mHandler.removeCallbacks(mOnVariableDurationHomeLongClick);
                 }
                 break;
             case MotionEvent.ACTION_UP:
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt
index b3d848c..30f33a3 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt
@@ -34,7 +34,6 @@
 import androidx.core.os.postDelayed
 import androidx.core.view.isVisible
 import androidx.dynamicanimation.animation.DynamicAnimation
-import com.android.internal.jank.Cuj.CUJ_BACK_PANEL_ARROW
 import com.android.internal.jank.InteractionJankMonitor
 import com.android.internal.util.LatencyTracker
 import com.android.systemui.dagger.qualifiers.Main
@@ -1039,7 +1038,7 @@
     override fun dump(pw: PrintWriter) {
         pw.println("$TAG:")
         pw.println("  currentState=$currentState")
-        pw.println("  isLeftPanel=$mView.isLeftPanel")
+        pw.println("  isLeftPanel=${mView.isLeftPanel}")
     }
 
     init {
diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
index 0a880293..9e31379 100644
--- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
+++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java
@@ -23,6 +23,7 @@
 import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY;
 import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN;
 import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD;
+import static android.appwidget.flags.Flags.drawDataParcel;
 import static android.appwidget.flags.Flags.generatedPreviews;
 import static android.content.Intent.ACTION_BOOT_COMPLETED;
 import static android.content.Intent.ACTION_PACKAGE_ADDED;
@@ -71,6 +72,7 @@
 import android.content.pm.ShortcutInfo;
 import android.graphics.drawable.Icon;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.os.ServiceManager;
@@ -111,6 +113,8 @@
 import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
 import com.android.wm.shell.bubbles.Bubbles;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -1452,13 +1456,54 @@
         if (DEBUG) {
             Log.d(TAG, "Updating People Space widget preview for user " + user.getIdentifier());
         }
+        if (!drawDataParcel() || (!Build.IS_USERDEBUG && !Build.IS_ENG)) {
+            updateGeneratedPreviewForUserInternal(provider, user,
+                    new RemoteViews(mContext.getPackageName(),
+                        R.layout.people_space_placeholder_layout));
+        } else {
+            mBgExecutor.execute(updateGeneratedPreviewFromDrawInstructionsForUser(provider, user));
+        }
+    }
+
+    private void updateGeneratedPreviewForUserInternal(@NonNull final ComponentName provider,
+            @NonNull final UserHandle user, @NonNull final RemoteViews rv) {
         boolean success = mAppWidgetManager.setWidgetPreview(
                 provider, WIDGET_CATEGORY_HOME_SCREEN | WIDGET_CATEGORY_KEYGUARD,
-                new RemoteViews(mContext.getPackageName(),
-                        R.layout.people_space_placeholder_layout));
+                rv);
         if (DEBUG && !success) {
             Log.d(TAG, "Failed to update generated preview for user " + user.getIdentifier());
         }
         mUpdatedPreviews.put(user.getIdentifier(), success);
     }
+
+    private Runnable updateGeneratedPreviewFromDrawInstructionsForUser(
+            @NonNull final ComponentName provider, @NonNull final UserHandle user) {
+        return () -> {
+            if (DEBUG) {
+                Log.d(TAG, "Parsing People Space widget preview from binary for user "
+                        + user.getIdentifier());
+            }
+            if (!generatedPreviews() || mUpdatedPreviews.get(user.getIdentifier())
+                    || !mUserManager.isUserUnlocked(user)) {
+                // Conditions may have changed given this is called from background thread
+                return;
+            }
+            try (InputStream is = mContext.getResources().openRawResource(R.raw.widget)
+            ) {
+                final byte[] preview = new byte[(int) is.available()];
+                final int result = is.read(preview);
+                if (DEBUG && result == -1) {
+                    Log.d(TAG, "Failed parsing previews from binary for user "
+                            + user.getIdentifier());
+                }
+                updateGeneratedPreviewForUserInternal(provider, user, new RemoteViews(
+                        new RemoteViews.DrawInstructions.Builder(
+                                Collections.singletonList(preview)).build()));
+            } catch (IOException e) {
+                if (DEBUG) {
+                    Log.e(TAG, "Failed to generate preview for people widget", e);
+                }
+            }
+        };
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt b/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt
index 3f8834a..9380d44 100644
--- a/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt
@@ -281,5 +281,10 @@
                 powerButtonLaunchGestureTriggeredDuringSleep = false,
             )
         }
+
+        /** Helper method for tests to simulate the device screen state change event. */
+        fun PowerInteractor.setScreenPowerState(screenPowerState: ScreenPowerState) {
+            this.onScreenPowerStateUpdated(screenPowerState)
+        }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragmentLegacy.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragmentLegacy.java
index 3b3844a..e424975 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragmentLegacy.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragmentLegacy.java
@@ -31,7 +31,7 @@
 import com.android.systemui.plugins.qs.QSContainerController;
 import com.android.systemui.qs.dagger.QSFragmentComponent;
 import com.android.systemui.res.R;
-import com.android.systemui.statusbar.policy.BrightnessMirrorController;
+import com.android.systemui.settings.brightness.MirrorController;
 import com.android.systemui.util.LifecycleFragment;
 
 import java.util.function.Consumer;
@@ -182,7 +182,7 @@
     }
 
     public void setBrightnessMirrorController(
-            BrightnessMirrorController brightnessMirrorController) {
+            MirrorController brightnessMirrorController) {
         if (mQsImpl != null) {
             mQsImpl.setBrightnessMirrorController(brightnessMirrorController);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSImpl.java
index a000d63..a0607e9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSImpl.java
@@ -61,6 +61,7 @@
 import com.android.systemui.qs.logging.QSLogger;
 import com.android.systemui.res.R;
 import com.android.systemui.scene.shared.flag.SceneContainerFlags;
+import com.android.systemui.settings.brightness.MirrorController;
 import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.StatusBarState;
@@ -68,7 +69,6 @@
 import com.android.systemui.statusbar.disableflags.DisableFlagsLogger;
 import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
 import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.policy.BrightnessMirrorController;
 import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
 import com.android.systemui.util.Utils;
 
@@ -544,7 +544,7 @@
     }
 
     public void setBrightnessMirrorController(
-            BrightnessMirrorController brightnessMirrorController) {
+            @Nullable MirrorController brightnessMirrorController) {
         mQSPanelController.setBrightnessMirror(brightnessMirrorController);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
index cd65119..55dc485 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java
@@ -24,6 +24,8 @@
 import android.view.MotionEvent;
 import android.view.View;
 
+import androidx.annotation.Nullable;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.UiEventLogger;
 import com.android.systemui.dump.DumpManager;
@@ -38,9 +40,9 @@
 import com.android.systemui.settings.brightness.BrightnessController;
 import com.android.systemui.settings.brightness.BrightnessMirrorHandler;
 import com.android.systemui.settings.brightness.BrightnessSliderController;
+import com.android.systemui.settings.brightness.MirrorController;
 import com.android.systemui.statusbar.VibratorHelper;
 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
-import com.android.systemui.statusbar.policy.BrightnessMirrorController;
 import com.android.systemui.statusbar.policy.SplitShadeStateController;
 import com.android.systemui.tuner.TunerService;
 
@@ -139,6 +141,7 @@
         mBrightnessMirrorHandler.onQsPanelAttached();
         PagedTileLayout pagedTileLayout= ((PagedTileLayout) mView.getOrCreateTileLayout());
         pagedTileLayout.setOnTouchListener(mTileLayoutTouchListener);
+        maybeReinflateBrightnessSlider();
     }
 
     @Override
@@ -157,15 +160,18 @@
     @Override
     protected void onConfigurationChanged() {
         mView.updateResources();
+        maybeReinflateBrightnessSlider();
+        if (mView.isListening()) {
+            refreshAllTiles();
+        }
+    }
+
+    private void maybeReinflateBrightnessSlider() {
         int newDensity = mView.getResources().getConfiguration().densityDpi;
         if (newDensity != mLastDensity) {
             mLastDensity = newDensity;
             reinflateBrightnessSlider();
         }
-
-        if (mView.isListening()) {
-            refreshAllTiles();
-        }
     }
 
     private void reinflateBrightnessSlider() {
@@ -210,7 +216,7 @@
         }
     }
 
-    public void setBrightnessMirror(BrightnessMirrorController brightnessMirrorController) {
+    public void setBrightnessMirror(@Nullable MirrorController brightnessMirrorController) {
         mBrightnessMirrorHandler.setController(brightnessMirrorController);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
index 1aef920..8d3500a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java
@@ -29,6 +29,7 @@
 import com.android.systemui.qs.QSHost;
 import com.android.systemui.qs.ReduceBrightColorsController;
 import com.android.systemui.qs.external.QSExternalModule;
+import com.android.systemui.qs.panels.dagger.PanelsModule;
 import com.android.systemui.qs.pipeline.dagger.QSPipelineModule;
 import com.android.systemui.qs.tileimpl.QSTileImpl;
 import com.android.systemui.qs.tiles.di.QSTilesModule;
@@ -44,21 +45,22 @@
 import com.android.systemui.statusbar.policy.WalletController;
 import com.android.systemui.util.settings.SecureSettings;
 
-import java.util.Map;
-
-import javax.inject.Named;
-
 import dagger.Binds;
 import dagger.Module;
 import dagger.Provides;
 import dagger.multibindings.Multibinds;
 
+import java.util.Map;
+
+import javax.inject.Named;
+
 /**
  * Module for QS dependencies
  */
 @Module(subcomponents = {QSFragmentComponent.class, QSSceneComponent.class},
         includes = {
                 MediaModule.class,
+                PanelsModule.class,
                 QSExternalModule.class,
                 QSFlagsModule.class,
                 QSHostModule.class,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/flags/NewQsUI.kt b/packages/SystemUI/src/com/android/systemui/qs/flags/NewQsUI.kt
new file mode 100644
index 0000000..8af5665
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/flags/NewQsUI.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.qs.flags
+
+import com.android.systemui.Flags
+import com.android.systemui.flags.FlagToken
+import com.android.systemui.flags.RefactorFlagUtils
+
+/** Helper for reading or using the notification avalanche suppression flag state. */
+@Suppress("NOTHING_TO_INLINE")
+object NewQsUI {
+    /** The aconfig flag name */
+    const val FLAG_NAME = Flags.FLAG_QS_UI_REFACTOR
+
+    /** A token used for dependency declaration */
+    val token: FlagToken
+        get() = FlagToken(FLAG_NAME, isEnabled)
+
+    /** Is the refactor enabled */
+    @JvmStatic
+    inline val isEnabled
+        get() = Flags.qsUiRefactor()
+
+    /**
+     * 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/qs/panels/dagger/PanelsModule.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/dagger/PanelsModule.kt
new file mode 100644
index 0000000..1307296
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/dagger/PanelsModule.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.dagger
+
+import com.android.systemui.qs.panels.data.repository.IconTilesRepository
+import com.android.systemui.qs.panels.data.repository.IconTilesRepositoryImpl
+import dagger.Binds
+import dagger.Module
+
+@Module
+interface PanelsModule {
+    @Binds fun bindIconTilesRepository(impl: IconTilesRepositoryImpl): IconTilesRepository
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/IconTilesRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/IconTilesRepository.kt
new file mode 100644
index 0000000..92f87e7
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/IconTilesRepository.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.qs.panels.data.repository
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.qs.pipeline.shared.TileSpec
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.flowOf
+
+/** Repository for retrieving the list of [TileSpec] to be displayed as icons. */
+interface IconTilesRepository {
+    val iconTilesSpecs: Flow<Set<TileSpec>>
+}
+
+@SysUISingleton
+class IconTilesRepositoryImpl @Inject constructor() : IconTilesRepository {
+
+    /** Set of toggleable tiles that are suitable for being shown as an icon. */
+    override val iconTilesSpecs: Flow<Set<TileSpec>> =
+        flowOf(
+            setOf(
+                TileSpec.create("airplane"),
+                TileSpec.create("battery"),
+                TileSpec.create("cameratoggle"),
+                TileSpec.create("cast"),
+                TileSpec.create("color_correction"),
+                TileSpec.create("inversion"),
+                TileSpec.create("saver"),
+                TileSpec.create("dnd"),
+                TileSpec.create("flashlight"),
+                TileSpec.create("location"),
+                TileSpec.create("mictoggle"),
+                TileSpec.create("nfc"),
+                TileSpec.create("night"),
+                TileSpec.create("rotation")
+            )
+        )
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractor.kt
new file mode 100644
index 0000000..367c670
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractor.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.qs.panels.domain.interactor
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.qs.panels.data.repository.IconTilesRepository
+import com.android.systemui.qs.pipeline.shared.TileSpec
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+
+/** Interactor for retrieving the list of [TileSpec] to be displayed as icons. */
+@SysUISingleton
+class IconTilesInteractor @Inject constructor(private val repo: IconTilesRepository) {
+    val iconTilesSpecs: Flow<Set<TileSpec>> = repo.iconTilesSpecs
+}
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 e1c543f..3004485 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
@@ -181,11 +181,14 @@
 
     /** Visuo-haptic long-press effects */
     private var longPressEffect: QSLongPressEffect? = null
+    private val longPressEffectViewBinder = QSLongPressEffectViewBinder()
     private var initialLongPressProperties: QSLongPressProperties? = null
     private var finalLongPressProperties: QSLongPressProperties? = null
     private val colorEvaluator = ArgbEvaluator.getInstance()
     val hasLongPressEffect: Boolean
         get() = longPressEffect != null
+    @VisibleForTesting val isLongPressEffectBound: Boolean
+        get() = longPressEffectViewBinder.isBound
 
     init {
         val typedValue = TypedValue()
@@ -616,11 +619,14 @@
                 // set the valid long-press effect as the touch listener
                 showRippleEffect = false
                 setOnTouchListener(longPressEffect)
-                QSLongPressEffectViewBinder.bind(this, longPressEffect)
+                if (!longPressEffectViewBinder.isBound) {
+                    longPressEffectViewBinder.bind(this, state.spec, longPressEffect)
+                }
             } else {
                 // Long-press effects might have been enabled before but the new state does not
                 // handle a long-press. In this case, we go back to the behaviour of a regular tile
                 // and clean-up the resources
+                longPressEffectViewBinder.dispose()
                 showRippleEffect = isClickable
                 setOnTouchListener(null)
                 longPressEffect = null
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SubtitleArrayMapping.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SubtitleArrayMapping.kt
index 15b8cfb..f34389e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SubtitleArrayMapping.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SubtitleArrayMapping.kt
@@ -52,6 +52,7 @@
         subtitleIdsMap["color_correction"] = R.array.tile_states_color_correction
         subtitleIdsMap["dream"] = R.array.tile_states_dream
         subtitleIdsMap["font_scaling"] = R.array.tile_states_font_scaling
+        subtitleIdsMap["hearing_devices"] = R.array.tile_states_hearing_devices
     }
 
     /** Get the subtitle resource id of the given tile */
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
index b0707db..6eae32a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
@@ -39,6 +39,7 @@
 import com.android.settingslib.Utils;
 import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.systemui.bluetooth.qsdialog.BluetoothTileDialogViewModel;
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.flags.FeatureFlags;
@@ -51,7 +52,6 @@
 import com.android.systemui.qs.QsEventLogger;
 import com.android.systemui.qs.logging.QSLogger;
 import com.android.systemui.qs.tileimpl.QSTileImpl;
-import com.android.systemui.qs.tiles.dialog.bluetooth.BluetoothTileDialogViewModel;
 import com.android.systemui.res.R;
 import com.android.systemui.statusbar.policy.BluetoothController;
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
index dc42b5c..b27b974 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
@@ -63,6 +63,7 @@
 import com.android.systemui.statusbar.policy.CastController.CastDevice;
 import com.android.systemui.statusbar.policy.HotspotController;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.DialogKt;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -245,6 +246,10 @@
                             new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
                                     INTERACTION_JANK_TAG));
                 } else {
+                    if (dialog.getWindow() != null) {
+                        DialogKt.registerAnimationOnBackInvoked(dialog,
+                                dialog.getWindow().getDecorView());
+                    }
                     dialog.show();
                 }
             });
@@ -272,7 +277,7 @@
                 state.secondaryLabel = getDeviceName(device);
                 state.stateDescription = state.stateDescription + ","
                         + mContext.getString(
-                                R.string.accessibility_cast_name, state.label);
+                        R.string.accessibility_cast_name, state.label);
                 connecting = false;
                 break;
             } else if (device.state == CastDevice.STATE_CONNECTING) {
@@ -342,14 +347,14 @@
     };
 
     private final SignalCallback mSignalCallback = new SignalCallback() {
-                @Override
-                public void setWifiIndicators(@NonNull WifiIndicators indicators) {
-                    // statusIcon.visible has the connected status information
-                    boolean enabledAndConnected = indicators.enabled
-                            && (indicators.qsIcon != null && indicators.qsIcon.visible);
-                    setCastTransportAllowed(enabledAndConnected);
-                }
-            };
+        @Override
+        public void setWifiIndicators(@NonNull WifiIndicators indicators) {
+            // statusIcon.visible has the connected status information
+            boolean enabledAndConnected = indicators.enabled
+                    && (indicators.qsIcon != null && indicators.qsIcon.visible);
+            setCastTransportAllowed(enabledAndConnected);
+        }
+    };
 
     private final HotspotController.Callback mHotspotCallback =
             new HotspotController.Callback() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HearingDevicesTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HearingDevicesTile.java
new file mode 100644
index 0000000..81a2026
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HearingDevicesTile.java
@@ -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.qs.tiles;
+
+import android.content.Intent;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.systemui.Flags;
+import com.android.systemui.accessibility.hearingaid.HearingDevicesDialogManager;
+import com.android.systemui.dagger.qualifiers.Background;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.plugins.qs.QSTile.State;
+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 javax.inject.Inject;
+
+/** Quick settings tile: Hearing Devices **/
+public class HearingDevicesTile extends QSTileImpl<State> {
+
+    public static final String TILE_SPEC = "hearing_devices";
+
+    private final HearingDevicesDialogManager mDialogManager;
+
+    @Inject
+    public HearingDevicesTile(
+            QSHost host,
+            QsEventLogger uiEventLogger,
+            @Background Looper backgroundLooper,
+            @Main Handler mainHandler,
+            FalsingManager falsingManager,
+            MetricsLogger metricsLogger,
+            StatusBarStateController statusBarStateController,
+            ActivityStarter activityStarter,
+            QSLogger qsLogger,
+            HearingDevicesDialogManager hearingDevicesDialogManager
+    ) {
+        super(host, uiEventLogger, backgroundLooper, mainHandler, falsingManager, metricsLogger,
+                statusBarStateController, activityStarter, qsLogger);
+        mDialogManager = hearingDevicesDialogManager;
+    }
+
+    @Override
+    public State newTileState() {
+        return new State();
+    }
+
+    @Override
+    protected void handleClick(@Nullable View view) {
+        mUiHandler.post(() -> mDialogManager.showDialog(view));
+    }
+
+    @Override
+    protected void handleUpdateState(State state, Object arg) {
+        state.label = mContext.getString(R.string.quick_settings_hearing_devices_label);
+        state.icon = ResourceIcon.get(R.drawable.qs_hearing_devices_icon);
+    }
+
+    @Nullable
+    @Override
+    public Intent getLongClickIntent() {
+        return new Intent(Settings.ACTION_HEARING_DEVICES_SETTINGS);
+    }
+
+    @Override
+    public CharSequence getTileLabel() {
+        return mContext.getString(R.string.quick_settings_hearing_devices_label);
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return Flags.hearingAidsQsTileDialog();
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
index 1b73225..e1b742e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
@@ -182,12 +182,19 @@
 
     @Override
     public boolean isAvailable() {
+        if (isWalletRoleAvailable()) {
+            return !mPackageManager.hasSystemFeature(FEATURE_CHROME_OS);
+        }
         return mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)
                 && !mPackageManager.hasSystemFeature(FEATURE_CHROME_OS)
                 && mSecureSettings.getStringForUser(NFC_PAYMENT_DEFAULT_COMPONENT,
                     UserHandle.USER_CURRENT) != null;
     }
 
+    private boolean isWalletRoleAvailable() {
+        return mHost.getUserId() == UserHandle.USER_SYSTEM && mController.isWalletRoleAvailable();
+    }
+
     @Nullable
     @Override
     public Intent getLongClickIntent() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java
index 2f8fe42..3eeb2a3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java
@@ -25,6 +25,7 @@
 import android.provider.Settings;
 import android.safetycenter.SafetyCenterManager;
 import android.service.quicksettings.Tile;
+import android.text.TextUtils;
 import android.view.View;
 import android.widget.Switch;
 
@@ -127,7 +128,7 @@
         } else {
             state.secondaryLabel = mContext.getString(R.string.quick_settings_camera_mic_available);
         }
-        state.contentDescription = state.label;
+        state.contentDescription = TextUtils.concat(state.label, ", ", state.secondaryLabel);
         state.expandedAccessibilityClassName = Switch.class.getName();
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/logging/QSTileLogger.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/logging/QSTileLogger.kt
index bc016bd..065e89f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/logging/QSTileLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/logging/QSTileLogger.kt
@@ -88,6 +88,7 @@
     fun logUserActionRejectedByPolicy(
         userAction: QSTileUserAction,
         tileSpec: TileSpec,
+        restriction: String,
     ) {
         tileSpec
             .getLogBuffer()
@@ -95,7 +96,7 @@
                 tileSpec.getLogTag(),
                 LogLevel.DEBUG,
                 { str1 = userAction.toLogString() },
-                { "tile $str1: rejected by policy" }
+                { "tile $str1: rejected by policy, restriction: $restriction" }
             )
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt
index 45c6fff..8782524 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt
@@ -178,7 +178,8 @@
     /**
      * Creates a user input flow which:
      * - filters false inputs with [falsingManager]
-     * - takes care of a tile being disable by policy using [disabledByPolicyInteractor]
+     * - takes care of a tile being disable by policy using [disabledByPolicyInteractor]. The
+     *   restrictions will be checked sequentially and the first one to block will be considered.
      * - notifies [userActionInteractor] about the action
      * - logs it accordingly using [qsTileLogger] and [qsTileAnalytics]
      *
@@ -201,18 +202,22 @@
             .onEach { userActionInteractor().handleInput(it.input) }
             .flowOn(backgroundDispatcher)
 
+    /**
+     * The restrictions will be checked sequentially and the first one to block will be considered.
+     */
     private fun Flow<QSTileUserAction>.filterByPolicy(user: UserHandle): Flow<QSTileUserAction> =
         config.policy.let { policy ->
             when (policy) {
                 is QSTilePolicy.NoRestrictions -> this@filterByPolicy
                 is QSTilePolicy.Restricted ->
                     filter { action ->
-                        val result =
-                            disabledByPolicyInteractor.isDisabled(user, policy.userRestriction)
-                        !disabledByPolicyInteractor.handlePolicyResult(result).also { isDisabled ->
-                            if (isDisabled) {
-                                qsTileLogger.logUserActionRejectedByPolicy(action, spec)
+                        policy.userRestrictions.none {
+                            val result = disabledByPolicyInteractor.isDisabled(user, it)
+                            val handleResult = disabledByPolicyInteractor.handlePolicyResult(result)
+                            if (handleResult) {
+                                qsTileLogger.logUserActionRejectedByPolicy(action, spec, it)
                             }
+                            handleResult
                         }
                     }
             }
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 1410473..a531ee6 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
@@ -1450,7 +1450,8 @@
 
     Intent getConfiguratorQrCodeGeneratorIntentOrNull(WifiEntry wifiEntry) {
         if (!mFeatureFlags.isEnabled(Flags.SHARE_WIFI_QS_BUTTON) || wifiEntry == null
-                || mWifiManager == null || !wifiEntry.canShare()) {
+                || mWifiManager == null || !wifiEntry.canShare()
+                || wifiEntry.getWifiConfiguration() == null) {
             return null;
         }
         Intent intent = new Intent();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnInteractor.kt
deleted file mode 100644
index 59fc81c..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnInteractor.kt
+++ /dev/null
@@ -1,52 +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.qs.tiles.dialog.bluetooth
-
-import android.util.Log
-import com.android.systemui.dagger.SysUISingleton
-import javax.inject.Inject
-
-/** Interactor class responsible for interacting with the Bluetooth Auto-On feature. */
-@SysUISingleton
-class BluetoothAutoOnInteractor
-@Inject
-constructor(
-    private val bluetoothAutoOnRepository: BluetoothAutoOnRepository,
-) {
-
-    val isEnabled = bluetoothAutoOnRepository.isAutoOn
-
-    /** Checks if the auto on feature is supported. */
-    suspend fun isAutoOnSupported(): Boolean = bluetoothAutoOnRepository.isAutoOnSupported()
-
-    /**
-     * Sets enabled or disabled based on the provided value.
-     *
-     * @param value `true` to enable the feature, `false` to disable it.
-     */
-    suspend fun setEnabled(value: Boolean) {
-        if (!isAutoOnSupported()) {
-            Log.e(TAG, "Trying to set toggle value while feature not available.")
-        } else {
-            bluetoothAutoOnRepository.setAutoOn(value)
-        }
-    }
-
-    companion object {
-        private const val TAG = "BluetoothAutoOnInteractor"
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnRepository.kt
deleted file mode 100644
index 9ee582a..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnRepository.kt
+++ /dev/null
@@ -1,131 +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.tiles.dialog.bluetooth
-
-import android.bluetooth.BluetoothAdapter
-import android.util.Log
-import com.android.settingslib.bluetooth.BluetoothCallback
-import com.android.settingslib.bluetooth.LocalBluetoothManager
-import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
-import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.dagger.qualifiers.Background
-import javax.inject.Inject
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.flow.flowOn
-import kotlinx.coroutines.flow.onStart
-import kotlinx.coroutines.flow.stateIn
-import kotlinx.coroutines.withContext
-
-/**
- * Repository class responsible for managing the Bluetooth Auto-On feature settings for the current
- * user.
- */
-@SysUISingleton
-class BluetoothAutoOnRepository
-@Inject
-constructor(
-    localBluetoothManager: LocalBluetoothManager?,
-    private val bluetoothAdapter: BluetoothAdapter?,
-    @Application private val coroutineScope: CoroutineScope,
-    @Background private val backgroundDispatcher: CoroutineDispatcher,
-) {
-
-    // Flow representing the auto on state for the current user
-    internal val isAutoOn: Flow<Boolean> =
-        localBluetoothManager?.eventManager?.let { eventManager ->
-            conflatedCallbackFlow {
-                    val listener =
-                        object : BluetoothCallback {
-                            override fun onAutoOnStateChanged(autoOnState: Int) {
-                                super.onAutoOnStateChanged(autoOnState)
-                                if (
-                                    autoOnState == BluetoothAdapter.AUTO_ON_STATE_ENABLED ||
-                                        autoOnState == BluetoothAdapter.AUTO_ON_STATE_DISABLED
-                                ) {
-                                    trySendWithFailureLogging(
-                                        autoOnState == BluetoothAdapter.AUTO_ON_STATE_ENABLED,
-                                        TAG,
-                                        "onAutoOnStateChanged"
-                                    )
-                                }
-                            }
-                        }
-                    eventManager.registerCallback(listener)
-                    awaitClose { eventManager.unregisterCallback(listener) }
-                }
-                .onStart { emit(isAutoOnEnabled()) }
-                .flowOn(backgroundDispatcher)
-                .stateIn(
-                    coroutineScope,
-                    SharingStarted.WhileSubscribed(replayExpirationMillis = 0),
-                    initialValue = false
-                )
-        }
-            ?: flowOf(false)
-
-    /**
-     * Checks if the auto on feature is supported for the current user.
-     *
-     * @throws Exception if an error occurs while checking auto-on support.
-     */
-    suspend fun isAutoOnSupported(): Boolean =
-        withContext(backgroundDispatcher) {
-            try {
-                bluetoothAdapter?.isAutoOnSupported ?: false
-            } catch (e: Exception) {
-                // Server could throw TimeoutException, InterruptedException or ExecutionException
-                Log.e(TAG, "Error calling isAutoOnSupported", e)
-                false
-            }
-        }
-
-    /** Sets the Bluetooth Auto-On for the current user. */
-    suspend fun setAutoOn(value: Boolean) {
-        withContext(backgroundDispatcher) {
-            try {
-                bluetoothAdapter?.setAutoOnEnabled(value)
-            } catch (e: Exception) {
-                // Server could throw IllegalStateException, TimeoutException, InterruptedException
-                // or ExecutionException
-                Log.e(TAG, "Error calling setAutoOnEnabled", e)
-            }
-        }
-    }
-
-    private suspend fun isAutoOnEnabled() =
-        withContext(backgroundDispatcher) {
-            try {
-                bluetoothAdapter?.isAutoOnEnabled ?: false
-            } catch (e: Exception) {
-                // Server could throw IllegalStateException, TimeoutException, InterruptedException
-                // or ExecutionException
-                Log.e(TAG, "Error calling isAutoOnEnabled", e)
-                false
-            }
-        }
-
-    private companion object {
-        const val TAG = "BluetoothAutoOnRepository"
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothStateInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothStateInteractor.kt
deleted file mode 100644
index 9c63a30..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothStateInteractor.kt
+++ /dev/null
@@ -1,90 +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.tiles.dialog.bluetooth
-
-import android.bluetooth.BluetoothAdapter
-import android.bluetooth.BluetoothAdapter.STATE_OFF
-import android.bluetooth.BluetoothAdapter.STATE_ON
-import com.android.settingslib.bluetooth.BluetoothCallback
-import com.android.settingslib.bluetooth.LocalBluetoothManager
-import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
-import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
-import javax.inject.Inject
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.stateIn
-
-/** Holds business logic for the Bluetooth Dialog's bluetooth and device connection state */
-@SysUISingleton
-internal class BluetoothStateInteractor
-@Inject
-constructor(
-    private val localBluetoothManager: LocalBluetoothManager?,
-    private val logger: BluetoothTileDialogLogger,
-    @Application private val coroutineScope: CoroutineScope,
-) {
-
-    internal val bluetoothStateUpdate: StateFlow<Boolean?> =
-        conflatedCallbackFlow {
-                val listener =
-                    object : BluetoothCallback {
-                        override fun onBluetoothStateChanged(bluetoothState: Int) {
-                            if (bluetoothState == STATE_ON || bluetoothState == STATE_OFF) {
-                                super.onBluetoothStateChanged(bluetoothState)
-                                logger.logBluetoothState(
-                                    BluetoothStateStage.BLUETOOTH_STATE_CHANGE_RECEIVED,
-                                    BluetoothAdapter.nameForState(bluetoothState)
-                                )
-                                trySendWithFailureLogging(
-                                    bluetoothState == STATE_ON,
-                                    TAG,
-                                    "onBluetoothStateChanged"
-                                )
-                            }
-                        }
-                    }
-                localBluetoothManager?.eventManager?.registerCallback(listener)
-                awaitClose { localBluetoothManager?.eventManager?.unregisterCallback(listener) }
-            }
-            .stateIn(
-                coroutineScope,
-                SharingStarted.WhileSubscribed(replayExpirationMillis = 0),
-                initialValue = null
-            )
-
-    internal var isBluetoothEnabled: Boolean
-        get() = localBluetoothManager?.bluetoothAdapter?.isEnabled == true
-        set(value) {
-            if (isBluetoothEnabled != value) {
-                localBluetoothManager?.bluetoothAdapter?.apply {
-                    if (value) enable() else disable()
-                    logger.logBluetoothState(
-                        BluetoothStateStage.BLUETOOTH_STATE_VALUE_SET,
-                        value.toString()
-                    )
-                }
-            }
-        }
-
-    companion object {
-        private const val TAG = "BtStateInteractor"
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogDelegate.kt
deleted file mode 100644
index a8d9e78..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogDelegate.kt
+++ /dev/null
@@ -1,423 +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.tiles.dialog.bluetooth
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.View.AccessibilityDelegate
-import android.view.View.GONE
-import android.view.View.INVISIBLE
-import android.view.View.VISIBLE
-import android.view.ViewGroup
-import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
-import android.view.accessibility.AccessibilityNodeInfo
-import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction
-import android.widget.ImageView
-import android.widget.ProgressBar
-import android.widget.Switch
-import android.widget.TextView
-import androidx.annotation.StringRes
-import androidx.recyclerview.widget.AsyncListDiffer
-import androidx.recyclerview.widget.DiffUtil
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import com.android.internal.logging.UiEventLogger
-import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.res.R
-import com.android.systemui.statusbar.phone.SystemUIDialog
-import com.android.systemui.util.time.SystemClock
-import dagger.assisted.Assisted
-import dagger.assisted.AssistedFactory
-import dagger.assisted.AssistedInject
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asSharedFlow
-import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.isActive
-import kotlinx.coroutines.withContext
-
-/** Dialog for showing active, connected and saved bluetooth devices. */
-class BluetoothTileDialogDelegate
-@AssistedInject
-internal constructor(
-    @Assisted private val initialUiProperties: BluetoothTileDialogViewModel.UiProperties,
-    @Assisted private val cachedContentHeight: Int,
-    @Assisted private val bluetoothToggleInitialValue: Boolean,
-    @Assisted private val bluetoothTileDialogCallback: BluetoothTileDialogCallback,
-    @Assisted private val dismissListener: Runnable,
-    @Main private val mainDispatcher: CoroutineDispatcher,
-    private val systemClock: SystemClock,
-    private val uiEventLogger: UiEventLogger,
-    private val logger: BluetoothTileDialogLogger,
-    private val systemuiDialogFactory: SystemUIDialog.Factory,
-) : SystemUIDialog.Delegate {
-
-    private val mutableBluetoothStateToggle: MutableStateFlow<Boolean> =
-        MutableStateFlow(bluetoothToggleInitialValue)
-    internal val bluetoothStateToggle
-        get() = mutableBluetoothStateToggle.asStateFlow()
-
-    private val mutableBluetoothAutoOnToggle: MutableStateFlow<Boolean?> = MutableStateFlow(null)
-    internal val bluetoothAutoOnToggle
-        get() = mutableBluetoothAutoOnToggle.asStateFlow()
-
-    private val mutableDeviceItemClick: MutableSharedFlow<DeviceItem> =
-        MutableSharedFlow(extraBufferCapacity = 1)
-    internal val deviceItemClick
-        get() = mutableDeviceItemClick.asSharedFlow()
-
-    private val mutableContentHeight: MutableSharedFlow<Int> =
-        MutableSharedFlow(extraBufferCapacity = 1)
-    internal val contentHeight
-        get() = mutableContentHeight.asSharedFlow()
-
-    private val deviceItemAdapter: Adapter = Adapter(bluetoothTileDialogCallback)
-
-    private var lastUiUpdateMs: Long = -1
-
-    private var lastItemRow: Int = -1
-
-    @AssistedFactory
-    internal interface Factory {
-        fun create(
-            initialUiProperties: BluetoothTileDialogViewModel.UiProperties,
-            cachedContentHeight: Int,
-            bluetoothEnabled: Boolean,
-            dialogCallback: BluetoothTileDialogCallback,
-            dimissListener: Runnable
-        ): BluetoothTileDialogDelegate
-    }
-
-    override fun createDialog(): SystemUIDialog {
-        return systemuiDialogFactory.create(this)
-    }
-
-    override fun onCreate(dialog: SystemUIDialog, savedInstanceState: Bundle?) {
-        SystemUIDialog.registerDismissListener(dialog, dismissListener)
-        uiEventLogger.log(BluetoothTileDialogUiEvent.BLUETOOTH_TILE_DIALOG_SHOWN)
-        val context = dialog.context
-
-        LayoutInflater.from(context).inflate(R.layout.bluetooth_tile_dialog, null).apply {
-            accessibilityPaneTitle = context.getText(R.string.accessibility_desc_quick_settings)
-            dialog.setContentView(this)
-        }
-
-        setupToggle(dialog)
-        setupRecyclerView(dialog)
-
-        getSubtitleTextView(dialog).text = context.getString(initialUiProperties.subTitleResId)
-        dialog.requireViewById<View>(R.id.done_button).setOnClickListener { dialog.dismiss() }
-        getSeeAllButton(dialog).setOnClickListener {
-            bluetoothTileDialogCallback.onSeeAllClicked(it)
-        }
-        getPairNewDeviceButton(dialog).setOnClickListener {
-            bluetoothTileDialogCallback.onPairNewDeviceClicked(it)
-        }
-        getScrollViewContent(dialog).apply {
-            minimumHeight =
-                resources.getDimensionPixelSize(initialUiProperties.scrollViewMinHeightResId)
-            layoutParams.height = maxOf(cachedContentHeight, minimumHeight)
-        }
-    }
-
-    override fun onStart(dialog: SystemUIDialog) {
-        lastUiUpdateMs = systemClock.elapsedRealtime()
-    }
-
-    override fun onStop(dialog: SystemUIDialog) {
-        mutableContentHeight.tryEmit(getScrollViewContent(dialog).measuredHeight)
-    }
-
-    internal suspend fun animateProgressBar(dialog: SystemUIDialog, animate: Boolean) {
-        withContext(mainDispatcher) {
-            if (animate) {
-                showProgressBar(dialog)
-            } else {
-                delay(PROGRESS_BAR_ANIMATION_DURATION_MS)
-                hideProgressBar(dialog)
-            }
-        }
-    }
-
-    internal suspend fun onDeviceItemUpdated(
-        dialog: SystemUIDialog,
-        deviceItem: List<DeviceItem>,
-        showSeeAll: Boolean,
-        showPairNewDevice: Boolean
-    ) {
-        withContext(mainDispatcher) {
-            val start = systemClock.elapsedRealtime()
-            val itemRow = deviceItem.size + showSeeAll.toInt() + showPairNewDevice.toInt()
-            // If not the first load, add a slight delay for smoother dialog height change
-            if (itemRow != lastItemRow && lastItemRow != -1) {
-                delay(MIN_HEIGHT_CHANGE_INTERVAL_MS - (start - lastUiUpdateMs))
-            }
-            if (isActive) {
-                deviceItemAdapter.refreshDeviceItemList(deviceItem) {
-                    getSeeAllButton(dialog).visibility = if (showSeeAll) VISIBLE else GONE
-                    getPairNewDeviceButton(dialog).visibility =
-                        if (showPairNewDevice) VISIBLE else GONE
-                    // Update the height after data is updated
-                    getScrollViewContent(dialog).layoutParams.height = WRAP_CONTENT
-                    lastUiUpdateMs = systemClock.elapsedRealtime()
-                    lastItemRow = itemRow
-                    logger.logDeviceUiUpdate(lastUiUpdateMs - start)
-                }
-            }
-        }
-    }
-
-    internal fun onBluetoothStateUpdated(
-        dialog: SystemUIDialog,
-        isEnabled: Boolean,
-        uiProperties: BluetoothTileDialogViewModel.UiProperties
-    ) {
-        getToggleView(dialog).apply {
-            isChecked = isEnabled
-            setEnabled(true)
-            alpha = ENABLED_ALPHA
-        }
-        getSubtitleTextView(dialog).text = dialog.context.getString(uiProperties.subTitleResId)
-        getAutoOnToggleView(dialog).visibility = uiProperties.autoOnToggleVisibility
-    }
-
-    internal fun onBluetoothAutoOnUpdated(
-        dialog: SystemUIDialog,
-        isEnabled: Boolean,
-        @StringRes infoResId: Int
-    ) {
-        getAutoOnToggle(dialog).apply {
-            isChecked = isEnabled
-            setEnabled(true)
-            alpha = ENABLED_ALPHA
-        }
-        getAutoOnToggleInfoTextView(dialog).text = dialog.context.getString(infoResId)
-    }
-
-    private fun setupToggle(dialog: SystemUIDialog) {
-        val toggleView = getToggleView(dialog)
-        toggleView.isChecked = bluetoothToggleInitialValue
-        toggleView.setOnCheckedChangeListener { view, isChecked ->
-            mutableBluetoothStateToggle.value = isChecked
-            view.apply {
-                isEnabled = false
-                alpha = DISABLED_ALPHA
-            }
-            logger.logBluetoothState(BluetoothStateStage.USER_TOGGLED, isChecked.toString())
-            uiEventLogger.log(BluetoothTileDialogUiEvent.BLUETOOTH_TOGGLE_CLICKED)
-        }
-
-        getAutoOnToggleView(dialog).visibility = initialUiProperties.autoOnToggleVisibility
-        getAutoOnToggle(dialog).setOnCheckedChangeListener { view, isChecked ->
-            mutableBluetoothAutoOnToggle.value = isChecked
-            view.apply {
-                isEnabled = false
-                alpha = DISABLED_ALPHA
-            }
-            uiEventLogger.log(BluetoothTileDialogUiEvent.BLUETOOTH_AUTO_ON_TOGGLE_CLICKED)
-        }
-    }
-
-    private fun getToggleView(dialog: SystemUIDialog): Switch {
-        return dialog.requireViewById(R.id.bluetooth_toggle)
-    }
-
-    private fun getSubtitleTextView(dialog: SystemUIDialog): TextView {
-        return dialog.requireViewById(R.id.bluetooth_tile_dialog_subtitle)
-    }
-
-    private fun getSeeAllButton(dialog: SystemUIDialog): View {
-        return dialog.requireViewById(R.id.see_all_button)
-    }
-
-    private fun getPairNewDeviceButton(dialog: SystemUIDialog): View {
-        return dialog.requireViewById(R.id.pair_new_device_button)
-    }
-
-    private fun getDeviceListView(dialog: SystemUIDialog): RecyclerView {
-        return dialog.requireViewById(R.id.device_list)
-    }
-
-    private fun getAutoOnToggle(dialog: SystemUIDialog): Switch {
-        return dialog.requireViewById(R.id.bluetooth_auto_on_toggle)
-    }
-
-    private fun getAutoOnToggleView(dialog: SystemUIDialog): View {
-        return dialog.requireViewById(R.id.bluetooth_auto_on_toggle_layout)
-    }
-
-    private fun getAutoOnToggleInfoTextView(dialog: SystemUIDialog): TextView {
-        return dialog.requireViewById(R.id.bluetooth_auto_on_toggle_info_text)
-    }
-
-    private fun getProgressBarAnimation(dialog: SystemUIDialog): ProgressBar {
-        return dialog.requireViewById(R.id.bluetooth_tile_dialog_progress_animation)
-    }
-
-    private fun getProgressBarBackground(dialog: SystemUIDialog): View {
-        return dialog.requireViewById(R.id.bluetooth_tile_dialog_progress_animation)
-    }
-
-    private fun getScrollViewContent(dialog: SystemUIDialog): View {
-        return dialog.requireViewById(R.id.scroll_view)
-    }
-
-    private fun setupRecyclerView(dialog: SystemUIDialog) {
-        getDeviceListView(dialog).apply {
-            layoutManager = LinearLayoutManager(dialog.context)
-            adapter = deviceItemAdapter
-        }
-    }
-
-    private fun showProgressBar(dialog: SystemUIDialog) {
-        val progressBarAnimation = getProgressBarAnimation(dialog)
-        val progressBarBackground = getProgressBarBackground(dialog)
-        if (progressBarAnimation.visibility != VISIBLE) {
-            progressBarAnimation.visibility = VISIBLE
-            progressBarBackground.visibility = INVISIBLE
-        }
-    }
-
-    private fun hideProgressBar(dialog: SystemUIDialog) {
-        val progressBarAnimation = getProgressBarAnimation(dialog)
-        val progressBarBackground = getProgressBarBackground(dialog)
-        if (progressBarAnimation.visibility != INVISIBLE) {
-            progressBarAnimation.visibility = INVISIBLE
-            progressBarBackground.visibility = VISIBLE
-        }
-    }
-
-    internal inner class Adapter(private val onClickCallback: BluetoothTileDialogCallback) :
-        RecyclerView.Adapter<Adapter.DeviceItemViewHolder>() {
-
-        private val diffUtilCallback =
-            object : DiffUtil.ItemCallback<DeviceItem>() {
-                override fun areItemsTheSame(
-                    deviceItem1: DeviceItem,
-                    deviceItem2: DeviceItem
-                ): Boolean {
-                    return deviceItem1.cachedBluetoothDevice == deviceItem2.cachedBluetoothDevice
-                }
-
-                override fun areContentsTheSame(
-                    deviceItem1: DeviceItem,
-                    deviceItem2: DeviceItem
-                ): Boolean {
-                    return deviceItem1.type == deviceItem2.type &&
-                        deviceItem1.cachedBluetoothDevice == deviceItem2.cachedBluetoothDevice &&
-                        deviceItem1.deviceName == deviceItem2.deviceName &&
-                        deviceItem1.connectionSummary == deviceItem2.connectionSummary &&
-                        // Ignored the icon drawable
-                        deviceItem1.iconWithDescription?.second ==
-                            deviceItem2.iconWithDescription?.second &&
-                        deviceItem1.background == deviceItem2.background &&
-                        deviceItem1.isEnabled == deviceItem2.isEnabled &&
-                        deviceItem1.actionAccessibilityLabel == deviceItem2.actionAccessibilityLabel
-                }
-            }
-
-        private val asyncListDiffer = AsyncListDiffer(this, diffUtilCallback)
-
-        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DeviceItemViewHolder {
-            val view =
-                LayoutInflater.from(parent.context)
-                    .inflate(R.layout.bluetooth_device_item, parent, false)
-            return DeviceItemViewHolder(view)
-        }
-
-        override fun getItemCount() = asyncListDiffer.currentList.size
-
-        override fun onBindViewHolder(holder: DeviceItemViewHolder, position: Int) {
-            val item = getItem(position)
-            holder.bind(item, onClickCallback)
-        }
-
-        internal fun getItem(position: Int) = asyncListDiffer.currentList[position]
-
-        internal fun refreshDeviceItemList(updated: List<DeviceItem>, callback: () -> Unit) {
-            asyncListDiffer.submitList(updated, callback)
-        }
-
-        internal inner class DeviceItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
-            private val container = view.requireViewById<View>(R.id.bluetooth_device_row)
-            private val nameView = view.requireViewById<TextView>(R.id.bluetooth_device_name)
-            private val summaryView = view.requireViewById<TextView>(R.id.bluetooth_device_summary)
-            private val iconView = view.requireViewById<ImageView>(R.id.bluetooth_device_icon)
-            private val gearView = view.requireViewById<View>(R.id.gear_icon)
-
-            internal fun bind(
-                item: DeviceItem,
-                deviceItemOnClickCallback: BluetoothTileDialogCallback
-            ) {
-                container.apply {
-                    isEnabled = item.isEnabled
-                    background = item.background?.let { context.getDrawable(it) }
-                    setOnClickListener {
-                        mutableDeviceItemClick.tryEmit(item)
-                        uiEventLogger.log(BluetoothTileDialogUiEvent.DEVICE_CLICKED)
-                    }
-                    accessibilityDelegate =
-                        object : AccessibilityDelegate() {
-                            override fun onInitializeAccessibilityNodeInfo(
-                                host: View,
-                                info: AccessibilityNodeInfo
-                            ) {
-                                super.onInitializeAccessibilityNodeInfo(host, info)
-                                info.addAction(
-                                    AccessibilityAction(
-                                        AccessibilityAction.ACTION_CLICK.id,
-                                        item.actionAccessibilityLabel
-                                    )
-                                )
-                            }
-                        }
-                }
-                nameView.text = item.deviceName
-                summaryView.text = item.connectionSummary
-                iconView.apply {
-                    item.iconWithDescription?.let {
-                        setImageDrawable(it.first)
-                        contentDescription = it.second
-                    }
-                }
-                gearView.setOnClickListener {
-                    deviceItemOnClickCallback.onDeviceItemGearClicked(item, it)
-                }
-            }
-        }
-    }
-
-    internal companion object {
-        const val MIN_HEIGHT_CHANGE_INTERVAL_MS = 800L
-        const val MAX_DEVICE_ITEM_ENTRY = 3
-        const val ACTION_BLUETOOTH_DEVICE_DETAILS =
-            "com.android.settings.BLUETOOTH_DEVICE_DETAIL_SETTINGS"
-        const val ACTION_PREVIOUSLY_CONNECTED_DEVICE =
-            "com.android.settings.PREVIOUSLY_CONNECTED_DEVICE"
-        const val ACTION_PAIR_NEW_DEVICE = "android.settings.BLUETOOTH_PAIRING_SETTINGS"
-        const val DISABLED_ALPHA = 0.3f
-        const val ENABLED_ALPHA = 1f
-        const val PROGRESS_BAR_ANIMATION_DURATION_MS = 1500L
-
-        private fun Boolean.toInt(): Int {
-            return if (this) 1 else 0
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogLogger.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogLogger.kt
deleted file mode 100644
index 5d18dc1..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogLogger.kt
+++ /dev/null
@@ -1,106 +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.tiles.dialog.bluetooth
-
-import com.android.systemui.log.LogBuffer
-import com.android.systemui.log.core.LogLevel.DEBUG
-import com.android.systemui.log.dagger.BluetoothTileDialogLog
-import javax.inject.Inject
-
-private const val TAG = "BluetoothTileDialogLog"
-
-enum class BluetoothStateStage {
-    USER_TOGGLED,
-    BLUETOOTH_STATE_VALUE_SET,
-    BLUETOOTH_STATE_CHANGE_RECEIVED
-}
-
-enum class DeviceFetchTrigger {
-    FIRST_LOAD,
-    BLUETOOTH_STATE_CHANGE_RECEIVED,
-    BLUETOOTH_CALLBACK_RECEIVED
-}
-
-enum class JobStatus {
-    FINISHED,
-    CANCELLED
-}
-
-class BluetoothTileDialogLogger
-@Inject
-constructor(@BluetoothTileDialogLog private val logBuffer: LogBuffer) {
-
-    fun logBluetoothState(stage: BluetoothStateStage, state: String) =
-        logBuffer.log(
-            TAG,
-            DEBUG,
-            {
-                str1 = stage.toString()
-                str2 = state
-            },
-            { "BluetoothState. stage=$str1 state=$str2" }
-        )
-
-    fun logDeviceClick(address: String, type: DeviceItemType) =
-        logBuffer.log(
-            TAG,
-            DEBUG,
-            {
-                str1 = address
-                str2 = type.toString()
-            },
-            { "DeviceClick. address=$str1 type=$str2" }
-        )
-
-    fun logActiveDeviceChanged(address: String?, profileId: Int) =
-        logBuffer.log(
-            TAG,
-            DEBUG,
-            {
-                str1 = address
-                int1 = profileId
-            },
-            { "ActiveDeviceChanged. address=$str1 profileId=$int1" }
-        )
-
-    fun logProfileConnectionStateChanged(address: String, state: String, profileId: Int) =
-        logBuffer.log(
-            TAG,
-            DEBUG,
-            {
-                str1 = address
-                str2 = state
-                int1 = profileId
-            },
-            { "ProfileConnectionStateChanged. address=$str1 state=$str2 profileId=$int1" }
-        )
-
-    fun logDeviceFetch(status: JobStatus, trigger: DeviceFetchTrigger, duration: Long) =
-        logBuffer.log(
-            TAG,
-            DEBUG,
-            {
-                str1 = status.toString()
-                str2 = trigger.toString()
-                long1 = duration
-            },
-            { "DeviceFetch. status=$str1 trigger=$str2 duration=$long1" }
-        )
-
-    fun logDeviceUiUpdate(duration: Long) =
-        logBuffer.log(TAG, DEBUG, { long1 = duration }, { "DeviceUiUpdate. duration=$long1" })
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogRepository.kt
deleted file mode 100644
index ea51bee..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogRepository.kt
+++ /dev/null
@@ -1,45 +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.tiles.dialog.bluetooth
-
-import android.bluetooth.BluetoothAdapter
-import com.android.settingslib.bluetooth.CachedBluetoothDevice
-import com.android.settingslib.bluetooth.LocalBluetoothManager
-import com.android.systemui.dagger.SysUISingleton
-import javax.inject.Inject
-
-/** Repository to get CachedBluetoothDevices for the Bluetooth Dialog. */
-@SysUISingleton
-internal class BluetoothTileDialogRepository
-@Inject
-constructor(
-    private val localBluetoothManager: LocalBluetoothManager?,
-    private val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
-) {
-    internal val cachedDevices: Collection<CachedBluetoothDevice>
-        get() {
-            return if (
-                localBluetoothManager == null ||
-                    bluetoothAdapter == null ||
-                    !bluetoothAdapter.isEnabled
-            ) {
-                emptyList()
-            } else {
-                localBluetoothManager.cachedDeviceManager.cachedDevicesCopy
-            }
-        }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogUiEvent.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogUiEvent.kt
deleted file mode 100644
index cd52e0d..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogUiEvent.kt
+++ /dev/null
@@ -1,38 +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.tiles.dialog.bluetooth
-
-import com.android.internal.logging.UiEvent
-import com.android.internal.logging.UiEventLogger
-
-/** UI Events for the bluetooth tile dialog. */
-enum class BluetoothTileDialogUiEvent(val metricId: Int) : UiEventLogger.UiEventEnum {
-    @UiEvent(doc = "The bluetooth tile dialog is shown") BLUETOOTH_TILE_DIALOG_SHOWN(1493),
-    @UiEvent(doc = "The master toggle is clicked") BLUETOOTH_TOGGLE_CLICKED(1494),
-    @UiEvent(doc = "Pair new device is clicked") PAIR_NEW_DEVICE_CLICKED(1495),
-    @UiEvent(doc = "See all is clicked") SEE_ALL_CLICKED(1496),
-    @UiEvent(doc = "Gear icon clicked") DEVICE_GEAR_CLICKED(1497),
-    @UiEvent(doc = "Device clicked") DEVICE_CLICKED(1498),
-    @UiEvent(doc = "Connected device clicked to active") CONNECTED_DEVICE_SET_ACTIVE(1499),
-    @UiEvent(doc = "Saved clicked to connect") SAVED_DEVICE_CONNECT(1500),
-    @UiEvent(doc = "Active device clicked to disconnect") ACTIVE_DEVICE_DISCONNECT(1507),
-    @UiEvent(doc = "Connected other device clicked to disconnect")
-    CONNECTED_OTHER_DEVICE_DISCONNECT(1508),
-    @UiEvent(doc = "The auto on toggle is clicked") BLUETOOTH_AUTO_ON_TOGGLE_CLICKED(1617);
-
-    override fun getId() = metricId
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogViewModel.kt
deleted file mode 100644
index fd624d2..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogViewModel.kt
+++ /dev/null
@@ -1,315 +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.tiles.dialog.bluetooth
-
-import android.content.Intent
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.view.View
-import android.view.View.GONE
-import android.view.View.VISIBLE
-import android.view.ViewGroup
-import androidx.annotation.DimenRes
-import androidx.annotation.StringRes
-import androidx.annotation.VisibleForTesting
-import com.android.internal.jank.InteractionJankMonitor
-import com.android.internal.logging.UiEventLogger
-import com.android.systemui.Prefs
-import com.android.systemui.animation.DialogCuj
-import com.android.systemui.animation.DialogTransitionAnimator
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.dagger.qualifiers.Background
-import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.plugins.ActivityStarter
-import com.android.systemui.qs.tiles.dialog.bluetooth.BluetoothTileDialogDelegate.Companion.ACTION_BLUETOOTH_DEVICE_DETAILS
-import com.android.systemui.qs.tiles.dialog.bluetooth.BluetoothTileDialogDelegate.Companion.ACTION_PAIR_NEW_DEVICE
-import com.android.systemui.qs.tiles.dialog.bluetooth.BluetoothTileDialogDelegate.Companion.ACTION_PREVIOUSLY_CONNECTED_DEVICE
-import com.android.systemui.qs.tiles.dialog.bluetooth.BluetoothTileDialogDelegate.Companion.MAX_DEVICE_ITEM_ENTRY
-import com.android.systemui.res.R
-import javax.inject.Inject
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.channels.produce
-import kotlinx.coroutines.flow.filterNotNull
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
-
-/** ViewModel for Bluetooth Dialog after clicking on the Bluetooth QS tile. */
-@SysUISingleton
-internal class BluetoothTileDialogViewModel
-@Inject
-constructor(
-    private val deviceItemInteractor: DeviceItemInteractor,
-    private val bluetoothStateInteractor: BluetoothStateInteractor,
-    private val bluetoothAutoOnInteractor: BluetoothAutoOnInteractor,
-    private val dialogTransitionAnimator: DialogTransitionAnimator,
-    private val activityStarter: ActivityStarter,
-    private val uiEventLogger: UiEventLogger,
-    @Application private val coroutineScope: CoroutineScope,
-    @Main private val mainDispatcher: CoroutineDispatcher,
-    @Background private val backgroundDispatcher: CoroutineDispatcher,
-    @Main private val sharedPreferences: SharedPreferences,
-    private val bluetoothDialogDelegateFactory: BluetoothTileDialogDelegate.Factory,
-) : BluetoothTileDialogCallback {
-
-    private var job: Job? = null
-
-    /**
-     * Shows the dialog.
-     *
-     * @param view The view from which the dialog is shown.
-     */
-    @kotlinx.coroutines.ExperimentalCoroutinesApi
-    fun showDialog(view: View?) {
-        cancelJob()
-
-        job =
-            coroutineScope.launch(mainDispatcher) {
-                var updateDeviceItemJob: Job?
-                var updateDialogUiJob: Job? = null
-                val dialogDelegate = createBluetoothTileDialog()
-                val dialog = dialogDelegate.createDialog()
-                val context = dialog.context
-
-                view?.let {
-                    dialogTransitionAnimator.showFromView(
-                        dialog,
-                        it,
-                        animateBackgroundBoundsChange = true,
-                        cuj =
-                            DialogCuj(
-                                InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
-                                INTERACTION_JANK_TAG
-                            )
-                    )
-                }
-                    ?: dialog.show()
-
-                updateDeviceItemJob = launch {
-                    deviceItemInteractor.updateDeviceItems(context, DeviceFetchTrigger.FIRST_LOAD)
-                }
-
-                // deviceItemUpdate is emitted when device item list is done fetching, update UI and
-                // stop the progress bar.
-                deviceItemInteractor.deviceItemUpdate
-                    .onEach {
-                        updateDialogUiJob?.cancel()
-                        updateDialogUiJob = launch {
-                            dialogDelegate.apply {
-                                onDeviceItemUpdated(
-                                    dialog,
-                                    it.take(MAX_DEVICE_ITEM_ENTRY),
-                                    showSeeAll = it.size > MAX_DEVICE_ITEM_ENTRY,
-                                    showPairNewDevice = bluetoothStateInteractor.isBluetoothEnabled
-                                )
-                                animateProgressBar(dialog, false)
-                            }
-                        }
-                    }
-                    .launchIn(this)
-
-                // deviceItemUpdateRequest is emitted when a bluetooth callback is called, re-fetch
-                // the device item list and animiate the progress bar.
-                deviceItemInteractor.deviceItemUpdateRequest
-                    .onEach {
-                        dialogDelegate.animateProgressBar(dialog, true)
-                        updateDeviceItemJob?.cancel()
-                        updateDeviceItemJob = launch {
-                            deviceItemInteractor.updateDeviceItems(
-                                context,
-                                DeviceFetchTrigger.BLUETOOTH_CALLBACK_RECEIVED
-                            )
-                        }
-                    }
-                    .launchIn(this)
-
-                // bluetoothStateUpdate is emitted when bluetooth on/off state is changed, re-fetch
-                // the device item list.
-                bluetoothStateInteractor.bluetoothStateUpdate
-                    .filterNotNull()
-                    .onEach {
-                        dialogDelegate.onBluetoothStateUpdated(
-                            dialog,
-                            it,
-                            UiProperties.build(it, isAutoOnToggleFeatureAvailable())
-                        )
-                        updateDeviceItemJob?.cancel()
-                        updateDeviceItemJob = launch {
-                            deviceItemInteractor.updateDeviceItems(
-                                context,
-                                DeviceFetchTrigger.BLUETOOTH_STATE_CHANGE_RECEIVED
-                            )
-                        }
-                    }
-                    .launchIn(this)
-
-                // bluetoothStateToggle is emitted when user toggles the bluetooth state switch,
-                // send the new value to the bluetoothStateInteractor and animate the progress bar.
-                dialogDelegate.bluetoothStateToggle
-                    .onEach {
-                        dialogDelegate.animateProgressBar(dialog, true)
-                        bluetoothStateInteractor.isBluetoothEnabled = it
-                    }
-                    .launchIn(this)
-
-                // deviceItemClick is emitted when user clicked on a device item.
-                dialogDelegate.deviceItemClick
-                    .onEach { deviceItemInteractor.updateDeviceItemOnClick(it) }
-                    .launchIn(this)
-
-                // contentHeight is emitted when the dialog is dismissed.
-                dialogDelegate.contentHeight
-                    .onEach {
-                        withContext(backgroundDispatcher) {
-                            sharedPreferences.edit().putInt(CONTENT_HEIGHT_PREF_KEY, it).apply()
-                        }
-                    }
-                    .launchIn(this)
-
-                if (isAutoOnToggleFeatureAvailable()) {
-                    // bluetoothAutoOnUpdate is emitted when bluetooth auto on on/off state is
-                    // changed.
-                    bluetoothAutoOnInteractor.isEnabled
-                        .onEach {
-                            dialogDelegate.onBluetoothAutoOnUpdated(
-                                dialog,
-                                it,
-                                if (it) R.string.turn_on_bluetooth_auto_info_enabled
-                                else R.string.turn_on_bluetooth_auto_info_disabled
-                            )
-                        }
-                        .launchIn(this)
-
-                    // bluetoothAutoOnToggle is emitted when user toggles the bluetooth auto on
-                    // switch, send the new value to the bluetoothAutoOnInteractor.
-                    dialogDelegate.bluetoothAutoOnToggle
-                        .filterNotNull()
-                        .onEach { bluetoothAutoOnInteractor.setEnabled(it) }
-                        .launchIn(this)
-                }
-
-                produce<Unit> { awaitClose { dialog.cancel() } }
-            }
-    }
-
-    private suspend fun createBluetoothTileDialog(): BluetoothTileDialogDelegate {
-        val cachedContentHeight =
-            withContext(backgroundDispatcher) {
-                sharedPreferences.getInt(
-                    CONTENT_HEIGHT_PREF_KEY,
-                    ViewGroup.LayoutParams.WRAP_CONTENT
-                )
-            }
-
-        return bluetoothDialogDelegateFactory.create(
-            UiProperties.build(
-                bluetoothStateInteractor.isBluetoothEnabled,
-                isAutoOnToggleFeatureAvailable()
-            ),
-            cachedContentHeight,
-            bluetoothStateInteractor.isBluetoothEnabled,
-            this@BluetoothTileDialogViewModel,
-            { cancelJob() }
-        )
-    }
-
-    override fun onDeviceItemGearClicked(deviceItem: DeviceItem, view: View) {
-        uiEventLogger.log(BluetoothTileDialogUiEvent.DEVICE_GEAR_CLICKED)
-        val intent =
-            Intent(ACTION_BLUETOOTH_DEVICE_DETAILS).apply {
-                putExtra(
-                    ":settings:show_fragment_args",
-                    Bundle().apply {
-                        putString("device_address", deviceItem.cachedBluetoothDevice.address)
-                    }
-                )
-            }
-        startSettingsActivity(intent, view)
-    }
-
-    override fun onSeeAllClicked(view: View) {
-        uiEventLogger.log(BluetoothTileDialogUiEvent.SEE_ALL_CLICKED)
-        startSettingsActivity(Intent(ACTION_PREVIOUSLY_CONNECTED_DEVICE), view)
-    }
-
-    override fun onPairNewDeviceClicked(view: View) {
-        uiEventLogger.log(BluetoothTileDialogUiEvent.PAIR_NEW_DEVICE_CLICKED)
-        startSettingsActivity(Intent(ACTION_PAIR_NEW_DEVICE), view)
-    }
-
-    private fun cancelJob() {
-        job?.cancel()
-        job = null
-    }
-
-    private fun startSettingsActivity(intent: Intent, view: View) {
-        if (job?.isActive == true) {
-            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
-            activityStarter.postStartActivityDismissingKeyguard(
-                intent,
-                0,
-                dialogTransitionAnimator.createActivityTransitionController(view)
-            )
-        }
-    }
-
-    @VisibleForTesting
-    internal suspend fun isAutoOnToggleFeatureAvailable() =
-        bluetoothAutoOnInteractor.isAutoOnSupported()
-
-    companion object {
-        private const val INTERACTION_JANK_TAG = "bluetooth_tile_dialog"
-        private const val CONTENT_HEIGHT_PREF_KEY = Prefs.Key.BLUETOOTH_TILE_DIALOG_CONTENT_HEIGHT
-        private fun getSubtitleResId(isBluetoothEnabled: Boolean) =
-            if (isBluetoothEnabled) R.string.quick_settings_bluetooth_tile_subtitle
-            else R.string.bt_is_off
-    }
-
-    internal data class UiProperties(
-        @StringRes val subTitleResId: Int,
-        val autoOnToggleVisibility: Int,
-        @DimenRes val scrollViewMinHeightResId: Int,
-    ) {
-        companion object {
-            internal fun build(
-                isBluetoothEnabled: Boolean,
-                isAutoOnToggleFeatureAvailable: Boolean
-            ) =
-                UiProperties(
-                    subTitleResId = getSubtitleResId(isBluetoothEnabled),
-                    autoOnToggleVisibility =
-                        if (isAutoOnToggleFeatureAvailable && !isBluetoothEnabled) VISIBLE
-                        else GONE,
-                    scrollViewMinHeightResId =
-                        if (isAutoOnToggleFeatureAvailable)
-                            R.dimen.bluetooth_dialog_scroll_view_min_height_with_auto_on
-                        else R.dimen.bluetooth_dialog_scroll_view_min_height
-                )
-        }
-    }
-}
-
-interface BluetoothTileDialogCallback {
-    fun onDeviceItemGearClicked(deviceItem: DeviceItem, view: View)
-    fun onSeeAllClicked(view: View)
-    fun onPairNewDeviceClicked(view: View)
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItem.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItem.kt
deleted file mode 100644
index 1c621b8..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItem.kt
+++ /dev/null
@@ -1,54 +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.
- */
-
-/*
- * 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.tiles.dialog.bluetooth
-
-import android.graphics.drawable.Drawable
-import com.android.settingslib.bluetooth.CachedBluetoothDevice
-
-enum class DeviceItemType {
-    ACTIVE_MEDIA_BLUETOOTH_DEVICE,
-    AVAILABLE_MEDIA_BLUETOOTH_DEVICE,
-    CONNECTED_BLUETOOTH_DEVICE,
-    SAVED_BLUETOOTH_DEVICE,
-}
-
-data class DeviceItem(
-    val type: DeviceItemType,
-    val cachedBluetoothDevice: CachedBluetoothDevice,
-    val deviceName: String = "",
-    val connectionSummary: String = "",
-    val iconWithDescription: Pair<Drawable, String>? = null,
-    val background: Int? = null,
-    var isEnabled: Boolean = true,
-    var actionAccessibilityLabel: String = "",
-)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemFactory.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemFactory.kt
deleted file mode 100644
index f13ecf3..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemFactory.kt
+++ /dev/null
@@ -1,170 +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.tiles.dialog.bluetooth
-
-import android.bluetooth.BluetoothDevice
-import android.content.Context
-import android.media.AudioManager
-import com.android.settingslib.bluetooth.BluetoothUtils
-import com.android.settingslib.bluetooth.CachedBluetoothDevice
-import com.android.settingslib.flags.Flags
-import com.android.systemui.res.R
-
-private val backgroundOn = R.drawable.settingslib_switch_bar_bg_on
-private val backgroundOff = R.drawable.bluetooth_tile_dialog_bg_off
-private val backgroundOffBusy = R.drawable.bluetooth_tile_dialog_bg_off_busy
-private val connected = R.string.quick_settings_bluetooth_device_connected
-private val saved = R.string.quick_settings_bluetooth_device_saved
-private val actionAccessibilityLabelActivate =
-    R.string.accessibility_quick_settings_bluetooth_device_tap_to_activate
-private val actionAccessibilityLabelDisconnect =
-    R.string.accessibility_quick_settings_bluetooth_device_tap_to_disconnect
-
-/** Factories to create different types of Bluetooth device items from CachedBluetoothDevice. */
-internal abstract class DeviceItemFactory {
-    abstract fun isFilterMatched(
-        context: Context,
-        cachedDevice: CachedBluetoothDevice,
-        audioManager: AudioManager?
-    ): Boolean
-
-    abstract fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem
-}
-
-internal class ActiveMediaDeviceItemFactory : DeviceItemFactory() {
-    override fun isFilterMatched(
-        context: Context,
-        cachedDevice: CachedBluetoothDevice,
-        audioManager: AudioManager?
-    ): Boolean {
-        return BluetoothUtils.isActiveMediaDevice(cachedDevice) &&
-            BluetoothUtils.isAvailableMediaBluetoothDevice(cachedDevice, audioManager)
-    }
-
-    override fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem {
-        return DeviceItem(
-            type = DeviceItemType.ACTIVE_MEDIA_BLUETOOTH_DEVICE,
-            cachedBluetoothDevice = cachedDevice,
-            deviceName = cachedDevice.name,
-            connectionSummary = cachedDevice.connectionSummary ?: "",
-            iconWithDescription =
-                BluetoothUtils.getBtClassDrawableWithDescription(context, cachedDevice).let { p ->
-                    Pair(p.first, p.second)
-                },
-            background = backgroundOn,
-            isEnabled = !cachedDevice.isBusy,
-            actionAccessibilityLabel = context.getString(actionAccessibilityLabelDisconnect),
-        )
-    }
-}
-
-internal class AvailableMediaDeviceItemFactory : DeviceItemFactory() {
-    override fun isFilterMatched(
-        context: Context,
-        cachedDevice: CachedBluetoothDevice,
-        audioManager: AudioManager?
-    ): Boolean {
-        return !BluetoothUtils.isActiveMediaDevice(cachedDevice) &&
-            BluetoothUtils.isAvailableMediaBluetoothDevice(cachedDevice, audioManager)
-    }
-
-    // TODO(b/298124674): move create() to the abstract class to reduce duplicate code
-    override fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem {
-        return DeviceItem(
-            type = DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE,
-            cachedBluetoothDevice = cachedDevice,
-            deviceName = cachedDevice.name,
-            connectionSummary = cachedDevice.connectionSummary.takeUnless { it.isNullOrEmpty() }
-                    ?: context.getString(connected),
-            iconWithDescription =
-                BluetoothUtils.getBtClassDrawableWithDescription(context, cachedDevice).let { p ->
-                    Pair(p.first, p.second)
-                },
-            background = if (cachedDevice.isBusy) backgroundOffBusy else backgroundOff,
-            isEnabled = !cachedDevice.isBusy,
-            actionAccessibilityLabel = context.getString(actionAccessibilityLabelActivate),
-        )
-    }
-}
-
-internal class ConnectedDeviceItemFactory : DeviceItemFactory() {
-    override fun isFilterMatched(
-        context: Context,
-        cachedDevice: CachedBluetoothDevice,
-        audioManager: AudioManager?
-    ): Boolean {
-        return if (Flags.enableHideExclusivelyManagedBluetoothDevice()) {
-            !BluetoothUtils.isExclusivelyManagedBluetoothDevice(
-                context,
-                cachedDevice.getDevice()
-            ) && BluetoothUtils.isConnectedBluetoothDevice(cachedDevice, audioManager)
-        } else {
-            BluetoothUtils.isConnectedBluetoothDevice(cachedDevice, audioManager)
-        }
-    }
-
-    override fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem {
-        return DeviceItem(
-            type = DeviceItemType.CONNECTED_BLUETOOTH_DEVICE,
-            cachedBluetoothDevice = cachedDevice,
-            deviceName = cachedDevice.name,
-            connectionSummary = cachedDevice.connectionSummary.takeUnless { it.isNullOrEmpty() }
-                    ?: context.getString(connected),
-            iconWithDescription =
-                BluetoothUtils.getBtClassDrawableWithDescription(context, cachedDevice).let { p ->
-                    Pair(p.first, p.second)
-                },
-            background = if (cachedDevice.isBusy) backgroundOffBusy else backgroundOff,
-            isEnabled = !cachedDevice.isBusy,
-            actionAccessibilityLabel = context.getString(actionAccessibilityLabelDisconnect),
-        )
-    }
-}
-
-internal class SavedDeviceItemFactory : DeviceItemFactory() {
-    override fun isFilterMatched(
-        context: Context,
-        cachedDevice: CachedBluetoothDevice,
-        audioManager: AudioManager?
-    ): Boolean {
-        return if (Flags.enableHideExclusivelyManagedBluetoothDevice()) {
-            !BluetoothUtils.isExclusivelyManagedBluetoothDevice(
-                context,
-                cachedDevice.getDevice()
-            ) && cachedDevice.bondState == BluetoothDevice.BOND_BONDED && !cachedDevice.isConnected
-        } else {
-            cachedDevice.bondState == BluetoothDevice.BOND_BONDED && !cachedDevice.isConnected
-        }
-    }
-
-    override fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem {
-        return DeviceItem(
-            type = DeviceItemType.SAVED_BLUETOOTH_DEVICE,
-            cachedBluetoothDevice = cachedDevice,
-            deviceName = cachedDevice.name,
-            connectionSummary = cachedDevice.connectionSummary.takeUnless { it.isNullOrEmpty() }
-                    ?: context.getString(saved),
-            iconWithDescription =
-                BluetoothUtils.getBtClassDrawableWithDescription(context, cachedDevice).let { p ->
-                    Pair(p.first, p.second)
-                },
-            background = if (cachedDevice.isBusy) backgroundOffBusy else backgroundOff,
-            isEnabled = !cachedDevice.isBusy,
-            actionAccessibilityLabel = context.getString(actionAccessibilityLabelActivate),
-        )
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemInteractor.kt
deleted file mode 100644
index 1df496b..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemInteractor.kt
+++ /dev/null
@@ -1,211 +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.tiles.dialog.bluetooth
-
-import android.bluetooth.BluetoothAdapter
-import android.bluetooth.BluetoothDevice
-import android.content.Context
-import android.media.AudioManager
-import com.android.internal.logging.UiEventLogger
-import com.android.settingslib.bluetooth.BluetoothCallback
-import com.android.settingslib.bluetooth.CachedBluetoothDevice
-import com.android.settingslib.bluetooth.LocalBluetoothManager
-import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
-import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.dagger.qualifiers.Background
-import com.android.systemui.util.time.SystemClock
-import javax.inject.Inject
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.SharedFlow
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.asSharedFlow
-import kotlinx.coroutines.flow.shareIn
-import kotlinx.coroutines.isActive
-import kotlinx.coroutines.withContext
-
-/** Holds business logic for the Bluetooth Dialog after clicking on the Bluetooth QS tile. */
-@SysUISingleton
-internal class DeviceItemInteractor
-@Inject
-constructor(
-    private val bluetoothTileDialogRepository: BluetoothTileDialogRepository,
-    private val audioManager: AudioManager,
-    private val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter(),
-    private val localBluetoothManager: LocalBluetoothManager?,
-    private val systemClock: SystemClock,
-    private val uiEventLogger: UiEventLogger,
-    private val logger: BluetoothTileDialogLogger,
-    @Application private val coroutineScope: CoroutineScope,
-    @Background private val backgroundDispatcher: CoroutineDispatcher,
-) {
-
-    private val mutableDeviceItemUpdate: MutableSharedFlow<List<DeviceItem>> =
-        MutableSharedFlow(extraBufferCapacity = 1)
-    internal val deviceItemUpdate
-        get() = mutableDeviceItemUpdate.asSharedFlow()
-
-    internal val deviceItemUpdateRequest: SharedFlow<Unit> =
-        conflatedCallbackFlow {
-                val listener =
-                    object : BluetoothCallback {
-                        override fun onActiveDeviceChanged(
-                            activeDevice: CachedBluetoothDevice?,
-                            bluetoothProfile: Int
-                        ) {
-                            super.onActiveDeviceChanged(activeDevice, bluetoothProfile)
-                            logger.logActiveDeviceChanged(activeDevice?.address, bluetoothProfile)
-                            trySendWithFailureLogging(Unit, TAG, "onActiveDeviceChanged")
-                        }
-
-                        override fun onProfileConnectionStateChanged(
-                            cachedDevice: CachedBluetoothDevice,
-                            state: Int,
-                            bluetoothProfile: Int
-                        ) {
-                            super.onProfileConnectionStateChanged(
-                                cachedDevice,
-                                state,
-                                bluetoothProfile
-                            )
-                            logger.logProfileConnectionStateChanged(
-                                cachedDevice.address,
-                                state.toString(),
-                                bluetoothProfile
-                            )
-                            trySendWithFailureLogging(Unit, TAG, "onProfileConnectionStateChanged")
-                        }
-
-                        override fun onAclConnectionStateChanged(
-                            cachedDevice: CachedBluetoothDevice,
-                            state: Int
-                        ) {
-                            super.onAclConnectionStateChanged(cachedDevice, state)
-                            // Listen only when a device is disconnecting
-                            if (state == 0) {
-                                trySendWithFailureLogging(Unit, TAG, "onAclConnectionStateChanged")
-                            }
-                        }
-                    }
-                localBluetoothManager?.eventManager?.registerCallback(listener)
-                awaitClose { localBluetoothManager?.eventManager?.unregisterCallback(listener) }
-            }
-            .shareIn(coroutineScope, SharingStarted.WhileSubscribed(replayExpirationMillis = 0))
-
-    private var deviceItemFactoryList: List<DeviceItemFactory> =
-        listOf(
-            ActiveMediaDeviceItemFactory(),
-            AvailableMediaDeviceItemFactory(),
-            ConnectedDeviceItemFactory(),
-            SavedDeviceItemFactory()
-        )
-
-    private var displayPriority: List<DeviceItemType> =
-        listOf(
-            DeviceItemType.ACTIVE_MEDIA_BLUETOOTH_DEVICE,
-            DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE,
-            DeviceItemType.CONNECTED_BLUETOOTH_DEVICE,
-            DeviceItemType.SAVED_BLUETOOTH_DEVICE,
-        )
-
-    internal suspend fun updateDeviceItems(context: Context, trigger: DeviceFetchTrigger) {
-        withContext(backgroundDispatcher) {
-            val start = systemClock.elapsedRealtime()
-            val deviceItems =
-                bluetoothTileDialogRepository.cachedDevices
-                    .mapNotNull { cachedDevice ->
-                        deviceItemFactoryList
-                            .firstOrNull { it.isFilterMatched(context, cachedDevice, audioManager) }
-                            ?.create(context, cachedDevice)
-                    }
-                    .sort(displayPriority, bluetoothAdapter?.mostRecentlyConnectedDevices)
-
-            // Only emit when the job is not cancelled
-            if (isActive) {
-                mutableDeviceItemUpdate.tryEmit(deviceItems)
-                logger.logDeviceFetch(
-                    JobStatus.FINISHED,
-                    trigger,
-                    systemClock.elapsedRealtime() - start
-                )
-            } else {
-                logger.logDeviceFetch(
-                    JobStatus.CANCELLED,
-                    trigger,
-                    systemClock.elapsedRealtime() - start
-                )
-            }
-        }
-    }
-
-    private fun List<DeviceItem>.sort(
-        displayPriority: List<DeviceItemType>,
-        mostRecentlyConnectedDevices: List<BluetoothDevice>?
-    ): List<DeviceItem> {
-        return this.sortedWith(
-            compareBy<DeviceItem> { displayPriority.indexOf(it.type) }
-                .thenBy {
-                    mostRecentlyConnectedDevices?.indexOf(it.cachedBluetoothDevice.device) ?: 0
-                }
-        )
-    }
-
-    internal suspend fun updateDeviceItemOnClick(deviceItem: DeviceItem) {
-        withContext(backgroundDispatcher) {
-            logger.logDeviceClick(deviceItem.cachedBluetoothDevice.address, deviceItem.type)
-
-            deviceItem.cachedBluetoothDevice.apply {
-                when (deviceItem.type) {
-                    DeviceItemType.ACTIVE_MEDIA_BLUETOOTH_DEVICE -> {
-                        disconnect()
-                        uiEventLogger.log(BluetoothTileDialogUiEvent.ACTIVE_DEVICE_DISCONNECT)
-                    }
-                    DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE -> {
-                        setActive()
-                        uiEventLogger.log(BluetoothTileDialogUiEvent.CONNECTED_DEVICE_SET_ACTIVE)
-                    }
-                    DeviceItemType.CONNECTED_BLUETOOTH_DEVICE -> {
-                        disconnect()
-                        uiEventLogger.log(
-                            BluetoothTileDialogUiEvent.CONNECTED_OTHER_DEVICE_DISCONNECT
-                        )
-                    }
-                    DeviceItemType.SAVED_BLUETOOTH_DEVICE -> {
-                        connect()
-                        uiEventLogger.log(BluetoothTileDialogUiEvent.SAVED_DEVICE_CONNECT)
-                    }
-                }
-            }
-        }
-    }
-
-    internal fun setDeviceItemFactoryListForTesting(list: List<DeviceItemFactory>) {
-        deviceItemFactoryList = list
-    }
-
-    internal fun setDisplayPriorityForTesting(list: List<DeviceItemType>) {
-        displayPriority = list
-    }
-
-    companion object {
-        private const val TAG = "DeviceItemInteractor"
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/SensorPrivacyToggleTileDataInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/SensorPrivacyToggleTileDataInteractor.kt
new file mode 100644
index 0000000..7117629
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/SensorPrivacyToggleTileDataInteractor.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.qs.tiles.impl.sensorprivacy
+
+import android.hardware.SensorPrivacyManager.Sensors.CAMERA
+import android.hardware.SensorPrivacyManager.Sensors.MICROPHONE
+import android.hardware.SensorPrivacyManager.Sensors.Sensor
+import android.os.UserHandle
+import android.provider.DeviceConfig
+import android.util.Log
+import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
+import com.android.systemui.dagger.qualifiers.Background
+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.sensorprivacy.domain.model.SensorPrivacyToggleTileModel
+import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import kotlin.coroutines.CoroutineContext
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.withContext
+
+/** Observes SensorPrivacyToggle mode state changes providing the [SensorPrivacyToggleTileModel]. */
+class SensorPrivacyToggleTileDataInteractor
+@AssistedInject
+constructor(
+    @Background private val bgCoroutineContext: CoroutineContext,
+    private val privacyController: IndividualSensorPrivacyController,
+    @Assisted @Sensor private val sensorId: Int,
+) : QSTileDataInteractor<SensorPrivacyToggleTileModel> {
+    @AssistedFactory
+    interface Factory {
+        fun create(@Sensor id: Int): SensorPrivacyToggleTileDataInteractor
+    }
+
+    override fun tileData(
+        user: UserHandle,
+        triggers: Flow<DataUpdateTrigger>
+    ): Flow<SensorPrivacyToggleTileModel> =
+        conflatedCallbackFlow {
+                val callback =
+                    IndividualSensorPrivacyController.Callback { sensor, blocked ->
+                        if (sensor == sensorId) trySend(SensorPrivacyToggleTileModel(blocked))
+                    }
+                privacyController.addCallback(callback) // does not emit an initial state
+                awaitClose { privacyController.removeCallback(callback) }
+            }
+            .onStart {
+                emit(SensorPrivacyToggleTileModel(privacyController.isSensorBlocked(sensorId)))
+            }
+            .distinctUntilChanged()
+            .flowOn(bgCoroutineContext)
+
+    override fun availability(user: UserHandle) =
+        flow { emit(isAvailable()) }.flowOn(bgCoroutineContext)
+
+    private suspend fun isAvailable(): Boolean {
+        return privacyController.supportsSensorToggle(sensorId) && isSensorDeviceConfigSet()
+    }
+
+    private suspend fun isSensorDeviceConfigSet(): Boolean =
+        withContext(bgCoroutineContext) {
+            try {
+                val deviceConfigName = getDeviceConfigName(sensorId)
+                return@withContext DeviceConfig.getBoolean(
+                    DeviceConfig.NAMESPACE_PRIVACY,
+                    deviceConfigName,
+                    true
+                )
+            } catch (exception: IllegalArgumentException) {
+                Log.w(
+                    TAG,
+                    "isDeviceConfigSet for sensorId $sensorId: " +
+                        "Defaulting to true due to exception. ",
+                    exception
+                )
+                return@withContext true
+            }
+        }
+
+    private fun getDeviceConfigName(sensorId: Int): String {
+        if (sensorId == MICROPHONE) {
+            return "mic_toggle_enabled"
+        } else if (sensorId == CAMERA) {
+            return "camera_toggle_enabled"
+        } else {
+            throw IllegalArgumentException("getDeviceConfigName: unexpected sensorId: $sensorId")
+        }
+    }
+
+    private companion object {
+        const val TAG = "SensorPrivacyToggleTileException"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/SensorPrivacyToggleTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/SensorPrivacyToggleTileUserActionInteractor.kt
new file mode 100644
index 0000000..9711cb8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/SensorPrivacyToggleTileUserActionInteractor.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.impl.sensorprivacy.domain
+
+import android.content.Intent
+import android.hardware.SensorPrivacyManager.Sensors.Sensor
+import android.hardware.SensorPrivacyManager.Sources.QS_TILE
+import android.provider.Settings
+import android.safetycenter.SafetyCenterManager
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler
+import com.android.systemui.qs.tiles.base.interactor.QSTileInput
+import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor
+import com.android.systemui.qs.tiles.impl.sensorprivacy.domain.model.SensorPrivacyToggleTileModel
+import com.android.systemui.qs.tiles.viewmodel.QSTileUserAction
+import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+
+/** Handles sensor privacy toggle tile clicks and long clicks. */
+class SensorPrivacyToggleTileUserActionInteractor
+@AssistedInject
+constructor(
+    private val qsTileIntentUserActionHandler: QSTileIntentUserInputHandler,
+    private val keyguardInteractor: KeyguardInteractor,
+    private val activityStarter: ActivityStarter,
+    private val sensorPrivacyController: IndividualSensorPrivacyController,
+    private val safetyCenterManager: SafetyCenterManager,
+    @Assisted @Sensor private val sensorId: Int,
+) : QSTileUserActionInteractor<SensorPrivacyToggleTileModel> {
+    @AssistedFactory
+    interface Factory {
+        fun create(@Sensor id: Int): SensorPrivacyToggleTileUserActionInteractor
+    }
+
+    // should only be initialized in code known to run in background thread
+    private lateinit var longClickIntent: Intent
+
+    override suspend fun handleInput(input: QSTileInput<SensorPrivacyToggleTileModel>) =
+        with(input) {
+            when (action) {
+                is QSTileUserAction.Click -> {
+                    val blocked = input.data.isBlocked
+                    if (
+                        sensorPrivacyController.requiresAuthentication() &&
+                            keyguardInteractor.isKeyguardDismissible.value &&
+                            keyguardInteractor.isKeyguardShowing()
+                    ) {
+                        activityStarter.postQSRunnableDismissingKeyguard {
+                            sensorPrivacyController.setSensorBlocked(QS_TILE, sensorId, !blocked)
+                        }
+                        return
+                    }
+                    sensorPrivacyController.setSensorBlocked(QS_TILE, sensorId, !blocked)
+                }
+                is QSTileUserAction.LongClick -> {
+                    if (!::longClickIntent.isInitialized) {
+                        longClickIntent =
+                            Intent(
+                                if (safetyCenterManager.isSafetyCenterEnabled) {
+                                    Settings.ACTION_PRIVACY_CONTROLS
+                                } else {
+                                    Settings.ACTION_PRIVACY_SETTINGS
+                                }
+                            )
+                    }
+                    qsTileIntentUserActionHandler.handle(action.view, longClickIntent)
+                }
+            }
+        }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/model/SensorPrivacyToggleTileModel.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/model/SensorPrivacyToggleTileModel.kt
new file mode 100644
index 0000000..04719af
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/model/SensorPrivacyToggleTileModel.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.qs.tiles.impl.sensorprivacy.domain.model
+
+/**
+ * Sensor privacy toggle tile model.
+ *
+ * @param isBlocked is true when the sensor is blocked
+ */
+@JvmInline value class SensorPrivacyToggleTileModel(val isBlocked: Boolean)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/ui/SensorPrivacyTileResources.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/ui/SensorPrivacyTileResources.kt
new file mode 100644
index 0000000..2a9fd07
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/ui/SensorPrivacyTileResources.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.qs.tiles.impl.sensorprivacy.ui
+
+import com.android.systemui.res.R
+
+sealed interface SensorPrivacyTileResources {
+    fun getIconRes(isBlocked: Boolean): Int
+    fun getTileLabelRes(): Int
+
+    data object CameraPrivacyTileResources : SensorPrivacyTileResources {
+        override fun getIconRes(isBlocked: Boolean): Int {
+            return if (isBlocked) {
+                R.drawable.qs_camera_access_icon_off
+            } else {
+                R.drawable.qs_camera_access_icon_on
+            }
+        }
+
+        override fun getTileLabelRes(): Int {
+            return R.string.quick_settings_camera_label
+        }
+    }
+
+    data object MicrophonePrivacyTileResources : SensorPrivacyTileResources {
+        override fun getIconRes(isBlocked: Boolean): Int {
+            return if (isBlocked) {
+                R.drawable.qs_mic_access_off
+            } else {
+                R.drawable.qs_mic_access_on
+            }
+        }
+
+        override fun getTileLabelRes(): Int {
+            return R.string.quick_settings_mic_label
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/ui/SensorPrivacyToggleTileMapper.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/ui/SensorPrivacyToggleTileMapper.kt
new file mode 100644
index 0000000..52622d2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/ui/SensorPrivacyToggleTileMapper.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.qs.tiles.impl.sensorprivacy.ui
+
+import android.content.res.Resources
+import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper
+import com.android.systemui.qs.tiles.impl.sensorprivacy.domain.model.SensorPrivacyToggleTileModel
+import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
+import com.android.systemui.qs.tiles.viewmodel.QSTileState
+import com.android.systemui.res.R
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+
+/** Maps [SensorPrivacyToggleTileModel] to [QSTileState]. */
+class SensorPrivacyToggleTileMapper
+@AssistedInject
+constructor(
+    @Main private val resources: Resources,
+    private val theme: Resources.Theme,
+    @Assisted private val sensorPrivacyTileResources: SensorPrivacyTileResources,
+) : QSTileDataToStateMapper<SensorPrivacyToggleTileModel> {
+
+    @AssistedFactory
+    interface Factory {
+        fun create(
+            sensorPrivacyTileResources: SensorPrivacyTileResources
+        ): SensorPrivacyToggleTileMapper
+    }
+
+    override fun map(config: QSTileConfig, data: SensorPrivacyToggleTileModel): QSTileState =
+        QSTileState.build(resources, theme, config.uiConfig) {
+            label = resources.getString(sensorPrivacyTileResources.getTileLabelRes())
+            contentDescription = label
+            supportedActions =
+                setOf(QSTileState.UserAction.CLICK, QSTileState.UserAction.LONG_CLICK)
+            icon = {
+                Icon.Loaded(
+                    resources.getDrawable(
+                        sensorPrivacyTileResources.getIconRes(data.isBlocked),
+                        theme
+                    ),
+                    null
+                )
+            }
+
+            sideViewIcon = QSTileState.SideViewIcon.None
+
+            if (data.isBlocked) {
+                activationState = QSTileState.ActivationState.INACTIVE
+                secondaryLabel = resources.getString(R.string.quick_settings_camera_mic_blocked)
+            } else {
+                activationState = QSTileState.ActivationState.ACTIVE
+                secondaryLabel = resources.getString(R.string.quick_settings_camera_mic_available)
+            }
+        }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfig.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfig.kt
index 18a4e2d..e9e9d8b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfig.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfig.kt
@@ -65,10 +65,10 @@
     data object NoRestrictions : QSTilePolicy
 
     /**
-     * Tile might be disabled by policy. [userRestriction] is usually a constant from
+     * Tile might be disabled by policy. Each item in [userRestrictions] is usually a constant from
      * [android.os.UserManager] like [android.os.UserManager.DISALLOW_AIRPLANE_MODE].
      * [com.android.systemui.qs.tiles.base.interactor.DisabledByPolicyInteractor] is commonly used
      * to resolve this and show user a message when needed.
      */
-    data class Restricted(val userRestriction: String) : QSTilePolicy
+    data class Restricted(val userRestrictions: List<String>) : QSTilePolicy
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
index 6710504..3d86e3c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
@@ -34,6 +34,7 @@
 import com.android.systemui.qs.QSImpl
 import com.android.systemui.qs.dagger.QSSceneComponent
 import com.android.systemui.res.R
+import com.android.systemui.settings.brightness.MirrorController
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.util.kotlin.sample
@@ -68,6 +69,9 @@
      */
     val qsView: Flow<View>
 
+    /** Sets the [MirrorController] in [QSImpl]. Set to `null` to remove. */
+    fun setBrightnessMirrorController(mirrorController: MirrorController?)
+
     /**
      * Inflate an instance of [QSImpl] for this context. Once inflated, it will be available in
      * [qsView]. Re-inflations due to configuration changes will use the last used [context].
@@ -93,6 +97,9 @@
     val isQsFullyCollapsed: Boolean
         get() = true
 
+    /** Request that the customizer be closed. Possibly animating it. */
+    fun requestCloseCustomizer()
+
     sealed interface State {
 
         val isVisible: Boolean
@@ -203,7 +210,7 @@
         applicationScope.launch {
             launch {
                 state.sample(_isCustomizing, ::Pair).collect { (state, customizing) ->
-                    _qsImpl.value?.apply {
+                    qsImpl.value?.apply {
                         if (state != QSSceneAdapter.State.QS && customizing) {
                             [email protected]()
                         }
@@ -277,6 +284,14 @@
         bottomNavBarSize.emit(padding)
     }
 
+    override fun requestCloseCustomizer() {
+        qsImpl.value?.closeCustomizer()
+    }
+
+    override fun setBrightnessMirrorController(mirrorController: MirrorController?) {
+        qsImpl.value?.setBrightnessMirrorController(mirrorController)
+    }
+
     private fun QSImpl.applyState(state: QSSceneAdapter.State) {
         setQsVisible(state.isVisible)
         setExpanded(state.isVisible && state.expansion > 0f)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModel.kt
new file mode 100644
index 0000000..a3c2cbb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModel.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.qs.ui.viewmodel
+
+import com.android.systemui.brightness.ui.viewmodel.BrightnessSliderViewModel
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+
+@SysUISingleton
+class QuickSettingsContainerViewModel
+@Inject
+constructor(
+    val brightnessSliderViewModel: BrightnessSliderViewModel,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModel.kt
index c695d4c..4e0b576 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModel.kt
@@ -20,17 +20,20 @@
 import com.android.compose.animation.scene.Back
 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.dagger.SysUISingleton
 import com.android.systemui.qs.FooterActionsController
 import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel
 import com.android.systemui.qs.ui.adapter.QSSceneAdapter
+import com.android.systemui.scene.domain.interactor.SceneInteractor
 import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.settings.brightness.ui.viewModel.BrightnessMirrorViewModel
 import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel
 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
 import java.util.concurrent.atomic.AtomicBoolean
 import javax.inject.Inject
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
 
 /** Models UI state and handles user input for the quick settings scene. */
@@ -38,23 +41,29 @@
 class QuickSettingsSceneViewModel
 @Inject
 constructor(
+    val brightnessMirrorViewModel: BrightnessMirrorViewModel,
     val shadeHeaderViewModel: ShadeHeaderViewModel,
     val qsSceneAdapter: QSSceneAdapter,
     val notifications: NotificationsPlaceholderViewModel,
     private val footerActionsViewModelFactory: FooterActionsViewModel.Factory,
     private val footerActionsController: FooterActionsController,
+    private val sceneInteractor: SceneInteractor,
 ) {
     val destinationScenes =
-        qsSceneAdapter.isCustomizing.map { customizing ->
+        qsSceneAdapter.isCustomizing.flatMapLatest { customizing ->
             if (customizing) {
-                mapOf<UserAction, UserActionResult>(Back to UserActionResult(Scenes.QuickSettings))
+                // TODO(b/332749288) Empty map so there are no back handlers and back can close
+                // customizer
+                flowOf(emptyMap())
                 // TODO(b/330200163) Add an Up from Bottom to be able to collapse the shade
                 // while customizing
             } else {
-                mapOf(
-                    Back to UserActionResult(Scenes.Shade),
-                    Swipe(SwipeDirection.Up) to UserActionResult(Scenes.Shade),
-                )
+                sceneInteractor.previousScene.map { previousScene ->
+                    mapOf(
+                        Back to UserActionResult(previousScene ?: Scenes.Shade),
+                        Swipe(SwipeDirection.Up) to UserActionResult(previousScene ?: Scenes.Shade),
+                    )
+                }
             }
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 7c1a2c0..4ece7b6 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -99,6 +99,7 @@
 import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener;
 import com.android.systemui.scene.domain.interactor.SceneInteractor;
 import com.android.systemui.scene.shared.flag.SceneContainerFlags;
+import com.android.systemui.scene.shared.model.Scenes;
 import com.android.systemui.settings.DisplayTracker;
 import com.android.systemui.settings.UserTracker;
 import com.android.systemui.shade.ShadeViewController;
@@ -239,6 +240,11 @@
                             } else {
                                 mShadeViewControllerLazy.get().finishInputFocusTransfer(velocity);
                             }
+                        } else if (action == ACTION_UP) {
+                            // Gesture was too short to be picked up by scene container touch
+                            // handling; programmatically start the transition to shade scene.
+                            mSceneInteractor.get().changeScene(
+                                    Scenes.Shade, "short launcher swipe");
                         }
                     }
                     event.recycle();
@@ -259,6 +265,12 @@
         }
 
         @Override
+        public void setOverrideHomeButtonLongPress(long duration, float slopMultiplier) {
+            verifyCallerAndClearCallingIdentityPostMain("setOverrideHomeButtonLongPress",
+                    () -> notifySetOverrideHomeButtonLongPress(duration, slopMultiplier));
+        }
+
+        @Override
         public void onBackPressed() {
             verifyCallerAndClearCallingIdentityPostMain("onBackPressed", () -> {
                 sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
@@ -947,6 +959,12 @@
         }
     }
 
+    private void notifySetOverrideHomeButtonLongPress(long duration, float slopMultiplier) {
+        for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
+            mConnectionCallbacks.get(i).setOverrideHomeButtonLongPress(duration, slopMultiplier);
+        }
+    }
+
     public void notifyAssistantVisibilityChanged(float visibility) {
         try {
             if (mOverviewProxy != null) {
@@ -1104,6 +1122,8 @@
         default void startAssistant(Bundle bundle) {}
         default void setAssistantOverridesRequested(int[] invocationTypes) {}
         default void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) {}
+        /** Set override of home button long press duration and touch slop multiplier. */
+        default void setOverrideHomeButtonLongPress(long override, float slopMultiplier) {}
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt
index 5e4919d..4d34a86 100644
--- a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt
+++ b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.recordissue
 
+import android.app.IActivityManager
 import android.app.NotificationManager
 import android.content.Context
 import android.content.Intent
@@ -51,7 +52,7 @@
 @Inject
 constructor(
     controller: RecordingController,
-    @LongRunning executor: Executor,
+    @LongRunning private val bgExecutor: Executor,
     @Main handler: Handler,
     uiEventLogger: UiEventLogger,
     notificationManager: NotificationManager,
@@ -60,10 +61,12 @@
     private val dialogTransitionAnimator: DialogTransitionAnimator,
     private val panelInteractor: PanelInteractor,
     private val issueRecordingState: IssueRecordingState,
+    private val iActivityManager: IActivityManager,
+    private val launcherApps: LauncherApps,
 ) :
     RecordingService(
         controller,
-        executor,
+        bgExecutor,
         handler,
         uiEventLogger,
         notificationManager,
@@ -103,12 +106,26 @@
                 // ViewCapture needs to save it's data before it is disabled, or else the data will
                 // be lost. This is expected to change in the near future, and when that happens
                 // this line should be removed.
-                getSystemService(LauncherApps::class.java)?.saveViewCaptureData()
+                launcherApps.saveViewCaptureData()
                 TraceUtils.traceStop(contentResolver)
                 issueRecordingState.isRecording = false
             }
             ACTION_SHARE -> {
-                shareRecording(intent)
+                bgExecutor.execute {
+                    mNotificationManager.cancelAsUser(
+                        null,
+                        mNotificationId,
+                        UserHandle(mUserContextTracker.userContext.userId)
+                    )
+
+                    val screenRecording = intent.getParcelableExtra(EXTRA_PATH, Uri::class.java)
+                    if (issueRecordingState.takeBugReport) {
+                        iActivityManager.requestBugReportWithExtraAttachment(screenRecording)
+                    } else {
+                        shareRecording(screenRecording)
+                    }
+                }
+
                 dialogTransitionAnimator.disableAllCurrentDialogsExitAnimations()
                 panelInteractor.collapsePanels()
 
@@ -122,23 +139,17 @@
         return super.onStartCommand(intent, flags, startId)
     }
 
-    private fun shareRecording(intent: Intent) {
+    private fun shareRecording(screenRecording: Uri?) {
         val sharableUri: Uri =
             zipAndPackageRecordings(
                 TraceUtils.traceDump(contentResolver, TRACE_FILE_NAME).get(),
-                intent.getStringExtra(EXTRA_PATH)
+                screenRecording
             )
                 ?: return
         val sendIntent =
             FileSender.buildSendIntent(this, listOf(sharableUri))
                 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
 
-        mNotificationManager.cancelAsUser(
-            null,
-            mNotificationId,
-            UserHandle(mUserContextTracker.userContext.userId)
-        )
-
         // TODO: Debug why the notification shade isn't closing upon starting the BetterBug activity
         mKeyguardDismissUtil.executeWhenUnlocked(
             {
@@ -150,7 +161,7 @@
         )
     }
 
-    private fun zipAndPackageRecordings(traceFiles: List<File>, screenRecordingUri: String?): Uri? {
+    private fun zipAndPackageRecordings(traceFiles: List<File>, screenRecording: Uri?): Uri? {
         try {
             externalCacheDir?.mkdirs()
             val outZip: File = File.createTempFile(TEMP_FILE_PREFIX, ZIP_SUFFIX, externalCacheDir)
@@ -160,8 +171,8 @@
                     Files.copy(file.toPath(), os)
                     os.closeEntry()
                 }
-                if (screenRecordingUri != null) {
-                    contentResolver.openInputStream(Uri.parse(screenRecordingUri))?.use {
+                if (screenRecording != null) {
+                    contentResolver.openInputStream(screenRecording)?.use {
                         os.putNextEntry(ZipEntry(SCREEN_RECORDING_ZIP_LABEL))
                         it.transferTo(os)
                         os.closeEntry()
@@ -215,7 +226,7 @@
         fun getStartIntent(
             context: Context,
             screenRecord: Boolean,
-            winscopeTracing: Boolean
+            winscopeTracing: Boolean,
         ): Intent =
             Intent(context, IssueRecordingService::class.java)
                 .setAction(ACTION_START)
diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingState.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingState.kt
index 394c5c2..12ed06d 100644
--- a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingState.kt
+++ b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingState.kt
@@ -25,6 +25,8 @@
 
     private val listeners = CopyOnWriteArrayList<Runnable>()
 
+    var takeBugReport: Boolean = false
+
     var isRecording = false
         set(value) {
             field = value
diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt
index 832fc3f0..68b8836 100644
--- a/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/recordissue/RecordIssueDialogDelegate.kt
@@ -63,6 +63,7 @@
     private val mediaProjectionMetricsLogger: MediaProjectionMetricsLogger,
     private val userFileManager: UserFileManager,
     private val screenCaptureDisabledDialogDelegate: ScreenCaptureDisabledDialogDelegate,
+    private val issueRecordingState: IssueRecordingState,
     @Assisted private val onStarted: Consumer<IssueRecordingConfig>,
 ) : SystemUIDialog.Delegate {
 
@@ -74,6 +75,7 @@
     }
 
     @SuppressLint("UseSwitchCompatOrMaterialCode") private lateinit var screenRecordSwitch: Switch
+    @SuppressLint("UseSwitchCompatOrMaterialCode") private lateinit var bugReportSwitch: Switch
     private lateinit var issueTypeButton: Button
 
     @MainThread
@@ -86,6 +88,7 @@
             setPositiveButton(
                 R.string.qs_record_issue_start,
                 { _, _ ->
+                    issueRecordingState.takeBugReport = bugReportSwitch.isChecked
                     onStarted.accept(
                         IssueRecordingConfig(
                             screenRecordSwitch.isChecked,
@@ -113,6 +116,7 @@
                     bgExecutor.execute { onScreenRecordSwitchClicked() }
                 }
             }
+            bugReportSwitch = requireViewById(R.id.bugreport_switch)
             val startButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
             issueTypeButton = requireViewById(R.id.issue_type_button)
             issueTypeButton.setOnClickListener {
@@ -131,7 +135,7 @@
                     .isScreenCaptureCompletelyDisabled(UserHandle.of(userTracker.userId))
         ) {
             mainExecutor.execute {
-                screenCaptureDisabledDialogDelegate.createDialog().show()
+                screenCaptureDisabledDialogDelegate.createSysUIDialog().show()
                 screenRecordSwitch.isChecked = false
             }
             return
diff --git a/packages/SystemUI/src/com/android/systemui/scene/data/repository/SceneContainerRepository.kt b/packages/SystemUI/src/com/android/systemui/scene/data/repository/SceneContainerRepository.kt
index 994b012..3082eb9 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/data/repository/SceneContainerRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/data/repository/SceneContainerRepository.kt
@@ -24,6 +24,8 @@
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.scene.shared.model.SceneContainerConfig
 import com.android.systemui.scene.shared.model.SceneDataSource
+import com.android.systemui.util.kotlin.WithPrev
+import com.android.systemui.util.kotlin.pairwise
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -34,6 +36,7 @@
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.stateIn
 
 /** Source of truth for scene framework application state. */
@@ -44,7 +47,32 @@
     private val config: SceneContainerConfig,
     private val dataSource: SceneDataSource,
 ) {
-    val currentScene: StateFlow<SceneKey> = dataSource.currentScene
+    private val previousAndCurrentScene: StateFlow<WithPrev<SceneKey?, SceneKey>> =
+        dataSource.currentScene
+            .pairwise()
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.WhileSubscribed(),
+                initialValue = WithPrev(null, dataSource.currentScene.value),
+            )
+
+    val currentScene: StateFlow<SceneKey> =
+        previousAndCurrentScene
+            .map { it.newValue }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.WhileSubscribed(),
+                initialValue = previousAndCurrentScene.value.newValue,
+            )
+
+    val previousScene: StateFlow<SceneKey?> =
+        previousAndCurrentScene
+            .map { it.previousValue }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.WhileSubscribed(),
+                initialValue = previousAndCurrentScene.value.previousValue,
+            )
 
     private val _isVisible = MutableStateFlow(true)
     val isVisible: StateFlow<Boolean> = _isVisible.asStateFlow()
diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractor.kt
new file mode 100644
index 0000000..5d60373
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractor.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.systemui.scene.domain.interactor
+
+import com.android.compose.animation.scene.ObservableTransitionState
+import com.android.compose.animation.scene.SceneKey
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.keyguard.domain.interactor.KeyguardOcclusionInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.scene.shared.model.Scenes
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.flow.stateIn
+
+/** Encapsulates logic regarding the occlusion state of the scene container. */
+@SysUISingleton
+class SceneContainerOcclusionInteractor
+@Inject
+constructor(
+    @Application applicationScope: CoroutineScope,
+    keyguardOcclusionInteractor: KeyguardOcclusionInteractor,
+    sceneInteractor: SceneInteractor,
+    keyguardTransitionInteractor: KeyguardTransitionInteractor,
+) {
+    /** Whether a show-when-locked activity is at the top of the current activity stack. */
+    private val isOccludingActivityShown: StateFlow<Boolean> =
+        keyguardOcclusionInteractor.isShowWhenLockedActivityOnTop.stateIn(
+            scope = applicationScope,
+            started = SharingStarted.WhileSubscribed(),
+            initialValue = false,
+        )
+
+    /**
+     * Whether AOD is fully shown (not transitioning) or partially shown during a transition to/from
+     * AOD.
+     */
+    private val isAodFullyOrPartiallyShown: StateFlow<Boolean> =
+        keyguardTransitionInteractor
+            .transitionValue(KeyguardState.AOD)
+            .onStart { emit(0f) }
+            .map { it > 0 }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.WhileSubscribed(),
+                initialValue = false,
+            )
+
+    /**
+     * Whether the scene container should become invisible due to "occlusion" by an in-foreground
+     * "show when locked" activity.
+     */
+    val invisibleDueToOcclusion: StateFlow<Boolean> =
+        combine(
+                isOccludingActivityShown,
+                sceneInteractor.transitionState,
+                isAodFullyOrPartiallyShown,
+            ) { isOccludingActivityShown, sceneTransitionState, isAodFullyOrPartiallyShown ->
+                invisibleDueToOcclusion(
+                    isOccludingActivityShown = isOccludingActivityShown,
+                    sceneTransitionState = sceneTransitionState,
+                    isAodFullyOrPartiallyShown = isAodFullyOrPartiallyShown,
+                )
+            }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.WhileSubscribed(),
+                initialValue =
+                    invisibleDueToOcclusion(
+                        isOccludingActivityShown = isOccludingActivityShown.value,
+                        sceneTransitionState = sceneInteractor.transitionState.value,
+                        isAodFullyOrPartiallyShown = isAodFullyOrPartiallyShown.value,
+                    ),
+            )
+
+    private fun invisibleDueToOcclusion(
+        isOccludingActivityShown: Boolean,
+        sceneTransitionState: ObservableTransitionState,
+        isAodFullyOrPartiallyShown: Boolean,
+    ): Boolean {
+        return isOccludingActivityShown &&
+            // Cannot be occluded in AOD.
+            !isAodFullyOrPartiallyShown &&
+            // Only some scenes can be occluded.
+            sceneTransitionState.canBeOccluded
+    }
+
+    private val ObservableTransitionState.canBeOccluded: Boolean
+        get() =
+            when (this) {
+                is ObservableTransitionState.Idle -> scene.canBeOccluded
+                is ObservableTransitionState.Transition ->
+                    fromScene.canBeOccluded && toScene.canBeOccluded
+            }
+
+    /**
+     * Whether the scene can be occluded by a "show when locked" activity. Some scenes should, on
+     * principle not be occlude-able because they render as if they are expanding on top of the
+     * occluding activity.
+     */
+    private val SceneKey.canBeOccluded: Boolean
+        get() =
+            when (this) {
+                Scenes.Bouncer -> true
+                Scenes.Communal -> true
+                Scenes.Gone -> true
+                Scenes.Lockscreen -> true
+                Scenes.QuickSettings -> false
+                Scenes.Shade -> false
+                else -> error("SceneKey \"$this\" doesn't have a mapping for canBeOccluded!")
+            }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt
index 75bf131..0239455 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt
@@ -140,6 +140,14 @@
             )
 
     /**
+     * The previous scene.
+     *
+     * This is effectively the previous value of [currentScene] which means that all caveats, for
+     * example regarding when in a transition the current scene changes, apply.
+     */
+    val previousScene: StateFlow<SceneKey?> = repository.previousScene
+
+    /**
      * Returns the keys of all scenes in the container.
      *
      * The scenes will be sorted in z-order such that the last one is the one that should be
@@ -162,7 +170,9 @@
         loggingReason: String,
         transitionKey: TransitionKey? = null,
     ) {
-        check(toScene != Scenes.Gone || deviceUnlockedInteractor.isDeviceUnlocked.value) {
+        check(
+            toScene != Scenes.Gone || deviceUnlockedInteractor.deviceUnlockStatus.value.isUnlocked
+        ) {
             "Cannot change to the Gone scene while the device is locked. Logging reason for scene" +
                 " change was: $loggingReason"
         }
diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt
index 32e8f55..32d72e0 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt
@@ -32,7 +32,9 @@
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.dagger.qualifiers.DisplayId
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
+import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.model.SceneContainerPlugin
 import com.android.systemui.model.SysUiState
@@ -40,6 +42,7 @@
 import com.android.systemui.plugins.FalsingManager
 import com.android.systemui.plugins.FalsingManager.FalsingBeliefListener
 import com.android.systemui.power.domain.interactor.PowerInteractor
+import com.android.systemui.scene.domain.interactor.SceneContainerOcclusionInteractor
 import com.android.systemui.scene.domain.interactor.SceneInteractor
 import com.android.systemui.scene.shared.flag.SceneContainerFlags
 import com.android.systemui.scene.shared.logger.SceneLogger
@@ -49,6 +52,7 @@
 import com.android.systemui.statusbar.phone.CentralSurfaces
 import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
 import com.android.systemui.util.asIndenting
+import com.android.systemui.util.kotlin.sample
 import com.android.systemui.util.printSection
 import com.android.systemui.util.println
 import dagger.Lazy
@@ -62,6 +66,8 @@
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.distinctUntilChangedBy
 import kotlinx.coroutines.flow.emptyFlow
+import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.flow.filterIsInstance
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
@@ -79,6 +85,7 @@
     @Application private val applicationScope: CoroutineScope,
     private val sceneInteractor: SceneInteractor,
     private val deviceEntryInteractor: DeviceEntryInteractor,
+    private val deviceUnlockedInteractor: DeviceUnlockedInteractor,
     private val bouncerInteractor: BouncerInteractor,
     private val keyguardInteractor: KeyguardInteractor,
     private val flags: SceneContainerFlags,
@@ -94,6 +101,8 @@
     private val deviceProvisioningInteractor: DeviceProvisioningInteractor,
     private val centralSurfaces: CentralSurfaces,
     private val headsUpInteractor: HeadsUpNotificationInteractor,
+    private val occlusionInteractor: SceneContainerOcclusionInteractor,
+    private val faceUnlockInteractor: DeviceEntryFaceAuthInteractor,
 ) : CoreStartable {
 
     override fun start() {
@@ -106,6 +115,7 @@
             respondToFalsingDetections()
             hydrateWindowFocus()
             hydrateInteractionState()
+            handleBouncerOverscroll()
         } else {
             sceneLogger.logFrameworkEnabled(
                 isEnabled = false,
@@ -126,41 +136,40 @@
     private fun hydrateVisibility() {
         applicationScope.launch {
             // TODO(b/296114544): Combine with some global hun state to make it visible!
-            combine(
-                    deviceProvisioningInteractor.isDeviceProvisioned,
-                    deviceProvisioningInteractor.isFactoryResetProtectionActive,
-                ) { isDeviceProvisioned, isFrpActive ->
-                    isDeviceProvisioned && !isFrpActive
-                }
+            deviceProvisioningInteractor.isDeviceProvisioned
                 .distinctUntilChanged()
                 .flatMapLatest { isAllowedToBeVisible ->
                     if (isAllowedToBeVisible) {
-                        sceneInteractor.transitionState
-                            .mapNotNull { state ->
-                                when (state) {
-                                    is ObservableTransitionState.Idle -> {
-                                        if (state.scene != Scenes.Gone) {
-                                            true to "scene is not Gone"
-                                        } else {
-                                            false to "scene is Gone"
+                        combine(
+                                sceneInteractor.transitionState.mapNotNull { state ->
+                                    when (state) {
+                                        is ObservableTransitionState.Idle -> {
+                                            if (state.scene != Scenes.Gone) {
+                                                true to "scene is not Gone"
+                                            } else {
+                                                false to "scene is Gone"
+                                            }
+                                        }
+                                        is ObservableTransitionState.Transition -> {
+                                            if (state.fromScene == Scenes.Gone) {
+                                                true to "scene transitioning away from Gone"
+                                            } else {
+                                                null
+                                            }
                                         }
                                     }
-                                    is ObservableTransitionState.Transition -> {
-                                        if (state.fromScene == Scenes.Gone) {
-                                            true to "scene transitioning away from Gone"
-                                        } else {
-                                            null
-                                        }
-                                    }
-                                }
-                            }
-                            .combine(headsUpInteractor.isHeadsUpOrAnimatingAway) {
+                                },
+                                headsUpInteractor.isHeadsUpOrAnimatingAway,
+                                occlusionInteractor.invisibleDueToOcclusion,
+                            ) {
                                 visibilityForTransitionState,
-                                isHeadsUpOrAnimatingAway ->
-                                if (isHeadsUpOrAnimatingAway) {
-                                    true to "showing a HUN"
-                                } else {
-                                    visibilityForTransitionState
+                                isHeadsUpOrAnimatingAway,
+                                invisibleDueToOcclusion,
+                                ->
+                                when {
+                                    isHeadsUpOrAnimatingAway -> true to "showing a HUN"
+                                    invisibleDueToOcclusion -> false to "invisible due to occlusion"
+                                    else -> visibilityForTransitionState
                                 }
                             }
                             .distinctUntilChanged()
@@ -188,51 +197,53 @@
             }
         }
         applicationScope.launch {
-            simBouncerInteractor.get().isAnySimSecure.collect { isAnySimLocked ->
-                val canSwipeToEnter = deviceEntryInteractor.canSwipeToEnter.value
-                val isUnlocked = deviceEntryInteractor.isUnlocked.value
-
-                when {
-                    isAnySimLocked -> {
-                        switchToScene(
-                            targetSceneKey = Scenes.Bouncer,
-                            loggingReason = "Need to authenticate locked SIM card."
-                        )
-                    }
-                    isUnlocked && canSwipeToEnter == false -> {
-                        switchToScene(
-                            targetSceneKey = Scenes.Gone,
-                            loggingReason =
-                                "All SIM cards unlocked and device already" +
-                                    " unlocked and lockscreen doesn't require a swipe to dismiss."
-                        )
-                    }
-                    else -> {
-                        switchToScene(
-                            targetSceneKey = Scenes.Lockscreen,
-                            loggingReason =
-                                "All SIM cards unlocked and device still locked" +
-                                    " or lockscreen still requires a swipe to dismiss."
-                        )
+            simBouncerInteractor
+                .get()
+                .isAnySimSecure
+                .sample(deviceUnlockedInteractor.deviceUnlockStatus, ::Pair)
+                .collect { (isAnySimLocked, unlockStatus) ->
+                    when {
+                        isAnySimLocked -> {
+                            switchToScene(
+                                targetSceneKey = Scenes.Bouncer,
+                                loggingReason = "Need to authenticate locked SIM card."
+                            )
+                        }
+                        unlockStatus.isUnlocked &&
+                            deviceEntryInteractor.canSwipeToEnter.value == false -> {
+                            switchToScene(
+                                targetSceneKey = Scenes.Gone,
+                                loggingReason =
+                                    "All SIM cards unlocked and device already unlocked and " +
+                                        "lockscreen doesn't require a swipe to dismiss."
+                            )
+                        }
+                        else -> {
+                            switchToScene(
+                                targetSceneKey = Scenes.Lockscreen,
+                                loggingReason =
+                                    "All SIM cards unlocked and device still locked" +
+                                        " or lockscreen still requires a swipe to dismiss."
+                            )
+                        }
                     }
                 }
-            }
         }
         applicationScope.launch {
-            deviceEntryInteractor.isUnlocked
-                .mapNotNull { isUnlocked ->
+            deviceUnlockedInteractor.deviceUnlockStatus
+                .mapNotNull { deviceUnlockStatus ->
                     val renderedScenes =
                         when (val transitionState = sceneInteractor.transitionState.value) {
                             is ObservableTransitionState.Idle -> setOf(transitionState.scene)
                             is ObservableTransitionState.Transition ->
                                 setOf(
-                                    transitionState.progress,
+                                    transitionState.fromScene,
                                     transitionState.toScene,
                                 )
                         }
                     val isOnLockscreen = renderedScenes.contains(Scenes.Lockscreen)
                     val isOnBouncer = renderedScenes.contains(Scenes.Bouncer)
-                    if (!isUnlocked) {
+                    if (!deviceUnlockStatus.isUnlocked) {
                         return@mapNotNull if (isOnLockscreen || isOnBouncer) {
                             // Already on lockscreen or bouncer, no need to change scenes.
                             null
@@ -244,8 +255,6 @@
                         }
                     }
 
-                    val isBypassEnabled = deviceEntryInteractor.isBypassEnabled.value
-                    val canSwipeToEnter = deviceEntryInteractor.canSwipeToEnter.value
                     when {
                         isOnBouncer ->
                             // When the device becomes unlocked in Bouncer, go to Gone.
@@ -260,14 +269,12 @@
                             //    when the unlock state changes indicates this is an active
                             //    authentication attempt.
                             when {
-                                isBypassEnabled ->
+                                deviceUnlockStatus.deviceUnlockSource?.dismissesLockscreen ==
+                                    true ->
                                     Scenes.Gone to
-                                        "device has been unlocked on lockscreen with bypass" +
-                                            " enabled"
-                                canSwipeToEnter == false ->
-                                    Scenes.Gone to
-                                        "device has been unlocked on lockscreen using an active" +
-                                            " authentication mechanism"
+                                        "device has been unlocked on lockscreen with bypass " +
+                                            "enabled or using an active authentication " +
+                                            "mechanism: ${deviceUnlockStatus.deviceUnlockSource}"
                                 else -> null
                             }
                         // Not on lockscreen or bouncer, so remain in the current scene.
@@ -291,14 +298,19 @@
                     )
                 } else {
                     val canSwipeToEnter = deviceEntryInteractor.canSwipeToEnter.value
-                    val isUnlocked = deviceEntryInteractor.isUnlocked.value
+                    val isUnlocked = deviceUnlockedInteractor.deviceUnlockStatus.value.isUnlocked
                     if (isUnlocked && canSwipeToEnter == false) {
-                        switchToScene(
-                            targetSceneKey = Scenes.Gone,
-                            loggingReason =
-                                "device is waking up while unlocked without the ability" +
-                                    " to swipe up on lockscreen to enter.",
-                        )
+                        val isTransitioningToLockscreen =
+                            sceneInteractor.transitioningTo.value == Scenes.Lockscreen
+                        if (!isTransitioningToLockscreen) {
+                            switchToScene(
+                                targetSceneKey = Scenes.Gone,
+                                loggingReason =
+                                    "device is waking up while unlocked without the ability to" +
+                                        " swipe up on lockscreen to enter and not on or" +
+                                        " transitioning to, the lockscreen scene.",
+                            )
+                        }
                     } else if (
                         authenticationInteractor.get().getAuthenticationMethod() ==
                             AuthenticationMethodModel.Sim
@@ -316,15 +328,23 @@
     /** Keeps [SysUiState] up-to-date */
     private fun hydrateSystemUiState() {
         applicationScope.launch {
-            sceneInteractor.transitionState
-                .mapNotNull { it as? ObservableTransitionState.Idle }
-                .map { it.scene }
-                .distinctUntilChanged()
-                .collect { sceneKey ->
+            combine(
+                    sceneInteractor.transitionState
+                        .mapNotNull { it as? ObservableTransitionState.Idle }
+                        .map { it.scene }
+                        .distinctUntilChanged(),
+                    occlusionInteractor.invisibleDueToOcclusion,
+                ) { sceneKey, invisibleDueToOcclusion ->
+                    SceneContainerPlugin.SceneContainerPluginState(
+                        scene = sceneKey,
+                        invisibleDueToOcclusion = invisibleDueToOcclusion,
+                    )
+                }
+                .collect { sceneContainerPluginState ->
                     sysUiState.updateFlags(
                         displayId,
                         *SceneContainerPlugin.EvaluatorByFlag.map { (flag, evaluator) ->
-                                flag to evaluator.invoke(sceneKey)
+                                flag to evaluator.invoke(sceneContainerPluginState)
                             }
                             .toTypedArray(),
                     )
@@ -410,8 +430,8 @@
     /** Keeps the interaction state of [CentralSurfaces] up-to-date. */
     private fun hydrateInteractionState() {
         applicationScope.launch {
-            deviceEntryInteractor.isUnlocked
-                .map { !it }
+            deviceUnlockedInteractor.deviceUnlockStatus
+                .map { !it.isUnlocked }
                 .flatMapLatest { isDeviceLocked ->
                     if (isDeviceLocked) {
                         sceneInteractor.transitionState
@@ -447,6 +467,33 @@
         }
     }
 
+    private fun handleBouncerOverscroll() {
+        applicationScope.launch {
+            sceneInteractor.transitionState
+                // Only consider transitions.
+                .filterIsInstance<ObservableTransitionState.Transition>()
+                // Only consider user-initiated (e.g. drags) that go from bouncer to lockscreen.
+                .filter { transition ->
+                    transition.fromScene == Scenes.Bouncer &&
+                        transition.toScene == Scenes.Lockscreen &&
+                        transition.isInitiatedByUserInput
+                }
+                .flatMapLatest { it.progress }
+                // Figure out the direction of scrolling.
+                .map { progress ->
+                    when {
+                        progress > 0 -> 1
+                        progress < 0 -> -1
+                        else -> 0
+                    }
+                }
+                .distinctUntilChanged()
+                // Only consider negative scrolling, AKA overscroll.
+                .filter { it == -1 }
+                .collect { faceUnlockInteractor.onSwipeUpOnBouncer() }
+        }
+    }
+
     private fun switchToScene(targetSceneKey: SceneKey, loggingReason: String) {
         sceneInteractor.changeScene(
             toScene = targetSceneKey,
diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt
index 54ec398..cff11a7 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt
@@ -21,14 +21,17 @@
 import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
 import com.android.systemui.Flags.sceneContainer
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
 import com.android.systemui.flags.FlagToken
-import com.android.systemui.flags.Flags.SCENE_CONTAINER_ENABLED
 import com.android.systemui.flags.RefactorFlagUtils
 import com.android.systemui.keyguard.KeyguardBottomAreaRefactor
 import com.android.systemui.keyguard.KeyguardWmStateRefactor
 import com.android.systemui.keyguard.MigrateClocksToBlueprint
 import com.android.systemui.keyguard.shared.ComposeLockscreen
+import com.android.systemui.keyguard.shared.RefactorKeyguardDismissIntent
 import com.android.systemui.media.controls.util.MediaInSceneContainerFlag
+import com.android.systemui.statusbar.notification.shared.NotificationsHeadsUpRefactor
+import com.android.systemui.statusbar.phone.PredictiveBackSysUiFlag
 import dagger.Module
 import dagger.Provides
 
@@ -40,52 +43,45 @@
     @JvmStatic
     inline val isEnabled
         get() =
-            SCENE_CONTAINER_ENABLED && // mainStaticFlag
             sceneContainer() && // mainAconfigFlag
+            ComposeLockscreen.isEnabled &&
                 KeyguardBottomAreaRefactor.isEnabled &&
-                MigrateClocksToBlueprint.isEnabled &&
-                ComposeLockscreen.isEnabled &&
+                KeyguardWmStateRefactor.isEnabled &&
                 MediaInSceneContainerFlag.isEnabled &&
-                KeyguardWmStateRefactor.isEnabled
+                MigrateClocksToBlueprint.isEnabled &&
+                NotificationsHeadsUpRefactor.isEnabled &&
+                PredictiveBackSysUiFlag.isEnabled &&
+                DeviceEntryUdfpsRefactor.isEnabled &&
+                RefactorKeyguardDismissIntent.isEnabled
     // NOTE: Changes should also be made in getSecondaryFlags and @EnableSceneContainer
 
-    /**
-     * The main static flag, SCENE_CONTAINER_ENABLED. This is an explicit static flag check that
-     * helps with downstream optimizations (like unused code stripping) in builds where aconfig
-     * flags are still writable. Do not remove!
-     */
-    inline fun getMainStaticFlag() =
-        FlagToken("Flags.SCENE_CONTAINER_ENABLED", SCENE_CONTAINER_ENABLED)
-
     /** The main aconfig flag. */
     inline fun getMainAconfigFlag() = FlagToken(FLAG_SCENE_CONTAINER, sceneContainer())
 
     /** The set of secondary flags which must be enabled for scene container to work properly */
     inline fun getSecondaryFlags(): Sequence<FlagToken> =
         sequenceOf(
-            KeyguardBottomAreaRefactor.token,
-            MigrateClocksToBlueprint.token,
-            KeyguardWmStateRefactor.token,
             ComposeLockscreen.token,
+            KeyguardBottomAreaRefactor.token,
+            KeyguardWmStateRefactor.token,
             MediaInSceneContainerFlag.token,
+            MigrateClocksToBlueprint.token,
+            NotificationsHeadsUpRefactor.token,
+            PredictiveBackSysUiFlag.token,
+            DeviceEntryUdfpsRefactor.token,
+            RefactorKeyguardDismissIntent.token,
             // NOTE: Changes should also be made in isEnabled and @EnableSceneContainer
         )
 
     /** The full set of requirements for SceneContainer */
     inline fun getAllRequirements(): Sequence<FlagToken> {
-        return sequenceOf(getMainStaticFlag(), getMainAconfigFlag()) + getSecondaryFlags()
+        return sequenceOf(getMainAconfigFlag()) + getSecondaryFlags()
     }
 
     /** Return all dependencies of this flag in pairs where [Pair.first] depends on [Pair.second] */
     inline fun getFlagDependencies(): Sequence<Pair<FlagToken, FlagToken>> {
-        val mainStaticFlag = getMainStaticFlag()
         val mainAconfigFlag = getMainAconfigFlag()
-        return sequence {
-            // The static and aconfig flags should be equal; make them co-dependent
-            yield(mainAconfigFlag to mainStaticFlag)
-            yield(mainStaticFlag to mainAconfigFlag)
-            // all other flags depend on the static flag for brevity
-        } + getSecondaryFlags().map { mainStaticFlag to it }
+        return getSecondaryFlags().map { mainAconfigFlag to it }
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/model/SceneDataSourceDelegator.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/model/SceneDataSourceDelegator.kt
index 69dce83..2fbcba9 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/shared/model/SceneDataSourceDelegator.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/shared/model/SceneDataSourceDelegator.kt
@@ -20,9 +20,6 @@
 
 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 javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.MutableStateFlow
@@ -36,14 +33,10 @@
  * Delegates calls to a runtime-provided [SceneDataSource] or to a no-op implementation if a
  * delegate isn't set.
  */
-@SysUISingleton
-class SceneDataSourceDelegator
-@Inject
-constructor(
-    @Application private val applicationScope: CoroutineScope,
+class SceneDataSourceDelegator(
+    applicationScope: CoroutineScope,
     config: SceneContainerConfig,
 ) : SceneDataSource {
-
     private val noOpDelegate = NoOpSceneDataSource(config.initialSceneKey)
     private val delegateMutable = MutableStateFlow<SceneDataSource>(noOpDelegate)
 
@@ -82,6 +75,7 @@
     ) : SceneDataSource {
         override val currentScene: StateFlow<SceneKey> =
             MutableStateFlow(initialSceneKey).asStateFlow()
+
         override fun changeScene(toScene: SceneKey, transitionKey: TransitionKey?) = Unit
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
index 8fe84c9..3dc2070 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
@@ -164,7 +164,7 @@
         if (mFlags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING_ENTERPRISE_POLICIES)
                 && mDevicePolicyResolver.get()
                         .isScreenCaptureCompletelyDisabled(getHostUserHandle())) {
-            return mScreenCaptureDisabledDialogDelegate.createDialog();
+            return mScreenCaptureDisabledDialogDelegate.createSysUIDialog();
         }
 
         mMediaProjectionMetricsLogger.notifyProjectionInitiated(
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
index b2c01e1..cbb61b3 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
@@ -206,7 +206,7 @@
                 break;
 
             case ACTION_SHARE:
-                Uri shareUri = Uri.parse(intent.getStringExtra(EXTRA_PATH));
+                Uri shareUri = intent.getParcelableExtra(EXTRA_PATH, Uri.class);
 
                 Intent shareIntent = new Intent(Intent.ACTION_SEND)
                         .setType("video/mp4")
@@ -356,7 +356,7 @@
                 PendingIntent.getService(
                         this,
                         REQUEST_CODE,
-                        getShareIntent(this, uri != null ? uri.toString() : null),
+                        getShareIntent(this, uri),
                         PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))
                 .build();
 
@@ -512,7 +512,7 @@
         return new Intent(context, this.getClass()).setAction(ACTION_STOP_NOTIF);
     }
 
-    private Intent getShareIntent(Context context, String path) {
+    private Intent getShareIntent(Context context, Uri path) {
         return new Intent(context, this.getClass()).setAction(ACTION_SHARE)
                 .putExtra(EXTRA_PATH, path);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
index ba775cd..1c76b00 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
@@ -18,6 +18,7 @@
 import android.annotation.SuppressLint
 import android.app.Activity
 import android.app.PendingIntent
+import android.content.Context
 import android.content.Intent
 import android.os.Bundle
 import android.os.Handler
@@ -35,12 +36,15 @@
 import android.widget.Spinner
 import android.widget.Switch
 import androidx.annotation.LayoutRes
+import androidx.annotation.StyleRes
+import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.mediaprojection.MediaProjectionCaptureTarget
 import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger
 import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorActivity
 import com.android.systemui.mediaprojection.permission.BaseMediaProjectionPermissionDialogDelegate
 import com.android.systemui.mediaprojection.permission.ENTIRE_SCREEN
 import com.android.systemui.mediaprojection.permission.SINGLE_APP
+import com.android.systemui.mediaprojection.permission.ScreenShareMode
 import com.android.systemui.mediaprojection.permission.ScreenShareOption
 import com.android.systemui.plugins.ActivityStarter
 import com.android.systemui.res.R
@@ -51,15 +55,18 @@
 import dagger.assisted.AssistedInject
 
 /** Dialog to select screen recording options */
-class ScreenRecordPermissionDialogDelegate @AssistedInject constructor(
-    @Assisted private val hostUserHandle: UserHandle,
-    @Assisted private val hostUid: Int,
-    @Assisted private val controller: RecordingController,
+class ScreenRecordPermissionDialogDelegate(
+    private val hostUserHandle: UserHandle,
+    private val hostUid: Int,
+    private val controller: RecordingController,
     private val activityStarter: ActivityStarter,
     private val userContextProvider: UserContextProvider,
-    @Assisted private val onStartRecordingClicked: Runnable?,
+    private val onStartRecordingClicked: Runnable?,
     mediaProjectionMetricsLogger: MediaProjectionMetricsLogger,
     private val systemUIDialogFactory: SystemUIDialog.Factory,
+    @ScreenShareMode defaultSelectedMode: Int,
+    @StyleRes private val theme: Int,
+    private val context: Context,
 ) :
     BaseMediaProjectionPermissionDialogDelegate<SystemUIDialog>(
         createOptionList(),
@@ -67,9 +74,34 @@
         hostUid = hostUid,
         mediaProjectionMetricsLogger,
         R.drawable.ic_screenrecord,
-        R.color.screenrecord_icon_color
-    ), SystemUIDialog.Delegate {
-
+        R.color.screenrecord_icon_color,
+        defaultSelectedMode,
+    ),
+    SystemUIDialog.Delegate {
+    @AssistedInject
+    constructor(
+        @Assisted hostUserHandle: UserHandle,
+        @Assisted hostUid: Int,
+        @Assisted controller: RecordingController,
+        activityStarter: ActivityStarter,
+        userContextProvider: UserContextProvider,
+        @Assisted onStartRecordingClicked: Runnable?,
+        mediaProjectionMetricsLogger: MediaProjectionMetricsLogger,
+        systemUIDialogFactory: SystemUIDialog.Factory,
+        @Application context: Context,
+    ) : this(
+        hostUserHandle,
+        hostUid,
+        controller,
+        activityStarter,
+        userContextProvider,
+        onStartRecordingClicked,
+        mediaProjectionMetricsLogger,
+        systemUIDialogFactory,
+        defaultSelectedMode = SINGLE_APP,
+        theme = SystemUIDialog.DEFAULT_THEME,
+        context,
+    )
 
     @AssistedFactory
     interface Factory {
@@ -77,7 +109,7 @@
             recordingController: RecordingController,
             hostUserHandle: UserHandle,
             hostUid: Int,
-            onStartRecordingClicked: Runnable?
+            onStartRecordingClicked: Runnable?,
         ): ScreenRecordPermissionDialogDelegate
     }
 
@@ -89,7 +121,7 @@
     private lateinit var options: Spinner
 
     override fun createDialog(): SystemUIDialog {
-        return systemUIDialogFactory.create(this)
+        return systemUIDialogFactory.create(this, context, theme)
     }
 
     override fun onCreate(dialog: SystemUIDialog, savedInstanceState: Bundle?) {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ActionExecutor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ActionExecutor.kt
new file mode 100644
index 0000000..caa67df
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ActionExecutor.kt
@@ -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.systemui.screenshot
+
+import android.app.ActivityOptions
+import android.app.BroadcastOptions
+import android.app.ExitTransitionCoordinator
+import android.app.ExitTransitionCoordinator.ExitTransitionCallbacks
+import android.app.PendingIntent
+import android.content.Intent
+import android.os.UserHandle
+import android.util.Log
+import android.util.Pair
+import android.view.View
+import android.view.Window
+import com.android.app.tracing.coroutines.launch
+import com.android.internal.app.ChooserActivity
+import com.android.systemui.dagger.qualifiers.Application
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import kotlinx.coroutines.CoroutineScope
+
+class ActionExecutor
+@AssistedInject
+constructor(
+    private val intentExecutor: ActionIntentExecutor,
+    @Application private val applicationScope: CoroutineScope,
+    @Assisted val window: Window,
+    @Assisted val transitionView: View,
+    @Assisted val onDismiss: (() -> Unit)
+) {
+
+    var isPendingSharedTransition = false
+        private set
+
+    fun startSharedTransition(intent: Intent, user: UserHandle, overrideTransition: Boolean) {
+        isPendingSharedTransition = true
+        val windowTransition = createWindowTransition()
+        applicationScope.launch("$TAG#launchIntentAsync") {
+            intentExecutor.launchIntent(
+                intent,
+                user,
+                overrideTransition,
+                windowTransition.first,
+                windowTransition.second
+            )
+        }
+    }
+
+    fun sendPendingIntent(pendingIntent: PendingIntent) {
+        try {
+            val options = BroadcastOptions.makeBasic()
+            options.setInteractive(true)
+            options.setPendingIntentBackgroundActivityStartMode(
+                ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED
+            )
+            pendingIntent.send(options.toBundle())
+            onDismiss.invoke()
+        } catch (e: PendingIntent.CanceledException) {
+            Log.e(TAG, "Intent cancelled", e)
+        }
+    }
+
+    /**
+     * Supplies the necessary bits for the shared element transition to share sheet. Note that once
+     * called, the action intent to share must be sent immediately after.
+     */
+    private fun createWindowTransition(): Pair<ActivityOptions, ExitTransitionCoordinator> {
+        val callbacks: ExitTransitionCallbacks =
+            object : ExitTransitionCallbacks {
+                override fun isReturnTransitionAllowed(): Boolean {
+                    return false
+                }
+
+                override fun hideSharedElements() {
+                    isPendingSharedTransition = false
+                    onDismiss.invoke()
+                }
+
+                override fun onFinish() {}
+            }
+        return ActivityOptions.startSharedElementAnimation(
+            window,
+            callbacks,
+            null,
+            Pair.create(transitionView, ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME)
+        )
+    }
+
+    @AssistedFactory
+    interface Factory {
+        fun create(window: Window, transitionView: View, onDismiss: (() -> Unit)): ActionExecutor
+    }
+
+    companion object {
+        private const val TAG = "ActionExecutor"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentCreator.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentCreator.kt
index 8e9769ab..a0cef52 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentCreator.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentCreator.kt
@@ -23,7 +23,9 @@
 import android.content.Context
 import android.content.Intent
 import android.net.Uri
+import android.os.UserHandle
 import com.android.systemui.res.R
+import com.android.systemui.screenshot.scroll.LongScreenshotActivity
 
 object ActionIntentCreator {
     /** @return a chooser intent to share the given URI. */
@@ -89,6 +91,14 @@
             .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
     }
 
+    /** @return an Intent to start the LongScreenshotActivity */
+    fun createLongScreenshotIntent(owner: UserHandle, context: Context): Intent {
+        return Intent(context, LongScreenshotActivity::class.java)
+            .putExtra(LongScreenshotActivity.EXTRA_SCREENSHOT_USER_HANDLE, owner)
+            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+    }
+
     private const val EXTRA_EDIT_SOURCE = "edit_source"
     private const val EDIT_SOURCE_SCREENSHOT = "screenshot"
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt
index 1f9853b..4eca51d 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt
@@ -25,7 +25,6 @@
 import android.os.RemoteException
 import android.os.UserHandle
 import android.util.Log
-import android.util.Pair
 import android.view.IRemoteAnimationFinishedCallback
 import android.view.IRemoteAnimationRunner
 import android.view.RemoteAnimationAdapter
@@ -67,20 +66,22 @@
      */
     fun launchIntentAsync(
         intent: Intent,
-        transition: Pair<ActivityOptions, ExitTransitionCoordinator>?,
         user: UserHandle,
         overrideTransition: Boolean,
+        options: ActivityOptions?,
+        transitionCoordinator: ExitTransitionCoordinator?,
     ) {
         applicationScope.launch("$TAG#launchIntentAsync") {
-            launchIntent(intent, transition, user, overrideTransition)
+            launchIntent(intent, user, overrideTransition, options, transitionCoordinator)
         }
     }
 
     suspend fun launchIntent(
         intent: Intent,
-        transition: Pair<ActivityOptions, ExitTransitionCoordinator>?,
         user: UserHandle,
         overrideTransition: Boolean,
+        options: ActivityOptions?,
+        transitionCoordinator: ExitTransitionCoordinator?,
     ) {
         if (screenshotActionDismissSystemWindows()) {
             keyguardController.dismiss()
@@ -90,14 +91,12 @@
         } else {
             dismissKeyguard()
         }
-        transition?.second?.startExit()
+        transitionCoordinator?.startExit()
 
         if (user == myUserHandle()) {
-            withContext(mainDispatcher) {
-                context.startActivity(intent, transition?.first?.toBundle())
-            }
+            withContext(mainDispatcher) { context.startActivity(intent, options?.toBundle()) }
         } else {
-            launchCrossProfileIntent(user, intent, transition?.first?.toBundle())
+            launchCrossProfileIntent(user, intent, options?.toBundle())
         }
 
         if (overrideTransition) {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/LegacyScreenshotViewProxy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/LegacyScreenshotViewProxy.kt
index a1481f6..4cf18fb 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/LegacyScreenshotViewProxy.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/LegacyScreenshotViewProxy.kt
@@ -34,9 +34,9 @@
 import com.android.internal.logging.UiEventLogger
 import com.android.systemui.flags.FeatureFlags
 import com.android.systemui.res.R
-import com.android.systemui.screenshot.scroll.ScrollCaptureController
 import com.android.systemui.screenshot.LogConfig.DEBUG_DISMISS
 import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_DISMISSED_OTHER
+import com.android.systemui.screenshot.scroll.ScrollCaptureController
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
@@ -113,7 +113,7 @@
     override fun setChipIntents(imageData: ScreenshotController.SavedImageData) =
         view.setChipIntents(imageData)
 
-    override fun requestDismissal(event: ScreenshotEvent) {
+    override fun requestDismissal(event: ScreenshotEvent?) {
         if (DEBUG_DISMISS) {
             Log.d(TAG, "screenshot dismissal requested")
         }
@@ -124,7 +124,7 @@
             }
             return
         }
-        logger.log(event, 0, packageName)
+        event?.let { logger.log(event, 0, packageName) }
         view.animateDismissal()
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ReferenceScreenshotModule.java b/packages/SystemUI/src/com/android/systemui/screenshot/ReferenceScreenshotModule.java
index 6224e1b..afb0280a 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ReferenceScreenshotModule.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ReferenceScreenshotModule.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.screenshot;
 
+import dagger.Binds;
 import dagger.Module;
 import dagger.Provides;
 
@@ -29,4 +30,9 @@
     static ScreenshotNotificationSmartActionsProvider providesScrnshtNotifSmartActionsProvider() {
         return new ScreenshotNotificationSmartActionsProvider();
     }
+
+    /** */
+    @Binds
+    ScreenshotActionsProvider.Factory bindScreenshotActionsProviderFactory(
+            DefaultScreenshotActionsProvider.Factory defaultScreenshotActionsProviderFactory);
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/RequestProcessor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/RequestProcessor.kt
index 3081f89..922997d 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/RequestProcessor.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/RequestProcessor.kt
@@ -18,32 +18,11 @@
 
 import android.util.Log
 import android.view.WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.app.tracing.coroutines.launch
-import kotlinx.coroutines.CoroutineScope
-import java.util.function.Consumer
-import javax.inject.Inject
-
-/** Processes a screenshot request sent from [ScreenshotHelper]. */
-interface ScreenshotRequestProcessor {
-    /**
-     * Inspects the incoming ScreenshotData, potentially modifying it based upon policy.
-     *
-     * @param screenshot the screenshot to process
-     */
-    suspend fun process(screenshot: ScreenshotData): ScreenshotData
-}
 
 /** Implementation of [ScreenshotRequestProcessor] */
-@SysUISingleton
-class RequestProcessor
-@Inject
-constructor(
+class RequestProcessor(
     private val capture: ImageCapture,
     private val policy: ScreenshotPolicy,
-    /** For the Java Async version, to invoke the callback. */
-    @Application private val mainScope: CoroutineScope
 ) : ScreenshotRequestProcessor {
 
     override suspend fun process(screenshot: ScreenshotData): ScreenshotData {
@@ -78,24 +57,6 @@
 
         return result
     }
-
-    /**
-     * Note: This is for compatibility with existing Java. Prefer the suspending function when
-     * calling from a Coroutine context.
-     *
-     * @param screenshot the screenshot to process
-     * @param callback the callback to provide the processed screenshot, invoked from the main
-     *                 thread
-     */
-    fun processAsync(screenshot: ScreenshotData, callback: Consumer<ScreenshotData>) {
-        mainScope.launch({ "$TAG#processAsync" }) {
-            val result = process(screenshot)
-            callback.accept(result)
-        }
-    }
 }
 
 private const val TAG = "RequestProcessor"
-
-/** Exception thrown by [RequestProcessor] if something goes wrong. */
-class RequestProcessorException(message: String) : IllegalStateException(message)
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
index bbf7ed5..4914409 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
@@ -165,6 +165,7 @@
                     mQuickShareData.quickShareAction, mScreenshotId, uri, mImageTime, image,
                     mParams.owner);
             mImageData.subject = getSubjectString(mImageTime);
+            mImageData.imageTime = mImageTime;
 
             mParams.mActionsReadyListener.onActionsReady(mImageData);
             if (DEBUG_CALLBACK) {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt
index 97acccd..3287425 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt
@@ -16,78 +16,140 @@
 
 package com.android.systemui.screenshot
 
+import android.app.assist.AssistContent
 import android.content.Context
-import android.content.Intent
-import android.graphics.drawable.Drawable
-import android.net.Uri
-import android.os.UserHandle
+import android.util.Log
 import androidx.appcompat.content.res.AppCompatResources
+import com.android.internal.logging.UiEventLogger
+import com.android.systemui.log.DebugLogger.debugLog
 import com.android.systemui.res.R
-import javax.inject.Inject
+import com.android.systemui.screenshot.ActionIntentCreator.createEdit
+import com.android.systemui.screenshot.ActionIntentCreator.createShareWithSubject
+import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_EDIT_TAPPED
+import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_PREVIEW_TAPPED
+import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_SHARE_TAPPED
+import com.android.systemui.screenshot.ui.viewmodel.ActionButtonAppearance
+import com.android.systemui.screenshot.ui.viewmodel.ScreenshotViewModel
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
 
 /**
  * Provides actions for screenshots. This class can be overridden by a vendor-specific SysUI
  * implementation.
  */
 interface ScreenshotActionsProvider {
-    data class ScreenshotAction(
-        val icon: Drawable? = null,
-        val text: String? = null,
-        val description: String,
-        val overrideTransition: Boolean = false,
-        val retrieveIntent: (Uri) -> Intent
-    )
+    fun onScrollChipReady(onClick: Runnable)
+    fun setCompletedScreenshot(result: ScreenshotSavedResult)
 
-    interface ScreenshotActionsCallback {
-        fun setPreviewAction(overrideTransition: Boolean = false, retrieveIntent: (Uri) -> Intent)
-        fun addAction(action: ScreenshotAction) = addActions(listOf(action))
-        fun addActions(actions: List<ScreenshotAction>)
-    }
+    fun onAssistContentAvailable(assistContent: AssistContent) {}
 
     interface Factory {
         fun create(
-            context: Context,
-            user: UserHandle?,
-            callback: ScreenshotActionsCallback
+            request: ScreenshotData,
+            requestId: String,
+            actionExecutor: ActionExecutor,
         ): ScreenshotActionsProvider
     }
 }
 
-class DefaultScreenshotActionsProvider(
+class DefaultScreenshotActionsProvider
+@AssistedInject
+constructor(
     private val context: Context,
-    private val user: UserHandle?,
-    private val callback: ScreenshotActionsProvider.ScreenshotActionsCallback
+    private val viewModel: ScreenshotViewModel,
+    private val uiEventLogger: UiEventLogger,
+    @Assisted val request: ScreenshotData,
+    @Assisted val requestId: String,
+    @Assisted val actionExecutor: ActionExecutor,
 ) : ScreenshotActionsProvider {
+    private var pendingAction: ((ScreenshotSavedResult) -> Unit)? = null
+    private var result: ScreenshotSavedResult? = null
+
     init {
-        callback.setPreviewAction(true) { ActionIntentCreator.createEdit(it, context) }
-        val editAction =
-            ScreenshotActionsProvider.ScreenshotAction(
+        viewModel.setPreviewAction {
+            debugLog(LogConfig.DEBUG_ACTIONS) { "Preview tapped" }
+            uiEventLogger.log(SCREENSHOT_PREVIEW_TAPPED, 0, request.packageNameString)
+            onDeferrableActionTapped { result ->
+                actionExecutor.startSharedTransition(
+                    createEdit(result.uri, context),
+                    result.user,
+                    true
+                )
+            }
+        }
+        viewModel.addAction(
+            ActionButtonAppearance(
                 AppCompatResources.getDrawable(context, R.drawable.ic_screenshot_edit),
                 context.resources.getString(R.string.screenshot_edit_label),
                 context.resources.getString(R.string.screenshot_edit_description),
-                true
-            ) { uri ->
-                ActionIntentCreator.createEdit(uri, context)
+            )
+        ) {
+            debugLog(LogConfig.DEBUG_ACTIONS) { "Edit tapped" }
+            uiEventLogger.log(SCREENSHOT_EDIT_TAPPED, 0, request.packageNameString)
+            onDeferrableActionTapped { result ->
+                actionExecutor.startSharedTransition(
+                    createEdit(result.uri, context),
+                    result.user,
+                    true
+                )
             }
-        val shareAction =
-            ScreenshotActionsProvider.ScreenshotAction(
+        }
+
+        viewModel.addAction(
+            ActionButtonAppearance(
                 AppCompatResources.getDrawable(context, R.drawable.ic_screenshot_share),
                 context.resources.getString(R.string.screenshot_share_label),
                 context.resources.getString(R.string.screenshot_share_description),
-                false
-            ) { uri ->
-                ActionIntentCreator.createShare(uri)
+            )
+        ) {
+            debugLog(LogConfig.DEBUG_ACTIONS) { "Share tapped" }
+            uiEventLogger.log(SCREENSHOT_SHARE_TAPPED, 0, request.packageNameString)
+            onDeferrableActionTapped { result ->
+                actionExecutor.startSharedTransition(
+                    createShareWithSubject(result.uri, result.subject),
+                    result.user,
+                    false
+                )
             }
-        callback.addActions(listOf(editAction, shareAction))
+        }
     }
 
-    class Factory @Inject constructor() : ScreenshotActionsProvider.Factory {
-        override fun create(
-            context: Context,
-            user: UserHandle?,
-            callback: ScreenshotActionsProvider.ScreenshotActionsCallback
-        ): ScreenshotActionsProvider {
-            return DefaultScreenshotActionsProvider(context, user, callback)
+    override fun onScrollChipReady(onClick: Runnable) {
+        viewModel.addAction(
+            ActionButtonAppearance(
+                AppCompatResources.getDrawable(context, R.drawable.ic_screenshot_scroll),
+                context.resources.getString(R.string.screenshot_scroll_label),
+                context.resources.getString(R.string.screenshot_scroll_label),
+            )
+        ) {
+            onClick.run()
         }
     }
+
+    override fun setCompletedScreenshot(result: ScreenshotSavedResult) {
+        if (this.result != null) {
+            Log.e(TAG, "Got a second completed screenshot for existing request!")
+            return
+        }
+        this.result = result
+        pendingAction?.invoke(result)
+    }
+
+    private fun onDeferrableActionTapped(onResult: (ScreenshotSavedResult) -> Unit) {
+        result?.let { onResult.invoke(it) } ?: run { pendingAction = onResult }
+    }
+
+    @AssistedFactory
+    interface Factory : ScreenshotActionsProvider.Factory {
+        override fun create(
+            request: ScreenshotData,
+            requestId: String,
+            actionExecutor: ActionExecutor,
+        ): DefaultScreenshotActionsProvider
+    }
+
+    companion object {
+        private const val TAG = "ScreenshotActionsProvider"
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
index b796a20..0e48bef 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
@@ -29,19 +29,15 @@
 import static com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_DISMISSED_OTHER;
 import static com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_INTERACTION_TIMEOUT;
 
-import static java.util.Objects.requireNonNull;
-
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.annotation.MainThread;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.app.ActivityManager;
 import android.app.ActivityOptions;
 import android.app.ExitTransitionCoordinator;
 import android.app.ICompatCameraControlCallback;
 import android.app.Notification;
-import android.app.assist.AssistContent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -54,7 +50,6 @@
 import android.hardware.display.DisplayManager;
 import android.net.Uri;
 import android.os.Process;
-import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
@@ -62,18 +57,12 @@
 import android.util.Log;
 import android.util.Pair;
 import android.view.Display;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.view.IRemoteAnimationRunner;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationTarget;
 import android.view.ScrollCaptureResponse;
 import android.view.View;
 import android.view.ViewRootImpl;
 import android.view.ViewTreeObserver;
 import android.view.WindowInsets;
 import android.view.WindowManager;
-import android.view.WindowManagerGlobal;
-import android.view.accessibility.AccessibilityManager;
 import android.widget.Toast;
 import android.window.WindowContext;
 
@@ -81,17 +70,14 @@
 import com.android.internal.logging.UiEventLogger;
 import com.android.internal.policy.PhoneWindow;
 import com.android.settingslib.applications.InterestingConfigChanges;
+import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.broadcast.BroadcastSender;
 import com.android.systemui.clipboardoverlay.ClipboardOverlayController;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.flags.FeatureFlags;
-import com.android.systemui.flags.Flags;
 import com.android.systemui.res.R;
 import com.android.systemui.screenshot.TakeScreenshotService.RequestCallback;
-import com.android.systemui.screenshot.scroll.LongScreenshotActivity;
-import com.android.systemui.screenshot.scroll.LongScreenshotData;
-import com.android.systemui.screenshot.scroll.ScrollCaptureClient;
-import com.android.systemui.screenshot.scroll.ScrollCaptureController;
+import com.android.systemui.screenshot.scroll.ScrollCaptureExecutor;
 import com.android.systemui.util.Assert;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -100,13 +86,13 @@
 import dagger.assisted.AssistedFactory;
 import dagger.assisted.AssistedInject;
 
+import kotlin.Unit;
+
 import java.util.List;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ExecutionException;
+import java.util.UUID;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
 import java.util.function.Consumer;
 
 import javax.inject.Provider;
@@ -118,34 +104,6 @@
 public class ScreenshotController {
     private static final String TAG = logTag(ScreenshotController.class);
 
-    private ScrollCaptureResponse mLastScrollCaptureResponse;
-    private ListenableFuture<ScrollCaptureResponse> mLastScrollCaptureRequest;
-
-    /**
-     * This is effectively a no-op, but we need something non-null to pass in, in order to
-     * successfully override the pending activity entrance animation.
-     */
-    static final IRemoteAnimationRunner.Stub SCREENSHOT_REMOTE_RUNNER =
-            new IRemoteAnimationRunner.Stub() {
-                @Override
-                public void onAnimationStart(
-                        @WindowManager.TransitionOldType int transit,
-                        RemoteAnimationTarget[] apps,
-                        RemoteAnimationTarget[] wallpapers,
-                        RemoteAnimationTarget[] nonApps,
-                        final IRemoteAnimationFinishedCallback finishedCallback) {
-                    try {
-                        finishedCallback.onAnimationFinished();
-                    } catch (RemoteException e) {
-                        Log.e(TAG, "Error finishing screenshot remote animation", e);
-                    }
-                }
-
-                @Override
-                public void onAnimationCancelled() {
-                }
-            };
-
     /**
      * POD used in the AsyncTask which saves an image in the background.
      */
@@ -171,6 +129,7 @@
         public Notification.Action quickShareAction;
         public UserHandle owner;
         public String subject;  // Title for sharing
+        public Long imageTime; // Time at which screenshot was saved
 
         /**
          * Used to reset the return data on error
@@ -180,6 +139,7 @@
             smartActions = null;
             quickShareAction = null;
             subject = null;
+            imageTime = null;
         }
     }
 
@@ -216,19 +176,13 @@
 
     // These strings are used for communicating the action invoked to
     // ScreenshotNotificationSmartActionsProvider.
-    static final String EXTRA_ACTION_TYPE = "android:screenshot_action_type";
-    static final String EXTRA_ID = "android:screenshot_id";
-    static final String ACTION_TYPE_DELETE = "Delete";
-    static final String ACTION_TYPE_SHARE = "Share";
-    static final String ACTION_TYPE_EDIT = "Edit";
-    static final String EXTRA_SMART_ACTIONS_ENABLED = "android:smart_actions_enabled";
-    static final String EXTRA_OVERRIDE_TRANSITION = "android:screenshot_override_transition";
-    static final String EXTRA_ACTION_INTENT = "android:screenshot_action_intent";
-    static final String EXTRA_ACTION_INTENT_FILLIN = "android:screenshot_action_intent_fillin";
+    public static final String EXTRA_ACTION_TYPE = "android:screenshot_action_type";
+    public static final String EXTRA_ID = "android:screenshot_id";
+    public static final String EXTRA_SMART_ACTIONS_ENABLED = "android:smart_actions_enabled";
+    public static final String EXTRA_ACTION_INTENT = "android:screenshot_action_intent";
+    public static final String EXTRA_ACTION_INTENT_FILLIN =
+            "android:screenshot_action_intent_fillin";
 
-    static final String SCREENSHOT_URI_ID = "android:screenshot_uri_id";
-    static final String EXTRA_CANCEL_NOTIFICATION = "android:screenshot_cancel_notification";
-    static final String EXTRA_DISALLOW_ENTER_PIP = "android:screenshot_disallow_enter_pip";
 
     // From WizardManagerHelper.java
     private static final String SETTINGS_SECURE_USER_SETUP_COMPLETE = "user_setup_complete";
@@ -247,23 +201,21 @@
     private final Executor mMainExecutor;
     private final ExecutorService mBgExecutor;
     private final BroadcastSender mBroadcastSender;
+    private final BroadcastDispatcher mBroadcastDispatcher;
+    private final ActionExecutor mActionExecutor;
 
     private final WindowManager mWindowManager;
     private final WindowManager.LayoutParams mWindowLayoutParams;
-    private final AccessibilityManager mAccessibilityManager;
     @Nullable
     private final ScreenshotSoundController mScreenshotSoundController;
-    private final ScrollCaptureClient mScrollCaptureClient;
     private final PhoneWindow mWindow;
     private final DisplayManager mDisplayManager;
     private final int mDisplayId;
-    private final ScrollCaptureController mScrollCaptureController;
-    private final LongScreenshotData mLongScreenshotHolder;
-    private final boolean mIsLowRamDevice;
+    private final ScrollCaptureExecutor mScrollCaptureExecutor;
     private final ScreenshotNotificationSmartActionsProvider
             mScreenshotNotificationSmartActionsProvider;
     private final TimeoutHandler mScreenshotHandler;
-    private final ActionIntentExecutor mActionExecutor;
+    private final ActionIntentExecutor mActionIntentExecutor;
     private final UserManager mUserManager;
     private final AssistContentRequester mAssistContentRequester;
 
@@ -272,13 +224,11 @@
     private SaveImageInBackgroundTask mSaveInBgTask;
     private boolean mScreenshotTakenInPortrait;
     private boolean mBlockAttach;
-
-    private ScreenshotActionsProvider mActionsProvider;
-
     private Animator mScreenshotAnimation;
     private RequestCallback mCurrentRequestCallback;
+    private ScreenshotActionsProvider mActionsProvider;
     private String mPackageName = "";
-    private BroadcastReceiver mCopyBroadcastReceiver;
+    private final BroadcastReceiver mCopyBroadcastReceiver;
 
     // When false, the screenshot is taken without showing the ui. Note that this only applies to
     // external displays, as on the default one the UI should **always** be shown.
@@ -300,23 +250,24 @@
     @AssistedInject
     ScreenshotController(
             Context context,
+            DisplayManager displayManager,
+            WindowManager windowManager,
             FeatureFlags flags,
             ScreenshotViewProxy.Factory viewProxyFactory,
             ScreenshotActionsProvider.Factory actionsProviderFactory,
             ScreenshotSmartActions screenshotSmartActions,
             ScreenshotNotificationsController.Factory screenshotNotificationsControllerFactory,
-            ScrollCaptureClient scrollCaptureClient,
             UiEventLogger uiEventLogger,
             ImageExporter imageExporter,
             ImageCapture imageCapture,
             @Main Executor mainExecutor,
-            ScrollCaptureController scrollCaptureController,
-            LongScreenshotData longScreenshotHolder,
-            ActivityManager activityManager,
+            ScrollCaptureExecutor scrollCaptureExecutor,
             TimeoutHandler timeoutHandler,
             BroadcastSender broadcastSender,
+            BroadcastDispatcher broadcastDispatcher,
             ScreenshotNotificationSmartActionsProvider screenshotNotificationSmartActionsProvider,
-            ActionIntentExecutor actionExecutor,
+            ActionIntentExecutor actionIntentExecutor,
+            ActionExecutor.Factory actionExecutorFactory,
             UserManager userManager,
             AssistContentRequester assistContentRequester,
             MessageContainerController messageContainerController,
@@ -325,36 +276,34 @@
             @Assisted boolean showUIOnExternalDisplay
     ) {
         mScreenshotSmartActions = screenshotSmartActions;
+        mActionsProviderFactory = actionsProviderFactory;
         mNotificationsController = screenshotNotificationsControllerFactory.create(displayId);
-        mScrollCaptureClient = scrollCaptureClient;
         mUiEventLogger = uiEventLogger;
         mImageExporter = imageExporter;
         mImageCapture = imageCapture;
         mMainExecutor = mainExecutor;
-        mScrollCaptureController = scrollCaptureController;
-        mLongScreenshotHolder = longScreenshotHolder;
-        mIsLowRamDevice = activityManager.isLowRamDevice();
+        mScrollCaptureExecutor = scrollCaptureExecutor;
         mScreenshotNotificationSmartActionsProvider = screenshotNotificationSmartActionsProvider;
         mBgExecutor = Executors.newSingleThreadExecutor();
         mBroadcastSender = broadcastSender;
+        mBroadcastDispatcher = broadcastDispatcher;
 
         mScreenshotHandler = timeoutHandler;
         mScreenshotHandler.setDefaultTimeoutMillis(SCREENSHOT_CORNER_DEFAULT_TIMEOUT_MILLIS);
 
 
         mDisplayId = displayId;
-        mDisplayManager = requireNonNull(context.getSystemService(DisplayManager.class));
+        mDisplayManager = displayManager;
+        mWindowManager = windowManager;
         final Context displayContext = context.createDisplayContext(getDisplay());
         mContext = (WindowContext) displayContext.createWindowContext(TYPE_SCREENSHOT, null);
-        mWindowManager = mContext.getSystemService(WindowManager.class);
         mFlags = flags;
-        mActionExecutor = actionExecutor;
+        mActionIntentExecutor = actionIntentExecutor;
         mUserManager = userManager;
         mMessageContainerController = messageContainerController;
         mAssistContentRequester = assistContentRequester;
 
         mViewProxy = viewProxyFactory.getProxy(mContext, mDisplayId);
-        mActionsProviderFactory = actionsProviderFactory;
 
         mScreenshotHandler.setOnTimeoutRunnable(() -> {
             if (DEBUG_UI) {
@@ -363,8 +312,6 @@
             mViewProxy.requestDismissal(SCREENSHOT_INTERACTION_TIMEOUT);
         });
 
-        mAccessibilityManager = AccessibilityManager.getInstance(mContext);
-
         // Setup the window that we are going to use
         mWindowLayoutParams = FloatingWindowUtil.getFloatingWindowParams();
         mWindowLayoutParams.setTitle("ScreenshotAnimation");
@@ -375,6 +322,12 @@
         mConfigChanges.applyNewConfig(context.getResources());
         reloadAssets();
 
+        mActionExecutor = actionExecutorFactory.create(mWindow, mViewProxy.getScreenshotPreview(),
+                () -> {
+                    requestDismissal(null);
+                    return Unit.INSTANCE;
+                });
+
         // Sound is only reproduced from the controller of the default display.
         if (displayId == Display.DEFAULT_DISPLAY) {
             mScreenshotSoundController = screenshotSoundController.get();
@@ -390,9 +343,9 @@
                 }
             }
         };
-        mContext.registerReceiver(mCopyBroadcastReceiver, new IntentFilter(
-                        ClipboardOverlayController.COPY_OVERLAY_ACTION),
-                ClipboardOverlayController.SELF_PERMISSION, null, Context.RECEIVER_NOT_EXPORTED);
+        mBroadcastDispatcher.registerReceiver(mCopyBroadcastReceiver, new IntentFilter(
+                        ClipboardOverlayController.COPY_OVERLAY_ACTION), null, null,
+                Context.RECEIVER_NOT_EXPORTED, ClipboardOverlayController.SELF_PERMISSION);
         mShowUIOnExternalDisplay = showUIOnExternalDisplay;
     }
 
@@ -401,10 +354,10 @@
         Assert.isMainThread();
 
         mCurrentRequestCallback = requestCallback;
-        if (screenshot.getType() == WindowManager.TAKE_SCREENSHOT_FULLSCREEN) {
+        if (screenshot.getType() == WindowManager.TAKE_SCREENSHOT_FULLSCREEN
+                && screenshot.getBitmap() == null) {
             Rect bounds = getFullScreenRect();
-            screenshot.setBitmap(
-                    mImageCapture.captureDisplay(mDisplayId, bounds));
+            screenshot.setBitmap(mImageCapture.captureDisplay(mDisplayId, bounds));
             screenshot.setScreenBounds(bounds);
         }
 
@@ -442,16 +395,6 @@
 
         prepareViewForNewScreenshot(screenshot, oldPackageName);
 
-        if (mFlags.isEnabled(Flags.SCREENSHOT_METADATA) && screenshot.getTaskId() >= 0) {
-            mAssistContentRequester.requestAssistContent(screenshot.getTaskId(),
-                    new AssistContentRequester.Callback() {
-                        @Override
-                        public void onAssistContentAvailable(AssistContent assistContent) {
-                            screenshot.setContextUrl(assistContent.getWebUri());
-                        }
-                    });
-        }
-
         if (!shouldShowUi()) {
             saveScreenshotInWorkerThread(
                     screenshot.getUserHandle(), finisher, this::logSuccessOnActionsReady,
@@ -460,8 +403,23 @@
             return;
         }
 
-        saveScreenshotInWorkerThread(screenshot.getUserHandle(), finisher,
-                this::showUiOnActionsReady, this::showUiOnQuickShareActionReady);
+        if (screenshotShelfUi()) {
+            final UUID requestId = UUID.randomUUID();
+            final String screenshotId = String.format("Screenshot_%s", requestId);
+            mActionsProvider = mActionsProviderFactory.create(
+                    screenshot, screenshotId, mActionExecutor);
+            saveScreenshotInBackground(screenshot, requestId, finisher);
+
+            if (screenshot.getTaskId() >= 0) {
+                mAssistContentRequester.requestAssistContent(screenshot.getTaskId(),
+                        assistContent -> {
+                            mActionsProvider.onAssistContentAvailable(assistContent);
+                        });
+            }
+        } else {
+            saveScreenshotInWorkerThread(screenshot.getUserHandle(), finisher,
+                    this::showUiOnActionsReady, this::showUiOnQuickShareActionReady);
+        }
 
         // The window is focusable by default
         setWindowFocusable(true);
@@ -496,7 +454,9 @@
         // ignore system bar insets for the purpose of window layout
         mWindow.getDecorView().setOnApplyWindowInsetsListener(
                 (v, insets) -> WindowInsets.CONSUMED);
-        mScreenshotHandler.cancelTimeout(); // restarted after animation
+        if (!screenshotShelfUi()) {
+            mScreenshotHandler.cancelTimeout(); // restarted after animation
+        }
     }
 
     private boolean shouldShowUi() {
@@ -516,11 +476,6 @@
 
         mViewProxy.reset();
 
-        if (screenshotShelfUi()) {
-            mActionsProvider = mActionsProviderFactory.create(mContext, screenshot.getUserHandle(),
-                    ((ScreenshotActionsProvider.ScreenshotActionsCallback) mViewProxy));
-        }
-
         if (mViewProxy.isAttachedToWindow()) {
             // if we didn't already dismiss for another reason
             if (!mViewProxy.isDismissing()) {
@@ -548,7 +503,11 @@
     }
 
     boolean isPendingSharedTransition() {
-        return mViewProxy.isPendingSharedTransition();
+        if (screenshotShelfUi()) {
+            return mActionExecutor.isPendingSharedTransition();
+        } else {
+            return mViewProxy.isPendingSharedTransition();
+        }
     }
 
     // Any cleanup needed when the service is being destroyed.
@@ -567,7 +526,7 @@
      * Release the constructed window context.
      */
     private void releaseContext() {
-        mContext.unregisterReceiver(mCopyBroadcastReceiver);
+        mBroadcastDispatcher.unregisterReceiver(mCopyBroadcastReceiver);
         mContext.release();
     }
 
@@ -596,8 +555,9 @@
 
             @Override
             public void onAction(Intent intent, UserHandle owner, boolean overrideTransition) {
-                mActionExecutor.launchIntentAsync(
-                        intent, createWindowTransition(), owner, overrideTransition);
+                Pair<ActivityOptions, ExitTransitionCoordinator> exit = createWindowTransition();
+                mActionIntentExecutor.launchIntentAsync(
+                        intent, owner, overrideTransition, exit.first, exit.second);
             }
 
             @Override
@@ -615,7 +575,7 @@
         if (DEBUG_WINDOW) {
             Log.d(TAG, "setContentView: " + mViewProxy.getView());
         }
-        setContentView(mViewProxy.getView());
+        mWindow.setContentView(mViewProxy.getView());
     }
 
     private void enqueueScrollCaptureRequest(UserHandle owner) {
@@ -634,9 +594,8 @@
                                 mViewProxy.hideScrollChip();
                                 // Delay scroll capture eval a bit to allow the underlying activity
                                 // to set up in the new orientation.
-                                mScreenshotHandler.postDelayed(() -> {
-                                    requestScrollCapture(owner);
-                                }, 150);
+                                mScreenshotHandler.postDelayed(
+                                        () -> requestScrollCapture(owner), 150);
                                 mViewProxy.updateInsets(
                                         mWindowManager.getCurrentWindowMetrics().getWindowInsets());
                                 // Screenshot animation calculations won't be valid anymore,
@@ -659,120 +618,51 @@
     }
 
     private void requestScrollCapture(UserHandle owner) {
-        if (!allowLongScreenshots()) {
-            Log.d(TAG, "Long screenshots not supported on this device");
+        mScrollCaptureExecutor.requestScrollCapture(
+                mDisplayId,
+                mWindow.getDecorView().getWindowToken(),
+                (response) -> {
+                    mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_LONG_SCREENSHOT_IMPRESSION,
+                            0, response.getPackageName());
+                    if (screenshotShelfUi() && mActionsProvider != null) {
+                        mActionsProvider.onScrollChipReady(
+                                () -> onScrollButtonClicked(owner, response));
+                    } else {
+                        mViewProxy.showScrollChip(response.getPackageName(),
+                                () -> onScrollButtonClicked(owner, response));
+                    }
+                    return Unit.INSTANCE;
+                }
+        );
+    }
+
+    private void onScrollButtonClicked(UserHandle owner, ScrollCaptureResponse response) {
+        if (DEBUG_INPUT) {
+            Log.d(TAG, "scroll chip tapped");
+        }
+        mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_LONG_SCREENSHOT_REQUESTED, 0,
+                response.getPackageName());
+        Bitmap newScreenshot = mImageCapture.captureDisplay(mDisplayId, getFullScreenRect());
+        if (newScreenshot == null) {
+            Log.e(TAG, "Failed to capture current screenshot for scroll transition!");
             return;
         }
-        mScrollCaptureClient.setHostWindowToken(mWindow.getDecorView().getWindowToken());
-        if (mLastScrollCaptureRequest != null) {
-            mLastScrollCaptureRequest.cancel(true);
-        }
-        final ListenableFuture<ScrollCaptureResponse> future = mScrollCaptureClient.request(
-                mDisplayId);
-        mLastScrollCaptureRequest = future;
-        mLastScrollCaptureRequest.addListener(() ->
-                onScrollCaptureResponseReady(future, owner), mMainExecutor);
+        // delay starting scroll capture to make sure scrim is up before the app moves
+        mViewProxy.prepareScrollingTransition(response, mScreenBitmap, newScreenshot,
+                mScreenshotTakenInPortrait, () -> executeBatchScrollCapture(response, owner));
     }
 
-    private void onScrollCaptureResponseReady(Future<ScrollCaptureResponse> responseFuture,
-            UserHandle owner) {
-        try {
-            if (mLastScrollCaptureResponse != null) {
-                mLastScrollCaptureResponse.close();
-                mLastScrollCaptureResponse = null;
-            }
-            if (responseFuture.isCancelled()) {
-                return;
-            }
-            mLastScrollCaptureResponse = responseFuture.get();
-            if (!mLastScrollCaptureResponse.isConnected()) {
-                // No connection means that the target window wasn't found
-                // or that it cannot support scroll capture.
-                Log.d(TAG, "ScrollCapture: " + mLastScrollCaptureResponse.getDescription() + " ["
-                        + mLastScrollCaptureResponse.getWindowTitle() + "]");
-                return;
-            }
-            Log.d(TAG, "ScrollCapture: connected to window ["
-                    + mLastScrollCaptureResponse.getWindowTitle() + "]");
+    private void executeBatchScrollCapture(ScrollCaptureResponse response, UserHandle owner) {
+        mScrollCaptureExecutor.executeBatchScrollCapture(response,
+                () -> {
+                    final Intent intent = ActionIntentCreator.INSTANCE.createLongScreenshotIntent(
+                            owner, mContext);
+                    mActionIntentExecutor.launchIntentAsync(intent, owner, true,
+                            ActivityOptions.makeCustomAnimation(mContext, 0, 0), null);
 
-            final ScrollCaptureResponse response = mLastScrollCaptureResponse;
-            mViewProxy.showScrollChip(response.getPackageName(), /* onClick */ () -> {
-                DisplayMetrics displayMetrics = new DisplayMetrics();
-                getDisplay().getRealMetrics(displayMetrics);
-                Bitmap newScreenshot = mImageCapture.captureDisplay(mDisplayId,
-                        new Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels));
-
-                if (newScreenshot != null) {
-                    // delay starting scroll capture to make sure scrim is up before the app moves
-                    mViewProxy.prepareScrollingTransition(
-                            response, mScreenBitmap, newScreenshot, mScreenshotTakenInPortrait,
-                            () -> runBatchScrollCapture(response, owner));
-                } else {
-                    Log.wtf(TAG, "failed to capture current screenshot for scroll transition");
-                }
-            });
-        } catch (InterruptedException | ExecutionException e) {
-            Log.e(TAG, "requestScrollCapture failed", e);
-        }
-    }
-
-    ListenableFuture<ScrollCaptureController.LongScreenshot> mLongScreenshotFuture;
-
-    private void runBatchScrollCapture(ScrollCaptureResponse response, UserHandle owner) {
-        // Clear the reference to prevent close() in dismissScreenshot
-        mLastScrollCaptureResponse = null;
-
-        if (mLongScreenshotFuture != null) {
-            mLongScreenshotFuture.cancel(true);
-        }
-        mLongScreenshotFuture = mScrollCaptureController.run(response);
-        mLongScreenshotFuture.addListener(() -> {
-            ScrollCaptureController.LongScreenshot longScreenshot;
-            try {
-                longScreenshot = mLongScreenshotFuture.get();
-            } catch (CancellationException e) {
-                Log.e(TAG, "Long screenshot cancelled");
-                return;
-            } catch (InterruptedException | ExecutionException e) {
-                Log.e(TAG, "Exception", e);
-                mViewProxy.restoreNonScrollingUi();
-                return;
-            }
-
-            if (longScreenshot.getHeight() == 0) {
-                mViewProxy.restoreNonScrollingUi();
-                return;
-            }
-
-            mLongScreenshotHolder.setLongScreenshot(longScreenshot);
-            mLongScreenshotHolder.setTransitionDestinationCallback(
-                    (transitionDestination, onTransitionEnd) -> {
-                        mViewProxy.startLongScreenshotTransition(
-                                transitionDestination, onTransitionEnd,
-                                longScreenshot);
-                        // TODO: Do this via ActionIntentExecutor instead.
-                        mContext.closeSystemDialogs();
-                    }
-            );
-
-            final Intent intent = new Intent(mContext, LongScreenshotActivity.class);
-            intent.putExtra(LongScreenshotActivity.EXTRA_SCREENSHOT_USER_HANDLE,
-                    owner);
-            intent.setFlags(
-                    Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
-
-            mContext.startActivity(intent,
-                    ActivityOptions.makeCustomAnimation(mContext, 0, 0).toBundle());
-            RemoteAnimationAdapter runner = new RemoteAnimationAdapter(
-                    SCREENSHOT_REMOTE_RUNNER, 0, 0);
-            try {
-                WindowManagerGlobal.getWindowManagerService()
-                        .overridePendingAppTransitionRemote(runner,
-                                mDisplayId);
-            } catch (Exception e) {
-                Log.e(TAG, "Error overriding screenshot app transition", e);
-            }
-        }, mMainExecutor);
+                },
+                mViewProxy::restoreNonScrollingUi,
+                mViewProxy::startLongScreenshotTransition);
     }
 
     private void withWindowAttached(Runnable action) {
@@ -797,10 +687,6 @@
         }
     }
 
-    private void setContentView(View contentView) {
-        mWindow.setContentView(contentView);
-    }
-
     @MainThread
     private void attachWindow() {
         View decorView = mWindow.getDecorView();
@@ -912,28 +798,16 @@
                     public void onFinish() {
                     }
                 };
-        Pair<ActivityOptions, ExitTransitionCoordinator> transition =
-                ActivityOptions.startSharedElementAnimation(mWindow, callbacks, null,
-                        Pair.create(mViewProxy.getScreenshotPreview(),
-                                ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME));
 
-        return transition;
+        return ActivityOptions.startSharedElementAnimation(mWindow, callbacks, null,
+                Pair.create(mViewProxy.getScreenshotPreview(),
+                        ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME));
     }
 
     /** Reset screenshot view and then call onCompleteRunnable */
     private void finishDismiss() {
         Log.d(TAG, "finishDismiss");
-        if (mLastScrollCaptureRequest != null) {
-            mLastScrollCaptureRequest.cancel(true);
-            mLastScrollCaptureRequest = null;
-        }
-        if (mLastScrollCaptureResponse != null) {
-            mLastScrollCaptureResponse.close();
-            mLastScrollCaptureResponse = null;
-        }
-        if (mLongScreenshotFuture != null) {
-            mLongScreenshotFuture.cancel(true);
-        }
+        mScrollCaptureExecutor.close();
         if (mCurrentRequestCallback != null) {
             mCurrentRequestCallback.onFinish();
             mCurrentRequestCallback = null;
@@ -943,6 +817,35 @@
         mScreenshotHandler.cancelTimeout();
     }
 
+    private void saveScreenshotInBackground(
+            ScreenshotData screenshot, UUID requestId, Consumer<Uri> finisher) {
+        ListenableFuture<ImageExporter.Result> future = mImageExporter.export(mBgExecutor,
+                requestId, screenshot.getBitmap(), screenshot.getUserOrDefault(), mDisplayId);
+        future.addListener(() -> {
+            try {
+                ImageExporter.Result result = future.get();
+                Log.d(TAG, "Saved screenshot: " + result);
+                logScreenshotResultStatus(result.uri, screenshot.getUserHandle());
+                mScreenshotHandler.resetTimeout();
+                if (result.uri != null) {
+                    mActionsProvider.setCompletedScreenshot(new ScreenshotSavedResult(
+                            result.uri, screenshot.getUserOrDefault(), result.timestamp));
+                }
+                if (DEBUG_CALLBACK) {
+                    Log.d(TAG, "finished background processing, Calling (Consumer<Uri>) "
+                            + "finisher.accept(\"" + result.uri + "\"");
+                }
+                finisher.accept(result.uri);
+            } catch (Exception e) {
+                Log.d(TAG, "Failed to store screenshot", e);
+                if (DEBUG_CALLBACK) {
+                    Log.d(TAG, "Calling (Consumer<Uri>) finisher.accept(null)");
+                }
+                finisher.accept(null);
+            }
+        }, mMainExecutor);
+    }
+
     /**
      * Creates a new worker thread and saves the screenshot to the media store.
      */
@@ -978,13 +881,12 @@
      */
     private void showUiOnActionsReady(ScreenshotController.SavedImageData imageData) {
         logSuccessOnActionsReady(imageData);
-        if (DEBUG_UI) {
-            Log.d(TAG, "Showing UI actions");
-        }
-
         mScreenshotHandler.resetTimeout();
 
         if (imageData.uri != null) {
+            if (DEBUG_UI) {
+                Log.d(TAG, "Showing UI actions");
+            }
             if (!imageData.owner.equals(Process.myUserHandle())) {
                 Log.d(TAG, "Screenshot saved to user " + imageData.owner + " as "
                         + imageData.uri);
@@ -1032,20 +934,27 @@
     /**
      * Logs success/failure of the screenshot saving task, and shows an error if it failed.
      */
-    private void logSuccessOnActionsReady(ScreenshotController.SavedImageData imageData) {
-        if (imageData.uri == null) {
+    private void logScreenshotResultStatus(Uri uri, UserHandle owner) {
+        if (uri == null) {
             mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_NOT_SAVED, 0, mPackageName);
             mNotificationsController.notifyScreenshotError(
                     R.string.screenshot_failed_to_save_text);
         } else {
             mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SAVED, 0, mPackageName);
-            if (mUserManager.isManagedProfile(imageData.owner.getIdentifier())) {
+            if (mUserManager.isManagedProfile(owner.getIdentifier())) {
                 mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SAVED_TO_WORK_PROFILE, 0,
                         mPackageName);
             }
         }
     }
 
+    /**
+     * Logs success/failure of the screenshot saving task, and shows an error if it failed.
+     */
+    private void logSuccessOnActionsReady(ScreenshotController.SavedImageData imageData) {
+        logScreenshotResultStatus(imageData.uri, imageData.owner);
+    }
+
     private boolean isUserSetupComplete(UserHandle owner) {
         return Settings.Secure.getInt(mContext.createContextAsUser(owner, 0)
                 .getContentResolver(), SETTINGS_SECURE_USER_SETUP_COMPLETE, 0) == 1;
@@ -1082,10 +991,6 @@
         return mDisplayManager.getDisplay(mDisplayId);
     }
 
-    private boolean allowLongScreenshots() {
-        return !mIsLowRamDevice;
-    }
-
     private Rect getFullScreenRect() {
         DisplayMetrics displayMetrics = new DisplayMetrics();
         getDisplay().getRealMetrics(displayMetrics);
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotData.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotData.kt
index 92e933a..4fdd90b 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotData.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotData.kt
@@ -5,6 +5,7 @@
 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.ScreenshotSource
@@ -31,6 +32,10 @@
     val packageNameString: String
         get() = if (topComponent == null) "" else topComponent!!.packageName
 
+    fun getUserOrDefault(): UserHandle {
+        return userHandle ?: Process.myUserHandle()
+    }
+
     companion object {
         @JvmStatic
         fun fromRequest(request: ScreenshotRequest, displayId: Int = Display.DEFAULT_DISPLAY) =
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsProvider.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsProvider.java
index 3eafbfb..23f05e0 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsProvider.java
@@ -44,7 +44,7 @@
     public static final String DEFAULT_ACTION_TYPE = "Smart Action";
 
     /* Define phases of screenshot execution. */
-    protected enum ScreenshotOp {
+    public enum ScreenshotOp {
         OP_UNKNOWN,
         RETRIEVE_SMART_ACTIONS,
         REQUEST_SMART_ACTIONS,
@@ -52,7 +52,7 @@
     }
 
     /* Enum to report success or failure for screenshot execution phases. */
-    protected enum ScreenshotOpStatus {
+    public enum ScreenshotOpStatus {
         OP_STATUS_UNKNOWN,
         SUCCESS,
         ERROR,
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.kt
index d874eb6..4079abe 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.kt
@@ -105,7 +105,7 @@
 
     /** Factory for [ScreenshotNotificationsController]. */
     @AssistedFactory
-    interface Factory {
-        fun create(displayId: Int = Display.DEFAULT_DISPLAY): ScreenshotNotificationsController
+    fun interface Factory {
+        fun create(displayId: Int): ScreenshotNotificationsController
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt
index d5ab306..c8067df 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt
@@ -30,7 +30,7 @@
 import kotlinx.coroutines.withContext
 
 /** Provides state from the main SystemUI process on behalf of the Screenshot process. */
-internal class ScreenshotProxyService
+class ScreenshotProxyService
 @Inject
 constructor(
     private val mExpansionMgr: ShadeExpansionStateManager,
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotRequestProcessor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotRequestProcessor.kt
new file mode 100644
index 0000000..3ad4075a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotRequestProcessor.kt
@@ -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.systemui.screenshot
+
+/** Processes a screenshot request sent from [ScreenshotHelper]. */
+fun interface ScreenshotRequestProcessor {
+    /**
+     * Inspects the incoming ScreenshotData, potentially modifying it based upon policy.
+     *
+     * @param original the screenshot to process
+     * @return a potentially modified screenshot data
+     */
+    suspend fun process(original: ScreenshotData): ScreenshotData
+}
+
+/** Exception thrown by [RequestProcessor] if something goes wrong. */
+class RequestProcessorException(message: String) : IllegalStateException(message)
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSavedResult.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSavedResult.kt
new file mode 100644
index 0000000..5b6e7ac
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSavedResult.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.screenshot
+
+import android.net.Uri
+import android.os.UserHandle
+import java.text.DateFormat
+import java.util.Date
+
+/**
+ * Represents a saved screenshot, with the uri and user it was saved to as well as the time it was
+ * saved.
+ */
+data class ScreenshotSavedResult(val uri: Uri, val user: UserHandle, val imageTime: Long) {
+    val subject: String
+
+    init {
+        val subjectDate = DateFormat.getDateTimeInstance().format(Date(imageTime))
+        subject = String.format(SCREENSHOT_SHARE_SUBJECT_TEMPLATE, subjectDate)
+    }
+
+    companion object {
+        private const val SCREENSHOT_SHARE_SUBJECT_TEMPLATE = "Screenshot (%s)"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt
index 88bca95..6b9332b 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt
@@ -20,10 +20,8 @@
 import android.animation.AnimatorListenerAdapter
 import android.app.Notification
 import android.content.Context
-import android.content.Intent
 import android.graphics.Bitmap
 import android.graphics.Rect
-import android.net.Uri
 import android.view.KeyEvent
 import android.view.LayoutInflater
 import android.view.ScrollCaptureResponse
@@ -35,7 +33,6 @@
 import com.android.internal.logging.UiEventLogger
 import com.android.systemui.log.DebugLogger.debugLog
 import com.android.systemui.res.R
-import com.android.systemui.screenshot.LogConfig.DEBUG_ACTIONS
 import com.android.systemui.screenshot.LogConfig.DEBUG_DISMISS
 import com.android.systemui.screenshot.LogConfig.DEBUG_INPUT
 import com.android.systemui.screenshot.LogConfig.DEBUG_WINDOW
@@ -45,7 +42,6 @@
 import com.android.systemui.screenshot.ui.ScreenshotAnimationController
 import com.android.systemui.screenshot.ui.ScreenshotShelfView
 import com.android.systemui.screenshot.ui.binder.ScreenshotShelfViewBinder
-import com.android.systemui.screenshot.ui.viewmodel.ActionButtonViewModel
 import com.android.systemui.screenshot.ui.viewmodel.ScreenshotViewModel
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
@@ -59,7 +55,7 @@
     private val viewModel: ScreenshotViewModel,
     @Assisted private val context: Context,
     @Assisted private val displayId: Int
-) : ScreenshotViewProxy, ScreenshotActionsProvider.ScreenshotActionsCallback {
+) : ScreenshotViewProxy {
     override val view: ScreenshotShelfView =
         LayoutInflater.from(context).inflate(R.layout.screenshot_shelf, null) as ScreenshotShelfView
     override val screenshotPreview: View
@@ -77,8 +73,6 @@
     override var isPendingSharedTransition = false
 
     private val animationController = ScreenshotAnimationController(view)
-    private var imageData: SavedImageData? = null
-    private var runOnImageDataAcquired: ((SavedImageData) -> Unit)? = null
 
     init {
         ScreenshotShelfViewBinder.bind(view, viewModel, LayoutInflater.from(context))
@@ -91,9 +85,7 @@
     override fun reset() {
         animationController.cancel()
         isPendingSharedTransition = false
-        imageData = null
         viewModel.reset()
-        runOnImageDataAcquired = null
     }
     override fun updateInsets(insets: WindowInsets) {}
     override fun updateOrientation(insets: WindowInsets) {}
@@ -104,12 +96,9 @@
 
     override fun addQuickShareChip(quickShareAction: Notification.Action) {}
 
-    override fun setChipIntents(data: SavedImageData) {
-        imageData = data
-        runOnImageDataAcquired?.invoke(data)
-    }
+    override fun setChipIntents(imageData: SavedImageData) {}
 
-    override fun requestDismissal(event: ScreenshotEvent) {
+    override fun requestDismissal(event: ScreenshotEvent?) {
         debugLog(DEBUG_DISMISS) { "screenshot dismissal requested: $event" }
 
         // If we're already animating out, don't restart the animation
@@ -117,7 +106,7 @@
             debugLog(DEBUG_DISMISS) { "Already dismissing, ignoring duplicate command $event" }
             return
         }
-        logger.log(event, 0, packageName)
+        event?.let { logger.log(it, 0, packageName) }
         val animator = animationController.getExitAnimation()
         animator.addListener(
             object : AnimatorListenerAdapter() {
@@ -143,13 +132,18 @@
         newScreenshot: Bitmap,
         screenshotTakenInPortrait: Boolean,
         onTransitionPrepared: Runnable,
-    ) {}
+    ) {
+        onTransitionPrepared.run()
+    }
 
     override fun startLongScreenshotTransition(
         transitionDestination: Rect,
         onTransitionEnd: Runnable,
         longScreenshot: ScrollCaptureController.LongScreenshot
-    ) {}
+    ) {
+        onTransitionEnd.run()
+        callbacks?.onDismiss()
+    }
 
     override fun restoreNonScrollingUi() {}
 
@@ -219,41 +213,4 @@
     interface Factory : ScreenshotViewProxy.Factory {
         override fun getProxy(context: Context, displayId: Int): ScreenshotShelfViewProxy
     }
-
-    override fun setPreviewAction(overrideTransition: Boolean, retrieveIntent: (Uri) -> Intent) {
-        viewModel.setPreviewAction {
-            imageData?.let {
-                val intent = retrieveIntent(it.uri)
-                debugLog(DEBUG_ACTIONS) { "Preview tapped: $intent" }
-                isPendingSharedTransition = true
-                callbacks?.onAction(intent, it.owner, overrideTransition)
-            }
-        }
-    }
-
-    override fun addActions(actions: List<ScreenshotActionsProvider.ScreenshotAction>) {
-        viewModel.addActions(
-            actions.map { action ->
-                ActionButtonViewModel(action.icon, action.text, action.description) {
-                    val actionRunnable =
-                        getActionRunnable(action.retrieveIntent, action.overrideTransition)
-                    imageData?.let { actionRunnable(it) }
-                        ?: run { runOnImageDataAcquired = actionRunnable }
-                }
-            }
-        )
-    }
-
-    private fun getActionRunnable(
-        retrieveIntent: (Uri) -> Intent,
-        overrideTransition: Boolean
-    ): (SavedImageData) -> Unit {
-        val onClick: (SavedImageData) -> Unit = {
-            val intent = retrieveIntent(it.uri)
-            debugLog(DEBUG_ACTIONS) { "Action tapped: $intent" }
-            isPendingSharedTransition = true
-            callbacks!!.onAction(intent, it.owner, overrideTransition)
-        }
-        return onClick
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
index cb2dba0..59e38a8 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
@@ -90,7 +90,6 @@
 import com.android.internal.jank.InteractionJankMonitor;
 import com.android.internal.logging.UiEventLogger;
 import com.android.systemui.flags.FeatureFlags;
-import com.android.systemui.flags.Flags;
 import com.android.systemui.res.R;
 import com.android.systemui.screenshot.scroll.ScrollCaptureController;
 import com.android.systemui.shared.system.InputChannelCompat;
@@ -260,16 +259,8 @@
         if (DEBUG_SCROLL) {
             Log.d(TAG, "Showing Scroll option");
         }
-        mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_LONG_SCREENSHOT_IMPRESSION, 0, packageName);
         mScrollChip.setVisibility(VISIBLE);
-        mScrollChip.setOnClickListener((v) -> {
-            if (DEBUG_INPUT) {
-                Log.d(TAG, "scroll chip tapped");
-            }
-            mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_LONG_SCREENSHOT_REQUESTED, 0,
-                    packageName);
-            onClick.run();
-        });
+        mScrollChip.setOnClickListener((v) -> onClick.run());
     }
 
     @Override // ViewTreeObserver.OnComputeInternalInsetsListener
@@ -789,15 +780,8 @@
             mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SHARE_TAPPED, 0, mPackageName);
             prepareSharedTransition();
 
-            Intent shareIntent;
-            if (mFlags.isEnabled(Flags.SCREENSHOT_METADATA) && mScreenshotData != null
-                    && mScreenshotData.getContextUrl() != null) {
-                shareIntent = ActionIntentCreator.INSTANCE.createShareWithText(
-                        imageData.uri, mScreenshotData.getContextUrl().toString());
-            } else {
-                shareIntent = ActionIntentCreator.INSTANCE.createShareWithSubject(
-                        imageData.uri, imageData.subject);
-            }
+            Intent shareIntent = ActionIntentCreator.INSTANCE.createShareWithSubject(
+                    imageData.uri, imageData.subject);
             mCallbacks.onAction(shareIntent, imageData.owner, false);
 
         });
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotViewProxy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotViewProxy.kt
index 6be32a9..a4069d1 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotViewProxy.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotViewProxy.kt
@@ -46,7 +46,7 @@
     fun createScreenshotDropInAnimation(screenRect: Rect, showFlash: Boolean): Animator
     fun addQuickShareChip(quickShareAction: Notification.Action)
     fun setChipIntents(imageData: ScreenshotController.SavedImageData)
-    fun requestDismissal(event: ScreenshotEvent)
+    fun requestDismissal(event: ScreenshotEvent?)
 
     fun showScrollChip(packageName: String, onClick: Runnable)
     fun hideScrollChip()
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt
index bc33755..ec7707c 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt
@@ -5,7 +5,6 @@
 import android.util.Log
 import android.view.Display
 import android.view.WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE
-import com.android.app.tracing.coroutines.launch
 import com.android.internal.logging.UiEventLogger
 import com.android.internal.util.ScreenshotRequest
 import com.android.systemui.dagger.SysUISingleton
@@ -18,6 +17,23 @@
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.launch
+
+interface TakeScreenshotExecutor {
+    suspend fun executeScreenshots(
+        screenshotRequest: ScreenshotRequest,
+        onSaved: (Uri) -> Unit,
+        requestCallback: RequestCallback
+    )
+    fun onCloseSystemDialogsReceived()
+    fun removeWindows()
+    fun onDestroy()
+    fun executeScreenshotsAsync(
+        screenshotRequest: ScreenshotRequest,
+        onSaved: Consumer<Uri>,
+        requestCallback: RequestCallback
+    )
+}
 
 /**
  * Receives the signal to take a screenshot from [TakeScreenshotService], and calls back with the
@@ -26,7 +42,7 @@
  * Captures a screenshot for each [Display] available.
  */
 @SysUISingleton
-class TakeScreenshotExecutor
+class TakeScreenshotExecutorImpl
 @Inject
 constructor(
     private val screenshotControllerFactory: ScreenshotController.Factory,
@@ -35,7 +51,7 @@
     private val screenshotRequestProcessor: ScreenshotRequestProcessor,
     private val uiEventLogger: UiEventLogger,
     private val screenshotNotificationControllerFactory: ScreenshotNotificationsController.Factory,
-) {
+) : TakeScreenshotExecutor {
 
     private val displays = displayRepository.displays
     private val screenshotControllers = mutableMapOf<Int, ScreenshotController>()
@@ -47,7 +63,7 @@
      * [onSaved] is invoked only on the default display result. [RequestCallback.onFinish] is
      * invoked only when both screenshot UIs are removed.
      */
-    suspend fun executeScreenshots(
+    override suspend fun executeScreenshots(
         screenshotRequest: ScreenshotRequest,
         onSaved: (Uri) -> Unit,
         requestCallback: RequestCallback
@@ -76,14 +92,14 @@
         // Let's wait before logging "screenshot requested", as we should log the processed
         // ScreenshotData.
         val screenshotData =
-            try {
-                screenshotRequestProcessor.process(rawScreenshotData)
-            } catch (e: RequestProcessorException) {
-                Log.e(TAG, "Failed to process screenshot request!", e)
-                logScreenshotRequested(rawScreenshotData)
-                onFailedScreenshotRequest(rawScreenshotData, callback)
-                return
-            }
+            runCatching { screenshotRequestProcessor.process(rawScreenshotData) }
+                .onFailure {
+                    Log.e(TAG, "Failed to process screenshot request!", it)
+                    logScreenshotRequested(rawScreenshotData)
+                    onFailedScreenshotRequest(rawScreenshotData, callback)
+                }
+                .getOrNull()
+                ?: return
 
         logScreenshotRequested(screenshotData)
         Log.d(TAG, "Screenshot request: $screenshotData")
@@ -128,12 +144,8 @@
         }
     }
 
-    /**
-     * Propagates the close system dialog signal to all controllers.
-     *
-     * TODO(b/295143676): Move the receiver in this class once the flag is flipped.
-     */
-    fun onCloseSystemDialogsReceived() {
+    /** Propagates the close system dialog signal to all controllers. */
+    override fun onCloseSystemDialogsReceived() {
         screenshotControllers.forEach { (_, screenshotController) ->
             if (!screenshotController.isPendingSharedTransition) {
                 screenshotController.requestDismissal(ScreenshotEvent.SCREENSHOT_DISMISSED_OTHER)
@@ -142,7 +154,7 @@
     }
 
     /** Removes all screenshot related windows. */
-    fun removeWindows() {
+    override fun removeWindows() {
         screenshotControllers.forEach { (_, screenshotController) ->
             screenshotController.removeWindow()
         }
@@ -151,7 +163,7 @@
     /**
      * Destroys the executor. Afterwards, this class is not expected to work as intended anymore.
      */
-    fun onDestroy() {
+    override fun onDestroy() {
         screenshotControllers.forEach { (_, screenshotController) ->
             screenshotController.onDestroy()
         }
@@ -171,12 +183,12 @@
     }
 
     /** For java compatibility only. see [executeScreenshots] */
-    fun executeScreenshotsAsync(
+    override fun executeScreenshotsAsync(
         screenshotRequest: ScreenshotRequest,
         onSaved: Consumer<Uri>,
         requestCallback: RequestCallback
     ) {
-        mainScope.launch("TakeScreenshotService#executeScreenshotsAsync") {
+        mainScope.launch {
             executeScreenshots(screenshotRequest, { uri -> onSaved.accept(uri) }, requestCallback)
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
index 9cf347b..2187b51 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
@@ -21,13 +21,11 @@
 
 import static com.android.internal.util.ScreenshotHelper.SCREENSHOT_MSG_PROCESS_COMPLETE;
 import static com.android.internal.util.ScreenshotHelper.SCREENSHOT_MSG_URI;
-import static com.android.systemui.flags.Flags.MULTI_DISPLAY_SCREENSHOT;
 import static com.android.systemui.screenshot.LogConfig.DEBUG_CALLBACK;
 import static com.android.systemui.screenshot.LogConfig.DEBUG_DISMISS;
 import static com.android.systemui.screenshot.LogConfig.DEBUG_SERVICE;
 import static com.android.systemui.screenshot.LogConfig.logTag;
 import static com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_CAPTURE_FAILED;
-import static com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_DISMISSED_OTHER;
 
 import android.annotation.MainThread;
 import android.app.Service;
@@ -50,24 +48,19 @@
 import android.view.Display;
 import android.widget.Toast;
 
-import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.UiEventLogger;
 import com.android.internal.util.ScreenshotRequest;
 import com.android.systemui.dagger.qualifiers.Background;
-import com.android.systemui.flags.FeatureFlags;
 import com.android.systemui.res.R;
 
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
 
 import javax.inject.Inject;
-import javax.inject.Provider;
 
 public class TakeScreenshotService extends Service {
     private static final String TAG = logTag(TakeScreenshotService.class);
 
-    private final ScreenshotController mScreenshot;
-
     private final UserManager mUserManager;
     private final DevicePolicyManager mDevicePolicyManager;
     private final UiEventLogger mUiEventLogger;
@@ -75,27 +68,20 @@
     private final Handler mHandler;
     private final Context mContext;
     private final @Background Executor mBgExecutor;
-    private final RequestProcessor mProcessor;
-    private final FeatureFlags mFeatureFlags;
+    private final TakeScreenshotExecutor mTakeScreenshotExecutor;
 
+    @SuppressWarnings("deprecation")
     private final BroadcastReceiver mCloseSystemDialogs = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            if (ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction()) && mScreenshot != null) {
+            if (ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
                 if (DEBUG_DISMISS) {
                     Log.d(TAG, "Received ACTION_CLOSE_SYSTEM_DIALOGS");
                 }
-                if (mFeatureFlags.isEnabled(MULTI_DISPLAY_SCREENSHOT)) {
-                    // TODO(b/295143676): move receiver inside executor when the flag is enabled.
-                    mTakeScreenshotExecutor.get().onCloseSystemDialogsReceived();
-                } else if (!mScreenshot.isPendingSharedTransition()) {
-                    mScreenshot.requestDismissal(SCREENSHOT_DISMISSED_OTHER);
-                }
+                mTakeScreenshotExecutor.onCloseSystemDialogsReceived();
             }
         }
     };
-    private final Provider<TakeScreenshotExecutor> mTakeScreenshotExecutor;
-
 
     /** Informs about coarse grained state of the Controller. */
     public interface RequestCallback {
@@ -111,12 +97,14 @@
     }
 
     @Inject
-    public TakeScreenshotService(ScreenshotController.Factory screenshotControllerFactory,
-            UserManager userManager, DevicePolicyManager devicePolicyManager,
+    public TakeScreenshotService(
+            UserManager userManager,
+            DevicePolicyManager devicePolicyManager,
             UiEventLogger uiEventLogger,
             ScreenshotNotificationsController.Factory notificationsControllerFactory,
-            Context context, @Background Executor bgExecutor, FeatureFlags featureFlags,
-            RequestProcessor processor, Provider<TakeScreenshotExecutor> takeScreenshotExecutor) {
+            Context context,
+            @Background Executor bgExecutor,
+            TakeScreenshotExecutor takeScreenshotExecutor) {
         if (DEBUG_SERVICE) {
             Log.d(TAG, "new " + this);
         }
@@ -127,15 +115,7 @@
         mNotificationsController = notificationsControllerFactory.create(Display.DEFAULT_DISPLAY);
         mContext = context;
         mBgExecutor = bgExecutor;
-        mFeatureFlags = featureFlags;
-        mProcessor = processor;
         mTakeScreenshotExecutor = takeScreenshotExecutor;
-        if (mFeatureFlags.isEnabled(MULTI_DISPLAY_SCREENSHOT)) {
-            mScreenshot = null;
-        } else {
-            mScreenshot = screenshotControllerFactory.create(
-                    Display.DEFAULT_DISPLAY, /* showUIOnExternalDisplay= */ false);
-        }
     }
 
     @Override
@@ -161,11 +141,7 @@
         if (DEBUG_SERVICE) {
             Log.d(TAG, "onUnbind");
         }
-        if (mFeatureFlags.isEnabled(MULTI_DISPLAY_SCREENSHOT)) {
-            mTakeScreenshotExecutor.get().removeWindows();
-        } else {
-            mScreenshot.removeWindow();
-        }
+        mTakeScreenshotExecutor.removeWindows();
         unregisterReceiver(mCloseSystemDialogs);
         return false;
     }
@@ -173,11 +149,7 @@
     @Override
     public void onDestroy() {
         super.onDestroy();
-        if (mFeatureFlags.isEnabled(MULTI_DISPLAY_SCREENSHOT)) {
-            mTakeScreenshotExecutor.get().onDestroy();
-        } else {
-            mScreenshot.onDestroy();
-        }
+        mTakeScreenshotExecutor.onDestroy();
         if (DEBUG_SERVICE) {
             Log.d(TAG, "onDestroy");
         }
@@ -190,6 +162,7 @@
             mReplyTo = replyTo;
         }
 
+        @Override
         public void reportError() {
             reportUri(mReplyTo, null);
             sendComplete(mReplyTo);
@@ -214,7 +187,6 @@
     }
 
     @MainThread
-    @VisibleForTesting
     void handleRequest(ScreenshotRequest request, Consumer<Uri> onSaved,
             RequestCallback callback) {
         // If the storage for this user is locked, we have no place to store
@@ -245,36 +217,9 @@
         }
 
         Log.d(TAG, "Processing screenshot data");
-
-
-        if (mFeatureFlags.isEnabled(MULTI_DISPLAY_SCREENSHOT)) {
-            mTakeScreenshotExecutor.get().executeScreenshotsAsync(request, onSaved, callback);
-            return;
-        }
-        // TODO(b/295143676): Delete the following after the flag is released.
-        try {
-            ScreenshotData screenshotData = ScreenshotData.fromRequest(
-                    request, Display.DEFAULT_DISPLAY);
-            mProcessor.processAsync(screenshotData, (data) ->
-                    dispatchToController(data, onSaved, callback));
-
-        } catch (IllegalStateException e) {
-            Log.e(TAG, "Failed to process screenshot request!", e);
-            logFailedRequest(request);
-            mNotificationsController.notifyScreenshotError(
-                    R.string.screenshot_failed_to_capture_text);
-            callback.reportError();
-        }
+        mTakeScreenshotExecutor.executeScreenshotsAsync(request, onSaved, callback);
     }
 
-    // TODO(b/295143676): Delete this.
-    private void dispatchToController(ScreenshotData screenshot,
-            Consumer<Uri> uriConsumer, RequestCallback callback) {
-        mUiEventLogger.log(ScreenshotEvent.getScreenshotSource(screenshot.getSource()), 0,
-                screenshot.getPackageNameString());
-        Log.d(TAG, "Screenshot request: " + screenshot);
-        mScreenshot.handleScreenshot(screenshot, uriConsumer, callback);
-    }
 
     private void logFailedRequest(ScreenshotRequest request) {
         ComponentName topComponent = request.getTopComponent();
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java b/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java
index 2ce6d83..ab23e5f 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java
@@ -22,25 +22,24 @@
 import android.view.accessibility.AccessibilityManager;
 
 import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.screenshot.DefaultScreenshotActionsProvider;
 import com.android.systemui.screenshot.ImageCapture;
 import com.android.systemui.screenshot.ImageCaptureImpl;
 import com.android.systemui.screenshot.LegacyScreenshotViewProxy;
-import com.android.systemui.screenshot.RequestProcessor;
-import com.android.systemui.screenshot.ScreenshotActionsProvider;
 import com.android.systemui.screenshot.ScreenshotPolicy;
 import com.android.systemui.screenshot.ScreenshotPolicyImpl;
-import com.android.systemui.screenshot.ScreenshotProxyService;
-import com.android.systemui.screenshot.ScreenshotRequestProcessor;
 import com.android.systemui.screenshot.ScreenshotShelfViewProxy;
 import com.android.systemui.screenshot.ScreenshotSoundController;
 import com.android.systemui.screenshot.ScreenshotSoundControllerImpl;
 import com.android.systemui.screenshot.ScreenshotSoundProvider;
 import com.android.systemui.screenshot.ScreenshotSoundProviderImpl;
 import com.android.systemui.screenshot.ScreenshotViewProxy;
+import com.android.systemui.screenshot.TakeScreenshotExecutor;
+import com.android.systemui.screenshot.TakeScreenshotExecutorImpl;
 import com.android.systemui.screenshot.TakeScreenshotService;
 import com.android.systemui.screenshot.appclips.AppClipsScreenshotHelperService;
 import com.android.systemui.screenshot.appclips.AppClipsService;
+import com.android.systemui.screenshot.policy.ScreenshotPolicyModule;
+import com.android.systemui.screenshot.proxy.SystemUiProxyModule;
 import com.android.systemui.screenshot.ui.viewmodel.ScreenshotViewModel;
 
 import dagger.Binds;
@@ -52,7 +51,7 @@
 /**
  * Defines injectable resources for Screenshots
  */
-@Module
+@Module(includes = {ScreenshotPolicyModule.class, SystemUiProxyModule.class})
 public abstract class ScreenshotModule {
 
     @Binds
@@ -61,9 +60,9 @@
     abstract Service bindTakeScreenshotService(TakeScreenshotService service);
 
     @Binds
-    @IntoMap
-    @ClassKey(ScreenshotProxyService.class)
-    abstract Service bindScreenshotProxyService(ScreenshotProxyService service);
+    @SysUISingleton
+    abstract TakeScreenshotExecutor bindTakeScreenshotExecutor(
+            TakeScreenshotExecutorImpl impl);
 
     @Binds
     abstract ScreenshotPolicy bindScreenshotPolicyImpl(ScreenshotPolicyImpl impl);
@@ -82,10 +81,6 @@
     abstract Service bindAppClipsService(AppClipsService service);
 
     @Binds
-    abstract ScreenshotRequestProcessor bindScreenshotRequestProcessor(
-            RequestProcessor requestProcessor);
-
-    @Binds
     abstract ScreenshotSoundProvider bindScreenshotSoundProvider(
             ScreenshotSoundProviderImpl screenshotSoundProviderImpl);
 
@@ -93,10 +88,6 @@
     abstract ScreenshotSoundController bindScreenshotSoundController(
             ScreenshotSoundControllerImpl screenshotSoundProviderImpl);
 
-    @Binds
-    abstract ScreenshotActionsProvider.Factory bindScreenshotActionsProviderFactory(
-            DefaultScreenshotActionsProvider.Factory defaultScreenshotActionsProviderFactory);
-
     @Provides
     @SysUISingleton
     static ScreenshotViewModel providesScreenshotViewModel(
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/data/model/ChildTaskModel.kt b/packages/SystemUI/src/com/android/systemui/screenshot/data/model/ChildTaskModel.kt
new file mode 100644
index 0000000..c380db0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/data/model/ChildTaskModel.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.screenshot.data.model
+
+import android.content.ComponentName
+import android.graphics.Rect
+
+/** A child task within a RootTaskInfo */
+data class ChildTaskModel(
+    /** The task identifier */
+    val id: Int,
+    /** The task name */
+    val name: String,
+    /** The location and size of the task */
+    val bounds: Rect,
+    /** The user which created the task. */
+    val userId: Int,
+) {
+    val componentName: ComponentName?
+        get() = ComponentName.unflattenFromString(name)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/data/model/DisplayContentModel.kt b/packages/SystemUI/src/com/android/systemui/screenshot/data/model/DisplayContentModel.kt
new file mode 100644
index 0000000..2048b7c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/data/model/DisplayContentModel.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.screenshot.data.model
+
+import android.app.ActivityTaskManager.RootTaskInfo
+
+/** Information about the tasks on a display. */
+data class DisplayContentModel(
+    /** The id of the display. */
+    val displayId: Int,
+    /** Information about the current System UI state which can affect capture. */
+    val systemUiState: SystemUiState,
+    /** A list of root tasks on the display, ordered from top to bottom along the z-axis */
+    val rootTasks: List<RootTaskInfo>,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/data/model/ProfileType.kt b/packages/SystemUI/src/com/android/systemui/screenshot/data/model/ProfileType.kt
new file mode 100644
index 0000000..38016ad
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/data/model/ProfileType.kt
@@ -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.systemui.screenshot.data.model
+
+/** The profile type of a user. */
+enum class ProfileType {
+    /** The user is not a profile. */
+    NONE,
+    /** Private space user */
+    PRIVATE,
+    /** Managed (work) profile. */
+    WORK,
+    /** Cloned apps user */
+    CLONE,
+    /** Communal profile */
+    COMMUNAL,
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/data/model/SystemUiState.kt b/packages/SystemUI/src/com/android/systemui/screenshot/data/model/SystemUiState.kt
new file mode 100644
index 0000000..78be6bd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/data/model/SystemUiState.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.screenshot.data.model
+
+/** Information about SystemUI state relevant to screenshot policy. */
+data class SystemUiState(val shadeExpanded: Boolean)
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/DisplayContentRepository.kt b/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/DisplayContentRepository.kt
new file mode 100644
index 0000000..48e813d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/DisplayContentRepository.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.screenshot.data.repository
+
+import com.android.systemui.screenshot.data.model.DisplayContentModel
+
+/** Provides information about tasks related to a display. */
+fun interface DisplayContentRepository {
+    /** Provides information about the tasks and content presented on a given display. */
+    suspend fun getDisplayContent(displayId: Int): DisplayContentModel
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/DisplayContentRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/DisplayContentRepositoryImpl.kt
new file mode 100644
index 0000000..e9599dc
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/DisplayContentRepositoryImpl.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.screenshot.data.repository
+
+import android.annotation.SuppressLint
+import android.app.ActivityTaskManager
+import android.app.IActivityTaskManager
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.screenshot.data.model.DisplayContentModel
+import com.android.systemui.screenshot.data.model.SystemUiState
+import com.android.systemui.screenshot.proxy.SystemUiProxy
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.withContext
+
+/**
+ * Implements DisplayTaskRepository using [IActivityTaskManager], along with [ProfileTypeRepository]
+ * and [SystemUiProxy].
+ */
+@SuppressLint("MissingPermission")
+class DisplayContentRepositoryImpl
+@Inject
+constructor(
+    private val atmService: IActivityTaskManager,
+    private val systemUiProxy: SystemUiProxy,
+    @Background private val background: CoroutineDispatcher,
+) : DisplayContentRepository {
+
+    override suspend fun getDisplayContent(displayId: Int): DisplayContentModel {
+        return withContext(background) {
+            val rootTasks = atmService.getAllRootTaskInfosOnDisplay(displayId)
+            toDisplayTasksModel(displayId, rootTasks)
+        }
+    }
+
+    private suspend fun toDisplayTasksModel(
+        displayId: Int,
+        rootTasks: List<ActivityTaskManager.RootTaskInfo>,
+    ): DisplayContentModel {
+        return DisplayContentModel(
+            displayId,
+            SystemUiState(systemUiProxy.isNotificationShadeExpanded()),
+            rootTasks
+        )
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/ProfileTypeRepository.kt b/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/ProfileTypeRepository.kt
new file mode 100644
index 0000000..2c6e4fe
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/ProfileTypeRepository.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.screenshot.data.repository
+
+import android.annotation.UserIdInt
+import com.android.systemui.screenshot.data.model.ProfileType
+
+/** A facility for checking user profile types. */
+fun interface ProfileTypeRepository {
+    /**
+     * Returns the profile type when [userId] refers to a profile user. If the profile type is
+     * unknown or not a profile user, [ProfileType.NONE] is returned.
+     */
+    suspend fun getProfileType(@UserIdInt userId: Int): ProfileType
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/ProfileTypeRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/ProfileTypeRepositoryImpl.kt
new file mode 100644
index 0000000..17ddf80
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/ProfileTypeRepositoryImpl.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.
+ */
+@file:Suppress("MissingPermission")
+
+package com.android.systemui.screenshot.data.repository
+
+import android.annotation.UserIdInt
+import android.os.UserManager
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.screenshot.data.model.ProfileType
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.sync.Mutex
+import kotlinx.coroutines.sync.withLock
+import kotlinx.coroutines.withContext
+
+/** Fetches profile types from [UserManager] as needed, caching results for a given user. */
+class ProfileTypeRepositoryImpl
+@Inject
+constructor(
+    private val userManager: UserManager,
+    @Background private val background: CoroutineDispatcher
+) : ProfileTypeRepository {
+    /** Cache to avoid repeated requests to IActivityTaskManager for the same userId */
+    private val cache = mutableMapOf<Int, ProfileType>()
+    private val mutex = Mutex()
+
+    override suspend fun getProfileType(@UserIdInt userId: Int): ProfileType {
+        return mutex.withLock {
+            cache[userId]
+                ?: withContext(background) {
+                        val userType = userManager.getUserInfo(userId).userType
+                        when (userType) {
+                            UserManager.USER_TYPE_PROFILE_MANAGED -> ProfileType.WORK
+                            UserManager.USER_TYPE_PROFILE_PRIVATE -> ProfileType.PRIVATE
+                            UserManager.USER_TYPE_PROFILE_CLONE -> ProfileType.CLONE
+                            UserManager.USER_TYPE_PROFILE_COMMUNAL -> ProfileType.COMMUNAL
+                            else -> ProfileType.NONE
+                        }
+                    }
+                    .also { cache[userId] = it }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/policy/CaptureParameters.kt b/packages/SystemUI/src/com/android/systemui/screenshot/policy/CaptureParameters.kt
new file mode 100644
index 0000000..5e2b576
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/policy/CaptureParameters.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.screenshot.policy
+
+import android.content.ComponentName
+import android.os.UserHandle
+
+/** The parameters dictated by a [CapturePolicy], used to adjust alter screenshot request. */
+data class CaptureParameters(
+    /** How should the content be captured? */
+    val type: CaptureType,
+    /** The focused or top component at the time of the screenshot. */
+    val component: ComponentName?,
+    /** Which user should receive the screenshot file? */
+    val owner: UserHandle,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/policy/CapturePolicy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/policy/CapturePolicy.kt
new file mode 100644
index 0000000..0fb5366
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/policy/CapturePolicy.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.screenshot.policy
+
+import com.android.systemui.screenshot.data.model.DisplayContentModel
+
+/** Contains logic to determine when and how an adjust to screenshot behavior applies. */
+fun interface CapturePolicy {
+    /**
+     * Test the policy against the current display task state. If the policy applies, Returns a
+     * [PolicyResult.Matched] containing [CaptureParameters] used to alter the request.
+     */
+    suspend fun check(content: DisplayContentModel): PolicyResult
+
+    /** The result of a screen capture policy check. */
+    sealed interface PolicyResult {
+        /** The policy rules matched the given display content and will be applied. */
+        data class Matched(
+            /** The name of the policy rule which matched. */
+            val policy: String,
+            /** Why the policy matched. */
+            val reason: String,
+            /** Details on how to modify the screen capture request. */
+            val parameters: CaptureParameters,
+        ) : PolicyResult
+
+        /** The policy rules do not match the given display content and do not apply. */
+        data class NotMatched(
+            /** The name of the policy rule which matched. */
+            val policy: String,
+            /** Why the policy did not match. */
+            val reason: String
+        ) : PolicyResult
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/policy/CaptureType.kt b/packages/SystemUI/src/com/android/systemui/screenshot/policy/CaptureType.kt
new file mode 100644
index 0000000..0ef5207
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/policy/CaptureType.kt
@@ -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.systemui.screenshot.policy
+
+import android.graphics.Rect
+
+/** What to capture */
+sealed interface CaptureType {
+    /** Capture the entire screen contents. */
+    data class FullScreen(val displayId: Int) : CaptureType
+
+    /** Capture the contents of the task only. */
+    data class IsolatedTask(
+        val taskId: Int,
+        val taskBounds: Rect?,
+    ) : CaptureType
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/policy/PolicyRequestProcessor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/policy/PolicyRequestProcessor.kt
new file mode 100644
index 0000000..80aa0ef
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/policy/PolicyRequestProcessor.kt
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.screenshot.policy
+
+import android.app.ActivityTaskManager.RootTaskInfo
+import android.app.WindowConfiguration
+import android.content.ComponentName
+import android.graphics.Bitmap
+import android.graphics.Rect
+import android.os.Process.myUserHandle
+import android.os.UserHandle
+import android.util.Log
+import android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN
+import android.view.WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.screenshot.ImageCapture
+import com.android.systemui.screenshot.ScreenshotData
+import com.android.systemui.screenshot.ScreenshotRequestProcessor
+import com.android.systemui.screenshot.data.model.DisplayContentModel
+import com.android.systemui.screenshot.data.repository.DisplayContentRepository
+import com.android.systemui.screenshot.policy.CapturePolicy.PolicyResult.Matched
+import com.android.systemui.screenshot.policy.CapturePolicy.PolicyResult.NotMatched
+import com.android.systemui.screenshot.policy.CaptureType.FullScreen
+import com.android.systemui.screenshot.policy.CaptureType.IsolatedTask
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.withContext
+
+private const val TAG = "PolicyRequestProcessor"
+
+/** A [ScreenshotRequestProcessor] which supports general policy rule matching. */
+class PolicyRequestProcessor(
+    @Background private val background: CoroutineDispatcher,
+    private val capture: ImageCapture,
+    /** Provides information about the tasks on a given display */
+    private val displayTasks: DisplayContentRepository,
+    /** The list of policies to apply, in order of priority */
+    private val policies: List<CapturePolicy>,
+    /** The owner to assign for screenshot when a focused task isn't visible */
+    private val defaultOwner: UserHandle = myUserHandle(),
+    /** The assigned component when no application has focus, or not visible */
+    private val defaultComponent: ComponentName,
+) : ScreenshotRequestProcessor {
+    override suspend fun process(original: ScreenshotData): ScreenshotData {
+        if (original.type == TAKE_SCREENSHOT_PROVIDED_IMAGE) {
+            // The request contains an already captured screenshot, accept it as is.
+            Log.i(TAG, "Screenshot bitmap provided. No modifications applied.")
+            return original
+        }
+        val displayContent = displayTasks.getDisplayContent(original.displayId)
+
+        // If policies yield explicit modifications, apply them and return the result
+        Log.i(TAG, "Applying policy checks....")
+        policies.map { policy ->
+            when (val result = policy.check(displayContent)) {
+                is Matched -> {
+                    Log.i(TAG, "$result")
+                    return modify(original, result.parameters)
+                }
+                is NotMatched -> Log.i(TAG, "$result")
+            }
+        }
+
+        // Otherwise capture normally, filling in additional information as needed.
+        return captureScreenshot(original, displayContent)
+    }
+
+    /** Produce a new [ScreenshotData] using [CaptureParameters] */
+    suspend fun modify(original: ScreenshotData, updates: CaptureParameters): ScreenshotData {
+        // Update and apply bitmap capture depending on the parameters.
+        val updated =
+            when (val type = updates.type) {
+                is IsolatedTask ->
+                    replaceWithTaskSnapshot(
+                        original,
+                        updates.component,
+                        updates.owner,
+                        type.taskId,
+                        type.taskBounds
+                    )
+                is FullScreen ->
+                    replaceWithScreenshot(
+                        original,
+                        updates.component,
+                        updates.owner,
+                        type.displayId
+                    )
+            }
+        return updated
+    }
+
+    private suspend fun captureScreenshot(
+        original: ScreenshotData,
+        displayContent: DisplayContentModel,
+    ): ScreenshotData {
+        // The first root task on the display, excluding Picture-in-Picture
+        val topMainRootTask =
+            if (!displayContent.systemUiState.shadeExpanded) {
+                displayContent.rootTasks.firstOrNull(::nonPipVisibleTask)
+            } else {
+                null // Otherwise attributed to SystemUI / current user
+            }
+
+        return replaceWithScreenshot(
+            original = original,
+            componentName = topMainRootTask?.topActivity ?: defaultComponent,
+            owner = topMainRootTask?.userId?.let { UserHandle.of(it) } ?: defaultOwner,
+            displayId = original.displayId
+        )
+    }
+
+    suspend fun replaceWithTaskSnapshot(
+        original: ScreenshotData,
+        componentName: ComponentName?,
+        owner: UserHandle,
+        taskId: Int,
+        taskBounds: Rect?,
+    ): ScreenshotData {
+        Log.i(TAG, "Capturing task snapshot: $componentName / $owner")
+        val taskSnapshot = capture.captureTask(taskId)
+        return original.copy(
+            type = TAKE_SCREENSHOT_PROVIDED_IMAGE,
+            bitmap = taskSnapshot,
+            userHandle = owner,
+            taskId = taskId,
+            topComponent = componentName,
+            screenBounds = taskBounds
+        )
+    }
+
+    suspend fun replaceWithScreenshot(
+        original: ScreenshotData,
+        componentName: ComponentName?,
+        owner: UserHandle?,
+        displayId: Int,
+    ): ScreenshotData {
+        Log.i(TAG, "Capturing screenshot: $componentName / $owner")
+        val screenshot = captureDisplay(displayId)
+        return original.copy(
+            type = TAKE_SCREENSHOT_FULLSCREEN,
+            bitmap = screenshot,
+            userHandle = owner,
+            topComponent = componentName,
+            screenBounds = Rect(0, 0, screenshot?.width ?: 0, screenshot?.height ?: 0)
+        )
+    }
+
+    /** Filter for the task used to attribute a full screen capture to an owner */
+    private fun nonPipVisibleTask(info: RootTaskInfo): Boolean {
+        return info.windowingMode != WindowConfiguration.WINDOWING_MODE_PINNED &&
+            info.isVisible &&
+            info.isRunning &&
+            info.numActivities > 0 &&
+            info.topActivity != null &&
+            info.childTaskIds.isNotEmpty()
+    }
+
+    /** TODO: Move to ImageCapture (existing function is non-suspending) */
+    private suspend fun captureDisplay(displayId: Int): Bitmap? {
+        return withContext(background) { capture.captureDisplay(displayId) }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/policy/PrivateProfilePolicy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/policy/PrivateProfilePolicy.kt
new file mode 100644
index 0000000..6373a58
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/policy/PrivateProfilePolicy.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.screenshot.policy
+
+import android.os.UserHandle
+import com.android.systemui.screenshot.data.model.DisplayContentModel
+import com.android.systemui.screenshot.data.model.ProfileType
+import com.android.systemui.screenshot.data.repository.ProfileTypeRepository
+import com.android.systemui.screenshot.policy.CapturePolicy.PolicyResult
+import com.android.systemui.screenshot.policy.CapturePolicy.PolicyResult.Matched
+import com.android.systemui.screenshot.policy.CapturePolicy.PolicyResult.NotMatched
+import com.android.systemui.screenshot.policy.CaptureType.FullScreen
+import javax.inject.Inject
+
+private const val POLICY_NAME = "PrivateProfile"
+
+/**
+ * Condition: When any visible task belongs to a private user.
+ *
+ * Parameters: Capture the whole screen, owned by the private user.
+ */
+class PrivateProfilePolicy
+@Inject
+constructor(
+    private val profileTypes: ProfileTypeRepository,
+) : CapturePolicy {
+    override suspend fun check(content: DisplayContentModel): PolicyResult {
+        // The systemUI notification shade isn't a private profile app, skip.
+        if (content.systemUiState.shadeExpanded) {
+            return NotMatched(policy = POLICY_NAME, reason = "Notification shade is expanded")
+        }
+
+        // Find the first visible rootTaskInfo with a child task owned by a private user
+        val (rootTask, childTask) =
+            content.rootTasks
+                .filter { it.isVisible }
+                .firstNotNullOfOrNull { root ->
+                    root
+                        .childTasksTopDown()
+                        .firstOrNull {
+                            profileTypes.getProfileType(it.userId) == ProfileType.PRIVATE
+                        }
+                        ?.let { root to it }
+                }
+                ?: return NotMatched(
+                    policy = POLICY_NAME,
+                    reason = "No private profile tasks are visible"
+                )
+
+        // If matched, return parameters needed to modify the request.
+        return Matched(
+            policy = POLICY_NAME,
+            reason = "At least one private profile task is visible",
+            CaptureParameters(
+                type = FullScreen(content.displayId),
+                component = childTask.componentName ?: rootTask.topActivity,
+                owner = UserHandle.of(childTask.userId),
+            )
+        )
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/policy/RootTaskInfoExt.kt b/packages/SystemUI/src/com/android/systemui/screenshot/policy/RootTaskInfoExt.kt
new file mode 100644
index 0000000..3789371
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/policy/RootTaskInfoExt.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.screenshot.policy
+
+import android.app.ActivityTaskManager.RootTaskInfo
+import com.android.systemui.screenshot.data.model.ChildTaskModel
+
+/** The child tasks of A RootTaskInfo as [ChildTaskModel] in top-down (z-index ascending) order. */
+internal fun RootTaskInfo.childTasksTopDown(): Sequence<ChildTaskModel> {
+    return ((childTaskIds.size - 1) downTo 0).asSequence().map { index ->
+        ChildTaskModel(
+            childTaskIds[index],
+            childTaskNames[index],
+            childTaskBounds[index],
+            childTaskUserIds[index]
+        )
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/policy/ScreenshotPolicyModule.kt b/packages/SystemUI/src/com/android/systemui/screenshot/policy/ScreenshotPolicyModule.kt
new file mode 100644
index 0000000..a6b01e7
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/policy/ScreenshotPolicyModule.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.screenshot.policy
+
+import android.content.ComponentName
+import android.content.Context
+import android.os.Process
+import com.android.systemui.Flags.screenshotPrivateProfile
+import com.android.systemui.SystemUIService
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.screenshot.ImageCapture
+import com.android.systemui.screenshot.RequestProcessor
+import com.android.systemui.screenshot.ScreenshotPolicy
+import com.android.systemui.screenshot.ScreenshotRequestProcessor
+import com.android.systemui.screenshot.data.repository.DisplayContentRepository
+import com.android.systemui.screenshot.data.repository.DisplayContentRepositoryImpl
+import com.android.systemui.screenshot.data.repository.ProfileTypeRepository
+import com.android.systemui.screenshot.data.repository.ProfileTypeRepositoryImpl
+import dagger.Binds
+import dagger.Module
+import dagger.Provides
+import javax.inject.Provider
+import kotlinx.coroutines.CoroutineDispatcher
+
+@Module
+interface ScreenshotPolicyModule {
+
+    @Binds
+    @SysUISingleton
+    fun bindProfileTypeRepository(impl: ProfileTypeRepositoryImpl): ProfileTypeRepository
+
+    @Binds
+    @SysUISingleton
+    fun bindDisplayContentRepository(impl: DisplayContentRepositoryImpl): DisplayContentRepository
+
+    companion object {
+        @JvmStatic
+        @Provides
+        @SysUISingleton
+        fun bindCapturePolicyList(
+            privateProfilePolicy: PrivateProfilePolicy,
+            workProfilePolicy: WorkProfilePolicy,
+        ): List<CapturePolicy> {
+            // In order of priority. The first matching policy applies.
+            return listOf(workProfilePolicy, privateProfilePolicy)
+        }
+
+        @JvmStatic
+        @Provides
+        @SysUISingleton
+        fun bindScreenshotRequestProcessor(
+            @Application context: Context,
+            @Background background: CoroutineDispatcher,
+            imageCapture: ImageCapture,
+            policyProvider: Provider<ScreenshotPolicy>,
+            displayContentRepoProvider: Provider<DisplayContentRepository>,
+            policyListProvider: Provider<List<CapturePolicy>>,
+        ): ScreenshotRequestProcessor {
+            return if (screenshotPrivateProfile()) {
+                PolicyRequestProcessor(
+                    background = background,
+                    capture = imageCapture,
+                    displayTasks = displayContentRepoProvider.get(),
+                    policies = policyListProvider.get(),
+                    defaultOwner = Process.myUserHandle(),
+                    defaultComponent =
+                        ComponentName(context.packageName, SystemUIService::class.java.toString())
+                )
+            } else {
+                RequestProcessor(imageCapture, policyProvider.get())
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.kt
new file mode 100644
index 0000000..689cc11
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.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.screenshot.policy
+
+import android.app.WindowConfiguration.WINDOWING_MODE_PINNED
+import android.os.UserHandle
+import com.android.systemui.screenshot.data.model.DisplayContentModel
+import com.android.systemui.screenshot.data.model.ProfileType
+import com.android.systemui.screenshot.data.repository.ProfileTypeRepository
+import com.android.systemui.screenshot.policy.CapturePolicy.PolicyResult
+import com.android.systemui.screenshot.policy.CapturePolicy.PolicyResult.NotMatched
+import com.android.systemui.screenshot.policy.CaptureType.IsolatedTask
+import javax.inject.Inject
+import kotlinx.coroutines.flow.first
+
+private const val POLICY_NAME = "WorkProfile"
+
+/**
+ * Condition: When the top visible task (excluding PIP mode) belongs to a work user.
+ *
+ * Parameters: Capture only the foreground task, owned by the work user.
+ */
+class WorkProfilePolicy
+@Inject
+constructor(
+    private val profileTypes: ProfileTypeRepository,
+) : CapturePolicy {
+    override suspend fun check(content: DisplayContentModel): PolicyResult {
+        // The systemUI notification shade isn't a work app, skip.
+        if (content.systemUiState.shadeExpanded) {
+            return NotMatched(policy = POLICY_NAME, reason = "Notification shade is expanded")
+        }
+
+        // Find the first non PiP rootTask with a top child task owned by a work user
+        val (rootTask, childTask) =
+            content.rootTasks
+                .filter { it.isVisible && it.windowingMode != WINDOWING_MODE_PINNED }
+                .map { it to it.childTasksTopDown().first() }
+                .firstOrNull { (_, child) ->
+                    profileTypes.getProfileType(child.userId) == ProfileType.WORK
+                }
+                ?: return NotMatched(
+                    policy = POLICY_NAME,
+                    reason = "The top-most non-PINNED task does not belong to a work profile user"
+                )
+
+        // If matched, return parameters needed to modify the request.
+        return PolicyResult.Matched(
+            policy = POLICY_NAME,
+            reason = "The top-most non-PINNED task ($childTask) belongs to a work profile user",
+            CaptureParameters(
+                type = IsolatedTask(taskId = childTask.id, taskBounds = childTask.bounds),
+                component = childTask.componentName ?: rootTask.topActivity,
+                owner = UserHandle.of(childTask.userId),
+            )
+        )
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/proxy/SystemUiProxy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/proxy/SystemUiProxy.kt
new file mode 100644
index 0000000..e3eb3c4
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/proxy/SystemUiProxy.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.screenshot.proxy
+
+/**
+ * Provides a mechanism to interact with the main SystemUI process.
+ *
+ * ScreenshotService runs in an isolated process. Because of this, interactions with an outside
+ * component with shared state must be accessed through this proxy to reach the correct instance.
+ *
+ * TODO: Rename and relocate 'ScreenshotProxyService' to this package and remove duplicate clients.
+ */
+interface SystemUiProxy {
+    /** Indicate if the notification shade is "open"... (not in the fully collapsed position) */
+    suspend fun isNotificationShadeExpanded(): Boolean
+
+    /**
+     * Request keyguard dismissal, raising keyguard credential entry if required and waits for
+     * completion.
+     */
+    suspend fun dismissKeyguard()
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/proxy/SystemUiProxyClient.kt b/packages/SystemUI/src/com/android/systemui/screenshot/proxy/SystemUiProxyClient.kt
new file mode 100644
index 0000000..dcf58bd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/proxy/SystemUiProxyClient.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.screenshot.proxy
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.Intent
+import android.util.Log
+import com.android.internal.infra.ServiceConnector
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.screenshot.IOnDoneCallback
+import com.android.systemui.screenshot.IScreenshotProxy
+import com.android.systemui.screenshot.ScreenshotProxyService
+import javax.inject.Inject
+import kotlin.coroutines.resume
+import kotlin.coroutines.suspendCoroutine
+import kotlinx.coroutines.CompletableDeferred
+
+private const val TAG = "SystemUiProxy"
+
+/** An implementation of [SystemUiProxy] using [ScreenshotProxyService]. */
+class SystemUiProxyClient @Inject constructor(@Application context: Context) : SystemUiProxy {
+    @SuppressLint("ImplicitSamInstance")
+    private val proxyConnector: ServiceConnector<IScreenshotProxy> =
+        ServiceConnector.Impl(
+            context,
+            Intent(context, ScreenshotProxyService::class.java),
+            Context.BIND_AUTO_CREATE or Context.BIND_WAIVE_PRIORITY or Context.BIND_NOT_VISIBLE,
+            context.userId,
+            IScreenshotProxy.Stub::asInterface
+        )
+
+    override suspend fun isNotificationShadeExpanded(): Boolean = suspendCoroutine { k ->
+        proxyConnector
+            .postForResult { it.isNotificationShadeExpanded }
+            .whenComplete { expanded, error ->
+                error?.also { Log.wtf(TAG, "isNotificationShadeExpanded", it) }
+                k.resume(expanded ?: false)
+            }
+    }
+
+    override suspend fun dismissKeyguard() {
+        val completion = CompletableDeferred<Unit>()
+        val onDoneBinder =
+            object : IOnDoneCallback.Stub() {
+                override fun onDone(success: Boolean) {
+                    completion.complete(Unit)
+                }
+            }
+        if (proxyConnector.run { it.dismissKeyguard(onDoneBinder) }) {
+            completion.await()
+        } else {
+            Log.wtf(TAG, "Keyguard dismissal request failed")
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/proxy/SystemUiProxyModule.kt b/packages/SystemUI/src/com/android/systemui/screenshot/proxy/SystemUiProxyModule.kt
new file mode 100644
index 0000000..4dd5cc4
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/proxy/SystemUiProxyModule.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.screenshot.proxy
+
+import android.app.Service
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.screenshot.ScreenshotProxyService
+import dagger.Binds
+import dagger.Module
+import dagger.multibindings.ClassKey
+import dagger.multibindings.IntoMap
+
+@Module
+interface SystemUiProxyModule {
+
+    @Binds
+    @IntoMap
+    @ClassKey(ScreenshotProxyService::class)
+    fun bindScreenshotProxyService(service: ScreenshotProxyService): Service
+
+    @Binds
+    @SysUISingleton
+    fun bindSystemUiProxy(systemUiProxyClient: SystemUiProxyClient): SystemUiProxy
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/scroll/LongScreenshotActivity.java b/packages/SystemUI/src/com/android/systemui/screenshot/scroll/LongScreenshotActivity.java
index 1e1a577..706ac9c 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/scroll/LongScreenshotActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/scroll/LongScreenshotActivity.java
@@ -335,8 +335,8 @@
             // TODO: Fix transition for work profile. Omitting it in the meantime.
             mActionExecutor.launchIntentAsync(
                     ActionIntentCreator.INSTANCE.createEdit(uri, this),
-                    null,
-                    mScreenshotUserHandle, false);
+                    mScreenshotUserHandle, false,
+                    /* activityOptions */ null, /* transitionCoordinator */ null);
         } else {
             String editorPackage = getString(R.string.config_screenshotEditor);
             Intent intent = new Intent(Intent.ACTION_EDIT);
@@ -363,7 +363,8 @@
 
     private void doShare(Uri uri) {
         Intent shareIntent = ActionIntentCreator.INSTANCE.createShare(uri);
-        mActionExecutor.launchIntentAsync(shareIntent, null, mScreenshotUserHandle, false);
+        mActionExecutor.launchIntentAsync(shareIntent, mScreenshotUserHandle, false,
+                /* activityOptions */ null, /* transitionCoordinator */ null);
     }
 
     private void onClicked(View v) {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/scroll/ScrollCaptureExecutor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/scroll/ScrollCaptureExecutor.kt
new file mode 100644
index 0000000..6c4ee3e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/scroll/ScrollCaptureExecutor.kt
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.screenshot.scroll
+
+import android.app.ActivityManager
+import android.graphics.Rect
+import android.os.IBinder
+import android.util.Log
+import android.view.ScrollCaptureResponse
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.screenshot.scroll.ScrollCaptureController.LongScreenshot
+import com.google.common.util.concurrent.ListenableFuture
+import java.util.concurrent.ExecutionException
+import java.util.concurrent.Executor
+import java.util.concurrent.Future
+import javax.inject.Inject
+
+class ScrollCaptureExecutor
+@Inject
+constructor(
+    activityManager: ActivityManager,
+    private val scrollCaptureClient: ScrollCaptureClient,
+    private val scrollCaptureController: ScrollCaptureController,
+    private val longScreenshotHolder: LongScreenshotData,
+    @Main private val mainExecutor: Executor
+) {
+    private val isLowRamDevice = activityManager.isLowRamDevice
+    private var lastScrollCaptureRequest: ListenableFuture<ScrollCaptureResponse>? = null
+    private var lastScrollCaptureResponse: ScrollCaptureResponse? = null
+    private var longScreenshotFuture: ListenableFuture<LongScreenshot>? = null
+
+    fun requestScrollCapture(
+        displayId: Int,
+        token: IBinder,
+        callback: (ScrollCaptureResponse) -> Unit
+    ) {
+        if (!allowLongScreenshots()) {
+            Log.d(TAG, "Long screenshots not supported on this device")
+            return
+        }
+        scrollCaptureClient.setHostWindowToken(token)
+        lastScrollCaptureRequest?.cancel(true)
+        val scrollRequest =
+            scrollCaptureClient.request(displayId).apply {
+                addListener(
+                    { onScrollCaptureResponseReady(this)?.let { callback.invoke(it) } },
+                    mainExecutor
+                )
+            }
+        lastScrollCaptureRequest = scrollRequest
+    }
+
+    fun interface ScrollTransitionReady {
+        fun onTransitionReady(
+            destRect: Rect,
+            onTransitionEnd: Runnable,
+            longScreenshot: LongScreenshot
+        )
+    }
+
+    fun executeBatchScrollCapture(
+        response: ScrollCaptureResponse,
+        onCaptureComplete: Runnable,
+        onFailure: Runnable,
+        transition: ScrollTransitionReady,
+    ) {
+        // Clear the reference to prevent close() on reset
+        lastScrollCaptureResponse = null
+        longScreenshotFuture?.cancel(true)
+        longScreenshotFuture =
+            scrollCaptureController.run(response).apply {
+                addListener(
+                    {
+                        getLongScreenshotChecked(this, onFailure)?.let {
+                            longScreenshotHolder.setLongScreenshot(it)
+                            longScreenshotHolder.setTransitionDestinationCallback {
+                                destinationRect: Rect,
+                                onTransitionEnd: Runnable ->
+                                transition.onTransitionReady(destinationRect, onTransitionEnd, it)
+                            }
+                            onCaptureComplete.run()
+                        }
+                    },
+                    mainExecutor
+                )
+            }
+    }
+
+    fun close() {
+        lastScrollCaptureRequest?.cancel(true)
+        lastScrollCaptureRequest = null
+        lastScrollCaptureResponse?.close()
+        lastScrollCaptureResponse = null
+        longScreenshotFuture?.cancel(true)
+    }
+
+    private fun getLongScreenshotChecked(
+        future: ListenableFuture<LongScreenshot>,
+        onFailure: Runnable
+    ): LongScreenshot? {
+        var longScreenshot: LongScreenshot? = null
+        runCatching { longScreenshot = future.get() }
+            .onFailure {
+                Log.e(TAG, "Caught exception", it)
+                onFailure.run()
+                return null
+            }
+        if (longScreenshot?.height != 0) {
+            return longScreenshot
+        }
+        onFailure.run()
+        return null
+    }
+
+    private fun onScrollCaptureResponseReady(
+        responseFuture: Future<ScrollCaptureResponse>
+    ): ScrollCaptureResponse? {
+        try {
+            lastScrollCaptureResponse?.close()
+            lastScrollCaptureResponse = null
+            if (responseFuture.isCancelled) {
+                return null
+            }
+            val captureResponse = responseFuture.get().apply { lastScrollCaptureResponse = this }
+            if (!captureResponse.isConnected) {
+                // No connection means that the target window wasn't found
+                // or that it cannot support scroll capture.
+                Log.d(
+                    TAG,
+                    "ScrollCapture: ${captureResponse.description} [${captureResponse.windowTitle}]"
+                )
+                return null
+            }
+            Log.d(TAG, "ScrollCapture: connected to window [${captureResponse.windowTitle}]")
+            return captureResponse
+        } catch (e: InterruptedException) {
+            Log.e(TAG, "requestScrollCapture interrupted", e)
+        } catch (e: ExecutionException) {
+            Log.e(TAG, "requestScrollCapture failed", e)
+        }
+        return null
+    }
+
+    private fun allowLongScreenshots(): Boolean {
+        return !isLowRamDevice
+    }
+
+    private companion object {
+        private const val TAG = "ScrollCaptureExecutor"
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ActionButtonViewBinder.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ActionButtonViewBinder.kt
index c7fe3f6..3c5a0ec 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ActionButtonViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ActionButtonViewBinder.kt
@@ -28,15 +28,16 @@
     fun bind(view: View, viewModel: ActionButtonViewModel) {
         val iconView = view.requireViewById<ImageView>(R.id.overlay_action_chip_icon)
         val textView = view.requireViewById<TextView>(R.id.overlay_action_chip_text)
-        iconView.setImageDrawable(viewModel.icon)
-        textView.text = viewModel.name
-        setMargins(iconView, textView, viewModel.name?.isNotEmpty() ?: false)
+        iconView.setImageDrawable(viewModel.appearance.icon)
+        textView.text = viewModel.appearance.label
+        setMargins(iconView, textView, viewModel.appearance.label?.isNotEmpty() ?: false)
         if (viewModel.onClicked != null) {
             view.setOnClickListener { viewModel.onClicked.invoke() }
         } else {
             view.setOnClickListener(null)
         }
-        view.contentDescription = viewModel.description
+        view.tag = viewModel.id
+        view.contentDescription = viewModel.appearance.description
         view.visibility = View.VISIBLE
         view.alpha = 1f
     }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt
index d878200..32e9296 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt
@@ -60,7 +60,7 @@
                     }
                     launch {
                         viewModel.previewAction.collect { onClick ->
-                            previewView.setOnClickListener { onClick?.run() }
+                            previewView.setOnClickListener { onClick?.invoke() }
                         }
                     }
                     launch {
@@ -70,21 +70,36 @@
                                     .requireViewById<View>(R.id.actions_container_background)
                                     .visibility = View.VISIBLE
                             }
-                            val viewPool = actionsContainer.children.toList()
-                            actionsContainer.removeAllViews()
-                            val actionButtons =
-                                List(actions.size) {
-                                    viewPool.getOrElse(it) {
+
+                            // Remove any buttons not in the new list, then do another pass to add
+                            // any new actions and update any that are already there.
+                            // This assumes that actions can never change order and that each action
+                            // ID is unique.
+                            val newIds = actions.map { it.id }
+
+                            for (view in actionsContainer.children.toList()) {
+                                if (view.tag !in newIds) {
+                                    actionsContainer.removeView(view)
+                                }
+                            }
+
+                            for ((index, action) in actions.withIndex()) {
+                                val currentView: View? = actionsContainer.getChildAt(index)
+                                if (action.id == currentView?.tag) {
+                                    // Same ID, update the display
+                                    ActionButtonViewBinder.bind(currentView, action)
+                                } else {
+                                    // Different ID. Removals have already happened so this must
+                                    // mean that the new action must be inserted here.
+                                    val actionButton =
                                         layoutInflater.inflate(
                                             R.layout.overlay_action_chip,
                                             actionsContainer,
                                             false
                                         )
-                                    }
+                                    actionsContainer.addView(actionButton, index)
+                                    ActionButtonViewBinder.bind(actionButton, action)
                                 }
-                            actionButtons.zip(actions).forEach {
-                                actionsContainer.addView(it.first)
-                                ActionButtonViewBinder.bind(it.first, it.second)
                             }
                         }
                     }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ActionButtonAppearance.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ActionButtonAppearance.kt
new file mode 100644
index 0000000..55a2ad2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ActionButtonAppearance.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.screenshot.ui.viewmodel
+
+import android.graphics.drawable.Drawable
+
+/** Data describing how an action should be shown to the user. */
+data class ActionButtonAppearance(
+    val icon: Drawable?,
+    val label: CharSequence?,
+    val description: CharSequence,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ActionButtonViewModel.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ActionButtonViewModel.kt
index 05bfed1..64b0105 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ActionButtonViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ActionButtonViewModel.kt
@@ -16,11 +16,19 @@
 
 package com.android.systemui.screenshot.ui.viewmodel
 
-import android.graphics.drawable.Drawable
-
 data class ActionButtonViewModel(
-    val icon: Drawable?,
-    val name: CharSequence?,
-    val description: CharSequence,
-    val onClicked: (() -> Unit)?
-)
+    val appearance: ActionButtonAppearance,
+    val id: Int,
+    val onClicked: (() -> Unit)?,
+) {
+    companion object {
+        private var nextId = 0
+
+        private fun getId() = nextId.also { nextId += 1 }
+
+        fun withNextId(
+            appearance: ActionButtonAppearance,
+            onClicked: (() -> Unit)?
+        ): ActionButtonViewModel = ActionButtonViewModel(appearance, getId(), onClicked)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ScreenshotViewModel.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ScreenshotViewModel.kt
index dc61d1e..fa34803 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ScreenshotViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ScreenshotViewModel.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.screenshot.ui.viewmodel
 
 import android.graphics.Bitmap
+import android.util.Log
 import android.view.accessibility.AccessibilityManager
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
@@ -24,8 +25,8 @@
 class ScreenshotViewModel(private val accessibilityManager: AccessibilityManager) {
     private val _preview = MutableStateFlow<Bitmap?>(null)
     val preview: StateFlow<Bitmap?> = _preview
-    private val _previewAction = MutableStateFlow<Runnable?>(null)
-    val previewAction: StateFlow<Runnable?> = _previewAction
+    private val _previewAction = MutableStateFlow<(() -> Unit)?>(null)
+    val previewAction: StateFlow<(() -> Unit)?> = _previewAction
     private val _actions = MutableStateFlow(emptyList<ActionButtonViewModel>())
     val actions: StateFlow<List<ActionButtonViewModel>> = _actions
     val showDismissButton: Boolean
@@ -35,14 +36,38 @@
         _preview.value = bitmap
     }
 
-    fun setPreviewAction(runnable: Runnable) {
-        _previewAction.value = runnable
+    fun setPreviewAction(onClick: () -> Unit) {
+        _previewAction.value = onClick
     }
 
-    fun addActions(actions: List<ActionButtonViewModel>) {
+    fun addAction(actionAppearance: ActionButtonAppearance, onClicked: (() -> Unit)): Int {
         val actionList = _actions.value.toMutableList()
-        actionList.addAll(actions)
+        val action = ActionButtonViewModel.withNextId(actionAppearance, onClicked)
+        actionList.add(action)
         _actions.value = actionList
+        return action.id
+    }
+
+    fun updateActionAppearance(actionId: Int, appearance: ActionButtonAppearance) {
+        val actionList = _actions.value.toMutableList()
+        val index = actionList.indexOfFirst { it.id == actionId }
+        if (index >= 0) {
+            actionList[index] =
+                ActionButtonViewModel(appearance, actionId, actionList[index].onClicked)
+            _actions.value = actionList
+        } else {
+            Log.w(TAG, "Attempted to update unknown action id $actionId")
+        }
+    }
+
+    fun removeAction(actionId: Int) {
+        val actionList = _actions.value.toMutableList()
+        if (actionList.removeIf { it.id == actionId }) {
+            // Update if something was removed.
+            _actions.value = actionList
+        } else {
+            Log.w(TAG, "Attempted to remove unknown action id $actionId")
+        }
     }
 
     fun reset() {
@@ -50,4 +75,8 @@
         _previewAction.value = null
         _actions.value = listOf()
     }
+
+    companion object {
+        const val TAG = "ScreenshotViewModel"
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
index 92d6ec97..8397d9f 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java
@@ -52,7 +52,6 @@
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.settings.DisplayTracker;
 import com.android.systemui.settings.UserTracker;
-import com.android.systemui.statusbar.policy.BrightnessMirrorController;
 import com.android.systemui.util.settings.SecureSettings;
 
 import dagger.assisted.Assisted;
@@ -107,7 +106,7 @@
     private ValueAnimator mSliderAnimator;
 
     @Override
-    public void setMirror(BrightnessMirrorController controller) {
+    public void setMirror(@Nullable MirrorController controller) {
         mControl.setMirrorControllerAndMirror(controller);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessMirrorHandler.kt b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessMirrorHandler.kt
index 701d814..073279b 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessMirrorHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessMirrorHandler.kt
@@ -16,12 +16,9 @@
 
 package com.android.systemui.settings.brightness
 
-import com.android.systemui.statusbar.policy.BrightnessMirrorController
-import com.android.systemui.statusbar.policy.BrightnessMirrorController.BrightnessMirrorListener
-
 class BrightnessMirrorHandler(brightnessController: MirroredBrightnessController) {
 
-    var mirrorController: BrightnessMirrorController? = null
+    var mirrorController: MirrorController? = null
         private set
 
     var brightnessController: MirroredBrightnessController = brightnessController
@@ -30,7 +27,8 @@
             updateBrightnessMirror()
         }
 
-    private val brightnessMirrorListener = BrightnessMirrorListener { updateBrightnessMirror() }
+    private val brightnessMirrorListener =
+            MirrorController.BrightnessMirrorListener { updateBrightnessMirror() }
 
     fun onQsPanelAttached() {
         mirrorController?.addCallback(brightnessMirrorListener)
@@ -40,7 +38,7 @@
         mirrorController?.removeCallback(brightnessMirrorListener)
     }
 
-    fun setController(controller: BrightnessMirrorController?) {
+    fun setController(controller: MirrorController?) {
         mirrorController?.removeCallback(brightnessMirrorListener)
         mirrorController = controller
         mirrorController?.addCallback(brightnessMirrorListener)
@@ -48,6 +46,6 @@
     }
 
     private fun updateBrightnessMirror() {
-        mirrorController?.let { brightnessController.setMirror(it) }
+        brightnessController.setMirror(mirrorController)
     }
 }
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java
index 539b0c2..b425fb9 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java
@@ -57,8 +57,10 @@
         ToggleSlider {
 
     private Listener mListener;
+    @Nullable
     private ToggleSlider mMirror;
-    private BrightnessMirrorController mMirrorController;
+    @Nullable
+    private MirrorController mMirrorController;
     private boolean mTracking;
     private final FalsingManager mFalsingManager;
     private final UiEventLogger mUiEventLogger;
@@ -108,6 +110,9 @@
     protected void onViewAttached() {
         mView.setOnSeekBarChangeListener(mSeekListener);
         mView.setOnInterceptListener(mOnInterceptListener);
+        if (mMirror != null) {
+            mView.setOnDispatchTouchEventListener(this::mirrorTouchEvent);
+        }
     }
 
     @Override
@@ -129,7 +134,10 @@
 
     private boolean copyEventToMirror(MotionEvent ev) {
         MotionEvent copy = ev.copy();
-        boolean out = mMirror.mirrorTouchEvent(copy);
+        boolean out = false;
+        if (mMirror != null) {
+            out = mMirror.mirrorTouchEvent(copy);
+        }
         copy.recycle();
         return out;
     }
@@ -166,9 +174,13 @@
      * @param c
      */
     @Override
-    public void setMirrorControllerAndMirror(BrightnessMirrorController c) {
+    public void setMirrorControllerAndMirror(@Nullable MirrorController c) {
         mMirrorController = c;
-        setMirror(c.getToggleSlider());
+        if (c != null) {
+            setMirror(c.getToggleSlider());
+        } else {
+            setMirror(null);
+        }
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/MirrorController.kt b/packages/SystemUI/src/com/android/systemui/settings/brightness/MirrorController.kt
new file mode 100644
index 0000000..6a9af26
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/MirrorController.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.settings.brightness
+
+import android.view.View
+import com.android.systemui.settings.brightness.MirrorController.BrightnessMirrorListener
+import com.android.systemui.statusbar.policy.CallbackController
+
+interface MirrorController : CallbackController<BrightnessMirrorListener> {
+
+    /**
+     * Get the [ToggleSlider] currently associated with this controller, or `null` if none currently
+     */
+    fun getToggleSlider(): ToggleSlider?
+
+    /**
+     * Indicate to this controller that the user is dragging on the brightness view and the mirror
+     * should show
+     */
+    fun showMirror()
+
+    /**
+     * Indicate to this controller that the user has stopped dragging on the brightness view and the
+     * mirror should hide
+     */
+    fun hideMirror()
+
+    /**
+     * Set the location and size of the current brightness [view] in QS so it can be properly
+     * adapted to show the mirror in the same location and with the same size.
+     */
+    fun setLocationAndSize(view: View)
+
+    fun interface BrightnessMirrorListener {
+        fun onBrightnessMirrorReinflated(brightnessMirror: View?)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/MirroredBrightnessController.kt b/packages/SystemUI/src/com/android/systemui/settings/brightness/MirroredBrightnessController.kt
index 8d857de..b1a532b 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/MirroredBrightnessController.kt
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/MirroredBrightnessController.kt
@@ -22,5 +22,5 @@
  * Indicates controller that has brightness slider and uses [BrightnessMirrorController]
  */
 interface MirroredBrightnessController {
-    fun setMirror(controller: BrightnessMirrorController)
+    fun setMirror(controller: MirrorController?)
 }
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java
index 648e33b..24bc670 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java
@@ -19,7 +19,6 @@
 import android.view.MotionEvent;
 
 import com.android.settingslib.RestrictedLockUtils;
-import com.android.systemui.statusbar.policy.BrightnessMirrorController;
 
 public interface ToggleSlider {
     interface Listener {
@@ -27,7 +26,7 @@
     }
 
     void setEnforcedAdmin(RestrictedLockUtils.EnforcedAdmin admin);
-    void setMirrorControllerAndMirror(BrightnessMirrorController c);
+    void setMirrorControllerAndMirror(MirrorController c);
     boolean mirrorTouchEvent(MotionEvent ev);
 
     void setOnChangedListener(Listener l);
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/data/repository/BrightnessMirrorShowingRepository.kt b/packages/SystemUI/src/com/android/systemui/settings/brightness/data/repository/BrightnessMirrorShowingRepository.kt
new file mode 100644
index 0000000..a0c9be4
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/data/repository/BrightnessMirrorShowingRepository.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.settings.brightness.data.repository
+
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+
+@SysUISingleton
+class BrightnessMirrorShowingRepository @Inject constructor() {
+    private val _isShowing = MutableStateFlow(false)
+    val isShowing = _isShowing.asStateFlow()
+
+    fun setMirrorShowing(showing: Boolean) {
+        _isShowing.value = showing
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/domain/interactor/BrightnessMirrorShowingInteractor.kt b/packages/SystemUI/src/com/android/systemui/settings/brightness/domain/interactor/BrightnessMirrorShowingInteractor.kt
new file mode 100644
index 0000000..ef6e72f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/domain/interactor/BrightnessMirrorShowingInteractor.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.settings.brightness.domain.interactor
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.settings.brightness.data.repository.BrightnessMirrorShowingRepository
+import javax.inject.Inject
+
+@SysUISingleton
+class BrightnessMirrorShowingInteractor
+@Inject
+constructor(
+    private val brightnessMirrorShowingRepository: BrightnessMirrorShowingRepository,
+) {
+    val isShowing = brightnessMirrorShowingRepository.isShowing
+
+    fun setMirrorShowing(showing: Boolean) {
+        brightnessMirrorShowingRepository.setMirrorShowing(showing)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/ui/binder/BrightnessMirrorInflater.kt b/packages/SystemUI/src/com/android/systemui/settings/brightness/ui/binder/BrightnessMirrorInflater.kt
new file mode 100644
index 0000000..468a873
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/ui/binder/BrightnessMirrorInflater.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.settings.brightness.ui.binder
+
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.view.isVisible
+import com.android.systemui.res.R
+import com.android.systemui.settings.brightness.BrightnessSliderController
+
+object BrightnessMirrorInflater {
+
+    fun inflate(
+        context: Context,
+        sliderControllerFactory: BrightnessSliderController.Factory,
+    ): Pair<View, BrightnessSliderController> {
+        val frame =
+            (LayoutInflater.from(context).inflate(R.layout.brightness_mirror_container, null)
+                    as ViewGroup)
+                .apply { isVisible = true }
+        val sliderController = sliderControllerFactory.create(context, frame)
+        sliderController.init()
+        frame.addView(
+            sliderController.rootView,
+            ViewGroup.LayoutParams.MATCH_PARENT,
+            ViewGroup.LayoutParams.WRAP_CONTENT
+        )
+        return frame to sliderController
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/ui/viewModel/BrightnessMirrorViewModel.kt b/packages/SystemUI/src/com/android/systemui/settings/brightness/ui/viewModel/BrightnessMirrorViewModel.kt
new file mode 100644
index 0000000..2651a994
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/ui/viewModel/BrightnessMirrorViewModel.kt
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.settings.brightness.ui.viewModel
+
+import android.content.res.Resources
+import android.view.View
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.res.R
+import com.android.systemui.settings.brightness.BrightnessSliderController
+import com.android.systemui.settings.brightness.MirrorController
+import com.android.systemui.settings.brightness.ToggleSlider
+import com.android.systemui.settings.brightness.domain.interactor.BrightnessMirrorShowingInteractor
+import javax.inject.Inject
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+
+@SysUISingleton
+class BrightnessMirrorViewModel
+@Inject
+constructor(
+    private val brightnessMirrorShowingInteractor: BrightnessMirrorShowingInteractor,
+    @Main private val resources: Resources,
+    val sliderControllerFactory: BrightnessSliderController.Factory,
+) : MirrorController {
+
+    private val tempPosition = IntArray(2)
+
+    private var _toggleSlider: BrightnessSliderController? = null
+
+    val isShowing = brightnessMirrorShowingInteractor.isShowing
+
+    private val _locationAndSize: MutableStateFlow<LocationAndSize> =
+        MutableStateFlow(LocationAndSize())
+    val locationAndSize = _locationAndSize.asStateFlow()
+
+    override fun getToggleSlider(): ToggleSlider? {
+        return _toggleSlider
+    }
+
+    fun setToggleSlider(toggleSlider: BrightnessSliderController) {
+        _toggleSlider = toggleSlider
+    }
+
+    override fun showMirror() {
+        brightnessMirrorShowingInteractor.setMirrorShowing(true)
+    }
+
+    override fun hideMirror() {
+        brightnessMirrorShowingInteractor.setMirrorShowing(false)
+    }
+
+    override fun setLocationAndSize(view: View) {
+        view.getLocationInWindow(tempPosition)
+        val padding = resources.getDimensionPixelSize(R.dimen.rounded_slider_background_padding)
+        _toggleSlider?.rootView?.setPadding(padding, padding, padding, padding)
+        // Account for desired padding
+        _locationAndSize.value =
+            LocationAndSize(
+                yOffset = tempPosition[1] - padding,
+                width = view.measuredWidth + 2 * padding,
+                height = view.measuredHeight + 2 * padding,
+            )
+    }
+
+    // Callbacks are used for indicating reinflation when the config changes in some ways (like
+    // density). However, we don't need that as we recompose the view anyway
+    override fun addCallback(listener: MirrorController.BrightnessMirrorListener) {}
+
+    override fun removeCallback(listener: MirrorController.BrightnessMirrorListener) {}
+}
+
+data class LocationAndSize(
+    val yOffset: Int = 0,
+    val width: Int = 0,
+    val height: Int = 0,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/shade/BaseShadeControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/BaseShadeControllerImpl.kt
index f71a401d..2fdcaa5 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/BaseShadeControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/BaseShadeControllerImpl.kt
@@ -17,8 +17,6 @@
 package com.android.systemui.shade
 
 import com.android.systemui.assist.AssistManager
-import com.android.systemui.log.LogBuffer
-import com.android.systemui.shade.TouchLogger.Companion.logTouchesTo
 import com.android.systemui.statusbar.CommandQueue
 import com.android.systemui.statusbar.NotificationPresenter
 import com.android.systemui.statusbar.NotificationShadeWindowController
@@ -29,7 +27,6 @@
 /** A base class for non-empty implementations of ShadeController. */
 @OptIn(ExperimentalCoroutinesApi::class)
 abstract class BaseShadeControllerImpl(
-    private val touchLog: LogBuffer,
     protected val commandQueue: CommandQueue,
     protected val statusBarKeyguardViewManager: StatusBarKeyguardViewManager,
     protected val notificationShadeWindowController: NotificationShadeWindowController,
@@ -40,7 +37,7 @@
     private val postCollapseActions = ArrayList<Runnable>()
 
     override fun start() {
-        logTouchesTo(touchLog)
+        // Do nothing by default
     }
 
     final override fun animateExpandShade() {
diff --git a/packages/SystemUI/src/com/android/systemui/shade/DebugDrawable.java b/packages/SystemUI/src/com/android/systemui/shade/DebugDrawable.java
index c42fdf8..b24edd9 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/DebugDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/DebugDrawable.java
@@ -25,6 +25,7 @@
 import android.graphics.drawable.Drawable;
 
 import com.android.keyguard.LockIconViewController;
+import com.android.systemui.scene.shared.flag.SceneContainerFlag;
 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
 
 import java.util.HashSet;
@@ -80,12 +81,14 @@
                         mNotificationPanelViewController.getClockPositionResult()
                                 .stackScrollerPadding),
                 Color.YELLOW, "calculatePanelHeightShade()");
-        drawDebugInfo(canvas,
-                (int) mQsController.calculateNotificationsTopPadding(
-                        mNotificationPanelViewController.isExpandingOrCollapsing(),
-                        mNotificationPanelViewController.getKeyguardNotificationStaticPadding(),
-                        mNotificationPanelViewController.getExpandedFraction()),
-                Color.MAGENTA, "calculateNotificationsTopPadding()");
+        if (!SceneContainerFlag.isEnabled()) {
+            drawDebugInfo(canvas,
+                    (int) mQsController.calculateNotificationsTopPadding(
+                            mNotificationPanelViewController.isExpandingOrCollapsing(),
+                            mNotificationPanelViewController.getKeyguardNotificationStaticPadding(),
+                            mNotificationPanelViewController.getExpandedFraction()),
+                    Color.MAGENTA, "calculateNotificationsTopPadding()");
+        }
         drawDebugInfo(canvas, mNotificationPanelViewController.getClockPositionResult().clockY,
                 Color.GRAY, "mClockPositionResult.clockY");
         drawDebugInfo(canvas, (int) mLockIconViewController.getTop(), Color.GRAY,
diff --git a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
index 3169e9c..f6b1bcc 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
@@ -26,12 +26,15 @@
 import androidx.compose.ui.platform.ComposeView
 import com.android.compose.theme.PlatformTheme
 import com.android.internal.annotations.VisibleForTesting
+import com.android.systemui.communal.dagger.Communal
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.communal.ui.compose.CommunalContainer
 import com.android.systemui.communal.ui.viewmodel.CommunalViewModel
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.res.R
+import com.android.systemui.scene.shared.model.SceneDataSourceDelegator
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.statusbar.phone.SystemUIDialogFactory
 import com.android.systemui.util.kotlin.collectFlow
@@ -50,8 +53,10 @@
     private val communalViewModel: CommunalViewModel,
     private val dialogFactory: SystemUIDialogFactory,
     private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
+    private val keyguardInteractor: KeyguardInteractor,
     private val shadeInteractor: ShadeInteractor,
     private val powerManager: PowerManager,
+    @Communal private val dataSourceDelegator: SceneDataSourceDelegator,
 ) {
     /** The container view for the hub. This will not be initialized until [initView] is called. */
     private var communalContainerView: View? = null
@@ -86,6 +91,9 @@
     /** True if we are currently tracking a touch on the hub while it's open. */
     private var isTrackingHubTouch = false
 
+    /** True if we are tracking a top or bottom swipe gesture while the hub is open. */
+    private var isTrackingHubGesture = false
+
     /**
      * True if the hub UI is fully open, meaning it should receive touch input.
      *
@@ -108,6 +116,16 @@
      */
     private var shadeShowing = false
 
+    /**
+     * True if the device is dreaming, in which case we shouldn't do anything for top/bottom swipes
+     * and just let the dream overlay's touch handling deal with them.
+     *
+     * Tracks [KeyguardInteractor.isDreaming].
+     *
+     * TODO(b/328838259): figure out a proper solution for touch handling above the lock screen too
+     */
+    private var isDreaming = false
+
     /** Returns a flow that tracks whether communal hub is available. */
     fun communalAvailable(): Flow<Boolean> = communalInteractor.isCommunalAvailable
 
@@ -125,6 +143,7 @@
                     PlatformTheme {
                         CommunalContainer(
                             viewModel = communalViewModel,
+                            dataSourceDelegator = dataSourceDelegator,
                             dialogFactory = dialogFactory,
                         )
                     }
@@ -162,6 +181,7 @@
         )
         collectFlow(containerView, communalInteractor.isCommunalShowing, { hubShowing = it })
         collectFlow(containerView, shadeInteractor.isAnyFullyExpanded, { shadeShowing = it })
+        collectFlow(containerView, keyguardInteractor.isDreaming, { isDreaming = it })
 
         communalContainerView = containerView
 
@@ -190,61 +210,86 @@
     }
 
     private fun handleTouchEventOnCommunalView(view: View, ev: MotionEvent): Boolean {
+        // If the hub is fully visible, send all touch events to it, other than top and bottom edge
+        // swipes.
+        return if (hubShowing) {
+            handleHubOpenTouch(view, ev)
+        } else {
+            handleHubClosedTouch(view, ev)
+        }
+    }
+
+    private fun handleHubOpenTouch(view: View, ev: MotionEvent): Boolean {
         val isDown = ev.actionMasked == MotionEvent.ACTION_DOWN
         val isUp = ev.actionMasked == MotionEvent.ACTION_UP
         val isCancel = ev.actionMasked == MotionEvent.ACTION_CANCEL
 
-        // TODO(b/315207481): also account for opening animations of shade/bouncer and not just
-        //  fully showing state
         val hubOccluded = anyBouncerShowing || shadeShowing
 
-        // If the hub is fully visible, send all touch events to it, other than top and bottom edge
-        // swipes.
-        if (hubShowing && isDown) {
+        if (isDown && !hubOccluded) {
+            // Only intercept down events if the hub isn't occluded by the bouncer or
+            // notification shade.
             val y = ev.rawY
             val topSwipe: Boolean = y <= topEdgeSwipeRegionWidth
             val bottomSwipe = y >= view.height - bottomEdgeSwipeRegionWidth
 
             if (topSwipe || bottomSwipe) {
-                // Don't intercept touches at the top/bottom edge so that swipes can open the
-                // notification shade and bouncer.
-                return false
-            }
-
-            if (!hubOccluded) {
+                isTrackingHubGesture = true
+            } else {
                 isTrackingHubTouch = true
-                dispatchTouchEvent(view, ev)
-                // Return true regardless of dispatch result as some touches at the start of a
-                // gesture may return false from dispatchTouchEvent.
-                return true
             }
-        } else if (isTrackingHubTouch) {
+        }
+
+        if (isTrackingHubTouch) {
+            // Tracking a touch on the hub UI itself.
             if (isUp || isCancel) {
                 isTrackingHubTouch = false
             }
             dispatchTouchEvent(view, ev)
-            // Return true regardless of dispatch result as some touches at the start of a gesture
+            // Return true regardless of dispatch result as some touches at the start of a
+            // gesture
             // may return false from dispatchTouchEvent.
             return true
+        } else if (isTrackingHubGesture) {
+            // Tracking a top or bottom swipe on the hub UI.
+            if (isUp || isCancel) {
+                isTrackingHubGesture = false
+            }
+
+            // If we're dreaming, intercept touches so the hub UI doesn't receive them, but
+            // don't do anything so that the dream's touch handling takes care of opening
+            // the bouncer or shade.
+            //
+            // If we're not dreaming, we don't intercept touches at the top/bottom edge so that
+            // swipes can open the notification shade and bouncer.
+            return isDreaming
         }
 
+        return false
+    }
+
+    private fun handleHubClosedTouch(view: View, ev: MotionEvent): Boolean {
+        val isDown = ev.actionMasked == MotionEvent.ACTION_DOWN
+        val isUp = ev.actionMasked == MotionEvent.ACTION_UP
+        val isCancel = ev.actionMasked == MotionEvent.ACTION_CANCEL
+
+        val hubOccluded = anyBouncerShowing || shadeShowing
+
         if (rightEdgeSwipeRegionWidth == 0) {
             // If the edge region width has not been read yet for whatever reason, don't bother
             // intercepting touches to open the hub.
             return false
         }
 
-        if (!isTrackingOpenGesture && isDown) {
+        if (isDown && !hubOccluded) {
             val x = ev.rawX
             val inOpeningSwipeRegion: Boolean = x >= view.width - rightEdgeSwipeRegionWidth
-            if (inOpeningSwipeRegion && !hubOccluded) {
+            if (inOpeningSwipeRegion) {
                 isTrackingOpenGesture = true
-                dispatchTouchEvent(view, ev)
-                // Return true regardless of dispatch result as some touches at the start of a
-                // gesture may return false from dispatchTouchEvent.
-                return true
             }
-        } else if (isTrackingOpenGesture) {
+        }
+
+        if (isTrackingOpenGesture) {
             if (isUp || isCancel) {
                 isTrackingOpenGesture = false
             }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelView.java
index c501d88..6bf5535 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelView.java
@@ -27,6 +27,8 @@
 import android.view.MotionEvent;
 import android.widget.FrameLayout;
 
+import com.android.systemui.scene.shared.flag.SceneContainerFlag;
+
 /** The shade view. */
 public final class NotificationPanelView extends FrameLayout {
     static final boolean DEBUG = false;
@@ -41,14 +43,20 @@
 
     public NotificationPanelView(Context context, AttributeSet attrs) {
         super(context, attrs);
-        setWillNotDraw(!DEBUG);
-        mAlphaPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
+        if (!SceneContainerFlag.isEnabled()) {
+            setWillNotDraw(!DEBUG);
+            mAlphaPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
 
-        setBackgroundColor(Color.TRANSPARENT);
+            setBackgroundColor(Color.TRANSPARENT);
+        }
     }
 
     @Override
     public void onRtlPropertiesChanged(int layoutDirection) {
+        if (SceneContainerFlag.isEnabled()) {
+            super.onRtlPropertiesChanged(layoutDirection);
+            return;
+        }
         if (mRtlChangeListener != null) {
             mRtlChangeListener.onRtlPropertielsChanged(layoutDirection);
         }
@@ -56,14 +64,19 @@
 
     @Override
     public boolean shouldDelayChildPressedState() {
+        if (SceneContainerFlag.isEnabled()) {
+            return super.shouldDelayChildPressedState();
+        }
         return true;
     }
 
     @Override
     protected void dispatchDraw(Canvas canvas) {
         super.dispatchDraw(canvas);
-        if (mCurrentPanelAlpha != 255) {
-            canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), mAlphaPaint);
+        if (!SceneContainerFlag.isEnabled()) {
+            if (mCurrentPanelAlpha != 255) {
+                canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), mAlphaPaint);
+            }
         }
     }
 
@@ -83,6 +96,9 @@
 
     @Override
     public boolean hasOverlappingRendering() {
+        if (SceneContainerFlag.isEnabled()) {
+            return super.hasOverlappingRendering();
+        }
         return !mDozing;
     }
 
@@ -102,6 +118,9 @@
 
     @Override
     public boolean onInterceptTouchEvent(MotionEvent event) {
+        if (SceneContainerFlag.isEnabled()) {
+            return super.onInterceptTouchEvent(event);
+        }
         return mTouchHandler.onInterceptTouchEvent(event);
     }
 
@@ -113,7 +132,9 @@
     @Override
     public void dispatchConfigurationChanged(Configuration newConfig) {
         super.dispatchConfigurationChanged(newConfig);
-        mOnConfigurationChangedListener.onConfigurationChanged(newConfig);
+        if (!SceneContainerFlag.isEnabled()) {
+            mOnConfigurationChangedListener.onConfigurationChanged(newConfig);
+        }
     }
 
     /** Callback for right-to-left setting changes. */
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index f928ccc..4660831 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -69,8 +69,6 @@
 import android.util.Log;
 import android.util.MathUtils;
 import android.view.HapticFeedbackConstants;
-import android.view.InputDevice;
-import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.VelocityTracker;
@@ -169,7 +167,6 @@
 import com.android.systemui.shade.data.repository.FlingInfo;
 import com.android.systemui.shade.data.repository.ShadeRepository;
 import com.android.systemui.shade.domain.interactor.ShadeAnimationInteractor;
-import com.android.systemui.shade.transition.ShadeTransitionController;
 import com.android.systemui.shared.system.QuickStepContract;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.GestureRecorder;
@@ -358,7 +355,6 @@
     private final QuickSettingsControllerImpl mQsController;
     private final NaturalScrollingSettingObserver mNaturalScrollingSettingObserver;
     private final TouchHandler mTouchHandler = new TouchHandler();
-    private final KeyHandler mKeyHandler = new KeyHandler();
 
     private long mDownTime;
     private boolean mTouchSlopExceededBeforeDown;
@@ -441,7 +437,7 @@
     private final FalsingManager mFalsingManager;
     private final FalsingCollector mFalsingCollector;
     private final ShadeHeadsUpTrackerImpl mShadeHeadsUpTracker = new ShadeHeadsUpTrackerImpl();
-    private final ShadeFoldAnimator mShadeFoldAnimator = new ShadeFoldAnimatorImpl();
+    private final ShadeFoldAnimatorImpl mShadeFoldAnimator = new ShadeFoldAnimatorImpl();
 
     private boolean mShowIconsWhenExpanded;
     private int mIndicationBottomPadding;
@@ -748,7 +744,6 @@
             NotificationListContainer notificationListContainer,
             NotificationStackSizeCalculator notificationStackSizeCalculator,
             UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
-            ShadeTransitionController shadeTransitionController,
             SystemClock systemClock,
             KeyguardBottomAreaViewModel keyguardBottomAreaViewModel,
             KeyguardBottomAreaInteractor keyguardBottomAreaInteractor,
@@ -777,6 +772,7 @@
             PowerInteractor powerInteractor,
             KeyguardClockPositionAlgorithm keyguardClockPositionAlgorithm,
             NaturalScrollingSettingObserver naturalScrollingSettingObserver) {
+        SceneContainerFlag.assertInLegacyMode();
         keyguardStateController.addCallback(new KeyguardStateController.Callback() {
             @Override
             public void onKeyguardFadingAwayChanged() {
@@ -820,7 +816,6 @@
 
         mView.addOnLayoutChangeListener(new ShadeLayoutChangeListener());
         mView.setOnTouchListener(getTouchHandler());
-        mView.setOnKeyListener(getKeyHandler());
         mView.setOnConfigurationChangedListener(config -> loadDimens());
 
         mResources = mView.getResources();
@@ -906,7 +901,6 @@
         mKeyguardBypassController = bypassController;
         mUpdateMonitor = keyguardUpdateMonitor;
         mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
-        shadeTransitionController.setShadeViewController(this);
         dynamicPrivacyController.addListener(this::onDynamicPrivacyChanged);
         quickSettingsController.setExpansionHeightListener(this::onQsSetExpansionHeightCalled);
         quickSettingsController.setQsStateUpdateListener(this::onQsStateUpdated);
@@ -1594,7 +1588,8 @@
      * @param forceClockUpdate Should the clock be updated even when not on keyguard
      */
     private void positionClockAndNotifications(boolean forceClockUpdate) {
-        boolean animate = mNotificationStackScrollLayoutController.isAddOrRemoveAnimationPending();
+        boolean animate = !SceneContainerFlag.isEnabled()
+                && mNotificationStackScrollLayoutController.isAddOrRemoveAnimationPending();
         int stackScrollerPadding;
         boolean onKeyguard = isKeyguardShowing();
 
@@ -1681,7 +1676,8 @@
                 mClockPositionResult.clockX, mClockPositionResult.clockY);
         }
 
-        boolean animate = mNotificationStackScrollLayoutController.isAddOrRemoveAnimationPending();
+        boolean animate = !SceneContainerFlag.isEnabled()
+                && mNotificationStackScrollLayoutController.isAddOrRemoveAnimationPending();
         boolean animateClock = (animate || mAnimateNextPositionUpdate) && shouldAnimateClockChange;
 
         if (!MigrateClocksToBlueprint.isEnabled()) {
@@ -2489,6 +2485,7 @@
 
     /** Returns the topPadding of notifications when on keyguard not respecting QS expansion. */
     int getKeyguardNotificationStaticPadding() {
+        SceneContainerFlag.assertInLegacyMode();
         if (!isKeyguardShowing()) {
             return 0;
         }
@@ -2530,12 +2527,14 @@
     }
 
     void requestScrollerTopPaddingUpdate(boolean animate) {
-        float padding = mQsController.calculateNotificationsTopPadding(mIsExpandingOrCollapsing,
-                getKeyguardNotificationStaticPadding(), mExpandedFraction);
-        if (MigrateClocksToBlueprint.isEnabled()) {
-            mSharedNotificationContainerInteractor.setTopPosition(padding);
-        } else {
-            mNotificationStackScrollLayoutController.updateTopPadding(padding, animate);
+        if (!SceneContainerFlag.isEnabled()) {
+            float padding = mQsController.calculateNotificationsTopPadding(mIsExpandingOrCollapsing,
+                    getKeyguardNotificationStaticPadding(), mExpandedFraction);
+            if (MigrateClocksToBlueprint.isEnabled()) {
+                mSharedNotificationContainerInteractor.setTopPosition(padding);
+            } else {
+                mNotificationStackScrollLayoutController.updateTopPadding(padding, animate);
+            }
         }
 
         if (isKeyguardShowing()
@@ -3180,6 +3179,7 @@
             }
             notifyExpandingFinished();
         }
+        // TODO(b/332732878): replace this call when scene container is enabled
         mNotificationStackScrollLayoutController.setAnimationsEnabled(!disabled);
     }
 
@@ -3317,19 +3317,19 @@
     }
 
     @Override
-    public ShadeFoldAnimator getShadeFoldAnimator() {
+    public ShadeFoldAnimatorImpl getShadeFoldAnimator() {
         return mShadeFoldAnimator;
     }
 
-    private final class ShadeFoldAnimatorImpl implements ShadeFoldAnimator {
+    @Deprecated
+    public final class ShadeFoldAnimatorImpl implements ShadeFoldAnimator {
         /** Updates the views to the initial state for the fold to AOD animation. */
         @Override
         public void prepareFoldToAodAnimation() {
-            if (MigrateClocksToBlueprint.isEnabled()) {
-                return;
+            if (!MigrateClocksToBlueprint.isEnabled()) {
+                // Force show AOD UI even if we are not locked
+                showAodUi();
             }
-            // Force show AOD UI even if we are not locked
-            showAodUi();
 
             // Move the content of the AOD all the way to the left
             // so we can animate to the initial position
@@ -3347,14 +3347,29 @@
          * @param cancelAction invoked when the animation is cancelled, before endAction.
          */
         @Override
-        public void startFoldToAodAnimation(Runnable startAction, Runnable endAction,
-                Runnable cancelAction) {
+        public void startFoldToAodAnimation(
+                Runnable startAction, Runnable endAction, Runnable cancelAction) {
             if (MigrateClocksToBlueprint.isEnabled()) {
                 return;
             }
+
+            buildViewAnimator(startAction, endAction, cancelAction)
+                    .setUpdateListener(anim -> mKeyguardStatusViewController
+                            .animateFoldToAod(anim.getAnimatedFraction()))
+                    .start();
+        }
+
+        /**
+         * Builds the default NPVC fold animator
+         *
+         * @deprecated Temporary stop-gap. Do not use outside of keyguard fold transition.
+         */
+        @Deprecated
+        public ViewPropertyAnimator buildViewAnimator(
+                Runnable startAction, Runnable endAction, Runnable cancelAction) {
             final ViewPropertyAnimator viewAnimator = mView.animate();
             viewAnimator.cancel();
-            viewAnimator
+            return viewAnimator
                     .translationX(0)
                     .alpha(1f)
                     .setDuration(ANIMATION_DURATION_FOLD_TO_AOD)
@@ -3377,19 +3392,12 @@
                             viewAnimator.setListener(null);
                             viewAnimator.setUpdateListener(null);
                         }
-                    })
-                    .setUpdateListener(anim ->
-                            mKeyguardStatusViewController.animateFoldToAod(
-                                    anim.getAnimatedFraction()))
-                    .start();
+                    });
         }
 
         /** Cancels fold to AOD transition and resets view state. */
         @Override
         public void cancelFoldToAodAnimation() {
-            if (MigrateClocksToBlueprint.isEnabled()) {
-                return;
-            }
             cancelAnimation();
             resetAlpha();
             resetTranslation();
@@ -3562,9 +3570,9 @@
     }
 
     @Override
-    public ViewPropertyAnimator fadeOut(long startDelayMs, long durationMs, Runnable endAction) {
+    public void fadeOut(long startDelayMs, long durationMs, Runnable endAction) {
         mView.animate().cancel();
-        return mView.animate().alpha(0).setStartDelay(startDelayMs).setDuration(
+        mView.animate().alpha(0).setStartDelay(startDelayMs).setDuration(
                 durationMs).setInterpolator(Interpolators.ALPHA_OUT).withLayer().withEndAction(
                 endAction);
     }
@@ -3592,16 +3600,6 @@
         return mTouchHandler;
     }
 
-    @VisibleForTesting
-    KeyHandler getKeyHandler() {
-        return mKeyHandler;
-    }
-
-    @Override
-    public void disableHeader(int state1, int state2, boolean animated) {
-        mShadeHeaderController.disable(state1, state2, animated);
-    }
-
     @Override
     public boolean closeUserSwitcherIfOpen() {
         if (mKeyguardUserSwitcherController != null) {
@@ -3971,7 +3969,9 @@
             mShadeRepository.setLegacyShadeExpansion(mExpandedFraction);
             mQsController.setShadeExpansion(mExpandedHeight, mExpandedFraction);
             mExpansionDragDownAmountPx = h;
-            mAmbientState.setExpansionFraction(mExpandedFraction);
+            if (!SceneContainerFlag.isEnabled()) {
+                mAmbientState.setExpansionFraction(mExpandedFraction);
+            }
             onHeightUpdated(mExpandedHeight);
             updateExpansionAndVisibility();
         });
@@ -4138,9 +4138,10 @@
 
     @Override
     public void updateExpansionAndVisibility() {
-        mShadeExpansionStateManager.onPanelExpansionChanged(
-                mExpandedFraction, isExpanded(), isTracking(), mExpansionDragDownAmountPx);
-
+        if (!SceneContainerFlag.isEnabled()) {
+            mShadeExpansionStateManager.onPanelExpansionChanged(
+                    mExpandedFraction, isExpanded(), isTracking());
+        }
         updateVisibility();
     }
 
@@ -4176,7 +4177,8 @@
     }
 
     /** Sends an external (e.g. Status Bar) intercept touch event to the Shade touch handler. */
-    boolean handleExternalInterceptTouch(MotionEvent event) {
+    @Override
+    public boolean handleExternalInterceptTouch(MotionEvent event) {
         try {
             mUseExternalTouch = true;
             return mTouchHandler.onInterceptTouchEvent(event);
@@ -4991,6 +4993,12 @@
                 return false;
             }
 
+            if (DeviceEntryUdfpsRefactor.isEnabled()
+                    && mAlternateBouncerInteractor.isVisibleState()) {
+                // never send touches to shade if the alternate bouncer is showing
+                return false;
+            }
+
             if (event.getAction() == MotionEvent.ACTION_DOWN) {
                 if (event.getDownTime() == mLastTouchDownTime) {
                     // An issue can occur when swiping down after unlock, where multiple down
@@ -5256,21 +5264,6 @@
         }
     }
 
-    /** Handles KeyEvents for the Shade. */
-    public final class KeyHandler implements View.OnKeyListener {
-        @Override
-        public boolean onKey(View v, int keyCode, KeyEvent event) {
-            if (event.getAction() == KeyEvent.ACTION_DOWN) {
-                final InputDevice d = event.getDevice();
-                // Trigger user activity if the event comes from a full external keyboard
-                if (d != null && d.isFullKeyboard() && d.isExternal()) {
-                    mCentralSurfaces.userActivity();
-                }
-            }
-            return false;
-        }
-    }
-
     private final class HeadsUpNotificationViewControllerImpl implements
             HeadsUpTouchHelper.HeadsUpNotificationViewController {
         @Override
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
index f7fed53..fb32b9f 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java
@@ -18,7 +18,6 @@
 
 import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
 import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_BEHAVIOR_CONTROLLED;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_OPTIMIZE_MEASURE;
 
 import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT;
@@ -290,12 +289,6 @@
         mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
         mLp.privateFlags |= PRIVATE_FLAG_OPTIMIZE_MEASURE;
 
-        // We use BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE here, however, there is special logic in
-        // window manager which disables the transient show behavior.
-        // TODO: Clean this up once that behavior moves into the Shell.
-        mLp.privateFlags |= PRIVATE_FLAG_BEHAVIOR_CONTROLLED;
-        mLp.insetsFlags.behavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
-
         if (mSceneContainerFlags.isEnabled()) {
             // This prevents the appearance and disappearance of the software keyboard (also known
             // as the "IME") from scrolling/panning the window to make room for the keyboard.
@@ -307,6 +300,14 @@
 
         mWindowManager.addView(mWindowRootView, mLp);
 
+        // We use BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE here, however, there is special logic in
+        // window manager which disables the transient show behavior.
+        // TODO: Clean this up once that behavior moves into the Shell.
+        if (mWindowRootView.getWindowInsetsController() != null) {
+            mWindowRootView.getWindowInsetsController().setSystemBarsBehavior(
+                    BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
+        }
+
         mLpChanged.copyFrom(mLp);
         onThemeChanged();
 
@@ -416,6 +417,12 @@
         } else {
             mLpChanged.flags &= ~LayoutParams.FLAG_SECURE;
         }
+
+        if (state.bouncerShowing) {
+            mLpChanged.inputFeatures |= LayoutParams.INPUT_FEATURE_SENSITIVE_FOR_TRACING;
+        } else {
+            mLpChanged.inputFeatures &= ~LayoutParams.INPUT_FEATURE_SENSITIVE_FOR_TRACING;
+        }
     }
 
     protected boolean isDebuggable() {
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java
index f9b4e67..903af61 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java
@@ -81,6 +81,8 @@
 
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
+        mInteractionEventHandler.collectKeyEvent(event);
+
         if (mInteractionEventHandler.interceptMediaKey(event)) {
             return true;
         }
@@ -301,6 +303,11 @@
         boolean dispatchKeyEvent(KeyEvent event);
 
         boolean dispatchKeyEventPreIme(KeyEvent event);
+
+        /**
+         * Collects the KeyEvent without intercepting it
+         */
+        void collectKeyEvent(KeyEvent event);
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
index e8e629c..6ac81d2 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
@@ -51,9 +51,8 @@
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
 import com.android.systemui.keyguard.shared.model.TransitionState;
 import com.android.systemui.keyguard.shared.model.TransitionStep;
-import com.android.systemui.keyguard.ui.binder.AlternateBouncerViewBinder;
-import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerDependencies;
 import com.android.systemui.res.R;
+import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor;
 import com.android.systemui.shared.animation.DisableSubpixelTextTransitionListener;
 import com.android.systemui.statusbar.DragDownHelper;
 import com.android.systemui.statusbar.LockscreenShadeTransitionController;
@@ -72,11 +71,8 @@
 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
 import com.android.systemui.statusbar.window.StatusBarWindowStateController;
 import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
-import com.android.systemui.util.kotlin.JavaAdapter;
 import com.android.systemui.util.time.SystemClock;
 
-import dagger.Lazy;
-
 import java.io.PrintWriter;
 import java.util.Optional;
 import java.util.function.Consumer;
@@ -137,7 +133,8 @@
     private DragDownHelper mDragDownHelper;
     private boolean mExpandingBelowNotch;
     private final DockManager mDockManager;
-    private final NotificationPanelViewController mNotificationPanelViewController;
+    private final ShadeViewController mShadeViewController;
+    private final PanelExpansionInteractor mPanelExpansionInteractor;
     private final ShadeExpansionStateManager mShadeExpansionStateManager;
 
     private boolean mIsTrackingBarGesture = false;
@@ -159,7 +156,8 @@
             DockManager dockManager,
             NotificationShadeDepthController depthController,
             NotificationShadeWindowView notificationShadeWindowView,
-            NotificationPanelViewController notificationPanelViewController,
+            ShadeViewController shadeViewController,
+            PanelExpansionInteractor panelExpansionInteractor,
             ShadeExpansionStateManager shadeExpansionStateManager,
             NotificationStackScrollLayoutController notificationStackScrollLayoutController,
             StatusBarKeyguardViewManager statusBarKeyguardViewManager,
@@ -186,15 +184,14 @@
             QuickSettingsController quickSettingsController,
             PrimaryBouncerInteractor primaryBouncerInteractor,
             AlternateBouncerInteractor alternateBouncerInteractor,
-            Lazy<JavaAdapter> javaAdapter,
-            Lazy<AlternateBouncerDependencies> alternateBouncerDependencies,
             BouncerViewBinder bouncerViewBinder) {
         mLockscreenShadeTransitionController = transitionController;
         mFalsingCollector = falsingCollector;
         mStatusBarStateController = statusBarStateController;
         mView = notificationShadeWindowView;
         mDockManager = dockManager;
-        mNotificationPanelViewController = notificationPanelViewController;
+        mShadeViewController = shadeViewController;
+        mPanelExpansionInteractor = panelExpansionInteractor;
         mShadeExpansionStateManager = shadeExpansionStateManager;
         mDepthController = depthController;
         mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
@@ -224,23 +221,6 @@
         mDisableSubpixelTextTransitionListener = new DisableSubpixelTextTransitionListener(mView);
         bouncerViewBinder.bind(mView.findViewById(R.id.keyguard_bouncer_container));
 
-        if (DeviceEntryUdfpsRefactor.isEnabled()) {
-            AlternateBouncerViewBinder.bind(
-                    mView.findViewById(R.id.alternate_bouncer),
-                    alternateBouncerDependencies.get()
-            );
-            javaAdapter.get().alwaysCollectFlow(
-                    alternateBouncerDependencies.get().getViewModel()
-                            .getForcePluginOpen(),
-                        forcePluginOpen ->
-                            mNotificationShadeWindowController.setForcePluginOpen(
-                                    forcePluginOpen,
-                                    alternateBouncerDependencies.get()
-                                            .getViewModel()
-                            )
-            );
-        }
-
         collectFlow(mView, keyguardTransitionInteractor.getLockscreenToDreamingTransition(),
                 mLockscreenToDreamingTransition);
         collectFlow(
@@ -398,7 +378,7 @@
                 }
 
                 if (!mIsTrackingBarGesture && isDown
-                        && mNotificationPanelViewController.isFullyCollapsed()) {
+                        && mPanelExpansionInteractor.isFullyCollapsed()) {
                     float x = ev.getRawX();
                     float y = ev.getRawY();
                     if (mStatusBarViewController.touchIsWithinView(x, y)) {
@@ -471,7 +451,7 @@
                 } else {
                     bouncerShowing = mService.isBouncerShowing();
                 }
-                if (mNotificationPanelViewController.isFullyExpanded()
+                if (mPanelExpansionInteractor.isFullyExpanded()
                         && !bouncerShowing
                         && !mStatusBarStateController.isDozing()) {
                     if (mDragDownHelper.isDragDownEnabled()) {
@@ -527,7 +507,7 @@
                 cancellation.setAction(MotionEvent.ACTION_CANCEL);
                 mStackScrollLayout.onInterceptTouchEvent(cancellation);
                 if (!MigrateClocksToBlueprint.isEnabled()) {
-                    mNotificationPanelViewController.handleExternalInterceptTouch(cancellation);
+                    mShadeViewController.handleExternalInterceptTouch(cancellation);
                 }
                 cancellation.recycle();
             }
@@ -546,7 +526,7 @@
                         // we still want to finish our drag down gesture when locking the screen
                         handled |= mDragDownHelper.onTouchEvent(ev) || handled;
                     }
-                    if (!handled && mNotificationPanelViewController.handleExternalTouch(ev)) {
+                    if (!handled && mShadeViewController.handleExternalTouch(ev)) {
                         return true;
                     }
                 } else {
@@ -583,6 +563,11 @@
             public boolean dispatchKeyEvent(KeyEvent event) {
                 return mSysUIKeyEventHandler.dispatchKeyEvent(event);
             }
+
+            @Override
+            public void collectKeyEvent(KeyEvent event) {
+                mFalsingCollector.onKeyEvent(event);
+            }
         });
 
         mView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
@@ -635,7 +620,7 @@
             // Since NotificationStackScrollLayout is now a sibling of notification_panel, we need
             // to also ask NotificationPanelViewController directly, in order to process swipe up
             // events originating from notifications
-            if (mNotificationPanelViewController.handleExternalInterceptTouch(ev)) {
+            if (mShadeViewController.handleExternalInterceptTouch(ev)) {
                 mShadeLogger.d("NSWVC: NPVC intercepted");
                 return true;
             }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
index 3a0e167..2507507 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
@@ -62,7 +62,6 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.internal.policy.ScreenDecorationsUtils;
 import com.android.internal.policy.SystemBarUtils;
-import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.systemui.DejankUtils;
 import com.android.systemui.Dumpable;
 import com.android.systemui.classifier.Classifier;
@@ -80,7 +79,6 @@
 import com.android.systemui.screenrecord.RecordingController;
 import com.android.systemui.shade.data.repository.ShadeRepository;
 import com.android.systemui.shade.domain.interactor.ShadeInteractor;
-import com.android.systemui.shade.transition.ShadeTransitionController;
 import com.android.systemui.shared.system.QuickStepContract;
 import com.android.systemui.statusbar.LockscreenShadeTransitionController;
 import com.android.systemui.statusbar.NotificationRemoteInputManager;
@@ -133,9 +131,7 @@
     private final FrameLayout mQsFrame;
 
     private final QsFrameTranslateController mQsFrameTranslateController;
-    private final ShadeTransitionController mShadeTransitionController;
     private final PulseExpansionHandler mPulseExpansionHandler;
-    private final ShadeExpansionStateManager mShadeExpansionStateManager;
     private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
     private final LightBarController mLightBarController;
     private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
@@ -147,7 +143,6 @@
     private final KeyguardBypassController mKeyguardBypassController;
     private final NotificationRemoteInputManager mRemoteInputManager;
     private VelocityTracker mQsVelocityTracker;
-    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     private final ScrimController mScrimController;
     private final MediaDataManager mMediaDataManager;
     private final MediaHierarchyManager mMediaHierarchyManager;
@@ -309,10 +304,8 @@
             Lazy<NotificationPanelViewController> panelViewControllerLazy,
             NotificationPanelView panelView,
             QsFrameTranslateController qsFrameTranslateController,
-            ShadeTransitionController shadeTransitionController,
             PulseExpansionHandler pulseExpansionHandler,
             NotificationRemoteInputManager remoteInputManager,
-            ShadeExpansionStateManager shadeExpansionStateManager,
             StatusBarKeyguardViewManager statusBarKeyguardViewManager,
             LightBarController lightBarController,
             NotificationStackScrollLayoutController notificationStackScrollLayoutController,
@@ -322,7 +315,6 @@
             StatusBarTouchableRegionManager statusBarTouchableRegionManager,
             KeyguardStateController keyguardStateController,
             KeyguardBypassController keyguardBypassController,
-            KeyguardUpdateMonitor keyguardUpdateMonitor,
             ScrimController scrimController,
             MediaDataManager mediaDataManager,
             MediaHierarchyManager mediaHierarchyManager,
@@ -344,6 +336,7 @@
             SplitShadeStateController splitShadeStateController,
             Lazy<LargeScreenHeaderHelper> largeScreenHeaderHelperLazy
     ) {
+        SceneContainerFlag.assertInLegacyMode();
         mPanelViewControllerLazy = panelViewControllerLazy;
         mPanelView = panelView;
         mLargeScreenHeaderHelperLazy = largeScreenHeaderHelperLazy;
@@ -353,7 +346,6 @@
         mSplitShadeStateController = splitShadeStateController;
         mSplitShadeEnabled = mSplitShadeStateController.shouldUseSplitNotificationShade(mResources);
         mQsFrameTranslateController = qsFrameTranslateController;
-        mShadeTransitionController = shadeTransitionController;
         mPulseExpansionHandler = pulseExpansionHandler;
         pulseExpansionHandler.setPulseExpandAbortListener(() -> {
             if (mQs != null) {
@@ -361,7 +353,6 @@
             }
         });
         mRemoteInputManager = remoteInputManager;
-        mShadeExpansionStateManager = shadeExpansionStateManager;
         mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
         mLightBarController = lightBarController;
         mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
@@ -371,7 +362,6 @@
         mStatusBarTouchableRegionManager = statusBarTouchableRegionManager;
         mKeyguardStateController = keyguardStateController;
         mKeyguardBypassController = keyguardBypassController;
-        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mScrimController = scrimController;
         mMediaDataManager = mediaDataManager;
         mMediaHierarchyManager = mediaHierarchyManager;
@@ -976,14 +966,21 @@
         }
     }
 
-    void updateQsState() {
-        boolean qsFullScreen = getExpanded() && !mSplitShadeEnabled;
+    private void setQsFullScreen(boolean qsFullScreen) {
         mShadeRepository.setLegacyQsFullscreen(qsFullScreen);
         mNotificationStackScrollLayoutController.setQsFullScreen(qsFullScreen);
         if (!SceneContainerFlag.isEnabled()) {
             mNotificationStackScrollLayoutController.setScrollingEnabled(
                     mBarState != KEYGUARD && (!qsFullScreen || mExpansionFromOverscroll));
         }
+    }
+
+    void updateQsState() {
+        if (!FooterViewRefactor.isEnabled()) {
+            // Update full screen state; note that this will be true if the QS panel is only
+            // partially expanded, and that is fixed with the footer view refactor.
+            setQsFullScreen(/* qsFullScreen = */ getExpanded() && !mSplitShadeEnabled);
+        }
 
         if (mQsStateUpdateListener != null) {
             mQsStateUpdateListener.onQsStateUpdated(getExpanded(), mStackScrollerOverscrolling);
@@ -1046,6 +1043,11 @@
 
         // Update the light bar
         mLightBarController.setQsExpanded(mFullyExpanded);
+
+        if (FooterViewRefactor.isEnabled()) {
+            // Update full screen state
+            setQsFullScreen(/* qsFullScreen = */ mFullyExpanded && !mSplitShadeEnabled);
+        }
     }
 
     float getLockscreenShadeDragProgress() {
@@ -1369,6 +1371,7 @@
     @Override
     public float calculateNotificationsTopPadding(boolean isShadeExpanding,
             int keyguardNotificationStaticPadding, float expandedFraction) {
+        SceneContainerFlag.assertInLegacyMode();
         float topPadding;
         boolean keyguardShowing = mBarState == KEYGUARD;
         if (mSplitShadeEnabled) {
@@ -2180,7 +2183,6 @@
                 }
             });
             mLockscreenShadeTransitionController.setQS(mQs);
-            mShadeTransitionController.setQs(mQs);
             mNotificationStackScrollLayoutController.setQsHeader((ViewGroup) mQs.getHeader());
             mQs.setScrollListener(mQsScrollListener);
             updateExpansion();
diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerSceneImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerSceneImpl.kt
index b8250cc..3462993 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerSceneImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerSceneImpl.kt
@@ -17,7 +17,6 @@
 package com.android.systemui.shade
 
 import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.plugins.qs.QSContainerController
 import com.android.systemui.qs.ui.adapter.QSSceneAdapter
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import javax.inject.Inject
@@ -28,7 +27,6 @@
 constructor(
     private val shadeInteractor: ShadeInteractor,
     private val qsSceneAdapter: QSSceneAdapter,
-    private val qsContainerController: QSContainerController,
 ) : QuickSettingsController {
 
     override val expanded: Boolean
@@ -43,7 +41,7 @@
     }
 
     override fun closeQsCustomizer() {
-        qsContainerController.setCustomizerShowing(false)
+        qsSceneAdapter.requestCloseCustomizer()
     }
 
     @Deprecated("specific to legacy split shade")
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java
index 5f5e5ce..07836e4 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerImpl.java
@@ -21,15 +21,13 @@
 import android.util.Log;
 import android.view.MotionEvent;
 import android.view.ViewTreeObserver;
-import android.view.WindowManager;
 import android.view.WindowManagerGlobal;
 
 import com.android.systemui.DejankUtils;
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.DisplayId;
 import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.log.LogBuffer;
-import com.android.systemui.log.dagger.ShadeTouchLog;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor;
 import com.android.systemui.scene.shared.flag.SceneContainerFlag;
@@ -81,7 +79,6 @@
     public ShadeControllerImpl(
             CommandQueue commandQueue,
             @Main Executor mainExecutor,
-            @ShadeTouchLog LogBuffer touchLog,
             WindowRootViewVisibilityInteractor windowRootViewVisibilityInteractor,
             KeyguardStateController keyguardStateController,
             StatusBarStateController statusBarStateController,
@@ -89,13 +86,12 @@
             StatusBarWindowController statusBarWindowController,
             DeviceProvisionedController deviceProvisionedController,
             NotificationShadeWindowController notificationShadeWindowController,
-            WindowManager windowManager,
+            @DisplayId int displayId,
             Lazy<NotificationPanelViewController> shadeViewControllerLazy,
             Lazy<AssistManager> assistManagerLazy,
             Lazy<NotificationGutsManager> gutsManager
     ) {
-        super(touchLog,
-                commandQueue,
+        super(commandQueue,
                 statusBarKeyguardViewManager,
                 notificationShadeWindowController,
                 assistManagerLazy);
@@ -110,7 +106,7 @@
         mGutsManager = gutsManager;
         mNotificationShadeWindowController = notificationShadeWindowController;
         mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
-        mDisplayId = windowManager.getDefaultDisplay().getDisplayId();
+        mDisplayId = displayId;
         mKeyguardStateController = keyguardStateController;
         mAssistManagerLazy = assistManagerLazy;
     }
@@ -131,7 +127,9 @@
     @Override
     public void animateCollapseShade(int flags, boolean force, boolean delayed,
             float speedUpFactor) {
-        if (!force && mStatusBarStateController.getState() != StatusBarState.SHADE) {
+        int statusBarState = mStatusBarStateController.getState();
+        if (!force && statusBarState != StatusBarState.SHADE
+                && statusBarState != StatusBarState.SHADE_LOCKED) {
             runPostCollapseActions();
             return;
         }
@@ -385,7 +383,6 @@
 
     @Override
     public void start() {
-        super.start();
         getNpvc().setTrackingStartedListener(this::runPostCollapseActions);
         getNpvc().setOpenCloseListener(
                 new OpenCloseListener() {
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt
index 6bb1df7..ebebbe6 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt
@@ -23,6 +23,7 @@
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
+import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor
 import com.android.systemui.log.LogBuffer
 import com.android.systemui.log.dagger.ShadeTouchLog
 import com.android.systemui.scene.domain.interactor.SceneInteractor
@@ -61,6 +62,7 @@
     private val shadeInteractor: ShadeInteractor,
     private val sceneInteractor: SceneInteractor,
     private val deviceEntryInteractor: DeviceEntryInteractor,
+    private val deviceUnlockedInteractor: DeviceUnlockedInteractor,
     private val notificationStackScrollLayout: NotificationStackScrollLayout,
     @ShadeTouchLog private val touchLog: LogBuffer,
     private val vibratorHelper: VibratorHelper,
@@ -70,7 +72,6 @@
     assistManagerLazy: Lazy<AssistManager>,
 ) :
     BaseShadeControllerImpl(
-        touchLog,
         commandQueue,
         statusBarKeyguardViewManager,
         notificationShadeWindowController,
@@ -149,7 +150,11 @@
     }
 
     private fun getCollapseDestinationScene(): SceneKey {
-        return if (deviceEntryInteractor.isDeviceEntered.value) {
+        // Always check whether device is unlocked before transitioning to gone scene.
+        return if (
+            deviceUnlockedInteractor.deviceUnlockStatus.value.isUnlocked &&
+                deviceEntryInteractor.isDeviceEntered.value
+        ) {
             Scenes.Gone
         } else {
             Scenes.Lockscreen
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionChangeEvent.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionChangeEvent.kt
index 71dfafa..d9c1f0a 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionChangeEvent.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionChangeEvent.kt
@@ -23,7 +23,5 @@
     /** Whether the panel should be considered expanded */
     val expanded: Boolean,
     /** Whether the user is actively dragging the panel. */
-    val tracking: Boolean,
-    /** The amount of pixels that the user has dragged during the expansion. */
-    val dragDownPxAmount: Float
+    val tracking: Boolean
 )
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt
index e40bcd5..359ddd8 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt
@@ -18,13 +18,13 @@
 
 import android.annotation.IntDef
 import android.os.Trace
-import android.os.Trace.TRACE_TAG_APP as TRACE_TAG
 import android.util.Log
 import androidx.annotation.FloatRange
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.util.Compile
 import java.util.concurrent.CopyOnWriteArrayList
 import javax.inject.Inject
+import android.os.Trace.TRACE_TAG_APP as TRACE_TAG
 
 /**
  * A class responsible for managing the notification panel's current state.
@@ -42,7 +42,6 @@
     @FloatRange(from = 0.0, to = 1.0) private var fraction: Float = 0f
     private var expanded: Boolean = false
     private var tracking: Boolean = false
-    private var dragDownPxAmount: Float = 0f
 
     /**
      * Adds a listener that will be notified when the panel expansion fraction has changed and
@@ -53,12 +52,7 @@
     @Deprecated("Use ShadeInteractor instead")
     fun addExpansionListener(listener: ShadeExpansionListener): ShadeExpansionChangeEvent {
         expansionListeners.add(listener)
-        return ShadeExpansionChangeEvent(fraction, expanded, tracking, dragDownPxAmount)
-    }
-
-    /** Removes an expansion listener. */
-    fun removeExpansionListener(listener: ShadeExpansionListener) {
-        expansionListeners.remove(listener)
+        return ShadeExpansionChangeEvent(fraction, expanded, tracking)
     }
 
     /** Adds a listener that will be notified when the panel state has changed. */
@@ -81,8 +75,7 @@
     fun onPanelExpansionChanged(
         @FloatRange(from = 0.0, to = 1.0) fraction: Float,
         expanded: Boolean,
-        tracking: Boolean,
-        dragDownPxAmount: Float
+        tracking: Boolean
     ) {
         require(!fraction.isNaN()) { "fraction cannot be NaN" }
         val oldState = state
@@ -90,7 +83,6 @@
         this.fraction = fraction
         this.expanded = expanded
         this.tracking = tracking
-        this.dragDownPxAmount = dragDownPxAmount
 
         var fullyClosed = true
         var fullyOpened = false
@@ -116,7 +108,6 @@
                 "f=$fraction " +
                 "expanded=$expanded " +
                 "tracking=$tracking " +
-                "dragDownPxAmount=$dragDownPxAmount " +
                 "${if (fullyOpened) " fullyOpened" else ""} " +
                 if (fullyClosed) " fullyClosed" else ""
         )
@@ -129,8 +120,7 @@
             }
         }
 
-        val expansionChangeEvent =
-            ShadeExpansionChangeEvent(fraction, expanded, tracking, dragDownPxAmount)
+        val expansionChangeEvent = ShadeExpansionChangeEvent(fraction, expanded, tracking)
         expansionListeners.forEach { it.onPanelExpansionChanged(expansionChangeEvent) }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt
index 8d23f5d..b5b46f1 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt
@@ -17,9 +17,9 @@
 package com.android.systemui.shade
 
 import android.view.MotionEvent
-import com.android.systemui.log.dagger.ShadeLog
 import com.android.systemui.log.LogBuffer
 import com.android.systemui.log.core.LogLevel
+import com.android.systemui.log.dagger.ShadeLog
 import com.android.systemui.shade.ShadeViewController.Companion.FLING_COLLAPSE
 import com.android.systemui.shade.ShadeViewController.Companion.FLING_EXPAND
 import com.android.systemui.shade.ShadeViewController.Companion.FLING_HIDE
@@ -304,8 +304,7 @@
         msg: String,
         forceCancel: Boolean,
         expand: Boolean,
-    )
-    {
+    ) {
         buffer.log(
             TAG,
             LogLevel.VERBOSE,
@@ -322,8 +321,7 @@
         msg: String,
         panelClosedOnDown: Boolean,
         expandFraction: Float,
-    )
-    {
+    ) {
         buffer.log(
             TAG,
             LogLevel.VERBOSE,
@@ -381,7 +379,6 @@
         shouldControlScreenOff: Boolean,
         deviceInteractive: Boolean,
         isPulsing: Boolean,
-        isFrpActive: Boolean,
     ) {
         buffer.log(
             TAG,
@@ -392,12 +389,11 @@
                 bool3 = shouldControlScreenOff
                 bool4 = deviceInteractive
                 str1 = isPulsing.toString()
-                str2 = isFrpActive.toString()
             },
             {
                 "CentralSurfaces updateNotificationPanelTouchState set disabled to: $bool1\n" +
                         "isGoingToSleep: $bool2, !shouldControlScreenOff: $bool3," +
-                        "!mDeviceInteractive: $bool4, !isPulsing: $str1, isFrpActive: $str2"
+                        "!mDeviceInteractive: $bool4, !isPulsing: $str1"
             }
         )
     }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
index 2d3833c..648d4b5 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
@@ -162,9 +162,7 @@
 
     @Binds
     @SysUISingleton
-    abstract fun bindsShadeViewController(
-        notificationPanelViewController: NotificationPanelViewController
-    ): ShadeViewController
+    abstract fun bindsShadeViewController(shadeSurface: ShadeSurface): ShadeViewController
 
     @Binds
     @SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeSurface.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeSurface.kt
index d02c215..7346a28 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeSurface.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeSurface.kt
@@ -15,7 +15,6 @@
  */
 package com.android.systemui.shade
 
-import android.view.ViewPropertyAnimator
 import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor
 import com.android.systemui.shade.domain.interactor.ShadeBackActionInteractor
 import com.android.systemui.shade.domain.interactor.ShadeLockscreenInteractor
@@ -48,7 +47,7 @@
     fun cancelAnimation()
 
     /** Animates the view from its current alpha to zero then runs the runnable. */
-    fun fadeOut(startDelayMs: Long, durationMs: Long, endAction: Runnable): ViewPropertyAnimator
+    fun fadeOut(startDelayMs: Long, durationMs: Long, endAction: Runnable)
 
     /** Set whether the bouncer is showing. */
     fun setBouncerShowing(bouncerShowing: Boolean)
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeSurfaceImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeSurfaceImpl.kt
new file mode 100644
index 0000000..ec4018c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeSurfaceImpl.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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
+
+import com.android.systemui.statusbar.GestureRecorder
+import com.android.systemui.statusbar.phone.CentralSurfaces
+import com.android.systemui.statusbar.policy.HeadsUpManager
+import javax.inject.Inject
+
+class ShadeSurfaceImpl @Inject constructor() : ShadeSurface, ShadeViewControllerEmptyImpl() {
+    override fun initDependencies(
+        centralSurfaces: CentralSurfaces,
+        recorder: GestureRecorder,
+        hideExpandedRunnable: Runnable,
+        headsUpManager: HeadsUpManager
+    ) {}
+
+    override fun cancelPendingCollapse() {
+        // Do nothing
+    }
+
+    override fun cancelAnimation() {
+        // Do nothing
+    }
+
+    override fun fadeOut(startDelayMs: Long, durationMs: Long, endAction: Runnable) {
+        // Do nothing
+    }
+
+    override fun setBouncerShowing(bouncerShowing: Boolean) {
+        // Do nothing
+    }
+
+    override fun setTouchAndAnimationDisabled(disabled: Boolean) {
+        // TODO(b/332732878): determine if still needed
+    }
+
+    override fun setWillPlayDelayedDozeAmountAnimation(willPlay: Boolean) {
+        // TODO(b/322494538): determine if still needed
+    }
+
+    override fun setDozing(dozing: Boolean, animate: Boolean) {
+        // Do nothing
+    }
+
+    override fun setImportantForAccessibility(mode: Int) {
+        // Do nothing
+    }
+
+    override fun resetTranslation() {
+        // Do nothing
+    }
+
+    override fun resetAlpha() {
+        // Do nothing
+    }
+
+    override fun onScreenTurningOn() {
+        // Do nothing
+    }
+
+    override fun onThemeChanged() {
+        // Do nothing
+    }
+
+    override fun updateExpansionAndVisibility() {
+        // Do nothing
+    }
+
+    override fun updateResources() {
+        // Do nothing
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt
index b283720..4ec0b23 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt
@@ -33,21 +33,12 @@
     /** Returns whether the shade's top level view is enabled. */
     @Deprecated("No longer supported. Do not add new calls to this.") val isViewEnabled: Boolean
 
-    /** Returns whether status bar icons should be hidden when the shade is expanded. */
-    fun shouldHideStatusBarIconsWhenExpanded(): Boolean
-
-    /**
-     * Disables the shade header.
-     *
-     * @see ShadeHeaderController.disable
-     */
-    fun disableHeader(state1: Int, state2: Int, animated: Boolean)
-
     /** If the latency tracker is enabled, begins tracking expand latency. */
     @Deprecated("No longer supported. Do not add new calls to this.")
     fun startExpandLatencyTracking()
 
     /** Sets the alpha value of the shade to a value between 0 and 255. */
+    @Deprecated("No longer supported. Do not add new calls to this.")
     fun setAlpha(alpha: Int, animate: Boolean)
 
     /**
@@ -55,6 +46,7 @@
      *
      * @see .setAlpha
      */
+    @Deprecated("No longer supported. Do not add new calls to this.")
     fun setAlphaChangeAnimationEndAction(r: Runnable)
 
     /** Sets Qs ScrimEnabled and updates QS state. */
@@ -62,13 +54,14 @@
     fun setQsScrimEnabled(qsScrimEnabled: Boolean)
 
     /** Sets the top spacing for the ambient indicator. */
+    @Deprecated("Does nothing when scene container is enabled.")
     fun setAmbientIndicationTop(ambientIndicationTop: Int, ambientTextVisible: Boolean)
 
     /** Updates notification panel-specific flags on [SysUiState]. */
     @Deprecated("Does nothing when scene container is enabled.") fun updateSystemUiStateFlags()
 
     /** Ensures that the touchable region is updated. */
-    fun updateTouchableRegion()
+    @Deprecated("No longer supported. Do not add new calls to this.") fun updateTouchableRegion()
 
     /**
      * Sends an external (e.g. Status Bar) touch event to the Shade touch handler.
@@ -79,6 +72,9 @@
      */
     fun handleExternalTouch(event: MotionEvent): Boolean
 
+    /** Sends an external (e.g. Status Bar) intercept touch event to the Shade touch handler. */
+    fun handleExternalInterceptTouch(event: MotionEvent): Boolean
+
     /**
      * Triggered when an input focus transfer gesture has started.
      *
@@ -103,6 +99,7 @@
     val shadeHeadsUpTracker: ShadeHeadsUpTracker
 
     /** Returns the ShadeFoldAnimator. */
+    @Deprecated("This interface is deprecated in Scene Container")
     val shadeFoldAnimator: ShadeFoldAnimator
 
     companion object {
@@ -149,8 +146,10 @@
 }
 
 /** Handles the lifecycle of the shade's animation that happens when folding a foldable. */
+@Deprecated("This interface should not be used in scene container. Needs flexiglass equivalent.")
 interface ShadeFoldAnimator {
     /** Updates the views to the initial state for the fold to AOD animation. */
+    @Deprecated("Used by the Keyguard Fold Transition. Needs flexiglass equivalent.")
     fun prepareFoldToAodAnimation()
 
     /**
@@ -160,21 +159,25 @@
      * @param endAction invoked when the animation finishes, also if it was cancelled.
      * @param cancelAction invoked when the animation is cancelled, before endAction.
      */
+    @Deprecated("Not used when migrateClocksToBlueprint enabled.")
     fun startFoldToAodAnimation(startAction: Runnable, endAction: Runnable, cancelAction: Runnable)
 
     /** Cancels fold to AOD transition and resets view state. */
+    @Deprecated("Used by the Keyguard Fold Transition. Needs flexiglass equivalent.")
     fun cancelFoldToAodAnimation()
 
     /** Returns the main view of the shade. */
-    val view: ViewGroup?
+    @Deprecated("Not used when migrateClocksToBlueprint enabled.") val view: ViewGroup?
 }
 
 /**
  * An interface that provides the current state of the notification panel and related views, which
  * is needed to calculate [KeyguardStatusBarView]'s state in [KeyguardStatusBarViewController].
  */
+@Deprecated("This interface should not be used in scene container.")
 interface ShadeViewStateProvider {
     /** Returns the expanded height of the panel view. */
+    @Deprecated("deprecated by migrate_keyguard_status_bar_view flag")
     val panelViewExpandedHeight: Float
 
     /**
@@ -183,8 +186,9 @@
      * TODO(b/138786270): If HeadsUpAppearanceController was injectable, we could inject it into
      *   [KeyguardStatusBarViewController] and remove this method.
      */
-    fun shouldHeadsUpBeVisible(): Boolean
+    @Deprecated("deprecated in Flexiglass.") fun shouldHeadsUpBeVisible(): Boolean
 
     /** Return the fraction of the shade that's expanded, when in lockscreen. */
+    @Deprecated("deprecated by migrate_keyguard_status_bar_view flag")
     val lockscreenShadeDragProgress: Float
 }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewControllerEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewControllerEmptyImpl.kt
index bfb5ad3..0c41efd 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewControllerEmptyImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewControllerEmptyImpl.kt
@@ -28,7 +28,7 @@
 import kotlinx.coroutines.flow.flowOf
 
 /** Empty implementation of ShadeViewController for variants with no shade. */
-class ShadeViewControllerEmptyImpl @Inject constructor() :
+open class ShadeViewControllerEmptyImpl @Inject constructor() :
     ShadeViewController,
     ShadeBackActionInteractor,
     ShadeLockscreenInteractor,
@@ -45,7 +45,6 @@
     override val isViewEnabled: Boolean = false
     override fun shouldHideStatusBarIconsWhenExpanded() = false
     @Deprecated("Not supported by scenes") override fun blockExpansionForCurrentTouch() {}
-    override fun disableHeader(state1: Int, state2: Int, animated: Boolean) {}
     override fun startExpandLatencyTracking() {}
     override fun startBouncerPreHideAnimation() {}
     override fun dozeTimeTick() {}
@@ -82,6 +81,10 @@
     override fun handleExternalTouch(event: MotionEvent): Boolean {
         return false
     }
+    override fun handleExternalInterceptTouch(event: MotionEvent): Boolean {
+        return false
+    }
+
     override fun startInputFocusTransfer() {}
     override fun cancelInputFocusTransfer() {}
     override fun finishInputFocusTransfer(velocity: Float) {}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt
index 2cb9f9a..f5dd5e4 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt
@@ -22,6 +22,7 @@
 import android.view.LayoutInflater
 import android.view.ViewStub
 import androidx.constraintlayout.motion.widget.MotionLayout
+import com.android.compose.animation.scene.SceneKey
 import com.android.keyguard.logging.ScrimLogger
 import com.android.systemui.battery.BatteryMeterView
 import com.android.systemui.battery.BatteryMeterViewController
@@ -43,6 +44,7 @@
 import com.android.systemui.statusbar.LightRevealScrim
 import com.android.systemui.statusbar.NotificationInsetsController
 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
+import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView
 import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
 import com.android.systemui.statusbar.phone.KeyguardBottomAreaView
 import com.android.systemui.statusbar.phone.StatusBarLocation
@@ -51,6 +53,7 @@
 import com.android.systemui.statusbar.policy.BatteryController
 import com.android.systemui.statusbar.policy.ConfigurationController
 import com.android.systemui.tuner.TunerService
+import dagger.Binds
 import dagger.Module
 import dagger.Provides
 import javax.inject.Named
@@ -59,6 +62,14 @@
 /** Module for providing views related to the shade. */
 @Module
 abstract class ShadeViewProviderModule {
+
+    @Binds
+    @SysUISingleton
+    // TODO(b/277762009): Only allow this view's binder to inject the view.
+    abstract fun bindsNotificationScrollView(
+        notificationStackScrollLayout: NotificationStackScrollLayout
+    ): NotificationScrollView
+
     companion object {
         const val SHADE_HEADER = "large_screen_shade_header"
 
@@ -76,6 +87,7 @@
             sceneDataSourceDelegator: Provider<SceneDataSourceDelegator>,
         ): WindowRootView {
             return if (sceneContainerFlags.isEnabled()) {
+                checkNoSceneDuplicates(scenesProvider.get())
                 val sceneWindowRootView =
                     layoutInflater.inflate(R.layout.scene_window_root, null) as SceneWindowRootView
                 sceneWindowRootView.init(
@@ -271,5 +283,21 @@
         ): StatusIconContainer {
             return header.requireViewById(R.id.statusIcons)
         }
+
+        private fun checkNoSceneDuplicates(scenes: Set<Scene>) {
+            val keys = mutableSetOf<SceneKey>()
+            val duplicates = mutableSetOf<SceneKey>()
+            scenes
+                .map { it.key }
+                .forEach { sceneKey ->
+                    if (keys.contains(sceneKey)) {
+                        duplicates.add(sceneKey)
+                    } else {
+                        keys.add(sceneKey)
+                    }
+                }
+
+            check(duplicates.isEmpty()) { "Duplicate scenes detected: $duplicates" }
+        }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java b/packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java
index 3349345..c429329 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java
@@ -345,9 +345,7 @@
             }
         }
 
-        if (mStatusBarPipelineFlags.useNewShadeCarrierGroupMobileIcons()) {
-            Log.d(TAG, "ignoring old pipeline callback because new mobile icon is enabled");
-        } else {
+        if (!mStatusBarPipelineFlags.useNewShadeCarrierGroupMobileIcons()) {
             for (int i = 0; i < SIM_SLOTS; i++) {
                 mCarrierGroups[i].updateState(mInfos[i], singleCarrier);
             }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractor.kt
index 6611303..dfdf2ad 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractor.kt
@@ -72,4 +72,8 @@
 
     /** Returns the StatusBarState. Note: System UI was formerly known simply as Status Bar. */
     @Deprecated("Use SceneInteractor or ShadeInteractor instead") val barState: Int
+
+    /** Returns whether status bar icons should be hidden when the shade is expanded. */
+    @Deprecated("No longer supported. Do not add new calls to this.")
+    fun shouldHideStatusBarIconsWhenExpanded(): Boolean
 }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImpl.kt
index 561d0bc..58bcd2e 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImpl.kt
@@ -69,27 +69,21 @@
                         state.fromScene == Scenes.Gone ->
                             if (state.toScene.isExpandable()) {
                                 // Moving from Gone to a scene that can animate-expand has a
-                                // panel
-                                // expansion
-                                // that tracks with the transition.
+                                // panel expansion that tracks with the transition.
                                 state.progress
                             } else {
                                 // Moving from Gone to a scene that doesn't animate-expand
-                                // immediately makes
-                                // the panel fully expanded.
+                                // immediately makes the panel fully expanded.
                                 flowOf(1f)
                             }
                         state.toScene == Scenes.Gone ->
                             if (state.fromScene.isExpandable()) {
                                 // Moving to Gone from a scene that can animate-expand has a
-                                // panel
-                                // expansion
-                                // that tracks with the transition.
+                                // panel expansion that tracks with the transition.
                                 state.progress.map { 1 - it }
                             } else {
                                 // Moving to Gone from a scene that doesn't animate-expand
-                                // immediately makes
-                                // the panel fully collapsed.
+                                // immediately makes the panel fully collapsed.
                                 flowOf(0f)
                             }
                         else -> flowOf(1f)
@@ -126,6 +120,15 @@
     override val barState
         get() = statusBarStateController.state
 
+    @Deprecated("No longer supported. Do not add new calls to this.")
+    override fun shouldHideStatusBarIconsWhenExpanded(): Boolean {
+        if (shadeAnimationInteractor.isLaunchingActivity.value) {
+            return false
+        }
+        // TODO(b/325936094) if a HUN is showing, return false
+        return sceneInteractor.currentScene.value == Scenes.Lockscreen
+    }
+
     private fun SceneKey.isExpandable(): Boolean {
         return this == Scenes.Shade || this == Scenes.QuickSettings
     }
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 cde45f2..0de3c10 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
@@ -29,6 +29,9 @@
     /** Emits true if the shade is currently allowed and false otherwise. */
     val isShadeEnabled: StateFlow<Boolean>
 
+    /** Emits true if QS is currently allowed and false otherwise. */
+    val isQsEnabled: StateFlow<Boolean>
+
     /** Whether either the shade or QS is fully expanded. */
     val isAnyFullyExpanded: StateFlow<Boolean>
 
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 5fbd2cf..883ef97 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
@@ -29,6 +29,7 @@
     private val inactiveFlowBoolean = MutableStateFlow(false)
     private val inactiveFlowFloat = MutableStateFlow(0f)
     override val isShadeEnabled: StateFlow<Boolean> = inactiveFlowBoolean
+    override val isQsEnabled: StateFlow<Boolean> = inactiveFlowBoolean
     override val shadeExpansion: StateFlow<Float> = inactiveFlowFloat
     override val qsExpansion: StateFlow<Float> = inactiveFlowFloat
     override val isQsExpanded: StateFlow<Boolean> = inactiveFlowBoolean
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 e619806..d68e28c 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
@@ -28,7 +28,6 @@
 import com.android.systemui.statusbar.policy.data.repository.UserSetupRepository
 import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
 import com.android.systemui.user.domain.interactor.UserSwitcherInteractor
-import com.android.systemui.util.kotlin.combine
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
@@ -56,15 +55,16 @@
     private val baseShadeInteractor: BaseShadeInteractor,
 ) : ShadeInteractor, BaseShadeInteractor by baseShadeInteractor {
     override val isShadeEnabled: StateFlow<Boolean> =
-        combine(
-                deviceProvisioningInteractor.isFactoryResetProtectionActive,
-                disableFlagsRepository.disableFlags,
-            ) { isFrpActive, isDisabledByFlags ->
-                isDisabledByFlags.isShadeEnabled() && !isFrpActive
-            }
+        disableFlagsRepository.disableFlags
+            .map { isDisabledByFlags -> isDisabledByFlags.isShadeEnabled() }
             .distinctUntilChanged()
             .stateIn(scope, SharingStarted.Eagerly, initialValue = false)
 
+    override val isQsEnabled: StateFlow<Boolean> =
+        disableFlagsRepository.disableFlags
+            .map { it.isQuickSettingsEnabled() }
+            .stateIn(scope, SharingStarted.Eagerly, initialValue = false)
+
     override val isAnyFullyExpanded: StateFlow<Boolean> =
         anyExpansion
             .map { it >= 1f }
@@ -84,11 +84,8 @@
             powerInteractor.isAsleep,
             keyguardTransitionInteractor.isInTransitionToStateWhere { it == KeyguardState.AOD },
             keyguardRepository.dozeTransitionModel.map { it.to == DozeStateModel.DOZE_PULSING },
-            deviceProvisioningInteractor.isFactoryResetProtectionActive,
-        ) { isAsleep, goingToSleep, isPulsing, isFrpActive ->
+        ) { isAsleep, goingToSleep, isPulsing ->
             when {
-                // Touches are disabled when Factory Reset Protection is active
-                isFrpActive -> false
                 // If the device is going to sleep, only accept touches if we're still
                 // animating
                 goingToSleep -> dozeParams.shouldControlScreenOff()
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 ac881b5..7d46d2b 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
@@ -66,7 +66,8 @@
                 when (statusBarState) {
                     // legacyShadeExpansion is 1 instead of 0 when QS is expanded
                     StatusBarState.SHADE ->
-                        if (!splitShadeEnabled && qsExpansion > 0f) 0f else legacyShadeExpansion
+                        if (!splitShadeEnabled && qsExpansion > 0f) 1f - qsExpansion
+                        else legacyShadeExpansion
                     StatusBarState.KEYGUARD -> lockscreenShadeExpansion
                     // dragDownAmount, which drives lockscreenShadeExpansion resets to 0f when
                     // the pointer is lifted and the lockscreen shade is fully expanded
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt
index 11ce818..f3802da 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt
@@ -21,11 +21,22 @@
 import com.android.systemui.common.ui.data.repository.ConfigurationRepository
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.dagger.ShadeTouchLog
+import com.android.systemui.scene.domain.interactor.SceneInteractor
+import com.android.systemui.scene.shared.flag.SceneContainerFlag
+import com.android.systemui.shade.ShadeExpansionStateManager
+import com.android.systemui.shade.TouchLogger.Companion.logTouchesTo
 import com.android.systemui.shade.data.repository.ShadeRepository
+import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor
 import com.android.systemui.shade.shared.model.ShadeMode
+import com.android.systemui.shade.transition.ScrimShadeTransitionController
 import com.android.systemui.statusbar.policy.SplitShadeStateController
 import javax.inject.Inject
+import javax.inject.Provider
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.launchIn
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onStart
 import kotlinx.coroutines.launch
@@ -36,13 +47,36 @@
 constructor(
     @Application private val applicationScope: CoroutineScope,
     @Application private val applicationContext: Context,
+    @ShadeTouchLog private val touchLog: LogBuffer,
     private val configurationRepository: ConfigurationRepository,
     private val shadeRepository: ShadeRepository,
-    private val controller: SplitShadeStateController,
+    private val splitShadeStateController: SplitShadeStateController,
+    private val scrimShadeTransitionController: ScrimShadeTransitionController,
+    private val sceneInteractorProvider: Provider<SceneInteractor>,
+    private val panelExpansionInteractorProvider: Provider<PanelExpansionInteractor>,
+    private val shadeExpansionStateManager: ShadeExpansionStateManager,
 ) : CoreStartable {
 
     override fun start() {
         hydrateShadeMode()
+        hydrateShadeExpansionStateManager()
+        logTouchesTo(touchLog)
+        scrimShadeTransitionController.init()
+    }
+
+    private fun hydrateShadeExpansionStateManager() {
+        if (SceneContainerFlag.isEnabled) {
+            combine(
+                panelExpansionInteractorProvider.get().legacyPanelExpansion,
+                sceneInteractorProvider.get().isTransitionUserInputOngoing,
+            ) { panelExpansion, tracking ->
+                shadeExpansionStateManager.onPanelExpansionChanged(
+                    fraction = panelExpansion,
+                    expanded = panelExpansion > 0f,
+                    tracking = tracking,
+                )
+            }.launchIn(applicationScope)
+        }
     }
 
     private fun hydrateShadeMode() {
@@ -51,7 +85,9 @@
                 // Force initial collection.
                 .onStart { emit(Unit) }
                 .map { applicationContext.resources }
-                .map { resources -> controller.shouldUseSplitNotificationShade(resources) }
+                .map { resources ->
+                    splitShadeStateController.shouldUseSplitNotificationShade(resources)
+                }
                 .collect { isSplitShade ->
                     shadeRepository.setShadeMode(
                         if (isSplitShade) {
diff --git a/packages/SystemUI/src/com/android/systemui/shade/transition/ScrimShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/shade/transition/ScrimShadeTransitionController.kt
index abb69f6..e38e53d 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/transition/ScrimShadeTransitionController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/transition/ScrimShadeTransitionController.kt
@@ -20,6 +20,7 @@
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.shade.PanelState
 import com.android.systemui.shade.ShadeExpansionChangeEvent
+import com.android.systemui.shade.ShadeExpansionStateManager
 import com.android.systemui.statusbar.phone.ScrimController
 import java.io.PrintWriter
 import javax.inject.Inject
@@ -29,22 +30,26 @@
 class ScrimShadeTransitionController
 @Inject
 constructor(
-    dumpManager: DumpManager,
+    private val shadeExpansionStateManager: ShadeExpansionStateManager,
+    private val dumpManager: DumpManager,
     private val scrimController: ScrimController,
 ) {
-
     private var lastExpansionFraction: Float? = null
     private var lastExpansionEvent: ShadeExpansionChangeEvent? = null
     private var currentPanelState: Int? = null
 
-    init {
+    fun init() {
+        val currentState =
+            shadeExpansionStateManager.addExpansionListener(this::onPanelExpansionChanged)
+        onPanelExpansionChanged(currentState)
+        shadeExpansionStateManager.addStateListener(this::onPanelStateChanged)
         dumpManager.registerDumpable(
             ScrimShadeTransitionController::class.java.simpleName,
             this::dump
         )
     }
 
-    fun onPanelStateChanged(@PanelState state: Int) {
+    private fun onPanelStateChanged(@PanelState state: Int) {
         currentPanelState = state
         onStateChanged()
     }
diff --git a/packages/SystemUI/src/com/android/systemui/shade/transition/ShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/shade/transition/ShadeTransitionController.kt
deleted file mode 100644
index 3a5c5e1..0000000
--- a/packages/SystemUI/src/com/android/systemui/shade/transition/ShadeTransitionController.kt
+++ /dev/null
@@ -1,132 +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.shade.transition
-
-import android.content.Context
-import android.content.res.Configuration
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.plugins.qs.QS
-import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor
-import com.android.systemui.scene.shared.flag.SceneContainerFlag
-import com.android.systemui.shade.PanelState
-import com.android.systemui.shade.ShadeExpansionChangeEvent
-import com.android.systemui.shade.ShadeExpansionStateManager
-import com.android.systemui.shade.ShadeViewController
-import com.android.systemui.shade.panelStateToString
-import com.android.systemui.statusbar.StatusBarState
-import com.android.systemui.statusbar.SysuiStatusBarStateController
-import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
-import com.android.systemui.statusbar.policy.ConfigurationController
-import com.android.systemui.statusbar.policy.SplitShadeStateController
-import dagger.Lazy
-import java.io.PrintWriter
-import javax.inject.Inject
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
-
-/** Controls the shade expansion transition on non-lockscreen. */
-@SysUISingleton
-class ShadeTransitionController
-@Inject
-constructor(
-    @Application private val applicationScope: CoroutineScope,
-    configurationController: ConfigurationController,
-    shadeExpansionStateManager: ShadeExpansionStateManager,
-    dumpManager: DumpManager,
-    private val context: Context,
-    private val scrimShadeTransitionController: ScrimShadeTransitionController,
-    private val statusBarStateController: SysuiStatusBarStateController,
-    private val splitShadeStateController: SplitShadeStateController,
-    private val panelExpansionInteractor: Lazy<PanelExpansionInteractor>,
-) {
-
-    lateinit var shadeViewController: ShadeViewController
-    lateinit var notificationStackScrollLayoutController: NotificationStackScrollLayoutController
-    lateinit var qs: QS
-
-    private var inSplitShade = false
-    private var currentPanelState: Int? = null
-    private var lastShadeExpansionChangeEvent: ShadeExpansionChangeEvent? = null
-
-    init {
-        updateResources()
-        configurationController.addCallback(
-            object : ConfigurationController.ConfigurationListener {
-                override fun onConfigChanged(newConfig: Configuration?) {
-                    updateResources()
-                }
-            }
-        )
-        if (SceneContainerFlag.isEnabled) {
-            applicationScope.launch {
-                panelExpansionInteractor.get().legacyPanelExpansion.collect { panelExpansion ->
-                    onPanelExpansionChanged(
-                        ShadeExpansionChangeEvent(
-                            fraction = panelExpansion,
-                            expanded = panelExpansion > 0f,
-                            tracking = true,
-                            dragDownPxAmount = 0f,
-                        )
-                    )
-                }
-            }
-        } else {
-            val currentState =
-                shadeExpansionStateManager.addExpansionListener(this::onPanelExpansionChanged)
-            onPanelExpansionChanged(currentState)
-            shadeExpansionStateManager.addStateListener(this::onPanelStateChanged)
-        }
-        dumpManager.registerCriticalDumpable("ShadeTransitionController") { printWriter, _ ->
-            dump(printWriter)
-        }
-    }
-
-    private fun updateResources() {
-        inSplitShade = splitShadeStateController.shouldUseSplitNotificationShade(context.resources)
-    }
-
-    private fun onPanelStateChanged(@PanelState state: Int) {
-        currentPanelState = state
-        scrimShadeTransitionController.onPanelStateChanged(state)
-    }
-
-    private fun onPanelExpansionChanged(event: ShadeExpansionChangeEvent) {
-        lastShadeExpansionChangeEvent = event
-        scrimShadeTransitionController.onPanelExpansionChanged(event)
-    }
-
-    private fun dump(pw: PrintWriter) {
-        pw.println(
-            """
-            ShadeTransitionController:
-                inSplitShade: $inSplitShade
-                isScreenUnlocked: ${isScreenUnlocked()}
-                currentPanelState: ${currentPanelState?.panelStateToString()}
-                lastPanelExpansionChangeEvent: $lastShadeExpansionChangeEvent
-                qs.isInitialized: ${this::qs.isInitialized}
-                npvc.isInitialized: ${this::shadeViewController.isInitialized}
-                nssl.isInitialized: ${this::notificationStackScrollLayoutController.isInitialized}
-            """
-                .trimIndent()
-        )
-    }
-
-    private fun isScreenUnlocked() =
-        statusBarStateController.currentOrUpcomingState == StatusBarState.SHADE
-}
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 1191c0f..72a9c8d 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
@@ -30,6 +30,7 @@
 import com.android.systemui.res.R
 import com.android.systemui.shade.domain.interactor.PrivacyChipInteractor
 import com.android.systemui.shade.domain.interactor.ShadeHeaderClockInteractor
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
 import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
 import java.util.Date
@@ -53,6 +54,7 @@
 constructor(
     @Application private val applicationScope: CoroutineScope,
     context: Context,
+    shadeInteractor: ShadeInteractor,
     mobileIconsInteractor: MobileIconsInteractor,
     val mobileIconsViewModel: MobileIconsViewModel,
     private val privacyChipInteractor: PrivacyChipInteractor,
@@ -85,6 +87,12 @@
     /** Whether or not the privacy chip is enabled in the device privacy config. */
     val isPrivacyChipEnabled: StateFlow<Boolean> = privacyChipInteractor.isChipEnabled
 
+    /** Whether or not the Shade Header should be disabled based on disableFlags. */
+    val isDisabled: StateFlow<Boolean> =
+        shadeInteractor.isQsEnabled
+            .map { !it }
+            .stateIn(applicationScope, SharingStarted.WhileSubscribed(), false)
+
     private val longerPattern = context.getString(R.string.abbrev_wday_month_day_no_year_alarm)
     private val shorterPattern = context.getString(R.string.abbrev_month_day_no_year)
     private val longerDateFormat = MutableStateFlow(getFormatFromPattern(longerPattern))
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
index 24b7533..980f665a 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
@@ -31,7 +31,9 @@
 import com.android.systemui.qs.FooterActionsController
 import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel
 import com.android.systemui.qs.ui.adapter.QSSceneAdapter
+import com.android.systemui.scene.domain.interactor.SceneInteractor
 import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.settings.brightness.ui.viewModel.BrightnessMirrorViewModel
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
@@ -52,14 +54,16 @@
 @Inject
 constructor(
     @Application private val applicationScope: CoroutineScope,
-    private val deviceEntryInteractor: DeviceEntryInteractor,
+    deviceEntryInteractor: DeviceEntryInteractor,
     val qsSceneAdapter: QSSceneAdapter,
     val shadeHeaderViewModel: ShadeHeaderViewModel,
     val notifications: NotificationsPlaceholderViewModel,
+    val brightnessMirrorViewModel: BrightnessMirrorViewModel,
     val mediaDataManager: MediaDataManager,
     shadeInteractor: ShadeInteractor,
     private val footerActionsViewModelFactory: FooterActionsViewModel.Factory,
     private val footerActionsController: FooterActionsController,
+    private val sceneInteractor: SceneInteractor,
 ) {
     val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> =
         combine(
@@ -103,7 +107,13 @@
     val shadeMode: StateFlow<ShadeMode> = shadeInteractor.shadeMode
 
     /** Notifies that some content in the shade was clicked. */
-    fun onContentClicked() = deviceEntryInteractor.attemptDeviceEntry()
+    fun onContentClicked() {
+        if (!isClickable.value) {
+            return
+        }
+
+        sceneInteractor.changeScene(Scenes.Lockscreen, "Shade empty content clicked")
+    }
 
     fun isMediaVisible(): Boolean {
         // TODO(b/296122467): handle updates to carousel visibility while scene is still visible
diff --git a/packages/SystemUI/src/com/android/systemui/startable/Dependencies.kt b/packages/SystemUI/src/com/android/systemui/startable/Dependencies.kt
index 5e57f1d..8eed097 100644
--- a/packages/SystemUI/src/com/android/systemui/startable/Dependencies.kt
+++ b/packages/SystemUI/src/com/android/systemui/startable/Dependencies.kt
@@ -27,4 +27,4 @@
 @MustBeDocumented
 @Target(AnnotationTarget.CLASS)
 @Retention(AnnotationRetention.RUNTIME)
-annotation class Dependencies(vararg val value: KClass<out CoreStartable> = [])
+annotation class Dependencies(vararg val value: KClass<*> = [])
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
index 0715dfc..8d9fab1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
@@ -117,9 +117,9 @@
         mShowingEntry = entry;
 
         if (mShowingEntry != null) {
-            CharSequence text = entry.headsUpStatusBarText;
-            if (entry.isSensitive()) {
-                text = entry.headsUpStatusBarTextPublic;
+            CharSequence text = entry.getHeadsUpStatusBarText().getValue();
+            if (entry.isSensitive().getValue()) {
+                text = entry.getHeadsUpStatusBarTextPublic().getValue();
             }
             mTextView.setText(text);
             mShowingEntry.addOnSensitivityChangedListener(mOnSensitivityChangedListener);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
index d6858ca..78e108d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
@@ -40,6 +40,7 @@
 import android.os.Looper;
 import android.os.RemoteException;
 import android.text.Editable;
+import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.util.Log;
 import android.util.Pair;
@@ -57,6 +58,7 @@
 import android.view.View.AccessibilityDelegate;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.view.WindowInsets;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.widget.Button;
@@ -104,6 +106,7 @@
 
     private WindowManager mWindowManager;
     private EditText mSearchEditText;
+    private ImageButton mEditTextCancel;
     private String mQueryString;
     private int mCurrentCategoryIndex = 0;
     private Map<Integer, Boolean> mKeySearchResultMap = new HashMap<>();
@@ -143,7 +146,7 @@
     @VisibleForTesting
     KeyboardShortcutListSearch(Context context, WindowManager windowManager) {
         this.mContext = new ContextThemeWrapper(
-                context, android.R.style.Theme_DeviceDefault_Settings);
+                context, R.style.KeyboardShortcutHelper);
         this.mPackageManager = AppGlobals.getPackageManager();
         if (windowManager != null) {
             this.mWindowManager = windowManager;
@@ -853,13 +856,14 @@
             List<List<KeyboardShortcutMultiMappingGroup>> keyboardShortcutMultiMappingGroupList) {
         mQueryString = null;
         LayoutInflater inflater = mContext.getSystemService(LayoutInflater.class);
-        mKeyboardShortcutsBottomSheetDialog =
-                new BottomSheetDialog(mContext);
+        mKeyboardShortcutsBottomSheetDialog  = new BottomSheetDialog(mContext);
         final View keyboardShortcutsView = inflater.inflate(
                 R.layout.keyboard_shortcuts_search_view, null);
         LinearLayout shortcutsContainer = keyboardShortcutsView.findViewById(
                 R.id.keyboard_shortcuts_container);
         mNoSearchResults = keyboardShortcutsView.findViewById(R.id.shortcut_search_no_result);
+        Window keyboardShortcutsWindow = mKeyboardShortcutsBottomSheetDialog.getWindow();
+        setWindowProperties(keyboardShortcutsWindow);
         mKeyboardShortcutsBottomSheetDialog.setContentView(keyboardShortcutsView);
         setButtonsDefaultStatus(keyboardShortcutsView);
         populateCurrentAppButton();
@@ -874,25 +878,11 @@
         }
 
         BottomSheetBehavior<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet);
+        behavior.setDraggable(true);
         behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
         behavior.setSkipCollapsed(true);
-        behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
-                    @Override
-                    public void onStateChanged(@NonNull View bottomSheet, int newState) {
-                        if (newState == BottomSheetBehavior.STATE_DRAGGING) {
-                            behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
-                        }
-                    }
 
-                    @Override
-                    public void onSlide(@NonNull View bottomSheet, float slideOffset) {
-                        // Do nothing.
-                    }
-                });
 
-        mKeyboardShortcutsBottomSheetDialog.setCanceledOnTouchOutside(true);
-        Window keyboardShortcutsWindow = mKeyboardShortcutsBottomSheetDialog.getWindow();
-        keyboardShortcutsWindow.setType(TYPE_SYSTEM_DIALOG);
         synchronized (sLock) {
             // show KeyboardShortcutsBottomSheetDialog only if it has not been dismissed already
             if (sInstance != null) {
@@ -908,6 +898,8 @@
             }
         }
         mSearchEditText = keyboardShortcutsView.findViewById(R.id.keyboard_shortcuts_search);
+        mEditTextCancel = keyboardShortcutsView.findViewById(
+                R.id.keyboard_shortcuts_search_cancel);
         mSearchEditText.addTextChangedListener(
                 new TextWatcher() {
                     @Override
@@ -921,6 +913,8 @@
                             shortcutsContainer.setAccessibilityPaneTitle(mContext.getString(
                                     R.string.keyboard_shortcut_a11y_show_search_results));
                         }
+                        mEditTextCancel.setVisibility(
+                                TextUtils.isEmpty(mQueryString) ? View.GONE : View.VISIBLE);
                     }
 
                     @Override
@@ -933,9 +927,28 @@
                         // Do nothing.
                     }
                 });
-        ImageButton editTextCancel = keyboardShortcutsView.findViewById(
-                R.id.keyboard_shortcuts_search_cancel);
-        editTextCancel.setOnClickListener(v -> mSearchEditText.setText(null));
+
+        mEditTextCancel.setOnClickListener(v -> mSearchEditText.setText(null));
+    }
+
+    private static void setWindowProperties(Window keyboardShortcutsWindow) {
+        keyboardShortcutsWindow.setType(TYPE_SYSTEM_DIALOG);
+        WindowManager.LayoutParams params = new WindowManager.LayoutParams();
+        params.copyFrom(keyboardShortcutsWindow.getAttributes());
+        // Allows the bottom sheet dialog to render all the way to the bottom of the screen,
+        // behind the gesture navigation bar.
+        params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
+        params.setFitInsetsTypes(WindowInsets.Type.statusBars());
+        keyboardShortcutsWindow.setAttributes(params);
+        keyboardShortcutsWindow.getDecorView().setOnApplyWindowInsetsListener((v, insets) -> {
+            int bottom = insets.getInsets(WindowInsets.Type.navigationBars()).bottom;
+            View container = v.findViewById(R.id.keyboard_shortcuts_container);
+            container.setPadding(container.getPaddingLeft(), container.getPaddingTop(),
+                    container.getPaddingRight(), bottom);
+            return WindowInsets.CONSUMED;
+        });
+        keyboardShortcutsWindow.setWindowAnimations(
+                R.style.KeyboardShortcutHelper_BottomSheetDialogAnimation);
     }
 
     private void populateKeyboardShortcutSearchList(LinearLayout keyboardShortcutsLayout) {
@@ -1256,10 +1269,10 @@
         if (mContext.getResources().getConfiguration().orientation
                 == Configuration.ORIENTATION_PORTRAIT) {
             lp.width = (int) (display.getWidth() * 0.8);
-            lp.height = (int) (display.getHeight() * 0.7);
+            lp.height = (int) (display.getHeight() * 0.8);
         } else {
             lp.width = (int) (display.getWidth() * 0.7);
-            lp.height = (int) (display.getHeight() * 0.8);
+            lp.height = (int) (display.getHeight() * 0.95);
         }
         window.setGravity(Gravity.BOTTOM);
         window.setAttributes(lp);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
index fc1dc62..519d719 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
@@ -396,7 +396,7 @@
             }
             if (view is ExpandableNotificationRow) {
                 // Only drag down on sensitive views, otherwise the ExpandHelper will take this
-                return view.entry.isSensitive
+                return view.entry.isSensitive.value
             }
         }
         return false
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
index 5f0b298..307e702 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
@@ -41,7 +41,6 @@
 import android.view.ViewParent;
 import android.widget.RemoteViews;
 import android.widget.RemoteViews.InteractionHandler;
-import android.widget.TextView;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -473,25 +472,7 @@
             // if we still didn't find a view that is attached, let's abort.
             return false;
         }
-        int width = view.getWidth();
-        if (view instanceof TextView) {
-            // Center the reveal on the text which might be off-center from the TextView
-            TextView tv = (TextView) view;
-            if (tv.getLayout() != null) {
-                int innerWidth = (int) tv.getLayout().getLineWidth(0);
-                innerWidth += tv.getCompoundPaddingLeft() + tv.getCompoundPaddingRight();
-                width = Math.min(width, innerWidth);
-            }
-        }
-        int cx = view.getLeft() + width / 2;
-        int cy = view.getTop() + view.getHeight() / 2;
-        int w = riv.getWidth();
-        int h = riv.getHeight();
-        int r = Math.max(
-                Math.max(cx + cy, cx + (h - cy)),
-                Math.max((w - cx) + cy, (w - cx) + (h - cy)));
 
-        riv.getController().setRevealParams(new RemoteInputView.RevealParams(cx, cy, r));
         riv.getController().setPendingIntent(pendingIntent);
         riv.getController().setRemoteInput(input);
         riv.getController().setRemoteInputs(inputs);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameView.java b/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameView.java
index 8d7fc98..acb5339 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameView.java
@@ -19,8 +19,6 @@
 import android.util.AttributeSet;
 import android.widget.TextView;
 
-import com.android.settingslib.WirelessUtils;
-
 /** Shows the operator name */
 public class OperatorNameView extends TextView {
     private boolean mDemoMode;
@@ -41,13 +39,14 @@
         mDemoMode = demoMode;
     }
 
-    void update(boolean showOperatorName,
+    void update(
+            boolean showOperatorName,
             boolean hasMobile,
+            boolean airplaneMode,
             OperatorNameViewController.SubInfo sub
     ) {
         setVisibility(showOperatorName ? VISIBLE : GONE);
 
-        boolean airplaneMode = WirelessUtils.isAirplaneModeOn(mContext);
         if (!hasMobile || airplaneMode) {
             setText(null);
             setVisibility(GONE);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameViewController.java
index 8afc72f..6e7d8f4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameViewController.java
@@ -16,11 +16,9 @@
 
 package com.android.systemui.statusbar;
 
-import android.annotation.NonNull;
 import android.os.Bundle;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.view.View;
 
@@ -28,47 +26,60 @@
 import com.android.keyguard.KeyguardUpdateMonitorCallback;
 import com.android.systemui.demomode.DemoModeCommandReceiver;
 import com.android.systemui.plugins.DarkIconDispatcher;
-import com.android.systemui.statusbar.connectivity.IconState;
-import com.android.systemui.statusbar.connectivity.NetworkController;
-import com.android.systemui.statusbar.connectivity.SignalCallback;
 import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
+import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor;
+import com.android.systemui.statusbar.pipeline.mobile.util.SubscriptionManagerProxy;
 import com.android.systemui.tuner.TunerService;
 import com.android.systemui.util.CarrierConfigTracker;
 import com.android.systemui.util.ViewController;
+import com.android.systemui.util.kotlin.JavaAdapter;
 
 import javax.inject.Inject;
 
+import kotlinx.coroutines.Job;
+
 /** Controller for {@link OperatorNameView}. */
 public class OperatorNameViewController extends ViewController<OperatorNameView> {
     private static final String KEY_SHOW_OPERATOR_NAME = "show_operator_name";
 
     private final DarkIconDispatcher mDarkIconDispatcher;
-    private final NetworkController mNetworkController;
     private final TunerService mTunerService;
     private final TelephonyManager mTelephonyManager;
     private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     private final CarrierConfigTracker mCarrierConfigTracker;
+    private final AirplaneModeInteractor mAirplaneModeInteractor;
+    private final SubscriptionManagerProxy mSubscriptionManagerProxy;
+    private final JavaAdapter mJavaAdapter;
+
+    private Job mAirplaneModeJob;
 
     private OperatorNameViewController(OperatorNameView view,
             DarkIconDispatcher darkIconDispatcher,
-            NetworkController networkController,
             TunerService tunerService,
             TelephonyManager telephonyManager,
             KeyguardUpdateMonitor keyguardUpdateMonitor,
-            CarrierConfigTracker carrierConfigTracker) {
+            CarrierConfigTracker carrierConfigTracker,
+            AirplaneModeInteractor airplaneModeInteractor,
+            SubscriptionManagerProxy subscriptionManagerProxy,
+            JavaAdapter javaAdapter) {
         super(view);
         mDarkIconDispatcher = darkIconDispatcher;
-        mNetworkController = networkController;
         mTunerService = tunerService;
         mTelephonyManager = telephonyManager;
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mCarrierConfigTracker = carrierConfigTracker;
+        mAirplaneModeInteractor = airplaneModeInteractor;
+        mSubscriptionManagerProxy = subscriptionManagerProxy;
+        mJavaAdapter = javaAdapter;
     }
 
     @Override
     protected void onViewAttached() {
         mDarkIconDispatcher.addDarkReceiver(mDarkReceiver);
-        mNetworkController.addCallback(mSignalCallback);
+        mAirplaneModeJob =
+                mJavaAdapter.alwaysCollectFlow(
+                        mAirplaneModeInteractor.isAirplaneMode(),
+                        (isAirplaneMode) -> update());
         mTunerService.addTunable(mTunable, KEY_SHOW_OPERATOR_NAME);
         mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback);
     }
@@ -76,7 +87,7 @@
     @Override
     protected void onViewDetached() {
         mDarkIconDispatcher.removeDarkReceiver(mDarkReceiver);
-        mNetworkController.removeCallback(mSignalCallback);
+        mAirplaneModeJob.cancel(null);
         mTunerService.removeTunable(mTunable);
         mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
     }
@@ -87,11 +98,17 @@
                 mCarrierConfigTracker
                         .getShowOperatorNameInStatusBarConfig(defaultSubInfo.getSubId())
                         && (mTunerService.getValue(KEY_SHOW_OPERATOR_NAME, 1) != 0);
-        mView.update(showOperatorName, mTelephonyManager.isDataCapable(), getDefaultSubInfo());
+        mView.update(
+                showOperatorName,
+                mTelephonyManager.isDataCapable(),
+                mAirplaneModeInteractor.isAirplaneMode().getValue(),
+                getDefaultSubInfo()
+        );
     }
 
     private SubInfo getDefaultSubInfo() {
-        int defaultSubId = SubscriptionManager.getDefaultDataSubscriptionId();
+        int defaultSubId = mSubscriptionManagerProxy.getDefaultDataSubscriptionId();
+
         SubscriptionInfo sI = mKeyguardUpdateMonitor.getSubscriptionInfoForSubId(defaultSubId);
         return new SubInfo(
                 sI.getSubscriptionId(),
@@ -103,36 +120,44 @@
     /** Factory for constructing an {@link OperatorNameViewController}. */
     public static class Factory {
         private final DarkIconDispatcher mDarkIconDispatcher;
-        private final NetworkController mNetworkController;
         private final TunerService mTunerService;
         private final TelephonyManager mTelephonyManager;
         private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
         private final CarrierConfigTracker mCarrierConfigTracker;
+        private final AirplaneModeInteractor mAirplaneModeInteractor;
+        private final SubscriptionManagerProxy mSubscriptionManagerProxy;
+        private final JavaAdapter mJavaAdapter;
 
         @Inject
         public Factory(DarkIconDispatcher darkIconDispatcher,
-                NetworkController networkController,
                 TunerService tunerService,
                 TelephonyManager telephonyManager,
                 KeyguardUpdateMonitor keyguardUpdateMonitor,
-                CarrierConfigTracker carrierConfigTracker) {
+                CarrierConfigTracker carrierConfigTracker,
+                AirplaneModeInteractor airplaneModeInteractor,
+                SubscriptionManagerProxy subscriptionManagerProxy,
+                JavaAdapter javaAdapter) {
             mDarkIconDispatcher = darkIconDispatcher;
-            mNetworkController = networkController;
             mTunerService = tunerService;
             mTelephonyManager = telephonyManager;
             mKeyguardUpdateMonitor = keyguardUpdateMonitor;
             mCarrierConfigTracker = carrierConfigTracker;
+            mAirplaneModeInteractor = airplaneModeInteractor;
+            mSubscriptionManagerProxy = subscriptionManagerProxy;
+            mJavaAdapter = javaAdapter;
         }
 
         /** Create an {@link OperatorNameViewController}. */
         public OperatorNameViewController create(OperatorNameView view) {
             return new OperatorNameViewController(view,
                     mDarkIconDispatcher,
-                    mNetworkController,
                     mTunerService,
                     mTelephonyManager,
                     mKeyguardUpdateMonitor,
-                    mCarrierConfigTracker);
+                    mCarrierConfigTracker,
+                    mAirplaneModeInteractor,
+                    mSubscriptionManagerProxy,
+                    mJavaAdapter);
         }
     }
 
@@ -149,13 +174,6 @@
             (area, darkIntensity, tint) ->
                     mView.setTextColor(DarkIconDispatcher.getTint(area, mView, tint));
 
-    private final SignalCallback mSignalCallback = new SignalCallback() {
-        @Override
-        public void setIsAirplaneMode(@NonNull IconState icon) {
-            update();
-        }
-    };
-
     private final TunerService.Tunable mTunable = (key, newValue) -> update();
 
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputNotificationRebuilder.java b/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputNotificationRebuilder.java
index 80c3551..321b608 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputNotificationRebuilder.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputNotificationRebuilder.java
@@ -71,6 +71,15 @@
     @NonNull
     public StatusBarNotification rebuildForCanceledSmartReplies(
             NotificationEntry entry) {
+        return rebuildWithExistingReplies(entry);
+    }
+
+    /**
+     * Rebuilds to include any previously-added remote input replies.
+     * For when the app cancels a notification that has already been lifetime extended.
+     */
+    @NonNull
+    public StatusBarNotification rebuildWithExistingReplies(NotificationEntry entry) {
         return rebuildWithRemoteInputInserted(entry, null /* remoteInputText */,
                 false /* showSpinner */, null /* mimeType */, null /* uri */);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index bb6ee24..f8193a4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -57,6 +57,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.statusbar.StatusBarIcon;
 import com.android.internal.util.ContrastColorUtil;
+import com.android.systemui.Flags;
 import com.android.systemui.res.R;
 import com.android.systemui.statusbar.notification.NotificationContentDescription;
 import com.android.systemui.statusbar.notification.NotificationDozeHelper;
@@ -208,6 +209,10 @@
         initializeDecorColor();
         reloadDimens();
         maybeUpdateIconScaleDimens();
+
+        if (Flags.statusBarMonochromeIconsFix()) {
+            setCropToPadding(true);
+        }
     }
 
     /** Should always be preceded by {@link #reloadDimens()} */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
index e0dd7f0..aa6bec1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -46,6 +46,9 @@
 import com.android.systemui.DejankUtils;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor;
+import com.android.systemui.deviceentry.shared.model.DeviceUnlockStatus;
+import com.android.systemui.keyguard.MigrateClocksToBlueprint;
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor;
 import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
 import com.android.systemui.res.R;
 import com.android.systemui.scene.domain.interactor.SceneInteractor;
@@ -108,6 +111,7 @@
     private final Lazy<ShadeInteractor> mShadeInteractorLazy;
     private final Lazy<DeviceUnlockedInteractor> mDeviceUnlockedInteractorLazy;
     private final Lazy<SceneInteractor> mSceneInteractorLazy;
+    private final Lazy<KeyguardClockInteractor> mKeyguardClockInteractorLazy;
     private int mState;
     private int mLastState;
     private int mUpcomingState;
@@ -173,13 +177,15 @@
             JavaAdapter javaAdapter,
             Lazy<ShadeInteractor> shadeInteractorLazy,
             Lazy<DeviceUnlockedInteractor> deviceUnlockedInteractorLazy,
-            Lazy<SceneInteractor> sceneInteractorLazy) {
+            Lazy<SceneInteractor> sceneInteractorLazy,
+            Lazy<KeyguardClockInteractor> keyguardClockInteractorLazy) {
         mUiEventLogger = uiEventLogger;
         mInteractionJankMonitor = interactionJankMonitor;
         mJavaAdapter = javaAdapter;
         mShadeInteractorLazy = shadeInteractorLazy;
         mDeviceUnlockedInteractorLazy = deviceUnlockedInteractorLazy;
         mSceneInteractorLazy = sceneInteractorLazy;
+        mKeyguardClockInteractorLazy = keyguardClockInteractorLazy;
         for (int i = 0; i < HISTORY_SIZE; i++) {
             mHistoricalRecords[i] = new HistoricalState();
         }
@@ -193,7 +199,7 @@
         if (SceneContainerFlag.isEnabled()) {
             mJavaAdapter.alwaysCollectFlow(
                     combineFlows(
-                        mDeviceUnlockedInteractorLazy.get().isDeviceUnlocked(),
+                        mDeviceUnlockedInteractorLazy.get().getDeviceUnlockStatus(),
                         mSceneInteractorLazy.get().getCurrentScene(),
                         this::calculateStateFromSceneFramework),
                     this::onStatusBarStateChanged);
@@ -461,6 +467,10 @@
 
     /** Returns the id of the currently rendering clock */
     public String getClockId() {
+        if (MigrateClocksToBlueprint.isEnabled()) {
+            return mKeyguardClockInteractorLazy.get().getRenderedClockId();
+        }
+
         if (mClockSwitchView == null) {
             Log.e(TAG, "Clock container was missing");
             return KeyguardClockSwitch.MISSING_CLOCK_ID;
@@ -637,11 +647,11 @@
     }
 
     private int calculateStateFromSceneFramework(
-            boolean isDeviceUnlocked,
+            DeviceUnlockStatus deviceUnlockStatus,
             SceneKey currentScene) {
         SceneContainerFlag.isUnexpectedlyInLegacyMode();
 
-        if (isDeviceUnlocked) {
+        if (deviceUnlockStatus.isUnlocked()) {
             return StatusBarState.SHADE;
         } else {
             return Preconditions.checkNotNull(sStatusBarStateByLockedSceneKey.get(currentScene));
@@ -664,7 +674,8 @@
             Scenes.Bouncer, StatusBarState.KEYGUARD,
             Scenes.Communal, StatusBarState.KEYGUARD,
             Scenes.Shade, StatusBarState.SHADE_LOCKED,
-            Scenes.QuickSettings, StatusBarState.SHADE_LOCKED
+            Scenes.QuickSettings, StatusBarState.SHADE_LOCKED,
+            Scenes.Gone, StatusBarState.SHADE
     );
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
index 8104755..d2fe20d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
@@ -23,6 +23,7 @@
 
 import com.android.systemui.CoreStartable;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.startable.Dependencies;
 import com.android.systemui.statusbar.phone.CentralSurfaces;
 
 import java.lang.annotation.Retention;
@@ -30,6 +31,7 @@
 /**
  * Sends updates to {@link StateListener}s about changes to the status bar state and dozing state
  */
+@Dependencies(CentralSurfaces.class)
 public interface SysuiStatusBarStateController extends StatusBarStateController, CoreStartable {
 
     // TODO: b/115739177 (remove this explicit ordering if we can)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/ConnectivityModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/ConnectivityModule.kt
index c4d9cbf..7a7cb7d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/ConnectivityModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/ConnectivityModule.kt
@@ -123,7 +123,7 @@
                         labelRes = R.string.airplane_mode,
                     ),
                 instanceId = uiEventLogger.getNewInstanceId(),
-                policy = QSTilePolicy.Restricted(UserManager.DISALLOW_AIRPLANE_MODE),
+                policy = QSTilePolicy.Restricted(listOf(UserManager.DISALLOW_AIRPLANE_MODE)),
             )
 
         /** Inject AirplaneModeTile into tileViewModelMap in QSModule */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
index f960fca..e5b6497 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
@@ -35,9 +35,11 @@
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.media.controls.domain.pipeline.MediaDataManager;
 import com.android.systemui.power.domain.interactor.PowerInteractor;
+import com.android.systemui.scene.shared.flag.SceneContainerFlags;
 import com.android.systemui.settings.DisplayTracker;
 import com.android.systemui.shade.NotificationPanelViewController;
 import com.android.systemui.shade.ShadeSurface;
+import com.android.systemui.shade.ShadeSurfaceImpl;
 import com.android.systemui.shade.carrier.ShadeCarrierGroupController;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.NotificationClickNotifier;
@@ -59,6 +61,8 @@
 import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 
+import javax.inject.Provider;
+
 import dagger.Binds;
 import dagger.Lazy;
 import dagger.Module;
@@ -178,9 +182,20 @@
      * The {@link com.android.systemui.shade.ShadeViewController} interface is bound in
      * {@link com.android.systemui.shade.ShadeModule} so others can access it.
      */
-    @Binds
+    @Provides
     @SysUISingleton
-    ShadeSurface provideShadeSurface(NotificationPanelViewController impl);
+    static ShadeSurface provideShadeSurface(
+            SceneContainerFlags sceneContainerFlags,
+            Provider<ShadeSurfaceImpl> sceneContainerOn,
+            Provider<NotificationPanelViewController> sceneContainerOff) {
+        if (sceneContainerFlags.isEnabled()) {
+            return sceneContainerOn.get();
+        } else {
+            return sceneContainerOff.get();
+        }
+
+    }
+
 
     /** */
     @Binds
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 0fd0555..c29a64e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt
@@ -36,6 +36,7 @@
 import android.view.ContextThemeWrapper
 import android.view.View
 import android.view.ViewGroup
+import androidx.annotation.VisibleForTesting
 import com.android.keyguard.KeyguardUpdateMonitor
 import com.android.settingslib.Utils
 import com.android.systemui.Dumpable
@@ -45,6 +46,7 @@
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.flags.FeatureFlags
 import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.WakefulnessLifecycle
 import com.android.systemui.plugins.ActivityStarter
 import com.android.systemui.plugins.BcSmartspaceConfigPlugin
 import com.android.systemui.plugins.BcSmartspaceDataPlugin
@@ -95,6 +97,7 @@
         private val deviceProvisionedController: DeviceProvisionedController,
         private val bypassController: KeyguardBypassController,
         private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
+        private val wakefulnessLifecycle: WakefulnessLifecycle,
         private val dumpManager: DumpManager,
         private val execution: Execution,
         @Main private val uiExecutor: Executor,
@@ -123,7 +126,7 @@
     private val recentSmartspaceData: Deque<List<SmartspaceTarget>> = LinkedList()
 
     // Smartspace can be used on multiple displays, such as when the user casts their screen
-    private var smartspaceViews = mutableSetOf<SmartspaceView>()
+    @VisibleForTesting var smartspaceViews = mutableSetOf<SmartspaceView>()
     private var regionSamplers =
             mutableMapOf<SmartspaceView, RegionSampler>()
 
@@ -272,6 +275,18 @@
             }
         }
 
+    // TODO(b/331451011): Refactor to viewmodel and use interactor pattern.
+    private val wakefulnessLifecycleObserver =
+        object : WakefulnessLifecycle.Observer {
+            override fun onStartedWakingUp() {
+                smartspaceViews.forEach { it.setScreenOn(true) }
+            }
+
+            override fun onFinishedGoingToSleep() {
+                smartspaceViews.forEach { it.setScreenOn(false) }
+            }
+        }
+
     init {
         deviceProvisionedController.addCallback(deviceProvisionedListener)
         dumpManager.registerDumpable(this)
@@ -451,6 +466,7 @@
         configurationController.addCallback(configChangeListener)
         statusBarStateController.addCallback(statusBarStateListener)
         bypassController.registerOnBypassStateChangedListener(bypassStateChangedListener)
+        wakefulnessLifecycle.addObserver(wakefulnessLifecycleObserver)
 
         datePlugin?.registerSmartspaceEventNotifier { e -> session?.notifySmartspaceEvent(e) }
         weatherPlugin?.registerSmartspaceEventNotifier { e -> session?.notifySmartspaceEvent(e) }
@@ -493,6 +509,7 @@
         configurationController.removeCallback(configChangeListener)
         statusBarStateController.removeCallback(statusBarStateListener)
         bypassController.unregisterOnBypassStateChangedListener(bypassStateChangedListener)
+        wakefulnessLifecycle.removeObserver(wakefulnessLifecycleObserver)
         session = null
 
         datePlugin?.registerSmartspaceEventNotifier(null)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorController.kt
index eb0870a..2b7df7d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorController.kt
@@ -75,6 +75,8 @@
     private val notificationEntry = notification.entry
     private val notificationKey = notificationEntry.sbn.key
 
+    override val isLaunching: Boolean = true
+
     override var transitionContainer: ViewGroup
         get() = notification.rootView as ViewGroup
         set(ignored) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
index 7c71864..4c66f66 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
@@ -23,7 +23,9 @@
 import com.android.app.animation.Interpolators
 import com.android.app.animation.InterpolatorsAndroidX
 import com.android.systemui.Dumpable
+import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.shade.ShadeExpansionChangeEvent
@@ -47,11 +49,14 @@
 import javax.inject.Inject
 import kotlin.math.max
 import kotlin.math.min
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
 
 @SysUISingleton
 class NotificationWakeUpCoordinator
 @Inject
 constructor(
+    @Application applicationScope: CoroutineScope,
     dumpManager: DumpManager,
     private val mHeadsUpManager: HeadsUpManager,
     private val statusBarStateController: StatusBarStateController,
@@ -60,6 +65,7 @@
     private val screenOffAnimationController: ScreenOffAnimationController,
     private val logger: NotificationWakeUpCoordinatorLogger,
     private val notifsKeyguardInteractor: NotificationsKeyguardInteractor,
+    private val communalInteractor: CommunalInteractor,
 ) :
     OnHeadsUpChangedListener,
     StatusBarStateController.StateListener,
@@ -201,6 +207,13 @@
                 }
             }
         )
+        applicationScope.launch {
+            communalInteractor.isIdleOnCommunal.collect {
+                if (!overrideDozeAmountIfCommunalShowing()) {
+                    maybeClearHardDozeAmountOverrideHidingNotifs()
+                }
+            }
+        }
     }
 
     fun setStackScroller(stackScrollerController: NotificationStackScrollLayoutController) {
@@ -302,6 +315,10 @@
             return
         }
 
+        if (overrideDozeAmountIfCommunalShowing()) {
+            return
+        }
+
         if (clearHardDozeAmountOverride()) {
             return
         }
@@ -311,9 +328,12 @@
 
     private fun setHardDozeAmountOverride(dozing: Boolean, source: String) {
         logger.logSetDozeAmountOverride(dozing = dozing, source = source)
+        val previousOverride = hardDozeAmountOverride
         hardDozeAmountOverride = if (dozing) 1f else 0f
         hardDozeAmountOverrideSource = source
-        updateDozeAmount()
+        if (previousOverride != hardDozeAmountOverride) {
+            updateDozeAmount()
+        }
     }
 
     private fun clearHardDozeAmountOverride(): Boolean {
@@ -434,6 +454,11 @@
             return
         }
 
+        if (overrideDozeAmountIfCommunalShowing()) {
+            this.state = newState
+            return
+        }
+
         maybeClearHardDozeAmountOverrideHidingNotifs()
 
         this.state = newState
@@ -471,6 +496,18 @@
         return false
     }
 
+    private fun overrideDozeAmountIfCommunalShowing(): Boolean {
+        if (communalInteractor.isIdleOnCommunal.value) {
+            if (statusBarStateController.state == StatusBarState.KEYGUARD) {
+                setHardDozeAmountOverride(dozing = true, source = "Override: communal (keyguard)")
+            } else {
+                setHardDozeAmountOverride(dozing = false, source = "Override: communal (shade)")
+            }
+            return true
+        }
+        return false
+    }
+
     /**
      * If the last [setDozeAmount] call was an override to hide notifications, then this call will
      * check for the set of states that may have caused that override, and if none of them still
@@ -483,20 +520,23 @@
             val onKeyguard = statusBarStateController.state == StatusBarState.KEYGUARD
             val dozing = statusBarStateController.isDozing
             val bypass = bypassController.bypassEnabled
+            val idleOnCommunal = communalInteractor.isIdleOnCommunal.value
             val animating =
                 screenOffAnimationController.overrideNotificationsFullyDozingOnKeyguard()
-            // Overrides are set by [overrideDozeAmountIfAnimatingScreenOff] and
-            // [overrideDozeAmountIfBypass] based on 'animating' and 'bypass' respectively, so only
-            // clear the override if both those conditions are cleared.  But also require either
+            // Overrides are set by [overrideDozeAmountIfAnimatingScreenOff],
+            // [overrideDozeAmountIfBypass] and [overrideDozeAmountIfCommunalShowing] based on
+            // 'animating', 'bypass' and 'idleOnCommunal' respectively, so only clear the override
+            // if all of those conditions are cleared.  But also require either
             // !dozing or !onKeyguard because those conditions should indicate that we intend
             // notifications to be visible, and thus it is safe to unhide them.
-            val willRemove = (!onKeyguard || !dozing) && !bypass && !animating
+            val willRemove = (!onKeyguard || !dozing) && !bypass && !animating && !idleOnCommunal
             logger.logMaybeClearHardDozeAmountOverrideHidingNotifs(
                 willRemove = willRemove,
                 onKeyguard = onKeyguard,
                 dozing = dozing,
                 bypass = bypass,
                 animating = animating,
+                idleOnCommunal = idleOnCommunal,
             )
             if (willRemove) {
                 clearHardDozeAmountOverride()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt
index 502e1d9..9619bea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt
@@ -95,6 +95,7 @@
         onKeyguard: Boolean,
         dozing: Boolean,
         bypass: Boolean,
+        idleOnCommunal: Boolean,
         animating: Boolean,
     ) {
         buffer.log(
@@ -103,7 +104,7 @@
             {
                 str1 =
                     "willRemove=$willRemove onKeyguard=$onKeyguard dozing=$dozing" +
-                        " bypass=$bypass animating=$animating"
+                        " bypass=$bypass animating=$animating idleOnCommunal=$idleOnCommunal"
             },
             { "maybeClearHardDozeAmountOverrideHidingNotifs() $str1" }
         )
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 8cdf60b..9ce38db 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
@@ -76,6 +76,10 @@
 import java.util.List;
 import java.util.Objects;
 
+import kotlinx.coroutines.flow.MutableStateFlow;
+import kotlinx.coroutines.flow.StateFlow;
+import kotlinx.coroutines.flow.StateFlowKt;
+
 /**
  * Represents a notification that the system UI knows about
  *
@@ -150,8 +154,11 @@
     public CharSequence remoteInputTextWhenReset;
     public long lastRemoteInputSent = NOT_LAUNCHED_YET;
     public final ArraySet<Integer> mActiveAppOps = new ArraySet<>(3);
-    public CharSequence headsUpStatusBarText;
-    public CharSequence headsUpStatusBarTextPublic;
+
+    private final MutableStateFlow<CharSequence> mHeadsUpStatusBarText =
+            StateFlowKt.MutableStateFlow(null);
+    private final MutableStateFlow<CharSequence> mHeadsUpStatusBarTextPublic =
+            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)
@@ -162,8 +169,8 @@
      */
     private boolean hasSentReply;
 
-    private boolean mSensitive = true;
-    private ListenerSet<OnSensitivityChangedListener> mOnSensitivityChangedListeners =
+    private final MutableStateFlow<Boolean> mSensitive = StateFlowKt.MutableStateFlow(true);
+    private final ListenerSet<OnSensitivityChangedListener> mOnSensitivityChangedListeners =
             new ListenerSet<>();
 
     private boolean mPulseSupressed;
@@ -171,6 +178,9 @@
     private boolean mIsMarkedForUserTriggeredMovement;
     private boolean mIsHeadsUpEntry;
 
+    private boolean mHasEverBeenGroupSummary;
+    private boolean mHasEverBeenGroupChild;
+
     public boolean mRemoteEditImeAnimatingAway;
     public boolean mRemoteEditImeVisible;
     private boolean mExpandAnimationRunning;
@@ -217,6 +227,26 @@
         mIsDemoted = true;
     }
 
+    /** called when entry is currently a summary of a group */
+    public void markAsGroupSummary() {
+        mHasEverBeenGroupSummary = true;
+    }
+
+    /** whether this entry has ever been marked as a summary */
+    public boolean hasEverBeenGroupSummary() {
+        return mHasEverBeenGroupSummary;
+    }
+
+    /** called when entry is currently a child in a group */
+    public void markAsGroupChild() {
+        mHasEverBeenGroupChild = true;
+    }
+
+    /** whether this entry has ever been marked as a child */
+    public boolean hasEverBeenGroupChild() {
+        return mHasEverBeenGroupChild;
+    }
+
     /**
      * @param sbn the StatusBarNotification from system server
      * @param ranking also from system server
@@ -911,6 +941,11 @@
         return Objects.equals(n.category, category);
     }
 
+    /** @see #setSensitive(boolean, boolean)  */
+    public StateFlow<Boolean> isSensitive() {
+        return mSensitive;
+    }
+
     /**
      * Set this notification to be sensitive.
      *
@@ -919,8 +954,8 @@
      */
     public void setSensitive(boolean sensitive, boolean deviceSensitive) {
         getRow().setSensitive(sensitive, deviceSensitive);
-        if (sensitive != mSensitive) {
-            mSensitive = sensitive;
+        if (sensitive != mSensitive.getValue()) {
+            mSensitive.setValue(sensitive);
             for (NotificationEntry.OnSensitivityChangedListener listener :
                     mOnSensitivityChangedListeners) {
                 listener.onSensitivityChanged(this);
@@ -928,10 +963,6 @@
         }
     }
 
-    public boolean isSensitive() {
-        return mSensitive;
-    }
-
     /** Add a listener to be notified when the entry's sensitivity changes. */
     public void addOnSensitivityChangedListener(OnSensitivityChangedListener listener) {
         mOnSensitivityChangedListeners.addIfAbsent(listener);
@@ -942,6 +973,32 @@
         mOnSensitivityChangedListeners.remove(listener);
     }
 
+    /** @see #setHeadsUpStatusBarText(CharSequence) */
+    public StateFlow<CharSequence> getHeadsUpStatusBarText() {
+        return mHeadsUpStatusBarText;
+    }
+
+    /**
+     * Sets the text to be displayed on the StatusBar, when this notification is the top pinned
+     * heads up.
+     */
+    public void setHeadsUpStatusBarText(CharSequence headsUpStatusBarText) {
+        this.mHeadsUpStatusBarText.setValue(headsUpStatusBarText);
+    }
+
+    /** @see #setHeadsUpStatusBarTextPublic(CharSequence) */
+    public StateFlow<CharSequence> getHeadsUpStatusBarTextPublic() {
+        return mHeadsUpStatusBarTextPublic;
+    }
+
+    /**
+     * 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.
+     */
+    public void setHeadsUpStatusBarTextPublic(CharSequence headsUpStatusBarTextPublic) {
+        this.mHeadsUpStatusBarTextPublic.setValue(headsUpStatusBarTextPublic);
+    }
+
     public boolean isPulseSuppressed() {
         return mPulseSupressed;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/SortBySectionTimeFlag.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/SortBySectionTimeFlag.kt
new file mode 100644
index 0000000..09cb310
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/SortBySectionTimeFlag.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.collection
+
+import android.app.Flags;
+import com.android.systemui.flags.FlagToken
+import com.android.systemui.flags.RefactorFlagUtils
+
+/**
+ * Helper for android.app.Flags.FLAG_SORT_BY_SECTION_TIME
+ */
+@Suppress("NOTHING_TO_INLINE")
+object SortBySectionTimeFlag {
+    const val FLAG_NAME = Flags.FLAG_SORT_SECTION_BY_TIME
+
+    /** A token used for dependency declaration */
+    val token: FlagToken
+        get() = FlagToken(FLAG_NAME, isEnabled)
+
+    /** Are sections sorted by time? */
+    @JvmStatic
+    inline val isEnabled
+        get() = Flags.sortSectionByTime()
+
+    /**
+     * 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)
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt
index 1631ae2..3d0fd89 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt
@@ -19,6 +19,7 @@
 import com.android.systemui.statusbar.notification.collection.ListEntry
 import com.android.systemui.statusbar.notification.collection.NotifPipeline
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.collection.SortBySectionTimeFlag
 import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
 import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifComparator
@@ -80,11 +81,20 @@
         }
     }
 
+    // TODO(b/330193582): Rename to just "People"
     val peopleAlertingSectioner = object : NotifSectioner("People(alerting)", BUCKET_PEOPLE) {
-        override fun isInSection(entry: ListEntry): Boolean =
-               highPriorityProvider.isHighPriorityConversation(entry)
+        override fun isInSection(entry: ListEntry): Boolean  {
+            if (SortBySectionTimeFlag.isEnabled) {
+                return highPriorityProvider.isHighPriorityConversation(entry)
+                        || isConversation(entry)
+            } else {
+                return highPriorityProvider.isHighPriorityConversation(entry)
+            }
+        }
 
-        override fun getComparator(): NotifComparator = notifComparator
+        override fun getComparator(): NotifComparator? {
+            return if (SortBySectionTimeFlag.isEnabled) null else notifComparator
+        }
 
         override fun getHeaderNodeController(): NodeController? = conversationHeaderNodeController
     }
@@ -92,11 +102,20 @@
     val peopleSilentSectioner = object : NotifSectioner("People(silent)", BUCKET_PEOPLE) {
         // Because the peopleAlertingSectioner is above this one, it will claim all conversations that are alerting.
         // All remaining conversations must be silent.
-        override fun isInSection(entry: ListEntry): Boolean = isConversation(entry)
+        override fun isInSection(entry: ListEntry): Boolean {
+            SortBySectionTimeFlag.assertInLegacyMode()
+            return isConversation(entry)
+        }
 
-        override fun getComparator(): NotifComparator = notifComparator
+        override fun getComparator(): NotifComparator {
+            SortBySectionTimeFlag.assertInLegacyMode()
+            return notifComparator
+        }
 
-        override fun getHeaderNodeController(): NodeController? = conversationHeaderNodeController
+        override fun getHeaderNodeController(): NodeController? {
+            SortBySectionTimeFlag.assertInLegacyMode()
+            return conversationHeaderNodeController
+        }
     }
 
     override fun attach(pipeline: NotifPipeline) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt
index 8531eaa..1a223c1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt
@@ -18,6 +18,7 @@
 
 package com.android.systemui.statusbar.notification.collection.coordinator
 
+import android.os.SystemProperties
 import android.os.UserHandle
 import android.provider.Settings
 import androidx.annotation.VisibleForTesting
@@ -340,12 +341,41 @@
 
             var hasFilteredAnyNotifs = false
 
+            /**
+             * the [notificationMinimalismPrototype] will now show seen notifications on the locked
+             * shade by default, but this property read allows that to be quickly disabled for
+             * testing
+             */
+            private val minimalismShowOnLockedShade
+                get() =
+                    SystemProperties.getBoolean(
+                        "persist.notification_minimalism_prototype.show_on_locked_shade",
+                        true
+                    )
+
+            /**
+             * Encapsulates a definition of "being on the keyguard". Note that these two definitions
+             * are wildly different: [StatusBarState.KEYGUARD] is when on the lock screen and does
+             * not include shade or occluded states, whereas [KeyguardRepository.isKeyguardShowing]
+             * is any state where the keyguard has not been dismissed, including locked shade and
+             * occluded lock screen.
+             *
+             * Returning false for locked shade and occluded states means that this filter will
+             * allow seen notifications to appear in the locked shade.
+             */
+            private fun isOnKeyguard(): Boolean =
+                if (notificationMinimalismPrototype() && minimalismShowOnLockedShade) {
+                    statusBarStateController.state == StatusBarState.KEYGUARD
+                } else {
+                    keyguardRepository.isKeyguardShowing()
+                }
+
             override fun shouldFilterOut(entry: NotificationEntry, now: Long): Boolean =
                 when {
                     // Don't apply filter if the setting is disabled
                     !unseenFilterEnabled -> false
                     // Don't apply filter if the keyguard isn't currently showing
-                    !keyguardRepository.isKeyguardShowing() -> false
+                    !isOnKeyguard() -> false
                     // Don't apply the filter if the notification is unseen
                     unseenNotifications.contains(entry) -> false
                     // Don't apply the filter to (non-promoted) group summaries
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 b9d1dde..36c12a7 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
@@ -20,6 +20,7 @@
 import com.android.systemui.statusbar.notification.collection.NotifPipeline
 import com.android.systemui.statusbar.notification.collection.PipelineDumpable
 import com.android.systemui.statusbar.notification.collection.PipelineDumper
+import com.android.systemui.statusbar.notification.collection.SortBySectionTimeFlag
 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
@@ -114,17 +115,26 @@
         mOrderedSections.add(headsUpCoordinator.sectioner) // HeadsUp
         mOrderedSections.add(colorizedFgsCoordinator.sectioner) // ForegroundService
         mOrderedSections.add(conversationCoordinator.peopleAlertingSectioner) // People Alerting
-        mOrderedSections.add(conversationCoordinator.peopleSilentSectioner) // People Silent
+        if (!SortBySectionTimeFlag.isEnabled) {
+            mOrderedSections.add(conversationCoordinator.peopleSilentSectioner) // People Silent
+        }
         mOrderedSections.add(rankingCoordinator.alertingSectioner) // Alerting
         mOrderedSections.add(rankingCoordinator.silentSectioner) // Silent
         mOrderedSections.add(rankingCoordinator.minimizedSectioner) // Minimized
 
         sectionStyleProvider.setMinimizedSections(setOf(rankingCoordinator.minimizedSectioner))
-        sectionStyleProvider.setSilentSections(listOf(
-                conversationCoordinator.peopleSilentSectioner,
-                rankingCoordinator.silentSectioner,
-                rankingCoordinator.minimizedSectioner,
-        ))
+        if (SortBySectionTimeFlag.isEnabled) {
+            sectionStyleProvider.setSilentSections(listOf(
+                    rankingCoordinator.silentSectioner,
+                    rankingCoordinator.minimizedSectioner,
+            ))
+        } else {
+            sectionStyleProvider.setSilentSections(listOf(
+                    conversationCoordinator.peopleSilentSectioner,
+                    rankingCoordinator.silentSectioner,
+                    rankingCoordinator.minimizedSectioner,
+            ))
+        }
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java
index 7a7b184..9b075a6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java
@@ -49,6 +49,8 @@
 import com.android.systemui.statusbar.notification.collection.render.NotifViewController;
 import com.android.systemui.statusbar.notification.row.NotifInflationErrorManager;
 import com.android.systemui.statusbar.notification.row.NotifInflationErrorManager.NotifInflationErrorListener;
+import com.android.systemui.statusbar.notification.row.shared.AsyncGroupHeaderViewInflation;
+import com.android.systemui.statusbar.notification.row.shared.AsyncHybridViewInflation;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -273,10 +275,14 @@
 
     private void inflateRequiredGroupViews(GroupEntry groupEntry) {
         NotificationEntry summary = groupEntry.getSummary();
+        if (summary != null && AsyncGroupHeaderViewInflation.isEnabled()) {
+            summary.markAsGroupSummary();
+        }
         List<NotificationEntry> children = groupEntry.getChildren();
         inflateRequiredNotifViews(summary);
         for (int j = 0; j < children.size(); j++) {
             NotificationEntry child = children.get(j);
+            if (AsyncHybridViewInflation.isEnabled()) child.markAsGroupChild();
             boolean childShouldBeBound = j < mChildBindCutoff;
             if (childShouldBeBound) {
                 inflateRequiredNotifViews(child);
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 28fff15..fe59d73 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
@@ -127,6 +127,15 @@
                             mSmartReplyController.stopSending(entry)
                             mNotifUpdater.onInternalNotificationUpdate(newSbn,
                                     "Extending lifetime of notification with smart reply")
+                        } 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.")
                         }
                     } else {
                         // Notifications updated without FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt
index e4db4c7..ac2a0d8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt
@@ -16,12 +16,14 @@
 
 package com.android.systemui.statusbar.notification.collection.coordinator
 
+import android.app.Notification
 import android.os.UserHandle
 import com.android.keyguard.KeyguardUpdateMonitor
 import com.android.server.notification.Flags.screenshareNotificationHiding
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.statusbar.NotificationLockscreenUserManager
 import com.android.systemui.statusbar.StatusBarState
+import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter
 import com.android.systemui.statusbar.notification.DynamicPrivacyController
 import com.android.systemui.statusbar.notification.collection.GroupEntry
 import com.android.systemui.statusbar.notification.collection.ListEntry
@@ -67,6 +69,17 @@
         invalidateList("onSensitiveStateChanged")
     }
 
+    private val screenshareSecretFilter = object : NotifFilter("ScreenshareSecretFilter") {
+        val NotificationEntry.isSecret
+            get() = channel?.lockscreenVisibility == Notification.VISIBILITY_SECRET ||
+                sbn.notification?.visibility == Notification.VISIBILITY_SECRET
+        override fun shouldFilterOut(entry: NotificationEntry, now: Long): Boolean {
+            return screenshareNotificationHiding() &&
+                sensitiveNotificationProtectionController.isSensitiveStateActive &&
+                entry.isSecret
+        }
+    }
+
     override fun attach(pipeline: NotifPipeline) {
         dynamicPrivacyController.addListener(this)
         if (screenshareNotificationHiding()) {
@@ -75,6 +88,9 @@
         }
         pipeline.addOnBeforeRenderListListener(this)
         pipeline.addPreRenderInvalidator(this)
+        if (screenshareNotificationHiding()) {
+            pipeline.addFinalizeFilter(screenshareSecretFilter)
+        }
     }
 
     override fun onDynamicPrivacyChanged(): Unit = invalidateList("onDynamicPrivacyChanged")
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt
index c8ca63d..1511abd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt
@@ -17,6 +17,8 @@
 package com.android.systemui.statusbar.notification.collection.coordinator
 
 import com.android.app.tracing.traceSection
+import com.android.server.notification.Flags.screenshareNotificationHiding
+import com.android.systemui.Flags.screenshareNotificationHidingBugFix
 import com.android.systemui.statusbar.notification.collection.ListEntry
 import com.android.systemui.statusbar.notification.collection.NotifPipeline
 import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
@@ -29,6 +31,7 @@
 import com.android.systemui.statusbar.notification.shared.NotificationIconContainerRefactor
 import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT
 import com.android.systemui.statusbar.phone.NotificationIconAreaController
+import com.android.systemui.statusbar.policy.SensitiveNotificationProtectionController
 import javax.inject.Inject
 
 /**
@@ -43,6 +46,8 @@
     private val notificationIconAreaController: NotificationIconAreaController,
     private val renderListInteractor: RenderNotificationListInteractor,
     private val activeNotificationsInteractor: ActiveNotificationsInteractor,
+    private val sensitiveNotificationProtectionController:
+        SensitiveNotificationProtectionController,
 ) : Coordinator {
 
     override fun attach(pipeline: NotifPipeline) {
@@ -71,13 +76,16 @@
         var hasClearableAlertingNotifs = false
         var hasNonClearableSilentNotifs = false
         var hasClearableSilentNotifs = false
+        val isSensitiveContentProtectionActive = screenshareNotificationHiding() &&
+            screenshareNotificationHidingBugFix() &&
+            sensitiveNotificationProtectionController.isSensitiveStateActive
         entries.forEach {
             val section = checkNotNull(it.section) { "Null section for ${it.key}" }
             val entry = checkNotNull(it.representativeEntry) { "Null notif entry for ${it.key}" }
             val isSilent = section.bucket == BUCKET_SILENT
             // NOTE: NotificationEntry.isClearable will internally check group children to ensure
             //  the group itself definitively clearable.
-            val isClearable = entry.isClearable
+            val isClearable = !isSensitiveContentProtectionActive && entry.isClearable
             when {
                 isSilent && isClearable -> hasClearableSilentNotifs = true
                 isSilent && !isClearable -> hasNonClearableSilentNotifs = true
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 dfe6cd5..350e88e 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
@@ -24,6 +24,7 @@
 import androidx.annotation.VisibleForTesting;
 
 import com.android.systemui.Dumpable;
+import com.android.systemui.communal.domain.interactor.CommunalInteractor;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dump.DumpManager;
@@ -68,6 +69,7 @@
     private final VisibilityLocationProvider mVisibilityLocationProvider;
     private final VisualStabilityProvider mVisualStabilityProvider;
     private final WakefulnessLifecycle mWakefulnessLifecycle;
+    private final CommunalInteractor mCommunalInteractor;
 
     private boolean mSleepy = true;
     private boolean mFullyDozed;
@@ -75,6 +77,7 @@
     private boolean mPulsing;
     private boolean mNotifPanelCollapsing;
     private boolean mNotifPanelLaunchingActivity;
+    private boolean mCommunalShowing = false;
 
     private boolean mPipelineRunAllowed;
     private boolean mReorderingAllowed;
@@ -101,7 +104,8 @@
             StatusBarStateController statusBarStateController,
             VisibilityLocationProvider visibilityLocationProvider,
             VisualStabilityProvider visualStabilityProvider,
-            WakefulnessLifecycle wakefulnessLifecycle) {
+            WakefulnessLifecycle wakefulnessLifecycle,
+            CommunalInteractor communalInteractor) {
         mHeadsUpManager = headsUpManager;
         mShadeAnimationInteractor = shadeAnimationInteractor;
         mJavaAdapter = javaAdapter;
@@ -110,6 +114,7 @@
         mWakefulnessLifecycle = wakefulnessLifecycle;
         mStatusBarStateController = statusBarStateController;
         mDelayableExecutor = delayableExecutor;
+        mCommunalInteractor = communalInteractor;
 
         dumpManager.registerDumpable(this);
     }
@@ -126,6 +131,8 @@
                 this::onShadeOrQsClosingChanged);
         mJavaAdapter.alwaysCollectFlow(mShadeAnimationInteractor.isLaunchingActivity(),
                 this::onLaunchingActivityChanged);
+        mJavaAdapter.alwaysCollectFlow(mCommunalInteractor.isIdleOnCommunal(),
+                this::onCommunalShowingChanged);
 
         pipeline.setVisualStabilityManager(mNotifStabilityManager);
     }
@@ -231,7 +238,7 @@
     }
 
     private boolean isReorderingAllowed() {
-        return ((mFullyDozed && mSleepy) || !mPanelExpanded) && !mPulsing;
+        return ((mFullyDozed && mSleepy) || !mPanelExpanded || mCommunalShowing) && !mPulsing;
     }
 
     /**
@@ -315,6 +322,7 @@
         pw.println("  fullyDozed: " + mFullyDozed);
         pw.println("  panelExpanded: " + mPanelExpanded);
         pw.println("  pulsing: " + mPulsing);
+        pw.println("  communalShowing: " + mCommunalShowing);
         pw.println("isSuppressingPipelineRun: " + mIsSuppressingPipelineRun);
         pw.println("isSuppressingGroupChange: " + mIsSuppressingGroupChange);
         pw.println("isSuppressingEntryReorder: " + mIsSuppressingEntryReorder);
@@ -338,4 +346,9 @@
         mNotifPanelLaunchingActivity = isLaunchingActivity;
         updateAllowedStates("notifPanelLaunchingActivity", isLaunchingActivity);
     }
+
+    private void onCommunalShowingChanged(boolean isShowing) {
+        mCommunalShowing = isShowing;
+        updateAllowedStates("communalShowing", isShowing);
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustment.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustment.kt
index bab94b5..e70fb6b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustment.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustment.kt
@@ -52,11 +52,8 @@
             oldAdjustment.needsRedaction != newAdjustment.needsRedaction -> true
             areDifferent(oldAdjustment.smartActions, newAdjustment.smartActions) -> true
             newAdjustment.smartReplies != oldAdjustment.smartReplies -> true
-            // TODO(b/217799515): Here we decide whether to re-inflate the row on every group-status
-            //  change if we want to keep the single-line view, the following line should be:
-            //  !oldAdjustment.isChildInGroup && newAdjustment.isChildInGroup -> true
             AsyncHybridViewInflation.isEnabled &&
-                    oldAdjustment.isChildInGroup != newAdjustment.isChildInGroup -> true
+                    !oldAdjustment.isChildInGroup && newAdjustment.isChildInGroup -> true
             AsyncGroupHeaderViewInflation.isEnabled &&
                 !oldAdjustment.isGroupSummary && newAdjustment.isGroupSummary -> true
             else -> false
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt
index e0e5a35..4c2ef83 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProvider.kt
@@ -141,7 +141,7 @@
             lockscreenUserManager.needsRedaction(entry) ||
                 (screenshareNotificationHiding() &&
                     sensitiveNotifProtectionController.shouldProtectNotification(entry)),
-        isChildInGroup = entry.sbn.isAppOrSystemGroupChild,
-        isGroupSummary = entry.sbn.isAppOrSystemGroupSummary,
+        isChildInGroup = entry.hasEverBeenGroupChild(),
+        isGroupSummary = entry.hasEverBeenGroupSummary(),
     )
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt
index 5a3edf4..ea9f295 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt
@@ -18,8 +18,10 @@
 
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.statusbar.notification.collection.ListEntry
+import com.android.systemui.statusbar.notification.collection.SortBySectionTimeFlag
 import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
+import com.android.systemui.statusbar.notification.stack.BUCKET_PEOPLE
 import javax.inject.Inject
 
 /**
@@ -27,7 +29,8 @@
  * NOTE: This class exists to avoid putting metadata like "isMinimized" on the NotifSection
  */
 @SysUISingleton
-class SectionStyleProvider @Inject constructor() {
+class SectionStyleProvider @Inject constructor(
+        private val highPriorityProvider: HighPriorityProvider) {
     private lateinit var silentSections: Set<NotifSectioner>
     private lateinit var lowPrioritySections: Set<NotifSectioner>
 
@@ -76,6 +79,13 @@
     @JvmOverloads
     fun isSilent(entry: ListEntry, ifNotInSection: Boolean = true): Boolean {
         val section = entry.section ?: return ifNotInSection
-        return isSilentSection(section)
+        if (SortBySectionTimeFlag.isEnabled) {
+            if (entry.section?.bucket == BUCKET_PEOPLE) {
+                return !highPriorityProvider.isHighPriorityConversation(entry)
+            }
+            return isSilentSection(section)
+        } else {
+            return isSilentSection(section)
+        }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
index adcbbfb..968b591 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
@@ -45,6 +45,7 @@
 import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
 import com.android.systemui.statusbar.notification.row.FooterViewButton;
 import com.android.systemui.statusbar.notification.row.StackScrollerDecorView;
+import com.android.systemui.statusbar.notification.stack.AnimationProperties;
 import com.android.systemui.statusbar.notification.stack.ExpandableViewState;
 import com.android.systemui.statusbar.notification.stack.ViewState;
 import com.android.systemui.util.DrawableDumpKt;
@@ -102,6 +103,11 @@
         setClearAllButtonVisible(visible, animate, /* onAnimationEnded = */ null);
     }
 
+    /** Set the visibility of the "Manage"/"History" button to {@code visible}. */
+    public void setManageOrHistoryButtonVisible(boolean visible) {
+        mManageOrHistoryButton.setVisibility(visible ? View.VISIBLE : View.GONE);
+    }
+
     /**
      * Set the visibility of the "Clear all" button to {@code visible}. Animate the change if
      * {@code animate} is true.
@@ -274,14 +280,23 @@
 
     /** Show a message instead of the footer buttons. */
     public void setFooterLabelVisible(boolean isVisible) {
-        if (isVisible) {
-            mManageOrHistoryButton.setVisibility(View.GONE);
-            mClearAllButton.setVisibility(View.GONE);
-            mSeenNotifsFooterTextView.setVisibility(View.VISIBLE);
+        // In the refactored code, hiding the buttons is handled in the FooterViewModel
+        if (FooterViewRefactor.isEnabled()) {
+            if (isVisible) {
+                mSeenNotifsFooterTextView.setVisibility(View.VISIBLE);
+            } else {
+                mSeenNotifsFooterTextView.setVisibility(View.GONE);
+            }
         } else {
-            mManageOrHistoryButton.setVisibility(View.VISIBLE);
-            mClearAllButton.setVisibility(View.VISIBLE);
-            mSeenNotifsFooterTextView.setVisibility(View.GONE);
+            if (isVisible) {
+                mManageOrHistoryButton.setVisibility(View.GONE);
+                mClearAllButton.setVisibility(View.GONE);
+                mSeenNotifsFooterTextView.setVisibility(View.VISIBLE);
+            } else {
+                mManageOrHistoryButton.setVisibility(View.VISIBLE);
+                mClearAllButton.setVisibility(View.VISIBLE);
+                mSeenNotifsFooterTextView.setVisibility(View.GONE);
+            }
         }
     }
 
@@ -443,6 +458,12 @@
          */
         public boolean hideContent;
 
+        /**
+         * When true, skip animating Y on the next #animateTo.
+         * Once true, remains true until reset in #animateTo.
+         */
+        public boolean resetY = false;
+
         @Override
         public void copyFrom(ViewState viewState) {
             super.copyFrom(viewState);
@@ -459,5 +480,17 @@
                 footerView.setContentVisibleAnimated(!hideContent);
             }
         }
+
+        @Override
+        public void animateTo(View child, AnimationProperties properties) {
+            if (child instanceof FooterView) {
+                // Must set animateY=false before super.animateTo, which checks for animateY
+                if (resetY) {
+                    properties.getAnimationFilter().animateY = false;
+                    resetY = false;
+                }
+            }
+            super.animateTo(child, properties);
+        }
     }
 }
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 65ab4fd..637cadd 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
@@ -141,8 +141,12 @@
             }
         }
 
-        // NOTE: The manage/history button is always visible as long as the footer is visible, no
-        //  need to update the visibility here.
+        launch {
+            viewModel.manageOrHistoryButton.isVisible.collect { isVisible ->
+                // NOTE: This visibility change is never animated.
+                footer.setManageOrHistoryButtonVisible(isVisible.value)
+            }
+        }
     }
 
     private suspend fun bindMessage(
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 b23ef35..90fb728 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
@@ -34,6 +34,7 @@
 import javax.inject.Provider
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.onStart
@@ -45,12 +46,33 @@
     seenNotificationsInteractor: SeenNotificationsInteractor,
     shadeInteractor: ShadeInteractor,
 ) {
+    /** A message to show instead of the footer buttons. */
+    val message: FooterMessageViewModel =
+        FooterMessageViewModel(
+            messageId = R.string.unlock_to_see_notif_text,
+            iconId = R.drawable.ic_friction_lock_closed,
+            isVisible = seenNotificationsInteractor.hasFilteredOutSeenNotifications,
+        )
+
+    private val clearAllButtonVisible =
+        activeNotificationsInteractor.hasClearableNotifications
+            .combine(message.isVisible) { hasClearableNotifications, isMessageVisible ->
+                if (isMessageVisible) {
+                    // If the message is visible, the button never is
+                    false
+                } else {
+                    hasClearableNotifications
+                }
+            }
+            .distinctUntilChanged()
+
+    /** The button for clearing notifications. */
     val clearAllButton: FooterButtonViewModel =
         FooterButtonViewModel(
             labelId = flowOf(R.string.clear_all_notifications_text),
             accessibilityDescriptionId = flowOf(R.string.accessibility_clear_all),
             isVisible =
-                activeNotificationsInteractor.hasClearableNotifications
+                clearAllButtonVisible
                     .sample(
                         // TODO(b/322167853): This check is currently duplicated in
                         //  NotificationListViewModel, but instead it should be a field in
@@ -61,9 +83,9 @@
                                 ::Pair
                             )
                             .onStart { emit(Pair(false, false)) }
-                    ) { hasClearableNotifications, (isShadeFullyExpanded, animationsEnabled) ->
+                    ) { clearAllButtonVisible, (isShadeFullyExpanded, animationsEnabled) ->
                         val shouldAnimate = isShadeFullyExpanded && animationsEnabled
-                        AnimatableEvent(hasClearableNotifications, shouldAnimate)
+                        AnimatableEvent(clearAllButtonVisible, shouldAnimate)
                     }
                     .toAnimatedValueFlow(),
         )
@@ -77,18 +99,16 @@
             else R.string.manage_notifications_text
         }
 
+    /** The button for managing notification settings or opening notification history. */
     val manageOrHistoryButton: FooterButtonViewModel =
         FooterButtonViewModel(
             labelId = manageOrHistoryButtonText,
             accessibilityDescriptionId = manageOrHistoryButtonText,
-            isVisible = flowOf(AnimatedValue.NotAnimating(true)),
-        )
-
-    val message: FooterMessageViewModel =
-        FooterMessageViewModel(
-            messageId = R.string.unlock_to_see_notif_text,
-            iconId = R.drawable.ic_friction_lock_closed,
-            isVisible = seenNotificationsInteractor.hasFilteredOutSeenNotifications,
+            isVisible =
+                // Hide the manage button if the message is visible
+                message.isVisible.map { messageVisible ->
+                    AnimatedValue.NotAnimating(!messageVisible)
+                },
         )
 }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt
index a900e45..4ebb699 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt
@@ -39,13 +39,13 @@
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
 import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
 import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
-import java.util.concurrent.ConcurrentHashMap
-import javax.inject.Inject
-import kotlin.coroutines.CoroutineContext
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
+import java.util.concurrent.ConcurrentHashMap
+import javax.inject.Inject
+import kotlin.coroutines.CoroutineContext
 
 /**
  * Inflates and updates icons associated with notifications
@@ -206,7 +206,7 @@
     private fun getIconDescriptors(entry: NotificationEntry): Pair<StatusBarIcon, StatusBarIcon> {
         val iconDescriptor = getIconDescriptor(entry, redact = false)
         val sensitiveDescriptor =
-            if (entry.isSensitive) {
+            if (entry.isSensitive.value) {
                 getIconDescriptor(entry, redact = true)
             } else {
                 iconDescriptor
@@ -376,7 +376,7 @@
         val isSmallIcon = iconDescriptor.icon.equals(entry.sbn.notification.smallIcon)
         return isImportantConversation(entry) &&
             !isSmallIcon &&
-            (!usedInSensitiveContext || !entry.isSensitive)
+            (!usedInSensitiveContext || !entry.isSensitive.value)
     }
 
     private fun isImportantConversation(entry: NotificationEntry): Boolean {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt
index 6836816..c4d9ab7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt
@@ -207,11 +207,6 @@
     override fun shouldSuppress(entry: NotificationEntry) = !entry.canBubble()
 }
 
-class BubbleAppSuspendedSuppressor :
-    VisualInterruptionFilter(types = setOf(BUBBLE), reason = "app is suspended") {
-    override fun shouldSuppress(entry: NotificationEntry) = entry.ranking.isSuspended
-}
-
 class BubbleNoMetadataSuppressor() :
     VisualInterruptionFilter(types = setOf(BUBBLE), reason = "has no or invalid bubble metadata") {
 
@@ -221,6 +216,11 @@
     override fun shouldSuppress(entry: NotificationEntry) = !isValidMetadata(entry.bubbleMetadata)
 }
 
+class AlertAppSuspendedSuppressor :
+    VisualInterruptionFilter(types = setOf(PEEK, PULSE, BUBBLE), reason = "app is suspended") {
+    override fun shouldSuppress(entry: NotificationEntry) = entry.ranking.isSuspended
+}
+
 class AlertKeyguardVisibilitySuppressor(
     private val keyguardNotificationVisibilityProvider: KeyguardNotificationVisibilityProvider
 ) : VisualInterruptionFilter(types = setOf(PEEK, PULSE, BUBBLE), reason = "hidden on keyguard") {
@@ -228,11 +228,11 @@
         keyguardNotificationVisibilityProvider.shouldHideNotification(entry)
 }
 
-
 class AvalancheSuppressor(
     private val avalancheProvider: AvalancheProvider,
     private val systemClock: SystemClock,
-) : VisualInterruptionFilter(
+) :
+    VisualInterruptionFilter(
         types = setOf(PEEK, PULSE),
         reason = "avalanche",
     ) {
@@ -261,7 +261,7 @@
         return suppress
     }
 
-    private fun calculateState(entry: NotificationEntry): State  {
+    private fun calculateState(entry: NotificationEntry): State {
         if (
             entry.ranking.isConversation &&
                 entry.sbn.notification.`when` > avalancheProvider.startTime
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt
index 334e08d..a2f97bd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt
@@ -56,11 +56,11 @@
         }
     }
 
-    fun logSuspendedAppBubble(entry: NotificationEntry) {
+    fun logNoAlertingAppSuspended(entry: NotificationEntry) {
         buffer.log(TAG, DEBUG, {
             str1 = entry.logKey
         }, {
-            "No bubble up: notification: app $str1 is suspended"
+            "No alerting: app is suspended: $str1"
         })
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
index a655c72..d591114 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
@@ -204,11 +204,6 @@
             return false;
         }
 
-        if (entry.getRanking().isSuspended()) {
-            mLogger.logSuspendedAppBubble(entry);
-            return false;
-        }
-
         if (entry.getBubbleMetadata() == null
                 || (entry.getBubbleMetadata().getShortcutId() == null
                     && entry.getBubbleMetadata().getIntent() == null)) {
@@ -559,6 +554,13 @@
             }
         }
 
+        if (entry.getRanking().isSuspended()) {
+            if (log) {
+                mLogger.logNoAlertingAppSuspended(entry);
+            }
+            return false;
+        }
+
         if (mKeyguardNotificationVisibilityProvider.shouldHideNotification(entry)) {
             if (log) mLogger.logNoAlertingNotificationHidden(entry);
             return false;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt
index dabb18b..375b6e5c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt
@@ -46,23 +46,22 @@
 class VisualInterruptionDecisionProviderImpl
 @Inject
 constructor(
-        private val ambientDisplayConfiguration: AmbientDisplayConfiguration,
-        private val batteryController: BatteryController,
-        deviceProvisionedController: DeviceProvisionedController,
-        private val eventLog: EventLog,
-        private val globalSettings: GlobalSettings,
-        private val headsUpManager: HeadsUpManager,
-        private val keyguardNotificationVisibilityProvider: KeyguardNotificationVisibilityProvider,
-        keyguardStateController: KeyguardStateController,
-        private val logger: VisualInterruptionDecisionLogger,
-        @Main private val mainHandler: Handler,
-        private val powerManager: PowerManager,
-        private val statusBarStateController: StatusBarStateController,
-        private val systemClock: SystemClock,
-        private val uiEventLogger: UiEventLogger,
-        private val userTracker: UserTracker,
-        private val avalancheProvider: AvalancheProvider
-
+    private val ambientDisplayConfiguration: AmbientDisplayConfiguration,
+    private val batteryController: BatteryController,
+    deviceProvisionedController: DeviceProvisionedController,
+    private val eventLog: EventLog,
+    private val globalSettings: GlobalSettings,
+    private val headsUpManager: HeadsUpManager,
+    private val keyguardNotificationVisibilityProvider: KeyguardNotificationVisibilityProvider,
+    keyguardStateController: KeyguardStateController,
+    private val logger: VisualInterruptionDecisionLogger,
+    @Main private val mainHandler: Handler,
+    private val powerManager: PowerManager,
+    private val statusBarStateController: StatusBarStateController,
+    private val systemClock: SystemClock,
+    private val uiEventLogger: UiEventLogger,
+    private val userTracker: UserTracker,
+    private val avalancheProvider: AvalancheProvider
 ) : VisualInterruptionDecisionProvider {
 
     init {
@@ -164,10 +163,10 @@
         addFilter(PulseLockscreenVisibilityPrivateSuppressor())
         addFilter(PulseLowImportanceSuppressor())
         addFilter(BubbleNotAllowedSuppressor())
-        addFilter(BubbleAppSuspendedSuppressor())
         addFilter(BubbleNoMetadataSuppressor())
         addFilter(HunGroupAlertBehaviorSuppressor())
         addFilter(HunJustLaunchedFsiSuppressor())
+        addFilter(AlertAppSuspendedSuppressor())
         addFilter(AlertKeyguardVisibilitySuppressor(keyguardNotificationVisibilityProvider))
 
         if (NotificationAvalancheSuppression.isEnabled) {
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 eb6c7b5..9e0b16c 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
@@ -1767,7 +1767,7 @@
      */
     public ExpandableNotificationRow(Context context, AttributeSet attrs) {
         this(context, attrs, context);
-        Log.wtf(TAG, "This constructor shouldn't be called");
+        Log.e(TAG, "This constructor shouldn't be called");
     }
 
     /**
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 ded635c..31e69c9 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
@@ -988,8 +988,8 @@
             }
         }
 
-        entry.headsUpStatusBarText = result.headsUpStatusBarText;
-        entry.headsUpStatusBarTextPublic = result.headsUpStatusBarTextPublic;
+        entry.setHeadsUpStatusBarText(result.headsUpStatusBarText);
+        entry.setHeadsUpStatusBarTextPublic(result.headsUpStatusBarTextPublic);
         Trace.endAsyncSection(APPLY_TRACE_METHOD, System.identityHashCode(row));
         if (endListener != null) {
             endListener.onAsyncInflationFinished(entry);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shared/NotificationHeadsUpCycling.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shared/NotificationHeadsUpCycling.kt
new file mode 100644
index 0000000..0344b32
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shared/NotificationHeadsUpCycling.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.shared
+
+import com.android.systemui.Flags
+import com.android.systemui.flags.FlagToken
+import com.android.systemui.flags.RefactorFlagUtils
+
+/** Helper for reading or using the heads-up cycling flag state. */
+@Suppress("NOTHING_TO_INLINE")
+object NotificationHeadsUpCycling {
+    /** The aconfig flag name */
+    const val FLAG_NAME = Flags.FLAG_NOTIFICATION_HEADS_UP_CYCLING
+
+    /** 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.notificationContentAlphaOptimization()
+
+    /**
+     * 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 ac44b3e..0bb871b 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
@@ -414,7 +414,7 @@
         return mLayoutMaxHeight;
     }
 
-    public float getTopPadding() {
+    public int getTopPadding() {
         return mTopPadding;
     }
 
@@ -742,7 +742,7 @@
         pw.println("mHideSensitive=" + mHideSensitive);
         pw.println("mShadeExpanded=" + mShadeExpanded);
         pw.println("mClearAllInProgress=" + mClearAllInProgress);
-        pw.println("mStatusBarState=" + mStatusBarState);
+        pw.println("mStatusBarState=" + StatusBarState.toString(mStatusBarState));
         pw.println("mExpansionChanging=" + mExpansionChanging);
         pw.println("mPanelFullWidth=" + mIsSmallScreen);
         pw.println("mPulsing=" + mPulsing);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java
index 03a1082..0c248f5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java
@@ -30,7 +30,7 @@
     public static final int NO_DELAY = -1;
     boolean animateAlpha;
     boolean animateX;
-    boolean animateY;
+    public boolean animateY;
     ArraySet<View> animateYViews = new ArraySet<>();
     boolean animateZ;
     boolean animateHeight;
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 5dc37e0..92c597c 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
@@ -56,6 +56,7 @@
 import com.android.systemui.statusbar.notification.row.HybridGroupManager;
 import com.android.systemui.statusbar.notification.row.HybridNotificationView;
 import com.android.systemui.statusbar.notification.row.shared.AsyncGroupHeaderViewInflation;
+import com.android.systemui.statusbar.notification.row.shared.AsyncHybridViewInflation;
 import com.android.systemui.statusbar.notification.row.wrapper.NotificationHeaderViewWrapper;
 import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
 
@@ -1429,7 +1430,7 @@
             if (singleLineView != null) {
                 minExpandHeight += singleLineView.getHeight();
             } else {
-                if (AsyncGroupHeaderViewInflation.isEnabled()) {
+                if (AsyncHybridViewInflation.isEnabled()) {
                     minExpandHeight += mMinSingleLineHeight;
                 } else {
                     Log.e(TAG, "getMinHeight: child " + child.getEntry().getKey()
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 fb52838..82559de 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
@@ -113,6 +113,9 @@
 import com.android.systemui.statusbar.notification.row.StackScrollerDecorView;
 import com.android.systemui.statusbar.notification.shared.NotificationsImprovedHunAnimation;
 import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor;
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds;
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimShape;
+import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView;
 import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
 import com.android.systemui.statusbar.phone.HeadsUpTouchHelper;
 import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
@@ -135,6 +138,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.function.BiConsumer;
@@ -143,7 +147,9 @@
 /**
  * A layout which handles a dynamic amount of notifications and presents them in a scrollable stack.
  */
-public class NotificationStackScrollLayout extends ViewGroup implements Dumpable {
+public class NotificationStackScrollLayout
+        extends ViewGroup
+        implements Dumpable, NotificationScrollView {
 
     public static final float BACKGROUND_ALPHA_DIMMED = 0.7f;
     private static final String TAG = "StackScroller";
@@ -201,11 +207,11 @@
     private float mIntrinsicContentHeight;
     private int mPaddingBetweenElements;
     private int mMaxTopPadding;
-    private int mTopPadding;
     private boolean mAnimateNextTopPaddingChange;
     private int mBottomPadding;
     @VisibleForTesting
-    int mBottomInset = 0;
+    // mImeInset=0 when IME is hidden
+    int mImeInset = 0;
     private float mQsExpansionFraction;
     private final int mSplitShadeMinContentHeight;
     private String mLastUpdateSidePaddingDumpString;
@@ -218,6 +224,7 @@
      */
     private final StackScrollAlgorithm mStackScrollAlgorithm;
     private final AmbientState mAmbientState;
+    private final ScrollViewFields mScrollViewFields = new ScrollViewFields();
 
     private final GroupMembershipManager mGroupMembershipManager;
     private final GroupExpansionManager mGroupExpansionManager;
@@ -230,7 +237,8 @@
     private final ArrayList<View> mSwipedOutViews = new ArrayList<>();
     private NotificationStackSizeCalculator mNotificationStackSizeCalculator;
     private final StackStateAnimator mStateAnimator;
-    private boolean mAnimationsEnabled;
+    // TODO(b/332732878): call setAnimationsEnabled with scene container enabled, then remove this
+    private boolean mAnimationsEnabled = SceneContainerFlag.isEnabled();
     private boolean mChangePositionInProgress;
     private boolean mChildTransferInProgress;
 
@@ -281,7 +289,6 @@
      */
     private float mMinTopOverScrollToEscape;
     private int mIntrinsicPadding;
-    private float mStackTranslation;
     private float mTopPaddingOverflow;
     private boolean mDontReportNextOverScroll;
     private boolean mDontClampNextScroll;
@@ -396,7 +403,7 @@
                 @Override
                 public WindowInsets onProgress(WindowInsets windowInsets,
                         List<WindowInsetsAnimation> list) {
-                    updateBottomInset(windowInsets);
+                    updateImeInset(windowInsets);
                     return windowInsets;
                 }
 
@@ -590,7 +597,7 @@
         @Override
         public boolean isScrolledToTop() {
             if (SceneContainerFlag.isEnabled()) {
-                return mController.isPlaceholderScrolledToTop();
+                return mScrollViewFields.isScrolledToTop();
             } else {
                 return mOwnScrollY == 0;
             }
@@ -819,8 +826,8 @@
         int y = 0;
         drawDebugInfo(canvas, y, Color.RED, /* label= */ "y = " + y);
 
-        y = mTopPadding;
-        drawDebugInfo(canvas, y, Color.RED, /* label= */ "mTopPadding = " + y);
+        y = getTopPadding();
+        drawDebugInfo(canvas, y, Color.RED, /* label= */ "getTopPadding() = " + y);
 
         y = getLayoutHeight();
         drawDebugInfo(canvas, y, Color.YELLOW, /* label= */ "getLayoutHeight() = " + y);
@@ -855,7 +862,8 @@
         drawDebugInfo(canvas, y, Color.MAGENTA,
                 /* label= */ "mContentHeight = " + y);
 
-        drawDebugInfo(canvas, mRoundedRectClippingBottom, Color.DKGRAY,
+        y = mRoundedRectClippingBottom;
+        drawDebugInfo(canvas, y, Color.DKGRAY,
                 /* label= */ "mRoundedRectClippingBottom) = " + y);
     }
 
@@ -1131,6 +1139,48 @@
         }
     }
 
+    @Override
+    public View asView() {
+        return this;
+    }
+
+    @Override
+    public void setScrolledToTop(boolean scrolledToTop) {
+        mScrollViewFields.setScrolledToTop(scrolledToTop);
+    }
+
+    @Override
+    public void setStackTop(float stackTop) {
+        mScrollViewFields.setStackTop(stackTop);
+        // TODO(b/332574413): replace the following with using stackTop
+        updateTopPadding(stackTop, isAddOrRemoveAnimationPending());
+    }
+
+    @Override
+    public void setStackBottom(float stackBottom) {
+        mScrollViewFields.setStackBottom(stackBottom);
+    }
+
+    @Override
+    public void setHeadsUpTop(float headsUpTop) {
+        mScrollViewFields.setHeadsUpTop(headsUpTop);
+    }
+
+    @Override
+    public void setSyntheticScrollConsumer(@Nullable Consumer<Float> consumer) {
+        mScrollViewFields.setSyntheticScrollConsumer(consumer);
+    }
+
+    @Override
+    public void setStackHeightConsumer(@Nullable Consumer<Float> consumer) {
+        mScrollViewFields.setStackHeightConsumer(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.
@@ -1158,7 +1208,6 @@
         mAmbientState.setLayoutHeight(getLayoutHeight());
         mAmbientState.setLayoutMaxHeight(mMaxLayoutHeight);
         updateAlgorithmLayoutMinHeight();
-        mAmbientState.setTopPadding(mTopPadding);
     }
 
     private void updateAlgorithmLayoutMinHeight() {
@@ -1251,13 +1300,13 @@
     }
 
     public int getTopPadding() {
-        return mTopPadding;
+        return mAmbientState.getTopPadding();
     }
 
     private void setTopPadding(int topPadding, boolean animate) {
-        if (mTopPadding != topPadding) {
+        if (getTopPadding() != topPadding) {
+            mAmbientState.setTopPadding(topPadding);
             boolean shouldAnimate = animate || mAnimateNextTopPaddingChange;
-            mTopPadding = topPadding;
             updateAlgorithmHeightAndPadding();
             updateContentHeight();
             if (mAmbientState.isOnKeyguard()
@@ -1302,7 +1351,7 @@
     private void updateStackPosition(boolean listenerNeedsAnimation) {
         float topOverscrollAmount = mShouldUseSplitNotificationShade
                 ? getCurrentOverScrollAmount(true /* top */) : 0f;
-        final float endTopPosition = mTopPadding + mExtraTopInsetForFullShadeTransition
+        final float endTopPosition = getTopPadding() + mExtraTopInsetForFullShadeTransition
                 + mAmbientState.getOverExpansion()
                 + topOverscrollAmount
                 - getCurrentOverScrollAmount(false /* top */);
@@ -1315,7 +1364,7 @@
         // TODO(b/322228881): Clean up scene container vs legacy behavior in NSSL
         if (SceneContainerFlag.isEnabled()) {
             // stackY should be driven by scene container, not NSSL
-            mAmbientState.setStackY(mTopPadding);
+            mAmbientState.setStackY(getTopPadding());
         } else {
             final float stackY = MathUtils.lerp(0, endTopPosition, fraction);
             mAmbientState.setStackY(stackY);
@@ -1332,7 +1381,7 @@
         final float oldStackHeight = mAmbientState.getStackHeight();
         if (mQsExpansionFraction <= 0 && !shouldSkipHeightUpdate()) {
             final float endHeight = updateStackEndHeight(
-                    getHeight(), getEmptyBottomMargin(), mTopPadding);
+                    getHeight(), getEmptyBottomMargin(), getTopPadding());
             updateStackHeight(endHeight, fraction);
         } else {
             // Always updateStackHeight to prevent jumps in the stack height when this fraction
@@ -1382,6 +1431,31 @@
         mOnStackYChanged = onStackYChanged;
     }
 
+    @Override
+    public void setExpandFraction(float expandFraction) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
+        final float oldFraction = mAmbientState.getExpansionFraction();
+        final boolean wasExpanding = oldFraction != 0f && oldFraction != 1f;
+        final boolean nowExpanding = expandFraction != 0f && expandFraction != 1f;
+
+        // need to enter 'expanding' state before handling the new expand fraction, and then
+        if (nowExpanding && !wasExpanding) {
+            onExpansionStarted();
+            mController.checkSnoozeLeavebehind();
+        }
+
+        // Update the expand progress between started/stopped events
+        mAmbientState.setExpansionFraction(expandFraction);
+        // TODO(b/332577544): don't convert to height which then converts to the fraction again
+        setExpandedHeight(expandFraction * getHeight());
+
+        // expansion stopped event requires that the expandFraction has already been updated
+        if (!nowExpanding && wasExpanding) {
+            setCheckForLeaveBehind(false);
+            onExpansionStopped();
+        }
+    }
+
     /**
      * Update the height of the panel.
      *
@@ -1419,9 +1493,9 @@
         if (!appearing) {
             translationY = 0;
             if (mShouldShowShelfOnly) {
-                stackHeight = mTopPadding + mShelf.getIntrinsicHeight();
+                stackHeight = getTopPadding() + mShelf.getIntrinsicHeight();
             } else if (mQsFullScreen) {
-                int stackStartPosition = mContentHeight - mTopPadding + mIntrinsicPadding;
+                int stackStartPosition = mContentHeight - getTopPadding() + mIntrinsicPadding;
                 int stackEndPosition = mMaxTopPadding + mShelf.getIntrinsicHeight();
                 if (stackStartPosition <= stackEndPosition) {
                     stackHeight = stackEndPosition;
@@ -1450,7 +1524,7 @@
             stackHeight = (int) (height - translationY);
             if (isHeadsUpTransition() && appearFraction >= 0) {
                 int topSpacing = mShouldUseSplitNotificationShade
-                        ? mAmbientState.getStackTopMargin() : mTopPadding;
+                        ? mAmbientState.getStackTopMargin() : getTopPadding();
                 float startPos = mHeadsUpInset - topSpacing;
                 translationY = MathUtils.lerp(startPos, 0, appearFraction);
             }
@@ -1523,7 +1597,7 @@
      * Measured relative to the resting position.
      */
     private float getExpandTranslationStart() {
-        return -mTopPadding + getMinExpansionHeight() - mShelf.getIntrinsicHeight();
+        return -getTopPadding() + getMinExpansionHeight() - mShelf.getIntrinsicHeight();
     }
 
     /**
@@ -1592,7 +1666,7 @@
         } else {
             appearPosition = mEmptyShadeView.getHeight();
         }
-        return appearPosition + (onKeyguard() ? mTopPadding : mIntrinsicPadding);
+        return appearPosition + (onKeyguard() ? getTopPadding() : mIntrinsicPadding);
     }
 
     /**
@@ -1618,7 +1692,7 @@
         } else {
             appearPosition = mEmptyShadeView.getHeight();
         }
-        return appearPosition + (onKeyguard() ? mTopPadding : mIntrinsicPadding);
+        return appearPosition + (onKeyguard() ? getTopPadding() : mIntrinsicPadding);
     }
 
     private boolean isHeadsUpTransition() {
@@ -1652,12 +1726,11 @@
     }
 
     public float getStackTranslation() {
-        return mStackTranslation;
+        return mAmbientState.getStackTranslation();
     }
 
     private void setStackTranslation(float stackTranslation) {
-        if (stackTranslation != mStackTranslation) {
-            mStackTranslation = stackTranslation;
+        if (stackTranslation != getStackTranslation()) {
             mAmbientState.setStackTranslation(stackTranslation);
             requestChildrenUpdate();
         }
@@ -1792,8 +1865,15 @@
                 + ((!isExpanded() && isPinnedHeadsUp(v)) ? mHeadsUpInset : getTopPadding());
     }
 
-    private void updateBottomInset(WindowInsets windowInsets) {
-        mBottomInset = windowInsets.getInsets(WindowInsets.Type.ime()).bottom;
+    private void updateImeInset(WindowInsets windowInsets) {
+        mImeInset = windowInsets.getInsets(WindowInsets.Type.ime()).bottom;
+
+        if (mFooterView != null && mFooterView.getViewState() != null) {
+            // Do not animate footer Y when showing IME so that after IME hides, the footer
+            // appears at the correct Y. Once resetY is true, it remains true (even when IME
+            // hides, where mImeInset=0) until reset in FooterViewState#animateTo.
+            ((FooterView.FooterViewState) mFooterView.getViewState()).resetY |= mImeInset > 0;
+        }
 
         if (mForcedScroll != null) {
             updateForcedScroll();
@@ -1814,7 +1894,7 @@
         }
         if (!mIsInsetAnimationRunning) {
             // update bottom inset e.g. after rotation
-            updateBottomInset(insets);
+            updateImeInset(insets);
         }
         return insets;
     }
@@ -2218,9 +2298,9 @@
 
     private int getImeInset() {
         // The NotificationStackScrollLayout does not extend all the way to the bottom of the
-        // display. Therefore, subtract that space from the mBottomInset, in order to only include
+        // display. Therefore, subtract that space from the mImeInset, in order to only include
         // the portion of the bottom inset that actually overlaps the NotificationStackScrollLayout.
-        return Math.max(0, mBottomInset
+        return Math.max(0, mImeInset
                 - (getRootView().getHeight() - getHeight() - getLocationOnScreen()[1]));
     }
 
@@ -2317,11 +2397,12 @@
                         /* notificationStackScrollLayout= */ this, mMaxDisplayedNotifications,
                         shelfIntrinsicHeight);
         mIntrinsicContentHeight = height;
-        mController.setIntrinsicContentHeight(mIntrinsicContentHeight);
+        mScrollViewFields.sendStackHeight(height);
 
         // The topPadding can be bigger than the regular padding when qs is expanded, in that
         // state the maxPanelHeight and the contentHeight should be bigger
-        mContentHeight = (int) (height + Math.max(mIntrinsicPadding, mTopPadding) + mBottomPadding);
+        mContentHeight =
+                (int) (height + Math.max(mIntrinsicPadding, getTopPadding()) + mBottomPadding);
         updateScrollability();
         clampScrollPosition();
         updateStackPosition();
@@ -2799,7 +2880,7 @@
         if (mShouldUseSplitNotificationShade) {
             return mSidePaddings;
         }
-        return mTopPadding - mQsScrollBoundaryPosition;
+        return getTopPadding() - mQsScrollBoundaryPosition;
     }
 
     private int getIntrinsicHeight(View view) {
@@ -2906,6 +2987,7 @@
     }
 
     public void setAnimationsEnabled(boolean animationsEnabled) {
+        // TODO(b/332732878): remove the initial value of this field once the setter is called
         mAnimationsEnabled = animationsEnabled;
         updateNotificationAnimationStates();
         if (!animationsEnabled) {
@@ -3555,7 +3637,7 @@
 
     protected boolean isInsideQsHeader(MotionEvent ev) {
         if (SceneContainerFlag.isEnabled()) {
-            return ev.getY() < mController.getPlaceholderTop();
+            return ev.getY() < mScrollViewFields.getScrimClippingShape().getBounds().getTop();
         }
 
         mQsHeader.getBoundsOnScreen(mQsHeaderBound);
@@ -3858,7 +3940,7 @@
                 // fall through
             case android.R.id.accessibilityActionScrollUp:
                 final int viewportHeight =
-                        getHeight() - mPaddingBottom - mTopPadding - mPaddingTop
+                        getHeight() - mPaddingBottom - getTopPadding() - mPaddingTop
                                 - mShelf.getIntrinsicHeight();
                 final int targetScrollY = Math.max(0,
                         Math.min(mOwnScrollY + direction * viewportHeight, getScrollRange()));
@@ -4076,7 +4158,7 @@
                 if (row.isChildInGroup()) {
                     endPosition += row.getNotificationParent().getTranslationY();
                 }
-                int layoutEnd = mMaxLayoutHeight + (int) mStackTranslation;
+                int layoutEnd = mMaxLayoutHeight + (int) getStackTranslation();
                 NotificationSection lastSection = getLastVisibleSection();
                 ExpandableView lastVisibleChild =
                         lastSection == null ? null : lastSection.getLastVisibleChild();
@@ -4088,7 +4170,7 @@
                     // to it so that it can scroll the stack and scrim accordingly.
                     if (SceneContainerFlag.isEnabled()) {
                         float diff = endPosition - layoutEnd;
-                        mController.sendSyntheticScrollToSceneFramework(diff);
+                        mScrollViewFields.sendSyntheticScroll(diff);
                     }
                     setOwnScrollY((int) (mOwnScrollY + endPosition - layoutEnd));
                     mDisallowScrollingInThisMotion = true;
@@ -4559,7 +4641,7 @@
                 }
             }
         }
-        return touchY > mTopPadding + mStackTranslation;
+        return touchY > getTopPadding() + getStackTranslation();
     }
 
     /**
@@ -4736,6 +4818,11 @@
     }
 
     public void setQsFullScreen(boolean qsFullScreen) {
+        if (FooterViewRefactor.isEnabled()) {
+            if (qsFullScreen == mQsFullScreen) {
+                return;  // no change
+            }
+        }
         mQsFullScreen = qsFullScreen;
         updateAlgorithmLayoutMinHeight();
         updateScrollability();
@@ -4942,7 +5029,7 @@
             println(pw, "intrinsicContentHeight", mIntrinsicContentHeight);
             println(pw, "contentHeight", mContentHeight);
             println(pw, "intrinsicPadding", mIntrinsicPadding);
-            println(pw, "topPadding", mTopPadding);
+            println(pw, "topPadding", getTopPadding());
             println(pw, "bottomPadding", mBottomPadding);
             dumpRoundedRectClipping(pw);
             println(pw, "requestedClipBounds", mRequestedClipBounds);
@@ -4966,6 +5053,7 @@
                     elapsedRealtime - mLastUpdateSidePaddingElapsedRealtime);
             println(pw, "isSmallLandscapeLockscreenEnabled", mIsSmallLandscapeLockscreenEnabled);
             mNotificationStackSizeCalculator.dump(pw, args);
+            mScrollViewFields.dump(pw);
         });
         pw.println();
         pw.println("Contents:");
@@ -5506,8 +5594,40 @@
     /**
      * Set rounded rect clipping bounds on this view.
      */
+    @Override
+    public void setScrimClippingShape(@Nullable ShadeScrimShape shape) {
+        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return;
+        if (Objects.equals(mScrollViewFields.getScrimClippingShape(), shape)) return;
+        mScrollViewFields.setScrimClippingShape(shape);
+        mShouldUseRoundedRectClipping = shape != null;
+        mRoundedClipPath.reset();
+        if (shape != null) {
+            ShadeScrimBounds bounds = shape.getBounds();
+            mRoundedRectClippingLeft = (int) bounds.getLeft();
+            mRoundedRectClippingTop = (int) bounds.getTop();
+            mRoundedRectClippingRight = (int) bounds.getRight();
+            mRoundedRectClippingBottom = (int) bounds.getBottom();
+            mBgCornerRadii[0] = shape.getTopRadius();
+            mBgCornerRadii[1] = shape.getTopRadius();
+            mBgCornerRadii[2] = shape.getTopRadius();
+            mBgCornerRadii[3] = shape.getTopRadius();
+            mBgCornerRadii[4] = shape.getBottomRadius();
+            mBgCornerRadii[5] = shape.getBottomRadius();
+            mBgCornerRadii[6] = shape.getBottomRadius();
+            mBgCornerRadii[7] = shape.getBottomRadius();
+            mRoundedClipPath.addRoundRect(
+                    bounds.getLeft(), bounds.getTop(), bounds.getRight(), bounds.getBottom(),
+                    mBgCornerRadii, Path.Direction.CW);
+        }
+        invalidate();
+    }
+
+    /**
+     * Set rounded rect clipping bounds on this view.
+     */
     public void setRoundedClippingBounds(int left, int top, int right, int bottom, int topRadius,
                                          int bottomRadius) {
+        SceneContainerFlag.assertInLegacyMode();
         if (mRoundedRectClippingLeft == left && mRoundedRectClippingRight == right
                 && mRoundedRectClippingBottom == bottom && mRoundedRectClippingTop == top
                 && mBgCornerRadii[0] == topRadius && mBgCornerRadii[5] == bottomRadius) {
@@ -5585,6 +5705,7 @@
      * Should we use rounded rect clipping
      */
     private void updateUseRoundedRectClipping() {
+        if (SceneContainerFlag.isEnabled()) return;
         // We don't want to clip notifications when QS is expanded, because incoming heads up on
         // the bottom would be clipped otherwise
         boolean qsAllowsClipping = mQsExpansionFraction < 0.5f || mShouldUseSplitNotificationShade;
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 ec111a1..06479e5 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
@@ -83,7 +83,7 @@
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.power.domain.interactor.PowerInteractor;
 import com.android.systemui.res.R;
-import com.android.systemui.scene.shared.flag.SceneContainerFlags;
+import com.android.systemui.scene.shared.flag.SceneContainerFlag;
 import com.android.systemui.scene.ui.view.WindowRootView;
 import com.android.systemui.shade.ShadeController;
 import com.android.systemui.shade.ShadeViewController;
@@ -115,7 +115,6 @@
 import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
 import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController;
 import com.android.systemui.statusbar.notification.dagger.SilentHeader;
-import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor;
 import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor;
 import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
 import com.android.systemui.statusbar.notification.init.NotificationsController;
@@ -127,12 +126,10 @@
 import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
 import com.android.systemui.statusbar.notification.row.NotificationSnooze;
 import com.android.systemui.statusbar.notification.shared.NotificationsHeadsUpRefactor;
-import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor;
 import com.android.systemui.statusbar.notification.stack.ui.viewbinder.NotificationListViewBinder;
 import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
 import com.android.systemui.statusbar.phone.HeadsUpTouchHelper;
 import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.ScrimController;
 import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -185,7 +182,6 @@
     private final FalsingCollector mFalsingCollector;
     private final FalsingManager mFalsingManager;
     private final NotificationSwipeHelper.Builder mNotificationSwipeHelperBuilder;
-    private final ScrimController mScrimController;
     private final NotifPipeline mNotifPipeline;
     private final NotifCollection mNotifCollection;
     private final UiEventLogger mUiEventLogger;
@@ -193,7 +189,6 @@
     private final VisibilityLocationProviderDelegator mVisibilityLocationProviderDelegator;
     private final ShadeController mShadeController;
     private final Provider<WindowRootView> mWindowRootView;
-    private final NotificationStackAppearanceInteractor mStackAppearanceInteractor;
     private final KeyguardMediaController mKeyguardMediaController;
     private final SysuiStatusBarStateController mStatusBarStateController;
     private final KeyguardBypassController mKeyguardBypassController;
@@ -734,7 +729,6 @@
             FalsingCollector falsingCollector,
             FalsingManager falsingManager,
             NotificationSwipeHelper.Builder notificationSwipeHelperBuilder,
-            ScrimController scrimController,
             GroupExpansionManager groupManager,
             @SilentHeader SectionHeaderController silentHeaderController,
             NotifPipeline notifPipeline,
@@ -743,13 +737,10 @@
             UiEventLogger uiEventLogger,
             NotificationRemoteInputManager remoteInputManager,
             VisibilityLocationProviderDelegator visibilityLocationProviderDelegator,
-            ActiveNotificationsInteractor activeNotificationsInteractor,
             SeenNotificationsInteractor seenNotificationsInteractor,
             NotificationListViewBinder viewBinder,
             ShadeController shadeController,
-            SceneContainerFlags sceneContainerFlags,
             Provider<WindowRootView> windowRootView,
-            NotificationStackAppearanceInteractor stackAppearanceInteractor,
             InteractionJankMonitor jankMonitor,
             StackStateLogger stackLogger,
             NotificationStackScrollLogger logger,
@@ -790,7 +781,6 @@
         mFalsingCollector = falsingCollector;
         mFalsingManager = falsingManager;
         mNotificationSwipeHelperBuilder = notificationSwipeHelperBuilder;
-        mScrimController = scrimController;
         mJankMonitor = jankMonitor;
         mNotificationStackSizeCalculator = notificationStackSizeCalculator;
         mGroupExpansionManager = groupManager;
@@ -803,7 +793,6 @@
         mSeenNotificationsInteractor = seenNotificationsInteractor;
         mShadeController = shadeController;
         mWindowRootView = windowRootView;
-        mStackAppearanceInteractor = stackAppearanceInteractor;
         mFeatureFlags = featureFlags;
         mNotificationTargetsHelper = notificationTargetsHelper;
         mSecureSettings = secureSettings;
@@ -1132,6 +1121,7 @@
     }
 
     public boolean isAddOrRemoveAnimationPending() {
+        SceneContainerFlag.assertInLegacyMode();
         return mView != null && mView.isAddOrRemoveAnimationPending();
     }
 
@@ -1171,29 +1161,6 @@
         }
     }
 
-    /** Send internal notification expansion to the scene container framework. */
-    public void sendSyntheticScrollToSceneFramework(Float delta) {
-        mStackAppearanceInteractor.setSyntheticScroll(delta);
-    }
-
-    /** Get the y-coordinate of the top bound of the stack. */
-    public float getPlaceholderTop() {
-        return mStackAppearanceInteractor.getStackBounds().getValue().getTop();
-    }
-
-    /**
-     * Returns whether the notification stack is scrolled to the top; i.e., it cannot be scrolled
-     * down any further.
-     */
-    public boolean isPlaceholderScrolledToTop() {
-        return mStackAppearanceInteractor.getScrolledToTop().getValue();
-    }
-
-    /** Set the intrinsic height of the stack content without additional padding. */
-    public void setIntrinsicContentHeight(float intrinsicContentHeight) {
-        mStackAppearanceInteractor.setIntrinsicContentHeight(intrinsicContentHeight);
-    }
-
     public void setIntrinsicPadding(int intrinsicPadding) {
         mView.setIntrinsicPadding(intrinsicPadding);
     }
@@ -1272,6 +1239,7 @@
     }
 
     public void setScrollingEnabled(boolean enabled) {
+        SceneContainerFlag.assertInLegacyMode();
         mView.setScrollingEnabled(enabled);
     }
 
@@ -1292,6 +1260,7 @@
     }
 
     public void updateTopPadding(float qsHeight, boolean animate) {
+        SceneContainerFlag.assertInLegacyMode();
         mView.updateTopPadding(qsHeight, animate);
     }
 
@@ -1394,11 +1363,13 @@
     }
 
     public void onExpansionStarted() {
+        SceneContainerFlag.assertInLegacyMode();
         mView.onExpansionStarted();
         checkSnoozeLeavebehind();
     }
 
     public void onExpansionStopped() {
+        SceneContainerFlag.assertInLegacyMode();
         mView.setCheckForLeaveBehind(false);
         mView.onExpansionStopped();
     }
@@ -1527,6 +1498,7 @@
     }
 
     public void setExpandedHeight(float expandedHeight) {
+        SceneContainerFlag.assertInLegacyMode();
         mView.setExpandedHeight(expandedHeight);
     }
 
@@ -1802,6 +1774,7 @@
      */
     public void setRoundedClippingBounds(int left, int top, int right, int bottom, int topRadius,
             int bottomRadius) {
+        SceneContainerFlag.assertInLegacyMode();
         mView.setRoundedClippingBounds(left, top, right, bottom, topRadius, bottomRadius);
     }
 
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 1b53cbe..5bd4c75 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
@@ -17,14 +17,15 @@
 package com.android.systemui.statusbar.notification.stack
 
 import android.content.res.Resources
+import android.os.SystemProperties
 import android.util.Log
 import android.view.View.GONE
 import androidx.annotation.VisibleForTesting
 import com.android.systemui.Flags.notificationMinimalismPrototype
-import com.android.systemui.res.R
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.media.controls.domain.pipeline.MediaDataManager
+import com.android.systemui.res.R
 import com.android.systemui.statusbar.LockscreenShadeTransitionController
 import com.android.systemui.statusbar.StatusBarState.KEYGUARD
 import com.android.systemui.statusbar.SysuiStatusBarStateController
@@ -177,8 +178,8 @@
 
         // TODO: Avoid making this split shade assumption by simply checking the stack for media
         val isMediaShowing = mediaDataManager.hasActiveMediaOrRecommendation()
-        val isMediaShowingInStack = isMediaShowing && !splitShadeStateController
-                .shouldUseSplitNotificationShade(resources)
+        val isMediaShowingInStack =
+            isMediaShowing && !splitShadeStateController.shouldUseSplitNotificationShade(resources)
 
         log { "\tGet maxNotifWithoutSavingSpace ---" }
         val maxNotifWithoutSavingSpace =
@@ -378,8 +379,17 @@
     }
 
     fun updateResources() {
-        maxKeyguardNotifications = if (notificationMinimalismPrototype()) 1
-            else infiniteIfNegative(resources.getInteger(R.integer.keyguard_max_notification_count))
+        maxKeyguardNotifications =
+            infiniteIfNegative(
+                if (notificationMinimalismPrototype()) {
+                    SystemProperties.getInt(
+                        "persist.notification_minimalism_prototype.lock_screen_max_notifs",
+                        1
+                    )
+                } else {
+                    resources.getInteger(R.integer.keyguard_max_notification_count)
+                }
+            )
         maxNotificationsExcludesMedia = notificationMinimalismPrototype()
 
         dividerHeight =
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
new file mode 100644
index 0000000..edac5ed
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ScrollViewFields.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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
+
+import android.util.IndentingPrintWriter
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimShape
+import com.android.systemui.util.printSection
+import com.android.systemui.util.println
+import java.util.function.Consumer
+
+/**
+ * This is a state holder object used by [NSSL][NotificationStackScrollLayout] to contain states
+ * provided by the `NotificationScrollViewBinder` to the `NotificationScrollView`.
+ *
+ * Unlike AmbientState, no class other than NSSL should ever have access to this class in any way.
+ * These fields are effectively NSSL's private fields.
+ */
+class ScrollViewFields {
+    /** Used to produce the clipping path */
+    var scrimClippingShape: ShadeScrimShape? = null
+    /** Y coordinate in view pixels of the top of the notification stack */
+    var stackTop: Float = 0f
+    /**
+     * Y coordinate in view pixels above which the bottom of the notification stack / shelf / footer
+     * must be.
+     */
+    var stackBottom: Float = 0f
+    /** Y coordinate in view pixels of the top of the HUN */
+    var headsUpTop: Float = 0f
+    /** Whether the notifications are scrolled all the way to the top (i.e. when freshly opened) */
+    var isScrolledToTop: Boolean = true
+
+    /**
+     * When internal NSSL expansion requires the stack to be scrolled (e.g. to keep an expanding
+     * notification in view), that scroll amount can be sent here and it will be handled by the
+     * placeholder
+     */
+    var syntheticScrollConsumer: Consumer<Float>? = null
+    /**
+     * Any time the stack height is recalculated, it should be updated here to be used by the
+     * placeholder
+     */
+    var stackHeightConsumer: Consumer<Float>? = null
+    /**
+     * Any time the heads up height is recalculated, it should be updated here to be used by the
+     * placeholder
+     */
+    var headsUpHeightConsumer: Consumer<Float>? = null
+
+    /** send the [syntheticScroll] to the [syntheticScrollConsumer], if present. */
+    fun sendSyntheticScroll(syntheticScroll: Float) =
+        syntheticScrollConsumer?.accept(syntheticScroll)
+    /** send the [stackHeight] to the [stackHeightConsumer], if present. */
+    fun sendStackHeight(stackHeight: Float) = stackHeightConsumer?.accept(stackHeight)
+    /** 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)
+            pw.println("stackTop", stackTop)
+            pw.println("stackBottom", stackBottom)
+            pw.println("headsUpTop", headsUpTop)
+            pw.println("isScrolledToTop", isScrolledToTop)
+        }
+    }
+}
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
new file mode 100644
index 0000000..b047379
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepository.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.stack.data.repository
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
+import javax.inject.Inject
+import kotlinx.coroutines.flow.MutableStateFlow
+
+/**
+ * This repository contains state generated by the composable placeholders to define the position
+ * and appearance of the notification stack and related visual elements
+ */
+@SysUISingleton
+class NotificationPlaceholderRepository @Inject constructor() {
+    /**
+     * The bounds of the notification shade scrim / container in the current scene.
+     *
+     * When `null`, clipping should not be applied to notifications.
+     */
+    val shadeScrimBounds = MutableStateFlow<ShadeScrimBounds?>(null)
+
+    /**
+     * The y-coordinate in px of top of the contents of the notification stack. This value can be
+     * negative, if the stack is scrolled such that its top extends beyond the top edge of the
+     * screen.
+     */
+    val stackTop = MutableStateFlow(0f)
+
+    /** the bottom-most acceptable y-position for the bottom of the stack / shelf */
+    val stackBottom = MutableStateFlow(0f)
+
+    /** the y position of the top of the HUN area */
+    val headsUpTop = MutableStateFlow(0f)
+
+    /** height made available to the notifications in the size-constrained mode of lock screen. */
+    val constrainedAvailableSpace = MutableStateFlow(0)
+
+    /**
+     * Whether the notification stack is scrolled to the top; i.e., it cannot be scrolled down any
+     * further.
+     */
+    val scrolledToTop = MutableStateFlow(true)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepository.kt
deleted file mode 100644
index 79ba25e..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepository.kt
+++ /dev/null
@@ -1,57 +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.data.repository
-
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
-import javax.inject.Inject
-import kotlinx.coroutines.flow.MutableStateFlow
-
-/** A repository which holds state about and controlling the appearance of the notification stack */
-@SysUISingleton
-class NotificationStackAppearanceRepository @Inject constructor() {
-    /** The bounds of the notification stack in the current scene. */
-    val stackBounds = MutableStateFlow(StackBounds())
-
-    /**
-     * The height in px of the contents of notification stack. Depending on the number of
-     * notifications, this can exceed the space available on screen to show notifications, at which
-     * point the notification stack should become scrollable.
-     */
-    val intrinsicContentHeight = MutableStateFlow(0f)
-
-    /**
-     * The y-coordinate in px of top of the contents of the notification stack. This value can be
-     * negative, if the stack is scrolled such that its top extends beyond the top edge of the
-     * screen.
-     */
-    val contentTop = MutableStateFlow(0f)
-
-    /**
-     * Whether the notification stack is scrolled to the top; i.e., it cannot be scrolled down any
-     * further.
-     */
-    val scrolledToTop = MutableStateFlow(true)
-
-    /**
-     * The amount in px that the notification stack should scroll due to internal expansion. This
-     * should only happen when a notification expansion hits the bottom of the screen, so it is
-     * necessary to scroll up to keep expanding the notification.
-     */
-    val syntheticScroll = MutableStateFlow(0f)
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepository.kt
new file mode 100644
index 0000000..8a9da69
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepository.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.notification.stack.data.repository
+
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+import kotlinx.coroutines.flow.MutableStateFlow
+
+/**
+ * This repository contains state generated by the NSSL and required by the composable placeholders
+ * to ensure they are representing the actual contents that will be rendered.
+ */
+@SysUISingleton
+class NotificationViewHeightRepository @Inject constructor() {
+
+    /**
+     * The height in px of the contents of notification stack. Depending on the number of
+     * notifications, this can exceed the space available on screen to show notifications, at which
+     * point the notification stack should become scrollable.
+     */
+    val stackHeight = MutableStateFlow(0f)
+
+    /** The height in px of the current heads up notification. */
+    val headsUpHeight = MutableStateFlow(0f)
+
+    /**
+     * The amount in px that the notification stack should scroll due to internal expansion. This
+     * should only happen when a notification expansion hits the bottom of the screen, so it is
+     * necessary to scroll up to keep expanding the notification.
+     */
+    val syntheticScroll = MutableStateFlow(0f)
+}
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 f05d017..a5b4f5f 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
@@ -20,9 +20,10 @@
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.shade.shared.model.ShadeMode
-import com.android.systemui.statusbar.notification.stack.data.repository.NotificationStackAppearanceRepository
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
-import com.android.systemui.statusbar.notification.stack.shared.model.StackRounding
+import com.android.systemui.statusbar.notification.stack.data.repository.NotificationPlaceholderRepository
+import com.android.systemui.statusbar.notification.stack.data.repository.NotificationViewHeightRepository
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimRounding
 import javax.inject.Inject
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.StateFlow
@@ -36,11 +37,13 @@
 class NotificationStackAppearanceInteractor
 @Inject
 constructor(
-    private val repository: NotificationStackAppearanceRepository,
+    private val viewHeightRepository: NotificationViewHeightRepository,
+    private val placeholderRepository: NotificationPlaceholderRepository,
     shadeInteractor: ShadeInteractor,
 ) {
     /** The bounds of the notification stack in the current scene. */
-    val stackBounds: StateFlow<StackBounds> = repository.stackBounds.asStateFlow()
+    val shadeScrimBounds: StateFlow<ShadeScrimBounds?> =
+        placeholderRepository.shadeScrimBounds.asStateFlow()
 
     /**
      * Whether the stack is expanding from GONE-with-HUN to SHADE
@@ -50,14 +53,14 @@
     private val isExpandingFromHeadsUp: Flow<Boolean> = flowOf(false)
 
     /** The rounding of the notification stack. */
-    val stackRounding: Flow<StackRounding> =
+    val shadeScrimRounding: Flow<ShadeScrimRounding> =
         combine(
                 shadeInteractor.shadeMode,
                 isExpandingFromHeadsUp,
             ) { shadeMode, isExpandingFromHeadsUp ->
-                StackRounding(
-                    roundTop = !(shadeMode == ShadeMode.Split && isExpandingFromHeadsUp),
-                    roundBottom = shadeMode != ShadeMode.Single,
+                ShadeScrimRounding(
+                    isTopRounded = !(shadeMode == ShadeMode.Split && isExpandingFromHeadsUp),
+                    isBottomRounded = shadeMode != ShadeMode.Single,
                 )
             }
             .distinctUntilChanged()
@@ -67,47 +70,78 @@
      * notifications, this can exceed the space available on screen to show notifications, at which
      * point the notification stack should become scrollable.
      */
-    val intrinsicContentHeight: StateFlow<Float> = repository.intrinsicContentHeight.asStateFlow()
+    val stackHeight: StateFlow<Float> = viewHeightRepository.stackHeight.asStateFlow()
+
+    /** The height in px of the contents of the HUN. */
+    val headsUpHeight: StateFlow<Float> = viewHeightRepository.headsUpHeight.asStateFlow()
 
     /** The y-coordinate in px of top of the contents of the notification stack. */
-    val contentTop: StateFlow<Float> = repository.contentTop.asStateFlow()
+    val stackTop: StateFlow<Float> = placeholderRepository.stackTop.asStateFlow()
+
+    /** The y-coordinate in px of bottom of the contents of the notification stack. */
+    val stackBottom: StateFlow<Float> = placeholderRepository.stackBottom.asStateFlow()
+
+    /** The height of the keyguard's available space bounds */
+    val constrainedAvailableSpace: StateFlow<Int> =
+        placeholderRepository.constrainedAvailableSpace.asStateFlow()
 
     /**
      * Whether the notification stack is scrolled to the top; i.e., it cannot be scrolled down any
      * further.
      */
-    val scrolledToTop: StateFlow<Boolean> = repository.scrolledToTop.asStateFlow()
+    val scrolledToTop: StateFlow<Boolean> = placeholderRepository.scrolledToTop.asStateFlow()
+
+    /** The y-coordinate in px of bottom of the contents of the HUN. */
+    val headsUpTop: StateFlow<Float> = placeholderRepository.headsUpTop.asStateFlow()
 
     /**
      * The amount in px that the notification stack should scroll due to internal expansion. This
      * should only happen when a notification expansion hits the bottom of the screen, so it is
      * necessary to scroll up to keep expanding the notification.
      */
-    val syntheticScroll: Flow<Float> = repository.syntheticScroll.asStateFlow()
+    val syntheticScroll: Flow<Float> = viewHeightRepository.syntheticScroll.asStateFlow()
 
     /** Sets the position of the notification stack in the current scene. */
-    fun setStackBounds(bounds: StackBounds) {
-        check(bounds.top <= bounds.bottom) { "Invalid bounds: $bounds" }
-        repository.stackBounds.value = bounds
+    fun setShadeScrimBounds(bounds: ShadeScrimBounds?) {
+        check(bounds == null || bounds.top <= bounds.bottom) { "Invalid bounds: $bounds" }
+        placeholderRepository.shadeScrimBounds.value = bounds
     }
 
     /** Sets the height of the contents of the notification stack. */
-    fun setIntrinsicContentHeight(height: Float) {
-        repository.intrinsicContentHeight.value = height
+    fun setStackHeight(height: Float) {
+        viewHeightRepository.stackHeight.value = height
+    }
+
+    /** Sets the height of heads up notification. */
+    fun setHeadsUpHeight(height: Float) {
+        viewHeightRepository.headsUpHeight.value = height
     }
 
     /** Sets the y-coord in px of the top of the contents of the notification stack. */
-    fun setContentTop(startY: Float) {
-        repository.contentTop.value = startY
+    fun setStackTop(stackTop: Float) {
+        placeholderRepository.stackTop.value = stackTop
+    }
+
+    /** Sets the y-coord in px of the bottom of the contents of the notification stack. */
+    fun setStackBottom(stackBottom: Float) {
+        placeholderRepository.stackBottom.value = stackBottom
     }
 
     /** Sets whether the notification stack is scrolled to the top. */
     fun setScrolledToTop(scrolledToTop: Boolean) {
-        repository.scrolledToTop.value = scrolledToTop
+        placeholderRepository.scrolledToTop.value = scrolledToTop
     }
 
     /** Sets the amount (px) that the notification stack should scroll due to internal expansion. */
     fun setSyntheticScroll(delta: Float) {
-        repository.syntheticScroll.value = delta
+        viewHeightRepository.syntheticScroll.value = delta
+    }
+
+    fun setConstrainedAvailableSpace(height: Int) {
+        placeholderRepository.constrainedAvailableSpace.value = height
+    }
+
+    fun setHeadsUpTop(headsUpTop: Float) {
+        placeholderRepository.headsUpTop.value = headsUpTop
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimBounds.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimBounds.kt
new file mode 100644
index 0000000..832e690
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimBounds.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.stack.shared.model
+
+/** Models the bounds of the notification stack. */
+data class ShadeScrimBounds(
+    /** The position of the left of the stack in its window coordinate system, in pixels. */
+    val left: Float = 0f,
+    /** The position of the top of the stack in its window coordinate system, in pixels. */
+    val top: Float = 0f,
+    /** The position of the right of the stack in its window coordinate system, in pixels. */
+    val right: Float = 0f,
+    /** The position of the bottom of the stack in its window coordinate system, in pixels. */
+    val bottom: Float = 0f,
+) {
+    /** The current height of the notification container. */
+    val height: Float = bottom - top
+
+    fun minus(leftOffset: Int = 0, topOffset: Int = 0) =
+        if (leftOffset == 0 && topOffset == 0) {
+            this
+        } else {
+            ShadeScrimBounds(
+                left = this.left - leftOffset,
+                top = this.top - topOffset,
+                right = this.right - leftOffset,
+                bottom = this.bottom - topOffset,
+            )
+        }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimClipping.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimClipping.kt
new file mode 100644
index 0000000..e86fd1c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimClipping.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.notification.stack.shared.model
+
+/** Models the clipping rounded rectangle of the notification stack, where the rounding is binary */
+data class ShadeScrimClipping(
+    val bounds: ShadeScrimBounds = ShadeScrimBounds(),
+    val rounding: ShadeScrimRounding = ShadeScrimRounding()
+)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimRounding.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimRounding.kt
new file mode 100644
index 0000000..9d4231c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimRounding.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.statusbar.notification.stack.shared.model
+
+/** Models the corner rounds of the notification stack. */
+data class ShadeScrimRounding(
+    /** Whether the top corners of the notification stack should be rounded. */
+    val isTopRounded: Boolean = false,
+    /** Whether the bottom corners of the notification stack should be rounded. */
+    val isBottomRounded: Boolean = false,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimShape.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimShape.kt
new file mode 100644
index 0000000..e6f0647
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimShape.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.statusbar.notification.stack.shared.model
+
+/** Models the clipping rounded rectangle of the notification stack, with corner radii in px */
+data class ShadeScrimShape(
+    val bounds: ShadeScrimBounds = ShadeScrimBounds(),
+    /** radius in px of the top corners */
+    val topRadius: Int,
+    /** radius in px of the bottom corners */
+    val bottomRadius: Int,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackBounds.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackBounds.kt
deleted file mode 100644
index 1fc9a18..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackBounds.kt
+++ /dev/null
@@ -1,32 +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.stack.shared.model
-
-/** Models the bounds of the notification stack. */
-data class StackBounds(
-    /** The position of the left of the stack in its window coordinate system, in pixels. */
-    val left: Float = 0f,
-    /** The position of the top of the stack in its window coordinate system, in pixels. */
-    val top: Float = 0f,
-    /** The position of the right of the stack in its window coordinate system, in pixels. */
-    val right: Float = 0f,
-    /** The position of the bottom of the stack in its window coordinate system, in pixels. */
-    val bottom: Float = 0f,
-) {
-    /** The current height of the notification container. */
-    val height: Float = bottom - top
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt
deleted file mode 100644
index 0c92b50..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt
+++ /dev/null
@@ -1,20 +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.stack.shared.model
-
-/** Models the clipping rounded rectangle of the notification stack */
-data class StackClipping(val bounds: StackBounds, val rounding: StackRounding)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackRounding.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackRounding.kt
deleted file mode 100644
index ddc5d7ea..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackRounding.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.statusbar.notification.stack.shared.model
-
-/** Models the corner rounds of the notification stack. */
-data class StackRounding(
-    /** Whether the top corners of the notification stack should be rounded. */
-    val roundTop: Boolean = false,
-    /** Whether the bottom corners of the notification stack should be rounded. */
-    val roundBottom: Boolean = false,
-)
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
new file mode 100644
index 0000000..ac00d3b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationScrollView.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.stack.ui.view
+
+import android.view.View
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimShape
+import java.util.function.Consumer
+
+/**
+ * This view (interface) is the view which scrolls and positions the heads up notification and
+ * notification stack, but is otherwise agnostic to the content.
+ */
+interface NotificationScrollView {
+    /**
+     * Since this is an interface rather than a literal View, this provides cast-like access to the
+     * underlying view.
+     */
+    fun asView(): View
+
+    /** Set the clipping bounds used when drawing */
+    fun setScrimClippingShape(shape: ShadeScrimShape?)
+
+    /** set the y position in px of the top of the stack in this view's coordinates */
+    fun setStackTop(stackTop: Float)
+
+    /** set the y position in px of the bottom of the stack in this view's coordinates */
+    fun setStackBottom(stackBottom: Float)
+
+    /** set the y position in px of the top of the HUN in this view's coordinates */
+    fun setHeadsUpTop(headsUpTop: Float)
+
+    /** set whether the view has been scrolled all the way to the top */
+    fun setScrolledToTop(scrolledToTop: Boolean)
+
+    /** Set a consumer for synthetic scroll events */
+    fun setSyntheticScrollConsumer(consumer: Consumer<Float>?)
+    /** Set a consumer for stack height changed events */
+    fun setStackHeightConsumer(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)
+
+    /** sets the current expand fraction */
+    fun setExpandFraction(expandFraction: Float)
+}
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 18bb5119..5544f93 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
@@ -173,7 +173,6 @@
                 footerView,
                 footerViewModel,
                 clearAllNotifications = {
-                    metricsLogger.action(MetricsProto.MetricsEvent.ACTION_DISMISS_ALL_NOTES)
                     clearAllNotifications(
                         parentView,
                         // Hide the silent section header (if present) if there will be
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
new file mode 100644
index 0000000..047b560
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt
@@ -0,0 +1,103 @@
+/*
+ * 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.viewbinder
+
+import android.util.Log
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.repeatOnLifecycle
+import com.android.systemui.common.ui.ConfigurationState
+import com.android.systemui.common.ui.view.onLayoutChanged
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.dump.DumpManager
+import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView
+import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationScrollViewModel
+import com.android.systemui.util.kotlin.FlowDumperImpl
+import com.android.systemui.util.kotlin.launchAndDispose
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.DisposableHandle
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.launch
+
+/** Binds the [NotificationScrollView]. */
+@SysUISingleton
+class NotificationScrollViewBinder
+@Inject
+constructor(
+    dumpManager: DumpManager,
+    @Main private val mainImmediateDispatcher: CoroutineDispatcher,
+    private val view: NotificationScrollView,
+    private val viewModel: NotificationScrollViewModel,
+    private val configuration: ConfigurationState,
+) : FlowDumperImpl(dumpManager) {
+
+    private val viewLeftOffset = MutableStateFlow(0).dumpValue("viewLeftOffset")
+
+    private fun updateViewPosition() {
+        val trueView = view.asView()
+        if (trueView.top != 0) {
+            Log.w("NSSL", "Expected $trueView to have top==0")
+        }
+        viewLeftOffset.value = trueView.left
+    }
+
+    fun bindWhileAttached(): DisposableHandle {
+        return view.asView().repeatWhenAttached(mainImmediateDispatcher) {
+            repeatOnLifecycle(Lifecycle.State.CREATED) { bind() }
+        }
+    }
+
+    suspend fun bind() = coroutineScope {
+        launchAndDispose {
+            updateViewPosition()
+            view.asView().onLayoutChanged { updateViewPosition() }
+        }
+
+        launch {
+            viewModel
+                .shadeScrimShape(cornerRadius = scrimRadius, viewLeftOffset = viewLeftOffset)
+                .collect { view.setScrimClippingShape(it) }
+        }
+
+        launch { viewModel.stackTop.collect { view.setStackTop(it) } }
+        launch { viewModel.stackBottom.collect { view.setStackBottom(it) } }
+        launch { viewModel.scrolledToTop.collect { view.setScrolledToTop(it) } }
+        launch { viewModel.headsUpTop.collect { view.setHeadsUpTop(it) } }
+        launch { viewModel.expandFraction.collect { view.setExpandFraction(it) } }
+        launch { viewModel.isScrollable.collect { view.setScrollingEnabled(it) } }
+
+        launchAndDispose {
+            view.setSyntheticScrollConsumer(viewModel.syntheticScrollConsumer)
+            view.setStackHeightConsumer(viewModel.stackHeightConsumer)
+            view.setHeadsUpHeightConsumer(viewModel.headsUpHeightConsumer)
+            DisposableHandle {
+                view.setSyntheticScrollConsumer(null)
+                view.setStackHeightConsumer(null)
+                view.setHeadsUpHeightConsumer(null)
+            }
+        }
+    }
+
+    /** flow of the scrim clipping radius */
+    private val scrimRadius: Flow<Int>
+        get() = configuration.getDimensionPixelOffset(R.dimen.notification_scrim_corner_radius)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackViewBinder.kt
deleted file mode 100644
index 1a34bb4..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackViewBinder.kt
+++ /dev/null
@@ -1,102 +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.viewbinder
-
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.repeatOnLifecycle
-import com.android.systemui.common.ui.ConfigurationState
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.lifecycle.repeatWhenAttached
-import com.android.systemui.res.R
-import com.android.systemui.statusbar.notification.stack.AmbientState
-import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
-import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
-import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationStackAppearanceViewModel
-import javax.inject.Inject
-import kotlin.math.roundToInt
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.DisposableHandle
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.launch
-
-/** Binds the NSSL/Controller/AmbientState to their ViewModel. */
-@SysUISingleton
-class NotificationStackViewBinder
-@Inject
-constructor(
-    @Main private val mainImmediateDispatcher: CoroutineDispatcher,
-    private val ambientState: AmbientState,
-    private val view: NotificationStackScrollLayout,
-    private val controller: NotificationStackScrollLayoutController,
-    private val viewModel: NotificationStackAppearanceViewModel,
-    private val configuration: ConfigurationState,
-) {
-
-    fun bindWhileAttached(): DisposableHandle {
-        return view.repeatWhenAttached(mainImmediateDispatcher) {
-            repeatOnLifecycle(Lifecycle.State.CREATED) { bind() }
-        }
-    }
-
-    suspend fun bind() = coroutineScope {
-        launch {
-            combine(viewModel.stackClipping, clipRadius, ::Pair).collect { (clipping, clipRadius) ->
-                val (bounds, rounding) = clipping
-                val viewLeft = controller.view.left
-                val viewTop = controller.view.top
-                controller.setRoundedClippingBounds(
-                    bounds.left.roundToInt() - viewLeft,
-                    bounds.top.roundToInt() - viewTop,
-                    bounds.right.roundToInt() - viewLeft,
-                    bounds.bottom.roundToInt() - viewTop,
-                    if (rounding.roundTop) clipRadius else 0,
-                    if (rounding.roundBottom) clipRadius else 0,
-                )
-            }
-        }
-
-        launch {
-            viewModel.contentTop.collect {
-                controller.updateTopPadding(it, controller.isAddOrRemoveAnimationPending)
-            }
-        }
-
-        launch {
-            var wasExpanding = false
-            viewModel.expandFraction.collect { expandFraction ->
-                val nowExpanding = expandFraction != 0f && expandFraction != 1f
-                if (nowExpanding && !wasExpanding) {
-                    controller.onExpansionStarted()
-                }
-                ambientState.expansionFraction = expandFraction
-                controller.expandedHeight = expandFraction * controller.view.height
-                if (!nowExpanding && wasExpanding) {
-                    controller.onExpansionStopped()
-                }
-                wasExpanding = nowExpanding
-            }
-        }
-
-        launch { viewModel.isScrollable.collect { controller.setScrollingEnabled(it) } }
-    }
-
-    private val clipRadius: Flow<Int>
-        get() = configuration.getDimensionPixelOffset(R.dimen.notification_scrim_corner_radius)
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt
index ecf737a..741102b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt
@@ -20,11 +20,15 @@
 import android.view.WindowInsets
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.repeatOnLifecycle
+import com.android.systemui.Flags.communalHub
+import com.android.systemui.common.ui.view.onApplyWindowInsets
+import com.android.systemui.common.ui.view.onLayoutChanged
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Main
 import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters
 import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor
 import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.scene.shared.flag.SceneContainerFlag
 import com.android.systemui.scene.shared.flag.SceneContainerFlags
 import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor
 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
@@ -48,7 +52,7 @@
     private val sceneContainerFlags: SceneContainerFlags,
     private val controller: NotificationStackScrollLayoutController,
     private val notificationStackSizeCalculator: NotificationStackSizeCalculator,
-    private val notificationStackViewBinder: NotificationStackViewBinder,
+    private val notificationScrollViewBinder: NotificationScrollViewBinder,
     @Main private val mainImmediateDispatcher: CoroutineDispatcher,
 ) {
 
@@ -136,10 +140,12 @@
                         }
                     }
 
-                    launch {
-                        burnInParams
-                            .flatMapLatest { params -> viewModel.translationY(params) }
-                            .collect { y -> controller.setTranslationY(y) }
+                    if (!SceneContainerFlag.isEnabled) {
+                        launch {
+                            burnInParams
+                                .flatMapLatest { params -> viewModel.translationY(params) }
+                                .collect { y -> controller.setTranslationY(y) }
+                        }
                     }
 
                     launch { viewModel.translationX.collect { x -> controller.translationX = x } }
@@ -150,37 +156,33 @@
                         }
                     }
 
-                    launch {
-                        viewModel.glanceableHubAlpha.collect {
-                            controller.setMaxAlphaForGlanceableHub(it)
+                    if (communalHub()) {
+                        launch {
+                            viewModel.glanceableHubAlpha.collect {
+                                controller.setMaxAlphaForGlanceableHub(it)
+                            }
                         }
                     }
                 }
             }
 
         if (sceneContainerFlags.isEnabled()) {
-            disposables += notificationStackViewBinder.bindWhileAttached()
+            disposables += notificationScrollViewBinder.bindWhileAttached()
         }
 
         controller.setOnHeightChangedRunnable { viewModel.notificationStackChanged() }
         disposables += DisposableHandle { controller.setOnHeightChangedRunnable(null) }
 
-        view.setOnApplyWindowInsetsListener { v: View, insets: WindowInsets ->
-            val insetTypes = WindowInsets.Type.systemBars() or WindowInsets.Type.displayCutout()
-            burnInParams.update { current ->
-                current.copy(topInset = insets.getInsetsIgnoringVisibility(insetTypes).top)
+        disposables +=
+            view.onApplyWindowInsets { _: View, insets: WindowInsets ->
+                val insetTypes = WindowInsets.Type.systemBars() or WindowInsets.Type.displayCutout()
+                burnInParams.update { current ->
+                    current.copy(topInset = insets.getInsetsIgnoringVisibility(insetTypes).top)
+                }
+                insets
             }
-            insets
-        }
-        disposables += DisposableHandle { view.setOnApplyWindowInsetsListener(null) }
 
-        // Required to capture keyguard media changes and ensure the notification count is correct
-        val layoutChangeListener =
-            View.OnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
-                viewModel.notificationStackChanged()
-            }
-        view.addOnLayoutChangeListener(layoutChangeListener)
-        disposables += DisposableHandle { view.removeOnLayoutChangeListener(layoutChangeListener) }
+        disposables += view.onLayoutChanged { viewModel.notificationStackChanged() }
 
         return disposables
     }
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 5a7433d..5ab5857 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
@@ -123,7 +123,10 @@
             // When the shade is closed, the footer is still present in the list, but not visible.
             // This prevents the footer from being shown when a HUN is present, while still allowing
             // the footer to be counted as part of the shade for measurements.
-            shadeInteractor.shadeExpansion.map { it == 0f }.distinctUntilChanged()
+            shadeInteractor.shadeExpansion
+                .map { it == 0f }
+                .flowOn(bgDispatcher)
+                .distinctUntilChanged()
         }
     }
 
@@ -274,5 +277,6 @@
     // TODO(b/325936094) use it for the text displayed in the StatusBar
     fun headsUpRow(key: HeadsUpRowKey): HeadsUpRowViewModel =
         HeadsUpRowViewModel(headsUpNotificationInteractor.headsUpRow(key))
+
     fun elementKeyFor(key: HeadsUpRowKey): Any = headsUpNotificationInteractor.elementKeyFor(key)
 }
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
new file mode 100644
index 0000000..516ec31
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt
@@ -0,0 +1,129 @@
+/*
+ * 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.viewmodel
+
+import com.android.compose.animation.scene.ObservableTransitionState
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dump.DumpManager
+import com.android.systemui.scene.domain.interactor.SceneInteractor
+import com.android.systemui.scene.shared.model.Scenes
+import com.android.systemui.scene.shared.model.Scenes.Shade
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimClipping
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimShape
+import com.android.systemui.util.kotlin.FlowDumperImpl
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
+
+/** ViewModel which represents the state of the NSSL/Controller in the world of flexiglass */
+@SysUISingleton
+class NotificationScrollViewModel
+@Inject
+constructor(
+    dumpManager: DumpManager,
+    stackAppearanceInteractor: NotificationStackAppearanceInteractor,
+    shadeInteractor: ShadeInteractor,
+    sceneInteractor: SceneInteractor,
+) : FlowDumperImpl(dumpManager) {
+    /**
+     * 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
+     * transitioning from Shade to QuickSettings scenes.
+     */
+    val expandFraction: Flow<Float> =
+        combine(
+                shadeInteractor.shadeExpansion,
+                sceneInteractor.transitionState,
+            ) { shadeExpansion, transitionState ->
+                when (transitionState) {
+                    is ObservableTransitionState.Idle -> {
+                        if (transitionState.scene == Scenes.Lockscreen) {
+                            1f
+                        } else {
+                            shadeExpansion
+                        }
+                    }
+                    is ObservableTransitionState.Transition -> {
+                        if (
+                            (transitionState.fromScene == Scenes.Shade &&
+                                transitionState.toScene == Scenes.QuickSettings) ||
+                                (transitionState.fromScene == Scenes.QuickSettings &&
+                                    transitionState.toScene == Scenes.Shade)
+                        ) {
+                            1f
+                        } else {
+                            shadeExpansion
+                        }
+                    }
+                }
+            }
+            .distinctUntilChanged()
+            .dumpWhileCollecting("expandFraction")
+
+    /** The bounds of the notification stack in the current scene. */
+    private val shadeScrimClipping: Flow<ShadeScrimClipping?> =
+        combine(
+                stackAppearanceInteractor.shadeScrimBounds,
+                stackAppearanceInteractor.shadeScrimRounding,
+            ) { bounds, rounding ->
+                bounds?.let { ShadeScrimClipping(it, rounding) }
+            }
+            .dumpWhileCollecting("stackClipping")
+
+    fun shadeScrimShape(
+        cornerRadius: Flow<Int>,
+        viewLeftOffset: Flow<Int>
+    ): Flow<ShadeScrimShape?> =
+        combine(shadeScrimClipping, cornerRadius, viewLeftOffset) { clipping, radius, leftOffset ->
+                if (clipping == null) return@combine null
+                ShadeScrimShape(
+                    bounds = clipping.bounds.minus(leftOffset = leftOffset),
+                    topRadius = radius.takeIf { clipping.rounding.isTopRounded } ?: 0,
+                    bottomRadius = radius.takeIf { clipping.rounding.isBottomRounded } ?: 0
+                )
+            }
+            .dumpWhileCollecting("shadeScrimShape")
+
+    /** The y-coordinate in px of top of the contents of the notification stack. */
+    val stackTop: Flow<Float> = stackAppearanceInteractor.stackTop.dumpValue("stackTop")
+    /** The y-coordinate in px of bottom of the contents of the notification stack. */
+    val stackBottom: Flow<Float> = stackAppearanceInteractor.stackBottom.dumpValue("stackBottom")
+    /**
+     * Whether the notification stack is scrolled to the top; i.e., it cannot be scrolled down any
+     * further.
+     */
+    val scrolledToTop: Flow<Boolean> =
+        stackAppearanceInteractor.scrolledToTop.dumpValue("scrolledToTop")
+    /** The y-coordinate in px of bottom of the contents of the HUN. */
+    val headsUpTop: Flow<Float> = stackAppearanceInteractor.headsUpTop.dumpValue("headsUpTop")
+
+    /** Receives the amount (px) that the stack should scroll due to internal expansion. */
+    val syntheticScrollConsumer: (Float) -> Unit = stackAppearanceInteractor::setSyntheticScroll
+    /** Receives the height of the contents of the notification stack. */
+    val stackHeightConsumer: (Float) -> Unit = stackAppearanceInteractor::setStackHeight
+    /** Receives the height of the heads up notification. */
+    val headsUpHeightConsumer: (Float) -> Unit = stackAppearanceInteractor::setHeadsUpHeight
+
+    /** Whether the notification stack is scrollable or not. */
+    val isScrollable: Flow<Boolean> =
+        sceneInteractor.currentScene.map { it == Shade }.dumpWhileCollecting("isScrollable")
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt
deleted file mode 100644
index a7cbc33..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt
+++ /dev/null
@@ -1,100 +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.viewmodel
-
-import com.android.compose.animation.scene.ObservableTransitionState
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.scene.domain.interactor.SceneInteractor
-import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.scene.shared.model.Scenes.Shade
-import com.android.systemui.shade.domain.interactor.ShadeInteractor
-import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor
-import com.android.systemui.statusbar.notification.stack.shared.model.StackClipping
-import com.android.systemui.util.kotlin.FlowDumperImpl
-import javax.inject.Inject
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.map
-
-/** ViewModel which represents the state of the NSSL/Controller in the world of flexiglass */
-@SysUISingleton
-class NotificationStackAppearanceViewModel
-@Inject
-constructor(
-    @Application applicationScope: CoroutineScope,
-    dumpManager: DumpManager,
-    stackAppearanceInteractor: NotificationStackAppearanceInteractor,
-    shadeInteractor: ShadeInteractor,
-    sceneInteractor: SceneInteractor,
-) : FlowDumperImpl(dumpManager) {
-    /**
-     * 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
-     * transitioning from Shade to QuickSettings scenes.
-     */
-    val expandFraction: Flow<Float> =
-        combine(
-                shadeInteractor.shadeExpansion,
-                sceneInteractor.transitionState,
-            ) { shadeExpansion, transitionState ->
-                when (transitionState) {
-                    is ObservableTransitionState.Idle -> {
-                        if (transitionState.scene == Scenes.Lockscreen) {
-                            1f
-                        } else {
-                            shadeExpansion
-                        }
-                    }
-                    is ObservableTransitionState.Transition -> {
-                        if (
-                            (transitionState.fromScene == Scenes.Shade &&
-                                transitionState.toScene == Scenes.QuickSettings) ||
-                                (transitionState.fromScene == Scenes.QuickSettings &&
-                                    transitionState.toScene == Scenes.Shade)
-                        ) {
-                            1f
-                        } else {
-                            shadeExpansion
-                        }
-                    }
-                }
-            }
-            .distinctUntilChanged()
-            .dumpWhileCollecting("expandFraction")
-
-    /** The bounds of the notification stack in the current scene. */
-    val stackClipping: Flow<StackClipping> =
-        combine(
-                stackAppearanceInteractor.stackBounds,
-                stackAppearanceInteractor.stackRounding,
-                ::StackClipping
-            )
-            .dumpWhileCollecting("stackClipping")
-
-    /** The y-coordinate in px of top of the contents of the notification stack. */
-    val contentTop: StateFlow<Float> = stackAppearanceInteractor.contentTop.dumpValue("contentTop")
-
-    /** Whether the notification stack is scrollable or not. */
-    val isScrollable: Flow<Boolean> =
-        sceneInteractor.currentScene.map { it == Shade }.dumpWhileCollecting("isScrollable")
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt
index bd83121..b284179 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt
@@ -18,16 +18,19 @@
 
 import com.android.systemui.common.shared.model.NotificationContainerBounds
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dump.DumpManager
 import com.android.systemui.flags.FeatureFlagsClassic
 import com.android.systemui.flags.Flags
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.scene.shared.flag.SceneContainerFlags
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
-import com.android.systemui.statusbar.notification.stack.shared.model.StackRounding
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimRounding
+import com.android.systemui.util.kotlin.FlowDumperImpl
 import javax.inject.Inject
 import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.StateFlow
 
 /**
  * ViewModel used by the Notification placeholders inside the scene container to update the
@@ -37,67 +40,72 @@
 class NotificationsPlaceholderViewModel
 @Inject
 constructor(
+    dumpManager: DumpManager,
     private val interactor: NotificationStackAppearanceInteractor,
     shadeInteractor: ShadeInteractor,
     flags: SceneContainerFlags,
     featureFlags: FeatureFlagsClassic,
     private val keyguardInteractor: KeyguardInteractor,
-) {
+) : FlowDumperImpl(dumpManager) {
     /** DEBUG: whether the placeholder should be made slightly visible for positional debugging. */
     val isVisualDebuggingEnabled: Boolean = featureFlags.isEnabled(Flags.NSSL_DEBUG_LINES)
 
     /** DEBUG: whether the debug logging should be output. */
     val isDebugLoggingEnabled: Boolean = flags.isEnabled()
 
-    /**
-     * Notifies that the bounds of the notification placeholder have changed.
-     *
-     * @param top The position of the top of the container in its window coordinate system, in
-     *   pixels.
-     * @param bottom The position of the bottom of the container in its window coordinate system, in
-     *   pixels.
-     */
-    fun onBoundsChanged(
-        left: Float,
+    /** Notifies that the bounds of the notification scrim have changed. */
+    fun onScrimBoundsChanged(bounds: ShadeScrimBounds?) {
+        interactor.setShadeScrimBounds(bounds)
+    }
+
+    /** Notifies that the bounds of the notification placeholder have changed. */
+    fun onStackBoundsChanged(
         top: Float,
-        right: Float,
         bottom: Float,
     ) {
         keyguardInteractor.setNotificationContainerBounds(
             NotificationContainerBounds(top = top, bottom = bottom)
         )
-        interactor.setStackBounds(
-            StackBounds(top = top, bottom = bottom, left = left, right = right)
-        )
+        interactor.setStackTop(top)
+        interactor.setStackBottom(bottom)
+    }
+
+    /** Sets the available space */
+    fun onConstrainedAvailableSpaceChanged(height: Int) {
+        interactor.setConstrainedAvailableSpace(height)
+    }
+
+    fun onHeadsUpTopChanged(headsUpTop: Float) {
+        interactor.setHeadsUpTop(headsUpTop)
     }
 
     /** Corner rounding of the stack */
-    val stackRounding: Flow<StackRounding> = interactor.stackRounding
+    val shadeScrimRounding: Flow<ShadeScrimRounding> =
+        interactor.shadeScrimRounding.dumpWhileCollecting("shadeScrimRounding")
 
     /**
      * The height in px of the contents of notification stack. Depending on the number of
      * notifications, this can exceed the space available on screen to show notifications, at which
      * point the notification stack should become scrollable.
      */
-    val intrinsicContentHeight = interactor.intrinsicContentHeight
+    val stackHeight: StateFlow<Float> = interactor.stackHeight.dumpValue("stackHeight")
+
+    /** The height in px of the contents of the HUN. */
+    val headsUpHeight: StateFlow<Float> = interactor.headsUpHeight.dumpValue("headsUpHeight")
 
     /**
      * The amount [0-1] that the shade has been opened. At 0, the shade is closed; at 1, the shade
      * is open.
      */
-    val expandFraction: Flow<Float> = shadeInteractor.shadeExpansion
+    val expandFraction: Flow<Float> = shadeInteractor.shadeExpansion.dumpValue("expandFraction")
 
     /**
      * The amount in px that the notification stack should scroll due to internal expansion. This
      * should only happen when a notification expansion hits the bottom of the screen, so it is
      * necessary to scroll up to keep expanding the notification.
      */
-    val syntheticScroll: Flow<Float> = interactor.syntheticScroll
-
-    /** Sets the y-coord in px of the top of the contents of the notification stack. */
-    fun onContentTopChanged(padding: Float) {
-        interactor.setContentTop(padding)
-    }
+    val syntheticScroll: Flow<Float> =
+        interactor.syntheticScroll.dumpWhileCollecting("syntheticScroll")
 
     /** Sets whether the notification stack is scrolled to the top. */
     fun setScrolledToTop(scrolledToTop: Boolean) {
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 d112edb..13e36d5 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
@@ -19,6 +19,7 @@
 
 package com.android.systemui.statusbar.notification.stack.ui.viewmodel
 
+import androidx.annotation.VisibleForTesting
 import com.android.systemui.common.shared.model.NotificationContainerBounds
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.dagger.qualifiers.Application
@@ -29,9 +30,11 @@
 import com.android.systemui.keyguard.shared.model.KeyguardState.ALTERNATE_BOUNCER
 import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
 import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING
+import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
 import com.android.systemui.keyguard.shared.model.KeyguardState.GLANCEABLE_HUB
 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.PRIMARY_BOUNCER
 import com.android.systemui.keyguard.shared.model.StatusBarState.SHADE
 import com.android.systemui.keyguard.shared.model.StatusBarState.SHADE_LOCKED
@@ -58,8 +61,12 @@
 import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToLockscreenTransitionViewModel
 import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor
+import com.android.systemui.scene.shared.flag.SceneContainerFlag
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor
 import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor
+import com.android.systemui.util.kotlin.BooleanFlowOperators.and
+import com.android.systemui.util.kotlin.BooleanFlowOperators.or
 import com.android.systemui.util.kotlin.FlowDumperImpl
 import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine
 import javax.inject.Inject
@@ -78,7 +85,6 @@
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.merge
 import kotlinx.coroutines.flow.onStart
-import kotlinx.coroutines.flow.shareIn
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.flow.transformWhile
 import kotlinx.coroutines.isActive
@@ -94,6 +100,7 @@
     private val keyguardInteractor: KeyguardInteractor,
     private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
     private val shadeInteractor: ShadeInteractor,
+    private val notificationStackAppearanceInteractor: NotificationStackAppearanceInteractor,
     private val alternateBouncerToGoneTransitionViewModel:
         AlternateBouncerToGoneTransitionViewModel,
     private val aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel,
@@ -122,6 +129,7 @@
 ) : FlowDumperImpl(dumpManager) {
     private val statesForConstrainedNotifications: Set<KeyguardState> =
         setOf(AOD, LOCKSCREEN, DOZING, ALTERNATE_BOUNCER, PRIMARY_BOUNCER)
+    private val statesForHiddenKeyguard: Set<KeyguardState> = setOf(GONE, OCCLUDED)
 
     /**
      * Is either shade/qs expanded? This intentionally does not use the [ShadeInteractor] version,
@@ -159,23 +167,35 @@
             )
             .dumpWhileCollecting("isShadeLocked")
 
+    @VisibleForTesting
+    val paddingTopDimen: Flow<Int> =
+        interactor.configurationBasedDimensions
+            .map {
+                when {
+                    !it.useSplitShade -> 0
+                    it.useLargeScreenHeader -> it.marginTopLargeScreen
+                    else -> it.marginTop
+                }
+            }
+            .distinctUntilChanged()
+            .dumpWhileCollecting("paddingTopDimen")
+
     val configurationBasedDimensions: Flow<ConfigurationBasedDimensions> =
         interactor.configurationBasedDimensions
             .map {
                 val marginTop =
-                    if (it.useLargeScreenHeader) it.marginTopLargeScreen else it.marginTop
+                    when {
+                        // y position of the NSSL in the window needs to be 0 under scene container
+                        SceneContainerFlag.isEnabled -> 0
+                        it.useLargeScreenHeader -> it.marginTopLargeScreen
+                        else -> it.marginTop
+                    }
                 ConfigurationBasedDimensions(
                     marginStart = if (it.useSplitShade) 0 else it.marginHorizontal,
                     marginEnd = it.marginHorizontal,
                     marginBottom = it.marginBottom,
                     marginTop = marginTop,
                     useSplitShade = it.useSplitShade,
-                    paddingTop =
-                        if (it.useSplitShade) {
-                            marginTop
-                        } else {
-                            0
-                        },
                 )
             }
             .distinctUntilChanged()
@@ -193,8 +213,12 @@
             ) { constrainedNotificationState, transitioningToOrFromLockscreen ->
                 constrainedNotificationState || transitioningToOrFromLockscreen
             }
-            .shareIn(scope = applicationScope, started = SharingStarted.Eagerly)
-            .dumpWhileCollecting("isOnLockscreen")
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.Eagerly,
+                initialValue = false
+            )
+            .dumpValue("isOnLockscreen")
 
     /** Are we purely on the keyguard without the shade/qs? */
     val isOnLockscreenWithoutShade: Flow<Boolean> =
@@ -241,7 +265,22 @@
                 started = SharingStarted.Eagerly,
                 initialValue = false,
             )
-            .dumpWhileCollecting("isOnGlanceableHubWithoutShade")
+            .dumpValue("isOnGlanceableHubWithoutShade")
+
+    /** Are we on the dream without the shade/qs? */
+    private val isDreamingWithoutShade: Flow<Boolean> =
+        combine(
+                keyguardTransitionInteractor.isFinishedInState(DREAMING),
+                isAnyExpanded,
+            ) { isDreaming, isAnyExpanded ->
+                isDreaming && !isAnyExpanded
+            }
+            .stateIn(
+                scope = applicationScope,
+                started = SharingStarted.Eagerly,
+                initialValue = false,
+            )
+            .dumpValue("isDreamingWithoutShade")
 
     /**
      * Fade in if the user swipes the shade back up, not if collapsed by going to AOD. This is
@@ -311,20 +350,21 @@
      *
      * When the shade is expanding, the position is controlled by... the shade.
      */
-    val bounds: StateFlow<NotificationContainerBounds> =
+    val bounds: StateFlow<NotificationContainerBounds> by lazy {
+        SceneContainerFlag.assertInLegacyMode()
         combine(
                 isOnLockscreenWithoutShade,
                 keyguardInteractor.notificationContainerBounds,
-                configurationBasedDimensions,
+                paddingTopDimen,
                 interactor.topPosition
                     .sampleCombine(
                         keyguardTransitionInteractor.isInTransitionToAnyState,
                         shadeInteractor.qsExpansion,
                     )
                     .onStart { emit(Triple(0f, false, 0f)) }
-            ) { onLockscreen, bounds, config, (top, isInTransitionToAnyState, qsExpansion) ->
+            ) { onLockscreen, bounds, paddingTop, (top, isInTransitionToAnyState, qsExpansion) ->
                 if (onLockscreen) {
-                    bounds.copy(top = bounds.top - config.paddingTop)
+                    bounds.copy(top = bounds.top - paddingTop)
                 } else {
                     // When QS expansion > 0, it should directly set the top padding so do not
                     // animate it
@@ -341,6 +381,7 @@
                 initialValue = NotificationContainerBounds(),
             )
             .dumpValue("bounds")
+    }
 
     /**
      * Ensure view is visible when the shade/qs are expanded. Also, as QS is expanding, fade out
@@ -369,37 +410,60 @@
             .onStart { emit(1f) }
             .dumpWhileCollecting("alphaForShadeAndQsExpansion")
 
-    private val isGoneTransitionRunning: Flow<Boolean> =
+    private fun toFlowArray(
+        states: Set<KeyguardState>,
+        flow: (KeyguardState) -> Flow<Boolean>
+    ): Array<Flow<Boolean>> {
+        return states.map { flow(it) }.toTypedArray()
+    }
+
+    private val isTransitioningToHiddenKeyguard: Flow<Boolean> =
         flow {
                 while (currentCoroutineContext().isActive) {
                     emit(false)
-                    // Ensure start where GONE is inactive
-                    keyguardTransitionInteractor.transitionValue(GONE).first { it == 0f }
-                    // Wait for a GONE transition to begin
-                    keyguardTransitionInteractor.transitionStepsToState(GONE).first {
-                        it.value > 0f && it.transitionState == RUNNING
-                    }
+                    // Ensure states are inactive to start
+                    and(
+                            *toFlowArray(statesForHiddenKeyguard) { state ->
+                                keyguardTransitionInteractor.transitionValue(state).map { it == 0f }
+                            }
+                        )
+                        .first { it }
+                    // Wait for a qualifying transition to begin
+                    or(
+                            *toFlowArray(statesForHiddenKeyguard) { state ->
+                                keyguardTransitionInteractor
+                                    .transitionStepsToState(state)
+                                    .map { it.value > 0f && it.transitionState == RUNNING }
+                                    .onStart { emit(false) }
+                            }
+                        )
+                        .first { it }
                     emit(true)
-                    // Now await the signal that SHADE state has been reached or the GONE transition
-                    // was reversed. Until SHADE state has been replaced and merged with GONE, it is
-                    // the only source of when it is considered safe to reset alpha to 1f for HUNs.
+                    // Now await the signal that SHADE state has been reached or the transition was
+                    // reversed. Until SHADE state has been replaced it is the only source of when
+                    // it is considered safe to reset alpha to 1f for HUNs.
                     combine(
                             keyguardInteractor.statusBarState,
-                            // Emit -1f on start to make sure the flow runs
-                            keyguardTransitionInteractor.transitionValue(GONE).onStart { emit(-1f) }
-                        ) { statusBarState, goneValue ->
-                            statusBarState == SHADE || goneValue == 0f
+                            and(
+                                *toFlowArray(statesForHiddenKeyguard) { state ->
+                                    keyguardTransitionInteractor.transitionValue(state).map {
+                                        it == 0f
+                                    }
+                                }
+                            )
+                        ) { statusBarState, stateIsReversed ->
+                            statusBarState == SHADE || stateIsReversed
                         }
                         .first { it }
                 }
             }
-            .dumpWhileCollecting("goneTransitionInProgress")
+            .dumpWhileCollecting("isTransitioningToHiddenKeyguard")
 
     fun keyguardAlpha(viewState: ViewStateAccessor): Flow<Float> {
         // All transition view models are mututally exclusive, and safe to merge
         val alphaTransitions =
             merge(
-                alternateBouncerToGoneTransitionViewModel.lockscreenAlpha(viewState),
+                alternateBouncerToGoneTransitionViewModel.notificationAlpha(viewState),
                 aodToLockscreenTransitionViewModel.notificationAlpha,
                 aodToOccludedTransitionViewModel.lockscreenAlpha(viewState),
                 dozingToLockscreenTransitionViewModel.lockscreenAlpha,
@@ -409,7 +473,7 @@
                 goneToDreamingTransitionViewModel.lockscreenAlpha,
                 goneToDozingTransitionViewModel.lockscreenAlpha,
                 lockscreenToDreamingTransitionViewModel.lockscreenAlpha,
-                lockscreenToGoneTransitionViewModel.lockscreenAlpha(viewState),
+                lockscreenToGoneTransitionViewModel.notificationAlpha(viewState),
                 lockscreenToOccludedTransitionViewModel.lockscreenAlpha,
                 lockscreenToPrimaryBouncerTransitionViewModel.lockscreenAlpha,
                 occludedToAodTransitionViewModel.lockscreenAlpha,
@@ -424,7 +488,7 @@
                 // shade expansion or swipe to dismiss
                 combineTransform(
                     isOnLockscreenWithoutShade,
-                    isGoneTransitionRunning,
+                    isTransitioningToHiddenKeyguard,
                     shadeCollapseFadeIn,
                     alphaForShadeAndQsExpansion,
                     keyguardInteractor.dismissAlpha.dumpWhileCollecting(
@@ -432,7 +496,7 @@
                     ),
                 ) {
                     isOnLockscreenWithoutShade,
-                    isGoneTransitionRunning,
+                    isTransitioningToHiddenKeyguard,
                     shadeCollapseFadeIn,
                     alphaForShadeAndQsExpansion,
                     dismissAlpha ->
@@ -440,7 +504,7 @@
                         if (!shadeCollapseFadeIn && dismissAlpha != null) {
                             emit(dismissAlpha)
                         }
-                    } else if (!isGoneTransitionRunning) {
+                    } else if (!isTransitioningToHiddenKeyguard) {
                         emit(alphaForShadeAndQsExpansion)
                     }
                 },
@@ -460,6 +524,7 @@
         combineTransform(
                 isOnGlanceableHubWithoutShade,
                 isOnLockscreen,
+                isDreamingWithoutShade,
                 merge(
                         lockscreenToGlanceableHubTransitionViewModel.notificationAlpha,
                         glanceableHubToLockscreenTransitionViewModel.notificationAlpha,
@@ -467,9 +532,9 @@
                     // Manually emit on start because [notificationAlpha] only starts emitting
                     // when transitions start.
                     .onStart { emit(1f) }
-            ) { isOnGlanceableHubWithoutShade, isOnLockscreen, alpha,
+            ) { isOnGlanceableHubWithoutShade, isOnLockscreen, isDreamingWithoutShade, alpha,
                 ->
-                if (isOnGlanceableHubWithoutShade && !isOnLockscreen) {
+                if ((isOnGlanceableHubWithoutShade || isDreamingWithoutShade) && !isOnLockscreen) {
                     // Notifications should not be visible on the glanceable hub.
                     // TODO(b/321075734): implement a way to actually set the notifications to
                     // gone while on the hub instead of just adjusting alpha
@@ -484,6 +549,7 @@
                     emit(1f)
                 }
             }
+            .distinctUntilChanged()
             .dumpWhileCollecting("glanceableHubAlpha")
 
     /**
@@ -491,6 +557,8 @@
      * translated as the keyguard fades out.
      */
     fun translationY(params: BurnInParameters): Flow<Float> {
+        // with SceneContainer, x translation is handled by views, y is handled by compose
+        SceneContainerFlag.assertInLegacyMode()
         return combine(
                 aodBurnInViewModel
                     .movement(params)
@@ -523,8 +591,11 @@
             .dumpWhileCollecting("translationX")
 
     private val availableHeight: Flow<Float> =
-        bounds
-            .map { it.bottom - it.top }
+        if (SceneContainerFlag.isEnabled) {
+                notificationStackAppearanceInteractor.constrainedAvailableSpace.map { it.toFloat() }
+            } else {
+                bounds.map { it.bottom - it.top }
+            }
             .distinctUntilChanged()
             .dumpWhileCollecting("availableHeight")
 
@@ -541,8 +612,13 @@
             combine(
                 isOnLockscreen,
                 keyguardInteractor.statusBarState,
-            ) { isOnLockscreen, statusBarState ->
-                statusBarState == SHADE_LOCKED || !isOnLockscreen
+                merge(
+                        primaryBouncerToGoneTransitionViewModel.showAllNotifications,
+                        alternateBouncerToGoneTransitionViewModel.showAllNotifications,
+                    )
+                    .onStart { emit(false) }
+            ) { isOnLockscreen, statusBarState, showAllNotifications ->
+                statusBarState == SHADE_LOCKED || !isOnLockscreen || showAllNotifications
             }
 
         return combineTransform(
@@ -581,6 +657,5 @@
         val marginEnd: Int,
         val marginBottom: Int,
         val useSplitShade: Boolean,
-        val paddingTop: Int,
     )
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index 97fc35a..8b7b348 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -51,6 +51,9 @@
 import com.android.systemui.keyguard.KeyguardViewMediator;
 import com.android.systemui.keyguard.WakefulnessLifecycle;
 import com.android.systemui.keyguard.domain.interactor.BiometricUnlockInteractor;
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
+import com.android.systemui.keyguard.shared.model.KeyguardState;
+import com.android.systemui.keyguard.shared.model.TransitionStep;
 import com.android.systemui.log.SessionTracker;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.res.R;
@@ -59,6 +62,7 @@
 import com.android.systemui.statusbar.VibratorHelper;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
+import com.android.systemui.util.kotlin.JavaAdapter;
 import com.android.systemui.util.time.SystemClock;
 
 import dagger.Lazy;
@@ -286,7 +290,9 @@
             VibratorHelper vibrator,
             SystemClock systemClock,
             Lazy<SelectedUserInteractor> selectedUserInteractor,
-            BiometricUnlockInteractor biometricUnlockInteractor
+            BiometricUnlockInteractor biometricUnlockInteractor,
+            JavaAdapter javaAdapter,
+            KeyguardTransitionInteractor keyguardTransitionInteractor
     ) {
         mPowerManager = powerManager;
         mUpdateMonitor = keyguardUpdateMonitor;
@@ -317,10 +323,19 @@
         mOrderUnlockAndWake = resources.getBoolean(
                 com.android.internal.R.bool.config_orderUnlockAndWake);
         mSelectedUserInteractor = selectedUserInteractor;
-
+        javaAdapter.alwaysCollectFlow(
+                keyguardTransitionInteractor.getStartedKeyguardTransitionStep(),
+                this::consumeTransitionStepOnStartedKeyguardState);
         dumpManager.registerDumpable(this);
     }
 
+    @VisibleForTesting
+    protected void consumeTransitionStepOnStartedKeyguardState(TransitionStep transitionStep) {
+        if (transitionStep.getFrom() == KeyguardState.GONE) {
+            mBiometricUnlockInteractor.setBiometricUnlockState(MODE_NONE);
+        }
+    }
+
     public void setKeyguardViewController(KeyguardViewController keyguardViewController) {
         mKeyguardViewController = keyguardViewController;
     }
@@ -773,7 +788,6 @@
         for (BiometricUnlockEventsListener listener : mBiometricUnlockEventsListeners) {
             listener.onResetMode();
         }
-        mBiometricUnlockInteractor.setBiometricUnlockState(MODE_NONE);
         mNumConsecutiveFpFailures = 0;
         mLastFpFailureUptimeMillis = 0;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
index a1fae03..2651d2e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java
@@ -103,8 +103,8 @@
     /**
      * Returns an ActivityOptions bundle created using the given parameters.
      *
-     * @param displayId The ID of the display to launch the activity in. Typically this would
-     *                  be the display the status bar is on.
+     * @param displayId        The ID of the display to launch the activity in. Typically this would
+     *                         be the display the status bar is on.
      * @param animationAdapter The animation adapter used to start this activity, or {@code null}
      *                         for the default animation.
      */
@@ -197,7 +197,7 @@
 
     void onKeyguardViewManagerStatesUpdated();
 
-    /** */
+    /**  */
     boolean getCommandQueuePanelsEnabled();
 
     void showWirelessChargingAnimation(int batteryLevel);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
index 665fc0a..e93c0f6a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java
@@ -52,11 +52,12 @@
 import com.android.systemui.qs.QSPanelController;
 import com.android.systemui.recents.ScreenPinningRequest;
 import com.android.systemui.res.R;
+import com.android.systemui.scene.shared.flag.SceneContainerFlag;
 import com.android.systemui.settings.UserTracker;
 import com.android.systemui.shade.CameraLauncher;
 import com.android.systemui.shade.QuickSettingsController;
 import com.android.systemui.shade.ShadeController;
-import com.android.systemui.shade.ShadeViewController;
+import com.android.systemui.shade.ShadeHeaderController;
 import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
@@ -80,8 +81,8 @@
     private final ScreenPinningRequest mScreenPinningRequest;
     private final com.android.systemui.shade.ShadeController mShadeController;
     private final CommandQueue mCommandQueue;
-    private final ShadeViewController mShadeViewController;
     private final PanelExpansionInteractor mPanelExpansionInteractor;
+    private final ShadeHeaderController mShadeHeaderController;
     private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
     private final MetricsLogger mMetricsLogger;
     private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@@ -119,8 +120,8 @@
             ScreenPinningRequest screenPinningRequest,
             ShadeController shadeController,
             CommandQueue commandQueue,
-            ShadeViewController shadeViewController,
             PanelExpansionInteractor panelExpansionInteractor,
+            ShadeHeaderController shadeHeaderController,
             RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler,
             MetricsLogger metricsLogger,
             KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -146,8 +147,8 @@
         mScreenPinningRequest = screenPinningRequest;
         mShadeController = shadeController;
         mCommandQueue = commandQueue;
-        mShadeViewController = shadeViewController;
         mPanelExpansionInteractor = panelExpansionInteractor;
+        mShadeHeaderController = shadeHeaderController;
         mRemoteInputQuickSettingsDisabler = remoteInputQuickSettingsDisabler;
         mMetricsLogger = metricsLogger;
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
@@ -279,7 +280,9 @@
             }
         }
 
-        mShadeViewController.disableHeader(state1, state2, animate);
+        if (!SceneContainerFlag.isEnabled()) {
+            mShadeHeaderController.disable(state1, state2, animate);
+        }
     }
 
     /**
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 f76de04c..1d6b744 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -28,7 +28,6 @@
 import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME;
 import static com.android.systemui.Flags.lightRevealMigration;
 import static com.android.systemui.Flags.newAodTransition;
-import static com.android.systemui.Flags.predictiveBackSysui;
 import static com.android.systemui.Flags.truncatedStatusBarIconsFix;
 import static com.android.systemui.charging.WirelessChargingAnimation.UNKNOWN_BATTERY_LEVEL;
 import static com.android.systemui.statusbar.NotificationLockscreenUserManager.PERMISSION_SELF;
@@ -164,10 +163,12 @@
 import com.android.systemui.qs.QSPanelController;
 import com.android.systemui.res.R;
 import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor;
+import com.android.systemui.scene.shared.flag.SceneContainerFlag;
 import com.android.systemui.scene.shared.flag.SceneContainerFlags;
 import com.android.systemui.scrim.ScrimView;
 import com.android.systemui.settings.UserTracker;
 import com.android.systemui.settings.brightness.BrightnessSliderController;
+import com.android.systemui.settings.brightness.domain.interactor.BrightnessMirrorShowingInteractor;
 import com.android.systemui.shade.CameraLauncher;
 import com.android.systemui.shade.NotificationShadeWindowView;
 import com.android.systemui.shade.NotificationShadeWindowViewController;
@@ -594,6 +595,8 @@
 
     private final SceneContainerFlags mSceneContainerFlags;
 
+    private final BrightnessMirrorShowingInteractor mBrightnessMirrorShowingInteractor;
+
     /**
      * Public constructor for CentralSurfaces.
      *
@@ -705,7 +708,8 @@
             UserTracker userTracker,
             Provider<FingerprintManager> fingerprintManager,
             ActivityStarter activityStarter,
-            SceneContainerFlags sceneContainerFlags
+            SceneContainerFlags sceneContainerFlags,
+            BrightnessMirrorShowingInteractor brightnessMirrorShowingInteractor
     ) {
         mContext = context;
         mNotificationsController = notificationsController;
@@ -801,6 +805,7 @@
         mFingerprintManager = fingerprintManager;
         mActivityStarter = activityStarter;
         mSceneContainerFlags = sceneContainerFlags;
+        mBrightnessMirrorShowingInteractor = brightnessMirrorShowingInteractor;
 
         mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
         mStartingSurfaceOptional = startingSurfaceOptional;
@@ -836,8 +841,7 @@
         mLightRevealScrimViewModelLazy = lightRevealScrimViewModelLazy;
         mLightRevealScrim = lightRevealScrim;
 
-        // Based on teamfood flag, turn predictive back dispatch on at runtime.
-        if (predictiveBackSysui()) {
+        if (PredictiveBackSysUiFlag.isEnabled()) {
             mContext.getApplicationInfo().setEnableOnBackInvokedCallback(true);
         }
     }
@@ -1084,6 +1088,12 @@
         mJavaAdapter.alwaysCollectFlow(
                 mCommunalInteractor.isIdleOnCommunal(),
                 mIdleOnCommunalConsumer);
+        if (mSceneContainerFlags.isEnabled()) {
+            mJavaAdapter.alwaysCollectFlow(
+                    mBrightnessMirrorShowingInteractor.isShowing(),
+                    this::setBrightnessMirrorShowing
+            );
+        }
     }
 
     /**
@@ -1257,11 +1267,13 @@
         mScreenOffAnimationController.initialize(this, mShadeSurface, mLightRevealScrim);
         updateLightRevealScrimVisibility();
 
-        mShadeSurface.initDependencies(
-                this,
-                mGestureRec,
-                mShadeController::makeExpandedInvisible,
-                mHeadsUpManager);
+        if (!SceneContainerFlag.isEnabled()) {
+            mShadeSurface.initDependencies(
+                    this,
+                    mGestureRec,
+                    mShadeController::makeExpandedInvisible,
+                    mHeadsUpManager);
+        }
 
         // Set up the quick settings tile panel
         final View container = getNotificationShadeWindowView().findViewById(R.id.qs_frame);
@@ -1283,10 +1295,7 @@
                     mShadeSurface,
                     mNotificationShadeDepthControllerLazy.get(),
                     mBrightnessSliderFactory,
-                    (visible) -> {
-                        mBrightnessMirrorVisible = visible;
-                        updateScrimController();
-                    });
+                    this::setBrightnessMirrorShowing);
             fragmentHostManager.addTagListener(QS.TAG, (tag, f) -> {
                 QS qs = (QS) f;
                 if (qs instanceof QSFragmentLegacy) {
@@ -1345,6 +1354,10 @@
         ThreadedRenderer.overrideProperty("ambientRatio", String.valueOf(1.5f));
     }
 
+    private void setBrightnessMirrorShowing(boolean showing) {
+        mBrightnessMirrorVisible = showing;
+        updateScrimController();
+    }
 
     /**
      * When swiping up to dismiss the lock screen, the panel expansion fraction goes from 1f to 0f.
@@ -2629,11 +2642,10 @@
         boolean goingToSleepWithoutAnimation = isGoingToSleep()
                 && !mDozeParameters.shouldControlScreenOff();
         boolean disabled = (!mDeviceInteractive && !mDozeServiceHost.isPulsing())
-                || goingToSleepWithoutAnimation
-                || mDeviceProvisionedController.isFrpActive();
+                || goingToSleepWithoutAnimation;
         mShadeLogger.logUpdateNotificationPanelTouchState(disabled, isGoingToSleep(),
                 !mDozeParameters.shouldControlScreenOff(), !mDeviceInteractive,
-                !mDozeServiceHost.isPulsing(), mDeviceProvisionedController.isFrpActive());
+                !mDozeServiceHost.isPulsing());
 
         mShadeSurface.setTouchAndAnimationDisabled(disabled);
         if (!NotificationIconContainerRefactor.isEnabled()) {
@@ -3060,6 +3072,9 @@
         public void onConfigChanged(Configuration newConfig) {
             updateResources();
             updateDisplaySize(); // populates mDisplayMetrics
+            if (PredictiveBackSysUiFlag.isEnabled()) {
+                mContext.getApplicationInfo().setEnableOnBackInvokedCallback(true);
+            }
 
             if (DEBUG) {
                 Log.v(TAG, "configuration changed: " + mContext.getResources().getConfiguration());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
index 495b4e1..4c3c7d5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
@@ -41,6 +41,7 @@
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationIconInteractor;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
+import com.android.systemui.statusbar.notification.row.shared.AsyncGroupHeaderViewInflation;
 import com.android.systemui.statusbar.notification.shared.NotificationIconContainerRefactor;
 import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager;
 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
@@ -421,9 +422,12 @@
     public void updateHeader(NotificationEntry entry) {
         ExpandableNotificationRow row = entry.getRow();
         float headerVisibleAmount = 1.0f;
-        if (row.isPinned() || row.isHeadsUpAnimatingAway() || row == mTrackedChild
-                || row.showingPulsing()) {
-            headerVisibleAmount = mAppearFraction;
+        // To fix the invisible HUN group header issue
+        if (!AsyncGroupHeaderViewInflation.isEnabled()) {
+            if (row.isPinned() || row.isHeadsUpAnimatingAway() || row == mTrackedChild
+                    || row.showingPulsing()) {
+                headerVisibleAmount = mAppearFraction;
+            }
         }
         row.setHeaderVisibleAmount(headerVisibleAmount);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt
index 82b10bc..eadb7f5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt
@@ -23,12 +23,12 @@
 import android.widget.FrameLayout
 import androidx.annotation.StringRes
 import com.android.keyguard.LockIconViewController
-import com.android.systemui.res.R
 import com.android.systemui.keyguard.ui.binder.KeyguardBottomAreaViewBinder
 import com.android.systemui.keyguard.ui.binder.KeyguardBottomAreaViewBinder.bind
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardBottomAreaViewModel
 import com.android.systemui.plugins.ActivityStarter
 import com.android.systemui.plugins.FalsingManager
+import com.android.systemui.res.R
 import com.android.systemui.statusbar.VibratorHelper
 
 /**
@@ -155,13 +155,13 @@
                 // make top of ambient indication view the bottom of the lock icon
                 it.layout(
                     ambientLeft,
-                    lockIconViewController?.bottom?.toInt() ?: 0,
+                    lockIconViewController?.getBottom()?.toInt() ?: 0,
                     right - ambientLeft,
                     ambientTop + it.measuredHeight
                 )
             } else {
                 // make bottom of ambient indication view the top of the lock icon
-                val lockLocationTop = lockIconViewController?.top ?: 0
+                val lockLocationTop = lockIconViewController?.getTop() ?: 0
                 it.layout(
                     ambientLeft,
                     lockLocationTop.toInt() - it.measuredHeight,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PredictiveBackSysUiFlag.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PredictiveBackSysUiFlag.kt
new file mode 100644
index 0000000..74d6ba5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PredictiveBackSysUiFlag.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.phone
+
+import com.android.systemui.Flags
+import com.android.systemui.flags.FlagToken
+import com.android.systemui.flags.RefactorFlagUtils
+
+/** Helper for reading or using the predictive back flag state. */
+@Suppress("NOTHING_TO_INLINE")
+object PredictiveBackSysUiFlag {
+    /** The aconfig flag name */
+    const val FLAG_NAME = Flags.FLAG_PREDICTIVE_BACK_SYSUI
+
+    /** A token used for dependency declaration */
+    val token: FlagToken
+        get() = FlagToken(FLAG_NAME, isEnabled)
+
+    /** Is the refactor enabled */
+    @JvmStatic
+    inline val isEnabled
+        get() = Flags.predictiveBackSysui()
+
+    /**
+     * 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/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index a99834a..077f330 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -67,12 +67,12 @@
 import com.android.systemui.dock.DockManager;
 import com.android.systemui.dreams.DreamOverlayStateController;
 import com.android.systemui.flags.FeatureFlags;
-import com.android.systemui.flags.Flags;
 import com.android.systemui.keyguard.KeyguardWmStateRefactor;
 import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor;
 import com.android.systemui.keyguard.domain.interactor.KeyguardSurfaceBehindInteractor;
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
 import com.android.systemui.keyguard.domain.interactor.WindowManagerLockscreenVisibilityInteractor;
+import com.android.systemui.keyguard.shared.RefactorKeyguardDismissIntent;
 import com.android.systemui.keyguard.shared.model.DismissAction;
 import com.android.systemui.keyguard.shared.model.KeyguardDone;
 import com.android.systemui.keyguard.shared.model.KeyguardState;
@@ -169,6 +169,7 @@
 
     private Job mListenForAlternateBouncerTransitionSteps = null;
     private Job mListenForKeyguardAuthenticatedBiometricsHandled = null;
+    private Job mListenForCanShowAlternateBouncer = null;
 
     // Local cache of expansion events, to avoid duplicates
     private float mFraction = -1f;
@@ -380,7 +381,6 @@
             Lazy<ShadeController> shadeController,
             LatencyTracker latencyTracker,
             KeyguardSecurityModel keyguardSecurityModel,
-            FeatureFlags featureFlags,
             PrimaryBouncerCallbackInteractor primaryBouncerCallbackInteractor,
             PrimaryBouncerInteractor primaryBouncerInteractor,
             BouncerView primaryBouncerView,
@@ -412,7 +412,6 @@
         mShadeController = shadeController;
         mLatencyTracker = latencyTracker;
         mKeyguardSecurityModel = keyguardSecurityModel;
-        mFlags = featureFlags;
         mPrimaryBouncerCallbackInteractor = primaryBouncerCallbackInteractor;
         mPrimaryBouncerInteractor = primaryBouncerInteractor;
         mPrimaryBouncerView = primaryBouncerView;
@@ -506,6 +505,10 @@
             mListenForKeyguardAuthenticatedBiometricsHandled.cancel(null);
         }
         mListenForKeyguardAuthenticatedBiometricsHandled = null;
+        if (mListenForCanShowAlternateBouncer != null) {
+            mListenForCanShowAlternateBouncer.cancel(null);
+        }
+        mListenForCanShowAlternateBouncer = null;
         if (!DeviceEntryUdfpsRefactor.isEnabled()) {
             mListenForAlternateBouncerTransitionSteps = mJavaAdapter.alwaysCollectFlow(
                     mKeyguardTransitionInteractor.transitionStepsFromState(
@@ -517,6 +520,11 @@
                     mPrimaryBouncerInteractor.getKeyguardAuthenticatedBiometricsHandled(),
                     this::consumeKeyguardAuthenticatedBiometricsHandled
             );
+        } else {
+            mListenForCanShowAlternateBouncer = mJavaAdapter.alwaysCollectFlow(
+                    mAlternateBouncerInteractor.getCanShowAlternateBouncer(),
+                    this::consumeCanShowAlternateBouncer
+            );
         }
 
         if (KeyguardWmStateRefactor.isEnabled()) {
@@ -558,13 +566,18 @@
         }
     }
 
+    private void consumeCanShowAlternateBouncer(boolean canShow) {
+        // do nothing, we only are registering for the flow to ensure that there's at least
+        // one subscriber that will update AlternateBouncerInteractor.canShowAlternateBouncer.value
+    }
+
     /** Register a callback, to be invoked by the Predictive Back system. */
     private void registerBackCallback() {
         if (!mIsBackCallbackRegistered) {
             ViewRootImpl viewRoot = getViewRootImpl();
             if (viewRoot != null) {
                 viewRoot.getOnBackInvokedDispatcher().registerOnBackInvokedCallback(
-                        OnBackInvokedDispatcher.PRIORITY_OVERLAY, mOnBackInvokedCallback);
+                        OnBackInvokedDispatcher.PRIORITY_DEFAULT, mOnBackInvokedCallback);
                 mIsBackCallbackRegistered = true;
             } else {
                 if (DEBUG) {
@@ -647,7 +660,12 @@
          * show if any subsequent events are to be handled.
          */
         if (beginShowingBouncer(event)) {
-            mPrimaryBouncerInteractor.show(/* isScrimmed= */false);
+            if (SceneContainerFlag.isEnabled()) {
+                mSceneInteractorLazy.get().changeScene(
+                        Scenes.Bouncer, "StatusBarKeyguardViewManager.onPanelExpansionChanged");
+            } else {
+                mPrimaryBouncerInteractor.show(/* isScrimmed= */false);
+            }
         }
 
         if (!primaryBouncerIsOrWillBeShowing()) {
@@ -701,7 +719,12 @@
             // The keyguard might be showing (already). So we need to hide it.
             if (!primaryBouncerIsShowing()) {
                 mCentralSurfaces.hideKeyguard();
-                mPrimaryBouncerInteractor.show(true);
+                if (SceneContainerFlag.isEnabled()) {
+                    mSceneInteractorLazy.get().changeScene(
+                            Scenes.Bouncer, "StatusBarKeyguardViewManager.showBouncerOrKeyguard");
+                } else {
+                    mPrimaryBouncerInteractor.show(/* isScrimmed= */ true);
+                }
             } else {
                 Log.e(TAG, "Attempted to show the sim bouncer when it is already showing.");
             }
@@ -723,6 +746,16 @@
      *                 {@see KeyguardBouncer#show(boolean, boolean)}
      */
     public void showBouncer(boolean scrimmed) {
+        if (DeviceEntryUdfpsRefactor.isEnabled()) {
+            if (mAlternateBouncerInteractor.canShowAlternateBouncerForFingerprint()) {
+                mAlternateBouncerInteractor.forceShow();
+                updateAlternateBouncerShowing(mAlternateBouncerInteractor.isVisibleState());
+            } else {
+                showPrimaryBouncer(scrimmed);
+            }
+            return;
+        }
+
         if (!mAlternateBouncerInteractor.show()) {
             showPrimaryBouncer(scrimmed);
         } else {
@@ -753,7 +786,12 @@
     public void showPrimaryBouncer(boolean scrimmed) {
         hideAlternateBouncer(false);
         if (mKeyguardStateController.isShowing() && !isBouncerShowing()) {
-            mPrimaryBouncerInteractor.show(scrimmed);
+            if (SceneContainerFlag.isEnabled()) {
+                mSceneInteractorLazy.get().changeScene(
+                        Scenes.Bouncer, "StatusBarKeyguardViewManager.showPrimaryBouncer");
+            } else {
+                mPrimaryBouncerInteractor.show(scrimmed);
+            }
         }
         updateStates();
     }
@@ -765,7 +803,7 @@
 
     public void dismissWithAction(OnDismissAction r, Runnable cancelAction,
             boolean afterKeyguardGone, String message) {
-        if (mFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+        if (RefactorKeyguardDismissIntent.isEnabled()) {
             if (r == null) {
                 return;
             }
@@ -817,7 +855,7 @@
                     return;
                 }
 
-                if (!mFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+                if (!RefactorKeyguardDismissIntent.isEnabled()) {
                     mAfterKeyguardGoneAction = r;
                     mKeyguardGoneCancelAction = cancelAction;
                     mDismissActionWillAnimateOnKeyguard = r != null
@@ -834,7 +872,12 @@
                         mKeyguardGoneCancelAction = null;
                     }
 
-                    updateAlternateBouncerShowing(mAlternateBouncerInteractor.show());
+                    if (DeviceEntryUdfpsRefactor.isEnabled()) {
+                        mAlternateBouncerInteractor.forceShow();
+                        updateAlternateBouncerShowing(mAlternateBouncerInteractor.isVisibleState());
+                    } else {
+                        updateAlternateBouncerShowing(mAlternateBouncerInteractor.show());
+                    }
                     setKeyguardMessage(message, null, null);
                     return;
                 }
@@ -843,13 +886,23 @@
                 if (afterKeyguardGone) {
                     // we'll handle the dismiss action after keyguard is gone, so just show the
                     // bouncer
-                    mPrimaryBouncerInteractor.show(/* isScrimmed= */true);
+                    if (SceneContainerFlag.isEnabled()) {
+                        mSceneInteractorLazy.get().changeScene(
+                                Scenes.Bouncer, "StatusBarKeyguardViewManager.dismissWithAction");
+                    } else {
+                        mPrimaryBouncerInteractor.show(/* isScrimmed= */ true);
+                    }
                 } else {
                     // after authentication success, run dismiss action with the option to defer
                     // hiding the keyguard based on the return value of the OnDismissAction
                     mPrimaryBouncerInteractor.setDismissAction(
                             mAfterKeyguardGoneAction, mKeyguardGoneCancelAction);
-                    mPrimaryBouncerInteractor.show(/* isScrimmed= */true);
+                    if (SceneContainerFlag.isEnabled()) {
+                        mSceneInteractorLazy.get().changeScene(
+                                Scenes.Bouncer, "StatusBarKeyguardViewManager.dismissWithAction");
+                    } else {
+                        mPrimaryBouncerInteractor.show(/* isScrimmed= */ true);
+                    }
                     // bouncer will handle the dismiss action, so we no longer need to track it here
                     mAfterKeyguardGoneAction = null;
                     mKeyguardGoneCancelAction = null;
@@ -870,7 +923,7 @@
      * Adds a {@param runnable} to be executed after Keyguard is gone.
      */
     public void addAfterKeyguardGoneRunnable(Runnable runnable) {
-        if (mFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+        if (RefactorKeyguardDismissIntent.isEnabled()) {
             if (runnable != null) {
                 mKeyguardDismissActionInteractor.get().runAfterKeyguardGone(runnable);
             }
@@ -1063,7 +1116,7 @@
             // We update the state (which will show the keyguard) only if an animation will run on
             // the keyguard. If there is no animation, we wait before updating the state so that we
             // go directly from bouncer to launcher/app.
-            if (mFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+            if (RefactorKeyguardDismissIntent.isEnabled()) {
                 if (mKeyguardDismissActionInteractor.get().runDismissAnimationOnKeyguard()) {
                     updateStates();
                 }
@@ -1190,7 +1243,7 @@
     }
 
     private void executeAfterKeyguardGoneAction() {
-        if (mFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT)) {
+        if (RefactorKeyguardDismissIntent.isEnabled()) {
             return;
         }
         if (mAfterKeyguardGoneAction != null) {
@@ -1579,7 +1632,7 @@
         pw.println("  bouncerIsOrWillBeShowing(): " + primaryBouncerIsOrWillBeShowing());
         pw.println("  Registered KeyguardViewManagerCallbacks:");
         pw.println(" refactorKeyguardDismissIntent enabled:"
-                + mFlags.isEnabled(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT));
+                + RefactorKeyguardDismissIntent.isEnabled());
         for (KeyguardViewManagerCallback callback : mCallbacks) {
             pw.println("      " + callback);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
index c193783..79ea59c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -247,7 +247,7 @@
         if (nowExpanded) {
             if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD) {
                 mShadeTransitionController.goToLockedShade(clickedEntry.getRow());
-            } else if (clickedEntry.isSensitive()
+            } else if (clickedEntry.isSensitive().getValue()
                     && mDynamicPrivacyController.isInLockedDownShade()) {
                 mStatusBarStateController.setLeaveOpenOnKeyguardHide(true);
                 mActivityStarter.dismissKeyguardThenExecute(() -> false /* dismissAction */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
index 82d9fc7..2a921dc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
@@ -42,6 +42,7 @@
 import android.view.WindowManager.LayoutParams;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.StyleRes;
 
 import com.android.systemui.Dependency;
 import com.android.systemui.animation.DialogTransitionAnimator;
@@ -71,7 +72,7 @@
  * and dismisses itself when it receives the broadcast.
  */
 public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigChangedCallback {
-    protected static final int DEFAULT_THEME = R.style.Theme_SystemUI_Dialog;
+    public static final int DEFAULT_THEME = R.style.Theme_SystemUI_Dialog;
     // TODO(b/203389579): Remove this once the dialog width on large screens has been agreed on.
     private static final String FLAG_TABLET_DIALOG_WIDTH =
             "persist.systemui.flag_tablet_dialog_width";
@@ -141,7 +142,7 @@
          * When you just need a dialog, call this.
          */
         public SystemUIDialog create() {
-            return create(new DialogDelegate<>(){}, mContext);
+            return create(new DialogDelegate<>(){}, mContext, DEFAULT_THEME);
         }
 
         /** Creates a new instance of {@link SystemUIDialog} with no customized behavior.
@@ -149,7 +150,7 @@
          * When you just need a dialog created with a specific {@link Context}, call this.
          */
         public SystemUIDialog create(Context context) {
-            return create(new DialogDelegate<>(){}, context);
+            return create(new DialogDelegate<>(){}, context, DEFAULT_THEME);
         }
 
         /**
@@ -159,7 +160,10 @@
          * When you need to customize the dialog, pass it a delegate.
          */
         public SystemUIDialog create(Delegate delegate, Context context) {
-            return create((DialogDelegate<SystemUIDialog>) delegate, context);
+            return create(delegate, context, DEFAULT_THEME);
+        }
+        public SystemUIDialog create(Delegate delegate, Context context, @StyleRes int theme) {
+            return create((DialogDelegate<SystemUIDialog>) delegate, context, theme);
         }
 
         public SystemUIDialog create(Delegate delegate) {
@@ -167,10 +171,10 @@
         }
 
         private SystemUIDialog create(DialogDelegate<SystemUIDialog> dialogDelegate,
-                Context context) {
+                Context context, @StyleRes int theme) {
             return new SystemUIDialog(
                     context,
-                    DEFAULT_THEME,
+                    theme,
                     DEFAULT_DISMISS_ON_DEVICE_LOCK,
                     mSystemUIDialogManager,
                     mSysUiState,
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 617e107..c52132f 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
@@ -46,7 +46,7 @@
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.res.R;
 import com.android.systemui.shade.ShadeExpansionStateManager;
-import com.android.systemui.shade.ShadeViewController;
+import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.OperatorNameView;
 import com.android.systemui.statusbar.OperatorNameViewController;
@@ -79,6 +79,8 @@
 import com.android.systemui.util.CarrierConfigTracker.DefaultDataSubscriptionChangedListener;
 import com.android.systemui.util.settings.SecureSettings;
 
+import kotlin.Unit;
+
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -89,8 +91,6 @@
 
 import javax.inject.Inject;
 
-import kotlin.Unit;
-
 import kotlinx.coroutines.DisposableHandle;
 
 /**
@@ -115,7 +115,7 @@
     private PhoneStatusBarView mStatusBar;
     private final StatusBarStateController mStatusBarStateController;
     private final KeyguardStateController mKeyguardStateController;
-    private final ShadeViewController mShadeViewController;
+    private final PanelExpansionInteractor mPanelExpansionInteractor;
     private MultiSourceMinAlphaController mEndSideAlphaController;
     private LinearLayout mEndSideContent;
     private View mClockView;
@@ -227,7 +227,7 @@
             CollapsedStatusBarViewBinder collapsedStatusBarViewBinder,
             StatusBarHideIconsForBouncerManager statusBarHideIconsForBouncerManager,
             KeyguardStateController keyguardStateController,
-            ShadeViewController shadeViewController,
+            PanelExpansionInteractor panelExpansionInteractor,
             StatusBarStateController statusBarStateController,
             NotificationIconContainerStatusBarViewBinder nicViewBinder,
             CommandQueue commandQueue,
@@ -252,7 +252,7 @@
         mStatusBarHideIconsForBouncerManager = statusBarHideIconsForBouncerManager;
         mDarkIconManagerFactory = darkIconManagerFactory;
         mKeyguardStateController = keyguardStateController;
-        mShadeViewController = shadeViewController;
+        mPanelExpansionInteractor = panelExpansionInteractor;
         mStatusBarStateController = statusBarStateController;
         mNicViewBinder = nicViewBinder;
         mCommandQueue = commandQueue;
@@ -603,7 +603,7 @@
 
     private boolean shouldHideStatusBar() {
         if (!mShadeExpansionStateManager.isClosed()
-                && mShadeViewController.shouldHideStatusBarIconsWhenExpanded()) {
+                && mPanelExpansionInteractor.shouldHideStatusBarIconsWhenExpanded()) {
             return true;
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractor.kt
index c6c8823..684e38e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractor.kt
@@ -23,6 +23,7 @@
 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
 import javax.inject.Inject
 import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.map
 
 /**
@@ -40,7 +41,7 @@
     private val mobileConnectionsRepository: MobileConnectionsRepository,
 ) {
     /** True if the device is currently in airplane mode. */
-    val isAirplaneMode: Flow<Boolean> = airplaneModeRepository.isAirplaneMode
+    val isAirplaneMode: StateFlow<Boolean> = airplaneModeRepository.isAirplaneMode
 
     /** True if we're configured to force-hide the airplane mode icon and false otherwise. */
     val isForceHidden: Flow<Boolean> =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/model/SignalIconModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/model/SignalIconModel.kt
index d6b8fd4..5d3b9ef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/model/SignalIconModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/model/SignalIconModel.kt
@@ -94,7 +94,8 @@
         }
 
         override fun logFully(row: TableRowLogger) {
-            row.logChange("numLevels", "HELLO")
+            // Satellite icon has only 3 levels, unchanging
+            row.logChange(COL_NUM_LEVELS, "3")
             row.logChange(COL_TYPE, "s")
             row.logChange(COL_LEVEL, level)
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt
index 3f89d04b..08ed030 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt
@@ -22,6 +22,7 @@
 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
 import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepository
 import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
+import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -39,6 +40,7 @@
 constructor(
     val repo: DeviceBasedSatelliteRepository,
     iconsInteractor: MobileIconsInteractor,
+    deviceProvisioningInteractor: DeviceProvisioningInteractor,
     @Application scope: CoroutineScope,
 ) {
     /** Must be observed by any UI showing Satellite iconography */
@@ -69,6 +71,8 @@
             }
             .stateIn(scope, SharingStarted.WhileSubscribed(), 0)
 
+    val isDeviceProvisioned: Flow<Boolean> = deviceProvisioningInteractor.isDeviceProvisioned
+
     /** When all connections are considered OOS, satellite connectivity is potentially valid */
     val areAllConnectionsOutOfService =
         if (Flags.oemEnabledSatelliteFlag()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt
index bef6b0b..40641be 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt
@@ -56,10 +56,12 @@
             if (!allOos) {
                 flowOf(false)
             } else {
-                combine(interactor.isSatelliteAllowed, airplaneModeRepository.isAirplaneMode) {
-                    isSatelliteAllowed,
-                    isAirplaneMode ->
-                    isSatelliteAllowed && !isAirplaneMode
+                combine(
+                    interactor.isSatelliteAllowed,
+                    interactor.isDeviceProvisioned,
+                    airplaneModeRepository.isAirplaneMode
+                ) { isSatelliteAllowed, isDeviceProvisioned, isAirplaneMode ->
+                    isSatelliteAllowed && isDeviceProvisioned && !isAirplaneMode
                 }
             }
         }
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 55a0f59..9cdecef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt
@@ -17,9 +17,12 @@
 
 import android.util.Log
 import androidx.annotation.VisibleForTesting
+import com.android.systemui.Dumpable
 import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dump.DumpManager
 import com.android.systemui.statusbar.notification.shared.NotificationThrottleHun
 import com.android.systemui.statusbar.policy.BaseHeadsUpManager.HeadsUpEntry
+import java.io.PrintWriter
 import javax.inject.Inject
 
 /*
@@ -27,7 +30,9 @@
  * succession, by delaying visual listener side effects and removal handling from BaseHeadsUpManager
  */
 @SysUISingleton
-class AvalancheController @Inject constructor() {
+class AvalancheController @Inject constructor(
+    dumpManager: DumpManager,
+) : Dumpable {
 
     private val tag = "AvalancheController"
     private val debug = false
@@ -54,22 +59,26 @@
     // For debugging only
     @VisibleForTesting var debugDropSet: MutableSet<HeadsUpEntry> = HashSet()
 
-    /**
-     * Run or delay Runnable for given HeadsUpEntry
-     */
-    fun update(entry: HeadsUpEntry, runnable: Runnable, label: String) {
+    init {
+        dumpManager.registerNormalDumpable(tag, /* module */ this)
+    }
+
+    /** Run or delay Runnable for given HeadsUpEntry */
+    fun update(entry: HeadsUpEntry?, runnable: Runnable, label: String) {
         if (!NotificationThrottleHun.isEnabled) {
             runnable.run()
             return
         }
         val fn = "[$label] => AvalancheController.update ${getKey(entry)}"
-
+        if (entry == null) {
+            log { "Entry is NULL, stop update." }
+            return;
+        }
         if (debug) {
             debugRunnableLabelMap[runnable] = label
         }
-
         if (isShowing(entry)) {
-            log {"$fn => [update showing]" }
+            log { "$fn => [update showing]" }
             runnable.run()
         } else if (entry in nextMap) {
             log { "$fn => [update next]" }
@@ -164,9 +173,7 @@
         }
     }
 
-    /**
-     * Return true if entry is waiting to show.
-     */
+    /** Return true if entry is waiting to show. */
     fun isWaiting(key: String): Boolean {
         if (!NotificationThrottleHun.isEnabled) {
             return false
@@ -179,9 +186,7 @@
         return false
     }
 
-    /**
-     * Return list of keys for huns waiting
-     */
+    /** Return list of keys for huns waiting */
     fun getWaitingKeys(): MutableList<String> {
         if (!NotificationThrottleHun.isEnabled) {
             return mutableListOf()
@@ -254,12 +259,15 @@
         }
     }
 
-    // TODO(b/315362456) expose as dumpable for bugreports
+    private fun getStateStr(): String {
+        return "SHOWING: ${getKey(headsUpEntryShowing)}" +
+            "\tNEXT LIST: $nextListStr\tMAP: $nextMapStr" +
+            "\tDROP: $dropSetStr"
+    }
+
     private fun logState(reason: String) {
-        log { "state $reason" }
-        log { "showing: " + getKey(headsUpEntryShowing) }
-        log { "next list: $nextListStr map: $nextMapStr" }
-        log { "drop: $dropSetStr" }
+        log { "REASON $reason" }
+        log { getStateStr() }
     }
 
     private val dropSetStr: String
@@ -298,4 +306,8 @@
         }
         return entry.mEntry!!.key
     }
+
+    override fun dump(pw: PrintWriter, args: Array<out String>) {
+        pw.println("AvalancheController: ${getStateStr()}")
+    }
 }
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 20a82a4..d99af2d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BaseHeadsUpManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BaseHeadsUpManager.java
@@ -165,6 +165,8 @@
     public void showNotification(@NonNull NotificationEntry entry) {
         HeadsUpEntry headsUpEntry = createHeadsUpEntry(entry);
 
+        mLogger.logShowNotificationRequest(entry);
+
         Runnable runnable = () -> {
             // TODO(b/315362456) log outside runnable too
             mLogger.logShowNotification(entry);
@@ -219,6 +221,8 @@
      */
     public void updateNotification(@NonNull String key, boolean shouldHeadsUpAgain) {
         HeadsUpEntry headsUpEntry = mHeadsUpEntryMap.get(key);
+        mLogger.logUpdateNotificationRequest(key, shouldHeadsUpAgain, headsUpEntry != null);
+
         Runnable runnable = () -> {
             updateNotificationInternal(key, shouldHeadsUpAgain);
         };
@@ -378,8 +382,11 @@
      */
     protected final void removeEntry(@NonNull String key) {
         HeadsUpEntry headsUpEntry = mHeadsUpEntryMap.get(key);
+        mLogger.logRemoveEntryRequest(key);
 
         Runnable runnable = () -> {
+            mLogger.logRemoveEntry(key);
+
             if (headsUpEntry == null) {
                 return;
             }
@@ -566,8 +573,10 @@
     public void unpinAll(boolean userUnPinned) {
         for (String key : mHeadsUpEntryMap.keySet()) {
             HeadsUpEntry headsUpEntry = getHeadsUpEntry(key);
-
+            mLogger.logUnpinEntryRequest(key);
             Runnable runnable = () -> {
+                mLogger.logUnpinEntry(key);
+
                 setEntryPinned(headsUpEntry, false /* isPinned */);
                 // maybe it got un sticky
                 headsUpEntry.updateEntry(false /* updatePostTime */, "unpinAll");
@@ -886,6 +895,7 @@
          * Clear any pending removal runnables.
          */
         public void cancelAutoRemovalCallbacks(@Nullable String reason) {
+            mLogger.logAutoRemoveCancelRequest(this.mEntry, reason);
             Runnable runnable = () -> {
                 final boolean removed = cancelAutoRemovalCallbackInternal();
 
@@ -900,6 +910,7 @@
         public void scheduleAutoRemovalCallback(FinishTimeUpdater finishTimeCalculator,
                 @NonNull String reason) {
 
+            mLogger.logAutoRemoveRequest(this.mEntry, reason);
             Runnable runnable = () -> {
                 long delayMs = finishTimeCalculator.updateAndGetTimeRemaining();
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
index 13f76fe..7d920ea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
@@ -27,6 +27,7 @@
 
 import com.android.systemui.res.R;
 import com.android.systemui.settings.brightness.BrightnessSliderController;
+import com.android.systemui.settings.brightness.MirrorController;
 import com.android.systemui.settings.brightness.ToggleSlider;
 import com.android.systemui.shade.NotificationShadeWindowView;
 import com.android.systemui.shade.ShadeViewController;
@@ -38,8 +39,7 @@
 /**
  * Controls showing and hiding of the brightness mirror.
  */
-public class BrightnessMirrorController
-        implements CallbackController<BrightnessMirrorController.BrightnessMirrorListener> {
+public class BrightnessMirrorController implements MirrorController {
 
     private final NotificationShadeWindowView mStatusBarWindow;
     private final Consumer<Boolean> mVisibilityCallback;
@@ -71,6 +71,7 @@
         updateResources();
     }
 
+    @Override
     public void showMirror() {
         mBrightnessMirror.setVisibility(View.VISIBLE);
         mVisibilityCallback.accept(true);
@@ -78,16 +79,14 @@
         mDepthController.setBrightnessMirrorVisible(true);
     }
 
+    @Override
     public void hideMirror() {
         mVisibilityCallback.accept(false);
         mNotificationPanel.setAlpha(255, true /* animate */);
         mDepthController.setBrightnessMirrorVisible(false);
     }
 
-    /**
-     * Set the location and size of the mirror container to match that of the slider in QS
-     * @param original the original view in QS
-     */
+    @Override
     public void setLocationAndSize(View original) {
         original.getLocationInWindow(mInt2Cache);
 
@@ -112,6 +111,7 @@
         }
     }
 
+    @Override
     public ToggleSlider getToggleSlider() {
         return mToggleSliderController;
     }
@@ -176,8 +176,4 @@
     public void onUiModeChanged() {
         reinflate();
     }
-
-    public interface BrightnessMirrorListener {
-        void onBrightnessMirrorReinflated(View brightnessMirror);
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedController.java
index 0d09fc1..e432158 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedController.java
@@ -50,9 +50,6 @@
      */
     boolean isCurrentUserSetup();
 
-    /** Returns true when Factory Reset Protection is locking the device. */
-    boolean isFrpActive();
-
     /**
      * Interface to provide calls when the values tracked change
      */
@@ -73,10 +70,5 @@
          * Call when some user changes from not provisioned to provisioned
          */
         default void onUserSetupChanged() { }
-
-        /**
-         * Called when the state of FRP changes.
-         */
-        default void onFrpActiveChanged() {}
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.kt
index 8b20283..8b63dfe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.kt
@@ -36,7 +36,6 @@
 import com.android.systemui.settings.UserTracker
 import com.android.systemui.util.settings.GlobalSettings
 import com.android.systemui.util.settings.SecureSettings
-import com.android.systemui.util.wrapper.BuildInfo
 import java.io.PrintWriter
 import java.util.concurrent.Executor
 import java.util.concurrent.atomic.AtomicBoolean
@@ -48,7 +47,6 @@
     private val globalSettings: GlobalSettings,
     private val userTracker: UserTracker,
     private val dumpManager: DumpManager,
-    private val buildInfo: BuildInfo,
     @Background private val backgroundHandler: Handler,
     @Main private val mainExecutor: Executor
 ) : DeviceProvisionedController,
@@ -62,11 +60,9 @@
     }
 
     private val deviceProvisionedUri = globalSettings.getUriFor(Settings.Global.DEVICE_PROVISIONED)
-    private val frpActiveUri = globalSettings.getUriFor(Settings.Global.SECURE_FRP_MODE)
     private val userSetupUri = secureSettings.getUriFor(Settings.Secure.USER_SETUP_COMPLETE)
 
     private val deviceProvisioned = AtomicBoolean(false)
-    private val frpActive = AtomicBoolean(false)
     @GuardedBy("lock")
     private val userSetupComplete = SparseBooleanArray()
     @GuardedBy("lock")
@@ -93,15 +89,11 @@
             userId: Int
         ) {
             val updateDeviceProvisioned = deviceProvisionedUri in uris
-            val updateFrp = frpActiveUri in uris
             val updateUser = if (userSetupUri in uris) userId else NO_USERS
-            updateValues(updateDeviceProvisioned, updateFrp, updateUser)
+            updateValues(updateDeviceProvisioned, updateUser)
             if (updateDeviceProvisioned) {
                 onDeviceProvisionedChanged()
             }
-            if (updateFrp) {
-                onFrpActiveChanged()
-            }
             if (updateUser != NO_USERS) {
                 onUserSetupChanged()
             }
@@ -111,7 +103,7 @@
     private val userChangedCallback = object : UserTracker.Callback {
         @WorkerThread
         override fun onUserChanged(newUser: Int, userContext: Context) {
-            updateValues(updateDeviceProvisioned = false, updateFrp = false, updateUser = newUser)
+            updateValues(updateDeviceProvisioned = false, updateUser = newUser)
             onUserSwitched()
         }
 
@@ -133,23 +125,18 @@
         updateValues()
         userTracker.addCallback(userChangedCallback, backgroundExecutor)
         globalSettings.registerContentObserver(deviceProvisionedUri, observer)
-        globalSettings.registerContentObserver(frpActiveUri, observer)
         secureSettings.registerContentObserverForUser(userSetupUri, observer, UserHandle.USER_ALL)
     }
 
     @WorkerThread
     private fun updateValues(
-        updateDeviceProvisioned: Boolean = true,
-        updateFrp: Boolean = true,
-        updateUser: Int = ALL_USERS
+            updateDeviceProvisioned: Boolean = true,
+            updateUser: Int = ALL_USERS
     ) {
         if (updateDeviceProvisioned) {
             deviceProvisioned
                     .set(globalSettings.getInt(Settings.Global.DEVICE_PROVISIONED, 0) != 0)
         }
-        if (updateFrp) {
-            frpActive.set(globalSettings.getInt(Settings.Global.SECURE_FRP_MODE, 0) != 0)
-        }
         synchronized(lock) {
             if (updateUser == ALL_USERS) {
                 val n = userSetupComplete.size()
@@ -188,10 +175,6 @@
         return deviceProvisioned.get()
     }
 
-    override fun isFrpActive(): Boolean {
-        return frpActive.get() && !buildInfo.isDebuggable
-    }
-
     override fun isUserSetup(user: Int): Boolean {
         val index = synchronized(lock) {
             userSetupComplete.indexOfKey(user)
@@ -220,12 +203,6 @@
         )
     }
 
-    override fun onFrpActiveChanged() {
-        dispatchChange(
-            DeviceProvisionedController.DeviceProvisionedListener::onFrpActiveChanged
-        )
-    }
-
     override fun onUserSetupChanged() {
         dispatchChange(DeviceProvisionedController.DeviceProvisionedListener::onUserSetupChanged)
     }
@@ -247,7 +224,6 @@
 
     override fun dump(pw: PrintWriter, args: Array<out String>) {
         pw.println("Device provisioned: ${deviceProvisioned.get()}")
-        pw.println("Factory Reset Protection active: ${frpActive.get()}")
         synchronized(lock) {
             pw.println("User setup complete: $userSetupComplete")
             pw.println("Listeners: $listeners")
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt
index f6154afe..a306606 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt
@@ -58,6 +58,14 @@
         })
     }
 
+    fun logShowNotificationRequest(entry: NotificationEntry) {
+        buffer.log(TAG, INFO, {
+            str1 = entry.logKey
+        }, {
+            "request: show notification $str1"
+        })
+    }
+
     fun logShowNotification(entry: NotificationEntry) {
         buffer.log(TAG, INFO, {
             str1 = entry.logKey
@@ -76,6 +84,15 @@
         })
     }
 
+    fun logAutoRemoveRequest(entry: NotificationEntry, reason: String) {
+        buffer.log(TAG, INFO, {
+            str1 = entry.logKey
+            str2 = reason
+        }, {
+            "request: reschedule auto remove of $str1 reason: $str2"
+        })
+    }
+
     fun logAutoRemoveRescheduled(entry: NotificationEntry, delayMillis: Long, reason: String) {
         buffer.log(TAG, INFO, {
             str1 = entry.logKey
@@ -86,6 +103,15 @@
         })
     }
 
+    fun logAutoRemoveCancelRequest(entry: NotificationEntry, reason: String?) {
+        buffer.log(TAG, INFO, {
+            str1 = entry.logKey
+            str2 = reason ?: "unknown"
+        }, {
+            "request: cancel auto remove of $str1 reason: $str2"
+        })
+    }
+
     fun logAutoRemoveCanceled(entry: NotificationEntry, reason: String?) {
         buffer.log(TAG, INFO, {
             str1 = entry.logKey
@@ -95,6 +121,38 @@
         })
     }
 
+    fun logRemoveEntryRequest(key: String) {
+        buffer.log(TAG, INFO, {
+            str1 = logKey(key)
+        }, {
+            "request: remove entry $str1"
+        })
+    }
+
+    fun logRemoveEntry(key: String) {
+        buffer.log(TAG, INFO, {
+            str1 = logKey(key)
+        }, {
+            "remove entry $str1"
+        })
+    }
+
+    fun logUnpinEntryRequest(key: String) {
+        buffer.log(TAG, INFO, {
+            str1 = logKey(key)
+        }, {
+            "request: unpin entry $str1"
+        })
+    }
+
+    fun logUnpinEntry(key: String) {
+        buffer.log(TAG, INFO, {
+            str1 = logKey(key)
+        }, {
+            "unpin entry $str1"
+        })
+    }
+
     fun logRemoveNotification(key: String, releaseImmediately: Boolean) {
         buffer.log(TAG, INFO, {
             str1 = logKey(key)
@@ -112,6 +170,16 @@
         })
     }
 
+    fun logUpdateNotificationRequest(key: String, alert: Boolean, hasEntry: Boolean) {
+        buffer.log(TAG, INFO, {
+            str1 = logKey(key)
+            bool1 = alert
+            bool2 = hasEntry
+        }, {
+            "request: update notification $str1 alert: $bool1 hasEntry: $bool2 reason: $str2"
+        })
+    }
+
     fun logUpdateNotification(key: String, alert: Boolean, hasEntry: Boolean) {
         buffer.log(TAG, INFO, {
             str1 = logKey(key)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/PolicyModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/PolicyModule.kt
index 7a57027..db4e605d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/PolicyModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/PolicyModule.kt
@@ -14,6 +14,12 @@
 
 package com.android.systemui.statusbar.policy
 
+import android.hardware.SensorPrivacyManager.Sensors.CAMERA
+import android.hardware.SensorPrivacyManager.Sensors.MICROPHONE
+import android.os.UserManager.DISALLOW_CAMERA_TOGGLE
+import android.os.UserManager.DISALLOW_CONFIG_LOCATION
+import android.os.UserManager.DISALLOW_MICROPHONE_TOGGLE
+import android.os.UserManager.DISALLOW_SHARE_LOCATION
 import com.android.systemui.qs.QsEventLogger
 import com.android.systemui.qs.pipeline.shared.TileSpec
 import com.android.systemui.qs.tileimpl.QSTileImpl
@@ -38,6 +44,11 @@
 import com.android.systemui.qs.tiles.impl.location.domain.interactor.LocationTileDataInteractor
 import com.android.systemui.qs.tiles.impl.location.domain.interactor.LocationTileUserActionInteractor
 import com.android.systemui.qs.tiles.impl.location.domain.model.LocationTileModel
+import com.android.systemui.qs.tiles.impl.sensorprivacy.SensorPrivacyToggleTileDataInteractor
+import com.android.systemui.qs.tiles.impl.sensorprivacy.domain.SensorPrivacyToggleTileUserActionInteractor
+import com.android.systemui.qs.tiles.impl.sensorprivacy.domain.model.SensorPrivacyToggleTileModel
+import com.android.systemui.qs.tiles.impl.sensorprivacy.ui.SensorPrivacyTileResources
+import com.android.systemui.qs.tiles.impl.sensorprivacy.ui.SensorPrivacyToggleTileMapper
 import com.android.systemui.qs.tiles.impl.uimodenight.domain.UiModeNightTileMapper
 import com.android.systemui.qs.tiles.impl.uimodenight.domain.interactor.UiModeNightTileDataInteractor
 import com.android.systemui.qs.tiles.impl.uimodenight.domain.interactor.UiModeNightTileUserActionInteractor
@@ -47,6 +58,7 @@
 import com.android.systemui.qs.tiles.impl.work.domain.model.WorkModeTileModel
 import com.android.systemui.qs.tiles.impl.work.ui.WorkModeTileMapper
 import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
+import com.android.systemui.qs.tiles.viewmodel.QSTilePolicy
 import com.android.systemui.qs.tiles.viewmodel.QSTileUIConfig
 import com.android.systemui.qs.tiles.viewmodel.QSTileViewModel
 import com.android.systemui.res.R
@@ -74,6 +86,8 @@
         const val ALARM_TILE_SPEC = "alarm"
         const val UIMODENIGHT_TILE_SPEC = "dark"
         const val WORK_MODE_TILE_SPEC = "work"
+        const val CAMERA_TOGGLE_TILE_SPEC = "cameratoggle"
+        const val MIC_TOGGLE_TILE_SPEC = "mictoggle"
 
         /** Inject flashlight config */
         @Provides
@@ -120,6 +134,13 @@
                         labelRes = R.string.quick_settings_location_label,
                     ),
                 instanceId = uiEventLogger.getNewInstanceId(),
+                policy =
+                    QSTilePolicy.Restricted(
+                        listOf(
+                            DISALLOW_SHARE_LOCATION,
+                            DISALLOW_CONFIG_LOCATION
+                        )
+                    )
             )
 
         /** Inject LocationTile into tileViewModelMap in QSModule */
@@ -234,6 +255,72 @@
                 stateInteractor,
                 mapper,
             )
+
+        /** Inject camera toggle config */
+        @Provides
+        @IntoMap
+        @StringKey(CAMERA_TOGGLE_TILE_SPEC)
+        fun provideCameraToggleTileConfig(uiEventLogger: QsEventLogger): QSTileConfig =
+            QSTileConfig(
+                tileSpec = TileSpec.create(CAMERA_TOGGLE_TILE_SPEC),
+                uiConfig =
+                    QSTileUIConfig.Resource(
+                        iconRes = R.drawable.qs_camera_access_icon_off,
+                        labelRes = R.string.quick_settings_camera_label,
+                    ),
+                instanceId = uiEventLogger.getNewInstanceId(),
+                policy = QSTilePolicy.Restricted(listOf(DISALLOW_CAMERA_TOGGLE)),
+            )
+
+        /** Inject camera toggle tile into tileViewModelMap in QSModule */
+        @Provides
+        @IntoMap
+        @StringKey(CAMERA_TOGGLE_TILE_SPEC)
+        fun provideCameraToggleTileViewModel(
+            factory: QSTileViewModelFactory.Static<SensorPrivacyToggleTileModel>,
+            mapper: SensorPrivacyToggleTileMapper.Factory,
+            stateInteractor: SensorPrivacyToggleTileDataInteractor.Factory,
+            userActionInteractor: SensorPrivacyToggleTileUserActionInteractor.Factory,
+        ): QSTileViewModel =
+            factory.create(
+                TileSpec.create(CAMERA_TOGGLE_TILE_SPEC),
+                userActionInteractor.create(CAMERA),
+                stateInteractor.create(CAMERA),
+                mapper.create(SensorPrivacyTileResources.CameraPrivacyTileResources),
+            )
+
+        /** Inject microphone toggle config */
+        @Provides
+        @IntoMap
+        @StringKey(MIC_TOGGLE_TILE_SPEC)
+        fun provideMicrophoneToggleTileConfig(uiEventLogger: QsEventLogger): QSTileConfig =
+            QSTileConfig(
+                tileSpec = TileSpec.create(MIC_TOGGLE_TILE_SPEC),
+                uiConfig =
+                    QSTileUIConfig.Resource(
+                        iconRes = R.drawable.qs_mic_access_off,
+                        labelRes = R.string.quick_settings_mic_label,
+                    ),
+                instanceId = uiEventLogger.getNewInstanceId(),
+                policy = QSTilePolicy.Restricted(listOf(DISALLOW_MICROPHONE_TOGGLE)),
+            )
+
+        /** Inject microphone toggle tile into tileViewModelMap in QSModule */
+        @Provides
+        @IntoMap
+        @StringKey(MIC_TOGGLE_TILE_SPEC)
+        fun provideMicrophoneToggleTileViewModel(
+            factory: QSTileViewModelFactory.Static<SensorPrivacyToggleTileModel>,
+            mapper: SensorPrivacyToggleTileMapper.Factory,
+            stateInteractor: SensorPrivacyToggleTileDataInteractor.Factory,
+            userActionInteractor: SensorPrivacyToggleTileUserActionInteractor.Factory,
+        ): QSTileViewModel =
+            factory.create(
+                TileSpec.create(MIC_TOGGLE_TILE_SPEC),
+                userActionInteractor.create(MICROPHONE),
+                stateInteractor.create(MICROPHONE),
+                mapper.create(SensorPrivacyTileResources.MicrophonePrivacyTileResources),
+            )
     }
 
     /** Inject FlashlightTile into tileMap in QSModule */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index 9633cb0..1fc7bf4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -45,7 +45,6 @@
 import android.view.MotionEvent;
 import android.view.OnReceiveContentListener;
 import android.view.View;
-import android.view.ViewAnimationUtils;
 import android.view.ViewGroup;
 import android.view.ViewRootImpl;
 import android.view.WindowInsets;
@@ -85,9 +84,7 @@
 import com.android.systemui.statusbar.RemoteInputController;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
 import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
-import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
 import com.android.systemui.statusbar.phone.LightBarController;
-import com.android.wm.shell.animation.Interpolators;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -132,8 +129,6 @@
     private boolean mColorized;
     private int mLastBackgroundColor;
     private boolean mResetting;
-    @Nullable
-    private RevealParams mRevealParams;
     private Rect mContentBackgroundBounds;
     private boolean mIsAnimatingAppearance = false;
 
@@ -453,6 +448,7 @@
                         setTopMargin(0);
                         if (grandParent != null) grandParent.setClipChildren(true);
                         setVisibility(GONE);
+                        setAlpha(1f);
                         if (mWrapper != null) {
                             mWrapper.setRemoteInputVisible(false);
                         }
@@ -464,20 +460,6 @@
                 if (actionsContainer != null) actionsContainer.setAlpha(0f);
                 animator.start();
 
-            } else if (animate && mRevealParams != null && mRevealParams.radius > 0) {
-                android.animation.Animator reveal = mRevealParams.createCircularHideAnimator(this);
-                reveal.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN);
-                reveal.setDuration(StackStateAnimator.ANIMATION_DURATION_CLOSE_REMOTE_INPUT);
-                reveal.addListener(new android.animation.AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(android.animation.Animator animation) {
-                        setVisibility(GONE);
-                        if (mWrapper != null) {
-                            mWrapper.setRemoteInputVisible(false);
-                        }
-                    }
-                });
-                reveal.start();
             } else {
                 setVisibility(GONE);
                 if (doAfterDefocus != null) doAfterDefocus.run();
@@ -719,10 +701,6 @@
         mRemoved = true;
     }
 
-    public void setRevealParameters(@Nullable RevealParams revealParams) {
-        mRevealParams = revealParams;
-    }
-
     @Override
     public void dispatchStartTemporaryDetach() {
         super.dispatchStartTemporaryDetach();
@@ -1177,24 +1155,4 @@
         }
 
     }
-
-    public static class RevealParams {
-        final int centerX;
-        final int centerY;
-        final int radius;
-
-        public RevealParams(int centerX, int centerY, int radius) {
-            this.centerX = centerX;
-            this.centerY = centerY;
-            this.radius = radius;
-        }
-
-        android.animation.Animator createCircularHideAnimator(View view) {
-            return ViewAnimationUtils.createCircularReveal(view, centerX, centerY, radius, 0);
-        }
-
-        android.animation.Animator createCircularRevealAnimator(View view) {
-            return ViewAnimationUtils.createCircularReveal(view, centerX, centerY, 0, radius);
-        }
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputViewController.kt
index bfee9ad..f619369 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputViewController.kt
@@ -30,14 +30,13 @@
 import android.util.Log
 import android.view.View
 import com.android.internal.logging.UiEventLogger
-import com.android.systemui.res.R
 import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.res.R
 import com.android.systemui.statusbar.NotificationRemoteInputManager
 import com.android.systemui.statusbar.RemoteInputController
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
 import com.android.systemui.statusbar.notification.collection.NotificationEntry.EditedSuggestionInfo
 import com.android.systemui.statusbar.policy.RemoteInputView.NotificationRemoteInputEvent
-import com.android.systemui.statusbar.policy.RemoteInputView.RevealParams
 import com.android.systemui.statusbar.policy.dagger.RemoteInputViewScope
 import javax.inject.Inject
 
@@ -61,8 +60,6 @@
     /** Other [RemoteInput]s from the notification associated with this Controller. */
     var remoteInputs: Array<RemoteInput>?
 
-    var revealParams: RevealParams?
-
     /**
      * Sets the smart reply that should be inserted in the remote input, or `null` if the user is
      * not editing a smart reply.
@@ -91,7 +88,6 @@
         other.close()
         remoteInput = other.remoteInput
         remoteInputs = other.remoteInputs
-        revealParams = other.revealParams
         pendingIntent = other.pendingIntent
         focus()
     }
@@ -142,14 +138,6 @@
     override var pendingIntent: PendingIntent? = null
     override var remoteInputs: Array<RemoteInput>? = null
 
-    override var revealParams: RevealParams? = null
-        set(value) {
-            field = value
-            if (isBound) {
-                view.setRevealParameters(value)
-            }
-        }
-
     override val isActive: Boolean get() = view.isActive
 
     override fun bind() {
@@ -161,7 +149,6 @@
             view.setHintText(it.label)
             view.setSupportedMimeTypes(it.allowedDataTypes)
         }
-        view.setRevealParameters(revealParams)
 
         view.addOnEditTextFocusChangedListener(onFocusChangeListener)
         view.addOnSendRemoteInputListener(onSendRemoteInputListener)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerImpl.java
index 1f4c3cd..0d53277 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SensitiveNotificationProtectionControllerImpl.java
@@ -20,6 +20,7 @@
 import static android.provider.Settings.Global.DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS;
 
 import static com.android.server.notification.Flags.screenshareNotificationHiding;
+import static com.android.systemui.Flags.screenshareNotificationHidingBugFix;
 
 import android.annotation.MainThread;
 import android.app.IActivityManager;
@@ -31,6 +32,7 @@
 import android.os.Handler;
 import android.os.RemoteException;
 import android.os.Trace;
+import android.os.UserHandle;
 import android.service.notification.StatusBarNotification;
 import android.util.ArraySet;
 import android.util.Log;
@@ -39,6 +41,7 @@
 import androidx.annotation.Nullable;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.FrameworkStatsLog;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dagger.qualifiers.Main;
@@ -47,6 +50,7 @@
 import com.android.systemui.util.ListenerSet;
 import com.android.systemui.util.settings.GlobalSettings;
 
+import java.util.Random;
 import java.util.concurrent.Executor;
 
 import javax.inject.Inject;
@@ -61,8 +65,25 @@
     private final ArraySet<String> mExemptPackages = new ArraySet<>();
     private final ListenerSet<Runnable> mListeners = new ListenerSet<>();
     private volatile MediaProjectionInfo mProjection;
+    private SensitiveNotificatioMediaProjectionSession mActiveMediaProjectionSession;
     boolean mDisableScreenShareProtections = false;
 
+
+    private static class SensitiveNotificatioMediaProjectionSession {
+        final long mSessionId;
+        final int mProjectionAppUid;
+        final boolean mExempt;
+
+        SensitiveNotificatioMediaProjectionSession(
+                long sessionId,
+                int projectionAppUid,
+                boolean exempt) {
+            this.mSessionId = sessionId;
+            this.mProjectionAppUid = projectionAppUid;
+            this.mExempt = exempt;
+        }
+    }
+
     @VisibleForTesting
     final MediaProjectionManager.Callback mMediaProjectionCallback =
             new MediaProjectionManager.Callback() {
@@ -72,6 +93,19 @@
                     try {
                         updateProjectionStateAndNotifyListeners(info);
                         mLogger.logProjectionStart(isSensitiveStateActive(), info.getPackageName());
+
+                        int packageUid;
+                        try {
+                            packageUid = mPackageManager.getPackageUidAsUser(info.getPackageName(),
+                                    info.getUserHandle().getIdentifier());
+                        } catch (PackageManager.NameNotFoundException e) {
+                            Log.w(LOG_TAG, "Package " + info.getPackageName() + " not found");
+                            packageUid = -1;
+                        }
+                        // TODO(b/329665707): MediaProjectionSessionIdGenerator instead of random
+                        //  long
+                        logSensitiveContentProtectionSessionStart(
+                                new Random().nextLong(), packageUid, !isSensitiveStateActive());
                     } finally {
                         Trace.endSection();
                     }
@@ -82,6 +116,7 @@
                     Trace.beginSection("SNPC.onProjectionStop");
                     try {
                         mLogger.logProjectionStop();
+                        logSensitiveContentProtectionSessionStop();
                         updateProjectionStateAndNotifyListeners(null);
                     } finally {
                         Trace.endSection();
@@ -89,6 +124,36 @@
                 }
             };
 
+    private void logSensitiveContentProtectionSessionStart(
+            long sessionId, int projectionAppUid, boolean exempt) {
+        mActiveMediaProjectionSession =
+                new SensitiveNotificatioMediaProjectionSession(sessionId, projectionAppUid, exempt);
+        logSensitiveContentProtectionSession(
+                mActiveMediaProjectionSession,
+                FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__START);
+    }
+
+    private void logSensitiveContentProtectionSessionStop() {
+        if (mActiveMediaProjectionSession == null) {
+            return;
+        }
+        logSensitiveContentProtectionSession(
+                mActiveMediaProjectionSession,
+                FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__STOP);
+        mActiveMediaProjectionSession = null;
+    }
+
+    private void logSensitiveContentProtectionSession(
+            SensitiveNotificatioMediaProjectionSession session, int state) {
+        FrameworkStatsLog.write(
+                FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION,
+                session.mSessionId,
+                session.mProjectionAppUid,
+                session.mExempt,
+                state,
+                FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__SYS_UI);
+    }
+
     @Inject
     public SensitiveNotificationProtectionControllerImpl(
             Context context,
@@ -253,6 +318,10 @@
             return false;
         }
 
+        if (screenshareNotificationHidingBugFix() && UserHandle.isCore(sbn.getUid())) {
+            return false; // do not hide/redact notifications from system uid
+        }
+
         // Only protect/redact notifications if the developer has not explicitly set notification
         // visibility as public and users has not adjusted default channel visibility to private
         boolean notificationRequestsRedaction = entry.isNotificationVisibilityPrivate();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/data/repository/DeviceProvisioningRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/data/repository/DeviceProvisioningRepository.kt
index 1160d65..4838554 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/data/repository/DeviceProvisioningRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/data/repository/DeviceProvisioningRepository.kt
@@ -31,9 +31,6 @@
      * @see android.provider.Settings.Global.DEVICE_PROVISIONED
      */
     val isDeviceProvisioned: Flow<Boolean>
-
-    /** Whether Factory Reset Protection (FRP) is currently active, locking the device. */
-    val isFactoryResetProtectionActive: Flow<Boolean>
 }
 
 @Module
@@ -58,16 +55,4 @@
         trySend(deviceProvisionedController.isDeviceProvisioned)
         awaitClose { deviceProvisionedController.removeCallback(listener) }
     }
-
-    override val isFactoryResetProtectionActive: Flow<Boolean> = conflatedCallbackFlow {
-        val listener =
-            object : DeviceProvisionedController.DeviceProvisionedListener {
-                override fun onFrpActiveChanged() {
-                    trySend(deviceProvisionedController.isFrpActive)
-                }
-            }
-        deviceProvisionedController.addCallback(listener)
-        trySend(deviceProvisionedController.isFrpActive)
-        awaitClose { deviceProvisionedController.removeCallback(listener) }
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/DeviceProvisioningInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/DeviceProvisioningInteractor.kt
index 32cf86d..66ed092 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/DeviceProvisioningInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/domain/interactor/DeviceProvisioningInteractor.kt
@@ -34,7 +34,4 @@
      * @see android.provider.Settings.Global.DEVICE_PROVISIONED
      */
     val isDeviceProvisioned: Flow<Boolean> = repository.isDeviceProvisioned
-
-    /** Whether Factory Reset Protection (FRP) is currently active, locking the device. */
-    val isFactoryResetProtectionActive: Flow<Boolean> = repository.isFactoryResetProtectionActive
 }
diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt
index 2f2c4b0..b6f5433 100644
--- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt
@@ -31,6 +31,7 @@
 import android.view.ViewGroup
 import android.view.WindowManager
 import android.view.accessibility.AccessibilityManager
+import android.view.accessibility.AccessibilityNodeInfo
 import android.widget.ImageView
 import android.widget.TextView
 import androidx.annotation.DimenRes
@@ -57,6 +58,7 @@
 import com.android.systemui.util.time.SystemClock
 import com.android.systemui.util.view.ViewUtil
 import com.android.systemui.util.wakelock.WakeLock
+import java.time.Duration
 import javax.inject.Inject
 
 /**
@@ -228,6 +230,18 @@
         chipInnerView.contentDescription =
             "$loadedIconDesc${newInfo.text.loadText(context)}$endItemDesc"
         chipInnerView.accessibilityLiveRegion = ACCESSIBILITY_LIVE_REGION_ASSERTIVE
+        // Set minimum duration between content changes to 1 second in order to announce quick
+        // state changes.
+        chipInnerView.accessibilityDelegate =
+            object : View.AccessibilityDelegate() {
+                override fun onInitializeAccessibilityNodeInfo(
+                    host: View,
+                    info: AccessibilityNodeInfo
+                ) {
+                    super.onInitializeAccessibilityNodeInfo(host, info)
+                    info.minDurationBetweenContentChanges = Duration.ofMillis(1000)
+                }
+            }
         maybeGetAccessibilityFocus(newInfo, currentView)
 
         // ---- Haptics ----
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt b/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
index 098d51e..a382cf9 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
@@ -21,15 +21,13 @@
 import android.hardware.devicestate.DeviceStateManager
 import android.os.PowerManager
 import android.provider.Settings
-import androidx.annotation.VisibleForTesting
 import androidx.core.view.OneShotPreDrawListener
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.repeatOnLifecycle
 import com.android.internal.util.LatencyTracker
 import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.keyguard.MigrateClocksToBlueprint
 import com.android.systemui.keyguard.WakefulnessLifecycle
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
-import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.keyguard.domain.interactor.ToAodFoldTransitionInteractor
 import com.android.systemui.shade.ShadeFoldAnimator
 import com.android.systemui.shade.ShadeViewController
 import com.android.systemui.statusbar.LightRevealScrim
@@ -40,9 +38,6 @@
 import com.android.systemui.util.concurrency.DelayableExecutor
 import com.android.systemui.util.settings.GlobalSettings
 import dagger.Lazy
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.launch
 import java.util.function.Consumer
 import javax.inject.Inject
 
@@ -61,6 +56,7 @@
     private val globalSettings: GlobalSettings,
     private val latencyTracker: LatencyTracker,
     private val keyguardInteractor: Lazy<KeyguardInteractor>,
+    private val foldTransitionInteractor: Lazy<ToAodFoldTransitionInteractor>,
 ) : CallbackController<FoldAodAnimationStatus>, ScreenOffAnimation, WakefulnessLifecycle.Observer {
 
     private lateinit var shadeViewController: ShadeViewController
@@ -69,7 +65,6 @@
     private var isFoldHandled = true
 
     private var alwaysOnEnabled: Boolean = false
-    private var isDozing: Boolean = false
     private var isScrimOpaque: Boolean = false
     private var pendingScrimReadyCallback: Runnable? = null
 
@@ -81,7 +76,7 @@
     private val foldToAodLatencyTracker = FoldToAodLatencyTracker()
 
     private val startAnimationRunnable = Runnable {
-        getShadeFoldAnimator().startFoldToAodAnimation(
+        shadeFoldAnimator.startFoldToAodAnimation(
             /* startAction= */ { foldToAodLatencyTracker.onAnimationStarted() },
             /* endAction= */ { setAnimationState(playing = false) },
             /* cancelAction= */ { setAnimationState(playing = false) },
@@ -89,19 +84,15 @@
     }
 
     override fun initialize(
-            centralSurfaces: CentralSurfaces,
-            shadeViewController: ShadeViewController,
-            lightRevealScrim: LightRevealScrim,
+        centralSurfaces: CentralSurfaces,
+        shadeViewController: ShadeViewController,
+        lightRevealScrim: LightRevealScrim,
     ) {
         this.shadeViewController = shadeViewController
+        foldTransitionInteractor.get().initialize(shadeViewController.shadeFoldAnimator)
 
         deviceStateManager.registerCallback(mainExecutor, FoldListener())
         wakefulnessLifecycle.addObserver(this)
-
-        // TODO(b/254878364): remove this call to NPVC.getView()
-        getShadeFoldAnimator().view?.repeatWhenAttached {
-            repeatOnLifecycle(Lifecycle.State.STARTED) { listenForDozing(this) }
-        }
     }
 
     /** Returns true if we should run fold to AOD animation */
@@ -115,7 +106,7 @@
     override fun startAnimation(): Boolean =
         if (shouldStartAnimation()) {
             setAnimationState(playing = true)
-            getShadeFoldAnimator().prepareFoldToAodAnimation()
+            shadeFoldAnimator.prepareFoldToAodAnimation()
             true
         } else {
             setAnimationState(playing = false)
@@ -126,14 +117,20 @@
         if (isAnimationPlaying) {
             foldToAodLatencyTracker.cancel()
             cancelAnimation?.run()
-            getShadeFoldAnimator().cancelFoldToAodAnimation()
+            shadeFoldAnimator.cancelFoldToAodAnimation()
         }
 
         setAnimationState(playing = false)
     }
 
-    private fun getShadeFoldAnimator(): ShadeFoldAnimator =
-        shadeViewController.shadeFoldAnimator
+    private val shadeFoldAnimator: ShadeFoldAnimator
+        get() {
+            return if (MigrateClocksToBlueprint.isEnabled) {
+                foldTransitionInteractor.get().foldAnimator
+            } else {
+                shadeViewController.shadeFoldAnimator
+            }
+        }
 
     private fun setAnimationState(playing: Boolean) {
         shouldPlayAnimation = playing
@@ -149,39 +146,46 @@
      * @see [com.android.systemui.keyguard.KeyguardViewMediator]
      */
     @BinderThread
-    fun onScreenTurningOn(onReady: Runnable) = mainExecutor.execute {
-        if (shouldPlayAnimation) {
-            // The device was not dozing and going to sleep after folding, play the animation
+    fun onScreenTurningOn(onReady: Runnable) =
+        mainExecutor.execute {
+            if (shouldPlayAnimation) {
+                // The device was not dozing and going to sleep after folding, play the animation
+                if (isScrimOpaque) {
+                    onReady.run()
+                } else {
+                    pendingScrimReadyCallback = onReady
+                }
+            } else if (
+                isFolded &&
+                    !isFoldHandled &&
+                    alwaysOnEnabled &&
+                    keyguardInteractor.get().isDozing.value
+            ) {
+                setAnimationState(playing = true)
+                shadeFoldAnimator.prepareFoldToAodAnimation()
 
-            if (isScrimOpaque) {
-                onReady.run()
+                // We don't need to wait for the scrim as it is already displayed
+                // but we should wait for the initial animation preparations to be drawn
+                // (setting initial alpha/translation)
+                // TODO(b/254878364): remove this call to NPVC.getView()
+                if (!MigrateClocksToBlueprint.isEnabled) {
+                    shadeFoldAnimator.view?.let { OneShotPreDrawListener.add(it, onReady) }
+                } else {
+                    onReady.run()
+                }
             } else {
-                pendingScrimReadyCallback = onReady
+                // No animation, call ready callback immediately
+                onReady.run()
             }
-        } else if (isFolded && !isFoldHandled && alwaysOnEnabled && isDozing) {
-            setAnimationState(playing = true)
-            getShadeFoldAnimator().prepareFoldToAodAnimation()
 
-            // We don't need to wait for the scrim as it is already displayed
-            // but we should wait for the initial animation preparations to be drawn
-            // (setting initial alpha/translation)
-            // TODO(b/254878364): remove this call to NPVC.getView()
-            getShadeFoldAnimator().view?.let {
-                OneShotPreDrawListener.add(it, onReady)
+            if (isFolded) {
+                // Any time the screen turns on, this state needs to be reset if the device has been
+                // folded. Reaching this line implies AOD has been shown in one way or another,
+                // if enabled
+                isFoldHandled = true
             }
-        } else {
-            // No animation, call ready callback immediately
-            onReady.run()
         }
 
-        if (isFolded) {
-            // Any time the screen turns on, this state needs to be reset if the device has been
-            // folded. Reaching this line implies AOD has been shown in one way or another,
-            // if enabled
-            isFoldHandled = true
-        }
-    }
-
     /** Called when keyguard scrim opaque changed */
     override fun onScrimOpaqueChanged(isOpaque: Boolean) {
         isScrimOpaque = isOpaque
@@ -193,18 +197,17 @@
     }
 
     @BinderThread
-    fun onScreenTurnedOn() = mainExecutor.execute {
-        if (shouldPlayAnimation) {
-            cancelAnimation?.run()
+    fun onScreenTurnedOn() =
+        mainExecutor.execute {
+            if (shouldPlayAnimation) {
+                cancelAnimation?.run()
 
-            // Post starting the animation to the next frame to avoid junk due to inset changes
-            cancelAnimation = mainExecutor.executeDelayed(
-                startAnimationRunnable,
-                /* delayMillis= */ 0
-            )
-            shouldPlayAnimation = false
+                // Post starting the animation to the next frame to avoid junk due to inset changes
+                cancelAnimation =
+                    mainExecutor.executeDelayed(startAnimationRunnable, /* delayMillis= */ 0)
+                shouldPlayAnimation = false
+            }
         }
-    }
 
     override fun isAnimationPlaying(): Boolean = isAnimationPlaying
 
@@ -233,11 +236,6 @@
         statusListeners.remove(listener)
     }
 
-    @VisibleForTesting
-    internal suspend fun listenForDozing(scope: CoroutineScope): Job {
-        return scope.launch { keyguardInteractor.get().isDozing.collect { isDozing = it } }
-    }
-
     interface FoldAodAnimationStatus {
         fun onFoldToAodAnimationChanged()
     }
@@ -261,11 +259,10 @@
      * Tracks the latency of fold to AOD using [LatencyTracker].
      *
      * Events that trigger start and end are:
-     *
      * - Start: Once [DeviceStateManager] sends the folded signal [FoldToAodLatencyTracker.onFolded]
-     * is called and latency tracking starts.
+     *   is called and latency tracking starts.
      * - End: Once the fold -> AOD animation starts, [FoldToAodLatencyTracker.onAnimationStarted] is
-     * called, and latency tracking stops.
+     *   called, and latency tracking stops.
      */
     private inner class FoldToAodLatencyTracker {
 
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FoldLightRevealOverlayAnimation.kt b/packages/SystemUI/src/com/android/systemui/unfold/FoldLightRevealOverlayAnimation.kt
index e977014..aea739d 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/FoldLightRevealOverlayAnimation.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/FoldLightRevealOverlayAnimation.kt
@@ -20,11 +20,10 @@
 import android.animation.AnimatorListenerAdapter
 import android.animation.ValueAnimator
 import android.annotation.BinderThread
-import android.content.Context
-import android.os.Handler
 import android.os.SystemProperties
 import android.util.Log
 import android.view.animation.DecelerateInterpolator
+import com.android.app.tracing.TraceUtils.traceAsync
 import com.android.internal.foldables.FoldLockSettingAvailabilityProvider
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.display.data.repository.DeviceStateRepository
@@ -36,12 +35,13 @@
 import com.android.systemui.unfold.FullscreenLightRevealAnimationController.Companion.isVerticalRotation
 import com.android.systemui.unfold.dagger.UnfoldBg
 import com.android.systemui.util.animation.data.repository.AnimationStatusRepository
+import com.android.systemui.util.kotlin.race
 import javax.inject.Inject
 import kotlin.coroutines.resume
 import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.TimeoutCancellationException
-import kotlinx.coroutines.android.asCoroutineDispatcher
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.catch
 import kotlinx.coroutines.flow.distinctUntilChanged
@@ -59,13 +59,13 @@
 class FoldLightRevealOverlayAnimation
 @Inject
 constructor(
-    private val context: Context,
-    @UnfoldBg private val bgHandler: Handler,
+    @UnfoldBg private val bgDispatcher: CoroutineDispatcher,
     private val deviceStateRepository: DeviceStateRepository,
     private val powerInteractor: PowerInteractor,
     @Background private val applicationScope: CoroutineScope,
     private val animationStatusRepository: AnimationStatusRepository,
-    private val controllerFactory: FullscreenLightRevealAnimationController.Factory
+    private val controllerFactory: FullscreenLightRevealAnimationController.Factory,
+    private val foldLockSettingAvailabilityProvider: FoldLockSettingAvailabilityProvider
 ) : FullscreenLightRevealAnimation {
 
     private val revealProgressValueAnimator: ValueAnimator =
@@ -79,7 +79,7 @@
     override fun init() {
         // This method will be called only on devices where this animation is enabled,
         // so normally this thread won't be created
-        if (!FoldLockSettingAvailabilityProvider(context.resources).isFoldLockBehaviorAvailable) {
+        if (!foldLockSettingAvailabilityProvider.isFoldLockBehaviorAvailable) {
             return
         }
 
@@ -91,7 +91,6 @@
             )
         controller.init()
 
-        val bgDispatcher = bgHandler.asCoroutineDispatcher("@UnfoldBg Handler")
         applicationScope.launch(bgDispatcher) {
             powerInteractor.screenPowerState.collect {
                 if (it == ScreenPowerState.SCREEN_ON) {
@@ -109,14 +108,21 @@
                             if (!areAnimationEnabled.first() || !isFolded) {
                                 return@flow
                             }
-                            withTimeout(WAIT_FOR_ANIMATION_TIMEOUT_MS) {
-                                readyCallback = CompletableDeferred()
-                                val onReady = readyCallback?.await()
-                                readyCallback = null
-                                controller.addOverlay(ALPHA_OPAQUE, onReady)
-                                waitForScreenTurnedOn()
-                            }
-                            playFoldLightRevealOverlayAnimation()
+                            race(
+                                {
+                                    traceAsync(TAG, "prepareAndPlayFoldAnimation()") {
+                                        withTimeout(WAIT_FOR_ANIMATION_TIMEOUT_MS) {
+                                            readyCallback = CompletableDeferred()
+                                            val onReady = readyCallback?.await()
+                                            readyCallback = null
+                                            controller.addOverlay(ALPHA_OPAQUE, onReady)
+                                            waitForScreenTurnedOn()
+                                        }
+                                        playFoldLightRevealOverlayAnimation()
+                                    }
+                                },
+                                { waitForGoToSleep() }
+                            )
                         }
                         .catchTimeoutAndLog()
                         .onCompletion {
@@ -135,9 +141,13 @@
         readyCallback?.complete(onOverlayReady) ?: onOverlayReady.run()
     }
 
-    private suspend fun waitForScreenTurnedOn() {
-        powerInteractor.screenPowerState.filter { it == ScreenPowerState.SCREEN_ON }.first()
-    }
+    private suspend fun waitForScreenTurnedOn() =
+        traceAsync(TAG, "waitForScreenTurnedOn()") {
+            powerInteractor.screenPowerState.filter { it == ScreenPowerState.SCREEN_ON }.first()
+        }
+
+    private suspend fun waitForGoToSleep() =
+        traceAsync(TAG, "waitForGoToSleep()") { powerInteractor.isAsleep.filter { it }.first() }
 
     private suspend fun playFoldLightRevealOverlayAnimation() {
         revealProgressValueAnimator.duration = ANIMATION_DURATION
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt
index 9bd0e32..3522850 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt
@@ -19,6 +19,7 @@
 import android.content.Context
 import android.hardware.devicestate.DeviceStateManager
 import android.os.SystemProperties
+import com.android.internal.foldables.FoldLockSettingAvailabilityProvider
 import com.android.systemui.CoreStartable
 import com.android.systemui.Flags
 import com.android.systemui.dagger.qualifiers.Application
@@ -175,6 +176,12 @@
     fun provideDisplaySwitchLatencyLogger(): DisplaySwitchLatencyLogger =
         DisplaySwitchLatencyLogger()
 
+    @Provides
+    @Singleton
+    fun provideFoldLockSettingAvailabilityProvider(
+        context: Context
+    ): FoldLockSettingAvailabilityProvider = FoldLockSettingAvailabilityProvider(context.resources)
+
     @Module
     interface Bindings {
         @Binds fun bindRepository(impl: UnfoldTransitionRepositoryImpl): UnfoldTransitionRepository
diff --git a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserActionsUtil.kt b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserActionsUtil.kt
index dc004f3..d66fe891 100644
--- a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserActionsUtil.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserActionsUtil.kt
@@ -24,50 +24,53 @@
 /** Utilities related to user management actions. */
 object UserActionsUtil {
 
-    /** Returns `true` if it's possible to add a guest user to the device; `false` otherwise. */
+    /**
+     * Returns `true` if it's possible for the given user to add a guest user to the device; `false`
+     * otherwise.
+     */
     fun canCreateGuest(
         manager: UserManager,
         repository: UserRepository,
         isUserSwitcherEnabled: Boolean,
-        isAddUsersFromLockScreenEnabled: Boolean,
+        canAddUsersWhenLockedOrDeviceUnlocked: Boolean,
     ): Boolean {
-        if (!isUserSwitcherEnabled) {
-            return false
-        }
-
-        return currentUserCanCreateUsers(manager, repository) ||
-            anyoneCanCreateUsers(manager, isAddUsersFromLockScreenEnabled)
+        return canAddMoreUsers(
+            manager,
+            repository,
+            isUserSwitcherEnabled,
+            canAddUsersWhenLockedOrDeviceUnlocked,
+            UserManager.USER_TYPE_FULL_GUEST
+        )
     }
 
-    /** Returns `true` if it's possible to add a user to the device; `false` otherwise. */
+    /**
+     * Returns `true` if it's possible for the given user to add a user to the device; `false`
+     * otherwise.
+     */
     fun canCreateUser(
         manager: UserManager,
         repository: UserRepository,
         isUserSwitcherEnabled: Boolean,
-        isAddUsersFromLockScreenEnabled: Boolean,
+        canAddUsersWhenLockedOrDeviceUnlocked: Boolean,
     ): Boolean {
-        if (!isUserSwitcherEnabled) {
-            return false
-        }
-
-        if (
-            !currentUserCanCreateUsers(manager, repository) &&
-                !anyoneCanCreateUsers(manager, isAddUsersFromLockScreenEnabled)
-        ) {
-            return false
-        }
-
-        return manager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY)
+        return canAddMoreUsers(
+            manager,
+            repository,
+            isUserSwitcherEnabled,
+            canAddUsersWhenLockedOrDeviceUnlocked,
+            UserManager.USER_TYPE_FULL_SECONDARY
+        )
     }
 
     /**
-     * Returns `true` if it's possible to add a supervised user to the device; `false` otherwise.
+     * Returns `true` if it's possible to add a supervised user to the device given the current
+     * user; false` otherwise.
      */
     fun canCreateSupervisedUser(
         manager: UserManager,
         repository: UserRepository,
         isUserSwitcherEnabled: Boolean,
-        isAddUsersFromLockScreenEnabled: Boolean,
+        canAddUsersWhenLockedOrDeviceUnlocked: Boolean,
         supervisedUserPackageName: String?
     ): Boolean {
         if (supervisedUserPackageName.isNullOrEmpty()) {
@@ -78,17 +81,30 @@
             manager,
             repository,
             isUserSwitcherEnabled,
-            isAddUsersFromLockScreenEnabled
+            canAddUsersWhenLockedOrDeviceUnlocked
         )
     }
 
-    fun canManageUsers(
+    fun canManageUsers(repository: UserRepository, isUserSwitcherEnabled: Boolean): Boolean {
+        return isUserSwitcherEnabled && repository.getSelectedUserInfo().isAdmin
+    }
+
+    /**
+     * Returns `true` if it's possible to add a user to the device for the given user type; false
+     * otherwise.
+     */
+    private fun canAddMoreUsers(
+        manager: UserManager,
         repository: UserRepository,
         isUserSwitcherEnabled: Boolean,
-        isAddUsersFromLockScreenEnabled: Boolean,
+        canAddUsersWhenLockedOrDeviceUnlocked: Boolean,
+        userType: String
     ): Boolean {
-        return isUserSwitcherEnabled &&
-            (repository.getSelectedUserInfo().isAdmin || isAddUsersFromLockScreenEnabled)
+        if (!isUserSwitcherEnabled || !canAddUsersWhenLockedOrDeviceUnlocked) {
+            return false
+        }
+
+        return currentUserCanCreateUsers(manager, repository) && manager.canAddMoreUsers(userType)
     }
 
     /**
@@ -96,28 +112,15 @@
      */
     private fun currentUserCanCreateUsers(
         manager: UserManager,
-        repository: UserRepository,
+        repository: UserRepository
     ): Boolean {
         val currentUser = repository.getSelectedUserInfo()
         if (!currentUser.isAdmin && currentUser.id != UserHandle.USER_SYSTEM) {
             return false
         }
-
-        return systemCanCreateUsers(manager)
-    }
-
-    /** Returns `true` if the system can add users to the device; `false` otherwise. */
-    private fun systemCanCreateUsers(
-        manager: UserManager,
-    ): Boolean {
-        return !manager.hasBaseUserRestriction(UserManager.DISALLOW_ADD_USER, UserHandle.SYSTEM)
-    }
-
-    /** Returns `true` if it's allowed to add users to the device at all; `false` otherwise. */
-    private fun anyoneCanCreateUsers(
-        manager: UserManager,
-        isAddUsersFromLockScreenEnabled: Boolean,
-    ): Boolean {
-        return systemCanCreateUsers(manager) && isAddUsersFromLockScreenEnabled
+        return !manager.hasUserRestrictionForUser(
+            UserManager.DISALLOW_ADD_USER,
+            UserHandle.of(currentUser.id)
+        ) && !manager.hasUserRestrictionForUser(UserManager.DISALLOW_ADD_USER, UserHandle.SYSTEM)
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractor.kt b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractor.kt
index a122311..382bc03 100644
--- a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractor.kt
@@ -170,7 +170,8 @@
                 keyguardInteractor.isKeyguardShowing,
             ) { _, userInfos, settings, isDeviceLocked ->
                 buildList {
-                    if (!isDeviceLocked || settings.isAddUsersFromLockscreen) {
+                    val canAccessUserSwitcher = !isDeviceLocked || settings.isAddUsersFromLockscreen
+                    if (canAccessUserSwitcher) {
                         // The device is locked and our setting to allow actions that add users
                         // from the lock-screen is not enabled. We can finish building the list
                         // here.
@@ -194,7 +195,10 @@
                             when (it) {
                                 UserActionModel.ENTER_GUEST_MODE -> {
                                     val hasGuestUser = userInfos.any { it.isGuest }
-                                    if (!hasGuestUser && canCreateGuestUser(settings)) {
+                                    if (
+                                        !hasGuestUser &&
+                                            canCreateGuestUser(settings, canAccessUserSwitcher)
+                                    ) {
                                         add(UserActionModel.ENTER_GUEST_MODE)
                                     }
                                 }
@@ -204,7 +208,7 @@
                                             manager,
                                             repository,
                                             settings.isUserSwitcherEnabled,
-                                            settings.isAddUsersFromLockscreen,
+                                            canAccessUserSwitcher
                                         )
 
                                     if (canCreateUsers) {
@@ -217,7 +221,7 @@
                                             manager,
                                             repository,
                                             settings.isUserSwitcherEnabled,
-                                            settings.isAddUsersFromLockscreen,
+                                            canAccessUserSwitcher,
                                             supervisedUserPackageName,
                                         )
                                     ) {
@@ -229,11 +233,7 @@
                         }
                     }
                     if (
-                        UserActionsUtil.canManageUsers(
-                            repository,
-                            settings.isUserSwitcherEnabled,
-                            settings.isAddUsersFromLockscreen,
-                        )
+                        UserActionsUtil.canManageUsers(repository, settings.isUserSwitcherEnabled)
                     ) {
                         add(UserActionModel.NAVIGATE_TO_USER_MANAGEMENT)
                     }
@@ -820,13 +820,16 @@
         )
     }
 
-    private fun canCreateGuestUser(settings: UserSwitcherSettingsModel): Boolean {
+    private fun canCreateGuestUser(
+        settings: UserSwitcherSettingsModel,
+        canAccessUserSwitcher: Boolean
+    ): Boolean {
         return guestUserInteractor.isGuestUserAutoCreated ||
             UserActionsUtil.canCreateGuest(
                 manager,
                 repository,
                 settings.isUserSwitcherEnabled,
-                settings.isAddUsersFromLockscreen,
+                canAccessUserSwitcher,
             )
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/DisposableHandleExt.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/DisposableHandleExt.kt
index 909a18be..97d957d 100644
--- a/packages/SystemUI/src/com/android/systemui/util/kotlin/DisposableHandleExt.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/DisposableHandleExt.kt
@@ -17,8 +17,14 @@
 package com.android.systemui.util.kotlin
 
 import com.android.systemui.lifecycle.repeatWhenAttached
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.CoroutineStart
 import kotlinx.coroutines.DisposableHandle
+import kotlinx.coroutines.Job
 import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.launch
 
 /**
  * Suspends to keep getting updates until cancellation. Once cancelled, mark this as eligible for
@@ -42,3 +48,22 @@
         dispose()
     }
 }
+
+/**
+ * This will [launch], run [onLaunch] to get a [DisposableHandle], and finally
+ * [awaitCancellationThenDispose][DisposableHandle.awaitCancellationThenDispose]. This can be used
+ * to structure self-disposing code which attaches listeners, for example in ViewBinders:
+ * ```
+ * suspend fun bind(view: MyView, viewModel: MyViewModel) = coroutineScope {
+ *     launchAndDispose {
+ *         view.setOnClickListener { viewModel.handleClick() }
+ *         DisposableHandle { view.setOnClickListener(null) }
+ *     }
+ * }
+ * ```
+ */
+inline fun CoroutineScope.launchAndDispose(
+    context: CoroutineContext = EmptyCoroutineContext,
+    start: CoroutineStart = CoroutineStart.DEFAULT,
+    crossinline onLaunch: () -> DisposableHandle
+): Job = launch(context, start) { onLaunch().awaitCancellationThenDispose() }
diff --git a/packages/SystemUI/src/com/android/systemui/utils/PolicyRestriction.kt b/packages/SystemUI/src/com/android/systemui/utils/PolicyRestriction.kt
new file mode 100644
index 0000000..38c6d7f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/utils/PolicyRestriction.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.utils
+
+import com.android.settingslib.RestrictedLockUtils
+
+/**
+ * Models a possible policy restriction.
+ *
+ * @see RestrictedLockUtils.checkIfRestrictionEnforced
+ */
+sealed interface PolicyRestriction {
+    data object NoRestriction : PolicyRestriction
+
+    data class Restricted(val admin: RestrictedLockUtils.EnforcedAdmin) : PolicyRestriction
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index c3274477..27a708a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -173,9 +173,9 @@
     private static final String TYPE_DISMISS = "dismiss";
     /** Volume dialog slider animation. */
     private static final String TYPE_UPDATE = "update";
-    static final short PROGRESS_HAPTICS_DISABLED = 0;
-    static final short PROGRESS_HAPTICS_EAGER = 1;
-    static final short PROGRESS_HAPTICS_ANIMATED = 2;
+    static final int PROGRESS_HAPTICS_DISABLED = 0;
+    static final int PROGRESS_HAPTICS_EAGER = 1;
+    static final int PROGRESS_HAPTICS_ANIMATED = 2;
 
     /**
      *  TODO(b/290612381): remove lingering animations or tolerate them
@@ -851,10 +851,7 @@
             row.header.setFilters(new InputFilter[] {new InputFilter.LengthFilter(13)});
         }
         row.slider = row.view.findViewById(R.id.volume_row_slider);
-        if (hapticVolumeSlider()) {
-            row.createPlugin(mVibratorHelper, mSystemClock);
-            HapticSliderViewBinder.bind(row.slider, row.mHapticPlugin);
-        }
+        addSliderHapticsToRow(row);
         row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row));
         row.number = row.view.findViewById(R.id.volume_number);
 
@@ -915,6 +912,23 @@
         }
     }
 
+    private void addSliderHapticsToRow(VolumeRow row) {
+        if (hapticVolumeSlider()) {
+            row.createPlugin(mVibratorHelper, mSystemClock);
+            HapticSliderViewBinder.bind(row.slider, row.mHapticPlugin);
+        }
+    }
+
+    @VisibleForTesting void addSliderHapticsToRows() {
+        for (VolumeRow row: mRows) {
+            addSliderHapticsToRow(row);
+        }
+    }
+
+    @VisibleForTesting void removeDismissMessages() {
+        mHandler.removeMessages(H.DISMISS);
+    }
+
     private void setRingerMode(int newRingerMode) {
         Events.writeEvent(Events.EVENT_RINGER_TOGGLE, newRingerMode);
         incrementManualToggleCount();
@@ -2105,7 +2119,7 @@
         }
     }
 
-    @VisibleForTesting short progressHapticsForStream(int stream) {
+    @VisibleForTesting int progressHapticsForStream(int stream) {
         for (VolumeRow row: mRows) {
             if (row.stream == stream) {
                 return row.mProgressHapticsType;
@@ -2619,7 +2633,7 @@
         private int animTargetProgress;
         private int lastAudibleLevel = 1;
         private SeekableSliderHapticPlugin mHapticPlugin;
-        private short mProgressHapticsType = PROGRESS_HAPTICS_DISABLED;
+        private int mProgressHapticsType = PROGRESS_HAPTICS_DISABLED;
 
         void setIcon(int iconRes, Resources.Theme theme) {
             if (icon != null) {
@@ -2661,7 +2675,7 @@
             slider.setOnTouchListener(null);
         }
 
-        void deliverOnProgressChangedHaptics(boolean fromUser, int progress, short hapticsType) {
+        void deliverOnProgressChangedHaptics(boolean fromUser, int progress, int hapticsType) {
             if (mHapticPlugin == null) return;
 
             mHapticPlugin.onProgressChanged(slider, progress, fromUser);
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/data/repository/AncSliceRepository.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/data/repository/AncSliceRepository.kt
index 8f18aa8..8ce3b1f 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/data/repository/AncSliceRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/data/repository/AncSliceRepository.kt
@@ -41,12 +41,14 @@
 interface AncSliceRepository {
 
     /**
-     * ANC slice with a given width. Emits null when there is no ANC slice available. This can mean
-     * that:
+     * ANC slice with a given width. [isCollapsed] slice shows a single button, and expanded shows a
+     * row buttons.
+     *
+     * Emits null when there is no ANC slice available. This can mean that:
      * - there is no supported device connected;
      * - there is no slice provider for the uri;
      */
-    fun ancSlice(width: Int): Flow<Slice?>
+    fun ancSlice(width: Int, isCollapsed: Boolean, hideLabel: Boolean): Flow<Slice?>
 }
 
 @OptIn(ExperimentalCoroutinesApi::class)
@@ -60,9 +62,14 @@
 
     private val localMediaRepository = mediaRepositoryFactory.create(null)
 
-    override fun ancSlice(width: Int): Flow<Slice?> {
+    override fun ancSlice(width: Int, isCollapsed: Boolean, hideLabel: Boolean): Flow<Slice?> {
         return localMediaRepository.currentConnectedDevice
-            .map { (it as? BluetoothMediaDevice)?.cachedDevice?.device?.getExtraControlUri(width) }
+            .map {
+                (it as? BluetoothMediaDevice)
+                    ?.cachedDevice
+                    ?.device
+                    ?.getExtraControlUri(width, isCollapsed, hideLabel)
+            }
             .distinctUntilChanged()
             .flatMapLatest { sliceUri ->
                 sliceUri ?: return@flatMapLatest flowOf(null)
@@ -71,7 +78,11 @@
             .flowOn(backgroundCoroutineContext)
     }
 
-    private fun BluetoothDevice.getExtraControlUri(width: Int): Uri? {
+    private fun BluetoothDevice.getExtraControlUri(
+        width: Int,
+        isCollapsed: Boolean,
+        hideLabel: Boolean
+    ): Uri? {
         val uri: String? = BluetoothUtils.getControlUriMetaData(this)
         uri ?: return null
 
@@ -81,7 +92,8 @@
             Uri.parse(
                 "$uri$width" +
                     "&version=${SliceParameters.VERSION}" +
-                    "&is_collapsed=${SliceParameters.IS_COLLAPSED}"
+                    "&is_collapsed=$isCollapsed" +
+                    "&hide_label=$hideLabel"
             )
         }
     }
@@ -98,11 +110,5 @@
          * 2) new slice
          */
         const val VERSION = 2
-
-        /**
-         * Collapsed slice shows a single button, and expanded shows a row buttons. Supported since
-         * [VERSION]==2.
-         */
-        const val IS_COLLAPSED = false
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/domain/AncAvailabilityCriteria.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/domain/AncAvailabilityCriteria.kt
index 89b9274..dc4be26 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/domain/AncAvailabilityCriteria.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/domain/AncAvailabilityCriteria.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.volume.panel.component.anc.domain
 
 import com.android.systemui.volume.panel.component.anc.domain.interactor.AncSliceInteractor
+import com.android.systemui.volume.panel.component.anc.domain.model.AncSlices
 import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
 import com.android.systemui.volume.panel.domain.ComponentAvailabilityCriteria
 import javax.inject.Inject
@@ -31,5 +32,6 @@
     private val ancSliceInteractor: AncSliceInteractor,
 ) : ComponentAvailabilityCriteria {
 
-    override fun isAvailable(): Flow<Boolean> = ancSliceInteractor.ancSlice.map { it != null }
+    override fun isAvailable(): Flow<Boolean> =
+        ancSliceInteractor.ancSlices.map { it is AncSlices.Ready }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/domain/interactor/AncSliceInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/domain/interactor/AncSliceInteractor.kt
index 91af622..cefa269 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/domain/interactor/AncSliceInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/domain/interactor/AncSliceInteractor.kt
@@ -20,16 +20,19 @@
 import android.app.slice.SliceItem.FORMAT_SLICE
 import androidx.slice.Slice
 import com.android.systemui.volume.panel.component.anc.data.repository.AncSliceRepository
+import com.android.systemui.volume.panel.component.anc.domain.model.AncSlices
 import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.SharedFlow
 import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.flatMapLatest
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.shareIn
+import kotlinx.coroutines.flow.stateIn
 
 /** Provides a valid slice from [AncSliceRepository]. */
 @OptIn(ExperimentalCoroutinesApi::class)
@@ -41,25 +44,35 @@
     scope: CoroutineScope,
 ) {
 
-    // Start with a positive width to check is the Slice is available.
-    private val width = MutableStateFlow(1)
+    // Any positive width to check if the Slice is available.
+    private val buttonSliceWidth = MutableStateFlow(1)
+    private val popupSliceWidth = MutableStateFlow(1)
 
-    /** Provides a valid ANC slice. */
-    val ancSlice: SharedFlow<Slice?> =
-        width
-            .flatMapLatest { width -> ancSliceRepository.ancSlice(width) }
-            .map { slice ->
-                if (slice?.isValidSlice() == true) {
-                    slice
+    val ancSlices: StateFlow<AncSlices> =
+        combine(
+                buttonSliceWidth.flatMapLatest {
+                    ancSlice(width = it, isCollapsed = true, hideLabel = true)
+                },
+                popupSliceWidth.flatMapLatest {
+                    ancSlice(width = it, isCollapsed = false, hideLabel = false)
+                }
+            ) { buttonSlice, popupSlice ->
+                if (buttonSlice != null && popupSlice != null) {
+                    AncSlices.Ready(buttonSlice = buttonSlice, popupSlice = popupSlice)
                 } else {
-                    null
+                    AncSlices.Unavailable
                 }
             }
-            .shareIn(scope, SharingStarted.Eagerly, replay = 1)
+            .stateIn(scope, SharingStarted.Eagerly, AncSlices.Unavailable)
 
-    /** Updates the width of the [ancSlice] */
-    fun changeWidth(newWidth: Int) {
-        width.value = newWidth
+    /**
+     * Provides a valid [isCollapsed] ANC slice for a given [width]. Use [hideLabel] == true to
+     * remove the labels from the [Slice].
+     */
+    private fun ancSlice(width: Int, isCollapsed: Boolean, hideLabel: Boolean): Flow<Slice?> {
+        return ancSliceRepository
+            .ancSlice(width = width, isCollapsed = isCollapsed, hideLabel = hideLabel)
+            .filter { it?.isValidSlice() != false }
     }
 
     private fun Slice.isValidSlice(): Boolean {
@@ -73,4 +86,20 @@
         }
         return false
     }
+
+    /**
+     * Call this to update [AncSlices.Ready.popupSlice] width in a reaction to container size
+     * change.
+     */
+    fun onPopupSliceWidthChanged(width: Int) {
+        popupSliceWidth.tryEmit(width)
+    }
+
+    /**
+     * Call this to update [AncSlices.Ready.buttonSlice] width in a reaction to container size
+     * change.
+     */
+    fun onButtonSliceWidthChanged(width: Int) {
+        buttonSliceWidth.tryEmit(width)
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/domain/model/AncSlices.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/domain/model/AncSlices.kt
new file mode 100644
index 0000000..3cd4e67
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/domain/model/AncSlices.kt
@@ -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.systemui.volume.panel.component.anc.domain.model
+
+import androidx.slice.Slice
+
+/** Modes current ANC slices state */
+sealed interface AncSlices {
+
+    data class Ready(
+        val popupSlice: Slice,
+        val buttonSlice: Slice,
+    ) : AncSlices
+
+    /** Couldn't one or both slices. */
+    data object Unavailable : AncSlices
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/ui/viewmodel/AncViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/ui/viewmodel/AncViewModel.kt
index eb96f6c..bee79bb 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/ui/viewmodel/AncViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/anc/ui/viewmodel/AncViewModel.kt
@@ -16,52 +16,56 @@
 
 package com.android.systemui.volume.panel.component.anc.ui.viewmodel
 
-import android.content.Context
 import androidx.slice.Slice
-import com.android.systemui.common.shared.model.Icon
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.res.R
+import com.android.systemui.volume.panel.component.anc.domain.AncAvailabilityCriteria
 import com.android.systemui.volume.panel.component.anc.domain.interactor.AncSliceInteractor
-import com.android.systemui.volume.panel.component.button.ui.viewmodel.ButtonViewModel
+import com.android.systemui.volume.panel.component.anc.domain.model.AncSlices
 import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.filterIsInstance
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.stateIn
 
 /** Volume Panel ANC component view model. */
+@OptIn(ExperimentalCoroutinesApi::class)
 @VolumePanelScope
 class AncViewModel
 @Inject
 constructor(
-    @Application private val context: Context,
     @VolumePanelScope private val coroutineScope: CoroutineScope,
     private val interactor: AncSliceInteractor,
+    private val availabilityCriteria: AncAvailabilityCriteria,
 ) {
 
-    /** ANC [Slice]. Null when there is no slice available for ANC. */
-    val slice: StateFlow<Slice?> =
-        interactor.ancSlice.stateIn(coroutineScope, SharingStarted.Eagerly, null)
+    val isAvailable: Flow<Boolean>
+        get() = availabilityCriteria.isAvailable()
 
-    /**
-     * ButtonViewModel to be shown in the VolumePanel. Null when there is no ANC Slice available.
-     */
-    val button: StateFlow<ButtonViewModel?> =
-        interactor.ancSlice
-            .map { slice ->
-                slice?.let {
-                    ButtonViewModel(
-                        Icon.Resource(R.drawable.ic_noise_aware, null),
-                        context.getString(R.string.volume_panel_noise_control_title)
-                    )
-                }
-            }
+    /** ANC [Slice]. Null when there is no slice available for ANC. */
+    val popupSlice: StateFlow<Slice?> =
+        interactor.ancSlices
+            .filterIsInstance<AncSlices.Ready>()
+            .map { it.popupSlice }
             .stateIn(coroutineScope, SharingStarted.Eagerly, null)
 
-    /** Call this to update [slice] width in a reaction to container size change. */
-    fun changeSliceWidth(width: Int) {
-        interactor.changeWidth(width)
+    /** Button [Slice] to be shown in the VolumePanel. Null when there is no ANC Slice available. */
+    val buttonSlice: StateFlow<Slice?> =
+        interactor.ancSlices
+            .filterIsInstance<AncSlices.Ready>()
+            .map { it.buttonSlice }
+            .stateIn(coroutineScope, SharingStarted.Eagerly, null)
+
+    /** Call this to update [popupSlice] width in a reaction to container size change. */
+    fun onPopupSliceWidthChanged(width: Int) {
+        interactor.onPopupSliceWidthChanged(width)
+    }
+
+    /** Call this to update [buttonSlice] width in a reaction to container size change. */
+    fun onButtonSliceWidthChanged(width: Int) {
+        interactor.onButtonSliceWidthChanged(width)
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/bottombar/ui/viewmodel/BottomBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/bottombar/ui/viewmodel/BottomBarViewModel.kt
index 0207d6e..04d7b1f 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/bottombar/ui/viewmodel/BottomBarViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/bottombar/ui/viewmodel/BottomBarViewModel.kt
@@ -36,10 +36,15 @@
     }
 
     fun onSettingsClicked() {
-        activityStarter.startActivity(
-            Intent(Settings.ACTION_SOUND_SETTINGS)
-                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT),
-            true,
-        ) { volumePanelViewModel.dismissPanel() }
+        activityStarter.startActivityDismissingKeyguard(
+            /* intent = */ Intent(Settings.ACTION_SOUND_SETTINGS),
+            /* onlyProvisioned = */ false,
+            /* dismissShade = */ true,
+            /* disallowEnterPictureInPictureWhileLaunching = */ false,
+            /* callback = */ { volumePanelViewModel.dismissPanel() },
+            /* flags = */ Intent.FLAG_ACTIVITY_REORDER_TO_FRONT,
+            /* animationController = */ null,
+            /* userHandle = */ null,
+        )
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaDeviceSessionInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaDeviceSessionInteractor.kt
index b0c8a4a..dc73344 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaDeviceSessionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaDeviceSessionInteractor.kt
@@ -23,7 +23,7 @@
 import com.android.settingslib.volume.data.repository.MediaControllerRepository
 import com.android.settingslib.volume.data.repository.stateChanges
 import com.android.systemui.dagger.qualifiers.Background
-import com.android.systemui.volume.panel.component.mediaoutput.domain.model.MediaDeviceSession
+import com.android.systemui.volume.panel.component.mediaoutput.shared.model.MediaDeviceSession
 import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
 import javax.inject.Inject
 import kotlin.coroutines.CoroutineContext
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputActionsInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputActionsInteractor.kt
index ea4c082..eebb6fb 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputActionsInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputActionsInteractor.kt
@@ -21,7 +21,7 @@
 import com.android.systemui.animation.DialogTransitionAnimator
 import com.android.systemui.animation.Expandable
 import com.android.systemui.media.dialog.MediaOutputDialogManager
-import com.android.systemui.volume.panel.component.mediaoutput.domain.model.MediaDeviceSession
+import com.android.systemui.volume.panel.component.mediaoutput.shared.model.SessionWithPlayback
 import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
 import javax.inject.Inject
 
@@ -33,10 +33,10 @@
     private val mediaOutputDialogManager: MediaOutputDialogManager,
 ) {
 
-    fun onBarClick(session: MediaDeviceSession, isPlaybackActive: Boolean, expandable: Expandable) {
-        if (isPlaybackActive) {
+    fun onBarClick(sessionWithPlayback: SessionWithPlayback?, expandable: Expandable) {
+        if (sessionWithPlayback?.playback?.isActive == true) {
             mediaOutputDialogManager.createAndShowWithController(
-                session.packageName,
+                sessionWithPlayback.session.packageName,
                 false,
                 expandable.dialogController()
             )
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt
index e60139e..41ad035 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt
@@ -25,8 +25,8 @@
 import com.android.settingslib.volume.data.repository.MediaControllerRepository
 import com.android.systemui.dagger.qualifiers.Background
 import com.android.systemui.volume.panel.component.mediaoutput.data.repository.LocalMediaRepositoryFactory
-import com.android.systemui.volume.panel.component.mediaoutput.domain.model.MediaDeviceSession
 import com.android.systemui.volume.panel.component.mediaoutput.domain.model.MediaDeviceSessions
+import com.android.systemui.volume.panel.component.mediaoutput.shared.model.MediaDeviceSession
 import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
 import javax.inject.Inject
 import kotlin.coroutines.CoroutineContext
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/model/MediaDeviceSession.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/model/MediaDeviceSession.kt
deleted file mode 100644
index 2a2ce79..0000000
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/model/MediaDeviceSession.kt
+++ /dev/null
@@ -1,31 +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.volume.panel.component.mediaoutput.domain.model
-
-import android.media.session.MediaSession
-
-/** Represents media playing on the connected device. */
-data class MediaDeviceSession(
-    val appLabel: CharSequence,
-    val packageName: String,
-    val sessionToken: MediaSession.Token,
-    val canAdjustVolume: Boolean,
-)
-
-/** Returns true when [other] controls the same sessions as [this]. */
-fun MediaDeviceSession.isTheSameSession(other: MediaDeviceSession?): Boolean =
-    sessionToken == other?.sessionToken
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/model/MediaDeviceSessions.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/model/MediaDeviceSessions.kt
index ddc0784..22c160d 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/model/MediaDeviceSessions.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/model/MediaDeviceSessions.kt
@@ -16,6 +16,8 @@
 
 package com.android.systemui.volume.panel.component.mediaoutput.domain.model
 
+import com.android.systemui.volume.panel.component.mediaoutput.shared.model.MediaDeviceSession
+
 /** Models a pair of local and remote [MediaDeviceSession]s. */
 data class MediaDeviceSessions(
     val local: MediaDeviceSession?,
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/MediaDeviceSession.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/MediaDeviceSession.kt
new file mode 100644
index 0000000..eca3315
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/MediaDeviceSession.kt
@@ -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.systemui.volume.panel.component.mediaoutput.shared.model
+
+import android.media.session.MediaSession
+
+/** Represents media playing on the connected device. */
+data class MediaDeviceSession(
+    val appLabel: CharSequence,
+    val packageName: String,
+    val sessionToken: MediaSession.Token,
+    val canAdjustVolume: Boolean,
+)
+
+/** Returns true when [other] controls the same sessions as [this]. */
+fun MediaDeviceSession.isTheSameSession(other: MediaDeviceSession?): Boolean =
+    sessionToken == other?.sessionToken
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.kt
new file mode 100644
index 0000000..c4476fc
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/shared/model/SessionWithPlayback.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.volume.panel.component.mediaoutput.shared.model
+
+import android.media.session.PlaybackState
+
+data class SessionWithPlayback(
+    val session: MediaDeviceSession,
+    val playback: PlaybackState,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
index 2530a3a..fc9602e 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
@@ -17,7 +17,6 @@
 package com.android.systemui.volume.panel.component.mediaoutput.ui.viewmodel
 
 import android.content.Context
-import android.media.session.PlaybackState
 import com.android.systemui.animation.Expandable
 import com.android.systemui.common.shared.model.Color
 import com.android.systemui.common.shared.model.Icon
@@ -25,9 +24,8 @@
 import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaDeviceSessionInteractor
 import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputActionsInteractor
 import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputInteractor
-import com.android.systemui.volume.panel.component.mediaoutput.domain.model.MediaDeviceSession
+import com.android.systemui.volume.panel.component.mediaoutput.shared.model.SessionWithPlayback
 import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
-import com.android.systemui.volume.panel.ui.viewmodel.VolumePanelViewModel
 import javax.inject.Inject
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -47,7 +45,6 @@
 constructor(
     private val context: Context,
     @VolumePanelScope private val coroutineScope: CoroutineScope,
-    private val volumePanelViewModel: VolumePanelViewModel,
     private val actionsInteractor: MediaOutputActionsInteractor,
     private val mediaDeviceSessionInteractor: MediaDeviceSessionInteractor,
     interactor: MediaOutputInteractor,
@@ -129,14 +126,6 @@
             )
 
     fun onBarClick(expandable: Expandable) {
-        sessionWithPlayback.value?.let {
-            actionsInteractor.onBarClick(it.session, it.playback.isActive, expandable)
-        }
-        volumePanelViewModel.dismissPanel()
+        actionsInteractor.onBarClick(sessionWithPlayback.value, expandable)
     }
-
-    private data class SessionWithPlayback(
-        val session: MediaDeviceSession,
-        val playback: PlaybackState,
-    )
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/spatial/ui/viewmodel/SpatialAudioViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/spatial/ui/viewmodel/SpatialAudioViewModel.kt
index f260d61..f022039 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/spatial/ui/viewmodel/SpatialAudioViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/spatial/ui/viewmodel/SpatialAudioViewModel.kt
@@ -50,7 +50,11 @@
 
     val spatialAudioButton: StateFlow<ButtonViewModel?> =
         interactor.isEnabled
-            .map { it.toViewModel(true).toButtonViewModel() }
+            .map {
+                it.toViewModel(true)
+                    .toButtonViewModel()
+                    .copy(label = context.getString(R.string.volume_panel_spatial_audio_title))
+            }
             .stateIn(scope, SharingStarted.Eagerly, null)
 
     val isAvailable: StateFlow<Boolean> =
@@ -77,15 +81,19 @@
                             model = isEnabled,
                             iconColor =
                                 Color.Attribute(
-                                    if (isChecked)
+                                    if (isChecked) {
                                         com.android.internal.R.attr.materialColorOnPrimaryContainer
-                                    else com.android.internal.R.attr.materialColorOnSurfaceVariant
+                                    } else {
+                                        com.android.internal.R.attr.materialColorOnSurfaceVariant
+                                    }
                                 ),
                             labelColor =
                                 Color.Attribute(
-                                    if (isChecked)
+                                    if (isChecked) {
                                         com.android.internal.R.attr.materialColorOnSurface
-                                    else com.android.internal.R.attr.materialColorOutline
+                                    } else {
+                                        com.android.internal.R.attr.materialColorOnSurfaceVariant
+                                    }
                                 ),
                         )
                     }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt
index 3242c28..57b5d57 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt
@@ -98,7 +98,7 @@
         }
     }
 
-    private fun AudioStreamModel.toState(
+    private suspend fun AudioStreamModel.toState(
         isEnabled: Boolean,
         ringerMode: RingerMode,
     ): State {
@@ -116,7 +116,7 @@
             isEnabled = isEnabled,
             a11yStep = volumeRange.step,
             audioStreamModel = this,
-            isMutable = audioVolumeInteractor.isMutable(audioStream),
+            isMutable = audioVolumeInteractor.isAffectedByMute(audioStream),
         )
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt
index 73c8bbf..8d8fa17 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt
@@ -21,7 +21,7 @@
 import com.android.systemui.common.shared.model.Icon
 import com.android.systemui.res.R
 import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaDeviceSessionInteractor
-import com.android.systemui.volume.panel.component.mediaoutput.domain.model.MediaDeviceSession
+import com.android.systemui.volume.panel.component.mediaoutput.shared.model.MediaDeviceSession
 import com.android.systemui.volume.panel.component.volume.domain.interactor.VolumeSliderInteractor
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedFactory
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/ui/viewmodel/AudioVolumeComponentViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/ui/viewmodel/AudioVolumeComponentViewModel.kt
index 4e9a456..09e56c1 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/ui/viewmodel/AudioVolumeComponentViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/ui/viewmodel/AudioVolumeComponentViewModel.kt
@@ -20,8 +20,8 @@
 import com.android.settingslib.volume.shared.model.AudioStream
 import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaDeviceSessionInteractor
 import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputInteractor
-import com.android.systemui.volume.panel.component.mediaoutput.domain.model.MediaDeviceSession
-import com.android.systemui.volume.panel.component.mediaoutput.domain.model.isTheSameSession
+import com.android.systemui.volume.panel.component.mediaoutput.shared.model.MediaDeviceSession
+import com.android.systemui.volume.panel.component.mediaoutput.shared.model.isTheSameSession
 import com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel.AudioStreamSliderViewModel
 import com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel.CastVolumeSliderViewModel
 import com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel.SliderViewModel
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
index 1d9b90a..ff18418 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
@@ -91,17 +91,22 @@
             @Background Executor bgExecutor,
             SecureSettings secureSettings,
             QuickAccessWalletClient quickAccessWalletClient,
-            SystemClock clock) {
+            SystemClock clock,
+            RoleManager roleManager) {
         mContext = context;
         mExecutor = executor;
         mBgExecutor = bgExecutor;
         mSecureSettings = secureSettings;
-        mRoleManager = mContext.getSystemService(RoleManager.class);
+        mRoleManager = roleManager;
         mQuickAccessWalletClient = quickAccessWalletClient;
         mClock = clock;
         mQawClientCreatedTimeMillis = mClock.elapsedRealtime();
     }
 
+    public boolean isWalletRoleAvailable() {
+        return mRoleManager.isRoleAvailable(RoleManager.ROLE_WALLET);
+    }
+
     /**
      * Returns true if the Quick Access Wallet service & feature is available.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java
index 9bfc4ce..1568e8c0 100644
--- a/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java
@@ -20,8 +20,12 @@
 import static android.app.WallpaperManager.FLAG_SYSTEM;
 import static android.app.WallpaperManager.SetWallpaperFlags;
 
+import static com.android.window.flags.Flags.offloadColorExtraction;
+
+import android.annotation.Nullable;
 import android.app.WallpaperColors;
 import android.app.WallpaperManager;
+import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.RecordingCanvas;
@@ -134,6 +138,12 @@
                     mLongExecutor,
                     mLock,
                     new WallpaperLocalColorExtractor.WallpaperLocalColorExtractorCallback() {
+
+                        @Override
+                        public void onColorsProcessed() {
+                            CanvasEngine.this.notifyColorsChanged();
+                        }
+
                         @Override
                         public void onColorsProcessed(List<RectF> regions,
                                 List<WallpaperColors> colors) {
@@ -183,8 +193,11 @@
 
         @Override
         public void onDestroy() {
-            getDisplayContext().getSystemService(DisplayManager.class)
-                    .unregisterDisplayListener(this);
+            Context context = getDisplayContext();
+            if (context != null) {
+                DisplayManager displayManager = context.getSystemService(DisplayManager.class);
+                if (displayManager != null) displayManager.unregisterDisplayListener(this);
+            }
             mWallpaperLocalColorExtractor.cleanUp();
         }
 
@@ -429,6 +442,12 @@
         }
 
         @Override
+        public @Nullable WallpaperColors onComputeColors() {
+            if (!offloadColorExtraction()) return null;
+            return mWallpaperLocalColorExtractor.onComputeColors();
+        }
+
+        @Override
         public boolean supportsLocalColorExtraction() {
             return true;
         }
@@ -465,6 +484,12 @@
         }
 
         @Override
+        public void onDimAmountChanged(float dimAmount) {
+            if (!offloadColorExtraction()) return;
+            mWallpaperLocalColorExtractor.onDimAmountChanged(dimAmount);
+        }
+
+        @Override
         public void onDisplayAdded(int displayId) {
 
         }
diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractor.java b/packages/SystemUI/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractor.java
index e2ec8dc..d37dfb4 100644
--- a/packages/SystemUI/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractor.java
+++ b/packages/SystemUI/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractor.java
@@ -17,6 +17,8 @@
 
 package com.android.systemui.wallpapers;
 
+import static com.android.window.flags.Flags.offloadColorExtraction;
+
 import android.app.WallpaperColors;
 import android.graphics.Bitmap;
 import android.graphics.Rect;
@@ -66,6 +68,12 @@
     private final List<RectF> mPendingRegions = new ArrayList<>();
     private final Set<RectF> mProcessedRegions = new ArraySet<>();
 
+    private float mWallpaperDimAmount = 0f;
+    private WallpaperColors mWallpaperColors;
+
+    // By default we assume that colors were loaded from disk and don't need to be recomputed
+    private boolean mRecomputeColors = false;
+
     @LongRunning
     private final Executor mLongExecutor;
 
@@ -75,6 +83,12 @@
      * Interface to handle the callbacks after the different steps of the color extraction
      */
     public interface WallpaperLocalColorExtractorCallback {
+
+        /**
+         * Callback after the wallpaper colors have been computed
+         */
+        void onColorsProcessed();
+
         /**
          * Callback after the colors of new regions have been extracted
          * @param regions the list of new regions that have been processed
@@ -129,7 +143,7 @@
             if (displayWidth == mDisplayWidth && displayHeight == mDisplayHeight) return;
             mDisplayWidth = displayWidth;
             mDisplayHeight = displayHeight;
-            processColorsInternal();
+            processLocalColorsInternal();
         }
     }
 
@@ -166,7 +180,8 @@
             mBitmapHeight = bitmap.getHeight();
             mMiniBitmap = createMiniBitmap(bitmap);
             mWallpaperLocalColorExtractorCallback.onMiniBitmapUpdated();
-            recomputeColors();
+            if (offloadColorExtraction() && mRecomputeColors) recomputeColorsInternal();
+            recomputeLocalColors();
         }
     }
 
@@ -184,16 +199,66 @@
             if (mPages == pages) return;
             mPages = pages;
             if (mMiniBitmap != null && !mMiniBitmap.isRecycled()) {
-                recomputeColors();
+                recomputeLocalColors();
             }
         }
     }
 
-    // helper to recompute colors, to be called in synchronized methods
-    private void recomputeColors() {
+    /**
+     * Should be called when the dim amount of the wallpaper changes, to recompute the colors
+     */
+    public void onDimAmountChanged(float dimAmount) {
+        mLongExecutor.execute(() -> onDimAmountChangedSynchronized(dimAmount));
+    }
+
+    private void onDimAmountChangedSynchronized(float dimAmount) {
+        synchronized (mLock) {
+            if (mWallpaperDimAmount == dimAmount) return;
+            mWallpaperDimAmount = dimAmount;
+            mRecomputeColors = true;
+            recomputeColorsInternal();
+        }
+    }
+
+    /**
+     * To be called by {@link ImageWallpaper.CanvasEngine#onComputeColors}. This will either
+     * return the current wallpaper colors, or if the bitmap is not yet loaded, return null and call
+     * {@link WallpaperLocalColorExtractorCallback#onColorsProcessed()} when the colors are ready.
+     */
+    public WallpaperColors onComputeColors() {
+        mLongExecutor.execute(this::onComputeColorsSynchronized);
+        return mWallpaperColors;
+    }
+
+    private void onComputeColorsSynchronized() {
+        synchronized (mLock) {
+            if (mRecomputeColors) return;
+            mRecomputeColors = true;
+            recomputeColorsInternal();
+        }
+    }
+
+    /**
+     * helper to recompute main colors, to be called in synchronized methods
+     */
+    private void recomputeColorsInternal() {
+        if (mMiniBitmap == null) return;
+        mWallpaperColors = getWallpaperColors(mMiniBitmap, mWallpaperDimAmount);
+        mWallpaperLocalColorExtractorCallback.onColorsProcessed();
+    }
+
+    @VisibleForTesting
+    WallpaperColors getWallpaperColors(@NonNull Bitmap bitmap, float dimAmount) {
+        return WallpaperColors.fromBitmap(bitmap, dimAmount);
+    }
+
+    /**
+     * helper to recompute local colors, to be called in synchronized methods
+     */
+    private void recomputeLocalColors() {
         mPendingRegions.addAll(mProcessedRegions);
         mProcessedRegions.clear();
-        processColorsInternal();
+        processLocalColorsInternal();
     }
 
     /**
@@ -216,7 +281,7 @@
             if (!wasActive && isActive()) {
                 mWallpaperLocalColorExtractorCallback.onActivated();
             }
-            processColorsInternal();
+            processLocalColorsInternal();
         }
     }
 
@@ -353,7 +418,7 @@
      * then notify the callback with the resulting colors for these regions
      * This method should only be called synchronously
      */
-    private void processColorsInternal() {
+    private void processLocalColorsInternal() {
         /*
          * if the miniBitmap is not yet loaded, that means the onBitmapChanged has not yet been
          * called, and thus the wallpaper is not yet loaded. In that case, exit, the function
diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml
index 572a6c1..0dbbe63 100644
--- a/packages/SystemUI/tests/AndroidManifest.xml
+++ b/packages/SystemUI/tests/AndroidManifest.xml
@@ -224,6 +224,5 @@
 
     <instrumentation android:name="android.testing.TestableInstrumentation"
         android:targetPackage="com.android.systemui.tests"
-        android:label="Tests for SystemUI">
-    </instrumentation>
+        android:label="Tests for SystemUI" />
 </manifest>
diff --git a/packages/SystemUI/tests/AndroidTest.xml b/packages/SystemUI/tests/AndroidTest.xml
index cd2a62d..2de5faf 100644
--- a/packages/SystemUI/tests/AndroidTest.xml
+++ b/packages/SystemUI/tests/AndroidTest.xml
@@ -23,6 +23,15 @@
         <option name="force-root" value="true" />
     </target_preparer>
 
+    <target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
+        <option name="screen-always-on" value="on" />
+    </target_preparer>
+
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+        <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
+        <option name="run-command" value="wm dismiss-keyguard" />
+    </target_preparer>
+
     <option name="test-suite-tag" value="apct" />
     <option name="test-suite-tag" value="framework-base-presubmit" />
     <option name="test-tag" value="SystemUITests" />
diff --git a/packages/SystemUI/tests/goldens/backgroundAnimationWithoutFade_whenLaunching.json b/packages/SystemUI/tests/goldens/backgroundAnimationWithoutFade_whenLaunching.json
new file mode 100644
index 0000000..60bff17
--- /dev/null
+++ b/packages/SystemUI/tests/goldens/backgroundAnimationWithoutFade_whenLaunching.json
@@ -0,0 +1,393 @@
+{
+  "frame_ids": [
+    "before",
+    0,
+    26,
+    52,
+    78,
+    105,
+    131,
+    157,
+    184,
+    210,
+    236,
+    263,
+    289,
+    315,
+    342,
+    368,
+    394,
+    421,
+    447,
+    473,
+    500
+  ],
+  "features": [
+    {
+      "name": "bounds",
+      "type": "rect",
+      "data_points": [
+        {
+          "left": 0,
+          "top": 0,
+          "right": 0,
+          "bottom": 0
+        },
+        {
+          "left": 100,
+          "top": 300,
+          "right": 200,
+          "bottom": 400
+        },
+        {
+          "left": 98,
+          "top": 293,
+          "right": 203,
+          "bottom": 407
+        },
+        {
+          "left": 91,
+          "top": 269,
+          "right": 213,
+          "bottom": 430
+        },
+        {
+          "left": 71,
+          "top": 206,
+          "right": 240,
+          "bottom": 491
+        },
+        {
+          "left": 34,
+          "top": 98,
+          "right": 283,
+          "bottom": 595
+        },
+        {
+          "left": 22,
+          "top": 63,
+          "right": 296,
+          "bottom": 629
+        },
+        {
+          "left": 15,
+          "top": 44,
+          "right": 303,
+          "bottom": 648
+        },
+        {
+          "left": 11,
+          "top": 32,
+          "right": 308,
+          "bottom": 659
+        },
+        {
+          "left": 8,
+          "top": 23,
+          "right": 311,
+          "bottom": 667
+        },
+        {
+          "left": 6,
+          "top": 18,
+          "right": 313,
+          "bottom": 673
+        },
+        {
+          "left": 5,
+          "top": 13,
+          "right": 315,
+          "bottom": 677
+        },
+        {
+          "left": 3,
+          "top": 9,
+          "right": 316,
+          "bottom": 681
+        },
+        {
+          "left": 2,
+          "top": 7,
+          "right": 317,
+          "bottom": 683
+        },
+        {
+          "left": 2,
+          "top": 5,
+          "right": 318,
+          "bottom": 685
+        },
+        {
+          "left": 1,
+          "top": 3,
+          "right": 319,
+          "bottom": 687
+        },
+        {
+          "left": 1,
+          "top": 2,
+          "right": 319,
+          "bottom": 688
+        },
+        {
+          "left": 0,
+          "top": 1,
+          "right": 320,
+          "bottom": 689
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        }
+      ]
+    },
+    {
+      "name": "corner_radii",
+      "type": "cornerRadii",
+      "data_points": [
+        null,
+        {
+          "top_left_x": 10,
+          "top_left_y": 10,
+          "top_right_x": 10,
+          "top_right_y": 10,
+          "bottom_right_x": 20,
+          "bottom_right_y": 20,
+          "bottom_left_x": 20,
+          "bottom_left_y": 20
+        },
+        {
+          "top_left_x": 9.762664,
+          "top_left_y": 9.762664,
+          "top_right_x": 9.762664,
+          "top_right_y": 9.762664,
+          "bottom_right_x": 19.525328,
+          "bottom_right_y": 19.525328,
+          "bottom_left_x": 19.525328,
+          "bottom_left_y": 19.525328
+        },
+        {
+          "top_left_x": 8.969244,
+          "top_left_y": 8.969244,
+          "top_right_x": 8.969244,
+          "top_right_y": 8.969244,
+          "bottom_right_x": 17.938488,
+          "bottom_right_y": 17.938488,
+          "bottom_left_x": 17.938488,
+          "bottom_left_y": 17.938488
+        },
+        {
+          "top_left_x": 6.8709626,
+          "top_left_y": 6.8709626,
+          "top_right_x": 6.8709626,
+          "top_right_y": 6.8709626,
+          "bottom_right_x": 13.741925,
+          "bottom_right_y": 13.741925,
+          "bottom_left_x": 13.741925,
+          "bottom_left_y": 13.741925
+        },
+        {
+          "top_left_x": 3.260561,
+          "top_left_y": 3.260561,
+          "top_right_x": 3.260561,
+          "top_right_y": 3.260561,
+          "bottom_right_x": 6.521122,
+          "bottom_right_y": 6.521122,
+          "bottom_left_x": 6.521122,
+          "bottom_left_y": 6.521122
+        },
+        {
+          "top_left_x": 2.0915751,
+          "top_left_y": 2.0915751,
+          "top_right_x": 2.0915751,
+          "top_right_y": 2.0915751,
+          "bottom_right_x": 4.1831503,
+          "bottom_right_y": 4.1831503,
+          "bottom_left_x": 4.1831503,
+          "bottom_left_y": 4.1831503
+        },
+        {
+          "top_left_x": 1.4640827,
+          "top_left_y": 1.4640827,
+          "top_right_x": 1.4640827,
+          "top_right_y": 1.4640827,
+          "bottom_right_x": 2.9281654,
+          "bottom_right_y": 2.9281654,
+          "bottom_left_x": 2.9281654,
+          "bottom_left_y": 2.9281654
+        },
+        {
+          "top_left_x": 1.057313,
+          "top_left_y": 1.057313,
+          "top_right_x": 1.057313,
+          "top_right_y": 1.057313,
+          "bottom_right_x": 2.114626,
+          "bottom_right_y": 2.114626,
+          "bottom_left_x": 2.114626,
+          "bottom_left_y": 2.114626
+        },
+        {
+          "top_left_x": 0.7824335,
+          "top_left_y": 0.7824335,
+          "top_right_x": 0.7824335,
+          "top_right_y": 0.7824335,
+          "bottom_right_x": 1.564867,
+          "bottom_right_y": 1.564867,
+          "bottom_left_x": 1.564867,
+          "bottom_left_y": 1.564867
+        },
+        {
+          "top_left_x": 0.5863056,
+          "top_left_y": 0.5863056,
+          "top_right_x": 0.5863056,
+          "top_right_y": 0.5863056,
+          "bottom_right_x": 1.1726112,
+          "bottom_right_y": 1.1726112,
+          "bottom_left_x": 1.1726112,
+          "bottom_left_y": 1.1726112
+        },
+        {
+          "top_left_x": 0.4332962,
+          "top_left_y": 0.4332962,
+          "top_right_x": 0.4332962,
+          "top_right_y": 0.4332962,
+          "bottom_right_x": 0.8665924,
+          "bottom_right_y": 0.8665924,
+          "bottom_left_x": 0.8665924,
+          "bottom_left_y": 0.8665924
+        },
+        {
+          "top_left_x": 0.3145876,
+          "top_left_y": 0.3145876,
+          "top_right_x": 0.3145876,
+          "top_right_y": 0.3145876,
+          "bottom_right_x": 0.6291752,
+          "bottom_right_y": 0.6291752,
+          "bottom_left_x": 0.6291752,
+          "bottom_left_y": 0.6291752
+        },
+        {
+          "top_left_x": 0.22506618,
+          "top_left_y": 0.22506618,
+          "top_right_x": 0.22506618,
+          "top_right_y": 0.22506618,
+          "bottom_right_x": 0.45013237,
+          "bottom_right_y": 0.45013237,
+          "bottom_left_x": 0.45013237,
+          "bottom_left_y": 0.45013237
+        },
+        {
+          "top_left_x": 0.15591621,
+          "top_left_y": 0.15591621,
+          "top_right_x": 0.15591621,
+          "top_right_y": 0.15591621,
+          "bottom_right_x": 0.31183243,
+          "bottom_right_y": 0.31183243,
+          "bottom_left_x": 0.31183243,
+          "bottom_left_y": 0.31183243
+        },
+        {
+          "top_left_x": 0.100948334,
+          "top_left_y": 0.100948334,
+          "top_right_x": 0.100948334,
+          "top_right_y": 0.100948334,
+          "bottom_right_x": 0.20189667,
+          "bottom_right_y": 0.20189667,
+          "bottom_left_x": 0.20189667,
+          "bottom_left_y": 0.20189667
+        },
+        {
+          "top_left_x": 0.06496239,
+          "top_left_y": 0.06496239,
+          "top_right_x": 0.06496239,
+          "top_right_y": 0.06496239,
+          "bottom_right_x": 0.12992477,
+          "bottom_right_y": 0.12992477,
+          "bottom_left_x": 0.12992477,
+          "bottom_left_y": 0.12992477
+        },
+        {
+          "top_left_x": 0.03526497,
+          "top_left_y": 0.03526497,
+          "top_right_x": 0.03526497,
+          "top_right_y": 0.03526497,
+          "bottom_right_x": 0.07052994,
+          "bottom_right_y": 0.07052994,
+          "bottom_left_x": 0.07052994,
+          "bottom_left_y": 0.07052994
+        },
+        {
+          "top_left_x": 0.014661789,
+          "top_left_y": 0.014661789,
+          "top_right_x": 0.014661789,
+          "top_right_y": 0.014661789,
+          "bottom_right_x": 0.029323578,
+          "bottom_right_y": 0.029323578,
+          "bottom_left_x": 0.029323578,
+          "bottom_left_y": 0.029323578
+        },
+        {
+          "top_left_x": 0.0041856766,
+          "top_left_y": 0.0041856766,
+          "top_right_x": 0.0041856766,
+          "top_right_y": 0.0041856766,
+          "bottom_right_x": 0.008371353,
+          "bottom_right_y": 0.008371353,
+          "bottom_left_x": 0.008371353,
+          "bottom_left_y": 0.008371353
+        },
+        {
+          "top_left_x": 0,
+          "top_left_y": 0,
+          "top_right_x": 0,
+          "top_right_y": 0,
+          "bottom_right_x": 0,
+          "bottom_right_y": 0,
+          "bottom_left_x": 0,
+          "bottom_left_y": 0
+        }
+      ]
+    },
+    {
+      "name": "alpha",
+      "type": "int",
+      "data_points": [
+        0,
+        0,
+        115,
+        178,
+        217,
+        241,
+        253,
+        255,
+        255,
+        255,
+        255,
+        255,
+        255,
+        255,
+        255,
+        255,
+        255,
+        255,
+        255,
+        255,
+        255
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/goldens/backgroundAnimationWithoutFade_whenReturning.json b/packages/SystemUI/tests/goldens/backgroundAnimationWithoutFade_whenReturning.json
new file mode 100644
index 0000000..ea768c0
--- /dev/null
+++ b/packages/SystemUI/tests/goldens/backgroundAnimationWithoutFade_whenReturning.json
@@ -0,0 +1,393 @@
+{
+  "frame_ids": [
+    "before",
+    0,
+    26,
+    52,
+    78,
+    105,
+    131,
+    157,
+    184,
+    210,
+    236,
+    263,
+    289,
+    315,
+    342,
+    368,
+    394,
+    421,
+    447,
+    473,
+    500
+  ],
+  "features": [
+    {
+      "name": "bounds",
+      "type": "rect",
+      "data_points": [
+        {
+          "left": 0,
+          "top": 0,
+          "right": 0,
+          "bottom": 0
+        },
+        {
+          "left": 100,
+          "top": 300,
+          "right": 200,
+          "bottom": 400
+        },
+        {
+          "left": 98,
+          "top": 293,
+          "right": 203,
+          "bottom": 407
+        },
+        {
+          "left": 91,
+          "top": 269,
+          "right": 213,
+          "bottom": 430
+        },
+        {
+          "left": 71,
+          "top": 206,
+          "right": 240,
+          "bottom": 491
+        },
+        {
+          "left": 34,
+          "top": 98,
+          "right": 283,
+          "bottom": 595
+        },
+        {
+          "left": 22,
+          "top": 63,
+          "right": 296,
+          "bottom": 629
+        },
+        {
+          "left": 15,
+          "top": 44,
+          "right": 303,
+          "bottom": 648
+        },
+        {
+          "left": 11,
+          "top": 32,
+          "right": 308,
+          "bottom": 659
+        },
+        {
+          "left": 8,
+          "top": 23,
+          "right": 311,
+          "bottom": 667
+        },
+        {
+          "left": 6,
+          "top": 18,
+          "right": 313,
+          "bottom": 673
+        },
+        {
+          "left": 5,
+          "top": 13,
+          "right": 315,
+          "bottom": 677
+        },
+        {
+          "left": 3,
+          "top": 9,
+          "right": 316,
+          "bottom": 681
+        },
+        {
+          "left": 2,
+          "top": 7,
+          "right": 317,
+          "bottom": 683
+        },
+        {
+          "left": 2,
+          "top": 5,
+          "right": 318,
+          "bottom": 685
+        },
+        {
+          "left": 1,
+          "top": 3,
+          "right": 319,
+          "bottom": 687
+        },
+        {
+          "left": 1,
+          "top": 2,
+          "right": 319,
+          "bottom": 688
+        },
+        {
+          "left": 0,
+          "top": 1,
+          "right": 320,
+          "bottom": 689
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        }
+      ]
+    },
+    {
+      "name": "corner_radii",
+      "type": "cornerRadii",
+      "data_points": [
+        null,
+        {
+          "top_left_x": 10,
+          "top_left_y": 10,
+          "top_right_x": 10,
+          "top_right_y": 10,
+          "bottom_right_x": 20,
+          "bottom_right_y": 20,
+          "bottom_left_x": 20,
+          "bottom_left_y": 20
+        },
+        {
+          "top_left_x": 9.762664,
+          "top_left_y": 9.762664,
+          "top_right_x": 9.762664,
+          "top_right_y": 9.762664,
+          "bottom_right_x": 19.525328,
+          "bottom_right_y": 19.525328,
+          "bottom_left_x": 19.525328,
+          "bottom_left_y": 19.525328
+        },
+        {
+          "top_left_x": 8.969244,
+          "top_left_y": 8.969244,
+          "top_right_x": 8.969244,
+          "top_right_y": 8.969244,
+          "bottom_right_x": 17.938488,
+          "bottom_right_y": 17.938488,
+          "bottom_left_x": 17.938488,
+          "bottom_left_y": 17.938488
+        },
+        {
+          "top_left_x": 6.8709626,
+          "top_left_y": 6.8709626,
+          "top_right_x": 6.8709626,
+          "top_right_y": 6.8709626,
+          "bottom_right_x": 13.741925,
+          "bottom_right_y": 13.741925,
+          "bottom_left_x": 13.741925,
+          "bottom_left_y": 13.741925
+        },
+        {
+          "top_left_x": 3.260561,
+          "top_left_y": 3.260561,
+          "top_right_x": 3.260561,
+          "top_right_y": 3.260561,
+          "bottom_right_x": 6.521122,
+          "bottom_right_y": 6.521122,
+          "bottom_left_x": 6.521122,
+          "bottom_left_y": 6.521122
+        },
+        {
+          "top_left_x": 2.0915751,
+          "top_left_y": 2.0915751,
+          "top_right_x": 2.0915751,
+          "top_right_y": 2.0915751,
+          "bottom_right_x": 4.1831503,
+          "bottom_right_y": 4.1831503,
+          "bottom_left_x": 4.1831503,
+          "bottom_left_y": 4.1831503
+        },
+        {
+          "top_left_x": 1.4640827,
+          "top_left_y": 1.4640827,
+          "top_right_x": 1.4640827,
+          "top_right_y": 1.4640827,
+          "bottom_right_x": 2.9281654,
+          "bottom_right_y": 2.9281654,
+          "bottom_left_x": 2.9281654,
+          "bottom_left_y": 2.9281654
+        },
+        {
+          "top_left_x": 1.057313,
+          "top_left_y": 1.057313,
+          "top_right_x": 1.057313,
+          "top_right_y": 1.057313,
+          "bottom_right_x": 2.114626,
+          "bottom_right_y": 2.114626,
+          "bottom_left_x": 2.114626,
+          "bottom_left_y": 2.114626
+        },
+        {
+          "top_left_x": 0.7824335,
+          "top_left_y": 0.7824335,
+          "top_right_x": 0.7824335,
+          "top_right_y": 0.7824335,
+          "bottom_right_x": 1.564867,
+          "bottom_right_y": 1.564867,
+          "bottom_left_x": 1.564867,
+          "bottom_left_y": 1.564867
+        },
+        {
+          "top_left_x": 0.5863056,
+          "top_left_y": 0.5863056,
+          "top_right_x": 0.5863056,
+          "top_right_y": 0.5863056,
+          "bottom_right_x": 1.1726112,
+          "bottom_right_y": 1.1726112,
+          "bottom_left_x": 1.1726112,
+          "bottom_left_y": 1.1726112
+        },
+        {
+          "top_left_x": 0.4332962,
+          "top_left_y": 0.4332962,
+          "top_right_x": 0.4332962,
+          "top_right_y": 0.4332962,
+          "bottom_right_x": 0.8665924,
+          "bottom_right_y": 0.8665924,
+          "bottom_left_x": 0.8665924,
+          "bottom_left_y": 0.8665924
+        },
+        {
+          "top_left_x": 0.3145876,
+          "top_left_y": 0.3145876,
+          "top_right_x": 0.3145876,
+          "top_right_y": 0.3145876,
+          "bottom_right_x": 0.6291752,
+          "bottom_right_y": 0.6291752,
+          "bottom_left_x": 0.6291752,
+          "bottom_left_y": 0.6291752
+        },
+        {
+          "top_left_x": 0.22506618,
+          "top_left_y": 0.22506618,
+          "top_right_x": 0.22506618,
+          "top_right_y": 0.22506618,
+          "bottom_right_x": 0.45013237,
+          "bottom_right_y": 0.45013237,
+          "bottom_left_x": 0.45013237,
+          "bottom_left_y": 0.45013237
+        },
+        {
+          "top_left_x": 0.15591621,
+          "top_left_y": 0.15591621,
+          "top_right_x": 0.15591621,
+          "top_right_y": 0.15591621,
+          "bottom_right_x": 0.31183243,
+          "bottom_right_y": 0.31183243,
+          "bottom_left_x": 0.31183243,
+          "bottom_left_y": 0.31183243
+        },
+        {
+          "top_left_x": 0.100948334,
+          "top_left_y": 0.100948334,
+          "top_right_x": 0.100948334,
+          "top_right_y": 0.100948334,
+          "bottom_right_x": 0.20189667,
+          "bottom_right_y": 0.20189667,
+          "bottom_left_x": 0.20189667,
+          "bottom_left_y": 0.20189667
+        },
+        {
+          "top_left_x": 0.06496239,
+          "top_left_y": 0.06496239,
+          "top_right_x": 0.06496239,
+          "top_right_y": 0.06496239,
+          "bottom_right_x": 0.12992477,
+          "bottom_right_y": 0.12992477,
+          "bottom_left_x": 0.12992477,
+          "bottom_left_y": 0.12992477
+        },
+        {
+          "top_left_x": 0.03526497,
+          "top_left_y": 0.03526497,
+          "top_right_x": 0.03526497,
+          "top_right_y": 0.03526497,
+          "bottom_right_x": 0.07052994,
+          "bottom_right_y": 0.07052994,
+          "bottom_left_x": 0.07052994,
+          "bottom_left_y": 0.07052994
+        },
+        {
+          "top_left_x": 0.014661789,
+          "top_left_y": 0.014661789,
+          "top_right_x": 0.014661789,
+          "top_right_y": 0.014661789,
+          "bottom_right_x": 0.029323578,
+          "bottom_right_y": 0.029323578,
+          "bottom_left_x": 0.029323578,
+          "bottom_left_y": 0.029323578
+        },
+        {
+          "top_left_x": 0.0041856766,
+          "top_left_y": 0.0041856766,
+          "top_right_x": 0.0041856766,
+          "top_right_y": 0.0041856766,
+          "bottom_right_x": 0.008371353,
+          "bottom_right_y": 0.008371353,
+          "bottom_left_x": 0.008371353,
+          "bottom_left_y": 0.008371353
+        },
+        {
+          "top_left_x": 0,
+          "top_left_y": 0,
+          "top_right_x": 0,
+          "top_right_y": 0,
+          "bottom_right_x": 0,
+          "bottom_right_y": 0,
+          "bottom_left_x": 0,
+          "bottom_left_y": 0
+        }
+      ]
+    },
+    {
+      "name": "alpha",
+      "type": "int",
+      "data_points": [
+        0,
+        255,
+        255,
+        255,
+        255,
+        255,
+        255,
+        239,
+        183,
+        135,
+        91,
+        53,
+        23,
+        5,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/goldens/backgroundAnimation_whenLaunching.json b/packages/SystemUI/tests/goldens/backgroundAnimation_whenLaunching.json
new file mode 100644
index 0000000..608e633
--- /dev/null
+++ b/packages/SystemUI/tests/goldens/backgroundAnimation_whenLaunching.json
@@ -0,0 +1,393 @@
+{
+  "frame_ids": [
+    "before",
+    0,
+    26,
+    52,
+    78,
+    105,
+    131,
+    157,
+    184,
+    210,
+    236,
+    263,
+    289,
+    315,
+    342,
+    368,
+    394,
+    421,
+    447,
+    473,
+    500
+  ],
+  "features": [
+    {
+      "name": "bounds",
+      "type": "rect",
+      "data_points": [
+        {
+          "left": 0,
+          "top": 0,
+          "right": 0,
+          "bottom": 0
+        },
+        {
+          "left": 100,
+          "top": 300,
+          "right": 200,
+          "bottom": 400
+        },
+        {
+          "left": 98,
+          "top": 293,
+          "right": 203,
+          "bottom": 407
+        },
+        {
+          "left": 91,
+          "top": 269,
+          "right": 213,
+          "bottom": 430
+        },
+        {
+          "left": 71,
+          "top": 206,
+          "right": 240,
+          "bottom": 491
+        },
+        {
+          "left": 34,
+          "top": 98,
+          "right": 283,
+          "bottom": 595
+        },
+        {
+          "left": 22,
+          "top": 63,
+          "right": 296,
+          "bottom": 629
+        },
+        {
+          "left": 15,
+          "top": 44,
+          "right": 303,
+          "bottom": 648
+        },
+        {
+          "left": 11,
+          "top": 32,
+          "right": 308,
+          "bottom": 659
+        },
+        {
+          "left": 8,
+          "top": 23,
+          "right": 311,
+          "bottom": 667
+        },
+        {
+          "left": 6,
+          "top": 18,
+          "right": 313,
+          "bottom": 673
+        },
+        {
+          "left": 5,
+          "top": 13,
+          "right": 315,
+          "bottom": 677
+        },
+        {
+          "left": 3,
+          "top": 9,
+          "right": 316,
+          "bottom": 681
+        },
+        {
+          "left": 2,
+          "top": 7,
+          "right": 317,
+          "bottom": 683
+        },
+        {
+          "left": 2,
+          "top": 5,
+          "right": 318,
+          "bottom": 685
+        },
+        {
+          "left": 1,
+          "top": 3,
+          "right": 319,
+          "bottom": 687
+        },
+        {
+          "left": 1,
+          "top": 2,
+          "right": 319,
+          "bottom": 688
+        },
+        {
+          "left": 0,
+          "top": 1,
+          "right": 320,
+          "bottom": 689
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        }
+      ]
+    },
+    {
+      "name": "corner_radii",
+      "type": "cornerRadii",
+      "data_points": [
+        null,
+        {
+          "top_left_x": 10,
+          "top_left_y": 10,
+          "top_right_x": 10,
+          "top_right_y": 10,
+          "bottom_right_x": 20,
+          "bottom_right_y": 20,
+          "bottom_left_x": 20,
+          "bottom_left_y": 20
+        },
+        {
+          "top_left_x": 9.762664,
+          "top_left_y": 9.762664,
+          "top_right_x": 9.762664,
+          "top_right_y": 9.762664,
+          "bottom_right_x": 19.525328,
+          "bottom_right_y": 19.525328,
+          "bottom_left_x": 19.525328,
+          "bottom_left_y": 19.525328
+        },
+        {
+          "top_left_x": 8.969244,
+          "top_left_y": 8.969244,
+          "top_right_x": 8.969244,
+          "top_right_y": 8.969244,
+          "bottom_right_x": 17.938488,
+          "bottom_right_y": 17.938488,
+          "bottom_left_x": 17.938488,
+          "bottom_left_y": 17.938488
+        },
+        {
+          "top_left_x": 6.8709626,
+          "top_left_y": 6.8709626,
+          "top_right_x": 6.8709626,
+          "top_right_y": 6.8709626,
+          "bottom_right_x": 13.741925,
+          "bottom_right_y": 13.741925,
+          "bottom_left_x": 13.741925,
+          "bottom_left_y": 13.741925
+        },
+        {
+          "top_left_x": 3.260561,
+          "top_left_y": 3.260561,
+          "top_right_x": 3.260561,
+          "top_right_y": 3.260561,
+          "bottom_right_x": 6.521122,
+          "bottom_right_y": 6.521122,
+          "bottom_left_x": 6.521122,
+          "bottom_left_y": 6.521122
+        },
+        {
+          "top_left_x": 2.0915751,
+          "top_left_y": 2.0915751,
+          "top_right_x": 2.0915751,
+          "top_right_y": 2.0915751,
+          "bottom_right_x": 4.1831503,
+          "bottom_right_y": 4.1831503,
+          "bottom_left_x": 4.1831503,
+          "bottom_left_y": 4.1831503
+        },
+        {
+          "top_left_x": 1.4640827,
+          "top_left_y": 1.4640827,
+          "top_right_x": 1.4640827,
+          "top_right_y": 1.4640827,
+          "bottom_right_x": 2.9281654,
+          "bottom_right_y": 2.9281654,
+          "bottom_left_x": 2.9281654,
+          "bottom_left_y": 2.9281654
+        },
+        {
+          "top_left_x": 1.057313,
+          "top_left_y": 1.057313,
+          "top_right_x": 1.057313,
+          "top_right_y": 1.057313,
+          "bottom_right_x": 2.114626,
+          "bottom_right_y": 2.114626,
+          "bottom_left_x": 2.114626,
+          "bottom_left_y": 2.114626
+        },
+        {
+          "top_left_x": 0.7824335,
+          "top_left_y": 0.7824335,
+          "top_right_x": 0.7824335,
+          "top_right_y": 0.7824335,
+          "bottom_right_x": 1.564867,
+          "bottom_right_y": 1.564867,
+          "bottom_left_x": 1.564867,
+          "bottom_left_y": 1.564867
+        },
+        {
+          "top_left_x": 0.5863056,
+          "top_left_y": 0.5863056,
+          "top_right_x": 0.5863056,
+          "top_right_y": 0.5863056,
+          "bottom_right_x": 1.1726112,
+          "bottom_right_y": 1.1726112,
+          "bottom_left_x": 1.1726112,
+          "bottom_left_y": 1.1726112
+        },
+        {
+          "top_left_x": 0.4332962,
+          "top_left_y": 0.4332962,
+          "top_right_x": 0.4332962,
+          "top_right_y": 0.4332962,
+          "bottom_right_x": 0.8665924,
+          "bottom_right_y": 0.8665924,
+          "bottom_left_x": 0.8665924,
+          "bottom_left_y": 0.8665924
+        },
+        {
+          "top_left_x": 0.3145876,
+          "top_left_y": 0.3145876,
+          "top_right_x": 0.3145876,
+          "top_right_y": 0.3145876,
+          "bottom_right_x": 0.6291752,
+          "bottom_right_y": 0.6291752,
+          "bottom_left_x": 0.6291752,
+          "bottom_left_y": 0.6291752
+        },
+        {
+          "top_left_x": 0.22506618,
+          "top_left_y": 0.22506618,
+          "top_right_x": 0.22506618,
+          "top_right_y": 0.22506618,
+          "bottom_right_x": 0.45013237,
+          "bottom_right_y": 0.45013237,
+          "bottom_left_x": 0.45013237,
+          "bottom_left_y": 0.45013237
+        },
+        {
+          "top_left_x": 0.15591621,
+          "top_left_y": 0.15591621,
+          "top_right_x": 0.15591621,
+          "top_right_y": 0.15591621,
+          "bottom_right_x": 0.31183243,
+          "bottom_right_y": 0.31183243,
+          "bottom_left_x": 0.31183243,
+          "bottom_left_y": 0.31183243
+        },
+        {
+          "top_left_x": 0.100948334,
+          "top_left_y": 0.100948334,
+          "top_right_x": 0.100948334,
+          "top_right_y": 0.100948334,
+          "bottom_right_x": 0.20189667,
+          "bottom_right_y": 0.20189667,
+          "bottom_left_x": 0.20189667,
+          "bottom_left_y": 0.20189667
+        },
+        {
+          "top_left_x": 0.06496239,
+          "top_left_y": 0.06496239,
+          "top_right_x": 0.06496239,
+          "top_right_y": 0.06496239,
+          "bottom_right_x": 0.12992477,
+          "bottom_right_y": 0.12992477,
+          "bottom_left_x": 0.12992477,
+          "bottom_left_y": 0.12992477
+        },
+        {
+          "top_left_x": 0.03526497,
+          "top_left_y": 0.03526497,
+          "top_right_x": 0.03526497,
+          "top_right_y": 0.03526497,
+          "bottom_right_x": 0.07052994,
+          "bottom_right_y": 0.07052994,
+          "bottom_left_x": 0.07052994,
+          "bottom_left_y": 0.07052994
+        },
+        {
+          "top_left_x": 0.014661789,
+          "top_left_y": 0.014661789,
+          "top_right_x": 0.014661789,
+          "top_right_y": 0.014661789,
+          "bottom_right_x": 0.029323578,
+          "bottom_right_y": 0.029323578,
+          "bottom_left_x": 0.029323578,
+          "bottom_left_y": 0.029323578
+        },
+        {
+          "top_left_x": 0.0041856766,
+          "top_left_y": 0.0041856766,
+          "top_right_x": 0.0041856766,
+          "top_right_y": 0.0041856766,
+          "bottom_right_x": 0.008371353,
+          "bottom_right_y": 0.008371353,
+          "bottom_left_x": 0.008371353,
+          "bottom_left_y": 0.008371353
+        },
+        {
+          "top_left_x": 0,
+          "top_left_y": 0,
+          "top_right_x": 0,
+          "top_right_y": 0,
+          "bottom_right_x": 0,
+          "bottom_right_y": 0,
+          "bottom_left_x": 0,
+          "bottom_left_y": 0
+        }
+      ]
+    },
+    {
+      "name": "alpha",
+      "type": "int",
+      "data_points": [
+        0,
+        0,
+        115,
+        178,
+        217,
+        241,
+        253,
+        239,
+        183,
+        135,
+        91,
+        53,
+        23,
+        5,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/goldens/backgroundAnimation_whenReturning.json b/packages/SystemUI/tests/goldens/backgroundAnimation_whenReturning.json
new file mode 100644
index 0000000..608e633
--- /dev/null
+++ b/packages/SystemUI/tests/goldens/backgroundAnimation_whenReturning.json
@@ -0,0 +1,393 @@
+{
+  "frame_ids": [
+    "before",
+    0,
+    26,
+    52,
+    78,
+    105,
+    131,
+    157,
+    184,
+    210,
+    236,
+    263,
+    289,
+    315,
+    342,
+    368,
+    394,
+    421,
+    447,
+    473,
+    500
+  ],
+  "features": [
+    {
+      "name": "bounds",
+      "type": "rect",
+      "data_points": [
+        {
+          "left": 0,
+          "top": 0,
+          "right": 0,
+          "bottom": 0
+        },
+        {
+          "left": 100,
+          "top": 300,
+          "right": 200,
+          "bottom": 400
+        },
+        {
+          "left": 98,
+          "top": 293,
+          "right": 203,
+          "bottom": 407
+        },
+        {
+          "left": 91,
+          "top": 269,
+          "right": 213,
+          "bottom": 430
+        },
+        {
+          "left": 71,
+          "top": 206,
+          "right": 240,
+          "bottom": 491
+        },
+        {
+          "left": 34,
+          "top": 98,
+          "right": 283,
+          "bottom": 595
+        },
+        {
+          "left": 22,
+          "top": 63,
+          "right": 296,
+          "bottom": 629
+        },
+        {
+          "left": 15,
+          "top": 44,
+          "right": 303,
+          "bottom": 648
+        },
+        {
+          "left": 11,
+          "top": 32,
+          "right": 308,
+          "bottom": 659
+        },
+        {
+          "left": 8,
+          "top": 23,
+          "right": 311,
+          "bottom": 667
+        },
+        {
+          "left": 6,
+          "top": 18,
+          "right": 313,
+          "bottom": 673
+        },
+        {
+          "left": 5,
+          "top": 13,
+          "right": 315,
+          "bottom": 677
+        },
+        {
+          "left": 3,
+          "top": 9,
+          "right": 316,
+          "bottom": 681
+        },
+        {
+          "left": 2,
+          "top": 7,
+          "right": 317,
+          "bottom": 683
+        },
+        {
+          "left": 2,
+          "top": 5,
+          "right": 318,
+          "bottom": 685
+        },
+        {
+          "left": 1,
+          "top": 3,
+          "right": 319,
+          "bottom": 687
+        },
+        {
+          "left": 1,
+          "top": 2,
+          "right": 319,
+          "bottom": 688
+        },
+        {
+          "left": 0,
+          "top": 1,
+          "right": 320,
+          "bottom": 689
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        },
+        {
+          "left": 0,
+          "top": 0,
+          "right": 320,
+          "bottom": 690
+        }
+      ]
+    },
+    {
+      "name": "corner_radii",
+      "type": "cornerRadii",
+      "data_points": [
+        null,
+        {
+          "top_left_x": 10,
+          "top_left_y": 10,
+          "top_right_x": 10,
+          "top_right_y": 10,
+          "bottom_right_x": 20,
+          "bottom_right_y": 20,
+          "bottom_left_x": 20,
+          "bottom_left_y": 20
+        },
+        {
+          "top_left_x": 9.762664,
+          "top_left_y": 9.762664,
+          "top_right_x": 9.762664,
+          "top_right_y": 9.762664,
+          "bottom_right_x": 19.525328,
+          "bottom_right_y": 19.525328,
+          "bottom_left_x": 19.525328,
+          "bottom_left_y": 19.525328
+        },
+        {
+          "top_left_x": 8.969244,
+          "top_left_y": 8.969244,
+          "top_right_x": 8.969244,
+          "top_right_y": 8.969244,
+          "bottom_right_x": 17.938488,
+          "bottom_right_y": 17.938488,
+          "bottom_left_x": 17.938488,
+          "bottom_left_y": 17.938488
+        },
+        {
+          "top_left_x": 6.8709626,
+          "top_left_y": 6.8709626,
+          "top_right_x": 6.8709626,
+          "top_right_y": 6.8709626,
+          "bottom_right_x": 13.741925,
+          "bottom_right_y": 13.741925,
+          "bottom_left_x": 13.741925,
+          "bottom_left_y": 13.741925
+        },
+        {
+          "top_left_x": 3.260561,
+          "top_left_y": 3.260561,
+          "top_right_x": 3.260561,
+          "top_right_y": 3.260561,
+          "bottom_right_x": 6.521122,
+          "bottom_right_y": 6.521122,
+          "bottom_left_x": 6.521122,
+          "bottom_left_y": 6.521122
+        },
+        {
+          "top_left_x": 2.0915751,
+          "top_left_y": 2.0915751,
+          "top_right_x": 2.0915751,
+          "top_right_y": 2.0915751,
+          "bottom_right_x": 4.1831503,
+          "bottom_right_y": 4.1831503,
+          "bottom_left_x": 4.1831503,
+          "bottom_left_y": 4.1831503
+        },
+        {
+          "top_left_x": 1.4640827,
+          "top_left_y": 1.4640827,
+          "top_right_x": 1.4640827,
+          "top_right_y": 1.4640827,
+          "bottom_right_x": 2.9281654,
+          "bottom_right_y": 2.9281654,
+          "bottom_left_x": 2.9281654,
+          "bottom_left_y": 2.9281654
+        },
+        {
+          "top_left_x": 1.057313,
+          "top_left_y": 1.057313,
+          "top_right_x": 1.057313,
+          "top_right_y": 1.057313,
+          "bottom_right_x": 2.114626,
+          "bottom_right_y": 2.114626,
+          "bottom_left_x": 2.114626,
+          "bottom_left_y": 2.114626
+        },
+        {
+          "top_left_x": 0.7824335,
+          "top_left_y": 0.7824335,
+          "top_right_x": 0.7824335,
+          "top_right_y": 0.7824335,
+          "bottom_right_x": 1.564867,
+          "bottom_right_y": 1.564867,
+          "bottom_left_x": 1.564867,
+          "bottom_left_y": 1.564867
+        },
+        {
+          "top_left_x": 0.5863056,
+          "top_left_y": 0.5863056,
+          "top_right_x": 0.5863056,
+          "top_right_y": 0.5863056,
+          "bottom_right_x": 1.1726112,
+          "bottom_right_y": 1.1726112,
+          "bottom_left_x": 1.1726112,
+          "bottom_left_y": 1.1726112
+        },
+        {
+          "top_left_x": 0.4332962,
+          "top_left_y": 0.4332962,
+          "top_right_x": 0.4332962,
+          "top_right_y": 0.4332962,
+          "bottom_right_x": 0.8665924,
+          "bottom_right_y": 0.8665924,
+          "bottom_left_x": 0.8665924,
+          "bottom_left_y": 0.8665924
+        },
+        {
+          "top_left_x": 0.3145876,
+          "top_left_y": 0.3145876,
+          "top_right_x": 0.3145876,
+          "top_right_y": 0.3145876,
+          "bottom_right_x": 0.6291752,
+          "bottom_right_y": 0.6291752,
+          "bottom_left_x": 0.6291752,
+          "bottom_left_y": 0.6291752
+        },
+        {
+          "top_left_x": 0.22506618,
+          "top_left_y": 0.22506618,
+          "top_right_x": 0.22506618,
+          "top_right_y": 0.22506618,
+          "bottom_right_x": 0.45013237,
+          "bottom_right_y": 0.45013237,
+          "bottom_left_x": 0.45013237,
+          "bottom_left_y": 0.45013237
+        },
+        {
+          "top_left_x": 0.15591621,
+          "top_left_y": 0.15591621,
+          "top_right_x": 0.15591621,
+          "top_right_y": 0.15591621,
+          "bottom_right_x": 0.31183243,
+          "bottom_right_y": 0.31183243,
+          "bottom_left_x": 0.31183243,
+          "bottom_left_y": 0.31183243
+        },
+        {
+          "top_left_x": 0.100948334,
+          "top_left_y": 0.100948334,
+          "top_right_x": 0.100948334,
+          "top_right_y": 0.100948334,
+          "bottom_right_x": 0.20189667,
+          "bottom_right_y": 0.20189667,
+          "bottom_left_x": 0.20189667,
+          "bottom_left_y": 0.20189667
+        },
+        {
+          "top_left_x": 0.06496239,
+          "top_left_y": 0.06496239,
+          "top_right_x": 0.06496239,
+          "top_right_y": 0.06496239,
+          "bottom_right_x": 0.12992477,
+          "bottom_right_y": 0.12992477,
+          "bottom_left_x": 0.12992477,
+          "bottom_left_y": 0.12992477
+        },
+        {
+          "top_left_x": 0.03526497,
+          "top_left_y": 0.03526497,
+          "top_right_x": 0.03526497,
+          "top_right_y": 0.03526497,
+          "bottom_right_x": 0.07052994,
+          "bottom_right_y": 0.07052994,
+          "bottom_left_x": 0.07052994,
+          "bottom_left_y": 0.07052994
+        },
+        {
+          "top_left_x": 0.014661789,
+          "top_left_y": 0.014661789,
+          "top_right_x": 0.014661789,
+          "top_right_y": 0.014661789,
+          "bottom_right_x": 0.029323578,
+          "bottom_right_y": 0.029323578,
+          "bottom_left_x": 0.029323578,
+          "bottom_left_y": 0.029323578
+        },
+        {
+          "top_left_x": 0.0041856766,
+          "top_left_y": 0.0041856766,
+          "top_right_x": 0.0041856766,
+          "top_right_y": 0.0041856766,
+          "bottom_right_x": 0.008371353,
+          "bottom_right_y": 0.008371353,
+          "bottom_left_x": 0.008371353,
+          "bottom_left_y": 0.008371353
+        },
+        {
+          "top_left_x": 0,
+          "top_left_y": 0,
+          "top_right_x": 0,
+          "top_right_y": 0,
+          "bottom_right_x": 0,
+          "bottom_right_y": 0,
+          "bottom_left_x": 0,
+          "bottom_left_y": 0
+        }
+      ]
+    },
+    {
+      "name": "alpha",
+      "type": "int",
+      "data_points": [
+        0,
+        0,
+        115,
+        178,
+        217,
+        241,
+        253,
+        239,
+        183,
+        135,
+        91,
+        53,
+        23,
+        5,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
index 3d0d8fb..9a83311 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt
@@ -142,6 +142,7 @@
                 context.resources,
                 context,
                 mainExecutor,
+                IMMEDIATE,
                 bgExecutor,
                 clockBuffers,
                 withDeps.featureFlags,
@@ -329,7 +330,8 @@
                 TransitionStep(
                     from = KeyguardState.LOCKSCREEN,
                     to = KeyguardState.AOD,
-                    value = 0.4f
+                    value = 0.4f,
+                    transitionState = TransitionState.RUNNING,
                 )
             yield()
 
@@ -360,6 +362,27 @@
         }
 
     @Test
+    fun listenForTransitionToLSFromOccluded_updatesClockDozeAmountToOne() =
+        runBlocking(IMMEDIATE) {
+            val transitionStep = MutableStateFlow(TransitionStep())
+            whenever(keyguardTransitionInteractor.transitionStepsToState(KeyguardState.LOCKSCREEN))
+                    .thenReturn(transitionStep)
+
+            val job = underTest.listenForAnyStateToLockscreenTransition(this)
+            transitionStep.value =
+                    TransitionStep(
+                            from = KeyguardState.OCCLUDED,
+                            to = KeyguardState.LOCKSCREEN,
+                            transitionState = TransitionState.STARTED,
+                    )
+            yield()
+
+            verify(animations, times(2)).doze(0f)
+
+            job.cancel()
+        }
+
+    @Test
     fun listenForTransitionToAodFromLockscreen_neverUpdatesClockDozeAmount() =
         runBlocking(IMMEDIATE) {
             val transitionStep = MutableStateFlow(TransitionStep())
@@ -377,6 +400,27 @@
 
             verify(animations, never()).doze(1f)
 
+                job.cancel()
+            }
+
+    @Test
+    fun listenForAnyStateToLockscreenTransition_neverUpdatesClockDozeAmount() =
+        runBlocking(IMMEDIATE) {
+            val transitionStep = MutableStateFlow(TransitionStep())
+            whenever(keyguardTransitionInteractor.transitionStepsToState(KeyguardState.LOCKSCREEN))
+                    .thenReturn(transitionStep)
+
+            val job = underTest.listenForAnyStateToLockscreenTransition(this)
+            transitionStep.value =
+                    TransitionStep(
+                            from = KeyguardState.AOD,
+                            to = KeyguardState.LOCKSCREEN,
+                            transitionState = TransitionState.STARTED,
+                    )
+            yield()
+
+            verify(animations, never()).doze(0f)
+
             job.cancel()
         }
 
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index fde45d3..5af0c1f 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -52,6 +52,7 @@
 import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
@@ -157,7 +158,6 @@
 import org.mockito.Captor;
 import org.mockito.InOrder;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.mockito.MockitoSession;
 import org.mockito.internal.util.reflection.FieldSetter;
@@ -809,6 +809,31 @@
     }
 
     @Test
+    public void whenFaceAuthenticated_biometricAuthenticatedCallback_beforeUpdatingFpState() {
+        // GIVEN listening for UDFPS fingerprint
+        when(mAuthController.isUdfpsSupported()).thenReturn(true);
+        mKeyguardUpdateMonitor.dispatchStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON);
+        mTestableLooper.processAllMessages();
+        keyguardIsVisible();
+        final CancellationSignal fpCancel = spy(mKeyguardUpdateMonitor.mFingerprintCancelSignal);
+        mKeyguardUpdateMonitor.mFingerprintCancelSignal = fpCancel;
+
+        // WHEN face is authenticated
+        when(mFaceAuthInteractor.isAuthenticated()).thenReturn(true);
+        when(mFaceAuthInteractor.isFaceAuthStrong()).thenReturn(true);
+        when(mFaceAuthInteractor.isLockedOut()).thenReturn(false);
+        mKeyguardUpdateMonitor.onFaceAuthenticated(0, true);
+        mTestableLooper.processAllMessages();
+
+        // THEN verify keyguardUpdateMonitorCallback receives an onAuthenticated callback
+        // before cancelling the fingerprint request
+        InOrder inOrder = inOrder(mTestCallback, fpCancel);
+        inOrder.verify(mTestCallback).onBiometricAuthenticated(
+                eq(0), eq(BiometricSourceType.FACE), eq(true));
+        inOrder.verify(fpCancel).cancel();
+    }
+
+    @Test
     public void whenDetectFingerprint_biometricDetectCallback() {
         ArgumentCaptor<FingerprintManager.FingerprintDetectionCallback> fpDetectCallbackCaptor =
                 ArgumentCaptor.forClass(FingerprintManager.FingerprintDetectionCallback.class);
@@ -2133,7 +2158,7 @@
                 null /* trustGrantedMessages */);
 
         // THEN onTrustChanged is called FIRST
-        final InOrder inOrder = Mockito.inOrder(callback);
+        final InOrder inOrder = inOrder(callback);
         inOrder.verify(callback).onTrustChanged(eq(mSelectedUserInteractor.getSelectedUserId()));
 
         // AND THEN onTrustGrantedForCurrentUser callback called
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/LegacyLockIconViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/keyguard/LegacyLockIconViewControllerBaseTest.java
new file mode 100644
index 0000000..f924ab4
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/LegacyLockIconViewControllerBaseTest.java
@@ -0,0 +1,239 @@
+/*
+ * 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.keyguard;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
+import static com.android.systemui.flags.Flags.DOZING_MIGRATION_1;
+import static com.android.systemui.flags.Flags.LOCKSCREEN_ENABLE_LANDSCAPE;
+import static com.android.systemui.flags.Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.graphics.drawable.AnimatedStateListDrawable;
+import android.util.Pair;
+import android.view.View;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
+
+import com.android.systemui.Flags;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.biometrics.AuthController;
+import com.android.systemui.biometrics.AuthRippleController;
+import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor;
+import com.android.systemui.doze.util.BurnInHelperKt;
+import com.android.systemui.dump.DumpManager;
+import com.android.systemui.flags.FakeFeatureFlags;
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory;
+import com.android.systemui.kosmos.KosmosJavaAdapter;
+import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.res.R;
+import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.VibratorHelper;
+import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.KeyguardStateController;
+import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.time.FakeSystemClock;
+
+import org.junit.After;
+import org.junit.Before;
+import org.mockito.Answers;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+import org.mockito.quality.Strictness;
+
+public class LegacyLockIconViewControllerBaseTest extends SysuiTestCase {
+    protected static final String UNLOCKED_LABEL = "unlocked";
+    protected static final String LOCKED_LABEL = "locked";
+    protected static final int PADDING = 10;
+
+    protected MockitoSession mStaticMockSession;
+
+    protected final KosmosJavaAdapter mKosmos = new KosmosJavaAdapter(this);
+    protected @Mock DeviceEntryInteractor mDeviceEntryInteractor;
+    protected @Mock LockIconView mLockIconView;
+    protected @Mock AnimatedStateListDrawable mIconDrawable;
+    protected @Mock Context mContext;
+    protected @Mock Resources mResources;
+    protected @Mock(answer = Answers.RETURNS_DEEP_STUBS) WindowManager mWindowManager;
+    protected @Mock StatusBarStateController mStatusBarStateController;
+    protected @Mock KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+    protected @Mock KeyguardViewController mKeyguardViewController;
+    protected @Mock KeyguardStateController mKeyguardStateController;
+    protected @Mock FalsingManager mFalsingManager;
+    protected @Mock AuthController mAuthController;
+    protected @Mock DumpManager mDumpManager;
+    protected @Mock AccessibilityManager mAccessibilityManager;
+    protected @Mock ConfigurationController mConfigurationController;
+    protected @Mock VibratorHelper mVibrator;
+    protected @Mock AuthRippleController mAuthRippleController;
+    protected FakeExecutor mDelayableExecutor = new FakeExecutor(new FakeSystemClock());
+    protected FakeFeatureFlags mFeatureFlags;
+
+    protected @Mock PrimaryBouncerInteractor mPrimaryBouncerInteractor;
+
+    protected LegacyLockIconViewController mUnderTest;
+
+    // Capture listeners so that they can be used to send events
+    @Captor protected ArgumentCaptor<View.OnAttachStateChangeListener> mAttachCaptor =
+            ArgumentCaptor.forClass(View.OnAttachStateChangeListener.class);
+
+    @Captor protected ArgumentCaptor<KeyguardStateController.Callback> mKeyguardStateCaptor =
+            ArgumentCaptor.forClass(KeyguardStateController.Callback.class);
+    protected KeyguardStateController.Callback mKeyguardStateCallback;
+
+    @Captor protected ArgumentCaptor<StatusBarStateController.StateListener> mStatusBarStateCaptor =
+            ArgumentCaptor.forClass(StatusBarStateController.StateListener.class);
+    protected StatusBarStateController.StateListener mStatusBarStateListener;
+
+    @Captor protected ArgumentCaptor<AuthController.Callback> mAuthControllerCallbackCaptor;
+    protected AuthController.Callback mAuthControllerCallback;
+
+    @Captor protected ArgumentCaptor<KeyguardUpdateMonitorCallback>
+            mKeyguardUpdateMonitorCallbackCaptor =
+            ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback.class);
+    protected KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback;
+
+    @Captor protected ArgumentCaptor<Point> mPointCaptor;
+
+    @Before
+    public void setUp() throws Exception {
+        mStaticMockSession = mockitoSession()
+                .mockStatic(BurnInHelperKt.class)
+                .strictness(Strictness.LENIENT)
+                .startMocking();
+        MockitoAnnotations.initMocks(this);
+
+        setupLockIconViewMocks();
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mContext.getSystemService(WindowManager.class)).thenReturn(mWindowManager);
+        Rect windowBounds = new Rect(0, 0, 800, 1200);
+        when(mWindowManager.getCurrentWindowMetrics().getBounds()).thenReturn(windowBounds);
+        when(mResources.getString(R.string.accessibility_unlock_button)).thenReturn(UNLOCKED_LABEL);
+        when(mResources.getString(R.string.accessibility_lock_icon)).thenReturn(LOCKED_LABEL);
+        when(mResources.getDrawable(anyInt(), any())).thenReturn(mIconDrawable);
+        when(mResources.getDimensionPixelSize(R.dimen.lock_icon_padding)).thenReturn(PADDING);
+        when(mAuthController.getScaleFactor()).thenReturn(1f);
+
+        when(mKeyguardStateController.isShowing()).thenReturn(true);
+        when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(false);
+        when(mStatusBarStateController.isDozing()).thenReturn(false);
+        when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
+
+        mSetFlagsRule.disableFlags(Flags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR);
+        mSetFlagsRule.disableFlags(Flags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT);
+
+        mFeatureFlags = new FakeFeatureFlags();
+        mFeatureFlags.set(LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false);
+        mFeatureFlags.set(LOCKSCREEN_ENABLE_LANDSCAPE, false);
+
+        mUnderTest = new LegacyLockIconViewController(
+                mStatusBarStateController,
+                mKeyguardUpdateMonitor,
+                mKeyguardViewController,
+                mKeyguardStateController,
+                mFalsingManager,
+                mAuthController,
+                mDumpManager,
+                mAccessibilityManager,
+                mConfigurationController,
+                mDelayableExecutor,
+                mVibrator,
+                mAuthRippleController,
+                mResources,
+                mKosmos.getKeyguardTransitionInteractor(),
+                KeyguardInteractorFactory.create(mFeatureFlags).getKeyguardInteractor(),
+                mFeatureFlags,
+                mPrimaryBouncerInteractor,
+                mContext,
+                () -> mDeviceEntryInteractor,
+                mKosmos.getFakeSceneContainerFlags()
+        );
+    }
+
+    @After
+    public void tearDown() {
+        mStaticMockSession.finishMocking();
+    }
+
+    protected Pair<Float, Point> setupUdfps() {
+        when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(true);
+        final Point udfpsLocation = new Point(50, 75);
+        final float radius = 33f;
+        when(mAuthController.getUdfpsLocation()).thenReturn(udfpsLocation);
+        when(mAuthController.getUdfpsRadius()).thenReturn(radius);
+
+        return new Pair(radius, udfpsLocation);
+    }
+
+    protected void setupShowLockIcon() {
+        when(mKeyguardStateController.isShowing()).thenReturn(true);
+        when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(false);
+        when(mStatusBarStateController.isDozing()).thenReturn(false);
+        when(mStatusBarStateController.getDozeAmount()).thenReturn(0f);
+        when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
+        when(mKeyguardStateController.canDismissLockScreen()).thenReturn(false);
+    }
+
+    protected void captureAuthControllerCallback() {
+        verify(mAuthController).addCallback(mAuthControllerCallbackCaptor.capture());
+        mAuthControllerCallback = mAuthControllerCallbackCaptor.getValue();
+    }
+
+    protected void captureKeyguardStateCallback() {
+        verify(mKeyguardStateController).addCallback(mKeyguardStateCaptor.capture());
+        mKeyguardStateCallback = mKeyguardStateCaptor.getValue();
+    }
+
+    protected void captureStatusBarStateListener() {
+        verify(mStatusBarStateController).addCallback(mStatusBarStateCaptor.capture());
+        mStatusBarStateListener = mStatusBarStateCaptor.getValue();
+    }
+
+    protected void captureKeyguardUpdateMonitorCallback() {
+        verify(mKeyguardUpdateMonitor).registerCallback(
+                mKeyguardUpdateMonitorCallbackCaptor.capture());
+        mKeyguardUpdateMonitorCallback = mKeyguardUpdateMonitorCallbackCaptor.getValue();
+    }
+
+    protected void setupLockIconViewMocks() {
+        when(mLockIconView.getResources()).thenReturn(mResources);
+        when(mLockIconView.getContext()).thenReturn(mContext);
+    }
+
+    protected void resetLockIconView() {
+        reset(mLockIconView);
+        setupLockIconViewMocks();
+    }
+
+    protected void init(boolean useDozeMigrationFlag) {
+        mFeatureFlags.set(DOZING_MIGRATION_1, useDozeMigrationFlag);
+        mUnderTest.setLockIconView(mLockIconView);
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/LegacyLockIconViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/LegacyLockIconViewControllerTest.java
new file mode 100644
index 0000000..8689842
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/LegacyLockIconViewControllerTest.java
@@ -0,0 +1,414 @@
+/*
+ * 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.keyguard;
+
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
+
+import static com.android.keyguard.LockIconView.ICON_LOCK;
+import static com.android.keyguard.LockIconView.ICON_UNLOCK;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.graphics.Point;
+import android.hardware.biometrics.BiometricSourceType;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.util.Pair;
+import android.view.HapticFeedbackConstants;
+import android.view.View;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.biometrics.UdfpsController;
+import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
+import com.android.systemui.doze.util.BurnInHelperKt;
+import com.android.systemui.statusbar.StatusBarState;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
[email protected]
+public class LegacyLockIconViewControllerTest extends LegacyLockIconViewControllerBaseTest {
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        when(mLockIconView.isAttachedToWindow()).thenReturn(true);
+    }
+
+    @Test
+    public void testUpdateFingerprintLocationOnInit() {
+        // GIVEN fp sensor location is available pre-attached
+        Pair<Float, Point> udfps = setupUdfps(); // first = radius, second = udfps location
+
+        // WHEN lock icon view controller is initialized and attached
+        init(/* useMigrationFlag= */false);
+
+        // THEN lock icon view location is updated to the udfps location with UDFPS radius
+        verify(mLockIconView).setCenterLocation(eq(udfps.second), eq(udfps.first),
+                eq(PADDING));
+    }
+
+    @Test
+    public void testUpdatePaddingBasedOnResolutionScale() {
+        // GIVEN fp sensor location is available pre-attached & scaled resolution factor is 5
+        Pair<Float, Point> udfps = setupUdfps(); // first = radius, second = udfps location
+        when(mAuthController.getScaleFactor()).thenReturn(5f);
+
+        // WHEN lock icon view controller is initialized and attached
+        init(/* useMigrationFlag= */false);
+
+        // THEN lock icon view location is updated with the scaled radius
+        verify(mLockIconView).setCenterLocation(eq(udfps.second), eq(udfps.first),
+                eq(PADDING * 5));
+    }
+
+    @Test
+    public void testUpdateLockIconLocationOnAuthenticatorsRegistered() {
+        // GIVEN fp sensor location is not available pre-init
+        when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(false);
+        when(mAuthController.getFingerprintSensorLocation()).thenReturn(null);
+        init(/* useMigrationFlag= */false);
+        resetLockIconView(); // reset any method call counts for when we verify method calls later
+
+        // GIVEN fp sensor location is available post-attached
+        captureAuthControllerCallback();
+        Pair<Float, Point> udfps = setupUdfps();
+
+        // WHEN all authenticators are registered
+        mAuthControllerCallback.onAllAuthenticatorsRegistered(TYPE_FINGERPRINT);
+        mDelayableExecutor.runAllReady();
+
+        // THEN lock icon view location is updated with the same coordinates as auth controller vals
+        verify(mLockIconView).setCenterLocation(eq(udfps.second), eq(udfps.first),
+                eq(PADDING));
+    }
+
+    @Test
+    public void testUpdateLockIconLocationOnUdfpsLocationChanged() {
+        // GIVEN fp sensor location is not available pre-init
+        when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(false);
+        when(mAuthController.getFingerprintSensorLocation()).thenReturn(null);
+        init(/* useMigrationFlag= */false);
+        resetLockIconView(); // reset any method call counts for when we verify method calls later
+
+        // GIVEN fp sensor location is available post-attached
+        captureAuthControllerCallback();
+        Pair<Float, Point> udfps = setupUdfps();
+
+        // WHEN udfps location changes
+        mAuthControllerCallback.onUdfpsLocationChanged(new UdfpsOverlayParams());
+        mDelayableExecutor.runAllReady();
+
+        // THEN lock icon view location is updated with the same coordinates as auth controller vals
+        verify(mLockIconView).setCenterLocation(eq(udfps.second), eq(udfps.first),
+                eq(PADDING));
+    }
+
+    @Test
+    public void testLockIconViewBackgroundEnabledWhenUdfpsIsSupported() {
+        // GIVEN Udpfs sensor location is available
+        setupUdfps();
+
+        // WHEN the view is attached
+        init(/* useMigrationFlag= */false);
+
+        // THEN the lock icon view background should be enabled
+        verify(mLockIconView).setUseBackground(true);
+    }
+
+    @Test
+    public void testLockIconViewBackgroundDisabledWhenUdfpsIsNotSupported() {
+        // GIVEN Udfps sensor location is not supported
+        when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(false);
+
+        // WHEN the view is attached
+        init(/* useMigrationFlag= */false);
+
+        // THEN the lock icon view background should be disabled
+        verify(mLockIconView).setUseBackground(false);
+    }
+
+    @Test
+    public void testLockIconStartState() {
+        // GIVEN lock icon state
+        setupShowLockIcon();
+
+        // WHEN lock icon controller is initialized
+        init(/* useMigrationFlag= */false);
+
+        // THEN the lock icon should show
+        verify(mLockIconView).updateIcon(ICON_LOCK, false);
+    }
+
+    @Test
+    public void testLockIcon_updateToUnlock() {
+        // GIVEN starting state for the lock icon
+        setupShowLockIcon();
+
+        // GIVEN lock icon controller is initialized and view is attached
+        init(/* useMigrationFlag= */false);
+        captureKeyguardStateCallback();
+        reset(mLockIconView);
+
+        // WHEN the unlocked state changes to canDismissLockScreen=true
+        when(mKeyguardStateController.canDismissLockScreen()).thenReturn(true);
+        mKeyguardStateCallback.onUnlockedChanged();
+
+        // THEN the unlock should show
+        verify(mLockIconView).updateIcon(ICON_UNLOCK, false);
+    }
+
+    @Test
+    public void testLockIcon_clearsIconWhenUnlocked() {
+        // GIVEN udfps not enrolled
+        setupUdfps();
+        when(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(false);
+
+        // GIVEN starting state for the lock icon
+        setupShowLockIcon();
+        when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
+
+        // GIVEN lock icon controller is initialized and view is attached
+        init(/* useMigrationFlag= */false);
+        captureStatusBarStateListener();
+        reset(mLockIconView);
+
+        // WHEN the dozing state changes
+        mStatusBarStateListener.onDozingChanged(false /* isDozing */);
+
+        // THEN the icon is cleared
+        verify(mLockIconView).clearIcon();
+    }
+
+    @Test
+    public void testLockIcon_updateToAodLock_whenUdfpsEnrolled() {
+        // GIVEN udfps enrolled
+        setupUdfps();
+        when(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(true);
+
+        // GIVEN starting state for the lock icon
+        setupShowLockIcon();
+
+        // GIVEN lock icon controller is initialized and view is attached
+        init(/* useMigrationFlag= */false);
+        captureStatusBarStateListener();
+        reset(mLockIconView);
+
+        // WHEN the dozing state changes
+        mStatusBarStateListener.onDozingChanged(true /* isDozing */);
+
+        // THEN the AOD lock icon should show
+        verify(mLockIconView).updateIcon(ICON_LOCK, true);
+    }
+
+    @Test
+    public void testBurnInOffsetsUpdated_onDozeAmountChanged() {
+        // GIVEN udfps enrolled
+        setupUdfps();
+        when(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(true);
+
+        // GIVEN burn-in offset = 5
+        int burnInOffset = 5;
+        when(BurnInHelperKt.getBurnInOffset(anyInt(), anyBoolean())).thenReturn(burnInOffset);
+
+        // GIVEN starting state for the lock icon (keyguard)
+        setupShowLockIcon();
+        init(/* useMigrationFlag= */false);
+        captureStatusBarStateListener();
+        reset(mLockIconView);
+
+        // WHEN dozing updates
+        mStatusBarStateListener.onDozingChanged(true /* isDozing */);
+        mStatusBarStateListener.onDozeAmountChanged(1f, 1f);
+
+        // THEN the view's translation is updated to use the AoD burn-in offsets
+        verify(mLockIconView).setTranslationY(burnInOffset);
+        verify(mLockIconView).setTranslationX(burnInOffset);
+        reset(mLockIconView);
+
+        // WHEN the device is no longer dozing
+        mStatusBarStateListener.onDozingChanged(false /* isDozing */);
+        mStatusBarStateListener.onDozeAmountChanged(0f, 0f);
+
+        // THEN the view is updated to NO translation (no burn-in offsets anymore)
+        verify(mLockIconView).setTranslationY(0);
+        verify(mLockIconView).setTranslationX(0);
+    }
+
+    @Test
+    public void lockIconShows_afterUnlockStateChanges() {
+        // GIVEN lock icon controller is initialized and view is attached
+        init(/* useMigrationFlag= */false);
+        captureKeyguardStateCallback();
+        captureKeyguardUpdateMonitorCallback();
+
+        // GIVEN user has unlocked with a biometric auth (ie: face auth)
+        // and biometric running state changes
+        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
+        mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
+                BiometricSourceType.FACE);
+        reset(mLockIconView);
+
+        // WHEN the unlocked state changes
+        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
+        mKeyguardStateCallback.onUnlockedChanged();
+
+        // THEN the lock icon is shown
+        verify(mLockIconView).setContentDescription(LOCKED_LABEL);
+    }
+
+    @Test
+    public void lockIconAccessibility_notVisibleToUser() {
+        // GIVEN lock icon controller is initialized and view is attached
+        init(/* useMigrationFlag= */false);
+        captureKeyguardStateCallback();
+        captureKeyguardUpdateMonitorCallback();
+
+        // GIVEN user has unlocked with a biometric auth (ie: face auth)
+        // and biometric running state changes
+        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
+        mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
+                BiometricSourceType.FACE);
+        reset(mLockIconView);
+        when(mLockIconView.isVisibleToUser()).thenReturn(false);
+
+        // WHEN the unlocked state changes
+        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
+        mKeyguardStateCallback.onUnlockedChanged();
+
+        // THEN the lock icon is shown
+        verify(mLockIconView).setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
+    }
+
+    @Test
+    public void lockIconAccessibility_bouncerAnimatingAway() {
+        // GIVEN lock icon controller is initialized and view is attached
+        init(/* useMigrationFlag= */false);
+        captureKeyguardStateCallback();
+        captureKeyguardUpdateMonitorCallback();
+
+        // GIVEN user has unlocked with a biometric auth (ie: face auth)
+        // and biometric running state changes
+        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
+        mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
+                BiometricSourceType.FACE);
+        reset(mLockIconView);
+        when(mLockIconView.isVisibleToUser()).thenReturn(true);
+        when(mPrimaryBouncerInteractor.isAnimatingAway()).thenReturn(true);
+
+        // WHEN the unlocked state changes
+        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
+        mKeyguardStateCallback.onUnlockedChanged();
+
+        // THEN the lock icon is shown
+        verify(mLockIconView).setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
+    }
+
+    @Test
+    public void lockIconAccessibility_bouncerNotAnimatingAway_viewVisible() {
+        // GIVEN lock icon controller is initialized and view is attached
+        init(/* useMigrationFlag= */false);
+        captureKeyguardStateCallback();
+        captureKeyguardUpdateMonitorCallback();
+
+        // GIVEN user has unlocked with a biometric auth (ie: face auth)
+        // and biometric running state changes
+        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
+        mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
+                BiometricSourceType.FACE);
+        reset(mLockIconView);
+        when(mLockIconView.isVisibleToUser()).thenReturn(true);
+        when(mPrimaryBouncerInteractor.isAnimatingAway()).thenReturn(false);
+
+        // WHEN the unlocked state changes
+        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
+        mKeyguardStateCallback.onUnlockedChanged();
+
+        // THEN the lock icon is shown
+        verify(mLockIconView).setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
+    }
+
+    @Test
+    public void playHaptic_onTouchExploration_performHapticFeedback() {
+       // WHEN request to vibrate on touch exploration
+        mUnderTest.vibrateOnTouchExploration();
+
+        // THEN performHapticFeedback is used
+        verify(mVibrator).performHapticFeedback(any(), eq(HapticFeedbackConstants.CONTEXT_CLICK));
+    }
+
+    @Test
+    public void playHaptic_onLongPress_performHapticFeedback() {
+        // WHEN request to vibrate on long press
+        mUnderTest.vibrateOnLongPress();
+
+        // THEN uses perform haptic feedback
+        verify(mVibrator).performHapticFeedback(any(), eq(UdfpsController.LONG_PRESS));
+    }
+
+    @Test
+    public void longPress_showBouncer_sceneContainerNotEnabled() {
+        init(/* useMigrationFlag= */ false);
+        mKosmos.getFakeSceneContainerFlags().setEnabled(false);
+        when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(false);
+
+        // WHEN longPress
+        mUnderTest.onLongPress();
+
+        // THEN show primary bouncer via keyguard view controller, not scene container
+        verify(mKeyguardViewController).showPrimaryBouncer(anyBoolean());
+        verify(mDeviceEntryInteractor, never()).attemptDeviceEntry();
+    }
+
+    @Test
+    public void longPress_showBouncer() {
+        init(/* useMigrationFlag= */ false);
+        mKosmos.getFakeSceneContainerFlags().setEnabled(true);
+        when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(false);
+
+        // WHEN longPress
+        mUnderTest.onLongPress();
+
+        // THEN show primary bouncer
+        verify(mKeyguardViewController, never()).showPrimaryBouncer(anyBoolean());
+        verify(mDeviceEntryInteractor).attemptDeviceEntry();
+    }
+
+    @Test
+    public void longPress_falsingTriggered_doesNotShowBouncer() {
+        init(/* useMigrationFlag= */ false);
+        mKosmos.getFakeSceneContainerFlags().setEnabled(true);
+        when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(true);
+
+        // WHEN longPress
+        mUnderTest.onLongPress();
+
+        // THEN don't show primary bouncer
+        verify(mDeviceEntryInteractor, never()).attemptDeviceEntry();
+        verify(mKeyguardViewController, never()).showPrimaryBouncer(anyBoolean());
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/LegacyLockIconViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/LegacyLockIconViewControllerWithCoroutinesTest.kt
new file mode 100644
index 0000000..25a87b8
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/LegacyLockIconViewControllerWithCoroutinesTest.kt
@@ -0,0 +1,153 @@
+/*
+ * 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.keyguard
+
+import android.testing.AndroidTestingRunner
+import android.view.View
+import androidx.test.filters.SmallTest
+import com.android.keyguard.LockIconView.ICON_LOCK
+import com.android.systemui.doze.util.getBurnInOffset
+import com.android.systemui.flags.Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED
+import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
+import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
+import com.android.systemui.keyguard.shared.model.TransitionState.FINISHED
+import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.statusbar.StatusBarState
+import com.android.systemui.util.mockito.whenever
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.anyBoolean
+import org.mockito.Mockito.anyInt
+import org.mockito.Mockito.reset
+import org.mockito.Mockito.verify
+
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+class LegacyLockIconViewControllerWithCoroutinesTest : LegacyLockIconViewControllerBaseTest() {
+
+    /** After migration, replaces LockIconViewControllerTest version */
+    @Test
+    fun testLockIcon_clearsIconWhenUnlocked() =
+        runBlocking(IMMEDIATE) {
+            // GIVEN udfps not enrolled
+            setupUdfps()
+            whenever(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(false)
+
+            // GIVEN starting state for the lock icon
+            setupShowLockIcon()
+            whenever(mStatusBarStateController.state).thenReturn(StatusBarState.SHADE)
+
+            // GIVEN lock icon controller is initialized and view is attached
+            init(/* useMigrationFlag= */ true)
+            reset(mLockIconView)
+
+            // WHEN the dozing state changes
+            mUnderTest.mIsDozingCallback.accept(false)
+            // THEN the icon is cleared
+            verify(mLockIconView).clearIcon()
+        }
+
+    /** After migration, replaces LockIconViewControllerTest version */
+    @Test
+    fun testLockIcon_updateToAodLock_whenUdfpsEnrolled() =
+        runBlocking(IMMEDIATE) {
+            // GIVEN udfps enrolled
+            setupUdfps()
+            whenever(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(true)
+
+            // GIVEN starting state for the lock icon
+            setupShowLockIcon()
+
+            // GIVEN lock icon controller is initialized and view is attached
+            init(/* useMigrationFlag= */ true)
+            reset(mLockIconView)
+
+            // WHEN the dozing state changes
+            mUnderTest.mIsDozingCallback.accept(true)
+
+            // THEN the AOD lock icon should show
+            verify(mLockIconView).updateIcon(ICON_LOCK, true)
+        }
+
+    /** After migration, replaces LockIconViewControllerTest version */
+    @Test
+    fun testBurnInOffsetsUpdated_onDozeAmountChanged() =
+        runBlocking(IMMEDIATE) {
+            // GIVEN udfps enrolled
+            setupUdfps()
+            whenever(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(true)
+
+            // GIVEN burn-in offset = 5
+            val burnInOffset = 5
+            whenever(getBurnInOffset(anyInt(), anyBoolean())).thenReturn(burnInOffset)
+
+            // GIVEN starting state for the lock icon (keyguard)
+            setupShowLockIcon()
+            init(/* useMigrationFlag= */ true)
+            reset(mLockIconView)
+
+            // WHEN dozing updates
+            mUnderTest.mIsDozingCallback.accept(true)
+            mUnderTest.mDozeTransitionCallback.accept(TransitionStep(LOCKSCREEN, AOD, 1f, FINISHED))
+
+            // THEN the view's translation is updated to use the AoD burn-in offsets
+            verify(mLockIconView).setTranslationY(burnInOffset.toFloat())
+            verify(mLockIconView).setTranslationX(burnInOffset.toFloat())
+            reset(mLockIconView)
+
+            // WHEN the device is no longer dozing
+            mUnderTest.mIsDozingCallback.accept(false)
+            mUnderTest.mDozeTransitionCallback.accept(TransitionStep(AOD, LOCKSCREEN, 0f, FINISHED))
+
+            // THEN the view is updated to NO translation (no burn-in offsets anymore)
+            verify(mLockIconView).setTranslationY(0f)
+            verify(mLockIconView).setTranslationX(0f)
+        }
+
+    @Test
+    fun testHideLockIconView_onLockscreenHostedDreamStateChanged() =
+        runBlocking(IMMEDIATE) {
+            // GIVEN starting state for the lock icon (keyguard) and wallpaper dream enabled
+            mFeatureFlags.set(LOCKSCREEN_WALLPAPER_DREAM_ENABLED, true)
+            setupShowLockIcon()
+            init(/* useMigrationFlag= */ true)
+            reset(mLockIconView)
+
+            // WHEN dream starts
+            mUnderTest.mIsActiveDreamLockscreenHostedCallback.accept(
+                true /* isActiveDreamLockscreenHosted */
+            )
+
+            // THEN the lock icon is hidden
+            verify(mLockIconView).visibility = View.INVISIBLE
+            reset(mLockIconView)
+
+            // WHEN the device is no longer dreaming
+            mUnderTest.mIsActiveDreamLockscreenHostedCallback.accept(
+                false /* isActiveDreamLockscreenHosted */
+            )
+
+            // THEN lock icon is visible
+            verify(mLockIconView).visibility = View.VISIBLE
+        }
+
+    companion object {
+        private val IMMEDIATE = Dispatchers.Main.immediate
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerBaseTest.java
deleted file mode 100644
index 1c77351..0000000
--- a/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerBaseTest.java
+++ /dev/null
@@ -1,239 +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.keyguard;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.systemui.flags.Flags.DOZING_MIGRATION_1;
-import static com.android.systemui.flags.Flags.LOCKSCREEN_ENABLE_LANDSCAPE;
-import static com.android.systemui.flags.Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED;
-
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.graphics.drawable.AnimatedStateListDrawable;
-import android.util.Pair;
-import android.view.View;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityManager;
-
-import com.android.systemui.Flags;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.biometrics.AuthController;
-import com.android.systemui.biometrics.AuthRippleController;
-import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor;
-import com.android.systemui.doze.util.BurnInHelperKt;
-import com.android.systemui.dump.DumpManager;
-import com.android.systemui.flags.FakeFeatureFlags;
-import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory;
-import com.android.systemui.kosmos.KosmosJavaAdapter;
-import com.android.systemui.plugins.FalsingManager;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.res.R;
-import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.statusbar.VibratorHelper;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.util.concurrency.FakeExecutor;
-import com.android.systemui.util.time.FakeSystemClock;
-
-import org.junit.After;
-import org.junit.Before;
-import org.mockito.Answers;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-
-public class LockIconViewControllerBaseTest extends SysuiTestCase {
-    protected static final String UNLOCKED_LABEL = "unlocked";
-    protected static final String LOCKED_LABEL = "locked";
-    protected static final int PADDING = 10;
-
-    protected MockitoSession mStaticMockSession;
-
-    protected final KosmosJavaAdapter mKosmos = new KosmosJavaAdapter(this);
-    protected @Mock DeviceEntryInteractor mDeviceEntryInteractor;
-    protected @Mock LockIconView mLockIconView;
-    protected @Mock AnimatedStateListDrawable mIconDrawable;
-    protected @Mock Context mContext;
-    protected @Mock Resources mResources;
-    protected @Mock(answer = Answers.RETURNS_DEEP_STUBS) WindowManager mWindowManager;
-    protected @Mock StatusBarStateController mStatusBarStateController;
-    protected @Mock KeyguardUpdateMonitor mKeyguardUpdateMonitor;
-    protected @Mock KeyguardViewController mKeyguardViewController;
-    protected @Mock KeyguardStateController mKeyguardStateController;
-    protected @Mock FalsingManager mFalsingManager;
-    protected @Mock AuthController mAuthController;
-    protected @Mock DumpManager mDumpManager;
-    protected @Mock AccessibilityManager mAccessibilityManager;
-    protected @Mock ConfigurationController mConfigurationController;
-    protected @Mock VibratorHelper mVibrator;
-    protected @Mock AuthRippleController mAuthRippleController;
-    protected FakeExecutor mDelayableExecutor = new FakeExecutor(new FakeSystemClock());
-    protected FakeFeatureFlags mFeatureFlags;
-
-    protected @Mock PrimaryBouncerInteractor mPrimaryBouncerInteractor;
-
-    protected LockIconViewController mUnderTest;
-
-    // Capture listeners so that they can be used to send events
-    @Captor protected ArgumentCaptor<View.OnAttachStateChangeListener> mAttachCaptor =
-            ArgumentCaptor.forClass(View.OnAttachStateChangeListener.class);
-
-    @Captor protected ArgumentCaptor<KeyguardStateController.Callback> mKeyguardStateCaptor =
-            ArgumentCaptor.forClass(KeyguardStateController.Callback.class);
-    protected KeyguardStateController.Callback mKeyguardStateCallback;
-
-    @Captor protected ArgumentCaptor<StatusBarStateController.StateListener> mStatusBarStateCaptor =
-            ArgumentCaptor.forClass(StatusBarStateController.StateListener.class);
-    protected StatusBarStateController.StateListener mStatusBarStateListener;
-
-    @Captor protected ArgumentCaptor<AuthController.Callback> mAuthControllerCallbackCaptor;
-    protected AuthController.Callback mAuthControllerCallback;
-
-    @Captor protected ArgumentCaptor<KeyguardUpdateMonitorCallback>
-            mKeyguardUpdateMonitorCallbackCaptor =
-            ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback.class);
-    protected KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback;
-
-    @Captor protected ArgumentCaptor<Point> mPointCaptor;
-
-    @Before
-    public void setUp() throws Exception {
-        mStaticMockSession = mockitoSession()
-                .mockStatic(BurnInHelperKt.class)
-                .strictness(Strictness.LENIENT)
-                .startMocking();
-        MockitoAnnotations.initMocks(this);
-
-        setupLockIconViewMocks();
-        when(mContext.getResources()).thenReturn(mResources);
-        when(mContext.getSystemService(WindowManager.class)).thenReturn(mWindowManager);
-        Rect windowBounds = new Rect(0, 0, 800, 1200);
-        when(mWindowManager.getCurrentWindowMetrics().getBounds()).thenReturn(windowBounds);
-        when(mResources.getString(R.string.accessibility_unlock_button)).thenReturn(UNLOCKED_LABEL);
-        when(mResources.getString(R.string.accessibility_lock_icon)).thenReturn(LOCKED_LABEL);
-        when(mResources.getDrawable(anyInt(), any())).thenReturn(mIconDrawable);
-        when(mResources.getDimensionPixelSize(R.dimen.lock_icon_padding)).thenReturn(PADDING);
-        when(mAuthController.getScaleFactor()).thenReturn(1f);
-
-        when(mKeyguardStateController.isShowing()).thenReturn(true);
-        when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(false);
-        when(mStatusBarStateController.isDozing()).thenReturn(false);
-        when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
-
-        mSetFlagsRule.disableFlags(Flags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR);
-        mSetFlagsRule.disableFlags(Flags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT);
-
-        mFeatureFlags = new FakeFeatureFlags();
-        mFeatureFlags.set(LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false);
-        mFeatureFlags.set(LOCKSCREEN_ENABLE_LANDSCAPE, false);
-
-        mUnderTest = new LockIconViewController(
-                mStatusBarStateController,
-                mKeyguardUpdateMonitor,
-                mKeyguardViewController,
-                mKeyguardStateController,
-                mFalsingManager,
-                mAuthController,
-                mDumpManager,
-                mAccessibilityManager,
-                mConfigurationController,
-                mDelayableExecutor,
-                mVibrator,
-                mAuthRippleController,
-                mResources,
-                mKosmos.getKeyguardTransitionInteractor(),
-                KeyguardInteractorFactory.create(mFeatureFlags).getKeyguardInteractor(),
-                mFeatureFlags,
-                mPrimaryBouncerInteractor,
-                mContext,
-                () -> mDeviceEntryInteractor,
-                mKosmos.getFakeSceneContainerFlags()
-        );
-    }
-
-    @After
-    public void tearDown() {
-        mStaticMockSession.finishMocking();
-    }
-
-    protected Pair<Float, Point> setupUdfps() {
-        when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(true);
-        final Point udfpsLocation = new Point(50, 75);
-        final float radius = 33f;
-        when(mAuthController.getUdfpsLocation()).thenReturn(udfpsLocation);
-        when(mAuthController.getUdfpsRadius()).thenReturn(radius);
-
-        return new Pair(radius, udfpsLocation);
-    }
-
-    protected void setupShowLockIcon() {
-        when(mKeyguardStateController.isShowing()).thenReturn(true);
-        when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(false);
-        when(mStatusBarStateController.isDozing()).thenReturn(false);
-        when(mStatusBarStateController.getDozeAmount()).thenReturn(0f);
-        when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD);
-        when(mKeyguardStateController.canDismissLockScreen()).thenReturn(false);
-    }
-
-    protected void captureAuthControllerCallback() {
-        verify(mAuthController).addCallback(mAuthControllerCallbackCaptor.capture());
-        mAuthControllerCallback = mAuthControllerCallbackCaptor.getValue();
-    }
-
-    protected void captureKeyguardStateCallback() {
-        verify(mKeyguardStateController).addCallback(mKeyguardStateCaptor.capture());
-        mKeyguardStateCallback = mKeyguardStateCaptor.getValue();
-    }
-
-    protected void captureStatusBarStateListener() {
-        verify(mStatusBarStateController).addCallback(mStatusBarStateCaptor.capture());
-        mStatusBarStateListener = mStatusBarStateCaptor.getValue();
-    }
-
-    protected void captureKeyguardUpdateMonitorCallback() {
-        verify(mKeyguardUpdateMonitor).registerCallback(
-                mKeyguardUpdateMonitorCallbackCaptor.capture());
-        mKeyguardUpdateMonitorCallback = mKeyguardUpdateMonitorCallbackCaptor.getValue();
-    }
-
-    protected void setupLockIconViewMocks() {
-        when(mLockIconView.getResources()).thenReturn(mResources);
-        when(mLockIconView.getContext()).thenReturn(mContext);
-    }
-
-    protected void resetLockIconView() {
-        reset(mLockIconView);
-        setupLockIconViewMocks();
-    }
-
-    protected void init(boolean useDozeMigrationFlag) {
-        mFeatureFlags.set(DOZING_MIGRATION_1, useDozeMigrationFlag);
-        mUnderTest.setLockIconView(mLockIconView);
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerTest.java
deleted file mode 100644
index b0887ef..0000000
--- a/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerTest.java
+++ /dev/null
@@ -1,414 +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.keyguard;
-
-import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
-
-import static com.android.keyguard.LockIconView.ICON_LOCK;
-import static com.android.keyguard.LockIconView.ICON_UNLOCK;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.anyBoolean;
-import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.graphics.Point;
-import android.hardware.biometrics.BiometricSourceType;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.util.Pair;
-import android.view.HapticFeedbackConstants;
-import android.view.View;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.biometrics.UdfpsController;
-import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
-import com.android.systemui.doze.util.BurnInHelperKt;
-import com.android.systemui.statusbar.StatusBarState;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
[email protected]
-public class LockIconViewControllerTest extends LockIconViewControllerBaseTest {
-
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        when(mLockIconView.isAttachedToWindow()).thenReturn(true);
-    }
-
-    @Test
-    public void testUpdateFingerprintLocationOnInit() {
-        // GIVEN fp sensor location is available pre-attached
-        Pair<Float, Point> udfps = setupUdfps(); // first = radius, second = udfps location
-
-        // WHEN lock icon view controller is initialized and attached
-        init(/* useMigrationFlag= */false);
-
-        // THEN lock icon view location is updated to the udfps location with UDFPS radius
-        verify(mLockIconView).setCenterLocation(eq(udfps.second), eq(udfps.first),
-                eq(PADDING));
-    }
-
-    @Test
-    public void testUpdatePaddingBasedOnResolutionScale() {
-        // GIVEN fp sensor location is available pre-attached & scaled resolution factor is 5
-        Pair<Float, Point> udfps = setupUdfps(); // first = radius, second = udfps location
-        when(mAuthController.getScaleFactor()).thenReturn(5f);
-
-        // WHEN lock icon view controller is initialized and attached
-        init(/* useMigrationFlag= */false);
-
-        // THEN lock icon view location is updated with the scaled radius
-        verify(mLockIconView).setCenterLocation(eq(udfps.second), eq(udfps.first),
-                eq(PADDING * 5));
-    }
-
-    @Test
-    public void testUpdateLockIconLocationOnAuthenticatorsRegistered() {
-        // GIVEN fp sensor location is not available pre-init
-        when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(false);
-        when(mAuthController.getFingerprintSensorLocation()).thenReturn(null);
-        init(/* useMigrationFlag= */false);
-        resetLockIconView(); // reset any method call counts for when we verify method calls later
-
-        // GIVEN fp sensor location is available post-attached
-        captureAuthControllerCallback();
-        Pair<Float, Point> udfps = setupUdfps();
-
-        // WHEN all authenticators are registered
-        mAuthControllerCallback.onAllAuthenticatorsRegistered(TYPE_FINGERPRINT);
-        mDelayableExecutor.runAllReady();
-
-        // THEN lock icon view location is updated with the same coordinates as auth controller vals
-        verify(mLockIconView).setCenterLocation(eq(udfps.second), eq(udfps.first),
-                eq(PADDING));
-    }
-
-    @Test
-    public void testUpdateLockIconLocationOnUdfpsLocationChanged() {
-        // GIVEN fp sensor location is not available pre-init
-        when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(false);
-        when(mAuthController.getFingerprintSensorLocation()).thenReturn(null);
-        init(/* useMigrationFlag= */false);
-        resetLockIconView(); // reset any method call counts for when we verify method calls later
-
-        // GIVEN fp sensor location is available post-attached
-        captureAuthControllerCallback();
-        Pair<Float, Point> udfps = setupUdfps();
-
-        // WHEN udfps location changes
-        mAuthControllerCallback.onUdfpsLocationChanged(new UdfpsOverlayParams());
-        mDelayableExecutor.runAllReady();
-
-        // THEN lock icon view location is updated with the same coordinates as auth controller vals
-        verify(mLockIconView).setCenterLocation(eq(udfps.second), eq(udfps.first),
-                eq(PADDING));
-    }
-
-    @Test
-    public void testLockIconViewBackgroundEnabledWhenUdfpsIsSupported() {
-        // GIVEN Udpfs sensor location is available
-        setupUdfps();
-
-        // WHEN the view is attached
-        init(/* useMigrationFlag= */false);
-
-        // THEN the lock icon view background should be enabled
-        verify(mLockIconView).setUseBackground(true);
-    }
-
-    @Test
-    public void testLockIconViewBackgroundDisabledWhenUdfpsIsNotSupported() {
-        // GIVEN Udfps sensor location is not supported
-        when(mKeyguardUpdateMonitor.isUdfpsSupported()).thenReturn(false);
-
-        // WHEN the view is attached
-        init(/* useMigrationFlag= */false);
-
-        // THEN the lock icon view background should be disabled
-        verify(mLockIconView).setUseBackground(false);
-    }
-
-    @Test
-    public void testLockIconStartState() {
-        // GIVEN lock icon state
-        setupShowLockIcon();
-
-        // WHEN lock icon controller is initialized
-        init(/* useMigrationFlag= */false);
-
-        // THEN the lock icon should show
-        verify(mLockIconView).updateIcon(ICON_LOCK, false);
-    }
-
-    @Test
-    public void testLockIcon_updateToUnlock() {
-        // GIVEN starting state for the lock icon
-        setupShowLockIcon();
-
-        // GIVEN lock icon controller is initialized and view is attached
-        init(/* useMigrationFlag= */false);
-        captureKeyguardStateCallback();
-        reset(mLockIconView);
-
-        // WHEN the unlocked state changes to canDismissLockScreen=true
-        when(mKeyguardStateController.canDismissLockScreen()).thenReturn(true);
-        mKeyguardStateCallback.onUnlockedChanged();
-
-        // THEN the unlock should show
-        verify(mLockIconView).updateIcon(ICON_UNLOCK, false);
-    }
-
-    @Test
-    public void testLockIcon_clearsIconWhenUnlocked() {
-        // GIVEN udfps not enrolled
-        setupUdfps();
-        when(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(false);
-
-        // GIVEN starting state for the lock icon
-        setupShowLockIcon();
-        when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
-
-        // GIVEN lock icon controller is initialized and view is attached
-        init(/* useMigrationFlag= */false);
-        captureStatusBarStateListener();
-        reset(mLockIconView);
-
-        // WHEN the dozing state changes
-        mStatusBarStateListener.onDozingChanged(false /* isDozing */);
-
-        // THEN the icon is cleared
-        verify(mLockIconView).clearIcon();
-    }
-
-    @Test
-    public void testLockIcon_updateToAodLock_whenUdfpsEnrolled() {
-        // GIVEN udfps enrolled
-        setupUdfps();
-        when(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(true);
-
-        // GIVEN starting state for the lock icon
-        setupShowLockIcon();
-
-        // GIVEN lock icon controller is initialized and view is attached
-        init(/* useMigrationFlag= */false);
-        captureStatusBarStateListener();
-        reset(mLockIconView);
-
-        // WHEN the dozing state changes
-        mStatusBarStateListener.onDozingChanged(true /* isDozing */);
-
-        // THEN the AOD lock icon should show
-        verify(mLockIconView).updateIcon(ICON_LOCK, true);
-    }
-
-    @Test
-    public void testBurnInOffsetsUpdated_onDozeAmountChanged() {
-        // GIVEN udfps enrolled
-        setupUdfps();
-        when(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(true);
-
-        // GIVEN burn-in offset = 5
-        int burnInOffset = 5;
-        when(BurnInHelperKt.getBurnInOffset(anyInt(), anyBoolean())).thenReturn(burnInOffset);
-
-        // GIVEN starting state for the lock icon (keyguard)
-        setupShowLockIcon();
-        init(/* useMigrationFlag= */false);
-        captureStatusBarStateListener();
-        reset(mLockIconView);
-
-        // WHEN dozing updates
-        mStatusBarStateListener.onDozingChanged(true /* isDozing */);
-        mStatusBarStateListener.onDozeAmountChanged(1f, 1f);
-
-        // THEN the view's translation is updated to use the AoD burn-in offsets
-        verify(mLockIconView).setTranslationY(burnInOffset);
-        verify(mLockIconView).setTranslationX(burnInOffset);
-        reset(mLockIconView);
-
-        // WHEN the device is no longer dozing
-        mStatusBarStateListener.onDozingChanged(false /* isDozing */);
-        mStatusBarStateListener.onDozeAmountChanged(0f, 0f);
-
-        // THEN the view is updated to NO translation (no burn-in offsets anymore)
-        verify(mLockIconView).setTranslationY(0);
-        verify(mLockIconView).setTranslationX(0);
-    }
-
-    @Test
-    public void lockIconShows_afterUnlockStateChanges() {
-        // GIVEN lock icon controller is initialized and view is attached
-        init(/* useMigrationFlag= */false);
-        captureKeyguardStateCallback();
-        captureKeyguardUpdateMonitorCallback();
-
-        // GIVEN user has unlocked with a biometric auth (ie: face auth)
-        // and biometric running state changes
-        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
-        mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
-                BiometricSourceType.FACE);
-        reset(mLockIconView);
-
-        // WHEN the unlocked state changes
-        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
-        mKeyguardStateCallback.onUnlockedChanged();
-
-        // THEN the lock icon is shown
-        verify(mLockIconView).setContentDescription(LOCKED_LABEL);
-    }
-
-    @Test
-    public void lockIconAccessibility_notVisibleToUser() {
-        // GIVEN lock icon controller is initialized and view is attached
-        init(/* useMigrationFlag= */false);
-        captureKeyguardStateCallback();
-        captureKeyguardUpdateMonitorCallback();
-
-        // GIVEN user has unlocked with a biometric auth (ie: face auth)
-        // and biometric running state changes
-        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
-        mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
-                BiometricSourceType.FACE);
-        reset(mLockIconView);
-        when(mLockIconView.isVisibleToUser()).thenReturn(false);
-
-        // WHEN the unlocked state changes
-        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
-        mKeyguardStateCallback.onUnlockedChanged();
-
-        // THEN the lock icon is shown
-        verify(mLockIconView).setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
-    }
-
-    @Test
-    public void lockIconAccessibility_bouncerAnimatingAway() {
-        // GIVEN lock icon controller is initialized and view is attached
-        init(/* useMigrationFlag= */false);
-        captureKeyguardStateCallback();
-        captureKeyguardUpdateMonitorCallback();
-
-        // GIVEN user has unlocked with a biometric auth (ie: face auth)
-        // and biometric running state changes
-        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
-        mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
-                BiometricSourceType.FACE);
-        reset(mLockIconView);
-        when(mLockIconView.isVisibleToUser()).thenReturn(true);
-        when(mPrimaryBouncerInteractor.isAnimatingAway()).thenReturn(true);
-
-        // WHEN the unlocked state changes
-        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
-        mKeyguardStateCallback.onUnlockedChanged();
-
-        // THEN the lock icon is shown
-        verify(mLockIconView).setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
-    }
-
-    @Test
-    public void lockIconAccessibility_bouncerNotAnimatingAway_viewVisible() {
-        // GIVEN lock icon controller is initialized and view is attached
-        init(/* useMigrationFlag= */false);
-        captureKeyguardStateCallback();
-        captureKeyguardUpdateMonitorCallback();
-
-        // GIVEN user has unlocked with a biometric auth (ie: face auth)
-        // and biometric running state changes
-        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
-        mKeyguardUpdateMonitorCallback.onBiometricRunningStateChanged(false,
-                BiometricSourceType.FACE);
-        reset(mLockIconView);
-        when(mLockIconView.isVisibleToUser()).thenReturn(true);
-        when(mPrimaryBouncerInteractor.isAnimatingAway()).thenReturn(false);
-
-        // WHEN the unlocked state changes
-        when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(false);
-        mKeyguardStateCallback.onUnlockedChanged();
-
-        // THEN the lock icon is shown
-        verify(mLockIconView).setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
-    }
-
-    @Test
-    public void playHaptic_onTouchExploration_performHapticFeedback() {
-       // WHEN request to vibrate on touch exploration
-        mUnderTest.vibrateOnTouchExploration();
-
-        // THEN performHapticFeedback is used
-        verify(mVibrator).performHapticFeedback(any(), eq(HapticFeedbackConstants.CONTEXT_CLICK));
-    }
-
-    @Test
-    public void playHaptic_onLongPress_performHapticFeedback() {
-        // WHEN request to vibrate on long press
-        mUnderTest.vibrateOnLongPress();
-
-        // THEN uses perform haptic feedback
-        verify(mVibrator).performHapticFeedback(any(), eq(UdfpsController.LONG_PRESS));
-    }
-
-    @Test
-    public void longPress_showBouncer_sceneContainerNotEnabled() {
-        init(/* useMigrationFlag= */ false);
-        mKosmos.getFakeSceneContainerFlags().setEnabled(false);
-        when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(false);
-
-        // WHEN longPress
-        mUnderTest.onLongPress();
-
-        // THEN show primary bouncer via keyguard view controller, not scene container
-        verify(mKeyguardViewController).showPrimaryBouncer(anyBoolean());
-        verify(mDeviceEntryInteractor, never()).attemptDeviceEntry();
-    }
-
-    @Test
-    public void longPress_showBouncer() {
-        init(/* useMigrationFlag= */ false);
-        mKosmos.getFakeSceneContainerFlags().setEnabled(true);
-        when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(false);
-
-        // WHEN longPress
-        mUnderTest.onLongPress();
-
-        // THEN show primary bouncer
-        verify(mKeyguardViewController, never()).showPrimaryBouncer(anyBoolean());
-        verify(mDeviceEntryInteractor).attemptDeviceEntry();
-    }
-
-    @Test
-    public void longPress_falsingTriggered_doesNotShowBouncer() {
-        init(/* useMigrationFlag= */ false);
-        mKosmos.getFakeSceneContainerFlags().setEnabled(true);
-        when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(true);
-
-        // WHEN longPress
-        mUnderTest.onLongPress();
-
-        // THEN don't show primary bouncer
-        verify(mDeviceEntryInteractor, never()).attemptDeviceEntry();
-        verify(mKeyguardViewController, never()).showPrimaryBouncer(anyBoolean());
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerWithCoroutinesTest.kt
deleted file mode 100644
index 1213518..0000000
--- a/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerWithCoroutinesTest.kt
+++ /dev/null
@@ -1,153 +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.keyguard
-
-import android.testing.AndroidTestingRunner
-import android.view.View
-import androidx.test.filters.SmallTest
-import com.android.keyguard.LockIconView.ICON_LOCK
-import com.android.systemui.doze.util.getBurnInOffset
-import com.android.systemui.flags.Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED
-import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
-import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
-import com.android.systemui.keyguard.shared.model.TransitionState.FINISHED
-import com.android.systemui.keyguard.shared.model.TransitionStep
-import com.android.systemui.statusbar.StatusBarState
-import com.android.systemui.util.mockito.whenever
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.runBlocking
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mockito.anyBoolean
-import org.mockito.Mockito.anyInt
-import org.mockito.Mockito.reset
-import org.mockito.Mockito.verify
-
-@RunWith(AndroidTestingRunner::class)
-@SmallTest
-class LockIconViewControllerWithCoroutinesTest : LockIconViewControllerBaseTest() {
-
-    /** After migration, replaces LockIconViewControllerTest version */
-    @Test
-    fun testLockIcon_clearsIconWhenUnlocked() =
-        runBlocking(IMMEDIATE) {
-            // GIVEN udfps not enrolled
-            setupUdfps()
-            whenever(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(false)
-
-            // GIVEN starting state for the lock icon
-            setupShowLockIcon()
-            whenever(mStatusBarStateController.state).thenReturn(StatusBarState.SHADE)
-
-            // GIVEN lock icon controller is initialized and view is attached
-            init(/* useMigrationFlag= */ true)
-            reset(mLockIconView)
-
-            // WHEN the dozing state changes
-            mUnderTest.mIsDozingCallback.accept(false)
-            // THEN the icon is cleared
-            verify(mLockIconView).clearIcon()
-        }
-
-    /** After migration, replaces LockIconViewControllerTest version */
-    @Test
-    fun testLockIcon_updateToAodLock_whenUdfpsEnrolled() =
-        runBlocking(IMMEDIATE) {
-            // GIVEN udfps enrolled
-            setupUdfps()
-            whenever(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(true)
-
-            // GIVEN starting state for the lock icon
-            setupShowLockIcon()
-
-            // GIVEN lock icon controller is initialized and view is attached
-            init(/* useMigrationFlag= */ true)
-            reset(mLockIconView)
-
-            // WHEN the dozing state changes
-            mUnderTest.mIsDozingCallback.accept(true)
-
-            // THEN the AOD lock icon should show
-            verify(mLockIconView).updateIcon(ICON_LOCK, true)
-        }
-
-    /** After migration, replaces LockIconViewControllerTest version */
-    @Test
-    fun testBurnInOffsetsUpdated_onDozeAmountChanged() =
-        runBlocking(IMMEDIATE) {
-            // GIVEN udfps enrolled
-            setupUdfps()
-            whenever(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(true)
-
-            // GIVEN burn-in offset = 5
-            val burnInOffset = 5
-            whenever(getBurnInOffset(anyInt(), anyBoolean())).thenReturn(burnInOffset)
-
-            // GIVEN starting state for the lock icon (keyguard)
-            setupShowLockIcon()
-            init(/* useMigrationFlag= */ true)
-            reset(mLockIconView)
-
-            // WHEN dozing updates
-            mUnderTest.mIsDozingCallback.accept(true)
-            mUnderTest.mDozeTransitionCallback.accept(TransitionStep(LOCKSCREEN, AOD, 1f, FINISHED))
-
-            // THEN the view's translation is updated to use the AoD burn-in offsets
-            verify(mLockIconView).setTranslationY(burnInOffset.toFloat())
-            verify(mLockIconView).setTranslationX(burnInOffset.toFloat())
-            reset(mLockIconView)
-
-            // WHEN the device is no longer dozing
-            mUnderTest.mIsDozingCallback.accept(false)
-            mUnderTest.mDozeTransitionCallback.accept(TransitionStep(AOD, LOCKSCREEN, 0f, FINISHED))
-
-            // THEN the view is updated to NO translation (no burn-in offsets anymore)
-            verify(mLockIconView).setTranslationY(0f)
-            verify(mLockIconView).setTranslationX(0f)
-        }
-
-    @Test
-    fun testHideLockIconView_onLockscreenHostedDreamStateChanged() =
-        runBlocking(IMMEDIATE) {
-            // GIVEN starting state for the lock icon (keyguard) and wallpaper dream enabled
-            mFeatureFlags.set(LOCKSCREEN_WALLPAPER_DREAM_ENABLED, true)
-            setupShowLockIcon()
-            init(/* useMigrationFlag= */ true)
-            reset(mLockIconView)
-
-            // WHEN dream starts
-            mUnderTest.mIsActiveDreamLockscreenHostedCallback.accept(
-                true /* isActiveDreamLockscreenHosted */
-            )
-
-            // THEN the lock icon is hidden
-            verify(mLockIconView).visibility = View.INVISIBLE
-            reset(mLockIconView)
-
-            // WHEN the device is no longer dreaming
-            mUnderTest.mIsActiveDreamLockscreenHostedCallback.accept(
-                false /* isActiveDreamLockscreenHosted */
-            )
-
-            // THEN lock icon is visible
-            verify(mLockIconView).visibility = View.VISIBLE
-        }
-
-    companion object {
-        private val IMMEDIATE = Dispatchers.Main.immediate
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
index c20367e..d267ad4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
@@ -1274,6 +1274,28 @@
     }
 
     @Test
+    public void delayedFaceSensorLocationChangesAddsFaceScanningOverlay() {
+        setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
+                null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
+                0 /* roundedPadding */, true /* privacyDot */, false /* faceScanning */);
+        mScreenDecorations.start();
+        verifyFaceScanningViewExists(false); // face scanning view not added yet
+
+        // WHEN the sensor location is updated
+        mFaceScanningProviders = new ArrayList<>();
+        mFaceScanningProviders.add(mFaceScanningDecorProvider);
+        when(mFaceScanningProviderFactory.getProviders()).thenReturn(mFaceScanningProviders);
+        when(mFaceScanningProviderFactory.getHasProviders()).thenReturn(true);
+        final Point location = new Point();
+        mFakeFacePropertyRepository.setSensorLocation(location);
+        mScreenDecorations.onFaceSensorLocationChanged(location);
+        mExecutor.runAllReady();
+
+        // THEN the face scanning view is added
+        verifyFaceScanningViewExists(true);
+    }
+
+    @Test
     public void testPrivacyDotShowingListenerWorkWellWithNullParameter() {
         mPrivacyDotShowingListener.onPrivacyDotShown(null);
         mPrivacyDotShowingListener.onPrivacyDotHidden(null);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/FullscreenMagnificationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/FullscreenMagnificationControllerTest.java
new file mode 100644
index 0000000..12f334b
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/FullscreenMagnificationControllerTest.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 com.android.systemui.accessibility;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.SurfaceControlViewHost;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
+import android.window.InputTransferToken;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.function.Supplier;
+
+@SmallTest
[email protected]
+@RunWith(AndroidTestingRunner.class)
+public class FullscreenMagnificationControllerTest extends SysuiTestCase {
+
+    private FullscreenMagnificationController mFullscreenMagnificationController;
+    private SurfaceControlViewHost mSurfaceControlViewHost;
+
+    @Before
+    public void setUp() {
+        getInstrumentation().runOnMainSync(() -> mSurfaceControlViewHost =
+                new SurfaceControlViewHost(mContext, mContext.getDisplay(),
+                        new InputTransferToken(), "FullscreenMagnification"));
+
+        Supplier<SurfaceControlViewHost> scvhSupplier = () -> mSurfaceControlViewHost;
+
+        mFullscreenMagnificationController = new FullscreenMagnificationController(
+                mContext,
+                mContext.getSystemService(AccessibilityManager.class),
+                mContext.getSystemService(WindowManager.class),
+                scvhSupplier);
+    }
+
+    @After
+    public void tearDown() {
+        getInstrumentation().runOnMainSync(
+                () -> mFullscreenMagnificationController
+                        .onFullscreenMagnificationActivationChanged(false));
+    }
+
+    @Test
+    public void onFullscreenMagnificationActivationChange_activated_visibleBorder() {
+        getInstrumentation().runOnMainSync(
+                () -> mFullscreenMagnificationController
+                        .onFullscreenMagnificationActivationChanged(true)
+        );
+
+        // Wait for Rects updated.
+        waitForIdleSync();
+        assertThat(mSurfaceControlViewHost.getView().isVisibleToUser()).isTrue();
+    }
+
+    @Test
+    public void onFullscreenMagnificationActivationChange_deactivated_invisibleBorder() {
+        getInstrumentation().runOnMainSync(
+                () -> {
+                    mFullscreenMagnificationController
+                            .onFullscreenMagnificationActivationChanged(true);
+                    mFullscreenMagnificationController
+                            .onFullscreenMagnificationActivationChanged(false);
+                }
+        );
+
+        assertThat(mSurfaceControlViewHost.getView()).isNull();
+    }
+
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IMagnificationConnectionTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IMagnificationConnectionTest.java
index bd49927..41d5d5d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IMagnificationConnectionTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IMagnificationConnectionTest.java
@@ -71,6 +71,8 @@
     @Mock
     private WindowMagnificationController mWindowMagnificationController;
     @Mock
+    private FullscreenMagnificationController mFullscreenMagnificationController;
+    @Mock
     private MagnificationSettingsController mMagnificationSettingsController;
     @Mock
     private ModeSwitchesController mModeSwitchesController;
@@ -105,6 +107,9 @@
         mMagnification.mWindowMagnificationControllerSupplier =
                 new FakeWindowMagnificationControllerSupplier(
                         mContext.getSystemService(DisplayManager.class));
+        mMagnification.mFullscreenMagnificationControllerSupplier =
+                new FakeFullscreenMagnificationControllerSupplier(
+                        mContext.getSystemService(DisplayManager.class));
         mMagnification.mMagnificationSettingsSupplier = new FakeSettingsSupplier(
                 mContext.getSystemService(DisplayManager.class));
 
@@ -124,6 +129,15 @@
     }
 
     @Test
+    public void onFullscreenMagnificationActivationChanged_passThrough() throws RemoteException {
+        mIMagnificationConnection.onFullscreenMagnificationActivationChanged(TEST_DISPLAY, true);
+        waitForIdleSync();
+
+        verify(mFullscreenMagnificationController)
+                .onFullscreenMagnificationActivationChanged(eq(true));
+    }
+
+    @Test
     public void disableWindowMagnification_deleteWindowMagnification() throws RemoteException {
         mIMagnificationConnection.disableWindowMagnification(TEST_DISPLAY,
                 mAnimationCallback);
@@ -215,6 +229,20 @@
         }
     }
 
+
+    private class FakeFullscreenMagnificationControllerSupplier extends
+            DisplayIdIndexSupplier<FullscreenMagnificationController> {
+
+        FakeFullscreenMagnificationControllerSupplier(DisplayManager displayManager) {
+            super(displayManager);
+        }
+
+        @Override
+        protected FullscreenMagnificationController createInstance(Display display) {
+            return mFullscreenMagnificationController;
+        }
+    }
+
     private class FakeSettingsSupplier extends
             DisplayIdIndexSupplier<MagnificationSettingsController> {
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java
index 69cd592..e076420 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java
@@ -181,7 +181,7 @@
             throws RemoteException {
         enableWindowMagnificationAndWaitAnimating(mWaitAnimationDuration, mAnimationCallback);
 
-        verify(mSpyController, atLeast(2)).enableWindowMagnificationInternal(
+        verify(mSpyController, atLeast(2)).updateWindowMagnificationInternal(
                 mScaleCaptor.capture(),
                 mCenterXCaptor.capture(), mCenterYCaptor.capture(),
                 mOffsetXCaptor.capture(), mOffsetYCaptor.capture());
@@ -220,7 +220,7 @@
                 mWaitAnimationDuration, /* targetScale= */ 1.0f,
                 DEFAULT_CENTER_X, DEFAULT_CENTER_Y, mAnimationCallback);
 
-        verify(mSpyController).enableWindowMagnificationInternal(1.0f, DEFAULT_CENTER_X,
+        verify(mSpyController).updateWindowMagnificationInternal(1.0f, DEFAULT_CENTER_X,
                 DEFAULT_CENTER_Y, 0f, 0f);
         verify(mAnimationCallback).onResult(true);
     }
@@ -244,7 +244,7 @@
             advanceTimeBy(mWaitAnimationDuration);
         });
 
-        verify(mSpyController, atLeast(2)).enableWindowMagnificationInternal(
+        verify(mSpyController, atLeast(2)).updateWindowMagnificationInternal(
                 mScaleCaptor.capture(),
                 mCenterXCaptor.capture(), mCenterYCaptor.capture(),
                 mOffsetXCaptor.capture(), mOffsetYCaptor.capture());
@@ -299,7 +299,7 @@
             advanceTimeBy(mWaitAnimationDuration);
         });
 
-        verify(mSpyController, atLeast(2)).enableWindowMagnificationInternal(
+        verify(mSpyController, atLeast(2)).updateWindowMagnificationInternal(
                 mScaleCaptor.capture(),
                 mCenterXCaptor.capture(), mCenterYCaptor.capture(),
                 mOffsetXCaptor.capture(), mOffsetYCaptor.capture());
@@ -341,7 +341,7 @@
             advanceTimeBy(mWaitAnimationDuration);
         });
 
-        verify(mSpyController, atLeast(2)).enableWindowMagnificationInternal(
+        verify(mSpyController, atLeast(2)).updateWindowMagnificationInternal(
                 mScaleCaptor.capture(),
                 mCenterXCaptor.capture(), mCenterYCaptor.capture(),
                 mOffsetXCaptor.capture(), mOffsetYCaptor.capture());
@@ -377,7 +377,7 @@
             advanceTimeBy(mWaitAnimationDuration);
         });
 
-        verify(mSpyController, atLeast(2)).enableWindowMagnificationInternal(
+        verify(mSpyController, atLeast(2)).updateWindowMagnificationInternal(
                 mScaleCaptor.capture(),
                 mCenterXCaptor.capture(), mCenterYCaptor.capture(),
                 mOffsetXCaptor.capture(), mOffsetYCaptor.capture());
@@ -439,7 +439,7 @@
         enableWindowMagnificationAndWaitAnimating(
                 mWaitAnimationDuration, Float.NaN, Float.NaN, Float.NaN, mAnimationCallback2);
 
-        verify(mSpyController, never()).enableWindowMagnificationInternal(anyFloat(), anyFloat(),
+        verify(mSpyController, never()).updateWindowMagnificationInternal(anyFloat(), anyFloat(),
                 anyFloat());
         verify(mAnimationCallback).onResult(false);
         verify(mAnimationCallback2).onResult(true);
@@ -479,7 +479,7 @@
         // Verify the method is called in
         // {@link ValueAnimator.AnimatorUpdateListener#onAnimationUpdate} once and
         // {@link Animator.AnimatorListener#onAnimationEnd} once in {@link ValueAnimator#end()}
-        verify(mSpyController, times(2)).enableWindowMagnificationInternal(
+        verify(mSpyController, times(2)).updateWindowMagnificationInternal(
                 mScaleCaptor.capture(),
                 mCenterXCaptor.capture(), mCenterYCaptor.capture(),
                 mOffsetXCaptor.capture(), mOffsetYCaptor.capture());
@@ -526,7 +526,7 @@
         enableWindowMagnificationAndWaitAnimating(mWaitAnimationDuration, Float.NaN,
                 Float.NaN, Float.NaN, mAnimationCallback2);
 
-        verify(mSpyController, never()).enableWindowMagnificationInternal(anyFloat(), anyFloat(),
+        verify(mSpyController, never()).updateWindowMagnificationInternal(anyFloat(), anyFloat(),
                 anyFloat());
         verify(mSpyController, never()).deleteWindowMagnification();
         verify(mAnimationCallback).onResult(false);
@@ -551,7 +551,7 @@
             advanceTimeBy(mWaitAnimationDuration);
         });
 
-        verify(mSpyController, atLeast(2)).enableWindowMagnificationInternal(
+        verify(mSpyController, atLeast(2)).updateWindowMagnificationInternal(
                 mScaleCaptor.capture(),
                 mCenterXCaptor.capture(), mCenterYCaptor.capture(),
                 mOffsetXCaptor.capture(), mOffsetYCaptor.capture());
@@ -720,7 +720,7 @@
 
         enableWindowMagnificationAndWaitAnimating(mWaitAnimationDuration, mAnimationCallback);
 
-        verify(mSpyController, never()).enableWindowMagnificationInternal(anyFloat(), anyFloat(),
+        verify(mSpyController, never()).updateWindowMagnificationInternal(anyFloat(), anyFloat(),
                 anyFloat());
         verify(mAnimationCallback).onResult(true);
     }
@@ -733,7 +733,7 @@
         resetMockObjects();
         deleteWindowMagnificationAndWaitAnimating(mWaitAnimationDuration, mAnimationCallback);
 
-        verify(mSpyController, atLeast(2)).enableWindowMagnificationInternal(
+        verify(mSpyController, atLeast(2)).updateWindowMagnificationInternal(
                 mScaleCaptor.capture(),
                 mCenterXCaptor.capture(), mCenterYCaptor.capture(),
                 mOffsetXCaptor.capture(), mOffsetYCaptor.capture());
@@ -790,7 +790,7 @@
         // Verify the method is called in
         // {@link ValueAnimator.AnimatorUpdateListener#onAnimationUpdate} once and
         // {@link Animator.AnimatorListener#onAnimationEnd} once in {@link ValueAnimator#end()}
-        verify(mSpyController, times(2)).enableWindowMagnificationInternal(
+        verify(mSpyController, times(2)).updateWindowMagnificationInternal(
                 mScaleCaptor.capture(),
                 mCenterXCaptor.capture(), mCenterYCaptor.capture(),
                 mOffsetXCaptor.capture(), mOffsetYCaptor.capture());
@@ -835,7 +835,7 @@
         // {@link ValueAnimator.AnimatorUpdateListener#onAnimationUpdate} once and
         // {@link Animator.AnimatorListener#onAnimationEnd} once when running the animation at
         // the final duration time.
-        verify(mSpyController, times(2)).enableWindowMagnificationInternal(
+        verify(mSpyController, times(2)).updateWindowMagnificationInternal(
                 mScaleCaptor.capture(),
                 mCenterXCaptor.capture(), mCenterYCaptor.capture(),
                 mOffsetXCaptor.capture(), mOffsetYCaptor.capture());
@@ -1040,17 +1040,17 @@
         }
 
         @Override
-        void enableWindowMagnificationInternal(float scale, float centerX, float centerY) {
-            super.enableWindowMagnificationInternal(scale, centerX, centerY);
-            mSpyController.enableWindowMagnificationInternal(scale, centerX, centerY);
+        void updateWindowMagnificationInternal(float scale, float centerX, float centerY) {
+            super.updateWindowMagnificationInternal(scale, centerX, centerY);
+            mSpyController.updateWindowMagnificationInternal(scale, centerX, centerY);
         }
 
         @Override
-        void enableWindowMagnificationInternal(float scale, float centerX, float centerY,
+        void updateWindowMagnificationInternal(float scale, float centerX, float centerY,
                 float magnificationOffsetFrameRatioX, float magnificationOffsetFrameRatioY) {
-            super.enableWindowMagnificationInternal(scale, centerX, centerY,
+            super.updateWindowMagnificationInternal(scale, centerX, centerY,
                     magnificationOffsetFrameRatioX, magnificationOffsetFrameRatioY);
-            mSpyController.enableWindowMagnificationInternal(scale, centerX, centerY,
+            mSpyController.updateWindowMagnificationInternal(scale, centerX, centerY,
                     magnificationOffsetFrameRatioX, magnificationOffsetFrameRatioY);
         }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
index f1b0c18..cb42078 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
@@ -100,6 +100,7 @@
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.res.R;
 import com.android.systemui.settings.FakeDisplayTracker;
+import com.android.systemui.util.FakeSharedPreferences;
 import com.android.systemui.util.leak.ReferenceTestUtils;
 import com.android.systemui.util.settings.SecureSettings;
 import com.android.systemui.utils.os.FakeHandler;
@@ -169,6 +170,7 @@
     private View.OnTouchListener mTouchListener;
     private MotionEventHelper mMotionEventHelper = new MotionEventHelper();
     private KosmosJavaAdapter mKosmos;
+    private FakeSharedPreferences mSharedPreferences;
 
     /**
      *  return whether window magnification is supported for current test context.
@@ -180,6 +182,7 @@
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
+        mContext = spy(mContext);
         mKosmos = new KosmosJavaAdapter(this);
         mContext = Mockito.spy(getContext());
         mHandler = new FakeHandler(TestableLooper.get(this).getLooper());
@@ -219,6 +222,10 @@
 
         mWindowMagnificationAnimationController = new WindowMagnificationAnimationController(
                 mContext, mValueAnimator);
+        mSharedPreferences = new FakeSharedPreferences();
+        when(mContext.getSharedPreferences(
+                eq("window_magnification_preferences"), anyInt()))
+                .thenReturn(mSharedPreferences);
         mWindowMagnificationController =
                 new WindowMagnificationController(
                         mContext,
@@ -249,7 +256,9 @@
     @After
     public void tearDown() {
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.deleteWindowMagnification());
+                () -> {
+                    mWindowMagnificationController.deleteWindowMagnification();
+                });
         mValueAnimator.cancel();
     }
 
@@ -264,7 +273,7 @@
     @Test
     public void enableWindowMagnification_showControlAndNotifyBoundsChanged() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -332,7 +341,7 @@
     @Test
     public void enableWindowMagnification_systemGestureExclusionRectsIsSet() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
         // Wait for Rects updated.
@@ -349,7 +358,7 @@
         mWindowManager.setWindowBounds(new Rect(0, 0, screenSize, screenSize));
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -364,7 +373,7 @@
     @Test
     public void deleteWindowMagnification_destroyControlAndUnregisterComponentCallback() {
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN,
                         Float.NaN));
 
@@ -382,7 +391,7 @@
         setSystemGestureInsets();
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     bounds.bottom);
         });
         ReferenceTestUtils.waitForCondition(this::hasMagnificationOverlapFlag);
@@ -398,7 +407,7 @@
     @Test
     public void deleteWindowMagnification_notifySourceBoundsChanged() {
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN,
                         Float.NaN));
 
@@ -414,7 +423,7 @@
     @Test
     public void moveMagnifier_schedulesFrame() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.moveWindowMagnifier(100f, 100f);
         });
@@ -497,7 +506,7 @@
     @Test
     public void setScale_enabled_expectedValueAndUpdateStateDescription() {
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(2.0f,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(2.0f,
                         Float.NaN, Float.NaN));
 
         mInstrumentation.runOnMainSync(() -> mWindowMagnificationController.setScale(3.0f));
@@ -530,7 +539,7 @@
         final float displayWidth = windowBounds.width();
         final PointF magnifiedCenter = new PointF(center, center + 5f);
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                     magnifiedCenter.x, magnifiedCenter.y);
             // Get the center again in case the center we set is out of screen.
             magnifiedCenter.set(mWindowMagnificationController.getCenterX(),
@@ -573,7 +582,7 @@
         final float expectedRatio = 0.5f;
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -600,28 +609,47 @@
     }
 
     @Test
-    public void onScreenChangedToSavedDensity_enabled_restoreSavedMagnifierWindow() {
-        mContext.getResources().getConfiguration().smallestScreenWidthDp =
+    public void onScreenSizeAndDensityChanged_enabled_restoreSavedMagnifierWindow() {
+        int newSmallestScreenWidthDp =
                 mContext.getResources().getConfiguration().smallestScreenWidthDp * 2;
         int windowFrameSize = mResources.getDimensionPixelSize(
                 com.android.internal.R.dimen.accessibility_window_magnifier_min_size);
-        mWindowMagnificationController.mWindowMagnificationSizePrefs.saveSizeForCurrentDensity(
-                new Size(windowFrameSize, windowFrameSize));
-
+        Size preferredWindowSize = new Size(windowFrameSize, windowFrameSize);
+        mSharedPreferences
+                .edit()
+                .putString(String.valueOf(newSmallestScreenWidthDp),
+                        preferredWindowSize.toString())
+                .commit();
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
+        // Change screen density and size to trigger restoring the preferred window size
+        mContext.getResources().getConfiguration().smallestScreenWidthDp = newSmallestScreenWidthDp;
+        final Rect testWindowBounds = new Rect(
+                mWindowManager.getCurrentWindowMetrics().getBounds());
+        testWindowBounds.set(testWindowBounds.left, testWindowBounds.top,
+                testWindowBounds.right + 100, testWindowBounds.bottom + 100);
+        mWindowManager.setWindowBounds(testWindowBounds);
+        mInstrumentation.runOnMainSync(() -> {
+            mWindowMagnificationController.onConfigurationChanged(ActivityInfo.CONFIG_SCREEN_SIZE);
+        });
+
+        // wait for rect update
+        waitForIdleSync();
         WindowManager.LayoutParams params = mWindowManager.getLayoutParamsFromAttachedView();
-        assertTrue(params.width == windowFrameSize);
-        assertTrue(params.height == windowFrameSize);
+        final int mirrorSurfaceMargin = mResources.getDimensionPixelSize(
+                R.dimen.magnification_mirror_surface_margin);
+        // The width and height of the view include the magnification frame and the margins.
+        assertTrue(params.width == (windowFrameSize + 2 * mirrorSurfaceMargin));
+        assertTrue(params.height == (windowFrameSize + 2 * mirrorSurfaceMargin));
     }
 
     @Test
     public void screenSizeIsChangedToLarge_enabled_defaultWindowSize() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
         final int screenSize = mWindowManager.getCurrentWindowMetrics().getBounds().width() * 10;
@@ -646,7 +674,7 @@
     @Test
     public void onDensityChanged_enabled_updateDimensionsAndResetWindowMagnification() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             Mockito.reset(mWindowManager);
             Mockito.reset(mMirrorWindowControl);
@@ -675,7 +703,7 @@
     @Test
     public void initializeA11yNode_enabled_expectedValues() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(2.5f, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(2.5f, Float.NaN,
                     Float.NaN);
         });
         final View mirrorView = mWindowManager.getAttachedView();
@@ -699,7 +727,7 @@
     public void performA11yActions_visible_expectedResults() {
         final int displayId = mContext.getDisplayId();
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(1.5f, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(1.5f, Float.NaN,
                     Float.NaN);
         });
 
@@ -733,7 +761,7 @@
     public void performA11yActions_visible_notifyAccessibilityActionPerformed() {
         final int displayId = mContext.getDisplayId();
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(2.5f, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(2.5f, Float.NaN,
                     Float.NaN);
         });
 
@@ -746,7 +774,7 @@
     @Test
     public void windowMagnifierEditMode_performA11yClickAction_exitEditMode() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
         });
@@ -784,7 +812,7 @@
                 /* pbase= */ 1);
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingWidth, startingHeight);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -824,7 +852,7 @@
                 /* pbase= */ 1);
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingWidth, startingHeight);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -860,7 +888,7 @@
         final int startingHeight = windowBounds.height();
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingWidth, startingHeight);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -880,7 +908,7 @@
         final int startingHeight = windowBounds.height();
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingWidth, startingHeight);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -903,7 +931,7 @@
                 /* base= */ 1,
                 /* pbase= */ 1);
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingSize, startingSize);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -943,7 +971,7 @@
                 /* pbase= */ 1);
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingSize, startingSize);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -979,7 +1007,7 @@
         final int startingSize = mMinWindowSize;
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingSize, startingSize);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -999,7 +1027,7 @@
         final int startingSize = mMinWindowSize;
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingSize, startingSize);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -1015,7 +1043,7 @@
     @Test
     public void enableWindowMagnification_hasA11yWindowTitle() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -1026,12 +1054,12 @@
     @Test
     public void enableWindowMagnificationWithScaleLessThanOne_enabled_disabled() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(0.9f, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(0.9f, Float.NaN,
                     Float.NaN);
         });
 
@@ -1050,7 +1078,7 @@
         final int newRotation = simulateRotateTheDevice();
 
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN, Float.NaN));
 
         assertEquals(newRotation, mWindowMagnificationController.mRotation);
@@ -1059,7 +1087,7 @@
     @Test
     public void enableWindowMagnification_registerComponentCallback() {
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN,
                         Float.NaN));
 
@@ -1070,7 +1098,7 @@
     public void onLocaleChanged_enabled_updateA11yWindowTitle() {
         final String newA11yWindowTitle = "new a11y window title";
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
         final TestableResources testableResources = getContext().getOrCreateTestableResources();
@@ -1088,7 +1116,7 @@
     @Test
     public void onSingleTap_enabled_scaleAnimates() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -1115,7 +1143,7 @@
         final Rect bounds = mWindowManager.getCurrentWindowMetrics().getBounds();
         setSystemGestureInsets();
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -1133,7 +1161,7 @@
         setSystemGestureInsets();
         mInstrumentation.runOnMainSync(
                 () -> {
-                    mWindowMagnificationController.enableWindowMagnificationInternal(
+                    mWindowMagnificationController.updateWindowMagnificationInternal(
                             Float.NaN, Float.NaN, Float.NaN);
                 });
 
@@ -1169,7 +1197,7 @@
         setSystemGestureInsets();
         mInstrumentation.runOnMainSync(
                 () -> {
-                    mWindowMagnificationController.enableWindowMagnificationInternal(
+                    mWindowMagnificationController.updateWindowMagnificationInternal(
                             Float.NaN, Float.NaN, Float.NaN);
                 });
 
@@ -1204,7 +1232,7 @@
         final int  expectedWindowHeight = minimumWindowSize;
         final int  expectedWindowWidth = minimumWindowSize;
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1231,7 +1259,7 @@
         final AtomicInteger actualWindowWidth = new AtomicInteger();
         mInstrumentation.runOnMainSync(() -> {
             mWindowMagnificationController.setWindowSize(expectedWindowWidth, expectedWindowHeight);
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                     Float.NaN, Float.NaN);
             actualWindowHeight.set(mWindowManager.getLayoutParamsFromAttachedView().height);
             actualWindowWidth.set(mWindowManager.getLayoutParamsFromAttachedView().width);
@@ -1246,7 +1274,7 @@
         final int minimumWindowSize = mResources.getDimensionPixelSize(
                 com.android.internal.R.dimen.accessibility_window_magnifier_min_size);
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1266,7 +1294,7 @@
     public void setWindowSizeLargerThanScreenSize_enabled_windowSizeIsScreenSize() {
         final Rect bounds = mWindowManager.getCurrentWindowMetrics().getBounds();
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1295,7 +1323,7 @@
 
         mInstrumentation.runOnMainSync(
                 () ->
-                        mWindowMagnificationController.enableWindowMagnificationInternal(
+                        mWindowMagnificationController.updateWindowMagnificationInternal(
                                 Float.NaN, Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1320,7 +1348,7 @@
 
         mInstrumentation.runOnMainSync(
                 () ->
-                        mWindowMagnificationController.enableWindowMagnificationInternal(
+                        mWindowMagnificationController.updateWindowMagnificationInternal(
                                 Float.NaN, Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1354,7 +1382,7 @@
 
         mInstrumentation.runOnMainSync(
                 () ->
-                        mWindowMagnificationController.enableWindowMagnificationInternal(
+                        mWindowMagnificationController.updateWindowMagnificationInternal(
                                 Float.NaN, Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1380,7 +1408,7 @@
                 com.android.internal.R.dimen.accessibility_window_magnifier_min_size);
         final Rect bounds = mWindowManager.getCurrentWindowMetrics().getBounds();
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN, Float.NaN));
 
         final AtomicInteger magnificationCenterX = new AtomicInteger();
@@ -1401,7 +1429,7 @@
         final Rect bounds = mWindowManager.getCurrentWindowMetrics().getBounds();
         mInstrumentation.runOnMainSync(
                 () -> {
-                    mWindowMagnificationController.enableWindowMagnificationInternal(
+                    mWindowMagnificationController.updateWindowMagnificationInternal(
                             1.5f, bounds.centerX(), bounds.centerY());
                 });
         View dragButton = getInternalView(R.id.drag_handle);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java
index cbdc696..a88654b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java
@@ -102,6 +102,7 @@
 import com.android.systemui.model.SysUiState;
 import com.android.systemui.res.R;
 import com.android.systemui.settings.FakeDisplayTracker;
+import com.android.systemui.util.FakeSharedPreferences;
 import com.android.systemui.util.leak.ReferenceTestUtils;
 import com.android.systemui.util.settings.SecureSettings;
 import com.android.systemui.utils.os.FakeHandler;
@@ -176,6 +177,7 @@
     // The most recently created SurfaceControlViewHost.
     private SurfaceControlViewHost mSurfaceControlViewHost;
     private KosmosJavaAdapter mKosmos;
+    private FakeSharedPreferences mSharedPreferences;
 
     /**
      *  return whether window magnification is supported for current test context.
@@ -187,6 +189,7 @@
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
+        mContext = spy(mContext);
         mKosmos = new KosmosJavaAdapter(this);
         mContext = Mockito.spy(getContext());
         mHandler = new FakeHandler(TestableLooper.get(this).getLooper());
@@ -228,6 +231,10 @@
             return mSurfaceControlViewHost;
         };
         mTransaction = spy(new SurfaceControl.Transaction());
+        mSharedPreferences = new FakeSharedPreferences();
+        when(mContext.getSharedPreferences(
+                eq("window_magnification_preferences"), anyInt()))
+                .thenReturn(mSharedPreferences);
         mWindowMagnificationController =
                 new WindowMagnificationController(
                         mContext,
@@ -258,7 +265,9 @@
     @After
     public void tearDown() {
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.deleteWindowMagnification());
+                () -> {
+                    mWindowMagnificationController.deleteWindowMagnification();
+                });
         mValueAnimator.cancel();
     }
 
@@ -273,7 +282,7 @@
     @Test
     public void enableWindowMagnification_showControlAndNotifyBoundsChanged() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -342,7 +351,7 @@
     @Test
     public void enableWindowMagnification_systemGestureExclusionRectsIsSet() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
         // Wait for Rects updated.
@@ -359,7 +368,7 @@
         mWindowManager.setWindowBounds(new Rect(0, 0, screenSize, screenSize));
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -374,7 +383,7 @@
     @Test
     public void deleteWindowMagnification_destroyControlAndUnregisterComponentCallback() {
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN,
                         Float.NaN));
 
@@ -392,7 +401,7 @@
         setSystemGestureInsets();
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     bounds.bottom);
         });
         ReferenceTestUtils.waitForCondition(this::hasMagnificationOverlapFlag);
@@ -408,7 +417,7 @@
     @Test
     public void deleteWindowMagnification_notifySourceBoundsChanged() {
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN,
                         Float.NaN));
 
@@ -424,7 +433,7 @@
     @Test
     public void moveMagnifier_schedulesFrame() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -511,7 +520,7 @@
     @Test
     public void setScale_enabled_expectedValueAndUpdateStateDescription() {
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(2.0f,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(2.0f,
                         Float.NaN, Float.NaN));
 
         mInstrumentation.runOnMainSync(() -> mWindowMagnificationController.setScale(3.0f));
@@ -544,7 +553,7 @@
         final float displayWidth = windowBounds.width();
         final PointF magnifiedCenter = new PointF(center, center + 5f);
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                     magnifiedCenter.x, magnifiedCenter.y);
             // Get the center again in case the center we set is out of screen.
             magnifiedCenter.set(mWindowMagnificationController.getCenterX(),
@@ -587,7 +596,7 @@
         final float expectedRatio = 0.5f;
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -614,28 +623,47 @@
     }
 
     @Test
-    public void onScreenChangedToSavedDensity_enabled_restoreSavedMagnifierWindow() {
-        mContext.getResources().getConfiguration().smallestScreenWidthDp =
+    public void onScreenSizeAndDensityChanged_enabled_restoreSavedMagnifierWindow() {
+        int newSmallestScreenWidthDp =
                 mContext.getResources().getConfiguration().smallestScreenWidthDp * 2;
         int windowFrameSize = mResources.getDimensionPixelSize(
                 com.android.internal.R.dimen.accessibility_window_magnifier_min_size);
-        mWindowMagnificationController.mWindowMagnificationSizePrefs.saveSizeForCurrentDensity(
-                new Size(windowFrameSize, windowFrameSize));
-
+        Size preferredWindowSize = new Size(windowFrameSize, windowFrameSize);
+        mSharedPreferences
+                .edit()
+                .putString(String.valueOf(newSmallestScreenWidthDp),
+                        preferredWindowSize.toString())
+                .commit();
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
+        // Screen density and size change
+        mContext.getResources().getConfiguration().smallestScreenWidthDp = newSmallestScreenWidthDp;
+        final Rect testWindowBounds = new Rect(
+                mWindowManager.getCurrentWindowMetrics().getBounds());
+        testWindowBounds.set(testWindowBounds.left, testWindowBounds.top,
+                testWindowBounds.right + 100, testWindowBounds.bottom + 100);
+        mWindowManager.setWindowBounds(testWindowBounds);
+        mInstrumentation.runOnMainSync(() -> {
+            mWindowMagnificationController.onConfigurationChanged(ActivityInfo.CONFIG_SCREEN_SIZE);
+        });
+
+        // wait for rect update
+        waitForIdleSync();
         ViewGroup.LayoutParams params = mSurfaceControlViewHost.getView().getLayoutParams();
-        assertTrue(params.width == windowFrameSize);
-        assertTrue(params.height == windowFrameSize);
+        final int mirrorSurfaceMargin = mResources.getDimensionPixelSize(
+                R.dimen.magnification_mirror_surface_margin);
+        // The width and height of the view include the magnification frame and the margins.
+        assertTrue(params.width == (windowFrameSize + 2 * mirrorSurfaceMargin));
+        assertTrue(params.height == (windowFrameSize + 2 * mirrorSurfaceMargin));
     }
 
     @Test
     public void screenSizeIsChangedToLarge_enabled_defaultWindowSize() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
         final int screenSize = mWindowManager.getCurrentWindowMetrics().getBounds().width() * 10;
@@ -660,7 +688,7 @@
     @Test
     public void onDensityChanged_enabled_updateDimensionsAndResetWindowMagnification() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             Mockito.reset(mWindowManager);
             Mockito.reset(mMirrorWindowControl);
@@ -689,7 +717,7 @@
     @Test
     public void initializeA11yNode_enabled_expectedValues() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(2.5f, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(2.5f, Float.NaN,
                     Float.NaN);
         });
         final View mirrorView = mSurfaceControlViewHost.getView();
@@ -713,7 +741,7 @@
     public void performA11yActions_visible_expectedResults() {
         final int displayId = mContext.getDisplayId();
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(1.5f, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(1.5f, Float.NaN,
                     Float.NaN);
         });
 
@@ -747,7 +775,7 @@
     public void performA11yActions_visible_notifyAccessibilityActionPerformed() {
         final int displayId = mContext.getDisplayId();
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(2.5f, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(2.5f, Float.NaN,
                     Float.NaN);
         });
 
@@ -760,7 +788,7 @@
     @Test
     public void windowMagnifierEditMode_performA11yClickAction_exitEditMode() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
         });
@@ -801,7 +829,7 @@
                 /* pbase= */ 1);
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingWidth, startingHeight);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -843,7 +871,7 @@
                 /* pbase= */ 1);
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingWidth, startingHeight);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -881,7 +909,7 @@
         final int startingHeight = windowBounds.height();
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingWidth, startingHeight);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -901,7 +929,7 @@
         final int startingHeight = windowBounds.height();
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingWidth, startingHeight);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -924,7 +952,7 @@
                 /* base= */ 1,
                 /* pbase= */ 1);
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingSize, startingSize);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -966,7 +994,7 @@
                 /* pbase= */ 1);
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingSize, startingSize);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -1004,7 +1032,7 @@
         final int startingSize = mMinWindowSize;
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingSize, startingSize);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -1024,7 +1052,7 @@
         final int startingSize = mMinWindowSize;
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
             mWindowMagnificationController.setWindowSize(startingSize, startingSize);
             mWindowMagnificationController.setEditMagnifierSizeMode(true);
@@ -1040,7 +1068,7 @@
     @Test
     public void enableWindowMagnification_hasA11yWindowTitle() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -1051,12 +1079,12 @@
     @Test
     public void enableWindowMagnificationWithScaleLessThanOne_enabled_disabled() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(0.9f, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(0.9f, Float.NaN,
                     Float.NaN);
         });
 
@@ -1075,7 +1103,7 @@
         final int newRotation = simulateRotateTheDevice();
 
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN, Float.NaN));
 
         assertEquals(newRotation, mWindowMagnificationController.mRotation);
@@ -1084,7 +1112,7 @@
     @Test
     public void enableWindowMagnification_registerComponentCallback() {
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN,
                         Float.NaN));
 
@@ -1095,7 +1123,7 @@
     public void onLocaleChanged_enabled_updateA11yWindowTitle() {
         final String newA11yWindowTitle = "new a11y window title";
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
         final TestableResources testableResources = getContext().getOrCreateTestableResources();
@@ -1113,7 +1141,7 @@
     @Test
     public void onSingleTap_enabled_scaleAnimates() {
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -1140,7 +1168,7 @@
         final Rect bounds = mWindowManager.getCurrentWindowMetrics().getBounds();
         setSystemGestureInsets();
         mInstrumentation.runOnMainSync(() -> {
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN, Float.NaN,
                     Float.NaN);
         });
 
@@ -1158,7 +1186,7 @@
         setSystemGestureInsets();
         mInstrumentation.runOnMainSync(
                 () -> {
-                    mWindowMagnificationController.enableWindowMagnificationInternal(
+                    mWindowMagnificationController.updateWindowMagnificationInternal(
                             Float.NaN, Float.NaN, Float.NaN);
                 });
         // Wait for Region updated.
@@ -1187,7 +1215,7 @@
         setSystemGestureInsets();
         mInstrumentation.runOnMainSync(
                 () -> {
-                    mWindowMagnificationController.enableWindowMagnificationInternal(
+                    mWindowMagnificationController.updateWindowMagnificationInternal(
                             Float.NaN, Float.NaN, Float.NaN);
                 });
         // Wait for Region updated.
@@ -1216,7 +1244,7 @@
         final int  expectedWindowHeight = minimumWindowSize;
         final int  expectedWindowWidth = minimumWindowSize;
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1243,7 +1271,7 @@
         final AtomicInteger actualWindowWidth = new AtomicInteger();
         mInstrumentation.runOnMainSync(() -> {
             mWindowMagnificationController.setWindowSize(expectedWindowWidth, expectedWindowHeight);
-            mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+            mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                     Float.NaN, Float.NaN);
             actualWindowHeight.set(mSurfaceControlViewHost.getView().getLayoutParams().height);
             actualWindowWidth.set(mSurfaceControlViewHost.getView().getLayoutParams().width);
@@ -1258,7 +1286,7 @@
         final int minimumWindowSize = mResources.getDimensionPixelSize(
                 com.android.internal.R.dimen.accessibility_window_magnifier_min_size);
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1278,7 +1306,7 @@
     public void setWindowSizeLargerThanScreenSize_enabled_windowSizeIsScreenSize() {
         final Rect bounds = mWindowManager.getCurrentWindowMetrics().getBounds();
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1307,7 +1335,7 @@
 
         mInstrumentation.runOnMainSync(
                 () ->
-                        mWindowMagnificationController.enableWindowMagnificationInternal(
+                        mWindowMagnificationController.updateWindowMagnificationInternal(
                                 Float.NaN, Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1334,7 +1362,7 @@
 
         mInstrumentation.runOnMainSync(
                 () ->
-                        mWindowMagnificationController.enableWindowMagnificationInternal(
+                        mWindowMagnificationController.updateWindowMagnificationInternal(
                                 Float.NaN, Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1370,7 +1398,7 @@
 
         mInstrumentation.runOnMainSync(
                 () ->
-                        mWindowMagnificationController.enableWindowMagnificationInternal(
+                        mWindowMagnificationController.updateWindowMagnificationInternal(
                                 Float.NaN, Float.NaN, Float.NaN));
 
         final AtomicInteger actualWindowHeight = new AtomicInteger();
@@ -1398,7 +1426,7 @@
                 com.android.internal.R.dimen.accessibility_window_magnifier_min_size);
         final Rect bounds = mWindowManager.getCurrentWindowMetrics().getBounds();
         mInstrumentation.runOnMainSync(
-                () -> mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN,
+                () -> mWindowMagnificationController.updateWindowMagnificationInternal(Float.NaN,
                         Float.NaN, Float.NaN));
 
         final AtomicInteger magnificationCenterX = new AtomicInteger();
@@ -1419,7 +1447,7 @@
         final Rect bounds = mWindowManager.getCurrentWindowMetrics().getBounds();
         mInstrumentation.runOnMainSync(
                 () -> {
-                    mWindowMagnificationController.enableWindowMagnificationInternal(
+                    mWindowMagnificationController.updateWindowMagnificationInternal(
                             1.5f, bounds.centerX(), bounds.centerY());
                 });
         View dragButton = getInternalView(R.id.drag_handle);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSizePrefsTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSizePrefsTest.java
index 04b0d70..b843fda 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSizePrefsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSizePrefsTest.java
@@ -18,13 +18,20 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.util.Size;
 
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.util.FakeSharedPreferences;
 
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -33,8 +40,18 @@
 @TestableLooper.RunWithLooper
 public class WindowMagnificationSizePrefsTest extends SysuiTestCase {
 
-    WindowMagnificationSizePrefs mWindowMagnificationSizePrefs =
-            new WindowMagnificationSizePrefs(mContext);
+    WindowMagnificationSizePrefs mWindowMagnificationSizePrefs;
+    FakeSharedPreferences mSharedPreferences;
+
+    @Before
+    public void setUp() {
+        mContext = spy(mContext);
+        mSharedPreferences = new FakeSharedPreferences();
+        when(mContext.getSharedPreferences(
+                eq("window_magnification_preferences"), anyInt()))
+                .thenReturn(mSharedPreferences);
+        mWindowMagnificationSizePrefs = new WindowMagnificationSizePrefs(mContext);
+    }
 
     @Test
     public void saveSizeForCurrentDensity_getExpectedSize() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java
index de696f4..05d7560 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java
@@ -165,7 +165,7 @@
         mMenuView = spy(
                 new MenuView(mSpyContext, mMenuViewModel, menuViewAppearance, mSecureSettings));
         // Ensure tests don't actually update metrics.
-        doNothing().when(mMenuView).incrementTexMetric(any(), anyInt());
+        doNothing().when(mMenuView).incrementTexMetric(any());
 
         mMenuViewLayer = spy(new MenuViewLayer(mSpyContext, mStubWindowManager,
                 mStubAccessibilityManager, mMenuViewModel, menuViewAppearance, mMenuView,
@@ -232,7 +232,7 @@
         final List<String> stubShortcutTargets = new ArrayList<>();
         stubShortcutTargets.add(TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString());
         when(mStubAccessibilityManager.getAccessibilityShortcutTargets(
-                AccessibilityManager.ACCESSIBILITY_BUTTON)).thenReturn(stubShortcutTargets);
+                ShortcutConstants.UserShortcutType.SOFTWARE)).thenReturn(stubShortcutTargets);
 
         mMenuViewLayer.mDismissMenuAction.run();
 
@@ -271,7 +271,7 @@
         final List<String> stubShortcutTargets = new ArrayList<>();
         stubShortcutTargets.add(TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString());
         when(mStubAccessibilityManager.getAccessibilityShortcutTargets(
-                AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY)).thenReturn(stubShortcutTargets);
+                ShortcutConstants.UserShortcutType.HARDWARE)).thenReturn(stubShortcutTargets);
 
         mMenuViewLayer.mDismissMenuAction.run();
         final String value = Settings.Secure.getString(mSpyContext.getContentResolver(),
@@ -414,40 +414,32 @@
     @Test
     @EnableFlags(Flags.FLAG_FLOATING_MENU_DRAG_TO_EDIT)
     public void onDismissAction_incrementsTexMetricDismiss() {
-        int uid1 = 1234, uid2 = 5678;
         mMenuViewModel.onTargetFeaturesChanged(
-                List.of(new TestAccessibilityTarget(mSpyContext, uid1),
-                        new TestAccessibilityTarget(mSpyContext, uid2)));
+                List.of(new TestAccessibilityTarget(mSpyContext, 1234),
+                        new TestAccessibilityTarget(mSpyContext, 5678)));
 
         mMenuViewLayer.dispatchAccessibilityAction(R.id.action_remove_menu);
 
-        ArgumentCaptor<Integer> uidCaptor = ArgumentCaptor.forClass(Integer.class);
-        verify(mMenuView, times(2)).incrementTexMetric(eq(MenuViewLayer.TEX_METRIC_DISMISS),
-                uidCaptor.capture());
-        assertThat(uidCaptor.getAllValues()).containsExactly(uid1, uid2);
+        verify(mMenuView, times(1)).incrementTexMetric(eq(MenuViewLayer.TEX_METRIC_DISMISS));
     }
 
     @Test
     @EnableFlags(Flags.FLAG_FLOATING_MENU_DRAG_TO_EDIT)
     public void onEditAction_incrementsTexMetricEdit() {
-        int uid1 = 1234, uid2 = 5678;
         mMenuViewModel.onTargetFeaturesChanged(
-                List.of(new TestAccessibilityTarget(mSpyContext, uid1),
-                        new TestAccessibilityTarget(mSpyContext, uid2)));
+                List.of(new TestAccessibilityTarget(mSpyContext, 1234),
+                        new TestAccessibilityTarget(mSpyContext, 5678)));
 
         mMenuViewLayer.dispatchAccessibilityAction(R.id.action_edit);
 
-        ArgumentCaptor<Integer> uidCaptor = ArgumentCaptor.forClass(Integer.class);
-        verify(mMenuView, times(2)).incrementTexMetric(eq(MenuViewLayer.TEX_METRIC_EDIT),
-                uidCaptor.capture());
-        assertThat(uidCaptor.getAllValues()).containsExactly(uid1, uid2);
+        verify(mMenuView, times(1)).incrementTexMetric(eq(MenuViewLayer.TEX_METRIC_EDIT));
     }
 
     /** Simplified AccessibilityTarget for testing MenuViewLayer. */
     private static class TestAccessibilityTarget extends AccessibilityTarget {
         TestAccessibilityTarget(Context context, int uid) {
             // Set fields unused by tests to defaults that allow test compilation.
-            super(context, AccessibilityManager.ACCESSIBILITY_BUTTON, 0, false,
+            super(context, ShortcutConstants.UserShortcutType.SOFTWARE, 0, false,
                     TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString(), uid, null, null, null);
         }
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegateTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegateTest.java
new file mode 100644
index 0000000..1576457
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegateTest.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.hearingaid;
+
+import static com.android.systemui.statusbar.phone.SystemUIDialog.DEFAULT_DISMISS_ON_DEVICE_LOCK;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Intent;
+import android.media.AudioManager;
+import android.os.Handler;
+import android.provider.Settings;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.View;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.settingslib.bluetooth.BluetoothEventManager;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.DialogTransitionAnimator;
+import com.android.systemui.bluetooth.qsdialog.DeviceItem;
+import com.android.systemui.bluetooth.qsdialog.DeviceItemType;
+import com.android.systemui.model.SysUiState;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.res.R;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
+import com.android.systemui.statusbar.phone.SystemUIDialogManager;
+
+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.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Tests for {@link HearingDevicesDialogDelegate}. */
+@RunWith(AndroidTestingRunner.class)
[email protected](setAsMainLooper = true)
+@SmallTest
+public class HearingDevicesDialogDelegateTest extends SysuiTestCase {
+    @Rule
+    public MockitoRule mockito = MockitoJUnit.rule();
+
+    private static final String DEVICE_ADDRESS = "AA:BB:CC:DD:EE:FF";
+
+    @Mock
+    private SystemUIDialog.Factory mSystemUIDialogFactory;
+    @Mock
+    private SystemUIDialogManager mSystemUIDialogManager;
+    @Mock
+    private SysUiState mSysUiState;
+    @Mock
+    private DialogTransitionAnimator mDialogTransitionAnimator;
+    @Mock
+    private ActivityStarter mActivityStarter;
+    @Mock
+    private LocalBluetoothManager mLocalBluetoothManager;
+    @Mock
+    private LocalBluetoothAdapter mLocalBluetoothAdapter;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
+    @Mock
+    private BluetoothEventManager mBluetoothEventManager;
+    @Mock
+    private AudioManager mAudioManager;
+    @Mock
+    private CachedBluetoothDevice mCachedDevice;
+    @Mock
+    private DeviceItem mHearingDeviceItem;
+    private SystemUIDialog mDialog;
+    private HearingDevicesDialogDelegate mDialogDelegate;
+    private TestableLooper mTestableLooper;
+    private final List<CachedBluetoothDevice> mDevices = new ArrayList<>();
+
+    @Before
+    public void setUp() {
+        mTestableLooper = TestableLooper.get(this);
+        when(mLocalBluetoothManager.getBluetoothAdapter()).thenReturn(mLocalBluetoothAdapter);
+        when(mLocalBluetoothAdapter.isEnabled()).thenReturn(true);
+        when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager);
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(mDevices);
+        when(mLocalBluetoothManager.getEventManager()).thenReturn(mBluetoothEventManager);
+        when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState);
+        when(mCachedDevice.getAddress()).thenReturn(DEVICE_ADDRESS);
+        when(mHearingDeviceItem.getCachedBluetoothDevice()).thenReturn(mCachedDevice);
+
+        setUpPairNewDeviceDialog();
+
+        when(mSystemUIDialogFactory.create(any(SystemUIDialog.Delegate.class)))
+                .thenReturn(mDialog);
+    }
+
+    @Test
+    public void createDialog_dialogShown() {
+        assertThat(mDialogDelegate.createDialog()).isEqualTo(mDialog);
+    }
+
+    @Test
+    public void clickPairNewDeviceButton_intentActionMatch() {
+        mDialog.show();
+
+        getPairNewDeviceButton(mDialog).performClick();
+
+        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mActivityStarter).postStartActivityDismissingKeyguard(intentCaptor.capture(),
+                anyInt(), any());
+        assertThat(intentCaptor.getValue().getAction()).isEqualTo(
+                Settings.ACTION_HEARING_DEVICE_PAIRING_SETTINGS);
+    }
+
+    @Test
+    public void onDeviceItemGearClicked_intentActionMatch() {
+        setUpDeviceListDialog();
+
+        mDialogDelegate.onDeviceItemGearClicked(mHearingDeviceItem, new View(mContext));
+
+        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mActivityStarter).postStartActivityDismissingKeyguard(intentCaptor.capture(),
+                anyInt(), any());
+        assertThat(intentCaptor.getValue().getAction()).isEqualTo(
+                HearingDevicesDialogDelegate.ACTION_BLUETOOTH_DEVICE_DETAILS);
+
+    }
+
+    @Test
+    public void onDeviceItemOnClicked_connectedDevice_disconnect() {
+        when(mHearingDeviceItem.getType()).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE);
+
+        mDialogDelegate.onDeviceItemOnClicked(mHearingDeviceItem, new View(mContext));
+
+        verify(mCachedDevice).disconnect();
+    }
+
+    private void setUpPairNewDeviceDialog() {
+        mDialogDelegate = new HearingDevicesDialogDelegate(
+                true,
+                mSystemUIDialogFactory,
+                mActivityStarter,
+                mDialogTransitionAnimator,
+                mLocalBluetoothManager,
+                new Handler(mTestableLooper.getLooper()),
+                mAudioManager
+        );
+        mDialog = new SystemUIDialog(
+                mContext,
+                0,
+                DEFAULT_DISMISS_ON_DEVICE_LOCK,
+                mSystemUIDialogManager,
+                mSysUiState,
+                getFakeBroadcastDispatcher(),
+                mDialogTransitionAnimator,
+                mDialogDelegate
+        );
+    }
+
+    private void setUpDeviceListDialog() {
+        mDialogDelegate = new HearingDevicesDialogDelegate(
+                false,
+                mSystemUIDialogFactory,
+                mActivityStarter,
+                mDialogTransitionAnimator,
+                mLocalBluetoothManager,
+                new Handler(mTestableLooper.getLooper()),
+                mAudioManager
+        );
+        mDialog = new SystemUIDialog(
+                mContext,
+                0,
+                DEFAULT_DISMISS_ON_DEVICE_LOCK,
+                mSystemUIDialogManager,
+                mSysUiState,
+                getFakeBroadcastDispatcher(),
+                mDialogTransitionAnimator,
+                mDialogDelegate
+        );
+    }
+
+    private View getPairNewDeviceButton(SystemUIDialog dialog) {
+        return dialog.requireViewById(R.id.pair_new_device_button);
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManagerTest.java
new file mode 100644
index 0000000..abc12ed
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManagerTest.java
@@ -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.systemui.accessibility.hearingaid;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothDevice;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.View;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.DialogTransitionAnimator;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Tests for {@link HearingDevicesDialogManager}. */
+@RunWith(AndroidTestingRunner.class)
[email protected](setAsMainLooper = true)
+@SmallTest
+public class HearingDevicesDialogManagerTest extends SysuiTestCase {
+
+    @Rule
+    public MockitoRule mockito = MockitoJUnit.rule();
+
+    private final View mView = new View(mContext);
+    private final List<CachedBluetoothDevice> mCachedDevices = new ArrayList<>();
+    @Mock
+    private DialogTransitionAnimator mDialogTransitionAnimator;
+    @Mock
+    private HearingDevicesDialogDelegate.Factory mDialogFactory;
+    @Mock
+    private HearingDevicesDialogDelegate mDialogDelegate;
+    @Mock
+    private SystemUIDialog mDialog;
+    @Mock
+    private LocalBluetoothManager mLocalBluetoothManager;
+    @Mock
+    private LocalBluetoothAdapter mLocalBluetoothAdapter;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedBluetoothDeviceManager;
+    @Mock
+    private CachedBluetoothDevice mCachedDevice;
+
+    private HearingDevicesDialogManager mManager;
+
+    @Before
+    public void setUp() {
+        when(mDialogFactory.create(anyBoolean())).thenReturn(mDialogDelegate);
+        when(mDialogDelegate.createDialog()).thenReturn(mDialog);
+        when(mLocalBluetoothManager.getBluetoothAdapter()).thenReturn(mLocalBluetoothAdapter);
+        when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(
+                mCachedBluetoothDeviceManager);
+        when(mCachedBluetoothDeviceManager.getCachedDevicesCopy()).thenReturn(mCachedDevices);
+
+        mManager = new HearingDevicesDialogManager(
+                mDialogTransitionAnimator,
+                mDialogFactory,
+                mLocalBluetoothManager
+        );
+    }
+
+    @Test
+    public void showDialog_bluetoothDisable_showPairNewDeviceTrue() {
+        when(mLocalBluetoothAdapter.isEnabled()).thenReturn(false);
+
+        mManager.showDialog(mView);
+
+        verify(mDialogFactory).create(eq(true));
+    }
+
+    @Test
+    public void showDialog_containsHearingAid_showPairNewDeviceFalse() {
+        when(mLocalBluetoothAdapter.isEnabled()).thenReturn(true);
+        when(mCachedDevice.isHearingAidDevice()).thenReturn(true);
+        when(mCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+        mCachedDevices.add(mCachedDevice);
+
+        mManager.showDialog(mView);
+
+        verify(mDialogFactory).create(eq(false));
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapterTest.java
new file mode 100644
index 0000000..d16db65
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapterTest.java
@@ -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.accessibility.hearingaid;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.bluetooth.qsdialog.DeviceItem;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Tests for {@link HearingDevicesListAdapter}. */
+@RunWith(AndroidTestingRunner.class)
[email protected](setAsMainLooper = true)
+@SmallTest
+public class HearingDevicesListAdapterTest extends SysuiTestCase {
+    @Rule
+    public MockitoRule mockito = MockitoJUnit.rule();
+
+    private static final String DEVICE_ADDRESS = "AA:BB:CC:DD:EE:FF";
+
+    @Mock
+    private DeviceItem mHearingDeviceItem;
+    @Mock
+    private CachedBluetoothDevice mCachedDevice;
+    @Mock
+    private HearingDevicesListAdapter.HearingDeviceItemCallback mDeviceItemCallback;
+    private HearingDevicesListAdapter mAdapter;
+
+    @Before
+    public void setUp() {
+        when(mCachedDevice.getAddress()).thenReturn(DEVICE_ADDRESS);
+        when(mHearingDeviceItem.getCachedBluetoothDevice()).thenReturn(mCachedDevice);
+    }
+
+    @Test
+    public void constructor_oneItem_getOneCount() {
+        mAdapter = new HearingDevicesListAdapter(List.of(mHearingDeviceItem), mDeviceItemCallback);
+
+        assertThat(mAdapter.getItemCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void refreshDeviceItemList_oneItem_getOneCount() {
+        mAdapter = new HearingDevicesListAdapter(new ArrayList<>(), mDeviceItemCallback);
+
+        mAdapter.refreshDeviceItemList(List.of(mHearingDeviceItem));
+
+        assertThat(mAdapter.getItemCount()).isEqualTo(1);
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityTransitionAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityTransitionAnimatorTest.kt
index 75a49d7..41974f4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityTransitionAnimatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityTransitionAnimatorTest.kt
@@ -246,6 +246,8 @@
  */
 private class TestTransitionAnimatorController(override var transitionContainer: ViewGroup) :
     ActivityTransitionAnimator.Controller {
+    override val isLaunching: Boolean = true
+
     override fun createAnimatorState() =
         TransitionAnimator.State(
             top = 100,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/TransitionAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/TransitionAnimatorTest.kt
new file mode 100644
index 0000000..c380a51
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/TransitionAnimatorTest.kt
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.AnimatorSet
+import android.graphics.drawable.GradientDrawable
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.activity.EmptyTestActivity
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.motion.RecordedMotion
+import platform.test.motion.Sampling.Companion.evenlySampled
+import platform.test.motion.view.DrawableFeatureCaptures
+import platform.test.motion.view.ViewMotionTestRule
+import platform.test.screenshot.DeviceEmulationRule
+import platform.test.screenshot.DeviceEmulationSpec
+import platform.test.screenshot.DisplaySpec
+import platform.test.screenshot.GoldenPathManager
+import platform.test.screenshot.PathConfig
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class TransitionAnimatorTest : SysuiTestCase() {
+    companion object {
+        private const val GOLDENS_PATH = "frameworks/base/packages/SystemUI/tests/goldens"
+
+        private val emulationSpec =
+            DeviceEmulationSpec(
+                DisplaySpec(
+                    "phone",
+                    width = 320,
+                    height = 690,
+                    densityDpi = 160,
+                )
+            )
+    }
+
+    private val pathManager = GoldenPathManager(context, GOLDENS_PATH, pathConfig = PathConfig())
+    private val transitionAnimator =
+        TransitionAnimator(
+            ActivityTransitionAnimator.TIMINGS,
+            ActivityTransitionAnimator.INTERPOLATORS
+        )
+
+    @get:Rule(order = 0) val deviceEmulationRule = DeviceEmulationRule(emulationSpec)
+    @get:Rule(order = 1) val activityRule = ActivityScenarioRule(EmptyTestActivity::class.java)
+    @get:Rule(order = 2)
+    val motionRule =
+        ViewMotionTestRule<EmptyTestActivity>(
+            pathManager,
+            { activityRule.scenario },
+            context = context,
+            bitmapDiffer = null,
+        )
+
+    @Test
+    fun backgroundAnimation_whenLaunching() {
+        val backgroundLayer = GradientDrawable().apply { alpha = 0 }
+        val animator = setUpTest(backgroundLayer, isLaunching = true)
+
+        val recordedMotion = recordMotion(backgroundLayer, animator)
+
+        motionRule.assertThat(recordedMotion).timeSeriesMatchesGolden()
+    }
+
+    @Test
+    fun backgroundAnimation_whenReturning() {
+        val backgroundLayer = GradientDrawable().apply { alpha = 0 }
+        val animator = setUpTest(backgroundLayer, isLaunching = false)
+
+        val recordedMotion = recordMotion(backgroundLayer, animator)
+
+        motionRule.assertThat(recordedMotion).timeSeriesMatchesGolden()
+    }
+
+    @Test
+    fun backgroundAnimationWithoutFade_whenLaunching() {
+        val backgroundLayer = GradientDrawable().apply { alpha = 0 }
+        val animator =
+            setUpTest(backgroundLayer, isLaunching = true, fadeWindowBackgroundLayer = false)
+
+        val recordedMotion = recordMotion(backgroundLayer, animator)
+
+        motionRule.assertThat(recordedMotion).timeSeriesMatchesGolden()
+    }
+
+    @Test
+    fun backgroundAnimationWithoutFade_whenReturning() {
+        val backgroundLayer = GradientDrawable().apply { alpha = 0 }
+        val animator =
+            setUpTest(backgroundLayer, isLaunching = false, fadeWindowBackgroundLayer = false)
+
+        val recordedMotion = recordMotion(backgroundLayer, animator)
+
+        motionRule.assertThat(recordedMotion).timeSeriesMatchesGolden()
+    }
+
+    private fun setUpTest(
+        backgroundLayer: GradientDrawable,
+        isLaunching: Boolean,
+        fadeWindowBackgroundLayer: Boolean = true,
+    ): AnimatorSet {
+        lateinit var transitionContainer: ViewGroup
+        activityRule.scenario.onActivity { activity ->
+            transitionContainer = FrameLayout(activity).apply { setBackgroundColor(0x00FF00) }
+            activity.setContentView(transitionContainer)
+        }
+        waitForIdleSync()
+
+        val controller = TestController(transitionContainer, isLaunching)
+        val animator =
+            transitionAnimator.createAnimator(
+                controller,
+                createEndState(transitionContainer),
+                backgroundLayer,
+                fadeWindowBackgroundLayer
+            )
+        return AnimatorSet().apply {
+            duration = animator.duration
+            play(animator)
+        }
+    }
+
+    private fun createEndState(container: ViewGroup): TransitionAnimator.State {
+        val containerLocation = IntArray(2)
+        container.getLocationOnScreen(containerLocation)
+        return TransitionAnimator.State(
+            left = containerLocation[0],
+            top = containerLocation[1],
+            right = containerLocation[0] + emulationSpec.display.width,
+            bottom = containerLocation[1] + emulationSpec.display.height,
+            topCornerRadius = 0f,
+            bottomCornerRadius = 0f
+        )
+    }
+
+    private fun recordMotion(
+        backgroundLayer: GradientDrawable,
+        animator: AnimatorSet
+    ): RecordedMotion {
+        return motionRule.checkThat(animator).record(
+            backgroundLayer,
+            evenlySampled(20),
+            visualCapture = null
+        ) {
+            capture(DrawableFeatureCaptures.bounds, "bounds")
+            capture(DrawableFeatureCaptures.cornerRadii, "corner_radii")
+            capture(DrawableFeatureCaptures.alpha, "alpha")
+        }
+    }
+}
+
+/**
+ * A simple implementation of [TransitionAnimator.Controller] which throws if it is called outside
+ * of the main thread.
+ */
+private class TestController(
+    override var transitionContainer: ViewGroup,
+    override val isLaunching: Boolean
+) : TransitionAnimator.Controller {
+    override fun createAnimatorState(): TransitionAnimator.State {
+        val containerLocation = IntArray(2)
+        transitionContainer.getLocationOnScreen(containerLocation)
+        return TransitionAnimator.State(
+            left = containerLocation[0] + 100,
+            top = containerLocation[1] + 300,
+            right = containerLocation[0] + 200,
+            bottom = containerLocation[1] + 400,
+            topCornerRadius = 10f,
+            bottomCornerRadius = 20f
+        )
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/back/BackAnimationSpecTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/back/BackAnimationSpecTest.kt
index 3bdbf97..190babd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/animation/back/BackAnimationSpecTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/back/BackAnimationSpecTest.kt
@@ -23,11 +23,11 @@
 
     @Test
     fun sysUi_floatingSystemSurfaces_animationValues() {
-        val maxX = 14.0f
-        val maxY = 4.0f
-        val minScale = 0.8f
+        val maxX = 19.0f
+        val maxY = 14.0f
+        val minScale = 0.9f
 
-        val backAnimationSpec = BackAnimationSpec.floatingSystemSurfacesForSysUi(displayMetrics)
+        val backAnimationSpec = BackAnimationSpec.floatingSystemSurfacesForSysUi { displayMetrics }
 
         assertBackTransformation(
             backAnimationSpec = backAnimationSpec,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/back/OnBackAnimationCallbackExtensionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/back/OnBackAnimationCallbackExtensionTest.kt
index 2b95973..314abda 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/animation/back/OnBackAnimationCallbackExtensionTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/back/OnBackAnimationCallbackExtensionTest.kt
@@ -4,7 +4,10 @@
 import android.window.BackEvent
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.util.mockito.argumentCaptor
+import com.android.systemui.util.mockito.capture
 import com.android.systemui.util.mockito.mock
+import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -27,7 +30,7 @@
 
     private val onBackAnimationCallback =
         onBackAnimationCallbackFrom(
-            backAnimationSpec = BackAnimationSpec.floatingSystemSurfacesForSysUi(displayMetrics),
+            backAnimationSpec = BackAnimationSpec.floatingSystemSurfacesForSysUi { displayMetrics },
             displayMetrics = displayMetrics,
             onBackProgressed = onBackProgress,
             onBackStarted = onBackStart,
@@ -48,7 +51,14 @@
 
         onBackAnimationCallback.onBackProgressed(backEvent)
 
-        verify(onBackProgress).invoke(BackTransformation(0f, 0f, 1f))
+        val argumentCaptor = argumentCaptor<BackTransformation>()
+        verify(onBackProgress).invoke(capture(argumentCaptor))
+
+        val actual = argumentCaptor.value
+        val tolerance = 0.0001f
+        assertThat(actual.translateX).isWithin(tolerance).of(0f)
+        assertThat(actual.translateY).isWithin(tolerance).of(0f)
+        assertThat(actual.scale).isWithin(tolerance).of(1f)
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
index 072569d..8f3fed7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
@@ -15,11 +15,14 @@
  */
 package com.android.systemui.biometrics
 
+import android.app.ActivityTaskManager
 import android.app.admin.DevicePolicyManager
 import android.content.pm.PackageManager
 import android.hardware.biometrics.BiometricAuthenticator
 import android.hardware.biometrics.BiometricConstants
 import android.hardware.biometrics.BiometricManager
+import android.hardware.biometrics.Flags.FLAG_CUSTOM_BIOMETRIC_PROMPT
+import android.hardware.biometrics.PromptContentViewWithMoreOptionsButton
 import android.hardware.biometrics.PromptInfo
 import android.hardware.biometrics.PromptVerticalListContentView
 import android.hardware.face.FaceSensorPropertiesInternal
@@ -35,15 +38,19 @@
 import android.view.WindowInsets
 import android.view.WindowManager
 import android.widget.ScrollView
+import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.android.internal.jank.InteractionJankMonitor
 import com.android.internal.widget.LockPatternUtils
 import com.android.systemui.Flags.FLAG_CONSTRAINT_BP
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.biometrics.data.repository.FakeBiometricStatusRepository
 import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository
 import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
 import com.android.systemui.biometrics.data.repository.FakePromptRepository
+import com.android.systemui.biometrics.domain.interactor.BiometricStatusInteractor
+import com.android.systemui.biometrics.domain.interactor.BiometricStatusInteractorImpl
 import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
 import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractorImpl
 import com.android.systemui.biometrics.domain.interactor.FakeCredentialInteractor
@@ -82,6 +89,7 @@
 import org.mockito.junit.MockitoJUnit
 import org.mockito.Mockito.`when` as whenever
 
+
 private const val OP_PACKAGE_NAME = "biometric.testapp"
 
 @RunWith(AndroidJUnit4::class)
@@ -116,10 +124,12 @@
     lateinit var selectedUserInteractor: SelectedUserInteractor
     @Mock
     private lateinit var packageManager: PackageManager
+    @Mock private lateinit var activityTaskManager: ActivityTaskManager
 
     private val testScope = TestScope(StandardTestDispatcher())
     private val fakeExecutor = FakeExecutor(FakeSystemClock())
     private val biometricPromptRepository = FakePromptRepository()
+    private val biometricStatusRepository = FakeBiometricStatusRepository()
     private val fingerprintRepository = FakeFingerprintPropertyRepository()
     private val displayStateRepository = FakeDisplayStateRepository()
     private val credentialInteractor = FakeCredentialInteractor()
@@ -139,6 +149,7 @@
     private lateinit var displayRepository: FakeDisplayRepository
     private lateinit var displayStateInteractor: DisplayStateInteractor
     private lateinit var udfpsOverlayInteractor: UdfpsOverlayInteractor
+    private lateinit var biometricStatusInteractor: BiometricStatusInteractor
 
     private val credentialViewModel = CredentialViewModel(mContext, bpCredentialInteractor)
     private val defaultLogoIcon = context.getDrawable(R.drawable.ic_android)
@@ -164,6 +175,8 @@
                         selectedUserInteractor,
                         testScope.backgroundScope,
                 )
+        biometricStatusInteractor =
+                BiometricStatusInteractorImpl(activityTaskManager, biometricStatusRepository)
         // Set up default logo icon
         whenever(packageManager.getApplicationIcon(OP_PACKAGE_NAME)).thenReturn(defaultLogoIcon)
         context.setMockPackageManager(packageManager)
@@ -386,10 +399,38 @@
     }
 
     @Test
+    fun testShowBiometricUI_ContentViewWithMoreOptionsButton() {
+        mSetFlagsRule.enableFlags(FLAG_CONSTRAINT_BP)
+        mSetFlagsRule.enableFlags(FLAG_CUSTOM_BIOMETRIC_PROMPT)
+        var isButtonClicked = false
+        val contentView =
+                PromptContentViewWithMoreOptionsButton.Builder()
+                        .setMoreOptionsButtonListener(
+                                fakeExecutor) { _, _ -> isButtonClicked = true }
+                        .build()
+
+        val container =
+                initializeFingerprintContainer(contentViewWithMoreOptionsButton = contentView)
+
+        waitForIdleSync()
+
+        assertThat(container.hasCredentialView()).isFalse()
+        assertThat(container.hasConstraintBiometricPrompt()).isTrue()
+
+        // TODO(b/328843028): Use button.performClick() instead of calling
+        //  onContentViewMoreOptionsButtonPressed() directly, and check |isButtonClicked| is true.
+        container.mBiometricCallback.onContentViewMoreOptionsButtonPressed()
+        waitForIdleSync()
+        // container is gone
+        assertThat(container.mContainerState).isEqualTo(5)
+    }
+
+    @Test
     fun testShowCredentialUI_withDescription() {
-        val container = initializeFingerprintContainer(
-                authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL
-        )
+        val container =
+                initializeFingerprintContainer(
+                        authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL
+                )
         waitForIdleSync()
 
         assertThat(container.hasCredentialView()).isTrue()
@@ -397,14 +438,44 @@
     }
 
     @Test
-    @Ignore("b/302735104")
-    fun testShowCredentialUI_withCustomBp() {
-        mSetFlagsRule.disableFlags(FLAG_CONSTRAINT_BP)
-        val container = initializeFingerprintContainer(
-                authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL,
-                isUsingContentView = true
-        )
-        checkBpShowsForCredentialAndGoToCredential(container)
+    fun testShowCredentialUI_withVerticalListContentView() {
+        mSetFlagsRule.enableFlags(FLAG_CONSTRAINT_BP)
+        mSetFlagsRule.enableFlags(FLAG_CUSTOM_BIOMETRIC_PROMPT)
+        val container =
+                initializeFingerprintContainer(
+                        authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL,
+                        verticalListContentView = PromptVerticalListContentView.Builder().build()
+                )
+        // Two-step credential view should show -
+        // 1. biometric prompt without sensor 2. credential view ui
+        waitForIdleSync()
+        assertThat(container.hasConstraintBiometricPrompt()).isTrue()
+        assertThat(container.hasCredentialView()).isFalse()
+
+        container.animateToCredentialUI(false)
+        waitForIdleSync()
+        // TODO(b/302735104): Check the reason why hasConstraintBiometricPrompt() is still true
+        // assertThat(container.hasConstraintBiometricPrompt()).isFalse()
+        assertThat(container.hasCredentialView()).isTrue()
+    }
+
+    @Test
+    fun testShowCredentialUI_withContentViewWithMoreOptionsButton() {
+        mSetFlagsRule.enableFlags(FLAG_CONSTRAINT_BP)
+        mSetFlagsRule.enableFlags(FLAG_CUSTOM_BIOMETRIC_PROMPT)
+        val contentView =
+                PromptContentViewWithMoreOptionsButton.Builder()
+                        .setMoreOptionsButtonListener(fakeExecutor) { _, _ -> }
+                        .build()
+        val container =
+                initializeFingerprintContainer(
+                        authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL,
+                        contentViewWithMoreOptionsButton = contentView
+                )
+        waitForIdleSync()
+
+        assertThat(container.hasCredentialView()).isTrue()
+        assertThat(container.hasBiometricPrompt()).isFalse()
     }
 
     @Test
@@ -509,12 +580,13 @@
     private fun initializeFingerprintContainer(
         authenticators: Int = BiometricManager.Authenticators.BIOMETRIC_WEAK,
         addToView: Boolean = true,
-        isUsingContentView: Boolean = false,
+        verticalListContentView: PromptVerticalListContentView? = null,
+        contentViewWithMoreOptionsButton: PromptContentViewWithMoreOptionsButton? = null,
     ) = initializeContainer(
         TestAuthContainerView(
             authenticators = authenticators,
             fingerprintProps = fingerprintSensorPropertiesInternal(),
-                isUsingContentView = isUsingContentView,
+                verticalListContentView = verticalListContentView,
         ),
         addToView
     )
@@ -548,7 +620,8 @@
         authenticators: Int = BiometricManager.Authenticators.BIOMETRIC_WEAK,
         fingerprintProps: List<FingerprintSensorPropertiesInternal> = listOf(),
         faceProps: List<FaceSensorPropertiesInternal> = listOf(),
-        isUsingContentView: Boolean = false,
+        verticalListContentView: PromptVerticalListContentView? = null,
+        contentViewWithMoreOptionsButton: PromptContentViewWithMoreOptionsButton? = null,
     ) : AuthContainerView(
         Config().apply {
             mContext = [email protected]
@@ -558,8 +631,10 @@
             mSkipAnimation = true
             mPromptInfo = PromptInfo().apply {
                 this.authenticators = authenticators
-                if (isUsingContentView) {
-                    this.contentView = PromptVerticalListContentView.Builder().build()
+                if (verticalListContentView != null) {
+                    this.contentView = verticalListContentView
+                } else if (contentViewWithMoreOptionsButton != null) {
+                    this.contentView = contentViewWithMoreOptionsButton
                 }
             }
             mOpPackageName = OP_PACKAGE_NAME
@@ -579,6 +654,7 @@
             promptSelectorInteractor,
             context,
             udfpsOverlayInteractor,
+            biometricStatusInteractor,
             udfpsUtils
         ),
         { credentialViewModel },
@@ -616,19 +692,11 @@
         val layoutParams = AuthContainerView.getLayoutParams(windowToken, "")
         assertThat((layoutParams.fitInsetsTypes and WindowInsets.Type.systemBars()) == 0).isTrue()
     }
-
-    private fun checkBpShowsForCredentialAndGoToCredential(container: TestAuthContainerView) {
-        waitForIdleSync()
-        assertThat(container.hasBiometricPrompt()).isTrue()
-        assertThat(container.hasCredentialView()).isFalse()
-
-        container.animateToCredentialUI(false)
-        waitForIdleSync()
-        assertThat(container.hasBiometricPrompt()).isFalse()
-        assertThat(container.hasCredentialView()).isTrue()
-    }
 }
 
+private fun AuthContainerView.hasConstraintBiometricPrompt() =
+    (findViewById<ConstraintLayout>(R.id.biometric_prompt_constraint_layout)?.childCount ?: 0) > 0
+
 private fun AuthContainerView.hasBiometricPrompt() =
     (findViewById<ScrollView>(R.id.biometric_scrollview)?.childCount ?: 0) > 0
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsUtilsTest.java
index 3dcb3f8..5b6aee6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsUtilsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsUtilsTest.java
@@ -65,7 +65,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         0 /* touchX */, 0/* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[0]);
         // touch at 90 degrees
@@ -73,7 +74,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         0 /* touchX */, -1/* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[1]);
         // touch at 180 degrees
@@ -81,7 +83,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         -1 /* touchX */, 0/* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[2]);
         // touch at 270 degrees
@@ -89,7 +92,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         0 /* touchX */, 1/* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[3]);
     }
@@ -103,7 +107,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         0 /* touchX */, 0 /* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[1]);
         // touch at 90 degrees -> 180 degrees
@@ -111,7 +116,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         0 /* touchX */, -1 /* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[2]);
         // touch at 180 degrees -> 270 degrees
@@ -119,7 +125,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         -1 /* touchX */, 0 /* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[3]);
         // touch at 270 degrees -> 0 degrees
@@ -127,7 +134,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         0 /* touchX */, 1/* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[0]);
     }
@@ -141,7 +149,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         0 /* touchX */, 0/* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[3]);
         // touch at 90 degrees -> 0 degrees
@@ -149,7 +158,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         0 /* touchX */, -1/* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[0]);
         // touch at 180 degrees -> 90 degrees
@@ -157,7 +167,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         -1 /* touchX */, 0/* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[1]);
         // touch at 270 degrees -> 180 degrees
@@ -165,7 +176,8 @@
                 mUdfpsUtils.onTouchOutsideOfSensorArea(true, mContext,
                         0 /* touchX */, 1/* touchY */,
                         new UdfpsOverlayParams(new Rect(), new Rect(), 0, 0, 1f, rotation,
-                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL)
+                                FingerprintSensorProperties.TYPE_UDFPS_OPTICAL),
+                        true /* rotatedToPortrait */
                 )
         ).isEqualTo(mTouchHints[2]);
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/PromptRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/PromptRepositoryImplTest.kt
index 81d4e83..df0e5a7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/PromptRepositoryImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/PromptRepositoryImplTest.kt
@@ -18,6 +18,7 @@
 
 import android.hardware.biometrics.BiometricManager
 import android.hardware.biometrics.Flags.FLAG_CUSTOM_BIOMETRIC_PROMPT
+import android.hardware.biometrics.PromptContentViewWithMoreOptionsButton
 import android.hardware.biometrics.PromptInfo
 import android.hardware.biometrics.PromptVerticalListContentView
 import androidx.test.filters.SmallTest
@@ -26,8 +27,10 @@
 import com.android.systemui.biometrics.AuthController
 import com.android.systemui.biometrics.shared.model.PromptKind
 import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.util.concurrency.FakeExecutor
 import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.mockito.withArgCaptor
+import com.android.systemui.util.time.FakeSystemClock
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.toList
@@ -58,6 +61,7 @@
 
     private val testScope = TestScope()
     private val faceSettings = FakeFaceSettingsRepository()
+    private val fakeExecutor = FakeExecutor(FakeSystemClock())
 
     @Mock private lateinit var authController: AuthController
 
@@ -135,7 +139,7 @@
         }
 
     @Test
-    fun showBpWithoutIconForCredential_withCustomBp() =
+    fun showBpWithoutIconForCredential_withVerticalListContentView() =
         testScope.runTest {
             mSetFlagsRule.enableFlags(Flags.FLAG_CONSTRAINT_BP)
             mSetFlagsRule.enableFlags(FLAG_CUSTOM_BIOMETRIC_PROMPT)
@@ -161,8 +165,37 @@
         }
 
     @Test
+    fun showBpWithoutIconForCredential_withContentViewWithMoreOptionsButton() =
+        testScope.runTest {
+            mSetFlagsRule.enableFlags(Flags.FLAG_CONSTRAINT_BP)
+            mSetFlagsRule.enableFlags(FLAG_CUSTOM_BIOMETRIC_PROMPT)
+            val promptInfo =
+                PromptInfo().apply {
+                    authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL
+                    contentView =
+                        PromptContentViewWithMoreOptionsButton.Builder()
+                            .setMoreOptionsButtonListener(fakeExecutor) { _, _ -> }
+                            .build()
+                }
+            for (case in
+                listOf(
+                    PromptKind.Biometric(),
+                    PromptKind.Pin,
+                    PromptKind.Password,
+                    PromptKind.Pattern
+                )) {
+                repository.setPrompt(promptInfo, USER_ID, CHALLENGE, case, OP_PACKAGE_NAME)
+                repository.setShouldShowBpWithoutIconForCredential(promptInfo)
+
+                assertThat(repository.showBpWithoutIconForCredential.value).isFalse()
+            }
+        }
+
+    @Test
     fun showBpWithoutIconForCredential_withDescription() =
         testScope.runTest {
+            mSetFlagsRule.enableFlags(Flags.FLAG_CONSTRAINT_BP)
+            mSetFlagsRule.enableFlags(FLAG_CUSTOM_BIOMETRIC_PROMPT)
             for (case in
                 listOf(
                     PromptKind.Biometric(),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractorImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractorImplTest.kt
index bf6caad..31bdde2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractorImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/DisplayStateInteractorImplTest.kt
@@ -1,13 +1,11 @@
 package com.android.systemui.biometrics.domain.interactor
 
-import android.view.Display
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository
 import com.android.systemui.biometrics.shared.model.DisplayRotation
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.display.data.repository.FakeDisplayRepository
-import com.android.systemui.display.data.repository.display
 import com.android.systemui.unfold.compat.ScreenSizeFoldProvider
 import com.android.systemui.unfold.updates.FoldProvider
 import com.android.systemui.util.concurrency.FakeExecutor
@@ -101,14 +99,11 @@
     fun isDefaultDisplayOffChanges() =
         testScope.runTest {
             val isDefaultDisplayOff by collectLastValue(interactor.isDefaultDisplayOff)
-            runCurrent()
 
-            displayRepository.emit(setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_OFF)))
-            displayRepository.emitDisplayChangeEvent(Display.DEFAULT_DISPLAY)
+            displayRepository.setDefaultDisplayOff(true)
             assertThat(isDefaultDisplayOff).isTrue()
 
-            displayRepository.emit(setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_ON)))
-            displayRepository.emitDisplayChangeEvent(Display.DEFAULT_DISPLAY)
+            displayRepository.setDefaultDisplayOff(false)
             assertThat(isDefaultDisplayOff).isFalse()
         }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt
index 8a46c0c..2172bc5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/interactor/PromptCredentialInteractorTest.kt
@@ -1,6 +1,8 @@
 package com.android.systemui.biometrics.domain.interactor
 
+import android.hardware.biometrics.PromptContentViewWithMoreOptionsButton
 import android.hardware.biometrics.PromptInfo
+import android.hardware.biometrics.PromptVerticalListContentView
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.biometrics.Utils
@@ -10,6 +12,8 @@
 import com.android.systemui.biometrics.promptInfo
 import com.android.systemui.biometrics.shared.model.BiometricUserInfo
 import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.time.FakeSystemClock
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.delay
@@ -43,6 +47,7 @@
     private val testScope = TestScope(testDispatcher)
     private val biometricPromptRepository = FakePromptRepository()
     private val credentialInteractor = FakeCredentialInteractor()
+    private val fakeExecutor = FakeExecutor(FakeSystemClock())
 
     private lateinit var interactor: PromptCredentialInteractor
 
@@ -90,6 +95,82 @@
             assertThat(prompt).isNull()
         }
 
+    @Test
+    fun testShowTitleOnlyValue_description() =
+        testScope.runTest {
+            val title = "what a prompt"
+            val subtitle = "s"
+            val description = "something to see"
+
+            val showTitleOnly by collectLastValue(interactor.showTitleOnly)
+
+            interactor.useCredentialsForAuthentication(
+                PromptInfo().also {
+                    it.title = title
+                    it.description = description
+                    it.subtitle = subtitle
+                },
+                kind = Utils.CREDENTIAL_PIN,
+                userId = USER_ID,
+                challenge = OPERATION_ID,
+                opPackageName = OP_PACKAGE_NAME
+            )
+            assertThat(showTitleOnly).isFalse()
+        }
+
+    @Test
+    fun testShowTitleOnlyValue_verticalListContentView() =
+        testScope.runTest {
+            val title = "what a prompt"
+            val subtitle = "s"
+            val description = "something to see"
+            val contentView = PromptVerticalListContentView.Builder().build()
+
+            val showTitleOnly by collectLastValue(interactor.showTitleOnly)
+
+            interactor.useCredentialsForAuthentication(
+                PromptInfo().also {
+                    it.title = title
+                    it.description = description
+                    it.subtitle = subtitle
+                    it.contentView = contentView
+                },
+                kind = Utils.CREDENTIAL_PIN,
+                userId = USER_ID,
+                challenge = OPERATION_ID,
+                opPackageName = OP_PACKAGE_NAME
+            )
+            assertThat(showTitleOnly).isTrue()
+        }
+
+    @Test
+    fun testShowTitleOnlyValue_ContentViewWithButton() =
+        testScope.runTest {
+            val title = "what a prompt"
+            val subtitle = "s"
+            val description = "something to see"
+            val contentView =
+                PromptContentViewWithMoreOptionsButton.Builder()
+                    .setMoreOptionsButtonListener(fakeExecutor) { _, _ -> }
+                    .build()
+
+            val showTitleOnly by collectLastValue(interactor.showTitleOnly)
+
+            interactor.useCredentialsForAuthentication(
+                PromptInfo().also {
+                    it.title = title
+                    it.description = description
+                    it.subtitle = subtitle
+                    it.contentView = contentView
+                },
+                kind = Utils.CREDENTIAL_PIN,
+                userId = USER_ID,
+                challenge = OPERATION_ID,
+                opPackageName = OP_PACKAGE_NAME
+            )
+            assertThat(showTitleOnly).isFalse()
+        }
+
     @Test fun usePinCredentialForPrompt() = useCredentialForPrompt(Utils.CREDENTIAL_PIN)
 
     @Test fun usePasswordCredentialForPrompt() = useCredentialForPrompt(Utils.CREDENTIAL_PASSWORD)
@@ -106,12 +187,14 @@
             val title = "what a prompt"
             val subtitle = "s"
             val description = "something to see"
+            val contentView = PromptVerticalListContentView.Builder().build()
 
             interactor.useCredentialsForAuthentication(
                 PromptInfo().also {
                     it.title = title
                     it.description = description
                     it.subtitle = subtitle
+                    it.contentView = contentView
                 },
                 kind = kind,
                 userId = USER_ID,
@@ -122,6 +205,7 @@
             assertThat(prompt?.title).isEqualTo(title)
             assertThat(prompt?.subtitle).isEqualTo(subtitle)
             assertThat(prompt?.description).isEqualTo(description)
+            assertThat(prompt?.contentView).isEqualTo(contentView)
             assertThat(prompt?.userInfo).isEqualTo(BiometricUserInfo(USER_ID))
             assertThat(prompt?.operationInfo).isEqualTo(BiometricOperationInfo(OPERATION_ID))
             assertThat(prompt)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequestTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequestTest.kt
index 8fab233..d10b935 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequestTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/domain/model/BiometricPromptRequestTest.kt
@@ -2,6 +2,7 @@
 
 import android.graphics.Bitmap
 import android.hardware.biometrics.PromptContentItemBulletedText
+import android.hardware.biometrics.PromptContentViewWithMoreOptionsButton
 import android.hardware.biometrics.PromptVerticalListContentView
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
@@ -11,6 +12,7 @@
 import com.android.systemui.biometrics.shared.model.BiometricUserInfo
 import com.android.systemui.res.R
 import com.google.common.truth.Truth.assertThat
+import com.google.common.util.concurrent.MoreExecutors
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -59,7 +61,7 @@
         assertThat(request.title).isEqualTo(title)
         assertThat(request.subtitle).isEqualTo(subtitle)
         assertThat(request.description).isEqualTo(description)
-        assertThat(request.contentView).isEqualTo(contentView)
+        assertThat(request.contentView).isSameInstanceAs(contentView)
         assertThat(request.userInfo).isEqualTo(BiometricUserInfo(USER_ID))
         assertThat(request.operationInfo).isEqualTo(BiometricOperationInfo(OPERATION_ID))
         assertThat(request.modalities)
@@ -67,6 +69,29 @@
     }
 
     @Test
+    fun biometricRequestContentViewWithMoreOptionsButtonFromPromptInfo() {
+        val title = "what"
+        val description = "request"
+        val executor = MoreExecutors.directExecutor()
+        val contentView =
+            PromptContentViewWithMoreOptionsButton.Builder()
+                .setDescription("test")
+                .setMoreOptionsButtonListener(executor) { _, _ -> }
+                .build()
+
+        val fpPros = fingerprintSensorPropertiesInternal().first()
+        val request =
+            BiometricPromptRequest.Biometric(
+                promptInfo(title = title, description = description, contentView = contentView),
+                BiometricUserInfo(USER_ID),
+                BiometricOperationInfo(OPERATION_ID),
+                BiometricModalities(fingerprintProperties = fpPros),
+                OP_PACKAGE_NAME,
+            )
+        assertThat(request.contentView).isSameInstanceAs(contentView)
+    }
+
+    @Test
     fun biometricRequestLogoBitmapFromPromptInfo() {
         val logoBitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888)
         val fpPros = fingerprintSensorPropertiesInternal().first()
@@ -89,6 +114,12 @@
         val subtitle = "a"
         val description = "request"
         val stealth = true
+        val contentView =
+            PromptVerticalListContentView.Builder()
+                .setDescription("content description")
+                .addListItem(PromptContentItemBulletedText("content item 1"))
+                .addListItem(PromptContentItemBulletedText("content item 2"), 1)
+                .build()
 
         val toCheck =
             listOf(
@@ -97,6 +128,7 @@
                         title = title,
                         subtitle = subtitle,
                         description = description,
+                        contentView = contentView,
                         credentialTitle = null,
                         credentialSubtitle = null,
                         credentialDescription = null,
@@ -106,6 +138,7 @@
                 ),
                 BiometricPromptRequest.Credential.Password(
                     promptInfo(
+                        contentView = contentView,
                         credentialTitle = title,
                         credentialSubtitle = subtitle,
                         credentialDescription = description,
@@ -117,6 +150,7 @@
                     promptInfo(
                         subtitle = subtitle,
                         description = description,
+                        contentView = contentView,
                         credentialTitle = title,
                         credentialSubtitle = null,
                         credentialDescription = null,
@@ -131,6 +165,7 @@
             assertThat(request.title).isEqualTo(title)
             assertThat(request.subtitle).isEqualTo(subtitle)
             assertThat(request.description).isEqualTo(description)
+            assertThat(request.contentView).isEqualTo(contentView)
             assertThat(request.userInfo).isEqualTo(BiometricUserInfo(USER_ID))
             assertThat(request.operationInfo).isEqualTo(BiometricOperationInfo(OPERATION_ID))
             if (request is BiometricPromptRequest.Credential.Pattern) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
index 5509c04..30c5e6e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinderTest.kt
@@ -58,6 +58,7 @@
 import com.android.systemui.bouncer.ui.BouncerView
 import com.android.systemui.classifier.FalsingCollector
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
 import com.android.systemui.deviceentry.domain.interactor.deviceEntryFingerprintAuthInteractor
 import com.android.systemui.display.data.repository.FakeDisplayRepository
 import com.android.systemui.keyguard.DismissCallbackRegistry
@@ -66,6 +67,8 @@
 import com.android.systemui.keyguard.data.repository.FakeTrustRepository
 import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
 import com.android.systemui.keyguard.domain.interactor.DeviceEntrySideFpsOverlayInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
 import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
 import com.android.systemui.keyguard.ui.viewmodel.SideFpsProgressBarViewModel
@@ -74,6 +77,8 @@
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.power.domain.interactor.powerInteractor
 import com.android.systemui.res.R
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
 import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
 import com.android.systemui.statusbar.phone.dozeServiceHost
 import com.android.systemui.statusbar.policy.KeyguardStateController
@@ -82,7 +87,6 @@
 import com.android.systemui.user.domain.interactor.SelectedUserInteractor
 import com.android.systemui.util.concurrency.FakeExecutor
 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.time.FakeSystemClock
 import java.util.Optional
@@ -193,6 +197,9 @@
                 biometricSettingsRepository,
                 FakeSystemClock(),
                 keyguardUpdateMonitor,
+                { mock(DeviceEntryFingerprintAuthInteractor::class.java) },
+                { mock(KeyguardInteractor::class.java) },
+                { mock(KeyguardTransitionInteractor::class.java) },
                 testScope.backgroundScope,
             )
 
@@ -232,6 +239,8 @@
                 testScope.backgroundScope,
                 mContext,
                 deviceEntryFingerprintAuthRepository,
+                kosmos.fakeSceneContainerFlags,
+                kosmos.sceneInteractor,
                 primaryBouncerInteractor,
                 alternateBouncerInteractor,
                 keyguardUpdateMonitor
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
index 7db4ca9..a6c7f72 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
@@ -16,15 +16,18 @@
 
 package com.android.systemui.biometrics.ui.viewmodel
 
+import android.app.ActivityTaskManager
 import android.content.pm.ApplicationInfo
 import android.content.pm.PackageManager
 import android.content.res.Configuration
 import android.graphics.Bitmap
 import android.graphics.Point
 import android.graphics.drawable.BitmapDrawable
+import android.hardware.biometrics.BiometricFingerprintConstants
 import android.hardware.biometrics.Flags.FLAG_CUSTOM_BIOMETRIC_PROMPT
 import android.hardware.biometrics.PromptContentItemBulletedText
 import android.hardware.biometrics.PromptContentView
+import android.hardware.biometrics.PromptContentViewWithMoreOptionsButton
 import android.hardware.biometrics.PromptInfo
 import android.hardware.biometrics.PromptVerticalListContentView
 import android.hardware.face.FaceSensorPropertiesInternal
@@ -39,9 +42,12 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.biometrics.AuthController
 import com.android.systemui.biometrics.UdfpsUtils
+import com.android.systemui.biometrics.data.repository.FakeBiometricStatusRepository
 import com.android.systemui.biometrics.data.repository.FakeDisplayStateRepository
 import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
 import com.android.systemui.biometrics.data.repository.FakePromptRepository
+import com.android.systemui.biometrics.domain.interactor.BiometricStatusInteractor
+import com.android.systemui.biometrics.domain.interactor.BiometricStatusInteractorImpl
 import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
 import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractorImpl
 import com.android.systemui.biometrics.domain.interactor.PromptSelectorInteractor
@@ -50,6 +56,7 @@
 import com.android.systemui.biometrics.extractAuthenticatorTypes
 import com.android.systemui.biometrics.faceSensorPropertiesInternal
 import com.android.systemui.biometrics.fingerprintSensorPropertiesInternal
+import com.android.systemui.biometrics.shared.model.AuthenticationReason
 import com.android.systemui.biometrics.shared.model.BiometricModalities
 import com.android.systemui.biometrics.shared.model.BiometricModality
 import com.android.systemui.biometrics.shared.model.DisplayRotation
@@ -58,6 +65,7 @@
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.coroutines.collectValues
 import com.android.systemui.display.data.repository.FakeDisplayRepository
+import com.android.systemui.keyguard.shared.model.AcquiredFingerprintAuthenticationStatus
 import com.android.systemui.res.R
 import com.android.systemui.user.domain.interactor.SelectedUserInteractor
 import com.android.systemui.util.concurrency.FakeExecutor
@@ -101,6 +109,7 @@
     @Mock private lateinit var packageManager: PackageManager
     @Mock private lateinit var applicationInfoWithIcon: ApplicationInfo
     @Mock private lateinit var applicationInfoNoIcon: ApplicationInfo
+    @Mock private lateinit var activityTaskManager: ActivityTaskManager
 
     private val fakeExecutor = FakeExecutor(FakeSystemClock())
     private val testScope = TestScope()
@@ -114,14 +123,18 @@
     private lateinit var fingerprintRepository: FakeFingerprintPropertyRepository
     private lateinit var promptRepository: FakePromptRepository
     private lateinit var displayStateRepository: FakeDisplayStateRepository
+    private lateinit var biometricStatusRepository: FakeBiometricStatusRepository
     private lateinit var displayRepository: FakeDisplayRepository
     private lateinit var displayStateInteractor: DisplayStateInteractor
     private lateinit var udfpsOverlayInteractor: UdfpsOverlayInteractor
+    private lateinit var biometricStatusInteractor: BiometricStatusInteractor
 
     private lateinit var selector: PromptSelectorInteractor
     private lateinit var viewModel: PromptViewModel
     private lateinit var iconViewModel: PromptIconViewModel
     private lateinit var promptContentView: PromptContentView
+    private lateinit var promptContentViewWithMoreOptionsButton:
+        PromptContentViewWithMoreOptionsButton
 
     @Before
     fun setup() {
@@ -154,6 +167,9 @@
                 selectedUserInteractor,
                 testScope.backgroundScope
             )
+        biometricStatusRepository = FakeBiometricStatusRepository()
+        biometricStatusInteractor =
+            BiometricStatusInteractorImpl(activityTaskManager, biometricStatusRepository)
         selector =
             PromptSelectorInteractorImpl(fingerprintRepository, promptRepository, lockPatternUtils)
         selector.resetPrompt()
@@ -163,12 +179,19 @@
                 .addListItem(PromptContentItemBulletedText("content item 2"), 1)
                 .build()
 
+        promptContentViewWithMoreOptionsButton =
+            PromptContentViewWithMoreOptionsButton.Builder()
+                .setDescription("test")
+                .setMoreOptionsButtonListener(fakeExecutor, { _, _ -> })
+                .build()
+
         viewModel =
             PromptViewModel(
                 displayStateInteractor,
                 selector,
                 mContext,
                 udfpsOverlayInteractor,
+                biometricStatusInteractor,
                 udfpsUtils
             )
         iconViewModel = viewModel.iconViewModel
@@ -1044,8 +1067,7 @@
     fun auto_confirm_authentication_when_finger_down() = runGenericTest {
         val expectConfirmation = testCase.expectConfirmation(atLeastOneFailure = false)
 
-        // No icon button when face only, can't confirm before auth
-        if (!testCase.isFaceOnly) {
+        if (testCase.isCoex) {
             viewModel.onOverlayTouch(obtainMotionEvent(MotionEvent.ACTION_DOWN))
         }
         viewModel.showAuthenticated(testCase.authenticatedModality, 0)
@@ -1060,14 +1082,18 @@
         assertThat(canTryAgain).isFalse()
         assertThat(authenticated?.isAuthenticated).isTrue()
 
-        if (testCase.isFaceOnly && expectConfirmation) {
-            assertThat(size).isEqualTo(PromptSize.MEDIUM)
-            assertButtonsVisible(
-                cancel = true,
-                confirm = true,
-            )
+        if (expectConfirmation) {
+            if (testCase.isFaceOnly) {
+                assertThat(size).isEqualTo(PromptSize.MEDIUM)
+                assertButtonsVisible(
+                    cancel = true,
+                    confirm = true,
+                )
 
-            viewModel.confirmAuthenticated()
+                viewModel.confirmAuthenticated()
+            } else if (testCase.isCoex) {
+                assertThat(authenticated?.isAuthenticatedAndConfirmed).isTrue()
+            }
             assertThat(message).isEqualTo(PromptMessage.Empty)
             assertButtonsVisible()
         }
@@ -1077,8 +1103,7 @@
     fun cannot_auto_confirm_authentication_when_finger_up() = runGenericTest {
         val expectConfirmation = testCase.expectConfirmation(atLeastOneFailure = false)
 
-        // No icon button when face only, can't confirm before auth
-        if (!testCase.isFaceOnly) {
+        if (testCase.isCoex) {
             viewModel.onOverlayTouch(obtainMotionEvent(MotionEvent.ACTION_DOWN))
             viewModel.onOverlayTouch(obtainMotionEvent(MotionEvent.ACTION_UP))
         }
@@ -1254,7 +1279,7 @@
     }
 
     @Test
-    fun descriptionOverriddenByContentView() =
+    fun descriptionOverriddenByVerticalListContentView() =
         runGenericTest(contentView = promptContentView, description = "test description") {
             mSetFlagsRule.enableFlags(FLAG_CUSTOM_BIOMETRIC_PROMPT)
             mSetFlagsRule.enableFlags(FLAG_CONSTRAINT_BP)
@@ -1266,6 +1291,21 @@
         }
 
     @Test
+    fun descriptionOverriddenByContentViewWithMoreOptionsButton() =
+        runGenericTest(
+            contentView = promptContentViewWithMoreOptionsButton,
+            description = "test description"
+        ) {
+            mSetFlagsRule.enableFlags(FLAG_CUSTOM_BIOMETRIC_PROMPT)
+            mSetFlagsRule.enableFlags(FLAG_CONSTRAINT_BP)
+            val contentView by collectLastValue(viewModel.contentView)
+            val description by collectLastValue(viewModel.description)
+
+            assertThat(description).isEqualTo("")
+            assertThat(contentView).isEqualTo(promptContentViewWithMoreOptionsButton)
+        }
+
+    @Test
     fun descriptionWithoutContentView() =
         runGenericTest(description = "test description") {
             mSetFlagsRule.enableFlags(FLAG_CUSTOM_BIOMETRIC_PROMPT)
@@ -1389,6 +1429,12 @@
             packageName = packageName,
         )
 
+        biometricStatusRepository.setFingerprintAcquiredStatus(
+            AcquiredFingerprintAuthenticationStatus(
+                AuthenticationReason.BiometricPromptAuthentication,
+                BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_UNKNOWN
+            )
+        )
         // put the view model in the initial authenticating state, unless explicitly skipped
         val startMode =
             when {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
index 2014755..238a76e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/SideFpsOverlayViewModelTest.kt
@@ -33,6 +33,7 @@
 import com.android.keyguard.KeyguardSecurityModel
 import com.android.keyguard.KeyguardUpdateMonitor
 import com.android.settingslib.Utils
+import com.android.systemui.Flags.FLAG_CONSTRAINT_BP
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.biometrics.FingerprintInteractiveToAuthProvider
 import com.android.systemui.biometrics.data.repository.FakeBiometricStatusRepository
@@ -55,6 +56,7 @@
 import com.android.systemui.classifier.FalsingCollector
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
 import com.android.systemui.deviceentry.domain.interactor.deviceEntryFingerprintAuthInteractor
 import com.android.systemui.display.data.repository.FakeDisplayRepository
 import com.android.systemui.keyguard.DismissCallbackRegistry
@@ -63,6 +65,8 @@
 import com.android.systemui.keyguard.data.repository.FakeTrustRepository
 import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
 import com.android.systemui.keyguard.domain.interactor.DeviceEntrySideFpsOverlayInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
 import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
 import com.android.systemui.keyguard.ui.viewmodel.SideFpsProgressBarViewModel
@@ -72,6 +76,8 @@
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.power.domain.interactor.powerInteractor
 import com.android.systemui.res.R
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
 import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
 import com.android.systemui.statusbar.phone.dozeServiceHost
 import com.android.systemui.statusbar.policy.KeyguardStateController
@@ -191,6 +197,9 @@
                 biometricSettingsRepository,
                 FakeSystemClock(),
                 keyguardUpdateMonitor,
+                { mock(DeviceEntryFingerprintAuthInteractor::class.java) },
+                { mock(KeyguardInteractor::class.java) },
+                { mock(KeyguardTransitionInteractor::class.java) },
                 testScope.backgroundScope,
             )
 
@@ -227,6 +236,8 @@
                 testScope.backgroundScope,
                 mContext,
                 deviceEntryFingerprintAuthRepository,
+                kosmos.fakeSceneContainerFlags,
+                kosmos.sceneInteractor,
                 primaryBouncerInteractor,
                 alternateBouncerInteractor,
                 keyguardUpdateMonitor
@@ -341,6 +352,7 @@
     @Test
     fun updatesOverlayViewParams_onDisplayRotationChange_xAlignedSensor() {
         testScope.runTest {
+            mSetFlagsRule.disableFlags(FLAG_CONSTRAINT_BP)
             setupTestConfiguration(
                 DeviceConfig.X_ALIGNED,
                 rotation = DisplayRotation.ROTATION_0,
@@ -382,6 +394,7 @@
     @Test
     fun updatesOverlayViewParams_onDisplayRotationChange_yAlignedSensor() {
         testScope.runTest {
+            mSetFlagsRule.disableFlags(FLAG_CONSTRAINT_BP)
             setupTestConfiguration(
                 DeviceConfig.Y_ALIGNED,
                 rotation = DisplayRotation.ROTATION_0,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnInteractorTest.kt
new file mode 100644
index 0000000..4949716
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnInteractorTest.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.bluetooth.qsdialog
+
+import android.bluetooth.BluetoothAdapter
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import kotlin.test.Test
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Rule
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyBoolean
+import org.mockito.Mock
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class BluetoothAutoOnInteractorTest : SysuiTestCase() {
+    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
+    private val testDispatcher = StandardTestDispatcher()
+    private val testScope = TestScope(testDispatcher)
+    private val bluetoothAdapter =
+        mock<BluetoothAdapter> {
+            var autoOn = false
+            whenever(isAutoOnEnabled).thenAnswer { autoOn }
+
+            whenever(setAutoOnEnabled(anyBoolean())).thenAnswer { invocation ->
+                autoOn = invocation.getArgument(0) as Boolean
+                autoOn
+            }
+        }
+    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
+    private lateinit var bluetoothAutoOnInteractor: BluetoothAutoOnInteractor
+
+    @Before
+    fun setUp() {
+        bluetoothAutoOnInteractor =
+            BluetoothAutoOnInteractor(
+                BluetoothAutoOnRepository(
+                    localBluetoothManager,
+                    bluetoothAdapter,
+                    testScope.backgroundScope,
+                    testDispatcher,
+                )
+            )
+    }
+
+    @Test
+    fun testSetEnabled_bluetoothAutoOnUnsupported_doNothing() {
+        testScope.runTest {
+            whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(false)
+
+            bluetoothAutoOnInteractor.setEnabled(true)
+            runCurrent()
+
+            assertFalse(bluetoothAdapter.isAutoOnEnabled)
+        }
+    }
+
+    @Test
+    fun testSetEnabled_bluetoothAutoOnSupported_setNewValue() {
+        testScope.runTest {
+            whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(true)
+
+            bluetoothAutoOnInteractor.setEnabled(true)
+            runCurrent()
+
+            assertTrue(bluetoothAdapter.isAutoOnEnabled)
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnRepositoryTest.kt
new file mode 100644
index 0000000..85e2a8d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothAutoOnRepositoryTest.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.bluetooth.qsdialog
+
+import android.bluetooth.BluetoothAdapter
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.settingslib.bluetooth.BluetoothEventManager
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+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.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class BluetoothAutoOnRepositoryTest : SysuiTestCase() {
+    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
+    private val testDispatcher = StandardTestDispatcher()
+    private val testScope = TestScope(testDispatcher)
+    @Mock private lateinit var bluetoothAdapter: BluetoothAdapter
+    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
+    @Mock private lateinit var eventManager: BluetoothEventManager
+
+    private lateinit var bluetoothAutoOnRepository: BluetoothAutoOnRepository
+
+    @Before
+    fun setUp() {
+        whenever(localBluetoothManager.eventManager).thenReturn(eventManager)
+        bluetoothAutoOnRepository =
+            BluetoothAutoOnRepository(
+                localBluetoothManager,
+                bluetoothAdapter,
+                testScope.backgroundScope,
+                testDispatcher,
+            )
+    }
+
+    @Test
+    fun testIsAutoOn_returnFalse() {
+        testScope.runTest {
+            whenever(bluetoothAdapter.isAutoOnEnabled).thenReturn(false)
+            val actualValue by collectLastValue(bluetoothAutoOnRepository.isAutoOn)
+
+            runCurrent()
+
+            assertThat(actualValue).isEqualTo(false)
+        }
+    }
+
+    @Test
+    fun testIsAutoOn_returnTrue() {
+        testScope.runTest {
+            whenever(bluetoothAdapter.isAutoOnEnabled).thenReturn(true)
+            val actualValue by collectLastValue(bluetoothAutoOnRepository.isAutoOn)
+
+            runCurrent()
+
+            assertThat(actualValue).isEqualTo(true)
+        }
+    }
+
+    @Test
+    fun testIsAutoOnSupported_returnTrue() {
+        testScope.runTest {
+            whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(true)
+            val actualValue = bluetoothAutoOnRepository.isAutoOnSupported()
+
+            runCurrent()
+
+            assertThat(actualValue).isEqualTo(true)
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothStateInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothStateInteractorTest.kt
new file mode 100644
index 0000000..a8f82ed
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothStateInteractorTest.kt
@@ -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.systemui.bluetooth.qsdialog
+
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import androidx.test.filters.SmallTest
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.systemui.SysuiTestCase
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.TestScope
+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.never
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when`
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
+class BluetoothStateInteractorTest : SysuiTestCase() {
+    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
+    private val testScope = TestScope()
+
+    private lateinit var bluetoothStateInteractor: BluetoothStateInteractor
+
+    @Mock private lateinit var bluetoothAdapter: LocalBluetoothAdapter
+    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
+    @Mock private lateinit var logger: BluetoothTileDialogLogger
+
+    @Before
+    fun setUp() {
+        bluetoothStateInteractor =
+            BluetoothStateInteractor(localBluetoothManager, logger, testScope.backgroundScope)
+        `when`(localBluetoothManager.bluetoothAdapter).thenReturn(bluetoothAdapter)
+    }
+
+    @Test
+    fun testGet_isBluetoothEnabled() {
+        testScope.runTest {
+            `when`(bluetoothAdapter.isEnabled).thenReturn(true)
+
+            assertThat(bluetoothStateInteractor.isBluetoothEnabled).isTrue()
+        }
+    }
+
+    @Test
+    fun testGet_isBluetoothDisabled() {
+        testScope.runTest {
+            `when`(bluetoothAdapter.isEnabled).thenReturn(false)
+
+            assertThat(bluetoothStateInteractor.isBluetoothEnabled).isFalse()
+        }
+    }
+
+    @Test
+    fun testSet_bluetoothEnabled() {
+        testScope.runTest {
+            `when`(bluetoothAdapter.isEnabled).thenReturn(false)
+
+            bluetoothStateInteractor.isBluetoothEnabled = true
+            verify(bluetoothAdapter).enable()
+            verify(logger)
+                .logBluetoothState(BluetoothStateStage.BLUETOOTH_STATE_VALUE_SET, true.toString())
+        }
+    }
+
+    @Test
+    fun testSet_bluetoothNoChange() {
+        testScope.runTest {
+            `when`(bluetoothAdapter.isEnabled).thenReturn(false)
+
+            bluetoothStateInteractor.isBluetoothEnabled = false
+            verify(bluetoothAdapter, never()).enable()
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegateTest.kt
new file mode 100644
index 0000000..12dfe97
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegateTest.kt
@@ -0,0 +1,336 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.bluetooth.qsdialog
+
+import android.graphics.drawable.Drawable
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import android.view.LayoutInflater
+import android.view.View
+import android.view.View.GONE
+import android.view.View.VISIBLE
+import android.view.ViewGroup.LayoutParams.MATCH_PARENT
+import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import androidx.test.filters.SmallTest
+import com.android.internal.logging.UiEventLogger
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.DialogTransitionAnimator
+import com.android.systemui.model.SysUiState
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.phone.SystemUIDialog
+import com.android.systemui.statusbar.phone.SystemUIDialogManager
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.time.FakeSystemClock
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.test.TestCoroutineScheduler
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
+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.ArgumentMatchers.anyBoolean
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.Mock
+import org.mockito.Mockito.`when`
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
+class BluetoothTileDialogDelegateTest : SysuiTestCase() {
+    companion object {
+        const val DEVICE_NAME = "device"
+        const val DEVICE_CONNECTION_SUMMARY = "active"
+        const val ENABLED = true
+        const val CONTENT_HEIGHT = WRAP_CONTENT
+    }
+
+    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
+
+    @Mock private lateinit var cachedBluetoothDevice: CachedBluetoothDevice
+
+    @Mock private lateinit var bluetoothTileDialogCallback: BluetoothTileDialogCallback
+
+    @Mock private lateinit var drawable: Drawable
+
+    @Mock private lateinit var uiEventLogger: UiEventLogger
+
+    @Mock private lateinit var logger: BluetoothTileDialogLogger
+
+    private val uiProperties =
+        BluetoothTileDialogViewModel.UiProperties.build(
+            isBluetoothEnabled = ENABLED,
+            isAutoOnToggleFeatureAvailable = ENABLED
+        )
+    @Mock private lateinit var sysuiDialogFactory: SystemUIDialog.Factory
+    @Mock private lateinit var dialogManager: SystemUIDialogManager
+    @Mock private lateinit var sysuiState: SysUiState
+    @Mock private lateinit var dialogTransitionAnimator: DialogTransitionAnimator
+
+    private val fakeSystemClock = FakeSystemClock()
+
+    private lateinit var scheduler: TestCoroutineScheduler
+    private lateinit var dispatcher: CoroutineDispatcher
+    private lateinit var testScope: TestScope
+    private lateinit var icon: Pair<Drawable, String>
+    private lateinit var mBluetoothTileDialogDelegate: BluetoothTileDialogDelegate
+    private lateinit var deviceItem: DeviceItem
+
+    @Before
+    fun setUp() {
+        scheduler = TestCoroutineScheduler()
+        dispatcher = UnconfinedTestDispatcher(scheduler)
+        testScope = TestScope(dispatcher)
+
+        whenever(sysuiState.setFlag(anyInt(), anyBoolean())).thenReturn(sysuiState)
+
+        mBluetoothTileDialogDelegate =
+            BluetoothTileDialogDelegate(
+                uiProperties,
+                CONTENT_HEIGHT,
+                ENABLED,
+                bluetoothTileDialogCallback,
+                {},
+                dispatcher,
+                fakeSystemClock,
+                uiEventLogger,
+                logger,
+                sysuiDialogFactory
+            )
+
+        whenever(sysuiDialogFactory.create(any(SystemUIDialog.Delegate::class.java))).thenAnswer {
+            SystemUIDialog(
+                mContext,
+                0,
+                SystemUIDialog.DEFAULT_DISMISS_ON_DEVICE_LOCK,
+                dialogManager,
+                sysuiState,
+                fakeBroadcastDispatcher,
+                dialogTransitionAnimator,
+                it.getArgument(0)
+            )
+        }
+
+        icon = Pair(drawable, DEVICE_NAME)
+        deviceItem =
+            DeviceItem(
+                type = DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE,
+                cachedBluetoothDevice = cachedBluetoothDevice,
+                deviceName = DEVICE_NAME,
+                connectionSummary = DEVICE_CONNECTION_SUMMARY,
+                iconWithDescription = icon,
+                background = null
+            )
+        `when`(cachedBluetoothDevice.isBusy).thenReturn(false)
+    }
+
+    @Test
+    fun testShowDialog_createRecyclerViewWithAdapter() {
+        val dialog = mBluetoothTileDialogDelegate.createDialog()
+        dialog.show()
+
+        val recyclerView = dialog.requireViewById<RecyclerView>(R.id.device_list)
+
+        assertThat(recyclerView).isNotNull()
+        assertThat(recyclerView.visibility).isEqualTo(VISIBLE)
+        assertThat(recyclerView.adapter).isNotNull()
+        assertThat(recyclerView.layoutManager is LinearLayoutManager).isTrue()
+        dialog.dismiss()
+    }
+
+    @Test
+    fun testShowDialog_displayBluetoothDevice() {
+        testScope.runTest {
+            val dialog = mBluetoothTileDialogDelegate.createDialog()
+            dialog.show()
+            fakeSystemClock.setElapsedRealtime(Long.MAX_VALUE)
+            mBluetoothTileDialogDelegate.onDeviceItemUpdated(
+                dialog,
+                listOf(deviceItem),
+                showSeeAll = false,
+                showPairNewDevice = false
+            )
+
+            val recyclerView = dialog.requireViewById<RecyclerView>(R.id.device_list)
+            val adapter = recyclerView?.adapter as BluetoothTileDialogDelegate.Adapter
+            assertThat(adapter.itemCount).isEqualTo(1)
+            assertThat(adapter.getItem(0).deviceName).isEqualTo(DEVICE_NAME)
+            assertThat(adapter.getItem(0).connectionSummary).isEqualTo(DEVICE_CONNECTION_SUMMARY)
+            assertThat(adapter.getItem(0).iconWithDescription).isEqualTo(icon)
+            dialog.dismiss()
+        }
+    }
+
+    @Test
+    fun testDeviceItemViewHolder_cachedDeviceNotBusy() {
+        deviceItem.isEnabled = true
+
+        val view =
+            LayoutInflater.from(mContext).inflate(R.layout.bluetooth_device_item, null, false)
+        val viewHolder =
+            mBluetoothTileDialogDelegate
+                .Adapter(bluetoothTileDialogCallback)
+                .DeviceItemViewHolder(view)
+        viewHolder.bind(deviceItem, bluetoothTileDialogCallback)
+        val container = view.requireViewById<View>(R.id.bluetooth_device_row)
+
+        assertThat(container).isNotNull()
+        assertThat(container.isEnabled).isTrue()
+        assertThat(container.hasOnClickListeners()).isTrue()
+    }
+
+    @Test
+    fun testDeviceItemViewHolder_cachedDeviceBusy() {
+        deviceItem.isEnabled = false
+
+        val view =
+            LayoutInflater.from(mContext).inflate(R.layout.bluetooth_device_item, null, false)
+        val viewHolder =
+            BluetoothTileDialogDelegate(
+                    uiProperties,
+                    CONTENT_HEIGHT,
+                    ENABLED,
+                    bluetoothTileDialogCallback,
+                    {},
+                    dispatcher,
+                    fakeSystemClock,
+                    uiEventLogger,
+                    logger,
+                    sysuiDialogFactory,
+                )
+                .Adapter(bluetoothTileDialogCallback)
+                .DeviceItemViewHolder(view)
+        viewHolder.bind(deviceItem, bluetoothTileDialogCallback)
+        val container = view.requireViewById<View>(R.id.bluetooth_device_row)
+
+        assertThat(container).isNotNull()
+        assertThat(container.isEnabled).isFalse()
+        assertThat(container.hasOnClickListeners()).isTrue()
+    }
+
+    @Test
+    fun testOnDeviceUpdated_hideSeeAll_showPairNew() {
+        testScope.runTest {
+            val dialog = mBluetoothTileDialogDelegate.createDialog()
+            dialog.show()
+            fakeSystemClock.setElapsedRealtime(Long.MAX_VALUE)
+            mBluetoothTileDialogDelegate.onDeviceItemUpdated(
+                dialog,
+                listOf(deviceItem),
+                showSeeAll = false,
+                showPairNewDevice = true
+            )
+
+            val seeAllButton = dialog.requireViewById<View>(R.id.see_all_button)
+            val pairNewButton = dialog.requireViewById<View>(R.id.pair_new_device_button)
+            val recyclerView = dialog.requireViewById<RecyclerView>(R.id.device_list)
+            val adapter = recyclerView?.adapter as BluetoothTileDialogDelegate.Adapter
+            val scrollViewContent = dialog.requireViewById<View>(R.id.scroll_view)
+
+            assertThat(seeAllButton).isNotNull()
+            assertThat(seeAllButton.visibility).isEqualTo(GONE)
+            assertThat(pairNewButton).isNotNull()
+            assertThat(pairNewButton.visibility).isEqualTo(VISIBLE)
+            assertThat(adapter.itemCount).isEqualTo(1)
+            assertThat(scrollViewContent.layoutParams.height).isEqualTo(WRAP_CONTENT)
+            dialog.dismiss()
+        }
+    }
+
+    @Test
+    fun testShowDialog_cachedHeightLargerThanMinHeight_displayFromCachedHeight() {
+        testScope.runTest {
+            val cachedHeight = Int.MAX_VALUE
+            val dialog =
+                BluetoothTileDialogDelegate(
+                        BluetoothTileDialogViewModel.UiProperties.build(ENABLED, ENABLED),
+                        cachedHeight,
+                        ENABLED,
+                        bluetoothTileDialogCallback,
+                        {},
+                        dispatcher,
+                        fakeSystemClock,
+                        uiEventLogger,
+                        logger,
+                        sysuiDialogFactory,
+                    )
+                    .createDialog()
+            dialog.show()
+            assertThat(dialog.requireViewById<View>(R.id.scroll_view).layoutParams.height)
+                .isEqualTo(cachedHeight)
+            dialog.dismiss()
+        }
+    }
+
+    @Test
+    fun testShowDialog_cachedHeightLessThanMinHeight_displayFromUiProperties() {
+        testScope.runTest {
+            val dialog =
+                BluetoothTileDialogDelegate(
+                        BluetoothTileDialogViewModel.UiProperties.build(ENABLED, ENABLED),
+                        MATCH_PARENT,
+                        ENABLED,
+                        bluetoothTileDialogCallback,
+                        {},
+                        dispatcher,
+                        fakeSystemClock,
+                        uiEventLogger,
+                        logger,
+                        sysuiDialogFactory,
+                    )
+                    .createDialog()
+            dialog.show()
+            assertThat(dialog.requireViewById<View>(R.id.scroll_view).layoutParams.height)
+                .isGreaterThan(MATCH_PARENT)
+            dialog.dismiss()
+        }
+    }
+
+    @Test
+    fun testShowDialog_bluetoothEnabled_autoOnToggleGone() {
+        testScope.runTest {
+            val dialog =
+                BluetoothTileDialogDelegate(
+                        BluetoothTileDialogViewModel.UiProperties.build(ENABLED, ENABLED),
+                        MATCH_PARENT,
+                        ENABLED,
+                        bluetoothTileDialogCallback,
+                        {},
+                        dispatcher,
+                        fakeSystemClock,
+                        uiEventLogger,
+                        logger,
+                        sysuiDialogFactory,
+                    )
+                    .createDialog()
+            dialog.show()
+            assertThat(
+                    dialog.requireViewById<View>(R.id.bluetooth_auto_on_toggle_layout).visibility
+                )
+                .isEqualTo(GONE)
+            dialog.dismiss()
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogRepositoryTest.kt
new file mode 100644
index 0000000..4aa6209
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogRepositoryTest.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.bluetooth.qsdialog
+
+import android.bluetooth.BluetoothAdapter
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import androidx.test.filters.SmallTest
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.systemui.SysuiTestCase
+import com.google.common.truth.Truth.assertThat
+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.`when`
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
+class BluetoothTileDialogRepositoryTest : SysuiTestCase() {
+
+    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
+
+    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
+
+    @Mock private lateinit var bluetoothAdapter: BluetoothAdapter
+
+    @Mock private lateinit var cachedDeviceManager: CachedBluetoothDeviceManager
+
+    @Mock private lateinit var cachedDevicesCopy: Collection<CachedBluetoothDevice>
+
+    private lateinit var repository: BluetoothTileDialogRepository
+
+    @Before
+    fun setUp() {
+        `when`(localBluetoothManager.cachedDeviceManager).thenReturn(cachedDeviceManager)
+        `when`(cachedDeviceManager.cachedDevicesCopy).thenReturn(cachedDevicesCopy)
+
+        repository = BluetoothTileDialogRepository(localBluetoothManager, bluetoothAdapter)
+    }
+
+    @Test
+    fun testCachedDevices_bluetoothOff_emptyList() {
+        `when`(bluetoothAdapter.isEnabled).thenReturn(false)
+
+        val result = repository.cachedDevices
+
+        assertThat(result).isEmpty()
+    }
+
+    @Test
+    fun testCachedDevices_bluetoothOn_returnDevice() {
+        `when`(bluetoothAdapter.isEnabled).thenReturn(true)
+
+        val result = repository.cachedDevices
+
+        assertThat(result).isEqualTo(cachedDevicesCopy)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt
new file mode 100644
index 0000000..6d99c5b
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt
@@ -0,0 +1,281 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.bluetooth.qsdialog
+
+import android.bluetooth.BluetoothAdapter
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import android.view.View
+import android.view.View.GONE
+import android.view.View.VISIBLE
+import android.widget.LinearLayout
+import androidx.test.filters.SmallTest
+import com.android.internal.logging.UiEventLogger
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.settingslib.flags.Flags
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.DialogTransitionAnimator
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.statusbar.phone.SystemUIDialog
+import com.android.systemui.util.FakeSharedPreferences
+import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.kotlin.getMutableStateFlow
+import com.android.systemui.util.mockito.any
+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 kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.test.TestCoroutineScheduler
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
+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.ArgumentMatchers
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.Mock
+import org.mockito.Mockito.anyBoolean
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
+class BluetoothTileDialogViewModelTest : SysuiTestCase() {
+
+    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
+    private val fakeSystemClock = FakeSystemClock()
+    private val backgroundExecutor = FakeExecutor(fakeSystemClock)
+
+    private lateinit var bluetoothTileDialogViewModel: BluetoothTileDialogViewModel
+
+    @Mock private lateinit var bluetoothStateInteractor: BluetoothStateInteractor
+
+    @Mock private lateinit var bluetoothAutoOnInteractor: BluetoothAutoOnInteractor
+
+    @Mock private lateinit var deviceItemInteractor: DeviceItemInteractor
+
+    @Mock private lateinit var activityStarter: ActivityStarter
+
+    @Mock private lateinit var mDialogTransitionAnimator: DialogTransitionAnimator
+
+    @Mock private lateinit var cachedBluetoothDevice: CachedBluetoothDevice
+
+    @Mock private lateinit var deviceItem: DeviceItem
+
+    @Mock private lateinit var uiEventLogger: UiEventLogger
+
+    @Mock private lateinit var bluetoothAdapter: BluetoothAdapter
+
+    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
+
+    @Mock
+    private lateinit var mBluetoothTileDialogDelegateDelegateFactory:
+        BluetoothTileDialogDelegate.Factory
+
+    @Mock private lateinit var bluetoothTileDialogDelegate: BluetoothTileDialogDelegate
+
+    @Mock private lateinit var sysuiDialog: SystemUIDialog
+
+    private val sharedPreferences = FakeSharedPreferences()
+
+    private lateinit var scheduler: TestCoroutineScheduler
+    private lateinit var dispatcher: CoroutineDispatcher
+    private lateinit var testScope: TestScope
+
+    @Before
+    fun setUp() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_BLUETOOTH_QS_TILE_DIALOG_AUTO_ON_TOGGLE)
+        scheduler = TestCoroutineScheduler()
+        dispatcher = UnconfinedTestDispatcher(scheduler)
+        testScope = TestScope(dispatcher)
+        bluetoothTileDialogViewModel =
+            BluetoothTileDialogViewModel(
+                deviceItemInteractor,
+                bluetoothStateInteractor,
+                // TODO(b/316822488): Create FakeBluetoothAutoOnInteractor.
+                BluetoothAutoOnInteractor(
+                    BluetoothAutoOnRepository(
+                        localBluetoothManager,
+                        bluetoothAdapter,
+                        testScope.backgroundScope,
+                        dispatcher
+                    )
+                ),
+                mDialogTransitionAnimator,
+                activityStarter,
+                uiEventLogger,
+                testScope.backgroundScope,
+                dispatcher,
+                dispatcher,
+                sharedPreferences,
+                mBluetoothTileDialogDelegateDelegateFactory
+            )
+        whenever(deviceItemInteractor.deviceItemUpdate).thenReturn(MutableSharedFlow())
+        whenever(bluetoothStateInteractor.bluetoothStateUpdate)
+            .thenReturn(MutableStateFlow(null).asStateFlow())
+        whenever(deviceItemInteractor.deviceItemUpdateRequest)
+            .thenReturn(MutableStateFlow(Unit).asStateFlow())
+        whenever(bluetoothStateInteractor.isBluetoothEnabled).thenReturn(true)
+        whenever(
+                mBluetoothTileDialogDelegateDelegateFactory.create(
+                    any(),
+                    anyInt(),
+                    ArgumentMatchers.anyBoolean(),
+                    any(),
+                    any()
+                )
+            )
+            .thenReturn(bluetoothTileDialogDelegate)
+        whenever(bluetoothTileDialogDelegate.createDialog()).thenReturn(sysuiDialog)
+        whenever(sysuiDialog.context).thenReturn(mContext)
+        whenever(bluetoothTileDialogDelegate.bluetoothStateToggle)
+            .thenReturn(getMutableStateFlow(false))
+        whenever(bluetoothTileDialogDelegate.deviceItemClick)
+            .thenReturn(getMutableStateFlow(deviceItem))
+        whenever(bluetoothTileDialogDelegate.contentHeight).thenReturn(getMutableStateFlow(0))
+        whenever(bluetoothTileDialogDelegate.bluetoothAutoOnToggle)
+            .thenReturn(getMutableStateFlow(false))
+    }
+
+    @Test
+    fun testShowDialog_noAnimation() {
+        testScope.runTest {
+            bluetoothTileDialogViewModel.showDialog(null)
+
+            verify(mDialogTransitionAnimator, never()).showFromView(any(), any(), any(), any())
+        }
+    }
+
+    @Test
+    fun testShowDialog_animated() {
+        testScope.runTest {
+            bluetoothTileDialogViewModel.showDialog(LinearLayout(mContext))
+
+            verify(mDialogTransitionAnimator).showFromView(any(), any(), nullable(), anyBoolean())
+        }
+    }
+
+    @Test
+    fun testShowDialog_animated_callInBackgroundThread() {
+        testScope.runTest {
+            backgroundExecutor.execute {
+                bluetoothTileDialogViewModel.showDialog(LinearLayout(mContext))
+
+                verify(mDialogTransitionAnimator)
+                    .showFromView(any(), any(), nullable(), anyBoolean())
+            }
+        }
+    }
+
+    @Test
+    fun testShowDialog_fetchDeviceItem() {
+        testScope.runTest {
+            bluetoothTileDialogViewModel.showDialog(null)
+
+            verify(deviceItemInteractor).deviceItemUpdate
+        }
+    }
+
+    @Test
+    fun testShowDialog_withBluetoothStateValue() {
+        testScope.runTest {
+            bluetoothTileDialogViewModel.showDialog(null)
+
+            verify(bluetoothStateInteractor).bluetoothStateUpdate
+        }
+    }
+
+    @Test
+    fun testStartSettingsActivity_activityLaunched_dialogDismissed() {
+        testScope.runTest {
+            whenever(deviceItem.cachedBluetoothDevice).thenReturn(cachedBluetoothDevice)
+            bluetoothTileDialogViewModel.showDialog(null)
+
+            val clickedView = View(context)
+            bluetoothTileDialogViewModel.onPairNewDeviceClicked(clickedView)
+
+            verify(uiEventLogger).log(BluetoothTileDialogUiEvent.PAIR_NEW_DEVICE_CLICKED)
+            verify(activityStarter).postStartActivityDismissingKeyguard(any(), anyInt(), nullable())
+        }
+    }
+
+    @Test
+    fun testBuildUiProperties_bluetoothOn_shouldHideAutoOn() {
+        testScope.runTest {
+            val actual =
+                BluetoothTileDialogViewModel.UiProperties.build(
+                    isBluetoothEnabled = true,
+                    isAutoOnToggleFeatureAvailable = true
+                )
+            assertThat(actual.autoOnToggleVisibility).isEqualTo(GONE)
+        }
+    }
+
+    @Test
+    fun testBuildUiProperties_bluetoothOff_shouldShowAutoOn() {
+        testScope.runTest {
+            val actual =
+                BluetoothTileDialogViewModel.UiProperties.build(
+                    isBluetoothEnabled = false,
+                    isAutoOnToggleFeatureAvailable = true
+                )
+            assertThat(actual.autoOnToggleVisibility).isEqualTo(VISIBLE)
+        }
+    }
+
+    @Test
+    fun testBuildUiProperties_bluetoothOff_autoOnFeatureUnavailable_shouldHideAutoOn() {
+        testScope.runTest {
+            val actual =
+                BluetoothTileDialogViewModel.UiProperties.build(
+                    isBluetoothEnabled = false,
+                    isAutoOnToggleFeatureAvailable = false
+                )
+            assertThat(actual.autoOnToggleVisibility).isEqualTo(GONE)
+        }
+    }
+
+    @Test
+    fun testIsAutoOnToggleFeatureAvailable_returnTrue() {
+        testScope.runTest {
+            whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(true)
+
+            val actual = bluetoothTileDialogViewModel.isAutoOnToggleFeatureAvailable()
+            assertThat(actual).isTrue()
+        }
+    }
+
+    @Test
+    fun testIsAutoOnToggleFeatureAvailable_returnFalse() {
+        testScope.runTest {
+            whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(false)
+
+            val actual = bluetoothTileDialogViewModel.isAutoOnToggleFeatureAvailable()
+            assertThat(actual).isFalse()
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactoryTest.kt
new file mode 100644
index 0000000..28cbcb4
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactoryTest.kt
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.bluetooth.qsdialog
+
+import android.bluetooth.BluetoothDevice
+import android.content.pm.PackageInfo
+import android.content.pm.PackageManager
+import android.media.AudioManager
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import androidx.test.filters.SmallTest
+import com.android.settingslib.bluetooth.BluetoothUtils
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.settingslib.flags.Flags
+import com.android.systemui.SysuiTestCase
+import com.google.common.truth.Truth.assertThat
+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.`when`
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
+class DeviceItemFactoryTest : SysuiTestCase() {
+    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
+
+    @Mock private lateinit var cachedDevice: CachedBluetoothDevice
+    @Mock private lateinit var bluetoothDevice: BluetoothDevice
+    @Mock private lateinit var packageManager: PackageManager
+
+    private val availableMediaDeviceItemFactory = AvailableMediaDeviceItemFactory()
+    private val connectedDeviceItemFactory = ConnectedDeviceItemFactory()
+    private val savedDeviceItemFactory = SavedDeviceItemFactory()
+
+    private val audioManager = context.getSystemService(AudioManager::class.java)!!
+
+    @Before
+    fun setup() {
+        `when`(cachedDevice.name).thenReturn(DEVICE_NAME)
+        `when`(cachedDevice.address).thenReturn(DEVICE_ADDRESS)
+        `when`(cachedDevice.device).thenReturn(bluetoothDevice)
+        `when`(cachedDevice.connectionSummary).thenReturn(CONNECTION_SUMMARY)
+
+        context.setMockPackageManager(packageManager)
+    }
+
+    @Test
+    fun testAvailableMediaDeviceItemFactory_createFromCachedDevice() {
+        val deviceItem = availableMediaDeviceItemFactory.create(context, cachedDevice)
+
+        assertDeviceItem(deviceItem, DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE)
+    }
+
+    @Test
+    fun testConnectedDeviceItemFactory_createFromCachedDevice() {
+        val deviceItem = connectedDeviceItemFactory.create(context, cachedDevice)
+
+        assertDeviceItem(deviceItem, DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
+    }
+
+    @Test
+    fun testSavedDeviceItemFactory_createFromCachedDevice() {
+        val deviceItem = savedDeviceItemFactory.create(context, cachedDevice)
+
+        assertDeviceItem(deviceItem, DeviceItemType.SAVED_BLUETOOTH_DEVICE)
+        assertThat(deviceItem.background).isNotNull()
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testSavedFactory_isFilterMatched_bondedAndNotConnected_returnsTrue() {
+        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(cachedDevice.isConnected).thenReturn(false)
+
+        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isTrue()
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testSavedFactory_isFilterMatched_connected_returnsFalse() {
+        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(cachedDevice.isConnected).thenReturn(true)
+
+        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isFalse()
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testSavedFactory_isFilterMatched_notBonded_returnsFalse() {
+        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_NONE)
+        `when`(cachedDevice.isConnected).thenReturn(false)
+
+        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isFalse()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testSavedFactory_isFilterMatched_exclusivelyManaged_returnsFalse() {
+        val exclusiveManagerName =
+            BluetoothUtils.getExclusiveManagers().firstOrNull() ?: FAKE_EXCLUSIVE_MANAGER_NAME
+        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
+            .thenReturn(exclusiveManagerName.toByteArray())
+        `when`(packageManager.getPackageInfo(exclusiveManagerName, 0)).thenReturn(PackageInfo())
+        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(cachedDevice.isConnected).thenReturn(false)
+
+        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isFalse()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testSavedFactory_isFilterMatched_noExclusiveManager_returnsTrue() {
+        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(cachedDevice.isConnected).thenReturn(false)
+
+        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isTrue()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testSavedFactory_isFilterMatched_notAllowedExclusiveManager_returnsTrue() {
+        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
+            .thenReturn(FAKE_EXCLUSIVE_MANAGER_NAME.toByteArray())
+        `when`(packageManager.getPackageInfo(FAKE_EXCLUSIVE_MANAGER_NAME, 0))
+            .thenReturn(PackageInfo())
+        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(cachedDevice.isConnected).thenReturn(false)
+
+        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isTrue()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testSavedFactory_isFilterMatched_uninstalledExclusiveManager_returnsTrue() {
+        val exclusiveManagerName =
+            BluetoothUtils.getExclusiveManagers().firstOrNull() ?: FAKE_EXCLUSIVE_MANAGER_NAME
+        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
+            .thenReturn(exclusiveManagerName.toByteArray())
+        `when`(packageManager.getPackageInfo(exclusiveManagerName, 0))
+            .thenThrow(PackageManager.NameNotFoundException("Test!"))
+        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(cachedDevice.isConnected).thenReturn(false)
+
+        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isTrue()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testSavedFactory_isFilterMatched_notExclusivelyManaged_notBonded_returnsFalse() {
+        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_NONE)
+        `when`(cachedDevice.isConnected).thenReturn(false)
+
+        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isFalse()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testSavedFactory_isFilterMatched_notExclusivelyManaged_connected_returnsFalse() {
+        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(cachedDevice.isConnected).thenReturn(true)
+
+        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isFalse()
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testConnectedFactory_isFilterMatched_bondedAndConnected_returnsTrue() {
+        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(bluetoothDevice.isConnected).thenReturn(true)
+        audioManager.setMode(AudioManager.MODE_NORMAL)
+
+        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isTrue()
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testConnectedFactory_isFilterMatched_notConnected_returnsFalse() {
+        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(bluetoothDevice.isConnected).thenReturn(false)
+        audioManager.setMode(AudioManager.MODE_NORMAL)
+
+        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isFalse()
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testConnectedFactory_isFilterMatched_notBonded_returnsFalse() {
+        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_NONE)
+        `when`(bluetoothDevice.isConnected).thenReturn(true)
+        audioManager.setMode(AudioManager.MODE_NORMAL)
+
+        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isFalse()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testConnectedFactory_isFilterMatched_exclusivelyManaged_returnsFalse() {
+        val exclusiveManagerName =
+            BluetoothUtils.getExclusiveManagers().firstOrNull() ?: FAKE_EXCLUSIVE_MANAGER_NAME
+        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
+            .thenReturn(exclusiveManagerName.toByteArray())
+        `when`(packageManager.getPackageInfo(exclusiveManagerName, 0)).thenReturn(PackageInfo())
+        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(bluetoothDevice.isConnected).thenReturn(true)
+        audioManager.setMode(AudioManager.MODE_NORMAL)
+
+        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isFalse()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testConnectedFactory_isFilterMatched_noExclusiveManager_returnsTrue() {
+        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(bluetoothDevice.isConnected).thenReturn(true)
+        audioManager.setMode(AudioManager.MODE_NORMAL)
+
+        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isTrue()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testConnectedFactory_isFilterMatched_notAllowedExclusiveManager_returnsTrue() {
+        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
+            .thenReturn(FAKE_EXCLUSIVE_MANAGER_NAME.toByteArray())
+        `when`(packageManager.getPackageInfo(FAKE_EXCLUSIVE_MANAGER_NAME, 0))
+            .thenReturn(PackageInfo())
+        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(bluetoothDevice.isConnected).thenReturn(true)
+        audioManager.setMode(AudioManager.MODE_NORMAL)
+
+        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isTrue()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testConnectedFactory_isFilterMatched_uninstalledExclusiveManager_returnsTrue() {
+        val exclusiveManagerName =
+            BluetoothUtils.getExclusiveManagers().firstOrNull() ?: FAKE_EXCLUSIVE_MANAGER_NAME
+        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
+            .thenReturn(exclusiveManagerName.toByteArray())
+        `when`(packageManager.getPackageInfo(exclusiveManagerName, 0))
+            .thenThrow(PackageManager.NameNotFoundException("Test!"))
+        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(bluetoothDevice.isConnected).thenReturn(true)
+        audioManager.setMode(AudioManager.MODE_NORMAL)
+
+        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isTrue()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testConnectedFactory_isFilterMatched_notExclusivelyManaged_notBonded_returnsFalse() {
+        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_NONE)
+        `when`(bluetoothDevice.isConnected).thenReturn(true)
+        audioManager.setMode(AudioManager.MODE_NORMAL)
+
+        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isFalse()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
+    fun testConnectedFactory_isFilterMatched_notExclusivelyManaged_notConnected_returnsFalse() {
+        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
+        `when`(bluetoothDevice.isConnected).thenReturn(false)
+        audioManager.setMode(AudioManager.MODE_NORMAL)
+
+        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
+            .isFalse()
+    }
+
+    private fun assertDeviceItem(deviceItem: DeviceItem?, deviceItemType: DeviceItemType) {
+        assertThat(deviceItem).isNotNull()
+        assertThat(deviceItem!!.type).isEqualTo(deviceItemType)
+        assertThat(deviceItem.cachedBluetoothDevice).isEqualTo(cachedDevice)
+        assertThat(deviceItem.deviceName).isEqualTo(DEVICE_NAME)
+        assertThat(deviceItem.connectionSummary).isEqualTo(CONNECTION_SUMMARY)
+    }
+
+    companion object {
+        const val DEVICE_NAME = "DeviceName"
+        const val CONNECTION_SUMMARY = "ConnectionSummary"
+        private const val FAKE_EXCLUSIVE_MANAGER_NAME = "com.fake.name"
+        private const val DEVICE_ADDRESS = "04:52:C7:0B:D8:3C"
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractorTest.kt
new file mode 100644
index 0000000..eb735cb
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractorTest.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.bluetooth.qsdialog
+
+import android.bluetooth.BluetoothAdapter
+import android.bluetooth.BluetoothDevice
+import android.content.Context
+import android.media.AudioManager
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import androidx.test.filters.SmallTest
+import com.android.internal.logging.UiEventLogger
+import com.android.settingslib.bluetooth.CachedBluetoothDevice
+import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.util.time.FakeSystemClock
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
+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.verify
+import org.mockito.Mockito.`when`
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
+class DeviceItemInteractorTest : SysuiTestCase() {
+
+    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
+
+    @Mock private lateinit var bluetoothTileDialogRepository: BluetoothTileDialogRepository
+
+    @Mock private lateinit var cachedDevice1: CachedBluetoothDevice
+
+    @Mock private lateinit var cachedDevice2: CachedBluetoothDevice
+
+    @Mock private lateinit var device1: BluetoothDevice
+
+    @Mock private lateinit var device2: BluetoothDevice
+
+    @Mock private lateinit var deviceItem1: DeviceItem
+
+    @Mock private lateinit var deviceItem2: DeviceItem
+
+    @Mock private lateinit var audioManager: AudioManager
+
+    @Mock private lateinit var adapter: BluetoothAdapter
+
+    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
+
+    @Mock private lateinit var uiEventLogger: UiEventLogger
+
+    @Mock private lateinit var logger: BluetoothTileDialogLogger
+
+    private val fakeSystemClock = FakeSystemClock()
+
+    private lateinit var interactor: DeviceItemInteractor
+
+    private lateinit var dispatcher: CoroutineDispatcher
+
+    private lateinit var testScope: TestScope
+
+    @Before
+    fun setUp() {
+        dispatcher = UnconfinedTestDispatcher()
+        testScope = TestScope(dispatcher)
+        interactor =
+            DeviceItemInteractor(
+                bluetoothTileDialogRepository,
+                audioManager,
+                adapter,
+                localBluetoothManager,
+                fakeSystemClock,
+                uiEventLogger,
+                logger,
+                testScope.backgroundScope,
+                dispatcher
+            )
+
+        `when`(deviceItem1.cachedBluetoothDevice).thenReturn(cachedDevice1)
+        `when`(deviceItem2.cachedBluetoothDevice).thenReturn(cachedDevice2)
+        `when`(cachedDevice1.address).thenReturn("ADDRESS")
+        `when`(cachedDevice1.device).thenReturn(device1)
+        `when`(cachedDevice2.device).thenReturn(device2)
+        `when`(bluetoothTileDialogRepository.cachedDevices)
+            .thenReturn(listOf(cachedDevice1, cachedDevice2))
+    }
+
+    @Test
+    fun testUpdateDeviceItems_noCachedDevice_returnEmpty() {
+        testScope.runTest {
+            `when`(bluetoothTileDialogRepository.cachedDevices).thenReturn(emptyList())
+            interactor.setDeviceItemFactoryListForTesting(
+                listOf(createFactory({ true }, deviceItem1))
+            )
+
+            val latest by collectLastValue(interactor.deviceItemUpdate)
+            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
+
+            assertThat(latest).isEqualTo(emptyList<DeviceItem>())
+        }
+    }
+
+    @Test
+    fun testUpdateDeviceItems_hasCachedDevice_filterNotMatch_returnEmpty() {
+        testScope.runTest {
+            `when`(bluetoothTileDialogRepository.cachedDevices).thenReturn(listOf(cachedDevice1))
+            interactor.setDeviceItemFactoryListForTesting(
+                listOf(createFactory({ false }, deviceItem1))
+            )
+
+            val latest by collectLastValue(interactor.deviceItemUpdate)
+            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
+
+            assertThat(latest).isEqualTo(emptyList<DeviceItem>())
+        }
+    }
+
+    @Test
+    fun testUpdateDeviceItems_hasCachedDevice_filterMatch_returnDeviceItem() {
+        testScope.runTest {
+            `when`(bluetoothTileDialogRepository.cachedDevices).thenReturn(listOf(cachedDevice1))
+            interactor.setDeviceItemFactoryListForTesting(
+                listOf(createFactory({ true }, deviceItem1))
+            )
+
+            val latest by collectLastValue(interactor.deviceItemUpdate)
+            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
+
+            assertThat(latest).isEqualTo(listOf(deviceItem1))
+        }
+    }
+
+    @Test
+    fun testUpdateDeviceItems_hasCachedDevice_filterMatch_returnMultipleDeviceItem() {
+        testScope.runTest {
+            `when`(adapter.mostRecentlyConnectedDevices).thenReturn(null)
+            interactor.setDeviceItemFactoryListForTesting(
+                listOf(createFactory({ false }, deviceItem1), createFactory({ true }, deviceItem2))
+            )
+
+            val latest by collectLastValue(interactor.deviceItemUpdate)
+            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
+
+            assertThat(latest).isEqualTo(listOf(deviceItem2, deviceItem2))
+        }
+    }
+
+    @Test
+    fun testUpdateDeviceItems_sortByDisplayPriority() {
+        testScope.runTest {
+            `when`(adapter.mostRecentlyConnectedDevices).thenReturn(null)
+            interactor.setDeviceItemFactoryListForTesting(
+                listOf(
+                    createFactory({ cachedDevice -> cachedDevice.device == device1 }, deviceItem1),
+                    createFactory({ cachedDevice -> cachedDevice.device == device2 }, deviceItem2)
+                )
+            )
+            interactor.setDisplayPriorityForTesting(
+                listOf(
+                    DeviceItemType.SAVED_BLUETOOTH_DEVICE,
+                    DeviceItemType.CONNECTED_BLUETOOTH_DEVICE
+                )
+            )
+            `when`(deviceItem1.type).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
+            `when`(deviceItem2.type).thenReturn(DeviceItemType.SAVED_BLUETOOTH_DEVICE)
+
+            val latest by collectLastValue(interactor.deviceItemUpdate)
+            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
+
+            assertThat(latest).isEqualTo(listOf(deviceItem2, deviceItem1))
+        }
+    }
+
+    @Test
+    fun testUpdateDeviceItems_sameType_sortByRecentlyConnected() {
+        testScope.runTest {
+            `when`(adapter.mostRecentlyConnectedDevices).thenReturn(listOf(device2, device1))
+            interactor.setDeviceItemFactoryListForTesting(
+                listOf(
+                    createFactory({ cachedDevice -> cachedDevice.device == device1 }, deviceItem1),
+                    createFactory({ cachedDevice -> cachedDevice.device == device2 }, deviceItem2)
+                )
+            )
+            interactor.setDisplayPriorityForTesting(
+                listOf(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
+            )
+            `when`(deviceItem1.type).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
+            `when`(deviceItem2.type).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
+
+            val latest by collectLastValue(interactor.deviceItemUpdate)
+            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
+
+            assertThat(latest).isEqualTo(listOf(deviceItem2, deviceItem1))
+        }
+    }
+
+    @Test
+    fun testUpdateDeviceItemOnClick_connectedMedia_setActive() {
+        testScope.runTest {
+            `when`(deviceItem1.type).thenReturn(DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE)
+
+            interactor.updateDeviceItemOnClick(deviceItem1)
+
+            verify(cachedDevice1).setActive()
+            verify(logger)
+                .logDeviceClick(
+                    cachedDevice1.address,
+                    DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE
+                )
+        }
+    }
+
+    @Test
+    fun testUpdateDeviceItemOnClick_activeMedia_disconnect() {
+        testScope.runTest {
+            `when`(deviceItem1.type).thenReturn(DeviceItemType.ACTIVE_MEDIA_BLUETOOTH_DEVICE)
+
+            interactor.updateDeviceItemOnClick(deviceItem1)
+
+            verify(cachedDevice1).disconnect()
+            verify(logger)
+                .logDeviceClick(cachedDevice1.address, DeviceItemType.ACTIVE_MEDIA_BLUETOOTH_DEVICE)
+        }
+    }
+
+    @Test
+    fun testUpdateDeviceItemOnClick_connectedOtherDevice_disconnect() {
+        testScope.runTest {
+            `when`(deviceItem1.type).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
+
+            interactor.updateDeviceItemOnClick(deviceItem1)
+
+            verify(cachedDevice1).disconnect()
+            verify(logger)
+                .logDeviceClick(cachedDevice1.address, DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
+        }
+    }
+
+    @Test
+    fun testUpdateDeviceItemOnClick_saved_connect() {
+        testScope.runTest {
+            `when`(deviceItem1.type).thenReturn(DeviceItemType.SAVED_BLUETOOTH_DEVICE)
+
+            interactor.updateDeviceItemOnClick(deviceItem1)
+
+            verify(cachedDevice1).connect()
+            verify(logger)
+                .logDeviceClick(cachedDevice1.address, DeviceItemType.SAVED_BLUETOOTH_DEVICE)
+        }
+    }
+
+    private fun createFactory(
+        isFilterMatchFunc: (CachedBluetoothDevice) -> Boolean,
+        deviceItem: DeviceItem
+    ): DeviceItemFactory {
+        return object : DeviceItemFactory() {
+            override fun isFilterMatched(
+                context: Context,
+                cachedDevice: CachedBluetoothDevice,
+                audioManager: AudioManager?
+            ) = isFilterMatchFunc(cachedDevice)
+
+            override fun create(context: Context, cachedDevice: CachedBluetoothDevice) = deviceItem
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
index 45d20dc..8e5ddc7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java
@@ -27,6 +27,7 @@
 
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
+import android.view.KeyEvent;
 import android.view.MotionEvent;
 
 import androidx.test.filters.SmallTest;
@@ -202,6 +203,36 @@
     }
 
     @Test
+    public void testPassThroughEnterKeyEvent() {
+        KeyEvent enterDown = KeyEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER,
+                0, 0, 0, 0, 0, 0, 0, "");
+        KeyEvent enterUp = KeyEvent.obtain(0, 0, MotionEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER, 0,
+                0, 0, 0, 0, 0, 0, "");
+
+        mFalsingCollector.onKeyEvent(enterDown);
+        verify(mFalsingDataProvider, never()).onKeyEvent(any(KeyEvent.class));
+
+        mFalsingCollector.onKeyEvent(enterUp);
+        verify(mFalsingDataProvider, times(1)).onKeyEvent(enterUp);
+    }
+
+    @Test
+    public void testAvoidAKeyEvent() {
+        // Arbitrarily chose the "A" key, as it is not currently allowlisted. If this key is
+        // allowlisted in the future, please choose another key that will not be collected.
+        KeyEvent aKeyDown = KeyEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_A,
+                0, 0, 0, 0, 0, 0, 0, "");
+        KeyEvent aKeyUp = KeyEvent.obtain(0, 0, MotionEvent.ACTION_UP, KeyEvent.KEYCODE_A, 0,
+                0, 0, 0, 0, 0, 0, "");
+
+        mFalsingCollector.onKeyEvent(aKeyDown);
+        verify(mFalsingDataProvider, never()).onKeyEvent(any(KeyEvent.class));
+
+        mFalsingCollector.onKeyEvent(aKeyUp);
+        verify(mFalsingDataProvider, never()).onKeyEvent(any(KeyEvent.class));
+    }
+
+    @Test
     public void testPassThroughGesture() {
         MotionEvent down = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
         MotionEvent up = MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 0, 0, 0);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
index 0353f87..057b0a1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java
@@ -27,6 +27,7 @@
 import android.hardware.devicestate.DeviceStateManager.FoldStateListener;
 import android.testing.AndroidTestingRunner;
 import android.util.DisplayMetrics;
+import android.view.KeyEvent;
 import android.view.MotionEvent;
 
 import androidx.test.filters.SmallTest;
@@ -282,6 +283,22 @@
     }
 
     @Test
+    public void test_isFromKeyboard_disallowedKey_false() {
+        KeyEvent eventDown = KeyEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_A, 0,
+                0, 0, 0, 0, 0, 0, "");
+        KeyEvent eventUp = KeyEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_A, 0, 0,
+                0, 0, 0, 0, 0, "");
+
+        //events have not come in yet
+        assertThat(mDataProvider.isFromKeyboard()).isFalse();
+
+        mDataProvider.onKeyEvent(eventDown);
+        mDataProvider.onKeyEvent(eventUp);
+        assertThat(mDataProvider.isFromKeyboard()).isTrue();
+        mDataProvider.onSessionEnd();
+    }
+
+    @Test
     public void test_IsFromTrackpad() {
         MotionEvent motionEventOrigin = appendTrackpadDownEvent(0, 0);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/TimeLimitedInputEventBufferTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/TimeLimitedInputEventBufferTest.java
new file mode 100644
index 0000000..ad7afa3
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/TimeLimitedInputEventBufferTest.java
@@ -0,0 +1,130 @@
+/*
+ * 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.classifier;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import android.testing.AndroidTestingRunner;
+import android.view.InputEvent;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+public class TimeLimitedInputEventBufferTest extends SysuiTestCase {
+
+    private static final long MAX_AGE_MS = 100;
+
+    private TimeLimitedInputEventBuffer<InputEvent> mBuffer;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mBuffer = new TimeLimitedInputEventBuffer<>(MAX_AGE_MS);
+    }
+
+    @After
+    public void tearDown() {
+        for (InputEvent inputEvent : mBuffer) {
+            inputEvent.recycle();
+        }
+        mBuffer.clear();
+    }
+
+    @Test
+    public void testMotionEventAllEventsRetained() {
+        MotionEvent eventA = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
+        MotionEvent eventB = MotionEvent.obtain(0, 1, MotionEvent.ACTION_MOVE, 0, 0, 0);
+        MotionEvent eventC = MotionEvent.obtain(0, 2, MotionEvent.ACTION_MOVE, 0, 0, 0);
+        MotionEvent eventD = MotionEvent.obtain(0, 3, MotionEvent.ACTION_UP, 0, 0, 0);
+
+        mBuffer.add(eventA);
+        mBuffer.add(eventB);
+        mBuffer.add(eventC);
+        mBuffer.add(eventD);
+
+        assertThat(mBuffer.size(), is(4));
+    }
+
+    @Test
+    public void testMotionEventOlderEventsRemoved() {
+        MotionEvent eventA = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
+        MotionEvent eventB = MotionEvent.obtain(0, 1, MotionEvent.ACTION_MOVE, 0, 0, 0);
+        MotionEvent eventC = MotionEvent.obtain(
+                0, MAX_AGE_MS + 1, MotionEvent.ACTION_MOVE, 0, 0, 0);
+        MotionEvent eventD = MotionEvent.obtain(
+                0, MAX_AGE_MS + 2, MotionEvent.ACTION_UP, 0, 0, 0);
+
+        mBuffer.add(eventA);
+        mBuffer.add(eventB);
+        assertThat(mBuffer.size(), is(2));
+
+        mBuffer.add(eventC);
+        mBuffer.add(eventD);
+        assertThat(mBuffer.size(), is(2));
+
+        assertThat(mBuffer.get(0), is(eventC));
+        assertThat(mBuffer.get(1), is(eventD));
+    }
+
+    @Test
+    public void testKeyEventAllEventsRetained() {
+        KeyEvent eventA = KeyEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_A, 0, 0,
+                0, 0, 0, 0, 0, "");
+        KeyEvent eventB = KeyEvent.obtain(0, 3, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A, 0, 0, 0, 0,
+                0, 0, 0, "");
+
+        mBuffer.add(eventA);
+        mBuffer.add(eventB);
+
+        assertThat(mBuffer.size(), is(2));
+    }
+
+    @Test
+    public void testKeyEventOlderEventsRemoved() {
+        KeyEvent eventA = KeyEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_A, 0, 0,
+                0, 0, 0, 0, 0, "");
+        KeyEvent eventB = KeyEvent.obtain(0, 1, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A, 0, 0, 0, 0,
+                0, 0, 0, "");
+        KeyEvent eventC = KeyEvent.obtain(0, MAX_AGE_MS + 1, MotionEvent.ACTION_DOWN,
+                KeyEvent.KEYCODE_A, 0, 0, 0, 0, 0, 0, 0, "");
+        KeyEvent eventD = KeyEvent.obtain(0, MAX_AGE_MS + 2, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A,
+                0, 0, 0, 0, 0, 0, 0, "");
+
+        mBuffer.add(eventA);
+        mBuffer.add(eventB);
+        assertThat(mBuffer.size(), is(2));
+
+        mBuffer.add(eventC);
+        mBuffer.add(eventD);
+        assertThat(mBuffer.size(), is(2));
+
+        assertThat(mBuffer.get(0), is(eventC));
+        assertThat(mBuffer.get(1), is(eventD));
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/TimeLimitedMotionEventBufferTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/TimeLimitedMotionEventBufferTest.java
deleted file mode 100644
index 901196f..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/TimeLimitedMotionEventBufferTest.java
+++ /dev/null
@@ -1,92 +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.classifier;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import android.testing.AndroidTestingRunner;
-import android.view.MotionEvent;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-public class TimeLimitedMotionEventBufferTest extends SysuiTestCase {
-
-    private static final long MAX_AGE_MS = 100;
-
-    private TimeLimitedMotionEventBuffer mBuffer;
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-        mBuffer = new TimeLimitedMotionEventBuffer(MAX_AGE_MS);
-    }
-
-    @After
-    public void tearDown() {
-        for (MotionEvent motionEvent : mBuffer) {
-            motionEvent.recycle();
-        }
-        mBuffer.clear();
-    }
-
-    @Test
-    public void testAllEventsRetained() {
-        MotionEvent eventA = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
-        MotionEvent eventB = MotionEvent.obtain(0, 1, MotionEvent.ACTION_MOVE, 0, 0, 0);
-        MotionEvent eventC = MotionEvent.obtain(0, 2, MotionEvent.ACTION_MOVE, 0, 0, 0);
-        MotionEvent eventD = MotionEvent.obtain(0, 3, MotionEvent.ACTION_UP, 0, 0, 0);
-
-        mBuffer.add(eventA);
-        mBuffer.add(eventB);
-        mBuffer.add(eventC);
-        mBuffer.add(eventD);
-
-        assertThat(mBuffer.size(), is(4));
-    }
-
-    @Test
-    public void testOlderEventsRemoved() {
-        MotionEvent eventA = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
-        MotionEvent eventB = MotionEvent.obtain(0, 1, MotionEvent.ACTION_MOVE, 0, 0, 0);
-        MotionEvent eventC = MotionEvent.obtain(
-                0, MAX_AGE_MS + 1, MotionEvent.ACTION_MOVE, 0, 0, 0);
-        MotionEvent eventD = MotionEvent.obtain(
-                0, MAX_AGE_MS + 2, MotionEvent.ACTION_UP, 0, 0, 0);
-
-        mBuffer.add(eventA);
-        mBuffer.add(eventB);
-        assertThat(mBuffer.size(), is(2));
-
-        mBuffer.add(eventC);
-        mBuffer.add(eventD);
-        assertThat(mBuffer.size(), is(2));
-
-        assertThat(mBuffer.get(0), is(eventC));
-        assertThat(mBuffer.get(1), is(eventD));
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/complication/DreamClockTimeComplicationTest.java b/packages/SystemUI/tests/src/com/android/systemui/complication/DreamClockTimeComplicationTest.java
index cbbbe52..b9aa4c6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/complication/DreamClockTimeComplicationTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/complication/DreamClockTimeComplicationTest.java
@@ -38,7 +38,6 @@
 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;
 
@@ -140,18 +139,4 @@
         assertThat(viewHolder.getView()).isEqualTo(mView);
         assertThat(viewHolder.getLayoutParams()).isEqualTo(mLayoutParams);
     }
-
-    @Test
-    public void testClick_logUiEvent() {
-        final DreamClockTimeComplication.DreamClockTimeViewController controller =
-                new DreamClockTimeComplication.DreamClockTimeViewController(mView, mUiEventLogger);
-        controller.onViewAttached();
-
-        final ArgumentCaptor<View.OnClickListener> clickListenerCaptor =
-                ArgumentCaptor.forClass(View.OnClickListener.class);
-        verify(mView).setOnClickListener(clickListenerCaptor.capture());
-
-        clickListenerCaptor.getValue().onClick(mView);
-        verify(mUiEventLogger).log(DreamOverlayUiEvent.DREAM_CLOCK_TAPPED);
-    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt
index f36f032..4684b80 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt
@@ -221,8 +221,42 @@
             assertThat(message).isNull()
         }
 
+    @Test
+    fun noMessage_fpErrorsWhileDozing() =
+        testScope.runTest {
+            val message by collectLastValue(underTest.message)
+
+            givenOnOccludingApp(true)
+            givenFingerprintAllowed(true)
+            keyguardRepository.setIsDozing(true)
+            runCurrent()
+
+            // ERROR message
+            fingerprintAuthRepository.setAuthenticationStatus(
+                ErrorFingerprintAuthenticationStatus(
+                    FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE,
+                    "testError",
+                )
+            )
+            assertThat(message).isNull()
+
+            // HELP message
+            fingerprintAuthRepository.setAuthenticationStatus(
+                HelpFingerprintAuthenticationStatus(
+                    FingerprintManager.FINGERPRINT_ACQUIRED_PARTIAL,
+                    "testHelp",
+                )
+            )
+            assertThat(message).isNull()
+
+            // FAIL message
+            fingerprintAuthRepository.setAuthenticationStatus(FailFingerprintAuthenticationStatus)
+            assertThat(message).isNull()
+        }
+
     private fun givenOnOccludingApp(isOnOccludingApp: Boolean) {
         powerRepository.setInteractive(true)
+        keyguardRepository.setIsDozing(false)
         keyguardRepository.setKeyguardOccluded(isOnOccludingApp)
         keyguardRepository.setKeyguardShowing(isOnOccludingApp)
         keyguardRepository.setDreaming(false)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/ui/viewmodel/UdfpsAccessibilityOverlayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/ui/viewmodel/UdfpsAccessibilityOverlayViewModelTest.kt
index 9b8cf59..6a0462b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/ui/viewmodel/UdfpsAccessibilityOverlayViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/ui/viewmodel/UdfpsAccessibilityOverlayViewModelTest.kt
@@ -122,7 +122,6 @@
         fingerprintPropertyRepository.supportsUdfps()
         biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
         deviceEntryFingerprintAuthRepository.setIsRunning(true)
-        deviceEntryRepository.setUnlocked(false)
 
         // Lockscreen
         keyguardTransitionRepository.sendTransitionStep(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt
index 806930d..68d49c7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/display/data/repository/DisplayRepositoryTest.kt
@@ -22,6 +22,7 @@
 import android.testing.TestableLooper
 import android.view.Display
 import android.view.Display.TYPE_EXTERNAL
+import android.view.Display.TYPE_INTERNAL
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.FlowValue
@@ -427,6 +428,35 @@
             assertThat(display!!.type).isEqualTo(TYPE_EXTERNAL)
         }
 
+    @Test
+    fun defaultDisplayOff_changes() =
+        testScope.runTest {
+            val defaultDisplayOff by latestDefaultDisplayOffFlowValue()
+            setDisplays(
+                listOf(
+                    display(
+                        type = TYPE_INTERNAL,
+                        id = Display.DEFAULT_DISPLAY,
+                        state = Display.STATE_OFF
+                    )
+                )
+            )
+            displayListener.value.onDisplayChanged(Display.DEFAULT_DISPLAY)
+            assertThat(defaultDisplayOff).isTrue()
+
+            setDisplays(
+                listOf(
+                    display(
+                        type = TYPE_INTERNAL,
+                        id = Display.DEFAULT_DISPLAY,
+                        state = Display.STATE_ON
+                    )
+                )
+            )
+            displayListener.value.onDisplayChanged(Display.DEFAULT_DISPLAY)
+            assertThat(defaultDisplayOff).isFalse()
+        }
+
     private fun Iterable<Display>.ids(): List<Int> = map { it.displayId }
 
     // Wrapper to capture the displayListener.
@@ -436,6 +466,13 @@
         return flowValue
     }
 
+    // Wrapper to capture the displayListener.
+    private fun TestScope.latestDefaultDisplayOffFlowValue(): FlowValue<Boolean?> {
+        val flowValue = collectLastValue(displayRepository.defaultDisplayOff)
+        captureAddedRemovedListener()
+        return flowValue
+    }
+
     private fun TestScope.lastPendingDisplay(): FlowValue<DisplayRepository.PendingDisplay?> {
         val flowValue = collectLastValue(displayRepository.pendingDisplay)
         captureAddedRemovedListener()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
index 7311f4a..e7caf00 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
@@ -41,6 +41,8 @@
 import com.android.systemui.DejankUtils;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.phone.DozeParameters;
+import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.time.FakeSystemClock;
 import com.android.systemui.util.wakelock.WakeLockFake;
 
 import org.junit.After;
@@ -69,6 +71,7 @@
     private Handler mHandler;
     private HandlerThread mHandlerThread;
     private DozeUi mDozeUi;
+    private FakeExecutor mFakeExecutor;
 
     @Before
     public void setUp() throws Exception {
@@ -80,9 +83,9 @@
         mHandlerThread.start();
         mWakeLock = new WakeLockFake();
         mHandler = mHandlerThread.getThreadHandler();
-
+        mFakeExecutor = new FakeExecutor(new FakeSystemClock());
         mDozeUi = new DozeUi(mContext, mAlarmManager, mWakeLock, mHost, mHandler,
-                mDozeParameters, mDozeLog);
+                mDozeParameters, mFakeExecutor, mDozeLog);
         mDozeUi.setDozeMachine(mMachine);
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java
index 1c6f251..a127631 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/DreamOverlayTouchMonitorTest.java
@@ -32,6 +32,7 @@
 import android.testing.AndroidTestingRunner;
 import android.util.Pair;
 import android.view.GestureDetector;
+import android.view.IWindowManager;
 import android.view.InputEvent;
 import android.view.MotionEvent;
 
@@ -83,11 +84,14 @@
         private final GestureDetector.OnGestureListener mGestureListener;
         private final DisplayHelper mDisplayHelper;
         private final FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock());
+        private final FakeExecutor mBackgroundExecutor = new FakeExecutor(new FakeSystemClock());
         private final Rect mDisplayBounds = Mockito.mock(Rect.class);
+        private final IWindowManager mIWindowManager;
 
         Environment(Set<DreamTouchHandler> handlers) {
             mLifecycle = Mockito.mock(Lifecycle.class);
             mLifecycleOwner = Mockito.mock(LifecycleOwner.class);
+            mIWindowManager = Mockito.mock(IWindowManager.class);
 
             mInputFactory = Mockito.mock(InputSessionComponent.Factory.class);
             final InputSessionComponent inputComponent = Mockito.mock(InputSessionComponent.class);
@@ -100,8 +104,8 @@
             mDisplayHelper = Mockito.mock(DisplayHelper.class);
             when(mDisplayHelper.getMaxBounds(anyInt(), anyInt()))
                     .thenReturn(mDisplayBounds);
-            mMonitor = new DreamOverlayTouchMonitor(mExecutor, mLifecycle, mInputFactory,
-                    mDisplayHelper, handlers);
+            mMonitor = new DreamOverlayTouchMonitor(mExecutor, mBackgroundExecutor,
+                    mLifecycle, mInputFactory, mDisplayHelper, handlers, mIWindowManager, 0);
             mMonitor.init();
 
             final ArgumentCaptor<LifecycleObserver> lifecycleObserverCaptor =
@@ -163,7 +167,8 @@
         environment.publishInputEvent(initialEvent);
 
         // Verify display bounds passed into TouchHandler#getTouchInitiationRegion
-        verify(touchHandler).getTouchInitiationRegion(eq(environment.getDisplayBounds()), any());
+        verify(touchHandler).getTouchInitiationRegion(
+                eq(environment.getDisplayBounds()), any(), any());
         final ArgumentCaptor<DreamTouchHandler.TouchSession> touchSessionArgumentCaptor =
                 ArgumentCaptor.forClass(DreamTouchHandler.TouchSession.class);
         verify(touchHandler).onSessionStart(touchSessionArgumentCaptor.capture());
@@ -182,7 +187,7 @@
             final Region region = (Region) invocation.getArguments()[1];
             region.set(touchArea);
             return null;
-        }).when(touchHandler).getTouchInitiationRegion(any(), any());
+        }).when(touchHandler).getTouchInitiationRegion(any(), any(), any());
 
         final Environment environment = new Environment(Stream.of(touchHandler)
                 .collect(Collectors.toCollection(HashSet::new)));
@@ -211,7 +216,7 @@
             final Region region = (Region) invocation.getArguments()[1];
             region.set(touchArea);
             return null;
-        }).when(touchHandler).getTouchInitiationRegion(any(), any());
+        }).when(touchHandler).getTouchInitiationRegion(any(), any(), any());
 
         final Environment environment = new Environment(Stream.of(touchHandler, unzonedTouchHandler)
                 .collect(Collectors.toCollection(HashSet::new)));
@@ -264,7 +269,7 @@
 
         // Make sure there is no active session.
         verify(touchHandler, never()).onSessionStart(any());
-        verify(touchHandler, never()).getTouchInitiationRegion(any(), any());
+        verify(touchHandler, never()).getTouchInitiationRegion(any(), any(), any());
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardUnlockAnimationControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardUnlockAnimationControllerTest.kt
index 51828c9..6ebda4d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardUnlockAnimationControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardUnlockAnimationControllerTest.kt
@@ -14,6 +14,7 @@
 import android.view.SyncRtSurfaceTransactionApplier
 import android.view.View
 import android.view.ViewRootImpl
+import android.view.WindowManager
 import androidx.test.filters.SmallTest
 import com.android.keyguard.KeyguardViewController
 import com.android.systemui.Flags
@@ -52,6 +53,8 @@
     private lateinit var keyguardUnlockAnimationController: KeyguardUnlockAnimationController
 
     @Mock
+    private lateinit var windowManager: WindowManager
+    @Mock
     private lateinit var keyguardViewMediator: KeyguardViewMediator
     @Mock
     private lateinit var keyguardStateController: KeyguardStateController
@@ -99,7 +102,8 @@
     fun setUp() {
         MockitoAnnotations.initMocks(this)
         keyguardUnlockAnimationController = KeyguardUnlockAnimationController(
-            context, keyguardStateController, { keyguardViewMediator }, keyguardViewController,
+            windowManager, context.resources,
+            keyguardStateController, { keyguardViewMediator }, keyguardViewController,
             featureFlags, { biometricUnlockController }, statusBarStateController,
             notificationShadeWindowController, powerManager, wallpaperManager
         )
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 272b488..11ec417f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
@@ -306,28 +306,6 @@
 
     @Test
     @TestableLooper.RunWithLooper(setAsMainLooper = true)
-    public void testRaceCondition_doNotRegisterCentralSurfacesImmediately() {
-        create(false);
-
-        // GIVEN central surfaces is not registered with KeyguardViewMediator, but a call to enable
-        // keyguard comes in
-        mViewMediator.onSystemReady();
-        mViewMediator.setKeyguardEnabled(true);
-        TestableLooper.get(this).processAllMessages();
-
-        // If this step has been reached, then system ui has not crashed. Now register
-        // CentralSurfaces
-        assertFalse(mViewMediator.isShowingAndNotOccluded());
-        register();
-        TestableLooper.get(this).moveTimeForward(100);
-        TestableLooper.get(this).processAllMessages();
-
-        // THEN keyguard is shown
-        assertTrue(mViewMediator.isShowingAndNotOccluded());
-    }
-
-    @Test
-    @TestableLooper.RunWithLooper(setAsMainLooper = true)
     public void onLockdown_showKeyguard_evenIfKeyguardIsNotEnabledExternally() {
         // GIVEN keyguard is not enabled and isn't showing
         mViewMediator.onSystemReady();
@@ -1206,11 +1184,6 @@
     }
 
     private void createAndStartViewMediator(boolean orderUnlockAndWake) {
-        create(orderUnlockAndWake);
-        register();
-    }
-
-    private void create(boolean orderUnlockAndWake) {
         mContext.getOrCreateTestableResources().addOverride(
                 com.android.internal.R.bool.config_orderUnlockAndWake, orderUnlockAndWake);
 
@@ -1262,9 +1235,7 @@
                 mKeyguardInteractor,
                 mock(WindowManagerOcclusionManager.class));
         mViewMediator.start();
-    }
 
-    private void register() {
         mViewMediator.registerCentralSurfaces(mCentralSurfaces, null, null, null, null, null);
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt
index 8700001..53560d7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt
@@ -35,14 +35,16 @@
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.keyguard.shared.model.TransitionStep
 import com.android.systemui.keyguard.util.KeyguardTransitionRunner
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
 import com.google.common.truth.Truth.assertThat
 import java.math.BigDecimal
 import java.math.RoundingMode
 import java.util.UUID
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.dropWhile
 import kotlinx.coroutines.flow.launchIn
 import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.test.TestScope
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
 import org.junit.After
@@ -54,6 +56,9 @@
 @RunWith(AndroidJUnit4::class)
 @FlakyTest(bugId = 270760395)
 class KeyguardTransitionRepositoryTest : SysuiTestCase() {
+    val kosmos = testKosmos()
+
+    private val testScope = kosmos.testScope
 
     private lateinit var underTest: KeyguardTransitionRepository
     private lateinit var oldWtfHandler: TerribleFailureHandler
@@ -62,7 +67,7 @@
 
     @Before
     fun setUp() {
-        underTest = KeyguardTransitionRepositoryImpl()
+        underTest = KeyguardTransitionRepositoryImpl(Dispatchers.Main)
         wtfHandler = WtfHandler()
         oldWtfHandler = Log.setWtfHandler(wtfHandler)
         runner = KeyguardTransitionRunner(underTest)
@@ -75,7 +80,7 @@
 
     @Test
     fun startTransitionRunsAnimatorToCompletion() =
-        TestScope().runTest {
+        testScope.runTest {
             val steps = mutableListOf<TransitionStep>()
             val job = underTest.transition(AOD, LOCKSCREEN).onEach { steps.add(it) }.launchIn(this)
 
@@ -91,7 +96,7 @@
 
     @Test
     fun startingSecondTransitionWillCancelTheFirstTransitionAndUseLastValue() =
-        TestScope().runTest {
+        testScope.runTest {
             val steps = mutableListOf<TransitionStep>()
             val job = underTest.transition(AOD, LOCKSCREEN).onEach { steps.add(it) }.launchIn(this)
             runner.startTransition(
@@ -126,7 +131,7 @@
 
     @Test
     fun startingSecondTransitionWillCancelTheFirstTransitionAndUseReset() =
-        TestScope().runTest {
+        testScope.runTest {
             val steps = mutableListOf<TransitionStep>()
             val job = underTest.transition(AOD, LOCKSCREEN).onEach { steps.add(it) }.launchIn(this)
             runner.startTransition(
@@ -161,7 +166,7 @@
 
     @Test
     fun startingSecondTransitionWillCancelTheFirstTransitionAndUseReverse() =
-        TestScope().runTest {
+        testScope.runTest {
             val steps = mutableListOf<TransitionStep>()
             val job = underTest.transition(AOD, LOCKSCREEN).onEach { steps.add(it) }.launchIn(this)
             runner.startTransition(
@@ -196,7 +201,7 @@
 
     @Test
     fun nullAnimatorEnablesManualControlWithUpdateTransition() =
-        TestScope().runTest {
+        testScope.runTest {
             val steps = mutableListOf<TransitionStep>()
             val job = underTest.transition(AOD, LOCKSCREEN).onEach { steps.add(it) }.launchIn(this)
 
@@ -228,7 +233,7 @@
 
     @Test
     fun startingSecondManualTransitionWillCancelPreviousManualTransition() =
-        TestScope().runTest {
+        testScope.runTest {
             // Drop initial steps from OFF which are sent in the constructor
             val steps = mutableListOf<TransitionStep>()
             val job =
@@ -274,7 +279,7 @@
 
     @Test
     fun startingSecondTransitionWillCancelPreviousManualTransition() =
-        TestScope().runTest {
+        testScope.runTest {
             // Drop initial steps from OFF which are sent in the constructor
             val steps = mutableListOf<TransitionStep>()
             val job =
@@ -328,42 +333,44 @@
     }
 
     @Test
-    fun attemptToManuallyUpdateTransitionAfterFINISHEDstateThrowsException() {
-        val uuid =
-            underTest.startTransition(
-                TransitionInfo(
-                    ownerName = OWNER_NAME,
-                    from = AOD,
-                    to = LOCKSCREEN,
-                    animator = null,
+    fun attemptToManuallyUpdateTransitionAfterFINISHEDstateThrowsException() =
+        testScope.runTest {
+            val uuid =
+                underTest.startTransition(
+                    TransitionInfo(
+                        ownerName = OWNER_NAME,
+                        from = AOD,
+                        to = LOCKSCREEN,
+                        animator = null,
+                    )
                 )
-            )
 
-        checkNotNull(uuid).let {
-            underTest.updateTransition(it, 1f, TransitionState.FINISHED)
-            underTest.updateTransition(it, 0.5f, TransitionState.RUNNING)
+            checkNotNull(uuid).let {
+                underTest.updateTransition(it, 1f, TransitionState.FINISHED)
+                underTest.updateTransition(it, 0.5f, TransitionState.RUNNING)
+            }
+            assertThat(wtfHandler.failed).isTrue()
         }
-        assertThat(wtfHandler.failed).isTrue()
-    }
 
     @Test
-    fun attemptToManuallyUpdateTransitionAfterCANCELEDstateThrowsException() {
-        val uuid =
-            underTest.startTransition(
-                TransitionInfo(
-                    ownerName = OWNER_NAME,
-                    from = AOD,
-                    to = LOCKSCREEN,
-                    animator = null,
+    fun attemptToManuallyUpdateTransitionAfterCANCELEDstateThrowsException() =
+        testScope.runTest {
+            val uuid =
+                underTest.startTransition(
+                    TransitionInfo(
+                        ownerName = OWNER_NAME,
+                        from = AOD,
+                        to = LOCKSCREEN,
+                        animator = null,
+                    )
                 )
-            )
 
-        checkNotNull(uuid).let {
-            underTest.updateTransition(it, 0.2f, TransitionState.CANCELED)
-            underTest.updateTransition(it, 0.5f, TransitionState.RUNNING)
+            checkNotNull(uuid).let {
+                underTest.updateTransition(it, 0.2f, TransitionState.CANCELED)
+                underTest.updateTransition(it, 0.5f, TransitionState.RUNNING)
+            }
+            assertThat(wtfHandler.failed).isTrue()
         }
-        assertThat(wtfHandler.failed).isTrue()
-    }
 
     private fun listWithStep(
         step: BigDecimal,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractorTest.kt
index cb8c40c..9266af4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/DeviceEntrySideFpsOverlayInteractorTest.kt
@@ -31,20 +31,25 @@
 import com.android.systemui.coroutines.collectLastValue
 import com.android.systemui.coroutines.collectValues
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
 import com.android.systemui.keyguard.DismissCallbackRegistry
 import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
 import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository
 import com.android.systemui.keyguard.data.repository.FakeTrustRepository
+import com.android.systemui.kosmos.testScope
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.res.R
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
+import com.android.systemui.scene.shared.model.Scenes
 import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
 import com.android.systemui.statusbar.policy.KeyguardStateController
+import com.android.systemui.testKosmos
 import com.android.systemui.user.domain.interactor.SelectedUserInteractor
 import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.time.FakeSystemClock
 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.runCurrent
 import kotlinx.coroutines.test.runTest
@@ -68,6 +73,8 @@
     @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
     @Mock private lateinit var mSelectedUserInteractor: SelectedUserInteractor
 
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
     private val bouncerRepository = FakeKeyguardBouncerRepository()
     private val biometricSettingsRepository = FakeBiometricSettingsRepository()
     private val deviceEntryFingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository()
@@ -77,11 +84,11 @@
 
     private lateinit var underTest: DeviceEntrySideFpsOverlayInteractor
 
-    private val testScope = TestScope(StandardTestDispatcher())
-
     @Before
     fun setup() {
         mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
+        kosmos.fakeSceneContainerFlags.enabled = false
+
         primaryBouncerInteractor =
             PrimaryBouncerInteractor(
                 bouncerRepository,
@@ -99,6 +106,7 @@
                 mSelectedUserInteractor,
                 faceAuthInteractor
             )
+
         alternateBouncerInteractor =
             AlternateBouncerInteractor(
                 mock(StatusBarStateController::class.java),
@@ -108,13 +116,19 @@
                 biometricSettingsRepository,
                 FakeSystemClock(),
                 keyguardUpdateMonitor,
+                { mock(DeviceEntryFingerprintAuthInteractor::class.java) },
+                { mock(KeyguardInteractor::class.java) },
+                { mock(KeyguardTransitionInteractor::class.java) },
                 testScope.backgroundScope,
             )
+
         underTest =
             DeviceEntrySideFpsOverlayInteractor(
                 testScope.backgroundScope,
                 mContext,
                 deviceEntryFingerprintAuthRepository,
+                kosmos.fakeSceneContainerFlags,
+                kosmos.sceneInteractor,
                 primaryBouncerInteractor,
                 alternateBouncerInteractor,
                 keyguardUpdateMonitor
@@ -134,7 +148,7 @@
                 fpsDetectionRunning = true,
                 isUnlockingWithFpAllowed = true
             )
-            assertThat(showIndicatorForDeviceEntry).isEqualTo(true)
+            assertThat(showIndicatorForDeviceEntry).isTrue()
         }
 
     @Test
@@ -150,7 +164,63 @@
                 fpsDetectionRunning = true,
                 isUnlockingWithFpAllowed = true
             )
-            assertThat(showIndicatorForDeviceEntry).isEqualTo(false)
+            assertThat(showIndicatorForDeviceEntry).isFalse()
+        }
+
+    @Test
+    fun updatesShowIndicatorForDeviceEntry_onBouncerSceneActive() =
+        testScope.runTest {
+            kosmos.fakeSceneContainerFlags.enabled = true
+            underTest =
+                DeviceEntrySideFpsOverlayInteractor(
+                    testScope.backgroundScope,
+                    mContext,
+                    deviceEntryFingerprintAuthRepository,
+                    kosmos.fakeSceneContainerFlags,
+                    kosmos.sceneInteractor,
+                    primaryBouncerInteractor,
+                    alternateBouncerInteractor,
+                    keyguardUpdateMonitor
+                )
+
+            val showIndicatorForDeviceEntry by
+                collectLastValue(underTest.showIndicatorForDeviceEntry)
+            runCurrent()
+
+            updateBouncerScene(
+                isActive = true,
+                fpsDetectionRunning = true,
+                isUnlockingWithFpAllowed = true
+            )
+            assertThat(showIndicatorForDeviceEntry).isTrue()
+        }
+
+    @Test
+    fun updatesShowIndicatorForDeviceEntry_onBouncerSceneInactive() =
+        testScope.runTest {
+            kosmos.fakeSceneContainerFlags.enabled = true
+            underTest =
+                DeviceEntrySideFpsOverlayInteractor(
+                    testScope.backgroundScope,
+                    mContext,
+                    deviceEntryFingerprintAuthRepository,
+                    kosmos.fakeSceneContainerFlags,
+                    kosmos.sceneInteractor,
+                    primaryBouncerInteractor,
+                    alternateBouncerInteractor,
+                    keyguardUpdateMonitor
+                )
+
+            val showIndicatorForDeviceEntry by
+                collectLastValue(underTest.showIndicatorForDeviceEntry)
+            runCurrent()
+
+            updateBouncerScene(
+                isActive = false,
+                fpsDetectionRunning = true,
+                isUnlockingWithFpAllowed = true
+            )
+            assertThat(showIndicatorForDeviceEntry).isFalse()
         }
 
     @Test
@@ -166,7 +236,7 @@
                 fpsDetectionRunning = false,
                 isUnlockingWithFpAllowed = true
             )
-            assertThat(showIndicatorForDeviceEntry).isEqualTo(false)
+            assertThat(showIndicatorForDeviceEntry).isFalse()
         }
     }
 
@@ -183,7 +253,39 @@
                 fpsDetectionRunning = true,
                 isUnlockingWithFpAllowed = false
             )
-            assertThat(showIndicatorForDeviceEntry).isEqualTo(false)
+            assertThat(showIndicatorForDeviceEntry).isFalse()
+        }
+    }
+
+    @Test
+    fun updatesShowIndicatorForDeviceEntry_fromBouncerScene_whenFpsDetectionNotRunning() {
+        testScope.runTest {
+            val showIndicatorForDeviceEntry by
+                collectLastValue(underTest.showIndicatorForDeviceEntry)
+            runCurrent()
+
+            updateBouncerScene(
+                isActive = true,
+                fpsDetectionRunning = false,
+                isUnlockingWithFpAllowed = true
+            )
+            assertThat(showIndicatorForDeviceEntry).isFalse()
+        }
+    }
+
+    @Test
+    fun updatesShowIndicatorForDeviceEntry_fromBouncerScene_onUnlockingWithFpDisallowed() {
+        testScope.runTest {
+            val showIndicatorForDeviceEntry by
+                collectLastValue(underTest.showIndicatorForDeviceEntry)
+            runCurrent()
+
+            updateBouncerScene(
+                isActive = true,
+                fpsDetectionRunning = true,
+                isUnlockingWithFpAllowed = false
+            )
+            assertThat(showIndicatorForDeviceEntry).isFalse()
         }
     }
 
@@ -200,7 +302,7 @@
                 fpsDetectionRunning = true,
                 isUnlockingWithFpAllowed = true
             )
-            assertThat(showIndicatorForDeviceEntry).isEqualTo(false)
+            assertThat(showIndicatorForDeviceEntry).isFalse()
         }
     }
 
@@ -212,10 +314,10 @@
             runCurrent()
 
             bouncerRepository.setAlternateVisible(true)
-            assertThat(showIndicatorForDeviceEntry).isEqualTo(true)
+            assertThat(showIndicatorForDeviceEntry).isTrue()
 
             bouncerRepository.setAlternateVisible(false)
-            assertThat(showIndicatorForDeviceEntry).isEqualTo(false)
+            assertThat(showIndicatorForDeviceEntry).isFalse()
         }
 
     @Test
@@ -262,4 +364,25 @@
             true
         )
     }
+
+    private fun TestScope.updateBouncerScene(
+        isActive: Boolean,
+        fpsDetectionRunning: Boolean,
+        isUnlockingWithFpAllowed: Boolean,
+    ) {
+        kosmos.sceneInteractor.changeScene(
+            if (isActive) Scenes.Bouncer else Scenes.Lockscreen,
+            "reason"
+        )
+
+        whenever(keyguardUpdateMonitor.isFingerprintDetectionRunning)
+            .thenReturn(fpsDetectionRunning)
+        whenever(keyguardUpdateMonitor.isUnlockingWithFingerprintAllowed)
+            .thenReturn(isUnlockingWithFpAllowed)
+        mContext.orCreateTestableResources.addOverride(
+            R.bool.config_show_sidefps_hint_on_bouncer,
+            true
+        )
+        runCurrent()
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorTest.kt
index 7bef01a..0a7e72c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractorTest.kt
@@ -48,6 +48,7 @@
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.power.domain.interactor.PowerInteractor
 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
@@ -73,13 +74,17 @@
         }
 
     private val testScope = kosmos.testScope
-    private val underTest = kosmos.fromAodTransitionInteractor
+    private lateinit var underTest: FromAodTransitionInteractor
 
-    private val powerInteractor = kosmos.powerInteractor
-    private val transitionRepository = kosmos.fakeKeyguardTransitionRepository
+    private lateinit var powerInteractor: PowerInteractor
+    private lateinit var transitionRepository: FakeKeyguardTransitionRepository
 
     @Before
     fun setup() {
+        powerInteractor = kosmos.powerInteractor
+        transitionRepository = kosmos.fakeKeyguardTransitionRepository
+        underTest = kosmos.fromAodTransitionInteractor
+
         underTest.start()
 
         // Transition to AOD and set the power interactor asleep.
@@ -283,4 +288,16 @@
             assertThat(transitionRepository)
                 .startedTransition(from = KeyguardState.AOD, to = KeyguardState.GONE)
         }
+
+    @Test
+    fun testTransitionToOccluded_onWake() =
+        testScope.runTest {
+            kosmos.fakeKeyguardRepository.setKeyguardOccluded(true)
+            powerInteractor.setAwakeForTest()
+            runCurrent()
+
+            // Waking up from AOD while occluded should transition to OCCLUDED.
+            assertThat(transitionRepository)
+                .startedTransition(from = KeyguardState.AOD, to = KeyguardState.OCCLUDED)
+        }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
index 258dbf3..cded2a4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
@@ -51,6 +51,7 @@
 import com.android.systemui.keyguard.shared.model.TransitionState
 import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.power.domain.interactor.PowerInteractor
 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
@@ -77,13 +78,17 @@
         }
 
     private val testScope = kosmos.testScope
-    private val underTest = kosmos.fromDozingTransitionInteractor
+    private lateinit var underTest: FromDozingTransitionInteractor
 
-    private val powerInteractor = kosmos.powerInteractor
-    private val transitionRepository = kosmos.fakeKeyguardTransitionRepository
+    private lateinit var powerInteractor: PowerInteractor
+    private lateinit var transitionRepository: FakeKeyguardTransitionRepository
 
     @Before
     fun setup() {
+        powerInteractor = kosmos.powerInteractor
+        transitionRepository = kosmos.fakeKeyguardTransitionRepository
+        underTest = kosmos.fromDozingTransitionInteractor
+
         underTest.start()
 
         // Transition to DOZING and set the power interactor asleep.
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt
index c3e24d5..1ec7874 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt
@@ -37,17 +37,14 @@
 import com.android.systemui.shade.data.repository.FlingInfo
 import com.android.systemui.shade.data.repository.fakeShadeRepository
 import com.android.systemui.testKosmos
-import com.android.systemui.util.mockito.any
 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 org.mockito.Mockito.never
 import org.mockito.Mockito.reset
 import org.mockito.Mockito.spy
-import org.mockito.Mockito.verify
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
@@ -125,7 +122,7 @@
     fun testTransitionsToGone_whenDismissFlingWhileDismissable_flagEnabled() =
         testScope.runTest {
             underTest.start()
-            verify(transitionRepository, never()).startTransition(any())
+            assertThatRepository(transitionRepository).noTransitionsStarted()
 
             keyguardRepository.setKeyguardDismissible(true)
             runCurrent()
@@ -146,7 +143,7 @@
     fun testDoesNotTransitionToGone_whenDismissFlingWhileDismissable_flagDisabled() =
         testScope.runTest {
             underTest.start()
-            verify(transitionRepository, never()).startTransition(any())
+            assertThatRepository(transitionRepository).noTransitionsStarted()
 
             keyguardRepository.setKeyguardDismissible(true)
             runCurrent()
@@ -163,7 +160,7 @@
     fun testDoesNotTransitionToGone_whenDismissFling_emitsNull() =
         testScope.runTest {
             underTest.start()
-            verify(transitionRepository, never()).startTransition(any())
+            assertThatRepository(transitionRepository).noTransitionsStarted()
 
             keyguardRepository.setKeyguardDismissible(true)
             runCurrent()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/InWindowLauncherUnlockAnimationInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/InWindowLauncherUnlockAnimationInteractorTest.kt
index 49f7565..c782e9d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/InWindowLauncherUnlockAnimationInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/InWindowLauncherUnlockAnimationInteractorTest.kt
@@ -21,6 +21,7 @@
 import com.android.systemui.SysUITestModule
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.TestMocksModule
+import com.android.systemui.biometrics.domain.BiometricsDomainLayerModule
 import com.android.systemui.coroutines.collectValues
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.keyguard.data.repository.FakeKeyguardSurfaceBehindRepository
@@ -441,6 +442,7 @@
         modules =
             [
                 SysUITestModule::class,
+                BiometricsDomainLayerModule::class,
             ]
     )
     interface TestComponent {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractorTest.kt
deleted file mode 100644
index 8a77ed2..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractorTest.kt
+++ /dev/null
@@ -1,224 +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.
- */
-
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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 androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectValues
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
-import com.android.systemui.keyguard.shared.model.KeyguardState
-import com.android.systemui.keyguard.shared.model.TransitionState
-import com.android.systemui.kosmos.testScope
-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.statusbar.domain.interactor.keyguardOcclusionInteractor
-import com.android.systemui.testKosmos
-import com.google.common.truth.Truth.assertThat
-import junit.framework.Assert.assertFalse
-import junit.framework.Assert.assertTrue
-import kotlin.test.Test
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.runner.RunWith
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class KeyguardOcclusionInteractorTest : SysuiTestCase() {
-    private val kosmos = testKosmos()
-    private val testScope = kosmos.testScope
-    private val underTest = kosmos.keyguardOcclusionInteractor
-    private val powerInteractor = kosmos.powerInteractor
-    private val transitionRepository = kosmos.fakeKeyguardTransitionRepository
-
-    @Test
-    fun testTransitionFromPowerGesture_whileGoingToSleep_isTrue() =
-        testScope.runTest {
-            powerInteractor.setAwakeForTest()
-            transitionRepository.sendTransitionSteps(
-                from = KeyguardState.LOCKSCREEN,
-                to = KeyguardState.AOD,
-                testScope = testScope,
-                throughTransitionState = TransitionState.RUNNING
-            )
-
-            powerInteractor.onCameraLaunchGestureDetected()
-            runCurrent()
-
-            assertTrue(underTest.shouldTransitionFromPowerButtonGesture())
-        }
-
-    @Test
-    fun testTransitionFromPowerGesture_whileAsleep_isTrue() =
-        testScope.runTest {
-            powerInteractor.setAwakeForTest()
-            transitionRepository.sendTransitionSteps(
-                from = KeyguardState.LOCKSCREEN,
-                to = KeyguardState.AOD,
-                testScope = testScope,
-            )
-
-            powerInteractor.onCameraLaunchGestureDetected()
-            runCurrent()
-
-            assertTrue(underTest.shouldTransitionFromPowerButtonGesture())
-        }
-
-    @Test
-    fun testTransitionFromPowerGesture_whileWaking_isFalse() =
-        testScope.runTest {
-            powerInteractor.setAwakeForTest()
-            transitionRepository.sendTransitionSteps(
-                from = KeyguardState.LOCKSCREEN,
-                to = KeyguardState.AOD,
-                testScope = testScope,
-            )
-            transitionRepository.sendTransitionSteps(
-                from = KeyguardState.AOD,
-                to = KeyguardState.LOCKSCREEN,
-                testScope = testScope,
-                throughTransitionState = TransitionState.RUNNING
-            )
-
-            powerInteractor.onCameraLaunchGestureDetected()
-            runCurrent()
-
-            assertFalse(underTest.shouldTransitionFromPowerButtonGesture())
-        }
-
-    @Test
-    fun testTransitionFromPowerGesture_whileAwake_isFalse() =
-        testScope.runTest {
-            powerInteractor.setAwakeForTest()
-            transitionRepository.sendTransitionSteps(
-                from = KeyguardState.LOCKSCREEN,
-                to = KeyguardState.AOD,
-                testScope = testScope,
-            )
-            transitionRepository.sendTransitionSteps(
-                from = KeyguardState.AOD,
-                to = KeyguardState.LOCKSCREEN,
-                testScope = testScope,
-            )
-
-            powerInteractor.onCameraLaunchGestureDetected()
-            runCurrent()
-
-            assertFalse(underTest.shouldTransitionFromPowerButtonGesture())
-        }
-
-    @Test
-    fun testShowWhenLockedActivityLaunchedFromPowerGesture_notTrueSecondTime() =
-        testScope.runTest {
-            val values by collectValues(underTest.showWhenLockedActivityLaunchedFromPowerGesture)
-            powerInteractor.setAsleepForTest()
-            transitionRepository.sendTransitionSteps(
-                from = KeyguardState.LOCKSCREEN,
-                to = KeyguardState.AOD,
-                testScope = testScope,
-            )
-
-            powerInteractor.onCameraLaunchGestureDetected()
-            powerInteractor.setAwakeForTest()
-            runCurrent()
-
-            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true)
-            runCurrent()
-
-            assertThat(values)
-                .containsExactly(
-                    false,
-                    true,
-                )
-
-            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(false)
-            runCurrent()
-
-            assertThat(values)
-                .containsExactly(
-                    false,
-                    true,
-                    false,
-                )
-
-            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true)
-            runCurrent()
-
-            assertThat(values)
-                .containsExactly(
-                    false,
-                    true,
-                    // Power button gesture was not triggered a second time, so this should remain
-                    // false.
-                    false,
-                )
-        }
-
-    @Test
-    fun testShowWhenLockedActivityLaunchedFromPowerGesture_falseIfReturningToGone() =
-        testScope.runTest {
-            val values by collectValues(underTest.showWhenLockedActivityLaunchedFromPowerGesture)
-            powerInteractor.setAwakeForTest()
-            transitionRepository.sendTransitionSteps(
-                from = KeyguardState.LOCKSCREEN,
-                to = KeyguardState.GONE,
-                testScope = testScope,
-            )
-
-            powerInteractor.setAsleepForTest()
-            transitionRepository.sendTransitionSteps(
-                from = KeyguardState.GONE,
-                to = KeyguardState.AOD,
-                testScope = testScope,
-                throughTransitionState = TransitionState.RUNNING
-            )
-
-            powerInteractor.onCameraLaunchGestureDetected()
-            kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(true)
-            powerInteractor.setAwakeForTest()
-            runCurrent()
-
-            transitionRepository.sendTransitionSteps(
-                from = KeyguardState.AOD,
-                to = KeyguardState.GONE,
-                testScope = testScope,
-            )
-
-            assertThat(values)
-                .containsExactly(
-                    false,
-                )
-        }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
index 95606ae..2c0a518 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
@@ -47,7 +47,6 @@
 import com.android.systemui.shade.data.repository.fakeShadeRepository
 import com.android.systemui.statusbar.commandQueue
 import com.android.systemui.testKosmos
-import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.whenever
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.cancelChildren
@@ -64,10 +63,8 @@
 import org.mockito.ArgumentMatchers.anyInt
 import org.mockito.Mock
 import org.mockito.Mockito.clearInvocations
-import org.mockito.Mockito.never
 import org.mockito.Mockito.reset
 import org.mockito.Mockito.spy
-import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
 
 /**
@@ -521,7 +518,7 @@
             advanceTimeBy(100L)
 
             // THEN the transition is ignored
-            verify(transitionRepository, never()).startTransition(any())
+            assertThat(transitionRepository).noTransitionsStarted()
 
             coroutineContext.cancelChildren()
         }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/InWindowLauncherUnlockAnimationManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/InWindowLauncherUnlockAnimationManagerTest.kt
index e9399cc..33e9b36 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/InWindowLauncherUnlockAnimationManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/InWindowLauncherUnlockAnimationManagerTest.kt
@@ -20,6 +20,7 @@
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysUITestModule
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.biometrics.domain.BiometricsDomainLayerModule
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.keyguard.ui.view.InWindowLauncherUnlockAnimationManager
 import com.android.systemui.shared.system.smartspace.ILauncherUnlockAnimationController
@@ -118,6 +119,7 @@
         modules =
             [
                 SysUITestModule::class,
+                BiometricsDomainLayerModule::class,
             ]
     )
     interface TestComponent {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt
index aa7f9a9..c47f0bc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt
@@ -23,13 +23,15 @@
 import android.view.View.VISIBLE
 import androidx.constraintlayout.widget.ConstraintSet
 import androidx.test.filters.SmallTest
+import com.android.internal.policy.SystemBarUtils
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
 import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel
 import com.android.systemui.res.R
-import com.android.systemui.statusbar.policy.SplitShadeStateController
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.util.Utils
 import com.android.systemui.util.mockito.eq
 import com.android.systemui.util.mockito.mock
@@ -51,12 +53,13 @@
 class ClockSectionTest : SysuiTestCase() {
     @Mock private lateinit var keyguardClockInteractor: KeyguardClockInteractor
     @Mock private lateinit var keyguardClockViewModel: KeyguardClockViewModel
-    @Mock private lateinit var splitShadeStateController: SplitShadeStateController
+    @Mock private lateinit var shadeInteractor: ShadeInteractor
     @Mock private lateinit var smartspaceViewModel: KeyguardSmartspaceViewModel
     @Mock private lateinit var blueprintInteractor: Lazy<KeyguardBlueprintInteractor>
     private val bcSmartspaceVisibility: MutableStateFlow<Int> = MutableStateFlow(VISIBLE)
     private val clockShouldBeCentered: MutableStateFlow<Boolean> = MutableStateFlow(true)
     private val isAodIconsVisible: MutableStateFlow<Boolean> = MutableStateFlow(true)
+    private val shadeMode: MutableStateFlow<ShadeMode> = MutableStateFlow(ShadeMode.Single)
 
     private lateinit var underTest: ClockSection
 
@@ -68,7 +71,7 @@
             Utils.getStatusBarHeaderHeightKeyguard(context)
 
     private val LARGE_CLOCK_TOP_WITHOUT_SMARTSPACE =
-        context.resources.getDimensionPixelSize(R.dimen.status_bar_height) +
+        SystemBarUtils.getStatusBarHeight(context) +
             context.resources.getDimensionPixelSize(
                 com.android.systemui.customization.R.dimen.small_clock_padding_top
             ) +
@@ -114,14 +117,15 @@
 
         whenever(keyguardClockViewModel.clockShouldBeCentered).thenReturn(clockShouldBeCentered)
         whenever(keyguardClockViewModel.isAodIconsVisible).thenReturn(isAodIconsVisible)
+        whenever(shadeInteractor.shadeMode).thenReturn(shadeMode)
+        whenever(keyguardClockViewModel.shadeInteractor).thenReturn(shadeInteractor)
         whenever(smartspaceViewModel.bcSmartspaceVisibility).thenReturn(bcSmartspaceVisibility)
 
         underTest =
             ClockSection(
                 keyguardClockInteractor,
                 keyguardClockViewModel,
-                mContext,
-                splitShadeStateController,
+                context,
                 smartspaceViewModel,
                 blueprintInteractor
             )
@@ -138,7 +142,7 @@
         assertLargeClockTop(cs, expectedLargeClockTopMargin)
 
         val expectedSmallClockTopMargin = SMALL_CLOCK_TOP_SPLIT_SHADE
-        assertSmallClockTop(cs, expectedSmallClockTopMargin)
+        assertSmallClockTop(cs)
     }
 
     @Test
@@ -152,7 +156,7 @@
         assertLargeClockTop(cs, expectedLargeClockTopMargin)
 
         val expectedSmallClockTopMargin = SMALL_CLOCK_TOP_NON_SPLIT_SHADE
-        assertSmallClockTop(cs, expectedSmallClockTopMargin)
+        assertSmallClockTop(cs)
     }
 
     @Test
@@ -167,7 +171,7 @@
         assertLargeClockTop(cs, expectedLargeClockTopMargin)
 
         val expectedSmallClockTopMargin = SMALL_CLOCK_TOP_SPLIT_SHADE
-        assertSmallClockTop(cs, expectedSmallClockTopMargin)
+        assertSmallClockTop(cs)
     }
 
     @Test
@@ -182,7 +186,7 @@
         assertLargeClockTop(cs, expectedLargeClockTopMargin)
 
         val expectedSmallClockTopMargin = SMALL_CLOCK_TOP_NON_SPLIT_SHADE
-        assertSmallClockTop(cs, expectedSmallClockTopMargin)
+        assertSmallClockTop(cs)
     }
 
     @Test
@@ -196,7 +200,7 @@
         assertLargeClockTop(cs, expectedLargeClockTopMargin)
 
         val expectedSmallClockTopMargin = SMALL_CLOCK_TOP_SPLIT_SHADE
-        assertSmallClockTop(cs, expectedSmallClockTopMargin)
+        assertSmallClockTop(cs)
     }
 
     @Test
@@ -209,7 +213,7 @@
         assertLargeClockTop(cs, expectedLargeClockTopMargin)
 
         val expectedSmallClockTopMargin = SMALL_CLOCK_TOP_NON_SPLIT_SHADE
-        assertSmallClockTop(cs, expectedSmallClockTopMargin)
+        assertSmallClockTop(cs)
     }
 
     @Test
@@ -251,8 +255,11 @@
     }
 
     private fun setSplitShade(isInSplitShade: Boolean) {
-        whenever(splitShadeStateController.shouldUseSplitNotificationShade(context.resources))
-            .thenReturn(isInSplitShade)
+        if (isInSplitShade) {
+            shadeMode.value = ShadeMode.Split
+        } else {
+            shadeMode.value = ShadeMode.Single
+        }
     }
 
     private fun assertLargeClockTop(cs: ConstraintSet, expectedLargeClockTopMargin: Int) {
@@ -261,11 +268,9 @@
         assertThat(largeClockConstraint.layout.topMargin).isEqualTo(expectedLargeClockTopMargin)
     }
 
-    private fun assertSmallClockTop(cs: ConstraintSet, expectedSmallClockTopMargin: Int) {
+    private fun assertSmallClockTop(cs: ConstraintSet) {
         val smallClockGuidelineConstraint = cs.getConstraint(R.id.small_clock_guideline_top)
         assertThat(smallClockGuidelineConstraint.layout.topToTop).isEqualTo(-1)
-        assertThat(smallClockGuidelineConstraint.layout.guideBegin)
-            .isEqualTo(expectedSmallClockTopMargin)
 
         val smallClockConstraint = cs.getConstraint(R.id.lockscreen_clock_view)
         assertThat(smallClockConstraint.layout.topToBottom)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt
index 58273d6..b5f668c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt
@@ -22,7 +22,7 @@
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.constraintlayout.widget.ConstraintSet
 import androidx.test.filters.SmallTest
-import com.android.keyguard.LockIconViewController
+import com.android.keyguard.LegacyLockIconViewController
 import com.android.systemui.Flags as AConfigFlags
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.biometrics.AuthController
@@ -38,6 +38,7 @@
 import com.android.systemui.statusbar.VibratorHelper
 import com.android.systemui.util.mockito.whenever
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.test.TestScope
@@ -58,7 +59,7 @@
     @Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var windowManager: WindowManager
     @Mock private lateinit var notificationPanelView: NotificationPanelView
     private lateinit var featureFlags: FakeFeatureFlags
-    @Mock private lateinit var lockIconViewController: LockIconViewController
+    @Mock private lateinit var lockIconViewController: LegacyLockIconViewController
     @Mock private lateinit var falsingManager: FalsingManager
     @Mock private lateinit var deviceEntryIconViewModel: DeviceEntryIconViewModel
     private lateinit var underTest: DefaultDeviceEntrySection
@@ -85,6 +86,7 @@
                 { mock(DeviceEntryBackgroundViewModel::class.java) },
                 { falsingManager },
                 { mock(VibratorHelper::class.java) },
+                mock(CoroutineDispatcher::class.java),
             )
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelTest.kt
new file mode 100644
index 0000000..143c4da
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelTest.kt
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.filters.SmallTest
+import com.android.systemui.Flags
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.biometrics.data.repository.fakeFingerprintPropertyRepository
+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.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.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@ExperimentalCoroutinesApi
+@RunWith(JUnit4::class)
+@SmallTest
+class AlternateBouncerWindowViewModelTest : SysuiTestCase() {
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
+    private val fingerprintPropertyRepository by lazy { kosmos.fakeFingerprintPropertyRepository }
+    private val transitionRepository by lazy { kosmos.fakeKeyguardTransitionRepository }
+    private val underTest by lazy { kosmos.alternateBouncerWindowViewModel }
+
+    @Test
+    fun alternateBouncerTransition_alternateBouncerWindowRequiredTrue() =
+        testScope.runTest {
+            mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
+            val alternateBouncerWindowRequired by
+                collectLastValue(underTest.alternateBouncerWindowRequired)
+            fingerprintPropertyRepository.supportsUdfps()
+            transitionRepository.sendTransitionSteps(
+                listOf(
+                    stepFromAlternateBouncer(0f, TransitionState.STARTED),
+                    stepFromAlternateBouncer(.4f),
+                    stepFromAlternateBouncer(.6f),
+                    stepFromAlternateBouncer(1f),
+                ),
+                testScope,
+            )
+            assertThat(alternateBouncerWindowRequired).isTrue()
+        }
+
+    @Test
+    fun deviceEntryUdfpsFlagDisabled_alternateBouncerWindowRequiredFalse() =
+        testScope.runTest {
+            mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
+            val alternateBouncerWindowRequired by
+                collectLastValue(underTest.alternateBouncerWindowRequired)
+            fingerprintPropertyRepository.supportsUdfps()
+            transitionRepository.sendTransitionSteps(
+                listOf(
+                    stepFromAlternateBouncer(0f, TransitionState.STARTED),
+                    stepFromAlternateBouncer(.4f),
+                    stepFromAlternateBouncer(.6f),
+                    stepFromAlternateBouncer(1f),
+                ),
+                testScope,
+            )
+            assertThat(alternateBouncerWindowRequired).isFalse()
+        }
+
+    @Test
+    fun lockscreenTransition_alternateBouncerWindowRequiredFalse() =
+        testScope.runTest {
+            mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
+            val alternateBouncerWindowRequired by
+                collectLastValue(underTest.alternateBouncerWindowRequired)
+            fingerprintPropertyRepository.supportsUdfps()
+            transitionRepository.sendTransitionSteps(
+                listOf(
+                    stepFromDozingToLockscreen(0f, TransitionState.STARTED),
+                    stepFromDozingToLockscreen(.4f),
+                    stepFromDozingToLockscreen(.6f),
+                    stepFromDozingToLockscreen(1f),
+                ),
+                testScope,
+            )
+            assertThat(alternateBouncerWindowRequired).isFalse()
+        }
+
+    @Test
+    fun rearFps_alternateBouncerWindowRequiredFalse() =
+        testScope.runTest {
+            mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
+            val alternateBouncerWindowRequired by
+                collectLastValue(underTest.alternateBouncerWindowRequired)
+            fingerprintPropertyRepository.supportsRearFps()
+            transitionRepository.sendTransitionSteps(
+                listOf(
+                    stepFromAlternateBouncer(0f, TransitionState.STARTED),
+                    stepFromAlternateBouncer(.4f),
+                    stepFromAlternateBouncer(.6f),
+                    stepFromAlternateBouncer(1f),
+                ),
+                testScope,
+            )
+            assertThat(alternateBouncerWindowRequired).isFalse()
+        }
+
+    private fun stepFromAlternateBouncer(
+        value: Float,
+        state: TransitionState = TransitionState.RUNNING
+    ): TransitionStep {
+        return step(
+            from = KeyguardState.ALTERNATE_BOUNCER,
+            to = KeyguardState.LOCKSCREEN,
+            value = value,
+            transitionState = state,
+        )
+    }
+
+    private fun stepFromDozingToLockscreen(
+        value: Float,
+        state: TransitionState = TransitionState.RUNNING
+    ): TransitionStep {
+        return step(
+            from = KeyguardState.DOZING,
+            to = KeyguardState.LOCKSCREEN,
+            value = value,
+            transitionState = state,
+        )
+    }
+
+    private fun step(
+        from: KeyguardState,
+        to: KeyguardState,
+        value: Float,
+        transitionState: TransitionState
+    ): TransitionStep {
+        return TransitionStep(
+            from = from,
+            to = to,
+            value = value,
+            transitionState = transitionState,
+            ownerName = "AlternateBouncerViewModelTest"
+        )
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
index 0322301..7b5dd1f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
@@ -30,14 +30,16 @@
 import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
+import com.android.systemui.keyguard.shared.ComposeLockscreen
 import com.android.systemui.plugins.clocks.ClockController
 import com.android.systemui.plugins.clocks.ClockFaceConfig
 import com.android.systemui.plugins.clocks.ClockFaceController
+import com.android.systemui.res.R
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
 import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.shared.clocks.ClockRegistry
 import com.android.systemui.statusbar.notification.domain.interactor.NotificationsKeyguardInteractor
-import com.android.systemui.statusbar.policy.SplitShadeStateController
+import com.android.systemui.util.Utils
 import com.android.systemui.util.mockito.whenever
 import com.android.systemui.util.settings.FakeSettings
 import com.google.common.truth.Truth.assertThat
@@ -67,12 +69,12 @@
     private lateinit var keyguardClockInteractor: KeyguardClockInteractor
     private lateinit var keyguardClockRepository: KeyguardClockRepository
     private lateinit var fakeSettings: FakeSettings
+    private val shadeMode = MutableStateFlow<ShadeMode>(ShadeMode.Single)
     @Mock private lateinit var clockRegistry: ClockRegistry
     @Mock private lateinit var clock: ClockController
     @Mock private lateinit var largeClock: ClockFaceController
     @Mock private lateinit var clockFaceConfig: ClockFaceConfig
     @Mock private lateinit var eventController: ClockEventController
-    @Mock private lateinit var splitShadeStateController: SplitShadeStateController
     @Mock private lateinit var notifsKeyguardInteractor: NotificationsKeyguardInteractor
     @Mock private lateinit var areNotificationsFullyHidden: Flow<Boolean>
     @Mock private lateinit var shadeInteractor: ShadeInteractor
@@ -100,7 +102,7 @@
         keyguardClockInteractor = KeyguardClockInteractor(keyguardClockRepository)
         whenever(notifsKeyguardInteractor.areNotificationsFullyHidden)
             .thenReturn(areNotificationsFullyHidden)
-        whenever(shadeInteractor.shadeMode).thenReturn(MutableStateFlow(ShadeMode.Single))
+        whenever(shadeInteractor.shadeMode).thenReturn(shadeMode)
         underTest =
             KeyguardClockViewModel(
                 keyguardInteractor,
@@ -153,6 +155,44 @@
             assertThat(value()).isEqualTo(false)
         }
 
+    @Test
+    fun testSmallClockTop_splitshade() =
+        scope.runTest {
+            shadeMode.value = ShadeMode.Split
+            if (!ComposeLockscreen.isEnabled) {
+                assertThat(underTest.getSmallClockTopMargin(context))
+                    .isEqualTo(
+                        context.resources.getDimensionPixelSize(
+                            R.dimen.keyguard_split_shade_top_margin
+                        )
+                    )
+            } else {
+                assertThat(underTest.getSmallClockTopMargin(context))
+                    .isEqualTo(
+                        context.resources.getDimensionPixelSize(
+                            R.dimen.keyguard_split_shade_top_margin
+                        ) - Utils.getStatusBarHeaderHeightKeyguard(context)
+                    )
+            }
+        }
+
+    @Test
+    fun testSmallClockTop_nonSplitshade() =
+        scope.runTest {
+            if (!ComposeLockscreen.isEnabled) {
+                assertThat(underTest.getSmallClockTopMargin(context))
+                    .isEqualTo(
+                        context.resources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin) +
+                            Utils.getStatusBarHeaderHeightKeyguard(context)
+                    )
+            } else {
+                assertThat(underTest.getSmallClockTopMargin(context))
+                    .isEqualTo(
+                        context.resources.getDimensionPixelSize(R.dimen.keyguard_clock_top_margin)
+                    )
+            }
+        }
+
     private fun setupMockClock() {
         whenever(clock.largeClock).thenReturn(largeClock)
         whenever(largeClock.config).thenReturn(clockFaceConfig)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelWithKosmosTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelWithKosmosTest.kt
index e53cd11..d12980a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelWithKosmosTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelWithKosmosTest.kt
@@ -20,17 +20,23 @@
 import com.android.keyguard.KeyguardClockSwitch
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.keyguard.data.repository.fakeKeyguardClockRepository
 import com.android.systemui.keyguard.data.repository.keyguardClockRepository
 import com.android.systemui.keyguard.data.repository.keyguardRepository
 import com.android.systemui.kosmos.testScope
+import com.android.systemui.plugins.clocks.ClockController
+import com.android.systemui.plugins.clocks.ClockFaceConfig
+import com.android.systemui.plugins.clocks.ClockFaceController
 import com.android.systemui.shade.data.repository.shadeRepository
 import com.android.systemui.shade.shared.model.ShadeMode
 import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.whenever
 import com.google.common.truth.Truth.assertThat
 import kotlin.test.Test
 import kotlinx.coroutines.test.runTest
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
+import org.mockito.Mockito.mock
 
 @SmallTest
 @RunWith(JUnit4::class)
@@ -98,4 +104,49 @@
             val currentClockLayout by collectLastValue(underTest.currentClockLayout)
             assertThat(currentClockLayout).isEqualTo(KeyguardClockViewModel.ClockLayout.LARGE_CLOCK)
         }
+
+    @Test
+    fun hasCustomPositionUpdatedAnimation_withConfigTrue_isTrue() =
+        testScope.runTest {
+            with(kosmos) {
+                keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE)
+                fakeKeyguardClockRepository.setCurrentClock(
+                    buildClockController(hasCustomPositionUpdatedAnimation = true)
+                )
+            }
+
+            val hasCustomPositionUpdatedAnimation by
+                collectLastValue(underTest.hasCustomPositionUpdatedAnimation)
+            assertThat(hasCustomPositionUpdatedAnimation).isEqualTo(true)
+        }
+
+    @Test
+    fun hasCustomPositionUpdatedAnimation_withConfigFalse_isFalse() =
+        testScope.runTest {
+            with(kosmos) {
+                keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE)
+                fakeKeyguardClockRepository.setCurrentClock(
+                    buildClockController(hasCustomPositionUpdatedAnimation = false)
+                )
+            }
+
+            val hasCustomPositionUpdatedAnimation by
+                collectLastValue(underTest.hasCustomPositionUpdatedAnimation)
+            assertThat(hasCustomPositionUpdatedAnimation).isEqualTo(false)
+        }
+
+    private fun buildClockController(
+        hasCustomPositionUpdatedAnimation: Boolean = false
+    ): ClockController {
+        val clockController = mock(ClockController::class.java)
+        val largeClock = mock(ClockFaceController::class.java)
+        val config = mock(ClockFaceConfig::class.java)
+
+        whenever(clockController.largeClock).thenReturn(largeClock)
+        whenever(largeClock.config).thenReturn(config)
+        whenever(config.hasCustomPositionUpdatedAnimation)
+            .thenReturn(hasCustomPositionUpdatedAnimation)
+
+        return clockController
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt
index 655a551..a08e491 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/util/KeyguardTransitionRepositorySpySubject.kt
@@ -21,8 +21,6 @@
 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.util.mockito.withArgCaptor
 import com.google.common.truth.FailureMetadata
 import com.google.common.truth.Subject
 import com.google.common.truth.Truth
@@ -30,8 +28,6 @@
 import junit.framework.Assert.assertEquals
 import kotlin.test.fail
 import org.mockito.Mockito
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
 
 /** [Subject] used to make assertions about a [Mockito.spy] KeyguardTransitionRepository. */
 class KeyguardTransitionRepositorySpySubject
@@ -45,7 +41,7 @@
      * parameters. If an animator param or assertion is not provided, we will not assert anything
      * about the animator.
      */
-    fun startedTransition(
+    suspend fun startedTransition(
         ownerName: String? = null,
         from: KeyguardState? = null,
         to: KeyguardState,
@@ -58,7 +54,7 @@
      * Asserts that we started a transition to the given state, optionally verifying additional
      * params.
      */
-    fun startedTransition(
+    suspend fun startedTransition(
         ownerName: String? = null,
         from: KeyguardState? = null,
         to: KeyguardState,
@@ -72,26 +68,41 @@
      * Asserts that we started a transition to the given state, optionally verifying additional
      * params.
      */
-    fun startedTransition(
+    suspend fun startedTransition(
         ownerName: String? = null,
         from: KeyguardState? = null,
         to: KeyguardState,
         animatorAssertion: (Subject) -> Unit,
         modeOnCanceled: TransitionModeOnCanceled? = null,
     ) {
-        withArgCaptor<TransitionInfo> { verify(repository).startTransition(capture()) }
-            .also { transitionInfo ->
+        // TODO(b/331799060): Remove this workaround once atest supports mocking suspend functions.
+        Mockito.mockingDetails(repository).invocations.forEach { invocation ->
+            if (invocation.method.equals(KeyguardTransitionRepository::startTransition.name)) {
+                val transitionInfo = invocation.arguments.firstOrNull() as TransitionInfo
                 assertEquals(to, transitionInfo.to)
                 animatorAssertion.invoke(Truth.assertThat(transitionInfo.animator))
                 from?.let { assertEquals(it, transitionInfo.from) }
                 ownerName?.let { assertEquals(it, transitionInfo.ownerName) }
                 modeOnCanceled?.let { assertEquals(it, transitionInfo.modeOnCanceled) }
+                invocation.markVerified()
             }
+        }
     }
 
     /** Verifies that [KeyguardTransitionRepository.startTransition] was never called. */
-    fun noTransitionsStarted() {
-        verify(repository, never()).startTransition(any())
+    suspend fun noTransitionsStarted() {
+        // TODO(b/331799060): Remove this workaround once atest supports mocking suspend functions.
+        Mockito.mockingDetails(repository).invocations.forEach {
+            if (
+                it.method.equals(KeyguardTransitionRepository::startTransition.name) &&
+                    !it.isVerified
+            ) {
+                fail(
+                    "Expected no transitions started, however this transition was started: " +
+                        it.arguments.firstOrNull()
+                )
+            }
+        }
     }
 
     companion object {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
index 564bdc3..b70cc30 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
@@ -64,6 +64,7 @@
 private const val PRIVATE_PROFILE = 12
 private const val PACKAGE = "PKG"
 private val INSTANCE_ID = InstanceId.fakeInstanceId(123)!!
+private val INSTANCE_ID_GUEST = InstanceId.fakeInstanceId(321)!!
 private const val APP_UID = 99
 private const val SMARTSPACE_KEY = "SMARTSPACE_KEY"
 private const val SMARTSPACE_PACKAGE = "SMARTSPACE_PKG"
@@ -75,7 +76,7 @@
 @TestableLooper.RunWithLooper
 class MediaDataFilterImplTest : SysuiTestCase() {
 
-    @Mock private lateinit var listener: MediaDataManager.Listener
+    @Mock private lateinit var listener: MediaDataFilterImpl.Listener
     @Mock private lateinit var userTracker: UserTracker
     @Mock private lateinit var broadcastSender: BroadcastSender
     @Mock private lateinit var mediaDataManager: MediaDataManager
@@ -128,8 +129,8 @@
                 instanceId = INSTANCE_ID,
                 appUid = APP_UID
             )
-        dataGuest = dataMain.copy(userId = USER_GUEST)
-        dataPrivateProfile = dataMain.copy(userId = PRIVATE_PROFILE)
+        dataGuest = dataMain.copy(userId = USER_GUEST, instanceId = INSTANCE_ID_GUEST)
+        dataPrivateProfile = dataMain.copy(userId = PRIVATE_PROFILE, instanceId = INSTANCE_ID_GUEST)
 
         whenever(smartspaceData.targetId).thenReturn(SMARTSPACE_KEY)
         whenever(smartspaceData.isActive).thenReturn(true)
@@ -166,8 +167,7 @@
         mediaDataFilter.onMediaDataLoaded(KEY, null, dataMain)
 
         // THEN we should tell the listener
-        verify(listener)
-            .onMediaDataLoaded(eq(KEY), eq(null), eq(dataMain), eq(true), eq(0), eq(false))
+        verify(listener).onMediaDataLoaded(eq(dataMain.instanceId), eq(true), eq(0), eq(false))
     }
 
     @Test
@@ -176,8 +176,7 @@
         mediaDataFilter.onMediaDataLoaded(KEY, null, dataGuest)
 
         // THEN we should NOT tell the listener
-        verify(listener, never())
-            .onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean())
+        verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean())
     }
 
     @Test
@@ -187,7 +186,7 @@
         mediaDataFilter.onMediaDataRemoved(KEY)
 
         // THEN we should tell the listener
-        verify(listener).onMediaDataRemoved(eq(KEY))
+        verify(listener).onMediaDataRemoved(eq(dataMain.instanceId))
     }
 
     @Test
@@ -197,7 +196,7 @@
         mediaDataFilter.onMediaDataRemoved(KEY)
 
         // THEN we should NOT tell the listener
-        verify(listener, never()).onMediaDataRemoved(eq(KEY))
+        verify(listener, never()).onMediaDataRemoved(eq(dataGuest.instanceId))
     }
 
     @Test
@@ -209,7 +208,7 @@
         setUser(USER_GUEST)
 
         // THEN we should remove the main user's media
-        verify(listener).onMediaDataRemoved(eq(KEY))
+        verify(listener).onMediaDataRemoved(eq(dataMain.instanceId))
     }
 
     @Test
@@ -223,12 +222,11 @@
         setUser(USER_GUEST)
 
         // THEN we should add back the guest user media
-        verify(listener)
-            .onMediaDataLoaded(eq(KEY_ALT), eq(null), eq(dataGuest), eq(true), eq(0), eq(false))
+        verify(listener).onMediaDataLoaded(eq(dataGuest.instanceId), eq(true), eq(0), eq(false))
 
         // but not the main user's
         verify(listener, never())
-            .onMediaDataLoaded(eq(KEY), any(), eq(dataMain), anyBoolean(), anyInt(), anyBoolean())
+            .onMediaDataLoaded(eq(dataMain.instanceId), anyBoolean(), anyInt(), anyBoolean())
     }
 
     @Test
@@ -242,7 +240,7 @@
         setPrivateProfileUnavailable()
 
         // THEN we should add the private profile media
-        verify(listener).onMediaDataRemoved(eq(KEY_ALT))
+        verify(listener).onMediaDataRemoved(eq(dataPrivateProfile.instanceId))
     }
 
     @Test
@@ -311,7 +309,7 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             val data = dataMain.copy(active = false)
             mediaDataFilter.onMediaDataLoaded(KEY, oldKey = null, data = data)
 
@@ -330,7 +328,7 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             val data = dataMain.copy(active = true)
             mediaDataFilter.onMediaDataLoaded(KEY, oldKey = null, data = data)
 
@@ -349,7 +347,7 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             whenever(smartspaceData.isActive).thenReturn(false)
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
@@ -368,7 +366,7 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             whenever(smartspaceData.isValid()).thenReturn(false)
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
@@ -387,7 +385,7 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             whenever(smartspaceData.isActive).thenReturn(true)
             whenever(smartspaceData.isValid()).thenReturn(true)
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
@@ -421,7 +419,7 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -470,12 +468,11 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
 
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
-            verify(listener)
-                .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true))
+            verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(true))
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -494,15 +491,14 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
 
             whenever(smartspaceData.isActive).thenReturn(false)
 
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
-            verify(listener, never())
-                .onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean())
-            verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+            verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean())
+            verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean())
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -521,14 +517,13 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             val dataOld = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataOld)
             clock.advanceTime(MediaDataFilterImpl.SMARTSPACE_MAX_AGE + 100)
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
-            verify(listener)
-                .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true))
+            verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(true))
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -547,7 +542,7 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             whenever(smartspaceData.isActive).thenReturn(false)
 
             val dataOld = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
@@ -555,7 +550,7 @@
             clock.advanceTime(MediaDataFilterImpl.SMARTSPACE_MAX_AGE + 100)
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
-            verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+            verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean())
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -574,7 +569,7 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
 
             whenever(smartspaceData.isActive).thenReturn(false)
 
@@ -582,15 +577,15 @@
             val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
             verify(listener)
-                .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+                .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
 
+            reset(listener)
             // AND we get a smartspace signal
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
             // THEN we should tell listeners to treat the media as not active instead
-            verify(listener, never())
-                .onMediaDataLoaded(eq(KEY), eq(KEY), any(), anyBoolean(), anyInt(), anyBoolean())
-            verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+            verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean())
+            verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean())
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -609,14 +604,14 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             whenever(smartspaceData.isValid()).thenReturn(false)
 
             // WHEN we have media that was recently played, but not currently active
             val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
             verify(listener)
-                .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+                .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
 
             // AND we get a smartspace signal
             runCurrent()
@@ -625,14 +620,7 @@
             // THEN we should tell listeners to treat the media as active instead
             val dataCurrentAndActive = dataCurrent.copy(active = true)
             verify(listener)
-                .onMediaDataLoaded(
-                    eq(KEY),
-                    eq(KEY),
-                    eq(dataCurrentAndActive),
-                    eq(true),
-                    eq(100),
-                    eq(true)
-                )
+                .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true))
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -642,7 +630,7 @@
                 )
                 .isTrue()
             // Smartspace update shouldn't be propagated for the empty rec list.
-            verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+            verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean())
             verify(logger, never()).logRecommendationAdded(any(), any())
             verify(logger).logRecommendationActivated(eq(APP_UID), eq(PACKAGE), eq(INSTANCE_ID))
         }
@@ -652,12 +640,12 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             // WHEN we have media that was recently played, but not currently active
             val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
             verify(listener)
-                .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+                .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
 
             // AND we get a smartspace signal
             runCurrent()
@@ -666,14 +654,7 @@
             // THEN we should tell listeners to treat the media as active instead
             val dataCurrentAndActive = dataCurrent.copy(active = true)
             verify(listener)
-                .onMediaDataLoaded(
-                    eq(KEY),
-                    eq(KEY),
-                    eq(dataCurrentAndActive),
-                    eq(true),
-                    eq(100),
-                    eq(true)
-                )
+                .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true))
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -683,8 +664,7 @@
                 )
                 .isTrue()
             // Smartspace update should also be propagated but not prioritized.
-            verify(listener)
-                .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+            verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false))
             verify(logger).logRecommendationAdded(SMARTSPACE_PACKAGE, SMARTSPACE_INSTANCE_ID)
             verify(logger).logRecommendationActivated(eq(APP_UID), eq(PACKAGE), eq(INSTANCE_ID))
         }
@@ -694,7 +674,7 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
 
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
             mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
@@ -716,25 +696,18 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
             verify(listener)
-                .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+                .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
 
             runCurrent()
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
             val dataCurrentAndActive = dataCurrent.copy(active = true)
             verify(listener)
-                .onMediaDataLoaded(
-                    eq(KEY),
-                    eq(KEY),
-                    eq(dataCurrentAndActive),
-                    eq(true),
-                    eq(100),
-                    eq(true)
-                )
+                .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true))
 
             mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
 
@@ -755,14 +728,13 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             whenever(mediaFlags.isPersistentSsCardEnabled()).thenReturn(true)
             whenever(smartspaceData.isActive).thenReturn(false)
 
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
-            verify(listener)
-                .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+            verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false))
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -780,7 +752,7 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
 
             whenever(mediaFlags.isPersistentSsCardEnabled()).thenReturn(true)
             whenever(smartspaceData.isActive).thenReturn(false)
@@ -789,16 +761,15 @@
             val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
             verify(listener)
-                .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+                .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
 
+            reset(listener)
             // And an inactive recommendation is loaded
             mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
             // Smartspace is loaded but the media stays inactive
-            verify(listener)
-                .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
-            verify(listener, never())
-                .onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean())
+            verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false))
+            verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean())
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -835,12 +806,12 @@
         testScope.runTest {
             val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
             val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
-            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+            val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
             // WHEN we have media that was recently played, but not currently active
             val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
             mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
             verify(listener)
-                .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+                .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
 
             // AND we get a smartspace signal with extra to trigger resume
             runCurrent()
@@ -851,14 +822,7 @@
             // THEN we should tell listeners to treat the media as active instead
             val dataCurrentAndActive = dataCurrent.copy(active = true)
             verify(listener)
-                .onMediaDataLoaded(
-                    eq(KEY),
-                    eq(KEY),
-                    eq(dataCurrentAndActive),
-                    eq(true),
-                    eq(100),
-                    eq(true)
-                )
+                .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true))
             assertThat(
                     hasActiveMediaOrRecommendation(
                         selectedUserEntries,
@@ -868,8 +832,7 @@
                 )
                 .isTrue()
             // And send the smartspace data, but not prioritized
-            verify(listener)
-                .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+            verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false))
         }
 
     @Test
@@ -877,8 +840,7 @@
         // WHEN we have media that was recently played, but not currently active
         val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
         mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
-        verify(listener)
-            .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+        verify(listener).onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
 
         // AND we get a smartspace signal with extra to not trigger resume
         val extras = Bundle().apply { putBoolean(EXTRA_KEY_TRIGGER_RESUME, false) }
@@ -886,32 +848,30 @@
         mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
 
         // THEN listeners are not updated to show media
-        verify(listener, never())
-            .onMediaDataLoaded(eq(KEY), eq(KEY), any(), eq(true), eq(100), eq(true))
+        verify(listener, never()).onMediaDataLoaded(any(), eq(true), eq(100), eq(true))
         // But the smartspace update is still propagated
-        verify(listener)
-            .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+        verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false))
     }
 
     private fun hasActiveMediaOrRecommendation(
-        entries: Map<String, MediaData>?,
+        entries: Map<InstanceId, MediaData>?,
         smartspaceMediaData: SmartspaceMediaData?,
-        reactivatedKey: String?
+        reactivatedId: InstanceId?
     ): Boolean {
         if (entries == null || smartspaceMediaData == null) {
             return false
         }
         return entries.any { it.value.active } ||
             (smartspaceMediaData.isActive &&
-                (smartspaceMediaData.isValid() || reactivatedKey != null))
+                (smartspaceMediaData.isValid() || reactivatedId != null))
     }
 
-    private fun hasActiveMedia(entries: Map<String, MediaData>?): Boolean {
+    private fun hasActiveMedia(entries: Map<InstanceId, MediaData>?): Boolean {
         return entries?.any { it.value.active } ?: false
     }
 
     private fun hasAnyMediaOrRecommendation(
-        entries: Map<String, MediaData>?,
+        entries: Map<InstanceId, MediaData>?,
         smartspaceMediaData: SmartspaceMediaData?
     ): Boolean {
         if (entries == null || smartspaceMediaData == null) {
@@ -925,7 +885,7 @@
             })
     }
 
-    private fun hasAnyMedia(entries: Map<String, MediaData>?): Boolean {
+    private fun hasAnyMedia(entries: Map<InstanceId, MediaData>?): Boolean {
         return entries?.isNotEmpty() ?: false
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java
index 695d3b2..ca403e0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
@@ -47,6 +48,7 @@
 import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
+import com.android.settingslib.media.LocalMediaManager;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.animation.DialogTransitionAnimator;
 import com.android.systemui.broadcast.BroadcastSender;
@@ -127,6 +129,12 @@
                 mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager,
                 mKeyguardManager, mFlags, mUserTracker);
 
+        // Using a fake package will cause routing operations to fail, so we intercept
+        // scanning-related operations.
+        mMediaOutputController.mLocalMediaManager = mock(LocalMediaManager.class);
+        doNothing().when(mMediaOutputController.mLocalMediaManager).startScan();
+        doNothing().when(mMediaOutputController.mLocalMediaManager).stopScan();
+
         mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext, mBroadcastSender,
                 mMediaOutputController);
         mMediaOutputBaseDialogImpl.onCreate(new Bundle());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt
index 44798ea..2536078 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt
@@ -257,6 +257,8 @@
             userId = userId,
             colorBackground = 0,
             isForegroundTask = isForegroundTask,
+            userType = RecentTask.UserType.STANDARD,
+            splitBounds = null,
         )
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/BasicPackageManagerAppIconLoaderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/BasicPackageManagerAppIconLoaderTest.kt
new file mode 100644
index 0000000..fa1c8f8
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/BasicPackageManagerAppIconLoaderTest.kt
@@ -0,0 +1,70 @@
+/*
+ * 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.mediaprojection.appselector.data
+
+import android.content.ComponentName
+import android.content.pm.ActivityInfo
+import android.content.pm.PackageManager
+import android.graphics.Bitmap
+import androidx.test.filters.SmallTest
+import com.android.launcher3.icons.FastBitmapDrawable
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.shared.system.PackageManagerWrapper
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@SmallTest
+@RunWith(JUnit4::class)
+class BasicPackageManagerAppIconLoaderTest : SysuiTestCase() {
+
+    private val packageManagerWrapper: PackageManagerWrapper = mock()
+    private val packageManager: PackageManager = mock()
+    private val dispatcher = Dispatchers.Unconfined
+
+    private val appIconLoader =
+        BasicPackageManagerAppIconLoader(
+            backgroundDispatcher = dispatcher,
+            packageManagerWrapper = packageManagerWrapper,
+            packageManager = packageManager,
+        )
+
+    @Test
+    fun loadIcon_loadsIconUsingTheSameUserId() {
+        val icon = createIcon()
+        val component = ComponentName("com.test", "TestApplication")
+        givenIcon(component, userId = 123, icon = icon)
+
+        val loadedIcon = runBlocking { appIconLoader.loadIcon(userId = 123, component = component) }
+
+        assertThat(loadedIcon).isEqualTo(icon)
+    }
+
+    private fun givenIcon(component: ComponentName, userId: Int, icon: FastBitmapDrawable) {
+        val activityInfo = mock<ActivityInfo>()
+        whenever(packageManagerWrapper.getActivityInfo(component, userId)).thenReturn(activityInfo)
+        whenever(activityInfo.loadIcon(packageManager)).thenReturn(icon)
+    }
+
+    private fun createIcon(): FastBitmapDrawable =
+        FastBitmapDrawable(Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888))
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/IconLoaderLibAppIconLoaderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/IconLoaderLibAppIconLoaderTest.kt
deleted file mode 100644
index 9b346d0..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/IconLoaderLibAppIconLoaderTest.kt
+++ /dev/null
@@ -1,83 +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.mediaprojection.appselector.data
-
-import android.content.ComponentName
-import android.content.pm.ActivityInfo
-import android.content.pm.PackageManager
-import android.graphics.Bitmap
-import android.graphics.drawable.Drawable
-import androidx.test.filters.SmallTest
-import com.android.launcher3.icons.BitmapInfo
-import com.android.launcher3.icons.FastBitmapDrawable
-import com.android.launcher3.icons.IconFactory
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.shared.system.PackageManagerWrapper
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.eq
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.runBlocking
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@SmallTest
-@RunWith(JUnit4::class)
-class IconLoaderLibAppIconLoaderTest : SysuiTestCase() {
-
-    private val iconFactory: IconFactory = mock()
-    private val packageManagerWrapper: PackageManagerWrapper = mock()
-    private val packageManager: PackageManager = mock()
-    private val dispatcher = Dispatchers.Unconfined
-
-    private val appIconLoader =
-        IconLoaderLibAppIconLoader(
-            backgroundDispatcher = dispatcher,
-            context = context,
-            packageManagerWrapper = packageManagerWrapper,
-            packageManager = packageManager,
-            iconFactoryProvider = { iconFactory }
-        )
-
-    @Test
-    fun loadIcon_loadsIconUsingTheSameUserId() {
-        val icon = createIcon()
-        val component = ComponentName("com.test", "TestApplication")
-        givenIcon(component, userId = 123, icon = icon)
-
-        val loadedIcon = runBlocking { appIconLoader.loadIcon(userId = 123, component = component) }
-
-        assertThat(loadedIcon).isEqualTo(icon)
-    }
-
-    private fun givenIcon(component: ComponentName, userId: Int, icon: FastBitmapDrawable) {
-        val activityInfo = mock<ActivityInfo>()
-        whenever(packageManagerWrapper.getActivityInfo(component, userId)).thenReturn(activityInfo)
-        val rawIcon = mock<Drawable>()
-        whenever(activityInfo.loadIcon(packageManager)).thenReturn(rawIcon)
-
-        val bitmapInfo = mock<BitmapInfo>()
-        whenever(iconFactory.createBadgedIconBitmap(eq(rawIcon), any())).thenReturn(bitmapInfo)
-        whenever(bitmapInfo.newIcon(context)).thenReturn(icon)
-    }
-
-    private fun createIcon(): FastBitmapDrawable =
-        FastBitmapDrawable(Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888))
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt
index b593def..6ac86f5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt
@@ -1,9 +1,15 @@
 package com.android.systemui.mediaprojection.appselector.data
 
 import android.app.ActivityManager.RecentTaskInfo
+import android.content.pm.UserInfo
+import android.os.UserManager
 import android.testing.AndroidTestingRunner
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.mediaprojection.appselector.data.RecentTask.UserType.CLONED
+import com.android.systemui.mediaprojection.appselector.data.RecentTask.UserType.PRIVATE
+import com.android.systemui.mediaprojection.appselector.data.RecentTask.UserType.STANDARD
+import com.android.systemui.mediaprojection.appselector.data.RecentTask.UserType.WORK
 import com.android.systemui.settings.UserTracker
 import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.mock
@@ -17,6 +23,7 @@
 import kotlinx.coroutines.runBlocking
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
 
 @RunWith(AndroidTestingRunner::class)
 @SmallTest
@@ -25,12 +32,16 @@
     private val dispatcher = Dispatchers.Unconfined
     private val recentTasks: RecentTasks = mock()
     private val userTracker: UserTracker = mock()
+    private val userManager: UserManager = mock {
+        whenever(getUserInfo(anyInt())).thenReturn(mock())
+    }
     private val recentTaskListProvider =
         ShellRecentTaskListProvider(
             dispatcher,
             Runnable::run,
             Optional.of(recentTasks),
-            userTracker
+            userTracker,
+            userManager,
         )
 
     @Test
@@ -147,6 +158,22 @@
             .inOrder()
     }
 
+    @Test
+    fun loadRecentTasks_assignsCorrectUserType() {
+        givenRecentTasks(
+            createSingleTask(taskId = 1, userId = 10, userType = STANDARD),
+            createSingleTask(taskId = 2, userId = 20, userType = WORK),
+            createSingleTask(taskId = 3, userId = 30, userType = CLONED),
+            createSingleTask(taskId = 4, userId = 40, userType = PRIVATE),
+        )
+
+        val result = runBlocking { recentTaskListProvider.loadRecentTasks() }
+
+        assertThat(result.map { it.userType })
+            .containsExactly(STANDARD, WORK, CLONED, PRIVATE)
+            .inOrder()
+    }
+
     @Suppress("UNCHECKED_CAST")
     private fun givenRecentTasks(vararg tasks: GroupedRecentTaskInfo) {
         whenever(recentTasks.getRecentTasks(any(), any(), any(), any(), any())).thenAnswer {
@@ -155,7 +182,10 @@
         }
     }
 
-    private fun createRecentTask(taskId: Int): RecentTask =
+    private fun createRecentTask(
+        taskId: Int,
+        userType: RecentTask.UserType = STANDARD
+    ): RecentTask =
         RecentTask(
             taskId = taskId,
             displayId = 0,
@@ -164,25 +194,43 @@
             baseIntentComponent = null,
             colorBackground = null,
             isForegroundTask = false,
+            userType = userType,
+            splitBounds = null
         )
 
-    private fun createSingleTask(taskId: Int, isVisible: Boolean = false): GroupedRecentTaskInfo =
-        GroupedRecentTaskInfo.forSingleTask(createTaskInfo(taskId, isVisible))
+    private fun createSingleTask(
+        taskId: Int,
+        userId: Int = 0,
+        isVisible: Boolean = false,
+        userType: RecentTask.UserType = STANDARD,
+    ): GroupedRecentTaskInfo {
+        val userInfo =
+            mock<UserInfo> {
+                whenever(isCloneProfile).thenReturn(userType == CLONED)
+                whenever(isManagedProfile).thenReturn(userType == WORK)
+                whenever(isPrivateProfile).thenReturn(userType == PRIVATE)
+            }
+        whenever(userManager.getUserInfo(userId)).thenReturn(userInfo)
+        return GroupedRecentTaskInfo.forSingleTask(createTaskInfo(taskId, userId, isVisible))
+    }
 
     private fun createTaskPair(
         taskId1: Int,
+        userId1: Int = 0,
         taskId2: Int,
+        userId2: Int = 0,
         isVisible: Boolean = false
     ): GroupedRecentTaskInfo =
         GroupedRecentTaskInfo.forSplitTasks(
-            createTaskInfo(taskId1, isVisible),
-            createTaskInfo(taskId2, isVisible),
+            createTaskInfo(taskId1, userId1, isVisible),
+            createTaskInfo(taskId2, userId2, isVisible),
             null
         )
 
-    private fun createTaskInfo(taskId: Int, isVisible: Boolean = false) =
+    private fun createTaskInfo(taskId: Int, userId: Int, isVisible: Boolean = false) =
         RecentTaskInfo().apply {
             this.taskId = taskId
             this.isVisible = isVisible
+            this.userId = userId
         }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewControllerTest.kt
index ac41073..f4c5ccf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewControllerTest.kt
@@ -18,22 +18,28 @@
 
 import android.app.ActivityOptions
 import android.app.IActivityTaskManager
+import android.graphics.Rect
 import android.os.Bundle
 import android.view.View
 import android.view.ViewGroup
 import androidx.test.filters.SmallTest
 import com.android.systemui.Flags.FLAG_PSS_APP_SELECTOR_ABRUPT_EXIT_FIX
+import com.android.systemui.Flags.FLAG_PSS_APP_SELECTOR_RECENTS_SPLIT_SCREEN
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorResultHandler
 import com.android.systemui.mediaprojection.appselector.data.RecentTask
 import com.android.systemui.util.mockito.mock
+import com.android.wm.shell.splitscreen.SplitScreen
+import com.android.wm.shell.util.SplitBounds
 import com.google.common.truth.Expect
 import com.google.common.truth.Truth.assertThat
+import java.util.Optional
 import org.junit.Rule
 import org.junit.Test
 import org.mockito.ArgumentCaptor
 import org.mockito.ArgumentMatchers.eq
 import org.mockito.Mockito.any
+import org.mockito.Mockito.anyInt
 import org.mockito.Mockito.verify
 
 @SmallTest
@@ -46,9 +52,10 @@
     private val taskViewSizeProvider = mock<TaskPreviewSizeProvider>()
     private val activityTaskManager = mock<IActivityTaskManager>()
     private val resultHandler = mock<MediaProjectionAppSelectorResultHandler>()
+    private val splitScreen = Optional.of(mock<SplitScreen>())
     private val bundleCaptor = ArgumentCaptor.forClass(Bundle::class.java)
 
-    private val task =
+    private val fullScreenTask =
         RecentTask(
             taskId = 123,
             displayId = 456,
@@ -56,7 +63,22 @@
             topActivityComponent = null,
             baseIntentComponent = null,
             colorBackground = null,
-            isForegroundTask = false
+            isForegroundTask = false,
+            userType = RecentTask.UserType.STANDARD,
+            splitBounds = null
+        )
+
+    private val splitScreenTask =
+        RecentTask(
+            taskId = 123,
+            displayId = 456,
+            userId = 789,
+            topActivityComponent = null,
+            baseIntentComponent = null,
+            colorBackground = null,
+            isForegroundTask = false,
+            userType = RecentTask.UserType.STANDARD,
+            splitBounds = SplitBounds(Rect(), Rect(), 0, 0, 0)
         )
 
     private val taskView =
@@ -69,61 +91,97 @@
             tasksAdapterFactory,
             taskViewSizeProvider,
             activityTaskManager,
-            resultHandler
+            resultHandler,
+            splitScreen,
         )
 
     @Test
-    fun onRecentAppClicked_taskWithSameIdIsStartedFromRecents() {
-        controller.onRecentAppClicked(task, taskView)
+    fun onRecentAppClicked_fullScreenTaskWithSameIdIsStartedFromRecents() {
+        controller.onRecentAppClicked(fullScreenTask, taskView)
 
-        verify(activityTaskManager).startActivityFromRecents(eq(task.taskId), any())
+        verify(activityTaskManager).startActivityFromRecents(eq(fullScreenTask.taskId), any())
+    }
+
+    @Test
+    fun onRecentAppClicked_splitScreenTaskWithSameIdIsStartedFromRecents() {
+        mSetFlagsRule.enableFlags(FLAG_PSS_APP_SELECTOR_RECENTS_SPLIT_SCREEN)
+        controller.onRecentAppClicked(splitScreenTask, taskView)
+
+        verify(splitScreen.get())
+            .startTasks(
+                eq(splitScreenTask.taskId),
+                any(),
+                anyInt(),
+                any(),
+                anyInt(),
+                anyInt(),
+                any(),
+                any()
+            )
     }
 
     @Test
     fun onRecentAppClicked_launchDisplayIdIsSet() {
-        controller.onRecentAppClicked(task, taskView)
+        controller.onRecentAppClicked(fullScreenTask, taskView)
 
-        assertThat(getStartedTaskActivityOptions().launchDisplayId).isEqualTo(task.displayId)
+        assertThat(getStartedTaskActivityOptions(fullScreenTask.taskId).launchDisplayId)
+            .isEqualTo(fullScreenTask.displayId)
     }
 
     @Test
-    fun onRecentAppClicked_taskNotInForeground_usesScaleUpAnimation() {
-        controller.onRecentAppClicked(task, taskView)
+    fun onRecentAppClicked_fullScreenTaskNotInForeground_usesScaleUpAnimation() {
+        assertThat(fullScreenTask.isForegroundTask).isFalse()
+        controller.onRecentAppClicked(fullScreenTask, taskView)
 
-        assertThat(getStartedTaskActivityOptions().animationType)
+        assertThat(getStartedTaskActivityOptions(fullScreenTask.taskId).animationType)
             .isEqualTo(ActivityOptions.ANIM_SCALE_UP)
     }
 
     @Test
-    fun onRecentAppClicked_taskInForeground_flagOff_usesScaleUpAnimation() {
+    fun onRecentAppClicked_fullScreenTaskInForeground_flagOff_usesScaleUpAnimation() {
         mSetFlagsRule.disableFlags(FLAG_PSS_APP_SELECTOR_ABRUPT_EXIT_FIX)
 
-        controller.onRecentAppClicked(task, taskView)
+        controller.onRecentAppClicked(fullScreenTask, taskView)
 
-        assertThat(getStartedTaskActivityOptions().animationType)
+        assertThat(getStartedTaskActivityOptions(fullScreenTask.taskId).animationType)
             .isEqualTo(ActivityOptions.ANIM_SCALE_UP)
     }
 
     @Test
-    fun onRecentAppClicked_taskInForeground_flagOn_usesDefaultAnimation() {
+    fun onRecentAppClicked_fullScreenTaskInForeground_flagOn_usesDefaultAnimation() {
         mSetFlagsRule.enableFlags(FLAG_PSS_APP_SELECTOR_ABRUPT_EXIT_FIX)
-        val foregroundTask = task.copy(isForegroundTask = true)
+        assertForegroundTaskUsesDefaultCloseAnimation(fullScreenTask)
+    }
 
+    @Test
+    fun onRecentAppClicked_splitScreenTaskInForeground_flagOn_usesDefaultAnimation() {
+        mSetFlagsRule.enableFlags(
+            FLAG_PSS_APP_SELECTOR_ABRUPT_EXIT_FIX,
+            FLAG_PSS_APP_SELECTOR_RECENTS_SPLIT_SCREEN
+        )
+        assertForegroundTaskUsesDefaultCloseAnimation(splitScreenTask)
+    }
+
+    private fun assertForegroundTaskUsesDefaultCloseAnimation(task: RecentTask) {
+        val foregroundTask = task.copy(isForegroundTask = true)
         controller.onRecentAppClicked(foregroundTask, taskView)
 
         expect
-            .that(getStartedTaskActivityOptions().animationType)
+            .that(getStartedTaskActivityOptions(foregroundTask.taskId).animationType)
             .isEqualTo(ActivityOptions.ANIM_CUSTOM)
-        expect.that(getStartedTaskActivityOptions().overrideTaskTransition).isTrue()
         expect
-            .that(getStartedTaskActivityOptions().customExitResId)
+            .that(getStartedTaskActivityOptions(foregroundTask.taskId).overrideTaskTransition)
+            .isTrue()
+        expect
+            .that(getStartedTaskActivityOptions(foregroundTask.taskId).customExitResId)
             .isEqualTo(com.android.internal.R.anim.resolver_close_anim)
-        expect.that(getStartedTaskActivityOptions().customEnterResId).isEqualTo(0)
+        expect
+            .that(getStartedTaskActivityOptions(foregroundTask.taskId).customEnterResId)
+            .isEqualTo(0)
     }
 
-    private fun getStartedTaskActivityOptions(): ActivityOptions {
-        verify(activityTaskManager)
-            .startActivityFromRecents(eq(task.taskId), bundleCaptor.capture())
+    private fun getStartedTaskActivityOptions(taskId: Int): ActivityOptions {
+        verify(activityTaskManager).startActivityFromRecents(eq(taskId), bundleCaptor.capture())
         return ActivityOptions.fromBundle(bundleCaptor.value)
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
index e5ba569..a702dda 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
@@ -41,6 +41,7 @@
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
 import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
@@ -56,6 +57,8 @@
 import com.android.systemui.statusbar.phone.CentralSurfaces;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 
+import dagger.Lazy;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -67,8 +70,6 @@
 import java.util.Optional;
 import java.util.concurrent.Executor;
 
-import dagger.Lazy;
-
 /**
  * Tests for {@link NavBarHelper}.
  */
@@ -269,8 +270,8 @@
 
     @Test
     public void initNavBarHelper_buttonModeNavBar_a11yButtonClickableState() {
-        when(mAccessibilityManager.getAccessibilityShortcutTargets(
-                AccessibilityManager.ACCESSIBILITY_BUTTON)).thenReturn(createFakeShortcutTargets());
+        when(mAccessibilityManager.getAccessibilityShortcutTargets(UserShortcutType.SOFTWARE))
+                .thenReturn(createFakeShortcutTargets());
 
         mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
 
@@ -294,8 +295,8 @@
         when(mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode()).thenReturn(
                 ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR);
 
-        when(mAccessibilityManager.getAccessibilityShortcutTargets(
-                AccessibilityManager.ACCESSIBILITY_BUTTON)).thenReturn(createFakeShortcutTargets());
+        when(mAccessibilityManager.getAccessibilityShortcutTargets(UserShortcutType.SOFTWARE))
+                .thenReturn(createFakeShortcutTargets());
         mAccessibilityServicesStateChangeListener.onAccessibilityServicesStateChanged(
                 mAccessibilityManager);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
index db0c0bc..890e1e0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java
@@ -138,6 +138,8 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @SmallTest
@@ -1576,6 +1578,7 @@
     @Test
     public void testUpdateGeneratedPreview_flagDisabled() {
         mSetFlagsRule.disableFlags(android.appwidget.flags.Flags.FLAG_GENERATED_PREVIEWS);
+        mSetFlagsRule.disableFlags(android.appwidget.flags.Flags.FLAG_DRAW_DATA_PARCEL);
         mManager.updateGeneratedPreviewForUser(mUserTracker.getUserHandle());
         verify(mAppWidgetManager, times(0)).setWidgetPreview(any(), anyInt(), any());
     }
@@ -1583,6 +1586,7 @@
     @Test
     public void testUpdateGeneratedPreview_userLocked() {
         mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_GENERATED_PREVIEWS);
+        mSetFlagsRule.disableFlags(android.appwidget.flags.Flags.FLAG_DRAW_DATA_PARCEL);
         when(mUserManager.isUserUnlocked(mUserTracker.getUserHandle())).thenReturn(false);
 
         mManager.updateGeneratedPreviewForUser(mUserTracker.getUserHandle());
@@ -1592,6 +1596,7 @@
     @Test
     public void testUpdateGeneratedPreview_userUnlocked() {
         mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_GENERATED_PREVIEWS);
+        mSetFlagsRule.disableFlags(android.appwidget.flags.Flags.FLAG_DRAW_DATA_PARCEL);
         when(mUserManager.isUserUnlocked(mUserTracker.getUserHandle())).thenReturn(true);
         when(mAppWidgetManager.setWidgetPreview(any(), anyInt(), any())).thenReturn(true);
 
@@ -1602,6 +1607,7 @@
     @Test
     public void testUpdateGeneratedPreview_doesNotSetTwice() {
         mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_GENERATED_PREVIEWS);
+        mSetFlagsRule.disableFlags(android.appwidget.flags.Flags.FLAG_DRAW_DATA_PARCEL);
         when(mUserManager.isUserUnlocked(mUserTracker.getUserHandle())).thenReturn(true);
         when(mAppWidgetManager.setWidgetPreview(any(), anyInt(), any())).thenReturn(true);
 
@@ -1610,6 +1616,54 @@
         verify(mAppWidgetManager, times(1)).setWidgetPreview(any(), anyInt(), any());
     }
 
+    @Test
+    public void testUpdateGeneratedPreviewWithDataParcel_userLocked() throws InterruptedException {
+        mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_GENERATED_PREVIEWS);
+        mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_DRAW_DATA_PARCEL);
+        when(mUserManager.isUserUnlocked(mUserTracker.getUserHandle())).thenReturn(false);
+
+        mManager.updateGeneratedPreviewForUser(mUserTracker.getUserHandle());
+        assertThat(waitForBackgroundJob()).isTrue();
+        verify(mAppWidgetManager, times(0)).setWidgetPreview(any(), anyInt(), any());
+    }
+
+    @Test
+    public void testUpdateGeneratedPreviewWithDataParcel_userUnlocked()
+            throws InterruptedException {
+        mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_GENERATED_PREVIEWS);
+        mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_DRAW_DATA_PARCEL);
+        when(mUserManager.isUserUnlocked(mUserTracker.getUserHandle())).thenReturn(true);
+        when(mAppWidgetManager.setWidgetPreview(any(), anyInt(), any())).thenReturn(true);
+
+        mManager.updateGeneratedPreviewForUser(mUserTracker.getUserHandle());
+        assertThat(waitForBackgroundJob()).isTrue();
+        verify(mAppWidgetManager, times(1)).setWidgetPreview(any(), anyInt(), any());
+    }
+
+    @Test
+    public void testUpdateGeneratedPreviewWithDataParcel_doesNotSetTwice()
+            throws InterruptedException {
+        mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_GENERATED_PREVIEWS);
+        mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_DRAW_DATA_PARCEL);
+        when(mUserManager.isUserUnlocked(mUserTracker.getUserHandle())).thenReturn(true);
+        when(mAppWidgetManager.setWidgetPreview(any(), anyInt(), any())).thenReturn(true);
+
+        mManager.updateGeneratedPreviewForUser(mUserTracker.getUserHandle());
+        mManager.updateGeneratedPreviewForUser(mUserTracker.getUserHandle());
+        assertThat(waitForBackgroundJob()).isTrue();
+        verify(mAppWidgetManager, times(1)).setWidgetPreview(any(), anyInt(), any());
+    }
+
+    private boolean waitForBackgroundJob() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        mFakeExecutor.execute(latch::countDown);
+        mFakeExecutor.runAllReady();
+        mFakeExecutor.advanceClockToNext();
+        mFakeExecutor.runAllReady();
+        return latch.await(30000, TimeUnit.MILLISECONDS);
+
+    }
+
     private void setFinalField(String fieldName, int value) {
         try {
             Field field = NotificationManager.Policy.class.getDeclaredField(fieldName);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/domain/repository/IconTilesRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/domain/repository/IconTilesRepositoryImplTest.kt
new file mode 100644
index 0000000..8cc3a85
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/domain/repository/IconTilesRepositoryImplTest.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.qs.panels.domain.repository
+
+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.qs.panels.data.repository.IconTilesRepositoryImpl
+import com.android.systemui.qs.pipeline.shared.TileSpec
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class IconTilesRepositoryImplTest : SysuiTestCase() {
+
+    private val underTest = IconTilesRepositoryImpl()
+
+    @Test
+    fun iconTilesSpecsIsValid() = runTest {
+        val tilesSpecs by collectLastValue(underTest.iconTilesSpecs)
+        assertThat(tilesSpecs).isEqualTo(ICON_ONLY_TILES_SPECS)
+    }
+
+    companion object {
+        private val ICON_ONLY_TILES_SPECS =
+            setOf(
+                TileSpec.create("airplane"),
+                TileSpec.create("battery"),
+                TileSpec.create("cameratoggle"),
+                TileSpec.create("cast"),
+                TileSpec.create("color_correction"),
+                TileSpec.create("inversion"),
+                TileSpec.create("saver"),
+                TileSpec.create("dnd"),
+                TileSpec.create("flashlight"),
+                TileSpec.create("location"),
+                TileSpec.create("mictoggle"),
+                TileSpec.create("nfc"),
+                TileSpec.create("night"),
+                TileSpec.create("rotation")
+            )
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt
index 04e214a..2b1ac91 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt
@@ -410,6 +410,36 @@
         assertThat(tileView.hasLongPressEffect).isTrue()
     }
 
+    @Test
+    @EnableFlags(FLAG_QUICK_SETTINGS_VISUAL_HAPTICS_LONGPRESS)
+    fun onStateChange_fromLongPress_to_noLongPress_unBoundsTile() {
+        // GIVEN a state that no longer handles long-press
+        val state = QSTile.State()
+        state.handlesLongClick = false
+
+        // WHEN the state changes
+        tileView.changeState(state)
+
+        // THEN the view binder no longer binds the view to the long-press effect
+        assertThat(tileView.isLongPressEffectBound).isFalse()
+    }
+
+    @Test
+    @EnableFlags(FLAG_QUICK_SETTINGS_VISUAL_HAPTICS_LONGPRESS)
+    fun onStateChange_fromNoLongPress_to_longPress_bindsTile() {
+        // GIVEN that the tile has changed to a state that does not handle long-press
+        val state = QSTile.State()
+        state.handlesLongClick = false
+        tileView.changeState(state)
+
+        // WHEN the state changes back to handling long-press
+        state.handlesLongClick = true
+        tileView.changeState(state)
+
+        // THEN the view is bounded to the long-press effect
+        assertThat(tileView.isLongPressEffectBound).isTrue()
+    }
+
     class FakeTileView(
         context: Context,
         collapsed: Boolean
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt
index 82ee99a..830f08a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BluetoothTileTest.kt
@@ -23,7 +23,7 @@
 import com.android.systemui.qs.QsEventLogger
 import com.android.systemui.qs.logging.QSLogger
 import com.android.systemui.qs.tileimpl.QSTileImpl
-import com.android.systemui.qs.tiles.dialog.bluetooth.BluetoothTileDialogViewModel
+import com.android.systemui.bluetooth.qsdialog.BluetoothTileDialogViewModel
 import com.android.systemui.statusbar.policy.BluetoothController
 import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.eq
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/HearingDevicesTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/HearingDevicesTileTest.java
new file mode 100644
index 0000000..73aa54c
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/HearingDevicesTileTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Intent;
+import android.os.Handler;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.provider.Settings;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.View;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.systemui.Flags;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.accessibility.hearingaid.HearingDevicesDialogManager;
+import com.android.systemui.classifier.FalsingManagerFake;
+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 org.junit.After;
+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.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+/** Tests for {@link HearingDevicesTile}. */
+@RunWith(AndroidTestingRunner.class)
[email protected](setAsMainLooper = true)
+@SmallTest
+public class HearingDevicesTileTest extends SysuiTestCase {
+
+    @Rule
+    public MockitoRule mockito = MockitoJUnit.rule();
+
+    @Mock
+    private QSHost mHost;
+    @Mock
+    private QsEventLogger mUiEventLogger;
+    @Mock
+    private MetricsLogger mMetricsLogger;
+    @Mock
+    private StatusBarStateController mStatusBarStateController;
+    @Mock
+    private ActivityStarter mActivityStarter;
+    @Mock
+    private QSLogger mQSLogger;
+    @Mock
+    HearingDevicesDialogManager mHearingDevicesDialogManager;
+
+    private TestableLooper mTestableLooper;
+    private HearingDevicesTile mTile;
+
+    @Before
+    public void setUp() throws Exception {
+        mTestableLooper = TestableLooper.get(this);
+        when(mHost.getContext()).thenReturn(mContext);
+
+        mTile = new HearingDevicesTile(
+                mHost,
+                mUiEventLogger,
+                mTestableLooper.getLooper(),
+                new Handler(mTestableLooper.getLooper()),
+                new FalsingManagerFake(),
+                mMetricsLogger,
+                mStatusBarStateController,
+                mActivityStarter,
+                mQSLogger,
+                mHearingDevicesDialogManager);
+
+        mTile.initialize();
+        mTestableLooper.processAllMessages();
+    }
+
+    @After
+    public void tearDown() {
+        mTile.destroy();
+        mTestableLooper.processAllMessages();
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG)
+    public void isAvailable_flagEnabled_true() {
+        assertThat(mTile.isAvailable()).isTrue();
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG)
+    public void isAvailable_flagDisabled_false() {
+        assertThat(mTile.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void longClick_expectedAction() {
+        mTile.longClick(null);
+        mTestableLooper.processAllMessages();
+
+        ArgumentCaptor<Intent> IntentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mActivityStarter).postStartActivityDismissingKeyguard(IntentCaptor.capture(),
+                anyInt(), any());
+        assertThat(IntentCaptor.getValue().getAction()).isEqualTo(
+                Settings.ACTION_HEARING_DEVICES_SETTINGS);
+    }
+
+    @Test
+    public void handleClick_dialogShown() {
+        View view = new View(mContext);
+        mTile.handleClick(view);
+        mTestableLooper.processAllMessages();
+
+        verify(mHearingDevicesDialogManager).showDialog(view);
+    }
+}
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
index 2d18f92..122d9e4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java
@@ -58,7 +58,6 @@
 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.classifier.FalsingManagerFake;
 import com.android.systemui.plugins.ActivityStarter;
@@ -68,6 +67,7 @@
 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;
@@ -198,7 +198,8 @@
     }
 
     @Test
-    public void testIsAvailable_qawFeatureAvailable() {
+    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,
@@ -208,6 +209,16 @@
     }
 
     @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);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImplTest.kt
index ea2b22c..0ec8552 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImplTest.kt
@@ -77,7 +77,7 @@
         underTest =
             QSTileViewModelImpl(
                 QSTileConfigTestBuilder.build {
-                    policy = QSTilePolicy.Restricted("test_restriction")
+                    policy = QSTilePolicy.Restricted(listOf("test_restriction"))
                 },
                 { tileUserActionInteractor },
                 { tileDataInteractor },
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 74f50df..b384fe8 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
@@ -37,6 +37,7 @@
 import android.net.ConnectivityManager;
 import android.net.Network;
 import android.net.NetworkCapabilities;
+import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
 import android.os.Handler;
 import android.telephony.ServiceState;
@@ -176,6 +177,8 @@
     private WifiStateWorker mWifiStateWorker;
     @Mock
     private SignalStrength mSignalStrength;
+    @Mock
+    private WifiConfiguration mWifiConfiguration;
 
     private FakeFeatureFlags mFlags = new FakeFeatureFlags();
 
@@ -1037,9 +1040,19 @@
     }
 
     @Test
+    public void getConfiguratorQrCodeGeneratorIntentOrNull_configurationNull_returnNull() {
+        mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, true);
+        when(mConnectedEntry.canShare()).thenReturn(true);
+        when(mConnectedEntry.getWifiConfiguration()).thenReturn(null);
+        assertThat(mInternetDialogController.getConfiguratorQrCodeGeneratorIntentOrNull(
+                mConnectedEntry)).isNull();
+    }
+
+    @Test
     public void getConfiguratorQrCodeGeneratorIntentOrNull_wifiShareable() {
         mFlags.set(Flags.SHARE_WIFI_QS_BUTTON, true);
         when(mConnectedEntry.canShare()).thenReturn(true);
+        when(mConnectedEntry.getWifiConfiguration()).thenReturn(mWifiConfiguration);
         assertThat(mInternetDialogController.getConfiguratorQrCodeGeneratorIntentOrNull(
                 mConnectedEntry)).isNotNull();
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnInteractorTest.kt
deleted file mode 100644
index 036d3c8..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnInteractorTest.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.qs.tiles.dialog.bluetooth
-
-import android.bluetooth.BluetoothAdapter
-import android.testing.AndroidTestingRunner
-import androidx.test.filters.SmallTest
-import com.android.settingslib.bluetooth.LocalBluetoothManager
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
-import kotlin.test.Test
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Assert.assertFalse
-import org.junit.Assert.assertTrue
-import org.junit.Before
-import org.junit.Rule
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.anyBoolean
-import org.mockito.Mock
-import org.mockito.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
-class BluetoothAutoOnInteractorTest : SysuiTestCase() {
-    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
-    private val testDispatcher = StandardTestDispatcher()
-    private val testScope = TestScope(testDispatcher)
-    private val bluetoothAdapter =
-        mock<BluetoothAdapter> {
-            var autoOn = false
-            whenever(isAutoOnEnabled).thenAnswer { autoOn }
-
-            whenever(setAutoOnEnabled(anyBoolean())).thenAnswer { invocation ->
-                autoOn = invocation.getArgument(0) as Boolean
-                autoOn
-            }
-        }
-    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
-    private lateinit var bluetoothAutoOnInteractor: BluetoothAutoOnInteractor
-
-    @Before
-    fun setUp() {
-        bluetoothAutoOnInteractor =
-            BluetoothAutoOnInteractor(
-                BluetoothAutoOnRepository(
-                    localBluetoothManager,
-                    bluetoothAdapter,
-                    testScope.backgroundScope,
-                    testDispatcher,
-                )
-            )
-    }
-
-    @Test
-    fun testSetEnabled_bluetoothAutoOnUnsupported_doNothing() {
-        testScope.runTest {
-            whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(false)
-
-            bluetoothAutoOnInteractor.setEnabled(true)
-            runCurrent()
-
-            assertFalse(bluetoothAdapter.isAutoOnEnabled)
-        }
-    }
-
-    @Test
-    fun testSetEnabled_bluetoothAutoOnSupported_setNewValue() {
-        testScope.runTest {
-            whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(true)
-
-            bluetoothAutoOnInteractor.setEnabled(true)
-            runCurrent()
-
-            assertTrue(bluetoothAdapter.isAutoOnEnabled)
-        }
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnRepositoryTest.kt
deleted file mode 100644
index 3119284..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothAutoOnRepositoryTest.kt
+++ /dev/null
@@ -1,99 +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.qs.tiles.dialog.bluetooth
-
-import android.bluetooth.BluetoothAdapter
-import android.testing.AndroidTestingRunner
-import androidx.test.filters.SmallTest
-import com.android.settingslib.bluetooth.BluetoothEventManager
-import com.android.settingslib.bluetooth.LocalBluetoothManager
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.util.mockito.whenever
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
-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.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
-class BluetoothAutoOnRepositoryTest : SysuiTestCase() {
-    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
-    private val testDispatcher = StandardTestDispatcher()
-    private val testScope = TestScope(testDispatcher)
-    @Mock private lateinit var bluetoothAdapter: BluetoothAdapter
-    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
-    @Mock private lateinit var eventManager: BluetoothEventManager
-
-    private lateinit var bluetoothAutoOnRepository: BluetoothAutoOnRepository
-
-    @Before
-    fun setUp() {
-        whenever(localBluetoothManager.eventManager).thenReturn(eventManager)
-        bluetoothAutoOnRepository =
-            BluetoothAutoOnRepository(
-                localBluetoothManager,
-                bluetoothAdapter,
-                testScope.backgroundScope,
-                testDispatcher,
-            )
-    }
-
-    @Test
-    fun testIsAutoOn_returnFalse() {
-        testScope.runTest {
-            whenever(bluetoothAdapter.isAutoOnEnabled).thenReturn(false)
-            val actualValue by collectLastValue(bluetoothAutoOnRepository.isAutoOn)
-
-            runCurrent()
-
-            assertThat(actualValue).isEqualTo(false)
-        }
-    }
-
-    @Test
-    fun testIsAutoOn_returnTrue() {
-        testScope.runTest {
-            whenever(bluetoothAdapter.isAutoOnEnabled).thenReturn(true)
-            val actualValue by collectLastValue(bluetoothAutoOnRepository.isAutoOn)
-
-            runCurrent()
-
-            assertThat(actualValue).isEqualTo(true)
-        }
-    }
-
-    @Test
-    fun testIsAutoOnSupported_returnTrue() {
-        testScope.runTest {
-            whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(true)
-            val actualValue = bluetoothAutoOnRepository.isAutoOnSupported()
-
-            runCurrent()
-
-            assertThat(actualValue).isEqualTo(true)
-        }
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothStateInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothStateInteractorTest.kt
deleted file mode 100644
index 479e62d..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothStateInteractorTest.kt
+++ /dev/null
@@ -1,98 +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.tiles.dialog.bluetooth
-
-import android.testing.AndroidTestingRunner
-import android.testing.TestableLooper
-import androidx.test.filters.SmallTest
-import com.android.settingslib.bluetooth.LocalBluetoothAdapter
-import com.android.settingslib.bluetooth.LocalBluetoothManager
-import com.android.systemui.SysuiTestCase
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.test.TestScope
-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.never
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.`when`
-import org.mockito.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
-class BluetoothStateInteractorTest : SysuiTestCase() {
-    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
-    private val testScope = TestScope()
-
-    private lateinit var bluetoothStateInteractor: BluetoothStateInteractor
-
-    @Mock private lateinit var bluetoothAdapter: LocalBluetoothAdapter
-    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
-    @Mock private lateinit var logger: BluetoothTileDialogLogger
-
-    @Before
-    fun setUp() {
-        bluetoothStateInteractor =
-            BluetoothStateInteractor(localBluetoothManager, logger, testScope.backgroundScope)
-        `when`(localBluetoothManager.bluetoothAdapter).thenReturn(bluetoothAdapter)
-    }
-
-    @Test
-    fun testGet_isBluetoothEnabled() {
-        testScope.runTest {
-            `when`(bluetoothAdapter.isEnabled).thenReturn(true)
-
-            assertThat(bluetoothStateInteractor.isBluetoothEnabled).isTrue()
-        }
-    }
-
-    @Test
-    fun testGet_isBluetoothDisabled() {
-        testScope.runTest {
-            `when`(bluetoothAdapter.isEnabled).thenReturn(false)
-
-            assertThat(bluetoothStateInteractor.isBluetoothEnabled).isFalse()
-        }
-    }
-
-    @Test
-    fun testSet_bluetoothEnabled() {
-        testScope.runTest {
-            `when`(bluetoothAdapter.isEnabled).thenReturn(false)
-
-            bluetoothStateInteractor.isBluetoothEnabled = true
-            verify(bluetoothAdapter).enable()
-            verify(logger)
-                .logBluetoothState(BluetoothStateStage.BLUETOOTH_STATE_VALUE_SET, true.toString())
-        }
-    }
-
-    @Test
-    fun testSet_bluetoothNoChange() {
-        testScope.runTest {
-            `when`(bluetoothAdapter.isEnabled).thenReturn(false)
-
-            bluetoothStateInteractor.isBluetoothEnabled = false
-            verify(bluetoothAdapter, never()).enable()
-        }
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogDelegateTest.kt
deleted file mode 100644
index 17b6127..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogDelegateTest.kt
+++ /dev/null
@@ -1,336 +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.tiles.dialog.bluetooth
-
-import android.content.Context
-import android.graphics.drawable.Drawable
-import android.testing.AndroidTestingRunner
-import android.testing.TestableLooper
-import android.view.LayoutInflater
-import android.view.View
-import android.view.View.GONE
-import android.view.View.VISIBLE
-import android.view.ViewGroup.LayoutParams.MATCH_PARENT
-import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import androidx.test.filters.SmallTest
-import com.android.internal.logging.UiEventLogger
-import com.android.settingslib.bluetooth.CachedBluetoothDevice
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.animation.DialogTransitionAnimator
-import com.android.systemui.model.SysUiState
-import com.android.systemui.res.R
-import com.android.systemui.statusbar.phone.SystemUIDialog
-import com.android.systemui.statusbar.phone.SystemUIDialogManager
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.whenever
-import com.android.systemui.util.time.FakeSystemClock
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.test.TestCoroutineScheduler
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
-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.ArgumentMatchers.anyBoolean
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.Mock
-import org.mockito.Mockito.`when`
-import org.mockito.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
-class BluetoothTileDialogDelegateTest : SysuiTestCase() {
-    companion object {
-        const val DEVICE_NAME = "device"
-        const val DEVICE_CONNECTION_SUMMARY = "active"
-        const val ENABLED = true
-        const val CONTENT_HEIGHT = WRAP_CONTENT
-    }
-
-    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
-
-    @Mock private lateinit var cachedBluetoothDevice: CachedBluetoothDevice
-
-    @Mock private lateinit var bluetoothTileDialogCallback: BluetoothTileDialogCallback
-
-    @Mock private lateinit var drawable: Drawable
-
-    @Mock private lateinit var uiEventLogger: UiEventLogger
-
-    @Mock private lateinit var logger: BluetoothTileDialogLogger
-
-    private val uiProperties =
-        BluetoothTileDialogViewModel.UiProperties.build(
-            isBluetoothEnabled = ENABLED,
-            isAutoOnToggleFeatureAvailable = ENABLED
-        )
-    @Mock private lateinit var sysuiDialogFactory: SystemUIDialog.Factory
-    @Mock private lateinit var dialogManager: SystemUIDialogManager
-    @Mock private lateinit var sysuiState: SysUiState
-    @Mock private lateinit var dialogTransitionAnimator: DialogTransitionAnimator
-
-    private val fakeSystemClock = FakeSystemClock()
-
-    private lateinit var scheduler: TestCoroutineScheduler
-    private lateinit var dispatcher: CoroutineDispatcher
-    private lateinit var testScope: TestScope
-    private lateinit var icon: Pair<Drawable, String>
-    private lateinit var mBluetoothTileDialogDelegate: BluetoothTileDialogDelegate
-    private lateinit var deviceItem: DeviceItem
-
-    @Before
-    fun setUp() {
-        scheduler = TestCoroutineScheduler()
-        dispatcher = UnconfinedTestDispatcher(scheduler)
-        testScope = TestScope(dispatcher)
-
-        whenever(sysuiState.setFlag(anyInt(), anyBoolean())).thenReturn(sysuiState)
-
-        mBluetoothTileDialogDelegate =
-            BluetoothTileDialogDelegate(
-                uiProperties,
-                CONTENT_HEIGHT,
-                ENABLED,
-                bluetoothTileDialogCallback,
-                {},
-                dispatcher,
-                fakeSystemClock,
-                uiEventLogger,
-                logger,
-                sysuiDialogFactory
-            )
-
-        whenever(
-                sysuiDialogFactory.create(
-                    any(SystemUIDialog.Delegate::class.java)
-                )
-            )
-            .thenAnswer {
-                SystemUIDialog(
-                    mContext,
-                    0,
-                    SystemUIDialog.DEFAULT_DISMISS_ON_DEVICE_LOCK,
-                    dialogManager,
-                    sysuiState,
-                    fakeBroadcastDispatcher,
-                    dialogTransitionAnimator,
-                    it.getArgument(0)
-                )
-            }
-
-        icon = Pair(drawable, DEVICE_NAME)
-        deviceItem =
-            DeviceItem(
-                type = DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE,
-                cachedBluetoothDevice = cachedBluetoothDevice,
-                deviceName = DEVICE_NAME,
-                connectionSummary = DEVICE_CONNECTION_SUMMARY,
-                iconWithDescription = icon,
-                background = null
-            )
-        `when`(cachedBluetoothDevice.isBusy).thenReturn(false)
-    }
-
-    @Test
-    fun testShowDialog_createRecyclerViewWithAdapter() {
-        val dialog = mBluetoothTileDialogDelegate.createDialog()
-        dialog.show()
-
-        val recyclerView = dialog.requireViewById<RecyclerView>(R.id.device_list)
-
-        assertThat(recyclerView).isNotNull()
-        assertThat(recyclerView.visibility).isEqualTo(VISIBLE)
-        assertThat(recyclerView.adapter).isNotNull()
-        assertThat(recyclerView.layoutManager is LinearLayoutManager).isTrue()
-    }
-
-    @Test
-    fun testShowDialog_displayBluetoothDevice() {
-        testScope.runTest {
-            val dialog = mBluetoothTileDialogDelegate.createDialog()
-            dialog.show()
-            fakeSystemClock.setElapsedRealtime(Long.MAX_VALUE)
-            mBluetoothTileDialogDelegate.onDeviceItemUpdated(
-                dialog,
-                listOf(deviceItem),
-                showSeeAll = false,
-                showPairNewDevice = false
-            )
-
-            val recyclerView = dialog.requireViewById<RecyclerView>(R.id.device_list)
-            val adapter = recyclerView?.adapter as BluetoothTileDialogDelegate.Adapter
-            assertThat(adapter.itemCount).isEqualTo(1)
-            assertThat(adapter.getItem(0).deviceName).isEqualTo(DEVICE_NAME)
-            assertThat(adapter.getItem(0).connectionSummary).isEqualTo(DEVICE_CONNECTION_SUMMARY)
-            assertThat(adapter.getItem(0).iconWithDescription).isEqualTo(icon)
-        }
-    }
-
-    @Test
-    fun testDeviceItemViewHolder_cachedDeviceNotBusy() {
-        deviceItem.isEnabled = true
-
-        val view =
-            LayoutInflater.from(mContext).inflate(R.layout.bluetooth_device_item, null, false)
-        val viewHolder =
-            mBluetoothTileDialogDelegate
-                .Adapter(bluetoothTileDialogCallback)
-                .DeviceItemViewHolder(view)
-        viewHolder.bind(deviceItem, bluetoothTileDialogCallback)
-        val container = view.requireViewById<View>(R.id.bluetooth_device_row)
-
-        assertThat(container).isNotNull()
-        assertThat(container.isEnabled).isTrue()
-        assertThat(container.hasOnClickListeners()).isTrue()
-    }
-
-    @Test
-    fun testDeviceItemViewHolder_cachedDeviceBusy() {
-        deviceItem.isEnabled = false
-
-        val view =
-            LayoutInflater.from(mContext).inflate(R.layout.bluetooth_device_item, null, false)
-        val viewHolder =
-            BluetoothTileDialogDelegate(
-                    uiProperties,
-                    CONTENT_HEIGHT,
-                    ENABLED,
-                    bluetoothTileDialogCallback,
-                    {},
-                    dispatcher,
-                    fakeSystemClock,
-                    uiEventLogger,
-                    logger,
-                    sysuiDialogFactory,
-                )
-                .Adapter(bluetoothTileDialogCallback)
-                .DeviceItemViewHolder(view)
-        viewHolder.bind(deviceItem, bluetoothTileDialogCallback)
-        val container = view.requireViewById<View>(R.id.bluetooth_device_row)
-
-        assertThat(container).isNotNull()
-        assertThat(container.isEnabled).isFalse()
-        assertThat(container.hasOnClickListeners()).isTrue()
-    }
-
-    @Test
-    fun testOnDeviceUpdated_hideSeeAll_showPairNew() {
-        testScope.runTest {
-            val dialog = mBluetoothTileDialogDelegate.createDialog()
-            dialog.show()
-            fakeSystemClock.setElapsedRealtime(Long.MAX_VALUE)
-            mBluetoothTileDialogDelegate.onDeviceItemUpdated(
-                dialog,
-                listOf(deviceItem),
-                showSeeAll = false,
-                showPairNewDevice = true
-            )
-
-            val seeAllButton = dialog.requireViewById<View>(R.id.see_all_button)
-            val pairNewButton = dialog.requireViewById<View>(R.id.pair_new_device_button)
-            val recyclerView = dialog.requireViewById<RecyclerView>(R.id.device_list)
-            val adapter = recyclerView?.adapter as BluetoothTileDialogDelegate.Adapter
-            val scrollViewContent = dialog.requireViewById<View>(R.id.scroll_view)
-
-            assertThat(seeAllButton).isNotNull()
-            assertThat(seeAllButton.visibility).isEqualTo(GONE)
-            assertThat(pairNewButton).isNotNull()
-            assertThat(pairNewButton.visibility).isEqualTo(VISIBLE)
-            assertThat(adapter.itemCount).isEqualTo(1)
-            assertThat(scrollViewContent.layoutParams.height).isEqualTo(WRAP_CONTENT)
-        }
-    }
-
-    @Test
-    fun testShowDialog_cachedHeightLargerThanMinHeight_displayFromCachedHeight() {
-        testScope.runTest {
-            val cachedHeight = Int.MAX_VALUE
-            val dialog =
-                BluetoothTileDialogDelegate(
-                        BluetoothTileDialogViewModel.UiProperties.build(ENABLED, ENABLED),
-                        cachedHeight,
-                        ENABLED,
-                        bluetoothTileDialogCallback,
-                        {},
-                        dispatcher,
-                        fakeSystemClock,
-                        uiEventLogger,
-                        logger,
-                        sysuiDialogFactory,
-                    )
-                    .createDialog()
-            dialog.show()
-            assertThat(dialog.requireViewById<View>(R.id.scroll_view).layoutParams.height)
-                .isEqualTo(cachedHeight)
-        }
-    }
-
-    @Test
-    fun testShowDialog_cachedHeightLessThanMinHeight_displayFromUiProperties() {
-        testScope.runTest {
-            val dialog =
-                BluetoothTileDialogDelegate(
-                        BluetoothTileDialogViewModel.UiProperties.build(ENABLED, ENABLED),
-                        MATCH_PARENT,
-                        ENABLED,
-                        bluetoothTileDialogCallback,
-                        {},
-                        dispatcher,
-                        fakeSystemClock,
-                        uiEventLogger,
-                        logger,
-                        sysuiDialogFactory,
-                    )
-                    .createDialog()
-            dialog.show()
-            assertThat(dialog.requireViewById<View>(R.id.scroll_view).layoutParams.height)
-                .isGreaterThan(MATCH_PARENT)
-        }
-    }
-
-    @Test
-    fun testShowDialog_bluetoothEnabled_autoOnToggleGone() {
-        testScope.runTest {
-            val dialog =
-                BluetoothTileDialogDelegate(
-                        BluetoothTileDialogViewModel.UiProperties.build(ENABLED, ENABLED),
-                        MATCH_PARENT,
-                        ENABLED,
-                        bluetoothTileDialogCallback,
-                        {},
-                        dispatcher,
-                        fakeSystemClock,
-                        uiEventLogger,
-                        logger,
-                        sysuiDialogFactory,
-                    )
-                    .createDialog()
-            dialog.show()
-            assertThat(
-                    dialog.requireViewById<View>(R.id.bluetooth_auto_on_toggle_layout).visibility
-                )
-                .isEqualTo(GONE)
-        }
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogRepositoryTest.kt
deleted file mode 100644
index da8f60a..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogRepositoryTest.kt
+++ /dev/null
@@ -1,79 +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.tiles.dialog.bluetooth
-
-import android.bluetooth.BluetoothAdapter
-import android.testing.AndroidTestingRunner
-import android.testing.TestableLooper
-import androidx.test.filters.SmallTest
-import com.android.settingslib.bluetooth.CachedBluetoothDevice
-import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager
-import com.android.settingslib.bluetooth.LocalBluetoothManager
-import com.android.systemui.SysuiTestCase
-import com.google.common.truth.Truth.assertThat
-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.`when`
-import org.mockito.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
-class BluetoothTileDialogRepositoryTest : SysuiTestCase() {
-
-    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
-
-    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
-
-    @Mock private lateinit var bluetoothAdapter: BluetoothAdapter
-
-    @Mock private lateinit var cachedDeviceManager: CachedBluetoothDeviceManager
-
-    @Mock private lateinit var cachedDevicesCopy: Collection<CachedBluetoothDevice>
-
-    private lateinit var repository: BluetoothTileDialogRepository
-
-    @Before
-    fun setUp() {
-        `when`(localBluetoothManager.cachedDeviceManager).thenReturn(cachedDeviceManager)
-        `when`(cachedDeviceManager.cachedDevicesCopy).thenReturn(cachedDevicesCopy)
-
-        repository = BluetoothTileDialogRepository(localBluetoothManager, bluetoothAdapter)
-    }
-
-    @Test
-    fun testCachedDevices_bluetoothOff_emptyList() {
-        `when`(bluetoothAdapter.isEnabled).thenReturn(false)
-
-        val result = repository.cachedDevices
-
-        assertThat(result).isEmpty()
-    }
-
-    @Test
-    fun testCachedDevices_bluetoothOn_returnDevice() {
-        `when`(bluetoothAdapter.isEnabled).thenReturn(true)
-
-        val result = repository.cachedDevices
-
-        assertThat(result).isEqualTo(cachedDevicesCopy)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogViewModelTest.kt
deleted file mode 100644
index c8a2aa6..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/BluetoothTileDialogViewModelTest.kt
+++ /dev/null
@@ -1,281 +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.tiles.dialog.bluetooth
-
-import android.bluetooth.BluetoothAdapter
-import android.testing.AndroidTestingRunner
-import android.testing.TestableLooper
-import android.view.View
-import android.view.View.GONE
-import android.view.View.VISIBLE
-import android.widget.LinearLayout
-import androidx.test.filters.SmallTest
-import com.android.internal.logging.UiEventLogger
-import com.android.settingslib.bluetooth.CachedBluetoothDevice
-import com.android.settingslib.bluetooth.LocalBluetoothManager
-import com.android.settingslib.flags.Flags
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.animation.DialogTransitionAnimator
-import com.android.systemui.plugins.ActivityStarter
-import com.android.systemui.statusbar.phone.SystemUIDialog
-import com.android.systemui.util.FakeSharedPreferences
-import com.android.systemui.util.concurrency.FakeExecutor
-import com.android.systemui.util.kotlin.getMutableStateFlow
-import com.android.systemui.util.mockito.any
-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 kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.test.TestCoroutineScheduler
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
-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.ArgumentMatchers
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.Mock
-import org.mockito.Mockito.anyBoolean
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
-import org.mockito.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
-class BluetoothTileDialogViewModelTest : SysuiTestCase() {
-
-    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
-    private val fakeSystemClock = FakeSystemClock()
-    private val backgroundExecutor = FakeExecutor(fakeSystemClock)
-
-    private lateinit var bluetoothTileDialogViewModel: BluetoothTileDialogViewModel
-
-    @Mock private lateinit var bluetoothStateInteractor: BluetoothStateInteractor
-
-    @Mock private lateinit var bluetoothAutoOnInteractor: BluetoothAutoOnInteractor
-
-    @Mock private lateinit var deviceItemInteractor: DeviceItemInteractor
-
-    @Mock private lateinit var activityStarter: ActivityStarter
-
-    @Mock private lateinit var mDialogTransitionAnimator: DialogTransitionAnimator
-
-    @Mock private lateinit var cachedBluetoothDevice: CachedBluetoothDevice
-
-    @Mock private lateinit var deviceItem: DeviceItem
-
-    @Mock private lateinit var uiEventLogger: UiEventLogger
-
-    @Mock private lateinit var bluetoothAdapter: BluetoothAdapter
-
-    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
-
-    @Mock
-    private lateinit var mBluetoothTileDialogDelegateDelegateFactory:
-        BluetoothTileDialogDelegate.Factory
-
-    @Mock private lateinit var bluetoothTileDialogDelegate: BluetoothTileDialogDelegate
-
-    @Mock private lateinit var sysuiDialog: SystemUIDialog
-
-    private val sharedPreferences = FakeSharedPreferences()
-
-    private lateinit var scheduler: TestCoroutineScheduler
-    private lateinit var dispatcher: CoroutineDispatcher
-    private lateinit var testScope: TestScope
-
-    @Before
-    fun setUp() {
-        mSetFlagsRule.enableFlags(Flags.FLAG_BLUETOOTH_QS_TILE_DIALOG_AUTO_ON_TOGGLE)
-        scheduler = TestCoroutineScheduler()
-        dispatcher = UnconfinedTestDispatcher(scheduler)
-        testScope = TestScope(dispatcher)
-        bluetoothTileDialogViewModel =
-            BluetoothTileDialogViewModel(
-                deviceItemInteractor,
-                bluetoothStateInteractor,
-                // TODO(b/316822488): Create FakeBluetoothAutoOnInteractor.
-                BluetoothAutoOnInteractor(
-                    BluetoothAutoOnRepository(
-                        localBluetoothManager,
-                        bluetoothAdapter,
-                        testScope.backgroundScope,
-                        dispatcher
-                    )
-                ),
-                mDialogTransitionAnimator,
-                activityStarter,
-                uiEventLogger,
-                testScope.backgroundScope,
-                dispatcher,
-                dispatcher,
-                sharedPreferences,
-                mBluetoothTileDialogDelegateDelegateFactory
-            )
-        whenever(deviceItemInteractor.deviceItemUpdate).thenReturn(MutableSharedFlow())
-        whenever(bluetoothStateInteractor.bluetoothStateUpdate)
-            .thenReturn(MutableStateFlow(null).asStateFlow())
-        whenever(deviceItemInteractor.deviceItemUpdateRequest)
-            .thenReturn(MutableStateFlow(Unit).asStateFlow())
-        whenever(bluetoothStateInteractor.isBluetoothEnabled).thenReturn(true)
-        whenever(
-                mBluetoothTileDialogDelegateDelegateFactory.create(
-                    any(),
-                    anyInt(),
-                    ArgumentMatchers.anyBoolean(),
-                    any(),
-                    any()
-                )
-            )
-            .thenReturn(bluetoothTileDialogDelegate)
-        whenever(bluetoothTileDialogDelegate.createDialog()).thenReturn(sysuiDialog)
-        whenever(sysuiDialog.context).thenReturn(mContext)
-        whenever(bluetoothTileDialogDelegate.bluetoothStateToggle)
-            .thenReturn(getMutableStateFlow(false))
-        whenever(bluetoothTileDialogDelegate.deviceItemClick)
-            .thenReturn(getMutableStateFlow(deviceItem))
-        whenever(bluetoothTileDialogDelegate.contentHeight).thenReturn(getMutableStateFlow(0))
-        whenever(bluetoothTileDialogDelegate.bluetoothAutoOnToggle)
-            .thenReturn(getMutableStateFlow(false))
-    }
-
-    @Test
-    fun testShowDialog_noAnimation() {
-        testScope.runTest {
-            bluetoothTileDialogViewModel.showDialog(null)
-
-            verify(mDialogTransitionAnimator, never()).showFromView(any(), any(), any(), any())
-        }
-    }
-
-    @Test
-    fun testShowDialog_animated() {
-        testScope.runTest {
-            bluetoothTileDialogViewModel.showDialog(LinearLayout(mContext))
-
-            verify(mDialogTransitionAnimator).showFromView(any(), any(), nullable(), anyBoolean())
-        }
-    }
-
-    @Test
-    fun testShowDialog_animated_callInBackgroundThread() {
-        testScope.runTest {
-            backgroundExecutor.execute {
-                bluetoothTileDialogViewModel.showDialog(LinearLayout(mContext))
-
-                verify(mDialogTransitionAnimator)
-                    .showFromView(any(), any(), nullable(), anyBoolean())
-            }
-        }
-    }
-
-    @Test
-    fun testShowDialog_fetchDeviceItem() {
-        testScope.runTest {
-            bluetoothTileDialogViewModel.showDialog(null)
-
-            verify(deviceItemInteractor).deviceItemUpdate
-        }
-    }
-
-    @Test
-    fun testShowDialog_withBluetoothStateValue() {
-        testScope.runTest {
-            bluetoothTileDialogViewModel.showDialog(null)
-
-            verify(bluetoothStateInteractor).bluetoothStateUpdate
-        }
-    }
-
-    @Test
-    fun testStartSettingsActivity_activityLaunched_dialogDismissed() {
-        testScope.runTest {
-            whenever(deviceItem.cachedBluetoothDevice).thenReturn(cachedBluetoothDevice)
-            bluetoothTileDialogViewModel.showDialog(null)
-
-            val clickedView = View(context)
-            bluetoothTileDialogViewModel.onPairNewDeviceClicked(clickedView)
-
-            verify(uiEventLogger).log(BluetoothTileDialogUiEvent.PAIR_NEW_DEVICE_CLICKED)
-            verify(activityStarter).postStartActivityDismissingKeyguard(any(), anyInt(), nullable())
-        }
-    }
-
-    @Test
-    fun testBuildUiProperties_bluetoothOn_shouldHideAutoOn() {
-        testScope.runTest {
-            val actual =
-                BluetoothTileDialogViewModel.UiProperties.build(
-                    isBluetoothEnabled = true,
-                    isAutoOnToggleFeatureAvailable = true
-                )
-            assertThat(actual.autoOnToggleVisibility).isEqualTo(GONE)
-        }
-    }
-
-    @Test
-    fun testBuildUiProperties_bluetoothOff_shouldShowAutoOn() {
-        testScope.runTest {
-            val actual =
-                BluetoothTileDialogViewModel.UiProperties.build(
-                    isBluetoothEnabled = false,
-                    isAutoOnToggleFeatureAvailable = true
-                )
-            assertThat(actual.autoOnToggleVisibility).isEqualTo(VISIBLE)
-        }
-    }
-
-    @Test
-    fun testBuildUiProperties_bluetoothOff_autoOnFeatureUnavailable_shouldHideAutoOn() {
-        testScope.runTest {
-            val actual =
-                BluetoothTileDialogViewModel.UiProperties.build(
-                    isBluetoothEnabled = false,
-                    isAutoOnToggleFeatureAvailable = false
-                )
-            assertThat(actual.autoOnToggleVisibility).isEqualTo(GONE)
-        }
-    }
-
-    @Test
-    fun testIsAutoOnToggleFeatureAvailable_returnTrue() {
-        testScope.runTest {
-            whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(true)
-
-            val actual = bluetoothTileDialogViewModel.isAutoOnToggleFeatureAvailable()
-            assertThat(actual).isTrue()
-        }
-    }
-
-    @Test
-    fun testIsAutoOnToggleFeatureAvailable_returnFalse() {
-        testScope.runTest {
-            whenever(bluetoothAdapter.isAutoOnSupported).thenReturn(false)
-
-            val actual = bluetoothTileDialogViewModel.isAutoOnToggleFeatureAvailable()
-            assertThat(actual).isFalse()
-        }
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemFactoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemFactoryTest.kt
deleted file mode 100644
index a8cd8c8..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemFactoryTest.kt
+++ /dev/null
@@ -1,323 +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.tiles.dialog.bluetooth
-
-import android.bluetooth.BluetoothDevice
-import android.content.pm.PackageInfo
-import android.content.pm.PackageManager
-import android.media.AudioManager
-import android.platform.test.annotations.DisableFlags
-import android.platform.test.annotations.EnableFlags
-import android.testing.AndroidTestingRunner
-import android.testing.TestableLooper
-import androidx.test.filters.SmallTest
-import com.android.settingslib.bluetooth.BluetoothUtils
-import com.android.settingslib.bluetooth.CachedBluetoothDevice
-import com.android.settingslib.flags.Flags
-import com.android.systemui.SysuiTestCase
-import com.google.common.truth.Truth.assertThat
-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.`when`
-import org.mockito.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
-class DeviceItemFactoryTest : SysuiTestCase() {
-    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
-
-    @Mock private lateinit var cachedDevice: CachedBluetoothDevice
-    @Mock private lateinit var bluetoothDevice: BluetoothDevice
-    @Mock private lateinit var packageManager: PackageManager
-
-    private val availableMediaDeviceItemFactory = AvailableMediaDeviceItemFactory()
-    private val connectedDeviceItemFactory = ConnectedDeviceItemFactory()
-    private val savedDeviceItemFactory = SavedDeviceItemFactory()
-
-    private val audioManager = context.getSystemService(AudioManager::class.java)!!
-
-    @Before
-    fun setup() {
-        `when`(cachedDevice.name).thenReturn(DEVICE_NAME)
-        `when`(cachedDevice.address).thenReturn(DEVICE_ADDRESS)
-        `when`(cachedDevice.device).thenReturn(bluetoothDevice)
-        `when`(cachedDevice.connectionSummary).thenReturn(CONNECTION_SUMMARY)
-
-        context.setMockPackageManager(packageManager)
-    }
-
-    @Test
-    fun testAvailableMediaDeviceItemFactory_createFromCachedDevice() {
-        val deviceItem = availableMediaDeviceItemFactory.create(context, cachedDevice)
-
-        assertDeviceItem(deviceItem, DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE)
-    }
-
-    @Test
-    fun testConnectedDeviceItemFactory_createFromCachedDevice() {
-        val deviceItem = connectedDeviceItemFactory.create(context, cachedDevice)
-
-        assertDeviceItem(deviceItem, DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
-    }
-
-    @Test
-    fun testSavedDeviceItemFactory_createFromCachedDevice() {
-        val deviceItem = savedDeviceItemFactory.create(context, cachedDevice)
-
-        assertDeviceItem(deviceItem, DeviceItemType.SAVED_BLUETOOTH_DEVICE)
-        assertThat(deviceItem.background).isNotNull()
-    }
-
-    @Test
-    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testSavedFactory_isFilterMatched_bondedAndNotConnected_returnsTrue() {
-        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(cachedDevice.isConnected).thenReturn(false)
-
-        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isTrue()
-    }
-
-    @Test
-    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testSavedFactory_isFilterMatched_connected_returnsFalse() {
-        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(cachedDevice.isConnected).thenReturn(true)
-
-        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isFalse()
-    }
-
-    @Test
-    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testSavedFactory_isFilterMatched_notBonded_returnsFalse() {
-        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_NONE)
-        `when`(cachedDevice.isConnected).thenReturn(false)
-
-        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isFalse()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testSavedFactory_isFilterMatched_exclusivelyManaged_returnsFalse() {
-        val exclusiveManagerName =
-            BluetoothUtils.getExclusiveManagers().firstOrNull() ?: FAKE_EXCLUSIVE_MANAGER_NAME
-        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
-            .thenReturn(exclusiveManagerName.toByteArray())
-        `when`(packageManager.getPackageInfo(exclusiveManagerName, 0)).thenReturn(PackageInfo())
-        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(cachedDevice.isConnected).thenReturn(false)
-
-        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isFalse()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testSavedFactory_isFilterMatched_noExclusiveManager_returnsTrue() {
-        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(cachedDevice.isConnected).thenReturn(false)
-
-        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isTrue()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testSavedFactory_isFilterMatched_notAllowedExclusiveManager_returnsTrue() {
-        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
-            .thenReturn(FAKE_EXCLUSIVE_MANAGER_NAME.toByteArray())
-        `when`(packageManager.getPackageInfo(FAKE_EXCLUSIVE_MANAGER_NAME, 0))
-            .thenReturn(PackageInfo())
-        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(cachedDevice.isConnected).thenReturn(false)
-
-        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isTrue()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testSavedFactory_isFilterMatched_uninstalledExclusiveManager_returnsTrue() {
-        val exclusiveManagerName =
-            BluetoothUtils.getExclusiveManagers().firstOrNull() ?: FAKE_EXCLUSIVE_MANAGER_NAME
-        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
-            .thenReturn(exclusiveManagerName.toByteArray())
-        `when`(packageManager.getPackageInfo(exclusiveManagerName, 0))
-            .thenThrow(PackageManager.NameNotFoundException("Test!"))
-        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(cachedDevice.isConnected).thenReturn(false)
-
-        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isTrue()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testSavedFactory_isFilterMatched_notExclusivelyManaged_notBonded_returnsFalse() {
-        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_NONE)
-        `when`(cachedDevice.isConnected).thenReturn(false)
-
-        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isFalse()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testSavedFactory_isFilterMatched_notExclusivelyManaged_connected_returnsFalse() {
-        `when`(cachedDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(cachedDevice.isConnected).thenReturn(true)
-
-        assertThat(savedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isFalse()
-    }
-
-    @Test
-    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testConnectedFactory_isFilterMatched_bondedAndConnected_returnsTrue() {
-        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(bluetoothDevice.isConnected).thenReturn(true)
-        audioManager.setMode(AudioManager.MODE_NORMAL)
-
-        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isTrue()
-    }
-
-    @Test
-    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testConnectedFactory_isFilterMatched_notConnected_returnsFalse() {
-        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(bluetoothDevice.isConnected).thenReturn(false)
-        audioManager.setMode(AudioManager.MODE_NORMAL)
-
-        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isFalse()
-    }
-
-    @Test
-    @DisableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testConnectedFactory_isFilterMatched_notBonded_returnsFalse() {
-        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_NONE)
-        `when`(bluetoothDevice.isConnected).thenReturn(true)
-        audioManager.setMode(AudioManager.MODE_NORMAL)
-
-        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isFalse()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testConnectedFactory_isFilterMatched_exclusivelyManaged_returnsFalse() {
-        val exclusiveManagerName =
-            BluetoothUtils.getExclusiveManagers().firstOrNull() ?: FAKE_EXCLUSIVE_MANAGER_NAME
-        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
-            .thenReturn(exclusiveManagerName.toByteArray())
-        `when`(packageManager.getPackageInfo(exclusiveManagerName, 0)).thenReturn(PackageInfo())
-        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(bluetoothDevice.isConnected).thenReturn(true)
-        audioManager.setMode(AudioManager.MODE_NORMAL)
-
-        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isFalse()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testConnectedFactory_isFilterMatched_noExclusiveManager_returnsTrue() {
-        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(bluetoothDevice.isConnected).thenReturn(true)
-        audioManager.setMode(AudioManager.MODE_NORMAL)
-
-        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isTrue()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testConnectedFactory_isFilterMatched_notAllowedExclusiveManager_returnsTrue() {
-        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
-            .thenReturn(FAKE_EXCLUSIVE_MANAGER_NAME.toByteArray())
-        `when`(packageManager.getPackageInfo(FAKE_EXCLUSIVE_MANAGER_NAME, 0))
-            .thenReturn(PackageInfo())
-        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(bluetoothDevice.isConnected).thenReturn(true)
-        audioManager.setMode(AudioManager.MODE_NORMAL)
-
-        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isTrue()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testConnectedFactory_isFilterMatched_uninstalledExclusiveManager_returnsTrue() {
-        val exclusiveManagerName =
-            BluetoothUtils.getExclusiveManagers().firstOrNull() ?: FAKE_EXCLUSIVE_MANAGER_NAME
-        `when`(bluetoothDevice.getMetadata(BluetoothDevice.METADATA_EXCLUSIVE_MANAGER))
-            .thenReturn(exclusiveManagerName.toByteArray())
-        `when`(packageManager.getPackageInfo(exclusiveManagerName, 0))
-            .thenThrow(PackageManager.NameNotFoundException("Test!"))
-        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(bluetoothDevice.isConnected).thenReturn(true)
-        audioManager.setMode(AudioManager.MODE_NORMAL)
-
-        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isTrue()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testConnectedFactory_isFilterMatched_notExclusivelyManaged_notBonded_returnsFalse() {
-        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_NONE)
-        `when`(bluetoothDevice.isConnected).thenReturn(true)
-        audioManager.setMode(AudioManager.MODE_NORMAL)
-
-        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isFalse()
-    }
-
-    @Test
-    @EnableFlags(Flags.FLAG_ENABLE_HIDE_EXCLUSIVELY_MANAGED_BLUETOOTH_DEVICE)
-    fun testConnectedFactory_isFilterMatched_notExclusivelyManaged_notConnected_returnsFalse() {
-        `when`(bluetoothDevice.bondState).thenReturn(BluetoothDevice.BOND_BONDED)
-        `when`(bluetoothDevice.isConnected).thenReturn(false)
-        audioManager.setMode(AudioManager.MODE_NORMAL)
-
-        assertThat(connectedDeviceItemFactory.isFilterMatched(context, cachedDevice, audioManager))
-            .isFalse()
-    }
-
-    private fun assertDeviceItem(deviceItem: DeviceItem?, deviceItemType: DeviceItemType) {
-        assertThat(deviceItem).isNotNull()
-        assertThat(deviceItem!!.type).isEqualTo(deviceItemType)
-        assertThat(deviceItem.cachedBluetoothDevice).isEqualTo(cachedDevice)
-        assertThat(deviceItem.deviceName).isEqualTo(DEVICE_NAME)
-        assertThat(deviceItem.connectionSummary).isEqualTo(CONNECTION_SUMMARY)
-    }
-
-    companion object {
-        const val DEVICE_NAME = "DeviceName"
-        const val CONNECTION_SUMMARY = "ConnectionSummary"
-        private const val FAKE_EXCLUSIVE_MANAGER_NAME = "com.fake.name"
-        private const val DEVICE_ADDRESS = "04:52:C7:0B:D8:3C"
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemInteractorTest.kt
deleted file mode 100644
index ddf0b9a..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemInteractorTest.kt
+++ /dev/null
@@ -1,290 +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.tiles.dialog.bluetooth
-
-import android.bluetooth.BluetoothAdapter
-import android.bluetooth.BluetoothDevice
-import android.content.Context
-import android.media.AudioManager
-import android.testing.AndroidTestingRunner
-import android.testing.TestableLooper
-import androidx.test.filters.SmallTest
-import com.android.internal.logging.UiEventLogger
-import com.android.settingslib.bluetooth.CachedBluetoothDevice
-import com.android.settingslib.bluetooth.LocalBluetoothManager
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.util.time.FakeSystemClock
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
-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.verify
-import org.mockito.Mockito.`when`
-import org.mockito.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
[email protected](setAsMainLooper = true)
-class DeviceItemInteractorTest : SysuiTestCase() {
-
-    @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
-
-    @Mock private lateinit var bluetoothTileDialogRepository: BluetoothTileDialogRepository
-
-    @Mock private lateinit var cachedDevice1: CachedBluetoothDevice
-
-    @Mock private lateinit var cachedDevice2: CachedBluetoothDevice
-
-    @Mock private lateinit var device1: BluetoothDevice
-
-    @Mock private lateinit var device2: BluetoothDevice
-
-    @Mock private lateinit var deviceItem1: DeviceItem
-
-    @Mock private lateinit var deviceItem2: DeviceItem
-
-    @Mock private lateinit var audioManager: AudioManager
-
-    @Mock private lateinit var adapter: BluetoothAdapter
-
-    @Mock private lateinit var localBluetoothManager: LocalBluetoothManager
-
-    @Mock private lateinit var uiEventLogger: UiEventLogger
-
-    @Mock private lateinit var logger: BluetoothTileDialogLogger
-
-    private val fakeSystemClock = FakeSystemClock()
-
-    private lateinit var interactor: DeviceItemInteractor
-
-    private lateinit var dispatcher: CoroutineDispatcher
-
-    private lateinit var testScope: TestScope
-
-    @Before
-    fun setUp() {
-        dispatcher = UnconfinedTestDispatcher()
-        testScope = TestScope(dispatcher)
-        interactor =
-            DeviceItemInteractor(
-                bluetoothTileDialogRepository,
-                audioManager,
-                adapter,
-                localBluetoothManager,
-                fakeSystemClock,
-                uiEventLogger,
-                logger,
-                testScope.backgroundScope,
-                dispatcher
-            )
-
-        `when`(deviceItem1.cachedBluetoothDevice).thenReturn(cachedDevice1)
-        `when`(deviceItem2.cachedBluetoothDevice).thenReturn(cachedDevice2)
-        `when`(cachedDevice1.address).thenReturn("ADDRESS")
-        `when`(cachedDevice1.device).thenReturn(device1)
-        `when`(cachedDevice2.device).thenReturn(device2)
-        `when`(bluetoothTileDialogRepository.cachedDevices)
-            .thenReturn(listOf(cachedDevice1, cachedDevice2))
-    }
-
-    @Test
-    fun testUpdateDeviceItems_noCachedDevice_returnEmpty() {
-        testScope.runTest {
-            `when`(bluetoothTileDialogRepository.cachedDevices).thenReturn(emptyList())
-            interactor.setDeviceItemFactoryListForTesting(
-                listOf(createFactory({ true }, deviceItem1))
-            )
-
-            val latest by collectLastValue(interactor.deviceItemUpdate)
-            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
-
-            assertThat(latest).isEqualTo(emptyList<DeviceItem>())
-        }
-    }
-
-    @Test
-    fun testUpdateDeviceItems_hasCachedDevice_filterNotMatch_returnEmpty() {
-        testScope.runTest {
-            `when`(bluetoothTileDialogRepository.cachedDevices).thenReturn(listOf(cachedDevice1))
-            interactor.setDeviceItemFactoryListForTesting(
-                listOf(createFactory({ false }, deviceItem1))
-            )
-
-            val latest by collectLastValue(interactor.deviceItemUpdate)
-            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
-
-            assertThat(latest).isEqualTo(emptyList<DeviceItem>())
-        }
-    }
-
-    @Test
-    fun testUpdateDeviceItems_hasCachedDevice_filterMatch_returnDeviceItem() {
-        testScope.runTest {
-            `when`(bluetoothTileDialogRepository.cachedDevices).thenReturn(listOf(cachedDevice1))
-            interactor.setDeviceItemFactoryListForTesting(
-                listOf(createFactory({ true }, deviceItem1))
-            )
-
-            val latest by collectLastValue(interactor.deviceItemUpdate)
-            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
-
-            assertThat(latest).isEqualTo(listOf(deviceItem1))
-        }
-    }
-
-    @Test
-    fun testUpdateDeviceItems_hasCachedDevice_filterMatch_returnMultipleDeviceItem() {
-        testScope.runTest {
-            `when`(adapter.mostRecentlyConnectedDevices).thenReturn(null)
-            interactor.setDeviceItemFactoryListForTesting(
-                listOf(createFactory({ false }, deviceItem1), createFactory({ true }, deviceItem2))
-            )
-
-            val latest by collectLastValue(interactor.deviceItemUpdate)
-            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
-
-            assertThat(latest).isEqualTo(listOf(deviceItem2, deviceItem2))
-        }
-    }
-
-    @Test
-    fun testUpdateDeviceItems_sortByDisplayPriority() {
-        testScope.runTest {
-            `when`(adapter.mostRecentlyConnectedDevices).thenReturn(null)
-            interactor.setDeviceItemFactoryListForTesting(
-                listOf(
-                    createFactory({ cachedDevice -> cachedDevice.device == device1 }, deviceItem1),
-                    createFactory({ cachedDevice -> cachedDevice.device == device2 }, deviceItem2)
-                )
-            )
-            interactor.setDisplayPriorityForTesting(
-                listOf(
-                    DeviceItemType.SAVED_BLUETOOTH_DEVICE,
-                    DeviceItemType.CONNECTED_BLUETOOTH_DEVICE
-                )
-            )
-            `when`(deviceItem1.type).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
-            `when`(deviceItem2.type).thenReturn(DeviceItemType.SAVED_BLUETOOTH_DEVICE)
-
-            val latest by collectLastValue(interactor.deviceItemUpdate)
-            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
-
-            assertThat(latest).isEqualTo(listOf(deviceItem2, deviceItem1))
-        }
-    }
-
-    @Test
-    fun testUpdateDeviceItems_sameType_sortByRecentlyConnected() {
-        testScope.runTest {
-            `when`(adapter.mostRecentlyConnectedDevices).thenReturn(listOf(device2, device1))
-            interactor.setDeviceItemFactoryListForTesting(
-                listOf(
-                    createFactory({ cachedDevice -> cachedDevice.device == device1 }, deviceItem1),
-                    createFactory({ cachedDevice -> cachedDevice.device == device2 }, deviceItem2)
-                )
-            )
-            interactor.setDisplayPriorityForTesting(
-                listOf(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
-            )
-            `when`(deviceItem1.type).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
-            `when`(deviceItem2.type).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
-
-            val latest by collectLastValue(interactor.deviceItemUpdate)
-            interactor.updateDeviceItems(mContext, DeviceFetchTrigger.FIRST_LOAD)
-
-            assertThat(latest).isEqualTo(listOf(deviceItem2, deviceItem1))
-        }
-    }
-
-    @Test
-    fun testUpdateDeviceItemOnClick_connectedMedia_setActive() {
-        testScope.runTest {
-            `when`(deviceItem1.type).thenReturn(DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE)
-
-            interactor.updateDeviceItemOnClick(deviceItem1)
-
-            verify(cachedDevice1).setActive()
-            verify(logger)
-                .logDeviceClick(
-                    cachedDevice1.address,
-                    DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE
-                )
-        }
-    }
-
-    @Test
-    fun testUpdateDeviceItemOnClick_activeMedia_disconnect() {
-        testScope.runTest {
-            `when`(deviceItem1.type).thenReturn(DeviceItemType.ACTIVE_MEDIA_BLUETOOTH_DEVICE)
-
-            interactor.updateDeviceItemOnClick(deviceItem1)
-
-            verify(cachedDevice1).disconnect()
-            verify(logger)
-                .logDeviceClick(cachedDevice1.address, DeviceItemType.ACTIVE_MEDIA_BLUETOOTH_DEVICE)
-        }
-    }
-
-    @Test
-    fun testUpdateDeviceItemOnClick_connectedOtherDevice_disconnect() {
-        testScope.runTest {
-            `when`(deviceItem1.type).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
-
-            interactor.updateDeviceItemOnClick(deviceItem1)
-
-            verify(cachedDevice1).disconnect()
-            verify(logger)
-                .logDeviceClick(cachedDevice1.address, DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
-        }
-    }
-
-    @Test
-    fun testUpdateDeviceItemOnClick_saved_connect() {
-        testScope.runTest {
-            `when`(deviceItem1.type).thenReturn(DeviceItemType.SAVED_BLUETOOTH_DEVICE)
-
-            interactor.updateDeviceItemOnClick(deviceItem1)
-
-            verify(cachedDevice1).connect()
-            verify(logger)
-                .logDeviceClick(cachedDevice1.address, DeviceItemType.SAVED_BLUETOOTH_DEVICE)
-        }
-    }
-
-    private fun createFactory(
-        isFilterMatchFunc: (CachedBluetoothDevice) -> Boolean,
-        deviceItem: DeviceItem
-    ): DeviceItemFactory {
-        return object : DeviceItemFactory() {
-            override fun isFilterMatched(
-                context: Context,
-                cachedDevice: CachedBluetoothDevice,
-                audioManager: AudioManager?
-            ) = isFilterMatchFunc(cachedDevice)
-
-            override fun create(context: Context, cachedDevice: CachedBluetoothDevice) = deviceItem
-        }
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt
index 1cfca68..6846c72 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/recordissue/RecordIssueDialogDelegateTest.kt
@@ -88,13 +88,14 @@
     private lateinit var dialog: SystemUIDialog
     private lateinit var factory: SystemUIDialog.Factory
     private lateinit var latch: CountDownLatch
+    private var issueRecordingState = IssueRecordingState()
 
     @Before
     fun setup() {
         MockitoAnnotations.initMocks(this)
         whenever(dprLazy.get()).thenReturn(devicePolicyResolver)
         whenever(sysuiState.setFlag(anyInt(), anyBoolean())).thenReturn(sysuiState)
-        whenever(screenCaptureDisabledDialogDelegate.createDialog())
+        whenever(screenCaptureDisabledDialogDelegate.createSysUIDialog())
             .thenReturn(screenCaptureDisabledDialog)
         whenever(
                 userFileManager.getSharedPreferences(
@@ -128,6 +129,7 @@
                     mediaProjectionMetricsLogger,
                     userFileManager,
                     screenCaptureDisabledDialogDelegate,
+                    issueRecordingState,
                 ) {
                     latch.countDown()
                 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java
index b3df12ee..9e559de 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java
@@ -128,7 +128,7 @@
         );
 
         mFeatureFlags = new FakeFeatureFlags();
-        when(mScreenCaptureDisabledDialogDelegate.createDialog())
+        when(mScreenCaptureDisabledDialogDelegate.createSysUIDialog())
                 .thenReturn(mScreenCaptureDisabledDialog);
         when(mScreenRecordDialogFactory.create(any(), any()))
                 .thenReturn(mScreenRecordDialogDelegate);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt
index 6e48074..9432451 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt
@@ -39,7 +39,6 @@
 import com.android.systemui.settings.UserContextProvider
 import com.android.systemui.statusbar.phone.SystemUIDialog
 import com.android.systemui.statusbar.phone.SystemUIDialogManager
-import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.argumentCaptor
 import com.android.systemui.util.mockito.mock
 import com.google.common.truth.Truth.assertThat
@@ -50,6 +49,7 @@
 import org.junit.runner.RunWith
 import org.mockito.Mock
 import org.mockito.Mockito.eq
+import org.mockito.Mockito.never
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.`when` as whenever
 import org.mockito.MockitoAnnotations
@@ -59,7 +59,6 @@
 @TestableLooper.RunWithLooper(setAsMainLooper = true)
 class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() {
 
-    //@Mock private lateinit var dialogFactory: SystemUIDialog.Factory
     @Mock private lateinit var starter: ActivityStarter
     @Mock private lateinit var controller: RecordingController
     @Mock private lateinit var userContextProvider: UserContextProvider
@@ -76,13 +75,13 @@
         whenever(flags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING)).thenReturn(true)
 
         val systemUIDialogFactory =
-                SystemUIDialog.Factory(
-                        context,
-                        Dependency.get(SystemUIDialogManager::class.java),
-                        Dependency.get(SysUiState::class.java),
-                        Dependency.get(BroadcastDispatcher::class.java),
-                        Dependency.get(DialogTransitionAnimator::class.java),
-                )
+            SystemUIDialog.Factory(
+                context,
+                Dependency.get(SystemUIDialogManager::class.java),
+                Dependency.get(SysUiState::class.java),
+                Dependency.get(BroadcastDispatcher::class.java),
+                Dependency.get(DialogTransitionAnimator::class.java),
+            )
 
         val delegate =
             ScreenRecordPermissionDialogDelegate(
@@ -94,6 +93,7 @@
                 onStartRecordingClicked,
                 mediaProjectionMetricsLogger,
                 systemUIDialogFactory,
+                context,
             )
         dialog = delegate.createDialog()
     }
@@ -189,6 +189,17 @@
         verify(mediaProjectionMetricsLogger).notifyProjectionRequestCancelled(TEST_HOST_UID)
     }
 
+    @Test
+    fun showDialog_singleAppSelected_clickOnStart_projectionRequestCancelledIsNotLoggedOnce() {
+        showDialog()
+        onSpinnerItemSelected(SINGLE_APP)
+
+        clickOnStart()
+
+        verify(mediaProjectionMetricsLogger, never())
+            .notifyProjectionRequestCancelled(TEST_HOST_UID)
+    }
+
     private fun showDialog() {
         dialog.show()
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionExecutorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionExecutorTest.kt
new file mode 100644
index 0000000..5e7d8fb
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionExecutorTest.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.screenshot
+
+import android.app.PendingIntent
+import android.content.Intent
+import android.os.Bundle
+import android.os.UserHandle
+import android.testing.AndroidTestingRunner
+import android.view.View
+import android.view.Window
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.util.mockito.argumentCaptor
+import com.android.systemui.util.mockito.mock
+import com.google.common.truth.Truth.assertThat
+import kotlin.test.Test
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestCoroutineScheduler
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.any
+import org.mockito.kotlin.capture
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.verifyBlocking
+
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+class ActionExecutorTest : SysuiTestCase() {
+    private val scheduler = TestCoroutineScheduler()
+    private val mainDispatcher = StandardTestDispatcher(scheduler)
+    private val testScope = TestScope(mainDispatcher)
+
+    private val intentExecutor = mock<ActionIntentExecutor>()
+    private val window = mock<Window>()
+    private val view = mock<View>()
+    private val onDismiss = mock<(() -> Unit)>()
+    private val pendingIntent = mock<PendingIntent>()
+
+    private lateinit var actionExecutor: ActionExecutor
+
+    @Test
+    fun startSharedTransition_callsLaunchIntent() = runTest {
+        actionExecutor = createActionExecutor()
+
+        actionExecutor.startSharedTransition(Intent(Intent.ACTION_EDIT), UserHandle.CURRENT, true)
+        scheduler.advanceUntilIdle()
+
+        val intentCaptor = argumentCaptor<Intent>()
+        verifyBlocking(intentExecutor) {
+            launchIntent(capture(intentCaptor), eq(UserHandle.CURRENT), eq(true), any(), any())
+        }
+        assertThat(intentCaptor.value.action).isEqualTo(Intent.ACTION_EDIT)
+    }
+
+    @Test
+    fun sendPendingIntent_dismisses() = runTest {
+        actionExecutor = createActionExecutor()
+
+        actionExecutor.sendPendingIntent(pendingIntent)
+
+        verify(pendingIntent).send(any(Bundle::class.java))
+        verify(onDismiss).invoke()
+    }
+
+    private fun createActionExecutor(): ActionExecutor {
+        return ActionExecutor(intentExecutor, testScope, window, view, onDismiss)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionIntentExecutorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionIntentExecutorTest.kt
index 0c32470..5e53fe1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionIntentExecutorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionIntentExecutorTest.kt
@@ -64,7 +64,7 @@
             val intent = Intent(Intent.ACTION_EDIT).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK }
             val userHandle = myUserHandle()
 
-            actionIntentExecutor.launchIntent(intent, null, userHandle, false)
+            actionIntentExecutor.launchIntent(intent, userHandle, false, null, null)
             scheduler.advanceUntilIdle()
 
             verify(activityManagerWrapper)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt
new file mode 100644
index 0000000..853e50a
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.screenshot
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Process
+import android.os.UserHandle
+import android.testing.AndroidTestingRunner
+import android.view.accessibility.AccessibilityManager
+import androidx.test.filters.SmallTest
+import com.android.internal.logging.UiEventLogger
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.screenshot.ui.viewmodel.ScreenshotViewModel
+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.google.common.truth.Truth.assertThat
+import kotlin.test.Test
+import kotlinx.coroutines.test.runTest
+import org.junit.Assert.assertNotNull
+import org.junit.Before
+import org.junit.runner.RunWith
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.kotlin.verify
+
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+class DefaultScreenshotActionsProviderTest : SysuiTestCase() {
+    private val actionExecutor = mock<ActionExecutor>()
+    private val accessibilityManager = mock<AccessibilityManager>()
+    private val uiEventLogger = mock<UiEventLogger>()
+
+    private val request = ScreenshotData.forTesting()
+    private val validResult = ScreenshotSavedResult(Uri.EMPTY, Process.myUserHandle(), 0)
+
+    private lateinit var viewModel: ScreenshotViewModel
+    private lateinit var actionsProvider: ScreenshotActionsProvider
+
+    @Before
+    fun setUp() {
+        viewModel = ScreenshotViewModel(accessibilityManager)
+        request.userHandle = UserHandle.OWNER
+    }
+
+    @Test
+    fun previewActionAccessed_beforeScreenshotCompleted_doesNothing() {
+        actionsProvider = createActionsProvider()
+
+        assertNotNull(viewModel.previewAction.value)
+        viewModel.previewAction.value!!.invoke()
+        verifyNoMoreInteractions(actionExecutor)
+    }
+
+    @Test
+    fun actionButtonsAccessed_beforeScreenshotCompleted_doesNothing() {
+        actionsProvider = createActionsProvider()
+
+        assertThat(viewModel.actions.value.size).isEqualTo(2)
+        val firstAction = viewModel.actions.value[0]
+        assertThat(firstAction.onClicked).isNotNull()
+        val secondAction = viewModel.actions.value[1]
+        assertThat(secondAction.onClicked).isNotNull()
+        firstAction.onClicked!!.invoke()
+        secondAction.onClicked!!.invoke()
+        verifyNoMoreInteractions(actionExecutor)
+    }
+
+    @Test
+    fun actionAccessed_withResult_launchesIntent() = runTest {
+        actionsProvider = createActionsProvider()
+
+        actionsProvider.setCompletedScreenshot(validResult)
+        viewModel.actions.value[0].onClicked!!.invoke()
+
+        verify(uiEventLogger).log(eq(ScreenshotEvent.SCREENSHOT_EDIT_TAPPED), eq(0), eq(""))
+        val intentCaptor = argumentCaptor<Intent>()
+        verify(actionExecutor)
+            .startSharedTransition(capture(intentCaptor), eq(Process.myUserHandle()), eq(true))
+        assertThat(intentCaptor.value.action).isEqualTo(Intent.ACTION_EDIT)
+    }
+
+    @Test
+    fun actionAccessed_whilePending_launchesMostRecentAction() = runTest {
+        actionsProvider = createActionsProvider()
+
+        viewModel.actions.value[0].onClicked!!.invoke()
+        viewModel.previewAction.value!!.invoke()
+        viewModel.actions.value[1].onClicked!!.invoke()
+        actionsProvider.setCompletedScreenshot(validResult)
+
+        verify(uiEventLogger).log(eq(ScreenshotEvent.SCREENSHOT_SHARE_TAPPED), eq(0), eq(""))
+        val intentCaptor = argumentCaptor<Intent>()
+        verify(actionExecutor)
+            .startSharedTransition(capture(intentCaptor), eq(Process.myUserHandle()), eq(false))
+        assertThat(intentCaptor.value.action).isEqualTo(Intent.ACTION_CHOOSER)
+    }
+
+    private fun createActionsProvider(): ScreenshotActionsProvider {
+        return DefaultScreenshotActionsProvider(
+            context,
+            viewModel,
+            uiEventLogger,
+            request,
+            "testid",
+            actionExecutor
+        )
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/RequestProcessorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/RequestProcessorTest.kt
index 7e41745..0847f01 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/RequestProcessorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/RequestProcessorTest.kt
@@ -30,8 +30,6 @@
 import com.android.internal.util.ScreenshotRequest
 import com.android.systemui.screenshot.ScreenshotPolicy.DisplayContentInfo
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 import org.junit.Assert
 import org.junit.Test
@@ -44,35 +42,8 @@
     private val component = ComponentName("android.test", "android.test.Component")
     private val bounds = Rect(25, 25, 75, 75)
 
-    private val scope = CoroutineScope(Dispatchers.Unconfined)
     private val policy = FakeScreenshotPolicy()
 
-    /** Tests the Java-compatible function wrapper, ensures callback is invoked. */
-    @Test
-    fun testProcessAsync_ScreenshotData() {
-        val request =
-            ScreenshotData.fromRequest(
-                ScreenshotRequest.Builder(TAKE_SCREENSHOT_PROVIDED_IMAGE, SCREENSHOT_KEY_OTHER)
-                    .setBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888))
-                    .build()
-            )
-        val processor = RequestProcessor(imageCapture, policy, scope)
-
-        var result: ScreenshotData? = null
-        var callbackCount = 0
-        val callback: (ScreenshotData) -> Unit = { processedRequest: ScreenshotData ->
-            result = processedRequest
-            callbackCount++
-        }
-
-        // runs synchronously, using Unconfined Dispatcher
-        processor.processAsync(request, callback)
-
-        // Callback invoked once returning the same request (no changes)
-        assertThat(callbackCount).isEqualTo(1)
-        assertThat(result).isEqualTo(request)
-    }
-
     @Test
     fun testFullScreenshot() = runBlocking {
         // Indicate that the primary content belongs to a normal user
@@ -84,7 +55,7 @@
 
         val request =
             ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_OTHER).build()
-        val processor = RequestProcessor(imageCapture, policy, scope)
+        val processor = RequestProcessor(imageCapture, policy)
 
         val processedData = processor.process(ScreenshotData.fromRequest(request))
 
@@ -109,7 +80,7 @@
 
         val request =
             ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER).build()
-        val processor = RequestProcessor(imageCapture, policy, scope)
+        val processor = RequestProcessor(imageCapture, policy)
 
         val processedData = processor.process(ScreenshotData.fromRequest(request))
 
@@ -136,7 +107,7 @@
 
         val request =
             ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER).build()
-        val processor = RequestProcessor(imageCapture, policy, scope)
+        val processor = RequestProcessor(imageCapture, policy)
 
         Assert.assertThrows(IllegalStateException::class.java) {
             runBlocking { processor.process(ScreenshotData.fromRequest(request)) }
@@ -146,7 +117,7 @@
     @Test
     fun testProvidedImageScreenshot() = runBlocking {
         val bounds = Rect(50, 50, 150, 150)
-        val processor = RequestProcessor(imageCapture, policy, scope)
+        val processor = RequestProcessor(imageCapture, policy)
 
         policy.setManagedProfile(USER_ID, false)
 
@@ -171,7 +142,7 @@
     @Test
     fun testProvidedImageScreenshot_managedProfile() = runBlocking {
         val bounds = Rect(50, 50, 150, 150)
-        val processor = RequestProcessor(imageCapture, policy, scope)
+        val processor = RequestProcessor(imageCapture, policy)
 
         // Indicate that the screenshot belongs to a manged profile
         policy.setManagedProfile(USER_ID, true)
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 0baee5d..c900463 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt
@@ -57,7 +57,7 @@
     private val eventLogger = UiEventLoggerFake()
 
     private val screenshotExecutor =
-        TakeScreenshotExecutor(
+        TakeScreenshotExecutorImpl(
             controllerFactory,
             fakeDisplayRepository,
             testScope,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt
index f3809aa..0776aa7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/TakeScreenshotServiceTest.kt
@@ -20,134 +20,97 @@
 import android.app.admin.DevicePolicyResources.Strings.SystemUi.SCREENSHOT_BLOCKED_BY_ADMIN
 import android.app.admin.DevicePolicyResourcesManager
 import android.content.ComponentName
+import android.net.Uri
 import android.os.UserHandle
 import android.os.UserManager
 import android.testing.AndroidTestingRunner
-import android.view.Display
 import android.view.WindowManager.ScreenshotSource.SCREENSHOT_KEY_OTHER
 import android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN
-import androidx.test.filters.SmallTest
 import com.android.internal.logging.testing.UiEventLoggerFake
 import com.android.internal.util.ScreenshotRequest
 import com.android.systemui.SysuiTestCase
-import com.android.systemui.flags.FakeFeatureFlags
-import com.android.systemui.flags.Flags.MULTI_DISPLAY_SCREENSHOT
 import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_CAPTURE_FAILED
 import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_REQUESTED_KEY_OTHER
 import com.android.systemui.screenshot.TakeScreenshotService.RequestCallback
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.eq
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
 import java.util.function.Consumer
+import kotlinx.coroutines.runBlocking
 import org.junit.Assert.assertEquals
-import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.ArgumentMatchers.anyInt
 import org.mockito.ArgumentMatchers.isNull
-import org.mockito.Mockito.clearInvocations
-import org.mockito.Mockito.doAnswer
-import org.mockito.Mockito.doThrow
-import org.mockito.Mockito.times
-import org.mockito.Mockito.verify
-import org.mockito.Mockito.verifyZeroInteractions
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 
 @RunWith(AndroidTestingRunner::class)
-@SmallTest
 class TakeScreenshotServiceTest : SysuiTestCase() {
 
-    private val application = mock<Application>()
-    private val controller = mock<ScreenshotController>()
-    private val controllerFactory = mock<ScreenshotController.Factory>()
-    private val takeScreenshotExecutor = mock<TakeScreenshotExecutor>()
-    private val userManager = mock<UserManager>()
-    private val requestProcessor = mock<RequestProcessor>()
-    private val devicePolicyManager = mock<DevicePolicyManager>()
-    private val devicePolicyResourcesManager = mock<DevicePolicyResourcesManager>()
-    private val notificationsControllerFactory = mock<ScreenshotNotificationsController.Factory>()
+    private val userManager = mock<UserManager> { on { isUserUnlocked } doReturn (true) }
+
+    private val devicePolicyResourcesManager =
+        mock<DevicePolicyResourcesManager> {
+            on { getString(eq(SCREENSHOT_BLOCKED_BY_ADMIN), /* defaultStringLoader= */ any()) }
+                .doReturn("SCREENSHOT_BLOCKED_BY_ADMIN")
+        }
+
+    private val devicePolicyManager =
+        mock<DevicePolicyManager> {
+            on { resources } doReturn (devicePolicyResourcesManager)
+            on { getScreenCaptureDisabled(/* admin= */ isNull(), eq(UserHandle.USER_ALL)) }
+                .doReturn(false)
+        }
+
     private val notificationsController = mock<ScreenshotNotificationsController>()
-    private val callback = mock<RequestCallback>()
+    private val notificationsControllerFactory =
+        ScreenshotNotificationsController.Factory { notificationsController }
 
+    private val executor = FakeScreenshotExecutor()
+    private val callback = FakeRequestCallback()
     private val eventLogger = UiEventLoggerFake()
-    private val flags = FakeFeatureFlags()
     private val topComponent = ComponentName(mContext, TakeScreenshotServiceTest::class.java)
 
-    private lateinit var service: TakeScreenshotService
-
-    @Before
-    fun setUp() {
-        flags.set(MULTI_DISPLAY_SCREENSHOT, false)
-        whenever(devicePolicyManager.resources).thenReturn(devicePolicyResourcesManager)
-        whenever(
-                devicePolicyManager.getScreenCaptureDisabled(
-                    /* admin component (null: any admin) */ isNull(),
-                    eq(UserHandle.USER_ALL)
-                )
-            )
-            .thenReturn(false)
-        whenever(userManager.isUserUnlocked).thenReturn(true)
-        whenever(controllerFactory.create(any(), any())).thenReturn(controller)
-        whenever(notificationsControllerFactory.create(any())).thenReturn(notificationsController)
-
-        // Stub request processor as a synchronous no-op for tests with the flag enabled
-        doAnswer {
-                val request: ScreenshotData = it.getArgument(0) as ScreenshotData
-                val consumer: Consumer<ScreenshotData> = it.getArgument(1)
-                consumer.accept(request)
-            }
-            .whenever(requestProcessor)
-            .processAsync(/* screenshot= */ any(ScreenshotData::class.java), /* callback= */ any())
-
-        service = createService()
-    }
-
     @Test
     fun testServiceLifecycle() {
+        val service = createService()
         service.onCreate()
         service.onBind(null /* unused: Intent */)
+        assertThat(executor.windowsPresent).isTrue()
 
         service.onUnbind(null /* unused: Intent */)
-        verify(controller, times(1)).removeWindow()
+        assertThat(executor.windowsPresent).isFalse()
 
         service.onDestroy()
-        verify(controller, times(1)).onDestroy()
+        assertThat(executor.destroyed).isTrue()
     }
 
     @Test
     fun takeScreenshotFullscreen() {
+        val service = createService()
+
         val request =
             ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER)
                 .setTopComponent(topComponent)
                 .build()
 
         service.handleRequest(request, { /* onSaved */}, callback)
+        assertWithMessage("request received by executor").that(executor.requestReceived).isNotNull()
 
-        verify(controller, times(1))
-            .handleScreenshot(
-                eq(ScreenshotData.fromRequest(request, Display.DEFAULT_DISPLAY)),
-                /* onSavedListener = */ any(),
-                /* requestCallback = */ any()
-            )
-
-        assertEquals("Expected one UiEvent", eventLogger.numLogs(), 1)
-        val logEvent = eventLogger.get(0)
-
-        assertEquals(
-            "Expected SCREENSHOT_REQUESTED UiEvent",
-            logEvent.eventId,
-            SCREENSHOT_REQUESTED_KEY_OTHER.id
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            eventLogger.get(0).packageName
-        )
+        assertWithMessage("request received by executor")
+            .that(ScreenshotData.fromRequest(executor.requestReceived!!))
+            .isEqualTo(ScreenshotData.fromRequest(request))
     }
 
     @Test
     fun takeScreenshotFullscreen_userLocked() {
-        whenever(userManager.isUserUnlocked).thenReturn(false)
+        val service = createService()
+        whenever(userManager.isUserUnlocked).doReturn(false)
 
         val request =
             ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER)
@@ -157,47 +120,41 @@
         service.handleRequest(request, { /* onSaved */}, callback)
 
         verify(notificationsController, times(1)).notifyScreenshotError(anyInt())
-        verify(callback, times(1)).reportError()
-        verifyZeroInteractions(controller)
 
-        assertEquals("Expected two UiEvents", 2, eventLogger.numLogs())
+        assertWithMessage("callback errorReported").that(callback.errorReported).isTrue()
+
+        assertWithMessage("UiEvent count").that(eventLogger.numLogs()).isEqualTo(2)
+
         val requestEvent = eventLogger.get(0)
-        assertEquals(
-            "Expected SCREENSHOT_REQUESTED_* UiEvent",
-            SCREENSHOT_REQUESTED_KEY_OTHER.id,
-            requestEvent.eventId
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            requestEvent.packageName
-        )
+        assertWithMessage("request UiEvent id")
+            .that(requestEvent.eventId)
+            .isEqualTo(SCREENSHOT_REQUESTED_KEY_OTHER.id)
+
+        assertWithMessage("topComponent package name")
+            .that(requestEvent.packageName)
+            .isEqualTo(topComponent.packageName)
+
         val failureEvent = eventLogger.get(1)
-        assertEquals(
-            "Expected SCREENSHOT_CAPTURE_FAILED UiEvent",
-            SCREENSHOT_CAPTURE_FAILED.id,
-            failureEvent.eventId
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            failureEvent.packageName
-        )
+        assertWithMessage("failure UiEvent id")
+            .that(failureEvent.eventId)
+            .isEqualTo(SCREENSHOT_CAPTURE_FAILED.id)
+
+        assertWithMessage("Supplied package name")
+            .that(failureEvent.packageName)
+            .isEqualTo(topComponent.packageName)
     }
 
     @Test
     fun takeScreenshotFullscreen_screenCaptureDisabled_allUsers() {
-        whenever(devicePolicyManager.getScreenCaptureDisabled(isNull(), eq(UserHandle.USER_ALL)))
-            .thenReturn(true)
+        val service = createService()
 
         whenever(
-                devicePolicyResourcesManager.getString(
-                    eq(SCREENSHOT_BLOCKED_BY_ADMIN),
-                    /* Supplier<String> */
-                    any(),
+                devicePolicyManager.getScreenCaptureDisabled(
+                    /* admin= */ isNull(),
+                    eq(UserHandle.USER_ALL)
                 )
             )
-            .thenReturn("SCREENSHOT_BLOCKED_BY_ADMIN")
+            .doReturn(true)
 
         val request =
             ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER)
@@ -205,11 +162,9 @@
                 .build()
 
         service.handleRequest(request, { /* onSaved */}, callback)
+        assertThat(callback.errorReported).isTrue()
+        assertWithMessage("Expected two UiEvents").that(eventLogger.numLogs()).isEqualTo(2)
 
-        // error shown: Toast.makeText(...).show(), untestable
-        verify(callback, times(1)).reportError()
-        verifyZeroInteractions(controller)
-        assertEquals("Expected two UiEvents", 2, eventLogger.numLogs())
         val requestEvent = eventLogger.get(0)
         assertEquals(
             "Expected SCREENSHOT_REQUESTED_* UiEvent",
@@ -234,112 +189,70 @@
         )
     }
 
-    @Test
-    fun takeScreenshot_workProfile_nullBitmap() {
-        val request =
-            ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER)
-                .setTopComponent(topComponent)
-                .build()
-
-        doThrow(IllegalStateException::class.java)
-            .whenever(requestProcessor)
-            .processAsync(any(ScreenshotData::class.java), any())
-
-        service.handleRequest(request, { /* onSaved */}, callback)
-
-        verify(callback, times(1)).reportError()
-        verify(notificationsController, times(1)).notifyScreenshotError(anyInt())
-        verifyZeroInteractions(controller)
-        assertEquals("Expected two UiEvents", 2, eventLogger.numLogs())
-        val requestEvent = eventLogger.get(0)
-        assertEquals(
-            "Expected SCREENSHOT_REQUESTED_* UiEvent",
-            SCREENSHOT_REQUESTED_KEY_OTHER.id,
-            requestEvent.eventId
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            requestEvent.packageName
-        )
-        val failureEvent = eventLogger.get(1)
-        assertEquals(
-            "Expected SCREENSHOT_CAPTURE_FAILED UiEvent",
-            SCREENSHOT_CAPTURE_FAILED.id,
-            failureEvent.eventId
-        )
-        assertEquals(
-            "Expected supplied package name",
-            topComponent.packageName,
-            failureEvent.packageName
-        )
-    }
-
-    @Test
-    fun takeScreenshotFullScreen_multiDisplayFlagEnabled_takeScreenshotExecutor() {
-        flags.set(MULTI_DISPLAY_SCREENSHOT, true)
-        service = createService()
-
-        val request =
-            ScreenshotRequest.Builder(TAKE_SCREENSHOT_FULLSCREEN, SCREENSHOT_KEY_OTHER)
-                .setTopComponent(topComponent)
-                .build()
-
-        service.handleRequest(request, { /* onSaved */}, callback)
-
-        verifyZeroInteractions(controller)
-        verify(takeScreenshotExecutor, times(1)).executeScreenshotsAsync(any(), any(), any())
-
-        assertEquals("Expected one UiEvent", 0, eventLogger.numLogs())
-    }
-
-    @Test
-    fun testServiceLifecycle_multiDisplayScreenshotFlagEnabled() {
-        flags.set(MULTI_DISPLAY_SCREENSHOT, true)
-        service = createService()
-
-        service.onCreate()
-        service.onBind(null /* unused: Intent */)
-
-        service.onUnbind(null /* unused: Intent */)
-        verify(takeScreenshotExecutor, times(1)).removeWindows()
-
-        service.onDestroy()
-        verify(takeScreenshotExecutor, times(1)).onDestroy()
-    }
-
-    @Test
-    fun constructor_MultiDisplayFlagOn_screenshotControllerNotCreated() {
-        flags.set(MULTI_DISPLAY_SCREENSHOT, true)
-        clearInvocations(controllerFactory)
-
-        service = createService()
-
-        verifyZeroInteractions(controllerFactory)
-    }
-
     private fun createService(): TakeScreenshotService {
         val service =
             TakeScreenshotService(
-                controllerFactory,
                 userManager,
                 devicePolicyManager,
                 eventLogger,
                 notificationsControllerFactory,
                 mContext,
                 Runnable::run,
-                flags,
-                requestProcessor,
-                { takeScreenshotExecutor },
+                executor
             )
+
         service.attach(
             mContext,
             /* thread = */ null,
             /* className = */ null,
             /* token = */ null,
-            application,
+            mock<Application>(),
             /* activityManager = */ null
         )
         return service
     }
 }
+
+internal class FakeRequestCallback : RequestCallback {
+    var errorReported = false
+    var finished = false
+    override fun reportError() {
+        errorReported = true
+    }
+
+    override fun onFinish() {
+        finished = true
+    }
+}
+
+internal class FakeScreenshotExecutor : TakeScreenshotExecutor {
+    var requestReceived: ScreenshotRequest? = null
+    var windowsPresent = true
+    var destroyed = false
+    override fun onCloseSystemDialogsReceived() {}
+    override suspend fun executeScreenshots(
+        screenshotRequest: ScreenshotRequest,
+        onSaved: (Uri) -> Unit,
+        requestCallback: RequestCallback,
+    ) {
+        requestReceived = screenshotRequest
+    }
+
+    override fun removeWindows() {
+        windowsPresent = false
+    }
+
+    override fun onDestroy() {
+        destroyed = true
+    }
+
+    override fun executeScreenshotsAsync(
+        screenshotRequest: ScreenshotRequest,
+        onSaved: Consumer<Uri>,
+        requestCallback: RequestCallback,
+    ) {
+        runBlocking {
+            executeScreenshots(screenshotRequest, { onSaved.accept(it) }, requestCallback)
+        }
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ui/viewmodel/ScreenshotViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ui/viewmodel/ScreenshotViewModelTest.kt
new file mode 100644
index 0000000..d44e26c
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ui/viewmodel/ScreenshotViewModelTest.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.screenshot.ui.viewmodel
+
+import android.view.accessibility.AccessibilityManager
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.mockito.Mockito.mock
+
+@SmallTest
+class ScreenshotViewModelTest {
+    private val accessibilityManager: AccessibilityManager = mock(AccessibilityManager::class.java)
+    private val appearance = ActionButtonAppearance(null, "Label", "Description")
+    private val onclick = {}
+
+    @Test
+    fun testAddAction() {
+        val viewModel = ScreenshotViewModel(accessibilityManager)
+
+        assertThat(viewModel.actions.value).isEmpty()
+
+        viewModel.addAction(appearance, onclick)
+
+        assertThat(viewModel.actions.value).hasSize(1)
+
+        val added = viewModel.actions.value[0]
+        assertThat(added.appearance).isEqualTo(appearance)
+        assertThat(added.onClicked).isEqualTo(onclick)
+    }
+
+    @Test
+    fun testRemoveAction() {
+        val viewModel = ScreenshotViewModel(accessibilityManager)
+        val firstId = viewModel.addAction(ActionButtonAppearance(null, "", ""), {})
+        val secondId = viewModel.addAction(appearance, onclick)
+
+        assertThat(viewModel.actions.value).hasSize(2)
+        assertThat(firstId).isNotEqualTo(secondId)
+
+        viewModel.removeAction(firstId)
+
+        assertThat(viewModel.actions.value).hasSize(1)
+
+        val remaining = viewModel.actions.value[0]
+        assertThat(remaining.appearance).isEqualTo(appearance)
+        assertThat(remaining.onClicked).isEqualTo(onclick)
+    }
+
+    @Test
+    fun testUpdateActionAppearance() {
+        val viewModel = ScreenshotViewModel(accessibilityManager)
+        val id = viewModel.addAction(appearance, onclick)
+        val otherAppearance = ActionButtonAppearance(null, "Other", "Other")
+
+        viewModel.updateActionAppearance(id, otherAppearance)
+
+        assertThat(viewModel.actions.value).hasSize(1)
+        val updated = viewModel.actions.value[0]
+        assertThat(updated.appearance).isEqualTo(otherAppearance)
+        assertThat(updated.onClicked).isEqualTo(onclick)
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt
index 25ba09a..6a22d86 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt
@@ -84,7 +84,7 @@
     fun setUp() {
         MockitoAnnotations.initMocks(this)
 
-        whenever(mirrorController.toggleSlider).thenReturn(mirror)
+        whenever(mirrorController.getToggleSlider()).thenReturn(mirror)
         whenever(motionEvent.copy()).thenReturn(motionEvent)
         whenever(vibratorHelper.getPrimitiveDurations(anyInt())).thenReturn(intArrayOf(0))
 
@@ -129,7 +129,7 @@
 
     @Test
     fun testNullMirrorNotTrackingTouch() {
-        whenever(mirrorController.toggleSlider).thenReturn(null)
+        whenever(mirrorController.getToggleSlider()).thenReturn(null)
 
         mController.setMirrorControllerAndMirror(mirrorController)
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
index 07d9350..e611da0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
@@ -36,21 +36,30 @@
 import com.android.systemui.communal.domain.interactor.setCommunalAvailable
 import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.communal.ui.viewmodel.CommunalViewModel
+import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardState
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.testDispatcher
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.res.R
+import com.android.systemui.scene.shared.model.sceneDataSourceDelegator
+import com.android.systemui.shade.data.repository.fakeShadeRepository
 import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.shade.domain.interactor.shadeInteractor
 import com.android.systemui.statusbar.phone.SystemUIDialogFactory
 import com.android.systemui.testKosmos
 import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.whenever
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.UnconfinedTestDispatcher
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
 import org.junit.After
 import org.junit.Assert.assertThrows
 import org.junit.Before
@@ -74,10 +83,11 @@
         }
 
     @Mock private lateinit var communalViewModel: CommunalViewModel
-    @Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
-    @Mock private lateinit var shadeInteractor: ShadeInteractor
     @Mock private lateinit var powerManager: PowerManager
     @Mock private lateinit var dialogFactory: SystemUIDialogFactory
+    private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
+    private lateinit var shadeInteractor: ShadeInteractor
+    private lateinit var keyguardInteractor: KeyguardInteractor
 
     private lateinit var parentView: FrameLayout
     private lateinit var containerView: View
@@ -87,15 +97,15 @@
     private lateinit var communalRepository: FakeCommunalRepository
     private lateinit var underTest: GlanceableHubContainerController
 
-    private val bouncerShowingFlow = MutableStateFlow(false)
-    private val shadeShowingFlow = MutableStateFlow(false)
-
     @Before
     fun setUp() {
         MockitoAnnotations.initMocks(this)
 
         communalInteractor = kosmos.communalInteractor
         communalRepository = kosmos.fakeCommunalRepository
+        keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor
+        keyguardInteractor = kosmos.keyguardInteractor
+        shadeInteractor = kosmos.shadeInteractor
 
         underTest =
             GlanceableHubContainerController(
@@ -103,15 +113,13 @@
                 communalViewModel,
                 dialogFactory,
                 keyguardTransitionInteractor,
+                keyguardInteractor,
                 shadeInteractor,
-                powerManager
+                powerManager,
+                kosmos.sceneDataSourceDelegator,
             )
         testableLooper = TestableLooper.get(this)
 
-        whenever(keyguardTransitionInteractor.isFinishedInStateWhere(any()))
-            .thenReturn(bouncerShowingFlow)
-        whenever(shadeInteractor.isAnyFullyExpanded).thenReturn(shadeShowingFlow)
-
         overrideResource(R.dimen.communal_right_edge_swipe_region_width, RIGHT_SWIPE_REGION_WIDTH)
         overrideResource(R.dimen.communal_top_edge_swipe_region_height, TOP_SWIPE_REGION_WIDTH)
         overrideResource(
@@ -136,115 +144,182 @@
     }
 
     @Test
-    fun initView_calledTwice_throwsException() {
-        underTest =
-            GlanceableHubContainerController(
-                communalInteractor,
-                communalViewModel,
-                dialogFactory,
-                keyguardTransitionInteractor,
-                shadeInteractor,
-                powerManager,
-            )
+    fun initView_calledTwice_throwsException() =
+        with(kosmos) {
+            testScope.runTest {
+                underTest =
+                    GlanceableHubContainerController(
+                        communalInteractor,
+                        communalViewModel,
+                        dialogFactory,
+                        keyguardTransitionInteractor,
+                        keyguardInteractor,
+                        shadeInteractor,
+                        powerManager,
+                        kosmos.sceneDataSourceDelegator,
+                    )
 
-        // First call succeeds.
-        underTest.initView(context)
+                // First call succeeds.
+                underTest.initView(context)
 
-        // Second call throws.
-        assertThrows(RuntimeException::class.java) { underTest.initView(context) }
-    }
+                // Second call throws.
+                assertThrows(RuntimeException::class.java) { underTest.initView(context) }
+            }
+        }
 
     @Test
-    fun onTouchEvent_communalClosed_doesNotIntercept() {
-        // Communal is closed.
-        goToScene(CommunalScenes.Blank)
+    fun onTouchEvent_communalClosed_doesNotIntercept() =
+        with(kosmos) {
+            testScope.runTest {
+                // Communal is closed.
+                goToScene(CommunalScenes.Blank)
 
-        assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
-    }
+                assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
+            }
+        }
 
     @Test
-    fun onTouchEvent_openGesture_interceptsTouches() {
-        // Communal is closed.
-        goToScene(CommunalScenes.Blank)
+    fun onTouchEvent_openGesture_interceptsTouches() =
+        with(kosmos) {
+            testScope.runTest {
+                // Communal is closed.
+                goToScene(CommunalScenes.Blank)
 
-        // Initial touch down is intercepted, and so are touches outside of the region, until an
-        // up event is received.
-        assertThat(underTest.onTouchEvent(DOWN_IN_RIGHT_SWIPE_REGION_EVENT)).isTrue()
-        assertThat(underTest.onTouchEvent(MOVE_EVENT)).isTrue()
-        assertThat(underTest.onTouchEvent(UP_EVENT)).isTrue()
-        assertThat(underTest.onTouchEvent(MOVE_EVENT)).isFalse()
-    }
+                // Initial touch down is intercepted, and so are touches outside of the region,
+                // until an
+                // up event is received.
+                assertThat(underTest.onTouchEvent(DOWN_IN_RIGHT_SWIPE_REGION_EVENT)).isTrue()
+                assertThat(underTest.onTouchEvent(MOVE_EVENT)).isTrue()
+                assertThat(underTest.onTouchEvent(UP_EVENT)).isTrue()
+                assertThat(underTest.onTouchEvent(MOVE_EVENT)).isFalse()
+            }
+        }
 
     @Test
-    fun onTouchEvent_communalOpen_interceptsTouches() {
-        // Communal is open.
-        goToScene(CommunalScenes.Communal)
+    fun onTouchEvent_communalOpen_interceptsTouches() =
+        with(kosmos) {
+            testScope.runTest {
+                // Communal is open.
+                goToScene(CommunalScenes.Communal)
 
-        // Touch events are intercepted outside of any gesture areas.
-        assertThat(underTest.onTouchEvent(DOWN_EVENT)).isTrue()
-        // User activity sent to PowerManager.
-        verify(powerManager).userActivity(any(), any(), any())
-    }
+                // Touch events are intercepted outside of any gesture areas.
+                assertThat(underTest.onTouchEvent(DOWN_EVENT)).isTrue()
+                // User activity sent to PowerManager.
+                verify(powerManager).userActivity(any(), any(), any())
+            }
+        }
 
     @Test
-    fun onTouchEvent_topSwipeWhenCommunalOpen_doesNotIntercept() {
-        // Communal is open.
-        goToScene(CommunalScenes.Communal)
+    fun onTouchEvent_topSwipeWhenCommunalOpen_doesNotIntercept() =
+        with(kosmos) {
+            testScope.runTest {
+                // Communal is open.
+                goToScene(CommunalScenes.Communal)
 
-        // Touch event in the top swipe reqgion is not intercepted.
-        assertThat(underTest.onTouchEvent(DOWN_IN_TOP_SWIPE_REGION_EVENT)).isFalse()
-    }
+                // Touch event in the top swipe region is not intercepted.
+                assertThat(underTest.onTouchEvent(DOWN_IN_TOP_SWIPE_REGION_EVENT)).isFalse()
+            }
+        }
 
     @Test
-    fun onTouchEvent_bottomSwipeWhenCommunalOpen_doesNotIntercept() {
-        // Communal is open.
-        goToScene(CommunalScenes.Communal)
+    fun onTouchEvent_bottomSwipeWhenCommunalOpen_doesNotIntercept() =
+        with(kosmos) {
+            testScope.runTest {
+                // Communal is open.
+                goToScene(CommunalScenes.Communal)
 
-        // Touch event in the bottom swipe reqgion is not intercepted.
-        assertThat(underTest.onTouchEvent(DOWN_IN_BOTTOM_SWIPE_REGION_EVENT)).isFalse()
-    }
+                // Touch event in the bottom swipe region is not intercepted.
+                assertThat(underTest.onTouchEvent(DOWN_IN_BOTTOM_SWIPE_REGION_EVENT)).isFalse()
+            }
+        }
 
     @Test
-    fun onTouchEvent_communalAndBouncerShowing_doesNotIntercept() {
-        // Communal is open.
-        goToScene(CommunalScenes.Communal)
+    fun onTouchEvent_topSwipeWhenDreaming_doesNotIntercept() =
+        with(kosmos) {
+            testScope.runTest {
+                // Communal is open.
+                goToScene(CommunalScenes.Communal)
 
-        // Bouncer is visible.
-        bouncerShowingFlow.value = true
-        testableLooper.processAllMessages()
+                // Device is dreaming.
+                fakeKeyguardRepository.setDreaming(true)
+                runCurrent()
 
-        // Touch events are not intercepted.
-        assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
-        // User activity is not sent to PowerManager.
-        verify(powerManager, times(0)).userActivity(any(), any(), any())
-    }
+                // Touch event in the top swipe region is not intercepted.
+                assertThat(underTest.onTouchEvent(DOWN_IN_TOP_SWIPE_REGION_EVENT)).isFalse()
+            }
+        }
 
     @Test
-    fun onTouchEvent_communalAndShadeShowing_doesNotIntercept() {
-        // Communal is open.
-        goToScene(CommunalScenes.Communal)
+    fun onTouchEvent_bottomSwipeWhenDreaming_doesNotIntercept() =
+        with(kosmos) {
+            testScope.runTest {
+                // Communal is open.
+                goToScene(CommunalScenes.Communal)
 
-        shadeShowingFlow.value = true
-        testableLooper.processAllMessages()
+                // Device is dreaming.
+                fakeKeyguardRepository.setDreaming(true)
+                runCurrent()
 
-        // Touch events are not intercepted.
-        assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
-    }
+                // Touch event in the bottom swipe region is not intercepted.
+                assertThat(underTest.onTouchEvent(DOWN_IN_BOTTOM_SWIPE_REGION_EVENT)).isFalse()
+            }
+        }
 
     @Test
-    fun onTouchEvent_containerViewDisposed_doesNotIntercept() {
-        // Communal is open.
-        goToScene(CommunalScenes.Communal)
+    fun onTouchEvent_communalAndBouncerShowing_doesNotIntercept() =
+        with(kosmos) {
+            testScope.runTest {
+                // Communal is open.
+                goToScene(CommunalScenes.Communal)
 
-        // Touch events are intercepted.
-        assertThat(underTest.onTouchEvent(DOWN_EVENT)).isTrue()
+                // Bouncer is visible.
+                fakeKeyguardTransitionRepository.sendTransitionSteps(
+                    KeyguardState.GLANCEABLE_HUB,
+                    KeyguardState.PRIMARY_BOUNCER,
+                    testScope
+                )
+                testableLooper.processAllMessages()
 
-        // Container view disposed.
-        underTest.disposeView()
+                // Touch events are not intercepted.
+                assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
+                // User activity is not sent to PowerManager.
+                verify(powerManager, times(0)).userActivity(any(), any(), any())
+            }
+        }
 
-        // Touch events are not intercepted.
-        assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
-    }
+    @Test
+    fun onTouchEvent_communalAndShadeShowing_doesNotIntercept() =
+        with(kosmos) {
+            testScope.runTest {
+                // Communal is open.
+                goToScene(CommunalScenes.Communal)
+
+                // Shade shows up.
+                fakeShadeRepository.setQsExpansion(1.0f)
+                testableLooper.processAllMessages()
+
+                // Touch events are not intercepted.
+                assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
+            }
+        }
+
+    @Test
+    fun onTouchEvent_containerViewDisposed_doesNotIntercept() =
+        with(kosmos) {
+            testScope.runTest {
+                // Communal is open.
+                goToScene(CommunalScenes.Communal)
+
+                // Touch events are intercepted.
+                assertThat(underTest.onTouchEvent(DOWN_EVENT)).isTrue()
+
+                // Container view disposed.
+                underTest.disposeView()
+
+                // Touch events are not intercepted.
+                assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
+            }
+        }
 
     private fun initAndAttachContainerView() {
         containerView = View(context)
@@ -256,6 +331,8 @@
 
         // Attach the view so that flows start collecting.
         ViewUtils.attachView(parentView)
+        // Attaching is async so processAllMessages is required for view.repeatWhenAttached to run.
+        testableLooper.processAllMessages()
 
         // Give the view a fixed size to simplify testing for edge swipes.
         val lp =
@@ -268,7 +345,7 @@
     }
 
     private fun goToScene(scene: SceneKey) {
-        communalRepository.setDesiredScene(scene)
+        communalRepository.changeScene(scene)
         testableLooper.processAllMessages()
     }
 
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 c25b910..dfe72cf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
@@ -73,7 +73,7 @@
 import com.android.keyguard.KeyguardStatusView;
 import com.android.keyguard.KeyguardStatusViewController;
 import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.keyguard.LockIconViewController;
+import com.android.keyguard.LegacyLockIconViewController;
 import com.android.keyguard.dagger.KeyguardQsUserSwitchComponent;
 import com.android.keyguard.dagger.KeyguardStatusBarViewComponent;
 import com.android.keyguard.dagger.KeyguardStatusViewComponent;
@@ -136,7 +136,6 @@
 import com.android.systemui.shade.domain.interactor.ShadeInteractor;
 import com.android.systemui.shade.domain.interactor.ShadeInteractorImpl;
 import com.android.systemui.shade.domain.interactor.ShadeInteractorLegacyImpl;
-import com.android.systemui.shade.transition.ShadeTransitionController;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.KeyguardIndicationController;
 import com.android.systemui.statusbar.LockscreenShadeTransitionController;
@@ -279,7 +278,7 @@
     @Mock protected AmbientState mAmbientState;
     @Mock protected UserManager mUserManager;
     @Mock protected UiEventLogger mUiEventLogger;
-    @Mock protected LockIconViewController mLockIconViewController;
+    @Mock protected LegacyLockIconViewController mLockIconViewController;
     @Mock protected KeyguardViewConfigurator mKeyguardViewConfigurator;
     @Mock protected KeyguardRootView mKeyguardRootView;
     @Mock protected View mKeyguardRootViewChild;
@@ -307,7 +306,6 @@
     @Mock protected NotificationListContainer mNotificationListContainer;
     @Mock protected NotificationStackSizeCalculator mNotificationStackSizeCalculator;
     @Mock protected UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
-    @Mock protected ShadeTransitionController mShadeTransitionController;
     @Mock protected QS mQs;
     @Mock protected QSFragmentLegacy mQSFragment;
     @Mock protected ViewGroup mQsHeader;
@@ -443,7 +441,8 @@
                 mJavaAdapter,
                 () -> mShadeInteractor,
                 () -> mKosmos.getDeviceUnlockedInteractor(),
-                () -> mKosmos.getSceneInteractor());
+                () -> mKosmos.getSceneInteractor(),
+                () -> mKosmos.getKeyguardClockInteractor());
 
         KeyguardStatusView keyguardStatusView = new KeyguardStatusView(mContext);
         keyguardStatusView.setId(R.id.keyguard_status_view);
@@ -605,6 +604,7 @@
                 new NotificationsKeyguardInteractor(notifsKeyguardViewStateRepository);
         NotificationWakeUpCoordinator coordinator =
                 new NotificationWakeUpCoordinator(
+                        mKosmos.getTestScope().getBackgroundScope(),
                         mDumpManager,
                         mock(HeadsUpManager.class),
                         new StatusBarStateControllerImpl(
@@ -613,12 +613,14 @@
                                 mJavaAdapter,
                                 () -> mShadeInteractor,
                                 () -> mKosmos.getDeviceUnlockedInteractor(),
-                                () -> mKosmos.getSceneInteractor()),
+                                () -> mKosmos.getSceneInteractor(),
+                                () -> mKosmos.getKeyguardClockInteractor()),
                         mKeyguardBypassController,
                         mDozeParameters,
                         mScreenOffAnimationController,
                         new NotificationWakeUpCoordinatorLogger(logcatLogBuffer()),
-                        notifsKeyguardInteractor);
+                        notifsKeyguardInteractor,
+                        mKosmos.getCommunalInteractor());
         mConfigurationController = new ConfigurationControllerImpl(mContext);
         PulseExpansionHandler expansionHandler = new PulseExpansionHandler(
                 mContext,
@@ -724,7 +726,6 @@
                 mNotificationListContainer,
                 mNotificationStackSizeCalculator,
                 mUnlockedScreenOffAnimationController,
-                mShadeTransitionController,
                 systemClock,
                 mKeyguardBottomAreaViewModel,
                 mKeyguardBottomAreaInteractor,
@@ -791,10 +792,8 @@
                 mNotificationPanelViewControllerLazy,
                 mView,
                 mQsFrameTranslateController,
-                mShadeTransitionController,
                 expansionHandler,
                 mNotificationRemoteInputManager,
-                mShadeExpansionStateManager,
                 mStatusBarKeyguardViewManager,
                 mLightBarController,
                 mNotificationStackScrollLayoutController,
@@ -804,7 +803,6 @@
                 mStatusBarTouchableRegionManager,
                 mKeyguardStateController,
                 mKeyguardBypassController,
-                mUpdateMonitor,
                 mScrimController,
                 mMediaDataManager,
                 mMediaHierarchyManager,
@@ -901,8 +899,8 @@
         mConfigurationController.onConfigurationChanged(configuration);
     }
 
-    protected void onTouchEvent(MotionEvent ev) {
-        mTouchHandler.onTouch(mView, ev);
+    protected boolean onTouchEvent(MotionEvent ev) {
+        return mTouchHandler.onTouch(mView, ev);
     }
 
     protected void setDozing(boolean dozing, boolean dozingAlwaysOn) {
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 6d5d5be..650c45b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
@@ -364,6 +364,24 @@
     }
 
     @Test
+    public void alternateBouncerVisible_onTouchEvent_notHandled() {
+        mSetFlagsRule.enableFlags(com.android.systemui.Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR);
+        // GIVEN alternate bouncer is visible
+        when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
+
+        // WHEN touch DOWN event received; THEN touch is NOT handled
+        assertThat(onTouchEvent(MotionEvent.obtain(0L /* downTime */,
+                0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */,
+                0 /* metaState */))).isFalse();
+
+        // WHEN touch MOVE event received; THEN touch is NOT handled
+        assertThat(onTouchEvent(MotionEvent.obtain(0L /* downTime */,
+                0L /* eventTime */, MotionEvent.ACTION_MOVE, 0f /* x */, 200f /* y */,
+                0 /* metaState */))).isFalse();
+
+    }
+
+    @Test
     public void test_onTouchEvent_startTracking() {
         // GIVEN device is NOT pulsing
         mNotificationPanelViewController.setPulsing(false);
@@ -1043,7 +1061,7 @@
     @Test
     public void testPanelClosedWhenClosingQsInSplitShade() {
         mShadeExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 1,
-                /* expanded= */ true, /* tracking= */ false, /* dragDownPxAmount= */ 0);
+                /* expanded= */ true, /* tracking= */ false);
         enableSplitShade(/* enabled= */ true);
         mNotificationPanelViewController.setExpandedFraction(1f);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
index 1ee26db..cf7c6f4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
@@ -20,6 +20,7 @@
 import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
 import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
 import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
+import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SENSITIVE_FOR_TRACING;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -197,7 +198,9 @@
                 shadeRepository,
                 keyguardTransitionInteractor,
                 () -> sceneInteractor,
-                () -> mKosmos.getFromGoneTransitionInteractor());
+                () -> mKosmos.getFromGoneTransitionInteractor(),
+                () -> mKosmos.getSharedNotificationContainerInteractor(),
+                mTestScope);
         CommunalInteractor communalInteractor = mKosmos.getCommunalInteractor();
 
         mFromLockscreenTransitionInteractor = mKosmos.getFromLockscreenTransitionInteractor();
@@ -434,6 +437,10 @@
 
         verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture());
         assertThat((mLayoutParameters.getValue().flags & FLAG_SECURE) != 0).isTrue();
+        assertThat(
+                (mLayoutParameters.getValue().inputFeatures & INPUT_FEATURE_SENSITIVE_FOR_TRACING)
+                        != 0)
+                .isTrue();
     }
 
     @Test
@@ -442,6 +449,10 @@
 
         verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture());
         assertThat((mLayoutParameters.getValue().flags & FLAG_SECURE) == 0).isTrue();
+        assertThat(
+                (mLayoutParameters.getValue().inputFeatures & INPUT_FEATURE_SENSITIVE_FOR_TRACING)
+                        == 0)
+                .isTrue();
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
index 88b239a..2c0a15d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
@@ -16,7 +16,6 @@
 
 package com.android.systemui.shade
 
-import org.mockito.Mockito.`when` as whenever
 import android.content.Context
 import android.testing.AndroidTestingRunner
 import android.testing.TestableLooper.RunWithLooper
@@ -26,7 +25,7 @@
 import android.view.ViewGroup
 import androidx.test.filters.SmallTest
 import com.android.keyguard.KeyguardSecurityContainerController
-import com.android.keyguard.LockIconViewController
+import com.android.keyguard.LegacyLockIconViewController
 import com.android.keyguard.dagger.KeyguardBouncerComponent
 import com.android.systemui.Flags
 import com.android.systemui.SysuiTestCase
@@ -45,9 +44,9 @@
 import com.android.systemui.keyguard.KeyguardUnlockAnimationController
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
 import com.android.systemui.keyguard.shared.model.TransitionStep
-import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerDependencies
 import com.android.systemui.res.R
 import com.android.systemui.shade.NotificationShadeWindowView.InteractionEventHandler
+import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor
 import com.android.systemui.statusbar.DragDownHelper
 import com.android.systemui.statusbar.LockscreenShadeTransitionController
 import com.android.systemui.statusbar.NotificationInsetsController
@@ -66,12 +65,10 @@
 import com.android.systemui.statusbar.window.StatusBarWindowStateController
 import com.android.systemui.unfold.UnfoldTransitionProgressProvider
 import com.android.systemui.user.domain.interactor.SelectedUserInteractor
-import com.android.systemui.util.kotlin.JavaAdapter
 import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.eq
 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.flow.MutableStateFlow
 import kotlinx.coroutines.flow.emptyFlow
@@ -89,6 +86,9 @@
 import org.mockito.Mockito.times
 import org.mockito.Mockito.verify
 import org.mockito.MockitoAnnotations
+import kotlin.test.assertEquals
+import java.util.Optional
+import org.mockito.Mockito.`when` as whenever
 
 @OptIn(ExperimentalCoroutinesApi::class)
 @SmallTest
@@ -102,7 +102,8 @@
     @Mock private lateinit var dozeServiceHost: DozeServiceHost
     @Mock private lateinit var dozeScrimController: DozeScrimController
     @Mock private lateinit var dockManager: DockManager
-    @Mock private lateinit var notificationPanelViewController: NotificationPanelViewController
+    @Mock private lateinit var shadeViewController: ShadeViewController
+    @Mock private lateinit var panelExpansionInteractor: PanelExpansionInteractor
     @Mock private lateinit var notificationShadeDepthController: NotificationShadeDepthController
     @Mock private lateinit var notificationShadeWindowController: NotificationShadeWindowController
     @Mock private lateinit var keyguardUnlockAnimationController: KeyguardUnlockAnimationController
@@ -115,7 +116,7 @@
     @Mock private lateinit var quickSettingsController: QuickSettingsControllerImpl
     @Mock
     private lateinit var lockscreenShadeTransitionController: LockscreenShadeTransitionController
-    @Mock private lateinit var lockIconViewController: LockIconViewController
+    @Mock private lateinit var lockIconViewController: LegacyLockIconViewController
     @Mock private lateinit var phoneStatusBarViewController: PhoneStatusBarViewController
     @Mock private lateinit var pulsingGestureListener: PulsingGestureListener
     @Mock
@@ -138,6 +139,7 @@
     private val notificationLaunchAnimationInteractor =
         NotificationLaunchAnimationInteractor(notificationLaunchAnimationRepository)
 
+    private lateinit var falsingCollector: FalsingCollectorFake
     private lateinit var fakeClock: FakeSystemClock
     private lateinit var interactionEventHandlerCaptor: ArgumentCaptor<InteractionEventHandler>
     private lateinit var interactionEventHandler: InteractionEventHandler
@@ -170,16 +172,18 @@
         mSetFlagsRule.enableFlags(Flags.FLAG_REVAMPED_BOUNCER_MESSAGES)
 
         testScope = TestScope()
+        falsingCollector = FalsingCollectorFake()
         fakeClock = FakeSystemClock()
         underTest =
             NotificationShadeWindowViewController(
                 lockscreenShadeTransitionController,
-                FalsingCollectorFake(),
+                falsingCollector,
                 sysuiStatusBarStateController,
                 dockManager,
                 notificationShadeDepthController,
                 view,
-                notificationPanelViewController,
+                shadeViewController,
+                panelExpansionInteractor,
                 ShadeExpansionStateManager(),
                 stackScrollLayoutController,
                 statusBarKeyguardViewManager,
@@ -206,8 +210,6 @@
                 quickSettingsController,
                 primaryBouncerInteractor,
                 alternateBouncerInteractor,
-                { mock(JavaAdapter::class.java) },
-                { mock(AlternateBouncerDependencies::class.java) },
                 mock(BouncerViewBinder::class.java)
             )
         underTest.setupExpandedStatusBar()
@@ -267,7 +269,7 @@
         testScope.runTest {
             underTest.setStatusBarViewController(phoneStatusBarViewController)
             whenever(statusBarWindowStateController.windowIsShowing()).thenReturn(true)
-            whenever(notificationPanelViewController.isFullyCollapsed).thenReturn(true)
+            whenever(panelExpansionInteractor.isFullyCollapsed).thenReturn(true)
             whenever(phoneStatusBarViewController.touchIsWithinView(anyFloat(), anyFloat()))
                 .thenReturn(true)
             whenever(phoneStatusBarViewController.sendTouchToView(DOWN_EVENT)).thenReturn(true)
@@ -286,7 +288,7 @@
             whenever(phoneStatusBarViewController.touchIsWithinView(anyFloat(), anyFloat()))
                 .thenReturn(true)
             // Item we're testing
-            whenever(notificationPanelViewController.isFullyCollapsed).thenReturn(false)
+            whenever(panelExpansionInteractor.isFullyCollapsed).thenReturn(false)
 
             val returnVal = interactionEventHandler.handleDispatchTouchEvent(DOWN_EVENT)
 
@@ -299,7 +301,7 @@
         testScope.runTest {
             underTest.setStatusBarViewController(phoneStatusBarViewController)
             whenever(statusBarWindowStateController.windowIsShowing()).thenReturn(true)
-            whenever(notificationPanelViewController.isFullyCollapsed).thenReturn(true)
+            whenever(panelExpansionInteractor.isFullyCollapsed).thenReturn(true)
             // Item we're testing
             whenever(phoneStatusBarViewController.touchIsWithinView(anyFloat(), anyFloat()))
                 .thenReturn(false)
@@ -314,7 +316,7 @@
     fun handleDispatchTouchEvent_sbWindowNotShowing_noSendTouchToSbAndReturnsTrue() =
         testScope.runTest {
             underTest.setStatusBarViewController(phoneStatusBarViewController)
-            whenever(notificationPanelViewController.isFullyCollapsed).thenReturn(true)
+            whenever(panelExpansionInteractor.isFullyCollapsed).thenReturn(true)
             whenever(phoneStatusBarViewController.touchIsWithinView(anyFloat(), anyFloat()))
                 .thenReturn(true)
             // Item we're testing
@@ -331,7 +333,7 @@
         testScope.runTest {
             underTest.setStatusBarViewController(phoneStatusBarViewController)
             whenever(statusBarWindowStateController.windowIsShowing()).thenReturn(true)
-            whenever(notificationPanelViewController.isFullyCollapsed).thenReturn(true)
+            whenever(panelExpansionInteractor.isFullyCollapsed).thenReturn(true)
             whenever(phoneStatusBarViewController.touchIsWithinView(anyFloat(), anyFloat()))
                 .thenReturn(true)
 
@@ -490,7 +492,7 @@
         // AND bouncer is not showing
         whenever(centralSurfaces.isBouncerShowing()).thenReturn(false)
         // AND panel view controller wants it
-        whenever(notificationPanelViewController.handleExternalInterceptTouch(DOWN_EVENT))
+        whenever(shadeViewController.handleExternalInterceptTouch(DOWN_EVENT))
             .thenReturn(true)
 
         mSetFlagsRule.enableFlags(Flags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT)
@@ -567,6 +569,13 @@
         verify(sysUIKeyEventHandler).interceptMediaKey(keyEvent)
     }
 
+    @Test
+    fun forwardsCollectKeyEvent() {
+        val keyEvent = KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A)
+        interactionEventHandler.collectKeyEvent(keyEvent)
+        assertEquals(keyEvent, falsingCollector.lastKeyEvent)
+    }
+
     companion object {
         private val DOWN_EVENT = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
         private val MOVE_EVENT = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
index 59fe813..98a815c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
@@ -22,7 +22,7 @@
 import android.widget.FrameLayout
 import androidx.test.filters.SmallTest
 import com.android.keyguard.KeyguardSecurityContainerController
-import com.android.keyguard.LockIconViewController
+import com.android.keyguard.LegacyLockIconViewController
 import com.android.keyguard.dagger.KeyguardBouncerComponent
 import com.android.systemui.Flags as AConfigFlags
 import com.android.systemui.SysuiTestCase
@@ -36,9 +36,9 @@
 import com.android.systemui.keyevent.domain.interactor.SysUIKeyEventHandler
 import com.android.systemui.keyguard.KeyguardUnlockAnimationController
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
-import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerDependencies
 import com.android.systemui.res.R
 import com.android.systemui.shade.NotificationShadeWindowView.InteractionEventHandler
+import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor
 import com.android.systemui.statusbar.DragDownHelper
 import com.android.systemui.statusbar.LockscreenShadeTransitionController
 import com.android.systemui.statusbar.NotificationInsetsController
@@ -56,7 +56,6 @@
 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
 import com.android.systemui.statusbar.window.StatusBarWindowStateController
 import com.android.systemui.unfold.UnfoldTransitionProgressProvider
-import com.android.systemui.util.kotlin.JavaAdapter
 import com.android.systemui.util.mockito.any
 import com.android.systemui.util.mockito.mock
 import com.android.systemui.util.mockito.whenever
@@ -91,7 +90,8 @@
     @Mock private lateinit var dozeServiceHost: DozeServiceHost
     @Mock private lateinit var dozeScrimController: DozeScrimController
     @Mock private lateinit var dockManager: DockManager
-    @Mock private lateinit var notificationPanelViewController: NotificationPanelViewController
+    @Mock private lateinit var shadeViewController: ShadeViewController
+    @Mock private lateinit var panelExpansionInteractor: PanelExpansionInteractor
     @Mock private lateinit var notificationStackScrollLayout: NotificationStackScrollLayout
     @Mock private lateinit var notificationShadeDepthController: NotificationShadeDepthController
     @Mock private lateinit var notificationShadeWindowController: NotificationShadeWindowController
@@ -103,7 +103,7 @@
     @Mock private lateinit var statusBarWindowStateController: StatusBarWindowStateController
     @Mock
     private lateinit var lockscreenShadeTransitionController: LockscreenShadeTransitionController
-    @Mock private lateinit var lockIconViewController: LockIconViewController
+    @Mock private lateinit var lockIconViewController: LegacyLockIconViewController
     @Mock private lateinit var keyguardUnlockAnimationController: KeyguardUnlockAnimationController
     @Mock private lateinit var ambientState: AmbientState
     @Mock private lateinit var shadeLogger: ShadeLogger
@@ -168,7 +168,8 @@
                 dockManager,
                 notificationShadeDepthController,
                 underTest,
-                notificationPanelViewController,
+                shadeViewController,
+                panelExpansionInteractor,
                 ShadeExpansionStateManager(),
                 notificationStackScrollLayoutController,
                 statusBarKeyguardViewManager,
@@ -195,9 +196,7 @@
                 quickSettingsController,
                 primaryBouncerInteractor,
                 alternateBouncerInteractor,
-                { Mockito.mock(JavaAdapter::class.java) },
-                { Mockito.mock(AlternateBouncerDependencies::class.java) },
-                mock()
+                mock(),
             )
 
         controller.setupExpandedStatusBar()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java
index b9451ba..20d877e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java
@@ -69,7 +69,6 @@
 import com.android.systemui.shade.domain.interactor.ShadeInteractor;
 import com.android.systemui.shade.domain.interactor.ShadeInteractorImpl;
 import com.android.systemui.shade.domain.interactor.ShadeInteractorLegacyImpl;
-import com.android.systemui.shade.transition.ShadeTransitionController;
 import com.android.systemui.statusbar.LockscreenShadeTransitionController;
 import com.android.systemui.statusbar.NotificationRemoteInputManager;
 import com.android.systemui.statusbar.NotificationShadeDepthController;
@@ -134,7 +133,6 @@
     @Mock protected ViewGroup mQsHeader;
     @Mock protected ViewParent mPanelViewParent;
     @Mock protected QsFrameTranslateController mQsFrameTranslateController;
-    @Mock protected ShadeTransitionController mShadeTransitionController;
     @Mock protected PulseExpansionHandler mPulseExpansionHandler;
     @Mock protected NotificationRemoteInputManager mNotificationRemoteInputManager;
     @Mock protected StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@@ -223,7 +221,9 @@
                 mShadeRepository,
                 keyguardTransitionInteractor,
                 () -> sceneInteractor,
-                () -> mKosmos.getFromGoneTransitionInteractor());
+                () -> mKosmos.getFromGoneTransitionInteractor(),
+                () -> mKosmos.getSharedNotificationContainerInteractor(),
+                mTestScope);
 
         mFromLockscreenTransitionInteractor = mKosmos.getFromLockscreenTransitionInteractor();
         mFromPrimaryBouncerTransitionInteractor =
@@ -305,10 +305,8 @@
                 mPanelViewControllerLazy,
                 mPanelView,
                 mQsFrameTranslateController,
-                mShadeTransitionController,
                 mPulseExpansionHandler,
                 mNotificationRemoteInputManager,
-                mShadeExpansionStateManager,
                 mStatusBarKeyguardViewManager,
                 mLightBarController,
                 mNotificationStackScrollLayoutController,
@@ -318,7 +316,6 @@
                 mStatusBarTouchableRegionManager,
                 mKeyguardStateController,
                 mKeyguardBypassController,
-                mKeyguardUpdateMonitor,
                 mScrimController,
                 mMediaDataManager,
                 mMediaHierarchyManager,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplTest.java
index b16f412..ad4b4fd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerImplTest.java
@@ -35,6 +35,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.platform.test.annotations.EnableFlags;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.view.MotionEvent;
@@ -43,6 +44,7 @@
 
 import com.android.systemui.plugins.qs.QS;
 import com.android.systemui.res.R;
+import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -285,16 +287,43 @@
     }
 
     @Test
-    public void updateQsState_fullscreenTrue() {
+    @EnableFlags(FooterViewRefactor.FLAG_NAME)
+    public void updateExpansion_partiallyExpanded_fullscreenFalse() {
+        // WHEN QS are only partially expanded
         mQsController.setExpanded(true);
-        mQsController.updateQsState();
+        when(mQs.getDesiredHeight()).thenReturn(123);
+        mQsController.setQs(mQs);
+        mQsController.onHeightChanged();
+        mQsController.setExpansionHeight(100);
+
+        // THEN they are not full screen
+        mQsController.updateExpansion();
+        assertThat(mShadeRepository.getLegacyQsFullscreen().getValue()).isFalse();
+    }
+
+    @Test
+    public void updateExpansion_fullyExpanded_fullscreenTrue() {
+        // WHEN QS are fully expanded
+        mQsController.setExpanded(true);
+        when(mQs.getDesiredHeight()).thenReturn(123);
+        mQsController.setQs(mQs);
+        mQsController.onHeightChanged();
+        mQsController.setExpansionHeight(123);
+
+        // THEN they are full screen
         assertThat(mShadeRepository.getLegacyQsFullscreen().getValue()).isTrue();
     }
 
     @Test
-    public void updateQsState_fullscreenFalse() {
+    public void updateExpansion_notExpanded_fullscreenFalse() {
+        // WHEN QS are not expanded
         mQsController.setExpanded(false);
-        mQsController.updateQsState();
+        when(mQs.getDesiredHeight()).thenReturn(123);
+        mQsController.setQs(mQs);
+        mQsController.onHeightChanged();
+        mQsController.setExpansionHeight(0);
+
+        // THEN they are not full screen
         assertThat(mShadeRepository.getLegacyQsFullscreen().getValue()).isFalse();
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt
index f489937..433c95a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt
@@ -111,7 +111,6 @@
             ShadeControllerImpl(
                 commandQueue,
                 FakeExecutor(FakeSystemClock()),
-                touchLog,
                 windowRootViewVisibilityInteractor,
                 keyguardStateController,
                 statusBarStateController,
@@ -119,7 +118,7 @@
                 statusBarWindowController,
                 deviceProvisionedController,
                 notificationShadeWindowController,
-                windowManager,
+                0,
                 Lazy { npvc },
                 Lazy { assistManager },
                 Lazy { gutsManager },
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeExpansionStateManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeExpansionStateManagerTest.kt
index 15c04eb..89ae42f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeExpansionStateManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeExpansionStateManagerTest.kt
@@ -42,17 +42,11 @@
         val tracking = true
         val dragDownAmount = 1234f
 
-        shadeExpansionStateManager.onPanelExpansionChanged(
-            fraction,
-            expanded,
-            tracking,
-            dragDownAmount
-        )
+        shadeExpansionStateManager.onPanelExpansionChanged(fraction, expanded, tracking)
 
         assertThat(listener.fraction).isEqualTo(fraction)
         assertThat(listener.expanded).isEqualTo(expanded)
         assertThat(listener.tracking).isEqualTo(tracking)
-        assertThat(listener.dragDownAmountPx).isEqualTo(dragDownAmount)
     }
 
     @Test
@@ -61,12 +55,7 @@
         val expanded = true
         val tracking = true
         val dragDownAmount = 1234f
-        shadeExpansionStateManager.onPanelExpansionChanged(
-            fraction,
-            expanded,
-            tracking,
-            dragDownAmount
-        )
+        shadeExpansionStateManager.onPanelExpansionChanged(fraction, expanded, tracking)
         val listener = TestShadeExpansionListener()
 
         val currentState = shadeExpansionStateManager.addExpansionListener(listener)
@@ -75,7 +64,6 @@
         assertThat(listener.fraction).isEqualTo(fraction)
         assertThat(listener.expanded).isEqualTo(expanded)
         assertThat(listener.tracking).isEqualTo(tracking)
-        assertThat(listener.dragDownAmountPx).isEqualTo(dragDownAmount)
     }
 
     @Test
@@ -100,8 +88,7 @@
         shadeExpansionStateManager.onPanelExpansionChanged(
             fraction = 0.5f,
             expanded = true,
-            tracking = false,
-            dragDownPxAmount = 0f
+            tracking = false
         )
 
         assertThat(listener.state).isEqualTo(STATE_OPENING)
@@ -115,8 +102,7 @@
         shadeExpansionStateManager.onPanelExpansionChanged(
             fraction = 0.5f,
             expanded = true,
-            tracking = true,
-            dragDownPxAmount = 0f
+            tracking = true
         )
 
         assertThat(listener.state).isEqualTo(STATE_OPENING)
@@ -132,8 +118,7 @@
         shadeExpansionStateManager.onPanelExpansionChanged(
             fraction = 0.5f,
             expanded = false,
-            tracking = false,
-            dragDownPxAmount = 0f
+            tracking = false
         )
 
         assertThat(listener.state).isEqualTo(STATE_CLOSED)
@@ -149,8 +134,7 @@
         shadeExpansionStateManager.onPanelExpansionChanged(
             fraction = 0.5f,
             expanded = false,
-            tracking = true,
-            dragDownPxAmount = 0f
+            tracking = true
         )
 
         assertThat(listener.state).isEqualTo(STATE_OPEN)
@@ -166,8 +150,7 @@
         shadeExpansionStateManager.onPanelExpansionChanged(
             fraction = 1f,
             expanded = true,
-            tracking = false,
-            dragDownPxAmount = 0f
+            tracking = false
         )
 
         assertThat(listener.previousState).isEqualTo(STATE_OPENING)
@@ -182,8 +165,7 @@
         shadeExpansionStateManager.onPanelExpansionChanged(
             fraction = 1f,
             expanded = true,
-            tracking = true,
-            dragDownPxAmount = 0f
+            tracking = true
         )
 
         assertThat(listener.state).isEqualTo(STATE_OPENING)
@@ -199,8 +181,7 @@
         shadeExpansionStateManager.onPanelExpansionChanged(
             fraction = 1f,
             expanded = false,
-            tracking = false,
-            dragDownPxAmount = 0f
+            tracking = false
         )
 
         assertThat(listener.state).isEqualTo(STATE_CLOSED)
@@ -216,8 +197,7 @@
         shadeExpansionStateManager.onPanelExpansionChanged(
             fraction = 1f,
             expanded = false,
-            tracking = true,
-            dragDownPxAmount = 0f
+            tracking = true
         )
 
         assertThat(listener.state).isEqualTo(STATE_OPEN)
@@ -229,13 +209,11 @@
         var fraction: Float = 0f
         var expanded: Boolean = false
         var tracking: Boolean = false
-        var dragDownAmountPx: Float = 0f
 
         override fun onPanelExpansionChanged(event: ShadeExpansionChangeEvent) {
             this.fraction = event.fraction
             this.expanded = event.expanded
             this.tracking = event.tracking
-            this.dragDownAmountPx = event.dragDownPxAmount
         }
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ScrimShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ScrimShadeTransitionControllerTest.kt
index a5bd2ae..f2abb90 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ScrimShadeTransitionControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ScrimShadeTransitionControllerTest.kt
@@ -1,12 +1,29 @@
 package com.android.systemui.shade.transition
 
+import android.platform.test.annotations.DisableFlags
 import android.testing.AndroidTestingRunner
 import androidx.test.filters.SmallTest
+import com.android.systemui.Flags
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryRepository
+import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
+import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor
+import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
 import com.android.systemui.dump.DumpManager
-import com.android.systemui.shade.STATE_OPENING
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.scene.domain.interactor.SceneInteractor
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.scene.shared.model.FakeSceneDataSource
+import com.android.systemui.scene.shared.model.fakeSceneDataSource
 import com.android.systemui.shade.ShadeExpansionChangeEvent
+import com.android.systemui.shade.ShadeExpansionStateManager
+import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor
+import com.android.systemui.shade.domain.interactor.panelExpansionInteractor
 import com.android.systemui.statusbar.phone.ScrimController
+import com.android.systemui.testKosmos
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.test.TestScope
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -21,31 +38,67 @@
     @Mock private lateinit var scrimController: ScrimController
     @Mock private lateinit var dumpManager: DumpManager
 
-    private lateinit var controller: ScrimShadeTransitionController
+    private val shadeExpansionStateManager = ShadeExpansionStateManager()
+    private val kosmos = testKosmos()
+    private lateinit var testScope: TestScope
+    private lateinit var applicationScope: CoroutineScope
+    private lateinit var panelExpansionInteractor: PanelExpansionInteractor
+    private lateinit var deviceEntryRepository: FakeDeviceEntryRepository
+    private lateinit var deviceUnlockedInteractor: DeviceUnlockedInteractor
+    private lateinit var sceneInteractor: SceneInteractor
+    private lateinit var fakeSceneDataSource: FakeSceneDataSource
+
+    private lateinit var underTest: ScrimShadeTransitionController
 
     @Before
     fun setUp() {
         MockitoAnnotations.initMocks(this)
         context.ensureTestableResources()
-        controller = ScrimShadeTransitionController(dumpManager, scrimController)
-
-        controller.onPanelStateChanged(STATE_OPENING)
+        testScope = kosmos.testScope
+        applicationScope = kosmos.applicationCoroutineScope
+        panelExpansionInteractor = kosmos.panelExpansionInteractor
+        deviceEntryRepository = kosmos.fakeDeviceEntryRepository
+        deviceUnlockedInteractor = kosmos.deviceUnlockedInteractor
+        sceneInteractor = kosmos.sceneInteractor
+        fakeSceneDataSource = kosmos.fakeSceneDataSource
+        underTest = ScrimShadeTransitionController(
+            shadeExpansionStateManager,
+            dumpManager,
+            scrimController,
+            )
+        underTest.init()
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_SCENE_CONTAINER)
     fun onPanelExpansionChanged_setsFractionEqualToEventFraction() {
-        controller.onPanelExpansionChanged(EXPANSION_EVENT)
+        underTest.onPanelExpansionChanged(DEFAULT_EXPANSION_EVENT)
 
-        verify(scrimController).setRawPanelExpansionFraction(EXPANSION_EVENT.fraction)
+        verify(scrimController).setRawPanelExpansionFraction(DEFAULT_EXPANSION_EVENT.fraction)
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_SCENE_CONTAINER)
+    fun onPanelStateChanged_forwardsToScrimTransitionController() {
+        startLegacyPanelExpansion()
+
+        verify(scrimController).setRawPanelExpansionFraction(DEFAULT_EXPANSION_EVENT.fraction)
+    }
+
+    private fun startLegacyPanelExpansion() {
+        shadeExpansionStateManager.onPanelExpansionChanged(
+            DEFAULT_EXPANSION_EVENT.fraction,
+            DEFAULT_EXPANSION_EVENT.expanded,
+            DEFAULT_EXPANSION_EVENT.tracking,
+        )
     }
 
     companion object {
-        val EXPANSION_EVENT =
+        val DEFAULT_EXPANSION_EVENT =
             ShadeExpansionChangeEvent(
                 fraction = 0.5f,
                 expanded = true,
-                tracking = true,
-                dragDownPxAmount = 10f
+                tracking = true
             )
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ShadeTransitionControllerTest.kt
deleted file mode 100644
index 0a9541a..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/transition/ShadeTransitionControllerTest.kt
+++ /dev/null
@@ -1,217 +0,0 @@
-@file:OptIn(ExperimentalCoroutinesApi::class)
-
-package com.android.systemui.shade.transition
-
-import android.platform.test.annotations.DisableFlags
-import android.testing.AndroidTestingRunner
-import androidx.test.filters.SmallTest
-import com.android.compose.animation.scene.ObservableTransitionState
-import com.android.compose.animation.scene.SceneKey
-import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryRepository
-import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
-import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteractor
-import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.flags.EnableSceneContainer
-import com.android.systemui.kosmos.applicationCoroutineScope
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor
-import com.android.systemui.scene.domain.interactor.SceneInteractor
-import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.scene.shared.model.FakeSceneDataSource
-import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.scene.shared.model.fakeSceneDataSource
-import com.android.systemui.shade.STATE_OPENING
-import com.android.systemui.shade.ShadeExpansionChangeEvent
-import com.android.systemui.shade.ShadeExpansionStateManager
-import com.android.systemui.shade.domain.interactor.panelExpansionInteractor
-import com.android.systemui.statusbar.SysuiStatusBarStateController
-import com.android.systemui.statusbar.policy.FakeConfigurationController
-import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController
-import com.android.systemui.testKosmos
-import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.whenever
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.CoroutineScope
-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.Mock
-import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
-
-@RunWith(AndroidTestingRunner::class)
-@SmallTest
-class ShadeTransitionControllerTest : SysuiTestCase() {
-
-    @Mock private lateinit var scrimShadeTransitionController: ScrimShadeTransitionController
-    @Mock private lateinit var dumpManager: DumpManager
-    @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController
-
-    private lateinit var controller: ShadeTransitionController
-
-    private val configurationController = FakeConfigurationController()
-    private val shadeExpansionStateManager = ShadeExpansionStateManager()
-    private val kosmos = testKosmos()
-    private lateinit var testScope: TestScope
-    private lateinit var applicationScope: CoroutineScope
-    private lateinit var panelExpansionInteractor: PanelExpansionInteractor
-    private lateinit var deviceEntryRepository: FakeDeviceEntryRepository
-    private lateinit var deviceUnlockedInteractor: DeviceUnlockedInteractor
-    private lateinit var sceneInteractor: SceneInteractor
-    private lateinit var fakeSceneDataSource: FakeSceneDataSource
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-
-        testScope = kosmos.testScope
-        applicationScope = kosmos.applicationCoroutineScope
-        panelExpansionInteractor = kosmos.panelExpansionInteractor
-        deviceEntryRepository = kosmos.fakeDeviceEntryRepository
-        deviceUnlockedInteractor = kosmos.deviceUnlockedInteractor
-        sceneInteractor = kosmos.sceneInteractor
-        fakeSceneDataSource = kosmos.fakeSceneDataSource
-
-        controller =
-            ShadeTransitionController(
-                applicationScope,
-                configurationController,
-                shadeExpansionStateManager,
-                dumpManager,
-                context,
-                scrimShadeTransitionController,
-                statusBarStateController,
-                ResourcesSplitShadeStateController(),
-            ) {
-                panelExpansionInteractor
-            }
-    }
-
-    @Test
-    @DisableFlags(FLAG_SCENE_CONTAINER)
-    fun onPanelStateChanged_forwardsToScrimTransitionController() {
-        startLegacyPanelExpansion()
-
-        verify(scrimShadeTransitionController).onPanelStateChanged(STATE_OPENING)
-        verify(scrimShadeTransitionController).onPanelExpansionChanged(DEFAULT_EXPANSION_EVENT)
-    }
-
-    @Test
-    @EnableSceneContainer
-    fun sceneChanges_forwardsToScrimTransitionController() =
-        testScope.runTest {
-            var latestChangeEvent: ShadeExpansionChangeEvent? = null
-            whenever(scrimShadeTransitionController.onPanelExpansionChanged(any())).thenAnswer {
-                latestChangeEvent = it.arguments[0] as ShadeExpansionChangeEvent
-                Unit
-            }
-            setUnlocked(true)
-            val transitionState =
-                MutableStateFlow<ObservableTransitionState>(
-                    ObservableTransitionState.Idle(Scenes.Gone)
-                )
-            sceneInteractor.setTransitionState(transitionState)
-
-            changeScene(Scenes.Gone, transitionState)
-            val currentScene by collectLastValue(sceneInteractor.currentScene)
-            assertThat(currentScene).isEqualTo(Scenes.Gone)
-
-            assertThat(latestChangeEvent)
-                .isEqualTo(
-                    ShadeExpansionChangeEvent(
-                        fraction = 0f,
-                        expanded = false,
-                        tracking = true,
-                        dragDownPxAmount = 0f,
-                    )
-                )
-
-            changeScene(Scenes.Shade, transitionState) { progress ->
-                assertThat(latestChangeEvent)
-                    .isEqualTo(
-                        ShadeExpansionChangeEvent(
-                            fraction = progress,
-                            expanded = progress > 0,
-                            tracking = true,
-                            dragDownPxAmount = 0f,
-                        )
-                    )
-            }
-        }
-
-    private fun startLegacyPanelExpansion() {
-        shadeExpansionStateManager.onPanelExpansionChanged(
-            DEFAULT_EXPANSION_EVENT.fraction,
-            DEFAULT_EXPANSION_EVENT.expanded,
-            DEFAULT_EXPANSION_EVENT.tracking,
-            DEFAULT_EXPANSION_EVENT.dragDownPxAmount,
-        )
-    }
-
-    private fun TestScope.setUnlocked(isUnlocked: Boolean) {
-        val isDeviceUnlocked by collectLastValue(deviceUnlockedInteractor.isDeviceUnlocked)
-        deviceEntryRepository.setUnlocked(isUnlocked)
-        runCurrent()
-
-        assertThat(isDeviceUnlocked).isEqualTo(isUnlocked)
-    }
-
-    private fun TestScope.changeScene(
-        toScene: SceneKey,
-        transitionState: MutableStateFlow<ObservableTransitionState>,
-        assertDuringProgress: ((progress: Float) -> Unit) = {},
-    ) {
-        val currentScene by collectLastValue(sceneInteractor.currentScene)
-        val progressFlow = MutableStateFlow(0f)
-        transitionState.value =
-            ObservableTransitionState.Transition(
-                fromScene = checkNotNull(currentScene),
-                toScene = toScene,
-                progress = progressFlow,
-                isInitiatedByUserInput = true,
-                isUserInputOngoing = flowOf(true),
-            )
-        runCurrent()
-        assertDuringProgress(progressFlow.value)
-
-        progressFlow.value = 0.2f
-        runCurrent()
-        assertDuringProgress(progressFlow.value)
-
-        progressFlow.value = 0.6f
-        runCurrent()
-        assertDuringProgress(progressFlow.value)
-
-        progressFlow.value = 1f
-        runCurrent()
-        assertDuringProgress(progressFlow.value)
-
-        transitionState.value = ObservableTransitionState.Idle(toScene)
-        fakeSceneDataSource.changeScene(toScene)
-        runCurrent()
-        assertDuringProgress(progressFlow.value)
-
-        assertThat(currentScene).isEqualTo(toScene)
-    }
-
-    companion object {
-        private const val DEFAULT_DRAG_DOWN_AMOUNT = 123f
-        private val DEFAULT_EXPANSION_EVENT =
-            ShadeExpansionChangeEvent(
-                fraction = 0.5f,
-                expanded = true,
-                tracking = true,
-                dragDownPxAmount = DEFAULT_DRAG_DOWN_AMOUNT
-            )
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java
index 722387c..02954b8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceTest.java
@@ -28,7 +28,7 @@
 import android.content.pm.ApplicationInfo;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.Log;
-import androidx.test.filters.FlakyTest;
+
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.systemui.SysuiTestCase;
@@ -46,11 +46,10 @@
 import java.util.Collections;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Supplier;
 
-@FlakyTest(bugId = 327655994) // Also b/324682425
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class PluginInstanceTest extends SysuiTestCase {
@@ -177,7 +176,7 @@
     }
 
     @Test
-    public void testLoadUnloadSimultaneous_HoldsUnload() throws Exception {
+    public void testLoadUnloadSimultaneous_HoldsUnload() throws Throwable {
         final Semaphore loadLock = new Semaphore(1);
         final Semaphore unloadLock = new Semaphore(1);
 
@@ -190,16 +189,16 @@
             Thread.yield();
             boolean isLocked = getLock(unloadLock, 1000);
 
-            // Ensure the bg thread failed to do delete the plugin
+            // Ensure the bg thread failed to delete the plugin
             assertNotNull(mPluginInstance.getPlugin());
             // We expect that bgThread deadlocked holding the semaphore
             assertFalse(isLocked);
         };
 
-        AtomicBoolean isBgThreadFailed = new AtomicBoolean(false);
+        AtomicReference<Throwable> bgFailure = new AtomicReference<Throwable>(null);
         Thread bgThread = new Thread(() -> {
             assertTrue(getLock(unloadLock, 10));
-            assertTrue(getLock(loadLock, 4000)); // Wait for the foreground thread
+            assertTrue(getLock(loadLock, 10000)); // Wait for the foreground thread
             assertNotNull(mPluginInstance.getPlugin());
             // Attempt to delete the plugin, this should block until the load completes
             mPluginInstance.unloadPlugin();
@@ -210,8 +209,9 @@
 
         // This protects the test suite from crashing due to the uncaught exception.
         bgThread.setUncaughtExceptionHandler((Thread t, Throwable ex) -> {
-            Log.e("testLoadUnloadSimultaneous_HoldsUnload", "Exception from BG Thread", ex);
-            isBgThreadFailed.set(true);
+            Log.e("PluginInstanceTest#testLoadUnloadSimultaneous_HoldsUnload",
+                    "Exception from BG Thread", ex);
+            bgFailure.set(ex);
         });
 
         loadLock.acquire();
@@ -222,7 +222,13 @@
         mPluginInstance.loadPlugin();
 
         bgThread.join(5000);
-        assertFalse(isBgThreadFailed.get());
+
+        // Rethrow final background exception on test thread
+        Throwable bgEx = bgFailure.get();
+        if (bgEx != null) {
+            throw bgEx;
+        }
+
         assertNull(mPluginInstance.getPlugin());
     }
 
@@ -230,6 +236,8 @@
         try {
             return lock.tryAcquire(millis, TimeUnit.MILLISECONDS);
         } catch (InterruptedException ex) {
+            Log.e("PluginInstanceTest#getLock",
+                    "Interrupted Exception getting lock", ex);
             fail();
             return false;
         }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
index 68bc72b..fc0c85e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
@@ -23,18 +23,18 @@
 import android.view.View
 import android.view.ViewRootImpl
 import androidx.test.filters.SmallTest
-import com.android.systemui.res.R
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.animation.ShadeInterpolation
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.res.R
 import com.android.systemui.shade.ShadeExpansionChangeEvent
 import com.android.systemui.statusbar.phone.BiometricUnlockController
 import com.android.systemui.statusbar.phone.DozeParameters
 import com.android.systemui.statusbar.phone.ScrimController
 import com.android.systemui.statusbar.policy.FakeConfigurationController
-import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController
 import com.android.systemui.statusbar.policy.KeyguardStateController
+import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController
 import com.android.systemui.util.WallpaperController
 import com.android.systemui.util.mockito.eq
 import com.google.common.truth.Truth.assertThat
@@ -142,7 +142,7 @@
     fun onPanelExpansionChanged_apliesBlur_ifShade() {
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
+                fraction = 1f, expanded = true, tracking = false))
         verify(shadeAnimation).animateTo(eq(maxBlur))
     }
 
@@ -150,7 +150,7 @@
     fun onPanelExpansionChanged_animatesBlurIn_ifShade() {
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 0.01f, expanded = false, tracking = false, dragDownPxAmount = 0f))
+                fraction = 0.01f, expanded = false, tracking = false))
         verify(shadeAnimation).animateTo(eq(maxBlur))
     }
 
@@ -160,7 +160,7 @@
         clearInvocations(shadeAnimation)
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 0f, expanded = false, tracking = false, dragDownPxAmount = 0f))
+                fraction = 0f, expanded = false, tracking = false))
         verify(shadeAnimation).animateTo(eq(0))
     }
 
@@ -168,7 +168,7 @@
     fun onPanelExpansionChanged_animatesBlurOut_ifFlick() {
         val event =
             ShadeExpansionChangeEvent(
-                fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f)
+                fraction = 1f, expanded = true, tracking = false)
         onPanelExpansionChanged_apliesBlur_ifShade()
         clearInvocations(shadeAnimation)
         notificationShadeDepthController.onPanelExpansionChanged(event)
@@ -189,7 +189,7 @@
         clearInvocations(shadeAnimation)
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 0.6f, expanded = true, tracking = true, dragDownPxAmount = 0f))
+                fraction = 0.6f, expanded = true, tracking = true))
         verify(shadeAnimation).animateTo(eq(maxBlur))
     }
 
@@ -197,7 +197,7 @@
     fun onPanelExpansionChanged_respectsMinPanelPullDownFraction() {
         val event =
             ShadeExpansionChangeEvent(
-                fraction = 0.5f, expanded = true, tracking = true, dragDownPxAmount = 0f)
+                fraction = 0.5f, expanded = true, tracking = true)
         notificationShadeDepthController.panelPullDownMinFraction = 0.5f
         notificationShadeDepthController.onPanelExpansionChanged(event)
         assertThat(notificationShadeDepthController.shadeExpansion).isEqualTo(0f)
@@ -225,7 +225,7 @@
         notificationShadeDepthController.qsPanelExpansion = 1f
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
+                fraction = 1f, expanded = true, tracking = false))
         notificationShadeDepthController.updateBlurCallback.doFrame(0)
         verify(blurUtils).applyBlur(any(), eq(maxBlur), eq(false))
     }
@@ -236,7 +236,7 @@
         notificationShadeDepthController.qsPanelExpansion = 0.25f
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
+                fraction = 1f, expanded = true, tracking = false))
         notificationShadeDepthController.updateBlurCallback.doFrame(0)
         verify(wallpaperController)
             .setNotificationShadeZoom(eq(ShadeInterpolation.getNotificationScrimAlpha(0.25f)))
@@ -248,7 +248,7 @@
 
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
+                fraction = 1f, expanded = true, tracking = false))
         notificationShadeDepthController.updateBlurCallback.doFrame(0)
 
         verify(wallpaperController).setNotificationShadeZoom(0f)
@@ -260,7 +260,7 @@
 
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
+                fraction = 1f, expanded = true, tracking = false))
         notificationShadeDepthController.updateBlurCallback.doFrame(0)
 
         verify(wallpaperController).setNotificationShadeZoom(floatThat { it > 0 })
@@ -273,7 +273,7 @@
         val expanded = true
         val tracking = false
         val dragDownPxAmount = 0f
-        val event = ShadeExpansionChangeEvent(rawFraction, expanded, tracking, dragDownPxAmount)
+        val event = ShadeExpansionChangeEvent(rawFraction, expanded, tracking)
         val inOrder = Mockito.inOrder(wallpaperController)
 
         notificationShadeDepthController.onPanelExpansionChanged(event)
@@ -338,7 +338,7 @@
     fun updateBlurCallback_setsBlur_whenExpanded() {
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
+                fraction = 1f, expanded = true, tracking = false))
         `when`(shadeAnimation.radius).thenReturn(maxBlur.toFloat())
         notificationShadeDepthController.updateBlurCallback.doFrame(0)
         verify(blurUtils).applyBlur(any(), eq(maxBlur), eq(false))
@@ -348,7 +348,7 @@
     fun updateBlurCallback_ignoreShadeBlurUntilHidden_overridesZoom() {
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
+                fraction = 1f, expanded = true, tracking = false))
         `when`(shadeAnimation.radius).thenReturn(maxBlur.toFloat())
         notificationShadeDepthController.blursDisabledForAppLaunch = true
         notificationShadeDepthController.updateBlurCallback.doFrame(0)
@@ -367,7 +367,7 @@
     fun ignoreBlurForUnlock_ignores() {
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
+                fraction = 1f, expanded = true, tracking = false))
         `when`(shadeAnimation.radius).thenReturn(maxBlur.toFloat())
 
         notificationShadeDepthController.blursDisabledForAppLaunch = false
@@ -384,7 +384,7 @@
     fun ignoreBlurForUnlock_doesNotIgnore() {
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
+                fraction = 1f, expanded = true, tracking = false))
         `when`(shadeAnimation.radius).thenReturn(maxBlur.toFloat())
 
         notificationShadeDepthController.blursDisabledForAppLaunch = false
@@ -416,7 +416,7 @@
         // And shade is blurred
         notificationShadeDepthController.onPanelExpansionChanged(
             ShadeExpansionChangeEvent(
-                fraction = 1f, expanded = true, tracking = false, dragDownPxAmount = 0f))
+                fraction = 1f, expanded = true, tracking = false))
         `when`(shadeAnimation.radius).thenReturn(maxBlur.toFloat())
 
         notificationShadeDepthController.updateBlurCallback.doFrame(0)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/OperatorNameViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/OperatorNameViewControllerTest.kt
new file mode 100644
index 0000000..9c59f9b
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/OperatorNameViewControllerTest.kt
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.telephony.ServiceState
+import android.telephony.SubscriptionInfo
+import android.telephony.TelephonyManager
+import android.telephony.telephonyManager
+import androidx.test.filters.SmallTest
+import com.android.keyguard.keyguardUpdateMonitor
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.plugins.DarkIconDispatcher
+import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
+import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
+import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository
+import com.android.systemui.statusbar.pipeline.mobile.util.FakeSubscriptionManagerProxy
+import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
+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.any
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import junit.framework.Assert.assertTrue
+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.mockito.Mock
+import org.mockito.MockitoAnnotations
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+class OperatorNameViewControllerTest : SysuiTestCase() {
+    private lateinit var underTest: OperatorNameViewController
+    private lateinit var airplaneModeInteractor: AirplaneModeInteractor
+
+    private val kosmos = Kosmos()
+    private val testScope = TestScope()
+
+    private val view = OperatorNameView(mContext)
+    private val javaAdapter = JavaAdapter(testScope.backgroundScope)
+
+    @Mock private lateinit var darkIconDispatcher: DarkIconDispatcher
+    @Mock private lateinit var tunerService: TunerService
+    private var telephonyManager = kosmos.telephonyManager
+    private val keyguardUpdateMonitor = kosmos.keyguardUpdateMonitor
+    @Mock private lateinit var carrierConfigTracker: CarrierConfigTracker
+    private val subscriptionManagerProxy = FakeSubscriptionManagerProxy()
+
+    private val airplaneModeRepository = FakeAirplaneModeRepository()
+    private val connectivityRepository = FakeConnectivityRepository()
+    private val mobileConnectionsRepository = FakeMobileConnectionsRepository()
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+
+        airplaneModeInteractor =
+            AirplaneModeInteractor(
+                airplaneModeRepository,
+                connectivityRepository,
+                mobileConnectionsRepository,
+            )
+
+        underTest =
+            OperatorNameViewController.Factory(
+                    darkIconDispatcher,
+                    tunerService,
+                    telephonyManager,
+                    keyguardUpdateMonitor,
+                    carrierConfigTracker,
+                    airplaneModeInteractor,
+                    subscriptionManagerProxy,
+                    javaAdapter,
+                )
+                .create(view)
+    }
+
+    @Test
+    fun updateFromSubInfo_showsCarrieName() =
+        testScope.runTest {
+            whenever(telephonyManager.isDataCapable).thenReturn(true)
+
+            val mockSubInfo =
+                mock<SubscriptionInfo>().also {
+                    whenever(it.subscriptionId).thenReturn(1)
+                    whenever(it.carrierName).thenReturn("test_carrier")
+                }
+            whenever(keyguardUpdateMonitor.getSubscriptionInfoForSubId(any()))
+                .thenReturn(mockSubInfo)
+            whenever(keyguardUpdateMonitor.getSimState(any()))
+                .thenReturn(TelephonyManager.SIM_STATE_READY)
+            whenever(keyguardUpdateMonitor.getServiceState(any()))
+                .thenReturn(ServiceState().also { it.state = ServiceState.STATE_IN_SERVICE })
+            subscriptionManagerProxy.defaultDataSubId = 1
+            airplaneModeRepository.setIsAirplaneMode(false)
+
+            underTest.onViewAttached()
+            runCurrent()
+
+            assertThat(view.text).isEqualTo("test_carrier")
+        }
+
+    @Test
+    fun notDataCapable_doesNotShowOperatorName() =
+        testScope.runTest {
+            whenever(telephonyManager.isDataCapable).thenReturn(false)
+
+            val mockSubInfo =
+                mock<SubscriptionInfo>().also {
+                    whenever(it.subscriptionId).thenReturn(1)
+                    whenever(it.carrierName).thenReturn("test_carrier")
+                }
+            whenever(keyguardUpdateMonitor.getSubscriptionInfoForSubId(any()))
+                .thenReturn(mockSubInfo)
+            whenever(keyguardUpdateMonitor.getSimState(any()))
+                .thenReturn(TelephonyManager.SIM_STATE_READY)
+            whenever(keyguardUpdateMonitor.getServiceState(any()))
+                .thenReturn(ServiceState().also { it.state = ServiceState.STATE_IN_SERVICE })
+            subscriptionManagerProxy.defaultDataSubId = 1
+            airplaneModeRepository.setIsAirplaneMode(false)
+
+            underTest.onViewAttached()
+            runCurrent()
+
+            assertTrue(view.text.isNullOrEmpty())
+        }
+
+    @Test
+    fun airplaneMode_doesNotShowOperatorName() =
+        testScope.runTest {
+            whenever(telephonyManager.isDataCapable).thenReturn(false)
+            val mockSubInfo =
+                mock<SubscriptionInfo>().also {
+                    whenever(it.subscriptionId).thenReturn(1)
+                    whenever(it.carrierName).thenReturn("test_carrier")
+                }
+            whenever(keyguardUpdateMonitor.getSubscriptionInfoForSubId(any()))
+                .thenReturn(mockSubInfo)
+            whenever(keyguardUpdateMonitor.getSimState(any()))
+                .thenReturn(TelephonyManager.SIM_STATE_READY)
+            whenever(keyguardUpdateMonitor.getServiceState(any()))
+                .thenReturn(ServiceState().also { it.state = ServiceState.STATE_IN_SERVICE })
+            subscriptionManagerProxy.defaultDataSubId = 1
+            airplaneModeRepository.setIsAirplaneMode(true)
+
+            underTest.onViewAttached()
+            runCurrent()
+
+            assertTrue(view.text.isNullOrEmpty())
+        }
+
+    @Test
+    fun notInService_doesNotShowOperatorName() =
+        testScope.runTest {
+            // Data capable
+            whenever(telephonyManager.isDataCapable).thenReturn(true)
+
+            // Valid subscription
+            val mockSubInfo =
+                mock<SubscriptionInfo>().also {
+                    whenever(it.subscriptionId).thenReturn(1)
+                    whenever(it.carrierName).thenReturn("test_carrier")
+                }
+            whenever(keyguardUpdateMonitor.getSubscriptionInfoForSubId(any()))
+                .thenReturn(mockSubInfo)
+            whenever(keyguardUpdateMonitor.getSimState(any()))
+                .thenReturn(TelephonyManager.SIM_STATE_READY)
+
+            // Not in service
+            whenever(keyguardUpdateMonitor.getServiceState(any()))
+                .thenReturn(ServiceState().also { it.state = ServiceState.STATE_OUT_OF_SERVICE })
+            // Subscription is default for data
+            subscriptionManagerProxy.defaultDataSubId = 1
+            // Not airplane mode
+            airplaneModeRepository.setIsAirplaneMode(false)
+
+            underTest.onViewAttached()
+            runCurrent()
+
+            assertTrue(view.text.isNullOrEmpty())
+        }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
index 6483582..de61086 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
@@ -33,7 +33,6 @@
 import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
 import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
 import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
 import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
 import com.android.systemui.flags.EnableSceneContainer
@@ -42,14 +41,16 @@
 import com.android.systemui.keyguard.data.repository.FakeCommandQueue
 import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
 import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
 import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor
 import com.android.systemui.keyguard.domain.interactor.FromPrimaryBouncerTransitionInteractor
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
 import com.android.systemui.keyguard.domain.interactor.fromGoneTransitionInteractor
 import com.android.systemui.keyguard.domain.interactor.fromLockscreenTransitionInteractor
 import com.android.systemui.keyguard.domain.interactor.fromPrimaryBouncerTransitionInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor
 import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
-import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.power.data.repository.FakePowerRepository
@@ -64,6 +65,7 @@
 import com.android.systemui.shade.domain.interactor.ShadeInteractorLegacyImpl
 import com.android.systemui.statusbar.disableflags.data.repository.FakeDisableFlagsRepository
 import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor
+import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor
 import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController
 import com.android.systemui.statusbar.policy.data.repository.FakeUserSetupRepository
 import com.android.systemui.statusbar.policy.domain.interactor.deviceProvisioningInteractor
@@ -86,8 +88,8 @@
 import org.mockito.Mockito
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
 import org.mockito.Mockito.`when` as whenever
+import org.mockito.MockitoAnnotations
 
 @SmallTest
 @RunWith(AndroidTestingRunner::class)
@@ -121,6 +123,7 @@
                     { shadeInteractor },
                     { kosmos.deviceUnlockedInteractor },
                     { kosmos.sceneInteractor },
+                    { kosmos.keyguardClockInteractor },
                 ) {
                 override fun createDarkAnimator(): ObjectAnimator {
                     return mockDarkAnimator
@@ -151,6 +154,8 @@
                 keyguardTransitionInteractor,
                 { kosmos.sceneInteractor },
                 { kosmos.fromGoneTransitionInteractor },
+                { kosmos.sharedNotificationContainerInteractor },
+                testScope,
             )
 
         whenever(deviceEntryUdfpsInteractor.isUdfpsSupported).thenReturn(MutableStateFlow(false))
@@ -305,17 +310,20 @@
             underTest.addCallback(listener)
 
             val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene)
+            val deviceUnlockStatus by
+                collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus)
+
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Password
             )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(false)
             runCurrent()
+            assertThat(deviceUnlockStatus!!.isUnlocked).isFalse()
+
             kosmos.sceneInteractor.changeScene(
                 toScene = Scenes.Lockscreen,
                 loggingReason = "reason"
             )
             runCurrent()
-            assertThat(kosmos.deviceUnlockedInteractor.isDeviceUnlocked.value).isFalse()
             assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
 
             // Call start to begin hydrating based on the scene framework:
@@ -339,10 +347,7 @@
             assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
             assertThat(statusBarState).isEqualTo(StatusBarState.SHADE_LOCKED)
 
-            kosmos.sceneInteractor.changeScene(
-                toScene = Scenes.Communal,
-                loggingReason = "reason"
-            )
+            kosmos.sceneInteractor.changeScene(toScene = Scenes.Communal, loggingReason = "reason")
             runCurrent()
             assertThat(currentScene).isEqualTo(Scenes.Communal)
             assertThat(statusBarState).isEqualTo(StatusBarState.KEYGUARD)
@@ -370,14 +375,20 @@
             underTest.addCallback(listener)
 
             val currentScene by collectLastValue(kosmos.sceneInteractor.currentScene)
+            val deviceUnlockStatus by
+                collectLastValue(kosmos.deviceUnlockedInteractor.deviceUnlockStatus)
             kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
                 AuthenticationMethodModel.Password
             )
-            kosmos.fakeDeviceEntryRepository.setUnlocked(true)
+            kosmos.fakeDeviceEntryFingerprintAuthRepository.setAuthenticationStatus(
+                SuccessFingerprintAuthenticationStatus(0, true)
+            )
             runCurrent()
+
+            assertThat(deviceUnlockStatus!!.isUnlocked).isTrue()
+
             kosmos.sceneInteractor.changeScene(toScene = Scenes.Gone, loggingReason = "reason")
             runCurrent()
-            assertThat(kosmos.deviceUnlockedInteractor.isDeviceUnlocked.value).isTrue()
             assertThat(currentScene).isEqualTo(Scenes.Gone)
 
             // Call start to begin hydrating based on the scene framework:
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 a5f3f57..5abad61 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
@@ -38,6 +38,7 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.keyguard.WakefulnessLifecycle
 import com.android.systemui.plugins.ActivityStarter
 import com.android.systemui.plugins.BcSmartspaceConfigPlugin
 import com.android.systemui.plugins.BcSmartspaceDataPlugin
@@ -180,6 +181,7 @@
     private lateinit var dateSmartspaceView: SmartspaceView
     private lateinit var weatherSmartspaceView: SmartspaceView
     private lateinit var smartspaceView: SmartspaceView
+    private lateinit var wakefulnessLifecycle: WakefulnessLifecycle
 
     private val clock = FakeSystemClock()
     private val executor = FakeExecutor(clock)
@@ -225,6 +227,14 @@
         setAllowPrivateNotifications(userHandleSecondary, true)
         setShowNotifications(userHandlePrimary, true)
 
+        // Use the real wakefulness lifecycle instead of a mock
+        wakefulnessLifecycle = WakefulnessLifecycle(
+            context,
+            /* wallpaper= */ null,
+            clock,
+            dumpManager
+        )
+
         controller = LockscreenSmartspaceController(
                 context,
                 featureFlags,
@@ -240,6 +250,7 @@
                 deviceProvisionedController,
                 keyguardBypassController,
                 keyguardUpdateMonitor,
+                wakefulnessLifecycle,
                 dumpManager,
                 execution,
                 executor,
@@ -773,6 +784,38 @@
         verify(configurationController, never()).addCallback(any())
     }
 
+    @Test
+    fun testWakefulnessLifecycleDispatch_wake_setsSmartspaceScreenOnTrue() {
+        // Connect session
+        connectSession()
+
+        // Add mock views
+        val mockSmartspaceView = mock(SmartspaceView::class.java)
+        controller.smartspaceViews.add(mockSmartspaceView)
+
+        // Initiate wakefulness change
+        wakefulnessLifecycle.dispatchStartedWakingUp(0)
+
+        // Verify smartspace views receive screen on
+        verify(mockSmartspaceView).setScreenOn(true)
+    }
+
+    @Test
+    fun testWakefulnessLifecycleDispatch_sleep_setsSmartspaceScreenOnFalse() {
+        // Connect session
+        connectSession()
+
+        // Add mock views
+        val mockSmartspaceView = mock(SmartspaceView::class.java)
+        controller.smartspaceViews.add(mockSmartspaceView)
+
+        // Initiate wakefulness change
+        wakefulnessLifecycle.dispatchFinishedGoingToSleep()
+
+        // Verify smartspace views receive screen on
+        verify(mockSmartspaceView).setScreenOn(false)
+    }
+
     private fun connectSession() {
         val dateView = controller.buildAndConnectDateView(fakeParent)
         dateSmartspaceView = dateView as SmartspaceView
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorControllerTest.kt
index 6f16d65..811e9bf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationTransitionAnimatorControllerTest.kt
@@ -5,9 +5,10 @@
 import android.testing.TestableLooper
 import android.testing.TestableLooper.RunWithLooper
 import androidx.test.filters.SmallTest
-import com.android.internal.jank.InteractionJankMonitor
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.jank.interactionJankMonitor
+import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.res.R
 import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
@@ -39,7 +40,6 @@
 class NotificationTransitionAnimatorControllerTest : SysuiTestCase() {
     @Mock lateinit var notificationListContainer: NotificationListContainer
     @Mock lateinit var headsUpManager: HeadsUpManager
-    @Mock lateinit var jankMonitor: InteractionJankMonitor
     @Mock lateinit var onFinishAnimationCallback: Runnable
 
     private lateinit var notificationTestHelper: NotificationTestHelper
@@ -67,7 +67,7 @@
                 notificationListContainer,
                 headsUpManager,
                 notification,
-                jankMonitor,
+                Kosmos().interactionJankMonitor,
                 onFinishAnimationCallback
             )
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorTest.kt
index 82093ad..67b540c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorTest.kt
@@ -19,10 +19,15 @@
 import android.testing.AndroidTestingRunner
 import android.testing.TestableLooper
 import androidx.test.filters.SmallTest
+import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.animation.AnimatorTestRule
+import com.android.systemui.communal.data.repository.communalRepository
+import com.android.systemui.communal.domain.interactor.communalInteractor
+import com.android.systemui.communal.shared.model.CommunalScenes
 import com.android.systemui.dump.DumpManager
-import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.kosmos.testScope
 import com.android.systemui.log.logcatLogBuffer
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.shade.ShadeViewController.Companion.WAKEUP_ANIMATION_DELAY_MS
@@ -34,11 +39,16 @@
 import com.android.systemui.statusbar.phone.KeyguardBypassController
 import com.android.systemui.statusbar.phone.ScreenOffAnimationController
 import com.android.systemui.statusbar.policy.HeadsUpManager
+import com.android.systemui.testKosmos
 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.mockito.withArgCaptor
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -49,6 +59,7 @@
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.verifyNoMoreInteractions
 
+@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(AndroidTestingRunner::class)
 @SmallTest
 @TestableLooper.RunWithLooper(setAsMainLooper = true)
@@ -56,7 +67,8 @@
 
     @get:Rule val animatorTestRule = AnimatorTestRule(this)
 
-    private val kosmos = Kosmos()
+    private val kosmos = testKosmos()
+    private val testScope = kosmos.testScope
 
     private val dumpManager: DumpManager = mock()
     private val headsUpManager: HeadsUpManager = mock()
@@ -97,6 +109,7 @@
         whenever(statusBarStateController.state).then { statusBarState }
         notificationWakeUpCoordinator =
             NotificationWakeUpCoordinator(
+                kosmos.applicationCoroutineScope,
                 dumpManager,
                 headsUpManager,
                 statusBarStateController,
@@ -105,6 +118,7 @@
                 screenOffAnimationController,
                 logger,
                 kosmos.notificationsKeyguardInteractor,
+                kosmos.communalInteractor,
             )
         statusBarStateCallback = withArgCaptor {
             verify(statusBarStateController).addCallback(capture())
@@ -161,6 +175,39 @@
     }
 
     @Test
+    fun setDozeToZeroWhenCommunalShowingWillFullyHideNotifications() =
+        testScope.runTest {
+            val transitionState =
+                MutableStateFlow<ObservableTransitionState>(
+                    ObservableTransitionState.Idle(CommunalScenes.Communal)
+                )
+            kosmos.communalRepository.setTransitionState(transitionState)
+            runCurrent()
+            setDozeAmount(0f)
+            verifyStackScrollerDozeAndHideAmount(dozeAmount = 1f, hideAmount = 1f)
+            assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isTrue()
+        }
+
+    @Test
+    fun closingCommunalWillShowNotifications() =
+        testScope.runTest {
+            val transitionState =
+                MutableStateFlow<ObservableTransitionState>(
+                    ObservableTransitionState.Idle(CommunalScenes.Communal)
+                )
+            kosmos.communalRepository.setTransitionState(transitionState)
+            runCurrent()
+            setDozeAmount(0f)
+            verifyStackScrollerDozeAndHideAmount(dozeAmount = 1f, hideAmount = 1f)
+            assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isTrue()
+
+            transitionState.value = ObservableTransitionState.Idle(CommunalScenes.Blank)
+            runCurrent()
+            verifyStackScrollerDozeAndHideAmount(dozeAmount = 0f, hideAmount = 0f)
+            assertThat(notificationWakeUpCoordinator.notificationsFullyHidden).isFalse()
+        }
+
+    @Test
     fun switchingToShadeWithBypassEnabledWillShowNotifications() {
         setDozeToZeroWithBypassWillFullyHideNotifications()
         clearInvocations(stackScrollerController)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/SectionStyleProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/SectionStyleProviderTest.kt
new file mode 100644
index 0000000..ab55a7d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/SectionStyleProviderTest.kt
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.Flags
+import android.os.UserHandle
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import android.service.notification.StatusBarNotification
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection
+import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
+import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider
+import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
+import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING
+import com.android.systemui.statusbar.notification.stack.BUCKET_FOREGROUND_SERVICE
+import com.android.systemui.statusbar.notification.stack.BUCKET_PEOPLE
+import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT
+import com.android.systemui.statusbar.notification.stack.BUCKET_UNKNOWN
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
+import com.google.common.collect.ImmutableList
+import com.google.common.truth.Truth.assertThat
+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.verify
+import org.mockito.MockitoAnnotations
+import org.mockito.Mockito.`when` as whenever
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class SectionStyleProviderTest : SysuiTestCase() {
+
+    @Rule @JvmField public val setFlagsRule = SetFlagsRule()
+
+    @Mock private lateinit var highPriorityProvider: HighPriorityProvider
+
+    @Mock private lateinit var peopleMixedSectioner : NotifSectioner
+    @Mock private lateinit var allSilentSectioner : NotifSectioner
+    @Mock private lateinit var allAlertingSectioner : NotifSectioner
+
+    private lateinit var sectionStyleProvider: SectionStyleProvider
+
+    @Before
+    fun setUp() {
+        MockitoAnnotations.initMocks(this)
+        sectionStyleProvider = SectionStyleProvider(highPriorityProvider)
+
+        whenever(peopleMixedSectioner.bucket).thenReturn(BUCKET_PEOPLE);
+        whenever(allSilentSectioner.bucket).thenReturn(BUCKET_SILENT);
+        whenever(allAlertingSectioner.bucket).thenReturn(BUCKET_ALERTING);
+
+        sectionStyleProvider.setSilentSections(ImmutableList.of(allSilentSectioner))
+    }
+
+    @Test
+    fun testIsSilent_silentSection() {
+        assertThat(sectionStyleProvider.isSilent(fakeNotification(allSilentSectioner))).isTrue()
+    }
+
+    @Test
+    fun testIsSilent_alertingSection() {
+        val listEntry = fakeNotification(allAlertingSectioner)
+        // this line should not matter for any non-people sections
+        whenever(highPriorityProvider.isHighPriorityConversation(listEntry)).thenReturn(true)
+
+        assertThat(sectionStyleProvider.isSilent(fakeNotification(allAlertingSectioner))).isFalse()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
+    fun testIsSilent_silentPeople() {
+        val listEntry = fakeNotification(peopleMixedSectioner)
+        whenever(highPriorityProvider.isHighPriorityConversation(listEntry)).thenReturn(false)
+        assertThat(sectionStyleProvider.isSilent(listEntry)).isTrue()
+    }
+
+    @Test
+    fun testIsSilent_alertingPeople() {
+        val listEntry = fakeNotification(peopleMixedSectioner)
+        whenever(highPriorityProvider.isHighPriorityConversation(listEntry)).thenReturn(true)
+
+        assertThat(sectionStyleProvider.isSilent(listEntry)).isFalse()
+    }
+
+    private fun fakeNotification(inputSectioner: NotifSectioner): ListEntry {
+        val mockUserHandle =
+                mock<UserHandle>().apply { whenever(identifier).thenReturn(0) }
+        val mockSbn: StatusBarNotification =
+                mock<StatusBarNotification>().apply { whenever(user).thenReturn(mockUserHandle) }
+        val mockRow: ExpandableNotificationRow = mock<ExpandableNotificationRow>()
+        val mockEntry = mock<NotificationEntry>().apply {
+            whenever(sbn).thenReturn(mockSbn)
+            whenever(row).thenReturn(mockRow)
+        }
+        whenever(mockEntry.rowExists()).thenReturn(true)
+        return object : ListEntry("key", 0) {
+            override fun getRepresentativeEntry(): NotificationEntry = mockEntry
+            override fun getSection(): NotifSection? = NotifSection(inputSectioner, 1)
+        }
+    }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinatorTest.kt
index 36f643a..c5d7e1f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinatorTest.kt
@@ -16,10 +16,14 @@
 
 package com.android.systemui.statusbar.notification.collection.coordinator
 
+import android.app.Flags
 import android.app.NotificationChannel
 import android.app.NotificationManager.IMPORTANCE_DEFAULT
 import android.app.NotificationManager.IMPORTANCE_HIGH
 import android.app.NotificationManager.IMPORTANCE_LOW
+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.TestableLooper
 import androidx.test.filters.SmallTest
@@ -29,6 +33,7 @@
 import com.android.systemui.statusbar.notification.collection.NotifPipeline
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
+import com.android.systemui.statusbar.notification.collection.SortBySectionTimeFlag
 import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection
 import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifComparator
@@ -48,12 +53,13 @@
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
 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.verify
-import org.mockito.Mockito.`when` as whenever
 import org.mockito.MockitoAnnotations
+import org.mockito.Mockito.`when` as whenever
 
 @SmallTest
 @RunWith(AndroidTestingRunner::class)
@@ -77,6 +83,8 @@
 
     private lateinit var coordinator: ConversationCoordinator
 
+    @Rule @JvmField public val setFlagsRule = SetFlagsRule()
+
     @Before
     fun setUp() {
         MockitoAnnotations.initMocks(this)
@@ -99,7 +107,8 @@
 
         peopleAlertingSectioner = coordinator.peopleAlertingSectioner
         peopleSilentSectioner = coordinator.peopleSilentSectioner
-        peopleComparator = peopleAlertingSectioner.comparator!!
+        if (!SortBySectionTimeFlag.isEnabled)
+            peopleComparator = peopleAlertingSectioner.comparator!!
 
         entry = NotificationEntryBuilder().setChannel(channel).build()
 
@@ -150,6 +159,20 @@
     }
 
     @Test
+    @EnableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
+    fun testInAlertingPeopleSectionWhenTheImportanceIsLowerThanDefault() {
+        // GIVEN
+        val silentEntry =
+                NotificationEntryBuilder().setChannel(channel).setImportance(IMPORTANCE_LOW).build()
+        whenever(peopleNotificationIdentifier.getPeopleNotificationType(silentEntry))
+                .thenReturn(TYPE_PERSON)
+
+        // THEN put silent people notifications in alerting section
+        assertThat(peopleAlertingSectioner.isInSection(silentEntry)).isTrue()
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
     fun testInSilentPeopleSectionWhenTheImportanceIsLowerThanDefault() {
         // GIVEN
         val silentEntry =
@@ -178,7 +201,8 @@
             .thenReturn(TYPE_NON_PERSON)
 
         // THEN - only put people notification either silent or alerting
-        assertThat(peopleSilentSectioner.isInSection(entry)).isFalse()
+        if (!SortBySectionTimeFlag.isEnabled)
+            assertThat(peopleSilentSectioner.isInSection(entry)).isFalse()
         assertThat(peopleAlertingSectioner.isInSection(importantEntry)).isFalse()
     }
 
@@ -207,6 +231,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
     fun testComparatorPutsImportantPeopleFirst() {
         whenever(peopleNotificationIdentifier.getPeopleNotificationType(entryA))
             .thenReturn(TYPE_IMPORTANT_PERSON)
@@ -218,6 +243,7 @@
     }
 
     @Test
+    @DisableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
     fun testComparatorEquatesPeopleWithSameType() {
         whenever(peopleNotificationIdentifier.getPeopleNotificationType(entryA))
             .thenReturn(TYPE_PERSON)
@@ -227,4 +253,10 @@
         // only put people notifications in this section
         assertThat(peopleComparator.compare(entryA, entryB)).isEqualTo(0)
     }
+
+    @Test
+    @EnableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
+    fun testNoSecondarySortForConversations() {
+        assertThat(peopleAlertingSectioner.comparator).isNull()
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
index 118d27a..cceaaea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
@@ -64,6 +64,7 @@
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter;
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner;
 import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
+import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
 import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider;
 import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
 import com.android.systemui.statusbar.notification.collection.render.NotifViewBarn;
@@ -112,7 +113,9 @@
     @Mock private Handler mHandler;
     @Mock private SecureSettings mSecureSettings;
     @Spy private FakeNotifInflater mNotifInflater = new FakeNotifInflater();
-    private final SectionStyleProvider mSectionStyleProvider = new SectionStyleProvider();
+    @Mock
+    HighPriorityProvider mHighPriorityProvider;
+    private SectionStyleProvider mSectionStyleProvider;
     @Mock private UserTracker mUserTracker;
     @Mock private GroupMembershipManager mGroupMembershipManager;
 
@@ -126,6 +129,7 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        mSectionStyleProvider = new SectionStyleProvider(mHighPriorityProvider);
         mAdjustmentProvider = new NotifUiAdjustmentProvider(
                 mHandler,
                 mSecureSettings,
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 85b8b03..d3df48e9 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
@@ -98,6 +98,7 @@
         `when`(rebuilder.rebuildForCanceledSmartReplies(any())).thenReturn(sbn)
         `when`(rebuilder.rebuildForRemoteInputReply(any())).thenReturn(sbn)
         `when`(rebuilder.rebuildForSendingSmartReply(any(), any())).thenReturn(sbn)
+        `when`(rebuilder.rebuildWithExistingReplies(any())).thenReturn(sbn)
     }
 
     val remoteInputActiveExtender get() = coordinator.mRemoteInputActiveExtender
@@ -208,13 +209,30 @@
             it.onEntryUpdated(entry, true)
         }
 
-
         verify(rebuilder, times(1)).rebuildForCanceledSmartReplies(entry)
         verify(smartReplyController, times(1)).stopSending(entry)
     }
 
     @Test
     @EnableFlags(FLAG_LIFETIME_EXTENSION_REFACTOR)
+    fun testRepeatedUpdateTriggersRebuild() {
+        // Create notification with LIFETIME_EXTENDED_BY_DIRECT_REPLY flag.
+        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)
+        }
+
+        verify(rebuilder, times(1)).rebuildWithExistingReplies(entry)
+    }
+
+    @Test
+    @EnableFlags(FLAG_LIFETIME_EXTENSION_REFACTOR)
     fun testLifetimeExtensionListenerClearsRemoteInputs() {
         // Create notification with LIFETIME_EXTENDED_BY_DIRECT_REPLY flag.
         val entry = NotificationEntryBuilder()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt
index 018a571..b161f84 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinatorTest.kt
@@ -16,7 +16,11 @@
 
 package com.android.systemui.statusbar.notification.collection.coordinator
 
+import android.app.Notification
+import android.app.NotificationChannel
+import android.app.NotificationManager
 import android.os.UserHandle
+import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
 import android.service.notification.StatusBarNotification
 import androidx.test.filters.SmallTest
@@ -25,14 +29,17 @@
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.plugins.statusbar.StatusBarStateController
 import com.android.systemui.statusbar.NotificationLockscreenUserManager
+import com.android.systemui.statusbar.RankingBuilder
 import com.android.systemui.statusbar.StatusBarState
 import com.android.systemui.statusbar.notification.DynamicPrivacyController
 import com.android.systemui.statusbar.notification.collection.ListEntry
 import com.android.systemui.statusbar.notification.collection.NotifPipeline
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
 import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
 import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Invalidator
+import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter
 import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
 import com.android.systemui.statusbar.policy.KeyguardStateController
@@ -44,6 +51,8 @@
 import com.android.systemui.util.mockito.withArgCaptor
 import dagger.BindsInstance
 import dagger.Component
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
 import org.junit.Test
 import org.mockito.Mockito.never
 import org.mockito.Mockito.verify
@@ -114,6 +123,49 @@
     }
 
     @Test
+    @DisableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING)
+    fun screenshareSecretFilter_flagDisabled_filterNoAdded() {
+        coordinator.attach(pipeline)
+
+        verify(pipeline, never()).addFinalizeFilter(any(NotifFilter::class.java))
+    }
+
+    @Test
+    @EnableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING)
+    fun screenshareSecretFilter_sensitiveInctive_noFiltersSecret() {
+        whenever(sensitiveNotificationProtectionController.isSensitiveStateActive)
+            .thenReturn(false)
+
+        coordinator.attach(pipeline)
+        val filter = withArgCaptor<NotifFilter> { verify(pipeline).addFinalizeFilter(capture()) }
+
+        val defaultNotification = createNotificationEntry("test", false, false)
+        val notificationWithSecretVisibility = createNotificationEntry("test", true, false)
+        val notificationOnSecretChannel = createNotificationEntry("test", false, true)
+
+        assertFalse(filter.shouldFilterOut(defaultNotification, 0))
+        assertFalse(filter.shouldFilterOut(notificationWithSecretVisibility, 0))
+        assertFalse(filter.shouldFilterOut(notificationOnSecretChannel, 0))
+    }
+
+    @Test
+    @EnableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING)
+    fun screenshareSecretFilter_sensitiveActive_filtersSecret() {
+        whenever(sensitiveNotificationProtectionController.isSensitiveStateActive).thenReturn(true)
+
+        coordinator.attach(pipeline)
+        val filter = withArgCaptor<NotifFilter> { verify(pipeline).addFinalizeFilter(capture()) }
+
+        val defaultNotification = createNotificationEntry("test", false, false)
+        val notificationWithSecretVisibility = createNotificationEntry("test", true, false)
+        val notificationOnSecretChannel = createNotificationEntry("test", false, true)
+
+        assertFalse(filter.shouldFilterOut(defaultNotification, 0))
+        assertTrue(filter.shouldFilterOut(notificationWithSecretVisibility, 0))
+        assertTrue(filter.shouldFilterOut(notificationOnSecretChannel, 0))
+    }
+
+    @Test
     fun onBeforeRenderList_deviceUnlocked_notifDoesNotNeedRedaction() {
         coordinator.attach(pipeline)
         val onBeforeRenderListListener =
@@ -638,6 +690,32 @@
             override fun getRepresentativeEntry(): NotificationEntry = mockEntry
         }
     }
+
+    private fun createNotificationEntry(
+        packageName: String,
+        secretVisibility: Boolean = false,
+        secretChannelVisibility: Boolean = false,
+    ): NotificationEntry {
+        val notification = Notification()
+        if (secretVisibility) {
+            // Developer has marked notification as public
+            notification.visibility = Notification.VISIBILITY_SECRET
+        }
+        val notificationEntry =
+            NotificationEntryBuilder().setNotification(notification).setPkg(packageName).build()
+        val channel = NotificationChannel("1", "1", NotificationManager.IMPORTANCE_HIGH)
+        if (secretChannelVisibility) {
+            // User doesn't allow notifications at the channel level
+            channel.lockscreenVisibility = Notification.VISIBILITY_SECRET
+        }
+        notificationEntry.setRanking(
+            RankingBuilder(notificationEntry.ranking)
+                .setChannel(channel)
+                .setVisibilityOverride(NotificationManager.VISIBILITY_NO_OVERRIDE)
+                .build()
+        )
+        return notificationEntry
+    }
 }
 
 @CoordinatorScope
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 b4dadaf..ea4f692 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
@@ -20,6 +20,8 @@
 import android.testing.AndroidTestingRunner
 import android.testing.TestableLooper.RunWithLooper
 import androidx.test.filters.SmallTest
+import com.android.server.notification.Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING
+import com.android.systemui.Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.statusbar.notification.collection.NotifPipeline
 import com.android.systemui.statusbar.notification.collection.NotificationEntry
@@ -36,6 +38,7 @@
 import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING
 import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT
 import com.android.systemui.statusbar.phone.NotificationIconAreaController
+import com.android.systemui.statusbar.policy.SensitiveNotificationProtectionController
 import com.android.systemui.util.mockito.eq
 import com.android.systemui.util.mockito.withArgCaptor
 import org.junit.Before
@@ -43,6 +46,7 @@
 import org.junit.runner.RunWith
 import org.mockito.Mock
 import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyZeroInteractions
 import org.mockito.MockitoAnnotations.initMocks
 import org.mockito.Mockito.`when` as whenever
 
@@ -60,12 +64,18 @@
     @Mock private lateinit var notificationIconAreaController: NotificationIconAreaController
     @Mock private lateinit var renderListInteractor: RenderNotificationListInteractor
     @Mock private lateinit var activeNotificationsInteractor: ActiveNotificationsInteractor
+    @Mock private lateinit var sensitiveNotificationProtectionController:
+        SensitiveNotificationProtectionController
     @Mock private lateinit var stackController: NotifStackController
     @Mock private lateinit var section: NotifSection
 
     @Before
     fun setUp() {
         initMocks(this)
+
+        whenever(sensitiveNotificationProtectionController.isSensitiveStateActive)
+            .thenReturn(false)
+
         entry = NotificationEntryBuilder().setSection(section).build()
         coordinator =
             StackCoordinator(
@@ -73,6 +83,7 @@
                 notificationIconAreaController,
                 renderListInteractor,
                 activeNotificationsInteractor,
+                sensitiveNotificationProtectionController,
             )
         coordinator.attach(pipeline)
         afterRenderListListener = withArgCaptor {
@@ -107,6 +118,18 @@
         whenever(section.bucket).thenReturn(BUCKET_ALERTING)
         afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
         verify(stackController).setNotifStats(NotifStats(1, false, true, false, false))
+        verifyZeroInteractions(activeNotificationsInteractor)
+    }
+
+    @Test
+    @DisableFlags(FooterViewRefactor.FLAG_NAME)
+    @EnableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING, FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX)
+    fun testSetNotificationStats_isSensitiveStateActive_nonClearableAlerting() {
+        whenever(sensitiveNotificationProtectionController.isSensitiveStateActive).thenReturn(true)
+        whenever(section.bucket).thenReturn(BUCKET_ALERTING)
+        afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+        verify(stackController).setNotifStats(NotifStats(1, true, false, false, false))
+        verifyZeroInteractions(activeNotificationsInteractor)
     }
 
     @Test
@@ -115,5 +138,67 @@
         whenever(section.bucket).thenReturn(BUCKET_SILENT)
         afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
         verify(stackController).setNotifStats(NotifStats(1, false, false, false, true))
+        verifyZeroInteractions(activeNotificationsInteractor)
+    }
+
+    @Test
+    @DisableFlags(FooterViewRefactor.FLAG_NAME)
+    @EnableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING, FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX)
+    fun testSetNotificationStats_isSensitiveStateActive_nonClearableSilent() {
+        whenever(sensitiveNotificationProtectionController.isSensitiveStateActive).thenReturn(true)
+        whenever(section.bucket).thenReturn(BUCKET_SILENT)
+        afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+        verify(stackController).setNotifStats(NotifStats(1, false, false, true, false))
+        verifyZeroInteractions(activeNotificationsInteractor)
+    }
+
+    @Test
+    @EnableFlags(FooterViewRefactor.FLAG_NAME)
+    fun testSetNotificationStats_footerFlagOn_clearableAlerting() {
+        whenever(section.bucket).thenReturn(BUCKET_ALERTING)
+        afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+        verify(activeNotificationsInteractor)
+            .setNotifStats(NotifStats(1, false, true, false, false))
+        verifyZeroInteractions(stackController)
+    }
+
+    @Test
+    @EnableFlags(
+        FooterViewRefactor.FLAG_NAME,
+        FLAG_SCREENSHARE_NOTIFICATION_HIDING,
+        FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX
+    )
+    fun testSetNotificationStats_footerFlagOn_isSensitiveStateActive_nonClearableAlerting() {
+        whenever(sensitiveNotificationProtectionController.isSensitiveStateActive).thenReturn(true)
+        whenever(section.bucket).thenReturn(BUCKET_ALERTING)
+        afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+        verify(activeNotificationsInteractor)
+            .setNotifStats(NotifStats(1, true, false, false, false))
+        verifyZeroInteractions(stackController)
+    }
+
+    @Test
+    @EnableFlags(FooterViewRefactor.FLAG_NAME)
+    fun testSetNotificationStats_footerFlagOn_clearableSilent() {
+        whenever(section.bucket).thenReturn(BUCKET_SILENT)
+        afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+        verify(activeNotificationsInteractor)
+            .setNotifStats(NotifStats(1, false, false, false, true))
+        verifyZeroInteractions(stackController)
+    }
+
+    @Test
+    @EnableFlags(
+        FooterViewRefactor.FLAG_NAME,
+        FLAG_SCREENSHARE_NOTIFICATION_HIDING,
+        FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX
+    )
+    fun testSetNotificationStats_footerFlagOn_isSensitiveStateActive_nonClearableSilent() {
+        whenever(sensitiveNotificationProtectionController.isSensitiveStateActive).thenReturn(true)
+        whenever(section.bucket).thenReturn(BUCKET_SILENT)
+        afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+        verify(activeNotificationsInteractor)
+            .setNotifStats(NotifStats(1, false, false, true, false))
+        verifyZeroInteractions(stackController)
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
index ea5a6e7..6f0a19d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
@@ -29,15 +29,19 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow;
+
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 
 import androidx.test.filters.SmallTest;
 
-import com.android.keyguard.TestScopeProvider;
+import com.android.compose.animation.scene.ObservableTransitionState;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.communal.shared.model.CommunalScenes;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.kosmos.KosmosJavaAdapter;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.shade.data.repository.FakeShadeRepository;
 import com.android.systemui.shade.data.repository.ShadeAnimationRepository;
@@ -67,6 +71,7 @@
 import org.mockito.MockitoAnnotations;
 import org.mockito.verification.VerificationMode;
 
+import kotlinx.coroutines.flow.MutableStateFlow;
 import kotlinx.coroutines.test.TestScope;
 
 @SmallTest
@@ -89,9 +94,10 @@
     @Captor private ArgumentCaptor<StatusBarStateController.StateListener> mSBStateListenerCaptor;
     @Captor private ArgumentCaptor<NotifStabilityManager> mNotifStabilityManagerCaptor;
 
+    private final KosmosJavaAdapter mKosmos = new KosmosJavaAdapter(this);
     private FakeSystemClock mFakeSystemClock = new FakeSystemClock();
     private FakeExecutor mFakeExecutor = new FakeExecutor(mFakeSystemClock);
-    private final TestScope mTestScope = TestScopeProvider.getTestScope();
+    private final TestScope mTestScope = mKosmos.getTestScope();
     private final JavaAdapter mJavaAdapter = new JavaAdapter(mTestScope.getBackgroundScope());
 
     private ShadeAnimationInteractor mShadeAnimationInteractor;
@@ -118,8 +124,10 @@
                 mStatusBarStateController,
                 mVisibilityLocationProvider,
                 mVisualStabilityProvider,
-                mWakefulnessLifecycle);
+                mWakefulnessLifecycle,
+                mKosmos.getCommunalInteractor());
         mCoordinator.attach(mNotifPipeline);
+        mTestScope.getTestScheduler().runCurrent();
 
         // capture arguments:
         verify(mWakefulnessLifecycle).addObserver(mWakefulnessObserverCaptor.capture());
@@ -496,6 +504,7 @@
         setFullyDozed(false);
         setSleepy(false);
         setPanelExpanded(true);
+        setCommunalShowing(false);
 
         assertFalse(mNotifStabilityManager.isEntryReorderingAllowed(mEntry));
         // The pipeline still has to report back that entry reordering was suppressed
@@ -509,6 +518,19 @@
     }
 
     @Test
+    public void testCommunalShowingWillNotSuppressReordering() {
+        // GIVEN panel is expanded and communal is showing
+        setPulsing(false);
+        setFullyDozed(false);
+        setSleepy(false);
+        setPanelExpanded(true);
+        setCommunalShowing(true);
+
+        // Reordering should be allowed
+        assertTrue(mNotifStabilityManager.isEntryReorderingAllowed(mEntry));
+    }
+
+    @Test
     public void testQueryingEntryReorderingButNotReportingReorderSuppressedDoesNotInvalidate() {
         // GIVEN visual stability is being maintained b/c panel is expanded
         setPulsing(false);
@@ -561,6 +583,16 @@
         mTestScope.getTestScheduler().runCurrent();
     }
 
+    private void setCommunalShowing(boolean isShowing) {
+        final MutableStateFlow<ObservableTransitionState> showingFlow =
+                MutableStateFlow(
+                        new ObservableTransitionState.Idle(
+                                isShowing ? CommunalScenes.Communal : CommunalScenes.Blank)
+                );
+        mKosmos.getCommunalRepository().setTransitionState(showingFlow);
+        mTestScope.getTestScheduler().runCurrent();
+    }
+
     private void setPulsing(boolean pulsing) {
         mStatusBarStateListener.onPulsingChanged(pulsing);
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt
index 34eeba0..8e6cecc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/inflation/NotifUiAdjustmentProviderTest.kt
@@ -49,7 +49,6 @@
 import org.junit.runner.RunWith
 import org.mockito.Mockito.clearInvocations
 import org.mockito.Mockito.inOrder
-import org.mockito.Mockito.spy
 import org.mockito.Mockito.verify
 import org.mockito.Mockito.verifyNoMoreInteractions
 import org.mockito.Mockito.`when` as whenever
@@ -158,17 +157,14 @@
 
     @Test
     @EnableFlags(AsyncHybridViewInflation.FLAG_NAME)
-    fun changeIsChildInGroup_asyncHybirdFlagEnabled_needReInflation() {
+    fun becomeChildInGroup_asyncHybirdFlagEnabled_needReInflation() {
         // Given: an Entry that is not child in group
         // AsyncHybridViewInflation flag is enabled
-        val spySbn = spy(entry.sbn)
-        entry.sbn = spySbn
-        whenever(spySbn.isAppOrSystemGroupChild).thenReturn(false)
         val oldAdjustment = adjustmentProvider.calculateAdjustment(entry)
         assertThat(oldAdjustment.isChildInGroup).isFalse()
 
         // When: the Entry becomes a group child
-        whenever(spySbn.isAppOrSystemGroupChild).thenReturn(true)
+        entry.markAsGroupChild()
         val newAdjustment = adjustmentProvider.calculateAdjustment(entry)
         assertThat(newAdjustment.isChildInGroup).isTrue()
         assertThat(newAdjustment).isNotEqualTo(oldAdjustment)
@@ -179,17 +175,14 @@
 
     @Test
     @DisableFlags(AsyncHybridViewInflation.FLAG_NAME)
-    fun changeIsChildInGroup_asyncHybirdFlagDisabled_noNeedForReInflation() {
+    fun becomeChildInGroup_asyncHybirdFlagDisabled_noNeedForReInflation() {
         // Given: an Entry that is not child in group
         // AsyncHybridViewInflation flag is disabled
-        val spySbn = spy(entry.sbn)
-        entry.sbn = spySbn
-        whenever(spySbn.isAppOrSystemGroupChild).thenReturn(false)
         val oldAdjustment = adjustmentProvider.calculateAdjustment(entry)
         assertThat(oldAdjustment.isChildInGroup).isFalse()
 
         // When: the Entry becomes a group child
-        whenever(spySbn.isAppOrSystemGroupChild).thenReturn(true)
+        entry.markAsGroupChild()
         val newAdjustment = adjustmentProvider.calculateAdjustment(entry)
         assertThat(newAdjustment.isChildInGroup).isTrue()
         assertThat(newAdjustment).isNotEqualTo(oldAdjustment)
@@ -202,14 +195,11 @@
     @EnableFlags(AsyncGroupHeaderViewInflation.FLAG_NAME)
     fun changeIsGroupSummary_needReInflation() {
         // Given: an Entry that is not a group summary
-        val spySbn = spy(entry.sbn)
-        entry.sbn = spySbn
-        whenever(spySbn.isAppOrSystemGroupSummary).thenReturn(false)
         val oldAdjustment = adjustmentProvider.calculateAdjustment(entry)
         assertThat(oldAdjustment.isGroupSummary).isFalse()
 
         // When: the Entry becomes a group summary
-        whenever(spySbn.isAppOrSystemGroupSummary).thenReturn(true)
+        entry.markAsGroupSummary()
         val newAdjustment = adjustmentProvider.calculateAdjustment(entry)
         assertThat(newAdjustment.isGroupSummary).isTrue()
         assertThat(newAdjustment).isNotEqualTo(oldAdjustment)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java
index cac4a8d..6bda4d4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java
@@ -299,8 +299,6 @@
     @Test
     public void testSetFooterLabelVisible() {
         mView.setFooterLabelVisible(true);
-        assertThat(mView.findViewById(R.id.manage_text).getVisibility()).isEqualTo(View.GONE);
-        assertThat(mView.findSecondaryView().getVisibility()).isEqualTo(View.GONE);
         assertThat(mView.findViewById(R.id.unlock_prompt_footer).getVisibility())
                 .isEqualTo(View.VISIBLE);
     }
@@ -308,8 +306,6 @@
     @Test
     public void testSetFooterLabelInvisible() {
         mView.setFooterLabelVisible(false);
-        assertThat(mView.findViewById(R.id.manage_text).getVisibility()).isEqualTo(View.VISIBLE);
-        assertThat(mView.findSecondaryView().getVisibility()).isEqualTo(View.VISIBLE);
         assertThat(mView.findViewById(R.id.unlock_prompt_footer).getVisibility())
                 .isEqualTo(View.GONE);
     }
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 620d972..158f38d 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
@@ -66,7 +66,7 @@
     val underTest = kosmos.footerViewModel
 
     @Test
-    fun testMessageVisible_whenFilteredNotifications() =
+    fun messageVisible_whenFilteredNotifications() =
         testScope.runTest {
             val visible by collectLastValue(underTest.message.isVisible)
 
@@ -76,7 +76,7 @@
         }
 
     @Test
-    fun testMessageVisible_whenNoFilteredNotifications() =
+    fun messageVisible_whenNoFilteredNotifications() =
         testScope.runTest {
             val visible by collectLastValue(underTest.message.isVisible)
 
@@ -86,7 +86,7 @@
         }
 
     @Test
-    fun testClearAllButtonVisible_whenHasClearableNotifs() =
+    fun clearAllButtonVisible_whenHasClearableNotifs() =
         testScope.runTest {
             val visible by collectLastValue(underTest.clearAllButton.isVisible)
 
@@ -104,7 +104,7 @@
         }
 
     @Test
-    fun testClearAllButtonVisible_whenHasNoClearableNotifs() =
+    fun clearAllButtonVisible_whenHasNoClearableNotifs() =
         testScope.runTest {
             val visible by collectLastValue(underTest.clearAllButton.isVisible)
 
@@ -122,7 +122,26 @@
         }
 
     @Test
-    fun testClearAllButtonAnimating_whenShadeExpandedAndTouchable() =
+    fun clearAllButtonVisible_whenMessageVisible() =
+        testScope.runTest {
+            val visible by collectLastValue(underTest.clearAllButton.isVisible)
+
+            activeNotificationListRepository.notifStats.value =
+                NotifStats(
+                    numActiveNotifs = 2,
+                    hasNonClearableAlertingNotifs = false,
+                    hasClearableAlertingNotifs = true,
+                    hasNonClearableSilentNotifs = false,
+                    hasClearableSilentNotifs = true,
+                )
+            activeNotificationListRepository.hasFilteredOutSeenNotifications.value = true
+            runCurrent()
+
+            assertThat(visible?.value).isFalse()
+        }
+
+    @Test
+    fun clearAllButtonAnimating_whenShadeExpandedAndTouchable() =
         testScope.runTest {
             val visible by collectLastValue(underTest.clearAllButton.isVisible)
             runCurrent()
@@ -156,7 +175,7 @@
         }
 
     @Test
-    fun testClearAllButtonAnimating_whenShadeNotExpanded() =
+    fun clearAllButtonAnimating_whenShadeNotExpanded() =
         testScope.runTest {
             val visible by collectLastValue(underTest.clearAllButton.isVisible)
             runCurrent()
@@ -190,7 +209,7 @@
         }
 
     @Test
-    fun testManageButton_whenHistoryDisabled() =
+    fun manageButton_whenHistoryDisabled() =
         testScope.runTest {
             val buttonLabel by collectLastValue(underTest.manageOrHistoryButton.labelId)
             runCurrent()
@@ -203,7 +222,7 @@
         }
 
     @Test
-    fun testHistoryButton_whenHistoryEnabled() =
+    fun historyButton_whenHistoryEnabled() =
         testScope.runTest {
             val buttonLabel by collectLastValue(underTest.manageOrHistoryButton.labelId)
             runCurrent()
@@ -214,4 +233,24 @@
             // THEN label is "History"
             assertThat(buttonLabel).isEqualTo(R.string.manage_notifications_history_text)
         }
+
+    @Test
+    fun manageButtonVisible_whenMessageVisible() =
+        testScope.runTest {
+            val visible by collectLastValue(underTest.manageOrHistoryButton.isVisible)
+
+            activeNotificationListRepository.hasFilteredOutSeenNotifications.value = true
+
+            assertThat(visible?.value).isFalse()
+        }
+
+    @Test
+    fun manageButtonVisible_whenMessageNotVisible() =
+        testScope.runTest {
+            val visible by collectLastValue(underTest.manageOrHistoryButton.isVisible)
+
+            activeNotificationListRepository.hasFilteredOutSeenNotifications.value = false
+
+            assertThat(visible?.value).isTrue()
+        }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorTest.kt
index 7faf562..b410b33 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/domain/interactor/NotificationIconsInteractorTest.kt
@@ -21,6 +21,7 @@
 import com.android.systemui.SysUITestModule
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.TestMocksModule
+import com.android.systemui.biometrics.domain.BiometricsDomainLayerModule
 import com.android.systemui.collectLastValue
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryRepository
@@ -155,7 +156,7 @@
 
     private val bubbles: Bubbles = mock()
 
-    @Component(modules = [SysUITestModule::class])
+    @Component(modules = [SysUITestModule::class, BiometricsDomainLayerModule::class])
     @SysUISingleton
     interface TestComponent : SysUITestComponent<AlwaysOnDisplayNotificationIconsInteractor> {
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt
index 24195fe..4eb7daa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerAlwaysOnDisplayViewModelTest.kt
@@ -109,7 +109,6 @@
         testComponent.apply {
             keyguardRepository.setKeyguardShowing(true)
             keyguardRepository.setKeyguardOccluded(false)
-            deviceProvisioningRepository.setFactoryResetProtectionActive(false)
             powerRepository.updateWakefulness(
                 rawState = WakefulnessState.AWAKE,
                 lastWakeReason = WakeSleepReason.OTHER,
@@ -120,20 +119,6 @@
     }
 
     @Test
-    fun animationsEnabled_isFalse_whenFrpIsActive() =
-        testComponent.runTest {
-            deviceProvisioningRepository.setFactoryResetProtectionActive(true)
-            keyguardTransitionRepository.sendTransitionStep(
-                TransitionStep(
-                    transitionState = TransitionState.STARTED,
-                )
-            )
-            val animationsEnabled by collectLastValue(underTest.areContainerChangesAnimated)
-            runCurrent()
-            assertThat(animationsEnabled).isFalse()
-        }
-
-    @Test
     fun animationsEnabled_isFalse_whenDeviceAsleepAndNotPulsing() =
         testComponent.runTest {
             powerRepository.updateWakefulness(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt
index c40401f..35b8493 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt
@@ -117,7 +117,6 @@
     fun setup() {
         testComponent.apply {
             keyguardRepository.setKeyguardShowing(false)
-            deviceProvisioningRepository.setFactoryResetProtectionActive(false)
             powerRepository.updateWakefulness(
                 rawState = WakefulnessState.AWAKE,
                 lastWakeReason = WakeSleepReason.OTHER,
@@ -127,20 +126,6 @@
     }
 
     @Test
-    fun animationsEnabled_isFalse_whenFrpIsActive() =
-        testComponent.runTest {
-            deviceProvisioningRepository.setFactoryResetProtectionActive(true)
-            keyguardTransitionRepository.sendTransitionStep(
-                TransitionStep(
-                    transitionState = TransitionState.STARTED,
-                )
-            )
-            val animationsEnabled by collectLastValue(underTest.animationsEnabled)
-            runCurrent()
-            assertThat(animationsEnabled).isFalse()
-        }
-
-    @Test
     fun animationsEnabled_isFalse_whenDeviceAsleepAndNotPulsing() =
         testComponent.runTest {
             powerRepository.updateWakefulness(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestBase.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestBase.kt
index 66a306e..24f6708 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestBase.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderTestBase.kt
@@ -327,6 +327,13 @@
     }
 
     @Test
+    fun testShouldNotPeek_appSuspended() {
+        ensurePeekState()
+        assertShouldNotBubble(buildPeekEntry { packageSuspended = true })
+        assertNoEventsLogged()
+    }
+
+    @Test
     fun testShouldNotPeek_hiddenOnKeyguard() {
         ensurePeekState({ keyguardShouldHideNotification = true })
         assertShouldNotHeadsUp(buildPeekEntry())
@@ -412,6 +419,13 @@
     }
 
     @Test
+    fun testShouldNotPulse_appSuspended() {
+        ensurePulseState()
+        assertShouldNotHeadsUp(buildPulseEntry { packageSuspended = true })
+        assertNoEventsLogged()
+    }
+
+    @Test
     fun testShouldNotPulse_hiddenOnKeyguard() {
         ensurePulseState({ keyguardShouldHideNotification = true })
         assertShouldNotHeadsUp(buildPulseEntry())
@@ -595,16 +609,16 @@
     }
 
     @Test
-    fun testShouldNotBubble_hiddenOnKeyguard() {
-        ensureBubbleState({ keyguardShouldHideNotification = true })
-        assertShouldNotBubble(buildBubbleEntry())
+    fun testShouldNotBubble_appSuspended() {
+        ensureBubbleState()
+        assertShouldNotBubble(buildBubbleEntry { packageSuspended = true })
         assertNoEventsLogged()
     }
 
     @Test
-    fun testShouldNotBubble_bubbleAppSuspended() {
-        ensureBubbleState()
-        assertShouldNotBubble(buildBubbleEntry { packageSuspended = true })
+    fun testShouldNotBubble_hiddenOnKeyguard() {
+        ensureBubbleState({ keyguardShouldHideNotification = true })
+        assertShouldNotBubble(buildBubbleEntry())
         assertNoEventsLogged()
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
index 69e0db9..54a6523 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
@@ -138,7 +138,7 @@
                 mHeadsUpManager,
                 mPowerInteractor,
                 mActiveNotificationsInteractor,
-                mKosmos.getFakeSceneContainerFlags(),
+                mKosmos.getSceneContainerFlags(),
                 () -> mKosmos.getSceneInteractor());
         mWindowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationMemoryLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationMemoryLoggerTest.kt
index 33a838e..4b0b4b8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationMemoryLoggerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationMemoryLoggerTest.kt
@@ -25,6 +25,7 @@
 import android.util.StatsEvent
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.log.assertLogsWtf
 import com.android.systemui.shared.system.SysUiStatsLog
 import com.android.systemui.statusbar.notification.collection.NotifPipeline
 import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
@@ -133,8 +134,10 @@
         val pipeline: NotifPipeline = mock()
         whenever(pipeline.allNotifs).thenThrow(RuntimeException("Something broke!"))
         val logger = NotificationMemoryLogger(pipeline, statsManager, immediate, bgExecutor)
-        assertThat(logger.onPullAtom(SysUiStatsLog.NOTIFICATION_MEMORY_USE, mutableListOf()))
-            .isEqualTo(StatsManager.PULL_SKIP)
+        assertLogsWtf {
+            assertThat(logger.onPullAtom(SysUiStatsLog.NOTIFICATION_MEMORY_USE, mutableListOf()))
+                .isEqualTo(StatsManager.PULL_SKIP)
+        }
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
index 0e89d80..06a4d08 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
@@ -59,7 +59,8 @@
 import com.android.internal.widget.CachingIconView;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.SysuiTestableContext;
-import com.android.systemui.flags.FakeFeatureFlags;
+import com.android.systemui.flags.FakeFeatureFlagsClassic;
+import com.android.systemui.flags.Flags;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.notification.AboveShelfChangedListener;
@@ -90,13 +91,14 @@
 @RunWithLooper
 public class ExpandableNotificationRowTest extends SysuiTestCase {
 
-    private final FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();
+    private final FakeFeatureFlagsClassic mFeatureFlags = new FakeFeatureFlagsClassic();
     private NotificationTestHelper mNotificationTestHelper;
     @Rule public MockitoRule mockito = MockitoJUnit.rule();
 
     @Before
     public void setUp() throws Exception {
         allowTestableLooperAsMainThread();
+        mFeatureFlags.set(Flags.ENABLE_NOTIFICATIONS_SIMULATE_SLOW_MEASURE, false);
         mNotificationTestHelper = new NotificationTestHelper(
                 mContext,
                 mDependency,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
index fe0d9d0..db053d8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
@@ -23,7 +23,6 @@
 import static android.app.NotificationManager.IMPORTANCE_HIGH;
 import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE;
 
-import static com.android.systemui.concurrency.FakeExecutorKosmosKt.getFakeExecutor;
 import static com.android.systemui.statusbar.NotificationEntryHelper.modifyRanking;
 
 import static junit.framework.Assert.assertNotNull;
@@ -97,7 +96,6 @@
 import com.android.systemui.statusbar.policy.HeadsUpManager;
 import com.android.systemui.util.concurrency.FakeExecutor;
 import com.android.systemui.util.kotlin.JavaAdapter;
-import com.android.systemui.util.time.FakeSystemClock;
 import com.android.systemui.wmshell.BubblesManager;
 
 import org.junit.Before;
@@ -182,7 +180,7 @@
                 mHeadsUpManager,
                 PowerInteractorFactory.create().getPowerInteractor(),
                 mActiveNotificationsInteractor,
-                mKosmos.getFakeSceneContainerFlags(),
+                mKosmos.getSceneContainerFlags(),
                 () -> mKosmos.getSceneInteractor()
         );
 
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 10d2191..912ecb3 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,6 @@
 import static org.mockito.Mockito.when;
 
 import static kotlinx.coroutines.flow.FlowKt.emptyFlow;
-import static kotlinx.coroutines.test.TestCoroutineDispatchersKt.StandardTestDispatcher;
 
 import android.metrics.LogMaker;
 import android.platform.test.annotations.DisableFlags;
@@ -69,7 +68,6 @@
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEventListener;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.power.domain.interactor.PowerInteractor;
-import com.android.systemui.scene.shared.flag.SceneContainerFlags;
 import com.android.systemui.scene.ui.view.WindowRootView;
 import com.android.systemui.shade.ShadeController;
 import com.android.systemui.statusbar.LockscreenShadeTransitionController;
@@ -89,7 +87,6 @@
 import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
 import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController;
 import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationListRepository;
-import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor;
 import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor;
 import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
 import com.android.systemui.statusbar.notification.init.NotificationsController;
@@ -97,10 +94,8 @@
 import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController.NotificationPanelEvent;
 import com.android.systemui.statusbar.notification.stack.NotificationSwipeHelper.NotificationCallback;
-import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor;
 import com.android.systemui.statusbar.notification.stack.ui.viewbinder.NotificationListViewBinder;
 import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.ScrimController;
 import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.HeadsUpManager;
@@ -155,7 +150,6 @@
     @Mock(answer = Answers.RETURNS_SELF)
     private NotificationSwipeHelper.Builder mNotificationSwipeHelperBuilder;
     @Mock private NotificationSwipeHelper mNotificationSwipeHelper;
-    @Mock private ScrimController mScrimController;
     @Mock private GroupExpansionManager mGroupExpansionManager;
     @Mock private SectionHeaderController mSilentHeaderController;
     @Mock private NotifPipeline mNotifPipeline;
@@ -165,9 +159,7 @@
     @Mock private NotificationRemoteInputManager mRemoteInputManager;
     @Mock private VisibilityLocationProviderDelegator mVisibilityLocationProviderDelegator;
     @Mock private ShadeController mShadeController;
-    @Mock private SceneContainerFlags mSceneContainerFlags;
     @Mock private Provider<WindowRootView> mWindowRootView;
-    @Mock private NotificationStackAppearanceInteractor mNotificationStackAppearanceInteractor;
     private final StackStateLogger mStackLogger = new StackStateLogger(logcatLogBuffer(),
             logcatLogBuffer());
     private final NotificationStackScrollLogger mLogger = new NotificationStackScrollLogger(
@@ -191,10 +183,6 @@
     private final ActiveNotificationListRepository mActiveNotificationsRepository =
             new ActiveNotificationListRepository();
 
-    private final ActiveNotificationsInteractor mActiveNotificationsInteractor =
-            new ActiveNotificationsInteractor(mActiveNotificationsRepository,
-                    StandardTestDispatcher(/* scheduler = */ null, /* name = */ null));
-
     private final SeenNotificationsInteractor mSeenNotificationsInteractor =
             new SeenNotificationsInteractor(mActiveNotificationsRepository);
 
@@ -1014,7 +1002,6 @@
                 new FalsingCollectorFake(),
                 new FalsingManagerFake(),
                 mNotificationSwipeHelperBuilder,
-                mScrimController,
                 mGroupExpansionManager,
                 mSilentHeaderController,
                 mNotifPipeline,
@@ -1023,13 +1010,10 @@
                 mUiEventLogger,
                 mRemoteInputManager,
                 mVisibilityLocationProviderDelegator,
-                mActiveNotificationsInteractor,
                 mSeenNotificationsInteractor,
                 mViewBinder,
                 mShadeController,
-                mSceneContainerFlags,
                 mWindowRootView,
-                mNotificationStackAppearanceInteractor,
                 mKosmos.getInteractionJankMonitor(),
                 mStackLogger,
                 mLogger,
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 13df091..abb9432 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
@@ -931,14 +931,14 @@
 
     @Test
     public void testWindowInsetAnimationProgress_updatesBottomInset() {
-        int bottomImeInset = 100;
+        int imeInset = 100;
         WindowInsets windowInsets = new WindowInsets.Builder()
-                .setInsets(ime(), Insets.of(0, 0, 0, bottomImeInset)).build();
+                .setInsets(ime(), Insets.of(0, 0, 0, imeInset)).build();
         ArrayList<WindowInsetsAnimation> windowInsetsAnimations = new ArrayList<>();
         mStackScrollerInternal
                 .dispatchWindowInsetsAnimationProgress(windowInsets, windowInsetsAnimations);
 
-        assertEquals(bottomImeInset, mStackScrollerInternal.mBottomInset);
+        assertEquals(imeInset, mStackScrollerInternal.mImeInset);
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt
index 995da81..2c2b183 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithmTest.kt
@@ -886,7 +886,7 @@
     fun shadeClosed_hunShouldHaveFullShadow() {
         // Given: shade is closed, ambientState.stackTranslation == -ambientState.topPadding,
         // the height of HUN is equal to the height of QQS Panel,
-        ambientState.stackTranslation = -ambientState.topPadding
+        ambientState.stackTranslation = (-ambientState.topPadding).toFloat()
         // Mock the height of shade
         ambientState.setLayoutMinHeight(1000)
         val childHunView =
@@ -914,7 +914,7 @@
     fun draggingHunToOpenShade_hunShouldHavePartialShadow() {
         // Given: shade is closed when HUN pops up,
         // now drags down the HUN to open shade
-        ambientState.stackTranslation = -ambientState.topPadding
+        ambientState.stackTranslation = (-ambientState.topPadding).toFloat()
         // Mock the height of shade
         ambientState.setLayoutMinHeight(1000)
         val childHunView =
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt
deleted file mode 100644
index c308a98..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt
+++ /dev/null
@@ -1,600 +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.
- */
-
-@file:OptIn(ExperimentalCoroutinesApi::class)
-
-package com.android.systemui.statusbar.notification.stack.ui.viewmodel
-
-import android.app.NotificationManager.Policy
-import android.platform.test.annotations.EnableFlags
-import android.provider.Settings
-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.flags.Flags
-import com.android.systemui.flags.fakeFeatureFlagsClassic
-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.power.data.repository.fakePowerRepository
-import com.android.systemui.power.shared.model.WakefulnessState
-import com.android.systemui.res.R
-import com.android.systemui.shade.data.repository.fakeShadeRepository
-import com.android.systemui.statusbar.data.repository.fakeRemoteInputRepository
-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.footer.shared.FooterViewRefactor
-import com.android.systemui.statusbar.notification.shared.NotificationsHeadsUpRefactor
-import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository
-import com.android.systemui.statusbar.notification.stack.data.repository.setNotifications
-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
-import com.android.systemui.util.ui.value
-import com.google.common.truth.Truth.assertThat
-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.MockitoAnnotations
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-@EnableFlags(FooterViewRefactor.FLAG_NAME)
-class NotificationListViewModelTest : SysuiTestCase() {
-    private val kosmos =
-        testKosmos().apply {
-            fakeFeatureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) }
-        }
-    private val testScope = kosmos.testScope
-
-    private val activeNotificationListRepository = kosmos.activeNotificationListRepository
-    private val fakeConfigurationController = kosmos.fakeConfigurationController
-    private val fakeKeyguardRepository = kosmos.fakeKeyguardRepository
-    private val fakePowerRepository = kosmos.fakePowerRepository
-    private val fakeRemoteInputRepository = kosmos.fakeRemoteInputRepository
-    private val fakeShadeRepository = kosmos.fakeShadeRepository
-    private val fakeUserSetupRepository = kosmos.fakeUserSetupRepository
-    private val headsUpRepository = kosmos.headsUpNotificationRepository
-    private val zenModeRepository = kosmos.zenModeRepository
-
-    val underTest = kosmos.notificationListViewModel
-
-    @Before
-    fun setUp() {
-        MockitoAnnotations.initMocks(this)
-    }
-
-    @Test
-    fun testIsImportantForAccessibility_falseWhenNoNotifs() =
-        testScope.runTest {
-            val important by collectLastValue(underTest.isImportantForAccessibility)
-
-            // WHEN on lockscreen
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
-            // AND has no notifs
-            activeNotificationListRepository.setActiveNotifs(count = 0)
-            testScope.runCurrent()
-
-            // THEN not important
-            assertThat(important).isFalse()
-        }
-
-    @Test
-    fun testIsImportantForAccessibility_trueWhenNotifs() =
-        testScope.runTest {
-            val important by collectLastValue(underTest.isImportantForAccessibility)
-
-            // WHEN on lockscreen
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
-            // AND has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            runCurrent()
-
-            // THEN is important
-            assertThat(important).isTrue()
-        }
-
-    @Test
-    fun testIsImportantForAccessibility_trueWhenNotKeyguard() =
-        testScope.runTest {
-            val important by collectLastValue(underTest.isImportantForAccessibility)
-
-            // WHEN not on lockscreen
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
-            // AND has no notifs
-            activeNotificationListRepository.setActiveNotifs(count = 0)
-            runCurrent()
-
-            // THEN is still important
-            assertThat(important).isTrue()
-        }
-
-    @Test
-    fun testShouldIncludeEmptyShadeView_trueWhenNoNotifs() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
-
-            // WHEN has no notifs
-            activeNotificationListRepository.setActiveNotifs(count = 0)
-            runCurrent()
-
-            // THEN empty shade is visible
-            assertThat(shouldInclude).isTrue()
-        }
-
-    @Test
-    fun testShouldIncludeEmptyShadeView_falseWhenNotifs() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
-
-            // WHEN has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            runCurrent()
-
-            // THEN empty shade is not visible
-            assertThat(shouldInclude).isFalse()
-        }
-
-    @Test
-    fun testShouldIncludeEmptyShadeView_falseWhenQsExpandedDefault() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
-
-            // WHEN has no notifs
-            activeNotificationListRepository.setActiveNotifs(count = 0)
-            // AND quick settings are expanded
-            fakeShadeRepository.legacyQsFullscreen.value = true
-            runCurrent()
-
-            // THEN empty shade is not visible
-            assertThat(shouldInclude).isFalse()
-        }
-
-    @Test
-    fun testShouldIncludeEmptyShadeView_trueWhenQsExpandedInSplitShade() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
-
-            // WHEN has no notifs
-            activeNotificationListRepository.setActiveNotifs(count = 0)
-            // AND quick settings are expanded
-            fakeShadeRepository.setQsExpansion(1f)
-            // AND split shade is enabled
-            overrideResource(R.bool.config_use_split_notification_shade, true)
-            fakeConfigurationController.notifyConfigurationChanged()
-            runCurrent()
-
-            // THEN empty shade is visible
-            assertThat(shouldInclude).isTrue()
-        }
-
-    @Test
-    fun testShouldIncludeEmptyShadeView_trueWhenLockedShade() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
-
-            // WHEN has no notifs
-            activeNotificationListRepository.setActiveNotifs(count = 0)
-            // AND shade is open
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE_LOCKED)
-            runCurrent()
-
-            // THEN empty shade is visible
-            assertThat(shouldInclude).isTrue()
-        }
-
-    @Test
-    fun testShouldIncludeEmptyShadeView_falseWhenKeyguard() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
-
-            // WHEN has no notifs
-            activeNotificationListRepository.setActiveNotifs(count = 0)
-            // AND shade is open
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
-            runCurrent()
-
-            // THEN empty shade is not visible
-            assertThat(shouldInclude).isFalse()
-        }
-
-    @Test
-    fun testShouldIncludeEmptyShadeView_falseWhenStartingToSleep() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldShowEmptyShadeView)
-
-            // WHEN has no notifs
-            activeNotificationListRepository.setActiveNotifs(count = 0)
-            // AND shade is open
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
-            // AND device is starting to go to sleep
-            fakePowerRepository.updateWakefulness(WakefulnessState.STARTING_TO_SLEEP)
-            runCurrent()
-
-            // THEN empty shade is not visible
-            assertThat(shouldInclude).isFalse()
-        }
-
-    @Test
-    fun testAreNotificationsHiddenInShade_true() =
-        testScope.runTest {
-            val hidden by collectLastValue(underTest.areNotificationsHiddenInShade)
-
-            zenModeRepository.setSuppressedVisualEffects(Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST)
-            zenModeRepository.zenMode.value = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
-            runCurrent()
-
-            assertThat(hidden).isTrue()
-        }
-
-    @Test
-    fun testAreNotificationsHiddenInShade_false() =
-        testScope.runTest {
-            val hidden by collectLastValue(underTest.areNotificationsHiddenInShade)
-
-            zenModeRepository.setSuppressedVisualEffects(Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST)
-            zenModeRepository.zenMode.value = Settings.Global.ZEN_MODE_OFF
-            runCurrent()
-
-            assertThat(hidden).isFalse()
-        }
-
-    @Test
-    fun testHasFilteredOutSeenNotifications_true() =
-        testScope.runTest {
-            val hasFilteredNotifs by collectLastValue(underTest.hasFilteredOutSeenNotifications)
-
-            activeNotificationListRepository.hasFilteredOutSeenNotifications.value = true
-            runCurrent()
-
-            assertThat(hasFilteredNotifs).isTrue()
-        }
-
-    @Test
-    fun testHasFilteredOutSeenNotifications_false() =
-        testScope.runTest {
-            val hasFilteredNotifs by collectLastValue(underTest.hasFilteredOutSeenNotifications)
-
-            activeNotificationListRepository.hasFilteredOutSeenNotifications.value = false
-            runCurrent()
-
-            assertThat(hasFilteredNotifs).isFalse()
-        }
-
-    @Test
-    fun testShouldIncludeFooterView_trueWhenShade() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
-
-            // WHEN has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            // AND shade is open
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
-            fakeShadeRepository.setLegacyShadeExpansion(1f)
-            runCurrent()
-
-            // THEN footer is visible
-            assertThat(shouldInclude?.value).isTrue()
-        }
-
-    @Test
-    fun testShouldIncludeFooterView_trueWhenLockedShade() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
-
-            // WHEN has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            // AND shade is open on lockscreen
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE_LOCKED)
-            fakeShadeRepository.setLegacyShadeExpansion(1f)
-            runCurrent()
-
-            // THEN footer is visible
-            assertThat(shouldInclude?.value).isTrue()
-        }
-
-    @Test
-    fun testShouldIncludeFooterView_falseWhenKeyguard() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
-
-            // WHEN has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            // AND is on keyguard
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
-            runCurrent()
-
-            // THEN footer is not visible
-            assertThat(shouldInclude?.value).isFalse()
-        }
-
-    @Test
-    fun testShouldIncludeFooterView_falseWhenUserNotSetUp() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
-
-            // WHEN has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            // AND shade is open
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
-            fakeShadeRepository.setLegacyShadeExpansion(1f)
-            // AND user is not set up
-            fakeUserSetupRepository.setUserSetUp(false)
-            runCurrent()
-
-            // THEN footer is not visible
-            assertThat(shouldInclude?.value).isFalse()
-        }
-
-    @Test
-    fun testShouldIncludeFooterView_falseWhenStartingToSleep() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
-
-            // WHEN has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            // AND shade is open
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
-            fakeShadeRepository.setLegacyShadeExpansion(1f)
-            // AND device is starting to go to sleep
-            fakePowerRepository.updateWakefulness(WakefulnessState.STARTING_TO_SLEEP)
-            runCurrent()
-
-            // THEN footer is not visible
-            assertThat(shouldInclude?.value).isFalse()
-        }
-
-    @Test
-    fun testShouldIncludeFooterView_falseWhenQsExpandedDefault() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
-
-            // WHEN has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            // AND shade is open
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
-            fakeShadeRepository.setLegacyShadeExpansion(1f)
-            // AND quick settings are expanded
-            fakeShadeRepository.setQsExpansion(1f)
-            fakeShadeRepository.legacyQsFullscreen.value = true
-            runCurrent()
-
-            // THEN footer is not visible
-            assertThat(shouldInclude?.value).isFalse()
-        }
-
-    @Test
-    fun testShouldIncludeFooterView_trueWhenQsExpandedSplitShade() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
-
-            // WHEN has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            // AND shade is open
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
-            fakeShadeRepository.setLegacyShadeExpansion(1f)
-            // AND quick settings are expanded
-            fakeShadeRepository.setQsExpansion(1f)
-            // AND split shade is enabled
-            overrideResource(R.bool.config_use_split_notification_shade, true)
-            fakeConfigurationController.notifyConfigurationChanged()
-            runCurrent()
-
-            // THEN footer is visible
-            assertThat(shouldInclude?.value).isTrue()
-        }
-
-    @Test
-    fun testShouldIncludeFooterView_falseWhenRemoteInputActive() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
-
-            // WHEN has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            // AND shade is open
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
-            fakeShadeRepository.setLegacyShadeExpansion(1f)
-            // AND remote input is active
-            fakeRemoteInputRepository.isRemoteInputActive.value = true
-            runCurrent()
-
-            // THEN footer is not visible
-            assertThat(shouldInclude?.value).isFalse()
-        }
-
-    @Test
-    fun testShouldIncludeFooterView_animatesWhenShade() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
-
-            // WHEN has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            // AND shade is open and fully expanded
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
-            fakeShadeRepository.setLegacyShadeExpansion(1f)
-            runCurrent()
-
-            // THEN footer visibility animates
-            assertThat(shouldInclude?.isAnimating).isTrue()
-        }
-
-    @Test
-    fun testShouldIncludeFooterView_notAnimatingOnKeyguard() =
-        testScope.runTest {
-            val shouldInclude by collectLastValue(underTest.shouldIncludeFooterView)
-
-            // WHEN has notifs
-            activeNotificationListRepository.setActiveNotifs(count = 2)
-            // AND we are on the keyguard
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
-            fakeShadeRepository.setLegacyShadeExpansion(1f)
-            runCurrent()
-
-            // THEN footer visibility does not animate
-            assertThat(shouldInclude?.isAnimating).isFalse()
-        }
-
-    @Test
-    fun testShouldHideFooterView_trueWhenShadeIsClosed() =
-        testScope.runTest {
-            val shouldHide by collectLastValue(underTest.shouldHideFooterView)
-
-            // WHEN shade is closed
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
-            fakeShadeRepository.setLegacyShadeExpansion(0f)
-            runCurrent()
-
-            // THEN footer is hidden
-            assertThat(shouldHide).isTrue()
-        }
-
-    @Test
-    fun testShouldHideFooterView_falseWhenShadeIsOpen() =
-        testScope.runTest {
-            val shouldHide by collectLastValue(underTest.shouldHideFooterView)
-
-            // WHEN shade is open
-            fakeKeyguardRepository.setStatusBarState(StatusBarState.SHADE)
-            fakeShadeRepository.setLegacyShadeExpansion(1f)
-            runCurrent()
-
-            // THEN footer is hidden
-            assertThat(shouldHide).isFalse()
-        }
-
-    @Test
-    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
-    fun testPinnedHeadsUpRows_filtersForPinnedItems() =
-        testScope.runTest {
-            val pinnedHeadsUpRows by collectLastValue(underTest.pinnedHeadsUpRows)
-
-            // WHEN there are no pinned rows
-            val rows =
-                arrayListOf(
-                    fakeHeadsUpRowRepository(key = "0"),
-                    fakeHeadsUpRowRepository(key = "1"),
-                    fakeHeadsUpRowRepository(key = "2"),
-                )
-            headsUpRepository.setNotifications(
-                rows,
-            )
-            runCurrent()
-
-            // THEN the list is empty
-            assertThat(pinnedHeadsUpRows).isEmpty()
-
-            // WHEN a row gets pinned
-            rows[0].isPinned.value = true
-            runCurrent()
-
-            // THEN it's added to the list
-            assertThat(pinnedHeadsUpRows).containsExactly(rows[0])
-
-            // WHEN more rows are pinned
-            rows[1].isPinned.value = true
-            runCurrent()
-
-            // THEN they are all in the list
-            assertThat(pinnedHeadsUpRows).containsExactly(rows[0], rows[1])
-
-            // WHEN a row gets unpinned
-            rows[0].isPinned.value = false
-            runCurrent()
-
-            // THEN it's removed from the list
-            assertThat(pinnedHeadsUpRows).containsExactly(rows[1])
-        }
-
-    @Test
-    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
-    fun testHasPinnedHeadsUpRows_true() =
-        testScope.runTest {
-            val hasPinnedHeadsUpRow by collectLastValue(underTest.hasPinnedHeadsUpRow)
-
-            headsUpRepository.setNotifications(
-                fakeHeadsUpRowRepository(key = "0", isPinned = true),
-                fakeHeadsUpRowRepository(key = "1")
-            )
-            runCurrent()
-
-            assertThat(hasPinnedHeadsUpRow).isTrue()
-        }
-
-    @Test
-    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
-    fun testHasPinnedHeadsUpRows_false() =
-        testScope.runTest {
-            val hasPinnedHeadsUpRow by collectLastValue(underTest.hasPinnedHeadsUpRow)
-
-            headsUpRepository.setNotifications(
-                fakeHeadsUpRowRepository(key = "0"),
-                fakeHeadsUpRowRepository(key = "1"),
-            )
-            runCurrent()
-
-            assertThat(hasPinnedHeadsUpRow).isFalse()
-        }
-
-    @Test
-    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
-    fun testTopHeadsUpRow_emptyList_null() =
-        testScope.runTest {
-            val topHeadsUpRow by collectLastValue(underTest.topHeadsUpRow)
-
-            headsUpRepository.setNotifications(emptyList())
-            runCurrent()
-
-            assertThat(topHeadsUpRow).isNull()
-        }
-
-    @Test
-    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
-    fun testHeadsUpAnimationsEnabled_true() =
-        testScope.runTest {
-            val animationsEnabled by collectLastValue(underTest.headsUpAnimationsEnabled)
-
-            fakeShadeRepository.setQsExpansion(0.0f)
-            fakeKeyguardRepository.setKeyguardShowing(false)
-            runCurrent()
-
-            assertThat(animationsEnabled).isTrue()
-        }
-
-    @Test
-    @EnableFlags(NotificationsHeadsUpRefactor.FLAG_NAME)
-    fun testHeadsUpAnimationsEnabled_keyguardShowing_false() =
-        testScope.runTest {
-            val animationsEnabled by collectLastValue(underTest.headsUpAnimationsEnabled)
-
-            fakeShadeRepository.setQsExpansion(0.0f)
-            fakeKeyguardRepository.setKeyguardShowing(true)
-            runCurrent()
-
-            assertThat(animationsEnabled).isFalse()
-        }
-
-    private fun fakeHeadsUpRowRepository(key: String, isPinned: Boolean = false) =
-        FakeHeadsUpRowRepository(key = key, elementKey = Any()).apply {
-            this.isPinned.value = isPinned
-        }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
index 6f65eb4..50f81ff 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.phone;
 
+import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_NONE;
 import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -26,6 +27,7 @@
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.anyString;
 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;
@@ -51,6 +53,10 @@
 import com.android.systemui.keyguard.KeyguardViewMediator;
 import com.android.systemui.keyguard.WakefulnessLifecycle;
 import com.android.systemui.keyguard.domain.interactor.BiometricUnlockInteractor;
+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.log.SessionTracker;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.NotificationMediaManager;
@@ -58,6 +64,7 @@
 import com.android.systemui.statusbar.VibratorHelper;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
+import com.android.systemui.util.kotlin.JavaAdapter;
 import com.android.systemui.util.time.FakeSystemClock;
 
 import org.junit.Before;
@@ -158,7 +165,9 @@
                 mSessionTracker, mLatencyTracker, mScreenOffAnimationController, mVibratorHelper,
                 mSystemClock,
                 () -> mSelectedUserInteractor,
-                mBiometricUnlockInteractor
+                mBiometricUnlockInteractor,
+                mock(JavaAdapter.class),
+                mock(KeyguardTransitionInteractor.class)
         );
         biometricUnlockController.setKeyguardViewController(mStatusBarKeyguardViewManager);
         biometricUnlockController.addListener(mBiometricUnlockEventsListener);
@@ -462,6 +471,29 @@
     }
 
     @Test
+    public void biometricUnlockStateResetOnTransitionFromGone() {
+        mBiometricUnlockController.consumeTransitionStepOnStartedKeyguardState(
+                new TransitionStep(
+                        KeyguardState.AOD,
+                        KeyguardState.GONE,
+                        .1f /* value */,
+                        TransitionState.STARTED
+                )
+        );
+        verify(mBiometricUnlockInteractor, never()).setBiometricUnlockState(anyInt());
+
+        mBiometricUnlockController.consumeTransitionStepOnStartedKeyguardState(
+                new TransitionStep(
+                        KeyguardState.GONE,
+                        KeyguardState.AOD,
+                        .1f /* value */,
+                        TransitionState.STARTED
+                )
+        );
+        verify(mBiometricUnlockInteractor).setBiometricUnlockState(eq(MODE_NONE));
+    }
+
+    @Test
     public void onFingerprintDetect_showBouncer() {
         // WHEN fingerprint detect occurs
         mBiometricUnlockController.onBiometricDetected(UserHandle.USER_CURRENT,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
index 8e8dd4d..c088609 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java
@@ -48,6 +48,7 @@
 import com.android.systemui.shade.CameraLauncher;
 import com.android.systemui.shade.QuickSettingsController;
 import com.android.systemui.shade.ShadeController;
+import com.android.systemui.shade.ShadeHeaderController;
 import com.android.systemui.shade.ShadeViewController;
 import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor;
 import com.android.systemui.statusbar.CommandQueue;
@@ -79,6 +80,7 @@
     @Mock private QuickSettingsController mQuickSettingsController;
     @Mock private ShadeViewController mShadeViewController;
     @Mock private PanelExpansionInteractor mPanelExpansionInteractor;
+    @Mock private ShadeHeaderController mShadeHeaderController;
     @Mock private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
     private final MetricsLogger mMetricsLogger = new FakeMetricsLogger();
     @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@@ -112,8 +114,8 @@
                 mScreenPinningRequest,
                 mShadeController,
                 mCommandQueue,
-                mShadeViewController,
                 mPanelExpansionInteractor,
+                mShadeHeaderController,
                 mRemoteInputQuickSettingsDisabler,
                 mMetricsLogger,
                 mKeyguardUpdateMonitor,
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 611cf91..2f153d8 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
@@ -25,6 +25,8 @@
 import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
 import static com.android.systemui.statusbar.StatusBarState.SHADE;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
@@ -70,7 +72,6 @@
 import android.util.SparseArray;
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
-import android.view.WindowManager;
 
 import androidx.test.filters.SmallTest;
 
@@ -109,7 +110,6 @@
 import com.android.systemui.keyguard.WakefulnessLifecycle;
 import com.android.systemui.keyguard.ui.viewmodel.LightRevealScrimViewModel;
 import com.android.systemui.kosmos.KosmosJavaAdapter;
-import com.android.systemui.log.LogBuffer;
 import com.android.systemui.navigationbar.NavigationBarController;
 import com.android.systemui.notetask.NoteTaskController;
 import com.android.systemui.plugins.ActivityStarter;
@@ -121,9 +121,9 @@
 import com.android.systemui.res.R;
 import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor;
 import com.android.systemui.scene.shared.flag.FakeSceneContainerFlags;
-import com.android.systemui.scene.shared.flag.SceneContainerFlags;
 import com.android.systemui.settings.UserTracker;
 import com.android.systemui.settings.brightness.BrightnessSliderController;
+import com.android.systemui.settings.brightness.domain.interactor.BrightnessMirrorShowingInteractor;
 import com.android.systemui.shade.CameraLauncher;
 import com.android.systemui.shade.NotificationPanelView;
 import com.android.systemui.shade.NotificationPanelViewController;
@@ -333,7 +333,10 @@
     private final DumpManager mDumpManager = new DumpManager();
     private final ScreenLifecycle mScreenLifecycle = new ScreenLifecycle(mDumpManager);
 
-    private final SceneContainerFlags mSceneContainerFlags = new FakeSceneContainerFlags();
+    private final FakeSceneContainerFlags mSceneContainerFlags = new FakeSceneContainerFlags();
+
+    private final BrightnessMirrorShowingInteractor mBrightnessMirrorShowingInteractor =
+            mKosmos.getBrightnessMirrorShowingInteractor();
 
     @Before
     public void setup() throws Exception {
@@ -423,7 +426,6 @@
         mShadeController = spy(new ShadeControllerImpl(
                 mCommandQueue,
                 mMainExecutor,
-                mock(LogBuffer.class),
                 mock(WindowRootViewVisibilityInteractor.class),
                 mKeyguardStateController,
                 mStatusBarStateController,
@@ -431,7 +433,7 @@
                 mStatusBarWindowController,
                 mDeviceProvisionedController,
                 mNotificationShadeWindowController,
-                mContext.getSystemService(WindowManager.class),
+                0,
                 () -> mNotificationPanelViewController,
                 () -> mAssistManager,
                 () -> mNotificationGutsManager
@@ -556,7 +558,8 @@
                 mUserTracker,
                 () -> mFingerprintManager,
                 mActivityStarter,
-                mSceneContainerFlags
+                mSceneContainerFlags,
+                mBrightnessMirrorShowingInteractor
         );
         mScreenLifecycle.addObserver(mCentralSurfaces.mScreenObserver);
         mCentralSurfaces.initShadeVisibilityListener();
@@ -1038,15 +1041,6 @@
         verify(mStatusBarStateController).setState(SHADE);
     }
 
-    @Test
-    public void frpLockedDevice_shadeDisabled() {
-        when(mDeviceProvisionedController.isFrpActive()).thenReturn(true);
-        when(mDozeServiceHost.isPulsing()).thenReturn(true);
-        mCentralSurfaces.updateNotificationPanelTouchState();
-
-        verify(mNotificationPanelViewController).setTouchAndAnimationDisabled(true);
-    }
-
     /** Regression test for b/298355063 */
     @Test
     public void fingerprintManagerNull_noNPE() {
@@ -1096,6 +1090,34 @@
         verify(mStatusBarWindowController).refreshStatusBarHeight();
     }
 
+    @Test
+    public void brightnesShowingChanged_flagEnabled_ScrimControllerNotified() {
+        mSceneContainerFlags.setEnabled(true);
+        mCentralSurfaces.registerCallbacks();
+
+        mBrightnessMirrorShowingInteractor.setMirrorShowing(true);
+        mTestScope.getTestScheduler().runCurrent();
+        verify(mScrimController).transitionTo(ScrimState.BRIGHTNESS_MIRROR);
+
+        mBrightnessMirrorShowingInteractor.setMirrorShowing(false);
+        mTestScope.getTestScheduler().runCurrent();
+        ArgumentCaptor<ScrimState> captor = ArgumentCaptor.forClass(ScrimState.class);
+        // The default is to call the one with the callback argument
+        verify(mScrimController).transitionTo(captor.capture(), any());
+        assertThat(captor.getValue()).isNotEqualTo(ScrimState.BRIGHTNESS_MIRROR);
+    }
+
+    @Test
+    public void brightnesShowingChanged_flagDisabled_ScrimControllerNotified() {
+        mSceneContainerFlags.setEnabled(false);
+        mCentralSurfaces.registerCallbacks();
+
+        mBrightnessMirrorShowingInteractor.setMirrorShowing(true);
+        mTestScope.getTestScheduler().runCurrent();
+        verify(mScrimController, never()).transitionTo(ScrimState.BRIGHTNESS_MIRROR);
+        verify(mScrimController, never()).transitionTo(eq(ScrimState.BRIGHTNESS_MIRROR), any());
+    }
+
     /**
      * Configures the appropriate mocks and then calls {@link CentralSurfacesImpl#updateIsKeyguard}
      * to reconfigure the keyguard to reflect the requested showing/occluded states.
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
index c1ef1ad..3e9006e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
@@ -25,6 +25,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.platform.test.annotations.DisableFlags;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
@@ -46,6 +47,7 @@
 import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationIconInteractor;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
+import com.android.systemui.statusbar.notification.row.shared.AsyncGroupHeaderViewInflation;
 import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager;
 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
 import com.android.systemui.statusbar.policy.Clock;
@@ -157,6 +159,7 @@
     }
 
     @Test
+    @DisableFlags(AsyncGroupHeaderViewInflation.FLAG_NAME)
     public void testHeaderUpdated() {
         mRow.setPinned(true);
         when(mHeadsUpManager.hasPinnedHeadsUp()).thenReturn(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
index d9e9c59..dc3db4c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
@@ -172,13 +172,15 @@
                 mKeyguardRepository,
                 mCommandQueue,
                 PowerInteractorFactory.create().getPowerInteractor(),
-                mKosmos.getFakeSceneContainerFlags(),
+                mKosmos.getSceneContainerFlags(),
                 new FakeKeyguardBouncerRepository(),
                 new ConfigurationInteractor(new FakeConfigurationRepository()),
                 new FakeShadeRepository(),
                 keyguardTransitionInteractor,
                 () -> mKosmos.getSceneInteractor(),
-                () -> mKosmos.getFromGoneTransitionInteractor());
+                () -> mKosmos.getFromGoneTransitionInteractor(),
+                () -> mKosmos.getSharedNotificationContainerInteractor(),
+                mTestScope);
         mViewModel =
                 new KeyguardStatusBarViewModel(
                         mTestScope.getBackgroundScope(),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
index 054680d..f8c01e7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
@@ -76,8 +76,6 @@
 import com.android.systemui.bouncer.ui.BouncerViewDelegate;
 import com.android.systemui.dock.DockManager;
 import com.android.systemui.dreams.DreamOverlayStateController;
-import com.android.systemui.flags.FakeFeatureFlags;
-import com.android.systemui.flags.Flags;
 import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor;
 import com.android.systemui.keyguard.domain.interactor.KeyguardSurfaceBehindInteractor;
 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
@@ -145,7 +143,6 @@
     @Mock private SysUIUnfoldComponent mSysUiUnfoldComponent;
     @Mock private DreamOverlayStateController mDreamOverlayStateController;
     @Mock private LatencyTracker mLatencyTracker;
-    private FakeFeatureFlags mFeatureFlags;
     @Mock private KeyguardSecurityModel mKeyguardSecurityModel;
     @Mock private PrimaryBouncerCallbackInteractor mPrimaryBouncerCallbackInteractor;
     @Mock private PrimaryBouncerInteractor mPrimaryBouncerInteractor;
@@ -188,11 +185,10 @@
                 .thenReturn(mKeyguardMessageAreaController);
         when(mBouncerView.getDelegate()).thenReturn(mBouncerViewDelegate);
         when(mBouncerViewDelegate.getBackCallback()).thenReturn(mBouncerViewDelegateBackCallback);
-        mFeatureFlags = new FakeFeatureFlags();
-        mFeatureFlags.set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false);
         mSetFlagsRule.disableFlags(
                 com.android.systemui.Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR,
-                com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR
+                com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR,
+                com.android.systemui.Flags.FLAG_REFACTOR_KEYGUARD_DISMISS_INTENT
         );
 
         when(mNotificationShadeWindowController.getWindowRootView())
@@ -218,7 +214,6 @@
                         () -> mShadeController,
                         mLatencyTracker,
                         mKeyguardSecurityModel,
-                        mFeatureFlags,
                         mPrimaryBouncerCallbackInteractor,
                         mPrimaryBouncerInteractor,
                         mBouncerView,
@@ -597,8 +592,7 @@
 
     private static ShadeExpansionChangeEvent expansionEvent(
             float fraction, boolean expanded, boolean tracking) {
-        return new ShadeExpansionChangeEvent(
-                fraction, expanded, tracking, /* dragDownPxAmount= */ 0f);
+        return new ShadeExpansionChangeEvent(fraction, expanded, tracking);
     }
 
     @Test
@@ -607,7 +601,7 @@
         /* verify that a predictive back callback is registered when the bouncer becomes visible */
         mBouncerExpansionCallback.onVisibilityChanged(true);
         verify(mOnBackInvokedDispatcher).registerOnBackInvokedCallback(
-                eq(OnBackInvokedDispatcher.PRIORITY_OVERLAY),
+                eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT),
                 mBackCallbackCaptor.capture());
 
         /* verify that the same callback is unregistered when the bouncer becomes invisible */
@@ -622,7 +616,7 @@
         mBouncerExpansionCallback.onVisibilityChanged(true);
         /* capture the predictive back callback during registration */
         verify(mOnBackInvokedDispatcher).registerOnBackInvokedCallback(
-                eq(OnBackInvokedDispatcher.PRIORITY_OVERLAY),
+                eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT),
                 mBackCallbackCaptor.capture());
 
         when(mPrimaryBouncerInteractor.isFullyShowing()).thenReturn(true);
@@ -642,7 +636,7 @@
         mBouncerExpansionCallback.onVisibilityChanged(true);
         /* capture the predictive back callback during registration */
         verify(mOnBackInvokedDispatcher).registerOnBackInvokedCallback(
-                eq(OnBackInvokedDispatcher.PRIORITY_OVERLAY),
+                eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT),
                 mBackCallbackCaptor.capture());
         assertTrue(mBackCallbackCaptor.getValue() instanceof OnBackAnimationCallback);
 
@@ -660,7 +654,7 @@
         mBouncerExpansionCallback.onVisibilityChanged(true);
         /* capture the predictive back callback during registration */
         verify(mOnBackInvokedDispatcher).registerOnBackInvokedCallback(
-                eq(OnBackInvokedDispatcher.PRIORITY_OVERLAY),
+                eq(OnBackInvokedDispatcher.PRIORITY_DEFAULT),
                 mBackCallbackCaptor.capture());
         assertTrue(mBackCallbackCaptor.getValue() instanceof OnBackAnimationCallback);
 
@@ -729,7 +723,6 @@
                         () -> mShadeController,
                         mLatencyTracker,
                         mKeyguardSecurityModel,
-                        mFeatureFlags,
                         mPrimaryBouncerCallbackInteractor,
                         mPrimaryBouncerInteractor,
                         mBouncerView,
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 3da5ab9..9c3d9c6 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
@@ -52,7 +52,7 @@
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.res.R;
 import com.android.systemui.shade.ShadeExpansionStateManager;
-import com.android.systemui.shade.ShadeViewController;
+import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.OperatorNameViewController;
 import com.android.systemui.statusbar.disableflags.DisableFlagsLogger;
@@ -115,7 +115,7 @@
     @Mock
     private HeadsUpAppearanceController mHeadsUpAppearanceController;
     @Mock
-    private ShadeViewController mShadeViewController;
+    private PanelExpansionInteractor mPanelExpansionInteractor;
     @Mock
     private StatusBarIconController.DarkIconManager.Factory mIconManagerFactory;
     @Mock
@@ -304,7 +304,7 @@
 
         // WHEN the shade is open and configured to hide the status bar icons
         mShadeExpansionStateManager.updateState(STATE_OPEN);
-        when(mShadeViewController.shouldHideStatusBarIconsWhenExpanded()).thenReturn(true);
+        when(mPanelExpansionInteractor.shouldHideStatusBarIconsWhenExpanded()).thenReturn(true);
 
         fragment.disable(DEFAULT_DISPLAY, 0, 0, false);
 
@@ -320,7 +320,7 @@
 
         // WHEN the shade is open but *not* configured to hide the status bar icons
         mShadeExpansionStateManager.updateState(STATE_OPEN);
-        when(mShadeViewController.shouldHideStatusBarIconsWhenExpanded()).thenReturn(false);
+        when(mPanelExpansionInteractor.shouldHideStatusBarIconsWhenExpanded()).thenReturn(false);
 
         fragment.disable(DEFAULT_DISPLAY, 0, 0, false);
 
@@ -337,7 +337,7 @@
 
         // WHEN the shade is open and configured to hide the status bar icons
         mShadeExpansionStateManager.updateState(STATE_OPEN);
-        when(mShadeViewController.shouldHideStatusBarIconsWhenExpanded()).thenReturn(true);
+        when(mPanelExpansionInteractor.shouldHideStatusBarIconsWhenExpanded()).thenReturn(true);
 
         fragment.disable(DEFAULT_DISPLAY, 0, 0, false);
 
@@ -696,7 +696,7 @@
                 mCollapsedStatusBarViewBinder,
                 mStatusBarHideIconsForBouncerManager,
                 mKeyguardStateController,
-                mShadeViewController,
+                mPanelExpansionInteractor,
                 mStatusBarStateController,
                 mock(NotificationIconContainerStatusBarViewBinder.class),
                 mCommandQueue,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt
index c07f289..42bbe3e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt
@@ -26,6 +26,8 @@
 import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
 import com.android.systemui.statusbar.pipeline.satellite.data.prod.FakeDeviceBasedSatelliteRepository
 import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
+import com.android.systemui.statusbar.policy.data.repository.FakeDeviceProvisioningRepository
+import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
 import com.android.systemui.util.mockito.mock
 import com.google.common.truth.Truth.assertThat
 import kotlin.test.Test
@@ -48,6 +50,9 @@
         )
 
     private val repo = FakeDeviceBasedSatelliteRepository()
+    private val deviceProvisionedRepository = FakeDeviceProvisioningRepository()
+    private val deviceProvisioningInteractor =
+        DeviceProvisioningInteractor(deviceProvisionedRepository)
 
     @Before
     fun setUp() {
@@ -55,6 +60,7 @@
             DeviceBasedSatelliteInteractor(
                 repo,
                 iconsInteractor,
+                deviceProvisioningInteractor,
                 testScope.backgroundScope,
             )
     }
@@ -96,6 +102,7 @@
                 DeviceBasedSatelliteInteractor(
                     repo,
                     iconsInteractor,
+                    deviceProvisioningInteractor,
                     testScope.backgroundScope,
                 )
 
@@ -142,6 +149,7 @@
                 DeviceBasedSatelliteInteractor(
                     repo,
                     iconsInteractor,
+                    deviceProvisioningInteractor,
                     testScope.backgroundScope,
                 )
 
@@ -196,6 +204,7 @@
                 DeviceBasedSatelliteInteractor(
                     repo,
                     iconsInteractor,
+                    deviceProvisioningInteractor,
                     testScope.backgroundScope,
                 )
 
@@ -327,6 +336,7 @@
                 DeviceBasedSatelliteInteractor(
                     repo,
                     iconsInteractor,
+                    deviceProvisioningInteractor,
                     testScope.backgroundScope,
                 )
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt
index ec6642d..1d6cd37 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt
@@ -26,6 +26,8 @@
 import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
 import com.android.systemui.statusbar.pipeline.satellite.data.prod.FakeDeviceBasedSatelliteRepository
 import com.android.systemui.statusbar.pipeline.satellite.domain.interactor.DeviceBasedSatelliteInteractor
+import com.android.systemui.statusbar.policy.data.repository.FakeDeviceProvisioningRepository
+import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
 import com.android.systemui.util.mockito.mock
 import com.google.common.truth.Truth.assertThat
 import kotlin.test.Test
@@ -45,6 +47,9 @@
 
     private val repo = FakeDeviceBasedSatelliteRepository()
     private val mobileIconsInteractor = FakeMobileIconsInteractor(FakeMobileMappingsProxy(), mock())
+    private val deviceProvisionedRepository = FakeDeviceProvisioningRepository()
+    private val deviceProvisioningInteractor =
+        DeviceProvisioningInteractor(deviceProvisionedRepository)
 
     private val testScope = TestScope()
 
@@ -57,6 +62,7 @@
             DeviceBasedSatelliteInteractor(
                 repo,
                 mobileIconsInteractor,
+                deviceProvisioningInteractor,
                 testScope.backgroundScope,
             )
 
@@ -214,4 +220,37 @@
             // THEN icon is null immediately
             assertThat(latest).isNull()
         }
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    fun icon_deviceIsProvisioned() =
+        testScope.runTest {
+            val latest by collectLastValue(underTest.icon)
+
+            // GIVEN satellite is allowed
+            repo.isSatelliteAllowedForCurrentLocation.value = true
+
+            // GIVEN all icons are OOS
+            val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
+            i1.isInService.value = false
+            i1.isEmergencyOnly.value = false
+
+            // GIVEN apm is disabled
+            airplaneModeRepository.setIsAirplaneMode(false)
+
+            // GIVEN device is not provisioned
+            deviceProvisionedRepository.setDeviceProvisioned(false)
+
+            // THEN icon is null because the device is not provisioned
+            assertThat(latest).isNull()
+
+            // GIVEN device becomes provisioned
+            deviceProvisionedRepository.setDeviceProvisioned(true)
+
+            // Wait for delay to be completed
+            advanceTimeBy(10.seconds)
+
+            // THEN icon is null because the device is not provisioned
+            assertThat(latest).isInstanceOf(Icon::class.java)
+        }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/CollapsedStatusBarViewModelImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/CollapsedStatusBarViewModelImplTest.kt
index f63f79f..865b312b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/CollapsedStatusBarViewModelImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/CollapsedStatusBarViewModelImplTest.kt
@@ -23,6 +23,7 @@
 import com.android.systemui.SysUITestComponent
 import com.android.systemui.SysUITestModule
 import com.android.systemui.SysuiTestCase
+import com.android.systemui.biometrics.domain.BiometricsDomainLayerModule
 import com.android.systemui.collectLastValue
 import com.android.systemui.collectValues
 import com.android.systemui.communal.dagger.CommunalModule
@@ -60,6 +61,7 @@
             [
                 SysUITestModule::class,
                 CommunalModule::class,
+                BiometricsDomainLayerModule::class,
             ]
     )
     interface TestComponent : SysUITestComponent<CollapsedStatusBarViewModelImpl> {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImplTest.kt
index 361fa5b..31bd57e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImplTest.kt
@@ -86,7 +86,6 @@
                 globalSettings,
                 userTracker,
                 dumpManager,
-                buildInfo,
                 Handler(testableLooper.looper),
                 mainExecutor
         )
@@ -99,12 +98,6 @@
     }
 
     @Test
-    fun testFrpNotActiveByDefault() {
-        init()
-        assertThat(controller.isFrpActive).isFalse()
-    }
-
-    @Test
     fun testNotUserSetupByDefault() {
         init()
         assertThat(controller.isUserSetup(START_USER)).isFalse()
@@ -119,14 +112,6 @@
     }
 
     @Test
-    fun testFrpActiveWhenCreated() {
-        globalSettings.putInt(Settings.Global.SECURE_FRP_MODE, 1)
-        init()
-
-        assertThat(controller.isFrpActive).isTrue()
-    }
-
-    @Test
     fun testUserSetupWhenCreated() {
         secureSettings.putIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 1, START_USER)
         init()
@@ -145,16 +130,6 @@
     }
 
     @Test
-    fun testFrpActiveChange() {
-        init()
-
-        globalSettings.putInt(Settings.Global.SECURE_FRP_MODE, 1)
-        testableLooper.processAllMessages() // background observer
-
-        assertThat(controller.isFrpActive).isTrue()
-    }
-
-    @Test
     fun testUserSetupChange() {
         init()
 
@@ -197,7 +172,6 @@
         mainExecutor.runAllReady()
 
         verify(listener, never()).onDeviceProvisionedChanged()
-        verify(listener, never()).onFrpActiveChanged()
         verify(listener, never()).onUserSetupChanged()
         verify(listener, never()).onUserSwitched()
     }
@@ -215,7 +189,6 @@
         verify(listener).onUserSwitched()
         verify(listener, never()).onUserSetupChanged()
         verify(listener, never()).onDeviceProvisionedChanged()
-        verify(listener, never()).onFrpActiveChanged()
     }
 
     @Test
@@ -230,7 +203,6 @@
         verify(listener, never()).onUserSwitched()
         verify(listener).onUserSetupChanged()
         verify(listener, never()).onDeviceProvisionedChanged()
-        verify(listener, never()).onFrpActiveChanged()
     }
 
     @Test
@@ -244,26 +216,10 @@
 
         verify(listener, never()).onUserSwitched()
         verify(listener, never()).onUserSetupChanged()
-        verify(listener, never()).onFrpActiveChanged()
         verify(listener).onDeviceProvisionedChanged()
     }
 
     @Test
-    fun testListenerCalledOnFrpActiveChanged() {
-        init()
-        controller.addCallback(listener)
-
-        globalSettings.putInt(Settings.Global.SECURE_FRP_MODE, 1)
-        testableLooper.processAllMessages()
-        mainExecutor.runAllReady()
-
-        verify(listener, never()).onUserSwitched()
-        verify(listener, never()).onUserSetupChanged()
-        verify(listener, never()).onDeviceProvisionedChanged()
-        verify(listener).onFrpActiveChanged()
-    }
-
-    @Test
     fun testRemoveListener() {
         init()
         controller.addCallback(listener)
@@ -272,13 +228,11 @@
         switchUser(10)
         secureSettings.putIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 1, START_USER)
         globalSettings.putInt(Settings.Global.DEVICE_PROVISIONED, 1)
-        globalSettings.putInt(Settings.Global.SECURE_FRP_MODE, 1)
 
         testableLooper.processAllMessages()
         mainExecutor.runAllReady()
 
         verify(listener, never()).onDeviceProvisionedChanged()
-        verify(listener, never()).onFrpActiveChanged()
         verify(listener, never()).onUserSetupChanged()
         verify(listener, never()).onUserSwitched()
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
index c259782..70afbd8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
@@ -67,10 +67,10 @@
 import com.android.internal.logging.UiEventLogger;
 import com.android.internal.logging.testing.UiEventLoggerFake;
 import com.android.systemui.Dependency;
-import com.android.systemui.res.R;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.animation.AnimatorTestRule;
 import com.android.systemui.flags.FakeFeatureFlags;
+import com.android.systemui.res.R;
 import com.android.systemui.statusbar.NotificationRemoteInputManager;
 import com.android.systemui.statusbar.RemoteInputController;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -448,6 +448,34 @@
         assertEquals(1f, fadeInView.getAlpha());
     }
 
+    @Test
+    public void testUnanimatedFocusAfterDefocusAnimation() throws Exception {
+        NotificationTestHelper helper = new NotificationTestHelper(
+                mContext,
+                mDependency,
+                TestableLooper.get(this));
+        ExpandableNotificationRow row = helper.createRow();
+        RemoteInputView view = RemoteInputView.inflate(mContext, null, row.getEntry(), mController);
+        bindController(view, row.getEntry());
+
+        FrameLayout parent = new FrameLayout(mContext);
+        parent.addView(view);
+
+        // Play defocus animation
+        view.onDefocus(true /* animate */, false /* logClose */, null /* doAfterDefocus */);
+        mAnimatorTestRule.advanceTimeBy(ANIMATION_DURATION_STANDARD);
+
+        // assert that RemoteInputView is no longer visible, but alpha is reset to 1f
+        assertEquals(View.GONE, view.getVisibility());
+        assertEquals(1f, view.getAlpha());
+
+        // focus RemoteInputView without an animation
+        view.focus();
+        // assert that RemoteInputView is visible, and alpha is 1f
+        assertEquals(View.VISIBLE, view.getVisibility());
+        assertEquals(1f, view.getAlpha());
+    }
+
     // NOTE: because we're refactoring the RemoteInputView and moving logic into the
     // RemoteInputViewController, it's easiest to just test the system of the two classes together.
     @NonNull
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 7dfe6d0..4ace163 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
@@ -28,7 +28,10 @@
 import android.content.pm.PackageManager
 import android.media.projection.MediaProjectionInfo
 import android.media.projection.MediaProjectionManager
+import android.os.Process
+import android.os.UserHandle
 import android.permission.flags.Flags.FLAG_SENSITIVE_NOTIFICATION_APP_PROTECTION
+import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
 import android.platform.test.annotations.RequiresFlagsDisabled
 import android.platform.test.annotations.RequiresFlagsEnabled
@@ -37,7 +40,11 @@
 import android.testing.AndroidTestingRunner
 import android.testing.TestableLooper.RunWithLooper
 import androidx.test.filters.SmallTest
-import com.android.server.notification.Flags
+import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
+import com.android.dx.mockito.inline.extended.ExtendedMockito.verify
+import com.android.internal.util.FrameworkStatsLog
+import com.android.server.notification.Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING
+import com.android.systemui.Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX
 import com.android.systemui.SysuiTestCase
 import com.android.systemui.log.logcatLogBuffer
 import com.android.systemui.statusbar.RankingBuilder
@@ -49,6 +56,7 @@
 import com.android.systemui.util.mockito.withArgCaptor
 import com.android.systemui.util.settings.FakeGlobalSettings
 import com.android.systemui.util.time.FakeSystemClock
+import org.junit.After
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertTrue
@@ -57,19 +65,22 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.anyLong
 import org.mockito.ArgumentMatchers.anyString
+import org.mockito.ArgumentMatchers.eq
 import org.mockito.Mock
 import org.mockito.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
+import org.mockito.MockitoSession
+import org.mockito.quality.Strictness
 
 @SmallTest
 @RunWith(AndroidTestingRunner::class)
 @RunWithLooper
-@EnableFlags(Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING)
+@EnableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING)
 class SensitiveNotificationProtectionControllerTest : SysuiTestCase() {
     @get:Rule val checkFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
 
@@ -78,24 +89,54 @@
     @Mock private lateinit var activityManager: IActivityManager
     @Mock private lateinit var mediaProjectionManager: MediaProjectionManager
     @Mock private lateinit var packageManager: PackageManager
-    @Mock private lateinit var mediaProjectionInfo: MediaProjectionInfo
     @Mock private lateinit var listener1: Runnable
     @Mock private lateinit var listener2: Runnable
     @Mock private lateinit var listener3: Runnable
 
+    private lateinit var staticMockSession: MockitoSession
     private lateinit var executor: FakeExecutor
     private lateinit var globalSettings: FakeGlobalSettings
     private lateinit var mediaProjectionCallback: MediaProjectionManager.Callback
     private lateinit var controller: SensitiveNotificationProtectionControllerImpl
+    private lateinit var mediaProjectionInfo: MediaProjectionInfo
 
     @Before
     fun setUp() {
+        staticMockSession =
+            mockitoSession()
+                .mockStatic(FrameworkStatsLog::class.java)
+                .strictness(Strictness.LENIENT)
+                .startMocking()
         allowTestableLooperAsMainThread() // for updating exempt packages and notifying listeners
         MockitoAnnotations.initMocks(this)
 
         setShareFullScreen()
         whenever(activityManager.bugreportWhitelistedPackages)
             .thenReturn(listOf(BUGREPORT_PACKAGE_NAME))
+        whenever(
+                packageManager.getPackageUidAsUser(
+                    TEST_PROJECTION_PACKAGE_NAME,
+                    UserHandle.CURRENT.identifier
+                )
+            )
+            .thenReturn(TEST_PROJECTION_PACKAGE_UID)
+        whenever(
+                packageManager.getPackageUidAsUser(
+                    BUGREPORT_PACKAGE_NAME,
+                    UserHandle.CURRENT.identifier
+                )
+            )
+            .thenReturn(BUGREPORT_PACKAGE_UID)
+        // SystemUi context package name is exempt, but in test scenarios its
+        // com.android.systemui.tests so use that instead of hardcoding. Setup packagemanager to
+        // return the correct uid in this scenario
+        whenever(
+                packageManager.getPackageUidAsUser(
+                    mContext.packageName,
+                    UserHandle.CURRENT.identifier
+                )
+            )
+            .thenReturn(mContext.applicationInfo.uid)
 
         whenever(packageManager.checkPermission(anyString(), anyString()))
             .thenReturn(PackageManager.PERMISSION_DENIED)
@@ -123,6 +164,11 @@
         }
     }
 
+    @After
+    fun tearDown() {
+        staticMockSession.finishMocking()
+    }
+
     @Test
     fun init_registerMediaProjectionManagerCallback() {
         assertNotNull(mediaProjectionCallback)
@@ -242,9 +288,9 @@
 
     @Test
     fun isSensitiveStateActive_projectionActive_sysuiExempt_false() {
-        // SystemUi context packge name is exempt, but in test scenarios its
+        // SystemUi context package name is exempt, but in test scenarios its
         // com.android.systemui.tests so use that instead of hardcoding
-        whenever(mediaProjectionInfo.packageName).thenReturn(mContext.packageName)
+        setShareFullScreenViaSystemUi()
         mediaProjectionCallback.onStart(mediaProjectionInfo)
 
         assertFalse(controller.isSensitiveStateActive)
@@ -282,7 +328,7 @@
 
     @Test
     fun isSensitiveStateActive_projectionActive_bugReportHandlerExempt_false() {
-        whenever(mediaProjectionInfo.packageName).thenReturn(BUGREPORT_PACKAGE_NAME)
+        setShareFullScreenViaBugReportHandler()
         mediaProjectionCallback.onStart(mediaProjectionInfo)
 
         assertFalse(controller.isSensitiveStateActive)
@@ -341,13 +387,33 @@
     }
 
     @Test
-    fun shouldProtectNotification_projectionActive_sysuiExempt_false() {
-        // SystemUi context packge name is exempt, but in test scenarios its
-        // com.android.systemui.tests so use that instead of hardcoding
-        whenever(mediaProjectionInfo.packageName).thenReturn(mContext.packageName)
+    @DisableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX)
+    fun shouldProtectNotification_projectionActive_isFromCoreApp_fixDisabled_true() {
         mediaProjectionCallback.onStart(mediaProjectionInfo)
 
-        val notificationEntry = setupNotificationEntry(TEST_PACKAGE_NAME, false)
+        val notificationEntry = setupCoreAppNotificationEntry(TEST_PROJECTION_PACKAGE_NAME)
+
+        assertTrue(controller.shouldProtectNotification(notificationEntry))
+    }
+
+    @Test
+    @EnableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX)
+    fun shouldProtectNotification_projectionActive_isFromCoreApp_false() {
+        mediaProjectionCallback.onStart(mediaProjectionInfo)
+
+        val notificationEntry = setupCoreAppNotificationEntry(TEST_PROJECTION_PACKAGE_NAME)
+
+        assertFalse(controller.shouldProtectNotification(notificationEntry))
+    }
+
+    @Test
+    fun shouldProtectNotification_projectionActive_sysuiExempt_false() {
+        // SystemUi context package name is exempt, but in test scenarios its
+        // com.android.systemui.tests so use that instead of hardcoding
+        setShareFullScreenViaSystemUi()
+        mediaProjectionCallback.onStart(mediaProjectionInfo)
+
+        val notificationEntry = setupNotificationEntry(TEST_PACKAGE_NAME)
 
         assertFalse(controller.shouldProtectNotification(notificationEntry))
     }
@@ -364,7 +430,7 @@
             .thenReturn(PackageManager.PERMISSION_GRANTED)
         mediaProjectionCallback.onStart(mediaProjectionInfo)
 
-        val notificationEntry = setupNotificationEntry(TEST_PACKAGE_NAME, false)
+        val notificationEntry = setupNotificationEntry(TEST_PACKAGE_NAME)
 
         assertTrue(controller.shouldProtectNotification(notificationEntry))
     }
@@ -381,17 +447,17 @@
             .thenReturn(PackageManager.PERMISSION_GRANTED)
         mediaProjectionCallback.onStart(mediaProjectionInfo)
 
-        val notificationEntry = setupNotificationEntry(TEST_PACKAGE_NAME, false)
+        val notificationEntry = setupNotificationEntry(TEST_PACKAGE_NAME)
 
         assertFalse(controller.shouldProtectNotification(notificationEntry))
     }
 
     @Test
     fun shouldProtectNotification_projectionActive_bugReportHandlerExempt_false() {
-        whenever(mediaProjectionInfo.packageName).thenReturn(BUGREPORT_PACKAGE_NAME)
+        setShareFullScreenViaBugReportHandler()
         mediaProjectionCallback.onStart(mediaProjectionInfo)
 
-        val notificationEntry = setupNotificationEntry(TEST_PACKAGE_NAME, false)
+        val notificationEntry = setupNotificationEntry(TEST_PACKAGE_NAME)
 
         assertFalse(controller.shouldProtectNotification(notificationEntry))
     }
@@ -426,6 +492,161 @@
         assertTrue(controller.shouldProtectNotification(notificationEntry))
     }
 
+    @Test
+    fun logSensitiveContentProtectionSession() {
+        mediaProjectionCallback.onStart(mediaProjectionInfo)
+
+        verify {
+            FrameworkStatsLog.write(
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION),
+                anyLong(),
+                eq(TEST_PROJECTION_PACKAGE_UID),
+                eq(false),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__START),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__SYS_UI)
+            )
+        }
+
+        mediaProjectionCallback.onStop(mediaProjectionInfo)
+
+        verify {
+            FrameworkStatsLog.write(
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION),
+                anyLong(),
+                eq(TEST_PROJECTION_PACKAGE_UID),
+                eq(false),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__STOP),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__SYS_UI)
+            )
+        }
+    }
+
+    @Test
+    fun logSensitiveContentProtectionSession_exemptViaShareSingleApp() {
+        setShareSingleApp()
+
+        mediaProjectionCallback.onStart(mediaProjectionInfo)
+
+        verify {
+            FrameworkStatsLog.write(
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION),
+                anyLong(),
+                eq(TEST_PROJECTION_PACKAGE_UID),
+                eq(true),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__START),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__SYS_UI)
+            )
+        }
+
+        mediaProjectionCallback.onStop(mediaProjectionInfo)
+
+        verify {
+            FrameworkStatsLog.write(
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION),
+                anyLong(),
+                eq(TEST_PROJECTION_PACKAGE_UID),
+                eq(true),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__STOP),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__SYS_UI)
+            )
+        }
+    }
+
+    @Test
+    fun logSensitiveContentProtectionSession_exemptViaDeveloperOption() {
+        setDisabledViaDeveloperOption()
+
+        mediaProjectionCallback.onStart(mediaProjectionInfo)
+
+        verify {
+            FrameworkStatsLog.write(
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION),
+                anyLong(),
+                eq(TEST_PROJECTION_PACKAGE_UID),
+                eq(true),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__START),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__SYS_UI)
+            )
+        }
+
+        mediaProjectionCallback.onStop(mediaProjectionInfo)
+
+        verify {
+            FrameworkStatsLog.write(
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION),
+                anyLong(),
+                eq(TEST_PROJECTION_PACKAGE_UID),
+                eq(true),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__STOP),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__SYS_UI)
+            )
+        }
+    }
+
+    @Test
+    fun logSensitiveContentProtectionSession_exemptViaSystemUi() {
+        // SystemUi context package name is exempt, but in test scenarios its
+        // com.android.systemui.tests so use that instead of hardcoding
+        setShareFullScreenViaSystemUi()
+
+        mediaProjectionCallback.onStart(mediaProjectionInfo)
+
+        verify {
+            FrameworkStatsLog.write(
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION),
+                anyLong(),
+                eq(mContext.applicationInfo.uid),
+                eq(true),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__START),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__SYS_UI)
+            )
+        }
+
+        mediaProjectionCallback.onStop(mediaProjectionInfo)
+
+        verify {
+            FrameworkStatsLog.write(
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION),
+                anyLong(),
+                eq(mContext.applicationInfo.uid),
+                eq(true),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__STOP),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__SYS_UI)
+            )
+        }
+    }
+
+    @Test
+    fun logSensitiveContentProtectionSession_exemptViaBugReportHandler() {
+        // Setup exempt via bugreport handler
+        setShareFullScreenViaBugReportHandler()
+        mediaProjectionCallback.onStart(mediaProjectionInfo)
+
+        verify {
+            FrameworkStatsLog.write(
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION),
+                anyLong(),
+                eq(BUGREPORT_PACKAGE_UID),
+                eq(true),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__START),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__SYS_UI)
+            )
+        }
+
+        mediaProjectionCallback.onStop(mediaProjectionInfo)
+
+        verify {
+            FrameworkStatsLog.write(
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION),
+                anyLong(),
+                eq(BUGREPORT_PACKAGE_UID),
+                eq(true),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__STOP),
+                eq(FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__SYS_UI)
+            )
+        }
+    }
+
     private fun setDisabledViaDeveloperOption() {
         globalSettings.putInt(DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS, 1)
 
@@ -434,18 +655,32 @@
     }
 
     private fun setShareFullScreen() {
-        whenever(mediaProjectionInfo.packageName).thenReturn(TEST_PROJECTION_PACKAGE_NAME)
-        whenever(mediaProjectionInfo.launchCookie).thenReturn(null)
+        setShareScreen(TEST_PROJECTION_PACKAGE_NAME, true)
+    }
+
+    private fun setShareFullScreenViaBugReportHandler() {
+        setShareScreen(BUGREPORT_PACKAGE_NAME, true)
+    }
+
+    private fun setShareFullScreenViaSystemUi() {
+        // SystemUi context package name is exempt, but in test scenarios its
+        // com.android.systemui.tests so use that instead of hardcoding
+        setShareScreen(mContext.packageName, true)
     }
 
     private fun setShareSingleApp() {
-        whenever(mediaProjectionInfo.packageName).thenReturn(TEST_PROJECTION_PACKAGE_NAME)
-        whenever(mediaProjectionInfo.launchCookie).thenReturn(ActivityOptions.LaunchCookie())
+        setShareScreen(TEST_PROJECTION_PACKAGE_NAME, false)
+    }
+
+    private fun setShareScreen(packageName: String, fullScreen: Boolean) {
+        val launchCookie = if (fullScreen) null else ActivityOptions.LaunchCookie()
+        mediaProjectionInfo = MediaProjectionInfo(packageName, UserHandle.CURRENT, launchCookie)
     }
 
     private fun setupNotificationEntry(
         packageName: String,
         isFgs: Boolean = false,
+        isCoreApp: Boolean = false,
         overrideVisibility: Boolean = false,
         overrideChannelVisibility: Boolean = false,
     ): NotificationEntry {
@@ -457,8 +692,14 @@
             // Developer has marked notification as public
             notification.visibility = VISIBILITY_PUBLIC
         }
-        val notificationEntry =
-            NotificationEntryBuilder().setNotification(notification).setPkg(packageName).build()
+        val notificationEntryBuilder =
+            NotificationEntryBuilder().setNotification(notification).setPkg(packageName)
+        if (isCoreApp) {
+            notificationEntryBuilder.setUid(Process.FIRST_APPLICATION_UID - 10)
+        } else {
+            notificationEntryBuilder.setUid(Process.FIRST_APPLICATION_UID + 10)
+        }
+        val notificationEntry = notificationEntryBuilder.build()
         val channel = NotificationChannel("1", "1", IMPORTANCE_HIGH)
         if (overrideChannelVisibility) {
             // User doesn't allow private notifications at the channel level
@@ -477,6 +718,10 @@
         return setupNotificationEntry(packageName, isFgs = true)
     }
 
+    private fun setupCoreAppNotificationEntry(packageName: String): NotificationEntry {
+        return setupNotificationEntry(packageName, isCoreApp = true)
+    }
+
     private fun setupPublicNotificationEntry(packageName: String): NotificationEntry {
         return setupNotificationEntry(packageName, overrideVisibility = true)
     }
@@ -492,6 +737,8 @@
     }
 
     companion object {
+        private const val TEST_PROJECTION_PACKAGE_UID = 23
+        private const val BUGREPORT_PACKAGE_UID = 24
         private const val TEST_PROJECTION_PACKAGE_NAME =
             "com.android.systemui.statusbar.policy.projectionpackage"
         private const val TEST_PACKAGE_NAME = "com.android.systemui.statusbar.policy.testpackage"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/data/repository/DeviceProvisioningRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/data/repository/DeviceProvisioningRepositoryImplTest.kt
index 12694ae..21ed3841 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/data/repository/DeviceProvisioningRepositoryImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/data/repository/DeviceProvisioningRepositoryImplTest.kt
@@ -78,31 +78,4 @@
             .onDeviceProvisionedChanged()
         assertThat(deviceProvisioned).isFalse()
     }
-
-    @Test
-    fun isFrpActive_reflectsCurrentControllerState() = runTest {
-        whenever(deviceProvisionedController.isFrpActive).thenReturn(true)
-        val frpActive by collectLastValue(underTest.isFactoryResetProtectionActive)
-        assertThat(frpActive).isTrue()
-    }
-
-    @Test
-    fun isFrpActive_updatesWhenControllerStateChanges_toTrue() = runTest {
-        val frpActive by collectLastValue(underTest.isFactoryResetProtectionActive)
-        runCurrent()
-        whenever(deviceProvisionedController.isFrpActive).thenReturn(true)
-        withArgCaptor { verify(deviceProvisionedController).addCallback(capture()) }
-            .onFrpActiveChanged()
-        assertThat(frpActive).isTrue()
-    }
-
-    @Test
-    fun isFrpActive_updatesWhenControllerStateChanges_toFalse() = runTest {
-        val frpActive by collectLastValue(underTest.isFactoryResetProtectionActive)
-        runCurrent()
-        whenever(deviceProvisionedController.isFrpActive).thenReturn(false)
-        withArgCaptor { verify(deviceProvisionedController).addCallback(capture()) }
-            .onFrpActiveChanged()
-        assertThat(frpActive).isFalse()
-    }
 }
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 e4b9f10..69536c5 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
@@ -30,11 +30,12 @@
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.power.domain.interactor.PowerInteractorFactory
 import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
+import com.android.systemui.scene.shared.flag.sceneContainerFlags
 import com.android.systemui.shade.data.repository.FakeShadeRepository
 import com.android.systemui.statusbar.CommandQueue
 import com.android.systemui.statusbar.data.repository.FakeKeyguardStatusBarRepository
 import com.android.systemui.statusbar.domain.interactor.KeyguardStatusBarInteractor
+import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor
 import com.android.systemui.statusbar.policy.BatteryController
 import com.android.systemui.testKosmos
 import com.android.systemui.util.mockito.argumentCaptor
@@ -59,13 +60,15 @@
             keyguardRepository,
             mock<CommandQueue>(),
             PowerInteractorFactory.create().powerInteractor,
-            kosmos.fakeSceneContainerFlags,
+            kosmos.sceneContainerFlags,
             FakeKeyguardBouncerRepository(),
             ConfigurationInteractor(FakeConfigurationRepository()),
             FakeShadeRepository(),
             kosmos.keyguardTransitionInteractor,
             { kosmos.sceneInteractor },
             { kosmos.fromGoneTransitionInteractor },
+            { kosmos.sharedNotificationContainerInteractor },
+            testScope,
         )
     private val keyguardStatusBarInteractor =
         KeyguardStatusBarInteractor(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt
index 10aab96..e1797c4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt
@@ -29,6 +29,7 @@
 import com.android.systemui.keyguard.WakefulnessLifecycle
 import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
+import com.android.systemui.keyguard.domain.interactor.ToAodFoldTransitionInteractor
 import com.android.systemui.shade.ShadeFoldAnimator
 import com.android.systemui.shade.ShadeViewController
 import com.android.systemui.statusbar.LightRevealScrim
@@ -79,6 +80,8 @@
 
     @Mock lateinit var shadeFoldAnimator: ShadeFoldAnimator
 
+    @Mock lateinit var foldTransitionInteractor: ToAodFoldTransitionInteractor
+
     @Captor private lateinit var foldStateListenerCaptor: ArgumentCaptor<FoldStateListener>
 
     private lateinit var deviceStates: FoldableDeviceStates
@@ -96,6 +99,7 @@
 
         // TODO(b/254878364): remove this call to NPVC.getView()
         whenever(shadeViewController.shadeFoldAnimator).thenReturn(shadeFoldAnimator)
+        whenever(foldTransitionInteractor.foldAnimator).thenReturn(shadeFoldAnimator)
         whenever(shadeFoldAnimator.view).thenReturn(viewGroup)
         whenever(viewGroup.viewTreeObserver).thenReturn(viewTreeObserver)
         whenever(wakefulnessLifecycle.lastSleepReason)
@@ -120,6 +124,7 @@
                         globalSettings,
                         latencyTracker,
                         { keyguardInteractor },
+                        { foldTransitionInteractor },
                     )
                     .apply { initialize(centralSurfaces, shadeViewController, lightRevealScrim) }
 
@@ -133,47 +138,34 @@
     @Test
     fun onFolded_aodDisabled_doesNotLogLatency() =
         runBlocking(IMMEDIATE) {
-            val job = underTest.listenForDozing(this)
             keyguardRepository.setIsDozing(true)
             setAodEnabled(enabled = false)
 
-            yield()
-
             fold()
             simulateScreenTurningOn()
 
             verifyNoMoreInteractions(latencyTracker)
-
-            job.cancel()
         }
 
     @Test
     fun onFolded_aodEnabled_logsLatency() =
         runBlocking(IMMEDIATE) {
-            val job = underTest.listenForDozing(this)
             keyguardRepository.setIsDozing(true)
             setAodEnabled(enabled = true)
 
-            yield()
-
             fold()
             simulateScreenTurningOn()
 
             verify(latencyTracker).onActionStart(any())
             verify(latencyTracker).onActionEnd(any())
-
-            job.cancel()
         }
 
     @Test
     fun onFolded_onScreenTurningOnInvokedTwice_doesNotLogLatency() =
         runBlocking(IMMEDIATE) {
-            val job = underTest.listenForDozing(this)
             keyguardRepository.setIsDozing(true)
             setAodEnabled(enabled = true)
 
-            yield()
-
             fold()
             simulateScreenTurningOn()
             reset(latencyTracker)
@@ -183,19 +175,14 @@
 
             verify(latencyTracker, never()).onActionStart(any())
             verify(latencyTracker, never()).onActionEnd(any())
-
-            job.cancel()
         }
 
     @Test
     fun onFolded_onScreenTurningOnWithoutDozingThenWithDozing_doesNotLogLatency() =
         runBlocking(IMMEDIATE) {
-            val job = underTest.listenForDozing(this)
             keyguardRepository.setIsDozing(false)
             setAodEnabled(enabled = true)
 
-            yield()
-
             fold()
             simulateScreenTurningOn()
             reset(latencyTracker)
@@ -208,19 +195,14 @@
 
             verify(latencyTracker, never()).onActionStart(any())
             verify(latencyTracker, never()).onActionEnd(any())
-
-            job.cancel()
         }
 
     @Test
     fun onFolded_animationCancelled_doesNotLogLatency() =
         runBlocking(IMMEDIATE) {
-            val job = underTest.listenForDozing(this)
             keyguardRepository.setIsDozing(true)
             setAodEnabled(enabled = true)
 
-            yield()
-
             fold()
             underTest.onScreenTurningOn({})
             // The body of onScreenTurningOn is executed on fakeExecutor,
@@ -230,8 +212,6 @@
 
             verify(latencyTracker).onActionStart(any())
             verify(latencyTracker).onActionCancel(any())
-
-            job.cancel()
         }
 
     private fun simulateScreenTurningOn() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldLightRevealOverlayAnimationTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldLightRevealOverlayAnimationTest.kt
new file mode 100644
index 0000000..dddc712
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldLightRevealOverlayAnimationTest.kt
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.unfold
+
+import android.os.PowerManager
+import android.os.SystemProperties
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import androidx.test.filters.SmallTest
+import com.android.internal.foldables.FoldLockSettingAvailabilityProvider
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.display.data.repository.DeviceStateRepository.DeviceState
+import com.android.systemui.display.data.repository.fakeDeviceStateRepository
+import com.android.systemui.kosmos.Kosmos
+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.Companion.setScreenPowerState
+import com.android.systemui.power.domain.interactor.powerInteractor
+import com.android.systemui.power.shared.model.ScreenPowerState
+import com.android.systemui.util.animation.data.repository.fakeAnimationStatusRepository
+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.TestScope
+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.Mockito.atLeast
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@SmallTest
[email protected](setAsMainLooper = true)
+@RunWith(AndroidTestingRunner::class)
+@OptIn(ExperimentalCoroutinesApi::class)
+class FoldLightRevealOverlayAnimationTest : SysuiTestCase() {
+    private val kosmos = Kosmos()
+    private val testScope: TestScope = kosmos.testScope
+    private val fakeDeviceStateRepository = kosmos.fakeDeviceStateRepository
+    private val powerInteractor = kosmos.powerInteractor
+    private val fakeAnimationStatusRepository = kosmos.fakeAnimationStatusRepository
+    private val mockControllerFactory = kosmos.fullscreenLightRevealAnimationControllerFactory
+    private val mockFullScreenController = kosmos.fullscreenLightRevealAnimationController
+    private val mockFoldLockSettingAvailabilityProvider =
+        mock<FoldLockSettingAvailabilityProvider>()
+    private val onOverlayReady = mock<Runnable>()
+    private lateinit var foldLightRevealAnimation: FoldLightRevealOverlayAnimation
+
+    @Before
+    fun setup() {
+        MockitoAnnotations.initMocks(this)
+        whenever(mockFoldLockSettingAvailabilityProvider.isFoldLockBehaviorAvailable)
+            .thenReturn(true)
+        fakeAnimationStatusRepository.onAnimationStatusChanged(true)
+
+        foldLightRevealAnimation =
+            FoldLightRevealOverlayAnimation(
+                kosmos.testDispatcher,
+                fakeDeviceStateRepository,
+                powerInteractor,
+                testScope.backgroundScope,
+                fakeAnimationStatusRepository,
+                mockControllerFactory,
+                mockFoldLockSettingAvailabilityProvider
+            )
+        foldLightRevealAnimation.init()
+    }
+
+    @Test
+    fun foldToScreenOn_playFoldAnimation() =
+        testScope.runTest {
+            foldDeviceToScreenOff()
+            turnScreenOn()
+
+            verifyFoldAnimationPlayed()
+        }
+
+    @Test
+    fun foldToAod_doNotPlayFoldAnimation() =
+        testScope.runTest {
+            foldDeviceToScreenOff()
+            emitLastWakefulnessEventStartingToSleep()
+            advanceTimeBy(SHORT_DELAY_MS)
+            turnScreenOn()
+            advanceTimeBy(ANIMATION_DURATION)
+
+            verifyFoldAnimationDidNotPlay()
+        }
+
+    @Test
+    fun foldToScreenOff_doNotPlayFoldAnimation() =
+        testScope.runTest {
+            foldDeviceToScreenOff()
+            emitLastWakefulnessEventStartingToSleep()
+            advanceTimeBy(SHORT_DELAY_MS)
+            advanceTimeBy(ANIMATION_DURATION)
+
+            verifyFoldAnimationDidNotPlay()
+        }
+
+    @Test
+    fun foldToScreenOnWithDelay_doNotPlayFoldAnimation() =
+        testScope.runTest {
+            foldDeviceToScreenOff()
+            foldLightRevealAnimation.onScreenTurningOn {}
+            advanceTimeBy(WAIT_FOR_ANIMATION_TIMEOUT_MS)
+            powerInteractor.setScreenPowerState(ScreenPowerState.SCREEN_ON)
+            advanceTimeBy(SHORT_DELAY_MS)
+            advanceTimeBy(ANIMATION_DURATION)
+
+            verifyFoldAnimationDidNotPlay()
+        }
+
+    @Test
+    fun immediateUnfoldAfterFold_removeOverlayAfterCancellation() =
+        testScope.runTest {
+            foldDeviceToScreenOff()
+            foldLightRevealAnimation.onScreenTurningOn {}
+            advanceTimeBy(SHORT_DELAY_MS)
+            advanceTimeBy(ANIMATION_DURATION)
+            fakeDeviceStateRepository.emit(DeviceState.HALF_FOLDED)
+            advanceTimeBy(SHORT_DELAY_MS)
+            powerInteractor.setScreenPowerState(ScreenPowerState.SCREEN_ON)
+
+            verifyOverlayWasRemoved()
+        }
+
+    @Test
+    fun foldToScreenOn_removeOverlayAfterCompletion() =
+        testScope.runTest {
+            foldDeviceToScreenOff()
+            turnScreenOn()
+            advanceTimeBy(ANIMATION_DURATION)
+
+            verifyOverlayWasRemoved()
+        }
+
+    @Test
+    fun unfold_immediatelyRunRunnable() =
+        testScope.runTest {
+            foldLightRevealAnimation.onScreenTurningOn(onOverlayReady)
+
+            verify(onOverlayReady).run()
+        }
+
+    private suspend fun TestScope.foldDeviceToScreenOff() {
+        fakeDeviceStateRepository.emit(DeviceState.HALF_FOLDED)
+        powerInteractor.setScreenPowerState(ScreenPowerState.SCREEN_ON)
+        advanceTimeBy(SHORT_DELAY_MS)
+        fakeDeviceStateRepository.emit(DeviceState.FOLDED)
+        advanceTimeBy(SHORT_DELAY_MS)
+        powerInteractor.setScreenPowerState(ScreenPowerState.SCREEN_OFF)
+        advanceTimeBy(SHORT_DELAY_MS)
+    }
+
+    private fun TestScope.turnScreenOn() {
+        foldLightRevealAnimation.onScreenTurningOn {}
+        advanceTimeBy(SHORT_DELAY_MS)
+        powerInteractor.setScreenPowerState(ScreenPowerState.SCREEN_ON)
+        advanceTimeBy(SHORT_DELAY_MS)
+    }
+
+    private fun emitLastWakefulnessEventStartingToSleep() =
+        powerInteractor.setAsleepForTest(PowerManager.GO_TO_SLEEP_REASON_DEVICE_FOLD)
+
+    private fun verifyFoldAnimationPlayed() =
+        verify(mockFullScreenController, atLeast(1)).updateRevealAmount(any())
+
+    private fun verifyFoldAnimationDidNotPlay() =
+        verify(mockFullScreenController, never()).updateRevealAmount(any())
+
+    private fun verifyOverlayWasRemoved() =
+        verify(mockFullScreenController, atLeast(1)).ensureOverlayRemoved()
+
+    private companion object {
+        const val WAIT_FOR_ANIMATION_TIMEOUT_MS = 2000L
+        val ANIMATION_DURATION: Long
+            get() = SystemProperties.getLong("persist.fold_animation_duration", 200L)
+        const val SHORT_DELAY_MS = 50L
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractorTest.kt
index 1b43851..3dee093 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractorTest.kt
@@ -1014,6 +1014,136 @@
         verify(spyContext, never()).startServiceAsUser(any(), any())
     }
 
+    @Test
+    fun userIsAdminAndRestricted_addUserActionsNotAdded() {
+        createUserInteractor()
+        testScope.runTest {
+            val id = 0
+            val userInfo =
+                UserInfo(
+                    id,
+                    "child",
+                    /* iconPath= */ "",
+                    /* flags= */ UserInfo.FLAG_ADMIN,
+                    UserManager.USER_TYPE_FULL_RESTRICTED,
+                )
+            whenever(
+                    manager.hasUserRestrictionForUser(
+                        UserManager.DISALLOW_ADD_USER,
+                        UserHandle.of(id)
+                    )
+                )
+                .thenReturn(true)
+
+            userRepository.setUserInfos(listOf(userInfo))
+            userRepository.setSelectedUserInfo(userInfo)
+            userRepository.setSettings(UserSwitcherSettingsModel(isUserSwitcherEnabled = true))
+
+            val value = collectLastValue(underTest.actions)
+            runCurrent()
+
+            assertThat(value()).isEqualTo(listOf(UserActionModel.NAVIGATE_TO_USER_MANAGEMENT))
+        }
+    }
+
+    @Test
+    fun userIsNotRestrictedAndCannotAddGuests_actionsDoesNotIncludeAddGuest() {
+        createUserInteractor()
+        testScope.runTest {
+            val userInfos = createUserInfos(count = 2, includeGuest = false)
+
+            userRepository.setUserInfos(userInfos)
+            userRepository.setSelectedUserInfo(userInfos[0])
+            userRepository.setSettings(UserSwitcherSettingsModel(isUserSwitcherEnabled = true))
+            keyguardRepository.setKeyguardShowing(false)
+
+            whenever(manager.canAddMoreUsers(UserManager.USER_TYPE_FULL_GUEST)).thenReturn(false)
+
+            val value = collectLastValue(underTest.actions)
+            runCurrent()
+
+            assertThat(value())
+                .isEqualTo(
+                    listOf(
+                        UserActionModel.ADD_USER,
+                        UserActionModel.ADD_SUPERVISED_USER,
+                        UserActionModel.NAVIGATE_TO_USER_MANAGEMENT,
+                    )
+                )
+        }
+    }
+
+    @Test
+    fun userIsNotRestrictedAndCannotAddUsers_actionsDoesNotIncludeAddUsers() {
+        createUserInteractor()
+        testScope.runTest {
+            val userInfos = createUserInfos(count = 2, includeGuest = false)
+
+            userRepository.setUserInfos(userInfos)
+            userRepository.setSelectedUserInfo(userInfos[0])
+            userRepository.setSettings(UserSwitcherSettingsModel(isUserSwitcherEnabled = true))
+            keyguardRepository.setKeyguardShowing(false)
+
+            whenever(manager.canAddMoreUsers(UserManager.USER_TYPE_FULL_SECONDARY))
+                .thenReturn(false)
+
+            val value = collectLastValue(underTest.actions)
+            runCurrent()
+
+            assertThat(value())
+                .isEqualTo(
+                    listOf(
+                        UserActionModel.ENTER_GUEST_MODE,
+                        UserActionModel.NAVIGATE_TO_USER_MANAGEMENT,
+                    )
+                )
+        }
+    }
+
+    @Test
+    fun systemUserHasRestrictions_addUserActionsNotAdded() {
+        createUserInteractor()
+        testScope.runTest {
+            val systemId = 0
+            val systemUser =
+                UserInfo(
+                    systemId,
+                    "system",
+                    /* iconPath= */ "",
+                    /* flags= */ UserInfo.FLAG_SYSTEM,
+                    UserManager.USER_TYPE_SYSTEM_HEADLESS,
+                )
+            val adminId = 10
+            val adminUser =
+                UserInfo(
+                    adminId,
+                    "admin",
+                    /* iconPath= */ "",
+                    /* flags= */ UserInfo.FLAG_ADMIN,
+                    UserManager.USER_TYPE_FULL_SYSTEM,
+                )
+
+            userRepository.setUserInfos(listOf(systemUser, adminUser))
+            userRepository.setSelectedUserInfo(adminUser)
+            userRepository.setSettings(UserSwitcherSettingsModel(isUserSwitcherEnabled = true))
+            keyguardRepository.setKeyguardShowing(false)
+
+            whenever(headlessSystemUserMode.isHeadlessSystemUserMode()).thenReturn(true)
+            whenever(
+                    manager.hasUserRestrictionForUser(
+                        UserManager.DISALLOW_ADD_USER,
+                        UserHandle.of(0)
+                    )
+                )
+                .thenReturn(true)
+
+            val value = collectLastValue(underTest.actions)
+            runCurrent()
+
+            assertThat(value()).isEqualTo(listOf(UserActionModel.NAVIGATE_TO_USER_MANAGEMENT))
+        }
+    }
+
     private fun assertUsers(
         models: List<UserModel>?,
         count: Int,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java
index 5206db4..11a53f75 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java
@@ -95,7 +95,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -272,50 +271,53 @@
     @Test
     @DisableFlags(FLAG_HAPTIC_VOLUME_SLIDER)
     public void testVolumeChange_noSliderHaptics_doesNotDeliverOnProgressChangedHaptics() {
-        // Initialize the dialog again with haptic sliders disabled
-        mDialog.init(0, null);
         final State shellState = createShellState();
         VolumeDialogController.StreamState musicStreamState =
                 shellState.states.get(AudioSystem.STREAM_MUSIC);
 
         mDialog.show(SHOW_REASON_UNKNOWN);
         mTestableLooper.processMessages(1); //Only the SHOW message
+        mDialog.removeDismissMessages(); // Temporarily remove the rescheduled DISMISS
 
         // Change the volume two times
         musicStreamState.level += 10;
         mDialog.onStateChangedH(shellState);
-        mAnimatorTestRule.advanceTimeBy(10);
         musicStreamState.level += 10;
         mDialog.onStateChangedH(shellState);
 
-        // expected: the type of the progress haptics for the stream should be DISABLED
-        short type = mDialog.progressHapticsForStream(AudioSystem.STREAM_MUSIC);
+        // expected: the type of the latest progress haptics for the stream should be DISABLED
+        int type = mDialog.progressHapticsForStream(AudioSystem.STREAM_MUSIC);
         assertEquals(VolumeDialogImpl.PROGRESS_HAPTICS_DISABLED, type);
+
+        mDialog.dismiss(DISMISS_REASON_UNKNOWN); // Dismiss
+        mTestableLooper.processAllMessages();
     }
 
-    @Ignore("Causing breakages so ignoring to resolve, b/329099861")
     @Test
     @EnableFlags(FLAG_HAPTIC_VOLUME_SLIDER)
     public void testVolumeChange_withSliderHaptics_deliversOnProgressChangedHapticsEagerly() {
-       // Initialize the dialog again to create haptic plugins on the rows with the flag enabled
-        mDialog.init(0, null);
+        // create haptic plugins on the rows with the flag enabled
+        mDialog.addSliderHapticsToRows();
         final State shellState = createShellState();
         VolumeDialogController.StreamState musicStreamState =
                 shellState.states.get(AudioSystem.STREAM_MUSIC);
 
         mDialog.show(SHOW_REASON_UNKNOWN);
         mTestableLooper.processMessages(1); //Only the SHOW message
+        mDialog.removeDismissMessages(); // Temporarily remove the rescheduled DISMISS
 
         // Change the volume two times
         musicStreamState.level += 10;
         mDialog.onStateChangedH(shellState);
-        mAnimatorTestRule.advanceTimeBy(10);
         musicStreamState.level += 10;
         mDialog.onStateChangedH(shellState);
 
-        // expected: the type of the progress haptics for the stream should be EAGER
-        short type = mDialog.progressHapticsForStream(AudioSystem.STREAM_MUSIC);
+        // expected: the type of the latest progress haptics for the stream should be EAGER
+        int type = mDialog.progressHapticsForStream(AudioSystem.STREAM_MUSIC);
         assertEquals(VolumeDialogImpl.PROGRESS_HAPTICS_EAGER, type);
+
+        mDialog.dismiss(DISMISS_REASON_UNKNOWN); // Dismiss
+        mTestableLooper.processAllMessages();
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
index fccb936..dc5597a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java
@@ -29,6 +29,7 @@
 import static org.mockito.Mockito.when;
 
 import android.app.PendingIntent;
+import android.app.role.RoleManager;
 import android.content.Intent;
 import android.service.quickaccesswallet.GetWalletCardsRequest;
 import android.service.quickaccesswallet.QuickAccessWalletClient;
@@ -54,11 +55,14 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.List;
+
 @RunWith(AndroidTestingRunner.class)
 @TestableLooper.RunWithLooper
 @SmallTest
 public class QuickAccessWalletControllerTest extends SysuiTestCase {
 
+    private static final String WALLET_ROLE_HOLDER = "wallet.role.holder";
     @Mock
     private QuickAccessWalletClient mQuickAccessWalletClient;
     @Mock
@@ -69,6 +73,8 @@
     private ActivityStarter mActivityStarter;
     @Mock
     private ActivityTransitionAnimator.Controller mAnimationController;
+    @Mock
+    private RoleManager mRoleManager;
     @Captor
     private ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;
     @Captor
@@ -102,7 +108,8 @@
                 MoreExecutors.directExecutor(),
                 mSecureSettings,
                 mQuickAccessWalletClient,
-                mClock);
+                mClock,
+                mRoleManager);
     }
 
     @Test
@@ -113,6 +120,24 @@
     }
 
     @Test
+    public void walletRoleAvailable_isAvailable() {
+        when(mRoleManager.isRoleAvailable(eq(RoleManager.ROLE_WALLET))).thenReturn(true);
+        when(mRoleManager.getRoleHolders(eq(RoleManager.ROLE_WALLET)))
+                .thenReturn(List.of(WALLET_ROLE_HOLDER));
+
+        assertTrue(mController.isWalletRoleAvailable());
+    }
+
+    @Test
+    public void walletRoleAvailable_isNotAvailable() {
+        when(mRoleManager.isRoleAvailable(eq(RoleManager.ROLE_WALLET))).thenReturn(false);
+        when(mRoleManager.getRoleHolders(eq(RoleManager.ROLE_WALLET)))
+                .thenReturn(List.of(WALLET_ROLE_HOLDER));
+
+        assertFalse(mController.isWalletRoleAvailable());
+    }
+
+    @Test
     public void walletServiceUnavailable_walletNotEnabled() {
         when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractorTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractorTest.java
index 1125d41..0eba21a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/WallpaperLocalColorExtractorTest.java
@@ -16,9 +16,12 @@
 
 package com.android.systemui.wallpapers;
 
+import static com.android.window.flags.Flags.FLAG_OFFLOAD_COLOR_EXTRACTION;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyFloat;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doNothing;
@@ -32,6 +35,7 @@
 import android.graphics.Color;
 import android.graphics.Rect;
 import android.graphics.RectF;
+import android.platform.test.annotations.EnableFlags;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 
@@ -77,6 +81,7 @@
     private Executor mBackgroundExecutor;
 
     private int mColorsProcessed;
+    private int mLocalColorsProcessed;
     private int mMiniBitmapUpdatedCount;
     private int mActivatedCount;
     private int mDeactivatedCount;
@@ -93,6 +98,7 @@
 
     private void resetCounters() {
         mColorsProcessed = 0;
+        mLocalColorsProcessed = 0;
         mMiniBitmapUpdatedCount = 0;
         mActivatedCount = 0;
         mDeactivatedCount = 0;
@@ -112,10 +118,14 @@
                 new Object(),
                 new WallpaperLocalColorExtractor.WallpaperLocalColorExtractorCallback() {
                     @Override
+                    public void onColorsProcessed() {
+                        mColorsProcessed++;
+                    }
+                    @Override
                     public void onColorsProcessed(List<RectF> regions,
                             List<WallpaperColors> colors) {
                         assertThat(regions.size()).isEqualTo(colors.size());
-                        mColorsProcessed += regions.size();
+                        mLocalColorsProcessed += regions.size();
                     }
 
                     @Override
@@ -148,8 +158,10 @@
                 .when(spyColorExtractor)
                 .createMiniBitmap(any(Bitmap.class), anyInt(), anyInt());
 
-        doReturn(new WallpaperColors(Color.valueOf(0), Color.valueOf(0), Color.valueOf(0)))
-                .when(spyColorExtractor).getLocalWallpaperColors(any(Rect.class));
+        WallpaperColors colors = new WallpaperColors(
+                Color.valueOf(0), Color.valueOf(0), Color.valueOf(0));
+        doReturn(colors).when(spyColorExtractor).getLocalWallpaperColors(any(Rect.class));
+        doReturn(colors).when(spyColorExtractor).getWallpaperColors(any(Bitmap.class), anyFloat());
 
         return spyColorExtractor;
     }
@@ -244,7 +256,7 @@
 
             assertThat(mActivatedCount).isEqualTo(1);
             assertThat(mMiniBitmapUpdatedCount).isEqualTo(1);
-            assertThat(mColorsProcessed).isEqualTo(regions.size());
+            assertThat(mLocalColorsProcessed).isEqualTo(regions.size());
 
             spyColorExtractor.removeLocalColorAreas(regions);
             assertThat(mDeactivatedCount).isEqualTo(1);
@@ -329,12 +341,69 @@
                 spyColorExtractor.onBitmapChanged(newBitmap);
                 assertThat(mMiniBitmapUpdatedCount).isEqualTo(1);
             }
-            assertThat(mColorsProcessed).isEqualTo(regions.size());
+            assertThat(mLocalColorsProcessed).isEqualTo(regions.size());
         }
         spyColorExtractor.removeLocalColorAreas(regions);
         assertThat(mDeactivatedCount).isEqualTo(1);
     }
 
+    /**
+     * Test that after the bitmap changes, the colors are computed only if asked via onComputeColors
+     */
+    @Test
+    @EnableFlags(FLAG_OFFLOAD_COLOR_EXTRACTION)
+    public void testRecomputeColors() {
+        resetCounters();
+        Bitmap bitmap = getMockBitmap(HIGH_BMP_WIDTH, HIGH_BMP_HEIGHT);
+        WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor();
+        spyColorExtractor.onBitmapChanged(bitmap);
+        assertThat(mColorsProcessed).isEqualTo(0);
+        spyColorExtractor.onComputeColors();
+        assertThat(mColorsProcessed).isEqualTo(1);
+    }
+
+    /**
+     * Test that after onComputeColors is called, the colors are computed once the bitmap is loaded
+     */
+    @Test
+    @EnableFlags(FLAG_OFFLOAD_COLOR_EXTRACTION)
+    public void testRecomputeColorsBeforeBitmapLoaded() {
+        resetCounters();
+        Bitmap bitmap = getMockBitmap(HIGH_BMP_WIDTH, HIGH_BMP_HEIGHT);
+        WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor();
+        spyColorExtractor.onComputeColors();
+        spyColorExtractor.onBitmapChanged(bitmap);
+        assertThat(mColorsProcessed).isEqualTo(1);
+    }
+
+    /**
+     * Test that after the dim changes, the colors are computed if the bitmap is already loaded
+     */
+    @Test
+    @EnableFlags(FLAG_OFFLOAD_COLOR_EXTRACTION)
+    public void testRecomputeColorsOnDimChanged() {
+        resetCounters();
+        Bitmap bitmap = getMockBitmap(HIGH_BMP_WIDTH, HIGH_BMP_HEIGHT);
+        WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor();
+        spyColorExtractor.onBitmapChanged(bitmap);
+        spyColorExtractor.onDimAmountChanged(0.5f);
+        assertThat(mColorsProcessed).isEqualTo(1);
+    }
+
+    /**
+     * Test that after the dim changes, the colors will be recomputed once the bitmap is loaded
+     */
+    @Test
+    @EnableFlags(FLAG_OFFLOAD_COLOR_EXTRACTION)
+    public void testRecomputeColorsOnDimChangedBeforeBitmapLoaded() {
+        resetCounters();
+        Bitmap bitmap = getMockBitmap(HIGH_BMP_WIDTH, HIGH_BMP_HEIGHT);
+        WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor();
+        spyColorExtractor.onDimAmountChanged(0.3f);
+        spyColorExtractor.onBitmapChanged(bitmap);
+        assertThat(mColorsProcessed).isEqualTo(1);
+    }
+
     @Test
     public void testCleanUp() {
         resetCounters();
@@ -346,6 +415,6 @@
         assertThat(mMiniBitmapUpdatedCount).isEqualTo(1);
         spyColorExtractor.cleanUp();
         spyColorExtractor.addLocalColorsAreas(listOfRandomAreas(MIN_AREAS, MAX_AREAS));
-        assertThat(mColorsProcessed).isEqualTo(0);
+        assertThat(mLocalColorsProcessed).isEqualTo(0);
     }
 }
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 ec27f48..aabd4e9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -442,7 +442,9 @@
                 shadeRepository,
                 keyguardTransitionInteractor,
                 () -> sceneInteractor,
-                () -> mKosmos.getFromGoneTransitionInteractor());
+                () -> mKosmos.getFromGoneTransitionInteractor(),
+                () -> mKosmos.getSharedNotificationContainerInteractor(),
+                mTestScope);
 
         mFromLockscreenTransitionInteractor = mKosmos.getFromLockscreenTransitionInteractor();
         mFromPrimaryBouncerTransitionInteractor =
diff --git a/packages/SystemUI/tests/utils/kosmos/src/com/android/systemui/kosmos/Kosmos.kt b/packages/SystemUI/tests/utils/kosmos/src/com/android/systemui/kosmos/Kosmos.kt
new file mode 100644
index 0000000..685bb0a
--- /dev/null
+++ b/packages/SystemUI/tests/utils/kosmos/src/com/android/systemui/kosmos/Kosmos.kt
@@ -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 com.android.systemui.kosmos
+
+import kotlin.reflect.KProperty
+
+// (Historical note: The name Kosmos is meant to invoke "Kotlin", the "Object Mother" pattern
+//   (https://martinfowler.com/bliki/ObjectMother.html), and of course the Greek word "kosmos" for
+//   the "order of the world" (https://en.wiktionary.org/wiki/%CE%BA%CF%8C%CF%83%CE%BC%CE%BF%CF%82)
+
+/**
+ * Each Kosmos is its own self-contained set of fixtures, which may reference each other. Fixtures
+ * can be defined through extension properties in any file:
+ * ```
+ * // fixture that must be set:
+ * var Kosmos.context by Fixture<Context>()
+ *
+ * // fixture with overrideable default.
+ * var Kosmos.landscapeMode by Fixture { false }
+ *
+ * // fixture forbidding override (note `val`, and referencing context fixture from above)
+ * val Kosmos.lifecycleScope by Fixture { context.lifecycleScope }
+ * ```
+ *
+ * To use the fixtures, create an instance of Kosmos and retrieve the values you need:
+ * ```
+ * val k = Kosmos()
+ * k.context = mContext
+ * val underTest = YourInteractor(
+ *     context = k.context,
+ *     landscapeMode = k.landscapeMode,
+ * )
+ * ```
+ */
+interface Kosmos {
+    /**
+     * Lookup a fixture in the Kosmos by [name], using [creator] to instantiate and store one if
+     * there is none present.
+     */
+    fun <T> get(name: String, creator: (Kosmos.() -> T)?): T
+
+    /** Sets the [value] of a fixture with the given [name]. */
+    fun set(name: String, value: Any?)
+
+    /**
+     * A value in the kosmos that has a single value once it's read. It can be overridden before
+     * first use only; all objects that are dependent on this fixture will get the same value.
+     *
+     * Example classic uses would be a clock, filesystem, or singleton controller.
+     *
+     * If no [creator] parameter is provided, the fixture must be set before use.
+     */
+    class Fixture<T>(private val creator: (Kosmos.() -> T)? = null) {
+        operator fun getValue(thisRef: Kosmos, property: KProperty<*>): T =
+            thisRef.get(property.name, creator)
+
+        operator fun setValue(thisRef: Kosmos, property: KProperty<*>, value: T) {
+            thisRef.set(property.name, value)
+        }
+    }
+}
+
+/** Constructs a fresh Kosmos. */
+fun Kosmos(): Kosmos = KosmosRegistry()
+
+private class KosmosRegistry : Kosmos {
+    val map: MutableMap<String, Any?> = mutableMapOf()
+    val gotten: MutableSet<String> = mutableSetOf()
+
+    override fun <T> get(name: String, creator: (Kosmos.() -> T)?): T {
+        gotten.add(name)
+        if (name !in map) {
+            checkNotNull(creator) { "Fixture $name has no default, and is read before set." }
+            map[name] = creator()
+        }
+        @Suppress("UNCHECKED_CAST") return map[name] as T
+    }
+
+    override fun set(name: String, value: Any?) {
+        check(name !in gotten) { "Tried to set fixture '$name' after it's already been read." }
+        map[name] = value
+    }
+}
diff --git a/packages/SystemUI/tests/utils/src/android/os/PowerManagerKosmos.kt b/packages/SystemUI/tests/utils/src/android/os/PowerManagerKosmos.kt
new file mode 100644
index 0000000..4ddbb45
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/android/os/PowerManagerKosmos.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 android.os
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
+
+var Kosmos.powerManager by Kosmos.Fixture { mock<PowerManager>() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/SysUITestModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/SysUITestModule.kt
index bc0bf9d..de7b14d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/SysUITestModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/SysUITestModule.kt
@@ -32,6 +32,7 @@
 import com.android.systemui.deviceentry.domain.interactor.SystemUIDeviceEntryFaceAuthInteractor
 import com.android.systemui.scene.SceneContainerFrameworkModule
 import com.android.systemui.scene.shared.flag.SceneContainerFlags
+import com.android.systemui.scene.shared.model.SceneContainerConfig
 import com.android.systemui.scene.shared.model.SceneDataSource
 import com.android.systemui.scene.shared.model.SceneDataSourceDelegator
 import com.android.systemui.shade.domain.interactor.BaseShadeInteractor
@@ -45,6 +46,7 @@
 import javax.inject.Provider
 import kotlin.coroutines.CoroutineContext
 import kotlin.coroutines.EmptyCoroutineContext
+import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.CoroutineStart
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
@@ -71,7 +73,10 @@
     @Binds @Main fun bindMainResources(resources: Resources): Resources
     @Binds fun bindBroadcastDispatcher(fake: FakeBroadcastDispatcher): BroadcastDispatcher
     @Binds @SysUISingleton fun bindsShadeInteractor(sii: ShadeInteractorImpl): ShadeInteractor
-    @Binds fun bindSceneDataSource(delegator: SceneDataSourceDelegator): SceneDataSource
+
+    @Binds
+    @SysUISingleton
+    fun bindSceneDataSource(delegator: SceneDataSourceDelegator): SceneDataSource
 
     @Binds
     fun provideFaceAuthInteractor(
@@ -109,6 +114,15 @@
                 sceneContainerOff.get()
             }
         }
+
+        @Provides
+        @SysUISingleton
+        fun providesSceneDataSourceDelegator(
+            @Application applicationScope: CoroutineScope,
+            config: SceneContainerConfig,
+        ): SceneDataSourceDelegator {
+            return SceneDataSourceDelegator(applicationScope, config)
+        }
     }
 }
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt
index 3d84291..65dd411d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt
@@ -28,6 +28,7 @@
 import com.android.keyguard.KeyguardUpdateMonitor
 import com.android.keyguard.KeyguardViewController
 import com.android.systemui.animation.DialogTransitionAnimator
+import com.android.systemui.biometrics.AuthController
 import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
 import com.android.systemui.communal.domain.interactor.CommunalInteractor
 import com.android.systemui.demomode.DemoModeController
@@ -85,6 +86,7 @@
     @get:Provides val activityStarter: ActivityStarter = mock(),
     @get:Provides val activityManagerWrapper: ActivityManagerWrapper = mock(),
     @get:Provides val ambientState: AmbientState = mock(),
+    @get:Provides val authController: AuthController = mock(),
     @get:Provides val bubbles: Optional<Bubbles> = Optional.of(mock()),
     @get:Provides val darkIconDispatcher: DarkIconDispatcher = mock(),
     @get:Provides val demoModeController: DemoModeController = mock(),
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorKosmos.kt
index 34a9c8a..d1709d6 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/domain/interactor/FingerprintPropertyInteractorKosmos.kt
@@ -30,5 +30,6 @@
         repository = fingerprintPropertyRepository,
         configurationInteractor = configurationInteractor,
         displayStateInteractor = displayStateInteractor,
+        udfpsOverlayInteractor = udfpsOverlayInteractor,
     )
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelKosmos.kt
index 9cbe633..2ae6f542 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelKosmos.kt
@@ -17,6 +17,7 @@
 package com.android.systemui.biometrics.ui.viewmodel
 
 import android.content.applicationContext
+import com.android.systemui.biometrics.domain.interactor.biometricStatusInteractor
 import com.android.systemui.biometrics.domain.interactor.displayStateInteractor
 import com.android.systemui.biometrics.domain.interactor.promptSelectorInteractor
 import com.android.systemui.biometrics.domain.interactor.udfpsOverlayInteractor
@@ -30,6 +31,7 @@
         promptSelectorInteractor = promptSelectorInteractor,
         context = applicationContext,
         udfpsOverlayInteractor = udfpsOverlayInteractor,
+        biometricStatusInteractor = biometricStatusInteractor,
         udfpsUtils = udfpsUtils
     )
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorKosmos.kt
index c4fc30d..070a369 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorKosmos.kt
@@ -19,7 +19,10 @@
 import com.android.keyguard.keyguardUpdateMonitor
 import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
 import com.android.systemui.bouncer.data.repository.keyguardBouncerRepository
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryFingerprintAuthInteractor
 import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
+import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.plugins.statusbar.statusBarStateController
@@ -37,6 +40,9 @@
             biometricSettingsRepository = biometricSettingsRepository,
             systemClock = systemClock,
             keyguardUpdateMonitor = keyguardUpdateMonitor,
+            deviceEntryFingerprintAuthInteractor = { deviceEntryFingerprintAuthInteractor },
+            keyguardInteractor = { keyguardInteractor },
+            keyguardTransitionInteractor = { keyguardTransitionInteractor },
             scope = testScope.backgroundScope,
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/BrightnessPolicyRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/BrightnessPolicyRepositoryKosmos.kt
new file mode 100644
index 0000000..2e5ddc7
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/BrightnessPolicyRepositoryKosmos.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.brightness.data.repository
+
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.fakeBrightnessPolicyRepository by Kosmos.Fixture { FakeBrightnessPolicyRepository() }
+
+var Kosmos.brightnessPolicyRepository: BrightnessPolicyRepository by
+    Kosmos.Fixture { fakeBrightnessPolicyRepository }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/FakeBrightnessPolicyRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/FakeBrightnessPolicyRepository.kt
new file mode 100644
index 0000000..d3ceb15
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/FakeBrightnessPolicyRepository.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.brightness.data.repository
+
+import com.android.settingslib.RestrictedLockUtils
+import com.android.systemui.utils.PolicyRestriction
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+
+class FakeBrightnessPolicyRepository : BrightnessPolicyRepository {
+    private val _restrictionPolicy: MutableStateFlow<PolicyRestriction> =
+        MutableStateFlow(PolicyRestriction.NoRestriction)
+    override val restrictionPolicy = _restrictionPolicy.asStateFlow()
+
+    fun setCurrentUserUnrestricted() {
+        _restrictionPolicy.value = PolicyRestriction.NoRestriction
+    }
+
+    fun setCurrentUserRestricted() {
+        _restrictionPolicy.value =
+            PolicyRestriction.Restricted(
+                RestrictedLockUtils.EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(
+                    BrightnessPolicyRepository.RESTRICTION
+                )
+            )
+    }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/FakeScreenBrightnessRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/FakeScreenBrightnessRepository.kt
new file mode 100644
index 0000000..a05b5e6
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/FakeScreenBrightnessRepository.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.brightness.data.repository
+
+import android.hardware.display.BrightnessInfo
+import android.hardware.display.BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE
+import android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF
+import com.android.systemui.brightness.data.model.LinearBrightness
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.map
+
+class FakeScreenBrightnessRepository(
+    initialBrightnessInfo: BrightnessInfo =
+        BrightnessInfo(0f, 0f, 1f, HIGH_BRIGHTNESS_MODE_OFF, 1f, BRIGHTNESS_MAX_REASON_NONE)
+) : ScreenBrightnessRepository {
+
+    private val brightnessInfo = MutableStateFlow(initialBrightnessInfo)
+    private val _temporaryBrightness =
+        MutableStateFlow(LinearBrightness(initialBrightnessInfo.brightness))
+    val temporaryBrightness = _temporaryBrightness.asStateFlow()
+    override val linearBrightness = brightnessInfo.map { LinearBrightness(it.brightness) }
+    override val minLinearBrightness = brightnessInfo.map { LinearBrightness(it.brightnessMinimum) }
+    override val maxLinearBrightness = brightnessInfo.map { LinearBrightness(it.brightnessMaximum) }
+
+    override suspend fun getMinMaxLinearBrightness(): Pair<LinearBrightness, LinearBrightness> {
+        return minMaxLinearBrightness()
+    }
+
+    private fun minMaxLinearBrightness(): Pair<LinearBrightness, LinearBrightness> {
+        return with(brightnessInfo.value) {
+            LinearBrightness(brightnessMinimum) to LinearBrightness(brightnessMaximum)
+        }
+    }
+
+    override fun setTemporaryBrightness(value: LinearBrightness) {
+        val bounds = minMaxLinearBrightness()
+        val clampedValue = value.clamp(bounds.first, bounds.second)
+        _temporaryBrightness.value = clampedValue
+    }
+
+    override fun setBrightness(value: LinearBrightness) {
+        val bounds = minMaxLinearBrightness()
+        val clampedValue = value.clamp(bounds.first, bounds.second)
+        _temporaryBrightness.value = clampedValue
+        brightnessInfo.value =
+            with(brightnessInfo.value) {
+                BrightnessInfo(
+                    clampedValue.floatValue,
+                    brightnessMinimum,
+                    brightnessMaximum,
+                    highBrightnessMode,
+                    highBrightnessTransitionPoint,
+                    brightnessMaxReason,
+                )
+            }
+    }
+
+    fun setMinMaxBrightness(min: LinearBrightness, max: LinearBrightness) {
+        check(min.floatValue <= max.floatValue)
+        val clampedBrightness = LinearBrightness(brightnessInfo.value.brightness).clamp(min, max)
+        _temporaryBrightness.value = clampedBrightness
+        brightnessInfo.value =
+            with(brightnessInfo.value) {
+                BrightnessInfo(
+                    clampedBrightness.floatValue,
+                    min.floatValue,
+                    max.floatValue,
+                    highBrightnessMode,
+                    highBrightnessTransitionPoint,
+                    brightnessMaxReason
+                )
+            }
+    }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepositoryKosmos.kt
new file mode 100644
index 0000000..c5b0eb2
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepositoryKosmos.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.brightness.data.repository
+
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.fakeScreenBrightnessRepository: FakeScreenBrightnessRepository by
+    Kosmos.Fixture { FakeScreenBrightnessRepository() }
+
+var Kosmos.screenBrightnessRepository: ScreenBrightnessRepository by
+    Kosmos.Fixture { fakeScreenBrightnessRepository }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/domain/interactor/BrightnessPolicyEnforcementInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/domain/interactor/BrightnessPolicyEnforcementInteractorKosmos.kt
new file mode 100644
index 0000000..9d3c8d2
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/domain/interactor/BrightnessPolicyEnforcementInteractorKosmos.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.brightness.domain.interactor
+
+import com.android.systemui.brightness.data.repository.brightnessPolicyRepository
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.plugins.activityStarter
+
+val Kosmos.brightnessPolicyEnforcementInteractor by
+    Kosmos.Fixture {
+        BrightnessPolicyEnforcementInteractor(brightnessPolicyRepository, activityStarter)
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorKosmos.kt
new file mode 100644
index 0000000..22784e4
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorKosmos.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.brightness.domain.interactor
+
+import com.android.systemui.brightness.data.repository.screenBrightnessRepository
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.screenBrightnessInteractor by
+    Kosmos.Fixture { ScreenBrightnessInteractor(screenBrightnessRepository) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/BroadcastSenderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/BroadcastSenderKosmos.kt
new file mode 100644
index 0000000..42ad679
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/BroadcastSenderKosmos.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.broadcast
+
+import android.content.applicationContext
+import com.android.systemui.concurrency.fakeExecutor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.wakelock.WakeLockFake
+
+val Kosmos.mockBroadcastSender by Kosmos.Fixture { mock<BroadcastSender>() }
+var Kosmos.broadcastSender by
+    Kosmos.Fixture {
+        BroadcastSender(applicationContext, WakeLockFake.Builder(applicationContext), fakeExecutor)
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalRepository.kt
index 5ff588f..9f5c6b8 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/data/repository/FakeCommunalRepository.kt
@@ -2,6 +2,7 @@
 
 import com.android.compose.animation.scene.ObservableTransitionState
 import com.android.compose.animation.scene.SceneKey
+import com.android.compose.animation.scene.TransitionKey
 import com.android.systemui.communal.shared.model.CommunalScenes
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -17,11 +18,11 @@
 @OptIn(ExperimentalCoroutinesApi::class)
 class FakeCommunalRepository(
     applicationScope: CoroutineScope,
-    override val desiredScene: MutableStateFlow<SceneKey> =
+    override val currentScene: MutableStateFlow<SceneKey> =
         MutableStateFlow(CommunalScenes.Default),
 ) : CommunalRepository {
-    override fun setDesiredScene(desiredScene: SceneKey) {
-        this.desiredScene.value = desiredScene
+    override fun changeScene(toScene: SceneKey, transitionKey: TransitionKey?) {
+        this.currentScene.value = toScene
     }
 
     private val defaultTransitionState = ObservableTransitionState.Idle(CommunalScenes.Default)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalInteractorKosmos.kt
index 8866fd3..c3848db 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/domain/interactor/CommunalInteractorKosmos.kt
@@ -33,7 +33,7 @@
 import com.android.systemui.log.logcatLogBuffer
 import com.android.systemui.plugins.activityStarter
 import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
+import com.android.systemui.scene.shared.flag.sceneContainerFlags
 import com.android.systemui.settings.userTracker
 import com.android.systemui.smartspace.data.repository.smartspaceRepository
 import com.android.systemui.user.data.repository.fakeUserRepository
@@ -58,7 +58,7 @@
         tableLogBuffer = mock(),
         communalSettingsInteractor = communalSettingsInteractor,
         sceneInteractor = sceneInteractor,
-        sceneContainerFlags = fakeSceneContainerFlags,
+        sceneContainerFlags = sceneContainerFlags,
     )
 }
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryRepository.kt
index 77caeaa..045bd5d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryRepository.kt
@@ -21,7 +21,6 @@
 import javax.inject.Inject
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.asStateFlow
 
 /** Fake implementation of [DeviceEntryRepository] */
 @SysUISingleton
@@ -31,21 +30,10 @@
     private val _isBypassEnabled = MutableStateFlow(false)
     override val isBypassEnabled: StateFlow<Boolean> = _isBypassEnabled
 
-    private val _isUnlocked = MutableStateFlow(false)
-    override val isUnlocked: StateFlow<Boolean> = _isUnlocked.asStateFlow()
-
     override suspend fun isLockscreenEnabled(): Boolean {
         return isLockscreenEnabled
     }
 
-    override fun reportSuccessfulAuthentication() {
-        _isUnlocked.value = true
-    }
-
-    fun setUnlocked(isUnlocked: Boolean) {
-        _isUnlocked.value = isUnlocked
-    }
-
     fun setLockscreenEnabled(isLockscreenEnabled: Boolean) {
         this.isLockscreenEnabled = isLockscreenEnabled
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt
index e73e295..bff10a1 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorKosmos.kt
@@ -23,7 +23,6 @@
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.applicationCoroutineScope
 import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.scene.shared.flag.sceneContainerFlags
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 
 @ExperimentalCoroutinesApi
@@ -35,11 +34,10 @@
             authenticationInteractor = authenticationInteractor,
             sceneInteractor = sceneInteractor,
             faceAuthInteractor = deviceEntryFaceAuthInteractor,
-            trustInteractor = trustInteractor,
-            flags = sceneContainerFlags,
-            deviceUnlockedInteractor = deviceUnlockedInteractor,
             fingerprintAuthInteractor = deviceEntryFingerprintAuthInteractor,
             biometricSettingsInteractor = deviceEntryBiometricSettingsInteractor,
+            trustInteractor = trustInteractor,
+            deviceUnlockedInteractor = deviceUnlockedInteractor,
             systemPropertiesHelper = fakeSystemPropertiesHelper,
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractorKosmos.kt
index df1cdc2..14210bc 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceUnlockedInteractorKosmos.kt
@@ -18,14 +18,20 @@
 
 import com.android.systemui.authentication.domain.interactor.authenticationInteractor
 import com.android.systemui.deviceentry.data.repository.deviceEntryRepository
+import com.android.systemui.keyguard.domain.interactor.trustInteractor
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.Kosmos.Fixture
 import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.power.domain.interactor.powerInteractor
 
 val Kosmos.deviceUnlockedInteractor by Fixture {
     DeviceUnlockedInteractor(
         applicationScope = applicationCoroutineScope,
         authenticationInteractor = authenticationInteractor,
         deviceEntryRepository = deviceEntryRepository,
+        trustInteractor = trustInteractor,
+        faceAuthInteractor = deviceEntryFaceAuthInteractor,
+        fingerprintAuthInteractor = deviceEntryFingerprintAuthInteractor,
+        powerInteractor = powerInteractor,
     )
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeDisplayRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeDisplayRepository.kt
index 0fc0a3c..6c3cf91 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeDisplayRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeDisplayRepository.kt
@@ -23,6 +23,8 @@
 import javax.inject.Inject
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
 import org.mockito.Mockito.`when` as whenever
 
 /** Creates a mock display. */
@@ -69,12 +71,20 @@
     override val pendingDisplay: Flow<DisplayRepository.PendingDisplay?>
         get() = pendingDisplayFlow
 
+    val _defaultDisplayOff: MutableStateFlow<Boolean> = MutableStateFlow(false)
+    override val defaultDisplayOff: Flow<Boolean>
+        get() = _defaultDisplayOff.asStateFlow()
+
     override val displayAdditionEvent: Flow<Display?>
         get() = displayAdditionEventFlow
 
     private val _displayChangeEvent = MutableSharedFlow<Int>(replay = 1)
     override val displayChangeEvent: Flow<Int> = _displayChangeEvent
     suspend fun emitDisplayChangeEvent(displayId: Int) = _displayChangeEvent.emit(displayId)
+
+    fun setDefaultDisplayOff(defaultDisplayOff: Boolean) {
+        _defaultDisplayOff.value = defaultDisplayOff
+    }
 }
 
 @Module
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/BrokenWithSceneContainer.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/BrokenWithSceneContainer.kt
new file mode 100644
index 0000000..29b088b
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/BrokenWithSceneContainer.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.flags
+
+import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
+
+/**
+ * This is used by [SceneContainerRule] to assert that the test is broken when
+ * [FLAG_SCENE_CONTAINER] is enabled.
+ */
+@Retention(AnnotationRetention.RUNTIME)
+@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
+annotation class BrokenWithSceneContainer(val bugId: Int)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt
index f65c74f..e83205c5 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt
@@ -18,10 +18,14 @@
 
 import android.platform.test.annotations.EnableFlags
 import com.android.systemui.Flags.FLAG_COMPOSE_LOCKSCREEN
+import com.android.systemui.Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR
 import com.android.systemui.Flags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR
 import com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR
 import com.android.systemui.Flags.FLAG_MEDIA_IN_SCENE_CONTAINER
 import com.android.systemui.Flags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT
+import com.android.systemui.Flags.FLAG_NOTIFICATIONS_HEADS_UP_REFACTOR
+import com.android.systemui.Flags.FLAG_PREDICTIVE_BACK_SYSUI
+import com.android.systemui.Flags.FLAG_REFACTOR_KEYGUARD_DISMISS_INTENT
 import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
 
 /**
@@ -29,12 +33,16 @@
  * that feature. It is also picked up by [SceneContainerRule] to set non-aconfig prerequisites.
  */
 @EnableFlags(
-    FLAG_SCENE_CONTAINER,
-    FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR,
-    FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT,
     FLAG_COMPOSE_LOCKSCREEN,
-    FLAG_MEDIA_IN_SCENE_CONTAINER,
+    FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR,
     FLAG_KEYGUARD_WM_STATE_REFACTOR,
+    FLAG_MEDIA_IN_SCENE_CONTAINER,
+    FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT,
+    FLAG_NOTIFICATIONS_HEADS_UP_REFACTOR,
+    FLAG_PREDICTIVE_BACK_SYSUI,
+    FLAG_SCENE_CONTAINER,
+    FLAG_DEVICE_ENTRY_UDFPS_REFACTOR,
+    FLAG_REFACTOR_KEYGUARD_DISMISS_INTENT,
 )
 @Retention(AnnotationRetention.RUNTIME)
 @Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerFlagParameterization.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerFlagParameterization.kt
new file mode 100644
index 0000000..4e24233
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerFlagParameterization.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.flags
+
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.FlagsParameterization
+import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
+
+/** The name of the one flag to be disabled for OFF parameterization */
+private const val flagNameToDisable = FLAG_SCENE_CONTAINER
+
+/** Cache of the flags to be enabled for ON parameterization */
+private val flagNamesToEnable =
+    EnableSceneContainer::class.java.getAnnotation(EnableFlags::class.java)!!.value.toList()
+
+/**
+ * Provides one or two copies of this [FlagsParameterization]; one which disabled
+ * [FLAG_SCENE_CONTAINER] and if none of the dependencies of it are disabled by this, a second copy
+ * which enables [FLAG_SCENE_CONTAINER] and all the dependencies (just like [EnableSceneContainer]).
+ */
+fun FlagsParameterization.andSceneContainer(): Sequence<FlagsParameterization> = sequence {
+    check(flagNameToDisable !in mOverrides) {
+        "Can't add $flagNameToDisable to FlagsParameterization: $this"
+    }
+    yield(FlagsParameterization(mOverrides + mapOf(flagNameToDisable to false)))
+    if (flagNamesToEnable.all { mOverrides[it] != false }) {
+        // Can't add the parameterization of enabling SceneContainerFlag to a parameterization that
+        // explicitly disables one of the prerequisite flags.
+        yield(FlagsParameterization(mOverrides + flagNamesToEnable.associateWith { true }))
+    }
+}
+
+/**
+ * Doubles (roughly; see below) the given list of [FlagsParameterization] for enabling and disabling
+ * SceneContainerFlag.
+ *
+ * The input parameterization may not define [FLAG_SCENE_CONTAINER].
+ *
+ * Any [FlagsParameterization] which disables any flag that is a dependency of
+ * [FLAG_SCENE_CONTAINER], will not add a state for enabling, and the state will simply be converted
+ * to one which disables. Just like [EnableSceneContainer], enabling will also enable all the other
+ * dependencies. For any flag parameterization where a dependency is disabled, an "enabled"
+ * parameterization is inconsistent, so it will not be added.
+ */
+fun List<FlagsParameterization>.andSceneContainer(): List<FlagsParameterization> =
+    flatMap { it.andSceneContainer() }.toList()
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerRule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerRule.kt
index 4e05de2..9ec1481 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerRule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerRule.kt
@@ -16,16 +16,15 @@
 
 package com.android.systemui.flags
 
-import android.util.Log
 import com.android.systemui.scene.shared.flag.SceneContainerFlag
 import org.junit.Assert
-import org.junit.Assume
+import org.junit.AssumptionViolatedException
 import org.junit.rules.TestRule
 import org.junit.runner.Description
 import org.junit.runners.model.Statement
 
 /**
- * Should always be used with [SetFlagsRule] and should be ordered after it.
+ * Should always be used with `SetFlagsRule` and should be ordered after it.
  *
  * Used to ensure tests annotated with [EnableSceneContainer] can actually get `true` from
  * [SceneContainerFlag.isEnabled].
@@ -35,15 +34,7 @@
         return object : Statement() {
             @Throws(Throwable::class)
             override fun evaluate() {
-                val initialEnabledValue = Flags.SCENE_CONTAINER_ENABLED
-                val hasAnnotation =
-                    description?.testClass?.getAnnotation(EnableSceneContainer::class.java) !=
-                        null || description?.getAnnotation(EnableSceneContainer::class.java) != null
-                if (hasAnnotation) {
-                    Assume.assumeTrue(
-                        "Couldn't set Flags.SCENE_CONTAINER_ENABLED for @EnableSceneContainer test",
-                        trySetSceneContainerEnabled(true)
-                    )
+                if (description.hasAnnotation<EnableSceneContainer>()) {
                     Assert.assertTrue(
                         "SceneContainerFlag.isEnabled is false:" +
                             "\n * Did you forget to add a new aconfig flag dependency in" +
@@ -52,33 +43,31 @@
                         SceneContainerFlag.isEnabled
                     )
                 }
-                try {
-                    base?.evaluate()
-                } finally {
-                    if (hasAnnotation) {
-                        trySetSceneContainerEnabled(initialEnabledValue)
-                    }
+                if (
+                    description.hasAnnotation<BrokenWithSceneContainer>() &&
+                        SceneContainerFlag.isEnabled
+                ) {
+                    runCatching { base?.evaluate() }
+                        .onFailure { exception ->
+                            if (exception is AssumptionViolatedException) {
+                                throw AssertionError(
+                                    "This is marked @BrokenWithSceneContainer, but was skipped.",
+                                    exception
+                                )
+                            }
+                            throw AssumptionViolatedException("Test is still broken", exception)
+                        }
+                    throw AssertionError(
+                        "HOORAY! You fixed a test that was marked @BrokenWithSceneContainer. " +
+                            "Remove the obsolete annotation to fix this failure."
+                    )
                 }
+                base?.evaluate()
             }
         }
     }
 
-    companion object {
-        fun trySetSceneContainerEnabled(enabled: Boolean): Boolean {
-            if (Flags.SCENE_CONTAINER_ENABLED == enabled) {
-                return true
-            }
-            return try {
-                // TODO(b/283300105): remove this reflection setting once the hard-coded
-                //  Flags.SCENE_CONTAINER_ENABLED is no longer needed.
-                val field = Flags::class.java.getField("SCENE_CONTAINER_ENABLED")
-                field.isAccessible = true
-                field.set(null, enabled) // note: this does not work with multivalent tests
-                true
-            } catch (t: Throwable) {
-                Log.e("SceneContainerRule", "Unable to set SCENE_CONTAINER_ENABLED=$enabled", t)
-                false
-            }
-        }
-    }
+    inline fun <reified T : Annotation> Description?.hasAnnotation(): Boolean =
+        this?.testClass?.getAnnotation(T::class.java) != null ||
+            this?.getAnnotation(T::class.java) != null
 }
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 de6bfb2..a242368 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
@@ -32,7 +32,9 @@
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.channels.BufferOverflow
 import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.SharedFlow
+import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.TestCoroutineScheduler
 import kotlinx.coroutines.test.TestScope
@@ -41,11 +43,21 @@
 /** Fake implementation of [KeyguardTransitionRepository] */
 @SysUISingleton
 class FakeKeyguardTransitionRepository @Inject constructor() : KeyguardTransitionRepository {
-
     private val _transitions =
         MutableSharedFlow<TransitionStep>(replay = 3, onBufferOverflow = BufferOverflow.DROP_OLDEST)
     override val transitions: SharedFlow<TransitionStep> = _transitions
 
+    private val _currentTransitionInfo: MutableStateFlow<TransitionInfo> =
+        MutableStateFlow(
+            TransitionInfo(
+                ownerName = "",
+                from = KeyguardState.OFF,
+                to = KeyguardState.LOCKSCREEN,
+                animator = null
+            )
+        )
+    override var currentTransitionInfoInternal = _currentTransitionInfo.asStateFlow()
+
     init {
         // Seed the fake repository with the same initial steps the actual repository uses.
         KeyguardTransitionRepositoryImpl.initialTransitionSteps.forEach { _transitions.tryEmit(it) }
@@ -159,6 +171,11 @@
             ),
         validateStep: Boolean = true
     ) {
+        if (step.transitionState == TransitionState.STARTED) {
+            _currentTransitionInfo.value =
+                TransitionInfo(from = step.from, to = step.to, animator = null, ownerName = "")
+        }
+
         _transitions.replayCache.last().let { lastStep ->
             if (
                 validateStep &&
@@ -201,7 +218,8 @@
         }
     }
 
-    override fun startTransition(info: TransitionInfo): UUID? {
+    override suspend fun startTransition(info: TransitionInfo): UUID? {
+        _currentTransitionInfo.value = info
         return if (info.animator == null) UUID.randomUUID() else null
     }
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt
index d791e94..12165cd 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt
@@ -20,4 +20,4 @@
 import com.android.systemui.kosmos.Kosmos
 
 val Kosmos.keyguardClockInteractor by
-    Kosmos.Fixture { KeyguardClockInteractor(keyguardClockRepository = keyguardClockRepository) }
+    Kosmos.Fixture { KeyguardClockInteractor(keyguardClockRepository) }
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
new file mode 100644
index 0000000..2c6d44f
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissActionInteractorKosmos.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.keyguard.domain.interactor
+
+import com.android.systemui.keyguard.data.repository.keyguardRepository
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+@ExperimentalCoroutinesApi
+val Kosmos.keyguardDismissActionInteractor by
+    Kosmos.Fixture {
+        KeyguardDismissActionInteractor(
+            repository = keyguardRepository,
+            transitionInteractor = keyguardTransitionInteractor,
+            dismissInteractor = keyguardDismissInteractor,
+            applicationScope = testScope.backgroundScope,
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorFactory.kt
index 5f5d428..7eef704 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorFactory.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorFactory.kt
@@ -28,6 +28,7 @@
 import com.android.systemui.bouncer.ui.BouncerView
 import com.android.systemui.classifier.FalsingCollector
 import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
+import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
 import com.android.systemui.keyguard.DismissCallbackRegistry
 import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
 import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
@@ -85,6 +86,9 @@
                 FakeBiometricSettingsRepository(),
                 FakeSystemClock(),
                 keyguardUpdateMonitor,
+                { mock(DeviceEntryFingerprintAuthInteractor::class.java) },
+                { mock(KeyguardInteractor::class.java) },
+                { mock(KeyguardTransitionInteractor::class.java) },
                 testScope.backgroundScope,
             )
         val powerInteractorWithDeps =
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorKosmos.kt
new file mode 100644
index 0000000..f33ca95
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorKosmos.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.keyguard.domain.interactor
+
+import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor
+import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
+import com.android.systemui.keyguard.data.repository.keyguardRepository
+import com.android.systemui.keyguard.data.repository.trustRepository
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.power.domain.interactor.powerInteractor
+import com.android.systemui.user.domain.interactor.selectedUserInteractor
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+@ExperimentalCoroutinesApi
+val Kosmos.keyguardDismissInteractor by
+    Kosmos.Fixture {
+        KeyguardDismissInteractor(
+            trustRepository = trustRepository,
+            keyguardRepository = keyguardRepository,
+            primaryBouncerInteractor = primaryBouncerInteractor,
+            alternateBouncerInteractor = alternateBouncerInteractor,
+            powerInteractor = powerInteractor,
+            selectedUserInteractor = selectedUserInteractor,
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt
index 00cdc33..e21c766 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt
@@ -24,15 +24,20 @@
 import com.android.systemui.keyguard.data.repository.FakeCommandQueue
 import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
 import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.kosmos.testScope
 import com.android.systemui.power.domain.interactor.PowerInteractor
 import com.android.systemui.power.domain.interactor.PowerInteractorFactory
 import com.android.systemui.scene.domain.interactor.SceneInteractor
 import com.android.systemui.scene.shared.flag.FakeSceneContainerFlags
 import com.android.systemui.scene.shared.flag.SceneContainerFlags
 import com.android.systemui.shade.data.repository.FakeShadeRepository
+import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor
+import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor.ConfigurationBasedDimensions
 import com.android.systemui.util.mockito.mock
 import com.android.systemui.util.mockito.whenever
+import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.test.TestScope
 
 /**
  * Simply put, I got tired of adding a constructor argument and then having to tweak dozens of
@@ -52,13 +57,33 @@
         shadeRepository: FakeShadeRepository = FakeShadeRepository(),
         sceneInteractor: SceneInteractor = mock(),
         fromGoneTransitionInteractor: FromGoneTransitionInteractor = mock(),
+        sharedNotificationContainerInteractor: SharedNotificationContainerInteractor? = null,
         powerInteractor: PowerInteractor = PowerInteractorFactory.create().powerInteractor,
+        testScope: CoroutineScope = TestScope(),
     ): WithDependencies {
-        // Mock this until the class is replaced by kosmos
-        val keyguardTransitionInteractor: KeyguardTransitionInteractor = mock()
+        // Mock these until they are replaced by kosmos
         val currentKeyguardStateFlow = MutableSharedFlow<KeyguardState>()
-        whenever(keyguardTransitionInteractor.currentKeyguardState)
-            .thenReturn(currentKeyguardStateFlow)
+        val keyguardTransitionInteractor =
+            mock<KeyguardTransitionInteractor>().also {
+                whenever(it.currentKeyguardState).thenReturn(currentKeyguardStateFlow)
+            }
+        val configurationDimensionFlow = MutableSharedFlow<ConfigurationBasedDimensions>()
+        configurationDimensionFlow.tryEmit(
+            ConfigurationBasedDimensions(
+                useSplitShade = false,
+                useLargeScreenHeader = false,
+                marginHorizontal = 0,
+                marginBottom = 0,
+                marginTop = 0,
+                marginTopLargeScreen = 0,
+                keyguardSplitShadeTopMargin = 0,
+            )
+        )
+        val sncInteractor =
+            sharedNotificationContainerInteractor
+                ?: mock<SharedNotificationContainerInteractor>().also {
+                    whenever(it.configurationBasedDimensions).thenReturn(configurationDimensionFlow)
+                }
         return WithDependencies(
             repository = repository,
             commandQueue = commandQueue,
@@ -79,6 +104,8 @@
                 keyguardTransitionInteractor = keyguardTransitionInteractor,
                 powerInteractor = powerInteractor,
                 fromGoneTransitionInteractor = { fromGoneTransitionInteractor },
+                sharedNotificationContainerInteractor = { sncInteractor },
+                applicationScope = testScope,
             ),
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt
index d61bc9f..2a0c01c 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt
@@ -20,11 +20,13 @@
 import com.android.systemui.common.ui.domain.interactor.configurationInteractor
 import com.android.systemui.keyguard.data.repository.keyguardRepository
 import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testScope
 import com.android.systemui.power.domain.interactor.powerInteractor
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.shared.flag.sceneContainerFlags
 import com.android.systemui.shade.data.repository.shadeRepository
 import com.android.systemui.statusbar.commandQueue
+import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor
 
 val Kosmos.keyguardInteractor: KeyguardInteractor by
     Kosmos.Fixture {
@@ -39,5 +41,7 @@
             keyguardTransitionInteractor = keyguardTransitionInteractor,
             sceneInteractorProvider = { sceneInteractor },
             fromGoneTransitionInteractor = { fromGoneTransitionInteractor },
+            sharedNotificationContainerInteractor = { sharedNotificationContainerInteractor },
+            applicationScope = testScope.backgroundScope,
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelKosmos.kt
index c909dd6..b943298 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModelKosmos.kt
@@ -21,11 +21,13 @@
 import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.statusbar.sysuiStatusBarStateController
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 
 val Kosmos.alternateBouncerToGoneTransitionViewModel by Fixture {
     AlternateBouncerToGoneTransitionViewModel(
         bouncerToGoneFlows = bouncerToGoneFlows,
         animationFlow = keyguardTransitionAnimationFlow,
+        statusBarStateController = sysuiStatusBarStateController,
     )
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelKosmos.kt
new file mode 100644
index 0000000..92cfbef
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelKosmos.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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor
+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
+
+val Kosmos.alternateBouncerWindowViewModel by Fixture {
+    AlternateBouncerWindowViewModel(
+        alternateBouncerInteractor = alternateBouncerInteractor,
+        keyguardTransitionInteractor = keyguardTransitionInteractor,
+    )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsKosmos.kt
index ffa4133..9774e4a 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsKosmos.kt
@@ -19,21 +19,19 @@
 package com.android.systemui.keyguard.ui.viewmodel
 
 import com.android.systemui.bouncer.domain.interactor.mockPrimaryBouncerInteractor
-import com.android.systemui.flags.featureFlagsClassic
+import com.android.systemui.keyguard.domain.interactor.keyguardDismissActionInteractor
 import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.Kosmos.Fixture
 import com.android.systemui.shade.domain.interactor.shadeInteractor
 import com.android.systemui.statusbar.sysuiStatusBarStateController
-import com.android.systemui.util.mockito.mock
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 
 val Kosmos.bouncerToGoneFlows by Fixture {
     BouncerToGoneFlows(
         statusBarStateController = sysuiStatusBarStateController,
         primaryBouncerInteractor = mockPrimaryBouncerInteractor,
-        keyguardDismissActionInteractor = mock(),
-        featureFlags = featureFlagsClassic,
+        keyguardDismissActionInteractor = { keyguardDismissActionInteractor },
         shadeInteractor = shadeInteractor,
         animationFlow = keyguardTransitionAnimationFlow,
     )
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 b91aafe..f856d27 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
@@ -62,6 +62,7 @@
         lockscreenToPrimaryBouncerTransitionViewModel =
             lockscreenToPrimaryBouncerTransitionViewModel,
         occludedToAodTransitionViewModel = occludedToAodTransitionViewModel,
+        occludedToDozingTransitionViewModel = occludedToDozingTransitionViewModel,
         occludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel,
         primaryBouncerToAodTransitionViewModel = primaryBouncerToAodTransitionViewModel,
         primaryBouncerToGoneTransitionViewModel = primaryBouncerToGoneTransitionViewModel,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelKosmos.kt
index f0fedd2..1e25f7f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelKosmos.kt
@@ -20,6 +20,7 @@
 import com.android.systemui.keyguard.domain.interactor.keyguardBlueprintInteractor
 import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor
 import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
 import com.android.systemui.shade.domain.interactor.shadeInteractor
 
 val Kosmos.lockscreenContentViewModel by
@@ -30,5 +31,6 @@
             authController = authController,
             longPress = keyguardLongPressViewModel,
             shadeInteractor = shadeInteractor,
+            applicationScope = applicationCoroutineScope,
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelKosmos.kt
index 17c3a14..7a023ee 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelKosmos.kt
@@ -19,11 +19,13 @@
 import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.statusbar.sysuiStatusBarStateController
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 
 @ExperimentalCoroutinesApi
 val Kosmos.lockscreenToGoneTransitionViewModel by Fixture {
     LockscreenToGoneTransitionViewModel(
         animationFlow = keyguardTransitionAnimationFlow,
+        statusBarStateController = sysuiStatusBarStateController,
     )
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToDozingTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToDozingTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..a05e606
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToDozingTransitionViewModelKosmos.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.
+ */
+
+@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.occludedToDozingTransitionViewModel by Fixture {
+    OccludedToDozingTransitionViewModel(
+        animationFlow = keyguardTransitionAnimationFlow,
+    )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelKosmos.kt
index 4ecff73..d6edea2 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelKosmos.kt
@@ -19,20 +19,18 @@
 package com.android.systemui.keyguard.ui.viewmodel
 
 import com.android.systemui.bouncer.domain.interactor.mockPrimaryBouncerInteractor
-import com.android.systemui.flags.featureFlagsClassic
+import com.android.systemui.keyguard.domain.interactor.keyguardDismissActionInteractor
 import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.Kosmos.Fixture
 import com.android.systemui.statusbar.sysuiStatusBarStateController
-import com.android.systemui.util.mockito.mock
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 
 val Kosmos.primaryBouncerToGoneTransitionViewModel by Fixture {
     PrimaryBouncerToGoneTransitionViewModel(
         statusBarStateController = sysuiStatusBarStateController,
         primaryBouncerInteractor = mockPrimaryBouncerInteractor,
-        keyguardDismissActionInteractor = mock(),
-        featureFlags = featureFlagsClassic,
+        keyguardDismissActionInteractor = { keyguardDismissActionInteractor },
         bouncerToGoneFlows = bouncerToGoneFlows,
         animationFlow = keyguardTransitionAnimationFlow,
     )
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/Kosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/Kosmos.kt
deleted file mode 100644
index c74cdd4..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/Kosmos.kt
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.android.systemui.kosmos
-
-import kotlin.reflect.KProperty
-
-// (Historical note: The name Kosmos is meant to invoke "Kotlin", the "Object Mother" pattern
-//   (https://martinfowler.com/bliki/ObjectMother.html), and of course the Greek word "kosmos" for
-//   the "order of the world" (https://en.wiktionary.org/wiki/%CE%BA%CF%8C%CF%83%CE%BC%CE%BF%CF%82)
-/**
- * Each Kosmos is its own self-contained set of fixtures, which may reference each other. Fixtures
- * can be defined through extension properties in any file:
- * ```
- * // fixture that must be set:
- * var Kosmos.context by Fixture<Context>()
- *
- * // fixture with overrideable default.
- * var Kosmos.landscapeMode by Fixture { false }
- *
- * // fixture forbidding override (note `val`, and referencing context fixture from above)
- * val Kosmos.lifecycleScope by Fixture { context.lifecycleScope }
- * ```
- *
- * To use the fixtures, create an instance of Kosmos and retrieve the values you need:
- * ```
- * val k = Kosmos()
- * k.context = mContext
- * val underTest = YourInteractor(
- *     context = k.context,
- *     landscapeMode = k.landscapeMode,
- * )
- * ```
- */
-class Kosmos {
-    private val map: MutableMap<String, Any?> = mutableMapOf()
-    private val gotten: MutableSet<String> = mutableSetOf()
-
-    /**
-     * A value in the kosmos that has a single value once it's read. It can be overridden before
-     * first use only; all objects that are dependent on this fixture will get the same value.
-     *
-     * Example classic uses would be a clock, filesystem, or singleton controller.
-     *
-     * If no [creator] parameter is provided, the fixture must be set before use.
-     */
-    class Fixture<T>(private val creator: (Kosmos.() -> T)? = null) {
-        operator fun getValue(thisRef: Kosmos, property: KProperty<*>): T {
-            thisRef.gotten.add(property.name)
-            @Suppress("UNCHECKED_CAST")
-            if (!thisRef.map.contains(property.name)) {
-                if (creator == null) {
-                    throw IllegalStateException(
-                        "Fixture ${property.name} has no default, and is read before set."
-                    )
-                } else {
-                    val nonNullCreator = creator
-                    // The Kotlin compiler seems to need this odd workaround
-                    thisRef.map[property.name] = thisRef.nonNullCreator()
-                }
-            }
-            return thisRef.map[property.name] as T
-        }
-
-        operator fun setValue(thisRef: Kosmos, property: KProperty<*>, value: T) {
-            check(!thisRef.gotten.contains(property.name)) {
-                "Tried to set fixture '${property.name}' after it's already been read."
-            }
-            thisRef.map[property.name] = value
-        }
-    }
-}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
index c879588..a46d358 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
@@ -39,6 +39,7 @@
 import com.android.systemui.keyguard.domain.interactor.fromGoneTransitionInteractor
 import com.android.systemui.keyguard.domain.interactor.fromLockscreenTransitionInteractor
 import com.android.systemui.keyguard.domain.interactor.fromPrimaryBouncerTransitionInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor
 import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
 import com.android.systemui.model.sceneContainerPlugin
 import com.android.systemui.plugins.statusbar.statusBarStateController
@@ -47,7 +48,10 @@
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 import com.android.systemui.scene.sceneContainerConfig
 import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
+import com.android.systemui.scene.shared.flag.sceneContainerFlags
 import com.android.systemui.scene.shared.model.sceneDataSource
+import com.android.systemui.settings.brightness.domain.interactor.brightnessMirrorShowingInteractor
+import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor
 import com.android.systemui.statusbar.phone.screenOffAnimationController
 import com.android.systemui.statusbar.pipeline.mobile.data.repository.fakeMobileConnectionsRepository
 import com.android.systemui.statusbar.policy.data.repository.fakeDeviceProvisioningRepository
@@ -67,6 +71,7 @@
     val testScope by lazy { kosmos.testScope }
     val fakeFeatureFlags by lazy { kosmos.fakeFeatureFlagsClassic }
     val fakeSceneContainerFlags by lazy { kosmos.fakeSceneContainerFlags }
+    val sceneContainerFlags by lazy { kosmos.sceneContainerFlags }
     val fakeExecutor by lazy { kosmos.fakeExecutor }
     val fakeExecutorHandler by lazy { kosmos.fakeExecutorHandler }
     val configurationRepository by lazy { kosmos.fakeConfigurationRepository }
@@ -100,6 +105,11 @@
     val fromGoneTransitionInteractor by lazy { kosmos.fromGoneTransitionInteractor }
     val globalActionsInteractor by lazy { kosmos.globalActionsInteractor }
     val sceneDataSource by lazy { kosmos.sceneDataSource }
+    val keyguardClockInteractor by lazy { kosmos.keyguardClockInteractor }
+    val sharedNotificationContainerInteractor by lazy {
+        kosmos.sharedNotificationContainerInteractor
+    }
+    val brightnessMirrorShowingInteractor by lazy { kosmos.brightnessMirrorShowingInteractor }
 
     init {
         kosmos.applicationContext = testCase.context
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractorKosmos.kt
new file mode 100644
index 0000000..29c5bd5
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractorKosmos.kt
@@ -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.systemui.media.controls.domain.pipeline.interactor
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.media.controls.data.repository.mediaFilterRepository
+import com.android.systemui.media.controls.domain.pipeline.mediaDataProcessor
+import com.android.systemui.media.controls.util.mediaInstanceId
+
+val Kosmos.mediaControlInteractor by
+    Kosmos.Fixture {
+        MediaControlInteractor(
+            instanceId = mediaInstanceId,
+            repository = mediaFilterRepository,
+            mediaDataProcessor = mediaDataProcessor,
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractorKosmos.kt
new file mode 100644
index 0000000..1edd405
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractorKosmos.kt
@@ -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.systemui.media.controls.domain.pipeline.interactor
+
+import android.content.applicationContext
+import com.android.systemui.broadcast.broadcastSender
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.media.controls.data.repository.mediaFilterRepository
+import com.android.systemui.media.controls.domain.pipeline.mediaDataProcessor
+import com.android.systemui.plugins.activityStarter
+
+val Kosmos.mediaRecommendationsInteractor by
+    Kosmos.Fixture {
+        MediaRecommendationsInteractor(
+            applicationScope = applicationCoroutineScope,
+            applicationContext = applicationContext,
+            repository = mediaFilterRepository,
+            mediaDataProcessor = mediaDataProcessor,
+            broadcastSender = broadcastSender,
+            activityStarter = activityStarter,
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModelKosmos.kt
new file mode 100644
index 0000000..34a5277
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/ui/viewmodel/MediaRecommendationsViewModelKosmos.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.media.controls.ui.viewmodel
+
+import android.content.applicationContext
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.media.controls.domain.pipeline.interactor.mediaRecommendationsInteractor
+import com.android.systemui.media.controls.util.mediaUiEventLogger
+
+val Kosmos.mediaRecommendationsViewModel by
+    Kosmos.Fixture {
+        MediaRecommendationsViewModel(
+            applicationContext = applicationContext,
+            backgroundDispatcher = testDispatcher,
+            interactor = mediaRecommendationsInteractor,
+            logger = mediaUiEventLogger,
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/util/MediaInstanceIdKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/util/MediaInstanceIdKosmos.kt
new file mode 100644
index 0000000..923eaa1
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/util/MediaInstanceIdKosmos.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.media.controls.util
+
+import com.android.internal.logging.InstanceId
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.mediaInstanceId: InstanceId by Kosmos.Fixture { InstanceId.fakeInstanceId(123) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/model/SceneContainerPluginKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/model/SceneContainerPluginKosmos.kt
index b1027b9..d19dfe8 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/model/SceneContainerPluginKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/model/SceneContainerPluginKosmos.kt
@@ -18,6 +18,12 @@
 
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor
 import com.android.systemui.scene.domain.interactor.sceneInteractor
 
-val Kosmos.sceneContainerPlugin by Fixture { SceneContainerPlugin { sceneInteractor } }
+val Kosmos.sceneContainerPlugin by Fixture {
+    SceneContainerPlugin(
+        sceneInteractor = { sceneInteractor },
+        occlusionInteractor = { sceneContainerOcclusionInteractor },
+    )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/model/SysUiStateKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/model/SysUiStateKosmos.kt
new file mode 100644
index 0000000..8faeb39
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/model/SysUiStateKosmos.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.model
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.settings.displayTracker
+
+val Kosmos.sysUiState by Fixture {
+    SysUiState(
+        displayTracker,
+        sceneContainerPlugin,
+    )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/statusbar/StatusBarStateControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/statusbar/StatusBarStateControllerKosmos.kt
index 7264f7a2..695e594 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/statusbar/StatusBarStateControllerKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/plugins/statusbar/StatusBarStateControllerKosmos.kt
@@ -19,13 +19,15 @@
 import com.android.internal.logging.uiEventLogger
 import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
 import com.android.systemui.jank.interactionJankMonitor
+import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor
 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.statusbar.StatusBarStateControllerImpl
+import com.android.systemui.statusbar.SysuiStatusBarStateController
 import com.android.systemui.util.mockito.mock
 
-var Kosmos.statusBarStateController by
+var Kosmos.statusBarStateController: SysuiStatusBarStateController by
     Kosmos.Fixture {
         StatusBarStateControllerImpl(
             uiEventLogger,
@@ -34,5 +36,6 @@
             { shadeInteractor },
             { deviceUnlockedInteractor },
             { sceneInteractor },
+            { keyguardClockInteractor },
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/QuickSettingsKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/QuickSettingsKosmos.kt
index 1ce2610..0de76c8 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/QuickSettingsKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/QuickSettingsKosmos.kt
@@ -35,7 +35,6 @@
 import com.android.systemui.qs.footer.domain.interactor.FooterActionsInteractorImpl
 import com.android.systemui.qs.footer.foregroundServicesRepository
 import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel
-import com.android.systemui.qs.tiles.di.NewQSTileFactory
 import com.android.systemui.security.data.repository.securityRepository
 import com.android.systemui.settings.userTracker
 import com.android.systemui.statusbar.policy.deviceProvisionedController
@@ -49,7 +48,6 @@
     QsEventLoggerFake(uiEventLoggerFake, instanceIdSequenceFake)
 }
 
-var Kosmos.newQSTileFactory by Fixture<NewQSTileFactory>()
 var Kosmos.qsTileFactory by Fixture<QSFactory>()
 
 val Kosmos.fgsManagerController by Fixture { FakeFgsManagerController() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorKosmos.kt
index 9ef44c4..b870039 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorKosmos.kt
@@ -21,7 +21,6 @@
 import com.android.systemui.kosmos.testDispatcher
 import com.android.systemui.qs.external.customTileStatePersister
 import com.android.systemui.qs.external.tileLifecycleManagerFactory
-import com.android.systemui.qs.newQSTileFactory
 import com.android.systemui.qs.pipeline.data.repository.customTileAddedRepository
 import com.android.systemui.qs.pipeline.data.repository.installedTilesRepository
 import com.android.systemui.qs.pipeline.data.repository.minimumTilesRepository
@@ -29,6 +28,7 @@
 import com.android.systemui.qs.pipeline.shared.logging.qsLogger
 import com.android.systemui.qs.pipeline.shared.pipelineFlagsRepository
 import com.android.systemui.qs.qsTileFactory
+import com.android.systemui.qs.tiles.di.newQSTileFactory
 import com.android.systemui.settings.userTracker
 import com.android.systemui.user.data.repository.userRepository
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/interactor/FakeDisabledByPolicyInteractor.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/interactor/FakeDisabledByPolicyInteractor.kt
index 62765d1..fb6ba20 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/interactor/FakeDisabledByPolicyInteractor.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/interactor/FakeDisabledByPolicyInteractor.kt
@@ -17,16 +17,21 @@
 package com.android.systemui.qs.tiles.base.interactor
 
 import android.os.UserHandle
+import com.android.settingslib.RestrictedLockUtils
 
 class FakeDisabledByPolicyInteractor : DisabledByPolicyInteractor {
 
-    var policyResult: DisabledByPolicyInteractor.PolicyResult =
-        DisabledByPolicyInteractor.PolicyResult.TileEnabled
-
     override suspend fun isDisabled(
         user: UserHandle,
         userRestriction: String?
-    ): DisabledByPolicyInteractor.PolicyResult = policyResult
+    ): DisabledByPolicyInteractor.PolicyResult =
+        if (userRestriction == DISABLED_RESTRICTION || userRestriction == DISABLED_RESTRICTION_2) {
+            DisabledByPolicyInteractor.PolicyResult.TileDisabled(
+                RestrictedLockUtils.EnforcedAdmin()
+            )
+        } else {
+            DisabledByPolicyInteractor.PolicyResult.TileEnabled
+        }
 
     override fun handlePolicyResult(
         policyResult: DisabledByPolicyInteractor.PolicyResult
@@ -35,4 +40,10 @@
             is DisabledByPolicyInteractor.PolicyResult.TileEnabled -> false
             is DisabledByPolicyInteractor.PolicyResult.TileDisabled -> true
         }
+
+    companion object {
+        const val DISABLED_RESTRICTION = "disabled_restriction"
+        const val DISABLED_RESTRICTION_2 = "disabled_restriction_2"
+        const val ENABLED_RESTRICTION = "test_restriction"
+    }
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/di/NewQSTileFactoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/di/NewQSTileFactoryKosmos.kt
new file mode 100644
index 0000000..5c4b390
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/di/NewQSTileFactoryKosmos.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.qs.tiles.di
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.qs.tiles.viewmodel.QSTileViewModel
+import com.android.systemui.qs.tiles.viewmodel.qSTileConfigProvider
+import com.android.systemui.qs.tiles.viewmodel.qsTileViewModelAdaperFactory
+import com.android.systemui.util.mockito.mock
+import javax.inject.Provider
+import org.mockito.Mockito
+
+var Kosmos.newFactoryTileMap by Kosmos.Fixture { emptyMap<String, Provider<QSTileViewModel>>() }
+
+val Kosmos.newQSTileFactory by
+    Kosmos.Fixture {
+        NewQSTileFactory(
+            qSTileConfigProvider,
+            qsTileViewModelAdaperFactory,
+            newFactoryTileMap,
+            mock(Mockito.withSettings().defaultAnswer(Mockito.RETURNS_MOCKS)),
+            mock(Mockito.withSettings().defaultAnswer(Mockito.RETURNS_MOCKS)),
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/impl/sensorprivacy/SensorPrivacyTileKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/impl/sensorprivacy/SensorPrivacyTileKosmos.kt
new file mode 100644
index 0000000..b7e31db
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/impl/sensorprivacy/SensorPrivacyTileKosmos.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.tiles.impl.sensorprivacy
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.qs.qsEventLogger
+import com.android.systemui.statusbar.policy.PolicyModule
+
+val Kosmos.qsCameraSensorPrivacyToggleTileConfig by
+    Kosmos.Fixture { PolicyModule.provideCameraToggleTileConfig(qsEventLogger) }
+
+val Kosmos.qsMicrophoneSensorPrivacyToggleTileConfig by
+    Kosmos.Fixture { PolicyModule.provideMicrophoneToggleTileConfig(qsEventLogger) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfigProviderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfigProviderKosmos.kt
new file mode 100644
index 0000000..1d57979
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfigProviderKosmos.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.qs.tiles.viewmodel
+
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.fakeQSTileConfigProvider by Kosmos.Fixture { FakeQSTileConfigProvider() }
+var Kosmos.qSTileConfigProvider: QSTileConfigProvider by Kosmos.Fixture { fakeQSTileConfigProvider }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapterKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapterKosmos.kt
new file mode 100644
index 0000000..a908765
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapterKosmos.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.qs.tiles.viewmodel
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.util.mockito.mock
+
+val Kosmos.qsTileViewModelAdaperFactory by
+    Kosmos.Fixture {
+        object : QSTileViewModelAdapter.Factory {
+            override fun create(qsTileViewModel: QSTileViewModel): QSTileViewModelAdapter {
+                return QSTileViewModelAdapter(
+                    applicationCoroutineScope,
+                    mock(),
+                    qsTileViewModel,
+                )
+            }
+        }
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
index 4d902fa..a654d6f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
@@ -18,6 +18,7 @@
 
 import android.content.Context
 import android.view.View
+import com.android.systemui.settings.brightness.MirrorController
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
@@ -41,6 +42,9 @@
     private val _navBarPadding = MutableStateFlow<Int>(0)
     val navBarPadding = _navBarPadding.asStateFlow()
 
+    var brightnessMirrorController: MirrorController? = null
+        private set
+
     override var isQsFullyCollapsed: Boolean = true
 
     override suspend fun inflate(context: Context) {
@@ -60,4 +64,12 @@
     override suspend fun applyBottomNavBarPadding(padding: Int) {
         _navBarPadding.value = padding
     }
+
+    override fun requestCloseCustomizer() {
+        _customizing.value = false
+    }
+
+    override fun setBrightnessMirrorController(mirrorController: MirrorController?) {
+        brightnessMirrorController = mirrorController
+    }
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractorKosmos.kt
new file mode 100644
index 0000000..9bd5581
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractorKosmos.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.scene.domain.interactor
+
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.statusbar.domain.interactor.keyguardOcclusionInteractor
+
+val Kosmos.sceneContainerOcclusionInteractor by Fixture {
+    SceneContainerOcclusionInteractor(
+        applicationScope = applicationCoroutineScope,
+        keyguardOcclusionInteractor = keyguardOcclusionInteractor,
+        sceneInteractor = sceneInteractor,
+        keyguardTransitionInteractor = keyguardTransitionInteractor,
+    )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/settings/BrightnessSliderControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/BrightnessSliderControllerKosmos.kt
new file mode 100644
index 0000000..8b7e5d8
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/BrightnessSliderControllerKosmos.kt
@@ -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.systemui.settings
+
+import com.android.internal.logging.uiEventLogger
+import com.android.systemui.classifier.falsingManager
+import com.android.systemui.haptics.vibratorHelper
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.plugins.activityStarter
+import com.android.systemui.settings.brightness.BrightnessSliderController
+import com.android.systemui.util.time.systemClock
+
+/** This factory creates empty mocks. */
+var Kosmos.brightnessSliderControllerFactory by
+    Kosmos.Fixture<BrightnessSliderController.Factory> {
+        BrightnessSliderController.Factory(
+            falsingManager,
+            uiEventLogger,
+            vibratorHelper,
+            systemClock,
+            activityStarter,
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/settings/DisplayTrackerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/DisplayTrackerKosmos.kt
new file mode 100644
index 0000000..7ac9680
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/DisplayTrackerKosmos.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.settings
+
+import android.content.applicationContext
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+
+val Kosmos.displayTracker by Fixture {
+    FakeDisplayTracker(
+        context = applicationContext,
+    )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/settings/brightness/data/repository/BrightnessMirrorShowingRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/brightness/data/repository/BrightnessMirrorShowingRepositoryKosmos.kt
new file mode 100644
index 0000000..6db46499
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/brightness/data/repository/BrightnessMirrorShowingRepositoryKosmos.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.settings.brightness.data.repository
+
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.brightnessMirrorShowingRepository by
+    Kosmos.Fixture { BrightnessMirrorShowingRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/settings/brightness/domain/interactor/BrightnessMirrorShowingInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/brightness/domain/interactor/BrightnessMirrorShowingInteractorKosmos.kt
new file mode 100644
index 0000000..8f6b829
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/brightness/domain/interactor/BrightnessMirrorShowingInteractorKosmos.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.settings.brightness.domain.interactor
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.settings.brightness.data.repository.brightnessMirrorShowingRepository
+
+val Kosmos.brightnessMirrorShowingInteractor by
+    Kosmos.Fixture { BrightnessMirrorShowingInteractor(brightnessMirrorShowingRepository) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/settings/brightness/ui/viewmodel/BrightnessMirrorViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/brightness/ui/viewmodel/BrightnessMirrorViewModelKosmos.kt
new file mode 100644
index 0000000..8fb370c
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/brightness/ui/viewmodel/BrightnessMirrorViewModelKosmos.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.settings.brightness.ui.viewmodel
+
+import android.content.res.mainResources
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.settings.brightness.domain.interactor.brightnessMirrorShowingInteractor
+import com.android.systemui.settings.brightness.ui.viewModel.BrightnessMirrorViewModel
+import com.android.systemui.settings.brightnessSliderControllerFactory
+
+val Kosmos.brightnessMirrorViewModel by
+    Kosmos.Fixture {
+        BrightnessMirrorViewModel(
+            brightnessMirrorShowingInteractor,
+            mainResources,
+            brightnessSliderControllerFactory,
+        )
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeControllerKosmos.kt
index 16c5b72..d08855f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeControllerKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeControllerKosmos.kt
@@ -18,16 +18,17 @@
 
 package com.android.systemui.shade
 
-import android.view.WindowManager
 import com.android.systemui.assist.AssistManager
 import com.android.systemui.concurrency.fakeExecutor
 import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
+import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.applicationCoroutineScope
 import com.android.systemui.kosmos.testDispatcher
 import com.android.systemui.log.LogBuffer
 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.domain.interactor.shadeInteractor
 import com.android.systemui.statusbar.CommandQueue
 import com.android.systemui.statusbar.NotificationShadeWindowController
@@ -58,6 +59,7 @@
             statusBarKeyguardViewManager = mock<StatusBarKeyguardViewManager>(),
             notificationShadeWindowController = mock<NotificationShadeWindowController>(),
             assistManagerLazy = { mock<AssistManager>() },
+            deviceUnlockedInteractor = deviceUnlockedInteractor,
         )
     }
 
@@ -66,7 +68,6 @@
         ShadeControllerImpl(
             mock<CommandQueue>(),
             fakeExecutor,
-            mock<LogBuffer>(),
             windowRootViewVisibilityInteractor,
             mock<KeyguardStateController>(),
             statusBarStateController,
@@ -74,10 +75,17 @@
             mock<StatusBarWindowController>(),
             deviceProvisionedController,
             mock<NotificationShadeWindowController>(),
-            mock<WindowManager>(),
+            0,
             { mock<NotificationPanelViewController>() },
             { mock<AssistManager>() },
             { mock<NotificationGutsManager>() },
         )
     }
-var Kosmos.shadeController: ShadeController by Kosmos.Fixture { shadeControllerImpl }
+var Kosmos.shadeController: ShadeController by
+    Kosmos.Fixture {
+        if (SceneContainerFlag.isEnabled) {
+            shadeControllerSceneImpl
+        } else {
+            shadeControllerImpl
+        }
+    }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt
index b99fdb9..b85858d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt
@@ -21,15 +21,29 @@
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.Kosmos.Fixture
 import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.shade.ShadeExpansionStateManager
 import com.android.systemui.shade.data.repository.shadeRepository
+import com.android.systemui.shade.domain.interactor.panelExpansionInteractor
+import com.android.systemui.shade.transition.ScrimShadeTransitionController
 import com.android.systemui.statusbar.policy.splitShadeStateController
+import com.android.systemui.util.mockito.mock
+
+@Deprecated("ShadeExpansionStateManager is deprecated. Remove your dependency on it instead.")
+val Kosmos.shadeExpansionStateManager by Fixture { ShadeExpansionStateManager() }
 
 val Kosmos.shadeStartable by Fixture {
     ShadeStartable(
         applicationScope = applicationCoroutineScope,
         applicationContext = applicationContext,
+        touchLog = mock<LogBuffer>(),
         configurationRepository = configurationRepository,
         shadeRepository = shadeRepository,
-        controller = splitShadeStateController,
+        splitShadeStateController = splitShadeStateController,
+        scrimShadeTransitionController = mock<ScrimShadeTransitionController>(),
+        sceneInteractorProvider = { sceneInteractor },
+        panelExpansionInteractorProvider = { panelExpansionInteractor },
+        shadeExpansionStateManager = shadeExpansionStateManager,
     )
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/KeyguardOcclusionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/KeyguardOcclusionInteractorKosmos.kt
index d793740..a90a9ff 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/KeyguardOcclusionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/KeyguardOcclusionInteractorKosmos.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.domain.interactor
 
+import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
 import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
 import com.android.systemui.keyguard.domain.interactor.KeyguardOcclusionInteractor
 import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
@@ -27,10 +28,11 @@
 val Kosmos.keyguardOcclusionInteractor by
     Kosmos.Fixture {
         KeyguardOcclusionInteractor(
-            scope = testScope.backgroundScope,
+            applicationScope = testScope.backgroundScope,
             repository = keyguardOcclusionRepository,
             powerInteractor = powerInteractor,
             transitionInteractor = keyguardTransitionInteractor,
             keyguardInteractor = keyguardInteractor,
+            deviceUnlockedInteractor = { deviceUnlockedInteractor },
         )
     }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepositoryKosmos.kt
new file mode 100644
index 0000000..3e54e3d
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepositoryKosmos.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.statusbar.notification.stack.data.repository
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+
+val Kosmos.notificationPlaceholderRepository by Fixture { NotificationPlaceholderRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt
deleted file mode 100644
index 4073902..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt
+++ /dev/null
@@ -1,24 +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.data.repository
-
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.Kosmos.Fixture
-
-val Kosmos.notificationStackAppearanceRepository by Fixture {
-    NotificationStackAppearanceRepository()
-}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepositoryKosmos.kt
new file mode 100644
index 0000000..6c16c2c
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepositoryKosmos.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.statusbar.notification.stack.data.repository
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+
+val Kosmos.notificationViewHeightRepository by Fixture { NotificationViewHeightRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorKosmos.kt
index 5605d10..dbfd9de 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorKosmos.kt
@@ -19,11 +19,13 @@
 import com.android.systemui.kosmos.Kosmos
 import com.android.systemui.kosmos.Kosmos.Fixture
 import com.android.systemui.shade.domain.interactor.shadeInteractor
-import com.android.systemui.statusbar.notification.stack.data.repository.notificationStackAppearanceRepository
+import com.android.systemui.statusbar.notification.stack.data.repository.notificationPlaceholderRepository
+import com.android.systemui.statusbar.notification.stack.data.repository.notificationViewHeightRepository
 
 val Kosmos.notificationStackAppearanceInteractor by Fixture {
     NotificationStackAppearanceInteractor(
-        repository = notificationStackAppearanceRepository,
+        viewHeightRepository = notificationViewHeightRepository,
+        placeholderRepository = notificationPlaceholderRepository,
         shadeInteractor = shadeInteractor,
     )
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModelKosmos.kt
new file mode 100644
index 0000000..10cc136
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModelKosmos.kt
@@ -0,0 +1,33 @@
+/*
+ * 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.viewmodel
+
+import com.android.systemui.dump.dumpManager
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.scene.domain.interactor.sceneInteractor
+import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackAppearanceInteractor
+
+val Kosmos.notificationScrollViewModel by Fixture {
+    NotificationScrollViewModel(
+        dumpManager = dumpManager,
+        stackAppearanceInteractor = notificationStackAppearanceInteractor,
+        shadeInteractor = shadeInteractor,
+        sceneInteractor = sceneInteractor,
+    )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt
deleted file mode 100644
index 7e63eaa..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt
+++ /dev/null
@@ -1,35 +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.viewmodel
-
-import com.android.systemui.dump.dumpManager
-import com.android.systemui.kosmos.Kosmos
-import com.android.systemui.kosmos.Kosmos.Fixture
-import com.android.systemui.kosmos.applicationCoroutineScope
-import com.android.systemui.scene.domain.interactor.sceneInteractor
-import com.android.systemui.shade.domain.interactor.shadeInteractor
-import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackAppearanceInteractor
-
-val Kosmos.notificationStackAppearanceViewModel by Fixture {
-    NotificationStackAppearanceViewModel(
-        applicationScope = applicationCoroutineScope,
-        dumpManager = dumpManager,
-        stackAppearanceInteractor = notificationStackAppearanceInteractor,
-        shadeInteractor = shadeInteractor,
-        sceneInteractor = sceneInteractor,
-    )
-}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelKosmos.kt
index 29faa58..b249211 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelKosmos.kt
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.notification.stack.ui.viewmodel
 
+import com.android.systemui.dump.dumpManager
 import com.android.systemui.flags.featureFlagsClassic
 import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
 import com.android.systemui.kosmos.Kosmos
@@ -26,6 +27,7 @@
 
 val Kosmos.notificationsPlaceholderViewModel by Fixture {
     NotificationsPlaceholderViewModel(
+        dumpManager = dumpManager,
         interactor = notificationStackAppearanceInteractor,
         shadeInteractor = shadeInteractor,
         flags = sceneContainerFlags,
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 de0cc65..d2de835 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
@@ -43,6 +43,7 @@
 import com.android.systemui.kosmos.Kosmos.Fixture
 import com.android.systemui.kosmos.applicationCoroutineScope
 import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackAppearanceInteractor
 import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 
@@ -55,6 +56,7 @@
         keyguardInteractor = keyguardInteractor,
         keyguardTransitionInteractor = keyguardTransitionInteractor,
         shadeInteractor = shadeInteractor,
+        notificationStackAppearanceInteractor = notificationStackAppearanceInteractor,
         alternateBouncerToGoneTransitionViewModel = alternateBouncerToGoneTransitionViewModel,
         aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel,
         aodToOccludedTransitionViewModel = aodToOccludedTransitionViewModel,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/FakeDeviceProvisionedController.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/FakeDeviceProvisionedController.kt
index ebcabf8..91b2956 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/FakeDeviceProvisionedController.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/FakeDeviceProvisionedController.kt
@@ -30,10 +30,6 @@
         return currentUser in usersSetup
     }
 
-    override fun isFrpActive(): Boolean {
-        TODO("Not yet implemented")
-    }
-
     fun setCurrentUser(userId: Int) {
         currentUser = userId
         callbacks.toSet().forEach { it.onUserSwitched() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/data/repository/FakeDeviceProvisioningRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/data/repository/FakeDeviceProvisioningRepository.kt
index fc6a800..9247e88 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/data/repository/FakeDeviceProvisioningRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/data/repository/FakeDeviceProvisioningRepository.kt
@@ -26,14 +26,9 @@
 class FakeDeviceProvisioningRepository @Inject constructor() : DeviceProvisioningRepository {
     private val _isDeviceProvisioned = MutableStateFlow(true)
     override val isDeviceProvisioned: Flow<Boolean> = _isDeviceProvisioned
-    private val _isFactoryResetProtectionActive = MutableStateFlow(false)
-    override val isFactoryResetProtectionActive: Flow<Boolean> = _isFactoryResetProtectionActive
     fun setDeviceProvisioned(isProvisioned: Boolean) {
         _isDeviceProvisioned.value = isProvisioned
     }
-    fun setFactoryResetProtectionActive(isActive: Boolean) {
-        _isFactoryResetProtectionActive.value = isActive
-    }
 }
 
 @Module
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/unfold/FullscreenLightRevealAnimationKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/unfold/FullscreenLightRevealAnimationKosmos.kt
new file mode 100644
index 0000000..43d6c48
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/unfold/FullscreenLightRevealAnimationKosmos.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.unfold
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+
+var Kosmos.fullscreenLightRevealAnimationController by Fixture {
+    mock<FullscreenLightRevealAnimationController>()
+}
+var Kosmos.fullscreenLightRevealAnimationControllerFactory by Fixture {
+    var mockControllerFactory = mock<FullscreenLightRevealAnimationController.Factory>()
+    whenever(mockControllerFactory.create(any(), any(), any()))
+        .thenReturn(fullscreenLightRevealAnimationController)
+    mockControllerFactory
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt
index a3ad2b8..4788624 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt
@@ -44,6 +44,8 @@
     private val models: MutableMap<AudioStream, MutableStateFlow<AudioStreamModel>> = mutableMapOf()
     private val lastAudibleVolumes: MutableMap<AudioStream, Int> = mutableMapOf()
 
+    private var isAffectedByMute: MutableMap<AudioStream, Boolean> = mutableMapOf()
+
     private fun getAudioStreamModelState(
         audioStream: AudioStream
     ): MutableStateFlow<AudioStreamModel> =
@@ -93,4 +95,15 @@
     fun setLastAudibleVolume(audioStream: AudioStream, volume: Int) {
         lastAudibleVolumes[audioStream] = volume
     }
+
+    override suspend fun setRingerMode(audioStream: AudioStream, mode: RingerMode) {
+        mutableRingerMode.value = mode
+    }
+
+    override suspend fun isAffectedByMute(audioStream: AudioStream): Boolean =
+        isAffectedByMute[audioStream] ?: true
+
+    fun setIsAffectedByMute(audioStream: AudioStream, isAffected: Boolean) {
+        isAffectedByMute[audioStream] = isAffected
+    }
 }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/anc/data/repository/FakeAncSliceRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/anc/data/repository/FakeAncSliceRepository.kt
index b66d7f9..d4a72b4 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/anc/data/repository/FakeAncSliceRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/panel/component/anc/data/repository/FakeAncSliceRepository.kt
@@ -24,8 +24,9 @@
 
     private val sliceByWidth = mutableMapOf<Int, MutableStateFlow<Slice?>>()
 
-    override fun ancSlice(width: Int): Flow<Slice?> =
-        sliceByWidth.getOrPut(width) { MutableStateFlow(null) }
+    override fun ancSlice(width: Int, isCollapsed: Boolean, hideLabel: Boolean): Flow<Slice?> {
+        return sliceByWidth.getOrPut(width) { MutableStateFlow(null) }
+    }
 
     fun putSlice(width: Int, slice: Slice?) {
         sliceByWidth.getOrPut(width) { MutableStateFlow(null) }.value = slice
diff --git a/packages/VpnDialogs/res/values-af/strings.xml b/packages/VpnDialogs/res/values-af/strings.xml
index db3c355..83c9717 100644
--- a/packages/VpnDialogs/res/values-af/strings.xml
+++ b/packages/VpnDialogs/res/values-af/strings.xml
@@ -32,7 +32,7 @@
     <string name="always_on_disconnected_message_settings_link" msgid="6172280302829992412">"Verander VPN-instellings"</string>
     <string name="configure" msgid="4905518375574791375">"Stel op"</string>
     <string name="disconnect" msgid="971412338304200056">"Ontkoppel"</string>
-    <string name="open_app" msgid="3717639178595958667">"Maak program oop"</string>
+    <string name="open_app" msgid="3717639178595958667">"Maak app oop"</string>
     <string name="dismiss" msgid="6192859333764711227">"Maak toe"</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/packages/VpnDialogs/res/values-de/strings.xml b/packages/VpnDialogs/res/values-de/strings.xml
index 7397ddb..062f61c 100644
--- a/packages/VpnDialogs/res/values-de/strings.xml
+++ b/packages/VpnDialogs/res/values-de/strings.xml
@@ -17,7 +17,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="prompt" msgid="3183836924226407828">"Verbindungsanfrage"</string>
-    <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> möchte eine VPN-Verbindung herstellen, über die der Netzwerkverkehr überwacht werden kann. Lass die Verbindung nur zu, wenn die App vertrauenswürdig ist. &lt;br /&gt; &lt;br /&gt; Wenn das VPN aktiv ist, wird oben im Display &lt;img src=vpn_icon /&gt; angezeigt."</string>
+    <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> möchte eine VPN-Verbindung herstellen, über die der Netzwerkverkehr überwacht werden kann. Lass die Verbindung nur zu, wenn die App vertrauenswürdig ist. &lt;br /&gt; &lt;br /&gt; Wenn das VPN aktiv ist, wird oben auf dem Display das Symbol „&lt;img src=vpn_icon /&gt;“ angezeigt."</string>
     <string name="warning" product="tv" msgid="5188957997628124947">"<xliff:g id="APP">%s</xliff:g> möchte eine VPN-Verbindung herstellen, über die der Netzwerkverkehr überwacht werden kann. Lass die Verbindung nur zu, wenn die App vertrauenswürdig ist. &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; wird auf dem Display angezeigt, wenn VPN aktiv ist."</string>
     <string name="legacy_title" msgid="192936250066580964">"VPN ist verbunden"</string>
     <string name="session" msgid="6470628549473641030">"Sitzung:"</string>
diff --git a/packages/overlays/Android.bp b/packages/overlays/Android.bp
index 5e001fb..5075f63 100644
--- a/packages/overlays/Android.bp
+++ b/packages/overlays/Android.bp
@@ -30,9 +30,6 @@
         "FontNotoSerifSourceOverlay",
         "NavigationBarMode3ButtonOverlay",
         "NavigationBarModeGesturalOverlay",
-        "NavigationBarModeGesturalOverlayNarrowBack",
-        "NavigationBarModeGesturalOverlayWideBack",
-        "NavigationBarModeGesturalOverlayExtraWideBack",
         "TransparentNavigationBarOverlay",
         "NotesRoleEnabledOverlay",
         "preinstalled-packages-platform-overlays.xml",
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/Android.bp b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/Android.bp
deleted file mode 100644
index 28f9f33..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/Android.bp
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-//  Copyright 2019, The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-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"],
-}
-
-runtime_resource_overlay {
-    name: "NavigationBarModeGesturalOverlayExtraWideBack",
-    theme: "NavigationBarModeGesturalExtraWideBack",
-    product_specific: true,
-}
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/AndroidManifest.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/AndroidManifest.xml
deleted file mode 100644
index ba7beba..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/AndroidManifest.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.internal.systemui.navbar.gestural_extra_wide_back"
-        android:versionCode="1"
-        android:versionName="1.0">
-    <overlay android:targetPackage="android"
-        android:category="com.android.internal.navigation_bar_mode"
-        android:priority="1"/>
-
-    <application android:label="@string/navigation_bar_mode_title" android:hasCode="false"/>
-</manifest>
\ No newline at end of file
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values-sw600dp/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values-sw600dp/config.xml
deleted file mode 100644
index be1f081..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values-sw600dp/config.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * 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.
- */
--->
-<resources>
-    <!-- If true, attach the navigation bar to the app during app transition -->
-    <bool name="config_attachNavBarToAppDuringTransition">false</bool>
-</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml
deleted file mode 100644
index 120a489..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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>
-    <!-- Controls the navigation bar interaction mode:
-         0: 3 button mode (back, home, overview buttons)
-         1: 2 button mode (back, home buttons + swipe up for overview)
-         2: gestures only for back, home and overview -->
-    <integer name="config_navBarInteractionMode">2</integer>
-
-    <!-- Controls whether the nav bar can move from the bottom to the side in landscape.
-         Only applies if the device display is not square. -->
-    <bool name="config_navBarCanMove">false</bool>
-
-    <!-- Controls whether the navigation bar lets through taps. -->
-    <bool name="config_navBarTapThrough">true</bool>
-
-    <!-- Controls whether the IME renders the back and IME switcher buttons or not. -->
-    <bool name="config_imeDrawsImeNavBar">true</bool>
-
-    <!-- Controls the size of the back gesture inset. -->
-    <dimen name="config_backGestureInset">40dp</dimen>
-
-    <!-- Controls whether the navbar needs a scrim with
-     {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. -->
-    <bool name="config_navBarNeedsScrim">false</bool>
-
-    <!-- Controls the opacity of the navigation bar depending on the visibility of the
-     various workspace stacks.
-     0 - Nav bar is always opaque when either the freeform stack or docked stack is visible.
-     1 - Nav bar is always translucent when the freeform stack is visible, otherwise always
-         opaque.
-     2 - Nav bar is never forced opaque.
-     -->
-    <integer name="config_navBarOpacityMode">2</integer>
-
-    <!-- Controls whether seamless rotation should be allowed even though the navbar can move
-         (which normally prevents seamless rotation). -->
-    <bool name="config_allowSeamlessRotationDespiteNavBarMoving">true</bool>
-
-    <!-- Controls whether the side edge gestures can always trigger the transient nav bar to
-         show. -->
-    <bool name="config_navBarAlwaysShowOnSideEdgeGesture">true</bool>
-
-    <!-- If true, attach the navigation bar to the app during app transition -->
-    <bool name="config_attachNavBarToAppDuringTransition">true</bool>
-</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/dimens.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/dimens.xml
deleted file mode 100644
index 674bc74..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/dimens.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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>
-    <!-- Height of the bottom navigation / system bar. -->
-    <dimen name="navigation_bar_height">24dp</dimen>
-    <!-- Height of the bottom navigation bar in portrait; often the same as @dimen/navigation_bar_height -->
-    <dimen name="navigation_bar_height_landscape">24dp</dimen>
-    <!-- Width of the navigation bar when it is placed vertically on the screen -->
-    <dimen name="navigation_bar_width">24dp</dimen>
-    <!-- Height of the bottom navigation / system bar. -->
-    <dimen name="navigation_bar_frame_height">48dp</dimen>
-    <!-- The height of the bottom navigation gesture area. -->
-    <dimen name="navigation_bar_gesture_height">32dp</dimen>
-</resources>
\ No newline at end of file
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/strings.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/strings.xml
deleted file mode 100644
index bbab5e047..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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">
-    <!-- Name of overlay [CHAR LIMIT=64] -->
-    <string name="navigation_bar_mode_title" translatable="false">Gestural Navigation Bar</string>
-</resources>
\ No newline at end of file
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/Android.bp b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/Android.bp
deleted file mode 100644
index f8a5603..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/Android.bp
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-//  Copyright 2019, The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-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"],
-}
-
-runtime_resource_overlay {
-    name: "NavigationBarModeGesturalOverlayNarrowBack",
-    theme: "NavigationBarModeGesturalNarrowBack",
-    product_specific: true,
-}
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/AndroidManifest.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/AndroidManifest.xml
deleted file mode 100644
index 8de91c0..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/AndroidManifest.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.internal.systemui.navbar.gestural_narrow_back"
-        android:versionCode="1"
-        android:versionName="1.0">
-    <overlay android:targetPackage="android"
-        android:category="com.android.internal.navigation_bar_mode"
-        android:priority="1"/>
-
-    <application android:label="@string/navigation_bar_mode_title" android:hasCode="false"/>
-</manifest>
\ No newline at end of file
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values-sw600dp/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values-sw600dp/config.xml
deleted file mode 100644
index be1f081..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values-sw600dp/config.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * 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.
- */
--->
-<resources>
-    <!-- If true, attach the navigation bar to the app during app transition -->
-    <bool name="config_attachNavBarToAppDuringTransition">false</bool>
-</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml
deleted file mode 100644
index c18d892..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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>
-    <!-- Controls the navigation bar interaction mode:
-         0: 3 button mode (back, home, overview buttons)
-         1: 2 button mode (back, home buttons + swipe up for overview)
-         2: gestures only for back, home and overview -->
-    <integer name="config_navBarInteractionMode">2</integer>
-
-    <!-- Controls whether the nav bar can move from the bottom to the side in landscape.
-         Only applies if the device display is not square. -->
-    <bool name="config_navBarCanMove">false</bool>
-
-    <!-- Controls whether the navigation bar lets through taps. -->
-    <bool name="config_navBarTapThrough">true</bool>
-
-    <!-- Controls whether the IME renders the back and IME switcher buttons or not. -->
-    <bool name="config_imeDrawsImeNavBar">true</bool>
-
-    <!-- Controls the size of the back gesture inset. -->
-    <dimen name="config_backGestureInset">18dp</dimen>
-
-    <!-- Controls whether the navbar needs a scrim with
-     {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. -->
-    <bool name="config_navBarNeedsScrim">false</bool>
-
-    <!-- Controls the opacity of the navigation bar depending on the visibility of the
-     various workspace stacks.
-     0 - Nav bar is always opaque when either the freeform stack or docked stack is visible.
-     1 - Nav bar is always translucent when the freeform stack is visible, otherwise always
-         opaque.
-     2 - Nav bar is never forced opaque.
-     -->
-    <integer name="config_navBarOpacityMode">2</integer>
-
-    <!-- Controls whether seamless rotation should be allowed even though the navbar can move
-         (which normally prevents seamless rotation). -->
-    <bool name="config_allowSeamlessRotationDespiteNavBarMoving">true</bool>
-
-    <!-- Controls whether the side edge gestures can always trigger the transient nav bar to
-         show. -->
-    <bool name="config_navBarAlwaysShowOnSideEdgeGesture">true</bool>
-
-    <!-- If true, attach the navigation bar to the app during app transition -->
-    <bool name="config_attachNavBarToAppDuringTransition">true</bool>
-</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/dimens.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/dimens.xml
deleted file mode 100644
index 674bc74..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/dimens.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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>
-    <!-- Height of the bottom navigation / system bar. -->
-    <dimen name="navigation_bar_height">24dp</dimen>
-    <!-- Height of the bottom navigation bar in portrait; often the same as @dimen/navigation_bar_height -->
-    <dimen name="navigation_bar_height_landscape">24dp</dimen>
-    <!-- Width of the navigation bar when it is placed vertically on the screen -->
-    <dimen name="navigation_bar_width">24dp</dimen>
-    <!-- Height of the bottom navigation / system bar. -->
-    <dimen name="navigation_bar_frame_height">48dp</dimen>
-    <!-- The height of the bottom navigation gesture area. -->
-    <dimen name="navigation_bar_gesture_height">32dp</dimen>
-</resources>
\ No newline at end of file
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/strings.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/strings.xml
deleted file mode 100644
index bbab5e047..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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">
-    <!-- Name of overlay [CHAR LIMIT=64] -->
-    <string name="navigation_bar_mode_title" translatable="false">Gestural Navigation Bar</string>
-</resources>
\ No newline at end of file
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/Android.bp b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/Android.bp
deleted file mode 100644
index 60ee6d5..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/Android.bp
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-//  Copyright 2019, The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-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"],
-}
-
-runtime_resource_overlay {
-    name: "NavigationBarModeGesturalOverlayWideBack",
-    theme: "NavigationBarModeGesturalWideBack",
-    product_specific: true,
-}
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/AndroidManifest.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/AndroidManifest.xml
deleted file mode 100644
index daf4613..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/AndroidManifest.xml
+++ /dev/null
@@ -1,27 +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.
- */
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.internal.systemui.navbar.gestural_wide_back"
-        android:versionCode="1"
-        android:versionName="1.0">
-    <overlay android:targetPackage="android"
-        android:category="com.android.internal.navigation_bar_mode"
-        android:priority="1"/>
-
-    <application android:label="@string/navigation_bar_mode_title" android:hasCode="false"/>
-</manifest>
\ No newline at end of file
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values-sw600dp/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values-sw600dp/config.xml
deleted file mode 100644
index be1f081..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values-sw600dp/config.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * 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.
- */
--->
-<resources>
-    <!-- If true, attach the navigation bar to the app during app transition -->
-    <bool name="config_attachNavBarToAppDuringTransition">false</bool>
-</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml
deleted file mode 100644
index 877b5f8..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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>
-    <!-- Controls the navigation bar interaction mode:
-         0: 3 button mode (back, home, overview buttons)
-         1: 2 button mode (back, home buttons + swipe up for overview)
-         2: gestures only for back, home and overview -->
-    <integer name="config_navBarInteractionMode">2</integer>
-
-    <!-- Controls whether the nav bar can move from the bottom to the side in landscape.
-         Only applies if the device display is not square. -->
-    <bool name="config_navBarCanMove">false</bool>
-
-    <!-- Controls whether the navigation bar lets through taps. -->
-    <bool name="config_navBarTapThrough">true</bool>
-
-    <!-- Controls whether the IME renders the back and IME switcher buttons or not. -->
-    <bool name="config_imeDrawsImeNavBar">true</bool>
-
-    <!-- Controls the size of the back gesture inset. -->
-    <dimen name="config_backGestureInset">32dp</dimen>
-
-    <!-- Controls whether the navbar needs a scrim with
-     {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. -->
-    <bool name="config_navBarNeedsScrim">false</bool>
-
-    <!-- Controls the opacity of the navigation bar depending on the visibility of the
-     various workspace stacks.
-     0 - Nav bar is always opaque when either the freeform stack or docked stack is visible.
-     1 - Nav bar is always translucent when the freeform stack is visible, otherwise always
-         opaque.
-     2 - Nav bar is never forced opaque.
-     -->
-    <integer name="config_navBarOpacityMode">2</integer>
-
-    <!-- Controls whether seamless rotation should be allowed even though the navbar can move
-         (which normally prevents seamless rotation). -->
-    <bool name="config_allowSeamlessRotationDespiteNavBarMoving">true</bool>
-
-    <!-- Controls whether the side edge gestures can always trigger the transient nav bar to
-         show. -->
-    <bool name="config_navBarAlwaysShowOnSideEdgeGesture">true</bool>
-
-    <!-- If true, attach the navigation bar to the app during app transition -->
-    <bool name="config_attachNavBarToAppDuringTransition">true</bool>
-</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/dimens.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/dimens.xml
deleted file mode 100644
index 674bc74..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/dimens.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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>
-    <!-- Height of the bottom navigation / system bar. -->
-    <dimen name="navigation_bar_height">24dp</dimen>
-    <!-- Height of the bottom navigation bar in portrait; often the same as @dimen/navigation_bar_height -->
-    <dimen name="navigation_bar_height_landscape">24dp</dimen>
-    <!-- Width of the navigation bar when it is placed vertically on the screen -->
-    <dimen name="navigation_bar_width">24dp</dimen>
-    <!-- Height of the bottom navigation / system bar. -->
-    <dimen name="navigation_bar_frame_height">48dp</dimen>
-    <!-- The height of the bottom navigation gesture area. -->
-    <dimen name="navigation_bar_gesture_height">32dp</dimen>
-</resources>
\ No newline at end of file
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/strings.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/strings.xml
deleted file mode 100644
index bbab5e047..0000000
--- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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">
-    <!-- Name of overlay [CHAR LIMIT=64] -->
-    <string name="navigation_bar_mode_title" translatable="false">Gestural Navigation Bar</string>
-</resources>
\ No newline at end of file
diff --git a/ravenwood/Android.bp b/ravenwood/Android.bp
index 178102e..8905ad3 100644
--- a/ravenwood/Android.bp
+++ b/ravenwood/Android.bp
@@ -151,6 +151,18 @@
 
 filegroup {
     name: "ravenwood-services-jarjar-rules",
-    srcs: ["ravenwood-services-jarjar-rules.txt"],
+    srcs: ["texts/ravenwood-services-jarjar-rules.txt"],
     visibility: ["//frameworks/base"],
 }
+
+// For collecting the *stats.csv files in a known directory under out/host/linux-x86/testcases/.
+// The "test" just shows the available stats filenames.
+sh_test_host {
+    name: "ravenwood-stats-checker",
+    src: "scripts/ravenwood-stats-checker.sh",
+    test_suites: ["general-tests"],
+    data: [
+        ":framework-minus-apex.ravenwood.stats",
+        ":services.core.ravenwood.stats",
+    ],
+}
diff --git a/ravenwood/README.md b/ravenwood/README.md
index 8cafb43..9c4fda7 100644
--- a/ravenwood/README.md
+++ b/ravenwood/README.md
@@ -1,11 +1,9 @@
 # Ravenwood
 
-Ravenwood is a lightweight unit testing environment for Android platform code that runs on the host.
+Ravenwood is an officially-supported lightweight unit testing environment for Android platform code that runs on the host.
 
 Ravenwood’s focus on Android platform use-cases, improved maintainability, and device consistency distinguishes it from Robolectric, which remains a popular choice for app testing.
 
-> **Note:** Active development of Ravenwood has been paused as of March 2024.  Existing Ravenwood tests will continue running, but support has moved to a self-service model.
-
 ## Background
 
 Executing tests on a typical Android device has substantial overhead, such as flashing the build, waiting for the boot to complete, and retrying tests that fail due to general flakiness.
diff --git a/ravenwood/TEST_MAPPING b/ravenwood/TEST_MAPPING
index a5b28ad..e77f846f 100644
--- a/ravenwood/TEST_MAPPING
+++ b/ravenwood/TEST_MAPPING
@@ -5,6 +5,17 @@
     },
     {
       "name": "RavenwoodBivalentTest_device"
+    },
+    {
+      "name": "SystemUIGoogleTests",
+      "options": [
+        {
+          "exclude-annotation": "org.junit.Ignore"
+        },
+        {
+          "exclude-annotation": "androidx.test.filters.FlakyTest"
+        }
+      ]
     }
   ],
   "ravenwood-presubmit": [
diff --git a/ravenwood/api-maintainers.md b/ravenwood/api-maintainers.md
index c059cab..4b2f968 100644
--- a/ravenwood/api-maintainers.md
+++ b/ravenwood/api-maintainers.md
@@ -4,7 +4,7 @@
 
 To opt-in to supporting an API under Ravenwood, you can use the inline annotations documented below to customize your API behavior when running under Ravenwood.  Because these annotations are inline in the relevant platform source code, they serve as valuable reminders to future API maintainers of Ravenwood support expectations.
 
-> **Note:** Active development of Ravenwood has been paused as of March 2024. Currently supported APIs will continue working, but the addition of new APIs is not currently being supported. There is an allowlist that restricts where Ravenwood-specific annotations can be used, and that allowlist is not being expanded while development is paused.
+> **Note:** to ensure that API teams are well-supported during early Ravenwood onboarding, the Ravenwood team is manually maintaining an allow-list of classes that are able to use Ravenwood annotations.  Please reach out to ravenwood@ so we can offer design advice and allow-list your APIs.
 
 These Ravenwood-specific annotations have no bearing on the status of an API being public, `@SystemApi`, `@TestApi`, `@hide`, etc.  Ravenwood annotations are an orthogonal concept that are only consumed by the internal `hoststubgen` tool during a post-processing step that generates the Ravenwood runtime environment.  Teams that own APIs can continue to refactor opted-in `@hide` implementation details, as long as the test-visible behavior continues passing.
 
diff --git a/ravenwood/bivalenttest/jni/ravenwood_core_test_jni.cpp b/ravenwood/bivalenttest/jni/ravenwood_core_test_jni.cpp
index 5e66b29..83f756e 100644
--- a/ravenwood/bivalenttest/jni/ravenwood_core_test_jni.cpp
+++ b/ravenwood/bivalenttest/jni/ravenwood_core_test_jni.cpp
@@ -42,7 +42,7 @@
     ALOGI("%s: JNI_OnLoad", __FILE__);
 
     int res = jniRegisterNativeMethods(env,
-            "com/android/platform/test/ravenwood/bivalenttest/RavenwoodJniTest",
+            "com/android/ravenwoodtest/bivalenttest/RavenwoodJniTest",
             sMethods, NELEM(sMethods));
     if (res < 0) {
         return res;
diff --git a/ravenwood/bivalenttest/test/com/android/platform/test/ravenwood/bivalenttest/RavenwoodJniTest.java b/ravenwood/bivalenttest/test/com/android/platform/test/ravenwood/bivalenttest/RavenwoodJniTest.java
deleted file mode 100644
index 3b106da..0000000
--- a/ravenwood/bivalenttest/test/com/android/platform/test/ravenwood/bivalenttest/RavenwoodJniTest.java
+++ /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.platform.test.ravenwood.bivalenttest;
-
-import static junit.framework.Assert.assertEquals;
-
-import android.platform.test.ravenwood.RavenwoodRule;
-import android.platform.test.ravenwood.RavenwoodUtils;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public final class RavenwoodJniTest {
-    static {
-        RavenwoodUtils.loadJniLibrary("ravenwoodbivalenttest_jni");
-    }
-
-    @Rule
-    public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder().build();
-
-    private static native int add(int a, int b);
-
-    @Test
-    public void testNativeMethod() {
-        assertEquals(5, add(2, 3));
-    }
-}
diff --git a/ravenwood/bivalenttest/test/com/android/platform/test/ravenwood/bivalenttest/RavenwoodRuleTest.java b/ravenwood/bivalenttest/test/com/android/platform/test/ravenwood/bivalenttest/RavenwoodRuleTest.java
deleted file mode 100644
index 4b650b4..0000000
--- a/ravenwood/bivalenttest/test/com/android/platform/test/ravenwood/bivalenttest/RavenwoodRuleTest.java
+++ /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.platform.test.ravenwood.bivalenttest;
-
-import android.platform.test.annotations.DisabledOnNonRavenwood;
-import android.platform.test.annotations.DisabledOnRavenwood;
-import android.platform.test.ravenwood.RavenwoodRule;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Assert;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class RavenwoodRuleTest {
-    @Rule
-    public final RavenwoodRule mRavenwood = new RavenwoodRule();
-
-    @Test
-    @DisabledOnRavenwood
-    public void testDeviceOnly() {
-        Assert.assertFalse(RavenwoodRule.isOnRavenwood());
-    }
-
-    @Test
-    @DisabledOnNonRavenwood
-    public void testRavenwoodOnly() {
-        Assert.assertTrue(RavenwoodRule.isOnRavenwood());
-    }
-
-    // TODO: Add more tests
-}
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodAndroidApiTest.java b/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodAndroidApiTest.java
new file mode 100644
index 0000000..d91e734
--- /dev/null
+++ b/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodAndroidApiTest.java
@@ -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.ravenwoodtest.bivalenttest;
+
+import static org.junit.Assert.assertEquals;
+
+import android.util.ArrayMap;
+import android.util.Size;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Map;
+
+// Tests for calling simple Android APIs.
+@RunWith(AndroidJUnit4.class)
+public class RavenwoodAndroidApiTest {
+    @Test
+    public void testArrayMapSimple() {
+        final Map<String, String> map = new ArrayMap<>();
+
+        map.put("key1", "value1");
+        assertEquals("value1", map.get("key1"));
+    }
+
+    @Test
+    public void testSizeSimple() {
+        final var size = new Size(1, 2);
+
+        assertEquals(2, size.getHeight());
+    }
+}
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodClassRuleDeviceOnlyTest.java b/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodClassRuleDeviceOnlyTest.java
new file mode 100644
index 0000000..3a24c0e
--- /dev/null
+++ b/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodClassRuleDeviceOnlyTest.java
@@ -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.ravenwoodtest.bivalenttest;
+
+import android.platform.test.annotations.DisabledOnRavenwood;
+import android.platform.test.ravenwood.RavenwoodClassRule;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Assert;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@DisabledOnRavenwood
+public class RavenwoodClassRuleDeviceOnlyTest {
+    @ClassRule
+    public static final RavenwoodClassRule sRavenwood = new RavenwoodClassRule();
+
+    @Test
+    public void testDeviceOnly() {
+        Assert.assertFalse(RavenwoodRule.isOnRavenwood());
+    }
+}
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodClassRuleRavenwoodOnlyTest.java b/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodClassRuleRavenwoodOnlyTest.java
new file mode 100644
index 0000000..aa33dc3
--- /dev/null
+++ b/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodClassRuleRavenwoodOnlyTest.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.ravenwoodtest.bivalenttest;
+
+import android.platform.test.ravenwood.RavenwoodClassRule;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Assert;
+import org.junit.ClassRule;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+// TODO: atest RavenwoodBivalentTest_device fails with the following message.
+// `RUNNER ERROR: Instrumentation reported numtests=7 but only ran 6`
+// @android.platform.test.annotations.DisabledOnNonRavenwood
+// Figure it out and then make DisabledOnNonRavenwood support TYPEs as well.
+@Ignore
+public class RavenwoodClassRuleRavenwoodOnlyTest {
+    @ClassRule
+    public static final RavenwoodClassRule sRavenwood = new RavenwoodClassRule();
+
+    @Test
+    public void testRavenwoodOnly() {
+        Assert.assertTrue(RavenwoodRule.isOnRavenwood());
+    }
+}
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodJniTest.java b/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodJniTest.java
new file mode 100644
index 0000000..59467e9
--- /dev/null
+++ b/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodJniTest.java
@@ -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.ravenwoodtest.bivalenttest;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.platform.test.ravenwood.RavenwoodRule;
+import android.platform.test.ravenwood.RavenwoodUtils;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public final class RavenwoodJniTest {
+    static {
+        RavenwoodUtils.loadJniLibrary("ravenwoodbivalenttest_jni");
+    }
+
+    @Rule
+    public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder().build();
+
+    private static native int add(int a, int b);
+
+    @Test
+    public void testNativeMethod() {
+        assertEquals(5, add(2, 3));
+    }
+}
diff --git a/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodRuleTest.java b/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodRuleTest.java
new file mode 100644
index 0000000..3edca7e
--- /dev/null
+++ b/ravenwood/bivalenttest/test/com/android/ravenwoodtest/bivalenttest/RavenwoodRuleTest.java
@@ -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.ravenwoodtest.bivalenttest;
+
+import android.platform.test.annotations.DisabledOnNonRavenwood;
+import android.platform.test.annotations.DisabledOnRavenwood;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class RavenwoodRuleTest {
+    @Rule
+    public final RavenwoodRule mRavenwood = new RavenwoodRule();
+
+    @Test
+    @DisabledOnRavenwood
+    public void testDeviceOnly() {
+        Assert.assertFalse(RavenwoodRule.isOnRavenwood());
+    }
+
+    @Test
+    @DisabledOnNonRavenwood
+    public void testRavenwoodOnly() {
+        Assert.assertTrue(RavenwoodRule.isOnRavenwood());
+    }
+
+    // TODO: Add more tests
+}
diff --git a/ravenwood/coretest/test/com/android/platform/test/ravenwood/coretest/RavenwoodTestRunnerValidationTest.java b/ravenwood/coretest/test/com/android/platform/test/ravenwood/coretest/RavenwoodTestRunnerValidationTest.java
deleted file mode 100644
index 2cd585f..0000000
--- a/ravenwood/coretest/test/com/android/platform/test/ravenwood/coretest/RavenwoodTestRunnerValidationTest.java
+++ /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.platform.test.ravenwood.coretest;
-
-import android.platform.test.ravenwood.RavenwoodRule;
-
-import androidx.test.runner.AndroidJUnit4; // Intentionally use the deprecated one.
-
-import org.junit.Assume;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.rules.RuleChain;
-import org.junit.runner.RunWith;
-
-/**
- * Test for the test runner validator in RavenwoodRule.
- */
-@RunWith(AndroidJUnit4.class)
-public class RavenwoodTestRunnerValidationTest {
-    // Note the following rules don't have a @Rule, because they need to be applied in a specific
-    // order. So we use a RuleChain instead.
-    private ExpectedException mThrown = ExpectedException.none();
-    private final RavenwoodRule mRavenwood = new RavenwoodRule();
-
-    @Rule
-    public final RuleChain chain = RuleChain.outerRule(mThrown).around(mRavenwood);
-
-    public RavenwoodTestRunnerValidationTest() {
-        Assume.assumeTrue(mRavenwood._ravenwood_private$isOptionalValidationEnabled());
-        // Because RavenwoodRule will throw this error before executing the test method,
-        // we can't do it in the test method itself.
-        // So instead, we initialize it here.
-        mThrown.expectMessage("Switch to androidx.test.ext.junit.runners.AndroidJUnit4");
-    }
-
-    @Test
-    public void testValidateTestRunner() {
-    }
-}
diff --git a/ravenwood/coretest/test/com/android/ravenwoodtest/coretest/RavenwoodTestRunnerValidationTest.java b/ravenwood/coretest/test/com/android/ravenwoodtest/coretest/RavenwoodTestRunnerValidationTest.java
new file mode 100644
index 0000000..f1e33cb
--- /dev/null
+++ b/ravenwood/coretest/test/com/android/ravenwoodtest/coretest/RavenwoodTestRunnerValidationTest.java
@@ -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.ravenwoodtest.coretest;
+
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import androidx.test.runner.AndroidJUnit4; // Intentionally use the deprecated one.
+
+import org.junit.Assume;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.rules.RuleChain;
+import org.junit.runner.RunWith;
+
+/**
+ * Test for the test runner validator in RavenwoodRule.
+ */
+@RunWith(AndroidJUnit4.class)
+public class RavenwoodTestRunnerValidationTest {
+    // Note the following rules don't have a @Rule, because they need to be applied in a specific
+    // order. So we use a RuleChain instead.
+    private ExpectedException mThrown = ExpectedException.none();
+    private final RavenwoodRule mRavenwood = new RavenwoodRule();
+
+    @Rule
+    public final RuleChain chain = RuleChain.outerRule(mThrown).around(mRavenwood);
+
+    public RavenwoodTestRunnerValidationTest() {
+        Assume.assumeTrue(RavenwoodRule._$RavenwoodPrivate.isOptionalValidationEnabled());
+        // Because RavenwoodRule will throw this error before executing the test method,
+        // we can't do it in the test method itself.
+        // So instead, we initialize it here.
+        mThrown.expectMessage("Switch to androidx.test.ext.junit.runners.AndroidJUnit4");
+    }
+
+    @Test
+    public void testValidateTestRunner() {
+    }
+}
diff --git a/ravenwood/junit-src/android/platform/test/annotations/DisabledOnNonRavenwood.java b/ravenwood/junit-src/android/platform/test/annotations/DisabledOnNonRavenwood.java
index 8ca34ba..2fb8074 100644
--- a/ravenwood/junit-src/android/platform/test/annotations/DisabledOnNonRavenwood.java
+++ b/ravenwood/junit-src/android/platform/test/annotations/DisabledOnNonRavenwood.java
@@ -31,13 +31,17 @@
  * which means if a test class has this annotation, you can't negate it in subclasses or
  * on a per-method basis.
  *
+ * THIS ANNOTATION CANNOT BE ADDED TO CLASSES AT THIS PONINT.
+ * See {@link com.android.ravenwoodtest.bivalenttest.RavenwoodClassRuleRavenwoodOnlyTest}
+ * for the reason.
+ *
  * The {@code RAVENWOOD_RUN_DISABLED_TESTS} environmental variable won't work because it won't be
  * propagated to the device. (We may support it in the future, possibly using a debug. sysprop.)
  *
  * @hide
  */
 @Inherited
-@Target({ElementType.METHOD, ElementType.TYPE})
+@Target({ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
 public @interface DisabledOnNonRavenwood {
     /**
diff --git a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodClassRule.java b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodClassRule.java
index 9a4d488..f4b7ec36 100644
--- a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodClassRule.java
+++ b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodClassRule.java
@@ -25,6 +25,7 @@
 import android.platform.test.annotations.DisabledOnRavenwood;
 import android.platform.test.annotations.EnabledOnRavenwood;
 
+import org.junit.Assert;
 import org.junit.Assume;
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
@@ -41,27 +42,16 @@
 public class RavenwoodClassRule implements TestRule {
     @Override
     public Statement apply(Statement base, Description description) {
-        // No special treatment when running outside Ravenwood; run tests as-is
         if (!IS_ON_RAVENWOOD) {
-            Assume.assumeTrue(shouldEnableOnDevice(description));
-            return base;
-        }
-
-        if (ENABLE_PROBE_IGNORED) {
+            // This should be "Assume", not Assert, but if we use assume here, the device side
+            // test runner would complain.
+            // See the TODO comment in RavenwoodClassRuleRavenwoodOnlyTest.
+            Assert.assertTrue(shouldEnableOnDevice(description));
+        } else if (ENABLE_PROBE_IGNORED) {
             Assume.assumeFalse(shouldStillIgnoreInProbeIgnoreMode(description));
-            // Pass through to possible underlying RavenwoodRule for both environment
-            // configuration and handling method-level annotations
-            return base;
         } else {
-            return new Statement() {
-                @Override
-                public void evaluate() throws Throwable {
-                    Assume.assumeTrue(shouldEnableOnRavenwood(description));
-                    // Pass through to possible underlying RavenwoodRule for both environment
-                    // configuration and handling method-level annotations
-                    base.evaluate();
-                }
-            };
+            Assume.assumeTrue(shouldEnableOnRavenwood(description));
         }
+        return base;
     }
 }
diff --git a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodRule.java b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodRule.java
index 52ea340..21d8019 100644
--- a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodRule.java
+++ b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodRule.java
@@ -28,7 +28,6 @@
 import android.platform.test.annotations.DisabledOnRavenwood;
 import android.platform.test.annotations.EnabledOnRavenwood;
 import android.platform.test.annotations.IgnoreUnderRavenwood;
-import android.util.ArraySet;
 
 import org.junit.Assume;
 import org.junit.rules.TestRule;
@@ -278,6 +277,12 @@
                 return false;
             }
         }
+        final var clazz = description.getTestClass();
+        if (clazz != null) {
+            if (clazz.getAnnotation(DisabledOnNonRavenwood.class) != null) {
+                return false;
+            }
+        }
         return true;
     }
 
@@ -308,14 +313,17 @@
         }
 
         // Otherwise, consult any class-level annotations
-        if (description.getTestClass().getAnnotation(EnabledOnRavenwood.class) != null) {
-            return true;
-        }
-        if (description.getTestClass().getAnnotation(DisabledOnRavenwood.class) != null) {
-            return false;
-        }
-        if (description.getTestClass().getAnnotation(IgnoreUnderRavenwood.class) != null) {
-            return false;
+        final var clazz = description.getTestClass();
+        if (clazz != null) {
+            if (description.getTestClass().getAnnotation(EnabledOnRavenwood.class) != null) {
+                return true;
+            }
+            if (description.getTestClass().getAnnotation(DisabledOnRavenwood.class) != null) {
+                return false;
+            }
+            if (description.getTestClass().getAnnotation(IgnoreUnderRavenwood.class) != null) {
+                return false;
+            }
         }
 
         // When no annotations have been requested, assume test should be included
@@ -413,10 +421,9 @@
         };
     }
 
-    /**
-     * Do not use it outside ravenwood core classes.
-     */
-    public boolean _ravenwood_private$isOptionalValidationEnabled() {
-        return ENABLE_OPTIONAL_VALIDATION;
+    public static class _$RavenwoodPrivate {
+        public static boolean isOptionalValidationEnabled() {
+            return ENABLE_OPTIONAL_VALIDATION;
+        }
     }
 }
diff --git a/ravenwood/mockito/test/com/android/ravenwood/mockito/RavenwoodMockitoDeviceOnlyTest.java b/ravenwood/mockito/test/com/android/ravenwood/mockito/RavenwoodMockitoDeviceOnlyTest.java
deleted file mode 100644
index d02fe69..0000000
--- a/ravenwood/mockito/test/com/android/ravenwood/mockito/RavenwoodMockitoDeviceOnlyTest.java
+++ /dev/null
@@ -1,46 +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.ravenwood.mockito;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.ActivityManager;
-import android.platform.test.ravenwood.RavenwoodRule;
-
-import com.android.dx.mockito.inline.extended.ExtendedMockito;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.mockito.quality.Strictness;
-
-public class RavenwoodMockitoDeviceOnlyTest {
-    @Rule public final RavenwoodRule mRavenwood = new RavenwoodRule();
-
-    @Test
-    public void testStaticMockOnDevice() {
-        var mockingSession = ExtendedMockito.mockitoSession()
-                .strictness(Strictness.LENIENT)
-                .mockStatic(ActivityManager.class)
-                .startMocking();
-        try {
-            ExtendedMockito.doReturn(true).when(ActivityManager::isUserAMonkey);
-
-            assertThat(ActivityManager.isUserAMonkey()).isEqualTo(true);
-        } finally {
-            mockingSession.finishMocking();
-        }
-    }
-}
diff --git a/ravenwood/mockito/test/com/android/ravenwood/mockito/RavenwoodMockitoRavenwoodOnlyTest.java b/ravenwood/mockito/test/com/android/ravenwood/mockito/RavenwoodMockitoRavenwoodOnlyTest.java
deleted file mode 100644
index 0c137d5..0000000
--- a/ravenwood/mockito/test/com/android/ravenwood/mockito/RavenwoodMockitoRavenwoodOnlyTest.java
+++ /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.ravenwood.mockito;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.ActivityManager;
-import android.platform.test.ravenwood.RavenwoodRule;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.mockito.MockedStatic;
-import org.mockito.Mockito;
-
-public class RavenwoodMockitoRavenwoodOnlyTest {
-    @Rule public final RavenwoodRule mRavenwood = new RavenwoodRule();
-
-    @Test
-    public void testStaticMockOnRavenwood() {
-        try (MockedStatic<ActivityManager> am = Mockito.mockStatic(ActivityManager.class)) {
-            am.when(ActivityManager::isUserAMonkey).thenReturn(true);
-            assertThat(ActivityManager.isUserAMonkey()).isEqualTo(true);
-        }
-    }
-}
diff --git a/ravenwood/mockito/test/com/android/ravenwood/mockito/RavenwoodMockitoTest.java b/ravenwood/mockito/test/com/android/ravenwood/mockito/RavenwoodMockitoTest.java
deleted file mode 100644
index 9566710..0000000
--- a/ravenwood/mockito/test/com/android/ravenwood/mockito/RavenwoodMockitoTest.java
+++ /dev/null
@@ -1,69 +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.ravenwood.mockito;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Parcel;
-import android.platform.test.ravenwood.RavenwoodRule;
-
-import org.junit.Rule;
-import org.junit.Test;
-
-public class RavenwoodMockitoTest {
-    @Rule public final RavenwoodRule mRavenwood = new RavenwoodRule();
-
-    @Test
-    public void testMockJdkClass() {
-        Process object = mock(Process.class);
-
-        when(object.exitValue()).thenReturn(42);
-
-        assertThat(object.exitValue()).isEqualTo(42);
-    }
-
-    @Test
-    public void testMockAndroidClass1() {
-        Intent object = mock(Intent.class);
-
-        when(object.getAction()).thenReturn("ACTION_RAVENWOOD");
-
-        assertThat(object.getAction()).isEqualTo("ACTION_RAVENWOOD");
-    }
-
-    @Test
-    public void testMockAndroidClass2() {
-        Context object = mock(Context.class);
-
-        when(object.getPackageName()).thenReturn("android");
-
-        assertThat(object.getPackageName()).isEqualTo("android");
-    }
-
-    @Test
-    public void testMockFinalClass() {
-        var object = mock(Parcel.class);
-
-        when(object.readInt()).thenReturn(123);
-
-        assertThat(object.readInt()).isEqualTo(123);
-    }
-}
diff --git a/ravenwood/mockito/test/com/android/ravenwoodtest/mockito/RavenwoodMockitoDeviceOnlyTest.java b/ravenwood/mockito/test/com/android/ravenwoodtest/mockito/RavenwoodMockitoDeviceOnlyTest.java
new file mode 100644
index 0000000..d566977
--- /dev/null
+++ b/ravenwood/mockito/test/com/android/ravenwoodtest/mockito/RavenwoodMockitoDeviceOnlyTest.java
@@ -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.ravenwoodtest.mockito;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.ActivityManager;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.quality.Strictness;
+
+public class RavenwoodMockitoDeviceOnlyTest {
+    @Rule public final RavenwoodRule mRavenwood = new RavenwoodRule();
+
+    @Test
+    public void testStaticMockOnDevice() {
+        var mockingSession = ExtendedMockito.mockitoSession()
+                .strictness(Strictness.LENIENT)
+                .mockStatic(ActivityManager.class)
+                .startMocking();
+        try {
+            ExtendedMockito.doReturn(true).when(ActivityManager::isUserAMonkey);
+
+            assertThat(ActivityManager.isUserAMonkey()).isEqualTo(true);
+        } finally {
+            mockingSession.finishMocking();
+        }
+    }
+}
diff --git a/ravenwood/mockito/test/com/android/ravenwoodtest/mockito/RavenwoodMockitoRavenwoodOnlyTest.java b/ravenwood/mockito/test/com/android/ravenwoodtest/mockito/RavenwoodMockitoRavenwoodOnlyTest.java
new file mode 100644
index 0000000..aa2b7611
--- /dev/null
+++ b/ravenwood/mockito/test/com/android/ravenwoodtest/mockito/RavenwoodMockitoRavenwoodOnlyTest.java
@@ -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.ravenwoodtest.mockito;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.ActivityManager;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+public class RavenwoodMockitoRavenwoodOnlyTest {
+    @Rule public final RavenwoodRule mRavenwood = new RavenwoodRule();
+
+    @Test
+    public void testStaticMockOnRavenwood() {
+        try (MockedStatic<ActivityManager> am = Mockito.mockStatic(ActivityManager.class)) {
+            am.when(ActivityManager::isUserAMonkey).thenReturn(true);
+            assertThat(ActivityManager.isUserAMonkey()).isEqualTo(true);
+        }
+    }
+}
diff --git a/ravenwood/mockito/test/com/android/ravenwoodtest/mockito/RavenwoodMockitoTest.java b/ravenwood/mockito/test/com/android/ravenwoodtest/mockito/RavenwoodMockitoTest.java
new file mode 100644
index 0000000..fcc6c9c
--- /dev/null
+++ b/ravenwood/mockito/test/com/android/ravenwoodtest/mockito/RavenwoodMockitoTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.ravenwoodtest.mockito;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Parcel;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+public class RavenwoodMockitoTest {
+    @Rule public final RavenwoodRule mRavenwood = new RavenwoodRule();
+
+    @Test
+    public void testMockJdkClass() {
+        Process object = mock(Process.class);
+
+        when(object.exitValue()).thenReturn(42);
+
+        assertThat(object.exitValue()).isEqualTo(42);
+    }
+
+    @Test
+    public void testMockAndroidClass1() {
+        Intent object = mock(Intent.class);
+
+        when(object.getAction()).thenReturn("ACTION_RAVENWOOD");
+
+        assertThat(object.getAction()).isEqualTo("ACTION_RAVENWOOD");
+    }
+
+    @Test
+    public void testMockAndroidClass2() {
+        Context object = mock(Context.class);
+
+        when(object.getPackageName()).thenReturn("android");
+
+        assertThat(object.getPackageName()).isEqualTo("android");
+    }
+
+    @Test
+    public void testMockFinalClass() {
+        var object = mock(Parcel.class);
+
+        when(object.readInt()).thenReturn(123);
+
+        assertThat(object.readInt()).isEqualTo(123);
+    }
+}
diff --git a/ravenwood/run-ravenwood-tests.sh b/ravenwood/run-ravenwood-tests.sh
deleted file mode 100755
index a303626..0000000
--- a/ravenwood/run-ravenwood-tests.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-# Copyright (C) 2024 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Run all the ravenwood tests + hoststubgen unit tests.
-
-all_tests="hoststubgentest tiny-framework-dump-test hoststubgen-invoke-test"
-
-# "echo" is to remove the newlines
-all_tests="$all_tests $(echo $(${0%/*}/list-ravenwood-tests.sh) )"
-
-run() {
-    echo "Running: $*"
-    "${@}"
-}
-
-run ${ATEST:-atest} $all_tests
diff --git a/ravenwood/bulk_enable.py b/ravenwood/scripts/bulk_enable.py
similarity index 100%
rename from ravenwood/bulk_enable.py
rename to ravenwood/scripts/bulk_enable.py
diff --git a/ravenwood/fix_test_runner.py b/ravenwood/scripts/fix_test_runner.py
similarity index 100%
rename from ravenwood/fix_test_runner.py
rename to ravenwood/scripts/fix_test_runner.py
diff --git a/ravenwood/list-ravenwood-tests.sh b/ravenwood/scripts/list-ravenwood-tests.sh
similarity index 100%
rename from ravenwood/list-ravenwood-tests.sh
rename to ravenwood/scripts/list-ravenwood-tests.sh
diff --git a/ravenwood/scripts/ravenwood-stats-checker.sh b/ravenwood/scripts/ravenwood-stats-checker.sh
new file mode 100755
index 0000000..93f4a3f
--- /dev/null
+++ b/ravenwood/scripts/ravenwood-stats-checker.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+# Copyright (C) 2024 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Just print the available *.csv filenames.
+echo '#Stats files:'
+ls *.csv
\ No newline at end of file
diff --git a/ravenwood/scripts/ravenwood-stats-collector.sh b/ravenwood/scripts/ravenwood-stats-collector.sh
new file mode 100755
index 0000000..4dcaa2be
--- /dev/null
+++ b/ravenwood/scripts/ravenwood-stats-collector.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+# Copyright (C) 2024 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Script to collect the ravenwood "stats" CVS files and create a single file.
+
+set -e
+
+# Output file
+out=/tmp/ravenwood-stats-all.csv
+
+# Where the input files are.
+path=$ANDROID_BUILD_TOP/out/host/linux-x86/testcases/ravenwood-stats-checker/x86_64/
+
+m() {
+    ${ANDROID_BUILD_TOP}/build/soong/soong_ui.bash --make-mode "$@"
+}
+
+# Building this will generate the files we need.
+m ravenwood-stats-checker
+
+# Start...
+
+cd $path
+
+dump() {
+    local jar=$1
+    local file=$2
+
+    sed -e '1d' -e "s/^/$jar,/"  $file
+}
+
+collect() {
+    echo 'Jar,PackageName,ClassName,SupportedMethods,TotalMethods'
+    dump "framework-minus-apex"  hoststubgen_framework-minus-apex_stats.csv
+    dump "service.core"  hoststubgen_services.core_stats.csv
+}
+
+collect >$out
+
+echo "Full dump CVS created at $out"
diff --git a/ravenwood/scripts/run-ravenwood-tests.sh b/ravenwood/scripts/run-ravenwood-tests.sh
new file mode 100755
index 0000000..926c08f
--- /dev/null
+++ b/ravenwood/scripts/run-ravenwood-tests.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+# Copyright (C) 2024 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Run all the ravenwood tests + hoststubgen unit tests.
+
+all_tests="hoststubgentest tiny-framework-dump-test hoststubgen-invoke-test ravenwood-stats-checker"
+
+# "echo" is to remove the newlines
+all_tests="$all_tests $(echo $(${0%/*}/list-ravenwood-tests.sh) )"
+
+run() {
+    echo "Running: $*"
+    "${@}"
+}
+
+run ${ATEST:-atest} $all_tests
diff --git a/ravenwood/services-test/test/com/android/ravenwood/RavenwoodServicesDependenciesTest.java b/ravenwood/services-test/test/com/android/ravenwood/RavenwoodServicesDependenciesTest.java
deleted file mode 100644
index efe468d..0000000
--- a/ravenwood/services-test/test/com/android/ravenwood/RavenwoodServicesDependenciesTest.java
+++ /dev/null
@@ -1,54 +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.ravenwood;
-
-import static org.junit.Assert.assertEquals;
-
-import android.platform.test.ravenwood.RavenwoodRule;
-import android.ravenwood.example.BlueManager;
-import android.ravenwood.example.RedManager;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class RavenwoodServicesDependenciesTest {
-    // NOTE: we carefully only ask for RedManager here, and rely on Ravenwood internals to spin
-    // up the implicit dependency on BlueManager
-    @Rule
-    public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder()
-            .setProcessSystem()
-            .setServicesRequired(RedManager.class)
-            .build();
-
-    @Test
-    public void testDirect() {
-        final RedManager red = mRavenwood.getContext().getSystemService(
-                RedManager.class);
-        assertEquals("blue+red", red.getInterfaceDescriptor());
-    }
-
-    @Test
-    public void testIndirect() {
-        final BlueManager blue = mRavenwood.getContext().getSystemService(
-                BlueManager.class);
-        assertEquals("blue", blue.getInterfaceDescriptor());
-    }
-}
diff --git a/ravenwood/services-test/test/com/android/ravenwood/RavenwoodServicesTest.java b/ravenwood/services-test/test/com/android/ravenwood/RavenwoodServicesTest.java
deleted file mode 100644
index c1dee5d..0000000
--- a/ravenwood/services-test/test/com/android/ravenwood/RavenwoodServicesTest.java
+++ /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.ravenwood;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import android.content.Context;
-import android.hardware.SerialManager;
-import android.hardware.SerialManagerInternal;
-import android.platform.test.ravenwood.RavenwoodRule;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.server.LocalServices;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class RavenwoodServicesTest {
-    private static final String TEST_VIRTUAL_PORT = "virtual:example";
-
-    @Rule
-    public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder()
-            .setProcessSystem()
-            .setServicesRequired(SerialManager.class)
-            .build();
-
-    @Test
-    public void testDefined() {
-        final SerialManager fromName = (SerialManager)
-                mRavenwood.getContext().getSystemService(Context.SERIAL_SERVICE);
-        final SerialManager fromClass =
-                mRavenwood.getContext().getSystemService(SerialManager.class);
-        assertNotNull(fromName);
-        assertNotNull(fromClass);
-        assertEquals(fromName, fromClass);
-
-        assertNotNull(LocalServices.getService(SerialManagerInternal.class));
-    }
-
-    @Test
-    public void testSimple() {
-        // Verify that we can obtain a manager, and talk to the backend service, and that no
-        // serial ports are configured by default
-        final SerialManager service = (SerialManager)
-                mRavenwood.getContext().getSystemService(Context.SERIAL_SERVICE);
-        final String[] ports = service.getSerialPorts();
-        assertEquals(0, ports.length);
-    }
-
-    @Test
-    public void testDriven() {
-        final SerialManager service = (SerialManager)
-                mRavenwood.getContext().getSystemService(Context.SERIAL_SERVICE);
-        final SerialManagerInternal internal = LocalServices.getService(
-                SerialManagerInternal.class);
-
-        internal.addVirtualSerialPortForTest(TEST_VIRTUAL_PORT, () -> {
-            throw new UnsupportedOperationException(
-                    "Needs socketpair() to offer accurate emulation");
-        });
-        final String[] ports = service.getSerialPorts();
-        assertEquals(1, ports.length);
-        assertEquals(TEST_VIRTUAL_PORT, ports[0]);
-    }
-}
diff --git a/ravenwood/services-test/test/com/android/ravenwoodtest/servicestest/RavenwoodServicesDependenciesTest.java b/ravenwood/services-test/test/com/android/ravenwoodtest/servicestest/RavenwoodServicesDependenciesTest.java
new file mode 100644
index 0000000..f833782
--- /dev/null
+++ b/ravenwood/services-test/test/com/android/ravenwoodtest/servicestest/RavenwoodServicesDependenciesTest.java
@@ -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.ravenwoodtest.servicestest;
+
+import static org.junit.Assert.assertEquals;
+
+import android.platform.test.ravenwood.RavenwoodRule;
+import android.ravenwood.example.BlueManager;
+import android.ravenwood.example.RedManager;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class RavenwoodServicesDependenciesTest {
+    // NOTE: we carefully only ask for RedManager here, and rely on Ravenwood internals to spin
+    // up the implicit dependency on BlueManager
+    @Rule
+    public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder()
+            .setProcessSystem()
+            .setServicesRequired(RedManager.class)
+            .build();
+
+    @Test
+    public void testDirect() {
+        final RedManager red = mRavenwood.getContext().getSystemService(
+                RedManager.class);
+        assertEquals("blue+red", red.getInterfaceDescriptor());
+    }
+
+    @Test
+    public void testIndirect() {
+        final BlueManager blue = mRavenwood.getContext().getSystemService(
+                BlueManager.class);
+        assertEquals("blue", blue.getInterfaceDescriptor());
+    }
+}
diff --git a/ravenwood/services-test/test/com/android/ravenwoodtest/servicestest/RavenwoodServicesTest.java b/ravenwood/services-test/test/com/android/ravenwoodtest/servicestest/RavenwoodServicesTest.java
new file mode 100644
index 0000000..044239f
--- /dev/null
+++ b/ravenwood/services-test/test/com/android/ravenwoodtest/servicestest/RavenwoodServicesTest.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.ravenwoodtest.servicestest;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import android.content.Context;
+import android.hardware.SerialManager;
+import android.hardware.SerialManagerInternal;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.server.LocalServices;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class RavenwoodServicesTest {
+    private static final String TEST_VIRTUAL_PORT = "virtual:example";
+
+    @Rule
+    public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder()
+            .setProcessSystem()
+            .setServicesRequired(SerialManager.class)
+            .build();
+
+    @Test
+    public void testDefined() {
+        final SerialManager fromName = (SerialManager)
+                mRavenwood.getContext().getSystemService(Context.SERIAL_SERVICE);
+        final SerialManager fromClass =
+                mRavenwood.getContext().getSystemService(SerialManager.class);
+        assertNotNull(fromName);
+        assertNotNull(fromClass);
+        assertEquals(fromName, fromClass);
+
+        assertNotNull(LocalServices.getService(SerialManagerInternal.class));
+    }
+
+    @Test
+    public void testSimple() {
+        // Verify that we can obtain a manager, and talk to the backend service, and that no
+        // serial ports are configured by default
+        final SerialManager service = (SerialManager)
+                mRavenwood.getContext().getSystemService(Context.SERIAL_SERVICE);
+        final String[] ports = service.getSerialPorts();
+        assertEquals(0, ports.length);
+    }
+
+    @Test
+    public void testDriven() {
+        final SerialManager service = (SerialManager)
+                mRavenwood.getContext().getSystemService(Context.SERIAL_SERVICE);
+        final SerialManagerInternal internal = LocalServices.getService(
+                SerialManagerInternal.class);
+
+        internal.addVirtualSerialPortForTest(TEST_VIRTUAL_PORT, () -> {
+            throw new UnsupportedOperationException(
+                    "Needs socketpair() to offer accurate emulation");
+        });
+        final String[] ports = service.getSerialPorts();
+        assertEquals(1, ports.length);
+        assertEquals(TEST_VIRTUAL_PORT, ports[0]);
+    }
+}
diff --git a/ravenwood/test-authors.md b/ravenwood/test-authors.md
index 7c0cee8..2ab43bb 100644
--- a/ravenwood/test-authors.md
+++ b/ravenwood/test-authors.md
@@ -17,6 +17,7 @@
     name: "MyTestsRavenwood",
     static_libs: [
         "androidx.annotation_annotation",
+        "androidx.test.ext.junit",
         "androidx.test.rules",
     ],
     srcs: [
@@ -34,7 +35,7 @@
 import android.platform.test.annotations.IgnoreUnderRavenwood;
 import android.platform.test.ravenwood.RavenwoodRule;
 
-import androidx.test.runner.AndroidJUnit4;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/ravenwood/framework-minus-apex-ravenwood-policies.txt b/ravenwood/texts/framework-minus-apex-ravenwood-policies.txt
similarity index 100%
rename from ravenwood/framework-minus-apex-ravenwood-policies.txt
rename to ravenwood/texts/framework-minus-apex-ravenwood-policies.txt
diff --git a/ravenwood/ravenwood-annotation-allowed-classes.txt b/ravenwood/texts/ravenwood-annotation-allowed-classes.txt
similarity index 100%
rename from ravenwood/ravenwood-annotation-allowed-classes.txt
rename to ravenwood/texts/ravenwood-annotation-allowed-classes.txt
diff --git a/ravenwood/ravenwood-services-jarjar-rules.txt b/ravenwood/texts/ravenwood-services-jarjar-rules.txt
similarity index 100%
rename from ravenwood/ravenwood-services-jarjar-rules.txt
rename to ravenwood/texts/ravenwood-services-jarjar-rules.txt
diff --git a/ravenwood/ravenwood-standard-options.txt b/ravenwood/texts/ravenwood-standard-options.txt
similarity index 100%
rename from ravenwood/ravenwood-standard-options.txt
rename to ravenwood/texts/ravenwood-standard-options.txt
diff --git a/ravenwood/services.core-ravenwood-policies.txt b/ravenwood/texts/services.core-ravenwood-policies.txt
similarity index 100%
rename from ravenwood/services.core-ravenwood-policies.txt
rename to ravenwood/texts/services.core-ravenwood-policies.txt
diff --git a/services/Android.bp b/services/Android.bp
index 7bbb42e..6235195 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -241,6 +241,7 @@
     libs: [
         "android.hidl.manager-V1.0-java",
         "framework-tethering.stubs.module_lib",
+        "keepanno-annotations",
         "service-art.stubs.system_server",
         "service-permission.stubs.system_server",
         "service-rkp.stubs.system_server",
@@ -254,6 +255,7 @@
     required: [
         "libukey2_jni_shared",
         "protolog.conf.json.gz",
+        "core.protolog.pb",
     ],
     lint: {
         baseline_filename: "lint-baseline.xml",
@@ -285,6 +287,11 @@
 // API stub
 // =============================================================
 
+soong_config_module_type_import {
+    from: "frameworks/base/api/Android.bp",
+    module_types: ["non_updatable_exportable_droidstubs"],
+}
+
 stubs_defaults {
     name: "services-stubs-default",
     installable: false,
@@ -300,10 +307,12 @@
     filter_packages: ["com.android."],
 }
 
-droidstubs {
+non_updatable_exportable_droidstubs {
     name: "services-non-updatable-stubs",
     srcs: [":services-non-updatable-sources"],
-    defaults: ["services-stubs-default"],
+    defaults: [
+        "services-stubs-default",
+    ],
     check_api: {
         current: {
             api_file: "api/current.txt",
@@ -320,14 +329,34 @@
             targets: ["sdk"],
             dir: "apistubs/android/system-server/api",
             dest: "android-non-updatable.txt",
-            tag: ".api.txt",
         },
         {
             targets: ["sdk"],
             dir: "apistubs/android/system-server/api",
             dest: "android-non-updatable-removed.txt",
-            tag: ".removed-api.txt",
         },
     ],
+    soong_config_variables: {
+        release_hidden_api_exportable_stubs: {
+            dists: [
+                {
+                    tag: ".exportable.api.txt",
+                },
+                {
+                    tag: ".exportable.removed-api.txt",
+                },
+            ],
+            conditions_default: {
+                dists: [
+                    {
+                        tag: ".api.txt",
+                    },
+                    {
+                        tag: ".removed-api.txt",
+                    },
+                ],
+            },
+        },
+    },
     api_surface: "system-server",
 }
diff --git a/services/accessibility/Android.bp b/services/accessibility/Android.bp
index 69cc68a..7a99b60 100644
--- a/services/accessibility/Android.bp
+++ b/services/accessibility/Android.bp
@@ -34,6 +34,8 @@
     ],
     static_libs: [
         "com_android_server_accessibility_flags_lib",
+        "//frameworks/base/packages/SystemUI/aconfig:com_android_systemui_flags_lib",
+
     ],
 }
 
@@ -56,6 +58,7 @@
 aconfig_declarations {
     name: "com_android_server_accessibility_flags",
     package: "com.android.server.accessibility",
+    container: "system",
     srcs: [
         "accessibility.aconfig",
     ],
diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig
index 997f3af..bfa1c7b 100644
--- a/services/accessibility/accessibility.aconfig
+++ b/services/accessibility/accessibility.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.accessibility"
+container: "system"
 
 # NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
 
@@ -24,10 +25,13 @@
 }
 
 flag {
-    name: "compute_window_changes_on_a11y"
+    name: "compute_window_changes_on_a11y_v2"
     namespace: "accessibility"
     description: "Computes accessibility window changes in accessibility instead of wm package."
     bug: "322444245"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
 }
 
 flag {
@@ -45,6 +49,13 @@
 }
 
 flag {
+    name: "enable_a11y_checker_logging"
+    namespace: "accessibility"
+    description: "Whether to identify and log app a11y issues."
+    bug: "325420273"
+}
+
+flag {
     name: "enable_magnification_joystick"
     namespace: "accessibility"
     description: "Whether to enable joystick controls for magnification"
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 880a687..bbbc4ae 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -31,16 +31,14 @@
 import static android.companion.virtual.VirtualDeviceManager.EXTRA_VIRTUAL_DEVICE_ID;
 import static android.content.Context.DEVICE_ID_DEFAULT;
 import static android.provider.Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
 import static android.view.accessibility.AccessibilityManager.FlashNotificationReason;
-import static android.view.accessibility.AccessibilityManager.ShortcutType;
 
 import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
 import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME;
 import static com.android.internal.accessibility.common.ShortcutConstants.USER_SHORTCUT_TYPES;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import static com.android.internal.accessibility.util.AccessibilityStatsLogUtils.logAccessibilityShortcutActivated;
 import static com.android.internal.util.FunctionalUtils.ignoreRemoteException;
 import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
@@ -149,7 +147,6 @@
 import com.android.internal.accessibility.AccessibilityShortcutController.LaunchableFrameworkFeatureInfo;
 import com.android.internal.accessibility.common.ShortcutConstants;
 import com.android.internal.accessibility.common.ShortcutConstants.FloatingMenuSize;
-import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity;
 import com.android.internal.accessibility.dialog.AccessibilityShortcutChooserActivity;
 import com.android.internal.accessibility.util.AccessibilityUtils;
@@ -164,6 +161,7 @@
 import com.android.internal.util.DumpUtils;
 import com.android.internal.util.IntPair;
 import com.android.internal.util.Preconditions;
+import com.android.modules.expresslog.Counter;
 import com.android.server.AccessibilityManagerInternal;
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
@@ -242,6 +240,13 @@
     private static final String SET_PIP_ACTION_REPLACEMENT =
             "setPictureInPictureActionReplacingConnection";
 
+    /**
+     * An intent action to launch Hearing devices dialog.
+     */
+    @VisibleForTesting
+    static final String ACTION_LAUNCH_HEARING_DEVICES_DIALOG =
+            "com.android.systemui.action.LAUNCH_HEARING_DEVICES_DIALOG";
+
     private static final char COMPONENT_NAME_SEPARATOR = ':';
 
     private static final int OWN_PROCESS_ID = android.os.Process.myPid();
@@ -252,6 +257,20 @@
     public static final int MAGNIFICATION_GESTURE_HANDLER_ID = 0;
 
     private static int sIdCounter = MAGNIFICATION_GESTURE_HANDLER_ID + 1;
+    /**
+     * The counter metric id tracking how many times users add qs shortcut for a11y features.
+     *
+     * <p>Defined in frameworks/proto_logging/stats/express/catalog/accessibility.cfg.
+     */
+    static final String METRIC_ID_QS_SHORTCUT_ADD = "accessibility.value_qs_shortcut_add";
+
+    /**
+     * The counter metric id tracking how many times users remove qs shortcut for a11y features.
+     *
+     * <p>Defined in frameworks/proto_logging/stats/express/catalog/accessibility.cfg.
+     */
+    static final String METRIC_ID_QS_SHORTCUT_REMOVE = "accessibility.value_qs_shortcut_remove";
+
 
     private final Context mContext;
 
@@ -1664,7 +1683,7 @@
         }
         mMainHandler.sendMessage(obtainMessage(
                 AccessibilityManagerService::performAccessibilityShortcutInternal, this,
-                displayId, ACCESSIBILITY_BUTTON, targetName));
+                displayId, UserShortcutType.SOFTWARE, targetName));
     }
 
     /**
@@ -1767,6 +1786,9 @@
                 if (serviceInfo != null && isAccessibilityServiceWarningRequired(serviceInfo)) {
                     // TODO(b/314850435): show full device control warning if needed after
                     // SysUI QS Panel can update live
+                    // The user attempts to add QS shortcut in QS Panel, but we don't actually
+                    // turn on the shortcut due to lack of full device control permission
+                    logMetricForQsShortcutConfiguration(/* enable= */ true, /* numOfFeatures= */ 1);
                     continue;
                 }
                 a11yFeaturesToEnable.add(a11yFeature);
@@ -2258,9 +2280,9 @@
     }
 
     private void showAccessibilityTargetsSelection(int displayId,
-            @ShortcutType int shortcutType) {
+            @UserShortcutType int shortcutType) {
         final Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON);
-        final String chooserClassName = (shortcutType == ACCESSIBILITY_SHORTCUT_KEY)
+        final String chooserClassName = (shortcutType == UserShortcutType.HARDWARE)
                 ? AccessibilityShortcutChooserActivity.class.getName()
                 : AccessibilityButtonChooserActivity.class.getName();
         intent.setClassName(CHOOSER_PACKAGE_NAME, chooserClassName);
@@ -2293,6 +2315,14 @@
         }
     }
 
+    private void launchHearingDevicesDialog() {
+        final Intent intent = new Intent(ACTION_LAUNCH_HEARING_DEVICES_DIALOG);
+        intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+        intent.setPackage(
+                mContext.getString(com.android.internal.R.string.config_systemUi));
+        mContext.sendBroadcastAsUser(intent, UserHandle.SYSTEM);
+    }
+
     private void notifyAccessibilityButtonVisibilityChangedLocked(boolean available) {
         final AccessibilityUserState state = getCurrentUserStateLocked();
         mIsAccessibilityButtonShown = available;
@@ -2704,10 +2734,13 @@
                 userState.mComponentNameToServiceMap;
         boolean isUnlockingOrUnlocked = mUmi.isUserUnlockingOrUnlocked(userState.mUserId);
 
+        // Store the list of installed services.
+        mTempComponentNameSet.clear();
         for (int i = 0, count = userState.mInstalledServices.size(); i < count; i++) {
             AccessibilityServiceInfo installedService = userState.mInstalledServices.get(i);
             ComponentName componentName = ComponentName.unflattenFromString(
                     installedService.getId());
+            mTempComponentNameSet.add(componentName);
 
             AccessibilityServiceConnection service = componentNameToServiceMap.get(componentName);
 
@@ -2767,6 +2800,25 @@
             audioManager.setAccessibilityServiceUids(mTempIntArray);
         }
         mActivityTaskManagerService.setAccessibilityServiceUids(mTempIntArray);
+
+        // If any services have been removed, remove them from the enabled list and the touch
+        // exploration granted list.
+        boolean anyServiceRemoved =
+                userState.mEnabledServices.removeIf((comp) -> !mTempComponentNameSet.contains(comp))
+                        || userState.mTouchExplorationGrantedServices.removeIf(
+                                (comp) -> !mTempComponentNameSet.contains(comp));
+        if (anyServiceRemoved) {
+            // Update the enabled services setting.
+            persistComponentNamesToSettingLocked(
+                    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+                    userState.mEnabledServices,
+                    userState.mUserId);
+            // Update the touch exploration granted services setting.
+            persistComponentNamesToSettingLocked(
+                    Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
+                    userState.mTouchExplorationGrantedServices,
+                    userState.mUserId);
+        }
         updateAccessibilityEnabledSettingLocked(userState);
     }
 
@@ -3345,7 +3397,7 @@
         }
 
         final Set<String> currentTargets =
-                userState.getShortcutTargetsLocked(ACCESSIBILITY_SHORTCUT_KEY);
+                userState.getShortcutTargetsLocked(UserShortcutType.HARDWARE);
         if (targetsFromSetting.equals(currentTargets)) {
             return false;
         }
@@ -3376,7 +3428,7 @@
                 userState.mUserId, str -> str, targetsFromSetting);
 
         final Set<String> currentTargets =
-                userState.getShortcutTargetsLocked(ACCESSIBILITY_BUTTON);
+                userState.getShortcutTargetsLocked(UserShortcutType.SOFTWARE);
         if (targetsFromSetting.equals(currentTargets)) {
             return false;
         }
@@ -3431,7 +3483,7 @@
      */
     private void updateAccessibilityShortcutKeyTargetsLocked(AccessibilityUserState userState) {
         final Set<String> currentTargets =
-                userState.getShortcutTargetsLocked(ACCESSIBILITY_SHORTCUT_KEY);
+                userState.getShortcutTargetsLocked(UserShortcutType.HARDWARE);
         final int lastSize = currentTargets.size();
         if (lastSize == 0) {
             return;
@@ -3532,7 +3584,7 @@
                     && userState.isMagnificationTwoFingerTripleTapEnabledLocked()));
 
         final boolean createConnectionForCurrentCapability =
-                com.android.window.flags.Flags.magnificationAlwaysDrawFullscreenBorder()
+                com.android.window.flags.Flags.alwaysDrawMagnificationFullscreenBorder()
                         || (userState.getMagnificationCapabilitiesLocked()
                                 != Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
 
@@ -3623,7 +3675,7 @@
         }
 
         final Set<String> currentTargets =
-                userState.getShortcutTargetsLocked(ACCESSIBILITY_BUTTON);
+                userState.getShortcutTargetsLocked(UserShortcutType.SOFTWARE);
         final int lastSize = currentTargets.size();
         if (lastSize == 0) {
             return;
@@ -3663,7 +3715,7 @@
             return;
         }
         final Set<String> buttonTargets =
-                userState.getShortcutTargetsLocked(ACCESSIBILITY_BUTTON);
+                userState.getShortcutTargetsLocked(UserShortcutType.SOFTWARE);
         int lastSize = buttonTargets.size();
         buttonTargets.removeIf(name -> {
             if (packageName != null && name != null && !name.contains(packageName)) {
@@ -3700,7 +3752,7 @@
         lastSize = buttonTargets.size();
 
         final Set<String> shortcutKeyTargets =
-                userState.getShortcutTargetsLocked(ACCESSIBILITY_SHORTCUT_KEY);
+                userState.getShortcutTargetsLocked(UserShortcutType.HARDWARE);
         final Set<String> qsShortcutTargets =
                 userState.getShortcutTargetsLocked(UserShortcutType.QUICK_SETTINGS);
         userState.mEnabledServices.forEach(componentName -> {
@@ -3806,10 +3858,10 @@
 
         final List<Pair<Integer, String>> shortcutTypeAndShortcutSetting = new ArrayList<>(3);
         shortcutTypeAndShortcutSetting.add(
-                new Pair<>(ACCESSIBILITY_SHORTCUT_KEY,
+                new Pair<>(UserShortcutType.HARDWARE,
                         Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE));
         shortcutTypeAndShortcutSetting.add(
-                new Pair<>(ACCESSIBILITY_BUTTON,
+                new Pair<>(UserShortcutType.SOFTWARE,
                         Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS));
         if (android.view.accessibility.Flags.a11yQsShortcut()) {
             shortcutTypeAndShortcutSetting.add(
@@ -3916,7 +3968,7 @@
         }
         mMainHandler.sendMessage(obtainMessage(
                 AccessibilityManagerService::performAccessibilityShortcutInternal, this,
-                Display.DEFAULT_DISPLAY, ACCESSIBILITY_SHORTCUT_KEY, targetName));
+                Display.DEFAULT_DISPLAY, UserShortcutType.HARDWARE, targetName));
     }
 
     /**
@@ -3929,7 +3981,7 @@
      *        specified target.
      */
     private void performAccessibilityShortcutInternal(int displayId,
-            @ShortcutType int shortcutType, @Nullable String targetName) {
+            @UserShortcutType int shortcutType, @Nullable String targetName) {
         final List<String> shortcutTargets = getAccessibilityShortcutTargetsInternal(shortcutType);
         if (shortcutTargets.isEmpty()) {
             Slog.d(LOG_TAG, "No target to perform shortcut, shortcutType=" + shortcutType);
@@ -3980,7 +4032,7 @@
     }
 
     private boolean performAccessibilityFrameworkFeature(int displayId,
-            ComponentName assignedTarget, @ShortcutType int shortcutType) {
+            ComponentName assignedTarget, @UserShortcutType int shortcutType) {
         final Map<ComponentName, FrameworkFeatureInfo> frameworkFeatureMap =
                 AccessibilityShortcutController.getFrameworkShortcutFeaturesMap();
         if (!frameworkFeatureMap.containsKey(assignedTarget)) {
@@ -4029,12 +4081,12 @@
     /**
      * Perform accessibility service shortcut action.
      *
-     * 1) For {@link AccessibilityManager#ACCESSIBILITY_BUTTON} type and services targeting sdk
+     * 1) For {@link UserShortcutType#SOFTWARE} type and services targeting sdk
      *    version <= Q: callbacks to accessibility service if service is bounded and requests
      *    accessibility button.
-     * 2) For {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY} type and service targeting sdk
+     * 2) For {@link UserShortcutType#HARDWARE} type and service targeting sdk
      *    version <= Q: turns on / off the accessibility service.
-     * 3) For {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY} type and service targeting sdk
+     * 3) For {@link UserShortcutType#HARDWARE} type and service targeting sdk
      *    version > Q and request accessibility button: turn on the accessibility service if it's
      *    not in the enabled state.
      *    (It'll happen when a service is disabled and assigned to shortcut then upgraded.)
@@ -4045,7 +4097,7 @@
      *       button.
      */
     private boolean performAccessibilityShortcutTargetService(int displayId,
-            @ShortcutType int shortcutType, ComponentName assignedTarget) {
+            @UserShortcutType int shortcutType, ComponentName assignedTarget) {
         synchronized (mLock) {
             final AccessibilityUserState userState = getCurrentUserStateLocked();
             final AccessibilityServiceInfo installedServiceInfo =
@@ -4063,7 +4115,7 @@
             final boolean requestA11yButton = (installedServiceInfo.flags
                     & FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
             // Turns on / off the accessibility service
-            if ((targetSdk <= Build.VERSION_CODES.Q && shortcutType == ACCESSIBILITY_SHORTCUT_KEY)
+            if ((targetSdk <= Build.VERSION_CODES.Q && shortcutType == UserShortcutType.HARDWARE)
                     || (targetSdk > Build.VERSION_CODES.Q && !requestA11yButton)) {
                 if (serviceConnection == null) {
                     logAccessibilityShortcutActivated(mContext, assignedTarget, shortcutType,
@@ -4077,7 +4129,7 @@
                 }
                 return true;
             }
-            if (shortcutType == ACCESSIBILITY_SHORTCUT_KEY && targetSdk > Build.VERSION_CODES.Q
+            if (shortcutType == UserShortcutType.HARDWARE && targetSdk > Build.VERSION_CODES.Q
                     && requestA11yButton) {
                 if (!userState.getEnabledServicesLocked().contains(assignedTarget)) {
                     enableAccessibilityServiceLocked(assignedTarget, mCurrentUserId);
@@ -4102,7 +4154,13 @@
 
     private void launchAccessibilityFrameworkFeature(int displayId, ComponentName assignedTarget) {
         if (assignedTarget.equals(ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME)) {
-            launchAccessibilitySubSettings(displayId, ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME);
+            //import com.android.systemui.Flags;
+            if (com.android.systemui.Flags.hearingAidsQsTileDialog()) {
+                launchHearingDevicesDialog();
+            } else {
+                launchAccessibilitySubSettings(displayId,
+                        ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME);
+            }
         }
     }
 
@@ -4183,6 +4241,8 @@
             );
 
             if (shortcutType == UserShortcutType.QUICK_SETTINGS) {
+                int numOfFeatureChanged = Math.abs(currentTargets.size() - validNewTargets.size());
+                logMetricForQsShortcutConfiguration(enable, numOfFeatureChanged);
                 userState.updateA11yQsTargetLocked(validNewTargets);
                 scheduleNotifyClientsOfServicesStateChangeLocked(userState);
                 onUserStateChangedLocked(userState);
@@ -4363,7 +4423,7 @@
     }
 
     @Override
-    public List<String> getAccessibilityShortcutTargets(@ShortcutType int shortcutType) {
+    public List<String> getAccessibilityShortcutTargets(@UserShortcutType int shortcutType) {
         if (mTraceManager.isA11yTracingEnabledForTypes(FLAGS_ACCESSIBILITY_MANAGER)) {
             mTraceManager.logTrace(LOG_TAG + ".getAccessibilityShortcutTargets",
                     FLAGS_ACCESSIBILITY_MANAGER, "shortcutType=" + shortcutType);
@@ -4377,12 +4437,13 @@
         return getAccessibilityShortcutTargetsInternal(shortcutType);
     }
 
-    private List<String> getAccessibilityShortcutTargetsInternal(@ShortcutType int shortcutType) {
+    private List<String> getAccessibilityShortcutTargetsInternal(
+            @UserShortcutType int shortcutType) {
         synchronized (mLock) {
             final AccessibilityUserState userState = getCurrentUserStateLocked();
             final ArrayList<String> shortcutTargets = new ArrayList<>(
                     userState.getShortcutTargetsLocked(shortcutType));
-            if (shortcutType != ACCESSIBILITY_BUTTON) {
+            if (shortcutType != UserShortcutType.SOFTWARE) {
                 return shortcutTargets;
             }
             // Adds legacy a11y services requesting a11y button into the list.
@@ -4815,7 +4876,8 @@
                                         uid, packageName);
                         final boolean ecmEnabled = mContext.getResources().getBoolean(
                                 com.android.internal.R.bool.config_enhancedConfirmationModeEnabled);
-                        return !ecmEnabled || mode == AppOpsManager.MODE_ALLOWED;
+                        return !ecmEnabled || mode == AppOpsManager.MODE_ALLOWED
+                                || mode == AppOpsManager.MODE_DEFAULT;
                     } catch (Exception e) {
                         // Fallback in case if app ops is not available in testing.
                         return false;
@@ -4874,7 +4936,7 @@
             }
         }
         // Warning is not required if the service is already assigned to a shortcut.
-        for (int shortcutType : AccessibilityManager.SHORTCUT_TYPES) {
+        for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) {
             if (getAccessibilityShortcutTargets(shortcutType).contains(
                     componentName.flattenToString())) {
                 return false;
@@ -6214,7 +6276,6 @@
         }
     }
 
-
     /**
      * Bypasses the timeout restriction if volume key shortcut assigned.
      */
@@ -6224,4 +6285,17 @@
                 Settings.Secure.SKIP_ACCESSIBILITY_SHORTCUT_DIALOG_TIMEOUT_RESTRICTION,
                 /* true */ 1);
     }
+
+    /**
+     * Log the metric when the user add/remove qs shortcut for accessibility features. Use the
+     * callingUid to know where the users configure the a11y qs shortcuts.
+     */
+    private void logMetricForQsShortcutConfiguration(boolean enable, int numOfFeatures) {
+        if (numOfFeatures <= 0) {
+            // Skip logging metric if no a11y features are configured
+            return;
+        }
+        String metricId = enable ? METRIC_ID_QS_SHORTCUT_ADD : METRIC_ID_QS_SHORTCUT_REMOVE;
+        Counter.logIncrementWithUid(metricId, Binder.getCallingUid(), numOfFeatures);
+    }
 }
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
index fb28055..1f65e15 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
@@ -37,6 +37,8 @@
 import android.annotation.UserIdInt;
 import android.app.PendingIntent;
 import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -695,6 +697,13 @@
             throw new IllegalArgumentException(
                     bluetoothAddress + " is not a valid Bluetooth address");
         }
+        final BluetoothManager bluetoothManager =
+                mContext.getSystemService(BluetoothManager.class);
+        final String bluetoothDeviceName = bluetoothManager == null ? null :
+                bluetoothManager.getAdapter().getBondedDevices().stream()
+                        .filter(device -> device.getAddress().equalsIgnoreCase(bluetoothAddress))
+                        .map(BluetoothDevice::getName)
+                        .findFirst().orElse(null);
         synchronized (mLock) {
             checkAccessibilityAccessLocked();
             if (mBrailleDisplayConnection != null) {
@@ -706,7 +715,10 @@
                 connection.setTestData(mTestBrailleDisplays);
             }
             connection.connectLocked(
-                    bluetoothAddress, BrailleDisplayConnection.BUS_BLUETOOTH, controller);
+                    bluetoothAddress,
+                    bluetoothDeviceName,
+                    BrailleDisplayConnection.BUS_BLUETOOTH,
+                    controller);
         }
     }
 
@@ -763,7 +775,10 @@
                 connection.setTestData(mTestBrailleDisplays);
             }
             connection.connectLocked(
-                    usbSerialNumber, BrailleDisplayConnection.BUS_USB, controller);
+                    usbSerialNumber,
+                    usbDevice.getProductName(),
+                    BrailleDisplayConnection.BUS_USB,
+                    controller);
         }
     }
 
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
index 7008e8e..a37a184 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
@@ -24,11 +24,9 @@
 import static android.accessibilityservice.AccessibilityService.SHOW_MODE_MASK;
 import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;
 import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_NONE;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-import static android.view.accessibility.AccessibilityManager.ShortcutType;
 
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 
 import android.accessibilityservice.AccessibilityService.SoftKeyboardShowMode;
 import android.accessibilityservice.AccessibilityServiceInfo;
@@ -53,7 +51,6 @@
 
 import com.android.internal.R;
 import com.android.internal.accessibility.AccessibilityShortcutController;
-import com.android.internal.accessibility.common.ShortcutConstants;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -779,15 +776,22 @@
      * @param shortcutType The shortcut type.
      * @return The array set of the strings
      */
-    public ArraySet<String> getShortcutTargetsLocked(@ShortcutType int shortcutType) {
-        if (shortcutType == ACCESSIBILITY_SHORTCUT_KEY) {
+    public ArraySet<String> getShortcutTargetsLocked(@UserShortcutType int shortcutType) {
+        if (shortcutType == UserShortcutType.HARDWARE) {
             return mAccessibilityShortcutKeyTargets;
-        } else if (shortcutType == ACCESSIBILITY_BUTTON) {
+        } else if (shortcutType == UserShortcutType.SOFTWARE) {
             return mAccessibilityButtonTargets;
-        } else if (shortcutType == ShortcutConstants.UserShortcutType.QUICK_SETTINGS) {
+        } else if (shortcutType == UserShortcutType.QUICK_SETTINGS) {
             return getA11yQsTargets();
+        } else if ((shortcutType == UserShortcutType.TRIPLETAP
+                && isMagnificationSingleFingerTripleTapEnabledLocked()) || (
+                shortcutType == UserShortcutType.TWOFINGER_DOUBLETAP
+                        && isMagnificationTwoFingerTripleTapEnabledLocked())) {
+            ArraySet<String> targets = new ArraySet<>();
+            targets.add(MAGNIFICATION_CONTROLLER_NAME);
+            return targets;
         }
-        return null;
+        return new ArraySet<>();
     }
 
     /**
@@ -830,8 +834,16 @@
      * @param target The component name of the shortcut target.
      * @return true if the shortcut target is removed.
      */
-    public boolean removeShortcutTargetLocked(@ShortcutType int shortcutType,
-            ComponentName target) {
+    public boolean removeShortcutTargetLocked(
+            @UserShortcutType int shortcutType, ComponentName target) {
+        if (shortcutType == UserShortcutType.TRIPLETAP
+                || shortcutType == UserShortcutType.TWOFINGER_DOUBLETAP) {
+            throw new UnsupportedOperationException(
+                    "removeShortcutTargetLocked only support shortcut type: "
+                            + "software and hardware and quick settings for now"
+            );
+        }
+
         Set<String> targets = getShortcutTargetsLocked(shortcutType);
         boolean result = targets.removeIf(name -> {
             ComponentName componentName;
@@ -841,7 +853,7 @@
             }
             return componentName.equals(target);
         });
-        if (shortcutType == ShortcutConstants.UserShortcutType.QUICK_SETTINGS) {
+        if (shortcutType == UserShortcutType.QUICK_SETTINGS) {
             updateA11yQsTargetLocked(targets);
         }
 
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
index d307484..6007bfd 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
@@ -445,7 +445,7 @@
         public void onWindowsForAccessibilityChanged(boolean forceSend, int topFocusedDisplayId,
                 IBinder topFocusedWindowToken, @NonNull List<WindowInfo> windows) {
             synchronized (mLock) {
-                if (!Flags.computeWindowChangesOnA11y()) {
+                if (!Flags.computeWindowChangesOnA11yV2()) {
                     // If the flag is enabled, it's already done in #createWindowInfoListLocked.
                     updateWindowsByWindowAttributesLocked(windows);
                 }
@@ -491,7 +491,7 @@
 
         /**
          * Called when the windows for accessibility changed. This is called if
-         * {@link com.android.server.accessibility.Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y} is
+         * {@link com.android.server.accessibility.Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y_V2} is
          * true.
          *
          * @param forceSend             Send the windows for accessibility even if they haven't
@@ -996,7 +996,7 @@
             final int windowId = findWindowIdLocked(userId, window.token);
 
             // With the flag enabled, createWindowInfoListLocked() already removes invalid windows.
-            if (!Flags.computeWindowChangesOnA11y()) {
+            if (!Flags.computeWindowChangesOnA11yV2()) {
                 if (windowId < 0) {
                     return null;
                 }
diff --git a/services/accessibility/java/com/android/server/accessibility/BrailleDisplayConnection.java b/services/accessibility/java/com/android/server/accessibility/BrailleDisplayConnection.java
index 8b41873..b0da3f0 100644
--- a/services/accessibility/java/com/android/server/accessibility/BrailleDisplayConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/BrailleDisplayConnection.java
@@ -24,6 +24,7 @@
 import android.accessibilityservice.IBrailleDisplayController;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.annotation.PermissionManuallyEnforced;
 import android.annotation.RequiresNoPermission;
 import android.bluetooth.BluetoothDevice;
@@ -33,6 +34,7 @@
 import android.os.IBinder;
 import android.os.Process;
 import android.os.RemoteException;
+import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Pair;
@@ -141,6 +143,8 @@
 
         @BusType
         int getDeviceBusType(@NonNull Path path);
+
+        String getName(@NonNull Path path);
     }
 
     /**
@@ -149,15 +153,19 @@
      * <p>If found, saves instance state for this connection and starts a thread to
      * read from the Braille display.
      *
-     * @param expectedUniqueId  The expected unique ID of the device to connect, from
-     *                          {@link UsbDevice#getSerialNumber()}
-     *                          or {@link BluetoothDevice#getAddress()}
-     * @param expectedBusType   The expected bus type from {@link BusType}.
-     * @param controller        Interface containing oneway callbacks used to communicate with the
-     *                          {@link android.accessibilityservice.BrailleDisplayController}.
+     * @param expectedUniqueId The expected unique ID of the device to connect, from
+     *                         {@link UsbDevice#getSerialNumber()} or
+     *                         {@link BluetoothDevice#getAddress()}.
+     * @param expectedName     The expected name of the device to connect, from
+     *                         {@link BluetoothDevice#getName()} or
+     *                         {@link UsbDevice#getProductName()}.
+     * @param expectedBusType  The expected bus type from {@link BusType}.
+     * @param controller       Interface containing oneway callbacks used to communicate with the
+     *                         {@link android.accessibilityservice.BrailleDisplayController}.
      */
     void connectLocked(
             @NonNull String expectedUniqueId,
+            @Nullable String expectedName,
             @BusType int expectedBusType,
             @NonNull IBrailleDisplayController controller) {
         Objects.requireNonNull(expectedUniqueId);
@@ -179,10 +187,20 @@
                 unableToGetDescriptor = true;
                 continue;
             }
+            final boolean matchesIdentifier;
             final String uniqueId = mScanner.getUniqueId(path);
+            if (uniqueId != null) {
+                matchesIdentifier = expectedUniqueId.equalsIgnoreCase(uniqueId);
+            } else {
+                // HIDIOCGRAWUNIQ was added in kernel version 5.7.
+                // If the device has an older kernel that does not support that ioctl then as a
+                // fallback we can check against the device name (from HIDIOCGRAWNAME).
+                final String name = mScanner.getName(path);
+                matchesIdentifier = !TextUtils.isEmpty(expectedName) && expectedName.equals(name);
+            }
             if (isBrailleDisplay(descriptor)
                     && mScanner.getDeviceBusType(path) == expectedBusType
-                    && expectedUniqueId.equalsIgnoreCase(uniqueId)) {
+                    && matchesIdentifier) {
                 result.add(Pair.create(path.toFile(), descriptor));
             }
         }
@@ -498,6 +516,12 @@
                 Integer busType = readFromFileDescriptor(path, nativeInterface::getHidrawBusType);
                 return busType != null ? busType : BUS_UNKNOWN;
             }
+
+            @Override
+            public String getName(@NonNull Path path) {
+                Objects.requireNonNull(path);
+                return readFromFileDescriptor(path, nativeInterface::getHidrawName);
+            }
         };
     }
 
@@ -542,6 +566,12 @@
                             BrailleDisplayController.TEST_BRAILLE_DISPLAY_BUS_BLUETOOTH)
                             ? BUS_BLUETOOTH : BUS_USB;
                 }
+
+                @Override
+                public String getName(@NonNull Path path) {
+                    return brailleDisplayMap.get(path).getString(
+                            BrailleDisplayController.TEST_BRAILLE_DISPLAY_NAME);
+                }
             };
             return mScanner;
         }
@@ -579,6 +609,8 @@
          * @return the result of ioctl(HIDIOCGRAWINFO).bustype, or -1 if the ioctl fails.
          */
         int getHidrawBusType(int fd);
+
+        String getHidrawName(int fd);
     }
 
     /** Native interface that actually calls native HIDRAW ioctls. */
@@ -602,6 +634,11 @@
         public int getHidrawBusType(int fd) {
             return nativeGetHidrawBusType(fd);
         }
+
+        @Override
+        public String getHidrawName(int fd) {
+            return nativeGetHidrawName(fd);
+        }
     }
 
     private static native int nativeGetHidrawDescSize(int fd);
@@ -611,4 +648,6 @@
     private static native String nativeGetHidrawUniq(int fd);
 
     private static native int nativeGetHidrawBusType(int fd);
+
+    private static native String nativeGetHidrawName(int fd);
 }
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
index 0d5fd14..20bec59 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
@@ -587,7 +587,7 @@
 
     @Override
     public void onFullScreenMagnificationActivationState(int displayId, boolean activated) {
-        if (Flags.magnificationAlwaysDrawFullscreenBorder()) {
+        if (Flags.alwaysDrawMagnificationFullscreenBorder()) {
             getMagnificationConnectionManager()
                     .onFullscreenMagnificationActivationChanged(displayId, activated);
         }
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index 16fe007..5e566aa 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -23,6 +23,8 @@
 import static android.content.res.Resources.ID_NULL;
 import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI;
 
+import static com.android.server.appwidget.AppWidgetXmlUtil.deserializeWidgetSizesStr;
+import static com.android.server.appwidget.AppWidgetXmlUtil.serializeWidgetSizes;
 import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
 
 import android.Manifest;
@@ -107,6 +109,7 @@
 import android.util.Log;
 import android.util.LongSparseArray;
 import android.util.Pair;
+import android.util.SizeF;
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
@@ -176,6 +179,8 @@
 
     private static final String STATE_FILENAME = "appwidgets.xml";
 
+    private static final String KEY_SIZES = "sizes";
+
     private static final int MIN_UPDATE_PERIOD = DEBUG ? 0 : 30 * 60 * 1000; // 30 minutes
 
     private static final int TAG_UNDEFINED = -1;
@@ -2710,6 +2715,11 @@
             out.attributeIntHex(null, "max_height", (maxHeight > 0) ? maxHeight : 0);
             out.attributeIntHex(null, "host_category", widget.options.getInt(
                     AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY));
+            List<SizeF> sizes = widget.options.getParcelableArrayList(
+                    AppWidgetManager.OPTION_APPWIDGET_SIZES, SizeF.class);
+            if (sizes != null) {
+                out.attribute(null, KEY_SIZES, serializeWidgetSizes(sizes));
+            }
             if (saveRestoreCompleted) {
                 boolean restoreCompleted = widget.options.getBoolean(
                         AppWidgetManager.OPTION_APPWIDGET_RESTORE_COMPLETED);
@@ -2741,6 +2751,11 @@
         if (maxHeight != -1) {
             options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT, maxHeight);
         }
+        String sizesStr = parser.getAttributeValue(null, KEY_SIZES);
+        ArrayList<SizeF> sizes = deserializeWidgetSizesStr(sizesStr);
+        if (sizes != null) {
+            options.putParcelableArrayList(AppWidgetManager.OPTION_APPWIDGET_SIZES, sizes);
+        }
         int category = parser.getAttributeIntHex(null, "host_category",
                 AppWidgetProviderInfo.WIDGET_CATEGORY_UNKNOWN);
         if (category != AppWidgetProviderInfo.WIDGET_CATEGORY_UNKNOWN) {
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java
index 69b738a..d781cd8 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java
@@ -22,12 +22,18 @@
 import android.content.ComponentName;
 import android.os.Build;
 import android.text.TextUtils;
+import android.util.SizeF;
+import android.util.Slog;
 
 import com.android.modules.utils.TypedXmlPullParser;
 import com.android.modules.utils.TypedXmlSerializer;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * @hide
@@ -59,6 +65,7 @@
     private static final String ATTR_DESCRIPTION_RES = "description_res";
     private static final String ATTR_PROVIDER_INHERITANCE = "provider_inheritance";
     private static final String ATTR_OS_FINGERPRINT = "os_fingerprint";
+    private static final String SIZE_SEPARATOR = ",";
 
     /**
      * @hide
@@ -137,4 +144,25 @@
             ATTR_PROVIDER_INHERITANCE, false);
         return info;
     }
+
+    @NonNull
+    static String serializeWidgetSizes(@NonNull List<SizeF> sizes) {
+        return sizes.stream().map(SizeF::toString)
+                .collect(Collectors.joining(SIZE_SEPARATOR));
+    }
+
+    @Nullable
+    static ArrayList<SizeF> deserializeWidgetSizesStr(@Nullable String sizesStr) {
+        if (sizesStr == null || sizesStr.isEmpty()) {
+            return null;
+        }
+        try {
+            return Arrays.stream(sizesStr.split(SIZE_SEPARATOR))
+                    .map(SizeF::parseSizeF)
+                    .collect(Collectors.toCollection(ArrayList::new));
+        } catch (NumberFormatException e) {
+            Slog.e(TAG, "Error parsing widget sizes", e);
+            return null;
+        }
+    }
 }
diff --git a/services/art-profile b/services/art-profile
index 6204988..013b449 100644
--- a/services/art-profile
+++ b/services/art-profile
@@ -13,7 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-HSPLandroid/content/pm/PackageManagerInternal;-><init>()V
 HSPLandroid/content/pm/PackageManagerInternal;->filterAppAccess(Ljava/lang/String;II)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLandroid/hardware/health/DiskStats$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/health/DiskStats;+]Landroid/hardware/health/DiskStats;Landroid/hardware/health/DiskStats;
 HSPLandroid/hardware/health/DiskStats$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/hardware/health/DiskStats$1;Landroid/hardware/health/DiskStats$1;
@@ -27,11 +26,11 @@
 HSPLandroid/hardware/health/HealthInfo;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
 HSPLandroid/hardware/health/IHealth$Stub$Proxy;->asBinder()Landroid/os/IBinder;
 HPLandroid/hardware/health/IHealth$Stub$Proxy;->getCapacity()I+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/hardware/health/IHealth$Stub$Proxy;Landroid/hardware/health/IHealth$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel;
-HPLandroid/hardware/health/IHealth$Stub$Proxy;->getChargeCounterUah()I
+HPLandroid/hardware/health/IHealth$Stub$Proxy;->getChargeCounterUah()I+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/hardware/health/IHealth$Stub$Proxy;Landroid/hardware/health/IHealth$Stub$Proxy;
 HPLandroid/hardware/health/IHealth$Stub$Proxy;->getChargeStatus()I
 HPLandroid/hardware/health/IHealth$Stub$Proxy;->getCurrentAverageMicroamps()I
 HPLandroid/hardware/health/IHealth$Stub$Proxy;->getEnergyCounterNwh()J
-HPLandroid/hardware/health/IHealth$Stub$Proxy;->getHealthInfo()Landroid/hardware/health/HealthInfo;
+HPLandroid/hardware/health/IHealth$Stub$Proxy;->getHealthInfo()Landroid/hardware/health/HealthInfo;+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/hardware/health/IHealth$Stub$Proxy;Landroid/hardware/health/IHealth$Stub$Proxy;
 HSPLandroid/hardware/health/IHealthInfoCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z+]Landroid/hardware/health/IHealthInfoCallback;Lcom/android/server/health/HealthRegCallbackAidl$HalInfoCallback;]Landroid/os/Parcel;Landroid/os/Parcel;
 HSPLandroid/hardware/health/StorageInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/health/StorageInfo;+]Landroid/hardware/health/StorageInfo;Landroid/hardware/health/StorageInfo;
 HSPLandroid/hardware/health/StorageInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/hardware/health/StorageInfo$1;Landroid/hardware/health/StorageInfo$1;
@@ -39,46 +38,28 @@
 HSPLandroid/hardware/health/StorageInfo$1;->newArray(I)[Ljava/lang/Object;+]Landroid/hardware/health/StorageInfo$1;Landroid/hardware/health/StorageInfo$1;
 HSPLandroid/hardware/health/StorageInfo;-><init>()V
 HSPLandroid/hardware/health/StorageInfo;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/hardware/light/HwLight$1;-><init>()V
-HSPLandroid/hardware/light/HwLight;-><clinit>()V
-HSPLandroid/hardware/light/HwLight;-><init>()V
-HSPLandroid/hardware/light/ILights;-><clinit>()V
 HSPLandroid/hardware/power/stats/EnergyConsumerAttribution$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/power/stats/EnergyConsumerAttribution;+]Landroid/hardware/power/stats/EnergyConsumerAttribution;Landroid/hardware/power/stats/EnergyConsumerAttribution;
+HSPLandroid/hardware/power/stats/EnergyConsumerAttribution;-><init>()V
 HSPLandroid/hardware/power/stats/EnergyConsumerAttribution;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
 HSPLandroid/hardware/power/stats/EnergyConsumerResult;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
 HPLandroid/hardware/power/stats/EnergyMeasurement$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/power/stats/EnergyMeasurement;+]Landroid/hardware/power/stats/EnergyMeasurement;Landroid/hardware/power/stats/EnergyMeasurement;
 HPLandroid/hardware/power/stats/EnergyMeasurement$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/hardware/power/stats/EnergyMeasurement$1;Landroid/hardware/power/stats/EnergyMeasurement$1;
 HPLandroid/hardware/power/stats/EnergyMeasurement;-><init>()V
 HPLandroid/hardware/power/stats/EnergyMeasurement;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/hardware/power/stats/IPowerStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 HSPLandroid/hardware/power/stats/IPowerStats$Stub$Proxy;->getEnergyConsumed([I)[Landroid/hardware/power/stats/EnergyConsumerResult;
-HPLandroid/hardware/power/stats/IPowerStats$Stub$Proxy;->readEnergyMeter([I)[Landroid/hardware/power/stats/EnergyMeasurement;
-HSPLandroid/hardware/power/stats/IPowerStats$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/power/stats/IPowerStats;
-HSPLandroid/hardware/power/stats/IPowerStats;-><clinit>()V
+HPLandroid/hardware/power/stats/IPowerStats$Stub$Proxy;->readEnergyMeter([I)[Landroid/hardware/power/stats/EnergyMeasurement;+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/hardware/power/stats/IPowerStats$Stub$Proxy;Landroid/hardware/power/stats/IPowerStats$Stub$Proxy;
 HPLandroid/hardware/power/stats/StateResidency$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/power/stats/StateResidency;+]Landroid/hardware/power/stats/StateResidency;Landroid/hardware/power/stats/StateResidency;
 HPLandroid/hardware/power/stats/StateResidency$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/hardware/power/stats/StateResidency$1;Landroid/hardware/power/stats/StateResidency$1;
-HPLandroid/hardware/power/stats/StateResidency$1;->newArray(I)[Landroid/hardware/power/stats/StateResidency;
 HPLandroid/hardware/power/stats/StateResidency$1;->newArray(I)[Ljava/lang/Object;+]Landroid/hardware/power/stats/StateResidency$1;Landroid/hardware/power/stats/StateResidency$1;
 HPLandroid/hardware/power/stats/StateResidency;-><init>()V
 HPLandroid/hardware/power/stats/StateResidency;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
 HPLandroid/hardware/power/stats/StateResidencyResult$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/power/stats/StateResidencyResult;+]Landroid/hardware/power/stats/StateResidencyResult;Landroid/hardware/power/stats/StateResidencyResult;
-HPLandroid/hardware/power/stats/StateResidencyResult;-><init>()V
 HPLandroid/hardware/power/stats/StateResidencyResult;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
 HSPLandroid/hardware/usb/PortStatus;->readFromParcel(Landroid/os/Parcel;)V
-HSPLandroid/net/ConnectivityModuleConnector$DependenciesImpl;-><init>()V
-HSPLandroid/net/ConnectivityModuleConnector$DependenciesImpl;-><init>(Landroid/net/ConnectivityModuleConnector$DependenciesImpl-IA;)V
-HSPLandroid/net/ConnectivityModuleConnector;-><clinit>()V
-HSPLandroid/net/ConnectivityModuleConnector;-><init>()V
-HSPLandroid/net/ConnectivityModuleConnector;-><init>(Landroid/net/ConnectivityModuleConnector$Dependencies;)V
-HSPLandroid/net/ConnectivityModuleConnector;->getInstance()Landroid/net/ConnectivityModuleConnector;
 HPLandroid/net/INetd$Stub$Proxy;->bandwidthRemoveInterfaceQuota(Ljava/lang/String;)V
-HPLandroid/net/INetd$Stub$Proxy;->bandwidthSetInterfaceQuota(Ljava/lang/String;J)V
+HPLandroid/net/INetd$Stub$Proxy;->bandwidthSetInterfaceQuota(Ljava/lang/String;J)V+]Landroid/os/IBinder;Landroid/os/BinderProxy;
 HSPLandroid/net/INetdUnsolicitedEventListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z+]Landroid/os/Parcel;Landroid/os/Parcel;]Landroid/net/INetdUnsolicitedEventListener;Lcom/android/server/net/NetworkManagementService$NetdUnsolicitedEventListener;
 HSPLandroid/net/metrics/INetdEventListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z+]Landroid/net/metrics/INetdEventListener;Lcom/android/server/connectivity/NetdEventListenerService;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLandroid/os/BatteryStatsInternal;-><init>()V
-HSPLandroid/power/PowerStatsInternal;-><init>()V
-HSPLandroid/sysprop/SurfaceFlingerProperties;->enable_frame_rate_override()Ljava/util/Optional;
-HSPLandroid/sysprop/SurfaceFlingerProperties;->tryParseBoolean(Ljava/lang/String;)Ljava/lang/Boolean;
 HSPLcom/android/internal/util/jobs/ArrayUtils;->contains([II)Z
 HPLcom/android/internal/util/jobs/FastXmlSerializer;->append(C)V+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer;
 HPLcom/android/internal/util/jobs/FastXmlSerializer;->append(Ljava/lang/String;)V+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer;
@@ -88,38 +69,26 @@
 HPLcom/android/internal/util/jobs/FastXmlSerializer;->endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer;
 HPLcom/android/internal/util/jobs/FastXmlSerializer;->escapeAndAppendString(Ljava/lang/String;)V+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer;
 HPLcom/android/internal/util/jobs/FastXmlSerializer;->startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer;
-HPLcom/android/internal/util/jobs/RingBufferIndices;->add()I
+HSPLcom/android/internal/util/jobs/RingBufferIndices;->add()I
 HSPLcom/android/internal/util/jobs/StatLogger;->getTime()J
 HSPLcom/android/internal/util/jobs/StatLogger;->logDurationStat(IJ)J+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;
-HSPLcom/android/modules/utils/build/SdkLevel;->isAtLeastR()Z
-HSPLcom/android/modules/utils/build/SdkLevel;->isAtLeastT()Z
-HSPLcom/android/modules/utils/build/UnboundedSdkLevel;-><clinit>()V
-HSPLcom/android/modules/utils/build/UnboundedSdkLevel;-><init>(ILjava/lang/String;Ljava/util/Set;)V
-HSPLcom/android/modules/utils/build/UnboundedSdkLevel;->isAtLeast(Ljava/lang/String;)Z
-HSPLcom/android/modules/utils/build/UnboundedSdkLevel;->isAtLeastInternal(Ljava/lang/String;)Z
-HSPLcom/android/modules/utils/build/UnboundedSdkLevel;->isCodename(Ljava/lang/String;)Z
-HSPLcom/android/modules/utils/build/UnboundedSdkLevel;->removeFingerprint(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/modules/utils/build/UnboundedSdkLevel;->setOf([Ljava/lang/String;)Ljava/util/Set;
-HSPLcom/android/server/AnimationThread;-><init>()V
-HSPLcom/android/server/AnimationThread;->ensureThreadLocked()V
-HSPLcom/android/server/AnimationThread;->get()Lcom/android/server/AnimationThread;
-HSPLcom/android/server/AnimationThread;->getHandler()Landroid/os/Handler;
-HPLcom/android/server/AnyMotionDetector$1;->onSensorChanged(Landroid/hardware/SensorEvent;)V
+HPLcom/android/server/AnyMotionDetector$1;->onSensorChanged(Landroid/hardware/SensorEvent;)V+]Lcom/android/server/AnyMotionDetector$RunningSignalStats;Lcom/android/server/AnyMotionDetector$RunningSignalStats;]Lcom/android/server/AnyMotionDetector$DeviceIdleCallback;Lcom/android/server/DeviceIdleController;
 HSPLcom/android/server/AppSchedulingModuleThread;->ensureThreadLocked()V
 HSPLcom/android/server/AppSchedulingModuleThread;->getHandler()Landroid/os/Handler;
-HPLcom/android/server/AppStateTrackerImpl$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
-HSPLcom/android/server/AppStateTrackerImpl$Listener;->handleUidCachedChanged(IZ)V
-HSPLcom/android/server/AppStateTrackerImpl$Listener;->onUidActiveStateChanged(Lcom/android/server/AppStateTrackerImpl;I)V
-HSPLcom/android/server/AppStateTrackerImpl$MyHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/AppStateTrackerImpl$MyHandler;Lcom/android/server/AppStateTrackerImpl$MyHandler;
-HSPLcom/android/server/AppStateTrackerImpl$MyHandler;->handleUidActive(I)V
+HSPLcom/android/server/AppStateTrackerImpl$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/net/Uri;Landroid/net/Uri$OpaqueUri;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/AppStateTrackerImpl$Listener;->onUidActiveStateChanged(Lcom/android/server/AppStateTrackerImpl;I)V+]Lcom/android/server/AppStateTrackerImpl$Listener;Lcom/android/server/alarm/AlarmManagerService$8;,Lcom/android/server/job/controllers/BackgroundJobsController$2;,Lcom/android/server/AppStateTrackerImpl$1;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;
+HSPLcom/android/server/AppStateTrackerImpl$MyHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/AppStateTrackerImpl$MyHandler;Lcom/android/server/AppStateTrackerImpl$MyHandler;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;
+HSPLcom/android/server/AppStateTrackerImpl$MyHandler;->handleUidActive(I)V+]Lcom/android/server/AppStateTrackerImpl$MyHandler;Lcom/android/server/AppStateTrackerImpl$MyHandler;
 HSPLcom/android/server/AppStateTrackerImpl$MyHandler;->handleUidCached(IZ)V+]Lcom/android/server/AppStateTrackerImpl$Listener;Lcom/android/server/alarm/AlarmManagerService$8;,Lcom/android/server/job/controllers/BackgroundJobsController$2;,Lcom/android/server/AppStateTrackerImpl$1;
 HSPLcom/android/server/AppStateTrackerImpl$MyHandler;->notifyTempExemptionListChanged()V
-HSPLcom/android/server/AppStateTrackerImpl$MyHandler;->removeUid(IZ)V
-HPLcom/android/server/AppStateTrackerImpl$StandbyTracker;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+HSPLcom/android/server/AppStateTrackerImpl$MyHandler;->removeUid(IZ)V+]Lcom/android/server/AppStateTrackerImpl$MyHandler;Lcom/android/server/AppStateTrackerImpl$MyHandler;
+HSPLcom/android/server/AppStateTrackerImpl$StandbyTracker;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+HSPLcom/android/server/AppStateTrackerImpl;->-$$Nest$fgetmHandler(Lcom/android/server/AppStateTrackerImpl;)Lcom/android/server/AppStateTrackerImpl$MyHandler;
 HSPLcom/android/server/AppStateTrackerImpl;->-$$Nest$fgetmLock(Lcom/android/server/AppStateTrackerImpl;)Ljava/lang/Object;
 HSPLcom/android/server/AppStateTrackerImpl;->-$$Nest$fgetmStatLogger(Lcom/android/server/AppStateTrackerImpl;)Lcom/android/internal/util/jobs/StatLogger;
 HSPLcom/android/server/AppStateTrackerImpl;->-$$Nest$mcloneListeners(Lcom/android/server/AppStateTrackerImpl;)[Lcom/android/server/AppStateTrackerImpl$Listener;
-HPLcom/android/server/AppStateTrackerImpl;->areAlarmsRestrictedByBatterySaver(ILjava/lang/String;)Z+]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;
+HSPLcom/android/server/AppStateTrackerImpl;->addUidToArray(Landroid/util/SparseBooleanArray;I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
+HPLcom/android/server/AppStateTrackerImpl;->areAlarmsRestrictedByBatterySaver(ILjava/lang/String;)Z+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;
 HSPLcom/android/server/AppStateTrackerImpl;->areJobsRestricted(ILjava/lang/String;Z)Z+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
 HSPLcom/android/server/AppStateTrackerImpl;->cloneListeners()[Lcom/android/server/AppStateTrackerImpl$Listener;
 HSPLcom/android/server/AppStateTrackerImpl;->findForcedAppStandbyUidPackageIndexLocked(ILjava/lang/String;)I+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Object;Ljava/lang/String;
@@ -128,15 +97,16 @@
 HSPLcom/android/server/AppStateTrackerImpl;->isRunAnyInBackgroundAppOpsAllowed(ILjava/lang/String;)Z+]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;
 HSPLcom/android/server/AppStateTrackerImpl;->isRunAnyRestrictedLocked(ILjava/lang/String;)Z+]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;
 HSPLcom/android/server/AppStateTrackerImpl;->isUidActive(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
-HPLcom/android/server/AppStateTrackerImpl;->isUidActiveSynced(I)Z
+HPLcom/android/server/AppStateTrackerImpl;->isUidActiveSynced(I)Z+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
 HPLcom/android/server/AppStateTrackerImpl;->isUidPowerSaveUserExempt(I)Z
-HSPLcom/android/server/AppStateTrackerImpl;->setPowerSaveExemptionListAppIds([I[I[I)V
+HSPLcom/android/server/AppStateTrackerImpl;->setPowerSaveExemptionListAppIds([I[I[I)V+]Lcom/android/server/AppStateTrackerImpl$MyHandler;Lcom/android/server/AppStateTrackerImpl$MyHandler;
 HSPLcom/android/server/AppStateTrackerImpl;->updateForceAllAppStandbyState()V
 HSPLcom/android/server/BatteryService$$ExternalSyntheticLambda4;->update(Landroid/hardware/health/HealthInfo;)V
 HSPLcom/android/server/BatteryService$$ExternalSyntheticLambda5;-><init>(Lcom/android/server/BatteryService;Landroid/content/Intent;)V
 HSPLcom/android/server/BatteryService$$ExternalSyntheticLambda5;->run()V
 HPLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->getProperty(ILandroid/os/BatteryProperty;)I+]Lcom/android/server/health/HealthServiceWrapper;Lcom/android/server/health/HealthServiceWrapperAidl;]Landroid/content/Context;Landroid/app/ContextImpl;
-HSPLcom/android/server/BatteryService$Led;->updateLightsLocked()V
+HSPLcom/android/server/BatteryService$Led;->updateLightsLocked()V+]Lcom/android/server/lights/LogicalLight;Lcom/android/server/lights/LightsService$LightImpl;
+HSPLcom/android/server/BatteryService$LocalService;->getBatteryHealth()I
 HSPLcom/android/server/BatteryService$LocalService;->getBatteryLevel()I
 HSPLcom/android/server/BatteryService$LocalService;->getBatteryLevelLow()Z
 HSPLcom/android/server/BatteryService$LocalService;->isPowered(I)Z
@@ -147,7 +117,7 @@
 HSPLcom/android/server/BatteryService;->getIconLocked(I)I
 HSPLcom/android/server/BatteryService;->isPoweredLocked(I)Z
 HSPLcom/android/server/BatteryService;->plugType(Landroid/hardware/health/HealthInfo;)I
-HSPLcom/android/server/BatteryService;->processValuesLocked(Z)V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/BatteryService$Led;Lcom/android/server/BatteryService$Led;]Lcom/android/server/BatteryService;Lcom/android/server/BatteryService;]Lcom/android/internal/logging/MetricsLogger;Lcom/android/internal/logging/MetricsLogger;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/BatteryService;->processValuesLocked(Z)V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Lcom/android/server/BatteryService$Led;Lcom/android/server/BatteryService$Led;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/BatteryService;Lcom/android/server/BatteryService;]Lcom/android/internal/logging/MetricsLogger;Lcom/android/internal/logging/MetricsLogger;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/BatteryService;->sendBatteryChangedIntentLocked()V
 HSPLcom/android/server/BatteryService;->sendBatteryLevelChangedIntentLocked()V
 HSPLcom/android/server/BatteryService;->shouldSendBatteryLowLocked()Z
@@ -162,26 +132,24 @@
 HSPLcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider;->resolveWorkSourceUid(I)I+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider;Lcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider;
 HSPLcom/android/server/BundleUtils;->clone(Landroid/os/Bundle;)Landroid/os/Bundle;
 HSPLcom/android/server/BundleUtils;->isEmpty(Landroid/os/Bundle;)Z
-HPLcom/android/server/CachedDeviceStateService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
-HPLcom/android/server/DeviceIdleController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HSPLcom/android/server/CachedDeviceStateService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Lcom/android/internal/os/CachedDeviceState;Lcom/android/internal/os/CachedDeviceState;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/DeviceIdleController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;]Landroid/net/Uri;Landroid/net/Uri$OpaqueUri;]Landroid/content/Intent;Landroid/content/Intent;
 HPLcom/android/server/DeviceIdleController$LocalService;->getNotificationAllowlistDuration()J
 HSPLcom/android/server/DeviceIdleController$LocalService;->getTempAllowListType(II)I
-HPLcom/android/server/DeviceIdleController$LocalService;->isAppOnWhitelist(I)Z
-HPLcom/android/server/DeviceIdleController$LocalService;->setAlarmsActive(Z)V
-HSPLcom/android/server/DeviceIdleController$MyHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/net/NetworkPolicyManagerInternal;Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;]Lcom/android/server/PowerAllowlistInternal$TempAllowlistChangeListener;Lcom/android/server/job/controllers/QuotaController$TempAllowlistTracker;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;
-HSPLcom/android/server/DeviceIdleController;->addPowerSaveTempWhitelistAppDirectInternal(IIJIZILjava/lang/String;)V+]Landroid/os/Handler;Lcom/android/server/DeviceIdleController$MyHandler;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/server/net/NetworkPolicyManagerInternal;Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
-HPLcom/android/server/DeviceIdleController;->checkTempAppWhitelistTimeout(I)V
-HPLcom/android/server/DeviceIdleController;->exitMaintenanceEarlyIfNeededLocked()V
+HPLcom/android/server/DeviceIdleController$LocalService;->isAppOnWhitelist(I)Z+]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;
+HPLcom/android/server/DeviceIdleController$LocalService;->setAlarmsActive(Z)V+]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;
+HSPLcom/android/server/DeviceIdleController$MyHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/net/INetworkPolicyManager;Lcom/android/server/net/NetworkPolicyManagerService;]Lcom/android/server/net/NetworkPolicyManagerInternal;Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/PowerAllowlistInternal$TempAllowlistChangeListener;Lcom/android/server/job/controllers/QuotaController$TempAllowlistTracker;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/DeviceIdleInternal$StationaryListener;Lcom/android/server/location/provider/StationaryThrottlingLocationProvider;]Lcom/android/server/SystemService;Lcom/android/server/DeviceIdleController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;
+HSPLcom/android/server/DeviceIdleController;->addPowerSaveTempWhitelistAppDirectInternal(IIJIZILjava/lang/String;)V+]Lcom/android/server/net/NetworkPolicyManagerInternal;Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/os/Handler;Lcom/android/server/DeviceIdleController$MyHandler;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;
+HPLcom/android/server/DeviceIdleController;->checkTempAppWhitelistTimeout(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HPLcom/android/server/DeviceIdleController;->exitMaintenanceEarlyIfNeededLocked()V+]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;
 HPLcom/android/server/DeviceIdleController;->isAppOnWhitelistInternal(I)Z
-HPLcom/android/server/DeviceIdleController;->onAppRemovedFromTempWhitelistLocked(ILjava/lang/String;)V
+HPLcom/android/server/DeviceIdleController;->onAppRemovedFromTempWhitelistLocked(ILjava/lang/String;)V+]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;
 HSPLcom/android/server/DeviceIdleController;->passWhiteListsToForceAppStandbyTrackerLocked()V
-HSPLcom/android/server/DeviceIdleController;->reportTempWhitelistChangedLocked(IZ)V
-HPLcom/android/server/DeviceIdleController;->updateChargingLocked(Z)V
-HSPLcom/android/server/DeviceIdleController;->updateTempWhitelistAppIdsLocked(IZJIILjava/lang/String;I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
-HSPLcom/android/server/DisplayThread;-><init>()V
-HSPLcom/android/server/DisplayThread;->ensureThreadLocked()V
-HSPLcom/android/server/DisplayThread;->get()Lcom/android/server/DisplayThread;
-HSPLcom/android/server/DisplayThread;->getHandler()Landroid/os/Handler;
+HSPLcom/android/server/DeviceIdleController;->reportTempWhitelistChangedLocked(IZ)V+]Landroid/content/Context;Landroid/app/ContextImpl;
+HPLcom/android/server/DeviceIdleController;->setAlarmsActive(Z)V+]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;
+HSPLcom/android/server/DeviceIdleController;->updateChargingLocked(Z)V+]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;
+HSPLcom/android/server/DeviceIdleController;->updateTempWhitelistAppIdsLocked(IZJIILjava/lang/String;I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;
+HSPLcom/android/server/DropBoxManagerService$DropBoxManagerBroadcastHandler;->createIntent(Ljava/lang/String;J)Landroid/content/Intent;
 HSPLcom/android/server/DropBoxManagerService$EntryFile;-><init>(J)V
 HSPLcom/android/server/DropBoxManagerService$EntryFile;-><init>(Ljava/io/File;I)V
 HSPLcom/android/server/DropBoxManagerService$EntryFile;-><init>(Ljava/io/File;Ljava/io/File;Ljava/lang/String;JII)V
@@ -190,141 +158,100 @@
 HSPLcom/android/server/DropBoxManagerService$EntryFile;->getExtension()Ljava/lang/String;
 HSPLcom/android/server/DropBoxManagerService$EntryFile;->getFile(Ljava/io/File;)Ljava/io/File;
 HSPLcom/android/server/DropBoxManagerService$EntryFile;->getFilename()Ljava/lang/String;
+HSPLcom/android/server/DropBoxManagerService$EntryFile;->hasFile()Z
 HSPLcom/android/server/DropBoxManagerService;->addEntry(Ljava/lang/String;Lcom/android/server/DropBoxManagerInternal$EntrySource;I)V
-HPLcom/android/server/DropBoxManagerService;->checkPermission(ILjava/lang/String;Ljava/lang/String;)Z
+HPLcom/android/server/DropBoxManagerService;->checkPermission(ILjava/lang/String;Ljava/lang/String;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
 HSPLcom/android/server/DropBoxManagerService;->createEntry(Ljava/io/File;Ljava/lang/String;I)J
 HSPLcom/android/server/DropBoxManagerService;->enrollEntry(Lcom/android/server/DropBoxManagerService$EntryFile;)V
-HPLcom/android/server/DropBoxManagerService;->getNextEntry(Ljava/lang/String;JLjava/lang/String;Ljava/lang/String;)Landroid/os/DropBoxManager$Entry;
+HPLcom/android/server/DropBoxManagerService;->getNextEntry(Ljava/lang/String;JLjava/lang/String;Ljava/lang/String;)Landroid/os/DropBoxManager$Entry;+]Ljava/util/SortedSet;Ljava/util/TreeSet;]Ljava/util/TreeSet;Ljava/util/TreeSet;]Ljava/util/Iterator;Ljava/util/TreeMap$NavigableSubMap$SubMapKeyIterator;
 HSPLcom/android/server/DropBoxManagerService;->init()V
-HSPLcom/android/server/DropBoxManagerService;->isTagEnabled(Ljava/lang/String;)Z
+HSPLcom/android/server/DropBoxManagerService;->isTagEnabled(Ljava/lang/String;)Z+]Ljava/util/List;Ljava/util/ImmutableCollections$ListN;
 HSPLcom/android/server/DropBoxManagerService;->trimToFit()J
 HPLcom/android/server/EventLogTags;->writeNotificationEnqueue(IILjava/lang/String;ILjava/lang/String;ILjava/lang/String;I)V
-HSPLcom/android/server/EventLogTags;->writeRescueNote(IIJ)V
-HSPLcom/android/server/ExplicitHealthCheckController;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/FgThread;-><init>()V
 HSPLcom/android/server/FgThread;->ensureThreadLocked()V
-HSPLcom/android/server/FgThread;->get()Lcom/android/server/FgThread;
 HSPLcom/android/server/FgThread;->getHandler()Landroid/os/Handler;
-HSPLcom/android/server/IntentResolver$1;-><init>()V
 HSPLcom/android/server/IntentResolver$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I+]Landroid/content/IntentFilter;Lcom/android/server/am/BroadcastFilter;
-HSPLcom/android/server/IntentResolver;-><clinit>()V
 HSPLcom/android/server/IntentResolver;-><init>()V
 HSPLcom/android/server/IntentResolver;->addFilter(Landroid/util/ArrayMap;Ljava/lang/String;Ljava/lang/Object;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/IntentResolver;megamorphic_types
 HSPLcom/android/server/IntentResolver;->addFilter(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Ljava/lang/Object;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Lcom/android/server/am/BroadcastFilter;,Landroid/content/pm/AuxiliaryResolveInfo$AuxiliaryFilter;]Lcom/android/server/IntentResolver;megamorphic_types
 HSPLcom/android/server/IntentResolver;->buildResolveList(Lcom/android/server/pm/Computer;Landroid/content/Intent;Landroid/util/FastImmutableArraySet;ZZLjava/lang/String;Ljava/lang/String;[Ljava/lang/Object;Ljava/util/List;IJ)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Lcom/android/server/am/BroadcastFilter;]Lcom/android/server/IntentResolver;megamorphic_types]Landroid/content/Intent;Landroid/content/Intent;
-HSPLcom/android/server/IntentResolver;->collectFilters([Ljava/lang/Object;Landroid/content/IntentFilter;)Ljava/util/ArrayList;
+HSPLcom/android/server/IntentResolver;->collectFilters([Ljava/lang/Object;Landroid/content/IntentFilter;)Ljava/util/ArrayList;+]Lcom/android/server/IntentResolver;Lcom/android/server/pm/PreferredIntentResolver;,Lcom/android/server/pm/CrossProfileIntentResolver;
 HSPLcom/android/server/IntentResolver;->copyFrom(Lcom/android/server/IntentResolver;)V
 HSPLcom/android/server/IntentResolver;->copyInto(Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/IntentResolver;megamorphic_types
 HSPLcom/android/server/IntentResolver;->copyInto(Landroid/util/ArraySet;Landroid/util/ArraySet;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/IntentResolver;megamorphic_types
 HSPLcom/android/server/IntentResolver;->filterResults(Ljava/util/List;)V
 HSPLcom/android/server/IntentResolver;->filterSet()Ljava/util/Set;
-HSPLcom/android/server/IntentResolver;->findFilters(Landroid/content/IntentFilter;)Ljava/util/ArrayList;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Lcom/android/server/IntentResolver;Lcom/android/server/pm/PreferredIntentResolver;,Lcom/android/server/pm/CrossProfileIntentResolver;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
-HSPLcom/android/server/IntentResolver;->getFastIntentCategories(Landroid/content/Intent;)Landroid/util/FastImmutableArraySet;+]Landroid/content/Intent;Landroid/content/Intent;]Ljava/util/Set;Landroid/util/ArraySet;
-HPLcom/android/server/IntentResolver;->intentMatchesFilter(Landroid/content/IntentFilter;Landroid/content/Intent;Ljava/lang/String;)Z
+HSPLcom/android/server/IntentResolver;->findFilters(Landroid/content/IntentFilter;)Ljava/util/ArrayList;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Lcom/android/server/IntentResolver;Lcom/android/server/pm/PreferredIntentResolver;,Lcom/android/server/pm/CrossProfileIntentResolver;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/IntentResolver;->getFastIntentCategories(Landroid/content/Intent;)Landroid/util/FastImmutableArraySet;+]Ljava/util/Set;Landroid/util/ArraySet;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/IntentResolver;->intentMatchesFilter(Landroid/content/IntentFilter;Landroid/content/Intent;Ljava/lang/String;)Z+]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/IntentResolver;->newResult(Lcom/android/server/pm/Computer;Ljava/lang/Object;IIJ)Ljava/lang/Object;
 HSPLcom/android/server/IntentResolver;->queryIntent(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/content/Intent;Ljava/lang/String;ZI)Ljava/util/List;+]Lcom/android/server/IntentResolver;megamorphic_types
-HSPLcom/android/server/IntentResolver;->queryIntent(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/content/Intent;Ljava/lang/String;ZIJ)Ljava/util/List;+]Ljava/lang/String;Ljava/lang/String;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/IntentResolver;megamorphic_types]Landroid/content/Intent;Landroid/content/Intent;
-HSPLcom/android/server/IntentResolver;->queryIntentFromList(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;ZLjava/util/ArrayList;IJ)Ljava/util/List;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/IntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;]Landroid/content/Intent;Landroid/content/Intent;]Ljava/lang/Object;Ljava/lang/String;
+HSPLcom/android/server/IntentResolver;->queryIntent(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/content/Intent;Ljava/lang/String;ZIJ)Ljava/util/List;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/IntentResolver;megamorphic_types]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/IntentResolver;->queryIntentFromList(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;ZLjava/util/ArrayList;IJ)Ljava/util/List;+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/IntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/IntentResolver;->register_intent_filter(Ljava/lang/Object;Ljava/util/Iterator;Landroid/util/ArrayMap;Ljava/lang/String;)I+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr;]Lcom/android/server/IntentResolver;megamorphic_types
 HSPLcom/android/server/IntentResolver;->register_mime_types(Ljava/lang/Object;Ljava/lang/String;)I+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Lcom/android/server/am/BroadcastFilter;,Landroid/content/pm/AuxiliaryResolveInfo$AuxiliaryFilter;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/IntentResolver;megamorphic_types
-HSPLcom/android/server/IntentResolver;->removeFilter(Ljava/lang/Object;)V
+HSPLcom/android/server/IntentResolver;->removeFilter(Ljava/lang/Object;)V+]Lcom/android/server/IntentResolver;megamorphic_types
 HSPLcom/android/server/IntentResolver;->removeFilterInternal(Ljava/lang/Object;)V+]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Lcom/android/server/am/BroadcastFilter;]Lcom/android/server/IntentResolver;megamorphic_types
 HSPLcom/android/server/IntentResolver;->remove_all_objects(Landroid/util/ArrayMap;Ljava/lang/String;Ljava/lang/Object;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/IntentResolver;megamorphic_types
 HSPLcom/android/server/IntentResolver;->snapshot(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/IntentResolver;->sortResults(Ljava/util/List;)V
 HSPLcom/android/server/IntentResolver;->unregister_intent_filter(Ljava/lang/Object;Ljava/util/Iterator;Landroid/util/ArrayMap;Ljava/lang/String;)I+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr;]Lcom/android/server/IntentResolver;megamorphic_types
 HSPLcom/android/server/IntentResolver;->unregister_mime_types(Ljava/lang/Object;Ljava/lang/String;)I+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Lcom/android/server/am/BroadcastFilter;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/IntentResolver;megamorphic_types
-HSPLcom/android/server/IoThread;-><init>()V
 HSPLcom/android/server/IoThread;->ensureThreadLocked()V
-HSPLcom/android/server/IoThread;->get()Lcom/android/server/IoThread;
 HSPLcom/android/server/IoThread;->getHandler()Landroid/os/Handler;
-HSPLcom/android/server/LocalManagerRegistry;-><clinit>()V
 HSPLcom/android/server/LocalManagerRegistry;->addManager(Ljava/lang/Class;Ljava/lang/Object;)V
 HSPLcom/android/server/LocalManagerRegistry;->getManager(Ljava/lang/Class;)Ljava/lang/Object;+]Ljava/util/Map;Landroid/util/ArrayMap;
-HSPLcom/android/server/LockGuard$LockInfo;-><init>()V
-HSPLcom/android/server/LockGuard$LockInfo;-><init>(Lcom/android/server/LockGuard$LockInfo-IA;)V
-HSPLcom/android/server/LockGuard;-><clinit>()V
 HSPLcom/android/server/LockGuard;->findOrCreateLockInfo(Ljava/lang/Object;)Lcom/android/server/LockGuard$LockInfo;
 HSPLcom/android/server/LockGuard;->guard(I)V
-HSPLcom/android/server/LockGuard;->installLock(Ljava/lang/Object;I)Ljava/lang/Object;
 HSPLcom/android/server/LockGuard;->installLock(Ljava/lang/Object;IZ)Ljava/lang/Object;
-HSPLcom/android/server/LockGuard;->installNewLock(I)Ljava/lang/Object;
-HSPLcom/android/server/LockGuard;->installNewLock(IZ)Ljava/lang/Object;
-HSPLcom/android/server/LockGuard;->lockToString(I)Ljava/lang/String;
-HSPLcom/android/server/NetworkScoreService;->enforceSystemOrHasScoreNetworks()V
-HSPLcom/android/server/NetworkScoreService;->getActiveScorerPackage()Ljava/lang/String;
-HSPLcom/android/server/NetworkScorerAppManager$SettingsFacade;->getInt(Landroid/content/Context;Ljava/lang/String;I)I
-HSPLcom/android/server/NetworkScorerAppManager$SettingsFacade;->getString(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;
+HSPLcom/android/server/NetworkScoreService;->enforceSystemOrHasScoreNetworks()V+]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/NetworkScoreService;->getActiveScorerPackage()Ljava/lang/String;+]Lcom/android/server/NetworkScorerAppManager;Lcom/android/server/NetworkScorerAppManager;
+HSPLcom/android/server/NetworkScorerAppManager$SettingsFacade;->getInt(Landroid/content/Context;Ljava/lang/String;I)I+]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/NetworkScorerAppManager$SettingsFacade;->getString(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/NetworkScorerAppManager;->getActiveScorer()Landroid/net/NetworkScorerAppData;
-HSPLcom/android/server/NetworkScorerAppManager;->getAllValidScorers()Ljava/util/List;
+HSPLcom/android/server/NetworkScorerAppManager;->getAllValidScorers()Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
 HSPLcom/android/server/NetworkScorerAppManager;->getNetworkRecommendationsEnabledSetting()I
 HSPLcom/android/server/NetworkScorerAppManager;->getNetworkRecommendationsPackage()Ljava/lang/String;
-HSPLcom/android/server/NetworkScorerAppManager;->getScorer(Ljava/lang/String;)Landroid/net/NetworkScorerAppData;
-HSPLcom/android/server/PackageWatchdog$$ExternalSyntheticLambda0;-><init>()V
+HSPLcom/android/server/NetworkScorerAppManager;->getScorer(Ljava/lang/String;)Landroid/net/NetworkScorerAppData;+]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Lcom/android/server/NetworkScorerAppManager;Lcom/android/server/NetworkScorerAppManager;
 HSPLcom/android/server/PackageWatchdog$$ExternalSyntheticLambda0;->uptimeMillis()J
-HSPLcom/android/server/PackageWatchdog$$ExternalSyntheticLambda6;-><init>(Lcom/android/server/PackageWatchdog;)V
-HSPLcom/android/server/PackageWatchdog$$ExternalSyntheticLambda7;-><init>(Lcom/android/server/PackageWatchdog;)V
-HSPLcom/android/server/PackageWatchdog$$ExternalSyntheticLambda8;-><init>(Lcom/android/server/PackageWatchdog;)V
-HSPLcom/android/server/PackageWatchdog$$ExternalSyntheticLambda9;-><init>(Lcom/android/server/PackageWatchdog;)V
-HSPLcom/android/server/PackageWatchdog$BootThreshold;-><init>(Lcom/android/server/PackageWatchdog;IJ)V
-HSPLcom/android/server/PackageWatchdog$BootThreshold;->getCount()I
-HSPLcom/android/server/PackageWatchdog$BootThreshold;->getMitigationStart()J
-HSPLcom/android/server/PackageWatchdog$BootThreshold;->getStart()J
-HSPLcom/android/server/PackageWatchdog$BootThreshold;->incrementAndTest()Z
-HSPLcom/android/server/PackageWatchdog$BootThreshold;->readMitigationCountFromMetadataIfNecessary()V
-HSPLcom/android/server/PackageWatchdog$BootThreshold;->setCount(I)V
 HSPLcom/android/server/PackageWatchdog$MonitoredPackage;->-$$Nest$mgetName(Lcom/android/server/PackageWatchdog$MonitoredPackage;)Ljava/lang/String;+]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;
 HSPLcom/android/server/PackageWatchdog$MonitoredPackage;->getName()Ljava/lang/String;
-HSPLcom/android/server/PackageWatchdog$MonitoredPackage;->getShortestScheduleDurationMsLocked()J
+HSPLcom/android/server/PackageWatchdog$MonitoredPackage;->getShortestScheduleDurationMsLocked()J+]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;
 HSPLcom/android/server/PackageWatchdog$MonitoredPackage;->isPendingHealthChecksLocked()Z
-HSPLcom/android/server/PackageWatchdog$MonitoredPackage;->toString(I)Ljava/lang/String;
 HSPLcom/android/server/PackageWatchdog$MonitoredPackage;->updateHealthCheckStateLocked()I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;
 HSPLcom/android/server/PackageWatchdog$MonitoredPackage;->writeLocked(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;
-HSPLcom/android/server/PackageWatchdog$ObserverInternal;-><init>(Ljava/lang/String;Ljava/util/List;)V
-HSPLcom/android/server/PackageWatchdog$ObserverInternal;->getMonitoredPackage(Ljava/lang/String;)Lcom/android/server/PackageWatchdog$MonitoredPackage;
-HSPLcom/android/server/PackageWatchdog$ObserverInternal;->prunePackagesLocked(J)Ljava/util/Set;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
-HSPLcom/android/server/PackageWatchdog$ObserverInternal;->putMonitoredPackage(Lcom/android/server/PackageWatchdog$MonitoredPackage;)V
+HSPLcom/android/server/PackageWatchdog$ObserverInternal;->prunePackagesLocked(J)Ljava/util/Set;+]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/PackageWatchdog$ObserverInternal;->read(Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/server/PackageWatchdog;)Lcom/android/server/PackageWatchdog$ObserverInternal;
 HSPLcom/android/server/PackageWatchdog$ObserverInternal;->updatePackagesLocked(Ljava/util/List;)V
 HSPLcom/android/server/PackageWatchdog;->-$$Nest$fgetmSystemClock(Lcom/android/server/PackageWatchdog;)Lcom/android/server/PackageWatchdog$SystemClock;
-HSPLcom/android/server/PackageWatchdog;-><clinit>()V
-HSPLcom/android/server/PackageWatchdog;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/PackageWatchdog;-><init>(Landroid/content/Context;Landroid/util/AtomicFile;Landroid/os/Handler;Landroid/os/Handler;Lcom/android/server/ExplicitHealthCheckController;Landroid/net/ConnectivityModuleConnector;Lcom/android/server/PackageWatchdog$SystemClock;)V
-HSPLcom/android/server/PackageWatchdog;->getInstance(Landroid/content/Context;)Lcom/android/server/PackageWatchdog;
 HSPLcom/android/server/PackageWatchdog;->getNextStateSyncMillisLocked()J+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/PackageWatchdog$ObserverInternal;Lcom/android/server/PackageWatchdog$ObserverInternal;]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;
-HPLcom/android/server/PackageWatchdog;->getPackagesPendingHealthChecksLocked()Ljava/util/Set;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/PackageWatchdog$ObserverInternal;Lcom/android/server/PackageWatchdog$ObserverInternal;]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/ArraySet;
-HSPLcom/android/server/PackageWatchdog;->loadFromFile()V
-HSPLcom/android/server/PackageWatchdog;->noteBoot()V
-HPLcom/android/server/PackageWatchdog;->onSupportedPackages(Ljava/util/List;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/PackageWatchdog$ObserverInternal;Lcom/android/server/PackageWatchdog$ObserverInternal;]Landroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;Landroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/lang/Long;Ljava/lang/Long;]Lcom/android/server/PackageWatchdog;Lcom/android/server/PackageWatchdog;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr;
+HSPLcom/android/server/PackageWatchdog;->getPackagesPendingHealthChecksLocked()Ljava/util/Set;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/PackageWatchdog$ObserverInternal;Lcom/android/server/PackageWatchdog$ObserverInternal;]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/ArraySet;
+HPLcom/android/server/PackageWatchdog;->onSupportedPackages(Ljava/util/List;)V+]Lcom/android/server/PackageWatchdog$ObserverInternal;Lcom/android/server/PackageWatchdog$ObserverInternal;]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;Landroid/service/watchdog/ExplicitHealthCheckService$PackageConfig;]Ljava/lang/Long;Ljava/lang/Long;]Lcom/android/server/PackageWatchdog;Lcom/android/server/PackageWatchdog;]Ljava/util/Map;Landroid/util/ArrayMap;
 HSPLcom/android/server/PackageWatchdog;->parseMonitoredPackage(Lcom/android/modules/utils/TypedXmlPullParser;)Lcom/android/server/PackageWatchdog$MonitoredPackage;
+HSPLcom/android/server/PackageWatchdog;->pruneObserversLocked()V+]Lcom/android/server/PackageWatchdog$ObserverInternal;Lcom/android/server/PackageWatchdog$ObserverInternal;]Lcom/android/server/PackageWatchdog$SystemClock;Lcom/android/server/PackageWatchdog$$ExternalSyntheticLambda0;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/ArraySet;
 HSPLcom/android/server/PackageWatchdog;->registerHealthObserver(Lcom/android/server/PackageWatchdog$PackageHealthObserver;)V
-HPLcom/android/server/PackageWatchdog;->syncRequests()V
+HSPLcom/android/server/PackageWatchdog;->saveToFile()Z
+HSPLcom/android/server/PackageWatchdog;->syncRequests()V
 HSPLcom/android/server/PackageWatchdog;->syncState(Ljava/lang/String;)V
 HSPLcom/android/server/PinnerService$4$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLcom/android/server/PinnerService$4;->onUidActive(I)V
 HSPLcom/android/server/PinnerService;->updateActiveState(IZ)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/RescueParty$RescuePartyObserver;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/RescueParty$RescuePartyObserver;->getInstance(Landroid/content/Context;)Lcom/android/server/RescueParty$RescuePartyObserver;
-HSPLcom/android/server/RescueParty$RescuePartyObserver;->getName()Ljava/lang/String;
-HSPLcom/android/server/RescueParty;-><clinit>()V
-HSPLcom/android/server/RescueParty;->registerHealthObserver(Landroid/content/Context;)V
-HSPLcom/android/server/ServiceThread;-><init>(Ljava/lang/String;IZ)V
-HSPLcom/android/server/ServiceThread;->makeSharedHandler(Landroid/os/Looper;)Landroid/os/Handler;
 HSPLcom/android/server/ServiceThread;->run()V
 HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->getExternalStorageMountMode(ILjava/lang/String;)I
 HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->hasExternalStorage(ILjava/lang/String;)Z+]Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;
-HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->hasExternalStorageAccess(ILjava/lang/String;)Z
+HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->hasExternalStorageAccess(ILjava/lang/String;)Z+]Lcom/android/internal/app/IAppOpsService;Lcom/android/server/appop/AppOpsService;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
 HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->hasLegacyExternalStorage(I)Z
 HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->isExternalStorageService(I)Z
 HSPLcom/android/server/StorageManagerService$WatchedUnlockedUsers;->contains(I)Z
 HSPLcom/android/server/StorageManagerService;->-$$Nest$fgetmMediaStoreAuthorityAppId(Lcom/android/server/StorageManagerService;)I
 HSPLcom/android/server/StorageManagerService;->-$$Nest$mgetMountModeInternal(Lcom/android/server/StorageManagerService;ILjava/lang/String;)I
 HSPLcom/android/server/StorageManagerService;->-$$Nest$sfgetLOCAL_LOGV()Z
-HPLcom/android/server/StorageManagerService;->adjustAllocateFlags(IILjava/lang/String;)I
+HPLcom/android/server/StorageManagerService;->adjustAllocateFlags(IILjava/lang/String;)I+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
 HPLcom/android/server/StorageManagerService;->allocateBytes(Ljava/lang/String;JILjava/lang/String;)V
 HPLcom/android/server/StorageManagerService;->getAllocatableBytes(Ljava/lang/String;ILjava/lang/String;)J
-HSPLcom/android/server/StorageManagerService;->getMountModeInternal(ILjava/lang/String;)I+]Lcom/android/internal/app/IAppOpsService;Lcom/android/server/appop/AppOpsService;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/StorageManagerService;->getVolumeList(ILjava/lang/String;I)[Landroid/os/storage/StorageVolume;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/os/storage/VolumeInfo;Landroid/os/storage/VolumeInfo;]Lcom/android/server/StorageManagerService;Lcom/android/server/StorageManagerService;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/storage/StorageVolume;Landroid/os/storage/StorageVolume;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/StorageManagerService;->getMountModeInternal(ILjava/lang/String;)I+]Lcom/android/internal/app/IAppOpsService;Lcom/android/server/appop/AppOpsService;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;
+HSPLcom/android/server/StorageManagerService;->getVolumeList(ILjava/lang/String;I)[Landroid/os/storage/StorageVolume;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/os/storage/VolumeInfo;Landroid/os/storage/VolumeInfo;]Lcom/android/server/StorageManagerService;Lcom/android/server/StorageManagerService;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/storage/StorageVolume;Landroid/os/storage/StorageVolume;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/StorageManagerService;->getVolumes(I)[Landroid/os/storage/VolumeInfo;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/StorageManagerService;->isCeStorageUnlocked(I)Z+]Lcom/android/server/StorageManagerService$WatchedUnlockedUsers;Lcom/android/server/StorageManagerService$WatchedUnlockedUsers;
 HSPLcom/android/server/StorageManagerService;->isSystemUnlocked(I)Z
@@ -333,29 +260,18 @@
 HSPLcom/android/server/StorageManagerService;->snapshotAndMonitorLegacyStorageAppOp(Landroid/os/UserHandle;)V
 HSPLcom/android/server/StorageManagerService;->updateLegacyStorageApps(Ljava/lang/String;IZ)V
 HSPLcom/android/server/SystemConfig$PermissionEntry;-><init>(Ljava/lang/String;Z)V
-HSPLcom/android/server/SystemConfig$SharedLibraryEntry;-><init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/SystemConfig$SharedLibraryEntry;-><init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLcom/android/server/SystemConfig$SharedLibraryEntry;-><init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Z)V
-HSPLcom/android/server/SystemConfig;-><clinit>()V
 HSPLcom/android/server/SystemConfig;-><init>()V
 HSPLcom/android/server/SystemConfig;->addFeature(Ljava/lang/String;I)V
 HSPLcom/android/server/SystemConfig;->enableIpSecTunnelMigrationOnVsrUAndAbove()V
-HSPLcom/android/server/SystemConfig;->getAndClearPackageToUserTypeBlacklist()Landroid/util/ArrayMap;
-HSPLcom/android/server/SystemConfig;->getAndClearPackageToUserTypeWhitelist()Landroid/util/ArrayMap;
 HSPLcom/android/server/SystemConfig;->getApexModuleNameFromFilePath(Ljava/nio/file/Path;Ljava/nio/file/Path;)Ljava/lang/String;
-HSPLcom/android/server/SystemConfig;->getAppDataIsolationWhitelistedApps()Landroid/util/ArraySet;
-HSPLcom/android/server/SystemConfig;->getAvailableFeatures()Landroid/util/ArrayMap;
 HSPLcom/android/server/SystemConfig;->getComponentsEnabledStates(Ljava/lang/String;)Landroid/util/ArrayMap;
 HSPLcom/android/server/SystemConfig;->getGlobalGids()[I
 HSPLcom/android/server/SystemConfig;->getHiddenApiWhitelistedApps()Landroid/util/ArraySet;
-HSPLcom/android/server/SystemConfig;->getInitialNonStoppedSystemPackages()Ljava/util/Set;
 HSPLcom/android/server/SystemConfig;->getInstance()Lcom/android/server/SystemConfig;
 HSPLcom/android/server/SystemConfig;->getLinkedApps()Landroid/util/ArraySet;
 HSPLcom/android/server/SystemConfig;->getNamedActors()Ljava/util/Map;
 HSPLcom/android/server/SystemConfig;->getPermissionAllowlist()Lcom/android/server/pm/permission/PermissionAllowlist;
-HSPLcom/android/server/SystemConfig;->getPermissions()Landroid/util/ArrayMap;
-HSPLcom/android/server/SystemConfig;->getSharedLibraries()Landroid/util/ArrayMap;
-HSPLcom/android/server/SystemConfig;->getSplitPermissions()Ljava/util/ArrayList;
 HSPLcom/android/server/SystemConfig;->getSystemAppUpdateOwnerPackageName(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/SystemConfig;->getSystemPermissions()Landroid/util/SparseArray;
 HSPLcom/android/server/SystemConfig;->isErofsSupported()Z
@@ -370,193 +286,140 @@
 HSPLcom/android/server/SystemConfig;->readPermissions(Lorg/xmlpull/v1/XmlPullParser;Ljava/io/File;I)V
 HSPLcom/android/server/SystemConfig;->readPermissionsFromXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/io/File;I)V
 HSPLcom/android/server/SystemConfig;->readPrivAppPermissions(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/ArrayMap;)V
-HSPLcom/android/server/SystemConfig;->readPublicLibrariesListFile(Ljava/io/File;)V
-HSPLcom/android/server/SystemConfig;->readPublicNativeLibrariesList()V
 HSPLcom/android/server/SystemConfig;->readSplitPermission(Lorg/xmlpull/v1/XmlPullParser;Ljava/io/File;)V
-HSPLcom/android/server/SystemServer$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/SystemServer$$ExternalSyntheticLambda1;-><init>(III)V
-HSPLcom/android/server/SystemServer$$ExternalSyntheticLambda1;->run()V
-HSPLcom/android/server/SystemServer$$ExternalSyntheticLambda2;-><init>()V
-HSPLcom/android/server/SystemServer$$ExternalSyntheticLambda2;->run()V
-HSPLcom/android/server/SystemServer$SystemServerDumper;->-$$Nest$maddDumpable(Lcom/android/server/SystemServer$SystemServerDumper;Landroid/util/Dumpable;)V
-HSPLcom/android/server/SystemServer$SystemServerDumper;-><init>(Lcom/android/server/SystemServer;)V
-HSPLcom/android/server/SystemServer$SystemServerDumper;-><init>(Lcom/android/server/SystemServer;Lcom/android/server/SystemServer$SystemServerDumper-IA;)V
-HSPLcom/android/server/SystemServer$SystemServerDumper;->addDumpable(Landroid/util/Dumpable;)V
-HSPLcom/android/server/SystemServer;->$r8$lambda$2PdG6KuU0ZTvilD515PGrttj0sk(III)V
-HSPLcom/android/server/SystemServer;-><clinit>()V
-HSPLcom/android/server/SystemServer;-><init>()V
-HSPLcom/android/server/SystemServer;->createSystemContext()V
-HSPLcom/android/server/SystemServer;->getDumpableName()Ljava/lang/String;
-HSPLcom/android/server/SystemServer;->getMaxFd()I
-HSPLcom/android/server/SystemServer;->lambda$spawnFdLeakCheckThread$0(III)V
-HSPLcom/android/server/SystemServer;->main([Ljava/lang/String;)V
-HSPLcom/android/server/SystemServer;->performPendingShutdown()V
 HSPLcom/android/server/SystemServer;->run()V
-HSPLcom/android/server/SystemServer;->spawnFdLeakCheckThread()V
 HSPLcom/android/server/SystemServer;->startBootstrapServices(Lcom/android/server/utils/TimingsTraceAndSlog;)V
-HSPLcom/android/server/SystemServerInitThreadPool$$ExternalSyntheticLambda0;->execute(Ljava/lang/Runnable;)V
-HSPLcom/android/server/SystemServerInitThreadPool$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/SystemServerInitThreadPool;Ljava/lang/String;Ljava/lang/Runnable;)V
-HSPLcom/android/server/SystemServerInitThreadPool$$ExternalSyntheticLambda1;->run()V
-HSPLcom/android/server/SystemServerInitThreadPool;->$r8$lambda$KBkrFsHiqcxWyjNRg1WxRI4WNHA(Lcom/android/server/SystemServerInitThreadPool;Ljava/lang/String;Ljava/lang/Runnable;)V
-HSPLcom/android/server/SystemServerInitThreadPool;-><clinit>()V
-HSPLcom/android/server/SystemServerInitThreadPool;-><init>()V
-HSPLcom/android/server/SystemServerInitThreadPool;->getDumpableName()Ljava/lang/String;
+HSPLcom/android/server/SystemServer;->startOtherServices(Lcom/android/server/utils/TimingsTraceAndSlog;)V
+HSPLcom/android/server/SystemServerInitThreadPool$$ExternalSyntheticLambda0;->execute(Ljava/lang/Runnable;)V+]Ljava/lang/Runnable;megamorphic_types
 HSPLcom/android/server/SystemServerInitThreadPool;->lambda$submitTask$0(Ljava/lang/String;Ljava/lang/Runnable;)V
-HSPLcom/android/server/SystemServerInitThreadPool;->start()Lcom/android/server/SystemServerInitThreadPool;
 HSPLcom/android/server/SystemServerInitThreadPool;->submit(Ljava/lang/Runnable;Ljava/lang/String;)Ljava/util/concurrent/Future;
 HSPLcom/android/server/SystemServerInitThreadPool;->submitTask(Ljava/lang/Runnable;Ljava/lang/String;)Ljava/util/concurrent/Future;
 HSPLcom/android/server/SystemService;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/SystemService;->getContext()Landroid/content/Context;
-HSPLcom/android/server/SystemService;->onBootPhase(I)V
 HSPLcom/android/server/SystemService;->publishBinderService(Ljava/lang/String;Landroid/os/IBinder;)V
 HSPLcom/android/server/SystemService;->publishBinderService(Ljava/lang/String;Landroid/os/IBinder;Z)V
 HSPLcom/android/server/SystemService;->publishBinderService(Ljava/lang/String;Landroid/os/IBinder;ZI)V
-HSPLcom/android/server/SystemService;->publishLocalService(Ljava/lang/Class;Ljava/lang/Object;)V
-HSPLcom/android/server/SystemServiceManager;-><clinit>()V
-HSPLcom/android/server/SystemServiceManager;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/SystemServiceManager;->ensureSystemDir()Ljava/io/File;
-HSPLcom/android/server/SystemServiceManager;->getDumpableName()Ljava/lang/String;
 HPLcom/android/server/SystemServiceManager;->lambda$getOnUserCompletedEventRunnable$1(Lcom/android/server/utils/TimingsTraceAndSlog;Lcom/android/server/SystemService$TargetUser;Lcom/android/server/SystemService$UserCompletedEventType;Ljava/lang/String;Lcom/android/server/SystemService;)V
 HSPLcom/android/server/SystemServiceManager;->onUser(Lcom/android/server/utils/TimingsTraceAndSlog;Ljava/lang/String;Lcom/android/server/SystemService$TargetUser;Lcom/android/server/SystemService$TargetUser;Lcom/android/server/SystemService$UserCompletedEventType;)V
-HSPLcom/android/server/SystemServiceManager;->setStartInfo(ZJJ)V
 HSPLcom/android/server/SystemServiceManager;->startBootPhase(Lcom/android/server/utils/TimingsTraceAndSlog;I)V
 HSPLcom/android/server/SystemServiceManager;->startService(Lcom/android/server/SystemService;)V
 HSPLcom/android/server/SystemServiceManager;->startService(Ljava/lang/Class;)Lcom/android/server/SystemService;
 HSPLcom/android/server/SystemServiceManager;->warnIfTooLong(JLcom/android/server/SystemService;Ljava/lang/String;)V
-HSPLcom/android/server/SystemTimeZone;-><clinit>()V
-HSPLcom/android/server/SystemTimeZone;->initializeTimeZoneSettingsIfRequired()V
-HSPLcom/android/server/SystemTimeZone;->isValidTimeZoneId(Ljava/lang/String;)Z
 HPLcom/android/server/TelephonyRegistry$Record;->matchTelephonyCallbackEvent(I)Z+]Ljava/util/Set;Ljava/util/HashSet;
 HSPLcom/android/server/TelephonyRegistry;->add(Landroid/os/IBinder;IIZ)Lcom/android/server/TelephonyRegistry$Record;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/IBinder;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/TelephonyRegistry$ConfigurationProvider;Lcom/android/server/TelephonyRegistry$ConfigurationProvider;
+HSPLcom/android/server/TelephonyRegistry;->addOnSubscriptionsChangedListener(Ljava/lang/String;Ljava/lang/String;Lcom/android/internal/telephony/IOnSubscriptionsChangedListener;)V
 HPLcom/android/server/TelephonyRegistry;->broadcastServiceStateChanged(Landroid/telephony/ServiceState;II)V
 HPLcom/android/server/TelephonyRegistry;->broadcastSignalStrengthChanged(Landroid/telephony/SignalStrength;II)V
 HPLcom/android/server/TelephonyRegistry;->checkCoarseLocationAccess(Lcom/android/server/TelephonyRegistry$Record;I)Z+]Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;]Ljava/lang/Boolean;Ljava/lang/Boolean;
 HPLcom/android/server/TelephonyRegistry;->checkFineLocationAccess(Lcom/android/server/TelephonyRegistry$Record;I)Z+]Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;]Ljava/lang/Boolean;Ljava/lang/Boolean;
+HSPLcom/android/server/TelephonyRegistry;->checkListenerPermission(Ljava/util/Set;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
 HPLcom/android/server/TelephonyRegistry;->checkNotifyPermission()Z
-HPLcom/android/server/TelephonyRegistry;->createServiceStateBroadcastOptions(IILjava/lang/String;)Landroid/app/BroadcastOptions;
-HPLcom/android/server/TelephonyRegistry;->createServiceStateIntent(Landroid/telephony/ServiceState;IIZ)Landroid/content/Intent;
-HPLcom/android/server/TelephonyRegistry;->fillInSignalStrengthNotifierBundle(Landroid/telephony/SignalStrength;Landroid/os/Bundle;)V
-HPLcom/android/server/TelephonyRegistry;->getLocationSanitizedConfigs(Ljava/util/List;)Ljava/util/List;
+HPLcom/android/server/TelephonyRegistry;->createServiceStateBroadcastOptions(IILjava/lang/String;)Landroid/app/BroadcastOptions;+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;
+HPLcom/android/server/TelephonyRegistry;->createServiceStateIntent(Landroid/telephony/ServiceState;IIZ)Landroid/content/Intent;+]Landroid/telephony/ServiceState;Landroid/telephony/ServiceState;
+HPLcom/android/server/TelephonyRegistry;->fillInSignalStrengthNotifierBundle(Landroid/telephony/SignalStrength;Landroid/os/Bundle;)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/telephony/SignalStrength;Landroid/telephony/SignalStrength;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HPLcom/android/server/TelephonyRegistry;->getLocationSanitizedConfigs(Ljava/util/List;)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/TelephonyRegistry;->getPhoneIdFromSubId(I)I
 HSPLcom/android/server/TelephonyRegistry;->getTelephonyManager()Landroid/telephony/TelephonyManager;
-HPLcom/android/server/TelephonyRegistry;->handleRemoveListLocked()V
+HPLcom/android/server/TelephonyRegistry;->handleRemoveListLocked()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/TelephonyRegistry;->idMatch(Lcom/android/server/TelephonyRegistry$Record;II)Z
 HSPLcom/android/server/TelephonyRegistry;->isPhoneStatePermissionRequired(Ljava/util/Set;Ljava/lang/String;Landroid/os/UserHandle;)Z
+HSPLcom/android/server/TelephonyRegistry;->isPrecisePhoneStatePermissionRequired(Ljava/util/Set;)Z+]Ljava/util/Iterator;Ljava/util/HashMap$KeyIterator;]Ljava/util/Set;Ljava/util/HashSet;
 HSPLcom/android/server/TelephonyRegistry;->isPrivilegedPhoneStatePermissionRequired(Ljava/util/Set;)Z
-HPLcom/android/server/TelephonyRegistry;->lambda$checkFineLocationAccess$2(Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;)Ljava/lang/Boolean;
 HSPLcom/android/server/TelephonyRegistry;->listen(ZZLjava/lang/String;Ljava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;Ljava/util/Set;ZI)V
 HSPLcom/android/server/TelephonyRegistry;->listenWithEventList(ZZILjava/lang/String;Ljava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;[IZ)V
 HPLcom/android/server/TelephonyRegistry;->notifyBarringInfoChanged(IILandroid/telephony/BarringInfo;)V+]Lcom/android/internal/telephony/IPhoneStateListener;Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;]Lcom/android/server/TelephonyRegistry;Lcom/android/server/TelephonyRegistry;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/TelephonyRegistry$Record;Lcom/android/server/TelephonyRegistry$Record;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/telephony/BarringInfo;Landroid/telephony/BarringInfo;
 HPLcom/android/server/TelephonyRegistry;->notifyCellInfoForSubscriber(ILjava/util/List;)V+]Lcom/android/internal/telephony/IPhoneStateListener;Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;]Lcom/android/server/TelephonyRegistry;Lcom/android/server/TelephonyRegistry;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HPLcom/android/server/TelephonyRegistry;->notifyCellLocationForSubscriber(ILandroid/telephony/CellIdentity;Z)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/TelephonyRegistry;Lcom/android/server/TelephonyRegistry;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/internal/telephony/IPhoneStateListener;Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;
 HPLcom/android/server/TelephonyRegistry;->notifyDataActivityForSubscriberWithSlot(III)V+]Lcom/android/internal/telephony/IPhoneStateListener;Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;,Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;]Lcom/android/server/TelephonyRegistry;Lcom/android/server/TelephonyRegistry;]Lcom/android/server/TelephonyRegistry$Record;Lcom/android/server/TelephonyRegistry$Record;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/TelephonyRegistry;->notifyDataConnectionForSubscriber(IILandroid/telephony/PreciseDataConnectionState;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/TelephonyRegistry$Record;Lcom/android/server/TelephonyRegistry$Record;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;]Landroid/util/LocalLog;Landroid/util/LocalLog;]Landroid/telephony/data/ApnSetting;Landroid/telephony/data/ApnSetting;]Lcom/android/internal/telephony/IPhoneStateListener;Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;,Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;]Lcom/android/server/TelephonyRegistry;Lcom/android/server/TelephonyRegistry;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/telephony/PreciseDataConnectionState;Landroid/telephony/PreciseDataConnectionState;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;,Landroid/util/MapCollections$MapIterator;
 HPLcom/android/server/TelephonyRegistry;->notifyDisplayInfoChanged(IILandroid/telephony/TelephonyDisplayInfo;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/internal/telephony/IPhoneStateListener;Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;,Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub;]Lcom/android/server/TelephonyRegistry;Lcom/android/server/TelephonyRegistry;]Lcom/android/server/TelephonyRegistry$Record;Lcom/android/server/TelephonyRegistry$Record;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/TelephonyRegistry$ConfigurationProvider;Lcom/android/server/TelephonyRegistry$ConfigurationProvider;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/util/LocalLog;Landroid/util/LocalLog;
 HPLcom/android/server/TelephonyRegistry;->notifyPhysicalChannelConfigForSubscriber(IILjava/util/List;)V+]Lcom/android/internal/telephony/IPhoneStateListener;Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;,Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub;]Lcom/android/server/TelephonyRegistry;Lcom/android/server/TelephonyRegistry;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/TelephonyRegistry$Record;Lcom/android/server/TelephonyRegistry$Record;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/TelephonyRegistry;->notifyServiceStateForPhoneId(IILandroid/telephony/ServiceState;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/internal/telephony/IPhoneStateListener;Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;,Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;]Lcom/android/server/TelephonyRegistry;Lcom/android/server/TelephonyRegistry;]Lcom/android/server/TelephonyRegistry$Record;Lcom/android/server/TelephonyRegistry$Record;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/telephony/ServiceState;Landroid/telephony/ServiceState;]Landroid/util/LocalLog;Landroid/util/LocalLog;
 HPLcom/android/server/TelephonyRegistry;->notifySignalStrengthForPhoneId(IILandroid/telephony/SignalStrength;)V+]Lcom/android/internal/telephony/IPhoneStateListener;Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;,Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;,Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub;]Lcom/android/server/TelephonyRegistry;Lcom/android/server/TelephonyRegistry;]Lcom/android/server/TelephonyRegistry$Record;Lcom/android/server/TelephonyRegistry$Record;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HPLcom/android/server/TelephonyRegistry;->remove(Landroid/os/IBinder;)V+]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub;,Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/TelephonyRegistry;->remove(Landroid/os/IBinder;)V+]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub;,Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;,Landroid/telephony/TelephonyRegistryManager$1;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/TelephonyRegistry;->validateEventAndUserLocked(Lcom/android/server/TelephonyRegistry$Record;I)Z+]Lcom/android/server/TelephonyRegistry$Record;Lcom/android/server/TelephonyRegistry$Record;
-HSPLcom/android/server/TelephonyRegistry;->validatePhoneId(I)Z
-HSPLcom/android/server/ThreadPriorityBooster$1;-><init>(Lcom/android/server/ThreadPriorityBooster;)V
+HSPLcom/android/server/TelephonyRegistry;->validatePhoneId(I)Z+]Landroid/telephony/TelephonyManager;Landroid/telephony/TelephonyManager;
 HSPLcom/android/server/ThreadPriorityBooster$1;->initialValue()Lcom/android/server/ThreadPriorityBooster$PriorityState;
 HSPLcom/android/server/ThreadPriorityBooster$1;->initialValue()Ljava/lang/Object;
 HSPLcom/android/server/ThreadPriorityBooster$PriorityState;-><init>()V
-HSPLcom/android/server/ThreadPriorityBooster$PriorityState;-><init>(Lcom/android/server/ThreadPriorityBooster$PriorityState-IA;)V
-HSPLcom/android/server/ThreadPriorityBooster;-><init>(II)V
 HSPLcom/android/server/ThreadPriorityBooster;->boost()V+]Ljava/lang/ThreadLocal;Lcom/android/server/ThreadPriorityBooster$1;
 HSPLcom/android/server/ThreadPriorityBooster;->reset()V+]Ljava/lang/ThreadLocal;Lcom/android/server/ThreadPriorityBooster$1;
-HSPLcom/android/server/UiModeManagerService$1;->get()I
-HPLcom/android/server/UiModeManagerService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HSPLcom/android/server/UiModeManagerService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/UiModeManagerService$Stub;->addCallback(Landroid/app/IUiModeManagerCallback;)V
 HSPLcom/android/server/UiModeManagerService$Stub;->getCurrentModeType()I
-HSPLcom/android/server/UiModeManagerService;->-$$Nest$fgetmLock(Lcom/android/server/UiModeManagerService;)Ljava/lang/Object;
 HSPLcom/android/server/UiModeManagerService;->applyConfigurationExternallyLocked()V
-HPLcom/android/server/UiModeManagerService;->sendConfigurationAndStartDreamOrDockAppLocked(Ljava/lang/String;)V
+HSPLcom/android/server/UiModeManagerService;->sendConfigurationAndStartDreamOrDockAppLocked(Ljava/lang/String;)V
 HSPLcom/android/server/UiModeManagerService;->unregisterTimeChangeEvent()V
-HSPLcom/android/server/UiModeManagerService;->updateComputedNightModeLocked(Z)V
-HSPLcom/android/server/UiModeManagerService;->updateConfigurationLocked()V
-HPLcom/android/server/UiModeManagerService;->updateLocked(II)V
-HSPLcom/android/server/UiThread;-><init>()V
-HSPLcom/android/server/UiThread;->ensureThreadLocked()V
-HSPLcom/android/server/UiThread;->get()Lcom/android/server/UiThread;
-HSPLcom/android/server/UiThread;->getHandler()Landroid/os/Handler;
-HSPLcom/android/server/UiThread;->run()V
-HPLcom/android/server/VcnManagementService$$ExternalSyntheticLambda6;-><init>(Lcom/android/server/VcnManagementService;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;)V
+HSPLcom/android/server/UiModeManagerService;->updateComputedNightModeLocked(Z)V+]Lcom/android/server/UiModeManagerService$NightMode;Lcom/android/server/UiModeManagerService$1;
+HSPLcom/android/server/UiModeManagerService;->updateConfigurationLocked()V+]Lcom/android/server/twilight/TwilightManager;Lcom/android/server/twilight/TwilightService$1;]Lcom/android/server/UiModeManagerService$NightMode;Lcom/android/server/UiModeManagerService$1;
+HSPLcom/android/server/UiModeManagerService;->updateLocked(II)V
 HPLcom/android/server/VcnManagementService$$ExternalSyntheticLambda6;->getOrThrow()Ljava/lang/Object;
-HPLcom/android/server/VcnManagementService$TrackingNetworkCallback;->requiresRestartForImmutableCapabilityChanges(Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;)Z
-HPLcom/android/server/VcnManagementService;->getSubGroupForNetworkCapabilities(Landroid/net/NetworkCapabilities;)Landroid/os/ParcelUuid;
-HPLcom/android/server/VcnManagementService;->getUnderlyingNetworkPolicy(Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;)Landroid/net/vcn/VcnUnderlyingNetworkPolicy;
-HPLcom/android/server/VcnManagementService;->lambda$getUnderlyingNetworkPolicy$8(Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;)Landroid/net/vcn/VcnUnderlyingNetworkPolicy;
-HSPLcom/android/server/Watchdog$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/Watchdog;)V
-HSPLcom/android/server/Watchdog$$ExternalSyntheticLambda0;->run()V
-HSPLcom/android/server/Watchdog$BinderThreadMonitor;-><init>()V
-HSPLcom/android/server/Watchdog$BinderThreadMonitor;-><init>(Lcom/android/server/Watchdog$BinderThreadMonitor-IA;)V
+HPLcom/android/server/VcnManagementService$TrackingNetworkCallback;->requiresRestartForImmutableCapabilityChanges(Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;)Z+]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;
+HPLcom/android/server/VcnManagementService;->getSubGroupForNetworkCapabilities(Landroid/net/NetworkCapabilities;)Landroid/os/ParcelUuid;+]Lcom/android/server/vcn/TelephonySubscriptionTracker$TelephonySubscriptionSnapshot;Lcom/android/server/vcn/TelephonySubscriptionTracker$TelephonySubscriptionSnapshot;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
+HPLcom/android/server/VcnManagementService;->getUnderlyingNetworkPolicy(Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;)Landroid/net/vcn/VcnUnderlyingNetworkPolicy;+]Landroid/content/Context;Landroid/app/ContextImpl;
+HPLcom/android/server/VcnManagementService;->lambda$getUnderlyingNetworkPolicy$8(Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;)Landroid/net/vcn/VcnUnderlyingNetworkPolicy;+]Ljava/util/Map;Landroid/util/ArrayMap;
 HSPLcom/android/server/Watchdog$BinderThreadMonitor;->monitor()V
-HSPLcom/android/server/Watchdog$HandlerChecker;-><init>(Landroid/os/Handler;Ljava/lang/String;Ljava/lang/Object;)V
 HSPLcom/android/server/Watchdog$HandlerChecker;-><init>(Landroid/os/Handler;Ljava/lang/String;Ljava/lang/Object;Ljava/time/Clock;)V
-HSPLcom/android/server/Watchdog$HandlerChecker;->addMonitorLocked(Lcom/android/server/Watchdog$Monitor;)V
 HPLcom/android/server/Watchdog$HandlerChecker;->getCompletionStateLocked()I+]Ljava/time/Clock;Landroid/os/SystemClock$1;
 HSPLcom/android/server/Watchdog$HandlerChecker;->getThread()Ljava/lang/Thread;
 HSPLcom/android/server/Watchdog$HandlerChecker;->isHandlerPolling()Z+]Landroid/os/Handler;Landroid/os/Handler;,Lcom/android/server/pm/PackageHandler;,Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/os/Looper;Landroid/os/Looper;]Landroid/os/MessageQueue;Landroid/os/MessageQueue;
 HPLcom/android/server/Watchdog$HandlerChecker;->pauseForLocked(ILjava/lang/String;)V
-HSPLcom/android/server/Watchdog$HandlerChecker;->pauseLocked(Ljava/lang/String;)V
 HSPLcom/android/server/Watchdog$HandlerChecker;->run()V+]Lcom/android/server/Watchdog$Monitor;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/Watchdog$HandlerChecker;->scheduleCheckLocked(J)V+]Ljava/time/Clock;Landroid/os/SystemClock$1;]Landroid/os/Handler;Landroid/os/Handler;,Lcom/android/server/pm/PackageHandler;,Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/Watchdog$HandlerChecker;Lcom/android/server/Watchdog$HandlerChecker;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/Watchdog$HandlerCheckerAndTimeout;-><init>(Lcom/android/server/Watchdog$HandlerChecker;Ljava/util/Optional;)V
 HSPLcom/android/server/Watchdog$HandlerCheckerAndTimeout;->checker()Lcom/android/server/Watchdog$HandlerChecker;
 HSPLcom/android/server/Watchdog$HandlerCheckerAndTimeout;->customTimeoutMillis()Ljava/util/Optional;
-HSPLcom/android/server/Watchdog$HandlerCheckerAndTimeout;->withCustomTimeout(Lcom/android/server/Watchdog$HandlerChecker;J)Lcom/android/server/Watchdog$HandlerCheckerAndTimeout;
-HSPLcom/android/server/Watchdog$HandlerCheckerAndTimeout;->withDefaultTimeout(Lcom/android/server/Watchdog$HandlerChecker;)Lcom/android/server/Watchdog$HandlerCheckerAndTimeout;
-HSPLcom/android/server/Watchdog;->$r8$lambda$IHmOjeSmDoiNkZR0B-wv71mYNoM(Lcom/android/server/Watchdog;)V
 HSPLcom/android/server/Watchdog;-><clinit>()V
 HSPLcom/android/server/Watchdog;-><init>()V
-HSPLcom/android/server/Watchdog;->addMonitor(Lcom/android/server/Watchdog$Monitor;)V
-HSPLcom/android/server/Watchdog;->addThread(Landroid/os/Handler;)V
-HSPLcom/android/server/Watchdog;->addThread(Landroid/os/Handler;J)V
 HPLcom/android/server/Watchdog;->evaluateCheckerCompletionLocked()I+]Lcom/android/server/Watchdog$HandlerCheckerAndTimeout;Lcom/android/server/Watchdog$HandlerCheckerAndTimeout;]Lcom/android/server/Watchdog$HandlerChecker;Lcom/android/server/Watchdog$HandlerChecker;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/Watchdog;->getInstance()Lcom/android/server/Watchdog;
 HSPLcom/android/server/Watchdog;->isInterestingJavaProcess(Ljava/lang/String;)Z
-HSPLcom/android/server/Watchdog;->pauseWatchingCurrentThread(Ljava/lang/String;)V
+HPLcom/android/server/Watchdog;->pauseWatchingCurrentThreadFor(ILjava/lang/String;)V+]Ljava/lang/Object;Ljava/lang/Thread;,Landroid/os/HandlerThread;,Lcom/android/server/ServiceThread;]Lcom/android/server/Watchdog$HandlerCheckerAndTimeout;Lcom/android/server/Watchdog$HandlerCheckerAndTimeout;]Lcom/android/server/Watchdog$HandlerChecker;Lcom/android/server/Watchdog$HandlerChecker;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/Watchdog;->run()V
-HSPLcom/android/server/Watchdog;->start()V
-HSPLcom/android/server/accessibility/AccessibilityManagerService$$ExternalSyntheticLambda35;-><init>()V
 HSPLcom/android/server/accessibility/AccessibilityManagerService$Client;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;Landroid/view/accessibility/IAccessibilityManagerClient;ILcom/android/server/accessibility/AccessibilityUserState;I)V
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->addClient(Landroid/view/accessibility/IAccessibilityManagerClient;I)J
+HSPLcom/android/server/accessibility/AccessibilityManagerService;->computeRelevantEventTypesLocked(Lcom/android/server/accessibility/AccessibilityUserState;Lcom/android/server/accessibility/AccessibilityManagerService$Client;)I+]Lcom/android/server/accessibility/UiAutomationManager;Lcom/android/server/accessibility/UiAutomationManager;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->getCurrentUserIdLocked()I
-HSPLcom/android/server/accessibility/AccessibilityManagerService;->getEnabledAccessibilityServiceList(II)Ljava/util/List;+]Lcom/android/server/accessibility/AccessibilitySecurityPolicy;Lcom/android/server/accessibility/AccessibilitySecurityPolicy;]Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/accessibility/AccessibilityServiceConnection;Lcom/android/server/accessibility/AccessibilityServiceConnection;]Lcom/android/server/accessibility/UiAutomationManager;Lcom/android/server/accessibility/UiAutomationManager;]Lcom/android/server/accessibility/AccessibilityTraceManager;Lcom/android/server/accessibility/AccessibilityTraceManager;]Lcom/android/server/accessibility/ProxyManager;Lcom/android/server/accessibility/ProxyManager;
-HPLcom/android/server/accessibility/AccessibilityManagerService;->getInstalledAccessibilityServiceList(I)Landroid/content/pm/ParceledListSlice;+]Landroid/accessibilityservice/AccessibilityServiceInfo;Landroid/accessibilityservice/AccessibilityServiceInfo;]Lcom/android/server/accessibility/AccessibilitySecurityPolicy;Lcom/android/server/accessibility/AccessibilitySecurityPolicy;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/accessibility/AccessibilityTraceManager;Lcom/android/server/accessibility/AccessibilityTraceManager;]Lcom/android/server/accessibility/ProxyManager;Lcom/android/server/accessibility/ProxyManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/accessibility/AccessibilityManagerService;->getCurrentUserStateLocked()Lcom/android/server/accessibility/AccessibilityUserState;
+HSPLcom/android/server/accessibility/AccessibilityManagerService;->getEnabledAccessibilityServiceList(II)Ljava/util/List;+]Lcom/android/server/accessibility/AccessibilitySecurityPolicy;Lcom/android/server/accessibility/AccessibilitySecurityPolicy;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/accessibility/UiAutomationManager;Lcom/android/server/accessibility/UiAutomationManager;]Lcom/android/server/accessibility/AccessibilityTraceManager;Lcom/android/server/accessibility/AccessibilityTraceManager;]Lcom/android/server/accessibility/ProxyManager;Lcom/android/server/accessibility/ProxyManager;]Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService;]Lcom/android/server/accessibility/AccessibilityServiceConnection;Lcom/android/server/accessibility/AccessibilityServiceConnection;
+HSPLcom/android/server/accessibility/AccessibilityManagerService;->getFocusColor()I
+HSPLcom/android/server/accessibility/AccessibilityManagerService;->getFocusStrokeWidth()I
+HPLcom/android/server/accessibility/AccessibilityManagerService;->getInstalledAccessibilityServiceList(I)Landroid/content/pm/ParceledListSlice;+]Landroid/accessibilityservice/AccessibilityServiceInfo;Landroid/accessibilityservice/AccessibilityServiceInfo;]Lcom/android/server/accessibility/AccessibilitySecurityPolicy;Lcom/android/server/accessibility/AccessibilitySecurityPolicy;]Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/accessibility/AccessibilityTraceManager;Lcom/android/server/accessibility/AccessibilityTraceManager;]Lcom/android/server/accessibility/ProxyManager;Lcom/android/server/accessibility/ProxyManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/accessibility/AccessibilityManagerService;->getRecommendedTimeoutMillis()J
 HSPLcom/android/server/accessibility/AccessibilityManagerService;->getUserStateLocked(I)Lcom/android/server/accessibility/AccessibilityUserState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/accessibility/AccessibilityManagerService;->parseAccessibilityServiceInfos(I)Ljava/util/List;
 HSPLcom/android/server/accessibility/AccessibilitySecurityPolicy;->resolveCallingUserIdEnforcingPermissionsLocked(I)I+]Lcom/android/server/accessibility/AccessibilitySecurityPolicy$AccessibilityUserManager;Lcom/android/server/accessibility/AccessibilityManagerService;]Lcom/android/server/accessibility/AccessibilitySecurityPolicy;Lcom/android/server/accessibility/AccessibilitySecurityPolicy;
-HSPLcom/android/server/accessibility/AccessibilitySecurityPolicy;->resolveProfileParentLocked(I)I+]Lcom/android/server/accessibility/AccessibilitySecurityPolicy$AccessibilityUserManager;Lcom/android/server/accessibility/AccessibilityManagerService;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager;
+HSPLcom/android/server/accessibility/AccessibilitySecurityPolicy;->resolveProfileParentLocked(I)I+]Lcom/android/server/accessibility/AccessibilitySecurityPolicy$AccessibilityUserManager;Lcom/android/server/accessibility/AccessibilityManagerService;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager;]Landroid/os/UserHandle;Landroid/os/UserHandle;
 HSPLcom/android/server/accessibility/AccessibilityTraceManager;->isA11yTracingEnabledForTypes(J)Z
 HSPLcom/android/server/accessibility/FlashNotificationsController$4;->onDisplayChanged(I)V
-HSPLcom/android/server/accessibility/ProxyManager;->getFirstDeviceIdForUidLocked(I)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/companion/virtual/VirtualDeviceManagerInternal;Lcom/android/server/companion/virtual/VirtualDeviceManagerService$LocalService;]Lcom/android/server/accessibility/ProxyManager;Lcom/android/server/accessibility/ProxyManager;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/ArraySet;
+HSPLcom/android/server/accessibility/ProxyManager;->getFirstDeviceIdForUidLocked(I)I+]Lcom/android/server/companion/virtual/VirtualDeviceManagerInternal;Lcom/android/server/companion/virtual/VirtualDeviceManagerService$LocalService;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Lcom/android/server/accessibility/ProxyManager;Lcom/android/server/accessibility/ProxyManager;]Ljava/util/Set;Landroid/util/ArraySet;
 HSPLcom/android/server/accessibility/ProxyManager;->getLocalVdm()Lcom/android/server/companion/virtual/VirtualDeviceManagerInternal;
-HSPLcom/android/server/accessibility/UiAutomationManager;->suppressingAccessibilityServicesLocked()Z
+HSPLcom/android/server/accessibility/UiAutomationManager;->suppressingAccessibilityServicesLocked()Z+]Lcom/android/server/accessibility/UiAutomationManager;Lcom/android/server/accessibility/UiAutomationManager;
 HPLcom/android/server/accounts/AccountAuthenticatorCache;->getServiceInfo(Landroid/accounts/AuthenticatorDescription;I)Landroid/content/pm/RegisteredServicesCache$ServiceInfo;
-HSPLcom/android/server/accounts/AccountAuthenticatorCache;->parseServiceAttributes(Landroid/content/res/Resources;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/accounts/AuthenticatorDescription;
-HSPLcom/android/server/accounts/AccountManagerService$$ExternalSyntheticLambda5;->onPermissionsChanged(I)V
+HSPLcom/android/server/accounts/AccountAuthenticatorCache;->parseServiceAttributes(Landroid/content/res/Resources;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/accounts/AuthenticatorDescription;+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;
 HPLcom/android/server/accounts/AccountManagerService$8;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;ZLandroid/os/Bundle;Landroid/accounts/Account;Ljava/lang/String;ZZLjava/lang/String;IZ[BLcom/android/server/accounts/AccountManagerService$UserAccounts;)V
 HPLcom/android/server/accounts/AccountManagerService$8;->onResult(Landroid/os/Bundle;)V
 HPLcom/android/server/accounts/AccountManagerService$8;->run()V
 HPLcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;->hasAccountAccess(Landroid/accounts/Account;I)Z
 HPLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;[Ljava/lang/String;ILjava/lang/String;Z)V
 HPLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->checkAccount()V+]Landroid/accounts/IAccountAuthenticator;Landroid/accounts/IAccountAuthenticator$Stub$Proxy;]Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;
-HPLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->onResult(Landroid/os/Bundle;)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->run()V
-HPLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->sendResult()V
+HPLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->onResult(Landroid/os/Bundle;)V+]Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/Bundle;Landroid/os/Bundle;
+HPLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->run()V+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;
+HPLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->sendResult()V+]Lcom/android/server/accounts/AccountManagerService$Session;Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;]Landroid/accounts/IAccountManagerResponse;Landroid/accounts/IAccountManagerResponse$Stub$Proxy;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/accounts/AccountManagerService$Injector;->getNotificationManager()Landroid/app/INotificationManager;
 HSPLcom/android/server/accounts/AccountManagerService$NotificationId;->-$$Nest$fgetmId(Lcom/android/server/accounts/AccountManagerService$NotificationId;)I
-HPLcom/android/server/accounts/AccountManagerService$Session;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;ZZ)V
+HPLcom/android/server/accounts/AccountManagerService$Session;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;Z)V
+HPLcom/android/server/accounts/AccountManagerService$Session;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;ZZ)V+]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/accounts/AccountManager$BaseFutureTask$Response;]Ljava/lang/Object;Lcom/android/server/accounts/AccountManagerService$RemoveAccountSession;,Lcom/android/server/accounts/AccountManagerService$TestFeaturesSession;,Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;,Lcom/android/server/accounts/AccountManagerService$8;]Landroid/accounts/IAccountManagerResponse;Landroid/accounts/AccountManager$BaseFutureTask$Response;,Landroid/accounts/IAccountManagerResponse$Stub$Proxy;
 HPLcom/android/server/accounts/AccountManagerService$Session;->bind()V
-HPLcom/android/server/accounts/AccountManagerService$Session;->bindToAuthenticator(Ljava/lang/String;)Z
+HPLcom/android/server/accounts/AccountManagerService$Session;->bindToAuthenticator(Ljava/lang/String;)Z+]Lcom/android/server/accounts/IAccountAuthenticatorCache;Lcom/android/server/accounts/AccountAuthenticatorCache;]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/accounts/AccountManagerService$Session;->cancelTimeout()V
+HPLcom/android/server/accounts/AccountManagerService$Session;->checkKeyIntent(ILandroid/os/Bundle;)Z
 HPLcom/android/server/accounts/AccountManagerService$Session;->checkKeyIntentParceledCorrectly(Landroid/os/Bundle;)Z
-HPLcom/android/server/accounts/AccountManagerService$Session;->close()V
+HPLcom/android/server/accounts/AccountManagerService$Session;->close()V+]Lcom/android/server/accounts/AccountManagerService$Session;Lcom/android/server/accounts/AccountManagerService$RemoveAccountSession;,Lcom/android/server/accounts/AccountManagerService$TestFeaturesSession;,Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;,Lcom/android/server/accounts/AccountManagerService$8;]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Ljava/lang/Object;Lcom/android/server/accounts/AccountManagerService$RemoveAccountSession;,Lcom/android/server/accounts/AccountManagerService$TestFeaturesSession;,Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;,Lcom/android/server/accounts/AccountManagerService$8;]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/accounts/AccountManager$BaseFutureTask$Response;]Landroid/accounts/IAccountManagerResponse;Landroid/accounts/AccountManager$BaseFutureTask$Response;,Landroid/accounts/IAccountManagerResponse$Stub$Proxy;
 HPLcom/android/server/accounts/AccountManagerService$Session;->getResponseAndClose()Landroid/accounts/IAccountManagerResponse;
 HPLcom/android/server/accounts/AccountManagerService$Session;->onResult(Landroid/os/Bundle;)V
-HPLcom/android/server/accounts/AccountManagerService$Session;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+HPLcom/android/server/accounts/AccountManagerService$Session;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V+]Lcom/android/server/accounts/AccountManagerService$Session;Lcom/android/server/accounts/AccountManagerService$RemoveAccountSession;,Lcom/android/server/accounts/AccountManagerService$TestFeaturesSession;,Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;,Lcom/android/server/accounts/AccountManagerService$8;
 HPLcom/android/server/accounts/AccountManagerService$Session;->scheduleTimeout()V
-HPLcom/android/server/accounts/AccountManagerService$Session;->unbind()V
+HPLcom/android/server/accounts/AccountManagerService$Session;->unbind()V+]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/accounts/AccountManagerService$UserAccounts;->-$$Nest$fgetauthTokenCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
 HSPLcom/android/server/accounts/AccountManagerService$UserAccounts;->-$$Nest$fgetcredentialsPermissionNotificationIds(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/HashMap;
 HPLcom/android/server/accounts/AccountManagerService$UserAccounts;->-$$Nest$fgetuserDataCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
@@ -564,7 +427,7 @@
 HSPLcom/android/server/accounts/AccountManagerService$UserAccounts;->-$$Nest$fgetvisibilityCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
 HPLcom/android/server/accounts/AccountManagerService;->-$$Nest$fgetmSessions(Lcom/android/server/accounts/AccountManagerService;)Ljava/util/LinkedHashMap;
 HPLcom/android/server/accounts/AccountManagerService;->accountExistsCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Z+]Ljava/util/HashMap;Ljava/util/LinkedHashMap;]Ljava/lang/Object;Ljava/lang/String;
-HSPLcom/android/server/accounts/AccountManagerService;->accountTypeManagesContacts(Ljava/lang/String;I)Z+]Lcom/android/server/accounts/IAccountAuthenticatorCache;Lcom/android/server/accounts/AccountAuthenticatorCache;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;
+HSPLcom/android/server/accounts/AccountManagerService;->accountTypeManagesContacts(Ljava/lang/String;I)Z+]Lcom/android/server/accounts/IAccountAuthenticatorCache;Lcom/android/server/accounts/AccountAuthenticatorCache;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/lang/Object;Ljava/lang/String;
 HPLcom/android/server/accounts/AccountManagerService;->calculatePackageSignatureDigest(Ljava/lang/String;I)[B
 HSPLcom/android/server/accounts/AccountManagerService;->cancelAccountAccessRequestNotificationIfNeeded(Landroid/accounts/Account;ILjava/lang/String;ZLcom/android/server/accounts/AccountManagerService$UserAccounts;)V
 HSPLcom/android/server/accounts/AccountManagerService;->cancelNotification(Lcom/android/server/accounts/AccountManagerService$NotificationId;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Landroid/content/Context;Landroid/app/ContextImpl;
@@ -572,46 +435,48 @@
 HSPLcom/android/server/accounts/AccountManagerService;->checkPackageSignature(Ljava/lang/String;II)I+]Lcom/android/server/accounts/IAccountAuthenticatorCache;Lcom/android/server/accounts/AccountAuthenticatorCache;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/accounts/AccountManagerService;->filterAccounts(Lcom/android/server/accounts/AccountManagerService$UserAccounts;[Landroid/accounts/Account;ILjava/lang/String;Z)[Landroid/accounts/Account;+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/Map;Ljava/util/LinkedHashMap;]Ljava/util/Set;Ljava/util/LinkedHashMap$LinkedKeySet;
 HSPLcom/android/server/accounts/AccountManagerService;->filterSharedAccounts(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/util/Map;ILjava/lang/String;)Ljava/util/Map;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager;
-HSPLcom/android/server/accounts/AccountManagerService;->getAccountVisibilityFromCache(Landroid/accounts/Account;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)I
-HSPLcom/android/server/accounts/AccountManagerService;->getAccountsAsUser(Ljava/lang/String;ILjava/lang/String;)[Landroid/accounts/Account;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
-HSPLcom/android/server/accounts/AccountManagerService;->getAccountsAsUserForPackage(Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Z)[Landroid/accounts/Account;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/List;Ljava/util/ArrayList;
-HPLcom/android/server/accounts/AccountManagerService;->getAccountsByFeatures(Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
-HPLcom/android/server/accounts/AccountManagerService;->getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;
+HSPLcom/android/server/accounts/AccountManagerService;->getAccountVisibilityFromCache(Landroid/accounts/Account;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)I+]Ljava/util/Map;Ljava/util/HashMap;
+HPLcom/android/server/accounts/AccountManagerService;->getAccounts(ILjava/lang/String;)[Landroid/accounts/Account;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
+HSPLcom/android/server/accounts/AccountManagerService;->getAccountsAsUser(Ljava/lang/String;ILjava/lang/String;)[Landroid/accounts/Account;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;
+HSPLcom/android/server/accounts/AccountManagerService;->getAccountsAsUserForPackage(Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Z)[Landroid/accounts/Account;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;
+HPLcom/android/server/accounts/AccountManagerService;->getAccountsByFeatures(Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
+HPLcom/android/server/accounts/AccountManagerService;->getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
 HSPLcom/android/server/accounts/AccountManagerService;->getAccountsFromCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;ILjava/lang/String;Z)[Landroid/accounts/Account;+]Ljava/util/HashMap;Ljava/util/LinkedHashMap;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/Collection;Ljava/util/LinkedHashMap$LinkedValues;]Ljava/util/Iterator;Ljava/util/LinkedHashMap$LinkedValueIterator;
 HSPLcom/android/server/accounts/AccountManagerService;->getAccountsInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;ILjava/lang/String;Ljava/util/List;Z)[Landroid/accounts/Account;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/accounts/AccountManagerService;->getAuthToken(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;Ljava/lang/String;ZZLandroid/os/Bundle;)V
 HSPLcom/android/server/accounts/AccountManagerService;->getCredentialPermissionNotificationId(Landroid/accounts/Account;Ljava/lang/String;ILcom/android/server/accounts/AccountManagerService$UserAccounts;)Lcom/android/server/accounts/AccountManagerService$NotificationId;+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Ljava/lang/String;]Landroid/accounts/Account;Landroid/accounts/Account;
 HPLcom/android/server/accounts/AccountManagerService;->getPackageNameForUid(I)Ljava/lang/String;+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
 HSPLcom/android/server/accounts/AccountManagerService;->getPackagesAndVisibilityForAccountLocked(Landroid/accounts/Account;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;+]Ljava/util/Map;Ljava/util/HashMap;
-HPLcom/android/server/accounts/AccountManagerService;->getPassword(Landroid/accounts/Account;)Ljava/lang/String;
+HPLcom/android/server/accounts/AccountManagerService;->getPassword(Landroid/accounts/Account;)Ljava/lang/String;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;
 HPLcom/android/server/accounts/AccountManagerService;->getSigninRequiredNotificationId(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Lcom/android/server/accounts/AccountManagerService$NotificationId;
 HSPLcom/android/server/accounts/AccountManagerService;->getTypesForCaller(IIZ)Ljava/util/List;+]Lcom/android/server/accounts/IAccountAuthenticatorCache;Lcom/android/server/accounts/AccountAuthenticatorCache;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/accounts/AccountManagerService;->getTypesManagedByCaller(II)Ljava/util/List;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;
 HSPLcom/android/server/accounts/AccountManagerService;->getTypesVisibleToCaller(IILjava/lang/String;)Ljava/util/List;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;
-HSPLcom/android/server/accounts/AccountManagerService;->getUserAccounts(I)Lcom/android/server/accounts/AccountManagerService$UserAccounts;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
+HSPLcom/android/server/accounts/AccountManagerService;->getUserAccounts(I)Lcom/android/server/accounts/AccountManagerService$UserAccounts;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;
 HSPLcom/android/server/accounts/AccountManagerService;->getUserAccountsNotChecked(I)Lcom/android/server/accounts/AccountManagerService$UserAccounts;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/accounts/AccountManagerService$Injector;Lcom/android/server/accounts/AccountManagerService$Injector;]Lcom/android/server/accounts/AccountsDb;Lcom/android/server/accounts/AccountsDb;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/accounts/AccountManagerService;->getUserData(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;
 HSPLcom/android/server/accounts/AccountManagerService;->getUserManager()Landroid/os/UserManager;
 HSPLcom/android/server/accounts/AccountManagerService;->hasAccountAccess(Landroid/accounts/Account;Ljava/lang/String;I)Z+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/lang/Integer;Ljava/lang/Integer;
 HSPLcom/android/server/accounts/AccountManagerService;->hasAccountAccess(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/UserHandle;)Z+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
+HSPLcom/android/server/accounts/AccountManagerService;->hasExplicitlyGrantedPermission(Landroid/accounts/Account;Ljava/lang/String;I)Z
 HPLcom/android/server/accounts/AccountManagerService;->hasFeatures(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;[Ljava/lang/String;ILjava/lang/String;)V
 HPLcom/android/server/accounts/AccountManagerService;->invalidateAuthToken(Ljava/lang/String;Ljava/lang/String;)V
 HPLcom/android/server/accounts/AccountManagerService;->invalidateAuthTokenLocked(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
 HSPLcom/android/server/accounts/AccountManagerService;->isAccountManagedByCaller(Ljava/lang/String;II)Z+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/accounts/AccountManagerService;->isLocalUnlockedUser(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/accounts/AccountManagerService;->isPermittedForPackage(Ljava/lang/String;I[Ljava/lang/String;)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
-HSPLcom/android/server/accounts/AccountManagerService;->isPreOApplication(Ljava/lang/String;)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/PackageManager$NameNotFoundException;Landroid/content/pm/PackageManager$NameNotFoundException;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
-HSPLcom/android/server/accounts/AccountManagerService;->isPrivileged(I)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/PackageManager$NameNotFoundException;Landroid/content/pm/PackageManager$NameNotFoundException;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
-HSPLcom/android/server/accounts/AccountManagerService;->isProfileOwner(I)Z
+HSPLcom/android/server/accounts/AccountManagerService;->isPreOApplication(Ljava/lang/String;)Z+]Landroid/content/pm/PackageManager$NameNotFoundException;Landroid/content/pm/PackageManager$NameNotFoundException;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/accounts/AccountManagerService;->isPrivileged(I)Z+]Landroid/content/pm/PackageManager$NameNotFoundException;Landroid/content/pm/PackageManager$NameNotFoundException;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/accounts/AccountManagerService;->isProfileOwner(I)Z+]Landroid/app/admin/DevicePolicyManagerInternal;Lcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;
 HSPLcom/android/server/accounts/AccountManagerService;->lambda$new$0(I)V+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
 HPLcom/android/server/accounts/AccountManagerService;->logGetAuthTokenMetrics(Ljava/lang/String;Ljava/lang/String;)V
 HPLcom/android/server/accounts/AccountManagerService;->onAccountAccessed(Ljava/lang/String;)V+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Landroid/accounts/Account;Landroid/accounts/Account;]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/accounts/AccountManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HPLcom/android/server/accounts/AccountManagerService;->peekAuthToken(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/accounts/AccountManagerService;->peekAuthToken(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;
 HSPLcom/android/server/accounts/AccountManagerService;->permissionIsGranted(Landroid/accounts/Account;Ljava/lang/String;II)Z+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;
-HPLcom/android/server/accounts/AccountManagerService;->readAuthTokenInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/accounts/AccountManagerService;->readAuthTokenInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/accounts/AccountsDb;Lcom/android/server/accounts/AccountsDb;]Ljava/util/Map;Ljava/util/HashMap;
 HPLcom/android/server/accounts/AccountManagerService;->readCachedTokenInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;[B)Lcom/android/server/accounts/TokenCache$Value;
-HPLcom/android/server/accounts/AccountManagerService;->readPasswordInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Ljava/lang/String;
+HPLcom/android/server/accounts/AccountManagerService;->readPasswordInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Ljava/lang/String;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Lcom/android/server/accounts/AccountsDb;Lcom/android/server/accounts/AccountsDb;
 HPLcom/android/server/accounts/AccountManagerService;->readUserDataInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/accounts/AccountsDb;Lcom/android/server/accounts/AccountsDb;]Ljava/util/Map;Ljava/util/HashMap;
 HSPLcom/android/server/accounts/AccountManagerService;->resolveAccountVisibility(Landroid/accounts/Account;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/lang/Integer;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
 HPLcom/android/server/accounts/AccountManagerService;->saveAuthTokenToDatabase(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)Z
@@ -623,17 +488,17 @@
 HSPLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->-$$Nest$fgetmCeAttached(Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;)Z
 HPLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->getReadableDatabaseUserIsUnlocked()Landroid/database/sqlite/SQLiteDatabase;
 HPLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->getWritableDatabaseUserIsUnlocked()Landroid/database/sqlite/SQLiteDatabase;
-HPLcom/android/server/accounts/AccountsDb;->beginTransaction()V
+HPLcom/android/server/accounts/AccountsDb;->beginTransaction()V+]Landroid/database/sqlite/SQLiteOpenHelper;Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;
 HPLcom/android/server/accounts/AccountsDb;->deleteAuthToken(Ljava/lang/String;)Z
 HPLcom/android/server/accounts/AccountsDb;->deleteAuthtokensByAccountIdAndType(JLjava/lang/String;)Z
-HPLcom/android/server/accounts/AccountsDb;->endTransaction()V
-HPLcom/android/server/accounts/AccountsDb;->findAccountPasswordByNameAndType(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/accounts/AccountsDb;->endTransaction()V+]Landroid/database/sqlite/SQLiteOpenHelper;Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;
+HPLcom/android/server/accounts/AccountsDb;->findAccountPasswordByNameAndType(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
 HPLcom/android/server/accounts/AccountsDb;->findAuthtokenForAllAccounts(Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
-HPLcom/android/server/accounts/AccountsDb;->findDeAccountId(Landroid/accounts/Account;)J
+HPLcom/android/server/accounts/AccountsDb;->findDeAccountId(Landroid/accounts/Account;)J+]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/sqlite/SQLiteOpenHelper;Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;
 HPLcom/android/server/accounts/AccountsDb;->findExtrasIdByAccountId(JLjava/lang/String;)J
 HPLcom/android/server/accounts/AccountsDb;->insertAuthToken(JLjava/lang/String;Ljava/lang/String;)J
 HSPLcom/android/server/accounts/AccountsDb;->isCeDatabaseAttached()Z
-HPLcom/android/server/accounts/AccountsDb;->setTransactionSuccessful()V
+HPLcom/android/server/accounts/AccountsDb;->setTransactionSuccessful()V+]Landroid/database/sqlite/SQLiteOpenHelper;Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;
 HPLcom/android/server/accounts/AccountsDb;->updateExtra(JLjava/lang/String;)Z
 HPLcom/android/server/accounts/TokenCache$Key;-><init>(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;[B)V
 HPLcom/android/server/accounts/TokenCache$Key;->equals(Ljava/lang/Object;)Z
@@ -647,40 +512,41 @@
 HSPLcom/android/server/alarm/Alarm;->getMaxWhenElapsed()J
 HSPLcom/android/server/alarm/Alarm;->getWhenElapsed()J
 HSPLcom/android/server/alarm/Alarm;->makeTag(Landroid/app/PendingIntent;Ljava/lang/String;I)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/PendingIntent;Landroid/app/PendingIntent;
-HSPLcom/android/server/alarm/Alarm;->matches(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)Z+]Landroid/app/IAlarmListener;Landroid/app/IAlarmListener$Stub$Proxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Ljava/lang/Object;Landroid/os/BinderProxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;
+HSPLcom/android/server/alarm/Alarm;->matches(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)Z+]Landroid/app/IAlarmListener;Landroid/app/IAlarmListener$Stub$Proxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Ljava/lang/Object;Landroid/os/BinderProxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;
 HSPLcom/android/server/alarm/Alarm;->setPolicyElapsed(IJ)Z+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;
 HSPLcom/android/server/alarm/Alarm;->updateWhenElapsed()Z
 HSPLcom/android/server/alarm/AlarmManagerService$2;->doAlarm(Landroid/app/IAlarmCompleteListener;)V
 HPLcom/android/server/alarm/AlarmManagerService$2;->lambda$doAlarm$0(Landroid/app/IAlarmCompleteListener;)V
-HPLcom/android/server/alarm/AlarmManagerService$4;->canScheduleExactAlarms(Ljava/lang/String;)Z
+HPLcom/android/server/alarm/AlarmManagerService$4;->canScheduleExactAlarms(Ljava/lang/String;)Z+]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/alarm/AlarmManagerService$4;->remove(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)V+]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
-HSPLcom/android/server/alarm/AlarmManagerService$4;->set(Ljava/lang/String;IJJJILandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/SystemService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/alarm/AlarmManagerService$4;->set(Ljava/lang/String;IJJJILandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;)V+]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/SystemService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/alarm/AlarmManagerService$8$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/alarm/AlarmManagerService$8;I)V
 HSPLcom/android/server/alarm/AlarmManagerService$8$$ExternalSyntheticLambda1;->updateAlarmDelivery(Lcom/android/server/alarm/Alarm;)Z
 HSPLcom/android/server/alarm/AlarmManagerService$8;->$r8$lambda$HnHZA72qLxi-ubEMVN7MFMyc2DI(Lcom/android/server/alarm/AlarmManagerService$8;ILcom/android/server/alarm/Alarm;)Z
 HSPLcom/android/server/alarm/AlarmManagerService$8;->handleUidCachedChanged(IZ)V+]Landroid/os/Handler;Lcom/android/server/alarm/AlarmManagerService$AlarmHandler;
 HSPLcom/android/server/alarm/AlarmManagerService$8;->lambda$updateAlarmsForUid$1(ILcom/android/server/alarm/Alarm;)Z
-HSPLcom/android/server/alarm/AlarmManagerService$8;->unblockAlarmsForUid(I)V
-HSPLcom/android/server/alarm/AlarmManagerService$8;->updateAlarmsForUid(I)V
-HPLcom/android/server/alarm/AlarmManagerService$AlarmHandler;->handleMessage(Landroid/os/Message;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
+HSPLcom/android/server/alarm/AlarmManagerService$8;->unblockAlarmsForUid(I)V+]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
+HSPLcom/android/server/alarm/AlarmManagerService$8;->updateAlarmsForUid(I)V+]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
+HSPLcom/android/server/alarm/AlarmManagerService$AlarmHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
 HSPLcom/android/server/alarm/AlarmManagerService$AlarmThread;->run()V
-HPLcom/android/server/alarm/AlarmManagerService$AppStandbyTracker;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
-HPLcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;->getTotalWakeupsInWindow(Ljava/lang/String;I)I
-HPLcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;->recordAlarmForPackage(Ljava/lang/String;IJ)V
+HSPLcom/android/server/alarm/AlarmManagerService$AppStandbyTracker;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+HPLcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;->getTotalWakeupsInWindow(Ljava/lang/String;I)I+]Landroid/util/LongArrayQueue;Landroid/util/LongArrayQueue;
+HPLcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;->recordAlarmForPackage(Ljava/lang/String;IJ)V+]Landroid/util/LongArrayQueue;Landroid/util/LongArrayQueue;
 HSPLcom/android/server/alarm/AlarmManagerService$ClockReceiver;->scheduleTimeTickEvent()V
 HSPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->alarmComplete(Landroid/os/IBinder;)V
-HSPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->deliverLocked(Lcom/android/server/alarm/Alarm;J)V
+HSPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->deliverLocked(Lcom/android/server/alarm/Alarm;J)V+]Landroid/app/IAlarmListener;Landroid/app/IAlarmListener$Stub$Proxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;]Landroid/content/Intent;Landroid/content/Intent;
 HPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->onSendFinished(Landroid/app/PendingIntent;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;)V
-HPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->removeLocked(Landroid/app/PendingIntent;Landroid/content/Intent;)Lcom/android/server/alarm/AlarmManagerService$InFlight;
-HSPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->removeLocked(Landroid/os/IBinder;)Lcom/android/server/alarm/AlarmManagerService$InFlight;
-HSPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->updateStatsLocked(Lcom/android/server/alarm/AlarmManagerService$InFlight;)V
-HSPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->updateTrackingLocked(Lcom/android/server/alarm/AlarmManagerService$InFlight;)V
-HSPLcom/android/server/alarm/AlarmManagerService$InFlight;-><init>(Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/Alarm;J)V
+HPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->removeLocked(Landroid/app/PendingIntent;Landroid/content/Intent;)Lcom/android/server/alarm/AlarmManagerService$InFlight;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->removeLocked(Landroid/os/IBinder;)Lcom/android/server/alarm/AlarmManagerService$InFlight;+]Lcom/android/internal/util/LocalLog;Lcom/android/internal/util/LocalLog;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->updateStatsLocked(Lcom/android/server/alarm/AlarmManagerService$InFlight;)V+]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
+HSPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->updateTrackingLocked(Lcom/android/server/alarm/AlarmManagerService$InFlight;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
+HSPLcom/android/server/alarm/AlarmManagerService$InFlight;-><init>(Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/Alarm;J)V+]Landroid/app/IAlarmListener;Landroid/app/IAlarmListener$Stub$Proxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;
 HSPLcom/android/server/alarm/AlarmManagerService$Injector;->getCallingUid()I
 HSPLcom/android/server/alarm/AlarmManagerService$Injector;->getCurrentTimeMillis()J
 HSPLcom/android/server/alarm/AlarmManagerService$Injector;->getElapsedRealtimeMillis()J
 HSPLcom/android/server/alarm/AlarmManagerService$Injector;->isAlarmDriverPresent()Z
 HSPLcom/android/server/alarm/AlarmManagerService$Injector;->setAlarm(IJ)V
+HSPLcom/android/server/alarm/AlarmManagerService$Injector;->waitForAlarm()I
 HPLcom/android/server/alarm/AlarmManagerService$LocalService;->remove(Landroid/app/PendingIntent;)V
 HSPLcom/android/server/alarm/AlarmManagerService$LocalService;->shouldGetBucketElevation(Ljava/lang/String;I)Z+]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
 HSPLcom/android/server/alarm/AlarmManagerService$RemovedAlarm;-><init>(Lcom/android/server/alarm/Alarm;IJJ)V
@@ -695,28 +561,28 @@
 HSPLcom/android/server/alarm/AlarmManagerService;->addClampPositive(JJ)J
 HSPLcom/android/server/alarm/AlarmManagerService;->adjustDeliveryTimeBasedOnBatterySaver(Lcom/android/server/alarm/Alarm;)Z+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;
 HSPLcom/android/server/alarm/AlarmManagerService;->adjustDeliveryTimeBasedOnBucketLocked(Lcom/android/server/alarm/Alarm;)Z+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService$TemporaryQuotaReserve;Lcom/android/server/alarm/AlarmManagerService$TemporaryQuotaReserve;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;
-HPLcom/android/server/alarm/AlarmManagerService;->adjustDeliveryTimeBasedOnDeviceIdle(Lcom/android/server/alarm/Alarm;)Z+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;
+HPLcom/android/server/alarm/AlarmManagerService;->adjustDeliveryTimeBasedOnDeviceIdle(Lcom/android/server/alarm/Alarm;)Z+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;
 HSPLcom/android/server/alarm/AlarmManagerService;->adjustDeliveryTimeBasedOnTareLocked(Lcom/android/server/alarm/Alarm;)Z+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;
 HSPLcom/android/server/alarm/AlarmManagerService;->calculateDeliveryPriorities(Ljava/util/ArrayList;)V+]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/alarm/AlarmManagerService;->convertToElapsed(JI)J+]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;
-HSPLcom/android/server/alarm/AlarmManagerService;->decrementAlarmCount(II)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HSPLcom/android/server/alarm/AlarmManagerService;->deliverAlarmsLocked(Ljava/util/ArrayList;J)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
-HSPLcom/android/server/alarm/AlarmManagerService;->getAlarmAttributionUid(Lcom/android/server/alarm/Alarm;)I
+HSPLcom/android/server/alarm/AlarmManagerService;->decrementAlarmCount(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/alarm/AlarmManagerService;->deliverAlarmsLocked(Ljava/util/ArrayList;J)V+]Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
+HSPLcom/android/server/alarm/AlarmManagerService;->getAlarmAttributionUid(Lcom/android/server/alarm/Alarm;)I+]Landroid/os/WorkSource;Landroid/os/WorkSource;
 HSPLcom/android/server/alarm/AlarmManagerService;->getMinimumAllowedWindow(JJ)J
 HPLcom/android/server/alarm/AlarmManagerService;->getQuotaForBucketLocked(I)I
-HSPLcom/android/server/alarm/AlarmManagerService;->getStatsLocked(ILjava/lang/String;)Lcom/android/server/alarm/AlarmManagerService$BroadcastStats;
-HSPLcom/android/server/alarm/AlarmManagerService;->hasScheduleExactAlarmInternal(Ljava/lang/String;I)Z+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/SystemService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;
+HSPLcom/android/server/alarm/AlarmManagerService;->getStatsLocked(ILjava/lang/String;)Lcom/android/server/alarm/AlarmManagerService$BroadcastStats;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/alarm/AlarmManagerService;->hasScheduleExactAlarmInternal(Ljava/lang/String;I)Z+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/SystemService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
 HSPLcom/android/server/alarm/AlarmManagerService;->hasUseExactAlarmInternal(Ljava/lang/String;I)Z+]Lcom/android/server/SystemService;Lcom/android/server/alarm/AlarmManagerService;
 HSPLcom/android/server/alarm/AlarmManagerService;->increment(Landroid/util/SparseIntArray;I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HSPLcom/android/server/alarm/AlarmManagerService;->incrementAlarmCount(I)V
-HSPLcom/android/server/alarm/AlarmManagerService;->isBackgroundRestricted(Lcom/android/server/alarm/Alarm;)Z
+HSPLcom/android/server/alarm/AlarmManagerService;->isBackgroundRestricted(Lcom/android/server/alarm/Alarm;)Z+]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;
 HSPLcom/android/server/alarm/AlarmManagerService;->isExactAlarmChangeEnabled(Ljava/lang/String;I)Z
 HSPLcom/android/server/alarm/AlarmManagerService;->isExemptFromAppStandby(Lcom/android/server/alarm/Alarm;)Z
 HSPLcom/android/server/alarm/AlarmManagerService;->isExemptFromBatterySaver(Lcom/android/server/alarm/Alarm;)Z+]Landroid/app/PendingIntent;Landroid/app/PendingIntent;
 HSPLcom/android/server/alarm/AlarmManagerService;->isExemptFromExactAlarmPermissionNoLock(I)Z+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;
 HSPLcom/android/server/alarm/AlarmManagerService;->isRtc(I)Z
 HSPLcom/android/server/alarm/AlarmManagerService;->isUseExactAlarmEnabled(Ljava/lang/String;I)Z
-HPLcom/android/server/alarm/AlarmManagerService;->lambda$new$1(Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;)I
+HPLcom/android/server/alarm/AlarmManagerService;->lambda$new$1(Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;)I+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;
 HPLcom/android/server/alarm/AlarmManagerService;->lambda$removeExactListenerAlarms$8([ILcom/android/server/alarm/Alarm;)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/alarm/AlarmManagerService;->lambda$removeLocked$19(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;Lcom/android/server/alarm/Alarm;)Z+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;
 HSPLcom/android/server/alarm/AlarmManagerService;->lambda$reorderAlarmsBasedOnStandbyBuckets$5(Landroid/util/ArraySet;Lcom/android/server/alarm/Alarm;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
@@ -724,11 +590,13 @@
 HSPLcom/android/server/alarm/AlarmManagerService;->maxTriggerTime(JJJ)J
 HSPLcom/android/server/alarm/AlarmManagerService;->maybeUnregisterTareListenerLocked(Lcom/android/server/alarm/Alarm;)V
 HSPLcom/android/server/alarm/AlarmManagerService;->registerTareListener(Lcom/android/server/alarm/Alarm;)V
-HSPLcom/android/server/alarm/AlarmManagerService;->removeAlarmsInternalLocked(Ljava/util/function/Predicate;I)V+]Landroid/app/IAlarmListener;Landroid/app/IAlarmListener$Stub$Proxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/util/RingBuffer;Lcom/android/internal/util/RingBuffer;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/function/Predicate;Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda13;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda14;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda11;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda12;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda6;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda5;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda17;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda18;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda26;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda16;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HSPLcom/android/server/alarm/AlarmManagerService;->removeAlarmsInternalLocked(Ljava/util/function/Predicate;I)V+]Landroid/app/IAlarmListener;Landroid/app/IAlarmListener$Stub$Proxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/util/RingBuffer;Lcom/android/internal/util/RingBuffer;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/function/Predicate;Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda13;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda14;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda11;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda12;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda20;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda7;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda6;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda5;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda17;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda18;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda15;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda26;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda16;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HPLcom/android/server/alarm/AlarmManagerService;->removeExactListenerAlarms([I)V
 HSPLcom/android/server/alarm/AlarmManagerService;->removeLocked(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;I)V+]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
-HSPLcom/android/server/alarm/AlarmManagerService;->reorderAlarmsBasedOnStandbyBuckets(Landroid/util/ArraySet;)Z
+HSPLcom/android/server/alarm/AlarmManagerService;->reorderAlarmsBasedOnStandbyBuckets(Landroid/util/ArraySet;)Z+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;
 HSPLcom/android/server/alarm/AlarmManagerService;->reportAlarmEventToTare(Lcom/android/server/alarm/Alarm;)V
 HSPLcom/android/server/alarm/AlarmManagerService;->rescheduleKernelAlarmsLocked()V+]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
+HSPLcom/android/server/alarm/AlarmManagerService;->sendPendingBackgroundAlarmsLocked(ILjava/lang/String;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/alarm/AlarmManagerService;->setImpl(IJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;ILandroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;Landroid/os/Bundle;I)V+]Landroid/app/IAlarmListener;Landroid/app/IAlarmListener$Stub$Proxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/app/AlarmManager$ListenerWrapper;,Lcom/android/server/alarm/AlarmManagerService$2;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
 HSPLcom/android/server/alarm/AlarmManagerService;->setImplLocked(IJJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;ILandroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;Landroid/os/Bundle;I)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
 HSPLcom/android/server/alarm/AlarmManagerService;->setImplLocked(Lcom/android/server/alarm/Alarm;)V+]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;
@@ -737,138 +605,116 @@
 HSPLcom/android/server/alarm/AlarmManagerService;->triggerAlarmsLocked(Ljava/util/ArrayList;J)I+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;
 HSPLcom/android/server/alarm/AlarmManagerService;->updateNextAlarmClockLocked()V+]Ljava/lang/Object;Landroid/app/AlarmManager$AlarmClockInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/app/AlarmManager$AlarmClockInfo;Landroid/app/AlarmManager$AlarmClockInfo;
 HSPLcom/android/server/alarm/LazyAlarmStore$$ExternalSyntheticLambda0;->applyAsLong(Ljava/lang/Object;)J+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;
-HSPLcom/android/server/alarm/LazyAlarmStore;->add(Lcom/android/server/alarm/Alarm;)V
-HSPLcom/android/server/alarm/LazyAlarmStore;->addAll(Ljava/util/ArrayList;)V
+HSPLcom/android/server/alarm/LazyAlarmStore;->add(Lcom/android/server/alarm/Alarm;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/alarm/LazyAlarmStore;->addAll(Ljava/util/ArrayList;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/alarm/LazyAlarmStore;->getNextDeliveryTime()J+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/alarm/LazyAlarmStore;->getNextWakeupDeliveryTime()J+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/alarm/LazyAlarmStore;->remove(Ljava/util/function/Predicate;)Ljava/util/ArrayList;+]Ljava/util/function/Predicate;Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda13;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda14;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda11;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda12;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda6;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda5;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda17;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda18;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda16;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/Runnable;Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda3;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda2;
+HSPLcom/android/server/alarm/LazyAlarmStore;->remove(Ljava/util/function/Predicate;)Ljava/util/ArrayList;+]Ljava/util/function/Predicate;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/Runnable;Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda4;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda3;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda2;
 HSPLcom/android/server/alarm/LazyAlarmStore;->removePendingAlarms(J)Ljava/util/ArrayList;+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/LazyAlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/alarm/LazyAlarmStore;->size()I
+HSPLcom/android/server/alarm/LazyAlarmStore;->size()I+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/alarm/LazyAlarmStore;->updateAlarmDeliveries(Lcom/android/server/alarm/AlarmStore$AlarmDeliveryCalculator;)Z+]Lcom/android/server/alarm/AlarmStore$AlarmDeliveryCalculator;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/alarm/MetricsHelper;->pushAlarmScheduled(Lcom/android/server/alarm/Alarm;I)V
-HPLcom/android/server/am/ActiveServices$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/am/ActiveServices;ILandroid/util/ArraySet;)V
-HPLcom/android/server/am/ActiveServices$$ExternalSyntheticLambda5;-><init>(Lcom/android/server/am/ActiveServices;IZ)V
-HPLcom/android/server/am/ActiveServices$$ExternalSyntheticLambda6;-><init>(I)V
+HSPLcom/android/server/am/ActiveServices$$ExternalSyntheticLambda6;-><init>(I)V
 HSPLcom/android/server/am/ActiveServices$$ExternalSyntheticLambda8;-><init>(Lcom/android/server/am/ActiveServices;ILandroid/util/ArraySet;)V
 HSPLcom/android/server/am/ActiveServices$$ExternalSyntheticLambda8;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/server/am/ActiveServices$1;-><init>(Lcom/android/server/am/ActiveServices;)V
-HSPLcom/android/server/am/ActiveServices$5;-><init>(Lcom/android/server/am/ActiveServices;)V
-HSPLcom/android/server/am/ActiveServices$ProcessAnrTimer;-><init>(Lcom/android/server/am/ActivityManagerService;ILjava/lang/String;)V
-HSPLcom/android/server/am/ActiveServices$ProcessAnrTimer;->start(Lcom/android/server/am/ProcessRecord;J)V
-HSPLcom/android/server/am/ActiveServices$ServiceAnrTimer;-><init>(Lcom/android/server/am/ActivityManagerService;ILjava/lang/String;)V
+HSPLcom/android/server/am/ActiveServices$ProcessAnrTimer;->start(Lcom/android/server/am/ProcessRecord;J)V+]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/ActiveServices$ProcessAnrTimer;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ActiveServices$ServiceLookupResult;-><init>(Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ServiceRecord;Landroid/content/ComponentName;)V
 HSPLcom/android/server/am/ActiveServices$ServiceMap;->ensureNotStartingBackgroundLocked(Lcom/android/server/am/ServiceRecord;)V+]Landroid/os/Handler;Lcom/android/server/am/ActiveServices$ServiceMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/am/ActiveServices$ServiceMap;->rescheduleDelayedStartsLocked()V
+HSPLcom/android/server/am/ActiveServices$ServiceMap;->rescheduleDelayedStartsLocked()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActiveServices$ServiceRestarter;-><init>(Lcom/android/server/am/ActiveServices;)V
 HSPLcom/android/server/am/ActiveServices$ServiceRestarter;-><init>(Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices$ServiceRestarter-IA;)V
 HSPLcom/android/server/am/ActiveServices$ServiceRestarter;->setService(Lcom/android/server/am/ServiceRecord;)V
 HSPLcom/android/server/am/ActiveServices;->$r8$lambda$dtupl9fjxv8RDOZGvTs4p44nKJI(Lcom/android/server/am/ActiveServices;ILandroid/util/ArraySet;Lcom/android/server/am/ProcessRecord;)Ljava/lang/Integer;
-HSPLcom/android/server/am/ActiveServices;-><clinit>()V
 HSPLcom/android/server/am/ActiveServices;-><init>(Lcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/ActiveServices;->appRestrictedAnyInBackground(ILjava/lang/String;)Z
+HSPLcom/android/server/am/ActiveServices;->appRestrictedAnyInBackground(ILjava/lang/String;)Z+]Lcom/android/server/AppStateTracker;Lcom/android/server/AppStateTrackerImpl;
 HPLcom/android/server/am/ActiveServices;->applyForegroundServiceNotificationLocked(Landroid/app/Notification;Ljava/lang/String;ILjava/lang/String;I)Landroid/app/ActivityManagerInternal$ServiceNotificationPolicy;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
-HSPLcom/android/server/am/ActiveServices;->attachApplicationLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;)Z
-HSPLcom/android/server/am/ActiveServices;->bindServiceLocked(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;JLjava/lang/String;ZILjava/lang/String;Landroid/app/IApplicationThread;Ljava/lang/String;I)I+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ActiveServices$ServiceMap;Lcom/android/server/am/ActiveServices$ServiceMap;]Landroid/app/IServiceConnection;Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;,Landroid/app/IServiceConnection$Stub$Proxy;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/ActivityServiceConnectionsHolder;Lcom/android/server/wm/ActivityServiceConnectionsHolder;]Landroid/content/Intent;Landroid/content/Intent;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HPLcom/android/server/am/ActiveServices;->bringDownServiceIfNeededLocked(Lcom/android/server/am/ServiceRecord;ZZZLjava/lang/String;)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/am/ActiveServices;->bringDownServiceLocked(Lcom/android/server/am/ServiceRecord;Z)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/ForegroundServiceTypeLoggerModule;Lcom/android/server/am/ForegroundServiceTypeLoggerModule;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ActiveServices$ServiceRestarter;Lcom/android/server/am/ActiveServices$ServiceRestarter;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Landroid/app/IServiceConnection;Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;,Landroid/app/IServiceConnection$Stub$Proxy;]Lcom/android/server/am/ActiveServices$ServiceMap;Lcom/android/server/am/ActiveServices$ServiceMap;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/am/ActiveServices;->attachApplicationLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActiveServices;->bindServiceLocked(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;JLjava/lang/String;ZILjava/lang/String;Landroid/app/IApplicationThread;Ljava/lang/String;I)I+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ActiveServices$ServiceMap;Lcom/android/server/am/ActiveServices$ServiceMap;]Landroid/app/IServiceConnection;Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;,Landroid/app/IServiceConnection$Stub$Proxy;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/ActivityServiceConnectionsHolder;Lcom/android/server/wm/ActivityServiceConnectionsHolder;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/am/ActiveServices;->bringDownServiceIfNeededLocked(Lcom/android/server/am/ServiceRecord;ZZZLjava/lang/String;)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/ActiveServices;->bringDownServiceLocked(Lcom/android/server/am/ServiceRecord;Z)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/ForegroundServiceTypeLoggerModule;Lcom/android/server/am/ForegroundServiceTypeLoggerModule;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ActiveServices$ServiceRestarter;Lcom/android/server/am/ActiveServices$ServiceRestarter;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Landroid/app/IServiceConnection;Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;,Landroid/app/IServiceConnection$Stub$Proxy;]Lcom/android/server/am/ActiveServices$ServiceMap;Lcom/android/server/am/ActiveServices$ServiceMap;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;
 HSPLcom/android/server/am/ActiveServices;->bringUpServiceInnerLocked(Lcom/android/server/am/ServiceRecord;IZZZZZI)Ljava/lang/String;+]Lcom/android/server/am/AppStartInfoTracker;Lcom/android/server/am/AppStartInfoTracker;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;
 HSPLcom/android/server/am/ActiveServices;->bringUpServiceLocked(Lcom/android/server/am/ServiceRecord;IZZZZZI)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
-HSPLcom/android/server/am/ActiveServices;->bumpServiceExecutingLocked(Lcom/android/server/am/ServiceRecord;ZLjava/lang/String;IZ)V+]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActiveServices;->bumpServiceExecutingLocked(Lcom/android/server/am/ServiceRecord;ZLjava/lang/String;IZ)V+]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HPLcom/android/server/am/ActiveServices;->canBindingClientStartFgsLocked(I)Ljava/lang/String;
-HPLcom/android/server/am/ActiveServices;->cancelForegroundNotificationLocked(Lcom/android/server/am/ServiceRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
+HSPLcom/android/server/am/ActiveServices;->cancelForegroundNotificationLocked(Lcom/android/server/am/ServiceRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/am/ActiveServices;->deferServiceBringupIfFrozenLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;IZZILandroid/app/BackgroundStartPrivileges;ZLandroid/app/IServiceConnection;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HPLcom/android/server/am/ActiveServices;->dropFgsNotificationStateLocked(Lcom/android/server/am/ServiceRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/lang/Object;Ljava/lang/String;
-HPLcom/android/server/am/ActiveServices;->findServiceLocked(Landroid/content/ComponentName;Landroid/os/IBinder;I)Lcom/android/server/am/ServiceRecord;
+HSPLcom/android/server/am/ActiveServices;->dropFgsNotificationStateLocked(Lcom/android/server/am/ServiceRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/lang/Object;Ljava/lang/String;
+HSPLcom/android/server/am/ActiveServices;->findServiceLocked(Landroid/content/ComponentName;Landroid/os/IBinder;I)Lcom/android/server/am/ServiceRecord;
 HSPLcom/android/server/am/ActiveServices;->generateAdditionalSeInfoFromService(Landroid/content/Intent;)Ljava/lang/String;+]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/ActiveServices;->getAllowMode(Landroid/content/Intent;Ljava/lang/String;)I+]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/ActiveServices;->getAppStateTracker()Lcom/android/server/AppStateTracker;
 HSPLcom/android/server/am/ActiveServices;->getHostingRecordTriggerType(Lcom/android/server/am/ServiceRecord;)Ljava/lang/String;+]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/am/ActiveServices;->getProcessNameForService(Landroid/content/pm/ServiceInfo;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ZZZ)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HPLcom/android/server/am/ActiveServices;->getRunningServiceInfoLocked(IIIZZ)Ljava/util/List;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/am/ActiveServices;->getRunningServiceInfoLocked(IIIZZ)Ljava/util/List;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;
 HSPLcom/android/server/am/ActiveServices;->getServiceBindingOomAdjPolicyForAddLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ConnectionRecord;)I
 HPLcom/android/server/am/ActiveServices;->getServiceBindingOomAdjPolicyForRemovalLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ConnectionRecord;)I
-HPLcom/android/server/am/ActiveServices;->getServiceByNameLocked(Landroid/content/ComponentName;I)Lcom/android/server/am/ServiceRecord;
-HSPLcom/android/server/am/ActiveServices;->getServiceMapLocked(I)Lcom/android/server/am/ActiveServices$ServiceMap;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;
+HSPLcom/android/server/am/ActiveServices;->getServiceByNameLocked(Landroid/content/ComponentName;I)Lcom/android/server/am/ServiceRecord;
+HSPLcom/android/server/am/ActiveServices;->getServiceMapLocked(I)Lcom/android/server/am/ActiveServices$ServiceMap;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/am/ActiveServices;->getShortProcessNameForStats(ILjava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
 HSPLcom/android/server/am/ActiveServices;->getShortServiceNameForStats(Lcom/android/server/am/ServiceRecord;)Ljava/lang/String;+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HSPLcom/android/server/am/ActiveServices;->hasForegroundServiceNotificationLocked(Ljava/lang/String;ILjava/lang/String;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/app/Notification;Landroid/app/Notification;
 HSPLcom/android/server/am/ActiveServices;->isServiceNeededLocked(Lcom/android/server/am/ServiceRecord;ZZ)Z+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;
-HSPLcom/android/server/am/ActiveServices;->killServicesLocked(Lcom/android/server/am/ProcessRecord;Z)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/am/ActiveServices;->lambda$canBindingClientStartFgsLocked$6(ILandroid/util/ArraySet;Lcom/android/server/am/ProcessRecord;)Landroid/util/Pair;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
-HPLcom/android/server/am/ActiveServices;->lambda$shouldAllowFgsStartForegroundNoBindingCheckLocked$7(IZLcom/android/server/am/ProcessRecord;)Ljava/lang/Integer;+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ActiveServices;->killServicesLocked(Lcom/android/server/am/ProcessRecord;Z)V+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;
+HPLcom/android/server/am/ActiveServices;->lambda$canBindingClientStartFgsLocked$6(ILandroid/util/ArraySet;Lcom/android/server/am/ProcessRecord;)Landroid/util/Pair;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/ActiveServices;->lambda$shouldAllowFgsStartForegroundNoBindingCheckLocked$7(IZLcom/android/server/am/ProcessRecord;)Ljava/lang/Integer;+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ActiveServices;->lambda$shouldAllowFgsWhileInUsePermissionByBindingsLocked$5(ILandroid/util/ArraySet;Lcom/android/server/am/ProcessRecord;)Ljava/lang/Integer;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;
 HPLcom/android/server/am/ActiveServices;->logFGSStateChangeLocked(Lcom/android/server/am/ServiceRecord;IIIIIZ)V
 HPLcom/android/server/am/ActiveServices;->makeRunningServiceInfoLocked(Lcom/android/server/am/ServiceRecord;)Landroid/app/ActivityManager$RunningServiceInfo;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ActiveServices;->maybeLogBindCrossProfileService(ILjava/lang/String;I)V+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Landroid/app/admin/DevicePolicyEventLogger;Landroid/app/admin/DevicePolicyEventLogger;
-HPLcom/android/server/am/ActiveServices;->maybeStopFgsTimeoutLocked(Lcom/android/server/am/ServiceRecord;)V+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/ActiveServices$ServiceAnrTimer;
-HPLcom/android/server/am/ActiveServices;->maybeStopShortFgsTimeoutLocked(Lcom/android/server/am/ServiceRecord;)V+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
+HSPLcom/android/server/am/ActiveServices;->maybeStopFgsTimeoutLocked(Lcom/android/server/am/ServiceRecord;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/ActiveServices$ServiceAnrTimer;
+HSPLcom/android/server/am/ActiveServices;->maybeStopShortFgsTimeoutLocked(Lcom/android/server/am/ServiceRecord;)V+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
 HSPLcom/android/server/am/ActiveServices;->notifyBindingServiceEventLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/os/Message;Landroid/os/Message;
 HPLcom/android/server/am/ActiveServices;->onForegroundServiceNotificationUpdateLocked(ZLandroid/app/Notification;ILjava/lang/String;I)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/am/ActiveServices;->performScheduleRestartLocked(Lcom/android/server/am/ServiceRecord;Ljava/lang/String;Ljava/lang/String;J)V
 HSPLcom/android/server/am/ActiveServices;->publishServiceLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Landroid/os/IBinder;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/IServiceConnection;Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;,Landroid/app/IServiceConnection$Stub$Proxy;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/am/ActiveServices;->realStartServiceLocked(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ProcessRecord;Landroid/app/IApplicationThread;ILcom/android/server/am/UidRecord;ZZI)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HPLcom/android/server/am/ActiveServices;->removeConnectionLocked(Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/wm/ActivityServiceConnectionsHolder;Z)I+]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/app/IServiceConnection;Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;,Landroid/app/IServiceConnection$Stub$Proxy;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/ActivityServiceConnectionsHolder;Lcom/android/server/wm/ActivityServiceConnectionsHolder;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
+HPLcom/android/server/am/ActiveServices;->removeConnectionLocked(Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/wm/ActivityServiceConnectionsHolder;Z)I+]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Landroid/app/IServiceConnection;Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;,Landroid/app/IServiceConnection$Stub$Proxy;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/ActivityServiceConnectionsHolder;Lcom/android/server/wm/ActivityServiceConnectionsHolder;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
 HSPLcom/android/server/am/ActiveServices;->requestServiceBindingLocked(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/IntentBindRecord;ZZI)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ActiveServices;->requestServiceBindingsLocked(Lcom/android/server/am/ServiceRecord;ZI)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
 HSPLcom/android/server/am/ActiveServices;->requestStartTargetPermissionsReviewIfNeededLocked(Lcom/android/server/am/ServiceRecord;Ljava/lang/String;Ljava/lang/String;ILandroid/content/Intent;ZIZLandroid/app/IServiceConnection;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HPLcom/android/server/am/ActiveServices;->resetFgsRestrictionLocked(Lcom/android/server/am/ServiceRecord;)V+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;
+HSPLcom/android/server/am/ActiveServices;->resetFgsRestrictionLocked(Lcom/android/server/am/ServiceRecord;)V+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;
 HSPLcom/android/server/am/ActiveServices;->retrieveServiceLocked(Landroid/content/Intent;Ljava/lang/String;ZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZZZZLandroid/app/ForegroundServiceDelegationOptions;ZZ)Lcom/android/server/am/ActiveServices$ServiceLookupResult;+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
 HSPLcom/android/server/am/ActiveServices;->retrieveServiceLocked(Landroid/content/Intent;Ljava/lang/String;ZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZZZZLandroid/app/ForegroundServiceDelegationOptions;ZZZ)Lcom/android/server/am/ActiveServices$ServiceLookupResult;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/am/ActiveServices$ServiceRestarter;Lcom/android/server/am/ActiveServices$ServiceRestarter;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;
-HPLcom/android/server/am/ActiveServices;->scheduleServiceRestartLocked(Lcom/android/server/am/ServiceRecord;Z)Z
+HPLcom/android/server/am/ActiveServices;->scheduleServiceRestartLocked(Lcom/android/server/am/ServiceRecord;Z)Z+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ServiceRecord$StartItem;Lcom/android/server/am/ServiceRecord$StartItem;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ActiveServices;->scheduleServiceTimeoutLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ActiveServices$ProcessAnrTimer;Lcom/android/server/am/ActiveServices$ProcessAnrTimer;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ActiveServices;->sendServiceArgsLocked(Lcom/android/server/am/ServiceRecord;ZZ)V+]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ServiceRecord$StartItem;Lcom/android/server/am/ServiceRecord$StartItem;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ActiveServices;->serviceDoneExecutingLocked(Lcom/android/server/am/ServiceRecord;IIIZLandroid/content/Intent;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/am/ActiveServices;->serviceDoneExecutingLocked(Lcom/android/server/am/ServiceRecord;IIIZLandroid/content/Intent;)V+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/am/ActiveServices;->serviceDoneExecutingLocked(Lcom/android/server/am/ServiceRecord;ZZZI)V+]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/ActiveServices$ProcessAnrTimer;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActiveServices;->setFgsRestrictionLocked(Ljava/lang/String;IILandroid/content/Intent;Lcom/android/server/am/ServiceRecord;ILandroid/app/BackgroundStartPrivileges;Z)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
 HSPLcom/android/server/am/ActiveServices;->setFgsRestrictionLocked(Ljava/lang/String;IILandroid/content/Intent;Lcom/android/server/am/ServiceRecord;ILandroid/app/BackgroundStartPrivileges;ZZ)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
 HPLcom/android/server/am/ActiveServices;->setServiceForegroundInnerLocked(Lcom/android/server/am/ServiceRecord;ILandroid/app/Notification;III)V
-HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsStartForegroundNoBindingCheckLocked(IIILjava/lang/String;Lcom/android/server/am/ServiceRecord;Landroid/app/BackgroundStartPrivileges;)I+]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
 HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsStartForegroundWithBindingCheckLocked(ILjava/lang/String;IILandroid/content/Intent;Lcom/android/server/am/ServiceRecord;Landroid/app/BackgroundStartPrivileges;Z)I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsWhileInUsePermissionByBindingsLocked(I)I
-HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsWhileInUsePermissionLocked(Ljava/lang/String;IILcom/android/server/am/ProcessRecord;Landroid/app/BackgroundStartPrivileges;)I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HPLcom/android/server/am/ActiveServices;->shouldShowFgsNotificationLocked(Lcom/android/server/am/ServiceRecord;)Z
+HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsWhileInUsePermissionLocked(Ljava/lang/String;IILcom/android/server/am/ProcessRecord;Landroid/app/BackgroundStartPrivileges;)I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActiveServices;->startServiceInnerLocked(Lcom/android/server/am/ActiveServices$ServiceMap;Landroid/content/Intent;Lcom/android/server/am/ServiceRecord;ZZILjava/lang/String;IZLjava/lang/String;)Landroid/content/ComponentName;+]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ActiveServices$ServiceMap;Lcom/android/server/am/ActiveServices$ServiceMap;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/ActiveServices;->startServiceInnerLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;IILjava/lang/String;IZZLandroid/app/BackgroundStartPrivileges;Ljava/lang/String;)Landroid/content/ComponentName;+]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
-HSPLcom/android/server/am/ActiveServices;->startServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IIZLjava/lang/String;Ljava/lang/String;ILandroid/app/BackgroundStartPrivileges;ZILjava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
+HSPLcom/android/server/am/ActiveServices;->startServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IIZLjava/lang/String;Ljava/lang/String;ILandroid/app/BackgroundStartPrivileges;ZILjava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
 HSPLcom/android/server/am/ActiveServices;->startServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IIZLjava/lang/String;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
 HPLcom/android/server/am/ActiveServices;->stopInBackgroundLocked(I)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ActiveServices$ServiceMap;Lcom/android/server/am/ActiveServices$ServiceMap;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/am/ActiveServices;->stopServiceAndUpdateAllowlistManagerLocked(Lcom/android/server/am/ServiceRecord;)V+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
-HPLcom/android/server/am/ActiveServices;->stopServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)I
+HSPLcom/android/server/am/ActiveServices;->stopServiceAndUpdateAllowlistManagerLocked(Lcom/android/server/am/ServiceRecord;)V+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
+HPLcom/android/server/am/ActiveServices;->stopServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HPLcom/android/server/am/ActiveServices;->stopServiceLocked(Lcom/android/server/am/ServiceRecord;Z)V
-HPLcom/android/server/am/ActiveServices;->stopServiceTokenLocked(Landroid/content/ComponentName;Landroid/os/IBinder;I)Z
+HSPLcom/android/server/am/ActiveServices;->stopServiceTokenLocked(Landroid/content/ComponentName;Landroid/os/IBinder;I)Z+]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ServiceRecord$StartItem;Lcom/android/server/am/ServiceRecord$StartItem;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ActiveServices;->traceInstant(Ljava/lang/String;Lcom/android/server/am/ServiceRecord;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HPLcom/android/server/am/ActiveServices;->unbindFinishedLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Z)V
-HSPLcom/android/server/am/ActiveServices;->unbindServiceLocked(Landroid/app/IServiceConnection;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Landroid/app/IServiceConnection;Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;,Landroid/app/IServiceConnection$Stub$Proxy;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActiveServices;->unbindServiceLocked(Landroid/app/IServiceConnection;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Landroid/app/IServiceConnection;Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;,Landroid/app/IServiceConnection$Stub$Proxy;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;
 HSPLcom/android/server/am/ActiveServices;->unscheduleServiceRestartLocked(Lcom/android/server/am/ServiceRecord;IZ)Z+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/am/ActiveServices;->updateNumForegroundServicesLocked()V+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference;
+HSPLcom/android/server/am/ActiveServices;->updateNumForegroundServicesLocked()V+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference;
 HSPLcom/android/server/am/ActiveServices;->updateServiceClientActivitiesLocked(Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ConnectionRecord;Z)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActiveServices;->updateServiceConnectionActivitiesLocked(Lcom/android/server/am/ProcessServiceRecord;)V+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
 HSPLcom/android/server/am/ActiveServices;->updateServiceForegroundLocked(Lcom/android/server/am/ProcessServiceRecord;Z)V+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HPLcom/android/server/am/ActiveServices;->verifyPackage(Ljava/lang/String;I)Z
-HSPLcom/android/server/am/ActiveUids;-><init>(Lcom/android/server/am/ActivityManagerService;Z)V
-HSPLcom/android/server/am/ActiveUids;->clear()V
+HSPLcom/android/server/am/ActiveServices;->verifyPackage(Ljava/lang/String;I)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/am/ActiveUids;->clear()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/am/ActiveUids;->get(I)Lcom/android/server/am/UidRecord;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/am/ActiveUids;->put(ILcom/android/server/am/UidRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;
-HSPLcom/android/server/am/ActiveUids;->remove(I)V
+HSPLcom/android/server/am/ActiveUids;->remove(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;
 HSPLcom/android/server/am/ActiveUids;->size()I+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/am/ActiveUids;->valueAt(I)Lcom/android/server/am/UidRecord;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/am/ActivityManagerConstants$1;-><init>(Lcom/android/server/am/ActivityManagerConstants;)V
-HSPLcom/android/server/am/ActivityManagerConstants$2;-><init>(Lcom/android/server/am/ActivityManagerConstants;)V
-HSPLcom/android/server/am/ActivityManagerConstants;-><clinit>()V
 HSPLcom/android/server/am/ActivityManagerConstants;-><init>(Landroid/content/Context;Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;)V
-HSPLcom/android/server/am/ActivityManagerConstants;->computeEmptyProcessLimit(I)I
-HSPLcom/android/server/am/ActivityManagerConstants;->loadNativeBootDeviceConfigConstants()V
-HSPLcom/android/server/am/ActivityManagerProcLock;-><init>()V
 HPLcom/android/server/am/ActivityManagerService$$ExternalSyntheticLambda0;-><init>([ILjava/lang/String;)V
-HPLcom/android/server/am/ActivityManagerService$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V
-HPLcom/android/server/am/ActivityManagerService$$ExternalSyntheticLambda28;-><init>(Lcom/android/server/am/ActivityManagerService;JZLcom/android/server/am/ProcessRecord;IJ)V
-HPLcom/android/server/am/ActivityManagerService$$ExternalSyntheticLambda8;-><init>(ZIZI[Ljava/util/List;)V
 HSPLcom/android/server/am/ActivityManagerService$15;-><init>(Lcom/android/server/am/ActivityManagerService;IILandroid/os/IBinder;Ljava/lang/String;Landroid/app/ApplicationErrorReport$ParcelableCrashInfo;)V
 HSPLcom/android/server/am/ActivityManagerService$15;->run()V
 HSPLcom/android/server/am/ActivityManagerService$16;->run()V
-HSPLcom/android/server/am/ActivityManagerService$1;-><init>(Lcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/ActivityManagerService$2;-><init>(Lcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/ActivityManagerService$3;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/ActivityManagerService$3;->allowFilterResult(Lcom/android/server/am/BroadcastFilter;Ljava/util/List;)Z+]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ActivityManagerService$3;->allowFilterResult(Ljava/lang/Object;Ljava/util/List;)Z+]Lcom/android/server/am/ActivityManagerService$3;Lcom/android/server/am/ActivityManagerService$3;
 HSPLcom/android/server/am/ActivityManagerService$3;->getIntentFilter(Lcom/android/server/am/BroadcastFilter;)Landroid/content/IntentFilter;
@@ -876,42 +722,25 @@
 HSPLcom/android/server/am/ActivityManagerService$3;->isPackageForFilter(Ljava/lang/String;Lcom/android/server/am/BroadcastFilter;)Z+]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/am/ActivityManagerService$3;->isPackageForFilter(Ljava/lang/String;Ljava/lang/Object;)Z+]Lcom/android/server/am/ActivityManagerService$3;Lcom/android/server/am/ActivityManagerService$3;
 HSPLcom/android/server/am/ActivityManagerService$3;->newArray(I)[Lcom/android/server/am/BroadcastFilter;
-HSPLcom/android/server/am/ActivityManagerService$3;->newArray(I)[Ljava/lang/Object;
+HSPLcom/android/server/am/ActivityManagerService$3;->newArray(I)[Ljava/lang/Object;+]Lcom/android/server/am/ActivityManagerService$3;Lcom/android/server/am/ActivityManagerService$3;
 HSPLcom/android/server/am/ActivityManagerService$3;->newResult(Lcom/android/server/pm/Computer;Lcom/android/server/am/BroadcastFilter;IIJ)Lcom/android/server/am/BroadcastFilter;
 HSPLcom/android/server/am/ActivityManagerService$3;->newResult(Lcom/android/server/pm/Computer;Ljava/lang/Object;IIJ)Ljava/lang/Object;+]Lcom/android/server/am/ActivityManagerService$3;Lcom/android/server/am/ActivityManagerService$3;
 HSPLcom/android/server/am/ActivityManagerService$AppDeathRecipient;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;ILandroid/app/IApplicationThread;)V
 HSPLcom/android/server/am/ActivityManagerService$AppDeathRecipient;->binderDied()V
 HSPLcom/android/server/am/ActivityManagerService$FgsTempAllowListItem;-><init>(JILjava/lang/String;I)V
-HSPLcom/android/server/am/ActivityManagerService$GetBackgroundStartPrivilegesFunctor;-><init>()V
-HSPLcom/android/server/am/ActivityManagerService$GetBackgroundStartPrivilegesFunctor;-><init>(Lcom/android/server/am/ActivityManagerService$GetBackgroundStartPrivilegesFunctor-IA;)V
-HSPLcom/android/server/am/ActivityManagerService$HiddenApiSettings;-><init>(Landroid/os/Handler;Landroid/content/Context;)V
-HSPLcom/android/server/am/ActivityManagerService$Injector;->-$$Nest$fputmUserController(Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/UserController;)V
-HSPLcom/android/server/am/ActivityManagerService$Injector;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/am/ActivityManagerService$Injector;->clearCallingIdentity()J
 HSPLcom/android/server/am/ActivityManagerService$Injector;->ensureHasNetworkManagementInternal()Z
-HSPLcom/android/server/am/ActivityManagerService$Injector;->getAppOpsService(Ljava/io/File;Ljava/io/File;Landroid/os/Handler;)Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/am/ActivityManagerService$Injector;->getCallingPid()I
 HSPLcom/android/server/am/ActivityManagerService$Injector;->getCallingUid()I
-HSPLcom/android/server/am/ActivityManagerService$Injector;->getContext()Landroid/content/Context;
-HSPLcom/android/server/am/ActivityManagerService$Injector;->getProcessList(Lcom/android/server/am/ActivityManagerService;)Lcom/android/server/am/ProcessList;
-HSPLcom/android/server/am/ActivityManagerService$Injector;->getUiHandler(Lcom/android/server/am/ActivityManagerService;)Landroid/os/Handler;
 HSPLcom/android/server/am/ActivityManagerService$Injector;->isNetworkRestrictedForUid(I)Z+]Lcom/android/server/net/NetworkManagementInternal;Lcom/android/server/net/NetworkManagementService$LocalService;
 HSPLcom/android/server/am/ActivityManagerService$Injector;->restoreCallingIdentity(J)V
-HSPLcom/android/server/am/ActivityManagerService$IntentFirewallInterface;-><init>(Lcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/ActivityManagerService$IntentFirewallInterface;->getAMSLock()Ljava/lang/Object;
-HSPLcom/android/server/am/ActivityManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/am/ActivityManagerService$Lifecycle;->getService()Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ActivityManagerService$Lifecycle;->onBootPhase(I)V
-HSPLcom/android/server/am/ActivityManagerService$Lifecycle;->onStart()V
-HSPLcom/android/server/am/ActivityManagerService$Lifecycle;->startService(Lcom/android/server/SystemServiceManager;Lcom/android/server/wm/ActivityTaskManagerService;)Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ActivityManagerService$LocalService;-><init>(Lcom/android/server/am/ActivityManagerService;)V
-HPLcom/android/server/am/ActivityManagerService$LocalService;->addPendingTopUid(IILandroid/app/IApplicationThread;)V
+HSPLcom/android/server/am/ActivityManagerService$LocalService;->addPendingTopUid(IILandroid/app/IApplicationThread;)V+]Landroid/app/IUidObserver;Lcom/android/server/net/NetworkPolicyManagerService$4;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
 HPLcom/android/server/am/ActivityManagerService$LocalService;->applyForegroundServiceNotification(Landroid/app/Notification;Ljava/lang/String;ILjava/lang/String;I)Landroid/app/ActivityManagerInternal$ServiceNotificationPolicy;
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->broadcastIntent(Landroid/content/Intent;Landroid/content/IIntentReceiver;[Ljava/lang/String;ZI[ILjava/util/function/BiFunction;Landroid/os/Bundle;)I
-HPLcom/android/server/am/ActivityManagerService$LocalService;->broadcastIntentInPackage(Ljava/lang/String;Ljava/lang/String;IIILandroid/content/Intent;Ljava/lang/String;Landroid/app/IApplicationThread;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;Ljava/lang/String;Landroid/os/Bundle;ZZILandroid/app/BackgroundStartPrivileges;[I)I
+HPLcom/android/server/am/ActivityManagerService$LocalService;->broadcastIntentInPackage(Ljava/lang/String;Ljava/lang/String;IIILandroid/content/Intent;Ljava/lang/String;Landroid/app/IApplicationThread;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;Ljava/lang/String;Landroid/os/Bundle;ZZILandroid/app/BackgroundStartPrivileges;[I)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->deletePendingTopUid(IJ)V
-HSPLcom/android/server/am/ActivityManagerService$LocalService;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V
+HSPLcom/android/server/am/ActivityManagerService$LocalService;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->getCurrentUserId()I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;
 HPLcom/android/server/am/ActivityManagerService$LocalService;->getMemoryStateForProcesses()Ljava/util/List;+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
 HPLcom/android/server/am/ActivityManagerService$LocalService;->getPackageNameByPid(I)Ljava/lang/String;
@@ -920,14 +749,14 @@
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->handleIncomingUser(IIIZILjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isAppBad(Ljava/lang/String;I)Z
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isAppStartModeDisabled(ILjava/lang/String;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HPLcom/android/server/am/ActivityManagerService$LocalService;->isAssociatedCompanionApp(II)Z+]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Landroid/util/ArraySet;
+HSPLcom/android/server/am/ActivityManagerService$LocalService;->isAssociatedCompanionApp(II)Z+]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Landroid/util/ArraySet;
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isBgAutoRestrictedBucketFeatureFlagEnabled()Z+]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isDeviceOwner(I)Z
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isPendingTopUid(I)Z+]Lcom/android/server/am/PendingStartActivityUids;Lcom/android/server/am/PendingStartActivityUids;
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isProfileOwner(I)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HPLcom/android/server/am/ActivityManagerService$LocalService;->isTempAllowlistedForFgsWhileInUse(I)Z+]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList;
+HSPLcom/android/server/am/ActivityManagerService$LocalService;->isTempAllowlistedForFgsWhileInUse(I)Z+]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList;
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->isUidActive(I)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ActivityManagerService$LocalService;->noteAlarmFinish(Landroid/app/PendingIntent;Landroid/os/WorkSource;ILjava/lang/String;)V
+HSPLcom/android/server/am/ActivityManagerService$LocalService;->noteAlarmFinish(Landroid/app/PendingIntent;Landroid/os/WorkSource;ILjava/lang/String;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->notifyNetworkPolicyRulesUpdated(IJ)V+]Ljava/lang/Object;Ljava/lang/Object;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
 HSPLcom/android/server/am/ActivityManagerService$LocalService;->onUidBlockedReasonsChanged(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HPLcom/android/server/am/ActivityManagerService$LocalService;->setPendingIntentAllowBgActivityStarts(Landroid/content/IIntentSender;Landroid/os/IBinder;I)V+]Lcom/android/server/am/PendingIntentRecord;Lcom/android/server/am/PendingIntentRecord;
@@ -940,39 +769,32 @@
 HSPLcom/android/server/am/ActivityManagerService$MainHandler$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/am/ActivityManagerService$MainHandler;->$r8$lambda$-BaOH0nhWmB1j4fAdRCLVwJvRCA(Landroid/os/Message;Landroid/app/ActivityManagerInternal$BindServiceEventListener;)V
 HSPLcom/android/server/am/ActivityManagerService$MainHandler;->$r8$lambda$bz9CTa7TXqawLiiOdBfpNP_dnbI(Landroid/os/Message;Landroid/app/ActivityManagerInternal$BroadcastEventListener;)V
-HSPLcom/android/server/am/ActivityManagerService$MainHandler;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;)V
-HSPLcom/android/server/am/ActivityManagerService$MainHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Long;Ljava/lang/Long;]Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Ljava/lang/Thread;Lcom/android/server/am/ActivityManagerService$MainHandler$1;
+HSPLcom/android/server/am/ActivityManagerService$MainHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Long;Ljava/lang/Long;]Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Ljava/lang/Thread;Lcom/android/server/am/ActivityManagerService$MainHandler$1;
 HSPLcom/android/server/am/ActivityManagerService$MainHandler;->lambda$handleMessage$1(Landroid/os/Message;Landroid/app/ActivityManagerInternal$BroadcastEventListener;)V+]Landroid/app/ActivityManagerInternal$BroadcastEventListener;Lcom/android/server/am/AppBroadcastEventsTracker;
 HSPLcom/android/server/am/ActivityManagerService$MainHandler;->lambda$handleMessage$2(Landroid/os/Message;Landroid/app/ActivityManagerInternal$BindServiceEventListener;)V+]Landroid/app/ActivityManagerInternal$BindServiceEventListener;Lcom/android/server/am/AppBindServiceEventsTracker;
 HSPLcom/android/server/am/ActivityManagerService$PendingTempAllowlist;-><init>(IJILjava/lang/String;II)V
 HSPLcom/android/server/am/ActivityManagerService$PermissionController;->getPackagesForUid(I)[Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
-HSPLcom/android/server/am/ActivityManagerService$PidMap;-><init>()V
-HSPLcom/android/server/am/ActivityManagerService$PidMap;->doRemoveInternal(ILcom/android/server/am/ProcessRecord;)Z
+HSPLcom/android/server/am/ActivityManagerService$PidMap;->doRemoveInternal(ILcom/android/server/am/ProcessRecord;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ActivityManagerService$PidMap;->get(I)Lcom/android/server/am/ProcessRecord;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/am/ActivityManagerService$PidMap;->valueAt(I)Lcom/android/server/am/ProcessRecord;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/am/ActivityManagerService$StickyBroadcast;-><init>()V
-HSPLcom/android/server/am/ActivityManagerService$StickyBroadcast;->create(Landroid/content/Intent;ZII)Lcom/android/server/am/ActivityManagerService$StickyBroadcast;
-HSPLcom/android/server/am/ActivityManagerService$UiHandler;-><init>(Lcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/ActivityManagerService$UiHandler;->handleMessage(Landroid/os/Message;)V
-HSPLcom/android/server/am/ActivityManagerService;->$r8$lambda$4jAnBrF-SmuZoSRgfVhHQN2lKao(Lcom/android/server/am/ActivityManagerService;)V
-HPLcom/android/server/am/ActivityManagerService;->-$$Nest$fgetmCompanionAppUidsMap(Lcom/android/server/am/ActivityManagerService;)Ljava/util/Map;
+HSPLcom/android/server/am/ActivityManagerService$UiHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/AppErrors;Lcom/android/server/am/AppErrors;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/UidObserverController;Lcom/android/server/am/UidObserverController;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
+HSPLcom/android/server/am/ActivityManagerService;->-$$Nest$fgetmCompanionAppUidsMap(Lcom/android/server/am/ActivityManagerService;)Ljava/util/Map;
 HSPLcom/android/server/am/ActivityManagerService;->-$$Nest$fgetmDeviceOwnerUid(Lcom/android/server/am/ActivityManagerService;)I
-HPLcom/android/server/am/ActivityManagerService;->-$$Nest$fgetmFgsWhileInUseTempAllowList(Lcom/android/server/am/ActivityManagerService;)Lcom/android/server/am/FgsTempAllowList;
+HSPLcom/android/server/am/ActivityManagerService;->-$$Nest$fgetmFgsWhileInUseTempAllowList(Lcom/android/server/am/ActivityManagerService;)Lcom/android/server/am/FgsTempAllowList;
 HSPLcom/android/server/am/ActivityManagerService;->-$$Nest$fgetmPendingStartActivityUids(Lcom/android/server/am/ActivityManagerService;)Lcom/android/server/am/PendingStartActivityUids;
 HSPLcom/android/server/am/ActivityManagerService;->-$$Nest$fgetmProfileOwnerUids(Lcom/android/server/am/ActivityManagerService;)Landroid/util/ArraySet;
 HSPLcom/android/server/am/ActivityManagerService;->-$$Nest$fgetmUidNetworkBlockedReasons(Lcom/android/server/am/ActivityManagerService;)Landroid/util/SparseIntArray;
 HSPLcom/android/server/am/ActivityManagerService;->-$$Nest$misAppBad(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;I)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ActivityManagerService;->-$$Nest$mstart(Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/ActivityManagerService;-><clinit>()V
 HSPLcom/android/server/am/ActivityManagerService;-><init>(Landroid/content/Context;Lcom/android/server/wm/ActivityTaskManagerService;)V
 HSPLcom/android/server/am/ActivityManagerService;->addBroadcastStatLocked(Ljava/lang/String;Ljava/lang/String;IIJ)V+]Lcom/android/server/am/BroadcastStats;Lcom/android/server/am/BroadcastStats;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->addErrorToDropBox(Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Landroid/app/ApplicationErrorReport$CrashInfo;Ljava/lang/Float;Landroid/os/incremental/IncrementalMetrics;Ljava/util/UUID;Lcom/android/server/am/ActivityManagerService$VolatileDropboxEntryStates;)V
 HSPLcom/android/server/am/ActivityManagerService;->addPackageDependency(Ljava/lang/String;)V
-HSPLcom/android/server/am/ActivityManagerService;->addPidLocked(Lcom/android/server/am/ProcessRecord;)V
-HSPLcom/android/server/am/ActivityManagerService;->appDiedLocked(Lcom/android/server/am/ProcessRecord;ILandroid/app/IApplicationThread;ZLjava/lang/String;)V
+HSPLcom/android/server/am/ActivityManagerService;->addPidLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ActivityManagerService;->appDiedLocked(Lcom/android/server/am/ProcessRecord;ILandroid/app/IApplicationThread;ZLjava/lang/String;)V+]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
 HSPLcom/android/server/am/ActivityManagerService;->appendDropBoxProcessHeaders(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Lcom/android/server/am/ActivityManagerService$VolatileDropboxEntryStates;Ljava/lang/StringBuilder;)V
 HSPLcom/android/server/am/ActivityManagerService;->attachApplication(Landroid/app/IApplicationThread;J)V
-HSPLcom/android/server/am/ActivityManagerService;->attachApplicationLocked(Landroid/app/IApplicationThread;IIJ)V
+HSPLcom/android/server/am/ActivityManagerService;->attachApplicationLocked(Landroid/app/IApplicationThread;IIJ)V+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/contentcapture/ContentCaptureManagerInternal;Lcom/android/server/contentcapture/ContentCaptureManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/view/autofill/AutofillManagerInternal;Lcom/android/server/autofill/AutofillManagerService$LocalService;]Landroid/os/IBinder;Landroid/os/BinderProxy;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/graphics/fonts/FontManagerInternal;Lcom/android/server/graphics/fonts/FontManagerService$Lifecycle$1;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
 HPLcom/android/server/am/ActivityManagerService;->bindBackupAgent(Ljava/lang/String;III)Z
 HSPLcom/android/server/am/ActivityManagerService;->bindServiceInstance(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;JLjava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->bindServiceInstance(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;JLjava/lang/String;ZILjava/lang/String;Landroid/app/IApplicationThread;Ljava/lang/String;I)I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/Intent;Landroid/content/Intent;
@@ -980,137 +802,137 @@
 HSPLcom/android/server/am/ActivityManagerService;->boostPriorityForProcLockedSection()V+]Lcom/android/server/ThreadPriorityBooster;Lcom/android/server/ThreadPriorityBooster;
 HPLcom/android/server/am/ActivityManagerService;->broadcastIntentInPackage(Ljava/lang/String;Ljava/lang/String;IIILandroid/content/Intent;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;Ljava/lang/String;Landroid/os/Bundle;ZZILandroid/app/BackgroundStartPrivileges;[I)I
 HSPLcom/android/server/am/ActivityManagerService;->broadcastIntentLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/os/Bundle;ZZIIIIILandroid/app/BackgroundStartPrivileges;[ILjava/util/function/BiFunction;)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ActivityManagerService;->broadcastIntentLockedTraced(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/app/BroadcastOptions;ZZIIIIILandroid/app/BackgroundStartPrivileges;[ILjava/util/function/BiFunction;)I+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Lcom/android/server/IntentResolver;Lcom/android/server/am/ActivityManagerService$3;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Landroid/net/Uri;Landroid/net/Uri$OpaqueUri;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/IntentFilter;Lcom/android/server/am/BroadcastFilter;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/IIntentReceiver;megamorphic_types]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;
+HSPLcom/android/server/am/ActivityManagerService;->broadcastIntentLockedTraced(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/app/BroadcastOptions;ZZIIIIILandroid/app/BackgroundStartPrivileges;[ILjava/util/function/BiFunction;)I+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/IntentFilter;Lcom/android/server/am/BroadcastFilter;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/IIntentReceiver;megamorphic_types]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/IntentResolver;Lcom/android/server/am/ActivityManagerService$3;]Landroid/net/Uri;Landroid/net/Uri$OpaqueUri;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/am/ActivityManagerService;->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+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HPLcom/android/server/am/ActivityManagerService;->cancelIntentSender(Landroid/content/IIntentSender;)V+]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;
-HSPLcom/android/server/am/ActivityManagerService;->checkBroadcastFromSystem(Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;IZLjava/util/List;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/am/ActivityManagerService;->checkBroadcastFromSystem(Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;IZLjava/util/List;)V+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Intent;Landroid/content/Intent;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ActivityManagerService;->checkCallingPermission(Ljava/lang/String;)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->checkComponentPermission(Ljava/lang/String;IIIIZ)I+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/ActivityManagerService;->checkComponentPermission(Ljava/lang/String;IIIZ)I
+HPLcom/android/server/am/ActivityManagerService;->checkExcessivePowerUsage()V
 HSPLcom/android/server/am/ActivityManagerService;->checkPermission(Ljava/lang/String;II)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->checkPermissionForDevice(Ljava/lang/String;III)I
 HSPLcom/android/server/am/ActivityManagerService;->checkTime(JLjava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLcom/android/server/am/ActivityManagerService;->checkUriPermission(Landroid/net/Uri;IIIIZLjava/lang/String;)I
-HSPLcom/android/server/am/ActivityManagerService;->cleanUpApplicationRecordLocked(Lcom/android/server/am/ProcessRecord;IZZIZZ)Z
-HSPLcom/android/server/am/ActivityManagerService;->collectReceiverComponents(Landroid/content/Intent;Ljava/lang/String;I[I[I)Ljava/util/List;+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Ljava/util/HashSet;Ljava/util/HashSet;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/am/ActivityManagerService;->checkUriPermission(Landroid/net/Uri;IIIIZLjava/lang/String;)I+]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService;->cleanUpApplicationRecordLocked(Lcom/android/server/am/ProcessRecord;IZZIZZ)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService;->collectReceiverComponents(Landroid/content/Intent;Ljava/lang/String;I[I[I)Ljava/util/List;+]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/util/HashSet;Ljava/util/HashSet;
 HSPLcom/android/server/am/ActivityManagerService;->enforceAllowedToStartOrBindServiceIfSdkSandbox(Landroid/content/Intent;)V+]Lcom/android/server/sdksandbox/SdkSandboxManagerLocal;Lcom/android/server/sdksandbox/SdkSandboxManagerService$LocalImpl;
 HSPLcom/android/server/am/ActivityManagerService;->enforceBroadcastOptionPermissionsInternal(Landroid/app/BroadcastOptions;I)V+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;
 HSPLcom/android/server/am/ActivityManagerService;->enforceBroadcastOptionPermissionsInternal(Landroid/os/Bundle;I)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ActivityManagerService;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V
+HSPLcom/android/server/am/ActivityManagerService;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService;->enforceDumpPermissionForPackage(Ljava/lang/String;IILjava/lang/String;)I
 HSPLcom/android/server/am/ActivityManagerService;->enforceNotIsolatedCaller(Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLcom/android/server/am/ActivityManagerService;->enforceNotIsolatedOrSdkSandboxCaller(Ljava/lang/String;)V
+HSPLcom/android/server/am/ActivityManagerService;->enforceNotIsolatedOrSdkSandboxCaller(Ljava/lang/String;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->enqueueOomAdjTargetLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;
 HSPLcom/android/server/am/ActivityManagerService;->enqueueUidChangeLocked(Lcom/android/server/am/UidRecord;II)V+]Lcom/android/server/am/UidObserverController;Lcom/android/server/am/UidObserverController;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
 HSPLcom/android/server/am/ActivityManagerService;->ensureAllowedAssociations()V
 HSPLcom/android/server/am/ActivityManagerService;->filterNonExportedComponents(Landroid/content/Intent;IILjava/util/List;Lcom/android/server/compat/PlatformCompat;Ljava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ComponentInfo;Landroid/content/pm/ActivityInfo;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;
 HSPLcom/android/server/am/ActivityManagerService;->finishAttachApplication(J)V
-HSPLcom/android/server/am/ActivityManagerService;->finishAttachApplicationInner(JII)V
-HPLcom/android/server/am/ActivityManagerService;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/am/ActivityManagerService;->finishAttachApplicationInner(JII)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V+]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/am/ActivityManagerService;->forceStopPackageLocked(Ljava/lang/String;IZZZZZZILjava/lang/String;I)Z
+HPLcom/android/server/am/ActivityManagerService;->frozenBinderTransactionDetected(IIII)V+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;
 HSPLcom/android/server/am/ActivityManagerService;->getAppInfoForUser(Landroid/content/pm/ApplicationInfo;I)Landroid/content/pm/ApplicationInfo;+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;
-HPLcom/android/server/am/ActivityManagerService;->getAppOpsManager()Landroid/app/AppOpsManager;
+HSPLcom/android/server/am/ActivityManagerService;->getAppOpsManager()Landroid/app/AppOpsManager;
 HSPLcom/android/server/am/ActivityManagerService;->getAppStartModeLOSP(ILjava/lang/String;IIZZZ)I+]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->getBackgroundLaunchBroadcasts()Landroid/util/ArraySet;
 HSPLcom/android/server/am/ActivityManagerService;->getCommonServicesLocked(Z)Landroid/util/ArrayMap;
 HSPLcom/android/server/am/ActivityManagerService;->getContentProvider(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;IZ)Landroid/app/ContentProviderHolder;+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;
 HSPLcom/android/server/am/ActivityManagerService;->getCurrentUserId()I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;
-HSPLcom/android/server/am/ActivityManagerService;->getHistoricalProcessExitReasons(Ljava/lang/String;III)Landroid/content/pm/ParceledListSlice;
+HSPLcom/android/server/am/ActivityManagerService;->getHistoricalProcessExitReasons(Ljava/lang/String;III)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->getInfoForIntentSender(Landroid/content/IIntentSender;)Landroid/app/ActivityManager$PendingIntentInfo;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/am/ActivityManagerService;->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;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->getIntentSenderWithFeatureAsApp(ILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;II)Landroid/content/IIntentSender;+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;
 HSPLcom/android/server/am/ActivityManagerService;->getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
-HPLcom/android/server/am/ActivityManagerService;->getMemoryTrimLevel()I
-HSPLcom/android/server/am/ActivityManagerService;->getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService;->getMemoryTrimLevel()I+]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService;->getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
 HSPLcom/android/server/am/ActivityManagerService;->getPackageManagerInternal()Landroid/content/pm/PackageManagerInternal;
-HPLcom/android/server/am/ActivityManagerService;->getPackageProcessState(Ljava/lang/String;Ljava/lang/String;)I
+HPLcom/android/server/am/ActivityManagerService;->getPackageProcessState(Ljava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HPLcom/android/server/am/ActivityManagerService;->getProcessMemoryInfo([I)[Landroid/os/Debug$MemoryInfo;+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Landroid/os/Debug$MemoryInfo;Landroid/os/Debug$MemoryInfo;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
 HSPLcom/android/server/am/ActivityManagerService;->getProcessRecordLocked(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
-HPLcom/android/server/am/ActivityManagerService;->getProcessesInErrorState()Ljava/util/List;+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->getRealProcessStateLocked(Lcom/android/server/am/ProcessRecord;I)I+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ActivityManagerService;->getRecordForAppLOSP(Landroid/app/IApplicationThread;)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
-HSPLcom/android/server/am/ActivityManagerService;->getRecordForAppLOSP(Landroid/os/IBinder;)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/ProcessMap;Lcom/android/server/am/ProcessList$MyProcessMap;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
-HSPLcom/android/server/am/ActivityManagerService;->getRunningAppProcesses()Ljava/util/List;+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService;->getRecordForAppLOSP(Landroid/os/IBinder;)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/internal/app/ProcessMap;Lcom/android/server/am/ProcessList$MyProcessMap;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
+HSPLcom/android/server/am/ActivityManagerService;->getRunningAppProcesses()Ljava/util/List;+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
 HSPLcom/android/server/am/ActivityManagerService;->getRunningUserIds()[I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->getShortAction(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
 HSPLcom/android/server/am/ActivityManagerService;->getTagForIntentSender(Landroid/content/IIntentSender;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ActivityManagerService;->getTagForIntentSenderLocked(Lcom/android/server/am/PendingIntentRecord;Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/am/ActivityManagerService;->getTagForIntentSenderLocked(Lcom/android/server/am/PendingIntentRecord;Ljava/lang/String;)Ljava/lang/String;+]Landroid/content/Intent;Landroid/content/Intent;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HSPLcom/android/server/am/ActivityManagerService;->getTopApp()Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/am/ActivityManagerService;->getUidProcessCapabilityLocked(I)I+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
 HSPLcom/android/server/am/ActivityManagerService;->getUidState(I)I+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
 HSPLcom/android/server/am/ActivityManagerService;->getUidStateLocked(I)I+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
 HSPLcom/android/server/am/ActivityManagerService;->grantImplicitAccess(ILandroid/content/Intent;II)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HPLcom/android/server/am/ActivityManagerService;->grantUriPermission(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/net/Uri;II)V
-HSPLcom/android/server/am/ActivityManagerService;->handleAppDiedLocked(Lcom/android/server/am/ProcessRecord;IZZZ)V
+HSPLcom/android/server/am/ActivityManagerService;->handleAppDiedLocked(Lcom/android/server/am/ProcessRecord;IZZZ)V+]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ActivityManagerService;->handleApplicationStrictModeViolation(Landroid/os/IBinder;ILandroid/os/StrictMode$ViolationInfo;)V
 HSPLcom/android/server/am/ActivityManagerService;->handleApplicationWtf(Landroid/os/IBinder;Ljava/lang/String;ZLandroid/app/ApplicationErrorReport$ParcelableCrashInfo;I)Z
 HSPLcom/android/server/am/ActivityManagerService;->handleApplicationWtfInner(IILandroid/os/IBinder;Ljava/lang/String;Landroid/app/ApplicationErrorReport$CrashInfo;)Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ActivityManagerService;->handleIncomingUser(IIIZZLjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;
 HSPLcom/android/server/am/ActivityManagerService;->hasUsageStatsPermission(Ljava/lang/String;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->hasUsageStatsPermission(Ljava/lang/String;II)Z+]Landroid/app/SyncNotedAppOp;Landroid/app/SyncNotedAppOp;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ActivityManagerService;->initPowerManagement()V
 HSPLcom/android/server/am/ActivityManagerService;->isAllowlistedForFgsStartLOSP(I)Lcom/android/server/am/ActivityManagerService$FgsTempAllowListItem;+]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList;
 HSPLcom/android/server/am/ActivityManagerService;->isAppBad(Ljava/lang/String;I)Z+]Lcom/android/server/am/AppErrors;Lcom/android/server/am/AppErrors;
 HPLcom/android/server/am/ActivityManagerService;->isAppForeground(I)Z
+HSPLcom/android/server/am/ActivityManagerService;->isAppFreezerExemptInstPkg()Z
 HSPLcom/android/server/am/ActivityManagerService;->isAppStartModeDisabled(ILjava/lang/String;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HPLcom/android/server/am/ActivityManagerService;->isCameraActiveForUid(I)Z+]Landroid/util/IntArray;Landroid/util/IntArray;
 HSPLcom/android/server/am/ActivityManagerService;->isInstantApp(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;I)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/am/ActivityManagerService;->isReceivingBroadcastLocked(Lcom/android/server/am/ProcessRecord;[I)Z+]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;
 HSPLcom/android/server/am/ActivityManagerService;->isSingleton(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;I)Z+]Ljava/lang/Object;Ljava/lang/String;
 HPLcom/android/server/am/ActivityManagerService;->isSystemUserOnly(I)Z
-HSPLcom/android/server/am/ActivityManagerService;->isUidActive(ILjava/lang/String;)Z
+HSPLcom/android/server/am/ActivityManagerService;->isUidActive(ILjava/lang/String;)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->isUidActiveLOSP(I)Z+]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
 HPLcom/android/server/am/ActivityManagerService;->isUserAMonkey()Z
-HSPLcom/android/server/am/ActivityManagerService;->isUserRunning(II)Z
+HSPLcom/android/server/am/ActivityManagerService;->isUserRunning(II)Z+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;
 HPLcom/android/server/am/ActivityManagerService;->lambda$checkExcessivePowerUsage$20(JJZZLcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HPLcom/android/server/am/ActivityManagerService;->lambda$getPackageProcessState$0([ILjava/lang/String;Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HPLcom/android/server/am/ActivityManagerService;->lambda$getProcessesInErrorState$13(ZIZI[Ljava/util/List;Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLcom/android/server/am/ActivityManagerService;->lambda$scheduleUpdateBinderHeavyHitterWatcherConfig$33()V
 HPLcom/android/server/am/ActivityManagerService;->logFgsApiEnd(III)V
 HSPLcom/android/server/am/ActivityManagerService;->logStrictModeViolationToDropBox(Lcom/android/server/am/ProcessRecord;Landroid/os/StrictMode$ViolationInfo;)V
-HSPLcom/android/server/am/ActivityManagerService;->noteAlarmFinish(Landroid/content/IIntentSender;Landroid/os/WorkSource;ILjava/lang/String;)V
+HSPLcom/android/server/am/ActivityManagerService;->noteAlarmFinish(Landroid/content/IIntentSender;Landroid/os/WorkSource;ILjava/lang/String;)V+]Landroid/os/WorkSource;Landroid/os/WorkSource;
+HSPLcom/android/server/am/ActivityManagerService;->noteAlarmStart(Landroid/content/IIntentSender;Landroid/os/WorkSource;ILjava/lang/String;)V+]Landroid/os/WorkSource;Landroid/os/WorkSource;
 HSPLcom/android/server/am/ActivityManagerService;->noteUidProcessState(III)V+]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
-HSPLcom/android/server/am/ActivityManagerService;->noteWakeupAlarm(Landroid/content/IIntentSender;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;)V
+HSPLcom/android/server/am/ActivityManagerService;->noteWakeupAlarm(Landroid/content/IIntentSender;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;)V+]Landroid/os/WorkSource;Landroid/os/WorkSource;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;
 HSPLcom/android/server/am/ActivityManagerService;->notifyBroadcastFinishedLocked(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/os/Message;Landroid/os/Message;
 HSPLcom/android/server/am/ActivityManagerService;->notifyPackageUse(Ljava/lang/String;I)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/server/am/ActivityManagerService;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/am/ActivityManagerService;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/am/ActivityManagerService;->publishService(Landroid/os/IBinder;Landroid/content/Intent;Landroid/os/IBinder;)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/ActivityManagerService;->pushTempAllowlist()V+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/am/PendingTempAllowlists;Lcom/android/server/am/PendingTempAllowlists;
 HSPLcom/android/server/am/ActivityManagerService;->refContentProvider(Landroid/os/IBinder;II)Z+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;
-HSPLcom/android/server/am/ActivityManagerService;->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;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/am/ProcessReceiverRecord;Lcom/android/server/am/ProcessReceiverRecord;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Lcom/android/server/am/BroadcastFilter;]Lcom/android/server/am/ReceiverList;Lcom/android/server/am/ReceiverList;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/String;Ljava/lang/String;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Lcom/android/server/am/ReceiverList;,Ljava/util/ArrayList;]Lcom/android/server/IntentResolver;Lcom/android/server/am/ActivityManagerService$3;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
-HSPLcom/android/server/am/ActivityManagerService;->registerStrictModeCallback(Landroid/os/IBinder;)V
+HSPLcom/android/server/am/ActivityManagerService;->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;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/am/ProcessReceiverRecord;Lcom/android/server/am/ProcessReceiverRecord;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Lcom/android/server/am/BroadcastFilter;]Lcom/android/server/am/ReceiverList;Lcom/android/server/am/ReceiverList;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/String;Ljava/lang/String;]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Lcom/android/server/am/ReceiverList;,Ljava/util/ArrayList;]Lcom/android/server/IntentResolver;Lcom/android/server/am/ActivityManagerService$3;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
+HSPLcom/android/server/am/ActivityManagerService;->registerStrictModeCallback(Landroid/os/IBinder;)V+]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/os/StrictMode$UnsafeIntentStrictModeCallback;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/am/ActivityManagerService;->removeContentProvider(Landroid/os/IBinder;Z)V+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;
-HSPLcom/android/server/am/ActivityManagerService;->removePidLocked(ILcom/android/server/am/ProcessRecord;)Z
+HSPLcom/android/server/am/ActivityManagerService;->removePidLocked(ILcom/android/server/am/ProcessRecord;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;
 HPLcom/android/server/am/ActivityManagerService;->removeReceiverLocked(Lcom/android/server/am/ReceiverList;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Ljava/util/ArrayList;Lcom/android/server/am/ReceiverList;]Lcom/android/server/IntentResolver;Lcom/android/server/am/ActivityManagerService$3;
 HPLcom/android/server/am/ActivityManagerService;->reportUidFrozenStateChanged([I[I)V+]Landroid/app/IUidFrozenStateChangedCallback;Landroid/app/ActivityManager$1;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
 HSPLcom/android/server/am/ActivityManagerService;->reportUidInfoMessageLocked(Ljava/lang/String;Ljava/lang/String;I)V
 HSPLcom/android/server/am/ActivityManagerService;->resetPriorityAfterLockedSection()V+]Lcom/android/server/ThreadPriorityBooster;Lcom/android/server/ThreadPriorityBooster;
 HSPLcom/android/server/am/ActivityManagerService;->resetPriorityAfterProcLockedSection()V+]Lcom/android/server/ThreadPriorityBooster;Lcom/android/server/ThreadPriorityBooster;
 HSPLcom/android/server/am/ActivityManagerService;->rotateBroadcastStatsIfNeededLocked()V
-HSPLcom/android/server/am/ActivityManagerService;->scheduleUpdateBinderHeavyHitterWatcherConfig()V
 HPLcom/android/server/am/ActivityManagerService;->sendIntentSender(Landroid/app/IApplicationThread;Landroid/content/IIntentSender;Landroid/os/IBinder;ILandroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/Bundle;)I
 HSPLcom/android/server/am/ActivityManagerService;->serviceDoneExecuting(Landroid/os/IBinder;IIILandroid/content/Intent;)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
 HSPLcom/android/server/am/ActivityManagerService;->setAppIdTempAllowlistStateLSP(IZ)V
 HPLcom/android/server/am/ActivityManagerService;->setHasTopUi(Z)V
-HSPLcom/android/server/am/ActivityManagerService;->setInstaller(Lcom/android/server/pm/Installer;)V
-HSPLcom/android/server/am/ActivityManagerService;->setProcessTrackerStateLOSP(Lcom/android/server/am/ProcessRecord;I)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
-HSPLcom/android/server/am/ActivityManagerService;->setSystemServiceManager(Lcom/android/server/SystemServiceManager;)V
+HSPLcom/android/server/am/ActivityManagerService;->setProcessTrackerStateLOSP(Lcom/android/server/am/ProcessRecord;I)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
 HSPLcom/android/server/am/ActivityManagerService;->shouldIgnoreDeliveryGroupPolicy(Ljava/lang/String;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/am/ActivityManagerService;->start()V
 HSPLcom/android/server/am/ActivityManagerService;->startAssociationLocked(ILjava/lang/String;IIJLandroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/am/ActivityManagerService$Association;
 HSPLcom/android/server/am/ActivityManagerService;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;I)Landroid/content/ComponentName;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ActivityManagerService;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/Intent;Landroid/content/Intent;
 HPLcom/android/server/am/ActivityManagerService;->stopAssociationLocked(ILjava/lang/String;IJLandroid/content/ComponentName;Ljava/lang/String;)V
-HPLcom/android/server/am/ActivityManagerService;->stopService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)I
-HPLcom/android/server/am/ActivityManagerService;->stopServiceToken(Landroid/content/ComponentName;Landroid/os/IBinder;I)Z
-HSPLcom/android/server/am/ActivityManagerService;->tempAllowlistUidLocked(IJILjava/lang/String;II)V
+HPLcom/android/server/am/ActivityManagerService;->stopService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)I+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService;->stopServiceToken(Landroid/content/ComponentName;Landroid/os/IBinder;I)Z
+HSPLcom/android/server/am/ActivityManagerService;->tempAllowlistUidLocked(IJILjava/lang/String;II)V+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList;
 HSPLcom/android/server/am/ActivityManagerService;->traceBegin(JLjava/lang/String;Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HPLcom/android/server/am/ActivityManagerService;->trimApplicationsLocked(ZI)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessReceiverRecord;Lcom/android/server/am/ProcessReceiverRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService;->trimApplicationsLocked(ZI)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessReceiverRecord;Lcom/android/server/am/ProcessReceiverRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HPLcom/android/server/am/ActivityManagerService;->unbindBackupAgent(Landroid/content/pm/ApplicationInfo;)V
 HPLcom/android/server/am/ActivityManagerService;->unbindFinished(Landroid/os/IBinder;Landroid/content/Intent;Z)V
 HSPLcom/android/server/am/ActivityManagerService;->unbindService(Landroid/app/IServiceConnection;)Z+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;
-HPLcom/android/server/am/ActivityManagerService;->unregisterReceiver(Landroid/content/IIntentReceiver;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/content/IIntentReceiver;Landroid/content/IIntentReceiver$Stub$Proxy;]Lcom/android/server/am/ProcessReceiverRecord;Lcom/android/server/am/ProcessReceiverRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HPLcom/android/server/am/ActivityManagerService;->updateActivityUsageStats(Landroid/content/ComponentName;IILandroid/os/IBinder;Landroid/content/ComponentName;Landroid/app/assist/ActivityId;)V
-HPLcom/android/server/am/ActivityManagerService;->updateAppProcessCpuTimeLPr(JZJILcom/android/server/am/ProcessRecord;)V+]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
+HPLcom/android/server/am/ActivityManagerService;->unregisterReceiver(Landroid/content/IIntentReceiver;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/content/IIntentReceiver;Landroid/content/IIntentReceiver$Stub$Proxy;,Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;]Lcom/android/server/am/ProcessReceiverRecord;Lcom/android/server/am/ProcessReceiverRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService;->updateActivityUsageStats(Landroid/content/ComponentName;IILandroid/os/IBinder;Landroid/content/ComponentName;Landroid/app/assist/ActivityId;)V+]Landroid/os/IBinder;Lcom/android/server/wm/ActivityRecord$Token;]Landroid/app/ActivityManagerInternal$VoiceInteractionManagerProvider;Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$2;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Lcom/android/server/contentcapture/ContentCaptureManagerInternal;Lcom/android/server/contentcapture/ContentCaptureManagerService$LocalService;
+HPLcom/android/server/am/ActivityManagerService;->updateAppProcessCpuTimeLPr(JZJILcom/android/server/am/ProcessRecord;)V+]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
+HSPLcom/android/server/am/ActivityManagerService;->updateCpuStats()V+]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;
 HSPLcom/android/server/am/ActivityManagerService;->updateLruProcessLocked(Lcom/android/server/am/ProcessRecord;ZLcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
 HSPLcom/android/server/am/ActivityManagerService;->updateOomAdjLocked(I)V
 HSPLcom/android/server/am/ActivityManagerService;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;I)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;
@@ -1120,232 +942,141 @@
 HSPLcom/android/server/am/ActivityManagerService;->validateAssociationAllowedLocked(Ljava/lang/String;ILjava/lang/String;I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActivityManagerService$PackageAssociationInfo;Lcom/android/server/am/ActivityManagerService$PackageAssociationInfo;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ActivityManagerService;->validateServiceInstanceName(Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;
 HSPLcom/android/server/am/ActivityManagerService;->verifyBroadcastLocked(Landroid/content/Intent;)Landroid/content/Intent;+]Landroid/content/Intent;Landroid/content/Intent;
-HSPLcom/android/server/am/AnrHelper$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/am/AnrHelper$$ExternalSyntheticLambda1;-><init>()V
-HSPLcom/android/server/am/AnrHelper;-><clinit>()V
-HSPLcom/android/server/am/AnrHelper;-><init>(Lcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/AnrHelper;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/util/concurrent/ExecutorService;Ljava/util/concurrent/ExecutorService;)V
-HSPLcom/android/server/am/AnrHelper;->makeExpiringThreadPoolWithSize(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ThreadPoolExecutor;
-HSPLcom/android/server/am/AppBatteryExemptionTracker$AppBatteryExemptionPolicy;-><init>(Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/AppBatteryExemptionTracker;)V
-HSPLcom/android/server/am/AppBatteryExemptionTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppBatteryExemptionTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;Ljava/lang/reflect/Constructor;Ljava/lang/Object;)V
-HSPLcom/android/server/am/AppBatteryTracker$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/am/AppBatteryTracker;)V
-HSPLcom/android/server/am/AppBatteryTracker$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/am/AppBatteryTracker;)V
-HSPLcom/android/server/am/AppBatteryTracker$AppBatteryPolicy;-><init>(Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/AppBatteryTracker;)V
-HSPLcom/android/server/am/AppBatteryTracker$AppBatteryPolicy;->getFloatArray(Landroid/content/res/TypedArray;)[F
-HSPLcom/android/server/am/AppBatteryTracker$BatteryUsage;-><clinit>()V
-HSPLcom/android/server/am/AppBatteryTracker$BatteryUsage;-><init>()V
-HSPLcom/android/server/am/AppBatteryTracker$BatteryUsage;-><init>(DDDDD)V
-HSPLcom/android/server/am/AppBatteryTracker$ImmutableBatteryUsage;-><init>()V
-HSPLcom/android/server/am/AppBatteryTracker;-><clinit>()V
-HSPLcom/android/server/am/AppBatteryTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppBatteryTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;Ljava/lang/reflect/Constructor;Ljava/lang/Object;)V
 HSPLcom/android/server/am/AppBindRecord;-><init>(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/IntentBindRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;)V
-HSPLcom/android/server/am/AppBindServiceEventsTracker$AppBindServiceEventsPolicy;-><init>(Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/AppBindServiceEventsTracker;)V
-HSPLcom/android/server/am/AppBindServiceEventsTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppBindServiceEventsTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;Ljava/lang/reflect/Constructor;Ljava/lang/Object;)V
 HSPLcom/android/server/am/AppBindServiceEventsTracker;->onBindingService(Ljava/lang/String;I)V+]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector;]Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker;Lcom/android/server/am/AppBindServiceEventsTracker;]Lcom/android/server/am/BaseAppStatePolicy;Lcom/android/server/am/AppBindServiceEventsTracker$AppBindServiceEventsPolicy;
-HSPLcom/android/server/am/AppBroadcastEventsTracker$AppBroadcastEventsPolicy;-><init>(Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/AppBroadcastEventsTracker;)V
-HSPLcom/android/server/am/AppBroadcastEventsTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppBroadcastEventsTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;Ljava/lang/reflect/Constructor;Ljava/lang/Object;)V
 HSPLcom/android/server/am/AppBroadcastEventsTracker;->onSendingBroadcast(Ljava/lang/String;I)V+]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector;]Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker;Lcom/android/server/am/AppBroadcastEventsTracker;]Lcom/android/server/am/BaseAppStatePolicy;Lcom/android/server/am/AppBroadcastEventsTracker$AppBroadcastEventsPolicy;
-HSPLcom/android/server/am/AppErrors;-><init>(Landroid/content/Context;Lcom/android/server/am/ActivityManagerService;Lcom/android/server/PackageWatchdog;)V
 HSPLcom/android/server/am/AppErrors;->isBadProcess(Ljava/lang/String;I)Z+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;
+HSPLcom/android/server/am/AppErrors;->resetProcessCrashTime(Ljava/lang/String;I)V
 HSPLcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda17;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->addInfoLocked(Landroid/util/SparseArray;Landroid/app/ApplicationExitInfo;)V+]Landroid/app/ApplicationExitInfo;Landroid/app/ApplicationExitInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/io/File;Ljava/io/File;
-HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->getInfosLocked(Landroid/util/SparseArray;IILjava/util/ArrayList;)V+]Landroid/app/ApplicationExitInfo;Landroid/app/ApplicationExitInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->getInfosLocked(Landroid/util/SparseArray;IILjava/util/ArrayList;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/ApplicationExitInfo;Landroid/app/ApplicationExitInfo;
+HPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->toListLocked(Ljava/util/List;I)Ljava/util/List;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/List;Ljava/util/ArrayList;
 HPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V+]Landroid/app/ApplicationExitInfo;Landroid/app/ApplicationExitInfo;]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;-><init>(Lcom/android/server/am/AppExitInfoTracker;Ljava/lang/String;Ljava/lang/Integer;)V
-HSPLcom/android/server/am/AppExitInfoTracker$AppTraceRetriever;-><init>(Lcom/android/server/am/AppExitInfoTracker;)V
-HSPLcom/android/server/am/AppExitInfoTracker$IsolatedUidRecords;-><init>(Lcom/android/server/am/AppExitInfoTracker;)V
-HSPLcom/android/server/am/AppExitInfoTracker$KillHandler;-><init>(Lcom/android/server/am/AppExitInfoTracker;Landroid/os/Looper;)V
+HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;->onProcDied(IILjava/lang/Integer;)V
 HSPLcom/android/server/am/AppExitInfoTracker$KillHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;Lcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;]Lcom/android/server/am/AppExitInfoTracker;Lcom/android/server/am/AppExitInfoTracker;
 HSPLcom/android/server/am/AppExitInfoTracker;->$r8$lambda$8ldOFQfwVDb6WsbCLIHcgkKxIAI(Lcom/android/server/am/AppExitInfoTracker;ILjava/util/ArrayList;ILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;+]Lcom/android/server/am/AppExitInfoTracker;Lcom/android/server/am/AppExitInfoTracker;
-HSPLcom/android/server/am/AppExitInfoTracker;-><clinit>()V
-HSPLcom/android/server/am/AppExitInfoTracker;-><init>()V
 HSPLcom/android/server/am/AppExitInfoTracker;->forEachPackageLocked(Ljava/util/function/BiFunction;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/BiFunction;Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda0;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda17;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda8;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda14;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;
-HSPLcom/android/server/am/AppExitInfoTracker;->getExitInfo(Ljava/lang/String;IIILjava/util/ArrayList;)V+]Lcom/android/server/am/AppExitInfoTracker;Lcom/android/server/am/AppExitInfoTracker;]Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/AppExitInfoTracker;->getExitInfo(Ljava/lang/String;IIILjava/util/ArrayList;)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/AppExitInfoTracker;Lcom/android/server/am/AppExitInfoTracker;]Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;
 HSPLcom/android/server/am/AppExitInfoTracker;->handleNoteProcessDiedLocked(Landroid/app/ApplicationExitInfo;)V
-HSPLcom/android/server/am/AppExitInfoTracker;->init(Lcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/AppExitInfoTracker;->lambda$getExitInfo$3(ILjava/util/ArrayList;ILjava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/AppExitInfoTracker;->lambda$getExitInfo$3(ILjava/util/ArrayList;ILjava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;
 HSPLcom/android/server/am/AppExitInfoTracker;->lambda$updateExitInfoIfNecessaryLocked$2(ILjava/util/ArrayList;ILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;+]Landroid/app/ApplicationExitInfo;Landroid/app/ApplicationExitInfo;]Lcom/android/server/am/AppExitInfoTracker;Lcom/android/server/am/AppExitInfoTracker;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/am/AppExitInfoTracker;->obtainRawRecord(Lcom/android/server/am/ProcessRecord;J)Landroid/app/ApplicationExitInfo;
+HSPLcom/android/server/am/AppExitInfoTracker;->obtainRawRecord(Lcom/android/server/am/ProcessRecord;J)Landroid/app/ApplicationExitInfo;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool;
 HSPLcom/android/server/am/AppExitInfoTracker;->performLogToStatsdLocked(Landroid/app/ApplicationExitInfo;)V
+HPLcom/android/server/am/AppExitInfoTracker;->scheduleNoteAppKill(Lcom/android/server/am/ProcessRecord;IILjava/lang/String;)V
 HSPLcom/android/server/am/AppExitInfoTracker;->scheduleNoteProcessDied(Lcom/android/server/am/ProcessRecord;)V
-HSPLcom/android/server/am/AppFGSTracker$1;-><init>(Lcom/android/server/am/AppFGSTracker;)V
-HSPLcom/android/server/am/AppFGSTracker$AppFGSPolicy;-><init>(Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/AppFGSTracker;)V
-HSPLcom/android/server/am/AppFGSTracker$MyHandler;-><init>(Lcom/android/server/am/AppFGSTracker;)V
-HPLcom/android/server/am/AppFGSTracker$MyHandler;->handleMessage(Landroid/os/Message;)V
-HSPLcom/android/server/am/AppFGSTracker$NotificationListener;-><init>(Lcom/android/server/am/AppFGSTracker;)V
+HSPLcom/android/server/am/AppExitInfoTracker;->updateExitInfoIfNecessaryLocked(IILjava/lang/Integer;Ljava/lang/Integer;)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/am/AppFGSTracker$MyHandler;->handleMessage(Landroid/os/Message;)V+]Ljava/lang/Boolean;Ljava/lang/Boolean;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;
 HPLcom/android/server/am/AppFGSTracker$NotificationListener;->onNotificationPosted(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;)V
-HSPLcom/android/server/am/AppFGSTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppFGSTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;Ljava/lang/reflect/Constructor;Ljava/lang/Object;)V
-HSPLcom/android/server/am/AppFGSTracker;->hasForegroundServices(Ljava/lang/String;I)Z
-HSPLcom/android/server/am/AppMediaSessionTracker$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/am/AppMediaSessionTracker;)V
-HSPLcom/android/server/am/AppMediaSessionTracker$AppMediaSessionPolicy;-><init>(Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/AppMediaSessionTracker;)V
-HSPLcom/android/server/am/AppMediaSessionTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppMediaSessionTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;Ljava/lang/reflect/Constructor;Ljava/lang/Object;)V
-HSPLcom/android/server/am/AppPermissionTracker$AppPermissionPolicy;-><clinit>()V
-HSPLcom/android/server/am/AppPermissionTracker$AppPermissionPolicy;-><init>(Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/AppPermissionTracker;)V
+HSPLcom/android/server/am/AppFGSTracker;->hasForegroundServices(Ljava/lang/String;I)Z+]Lcom/android/server/am/AppFGSTracker$PackageDurations;Lcom/android/server/am/AppFGSTracker$PackageDurations;]Lcom/android/server/am/UidProcessMap;Lcom/android/server/am/UidProcessMap;
 HPLcom/android/server/am/AppPermissionTracker$AppPermissionPolicy;->getBgPermissionsInMonitor()[Landroid/util/Pair;
-HSPLcom/android/server/am/AppPermissionTracker$AppPermissionPolicy;->parsePermissionConfig([Ljava/lang/String;)[Landroid/util/Pair;
-HSPLcom/android/server/am/AppPermissionTracker$MyHandler;-><init>(Lcom/android/server/am/AppPermissionTracker;)V
 HPLcom/android/server/am/AppPermissionTracker$MyHandler;->handleMessage(Landroid/os/Message;)V
 HPLcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;-><init>(Lcom/android/server/am/AppPermissionTracker;ILjava/lang/String;I)V+]Lcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;Lcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;
 HPLcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;->equals(Ljava/lang/Object;)Z
 HPLcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;->hashCode()I+]Ljava/lang/Object;Ljava/lang/String;
 HPLcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;->updateAppOps()V+]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector;]Lcom/android/internal/app/IAppOpsService;Lcom/android/server/appop/AppOpsService;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
 HPLcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;->updatePermissionState()V+]Landroid/content/Context;Landroid/app/ContextImpl;
-HSPLcom/android/server/am/AppPermissionTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppPermissionTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;Ljava/lang/reflect/Constructor;Ljava/lang/Object;)V
 HPLcom/android/server/am/AppPermissionTracker;->handleOpChanged(IILjava/lang/String;)V+]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/am/AppPermissionTracker;Lcom/android/server/am/AppPermissionTracker;]Lcom/android/server/am/AppPermissionTracker$AppPermissionPolicy;Lcom/android/server/am/AppPermissionTracker$AppPermissionPolicy;
 HPLcom/android/server/am/AppPermissionTracker;->handlePermissionsChanged(I)V+]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/am/AppPermissionTracker;Lcom/android/server/am/AppPermissionTracker;]Lcom/android/server/am/AppPermissionTracker$AppPermissionPolicy;Lcom/android/server/am/AppPermissionTracker$AppPermissionPolicy;
 HPLcom/android/server/am/AppPermissionTracker;->handlePermissionsChangedLocked(I[Lcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/BaseAppStateTracker;Lcom/android/server/am/AppPermissionTracker;]Lcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;Lcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;
 HPLcom/android/server/am/AppPermissionTracker;->handlePermissionsInit()V
 HSPLcom/android/server/am/AppProfiler$$ExternalSyntheticLambda0;-><init>()V
 HSPLcom/android/server/am/AppProfiler$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/am/AppProfiler$1;-><init>(Lcom/android/server/am/AppProfiler;)V
-HSPLcom/android/server/am/AppProfiler$BgHandler;-><init>(Lcom/android/server/am/AppProfiler;Landroid/os/Looper;)V
 HPLcom/android/server/am/AppProfiler$BgHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;
-HSPLcom/android/server/am/AppProfiler$CachedAppsWatermarkData;-><init>(Lcom/android/server/am/AppProfiler;)V
 HPLcom/android/server/am/AppProfiler$CachedAppsWatermarkData;->lambda$updateCachedAppsSnapshot$0(JLcom/android/server/am/ProcessRecord;)V
 HSPLcom/android/server/am/AppProfiler$CachedAppsWatermarkData;->updateCachedAppsHighWatermarkIfNecessaryLocked(IJ)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/os/Message;Landroid/os/Message;
 HPLcom/android/server/am/AppProfiler$CachedAppsWatermarkData;->updateCachedAppsSnapshot(J)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HSPLcom/android/server/am/AppProfiler$ProcessCpuThread;-><init>(Lcom/android/server/am/AppProfiler;Ljava/lang/String;)V
-HSPLcom/android/server/am/AppProfiler$ProcessCpuThread;->run()V
-HSPLcom/android/server/am/AppProfiler$ProfileData;-><init>(Lcom/android/server/am/AppProfiler;)V
-HSPLcom/android/server/am/AppProfiler$ProfileData;-><init>(Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler$ProfileData-IA;)V
 HSPLcom/android/server/am/AppProfiler;->$r8$lambda$O0KXijwG7-p0M_PB8ZuTBcOSGho(Lcom/android/server/am/ProcessRecord;)V
-HSPLcom/android/server/am/AppProfiler;->-$$Nest$fgetmLastCpuTime(Lcom/android/server/am/AppProfiler;)Ljava/util/concurrent/atomic/AtomicLong;
-HSPLcom/android/server/am/AppProfiler;->-$$Nest$fgetmLastWriteTime(Lcom/android/server/am/AppProfiler;)J
-HSPLcom/android/server/am/AppProfiler;->-$$Nest$fgetmProcessCpuInitLatch(Lcom/android/server/am/AppProfiler;)Ljava/util/concurrent/CountDownLatch;
-HSPLcom/android/server/am/AppProfiler;->-$$Nest$fgetmProcessCpuMutexFree(Lcom/android/server/am/AppProfiler;)Ljava/util/concurrent/atomic/AtomicBoolean;
-HSPLcom/android/server/am/AppProfiler;->-$$Nest$fgetmProcessCpuTracker(Lcom/android/server/am/AppProfiler;)Lcom/android/internal/os/ProcessCpuTracker;
 HPLcom/android/server/am/AppProfiler;->-$$Nest$mcollectPssInBackground(Lcom/android/server/am/AppProfiler;)V
-HSPLcom/android/server/am/AppProfiler;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;Lcom/android/server/am/LowMemDetector;)V
 HPLcom/android/server/am/AppProfiler;->collectPssInBackground()V+]Lcom/android/internal/os/ProcessCpuTracker;Lcom/android/internal/os/ProcessCpuTracker;]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/internal/util/MemInfoReader;Lcom/android/internal/util/MemInfoReader;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
-HSPLcom/android/server/am/AppProfiler;->getCpuDelayTimeForPid(I)J
-HPLcom/android/server/am/AppProfiler;->getLastMemoryLevelLocked()I
+HSPLcom/android/server/am/AppProfiler;->doLowMemReportIfNeededLocked(Lcom/android/server/am/ProcessRecord;)V
+HSPLcom/android/server/am/AppProfiler;->getCpuDelayTimeForPid(I)J+]Lcom/android/internal/os/ProcessCpuTracker;Lcom/android/internal/os/ProcessCpuTracker;
+HSPLcom/android/server/am/AppProfiler;->getLastMemoryLevelLocked()I
 HPLcom/android/server/am/AppProfiler;->isLastMemoryLevelNormal()Z
 HPLcom/android/server/am/AppProfiler;->isProfilingPss()Z
 HSPLcom/android/server/am/AppProfiler;->lambda$updateLowMemStateLSP$3(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
-HSPLcom/android/server/am/AppProfiler;->onActivityManagerInternalAdded()V
-HSPLcom/android/server/am/AppProfiler;->onCleanupApplicationRecordLocked(Lcom/android/server/am/ProcessRecord;)V
+HSPLcom/android/server/am/AppProfiler;->onCleanupApplicationRecordLocked(Lcom/android/server/am/ProcessRecord;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/am/AppProfiler;->recordPssSampleLPf(Lcom/android/server/am/ProcessProfileRecord;IJJJJIJJ)V
 HPLcom/android/server/am/AppProfiler;->requestPssLPf(Lcom/android/server/am/ProcessProfileRecord;I)Z+]Landroid/os/Handler;Lcom/android/server/am/AppProfiler$BgHandler;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
-HSPLcom/android/server/am/AppProfiler;->scheduleAppGcsLPf()V
-HSPLcom/android/server/am/AppProfiler;->setupProfilerInfoLocked(Landroid/app/IApplicationThread;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ActiveInstrumentation;)Landroid/app/ProfilerInfo;
+HSPLcom/android/server/am/AppProfiler;->scheduleAppGcsLPf()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/AppProfiler;->setupProfilerInfoLocked(Landroid/app/IApplicationThread;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ActiveInstrumentation;)Landroid/app/ProfilerInfo;+]Lcom/android/server/am/AppProfiler$ProfileData;Lcom/android/server/am/AppProfiler$ProfileData;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/AppProfiler;->updateCpuStats()V
-HSPLcom/android/server/am/AppProfiler;->updateCpuStatsNow()V+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/internal/os/ProcessCpuTracker;Lcom/android/internal/os/ProcessCpuTracker;]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
+HSPLcom/android/server/am/AppProfiler;->updateCpuStatsNow()V+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/internal/os/ProcessCpuTracker;Lcom/android/internal/os/ProcessCpuTracker;]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
 HSPLcom/android/server/am/AppProfiler;->updateLowMemStateLSP(IIIJ)Z+]Landroid/os/Handler;Lcom/android/server/am/AppProfiler$BgHandler;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/LowMemDetector;Lcom/android/server/am/LowMemDetector;
 HSPLcom/android/server/am/AppProfiler;->updateNextPssTimeLPf(ILcom/android/server/am/ProcessProfileRecord;JZ)V+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;
-HSPLcom/android/server/am/AppRestrictionController$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/am/AppRestrictionController;)V
 HSPLcom/android/server/am/AppRestrictionController$$ExternalSyntheticLambda2;-><init>(ILjava/lang/String;I)V
-HSPLcom/android/server/am/AppRestrictionController$1;-><init>(Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppRestrictionController$2;-><init>(Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppRestrictionController$3;-><init>(Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppRestrictionController$4;-><init>(Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppRestrictionController$5;-><init>(Lcom/android/server/am/AppRestrictionController;)V
+HSPLcom/android/server/am/AppRestrictionController$4;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+HSPLcom/android/server/am/AppRestrictionController$5;->onUidActive(I)V
 HSPLcom/android/server/am/AppRestrictionController$5;->onUidStateChanged(IIJI)V
-HSPLcom/android/server/am/AppRestrictionController$BgHandler;-><init>(Landroid/os/Looper;Lcom/android/server/am/AppRestrictionController$Injector;)V
-HSPLcom/android/server/am/AppRestrictionController$BgHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;
-HSPLcom/android/server/am/AppRestrictionController$ConstantsObserver;-><init>(Lcom/android/server/am/AppRestrictionController;Landroid/os/Handler;Landroid/content/Context;)V
-HSPLcom/android/server/am/AppRestrictionController$Injector;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/am/AppRestrictionController$BgHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/am/AppRestrictionController$RestrictionSettings;Lcom/android/server/am/AppRestrictionController$RestrictionSettings;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;
 HSPLcom/android/server/am/AppRestrictionController$Injector;->getActivityManagerInternal()Landroid/app/ActivityManagerInternal;
-HPLcom/android/server/am/AppRestrictionController$Injector;->getActivityManagerService()Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/AppRestrictionController$Injector;->getActivityManagerService()Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/AppRestrictionController$Injector;->getAppFGSTracker()Lcom/android/server/am/AppFGSTracker;
-HPLcom/android/server/am/AppRestrictionController$Injector;->getAppOpsManager()Landroid/app/AppOpsManager;
+HSPLcom/android/server/am/AppRestrictionController$Injector;->getAppHibernationInternal()Lcom/android/server/apphibernation/AppHibernationManagerInternal;
+HSPLcom/android/server/am/AppRestrictionController$Injector;->getAppOpsManager()Landroid/app/AppOpsManager;
 HSPLcom/android/server/am/AppRestrictionController$Injector;->getAppStandbyInternal()Lcom/android/server/usage/AppStandbyInternal;
 HSPLcom/android/server/am/AppRestrictionController$Injector;->getContext()Landroid/content/Context;
-HSPLcom/android/server/am/AppRestrictionController$Injector;->getNotificationManager()Landroid/app/NotificationManager;
-HSPLcom/android/server/am/AppRestrictionController$Injector;->getPackageManager()Landroid/content/pm/PackageManager;
+HSPLcom/android/server/am/AppRestrictionController$Injector;->getPackageManager()Landroid/content/pm/PackageManager;+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/am/AppRestrictionController$Injector;->getPackageManagerInternal()Landroid/content/pm/PackageManagerInternal;
 HSPLcom/android/server/am/AppRestrictionController$Injector;->getUserManagerInternal()Lcom/android/server/pm/UserManagerInternal;
-HSPLcom/android/server/am/AppRestrictionController$Injector;->initAppStateTrackers(Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppRestrictionController$NotificationHelper$1;-><init>(Lcom/android/server/am/AppRestrictionController$NotificationHelper;)V
-HSPLcom/android/server/am/AppRestrictionController$NotificationHelper;-><clinit>()V
-HSPLcom/android/server/am/AppRestrictionController$NotificationHelper;-><init>(Lcom/android/server/am/AppRestrictionController;)V
 HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings$PkgSettings;->getCurrentRestrictionLevel()I
 HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings$PkgSettings;->update(III)I
-HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;-><init>(Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->forEachPackageInUidLocked(ILcom/android/internal/util/function/TriConsumer;)V
+HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->forEachPackageInUidLocked(ILcom/android/internal/util/function/TriConsumer;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/internal/util/function/TriConsumer;Lcom/android/server/am/AppRestrictionController$$ExternalSyntheticLambda3;
 HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->getReason(Ljava/lang/String;I)I
 HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->getRestrictionLevel(I)I+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/am/AppRestrictionController$RestrictionSettings$PkgSettings;Lcom/android/server/am/AppRestrictionController$RestrictionSettings$PkgSettings;
 HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->getRestrictionLevel(ILjava/lang/String;)I
-HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->loadOneFromXml(Lcom/android/modules/utils/TypedXmlPullParser;J[JZ)V
-HSPLcom/android/server/am/AppRestrictionController$TrackerInfo;-><init>(Lcom/android/server/am/AppRestrictionController;)V
-HSPLcom/android/server/am/AppRestrictionController;->-$$Nest$fgetmAppStateTrackers(Lcom/android/server/am/AppRestrictionController;)Ljava/util/ArrayList;
+HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->loadOneFromXml(Lcom/android/modules/utils/TypedXmlPullParser;J[JZ)V+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;
+HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->update(Ljava/lang/String;IIII)I
 HSPLcom/android/server/am/AppRestrictionController;->-$$Nest$fgetmBgHandler(Lcom/android/server/am/AppRestrictionController;)Lcom/android/server/am/AppRestrictionController$BgHandler;
-HSPLcom/android/server/am/AppRestrictionController;->-$$Nest$fgetmInjector(Lcom/android/server/am/AppRestrictionController;)Lcom/android/server/am/AppRestrictionController$Injector;
-HSPLcom/android/server/am/AppRestrictionController;->-$$Nest$fgetmLock(Lcom/android/server/am/AppRestrictionController;)Ljava/lang/Object;
 HSPLcom/android/server/am/AppRestrictionController;->-$$Nest$fgetmSettingsLock(Lcom/android/server/am/AppRestrictionController;)Ljava/lang/Object;
-HSPLcom/android/server/am/AppRestrictionController;-><clinit>()V
-HSPLcom/android/server/am/AppRestrictionController;-><init>(Landroid/content/Context;Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/AppRestrictionController;-><init>(Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/AppRestrictionController;->applyRestrictionLevel(Ljava/lang/String;IILcom/android/server/am/AppRestrictionController$TrackerInfo;IZII)V
 HSPLcom/android/server/am/AppRestrictionController;->calcAppRestrictionLevel(IILjava/lang/String;IZZ)Landroid/util/Pair;
-HSPLcom/android/server/am/AppRestrictionController;->getBackgroundHandler()Landroid/os/Handler;
+HSPLcom/android/server/am/AppRestrictionController;->dispatchAppRestrictionLevelChanges(ILjava/lang/String;I)V
 HSPLcom/android/server/am/AppRestrictionController;->getBackgroundRestrictionExemptionReason(I)I+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;
-HSPLcom/android/server/am/AppRestrictionController;->getLock()Ljava/lang/Object;
 HSPLcom/android/server/am/AppRestrictionController;->getPotentialSystemExemptionReason(I)I+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;
-HPLcom/android/server/am/AppRestrictionController;->getPotentialSystemExemptionReason(ILjava/lang/String;)I+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Ljava/util/Set;Ljava/util/Collections$EmptySet;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HPLcom/android/server/am/AppRestrictionController;->getPotentialUserAllowedExemptionReason(ILjava/lang/String;)I+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;
+HSPLcom/android/server/am/AppRestrictionController;->getPotentialSystemExemptionReason(ILjava/lang/String;)I+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Ljava/util/Set;Ljava/util/Collections$EmptySet;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;
+HSPLcom/android/server/am/AppRestrictionController;->getPotentialUserAllowedExemptionReason(ILjava/lang/String;)I+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;
 HSPLcom/android/server/am/AppRestrictionController;->getRestrictionLevel(I)I+]Lcom/android/server/am/AppRestrictionController$RestrictionSettings;Lcom/android/server/am/AppRestrictionController$RestrictionSettings;
-HPLcom/android/server/am/AppRestrictionController;->handleAppStandbyBucketChanged(ILjava/lang/String;I)V
+HSPLcom/android/server/am/AppRestrictionController;->getRestrictionLevel(ILjava/lang/String;)I
+HSPLcom/android/server/am/AppRestrictionController;->handleAppStandbyBucketChanged(ILjava/lang/String;I)V
 HSPLcom/android/server/am/AppRestrictionController;->handleUidInactive(IZ)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/AppRestrictionController;->handleUidProcStateChanged(II)V+]Lcom/android/server/am/BaseAppStateTracker;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/am/AppRestrictionController;->hasForegroundServices(Ljava/lang/String;I)Z+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/am/AppFGSTracker;Lcom/android/server/am/AppFGSTracker;
+HSPLcom/android/server/am/AppRestrictionController;->hasForegroundServices(Ljava/lang/String;I)Z
 HSPLcom/android/server/am/AppRestrictionController;->isBgAutoRestrictedBucketFeatureFlagEnabled()Z
-HPLcom/android/server/am/AppRestrictionController;->isCarrierApp(Ljava/lang/String;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;
-HPLcom/android/server/am/AppRestrictionController;->isOnDeviceIdleAllowlist(I)Z
+HSPLcom/android/server/am/AppRestrictionController;->isCarrierApp(Ljava/lang/String;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;
+HSPLcom/android/server/am/AppRestrictionController;->isOnDeviceIdleAllowlist(I)Z
 HSPLcom/android/server/am/AppRestrictionController;->isOnSystemDeviceIdleAllowlist(I)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HPLcom/android/server/am/AppRestrictionController;->isRoleHeldByUid(Ljava/lang/String;I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/am/AppRestrictionController;->isSystemModule(Ljava/lang/String;)Z+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Ljava/io/File;Ljava/io/File;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
-HSPLcom/android/server/am/AppRestrictionController;->lambda$handleUidActive$9(ILcom/android/server/usage/AppStandbyInternal;ILjava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;)V
+HSPLcom/android/server/am/AppRestrictionController;->isRoleHeldByUid(Ljava/lang/String;I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/AppRestrictionController;->isSystemModule(Ljava/lang/String;)Z+]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Ljava/io/File;Ljava/io/File;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/Boolean;Ljava/lang/Boolean;
+HSPLcom/android/server/am/AppRestrictionController;->lambda$handleUidActive$9(ILcom/android/server/usage/AppStandbyInternal;ILjava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;
 HSPLcom/android/server/am/AppRestrictionController;->refreshAppRestrictionLevelForUser(III)V
-HSPLcom/android/server/am/AppStartInfoTracker;-><clinit>()V
-HSPLcom/android/server/am/AppStartInfoTracker;-><init>()V
 HSPLcom/android/server/am/AppStartInfoTracker;->addTimestampToStart(Lcom/android/server/am/ProcessRecord;JI)V
-HSPLcom/android/server/am/AppStartInfoTracker;->addTimestampToStart(Ljava/lang/String;IJI)V
-HSPLcom/android/server/am/AppStartInfoTracker;->init(Lcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/BaseAppStateDurationsTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;Ljava/lang/reflect/Constructor;Ljava/lang/Object;)V
+HSPLcom/android/server/am/AppStartInfoTracker;->addTimestampToStart(Ljava/lang/String;IJI)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;
 HSPLcom/android/server/am/BaseAppStateDurationsTracker;->onUidProcStateChanged(II)V+]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector;]Lcom/android/server/am/BaseAppStateDurationsTracker$SimplePackageDurations;Lcom/android/server/am/BaseAppStateDurationsTracker$UidStateDurations;]Lcom/android/server/am/BaseAppStateEventsTracker;Lcom/android/server/am/AppMediaSessionTracker;,Lcom/android/server/am/AppFGSTracker;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/UidProcessMap;Lcom/android/server/am/UidProcessMap;
-HPLcom/android/server/am/BaseAppStateEvents;->getEarliest(J)J
-HPLcom/android/server/am/BaseAppStateEvents;->getTotalEvents(JI)I
-HSPLcom/android/server/am/BaseAppStateEventsTracker$BaseAppStateEventsPolicy;-><init>(Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateEventsTracker;Ljava/lang/String;ZLjava/lang/String;J)V
+HSPLcom/android/server/am/BaseAppStateEvents;->getEarliest(J)J+]Lcom/android/server/am/BaseAppStateEvents$MaxTrackingDurationConfig;Lcom/android/server/am/AppBroadcastEventsTracker$AppBroadcastEventsPolicy;,Lcom/android/server/am/AppBindServiceEventsTracker$AppBindServiceEventsPolicy;,Lcom/android/server/am/AppMediaSessionTracker$AppMediaSessionPolicy;,Lcom/android/server/am/AppFGSTracker$AppFGSPolicy;
+HSPLcom/android/server/am/BaseAppStateEvents;->getTotalEvents(JI)I+]Lcom/android/server/am/BaseAppStateEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;
 HSPLcom/android/server/am/BaseAppStateEventsTracker$BaseAppStateEventsPolicy;->getMaxTrackingDuration()J
-HSPLcom/android/server/am/BaseAppStateEventsTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;Ljava/lang/reflect/Constructor;Ljava/lang/Object;)V
 HSPLcom/android/server/am/BaseAppStateEventsTracker;->isUidOnTop(I)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/BaseAppStateEventsTracker;->onUidProcStateChanged(II)V+]Lcom/android/server/am/BaseAppStateEventsTracker;Lcom/android/server/am/AppBroadcastEventsTracker;,Lcom/android/server/am/AppBindServiceEventsTracker;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/UidProcessMap;Lcom/android/server/am/UidProcessMap;
-HSPLcom/android/server/am/BaseAppStatePolicy;-><init>(Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker;Ljava/lang/String;Z)V
 HSPLcom/android/server/am/BaseAppStatePolicy;->isEnabled()Z
 HSPLcom/android/server/am/BaseAppStatePolicy;->shouldExemptUid(I)I+]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;
-HPLcom/android/server/am/BaseAppStateTimeSlotEvents;->addEvent(JI)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/am/BaseAppStateEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Ljava/util/LinkedList;Ljava/util/LinkedList;]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;
-HPLcom/android/server/am/BaseAppStateTimeSlotEvents;->getSlotStartTime(J)J
-HPLcom/android/server/am/BaseAppStateTimeSlotEvents;->getTotalEventsSince(JJI)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/LinkedList;Ljava/util/LinkedList;]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Ljava/util/Iterator;Ljava/util/LinkedList$DescendingIterator;
-HPLcom/android/server/am/BaseAppStateTimeSlotEvents;->trimEvents(JI)V+]Ljava/util/LinkedList;Ljava/util/LinkedList;]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;
-HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy;-><init>(Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker;Ljava/lang/String;ZLjava/lang/String;JLjava/lang/String;I)V
-HPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy;->getNumOfEventsThreshold()I
+HSPLcom/android/server/am/BaseAppStateTimeSlotEvents;->addEvent(JI)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/am/BaseAppStateEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Ljava/util/LinkedList;Ljava/util/LinkedList;]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;
+HSPLcom/android/server/am/BaseAppStateTimeSlotEvents;->getSlotStartTime(J)J
+HSPLcom/android/server/am/BaseAppStateTimeSlotEvents;->getTotalEventsSince(JJI)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/LinkedList;Ljava/util/LinkedList;]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Ljava/util/Iterator;Ljava/util/LinkedList$DescendingIterator;
+HSPLcom/android/server/am/BaseAppStateTimeSlotEvents;->trimEvents(JI)V+]Ljava/util/LinkedList;Ljava/util/LinkedList;]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;
+HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy;->getNumOfEventsThreshold()I
 HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy;->shouldExempt(Ljava/lang/String;I)I+]Lcom/android/server/am/BaseAppStateEventsTracker;Lcom/android/server/am/AppBroadcastEventsTracker;,Lcom/android/server/am/AppBindServiceEventsTracker;]Lcom/android/server/am/BaseAppStatePolicy;Lcom/android/server/am/AppBroadcastEventsTracker$AppBroadcastEventsPolicy;,Lcom/android/server/am/AppBindServiceEventsTracker$AppBindServiceEventsPolicy;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;
-HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker$H;-><init>(Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker;)V
 HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker$H;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker;Lcom/android/server/am/AppBroadcastEventsTracker;,Lcom/android/server/am/AppBindServiceEventsTracker;
-HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;Ljava/lang/reflect/Constructor;Ljava/lang/Object;)V
 HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker;->handleNewEvent(Ljava/lang/String;I)V+]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector;]Lcom/android/server/am/BaseAppStateEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy;Lcom/android/server/am/AppBroadcastEventsTracker$AppBroadcastEventsPolicy;,Lcom/android/server/am/AppBindServiceEventsTracker$AppBindServiceEventsPolicy;]Lcom/android/server/am/BaseAppStateEvents$Factory;Lcom/android/server/am/AppBroadcastEventsTracker;,Lcom/android/server/am/AppBindServiceEventsTracker;]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Lcom/android/server/am/UidProcessMap;Lcom/android/server/am/UidProcessMap;
 HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker;->onNewEvent(Ljava/lang/String;I)V+]Landroid/os/Handler;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$H;]Landroid/os/Message;Landroid/os/Message;
-HSPLcom/android/server/am/BaseAppStateTracker$Injector;-><init>()V
 HSPLcom/android/server/am/BaseAppStateTracker$Injector;->getPolicy()Lcom/android/server/am/BaseAppStatePolicy;
-HSPLcom/android/server/am/BaseAppStateTracker$Injector;->setPolicy(Lcom/android/server/am/BaseAppStatePolicy;)V
-HSPLcom/android/server/am/BaseAppStateTracker;-><init>(Landroid/content/Context;Lcom/android/server/am/AppRestrictionController;Ljava/lang/reflect/Constructor;Ljava/lang/Object;)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda100;-><init>(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda100;->run()V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda104;-><init>(Lcom/android/server/am/BatteryStatsService;IIIIIIIIJJJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda104;->run()V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda11;-><init>(Lcom/android/server/am/BatteryStatsService;IIIIIIIIJJJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda11;->run()V
-HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda14;-><init>(Lcom/android/server/am/BatteryStatsService;)V
-HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda15;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V
-HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda16;-><init>(Lcom/android/server/am/BatteryStatsService;)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda17;-><init>(Lcom/android/server/am/BatteryStatsService;IJ[I)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda17;->run()V
 HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda19;-><init>(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V
@@ -1354,21 +1085,19 @@
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda1;->run()V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda20;-><init>(Lcom/android/server/am/BatteryStatsService;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda20;->run()V
+HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda21;-><init>(Lcom/android/server/am/BatteryStatsService;IJIJJ)V
 HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda21;->run()V
-HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda23;-><init>(Lcom/android/server/am/BatteryStatsService;IJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda28;-><init>(Lcom/android/server/am/BatteryStatsService;Ljava/lang/String;Landroid/os/WorkSource;IJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda28;->run()V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda31;-><init>(Lcom/android/server/am/BatteryStatsService;IIJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda31;->run()V
 HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda32;-><init>(Lcom/android/server/am/BatteryStatsService;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;ILandroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V
 HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda32;->run()V
-HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda33;-><init>(Lcom/android/server/am/BatteryStatsService;)V
-HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda33;->run()V
-HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda34;-><init>(Lcom/android/server/am/BatteryStatsService;IJJ)V
-HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda35;-><init>(Lcom/android/server/am/BatteryStatsService;Ljava/lang/String;IJJ)V
-HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda35;->run()V
-HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda38;-><init>(Lcom/android/server/am/BatteryStatsService;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V
-HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda38;->run()V
+HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda35;-><init>(Lcom/android/server/am/BatteryStatsService;Ljava/lang/String;IJJ)V
+HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda35;->run()V
+HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda38;-><init>(Lcom/android/server/am/BatteryStatsService;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V
+HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda38;->run()V
+HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda54;-><init>(Lcom/android/server/am/BatteryStatsService;Ljava/lang/String;IJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda54;->run()V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda55;-><init>(Lcom/android/server/am/BatteryStatsService;IIJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda55;->run()V
@@ -1378,9 +1107,6 @@
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda61;->run()V
 HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda68;-><init>(Lcom/android/server/am/BatteryStatsService;Ljava/lang/String;IIJJ)V
 HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda68;->run()V
-HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda71;-><init>(Lcom/android/server/am/BatteryStatsService;Landroid/telephony/SignalStrength;JJ)V
-HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda73;-><init>(Lcom/android/server/am/BatteryStatsService;II)V
-HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda74;-><init>(Lcom/android/server/am/BatteryStatsService;IZIIIJJ)V
 HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda74;->run()V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda77;-><init>(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;IJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda77;->run()V
@@ -1389,81 +1115,63 @@
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda80;->run()V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda82;-><init>(Lcom/android/server/am/BatteryStatsService;IIJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda82;->run()V
-HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda83;-><init>(Ljava/util/concurrent/CountDownLatch;)V
-HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda83;->run()V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda84;-><init>(Lcom/android/server/am/BatteryStatsService;Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;JJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda84;->run()V
-HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda93;-><init>(Lcom/android/server/am/BatteryStatsService;IJJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda98;-><init>(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda98;->run()V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda9;-><init>(Lcom/android/server/am/BatteryStatsService;IILjava/lang/String;Ljava/lang/String;IJJ)V
 HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda9;->run()V
-HSPLcom/android/server/am/BatteryStatsService$1;-><init>(Lcom/android/server/am/BatteryStatsService;)V
-HSPLcom/android/server/am/BatteryStatsService$2;-><init>(Lcom/android/server/am/BatteryStatsService;)V
-HSPLcom/android/server/am/BatteryStatsService$3;-><init>(Lcom/android/server/am/BatteryStatsService;)V
 HPLcom/android/server/am/BatteryStatsService$LocalService$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V
 HPLcom/android/server/am/BatteryStatsService$LocalService$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/lang/Long;Ljava/lang/Long;
-HSPLcom/android/server/am/BatteryStatsService$LocalService;-><init>(Lcom/android/server/am/BatteryStatsService;)V
-HSPLcom/android/server/am/BatteryStatsService$LocalService;-><init>(Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService$LocalService-IA;)V
 HPLcom/android/server/am/BatteryStatsService$LocalService;->noteBinderCallStats(IJLjava/util/Collection;)V+]Landroid/os/Handler;Landroid/os/Handler;
 HPLcom/android/server/am/BatteryStatsService$LocalService;->noteCpuWakingNetworkPacket(Landroid/net/Network;JI)V
-HSPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;-><init>(Lcom/android/server/am/BatteryStatsService;)V
 HSPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;->run()V
 HSPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;->waitWakeup()Ljava/lang/String;+]Ljava/nio/CharBuffer;Ljava/nio/HeapCharBuffer;]Ljava/nio/ByteBuffer;Ljava/nio/DirectByteBuffer;]Ljava/nio/charset/CharsetDecoder;Lcom/android/icu/charset/CharsetDecoderICU;
 HSPLcom/android/server/am/BatteryStatsService;->$r8$lambda$5c9rjGQgA92fhsoBQw9Y09QbGbc(Lcom/android/server/am/BatteryStatsService;IILjava/lang/String;Ljava/lang/String;IZJJ)V
 HSPLcom/android/server/am/BatteryStatsService;->$r8$lambda$66TrSI7HPB2r78-NHdlVdzcoo0I(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V
-HSPLcom/android/server/am/BatteryStatsService;->$r8$lambda$HPK3ieJxw8HM__PfnZB13lFXngg(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V
 HSPLcom/android/server/am/BatteryStatsService;->$r8$lambda$QChUd1G6g1_FJ1G5zg2vCcUJr6g(Lcom/android/server/am/BatteryStatsService;IIJJ)V
-HPLcom/android/server/am/BatteryStatsService;->$r8$lambda$S2EACvTzdacLK36CDf9BLXIiBdE(Lcom/android/server/am/BatteryStatsService;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V
+HSPLcom/android/server/am/BatteryStatsService;->$r8$lambda$S2EACvTzdacLK36CDf9BLXIiBdE(Lcom/android/server/am/BatteryStatsService;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V
 HSPLcom/android/server/am/BatteryStatsService;->$r8$lambda$TItPRlBD8FUMtanBE_REU0Bc7wI(Lcom/android/server/am/BatteryStatsService;IILjava/lang/String;Ljava/lang/String;IJJ)V
 HSPLcom/android/server/am/BatteryStatsService;->$r8$lambda$VOEBeS3jOU02rZfcXEfni9PuRDQ(Lcom/android/server/am/BatteryStatsService;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V
-HPLcom/android/server/am/BatteryStatsService;->$r8$lambda$ZbDBcGr7GIjhlP9uVlhIJ6H-yI0(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V
-HSPLcom/android/server/am/BatteryStatsService;->$r8$lambda$hQPDLi0WrcPIkhfpv4ZQEEC1HwU(Lcom/android/server/am/BatteryStatsService;)V
-HPLcom/android/server/am/BatteryStatsService;->-$$Nest$fgetmHandler(Lcom/android/server/am/BatteryStatsService;)Landroid/os/Handler;
+HSPLcom/android/server/am/BatteryStatsService;->$r8$lambda$ZbDBcGr7GIjhlP9uVlhIJ6H-yI0(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V
 HSPLcom/android/server/am/BatteryStatsService;->-$$Nest$fgetmLock(Lcom/android/server/am/BatteryStatsService;)Ljava/lang/Object;
 HSPLcom/android/server/am/BatteryStatsService;->-$$Nest$smnativeWaitWakeup(Ljava/nio/ByteBuffer;)I
 HSPLcom/android/server/am/BatteryStatsService;-><init>(Landroid/content/Context;Ljava/io/File;)V
 HPLcom/android/server/am/BatteryStatsService;->awaitCompletion()V+]Landroid/os/Handler;Landroid/os/Handler;]Ljava/util/concurrent/CountDownLatch;Ljava/util/concurrent/CountDownLatch;
-HSPLcom/android/server/am/BatteryStatsService;->create(Landroid/content/Context;Ljava/io/File;Landroid/os/Handler;Lcom/android/server/power/stats/BatteryStatsImpl$BatteryCallback;)Lcom/android/server/am/BatteryStatsService;
-HSPLcom/android/server/am/BatteryStatsService;->createAggregatedPowerStatsConfig()Lcom/android/server/power/stats/AggregatedPowerStatsConfig;
-HSPLcom/android/server/am/BatteryStatsService;->createPowerStatsScheduler(Landroid/content/Context;)Lcom/android/server/power/stats/PowerStatsScheduler;
 HSPLcom/android/server/am/BatteryStatsService;->fillLowPowerStats(Lcom/android/internal/os/RpmStats;)V+]Lcom/android/internal/os/RpmStats$PowerStateSubsystem;Lcom/android/internal/os/RpmStats$PowerStateSubsystem;]Lcom/android/internal/os/RpmStats;Lcom/android/internal/os/RpmStats;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;]Landroid/power/PowerStatsInternal;Lcom/android/server/powerstats/PowerStatsService$LocalService;]Ljava/util/Map;Ljava/util/HashMap;
-HSPLcom/android/server/am/BatteryStatsService;->fillRailDataStats(Lcom/android/internal/os/RailStats;)V
-HSPLcom/android/server/am/BatteryStatsService;->getActiveStatistics()Lcom/android/server/power/stats/BatteryStatsImpl;
 HPLcom/android/server/am/BatteryStatsService;->getHealthStatsForUidLocked(I)Landroid/os/health/HealthStatsParceler;
 HSPLcom/android/server/am/BatteryStatsService;->getSubsystemLowPowerStats()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;]Landroid/power/PowerStatsInternal;Lcom/android/server/powerstats/PowerStatsService$LocalService;]Ljava/util/Map;Ljava/util/HashMap;
-HSPLcom/android/server/am/BatteryStatsService;->initPowerManagement()V
-HSPLcom/android/server/am/BatteryStatsService;->lambda$noteAlarmFinish$22(Ljava/lang/String;Landroid/os/WorkSource;IJJ)V
-HSPLcom/android/server/am/BatteryStatsService;->lambda$noteAlarmStart$21(Ljava/lang/String;Landroid/os/WorkSource;IJJ)V
-HPLcom/android/server/am/BatteryStatsService;->lambda$noteChangeWakelockFromSource$26(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;ILandroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V
-HSPLcom/android/server/am/BatteryStatsService;->lambda$noteEvent$14(ILjava/lang/String;IJJ)V
-HPLcom/android/server/am/BatteryStatsService;->lambda$noteJobFinish$18(Ljava/lang/String;IIJJ)V
-HPLcom/android/server/am/BatteryStatsService;->lambda$noteJobStart$17(Ljava/lang/String;IJJ)V
-HSPLcom/android/server/am/BatteryStatsService;->lambda$noteServiceStartLaunch$105(ILjava/lang/String;Ljava/lang/String;JJ)V
-HSPLcom/android/server/am/BatteryStatsService;->lambda$noteServiceStartRunning$103(ILjava/lang/String;Ljava/lang/String;JJ)V
-HPLcom/android/server/am/BatteryStatsService;->lambda$noteServiceStopLaunch$106(ILjava/lang/String;Ljava/lang/String;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;
-HPLcom/android/server/am/BatteryStatsService;->lambda$noteServiceStopRunning$104(ILjava/lang/String;Ljava/lang/String;JJ)V
-HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStartSensor$32(IIJJ)V
-HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStartWakelock$23(IILjava/lang/String;Ljava/lang/String;IZJJ)V
-HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStartWakelockFromSource$25(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V
-HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStopSensor$33(IIJJ)V
-HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStopWakelock$24(IILjava/lang/String;Ljava/lang/String;IJJ)V
-HPLcom/android/server/am/BatteryStatsService;->lambda$noteStopWakelockFromSource$27(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V
+HSPLcom/android/server/am/BatteryStatsService;->isCharging()Z+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteAlarmFinish$22(Ljava/lang/String;Landroid/os/WorkSource;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteAlarmStart$21(Ljava/lang/String;Landroid/os/WorkSource;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HPLcom/android/server/am/BatteryStatsService;->lambda$noteChangeWakelockFromSource$26(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;ILandroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteEvent$14(ILjava/lang/String;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HPLcom/android/server/am/BatteryStatsService;->lambda$noteJobFinish$18(Ljava/lang/String;IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteJobStart$17(Ljava/lang/String;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteServiceStartLaunch$105(ILjava/lang/String;Ljava/lang/String;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteServiceStartRunning$103(ILjava/lang/String;Ljava/lang/String;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteServiceStopLaunch$106(ILjava/lang/String;Ljava/lang/String;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteServiceStopRunning$104(ILjava/lang/String;Ljava/lang/String;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStartSensor$32(IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStartWakelock$23(IILjava/lang/String;Ljava/lang/String;IZJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStartWakelockFromSource$25(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStopSensor$33(IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStopWakelock$24(IILjava/lang/String;Ljava/lang/String;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStopWakelockFromSource$27(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
 HSPLcom/android/server/am/BatteryStatsService;->lambda$noteUidProcessState$13(IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/wakeups/CpuWakeupStats;Lcom/android/server/power/stats/wakeups/CpuWakeupStats;
 HSPLcom/android/server/am/BatteryStatsService;->lambda$noteUserActivity$40(IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
-HPLcom/android/server/am/BatteryStatsService;->lambda$noteWifiRadioPowerState$64(IJIJJ)V
-HSPLcom/android/server/am/BatteryStatsService;->lambda$scheduleWriteToDisk$5()V
+HPLcom/android/server/am/BatteryStatsService;->lambda$noteWifiRadioPowerState$64(IJIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryExternalStatsWorker;Lcom/android/server/power/stats/BatteryExternalStatsWorker;
 HSPLcom/android/server/am/BatteryStatsService;->lambda$setBatteryState$96(IIIIIIIIJJJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryExternalStatsWorker;Lcom/android/server/power/stats/BatteryExternalStatsWorker;
 HSPLcom/android/server/am/BatteryStatsService;->lambda$setBatteryState$97(IIIIIIIIJJJJ)V+]Lcom/android/server/power/stats/BatteryExternalStatsWorker;Lcom/android/server/power/stats/BatteryExternalStatsWorker;
 HPLcom/android/server/am/BatteryStatsService;->monitor()V
-HSPLcom/android/server/am/BatteryStatsService;->noteAlarmFinish(Ljava/lang/String;Landroid/os/WorkSource;I)V
-HSPLcom/android/server/am/BatteryStatsService;->noteAlarmStart(Ljava/lang/String;Landroid/os/WorkSource;I)V
+HSPLcom/android/server/am/BatteryStatsService;->noteAlarmFinish(Ljava/lang/String;Landroid/os/WorkSource;I)V+]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/am/BatteryStatsService;->noteAlarmStart(Ljava/lang/String;Landroid/os/WorkSource;I)V+]Landroid/content/Context;Landroid/app/ContextImpl;
+HPLcom/android/server/am/BatteryStatsService;->noteBleScanResults(Landroid/os/WorkSource;I)V
 HPLcom/android/server/am/BatteryStatsService;->noteChangeWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;ILandroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZ)V
 HSPLcom/android/server/am/BatteryStatsService;->noteCpuWakingActivity(IJ[I)V
 HSPLcom/android/server/am/BatteryStatsService;->noteEvent(ILjava/lang/String;I)V
-HPLcom/android/server/am/BatteryStatsService;->noteJobFinish(Ljava/lang/String;II)V
-HPLcom/android/server/am/BatteryStatsService;->noteJobStart(Ljava/lang/String;I)V
-HPLcom/android/server/am/BatteryStatsService;->notePhoneDataConnectionState(IZIII)V
+HPLcom/android/server/am/BatteryStatsService;->noteJobFinish(Ljava/lang/String;II)V+]Landroid/os/Handler;Landroid/os/Handler;
+HSPLcom/android/server/am/BatteryStatsService;->noteJobStart(Ljava/lang/String;I)V+]Landroid/os/Handler;Landroid/os/Handler;
 HPLcom/android/server/am/BatteryStatsService;->notePhoneSignalStrength(Landroid/telephony/SignalStrength;)V
 HSPLcom/android/server/am/BatteryStatsService;->noteProcessDied(II)V
 HSPLcom/android/server/am/BatteryStatsService;->noteProcessFinish(Ljava/lang/String;I)V
@@ -1472,43 +1180,35 @@
 HSPLcom/android/server/am/BatteryStatsService;->noteScreenState(I)V
 HSPLcom/android/server/am/BatteryStatsService;->noteServiceStartLaunch(ILjava/lang/String;Ljava/lang/String;)V+]Landroid/os/Handler;Landroid/os/Handler;
 HSPLcom/android/server/am/BatteryStatsService;->noteServiceStartRunning(ILjava/lang/String;Ljava/lang/String;)V+]Landroid/os/Handler;Landroid/os/Handler;
-HPLcom/android/server/am/BatteryStatsService;->noteServiceStopLaunch(ILjava/lang/String;Ljava/lang/String;)V+]Landroid/os/Handler;Landroid/os/Handler;
-HPLcom/android/server/am/BatteryStatsService;->noteServiceStopRunning(ILjava/lang/String;Ljava/lang/String;)V
+HSPLcom/android/server/am/BatteryStatsService;->noteServiceStopLaunch(ILjava/lang/String;Ljava/lang/String;)V+]Landroid/os/Handler;Landroid/os/Handler;
+HSPLcom/android/server/am/BatteryStatsService;->noteServiceStopRunning(ILjava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/am/BatteryStatsService;->noteStartSensor(II)V
 HSPLcom/android/server/am/BatteryStatsService;->noteStartWakelock(IILjava/lang/String;Ljava/lang/String;IZ)V+]Landroid/os/Handler;Landroid/os/Handler;
 HSPLcom/android/server/am/BatteryStatsService;->noteStartWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZ)V+]Landroid/os/Handler;Landroid/os/Handler;
 HSPLcom/android/server/am/BatteryStatsService;->noteStopSensor(II)V
 HSPLcom/android/server/am/BatteryStatsService;->noteStopWakelock(IILjava/lang/String;Ljava/lang/String;I)V+]Landroid/os/Handler;Landroid/os/Handler;
-HPLcom/android/server/am/BatteryStatsService;->noteStopWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;I)V+]Landroid/os/Handler;Landroid/os/Handler;
+HSPLcom/android/server/am/BatteryStatsService;->noteStopWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;I)V+]Landroid/os/Handler;Landroid/os/Handler;
 HSPLcom/android/server/am/BatteryStatsService;->noteUidProcessState(II)V+]Landroid/os/Handler;Landroid/os/Handler;
 HSPLcom/android/server/am/BatteryStatsService;->noteUserActivity(II)V+]Landroid/os/Handler;Landroid/os/Handler;
 HPLcom/android/server/am/BatteryStatsService;->noteVibratorOff(I)V
 HPLcom/android/server/am/BatteryStatsService;->noteVibratorOn(IJ)V
-HSPLcom/android/server/am/BatteryStatsService;->noteWakupAlarm(Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;)V
+HSPLcom/android/server/am/BatteryStatsService;->noteWakupAlarm(Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/am/BatteryStatsService;->noteWifiRadioPowerState(IJI)V
-HSPLcom/android/server/am/BatteryStatsService;->publish()V
-HSPLcom/android/server/am/BatteryStatsService;->scheduleWriteToDisk()V
 HSPLcom/android/server/am/BatteryStatsService;->setBatteryState(IIIIIIIIJ)V+]Landroid/os/Handler;Landroid/os/Handler;
 HPLcom/android/server/am/BatteryStatsService;->takeUidSnapshot(I)Landroid/os/health/HealthStatsParceler;
-HPLcom/android/server/am/BatteryStatsService;->updateBatteryStatsOnActivityUsage(Ljava/lang/String;Ljava/lang/String;IIZ)V
-HSPLcom/android/server/am/BroadcastConstants;-><clinit>()V
+HSPLcom/android/server/am/BatteryStatsService;->updateBatteryStatsOnActivityUsage(Ljava/lang/String;Ljava/lang/String;IIZ)V
 HSPLcom/android/server/am/BroadcastConstants;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/am/BroadcastConstants;->getDeviceConfigBoolean(Ljava/lang/String;Z)Z
 HSPLcom/android/server/am/BroadcastConstants;->getDeviceConfigInt(Ljava/lang/String;I)I
-HSPLcom/android/server/am/BroadcastConstants;->getDeviceConfigLong(Ljava/lang/String;J)J
-HSPLcom/android/server/am/BroadcastConstants;->getMaxRunningQueues()I
 HSPLcom/android/server/am/BroadcastConstants;->propertyFor(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/am/BroadcastConstants;->propertyOverrideFor(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/am/BroadcastConstants;->updateDeviceConfigConstants()V
 HSPLcom/android/server/am/BroadcastFilter;-><init>(Landroid/content/IntentFilter;Lcom/android/server/am/ReceiverList;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIZZZ)V
-HSPLcom/android/server/am/BroadcastHistory;-><init>(Lcom/android/server/am/BroadcastConstants;)V
 HSPLcom/android/server/am/BroadcastHistory;->addBroadcastToHistoryLocked(Lcom/android/server/am/BroadcastRecord;)V+]Lcom/android/server/am/BroadcastHistory;Lcom/android/server/am/BroadcastHistory;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;
-HSPLcom/android/server/am/BroadcastHistory;->onBroadcastEnqueuedLocked(Lcom/android/server/am/BroadcastRecord;)V
+HSPLcom/android/server/am/BroadcastHistory;->onBroadcastEnqueuedLocked(Lcom/android/server/am/BroadcastRecord;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/BroadcastHistory;->onBroadcastFinishedLocked(Lcom/android/server/am/BroadcastRecord;)V+]Lcom/android/server/am/BroadcastHistory;Lcom/android/server/am/BroadcastHistory;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/BroadcastHistory;->ringAdvance(III)I
 HSPLcom/android/server/am/BroadcastLoopers;->addMyLooper()V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/Looper;Landroid/os/Looper;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/BroadcastProcessQueue;-><init>(Lcom/android/server/am/BroadcastConstants;Ljava/lang/String;I)V
-HSPLcom/android/server/am/BroadcastProcessQueue;->assertHealthLocked()V
+HSPLcom/android/server/am/BroadcastProcessQueue;->assertHealthLocked()V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
 HSPLcom/android/server/am/BroadcastProcessQueue;->assertHealthLocked(Ljava/util/ArrayDeque;)V+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/Iterator;Ljava/util/ArrayDeque$DescendingIterator;
 HSPLcom/android/server/am/BroadcastProcessQueue;->enqueueOrReplaceBroadcast(Lcom/android/server/am/BroadcastRecord;ILcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;)Lcom/android/server/am/BroadcastRecord;+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda15;
 HSPLcom/android/server/am/BroadcastProcessQueue;->forEachMatchingBroadcast(Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate;Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Z)Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
@@ -1519,7 +1219,7 @@
 HSPLcom/android/server/am/BroadcastProcessQueue;->getActiveIndex()I
 HSPLcom/android/server/am/BroadcastProcessQueue;->getActiveViaColdStart()Z
 HSPLcom/android/server/am/BroadcastProcessQueue;->getActiveWasStopped()Z
-HPLcom/android/server/am/BroadcastProcessQueue;->getPreferredSchedulingGroupLocked()I
+HSPLcom/android/server/am/BroadcastProcessQueue;->getPreferredSchedulingGroupLocked()I
 HSPLcom/android/server/am/BroadcastProcessQueue;->getQueueForBroadcast(Lcom/android/server/am/BroadcastRecord;)Ljava/util/ArrayDeque;+]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;
 HSPLcom/android/server/am/BroadcastProcessQueue;->getRunnableAt()J+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
 HSPLcom/android/server/am/BroadcastProcessQueue;->insertIntoRunnableList(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;)Lcom/android/server/am/BroadcastProcessQueue;+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
@@ -1532,7 +1232,7 @@
 HSPLcom/android/server/am/BroadcastProcessQueue;->isProcessWarm()Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/BroadcastProcessQueue;->isQueueEmpty(Ljava/util/ArrayDeque;)Z+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;
 HSPLcom/android/server/am/BroadcastProcessQueue;->isRunnable()Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
-HSPLcom/android/server/am/BroadcastProcessQueue;->makeActiveIdle()V
+HSPLcom/android/server/am/BroadcastProcessQueue;->makeActiveIdle()V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
 HSPLcom/android/server/am/BroadcastProcessQueue;->makeActiveNextPending()V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;
 HSPLcom/android/server/am/BroadcastProcessQueue;->onBroadcastDequeued(Lcom/android/server/am/BroadcastRecord;I)V+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;
 HSPLcom/android/server/am/BroadcastProcessQueue;->onBroadcastEnqueued(Lcom/android/server/am/BroadcastRecord;I)V+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;
@@ -1542,7 +1242,7 @@
 HSPLcom/android/server/am/BroadcastProcessQueue;->queueForNextBroadcast(Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;II)Ljava/util/ArrayDeque;+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;
 HSPLcom/android/server/am/BroadcastProcessQueue;->removeFromRunnableList(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;)Lcom/android/server/am/BroadcastProcessQueue;
 HSPLcom/android/server/am/BroadcastProcessQueue;->removeNextBroadcast()Lcom/android/internal/os/SomeArgs;+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
-HSPLcom/android/server/am/BroadcastProcessQueue;->replaceBroadcastInQueue(Ljava/util/ArrayDeque;Lcom/android/server/am/BroadcastRecord;I)Lcom/android/server/am/BroadcastRecord;+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayDeque$DescendingIterator;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/am/BroadcastProcessQueue;->replaceBroadcastInQueue(Ljava/util/ArrayDeque;Lcom/android/server/am/BroadcastRecord;I)Lcom/android/server/am/BroadcastRecord;+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayDeque$DescendingIterator;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;
 HSPLcom/android/server/am/BroadcastProcessQueue;->setProcessAndUidState(Lcom/android/server/am/ProcessRecord;ZZ)Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/BroadcastProcessQueue;->setProcessFreezable(Z)Z
 HSPLcom/android/server/am/BroadcastProcessQueue;->setProcessInstrumented(Z)Z
@@ -1553,35 +1253,23 @@
 HSPLcom/android/server/am/BroadcastProcessQueue;->timeoutScheduled()Z
 HSPLcom/android/server/am/BroadcastProcessQueue;->toShortString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/BroadcastProcessQueue;->traceActiveBegin()V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;
-HSPLcom/android/server/am/BroadcastProcessQueue;->traceActiveEnd()V
+HSPLcom/android/server/am/BroadcastProcessQueue;->traceActiveEnd()V+]Ljava/lang/Object;Lcom/android/server/am/BroadcastProcessQueue;
 HSPLcom/android/server/am/BroadcastProcessQueue;->traceProcessEnd()V+]Ljava/lang/Object;Lcom/android/server/am/BroadcastProcessQueue;
 HSPLcom/android/server/am/BroadcastProcessQueue;->traceProcessRunningBegin()V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
 HSPLcom/android/server/am/BroadcastProcessQueue;->traceProcessStartingBegin()V
 HSPLcom/android/server/am/BroadcastProcessQueue;->updateDeferredStates(Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
 HSPLcom/android/server/am/BroadcastProcessQueue;->updateRunnableAt()V+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
-HSPLcom/android/server/am/BroadcastQueue;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;Ljava/lang/String;Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastHistory;)V
 HSPLcom/android/server/am/BroadcastQueue;->traceBegin(Ljava/lang/String;)I+]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/am/BroadcastQueue;->traceEnd(I)V
-HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda12;-><init>(Lcom/android/server/am/BroadcastQueueModernImpl;)V
 HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda12;->handleMessage(Landroid/os/Message;)Z
-HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda13;-><init>(Lcom/android/server/am/BroadcastQueueModernImpl;)V
-HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda14;-><init>(Lcom/android/server/am/BroadcastQueueModernImpl;)V
-HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda15;-><init>(Lcom/android/server/am/BroadcastQueueModernImpl;)V
-HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda16;-><init>(Lcom/android/server/am/BroadcastQueueModernImpl;)V
-HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda6;-><init>()V
 HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda6;->test(Ljava/lang/Object;)Z
-HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda7;-><init>()V
 HSPLcom/android/server/am/BroadcastQueueModernImpl$1;->onUidStateChanged(IIJI)V
-HSPLcom/android/server/am/BroadcastQueueModernImpl$BroadcastAnrTimer;-><init>(Lcom/android/server/am/BroadcastQueueModernImpl;Landroid/os/Handler;)V
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->$r8$lambda$d79aYiK04-SKNC9AXzRIc2ug0aQ(Lcom/android/server/am/BroadcastQueueModernImpl;Landroid/os/Message;)Z+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->$r8$lambda$hPIdd26uRdf2eZATmbOexHo1U30(Lcom/android/server/am/BroadcastProcessQueue;)Z
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->$r8$lambda$wimp7yt_FsAyLko1-wOxiCNCaqo(Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastRecord;Landroid/util/ArrayMap;Lcom/android/server/am/BroadcastRecord;I)Z+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;
-HSPLcom/android/server/am/BroadcastQueueModernImpl;-><clinit>()V
-HSPLcom/android/server/am/BroadcastQueueModernImpl;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;Lcom/android/server/am/BroadcastConstants;Lcom/android/server/am/BroadcastConstants;)V
-HSPLcom/android/server/am/BroadcastQueueModernImpl;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;Lcom/android/server/am/BroadcastConstants;Lcom/android/server/am/BroadcastConstants;Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastHistory;)V
-HSPLcom/android/server/am/BroadcastQueueModernImpl;->applyDeliveryGroupPolicy(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/am/BroadcastQueueModernImpl;->applyDeliveryGroupPolicy(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->assertHealthLocked()V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;
-HPLcom/android/server/am/BroadcastQueueModernImpl;->cancelDeliveryTimeoutLocked(Lcom/android/server/am/BroadcastProcessQueue;)V
+HSPLcom/android/server/am/BroadcastQueueModernImpl;->cancelDeliveryTimeoutLocked(Lcom/android/server/am/BroadcastProcessQueue;)V+]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/BroadcastQueueModernImpl$BroadcastAnrTimer;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->checkAndRemoveWaitingFor()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->checkPendingColdStartValidityLocked()V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->demoteFromRunningLocked(Lcom/android/server/am/BroadcastProcessQueue;)V+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
@@ -1589,7 +1277,7 @@
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->enqueueBroadcastLocked(Lcom/android/server/am/BroadcastRecord;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastSkipPolicy;]Ljava/util/List;Ljava/util/ImmutableCollections$ListN;,Ljava/util/ArrayList;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastHistory;Lcom/android/server/am/BroadcastHistory;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->enqueueUpdateRunningList()V+]Landroid/os/Handler;Landroid/os/Handler;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->finishReceiverActiveLocked(Lcom/android/server/am/BroadcastProcessQueue;ILjava/lang/String;)V+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/BroadcastQueueModernImpl$BroadcastAnrTimer;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HPLcom/android/server/am/BroadcastQueueModernImpl;->finishReceiverLocked(Lcom/android/server/am/ProcessRecord;ILjava/lang/String;Landroid/os/Bundle;ZZ)Z+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/am/BroadcastQueueModernImpl;->finishReceiverLocked(Lcom/android/server/am/ProcessRecord;ILjava/lang/String;Landroid/os/Bundle;ZZ)Z+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->forEachMatchingBroadcast(Ljava/util/function/Predicate;Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate;Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Z)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/function/Predicate;Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda2;,Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda6;,Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda5;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->getDeliveryState(Lcom/android/server/am/BroadcastRecord;I)I+]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->getOrCreateProcessQueue(Ljava/lang/String;I)Lcom/android/server/am/BroadcastProcessQueue;+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
@@ -1600,25 +1288,24 @@
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->getRunningIndexOf(Lcom/android/server/am/BroadcastProcessQueue;)I
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->getRunningSize()I
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->getRunningUrgentCount()I+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;
-HSPLcom/android/server/am/BroadcastQueueModernImpl;->isPendingColdStartValid()Z
+HSPLcom/android/server/am/BroadcastQueueModernImpl;->isPendingColdStartValid()Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->isProcessFreezable(Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->lambda$applyDeliveryGroupPolicy$3(Lcom/android/server/am/BroadcastRecord;Landroid/util/ArrayMap;Lcom/android/server/am/BroadcastRecord;I)Z+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->lambda$new$0(Landroid/os/Message;)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
-HPLcom/android/server/am/BroadcastQueueModernImpl;->lambda$new$12(Lcom/android/server/am/BroadcastRecord;I)V
-HSPLcom/android/server/am/BroadcastQueueModernImpl;->lambda$static$8(Lcom/android/server/am/BroadcastProcessQueue;)Z
+HPLcom/android/server/am/BroadcastQueueModernImpl;->lambda$new$12(Lcom/android/server/am/BroadcastRecord;I)V+]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->logBroadcastDeliveryEventReported(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;ILjava/lang/Object;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyFinishBroadcast(Lcom/android/server/am/BroadcastRecord;)V+]Ljava/util/List;Ljava/util/ImmutableCollections$ListN;,Ljava/util/ArrayList;]Lcom/android/server/am/BroadcastHistory;Lcom/android/server/am/BroadcastHistory;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyFinishReceiver(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;ILjava/lang/Object;)V
-HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyScheduleReceiver(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;Landroid/content/pm/ResolveInfo;)V+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyFinishReceiver(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;ILjava/lang/Object;)V+]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyScheduleReceiver(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;Landroid/content/pm/ResolveInfo;)V+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyScheduleRegisteredReceiver(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastFilter;)V+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyStartedRunning(Lcom/android/server/am/BroadcastProcessQueue;)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/am/ProcessReceiverRecord;Lcom/android/server/am/ProcessReceiverRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyStoppedRunning(Lcom/android/server/am/BroadcastProcessQueue;)V
-HSPLcom/android/server/am/BroadcastQueueModernImpl;->onApplicationAttachedLocked(Lcom/android/server/am/ProcessRecord;)Z
-HSPLcom/android/server/am/BroadcastQueueModernImpl;->onApplicationCleanupLocked(Lcom/android/server/am/ProcessRecord;)V
-HPLcom/android/server/am/BroadcastQueueModernImpl;->onProcessFreezableChangedLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message;
+HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyStoppedRunning(Lcom/android/server/am/BroadcastProcessQueue;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/BroadcastQueueModernImpl;->onApplicationAttachedLocked(Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/BroadcastQueueModernImpl;->onApplicationCleanupLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
+HSPLcom/android/server/am/BroadcastQueueModernImpl;->onProcessFreezableChangedLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->promoteToRunningLocked(Lcom/android/server/am/BroadcastProcessQueue;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->refreshProcessQueuesLocked(I)V
-HPLcom/android/server/am/BroadcastQueueModernImpl;->removeProcessQueue(Ljava/lang/String;I)Lcom/android/server/am/BroadcastProcessQueue;
+HPLcom/android/server/am/BroadcastQueueModernImpl;->removeProcessQueue(Ljava/lang/String;I)Lcom/android/server/am/BroadcastProcessQueue;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->reportUsageStatsBroadcastDispatched(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;)V+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->scheduleReceiverColdLocked(Lcom/android/server/am/BroadcastProcessQueue;)Z
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->scheduleReceiverWarmLocked(Lcom/android/server/am/BroadcastProcessQueue;)Z+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;
@@ -1633,10 +1320,9 @@
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->updateRunningList()V
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->updateRunningListLocked()V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/BroadcastQueueModernImpl;->updateWarmProcess(Lcom/android/server/am/BroadcastProcessQueue;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/BroadcastRecord;-><clinit>()V
 HSPLcom/android/server/am/BroadcastRecord;-><init>(Lcom/android/server/am/BroadcastQueue;Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;IIZLjava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/app/BroadcastOptions;Ljava/util/List;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;ZZZIILandroid/app/BackgroundStartPrivileges;ZLjava/util/function/BiFunction;I)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/BroadcastRecord;-><init>(Lcom/android/server/am/BroadcastQueue;Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;IIZLjava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/app/BroadcastOptions;Ljava/util/List;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;ZZZILandroid/app/BackgroundStartPrivileges;ZLjava/util/function/BiFunction;I)V
-HPLcom/android/server/am/BroadcastRecord;-><init>(Lcom/android/server/am/BroadcastRecord;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/am/BroadcastRecord;-><init>(Lcom/android/server/am/BroadcastRecord;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/BroadcastRecord;->applySingletonPolicy(Lcom/android/server/am/ActivityManagerService;)V+]Ljava/util/List;Ljava/util/ImmutableCollections$ListN;,Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/BroadcastRecord;->areMatchingKeysEqual(Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;)Z
 HSPLcom/android/server/am/BroadcastRecord;->calculateBlockedUntilBeyondCount(Ljava/util/List;Z)[I+]Ljava/util/List;Ljava/util/ImmutableCollections$ListN;,Ljava/util/ArrayList;
@@ -1650,7 +1336,7 @@
 HSPLcom/android/server/am/BroadcastRecord;->getDeliveryGroupMatchingNamespaceFragment(Lcom/android/server/am/BroadcastRecord;)Ljava/lang/String;+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;
 HSPLcom/android/server/am/BroadcastRecord;->getDeliveryGroupPolicy()I+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;
 HSPLcom/android/server/am/BroadcastRecord;->getDeliveryState(I)I
-HSPLcom/android/server/am/BroadcastRecord;->getReceiverIntent(Ljava/lang/Object;)Landroid/content/Intent;+]Ljava/util/function/BiFunction;Lcom/android/server/om/OverlayManagerService$$ExternalSyntheticLambda4;,Lcom/android/server/pm/BroadcastHelper$$ExternalSyntheticLambda8;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/am/BroadcastRecord;->getReceiverIntent(Ljava/lang/Object;)Landroid/content/Intent;+]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/content/Intent;Landroid/content/Intent;]Ljava/util/function/BiFunction;Lcom/android/server/om/OverlayManagerService$$ExternalSyntheticLambda4;,Lcom/android/server/pm/BroadcastHelper$$ExternalSyntheticLambda8;
 HSPLcom/android/server/am/BroadcastRecord;->getReceiverPriority(Ljava/lang/Object;)I+]Landroid/content/IntentFilter;Lcom/android/server/am/BroadcastFilter;
 HSPLcom/android/server/am/BroadcastRecord;->getReceiverProcessName(Ljava/lang/Object;)Ljava/lang/String;
 HSPLcom/android/server/am/BroadcastRecord;->getReceiverUid(Ljava/lang/Object;)I
@@ -1660,20 +1346,19 @@
 HSPLcom/android/server/am/BroadcastRecord;->isDeliveryStateTerminal(I)Z
 HSPLcom/android/server/am/BroadcastRecord;->isForeground()Z+]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/BroadcastRecord;->isMatchingKeyNull(Lcom/android/server/am/BroadcastRecord;)Z
-HPLcom/android/server/am/BroadcastRecord;->isNoAbort()Z
-HSPLcom/android/server/am/BroadcastRecord;->isOffload()Z
+HPLcom/android/server/am/BroadcastRecord;->isNoAbort()Z+]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/am/BroadcastRecord;->isOffload()Z+]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/BroadcastRecord;->isPrioritized([IZ)Z
 HSPLcom/android/server/am/BroadcastRecord;->isReceiverEquals(Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLcom/android/server/am/BroadcastRecord;->isReplacePending()Z
+HSPLcom/android/server/am/BroadcastRecord;->isReplacePending()Z+]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/BroadcastRecord;->isUrgent()Z
 HSPLcom/android/server/am/BroadcastRecord;->matchesDeliveryGroup(Lcom/android/server/am/BroadcastRecord;)Z
 HSPLcom/android/server/am/BroadcastRecord;->matchesDeliveryGroup(Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;)Z+]Landroid/content/Intent;Landroid/content/Intent;
-HSPLcom/android/server/am/BroadcastRecord;->maybeStripForHistory()Lcom/android/server/am/BroadcastRecord;
+HSPLcom/android/server/am/BroadcastRecord;->maybeStripForHistory()Lcom/android/server/am/BroadcastRecord;+]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/BroadcastRecord;->setDeliveryState(IILjava/lang/String;)Z+]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;
 HSPLcom/android/server/am/BroadcastRecord;->setMatchingRecordsCache(Landroid/util/ArrayMap;)V
 HSPLcom/android/server/am/BroadcastRecord;->toShortString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/BroadcastRecord;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Landroid/content/Intent;Landroid/content/Intent;
-HSPLcom/android/server/am/BroadcastSkipPolicy;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/BroadcastSkipPolicy;->disallowBackgroundStart(Lcom/android/server/am/BroadcastRecord;)Z+]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/BroadcastSkipPolicy;->requestStartTargetPermissionsReviewIfNeededLocked(Lcom/android/server/am/BroadcastRecord;Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/BroadcastSkipPolicy;->shouldSkipMessage(Lcom/android/server/am/BroadcastRecord;Landroid/content/pm/ResolveInfo;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastSkipPolicy;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
@@ -1681,67 +1366,35 @@
 HSPLcom/android/server/am/BroadcastSkipPolicy;->shouldSkipMessage(Lcom/android/server/am/BroadcastRecord;Ljava/lang/Object;)Ljava/lang/String;+]Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastSkipPolicy;
 HSPLcom/android/server/am/BroadcastStats;->addBackgroundCheckViolation(Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/am/BroadcastStats;->addBroadcast(Ljava/lang/String;Ljava/lang/String;IIJ)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/am/CacheOomRanker$1;-><init>(Lcom/android/server/am/CacheOomRanker;)V
-HSPLcom/android/server/am/CacheOomRanker$CacheUseComparator;-><init>()V
-HSPLcom/android/server/am/CacheOomRanker$CacheUseComparator;-><init>(Lcom/android/server/am/CacheOomRanker$CacheUseComparator-IA;)V
-HSPLcom/android/server/am/CacheOomRanker$LastActivityTimeComparator;-><init>()V
-HSPLcom/android/server/am/CacheOomRanker$LastActivityTimeComparator;-><init>(Lcom/android/server/am/CacheOomRanker$LastActivityTimeComparator-IA;)V
-HSPLcom/android/server/am/CacheOomRanker$LastRssComparator;-><init>()V
-HSPLcom/android/server/am/CacheOomRanker$LastRssComparator;-><init>(Lcom/android/server/am/CacheOomRanker$LastRssComparator-IA;)V
-HSPLcom/android/server/am/CacheOomRanker$ProcessDependenciesImpl;-><init>()V
-HSPLcom/android/server/am/CacheOomRanker$ProcessDependenciesImpl;-><init>(Lcom/android/server/am/CacheOomRanker$ProcessDependenciesImpl-IA;)V
-HSPLcom/android/server/am/CacheOomRanker$RssComparator;-><init>()V
-HSPLcom/android/server/am/CacheOomRanker$RssComparator;-><init>(Lcom/android/server/am/CacheOomRanker$RssComparator-IA;)V
-HSPLcom/android/server/am/CacheOomRanker$ScoreComparator;-><init>()V
-HSPLcom/android/server/am/CacheOomRanker$ScoreComparator;-><init>(Lcom/android/server/am/CacheOomRanker$ScoreComparator-IA;)V
-HSPLcom/android/server/am/CacheOomRanker;-><clinit>()V
-HSPLcom/android/server/am/CacheOomRanker;-><init>(Lcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/CacheOomRanker;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/CacheOomRanker$ProcessDependencies;)V
 HSPLcom/android/server/am/CacheOomRanker;->useOomReranking()Z
 HPLcom/android/server/am/CachedAppOptimizer$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/am/CachedAppOptimizer$1;-><init>(Lcom/android/server/am/CachedAppOptimizer;)V
-HSPLcom/android/server/am/CachedAppOptimizer$2;-><init>(Lcom/android/server/am/CachedAppOptimizer;)V
-HSPLcom/android/server/am/CachedAppOptimizer$3;-><init>(Lcom/android/server/am/CachedAppOptimizer;)V
-HSPLcom/android/server/am/CachedAppOptimizer$4;-><init>(Lcom/android/server/am/CachedAppOptimizer;)V
 HPLcom/android/server/am/CachedAppOptimizer$AggregatedCompactionStats;->addMemStats(JJJJJ)V
-HSPLcom/android/server/am/CachedAppOptimizer$CancelCompactReason;->$values()[Lcom/android/server/am/CachedAppOptimizer$CancelCompactReason;
-HSPLcom/android/server/am/CachedAppOptimizer$CancelCompactReason;-><clinit>()V
-HSPLcom/android/server/am/CachedAppOptimizer$CancelCompactReason;-><init>(Ljava/lang/String;I)V
-HSPLcom/android/server/am/CachedAppOptimizer$CancelCompactReason;->values()[Lcom/android/server/am/CachedAppOptimizer$CancelCompactReason;
-HSPLcom/android/server/am/CachedAppOptimizer$CompactSource;->$values()[Lcom/android/server/am/CachedAppOptimizer$CompactSource;
-HSPLcom/android/server/am/CachedAppOptimizer$CompactSource;-><clinit>()V
-HSPLcom/android/server/am/CachedAppOptimizer$CompactSource;-><init>(Ljava/lang/String;I)V
-HSPLcom/android/server/am/CachedAppOptimizer$CompactSource;->values()[Lcom/android/server/am/CachedAppOptimizer$CompactSource;
-HSPLcom/android/server/am/CachedAppOptimizer$DefaultProcessDependencies;-><clinit>()V
-HSPLcom/android/server/am/CachedAppOptimizer$DefaultProcessDependencies;-><init>()V
-HSPLcom/android/server/am/CachedAppOptimizer$DefaultProcessDependencies;-><init>(Lcom/android/server/am/CachedAppOptimizer$DefaultProcessDependencies-IA;)V
 HPLcom/android/server/am/CachedAppOptimizer$DefaultProcessDependencies;->getRss(I)[J
 HPLcom/android/server/am/CachedAppOptimizer$DefaultProcessDependencies;->performCompaction(Lcom/android/server/am/CachedAppOptimizer$CompactProfile;I)V
-HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->freezeProcess(Lcom/android/server/am/ProcessRecord;)V
+HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->freezeProcess(Lcom/android/server/am/ProcessRecord;)V+]Ljava/util/Random;Ljava/util/Random;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/internal/os/ProcLocksReader;Lcom/android/internal/os/ProcLocksReader;]Landroid/os/Handler;Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;
-HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->reportUnfreeze(Lcom/android/server/am/ProcessRecord;IILjava/lang/String;I)V
-HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->reportUnfreeze(Lcom/android/server/am/ProcessRecord;IILjava/lang/String;I)V+]Ljava/util/Random;Ljava/util/Random;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/CachedAppOptimizer$AggregatedCompactionStats;Lcom/android/server/am/CachedAppOptimizer$AggregatedProcessCompactionStats;,Lcom/android/server/am/CachedAppOptimizer$AggregatedSourceCompactionStats;]Ljava/util/LinkedHashMap;Lcom/android/server/am/CachedAppOptimizer$3;]Lcom/android/server/am/CachedAppOptimizer$ProcessDependencies;Lcom/android/server/am/CachedAppOptimizer$DefaultProcessDependencies;]Ljava/util/LinkedList;Lcom/android/server/am/CachedAppOptimizer$4;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->shouldOomAdjThrottleCompaction(Lcom/android/server/am/ProcessRecord;)Z
-HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->shouldRssThrottleCompaction(Lcom/android/server/am/CachedAppOptimizer$CompactProfile;ILjava/lang/String;[J)Z
-HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->shouldThrottleMiscCompaction(Lcom/android/server/am/ProcessRecord;I)Z
+HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->shouldRssThrottleCompaction(Lcom/android/server/am/CachedAppOptimizer$CompactProfile;ILjava/lang/String;[J)Z+]Ljava/util/LinkedHashMap;Lcom/android/server/am/CachedAppOptimizer$3;
+HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->shouldThrottleMiscCompaction(Lcom/android/server/am/ProcessRecord;I)Z+]Ljava/util/Set;Ljava/util/HashSet;
 HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->shouldTimeThrottleCompaction(Lcom/android/server/am/ProcessRecord;JLcom/android/server/am/CachedAppOptimizer$CompactProfile;Lcom/android/server/am/CachedAppOptimizer$CompactSource;)Z
-HSPLcom/android/server/am/CachedAppOptimizer$SettingsContentObserver;-><init>(Lcom/android/server/am/CachedAppOptimizer;)V
 HPLcom/android/server/am/CachedAppOptimizer$SingleCompactionStats;-><init>([JLcom/android/server/am/CachedAppOptimizer$CompactSource;Ljava/lang/String;JJJJJIIII)V
-HSPLcom/android/server/am/CachedAppOptimizer;->-$$Nest$fgetmAm(Lcom/android/server/am/CachedAppOptimizer;)Lcom/android/server/am/ActivityManagerService;
 HPLcom/android/server/am/CachedAppOptimizer;->-$$Nest$fgetmProcLock(Lcom/android/server/am/CachedAppOptimizer;)Lcom/android/server/am/ActivityManagerGlobalLock;
-HSPLcom/android/server/am/CachedAppOptimizer;-><clinit>()V
-HSPLcom/android/server/am/CachedAppOptimizer;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/CachedAppOptimizer;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/CachedAppOptimizer$PropertyChangedCallbackForTest;Lcom/android/server/am/CachedAppOptimizer$ProcessDependencies;)V
 HPLcom/android/server/am/CachedAppOptimizer;->binderError(ILcom/android/server/am/ProcessRecord;III)V+]Landroid/os/Handler;Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLcom/android/server/am/CachedAppOptimizer;->cancelCompactionForProcess(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/CachedAppOptimizer$CancelCompactReason;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/EnumMap;Ljava/util/EnumMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;
-HPLcom/android/server/am/CachedAppOptimizer;->compactApp(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/CachedAppOptimizer$CompactProfile;Lcom/android/server/am/CachedAppOptimizer$CompactSource;Z)Z
-HPLcom/android/server/am/CachedAppOptimizer;->freezeAppAsyncLSP(Lcom/android/server/am/ProcessRecord;)V
+HSPLcom/android/server/am/CachedAppOptimizer;->cancelCompactionForProcess(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/CachedAppOptimizer$CancelCompactReason;)V+]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Ljava/util/EnumMap;Ljava/util/EnumMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/Integer;Ljava/lang/Integer;
+HPLcom/android/server/am/CachedAppOptimizer;->compactApp(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/CachedAppOptimizer$CompactProfile;Lcom/android/server/am/CachedAppOptimizer$CompactSource;Z)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/CachedAppOptimizer;->freezeAppAsyncInternalLSP(Lcom/android/server/am/ProcessRecord;JZ)V+]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Landroid/os/Handler;Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
+HSPLcom/android/server/am/CachedAppOptimizer;->freezeAppAsyncLSP(Lcom/android/server/am/ProcessRecord;)V
+HSPLcom/android/server/am/CachedAppOptimizer;->freezerExemptInstPkg()Z
 HPLcom/android/server/am/CachedAppOptimizer;->getPerProcessAggregatedCompactStat(Ljava/lang/String;)Lcom/android/server/am/CachedAppOptimizer$AggregatedProcessCompactionStats;+]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;
 HPLcom/android/server/am/CachedAppOptimizer;->getPerSourceAggregatedCompactStat(Lcom/android/server/am/CachedAppOptimizer$CompactSource;)Lcom/android/server/am/CachedAppOptimizer$AggregatedSourceCompactionStats;+]Ljava/util/EnumMap;Ljava/util/EnumMap;
 HSPLcom/android/server/am/CachedAppOptimizer;->getUnfreezeReasonCodeFromOomAdjReason(I)I
 HPLcom/android/server/am/CachedAppOptimizer;->lambda$binderErrorInternal$3(Ljava/lang/Integer;Ljava/lang/Integer;)V+]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Integer;Ljava/lang/Integer;
-HSPLcom/android/server/am/CachedAppOptimizer;->onCleanupApplicationRecordLocked(Lcom/android/server/am/ProcessRecord;)V
-HPLcom/android/server/am/CachedAppOptimizer;->onProcessFrozen(Lcom/android/server/am/ProcessRecord;)V
+HSPLcom/android/server/am/CachedAppOptimizer;->onCleanupApplicationRecordLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/CachedAppOptimizer;->onOomAdjustChanged(IILcom/android/server/am/ProcessRecord;)V
+HPLcom/android/server/am/CachedAppOptimizer;->onProcessFrozen(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HPLcom/android/server/am/CachedAppOptimizer;->postUidFrozenMessage(IZ)V
 HPLcom/android/server/am/CachedAppOptimizer;->resolveCompactionProfile(Lcom/android/server/am/CachedAppOptimizer$CompactProfile;)Lcom/android/server/am/CachedAppOptimizer$CompactProfile;
 HPLcom/android/server/am/CachedAppOptimizer;->traceAppFreeze(Ljava/lang/String;II)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
@@ -1749,17 +1402,15 @@
 HSPLcom/android/server/am/CachedAppOptimizer;->unfreezeAppLSP(Lcom/android/server/am/ProcessRecord;I)V+]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;
 HPLcom/android/server/am/CachedAppOptimizer;->unfreezeTemporarily(Lcom/android/server/am/ProcessRecord;I)V
 HPLcom/android/server/am/CachedAppOptimizer;->unfreezeTemporarily(Lcom/android/server/am/ProcessRecord;IJ)V+]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;
-HPLcom/android/server/am/CachedAppOptimizer;->updateEarliestFreezableTime(Lcom/android/server/am/ProcessRecord;J)J+]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;
+HSPLcom/android/server/am/CachedAppOptimizer;->updateEarliestFreezableTime(Lcom/android/server/am/ProcessRecord;J)J+]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;
 HSPLcom/android/server/am/CachedAppOptimizer;->useCompaction()Z
 HSPLcom/android/server/am/CachedAppOptimizer;->useFreezer()Z
 HSPLcom/android/server/am/ComponentAliasResolver$$ExternalSyntheticLambda0;-><init>(Landroid/content/pm/ResolveInfo;)V
 HSPLcom/android/server/am/ComponentAliasResolver$$ExternalSyntheticLambda1;-><init>(Landroid/content/Intent;Ljava/lang/String;III)V
-HSPLcom/android/server/am/ComponentAliasResolver$1;-><init>(Lcom/android/server/am/ComponentAliasResolver;)V
 HSPLcom/android/server/am/ComponentAliasResolver$Resolution;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
 HSPLcom/android/server/am/ComponentAliasResolver$Resolution;->getAlias()Ljava/lang/Object;+]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;
-HSPLcom/android/server/am/ComponentAliasResolver$Resolution;->getTarget()Ljava/lang/Object;
+HSPLcom/android/server/am/ComponentAliasResolver$Resolution;->getTarget()Ljava/lang/Object;+]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;
 HSPLcom/android/server/am/ComponentAliasResolver$Resolution;->isAlias()Z
-HSPLcom/android/server/am/ComponentAliasResolver;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/ComponentAliasResolver;->resolveComponentAlias(Ljava/util/function/Supplier;)Lcom/android/server/am/ComponentAliasResolver$Resolution;
 HSPLcom/android/server/am/ComponentAliasResolver;->resolveReceiver(Landroid/content/Intent;Landroid/content/pm/ResolveInfo;Ljava/lang/String;JIIZ)Lcom/android/server/am/ComponentAliasResolver$Resolution;+]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver;
 HSPLcom/android/server/am/ComponentAliasResolver;->resolveService(Landroid/content/Intent;Ljava/lang/String;III)Lcom/android/server/am/ComponentAliasResolver$Resolution;+]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver;
@@ -1776,7 +1427,7 @@
 HPLcom/android/server/am/ContentProviderConnection;->decrementCount(Z)I
 HPLcom/android/server/am/ContentProviderConnection;->incrementCount(Z)I
 HSPLcom/android/server/am/ContentProviderConnection;->initializeCount(Z)V
-HSPLcom/android/server/am/ContentProviderConnection;->startAssociationIfNeeded()V+]Lcom/android/internal/app/procstats/ProcessStats$PackageState;Lcom/android/internal/app/procstats/ProcessStats$PackageState;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/internal/app/procstats/AssociationState;Lcom/android/internal/app/procstats/AssociationState;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ContentProviderConnection;->startAssociationIfNeeded()V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/internal/app/procstats/ProcessStats$PackageState;Lcom/android/internal/app/procstats/ProcessStats$PackageState;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/internal/app/procstats/AssociationState;Lcom/android/internal/app/procstats/AssociationState;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;
 HPLcom/android/server/am/ContentProviderConnection;->stopAssociation()V+]Lcom/android/internal/app/procstats/AssociationState$SourceState;Lcom/android/internal/app/procstats/AssociationState$SourceState;
 HPLcom/android/server/am/ContentProviderConnection;->totalRefCount()I
 HSPLcom/android/server/am/ContentProviderConnection;->trackProcState(II)V+]Lcom/android/internal/app/procstats/AssociationState$SourceState;Lcom/android/internal/app/procstats/AssociationState$SourceState;
@@ -1785,44 +1436,38 @@
 HPLcom/android/server/am/ContentProviderHelper$$ExternalSyntheticLambda3;-><init>(Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderConnection;ZZ)V
 HPLcom/android/server/am/ContentProviderHelper$$ExternalSyntheticLambda3;->run()V
 HSPLcom/android/server/am/ContentProviderHelper;->$r8$lambda$7SqNWgaMV7-OpTBuN-1CMmNHiyU(Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ProcessRecord;Landroid/content/pm/ProviderInfo;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/am/ContentProviderHelper;-><clinit>()V
-HSPLcom/android/server/am/ContentProviderHelper;-><init>(Lcom/android/server/am/ActivityManagerService;Z)V
 HSPLcom/android/server/am/ContentProviderHelper;->canAccessContentProviderFromSdkSandbox(Landroid/content/pm/ProviderInfo;I)Z
-HSPLcom/android/server/am/ContentProviderHelper;->checkAssociationAndPermissionLocked(Lcom/android/server/am/ProcessRecord;Landroid/content/pm/ProviderInfo;IIZLjava/lang/String;J)V+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ContentProviderHelper;->checkAssociationAndPermissionLocked(Lcom/android/server/am/ProcessRecord;Landroid/content/pm/ProviderInfo;IIZLjava/lang/String;J)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;
 HSPLcom/android/server/am/ContentProviderHelper;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLcom/android/server/am/ContentProviderHelper;->checkContentProviderAssociation(Lcom/android/server/am/ProcessRecord;ILandroid/content/pm/ProviderInfo;)Ljava/lang/String;+]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ContentProviderHelper;->checkContentProviderPermission(Landroid/content/pm/ProviderInfo;IIIZLjava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/pm/PathPermission;Landroid/content/pm/PathPermission;]Landroid/content/pm/ProviderInfo;Landroid/content/pm/ProviderInfo;
+HSPLcom/android/server/am/ContentProviderHelper;->checkContentProviderAssociation(Lcom/android/server/am/ProcessRecord;ILandroid/content/pm/ProviderInfo;)Ljava/lang/String;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;
+HSPLcom/android/server/am/ContentProviderHelper;->checkContentProviderPermission(Landroid/content/pm/ProviderInfo;IIIZLjava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Landroid/content/pm/PathPermission;Landroid/content/pm/PathPermission;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/pm/ProviderInfo;Landroid/content/pm/ProviderInfo;
 HSPLcom/android/server/am/ContentProviderHelper;->checkTime(JLjava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HPLcom/android/server/am/ContentProviderHelper;->decProviderCountLocked(Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;ZZZ)Z+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;
-HSPLcom/android/server/am/ContentProviderHelper;->generateApplicationProvidersLocked(Lcom/android/server/am/ProcessRecord;)Ljava/util/List;+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HPLcom/android/server/am/ContentProviderHelper;->decProviderCountLocked(Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;ZZZ)Z+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;
+HSPLcom/android/server/am/ContentProviderHelper;->generateApplicationProvidersLocked(Lcom/android/server/am/ProcessRecord;)Ljava/util/List;+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;
 HSPLcom/android/server/am/ContentProviderHelper;->getContentProvider(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;IZ)Landroid/app/ContentProviderHolder;+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
-HSPLcom/android/server/am/ContentProviderHelper;->getContentProviderImpl(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;ZI)Landroid/app/ContentProviderHolder;+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/UserProperties;Landroid/content/pm/UserProperties;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Ljava/lang/Object;Lcom/android/server/am/ContentProviderRecord;
-HPLcom/android/server/am/ContentProviderHelper;->getMimeTypeFilterAsync(Landroid/net/Uri;ILandroid/os/RemoteCallback;)V+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Landroid/content/IContentProvider;Landroid/content/ContentProviderProxy;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Landroid/os/RemoteCallback;Landroid/os/RemoteCallback;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HPLcom/android/server/am/ContentProviderHelper;->handleProviderRemoval(Lcom/android/server/am/ContentProviderConnection;ZZ)V+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ContentProviderHelper;->getContentProviderImpl(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;ZI)Landroid/app/ContentProviderHolder;+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Landroid/content/pm/UserProperties;Landroid/content/pm/UserProperties;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Ljava/lang/Object;Lcom/android/server/am/ContentProviderRecord;
+HPLcom/android/server/am/ContentProviderHelper;->getMimeTypeFilterAsync(Landroid/net/Uri;ILandroid/os/RemoteCallback;)V+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/IContentProvider;Landroid/content/ContentProviderProxy;]Landroid/os/RemoteCallback;Landroid/os/RemoteCallback;
+HPLcom/android/server/am/ContentProviderHelper;->handleProviderRemoval(Lcom/android/server/am/ContentProviderConnection;ZZ)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
 HSPLcom/android/server/am/ContentProviderHelper;->hasProviderConnectionLocked(Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ContentProviderHelper;->incProviderCountLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;ZZJLcom/android/server/am/ProcessList;I)Lcom/android/server/am/ContentProviderConnection;+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;
 HSPLcom/android/server/am/ContentProviderHelper;->isAuthorityRedirectedForCloneProfileCached(Ljava/lang/String;)Z+]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/util/Map;Ljava/util/HashMap;
-HSPLcom/android/server/am/ContentProviderHelper;->isProcessAliveLocked(Lcom/android/server/am/ProcessRecord;)Z
+HSPLcom/android/server/am/ContentProviderHelper;->isProcessAliveLocked(Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ContentProviderHelper;->isSingletonOrSystemUserOnly(Landroid/content/pm/ProviderInfo;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ContentProviderHelper;->lambda$checkContentProviderAssociation$4(Lcom/android/server/am/ProcessRecord;Landroid/content/pm/ProviderInfo;Ljava/lang/String;)Ljava/lang/String;
+HSPLcom/android/server/am/ContentProviderHelper;->lambda$checkContentProviderAssociation$4(Lcom/android/server/am/ProcessRecord;Landroid/content/pm/ProviderInfo;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ContentProviderHelper;->maybeUpdateProviderUsageStatsLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/lang/Long;Ljava/lang/Long;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;
 HSPLcom/android/server/am/ContentProviderHelper;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V+]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Ljava/lang/String;Ljava/lang/String;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Ljava/lang/Object;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ContentProviderHelper;->refContentProvider(Landroid/os/IBinder;II)Z+]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;
-HPLcom/android/server/am/ContentProviderHelper;->removeContentProvider(Landroid/os/IBinder;Z)V+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HPLcom/android/server/am/ContentProviderHelper;->removeDyingProviderLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ContentProviderRecord;Z)Z+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Ljava/lang/String;Ljava/lang/String;]Landroid/content/IContentProvider;Landroid/content/ContentProviderProxy;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
+HPLcom/android/server/am/ContentProviderHelper;->removeContentProvider(Landroid/os/IBinder;Z)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;
+HPLcom/android/server/am/ContentProviderHelper;->removeDyingProviderLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ContentProviderRecord;Z)Z+]Landroid/content/IContentProvider;Landroid/content/ContentProviderProxy;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Ljava/lang/String;Ljava/lang/String;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;
 HSPLcom/android/server/am/ContentProviderRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/content/pm/ProviderInfo;Landroid/content/pm/ApplicationInfo;Landroid/content/ComponentName;Z)V+]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HSPLcom/android/server/am/ContentProviderRecord;->canRunHere(Lcom/android/server/am/ProcessRecord;)Z+]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/am/ContentProviderRecord;->hasExternalProcessHandles()Z
 HSPLcom/android/server/am/ContentProviderRecord;->newHolder(Lcom/android/server/am/ContentProviderConnection;Z)Landroid/app/ContentProviderHolder;
-HSPLcom/android/server/am/ContentProviderRecord;->onProviderPublishStatusLocked(Z)V+]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
-HSPLcom/android/server/am/ContentProviderRecord;->setProcess(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/ContentProviderRecord;->onProviderPublishStatusLocked(Z)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;
+HSPLcom/android/server/am/ContentProviderRecord;->setProcess(Lcom/android/server/am/ProcessRecord;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;
 HSPLcom/android/server/am/ContentProviderRecord;->toString()Ljava/lang/String;
 HSPLcom/android/server/am/CoreSettingsObserver;->getCoreSettingsLocked()Landroid/os/Bundle;
-HPLcom/android/server/am/DataConnectionStats;->notePhoneDataConnectionState()V
-HSPLcom/android/server/am/DropboxRateLimiter$DefaultClock;-><init>()V
-HSPLcom/android/server/am/DropboxRateLimiter$DefaultClock;-><init>(Lcom/android/server/am/DropboxRateLimiter$DefaultClock-IA;)V
-HSPLcom/android/server/am/DropboxRateLimiter;-><init>()V
-HSPLcom/android/server/am/DropboxRateLimiter;-><init>(Lcom/android/server/am/DropboxRateLimiter$Clock;)V
+HPLcom/android/server/am/DataConnectionStats;->notePhoneDataConnectionState()V+]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Landroid/telephony/ServiceState;Landroid/telephony/ServiceState;
 HSPLcom/android/server/am/DropboxRateLimiter;->errorKey(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/am/DropboxRateLimiter;->shouldRateLimit(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/am/DropboxRateLimiter$RateLimitResult;
 HSPLcom/android/server/am/ErrorDialogController;-><init>(Lcom/android/server/am/ProcessRecord;)V
@@ -1832,75 +1477,56 @@
 HSPLcom/android/server/am/EventLogTags;->writeAmProcDied(IILjava/lang/String;II)V
 HPLcom/android/server/am/EventLogTags;->writeAmPss(IILjava/lang/String;JJJJIIJ)V
 HSPLcom/android/server/am/EventLogTags;->writeAmWtf(IILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
-HPLcom/android/server/am/FeatureFlagsImpl;->newFgsRestrictionLogic()Z
+HSPLcom/android/server/am/FeatureFlagsImpl;->newFgsRestrictionLogic()Z
 HSPLcom/android/server/am/FeatureFlagsImpl;->serviceBindingOomAdjPolicy()Z
-HSPLcom/android/server/am/FgsTempAllowList;-><init>()V
-HSPLcom/android/server/am/FgsTempAllowList;->add(IJLjava/lang/Object;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Long;Ljava/lang/Long;
+HSPLcom/android/server/am/FgsTempAllowList;->add(IJLjava/lang/Object;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/am/FgsTempAllowList;->get(I)Landroid/util/Pair;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Long;Ljava/lang/Long;
-HPLcom/android/server/am/FgsTempAllowList;->isAllowed(I)Z+]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList;
-HSPLcom/android/server/am/FgsTempAllowList;->removeUid(I)V
-HPLcom/android/server/am/Flags;->newFgsRestrictionLogic()Z+]Lcom/android/server/am/FeatureFlags;Lcom/android/server/am/FeatureFlagsImpl;
+HSPLcom/android/server/am/FgsTempAllowList;->isAllowed(I)Z+]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList;
+HSPLcom/android/server/am/FgsTempAllowList;->removeUid(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/am/Flags;->newFgsRestrictionLogic()Z+]Lcom/android/server/am/FeatureFlags;Lcom/android/server/am/FeatureFlagsImpl;
 HSPLcom/android/server/am/Flags;->serviceBindingOomAdjPolicy()Z+]Lcom/android/server/am/FeatureFlags;Lcom/android/server/am/FeatureFlagsImpl;
-HSPLcom/android/server/am/ForegroundServiceTypeLoggerModule$FgsApiRecord;-><init>(IILjava/lang/String;IJ)V
-HSPLcom/android/server/am/ForegroundServiceTypeLoggerModule;-><init>()V
 HSPLcom/android/server/am/ForegroundServiceTypeLoggerModule;->logForegroundServiceApiEventBegin(IIILjava/lang/String;)J
 HPLcom/android/server/am/ForegroundServiceTypeLoggerModule;->logForegroundServiceApiEventEnd(III)J
-HPLcom/android/server/am/HealthStatsBatteryStatsWriter;->addTimers(Landroid/os/health/HealthStatsWriter;ILjava/lang/String;Landroid/os/BatteryStats$Timer;)V+]Landroid/os/health/HealthStatsWriter;Landroid/os/health/HealthStatsWriter;]Landroid/os/BatteryStats$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;
-HPLcom/android/server/am/HealthStatsBatteryStatsWriter;->writePkg(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats$Uid$Pkg;)V+]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Lcom/android/server/am/HealthStatsBatteryStatsWriter;Lcom/android/server/am/HealthStatsBatteryStatsWriter;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/health/HealthStatsWriter;Landroid/os/health/HealthStatsWriter;]Landroid/os/BatteryStats$Uid$Pkg;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;
-HPLcom/android/server/am/HealthStatsBatteryStatsWriter;->writeProc(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats$Uid$Proc;)V
+HPLcom/android/server/am/HealthStatsBatteryStatsWriter;->addTimers(Landroid/os/health/HealthStatsWriter;ILjava/lang/String;Landroid/os/BatteryStats$Timer;)V+]Landroid/os/health/HealthStatsWriter;Landroid/os/health/HealthStatsWriter;]Landroid/os/BatteryStats$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
+HPLcom/android/server/am/HealthStatsBatteryStatsWriter;->writePid(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats$Uid$Pid;)V+]Landroid/os/health/HealthStatsWriter;Landroid/os/health/HealthStatsWriter;
+HPLcom/android/server/am/HealthStatsBatteryStatsWriter;->writePkg(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats$Uid$Pkg;)V+]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Lcom/android/server/am/HealthStatsBatteryStatsWriter;Lcom/android/server/am/HealthStatsBatteryStatsWriter;]Landroid/os/health/HealthStatsWriter;Landroid/os/health/HealthStatsWriter;]Landroid/os/BatteryStats$Uid$Pkg;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;]Landroid/os/BatteryStats$Counter;Lcom/android/server/power/stats/BatteryStatsImpl$Counter;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
+HPLcom/android/server/am/HealthStatsBatteryStatsWriter;->writeProc(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats$Uid$Proc;)V+]Landroid/os/BatteryStats$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;]Landroid/os/health/HealthStatsWriter;Landroid/os/health/HealthStatsWriter;
 HPLcom/android/server/am/HealthStatsBatteryStatsWriter;->writeUid(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats;Landroid/os/BatteryStats$Uid;)V+]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/HealthStatsBatteryStatsWriter;Lcom/android/server/am/HealthStatsBatteryStatsWriter;]Landroid/os/health/HealthStatsWriter;Landroid/os/health/HealthStatsWriter;]Landroid/os/BatteryStats$Uid$Wakelock;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$1;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Landroid/os/BatteryStats$Uid$Sensor;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Sensor;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;
-HSPLcom/android/server/am/HostingRecord;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/am/HostingRecord;-><init>(Ljava/lang/String;Landroid/content/ComponentName;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V+]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HSPLcom/android/server/am/HostingRecord;-><init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;IZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/server/am/HostingRecord;->getDefiningUid()I
-HSPLcom/android/server/am/InstrumentationReporter;-><init>()V
+HSPLcom/android/server/am/HostingRecord;->getHostingTypeIdStatsd(Ljava/lang/String;)I
 HSPLcom/android/server/am/IntentBindRecord;-><init>(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent$FilterComparison;)V
-HSPLcom/android/server/am/LmkdConnection;-><init>(Landroid/os/MessageQueue;Lcom/android/server/am/LmkdConnection$LmkdConnectionListener;)V
 HSPLcom/android/server/am/LmkdConnection;->exchange(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Z+]Lcom/android/server/am/LmkdConnection;Lcom/android/server/am/LmkdConnection;]Ljava/lang/Object;Ljava/lang/Object;
 HSPLcom/android/server/am/LmkdConnection;->isConnected()Z
 HSPLcom/android/server/am/LmkdConnection;->write(Ljava/nio/ByteBuffer;)Z+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;]Ljava/io/OutputStream;Landroid/net/LocalSocketImpl$SocketOutputStream;
-HSPLcom/android/server/am/LowMemDetector$LowMemThread;-><init>(Lcom/android/server/am/LowMemDetector;)V
 HSPLcom/android/server/am/LowMemDetector$LowMemThread;->run()V
 HSPLcom/android/server/am/LowMemDetector;->-$$Nest$mwaitForPressure(Lcom/android/server/am/LowMemDetector;)I
-HSPLcom/android/server/am/LowMemDetector;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/LowMemDetector;->getMemFactor()I
 HSPLcom/android/server/am/LowMemDetector;->isAvailable()Z
-HSPLcom/android/server/am/OomAdjProfiler$$ExternalSyntheticLambda0;-><init>()V
 HSPLcom/android/server/am/OomAdjProfiler$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLcom/android/server/am/OomAdjProfiler$CpuTimes;-><init>(Lcom/android/server/am/OomAdjProfiler;)V
-HSPLcom/android/server/am/OomAdjProfiler$CpuTimes;-><init>(Lcom/android/server/am/OomAdjProfiler;Lcom/android/server/am/OomAdjProfiler$CpuTimes-IA;)V
-HSPLcom/android/server/am/OomAdjProfiler$CpuTimes;->addCpuTimeMs(JZZ)V
 HSPLcom/android/server/am/OomAdjProfiler$CpuTimes;->addCpuTimeUs(J)V+]Lcom/android/server/am/OomAdjProfiler$CpuTimes;Lcom/android/server/am/OomAdjProfiler$CpuTimes;
 HSPLcom/android/server/am/OomAdjProfiler$CpuTimes;->addCpuTimeUs(JZZ)V
-HSPLcom/android/server/am/OomAdjProfiler;->$r8$lambda$c4Q2P5csnq29GPhTB7rlnNqRQWs(Lcom/android/server/am/OomAdjProfiler;ZZZ)V
 HSPLcom/android/server/am/OomAdjProfiler;->-$$Nest$fgetmOnBattery(Lcom/android/server/am/OomAdjProfiler;)Z
 HSPLcom/android/server/am/OomAdjProfiler;->-$$Nest$fgetmScreenOff(Lcom/android/server/am/OomAdjProfiler;)Z
-HSPLcom/android/server/am/OomAdjProfiler;-><init>()V
-HSPLcom/android/server/am/OomAdjProfiler;->batteryPowerChanged(Z)V
 HSPLcom/android/server/am/OomAdjProfiler;->oomAdjEnded()V+]Lcom/android/server/am/OomAdjProfiler$CpuTimes;Lcom/android/server/am/OomAdjProfiler$CpuTimes;
 HSPLcom/android/server/am/OomAdjProfiler;->oomAdjStarted()V
 HSPLcom/android/server/am/OomAdjProfiler;->scheduleSystemServerCpuTimeUpdate()V
 HSPLcom/android/server/am/OomAdjProfiler;->updateSystemServerCpuTime(ZZZ)V
-HSPLcom/android/server/am/OomAdjuster$$ExternalSyntheticLambda0;-><init>()V
 HSPLcom/android/server/am/OomAdjuster$$ExternalSyntheticLambda0;->handleMessage(Landroid/os/Message;)Z
 HSPLcom/android/server/am/OomAdjuster$$ExternalSyntheticLambda2;-><init>(Lcom/android/server/am/OomAdjuster;)V
-HSPLcom/android/server/am/OomAdjuster$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;-><init>(Lcom/android/server/am/OomAdjuster;)V
+HSPLcom/android/server/am/OomAdjuster$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;
 HPLcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;->initialize(Lcom/android/server/am/ProcessRecord;IZZIIIII)V
 HPLcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;->onOtherActivity()V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
 HPLcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;->onPausedActivity()V
 HPLcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;->onVisibleActivity()V
 HSPLcom/android/server/am/OomAdjuster;->$r8$lambda$WdlWDnyVtMFVApq1sSUGD1QBVaM(Landroid/os/Message;)Z
-HSPLcom/android/server/am/OomAdjuster;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessList;Lcom/android/server/am/ActiveUids;)V
-HSPLcom/android/server/am/OomAdjuster;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessList;Lcom/android/server/am/ActiveUids;Lcom/android/server/ServiceThread;)V
 HSPLcom/android/server/am/OomAdjuster;->applyOomAdjLSP(Lcom/android/server/am/ProcessRecord;ZJJI)Z+]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Landroid/os/Handler;Landroid/os/Handler;,Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
 HSPLcom/android/server/am/OomAdjuster;->assignCachedAdjIfNecessary(Ljava/util/ArrayList;)V+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/OomAdjuster;->checkAndEnqueueOomAdjTargetLocked(Lcom/android/server/am/ProcessRecord;)Z
 HSPLcom/android/server/am/OomAdjuster;->collectReachableProcessesLocked(Landroid/util/ArraySet;Ljava/util/ArrayList;Lcom/android/server/am/ActiveUids;)Z+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/am/OomAdjuster;->computeOomAdjLSP(Lcom/android/server/am/ProcessRecord;ILcom/android/server/am/ProcessRecord;ZJZZIZ)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/OomAdjuster;->computeOomAdjLSP(Lcom/android/server/am/ProcessRecord;ILcom/android/server/am/ProcessRecord;ZJZZIZ)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/OomAdjuster;->computeProviderHostOomAdjLSP(Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;JLcom/android/server/am/ProcessRecord;ZZZIIZZ)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/OomAdjuster;->computeServiceHostOomAdjLSP(Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;JLcom/android/server/am/ProcessRecord;ZZZIIZZ)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;
-HSPLcom/android/server/am/OomAdjuster;->createAdjusterThread()Lcom/android/server/ServiceThread;
 HSPLcom/android/server/am/OomAdjuster;->enqueueOomAdjTargetLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
 HSPLcom/android/server/am/OomAdjuster;->getBfslCapabilityFromClient(Lcom/android/server/am/ProcessRecord;)I+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
 HSPLcom/android/server/am/OomAdjuster;->getDefaultCapability(Lcom/android/server/am/ProcessRecord;I)I+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
@@ -1909,19 +1535,19 @@
 HSPLcom/android/server/am/OomAdjuster;->getInitialIsCurBoundByNonBgRestrictedApp(Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
 HSPLcom/android/server/am/OomAdjuster;->getInitialProcState(Lcom/android/server/am/ProcessRecord;)I+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
 HPLcom/android/server/am/OomAdjuster;->idleUidsLocked()V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
-HPLcom/android/server/am/OomAdjuster;->isScreenOnOrAnimatingLocked(Lcom/android/server/am/ProcessStateRecord;)Z+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
+HSPLcom/android/server/am/OomAdjuster;->isScreenOnOrAnimatingLocked(Lcom/android/server/am/ProcessStateRecord;)Z+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
 HSPLcom/android/server/am/OomAdjuster;->lambda$new$0(Landroid/os/Message;)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/am/OomAdjuster;->maybeUpdateLastTopTime(Lcom/android/server/am/ProcessStateRecord;J)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
 HSPLcom/android/server/am/OomAdjuster;->maybeUpdateUsageStatsLSP(Lcom/android/server/am/ProcessRecord;J)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;
 HSPLcom/android/server/am/OomAdjuster;->oomAdjReasonToString(I)Ljava/lang/String;
-HSPLcom/android/server/am/OomAdjuster;->performUpdateOomAdjLSP(I)V
+HSPLcom/android/server/am/OomAdjuster;->performUpdateOomAdjLSP(I)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/OomAdjuster;->performUpdateOomAdjLSP(Lcom/android/server/am/ProcessRecord;I)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/OomAdjProfiler;Lcom/android/server/am/OomAdjProfiler;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/OomAdjuster;->performUpdateOomAdjLSP(Lcom/android/server/am/ProcessRecord;ILcom/android/server/am/ProcessRecord;JI)Z+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/OomAdjuster;->performUpdateOomAdjPendingTargetsLocked(I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/OomAdjProfiler;Lcom/android/server/am/OomAdjProfiler;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/OomAdjuster;->removeOomAdjTargetLocked(Lcom/android/server/am/ProcessRecord;Z)V
 HSPLcom/android/server/am/OomAdjuster;->resetUidRecordsLsp(Lcom/android/server/am/ActiveUids;)V+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;
 HSPLcom/android/server/am/OomAdjuster;->setAppIdTempAllowlistStateLSP(IZ)V+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;
-HSPLcom/android/server/am/OomAdjuster;->setAttachingProcessStatesLSP(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/OomAdjuster;->setAttachingProcessStatesLSP(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
 HSPLcom/android/server/am/OomAdjuster;->setIntermediateAdjLSP(Lcom/android/server/am/ProcessRecord;III)I+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
 HSPLcom/android/server/am/OomAdjuster;->setIntermediateProcStateLSP(Lcom/android/server/am/ProcessRecord;II)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
 HSPLcom/android/server/am/OomAdjuster;->setIntermediateSchedGroupLSP(Lcom/android/server/am/ProcessStateRecord;I)V+]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
@@ -1933,92 +1559,77 @@
 HSPLcom/android/server/am/OomAdjuster;->updateAppUidRecIfNecessaryLSP(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/OomAdjuster;->updateAppUidRecLSP(Lcom/android/server/am/ProcessRecord;)V+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/OomAdjuster;->updateOomAdjInnerLSP(ILcom/android/server/am/ProcessRecord;Ljava/util/ArrayList;Lcom/android/server/am/ActiveUids;ZZ)V+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/CacheOomRanker;Lcom/android/server/am/CacheOomRanker;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/OomAdjProfiler;Lcom/android/server/am/OomAdjProfiler;
-HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLSP(I)V
+HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLSP(I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;
 HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLSP(Lcom/android/server/am/ProcessRecord;I)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;
 HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLocked(I)V
 HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;I)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;
 HSPLcom/android/server/am/OomAdjuster;->updateOomAdjPendingTargetsLocked(I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/OomAdjuster;->updateUidsLSP(Lcom/android/server/am/ActiveUids;J)V+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/OomConnection$OomConnectionThread;-><init>(Lcom/android/server/am/OomConnection;)V
-HSPLcom/android/server/am/OomConnection$OomConnectionThread;-><init>(Lcom/android/server/am/OomConnection;Lcom/android/server/am/OomConnection$OomConnectionThread-IA;)V
-HSPLcom/android/server/am/OomConnection$OomConnectionThread;->run()V
-HSPLcom/android/server/am/OomConnection;->-$$Nest$smwaitOom()[Landroid/os/OomKillRecord;
-HSPLcom/android/server/am/OomConnection;-><init>(Lcom/android/server/am/OomConnection$OomConnectionListener;)V
 HSPLcom/android/server/am/PackageList;-><init>(Lcom/android/server/am/ProcessRecord;)V
 HSPLcom/android/server/am/PackageList;->containsKey(Ljava/lang/Object;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/am/PackageList;->forEachPackage(Ljava/util/function/BiConsumer;)V
-HSPLcom/android/server/am/PackageList;->forEachPackageProcessStats(Ljava/util/function/Consumer;)V
+HSPLcom/android/server/am/PackageList;->forEachPackage(Ljava/util/function/BiConsumer;)V+]Ljava/util/function/BiConsumer;Lcom/android/server/am/ProcessProfileRecord$$ExternalSyntheticLambda1;
+HSPLcom/android/server/am/PackageList;->forEachPackageProcessStats(Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;Lcom/android/server/am/ProcessProfileRecord$$ExternalSyntheticLambda0;,Lcom/android/server/am/ActivityManagerService$$ExternalSyntheticLambda38;,Lcom/android/server/am/ProcessRecord$$ExternalSyntheticLambda0;
 HSPLcom/android/server/am/PackageList;->get(Ljava/lang/String;)Lcom/android/internal/app/procstats/ProcessStats$ProcessStateHolder;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/am/PackageList;->getPackageList()[Ljava/lang/String;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/am/PackageList;->getPackageListLocked()Landroid/util/ArrayMap;
-HSPLcom/android/server/am/PackageList;->put(Ljava/lang/String;Lcom/android/internal/app/procstats/ProcessStats$ProcessStateHolder;)Lcom/android/internal/app/procstats/ProcessStats$ProcessStateHolder;
+HSPLcom/android/server/am/PackageList;->put(Ljava/lang/String;Lcom/android/internal/app/procstats/ProcessStats$ProcessStateHolder;)Lcom/android/internal/app/procstats/ProcessStats$ProcessStateHolder;+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/PackageList;->searchEachPackage(Ljava/util/function/Function;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Function;Lcom/android/server/am/ContentProviderHelper$$ExternalSyntheticLambda2;
-HSPLcom/android/server/am/PendingIntentController;-><init>(Landroid/os/Looper;Lcom/android/server/am/UserController;Lcom/android/server/am/ActivityManagerConstants;)V
 HPLcom/android/server/am/PendingIntentController;->cancelIntentSender(Landroid/content/IIntentSender;)V+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;
-HPLcom/android/server/am/PendingIntentController;->cancelIntentSender(Lcom/android/server/am/PendingIntentRecord;Z)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;
-HSPLcom/android/server/am/PendingIntentController;->decrementUidStatLocked(Lcom/android/server/am/PendingIntentRecord;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HPLcom/android/server/am/PendingIntentController;->cancelIntentSender(Lcom/android/server/am/PendingIntentRecord;Z)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;]Landroid/os/Handler;Landroid/os/Handler;
+HSPLcom/android/server/am/PendingIntentController;->decrementUidStatLocked(Lcom/android/server/am/PendingIntentRecord;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/am/PendingIntentController;->getIntentSender(ILjava/lang/String;Ljava/lang/String;IILandroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;)Lcom/android/server/am/PendingIntentRecord;+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/app/ActivityOptions;Landroid/app/ActivityOptions;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;]Landroid/content/Intent;Landroid/content/Intent;
-HSPLcom/android/server/am/PendingIntentController;->incrementUidStatLocked(Lcom/android/server/am/PendingIntentRecord;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HPLcom/android/server/am/PendingIntentController;->makeIntentSenderCanceled(Lcom/android/server/am/PendingIntentRecord;)V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/AlarmManagerInternal;Lcom/android/server/alarm/AlarmManagerService$LocalService;]Lcom/android/server/am/PendingIntentRecord;Lcom/android/server/am/PendingIntentRecord;
-HSPLcom/android/server/am/PendingIntentController;->onActivityManagerInternalAdded()V
+HSPLcom/android/server/am/PendingIntentController;->incrementUidStatLocked(Lcom/android/server/am/PendingIntentRecord;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/am/PendingIntentRecord$Key;Lcom/android/server/am/PendingIntentRecord$Key;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/util/RingBuffer;Lcom/android/internal/util/RingBuffer;
+HPLcom/android/server/am/PendingIntentController;->makeIntentSenderCanceled(Lcom/android/server/am/PendingIntentRecord;)V+]Lcom/android/server/AlarmManagerInternal;Lcom/android/server/alarm/AlarmManagerService$LocalService;]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/am/PendingIntentRecord;Lcom/android/server/am/PendingIntentRecord;
 HPLcom/android/server/am/PendingIntentController;->registerIntentSenderCancelListener(Landroid/content/IIntentSender;Lcom/android/internal/os/IResultReceiver;)Z
 HPLcom/android/server/am/PendingIntentController;->setPendingIntentAllowlistDuration(Landroid/content/IIntentSender;Landroid/os/IBinder;JIILjava/lang/String;)V+]Lcom/android/server/am/PendingIntentRecord;Lcom/android/server/am/PendingIntentRecord;
 HPLcom/android/server/am/PendingIntentController;->unregisterIntentSenderCancelListener(Landroid/content/IIntentSender;Lcom/android/internal/os/IResultReceiver;)V
-HSPLcom/android/server/am/PendingIntentRecord$Key;-><init>(ILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILcom/android/server/wm/SafeActivityOptions;I)V+]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/am/PendingIntentRecord$Key;-><init>(ILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILcom/android/server/wm/SafeActivityOptions;I)V+]Ljava/lang/Object;Ljava/lang/String;,Lcom/android/server/wm/ActivityRecord$Token;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/PendingIntentRecord$Key;->equals(Ljava/lang/Object;)Z+]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/am/PendingIntentRecord$Key;->hashCode()I
 HPLcom/android/server/am/PendingIntentRecord$TempAllowListDuration;-><init>(JIILjava/lang/String;)V
 HSPLcom/android/server/am/PendingIntentRecord;-><init>(Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentRecord$Key;I)V
 HSPLcom/android/server/am/PendingIntentRecord;->completeFinalize()V+]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;
 HPLcom/android/server/am/PendingIntentRecord;->detachCancelListenersLocked()Landroid/os/RemoteCallbackList;
-HPLcom/android/server/am/PendingIntentRecord;->getBackgroundStartPrivilegesForActivitySender(Landroid/util/ArraySet;Landroid/os/IBinder;Landroid/os/Bundle;I)Landroid/app/BackgroundStartPrivileges;
-HPLcom/android/server/am/PendingIntentRecord;->registerCancelListenerLocked(Lcom/android/internal/os/IResultReceiver;)V
-HPLcom/android/server/am/PendingIntentRecord;->sendInner(Landroid/app/IApplicationThread;ILandroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;)I
+HPLcom/android/server/am/PendingIntentRecord;->getBackgroundStartPrivilegesForActivitySender(Landroid/util/ArraySet;Landroid/os/IBinder;Landroid/os/Bundle;I)Landroid/app/BackgroundStartPrivileges;+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;
+HPLcom/android/server/am/PendingIntentRecord;->registerCancelListenerLocked(Lcom/android/internal/os/IResultReceiver;)V+]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
+HPLcom/android/server/am/PendingIntentRecord;->sendInner(Landroid/app/IApplicationThread;ILandroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;)I+]Lcom/android/server/wm/SafeActivityOptions;Lcom/android/server/wm/SafeActivityOptions;]Landroid/content/IIntentReceiver;Landroid/app/PendingIntent$FinishedDispatcher;,Landroid/content/IIntentReceiver$Stub$Proxy;]Landroid/app/ActivityOptions;Landroid/app/ActivityOptions;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/Intent;Landroid/content/Intent;
 HPLcom/android/server/am/PendingIntentRecord;->sendWithResult(Landroid/app/IApplicationThread;ILandroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/Bundle;)I
 HPLcom/android/server/am/PendingIntentRecord;->setAllowBgActivityStarts(Landroid/os/IBinder;I)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/am/PendingIntentRecord;->setAllowlistDurationLocked(Landroid/os/IBinder;JIILjava/lang/String;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HPLcom/android/server/am/PendingIntentRecord;->unregisterCancelListenerLocked(Lcom/android/internal/os/IResultReceiver;)V
-HSPLcom/android/server/am/PendingStartActivityUids;-><init>()V
-HPLcom/android/server/am/PendingStartActivityUids;->add(II)Z
+HPLcom/android/server/am/PendingIntentRecord;->unregisterCancelListenerLocked(Lcom/android/internal/os/IResultReceiver;)V+]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
+HSPLcom/android/server/am/PendingStartActivityUids;->add(II)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/am/PendingStartActivityUids;->delete(IJ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/am/PendingStartActivityUids;->isPendingTopUid(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/am/PendingTempAllowlists;-><init>(Lcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/PendingTempAllowlists;->indexOfKey(I)I
-HSPLcom/android/server/am/PendingTempAllowlists;->put(ILcom/android/server/am/ActivityManagerService$PendingTempAllowlist;)V
-HSPLcom/android/server/am/PendingTempAllowlists;->valueAt(I)Lcom/android/server/am/ActivityManagerService$PendingTempAllowlist;
-HSPLcom/android/server/am/PhantomProcessList$Injector;-><init>()V
-HSPLcom/android/server/am/PhantomProcessList;-><clinit>()V
-HSPLcom/android/server/am/PhantomProcessList;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/PendingTempAllowlists;->indexOfKey(I)I+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/am/PendingTempAllowlists;->put(ILcom/android/server/am/ActivityManagerService$PendingTempAllowlist;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/am/PendingTempAllowlists;->valueAt(I)Lcom/android/server/am/ActivityManagerService$PendingTempAllowlist;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/am/PhantomProcessList;->addChildPidLocked(Lcom/android/server/am/ProcessRecord;II)V+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/PhantomProcessList$Injector;Lcom/android/server/am/PhantomProcessList$Injector;
-HPLcom/android/server/am/PhantomProcessList;->forEachPhantomProcessOfApp(Lcom/android/server/am/ProcessRecord;Ljava/util/function/Function;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/function/Function;Lcom/android/server/am/ActivityManagerService$$ExternalSyntheticLambda29;,Lcom/android/server/am/ActivityManagerService$$ExternalSyntheticLambda28;]Ljava/lang/Boolean;Ljava/lang/Boolean;
+HPLcom/android/server/am/PhantomProcessList;->forEachPhantomProcessOfApp(Lcom/android/server/am/ProcessRecord;Ljava/util/function/Function;)V+]Ljava/util/function/Function;Lcom/android/server/am/ActivityManagerService$$ExternalSyntheticLambda28;,Lcom/android/server/am/ActivityManagerService$$ExternalSyntheticLambda29;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HPLcom/android/server/am/PhantomProcessList;->getCgroupFilePath(II)Ljava/lang/String;
-HPLcom/android/server/am/PhantomProcessList;->getOrCreatePhantomProcessIfNeededLocked(Ljava/lang/String;IIZ)Lcom/android/server/am/PhantomProcessRecord;+]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/Handler;Lcom/android/server/am/ProcessList$KillHandler;]Lcom/android/server/am/PhantomProcessRecord;Lcom/android/server/am/PhantomProcessRecord;]Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;]Landroid/os/Looper;Landroid/os/Looper;]Landroid/os/MessageQueue;Landroid/os/MessageQueue;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HPLcom/android/server/am/PhantomProcessList;->getOrCreatePhantomProcessIfNeededLocked(Ljava/lang/String;IIZ)Lcom/android/server/am/PhantomProcessRecord;+]Landroid/os/Handler;Lcom/android/server/am/ProcessList$KillHandler;]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Lcom/android/server/am/PhantomProcessRecord;Lcom/android/server/am/PhantomProcessRecord;]Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/Looper;Landroid/os/Looper;]Landroid/os/MessageQueue;Landroid/os/MessageQueue;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/am/PhantomProcessList;->isAppProcess(I)Z+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;
 HPLcom/android/server/am/PhantomProcessList;->lookForPhantomProcessesLocked()V+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/am/PhantomProcessList;->lookForPhantomProcessesLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Ljava/io/InputStream;Ljava/io/FileInputStream;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/PhantomProcessList$Injector;Lcom/android/server/am/PhantomProcessList$Injector;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
-HSPLcom/android/server/am/PhantomProcessList;->onAppDied(I)V
-HSPLcom/android/server/am/PhantomProcessList;->probeCgroupVersion()V
+HSPLcom/android/server/am/PhantomProcessList;->onAppDied(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/am/PhantomProcessList;->updateProcessCpuStatesLocked(Lcom/android/internal/os/ProcessCpuTracker;)V+]Lcom/android/internal/os/ProcessCpuTracker;Lcom/android/internal/os/ProcessCpuTracker;]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Lcom/android/server/am/PhantomProcessRecord;Lcom/android/server/am/PhantomProcessRecord;
-HSPLcom/android/server/am/PlatformCompatCache$CacheItem;->fetchLocked(Landroid/content/pm/ApplicationInfo;I)Z
+HSPLcom/android/server/am/PlatformCompatCache$CacheItem;->fetchLocked(Landroid/content/pm/ApplicationInfo;I)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;
 HSPLcom/android/server/am/PlatformCompatCache$CacheItem;->invalidate(Landroid/content/pm/ApplicationInfo;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/am/PlatformCompatCache$CacheItem;->isChangeEnabled(Landroid/content/pm/ApplicationInfo;)Z
+HSPLcom/android/server/am/PlatformCompatCache$CacheItem;->isChangeEnabled(Landroid/content/pm/ApplicationInfo;)Z+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;]Lcom/android/server/am/PlatformCompatCache$CacheItem;Lcom/android/server/am/PlatformCompatCache$CacheItem;
 HSPLcom/android/server/am/PlatformCompatCache;->getInstance()Lcom/android/server/am/PlatformCompatCache;
 HSPLcom/android/server/am/PlatformCompatCache;->invalidate(Landroid/content/pm/ApplicationInfo;)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/am/PlatformCompatCache$CacheItem;Lcom/android/server/am/PlatformCompatCache$CacheItem;
-HSPLcom/android/server/am/PlatformCompatCache;->isChangeEnabled(JLandroid/content/pm/ApplicationInfo;Z)Z
+HSPLcom/android/server/am/PlatformCompatCache;->isChangeEnabled(JLandroid/content/pm/ApplicationInfo;Z)Z+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/am/PlatformCompatCache$CacheItem;Lcom/android/server/am/PlatformCompatCache$CacheItem;
 HSPLcom/android/server/am/ProcessCachedOptimizerRecord;-><init>(Lcom/android/server/am/ProcessRecord;)V
-HPLcom/android/server/am/ProcessCachedOptimizerRecord;->getEarliestFreezableTime()J
+HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->getEarliestFreezableTime()J
 HPLcom/android/server/am/ProcessCachedOptimizerRecord;->getFreezeUnfreezeTime()J
-HPLcom/android/server/am/ProcessCachedOptimizerRecord;->getLastCompactProfile()Lcom/android/server/am/CachedAppOptimizer$CompactProfile;
-HPLcom/android/server/am/ProcessCachedOptimizerRecord;->getReqCompactSource()Lcom/android/server/am/CachedAppOptimizer$CompactSource;
 HPLcom/android/server/am/ProcessCachedOptimizerRecord;->isForceCompact()Z
 HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->isFreezeExempt()Z
 HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->isFreezeSticky()Z
 HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->isFrozen()Z
 HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->isPendingFreeze()Z
-HPLcom/android/server/am/ProcessCachedOptimizerRecord;->setEarliestFreezableTime(J)V
+HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->setEarliestFreezableTime(J)V
 HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->setFreezerOverride(Z)V
 HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->setLastOomAdjChangeReason(I)V
-HPLcom/android/server/am/ProcessCachedOptimizerRecord;->setPendingFreeze(Z)V
+HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->setPendingFreeze(Z)V
 HPLcom/android/server/am/ProcessCachedOptimizerRecord;->setReqCompactProfile(Lcom/android/server/am/CachedAppOptimizer$CompactProfile;)V
 HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->setShouldNotFreeze(Z)V+]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;
 HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->setShouldNotFreeze(ZZ)Z
@@ -2026,86 +1637,75 @@
 HPLcom/android/server/am/ProcessCachedOptimizerRecord;->skipPSSCollectionBecauseFrozen()Z
 HSPLcom/android/server/am/ProcessErrorStateRecord;-><init>(Lcom/android/server/am/ProcessRecord;)V
 HSPLcom/android/server/am/ProcessErrorStateRecord;->isCrashing()Z
-HSPLcom/android/server/am/ProcessErrorStateRecord;->onCleanupApplicationRecordLSP()V
-HSPLcom/android/server/am/ProcessErrorStateRecord;->setCrashing(Z)V
-HSPLcom/android/server/am/ProcessErrorStateRecord;->setNotResponding(Z)V
+HSPLcom/android/server/am/ProcessErrorStateRecord;->onCleanupApplicationRecordLSP()V+]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;
+HSPLcom/android/server/am/ProcessErrorStateRecord;->setCrashing(Z)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ProcessErrorStateRecord;->setNotResponding(Z)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ProcessList$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V
 HSPLcom/android/server/am/ProcessList$$ExternalSyntheticLambda1;->run()V
-HSPLcom/android/server/am/ProcessList$$ExternalSyntheticLambda4;-><init>(Lcom/android/server/am/ProcessList;)V
 HSPLcom/android/server/am/ProcessList$$ExternalSyntheticLambda5;-><init>(Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V
 HSPLcom/android/server/am/ProcessList$$ExternalSyntheticLambda5;->run()V
-HSPLcom/android/server/am/ProcessList$1;-><init>(Lcom/android/server/am/ProcessList;)V
-HSPLcom/android/server/am/ProcessList$2;-><init>(Lcom/android/server/am/ProcessList;)V
-HSPLcom/android/server/am/ProcessList$ImperceptibleKillRunner$H;-><init>(Lcom/android/server/am/ProcessList$ImperceptibleKillRunner;Landroid/os/Looper;)V
-HSPLcom/android/server/am/ProcessList$ImperceptibleKillRunner;-><init>(Lcom/android/server/am/ProcessList;Landroid/os/Looper;)V
-HSPLcom/android/server/am/ProcessList$IsolatedUidRange;-><init>(Lcom/android/server/am/ProcessList;II)V
 HSPLcom/android/server/am/ProcessList$IsolatedUidRange;->freeIsolatedUidLocked(I)V
-HSPLcom/android/server/am/ProcessList$IsolatedUidRangeAllocator;-><init>(Lcom/android/server/am/ProcessList;III)V
-HSPLcom/android/server/am/ProcessList$KillHandler;-><init>(Lcom/android/server/am/ProcessList;Landroid/os/Looper;)V
-HSPLcom/android/server/am/ProcessList$MyProcessMap;-><init>(Lcom/android/server/am/ProcessList;)V
-HSPLcom/android/server/am/ProcessList$MyProcessMap;->put(Ljava/lang/String;ILcom/android/server/am/ProcessRecord;)Lcom/android/server/am/ProcessRecord;
-HSPLcom/android/server/am/ProcessList$MyProcessMap;->remove(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord;
-HSPLcom/android/server/am/ProcessList$ProcStartHandler;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;)V
+HSPLcom/android/server/am/ProcessList$MyProcessMap;->put(Ljava/lang/String;ILcom/android/server/am/ProcessRecord;)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ProcessList$MyProcessMap;->remove(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;
 HSPLcom/android/server/am/ProcessList$ProcStateMemTracker;-><init>()V
-HSPLcom/android/server/am/ProcessList;-><clinit>()V
 HSPLcom/android/server/am/ProcessList;-><init>()V
-HSPLcom/android/server/am/ProcessList;->addProcessNameLocked(Lcom/android/server/am/ProcessRecord;)V
+HSPLcom/android/server/am/ProcessList;->addProcessNameLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ProcessList;->buildOomTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIZ)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/am/ProcessList;->checkSlow(JLjava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/am/ProcessList;->computeGidsForProcess(II[IZ)[I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ProcessList;->computeNextPssTime(ILcom/android/server/am/ProcessList$ProcStateMemTracker;ZZJJ)J
-HSPLcom/android/server/am/ProcessList;->createSystemServerSocketForZygote()Landroid/net/LocalSocket;
-HSPLcom/android/server/am/ProcessList;->dispatchProcessDied(II)V+]Landroid/app/IProcessObserver;Lcom/android/server/app/GameServiceProviderInstanceImpl$5;,Lcom/android/server/devicestate/DeviceStateManagerService$1;,Lcom/android/server/am/AppFGSTracker$1;,Lcom/android/server/media/projection/MediaProjectionManagerService$1;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
-HPLcom/android/server/am/ProcessList;->dispatchProcessesChanged()V+]Landroid/app/IProcessObserver;Lcom/android/server/app/GameServiceProviderInstanceImpl$5;,Lcom/android/server/devicestate/DeviceStateManagerService$1;,Lcom/android/server/am/AppFGSTracker$1;,Lcom/android/server/media/projection/MediaProjectionManagerService$1;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
-HPLcom/android/server/am/ProcessList;->enqueueProcessChangeItemLocked(II)Lcom/android/server/am/ActivityManagerService$ProcessChangeItem;
-HSPLcom/android/server/am/ProcessList;->fillInProcMemInfoLOSP(Lcom/android/server/am/ProcessRecord;Landroid/app/ActivityManager$RunningAppProcessInfo;I)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HSPLcom/android/server/am/ProcessList;->findAppProcessLOSP(Landroid/os/IBinder;Ljava/lang/String;)Lcom/android/server/am/ProcessRecord;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/internal/app/ProcessMap;Lcom/android/server/am/ProcessList$MyProcessMap;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/am/ProcessList;->dispatchProcessDied(II)V+]Landroid/app/IProcessObserver;Lcom/android/server/app/GameServiceProviderInstanceImpl$5;,Lcom/android/server/devicestate/DeviceStateManagerService$1;,Lcom/android/server/media/projection/MediaProjectionManagerService$1;,Lcom/android/server/am/AppFGSTracker$1;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
+HSPLcom/android/server/am/ProcessList;->dispatchProcessesChanged()V+]Landroid/app/IProcessObserver;Lcom/android/server/app/GameServiceProviderInstanceImpl$5;,Lcom/android/server/devicestate/DeviceStateManagerService$1;,Lcom/android/server/media/projection/MediaProjectionManagerService$1;,Lcom/android/server/am/AppFGSTracker$1;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
+HSPLcom/android/server/am/ProcessList;->enqueueProcessChangeItemLocked(II)Lcom/android/server/am/ActivityManagerService$ProcessChangeItem;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/ProcessList;->fillInProcMemInfoLOSP(Lcom/android/server/am/ProcessRecord;Landroid/app/ActivityManager$RunningAppProcessInfo;I)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
+HSPLcom/android/server/am/ProcessList;->findAppProcessLOSP(Landroid/os/IBinder;Ljava/lang/String;)Lcom/android/server/am/ProcessRecord;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/internal/app/ProcessMap;Lcom/android/server/am/ProcessList$MyProcessMap;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
 HSPLcom/android/server/am/ProcessList;->forEachLruProcessesLOSP(ZLjava/util/function/Consumer;)V+]Ljava/util/function/Consumer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/am/ProcessList;->getBlockStateForUid(Lcom/android/server/am/UidRecord;)I
+HPLcom/android/server/am/ProcessList;->getBlockStateForUid(Lcom/android/server/am/UidRecord;)I+]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;
 HSPLcom/android/server/am/ProcessList;->getLRURecordForAppLOSP(Landroid/os/IBinder;)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
 HSPLcom/android/server/am/ProcessList;->getLruProcessesLOSP()Ljava/util/ArrayList;
 HSPLcom/android/server/am/ProcessList;->getLruSizeLOSP()I+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ProcessList;->getMemLevel(I)J
 HSPLcom/android/server/am/ProcessList;->getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
 HSPLcom/android/server/am/ProcessList;->getNextProcStateSeq()J
-HPLcom/android/server/am/ProcessList;->getNumForegroundServices()Landroid/util/Pair;+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/am/ProcessList;->getPackageAppDataInfoMap(Landroid/content/pm/PackageManagerInternal;[Ljava/lang/String;I)Ljava/util/Map;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/Map;Landroid/util/ArrayMap;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/am/ProcessList;->getNumForegroundServices()Landroid/util/Pair;+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/ProcessList;->getPackageAppDataInfoMap(Landroid/content/pm/PackageManagerInternal;[Ljava/lang/String;I)Ljava/util/Map;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/util/Map;Landroid/util/ArrayMap;
 HSPLcom/android/server/am/ProcessList;->getProcessRecordLocked(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/ProcessMap;Lcom/android/server/am/ProcessList$MyProcessMap;
 HSPLcom/android/server/am/ProcessList;->getRunningAppProcessesLOSP(ZIZII)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/ActivityServiceConnectionsHolder;Lcom/android/server/wm/ActivityServiceConnectionsHolder;
 HSPLcom/android/server/am/ProcessList;->getSdkSandboxProcessesForAppLocked(I)Ljava/util/List;
 HSPLcom/android/server/am/ProcessList;->getUidProcStateLOSP(I)I+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;
 HSPLcom/android/server/am/ProcessList;->getUidProcessCapabilityLOSP(I)I+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;
 HSPLcom/android/server/am/ProcessList;->getUidRecordLOSP(I)Lcom/android/server/am/UidRecord;+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;
-HSPLcom/android/server/am/ProcessList;->handleProcessStartedLocked(Lcom/android/server/am/ProcessRecord;IZJZ)Z
-HSPLcom/android/server/am/ProcessList;->haveBackgroundProcessLOSP()Z+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/am/ProcessList;->incrementProcStateSeqAndNotifyAppsLOSP(Lcom/android/server/am/ActiveUids;)V+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
-HSPLcom/android/server/am/ProcessList;->init(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActiveUids;Lcom/android/server/compat/PlatformCompat;)V
-HSPLcom/android/server/am/ProcessList;->isProcStartValidLocked(Lcom/android/server/am/ProcessRecord;J)Ljava/lang/String;
-HSPLcom/android/server/am/ProcessList;->killAppIfBgRestrictedAndCachedIdleLocked(Lcom/android/server/am/ProcessRecord;J)J+]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
-HPLcom/android/server/am/ProcessList;->killPackageProcessesLSP(Ljava/lang/String;IIIZZZZZZIILjava/lang/String;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/util/List;Ljava/util/ArrayList$SubList;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/internal/app/ProcessMap;Lcom/android/server/am/ProcessList$MyProcessMap;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$SubList$1;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/am/ProcessList;->lambda$handleProcessStart$1(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V
+HPLcom/android/server/am/ProcessList;->handleDyingAppDeathLocked(Lcom/android/server/am/ProcessRecord;I)Z
+HSPLcom/android/server/am/ProcessList;->handleProcessStart(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ProcessList;->handleProcessStartedLocked(Lcom/android/server/am/ProcessRecord;IZJZ)Z+]Lcom/android/server/Watchdog;Lcom/android/server/Watchdog;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ProcessList;->haveBackgroundProcessLOSP()Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
+HSPLcom/android/server/am/ProcessList;->incrementProcStateSeqAndNotifyAppsLOSP(Lcom/android/server/am/ActiveUids;)V+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
+HSPLcom/android/server/am/ProcessList;->isProcStartValidLocked(Lcom/android/server/am/ProcessRecord;J)Ljava/lang/String;+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ProcessList;->killAppIfBgRestrictedAndCachedIdleLocked(Lcom/android/server/am/ProcessRecord;J)J+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
+HPLcom/android/server/am/ProcessList;->killPackageProcessesLSP(Ljava/lang/String;IIIZZZZZZIILjava/lang/String;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/util/List;Ljava/util/ArrayList$SubList;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/internal/app/ProcessMap;Lcom/android/server/am/ProcessList$MyProcessMap;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$SubList$1;
+HSPLcom/android/server/am/ProcessList;->lambda$handleProcessStart$1(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ProcessList;->makeOomAdjString(IZ)Ljava/lang/String;
 HSPLcom/android/server/am/ProcessList;->makeProcStateString(I)Ljava/lang/String;
 HSPLcom/android/server/am/ProcessList;->minTimeFromStateChange(Z)J
-HSPLcom/android/server/am/ProcessList;->newProcessRecordLocked(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ZIZILjava/lang/String;Lcom/android/server/am/HostingRecord;)Lcom/android/server/am/ProcessRecord;
-HSPLcom/android/server/am/ProcessList;->noteProcessDiedLocked(Lcom/android/server/am/ProcessRecord;)V
+HSPLcom/android/server/am/ProcessList;->newProcessRecordLocked(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ZIZILjava/lang/String;Lcom/android/server/am/HostingRecord;)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/am/ProcessList;->noteProcessDiedLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/Watchdog;Lcom/android/server/Watchdog;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;
 HSPLcom/android/server/am/ProcessList;->procStateToImportance(IILandroid/app/ActivityManager$RunningAppProcessInfo;I)I
 HSPLcom/android/server/am/ProcessList;->procStatesDifferForMem(II)Z
 HSPLcom/android/server/am/ProcessList;->remove(I)V
-HSPLcom/android/server/am/ProcessList;->removeLruProcessLocked(Lcom/android/server/am/ProcessRecord;)V
-HSPLcom/android/server/am/ProcessList;->removeProcessNameLocked(Ljava/lang/String;ILcom/android/server/am/ProcessRecord;)Lcom/android/server/am/ProcessRecord;
-HSPLcom/android/server/am/ProcessList;->scheduleDispatchProcessDiedLocked(II)V
+HSPLcom/android/server/am/ProcessList;->removeLruProcessLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ProcessList;->removeProcessNameLocked(Ljava/lang/String;ILcom/android/server/am/ProcessRecord;)Lcom/android/server/am/ProcessRecord;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ProcessList;->scheduleDispatchProcessDiedLocked(II)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ProcessList;->searchEachLruProcessesLOSP(ZLjava/util/function/Function;)Ljava/lang/Object;+]Ljava/util/function/Function;Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda5;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda6;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda1;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda8;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/am/ProcessList;->sendPackageBroadcastLocked(I[Ljava/lang/String;I)V+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
 HSPLcom/android/server/am/ProcessList;->setOomAdj(III)V+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLcom/android/server/am/ProcessList;->startProcess(Lcom/android/server/am/HostingRecord;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;I[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)Landroid/os/Process$ProcessStartResult;+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/AppStateTracker;Lcom/android/server/AppStateTrackerImpl;]Landroid/os/ChildZygoteProcess;Landroid/os/ChildZygoteProcess;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/util/Set;Landroid/util/ArraySet;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/HostingRecord;Lcom/android/server/am/HostingRecord;]Ljava/lang/String;Ljava/lang/String;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/os/AppZygote;Landroid/os/AppZygote;
-HSPLcom/android/server/am/ProcessList;->startProcessLocked(Lcom/android/server/am/HostingRecord;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;I[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJ)Z
-HSPLcom/android/server/am/ProcessList;->startProcessLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/HostingRecord;IZZLjava/lang/String;)Z
-HSPLcom/android/server/am/ProcessList;->startProcessLocked(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;ZILcom/android/server/am/HostingRecord;IZZIZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Runnable;)Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ProcessList;->startProcess(Lcom/android/server/am/HostingRecord;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;I[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)Landroid/os/Process$ProcessStartResult;+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Lcom/android/server/AppStateTracker;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/AppZygote;Landroid/os/AppZygote;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/ChildZygoteProcess;Landroid/os/ChildZygoteProcess;]Ljava/util/Set;Landroid/util/ArraySet;]Lcom/android/server/am/HostingRecord;Lcom/android/server/am/HostingRecord;]Ljava/lang/String;Ljava/lang/String;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
+HSPLcom/android/server/am/ProcessList;->startProcessLocked(Lcom/android/server/am/HostingRecord;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;I[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJ)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ProcessList;->startProcessLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/HostingRecord;IZZLjava/lang/String;)Z+]Lcom/android/server/am/ActivityManagerService$HiddenApiSettings;Lcom/android/server/am/ActivityManagerService$HiddenApiSettings;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Landroid/os/storage/StorageManagerInternal;Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/am/ProcessList;->startProcessLocked(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;ZILcom/android/server/am/HostingRecord;IZZIZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Runnable;)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/am/AppErrors;Lcom/android/server/am/AppErrors;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ProcessList;->updateClientActivitiesOrderingLSP(Lcom/android/server/am/ProcessRecord;III)V+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/am/ProcessList;->updateLruProcessInternalLSP(Lcom/android/server/am/ProcessRecord;JIILjava/lang/String;Ljava/lang/Object;Lcom/android/server/am/ProcessRecord;)I+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ProcessList;->updateLruProcessLSP(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;ZZ)V+]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ProcessList;->updateLruProcessLocked(Lcom/android/server/am/ProcessRecord;ZLcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
-HSPLcom/android/server/am/ProcessList;->updateOomLevels(IIZ)V
 HSPLcom/android/server/am/ProcessList;->updateSeInfo(Lcom/android/server/am/ProcessRecord;)Ljava/lang/String;
 HSPLcom/android/server/am/ProcessList;->writeLmkd(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Z+]Lcom/android/server/am/LmkdConnection;Lcom/android/server/am/LmkdConnection;
 HSPLcom/android/server/am/ProcessProfileRecord$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/am/ProcessProfileRecord;Lcom/android/internal/app/procstats/ProcessState;Lcom/android/server/am/ProcessStatsService;ILcom/android/internal/app/procstats/ProcessState;)V
@@ -2114,11 +1714,10 @@
 HSPLcom/android/server/am/ProcessProfileRecord;->abortNextPssTime()V
 HSPLcom/android/server/am/ProcessProfileRecord;->abortNextPssTime(Lcom/android/server/am/ProcessList$ProcStateMemTracker;)V
 HSPLcom/android/server/am/ProcessProfileRecord;->addHostingComponentType(I)V+]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
-HPLcom/android/server/am/ProcessProfileRecord;->addPss(JJJZIJ)V
+HPLcom/android/server/am/ProcessProfileRecord;->addPss(JJJZIJ)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ProcessProfileRecord;->clearHostingComponentType(I)V+]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
 HPLcom/android/server/am/ProcessProfileRecord;->commitNextPssTime(Lcom/android/server/am/ProcessList$ProcStateMemTracker;)V
 HSPLcom/android/server/am/ProcessProfileRecord;->computeNextPssTime(IZZJ)J
-HSPLcom/android/server/am/ProcessProfileRecord;->getBaseProcessTracker()Lcom/android/internal/app/procstats/ProcessState;
 HPLcom/android/server/am/ProcessProfileRecord;->getCurrentHostingComponentTypes()I+]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
 HPLcom/android/server/am/ProcessProfileRecord;->getHistoricalHostingComponentTypes()I+]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
 HSPLcom/android/server/am/ProcessProfileRecord;->getLastPssTime()J
@@ -2126,50 +1725,44 @@
 HSPLcom/android/server/am/ProcessProfileRecord;->getNextPssTime()J
 HPLcom/android/server/am/ProcessProfileRecord;->getPid()I
 HPLcom/android/server/am/ProcessProfileRecord;->getPssProcState()I
-HPLcom/android/server/am/ProcessProfileRecord;->getPssStatType()I
 HPLcom/android/server/am/ProcessProfileRecord;->getSetProcState()I
 HPLcom/android/server/am/ProcessProfileRecord;->getThread()Landroid/app/IApplicationThread;
 HSPLcom/android/server/am/ProcessProfileRecord;->getTrimMemoryLevel()I
 HSPLcom/android/server/am/ProcessProfileRecord;->getUidForAttribution(Lcom/android/server/am/ProcessRecord;)I
-HSPLcom/android/server/am/ProcessProfileRecord;->init(J)V
 HSPLcom/android/server/am/ProcessProfileRecord;->lambda$onProcessActive$0(Lcom/android/internal/app/procstats/ProcessState;Lcom/android/server/am/ProcessStatsService;ILcom/android/internal/app/procstats/ProcessState;Ljava/lang/String;Lcom/android/internal/app/procstats/ProcessStats$ProcessStateHolder;)V
-HSPLcom/android/server/am/ProcessProfileRecord;->onProcessActive(Landroid/app/IApplicationThread;Lcom/android/server/am/ProcessStatsService;)V
-HPLcom/android/server/am/ProcessProfileRecord;->onProcessFrozen()V
-HSPLcom/android/server/am/ProcessProfileRecord;->onProcessInactive(Lcom/android/server/am/ProcessStatsService;)V
-HPLcom/android/server/am/ProcessProfileRecord;->onProcessUnfrozen()V
-HSPLcom/android/server/am/ProcessProfileRecord;->setBaseProcessTracker(Lcom/android/internal/app/procstats/ProcessState;)V
+HSPLcom/android/server/am/ProcessProfileRecord;->onProcessActive(Landroid/app/IApplicationThread;Lcom/android/server/am/ProcessStatsService;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HPLcom/android/server/am/ProcessProfileRecord;->onProcessFrozen()V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ProcessProfileRecord;->onProcessInactive(Lcom/android/server/am/ProcessStatsService;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HPLcom/android/server/am/ProcessProfileRecord;->onProcessUnfrozen()V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ProcessProfileRecord;->setPendingUiClean(Z)V
-HSPLcom/android/server/am/ProcessProfileRecord;->setProcessTrackerState(II)V+]Lcom/android/internal/app/procstats/ProcessState;Lcom/android/internal/app/procstats/ProcessState;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ProcessProfileRecord;->setProcessTrackerState(II)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/internal/app/procstats/ProcessState;Lcom/android/internal/app/procstats/ProcessState;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;
 HPLcom/android/server/am/ProcessProfileRecord;->setPssProcState(I)V
 HPLcom/android/server/am/ProcessProfileRecord;->setPssStatType(I)V
 HSPLcom/android/server/am/ProcessProfileRecord;->updateProcState(Lcom/android/server/am/ProcessStateRecord;)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;
 HSPLcom/android/server/am/ProcessProviderRecord;-><init>(Lcom/android/server/am/ProcessRecord;)V
 HSPLcom/android/server/am/ProcessProviderRecord;->addProviderConnection(Lcom/android/server/am/ContentProviderConnection;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/am/ProcessProviderRecord;->ensureProviderCapacity(I)V
 HSPLcom/android/server/am/ProcessProviderRecord;->getProvider(Ljava/lang/String;)Lcom/android/server/am/ContentProviderRecord;
 HSPLcom/android/server/am/ProcessProviderRecord;->getProviderAt(I)Lcom/android/server/am/ContentProviderRecord;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/am/ProcessProviderRecord;->getProviderConnectionAt(I)Lcom/android/server/am/ContentProviderConnection;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/am/ProcessProviderRecord;->installProvider(Ljava/lang/String;Lcom/android/server/am/ContentProviderRecord;)V
 HSPLcom/android/server/am/ProcessProviderRecord;->numberOfProviderConnections()I+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ProcessProviderRecord;->numberOfProviders()I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/am/ProcessProviderRecord;->onCleanupApplicationRecordLocked(Z)Z+]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
-HPLcom/android/server/am/ProcessProviderRecord;->removeProviderConnection(Lcom/android/server/am/ContentProviderConnection;)Z
+HSPLcom/android/server/am/ProcessProviderRecord;->onCleanupApplicationRecordLocked(Z)Z+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;
 HSPLcom/android/server/am/ProcessReceiverRecord;-><init>(Lcom/android/server/am/ProcessRecord;)V
 HSPLcom/android/server/am/ProcessReceiverRecord;->addReceiver(Lcom/android/server/am/ReceiverList;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/ProcessReceiverRecord;->decrementCurReceivers()V
 HSPLcom/android/server/am/ProcessReceiverRecord;->incrementCurReceivers()V
 HSPLcom/android/server/am/ProcessReceiverRecord;->numberOfReceivers()I+]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/am/ProcessReceiverRecord;->onCleanupApplicationRecordLocked()V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ProcessReceiverRecord;->onCleanupApplicationRecordLocked()V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/am/ProcessReceiverRecord;->removeReceiver(Lcom/android/server/am/ReceiverList;)V
-HSPLcom/android/server/am/ProcessRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;)V
-HSPLcom/android/server/am/ProcessRecord;->addPackage(Ljava/lang/String;JLcom/android/server/am/ProcessStatsService;)Z+]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/internal/app/procstats/ProcessState;Lcom/android/internal/app/procstats/ProcessState;
+HSPLcom/android/server/am/ProcessRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/am/ProcessRecord;->addPackage(Ljava/lang/String;JLcom/android/server/am/ProcessStatsService;)Z+]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/internal/app/procstats/ProcessState;Lcom/android/internal/app/procstats/ProcessState;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
 HSPLcom/android/server/am/ProcessRecord;->getActiveInstrumentation()Lcom/android/server/am/ActiveInstrumentation;
 HSPLcom/android/server/am/ProcessRecord;->getCpuDelayTime()J+]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;
 HSPLcom/android/server/am/ProcessRecord;->getHostingRecord()Lcom/android/server/am/HostingRecord;
 HSPLcom/android/server/am/ProcessRecord;->getLastActivityTime()J
-HPLcom/android/server/am/ProcessRecord;->getLruSeq()I
+HSPLcom/android/server/am/ProcessRecord;->getLruSeq()I
 HSPLcom/android/server/am/ProcessRecord;->getOnewayThread()Landroid/app/IApplicationThread;
-HSPLcom/android/server/am/ProcessRecord;->getPackageList()[Ljava/lang/String;
+HSPLcom/android/server/am/ProcessRecord;->getPackageList()[Ljava/lang/String;+]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;
 HSPLcom/android/server/am/ProcessRecord;->getPid()I
 HSPLcom/android/server/am/ProcessRecord;->getPkgDeps()Landroid/util/ArraySet;
 HSPLcom/android/server/am/ProcessRecord;->getPkgList()Lcom/android/server/am/PackageList;
@@ -2194,29 +1787,30 @@
 HSPLcom/android/server/am/ProcessRecord;->isThreadReady()Z
 HPLcom/android/server/am/ProcessRecord;->killLocked(Ljava/lang/String;Ljava/lang/String;IIZZ)V
 HSPLcom/android/server/am/ProcessRecord;->killProcessGroupIfNecessaryLocked(Z)V
-HSPLcom/android/server/am/ProcessRecord;->makeActive(Landroid/app/IApplicationThread;Lcom/android/server/am/ProcessStatsService;)V
-HSPLcom/android/server/am/ProcessRecord;->makeInactive(Lcom/android/server/am/ProcessStatsService;)V
-HSPLcom/android/server/am/ProcessRecord;->onCleanupApplicationRecordLSP(Lcom/android/server/am/ProcessStatsService;ZZ)Z
-HSPLcom/android/server/am/ProcessRecord;->removeBackgroundStartPrivileges(Landroid/os/Binder;)V
+HSPLcom/android/server/am/ProcessRecord;->makeActive(Landroid/app/IApplicationThread;Lcom/android/server/am/ProcessStatsService;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;
+HSPLcom/android/server/am/ProcessRecord;->makeInactive(Lcom/android/server/am/ProcessStatsService;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;
+HSPLcom/android/server/am/ProcessRecord;->onCleanupApplicationRecordLSP(Lcom/android/server/am/ProcessStatsService;ZZ)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ProcessRecord;->removeBackgroundStartPrivileges(Landroid/os/Binder;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;
 HSPLcom/android/server/am/ProcessRecord;->resetPackageList(Lcom/android/server/am/ProcessStatsService;)V
 HSPLcom/android/server/am/ProcessRecord;->setBackgroundStartPrivileges(Landroid/os/Binder;Landroid/app/BackgroundStartPrivileges;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/am/ProcessRecord;->setDebugging(Z)V
+HSPLcom/android/server/am/ProcessRecord;->setDebugging(Z)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;
 HSPLcom/android/server/am/ProcessRecord;->setLastActivityTime(J)V
 HSPLcom/android/server/am/ProcessRecord;->setLruSeq(I)V
 HSPLcom/android/server/am/ProcessRecord;->setPendingUiClean(Z)V+]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
-HSPLcom/android/server/am/ProcessRecord;->setPid(I)V
-HPLcom/android/server/am/ProcessRecord;->setRunningRemoteAnimation(Z)V
+HSPLcom/android/server/am/ProcessRecord;->setPid(I)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HSPLcom/android/server/am/ProcessRecord;->setRequiredAbi(Ljava/lang/String;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;
+HSPLcom/android/server/am/ProcessRecord;->setRunningRemoteAnimation(Z)V
 HSPLcom/android/server/am/ProcessRecord;->setStartParams(ILcom/android/server/am/HostingRecord;Ljava/lang/String;JJ)V
 HSPLcom/android/server/am/ProcessRecord;->setUidRecord(Lcom/android/server/am/UidRecord;)V
-HSPLcom/android/server/am/ProcessRecord;->setUsingWrapper(Z)V
+HSPLcom/android/server/am/ProcessRecord;->setUsingWrapper(Z)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;
 HPLcom/android/server/am/ProcessRecord;->toShortString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ProcessRecord;->toShortString(Ljava/lang/StringBuilder;)V
 HSPLcom/android/server/am/ProcessRecord;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
-HSPLcom/android/server/am/ProcessRecord;->unlinkDeathRecipient()V
-HPLcom/android/server/am/ProcessRecord;->updateProcessInfo(ZZZ)V
+HSPLcom/android/server/am/ProcessRecord;->unlinkDeathRecipient()V+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
+HSPLcom/android/server/am/ProcessRecord;->updateProcessInfo(ZZZ)V
 HSPLcom/android/server/am/ProcessRecord;->updateProcessRecordNodes(Lcom/android/server/am/ProcessRecord;)V
 HSPLcom/android/server/am/ProcessServiceRecord;-><init>(Lcom/android/server/am/ProcessRecord;)V
-HPLcom/android/server/am/ProcessServiceRecord;->addBoundClientUid(ILjava/lang/String;J)V
+HSPLcom/android/server/am/ProcessServiceRecord;->addBoundClientUid(ILjava/lang/String;J)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ProcessServiceRecord;->addBoundClientUidsOfNewService(Lcom/android/server/am/ServiceRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ProcessServiceRecord;->addConnection(Lcom/android/server/am/ConnectionRecord;)V+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/ProcessServiceRecord;->addSdkSandboxConnectionIfNecessary(Lcom/android/server/am/ConnectionRecord;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;
@@ -2226,7 +1820,7 @@
 HPLcom/android/server/am/ProcessServiceRecord;->getConnectionAt(I)Lcom/android/server/am/ConnectionRecord;+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/ProcessServiceRecord;->getExecutingServiceAt(I)Lcom/android/server/am/ServiceRecord;
 HSPLcom/android/server/am/ProcessServiceRecord;->getForegroundServiceTypes()I
-HPLcom/android/server/am/ProcessServiceRecord;->getNumForegroundServices()I+]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/am/ProcessServiceRecord;->getNumForegroundServices()I+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/ProcessServiceRecord;->getRunningServiceAt(I)Lcom/android/server/am/ServiceRecord;+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/ProcessServiceRecord;->hasClientActivities()Z
 HSPLcom/android/server/am/ProcessServiceRecord;->hasForegroundServices()Z
@@ -2242,13 +1836,12 @@
 HPLcom/android/server/am/ProcessServiceRecord;->removeConnection(Lcom/android/server/am/ConnectionRecord;)V
 HPLcom/android/server/am/ProcessServiceRecord;->removeSdkSandboxConnectionIfNecessary(Lcom/android/server/am/ConnectionRecord;)V
 HSPLcom/android/server/am/ProcessServiceRecord;->setExecServicesFg(Z)V
-HSPLcom/android/server/am/ProcessServiceRecord;->setHasClientActivities(Z)V
 HSPLcom/android/server/am/ProcessServiceRecord;->setHasReportedForegroundServices(Z)V
 HSPLcom/android/server/am/ProcessServiceRecord;->shouldExecServicesFg()Z
 HSPLcom/android/server/am/ProcessServiceRecord;->startExecutingService(Lcom/android/server/am/ServiceRecord;)V
 HSPLcom/android/server/am/ProcessServiceRecord;->startService(Lcom/android/server/am/ServiceRecord;)Z+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ProcessServiceRecord;->stopExecutingService(Lcom/android/server/am/ServiceRecord;)V
-HPLcom/android/server/am/ProcessServiceRecord;->stopService(Lcom/android/server/am/ServiceRecord;)Z+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/am/ProcessServiceRecord;->stopService(Lcom/android/server/am/ServiceRecord;)Z+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/ProcessServiceRecord;->updateBoundClientUids()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/am/ProcessServiceRecord;->updateHasTopStartedAlmostPerceptibleServices()V+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/am/ProcessServiceRecord;->updateHostingComonentTypeForBindingsLocked()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
@@ -2273,7 +1866,6 @@
 HSPLcom/android/server/am/ProcessStateRecord;->getCurRawAdj()I
 HSPLcom/android/server/am/ProcessStateRecord;->getCurRawProcState()I
 HSPLcom/android/server/am/ProcessStateRecord;->getCurrentSchedulingGroup()I
-HSPLcom/android/server/am/ProcessStateRecord;->getFgInteractionTime()J
 HSPLcom/android/server/am/ProcessStateRecord;->getInteractionEventTime()J
 HSPLcom/android/server/am/ProcessStateRecord;->getLastStateTime()J
 HSPLcom/android/server/am/ProcessStateRecord;->getMaxAdj()I
@@ -2317,16 +1909,13 @@
 HSPLcom/android/server/am/ProcessStateRecord;->setCurrentSchedulingGroup(I)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ProcessStateRecord;->setFgInteractionTime(J)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ProcessStateRecord;->setForcingToImportant(Ljava/lang/Object;)V
-HSPLcom/android/server/am/ProcessStateRecord;->setHasForegroundActivities(Z)V
 HSPLcom/android/server/am/ProcessStateRecord;->setHasShownUi(Z)V
 HSPLcom/android/server/am/ProcessStateRecord;->setHasStartedServices(Z)V+]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
 HSPLcom/android/server/am/ProcessStateRecord;->setInteractionEventTime(J)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
-HSPLcom/android/server/am/ProcessStateRecord;->setNoKillOnBgRestrictedAndIdle(Z)V
 HSPLcom/android/server/am/ProcessStateRecord;->setProcStateChanged(Z)V
-HSPLcom/android/server/am/ProcessStateRecord;->setReachable(Z)V
 HSPLcom/android/server/am/ProcessStateRecord;->setReportedInteraction(Z)V
 HSPLcom/android/server/am/ProcessStateRecord;->setReportedProcState(I)V
-HPLcom/android/server/am/ProcessStateRecord;->setRunningRemoteAnimation(Z)V
+HSPLcom/android/server/am/ProcessStateRecord;->setRunningRemoteAnimation(Z)V
 HSPLcom/android/server/am/ProcessStateRecord;->setSetCached(Z)V
 HSPLcom/android/server/am/ProcessStateRecord;->setSetCapability(I)V
 HSPLcom/android/server/am/ProcessStateRecord;->setSetNoKillOnBgRestrictedAndIdle(Z)V
@@ -2336,28 +1925,19 @@
 HSPLcom/android/server/am/ProcessStateRecord;->shouldNotKillOnBgRestrictedAndIdle()Z
 HPLcom/android/server/am/ProcessStateRecord;->shouldScheduleLikeTopApp()Z
 HSPLcom/android/server/am/ProcessStateRecord;->updateLastInvisibleTime(Z)V
-HSPLcom/android/server/am/ProcessStatsService$1;-><init>(Lcom/android/server/am/ProcessStatsService;)V
-HSPLcom/android/server/am/ProcessStatsService$LocalService;-><init>(Lcom/android/server/am/ProcessStatsService;)V
-HSPLcom/android/server/am/ProcessStatsService$LocalService;-><init>(Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService$LocalService-IA;)V
-HSPLcom/android/server/am/ProcessStatsService;-><clinit>()V
-HSPLcom/android/server/am/ProcessStatsService;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/io/File;)V
 HSPLcom/android/server/am/ProcessStatsService;->getMemFactorLocked()I
-HSPLcom/android/server/am/ProcessStatsService;->getProcessStateLocked(Ljava/lang/String;IJLjava/lang/String;)Lcom/android/internal/app/procstats/ProcessState;
 HSPLcom/android/server/am/ProcessStatsService;->getServiceState(Ljava/lang/String;IJLjava/lang/String;Ljava/lang/String;)Lcom/android/internal/app/procstats/ServiceState;
-HSPLcom/android/server/am/ProcessStatsService;->publish()V
 HSPLcom/android/server/am/ProcessStatsService;->setMemFactorLocked(IZJ)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;
 HSPLcom/android/server/am/ProcessStatsService;->shouldWriteNowLocked(J)Z
-HSPLcom/android/server/am/ProcessStatsService;->updateFileLocked()V
 HSPLcom/android/server/am/ProcessStatsService;->updateProcessStateHolderLocked(Lcom/android/internal/app/procstats/ProcessStats$ProcessStateHolder;Ljava/lang/String;IJLjava/lang/String;)V
 HSPLcom/android/server/am/ProcessStatsService;->updateTrackingAssociationsLocked(IJ)V
-HSPLcom/android/server/am/ProviderMap;-><init>(Lcom/android/server/am/ActivityManagerService;)V
-HPLcom/android/server/am/ProviderMap;->collectPackageProvidersLocked(Ljava/lang/String;Ljava/util/Set;ZZLjava/util/HashMap;Ljava/util/ArrayList;)Z+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Collection;Ljava/util/HashMap$Values;]Ljava/util/Iterator;Ljava/util/HashMap$ValueIterator;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Set;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
+HPLcom/android/server/am/ProviderMap;->collectPackageProvidersLocked(Ljava/lang/String;Ljava/util/Set;ZZLjava/util/HashMap;Ljava/util/ArrayList;)Z+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Collection;Ljava/util/HashMap$Values;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/util/Iterator;Ljava/util/HashMap$ValueIterator;]Ljava/util/Set;Landroid/util/ArraySet;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HSPLcom/android/server/am/ProviderMap;->getProviderByClass(Landroid/content/ComponentName;I)Lcom/android/server/am/ContentProviderRecord;+]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;
 HSPLcom/android/server/am/ProviderMap;->getProviderByName(Ljava/lang/String;I)Lcom/android/server/am/ContentProviderRecord;+]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;
 HSPLcom/android/server/am/ProviderMap;->getProvidersByClass(I)Ljava/util/HashMap;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/am/ProviderMap;->getProvidersByName(I)Ljava/util/HashMap;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/am/ProviderMap;->putProviderByClass(Landroid/content/ComponentName;Lcom/android/server/am/ContentProviderRecord;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;
-HSPLcom/android/server/am/ProviderMap;->putProviderByName(Ljava/lang/String;Lcom/android/server/am/ContentProviderRecord;)V
+HSPLcom/android/server/am/ProviderMap;->putProviderByName(Ljava/lang/String;Lcom/android/server/am/ContentProviderRecord;)V+]Ljava/util/HashMap;Ljava/util/HashMap;
 HPLcom/android/server/am/ProviderMap;->removeProviderByName(Ljava/lang/String;I)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;
 HSPLcom/android/server/am/ReceiverList;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;IIILandroid/content/IIntentReceiver;)V
 HSPLcom/android/server/am/ReceiverList;->containsFilter(Landroid/content/IntentFilter;)Z+]Ljava/util/ArrayList;Lcom/android/server/am/ReceiverList;
@@ -2372,56 +1952,50 @@
 HSPLcom/android/server/am/ServiceRecord$StartItem;-><init>(Lcom/android/server/am/ServiceRecord;ZILandroid/content/Intent;Lcom/android/server/uri/NeededUriGrants;ILjava/lang/String;Ljava/lang/String;I)V
 HSPLcom/android/server/am/ServiceRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/content/ComponentName;Landroid/content/ComponentName;Ljava/lang/String;ILandroid/content/Intent$FilterComparison;Landroid/content/pm/ServiceInfo;ZLjava/lang/Runnable;Ljava/lang/String;ILjava/lang/String;Z)V+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HSPLcom/android/server/am/ServiceRecord;->addConnection(Landroid/os/IBinder;Lcom/android/server/am/ConnectionRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;
-HPLcom/android/server/am/ServiceRecord;->clearDeliveredStartsLocked()V+]Lcom/android/server/am/ServiceRecord$StartItem;Lcom/android/server/am/ServiceRecord$StartItem;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/am/ServiceRecord;->clearFgsAllowStart()V
-HPLcom/android/server/am/ServiceRecord;->clearFgsAllowWiu()V
-HPLcom/android/server/am/ServiceRecord;->clearShortFgsInfo()V
+HSPLcom/android/server/am/ServiceRecord;->clearDeliveredStartsLocked()V+]Lcom/android/server/am/ServiceRecord$StartItem;Lcom/android/server/am/ServiceRecord$StartItem;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/am/ServiceRecord;->clearFgsAllowStart()V
+HSPLcom/android/server/am/ServiceRecord;->clearFgsAllowWiu()V
+HSPLcom/android/server/am/ServiceRecord;->clearShortFgsInfo()V
 HSPLcom/android/server/am/ServiceRecord;->findDeliveredStart(IZZ)Lcom/android/server/am/ServiceRecord$StartItem;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/am/ServiceRecord;->getBackgroundStartPrivilegesWithExclusiveToken()Landroid/app/BackgroundStartPrivileges;
+HSPLcom/android/server/am/ServiceRecord;->getBackgroundStartPrivilegesWithExclusiveToken()Landroid/app/BackgroundStartPrivileges;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ServiceRecord;->getComponentName()Landroid/content/ComponentName;
 HSPLcom/android/server/am/ServiceRecord;->getConnections()Landroid/util/ArrayMap;
 HPLcom/android/server/am/ServiceRecord;->getFgsAllowWiu_forCapabilities()I+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;
-HPLcom/android/server/am/ServiceRecord;->getFgsAllowWiu_forStart()I+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;
-HPLcom/android/server/am/ServiceRecord;->getFgsAllowWiu_legacy()I
+HSPLcom/android/server/am/ServiceRecord;->getFgsAllowWiu_forStart()I+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;
+HSPLcom/android/server/am/ServiceRecord;->getFgsAllowWiu_legacy()I
 HSPLcom/android/server/am/ServiceRecord;->getLastStartId()I
 HSPLcom/android/server/am/ServiceRecord;->getTracker()Lcom/android/internal/app/procstats/ServiceState;+]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;
 HSPLcom/android/server/am/ServiceRecord;->hasAutoCreateConnections()Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/am/ServiceRecord;->isFgsAllowedWiu_forCapabilities()Z+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;
-HPLcom/android/server/am/ServiceRecord;->isFgsAllowedWiu_forStart()Z+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;
-HPLcom/android/server/am/ServiceRecord;->isFgsTimeLimited()Z+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;
-HPLcom/android/server/am/ServiceRecord;->isShortFgs()Z
+HSPLcom/android/server/am/ServiceRecord;->isFgsAllowedWiu_forStart()Z+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;
+HSPLcom/android/server/am/ServiceRecord;->isFgsTimeLimited()Z+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;
+HSPLcom/android/server/am/ServiceRecord;->isShortFgs()Z
 HSPLcom/android/server/am/ServiceRecord;->makeNextStartId()I
 HSPLcom/android/server/am/ServiceRecord;->postNotification(Z)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
-HPLcom/android/server/am/ServiceRecord;->reasonOr(II)I
 HPLcom/android/server/am/ServiceRecord;->removeConnection(Landroid/os/IBinder;)V
-HPLcom/android/server/am/ServiceRecord;->resetRestartCounter()V
+HSPLcom/android/server/am/ServiceRecord;->resetRestartCounter()V
 HSPLcom/android/server/am/ServiceRecord;->retrieveAppBindingLocked(Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;)Lcom/android/server/am/AppBindRecord;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HPLcom/android/server/am/ServiceRecord;->setIsFgsTimeLimited(Z)V
+HSPLcom/android/server/am/ServiceRecord;->setIsFgsTimeLimited(Z)V
 HSPLcom/android/server/am/ServiceRecord;->setProcess(Lcom/android/server/am/ProcessRecord;Landroid/app/IApplicationThread;ILcom/android/server/am/UidRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/ServiceRecord;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/am/ServiceRecord;->updateAllowUiJobScheduling(Z)V
 HSPLcom/android/server/am/ServiceRecord;->updateFgsHasNotificationPermission()V
-HSPLcom/android/server/am/ServiceRecord;->updateKeepWarmLocked()V+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/am/ServiceRecord;->updateKeepWarmLocked()V+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/ServiceRecord;->updateProcessStateOnRequest()V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;
 HPLcom/android/server/am/ServiceRecord;->useNewWiuLogic_forCapabilities()Z
-HPLcom/android/server/am/ServiceRecord;->useNewWiuLogic_forStart()Z
-HSPLcom/android/server/am/TraceErrorLogger;-><init>()V
-HSPLcom/android/server/am/UidObserverController$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/am/UidObserverController;)V
+HSPLcom/android/server/am/ServiceRecord;->useNewWiuLogic_forStart()Z
 HSPLcom/android/server/am/UidObserverController$$ExternalSyntheticLambda0;->run()V+]Lcom/android/server/am/UidObserverController;Lcom/android/server/am/UidObserverController;
 HSPLcom/android/server/am/UidObserverController$ChangeRecord;->copyTo(Lcom/android/server/am/UidObserverController$ChangeRecord;)V
 HSPLcom/android/server/am/UidObserverController$UidObserverRegistration;->-$$Nest$fgetmWhich(Lcom/android/server/am/UidObserverController$UidObserverRegistration;)I
 HSPLcom/android/server/am/UidObserverController$UidObserverRegistration;->isWatchingUid(I)Z
-HSPLcom/android/server/am/UidObserverController;-><init>(Landroid/os/Handler;)V
 HSPLcom/android/server/am/UidObserverController;->dispatchUidsChanged()V+]Lcom/android/server/am/UidObserverController;Lcom/android/server/am/UidObserverController;]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/UidObserverController$ChangeRecord;Lcom/android/server/am/UidObserverController$ChangeRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
 HSPLcom/android/server/am/UidObserverController;->dispatchUidsChangedForObserver(Landroid/app/IUidObserver;Lcom/android/server/am/UidObserverController$UidObserverRegistration;I)V+]Landroid/app/IUidObserver;megamorphic_types]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/am/UidObserverController$UidObserverRegistration;Lcom/android/server/am/UidObserverController$UidObserverRegistration;
 HSPLcom/android/server/am/UidObserverController;->enqueueUidChange(Lcom/android/server/am/UidObserverController$ChangeRecord;IIIIJIZ)I+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$UiHandler;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/am/UidProcessMap;-><init>()V
+HSPLcom/android/server/am/UidObserverController;->getOrCreateChangeRecordLocked()Lcom/android/server/am/UidObserverController$ChangeRecord;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/am/UidProcessMap;->get(ILjava/lang/String;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/am/UidRecord;-><init>(ILcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/UidRecord;->addProcess(Lcom/android/server/am/ProcessRecord;)V
 HPLcom/android/server/am/UidRecord;->areAllProcessesFrozen(Lcom/android/server/am/ProcessRecord;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;
-HSPLcom/android/server/am/UidRecord;->clearProcAdjChanged()V
-HSPLcom/android/server/am/UidRecord;->forEachProcess(Ljava/util/function/Consumer;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/function/Consumer;Lcom/android/server/am/OomAdjuster$$ExternalSyntheticLambda2;,Lcom/android/server/am/ProcessList$$ExternalSyntheticLambda3;,Lcom/android/server/am/ActiveUids$$ExternalSyntheticLambda0;
+HSPLcom/android/server/am/UidRecord;->forEachProcess(Ljava/util/function/Consumer;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/function/Consumer;Lcom/android/server/am/OomAdjuster$$ExternalSyntheticLambda2;,Lcom/android/server/am/ProcessList$$ExternalSyntheticLambda3;,Lcom/android/server/am/ActiveUids$$ExternalSyntheticLambda0;,Lcom/android/server/am/ActivityManagerService$GetBackgroundStartPrivilegesFunctor;
 HSPLcom/android/server/am/UidRecord;->getCurCapability()I
 HSPLcom/android/server/am/UidRecord;->getCurProcState()I
 HSPLcom/android/server/am/UidRecord;->getLastBackgroundTime()J
@@ -2449,19 +2023,10 @@
 HSPLcom/android/server/am/UidRecord;->setSetProcState(I)V
 HPLcom/android/server/am/UidRecord;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/am/UidRecord;->updateHasInternetPermission()V
-HSPLcom/android/server/am/UserController$1;-><init>(Lcom/android/server/am/UserController;)V
-HSPLcom/android/server/am/UserController$Injector;-><init>(Lcom/android/server/am/ActivityManagerService;)V
 HSPLcom/android/server/am/UserController$Injector;->checkCallingPermission(Ljava/lang/String;)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/am/UserController$Injector;->getContext()Landroid/content/Context;
-HSPLcom/android/server/am/UserController$Injector;->getHandler(Landroid/os/Handler$Callback;)Landroid/os/Handler;
-HSPLcom/android/server/am/UserController$Injector;->getLockPatternUtils()Lcom/android/internal/widget/LockPatternUtils;
-HSPLcom/android/server/am/UserController$Injector;->getUiHandler(Landroid/os/Handler$Callback;)Landroid/os/Handler;
 HSPLcom/android/server/am/UserController$Injector;->getUserManager()Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/am/UserController$Injector;->isCallerRecents(I)Z
-HSPLcom/android/server/am/UserController$UserProgressListener;-><init>()V
-HSPLcom/android/server/am/UserController$UserProgressListener;-><init>(Lcom/android/server/am/UserController$UserProgressListener-IA;)V
-HSPLcom/android/server/am/UserController;-><init>(Lcom/android/server/am/ActivityManagerService;)V
-HSPLcom/android/server/am/UserController;-><init>(Lcom/android/server/am/UserController$Injector;)V
 HSPLcom/android/server/am/UserController;->checkGetCurrentUserPermissions()V+]Lcom/android/server/am/UserController$Injector;Lcom/android/server/am/UserController$Injector;
 HSPLcom/android/server/am/UserController;->exists(I)Z+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/am/UserController$Injector;Lcom/android/server/am/UserController$Injector;
 HSPLcom/android/server/am/UserController;->getCurrentUserId()I
@@ -2475,16 +2040,14 @@
 HSPLcom/android/server/am/UserController;->isUserOrItsParentRunning(I)Z+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HSPLcom/android/server/am/UserController;->isUserRunning(II)Z+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;
 HSPLcom/android/server/am/UserController;->unsafeConvertIncomingUser(I)I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;
-HSPLcom/android/server/am/UserController;->updateStartedUserArrayLU()V
-HSPLcom/android/server/am/UserState;-><init>(Landroid/os/UserHandle;)V
 HSPLcom/android/server/app/GameManagerService$LocalService;->getCompatScale(Ljava/lang/String;I)Landroid/content/res/CompatibilityInfo$CompatScale;
 HSPLcom/android/server/app/GameManagerService$LocalService;->getResolutionScalingFactor(Ljava/lang/String;I)F
 HSPLcom/android/server/app/GameManagerService$MyUidObserver;->handleUidMovedOffTop(I)V+]Ljava/util/Set;Ljava/util/HashSet;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;
 HSPLcom/android/server/app/GameManagerService$MyUidObserver;->onUidStateChanged(IIJI)V+]Lcom/android/server/app/GameManagerService$MyUidObserver;Lcom/android/server/app/GameManagerService$MyUidObserver;
 HSPLcom/android/server/app/GameManagerService;->-$$Nest$fgetmGameForegroundUids(Lcom/android/server/app/GameManagerService;)Ljava/util/Set;
 HSPLcom/android/server/app/GameManagerService;->-$$Nest$fgetmUidObserverLock(Lcom/android/server/app/GameManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/app/GameManagerService;->getConfig(Ljava/lang/String;I)Lcom/android/server/app/GameManagerService$GamePackageConfiguration;
-HSPLcom/android/server/app/GameManagerService;->getGameModeFromSettingsUnchecked(Ljava/lang/String;I)I
+HSPLcom/android/server/app/GameManagerService;->getConfig(Ljava/lang/String;I)Lcom/android/server/app/GameManagerService$GamePackageConfiguration;+]Lcom/android/server/app/GameManagerSettings;Lcom/android/server/app/GameManagerSettings;
+HSPLcom/android/server/app/GameManagerService;->getGameModeFromSettingsUnchecked(Ljava/lang/String;I)I+]Lcom/android/server/app/GameManagerSettings;Lcom/android/server/app/GameManagerSettings;
 HSPLcom/android/server/app/GameManagerSettings;->getConfigOverride(Ljava/lang/String;)Lcom/android/server/app/GameManagerService$GamePackageConfiguration;
 HSPLcom/android/server/app/GameManagerSettings;->getGameModeLocked(Ljava/lang/String;)I
 HPLcom/android/server/apphibernation/AppHibernationService$$ExternalSyntheticLambda0;->onUsageEvent(ILandroid/app/usage/UsageEvents$Event;)V
@@ -2495,46 +2058,27 @@
 HSPLcom/android/server/apphibernation/AppHibernationService;->handleIncomingUser(ILjava/lang/String;)I+]Landroid/app/IActivityManager;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/apphibernation/AppHibernationService;->isAppHibernationEnabled()Z
 HSPLcom/android/server/apphibernation/AppHibernationService;->isHibernatingForUser(Ljava/lang/String;I)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/SystemService;Lcom/android/server/apphibernation/AppHibernationService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/apphibernation/AppHibernationService;Lcom/android/server/apphibernation/AppHibernationService;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/Map;Landroid/util/ArrayMap;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/apphibernation/AppHibernationService;->isHibernatingGlobally(Ljava/lang/String;)Z
+HSPLcom/android/server/apphibernation/AppHibernationService;->isHibernatingGlobally(Ljava/lang/String;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/Map;Landroid/util/ArrayMap;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HPLcom/android/server/apphibernation/AppHibernationService;->lambda$new$6(ILandroid/app/usage/UsageEvents$Event;)V+]Lcom/android/server/apphibernation/AppHibernationService;Lcom/android/server/apphibernation/AppHibernationService;
-HPLcom/android/server/apphibernation/AppHibernationService;->setHibernatingForUser(Ljava/lang/String;IZ)V+]Lcom/android/server/SystemService;Lcom/android/server/apphibernation/AppHibernationService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/apphibernation/AppHibernationService;Lcom/android/server/apphibernation/AppHibernationService;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/Map;Landroid/util/ArrayMap;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HPLcom/android/server/apphibernation/AppHibernationService;->setHibernatingGlobally(Ljava/lang/String;Z)V+]Lcom/android/server/SystemService;Lcom/android/server/apphibernation/AppHibernationService;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/Map;Landroid/util/ArrayMap;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/appop/AppOpMigrationHelperImpl;-><init>()V
-HSPLcom/android/server/appop/AppOpsCheckingServiceImpl$1;-><init>(Lcom/android/server/appop/AppOpsCheckingServiceImpl;)V
-HSPLcom/android/server/appop/AppOpsCheckingServiceImpl;-><init>(Ljava/io/File;Ljava/lang/Object;Landroid/os/Handler;Landroid/content/Context;Landroid/util/SparseArray;)V
-HSPLcom/android/server/appop/AppOpsCheckingServiceImpl;->addAppOpsModeChangedListener(Lcom/android/server/appop/AppOpsCheckingServiceInterface$AppOpsModeChangedListener;)Z
-HSPLcom/android/server/appop/AppOpsCheckingServiceImpl;->clearAllModes()V
+HPLcom/android/server/apphibernation/AppHibernationService;->setHibernatingForUser(Ljava/lang/String;IZ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/Map;Landroid/util/ArrayMap;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService;]Lcom/android/server/apphibernation/HibernationStateDiskStore;Lcom/android/server/apphibernation/HibernationStateDiskStore;]Lcom/android/server/SystemService;Lcom/android/server/apphibernation/AppHibernationService;]Lcom/android/server/apphibernation/AppHibernationService;Lcom/android/server/apphibernation/AppHibernationService;
+HPLcom/android/server/apphibernation/AppHibernationService;->setHibernatingGlobally(Ljava/lang/String;Z)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/Map;Landroid/util/ArrayMap;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService;]Lcom/android/server/apphibernation/HibernationStateDiskStore;Lcom/android/server/apphibernation/HibernationStateDiskStore;]Lcom/android/server/SystemService;Lcom/android/server/apphibernation/AppHibernationService;
 HSPLcom/android/server/appop/AppOpsCheckingServiceImpl;->getForegroundOps(ILjava/lang/String;)Landroid/util/SparseBooleanArray;+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/appop/AppOpsCheckingServiceImpl;->getForegroundOps(Ljava/lang/String;I)Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/appop/AppOpsCheckingServiceImpl;->getPackageMode(Ljava/lang/String;II)I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/appop/AppOpsCheckingServiceImpl;->getUidMode(ILjava/lang/String;I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/appop/AppOpsCheckingServiceImpl;->readState()V
-HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;-><init>(Lcom/android/server/appop/AppOpsCheckingServiceInterface;)V
-HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->addAppOpsModeChangedListener(Lcom/android/server/appop/AppOpsCheckingServiceInterface$AppOpsModeChangedListener;)Z
-HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->clearAllModes()V
-HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getForegroundOps(ILjava/lang/String;)Landroid/util/SparseBooleanArray;
-HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getForegroundOps(Ljava/lang/String;I)Landroid/util/SparseBooleanArray;
-HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getPackageMode(Ljava/lang/String;II)I+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceImpl;
+HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getForegroundOps(ILjava/lang/String;)Landroid/util/SparseBooleanArray;+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/permission/access/appop/AppOpService;
+HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getForegroundOps(Ljava/lang/String;I)Landroid/util/SparseBooleanArray;+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/permission/access/appop/AppOpService;
+HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getPackageMode(Ljava/lang/String;II)I+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceImpl;,Lcom/android/server/permission/access/appop/AppOpService;
 HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getUidMode(ILjava/lang/String;I)I+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceImpl;,Lcom/android/server/permission/access/appop/AppOpService;
-HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->readState()V
-HSPLcom/android/server/appop/AppOpsRestrictionsImpl;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/appop/AppOpsRestrictions$AppOpsRestrictionRemovedListener;)V
-HPLcom/android/server/appop/AppOpsRestrictionsImpl;->getUserRestriction(Ljava/lang/Object;II)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/appop/AppOpsRestrictionsImpl;->getUserRestriction(Ljava/lang/Object;IILjava/lang/String;Ljava/lang/String;Z)Z+]Lcom/android/server/appop/AppOpsRestrictionsImpl;Lcom/android/server/appop/AppOpsRestrictionsImpl;]Landroid/os/PackageTagsList;Landroid/os/PackageTagsList;
+HSPLcom/android/server/appop/AppOpsRestrictionsImpl;->getUserRestriction(Ljava/lang/Object;II)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/appop/AppOpsRestrictionsImpl;->getUserRestriction(Ljava/lang/Object;IILjava/lang/String;Ljava/lang/String;Z)Z+]Lcom/android/server/appop/AppOpsRestrictionsImpl;Lcom/android/server/appop/AppOpsRestrictionsImpl;]Landroid/os/PackageTagsList;Landroid/os/PackageTagsList;
 HSPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda10;->onUidStateChanged(IIZ)V
 HPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda13;->accept(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;)V+]Ljava/lang/Integer;Ljava/lang/Integer;
+HSPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda14;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
 HPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda15;-><init>(Landroid/app/AsyncNotedAppOp;[ZILjava/lang/String;ILjava/lang/String;)V
 HPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda15;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda4;-><init>(Lcom/android/server/appop/AppOpsService;)V
 HSPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda5;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/lang/Integer;Ljava/lang/Integer;
 HSPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda9;->execute(Ljava/lang/Runnable;)V
-HSPLcom/android/server/appop/AppOpsService$1;-><init>(Lcom/android/server/appop/AppOpsService;)V
-HSPLcom/android/server/appop/AppOpsService$2;-><init>(Lcom/android/server/appop/AppOpsService;)V
-HSPLcom/android/server/appop/AppOpsService$3;-><init>(Lcom/android/server/appop/AppOpsService;)V
-HSPLcom/android/server/appop/AppOpsService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
-HSPLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;-><init>(Lcom/android/server/appop/AppOpsService;)V
-HSPLcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;-><init>(Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl-IA;)V
-HSPLcom/android/server/appop/AppOpsService$AppOpsManagerLocalImpl;-><init>(Lcom/android/server/appop/AppOpsService;)V
-HSPLcom/android/server/appop/AppOpsService$AppOpsManagerLocalImpl;-><init>(Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService$AppOpsManagerLocalImpl-IA;)V
 HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda11;-><init>(Lcom/android/server/appop/AppOpsService;)V
 HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda11;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/lang/Integer;Ljava/lang/Integer;
 HPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda13;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
@@ -2549,16 +2093,14 @@
 HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->$r8$lambda$isKDS9RXD9cfyW6vB1LFop2lwy4(Lcom/android/server/appop/AppOpsService;Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;I)V
 HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->$r8$lambda$p7Z0eGBUU1-Gt7vHG9S-93UhGlY(Lcom/android/server/appop/AppOpsService;IILjava/lang/String;Ljava/lang/String;IZ)I
 HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->$r8$lambda$vZeNm9U4ce-mUj2m0fon_vppmA0(Lcom/android/server/appop/AppOpsService;Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;IZZLjava/lang/String;ZII)Landroid/app/SyncNotedAppOp;
-HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;-><init>(Lcom/android/server/appop/AppOpsService;Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;)V
 HPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->checkAudioOperation(IIILjava/lang/String;)I+]Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;Lcom/android/server/policy/AppOpsPolicy;
 HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->checkOperation(IILjava/lang/String;Ljava/lang/String;IZ)I+]Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;Lcom/android/server/policy/AppOpsPolicy;
 HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;I)V+]Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;Lcom/android/server/policy/AppOpsPolicy;
 HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->noteOperation(IILjava/lang/String;Ljava/lang/String;IZLjava/lang/String;Z)Landroid/app/SyncNotedAppOp;+]Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;Lcom/android/server/policy/AppOpsPolicy;
 HPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->noteProxyOperation(ILandroid/content/AttributionSource;ZLjava/lang/String;ZZ)Landroid/app/SyncNotedAppOp;
 HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;IZZLjava/lang/String;ZII)Landroid/app/SyncNotedAppOp;+]Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;Lcom/android/server/policy/AppOpsPolicy;
-HPLcom/android/server/appop/AppOpsService$ClientUserRestrictionState;->hasRestriction(ILjava/lang/String;Ljava/lang/String;IZ)Z+]Lcom/android/server/appop/AppOpsRestrictions;Lcom/android/server/appop/AppOpsRestrictionsImpl;
-HSPLcom/android/server/appop/AppOpsService$Constants;-><init>(Lcom/android/server/appop/AppOpsService;Landroid/os/Handler;)V
-HSPLcom/android/server/appop/AppOpsService$Constants;->updateConstants()V
+HSPLcom/android/server/appop/AppOpsService$ClientUserRestrictionState;->hasRestriction(ILjava/lang/String;Ljava/lang/String;IZ)Z+]Lcom/android/server/appop/AppOpsRestrictions;Lcom/android/server/appop/AppOpsRestrictionsImpl;
+HSPLcom/android/server/appop/AppOpsService$ModeCallback;-><init>(Lcom/android/server/appop/AppOpsService;Lcom/android/internal/app/IAppOpsCallback;IIIII)V
 HSPLcom/android/server/appop/AppOpsService$Op;->-$$Nest$mgetOrCreateAttribution(Lcom/android/server/appop/AppOpsService$Op;Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/appop/AttributedOp;+]Lcom/android/server/appop/AppOpsService$Op;Lcom/android/server/appop/AppOpsService$Op;
 HSPLcom/android/server/appop/AppOpsService$Op;-><init>(Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;II)V
 HSPLcom/android/server/appop/AppOpsService$Op;->createEntryLocked(Ljava/lang/String;)Landroid/app/AppOpsManager$OpEntry;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;
@@ -2570,29 +2112,25 @@
 HSPLcom/android/server/appop/AppOpsService$UidState;->evalMode(II)I+]Lcom/android/server/appop/AppOpsUidStateTracker;Lcom/android/server/appop/AppOpsUidStateTrackerImpl;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService$UidState;->getState()I+]Lcom/android/server/appop/AppOpsUidStateTracker;Lcom/android/server/appop/AppOpsUidStateTrackerImpl;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->$r8$lambda$6k_N9hZ8kvjX_OAIx8qy1xpZV_s(Lcom/android/server/appop/AppOpsService;Ljava/lang/Runnable;)V+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
-HPLcom/android/server/appop/AppOpsService;->$r8$lambda$dxaQL556GoIaUFdRgq4YkAgUoUw(Landroid/app/AsyncNotedAppOp;[ZILjava/lang/String;ILjava/lang/String;Lcom/android/internal/app/IAppOpsAsyncNotedCallback;)V
-HSPLcom/android/server/appop/AppOpsService;->$r8$lambda$sKlvEb6CGkKf4LV4kVBIOznFZ9c(Lcom/android/server/appop/AppOpsService;IIZ)V
-HSPLcom/android/server/appop/AppOpsService;->-$$Nest$mcheckOperationImpl(Lcom/android/server/appop/AppOpsService;IILjava/lang/String;Ljava/lang/String;IZ)I
+HSPLcom/android/server/appop/AppOpsService;->-$$Nest$mcheckOperationImpl(Lcom/android/server/appop/AppOpsService;IILjava/lang/String;Ljava/lang/String;IZ)I+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->-$$Nest$mfinishOperationImpl(Lcom/android/server/appop/AppOpsService;Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;I)V+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->-$$Nest$mnoteOperationImpl(Lcom/android/server/appop/AppOpsService;IILjava/lang/String;Ljava/lang/String;IZLjava/lang/String;Z)Landroid/app/SyncNotedAppOp;
 HSPLcom/android/server/appop/AppOpsService;->-$$Nest$mstartOperationImpl(Lcom/android/server/appop/AppOpsService;Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;IZZLjava/lang/String;ZII)Landroid/app/SyncNotedAppOp;
-HSPLcom/android/server/appop/AppOpsService;-><clinit>()V
 HSPLcom/android/server/appop/AppOpsService;-><init>(Ljava/io/File;Ljava/io/File;Landroid/os/Handler;Landroid/content/Context;)V
 HPLcom/android/server/appop/AppOpsService;->checkAudioOperation(IIILjava/lang/String;)I+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;
-HPLcom/android/server/appop/AppOpsService;->checkAudioOperationImpl(IIILjava/lang/String;)I
 HSPLcom/android/server/appop/AppOpsService;->checkOperation(IILjava/lang/String;)I+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;
 HPLcom/android/server/appop/AppOpsService;->checkOperationForDevice(IILjava/lang/String;I)I+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;
 HSPLcom/android/server/appop/AppOpsService;->checkOperationImpl(IILjava/lang/String;Ljava/lang/String;IZ)I+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->checkOperationRaw(IILjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;
 HSPLcom/android/server/appop/AppOpsService;->checkOperationUnchecked(IILjava/lang/String;Ljava/lang/String;IZ)I+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;]Lcom/android/server/appop/AppOpsService$UidState;Lcom/android/server/appop/AppOpsService$UidState;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->checkPackage(ILjava/lang/String;)I+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
-HPLcom/android/server/appop/AppOpsService;->collectAsyncNotedOp(ILjava/lang/String;ILjava/lang/String;ILjava/lang/String;Z)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/RemoteCallbackList;Lcom/android/server/appop/AppOpsService$8;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
+HSPLcom/android/server/appop/AppOpsService;->collectAsyncNotedOp(ILjava/lang/String;ILjava/lang/String;ILjava/lang/String;Z)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/RemoteCallbackList;Lcom/android/server/appop/AppOpsService$8;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->collectOps(Lcom/android/server/appop/AppOpsService$Ops;[ILjava/lang/String;)Ljava/util/ArrayList;+]Landroid/util/SparseArray;Lcom/android/server/appop/AppOpsService$Ops;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/appop/AppOpsService;->enforceManageAppOpsModes(III)V
+HSPLcom/android/server/appop/AppOpsService;->enforceManageAppOpsModes(III)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/appop/AppOpsService;->filterAppAccessUnlocked(Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/appop/AppOpsService;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;
 HSPLcom/android/server/appop/AppOpsService;->finishOperationImpl(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;I)V+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
-HSPLcom/android/server/appop/AppOpsService;->finishOperationUnchecked(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;I)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
+HSPLcom/android/server/appop/AppOpsService;->finishOperationUnchecked(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;I)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->getAsyncNotedOpsKey(Ljava/lang/String;I)Landroid/util/Pair;
 HSPLcom/android/server/appop/AppOpsService;->getBypassforPackage(Lcom/android/server/pm/pkg/PackageState;)Landroid/app/AppOpsManager$RestrictionBypass;+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/appop/AppOpsService;->getOpLocked(IILjava/lang/String;Ljava/lang/String;ZLandroid/app/AppOpsManager$RestrictionBypass;Z)Lcom/android/server/appop/AppOpsService$Op;+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
@@ -2600,19 +2138,20 @@
 HSPLcom/android/server/appop/AppOpsService;->getOpsLocked(ILjava/lang/String;Ljava/lang/String;ZLandroid/app/AppOpsManager$RestrictionBypass;Z)Lcom/android/server/appop/AppOpsService$Ops;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->getPackageManagerInternal()Landroid/content/pm/PackageManagerInternal;
 HSPLcom/android/server/appop/AppOpsService;->getPackagesForOpsForDevice([ILjava/lang/String;)Ljava/util/List;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
-HSPLcom/android/server/appop/AppOpsService;->getPackagesForUid(I)[Ljava/lang/String;
+HSPLcom/android/server/appop/AppOpsService;->getPackagesForUid(I)[Ljava/lang/String;+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
 HSPLcom/android/server/appop/AppOpsService;->getPersistentId(I)Ljava/lang/String;
 HSPLcom/android/server/appop/AppOpsService;->getUidStateLocked(IZ)Lcom/android/server/appop/AppOpsService$UidState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/appop/AppOpsService;->getUidStateTracker()Lcom/android/server/appop/AppOpsUidStateTracker;
 HSPLcom/android/server/appop/AppOpsService;->isAttributionInPackage(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;)Z+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/internal/pm/pkg/component/ParsedAttribution;Lcom/android/internal/pm/pkg/component/ParsedAttributionImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
-HSPLcom/android/server/appop/AppOpsService;->isAutomotive()Z
+HPLcom/android/server/appop/AppOpsService;->isAttributionTagDefined(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/server/appop/AppOpsService;->isIncomingPackageValid(Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->isOpRestrictedDueToSuspend(ILjava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/appop/AppOpsService;->isOpRestrictedLocked(IILjava/lang/String;Ljava/lang/String;ILandroid/app/AppOpsManager$RestrictionBypass;Z)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AppOpsService$ClientUserRestrictionState;Lcom/android/server/appop/AppOpsService$ClientUserRestrictionState;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
-HPLcom/android/server/appop/AppOpsService;->isOperationActive(IILjava/lang/String;)Z
+HSPLcom/android/server/appop/AppOpsService;->isOpRestrictedLocked(IILjava/lang/String;Ljava/lang/String;ILandroid/app/AppOpsManager$RestrictionBypass;Z)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AppOpsService$ClientUserRestrictionState;Lcom/android/server/appop/AppOpsService$ClientUserRestrictionState;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/appop/AppOpsService$ClientGlobalRestrictionState;Lcom/android/server/appop/AppOpsService$ClientGlobalRestrictionState;
+HPLcom/android/server/appop/AppOpsService;->isOperationActive(IILjava/lang/String;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/appop/AppOpsService;->isPackageExisted(Ljava/lang/String;)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->isSpecialPackage(ILjava/lang/String;)Z
 HSPLcom/android/server/appop/AppOpsService;->isValidVirtualDeviceId(I)Z
+HPLcom/android/server/appop/AppOpsService;->lambda$collectAsyncNotedOp$3(Landroid/app/AsyncNotedAppOp;[ZILjava/lang/String;ILjava/lang/String;Lcom/android/internal/app/IAppOpsAsyncNotedCallback;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/internal/app/IAppOpsAsyncNotedCallback;Lcom/android/internal/app/IAppOpsAsyncNotedCallback$Stub$Proxy;
 HSPLcom/android/server/appop/AppOpsService;->lambda$getUidStateTracker$0(Ljava/lang/Runnable;)V+]Ljava/lang/Runnable;Lcom/android/internal/util/function/pooled/PooledLambdaImpl;
 HSPLcom/android/server/appop/AppOpsService;->noteOperation(IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Z)Landroid/app/SyncNotedAppOp;+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;
 HSPLcom/android/server/appop/AppOpsService;->noteOperationImpl(IILjava/lang/String;Ljava/lang/String;IZLjava/lang/String;Z)Landroid/app/SyncNotedAppOp;+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
@@ -2622,30 +2161,25 @@
 HSPLcom/android/server/appop/AppOpsService;->notifyOpChangedForAllPkgsInUid(IIZLjava/lang/String;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/appop/OnOpModeChangedListener;Lcom/android/server/appop/AppOpsService$ModeCallback;]Lcom/android/internal/app/IAppOpsCallback;Lcom/android/server/policy/PermissionPolicyService$2;
 HPLcom/android/server/appop/AppOpsService;->notifyOpChecked(Landroid/util/ArraySet;IILjava/lang/String;Ljava/lang/String;III)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/internal/app/IAppOpsNotedCallback;Landroid/app/AppOpsManager$5;,Lcom/android/internal/app/IAppOpsNotedCallback$Stub$Proxy;
 HSPLcom/android/server/appop/AppOpsService;->onUidStateChanged(IIZ)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Landroid/util/SparseArray;Lcom/android/server/appop/AppOpsService$Ops;]Lcom/android/server/appop/OnOpModeChangedListener;Lcom/android/server/appop/AppOpsService$ModeCallback;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
-HSPLcom/android/server/appop/AppOpsService;->publish()V
-HSPLcom/android/server/appop/AppOpsService;->readAttributionOp(Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;)V
-HSPLcom/android/server/appop/AppOpsService;->readOp(Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;)V
-HSPLcom/android/server/appop/AppOpsService;->readPackage(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/appop/AppOpsService;->readRecentAccesses()V
+HSPLcom/android/server/appop/AppOpsService;->readAttributionOp(Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;)V+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;
+HSPLcom/android/server/appop/AppOpsService;->readOp(Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;)V+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;
 HSPLcom/android/server/appop/AppOpsService;->readRecentAccesses(Landroid/util/AtomicFile;)V
 HSPLcom/android/server/appop/AppOpsService;->readUid(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;)V
-HPLcom/android/server/appop/AppOpsService;->reportRuntimeAppOpAccessMessageAsyncLocked(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
+HSPLcom/android/server/appop/AppOpsService;->reportRuntimeAppOpAccessMessageAsyncLocked(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->resolveUid(Ljava/lang/String;)I+]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/appop/AppOpsService;->scheduleOpActiveChangedIfNeededLocked(IILjava/lang/String;Ljava/lang/String;IZII)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/appop/AppOpsService;->scheduleOpNotedIfNeededLocked(IILjava/lang/String;Ljava/lang/String;III)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/appop/AppOpsService;->scheduleOpStartedIfNeededLocked(IILjava/lang/String;Ljava/lang/String;IIIIII)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/appop/AppOpsService;->scheduleOpStartedIfNeededLocked(IILjava/lang/String;Ljava/lang/String;IIIIII)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/appop/AppOpsService;->scheduleWriteLocked()V
-HSPLcom/android/server/appop/AppOpsService;->setCameraAudioRestriction(I)V
-HSPLcom/android/server/appop/AppOpsService;->setUidMode(IIILcom/android/internal/app/IAppOpsCallback;)V
+HSPLcom/android/server/appop/AppOpsService;->setUidMode(IIILcom/android/internal/app/IAppOpsCallback;)V+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/appop/AppOpsService;->shouldIgnoreCallback(III)Z
 HSPLcom/android/server/appop/AppOpsService;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;ZZLjava/lang/String;ZII)Landroid/app/SyncNotedAppOp;+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;
 HSPLcom/android/server/appop/AppOpsService;->startOperationImpl(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;IZZLjava/lang/String;ZII)Landroid/app/SyncNotedAppOp;+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->startOperationUnchecked(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;IZZLjava/lang/String;ZII)Landroid/app/SyncNotedAppOp;+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Lcom/android/server/appop/AppOpsService$UidState;Lcom/android/server/appop/AppOpsService$UidState;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->startWatchingModeWithFlags(ILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V
 HPLcom/android/server/appop/AppOpsService;->stopWatchingMode(Lcom/android/internal/app/IAppOpsCallback;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/appop/AppOpsService$ModeCallback;Lcom/android/server/appop/AppOpsService$ModeCallback;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/internal/app/IAppOpsCallback;Landroid/app/AppOpsManager$2;,Lcom/android/internal/app/IAppOpsCallback$Stub$Proxy;
-HSPLcom/android/server/appop/AppOpsService;->switchPackageIfBootTimeOrRarelyUsedLocked(Ljava/lang/String;)V+]Ljava/util/concurrent/ThreadLocalRandom;Ljava/util/concurrent/ThreadLocalRandom;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
-HSPLcom/android/server/appop/AppOpsService;->systemReady()V
-HPLcom/android/server/appop/AppOpsService;->updatePermissionRevokedCompat(III)V
+HSPLcom/android/server/appop/AppOpsService;->switchPackageIfBootTimeOrRarelyUsedLocked(Ljava/lang/String;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/concurrent/ThreadLocalRandom;Ljava/util/concurrent/ThreadLocalRandom;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
+HPLcom/android/server/appop/AppOpsService;->updatePermissionRevokedCompat(III)V+]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/appop/AppOpsService;->updateUidProcState(III)V+]Lcom/android/server/appop/AppOpsUidStateTracker;Lcom/android/server/appop/AppOpsUidStateTrackerImpl;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->verifyAndGetBypass(ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/appop/AppOpsService$PackageVerificationResult;+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsService;->verifyAndGetBypass(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/appop/AppOpsService$PackageVerificationResult;+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
@@ -2654,7 +2188,6 @@
 HSPLcom/android/server/appop/AppOpsService;->verifyIncomingUid(I)V+]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/appop/AppOpsService;->writeRecentAccesses()V+]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry;]Landroid/app/AppOpsManager$PackageOps;Landroid/app/AppOpsManager$PackageOps;]Landroid/app/AppOpsManager$OpEventProxyInfo;Landroid/app/AppOpsManager$OpEventProxyInfo;]Ljava/util/Map;Landroid/util/ArrayMap;]Landroid/app/AppOpsManager$OpEntry;Landroid/app/AppOpsManager$OpEntry;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/lang/Long;Ljava/lang/Long;]Landroid/app/AppOpsManager$AttributedOpEntry;Landroid/app/AppOpsManager$AttributedOpEntry;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AppOpsUidStateTracker;->processStateToUidState(I)I
-HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$$ExternalSyntheticLambda0;-><init>()V
 HPLcom/android/server/appop/AppOpsUidStateTrackerImpl$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/lang/Integer;Ljava/lang/Integer;
 HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$$ExternalSyntheticLambda1;-><init>()V
 HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Lcom/android/server/appop/AppOpsUidStateTracker$UidStateChangedCallback;Lcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda10;
@@ -2668,10 +2201,10 @@
 HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$1;->lambda$execute$0(Ljava/util/concurrent/Executor;Ljava/lang/Runnable;)V
 HPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog$$ExternalSyntheticLambda0;-><init>()V
 HPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Long;Ljava/lang/Long;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;
-HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;
 HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog$$ExternalSyntheticLambda2;-><init>()V
 HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Long;Ljava/lang/Long;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;
-HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;->logCommitUidState(IIIZZ)V
+HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;->logCommitUidState(IIIZZ)V+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$DelayableExecutor;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$1;
 HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;->logCommitUidStateAsync(JIIIZZ)V
 HPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;->logEvalForegroundMode(IIIII)V+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$DelayableExecutor;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$1;
 HPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;->logEvalForegroundModeAsync(JIIIII)V
@@ -2699,15 +2232,13 @@
 HSPLcom/android/server/appop/AttributedOp$InProgressStartOpEvent;->getUidState()I
 HSPLcom/android/server/appop/AttributedOp$InProgressStartOpEvent;->getVirtualDeviceId()I
 HSPLcom/android/server/appop/AttributedOp$InProgressStartOpEvent;->reinit(JJLandroid/os/IBinder;Ljava/lang/String;ILjava/lang/Runnable;IILandroid/app/AppOpsManager$OpEventProxyInfo;IILandroid/util/Pools$Pool;)V+]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/os/Binder;]Landroid/util/Pools$Pool;Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool;
-HSPLcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;-><init>(Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool;I)V
 HSPLcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;->acquire(JJLandroid/os/IBinder;Ljava/lang/String;ILjava/lang/Runnable;ILjava/lang/String;Ljava/lang/String;IIII)Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;+]Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;]Landroid/util/Pools$SimplePool;Lcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;]Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool;Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool;
-HSPLcom/android/server/appop/AttributedOp$OpEventProxyInfoPool;-><init>(I)V
 HSPLcom/android/server/appop/AttributedOp$OpEventProxyInfoPool;->acquire(ILjava/lang/String;Ljava/lang/String;)Landroid/app/AppOpsManager$OpEventProxyInfo;
 HSPLcom/android/server/appop/AttributedOp;-><init>(Lcom/android/server/appop/AppOpsService;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/appop/AppOpsService$Op;)V
-HPLcom/android/server/appop/AttributedOp;->accessed(ILjava/lang/String;Ljava/lang/String;II)V+]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry;
+HSPLcom/android/server/appop/AttributedOp;->accessed(ILjava/lang/String;Ljava/lang/String;II)V+]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry;
 HSPLcom/android/server/appop/AttributedOp;->accessed(JJILjava/lang/String;Ljava/lang/String;II)V+]Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool;Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool;]Landroid/app/AppOpsManager$NoteOpEvent;Landroid/app/AppOpsManager$NoteOpEvent;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
-HPLcom/android/server/appop/AttributedOp;->createAttributedOpEntryLocked()Landroid/app/AppOpsManager$AttributedOpEntry;+]Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
-HPLcom/android/server/appop/AttributedOp;->deepClone(Landroid/util/LongSparseArray;)Landroid/util/LongSparseArray;+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
+HSPLcom/android/server/appop/AttributedOp;->createAttributedOpEntryLocked()Landroid/app/AppOpsManager$AttributedOpEntry;+]Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
+HSPLcom/android/server/appop/AttributedOp;->deepClone(Landroid/util/LongSparseArray;)Landroid/util/LongSparseArray;+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
 HSPLcom/android/server/appop/AttributedOp;->finishOrPause(Landroid/os/IBinder;ZZ)V+]Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AppOpsService$Op;Lcom/android/server/appop/AppOpsService$Op;]Landroid/util/Pools$SimplePool;Lcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry;]Landroid/app/AppOpsManager$NoteOpEvent;Landroid/app/AppOpsManager$NoteOpEvent;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
 HSPLcom/android/server/appop/AttributedOp;->finished(Landroid/os/IBinder;)V
 HSPLcom/android/server/appop/AttributedOp;->finished(Landroid/os/IBinder;Z)V
@@ -2718,81 +2249,58 @@
 HSPLcom/android/server/appop/AttributedOp;->rejected(JII)V+]Landroid/app/AppOpsManager$NoteOpEvent;Landroid/app/AppOpsManager$NoteOpEvent;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
 HSPLcom/android/server/appop/AttributedOp;->started(Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;IIIII)V+]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;
 HSPLcom/android/server/appop/AttributedOp;->startedOrPaused(Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;IIIZZII)V+]Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AppOpsService$Op;Lcom/android/server/appop/AppOpsService$Op;]Lcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;Lcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;
-HSPLcom/android/server/appop/AudioRestrictionManager;-><clinit>()V
-HSPLcom/android/server/appop/AudioRestrictionManager;-><init>()V
-HPLcom/android/server/appop/AudioRestrictionManager;->checkAudioOperation(IIILjava/lang/String;)I+]Lcom/android/server/appop/AudioRestrictionManager;Lcom/android/server/appop/AudioRestrictionManager;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/appop/AudioRestrictionManager;->checkZenModeRestrictionLocked(IIILjava/lang/String;)I+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOp$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOp;->$r8$lambda$1WoNdv1MUpgAvPIpKBXgm8bt8Rs(Lcom/android/server/appop/DiscreteRegistry$DiscreteOpEvent;Lcom/android/server/appop/DiscreteRegistry$DiscreteOpEvent;)I
 HPLcom/android/server/appop/DiscreteRegistry$DiscreteOp;->addDiscreteAccess(Ljava/lang/String;IIJJII)V+]Lcom/android/server/appop/DiscreteRegistry$DiscreteOp;Lcom/android/server/appop/DiscreteRegistry$DiscreteOp;]Ljava/util/List;Ljava/util/ArrayList;
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOp;->deserialize(Lcom/android/modules/utils/TypedXmlPullParser;J)V+]Lcom/android/server/appop/DiscreteRegistry$DiscreteOp;Lcom/android/server/appop/DiscreteRegistry$DiscreteOp;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOp;->getOrCreateDiscreteOpEventsList(Ljava/lang/String;)Ljava/util/List;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOp;->lambda$deserialize$0(Lcom/android/server/appop/DiscreteRegistry$DiscreteOpEvent;Lcom/android/server/appop/DiscreteRegistry$DiscreteOpEvent;)I
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOp;->merge(Lcom/android/server/appop/DiscreteRegistry$DiscreteOp;)V
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOp;->serialize(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/List;Ljava/util/ArrayList;
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOpEvent;-><init>(Lcom/android/server/appop/DiscreteRegistry;JJIIII)V
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOpEvent;->serialize(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;
+HPLcom/android/server/appop/DiscreteRegistry$DiscreteOp;->getOrCreateDiscreteOpEventsList(Ljava/lang/String;)Ljava/util/List;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
+HPLcom/android/server/appop/DiscreteRegistry$DiscreteOp;->serialize(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
+HPLcom/android/server/appop/DiscreteRegistry$DiscreteOpEvent;-><init>(Lcom/android/server/appop/DiscreteRegistry;JJIIII)V
+HPLcom/android/server/appop/DiscreteRegistry$DiscreteOpEvent;->serialize(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;
 HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOps;-><init>(Lcom/android/server/appop/DiscreteRegistry;I)V
 HPLcom/android/server/appop/DiscreteRegistry$DiscreteOps;->addDiscreteAccess(IILjava/lang/String;Ljava/lang/String;IIJJII)V+]Lcom/android/server/appop/DiscreteRegistry$DiscreteUidOps;Lcom/android/server/appop/DiscreteRegistry$DiscreteUidOps;]Lcom/android/server/appop/DiscreteRegistry$DiscreteOps;Lcom/android/server/appop/DiscreteRegistry$DiscreteOps;
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOps;->getOrCreateDiscreteUidOps(I)Lcom/android/server/appop/DiscreteRegistry$DiscreteUidOps;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOps;->readFromFile(Ljava/io/File;J)V
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteOps;->writeToStream(Ljava/io/FileOutputStream;)V
-HSPLcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;-><init>(Lcom/android/server/appop/DiscreteRegistry;)V
+HPLcom/android/server/appop/DiscreteRegistry$DiscreteOps;->getOrCreateDiscreteUidOps(I)Lcom/android/server/appop/DiscreteRegistry$DiscreteUidOps;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
+HPLcom/android/server/appop/DiscreteRegistry$DiscreteOps;->writeToStream(Ljava/io/FileOutputStream;)V
 HPLcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;->addDiscreteAccess(ILjava/lang/String;IIJJII)V+]Lcom/android/server/appop/DiscreteRegistry$DiscreteOp;Lcom/android/server/appop/DiscreteRegistry$DiscreteOp;]Lcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;Lcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;
-HSPLcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;->getOrCreateDiscreteOp(I)Lcom/android/server/appop/DiscreteRegistry$DiscreteOp;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;->serialize(Lcom/android/modules/utils/TypedXmlSerializer;)V
+HPLcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;->getOrCreateDiscreteOp(I)Lcom/android/server/appop/DiscreteRegistry$DiscreteOp;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
+HPLcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;->serialize(Lcom/android/modules/utils/TypedXmlSerializer;)V
 HPLcom/android/server/appop/DiscreteRegistry$DiscreteUidOps;->addDiscreteAccess(ILjava/lang/String;Ljava/lang/String;IIJJII)V+]Lcom/android/server/appop/DiscreteRegistry$DiscreteUidOps;Lcom/android/server/appop/DiscreteRegistry$DiscreteUidOps;]Lcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;Lcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteUidOps;->getOrCreateDiscretePackageOps(Ljava/lang/String;)Lcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/appop/DiscreteRegistry$DiscreteUidOps;->serialize(Lcom/android/modules/utils/TypedXmlSerializer;)V
-HSPLcom/android/server/appop/DiscreteRegistry;-><clinit>()V
-HSPLcom/android/server/appop/DiscreteRegistry;-><init>(Ljava/lang/Object;)V
-HSPLcom/android/server/appop/DiscreteRegistry;->createDiscreteAccessDirLocked()V
+HPLcom/android/server/appop/DiscreteRegistry$DiscreteUidOps;->getOrCreateDiscretePackageOps(Ljava/lang/String;)Lcom/android/server/appop/DiscreteRegistry$DiscretePackageOps;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
+HPLcom/android/server/appop/DiscreteRegistry$DiscreteUidOps;->serialize(Lcom/android/modules/utils/TypedXmlSerializer;)V
 HPLcom/android/server/appop/DiscreteRegistry;->deleteOldDiscreteHistoryFilesLocked()V+]Ljava/lang/String;Ljava/lang/String;]Ljava/io/File;Ljava/io/File;]Ljava/time/Instant;Ljava/time/Instant;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/appop/DiscreteRegistry;->isDiscreteOp(II)Z
 HSPLcom/android/server/appop/DiscreteRegistry;->readLargestChainIdFromDiskLocked()I
 HSPLcom/android/server/appop/DiscreteRegistry;->recordDiscreteAccess(ILjava/lang/String;ILjava/lang/String;IIJJII)V+]Lcom/android/server/appop/DiscreteRegistry$DiscreteOps;Lcom/android/server/appop/DiscreteRegistry$DiscreteOps;
-HSPLcom/android/server/appop/DiscreteRegistry;->stableListMerge(Ljava/util/List;Ljava/util/List;)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->generateFile(Ljava/io/File;I)Ljava/io/File;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->handlePersistHistoricalOpsRecursiveDLocked(Ljava/io/File;Ljava/io/File;Ljava/util/List;Ljava/util/Set;I)V+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Ljava/io/File;Ljava/io/File;]Ljava/util/List;Ljava/util/LinkedList;,Ljava/util/ArrayList;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;]Ljava/util/Set;Landroid/util/ArraySet;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->normalizeSnapshotForSlotDuration(Ljava/util/List;J)V
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalAttributionOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlPullParser;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalOpsLocked(Ljava/io/File;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IJJI[J)Ljava/util/List;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalPackageOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalUidOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;Lcom/android/modules/utils/TypedXmlPullParser;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->readStateDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Ljava/lang/String;ILcom/android/modules/utils/TypedXmlPullParser;ID)Landroid/app/AppOpsManager$HistoricalOps;+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->readeHistoricalOpsDLocked(Lcom/android/modules/utils/TypedXmlPullParser;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IJJI[J)Landroid/app/AppOpsManager$HistoricalOps;+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalAttributionOpsDLocked(Landroid/app/AppOpsManager$AttributedHistoricalOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;]Landroid/app/AppOpsManager$AttributedHistoricalOps;Landroid/app/AppOpsManager$AttributedHistoricalOps;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOp;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/app/AppOpsManager$HistoricalOp;Landroid/app/AppOpsManager$HistoricalOp;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpsDLocked(Ljava/util/List;JLjava/io/File;)V
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalPackageOpsDLocked(Landroid/app/AppOpsManager$HistoricalPackageOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/app/AppOpsManager$HistoricalPackageOps;Landroid/app/AppOpsManager$HistoricalPackageOps;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalUidOpsDLocked(Landroid/app/AppOpsManager$HistoricalUidOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/app/AppOpsManager$HistoricalUidOps;Landroid/app/AppOpsManager$HistoricalUidOps;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
-HSPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeStateOnLocked(Landroid/app/AppOpsManager$HistoricalOp;JLcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/app/AppOpsManager$HistoricalOp;Landroid/app/AppOpsManager$HistoricalOp;
-HSPLcom/android/server/appop/HistoricalRegistry;-><clinit>()V
-HSPLcom/android/server/appop/HistoricalRegistry;-><init>(Ljava/lang/Object;)V
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->generateFile(Ljava/io/File;I)Ljava/io/File;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->handlePersistHistoricalOpsRecursiveDLocked(Ljava/io/File;Ljava/io/File;Ljava/util/List;Ljava/util/Set;I)V+]Ljava/io/File;Ljava/io/File;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/LinkedList;,Ljava/util/ArrayList;]Ljava/util/Set;Landroid/util/ArraySet;,Ljava/util/Collections$EmptySet;]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->normalizeSnapshotForSlotDuration(Ljava/util/List;J)V+]Ljava/util/List;Ljava/util/ArrayList;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalAttributionOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlPullParser;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalOpsLocked(Ljava/io/File;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IJJI[J)Ljava/util/List;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalPackageOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalUidOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;Lcom/android/modules/utils/TypedXmlPullParser;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readStateDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Ljava/lang/String;ILcom/android/modules/utils/TypedXmlPullParser;ID)Landroid/app/AppOpsManager$HistoricalOps;+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readeHistoricalOpsDLocked(Lcom/android/modules/utils/TypedXmlPullParser;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IJJI[J)Landroid/app/AppOpsManager$HistoricalOps;+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalAttributionOpsDLocked(Landroid/app/AppOpsManager$AttributedHistoricalOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;]Landroid/app/AppOpsManager$AttributedHistoricalOps;Landroid/app/AppOpsManager$AttributedHistoricalOps;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOp;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/app/AppOpsManager$HistoricalOp;Landroid/app/AppOpsManager$HistoricalOp;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpsDLocked(Ljava/util/List;JLjava/io/File;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/List;Ljava/util/ArrayList;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalPackageOpsDLocked(Landroid/app/AppOpsManager$HistoricalPackageOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/app/AppOpsManager$HistoricalPackageOps;Landroid/app/AppOpsManager$HistoricalPackageOps;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalUidOpsDLocked(Landroid/app/AppOpsManager$HistoricalUidOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/app/AppOpsManager$HistoricalUidOps;Landroid/app/AppOpsManager$HistoricalUidOps;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;
+HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeStateOnLocked(Landroid/app/AppOpsManager$HistoricalOp;JLcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/app/AppOpsManager$HistoricalOp;Landroid/app/AppOpsManager$HistoricalOp;
 HSPLcom/android/server/appop/HistoricalRegistry;->getUpdatedPendingHistoricalOpsMLocked(J)Landroid/app/AppOpsManager$HistoricalOps;+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry;
 HSPLcom/android/server/appop/HistoricalRegistry;->increaseOpAccessDuration(IILjava/lang/String;Ljava/lang/String;IIJJII)V+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/server/appop/DiscreteRegistry;Lcom/android/server/appop/DiscreteRegistry;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry;
 HSPLcom/android/server/appop/HistoricalRegistry;->incrementOpAccessedCount(IILjava/lang/String;Ljava/lang/String;IIJII)V+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/server/appop/DiscreteRegistry;Lcom/android/server/appop/DiscreteRegistry;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry;
 HSPLcom/android/server/appop/HistoricalRegistry;->incrementOpRejected(IILjava/lang/String;Ljava/lang/String;II)V+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry;
 HSPLcom/android/server/appop/HistoricalRegistry;->isPersistenceInitializedMLocked()Z
-HSPLcom/android/server/appop/LegacyAppOpStateParser;-><clinit>()V
-HSPLcom/android/server/appop/LegacyAppOpStateParser;-><init>()V
-HSPLcom/android/server/appop/LegacyAppOpStateParser;->readOp(Lcom/android/modules/utils/TypedXmlPullParser;ILjava/lang/String;Landroid/util/SparseArray;)V
-HSPLcom/android/server/appop/LegacyAppOpStateParser;->readPackageOp(Lcom/android/modules/utils/TypedXmlPullParser;ILandroid/util/SparseArray;)V
-HSPLcom/android/server/appop/LegacyAppOpStateParser;->readState(Landroid/util/AtomicFile;Landroid/util/SparseArray;Landroid/util/SparseArray;)I
 HSPLcom/android/server/appop/LegacyAppOpStateParser;->readUidOps(Lcom/android/modules/utils/TypedXmlPullParser;Landroid/util/SparseArray;)V
-HSPLcom/android/server/appop/LegacyAppOpStateParser;->readUser(Lcom/android/modules/utils/TypedXmlPullParser;Landroid/util/SparseArray;)V
 HSPLcom/android/server/appop/OnOpModeChangedListener;-><init>(IIIII)V
-HSPLcom/android/server/appop/OnOpModeChangedListener;->getFlags()I
 HPLcom/android/server/appprediction/AppPredictionManagerService$PredictionManagerServiceStub;->runForUserLocked(Ljava/lang/String;Landroid/app/prediction/AppPredictionSessionId;Ljava/util/function/Consumer;)V
 HPLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;->getUserId()I
 HPLcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;-><init>(ILandroid/content/ComponentName;)V
 HPLcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->enforceCallFromPackage(Ljava/lang/String;)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
-HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getEnabledGroupProfileIds(I)[I
+HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getEnabledGroupProfileIds(I)[I+]Landroid/os/UserManager;Landroid/os/UserManager;
 HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getGroupParent(I)I
-HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getProfileParent(I)I+]Landroid/os/UserManager;Landroid/os/UserManager;
+HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getProfileParent(I)I+]Landroid/os/UserManager;Landroid/os/UserManager;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
 HSPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->isCallerInstantAppLocked()Z
 HSPLcom/android/server/appwidget/AppWidgetServiceImpl;->-$$Nest$fgetmUserManager(Lcom/android/server/appwidget/AppWidgetServiceImpl;)Landroid/os/UserManager;
 HSPLcom/android/server/appwidget/AppWidgetServiceImpl;->ensureGroupStateLoadedLocked(I)V+]Lcom/android/server/appwidget/AppWidgetServiceImpl;Lcom/android/server/appwidget/AppWidgetServiceImpl;
@@ -2805,81 +2313,77 @@
 HSPLcom/android/server/appwidget/AppWidgetServiceImpl;->isUserRunningAndUnlocked(I)Z
 HPLcom/android/server/appwidget/AppWidgetServiceImpl;->lookupProviderLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;+]Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/appwidget/AppWidgetServiceImpl;->parseAppWidgetProviderInfo(Landroid/content/Context;Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;Landroid/content/pm/ActivityInfo;Ljava/lang/String;)Landroid/appwidget/AppWidgetProviderInfo;
-HPLcom/android/server/appwidget/AppWidgetServiceImpl;->scheduleNotifyUpdateAppWidgetLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$Widget;Landroid/widget/RemoteViews;)V
-HPLcom/android/server/appwidget/AppWidgetServiceImpl;->serializeAppWidget(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/appwidget/AppWidgetServiceImpl$Widget;Z)V
-HPLcom/android/server/appwidget/AppWidgetServiceImpl;->serializeProvider(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;Z)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HPLcom/android/server/appwidget/AppWidgetServiceImpl;->writeProfileStateToStreamLocked(Ljava/io/OutputStream;I)Z+]Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;]Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/lang/Integer;Ljava/lang/Integer;
+HPLcom/android/server/appwidget/AppWidgetServiceImpl;->serializeAppWidget(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/appwidget/AppWidgetServiceImpl$Widget;Z)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;,Lcom/android/internal/util/ArtBinaryXmlSerializer;
+HPLcom/android/server/appwidget/AppWidgetServiceImpl;->serializeProvider(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;Z)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;,Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/content/ComponentName;Landroid/content/ComponentName;
+HPLcom/android/server/appwidget/AppWidgetServiceImpl;->tagProvidersAndHosts()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/appwidget/AppWidgetServiceImpl;->writeProfileStateToStreamLocked(Ljava/io/OutputStream;I)Z+]Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;]Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
 HPLcom/android/server/appwidget/AppWidgetXmlUtil;->writeAppWidgetProviderInfoLocked(Lcom/android/modules/utils/TypedXmlSerializer;Landroid/appwidget/AppWidgetProviderInfo;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HSPLcom/android/server/audio/AudioDeviceBroker;->preferredCommunicationDevice()Landroid/media/AudioDeviceAttributes;
-HSPLcom/android/server/audio/AudioDeviceBroker;->topCommunicationRouteClient()Lcom/android/server/audio/AudioDeviceBroker$CommunicationRouteClient;
-HSPLcom/android/server/audio/AudioService$AudioHandler;->handleMessage(Landroid/os/Message;)V
+HSPLcom/android/server/audio/AudioDeviceBroker;->preferredCommunicationDevice()Landroid/media/AudioDeviceAttributes;+]Lcom/android/server/audio/BtHelper;Lcom/android/server/audio/BtHelper;
+HSPLcom/android/server/audio/AudioDeviceBroker;->topCommunicationRouteClient()Lcom/android/server/audio/AudioDeviceBroker$CommunicationRouteClient;+]Ljava/util/LinkedList;Ljava/util/LinkedList;]Ljava/util/Iterator;Ljava/util/LinkedList$ListItr;]Lcom/android/server/audio/AudioDeviceBroker$CommunicationRouteClient;Lcom/android/server/audio/AudioDeviceBroker$CommunicationRouteClient;
+HSPLcom/android/server/audio/AudioService$AudioHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/audio/SpatializerHelper;Lcom/android/server/audio/SpatializerHelper;]Lcom/android/server/audio/SoundDoseHelper;Lcom/android/server/audio/SoundDoseHelper;]Lcom/android/server/audio/AudioDeviceBroker;Lcom/android/server/audio/AudioDeviceBroker;]Landroid/media/MediaMetrics$Item;Landroid/media/MediaMetrics$Item;]Lcom/android/server/audio/SoundEffectsHelper;Lcom/android/server/audio/SoundEffectsHelper;]Lcom/android/server/audio/MusicFxHelper;Lcom/android/server/audio/MusicFxHelper;]Lcom/android/server/audio/AudioSystemAdapter;Lcom/android/server/audio/AudioSystemAdapter;]Lcom/android/server/utils/EventLogger;Lcom/android/server/utils/EventLogger;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/audio/SystemServerAdapter;Lcom/android/server/audio/SystemServerAdapter;]Lcom/android/server/audio/AudioService$SetModeDeathHandler;Lcom/android/server/audio/AudioService$SetModeDeathHandler;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/audio/AudioService$VolumeGroupState;->getSettingNameForDevice(I)Ljava/lang/String;
 HSPLcom/android/server/audio/AudioService$VolumeGroupState;->readSettings()V
-HSPLcom/android/server/audio/AudioService$VolumeStreamState$1;->record(Ljava/lang/String;II)V
+HSPLcom/android/server/audio/AudioService$VolumeStreamState$1;->record(Ljava/lang/String;II)V+]Landroid/media/MediaMetrics$Item;Landroid/media/MediaMetrics$Item;
 HSPLcom/android/server/audio/AudioService$VolumeStreamState;->-$$Nest$fgetmIsMuted(Lcom/android/server/audio/AudioService$VolumeStreamState;)Z
-HSPLcom/android/server/audio/AudioService$VolumeStreamState;->checkFixedVolumeDevices()V
+HSPLcom/android/server/audio/AudioService$VolumeStreamState;->checkFixedVolumeDevices()V+]Landroid/util/SparseIntArray;Lcom/android/server/audio/AudioService$VolumeStreamState$1;]Lcom/android/server/audio/AudioService$VolumeStreamState;Lcom/android/server/audio/AudioService$VolumeStreamState;
 HSPLcom/android/server/audio/AudioService$VolumeStreamState;->getIndex(I)I+]Landroid/util/SparseIntArray;Lcom/android/server/audio/AudioService$VolumeStreamState$1;
-HSPLcom/android/server/audio/AudioService$VolumeStreamState;->observeDevicesForStream_syncVSS(Z)Ljava/util/Set;+]Ljava/lang/Object;Ljava/util/TreeSet;]Lcom/android/server/audio/SystemServerAdapter;Lcom/android/server/audio/SystemServerAdapter;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
+HSPLcom/android/server/audio/AudioService$VolumeStreamState;->getSettingNameForDevice(I)Ljava/lang/String;
+HSPLcom/android/server/audio/AudioService$VolumeStreamState;->observeDevicesForStream_syncVSS(Z)Ljava/util/Set;+]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;]Ljava/util/Set;Ljava/util/TreeSet;]Lcom/android/server/audio/SystemServerAdapter;Lcom/android/server/audio/SystemServerAdapter;]Ljava/lang/Object;Ljava/util/TreeSet;
 HSPLcom/android/server/audio/AudioService$VolumeStreamState;->readSettings()V
 HSPLcom/android/server/audio/AudioService$VolumeStreamState;->setIndex(IILjava/lang/String;Z)Z+]Landroid/util/SparseIntArray;Lcom/android/server/audio/AudioService$VolumeStreamState$1;]Lcom/android/server/audio/AudioService$VolumeStreamState;Lcom/android/server/audio/AudioService$VolumeStreamState;]Lcom/android/server/utils/EventLogger;Lcom/android/server/utils/EventLogger;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/audio/AudioService;->-$$Nest$fgetmSystemServer(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/SystemServerAdapter;
 HSPLcom/android/server/audio/AudioService;->-$$Nest$mgetDeviceSetForStreamDirect(Lcom/android/server/audio/AudioService;I)Ljava/util/Set;
-HPLcom/android/server/audio/AudioService;->anonymizeAudioDeviceAttributesListUnchecked(Ljava/util/List;)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
-HPLcom/android/server/audio/AudioService;->enforceQueryStateOrModifyRoutingPermission()V
+HSPLcom/android/server/audio/AudioService;->enforceVolumeController(Ljava/lang/String;)V
 HSPLcom/android/server/audio/AudioService;->ensureValidStreamType(I)V
-HSPLcom/android/server/audio/AudioService;->getDeviceForStream(I)I
+HSPLcom/android/server/audio/AudioService;->getDeviceForStream(I)I+]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
 HSPLcom/android/server/audio/AudioService;->getDeviceSetForStream(I)Ljava/util/Set;+]Lcom/android/server/audio/AudioService$VolumeStreamState;Lcom/android/server/audio/AudioService$VolumeStreamState;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
 HSPLcom/android/server/audio/AudioService;->getDeviceSetForStreamDirect(I)Ljava/util/Set;+]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
-HPLcom/android/server/audio/AudioService;->getDevicesForAttributes(Landroid/media/AudioAttributes;)Ljava/util/ArrayList;+]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
 HSPLcom/android/server/audio/AudioService;->getDevicesForAttributesInt(Landroid/media/AudioAttributes;Z)Ljava/util/ArrayList;+]Lcom/android/server/audio/AudioSystemAdapter;Lcom/android/server/audio/AudioSystemAdapter;
-HSPLcom/android/server/audio/AudioService;->getStreamMaxVolume(I)I
+HSPLcom/android/server/audio/AudioService;->getStreamMaxVolume(I)I+]Lcom/android/server/audio/AudioService$VolumeStreamState;Lcom/android/server/audio/AudioService$VolumeStreamState;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
 HSPLcom/android/server/audio/AudioService;->getStreamMinVolume(I)I+]Lcom/android/server/audio/AudioService$VolumeStreamState;Lcom/android/server/audio/AudioService$VolumeStreamState;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
-HPLcom/android/server/audio/AudioService;->getStreamVolume(I)I+]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
-HPLcom/android/server/audio/AudioService;->getStreamVolume(II)I+]Lcom/android/server/audio/AudioService$VolumeStreamState;Lcom/android/server/audio/AudioService$VolumeStreamState;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
-HPLcom/android/server/audio/AudioService;->isBluetoothPrividged()Z+]Landroid/content/Context;Landroid/app/ContextImpl;
-HSPLcom/android/server/audio/AudioService;->isFixedVolumeDevice(I)Z
+HSPLcom/android/server/audio/AudioService;->getStreamVolume(I)I+]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
+HSPLcom/android/server/audio/AudioService;->getStreamVolume(II)I+]Lcom/android/server/audio/AudioService$VolumeStreamState;Lcom/android/server/audio/AudioService$VolumeStreamState;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
+HSPLcom/android/server/audio/AudioService;->isBluetoothPrividged()Z+]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/audio/AudioService;->isFixedVolumeDevice(I)Z+]Ljava/util/Set;Ljava/util/HashSet;
+HSPLcom/android/server/audio/AudioService;->isFullVolumeDevice(I)Z+]Ljava/util/Set;Ljava/util/HashSet;
 HSPLcom/android/server/audio/AudioService;->isStreamMute(I)Z
-HPLcom/android/server/audio/AudioService;->onPlaybackConfigChange(Ljava/util/List;)V+]Landroid/media/AudioPlaybackConfiguration;Landroid/media/AudioPlaybackConfiguration;]Lcom/android/server/audio/SoundDoseHelper;Lcom/android/server/audio/SoundDoseHelper;]Landroid/media/AudioAttributes;Landroid/media/AudioAttributes;]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;]Lcom/android/server/audio/AudioDeviceBroker;Lcom/android/server/audio/AudioDeviceBroker;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/audio/LoudnessCodecHelper;Lcom/android/server/audio/LoudnessCodecHelper;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;
-HSPLcom/android/server/audio/AudioService;->selectOneAudioDevice(Ljava/util/Set;)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/Iterator;Ljava/util/TreeMap$KeyIterator;]Ljava/util/Set;Ljava/util/TreeSet;
-HSPLcom/android/server/audio/AudioService;->sendMsg(Landroid/os/Handler;IIIILjava/lang/Object;I)V
-HSPLcom/android/server/audio/AudioService;->updateVolumeStates(IILjava/lang/String;)V
+HSPLcom/android/server/audio/AudioService;->onObserveDevicesForAllStreams(I)V+]Lcom/android/server/audio/AudioService$VolumeStreamState;Lcom/android/server/audio/AudioService$VolumeStreamState;]Ljava/util/Iterator;Ljava/util/TreeMap$KeyIterator;]Ljava/util/Set;Ljava/util/TreeSet;
+HSPLcom/android/server/audio/AudioService;->selectOneAudioDevice(Ljava/util/Set;)I+]Ljava/util/Iterator;Ljava/util/TreeMap$KeyIterator;]Ljava/util/Set;Ljava/util/TreeSet;]Ljava/lang/Integer;Ljava/lang/Integer;
+HSPLcom/android/server/audio/AudioService;->sendMsg(Landroid/os/Handler;IIIILjava/lang/Object;I)V+]Landroid/os/Handler;Lcom/android/server/audio/AudioService$AudioHandler;
+HSPLcom/android/server/audio/AudioService;->updateVolumeStates(IILjava/lang/String;)V+]Landroid/media/AudioAttributes$Builder;Landroid/media/AudioAttributes$Builder;]Lcom/android/server/audio/AudioService$VolumeStreamState;Lcom/android/server/audio/AudioService$VolumeStreamState;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;]Ljava/util/Set;Ljava/util/HashSet;
 HSPLcom/android/server/audio/AudioSystemAdapter;->getDevicesForAttributes(Landroid/media/AudioAttributes;Z)Ljava/util/ArrayList;
 HSPLcom/android/server/audio/AudioSystemAdapter;->getDevicesForAttributesImpl(Landroid/media/AudioAttributes;Z)Ljava/util/ArrayList;+]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;
-HPLcom/android/server/audio/MediaFocusControl;->requestAudioFocus(Landroid/media/AudioAttributes;ILandroid/os/IBinder;Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIZIZ)I
-HPLcom/android/server/audio/PlaybackActivityMonitor;->dispatchPlaybackChange(Z)V+]Ljava/util/concurrent/ConcurrentLinkedQueue;Ljava/util/concurrent/ConcurrentLinkedQueue;]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/audio/PlaybackActivityMonitor$PlayMonitorClient;Lcom/android/server/audio/PlaybackActivityMonitor$PlayMonitorClient;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentLinkedQueue$Itr;]Lcom/android/server/audio/PlaybackActivityMonitor;Lcom/android/server/audio/PlaybackActivityMonitor;
+HPLcom/android/server/audio/PlaybackActivityMonitor;->dispatchPlaybackChange(Z)V+]Ljava/util/concurrent/ConcurrentLinkedQueue;Ljava/util/concurrent/ConcurrentLinkedQueue;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentLinkedQueue$Itr;]Lcom/android/server/audio/PlaybackActivityMonitor$PlayMonitorClient;Lcom/android/server/audio/PlaybackActivityMonitor$PlayMonitorClient;]Lcom/android/server/audio/PlaybackActivityMonitor;Lcom/android/server/audio/PlaybackActivityMonitor;
 HPLcom/android/server/audio/PlaybackActivityMonitor;->playerEvent(IIII)V
 HPLcom/android/server/audio/PlaybackActivityMonitor;->releasePlayer(II)V
 HSPLcom/android/server/audio/PlaybackActivityMonitor;->trackPlayer(Landroid/media/PlayerBase$PlayerIdCard;)I
-HSPLcom/android/server/autofill/AutofillManagerService$AugmentedAutofillState;->injectAugmentedAutofillInfo(Landroid/content/AutofillOptions;ILjava/lang/String;)V
-HSPLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;->getAppDisabledActivities(ILjava/lang/String;)Landroid/util/ArrayMap;
-HSPLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;->getAppDisabledExpiration(ILjava/lang/String;)J
+HSPLcom/android/server/autofill/AutofillManagerService$AugmentedAutofillState;->injectAugmentedAutofillInfo(Landroid/content/AutofillOptions;ILjava/lang/String;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;->getAppDisabledActivities(ILjava/lang/String;)Landroid/util/ArrayMap;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/autofill/AutofillManagerService$DisabledInfoCache;->getAppDisabledExpiration(ILjava/lang/String;)J+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/autofill/AutofillManagerService$LocalService;->getAutofillOptions(Ljava/lang/String;JI)Landroid/content/AutofillOptions;
 HSPLcom/android/server/autofill/AutofillManagerService$LocalService;->injectDisableAppInfo(Landroid/content/AutofillOptions;ILjava/lang/String;)V
-HPLcom/android/server/autofill/Session;->updateLocked(Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;II)V
 HPLcom/android/server/backup/BackupManagerConstants;->getFullBackupIntervalMilliseconds()J
-HPLcom/android/server/backup/BackupManagerConstants;->getFullBackupRequireCharging()Z
-HPLcom/android/server/backup/BackupManagerConstants;->getFullBackupRequiredNetworkType()I
 HSPLcom/android/server/backup/BackupManagerService;->binderGetCallingUserId()I
-HPLcom/android/server/backup/BackupManagerService;->dataChanged(ILjava/lang/String;)V
-HSPLcom/android/server/backup/BackupManagerService;->dataChanged(Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerService;->dataChanged(ILjava/lang/String;)V+]Lcom/android/server/backup/BackupManagerService;Lcom/android/server/backup/BackupManagerService;]Lcom/android/server/backup/UserBackupManagerService;Lcom/android/server/backup/UserBackupManagerService;
+HSPLcom/android/server/backup/BackupManagerService;->dataChanged(Ljava/lang/String;)V+]Lcom/android/server/backup/BackupManagerService;Lcom/android/server/backup/BackupManagerService;
+HSPLcom/android/server/backup/BackupManagerService;->dataChangedForUser(ILjava/lang/String;)V+]Lcom/android/server/backup/BackupManagerService;Lcom/android/server/backup/BackupManagerService;
 HSPLcom/android/server/backup/BackupManagerService;->enforceCallingPermissionOnUserId(ILjava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/UserHandle;Landroid/os/UserHandle;
-HPLcom/android/server/backup/BackupManagerService;->getServiceForUserIfCallerHasPermission(ILjava/lang/String;)Lcom/android/server/backup/UserBackupManagerService;
-HSPLcom/android/server/backup/BackupManagerService;->isUserReadyForBackup(I)Z
+HPLcom/android/server/backup/BackupManagerService;->getServiceForUserIfCallerHasPermission(ILjava/lang/String;)Lcom/android/server/backup/UserBackupManagerService;+]Lcom/android/server/backup/BackupManagerService;Lcom/android/server/backup/BackupManagerService;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/backup/BackupManagerService;->isUserReadyForBackup(I)Z+]Lcom/android/server/backup/BackupManagerService;Lcom/android/server/backup/BackupManagerService;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/backup/FullBackupJob;->schedule(ILandroid/content/Context;JLcom/android/server/backup/UserBackupManagerService;)V
 HPLcom/android/server/backup/TransportManager;->addUserIdToLogMessage(ILjava/lang/String;)Ljava/lang/String;
-HPLcom/android/server/backup/TransportManager;->getRegisteredTransportEntryLocked(Ljava/lang/String;)Ljava/util/Map$Entry;
+HPLcom/android/server/backup/TransportManager;->getRegisteredTransportEntryLocked(Ljava/lang/String;)Ljava/util/Map$Entry;+]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;
 HPLcom/android/server/backup/TransportManager;->updateTransportAttributes(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/CharSequence;)V
 HPLcom/android/server/backup/UserBackupManagerService$1;->run()V+]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Ljava/io/DataOutputStream;Ljava/io/DataOutputStream;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/io/ByteArrayOutputStream;Ljava/io/ByteArrayOutputStream;]Ljava/io/FileOutputStream;Ljava/io/FileOutputStream;
 HPLcom/android/server/backup/UserBackupManagerService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HPLcom/android/server/backup/UserBackupManagerService$4;-><init>(Lcom/android/server/backup/UserBackupManagerService;Ljava/lang/String;Ljava/util/HashSet;)V
 HPLcom/android/server/backup/UserBackupManagerService$BackupWakeLock;->release()V
-HPLcom/android/server/backup/UserBackupManagerService;->-$$Nest$fgetmFullBackupQueue(Lcom/android/server/backup/UserBackupManagerService;)Ljava/util/ArrayList;
 HPLcom/android/server/backup/UserBackupManagerService;->addUserIdToLogMessage(ILjava/lang/String;)Ljava/lang/String;
 HPLcom/android/server/backup/UserBackupManagerService;->beginFullBackup(Lcom/android/server/backup/FullBackupJob;)Z
 HPLcom/android/server/backup/UserBackupManagerService;->bindToAgentSynchronous(Landroid/content/pm/ApplicationInfo;II)Landroid/app/IBackupAgent;
 HPLcom/android/server/backup/UserBackupManagerService;->dataChanged(Ljava/lang/String;)V
-HPLcom/android/server/backup/UserBackupManagerService;->dataChangedImpl(Ljava/lang/String;Ljava/util/HashSet;)V
-HPLcom/android/server/backup/UserBackupManagerService;->dataChangedTargets(Ljava/lang/String;)Ljava/util/HashSet;
+HPLcom/android/server/backup/UserBackupManagerService;->dataChangedImpl(Ljava/lang/String;Ljava/util/HashSet;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/HashSet;Ljava/util/HashSet;
+HPLcom/android/server/backup/UserBackupManagerService;->dataChangedTargets(Ljava/lang/String;)Ljava/util/HashSet;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/backup/UserBackupManagerService;->dequeueFullBackupLocked(Ljava/lang/String;)V+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/backup/UserBackupManagerService;->enqueueFullBackup(Ljava/lang/String;J)V+]Lcom/android/server/backup/UserBackupManagerService;Lcom/android/server/backup/UserBackupManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/backup/UserBackupManagerService;->fullBackupAllowable(Ljava/lang/String;)Z
@@ -2897,14 +2401,15 @@
 HPLcom/android/server/backup/transport/BackupTransportClient$TransportStatusCallbackPool;->recycle(Lcom/android/server/backup/transport/TransportStatusCallback;)V
 HPLcom/android/server/backup/transport/BackupTransportClient;->getFutureResult(Lcom/android/internal/infra/AndroidFuture;)Ljava/lang/Object;
 HPLcom/android/server/backup/transport/TransportConnection;-><init>(ILandroid/content/Context;Lcom/android/server/backup/transport/TransportStats;Landroid/content/Intent;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Landroid/os/Handler;)V
-HPLcom/android/server/backup/transport/TransportConnection;->checkStateIntegrityLocked()V
+HPLcom/android/server/backup/transport/TransportConnection;->checkStateIntegrityLocked()V+]Ljava/util/Map;Landroid/util/ArrayMap;
 HPLcom/android/server/backup/transport/TransportConnection;->connect(Ljava/lang/String;)Lcom/android/server/backup/transport/BackupTransportClient;
 HPLcom/android/server/backup/transport/TransportConnection;->connectAsync(Lcom/android/server/backup/transport/TransportConnectionListener;Ljava/lang/String;)V
 HPLcom/android/server/backup/transport/TransportConnection;->log(ILjava/lang/String;)V
 HPLcom/android/server/backup/transport/TransportConnection;->log(ILjava/lang/String;Ljava/lang/String;)V
 HPLcom/android/server/backup/transport/TransportConnection;->notifyListener(Lcom/android/server/backup/transport/TransportConnectionListener;Lcom/android/server/backup/transport/BackupTransportClient;Ljava/lang/String;)V
+HPLcom/android/server/backup/transport/TransportConnection;->notifyListenersAndClearLocked(Lcom/android/server/backup/transport/BackupTransportClient;)V
 HPLcom/android/server/backup/transport/TransportConnection;->onStateTransition(II)V
-HPLcom/android/server/backup/transport/TransportConnection;->saveLogEntry(Ljava/lang/String;)V
+HPLcom/android/server/backup/transport/TransportConnection;->saveLogEntry(Ljava/lang/String;)V+]Ljava/util/List;Ljava/util/LinkedList;
 HPLcom/android/server/backup/transport/TransportConnection;->setStateLocked(ILcom/android/server/backup/transport/BackupTransportClient;)V
 HPLcom/android/server/backup/transport/TransportConnection;->toString()Ljava/lang/String;
 HPLcom/android/server/backup/transport/TransportConnection;->unbind(Ljava/lang/String;)V
@@ -2913,25 +2418,23 @@
 HPLcom/android/server/backup/transport/TransportStats$Stats;->register(J)V
 HPLcom/android/server/backup/transport/TransportStatusCallback;->getOperationStatus()I
 HPLcom/android/server/backup/transport/TransportUtils;->formatMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HPLcom/android/server/backup/utils/BackupEligibilityRules;->appIsDisabled(Landroid/content/pm/ApplicationInfo;)Z
-HPLcom/android/server/backup/utils/BackupEligibilityRules;->appIsEligibleForBackup(Landroid/content/pm/ApplicationInfo;)Z
+HPLcom/android/server/backup/utils/BackupEligibilityRules;->appIsEligibleForBackup(Landroid/content/pm/ApplicationInfo;)Z+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/backup/utils/BackupEligibilityRules;Lcom/android/server/backup/utils/BackupEligibilityRules;]Ljava/util/Set;Ljava/util/HashSet;
 HPLcom/android/server/backup/utils/BackupEligibilityRules;->appIsRunningAndEligibleForBackupWithTransport(Lcom/android/server/backup/transport/TransportConnection;Ljava/lang/String;)Z
 HPLcom/android/server/backup/utils/SparseArrayUtils;->union(Landroid/util/SparseArray;)Ljava/util/HashSet;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/HashSet;Ljava/util/HashSet;
+HSPLcom/android/server/biometrics/BiometricSensor;->toString()Ljava/lang/String;
 HPLcom/android/server/biometrics/BiometricService$BiometricServiceWrapper;->getAuthenticatorIds(I)[J
 HPLcom/android/server/biometrics/PreAuthInfo;->create(Landroid/app/trust/ITrustManager;Landroid/app/admin/DevicePolicyManager;Lcom/android/server/biometrics/BiometricService$SettingObserver;Ljava/util/List;ILandroid/hardware/biometrics/PromptInfo;Ljava/lang/String;ZLandroid/content/Context;Lcom/android/server/biometrics/BiometricCameraManager;)Lcom/android/server/biometrics/PreAuthInfo;
-HPLcom/android/server/biometrics/log/OperationContextExt;->setFirstSessionId(Lcom/android/server/biometrics/log/BiometricContext;)V
-HPLcom/android/server/biometrics/log/OperationContextExt;->update(Lcom/android/server/biometrics/log/BiometricContext;Z)Lcom/android/server/biometrics/log/OperationContextExt;
-HPLcom/android/server/biometrics/sensors/AcquisitionClient;->onAcquiredInternal(IIZ)V
-HPLcom/android/server/biometrics/sensors/AuthenticationClient;->onAuthenticated(Landroid/hardware/biometrics/BiometricAuthenticator$Identifier;ZLjava/util/ArrayList;)V
-HSPLcom/android/server/biometrics/sensors/BaseClientMonitor;->toString()Ljava/lang/String;
-HPLcom/android/server/biometrics/sensors/BiometricScheduler$1;->lambda$onClientFinished$0(Lcom/android/server/biometrics/sensors/BaseClientMonitor;Z)V
-HPLcom/android/server/biometrics/sensors/BiometricScheduler;->startNextOperationIfIdleLegacy()V
-HPLcom/android/server/biometrics/sensors/BiometricServiceRegistry;->getProviderForSensor(I)Lcom/android/server/biometrics/sensors/BiometricServiceProvider;
-HPLcom/android/server/biometrics/sensors/BiometricServiceRegistry;->getSingleProvider()Landroid/util/Pair;
-HPLcom/android/server/biometrics/sensors/fingerprint/FingerprintService$1;->isHardwareDetectedDeprecated(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/server/biometrics/sensors/fingerprint/FingerprintUserState;->getCopy(Ljava/util/ArrayList;)Ljava/util/ArrayList;
-HPLcom/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider;->hasHalInstance()Z
-HPLcom/android/server/blob/BlobMetadata;->getAccessor(Landroid/util/ArraySet;Ljava/lang/String;II)Lcom/android/server/blob/BlobMetadata$Accessor;+]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/blob/BlobMetadata$Accessor;Lcom/android/server/blob/BlobMetadata$Leasee;,Lcom/android/server/blob/BlobMetadata$Committer;
+HPLcom/android/server/biometrics/log/OperationContextExt;->update(Lcom/android/server/biometrics/log/BiometricContext;Z)Lcom/android/server/biometrics/log/OperationContextExt;+]Lcom/android/server/biometrics/log/BiometricContext;Lcom/android/server/biometrics/log/BiometricContextProvider;
+HSPLcom/android/server/biometrics/sensors/BaseClientMonitor;->toString()Ljava/lang/String;+]Lcom/android/server/biometrics/sensors/BaseClientMonitor;megamorphic_types
+HSPLcom/android/server/biometrics/sensors/BiometricScheduler$1;->lambda$onClientFinished$0(Lcom/android/server/biometrics/sensors/BaseClientMonitor;Z)V
+HSPLcom/android/server/biometrics/sensors/BiometricScheduler;->startNextOperationIfIdleLegacy()V
+HSPLcom/android/server/biometrics/sensors/BiometricServiceRegistry;->getProviderForSensor(I)Lcom/android/server/biometrics/sensors/BiometricServiceProvider;+]Lcom/android/server/biometrics/sensors/BiometricServiceProvider;Lcom/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider;,Lcom/android/server/biometrics/sensors/face/aidl/FaceProvider;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;
+HSPLcom/android/server/biometrics/sensors/BiometricServiceRegistry;->getSingleProvider()Landroid/util/Pair;+]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/server/biometrics/sensors/BiometricServiceRegistry;Lcom/android/server/biometrics/sensors/face/FaceServiceRegistry;,Lcom/android/server/biometrics/sensors/fingerprint/FingerprintServiceRegistry;
+HSPLcom/android/server/biometrics/sensors/fingerprint/FingerprintService$1;->isHardwareDetectedDeprecated(Ljava/lang/String;Ljava/lang/String;)Z
+HSPLcom/android/server/biometrics/sensors/fingerprint/FingerprintUserState;->getCopy(Ljava/util/ArrayList;)Ljava/util/ArrayList;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HSPLcom/android/server/biometrics/sensors/fingerprint/FingerprintUtils;->getInstance(ILjava/lang/String;)Lcom/android/server/biometrics/sensors/fingerprint/FingerprintUtils;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider;->hasHalInstance()Z
+HPLcom/android/server/blob/BlobMetadata;->getAccessor(Landroid/util/ArraySet;Ljava/lang/String;II)Lcom/android/server/blob/BlobMetadata$Accessor;+]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/blob/BlobMetadata$Accessor;Lcom/android/server/blob/BlobMetadata$Committer;,Lcom/android/server/blob/BlobMetadata$Leasee;
 HPLcom/android/server/blob/BlobMetadata;->isALeaseeInUser(Ljava/lang/String;II)Z+]Lcom/android/server/blob/BlobMetadata$Leasee;Lcom/android/server/blob/BlobMetadata$Leasee;
 HPLcom/android/server/blob/BlobMetadata;->shouldAttributeToLeasee(IZ)Z+]Lcom/android/server/blob/BlobMetadata;Lcom/android/server/blob/BlobMetadata;
 HPLcom/android/server/blob/BlobMetadata;->writeToXml(Lorg/xmlpull/v1/XmlSerializer;)V+]Landroid/app/blob/BlobHandle;Landroid/app/blob/BlobHandle;]Lorg/xmlpull/v1/XmlSerializer;Lcom/android/internal/util/FastXmlSerializer;]Lcom/android/server/blob/BlobMetadata$Committer;Lcom/android/server/blob/BlobMetadata$Committer;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/blob/BlobMetadata$Leasee;Lcom/android/server/blob/BlobMetadata$Leasee;
@@ -2947,83 +2450,58 @@
 HPLcom/android/server/blob/BlobStoreManagerService;->-$$Nest$mforEachBlob(Lcom/android/server/blob/BlobStoreManagerService;Ljava/util/function/Consumer;)V+]Lcom/android/server/blob/BlobStoreManagerService;Lcom/android/server/blob/BlobStoreManagerService;
 HPLcom/android/server/blob/BlobStoreManagerService;->forEachBlob(Ljava/util/function/Consumer;)V+]Lcom/android/server/blob/BlobStoreManagerService;Lcom/android/server/blob/BlobStoreManagerService;
 HPLcom/android/server/blob/BlobStoreManagerService;->forEachBlobLocked(Ljava/util/function/Consumer;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Consumer;megamorphic_types
-HPLcom/android/server/blob/BlobStoreManagerService;->forEachSessionInUser(Ljava/util/function/Consumer;I)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Ljava/util/function/Consumer;Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda0;,Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda2;,Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda4;]Lcom/android/server/blob/BlobStoreManagerService;Lcom/android/server/blob/BlobStoreManagerService;
+HPLcom/android/server/blob/BlobStoreManagerService;->forEachSessionInUser(Ljava/util/function/Consumer;I)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Ljava/util/function/Consumer;Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda4;,Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda0;,Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda2;,Lcom/android/server/blob/BlobStoreManagerService$$ExternalSyntheticLambda16;]Lcom/android/server/blob/BlobStoreManagerService;Lcom/android/server/blob/BlobStoreManagerService;
 HPLcom/android/server/blob/BlobStoreManagerService;->getUserSessionsLocked(I)Landroid/util/LongSparseArray;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/blob/BlobStoreManagerService;->writeBlobSessionsLocked()V
+HPLcom/android/server/blob/BlobStoreManagerService;->writeBlobSessionsLocked()V+]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Lcom/android/server/blob/BlobStoreSession;Lcom/android/server/blob/BlobStoreSession;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
 HPLcom/android/server/blob/BlobStoreManagerService;->writeBlobsInfoLocked()V+]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/nio/charset/Charset;Lcom/android/icu/charset/CharsetICU;]Lcom/android/server/blob/BlobMetadata;Lcom/android/server/blob/BlobMetadata;]Lorg/xmlpull/v1/XmlSerializer;Lcom/android/internal/util/FastXmlSerializer;]Lcom/android/server/blob/BlobStoreManagerService;Lcom/android/server/blob/BlobStoreManagerService;
-HPLcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;->getAssociations(Ljava/lang/String;I)Ljava/util/List;
+HPLcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;->getAssociations(Ljava/lang/String;I)Ljava/util/List;+]Lcom/android/server/companion/association/AssociationStore;Lcom/android/server/companion/association/AssociationStore;
 HSPLcom/android/server/companion/virtual/VirtualDeviceManagerService$LocalService;->getDeviceIdsForUid(I)Landroid/util/ArraySet;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/companion/virtual/VirtualDeviceImpl;Lcom/android/server/companion/virtual/VirtualDeviceImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/companion/virtual/VirtualDeviceManagerService;->-$$Nest$mgetVirtualDevicesSnapshot(Lcom/android/server/companion/virtual/VirtualDeviceManagerService;)Ljava/util/ArrayList;
 HSPLcom/android/server/companion/virtual/VirtualDeviceManagerService;->getVirtualDevicesSnapshot()Ljava/util/ArrayList;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/compat/CompatChange;-><init>(JLjava/lang/String;IIZZLjava/lang/String;Z)V
 HSPLcom/android/server/compat/CompatChange;-><init>(Lcom/android/server/compat/config/Change;)V
-HSPLcom/android/server/compat/CompatChange;->clearOverrides()V
 HSPLcom/android/server/compat/CompatChange;->defaultValue()Z
 HSPLcom/android/server/compat/CompatChange;->isEnabled(Landroid/content/pm/ApplicationInfo;Lcom/android/internal/compat/AndroidBuildClassifier;)Z+]Lcom/android/internal/compat/AndroidBuildClassifier;Lcom/android/internal/compat/AndroidBuildClassifier;]Lcom/android/internal/compat/CompatibilityChangeInfo;Lcom/android/server/compat/CompatChange;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Lcom/android/server/compat/CompatChange;Lcom/android/server/compat/CompatChange;
 HPLcom/android/server/compat/CompatChange;->recheckOverride(Ljava/lang/String;Lcom/android/internal/compat/OverrideAllowedState;Ljava/lang/Long;)Z+]Lcom/android/server/compat/CompatChange;Lcom/android/server/compat/CompatChange;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;]Landroid/app/compat/PackageOverride;Landroid/app/compat/PackageOverride;]Ljava/lang/Long;Ljava/lang/Long;
 HSPLcom/android/server/compat/CompatChange;->willBeEnabled(Ljava/lang/String;)Z+]Lcom/android/server/compat/CompatChange;Lcom/android/server/compat/CompatChange;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;
-HSPLcom/android/server/compat/CompatConfig;-><init>(Lcom/android/internal/compat/AndroidBuildClassifier;Landroid/content/Context;)V
-HSPLcom/android/server/compat/CompatConfig;->create(Lcom/android/internal/compat/AndroidBuildClassifier;Landroid/content/Context;)Lcom/android/server/compat/CompatConfig;
 HSPLcom/android/server/compat/CompatConfig;->getDisabledChanges(Landroid/content/pm/ApplicationInfo;)[J+]Ljava/util/Collection;Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Landroid/util/LongArray;Landroid/util/LongArray;]Lcom/android/server/compat/CompatChange;Lcom/android/server/compat/CompatChange;]Lcom/android/internal/compat/CompatibilityChangeInfo;Lcom/android/server/compat/CompatChange;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;
 HSPLcom/android/server/compat/CompatConfig;->initConfigFromLib(Ljava/io/File;)V
-HSPLcom/android/server/compat/CompatConfig;->initOverrides()V
-HSPLcom/android/server/compat/CompatConfig;->initOverrides(Ljava/io/File;Ljava/io/File;)V
-HSPLcom/android/server/compat/CompatConfig;->invalidateCache()V
 HSPLcom/android/server/compat/CompatConfig;->isChangeEnabled(JLandroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/compat/CompatChange;Lcom/android/server/compat/CompatChange;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;
-HPLcom/android/server/compat/CompatConfig;->isDisabled(J)Z+]Lcom/android/internal/compat/CompatibilityChangeInfo;Lcom/android/server/compat/CompatChange;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;
-HSPLcom/android/server/compat/CompatConfig;->loadOverrides(Ljava/io/File;)V
-HSPLcom/android/server/compat/CompatConfig;->makeBackupFile(Ljava/io/File;)Ljava/io/File;
+HPLcom/android/server/compat/CompatConfig;->isDisabled(J)Z+]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;]Lcom/android/internal/compat/CompatibilityChangeInfo;Lcom/android/server/compat/CompatChange;
+HPLcom/android/server/compat/CompatConfig;->isLoggingOnly(J)Z+]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;]Lcom/android/internal/compat/CompatibilityChangeInfo;Lcom/android/server/compat/CompatChange;
 HPLcom/android/server/compat/CompatConfig;->maxTargetSdkForChangeIdOptIn(J)I+]Lcom/android/internal/compat/CompatibilityChangeInfo;Lcom/android/server/compat/CompatChange;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;
 HSPLcom/android/server/compat/CompatConfig;->readConfig(Ljava/io/File;)V
 HPLcom/android/server/compat/CompatConfig;->recheckOverrides(Ljava/lang/String;)V+]Ljava/util/Collection;Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Lcom/android/server/compat/CompatConfig;Lcom/android/server/compat/CompatConfig;]Lcom/android/internal/compat/CompatibilityChangeInfo;Lcom/android/server/compat/CompatChange;]Lcom/android/server/compat/CompatChange;Lcom/android/server/compat/CompatChange;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;]Lcom/android/server/compat/OverrideValidatorImpl;Lcom/android/server/compat/OverrideValidatorImpl;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;
-HPLcom/android/server/compat/CompatConfig;->removePackageOverridesWithoutSaving(Lcom/android/internal/compat/CompatibilityOverridesToRemoveConfig;Ljava/lang/String;)Z
 HSPLcom/android/server/compat/CompatConfig;->willChangeBeEnabled(JLjava/lang/String;)Z
-HSPLcom/android/server/compat/OverrideValidatorImpl;-><init>(Lcom/android/internal/compat/AndroidBuildClassifier;Landroid/content/Context;Lcom/android/server/compat/CompatConfig;)V
 HPLcom/android/server/compat/OverrideValidatorImpl;->getOverrideAllowedStateInternal(JLjava/lang/String;Z)Lcom/android/internal/compat/OverrideAllowedState;+]Lcom/android/internal/compat/AndroidBuildClassifier;Lcom/android/internal/compat/AndroidBuildClassifier;]Lcom/android/server/compat/CompatConfig;Lcom/android/server/compat/CompatConfig;
-HSPLcom/android/server/compat/PlatformCompat;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/compat/PlatformCompat;->getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabled(JLandroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;
 HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledByPackageName(JLjava/lang/String;I)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Lcom/android/server/compat/CompatConfig;Lcom/android/server/compat/CompatConfig;
 HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledByUid(JI)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;
 HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledByUidInternal(JI)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Lcom/android/server/compat/CompatConfig;Lcom/android/server/compat/CompatConfig;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
-HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledInternal(JLandroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;
+HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledInternal(JLandroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Lcom/android/server/compat/CompatConfig;Lcom/android/server/compat/CompatConfig;]Lcom/android/internal/compat/ChangeReporter;Lcom/android/internal/compat/ChangeReporter;
 HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledInternal(JLjava/lang/String;I)Z
 HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledInternalNoLogging(JLandroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/compat/CompatConfig;Lcom/android/server/compat/CompatConfig;
 HSPLcom/android/server/compat/PlatformCompat;->reportChangeInternal(JII)V+]Lcom/android/internal/compat/ChangeReporter;Lcom/android/internal/compat/ChangeReporter;
 HSPLcom/android/server/compat/PlatformCompat;->resetReporting(Landroid/content/pm/ApplicationInfo;)V
-HSPLcom/android/server/compat/PlatformCompatNative;-><init>(Lcom/android/server/compat/PlatformCompat;)V
-HSPLcom/android/server/compat/config/Change;-><init>()V
-HSPLcom/android/server/compat/config/Change;->getDescription()Ljava/lang/String;
-HSPLcom/android/server/compat/config/Change;->getDisabled()Z
 HSPLcom/android/server/compat/config/Change;->getEnableAfterTargetSdk()I
 HSPLcom/android/server/compat/config/Change;->getEnableSinceTargetSdk()I
 HSPLcom/android/server/compat/config/Change;->getId()J
-HSPLcom/android/server/compat/config/Change;->getLoggingOnly()Z
-HSPLcom/android/server/compat/config/Change;->getName()Ljava/lang/String;
 HSPLcom/android/server/compat/config/Change;->getOverridable()Z
 HSPLcom/android/server/compat/config/Change;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/compat/config/Change;
-HSPLcom/android/server/compat/config/Change;->setDescription(Ljava/lang/String;)V
 HSPLcom/android/server/compat/config/Change;->setDisabled(Z)V
 HSPLcom/android/server/compat/config/Change;->setEnableAfterTargetSdk(I)V
 HSPLcom/android/server/compat/config/Change;->setEnableSinceTargetSdk(I)V
 HSPLcom/android/server/compat/config/Change;->setId(J)V
-HSPLcom/android/server/compat/config/Change;->setLoggingOnly(Z)V
-HSPLcom/android/server/compat/config/Change;->setName(Ljava/lang/String;)V
-HSPLcom/android/server/compat/config/Change;->setOverridable(Z)V
-HSPLcom/android/server/compat/config/Change;->setValue(Ljava/lang/String;)V
-HSPLcom/android/server/compat/config/Config;-><init>()V
-HSPLcom/android/server/compat/config/Config;->getCompatChange()Ljava/util/List;
 HSPLcom/android/server/compat/config/Config;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/compat/config/Config;
 HSPLcom/android/server/compat/config/XmlParser;->read(Ljava/io/InputStream;)Lcom/android/server/compat/config/Config;
 HSPLcom/android/server/compat/config/XmlParser;->readText(Lorg/xmlpull/v1/XmlPullParser;)Ljava/lang/String;
-HSPLcom/android/server/compat/overrides/XmlWriter;->print(Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;]Lcom/android/server/compat/overrides/XmlWriter;Lcom/android/server/compat/overrides/XmlWriter;
 HPLcom/android/server/connectivity/IpConnectivityMetrics$Impl;->logEvent(Landroid/net/ConnectivityMetricsEvent;)I+]Lcom/android/server/SystemService;Lcom/android/server/connectivity/IpConnectivityMetrics;
 HPLcom/android/server/connectivity/IpConnectivityMetrics;->append(Landroid/net/ConnectivityMetricsEvent;)I+]Lcom/android/server/connectivity/IpConnectivityMetrics;Lcom/android/server/connectivity/IpConnectivityMetrics;]Lcom/android/internal/util/RingBuffer;Lcom/android/internal/util/RingBuffer;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/connectivity/IpConnectivityMetrics;->isRateLimited(Landroid/net/ConnectivityMetricsEvent;)Z
 HPLcom/android/server/connectivity/MultipathPolicyTracker$MultipathTracker;->getTemplateMatchingNetworkIdentity(Landroid/net/NetworkCapabilities;)Landroid/net/NetworkIdentity;
-HPLcom/android/server/connectivity/MultipathPolicyTracker$MultipathTracker;->getUserPolicyOpportunisticQuotaBytes()J
+HPLcom/android/server/connectivity/MultipathPolicyTracker$MultipathTracker;->getUserPolicyOpportunisticQuotaBytes()J+]Landroid/net/NetworkPolicy;Landroid/net/NetworkPolicy;]Landroid/net/NetworkPolicyManager;Landroid/net/NetworkPolicyManager;]Ljava/util/Iterator;Landroid/util/RecurrenceRule$RecurringIterator;
 HPLcom/android/server/connectivity/MultipathPolicyTracker$MultipathTracker;->updateMultipathBudget()V
-HSPLcom/android/server/connectivity/MultipathPolicyTracker;->updateAllMultipathBudgets()V
+HSPLcom/android/server/connectivity/MultipathPolicyTracker;->updateAllMultipathBudgets()V+]Lcom/android/server/connectivity/MultipathPolicyTracker$MultipathTracker;Lcom/android/server/connectivity/MultipathPolicyTracker$MultipathTracker;]Ljava/util/Collection;Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;
 HPLcom/android/server/connectivity/NetdEventListenerService$NetworkMetricsSnapshot;->collect(JLandroid/util/SparseArray;)Lcom/android/server/connectivity/NetdEventListenerService$NetworkMetricsSnapshot;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/net/metrics/NetworkMetrics;Landroid/net/metrics/NetworkMetrics;
 HPLcom/android/server/connectivity/NetdEventListenerService$TransportForNetIdNetworkCallback;->getNetworkCapabilities(I)Landroid/net/NetworkCapabilities;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/connectivity/NetdEventListenerService;->addWakeupEvent(Landroid/net/metrics/WakeupEvent;)V
@@ -3031,17 +2509,16 @@
 HPLcom/android/server/connectivity/NetdEventListenerService;->getMetricsForNetwork(JI)Landroid/net/metrics/NetworkMetrics;+]Lcom/android/server/connectivity/NetdEventListenerService;Lcom/android/server/connectivity/NetdEventListenerService;]Lcom/android/server/connectivity/NetdEventListenerService$TransportForNetIdNetworkCallback;Lcom/android/server/connectivity/NetdEventListenerService$TransportForNetIdNetworkCallback;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;
 HPLcom/android/server/connectivity/NetdEventListenerService;->onConnectEvent(IIILjava/lang/String;II)V+]Landroid/net/INetdEventCallback;Lcom/android/server/net/watchlist/NetworkWatchlistService$1;,Lcom/android/server/devicepolicy/NetworkLogger$1;]Lcom/android/server/connectivity/NetdEventListenerService;Lcom/android/server/connectivity/NetdEventListenerService;]Landroid/net/metrics/NetworkMetrics;Landroid/net/metrics/NetworkMetrics;
 HPLcom/android/server/connectivity/NetdEventListenerService;->onDnsEvent(IIIILjava/lang/String;[Ljava/lang/String;II)V+]Lcom/android/server/connectivity/NetdEventListenerService;Lcom/android/server/connectivity/NetdEventListenerService;]Landroid/net/INetdEventCallback;Lcom/android/server/net/watchlist/NetworkWatchlistService$1;,Lcom/android/server/devicepolicy/NetworkLogger$1;]Landroid/net/metrics/NetworkMetrics;Landroid/net/metrics/NetworkMetrics;
-HPLcom/android/server/connectivity/NetdEventListenerService;->onTcpSocketStatsEvent([I[I[I[I[I)V+]Lcom/android/server/connectivity/NetdEventListenerService;Lcom/android/server/connectivity/NetdEventListenerService;]Landroid/net/metrics/NetworkMetrics;Landroid/net/metrics/NetworkMetrics;
+HPLcom/android/server/connectivity/NetdEventListenerService;->onTcpSocketStatsEvent([I[I[I[I[I)V+]Landroid/net/metrics/NetworkMetrics;Landroid/net/metrics/NetworkMetrics;]Lcom/android/server/connectivity/NetdEventListenerService;Lcom/android/server/connectivity/NetdEventListenerService;
 HPLcom/android/server/connectivity/NetdEventListenerService;->onWakeupEvent(Ljava/lang/String;III[BLjava/lang/String;Ljava/lang/String;IIJ)V
 HSPLcom/android/server/content/ContentService$ObserverCollector$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/content/ContentService$ObserverCollector$Key;Ljava/util/List;)V
 HSPLcom/android/server/content/ContentService$ObserverCollector$$ExternalSyntheticLambda0;->run()V
 HSPLcom/android/server/content/ContentService$ObserverCollector$Key;-><init>(Landroid/database/IContentObserver;IZII)V
 HSPLcom/android/server/content/ContentService$ObserverCollector$Key;->hashCode()I
 HSPLcom/android/server/content/ContentService$ObserverCollector;-><init>()V
-HSPLcom/android/server/content/ContentService$ObserverCollector;->collect(Landroid/database/IContentObserver;IZLandroid/net/Uri;II)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/content/ContentService$ObserverCollector;->collect(Landroid/database/IContentObserver;IZLandroid/net/Uri;II)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/content/ContentService$ObserverCollector;->dispatch()V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Ljava/lang/Runnable;Lcom/android/server/content/ContentService$ObserverCollector$$ExternalSyntheticLambda0;
 HSPLcom/android/server/content/ContentService$ObserverCollector;->lambda$dispatch$0(Lcom/android/server/content/ContentService$ObserverCollector$Key;Ljava/util/List;)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/database/IContentObserver;Landroid/database/ContentObserver$Transport;,Landroid/database/IContentObserver$Stub$Proxy;
-HSPLcom/android/server/content/ContentService$ObserverNode$ObserverEntry;->-$$Nest$fgetuserHandle(Lcom/android/server/content/ContentService$ObserverNode$ObserverEntry;)I
 HSPLcom/android/server/content/ContentService$ObserverNode$ObserverEntry;-><init>(Lcom/android/server/content/ContentService$ObserverNode;Landroid/database/IContentObserver;ZLjava/lang/Object;IIILandroid/net/Uri;)V+]Lcom/android/internal/os/BinderDeathDispatcher;Lcom/android/internal/os/BinderDeathDispatcher;
 HPLcom/android/server/content/ContentService$ObserverNode$ObserverEntry;->binderDied()V
 HSPLcom/android/server/content/ContentService$ObserverNode;-><init>(Ljava/lang/String;)V
@@ -3050,21 +2527,22 @@
 HSPLcom/android/server/content/ContentService$ObserverNode;->collectMyObserversLocked(Landroid/net/Uri;ZLandroid/database/IContentObserver;ZIILcom/android/server/content/ContentService$ObserverCollector;)V+]Lcom/android/server/content/ContentService$ObserverCollector;Lcom/android/server/content/ContentService$ObserverCollector;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/database/IContentObserver;Landroid/database/ContentObserver$Transport;,Landroid/database/IContentObserver$Stub$Proxy;
 HSPLcom/android/server/content/ContentService$ObserverNode;->collectObserversLocked(Landroid/net/Uri;IILandroid/database/IContentObserver;ZIILcom/android/server/content/ContentService$ObserverCollector;)V+]Lcom/android/server/content/ContentService$ObserverNode;Lcom/android/server/content/ContentService$ObserverNode;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/content/ContentService$ObserverNode;->countUriSegments(Landroid/net/Uri;)I+]Ljava/util/List;Landroid/net/Uri$PathSegments;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;
-HSPLcom/android/server/content/ContentService$ObserverNode;->getUriSegment(Landroid/net/Uri;I)Ljava/lang/String;
+HSPLcom/android/server/content/ContentService$ObserverNode;->getUriSegment(Landroid/net/Uri;I)Ljava/lang/String;+]Ljava/util/List;Landroid/net/Uri$PathSegments;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;
 HSPLcom/android/server/content/ContentService$ObserverNode;->removeObserverLocked(Landroid/database/IContentObserver;)Z+]Lcom/android/server/content/ContentService$ObserverNode;Lcom/android/server/content/ContentService$ObserverNode;]Lcom/android/internal/os/BinderDeathDispatcher;Lcom/android/internal/os/BinderDeathDispatcher;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/database/IContentObserver;Landroid/database/ContentObserver$Transport;,Landroid/database/IContentObserver$Stub$Proxy;
 HSPLcom/android/server/content/ContentService;->-$$Nest$sfgetsObserverDeathDispatcher()Lcom/android/internal/os/BinderDeathDispatcher;
-HSPLcom/android/server/content/ContentService;->enforceCrossUserPermission(ILjava/lang/String;)V
+HPLcom/android/server/content/ContentService;->addPeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V
+HSPLcom/android/server/content/ContentService;->enforceCrossUserPermission(ILjava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/content/ContentService;->getIsSyncableAsUser(Landroid/accounts/Account;Ljava/lang/String;I)I
-HPLcom/android/server/content/ContentService;->getMasterSyncAutomaticallyAsUser(I)Z
+HPLcom/android/server/content/ContentService;->getMasterSyncAutomaticallyAsUser(I)Z+]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/content/ContentService;->getProviderPackageName(Landroid/net/Uri;I)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;
 HPLcom/android/server/content/ContentService;->getSyncAdapterPackageAsUser(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
-HSPLcom/android/server/content/ContentService;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;I)[Ljava/lang/String;
-HPLcom/android/server/content/ContentService;->getSyncAutomaticallyAsUser(Landroid/accounts/Account;Ljava/lang/String;I)Z
+HSPLcom/android/server/content/ContentService;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;I)[Ljava/lang/String;+]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;
+HPLcom/android/server/content/ContentService;->getSyncAutomaticallyAsUser(Landroid/accounts/Account;Ljava/lang/String;I)Z+]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/content/ContentService;->getSyncExemptionAndCleanUpExtrasForCaller(ILandroid/os/Bundle;)I+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/content/ContentService;Lcom/android/server/content/ContentService;
 HSPLcom/android/server/content/ContentService;->getSyncExemptionForCaller(I)I+]Lcom/android/server/content/ContentService;Lcom/android/server/content/ContentService;
 HSPLcom/android/server/content/ContentService;->getSyncManager()Lcom/android/server/content/SyncManager;
 HSPLcom/android/server/content/ContentService;->handleIncomingUser(Landroid/net/Uri;IIIZI)I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/content/ContentService;Lcom/android/server/content/ContentService;
-HPLcom/android/server/content/ContentService;->hasAccountAccess(ZLandroid/accounts/Account;I)Z
+HPLcom/android/server/content/ContentService;->hasAccountAccess(ZLandroid/accounts/Account;I)Z+]Landroid/accounts/AccountManagerInternal;Lcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;
 HPLcom/android/server/content/ContentService;->hasAuthorityAccess(Ljava/lang/String;II)Z
 HSPLcom/android/server/content/ContentService;->invalidateCacheLocked(ILjava/lang/String;Landroid/net/Uri;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/String;Ljava/lang/String;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;
 HSPLcom/android/server/content/ContentService;->notifyChange([Landroid/net/Uri;Landroid/database/IContentObserver;ZIIILjava/lang/String;)V+]Lcom/android/server/content/ContentService$ObserverNode;Lcom/android/server/content/ContentService$ObserverNode;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/content/ContentService$ObserverCollector;Lcom/android/server/content/ContentService$ObserverCollector;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/content/ContentService;Lcom/android/server/content/ContentService;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;
@@ -3078,11 +2556,12 @@
 HSPLcom/android/server/content/SyncLogger$RotatingFileLogger$MyHandler;->log(J[Ljava/lang/Object;)V+]Landroid/os/Handler;Lcom/android/server/content/SyncLogger$RotatingFileLogger$MyHandler;]Landroid/os/Message;Landroid/os/Message;
 HSPLcom/android/server/content/SyncLogger$RotatingFileLogger;->log([Ljava/lang/Object;)V+]Lcom/android/server/content/SyncLogger$RotatingFileLogger$MyHandler;Lcom/android/server/content/SyncLogger$RotatingFileLogger$MyHandler;
 HSPLcom/android/server/content/SyncLogger$RotatingFileLogger;->logInner(J[Ljava/lang/Object;)V+]Ljava/util/Date;Ljava/util/Date;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/text/SimpleDateFormat;Ljava/text/SimpleDateFormat;]Lcom/android/server/content/SyncLogger$RotatingFileLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;]Ljava/io/Writer;Ljava/io/FileWriter;
-HSPLcom/android/server/content/SyncLogger$RotatingFileLogger;->openLogLocked(J)V+]Ljava/util/Date;Ljava/util/Date;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/io/File;Ljava/io/File;]Ljava/text/SimpleDateFormat;Ljava/text/SimpleDateFormat;]Lcom/android/server/content/SyncLogger$RotatingFileLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;
+HSPLcom/android/server/content/SyncLogger$RotatingFileLogger;->openLogLocked(J)V+]Ljava/util/Date;Ljava/util/Date;]Ljava/io/File;Ljava/io/File;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/text/SimpleDateFormat;Ljava/text/SimpleDateFormat;]Lcom/android/server/content/SyncLogger$RotatingFileLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;
 HPLcom/android/server/content/SyncManager$ActiveSyncContext;-><init>(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncOperation;JI)V
 HPLcom/android/server/content/SyncManager$ActiveSyncContext;->bindToSyncAdapter(Landroid/content/ComponentName;I)Z
 HPLcom/android/server/content/SyncManager$ActiveSyncContext;->close()V
 HPLcom/android/server/content/SyncManager$ActiveSyncContext;->onFinished(Landroid/content/SyncResult;)V
+HPLcom/android/server/content/SyncManager$ActiveSyncContext;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
 HPLcom/android/server/content/SyncManager$ActiveSyncContext;->toString(Ljava/lang/StringBuilder;Z)V
 HPLcom/android/server/content/SyncManager$SyncHandler;->closeActiveSyncContext(Lcom/android/server/content/SyncManager$ActiveSyncContext;)V
 HPLcom/android/server/content/SyncManager$SyncHandler;->computeSyncOpState(Lcom/android/server/content/SyncOperation;)I
@@ -3091,27 +2570,30 @@
 HPLcom/android/server/content/SyncManager$SyncHandler;->handleSyncMessage(Landroid/os/Message;)V
 HPLcom/android/server/content/SyncManager$SyncHandler;->runBoundToAdapterH(Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/os/IBinder;)V
 HPLcom/android/server/content/SyncManager$SyncHandler;->runSyncFinishedOrCanceledH(Landroid/content/SyncResult;Lcom/android/server/content/SyncManager$ActiveSyncContext;)V
-HPLcom/android/server/content/SyncManager$SyncHandler;->startSyncH(Lcom/android/server/content/SyncOperation;)V
+HPLcom/android/server/content/SyncManager$SyncHandler;->startSyncH(Lcom/android/server/content/SyncOperation;)V+]Lcom/android/server/content/SyncOperation;Lcom/android/server/content/SyncOperation;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HPLcom/android/server/content/SyncManager$SyncHandler;->stopSyncEvent(JLcom/android/server/content/SyncOperation;Ljava/lang/String;IIJ)V
+HPLcom/android/server/content/SyncManager$SyncHandler;->updateOrAddPeriodicSyncH(Lcom/android/server/content/SyncStorageEngine$EndPoint;JJLandroid/os/Bundle;)V+]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache;]Landroid/content/SyncAdapterType;Landroid/content/SyncAdapterType;]Lcom/android/server/content/SyncStorageEngine$EndPoint;Lcom/android/server/content/SyncStorageEngine$EndPoint;]Lcom/android/server/content/SyncOperation;Lcom/android/server/content/SyncOperation;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/content/SyncLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;
 HPLcom/android/server/content/SyncManager$SyncTimeTracker;->update()V
 HPLcom/android/server/content/SyncManager;->-$$Nest$fgetmSyncManagerWakeLock(Lcom/android/server/content/SyncManager;)Landroid/os/PowerManager$WakeLock;
-HPLcom/android/server/content/SyncManager;->computeSyncable(Landroid/accounts/Account;ILjava/lang/String;ZZ)I
+HPLcom/android/server/content/SyncManager;->computeSyncable(Landroid/accounts/Account;ILjava/lang/String;ZZ)I+]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
 HPLcom/android/server/content/SyncManager;->formatDurationHMS(Ljava/lang/StringBuilder;J)Ljava/lang/StringBuilder;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/content/SyncManager;->getAdapterBindIntent(Landroid/content/Context;Landroid/content/ComponentName;I)Landroid/content/Intent;
 HPLcom/android/server/content/SyncManager;->getAllPendingSyncs()Ljava/util/List;+]Landroid/app/job/JobScheduler;Landroid/app/JobSchedulerImpl;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Ljava/util/List;Ljava/util/ArrayList;
-HPLcom/android/server/content/SyncManager;->getIsSyncable(Landroid/accounts/Account;ILjava/lang/String;)I
+HPLcom/android/server/content/SyncManager;->getIsSyncable(Landroid/accounts/Account;ILjava/lang/String;)I+]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager;
 HPLcom/android/server/content/SyncManager;->getSyncAdapterPackageAsUser(Ljava/lang/String;Ljava/lang/String;II)Ljava/lang/String;
-HSPLcom/android/server/content/SyncManager;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;II)[Ljava/lang/String;+]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HPLcom/android/server/content/SyncManager;->isContactSharingAllowedForCloneProfile()Z
+HSPLcom/android/server/content/SyncManager;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;II)[Ljava/lang/String;+]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/util/List;Ljava/util/ArrayList;
+HPLcom/android/server/content/SyncManager;->isContactSharingAllowedForCloneProfile()Z+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/internal/config/appcloning/AppCloningDeviceConfigHelper;Lcom/android/internal/config/appcloning/AppCloningDeviceConfigHelper;
+HPLcom/android/server/content/SyncManager;->isJobIdInUseLockedH(ILjava/util/List;)Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/content/SyncManager;->postMonitorSyncProgressMessage(Lcom/android/server/content/SyncManager$ActiveSyncContext;)V
-HPLcom/android/server/content/SyncManager;->rescheduleSyncs(Lcom/android/server/content/SyncStorageEngine$EndPoint;Ljava/lang/String;)V+]Lcom/android/server/content/SyncStorageEngine$EndPoint;Lcom/android/server/content/SyncStorageEngine$EndPoint;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/content/SyncLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HPLcom/android/server/content/SyncManager;->rescheduleSyncs(Lcom/android/server/content/SyncStorageEngine$EndPoint;Ljava/lang/String;)V+]Lcom/android/server/content/SyncStorageEngine$EndPoint;Lcom/android/server/content/SyncStorageEngine$EndPoint;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/content/SyncLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;
 HSPLcom/android/server/content/SyncManager;->scheduleLocalSync(Landroid/accounts/Account;IILjava/lang/String;IIILjava/lang/String;)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;
-HSPLcom/android/server/content/SyncManager;->scheduleSync(Landroid/accounts/Account;IILjava/lang/String;Landroid/os/Bundle;IJZIIILjava/lang/String;)V+]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache;]Landroid/content/SyncAdapterType;Landroid/content/SyncAdapterType;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Lcom/android/server/content/SyncLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;]Ljava/util/HashSet;Ljava/util/HashSet;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/util/Iterator;Ljava/util/HashMap$KeyIterator;,Ljava/util/Collections$UnmodifiableCollection$1;
-HPLcom/android/server/content/SyncManager;->scheduleSyncOperationH(Lcom/android/server/content/SyncOperation;J)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/content/SyncOperation;Lcom/android/server/content/SyncOperation;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Landroid/app/job/JobInfo$Builder;Landroid/app/job/JobInfo$Builder;]Lcom/android/server/content/SyncManagerConstants;Lcom/android/server/content/SyncManagerConstants;]Landroid/app/job/JobScheduler;Landroid/app/JobSchedulerImpl;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;
+HSPLcom/android/server/content/SyncManager;->scheduleSync(Landroid/accounts/Account;IILjava/lang/String;Landroid/os/Bundle;IJZIIILjava/lang/String;)V+]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache;]Landroid/content/SyncAdapterType;Landroid/content/SyncAdapterType;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Lcom/android/server/content/SyncLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;]Ljava/util/HashSet;Ljava/util/HashSet;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/util/Iterator;Ljava/util/HashMap$KeyIterator;,Ljava/util/Collections$UnmodifiableCollection$1;]Landroid/accounts/AccountManagerInternal;Lcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;
+HPLcom/android/server/content/SyncManager;->scheduleSyncOperationH(Lcom/android/server/content/SyncOperation;J)V+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/content/SyncOperation;Lcom/android/server/content/SyncOperation;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Landroid/app/job/JobInfo$Builder;Landroid/app/job/JobInfo$Builder;]Lcom/android/server/content/SyncManagerConstants;Lcom/android/server/content/SyncManagerConstants;]Landroid/app/job/JobScheduler;Landroid/app/JobSchedulerImpl;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/content/SyncManager;->sendSyncFinishedOrCanceledMessage(Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/content/SyncResult;)V
 HPLcom/android/server/content/SyncManager;->setAuthorityPendingState(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V+]Lcom/android/server/content/SyncStorageEngine$EndPoint;Lcom/android/server/content/SyncStorageEngine$EndPoint;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/content/SyncManager;->setDelayUntilTime(Lcom/android/server/content/SyncStorageEngine$EndPoint;J)V
 HPLcom/android/server/content/SyncOperation;-><init>(Lcom/android/server/content/SyncStorageEngine$EndPoint;ILjava/lang/String;IILandroid/os/Bundle;ZZIJJI)V+]Lcom/android/server/content/SyncOperation;Lcom/android/server/content/SyncOperation;
-HPLcom/android/server/content/SyncOperation;->dump(Landroid/content/pm/PackageManager;ZLcom/android/server/content/SyncAdapterStateFetcher;Z)Ljava/lang/String;
+HPLcom/android/server/content/SyncOperation;->dump(Landroid/content/pm/PackageManager;ZLcom/android/server/content/SyncAdapterStateFetcher;Z)Ljava/lang/String;+]Lcom/android/server/content/SyncAdapterStateFetcher;Lcom/android/server/content/SyncAdapterStateFetcher;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;
 HPLcom/android/server/content/SyncOperation;->extrasToStringBuilder(Landroid/os/Bundle;Ljava/lang/StringBuilder;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;
 HPLcom/android/server/content/SyncOperation;->maybeCreateFromJobExtras(Landroid/os/PersistableBundle;)Lcom/android/server/content/SyncOperation;+]Ljava/lang/String;Ljava/lang/String;]Landroid/os/PersistableBundle;Landroid/os/PersistableBundle;]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;
 HPLcom/android/server/content/SyncOperation;->toEventLog(I)[Ljava/lang/Object;
@@ -3119,42 +2601,42 @@
 HPLcom/android/server/content/SyncOperation;->toKey()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/content/SyncOperation;->wakeLockName()Ljava/lang/String;
 HSPLcom/android/server/content/SyncStorageEngine$EndPoint;-><init>(Landroid/accounts/Account;Ljava/lang/String;I)V
-HPLcom/android/server/content/SyncStorageEngine$EndPoint;->matchesSpec(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Z+]Ljava/lang/Object;Ljava/lang/String;]Landroid/accounts/Account;Landroid/accounts/Account;
+HPLcom/android/server/content/SyncStorageEngine$EndPoint;->matchesSpec(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Z+]Landroid/accounts/Account;Landroid/accounts/Account;]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/content/SyncStorageEngine$EndPoint;->toString()Ljava/lang/String;
 HPLcom/android/server/content/SyncStorageEngine;->addActiveSync(Lcom/android/server/content/SyncManager$ActiveSyncContext;)Landroid/content/SyncInfo;
 HPLcom/android/server/content/SyncStorageEngine;->getAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;Ljava/lang/String;)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;+]Ljava/util/HashMap;Ljava/util/HashMap;
 HPLcom/android/server/content/SyncStorageEngine;->getBackoff(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Landroid/util/Pair;
+HPLcom/android/server/content/SyncStorageEngine;->getCurrentDayLocked()I
+HPLcom/android/server/content/SyncStorageEngine;->getDelayUntilTime(Lcom/android/server/content/SyncStorageEngine$EndPoint;)J
 HPLcom/android/server/content/SyncStorageEngine;->getIsSyncable(Landroid/accounts/Account;ILjava/lang/String;)I
-HPLcom/android/server/content/SyncStorageEngine;->getMasterSyncAutomatically(I)Z
+HPLcom/android/server/content/SyncStorageEngine;->getMasterSyncAutomatically(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/content/SyncStorageEngine;->getOrCreateAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;IZ)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
 HPLcom/android/server/content/SyncStorageEngine;->getSyncAutomatically(Landroid/accounts/Account;ILjava/lang/String;)Z
 HPLcom/android/server/content/SyncStorageEngine;->insertStartSyncEvent(Lcom/android/server/content/SyncOperation;J)J
+HPLcom/android/server/content/SyncStorageEngine;->markPending(Lcom/android/server/content/SyncStorageEngine$EndPoint;Z)V
 HPLcom/android/server/content/SyncStorageEngine;->reportChange(ILcom/android/server/content/SyncStorageEngine$EndPoint;)V
-HPLcom/android/server/content/SyncStorageEngine;->reportChange(ILjava/lang/String;I)V+]Landroid/content/ISyncStatusObserver;Landroid/content/ISyncStatusObserver$Stub$Proxy;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HPLcom/android/server/content/SyncStorageEngine;->reportChange(ILjava/lang/String;I)V+]Landroid/content/ISyncStatusObserver;Landroid/content/ISyncStatusObserver$Stub$Proxy;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/content/SyncStorageEngine;->stopSyncEvent(JJLjava/lang/String;JJLjava/lang/String;I)V+]Landroid/content/SyncStatusInfo;Landroid/content/SyncStatusInfo;]Landroid/os/Handler;Lcom/android/server/content/SyncStorageEngine$MyHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/content/SyncStorageEngine;->writeStatusInfoLocked(Ljava/io/OutputStream;)V+]Landroid/content/SyncStatusInfo;Landroid/content/SyncStatusInfo;]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/content/SyncStorageEngine;->writeStatusStatsLocked(Landroid/util/proto/ProtoOutputStream;Landroid/content/SyncStatusInfo$Stats;)V+]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;
-HSPLcom/android/server/contentcapture/ContentCaptureManagerService$ContentCaptureManagerServiceStub;->registerContentCaptureOptionsCallback(Ljava/lang/String;Landroid/view/contentcapture/IContentCaptureOptionsCallback;)V
+HSPLcom/android/server/contentcapture/ContentCaptureManagerService$ContentCaptureManagerServiceStub;->registerContentCaptureOptionsCallback(Ljava/lang/String;Landroid/view/contentcapture/IContentCaptureOptionsCallback;)V+]Landroid/view/contentcapture/IContentCaptureOptionsCallback;Landroid/view/contentcapture/IContentCaptureOptionsCallback$Stub$Proxy;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Lcom/android/server/contentcapture/ContentCaptureManagerService;Lcom/android/server/contentcapture/ContentCaptureManagerService;
 HPLcom/android/server/contentcapture/ContentCaptureManagerService$ContentCaptureManagerServiceStub;->shareData(Landroid/view/contentcapture/DataShareRequest;Landroid/view/contentcapture/IDataShareWriteAdapter;)V
 HPLcom/android/server/contentcapture/ContentCaptureManagerService$DataShareCallbackDelegate;->accept(Landroid/service/contentcapture/IDataShareReadAdapter;)V
 HPLcom/android/server/contentcapture/ContentCaptureManagerService$DataShareCallbackDelegate;->enforceDataSharingTtl(Landroid/os/ParcelFileDescriptor;Landroid/os/ParcelFileDescriptor;Landroid/os/ParcelFileDescriptor;Landroid/os/ParcelFileDescriptor;Landroid/service/contentcapture/IDataShareReadAdapter;)V
 HPLcom/android/server/contentcapture/ContentCaptureManagerService$DataShareCallbackDelegate;->lambda$accept$0(Landroid/os/ParcelFileDescriptor;Landroid/os/ParcelFileDescriptor;Landroid/service/contentcapture/IDataShareReadAdapter;)V+]Landroid/service/contentcapture/IDataShareReadAdapter;Landroid/service/contentcapture/IDataShareReadAdapter$Stub$Proxy;]Lcom/android/server/contentcapture/ContentCaptureManagerService$DataShareCallbackDelegate;Lcom/android/server/contentcapture/ContentCaptureManagerService$DataShareCallbackDelegate;]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;]Landroid/view/contentcapture/IDataShareWriteAdapter;Landroid/view/contentcapture/IDataShareWriteAdapter$Stub$Proxy;]Ljava/io/InputStream;Landroid/os/ParcelFileDescriptor$AutoCloseInputStream;]Landroid/view/contentcapture/DataShareRequest;Landroid/view/contentcapture/DataShareRequest;]Ljava/io/OutputStream;Landroid/os/ParcelFileDescriptor$AutoCloseOutputStream;]Ljava/util/Set;Ljava/util/HashSet;
-HSPLcom/android/server/contentcapture/ContentCaptureManagerService$GlobalContentCaptureOptions;->getOptions(ILjava/lang/String;)Landroid/content/ContentCaptureOptions;
-HSPLcom/android/server/contentcapture/ContentCaptureManagerService$GlobalContentCaptureOptions;->isContentProtectionReceiverEnabled(ILjava/lang/String;)Z
-HPLcom/android/server/contentcapture/ContentCaptureManagerService$LocalService;->notifyActivityEvent(ILandroid/content/ComponentName;ILandroid/app/assist/ActivityId;)V
-HSPLcom/android/server/contentcapture/ContentCaptureManagerService;->isContentProtectionEnabledLocked()Z
+HSPLcom/android/server/contentcapture/ContentCaptureManagerService$GlobalContentCaptureOptions;->getOptions(ILjava/lang/String;)Landroid/content/ContentCaptureOptions;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/contentcapture/ContentCaptureManagerService$GlobalContentCaptureOptions;->isContentProtectionReceiverEnabled(ILjava/lang/String;)Z+]Lcom/android/server/contentprotection/ContentProtectionConsentManager;Lcom/android/server/contentprotection/ContentProtectionConsentManager;]Lcom/android/server/contentprotection/ContentProtectionAllowlistManager;Lcom/android/server/contentprotection/ContentProtectionAllowlistManager;
+HSPLcom/android/server/contentcapture/ContentCaptureManagerService$LocalService;->getOptionsForPackage(ILjava/lang/String;)Landroid/content/ContentCaptureOptions;
+HSPLcom/android/server/contentcapture/ContentCaptureManagerService$LocalService;->notifyActivityEvent(ILandroid/content/ComponentName;ILandroid/app/assist/ActivityId;)V
+HSPLcom/android/server/contentcapture/ContentCaptureManagerService;->isContentProtectionEnabledLocked()Z+]Ljava/util/List;Ljava/util/ImmutableCollections$ListN;
 HPLcom/android/server/contentcapture/ContentCaptureMetricsLogger;->writeSessionFlush(ILandroid/content/ComponentName;Landroid/service/contentcapture/FlushMetrics;Landroid/content/ContentCaptureOptions;I)V
 HPLcom/android/server/contentcapture/ContentCapturePerUserService$ContentCaptureServiceRemoteCallback;->setContentCaptureWhitelist(Ljava/util/List;Ljava/util/List;)V
 HPLcom/android/server/contentcapture/ContentCapturePerUserService$ContentCaptureServiceRemoteCallback;->updateContentCaptureOptions(Landroid/util/ArraySet;)V
 HPLcom/android/server/contentcapture/ContentCapturePerUserService$ContentCaptureServiceRemoteCallback;->writeSessionFlush(ILandroid/content/ComponentName;Landroid/service/contentcapture/FlushMetrics;Landroid/content/ContentCaptureOptions;I)V+]Lcom/android/server/infra/AbstractPerUserSystemService;Lcom/android/server/contentcapture/ContentCapturePerUserService;
 HPLcom/android/server/contentcapture/ContentCapturePerUserService;->onActivityEventLocked(Landroid/app/assist/ActivityId;Landroid/content/ComponentName;I)V
-HPLcom/android/server/contentcapture/ContentCapturePerUserService;->startSessionLocked(Landroid/os/IBinder;Landroid/os/IBinder;Landroid/content/pm/ActivityPresentationInfo;IIILcom/android/internal/os/IResultReceiver;)V
-HPLcom/android/server/contentcapture/RemoteContentCaptureService;->onActivityLifecycleEvent(Landroid/service/contentcapture/ActivityEvent;)V
 HSPLcom/android/server/contentprotection/ContentProtectionConsentManager;->isConsentGranted(I)Z
-HSPLcom/android/server/contentprotection/ContentProtectionConsentManager;->isUserOrganizationManaged(I)Z
 HSPLcom/android/server/cpu/CpuAvailabilityInfo;-><init>(IJIIJ)V
 HSPLcom/android/server/cpu/CpuInfoReader$CpuInfo;-><init>(IIZJJJJLcom/android/server/cpu/CpuInfoReader$CpuUsageStats;)V
-HSPLcom/android/server/cpu/CpuInfoReader$CpuInfo;-><init>(IIZJJJLcom/android/server/cpu/CpuInfoReader$CpuUsageStats;)V
 HSPLcom/android/server/cpu/CpuInfoReader$CpuInfo;->computeNormalizedAvailableCpuFreqKHz()J+]Lcom/android/server/cpu/CpuInfoReader$CpuUsageStats;Lcom/android/server/cpu/CpuInfoReader$CpuUsageStats;
 HSPLcom/android/server/cpu/CpuInfoReader$CpuUsageStats;-><init>(JJJJJJJJJJ)V
 HPLcom/android/server/cpu/CpuInfoReader$CpuUsageStats;->delta(Lcom/android/server/cpu/CpuInfoReader$CpuUsageStats;)Lcom/android/server/cpu/CpuInfoReader$CpuUsageStats;
@@ -3163,36 +2645,21 @@
 HSPLcom/android/server/cpu/CpuInfoReader;->calculateAvgCpuFreq(Landroid/util/LongSparseLongArray;)J+]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;
 HPLcom/android/server/cpu/CpuInfoReader;->calculateDeltaTimeInState(Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;)Landroid/util/LongSparseLongArray;+]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;
 HSPLcom/android/server/cpu/CpuInfoReader;->clockTickStrToMillis(Ljava/lang/String;)J
-HSPLcom/android/server/cpu/CpuInfoReader;->readAvgTimeInStateCpuFrequency(ILjava/io/File;)J
-HSPLcom/android/server/cpu/CpuInfoReader;->readCpuCores(Ljava/io/File;)Landroid/util/IntArray;+]Ljava/lang/String;Ljava/lang/String;]Ljava/io/File;Ljava/io/File;]Landroid/util/IntArray;Landroid/util/IntArray;]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/cpu/CpuInfoReader;->readAvgTimeInStateCpuFrequency(ILjava/io/File;)J+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;
+HSPLcom/android/server/cpu/CpuInfoReader;->readCpuCores(Ljava/io/File;)Landroid/util/IntArray;+]Ljava/io/File;Ljava/io/File;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/lang/String;Ljava/lang/String;]Landroid/util/IntArray;Landroid/util/IntArray;
 HSPLcom/android/server/cpu/CpuInfoReader;->readCpuInfos()Landroid/util/SparseArray;+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/cpu/CpuInfoReader;Lcom/android/server/cpu/CpuInfoReader;
 HSPLcom/android/server/cpu/CpuInfoReader;->readCumulativeCpuUsageStats()Landroid/util/SparseArray;+]Ljava/lang/String;Ljava/lang/String;]Ljava/io/File;Ljava/io/File;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;]Ljava/util/regex/Pattern;Ljava/util/regex/Pattern;
 HSPLcom/android/server/cpu/CpuInfoReader;->readDynamicPolicyInfo()Landroid/util/SparseArray;+]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/cpu/CpuInfoReader;Lcom/android/server/cpu/CpuInfoReader;
 HSPLcom/android/server/cpu/CpuInfoReader;->readLatestCpuUsageStats()Landroid/util/SparseArray;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/cpu/CpuInfoReader;Lcom/android/server/cpu/CpuInfoReader;]Lcom/android/server/cpu/CpuInfoReader$CpuUsageStats;Lcom/android/server/cpu/CpuInfoReader$CpuUsageStats;
 HSPLcom/android/server/cpu/CpuInfoReader;->readTimeInState(Ljava/io/File;)Landroid/util/LongSparseLongArray;+]Ljava/lang/String;Ljava/lang/String;]Ljava/io/File;Ljava/io/File;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/regex/Pattern;Ljava/util/regex/Pattern;]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;
 HSPLcom/android/server/cpu/CpuMonitorService$CpusetInfo$Snapshot;->appendCpuInfo(Lcom/android/server/cpu/CpuInfoReader$CpuInfo;)V+]Lcom/android/server/cpu/CpuInfoReader$CpuInfo;Lcom/android/server/cpu/CpuInfoReader$CpuInfo;
-HSPLcom/android/server/cpu/CpuMonitorService$CpusetInfo;->appendCpuInfo(JLcom/android/server/cpu/CpuInfoReader$CpuInfo;)V+]Lcom/android/server/cpu/CpuMonitorService$CpusetInfo$Snapshot;Lcom/android/server/cpu/CpuMonitorService$CpusetInfo$Snapshot;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
+HSPLcom/android/server/cpu/CpuMonitorService$CpusetInfo;->appendCpuInfo(JLcom/android/server/cpu/CpuInfoReader$CpuInfo;)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/cpu/CpuMonitorService$CpusetInfo$Snapshot;Lcom/android/server/cpu/CpuMonitorService$CpusetInfo$Snapshot;
 HSPLcom/android/server/cpu/CpuMonitorService$CpusetInfo;->getCumulativeAvgAvailabilityPercent(J)I+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
 HSPLcom/android/server/cpu/CpuMonitorService;->monitorCpuStats()V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/cpu/CpuMonitorService;Lcom/android/server/cpu/CpuMonitorService;]Lcom/android/server/cpu/CpuMonitorService$CpusetInfo;Lcom/android/server/cpu/CpuMonitorService$CpusetInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/cpu/CpuInfoReader;Lcom/android/server/cpu/CpuInfoReader;
-HSPLcom/android/server/criticalevents/CriticalEventLog$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/criticalevents/CriticalEventLog;)V
-HSPLcom/android/server/criticalevents/CriticalEventLog$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/criticalevents/CriticalEventLog;Lcom/android/server/criticalevents/CriticalEventLog$ILogLoader;)V
-HSPLcom/android/server/criticalevents/CriticalEventLog$$ExternalSyntheticLambda1;->run()V
-HSPLcom/android/server/criticalevents/CriticalEventLog$LogLoader;-><init>()V
-HSPLcom/android/server/criticalevents/CriticalEventLog$LogLoader;->load(Ljava/io/File;Lcom/android/server/criticalevents/CriticalEventLog$ThreadSafeRingBuffer;)V
-HSPLcom/android/server/criticalevents/CriticalEventLog$LogLoader;->loadLogFromFile(Ljava/io/File;)Lcom/android/server/criticalevents/nano/CriticalEventLogStorageProto;
-HSPLcom/android/server/criticalevents/CriticalEventLog$ThreadSafeRingBuffer;-><init>(Ljava/lang/Class;I)V
-HSPLcom/android/server/criticalevents/CriticalEventLog$ThreadSafeRingBuffer;->append(Ljava/lang/Object;)V
-HSPLcom/android/server/criticalevents/CriticalEventLog;->$r8$lambda$lY5bRq3e1qTEzCvfI4SPBg_RsKI(Lcom/android/server/criticalevents/CriticalEventLog;Lcom/android/server/criticalevents/CriticalEventLog$ILogLoader;)V
-HSPLcom/android/server/criticalevents/CriticalEventLog;-><clinit>()V
-HSPLcom/android/server/criticalevents/CriticalEventLog;-><init>()V
-HSPLcom/android/server/criticalevents/CriticalEventLog;-><init>(Ljava/lang/String;IIJZLcom/android/server/criticalevents/CriticalEventLog$ILogLoader;)V
-HSPLcom/android/server/criticalevents/CriticalEventLog;->getInstance()Lcom/android/server/criticalevents/CriticalEventLog;
-HSPLcom/android/server/criticalevents/CriticalEventLog;->init()V
-HSPLcom/android/server/criticalevents/CriticalEventLog;->lambda$new$0(Lcom/android/server/criticalevents/CriticalEventLog$ILogLoader;)V
 HSPLcom/android/server/devicepolicy/ActiveAdmin;->getParentActiveAdmin()Lcom/android/server/devicepolicy/ActiveAdmin;
 HPLcom/android/server/devicepolicy/ActiveAdmin;->getUid()I
 HSPLcom/android/server/devicepolicy/ActiveAdmin;->getUserHandle()Landroid/os/UserHandle;
-HPLcom/android/server/devicepolicy/ActiveAdmin;->writeAttributeValuesToXml(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/lang/String;Ljava/lang/String;Ljava/util/Collection;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/Collection;Landroid/util/ArraySet;,Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr;,Ljava/util/Collections$EmptyIterator;
+HPLcom/android/server/devicepolicy/ActiveAdmin;->writeAttributeValuesToXml(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/lang/String;Ljava/lang/String;Ljava/util/Collection;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/Collection;Landroid/util/ArraySet;,Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr;
 HPLcom/android/server/devicepolicy/ActiveAdmin;->writeToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V
 HPLcom/android/server/devicepolicy/BooleanPolicySerializer;->saveToXml(Landroid/app/admin/PolicyKey;Lcom/android/modules/utils/TypedXmlSerializer;Ljava/lang/Boolean;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/lang/Boolean;Ljava/lang/Boolean;
 HSPLcom/android/server/devicepolicy/CallerIdentity;-><init>(ILjava/lang/String;Landroid/content/ComponentName;)V
@@ -3202,118 +2669,124 @@
 HSPLcom/android/server/devicepolicy/CallerIdentity;->getUserId()I
 HSPLcom/android/server/devicepolicy/CallerIdentity;->hasAdminComponent()Z
 HPLcom/android/server/devicepolicy/CallerIdentity;->toString()Ljava/lang/String;
-HSPLcom/android/server/devicepolicy/DeviceManagementResourcesProvider;->getString(Ljava/lang/String;)Landroid/app/admin/ParcelableResource;
-HSPLcom/android/server/devicepolicy/DevicePolicyCacheImpl;->isScreenCaptureAllowedInPolicyEngine(I)Z
+HSPLcom/android/server/devicepolicy/DeviceManagementResourcesProvider;->getString(Ljava/lang/String;)Landroid/app/admin/ParcelableResource;+]Ljava/util/Map;Ljava/util/HashMap;
+HSPLcom/android/server/devicepolicy/DevicePolicyCacheImpl;->isScreenCaptureAllowedInPolicyEngine(I)Z+]Ljava/util/Set;Ljava/util/HashSet;
 HPLcom/android/server/devicepolicy/DevicePolicyData;->store(Lcom/android/server/devicepolicy/DevicePolicyData;Lcom/android/internal/util/JournaledFile;)Z
+HPLcom/android/server/devicepolicy/DevicePolicyEngine$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/devicepolicy/DevicePolicyEngine;Landroid/content/Intent;Lcom/android/server/devicepolicy/EnforcingAdmin;Lcom/android/server/devicepolicy/PolicyDefinition;II)V
+HPLcom/android/server/devicepolicy/DevicePolicyEngine$$ExternalSyntheticLambda1;->runOrThrow()V
+HPLcom/android/server/devicepolicy/DevicePolicyEngine$$ExternalSyntheticLambda3;-><init>(Lcom/android/server/devicepolicy/DevicePolicyEngine;Lcom/android/server/devicepolicy/PolicyDefinition;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyEngine$DevicePoliciesReaderWriter;-><init>(Lcom/android/server/devicepolicy/DevicePolicyEngine;)V
-HPLcom/android/server/devicepolicy/DevicePolicyEngine$DevicePoliciesReaderWriter;->writeEnforcingAdminsInner(Lcom/android/modules/utils/TypedXmlSerializer;)V
+HPLcom/android/server/devicepolicy/DevicePolicyEngine$DevicePoliciesReaderWriter;->writeEnforcingAdminsInner(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Iterator;Ljava/util/HashMap$KeyIterator;]Ljava/util/Set;Ljava/util/HashSet;
 HPLcom/android/server/devicepolicy/DevicePolicyEngine$DevicePoliciesReaderWriter;->writeGlobalPoliciesInner(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/app/admin/PolicyKey;Landroid/app/admin/UserRestrictionPolicyKey;]Lcom/android/server/devicepolicy/PolicyState;Lcom/android/server/devicepolicy/PolicyState;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/Set;Ljava/util/HashMap$EntrySet;
-HPLcom/android/server/devicepolicy/DevicePolicyEngine$DevicePoliciesReaderWriter;->writeLocalPoliciesInner(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/app/admin/PolicyKey;Landroid/app/admin/PackagePolicyKey;,Landroid/app/admin/UserRestrictionPolicyKey;,Landroid/app/admin/NoArgsPolicyKey;,Landroid/app/admin/IntentFilterPolicyKey;]Lcom/android/server/devicepolicy/PolicyState;Lcom/android/server/devicepolicy/PolicyState;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/Set;Ljava/util/HashMap$EntrySet;
+HPLcom/android/server/devicepolicy/DevicePolicyEngine$DevicePoliciesReaderWriter;->writeLocalPoliciesInner(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/app/admin/PolicyKey;Landroid/app/admin/PackagePolicyKey;,Landroid/app/admin/UserRestrictionPolicyKey;,Landroid/app/admin/NoArgsPolicyKey;]Lcom/android/server/devicepolicy/PolicyState;Lcom/android/server/devicepolicy/PolicyState;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/Set;Ljava/util/HashMap$EntrySet;
 HPLcom/android/server/devicepolicy/DevicePolicyEngine$DevicePoliciesReaderWriter;->writeToFileLocked()V
+HSPLcom/android/server/devicepolicy/DevicePolicyEngine;->enforcePolicy(Lcom/android/server/devicepolicy/PolicyDefinition;Landroid/app/admin/PolicyValue;I)V
 HPLcom/android/server/devicepolicy/DevicePolicyEngine;->forceEnforcementRefreshLocked(Lcom/android/server/devicepolicy/PolicyDefinition;)V
-HPLcom/android/server/devicepolicy/DevicePolicyEngine;->getGlobalPolicyStateLocked(Lcom/android/server/devicepolicy/PolicyDefinition;)Lcom/android/server/devicepolicy/PolicyState;
-HPLcom/android/server/devicepolicy/DevicePolicyEngine;->getLocalPolicyStateLocked(Lcom/android/server/devicepolicy/PolicyDefinition;I)Lcom/android/server/devicepolicy/PolicyState;
-HPLcom/android/server/devicepolicy/DevicePolicyEngine;->getPolicyStateLocked(Ljava/util/Map;Lcom/android/server/devicepolicy/PolicyDefinition;)Lcom/android/server/devicepolicy/PolicyState;
+HPLcom/android/server/devicepolicy/DevicePolicyEngine;->getGlobalPolicyStateLocked(Lcom/android/server/devicepolicy/PolicyDefinition;)Lcom/android/server/devicepolicy/PolicyState;+]Ljava/util/Map;Ljava/util/HashMap;
+HPLcom/android/server/devicepolicy/DevicePolicyEngine;->getLocalPolicyKeysSetByAllAdmins(Lcom/android/server/devicepolicy/PolicyDefinition;I)Ljava/util/Set;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/app/admin/PolicyKey;Landroid/app/admin/PackagePolicyKey;,Landroid/app/admin/UserRestrictionPolicyKey;,Landroid/app/admin/NoArgsPolicyKey;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Iterator;Ljava/util/HashMap$KeyIterator;]Ljava/util/Set;Ljava/util/HashMap$KeySet;
+HPLcom/android/server/devicepolicy/DevicePolicyEngine;->getLocalPolicyStateLocked(Lcom/android/server/devicepolicy/PolicyDefinition;I)Lcom/android/server/devicepolicy/PolicyState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Map;Ljava/util/HashMap;
+HPLcom/android/server/devicepolicy/DevicePolicyEngine;->getPolicyStateLocked(Ljava/util/Map;Lcom/android/server/devicepolicy/PolicyDefinition;)Lcom/android/server/devicepolicy/PolicyState;+]Ljava/util/Map;Ljava/util/HashMap;
 HSPLcom/android/server/devicepolicy/DevicePolicyEngine;->hasLocalPolicyLocked(Lcom/android/server/devicepolicy/PolicyDefinition;I)Z
-HPLcom/android/server/devicepolicy/DevicePolicyEngine;->lambda$forceEnforcementRefreshLocked$0(Lcom/android/server/devicepolicy/PolicyDefinition;)V
+HPLcom/android/server/devicepolicy/DevicePolicyEngine;->lambda$forceEnforcementRefreshLocked$0(Lcom/android/server/devicepolicy/PolicyDefinition;)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/UserManager;Landroid/os/UserManager;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/devicepolicy/DevicePolicyEngine;->lambda$sendPolicyResultToAdmin$3(Landroid/content/Intent;Lcom/android/server/devicepolicy/EnforcingAdmin;Lcom/android/server/devicepolicy/PolicyDefinition;II)V
-HPLcom/android/server/devicepolicy/DevicePolicyEngine;->maybeSendIntentToAdminReceivers(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/util/List;)V
+HPLcom/android/server/devicepolicy/DevicePolicyEngine;->maybeSendIntentToAdminReceivers(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/util/List;)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/devicepolicy/DevicePolicyEngine;->removeLocalPolicy(Lcom/android/server/devicepolicy/PolicyDefinition;Lcom/android/server/devicepolicy/EnforcingAdmin;I)V
+HPLcom/android/server/devicepolicy/DevicePolicyEngine;->sendPolicyResultToAdmin(Lcom/android/server/devicepolicy/EnforcingAdmin;Lcom/android/server/devicepolicy/PolicyDefinition;II)V
+HPLcom/android/server/devicepolicy/DevicePolicyEngine;->setLocalPolicy(Lcom/android/server/devicepolicy/PolicyDefinition;Lcom/android/server/devicepolicy/EnforcingAdmin;Landroid/app/admin/PolicyValue;IZ)V
+HPLcom/android/server/devicepolicy/DevicePolicyEngine;->write()V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda17;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda17;->getOrThrow()Ljava/lang/Object;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda201;->runOrThrow()V
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda39;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda39;->getOrThrow()Ljava/lang/Object;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda6;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda6;->getOrThrow()Ljava/lang/Object;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda71;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda71;->getOrThrow()Ljava/lang/Object;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda83;->getOrThrow()Ljava/lang/Object;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda86;->getOrThrow()Ljava/lang/Object;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderClearCallingIdentity()J
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderGetCallingUid()I
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderRestoreCallingIdentity(J)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderWithCleanCallingIdentity(Lcom/android/internal/util/FunctionalUtils$ThrowingRunnable;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderWithCleanCallingIdentity(Lcom/android/internal/util/FunctionalUtils$ThrowingSupplier;)Ljava/lang/Object;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getAppOpsManager()Landroid/app/AppOpsManager;
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPackageManager()Landroid/content/pm/PackageManager;
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPackageManager()Landroid/content/pm/PackageManager;+]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPackageManagerInternal()Landroid/content/pm/PackageManagerInternal;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPackageManagerLocal()Lcom/android/server/pm/PackageManagerLocal;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->getDeviceStateCache()Landroid/app/admin/DeviceStateCache;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isActiveDeviceOwner(I)Z
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isActiveProfileOwner(I)Z
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isUserOrganizationManaged(I)Z
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isActiveProfileOwner(I)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isUserOrganizationManaged(I)Z+]Landroid/app/admin/DeviceStateCache;Lcom/android/server/devicepolicy/DeviceStateCacheImpl;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->$r8$lambda$6U9Tynmb-Pyx3o9fk3BZ0wh6q3E(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)Lcom/android/server/devicepolicy/DevicePolicyData;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->$r8$lambda$8VXyNGD0KwgqhXPdcXu1QbxETRQ(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/CallerIdentity;)Landroid/content/ComponentName;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->$r8$lambda$Brh1ZdbohpkBgCPUEetYswzjMkc(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)Ljava/lang/Integer;
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->$r8$lambda$bycuYzhfY5R_qaetM6pnmUlgRYw(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)Ljava/lang/Boolean;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->$r8$lambda$izNCzXqQXoBX8SJJeOPX_ZF8e5I(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/devicepolicy/CallerIdentity;)Ljava/lang/Integer;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->$r8$lambda$qyL5CPTjIZuQtn8bTDK3nNCBcR8(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)Lcom/android/server/devicepolicy/ActiveAdmin;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->$r8$lambda$y2NbOOaPwzvcsyukbUhSG1v0a0I(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)Landroid/content/pm/UserInfo;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->$r8$lambda$z2z3MIA7ckZr-X5-xCyiNHfwGxI(Lcom/android/server/devicepolicy/DevicePolicyManagerService;IILjava/util/Map$Entry;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;)V+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->$r8$lambda$z2z3MIA7ckZr-X5-xCyiNHfwGxI(Lcom/android/server/devicepolicy/DevicePolicyManagerService;IILjava/util/Map$Entry;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->addCrossProfileIntentFilter(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/IntentFilter;I)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->canManageUsers(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->canQueryAdminPolicy(Lcom/android/server/devicepolicy/CallerIdentity;)Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->checkAdminCanSetRestriction(Lcom/android/server/devicepolicy/CallerIdentity;ZLjava/lang/String;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->ensureLocked()V
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminUncheckedLocked(Landroid/content/ComponentName;I)Lcom/android/server/devicepolicy/ActiveAdmin;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdmins(I)Ljava/util/List;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminUncheckedLocked(Landroid/content/ComponentName;I)Lcom/android/server/devicepolicy/ActiveAdmin;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminWithPolicyForUidLocked(Landroid/content/ComponentName;II)Lcom/android/server/devicepolicy/ActiveAdmin;
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdmins(I)Ljava/util/List;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminsForLockscreenPoliciesLocked(I)Ljava/util/List;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminsForUserAndItsManagedProfilesLocked(ILjava/util/function/Predicate;)Ljava/util/List;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getBindDeviceAdminTargetUsers(Landroid/content/ComponentName;)Ljava/util/List;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getBindDeviceAdminTargetUsers(Landroid/content/ComponentName;)Ljava/util/List;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCallerIdentity()Lcom/android/server/devicepolicy/CallerIdentity;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCallerIdentity(Landroid/content/ComponentName;)Lcom/android/server/devicepolicy/CallerIdentity;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCallerIdentity(Landroid/content/ComponentName;)Lcom/android/server/devicepolicy/CallerIdentity;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCallerIdentity(Landroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/devicepolicy/CallerIdentity;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/devicepolicy/ActiveAdmin;Lcom/android/server/devicepolicy/ActiveAdmin;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDelegatedScopes(Landroid/content/ComponentName;Ljava/lang/String;)Ljava/util/List;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDelegatedScopes(Landroid/content/ComponentName;Ljava/lang/String;)Ljava/util/List;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerAdminLocked()Lcom/android/server/devicepolicy/ActiveAdmin;+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Landroid/app/admin/DeviceAdminInfo;Landroid/app/admin/DeviceAdminInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerComponent(Z)Landroid/content/ComponentName;+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceLocked()Lcom/android/server/devicepolicy/ActiveAdmin;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceOrSystemPermissionBasedAdminLocked()Lcom/android/server/devicepolicy/ActiveAdmin;
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerTypeLocked(Ljava/lang/String;)I+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getEnforcingAdminForCaller(Landroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/devicepolicy/EnforcingAdmin;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceOrSystemPermissionBasedAdminLocked()Lcom/android/server/devicepolicy/ActiveAdmin;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDrawable(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/app/admin/ParcelableResource;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getEnforcingAdminForCaller(Landroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/devicepolicy/EnforcingAdmin;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getKeyguardDisabledFeatures(Landroid/content/ComponentName;IZ)I+]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/devicepolicy/ActiveAdmin;Lcom/android/server/devicepolicy/ActiveAdmin;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getLockObject()Ljava/lang/Object;+]Lcom/android/internal/util/StatLogger;Lcom/android/internal/util/StatLogger;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getMinimumRequiredWifiSecurityLevel()I+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPackageInfoWithNullCheck(Ljava/lang/String;Lcom/android/server/devicepolicy/CallerIdentity;)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPasswordQuality(Landroid/content/ComponentName;IZ)I
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPermissionGrantState(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPermissionGrantStateForUser(Ljava/lang/String;Ljava/lang/String;Lcom/android/server/devicepolicy/CallerIdentity;I)I+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/PackageManagerLocal$UnfilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPermissionGrantStateForUser(Ljava/lang/String;Ljava/lang/String;Lcom/android/server/devicepolicy/CallerIdentity;I)I+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/PackageManagerLocal$UnfilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileOwnerAdminLocked(I)Lcom/android/server/devicepolicy/ActiveAdmin;+]Landroid/app/admin/DeviceAdminInfo;Landroid/app/admin/DeviceAdminInfo;]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileOwnerAsUser(I)Landroid/content/ComponentName;+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileOwnerOfOrganizationOwnedDeviceLocked()Lcom/android/server/devicepolicy/ActiveAdmin;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileParentId(I)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getString(Ljava/lang/String;)Landroid/app/admin/ParcelableResource;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getTargetSdk(Ljava/lang/String;I)I
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserData(I)Lcom/android/server/devicepolicy/DevicePolicyData;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getTargetSdk(Ljava/lang/String;I)I+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserData(I)Lcom/android/server/devicepolicy/DevicePolicyData;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/devicepolicy/DeviceStateCacheImpl;Lcom/android/server/devicepolicy/DeviceStateCacheImpl;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserDataUnchecked(I)Lcom/android/server/devicepolicy/DevicePolicyData;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserInfo(I)Landroid/content/pm/UserInfo;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getWifiSsidPolicy(Ljava/lang/String;)Landroid/app/admin/WifiSsidPolicy;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasCallingOrSelfPermission(Ljava/lang/String;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasCrossUsersPermission(Lcom/android/server/devicepolicy/CallerIdentity;I)Z+]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasFullCrossUsersPermission(Lcom/android/server/devicepolicy/CallerIdentity;I)Z
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isAdminActive(Landroid/content/ComponentName;I)Z
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasFullCrossUsersPermission(Lcom/android/server/devicepolicy/CallerIdentity;I)Z+]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasPermission(Ljava/lang/String;Ljava/lang/String;)Z
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isAdminActive(Landroid/content/ComponentName;I)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isCallingFromPackage(Ljava/lang/String;I)Z+]Lcom/android/server/pm/PackageManagerLocal$UnfilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDefaultDeviceOwner(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceOwner(Landroid/content/ComponentName;I)Z
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceOwner(Landroid/content/ComponentName;I)Z+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceOwnerLocked(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isFinancedDeviceOwner(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isManagedProfile(I)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isManagedProfile(Landroid/content/ComponentName;)Z
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isManagedProfile(I)Z+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isManagedProfile(Landroid/content/ComponentName;)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isNotificationListenerServicePermitted(Ljava/lang/String;I)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isPackageSuspended(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isPermissionCheckFlagEnabled()Z
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isProfileOwner(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isProfileOwnerOfOrganizationOwnedDevice(I)Z
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isProfileOwnerOfOrganizationOwnedDevice(Lcom/android/server/devicepolicy/CallerIdentity;)Z
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isProfileOwnerOfOrganizationOwnedDevice(I)Z+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isProfileOwnerOfOrganizationOwnedDevice(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isSeparateProfileChallengeEnabled(I)Z+]Ljava/lang/Boolean;Ljava/lang/Boolean;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isSystemUid(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isUidDeviceOwnerLocked(I)Z+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isUidProfileOwnerLocked(I)Z+]Landroid/app/admin/DeviceAdminInfo;Landroid/app/admin/DeviceAdminInfo;]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/devicepolicy/ActiveAdmin;Lcom/android/server/devicepolicy/ActiveAdmin;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isUnicornFlagEnabled()Z
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isUninstallBlocked(Ljava/lang/String;)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getActiveAdminsForLockscreenPoliciesLocked$19(Landroid/content/pm/UserInfo;)Z
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getActiveAdminsForUserAndItsManagedProfilesLocked$22(ILjava/util/ArrayList;Ljava/util/function/Predicate;)V+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/devicepolicy/ActiveAdmin;Lcom/android/server/devicepolicy/ActiveAdmin;]Landroid/os/UserManager;Landroid/os/UserManager;]Ljava/util/function/Predicate;Lcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda116;,Lcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda113;,Lcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda115;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getBindDeviceAdminTargetUsers$141(Landroid/content/ComponentName;I)Ljava/util/ArrayList;
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getActiveAdminsForUserAndItsManagedProfilesLocked$22(ILjava/util/ArrayList;Ljava/util/function/Predicate;)V+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/UserManager;Landroid/os/UserManager;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/devicepolicy/ActiveAdmin;Lcom/android/server/devicepolicy/ActiveAdmin;]Ljava/util/function/Predicate;Lcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda116;,Lcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda118;,Lcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda113;,Lcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda115;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getBindDeviceAdminTargetUsers$141(Landroid/content/ComponentName;I)Ljava/util/ArrayList;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getPermissionGrantState$130(Ljava/lang/String;Ljava/lang/String;Lcom/android/server/devicepolicy/CallerIdentity;)Ljava/lang/Integer;+]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getProfileOwnerOfOrganizationOwnedDeviceLocked$83()Lcom/android/server/devicepolicy/ActiveAdmin;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$getProfileParentId$86(I)Ljava/lang/Integer;+]Landroid/os/UserManager;Landroid/os/UserManager;
@@ -3324,33 +2797,31 @@
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$setApplicationExemptions$164(IILjava/util/Map$Entry;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->logUserRestrictionCall(Ljava/lang/String;ZZLcom/android/server/devicepolicy/CallerIdentity;)V
 HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->makeJournaledFile(ILjava/lang/String;)Lcom/android/internal/util/JournaledFile;
-HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->packageHasActiveAdmins(Ljava/lang/String;I)Z
+HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->packageHasActiveAdmins(Ljava/lang/String;I)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setApplicationExemptions(Ljava/lang/String;Ljava/lang/String;[I)V+]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;]Landroid/app/admin/DevicePolicyEventLogger;Landroid/app/admin/DevicePolicyEventLogger;
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setApplicationRestrictions(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setBackwardCompatibleUserRestriction(Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/EnforcingAdmin;Ljava/lang/String;ZZ)V
 HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setUserRestriction(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ZZ)V
-HSPLcom/android/server/devicepolicy/DeviceStateCacheImpl;->isUserOrganizationManaged(I)Z
+HSPLcom/android/server/devicepolicy/DeviceStateCacheImpl;->isUserOrganizationManaged(I)Z+]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap;
 HSPLcom/android/server/devicepolicy/EnforcingAdmin;-><init>(Ljava/lang/String;Landroid/content/ComponentName;Ljava/util/Set;ILcom/android/server/devicepolicy/ActiveAdmin;)V
 HSPLcom/android/server/devicepolicy/EnforcingAdmin;->createEnterpriseEnforcingAdmin(Landroid/content/ComponentName;ILcom/android/server/devicepolicy/ActiveAdmin;)Lcom/android/server/devicepolicy/EnforcingAdmin;
 HPLcom/android/server/devicepolicy/EnforcingAdmin;->equals(Ljava/lang/Object;)Z
 HSPLcom/android/server/devicepolicy/EnforcingAdmin;->getAuthorities()Ljava/util/Set;
+HPLcom/android/server/devicepolicy/EnforcingAdmin;->hasMatchingAuthorities(Lcom/android/server/devicepolicy/EnforcingAdmin;Lcom/android/server/devicepolicy/EnforcingAdmin;)Z+]Ljava/util/Set;Ljava/util/HashSet;
 HSPLcom/android/server/devicepolicy/EnforcingAdmin;->hashCode()I+]Lcom/android/server/devicepolicy/EnforcingAdmin;Lcom/android/server/devicepolicy/EnforcingAdmin;
 HPLcom/android/server/devicepolicy/EnforcingAdmin;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/server/devicepolicy/EnforcingAdmin;Lcom/android/server/devicepolicy/EnforcingAdmin;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HPLcom/android/server/devicepolicy/NetworkLogger$1;->sendNetworkEvent(Landroid/app/admin/NetworkEvent;)V+]Landroid/os/Handler;Lcom/android/server/devicepolicy/NetworkLoggingHandler;]Landroid/os/Message;Landroid/os/Message;]Landroid/os/Bundle;Landroid/os/Bundle;
 HSPLcom/android/server/devicepolicy/Owners;->getDeviceOwnerComponent()Landroid/content/ComponentName;
-HSPLcom/android/server/devicepolicy/Owners;->getDeviceOwnerPackageName()Ljava/lang/String;
-HSPLcom/android/server/devicepolicy/Owners;->getDeviceOwnerType(Ljava/lang/String;)I+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;
 HSPLcom/android/server/devicepolicy/Owners;->getDeviceOwnerUserId()I
 HSPLcom/android/server/devicepolicy/Owners;->getProfileOwnerComponent(I)Landroid/content/ComponentName;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/devicepolicy/Owners;->hasDeviceOwner()Z
-HSPLcom/android/server/devicepolicy/Owners;->isDeviceOwnerTypeSetForDeviceOwner(Ljava/lang/String;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/devicepolicy/Owners;->isProfileOwnerOfOrganizationOwnedDevice(I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/devicepolicy/PolicyDefinition$$ExternalSyntheticLambda18;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/server/devicepolicy/PolicyDefinition;->enforcePolicy(Ljava/lang/Object;Landroid/content/Context;I)Z
-HPLcom/android/server/devicepolicy/PolicyDefinition;->getPolicyDefinitionForUserRestriction(Ljava/lang/String;)Lcom/android/server/devicepolicy/PolicyDefinition;
-HSPLcom/android/server/devicepolicy/PolicyDefinition;->getPolicyKey()Landroid/app/admin/PolicyKey;
+HSPLcom/android/server/devicepolicy/PolicyDefinition;->enforcePolicy(Ljava/lang/Object;Landroid/content/Context;I)Z+]Lcom/android/internal/util/function/QuadFunction;Lcom/android/server/devicepolicy/PolicyDefinition$$ExternalSyntheticLambda18;,Lcom/android/server/devicepolicy/PolicyDefinition$$ExternalSyntheticLambda2;
+HPLcom/android/server/devicepolicy/PolicyDefinition;->getPolicyDefinitionForUserRestriction(Ljava/lang/String;)Lcom/android/server/devicepolicy/PolicyDefinition;+]Ljava/util/Map;Ljava/util/HashMap;
 HPLcom/android/server/devicepolicy/PolicyDefinition;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/admin/PolicyKey;Landroid/app/admin/PackagePolicyKey;,Landroid/app/admin/UserRestrictionPolicyKey;,Landroid/app/admin/NoArgsPolicyKey;
-HSPLcom/android/server/devicepolicy/PolicyEnforcerCallbacks;->lambda$setUserRestriction$5(Landroid/app/admin/PolicyKey;ILjava/lang/Boolean;)Ljava/lang/Boolean;
+HSPLcom/android/server/devicepolicy/PolicyEnforcerCallbacks$$ExternalSyntheticLambda11;-><init>(Landroid/app/admin/PolicyKey;ILjava/lang/Boolean;)V
+HSPLcom/android/server/devicepolicy/PolicyEnforcerCallbacks$$ExternalSyntheticLambda11;->getOrThrow()Ljava/lang/Object;
+HSPLcom/android/server/devicepolicy/PolicyEnforcerCallbacks;->lambda$setUserRestriction$5(Landroid/app/admin/PolicyKey;ILjava/lang/Boolean;)Ljava/lang/Boolean;+]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;
 HSPLcom/android/server/devicepolicy/PolicyEnforcerCallbacks;->setUserRestriction(Ljava/lang/Boolean;Landroid/content/Context;ILandroid/app/admin/PolicyKey;)Z
 HPLcom/android/server/devicepolicy/PolicyState;->getPoliciesSetByAdmins()Ljava/util/LinkedHashMap;
 HPLcom/android/server/devicepolicy/PolicyState;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/server/devicepolicy/EnforcingAdmin;Lcom/android/server/devicepolicy/EnforcingAdmin;]Lcom/android/server/devicepolicy/PolicyDefinition;Lcom/android/server/devicepolicy/PolicyDefinition;]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/app/admin/PolicyValue;Landroid/app/admin/LockTaskPolicy;,Landroid/app/admin/StringSetPolicyValue;,Landroid/app/admin/BooleanPolicyValue;,Landroid/app/admin/ComponentNamePolicyValue;]Ljava/util/Iterator;Ljava/util/LinkedHashMap$LinkedKeyIterator;]Ljava/util/Set;Ljava/util/LinkedHashMap$LinkedKeySet;
@@ -3359,11 +2830,8 @@
 HSPLcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;->getOrCreateUserStats(Ljava/util/Map;I)Ljava/util/Deque;+]Ljava/util/Map;Ljava/util/HashMap;
 HSPLcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;->log(ILjava/time/LocalDate;FF)V
 HSPLcom/android/server/display/AmbientBrightnessStatsTracker$Injector;->elapsedRealtimeMillis()J
-HSPLcom/android/server/display/AmbientBrightnessStatsTracker$Injector;->getLocalDate()Ljava/time/LocalDate;
-HSPLcom/android/server/display/AmbientBrightnessStatsTracker$Timer;->reset()V
-HSPLcom/android/server/display/AmbientBrightnessStatsTracker$Timer;->start()V
-HSPLcom/android/server/display/AmbientBrightnessStatsTracker$Timer;->totalDurationSec()F
-HSPLcom/android/server/display/AmbientBrightnessStatsTracker;->$r8$lambda$fAbjbj4ACWU53j1Xe-MqKuY4efU(Lcom/android/server/display/AmbientBrightnessStatsTracker;)J
+HSPLcom/android/server/display/AmbientBrightnessStatsTracker$Timer;->start()V+]Lcom/android/server/display/AmbientBrightnessStatsTracker$Clock;Lcom/android/server/display/AmbientBrightnessStatsTracker$$ExternalSyntheticLambda0;
+HSPLcom/android/server/display/AmbientBrightnessStatsTracker$Timer;->totalDurationSec()F+]Lcom/android/server/display/AmbientBrightnessStatsTracker$Clock;Lcom/android/server/display/AmbientBrightnessStatsTracker$$ExternalSyntheticLambda0;
 HSPLcom/android/server/display/AmbientBrightnessStatsTracker;->add(IF)V+]Lcom/android/server/display/AmbientBrightnessStatsTracker$Injector;Lcom/android/server/display/AmbientBrightnessStatsTracker$Injector;]Lcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;Lcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;]Lcom/android/server/display/AmbientBrightnessStatsTracker$Timer;Lcom/android/server/display/AmbientBrightnessStatsTracker$Timer;
 HSPLcom/android/server/display/AmbientBrightnessStatsTracker;->lambda$new$0()J+]Lcom/android/server/display/AmbientBrightnessStatsTracker$Injector;Lcom/android/server/display/AmbientBrightnessStatsTracker$Injector;
 HPLcom/android/server/display/AutomaticBrightnessController$1;->run()V
@@ -3376,236 +2844,91 @@
 HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->prune(J)V
 HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->push(JF)V
 HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->size()I
-HPLcom/android/server/display/AutomaticBrightnessController$AutomaticBrightnessHandler;->handleMessage(Landroid/os/Message;)V
+HSPLcom/android/server/display/AutomaticBrightnessController$AutomaticBrightnessHandler;->handleMessage(Landroid/os/Message;)V
 HPLcom/android/server/display/AutomaticBrightnessController$Injector$$ExternalSyntheticLambda0;->uptimeMillis()J
 HPLcom/android/server/display/AutomaticBrightnessController;->applyLightSensorMeasurement(JF)V+]Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;
 HPLcom/android/server/display/AutomaticBrightnessController;->calculateAmbientLux(JJ)F+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;
-HPLcom/android/server/display/AutomaticBrightnessController;->calculateWeight(JJ)F
-HPLcom/android/server/display/AutomaticBrightnessController;->clampScreenBrightness(F)F
-HSPLcom/android/server/display/AutomaticBrightnessController;->configure(ILandroid/hardware/display/BrightnessConfiguration;FZFZIZ)V
-HSPLcom/android/server/display/AutomaticBrightnessController;->convertToAdjustedNits(F)F
-HPLcom/android/server/display/AutomaticBrightnessController;->getAutomaticScreenBrightness(Lcom/android/server/display/brightness/BrightnessEvent;)F
+HPLcom/android/server/display/AutomaticBrightnessController;->clampScreenBrightness(F)F+]Lcom/android/server/display/BrightnessRangeController;Lcom/android/server/display/BrightnessRangeController;]Lcom/android/server/display/BrightnessThrottler;Lcom/android/server/display/BrightnessThrottler;
+HSPLcom/android/server/display/AutomaticBrightnessController;->convertToAdjustedNits(F)F+]Lcom/android/server/display/BrightnessMappingStrategy;Lcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;
+HPLcom/android/server/display/AutomaticBrightnessController;->getAutomaticScreenBrightness(Lcom/android/server/display/brightness/BrightnessEvent;)F+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;
 HPLcom/android/server/display/AutomaticBrightnessController;->handleLightSensorEvent(JF)V+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Landroid/os/Handler;Lcom/android/server/display/AutomaticBrightnessController$AutomaticBrightnessHandler;]Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;
-HSPLcom/android/server/display/AutomaticBrightnessController;->hasUserDataPoints()Z
-HPLcom/android/server/display/AutomaticBrightnessController;->isDefaultConfig()Z
+HSPLcom/android/server/display/AutomaticBrightnessController;->hasUserDataPoints()Z+]Lcom/android/server/display/BrightnessMappingStrategy;Lcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;
 HSPLcom/android/server/display/AutomaticBrightnessController;->isInIdleMode()Z+]Lcom/android/server/display/BrightnessMappingStrategy;Lcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;
 HPLcom/android/server/display/AutomaticBrightnessController;->nextAmbientLightBrighteningTransition(J)J+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;
 HPLcom/android/server/display/AutomaticBrightnessController;->nextAmbientLightDarkeningTransition(J)J+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;
 HPLcom/android/server/display/AutomaticBrightnessController;->setAmbientLux(F)V
-HSPLcom/android/server/display/AutomaticBrightnessController;->setBrightnessConfiguration(Landroid/hardware/display/BrightnessConfiguration;Z)Z
-HSPLcom/android/server/display/AutomaticBrightnessController;->setDisplayPolicy(I)Z
-HSPLcom/android/server/display/AutomaticBrightnessController;->setLightSensorEnabled(Z)Z
-HSPLcom/android/server/display/AutomaticBrightnessController;->switchMode(I)V
-HPLcom/android/server/display/AutomaticBrightnessController;->updateAmbientLux()V+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;]Lcom/android/server/display/AutomaticBrightnessController$Clock;Lcom/android/server/display/AutomaticBrightnessController$Injector$$ExternalSyntheticLambda0;
+HSPLcom/android/server/display/AutomaticBrightnessController;->setBrightnessConfiguration(Landroid/hardware/display/BrightnessConfiguration;Z)Z+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/BrightnessMappingStrategy;Lcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;
+HSPLcom/android/server/display/AutomaticBrightnessController;->setDisplayPolicy(I)Z+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/BrightnessMappingStrategy;Lcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;
+HSPLcom/android/server/display/AutomaticBrightnessController;->setLightSensorEnabled(Z)Z+]Lcom/android/server/display/AutomaticBrightnessController$Clock;Lcom/android/server/display/AutomaticBrightnessController$Injector$$ExternalSyntheticLambda0;]Landroid/hardware/SensorManager;Landroid/hardware/SystemSensorManager;
+HSPLcom/android/server/display/AutomaticBrightnessController;->switchMode(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/BrightnessMappingStrategy;Lcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;
+HPLcom/android/server/display/AutomaticBrightnessController;->updateAmbientLux()V+]Lcom/android/server/display/AutomaticBrightnessController$Clock;Lcom/android/server/display/AutomaticBrightnessController$Injector$$ExternalSyntheticLambda0;]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;
 HPLcom/android/server/display/AutomaticBrightnessController;->updateAmbientLux(J)V+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Landroid/os/Handler;Lcom/android/server/display/AutomaticBrightnessController$AutomaticBrightnessHandler;
-HSPLcom/android/server/display/AutomaticBrightnessController;->updateAutoBrightness(ZZ)V
+HSPLcom/android/server/display/AutomaticBrightnessController;->updateAutoBrightness(ZZ)V+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/AutomaticBrightnessController$Callbacks;Lcom/android/server/display/DisplayPowerController;]Lcom/android/server/display/HysteresisLevels;Lcom/android/server/display/HysteresisLevels;]Lcom/android/server/display/BrightnessMappingStrategy;Lcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;
 HPLcom/android/server/display/AutomaticBrightnessController;->weightIntegral(J)F
-HSPLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->convertToAdjustedNits(F)F
-HPLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->getBrightness(FLjava/lang/String;I)F
+HSPLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->convertToAdjustedNits(F)F+]Landroid/util/Spline;Landroid/util/Spline$MonotoneCubicSpline;
 HSPLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->getMode()I
 HSPLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->setBrightnessConfiguration(Landroid/hardware/display/BrightnessConfiguration;)Z
 HSPLcom/android/server/display/BrightnessRangeController$$ExternalSyntheticLambda5;-><init>(Lcom/android/server/display/BrightnessRangeController;I)V
 HSPLcom/android/server/display/BrightnessRangeController$$ExternalSyntheticLambda5;->getAsBoolean()Z
 HSPLcom/android/server/display/BrightnessRangeController$$ExternalSyntheticLambda6;-><init>(Lcom/android/server/display/BrightnessRangeController;I)V
 HSPLcom/android/server/display/BrightnessRangeController$$ExternalSyntheticLambda6;->run()V
-HSPLcom/android/server/display/BrightnessRangeController;->applyChanges(Ljava/util/function/BooleanSupplier;Ljava/lang/Runnable;)V
+HSPLcom/android/server/display/BrightnessRangeController;->applyChanges(Ljava/util/function/BooleanSupplier;Ljava/lang/Runnable;)V+]Ljava/util/function/BooleanSupplier;Lcom/android/server/display/BrightnessRangeController$$ExternalSyntheticLambda2;,Lcom/android/server/display/BrightnessRangeController$$ExternalSyntheticLambda5;]Ljava/lang/Runnable;Lcom/android/server/display/BrightnessRangeController$$ExternalSyntheticLambda3;,Lcom/android/server/display/DisplayPowerController$$ExternalSyntheticLambda6;,Lcom/android/server/display/BrightnessRangeController$$ExternalSyntheticLambda6;
 HSPLcom/android/server/display/BrightnessRangeController;->getCurrentBrightnessMax()F+]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;]Lcom/android/server/display/NormalBrightnessModeController;Lcom/android/server/display/NormalBrightnessModeController;
 HSPLcom/android/server/display/BrightnessRangeController;->getCurrentBrightnessMin()F+]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;
-HSPLcom/android/server/display/BrightnessRangeController;->getHighBrightnessMode()I
-HSPLcom/android/server/display/BrightnessRangeController;->getTransitionPoint()F
-HSPLcom/android/server/display/BrightnessRangeController;->lambda$setAutoBrightnessEnabled$4(I)Z
+HSPLcom/android/server/display/BrightnessRangeController;->getHighBrightnessMode()I+]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;
+HSPLcom/android/server/display/BrightnessRangeController;->getTransitionPoint()F+]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;
 HSPLcom/android/server/display/BrightnessRangeController;->lambda$setAutoBrightnessEnabled$5(I)V
-HSPLcom/android/server/display/BrightnessRangeController;->onBrightnessChanged(FFI)V
+HSPLcom/android/server/display/BrightnessRangeController;->onBrightnessChanged(FFI)V+]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;
 HSPLcom/android/server/display/BrightnessRangeController;->setAutoBrightnessEnabled(I)V
 HSPLcom/android/server/display/BrightnessSetting;->getBrightness()F
-HSPLcom/android/server/display/BrightnessSetting;->setBrightness(F)V
 HPLcom/android/server/display/BrightnessTracker$BrightnessChangeValues;-><init>(FFZZJLjava/lang/String;[F[J)V
-HPLcom/android/server/display/BrightnessTracker$Receiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HSPLcom/android/server/display/BrightnessTracker$Receiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/display/BrightnessTracker$SensorListener;->onSensorChanged(Landroid/hardware/SensorEvent;)V
 HSPLcom/android/server/display/BrightnessTracker$TrackerHandler;->handleMessage(Landroid/os/Message;)V
-HSPLcom/android/server/display/BrightnessTracker;->-$$Nest$mrecordAmbientBrightnessStats(Lcom/android/server/display/BrightnessTracker;Landroid/hardware/SensorEvent;)V+]Lcom/android/server/display/BrightnessTracker;Lcom/android/server/display/BrightnessTracker;
-HPLcom/android/server/display/BrightnessTracker;->notifyBrightnessChanged(FZFZZLjava/lang/String;[F[J)V
+HPLcom/android/server/display/BrightnessTracker;->notifyBrightnessChanged(FZFZZLjava/lang/String;[F[J)V+]Lcom/android/server/display/BrightnessTracker$Injector;Lcom/android/server/display/BrightnessTracker$Injector;
 HSPLcom/android/server/display/BrightnessTracker;->recordAmbientBrightnessStats(Landroid/hardware/SensorEvent;)V+]Lcom/android/server/display/AmbientBrightnessStatsTracker;Lcom/android/server/display/AmbientBrightnessStatsTracker;
 HPLcom/android/server/display/ColorFade;->draw(F)Z
 HPLcom/android/server/display/ColorFade;->drawFaded(FF)V
-HSPLcom/android/server/display/DeviceStateToLayoutMap;-><clinit>()V
-HSPLcom/android/server/display/DeviceStateToLayoutMap;-><init>(Lcom/android/server/display/layout/DisplayIdProducer;Lcom/android/server/display/feature/DisplayManagerFlags;)V
-HSPLcom/android/server/display/DeviceStateToLayoutMap;-><init>(Lcom/android/server/display/layout/DisplayIdProducer;Lcom/android/server/display/feature/DisplayManagerFlags;Ljava/io/File;)V
-HSPLcom/android/server/display/DeviceStateToLayoutMap;->createLayout(I)Lcom/android/server/display/layout/Layout;
-HSPLcom/android/server/display/DeviceStateToLayoutMap;->get(I)Lcom/android/server/display/layout/Layout;
-HSPLcom/android/server/display/DeviceStateToLayoutMap;->getConfigFile()Ljava/io/File;
-HSPLcom/android/server/display/DeviceStateToLayoutMap;->loadLayoutsFromConfig(Ljava/io/File;)V
-HSPLcom/android/server/display/DeviceStateToLayoutMap;->size()I
-HSPLcom/android/server/display/DisplayAdapter$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/display/DisplayAdapter;)V
-HSPLcom/android/server/display/DisplayAdapter$$ExternalSyntheticLambda0;->run()V
 HSPLcom/android/server/display/DisplayAdapter$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/display/DisplayAdapter;Lcom/android/server/display/DisplayDevice;I)V
 HSPLcom/android/server/display/DisplayAdapter$$ExternalSyntheticLambda1;->run()V
-HSPLcom/android/server/display/DisplayAdapter;->$r8$lambda$9V0Zb4R5pN2d6Ym6JsffUDuLT04(Lcom/android/server/display/DisplayAdapter;)V
-HSPLcom/android/server/display/DisplayAdapter;->$r8$lambda$m53kLy5P6p-BQH88mDK_wnWdYlc(Lcom/android/server/display/DisplayAdapter;Lcom/android/server/display/DisplayDevice;I)V
-HSPLcom/android/server/display/DisplayAdapter;-><clinit>()V
-HSPLcom/android/server/display/DisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Ljava/lang/String;Lcom/android/server/display/feature/DisplayManagerFlags;)V
-HSPLcom/android/server/display/DisplayAdapter;->createMode(IIFF[F[I)Landroid/view/Display$Mode;
-HSPLcom/android/server/display/DisplayAdapter;->getContext()Landroid/content/Context;
-HSPLcom/android/server/display/DisplayAdapter;->getFeatureFlags()Lcom/android/server/display/feature/DisplayManagerFlags;
-HSPLcom/android/server/display/DisplayAdapter;->getHandler()Landroid/os/Handler;
 HSPLcom/android/server/display/DisplayAdapter;->lambda$sendDisplayDeviceEventLocked$0(Lcom/android/server/display/DisplayDevice;I)V
-HSPLcom/android/server/display/DisplayAdapter;->lambda$sendTraversalRequestLocked$1()V
-HSPLcom/android/server/display/DisplayAdapter;->registerLocked()V
 HSPLcom/android/server/display/DisplayAdapter;->sendDisplayDeviceEventLocked(Lcom/android/server/display/DisplayDevice;I)V
-HSPLcom/android/server/display/DisplayAdapter;->sendTraversalRequestLocked()V
 HSPLcom/android/server/display/DisplayBrightnessState$Builder;-><init>()V
 HSPLcom/android/server/display/DisplayBrightnessState$Builder;->build()Lcom/android/server/display/DisplayBrightnessState;
 HSPLcom/android/server/display/DisplayBrightnessState$Builder;->from(Lcom/android/server/display/DisplayBrightnessState;)Lcom/android/server/display/DisplayBrightnessState$Builder;
-HSPLcom/android/server/display/DisplayBrightnessState$Builder;->getCustomAnimationRate()F
-HSPLcom/android/server/display/DisplayBrightnessState$Builder;->getDisplayBrightnessStrategyName()Ljava/lang/String;
-HSPLcom/android/server/display/DisplayBrightnessState$Builder;->getMaxBrightness()F
-HSPLcom/android/server/display/DisplayBrightnessState$Builder;->getSdrBrightness()F
 HSPLcom/android/server/display/DisplayBrightnessState$Builder;->getShouldUseAutoBrightness()Z
 HSPLcom/android/server/display/DisplayBrightnessState$Builder;->isSlowChange()Z
-HSPLcom/android/server/display/DisplayBrightnessState$Builder;->setMaxBrightness(F)Lcom/android/server/display/DisplayBrightnessState$Builder;
 HSPLcom/android/server/display/DisplayBrightnessState$Builder;->shouldUpdateScreenBrightnessSetting()Z
 HSPLcom/android/server/display/DisplayBrightnessState;-><init>(Lcom/android/server/display/DisplayBrightnessState$Builder;)V+]Lcom/android/server/display/DisplayBrightnessState$Builder;Lcom/android/server/display/DisplayBrightnessState$Builder;
-HSPLcom/android/server/display/DisplayBrightnessState;-><init>(Lcom/android/server/display/DisplayBrightnessState$Builder;Lcom/android/server/display/DisplayBrightnessState-IA;)V
-HSPLcom/android/server/display/DisplayBrightnessState;->builder()Lcom/android/server/display/DisplayBrightnessState$Builder;
-HSPLcom/android/server/display/DisplayBrightnessState;->getBrightness()F
 HSPLcom/android/server/display/DisplayBrightnessState;->getBrightnessReason()Lcom/android/server/display/brightness/BrightnessReason;
-HSPLcom/android/server/display/DisplayBrightnessState;->getShouldUseAutoBrightness()Z
-HSPLcom/android/server/display/DisplayBrightnessState;->isSlowChange()Z
-HSPLcom/android/server/display/DisplayControl;->getPhysicalDisplayIds()[J
-HSPLcom/android/server/display/DisplayControl;->getPhysicalDisplayToken(J)Landroid/os/IBinder;
-HSPLcom/android/server/display/DisplayDevice;-><clinit>()V
-HSPLcom/android/server/display/DisplayDevice;-><init>(Lcom/android/server/display/DisplayAdapter;Landroid/os/IBinder;Ljava/lang/String;Landroid/content/Context;)V
 HSPLcom/android/server/display/DisplayDevice;->getDisplayTokenLocked()Landroid/os/IBinder;
 HSPLcom/android/server/display/DisplayDevice;->getUniqueId()Ljava/lang/String;
-HSPLcom/android/server/display/DisplayDevice;->populateViewportLocked(Landroid/hardware/display/DisplayViewport;)V
-HSPLcom/android/server/display/DisplayDevice;->setLayerStackLocked(Landroid/view/SurfaceControl$Transaction;II)V
-HSPLcom/android/server/display/DisplayDevice;->setProjectionLocked(Landroid/view/SurfaceControl$Transaction;ILandroid/graphics/Rect;Landroid/graphics/Rect;)V
-HSPLcom/android/server/display/DisplayDeviceConfig$1;-><clinit>()V
-HSPLcom/android/server/display/DisplayDeviceConfig$HighBrightnessModeData;-><init>()V
+HSPLcom/android/server/display/DisplayDevice;->populateViewportLocked(Landroid/hardware/display/DisplayViewport;)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;
+HSPLcom/android/server/display/DisplayDevice;->setLayerStackLocked(Landroid/view/SurfaceControl$Transaction;II)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
+HSPLcom/android/server/display/DisplayDevice;->setProjectionLocked(Landroid/view/SurfaceControl$Transaction;ILandroid/graphics/Rect;Landroid/graphics/Rect;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
 HSPLcom/android/server/display/DisplayDeviceConfig$HighBrightnessModeData;->copyTo(Lcom/android/server/display/DisplayDeviceConfig$HighBrightnessModeData;)V
-HSPLcom/android/server/display/DisplayDeviceConfig$ThermalBrightnessThrottlingData$ThrottlingLevel;-><init>(IF)V
-HSPLcom/android/server/display/DisplayDeviceConfig$ThermalBrightnessThrottlingData;-><init>(Ljava/util/List;)V
-HSPLcom/android/server/display/DisplayDeviceConfig$ThermalBrightnessThrottlingData;->create(Ljava/util/List;)Lcom/android/server/display/DisplayDeviceConfig$ThermalBrightnessThrottlingData;
-HSPLcom/android/server/display/DisplayDeviceConfig;-><clinit>()V
 HSPLcom/android/server/display/DisplayDeviceConfig;-><init>(Landroid/content/Context;Lcom/android/server/display/feature/DisplayManagerFlags;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->constrainNitsAndBacklightArrays()V
-HSPLcom/android/server/display/DisplayDeviceConfig;->constraintInRangeIfNeeded([F)[F
-HSPLcom/android/server/display/DisplayDeviceConfig;->convertInterpolationType(Ljava/lang/String;)I
-HSPLcom/android/server/display/DisplayDeviceConfig;->convertThermalStatus(Lcom/android/server/display/config/ThermalStatus;)I
-HSPLcom/android/server/display/DisplayDeviceConfig;->copyUninitializedValuesFromSecondaryConfig(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->create(Landroid/content/Context;JZLcom/android/server/display/feature/DisplayManagerFlags;)Lcom/android/server/display/DisplayDeviceConfig;
-HSPLcom/android/server/display/DisplayDeviceConfig;->createBacklightConversionSplines()V
-HSPLcom/android/server/display/DisplayDeviceConfig;->createWithoutDefaultValues(Landroid/content/Context;JZLcom/android/server/display/feature/DisplayManagerFlags;)Lcom/android/server/display/DisplayDeviceConfig;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getAmbientLightSensor()Lcom/android/server/display/config/SensorData;
 HSPLcom/android/server/display/DisplayDeviceConfig;->getBacklightFromBrightness(F)F+]Landroid/util/Spline;Landroid/util/Spline$MonotoneCubicSpline;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getBrightnessDefault()F
-HSPLcom/android/server/display/DisplayDeviceConfig;->getBrightnessLevelAndPercentage(Lcom/android/server/display/config/BrightnessThresholds;II[F[F)Landroid/util/Pair;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getBrightnessLevelAndPercentage(Lcom/android/server/display/config/BrightnessThresholds;II[F[FZ)Landroid/util/Pair;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getConfigFromSuffix(Landroid/content/Context;Ljava/io/File;Ljava/lang/String;JLcom/android/server/display/feature/DisplayManagerFlags;)Lcom/android/server/display/DisplayDeviceConfig;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getDefaultHighBlockingZoneRefreshRate()I
-HSPLcom/android/server/display/DisplayDeviceConfig;->getDefaultLowBlockingZoneRefreshRate()I
-HSPLcom/android/server/display/DisplayDeviceConfig;->getDefaultPeakRefreshRate()I
-HSPLcom/android/server/display/DisplayDeviceConfig;->getDefaultRefreshRate()I
-HSPLcom/android/server/display/DisplayDeviceConfig;->getDefaultRefreshRateInHbmHdr()I
-HSPLcom/android/server/display/DisplayDeviceConfig;->getDefaultRefreshRateInHbmSunlight()I
-HSPLcom/android/server/display/DisplayDeviceConfig;->getDensityMapping()Lcom/android/server/display/DensityMapping;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getFirstExistingFile(Ljava/util/Collection;)Ljava/io/File;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getFloatArray(Landroid/content/res/TypedArray;F)[F
-HSPLcom/android/server/display/DisplayDeviceConfig;->getHighAmbientBrightnessThresholds()[F
-HSPLcom/android/server/display/DisplayDeviceConfig;->getHighBlockingZoneThermalMap()Landroid/util/SparseArray;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getHighBrightnessModeData()Lcom/android/server/display/DisplayDeviceConfig$HighBrightnessModeData;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getHighDisplayBrightnessThresholds()[F
-HSPLcom/android/server/display/DisplayDeviceConfig;->getLowAmbientBrightnessThresholds()[F
-HSPLcom/android/server/display/DisplayDeviceConfig;->getLowBlockingZoneThermalMap()Landroid/util/SparseArray;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getLowDisplayBrightnessThresholds()[F
-HSPLcom/android/server/display/DisplayDeviceConfig;->getLuxLevels([I)[F
-HSPLcom/android/server/display/DisplayDeviceConfig;->getName()Ljava/lang/String;
+HSPLcom/android/server/display/DisplayDeviceConfig;->getHighBrightnessModeData()Lcom/android/server/display/DisplayDeviceConfig$HighBrightnessModeData;+]Lcom/android/server/display/DisplayDeviceConfig$HighBrightnessModeData;Lcom/android/server/display/DisplayDeviceConfig$HighBrightnessModeData;
 HSPLcom/android/server/display/DisplayDeviceConfig;->getNitsFromBacklight(F)F+]Landroid/util/Spline;Landroid/util/Spline$MonotoneCubicSpline;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getRefreshRange(Ljava/lang/String;)Landroid/view/SurfaceControl$RefreshRateRange;
-HSPLcom/android/server/display/DisplayDeviceConfig;->getThermalRefreshRateThrottlingData(Ljava/lang/String;)Landroid/util/SparseArray;
-HSPLcom/android/server/display/DisplayDeviceConfig;->hasQuirk(Ljava/lang/String;)Z
-HSPLcom/android/server/display/DisplayDeviceConfig;->initFromFile(Ljava/io/File;)Z
-HSPLcom/android/server/display/DisplayDeviceConfig;->isAllInRange([FFF)Z
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadAmbientBrightnessThresholds(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadAmbientBrightnessThresholdsIdle(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadAmbientHorizonFromDdc(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadAutoBrightnessBrighteningLightDebounce(Lcom/android/server/display/config/AutoBrightness;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadAutoBrightnessBrighteningLightDebounceIdle(Lcom/android/server/display/config/AutoBrightness;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadAutoBrightnessConfigValues(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadAutoBrightnessDarkeningLightDebounce(Lcom/android/server/display/config/AutoBrightness;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadAutoBrightnessDarkeningLightDebounceIdle(Lcom/android/server/display/config/AutoBrightness;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadBrightnessCapForWearBedtimeMode(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadBrightnessCapForWearBedtimeModeFromConfigXml()V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadBrightnessChangeThresholds(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadBrightnessConstraintsFromConfigXml()V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadBrightnessDefaultFromDdcXml(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadBrightnessMap(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadBrightnessRamps(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadBrightnessRampsIdle(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadBrightnessRampsInteractive(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadConfigFromDirectory(Landroid/content/Context;Ljava/io/File;JLcom/android/server/display/feature/DisplayManagerFlags;)Lcom/android/server/display/DisplayDeviceConfig;
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadDefaultConfigurationXml(Landroid/content/Context;)Lcom/android/server/display/config/DisplayConfiguration;
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadDefaultRefreshRate(Lcom/android/server/display/config/RefreshRateConfigs;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadDefaultRefreshRateInHbm(Lcom/android/server/display/config/RefreshRateConfigs;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadDensityMapping(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadDisplayBrightnessThresholds(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadDisplayBrightnessThresholdsIdle(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadEnableAutoBrightness(Lcom/android/server/display/config/AutoBrightness;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadHighBrightnessModeData(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadHigherBlockingZoneDefaultRefreshRate(Lcom/android/server/display/config/BlockingZoneConfig;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadHigherBrightnessThresholds(Lcom/android/server/display/config/BlockingZoneConfig;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadHigherRefreshRateBlockingZones(Lcom/android/server/display/config/BlockingZoneConfig;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadLowerBlockingZoneDefaultRefreshRate(Lcom/android/server/display/config/BlockingZoneConfig;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadLowerBrightnessThresholds(Lcom/android/server/display/config/BlockingZoneConfig;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadLowerRefreshRateBlockingZones(Lcom/android/server/display/config/BlockingZoneConfig;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadLuxThrottling(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadName(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadPeakDefaultRefreshRate(Lcom/android/server/display/config/RefreshRateConfigs;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadPowerThrottlingConfigData(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadQuirks(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadRefreshRateSetting(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadRefreshRateZoneProfiles(Lcom/android/server/display/config/RefreshRateConfigs;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadScreenOffBrightnessSensorValueToLuxFromDdc(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadSdrHdrRatioMap(Lcom/android/server/display/config/HighBrightnessMode;)Landroid/util/Spline;
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadThermalBrightnessThrottlingMaps(Lcom/android/server/display/config/ThermalThrottling;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadThermalRefreshRateThrottlingMap(Lcom/android/server/display/config/ThermalThrottling;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadThermalThrottlingConfig(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->loadUsiVersion(Lcom/android/server/display/config/DisplayConfiguration;)V
-HSPLcom/android/server/display/DisplayDeviceConfig;->rawBacklightToNits(IF)F
-HSPLcom/android/server/display/DisplayDeviceConfig;->thermalStatusIsValid(Lcom/android/server/display/config/ThermalStatus;)Z
 HSPLcom/android/server/display/DisplayDeviceInfo;-><init>()V
 HSPLcom/android/server/display/DisplayDeviceInfo;->diff(Lcom/android/server/display/DisplayDeviceInfo;)I
 HSPLcom/android/server/display/DisplayDeviceInfo;->equals(Ljava/lang/Object;)Z
 HSPLcom/android/server/display/DisplayDeviceInfo;->flagsToString(I)Ljava/lang/String;
 HSPLcom/android/server/display/DisplayDeviceInfo;->toString()Ljava/lang/String;
-HSPLcom/android/server/display/DisplayDeviceInfo;->touchToString(I)Ljava/lang/String;
-HSPLcom/android/server/display/DisplayDeviceRepository;-><clinit>()V
-HSPLcom/android/server/display/DisplayDeviceRepository;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Lcom/android/server/display/PersistentDataStore;)V
-HSPLcom/android/server/display/DisplayDeviceRepository;->addListener(Lcom/android/server/display/DisplayDeviceRepository$Listener;)V
-HSPLcom/android/server/display/DisplayDeviceRepository;->containsLocked(Lcom/android/server/display/DisplayDevice;)Z
+HSPLcom/android/server/display/DisplayDeviceRepository;->containsLocked(Lcom/android/server/display/DisplayDevice;)Z+]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/display/DisplayDeviceRepository;->getByAddressLocked(Landroid/view/DisplayAddress;)Lcom/android/server/display/DisplayDevice;
-HSPLcom/android/server/display/DisplayDeviceRepository;->handleDisplayDeviceAdded(Lcom/android/server/display/DisplayDevice;)V
-HSPLcom/android/server/display/DisplayDeviceRepository;->handleDisplayDeviceChanged(Lcom/android/server/display/DisplayDevice;)V
+HSPLcom/android/server/display/DisplayDeviceRepository;->handleDisplayDeviceChanged(Lcom/android/server/display/DisplayDevice;)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/display/DisplayDeviceRepository;->onDisplayDeviceEvent(Lcom/android/server/display/DisplayDevice;I)V
-HSPLcom/android/server/display/DisplayDeviceRepository;->onTraversalRequested()V
 HSPLcom/android/server/display/DisplayDeviceRepository;->sendChangedEventLocked(Lcom/android/server/display/DisplayDevice;I)V+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/display/DisplayDeviceRepository$Listener;Lcom/android/server/display/LogicalDisplayMapper;
-HSPLcom/android/server/display/DisplayDeviceRepository;->sendEventLocked(Lcom/android/server/display/DisplayDevice;I)V
-HSPLcom/android/server/display/DisplayGroup;-><init>(I)V
-HSPLcom/android/server/display/DisplayGroup;->addDisplayLocked(Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/DisplayGroup;->containsLocked(Lcom/android/server/display/LogicalDisplay;)Z
-HSPLcom/android/server/display/DisplayGroup;->getChangeCountLocked()I
-HSPLcom/android/server/display/DisplayGroup;->getIdLocked(I)I
-HSPLcom/android/server/display/DisplayGroup;->getSizeLocked()I
-HSPLcom/android/server/display/DisplayGroup;->isEmptyLocked()Z
-HSPLcom/android/server/display/DisplayInfoProxy;-><init>(Landroid/view/DisplayInfo;)V
+HSPLcom/android/server/display/DisplayGroup;->containsLocked(Lcom/android/server/display/LogicalDisplay;)Z+]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/display/DisplayGroup;->getIdLocked(I)I+]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/display/DisplayGroup;->getSizeLocked()I+]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/display/DisplayGroup;->isEmptyLocked()Z+]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/display/DisplayInfoProxy;->get()Landroid/view/DisplayInfo;
 HSPLcom/android/server/display/DisplayInfoProxy;->set(Landroid/view/DisplayInfo;)V
-HSPLcom/android/server/display/DisplayManagerService$$ExternalSyntheticLambda2;-><init>(Lcom/android/server/display/DisplayManagerService;Landroid/util/SparseArray;Landroid/view/SurfaceControl$Transaction;)V
 HSPLcom/android/server/display/DisplayManagerService$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/display/DisplayManagerService$1;-><init>(Lcom/android/server/display/DisplayManagerService;)V
 HSPLcom/android/server/display/DisplayManagerService$1;->requestDisplayState(IIFF)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;Lcom/android/server/power/PowerManagerService$1;
-HSPLcom/android/server/display/DisplayManagerService$2;-><init>(Lcom/android/server/display/DisplayManagerService;)V
-HSPLcom/android/server/display/DisplayManagerService$BinderService;-><init>(Lcom/android/server/display/DisplayManagerService;)V
 HSPLcom/android/server/display/DisplayManagerService$BinderService;->getBrightness(I)F
 HSPLcom/android/server/display/DisplayManagerService$BinderService;->getBrightnessInfo(I)Landroid/hardware/display/BrightnessInfo;+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Landroid/hardware/display/IDisplayManager$Stub;Lcom/android/server/display/DisplayManagerService$BinderService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/display/DisplayPowerControllerInterface;Lcom/android/server/display/DisplayPowerController;
 HSPLcom/android/server/display/DisplayManagerService$BinderService;->getDisplayIds(Z)[I+]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;
@@ -3613,129 +2936,80 @@
 HSPLcom/android/server/display/DisplayManagerService$BinderService;->getOverlaySupport()Landroid/hardware/OverlayProperties;
 HSPLcom/android/server/display/DisplayManagerService$BinderService;->getPreferredWideGamutColorSpaceId()I
 HSPLcom/android/server/display/DisplayManagerService$BinderService;->registerCallbackWithEventMask(Landroid/hardware/display/IDisplayManagerCallback;J)V
-HSPLcom/android/server/display/DisplayManagerService$BrightnessPair;-><init>(Lcom/android/server/display/DisplayManagerService;FF)V
 HSPLcom/android/server/display/DisplayManagerService$CallbackRecord;->notifyDisplayEventAsync(II)Z+]Lcom/android/server/display/DisplayManagerService$CallbackRecord;Lcom/android/server/display/DisplayManagerService$CallbackRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/hardware/display/IDisplayManagerCallback;Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;,Landroid/hardware/display/IDisplayManagerCallback$Stub$Proxy;
 HSPLcom/android/server/display/DisplayManagerService$CallbackRecord;->shouldSendEvent(I)Z+]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong;
-HSPLcom/android/server/display/DisplayManagerService$DisplayManagerHandler;-><init>(Lcom/android/server/display/DisplayManagerService;Landroid/os/Looper;)V
-HSPLcom/android/server/display/DisplayManagerService$DisplayManagerHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/input/InputManagerInternal;Lcom/android/server/input/InputManagerService$LocalService;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/wm/WindowManagerInternal;Lcom/android/server/wm/WindowManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/hardware/display/DisplayViewport;Landroid/hardware/display/DisplayViewport;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HSPLcom/android/server/display/DisplayManagerService$ExternalDisplayPolicyInjector;-><init>(Lcom/android/server/display/DisplayManagerService;)V
-HSPLcom/android/server/display/DisplayManagerService$ExternalDisplayPolicyInjector;-><init>(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService$ExternalDisplayPolicyInjector-IA;)V
-HSPLcom/android/server/display/DisplayManagerService$ExternalDisplayPolicyInjector;->getDisplayNotificationManager()Lcom/android/server/display/notifications/DisplayNotificationManager;
-HSPLcom/android/server/display/DisplayManagerService$ExternalDisplayPolicyInjector;->getFlags()Lcom/android/server/display/feature/DisplayManagerFlags;
-HSPLcom/android/server/display/DisplayManagerService$ExternalDisplayPolicyInjector;->getHandler()Landroid/os/Handler;
-HSPLcom/android/server/display/DisplayManagerService$ExternalDisplayPolicyInjector;->getLogicalDisplayMapper()Lcom/android/server/display/LogicalDisplayMapper;
-HSPLcom/android/server/display/DisplayManagerService$ExternalDisplayPolicyInjector;->getSyncRoot()Lcom/android/server/display/DisplayManagerService$SyncRoot;
-HSPLcom/android/server/display/DisplayManagerService$Injector;-><init>()V
-HSPLcom/android/server/display/DisplayManagerService$Injector;->getDefaultDisplayDelayTimeout()J
-HSPLcom/android/server/display/DisplayManagerService$Injector;->getFlags()Lcom/android/server/display/feature/DisplayManagerFlags;
-HSPLcom/android/server/display/DisplayManagerService$Injector;->getLocalDisplayAdapter(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/notifications/DisplayNotificationManager;)Lcom/android/server/display/LocalDisplayAdapter;
-HSPLcom/android/server/display/DisplayManagerService$Injector;->getVirtualDisplayAdapter(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Lcom/android/server/display/feature/DisplayManagerFlags;)Lcom/android/server/display/VirtualDisplayAdapter;
-HSPLcom/android/server/display/DisplayManagerService$LocalService;-><init>(Lcom/android/server/display/DisplayManagerService;)V
-HSPLcom/android/server/display/DisplayManagerService$LocalService;->getDisplayIdToMirror(I)I+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;
+HSPLcom/android/server/display/DisplayManagerService$DesiredDisplayModeSpecsObserver;->onDesiredDisplayModeSpecsChanged()V
+HSPLcom/android/server/display/DisplayManagerService$DisplayManagerHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/input/InputManagerInternal;Lcom/android/server/input/InputManagerService$LocalService;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/wm/WindowManagerInternal;Lcom/android/server/wm/WindowManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Landroid/hardware/display/DisplayViewport;Landroid/hardware/display/DisplayViewport;
+HSPLcom/android/server/display/DisplayManagerService$LocalService;->getDisplayIdToMirror(I)I+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;,Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;
 HSPLcom/android/server/display/DisplayManagerService$LocalService;->getDisplayInfo(I)Landroid/view/DisplayInfo;
 HSPLcom/android/server/display/DisplayManagerService$LocalService;->getRefreshRateSwitchingType()I+]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;
 HSPLcom/android/server/display/DisplayManagerService$LocalService;->performTraversal(Landroid/view/SurfaceControl$Transaction;Landroid/util/SparseArray;)V+]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;
-HSPLcom/android/server/display/DisplayManagerService$LocalService;->requestPowerState(ILandroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayPowerControllerInterface;Lcom/android/server/display/DisplayPowerController;]Lcom/android/server/display/DisplayGroup;Lcom/android/server/display/DisplayGroup;
+HSPLcom/android/server/display/DisplayManagerService$LocalService;->requestPowerState(ILandroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;,Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayPowerControllerInterface;Lcom/android/server/display/DisplayPowerController;]Lcom/android/server/display/DisplayGroup;Lcom/android/server/display/DisplayGroup;
 HSPLcom/android/server/display/DisplayManagerService$LocalService;->setDisplayProperties(IZFIFFZZZ)V+]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;
-HSPLcom/android/server/display/DisplayManagerService$LogicalDisplayListener;-><init>(Lcom/android/server/display/DisplayManagerService;)V
-HSPLcom/android/server/display/DisplayManagerService$LogicalDisplayListener;-><init>(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService$LogicalDisplayListener-IA;)V
-HSPLcom/android/server/display/DisplayManagerService$LogicalDisplayListener;->onDisplayGroupEventLocked(II)V
 HSPLcom/android/server/display/DisplayManagerService$LogicalDisplayListener;->onLogicalDisplayEventLocked(Lcom/android/server/display/LogicalDisplay;I)V
-HSPLcom/android/server/display/DisplayManagerService$LogicalDisplayListener;->onTraversalRequested()V
 HPLcom/android/server/display/DisplayManagerService$PendingCallback;->addDisplayEvent(II)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/display/DisplayManagerService$PendingCallback;->sendPendingDisplayEvent()V
-HSPLcom/android/server/display/DisplayManagerService$SyncRoot;-><init>()V
-HSPLcom/android/server/display/DisplayManagerService$UidImportanceListener;-><init>(Lcom/android/server/display/DisplayManagerService;)V
-HSPLcom/android/server/display/DisplayManagerService$UidImportanceListener;-><init>(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService$UidImportanceListener-IA;)V
+HSPLcom/android/server/display/DisplayManagerService$PendingCallback;->sendPendingDisplayEvent()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/display/DisplayManagerService$UidImportanceListener;->onUidImportance(II)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayManagerService$PendingCallback;Lcom/android/server/display/DisplayManagerService$PendingCallback;
-HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$fgetmDisplayNotificationManager(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/notifications/DisplayNotificationManager;
 HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$fgetmDisplayPowerControllers(Lcom/android/server/display/DisplayManagerService;)Landroid/util/SparseArray;
-HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$fgetmDisplayStates(Lcom/android/server/display/DisplayManagerService;)Landroid/util/SparseIntArray;
-HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$fgetmFlags(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/feature/DisplayManagerFlags;
-HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$fgetmHandler(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/DisplayManagerService$DisplayManagerHandler;
 HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$fgetmLogicalDisplayMapper(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/LogicalDisplayMapper;
 HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$fgetmSyncRoot(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/DisplayManagerService$SyncRoot;
 HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$mdeliverDisplayEvent(Lcom/android/server/display/DisplayManagerService;ILandroid/util/ArraySet;I)V
-HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$mdeliverDisplayGroupEvent(Lcom/android/server/display/DisplayManagerService;II)V
 HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$mgetDisplayInfoInternal(Lcom/android/server/display/DisplayManagerService;II)Landroid/view/DisplayInfo;+]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;
-HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$mhandleLogicalDisplayAddedLocked(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$mhandleLogicalDisplayConnectedLocked(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$mregisterDefaultDisplayAdapters(Lcom/android/server/display/DisplayManagerService;)V
-HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$mscheduleTraversalLocked(Lcom/android/server/display/DisplayManagerService;Z)V
-HSPLcom/android/server/display/DisplayManagerService;->-$$Nest$msendDisplayGroupEvent(Lcom/android/server/display/DisplayManagerService;II)V
-HSPLcom/android/server/display/DisplayManagerService;-><clinit>()V
-HSPLcom/android/server/display/DisplayManagerService;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/display/DisplayManagerService;-><init>(Landroid/content/Context;Lcom/android/server/display/DisplayManagerService$Injector;)V
-HSPLcom/android/server/display/DisplayManagerService;->addDisplayPowerControllerLocked(Lcom/android/server/display/LogicalDisplay;)Lcom/android/server/display/DisplayPowerControllerInterface;
-HSPLcom/android/server/display/DisplayManagerService;->applyDisplayChangedLocked(Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/DisplayManagerService;->clampBrightness(IF)F
-HSPLcom/android/server/display/DisplayManagerService;->configureColorModeLocked(Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/DisplayDevice;)V
-HSPLcom/android/server/display/DisplayManagerService;->configureDisplayLocked(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/display/DisplayDevice;)V
-HSPLcom/android/server/display/DisplayManagerService;->configurePreferredDisplayModeLocked(Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/DisplayManagerService;->deliverDisplayEvent(ILandroid/util/ArraySet;I)V+]Lcom/android/server/display/DisplayManagerService$CallbackRecord;Lcom/android/server/display/DisplayManagerService$CallbackRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/display/DisplayManagerService$PendingCallback;Lcom/android/server/display/DisplayManagerService$PendingCallback;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;
-HSPLcom/android/server/display/DisplayManagerService;->deliverDisplayGroupEvent(II)V
+HSPLcom/android/server/display/DisplayManagerService;->applyDisplayChangedLocked(Lcom/android/server/display/LogicalDisplay;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayPowerControllerInterface;Lcom/android/server/display/DisplayPowerController;]Lcom/android/server/display/HighBrightnessModeMetadataMapper;Lcom/android/server/display/HighBrightnessModeMetadataMapper;
+HSPLcom/android/server/display/DisplayManagerService;->configureDisplayLocked(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/display/DisplayDevice;)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;
+HSPLcom/android/server/display/DisplayManagerService;->deliverDisplayEvent(ILandroid/util/ArraySet;I)V+]Lcom/android/server/display/DisplayManagerService$CallbackRecord;Lcom/android/server/display/DisplayManagerService$CallbackRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayManagerService$PendingCallback;Lcom/android/server/display/DisplayManagerService$PendingCallback;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/display/DisplayManagerService;->extraLogging(Ljava/lang/String;)Z
 HSPLcom/android/server/display/DisplayManagerService;->getDisplayInfoForFrameRateOverride([Landroid/view/DisplayEventReceiver$FrameRateOverride;Landroid/view/DisplayInfo;I)Landroid/view/DisplayInfo;+]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;
 HSPLcom/android/server/display/DisplayManagerService;->getDisplayInfoInternal(II)Landroid/view/DisplayInfo;+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;
-HSPLcom/android/server/display/DisplayManagerService;->getFloatArray(Landroid/content/res/TypedArray;)[F
-HSPLcom/android/server/display/DisplayManagerService;->getNonOverrideDisplayInfoInternal(ILandroid/view/DisplayInfo;)V
+HSPLcom/android/server/display/DisplayManagerService;->getNonOverrideDisplayInfoInternal(ILandroid/view/DisplayInfo;)V+]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;
 HSPLcom/android/server/display/DisplayManagerService;->getOverlaySupportInternal()Landroid/hardware/OverlayProperties;
 HSPLcom/android/server/display/DisplayManagerService;->getPreferredWideGamutColorSpaceIdInternal()I
 HSPLcom/android/server/display/DisplayManagerService;->getRefreshRateSwitchingTypeInternal()I+]Lcom/android/server/display/mode/DisplayModeDirector;Lcom/android/server/display/mode/DisplayModeDirector;
-HSPLcom/android/server/display/DisplayManagerService;->getViewportLocked(ILjava/lang/String;)Landroid/hardware/display/DisplayViewport;
+HSPLcom/android/server/display/DisplayManagerService;->getViewportLocked(ILjava/lang/String;)Landroid/hardware/display/DisplayViewport;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/display/DisplayManagerService;->getViewportType(Lcom/android/server/display/DisplayDeviceInfo;)Ljava/util/Optional;
-HSPLcom/android/server/display/DisplayManagerService;->handleLogicalDisplayAddedLocked(Lcom/android/server/display/LogicalDisplay;)V
 HSPLcom/android/server/display/DisplayManagerService;->handleLogicalDisplayChangedLocked(Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/DisplayManagerService;->handleLogicalDisplayConnectedLocked(Lcom/android/server/display/LogicalDisplay;)V
 HSPLcom/android/server/display/DisplayManagerService;->isMinimalPostProcessingAllowed()Z
-HSPLcom/android/server/display/DisplayManagerService;->isUidCached(I)Z
-HSPLcom/android/server/display/DisplayManagerService;->lambda$performTraversalLocked$11(Landroid/util/SparseArray;Landroid/view/SurfaceControl$Transaction;Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/DisplayManagerService;->loadStableDisplayValuesLocked()V
-HSPLcom/android/server/display/DisplayManagerService;->notifyDefaultDisplayDeviceUpdated(Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/DisplayManagerService;->onBootPhase(I)V
-HSPLcom/android/server/display/DisplayManagerService;->onStart()V
+HSPLcom/android/server/display/DisplayManagerService;->isUidCached(I)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
+HSPLcom/android/server/display/DisplayManagerService;->lambda$performTraversalLocked$11(Landroid/util/SparseArray;Landroid/view/SurfaceControl$Transaction;Lcom/android/server/display/LogicalDisplay;)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/display/DisplayManagerService;->performTraversalInternal(Landroid/view/SurfaceControl$Transaction;Landroid/util/SparseArray;)V+]Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;Lcom/android/server/display/ColorFade$NaturalSurfaceLayout;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;
-HSPLcom/android/server/display/DisplayManagerService;->performTraversalLocked(Landroid/view/SurfaceControl$Transaction;Landroid/util/SparseArray;)V
+HSPLcom/android/server/display/DisplayManagerService;->performTraversalLocked(Landroid/view/SurfaceControl$Transaction;Landroid/util/SparseArray;)V+]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;
 HSPLcom/android/server/display/DisplayManagerService;->populateViewportLocked(IILcom/android/server/display/DisplayDevice;Lcom/android/server/display/DisplayDeviceInfo;)V
-HSPLcom/android/server/display/DisplayManagerService;->recordStableDisplayStatsIfNeededLocked(Lcom/android/server/display/LogicalDisplay;)V
 HSPLcom/android/server/display/DisplayManagerService;->recordTopInsetLocked(Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/DisplayManagerService;->registerDefaultDisplayAdapters()V
-HSPLcom/android/server/display/DisplayManagerService;->registerDisplayAdapterLocked(Lcom/android/server/display/DisplayAdapter;)V
+HSPLcom/android/server/display/DisplayManagerService;->registerCallbackInternal(Landroid/hardware/display/IDisplayManagerCallback;IIJ)V
 HSPLcom/android/server/display/DisplayManagerService;->requestDisplayStateInternal(IIFF)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Ljava/lang/Runnable;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;
 HSPLcom/android/server/display/DisplayManagerService;->scheduleTraversalLocked(Z)V
 HSPLcom/android/server/display/DisplayManagerService;->sendDisplayEventIfEnabledLocked(Lcom/android/server/display/LogicalDisplay;I)V
 HSPLcom/android/server/display/DisplayManagerService;->sendDisplayEventLocked(Lcom/android/server/display/LogicalDisplay;I)V
-HSPLcom/android/server/display/DisplayManagerService;->sendDisplayGroupEvent(II)V
 HSPLcom/android/server/display/DisplayManagerService;->setDisplayPropertiesInternal(IZFIFFZZZ)V+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/display/mode/DisplayModeDirector;Lcom/android/server/display/mode/DisplayModeDirector;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;
-HSPLcom/android/server/display/DisplayManagerService;->setupLogicalDisplay(Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/DisplayManagerService;->updateDisplayStateLocked(Lcom/android/server/display/DisplayDevice;)Ljava/lang/Runnable;+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/display/DisplayManagerService;->updateLogicalDisplayState(Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/DisplayManagerService;->updateViewportPowerStateLocked(Lcom/android/server/display/LogicalDisplay;)V
+HSPLcom/android/server/display/DisplayManagerService;->updateDisplayStateLocked(Lcom/android/server/display/DisplayDevice;)Ljava/lang/Runnable;+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;,Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/display/DisplayManagerService;->updateViewportPowerStateLocked(Lcom/android/server/display/LogicalDisplay;)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/display/DisplayPowerController$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayDevice;Ljava/lang/String;Lcom/android/server/display/DisplayDeviceConfig;Ljava/lang/String;Landroid/os/IBinder;Lcom/android/server/display/DisplayDeviceInfo;Lcom/android/server/display/HighBrightnessModeMetadata;ZZZLjava/lang/String;)V
 HSPLcom/android/server/display/DisplayPowerController$$ExternalSyntheticLambda1;->run()V
 HSPLcom/android/server/display/DisplayPowerController$CachedBrightnessInfo;->checkAndSetFloat(Landroid/util/MutableFloat;F)Z
-HSPLcom/android/server/display/DisplayPowerController$DisplayControllerHandler;->handleMessage(Landroid/os/Message;)V
+HSPLcom/android/server/display/DisplayPowerController$DisplayControllerHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/display/BrightnessTracker;Lcom/android/server/display/BrightnessTracker;]Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;
 HSPLcom/android/server/display/DisplayPowerController$Injector$$ExternalSyntheticLambda0;->uptimeMillis()J
-HSPLcom/android/server/display/DisplayPowerController;->animateScreenBrightness(FFFZ)V
+HSPLcom/android/server/display/DisplayPowerController;->animateScreenBrightness(FFFZ)V+]Lcom/android/server/display/RampAnimator$DualRampAnimator;Lcom/android/server/display/RampAnimator$DualRampAnimator;
 HSPLcom/android/server/display/DisplayPowerController;->animateScreenStateChange(IZ)V
-HSPLcom/android/server/display/DisplayPowerController;->clampScreenBrightness(F)F
+HSPLcom/android/server/display/DisplayPowerController;->clampScreenBrightness(F)F+]Lcom/android/server/display/BrightnessRangeController;Lcom/android/server/display/BrightnessRangeController;
 HSPLcom/android/server/display/DisplayPowerController;->getBrightnessInfo()Landroid/hardware/display/BrightnessInfo;
 HSPLcom/android/server/display/DisplayPowerController;->getScreenBrightnessSetting()F
-HSPLcom/android/server/display/DisplayPowerController;->lambda$onDisplayChanged$4(Lcom/android/server/display/DisplayDevice;Ljava/lang/String;Lcom/android/server/display/DisplayDeviceConfig;Ljava/lang/String;Landroid/os/IBinder;Lcom/android/server/display/DisplayDeviceInfo;Lcom/android/server/display/HighBrightnessModeMetadata;ZZZLjava/lang/String;)V
-HSPLcom/android/server/display/DisplayPowerController;->logBrightnessEvent(Lcom/android/server/display/brightness/BrightnessEvent;F)V
+HSPLcom/android/server/display/DisplayPowerController;->lambda$onDisplayChanged$4(Lcom/android/server/display/DisplayDevice;Ljava/lang/String;Lcom/android/server/display/DisplayDeviceConfig;Ljava/lang/String;Landroid/os/IBinder;Lcom/android/server/display/DisplayDeviceInfo;Lcom/android/server/display/HighBrightnessModeMetadata;ZZZLjava/lang/String;)V+]Lcom/android/server/display/brightness/clamper/BrightnessClamperController;Lcom/android/server/display/brightness/clamper/BrightnessClamperController;
+HSPLcom/android/server/display/DisplayPowerController;->logBrightnessEvent(Lcom/android/server/display/brightness/BrightnessEvent;F)V+]Lcom/android/server/display/brightness/clamper/BrightnessClamperController;Lcom/android/server/display/brightness/clamper/BrightnessClamperController;
 HSPLcom/android/server/display/DisplayPowerController;->noteScreenBrightness(F)V
-HSPLcom/android/server/display/DisplayPowerController;->notifyBrightnessTrackerChanged(FZZZZZ)V
-HSPLcom/android/server/display/DisplayPowerController;->onDisplayChanged(Lcom/android/server/display/HighBrightnessModeMetadata;I)V
+HSPLcom/android/server/display/DisplayPowerController;->notifyBrightnessTrackerChanged(FZZZZZ)V+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/BrightnessTracker;Lcom/android/server/display/BrightnessTracker;
+HSPLcom/android/server/display/DisplayPowerController;->onDisplayChanged(Lcom/android/server/display/HighBrightnessModeMetadata;I)V+]Lcom/android/server/display/DisplayPowerController$Clock;Lcom/android/server/display/DisplayPowerController$Injector$$ExternalSyntheticLambda0;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;
 HSPLcom/android/server/display/DisplayPowerController;->postBrightnessChangeRunnable()V
 HSPLcom/android/server/display/DisplayPowerController;->requestPowerState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z+]Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;]Lcom/android/server/display/DisplayPowerProximityStateController;Lcom/android/server/display/DisplayPowerProximityStateController;]Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController;
-HSPLcom/android/server/display/DisplayPowerController;->saveBrightnessInfo(FFLcom/android/server/display/DisplayBrightnessState;)Z
+HSPLcom/android/server/display/DisplayPowerController;->saveBrightnessInfo(FFLcom/android/server/display/DisplayBrightnessState;)Z+]Lcom/android/server/display/BrightnessRangeController;Lcom/android/server/display/BrightnessRangeController;]Lcom/android/server/display/brightness/clamper/BrightnessClamperController;Lcom/android/server/display/brightness/clamper/BrightnessClamperController;]Lcom/android/server/display/DisplayPowerController$CachedBrightnessInfo;Lcom/android/server/display/DisplayPowerController$CachedBrightnessInfo;
 HSPLcom/android/server/display/DisplayPowerController;->sendOnStateChangedWithWakelock()V
-HSPLcom/android/server/display/DisplayPowerController;->sendUpdatePowerStateLocked()V
+HSPLcom/android/server/display/DisplayPowerController;->sendUpdatePowerState()V
+HSPLcom/android/server/display/DisplayPowerController;->sendUpdatePowerStateLocked()V+]Lcom/android/server/display/DisplayPowerController$Clock;Lcom/android/server/display/DisplayPowerController$Injector$$ExternalSyntheticLambda0;
 HSPLcom/android/server/display/DisplayPowerController;->setAnimatorRampSpeeds(Z)V
 HSPLcom/android/server/display/DisplayPowerController;->setAutomaticScreenBrightnessMode(I)V
-HSPLcom/android/server/display/DisplayPowerController;->setScreenState(IZ)Z
+HSPLcom/android/server/display/DisplayPowerController;->setScreenState(IZ)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;
 HSPLcom/android/server/display/DisplayPowerController;->updatePowerState()V
-HSPLcom/android/server/display/DisplayPowerController;->updatePowerStateInternal()V
+HSPLcom/android/server/display/DisplayPowerController;->updatePowerStateInternal()V+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/BrightnessRangeController;Lcom/android/server/display/BrightnessRangeController;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags;]Lcom/android/server/display/brightness/clamper/BrightnessClamperController;Lcom/android/server/display/brightness/clamper/BrightnessClamperController;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;]Lcom/android/internal/util/RingBuffer;Lcom/android/internal/util/RingBuffer;]Lcom/android/server/display/RampAnimator$DualRampAnimator;Lcom/android/server/display/RampAnimator$DualRampAnimator;]Lcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;Lcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;]Lcom/android/server/display/state/DisplayStateController;Lcom/android/server/display/state/DisplayStateController;]Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;]Lcom/android/server/display/ScreenOffBrightnessSensorController;Lcom/android/server/display/ScreenOffBrightnessSensorController;
 HSPLcom/android/server/display/DisplayPowerProximityStateController;->setPendingWaitForNegativeProximityLocked(Z)Z
 HSPLcom/android/server/display/DisplayPowerProximityStateController;->updatePendingProximityRequestsLocked()V
 HSPLcom/android/server/display/DisplayPowerProximityStateController;->updateProximityState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;I)V
@@ -3760,87 +3034,39 @@
 HSPLcom/android/server/display/DisplayPowerState;->setScreenBrightness(F)V+]Lcom/android/server/display/DisplayPowerState;Lcom/android/server/display/DisplayPowerState;
 HSPLcom/android/server/display/DisplayPowerState;->setSdrScreenBrightness(F)V+]Lcom/android/server/display/DisplayPowerState;Lcom/android/server/display/DisplayPowerState;
 HSPLcom/android/server/display/DisplayPowerState;->waitUntilClean(Ljava/lang/Runnable;)Z
-HSPLcom/android/server/display/ExternalDisplayPolicy;-><clinit>()V
-HSPLcom/android/server/display/ExternalDisplayPolicy;-><init>(Lcom/android/server/display/ExternalDisplayPolicy$Injector;)V
-HSPLcom/android/server/display/HighBrightnessModeController;->calculateHighBrightnessMode()I
-HSPLcom/android/server/display/HighBrightnessModeController;->calculateRemainingTime(J)J
+HSPLcom/android/server/display/HighBrightnessModeController;->calculateHighBrightnessMode()I+]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;
+HSPLcom/android/server/display/HighBrightnessModeController;->calculateRemainingTime(J)J+]Lcom/android/server/display/HighBrightnessModeMetadata;Lcom/android/server/display/HighBrightnessModeMetadata;]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Lcom/android/server/display/HbmEvent;Lcom/android/server/display/HbmEvent;]Ljava/util/Iterator;Ljava/util/ArrayDeque$DeqIterator;
 HSPLcom/android/server/display/HighBrightnessModeController;->deviceSupportsHbm()Z
-HSPLcom/android/server/display/HighBrightnessModeController;->getCurrentBrightnessMax()F
+HSPLcom/android/server/display/HighBrightnessModeController;->getCurrentBrightnessMax()F+]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;
 HSPLcom/android/server/display/HighBrightnessModeController;->getCurrentBrightnessMin()F
-HSPLcom/android/server/display/HighBrightnessModeController;->getHighBrightnessMode()I
-HSPLcom/android/server/display/HighBrightnessModeController;->getTransitionPoint()F
-HSPLcom/android/server/display/HighBrightnessModeController;->onBrightnessChanged(FFI)V
-HSPLcom/android/server/display/HighBrightnessModeController;->recalculateTimeAllowance()V
-HSPLcom/android/server/display/HighBrightnessModeController;->setAutoBrightnessEnabled(I)V
-HSPLcom/android/server/display/HighBrightnessModeController;->updateHbmMode()V
-HSPLcom/android/server/display/HighBrightnessModeMetadataMapper;-><init>()V
-HSPLcom/android/server/display/HighBrightnessModeMetadataMapper;->getHighBrightnessModeMetadataLocked(Lcom/android/server/display/LogicalDisplay;)Lcom/android/server/display/HighBrightnessModeMetadata;
-HSPLcom/android/server/display/LocalDisplayAdapter$BacklightAdapter;-><init>(Landroid/os/IBinder;ZLcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;)V
-HSPLcom/android/server/display/LocalDisplayAdapter$BacklightAdapter;->setForceSurfaceControl(Z)V
-HSPLcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;-><init>(Landroid/view/SurfaceControl$DisplayMode;[F)V
+HSPLcom/android/server/display/HighBrightnessModeController;->getTransitionPoint()F+]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;
+HSPLcom/android/server/display/HighBrightnessModeController;->onBrightnessChanged(FFI)V+]Lcom/android/server/display/HighBrightnessModeMetadata;Lcom/android/server/display/HighBrightnessModeMetadata;]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;]Lcom/android/server/display/DisplayManagerService$Clock;Lcom/android/server/display/HighBrightnessModeController$Injector$$ExternalSyntheticLambda0;
+HSPLcom/android/server/display/HighBrightnessModeController;->recalculateTimeAllowance()V+]Lcom/android/server/display/HighBrightnessModeMetadata;Lcom/android/server/display/HighBrightnessModeMetadata;]Lcom/android/server/display/DisplayManagerService$Clock;Lcom/android/server/display/HighBrightnessModeController$Injector$$ExternalSyntheticLambda0;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Lcom/android/server/display/HbmEvent;Lcom/android/server/display/HbmEvent;
+HSPLcom/android/server/display/HighBrightnessModeController;->setAutoBrightnessEnabled(I)V+]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;
+HSPLcom/android/server/display/HighBrightnessModeController;->updateHbmMode()V+]Ljava/lang/Runnable;Lcom/android/server/display/DisplayPowerController$$ExternalSyntheticLambda6;
+HSPLcom/android/server/display/HighBrightnessModeMetadataMapper;->getHighBrightnessModeMetadataLocked(Lcom/android/server/display/LogicalDisplay;)Lcom/android/server/display/HighBrightnessModeMetadata;+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;
 HSPLcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;->hasMatchingMode(Landroid/view/SurfaceControl$DisplayMode;)Z
-HSPLcom/android/server/display/LocalDisplayAdapter$Injector;-><init>()V
-HSPLcom/android/server/display/LocalDisplayAdapter$Injector;->createDisplayDeviceConfig(Landroid/content/Context;JZLcom/android/server/display/feature/DisplayManagerFlags;)Lcom/android/server/display/DisplayDeviceConfig;
-HSPLcom/android/server/display/LocalDisplayAdapter$Injector;->getSurfaceControlProxy()Lcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;
-HSPLcom/android/server/display/LocalDisplayAdapter$Injector;->setDisplayEventListenerLocked(Landroid/os/Looper;Lcom/android/server/display/LocalDisplayAdapter$DisplayEventListener;)V
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;-><init>(Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;IIZFFJLcom/android/server/display/DisplayOffloadSessionImpl;Landroid/os/IBinder;)V
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->backlightToNits(F)F+]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->brightnessToBacklight(F)F+]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->handleHdrSdrNitsChanged(FF)V+]Lcom/android/server/display/DisplayAdapter;Lcom/android/server/display/LocalDisplayAdapter;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->run()V+]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->setDisplayBrightness(FF)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/display/LocalDisplayAdapter$BacklightAdapter;Lcom/android/server/display/LocalDisplayAdapter$BacklightAdapter;]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->-$$Nest$fputmBrightnessState(Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;F)V
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;-><clinit>()V
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;-><init>(Lcom/android/server/display/LocalDisplayAdapter;Landroid/os/IBinder;JLandroid/view/SurfaceControl$StaticDisplayInfo;Landroid/view/SurfaceControl$DynamicDisplayInfo;Landroid/view/SurfaceControl$DesiredDisplayModeSpecs;Z)V
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findDisplayModeRecord(Landroid/view/SurfaceControl$DisplayMode;Ljava/util/List;)Lcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findMatchingModeIdLocked(I)I
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findSfDisplayModeIdLocked(II)I
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findUserPreferredModeIdLocked(Landroid/view/Display$Mode;)I
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findMatchingModeIdLocked(I)I+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findSfDisplayModeIdLocked(II)I+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayDeviceConfig()Lcom/android/server/display/DisplayDeviceConfig;
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayDeviceInfoLocked()Lcom/android/server/display/DisplayDeviceInfo;+]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Lcom/android/server/display/LocalDisplayAdapter;Lcom/android/server/display/LocalDisplayAdapter;]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/display/DisplayAdapter;Lcom/android/server/display/LocalDisplayAdapter;
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayModes(Landroid/util/SparseArray;)[Landroid/view/Display$Mode;
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getLogicalDensity()I
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getModeById([Landroid/view/SurfaceControl$DisplayMode;I)Landroid/view/SurfaceControl$DisplayMode;
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getPreferredModeId()I
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->hasStableUniqueId()Z
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->loadDisplayDeviceConfig()V
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayDeviceInfoLocked()Lcom/android/server/display/DisplayDeviceInfo;+]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Lcom/android/server/display/LocalDisplayAdapter;Lcom/android/server/display/LocalDisplayAdapter;]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayModes(Landroid/util/SparseArray;)[Landroid/view/Display$Mode;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getLogicalDensity()I+]Lcom/android/server/display/DensityMapping;Lcom/android/server/display/DensityMapping;]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->requestDisplayStateLocked(IFFLcom/android/server/display/DisplayOffloadSessionImpl;)Ljava/lang/Runnable;+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->setDesiredDisplayModeSpecsLocked(Lcom/android/server/display/mode/DisplayModeDirector$DesiredDisplayModeSpecs;)V
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->setUserPreferredDisplayModeLocked(Landroid/view/Display$Mode;)V
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateActiveModeLocked(IF)Z
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateAllmSupport(Z)Z
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateColorModesLocked([II)Z
 HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateDisplayModesLocked([Landroid/view/SurfaceControl$DisplayMode;IIFLandroid/view/SurfaceControl$DesiredDisplayModeSpecs;)Z
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateDisplayPropertiesLocked(Landroid/view/SurfaceControl$StaticDisplayInfo;Landroid/view/SurfaceControl$DynamicDisplayInfo;Landroid/view/SurfaceControl$DesiredDisplayModeSpecs;)Z
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateGameContentTypeSupport(Z)Z
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateHdrCapabilitiesLocked(Landroid/view/Display$HdrCapabilities;)Z
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateStaticInfo(Landroid/view/SurfaceControl$StaticDisplayInfo;)Z
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayEventListener;-><init>(Lcom/android/server/display/LocalDisplayAdapter;)V
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayEventListener;-><init>(Lcom/android/server/display/LocalDisplayAdapter;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayEventListener-IA;)V
-HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayEventListener;->onModeChanged(JJIJ)V
-HSPLcom/android/server/display/LocalDisplayAdapter$ProxyDisplayEventReceiver;-><init>(Landroid/os/Looper;Lcom/android/server/display/LocalDisplayAdapter$DisplayEventListener;)V
-HSPLcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;-><init>()V
-HSPLcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;->getBootDisplayModeSupport()Z
-HSPLcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;->getDesiredDisplayModeSpecs(Landroid/os/IBinder;)Landroid/view/SurfaceControl$DesiredDisplayModeSpecs;
-HSPLcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;->getDisplayBrightnessSupport(Landroid/os/IBinder;)Z
-HSPLcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;->getDynamicDisplayInfo(J)Landroid/view/SurfaceControl$DynamicDisplayInfo;
-HSPLcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;->getPhysicalDisplayIds()[J
-HSPLcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;->getPhysicalDisplayToken(J)Landroid/os/IBinder;
-HSPLcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;->getStaticDisplayInfo(J)Landroid/view/SurfaceControl$StaticDisplayInfo;
-HSPLcom/android/server/display/LocalDisplayAdapter;->-$$Nest$fgetmInjector(Lcom/android/server/display/LocalDisplayAdapter;)Lcom/android/server/display/LocalDisplayAdapter$Injector;
-HSPLcom/android/server/display/LocalDisplayAdapter;->-$$Nest$fgetmIsBootDisplayModeSupported(Lcom/android/server/display/LocalDisplayAdapter;)Z
-HSPLcom/android/server/display/LocalDisplayAdapter;->-$$Nest$fgetmSurfaceControlProxy(Lcom/android/server/display/LocalDisplayAdapter;)Lcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;
-HSPLcom/android/server/display/LocalDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/notifications/DisplayNotificationManager;)V
-HSPLcom/android/server/display/LocalDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/notifications/DisplayNotificationManager;Lcom/android/server/display/LocalDisplayAdapter$Injector;)V
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayEventListener;->onModeChanged(JJIJ)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
 HSPLcom/android/server/display/LocalDisplayAdapter;->getOverlayContext()Landroid/content/Context;
-HSPLcom/android/server/display/LocalDisplayAdapter;->registerLocked()V
-HSPLcom/android/server/display/LocalDisplayAdapter;->tryConnectDisplayLocked(J)V
-HSPLcom/android/server/display/LogicalDisplay;-><clinit>()V
-HSPLcom/android/server/display/LogicalDisplay;->configureDisplayLocked(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/display/DisplayDevice;Z)V
-HSPLcom/android/server/display/LogicalDisplay;->getDisplayGroupNameLocked()Ljava/lang/String;
+HSPLcom/android/server/display/LogicalDisplay;->configureDisplayLocked(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/display/DisplayDevice;Z)V+]Landroid/graphics/Point;Landroid/graphics/Point;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;
 HSPLcom/android/server/display/LogicalDisplay;->getDisplayIdLocked()I
 HSPLcom/android/server/display/LogicalDisplay;->getDisplayInfoLocked()Landroid/view/DisplayInfo;+]Lcom/android/server/display/DisplayInfoProxy;Lcom/android/server/display/DisplayInfoProxy;
-HSPLcom/android/server/display/LogicalDisplay;->getDisplayOffloadSessionLocked()Lcom/android/server/display/DisplayOffloadSessionImpl;
 HSPLcom/android/server/display/LogicalDisplay;->getFrameRateOverrides()[Landroid/view/DisplayEventReceiver$FrameRateOverride;
 HSPLcom/android/server/display/LogicalDisplay;->getMaskingInsets(Lcom/android/server/display/DisplayDeviceInfo;)Landroid/graphics/Rect;
 HSPLcom/android/server/display/LogicalDisplay;->getNonOverrideDisplayInfoLocked(Landroid/view/DisplayInfo;)V
@@ -3850,674 +3076,213 @@
 HSPLcom/android/server/display/LogicalDisplay;->isDirtyLocked()Z
 HSPLcom/android/server/display/LogicalDisplay;->isEnabledLocked()Z
 HSPLcom/android/server/display/LogicalDisplay;->isValidLocked()Z
-HSPLcom/android/server/display/LogicalDisplay;->setDevicePositionLocked(I)V
-HSPLcom/android/server/display/LogicalDisplay;->setDisplayGroupNameLocked(Ljava/lang/String;)V
-HSPLcom/android/server/display/LogicalDisplay;->setLeadDisplayLocked(I)V
-HSPLcom/android/server/display/LogicalDisplay;->setPowerThrottlingDataIdLocked(Ljava/lang/String;)V
-HSPLcom/android/server/display/LogicalDisplay;->setPrimaryDisplayDeviceLocked(Lcom/android/server/display/DisplayDevice;)Lcom/android/server/display/DisplayDevice;
-HSPLcom/android/server/display/LogicalDisplay;->setRequestedColorModeLocked(I)V
-HSPLcom/android/server/display/LogicalDisplay;->setThermalBrightnessThrottlingDataIdLocked(Ljava/lang/String;)V
-HSPLcom/android/server/display/LogicalDisplay;->swapDisplaysLocked(Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/LogicalDisplay;->updateDisplayGroupIdLocked(I)V
-HSPLcom/android/server/display/LogicalDisplay;->updateFrameRateOverrides(Lcom/android/server/display/DisplayDeviceInfo;)V
-HSPLcom/android/server/display/LogicalDisplay;->updateLayoutLimitedRefreshRateLocked(Landroid/view/SurfaceControl$RefreshRateRange;)V
-HSPLcom/android/server/display/LogicalDisplay;->updateLocked(Lcom/android/server/display/DisplayDeviceRepository;)V
-HSPLcom/android/server/display/LogicalDisplay;->updateThermalRefreshRateThrottling(Landroid/util/SparseArray;)V
-HSPLcom/android/server/display/LogicalDisplayMapper$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/display/LogicalDisplayMapper$$ExternalSyntheticLambda3;-><init>()V
-HSPLcom/android/server/display/LogicalDisplayMapper$$ExternalSyntheticLambda3;->getId(Z)I
-HSPLcom/android/server/display/LogicalDisplayMapper$LogicalDisplayMapperHandler;-><init>(Lcom/android/server/display/LogicalDisplayMapper;Landroid/os/Looper;)V
-HSPLcom/android/server/display/LogicalDisplayMapper;->$r8$lambda$CLkgta2MkaptkxpiszN50MW0yV0(Z)I
-HSPLcom/android/server/display/LogicalDisplayMapper;-><clinit>()V
+HSPLcom/android/server/display/LogicalDisplay;->updateFrameRateOverrides(Lcom/android/server/display/DisplayDeviceInfo;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/display/LogicalDisplay;->updateLocked(Lcom/android/server/display/DisplayDeviceRepository;)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/DisplayDeviceRepository;Lcom/android/server/display/DisplayDeviceRepository;]Lcom/android/server/display/DisplayInfoProxy;Lcom/android/server/display/DisplayInfoProxy;
 HSPLcom/android/server/display/LogicalDisplayMapper;-><init>(Landroid/content/Context;Lcom/android/server/utils/FoldSettingProvider;Lcom/android/server/display/DisplayDeviceRepository;Lcom/android/server/display/LogicalDisplayMapper$Listener;Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/os/Handler;Lcom/android/server/display/DeviceStateToLayoutMap;Lcom/android/server/display/feature/DisplayManagerFlags;)V
-HSPLcom/android/server/display/LogicalDisplayMapper;-><init>(Landroid/content/Context;Lcom/android/server/utils/FoldSettingProvider;Lcom/android/server/display/DisplayDeviceRepository;Lcom/android/server/display/LogicalDisplayMapper$Listener;Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/os/Handler;Lcom/android/server/display/feature/DisplayManagerFlags;)V
 HSPLcom/android/server/display/LogicalDisplayMapper;->applyLayoutLocked()V
-HSPLcom/android/server/display/LogicalDisplayMapper;->assignDisplayGroupIdLocked(ZLjava/lang/String;ZLjava/lang/Integer;)I
-HSPLcom/android/server/display/LogicalDisplayMapper;->assignDisplayGroupLocked(Lcom/android/server/display/LogicalDisplay;)V
-HSPLcom/android/server/display/LogicalDisplayMapper;->assignLayerStackLocked(I)I
-HSPLcom/android/server/display/LogicalDisplayMapper;->createNewLogicalDisplayLocked(Lcom/android/server/display/DisplayDevice;I)Lcom/android/server/display/LogicalDisplay;
-HSPLcom/android/server/display/LogicalDisplayMapper;->forEachLocked(Ljava/util/function/Consumer;Z)V
-HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayGroupIdFromDisplayIdLocked(I)I
+HSPLcom/android/server/display/LogicalDisplayMapper;->assignDisplayGroupLocked(Lcom/android/server/display/LogicalDisplay;)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;
+HSPLcom/android/server/display/LogicalDisplayMapper;->forEachLocked(Ljava/util/function/Consumer;Z)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/function/Consumer;Lcom/android/server/display/DisplayManagerService$BinderService$$ExternalSyntheticLambda0;,Lcom/android/server/display/DisplayManagerService$$ExternalSyntheticLambda2;,Lcom/android/server/display/DisplayManagerService$DesiredDisplayModeSpecsObserver$$ExternalSyntheticLambda0;,Lcom/android/server/display/ExternalDisplayPolicy$$ExternalSyntheticLambda1;
+HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayGroupIdFromDisplayIdLocked(I)I+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/display/DisplayGroup;Lcom/android/server/display/DisplayGroup;
 HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayGroupLocked(I)Lcom/android/server/display/DisplayGroup;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayIdsLocked(IZ)[I+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;
 HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayLocked(I)Lcom/android/server/display/LogicalDisplay;+]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;
 HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayLocked(IZ)Lcom/android/server/display/LogicalDisplay;+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayLocked(Lcom/android/server/display/DisplayDevice;)Lcom/android/server/display/LogicalDisplay;
+HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayLocked(Lcom/android/server/display/DisplayDevice;)Lcom/android/server/display/LogicalDisplay;+]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;
 HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayLocked(Lcom/android/server/display/DisplayDevice;Z)Lcom/android/server/display/LogicalDisplay;+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/display/LogicalDisplayMapper;->handleDisplayDeviceAddedLocked(Lcom/android/server/display/DisplayDevice;)V
-HSPLcom/android/server/display/LogicalDisplayMapper;->initializeDefaultDisplayDeviceLocked(Lcom/android/server/display/DisplayDevice;)V
-HSPLcom/android/server/display/LogicalDisplayMapper;->lambda$new$0(Z)I
 HSPLcom/android/server/display/LogicalDisplayMapper;->onDisplayDeviceChangedLocked(Lcom/android/server/display/DisplayDevice;I)V
-HSPLcom/android/server/display/LogicalDisplayMapper;->onDisplayDeviceEventLocked(Lcom/android/server/display/DisplayDevice;I)V
-HSPLcom/android/server/display/LogicalDisplayMapper;->onTraversalRequested()V
 HSPLcom/android/server/display/LogicalDisplayMapper;->sendUpdatesForDisplaysLocked(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/display/LogicalDisplayMapper$Listener;Lcom/android/server/display/DisplayManagerService$LogicalDisplayListener;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/display/LogicalDisplayMapper;->sendUpdatesForGroupsLocked(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HSPLcom/android/server/display/LogicalDisplayMapper;->setEnabledLocked(Lcom/android/server/display/LogicalDisplay;Z)V
-HSPLcom/android/server/display/LogicalDisplayMapper;->toSparseBooleanArray([I)Landroid/util/SparseBooleanArray;
-HSPLcom/android/server/display/LogicalDisplayMapper;->updateLogicalDisplaysLocked()V
-HSPLcom/android/server/display/LogicalDisplayMapper;->updateLogicalDisplaysLocked(I)V
-HSPLcom/android/server/display/LogicalDisplayMapper;->updateLogicalDisplaysLocked(IZ)V+]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/display/DisplayGroup;Lcom/android/server/display/DisplayGroup;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;
-HSPLcom/android/server/display/NormalBrightnessModeController;->getCurrentBrightnessMax()F
-HSPLcom/android/server/display/NormalBrightnessModeController;->recalculateMaxBrightness()Z
-HSPLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;-><init>()V
-HSPLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;->loadFromXml(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V
-HSPLcom/android/server/display/PersistentDataStore$DisplayState;-><init>()V
-HSPLcom/android/server/display/PersistentDataStore$DisplayState;-><init>(Lcom/android/server/display/PersistentDataStore$DisplayState-IA;)V
-HSPLcom/android/server/display/PersistentDataStore$DisplayState;->getColorMode()I
-HSPLcom/android/server/display/PersistentDataStore$DisplayState;->getRefreshRate()F
-HSPLcom/android/server/display/PersistentDataStore$DisplayState;->getResolution()Landroid/graphics/Point;
-HSPLcom/android/server/display/PersistentDataStore$DisplayState;->loadBrightnessFromXml(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/display/PersistentDataStore$DisplayState;->loadFromXml(Lcom/android/modules/utils/TypedXmlPullParser;)V
+HSPLcom/android/server/display/LogicalDisplayMapper;->updateLogicalDisplaysLocked(IZ)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayGroup;Lcom/android/server/display/DisplayGroup;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;
+HSPLcom/android/server/display/NormalBrightnessModeController;->recalculateMaxBrightness()Z+]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/Set;Ljava/util/HashMap$EntrySet;
 HSPLcom/android/server/display/PersistentDataStore$DisplayState;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V
-HSPLcom/android/server/display/PersistentDataStore$Injector;-><init>()V
-HSPLcom/android/server/display/PersistentDataStore$Injector;->openRead()Ljava/io/InputStream;
-HSPLcom/android/server/display/PersistentDataStore$StableDeviceValues;->-$$Nest$mgetDisplaySize(Lcom/android/server/display/PersistentDataStore$StableDeviceValues;)Landroid/graphics/Point;
-HSPLcom/android/server/display/PersistentDataStore$StableDeviceValues;-><init>()V
-HSPLcom/android/server/display/PersistentDataStore$StableDeviceValues;-><init>(Lcom/android/server/display/PersistentDataStore$StableDeviceValues-IA;)V
-HSPLcom/android/server/display/PersistentDataStore$StableDeviceValues;->getDisplaySize()Landroid/graphics/Point;
-HSPLcom/android/server/display/PersistentDataStore$StableDeviceValues;->loadFromXml(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/display/PersistentDataStore$StableDeviceValues;->loadIntValue(Lcom/android/modules/utils/TypedXmlPullParser;)I
-HSPLcom/android/server/display/PersistentDataStore;-><init>()V
-HSPLcom/android/server/display/PersistentDataStore;-><init>(Lcom/android/server/display/PersistentDataStore$Injector;)V
-HSPLcom/android/server/display/PersistentDataStore;-><init>(Lcom/android/server/display/PersistentDataStore$Injector;Landroid/os/Handler;)V
-HSPLcom/android/server/display/PersistentDataStore;->clearState()V
-HSPLcom/android/server/display/PersistentDataStore;->getColorMode(Lcom/android/server/display/DisplayDevice;)I
 HSPLcom/android/server/display/PersistentDataStore;->getDisplayState(Ljava/lang/String;Z)Lcom/android/server/display/PersistentDataStore$DisplayState;
-HSPLcom/android/server/display/PersistentDataStore;->getStableDisplaySize()Landroid/graphics/Point;
-HSPLcom/android/server/display/PersistentDataStore;->getUserPreferredRefreshRate(Lcom/android/server/display/DisplayDevice;)F
-HSPLcom/android/server/display/PersistentDataStore;->getUserPreferredResolution(Lcom/android/server/display/DisplayDevice;)Landroid/graphics/Point;
-HSPLcom/android/server/display/PersistentDataStore;->load()V
-HSPLcom/android/server/display/PersistentDataStore;->loadDisplaysFromXml(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/display/PersistentDataStore;->loadFromXml(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/display/PersistentDataStore;->loadIfNeeded()V
-HSPLcom/android/server/display/PersistentDataStore;->loadRememberedWifiDisplaysFromXml(Lcom/android/modules/utils/TypedXmlPullParser;)V
 HSPLcom/android/server/display/PersistentDataStore;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V
 HPLcom/android/server/display/RampAnimator$DualRampAnimator$1;->run()V+]Lcom/android/server/display/RampAnimator$Listener;Lcom/android/server/display/DisplayPowerController$3;]Lcom/android/server/display/RampAnimator;Lcom/android/server/display/RampAnimator;]Lcom/android/server/display/RampAnimator$DualRampAnimator;Lcom/android/server/display/RampAnimator$DualRampAnimator;]Landroid/view/Choreographer;Landroid/view/Choreographer;
-HPLcom/android/server/display/RampAnimator$DualRampAnimator;->-$$Nest$fgetmFirst(Lcom/android/server/display/RampAnimator$DualRampAnimator;)Lcom/android/server/display/RampAnimator;
-HSPLcom/android/server/display/RampAnimator$DualRampAnimator;->animateTo(FFFZ)Z
+HSPLcom/android/server/display/RampAnimator$DualRampAnimator;->animateTo(FFFZ)Z+]Lcom/android/server/display/RampAnimator;Lcom/android/server/display/RampAnimator;]Lcom/android/server/display/RampAnimator$DualRampAnimator;Lcom/android/server/display/RampAnimator$DualRampAnimator;
 HSPLcom/android/server/display/RampAnimator$DualRampAnimator;->isAnimating()Z+]Lcom/android/server/display/RampAnimator;Lcom/android/server/display/RampAnimator;
 HPLcom/android/server/display/RampAnimator$DualRampAnimator;->postAnimationCallback()V+]Landroid/view/Choreographer;Landroid/view/Choreographer;
-HSPLcom/android/server/display/RampAnimator$DualRampAnimator;->setAnimationTimeLimits(JJ)V
 HSPLcom/android/server/display/RampAnimator;->isAnimating()Z
 HPLcom/android/server/display/RampAnimator;->performNextAnimationStep(J)V+]Lcom/android/server/display/RampAnimator;Lcom/android/server/display/RampAnimator;
-HSPLcom/android/server/display/RampAnimator;->setAnimationTarget(FFFF)Z
+HSPLcom/android/server/display/RampAnimator;->setAnimationTarget(FFFF)Z+]Lcom/android/server/display/RampAnimator$Clock;Lcom/android/server/display/RampAnimator$$ExternalSyntheticLambda0;
 HSPLcom/android/server/display/RampAnimator;->setPropertyValue(F)V+]Landroid/util/FloatProperty;Lcom/android/server/display/DisplayPowerState$3;,Lcom/android/server/display/DisplayPowerState$2;
-HSPLcom/android/server/display/VirtualDisplayAdapter$1;-><init>()V
-HSPLcom/android/server/display/VirtualDisplayAdapter;-><clinit>()V
-HSPLcom/android/server/display/VirtualDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Lcom/android/server/display/VirtualDisplayAdapter$SurfaceControlDisplayFactory;Lcom/android/server/display/feature/DisplayManagerFlags;)V
-HSPLcom/android/server/display/VirtualDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Lcom/android/server/display/feature/DisplayManagerFlags;)V
-HSPLcom/android/server/display/VirtualDisplayAdapter;->registerLocked()V
 HSPLcom/android/server/display/WakelockController;->acquireStateChangedSuspendBlocker()Z
-HSPLcom/android/server/display/WakelockController;->acquireUnfinishedBusinessSuspendBlocker()Z
+HSPLcom/android/server/display/WakelockController;->acquireUnfinishedBusinessSuspendBlocker()Z+]Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;Lcom/android/server/power/PowerManagerService$1;
 HSPLcom/android/server/display/WakelockController;->lambda$getOnStateChangedRunnable$1()V
 HSPLcom/android/server/display/WakelockController;->releaseUnfinishedBusinessSuspendBlocker()Z
 HSPLcom/android/server/display/brightness/BrightnessEvent;-><init>(Lcom/android/server/display/brightness/BrightnessEvent;)V
 HSPLcom/android/server/display/brightness/BrightnessEvent;->copyFrom(Lcom/android/server/display/brightness/BrightnessEvent;)V
 HSPLcom/android/server/display/brightness/BrightnessEvent;->equalsMainData(Lcom/android/server/display/brightness/BrightnessEvent;)Z
 HSPLcom/android/server/display/brightness/BrightnessEvent;->flagsToString()Ljava/lang/String;
+HSPLcom/android/server/display/brightness/BrightnessEvent;->isRbcEnabled()Z
 HSPLcom/android/server/display/brightness/BrightnessEvent;->reset()V
 HSPLcom/android/server/display/brightness/BrightnessEvent;->toString(Z)Ljava/lang/String;
-HSPLcom/android/server/display/brightness/BrightnessReason;-><init>()V
 HSPLcom/android/server/display/brightness/BrightnessReason;->addModifier(I)V
 HSPLcom/android/server/display/brightness/BrightnessReason;->equals(Ljava/lang/Object;)Z
-HSPLcom/android/server/display/brightness/BrightnessReason;->getModifier()I
 HSPLcom/android/server/display/brightness/BrightnessReason;->getReason()I
-HSPLcom/android/server/display/brightness/BrightnessReason;->set(Lcom/android/server/display/brightness/BrightnessReason;)V
+HSPLcom/android/server/display/brightness/BrightnessReason;->set(Lcom/android/server/display/brightness/BrightnessReason;)V+]Lcom/android/server/display/brightness/BrightnessReason;Lcom/android/server/display/brightness/BrightnessReason;
 HSPLcom/android/server/display/brightness/BrightnessReason;->setModifier(I)V
 HSPLcom/android/server/display/brightness/BrightnessReason;->setReason(I)V
 HSPLcom/android/server/display/brightness/BrightnessReason;->toString(I)Ljava/lang/String;
-HSPLcom/android/server/display/brightness/BrightnessUtils;->clampAbsoluteBrightness(F)F
 HSPLcom/android/server/display/brightness/BrightnessUtils;->constructDisplayBrightnessState(IFFLjava/lang/String;Z)Lcom/android/server/display/DisplayBrightnessState;
-HSPLcom/android/server/display/brightness/DisplayBrightnessController;->addAutomaticBrightnessState(Lcom/android/server/display/DisplayBrightnessState;)Lcom/android/server/display/DisplayBrightnessState;
-HSPLcom/android/server/display/brightness/DisplayBrightnessController;->convertToAdjustedNits(F)F
-HSPLcom/android/server/display/brightness/DisplayBrightnessController;->getAutomaticBrightnessStrategy()Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;
+HSPLcom/android/server/display/brightness/BrightnessUtils;->isValidBrightnessValue(F)Z
+HSPLcom/android/server/display/brightness/DisplayBrightnessController;->addAutomaticBrightnessState(Lcom/android/server/display/DisplayBrightnessState;)Lcom/android/server/display/DisplayBrightnessState;+]Lcom/android/server/display/DisplayBrightnessState$Builder;Lcom/android/server/display/DisplayBrightnessState$Builder;]Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;
+HSPLcom/android/server/display/brightness/DisplayBrightnessController;->convertToAdjustedNits(F)F+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;
 HSPLcom/android/server/display/brightness/DisplayBrightnessController;->getCurrentBrightness()F
 HSPLcom/android/server/display/brightness/DisplayBrightnessController;->getLastUserSetScreenBrightness()F
-HSPLcom/android/server/display/brightness/DisplayBrightnessController;->getScreenBrightnessSetting()F
-HSPLcom/android/server/display/brightness/DisplayBrightnessController;->isAllowAutoBrightnessWhileDozingConfig()Z
-HSPLcom/android/server/display/brightness/DisplayBrightnessController;->updateBrightness(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;I)Lcom/android/server/display/DisplayBrightnessState;
+HSPLcom/android/server/display/brightness/DisplayBrightnessController;->getScreenBrightnessSetting()F+]Lcom/android/server/display/BrightnessSetting;Lcom/android/server/display/BrightnessSetting;
+HSPLcom/android/server/display/brightness/DisplayBrightnessController;->isAllowAutoBrightnessWhileDozingConfig()Z+]Lcom/android/server/display/brightness/DisplayBrightnessStrategySelector;Lcom/android/server/display/brightness/DisplayBrightnessStrategySelector;
+HSPLcom/android/server/display/brightness/DisplayBrightnessController;->updateBrightness(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;I)Lcom/android/server/display/DisplayBrightnessState;+]Lcom/android/server/display/brightness/strategy/DisplayBrightnessStrategy;megamorphic_types]Lcom/android/server/display/brightness/DisplayBrightnessStrategySelector;Lcom/android/server/display/brightness/DisplayBrightnessStrategySelector;
 HSPLcom/android/server/display/brightness/DisplayBrightnessController;->updateUserSetScreenBrightness()Z
-HSPLcom/android/server/display/brightness/DisplayBrightnessStrategySelector;->selectStrategy(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;I)Lcom/android/server/display/brightness/strategy/DisplayBrightnessStrategy;
-HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController$DisplayDeviceData;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/display/DisplayDeviceConfig;)V
-HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController$DisplayDeviceData;->getPowerThrottlingData()Lcom/android/server/display/DisplayDeviceConfig$PowerThrottlingData;
-HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController$DisplayDeviceData;->getThermalBrightnessThrottlingData()Lcom/android/server/display/DisplayDeviceConfig$ThermalBrightnessThrottlingData;
+HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController$DisplayDeviceData;->getPowerThrottlingData()Lcom/android/server/display/DisplayDeviceConfig$PowerThrottlingData;+]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;]Ljava/util/Map;Ljava/util/HashMap;
+HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController$DisplayDeviceData;->getThermalBrightnessThrottlingData()Lcom/android/server/display/DisplayDeviceConfig$ThermalBrightnessThrottlingData;+]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;]Ljava/util/Map;Ljava/util/HashMap;
 HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController;->clamp(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;FZ)Lcom/android/server/display/DisplayBrightnessState;+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/display/DisplayBrightnessState$Builder;Lcom/android/server/display/DisplayBrightnessState$Builder;]Lcom/android/server/display/brightness/clamper/BrightnessStateModifier;Lcom/android/server/display/brightness/clamper/DisplayDimModifier;,Lcom/android/server/display/brightness/clamper/BrightnessLowPowerModeModifier;]Lcom/android/server/display/brightness/BrightnessReason;Lcom/android/server/display/brightness/BrightnessReason;
-HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController;->getBrightnessMaxReason()I
 HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController;->lambda$new$0(Ljava/lang/Runnable;)V
-HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController;->onDisplayChanged(Lcom/android/server/display/brightness/clamper/BrightnessClamperController$DisplayDeviceData;)V
-HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController;->recalculateBrightnessCap()V
-HSPLcom/android/server/display/brightness/clamper/BrightnessModifier;->apply(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Lcom/android/server/display/DisplayBrightnessState$Builder;)V
-HSPLcom/android/server/display/brightness/clamper/BrightnessPowerClamper$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/display/brightness/clamper/BrightnessPowerClamper;Lcom/android/server/display/brightness/clamper/BrightnessPowerClamper$PowerData;)V
+HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController;->onDisplayChanged(Lcom/android/server/display/brightness/clamper/BrightnessClamperController$DisplayDeviceData;)V+]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController;->recalculateBrightnessCap()V+]Lcom/android/server/display/brightness/clamper/BrightnessClamper;Lcom/android/server/display/brightness/clamper/BrightnessThermalClamper;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/stream/Stream;Ljava/util/stream/ReferencePipeline$Head;,Ljava/util/stream/ReferencePipeline$2;]Lcom/android/server/display/brightness/clamper/BrightnessClamperController$ClamperChangeListener;Lcom/android/server/display/BrightnessRangeController$$ExternalSyntheticLambda4;
+HSPLcom/android/server/display/brightness/clamper/BrightnessModifier;->apply(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Lcom/android/server/display/DisplayBrightnessState$Builder;)V+]Lcom/android/server/display/brightness/clamper/BrightnessModifier;Lcom/android/server/display/brightness/clamper/DisplayDimModifier;,Lcom/android/server/display/brightness/clamper/BrightnessLowPowerModeModifier;]Lcom/android/server/display/DisplayBrightnessState$Builder;Lcom/android/server/display/DisplayBrightnessState$Builder;
 HSPLcom/android/server/display/brightness/clamper/BrightnessPowerClamper;->onDisplayChanged(Lcom/android/server/display/brightness/clamper/BrightnessPowerClamper$PowerData;)V
-HSPLcom/android/server/display/brightness/clamper/BrightnessPowerClamper;->recalculateActiveData()V
-HSPLcom/android/server/display/brightness/clamper/BrightnessPowerClamper;->setDisplayData(Lcom/android/server/display/brightness/clamper/BrightnessPowerClamper$PowerData;)V
+HSPLcom/android/server/display/brightness/clamper/BrightnessPowerClamper;->recalculateActiveData()V+]Ljava/util/Map;Ljava/util/ImmutableCollections$MapN;
+HSPLcom/android/server/display/brightness/clamper/BrightnessPowerClamper;->setDisplayData(Lcom/android/server/display/brightness/clamper/BrightnessPowerClamper$PowerData;)V+]Lcom/android/server/display/brightness/clamper/BrightnessPowerClamper$PowerData;Lcom/android/server/display/brightness/clamper/BrightnessClamperController$DisplayDeviceData;
+HSPLcom/android/server/display/brightness/clamper/BrightnessThermalClamper$ThermalStatusObserver;->registerSensor(Lcom/android/server/display/config/SensorData;)V
 HSPLcom/android/server/display/brightness/clamper/BrightnessThermalClamper;->onDisplayChanged(Lcom/android/server/display/brightness/clamper/BrightnessThermalClamper$ThermalData;)V
-HSPLcom/android/server/display/brightness/clamper/BrightnessThermalClamper;->recalculateActiveData()V
-HSPLcom/android/server/display/brightness/clamper/BrightnessThermalClamper;->recalculateBrightnessCap()V
-HSPLcom/android/server/display/brightness/clamper/BrightnessThermalClamper;->setDisplayData(Lcom/android/server/display/brightness/clamper/BrightnessThermalClamper$ThermalData;)V
+HSPLcom/android/server/display/brightness/clamper/BrightnessThermalClamper;->recalculateActiveData()V+]Ljava/util/Map;Ljava/util/ImmutableCollections$MapN;
+HSPLcom/android/server/display/brightness/clamper/BrightnessThermalClamper;->recalculateBrightnessCap()V+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/display/brightness/clamper/BrightnessClamperController$ClamperChangeListener;Lcom/android/server/display/brightness/clamper/BrightnessClamperController$$ExternalSyntheticLambda4;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HSPLcom/android/server/display/brightness/clamper/BrightnessThermalClamper;->setDisplayData(Lcom/android/server/display/brightness/clamper/BrightnessThermalClamper$ThermalData;)V+]Lcom/android/server/display/brightness/clamper/BrightnessThermalClamper$ThermalData;Lcom/android/server/display/brightness/clamper/BrightnessClamperController$DisplayDeviceData;
 HSPLcom/android/server/display/brightness/clamper/BrightnessWearBedtimeModeClamper;->lambda$onDisplayChanged$0(Lcom/android/server/display/brightness/clamper/BrightnessWearBedtimeModeClamper$WearBedtimeModeData;)V
-HSPLcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;->accommodateUserBrightnessChanges(ZFILandroid/hardware/display/BrightnessConfiguration;I)V
-HPLcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;->adjustAutomaticBrightnessStateIfValid(F)V
-HSPLcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;->isAutoBrightnessEnabled()Z
+HPLcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;->adjustAutomaticBrightnessStateIfValid(F)V+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;
 HSPLcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;->processPendingAutoBrightnessAdjustments()Z
-HSPLcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;->setAutoBrightnessState(IZIIFZ)V
+HSPLcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;->setAutoBrightnessState(IZIIFZ)V+]Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;
 HSPLcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;->updateTemporaryAutoBrightnessAdjustments()F
-HSPLcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;->getReduceBrightColorsStrength()I
+HSPLcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;->getReduceBrightColorsStrength()I+]Lcom/android/server/display/color/ReduceBrightColorsTintController;Lcom/android/server/display/color/ReduceBrightColorsTintController;
 HPLcom/android/server/display/color/ColorDisplayService$ColorMatrixEvaluator;->evaluate(F[F[F)[F
 HPLcom/android/server/display/color/ColorDisplayService$TintValueAnimator;->updateMinMaxComponents()V+]Landroid/animation/ValueAnimator;Lcom/android/server/display/color/ColorDisplayService$TintValueAnimator;
-HSPLcom/android/server/display/config/AutoBrightnessModeName;->$values()[Lcom/android/server/display/config/AutoBrightnessModeName;
-HSPLcom/android/server/display/config/AutoBrightnessModeName;-><clinit>()V
-HSPLcom/android/server/display/config/AutoBrightnessModeName;-><init>(Ljava/lang/String;ILjava/lang/String;)V
-HSPLcom/android/server/display/config/AutoBrightnessModeName;->getRawName()Ljava/lang/String;
-HSPLcom/android/server/display/config/AutoBrightnessSettingName;->$values()[Lcom/android/server/display/config/AutoBrightnessSettingName;
-HSPLcom/android/server/display/config/AutoBrightnessSettingName;-><clinit>()V
-HSPLcom/android/server/display/config/AutoBrightnessSettingName;-><init>(Ljava/lang/String;ILjava/lang/String;)V
-HSPLcom/android/server/display/config/AutoBrightnessSettingName;->getRawName()Ljava/lang/String;
-HSPLcom/android/server/display/config/BrightnessThresholds;-><init>()V
-HSPLcom/android/server/display/config/BrightnessThresholds;->getBrightnessThresholdPoints()Lcom/android/server/display/config/ThresholdPoints;
-HSPLcom/android/server/display/config/BrightnessThresholds;->getMinimum()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/BrightnessThresholds;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/BrightnessThresholds;
-HSPLcom/android/server/display/config/BrightnessThresholds;->setMinimum(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/BrightnessThrottlingMap;-><init>()V
-HSPLcom/android/server/display/config/BrightnessThrottlingMap;->getBrightnessThrottlingPoint()Ljava/util/List;
-HSPLcom/android/server/display/config/BrightnessThrottlingMap;->getId()Ljava/lang/String;
-HSPLcom/android/server/display/config/BrightnessThrottlingMap;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/BrightnessThrottlingMap;
-HSPLcom/android/server/display/config/BrightnessThrottlingPoint;-><init>()V
-HSPLcom/android/server/display/config/BrightnessThrottlingPoint;->getBrightness()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/BrightnessThrottlingPoint;->getThermalStatus()Lcom/android/server/display/config/ThermalStatus;
-HSPLcom/android/server/display/config/BrightnessThrottlingPoint;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/BrightnessThrottlingPoint;
-HSPLcom/android/server/display/config/BrightnessThrottlingPoint;->setBrightness(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/BrightnessThrottlingPoint;->setThermalStatus(Lcom/android/server/display/config/ThermalStatus;)V
-HSPLcom/android/server/display/config/DisplayBrightnessMappingConfig;-><clinit>()V
-HSPLcom/android/server/display/config/DisplayBrightnessMappingConfig;-><init>(Landroid/content/Context;Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/config/AutoBrightness;Landroid/util/Spline;)V
-HSPLcom/android/server/display/config/DisplayBrightnessMappingConfig;->brightnessArrayIntToFloat([ILandroid/util/Spline;)[F
-HSPLcom/android/server/display/config/DisplayConfiguration;-><init>()V
-HSPLcom/android/server/display/config/DisplayConfiguration;->getAmbientBrightnessChangeThresholds()Lcom/android/server/display/config/Thresholds;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getAmbientBrightnessChangeThresholdsIdle()Lcom/android/server/display/config/Thresholds;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getAmbientLightHorizonLong()Ljava/math/BigInteger;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getAmbientLightHorizonShort()Ljava/math/BigInteger;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getAutoBrightness()Lcom/android/server/display/config/AutoBrightness;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getDensityMapping()Lcom/android/server/display/config/DensityMapping;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getDisplayBrightnessChangeThresholds()Lcom/android/server/display/config/Thresholds;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getDisplayBrightnessChangeThresholdsIdle()Lcom/android/server/display/config/Thresholds;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getHdrBrightnessConfig()Lcom/android/server/display/config/HdrBrightnessConfig;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getHighBrightnessMode()Lcom/android/server/display/config/HighBrightnessMode;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getLightSensor()Lcom/android/server/display/config/SensorDetails;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getLuxThrottling()Lcom/android/server/display/config/LuxThrottling;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getName()Ljava/lang/String;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getPowerThrottlingConfig()Lcom/android/server/display/config/PowerThrottlingConfig;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getProxSensor()Lcom/android/server/display/config/SensorDetails;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getQuirks()Lcom/android/server/display/config/DisplayQuirks;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getRefreshRate()Lcom/android/server/display/config/RefreshRateConfigs;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessCapForWearBedtimeMode()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessDefault()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessMap()Lcom/android/server/display/config/NitsMap;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessRampDecreaseMaxIdleMillis()Ljava/math/BigInteger;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessRampDecreaseMaxMillis()Ljava/math/BigInteger;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessRampFastDecrease()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessRampFastIncrease()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessRampIncreaseMaxIdleMillis()Ljava/math/BigInteger;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessRampIncreaseMaxMillis()Ljava/math/BigInteger;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessRampSlowDecrease()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessRampSlowDecreaseIdle()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessRampSlowIncrease()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenBrightnessRampSlowIncreaseIdle()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenOffBrightnessSensor()Lcom/android/server/display/config/SensorDetails;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getScreenOffBrightnessSensorValueToLux()Lcom/android/server/display/config/IntegerArray;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getThermalThrottling()Lcom/android/server/display/config/ThermalThrottling;
-HSPLcom/android/server/display/config/DisplayConfiguration;->getUsiVersion()Lcom/android/server/display/config/UsiVersion;
 HSPLcom/android/server/display/config/DisplayConfiguration;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/DisplayConfiguration;
-HSPLcom/android/server/display/config/DisplayConfiguration;->setAmbientBrightnessChangeThresholds(Lcom/android/server/display/config/Thresholds;)V
-HSPLcom/android/server/display/config/DisplayConfiguration;->setAmbientLightHorizonLong(Ljava/math/BigInteger;)V
-HSPLcom/android/server/display/config/DisplayConfiguration;->setAmbientLightHorizonShort(Ljava/math/BigInteger;)V
-HSPLcom/android/server/display/config/DisplayConfiguration;->setHighBrightnessMode(Lcom/android/server/display/config/HighBrightnessMode;)V
-HSPLcom/android/server/display/config/DisplayConfiguration;->setScreenBrightnessMap(Lcom/android/server/display/config/NitsMap;)V
-HSPLcom/android/server/display/config/DisplayConfiguration;->setScreenBrightnessRampFastDecrease(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/DisplayConfiguration;->setScreenBrightnessRampFastIncrease(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/DisplayConfiguration;->setScreenBrightnessRampIncreaseMaxMillis(Ljava/math/BigInteger;)V
-HSPLcom/android/server/display/config/DisplayConfiguration;->setScreenBrightnessRampSlowDecrease(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/DisplayConfiguration;->setScreenBrightnessRampSlowIncrease(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/DisplayConfiguration;->setThermalThrottling(Lcom/android/server/display/config/ThermalThrottling;)V
-HSPLcom/android/server/display/config/HbmTiming;-><init>()V
-HSPLcom/android/server/display/config/HbmTiming;->getTimeMaxSecs_all()Ljava/math/BigInteger;
-HSPLcom/android/server/display/config/HbmTiming;->getTimeMinSecs_all()Ljava/math/BigInteger;
-HSPLcom/android/server/display/config/HbmTiming;->getTimeWindowSecs_all()Ljava/math/BigInteger;
-HSPLcom/android/server/display/config/HbmTiming;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/HbmTiming;
-HSPLcom/android/server/display/config/HbmTiming;->setTimeMaxSecs_all(Ljava/math/BigInteger;)V
-HSPLcom/android/server/display/config/HbmTiming;->setTimeMinSecs_all(Ljava/math/BigInteger;)V
-HSPLcom/android/server/display/config/HbmTiming;->setTimeWindowSecs_all(Ljava/math/BigInteger;)V
-HSPLcom/android/server/display/config/HdrBrightnessData;->loadConfig(Lcom/android/server/display/config/DisplayConfiguration;)Lcom/android/server/display/config/HdrBrightnessData;
-HSPLcom/android/server/display/config/HighBrightnessMode;-><init>()V
-HSPLcom/android/server/display/config/HighBrightnessMode;->getAllowInLowPowerMode_all()Z
-HSPLcom/android/server/display/config/HighBrightnessMode;->getEnabled()Z
-HSPLcom/android/server/display/config/HighBrightnessMode;->getMinimumHdrPercentOfScreen_all()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/HighBrightnessMode;->getMinimumLux_all()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/HighBrightnessMode;->getRefreshRate_all()Lcom/android/server/display/config/RefreshRateRange;
-HSPLcom/android/server/display/config/HighBrightnessMode;->getSdrHdrRatioMap_all()Lcom/android/server/display/config/SdrHdrRatioMap;
-HSPLcom/android/server/display/config/HighBrightnessMode;->getTiming_all()Lcom/android/server/display/config/HbmTiming;
-HSPLcom/android/server/display/config/HighBrightnessMode;->getTransitionPoint_all()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/HighBrightnessMode;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/HighBrightnessMode;
-HSPLcom/android/server/display/config/HighBrightnessMode;->setAllowInLowPowerMode_all(Z)V
-HSPLcom/android/server/display/config/HighBrightnessMode;->setEnabled(Z)V
-HSPLcom/android/server/display/config/HighBrightnessMode;->setMinimumHdrPercentOfScreen_all(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/HighBrightnessMode;->setMinimumLux_all(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/HighBrightnessMode;->setSdrHdrRatioMap_all(Lcom/android/server/display/config/SdrHdrRatioMap;)V
-HSPLcom/android/server/display/config/HighBrightnessMode;->setTiming_all(Lcom/android/server/display/config/HbmTiming;)V
-HSPLcom/android/server/display/config/HighBrightnessMode;->setTransitionPoint_all(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/NitsMap;-><init>()V
-HSPLcom/android/server/display/config/NitsMap;->getInterpolation()Ljava/lang/String;
-HSPLcom/android/server/display/config/NitsMap;->getPoint()Ljava/util/List;
-HSPLcom/android/server/display/config/NitsMap;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/NitsMap;
-HSPLcom/android/server/display/config/Point;-><init>()V
-HSPLcom/android/server/display/config/Point;->getNits()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/Point;->getValue()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/Point;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/Point;
-HSPLcom/android/server/display/config/Point;->setNits(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/Point;->setValue(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/PredefinedBrightnessLimitNames;->$values()[Lcom/android/server/display/config/PredefinedBrightnessLimitNames;
-HSPLcom/android/server/display/config/PredefinedBrightnessLimitNames;-><clinit>()V
-HSPLcom/android/server/display/config/PredefinedBrightnessLimitNames;-><init>(Ljava/lang/String;ILjava/lang/String;)V
-HSPLcom/android/server/display/config/PredefinedBrightnessLimitNames;->values()[Lcom/android/server/display/config/PredefinedBrightnessLimitNames;
-HSPLcom/android/server/display/config/SdrHdrRatioMap;-><init>()V
-HSPLcom/android/server/display/config/SdrHdrRatioMap;->getPoint()Ljava/util/List;
-HSPLcom/android/server/display/config/SdrHdrRatioMap;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/SdrHdrRatioMap;
-HSPLcom/android/server/display/config/SdrHdrRatioPoint;-><init>()V
-HSPLcom/android/server/display/config/SdrHdrRatioPoint;->getHdrRatio()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/SdrHdrRatioPoint;->getSdrNits()Ljava/math/BigDecimal;
-HSPLcom/android/server/display/config/SdrHdrRatioPoint;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/SdrHdrRatioPoint;
-HSPLcom/android/server/display/config/SdrHdrRatioPoint;->setHdrRatio(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/SdrHdrRatioPoint;->setSdrNits(Ljava/math/BigDecimal;)V
-HSPLcom/android/server/display/config/SensorData;-><init>(Ljava/lang/String;Ljava/lang/String;FFLjava/util/List;)V
-HSPLcom/android/server/display/config/SensorData;->loadAmbientLightSensorConfig(Lcom/android/server/display/config/DisplayConfiguration;Landroid/content/res/Resources;)Lcom/android/server/display/config/SensorData;
-HSPLcom/android/server/display/config/SensorData;->loadProxSensorConfig(Lcom/android/server/display/config/DisplayConfiguration;)Lcom/android/server/display/config/SensorData;
-HSPLcom/android/server/display/config/SensorData;->loadScreenOffBrightnessSensorConfig(Lcom/android/server/display/config/DisplayConfiguration;)Lcom/android/server/display/config/SensorData;
-HSPLcom/android/server/display/config/ThermalStatus;->$values()[Lcom/android/server/display/config/ThermalStatus;
-HSPLcom/android/server/display/config/ThermalStatus;-><clinit>()V
-HSPLcom/android/server/display/config/ThermalStatus;-><init>(Ljava/lang/String;ILjava/lang/String;)V
-HSPLcom/android/server/display/config/ThermalStatus;->fromString(Ljava/lang/String;)Lcom/android/server/display/config/ThermalStatus;
-HSPLcom/android/server/display/config/ThermalStatus;->getRawName()Ljava/lang/String;
-HSPLcom/android/server/display/config/ThermalStatus;->values()[Lcom/android/server/display/config/ThermalStatus;
-HSPLcom/android/server/display/config/ThermalThrottling;-><init>()V
-HSPLcom/android/server/display/config/ThermalThrottling;->getBrightnessThrottlingMap()Ljava/util/List;
-HSPLcom/android/server/display/config/ThermalThrottling;->getRefreshRateThrottlingMap()Ljava/util/List;
-HSPLcom/android/server/display/config/ThermalThrottling;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/ThermalThrottling;
-HSPLcom/android/server/display/config/Thresholds;-><init>()V
-HSPLcom/android/server/display/config/Thresholds;->getBrighteningThresholds()Lcom/android/server/display/config/BrightnessThresholds;
-HSPLcom/android/server/display/config/Thresholds;->getDarkeningThresholds()Lcom/android/server/display/config/BrightnessThresholds;
-HSPLcom/android/server/display/config/Thresholds;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/display/config/Thresholds;
-HSPLcom/android/server/display/config/Thresholds;->setBrighteningThresholds(Lcom/android/server/display/config/BrightnessThresholds;)V
-HSPLcom/android/server/display/config/Thresholds;->setDarkeningThresholds(Lcom/android/server/display/config/BrightnessThresholds;)V
-HSPLcom/android/server/display/config/XmlParser;->read(Ljava/io/InputStream;)Lcom/android/server/display/config/DisplayConfiguration;
-HSPLcom/android/server/display/config/XmlParser;->readText(Lorg/xmlpull/v1/XmlPullParser;)Ljava/lang/String;
-HSPLcom/android/server/display/feature/DeviceConfigParameterProvider;-><init>(Landroid/provider/DeviceConfigInterface;)V
-HSPLcom/android/server/display/feature/DeviceConfigParameterProvider;->getHighAmbientBrightnessThresholds()[F
-HSPLcom/android/server/display/feature/DeviceConfigParameterProvider;->getHighDisplayBrightnessThresholds()[F
-HSPLcom/android/server/display/feature/DeviceConfigParameterProvider;->getIntArrayProperty(Ljava/lang/String;)[I
-HSPLcom/android/server/display/feature/DeviceConfigParameterProvider;->getLowAmbientBrightnessThresholds()[F
-HSPLcom/android/server/display/feature/DeviceConfigParameterProvider;->getLowDisplayBrightnessThresholds()[F
-HSPLcom/android/server/display/feature/DeviceConfigParameterProvider;->getPeakRefreshRateDefault()F
-HSPLcom/android/server/display/feature/DeviceConfigParameterProvider;->getRefreshRateInHbmHdr()I
-HSPLcom/android/server/display/feature/DeviceConfigParameterProvider;->getRefreshRateInHbmSunlight()I
-HSPLcom/android/server/display/feature/DeviceConfigParameterProvider;->getRefreshRateInHighZone()I
-HSPLcom/android/server/display/feature/DeviceConfigParameterProvider;->getRefreshRateInLowZone()I
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda10;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda11;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda11;->get()Ljava/lang/Object;
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda12;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda12;->get()Ljava/lang/Object;
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda13;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda14;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda15;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda16;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda17;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda18;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda19;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda19;->get()Ljava/lang/Object;
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda1;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda20;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda20;->get()Ljava/lang/Object;
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda2;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda3;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda4;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda4;->get()Ljava/lang/Object;
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda5;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda6;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda7;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda8;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda9;-><init>()V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda9;->get()Ljava/lang/Object;
 HSPLcom/android/server/display/feature/DisplayManagerFlags$FlagState;->-$$Nest$misEnabled(Lcom/android/server/display/feature/DisplayManagerFlags$FlagState;)Z+]Lcom/android/server/display/feature/DisplayManagerFlags$FlagState;Lcom/android/server/display/feature/DisplayManagerFlags$FlagState;
-HSPLcom/android/server/display/feature/DisplayManagerFlags$FlagState;-><init>(Ljava/lang/String;Ljava/util/function/Supplier;)V
-HSPLcom/android/server/display/feature/DisplayManagerFlags$FlagState;-><init>(Ljava/lang/String;Ljava/util/function/Supplier;Lcom/android/server/display/feature/DisplayManagerFlags$FlagState-IA;)V
 HSPLcom/android/server/display/feature/DisplayManagerFlags$FlagState;->flagOrSystemProperty(Ljava/util/function/Supplier;Ljava/lang/String;)Z
 HSPLcom/android/server/display/feature/DisplayManagerFlags$FlagState;->isEnabled()Z+]Lcom/android/server/display/feature/DisplayManagerFlags$FlagState;Lcom/android/server/display/feature/DisplayManagerFlags$FlagState;
 HSPLcom/android/server/display/feature/DisplayManagerFlags;->-$$Nest$sfgetDEBUG()Z
-HSPLcom/android/server/display/feature/DisplayManagerFlags;-><clinit>()V
 HSPLcom/android/server/display/feature/DisplayManagerFlags;-><init>()V
 HSPLcom/android/server/display/feature/DisplayManagerFlags;->areAutoBrightnessModesEnabled()Z
-HSPLcom/android/server/display/feature/DisplayManagerFlags;->isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()Z
 HSPLcom/android/server/display/feature/DisplayManagerFlags;->isBrightnessIntRangeUserPerceptionEnabled()Z
-HSPLcom/android/server/display/feature/DisplayManagerFlags;->isConnectedDisplayErrorHandlingEnabled()Z
 HSPLcom/android/server/display/feature/DisplayManagerFlags;->isConnectedDisplayManagementEnabled()Z
-HSPLcom/android/server/display/feature/DisplayManagerFlags;->isDisplayResolutionRangeVotingEnabled()Z
-HSPLcom/android/server/display/feature/DisplayManagerFlags;->isDisplaysRefreshRatesSynchronizationEnabled()Z
-HSPLcom/android/server/display/feature/DisplayManagerFlags;->isExternalDisplayLimitModeEnabled()Z
-HSPLcom/android/server/display/feature/DisplayManagerFlags;->isPortInDisplayLayoutEnabled()Z
-HSPLcom/android/server/display/feature/DisplayManagerFlags;->isRefreshRateVotingTelemetryEnabled()Z
-HSPLcom/android/server/display/feature/DisplayManagerFlags;->isUserPreferredModeVoteEnabled()Z
-HSPLcom/android/server/display/layout/Layout$Display;-><init>(Landroid/view/DisplayAddress;IZLjava/lang/String;Ljava/lang/String;ILandroid/view/DisplayAddress;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/server/display/layout/Layout$Display;-><init>(Landroid/view/DisplayAddress;IZLjava/lang/String;Ljava/lang/String;ILandroid/view/DisplayAddress;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/display/layout/Layout$Display-IA;)V
-HSPLcom/android/server/display/layout/Layout$Display;->getAddress()Landroid/view/DisplayAddress;
-HSPLcom/android/server/display/layout/Layout$Display;->getDisplayGroupName()Ljava/lang/String;
-HSPLcom/android/server/display/layout/Layout$Display;->getLeadDisplayId()I
-HSPLcom/android/server/display/layout/Layout$Display;->getLogicalDisplayId()I
-HSPLcom/android/server/display/layout/Layout$Display;->getPosition()I
-HSPLcom/android/server/display/layout/Layout$Display;->getPowerThrottlingMapId()Ljava/lang/String;
-HSPLcom/android/server/display/layout/Layout$Display;->getRefreshRateThermalThrottlingMapId()Ljava/lang/String;
-HSPLcom/android/server/display/layout/Layout$Display;->getRefreshRateZoneId()Ljava/lang/String;
-HSPLcom/android/server/display/layout/Layout$Display;->getThermalBrightnessThrottlingMapId()Ljava/lang/String;
-HSPLcom/android/server/display/layout/Layout$Display;->isEnabled()Z
 HSPLcom/android/server/display/layout/Layout$Display;->toString()Ljava/lang/String;
-HSPLcom/android/server/display/layout/Layout;-><init>()V
-HSPLcom/android/server/display/layout/Layout;->contains(Landroid/view/DisplayAddress;)Z
-HSPLcom/android/server/display/layout/Layout;->createDefaultDisplayLocked(Landroid/view/DisplayAddress;Lcom/android/server/display/layout/DisplayIdProducer;)V
-HSPLcom/android/server/display/layout/Layout;->createDisplayLocked(Landroid/view/DisplayAddress;ZZLjava/lang/String;Lcom/android/server/display/layout/DisplayIdProducer;ILandroid/view/DisplayAddress;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/server/display/layout/Layout;->getAt(I)Lcom/android/server/display/layout/Layout$Display;
-HSPLcom/android/server/display/layout/Layout;->getByAddress(Landroid/view/DisplayAddress;)Lcom/android/server/display/layout/Layout$Display;
 HSPLcom/android/server/display/layout/Layout;->getById(I)Lcom/android/server/display/layout/Layout$Display;
-HSPLcom/android/server/display/layout/Layout;->size()I
-HSPLcom/android/server/display/layout/Layout;->toString()Ljava/lang/String;
-HSPLcom/android/server/display/mode/DisplayModeDirector$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/display/mode/DisplayModeDirector;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;-><init>(Lcom/android/server/display/mode/DisplayModeDirector;)V
 HSPLcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;->findModeByIdLocked(II)Landroid/view/Display$Mode;+]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;->setAppPreferredRefreshRateRangeLocked(IFF)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/mode/VotesStorage;Lcom/android/server/display/mode/VotesStorage;
 HSPLcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;->setAppRequest(IIFF)V+]Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;
 HSPLcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;->setAppRequestedModeLocked(II)V+]Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/mode/VotesStorage;Lcom/android/server/display/mode/VotesStorage;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda10;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda10;->call()Ljava/lang/Object;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda11;-><init>(Lcom/android/server/display/DisplayDeviceConfig;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda11;->call()Ljava/lang/Object;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda12;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda12;->call()Ljava/lang/Object;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda13;-><init>(Lcom/android/server/display/DisplayDeviceConfig;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda13;->call()Ljava/lang/Object;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda2;-><init>()V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda5;-><init>()V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda5;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda6;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda6;->call()Ljava/lang/Object;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda7;-><init>(Lcom/android/server/display/DisplayDeviceConfig;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda7;->call()Ljava/lang/Object;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda8;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda8;->call()Ljava/lang/Object;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda9;-><init>(Lcom/android/server/display/DisplayDeviceConfig;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda9;->call()Ljava/lang/Object;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$1;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener$1;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener-IA;)V
-HPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;->onSensorChanged(Landroid/hardware/SensorEvent;)V+]Landroid/os/Handler;Lcom/android/server/display/DisplayManagerService$DisplayManagerHandler;]Lcom/android/server/display/utils/AmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;]Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;
-HPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;->processSensorData(J)V+]Lcom/android/server/display/utils/AmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->$r8$lambda$8DAn56bU6WgFgsFx-a9p7-LZAcI(Lcom/android/server/display/DisplayDeviceConfig;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->$r8$lambda$Ay2prysMHDYMO6gnyiTQlctgcyI(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->$r8$lambda$IKnEMBFyGRQBJ1PKPV09LlnUYcQ(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->$r8$lambda$QQJ_8KNK1PlQxWszYy-c-kL2A3U(Lcom/android/server/display/DisplayDeviceConfig;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->$r8$lambda$TOfl-cGYXuStF3el4JR8AneQz-w(Lcom/android/server/display/DisplayDeviceConfig;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->$r8$lambda$horxynV7MmybweJstKDz3KJXC50(Lcom/android/server/display/DisplayDeviceConfig;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->$r8$lambda$q9lF_A0quq49fCqX-dNNPJaLYQ8(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->$r8$lambda$ukYjuV9AUGT_8BbrisQUwkGAqfM(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->-$$Nest$mreloadLightSensor(Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;Lcom/android/server/display/DisplayDeviceConfig;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;-><init>(Lcom/android/server/display/mode/DisplayModeDirector;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/mode/DisplayModeDirector$Injector;ZLcom/android/server/display/feature/DisplayManagerFlags;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->getBrightness(I)F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->lambda$loadHighBrightnessThresholds$4()[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->lambda$loadHighBrightnessThresholds$5(Lcom/android/server/display/DisplayDeviceConfig;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->lambda$loadHighBrightnessThresholds$6()[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->lambda$loadHighBrightnessThresholds$7(Lcom/android/server/display/DisplayDeviceConfig;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->lambda$loadLowBrightnessThresholds$0()[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->lambda$loadLowBrightnessThresholds$1(Lcom/android/server/display/DisplayDeviceConfig;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->lambda$loadLowBrightnessThresholds$2()[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->lambda$loadLowBrightnessThresholds$3(Lcom/android/server/display/DisplayDeviceConfig;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->loadBrightnessThresholds(Ljava/util/concurrent/Callable;Ljava/util/concurrent/Callable;ILcom/android/server/display/DisplayDeviceConfig;ZLjava/util/function/Function;)[F
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->loadHighBrightnessThresholds(Lcom/android/server/display/DisplayDeviceConfig;Z)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->loadLowBrightnessThresholds(Lcom/android/server/display/DisplayDeviceConfig;Z)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->loadRefreshRateInHighZone(Lcom/android/server/display/DisplayDeviceConfig;Z)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->loadRefreshRateInLowZone(Lcom/android/server/display/DisplayDeviceConfig;Z)V
+HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;->onSensorChanged(Landroid/hardware/SensorEvent;)V+]Landroid/os/Handler;Lcom/android/server/display/DisplayManagerService$DisplayManagerHandler;]Lcom/android/server/display/utils/AmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;]Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;
+HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;->processSensorData(J)V+]Lcom/android/server/display/utils/AmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;
 HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->onBrightnessChangedLocked()V+]Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;]Lcom/android/server/display/mode/VotesStorage;Lcom/android/server/display/mode/VotesStorage;
-HPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->onDisplayChanged(I)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->reloadLightSensor(Lcom/android/server/display/DisplayDeviceConfig;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->reloadLightSensorData(Lcom/android/server/display/DisplayDeviceConfig;)V
+HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->onDisplayChanged(I)V
 HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->restartObserver()V
-HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->updateBlockingZoneThresholds(Lcom/android/server/display/DisplayDeviceConfig;Z)V
-HPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->updateDefaultDisplayState()V
+HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->updateDefaultDisplayState()V+]Lcom/android/server/display/mode/DisplayModeDirector$Injector;Lcom/android/server/display/mode/DisplayModeDirector$RealInjector;]Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;
 HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->updateSensorStatus()V
-HSPLcom/android/server/display/mode/DisplayModeDirector$DesiredDisplayModeSpecs;-><init>()V
 HSPLcom/android/server/display/mode/DisplayModeDirector$DesiredDisplayModeSpecs;->copyFrom(Lcom/android/server/display/mode/DisplayModeDirector$DesiredDisplayModeSpecs;)V
 HSPLcom/android/server/display/mode/DisplayModeDirector$DesiredDisplayModeSpecs;->equals(Ljava/lang/Object;)Z
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda0;->getAsInt()I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/display/DisplayDeviceConfig;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda1;->getAsInt()I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda2;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda2;->getAsInt()I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda3;-><init>(Lcom/android/server/display/DisplayDeviceConfig;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda3;->getAsInt()I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->$r8$lambda$4IM44pR3egbsLgKCJgtproSJ4HU(Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;)I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->$r8$lambda$UjQJH7qg8DdCnUYR-DTJghZFPuQ(Lcom/android/server/display/DisplayDeviceConfig;)I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->$r8$lambda$Zlf8FUrJAId9oJETwAtYDKb3u9M(Lcom/android/server/display/DisplayDeviceConfig;)I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->$r8$lambda$p85UmY-pmP6AkHPGqUwdtsPukFw(Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;)I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->-$$Nest$mgetRefreshRateInHbmHdr(Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;Lcom/android/server/display/DisplayDeviceConfig;)I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->-$$Nest$mgetRefreshRateInHbmSunlight(Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;Lcom/android/server/display/DisplayDeviceConfig;)I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;-><init>(Lcom/android/server/display/mode/DisplayModeDirector;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;-><init>(Lcom/android/server/display/mode/DisplayModeDirector;Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings-IA;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->getRefreshRate(Ljava/util/function/IntSupplier;Ljava/util/function/IntSupplier;ILcom/android/server/display/DisplayDeviceConfig;)I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->getRefreshRateInHbmHdr(Lcom/android/server/display/DisplayDeviceConfig;)I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->getRefreshRateInHbmSunlight(Lcom/android/server/display/DisplayDeviceConfig;)I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->lambda$getRefreshRateInHbmHdr$0()I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->lambda$getRefreshRateInHbmHdr$1(Lcom/android/server/display/DisplayDeviceConfig;)I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->lambda$getRefreshRateInHbmSunlight$2()I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;->lambda$getRefreshRateInHbmSunlight$3(Lcom/android/server/display/DisplayDeviceConfig;)I
-HSPLcom/android/server/display/mode/DisplayModeDirector$DisplayModeDirectorHandler;-><init>(Lcom/android/server/display/mode/DisplayModeDirector;Landroid/os/Looper;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$DisplayObserver;-><init>(Lcom/android/server/display/mode/DisplayModeDirector;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/mode/VotesStorage;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$DisplayObserver;->getDisplayInfo(I)Landroid/view/DisplayInfo;
-HPLcom/android/server/display/mode/DisplayModeDirector$DisplayObserver;->onDisplayChanged(I)V
-HPLcom/android/server/display/mode/DisplayModeDirector$DisplayObserver;->updateDisplayModes(ILandroid/view/DisplayInfo;)V
-HPLcom/android/server/display/mode/DisplayModeDirector$DisplayObserver;->updateUserSettingDisplayPreferredSize(Landroid/view/DisplayInfo;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$HbmObserver;-><init>(Lcom/android/server/display/mode/DisplayModeDirector;Lcom/android/server/display/mode/DisplayModeDirector$Injector;Lcom/android/server/display/mode/VotesStorage;Landroid/os/Handler;Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$HbmObserver;->setupHdrRefreshRates(Lcom/android/server/display/DisplayDeviceConfig;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$RealInjector;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/display/mode/DisplayModeDirector$DisplayObserver;->getDisplayInfo(I)Landroid/view/DisplayInfo;+]Lcom/android/server/display/mode/DisplayModeDirector$Injector;Lcom/android/server/display/mode/DisplayModeDirector$RealInjector;
+HSPLcom/android/server/display/mode/DisplayModeDirector$DisplayObserver;->updateDisplayModes(ILandroid/view/DisplayInfo;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/display/mode/DisplayModeDirector$DisplayObserver;->updateUserSettingDisplayPreferredSize(Landroid/view/DisplayInfo;)V+]Lcom/android/server/display/mode/VotesStorage;Lcom/android/server/display/mode/VotesStorage;
 HSPLcom/android/server/display/mode/DisplayModeDirector$RealInjector;->getBrightnessInfo(I)Landroid/hardware/display/BrightnessInfo;
-HSPLcom/android/server/display/mode/DisplayModeDirector$RealInjector;->getDeviceConfig()Landroid/provider/DeviceConfigInterface;
-HPLcom/android/server/display/mode/DisplayModeDirector$RealInjector;->getDisplay(I)Landroid/view/Display;
+HSPLcom/android/server/display/mode/DisplayModeDirector$RealInjector;->getDisplay(I)Landroid/view/Display;
 HSPLcom/android/server/display/mode/DisplayModeDirector$RealInjector;->getDisplayInfo(ILandroid/view/DisplayInfo;)Z
 HSPLcom/android/server/display/mode/DisplayModeDirector$RealInjector;->getDisplayManager()Landroid/hardware/display/DisplayManager;
-HSPLcom/android/server/display/mode/DisplayModeDirector$RealInjector;->getVotesStatsReporter(Z)Lcom/android/server/display/mode/VotesStatsReporter;
-HSPLcom/android/server/display/mode/DisplayModeDirector$RealInjector;->supportsFrameRateOverride()Z
-HSPLcom/android/server/display/mode/DisplayModeDirector$SensorObserver;-><init>(Landroid/content/Context;Lcom/android/server/display/mode/VotesStorage;Lcom/android/server/display/mode/DisplayModeDirector$Injector;)V
-HPLcom/android/server/display/mode/DisplayModeDirector$SensorObserver;->onDisplayChanged(I)V
-HPLcom/android/server/display/mode/DisplayModeDirector$SensorObserver;->recalculateVotesLocked()V
-HSPLcom/android/server/display/mode/DisplayModeDirector$SettingsObserver;-><init>(Lcom/android/server/display/mode/DisplayModeDirector;Landroid/content/Context;Landroid/os/Handler;ZLcom/android/server/display/feature/DisplayManagerFlags;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$SettingsObserver;->setDefaultPeakRefreshRate(Lcom/android/server/display/DisplayDeviceConfig;Z)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$SettingsObserver;->setRefreshRates(Lcom/android/server/display/DisplayDeviceConfig;Z)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$UdfpsObserver;-><init>(Lcom/android/server/display/mode/DisplayModeDirector;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector$UdfpsObserver;-><init>(Lcom/android/server/display/mode/DisplayModeDirector;Lcom/android/server/display/mode/DisplayModeDirector$UdfpsObserver-IA;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector;->-$$Nest$fgetmConfigParameterProvider(Lcom/android/server/display/mode/DisplayModeDirector;)Lcom/android/server/display/feature/DeviceConfigParameterProvider;
 HSPLcom/android/server/display/mode/DisplayModeDirector;->-$$Nest$fgetmLock(Lcom/android/server/display/mode/DisplayModeDirector;)Ljava/lang/Object;
 HSPLcom/android/server/display/mode/DisplayModeDirector;->-$$Nest$fgetmSupportedModesByDisplay(Lcom/android/server/display/mode/DisplayModeDirector;)Landroid/util/SparseArray;
-HSPLcom/android/server/display/mode/DisplayModeDirector;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/feature/DisplayManagerFlags;)V
 HSPLcom/android/server/display/mode/DisplayModeDirector;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/mode/DisplayModeDirector$Injector;Lcom/android/server/display/feature/DisplayManagerFlags;)V
-HSPLcom/android/server/display/mode/DisplayModeDirector;->defaultDisplayDeviceUpdated(Lcom/android/server/display/DisplayDeviceConfig;)V
 HSPLcom/android/server/display/mode/DisplayModeDirector;->getAppRequestObserver()Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;
-HSPLcom/android/server/display/mode/DisplayModeDirector;->getDesiredDisplayModeSpecs(I)Lcom/android/server/display/mode/DisplayModeDirector$DesiredDisplayModeSpecs;
+HSPLcom/android/server/display/mode/DisplayModeDirector;->getDesiredDisplayModeSpecs(I)Lcom/android/server/display/mode/DisplayModeDirector$DesiredDisplayModeSpecs;+]Lcom/android/server/display/mode/VotesStatsReporter;Lcom/android/server/display/mode/VotesStatsReporter;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/display/mode/VotesStorage;Lcom/android/server/display/mode/VotesStorage;
 HSPLcom/android/server/display/mode/DisplayModeDirector;->getModeSwitchingType()I
 HSPLcom/android/server/display/mode/RefreshRateVote$RenderVote;->updateSummary(Lcom/android/server/display/mode/VoteSummary;)V
-HSPLcom/android/server/display/mode/SkinThermalStatusObserver;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$Injector;Lcom/android/server/display/mode/VotesStorage;)V
-HSPLcom/android/server/display/mode/SkinThermalStatusObserver;-><init>(Lcom/android/server/display/mode/DisplayModeDirector$Injector;Lcom/android/server/display/mode/VotesStorage;Landroid/os/Handler;)V
-HPLcom/android/server/display/mode/SkinThermalStatusObserver;->updateThermalRefreshRateThrottling(I)V
+HSPLcom/android/server/display/mode/SkinThermalStatusObserver;->updateThermalRefreshRateThrottling(I)V+]Lcom/android/server/display/mode/DisplayModeDirector$Injector;Lcom/android/server/display/mode/DisplayModeDirector$RealInjector;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/display/mode/VoteSummary;->filterModes([Landroid/view/Display$Mode;)Ljava/util/List;
 HSPLcom/android/server/display/mode/VoteSummary;->limitRefreshRanges(Lcom/android/server/display/mode/VoteSummary;)V
 HSPLcom/android/server/display/mode/VoteSummary;->reset()V
-HSPLcom/android/server/display/mode/VotesStatsReporter;-><init>(ZZ)V
+HSPLcom/android/server/display/mode/VoteSummary;->selectBaseMode(Ljava/util/List;Landroid/view/Display$Mode;)Landroid/view/Display$Mode;+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/display/mode/VotesStatsReporter;->reportVotesActivated(IILandroid/view/Display$Mode;Landroid/util/SparseArray;)V+]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/display/mode/VotesStorage;-><init>(Lcom/android/server/display/mode/VotesStorage$Listener;Lcom/android/server/display/mode/VotesStatsReporter;)V
-HSPLcom/android/server/display/mode/VotesStorage;->getVotes(I)Landroid/util/SparseArray;
+HSPLcom/android/server/display/mode/VotesStorage;->getVotes(I)Landroid/util/SparseArray;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/display/mode/VotesStorage;->updateVote(IILcom/android/server/display/mode/Vote;)V+]Lcom/android/server/display/mode/VotesStatsReporter;Lcom/android/server/display/mode/VotesStatsReporter;]Ljava/lang/Object;megamorphic_types]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/mode/VotesStorage$Listener;Lcom/android/server/display/mode/DisplayModeDirector$$ExternalSyntheticLambda0;
-HSPLcom/android/server/display/notifications/DisplayNotificationManager;-><init>(Lcom/android/server/display/feature/DisplayManagerFlags;Landroid/content/Context;Lcom/android/server/display/notifications/DisplayNotificationManager$Injector;)V
 HSPLcom/android/server/display/state/DisplayStateController;->updateDisplayState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;ZZ)I
-HPLcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;->antiderivative(F)F
-HPLcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;->calculateIntegral(FF)F+]Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;
-HPLcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;->filter(JLcom/android/server/display/utils/RollingBuffer;)F+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;]Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;
-HPLcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;->getWeights(JLcom/android/server/display/utils/RollingBuffer;)[F+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;]Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;
-HPLcom/android/server/display/utils/AmbientFilter;->addValue(JF)Z+]Lcom/android/server/display/utils/AmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;
-HPLcom/android/server/display/utils/AmbientFilter;->getEstimate(J)F+]Lcom/android/server/display/utils/AmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;
-HPLcom/android/server/display/utils/AmbientFilter;->truncateOldValues(J)V+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;
-HSPLcom/android/server/display/utils/DebugUtils;-><clinit>()V
-HSPLcom/android/server/display/utils/DebugUtils;->isDebuggable(Ljava/lang/String;)Z
-HSPLcom/android/server/display/utils/DeviceConfigParsingUtils;->ambientBrightnessThresholdsIntToFloat([I)[F
-HSPLcom/android/server/display/utils/DeviceConfigParsingUtils;->displayBrightnessThresholdsIntToFloat([I)[F
-HPLcom/android/server/display/utils/RollingBuffer;->add(JF)V+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;
-HPLcom/android/server/display/utils/RollingBuffer;->getTime(I)J+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;
-HPLcom/android/server/display/utils/RollingBuffer;->getValue(I)F+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;
-HPLcom/android/server/display/utils/RollingBuffer;->offsetOf(I)I
-HPLcom/android/server/display/utils/RollingBuffer;->truncate(J)V+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;
-HSPLcom/android/server/display/utils/SensorUtils;->findSensor(Landroid/hardware/SensorManager;Ljava/lang/String;Ljava/lang/String;I)Landroid/hardware/Sensor;
+HSPLcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;->antiderivative(F)F
+HSPLcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;->filter(JLcom/android/server/display/utils/RollingBuffer;)F+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;]Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;
+HSPLcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;->getWeights(JLcom/android/server/display/utils/RollingBuffer;)[F+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;]Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;
+HSPLcom/android/server/display/utils/AmbientFilter;->addValue(JF)Z+]Lcom/android/server/display/utils/AmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;
+HSPLcom/android/server/display/utils/AmbientFilter;->getEstimate(J)F+]Lcom/android/server/display/utils/AmbientFilter;Lcom/android/server/display/utils/AmbientFilter$WeightedMovingAverageAmbientFilter;
+HSPLcom/android/server/display/utils/RollingBuffer;->add(JF)V+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;
+HSPLcom/android/server/display/utils/RollingBuffer;->getTime(I)J+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;
+HSPLcom/android/server/display/utils/RollingBuffer;->getValue(I)F+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;
+HSPLcom/android/server/display/utils/RollingBuffer;->offsetOf(I)I
+HSPLcom/android/server/display/utils/RollingBuffer;->truncate(J)V+]Lcom/android/server/display/utils/RollingBuffer;Lcom/android/server/display/utils/RollingBuffer;
+HSPLcom/android/server/display/utils/SensorUtils;->findSensor(Landroid/hardware/SensorManager;Ljava/lang/String;Ljava/lang/String;I)Landroid/hardware/Sensor;+]Ljava/lang/Object;Ljava/lang/String;]Landroid/hardware/Sensor;Landroid/hardware/Sensor;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Landroid/hardware/SensorManager;Landroid/hardware/SystemSensorManager;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;
 HPLcom/android/server/dreams/DreamController;->startDream(Landroid/os/Binder;Landroid/content/ComponentName;ZZILandroid/os/PowerManager$WakeLock;Landroid/content/ComponentName;Ljava/lang/String;)V
 HPLcom/android/server/dreams/DreamController;->stopDreamInstance(ZLjava/lang/String;Lcom/android/server/dreams/DreamController$DreamRecord;)V
 HSPLcom/android/server/dreams/DreamManagerService$LocalService;->isDreaming()Z
 HSPLcom/android/server/dreams/DreamManagerService;->-$$Nest$misDreamingInternal(Lcom/android/server/dreams/DreamManagerService;)Z+]Lcom/android/server/dreams/DreamManagerService;Lcom/android/server/dreams/DreamManagerService;
 HSPLcom/android/server/dreams/DreamManagerService;->isDreamingInternal()Z
 HSPLcom/android/server/feature/flags/Flags;->enableReadDropboxPermission()Z
-HSPLcom/android/server/firewall/AndFilter$1;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/AndFilter;-><clinit>()V
-HSPLcom/android/server/firewall/CategoryFilter$1;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/CategoryFilter;-><clinit>()V
-HSPLcom/android/server/firewall/FilterFactory;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/FilterFactory;->getTagName()Ljava/lang/String;
-HSPLcom/android/server/firewall/IntentFirewall$FirewallHandler;-><init>(Lcom/android/server/firewall/IntentFirewall;Landroid/os/Looper;)V
-HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;-><init>()V
-HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;-><init>(Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver-IA;)V
 HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->queryByComponent(Landroid/content/ComponentName;Ljava/util/List;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->sortResults(Ljava/util/List;)V
-HSPLcom/android/server/firewall/IntentFirewall$RuleObserver;-><init>(Lcom/android/server/firewall/IntentFirewall;Ljava/io/File;)V
-HSPLcom/android/server/firewall/IntentFirewall;-><clinit>()V
-HSPLcom/android/server/firewall/IntentFirewall;-><init>(Lcom/android/server/firewall/IntentFirewall$AMSInterface;Landroid/os/Handler;)V
 HSPLcom/android/server/firewall/IntentFirewall;->checkBroadcast(Landroid/content/Intent;IILjava/lang/String;I)Z+]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/firewall/IntentFirewall;->checkIntent(Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;Landroid/content/ComponentName;ILandroid/content/Intent;IILjava/lang/String;I)Z+]Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall;]Lcom/android/server/IntentResolver;Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/firewall/IntentFirewall;->checkService(Landroid/content/ComponentName;Landroid/content/Intent;IILjava/lang/String;Landroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall;
 HSPLcom/android/server/firewall/IntentFirewall;->getPackageManager()Landroid/content/pm/PackageManagerInternal;
-HSPLcom/android/server/firewall/IntentFirewall;->getRulesDir()Ljava/io/File;
-HSPLcom/android/server/firewall/IntentFirewall;->readRulesDir(Ljava/io/File;)V
-HSPLcom/android/server/firewall/NotFilter$1;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/NotFilter;-><clinit>()V
-HSPLcom/android/server/firewall/OrFilter$1;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/OrFilter;-><clinit>()V
-HSPLcom/android/server/firewall/PortFilter$1;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/PortFilter;-><clinit>()V
-HSPLcom/android/server/firewall/SenderFilter$1;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/SenderFilter$2;-><init>()V
-HSPLcom/android/server/firewall/SenderFilter$3;-><init>()V
-HSPLcom/android/server/firewall/SenderFilter$4;-><init>()V
-HSPLcom/android/server/firewall/SenderFilter$5;-><init>()V
-HSPLcom/android/server/firewall/SenderFilter;-><clinit>()V
-HSPLcom/android/server/firewall/SenderPackageFilter$1;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/SenderPackageFilter;-><clinit>()V
-HSPLcom/android/server/firewall/SenderPermissionFilter$1;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/SenderPermissionFilter;-><clinit>()V
-HSPLcom/android/server/firewall/StringFilter$10;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/StringFilter$1;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/StringFilter$2;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/StringFilter$3;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/StringFilter$4;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/StringFilter$5;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/StringFilter$6;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/StringFilter$7;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/StringFilter$8;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/StringFilter$9;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/StringFilter$ValueProvider;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/firewall/StringFilter;-><clinit>()V
-HSPLcom/android/server/flags/DynamicFlagBinderDelegate$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/flags/DynamicFlagBinderDelegate$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/server/flags/DynamicFlagBinderDelegate$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/flags/DynamicFlagBinderDelegate;)V
-HSPLcom/android/server/flags/DynamicFlagBinderDelegate$1;-><init>(Lcom/android/server/flags/DynamicFlagBinderDelegate;)V
-HSPLcom/android/server/flags/DynamicFlagBinderDelegate$BinderGriever;-><init>(Lcom/android/server/flags/DynamicFlagBinderDelegate;I)V
-HSPLcom/android/server/flags/DynamicFlagBinderDelegate$BinderGriever;-><init>(Lcom/android/server/flags/DynamicFlagBinderDelegate;ILcom/android/server/flags/DynamicFlagBinderDelegate$BinderGriever-IA;)V
-HSPLcom/android/server/flags/DynamicFlagBinderDelegate;->$r8$lambda$vcppf9Un-gROJ-J-LEIMgIKeYoY(Ljava/lang/Integer;)Ljava/util/Set;
-HSPLcom/android/server/flags/DynamicFlagBinderDelegate;-><clinit>()V
-HSPLcom/android/server/flags/DynamicFlagBinderDelegate;-><init>(Lcom/android/server/flags/FlagOverrideStore;)V
-HSPLcom/android/server/flags/DynamicFlagBinderDelegate;->lambda$static$0(Ljava/lang/Integer;)Ljava/util/Set;
-HSPLcom/android/server/flags/DynamicFlagBinderDelegate;->registerCallback(ILandroid/flags/IFeatureFlagsCallback;)V
-HSPLcom/android/server/flags/FeatureFlagsBinder;-><init>(Lcom/android/server/flags/FlagOverrideStore;Lcom/android/server/flags/FlagsShellCommand;Lcom/android/server/flags/FeatureFlagsService$PermissionsChecker;)V
-HSPLcom/android/server/flags/FeatureFlagsBinder;->registerCallback(Landroid/flags/IFeatureFlagsCallback;)V
-HSPLcom/android/server/flags/FeatureFlagsService$PermissionsChecker;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/flags/FeatureFlagsService;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/flags/FeatureFlagsService;->onBootPhase(I)V
-HSPLcom/android/server/flags/FeatureFlagsService;->onStart()V
-HSPLcom/android/server/flags/FlagCache$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/flags/FlagCache;-><init>()V
-HSPLcom/android/server/flags/FlagOverrideStore;-><init>(Lcom/android/server/flags/SettingsProxy;)V
-HSPLcom/android/server/flags/FlagOverrideStore;->setChangeCallback(Lcom/android/server/flags/FlagOverrideStore$FlagChangeCallback;)V
-HSPLcom/android/server/flags/FlagsShellCommand;-><init>(Lcom/android/server/flags/FlagOverrideStore;)V
-HSPLcom/android/server/flags/GlobalSettingsProxy;-><init>(Landroid/content/ContentResolver;)V
 HSPLcom/android/server/grammaticalinflection/GrammaticalInflectionService$GrammaticalInflectionManagerInternalImpl;->canGetSystemGrammaticalGender(ILjava/lang/String;)Z
 HSPLcom/android/server/grammaticalinflection/GrammaticalInflectionService;->checkSystemTermsOfAddressIsEnabled()Z
-HSPLcom/android/server/graphics/fonts/FontManagerService$Lifecycle$1;->getSerializedSystemFontMap()Landroid/os/SharedMemory;
-HSPLcom/android/server/health/HealthRegCallbackAidl$HalInfoCallback;->healthInfoChanged(Landroid/hardware/health/HealthInfo;)V
+HSPLcom/android/server/graphics/fonts/FontManagerService$Lifecycle$1;->getSerializedSystemFontMap()Landroid/os/SharedMemory;+]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;
+HSPLcom/android/server/health/HealthRegCallbackAidl$HalInfoCallback;->healthInfoChanged(Landroid/hardware/health/HealthInfo;)V+]Lcom/android/server/health/HealthInfoCallback;Lcom/android/server/BatteryService$$ExternalSyntheticLambda4;
 HSPLcom/android/server/health/HealthRegCallbackAidl;->-$$Nest$fgetmServiceInfoCallback(Lcom/android/server/health/HealthRegCallbackAidl;)Lcom/android/server/health/HealthInfoCallback;
-HPLcom/android/server/health/HealthServiceWrapperAidl;->getHealthInfo()Landroid/hardware/health/HealthInfo;
+HPLcom/android/server/health/HealthServiceWrapperAidl;->getHealthInfo()Landroid/hardware/health/HealthInfo;+]Landroid/hardware/health/IHealth;Landroid/hardware/health/IHealth$Stub$Proxy;
 HPLcom/android/server/health/HealthServiceWrapperAidl;->getProperty(ILandroid/os/BatteryProperty;)I+]Lcom/android/server/health/HealthServiceWrapperAidl;Lcom/android/server/health/HealthServiceWrapperAidl;
 HPLcom/android/server/health/HealthServiceWrapperAidl;->getPropertyInternal(ILandroid/os/BatteryProperty;)I+]Landroid/hardware/health/IHealth;Landroid/hardware/health/IHealth$Stub$Proxy;]Landroid/os/BatteryProperty;Landroid/os/BatteryProperty;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference;
 HSPLcom/android/server/health/HealthServiceWrapperAidl;->traceBegin(Ljava/lang/String;)V
 HSPLcom/android/server/health/HealthServiceWrapperAidl;->traceEnd()V
-HPLcom/android/server/infra/AbstractMasterSystemService$1;->onPackageModified(Ljava/lang/String;)V
-HSPLcom/android/server/infra/AbstractMasterSystemService;->assertCalledByPackageOwner(Ljava/lang/String;)V
-HSPLcom/android/server/infra/AbstractMasterSystemService;->getServiceForUserLocked(I)Lcom/android/server/infra/AbstractPerUserSystemService;
-HSPLcom/android/server/infra/AbstractMasterSystemService;->getServiceListForUserLocked(I)Ljava/util/List;
-HPLcom/android/server/infra/AbstractMasterSystemService;->peekServiceForUserLocked(I)Lcom/android/server/infra/AbstractPerUserSystemService;+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/infra/AbstractMasterSystemService;megamorphic_types
+HPLcom/android/server/infra/AbstractMasterSystemService$1;->onPackageModified(Ljava/lang/String;)V+]Lcom/android/internal/content/PackageMonitor;Lcom/android/server/infra/AbstractMasterSystemService$1;]Lcom/android/server/infra/ServiceNameResolver;Lcom/android/server/infra/SecureSettingsServiceNameResolver;,Lcom/android/server/infra/FrameworkResourcesServiceNameResolver;
+HSPLcom/android/server/infra/AbstractMasterSystemService;->assertCalledByPackageOwner(Ljava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
+HSPLcom/android/server/infra/AbstractMasterSystemService;->getServiceForUserLocked(I)Lcom/android/server/infra/AbstractPerUserSystemService;+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/infra/AbstractMasterSystemService;megamorphic_types
+HSPLcom/android/server/infra/AbstractMasterSystemService;->getServiceListForUserLocked(I)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/infra/AbstractMasterSystemService;megamorphic_types]Lcom/android/server/infra/ServiceNameResolver;Lcom/android/server/infra/SecureSettingsServiceNameResolver;,Lcom/android/server/infra/FrameworkResourcesServiceNameResolver;
+HSPLcom/android/server/infra/AbstractMasterSystemService;->peekServiceForUserLocked(I)Lcom/android/server/infra/AbstractPerUserSystemService;+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/infra/AbstractMasterSystemService;megamorphic_types
 HSPLcom/android/server/infra/AbstractMasterSystemService;->peekServiceListForUserLocked(I)Ljava/util/List;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/infra/AbstractMasterSystemService;->visitServicesLocked(Lcom/android/server/infra/AbstractMasterSystemService$Visitor;)V
+HPLcom/android/server/infra/AbstractMasterSystemService;->visitServicesLocked(Lcom/android/server/infra/AbstractMasterSystemService$Visitor;)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/infra/AbstractMasterSystemService$Visitor;Lcom/android/server/infra/AbstractMasterSystemService$1$$ExternalSyntheticLambda0;,Lcom/android/server/autofill/AutofillManagerService$1$$ExternalSyntheticLambda0;
 HPLcom/android/server/infra/AbstractPerUserSystemService;->getServiceComponentName()Landroid/content/ComponentName;+]Landroid/content/pm/ServiceInfo;Landroid/content/pm/ServiceInfo;
-HSPLcom/android/server/infra/FrameworkResourcesServiceNameResolver;->readServiceName(I)Ljava/lang/String;
-HSPLcom/android/server/infra/ServiceNameBaseResolver;->getDefaultServiceNameList(I)[Ljava/lang/String;
+HSPLcom/android/server/infra/FrameworkResourcesServiceNameResolver;->readServiceName(I)Ljava/lang/String;+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/infra/ServiceNameBaseResolver;->getDefaultServiceNameList(I)[Ljava/lang/String;+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/infra/ServiceNameBaseResolver;Lcom/android/server/infra/SecureSettingsServiceNameResolver;,Lcom/android/server/infra/FrameworkResourcesServiceNameResolver;
 HSPLcom/android/server/infra/ServiceNameBaseResolver;->getServiceNameList(I)[Ljava/lang/String;
-HSPLcom/android/server/input/AmbientKeyboardBacklightController;->handleDisplayChange()V
+HSPLcom/android/server/infra/ServiceNameBaseResolver;->isTemporary(I)Z
+HSPLcom/android/server/input/AmbientKeyboardBacklightController;->handleDisplayChange()V+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;
 HSPLcom/android/server/input/BatteryController$1;->onInputDeviceChanged(I)V
-HSPLcom/android/server/input/InputManagerService$AdditionalDisplayInputProperties;-><init>()V
-HSPLcom/android/server/input/InputManagerService$AdditionalDisplayInputProperties;->reset()V
-HPLcom/android/server/input/InputManagerService$LocalService;->notifyUserActivity()V
-HSPLcom/android/server/input/InputManagerService;-><clinit>()V
+HSPLcom/android/server/input/InputManagerService$InputManagerHandler;->handleMessage(Landroid/os/Message;)V
+HSPLcom/android/server/input/InputManagerService$LocalService;->notifyUserActivity()V+]Lcom/android/server/input/InputManagerService$KeyboardBacklightControllerInterface;Lcom/android/server/input/KeyboardBacklightController;
 HSPLcom/android/server/input/InputManagerService;->deliverInputDevicesChanged([Landroid/view/InputDevice;)V+]Landroid/view/InputDevice;Landroid/view/InputDevice;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/input/InputManagerService$InputDevicesChangedListenerRecord;Lcom/android/server/input/InputManagerService$InputDevicesChangedListenerRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/input/InputManagerService;->flatten(Ljava/util/Map;)[Ljava/lang/String;+]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/HashMap;
 HSPLcom/android/server/input/InputManagerService;->getExcludedDeviceNames()[Ljava/lang/String;
 HSPLcom/android/server/input/InputManagerService;->getInputDevice(I)Landroid/view/InputDevice;
 HSPLcom/android/server/input/InputManagerService;->setDisplayViewportsInternal(Ljava/util/List;)V
 HSPLcom/android/server/input/KeyboardBacklightController$$ExternalSyntheticLambda2;->handleMessage(Landroid/os/Message;)Z
-HSPLcom/android/server/input/KeyboardBacklightController;->$r8$lambda$x56uNWQ8yZ3aSFy91aBfHRGVrXg(Lcom/android/server/input/KeyboardBacklightController;Landroid/os/Message;)Z
 HSPLcom/android/server/input/KeyboardBacklightController;->handleMessage(Landroid/os/Message;)Z+]Lcom/android/server/input/KeyboardBacklightController;Lcom/android/server/input/KeyboardBacklightController;]Ljava/lang/Boolean;Ljava/lang/Boolean;
-HPLcom/android/server/input/KeyboardBacklightController;->handleUserActivity()V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/input/KeyboardBacklightController;->notifyUserActivity()V
+HSPLcom/android/server/input/KeyboardBacklightController;->handleUserActivity()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/Handler;Landroid/os/Handler;
+HSPLcom/android/server/input/KeyboardBacklightController;->notifyUserActivity()V
 HSPLcom/android/server/input/KeyboardLayoutManager$3;->visitKeyboardLayout(Landroid/content/res/Resources;ILandroid/hardware/input/KeyboardLayout;)V+]Landroid/hardware/input/InputDeviceIdentifier;Landroid/hardware/input/InputDeviceIdentifier;]Ljava/lang/Object;Ljava/lang/String;]Landroid/hardware/input/KeyboardLayout;Landroid/hardware/input/KeyboardLayout;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/input/KeyboardLayoutManager$KeyboardIdentifier;->-$$Nest$fgetmIdentifier(Lcom/android/server/input/KeyboardLayoutManager$KeyboardIdentifier;)Landroid/hardware/input/InputDeviceIdentifier;
 HSPLcom/android/server/input/KeyboardLayoutManager$KeyboardIdentifier;->toString()Ljava/lang/String;
 HSPLcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutDescriptor;->format(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutDescriptor;->parse(Ljava/lang/String;)Lcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutDescriptor;
 HSPLcom/android/server/input/KeyboardLayoutManager$LayoutKey;->toString()Ljava/lang/String;
+HSPLcom/android/server/input/KeyboardLayoutManager;->getKeyboardLayoutListForInputDeviceInternal(Lcom/android/server/input/KeyboardLayoutManager$KeyboardIdentifier;Lcom/android/server/input/KeyboardLayoutManager$ImeInfo;)[Landroid/hardware/input/KeyboardLayout;
 HSPLcom/android/server/input/KeyboardLayoutManager;->getKeyboardLayoutOverlay(Landroid/hardware/input/InputDeviceIdentifier;Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
 HSPLcom/android/server/input/KeyboardLayoutManager;->getLocalesFromLanguageTags(Ljava/lang/String;)Landroid/os/LocaleList;
-HSPLcom/android/server/input/KeyboardLayoutManager;->getMatchingLayoutForProvidedLanguageTag(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String;+]Ljava/util/Locale;Ljava/util/Locale;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/Arrays$ArrayList;,Ljava/util/ArrayList;]Landroid/hardware/input/KeyboardLayout;Landroid/hardware/input/KeyboardLayout;]Landroid/os/LocaleList;Landroid/os/LocaleList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;,Ljava/util/Arrays$ArrayItr;
+HSPLcom/android/server/input/KeyboardLayoutManager;->getMatchingLayoutForProvidedLanguageTag(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Locale;Ljava/util/Locale;]Ljava/util/List;Ljava/util/Arrays$ArrayList;,Ljava/util/ArrayList;]Landroid/hardware/input/KeyboardLayout;Landroid/hardware/input/KeyboardLayout;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;,Ljava/util/Arrays$ArrayItr;]Landroid/os/LocaleList;Landroid/os/LocaleList;
 HSPLcom/android/server/input/KeyboardLayoutManager;->getMatchingLayoutForProvidedLanguageTagAndLayoutType([Landroid/hardware/input/KeyboardLayout;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/hardware/input/KeyboardLayout;Landroid/hardware/input/KeyboardLayout;
 HSPLcom/android/server/input/KeyboardLayoutManager;->getScriptCodes(Ljava/util/Locale;)[I+]Ljava/util/Locale;Ljava/util/Locale;
 HSPLcom/android/server/input/KeyboardLayoutManager;->haveCommonValue([I[I)Z
 HSPLcom/android/server/input/KeyboardLayoutManager;->isLayoutCompatibleWithLanguageTag(Landroid/hardware/input/KeyboardLayout;Ljava/lang/String;)Z+]Landroid/hardware/input/KeyboardLayout;Landroid/hardware/input/KeyboardLayout;]Landroid/os/LocaleList;Landroid/os/LocaleList;
-HSPLcom/android/server/input/KeyboardLayoutManager;->visitAllKeyboardLayouts(Lcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutVisitor;)V
-HSPLcom/android/server/input/KeyboardLayoutManager;->visitKeyboardLayoutsInPackage(Landroid/content/pm/PackageManager;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutVisitor;)V+]Lcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutVisitor;Lcom/android/server/input/KeyboardLayoutManager$3;,Lcom/android/server/input/KeyboardLayoutManager$$ExternalSyntheticLambda7;,Lcom/android/server/input/KeyboardLayoutManager$$ExternalSyntheticLambda1;]Ljava/lang/Object;Ljava/lang/String;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Ljava/lang/CharSequence;Ljava/lang/String;]Landroid/content/res/XmlResourceParser;Landroid/content/res/XmlBlock$Parser;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
+HSPLcom/android/server/input/KeyboardLayoutManager;->visitAllKeyboardLayouts(Lcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutVisitor;)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HSPLcom/android/server/input/KeyboardLayoutManager;->visitKeyboardLayout(Ljava/lang/String;Lcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutVisitor;)V
+HSPLcom/android/server/input/KeyboardLayoutManager;->visitKeyboardLayoutsInPackage(Landroid/content/pm/PackageManager;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutVisitor;)V+]Lcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutVisitor;Lcom/android/server/input/KeyboardLayoutManager$3;,Lcom/android/server/input/KeyboardLayoutManager$$ExternalSyntheticLambda1;,Lcom/android/server/input/KeyboardLayoutManager$$ExternalSyntheticLambda7;]Ljava/lang/Object;Ljava/lang/String;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Ljava/lang/CharSequence;Ljava/lang/String;]Landroid/content/res/XmlResourceParser;Landroid/content/res/XmlBlock$Parser;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
 HSPLcom/android/server/inputmethod/AdditionalSubtypeUtils;->loadFromFile(Landroid/util/AtomicFile;)Lcom/android/server/inputmethod/AdditionalSubtypeMap;
 HSPLcom/android/server/inputmethod/HardwareKeyboardShortcutController;->reset(Lcom/android/server/inputmethod/InputMethodMap;)V
 HPLcom/android/server/inputmethod/IInputMethodInvoker;->startInput(Landroid/os/IBinder;Lcom/android/internal/inputmethod/IRemoteInputConnection;Landroid/view/inputmethod/EditorInfo;ZILandroid/window/ImeOnBackInvokedDispatcher;)V
 HPLcom/android/server/inputmethod/ImeTrackerService$History$Entry;-><init>(Ljava/lang/String;IIIIIZ)V
-HPLcom/android/server/inputmethod/ImeTrackerService$History;->getEntry(Landroid/os/IBinder;)Lcom/android/server/inputmethod/ImeTrackerService$History$Entry;
-HPLcom/android/server/inputmethod/ImeTrackerService$History;->setFinished(Landroid/view/inputmethod/ImeTracker$Token;II)V
+HPLcom/android/server/inputmethod/ImeTrackerService$History;->setFinished(Landroid/view/inputmethod/ImeTracker$Token;II)V+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;
 HPLcom/android/server/inputmethod/ImeTrackerService;->onProgress(Landroid/os/IBinder;I)V
 HPLcom/android/server/inputmethod/ImeVisibilityStateComputer$ImeTargetWindowState;-><init>(IIZZZI)V
 HPLcom/android/server/inputmethod/ImeVisibilityStateComputer;->computeState(Lcom/android/server/inputmethod/ImeVisibilityStateComputer$ImeTargetWindowState;Z)Lcom/android/server/inputmethod/ImeVisibilityStateComputer$ImeVisibilityResult;
@@ -4525,138 +3290,144 @@
 HPLcom/android/server/inputmethod/InputMethodManagerInternal;->get()Lcom/android/server/inputmethod/InputMethodManagerInternal;
 HPLcom/android/server/inputmethod/InputMethodManagerService;->attachNewAccessibilityLocked(IZ)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->attachNewInputLocked(IZ)Lcom/android/internal/inputmethod/InputBindResult;
-HPLcom/android/server/inputmethod/InputMethodManagerService;->canCallerAccessInputMethod(Ljava/lang/String;IILcom/android/server/inputmethod/InputMethodSettings;)Z
+HPLcom/android/server/inputmethod/InputMethodManagerService;->canCallerAccessInputMethod(Ljava/lang/String;IILcom/android/server/inputmethod/InputMethodSettings;)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/inputmethod/InputMethodManagerService;->filterInputMethodServices(Lcom/android/server/inputmethod/AdditionalSubtypeMap;Ljava/util/List;Landroid/content/Context;Ljava/util/List;)Lcom/android/server/inputmethod/InputMethodMap;
 HSPLcom/android/server/inputmethod/InputMethodManagerService;->getCurTokenLocked()Landroid/os/IBinder;
+HPLcom/android/server/inputmethod/InputMethodManagerService;->getEnabledInputMethodList(I)Ljava/util/List;
 HPLcom/android/server/inputmethod/InputMethodManagerService;->getInputMethodNavButtonFlagsLocked()I
 HSPLcom/android/server/inputmethod/InputMethodManagerService;->getSelectedMethodIdLocked()Ljava/lang/String;
 HPLcom/android/server/inputmethod/InputMethodManagerService;->hideCurrentInputLocked(Landroid/os/IBinder;Landroid/view/inputmethod/ImeTracker$Token;ILandroid/os/ResultReceiver;I)Z
+HSPLcom/android/server/inputmethod/InputMethodManagerService;->queryInputMethodServicesInternal(Landroid/content/Context;ILcom/android/server/inputmethod/AdditionalSubtypeMap;I)Lcom/android/server/inputmethod/InputMethodSettings;
 HPLcom/android/server/inputmethod/InputMethodManagerService;->reportStartInput(Landroid/os/IBinder;Landroid/os/IBinder;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->requestClientSessionForAccessibilityLocked(Lcom/android/server/inputmethod/ClientState;)V
 HPLcom/android/server/inputmethod/InputMethodManagerService;->setEnabledSessionForAccessibilityLocked(Landroid/util/SparseArray;)V
-HPLcom/android/server/inputmethod/InputMethodManagerService;->shouldShowImeSwitcherLocked(I)Z
+HPLcom/android/server/inputmethod/InputMethodManagerService;->shouldShowImeSwitcherLocked(I)Z+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/wm/WindowManagerInternal;Lcom/android/server/wm/WindowManagerService$LocalService;
 HPLcom/android/server/inputmethod/InputMethodManagerService;->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;
 HPLcom/android/server/inputmethod/InputMethodManagerService;->startInputOrWindowGainedFocusInternalLocked(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/server/inputmethod/ClientState;)Lcom/android/internal/inputmethod/InputBindResult;
 HPLcom/android/server/inputmethod/InputMethodManagerService;->startInputUncheckedLocked(Lcom/android/server/inputmethod/ClientState;Lcom/android/internal/inputmethod/IRemoteInputConnection;Lcom/android/internal/inputmethod/IRemoteAccessibilityInputConnection;Landroid/view/inputmethod/EditorInfo;IIILandroid/window/ImeOnBackInvokedDispatcher;)Lcom/android/internal/inputmethod/InputBindResult;
 HSPLcom/android/server/inputmethod/InputMethodManagerService;->unbindCurrentClientLocked(I)V
-HSPLcom/android/server/inputmethod/InputMethodManagerService;->updateSystemUiLocked(II)V
+HSPLcom/android/server/inputmethod/InputMethodManagerService;->updateSystemUiLocked(II)V+]Lcom/android/server/statusbar/StatusBarManagerInternal;Lcom/android/server/statusbar/StatusBarManagerService$1;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;
 HSPLcom/android/server/inputmethod/InputMethodMap;->get(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodInfo;
-HSPLcom/android/server/inputmethod/InputMethodSettings;->createEnabledInputMethodList(Ljava/util/List;Ljava/util/function/Predicate;)Ljava/util/ArrayList;
+HSPLcom/android/server/inputmethod/InputMethodSettings;-><init>(Lcom/android/server/inputmethod/InputMethodMap;I)V
+HSPLcom/android/server/inputmethod/InputMethodSettings;->createEnabledInputMethodList(Ljava/util/List;Ljava/util/function/Predicate;)Ljava/util/ArrayList;+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/function/Predicate;Lcom/android/server/inputmethod/InputMethodManagerService$$ExternalSyntheticLambda6;,Lcom/android/server/inputmethod/InputMethodManagerService$$ExternalSyntheticLambda19;
 HSPLcom/android/server/inputmethod/InputMethodSettings;->getEnabledInputMethodListWithFilter(Ljava/util/function/Predicate;)Ljava/util/ArrayList;
 HSPLcom/android/server/inputmethod/InputMethodSettings;->getEnabledInputMethodSubtypeList(Landroid/view/inputmethod/InputMethodInfo;)Ljava/util/List;+]Lcom/android/server/inputmethod/InputMethodMap;Lcom/android/server/inputmethod/InputMethodMap;]Landroid/view/inputmethod/InputMethodSubtype;Landroid/view/inputmethod/InputMethodSubtype;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/inputmethod/InputMethodSettings;Lcom/android/server/inputmethod/InputMethodSettings;]Landroid/view/inputmethod/InputMethodInfo;Landroid/view/inputmethod/InputMethodInfo;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/inputmethod/InputMethodSettings;->getEnabledInputMethodSubtypeList(Landroid/view/inputmethod/InputMethodInfo;Z)Ljava/util/List;
+HSPLcom/android/server/inputmethod/InputMethodSettings;->getEnabledInputMethodSubtypeList(Landroid/view/inputmethod/InputMethodInfo;Z)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/inputmethod/InputMethodSettings;->getEnabledInputMethodsAndSubtypeList()Ljava/util/List;+]Lcom/android/server/inputmethod/InputMethodSettings;Lcom/android/server/inputmethod/InputMethodSettings;]Landroid/text/TextUtils$SimpleStringSplitter;Landroid/text/TextUtils$SimpleStringSplitter;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/inputmethod/InputMethodSettings;->getEnabledInputMethodsStr()Ljava/lang/String;
 HSPLcom/android/server/inputmethod/InputMethodSettings;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/inputmethod/InputMethodSettings;->getUserId()I
 HSPLcom/android/server/inputmethod/InputMethodSubtypeSwitchingController;->getSortedInputMethodAndSubtypeList(ZZZLandroid/content/Context;Lcom/android/server/inputmethod/InputMethodMap;I)Ljava/util/List;+]Landroid/view/inputmethod/InputMethodSubtype;Landroid/view/inputmethod/InputMethodSubtype;]Ljava/util/Locale;Ljava/util/Locale;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/inputmethod/InputMethodSettings;Lcom/android/server/inputmethod/InputMethodSettings;]Landroid/view/inputmethod/InputMethodInfo;Landroid/view/inputmethod/InputMethodInfo;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/os/LocaleList;Landroid/os/LocaleList;
+HSPLcom/android/server/inputmethod/InputMethodUtils;->splitEnabledImeStr(Ljava/lang/String;Ljava/util/function/Consumer;)V
 HSPLcom/android/server/inputmethod/SecureSettingsWrapper$UnlockedUserImpl;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/inputmethod/SecureSettingsWrapper;->get(I)Lcom/android/server/inputmethod/SecureSettingsWrapper$ReaderWriter;
+HSPLcom/android/server/inputmethod/SecureSettingsWrapper;->get(I)Lcom/android/server/inputmethod/SecureSettingsWrapper$ReaderWriter;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/inputmethod/SecureSettingsWrapper;->getString(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
-HSPLcom/android/server/inputmethod/SubtypeUtils;->getImplicitlyApplicableSubtypes(Landroid/os/LocaleList;Landroid/view/inputmethod/InputMethodInfo;)Ljava/util/ArrayList;
-HSPLcom/android/server/inputmethod/SystemLocaleWrapper;->get(I)Landroid/os/LocaleList;
-HPLcom/android/server/job/JobConcurrencyManager$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/inputmethod/SubtypeUtils;->getImplicitlyApplicableSubtypes(Landroid/os/LocaleList;Landroid/view/inputmethod/InputMethodInfo;)Ljava/util/ArrayList;
+HSPLcom/android/server/job/JobConcurrencyManager$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/job/JobConcurrencyManager$$ExternalSyntheticLambda2;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HPLcom/android/server/job/JobConcurrencyManager$AssignmentInfo;->clear()V
-HPLcom/android/server/job/JobConcurrencyManager$ContextAssignment;->clear()V
-HPLcom/android/server/job/JobConcurrencyManager$PackageStats;->-$$Nest$madjustRunningCount(Lcom/android/server/job/JobConcurrencyManager$PackageStats;ZZ)V
-HPLcom/android/server/job/JobConcurrencyManager$PackageStats;->-$$Nest$madjustStagedCount(Lcom/android/server/job/JobConcurrencyManager$PackageStats;ZZ)V
-HPLcom/android/server/job/JobConcurrencyManager$PackageStats;->-$$Nest$mresetStagedCount(Lcom/android/server/job/JobConcurrencyManager$PackageStats;)V
-HPLcom/android/server/job/JobConcurrencyManager$PackageStats;->-$$Nest$msetPackage(Lcom/android/server/job/JobConcurrencyManager$PackageStats;ILjava/lang/String;)V
-HPLcom/android/server/job/JobConcurrencyManager$PackageStats;-><init>()V
-HPLcom/android/server/job/JobConcurrencyManager$PackageStats;->adjustRunningCount(ZZ)V
-HPLcom/android/server/job/JobConcurrencyManager$PackageStats;->adjustStagedCount(ZZ)V
-HPLcom/android/server/job/JobConcurrencyManager$PackageStats;->resetStagedCount()V
-HPLcom/android/server/job/JobConcurrencyManager$PackageStats;->setPackage(ILjava/lang/String;)V
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->adjustPendingJobCount(IZ)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->canJobStart(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->decrementPendingJobCount(I)V+]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->getRunningJobCount(I)I
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->incrementPendingJobCount(I)V
+HSPLcom/android/server/job/JobConcurrencyManager$AssignmentInfo;->clear()V
+HSPLcom/android/server/job/JobConcurrencyManager$ContextAssignment;->clear()V
+HSPLcom/android/server/job/JobConcurrencyManager$PackageStats;->-$$Nest$madjustRunningCount(Lcom/android/server/job/JobConcurrencyManager$PackageStats;ZZ)V
+HSPLcom/android/server/job/JobConcurrencyManager$PackageStats;->-$$Nest$madjustStagedCount(Lcom/android/server/job/JobConcurrencyManager$PackageStats;ZZ)V+]Lcom/android/server/job/JobConcurrencyManager$PackageStats;Lcom/android/server/job/JobConcurrencyManager$PackageStats;
+HSPLcom/android/server/job/JobConcurrencyManager$PackageStats;->-$$Nest$mresetStagedCount(Lcom/android/server/job/JobConcurrencyManager$PackageStats;)V
+HSPLcom/android/server/job/JobConcurrencyManager$PackageStats;->-$$Nest$msetPackage(Lcom/android/server/job/JobConcurrencyManager$PackageStats;ILjava/lang/String;)V
+HSPLcom/android/server/job/JobConcurrencyManager$PackageStats;-><init>()V
+HSPLcom/android/server/job/JobConcurrencyManager$PackageStats;->adjustRunningCount(ZZ)V
+HSPLcom/android/server/job/JobConcurrencyManager$PackageStats;->adjustStagedCount(ZZ)V
+HSPLcom/android/server/job/JobConcurrencyManager$PackageStats;->resetStagedCount()V
+HSPLcom/android/server/job/JobConcurrencyManager$PackageStats;->setPackage(ILjava/lang/String;)V
+HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->adjustPendingJobCount(IZ)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->canJobStart(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->decrementPendingJobCount(I)V+]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
+HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->getRunningJobCount(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->incrementPendingJobCount(I)V
 HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->incrementRunningJobCount(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->maybeAdjustReservations(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->onCountDone()V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->onJobFinished(I)V
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->onJobStarted(I)V
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->resetCounts()V
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->resetStagingCount()V
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->setConfig(Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;
-HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->stageJob(II)V
-HPLcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;->getMax(I)I
-HPLcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;->getMaxTotal()I
-HPLcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;->getMinReserved(I)I
+HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->onCountDone()V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->onJobFinished(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
+HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->onJobStarted(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->resetCounts()V
+HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->resetStagingCount()V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->setConfig(Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;
+HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->stageJob(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
+HSPLcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;->getMax(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HSPLcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;->getMaxTotal()I
+HSPLcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;->getMinReserved(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HPLcom/android/server/job/JobConcurrencyManager;->$r8$lambda$VhD--0a_vmTAP5SEQ54BuaJ_sSE(Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;)I
-HPLcom/android/server/job/JobConcurrencyManager;->$r8$lambda$nNxi-L4_H0efU9cBGIS9vGrT-zc(Lcom/android/server/job/JobConcurrencyManager$PackageStats;)V
+HSPLcom/android/server/job/JobConcurrencyManager;->$r8$lambda$nNxi-L4_H0efU9cBGIS9vGrT-zc(Lcom/android/server/job/JobConcurrencyManager$PackageStats;)V
 HSPLcom/android/server/job/JobConcurrencyManager;->assignJobsToContextsInternalLocked()V+]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
 HSPLcom/android/server/job/JobConcurrencyManager;->assignJobsToContextsLocked()V+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
-HPLcom/android/server/job/JobConcurrencyManager;->carryOutAssignmentChangesLocked(Landroid/util/ArraySet;)V+]Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
-HPLcom/android/server/job/JobConcurrencyManager;->cleanUpAfterAssignmentChangesLocked(Landroid/util/ArraySet;Landroid/util/ArraySet;Ljava/util/List;Ljava/util/List;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;Landroid/util/SparseIntArray;)V+]Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
+HSPLcom/android/server/job/JobConcurrencyManager;->carryOutAssignmentChangesLocked(Landroid/util/ArraySet;)V+]Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
+HSPLcom/android/server/job/JobConcurrencyManager;->cleanUpAfterAssignmentChangesLocked(Landroid/util/ArraySet;Landroid/util/ArraySet;Ljava/util/List;Ljava/util/List;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;Landroid/util/SparseIntArray;)V+]Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
 HPLcom/android/server/job/JobConcurrencyManager;->determineAssignmentsLocked(Landroid/util/ArraySet;Landroid/util/ArraySet;Ljava/util/List;Ljava/util/List;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;
-HPLcom/android/server/job/JobConcurrencyManager;->getJobWorkTypes(Lcom/android/server/job/controllers/JobStatus;)I+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
-HPLcom/android/server/job/JobConcurrencyManager;->getPkgStatsLocked(ILjava/lang/String;)Lcom/android/server/job/JobConcurrencyManager$PackageStats;+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;
+HSPLcom/android/server/job/JobConcurrencyManager;->getJobWorkTypes(Lcom/android/server/job/controllers/JobStatus;)I+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
+HSPLcom/android/server/job/JobConcurrencyManager;->getPkgStatsLocked(ILjava/lang/String;)Lcom/android/server/job/JobConcurrencyManager$PackageStats;+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;
 HSPLcom/android/server/job/JobConcurrencyManager;->getRunningJobsLocked()Landroid/util/ArraySet;
-HPLcom/android/server/job/JobConcurrencyManager;->hasImmediacyPrivilegeLocked(Lcom/android/server/job/controllers/JobStatus;Landroid/util/SparseIntArray;)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
+HSPLcom/android/server/job/JobConcurrencyManager;->hasImmediacyPrivilegeLocked(Lcom/android/server/job/controllers/JobStatus;Landroid/util/SparseIntArray;)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
 HSPLcom/android/server/job/JobConcurrencyManager;->isJobRunningLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HPLcom/android/server/job/JobConcurrencyManager;->isNotificationAssociatedWithAnyUserInitiatedJobs(IILjava/lang/String;)Z
-HPLcom/android/server/job/JobConcurrencyManager;->isPkgConcurrencyLimitedLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
+HPLcom/android/server/job/JobConcurrencyManager;->isNotificationAssociatedWithAnyUserInitiatedJobs(IILjava/lang/String;)Z+]Lcom/android/server/job/JobNotificationCoordinator;Lcom/android/server/job/JobNotificationCoordinator;
+HSPLcom/android/server/job/JobConcurrencyManager;->isPkgConcurrencyLimitedLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
 HPLcom/android/server/job/JobConcurrencyManager;->lambda$static$0(Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;)I+]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
-HPLcom/android/server/job/JobConcurrencyManager;->noteConcurrency(Z)V+]Lcom/android/modules/expresslog/Histogram;Lcom/android/modules/expresslog/Histogram;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
+HSPLcom/android/server/job/JobConcurrencyManager;->noteConcurrency(Z)V+]Lcom/android/modules/expresslog/Histogram;Lcom/android/modules/expresslog/Histogram;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
 HPLcom/android/server/job/JobConcurrencyManager;->onJobCompletedLocked(Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/controllers/JobStatus;I)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;
-HPLcom/android/server/job/JobConcurrencyManager;->prepareForAssignmentDeterminationLocked(Landroid/util/ArraySet;Ljava/util/List;Ljava/util/List;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
-HPLcom/android/server/job/JobConcurrencyManager;->refreshSystemStateLocked()Z+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1;]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Landroid/app/IActivityManager;Lcom/android/server/am/ActivityManagerService;
-HPLcom/android/server/job/JobConcurrencyManager;->shouldRunAsFgUserJob(Lcom/android/server/job/controllers/JobStatus;)Z
-HPLcom/android/server/job/JobConcurrencyManager;->shouldStopRunningJobLocked(Lcom/android/server/job/JobServiceContext;)Ljava/lang/String;+]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/os/PowerManager;Landroid/os/PowerManager;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/restrictions/JobRestriction;Lcom/android/server/job/restrictions/ThermalStatusRestriction;
-HPLcom/android/server/job/JobConcurrencyManager;->startJobLocked(Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/controllers/JobStatus;I)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/os/PowerManager;Landroid/os/PowerManager;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/job/JobConcurrencyManager;->prepareForAssignmentDeterminationLocked(Landroid/util/ArraySet;Ljava/util/List;Ljava/util/List;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
+HSPLcom/android/server/job/JobConcurrencyManager;->refreshSystemStateLocked()Z+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1;]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Landroid/app/IActivityManager;Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/job/JobConcurrencyManager;->shouldRunAsFgUserJob(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobConcurrencyManager;->shouldStopRunningJobLocked(Lcom/android/server/job/JobServiceContext;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/os/PowerManager;Landroid/os/PowerManager;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/restrictions/JobRestriction;Lcom/android/server/job/restrictions/ThermalStatusRestriction;
+HSPLcom/android/server/job/JobConcurrencyManager;->startJobLocked(Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/controllers/JobStatus;I)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/os/PowerManager;Landroid/os/PowerManager;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/job/JobConcurrencyManager;->stopJobOnServiceContextLocked(Lcom/android/server/job/controllers/JobStatus;IILjava/lang/String;)Z+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
-HPLcom/android/server/job/JobConcurrencyManager;->updateCounterConfigLocked()V+]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
-HPLcom/android/server/job/JobConcurrencyManager;->updateNonRunningPrioritiesLocked(Lcom/android/server/job/PendingJobQueue;Z)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
-HPLcom/android/server/job/JobNotificationCoordinator;->isNotificationAssociatedWithAnyUserInitiatedJobs(IILjava/lang/String;)Z
-HPLcom/android/server/job/JobNotificationCoordinator;->removeNotificationAssociation(Lcom/android/server/job/JobServiceContext;ILcom/android/server/job/controllers/JobStatus;)V
-HPLcom/android/server/job/JobPackageTracker$DataSet;->decActive(ILjava/lang/String;JI)V
-HPLcom/android/server/job/JobPackageTracker$DataSet;->decPending(ILjava/lang/String;J)V
+HSPLcom/android/server/job/JobConcurrencyManager;->updateCounterConfigLocked()V+]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
+HSPLcom/android/server/job/JobConcurrencyManager;->updateNonRunningPrioritiesLocked(Lcom/android/server/job/PendingJobQueue;Z)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;
+HPLcom/android/server/job/JobNotificationCoordinator;->isNotificationAssociatedWithAnyUserInitiatedJobs(IILjava/lang/String;)Z+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;
+HPLcom/android/server/job/JobNotificationCoordinator;->removeNotificationAssociation(Lcom/android/server/job/JobServiceContext;ILcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Lcom/android/server/notification/NotificationManagerInternal;Lcom/android/server/notification/NotificationManagerService$13;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
+HPLcom/android/server/job/JobPackageTracker$DataSet;->decActive(ILjava/lang/String;JI)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobPackageTracker$DataSet;Lcom/android/server/job/JobPackageTracker$DataSet;
+HSPLcom/android/server/job/JobPackageTracker$DataSet;->decPending(ILjava/lang/String;J)V
 HSPLcom/android/server/job/JobPackageTracker$DataSet;->getEntry(ILjava/lang/String;)Lcom/android/server/job/JobPackageTracker$PackageEntry;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/job/JobPackageTracker$DataSet;->getOrCreateEntry(ILjava/lang/String;)Lcom/android/server/job/JobPackageTracker$PackageEntry;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/job/JobPackageTracker$DataSet;->getTotalTime(J)J
-HPLcom/android/server/job/JobPackageTracker$DataSet;->incActive(ILjava/lang/String;J)V
-HPLcom/android/server/job/JobPackageTracker$DataSet;->incPending(ILjava/lang/String;J)V
-HPLcom/android/server/job/JobPackageTracker$PackageEntry;->getActiveTime(J)J
-HPLcom/android/server/job/JobPackageTracker$PackageEntry;->getPendingTime(J)J
-HPLcom/android/server/job/JobPackageTracker;->addEvent(IILjava/lang/String;IILjava/lang/String;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/internal/util/jobs/RingBufferIndices;Lcom/android/internal/util/jobs/RingBufferIndices;
+HSPLcom/android/server/job/JobPackageTracker$DataSet;->getOrCreateEntry(ILjava/lang/String;)Lcom/android/server/job/JobPackageTracker$PackageEntry;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/job/JobPackageTracker$DataSet;->getTotalTime(J)J
+HSPLcom/android/server/job/JobPackageTracker$DataSet;->incActive(ILjava/lang/String;J)V
+HSPLcom/android/server/job/JobPackageTracker$DataSet;->incPending(ILjava/lang/String;J)V
+HSPLcom/android/server/job/JobPackageTracker$PackageEntry;->getActiveTime(J)J
+HSPLcom/android/server/job/JobPackageTracker$PackageEntry;->getPendingTime(J)J
+HSPLcom/android/server/job/JobPackageTracker;->addEvent(IILjava/lang/String;IILjava/lang/String;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/internal/util/jobs/RingBufferIndices;Lcom/android/internal/util/jobs/RingBufferIndices;
 HSPLcom/android/server/job/JobPackageTracker;->getLoadFactor(Lcom/android/server/job/controllers/JobStatus;)F+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobPackageTracker$PackageEntry;Lcom/android/server/job/JobPackageTracker$PackageEntry;]Lcom/android/server/job/JobPackageTracker$DataSet;Lcom/android/server/job/JobPackageTracker$DataSet;
-HPLcom/android/server/job/JobPackageTracker;->noteActive(Lcom/android/server/job/controllers/JobStatus;)V
-HPLcom/android/server/job/JobPackageTracker;->noteConcurrency(II)V
-HPLcom/android/server/job/JobPackageTracker;->noteInactive(Lcom/android/server/job/controllers/JobStatus;ILjava/lang/String;)V
-HPLcom/android/server/job/JobPackageTracker;->noteNonpending(Lcom/android/server/job/controllers/JobStatus;)V
-HPLcom/android/server/job/JobPackageTracker;->notePending(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/JobPackageTracker$DataSet;Lcom/android/server/job/JobPackageTracker$DataSet;
-HPLcom/android/server/job/JobPackageTracker;->rebatchIfNeeded(J)V+]Lcom/android/server/job/JobPackageTracker$DataSet;Lcom/android/server/job/JobPackageTracker$DataSet;
+HSPLcom/android/server/job/JobPackageTracker;->noteActive(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/JobPackageTracker$DataSet;Lcom/android/server/job/JobPackageTracker$DataSet;
+HSPLcom/android/server/job/JobPackageTracker;->noteConcurrency(II)V
+HPLcom/android/server/job/JobPackageTracker;->noteInactive(Lcom/android/server/job/controllers/JobStatus;ILjava/lang/String;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/JobPackageTracker$DataSet;Lcom/android/server/job/JobPackageTracker$DataSet;
+HSPLcom/android/server/job/JobPackageTracker;->noteNonpending(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1;
+HSPLcom/android/server/job/JobPackageTracker;->notePending(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/JobPackageTracker$DataSet;Lcom/android/server/job/JobPackageTracker$DataSet;
+HSPLcom/android/server/job/JobPackageTracker;->rebatchIfNeeded(J)V+]Lcom/android/server/job/JobPackageTracker$DataSet;Lcom/android/server/job/JobPackageTracker$DataSet;
 HPLcom/android/server/job/JobSchedulerService$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/job/JobSchedulerService$$ExternalSyntheticLambda4;->getCategory(ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/utils/quota/Category;
 HSPLcom/android/server/job/JobSchedulerService$1;->millis()J
 HSPLcom/android/server/job/JobSchedulerService$2;->millis()J
+HPLcom/android/server/job/JobSchedulerService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HSPLcom/android/server/job/JobSchedulerService$4;->onUidActive(I)V
+HSPLcom/android/server/job/JobSchedulerService$4;->onUidIdle(IZ)V
 HSPLcom/android/server/job/JobSchedulerService$4;->onUidStateChanged(IIJI)V+]Landroid/os/Handler;Lcom/android/server/job/JobSchedulerService$JobHandler;]Landroid/os/Message;Landroid/os/Message;
 HSPLcom/android/server/job/JobSchedulerService$BatteryStateTracker;->isBatteryNotLow()Z
 HSPLcom/android/server/job/JobSchedulerService$BatteryStateTracker;->isCharging()Z
 HSPLcom/android/server/job/JobSchedulerService$BatteryStateTracker;->isConsideredCharging()Z
-HSPLcom/android/server/job/JobSchedulerService$JobHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/DeviceIdleJobsController;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/IUserVisibleJobObserver;Landroid/app/job/IUserVisibleJobObserver$Stub$Proxy;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
+HSPLcom/android/server/job/JobSchedulerService$JobHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/DeviceIdleJobsController;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/job/IUserVisibleJobObserver;Landroid/app/job/IUserVisibleJobObserver$Stub$Proxy;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
 HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->canPersistJobs(II)Z
-HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->cancel(Ljava/lang/String;I)V
+HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->cancel(Ljava/lang/String;I)V+]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;
 HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enforceBuilderApiPermissions(IILandroid/app/job/JobInfo;)Landroid/app/job/JobInfo;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;
-HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enforceValidJobRequest(IILandroid/app/job/JobInfo;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/SystemService;Lcom/android/server/job/JobSchedulerService;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
-HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enqueue(Ljava/lang/String;Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;)I
+HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enforceValidJobRequest(IILandroid/app/job/JobInfo;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/SystemService;Lcom/android/server/job/JobSchedulerService;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enqueue(Ljava/lang/String;Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;)I+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;
 HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->getAllPendingJobsInNamespace(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;
 HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->getPendingJob(Ljava/lang/String;I)Landroid/app/job/JobInfo;
 HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->schedule(Ljava/lang/String;Landroid/app/job/JobInfo;)I+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;
 HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->scheduleAsPackage(Ljava/lang/String;Landroid/app/job/JobInfo;Ljava/lang/String;ILjava/lang/String;)I
-HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->validateJob(Landroid/app/job/JobInfo;IIILjava/lang/String;Landroid/app/job/JobWorkItem;)I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;]Landroid/app/job/JobWorkItem;Landroid/app/job/JobWorkItem;
+HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->validateJob(Landroid/app/job/JobInfo;IIILjava/lang/String;Landroid/app/job/JobWorkItem;)I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/app/job/JobWorkItem;Landroid/app/job/JobWorkItem;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;
 HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->validateNamespace(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
 HSPLcom/android/server/job/JobSchedulerService$LocalService;->isAppConsideredBuggy(ILjava/lang/String;ILjava/lang/String;)Z+]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;
-HPLcom/android/server/job/JobSchedulerService$LocalService;->isNotificationAssociatedWithAnyUserInitiatedJobs(IILjava/lang/String;)Z
+HPLcom/android/server/job/JobSchedulerService$LocalService;->isNotificationAssociatedWithAnyUserInitiatedJobs(IILjava/lang/String;)Z+]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
 HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/job/JobSchedulerService;)V
-HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Ljava/time/Clock$SystemClock;,Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/restrictions/JobRestriction;Lcom/android/server/job/restrictions/ThermalStatusRestriction;
+HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
+HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;,Ljava/time/Clock$SystemClock;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/restrictions/JobRestriction;Lcom/android/server/job/restrictions/ThermalStatusRestriction;
 HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->accept(Ljava/lang/Object;)V+]Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;
-HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->postProcessLocked()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
-HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->reset()V
-HPLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
+HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->postProcessLocked()V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->reset()V+]Ljava/util/List;Ljava/util/ArrayList;
+HPLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->accept(Ljava/lang/Object;)V+]Lcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;Lcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;
 HPLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->postProcessLocked()V
 HSPLcom/android/server/job/JobSchedulerService;->$r8$lambda$Q16HuucOPC3Nu2dDmrkdR058M08(Lcom/android/server/job/JobSchedulerService;ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/utils/quota/Category;+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
@@ -4668,26 +3439,26 @@
 HSPLcom/android/server/job/JobSchedulerService;->adjustJobBias(ILcom/android/server/job/controllers/JobStatus;)I+]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;
 HSPLcom/android/server/job/JobSchedulerService;->areComponentsInPlaceLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
 HSPLcom/android/server/job/JobSchedulerService;->areUsersStartedLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
-HPLcom/android/server/job/JobSchedulerService;->cancelJob(ILjava/lang/String;III)Z
-HPLcom/android/server/job/JobSchedulerService;->cancelJobImplLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;IILjava/lang/String;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
-HPLcom/android/server/job/JobSchedulerService;->checkChangedJobListLocked()V+]Landroid/os/Handler;Lcom/android/server/job/JobSchedulerService$JobHandler;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;
+HPLcom/android/server/job/JobSchedulerService;->cancelJob(ILjava/lang/String;III)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
+HPLcom/android/server/job/JobSchedulerService;->cancelJobImplLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;IILjava/lang/String;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/job/JobSchedulerService;->checkChangedJobListLocked()V+]Landroid/os/Handler;Lcom/android/server/job/JobSchedulerService$JobHandler;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;
 HSPLcom/android/server/job/JobSchedulerService;->checkIfRestricted(Lcom/android/server/job/controllers/JobStatus;)Lcom/android/server/job/restrictions/JobRestriction;+]Lcom/android/server/job/restrictions/JobRestriction;Lcom/android/server/job/restrictions/ThermalStatusRestriction;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/JobSchedulerService;->deriveWorkSource(ILjava/lang/String;)Landroid/os/WorkSource;+]Lcom/android/server/SystemService;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/JobSchedulerService;->evaluateControllerStatesLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/job/JobSchedulerService;->evaluateJobBiasLocked(Lcom/android/server/job/controllers/JobStatus;)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/JobSchedulerService;->getJobStore()Lcom/android/server/job/JobStore;
-HPLcom/android/server/job/JobSchedulerService;->getMaxJobExecutionTimeMs(Lcom/android/server/job/controllers/JobStatus;)J+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;
-HPLcom/android/server/job/JobSchedulerService;->getMinJobExecutionGuaranteeMs(Lcom/android/server/job/controllers/JobStatus;)J+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
+HSPLcom/android/server/job/JobSchedulerService;->getMaxJobExecutionTimeMs(Lcom/android/server/job/controllers/JobStatus;)J+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;
+HSPLcom/android/server/job/JobSchedulerService;->getMinJobExecutionGuaranteeMs(Lcom/android/server/job/controllers/JobStatus;)J+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/JobSchedulerService;->getPackagesForUidLocked(I)Landroid/util/ArraySet;+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
 HSPLcom/android/server/job/JobSchedulerService;->getPendingJob(ILjava/lang/String;I)Landroid/app/job/JobInfo;+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
 HSPLcom/android/server/job/JobSchedulerService;->getPendingJobQueue()Lcom/android/server/job/PendingJobQueue;
 HPLcom/android/server/job/JobSchedulerService;->getPendingJobsInNamespace(ILjava/lang/String;)Ljava/util/List;+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/job/JobSchedulerService;->getRescheduleJobForFailureLocked(Lcom/android/server/job/controllers/JobStatus;II)Lcom/android/server/job/controllers/JobStatus;+]Ljava/time/Clock;Ljava/time/Clock$SystemClock;,Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList;
+HPLcom/android/server/job/JobSchedulerService;->getRescheduleJobForFailureLocked(Lcom/android/server/job/controllers/JobStatus;II)Lcom/android/server/job/controllers/JobStatus;+]Ljava/time/Clock;Ljava/time/Clock$SystemClock;,Lcom/android/server/job/JobSchedulerService$2;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HPLcom/android/server/job/JobSchedulerService;->getRescheduleJobForPeriodic(Lcom/android/server/job/controllers/JobStatus;)Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/JobSchedulerService;->getUidBias(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HPLcom/android/server/job/JobSchedulerService;->getUidCapabilities(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HPLcom/android/server/job/JobSchedulerService;->getUidProcState(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HPLcom/android/server/job/JobSchedulerService;->hasPermission(IILjava/lang/String;)Z+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/SystemService;Lcom/android/server/job/JobSchedulerService;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/job/JobSchedulerService;->getUidProcState(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HPLcom/android/server/job/JobSchedulerService;->hasPermission(IILjava/lang/String;)Z+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/SystemService;Lcom/android/server/job/JobSchedulerService;]Ljava/lang/Boolean;Ljava/lang/Boolean;
 HSPLcom/android/server/job/JobSchedulerService;->isBatteryCharging()Z+]Lcom/android/server/job/JobSchedulerService$BatteryStateTracker;Lcom/android/server/job/JobSchedulerService$BatteryStateTracker;
 HSPLcom/android/server/job/JobSchedulerService;->isBatteryNotLow()Z+]Lcom/android/server/job/JobSchedulerService$BatteryStateTracker;Lcom/android/server/job/JobSchedulerService$BatteryStateTracker;
 HSPLcom/android/server/job/JobSchedulerService;->isComponentUsable(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
@@ -4696,140 +3467,140 @@
 HSPLcom/android/server/job/JobSchedulerService;->isReadyToBeExecutedLocked(Lcom/android/server/job/controllers/JobStatus;Z)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
 HPLcom/android/server/job/JobSchedulerService;->isUidActive(I)Z
 HSPLcom/android/server/job/JobSchedulerService;->lambda$new$2(ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/utils/quota/Category;+]Ljava/lang/Object;Ljava/lang/String;
-HSPLcom/android/server/job/JobSchedulerService;->lambda$onBootPhase$4(Lcom/android/server/job/controllers/JobStatus;)V
-HPLcom/android/server/job/JobSchedulerService;->maybeProcessBuggyJob(Lcom/android/server/job/controllers/JobStatus;I)V
+HSPLcom/android/server/job/JobSchedulerService;->lambda$onBootPhase$4(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList;
+HPLcom/android/server/job/JobSchedulerService;->maybeProcessBuggyJob(Lcom/android/server/job/controllers/JobStatus;I)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/JobSchedulerService;->maybeRunPendingJobsLocked()V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
-HPLcom/android/server/job/JobSchedulerService;->noteJobsPending(Landroid/util/ArraySet;)V
+HSPLcom/android/server/job/JobSchedulerService;->noteJobsPending(Landroid/util/ArraySet;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/JobSchedulerService;->onControllerStateChanged(Landroid/util/ArraySet;)V+]Landroid/os/Handler;Lcom/android/server/job/JobSchedulerService$JobHandler;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
-HPLcom/android/server/job/JobSchedulerService;->onJobCompletedLocked(Lcom/android/server/job/controllers/JobStatus;IIZ)V
+HPLcom/android/server/job/JobSchedulerService;->onJobCompletedLocked(Lcom/android/server/job/controllers/JobStatus;IIZ)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/os/Handler;Lcom/android/server/job/JobSchedulerService$JobHandler;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
 HPLcom/android/server/job/JobSchedulerService;->queueReadyJobsForExecutionLocked()V
 HSPLcom/android/server/job/JobSchedulerService;->reportActiveLocked()V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
 HSPLcom/android/server/job/JobSchedulerService;->resetPendingJobReasonCache(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;
-HSPLcom/android/server/job/JobSchedulerService;->scheduleAsPackage(Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/modules/expresslog/Histogram;Lcom/android/modules/expresslog/Histogram;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/app/job/JobWorkItem;Landroid/app/job/JobWorkItem;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;
+HSPLcom/android/server/job/JobSchedulerService;->scheduleAsPackage(Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;]Lcom/android/modules/expresslog/Histogram;Lcom/android/modules/expresslog/Histogram;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/app/job/JobWorkItem;Landroid/app/job/JobWorkItem;
 HSPLcom/android/server/job/JobSchedulerService;->standbyBucketForPackage(Ljava/lang/String;IJ)I+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;
 HSPLcom/android/server/job/JobSchedulerService;->standbyBucketToBucketIndex(I)I
 HSPLcom/android/server/job/JobSchedulerService;->startTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
-HPLcom/android/server/job/JobSchedulerService;->stopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HPLcom/android/server/job/JobSchedulerService;->stopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
 HSPLcom/android/server/job/JobSchedulerService;->updateUidState(III)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;
-HPLcom/android/server/job/JobServiceContext$JobCallback;-><init>(Lcom/android/server/job/JobServiceContext;)V
-HPLcom/android/server/job/JobServiceContext$JobCallback;->acknowledgeStartMessage(IZ)V
-HPLcom/android/server/job/JobServiceContext$JobCallback;->dequeueWork(I)Landroid/app/job/JobWorkItem;
+HSPLcom/android/server/job/JobServiceContext$JobCallback;-><init>(Lcom/android/server/job/JobServiceContext;)V
+HPLcom/android/server/job/JobServiceContext$JobCallback;->acknowledgeStartMessage(IZ)V+]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
+HPLcom/android/server/job/JobServiceContext$JobCallback;->dequeueWork(I)Landroid/app/job/JobWorkItem;+]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
 HPLcom/android/server/job/JobServiceContext$JobCallback;->jobFinished(IZ)V
 HPLcom/android/server/job/JobServiceContext;->applyStoppedReasonLocked(Ljava/lang/String;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;
-HPLcom/android/server/job/JobServiceContext;->canGetNetworkInformation(Lcom/android/server/job/controllers/JobStatus;)Z
-HPLcom/android/server/job/JobServiceContext;->closeAndCleanupJobLocked(ZLjava/lang/String;)V
-HPLcom/android/server/job/JobServiceContext;->doAcknowledgeStartMessage(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V
+HSPLcom/android/server/job/JobServiceContext;->canGetNetworkInformation(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
+HPLcom/android/server/job/JobServiceContext;->closeAndCleanupJobLocked(ZLjava/lang/String;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/JobNotificationCoordinator;Lcom/android/server/job/JobNotificationCoordinator;]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/tare/EconomyManagerInternal;Lcom/android/server/tare/InternalResourceService$LocalService;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/job/JobCompletedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
+HPLcom/android/server/job/JobServiceContext;->doAcknowledgeStartMessage(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V+]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
 HPLcom/android/server/job/JobServiceContext;->doCallback(Lcom/android/server/job/JobServiceContext$JobCallback;ZLjava/lang/String;)V+]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
 HPLcom/android/server/job/JobServiceContext;->doCallbackLocked(ZLjava/lang/String;)V+]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
 HPLcom/android/server/job/JobServiceContext;->doCancelLocked(IILjava/lang/String;)V
-HPLcom/android/server/job/JobServiceContext;->doCompleteWork(Lcom/android/server/job/JobServiceContext$JobCallback;II)Z
-HPLcom/android/server/job/JobServiceContext;->doDequeueWork(Lcom/android/server/job/JobServiceContext$JobCallback;I)Landroid/app/job/JobWorkItem;
-HPLcom/android/server/job/JobServiceContext;->doJobFinished(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V
+HPLcom/android/server/job/JobServiceContext;->doCompleteWork(Lcom/android/server/job/JobServiceContext$JobCallback;II)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
+HPLcom/android/server/job/JobServiceContext;->doDequeueWork(Lcom/android/server/job/JobServiceContext$JobCallback;I)Landroid/app/job/JobWorkItem;+]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
+HPLcom/android/server/job/JobServiceContext;->doJobFinished(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V+]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters;
 HPLcom/android/server/job/JobServiceContext;->doServiceBoundLocked()V
-HPLcom/android/server/job/JobServiceContext;->executeRunnableJob(Lcom/android/server/job/controllers/JobStatus;I)Z
+HSPLcom/android/server/job/JobServiceContext;->executeRunnableJob(Lcom/android/server/job/controllers/JobStatus;I)Z+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/tare/EconomyManagerInternal;Lcom/android/server/tare/InternalResourceService$LocalService;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/modules/expresslog/Histogram;Lcom/android/modules/expresslog/Histogram;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/os/PowerManager;Landroid/os/PowerManager;]Landroid/content/Intent;Landroid/content/Intent;
 HPLcom/android/server/job/JobServiceContext;->getExecutionStartTimeElapsed()J
 HPLcom/android/server/job/JobServiceContext;->getId()I+]Ljava/lang/Object;Lcom/android/server/job/JobServiceContext;
 HPLcom/android/server/job/JobServiceContext;->getPreferredUid()I
 HPLcom/android/server/job/JobServiceContext;->getRemainingGuaranteedTimeMs(J)J
-HPLcom/android/server/job/JobServiceContext;->getRunningJobLocked()Lcom/android/server/job/controllers/JobStatus;
+HSPLcom/android/server/job/JobServiceContext;->getRunningJobLocked()Lcom/android/server/job/controllers/JobStatus;
 HPLcom/android/server/job/JobServiceContext;->getRunningJobWorkType()I
-HPLcom/android/server/job/JobServiceContext;->getStartActionId(Lcom/android/server/job/controllers/JobStatus;)I
+HSPLcom/android/server/job/JobServiceContext;->getStartActionId(Lcom/android/server/job/controllers/JobStatus;)I+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HPLcom/android/server/job/JobServiceContext;->handleCancelLocked(Ljava/lang/String;)V
-HPLcom/android/server/job/JobServiceContext;->handleFinishedLocked(ZLjava/lang/String;)V
-HPLcom/android/server/job/JobServiceContext;->handleServiceBoundLocked()V
-HPLcom/android/server/job/JobServiceContext;->handleStartedLocked(Z)V
+HPLcom/android/server/job/JobServiceContext;->handleFinishedLocked(ZLjava/lang/String;)V+]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
+HPLcom/android/server/job/JobServiceContext;->handleServiceBoundLocked()V+]Landroid/app/job/IJobService;Landroid/app/job/JobServiceEngine$JobInterface;,Landroid/app/job/IJobService$Stub$Proxy;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
+HPLcom/android/server/job/JobServiceContext;->handleStartedLocked(Z)V+]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
 HPLcom/android/server/job/JobServiceContext;->hasPermissionForDelivery(ILjava/lang/String;Ljava/lang/String;)Z
 HPLcom/android/server/job/JobServiceContext;->isWithinExecutionGuaranteeTime()Z+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;
-HPLcom/android/server/job/JobServiceContext;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
-HPLcom/android/server/job/JobServiceContext;->removeOpTimeOutLocked()V+]Landroid/os/Handler;Lcom/android/server/job/JobServiceContext$JobServiceHandler;
-HPLcom/android/server/job/JobServiceContext;->scheduleOpTimeOutLocked()V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/os/Handler;Lcom/android/server/job/JobServiceContext$JobServiceHandler;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
+HPLcom/android/server/job/JobServiceContext;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
+HSPLcom/android/server/job/JobServiceContext;->removeOpTimeOutLocked()V+]Landroid/os/Handler;Lcom/android/server/job/JobServiceContext$JobServiceHandler;
+HSPLcom/android/server/job/JobServiceContext;->scheduleOpTimeOutLocked()V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/os/Handler;Lcom/android/server/job/JobServiceContext$JobServiceHandler;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;
 HPLcom/android/server/job/JobServiceContext;->sendStopMessageLocked(Ljava/lang/String;)V
 HPLcom/android/server/job/JobServiceContext;->verifyCallerLocked(Lcom/android/server/job/JobServiceContext$JobCallback;)Z
 HPLcom/android/server/job/JobStore$2$CopyConsumer;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/List;Ljava/util/ArrayList;
 HPLcom/android/server/job/JobStore$2$CopyConsumer;->accept(Ljava/lang/Object;)V+]Lcom/android/server/job/JobStore$2$CopyConsumer;Lcom/android/server/job/JobStore$2$CopyConsumer;
-HPLcom/android/server/job/JobStore$2$CopyConsumer;->prepare()V
+HPLcom/android/server/job/JobStore$2$CopyConsumer;->prepare()V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/job/JobStore$2;->addAttributesToJobTag(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HPLcom/android/server/job/JobStore$2;->deepCopyBundle(Landroid/os/PersistableBundle;I)Landroid/os/PersistableBundle;+]Landroid/os/PersistableBundle;Landroid/os/PersistableBundle;]Lcom/android/server/job/JobStore$2;Lcom/android/server/job/JobStore$2;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;
-HPLcom/android/server/job/JobStore$2;->run()V
-HPLcom/android/server/job/JobStore$2;->writeBundleToXml(Landroid/os/PersistableBundle;Lorg/xmlpull/v1/XmlSerializer;)V
+HPLcom/android/server/job/JobStore$2;->run()V+]Ljava/time/Clock;Ljava/time/Clock$SystemClock;,Lcom/android/server/job/JobSchedulerService$2;]Ljava/io/File;Ljava/io/File;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HPLcom/android/server/job/JobStore$2;->writeBundleToXml(Landroid/os/PersistableBundle;Lorg/xmlpull/v1/XmlSerializer;)V+]Lorg/xmlpull/v1/XmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;
 HPLcom/android/server/job/JobStore$2;->writeConstraintsToXml(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;
 HPLcom/android/server/job/JobStore$2;->writeDebugInfoToXml(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/JobStore$2;->writeExecutionCriteriaToXml(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Ljava/time/Clock$SystemClock;,Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lorg/xmlpull/v1/XmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;
 HPLcom/android/server/job/JobStore$2;->writeJobWorkItemListToXml(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/util/List;)V
 HPLcom/android/server/job/JobStore$2;->writeJobWorkItemsToXml(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V
 HPLcom/android/server/job/JobStore$2;->writeJobsMapImpl(Landroid/util/AtomicFile;Ljava/util/List;)V+]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/JobStore$2;Lcom/android/server/job/JobStore$2;]Landroid/util/SystemConfigFileCommitEventLogger;Landroid/util/SystemConfigFileCommitEventLogger;]Ljava/io/FileOutputStream;Ljava/io/FileOutputStream;
-HSPLcom/android/server/job/JobStore$JobSet;->add(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/job/JobStore$JobSet;->add(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/job/JobStore$JobSet;->contains(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/job/JobStore$JobSet;->countJobsForUid(I)I+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/job/JobStore$JobSet;->forEachJob(Ljava/util/function/Predicate;Ljava/util/function/Consumer;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/function/Consumer;megamorphic_types]Ljava/util/function/Predicate;megamorphic_types
 HSPLcom/android/server/job/JobStore$JobSet;->forEachJobForSourceUid(ILjava/util/function/Consumer;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/function/Consumer;Lcom/android/server/job/JobSchedulerService$DeferredJobCounter;,Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;,Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;,Lcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;
 HSPLcom/android/server/job/JobStore$JobSet;->get(ILjava/lang/String;I)Lcom/android/server/job/controllers/JobStatus;+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/job/JobStore$JobSet;->getJobsBySourceUid(I)Landroid/util/ArraySet;
 HSPLcom/android/server/job/JobStore$JobSet;->getJobsBySourceUid(ILjava/util/Set;)V
 HSPLcom/android/server/job/JobStore$JobSet;->getJobsByUid(I)Landroid/util/ArraySet;
 HSPLcom/android/server/job/JobStore$JobSet;->getJobsByUid(ILjava/util/Set;)V
-HPLcom/android/server/job/JobStore$JobSet;->remove(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HPLcom/android/server/job/JobStore$JobSet;->remove(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->buildConstraintsFromXml(Landroid/app/job/JobInfo$Builder;Lcom/android/modules/utils/TypedXmlPullParser;)V
 HSPLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->restoreJobFromXml(ZLcom/android/modules/utils/TypedXmlPullParser;IJ)Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/JobStore;->-$$Nest$fgetmUseSplitFiles(Lcom/android/server/job/JobStore;)Z
 HSPLcom/android/server/job/JobStore;->-$$Nest$sfgetDEBUG()Z
-HSPLcom/android/server/job/JobStore;->add(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
+HSPLcom/android/server/job/JobStore;->add(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
 HSPLcom/android/server/job/JobStore;->containsJob(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet;
 HSPLcom/android/server/job/JobStore;->convertRtcBoundsToElapsed(Landroid/util/Pair;J)Landroid/util/Pair;
 HSPLcom/android/server/job/JobStore;->countJobsForUid(I)I+]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet;
 HSPLcom/android/server/job/JobStore;->forEachJobForSourceUid(ILjava/util/function/Consumer;)V+]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet;
 HSPLcom/android/server/job/JobStore;->getJobByUidAndJobId(ILjava/lang/String;I)Lcom/android/server/job/controllers/JobStatus;+]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet;
-HSPLcom/android/server/job/JobStore;->getJobsBySourceUid(I)Landroid/util/ArraySet;
 HSPLcom/android/server/job/JobStore;->getJobsByUid(I)Landroid/util/ArraySet;
 HPLcom/android/server/job/JobStore;->intArrayToString([I)Ljava/lang/String;+]Ljava/lang/Object;Ljava/util/StringJoiner;]Ljava/util/StringJoiner;Ljava/util/StringJoiner;
 HSPLcom/android/server/job/JobStore;->isSyncJob(Lcom/android/server/job/controllers/JobStatus;)Z
 HSPLcom/android/server/job/JobStore;->maybeUpdateHighWaterMark()V
 HPLcom/android/server/job/JobStore;->maybeWriteStatusToDiskAsync()V+]Landroid/os/Handler;Landroid/os/Handler;
-HPLcom/android/server/job/JobStore;->remove(Lcom/android/server/job/controllers/JobStatus;Z)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
+HPLcom/android/server/job/JobStore;->remove(Lcom/android/server/job/controllers/JobStatus;Z)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
 HPLcom/android/server/job/PendingJobQueue$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;->clear()V
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->add(Lcom/android/server/job/controllers/JobStatus;)V
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->addAll(Ljava/util/List;)V+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Ljava/util/List;Ljava/util/ArrayList;
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->clear()V
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->indexOf(Lcom/android/server/job/controllers/JobStatus;)I+]Ljava/util/List;Ljava/util/ArrayList;
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->lambda$static$0(Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;)I+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->next()Lcom/android/server/job/controllers/JobStatus;+]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/job/PendingJobQueue$AppJobQueue$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HSPLcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;->clear()V
+HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->add(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->addAll(Ljava/util/List;)V+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->clear()V
+HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->indexOf(Lcom/android/server/job/controllers/JobStatus;)I+]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->lambda$static$0(Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;)I+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;
+HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->next()Lcom/android/server/job/controllers/JobStatus;+]Ljava/util/List;Ljava/util/ArrayList;
 HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->peekNextOverrideState()I+]Ljava/util/List;Ljava/util/ArrayList;
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->peekNextTimestamp()J+]Ljava/util/List;Ljava/util/ArrayList;
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->remove(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;]Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->resetIterator(J)V
-HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->size()I
+HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->peekNextTimestamp()J+]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->remove(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;]Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;
+HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->resetIterator(J)V
+HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->size()I
 HPLcom/android/server/job/PendingJobQueue;->$r8$lambda$M4BYHsJI5-OqL8hZ_zUrbsjiO-g(Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;)I
-HPLcom/android/server/job/PendingJobQueue;->add(Lcom/android/server/job/controllers/JobStatus;)V
-HPLcom/android/server/job/PendingJobQueue;->addAll(Landroid/util/ArraySet;)V+]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;
-HPLcom/android/server/job/PendingJobQueue;->contains(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/PendingJobQueue;->add(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;
+HSPLcom/android/server/job/PendingJobQueue;->addAll(Landroid/util/ArraySet;)V+]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;
+HSPLcom/android/server/job/PendingJobQueue;->clear()V+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;
+HSPLcom/android/server/job/PendingJobQueue;->contains(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/job/PendingJobQueue;->getAppJobQueue(IZ)Lcom/android/server/job/PendingJobQueue$AppJobQueue;+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/job/PendingJobQueue;->lambda$new$0(Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;)I+]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;
 HSPLcom/android/server/job/PendingJobQueue;->next()Lcom/android/server/job/controllers/JobStatus;+]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;
 HSPLcom/android/server/job/PendingJobQueue;->remove(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;
+HSPLcom/android/server/job/PendingJobQueue;->resetIterator()V
 HSPLcom/android/server/job/PendingJobQueue;->size()I
 HSPLcom/android/server/job/controllers/BackgroundJobsController$2;->updateAllJobs()V
 HSPLcom/android/server/job/controllers/BackgroundJobsController$2;->updateJobsForUid(IZ)V
 HSPLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/BackgroundJobsController;Lcom/android/server/job/controllers/BackgroundJobsController;
 HSPLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;->accept(Ljava/lang/Object;)V+]Lcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;Lcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;
-HSPLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;->prepare(I)V
+HSPLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;->prepare(I)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;
 HSPLcom/android/server/job/controllers/BackgroundJobsController;->evaluateStateLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/BackgroundJobsController;Lcom/android/server/job/controllers/BackgroundJobsController;
 HSPLcom/android/server/job/controllers/BackgroundJobsController;->isPackageStoppedLocked(Ljava/lang/String;I)Z+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/job/controllers/BackgroundJobsController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/BackgroundJobsController;Lcom/android/server/job/controllers/BackgroundJobsController;
-HSPLcom/android/server/job/controllers/BackgroundJobsController;->updateJobRestrictionsLocked(II)V
+HSPLcom/android/server/job/controllers/BackgroundJobsController;->updateJobRestrictionsLocked(II)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/controllers/BackgroundJobsController;->updateSingleJobRestrictionLocked(Lcom/android/server/job/controllers/JobStatus;JI)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/job/controllers/BackgroundJobsController;Lcom/android/server/job/controllers/BackgroundJobsController;
 HSPLcom/android/server/job/controllers/BatteryController;->hasTopExemptionLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
-HPLcom/android/server/job/controllers/BatteryController;->maybeReportNewChargingStateLocked()V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/BatteryController;Lcom/android/server/job/controllers/BatteryController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/BatteryController;
-HSPLcom/android/server/job/controllers/BatteryController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/BatteryController;Lcom/android/server/job/controllers/BatteryController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
+HPLcom/android/server/job/controllers/BatteryController;->maybeReportNewChargingStateLocked()V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/BatteryController;Lcom/android/server/job/controllers/BatteryController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/BatteryController;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
+HSPLcom/android/server/job/controllers/BatteryController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/BatteryController;Lcom/android/server/job/controllers/BatteryController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/BatteryController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HPLcom/android/server/job/controllers/BatteryController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V
+HSPLcom/android/server/job/controllers/BatteryController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/ComponentController;->clearComponentsForPackageLocked(ILjava/lang/String;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HSPLcom/android/server/job/controllers/ComponentController;->getServiceProcessLocked(Lcom/android/server/job/controllers/JobStatus;)Ljava/lang/String;+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/content/ComponentName;Landroid/content/ComponentName;
+HSPLcom/android/server/job/controllers/ComponentController;->getServiceProcessLocked(Lcom/android/server/job/controllers/JobStatus;)Ljava/lang/String;+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HSPLcom/android/server/job/controllers/ComponentController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/ComponentController;Lcom/android/server/job/controllers/ComponentController;
 HSPLcom/android/server/job/controllers/ComponentController;->updateComponentEnabledStateLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/ComponentController;Lcom/android/server/job/controllers/ComponentController;
-HPLcom/android/server/job/controllers/ConnectivityController$2;->onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V
-HPLcom/android/server/job/controllers/ConnectivityController$CcHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/job/controllers/ConnectivityController$2;->onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;
+HSPLcom/android/server/job/controllers/ConnectivityController$CcHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/job/controllers/ConnectivityController$UidDefaultNetworkCallback;->-$$Nest$fgetmBlockedReasons(Lcom/android/server/job/controllers/ConnectivityController$UidDefaultNetworkCallback;)I
 HSPLcom/android/server/job/controllers/ConnectivityController$UidDefaultNetworkCallback;->-$$Nest$fgetmDefaultNetwork(Lcom/android/server/job/controllers/ConnectivityController$UidDefaultNetworkCallback;)Landroid/net/Network;
 HPLcom/android/server/job/controllers/ConnectivityController$UidDefaultNetworkCallback;->onBlockedStatusChanged(Landroid/net/Network;I)V
@@ -4838,67 +3609,65 @@
 HSPLcom/android/server/job/controllers/ConnectivityController;->getNetworkMetadata(Landroid/net/Network;)Lcom/android/server/job/controllers/ConnectivityController$CachedNetworkMetadata;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/job/controllers/ConnectivityController;->getUidStats(ILjava/lang/String;Z)Lcom/android/server/job/controllers/ConnectivityController$UidStats;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/job/controllers/ConnectivityController;->isCongestionDelayed(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z
-HPLcom/android/server/job/controllers/ConnectivityController;->isInsane(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
-HPLcom/android/server/job/controllers/ConnectivityController;->isMeteredAllowed(Lcom/android/server/job/controllers/JobStatus;Landroid/net/NetworkCapabilities;)Z+]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/net/NetworkPolicyManager;Landroid/net/NetworkPolicyManager;
+HPLcom/android/server/job/controllers/ConnectivityController;->isInsane(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HPLcom/android/server/job/controllers/ConnectivityController;->isMeteredAllowed(Lcom/android/server/job/controllers/JobStatus;Landroid/net/NetworkCapabilities;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Landroid/net/NetworkPolicyManager;Landroid/net/NetworkPolicyManager;
 HPLcom/android/server/job/controllers/ConnectivityController;->isNetworkAvailable(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;
-HPLcom/android/server/job/controllers/ConnectivityController;->isRelaxedSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;
 HSPLcom/android/server/job/controllers/ConnectivityController;->isSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;
 HSPLcom/android/server/job/controllers/ConnectivityController;->isStandbyExceptionRequestedLocked(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/ConnectivityController;->isStrictSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/net/NetworkCapabilities$Builder;Landroid/net/NetworkCapabilities$Builder;]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;
-HPLcom/android/server/job/controllers/ConnectivityController;->isStrongEnough(Lcom/android/server/job/controllers/JobStatus;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/ArraySet;
+HPLcom/android/server/job/controllers/ConnectivityController;->isStrongEnough(Lcom/android/server/job/controllers/JobStatus;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/ArraySet;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;
 HPLcom/android/server/job/controllers/ConnectivityController;->isUsable(Landroid/net/NetworkCapabilities;)Z
-HPLcom/android/server/job/controllers/ConnectivityController;->maybeAdjustRegisteredCallbacksLocked()V+]Landroid/os/Handler;Lcom/android/server/job/controllers/ConnectivityController$CcHandler;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/ConnectivityController;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;
+HSPLcom/android/server/job/controllers/ConnectivityController;->maybeAdjustRegisteredCallbacksLocked()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;]Landroid/os/Handler;Lcom/android/server/job/controllers/ConnectivityController$CcHandler;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/job/controllers/ConnectivityController;->maybeRevokeStandbyExceptionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/job/controllers/ConnectivityController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/ConnectivityController;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;
+HSPLcom/android/server/job/controllers/ConnectivityController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/ConnectivityController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;
 HPLcom/android/server/job/controllers/ConnectivityController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;
-HSPLcom/android/server/job/controllers/ConnectivityController;->onUidBiasChangedLocked(III)V
-HPLcom/android/server/job/controllers/ConnectivityController;->postAdjustCallbacks()V
-HPLcom/android/server/job/controllers/ConnectivityController;->postAdjustCallbacks(J)V
-HPLcom/android/server/job/controllers/ConnectivityController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V
+HSPLcom/android/server/job/controllers/ConnectivityController;->onUidBiasChangedLocked(III)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/job/controllers/ConnectivityController;->postAdjustCallbacks()V
+HSPLcom/android/server/job/controllers/ConnectivityController;->postAdjustCallbacks(J)V
+HSPLcom/android/server/job/controllers/ConnectivityController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/ConnectivityController;->requestStandbyExceptionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/net/NetworkPolicyManagerInternal;Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;
-HSPLcom/android/server/job/controllers/ConnectivityController;->updateConstraintsSatisfied(Lcom/android/server/job/controllers/JobStatus;)Z+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;
+HSPLcom/android/server/job/controllers/ConnectivityController;->updateConstraintsSatisfied(Lcom/android/server/job/controllers/JobStatus;)Z+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;
 HSPLcom/android/server/job/controllers/ConnectivityController;->updateConstraintsSatisfied(Lcom/android/server/job/controllers/JobStatus;JLandroid/net/Network;Lcom/android/server/job/controllers/ConnectivityController$CachedNetworkMetadata;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
 HPLcom/android/server/job/controllers/ConnectivityController;->updateTrackedJobsLocked(ILandroid/net/Network;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
 HPLcom/android/server/job/controllers/ConnectivityController;->updateTrackedJobsLocked(Landroid/util/ArraySet;Landroid/net/Network;)Z+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/Object;Landroid/net/Network;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/ContentObserverController$JobInstance;-><init>(Lcom/android/server/job/controllers/ContentObserverController;Lcom/android/server/job/controllers/JobStatus;)V
 HPLcom/android/server/job/controllers/ContentObserverController$JobInstance;->detachLocked()V
 HPLcom/android/server/job/controllers/ContentObserverController$JobInstance;->scheduleLocked()V
-HSPLcom/android/server/job/controllers/ContentObserverController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/ContentObserverController$JobInstance;Lcom/android/server/job/controllers/ContentObserverController$JobInstance;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
+HPLcom/android/server/job/controllers/ContentObserverController$ObserverInstance;->onChange(ZLandroid/net/Uri;)V+]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;
+HSPLcom/android/server/job/controllers/ContentObserverController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/ContentObserverController$JobInstance;Lcom/android/server/job/controllers/ContentObserverController$JobInstance;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/ContentObserverController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/ContentObserverController$JobInstance;Lcom/android/server/job/controllers/ContentObserverController$JobInstance;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HPLcom/android/server/job/controllers/ContentObserverController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V
-HPLcom/android/server/job/controllers/DeviceIdleJobsController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/DeviceIdleJobsController;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Landroid/os/PowerManager;Landroid/os/PowerManager;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/job/controllers/ContentObserverController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
+HSPLcom/android/server/job/controllers/DeviceIdleJobsController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/DeviceIdleJobsController;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Landroid/os/PowerManager;Landroid/os/PowerManager;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;->accept(Ljava/lang/Object;)V+]Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;
 HSPLcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;->prepare()V
-HPLcom/android/server/job/controllers/DeviceIdleJobsController;->-$$Nest$fgetmAllowInIdleJobs(Lcom/android/server/job/controllers/DeviceIdleJobsController;)Landroid/util/ArraySet;
+HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->-$$Nest$fgetmAllowInIdleJobs(Lcom/android/server/job/controllers/DeviceIdleJobsController;)Landroid/util/ArraySet;
 HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->-$$Nest$mupdateTaskStateLocked(Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/JobStatus;J)Z+]Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/DeviceIdleJobsController;
+HPLcom/android/server/job/controllers/DeviceIdleJobsController;->isTempWhitelistedLocked(Lcom/android/server/job/controllers/JobStatus;)Z
 HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->isWhitelistedLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/DeviceIdleJobsController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/DeviceIdleJobsController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->setUidActiveLocked(IZ)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
+HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->setUidActiveLocked(IZ)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
 HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->updateTaskStateLocked(Lcom/android/server/job/controllers/JobStatus;J)Z+]Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/DeviceIdleJobsController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
-HSPLcom/android/server/job/controllers/FlexibilityController$FcHandler;->handleMessage(Landroid/os/Message;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/os/Handler;Lcom/android/server/job/controllers/FlexibilityController$FcHandler;]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
-HPLcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;->processExpiredAlarms(Landroid/util/ArraySet;)V
-HSPLcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;->scheduleDropNumConstraintsAlarm(Lcom/android/server/job/controllers/JobStatus;J)V+]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Landroid/os/Handler;Lcom/android/server/job/controllers/FlexibilityController$FcHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;
-HSPLcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;->add(Lcom/android/server/job/controllers/JobStatus;)V
-HSPLcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;->remove(Lcom/android/server/job/controllers/JobStatus;)V
-HPLcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;->addScore(IJ)V+]Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;
+HSPLcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;->scheduleDropNumConstraintsAlarm(Lcom/android/server/job/controllers/JobStatus;J)V+]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;]Landroid/os/Handler;Lcom/android/server/job/controllers/FlexibilityController$FcHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;->add(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;->remove(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;->addScore(IJ)V+]Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;
 HPLcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;->getScore(J)I
 HSPLcom/android/server/job/controllers/FlexibilityController;->-$$Nest$fgetmDeadlineProximityLimitMs(Lcom/android/server/job/controllers/FlexibilityController;)J
 HSPLcom/android/server/job/controllers/FlexibilityController;->-$$Nest$sfgetDEBUG()Z
-HSPLcom/android/server/job/controllers/FlexibilityController;->getLifeCycleBeginningElapsedLocked(Lcom/android/server/job/controllers/JobStatus;)J+]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/lang/Long;Ljava/lang/Long;
-HSPLcom/android/server/job/controllers/FlexibilityController;->getLifeCycleEndElapsedLocked(Lcom/android/server/job/controllers/JobStatus;JJ)J+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;
+HSPLcom/android/server/job/controllers/FlexibilityController;->getLifeCycleBeginningElapsedLocked(Lcom/android/server/job/controllers/JobStatus;)J+]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/Long;Ljava/lang/Long;
+HSPLcom/android/server/job/controllers/FlexibilityController;->getLifeCycleEndElapsedLocked(Lcom/android/server/job/controllers/JobStatus;JJ)J+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;
 HSPLcom/android/server/job/controllers/FlexibilityController;->getNextConstraintDropTimeElapsedLocked(Lcom/android/server/job/controllers/JobStatus;JJ)J+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;
 HSPLcom/android/server/job/controllers/FlexibilityController;->getPercentsToDropConstraints(I)[I+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/job/controllers/FlexibilityController;->getRelevantAppliedConstraintsLocked(Lcom/android/server/job/controllers/JobStatus;)I
-HSPLcom/android/server/job/controllers/FlexibilityController;->getScoreLocked(ILjava/lang/String;J)I
-HSPLcom/android/server/job/controllers/FlexibilityController;->hasEnoughSatisfiedConstraintsLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;
+HSPLcom/android/server/job/controllers/FlexibilityController;->getScoreLocked(ILjava/lang/String;J)I+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;
 HSPLcom/android/server/job/controllers/FlexibilityController;->isFlexibilitySatisfiedLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/FlexibilityController$SpecialAppTracker;Lcom/android/server/job/controllers/FlexibilityController$SpecialAppTracker;
-HSPLcom/android/server/job/controllers/FlexibilityController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;
+HSPLcom/android/server/job/controllers/FlexibilityController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;
 HPLcom/android/server/job/controllers/FlexibilityController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;
 HSPLcom/android/server/job/controllers/FlexibilityController;->onUidBiasChangedLocked(III)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/lang/Long;Ljava/lang/Long;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
-HPLcom/android/server/job/controllers/FlexibilityController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V
-HSPLcom/android/server/job/controllers/IdleController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/idle/IdlenessTracker;Lcom/android/server/job/controllers/idle/DeviceIdlenessTracker;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/job/controllers/FlexibilityController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
+HSPLcom/android/server/job/controllers/IdleController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/idle/IdlenessTracker;Lcom/android/server/job/controllers/idle/DeviceIdlenessTracker;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/IdleController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/job/controllers/JobStatus;-><init>(Landroid/app/job/JobInfo;ILjava/lang/String;IILjava/lang/String;Ljava/lang/String;IIJJJJJII)V+]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/app/job/JobInfo$TriggerContentUri;Landroid/app/job/JobInfo$TriggerContentUri;]Ljava/lang/Object;Ljava/lang/String;]Landroid/net/NetworkRequest$Builder;Landroid/net/NetworkRequest$Builder;]Landroid/app/job/JobInfo$Builder;Landroid/app/job/JobInfo$Builder;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HPLcom/android/server/job/controllers/JobStatus;-><init>(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
@@ -4907,15 +3676,15 @@
 HSPLcom/android/server/job/controllers/JobStatus;->canApplyTransportAffinities()Z
 HSPLcom/android/server/job/controllers/JobStatus;->canRunInBatterySaver()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/controllers/JobStatus;->canRunInDoze()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
-HPLcom/android/server/job/controllers/JobStatus;->clearPersistedUtcTimes()V
+HSPLcom/android/server/job/controllers/JobStatus;->clearPersistedUtcTimes()V
 HSPLcom/android/server/job/controllers/JobStatus;->clearTrackingController(I)Z
-HPLcom/android/server/job/controllers/JobStatus;->completeWorkLocked(I)Z
+HPLcom/android/server/job/controllers/JobStatus;->completeWorkLocked(I)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobWorkItem;Landroid/app/job/JobWorkItem;
 HSPLcom/android/server/job/controllers/JobStatus;->createFromJobInfo(Landroid/app/job/JobInfo;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/job/controllers/JobStatus;+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HPLcom/android/server/job/controllers/JobStatus;->dequeueWorkLocked()Landroid/app/job/JobWorkItem;
-HPLcom/android/server/job/controllers/JobStatus;->enqueueWorkLocked(Landroid/app/job/JobWorkItem;)V
+HPLcom/android/server/job/controllers/JobStatus;->dequeueWorkLocked()Landroid/app/job/JobWorkItem;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/job/JobWorkItem;Landroid/app/job/JobWorkItem;
+HPLcom/android/server/job/controllers/JobStatus;->enqueueWorkLocked(Landroid/app/job/JobWorkItem;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobWorkItem;Landroid/app/job/JobWorkItem;
 HSPLcom/android/server/job/controllers/JobStatus;->generateLoggingId(Ljava/lang/String;I)J+]Ljava/lang/Object;Ljava/lang/String;
-HSPLcom/android/server/job/controllers/JobStatus;->generateNamespaceHash(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/security/MessageDigest;Ljava/security/MessageDigest$Delegate;
-HPLcom/android/server/job/controllers/JobStatus;->getAppTraceTag()Ljava/lang/String;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;
+HSPLcom/android/server/job/controllers/JobStatus;->generateNamespaceHash(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/security/MessageDigest;Ljava/security/MessageDigest$Delegate;
+HSPLcom/android/server/job/controllers/JobStatus;->getAppTraceTag()Ljava/lang/String;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;
 HSPLcom/android/server/job/controllers/JobStatus;->getBatteryName()Ljava/lang/String;
 HSPLcom/android/server/job/controllers/JobStatus;->getBias()I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;
 HPLcom/android/server/job/controllers/JobStatus;->getCumulativeExecutionTimeMs()J
@@ -4942,8 +3711,6 @@
 HPLcom/android/server/job/controllers/JobStatus;->getNumFailures()I
 HSPLcom/android/server/job/controllers/JobStatus;->getNumPreviousAttempts()I
 HSPLcom/android/server/job/controllers/JobStatus;->getNumRequiredFlexibleConstraints()I
-HPLcom/android/server/job/controllers/JobStatus;->getNumSystemStops()I
-HPLcom/android/server/job/controllers/JobStatus;->getPersistedUtcTimes()Landroid/util/Pair;
 HSPLcom/android/server/job/controllers/JobStatus;->getServiceComponent()Landroid/content/ComponentName;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;
 HSPLcom/android/server/job/controllers/JobStatus;->getSourcePackageName()Ljava/lang/String;
 HSPLcom/android/server/job/controllers/JobStatus;->getSourceTag()Ljava/lang/String;
@@ -4954,8 +3721,8 @@
 HSPLcom/android/server/job/controllers/JobStatus;->getTimeoutBlameUserId()I+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/controllers/JobStatus;->getUid()I
 HSPLcom/android/server/job/controllers/JobStatus;->getUserId()I
-HPLcom/android/server/job/controllers/JobStatus;->getWakelockTag()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HPLcom/android/server/job/controllers/JobStatus;->getWhenStandbyDeferred()J
+HSPLcom/android/server/job/controllers/JobStatus;->getWakelockTag()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/job/controllers/JobStatus;->getWhenStandbyDeferred()J
 HSPLcom/android/server/job/controllers/JobStatus;->getWorkCount()I+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/job/controllers/JobStatus;->hasBatteryNotLowConstraint()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/controllers/JobStatus;->hasChargingConstraint()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
@@ -4976,8 +3743,8 @@
 HSPLcom/android/server/job/controllers/JobStatus;->isReady()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/controllers/JobStatus;->isReady(I)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/controllers/JobStatus;->isRequestedExpeditedJob()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
-HPLcom/android/server/job/controllers/JobStatus;->isUserVisibleJob()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
-HSPLcom/android/server/job/controllers/JobStatus;->maybeAddForegroundExemption(Ljava/util/function/Predicate;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/util/function/Predicate;Lcom/android/server/job/JobSchedulerService$$ExternalSyntheticLambda1;
+HSPLcom/android/server/job/controllers/JobStatus;->isUserVisibleJob()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
+HSPLcom/android/server/job/controllers/JobStatus;->maybeAddForegroundExemption(Ljava/util/function/Predicate;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/util/function/Predicate;Lcom/android/server/job/JobSchedulerService$$ExternalSyntheticLambda1;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HPLcom/android/server/job/controllers/JobStatus;->maybeLogBucketMismatch()V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/controllers/JobStatus;->prepareLocked()V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;
 HSPLcom/android/server/job/controllers/JobStatus;->readinessStatusWithConstraint(IZ)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
@@ -4999,44 +3766,44 @@
 HSPLcom/android/server/job/controllers/JobStatus;->shouldBlameSourceForTimeout()Z
 HSPLcom/android/server/job/controllers/JobStatus;->shouldTreatAsExpeditedJob()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/controllers/JobStatus;->shouldTreatAsUserInitiatedJob()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;
-HPLcom/android/server/job/controllers/JobStatus;->stopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/job/controllers/JobStatus;->stopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HPLcom/android/server/job/controllers/JobStatus;->toShortString()Ljava/lang/String;
 HPLcom/android/server/job/controllers/JobStatus;->unprepareLocked()V+]Ljava/lang/Throwable;Ljava/lang/Throwable;
 HSPLcom/android/server/job/controllers/JobStatus;->updateMediaBackupExemptionStatus()Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;
 HSPLcom/android/server/job/controllers/JobStatus;->updateNetworkBytesLocked()V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/job/JobWorkItem;Landroid/app/job/JobWorkItem;
 HSPLcom/android/server/job/controllers/JobStatus;->wouldBeReadyWithConstraint(I)Z
-HSPLcom/android/server/job/controllers/PrefetchController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Ljava/time/Clock$SystemClock;,Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/job/controllers/PrefetchController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Ljava/time/Clock$SystemClock;,Lcom/android/server/job/JobSchedulerService$2;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/PrefetchController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/PrefetchController$ThresholdAlarmListener;
-HPLcom/android/server/job/controllers/PrefetchController;->maybeUpdateConstraintForUid(I)V
-HSPLcom/android/server/job/controllers/QuotaController$QcHandler;->handleMessage(Landroid/os/Message;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Landroid/os/Handler;Lcom/android/server/job/controllers/QuotaController$QcHandler;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/QuotaController$TopAppTimer;Lcom/android/server/job/controllers/QuotaController$TopAppTimer;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
+HPLcom/android/server/job/controllers/PrefetchController;->maybeUpdateConstraintForUid(I)V+]Ljava/time/Clock;Ljava/time/Clock$SystemClock;,Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
+HSPLcom/android/server/job/controllers/QuotaController$QcHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/os/Handler;Lcom/android/server/job/controllers/QuotaController$QcHandler;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/QuotaController$TopAppTimer;Lcom/android/server/job/controllers/QuotaController$TopAppTimer;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/controllers/QuotaController$QcUidObserver;->onUidStateChanged(IIJI)V+]Landroid/os/Handler;Lcom/android/server/job/controllers/QuotaController$QcHandler;]Landroid/os/Message;Landroid/os/Message;
-HPLcom/android/server/job/controllers/QuotaController$StandbyTracker$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/job/controllers/QuotaController$StandbyTracker;IILjava/lang/String;)V
-HSPLcom/android/server/job/controllers/QuotaController$TempAllowlistTracker;->onAppAdded(I)V
-HPLcom/android/server/job/controllers/QuotaController$TempAllowlistTracker;->onAppRemoved(I)V
-HPLcom/android/server/job/controllers/QuotaController$TimedEventTooOldPredicate;->test(Lcom/android/server/job/controllers/QuotaController$TimedEvent;)Z+]Lcom/android/server/job/controllers/QuotaController$TimedEvent;Lcom/android/server/job/controllers/QuotaController$TimingSession;
-HPLcom/android/server/job/controllers/QuotaController$TimedEventTooOldPredicate;->test(Ljava/lang/Object;)Z+]Lcom/android/server/job/controllers/QuotaController$TimedEventTooOldPredicate;Lcom/android/server/job/controllers/QuotaController$TimedEventTooOldPredicate;
+HSPLcom/android/server/job/controllers/QuotaController$StandbyTracker$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/job/controllers/QuotaController$StandbyTracker;IILjava/lang/String;)V
+HSPLcom/android/server/job/controllers/QuotaController$StandbyTracker;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+HSPLcom/android/server/job/controllers/QuotaController$TempAllowlistTracker;->onAppAdded(I)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
+HPLcom/android/server/job/controllers/QuotaController$TempAllowlistTracker;->onAppRemoved(I)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HPLcom/android/server/job/controllers/QuotaController$Timer;->cancelCutoff()V
 HPLcom/android/server/job/controllers/QuotaController$Timer;->emitSessionLocked(J)V
 HPLcom/android/server/job/controllers/QuotaController$Timer;->getCurrentDuration(J)J
-HPLcom/android/server/job/controllers/QuotaController$Timer;->isActive()Z
+HSPLcom/android/server/job/controllers/QuotaController$Timer;->isActive()Z
+HPLcom/android/server/job/controllers/QuotaController$Timer;->onStateChangedLocked(JZ)V+]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/QuotaController$Timer;->scheduleCutoff()V
-HPLcom/android/server/job/controllers/QuotaController$Timer;->shouldTrackLocked()Z+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
-HPLcom/android/server/job/controllers/QuotaController$Timer;->startTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)V
+HSPLcom/android/server/job/controllers/QuotaController$Timer;->shouldTrackLocked()Z+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
+HSPLcom/android/server/job/controllers/QuotaController$Timer;->startTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/QuotaController$Timer;->stopTrackingJob(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/QuotaController$TimingSession;-><init>(JJI)V
 HPLcom/android/server/job/controllers/QuotaController$TimingSession;->getEndTimeElapsed()J
-HPLcom/android/server/job/controllers/QuotaController$TopAppTimer;->processEventLocked(Landroid/app/usage/UsageEvents$Event;)V
+HPLcom/android/server/job/controllers/QuotaController$TopAppTimer;->processEventLocked(Landroid/app/usage/UsageEvents$Event;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue;
-HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->accept(Ljava/lang/Object;)V
+HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->accept(Ljava/lang/Object;)V+]Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;
 HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->postProcess()V+]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;
-HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->prepare()V
-HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->reset()V
+HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->prepare()V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;
+HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->reset()V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;
 HPLcom/android/server/job/controllers/QuotaController$UsageEventTracker;->onUsageEvent(ILandroid/app/usage/UsageEvents$Event;)V+]Landroid/os/Handler;Lcom/android/server/job/controllers/QuotaController$QcHandler;]Landroid/os/Message;Landroid/os/Message;]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;
 HSPLcom/android/server/job/controllers/QuotaController;->-$$Nest$fgetmForegroundUids(Lcom/android/server/job/controllers/QuotaController;)Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/job/controllers/QuotaController;->-$$Nest$fgetmHandler(Lcom/android/server/job/controllers/QuotaController;)Lcom/android/server/job/controllers/QuotaController$QcHandler;
 HSPLcom/android/server/job/controllers/QuotaController;->-$$Nest$fgetmTopAppGraceCache(Lcom/android/server/job/controllers/QuotaController;)Landroid/util/SparseLongArray;
-HPLcom/android/server/job/controllers/QuotaController;->-$$Nest$misQuotaFreeLocked(Lcom/android/server/job/controllers/QuotaController;I)Z+]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;
-HPLcom/android/server/job/controllers/QuotaController;->-$$Nest$misTopStartedJobLocked(Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/JobStatus;)Z
+HSPLcom/android/server/job/controllers/QuotaController;->-$$Nest$misQuotaFreeLocked(Lcom/android/server/job/controllers/QuotaController;I)Z+]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;
+HSPLcom/android/server/job/controllers/QuotaController;->-$$Nest$misTopStartedJobLocked(Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/JobStatus;)Z
 HSPLcom/android/server/job/controllers/QuotaController;->-$$Nest$msetConstraintSatisfied(Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/JobStatus;JZZ)Z
 HSPLcom/android/server/job/controllers/QuotaController;->-$$Nest$msetExpeditedQuotaApproved(Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/JobStatus;JZ)Z
 HSPLcom/android/server/job/controllers/QuotaController;->-$$Nest$sfgetDEBUG()Z
@@ -5045,8 +3812,8 @@
 HSPLcom/android/server/job/controllers/QuotaController;->getEJLimitMsLocked(ILjava/lang/String;I)J+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;
 HSPLcom/android/server/job/controllers/QuotaController;->getExecutionStatsLocked(ILjava/lang/String;I)Lcom/android/server/job/controllers/QuotaController$ExecutionStats;+]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;
 HSPLcom/android/server/job/controllers/QuotaController;->getExecutionStatsLocked(ILjava/lang/String;IZ)Lcom/android/server/job/controllers/QuotaController$ExecutionStats;+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;
-HPLcom/android/server/job/controllers/QuotaController;->getMaxJobExecutionTimeMsLocked(Lcom/android/server/job/controllers/JobStatus;)J+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
-HSPLcom/android/server/job/controllers/QuotaController;->getRemainingEJExecutionTimeLocked(ILjava/lang/String;)J+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/controllers/QuotaController$TopAppTimer;Lcom/android/server/job/controllers/QuotaController$TopAppTimer;]Lcom/android/server/job/controllers/QuotaController$ShrinkableDebits;Lcom/android/server/job/controllers/QuotaController$ShrinkableDebits;
+HSPLcom/android/server/job/controllers/QuotaController;->getMaxJobExecutionTimeMsLocked(Lcom/android/server/job/controllers/JobStatus;)J+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
+HSPLcom/android/server/job/controllers/QuotaController;->getRemainingEJExecutionTimeLocked(ILjava/lang/String;)J+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Lcom/android/server/job/controllers/QuotaController$TopAppTimer;Lcom/android/server/job/controllers/QuotaController$TopAppTimer;]Lcom/android/server/job/controllers/QuotaController$ShrinkableDebits;Lcom/android/server/job/controllers/QuotaController$ShrinkableDebits;
 HSPLcom/android/server/job/controllers/QuotaController;->getRemainingExecutionTimeLocked(Lcom/android/server/job/controllers/QuotaController$ExecutionStats;)J
 HPLcom/android/server/job/controllers/QuotaController;->getTimeUntilEJQuotaConsumedLocked(ILjava/lang/String;)J
 HPLcom/android/server/job/controllers/QuotaController;->getTimeUntilQuotaConsumedLocked(ILjava/lang/String;)J+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/List;Ljava/util/ArrayList;
@@ -5061,122 +3828,102 @@
 HPLcom/android/server/job/controllers/QuotaController;->isWithinEJQuotaLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/job/controllers/QuotaController;->isWithinQuotaLocked(ILjava/lang/String;I)Z+]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;
 HSPLcom/android/server/job/controllers/QuotaController;->isWithinQuotaLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;
-HPLcom/android/server/job/controllers/QuotaController;->maybeScheduleCleanupAlarmLocked()V
-HSPLcom/android/server/job/controllers/QuotaController;->maybeScheduleStartAlarmLocked(ILjava/lang/String;I)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/os/Handler;Lcom/android/server/job/controllers/QuotaController$QcHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue;
-HSPLcom/android/server/job/controllers/QuotaController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HPLcom/android/server/job/controllers/QuotaController;->maybeScheduleCleanupAlarmLocked()V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/app/AlarmManager;Landroid/app/AlarmManager;
+HSPLcom/android/server/job/controllers/QuotaController;->maybeScheduleStartAlarmLocked(ILjava/lang/String;I)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/os/Handler;Lcom/android/server/job/controllers/QuotaController$QcHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue;]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/job/controllers/QuotaController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/QuotaController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue;
 HSPLcom/android/server/job/controllers/QuotaController;->maybeUpdateConstraintForPkgLocked(JILjava/lang/String;)Landroid/util/ArraySet;+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue;
-HSPLcom/android/server/job/controllers/QuotaController;->maybeUpdateConstraintForUidLocked(I)Landroid/util/ArraySet;+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;
-HPLcom/android/server/job/controllers/QuotaController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V
-HPLcom/android/server/job/controllers/QuotaController;->saveTimingSession(ILjava/lang/String;Lcom/android/server/job/controllers/QuotaController$TimingSession;ZJ)V
+HSPLcom/android/server/job/controllers/QuotaController;->maybeUpdateConstraintForUidLocked(I)Landroid/util/ArraySet;+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;
+HSPLcom/android/server/job/controllers/QuotaController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HPLcom/android/server/job/controllers/QuotaController;->saveTimingSession(ILjava/lang/String;Lcom/android/server/job/controllers/QuotaController$TimingSession;ZJ)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/job/controllers/QuotaController;->setConstraintSatisfied(Lcom/android/server/job/controllers/JobStatus;JZZ)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/controllers/QuotaController;->setExpeditedQuotaApproved(Lcom/android/server/job/controllers/JobStatus;JZ)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/controllers/BackgroundJobsController;Lcom/android/server/job/controllers/BackgroundJobsController;
-HPLcom/android/server/job/controllers/QuotaController;->unprepareFromExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HPLcom/android/server/job/controllers/QuotaController;->unprepareFromExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/job/controllers/QuotaController;->updateExecutionStatsLocked(ILjava/lang/String;Lcom/android/server/job/controllers/QuotaController$ExecutionStats;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/QuotaController$TimedEvent;Lcom/android/server/job/controllers/QuotaController$TimingSession;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Ljava/util/List;Ljava/util/ArrayList;
-HPLcom/android/server/job/controllers/QuotaController;->updateStandbyBucket(ILjava/lang/String;I)V
+HPLcom/android/server/job/controllers/QuotaController;->updateStandbyBucket(ILjava/lang/String;I)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/controllers/StateController;->evaluateStateLocked(Lcom/android/server/job/controllers/JobStatus;)V
-HSPLcom/android/server/job/controllers/StateController;->onUidBiasChangedLocked(III)V
-HPLcom/android/server/job/controllers/StateController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V
 HSPLcom/android/server/job/controllers/StateController;->wouldBeReadyWithConstraintLocked(Lcom/android/server/job/controllers/JobStatus;I)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/controllers/StorageController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/StorageController$StorageTracker;Lcom/android/server/job/controllers/StorageController$StorageTracker;
 HPLcom/android/server/job/controllers/StorageController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/job/controllers/TareController;->addJobToBillList(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/tare/EconomyManagerInternal;Lcom/android/server/tare/InternalResourceService$LocalService;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/job/controllers/TareController;->getPossibleStartBills(Lcom/android/server/job/controllers/JobStatus;)Landroid/util/ArraySet;+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HPLcom/android/server/job/controllers/TareController;->getRunningActionId(Lcom/android/server/job/controllers/JobStatus;)I+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
-HPLcom/android/server/job/controllers/TareController;->getRunningBill(Lcom/android/server/job/controllers/JobStatus;)Lcom/android/server/tare/EconomyManagerInternal$ActionBill;
+HSPLcom/android/server/job/controllers/TareController;->getRunningActionId(Lcom/android/server/job/controllers/JobStatus;)I+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
+HSPLcom/android/server/job/controllers/TareController;->getRunningBill(Lcom/android/server/job/controllers/JobStatus;)Lcom/android/server/tare/EconomyManagerInternal$ActionBill;+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/controllers/TareController;->hasEnoughWealthLocked(Lcom/android/server/job/controllers/JobStatus;)Z
 HSPLcom/android/server/job/controllers/TareController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/TareController;Lcom/android/server/job/controllers/TareController;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/job/controllers/TareController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/tare/EconomyManagerInternal;Lcom/android/server/tare/InternalResourceService$LocalService;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/TareController;Lcom/android/server/job/controllers/TareController;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HPLcom/android/server/job/controllers/TareController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/tare/EconomyManagerInternal;Lcom/android/server/tare/InternalResourceService$LocalService;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/TareController;Lcom/android/server/job/controllers/TareController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
-HPLcom/android/server/job/controllers/TareController;->removeJobFromBillList(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/tare/EconomyManagerInternal;Lcom/android/server/tare/InternalResourceService$LocalService;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/job/controllers/TareController;->setExpeditedTareApproved(Lcom/android/server/job/controllers/JobStatus;JZ)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/BackgroundJobsController;Lcom/android/server/job/controllers/BackgroundJobsController;
+HSPLcom/android/server/job/controllers/TareController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/tare/EconomyManagerInternal;Lcom/android/server/tare/InternalResourceService$LocalService;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/TareController;Lcom/android/server/job/controllers/TareController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
+HSPLcom/android/server/job/controllers/TareController;->removeJobFromBillList(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/tare/EconomyManagerInternal;Lcom/android/server/tare/InternalResourceService$LocalService;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/job/controllers/TareController;->setExpeditedTareApproved(Lcom/android/server/job/controllers/JobStatus;JZ)Z+]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/controllers/BackgroundJobsController;Lcom/android/server/job/controllers/BackgroundJobsController;
 HSPLcom/android/server/job/controllers/TimeController;->canStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HPLcom/android/server/job/controllers/TimeController;->checkExpiredDeadlinesAndResetAlarm()V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/TimeController;]Ljava/util/ListIterator;Ljava/util/LinkedList$ListItr;]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;]Ljava/util/List;Ljava/util/LinkedList;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
 HPLcom/android/server/job/controllers/TimeController;->checkExpiredDelaysAndResetAlarm()V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/TimeController;]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;]Ljava/util/List;Ljava/util/LinkedList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Ljava/util/Iterator;Ljava/util/LinkedList$ListItr;
-HSPLcom/android/server/job/controllers/TimeController;->evaluateDeadlineConstraint(Lcom/android/server/job/controllers/JobStatus;J)Z
+HSPLcom/android/server/job/controllers/TimeController;->evaluateDeadlineConstraint(Lcom/android/server/job/controllers/JobStatus;J)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/controllers/TimeController;->evaluateStateLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/TimeController;]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;]Ljava/util/List;Ljava/util/LinkedList;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/controllers/TimeController;->evaluateTimingDelayConstraint(Lcom/android/server/job/controllers/JobStatus;J)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;
 HSPLcom/android/server/job/controllers/TimeController;->maybeAdjustAlarmTime(J)J+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;
 HSPLcom/android/server/job/controllers/TimeController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/TimeController;]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;]Ljava/util/ListIterator;Ljava/util/LinkedList$ListItr;]Ljava/util/List;Ljava/util/LinkedList;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
 HSPLcom/android/server/job/controllers/TimeController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;]Ljava/util/List;Ljava/util/LinkedList;
 HSPLcom/android/server/job/controllers/TimeController;->setDeadlineExpiredAlarmLocked(JLandroid/os/WorkSource;)V
-HPLcom/android/server/job/controllers/TimeController;->setDelayExpiredAlarmLocked(JLandroid/os/WorkSource;)V+]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;
-HSPLcom/android/server/job/controllers/TimeController;->updateAlarmWithListenerLocked(Ljava/lang/String;ILandroid/app/AlarmManager$OnAlarmListener;JLandroid/os/WorkSource;)V
+HSPLcom/android/server/job/controllers/TimeController;->setDelayExpiredAlarmLocked(JLandroid/os/WorkSource;)V+]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;
+HSPLcom/android/server/job/controllers/TimeController;->updateAlarmWithListenerLocked(Ljava/lang/String;ILandroid/app/AlarmManager$OnAlarmListener;JLandroid/os/WorkSource;)V+]Landroid/app/AlarmManager;Landroid/app/AlarmManager;
 HSPLcom/android/server/job/restrictions/ThermalStatusRestriction;->isJobRestricted(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;
-HSPLcom/android/server/lights/LightsManager;-><init>()V
-HSPLcom/android/server/lights/LightsService$1;-><init>(Lcom/android/server/lights/LightsService;)V
-HSPLcom/android/server/lights/LightsService$LightImpl;->-$$Nest$fgetmHwLight(Lcom/android/server/lights/LightsService$LightImpl;)Landroid/hardware/light/HwLight;
-HSPLcom/android/server/lights/LightsService$LightImpl;-><init>(Lcom/android/server/lights/LightsService;Landroid/content/Context;Landroid/hardware/light/HwLight;)V
-HSPLcom/android/server/lights/LightsService$LightImpl;-><init>(Lcom/android/server/lights/LightsService;Landroid/content/Context;Landroid/hardware/light/HwLight;Lcom/android/server/lights/LightsService$LightImpl-IA;)V
 HSPLcom/android/server/lights/LightsService$LightImpl;->setLightLocked(IIIII)V
 HSPLcom/android/server/lights/LightsService$LightImpl;->shouldBeInLowPersistenceMode()Z
-HSPLcom/android/server/lights/LightsService$LightsManagerBinderService;-><init>(Lcom/android/server/lights/LightsService;)V
-HSPLcom/android/server/lights/LightsService$VintfHalCache;-><init>()V
-HSPLcom/android/server/lights/LightsService$VintfHalCache;-><init>(Lcom/android/server/lights/LightsService$VintfHalCache-IA;)V
-HSPLcom/android/server/lights/LightsService$VintfHalCache;->get()Landroid/hardware/light/ILights;
-HSPLcom/android/server/lights/LightsService$VintfHalCache;->get()Ljava/lang/Object;
-HSPLcom/android/server/lights/LightsService;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/lights/LightsService;-><init>(Landroid/content/Context;Ljava/util/function/Supplier;Landroid/os/Looper;)V
-HSPLcom/android/server/lights/LightsService;->onBootPhase(I)V
-HSPLcom/android/server/lights/LightsService;->onStart()V
-HSPLcom/android/server/lights/LightsService;->populateAvailableLights(Landroid/content/Context;)V
-HSPLcom/android/server/lights/LightsService;->populateAvailableLightsFromHidl(Landroid/content/Context;)V
-HSPLcom/android/server/lights/LogicalLight;-><init>()V
-HPLcom/android/server/locales/LocaleManagerService;->getApplicationLocales(Ljava/lang/String;I)Landroid/os/LocaleList;
-HPLcom/android/server/locales/LocaleManagerService;->getInstallingPackageName(Ljava/lang/String;I)Ljava/lang/String;
-HPLcom/android/server/locales/LocaleManagerService;->getPackageUid(Ljava/lang/String;I)I
-HPLcom/android/server/locales/LocaleManagerService;->isCallerFromCurrentInputMethod(I)Z
+HSPLcom/android/server/lights/LightsService$LightImpl;->turnOff()V
+HPLcom/android/server/locales/LocaleManagerService;->getApplicationLocales(Ljava/lang/String;I)Landroid/os/LocaleList;+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
+HPLcom/android/server/locales/LocaleManagerService;->getInstallingPackageName(Ljava/lang/String;I)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
+HPLcom/android/server/locales/LocaleManagerService;->getPackageUid(Ljava/lang/String;I)I+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
+HPLcom/android/server/locales/LocaleManagerService;->isCallerFromCurrentInputMethod(I)Z+]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/location/LocationManagerService$LocalService;->isProvider(Ljava/lang/String;Landroid/location/util/identity/CallerIdentity;)Z+]Landroid/location/util/identity/CallerIdentity;Landroid/location/util/identity/CallerIdentity;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Lcom/android/server/location/provider/LocationProviderManager;Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;
-HPLcom/android/server/location/LocationManagerService$LocalService;->isProviderEnabledForUser(Ljava/lang/String;I)Z
+HPLcom/android/server/location/LocationManagerService$LocalService;->isProviderEnabledForUser(Ljava/lang/String;I)Z+]Lcom/android/server/location/LocationManagerService;Lcom/android/server/location/LocationManagerService;]Lcom/android/server/location/provider/LocationProviderManager;Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;
 HSPLcom/android/server/location/LocationManagerService$SystemInjector;->getSettingsHelper()Lcom/android/server/location/injector/SettingsHelper;
-HSPLcom/android/server/location/LocationManagerService;->getLocationProviderManager(Ljava/lang/String;)Lcom/android/server/location/provider/LocationProviderManager;+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Lcom/android/server/location/provider/LocationProviderManager;Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;
+HSPLcom/android/server/location/LocationManagerService;->getLocationProviderManager(Ljava/lang/String;)Lcom/android/server/location/provider/LocationProviderManager;+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Lcom/android/server/location/provider/LocationProviderManager;Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;
 HSPLcom/android/server/location/LocationManagerService;->isLocationEnabledForUser(I)Z+]Lcom/android/server/location/injector/SettingsHelper;Lcom/android/server/location/injector/SystemSettingsHelper;]Lcom/android/server/location/injector/Injector;Lcom/android/server/location/LocationManagerService$SystemInjector;
 HSPLcom/android/server/location/LocationManagerService;->registerLocationListener(Ljava/lang/String;Landroid/location/LocationRequest;Landroid/location/ILocationListener;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/location/LocationManagerService;->validateLocationRequest(Ljava/lang/String;Landroid/location/LocationRequest;Landroid/location/util/identity/CallerIdentity;)Landroid/location/LocationRequest;
-HSPLcom/android/server/location/contexthub/ConcurrentLinkedEvictingDeque;->add(Ljava/lang/Object;)Z
-HPLcom/android/server/location/contexthub/ContextHubClientBroker$$ExternalSyntheticLambda4;-><init>(Lcom/android/server/location/contexthub/ContextHubClientBroker;JLandroid/hardware/location/NanoAppMessage;)V
-HPLcom/android/server/location/contexthub/ContextHubClientBroker;->doSendMessageToNanoApp(Landroid/hardware/location/NanoAppMessage;Landroid/hardware/location/IContextHubTransactionCallback;)I
-HPLcom/android/server/location/contexthub/ContextHubClientBroker;->lambda$releaseWakeLock$13()V
-HPLcom/android/server/location/contexthub/ContextHubClientBroker;->releaseWakeLock()V
-HPLcom/android/server/location/contexthub/ContextHubClientBroker;->sendMessageToClient(Landroid/hardware/location/NanoAppMessage;Ljava/util/List;Ljava/util/List;)B
-HPLcom/android/server/location/contexthub/ContextHubClientBroker;->updateNanoAppAuthState(JLjava/util/List;ZZ)I
-HPLcom/android/server/location/contexthub/ContextHubClientManager;->onMessageFromNanoApp(ISLandroid/hardware/location/NanoAppMessage;Ljava/util/List;Ljava/util/List;)B
-HPLcom/android/server/location/contexthub/ContextHubEventLogger$ContextHubEventBase;-><init>(JI)V
-HPLcom/android/server/location/contexthub/ContextHubEventLogger$NanoappEventBase;-><init>(JIJZ)V
-HPLcom/android/server/location/contexthub/ContextHubEventLogger$NanoappMessageEvent;-><init>(JILandroid/hardware/location/NanoAppMessage;Z)V
-HPLcom/android/server/location/contexthub/ContextHubEventLogger;->getInstance()Lcom/android/server/location/contexthub/ContextHubEventLogger;
-HPLcom/android/server/location/contexthub/ContextHubEventLogger;->logMessageFromNanoapp(ILandroid/hardware/location/NanoAppMessage;Z)V
-HPLcom/android/server/location/contexthub/ContextHubEventLogger;->logMessageToNanoapp(ILandroid/hardware/location/NanoAppMessage;Z)V
+HSPLcom/android/server/location/contexthub/ConcurrentLinkedEvictingDeque;->add(Ljava/lang/Object;)Z+]Ljava/util/concurrent/ConcurrentLinkedDeque;Lcom/android/server/location/contexthub/ConcurrentLinkedEvictingDeque;
+HSPLcom/android/server/location/contexthub/ContextHubClientBroker;-><init>(Landroid/content/Context;Lcom/android/server/location/contexthub/IContextHubWrapper;Lcom/android/server/location/contexthub/ContextHubClientManager;Landroid/hardware/location/ContextHubInfo;SLandroid/hardware/location/IContextHubClientCallback;Ljava/lang/String;Lcom/android/server/location/contexthub/ContextHubTransactionManager;Landroid/app/PendingIntent;JLjava/lang/String;)V
+HSPLcom/android/server/location/contexthub/ContextHubClientBroker;->doSendMessageToNanoApp(Landroid/hardware/location/NanoAppMessage;Landroid/hardware/location/IContextHubTransactionCallback;)I
+HSPLcom/android/server/location/contexthub/ContextHubClientBroker;->lambda$releaseWakeLock$13()V
+HSPLcom/android/server/location/contexthub/ContextHubClientBroker;->releaseWakeLock()V
+HSPLcom/android/server/location/contexthub/ContextHubClientBroker;->sendMessageToClient(Landroid/hardware/location/NanoAppMessage;Ljava/util/List;Ljava/util/List;)B
+HSPLcom/android/server/location/contexthub/ContextHubClientBroker;->toString()Ljava/lang/String;
+HSPLcom/android/server/location/contexthub/ContextHubClientBroker;->updateNanoAppAuthState(JLjava/util/List;ZZ)I
+HSPLcom/android/server/location/contexthub/ContextHubClientManager;->onMessageFromNanoApp(ISLandroid/hardware/location/NanoAppMessage;Ljava/util/List;Ljava/util/List;)B
+HSPLcom/android/server/location/contexthub/ContextHubEventLogger$ContextHubEventBase;-><init>(JI)V
+HSPLcom/android/server/location/contexthub/ContextHubEventLogger$NanoappEventBase;-><init>(JIJZ)V
+HSPLcom/android/server/location/contexthub/ContextHubEventLogger$NanoappMessageEvent;-><init>(JILandroid/hardware/location/NanoAppMessage;Z)V
+HSPLcom/android/server/location/contexthub/ContextHubEventLogger;->getInstance()Lcom/android/server/location/contexthub/ContextHubEventLogger;
+HSPLcom/android/server/location/contexthub/ContextHubEventLogger;->logMessageFromNanoapp(ILandroid/hardware/location/NanoAppMessage;Z)V
+HSPLcom/android/server/location/contexthub/ContextHubEventLogger;->logMessageToNanoapp(ILandroid/hardware/location/NanoAppMessage;Z)V
 HPLcom/android/server/location/contexthub/ContextHubService;->checkHalProxyAndContextHubId(ILandroid/hardware/location/IContextHubTransactionCallback;I)Z
-HSPLcom/android/server/location/contexthub/ContextHubService;->getCallingPackageName()Ljava/lang/String;
-HPLcom/android/server/location/contexthub/ContextHubService;->queryNanoApps(ILandroid/hardware/location/IContextHubTransactionCallback;)V
+HSPLcom/android/server/location/contexthub/ContextHubService;->getCallingPackageName()Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
+HSPLcom/android/server/location/contexthub/ContextHubService;->handleQueryAppsCallback(ILjava/util/List;)V+]Lcom/android/server/location/contexthub/ContextHubTransactionManager;Lcom/android/server/location/contexthub/ContextHubTransactionManager;]Lcom/android/server/location/contexthub/NanoAppStateManager;Lcom/android/server/location/contexthub/NanoAppStateManager;]Ljava/util/Set;Ljava/util/Collections$SetFromMap;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HPLcom/android/server/location/contexthub/ContextHubService;->queryNanoApps(ILandroid/hardware/location/IContextHubTransactionCallback;)V+]Lcom/android/server/location/contexthub/ContextHubTransactionManager;Lcom/android/server/location/contexthub/ContextHubTransactionManager;
 HSPLcom/android/server/location/contexthub/ContextHubServiceTransaction;-><init>(IILjava/lang/String;)V
 HSPLcom/android/server/location/contexthub/ContextHubServiceTransaction;->getTimeout(Ljava/util/concurrent/TimeUnit;)J
 HSPLcom/android/server/location/contexthub/ContextHubServiceTransaction;->toString()Ljava/lang/String;
-HPLcom/android/server/location/contexthub/ContextHubServiceUtil;->checkPermissions(Landroid/content/Context;)V
-HPLcom/android/server/location/contexthub/ContextHubServiceUtil;->createAidlContextHubMessage(SLandroid/hardware/location/NanoAppMessage;)Landroid/hardware/contexthub/ContextHubMessage;
+HSPLcom/android/server/location/contexthub/ContextHubServiceUtil;->createAidlContextHubMessage(SLandroid/hardware/location/NanoAppMessage;)Landroid/hardware/contexthub/ContextHubMessage;
 HSPLcom/android/server/location/contexthub/ContextHubServiceUtil;->createNanoAppStateList([Landroid/hardware/contexthub/NanoappInfo;)Ljava/util/List;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/location/contexthub/ContextHubTransactionManager$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/location/contexthub/ContextHubTransactionManager;Lcom/android/server/location/contexthub/ContextHubServiceTransaction;)V
 HSPLcom/android/server/location/contexthub/ContextHubTransactionManager$6;-><init>(Lcom/android/server/location/contexthub/ContextHubTransactionManager;IILjava/lang/String;ILandroid/hardware/location/IContextHubTransactionCallback;)V
-HSPLcom/android/server/location/contexthub/ContextHubTransactionManager$6;->onTransact()I
+HSPLcom/android/server/location/contexthub/ContextHubTransactionManager$6;->onTransact()I+]Lcom/android/server/location/contexthub/IContextHubWrapper;Lcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl;
 HSPLcom/android/server/location/contexthub/ContextHubTransactionManager$TransactionRecord;-><init>(Lcom/android/server/location/contexthub/ContextHubTransactionManager;Ljava/lang/String;)V
-HSPLcom/android/server/location/contexthub/ContextHubTransactionManager;->addTransaction(Lcom/android/server/location/contexthub/ContextHubServiceTransaction;)V
+HSPLcom/android/server/location/contexthub/ContextHubTransactionManager;->addTransaction(Lcom/android/server/location/contexthub/ContextHubServiceTransaction;)V+]Lcom/android/server/location/contexthub/ConcurrentLinkedEvictingDeque;Lcom/android/server/location/contexthub/ConcurrentLinkedEvictingDeque;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Lcom/android/server/location/contexthub/ContextHubServiceTransaction;Lcom/android/server/location/contexthub/ContextHubTransactionManager$6;
 HSPLcom/android/server/location/contexthub/ContextHubTransactionManager;->createQueryTransaction(ILandroid/hardware/location/IContextHubTransactionCallback;Ljava/lang/String;)Lcom/android/server/location/contexthub/ContextHubServiceTransaction;
-HSPLcom/android/server/location/contexthub/ContextHubTransactionManager;->startNextTransaction()V
-HSPLcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl$ContextHubAidlCallback$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl$ContextHubAidlCallback;Ljava/util/List;)V
-HPLcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl$ContextHubAidlCallback$$ExternalSyntheticLambda3;-><init>(Lcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl$ContextHubAidlCallback;Landroid/hardware/contexthub/ContextHubMessage;[Ljava/lang/String;)V
-HPLcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl$ContextHubAidlCallback;->handleContextHubMessage(Landroid/hardware/contexthub/ContextHubMessage;[Ljava/lang/String;)V
+HSPLcom/android/server/location/contexthub/ContextHubTransactionManager;->startNextTransaction()V+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/concurrent/ScheduledThreadPoolExecutor;Ljava/util/concurrent/ScheduledThreadPoolExecutor;]Lcom/android/server/location/contexthub/ContextHubServiceTransaction;Lcom/android/server/location/contexthub/ContextHubTransactionManager$6;
+HSPLcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl$ContextHubAidlCallback;->handleContextHubMessage(Landroid/hardware/contexthub/ContextHubMessage;[Ljava/lang/String;)V
 HSPLcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl$ContextHubAidlCallback;->handleNanoappInfo([Landroid/hardware/contexthub/NanoappInfo;)V
-HPLcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl$ContextHubAidlCallback;->lambda$handleContextHubMessage$1(Landroid/hardware/contexthub/ContextHubMessage;[Ljava/lang/String;)V
-HPLcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl;->sendMessageToContextHub(SILandroid/hardware/location/NanoAppMessage;)I
+HSPLcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl;->sendMessageToContextHub(SILandroid/hardware/location/NanoAppMessage;)I
 HSPLcom/android/server/location/contexthub/NanoAppStateManager;->getNanoAppHandle(IJ)I+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Collection;Ljava/util/HashMap$Values;]Ljava/util/Iterator;Ljava/util/HashMap$ValueIterator;]Landroid/hardware/location/NanoAppInstanceInfo;Landroid/hardware/location/NanoAppInstanceInfo;
 HSPLcom/android/server/location/contexthub/NanoAppStateManager;->handleQueryAppEntry(IJI)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/location/contexthub/NanoAppStateManager;Lcom/android/server/location/contexthub/NanoAppStateManager;]Landroid/hardware/location/NanoAppInstanceInfo;Landroid/hardware/location/NanoAppInstanceInfo;
 HSPLcom/android/server/location/contexthub/NanoAppStateManager;->updateCache(ILjava/util/List;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Collection;Ljava/util/HashMap$Values;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/location/contexthub/NanoAppStateManager;Lcom/android/server/location/contexthub/NanoAppStateManager;]Ljava/util/HashSet;Ljava/util/HashSet;]Landroid/hardware/location/NanoAppState;Landroid/hardware/location/NanoAppState;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;,Ljava/util/HashMap$ValueIterator;]Landroid/hardware/location/NanoAppInstanceInfo;Landroid/hardware/location/NanoAppInstanceInfo;
 HSPLcom/android/server/location/eventlog/LocalEventLog;->addLog(JLjava/lang/Object;)V+]Lcom/android/server/location/eventlog/LocalEventLog;Lcom/android/server/location/eventlog/LocationEventLog;,Lcom/android/server/location/eventlog/LocationEventLog$LocationsEventLog;
 HSPLcom/android/server/location/eventlog/LocalEventLog;->addLogEventInternal(ZILjava/lang/Object;)V+]Lcom/android/server/location/eventlog/LocalEventLog;Lcom/android/server/location/eventlog/LocationEventLog;,Lcom/android/server/location/eventlog/LocationEventLog$LocationsEventLog;
 HSPLcom/android/server/location/eventlog/LocalEventLog;->createEntry(ZI)I
-HPLcom/android/server/location/eventlog/LocalEventLog;->startIndex()I
+HPLcom/android/server/location/eventlog/LocalEventLog;->startIndex()I+]Lcom/android/server/location/eventlog/LocalEventLog;Lcom/android/server/location/eventlog/LocationEventLog$LocationsEventLog;,Lcom/android/server/location/eventlog/LocationEventLog;
 HSPLcom/android/server/location/eventlog/LocalEventLog;->wrapIndex(I)I
+HPLcom/android/server/location/eventlog/LocationEventLog$AggregateStats;->updateTotals()V
 HPLcom/android/server/location/eventlog/LocationEventLog$LocationsEventLog;->addLog(Ljava/lang/Object;)V+]Lcom/android/server/location/eventlog/LocalEventLog;Lcom/android/server/location/eventlog/LocationEventLog$LocationsEventLog;
 HPLcom/android/server/location/eventlog/LocationEventLog$ProviderDeliverLocationEvent;-><init>(Ljava/lang/String;ILandroid/location/util/identity/CallerIdentity;)V
 HSPLcom/android/server/location/eventlog/LocationEventLog$ProviderEvent;-><init>(Ljava/lang/String;)V
@@ -5184,6 +3931,7 @@
 HPLcom/android/server/location/eventlog/LocationEventLog;->logProviderDeliveredLocations(Ljava/lang/String;ILandroid/location/util/identity/CallerIdentity;)V+]Lcom/android/server/location/eventlog/LocationEventLog;Lcom/android/server/location/eventlog/LocationEventLog;]Lcom/android/server/location/eventlog/LocationEventLog$AggregateStats;Lcom/android/server/location/eventlog/LocationEventLog$AggregateStats;]Lcom/android/server/location/eventlog/LocationEventLog$LocationsEventLog;Lcom/android/server/location/eventlog/LocationEventLog$LocationsEventLog;
 HPLcom/android/server/location/gnss/GnssListenerMultiplexer$$ExternalSyntheticLambda11;->test(Ljava/lang/Object;)Z
 HPLcom/android/server/location/gnss/GnssListenerMultiplexer$$ExternalSyntheticLambda9;->test(Ljava/lang/Object;)Z
+HPLcom/android/server/location/gnss/GnssListenerMultiplexer$GnssListenerRegistration;->onForegroundChanged(IZ)Z
 HPLcom/android/server/location/gnss/GnssLocationProvider;->handleReportLocation(ZLandroid/location/Location;)V
 HPLcom/android/server/location/gnss/GnssLocationProvider;->handleReportSvStatus(Landroid/location/GnssStatus;)V+]Lcom/android/server/location/gnss/GnssLocationProvider$LocationExtras;Lcom/android/server/location/gnss/GnssLocationProvider$LocationExtras;]Landroid/location/GnssStatus;Landroid/location/GnssStatus;]Ljava/util/Set;Ljava/util/HashSet;]Lcom/android/server/location/gnss/GnssMetrics;Lcom/android/server/location/gnss/GnssMetrics;
 HSPLcom/android/server/location/gnss/GnssLocationProvider;->postWithWakeLockHeld(Ljava/lang/Runnable;)V
@@ -5192,42 +3940,38 @@
 HPLcom/android/server/location/gnss/GnssMetrics;->logCn0L5(Landroid/location/GnssStatus;)V+]Lcom/android/server/location/gnss/GnssMetrics$Statistics;Lcom/android/server/location/gnss/GnssMetrics$Statistics;]Landroid/location/GnssStatus;Landroid/location/GnssStatus;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/Float;Ljava/lang/Float;
 HPLcom/android/server/location/gnss/GnssMetrics;->logSvStatus(Landroid/location/GnssStatus;)V+]Landroid/location/GnssStatus;Landroid/location/GnssStatus;
 HPLcom/android/server/location/gnss/GnssPowerStats;-><init>(IJDDDDDD[D)V
-HPLcom/android/server/location/gnss/GnssVisibilityControl$$ExternalSyntheticLambda5;->run()V
-HPLcom/android/server/location/gnss/GnssVisibilityControl;->handlePermissionsChanged(I)V
+HPLcom/android/server/location/gnss/GnssStatusProvider;->lambda$onReportSvStatus$2(Landroid/location/GnssStatus;Lcom/android/server/location/gnss/GnssListenerMultiplexer$GnssListenerRegistration;)Lcom/android/internal/listeners/ListenerExecutor$ListenerOperation;+]Lcom/android/server/location/injector/AppOpsHelper;Lcom/android/server/location/injector/SystemAppOpsHelper;
 HPLcom/android/server/location/gnss/hal/GnssNative$$ExternalSyntheticLambda9;-><init>(Lcom/android/server/location/gnss/hal/GnssNative;I[I[F[F[F[F[F)V
+HPLcom/android/server/location/gnss/hal/GnssNative$$ExternalSyntheticLambda9;->runOrThrow()V
 HSPLcom/android/server/location/injector/AppForegroundHelper;->notifyAppForeground(IZ)V+]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Lcom/android/server/location/injector/AppForegroundHelper$AppForegroundListener;Lcom/android/server/location/provider/LocationProviderManager$$ExternalSyntheticLambda6;,Lcom/android/server/location/gnss/GnssListenerMultiplexer$$ExternalSyntheticLambda4;
 HSPLcom/android/server/location/injector/LocationPermissionsHelper;->hasLocationPermissions(ILandroid/location/util/identity/CallerIdentity;)Z
 HSPLcom/android/server/location/injector/LocationPermissionsHelper;->notifyLocationPermissionsChanged(I)V+]Lcom/android/server/location/injector/LocationPermissionsHelper$LocationPermissionsListener;Lcom/android/server/location/provider/LocationProviderManager$1;,Lcom/android/server/location/gnss/GnssListenerMultiplexer$1;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;
+HSPLcom/android/server/location/injector/LocationUsageLogger;->logLocationApiUsage(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/location/LocationRequest;ZZLandroid/location/Geofence;Z)V
 HSPLcom/android/server/location/injector/SystemAppForegroundHelper$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/location/injector/SystemAppForegroundHelper;IZ)V
 HSPLcom/android/server/location/injector/SystemAppForegroundHelper$$ExternalSyntheticLambda1;->run()V
 HSPLcom/android/server/location/injector/SystemAppForegroundHelper;->onAppForegroundChanged(II)V+]Landroid/os/Handler;Landroid/os/Handler;
 HSPLcom/android/server/location/injector/SystemAppOpsHelper;->checkOpNoThrow(ILandroid/location/util/identity/CallerIdentity;)Z
 HPLcom/android/server/location/injector/SystemAppOpsHelper;->noteOpNoThrow(ILandroid/location/util/identity/CallerIdentity;)Z+]Landroid/location/util/identity/CallerIdentity;Landroid/location/util/identity/CallerIdentity;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
 HSPLcom/android/server/location/injector/SystemLocationPermissionsHelper$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/location/injector/SystemLocationPermissionsHelper;I)V
-HSPLcom/android/server/location/injector/SystemLocationPermissionsHelper$$ExternalSyntheticLambda1;->run()V
 HSPLcom/android/server/location/injector/SystemLocationPermissionsHelper;->lambda$onSystemReady$1(I)V
 HSPLcom/android/server/location/injector/SystemSettingsHelper$IntegerSecureSetting;->getValueForUser(II)I+]Landroid/content/Context;Landroid/app/ContextImpl;
-HSPLcom/android/server/location/injector/SystemSettingsHelper;->isLocationEnabled(I)Z
+HSPLcom/android/server/location/injector/SystemSettingsHelper;->isLocationEnabled(I)Z+]Lcom/android/server/location/injector/SystemSettingsHelper$IntegerSecureSetting;Lcom/android/server/location/injector/SystemSettingsHelper$IntegerSecureSetting;
 HSPLcom/android/server/location/injector/SystemUserInfoHelper;->getRunningUserIds()[I+]Lcom/android/server/location/injector/SystemUserInfoHelper;Lcom/android/server/location/LocationManagerService$Lifecycle$LifecycleUserInfoHelper;]Landroid/app/IActivityManager;Lcom/android/server/am/ActivityManagerService;
 HSPLcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;->acquire()Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;
 HSPLcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;->close()V+]Ljava/util/Map$Entry;Ljava/util/AbstractMap$SimpleImmutableEntry;]Lcom/android/server/location/listeners/ListenerMultiplexer;Lcom/android/server/location/provider/LocationProviderManager;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;Lcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;
 HSPLcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;->acquire()Lcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;
 HSPLcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;->close()V+]Lcom/android/server/location/listeners/ListenerMultiplexer;megamorphic_types
-HPLcom/android/server/location/listeners/ListenerMultiplexer;->deliverToListeners(Ljava/util/function/Function;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Function;Lcom/android/server/location/gnss/GnssStatusProvider$$ExternalSyntheticLambda1;,Lcom/android/server/location/provider/LocationProviderManager$$ExternalSyntheticLambda12;,Lcom/android/server/location/gnss/GnssNmeaProvider$1;,Lcom/android/server/location/gnss/GnssMeasurementsProvider$$ExternalSyntheticLambda0;]Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;]Lcom/android/server/location/listeners/ListenerRegistration;Lcom/android/server/location/gnss/GnssListenerMultiplexer$GnssListenerRegistration;,Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;,Lcom/android/server/location/gnss/GnssMeasurementsProvider$GnssMeasurementListenerRegistration;
+HPLcom/android/server/location/listeners/ListenerMultiplexer;->deliverToListeners(Ljava/util/function/Function;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Function;Lcom/android/server/location/gnss/GnssStatusProvider$$ExternalSyntheticLambda1;,Lcom/android/server/location/gnss/GnssNmeaProvider$1;,Lcom/android/server/location/provider/LocationProviderManager$$ExternalSyntheticLambda12;,Lcom/android/server/location/gnss/GnssMeasurementsProvider$$ExternalSyntheticLambda0;]Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;]Lcom/android/server/location/listeners/ListenerRegistration;Lcom/android/server/location/gnss/GnssListenerMultiplexer$GnssListenerRegistration;,Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;,Lcom/android/server/location/gnss/GnssMeasurementsProvider$GnssMeasurementListenerRegistration;
 HSPLcom/android/server/location/listeners/ListenerMultiplexer;->replaceRegistration(Ljava/lang/Object;Ljava/lang/Object;Lcom/android/server/location/listeners/ListenerRegistration;)V
-HSPLcom/android/server/location/listeners/ListenerMultiplexer;->updateRegistrations(Ljava/util/function/Predicate;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;]Ljava/util/function/Predicate;megamorphic_types]Lcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;Lcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;]Lcom/android/server/location/listeners/ListenerMultiplexer;Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;,Lcom/android/server/location/gnss/GnssStatusProvider;,Lcom/android/server/location/gnss/GnssNmeaProvider;
+HSPLcom/android/server/location/listeners/ListenerMultiplexer;->updateRegistrations(Ljava/util/function/Predicate;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/location/listeners/ListenerMultiplexer;Lcom/android/server/location/provider/LocationProviderManager;,Lcom/android/server/location/gnss/GnssStatusProvider;,Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/gnss/GnssNmeaProvider;]Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;]Ljava/util/function/Predicate;megamorphic_types]Lcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;Lcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;
 HPLcom/android/server/location/listeners/ListenerMultiplexer;->updateService()V
-HPLcom/android/server/location/listeners/ListenerRegistration$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/location/listeners/ListenerRegistration;)V
 HPLcom/android/server/location/listeners/ListenerRegistration$$ExternalSyntheticLambda0;->get()Ljava/lang/Object;
 HPLcom/android/server/location/listeners/ListenerRegistration$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/location/listeners/ListenerRegistration;)V
-HPLcom/android/server/location/listeners/ListenerRegistration;->$r8$lambda$Az8TrU1jpn4hMJorXEqKeseINgI(Lcom/android/server/location/listeners/ListenerRegistration;)Ljava/lang/Object;+]Lcom/android/server/location/listeners/ListenerRegistration;Lcom/android/server/location/gnss/GnssListenerMultiplexer$GnssListenerRegistration;,Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;,Lcom/android/server/location/gnss/GnssMeasurementsProvider$GnssMeasurementListenerRegistration;
-HPLcom/android/server/location/listeners/ListenerRegistration;->executeOperation(Lcom/android/internal/listeners/ListenerExecutor$ListenerOperation;)V+]Lcom/android/internal/listeners/ListenerExecutor;Lcom/android/server/location/gnss/GnssListenerMultiplexer$GnssListenerRegistration;,Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;,Lcom/android/server/location/gnss/GnssMeasurementsProvider$GnssMeasurementListenerRegistration;
+HPLcom/android/server/location/listeners/ListenerRegistration;->executeOperation(Lcom/android/internal/listeners/ListenerExecutor$ListenerOperation;)V+]Lcom/android/internal/listeners/ListenerExecutor;Lcom/android/server/location/gnss/GnssListenerMultiplexer$GnssListenerRegistration;,Lcom/android/server/location/gnss/GnssMeasurementsProvider$GnssMeasurementListenerRegistration;,Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;
 HPLcom/android/server/location/listeners/ListenerRegistration;->lambda$executeOperation$0()Ljava/lang/Object;
 HSPLcom/android/server/location/provider/AbstractLocationProvider;->getState()Lcom/android/server/location/provider/AbstractLocationProvider$State;
 HPLcom/android/server/location/provider/AbstractLocationProvider;->reportLocation(Landroid/location/LocationResult;)V+]Lcom/android/server/location/provider/AbstractLocationProvider$Listener;Lcom/android/server/location/provider/StationaryThrottlingLocationProvider;,Lcom/android/server/location/provider/MockableLocationProvider$ListenerWrapper;,Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference;
-HPLcom/android/server/location/provider/LocationProviderManager$$ExternalSyntheticLambda12;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/location/provider/LocationProviderManager$$ExternalSyntheticLambda29;->test(Ljava/lang/Object;)Z
-HSPLcom/android/server/location/provider/LocationProviderManager$$ExternalSyntheticLambda31;-><init>(I)V
 HSPLcom/android/server/location/provider/LocationProviderManager$$ExternalSyntheticLambda31;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/location/provider/LocationProviderManager$1;->onLocationPermissionsChanged(I)V
 HPLcom/android/server/location/provider/LocationProviderManager$LastLocation;->set(Landroid/location/Location;)V
@@ -5236,35 +3980,30 @@
 HPLcom/android/server/location/provider/LocationProviderManager$LocationRegistration$1;-><init>(Lcom/android/server/location/provider/LocationProviderManager$LocationRegistration;)V
 HPLcom/android/server/location/provider/LocationProviderManager$LocationRegistration$1;->test(Landroid/location/Location;)Z+]Lcom/android/server/location/provider/LocationProviderManager$Registration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;]Landroid/location/Location;Landroid/location/Location;]Landroid/location/LocationRequest;Landroid/location/LocationRequest;
 HPLcom/android/server/location/provider/LocationProviderManager$LocationRegistration$2;-><init>(Lcom/android/server/location/provider/LocationProviderManager$LocationRegistration;Landroid/location/LocationResult;Z)V
-HPLcom/android/server/location/provider/LocationProviderManager$LocationRegistration$2;->onPostExecute(Z)V+]Lcom/android/server/location/provider/LocationProviderManager$Registration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;]Lcom/android/server/location/listeners/RemovableListenerRegistration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;]Landroid/location/LocationRequest;Landroid/location/LocationRequest;]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;
+HPLcom/android/server/location/provider/LocationProviderManager$LocationRegistration$2;->onPostExecute(Z)V+]Lcom/android/server/location/provider/LocationProviderManager$Registration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;]Lcom/android/server/location/listeners/RemovableListenerRegistration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;]Landroid/location/LocationRequest;Landroid/location/LocationRequest;
 HPLcom/android/server/location/provider/LocationProviderManager$LocationRegistration$2;->onPreExecute()V+]Lcom/android/server/location/provider/LocationProviderManager$Registration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;]Landroid/location/LocationResult;Landroid/location/LocationResult;]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;
 HPLcom/android/server/location/provider/LocationProviderManager$LocationRegistration$2;->operate(Lcom/android/server/location/provider/LocationProviderManager$LocationTransport;)V+]Lcom/android/server/location/provider/LocationProviderManager$Registration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;]Lcom/android/server/location/eventlog/LocationEventLog;Lcom/android/server/location/eventlog/LocationEventLog;]Landroid/location/LocationResult;Landroid/location/LocationResult;]Landroid/location/util/identity/CallerIdentity;Landroid/location/util/identity/CallerIdentity;]Lcom/android/server/location/provider/LocationProviderManager$LocationTransport;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerTransport;
 HPLcom/android/server/location/provider/LocationProviderManager$LocationRegistration;->acceptLocationChange(Landroid/location/LocationResult;)Lcom/android/internal/listeners/ListenerExecutor$ListenerOperation;+]Lcom/android/server/location/provider/LocationProviderManager$Registration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;]Lcom/android/server/location/injector/AppOpsHelper;Lcom/android/server/location/injector/SystemAppOpsHelper;]Landroid/location/LocationResult;Landroid/location/LocationResult;]Landroid/location/LocationRequest;Landroid/location/LocationRequest;]Lcom/android/server/location/provider/LocationProviderManager;Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;
 HSPLcom/android/server/location/provider/LocationProviderManager$Registration;->getIdentity()Landroid/location/util/identity/CallerIdentity;
-HPLcom/android/server/location/provider/LocationProviderManager$Registration;->getLastDeliveredLocation()Landroid/location/Location;
+HPLcom/android/server/location/provider/LocationProviderManager$Registration;->getPermissionLevel()I
 HSPLcom/android/server/location/provider/LocationProviderManager$Registration;->getRequest()Landroid/location/LocationRequest;
 HSPLcom/android/server/location/provider/LocationProviderManager$Registration;->onForegroundChanged(IZ)Z+]Lcom/android/server/location/provider/LocationProviderManager$Registration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;]Lcom/android/server/location/eventlog/LocationEventLog;Lcom/android/server/location/eventlog/LocationEventLog;]Lcom/android/server/location/injector/LocationPowerSaveModeHelper;Lcom/android/server/location/injector/SystemLocationPowerSaveModeHelper;]Landroid/location/util/identity/CallerIdentity;Landroid/location/util/identity/CallerIdentity;
 HSPLcom/android/server/location/provider/LocationProviderManager$Registration;->onLocationPermissionsChanged(I)Z+]Lcom/android/server/location/provider/LocationProviderManager$Registration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;]Landroid/location/util/identity/CallerIdentity;Landroid/location/util/identity/CallerIdentity;
 HSPLcom/android/server/location/provider/LocationProviderManager$Registration;->onRegister()V
-HSPLcom/android/server/location/provider/LocationProviderManager;->$r8$lambda$HrSqErjdWoCxZIabZEeD-TtPMOo(ILcom/android/server/location/provider/LocationProviderManager$Registration;)Z
-HSPLcom/android/server/location/provider/LocationProviderManager;->$r8$lambda$TlPJnIwBbkvrT20UYrQqqAp6Ncw(IZLcom/android/server/location/provider/LocationProviderManager$Registration;)Z
 HSPLcom/android/server/location/provider/LocationProviderManager;->access$700(Lcom/android/server/location/provider/LocationProviderManager;)Ljava/lang/Object;
-HSPLcom/android/server/location/provider/LocationProviderManager;->access$900(Lcom/android/server/location/provider/LocationProviderManager;)Ljava/lang/Object;
 HPLcom/android/server/location/provider/LocationProviderManager;->getLastLocationUnsafe(IIZJ)Landroid/location/Location;+]Landroid/location/Location;Landroid/location/Location;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/location/provider/LocationProviderManager$LastLocation;Lcom/android/server/location/provider/LocationProviderManager$LastLocation;]Lcom/android/server/location/injector/UserInfoHelper;Lcom/android/server/location/LocationManagerService$Lifecycle$LifecycleUserInfoHelper;]Lcom/android/server/location/provider/LocationProviderManager;Lcom/android/server/location/provider/LocationProviderManager;
 HSPLcom/android/server/location/provider/LocationProviderManager;->getName()Ljava/lang/String;
 HSPLcom/android/server/location/provider/LocationProviderManager;->isEnabled(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
-HSPLcom/android/server/location/provider/LocationProviderManager;->isVisibleToCaller()Z+]Ljava/util/Collection;Ljava/util/Collections$EmptyList;,Ljava/util/Collections$SingletonList;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/location/provider/MockableLocationProvider;Lcom/android/server/location/provider/MockableLocationProvider;]Ljava/util/Iterator;Ljava/util/Collections$EmptyIterator;,Ljava/util/Collections$1;
-HSPLcom/android/server/location/provider/LocationProviderManager;->lambda$onAppForegroundChanged$10(IZLcom/android/server/location/provider/LocationProviderManager$Registration;)Z
-HSPLcom/android/server/location/provider/LocationProviderManager;->lambda$onLocationPermissionsChanged$13(ILcom/android/server/location/provider/LocationProviderManager$Registration;)Z
-HPLcom/android/server/location/provider/LocationProviderManager;->lambda$processReportedLocation$19(Landroid/location/Location;)Landroid/location/Location;
+HSPLcom/android/server/location/provider/LocationProviderManager;->isVisibleToCaller()Z+]Ljava/util/Collection;Ljava/util/Collections$EmptyList;,Ljava/util/Collections$SingletonList;]Lcom/android/server/location/provider/MockableLocationProvider;Lcom/android/server/location/provider/MockableLocationProvider;]Ljava/util/Iterator;Ljava/util/Collections$EmptyIterator;,Ljava/util/Collections$1;]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/location/provider/LocationProviderManager;->mergeRegistrations(Ljava/util/Collection;)Landroid/location/provider/ProviderRequest;
 HSPLcom/android/server/location/provider/LocationProviderManager;->onLocationPermissionsChanged(I)V
-HPLcom/android/server/location/provider/LocationProviderManager;->onReportLocation(Landroid/location/LocationResult;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/location/eventlog/LocationEventLog;Lcom/android/server/location/eventlog/LocationEventLog;]Landroid/location/Location;Landroid/location/Location;]Lcom/android/server/location/listeners/ListenerMultiplexer;Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;]Landroid/location/LocationResult;Landroid/location/LocationResult;]Lcom/android/server/location/provider/PassiveLocationProviderManager;Lcom/android/server/location/provider/PassiveLocationProviderManager;]Lcom/android/server/location/provider/LocationProviderManager;Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;
+HPLcom/android/server/location/provider/LocationProviderManager;->onReportLocation(Landroid/location/LocationResult;)V+]Lcom/android/server/location/eventlog/LocationEventLog;Lcom/android/server/location/eventlog/LocationEventLog;]Lcom/android/server/location/listeners/ListenerMultiplexer;Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;]Landroid/location/Location;Landroid/location/Location;]Landroid/location/LocationResult;Landroid/location/LocationResult;]Lcom/android/server/location/provider/PassiveLocationProviderManager;Lcom/android/server/location/provider/PassiveLocationProviderManager;]Lcom/android/server/location/provider/LocationProviderManager;Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/location/provider/LocationProviderManager;->processReportedLocation(Landroid/location/LocationResult;)Landroid/location/LocationResult;
 HPLcom/android/server/location/provider/LocationProviderManager;->setLastLocation(Landroid/location/Location;I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/location/provider/LocationProviderManager$LastLocation;Lcom/android/server/location/provider/LocationProviderManager$LastLocation;]Lcom/android/server/location/injector/UserInfoHelper;Lcom/android/server/location/LocationManagerService$Lifecycle$LifecycleUserInfoHelper;]Lcom/android/server/location/provider/LocationProviderManager;Lcom/android/server/location/provider/PassiveLocationProviderManager;,Lcom/android/server/location/provider/LocationProviderManager;
 HPLcom/android/server/location/provider/MockableLocationProvider$ListenerWrapper;->onReportLocation(Landroid/location/LocationResult;)V+]Lcom/android/server/location/provider/AbstractLocationProvider;Lcom/android/server/location/provider/MockableLocationProvider;
-HPLcom/android/server/location/provider/PassiveLocationProviderManager;->updateLocation(Landroid/location/LocationResult;)V
-HSPLcom/android/server/location/provider/StationaryThrottlingLocationProvider;->onThrottlingChangedLocked(Z)V
+HSPLcom/android/server/location/provider/MockableLocationProvider;->isMock()Z
+HPLcom/android/server/location/provider/PassiveLocationProviderManager;->updateLocation(Landroid/location/LocationResult;)V+]Lcom/android/server/location/provider/PassiveLocationProvider;Lcom/android/server/location/provider/PassiveLocationProvider;]Lcom/android/server/location/provider/MockableLocationProvider;Lcom/android/server/location/provider/MockableLocationProvider;
+HSPLcom/android/server/location/provider/StationaryThrottlingLocationProvider;->onThrottlingChangedLocked(Z)V+]Lcom/android/server/location/provider/AbstractLocationProvider;Lcom/android/server/location/gnss/GnssLocationProvider;,Lcom/android/server/location/provider/proxy/ProxyLocationProvider;]Landroid/location/Location;Landroid/location/Location;]Lcom/android/server/location/provider/LocationProviderController;Lcom/android/server/location/provider/AbstractLocationProvider$Controller;
 HSPLcom/android/server/locksettings/LockSettingsService;->checkDatabaseReadPermission(Ljava/lang/String;I)V+]Lcom/android/server/locksettings/LockSettingsService;Lcom/android/server/locksettings/LockSettingsService;
 HSPLcom/android/server/locksettings/LockSettingsService;->checkPasswordReadPermission()V
 HSPLcom/android/server/locksettings/LockSettingsService;->getSeparateProfileChallengeEnabled(I)Z+]Lcom/android/server/locksettings/LockSettingsService;Lcom/android/server/locksettings/LockSettingsService;
@@ -5277,40 +4016,35 @@
 HSPLcom/android/server/locksettings/LockSettingsStorage$Cache;->hasKeyValue(Ljava/lang/String;I)Z
 HSPLcom/android/server/locksettings/LockSettingsStorage$Cache;->peek(ILjava/lang/String;I)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;Lcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;
 HSPLcom/android/server/locksettings/LockSettingsStorage$Cache;->peekKeyValue(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
-HSPLcom/android/server/locksettings/LockSettingsStorage;->-$$Nest$sfgetDEFAULT()Ljava/lang/Object;
 HSPLcom/android/server/locksettings/LockSettingsStorage;->getBoolean(Ljava/lang/String;ZI)Z+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/locksettings/LockSettingsStorage;Lcom/android/server/locksettings/LockSettingsStorage;
 HSPLcom/android/server/locksettings/LockSettingsStorage;->getString(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;+]Lcom/android/server/locksettings/LockSettingsStorage;Lcom/android/server/locksettings/LockSettingsStorage;
 HSPLcom/android/server/locksettings/LockSettingsStorage;->readKeyValue(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;+]Lcom/android/server/locksettings/LockSettingsStorage$Cache;Lcom/android/server/locksettings/LockSettingsStorage$Cache;]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;]Landroid/database/sqlite/SQLiteOpenHelper;Lcom/android/server/locksettings/LockSettingsStorage$DatabaseHelper;
+HSPLcom/android/server/locksettings/SyntheticPasswordManager$PasswordData;->fromBytes([B)Lcom/android/server/locksettings/SyntheticPasswordManager$PasswordData;
 HPLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->checkRecoverKeyStorePermission()V
-HPLcom/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage;->makeKeystoreEngineGrantString(ILjava/lang/String;)Ljava/lang/String;
 HPLcom/android/server/locksettings/recoverablekeystore/storage/CleanupManager;->registerRecoveryAgent(II)V
-HPLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getStatusForAllKeys(I)Ljava/util/Map;+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/sqlite/SQLiteOpenHelper;Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
-HPLcom/android/server/media/AudioPlayerStateMonitor$AudioManagerPlaybackListener;->onPlaybackConfigChanged(Ljava/util/List;)V+]Landroid/media/AudioPlaybackConfiguration;Landroid/media/AudioPlaybackConfiguration;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr;]Ljava/util/Set;Landroid/util/ArraySet;
-HSPLcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;->getPackageNamesFromPid(I)[Ljava/lang/String;+]Lcom/android/server/SystemService;Lcom/android/server/media/MediaResourceMonitorService;]Landroid/app/ActivityManager;Landroid/app/ActivityManager;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HSPLcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;->notifyResourceGranted(II)V
-HPLcom/android/server/media/MediaRoute2Provider;->getSessionInfos()Ljava/util/List;
+HPLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getStatusForAllKeys(I)Ljava/util/Map;+]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/sqlite/SQLiteOpenHelper;Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper;]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;
+HPLcom/android/server/media/AudioPlayerStateMonitor$AudioManagerPlaybackListener;->onPlaybackConfigChanged(Ljava/util/List;)V+]Landroid/media/AudioPlaybackConfiguration;Landroid/media/AudioPlaybackConfiguration;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr;]Ljava/util/Set;Landroid/util/ArraySet;]Ljava/lang/Integer;Ljava/lang/Integer;
+HSPLcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;->getPackageNamesFromPid(I)[Ljava/lang/String;+]Landroid/app/ActivityManager;Landroid/app/ActivityManager;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/SystemService;Lcom/android/server/media/MediaResourceMonitorService;]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;->notifyResourceGranted(II)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/UserManager;Landroid/os/UserManager;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/media/MediaRoute2ProviderWatcher;->scanPackages()V
-HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->maybeUpdateDiscoveryPreferenceForUid(I)V+]Landroid/os/Handler;Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;]Ljava/util/stream/Stream;Ljava/util/stream/ReferencePipeline$Head;]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->onProviderStateChangedOnHandler(Lcom/android/server/media/MediaRoute2Provider;)V
+HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z
+HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->buildCompositeDiscoveryPreference(Ljava/util/List;ZLjava/util/Set;)Landroid/media/RouteDiscoveryPreference;
+HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->getRouterRecords()Ljava/util/List;
+HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->maybeUpdateDiscoveryPreferenceForUid(I)V+]Ljava/util/stream/Stream;Ljava/util/stream/ReferencePipeline$Head;]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/Handler;Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;
 HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->updateDiscoveryPreferenceOnHandler()V
-HPLcom/android/server/media/MediaRouter2ServiceImpl;->getRemoteSessionsLocked(Landroid/media/IMediaRouter2Manager;)Ljava/util/List;+]Landroid/media/IMediaRouter2Manager;Landroid/media/IMediaRouter2Manager$Stub$Proxy;,Landroid/media/MediaRouter2Manager$Client;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/media/MediaRoute2Provider;Lcom/android/server/media/MediaRoute2ProviderServiceProxy;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HPLcom/android/server/media/MediaRouter2ServiceImpl;->getSystemSessionInfo(Ljava/lang/String;Z)Landroid/media/RoutingSessionInfo;+]Landroid/media/RoutingSessionInfo$Builder;Landroid/media/RoutingSessionInfo$Builder;]Lcom/android/server/media/MediaRoute2Provider;Lcom/android/server/media/SystemMediaRoute2Provider;]Lcom/android/server/media/SystemMediaRoute2Provider;Lcom/android/server/media/SystemMediaRoute2Provider;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/media/MediaRouter2ServiceImpl;Lcom/android/server/media/MediaRouter2ServiceImpl;
-HSPLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$new$0(II)V+]Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HPLcom/android/server/media/MediaRouter2ServiceImpl;->getRemoteSessionsLocked(Landroid/media/IMediaRouter2Manager;)Ljava/util/List;+]Landroid/media/IMediaRouter2Manager;Landroid/media/MediaRouter2Manager$Client;,Landroid/media/IMediaRouter2Manager$Stub$Proxy;]Lcom/android/server/media/MediaRoute2Provider;Lcom/android/server/media/MediaRoute2ProviderServiceProxy;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/List;Ljava/util/ArrayList;
+HPLcom/android/server/media/MediaRouter2ServiceImpl;->getSystemSessionInfo(Ljava/lang/String;Z)Landroid/media/RoutingSessionInfo;+]Lcom/android/server/media/MediaRoute2Provider;Lcom/android/server/media/SystemMediaRoute2Provider;]Lcom/android/server/media/SystemMediaRoute2Provider;Lcom/android/server/media/SystemMediaRoute2Provider;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/media/RoutingSessionInfo$Builder;Landroid/media/RoutingSessionInfo$Builder;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/media/MediaRouter2ServiceImpl;Lcom/android/server/media/MediaRouter2ServiceImpl;
+HSPLcom/android/server/media/MediaRouter2ServiceImpl;->lambda$new$0(II)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;
 HSPLcom/android/server/media/MediaRouter2ServiceImpl;->onPermissionsChanged(I)V
-HPLcom/android/server/media/MediaRouterService$AudioPlayerActiveStateChangedListenerImpl;->onAudioPlayerActiveStateChanged(Landroid/media/AudioPlaybackConfiguration;Z)V
-HPLcom/android/server/media/MediaRouterService;->getSystemSessionInfoForPackage(Ljava/lang/String;)Landroid/media/RoutingSessionInfo;+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/media/MediaRouter2ServiceImpl;Lcom/android/server/media/MediaRouter2ServiceImpl;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HPLcom/android/server/media/MediaSessionRecord;->getStateWithUpdatedPosition()Landroid/media/session/PlaybackState;+]Landroid/media/session/PlaybackState$Builder;Landroid/media/session/PlaybackState$Builder;]Landroid/media/session/PlaybackState;Landroid/media/session/PlaybackState;
-HPLcom/android/server/media/MediaSessionStack;->findMediaButtonSession(I)Lcom/android/server/media/MediaSessionRecordImpl;+]Lcom/android/server/media/MediaSessionRecordImpl;Lcom/android/server/media/MediaSessionRecord;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/media/AudioPlayerStateMonitor;Lcom/android/server/media/AudioPlayerStateMonitor;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HPLcom/android/server/media/MediaSessionStack;->updateMediaButtonSessionIfNeeded()V
-HPLcom/android/server/media/RemoteDisplayProviderWatcher;->scanPackages()V
-HPLcom/android/server/media/SystemMediaRoute2Provider;->generateDeviceRouteSelectedSessionInfo(Ljava/lang/String;)Landroid/media/RoutingSessionInfo;+]Landroid/media/RoutingSessionInfo$Builder;Landroid/media/RoutingSessionInfo$Builder;]Lcom/android/server/media/BluetoothRouteController;Lcom/android/server/media/LegacyBluetoothRouteController;]Landroid/media/MediaRoute2Info;Landroid/media/MediaRoute2Info;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/media/DeviceRouteController;Lcom/android/server/media/LegacyDeviceRouteController;
+HPLcom/android/server/media/MediaRouterService;->getSystemSessionInfoForPackage(Ljava/lang/String;)Landroid/media/RoutingSessionInfo;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/media/MediaRouter2ServiceImpl;Lcom/android/server/media/MediaRouter2ServiceImpl;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/lang/Object;Ljava/lang/String;]Landroid/os/UserHandle;Landroid/os/UserHandle;
+HSPLcom/android/server/media/RemoteDisplayProviderWatcher;->scanPackages()V
+HPLcom/android/server/media/SystemMediaRoute2Provider;->generateDeviceRouteSelectedSessionInfo(Ljava/lang/String;)Landroid/media/RoutingSessionInfo;+]Lcom/android/server/media/BluetoothRouteController;Lcom/android/server/media/BluetoothRouteController$NoOpBluetoothRouteController;]Ljava/util/List;Ljava/util/ImmutableCollections$ListN;,Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ImmutableCollections$ListItr;,Ljava/util/Collections$EmptyIterator;]Lcom/android/server/media/DeviceRouteController;Lcom/android/server/media/AudioManagerRouteController;
 HPLcom/android/server/net/NetworkManagementService$$ExternalSyntheticLambda1;-><init>(IZJI)V
 HPLcom/android/server/net/NetworkManagementService$$ExternalSyntheticLambda1;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
 HSPLcom/android/server/net/NetworkManagementService$Dependencies;->getCallingUid()I
 HSPLcom/android/server/net/NetworkManagementService$LocalService;->isNetworkRestrictedForUid(I)Z
 HPLcom/android/server/net/NetworkManagementService$NetdUnsolicitedEventListener$$ExternalSyntheticLambda3;-><init>(Lcom/android/server/net/NetworkManagementService$NetdUnsolicitedEventListener;IZJI)V
 HPLcom/android/server/net/NetworkManagementService$NetdUnsolicitedEventListener$$ExternalSyntheticLambda3;->run()V
-HPLcom/android/server/net/NetworkManagementService$NetdUnsolicitedEventListener;->lambda$onInterfaceClassActivityChanged$0(IZJI)V
 HSPLcom/android/server/net/NetworkManagementService$NetdUnsolicitedEventListener;->onInterfaceAddressUpdated(Ljava/lang/String;Ljava/lang/String;II)V
 HPLcom/android/server/net/NetworkManagementService$NetdUnsolicitedEventListener;->onInterfaceClassActivityChanged(ZIJI)V
 HPLcom/android/server/net/NetworkManagementService;->$r8$lambda$k-uAcrtK2YwJmLI08kowLJcRtuU(IZJILandroid/net/INetworkManagementEventObserver;)V
@@ -5321,36 +4055,37 @@
 HSPLcom/android/server/net/NetworkManagementService;->getFirewallRuleName(II)Ljava/lang/String;+]Lcom/android/server/net/NetworkManagementService;Lcom/android/server/net/NetworkManagementService;
 HSPLcom/android/server/net/NetworkManagementService;->getUidFirewallRulesLR(I)Landroid/util/SparseIntArray;
 HSPLcom/android/server/net/NetworkManagementService;->invokeForAllObservers(Lcom/android/server/net/NetworkManagementService$NetworkManagementEventCallback;)V+]Lcom/android/server/net/NetworkManagementService$NetworkManagementEventCallback;megamorphic_types]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
-HSPLcom/android/server/net/NetworkManagementService;->isNetworkRestrictedInternal(I)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/net/NetworkManagementService;Lcom/android/server/net/NetworkManagementService;
-HPLcom/android/server/net/NetworkManagementService;->removeInterfaceQuota(Ljava/lang/String;)V
+HSPLcom/android/server/net/NetworkManagementService;->isNetworkRestrictedInternal(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/net/NetworkManagementService;Lcom/android/server/net/NetworkManagementService;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HPLcom/android/server/net/NetworkManagementService;->removeInterfaceQuota(Ljava/lang/String;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/net/INetd;Landroid/net/INetd$Stub$Proxy;
 HSPLcom/android/server/net/NetworkManagementService;->setFirewallUidRule(III)V+]Lcom/android/server/net/NetworkManagementService;Lcom/android/server/net/NetworkManagementService;
 HSPLcom/android/server/net/NetworkManagementService;->setFirewallUidRuleLocked(III)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;]Lcom/android/server/net/NetworkManagementService;Lcom/android/server/net/NetworkManagementService;
-HPLcom/android/server/net/NetworkManagementService;->setInterfaceQuota(Ljava/lang/String;J)V
+HPLcom/android/server/net/NetworkManagementService;->setInterfaceQuota(Ljava/lang/String;J)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/net/INetd;Landroid/net/INetd$Stub$Proxy;
 HSPLcom/android/server/net/NetworkManagementService;->setUidCleartextNetworkPolicy(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/net/NetworkManagementService$Dependencies;Lcom/android/server/net/NetworkManagementService$Dependencies;
-HSPLcom/android/server/net/NetworkManagementService;->setUidOnMeteredNetworkList(IZZ)V
+HSPLcom/android/server/net/NetworkManagementService;->setUidOnMeteredNetworkList(IZZ)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;
 HSPLcom/android/server/net/NetworkManagementService;->updateFirewallUidRuleLocked(III)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/net/NetworkManagementService;Lcom/android/server/net/NetworkManagementService;
 HSPLcom/android/server/net/NetworkPolicyLogger$Data;->reset()V
-HPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->appIdleStateChanged(IZ)V
-HPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->appIdleWlChanged(IZ)V
+HSPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->appIdleStateChanged(IZ)V
+HPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->appIdleWlChanged(IZ)V+]Lcom/android/server/net/NetworkPolicyLogger$Data;Lcom/android/server/net/NetworkPolicyLogger$Data;]Lcom/android/internal/util/RingBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
 HSPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->meteredAllowlistChanged(IZ)V
-HPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->networkBlocked(IIII)V+]Lcom/android/server/net/NetworkPolicyLogger$Data;Lcom/android/server/net/NetworkPolicyLogger$Data;]Lcom/android/internal/util/RingBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
-HPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->tempPowerSaveWlChanged(IZILjava/lang/String;)V
-HPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->uidFirewallRuleChanged(III)V+]Lcom/android/server/net/NetworkPolicyLogger$Data;Lcom/android/server/net/NetworkPolicyLogger$Data;]Lcom/android/internal/util/RingBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
+HSPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->networkBlocked(IIII)V+]Lcom/android/server/net/NetworkPolicyLogger$Data;Lcom/android/server/net/NetworkPolicyLogger$Data;]Lcom/android/internal/util/RingBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
+HSPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->tempPowerSaveWlChanged(IZILjava/lang/String;)V
+HSPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->uidFirewallRuleChanged(III)V+]Lcom/android/server/net/NetworkPolicyLogger$Data;Lcom/android/server/net/NetworkPolicyLogger$Data;]Lcom/android/internal/util/RingBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
 HSPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->uidStateChanged(IIJI)V+]Lcom/android/server/net/NetworkPolicyLogger$Data;Lcom/android/server/net/NetworkPolicyLogger$Data;]Lcom/android/internal/util/RingBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
-HPLcom/android/server/net/NetworkPolicyLogger;->appIdleStateChanged(IZ)V
-HPLcom/android/server/net/NetworkPolicyLogger;->appIdleWlChanged(IZ)V
+HSPLcom/android/server/net/NetworkPolicyLogger;->appIdleStateChanged(IZ)V
+HPLcom/android/server/net/NetworkPolicyLogger;->appIdleWlChanged(IZ)V+]Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
 HSPLcom/android/server/net/NetworkPolicyLogger;->meteredAllowlistChanged(IZ)V
-HPLcom/android/server/net/NetworkPolicyLogger;->networkBlocked(ILcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;)V+]Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
-HPLcom/android/server/net/NetworkPolicyLogger;->tempPowerSaveWlChanged(IZILjava/lang/String;)V
-HPLcom/android/server/net/NetworkPolicyLogger;->uidFirewallRuleChanged(III)V+]Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
+HSPLcom/android/server/net/NetworkPolicyLogger;->networkBlocked(ILcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;)V+]Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
+HSPLcom/android/server/net/NetworkPolicyLogger;->tempPowerSaveWlChanged(IZILjava/lang/String;)V
+HSPLcom/android/server/net/NetworkPolicyLogger;->uidFirewallRuleChanged(III)V+]Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
+HSPLcom/android/server/net/NetworkPolicyLogger;->uidStateChanged(IIJI)V
 HSPLcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda5;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/net/NetworkPolicyManagerService$15;->handleMessage(Landroid/os/Message;)Z+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Long;Ljava/lang/Long;]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
+HSPLcom/android/server/net/NetworkPolicyManagerService$15;->handleMessage(Landroid/os/Message;)Z+]Ljava/lang/Long;Ljava/lang/Long;]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Ljava/lang/Boolean;Ljava/lang/Boolean;
 HSPLcom/android/server/net/NetworkPolicyManagerService$16;->handleMessage(Landroid/os/Message;)Z+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;
 HSPLcom/android/server/net/NetworkPolicyManagerService$4;->isUidStateChangeRelevant(Lcom/android/server/net/NetworkPolicyManagerService$UidStateCallbackInfo;IJI)Z
-HSPLcom/android/server/net/NetworkPolicyManagerService$4;->onUidStateChanged(IIJI)V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/net/NetworkPolicyManagerService$UidStateCallbackInfo;Lcom/android/server/net/NetworkPolicyManagerService$UidStateCallbackInfo;]Lcom/android/server/net/NetworkPolicyManagerService$4;Lcom/android/server/net/NetworkPolicyManagerService$4;
-HPLcom/android/server/net/NetworkPolicyManagerService$Dependencies;->getNetworkTotalBytes(Landroid/net/NetworkTemplate;JJ)J
-HPLcom/android/server/net/NetworkPolicyManagerService$NetPolicyAppIdleStateChangeListener;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
-HSPLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;->onTempPowerSaveWhitelistChange(IZILjava/lang/String;)V
+HSPLcom/android/server/net/NetworkPolicyManagerService$4;->onUidStateChanged(IIJI)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/server/net/NetworkPolicyManagerService$UidStateCallbackInfo;Lcom/android/server/net/NetworkPolicyManagerService$UidStateCallbackInfo;]Lcom/android/server/net/NetworkPolicyManagerService$4;Lcom/android/server/net/NetworkPolicyManagerService$4;
+HPLcom/android/server/net/NetworkPolicyManagerService$Dependencies;->getNetworkTotalBytes(Landroid/net/NetworkTemplate;JJ)J+]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager;]Landroid/app/usage/NetworkStats$Bucket;Landroid/app/usage/NetworkStats$Bucket;
+HSPLcom/android/server/net/NetworkPolicyManagerService$NetPolicyAppIdleStateChangeListener;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+HSPLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;->onTempPowerSaveWhitelistChange(IZILjava/lang/String;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger;
 HPLcom/android/server/net/NetworkPolicyManagerService$StatsCallback;->onThresholdReached(ILjava/lang/String;)V
 HSPLcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;->copyFrom(Lcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;)V
 HSPLcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;->deriveUidRules()I
@@ -5362,48 +4097,50 @@
 HSPLcom/android/server/net/NetworkPolicyManagerService;->-$$Nest$sfgetLOGV()Z
 HSPLcom/android/server/net/NetworkPolicyManagerService;->dispatchBlockedReasonChanged(Landroid/net/INetworkPolicyListener;III)V+]Landroid/net/INetworkPolicyListener;Lcom/android/server/job/controllers/ConnectivityController$4;,Landroid/net/INetworkPolicyListener$Stub$Proxy;,Landroid/net/NetworkPolicyManager$NetworkPolicyCallbackProxy;,Lcom/android/server/connectivity/MultipathPolicyTracker$2;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->dispatchUidRulesChanged(Landroid/net/INetworkPolicyListener;II)V+]Landroid/net/INetworkPolicyListener;Lcom/android/server/job/controllers/ConnectivityController$4;,Landroid/net/INetworkPolicyListener$Stub$Proxy;,Landroid/net/NetworkPolicyManager$NetworkPolicyCallbackProxy;,Lcom/android/server/connectivity/MultipathPolicyTracker$2;
-HSPLcom/android/server/net/NetworkPolicyManagerService;->findRelevantSubIdNL(Landroid/net/NetworkTemplate;)I+]Landroid/net/NetworkTemplate;Landroid/net/NetworkTemplate;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/net/NetworkIdentity$Builder;Landroid/net/NetworkIdentity$Builder;
-HPLcom/android/server/net/NetworkPolicyManagerService;->getNetworkPolicies(Ljava/lang/String;)[Landroid/net/NetworkPolicy;
+HSPLcom/android/server/net/NetworkPolicyManagerService;->findRelevantSubIdNL(Landroid/net/NetworkTemplate;)I+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/net/NetworkTemplate;Landroid/net/NetworkTemplate;]Landroid/net/NetworkIdentity$Builder;Landroid/net/NetworkIdentity$Builder;
+HPLcom/android/server/net/NetworkPolicyManagerService;->getNetworkPolicies(Ljava/lang/String;)[Landroid/net/NetworkPolicy;+]Landroid/net/INetworkPolicyManager$Stub;Lcom/android/server/net/NetworkPolicyManagerService;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->getOrCreateUidBlockedStateForUid(Landroid/util/SparseArray;I)Lcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/net/NetworkPolicyManagerService;->getPrimarySubscriptionPlanLocked(I)Landroid/telephony/SubscriptionPlan;
+HPLcom/android/server/net/NetworkPolicyManagerService;->getPrimarySubscriptionPlanLocked(I)Landroid/telephony/SubscriptionPlan;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/net/NetworkPolicyManagerService;->getRestrictBackgroundStatus(I)I
-HPLcom/android/server/net/NetworkPolicyManagerService;->getRestrictBackgroundStatusInternal(I)I
+HPLcom/android/server/net/NetworkPolicyManagerService;->getRestrictBackgroundStatusInternal(I)I+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;
 HPLcom/android/server/net/NetworkPolicyManagerService;->getSubscriptionPlan(Landroid/net/NetworkTemplate;)Landroid/telephony/SubscriptionPlan;
-HPLcom/android/server/net/NetworkPolicyManagerService;->getUidPolicy(I)I
+HPLcom/android/server/net/NetworkPolicyManagerService;->getUidPolicy(I)I+]Landroid/net/INetworkPolicyManager$Stub;Lcom/android/server/net/NetworkPolicyManagerService;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HSPLcom/android/server/net/NetworkPolicyManagerService;->handleBlockedReasonsChanged(III)V
 HPLcom/android/server/net/NetworkPolicyManagerService;->handleDeviceIdleModeDisabledUL()V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;Lcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
+HSPLcom/android/server/net/NetworkPolicyManagerService;->handleUidChanged(I)V+]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->hasInternetPermissionUL(I)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->isAllowlistedFromLowPowerStandbyUL(I)Z
 HSPLcom/android/server/net/NetworkPolicyManagerService;->isAllowlistedFromPowerSaveExceptIdleUL(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->isAllowlistedFromPowerSaveUL(IZ)Z+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
-HSPLcom/android/server/net/NetworkPolicyManagerService;->isRestrictedByAdminUL(I)Z
-HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidForegroundOnRestrictBackgroundUL(I)Z
+HSPLcom/android/server/net/NetworkPolicyManagerService;->isRestrictedByAdminUL(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Set;Landroid/util/ArraySet;
+HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidForegroundOnRestrictBackgroundUL(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidForegroundOnRestrictPowerUL(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidIdle(II)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;
-HPLcom/android/server/net/NetworkPolicyManagerService;->isUidNetworkingBlocked(IZ)Z+]Lcom/android/internal/util/StatLogger;Lcom/android/internal/util/StatLogger;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidNetworkingBlocked(IZ)Z+]Lcom/android/internal/util/StatLogger;Lcom/android/internal/util/StatLogger;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidTop(I)Z
 HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidValidForAllowlistRulesUL(I)Z+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidValidForDenylistRulesUL(I)Z+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;
-HSPLcom/android/server/net/NetworkPolicyManagerService;->lambda$forEachUid$7(Landroid/util/SparseBooleanArray;ILjava/util/function/IntConsumer;Lcom/android/server/pm/pkg/AndroidPackage;)V
+HSPLcom/android/server/net/NetworkPolicyManagerService;->lambda$forEachUid$7(Landroid/util/SparseBooleanArray;ILjava/util/function/IntConsumer;Lcom/android/server/pm/pkg/AndroidPackage;)V+]Ljava/util/function/IntConsumer;Lcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda3;,Lcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda2;,Lcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda7;,Lcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda0;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->postBlockedReasonsChangedMsg(III)V
 HSPLcom/android/server/net/NetworkPolicyManagerService;->postUidRulesChangedMsg(II)V
-HPLcom/android/server/net/NetworkPolicyManagerService;->setAppIdleWhitelist(IZ)V
-HSPLcom/android/server/net/NetworkPolicyManagerService;->setMeteredNetworkAllowlist(IZ)V
-HPLcom/android/server/net/NetworkPolicyManagerService;->setNetworkTemplateEnabledInner(Landroid/net/NetworkTemplate;Z)V
-HSPLcom/android/server/net/NetworkPolicyManagerService;->setUidFirewallRuleUL(III)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger;]Landroid/os/INetworkManagementService;Lcom/android/server/net/NetworkManagementService;
-HPLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkEnabledNL()V
-HPLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkRulesNL()V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Landroid/os/Handler;Landroid/os/Handler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/net/Network;Landroid/net/Network;]Landroid/net/NetworkTemplate;Landroid/net/NetworkTemplate;]Landroid/net/NetworkIdentity$Builder;Landroid/net/NetworkIdentity$Builder;]Landroid/net/NetworkStateSnapshot;Landroid/net/NetworkStateSnapshot;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Landroid/os/Message;Landroid/os/Message;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;,Landroid/net/NetworkPolicyManager$1;]Ljava/time/ZonedDateTime;Ljava/time/ZonedDateTime;]Landroid/net/NetworkPolicy;Landroid/net/NetworkPolicy;]Ljava/time/Instant;Ljava/time/Instant;
-HSPLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkStats(IZ)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager;
-HSPLcom/android/server/net/NetworkPolicyManagerService;->updateNotificationsNL()V
-HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForAppIdleUL(II)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
-HPLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForDeviceIdleUL(I)V
-HPLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForRestrictPowerUL(I)V
+HPLcom/android/server/net/NetworkPolicyManagerService;->setAppIdleWhitelist(IZ)V+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger;]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/net/NetworkPolicyManagerService;->setMeteredNetworkAllowlist(IZ)V+]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger;]Landroid/os/INetworkManagementService;Lcom/android/server/net/NetworkManagementService;
+HPLcom/android/server/net/NetworkPolicyManagerService;->setNetworkTemplateEnabledInner(Landroid/net/NetworkTemplate;Z)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/telephony/TelephonyManager;Landroid/telephony/TelephonyManager;
+HSPLcom/android/server/net/NetworkPolicyManagerService;->setUidFirewallRuleUL(III)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger;]Landroid/os/INetworkManagementService;Lcom/android/server/net/NetworkManagementService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HPLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkEnabledNL()V+]Landroid/net/NetworkPolicy;Landroid/net/NetworkPolicy;]Lcom/android/internal/util/StatLogger;Lcom/android/internal/util/StatLogger;
+HPLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkRulesNL()V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Landroid/os/Handler;Landroid/os/Handler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/net/Network;Landroid/net/Network;]Landroid/net/NetworkTemplate;Landroid/net/NetworkTemplate;]Ljava/time/ZonedDateTime;Ljava/time/ZonedDateTime;]Landroid/net/NetworkIdentity$Builder;Landroid/net/NetworkIdentity$Builder;]Landroid/net/NetworkStateSnapshot;Landroid/net/NetworkStateSnapshot;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Landroid/net/NetworkPolicy;Landroid/net/NetworkPolicy;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Ljava/time/Instant;Ljava/time/Instant;]Landroid/os/Message;Landroid/os/Message;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;,Landroid/net/NetworkPolicyManager$1;]Landroid/telephony/SubscriptionPlan;Landroid/telephony/SubscriptionPlan;
+HSPLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkStats(IZ)V+]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/net/NetworkPolicyManagerService;->updateNotificationsNL()V+]Ljava/time/Clock;Landroid/os/BestClock;]Landroid/net/NetworkPolicy;Landroid/net/NetworkPolicy;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForAppIdleUL(II)V+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForDeviceIdleUL(I)V
+HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForRestrictPowerUL(I)V
 HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForDataUsageRestrictionsUL(I)V
-HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForDataUsageRestrictionsULInner(I)V
+HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForDataUsageRestrictionsULInner(I)V+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(I)V+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(II)V+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(IZ)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;
 HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsULInner(IZ)V+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Lcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;Lcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;
-HPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForTempAllowlistChangeUL(I)V
+HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForTempAllowlistChangeUL(I)V+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/UserManager;Landroid/os/UserManager;
 HPLcom/android/server/net/NetworkPolicyManagerService;->updateSubscriptions()V
 HSPLcom/android/server/net/NetworkPolicyManagerService;->updateUidStateUL(IIJI)Z+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/net/watchlist/DigestUtils;->getSha256Hash(Ljava/io/InputStream;)[B+]Ljava/io/InputStream;Ljava/io/FileInputStream;]Ljava/security/MessageDigest;Ljava/security/MessageDigest$Delegate;
@@ -5418,40 +4155,40 @@
 HPLcom/android/server/notification/BadgeExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/app/Notification$BubbleMetadata;Landroid/app/Notification$BubbleMetadata;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper;
 HPLcom/android/server/notification/BubbleExtractor;->canPresentAsBubble(Lcom/android/server/notification/NotificationRecord;)Z+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;]Landroid/app/Notification$BubbleMetadata;Landroid/app/Notification$BubbleMetadata;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/BubbleExtractor;Lcom/android/server/notification/BubbleExtractor;
 HPLcom/android/server/notification/BubbleExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/app/ActivityManager;Landroid/app/ActivityManager;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/BubbleExtractor;Lcom/android/server/notification/BubbleExtractor;]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;
-HSPLcom/android/server/notification/CalendarTracker;->checkEvent(Landroid/service/notification/ZenModeConfig$EventInfo;J)Lcom/android/server/notification/CalendarTracker$CheckEventResult;+]Landroid/net/Uri$Builder;Landroid/net/Uri$Builder;]Lcom/android/server/notification/CalendarTracker;Lcom/android/server/notification/CalendarTracker;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/Context;Lcom/android/server/notification/EventConditionProvider;]Landroid/database/Cursor;Landroid/content/ContentResolver$CursorWrapperInner;]Landroid/content/ContentResolver;Landroid/app/ContextImpl$ApplicationContentResolver;]Landroid/net/Uri;Landroid/net/Uri$StringUri;
+HSPLcom/android/server/notification/CalendarTracker;->checkEvent(Landroid/service/notification/ZenModeConfig$EventInfo;J)Lcom/android/server/notification/CalendarTracker$CheckEventResult;+]Landroid/content/Context;Lcom/android/server/notification/EventConditionProvider;,Landroid/app/ContextImpl;]Landroid/database/Cursor;Landroid/content/ContentResolver$CursorWrapperInner;]Landroid/net/Uri;Landroid/net/Uri$StringUri;]Landroid/net/Uri$Builder;Landroid/net/Uri$Builder;]Lcom/android/server/notification/CalendarTracker;Lcom/android/server/notification/CalendarTracker;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/ContentResolver;Landroid/app/ContextImpl$ApplicationContentResolver;
 HSPLcom/android/server/notification/ConditionProviders;->getConfig()Lcom/android/server/notification/ManagedServices$Config;
+HSPLcom/android/server/notification/ConditionProviders;->getRecordLocked(Landroid/net/Uri;Landroid/content/ComponentName;Z)Lcom/android/server/notification/ConditionProviders$ConditionRecord;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;
+HSPLcom/android/server/notification/EventConditionProvider;->evaluateSubscriptionsW()V
 HSPLcom/android/server/notification/FeatureFlagsImpl;->notificationReduceMessagequeueUsage()Z
 HSPLcom/android/server/notification/Flags;->notificationReduceMessagequeueUsage()Z+]Lcom/android/server/notification/FeatureFlags;Lcom/android/server/notification/FeatureFlagsImpl;
 HSPLcom/android/server/notification/Flags;->politeNotifications()Z+]Lcom/android/server/notification/FeatureFlags;Lcom/android/server/notification/FeatureFlagsImpl;
 HSPLcom/android/server/notification/Flags;->refactorAttentionHelper()Z+]Lcom/android/server/notification/FeatureFlags;Lcom/android/server/notification/FeatureFlagsImpl;
 HPLcom/android/server/notification/GlobalSortKeyComparator;->compare(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)I+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/GlobalSortKeyComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I+]Lcom/android/server/notification/GlobalSortKeyComparator;Lcom/android/server/notification/GlobalSortKeyComparator;
-HPLcom/android/server/notification/GroupHelper;->generatePackageKey(ILjava/lang/String;)Ljava/lang/String;
-HPLcom/android/server/notification/GroupHelper;->maybeUngroup(Landroid/service/notification/StatusBarNotification;ZI)V
+HPLcom/android/server/notification/GroupHelper;->generatePackageKey(ILjava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HPLcom/android/server/notification/GroupHelper;->maybeUngroup(Landroid/service/notification/StatusBarNotification;ZI)V+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/GroupHelper$Callback;Lcom/android/server/notification/NotificationManagerService$11;]Lcom/android/server/notification/GroupHelper;Lcom/android/server/notification/GroupHelper;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/List;Ljava/util/ArrayList;
 HPLcom/android/server/notification/ImportanceExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
-HPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->enabledAndUserMatches(I)Z+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/ManagedServices$UserProfiles;Lcom/android/server/notification/ManagedServices$UserProfiles;
-HPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->getService()Landroid/os/IInterface;
+HSPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->enabledAndUserMatches(I)Z+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/ManagedServices$UserProfiles;Lcom/android/server/notification/ManagedServices$UserProfiles;
+HSPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->getService()Landroid/os/IInterface;
 HPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->hashCode()I
-HPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->isEnabledForCurrentProfiles()Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->isEnabledForCurrentProfiles()Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->isPermittedForProfile(I)Z+]Landroid/app/admin/DevicePolicyManager;Landroid/app/admin/DevicePolicyManager;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/notification/ManagedServices$UserProfiles;Lcom/android/server/notification/ManagedServices$UserProfiles;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->isSameUser(I)Z+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
 HPLcom/android/server/notification/ManagedServices$UserProfiles;->isCurrentProfile(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/notification/ManagedServices$UserProfiles;->isProfileUser(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
 HPLcom/android/server/notification/ManagedServices;->-$$Nest$fgetmEnabledServicesForCurrentProfiles(Lcom/android/server/notification/ManagedServices;)Landroid/util/ArraySet;
-HPLcom/android/server/notification/ManagedServices;->-$$Nest$fgetmUserProfiles(Lcom/android/server/notification/ManagedServices;)Lcom/android/server/notification/ManagedServices$UserProfiles;
 HSPLcom/android/server/notification/ManagedServices;->checkServiceTokenLocked(Landroid/os/IInterface;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;+]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;,Lcom/android/server/notification/ConditionProviders;,Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
 HSPLcom/android/server/notification/ManagedServices;->getServiceFromTokenLocked(Landroid/os/IInterface;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;+]Landroid/os/IInterface;Landroid/service/notification/ConditionProviderService$Provider;,Landroid/service/notification/INotificationListener$Stub$Proxy;,Landroid/service/notification/NotificationListenerService$NotificationListenerWrapper;,Landroid/service/notification/IConditionProvider$Stub$Proxy;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/notification/ManagedServices;->getServices()Ljava/util/List;
-HPLcom/android/server/notification/ManagedServices;->isPackageAllowed(Ljava/lang/String;I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
+HPLcom/android/server/notification/ManagedServices;->isPackageAllowed(Ljava/lang/String;I)Z+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HSPLcom/android/server/notification/ManagedServices;->isPackageOrComponentAllowed(Ljava/lang/String;I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/notification/ManagedServices;->isSameUser(Landroid/os/IInterface;I)Z+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
-HPLcom/android/server/notification/ManagedServices;->isServiceTokenValidLocked(Landroid/os/IInterface;)Z+]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
-HSPLcom/android/server/notification/ManagedServices;->writeDefaults(Lcom/android/modules/utils/TypedXmlSerializer;)V
-HSPLcom/android/server/notification/ManagedServices;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;ZI)V
+HSPLcom/android/server/notification/ManagedServices;->isServiceTokenValidLocked(Landroid/os/IInterface;)Z+]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
+HSPLcom/android/server/notification/ManagedServices;->writeDefaults(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;,Lcom/android/internal/util/ArtBinaryXmlSerializer;
+HSPLcom/android/server/notification/ManagedServices;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;ZI)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;,Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;,Lcom/android/server/notification/ConditionProviders;,Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
 HPLcom/android/server/notification/NotificationAdjustmentExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
-HPLcom/android/server/notification/NotificationAttentionHelper$Signals;-><init>(ZI)V
 HPLcom/android/server/notification/NotificationAttentionHelper;->buzzBeepBlinkLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationAttentionHelper$Signals;)I
-HPLcom/android/server/notification/NotificationAttentionHelper;->isNotificationForCurrentUser(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationAttentionHelper$Signals;)Z
+HPLcom/android/server/notification/NotificationAttentionHelper;->isNotificationForCurrentUser(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationAttentionHelper$Signals;)Z+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationAttentionHelper;->shouldMuteNotificationLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationAttentionHelper$Signals;)Z
 HPLcom/android/server/notification/NotificationAttentionHelper;->updateLightsLocked()V
 HPLcom/android/server/notification/NotificationChannelExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper;
@@ -5464,6 +4201,7 @@
 HPLcom/android/server/notification/NotificationComparator;->isImportantOngoing(Lcom/android/server/notification/NotificationRecord;)Z+]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationComparator;Lcom/android/server/notification/NotificationComparator;
 HPLcom/android/server/notification/NotificationComparator;->isImportantPeople(Lcom/android/server/notification/NotificationRecord;)Z+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationComparator;->isSystemMax(Lcom/android/server/notification/NotificationRecord;)Z+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
+HSPLcom/android/server/notification/NotificationHistoryManager;->getUserHistoryAndInitializeIfNeededLocked(I)Lcom/android/server/notification/NotificationHistoryDatabase;
 HPLcom/android/server/notification/NotificationHistoryManager;->lambda$addNotification$0(Landroid/app/NotificationHistory$HistoricalNotification;)V
 HPLcom/android/server/notification/NotificationIntrusivenessExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationManagerService$$ExternalSyntheticLambda14;-><init>(Lcom/android/server/notification/NotificationManagerService;Ljava/util/List;Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Lcom/android/server/notification/NotificationRecordLogger$NotificationReported;)V
@@ -5473,20 +4211,21 @@
 HPLcom/android/server/notification/NotificationManagerService$12;->addToListIfNeeded(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Ljava/util/ArrayList;I)V+]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/notification/NotificationManagerService$12;->applyEnqueuedAdjustmentFromAssistant(Landroid/service/notification/INotificationListener;Landroid/service/notification/Adjustment;)V+]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;]Landroid/service/notification/Adjustment;Landroid/service/notification/Adjustment;]Ljava/lang/Object;Ljava/lang/Integer;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/notification/NotificationManagerService$12;->areNotificationsEnabled(Ljava/lang/String;)Z+]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;
-HPLcom/android/server/notification/NotificationManagerService$12;->areNotificationsEnabledForPackage(Ljava/lang/String;I)Z+]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;
-HPLcom/android/server/notification/NotificationManagerService$12;->canNotifyAsPackage(Ljava/lang/String;Ljava/lang/String;I)Z+]Ljava/lang/Object;Ljava/lang/String;]Landroid/os/UserHandle;Landroid/os/UserHandle;
+HPLcom/android/server/notification/NotificationManagerService$12;->areNotificationsEnabledForPackage(Ljava/lang/String;I)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;]Lcom/android/server/SystemService;Lcom/android/server/notification/NotificationManagerService;]Landroid/content/Context;Landroid/app/ContextImpl;
+HPLcom/android/server/notification/NotificationManagerService$12;->canNotifyAsPackage(Ljava/lang/String;Ljava/lang/String;I)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Lcom/android/server/SystemService;Lcom/android/server/notification/NotificationManagerService;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/UserHandle;Landroid/os/UserHandle;
 HSPLcom/android/server/notification/NotificationManagerService$12;->cancelNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
-HPLcom/android/server/notification/NotificationManagerService$12;->createNotificationChannelGroups(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
-HSPLcom/android/server/notification/NotificationManagerService$12;->createNotificationChannels(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
-HSPLcom/android/server/notification/NotificationManagerService$12;->createNotificationChannelsImpl(Ljava/lang/String;ILandroid/content/pm/ParceledListSlice;I)V
+HSPLcom/android/server/notification/NotificationManagerService$12;->createNotificationChannelGroups(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
+HSPLcom/android/server/notification/NotificationManagerService$12;->createNotificationChannels(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;
+HSPLcom/android/server/notification/NotificationManagerService$12;->createNotificationChannelsImpl(Ljava/lang/String;ILandroid/content/pm/ParceledListSlice;I)V+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Ljava/util/List;Ljava/util/Arrays$ArrayList;,Ljava/util/ArrayList;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/ConditionProviders;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HSPLcom/android/server/notification/NotificationManagerService$12;->deleteNotificationChannel(Ljava/lang/String;Ljava/lang/String;)V
-HPLcom/android/server/notification/NotificationManagerService$12;->enforceSystemOrSystemUIOrSamePackage(Ljava/lang/String;Ljava/lang/String;)V
-HPLcom/android/server/notification/NotificationManagerService$12;->enqueueNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/app/Notification;I)V
+HPLcom/android/server/notification/NotificationManagerService$12;->enforceSystemOrSystemUIOrSamePackage(Ljava/lang/String;Ljava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl;
+HPLcom/android/server/notification/NotificationManagerService$12;->enqueueNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/app/Notification;I)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HPLcom/android/server/notification/NotificationManagerService$12;->getActiveNotificationsFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/notification/NotificationManagerService$12;->getAppActiveNotifications(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;]Ljava/util/Collection;Ljava/util/ArrayList;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/SnoozeHelper;
 HPLcom/android/server/notification/NotificationManagerService$12;->getConversationNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Landroid/app/NotificationChannel;+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
+HPLcom/android/server/notification/NotificationManagerService$12;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel;+]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;
 HPLcom/android/server/notification/NotificationManagerService$12;->getNotificationChannelGroup(Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannelGroup;+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;
-HPLcom/android/server/notification/NotificationManagerService$12;->getNotificationChannelGroups(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/notification/NotificationManagerService$12;->getNotificationChannelGroups(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;
 HPLcom/android/server/notification/NotificationManagerService$12;->getNotificationChannels(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
 HPLcom/android/server/notification/NotificationManagerService$12;->isNotificationListenerAccessGranted(Landroid/content/ComponentName;)Z
 HPLcom/android/server/notification/NotificationManagerService$12;->sanitizeSbn(Ljava/lang/String;ILandroid/service/notification/StatusBarNotification;)Landroid/service/notification/StatusBarNotification;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/lang/Object;Ljava/lang/String;]Landroid/app/Notification;Landroid/app/Notification;
@@ -5494,21 +4233,20 @@
 HSPLcom/android/server/notification/NotificationManagerService$13;->areNotificationsEnabledForPackage(Ljava/lang/String;I)Z
 HSPLcom/android/server/notification/NotificationManagerService$17;-><init>(Lcom/android/server/notification/NotificationManagerService;IILjava/lang/String;IIIILjava/lang/String;J)V
 HSPLcom/android/server/notification/NotificationManagerService$17;->run()V
-HPLcom/android/server/notification/NotificationManagerService$1;->onNotificationVisibilityChanged([Lcom/android/internal/statusbar/NotificationVisibility;[Lcom/android/internal/statusbar/NotificationVisibility;)V
+HPLcom/android/server/notification/NotificationManagerService$1;->onNotificationVisibilityChanged([Lcom/android/internal/statusbar/NotificationVisibility;[Lcom/android/internal/statusbar/NotificationVisibility;)V+]Lcom/android/internal/statusbar/NotificationVisibility;Lcom/android/internal/statusbar/NotificationVisibility;]Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HPLcom/android/server/notification/NotificationManagerService$5;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
 HSPLcom/android/server/notification/NotificationManagerService$CancelNotificationRunnable;-><init>(Lcom/android/server/notification/NotificationManagerService;IILjava/lang/String;Ljava/lang/String;IIIZIIIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;J)V
-HPLcom/android/server/notification/NotificationManagerService$CancelNotificationRunnable;->run()V+]Lcom/android/server/notification/ShortcutHelper;Lcom/android/server/notification/ShortcutHelper;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/NotificationAttentionHelper;Lcom/android/server/notification/NotificationAttentionHelper;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/SnoozeHelper;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/content/ComponentName;Landroid/content/ComponentName;
+HSPLcom/android/server/notification/NotificationManagerService$CancelNotificationRunnable;->run()V+]Lcom/android/server/notification/ShortcutHelper;Lcom/android/server/notification/ShortcutHelper;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/NotificationAttentionHelper;Lcom/android/server/notification/NotificationAttentionHelper;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/SnoozeHelper;
 HPLcom/android/server/notification/NotificationManagerService$EnqueueNotificationRunnable;-><init>(Lcom/android/server/notification/NotificationManagerService;ILcom/android/server/notification/NotificationRecord;ZLcom/android/server/notification/NotificationManagerService$PostNotificationTracker;)V
 HPLcom/android/server/notification/NotificationManagerService$EnqueueNotificationRunnable;->enqueueNotification()Z
 HSPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->getConfig()Lcom/android/server/notification/ManagedServices$Config;
 HPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->isAdjustmentAllowed(Ljava/lang/String;)Z
-HPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->isVerboseLogEnabled()Z
-HPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->notifyAssistantLocked(Landroid/service/notification/StatusBarNotification;IZLjava/util/function/BiConsumer;)V
-HPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->onNotificationEnqueuedLocked(Lcom/android/server/notification/NotificationRecord;)V+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Landroid/service/notification/INotificationListener;Landroid/service/notification/INotificationListener$Stub$Proxy;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/notification/NotificationManagerService$TrimCache;Lcom/android/server/notification/NotificationManagerService$TrimCache;
-HPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->onNotificationsSeenLocked(Ljava/util/ArrayList;)V
+HPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->notifyAssistantLocked(Landroid/service/notification/StatusBarNotification;IZLjava/util/function/BiConsumer;)V+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->onNotificationEnqueuedLocked(Lcom/android/server/notification/NotificationRecord;)V+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Landroid/service/notification/INotificationListener;Landroid/service/notification/INotificationListener$Stub$Proxy;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/notification/NotificationManagerService$TrimCache;Lcom/android/server/notification/NotificationManagerService$TrimCache;
+HPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->onNotificationsSeenLocked(Ljava/util/ArrayList;)V+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners$$ExternalSyntheticLambda2;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners$$ExternalSyntheticLambda2;->run()V
-HPLcom/android/server/notification/NotificationManagerService$NotificationListeners$$ExternalSyntheticLambda4;->run()V
+HSPLcom/android/server/notification/NotificationManagerService$NotificationListeners$$ExternalSyntheticLambda4;->run()V
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners$$ExternalSyntheticLambda5;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;Landroid/service/notification/NotificationStats;I)V
 HSPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->getConfig()Lcom/android/server/notification/ManagedServices$Config;
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->getNotificationListenerFilter(Landroid/util/Pair;)Landroid/service/notification/NotificationListenerFilter;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
@@ -5516,12 +4254,13 @@
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->hasSensitiveContent(Lcom/android/server/notification/NotificationRecord;)Z
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->isListenerPackage(Ljava/lang/String;)Z+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->isUidTrusted(I)Z
-HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyNotificationChannelGroupChanged(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HSPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyNotificationChannelGroupChanged(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/os/Handler;Landroid/os/Handler;
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyPosted(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V+]Landroid/service/notification/INotificationListener;Landroid/service/notification/INotificationListener$Stub$Proxy;,Landroid/service/notification/NotificationListenerService$NotificationListenerWrapper;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyRankingUpdateLocked(Ljava/util/List;)V+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Landroid/os/Handler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyRemoved(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;Landroid/service/notification/NotificationStats;I)V+]Landroid/service/notification/INotificationListener;Landroid/service/notification/INotificationListener$Stub$Proxy;,Landroid/service/notification/NotificationListenerService$NotificationListenerWrapper;
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyRemovedLocked(Lcom/android/server/notification/NotificationRecord;ILandroid/service/notification/NotificationStats;)V+]Landroid/os/Handler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;,Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->prepareNotifyPostedLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;Z)Ljava/util/List;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/notification/NotificationManagerService$TrimCache;Lcom/android/server/notification/NotificationManagerService$TrimCache;
+HSPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->writeExtraXmlTags(Lcom/android/modules/utils/TypedXmlSerializer;)V
 HPLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;-><init>(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;Ljava/lang/String;ILcom/android/server/notification/NotificationManagerService$PostNotificationTracker;)V
 HPLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;->lambda$postNotification$0(Landroid/service/notification/StatusBarNotification;)V
 HPLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;->postNotification()Z
@@ -5535,6 +4274,7 @@
 HPLcom/android/server/notification/NotificationManagerService$StrongAuthTracker;->isInLockDownMode(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HPLcom/android/server/notification/NotificationManagerService$TrimCache;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;)V
 HPLcom/android/server/notification/NotificationManagerService$TrimCache;->ForListener(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/StatusBarNotification;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;
+HPLcom/android/server/notification/NotificationManagerService$WorkerHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HSPLcom/android/server/notification/NotificationManagerService$WorkerHandler;->scheduleCancelNotification(Lcom/android/server/notification/NotificationManagerService$CancelNotificationRunnable;)V+]Landroid/os/Handler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;
 HSPLcom/android/server/notification/NotificationManagerService;->-$$Nest$fgetmListeners(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationListeners;
 HPLcom/android/server/notification/NotificationManagerService;->-$$Nest$fgetmPackageManagerClient(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/PackageManager;
@@ -5543,57 +4283,57 @@
 HSPLcom/android/server/notification/NotificationManagerService;->-$$Nest$mcheckCallerIsSystemOrSameApp(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HPLcom/android/server/notification/NotificationManagerService;->acquireWakeLockForPost(Ljava/lang/String;I)Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;
 HSPLcom/android/server/notification/NotificationManagerService;->areNotificationsEnabledForPackageInt(Ljava/lang/String;I)Z+]Lcom/android/server/notification/PermissionHelper;Lcom/android/server/notification/PermissionHelper;
-HSPLcom/android/server/notification/NotificationManagerService;->cancelAllNotificationsByListLocked(Ljava/util/ArrayList;Ljava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;ZJ)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/notification/NotificationAttentionHelper;Lcom/android/server/notification/NotificationAttentionHelper;]Ljava/lang/Object;Ljava/lang/String;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationManagerService$FlagChecker;Lcom/android/server/notification/NotificationManagerService$17$$ExternalSyntheticLambda0;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Set;Ljava/util/HashSet;
+HSPLcom/android/server/notification/NotificationManagerService;->cancelAllNotificationsByListLocked(Ljava/util/ArrayList;Ljava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;ZJ)V+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationManagerService$FlagChecker;Lcom/android/server/notification/NotificationManagerService$17$$ExternalSyntheticLambda0;,Lcom/android/server/notification/NotificationManagerService$18$$ExternalSyntheticLambda0;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/notification/NotificationAttentionHelper;Lcom/android/server/notification/NotificationAttentionHelper;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Set;Ljava/util/HashSet;
 HSPLcom/android/server/notification/NotificationManagerService;->cancelNotification(IILjava/lang/String;Ljava/lang/String;IIIZIIIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V+]Lcom/android/server/notification/NotificationManagerService$WorkerHandler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;
-HSPLcom/android/server/notification/NotificationManagerService;->cancelNotification(IILjava/lang/String;Ljava/lang/String;IIIZIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+HSPLcom/android/server/notification/NotificationManagerService;->cancelNotification(IILjava/lang/String;Ljava/lang/String;IIIZIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HSPLcom/android/server/notification/NotificationManagerService;->cancelNotificationInternal(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;III)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HPLcom/android/server/notification/NotificationManagerService;->cancelNotificationLocked(Lcom/android/server/notification/NotificationRecord;ZIIIZLjava/lang/String;J)V
 HSPLcom/android/server/notification/NotificationManagerService;->checkCallerIsSameApp(Ljava/lang/String;)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HSPLcom/android/server/notification/NotificationManagerService;->checkCallerIsSameApp(Ljava/lang/String;II)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/notification/NotificationManagerService;->checkCallerIsSystemOrSameApp(Ljava/lang/String;)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
-HPLcom/android/server/notification/NotificationManagerService;->checkDisqualifyingFeatures(IIILjava/lang/String;Lcom/android/server/notification/NotificationRecord;ZZ)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Ljava/lang/Object;Ljava/lang/String;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/Notification$Action;Landroid/app/Notification$Action;]Landroid/app/Notification$BubbleMetadata;Landroid/app/Notification$BubbleMetadata;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/SnoozeHelper;
+HPLcom/android/server/notification/NotificationManagerService;->checkDisqualifyingFeatures(IIILjava/lang/String;Lcom/android/server/notification/NotificationRecord;ZZ)Z+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Landroid/app/Notification$Action;Landroid/app/Notification$Action;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Ljava/lang/Object;Ljava/lang/String;]Landroid/app/Notification$BubbleMetadata;Landroid/app/Notification$BubbleMetadata;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/SnoozeHelper;
 HPLcom/android/server/notification/NotificationManagerService;->checkRemoteViews(Ljava/lang/String;Ljava/lang/String;ILandroid/app/Notification;)V
-HPLcom/android/server/notification/NotificationManagerService;->checkRestrictedCategories(Landroid/app/Notification;)V
-HPLcom/android/server/notification/NotificationManagerService;->createNotificationChannelGroup(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;ZZ)V
-HPLcom/android/server/notification/NotificationManagerService;->enqueueNotificationInternal(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;IZLcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Z)Z+]Landroid/os/Handler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/notification/ShortcutHelper;Lcom/android/server/notification/ShortcutHelper;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/SystemService;Lcom/android/server/notification/NotificationManagerService;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Ljava/util/Set;Ljava/util/ImmutableCollections$SetN;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/job/JobSchedulerInternal;Lcom/android/server/job/JobSchedulerService$LocalService;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/PermissionHelper;Lcom/android/server/notification/PermissionHelper;]Landroid/app/ActivityManager;Landroid/app/ActivityManager;]Ljava/lang/Object;Ljava/lang/String;
-HPLcom/android/server/notification/NotificationManagerService;->enqueueNotificationInternal(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;IZZ)V
+HPLcom/android/server/notification/NotificationManagerService;->checkRestrictedCategories(Landroid/app/Notification;)V+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
+HSPLcom/android/server/notification/NotificationManagerService;->createNotificationChannelGroup(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;ZZ)V
+HPLcom/android/server/notification/NotificationManagerService;->enqueueNotificationInternal(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;IZLcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Z)Z+]Landroid/os/Handler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Lcom/android/server/notification/ShortcutHelper;Lcom/android/server/notification/ShortcutHelper;]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/SystemService;Lcom/android/server/notification/NotificationManagerService;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Ljava/util/Set;Ljava/util/ImmutableCollections$SetN;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/job/JobSchedulerInternal;Lcom/android/server/job/JobSchedulerService$LocalService;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/PermissionHelper;Lcom/android/server/notification/PermissionHelper;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HPLcom/android/server/notification/NotificationManagerService;->enqueueNotificationInternal(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;IZZ)V+]Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;
 HPLcom/android/server/notification/NotificationManagerService;->findNotificationByListLocked(Ljava/util/ArrayList;Ljava/lang/String;)Lcom/android/server/notification/NotificationRecord;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/notification/NotificationManagerService;->findNotificationByListLocked(Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/notification/NotificationManagerService;->findNotificationLocked(Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
-HPLcom/android/server/notification/NotificationManagerService;->fixNotification(Landroid/app/Notification;Ljava/lang/String;Ljava/lang/String;IIILandroid/app/ActivityManagerInternal$ServiceNotificationPolicy;Z)V+]Lcom/android/server/SystemService;Lcom/android/server/notification/NotificationManagerService;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
+HSPLcom/android/server/notification/NotificationManagerService;->findNotificationByListLocked(Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/notification/NotificationManagerService;->findNotificationLocked(Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
+HPLcom/android/server/notification/NotificationManagerService;->fixNotification(Landroid/app/Notification;Ljava/lang/String;Ljava/lang/String;IIILandroid/app/ActivityManagerInternal$ServiceNotificationPolicy;Z)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/Notification$Builder;Landroid/app/Notification$Builder;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/app/Notification$CallStyle;Landroid/app/Notification$CallStyle;]Lcom/android/server/SystemService;Lcom/android/server/notification/NotificationManagerService;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Landroid/content/AttributionSource$Builder;Landroid/content/AttributionSource$Builder;
 HPLcom/android/server/notification/NotificationManagerService;->getGroupInstanceId(Ljava/lang/String;)Lcom/android/internal/logging/InstanceId;
 HPLcom/android/server/notification/NotificationManagerService;->getHistoryText(Landroid/app/Notification;)Ljava/lang/String;
-HPLcom/android/server/notification/NotificationManagerService;->getNotificationChannelRestoreDeleted(Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel;
+HPLcom/android/server/notification/NotificationManagerService;->getNotificationChannelRestoreDeleted(Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel;+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;
 HPLcom/android/server/notification/NotificationManagerService;->getNotificationCount(Ljava/lang/String;IILjava/lang/String;)I+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/notification/NotificationManagerService;->getNotificationTimeoutPendingIntent(Lcom/android/server/notification/NotificationRecord;I)Landroid/app/PendingIntent;
 HPLcom/android/server/notification/NotificationManagerService;->getPackageImportanceWithIdentity(Ljava/lang/String;)I
 HPLcom/android/server/notification/NotificationManagerService;->grantUriPermission(Landroid/os/IBinder;Landroid/net/Uri;ILjava/lang/String;I)V+]Ljava/lang/Object;Ljava/lang/String;]Landroid/app/IUriGrantsManager;Lcom/android/server/uri/UriGrantsManagerService;]Landroid/net/Uri;Landroid/net/Uri$StringUri;,Landroid/net/Uri$HierarchicalUri;
 HPLcom/android/server/notification/NotificationManagerService;->handleGroupedNotificationLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;II)V
-HPLcom/android/server/notification/NotificationManagerService;->handleRankingReconsideration(Landroid/os/Message;)V
-HSPLcom/android/server/notification/NotificationManagerService;->handleRankingSort()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecordExtractorData;Lcom/android/server/notification/NotificationRecordExtractorData;]Lcom/android/server/notification/RankingHelper;Lcom/android/server/notification/RankingHelper;]Lcom/android/server/notification/NotificationManagerService$WorkerHandler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Lcom/android/server/notification/NotificationRecordLogger;Lcom/android/server/notification/NotificationRecordLoggerImpl;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/notification/NotificationManagerService;->handleRankingReconsideration(Landroid/os/Message;)V+]Lcom/android/server/notification/RankingHelper;Lcom/android/server/notification/RankingHelper;]Lcom/android/server/notification/NotificationManagerService$WorkerHandler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Lcom/android/server/notification/RankingReconsideration;Lcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;,Lcom/android/server/notification/NotificationIntrusivenessExtractor$1;
+HSPLcom/android/server/notification/NotificationManagerService;->handleRankingSort()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/NotificationRecordExtractorData;Lcom/android/server/notification/NotificationRecordExtractorData;]Lcom/android/server/notification/RankingHelper;Lcom/android/server/notification/RankingHelper;]Lcom/android/server/notification/NotificationManagerService$WorkerHandler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecordLogger;Lcom/android/server/notification/NotificationRecordLoggerImpl;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HSPLcom/android/server/notification/NotificationManagerService;->handleSavePolicyFile()V
-HPLcom/android/server/notification/NotificationManagerService;->hasCompanionDevice(Ljava/lang/String;ILjava/util/Set;)Z
+HPLcom/android/server/notification/NotificationManagerService;->hasAutoGroupSummaryLocked(Landroid/service/notification/StatusBarNotification;)Z
+HPLcom/android/server/notification/NotificationManagerService;->hasCompanionDevice(Ljava/lang/String;ILjava/util/Set;)Z+]Landroid/companion/ICompanionDeviceManager;Lcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;]Ljava/util/List;Ljava/util/Collections$EmptyList;]Ljava/util/Iterator;Ljava/util/Collections$EmptyIterator;
 HPLcom/android/server/notification/NotificationManagerService;->indexOfNotificationLocked(Ljava/lang/String;)I+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/notification/NotificationManagerService;->isCallNotification(Ljava/lang/String;I)Z
 HPLcom/android/server/notification/NotificationManagerService;->isCallerInstantApp(II)Z
 HSPLcom/android/server/notification/NotificationManagerService;->isCallerSameApp(Ljava/lang/String;II)Z+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HSPLcom/android/server/notification/NotificationManagerService;->isCallerSystemOrPhone()Z+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
-HSPLcom/android/server/notification/NotificationManagerService;->isCallerSystemOrSystemUi()Z
+HSPLcom/android/server/notification/NotificationManagerService;->isCallerSystemOrSystemUi()Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HSPLcom/android/server/notification/NotificationManagerService;->isCallingUidSystem()Z
 HPLcom/android/server/notification/NotificationManagerService;->isInLockDownMode(I)Z+]Lcom/android/server/notification/NotificationManagerService$StrongAuthTracker;Lcom/android/server/notification/NotificationManagerService$StrongAuthTracker;
-HPLcom/android/server/notification/NotificationManagerService;->isInteractionVisibleToListener(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)Z+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
+HSPLcom/android/server/notification/NotificationManagerService;->isInteractionVisibleToListener(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)Z+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HPLcom/android/server/notification/NotificationManagerService;->isPackagePausedOrSuspended(Ljava/lang/String;I)Z
 HPLcom/android/server/notification/NotificationManagerService;->isPackageSuspendedForUser(Ljava/lang/String;I)Z
 HPLcom/android/server/notification/NotificationManagerService;->isRecordBlockedLocked(Lcom/android/server/notification/NotificationRecord;)Z+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
-HPLcom/android/server/notification/NotificationManagerService;->isServiceTokenValid(Landroid/os/IInterface;)Z+]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
+HSPLcom/android/server/notification/NotificationManagerService;->isServiceTokenValid(Landroid/os/IInterface;)Z+]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
 HSPLcom/android/server/notification/NotificationManagerService;->isUidSystemOrPhone(I)Z
 HPLcom/android/server/notification/NotificationManagerService;->isVisibleToListener(Landroid/service/notification/StatusBarNotification;ILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;
 HPLcom/android/server/notification/NotificationManagerService;->isVisuallyInterruptive(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)Z
-HPLcom/android/server/notification/NotificationManagerService;->lambda$acquireWakeLockForPost$8(Ljava/lang/String;I)Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;
-HPLcom/android/server/notification/NotificationManagerService;->lambda$notifyListenersPostedAndLogLocked$13(Ljava/util/List;Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Lcom/android/server/notification/NotificationRecordLogger$NotificationReported;)V+]Lcom/android/server/notification/NotificationRecordLogger;Lcom/android/server/notification/NotificationRecordLoggerImpl;]Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/lang/Runnable;Lcom/android/server/notification/NotificationManagerService$NotificationListeners$$ExternalSyntheticLambda2;,Lcom/android/server/notification/NotificationManagerService$NotificationListeners$$ExternalSyntheticLambda1;
+HPLcom/android/server/notification/NotificationManagerService;->lambda$acquireWakeLockForPost$8(Ljava/lang/String;I)Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;+]Lcom/android/server/notification/NotificationManagerService$PostNotificationTrackerFactory;Lcom/android/server/notification/NotificationManagerService$10;
+HPLcom/android/server/notification/NotificationManagerService;->lambda$notifyListenersPostedAndLogLocked$13(Ljava/util/List;Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Lcom/android/server/notification/NotificationRecordLogger$NotificationReported;)V+]Lcom/android/server/notification/NotificationRecordLogger;Lcom/android/server/notification/NotificationRecordLoggerImpl;]Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/lang/Runnable;Lcom/android/server/notification/NotificationManagerService$NotificationListeners$$ExternalSyntheticLambda2;
 HSPLcom/android/server/notification/NotificationManagerService;->makeRankingUpdateLocked(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;+]Landroid/service/notification/NotificationListenerService$Ranking;Landroid/service/notification/NotificationListenerService$Ranking;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/notification/NotificationManagerService;->maybeRecordInterruptionLocked(Lcom/android/server/notification/NotificationRecord;)V
-HPLcom/android/server/notification/NotificationManagerService;->maybeReportForegroundServiceUpdate(Lcom/android/server/notification/NotificationRecord;Z)V
+HPLcom/android/server/notification/NotificationManagerService;->maybeRecordInterruptionLocked(Lcom/android/server/notification/NotificationRecord;)V+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationHistoryManager;Lcom/android/server/notification/NotificationHistoryManager;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;
 HPLcom/android/server/notification/NotificationManagerService;->notificationMatchesUserId(Lcom/android/server/notification/NotificationRecord;IZ)Z+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationManagerService;->notifyListenersPostedAndLogLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Lcom/android/server/notification/NotificationRecordLogger$NotificationReported;)V
 HPLcom/android/server/notification/NotificationManagerService;->removeFromNotificationListsLocked(Lcom/android/server/notification/NotificationRecord;)Z
@@ -5601,33 +4341,31 @@
 HPLcom/android/server/notification/NotificationManagerService;->updateUriPermissions(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;IZ)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;
 HSPLcom/android/server/notification/NotificationManagerService;->writePolicyXml(Ljava/io/OutputStream;ZI)V
 HPLcom/android/server/notification/NotificationRecord$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V
-HPLcom/android/server/notification/NotificationRecord;-><init>(Landroid/content/Context;Landroid/service/notification/StatusBarNotification;Landroid/app/NotificationChannel;)V
+HPLcom/android/server/notification/NotificationRecord;-><init>(Landroid/content/Context;Landroid/service/notification/StatusBarNotification;Landroid/app/NotificationChannel;)V+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HPLcom/android/server/notification/NotificationRecord;->addAdjustment(Landroid/service/notification/Adjustment;)V
 HPLcom/android/server/notification/NotificationRecord;->applyAdjustments()V+]Landroid/service/notification/Adjustment;Landroid/service/notification/Adjustment;]Ljava/lang/Object;Ljava/util/ArrayList;]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HPLcom/android/server/notification/NotificationRecord;->calculateAttributes()Landroid/media/AudioAttributes;
-HPLcom/android/server/notification/NotificationRecord;->calculateGrantableUris()V
+HPLcom/android/server/notification/NotificationRecord;->calculateAttributes()Landroid/media/AudioAttributes;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;
+HPLcom/android/server/notification/NotificationRecord;->calculateGrantableUris()V+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/app/Notification;Landroid/app/Notification;
 HPLcom/android/server/notification/NotificationRecord;->calculateImportance()V+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationRecord;->calculateInitialImportance()I+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
-HPLcom/android/server/notification/NotificationRecord;->calculateLights()Lcom/android/server/notification/NotificationRecord$Light;
-HPLcom/android/server/notification/NotificationRecord;->calculateRankingTimeMs(J)J
-HPLcom/android/server/notification/NotificationRecord;->calculateSound()Landroid/net/Uri;
+HPLcom/android/server/notification/NotificationRecord;->calculateLights()Lcom/android/server/notification/NotificationRecord$Light;+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/Context;Landroid/app/ContextImpl;
+HPLcom/android/server/notification/NotificationRecord;->calculateRankingTimeMs(J)J+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;
+HPLcom/android/server/notification/NotificationRecord;->calculateSound()Landroid/net/Uri;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
 HPLcom/android/server/notification/NotificationRecord;->calculateUserSentiment()V+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
-HPLcom/android/server/notification/NotificationRecord;->calculateVibration()Landroid/os/VibrationEffect;
+HPLcom/android/server/notification/NotificationRecord;->calculateVibration()Landroid/os/VibrationEffect;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;
 HPLcom/android/server/notification/NotificationRecord;->canBubble()Z
 HPLcom/android/server/notification/NotificationRecord;->canShowBadge()Z
 HPLcom/android/server/notification/NotificationRecord;->copyRankingInformation(Lcom/android/server/notification/NotificationRecord;)V
 HPLcom/android/server/notification/NotificationRecord;->getChannel()Landroid/app/NotificationChannel;
 HPLcom/android/server/notification/NotificationRecord;->getContactAffinity()F
 HPLcom/android/server/notification/NotificationRecord;->getFlags()I+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
-HPLcom/android/server/notification/NotificationRecord;->getFreshnessMs(J)I
 HPLcom/android/server/notification/NotificationRecord;->getGlobalSortKey()Ljava/lang/String;
-HPLcom/android/server/notification/NotificationRecord;->getGrantableUris()Landroid/util/ArraySet;
 HPLcom/android/server/notification/NotificationRecord;->getGroupKey()Ljava/lang/String;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationRecord;->getImportance()I
 HPLcom/android/server/notification/NotificationRecord;->getImportanceExplanation()Ljava/lang/CharSequence;
 HPLcom/android/server/notification/NotificationRecord;->getKey()Ljava/lang/String;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationRecord;->getLastAudiblyAlertedMs()J
-HPLcom/android/server/notification/NotificationRecord;->getLogMaker(J)Landroid/metrics/LogMaker;
+HPLcom/android/server/notification/NotificationRecord;->getLogMaker(J)Landroid/metrics/LogMaker;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationRecord;->getNotification()Landroid/app/Notification;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationRecord;->getNotificationType()I+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationRecord;->getPackagePriority()I
@@ -5648,29 +4386,28 @@
 HPLcom/android/server/notification/NotificationRecord;->getUserId()I+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationRecord;->getUserSentiment()I
 HPLcom/android/server/notification/NotificationRecord;->hasSensitiveContent()Z
-HPLcom/android/server/notification/NotificationRecord;->hasUndecoratedRemoteView()Z
-HPLcom/android/server/notification/NotificationRecord;->isCategory(Ljava/lang/String;)Z+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
+HPLcom/android/server/notification/NotificationRecord;->hasUndecoratedRemoteView()Z+]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationRecord;->isConversation()Z+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;
 HPLcom/android/server/notification/NotificationRecord;->isHidden()Z
 HPLcom/android/server/notification/NotificationRecord;->isIntercepted()Z
 HPLcom/android/server/notification/NotificationRecord;->isPreChannelsNotification()Z
-HPLcom/android/server/notification/NotificationRecord;->isRecentlyIntrusive()Z
 HPLcom/android/server/notification/NotificationRecord;->isTextChanged()Z
 HPLcom/android/server/notification/NotificationRecord;->setIntercepted(Z)Z
-HPLcom/android/server/notification/NotificationRecord;->setInterruptive(Z)V
-HPLcom/android/server/notification/NotificationRecord;->setVisibility(ZIILcom/android/server/notification/NotificationRecordLogger;)V
-HPLcom/android/server/notification/NotificationRecord;->updateNotificationChannel(Landroid/app/NotificationChannel;)V
-HPLcom/android/server/notification/NotificationRecord;->visitGrantableUri(Landroid/net/Uri;ZZ)V+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;
+HPLcom/android/server/notification/NotificationRecord;->setInterruptive(Z)V+]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;
+HPLcom/android/server/notification/NotificationRecord;->setIsAppImportanceLocked(Z)V
+HPLcom/android/server/notification/NotificationRecord;->setVisibility(ZIILcom/android/server/notification/NotificationRecordLogger;)V+]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Lcom/android/server/notification/NotificationRecordLogger;Lcom/android/server/notification/NotificationRecordLoggerImpl;]Lcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;Lcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;
+HPLcom/android/server/notification/NotificationRecord;->updateNotificationChannel(Landroid/app/NotificationChannel;)V+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
+HPLcom/android/server/notification/NotificationRecord;->visitGrantableUri(Landroid/net/Uri;ZZ)V+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Landroid/net/Uri;Landroid/net/Uri$StringUri;,Landroid/net/Uri$HierarchicalUri;
 HPLcom/android/server/notification/NotificationRecordExtractorData;-><init>(IIZZZLandroid/app/NotificationChannel;Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/util/ArrayList;Ljava/util/ArrayList;IFZIZ)V
-HPLcom/android/server/notification/NotificationRecordExtractorData;->hasDiffForRankingLocked(Lcom/android/server/notification/NotificationRecord;I)Z+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Landroid/app/Notification;Landroid/app/Notification;
-HPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;-><init>(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)V
+HPLcom/android/server/notification/NotificationRecordExtractorData;->hasDiffForRankingLocked(Lcom/android/server/notification/NotificationRecord;I)Z+]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getInstanceId()I
 HPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->getNotificationIdHash()I
 HPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->shouldLogReported(I)Z
 HPLcom/android/server/notification/NotificationRecordLogger$NotificationReported;-><init>(Lcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;Lcom/android/server/notification/NotificationRecordLogger$NotificationReportedEvent;IILcom/android/internal/logging/InstanceId;)V
 HPLcom/android/server/notification/NotificationRecordLogger;->getLoggingImportance(Lcom/android/server/notification/NotificationRecord;)I
+HPLcom/android/server/notification/NotificationRecordLogger;->isForegroundService(Lcom/android/server/notification/NotificationRecord;)Z
 HPLcom/android/server/notification/NotificationRecordLogger;->prepareToLogNotificationPosted(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;IILcom/android/internal/logging/InstanceId;)Lcom/android/server/notification/NotificationRecordLogger$NotificationReported;
-HPLcom/android/server/notification/NotificationRecordLoggerImpl;->log(Lcom/android/internal/logging/UiEventLogger$UiEventEnum;Lcom/android/server/notification/NotificationRecord;)V
+HPLcom/android/server/notification/NotificationRecordLoggerImpl;->log(Lcom/android/internal/logging/UiEventLogger$UiEventEnum;Lcom/android/server/notification/NotificationRecord;)V+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/internal/logging/UiEventLogger;Lcom/android/internal/logging/UiEventLoggerImpl;
 HPLcom/android/server/notification/NotificationRecordLoggerImpl;->writeNotificationReportedAtom(Lcom/android/server/notification/NotificationRecordLogger$NotificationReported;)V
 HPLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->countApiUse(Lcom/android/server/notification/NotificationRecord;)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;Lcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;
 HPLcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;->increment(I)V
@@ -5688,18 +4425,18 @@
 HPLcom/android/server/notification/NotificationUsageStats;->releaseAggregatedStatsLocked([Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;)V+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;
 HPLcom/android/server/notification/PermissionHelper;->getAppsRequestingPermission(I)Ljava/util/Set;+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/Set;Ljava/util/HashSet;]Lcom/android/server/notification/PermissionHelper;Lcom/android/server/notification/PermissionHelper;
 HSPLcom/android/server/notification/PermissionHelper;->hasPermission(I)Z+]Landroid/content/Context;Landroid/app/ContextImpl;
-HPLcom/android/server/notification/PermissionHelper;->hasRequestedPermission(Ljava/lang/String;Ljava/lang/String;I)Z
-HSPLcom/android/server/notification/PermissionHelper;->isPermissionFixed(Ljava/lang/String;I)Z
-HPLcom/android/server/notification/PermissionHelper;->isPermissionUserSet(Ljava/lang/String;I)Z
+HPLcom/android/server/notification/PermissionHelper;->hasRequestedPermission(Ljava/lang/String;Ljava/lang/String;I)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
+HSPLcom/android/server/notification/PermissionHelper;->isPermissionFixed(Ljava/lang/String;I)Z+]Landroid/permission/IPermissionManager;Lcom/android/server/pm/permission/PermissionManagerService;
+HPLcom/android/server/notification/PermissionHelper;->isPermissionUserSet(Ljava/lang/String;I)Z+]Landroid/permission/IPermissionManager;Lcom/android/server/pm/permission/PermissionManagerService;
 HSPLcom/android/server/notification/PreferencesHelper$PackagePreferences;-><init>()V
-HPLcom/android/server/notification/PreferencesHelper;->badgingEnabled(Landroid/os/UserHandle;)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/os/UserHandle;Landroid/os/UserHandle;
-HPLcom/android/server/notification/PreferencesHelper;->bubblesEnabled(Landroid/os/UserHandle;)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/os/UserHandle;Landroid/os/UserHandle;
+HPLcom/android/server/notification/PreferencesHelper;->badgingEnabled(Landroid/os/UserHandle;)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/content/Context;Landroid/app/ContextImpl;
+HPLcom/android/server/notification/PreferencesHelper;->bubblesEnabled(Landroid/os/UserHandle;)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/notification/PreferencesHelper;->canShowBadge(Ljava/lang/String;I)Z+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;
-HPLcom/android/server/notification/PreferencesHelper;->canShowNotificationsOnLockscreen(I)Z
-HPLcom/android/server/notification/PreferencesHelper;->canShowPrivateNotificationsOnLockScreen(I)Z
-HSPLcom/android/server/notification/PreferencesHelper;->createNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;ZZIZ)Z
-HPLcom/android/server/notification/PreferencesHelper;->createNotificationChannelGroup(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;ZIZ)V
-HPLcom/android/server/notification/PreferencesHelper;->findConversationChannel(Lcom/android/server/notification/PreferencesHelper$PackagePreferences;Ljava/lang/String;Ljava/lang/String;Z)Landroid/app/NotificationChannel;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
+HPLcom/android/server/notification/PreferencesHelper;->canShowNotificationsOnLockscreen(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
+HPLcom/android/server/notification/PreferencesHelper;->canShowPrivateNotificationsOnLockScreen(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
+HSPLcom/android/server/notification/PreferencesHelper;->createDefaultChannelIfNeededLocked(Lcom/android/server/notification/PreferencesHelper$PackagePreferences;)Z
+HSPLcom/android/server/notification/PreferencesHelper;->createNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;ZZIZ)Z+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Lcom/android/server/notification/NotificationChannelLogger;Lcom/android/server/notification/NotificationChannelLoggerImpl;]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap;
+HSPLcom/android/server/notification/PreferencesHelper;->createNotificationChannelGroup(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;ZIZ)V
 HPLcom/android/server/notification/PreferencesHelper;->getBubblePreference(Ljava/lang/String;I)I+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;
 HSPLcom/android/server/notification/PreferencesHelper;->getConversationNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZZ)Landroid/app/NotificationChannel;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;
 HPLcom/android/server/notification/PreferencesHelper;->getGroupForChannel(Ljava/lang/String;ILjava/lang/String;)Landroid/app/NotificationChannelGroup;
@@ -5707,308 +4444,168 @@
 HPLcom/android/server/notification/PreferencesHelper;->getNotificationChannelGroups(Ljava/lang/String;IZZZZLjava/util/Set;)Landroid/content/pm/ParceledListSlice;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Ljava/util/Collection;Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/concurrent/ConcurrentHashMap;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;]Landroid/app/NotificationChannelGroup;Landroid/app/NotificationChannelGroup;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Set;Ljava/util/HashSet;
 HSPLcom/android/server/notification/PreferencesHelper;->getNotificationChannels(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/notification/PreferencesHelper;->getOrCreatePackagePreferencesLocked(Ljava/lang/String;I)Lcom/android/server/notification/PreferencesHelper$PackagePreferences;+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;
-HSPLcom/android/server/notification/PreferencesHelper;->getOrCreatePackagePreferencesLocked(Ljava/lang/String;IIIIIZI)Lcom/android/server/notification/PreferencesHelper$PackagePreferences;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/notification/PreferencesHelper;->getOrCreatePackagePreferencesLocked(Ljava/lang/String;IIIIIZI)Lcom/android/server/notification/PreferencesHelper$PackagePreferences;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;
 HSPLcom/android/server/notification/PreferencesHelper;->getPackagePreferencesLocked(Ljava/lang/String;I)Lcom/android/server/notification/PreferencesHelper$PackagePreferences;
 HPLcom/android/server/notification/PreferencesHelper;->hasSentValidMsg(Ljava/lang/String;I)Z
-HPLcom/android/server/notification/PreferencesHelper;->hasUserDemotedInvalidMsgApp(Ljava/lang/String;I)Z
+HPLcom/android/server/notification/PreferencesHelper;->hasUserDemotedInvalidMsgApp(Ljava/lang/String;I)Z+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;
 HSPLcom/android/server/notification/PreferencesHelper;->isGroupBlocked(Ljava/lang/String;ILjava/lang/String;)Z+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap;]Landroid/app/NotificationChannelGroup;Landroid/app/NotificationChannelGroup;
 HPLcom/android/server/notification/PreferencesHelper;->isInInvalidMsgState(Ljava/lang/String;I)Z
 HSPLcom/android/server/notification/PreferencesHelper;->packagePreferencesKey(Ljava/lang/String;I)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HPLcom/android/server/notification/PreferencesHelper;->pullPackagePreferencesStats(Ljava/util/List;Landroid/util/ArrayMap;)V
+HPLcom/android/server/notification/PreferencesHelper;->pullPackagePreferencesStats(Ljava/util/List;Landroid/util/ArrayMap;)V+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;
 HSPLcom/android/server/notification/PreferencesHelper;->readXml(Lcom/android/modules/utils/TypedXmlPullParser;ZI)V
 HSPLcom/android/server/notification/PreferencesHelper;->restoreChannel(Lcom/android/modules/utils/TypedXmlPullParser;ZLcom/android/server/notification/PreferencesHelper$PackagePreferences;)V
 HSPLcom/android/server/notification/PreferencesHelper;->restorePackage(Lcom/android/modules/utils/TypedXmlPullParser;ZILjava/lang/String;ZZ)V
 HSPLcom/android/server/notification/PreferencesHelper;->shouldHaveDefaultChannel(Lcom/android/server/notification/PreferencesHelper$PackagePreferences;)Z
-HSPLcom/android/server/notification/PreferencesHelper;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;ZI)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;,Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap;,Landroid/util/ArrayMap;]Landroid/app/NotificationChannelGroup;Landroid/app/NotificationChannelGroup;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;,Landroid/util/MapCollections$ArrayIterator;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Lcom/android/server/notification/PermissionHelper;Lcom/android/server/notification/PermissionHelper;
+HSPLcom/android/server/notification/PreferencesHelper;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;ZI)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;,Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;,Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap;,Landroid/util/ArrayMap;]Landroid/app/NotificationChannelGroup;Landroid/app/NotificationChannelGroup;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;,Landroid/util/MapCollections$ArrayIterator;]Lcom/android/server/notification/PermissionHelper;Lcom/android/server/notification/PermissionHelper;
 HPLcom/android/server/notification/PriorityExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/RankingHelper;->extractSignals(Lcom/android/server/notification/NotificationRecord;)V+]Lcom/android/server/notification/RankingHandler;Lcom/android/server/notification/NotificationManagerService$RankingHandlerWorker;]Lcom/android/server/notification/NotificationSignalExtractor;megamorphic_types
-HPLcom/android/server/notification/RankingHelper;->indexOf(Ljava/util/ArrayList;Lcom/android/server/notification/NotificationRecord;)I
 HSPLcom/android/server/notification/RankingHelper;->sort(Ljava/util/ArrayList;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/notification/RankingReconsideration;-><init>(Ljava/lang/String;J)V
 HPLcom/android/server/notification/RateEstimator;->getInterarrivalEstimate(J)D+]Ljava/lang/Long;Ljava/lang/Long;
 HPLcom/android/server/notification/RateEstimator;->update(J)V
-HPLcom/android/server/notification/ShortcutHelper;->getValidShortcutInfo(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ShortcutInfo;
-HPLcom/android/server/notification/ShortcutHelper;->maybeListenForShortcutChangesForBubbles(Lcom/android/server/notification/NotificationRecord;ZLandroid/os/Handler;)V
-HPLcom/android/server/notification/SnoozeHelper;->cancel(ILjava/lang/String;Ljava/lang/String;I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;
+HPLcom/android/server/notification/ShortcutHelper;->getValidShortcutInfo(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ShortcutInfo;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/UserManager;Landroid/os/UserManager;]Landroid/content/pm/LauncherApps;Landroid/content/pm/LauncherApps;
+HPLcom/android/server/notification/ShortcutHelper;->maybeListenForShortcutChangesForBubbles(Lcom/android/server/notification/NotificationRecord;ZLandroid/os/Handler;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/Notification$BubbleMetadata;Landroid/app/Notification$BubbleMetadata;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
+HSPLcom/android/server/notification/SnoozeHelper;->cancel(ILjava/lang/String;Ljava/lang/String;I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;
 HPLcom/android/server/notification/SnoozeHelper;->getSnoozeContextForUnpostedNotification(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 HPLcom/android/server/notification/SnoozeHelper;->getSnoozeTimeForUnpostedNotification(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/Long;
-HSPLcom/android/server/notification/SnoozeHelper;->getSnoozed(ILjava/lang/String;)Ljava/util/Collection;
+HSPLcom/android/server/notification/SnoozeHelper;->getSnoozed(ILjava/lang/String;)Ljava/util/Collection;+]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
 HPLcom/android/server/notification/SnoozeHelper;->isSnoozed(ILjava/lang/String;Ljava/lang/String;)Z
 HSPLcom/android/server/notification/SnoozeHelper;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;)V
 HPLcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;->work()V
 HPLcom/android/server/notification/ValidateNotificationPeople;->getCacheKey(ILjava/lang/String;)Ljava/lang/String;
-HPLcom/android/server/notification/ValidateNotificationPeople;->getContextAsUser(Landroid/os/UserHandle;)Landroid/content/Context;+]Landroid/os/UserHandle;Landroid/os/UserHandle;]Ljava/util/Map;Landroid/util/ArrayMap;
+HPLcom/android/server/notification/ValidateNotificationPeople;->getContextAsUser(Landroid/os/UserHandle;)Landroid/content/Context;+]Landroid/os/UserHandle;Landroid/os/UserHandle;]Ljava/util/Map;Landroid/util/ArrayMap;]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/notification/ValidateNotificationPeople;->getExtraPeople(Landroid/os/Bundle;)[Ljava/lang/String;
 HPLcom/android/server/notification/ValidateNotificationPeople;->getExtraPeopleForKey(Landroid/os/Bundle;Ljava/lang/String;)[Ljava/lang/String;+]Landroid/app/Person;Landroid/app/Person;]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/notification/ValidateNotificationPeople;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/ValidateNotificationPeople;Lcom/android/server/notification/ValidateNotificationPeople;
 HPLcom/android/server/notification/ValidateNotificationPeople;->validatePeople(Landroid/content/Context;Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Lcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;Lcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/ValidateNotificationPeople;Lcom/android/server/notification/ValidateNotificationPeople;
 HPLcom/android/server/notification/ValidateNotificationPeople;->validatePeople(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;Ljava/util/List;[FLandroid/util/ArraySet;)Lcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;+]Landroid/util/LruCache;Landroid/util/LruCache;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/LinkedList;Ljava/util/LinkedList;]Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/ArraySet;
-HSPLcom/android/server/notification/VibratorHelper;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/notification/VibratorHelper;-><init>(Landroid/content/Context;)V+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/notification/VibratorHelper;->getFloatArray(Landroid/content/res/Resources;I)[F+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;
 HSPLcom/android/server/notification/VibratorHelper;->getLongArray(Landroid/content/res/Resources;II[J)[J+]Landroid/content/res/Resources;Landroid/content/res/Resources;
 HPLcom/android/server/notification/VisibilityExtractor;->adminAllowsKeyguardFeature(II)Z+]Landroid/app/admin/DevicePolicyManager;Landroid/app/admin/DevicePolicyManager;
 HPLcom/android/server/notification/VisibilityExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/notification/VisibilityExtractor;Lcom/android/server/notification/VisibilityExtractor;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper;
 HSPLcom/android/server/notification/ZenLog;->append(ILjava/lang/String;)V
-HSPLcom/android/server/notification/ZenModeConditions;->evaluateRule(Landroid/service/notification/ZenModeConfig$ZenRule;Landroid/util/ArraySet;Landroid/content/ComponentName;Z)V
+HSPLcom/android/server/notification/ZenModeConditions;->evaluateConfig(Landroid/service/notification/ZenModeConfig;Landroid/content/ComponentName;Z)V
+HSPLcom/android/server/notification/ZenModeConditions;->evaluateRule(Landroid/service/notification/ZenModeConfig$ZenRule;Landroid/util/ArraySet;Landroid/content/ComponentName;Z)V+]Lcom/android/server/notification/ConditionProviders;Lcom/android/server/notification/ConditionProviders;]Lcom/android/server/notification/SystemConditionProviderService;Lcom/android/server/notification/EventConditionProvider;,Lcom/android/server/notification/ScheduleConditionProvider;,Lcom/android/server/notification/CountdownConditionProvider;]Ljava/lang/Iterable;Landroid/util/ArraySet;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
 HPLcom/android/server/notification/ZenModeExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/ZenModeHelper;Lcom/android/server/notification/ZenModeHelper;
-HPLcom/android/server/notification/ZenModeFiltering;->isCall(Lcom/android/server/notification/NotificationRecord;)Z
-HPLcom/android/server/notification/ZenModeFiltering;->isDefaultPhoneApp(Ljava/lang/String;)Z+]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HPLcom/android/server/notification/ZenModeFiltering;->shouldIntercept(ILandroid/app/NotificationManager$Policy;Lcom/android/server/notification/NotificationRecord;)Z+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/lang/Object;Ljava/lang/String;]Landroid/app/NotificationManager$Policy;Landroid/app/NotificationManager$Policy;]Lcom/android/server/notification/ZenModeFiltering;Lcom/android/server/notification/ZenModeFiltering;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
+HPLcom/android/server/notification/ZenModeFiltering;->isCall(Lcom/android/server/notification/NotificationRecord;)Z+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/ZenModeFiltering;Lcom/android/server/notification/ZenModeFiltering;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;
 HPLcom/android/server/notification/ZenModeHelper;->shouldIntercept(Lcom/android/server/notification/NotificationRecord;)Z+]Lcom/android/server/notification/ZenModeFiltering;Lcom/android/server/notification/ZenModeFiltering;
-HSPLcom/android/server/om/OverlayActorEnforcer$ActorState;->$values()[Lcom/android/server/om/OverlayActorEnforcer$ActorState;
-HSPLcom/android/server/om/OverlayActorEnforcer$ActorState;-><clinit>()V
-HSPLcom/android/server/om/OverlayActorEnforcer$ActorState;-><init>(Ljava/lang/String;I)V
+HSPLcom/android/server/om/IdmapDaemon$Connection;->close()V
+HSPLcom/android/server/om/IdmapDaemon;->connect()Lcom/android/server/om/IdmapDaemon$Connection;
 HSPLcom/android/server/om/OverlayActorEnforcer;->getPackageNameForActor(Ljava/lang/String;Ljava/util/Map;)Landroid/util/Pair;
+HSPLcom/android/server/om/OverlayManagerService$PackageManagerHelperImpl;->addPackageUser(Lcom/android/server/pm/pkg/PackageState;I)Lcom/android/server/pm/pkg/PackageState;
 HSPLcom/android/server/om/OverlayManagerService;->updatePackageManagerLocked(Ljava/util/Collection;I)Ljava/util/List;
+HSPLcom/android/server/om/OverlayManagerServiceImpl;->updatePackageOverlays(Lcom/android/server/pm/pkg/AndroidPackage;II)Ljava/util/Set;
 HSPLcom/android/server/om/OverlayManagerServiceImpl;->updateState(Landroid/content/om/CriticalOverlayInfo;II)Z
 HSPLcom/android/server/om/OverlayManagerSettings$$ExternalSyntheticLambda12;->test(Ljava/lang/Object;)Z
+HSPLcom/android/server/om/OverlayManagerSettings$Serializer;->persistRow(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)V
 HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-$$Nest$fgetmOverlay(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Landroid/content/om/OverlayIdentifier;
 HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-$$Nest$fgetmTargetPackageName(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
 HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-$$Nest$fgetmUserId(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
 HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-$$Nest$mgetUserId(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I+]Lcom/android/server/om/OverlayManagerSettings$SettingsItem;Lcom/android/server/om/OverlayManagerSettings$SettingsItem;
+HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->getOverlayInfo()Landroid/content/om/OverlayInfo;
 HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->getUserId()I
-HSPLcom/android/server/om/OverlayManagerSettings;->$r8$lambda$UJI7EebfpGNorHvdj0-tvz36dZM(ILcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
 HSPLcom/android/server/om/OverlayManagerSettings;->forEachMatching(ILjava/lang/String;Ljava/lang/String;Ljava/util/function/Consumer;)V+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/function/Consumer;Lcom/android/server/om/OverlayManagerServiceImpl$$ExternalSyntheticLambda1;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/om/OverlayManagerSettings;->lambda$selectWhereUser$10(ILcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
 HSPLcom/android/server/om/OverlayManagerSettings;->select(Landroid/content/om/OverlayIdentifier;I)I+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/content/om/OverlayIdentifier;Landroid/content/om/OverlayIdentifier;
-HSPLcom/android/server/om/OverlayReferenceMapper$1;-><init>(Lcom/android/server/om/OverlayReferenceMapper;)V
 HSPLcom/android/server/om/OverlayReferenceMapper$1;->getActorPkg(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/om/OverlayReferenceMapper$1;->getTargetToOverlayables(Lcom/android/server/pm/pkg/AndroidPackage;)Ljava/util/Map;+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
-HSPLcom/android/server/om/OverlayReferenceMapper;-><init>(ZLcom/android/server/om/OverlayReferenceMapper$Provider;)V
 HSPLcom/android/server/om/OverlayReferenceMapper;->addOverlay(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/util/Map;Ljava/util/Collection;)V
 HSPLcom/android/server/om/OverlayReferenceMapper;->addOverlayToMap(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Collection;)V
 HSPLcom/android/server/om/OverlayReferenceMapper;->addPkg(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/util/Map;)Landroid/util/ArraySet;
 HSPLcom/android/server/om/OverlayReferenceMapper;->addTarget(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/util/Map;Ljava/util/Collection;)V+]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Map;Ljava/util/HashMap;,Landroid/util/ArrayMap;,Ljava/util/Collections$EmptyMap;,Ljava/util/Collections$UnmodifiableMap;]Lcom/android/server/om/OverlayReferenceMapper$Provider;Lcom/android/server/om/OverlayReferenceMapper$1;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/Set;Ljava/util/HashSet;,Ljava/util/Collections$UnmodifiableSet;
 HSPLcom/android/server/om/OverlayReferenceMapper;->addTargetToMap(Ljava/lang/String;Ljava/lang/String;Ljava/util/Collection;)V
-HPLcom/android/server/om/OverlayReferenceMapper;->ensureMapBuilt()V
-HPLcom/android/server/om/OverlayReferenceMapper;->isValidActor(Ljava/lang/String;Ljava/lang/String;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/om/OverlayReferenceMapper;Lcom/android/server/om/OverlayReferenceMapper;
+HSPLcom/android/server/om/OverlayReferenceMapper;->ensureMapBuilt()V
+HSPLcom/android/server/om/OverlayReferenceMapper;->isValidActor(Ljava/lang/String;Ljava/lang/String;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/om/OverlayReferenceMapper;Lcom/android/server/om/OverlayReferenceMapper;
 HSPLcom/android/server/om/OverlayReferenceMapper;->removeOverlay(Ljava/lang/String;Ljava/util/Collection;)V
 HSPLcom/android/server/om/OverlayReferenceMapper;->removeTarget(Ljava/lang/String;Ljava/util/Collection;)V
-HSPLcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;-><init>(Landroid/content/Context;)V
 HPLcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;->getSerialForPackage(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/os/DeviceIdentifiersPolicyService;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/os/DeviceIdentifiersPolicyService;->onStart()V
 HSPLcom/android/server/os/NativeTombstoneManager$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/os/NativeTombstoneManager;IIILjava/util/ArrayList;ILjava/util/concurrent/CompletableFuture;)V
-HSPLcom/android/server/os/NativeTombstoneManager$TombstoneFile;->parse(Landroid/os/ParcelFileDescriptor;)Ljava/util/Optional;+]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/ParcelFileDescriptor;Landroid/os/ParcelFileDescriptor;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/Object;Ljava/lang/String;
+HSPLcom/android/server/os/NativeTombstoneManager$TombstoneFile;->parse(Landroid/os/ParcelFileDescriptor;)Ljava/util/Optional;+]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/Object;Ljava/lang/String;]Landroid/os/ParcelFileDescriptor;Landroid/os/ParcelFileDescriptor;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/os/NativeTombstoneManager;->collectTombstones(Ljava/util/ArrayList;III)V
 HSPLcom/android/server/pdb/PersistentDataBlockService;->computeDigestLocked([B)[B+]Ljava/io/DataInputStream;Ljava/io/DataInputStream;]Ljava/security/MessageDigest;Ljava/security/MessageDigest$Delegate;
-HPLcom/android/server/people/data/AbstractProtoDiskReadWriter;->scheduleSave(Ljava/lang/String;Ljava/lang/Object;)V
+HPLcom/android/server/people/data/AbstractProtoDiskReadWriter;->scheduleSave(Ljava/lang/String;Ljava/lang/Object;)V+]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/concurrent/ScheduledExecutorService;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService;
 HPLcom/android/server/people/data/ConversationInfo$Builder;-><init>(Lcom/android/server/people/data/ConversationInfo;)V
 HPLcom/android/server/people/data/ConversationInfo;-><init>(Lcom/android/server/people/data/ConversationInfo$Builder;)V
+HPLcom/android/server/people/data/ConversationStore;->getConversationInfosProtoDiskReadWriter()Lcom/android/server/people/data/ConversationStore$ConversationInfosProtoDiskReadWriter;
 HPLcom/android/server/people/data/ConversationStore;->scheduleUpdateConversationsOnDisk()V
 HPLcom/android/server/people/data/ConversationStore;->updateConversationsInMemory(Lcom/android/server/people/data/ConversationInfo;)V
 HPLcom/android/server/people/data/DataManager$NotificationListener$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/people/data/DataManager$NotificationListener;Landroid/service/notification/StatusBarNotification;Ljava/lang/String;)V
-HPLcom/android/server/people/data/DataManager$NotificationListener;->onNotificationPosted(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;)V
+HPLcom/android/server/people/data/DataManager$NotificationListener;->onNotificationPosted(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;)V+]Lcom/android/server/people/data/EventStore;Lcom/android/server/people/data/EventStore;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/service/notification/NotificationListenerService$RankingMap;Landroid/service/notification/NotificationListenerService$RankingMap;]Lcom/android/server/people/data/EventHistoryImpl;Lcom/android/server/people/data/EventHistoryImpl;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/people/data/PackageData;Lcom/android/server/people/data/PackageData;]Lcom/android/server/people/data/ConversationStore;Lcom/android/server/people/data/ConversationStore;]Landroid/service/notification/NotificationListenerService$Ranking;Landroid/service/notification/NotificationListenerService$Ranking;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/people/data/ConversationInfo$Builder;Lcom/android/server/people/data/ConversationInfo$Builder;]Landroid/os/UserHandle;Landroid/os/UserHandle;
 HPLcom/android/server/people/data/DataManager$ShortcutServiceCallback;->lambda$onShortcutsAddedOrUpdated$0(Ljava/lang/String;Landroid/os/UserHandle;Ljava/util/List;)V
 HPLcom/android/server/people/data/DataManager$UsageStatsQueryRunnable$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HPLcom/android/server/people/data/DataManager;->addOrUpdateConversationInfo(Landroid/content/pm/ShortcutInfo;)V
 HPLcom/android/server/people/data/DataManager;->getConversationChannel(Landroid/content/pm/ShortcutInfo;Lcom/android/server/people/data/ConversationInfo;Ljava/lang/String;ILjava/lang/String;)Landroid/app/people/ConversationChannel;
-HPLcom/android/server/people/data/DataManager;->getPackageIfConversationExists(Landroid/service/notification/StatusBarNotification;Ljava/util/function/Consumer;)Lcom/android/server/people/data/PackageData;
-HPLcom/android/server/people/data/DataManager;->getUnlockedUserData(I)Lcom/android/server/people/data/UserData;
+HPLcom/android/server/people/data/DataManager;->getPackageIfConversationExists(Landroid/service/notification/StatusBarNotification;Ljava/util/function/Consumer;)Lcom/android/server/people/data/PackageData;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/people/data/DataManager;Lcom/android/server/people/data/DataManager;]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/people/data/PackageData;Lcom/android/server/people/data/PackageData;]Ljava/util/function/Consumer;Lcom/android/server/people/data/DataManager$NotificationListener$$ExternalSyntheticLambda0;,Lcom/android/server/people/data/DataManager$NotificationListener$$ExternalSyntheticLambda1;]Lcom/android/server/people/data/ConversationStore;Lcom/android/server/people/data/ConversationStore;]Landroid/os/UserHandle;Landroid/os/UserHandle;
+HPLcom/android/server/people/data/DataManager;->getUnlockedUserData(I)Lcom/android/server/people/data/UserData;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/people/data/UserData;Lcom/android/server/people/data/UserData;
 HPLcom/android/server/people/data/EventIndex;->createFourHoursLongTimeSlot(J)Landroid/util/Range;
 HPLcom/android/server/people/data/EventIndex;->createOneDayLongTimeSlot(J)Landroid/util/Range;
-HPLcom/android/server/people/data/EventIndex;->diffTimeSlots(IJJ)I
+HPLcom/android/server/people/data/EventIndex;->diffTimeSlots(IJJ)I+]Ljava/util/function/Function;Lcom/android/server/people/data/EventIndex$$ExternalSyntheticLambda2;,Lcom/android/server/people/data/EventIndex$$ExternalSyntheticLambda3;,Lcom/android/server/people/data/EventIndex$$ExternalSyntheticLambda0;,Lcom/android/server/people/data/EventIndex$$ExternalSyntheticLambda1;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;
 HPLcom/android/server/people/data/EventIndex;->toEpochMilli(Ljava/time/LocalDateTime;)J+]Ljava/time/LocalDateTime;Ljava/time/LocalDateTime;]Ljava/time/Instant;Ljava/time/Instant;]Ljava/time/ZonedDateTime;Ljava/time/ZonedDateTime;
-HPLcom/android/server/people/data/UsageStatsQueryHelper;->querySince(J)Z
-HPLcom/android/server/people/data/UserData;->getPackageData(Ljava/lang/String;)Lcom/android/server/people/data/PackageData;
-HSPLcom/android/server/permission/access/AccessCheckingService;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/permission/access/AccessCheckingService;->getSchemePolicy$frameworks__base__services__permission__android_common__services_permission_pre_jarjar(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/permission/access/SchemePolicy;
-HSPLcom/android/server/permission/access/AccessCheckingService;->onStart()V
-HSPLcom/android/server/permission/access/AccessPersistence$Companion;-><init>()V
-HSPLcom/android/server/permission/access/AccessPersistence$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/AccessPersistence;-><clinit>()V
-HSPLcom/android/server/permission/access/AccessPersistence;-><init>(Lcom/android/server/permission/access/AccessPolicy;)V
-HSPLcom/android/server/permission/access/AccessPolicy$Companion;-><init>()V
-HSPLcom/android/server/permission/access/AccessPolicy$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/AccessPolicy;-><clinit>()V
-HSPLcom/android/server/permission/access/AccessPolicy;-><init>()V
-HSPLcom/android/server/permission/access/AccessPolicy;-><init>(Lcom/android/server/permission/access/immutable/IndexedMap;)V
-HSPLcom/android/server/permission/access/AccessPolicy;->_init_$lambda$1$addPolicy(Lcom/android/server/permission/access/immutable/MutableIndexedMap;Lcom/android/server/permission/access/SchemePolicy;)V
-HSPLcom/android/server/permission/access/AccessPolicy;->getSchemePolicy(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/permission/access/SchemePolicy;
-HSPLcom/android/server/permission/access/SchemePolicy;-><init>()V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpMigration$Companion;-><init>()V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpMigration$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpMigration;-><clinit>()V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpMigration;-><init>()V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpPersistence$Companion;-><init>()V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpPersistence$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpPersistence;-><clinit>()V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpPersistence;-><init>()V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpPolicy$Companion;-><init>()V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpPolicy$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpPolicy;-><clinit>()V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpPolicy;-><init>()V
-HSPLcom/android/server/permission/access/appop/AppIdAppOpPolicy;->getSubjectScheme()Ljava/lang/String;
-HSPLcom/android/server/permission/access/appop/AppIdAppOpUpgrade;-><init>(Lcom/android/server/permission/access/appop/AppIdAppOpPolicy;)V
-HSPLcom/android/server/permission/access/appop/AppOpService;-><init>(Lcom/android/server/permission/access/AccessCheckingService;)V
-HSPLcom/android/server/permission/access/appop/BaseAppOpPersistence$Companion;-><init>()V
-HSPLcom/android/server/permission/access/appop/BaseAppOpPersistence$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/appop/BaseAppOpPersistence;-><clinit>()V
-HSPLcom/android/server/permission/access/appop/BaseAppOpPersistence;-><init>()V
-HSPLcom/android/server/permission/access/appop/BaseAppOpPolicy;-><init>(Lcom/android/server/permission/access/appop/BaseAppOpPersistence;)V
-HSPLcom/android/server/permission/access/appop/BaseAppOpPolicy;->getObjectScheme()Ljava/lang/String;
-HSPLcom/android/server/permission/access/appop/PackageAppOpMigration$Companion;-><init>()V
-HSPLcom/android/server/permission/access/appop/PackageAppOpMigration$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/appop/PackageAppOpMigration;-><clinit>()V
-HSPLcom/android/server/permission/access/appop/PackageAppOpMigration;-><init>()V
-HSPLcom/android/server/permission/access/appop/PackageAppOpPersistence$Companion;-><init>()V
-HSPLcom/android/server/permission/access/appop/PackageAppOpPersistence$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/appop/PackageAppOpPersistence;-><clinit>()V
-HSPLcom/android/server/permission/access/appop/PackageAppOpPersistence;-><init>()V
-HSPLcom/android/server/permission/access/appop/PackageAppOpPolicy$Companion;-><init>()V
-HSPLcom/android/server/permission/access/appop/PackageAppOpPolicy$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/appop/PackageAppOpPolicy;-><clinit>()V
-HSPLcom/android/server/permission/access/appop/PackageAppOpPolicy;-><init>()V
-HSPLcom/android/server/permission/access/appop/PackageAppOpPolicy;->getSubjectScheme()Ljava/lang/String;
-HSPLcom/android/server/permission/access/appop/PackageAppOpUpgrade;-><init>(Lcom/android/server/permission/access/appop/PackageAppOpPolicy;)V
-HSPLcom/android/server/permission/access/collection/ArraySetExtensionsKt;->arraySetOf([Ljava/lang/Object;)Landroid/util/ArraySet;
-HSPLcom/android/server/permission/access/immutable/IndexedListSet;-><init>(Ljava/util/ArrayList;)V
-HSPLcom/android/server/permission/access/immutable/IndexedListSet;-><init>(Ljava/util/ArrayList;Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/immutable/IndexedMap;-><init>(Landroid/util/ArrayMap;)V
+HPLcom/android/server/people/data/UsageStatsQueryHelper;->querySince(J)Z+]Ljava/util/function/Function;Lcom/android/server/people/data/DataManager$UsageStatsQueryRunnable$$ExternalSyntheticLambda0;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Ljava/util/Map;Landroid/util/ArrayMap;]Lcom/android/server/people/data/PackageData;Lcom/android/server/people/data/PackageData;]Lcom/android/server/people/data/ConversationStore;Lcom/android/server/people/data/ConversationStore;
+HPLcom/android/server/people/data/UserData;->getPackageData(Ljava/lang/String;)Lcom/android/server/people/data/PackageData;+]Ljava/util/Map;Landroid/util/ArrayMap;
 HSPLcom/android/server/permission/access/immutable/IndexedMap;-><init>(Landroid/util/ArrayMap;Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/immutable/IndexedMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/server/permission/access/immutable/IndexedMap;->getMap$frameworks__base__services__permission__android_common__services_permission_pre_jarjar()Landroid/util/ArrayMap;
-HSPLcom/android/server/permission/access/immutable/IndexedSet;-><init>(Landroid/util/ArraySet;)V
-HSPLcom/android/server/permission/access/immutable/IndexedSet;-><init>(Landroid/util/ArraySet;Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/immutable/IndexedSetExtensionsKt;->indexedSetOf([Ljava/lang/Object;)Lcom/android/server/permission/access/immutable/IndexedSet;
-HSPLcom/android/server/permission/access/immutable/IntMap;-><init>(Landroid/util/SparseArray;)V
-HSPLcom/android/server/permission/access/immutable/IntMap;-><init>(Landroid/util/SparseArray;Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/immutable/MutableIndexedListSet;-><init>(Ljava/util/ArrayList;)V
+HSPLcom/android/server/permission/access/immutable/IndexedMap;->get(Ljava/lang/Object;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/permission/access/immutable/MutableIndexedListSet;-><init>(Ljava/util/ArrayList;ILcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/immutable/MutableIndexedMap;-><init>(Landroid/util/ArrayMap;)V
-HSPLcom/android/server/permission/access/immutable/MutableIndexedMap;-><init>(Landroid/util/ArrayMap;ILcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
 HSPLcom/android/server/permission/access/immutable/MutableIndexedMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/server/permission/access/immutable/MutableIndexedSet;-><init>(Landroid/util/ArraySet;)V
 HSPLcom/android/server/permission/access/immutable/MutableIndexedSet;-><init>(Landroid/util/ArraySet;ILcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/immutable/MutableIntMap;-><init>(Landroid/util/SparseArray;)V
-HSPLcom/android/server/permission/access/immutable/MutableIntMap;-><init>(Landroid/util/SparseArray;ILcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionMigration$Companion;-><init>()V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionMigration$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionMigration;-><clinit>()V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionMigration;-><init>()V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionPersistence$Companion;-><init>()V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionPersistence$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionPersistence;-><clinit>()V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionPersistence;-><init>()V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy$Companion;-><init>()V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;-><clinit>()V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;-><init>()V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->getObjectScheme()Ljava/lang/String;
-HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->getSubjectScheme()Ljava/lang/String;
-HSPLcom/android/server/permission/access/permission/AppIdPermissionUpgrade$Companion;-><init>()V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionUpgrade$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionUpgrade;-><clinit>()V
-HSPLcom/android/server/permission/access/permission/AppIdPermissionUpgrade;-><init>(Lcom/android/server/permission/access/permission/AppIdPermissionPolicy;)V
-HSPLcom/android/server/permission/access/permission/DevicePermissionPersistence$Companion;-><init>()V
-HSPLcom/android/server/permission/access/permission/DevicePermissionPersistence$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/permission/DevicePermissionPersistence;-><clinit>()V
-HSPLcom/android/server/permission/access/permission/DevicePermissionPersistence;-><init>()V
-HSPLcom/android/server/permission/access/permission/DevicePermissionPolicy$Companion;-><init>()V
-HSPLcom/android/server/permission/access/permission/DevicePermissionPolicy$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/permission/DevicePermissionPolicy;-><clinit>()V
-HSPLcom/android/server/permission/access/permission/DevicePermissionPolicy;-><init>()V
-HSPLcom/android/server/permission/access/permission/DevicePermissionPolicy;->getObjectScheme()Ljava/lang/String;
-HSPLcom/android/server/permission/access/permission/DevicePermissionPolicy;->getSubjectScheme()Ljava/lang/String;
-HSPLcom/android/server/permission/access/permission/PermissionService$Companion;-><init>()V
-HSPLcom/android/server/permission/access/permission/PermissionService$Companion;-><init>(Lcom/android/server/permission/jarjar/kotlin/jvm/internal/DefaultConstructorMarker;)V
-HSPLcom/android/server/permission/access/permission/PermissionService;-><clinit>()V
-HSPLcom/android/server/permission/access/permission/PermissionService;-><init>(Lcom/android/server/permission/access/AccessCheckingService;)V
-HSPLcom/android/server/permission/jarjar/kotlin/collections/ArraysKt;->asList([Ljava/lang/Object;)Ljava/util/List;
-HSPLcom/android/server/permission/jarjar/kotlin/collections/ArraysKt___ArraysJvmKt;->asList([Ljava/lang/Object;)Ljava/util/List;
-HSPLcom/android/server/permission/jarjar/kotlin/collections/ArraysUtilJVM;->asList([Ljava/lang/Object;)Ljava/util/List;
-HSPLcom/android/server/permission/jarjar/kotlin/collections/EmptySet;-><clinit>()V
-HSPLcom/android/server/permission/jarjar/kotlin/collections/EmptySet;-><init>()V
-HSPLcom/android/server/permission/jarjar/kotlin/collections/SetsKt;->emptySet()Ljava/util/Set;
-HSPLcom/android/server/permission/jarjar/kotlin/collections/SetsKt__SetsKt;->emptySet()Ljava/util/Set;
-HSPLcom/android/server/permission/jarjar/kotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V
 HSPLcom/android/server/permission/jarjar/kotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V
-HSPLcom/android/server/permission/jarjar/kotlin/jvm/internal/Intrinsics;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V
-HSPLcom/android/server/pm/AbstractStatsBase;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
-HSPLcom/android/server/pm/ApexManager$1;-><init>()V
-HSPLcom/android/server/pm/ApexManager$1;->create()Lcom/android/server/pm/ApexManager;
-HSPLcom/android/server/pm/ApexManager$1;->create()Ljava/lang/Object;
 HSPLcom/android/server/pm/ApexManager$ActiveApexInfo;-><init>(Landroid/apex/ApexInfo;)V
 HSPLcom/android/server/pm/ApexManager$ActiveApexInfo;-><init>(Ljava/lang/String;Ljava/io/File;Ljava/io/File;ZLjava/io/File;Z)V
-HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;-><init>()V
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->getActiveApexInfos()Ljava/util/List;
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->getActiveApexPackageNameContainingPackage(Ljava/lang/String;)Ljava/lang/String;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->getActivePackageNameForApexModuleName(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->getAllApexInfos()[Landroid/apex/ApexInfo;
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->getApexModuleNameForPackageName(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->getApksInApex(Ljava/lang/String;)Ljava/util/List;
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->getBackingApexFile(Ljava/io/File;)Ljava/io/File;
-HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->notifyScanResult(Ljava/util/List;)V
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->notifyScanResultLocked(Ljava/util/List;)V
 HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->registerApkInApex(Lcom/android/server/pm/pkg/AndroidPackage;)V
-HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->waitForApexService()Landroid/apex/IApexService;
-HSPLcom/android/server/pm/ApexManager$ScanResult;-><init>(Landroid/apex/ApexInfo;Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;)V
-HSPLcom/android/server/pm/ApexManager;-><clinit>()V
-HSPLcom/android/server/pm/ApexManager;-><init>()V
-HSPLcom/android/server/pm/ApexManager;->getInstance()Lcom/android/server/pm/ApexManager;
-HSPLcom/android/server/pm/ApexSystemServiceInfo;-><init>(Ljava/lang/String;Ljava/lang/String;I)V
 HPLcom/android/server/pm/ApkChecksums;->extractHashFromV2V3Signature(Ljava/lang/String;Ljava/lang/String;I)Ljava/util/Map;
 HSPLcom/android/server/pm/ApkChecksums;->getApkChecksum(Ljava/io/File;I)[B+]Ljava/io/FileInputStream;Ljava/io/FileInputStream;]Ljava/io/File;Ljava/io/File;]Ljava/security/MessageDigest;Ljava/security/MessageDigest$Delegate;
 HSPLcom/android/server/pm/ApkChecksums;->getChecksums(Ljava/util/List;IILjava/lang/String;[Ljava/security/cert/Certificate;Landroid/content/pm/IOnChecksumsReadyListener;Lcom/android/server/pm/ApkChecksums$Injector;)V
-HSPLcom/android/server/pm/ApkChecksums;->getInstallerChecksums(Ljava/lang/String;Ljava/io/File;ILjava/lang/String;[Ljava/security/cert/Certificate;Ljava/util/Map;Lcom/android/server/pm/ApkChecksums$Injector;)V
+HSPLcom/android/server/pm/ApkChecksums;->getInstallerChecksums(Ljava/lang/String;Ljava/io/File;ILjava/lang/String;[Ljava/security/cert/Certificate;Ljava/util/Map;Lcom/android/server/pm/ApkChecksums$Injector;)V+]Landroid/content/pm/Signature;Landroid/content/pm/Signature;]Lcom/android/server/pm/ApkChecksums$Injector;Lcom/android/server/pm/ApkChecksums$Injector;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Map;Landroid/util/ArrayMap;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/util/Set;Landroid/util/ArraySet;
 HSPLcom/android/server/pm/ApkChecksums;->processRequiredChecksums(Ljava/util/List;Ljava/util/List;ILandroid/content/pm/IOnChecksumsReadyListener;Lcom/android/server/pm/ApkChecksums$Injector;J)V
 HSPLcom/android/server/pm/AppDataHelper$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/pm/AppDataHelper;ZLcom/android/server/pm/PackageSetting;II)V
-HSPLcom/android/server/pm/AppDataHelper$$ExternalSyntheticLambda3;-><init>(Lcom/android/server/pm/AppDataHelper;Ljava/lang/String;Ljava/lang/String;IILandroid/os/CreateAppDataArgs;Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;)V
 HSPLcom/android/server/pm/AppDataHelper$$ExternalSyntheticLambda3;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLcom/android/server/pm/AppDataHelper;-><init>(Lcom/android/server/pm/PackageManagerService;)V
-HSPLcom/android/server/pm/AppDataHelper;->lambda$prepareAppData$2(Ljava/lang/String;Ljava/lang/String;IILandroid/os/CreateAppDataArgs;Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Landroid/os/CreateAppDataResult;Ljava/lang/Throwable;)V
+HSPLcom/android/server/pm/AppDataHelper;->lambda$fixAppsDataOnBoot$3(Ljava/util/List;I)V
 HSPLcom/android/server/pm/AppDataHelper;->prepareAppData(Lcom/android/server/pm/Installer$Batch;Lcom/android/server/pm/PackageSetting;III)Ljava/util/concurrent/CompletableFuture;
 HSPLcom/android/server/pm/AppDataHelper;->prepareAppDataAndMigrate(Lcom/android/server/pm/Installer$Batch;Lcom/android/server/pm/pkg/AndroidPackage;IIZ)V
-HSPLcom/android/server/pm/AppDataHelper;->reconcileAppsDataLI(Ljava/lang/String;IIZZ)Ljava/util/List;
-HSPLcom/android/server/pm/AppDataHelper;->shouldHaveAppStorage(Lcom/android/server/pm/pkg/AndroidPackage;)Z
-HSPLcom/android/server/pm/AppIdSettingMap;-><init>()V
+HSPLcom/android/server/pm/AppDataHelper;->reconcileAppsDataLI(Ljava/lang/String;IIZZ)Ljava/util/List;+]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/io/File;Ljava/io/File;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HSPLcom/android/server/pm/AppDataHelper;->shouldHaveAppStorage(Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap;
 HSPLcom/android/server/pm/AppIdSettingMap;-><init>(Lcom/android/server/pm/AppIdSettingMap;)V
 HSPLcom/android/server/pm/AppIdSettingMap;->getSetting(I)Lcom/android/server/pm/SettingBase;+]Lcom/android/server/utils/WatchedSparseArray;Lcom/android/server/utils/WatchedSparseArray;]Lcom/android/server/utils/WatchedArrayList;Lcom/android/server/utils/WatchedArrayList;
 HSPLcom/android/server/pm/AppIdSettingMap;->registerExistingAppId(ILcom/android/server/pm/SettingBase;Ljava/lang/Object;)Z
-HSPLcom/android/server/pm/AppIdSettingMap;->registerObserver(Lcom/android/server/utils/Watcher;)V
-HSPLcom/android/server/pm/AppIdSettingMap;->removeSetting(I)V
-HSPLcom/android/server/pm/AppIdSettingMap;->setFirstAvailableAppId(I)V
+HSPLcom/android/server/pm/AppIdSettingMap;->snapshot()Lcom/android/server/pm/AppIdSettingMap;
 HSPLcom/android/server/pm/AppsFilterBase;-><init>()V
 HPLcom/android/server/pm/AppsFilterBase;->getVisibilityAllowList(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Lcom/android/server/pm/pkg/PackageStateInternal;[ILandroid/util/ArrayMap;)Landroid/util/SparseArray;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/AppsFilterBase;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;
 HSPLcom/android/server/pm/AppsFilterBase;->isForceQueryable(I)Z+]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;
-HPLcom/android/server/pm/AppsFilterBase;->isImplicitlyQueryable(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
+HSPLcom/android/server/pm/AppsFilterBase;->isImplicitlyQueryable(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
 HPLcom/android/server/pm/AppsFilterBase;->isQueryableViaComponent(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
-HPLcom/android/server/pm/AppsFilterBase;->isQueryableViaPackage(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
-HPLcom/android/server/pm/AppsFilterBase;->isQueryableViaUsesLibrary(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
-HPLcom/android/server/pm/AppsFilterBase;->isQueryableViaUsesPermission(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
-HPLcom/android/server/pm/AppsFilterBase;->isRetainedImplicitlyQueryable(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
+HSPLcom/android/server/pm/AppsFilterBase;->isQueryableViaPackage(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
+HSPLcom/android/server/pm/AppsFilterBase;->isQueryableViaUsesLibrary(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
+HSPLcom/android/server/pm/AppsFilterBase;->isQueryableViaUsesPermission(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
+HSPLcom/android/server/pm/AppsFilterBase;->isRetainedImplicitlyQueryable(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
 HSPLcom/android/server/pm/AppsFilterBase;->shouldFilterApplication(Lcom/android/server/pm/snapshot/PackageDataSnapshot;ILjava/lang/Object;Lcom/android/server/pm/pkg/PackageStateInternal;I)Z+]Lcom/android/server/pm/FeatureConfig;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/AppsFilterBase;Lcom/android/server/pm/AppsFilterSnapshotImpl;,Lcom/android/server/pm/AppsFilterImpl;
 HSPLcom/android/server/pm/AppsFilterBase;->shouldFilterApplicationInternal(Lcom/android/server/pm/Computer;ILjava/lang/Object;Lcom/android/server/pm/pkg/PackageStateInternal;I)Z+]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;]Lcom/android/server/pm/pkg/SharedUserApi;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/FeatureConfig;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/AppsFilterBase;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/om/OverlayReferenceMapper;Lcom/android/server/om/OverlayReferenceMapper;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
 HPLcom/android/server/pm/AppsFilterBase;->shouldFilterApplicationUsingCache(III)Z+]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix;
-HSPLcom/android/server/pm/AppsFilterImpl$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/pm/AppsFilterImpl;)V
-HSPLcom/android/server/pm/AppsFilterImpl$1;-><init>(Lcom/android/server/pm/AppsFilterImpl;Lcom/android/server/pm/AppsFilterSnapshot;Lcom/android/server/utils/Watchable;)V
-HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;-><init>(Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerServiceInjector;)V
-HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;-><init>(Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl-IA;)V
+HSPLcom/android/server/pm/AppsFilterImpl$1;->createSnapshot()Lcom/android/server/pm/AppsFilterSnapshot;
 HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;-><init>(Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;)V
 HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->enableLogging(IZ)V
 HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->isGloballyEnabled()Z
 HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->packageIsEnabled(Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
-HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->setAppsFilter(Lcom/android/server/pm/AppsFilterImpl;)V
+HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->snapshot()Lcom/android/server/pm/FeatureConfig;
 HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->updateEnabledState(Lcom/android/server/pm/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->updatePackageState(Lcom/android/server/pm/pkg/PackageStateInternal;Z)V
-HSPLcom/android/server/pm/AppsFilterImpl;->-$$Nest$monChanged(Lcom/android/server/pm/AppsFilterImpl;)V
 HSPLcom/android/server/pm/AppsFilterImpl;-><init>(Lcom/android/server/pm/FeatureConfig;[Ljava/lang/String;ZLcom/android/server/om/OverlayReferenceMapper$Provider;Landroid/os/Handler;)V
 HSPLcom/android/server/pm/AppsFilterImpl;->addPackage(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/PackageStateInternal;ZZ)V
-HSPLcom/android/server/pm/AppsFilterImpl;->addPackageInternal(Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/util/ArrayMap;)Landroid/util/ArraySet;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/om/OverlayReferenceMapper;Lcom/android/server/om/OverlayReferenceMapper;]Lcom/android/internal/pm/pkg/component/ParsedUsesPermission;Lcom/android/internal/pm/pkg/component/ParsedUsesPermissionImpl;]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl;]Lcom/android/server/pm/FeatureConfig;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$UnmodifiableCollection$1;
-HSPLcom/android/server/pm/AppsFilterImpl;->create(Lcom/android/server/pm/PackageManagerServiceInjector;Landroid/content/pm/PackageManagerInternal;)Lcom/android/server/pm/AppsFilterImpl;
+HSPLcom/android/server/pm/AppsFilterImpl;->addPackageInternal(Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/util/ArrayMap;)Landroid/util/ArraySet;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/FeatureConfig;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/om/OverlayReferenceMapper;Lcom/android/server/om/OverlayReferenceMapper;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/internal/pm/pkg/component/ParsedUsesPermission;Lcom/android/internal/pm/pkg/component/ParsedUsesPermissionImpl;]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl;]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$UnmodifiableCollection$1;
 HSPLcom/android/server/pm/AppsFilterImpl;->dispatchChange(Lcom/android/server/utils/Watchable;)V
 HSPLcom/android/server/pm/AppsFilterImpl;->grantImplicitAccess(IIZ)Z+]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix;]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;
 HSPLcom/android/server/pm/AppsFilterImpl;->invalidateCache(Ljava/lang/String;)V
-HSPLcom/android/server/pm/AppsFilterImpl;->isSystemSigned(Landroid/content/pm/SigningDetails;Lcom/android/server/pm/pkg/PackageStateInternal;)Z
 HSPLcom/android/server/pm/AppsFilterImpl;->onChanged()V
 HSPLcom/android/server/pm/AppsFilterImpl;->pkgInstruments(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/internal/pm/pkg/component/ParsedInstrumentation;Lcom/android/internal/pm/pkg/component/ParsedInstrumentationImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;
-HSPLcom/android/server/pm/AppsFilterImpl;->readCacheEnabledSysProp()V
-HSPLcom/android/server/pm/AppsFilterImpl;->registerObserver(Lcom/android/server/utils/Watcher;)V
-HSPLcom/android/server/pm/AppsFilterImpl;->removePackageInternal(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/PackageStateInternal;ZZ)V
+HSPLcom/android/server/pm/AppsFilterImpl;->removePackageInternal(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/PackageStateInternal;ZZ)V+]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/om/OverlayReferenceMapper;Lcom/android/server/om/OverlayReferenceMapper;]Lcom/android/internal/pm/pkg/component/ParsedUsesPermission;Lcom/android/internal/pm/pkg/component/ParsedUsesPermissionImpl;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl;]Lcom/android/server/pm/FeatureConfig;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;]Lcom/android/server/pm/pkg/SharedUserApi;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;
 HSPLcom/android/server/pm/AppsFilterImpl;->snapshot()Lcom/android/server/pm/AppsFilterSnapshot;
 HPLcom/android/server/pm/AppsFilterImpl;->updateShouldFilterCacheForPackage(Lcom/android/server/pm/Computer;Ljava/lang/String;Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/util/ArrayMap;[Landroid/content/pm/UserInfo;II)V+]Lcom/android/server/pm/AppsFilterImpl;Lcom/android/server/pm/AppsFilterImpl;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;
 HPLcom/android/server/pm/AppsFilterImpl;->updateShouldFilterCacheForUser(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/PackageStateInternal;[Landroid/content/pm/UserInfo;Lcom/android/server/pm/pkg/PackageStateInternal;I)V+]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/AppsFilterBase;Lcom/android/server/pm/AppsFilterImpl;
-HSPLcom/android/server/pm/AppsFilterLocked;-><init>()V
 HPLcom/android/server/pm/AppsFilterLocked;->isForceQueryable(I)Z
 HPLcom/android/server/pm/AppsFilterLocked;->isImplicitlyQueryable(II)Z
 HPLcom/android/server/pm/AppsFilterLocked;->isQueryableViaComponent(II)Z
@@ -6034,13 +4631,9 @@
 HPLcom/android/server/pm/BackgroundInstallControlService$EventHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/pm/BackgroundInstallControlService;Lcom/android/server/pm/BackgroundInstallControlService;
 HPLcom/android/server/pm/BackgroundInstallControlService;->handleUsageEvent(Landroid/app/usage/UsageEvents$Event;I)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/pm/BackgroundInstallControlService$ForegroundTimeFrame;Lcom/android/server/pm/BackgroundInstallControlService$ForegroundTimeFrame;]Ljava/util/TreeSet;Ljava/util/TreeSet;]Lcom/android/server/pm/BackgroundInstallControlService;Lcom/android/server/pm/BackgroundInstallControlService;
 HPLcom/android/server/pm/BackgroundInstallControlService;->lambda$new$0(ILandroid/app/usage/UsageEvents$Event;)V
-HSPLcom/android/server/pm/BroadcastHelper;-><clinit>()V
-HSPLcom/android/server/pm/BroadcastHelper;-><init>(Lcom/android/server/pm/PackageManagerServiceInjector;)V
 HPLcom/android/server/pm/BroadcastHelper;->doSendBroadcast(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[IZLandroid/util/SparseArray;Ljava/util/function/BiFunction;Landroid/os/Bundle;)V
-HSPLcom/android/server/pm/ChangedPackagesTracker;-><init>()V
-HSPLcom/android/server/pm/CompilerStats;-><init>()V
 HSPLcom/android/server/pm/ComputerEngine$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/pm/ComputerEngine$Settings;)V
-HSPLcom/android/server/pm/ComputerEngine$$ExternalSyntheticLambda1;-><init>()V
+HPLcom/android/server/pm/ComputerEngine$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HSPLcom/android/server/pm/ComputerEngine$$ExternalSyntheticLambda1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLcom/android/server/pm/ComputerEngine$Settings;-><init>(Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/Settings;)V
 HSPLcom/android/server/pm/ComputerEngine$Settings;->getApplicationEnabledSetting(Ljava/lang/String;I)I
@@ -6054,63 +4647,63 @@
 HSPLcom/android/server/pm/ComputerEngine$Settings;->getSharedUserFromAppId(I)Lcom/android/server/pm/pkg/SharedUserApi;
 HSPLcom/android/server/pm/ComputerEngine$Settings;->getSharedUserPackages(I)Landroid/util/ArraySet;+]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
 HSPLcom/android/server/pm/ComputerEngine$Settings;->isEnabledAndMatch(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/pkg/component/ParsedMainComponent;JI)Z+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;
-HSPLcom/android/server/pm/ComputerEngine;-><clinit>()V
-HSPLcom/android/server/pm/ComputerEngine;-><init>(Lcom/android/server/pm/PackageManagerService$Snapshot;I)V
+HSPLcom/android/server/pm/ComputerEngine;-><init>(Lcom/android/server/pm/PackageManagerService$Snapshot;I)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;
 HSPLcom/android/server/pm/ComputerEngine;->addPackageHoldingPermissions(Ljava/util/ArrayList;Lcom/android/server/pm/pkg/PackageStateInternal;[Ljava/lang/String;[ZJI)V+]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/ComputerEngine;->applyPostResolutionFilter(Ljava/util/List;Ljava/lang/String;ZIZILandroid/content/Intent;)Ljava/util/List;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/AppsFilterSnapshot;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/pm/ComputerEngine;->applyPostServiceResolutionFilter(Ljava/util/List;Ljava/lang/String;II)Ljava/util/List;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/AppsFilterSnapshot;Lcom/android/server/pm/AppsFilterSnapshotImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;
 HSPLcom/android/server/pm/ComputerEngine;->areWebInstantAppsDisabled(I)Z+]Lcom/android/server/utils/WatchedSparseBooleanArray;Lcom/android/server/utils/WatchedSparseBooleanArray;
 HPLcom/android/server/pm/ComputerEngine;->canQueryPackage(ILjava/lang/String;)Z+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/AppsFilterSnapshot;Lcom/android/server/pm/AppsFilterSnapshotImpl;
-HSPLcom/android/server/pm/ComputerEngine;->canViewInstantApps(II)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HSPLcom/android/server/pm/ComputerEngine;->checkSignatures(Ljava/lang/String;Ljava/lang/String;I)I
+HSPLcom/android/server/pm/ComputerEngine;->canViewInstantApps(II)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/ComponentName;Landroid/content/ComponentName;
+HSPLcom/android/server/pm/ComputerEngine;->checkSignatures(Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/ComputerEngine;->checkUidPermission(Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;
-HPLcom/android/server/pm/ComputerEngine;->createForwardingResolveInfoUnchecked(Lcom/android/server/pm/WatchedIntentFilter;II)Landroid/content/pm/ResolveInfo;
-HSPLcom/android/server/pm/ComputerEngine;->enforceCrossUserOrProfilePermission(IIZZLjava/lang/String;)V+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
+HPLcom/android/server/pm/ComputerEngine;->createForwardingResolveInfoUnchecked(Lcom/android/server/pm/WatchedIntentFilter;II)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/WatchedIntentFilter;Lcom/android/server/pm/CrossProfileIntentFilter;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
+HSPLcom/android/server/pm/ComputerEngine;->enforceCrossUserOrProfilePermission(IIZZLjava/lang/String;)V+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/ComputerEngine;->enforceCrossUserPermission(IIZZLjava/lang/String;)V+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
 HSPLcom/android/server/pm/ComputerEngine;->enforceCrossUserPermission(IIZZZLjava/lang/String;)V+]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
-HPLcom/android/server/pm/ComputerEngine;->filterAppAccess(II)Z
+HPLcom/android/server/pm/ComputerEngine;->filterAppAccess(II)Z+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HSPLcom/android/server/pm/ComputerEngine;->filterAppAccess(Ljava/lang/String;IIZ)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
 HSPLcom/android/server/pm/ComputerEngine;->filterIfNotSystemUser(Ljava/util/List;I)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;
-HSPLcom/android/server/pm/ComputerEngine;->filterOnlySystemPackages([Ljava/lang/String;)[Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/pm/ComputerEngine;->filterOnlySystemPackages([Ljava/lang/String;)[Ljava/lang/String;+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/ComputerEngine;->filterSdkLibPackage(Lcom/android/server/pm/pkg/PackageStateInternal;IIJ)Z+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HSPLcom/android/server/pm/ComputerEngine;->filterSharedLibPackage(Lcom/android/server/pm/pkg/PackageStateInternal;IIJ)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
 HSPLcom/android/server/pm/ComputerEngine;->filterStaticSharedLibPackage(Lcom/android/server/pm/pkg/PackageStateInternal;IIJ)Z+]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/ComputerEngine;->generatePackageInfo(Lcom/android/server/pm/pkg/PackageStateInternal;JI)Landroid/content/pm/PackageInfo;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;]Lcom/android/server/pm/ApexManager;Lcom/android/server/pm/ApexManager$ApexManagerImpl;
 HSPLcom/android/server/pm/ComputerEngine;->getActivityInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo;
-HPLcom/android/server/pm/ComputerEngine;->getActivityInfoCrossProfile(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo;
+HPLcom/android/server/pm/ComputerEngine;->getActivityInfoCrossProfile(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getActivityInfoInternal(Landroid/content/ComponentName;JII)Landroid/content/pm/ActivityInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/ComputerEngine;->getActivityInfoInternalBody(Landroid/content/ComponentName;JII)Landroid/content/pm/ActivityInfo;+]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
-HSPLcom/android/server/pm/ComputerEngine;->getApplicationEnabledSetting(Ljava/lang/String;I)I
+HSPLcom/android/server/pm/ComputerEngine;->getActivityInfoInternalBody(Landroid/content/ComponentName;JII)Landroid/content/pm/ActivityInfo;+]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Landroid/content/ComponentName;Landroid/content/ComponentName;
+HSPLcom/android/server/pm/ComputerEngine;->getApplicationEnabledSetting(Ljava/lang/String;I)I+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HSPLcom/android/server/pm/ComputerEngine;->getApplicationInfo(Ljava/lang/String;JI)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getApplicationInfoInternal(Ljava/lang/String;JII)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getApplicationInfoInternalBody(Ljava/lang/String;JII)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HPLcom/android/server/pm/ComputerEngine;->getBlockUninstallForUser(Ljava/lang/String;I)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
-HPLcom/android/server/pm/ComputerEngine;->getComponentEnabledSetting(Landroid/content/ComponentName;II)I+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
-HPLcom/android/server/pm/ComputerEngine;->getComponentEnabledSettingInternal(Landroid/content/ComponentName;II)I+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
+HSPLcom/android/server/pm/ComputerEngine;->getComponentEnabledSetting(Landroid/content/ComponentName;II)I+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/ComputerEngine;->getComponentEnabledSettingInternal(Landroid/content/ComponentName;II)I+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HSPLcom/android/server/pm/ComputerEngine;->getComponentResolver()Lcom/android/server/pm/resolution/ComponentResolverApi;
-HPLcom/android/server/pm/ComputerEngine;->getDeclaredSharedLibraries(Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Lcom/android/server/utils/WatchedLongSparseArray;Lcom/android/server/utils/WatchedLongSparseArray;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/VersionedPackage;Landroid/content/pm/VersionedPackage;
-HSPLcom/android/server/pm/ComputerEngine;->getDisabledSystemPackage(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateInternal;
+HSPLcom/android/server/pm/ComputerEngine;->getDeclaredSharedLibraries(Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Lcom/android/server/utils/WatchedLongSparseArray;Lcom/android/server/utils/WatchedLongSparseArray;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/VersionedPackage;Landroid/content/pm/VersionedPackage;
+HSPLcom/android/server/pm/ComputerEngine;->getDisabledSystemPackage(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HSPLcom/android/server/pm/ComputerEngine;->getInstallSource(Ljava/lang/String;II)Lcom/android/server/pm/InstallSource;+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
-HSPLcom/android/server/pm/ComputerEngine;->getInstallSourceInfo(Ljava/lang/String;I)Landroid/content/pm/InstallSourceInfo;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
+HSPLcom/android/server/pm/ComputerEngine;->getInstallSourceInfo(Ljava/lang/String;I)Landroid/content/pm/InstallSourceInfo;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getInstalledApplications(JIIZ)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;
 HSPLcom/android/server/pm/ComputerEngine;->getInstalledPackages(JI)Landroid/content/pm/ParceledListSlice;
 HSPLcom/android/server/pm/ComputerEngine;->getInstalledPackagesBody(JII)Landroid/content/pm/ParceledListSlice;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;,Landroid/util/MapCollections$ValuesCollection;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$UnmodifiableCollection$1;
-HPLcom/android/server/pm/ComputerEngine;->getInstallerPackageName(Ljava/lang/String;I)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
-HSPLcom/android/server/pm/ComputerEngine;->getInstantAppPackageName(I)Ljava/lang/String;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
+HPLcom/android/server/pm/ComputerEngine;->getInstallerPackageName(Ljava/lang/String;I)Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/pm/ComputerEngine;->getInstantAppPackageName(I)Ljava/lang/String;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/ComputerEngine;->getMatchingCrossProfileIntentFilters(Landroid/content/Intent;Ljava/lang/String;I)Ljava/util/List;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/IntentResolver;Lcom/android/server/pm/CrossProfileIntentResolver;
-HSPLcom/android/server/pm/ComputerEngine;->getNameForUid(I)Ljava/lang/String;+]Lcom/android/server/pm/permission/PermissionManagerServiceInternal$HotwordDetectionServiceProvider;Lcom/android/server/voiceinteraction/HotwordDetectionConnection$2$$ExternalSyntheticLambda0;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
+HSPLcom/android/server/pm/ComputerEngine;->getNameForUid(I)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal$HotwordDetectionServiceProvider;Lcom/android/server/voiceinteraction/HotwordDetectionConnection$2$$ExternalSyntheticLambda0;
+HSPLcom/android/server/pm/ComputerEngine;->getNamesForUids([I)[Ljava/lang/String;+]Lcom/android/server/pm/permission/PermissionManagerServiceInternal$HotwordDetectionServiceProvider;Lcom/android/server/voiceinteraction/HotwordDetectionConnection$2$$ExternalSyntheticLambda0;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HPLcom/android/server/pm/ComputerEngine;->getNotifyPackagesForReplacedReceived([Ljava/lang/String;)Landroid/util/ArraySet;
 HSPLcom/android/server/pm/ComputerEngine;->getPackage(I)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
-HSPLcom/android/server/pm/ComputerEngine;->getPackage(Ljava/lang/String;)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
-HSPLcom/android/server/pm/ComputerEngine;->getPackageGids(Ljava/lang/String;JI)[I
+HSPLcom/android/server/pm/ComputerEngine;->getPackage(Ljava/lang/String;)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/ComputerEngine;->getPackageGids(Ljava/lang/String;JI)[I+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/permission/LegacyPermissionDataProvider;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;
 HSPLcom/android/server/pm/ComputerEngine;->getPackageInfo(Ljava/lang/String;JI)Landroid/content/pm/PackageInfo;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getPackageInfoInternal(Ljava/lang/String;JJII)Landroid/content/pm/PackageInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getPackageInfoInternalBody(Ljava/lang/String;JJII)Landroid/content/pm/PackageInfo;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
-HSPLcom/android/server/pm/ComputerEngine;->getPackageStartability(ZLjava/lang/String;II)I+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/ComputerEngine;->getPackageStartability(ZLjava/lang/String;II)I+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getPackageStateFiltered(Ljava/lang/String;II)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HSPLcom/android/server/pm/ComputerEngine;->getPackageStateForInstalledAndFiltered(Ljava/lang/String;II)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getPackageStateInternal(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/ComputerEngine;->getPackageStateInternal(Ljava/lang/String;I)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
+HSPLcom/android/server/pm/ComputerEngine;->getPackageStateInternal(Ljava/lang/String;I)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HSPLcom/android/server/pm/ComputerEngine;->getPackageStates()Landroid/util/ArrayMap;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HSPLcom/android/server/pm/ComputerEngine;->getPackageUid(Ljava/lang/String;JI)I+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getPackageUidInternal(Ljava/lang/String;JII)I+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
@@ -6119,29 +4712,29 @@
 HSPLcom/android/server/pm/ComputerEngine;->getPackagesForUidInternal(II)[Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getPackagesForUidInternalBody(IIIZ)[Ljava/lang/String;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;
 HSPLcom/android/server/pm/ComputerEngine;->getPackagesHoldingPermissions([Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
-HSPLcom/android/server/pm/ComputerEngine;->getPackagesUsingSharedLibrary(Landroid/content/pm/SharedLibraryInfo;JII)Landroid/util/Pair;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
-HSPLcom/android/server/pm/ComputerEngine;->getProcessesForUid(I)Landroid/util/ArrayMap;
+HSPLcom/android/server/pm/ComputerEngine;->getPackagesUsingSharedLibrary(Landroid/content/pm/SharedLibraryInfo;JII)Landroid/util/Pair;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
+HSPLcom/android/server/pm/ComputerEngine;->getProcessesForUid(I)Landroid/util/ArrayMap;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HSPLcom/android/server/pm/ComputerEngine;->getProviderInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ProviderInfo;
-HSPLcom/android/server/pm/ComputerEngine;->getReceiverInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo;
+HSPLcom/android/server/pm/ComputerEngine;->getReceiverInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
 HSPLcom/android/server/pm/ComputerEngine;->getServiceInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ServiceInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getServiceInfoBody(Landroid/content/ComponentName;JII)Landroid/content/pm/ServiceInfo;+]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
-HPLcom/android/server/pm/ComputerEngine;->getSharedLibraries(Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;
-HSPLcom/android/server/pm/ComputerEngine;->getSharedLibraryInfo(Ljava/lang/String;J)Landroid/content/pm/SharedLibraryInfo;
-HSPLcom/android/server/pm/ComputerEngine;->getSharedUser(I)Lcom/android/server/pm/pkg/SharedUserApi;
-HSPLcom/android/server/pm/ComputerEngine;->getSharedUserPackagesForPackage(Ljava/lang/String;I)[Ljava/lang/String;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/SharedUserApi;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
+HSPLcom/android/server/pm/ComputerEngine;->getSharedLibraries()Lcom/android/server/utils/WatchedArrayMap;+]Lcom/android/server/pm/SharedLibrariesRead;Lcom/android/server/pm/SharedLibrariesImpl;
+HPLcom/android/server/pm/ComputerEngine;->getSharedLibraries(Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/utils/WatchedLongSparseArray;Lcom/android/server/utils/WatchedLongSparseArray;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/pm/ComputerEngine;->getSharedUserPackagesForPackage(Ljava/lang/String;I)[Ljava/lang/String;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/SharedUserApi;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/pm/ComputerEngine;->getSigningDetails(I)Landroid/content/pm/SigningDetails;+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
-HPLcom/android/server/pm/ComputerEngine;->getSystemSharedLibraryNamesAndPaths()Landroid/util/ArrayMap;
+HPLcom/android/server/pm/ComputerEngine;->getSystemSharedLibraryNamesAndPaths()Landroid/util/ArrayMap;+]Lcom/android/server/utils/WatchedLongSparseArray;Lcom/android/server/utils/WatchedLongSparseArray;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->getTargetSdkVersion(Ljava/lang/String;)I+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
-HSPLcom/android/server/pm/ComputerEngine;->getUidTargetSdkVersion(I)I+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
+HSPLcom/android/server/pm/ComputerEngine;->getUidTargetSdkVersion(I)I+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/ComputerEngine;->getUsed()I
 HSPLcom/android/server/pm/ComputerEngine;->getUserInfos()[Landroid/content/pm/UserInfo;
 HSPLcom/android/server/pm/ComputerEngine;->getUserStateOrDefaultForUser(Ljava/lang/String;I)Lcom/android/server/pm/pkg/PackageUserStateInternal;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HSPLcom/android/server/pm/ComputerEngine;->getVersion()I
 HSPLcom/android/server/pm/ComputerEngine;->hasCrossUserPermission(IIIZZ)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/ComputerEngine;->hasNonNegativePriority(Ljava/util/List;)Z
-HPLcom/android/server/pm/ComputerEngine;->hasSigningCertificate(Ljava/lang/String;[BI)Z
+HSPLcom/android/server/pm/ComputerEngine;->hasNonNegativePriority(Ljava/util/List;)Z+]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/pm/ComputerEngine;->hasSigningCertificate(Ljava/lang/String;[BI)Z
 HSPLcom/android/server/pm/ComputerEngine;->instantAppInstallerActivity()Landroid/content/pm/ActivityInfo;
 HSPLcom/android/server/pm/ComputerEngine;->isApexPackage(Ljava/lang/String;)Z+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
-HPLcom/android/server/pm/ComputerEngine;->isCallerInstallerOfRecord(Lcom/android/server/pm/pkg/AndroidPackage;I)Z
+HSPLcom/android/server/pm/ComputerEngine;->isCallerInstallerOfRecord(Lcom/android/server/pm/pkg/AndroidPackage;I)Z+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/ComputerEngine;->isCallerSameApp(Ljava/lang/String;I)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->isCallerSameApp(Ljava/lang/String;IZ)Z+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/ComputerEngine;->isImplicitImageCaptureIntentAndNotSetByDpc(Landroid/content/Intent;ILjava/lang/String;J)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/Intent;Landroid/content/Intent;
@@ -6149,63 +4742,65 @@
 HSPLcom/android/server/pm/ComputerEngine;->isInstantAppInternal(Ljava/lang/String;II)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->isInstantAppInternalBody(Ljava/lang/String;II)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/InstantAppRegistry;Lcom/android/server/pm/InstantAppRegistry;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;
 HSPLcom/android/server/pm/ComputerEngine;->isInstantAppResolutionAllowed(Landroid/content/Intent;Ljava/util/List;IZJ)Z+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Landroid/net/Uri;Landroid/net/Uri$StringUri;,Landroid/net/Uri$OpaqueUri;,Landroid/net/Uri$HierarchicalUri;]Landroid/content/Intent;Landroid/content/Intent;
-HPLcom/android/server/pm/ComputerEngine;->isInstantAppResolutionAllowedBody(Landroid/content/Intent;Ljava/util/List;IZJ)Z
+HPLcom/android/server/pm/ComputerEngine;->isInstantAppResolutionAllowedBody(Landroid/content/Intent;Ljava/util/List;IZJ)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/pm/ComputerEngine;->isPackageAvailable(Ljava/lang/String;I)Z+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HPLcom/android/server/pm/ComputerEngine;->isPackageSuspendedForUser(Ljava/lang/String;I)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->isRecentsAccessingChildProfiles(II)Z+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;
 HSPLcom/android/server/pm/ComputerEngine;->lambda$static$0(Landroid/content/pm/ProviderInfo;Landroid/content/pm/ProviderInfo;)I
-HPLcom/android/server/pm/ComputerEngine;->maybeAddInstantAppInstaller(Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;JIZZ)Ljava/util/List;
-HSPLcom/android/server/pm/ComputerEngine;->queryContentProviders(Ljava/lang/String;IJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/pm/ComputerEngine;->maybeAddInstantAppInstaller(Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;JIZZ)Ljava/util/List;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/pm/ComputerEngine;->queryContentProviders(Ljava/lang/String;IJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/ComputerEngine;->queryIntentActivitiesInternal(Landroid/content/Intent;Ljava/lang/String;JI)Ljava/util/List;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/ComputerEngine;->queryIntentActivitiesInternal(Landroid/content/Intent;Ljava/lang/String;JJIIZZ)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;
+HPLcom/android/server/pm/ComputerEngine;->queryIntentActivitiesInternal(Landroid/content/Intent;Ljava/lang/String;JII)Ljava/util/List;
+HSPLcom/android/server/pm/ComputerEngine;->queryIntentActivitiesInternal(Landroid/content/Intent;Ljava/lang/String;JJIIZZ)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/pm/ComputerEngine;->queryIntentActivitiesInternalBody(Landroid/content/Intent;Ljava/lang/String;JIIZZLjava/lang/String;Ljava/lang/String;)Lcom/android/server/pm/QueryIntentActivitiesResult;+]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;,Lcom/android/server/pm/resolution/ComponentResolver;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/CrossProfileIntentResolverEngine;Lcom/android/server/pm/CrossProfileIntentResolverEngine;
 HSPLcom/android/server/pm/ComputerEngine;->queryIntentServicesInternal(Landroid/content/Intent;Ljava/lang/String;JIIZ)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/pm/ComputerEngine;->queryIntentServicesInternalBody(Landroid/content/Intent;Ljava/lang/String;JIILjava/lang/String;)Ljava/util/List;+]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/pm/ComputerEngine;->resolveContentProvider(Ljava/lang/String;JII)Landroid/content/pm/ProviderInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;
 HSPLcom/android/server/pm/ComputerEngine;->resolveExternalPackageName(Lcom/android/server/pm/pkg/AndroidPackage;)Ljava/lang/String;+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
-HSPLcom/android/server/pm/ComputerEngine;->resolveInternalPackageName(Ljava/lang/String;J)Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
+HSPLcom/android/server/pm/ComputerEngine;->resolveInternalPackageName(Ljava/lang/String;J)Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->resolveInternalPackageNameInternalLocked(Ljava/lang/String;JI)Ljava/lang/String;+]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Lcom/android/server/utils/WatchedLongSparseArray;Lcom/android/server/utils/WatchedLongSparseArray;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/SharedLibrariesRead;Lcom/android/server/pm/SharedLibrariesImpl;]Landroid/content/pm/VersionedPackage;Landroid/content/pm/VersionedPackage;
 HSPLcom/android/server/pm/ComputerEngine;->safeMode()Z
 HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/SharedUserSetting;II)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;
 HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/pkg/PackageStateInternal;II)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/pkg/PackageStateInternal;ILandroid/content/ComponentName;II)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/pkg/PackageStateInternal;ILandroid/content/ComponentName;IIZ)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/pkg/PackageStateInternal;ILandroid/content/ComponentName;IIZZ)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/AppsFilterSnapshot;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;
+HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/pkg/PackageStateInternal;ILandroid/content/ComponentName;IIZZ)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/AppsFilterSnapshot;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;]Lcom/android/server/pm/InstantAppRegistry;Lcom/android/server/pm/InstantAppRegistry;
 HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplicationIncludingUninstalled(Lcom/android/server/pm/SharedUserSetting;II)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;
 HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplicationIncludingUninstalled(Lcom/android/server/pm/pkg/PackageStateInternal;II)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplicationIncludingUninstalledNotArchived(Lcom/android/server/pm/pkg/PackageStateInternal;II)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->updateFlags(JI)J+]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;
 HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForApplication(JI)J
-HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForComponent(JI)J+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForComponent(JI)J+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
 HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForPackage(JI)J+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForResolve(JIIZZ)J+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForResolve(JIIZZZ)J+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/ComputerEngine;->use()Lcom/android/server/pm/Computer;
-HSPLcom/android/server/pm/ComputerLocked;-><init>(Lcom/android/server/pm/PackageManagerService$Snapshot;)V
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl$$ExternalSyntheticLambda15;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;Ljava/lang/String;II)V
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl$$ExternalSyntheticLambda15;->getOrThrow()Ljava/lang/Object;
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl$$ExternalSyntheticLambda7;-><init>(Lcom/android/server/pm/CrossProfileAppsServiceImpl;ILjava/lang/String;)V
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl$$ExternalSyntheticLambda7;->getOrThrow()Ljava/lang/Object;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;->checkComponentPermission(Ljava/lang/String;IIZ)I
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;->getAppOpsManager()Landroid/app/AppOpsManager;
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;->getPackageManagerInternal()Landroid/content/pm/PackageManagerInternal;
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;->getUserManager()Landroid/os/UserManager;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;->withCleanCallingIdentity(Lcom/android/internal/util/FunctionalUtils$ThrowingSupplier;)Ljava/lang/Object;
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->canInteractAcrossProfiles(Ljava/lang/String;)Z
-HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->getTargetUserProfiles(Ljava/lang/String;)Ljava/util/List;
-HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->getTargetUserProfilesUnchecked(Ljava/lang/String;I)Ljava/util/List;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->getTargetUserProfiles(Ljava/lang/String;)Ljava/util/List;+]Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;Lcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->getTargetUserProfilesUnchecked(Ljava/lang/String;I)Ljava/util/List;+]Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;Lcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->hasInteractAcrossProfilesPermission(Ljava/lang/String;II)Z
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->haveProfilesGotInteractAcrossProfilesPermission(Ljava/lang/String;Ljava/util/List;)Z
-HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->isPackageEnabled(Ljava/lang/String;I)Z
-HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->isPermissionGranted(Ljava/lang/String;I)Z
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->isPackageEnabled(Ljava/lang/String;I)Z+]Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;Lcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->isPermissionGranted(Ljava/lang/String;I)Z+]Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;Lcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$getTargetUserProfilesUnchecked$3(ILjava/lang/String;)Ljava/util/List;+]Lcom/android/server/pm/CrossProfileAppsServiceImpl;Lcom/android/server/pm/CrossProfileAppsServiceImpl;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/UserManager;Landroid/os/UserManager;]Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;Lcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;
 HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$isPackageEnabled$4(Ljava/lang/String;II)Ljava/lang/Boolean;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;Lcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;
-HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->verifyCallingPackage(Ljava/lang/String;)V
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->verifyCallingPackage(Ljava/lang/String;)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;Lcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;
 HPLcom/android/server/pm/CrossProfileDomainInfo;-><init>(Landroid/content/pm/ResolveInfo;II)V
 HSPLcom/android/server/pm/CrossProfileIntentFilter$1;->createSnapshot()Lcom/android/server/pm/CrossProfileIntentFilter;
 HSPLcom/android/server/pm/CrossProfileIntentFilter;-><init>(Lcom/android/server/pm/CrossProfileIntentFilter;)V
 HSPLcom/android/server/pm/CrossProfileIntentFilter;->snapshot()Lcom/android/server/pm/CrossProfileIntentFilter;
-HSPLcom/android/server/pm/CrossProfileIntentFilter;->writeToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V
+HSPLcom/android/server/pm/CrossProfileIntentFilter;->writeToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;
 HSPLcom/android/server/pm/CrossProfileIntentResolver;-><init>(Lcom/android/server/pm/CrossProfileIntentResolver;)V
-HSPLcom/android/server/pm/CrossProfileIntentResolver;->getIntentFilter(Lcom/android/server/pm/CrossProfileIntentFilter;)Landroid/content/IntentFilter;
+HSPLcom/android/server/pm/CrossProfileIntentResolver;->getIntentFilter(Lcom/android/server/pm/CrossProfileIntentFilter;)Landroid/content/IntentFilter;+]Lcom/android/server/pm/WatchedIntentFilter;Lcom/android/server/pm/CrossProfileIntentFilter;
 HSPLcom/android/server/pm/CrossProfileIntentResolver;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;+]Lcom/android/server/pm/CrossProfileIntentResolver;Lcom/android/server/pm/CrossProfileIntentResolver;
 HPLcom/android/server/pm/CrossProfileIntentResolver;->isPackageForFilter(Ljava/lang/String;Lcom/android/server/pm/CrossProfileIntentFilter;)Z
 HPLcom/android/server/pm/CrossProfileIntentResolver;->isPackageForFilter(Ljava/lang/String;Ljava/lang/Object;)Z+]Lcom/android/server/pm/CrossProfileIntentResolver;Lcom/android/server/pm/CrossProfileIntentResolver;
@@ -6213,120 +4808,77 @@
 HSPLcom/android/server/pm/CrossProfileIntentResolver;->snapshot(Ljava/lang/Object;)Ljava/lang/Object;+]Lcom/android/server/pm/CrossProfileIntentResolver;Lcom/android/server/pm/CrossProfileIntentResolver;
 HSPLcom/android/server/pm/CrossProfileIntentResolver;->sortResults(Ljava/util/List;)V
 HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;-><init>(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;Lcom/android/server/pm/DefaultAppProvider;Landroid/content/Context;)V
-HPLcom/android/server/pm/CrossProfileIntentResolverEngine;->chooseCrossProfileResolver(Lcom/android/server/pm/Computer;IIZJ)Lcom/android/server/pm/CrossProfileResolver;
+HPLcom/android/server/pm/CrossProfileIntentResolverEngine;->chooseCrossProfileResolver(Lcom/android/server/pm/Computer;IIZJ)Lcom/android/server/pm/CrossProfileResolver;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->combineFilterAndCreateQueryActivitiesResponse(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZJIIZLjava/util/List;Ljava/util/List;ZZZLjava/util/function/Function;)Lcom/android/server/pm/QueryIntentActivitiesResult;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/CrossProfileIntentResolverEngine;Lcom/android/server/pm/CrossProfileIntentResolverEngine;
-HPLcom/android/server/pm/CrossProfileIntentResolverEngine;->filterCandidatesWithDomainPreferredActivitiesLPrBody(Lcom/android/server/pm/Computer;Landroid/content/Intent;JLjava/util/List;Ljava/util/List;IZZZLjava/util/function/Function;)Ljava/util/List;
+HPLcom/android/server/pm/CrossProfileIntentResolverEngine;->filterCandidatesWithDomainPreferredActivitiesLPrBody(Lcom/android/server/pm/Computer;Landroid/content/Intent;JLjava/util/List;Ljava/util/List;IZZZLjava/util/function/Function;)Ljava/util/List;+]Lcom/android/server/pm/DefaultAppProvider;Lcom/android/server/pm/DefaultAppProvider;]Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;Lcom/android/server/pm/verify/domain/DomainVerificationService;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Landroid/content/Intent;Landroid/content/Intent;
 HPLcom/android/server/pm/CrossProfileIntentResolverEngine;->filterCrossProfileCandidatesWithDomainPreferredActivities(Lcom/android/server/pm/Computer;Landroid/content/Intent;JLandroid/util/SparseArray;IIZ)Ljava/util/List;
-HPLcom/android/server/pm/CrossProfileIntentResolverEngine;->isNoFilteringPropertyConfiguredForUser(I)Z
+HPLcom/android/server/pm/CrossProfileIntentResolverEngine;->isNoFilteringPropertyConfiguredForUser(I)Z+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;
 HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->resolveInfoFromCrossProfileDomainInfo(Ljava/util/List;)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->resolveIntent(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;IJLjava/lang/String;ZZLjava/util/function/Function;)Ljava/util/List;+]Lcom/android/server/pm/CrossProfileIntentResolverEngine;Lcom/android/server/pm/CrossProfileIntentResolverEngine;
 HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->resolveIntentInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;IIJLjava/lang/String;ZZLjava/util/function/Function;Ljava/util/Set;)Ljava/util/List;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/CrossProfileResolver;Lcom/android/server/pm/DefaultCrossProfileResolver;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/CrossProfileIntentResolverEngine;Lcom/android/server/pm/CrossProfileIntentResolverEngine;]Ljava/util/Set;Ljava/util/HashSet;
 HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->shouldSkipCurrentProfile(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;I)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/CrossProfileIntentFilter;Lcom/android/server/pm/CrossProfileIntentFilter;
+HPLcom/android/server/pm/CrossProfileIntentResolverEngine;->shouldUseNoFilteringResolver(II)Z
 HPLcom/android/server/pm/CrossProfileResolver;-><init>(Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/UserManagerService;)V
-HPLcom/android/server/pm/CrossProfileResolver;->filterIfNotSystemUser(Ljava/util/List;I)Ljava/util/List;
-HPLcom/android/server/pm/CrossProfileResolver;->isUserEnabled(I)Z
-HSPLcom/android/server/pm/DataLoaderManagerService$DataLoaderManagerBinderService;-><init>(Lcom/android/server/pm/DataLoaderManagerService;)V
-HSPLcom/android/server/pm/DataLoaderManagerService;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/pm/DataLoaderManagerService;->onStart()V
-HSPLcom/android/server/pm/DefaultAppProvider;-><init>(Ljava/util/function/Supplier;Ljava/util/function/Supplier;)V
-HPLcom/android/server/pm/DefaultAppProvider;->getRoleHolder(Ljava/lang/String;I)Ljava/lang/String;
-HSPLcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder;-><init>(IIZ)V
-HSPLcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder;->addAction(Ljava/lang/String;)Lcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder;
-HSPLcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder;->addCategory(Ljava/lang/String;)Lcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder;
-HSPLcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder;->addDataScheme(Ljava/lang/String;)Lcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder;
-HSPLcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder;->addDataType(Ljava/lang/String;)Lcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder;
-HSPLcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder;->build()Lcom/android/server/pm/DefaultCrossProfileIntentFilter;
+HPLcom/android/server/pm/CrossProfileResolver;->filterIfNotSystemUser(Ljava/util/List;I)Ljava/util/List;+]Ljava/util/List;Ljava/util/Collections$SingletonList;,Ljava/util/ArrayList;
+HPLcom/android/server/pm/CrossProfileResolver;->isUserEnabled(I)Z+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
+HSPLcom/android/server/pm/DefaultAppProvider;->getRoleHolder(Ljava/lang/String;I)Ljava/lang/String;
 HSPLcom/android/server/pm/DefaultCrossProfileIntentFilter;-><init>(Lcom/android/server/pm/WatchedIntentFilter;IIZ)V
-HSPLcom/android/server/pm/DefaultCrossProfileIntentFilter;-><init>(Lcom/android/server/pm/WatchedIntentFilter;IIZLcom/android/server/pm/DefaultCrossProfileIntentFilter-IA;)V
 HSPLcom/android/server/pm/DefaultCrossProfileIntentFiltersUtils;-><clinit>()V
-HSPLcom/android/server/pm/DefaultCrossProfileIntentFiltersUtils;->getDefaultCloneProfileFilters()Ljava/util/List;
-HSPLcom/android/server/pm/DefaultCrossProfileIntentFiltersUtils;->getDefaultCrossProfileTelephonyIntentFilters(Z)Ljava/util/List;
-HSPLcom/android/server/pm/DefaultCrossProfileIntentFiltersUtils;->getDefaultManagedProfileFilters()Ljava/util/List;
-HPLcom/android/server/pm/DefaultCrossProfileResolver;->createForwardingResolveInfo(Lcom/android/server/pm/Computer;Lcom/android/server/pm/CrossProfileIntentFilter;Landroid/content/Intent;Ljava/lang/String;JILjava/util/function/Function;)Lcom/android/server/pm/CrossProfileDomainInfo;
+HPLcom/android/server/pm/DefaultCrossProfileResolver;->createForwardingResolveInfo(Lcom/android/server/pm/Computer;Lcom/android/server/pm/CrossProfileIntentFilter;Landroid/content/Intent;Ljava/lang/String;JILjava/util/function/Function;)Lcom/android/server/pm/CrossProfileDomainInfo;+]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Ljava/util/function/Function;Lcom/android/server/pm/ComputerEngine$$ExternalSyntheticLambda0;]Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;Lcom/android/server/pm/verify/domain/DomainVerificationService;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/CrossProfileIntentFilter;Lcom/android/server/pm/CrossProfileIntentFilter;
 HPLcom/android/server/pm/DefaultCrossProfileResolver;->queryCrossProfileIntents(Lcom/android/server/pm/Computer;Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;JIZLjava/util/function/Function;)Lcom/android/server/pm/CrossProfileDomainInfo;
-HPLcom/android/server/pm/DefaultCrossProfileResolver;->querySkipCurrentProfileIntents(Lcom/android/server/pm/Computer;Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;JILjava/util/function/Function;)Lcom/android/server/pm/CrossProfileDomainInfo;
-HPLcom/android/server/pm/DefaultCrossProfileResolver;->resolveIntent(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;IIJLjava/lang/String;Ljava/util/List;ZLjava/util/function/Function;)Ljava/util/List;
-HSPLcom/android/server/pm/DeletePackageHelper;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/RemovePackageHelper;Lcom/android/server/pm/BroadcastHelper;)V
-HSPLcom/android/server/pm/DexOptHelper;-><clinit>()V
-HSPLcom/android/server/pm/DexOptHelper;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HPLcom/android/server/pm/DefaultCrossProfileResolver;->querySkipCurrentProfileIntents(Lcom/android/server/pm/Computer;Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;JILjava/util/function/Function;)Lcom/android/server/pm/CrossProfileDomainInfo;+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/CrossProfileIntentFilter;Lcom/android/server/pm/CrossProfileIntentFilter;
+HPLcom/android/server/pm/DefaultCrossProfileResolver;->resolveIntent(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;IIJLjava/lang/String;Ljava/util/List;ZLjava/util/function/Function;)Ljava/util/List;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Landroid/content/Intent;Landroid/content/Intent;
+HPLcom/android/server/pm/DexOptHelper$DexoptDoneHandler;->onDexoptDone(Lcom/android/server/art/model/DexoptResult;)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/AbstractStatsBase;Lcom/android/server/pm/PackageUsage;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/art/model/DexoptResult$DexContainerFileDexoptResult;Lcom/android/server/art/model/AutoValue_DexoptResult_DexContainerFileDexoptResult;]Lcom/android/server/art/model/DexoptResult$PackageDexoptResult;Lcom/android/server/art/model/AutoValue_DexoptResult_PackageDexoptResult;]Lcom/android/server/pm/CompilerStats;Lcom/android/server/pm/CompilerStats;]Lcom/android/server/pm/CompilerStats$PackageStats;Lcom/android/server/pm/CompilerStats$PackageStats;]Lcom/android/server/art/model/DexoptResult;Lcom/android/server/art/model/AutoValue_DexoptResult;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/pm/DexOptHelper;->getDexUseManagerLocal()Lcom/android/server/art/DexUseManagerLocal;
-HSPLcom/android/server/pm/DexOptHelper;->useArtService()Z
-HSPLcom/android/server/pm/DistractingPackageHelper;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/BroadcastHelper;Lcom/android/server/pm/SuspendPackageHelper;)V
-HSPLcom/android/server/pm/DomainVerificationConnection;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 HSPLcom/android/server/pm/DomainVerificationConnection;->doesUserExist(I)Z
 HSPLcom/android/server/pm/DomainVerificationConnection;->filterAppAccess(Ljava/lang/String;II)Z
-HSPLcom/android/server/pm/DomainVerificationConnection;->getCallingUid()I
 HSPLcom/android/server/pm/DomainVerificationConnection;->getCallingUserId()I
 HSPLcom/android/server/pm/DomainVerificationConnection;->scheduleWriteSettings()V
 HPLcom/android/server/pm/DynamicCodeLoggingService;->-$$Nest$fgetmAuditWatchingStopRequested(Lcom/android/server/pm/DynamicCodeLoggingService;)Z
-HSPLcom/android/server/pm/FreeStorageHelper;-><clinit>()V
-HSPLcom/android/server/pm/FreeStorageHelper;-><init>(Lcom/android/server/pm/PackageManagerService;)V
-HSPLcom/android/server/pm/FreeStorageHelper;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerServiceInjector;Landroid/content/Context;Z)V
+HSPLcom/android/server/pm/GentleUpdateHelper$$ExternalSyntheticLambda1;->onUidImportance(II)V
 HSPLcom/android/server/pm/GentleUpdateHelper$$ExternalSyntheticLambda3;-><init>(Lcom/android/server/pm/GentleUpdateHelper;Ljava/lang/String;I)V
-HSPLcom/android/server/pm/GentleUpdateHelper;->onUidImportance(II)V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
+HSPLcom/android/server/pm/GentleUpdateHelper;->onUidImportance(II)V+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/os/Handler;Landroid/os/Handler;
 HSPLcom/android/server/pm/IPackageManagerBase;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;
 HSPLcom/android/server/pm/IPackageManagerBase;->checkUidPermission(Ljava/lang/String;I)I+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/IPackageManagerBase;->getActivityInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo;
-HSPLcom/android/server/pm/IPackageManagerBase;->getApplicationEnabledSetting(Ljava/lang/String;I)I
+HSPLcom/android/server/pm/IPackageManagerBase;->getActivityInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/IPackageManagerBase;->getApplicationEnabledSetting(Ljava/lang/String;I)I+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->getApplicationInfo(Ljava/lang/String;JI)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HPLcom/android/server/pm/IPackageManagerBase;->getBlockUninstallForUser(Ljava/lang/String;I)Z+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HPLcom/android/server/pm/IPackageManagerBase;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/IPackageManagerBase;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->getInstallSourceInfo(Ljava/lang/String;I)Landroid/content/pm/InstallSourceInfo;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->getInstalledPackages(JI)Landroid/content/pm/ParceledListSlice;
 HPLcom/android/server/pm/IPackageManagerBase;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->getNameForUid(I)Ljava/lang/String;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->getPackageInfo(Ljava/lang/String;JI)Landroid/content/pm/PackageInfo;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->getPackageUid(Ljava/lang/String;JI)I+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/IPackageManagerBase;->getPackagesForUid(I)[Ljava/lang/String;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/IPackageManagerBase;->getPackagesForUid(I)[Ljava/lang/String;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
 HSPLcom/android/server/pm/IPackageManagerBase;->getPropertyAsUser(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/PackageManager$Property;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/PackageProperty;Lcom/android/server/pm/PackageProperty;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->getServiceInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ServiceInfo;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->getTargetSdkVersion(Ljava/lang/String;)I+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->hasSystemFeature(Ljava/lang/String;I)Z+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;
 HSPLcom/android/server/pm/IPackageManagerBase;->isInstantApp(Ljava/lang/String;I)Z+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->isPackageAvailable(Ljava/lang/String;I)Z+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HPLcom/android/server/pm/IPackageManagerBase;->isPackageSuspendedForUser(Ljava/lang/String;I)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/IPackageManagerBase;->queryContentProviders(Ljava/lang/String;IJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/IPackageManagerBase;->isPackageSuspendedForUser(Ljava/lang/String;I)Z+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/pm/IPackageManagerBase;->queryContentProviders(Ljava/lang/String;IJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/IPackageManagerBase;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
 HSPLcom/android/server/pm/IPackageManagerBase;->queryIntentServices(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HPLcom/android/server/pm/IPackageManagerBase;->replacePreferredActivity(Landroid/content/IntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;I)V
+HSPLcom/android/server/pm/IPackageManagerBase;->replacePreferredActivity(Landroid/content/IntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;I)V
 HSPLcom/android/server/pm/IPackageManagerBase;->resolveContentProvider(Ljava/lang/String;JI)Landroid/content/pm/ProviderInfo;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/IPackageManagerBase;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
+HSPLcom/android/server/pm/IPackageManagerBase;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper;
 HSPLcom/android/server/pm/IPackageManagerBase;->resolveService(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
 HSPLcom/android/server/pm/IPackageManagerBase;->snapshot()Lcom/android/server/pm/Computer;+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;
-HSPLcom/android/server/pm/InitAppsHelper$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/pm/InitAppsHelper;Landroid/util/ArrayMap;)V
-HSPLcom/android/server/pm/InitAppsHelper$$ExternalSyntheticLambda1;->forEachPackage(Lcom/android/internal/util/function/TriConsumer;)V
-HSPLcom/android/server/pm/InitAppsHelper$$ExternalSyntheticLambda2;-><init>(Lcom/android/internal/util/function/TriConsumer;Landroid/util/ArrayMap;)V
-HSPLcom/android/server/pm/InitAppsHelper$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/pm/InitAppsHelper;->$r8$lambda$VJZW-c31uI8Yaywv2gsqfy0KEng(Lcom/android/internal/util/function/TriConsumer;Landroid/util/ArrayMap;Lcom/android/server/pm/pkg/PackageStateInternal;)V
-HSPLcom/android/server/pm/InitAppsHelper;->$r8$lambda$VWF6nFCGGoc9b6Gi7rkF04KUDnc(Lcom/android/server/pm/InitAppsHelper;Landroid/util/ArrayMap;Lcom/android/internal/util/function/TriConsumer;)V
-HSPLcom/android/server/pm/InitAppsHelper;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/ApexManager;Lcom/android/server/pm/InstallPackageHelper;Ljava/util/List;)V
 HSPLcom/android/server/pm/InitAppsHelper;->getApexScanPartitions()Ljava/util/List;
-HSPLcom/android/server/pm/InitAppsHelper;->getDirsToScanAsSystem()Ljava/util/List;
-HSPLcom/android/server/pm/InitAppsHelper;->getSystemScanPartitions()Ljava/util/List;
-HSPLcom/android/server/pm/InitAppsHelper;->initNonSystemApps(Lcom/android/internal/pm/parsing/PackageParser2;[IJ)V
-HSPLcom/android/server/pm/InitAppsHelper;->initSystemApps(Lcom/android/internal/pm/parsing/PackageParser2;Lcom/android/server/utils/WatchedArrayMap;[IJ)Lcom/android/internal/content/om/OverlayConfig;
-HSPLcom/android/server/pm/InitAppsHelper;->isExpectingBetter(Ljava/lang/String;)Z
-HSPLcom/android/server/pm/InitAppsHelper;->lambda$initSystemApps$0(Lcom/android/internal/util/function/TriConsumer;Landroid/util/ArrayMap;Lcom/android/server/pm/pkg/PackageStateInternal;)V
-HSPLcom/android/server/pm/InitAppsHelper;->lambda$initSystemApps$1(Landroid/util/ArrayMap;Lcom/android/internal/util/function/TriConsumer;)V
-HSPLcom/android/server/pm/InitAppsHelper;->logSystemAppsScanningTime(J)V
 HSPLcom/android/server/pm/InitAppsHelper;->resolveApexToScanPartition(Lcom/android/server/pm/ApexManager$ActiveApexInfo;)Lcom/android/server/pm/ScanPartition;
-HSPLcom/android/server/pm/InitAppsHelper;->scanApexPackagesTraced(Lcom/android/internal/pm/parsing/PackageParser2;)Ljava/util/List;
 HSPLcom/android/server/pm/InitAppsHelper;->scanDirTracedLI(Ljava/io/File;IILcom/android/internal/pm/parsing/PackageParser2;Ljava/util/concurrent/ExecutorService;Lcom/android/server/pm/ApexManager$ActiveApexInfo;)V
 HSPLcom/android/server/pm/InitAppsHelper;->scanSystemDirs(Lcom/android/internal/pm/parsing/PackageParser2;Ljava/util/concurrent/ExecutorService;)V
-HSPLcom/android/server/pm/InitAppsHelper;->updateStubSystemAppsList(Ljava/util/List;)V
-HSPLcom/android/server/pm/InstallPackageHelper$$ExternalSyntheticLambda3;-><init>(Landroid/util/ArrayMap;)V
-HSPLcom/android/server/pm/InstallPackageHelper$$ExternalSyntheticLambda3;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLcom/android/server/pm/InstallPackageHelper;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/AppDataHelper;Lcom/android/server/pm/RemovePackageHelper;Lcom/android/server/pm/DeletePackageHelper;Lcom/android/server/pm/BroadcastHelper;)V
 HSPLcom/android/server/pm/InstallPackageHelper;->addForInitLI(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;IILandroid/os/UserHandle;Lcom/android/server/pm/ApexManager$ActiveApexInfo;)Lcom/android/server/pm/pkg/AndroidPackage;
 HSPLcom/android/server/pm/InstallPackageHelper;->adjustScanFlags(ILcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Landroid/os/UserHandle;Lcom/android/server/pm/pkg/AndroidPackage;)I
 HSPLcom/android/server/pm/InstallPackageHelper;->assertOverlayIsValid(Lcom/android/server/pm/pkg/AndroidPackage;II)V
 HSPLcom/android/server/pm/InstallPackageHelper;->assertPackageIsValid(Lcom/android/server/pm/pkg/AndroidPackage;II)V
 HSPLcom/android/server/pm/InstallPackageHelper;->assertPackageWithSharedUserIdIsPrivileged(Lcom/android/server/pm/pkg/AndroidPackage;)V
-HSPLcom/android/server/pm/InstallPackageHelper;->assertStaticSharedLibraryVersionCodeIsValid(Lcom/android/server/pm/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/InstallPackageHelper;->commitPackageSettings(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/ReconciledPackage;)V
 HSPLcom/android/server/pm/InstallPackageHelper;->commitReconciledScanResultLocked(Lcom/android/server/pm/ReconciledPackage;[I)Lcom/android/server/pm/pkg/AndroidPackage;
-HSPLcom/android/server/pm/InstallPackageHelper;->disableSystemPackageLPw(Lcom/android/server/pm/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/InstallPackageHelper;->getOriginalPackageLocked(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/InstallPackageHelper;->installPackagesFromDir(Ljava/io/File;IILcom/android/internal/pm/parsing/PackageParser2;Ljava/util/concurrent/ExecutorService;Lcom/android/server/pm/ApexManager$ActiveApexInfo;)V
 HSPLcom/android/server/pm/InstallPackageHelper;->maybeClearProfilesForUpgradesLI(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/pkg/AndroidPackage;)V
@@ -6338,17 +4890,11 @@
 HSPLcom/android/server/pm/InstallPackageHelper;->scanApexPackages([Landroid/apex/ApexInfo;IILcom/android/internal/pm/parsing/PackageParser2;Ljava/util/concurrent/ExecutorService;)Ljava/util/List;
 HSPLcom/android/server/pm/InstallPackageHelper;->scanPackageNewLI(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;IIJLandroid/os/UserHandle;Ljava/lang/String;)Lcom/android/server/pm/ScanResult;
 HSPLcom/android/server/pm/InstallPackageHelper;->scanSystemPackageLI(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;IILandroid/os/UserHandle;)Landroid/util/Pair;
+HPLcom/android/server/pm/InstallPackageHelper;->updateSettingsInternalLI(Lcom/android/server/pm/pkg/AndroidPackage;[ILcom/android/server/pm/InstallRequest;)V
 HSPLcom/android/server/pm/InstallRequest;-><init>(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;IILandroid/os/UserHandle;Lcom/android/server/pm/ScanResult;Lcom/android/server/pm/PackageSetting;)V
 HSPLcom/android/server/pm/InstallRequest;->assertScanResultExists()V
-HSPLcom/android/server/pm/InstallRequest;->getApexModuleName()Ljava/lang/String;
-HSPLcom/android/server/pm/InstallRequest;->getDisabledPackageSetting()Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/InstallRequest;->getDynamicSharedLibraryInfos()Ljava/util/List;
-HSPLcom/android/server/pm/InstallRequest;->getInstallSource()Lcom/android/server/pm/InstallSource;
-HSPLcom/android/server/pm/InstallRequest;->getParseFlags()I
-HSPLcom/android/server/pm/InstallRequest;->getParsedPackage()Lcom/android/internal/pm/parsing/pkg/ParsedPackage;
-HSPLcom/android/server/pm/InstallRequest;->getPreVerifiedDomains()Landroid/content/pm/verify/domain/DomainSet;
 HSPLcom/android/server/pm/InstallRequest;->getRealPackageName()Ljava/lang/String;
-HSPLcom/android/server/pm/InstallRequest;->getScanFlags()I
 HSPLcom/android/server/pm/InstallRequest;->getScanRequestOldPackage()Lcom/android/server/pm/pkg/AndroidPackage;
 HSPLcom/android/server/pm/InstallRequest;->getScanRequestOldPackageSetting()Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/InstallRequest;->getScanRequestOriginalPackageSetting()Lcom/android/server/pm/PackageSetting;
@@ -6356,141 +4902,101 @@
 HSPLcom/android/server/pm/InstallRequest;->getScannedPackageSetting()Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/InstallRequest;->getSdkSharedLibraryInfo()Landroid/content/pm/SharedLibraryInfo;
 HSPLcom/android/server/pm/InstallRequest;->getStaticSharedLibraryInfo()Landroid/content/pm/SharedLibraryInfo;
-HSPLcom/android/server/pm/InstallRequest;->getUserId()I
 HSPLcom/android/server/pm/InstallRequest;->isExistingSettingCopied()Z
-HSPLcom/android/server/pm/InstallRequest;->isForceQueryableOverride()Z
-HSPLcom/android/server/pm/InstallRequest;->isInstallReplace()Z
-HSPLcom/android/server/pm/InstallRequest;->isInstallSystem()Z
-HSPLcom/android/server/pm/InstallRequest;->isRollback()Z
 HSPLcom/android/server/pm/InstallRequest;->needsNewAppId()Z
 HSPLcom/android/server/pm/InstallRequest;->onReconcileFinished()V
 HSPLcom/android/server/pm/InstallRequest;->onReconcileStarted()V
-HSPLcom/android/server/pm/InstallRequest;->setApexModuleName(Ljava/lang/String;)V
-HSPLcom/android/server/pm/InstallRequest;->setLibraryConsumers(Ljava/util/ArrayList;)V
-HSPLcom/android/server/pm/InstallRequest;->setScannedPackageSettingAppId(I)V
-HSPLcom/android/server/pm/InstallSource;-><clinit>()V
 HSPLcom/android/server/pm/InstallSource;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZZLcom/android/server/pm/PackageSignatures;I)V
 HSPLcom/android/server/pm/InstallSource;->create(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;IZZ)Lcom/android/server/pm/InstallSource;
 HSPLcom/android/server/pm/InstallSource;->createInternal(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;IZZLcom/android/server/pm/PackageSignatures;)Lcom/android/server/pm/InstallSource;
-HSPLcom/android/server/pm/InstallSource;->intern(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/pm/InstallSource;->setInitiatingPackageSignatures(Lcom/android/server/pm/PackageSignatures;)Lcom/android/server/pm/InstallSource;
 HSPLcom/android/server/pm/InstallSource;->setIsOrphaned(Z)Lcom/android/server/pm/InstallSource;
 HSPLcom/android/server/pm/InstallSource;->setUpdateOwnerPackageName(Ljava/lang/String;)Lcom/android/server/pm/InstallSource;
-HSPLcom/android/server/pm/Installer$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/pm/Installer;)V
-HSPLcom/android/server/pm/Installer$Batch;->execute(Lcom/android/server/pm/Installer;)V
-HSPLcom/android/server/pm/Installer;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/pm/Installer;-><init>(Landroid/content/Context;Z)V
+HSPLcom/android/server/pm/Installer$Batch;->createAppData(Landroid/os/CreateAppDataArgs;)Ljava/util/concurrent/CompletableFuture;
+HSPLcom/android/server/pm/Installer$Batch;->execute(Lcom/android/server/pm/Installer;)V+]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;
 HSPLcom/android/server/pm/Installer;->buildCreateAppDataArgs(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;IZ)Landroid/os/CreateAppDataArgs;
 HSPLcom/android/server/pm/Installer;->checkBeforeRemote()Z+]Ljava/util/concurrent/CountDownLatch;Ljava/util/concurrent/CountDownLatch;
-HSPLcom/android/server/pm/Installer;->clearAppData(Ljava/lang/String;Ljava/lang/String;IIJ)V+]Landroid/os/IInstalld;Landroid/os/IInstalld$Stub$Proxy;]Ljava/lang/Thread;Ljava/lang/Thread;
-HSPLcom/android/server/pm/Installer;->connect()V
-HSPLcom/android/server/pm/Installer;->executeDeferredActions()V
+HSPLcom/android/server/pm/Installer;->clearAppData(Ljava/lang/String;Ljava/lang/String;IIJ)V+]Landroid/os/IInstalld;Landroid/os/IInstalld$Stub$Proxy;]Ljava/lang/Thread;Ljava/lang/Thread;,Lcom/android/server/ServiceThread;
 HPLcom/android/server/pm/Installer;->getAppSize(Ljava/lang/String;[Ljava/lang/String;III[J[Ljava/lang/String;Landroid/content/pm/PackageStats;)V+]Landroid/os/IInstalld;Landroid/os/IInstalld$Stub$Proxy;]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Ldalvik/system/BlockGuard$VmPolicy;Landroid/os/StrictMode$5;,Ldalvik/system/BlockGuard$2;
-HSPLcom/android/server/pm/Installer;->invalidateMounts()V
-HSPLcom/android/server/pm/Installer;->onStart()V
 HSPLcom/android/server/pm/Installer;->setAppQuota(Ljava/lang/String;IIJ)V+]Landroid/os/IInstalld;Landroid/os/IInstalld$Stub$Proxy;]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;
-HSPLcom/android/server/pm/InstantAppRegistry$1;-><init>(Lcom/android/server/pm/InstantAppRegistry;)V
-HSPLcom/android/server/pm/InstantAppRegistry$2;-><init>(Lcom/android/server/pm/InstantAppRegistry;Lcom/android/server/pm/InstantAppRegistry;Lcom/android/server/utils/Watchable;)V
-HSPLcom/android/server/pm/InstantAppRegistry$CookiePersistence;-><init>(Lcom/android/server/pm/InstantAppRegistry;Landroid/os/Looper;)V
-HSPLcom/android/server/pm/InstantAppRegistry;-><init>(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/DeletePackageHelper;)V
-HSPLcom/android/server/pm/InstantAppRegistry;->makeCache()Lcom/android/server/utils/SnapshotCache;
-HSPLcom/android/server/pm/InstantAppRegistry;->registerObserver(Lcom/android/server/utils/Watcher;)V
 HSPLcom/android/server/pm/InstantAppRegistry;->snapshot()Lcom/android/server/pm/InstantAppRegistry;
 HPLcom/android/server/pm/InstantAppResolver;->buildRequestInfo(Landroid/content/pm/InstantAppRequest;)Landroid/content/pm/InstantAppRequestInfo;
 HPLcom/android/server/pm/InstantAppResolver;->doInstantAppResolutionPhaseOne(Lcom/android/server/pm/Computer;Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/InstantAppResolverConnection;Landroid/content/pm/InstantAppRequest;)Landroid/content/pm/AuxiliaryResolveInfo;
+HPLcom/android/server/pm/InstantAppResolver;->parseDigest(Landroid/content/Intent;)Landroid/content/pm/InstantAppResolveInfo$InstantAppDigest;
 HPLcom/android/server/pm/InstantAppResolver;->sanitizeIntent(Landroid/content/Intent;)Landroid/content/Intent;
 HPLcom/android/server/pm/InstantAppResolverConnection;->getInstantAppResolveInfoList(Landroid/content/pm/InstantAppRequestInfo;)Ljava/util/List;
-HSPLcom/android/server/pm/InstructionSets;-><clinit>()V
 HSPLcom/android/server/pm/InstructionSets;->getDexCodeInstructionSet(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/pm/InstructionSets;->getPreferredInstructionSet()Ljava/lang/String;
 HSPLcom/android/server/pm/InstructionSets;->getPrimaryInstructionSet(Lcom/android/server/pm/PackageAbiHelper$Abis;)Ljava/lang/String;
-HSPLcom/android/server/pm/KeySetHandle;-><init>(JI)V
-HSPLcom/android/server/pm/KeySetHandle;->getRefCountLPr()I
-HSPLcom/android/server/pm/KeySetHandle;->setRefCountLPw(I)V
 HSPLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;-><init>(Lcom/android/server/pm/KeySetManagerService;JILjava/security/PublicKey;)V
 HSPLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;-><init>(Lcom/android/server/pm/KeySetManagerService;JILjava/security/PublicKey;Lcom/android/server/pm/KeySetManagerService$PublicKeyHandle-IA;)V
-HSPLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;->getKey()Ljava/security/PublicKey;
-HSPLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;->incrRefCountLPw()V
 HSPLcom/android/server/pm/KeySetManagerService;-><init>(Lcom/android/server/pm/KeySetManagerService;Lcom/android/server/utils/WatchedArrayMap;)V
-HSPLcom/android/server/pm/KeySetManagerService;-><init>(Lcom/android/server/utils/WatchedArrayMap;)V
 HSPLcom/android/server/pm/KeySetManagerService;->addDefinedKeySetsToPackageLPw(Lcom/android/server/pm/PackageSetting;Ljava/util/Map;)V
-HSPLcom/android/server/pm/KeySetManagerService;->addRefCountsFromSavedPackagesLPw(Landroid/util/ArrayMap;)V
 HSPLcom/android/server/pm/KeySetManagerService;->addScannedPackageLPw(Lcom/android/server/pm/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/KeySetManagerService;->addSigningKeySetToPackageLPw(Lcom/android/server/pm/PackageSetting;Landroid/util/ArraySet;)V
 HSPLcom/android/server/pm/KeySetManagerService;->addUpgradeKeySetsToPackageLPw(Lcom/android/server/pm/PackageSetting;Ljava/util/Set;)V
 HSPLcom/android/server/pm/KeySetManagerService;->assertScannedPackageValid(Lcom/android/server/pm/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/KeySetManagerService;->getPublicKeysFromKeySetLPr(J)Landroid/util/ArraySet;
 HSPLcom/android/server/pm/KeySetManagerService;->readKeySetListLPw(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/pm/KeySetManagerService;->readKeySetsLPw(Lcom/android/modules/utils/TypedXmlPullParser;Landroid/util/ArrayMap;)V
 HSPLcom/android/server/pm/KeySetManagerService;->readKeysLPw(Lcom/android/modules/utils/TypedXmlPullParser;)V
 HSPLcom/android/server/pm/KeySetManagerService;->readPublicKeyLPw(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/pm/KeySetManagerService;->shouldCheckUpgradeKeySetLocked(Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/pkg/SharedUserApi;I)Z
-HSPLcom/android/server/pm/KeySetManagerService;->writeKeySetsLPr(Lcom/android/modules/utils/TypedXmlSerializer;)V
-HSPLcom/android/server/pm/KeySetManagerService;->writePublicKeysLPr(Lcom/android/modules/utils/TypedXmlSerializer;)V
+HSPLcom/android/server/pm/KeySetManagerService;->writeKeySetsLPr(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/lang/Long;Ljava/lang/Long;
+HSPLcom/android/server/pm/KeySetManagerService;->writePublicKeysLPr(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/KeySetManagerService$PublicKeyHandle;Lcom/android/server/pm/KeySetManagerService$PublicKeyHandle;]Ljava/security/PublicKey;Lcom/android/org/conscrypt/OpenSSLRSAPublicKey;,Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
 HSPLcom/android/server/pm/KnownPackages;-><init>(Lcom/android/server/pm/DefaultAppProvider;Ljava/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/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/pm/KnownPackages;->getKnownPackageNames(Lcom/android/server/pm/Computer;II)[Ljava/lang/String;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/DefaultAppProvider;Lcom/android/server/pm/DefaultAppProvider;
-HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onShortcutChangedInner(Ljava/lang/String;I)V
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onPackageChanged(Ljava/lang/String;)V
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onShortcutChangedInner(Ljava/lang/String;I)V+]Landroid/content/pm/ShortcutServiceInternal;Lcom/android/server/pm/ShortcutService$LocalService;]Landroid/os/RemoteCallbackList;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$PackageCallbackList;]Landroid/content/pm/IOnAppsChangedListener;Landroid/content/pm/IOnAppsChangedListener$Stub$Proxy;
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->canAccessProfile(IIIILjava/lang/String;)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Landroid/os/UserManager;Landroid/os/UserManager;
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->canAccessProfile(ILjava/lang/String;)Z+]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;
-HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getAppUsageLimit(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/LauncherApps$AppUsageLimit;+]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->ensureShortcutPermission(IILjava/lang/String;)V
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getAppUsageLimit(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/LauncherApps$AppUsageLimit;+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getLauncherActivities(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Ljava/util/HashSet;Ljava/util/HashSet;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Landroid/os/UserManager;Landroid/os/UserManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/app/admin/DevicePolicyManager;Landroid/app/admin/DevicePolicyManager;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/content/pm/LauncherActivityInfoInternal;Landroid/content/pm/LauncherActivityInfoInternal;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/content/Intent;Landroid/content/Intent;
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getShortcuts(Ljava/lang/String;Landroid/content/pm/ShortcutQueryWrapper;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
 HSPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectBinderCallingPid()I
 HSPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectBinderCallingUid()I
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectCallingUserId()I
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectClearCallingIdentity()J
-HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectHasInteractAcrossUsersFullPermission(II)Z
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectHasInteractAcrossUsersFullPermission(II)Z+]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectRestoreCallingIdentity(J)V
-HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isEnabledProfileOf(Lcom/android/server/pm/LauncherAppsService$BroadcastCookie;Landroid/os/UserHandle;Ljava/lang/String;)Z
-HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->queryActivitiesForUser(Ljava/lang/String;Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;+]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isEnabledProfileOf(Lcom/android/server/pm/LauncherAppsService$BroadcastCookie;Landroid/os/UserHandle;Ljava/lang/String;)Z+]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->queryActivitiesForUser(Ljava/lang/String;Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;]Landroid/os/UserHandle;Landroid/os/UserHandle;
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->queryIntentLauncherActivities(Landroid/content/Intent;ILandroid/os/UserHandle;)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->shouldHideFromSuggestions(Ljava/lang/String;Landroid/os/UserHandle;)Z
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->shouldHideFromSuggestions(Ljava/lang/String;Landroid/os/UserHandle;)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->shouldShowSyntheticActivity(Landroid/os/UserHandle;Landroid/content/pm/ApplicationInfo;)Z+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->verifyCallingPackage(Ljava/lang/String;I)V+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
-HSPLcom/android/server/pm/MovePackageHelper$MoveCallbacks;-><init>(Landroid/os/Looper;)V
-HPLcom/android/server/pm/OtaDexoptService$1;->dexopt(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
+HSPLcom/android/server/pm/ModuleInfoProvider;->getInstalledModules(I)Ljava/util/List;+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/ModuleInfoProvider;Lcom/android/server/pm/ModuleInfoProvider;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/pm/OtaDexoptService;->moveAbArtifacts(Lcom/android/server/pm/Installer;)V
 HSPLcom/android/server/pm/PackageAbiHelper$Abis;-><init>(Ljava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths;-><init>(Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths;->applyTo(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;)V
-HSPLcom/android/server/pm/PackageAbiHelperImpl;-><init>()V
 HSPLcom/android/server/pm/PackageAbiHelperImpl;->calculateBundledApkRoot(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/pm/PackageAbiHelperImpl;->deriveCodePathName(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/pm/PackageAbiHelperImpl;->deriveNativeLibraryPaths(Lcom/android/server/pm/PackageAbiHelper$Abis;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;ZZ)Lcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths;
 HSPLcom/android/server/pm/PackageAbiHelperImpl;->deriveNativeLibraryPaths(Lcom/android/server/pm/pkg/AndroidPackage;ZZLjava/io/File;)Lcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths;
 HSPLcom/android/server/pm/PackageAbiHelperImpl;->derivePackageAbi(Lcom/android/server/pm/pkg/AndroidPackage;ZZLjava/lang/String;Ljava/io/File;)Landroid/util/Pair;
 HSPLcom/android/server/pm/PackageAbiHelperImpl;->getBundledAppAbi(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/pm/PackageAbiHelper$Abis;
-HSPLcom/android/server/pm/PackageArchiver;-><clinit>()V
 HSPLcom/android/server/pm/PackageArchiver;->isArchived(Lcom/android/server/pm/pkg/PackageUserState;)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;
 HPLcom/android/server/pm/PackageArchiver;->isArchivingEnabled()Z
-HSPLcom/android/server/pm/PackageDexOptimizer$1;-><init>()V
-HSPLcom/android/server/pm/PackageDexOptimizer$1;->getPowerManager(Landroid/content/Context;)Landroid/os/PowerManager;
-HSPLcom/android/server/pm/PackageDexOptimizer;-><clinit>()V
-HSPLcom/android/server/pm/PackageDexOptimizer;-><init>(Lcom/android/server/pm/Installer;Ljava/lang/Object;Landroid/content/Context;Ljava/lang/String;)V
-HSPLcom/android/server/pm/PackageDexOptimizer;-><init>(Lcom/android/server/pm/PackageDexOptimizer$Injector;Lcom/android/server/pm/Installer;Ljava/lang/Object;Landroid/content/Context;Ljava/lang/String;)V
-HPLcom/android/server/pm/PackageDexOptimizer;->dexOptPath(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/PackageStateInternal;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;IILcom/android/server/pm/CompilerStats$PackageStats;ZLjava/lang/String;Ljava/lang/String;I)I
-HPLcom/android/server/pm/PackageDexOptimizer;->performDexOptLI(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/PackageStateInternal;[Ljava/lang/String;Lcom/android/server/pm/CompilerStats$PackageStats;Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;Lcom/android/server/pm/dex/DexoptOptions;)I
-HSPLcom/android/server/pm/PackageHandler;-><init>(Landroid/os/Looper;Lcom/android/server/pm/PackageManagerService;)V
-HSPLcom/android/server/pm/PackageInstallerService$1;-><init>()V
-HPLcom/android/server/pm/PackageInstallerService$Callbacks;->handleMessage(Landroid/os/Message;)V
-HSPLcom/android/server/pm/PackageInstallerService;-><clinit>()V
+HSPLcom/android/server/pm/PackageHandler;->doHandleMessage(Landroid/os/Message;)V
+HPLcom/android/server/pm/PackageInstallerService$Callbacks;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Ljava/util/function/IntPredicate;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$$ExternalSyntheticLambda3;,Lcom/android/server/pm/PackageInstallerService$$ExternalSyntheticLambda5;
 HPLcom/android/server/pm/PackageInstallerService;->createSessionInternal(Landroid/content/pm/PackageInstaller$SessionParams;Ljava/lang/String;Ljava/lang/String;II)I
 HPLcom/android/server/pm/PackageInstallerService;->getSessionInfo(I)Landroid/content/pm/PackageInstaller$SessionInfo;
 HSPLcom/android/server/pm/PackageInstallerService;->isStageName(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/PackageInstallerService;->writeSessions()Z+]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Lcom/android/server/pm/PackageInstallerSession;Lcom/android/server/pm/PackageInstallerSession;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/PackageInstallerSession;-><init>(Lcom/android/server/pm/PackageInstallerService$InternalCallback;Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageSessionProvider;Lcom/android/server/pm/SilentUpdatePolicy;Landroid/os/Looper;Lcom/android/server/pm/StagingManager;IIILcom/android/server/pm/InstallSource;Landroid/content/pm/PackageInstaller$SessionParams;JJLjava/io/File;Ljava/lang/String;[Landroid/content/pm/InstallationFile;Landroid/util/ArrayMap;ZZZZ[IIZZZILjava/lang/String;Landroid/content/pm/verify/domain/DomainSet;)V
+HSPLcom/android/server/pm/PackageInstallerSession;->assertPreparedAndNotDestroyedLocked(Ljava/lang/String;)V
 HSPLcom/android/server/pm/PackageInstallerSession;->buildAppIconFile(ILjava/io/File;)Ljava/io/File;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HPLcom/android/server/pm/PackageInstallerSession;->computeProgressLocked(Z)V
+HPLcom/android/server/pm/PackageInstallerSession;->computeProgressLocked(Z)V+]Lcom/android/server/pm/PackageInstallerService$InternalCallback;Lcom/android/server/pm/PackageInstallerService$InternalCallback;
 HPLcom/android/server/pm/PackageInstallerSession;->doWriteInternal(Ljava/lang/String;JJLandroid/os/ParcelFileDescriptor;)Landroid/os/ParcelFileDescriptor;
-HPLcom/android/server/pm/PackageInstallerSession;->generateInfoInternal(ZZ)Landroid/content/pm/PackageInstaller$SessionInfo;
+HPLcom/android/server/pm/PackageInstallerSession;->generateInfoInternal(ZZ)Landroid/content/pm/PackageInstaller$SessionInfo;+]Ljava/io/File;Ljava/io/File;]Lcom/android/server/pm/PackageInstallerSession;Lcom/android/server/pm/PackageInstallerSession;]Landroid/content/pm/PackageInstaller$SessionParams;Landroid/content/pm/PackageInstaller$SessionParams;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/pm/PackageInstallerSession;->getChildSessionIdsLocked()[I+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/PackageInstallerSession;->getInstallationFilesLocked()[Landroid/content/pm/InstallationFile;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
 HPLcom/android/server/pm/PackageInstallerSession;->getInstallerUid()I
 HPLcom/android/server/pm/PackageInstallerSession;->getNames()[Ljava/lang/String;
 HSPLcom/android/server/pm/PackageInstallerSession;->isCommitted()Z+]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;
+HSPLcom/android/server/pm/PackageInstallerSession;->isDataLoaderInstallation()Z
 HSPLcom/android/server/pm/PackageInstallerSession;->readFromXml(Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/server/pm/PackageInstallerService$InternalCallback;Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Landroid/os/Looper;Lcom/android/server/pm/StagingManager;Ljava/io/File;Lcom/android/server/pm/PackageSessionProvider;Lcom/android/server/pm/SilentUpdatePolicy;)Lcom/android/server/pm/PackageInstallerSession;
-HPLcom/android/server/pm/PackageInstallerSession;->validateApkInstallLocked()Landroid/content/pm/parsing/PackageLite;
-HSPLcom/android/server/pm/PackageInstallerSession;->write(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/io/File;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/pm/PackageInstallerSession;Lcom/android/server/pm/PackageInstallerSession;]Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;]Ljava/io/File;Ljava/io/File;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageInstallerSession$PerFileChecksum;Lcom/android/server/pm/PackageInstallerSession$PerFileChecksum;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/pm/Checksum;Landroid/content/pm/Checksum;]Landroid/content/pm/DataLoaderParams;Landroid/content/pm/DataLoaderParams;]Landroid/content/pm/InstallationFile;Landroid/content/pm/InstallationFile;
+HPLcom/android/server/pm/PackageInstallerSession;->validateApkInstallLocked()Landroid/content/pm/parsing/PackageLite;+]Ljava/io/File;Ljava/io/File;]Lcom/android/server/pm/PackageInstallerSession;Lcom/android/server/pm/PackageInstallerSession;]Landroid/content/pm/parsing/ApkLite;Landroid/content/pm/parsing/ApkLite;]Landroid/content/pm/parsing/result/ParseTypeImpl;Landroid/content/pm/parsing/result/ParseTypeImpl;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/pm/parsing/PackageLite;Landroid/content/pm/parsing/PackageLite;]Landroid/content/pm/parsing/result/ParseResult;Landroid/content/pm/parsing/result/ParseTypeImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/pm/PackageInstallerSession;->write(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/io/File;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/PackageInstallerSession;Lcom/android/server/pm/PackageInstallerSession;]Ljava/io/File;Ljava/io/File;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageInstallerSession$PerFileChecksum;Lcom/android/server/pm/PackageInstallerSession$PerFileChecksum;]Landroid/content/pm/Checksum;Landroid/content/pm/Checksum;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;
 HSPLcom/android/server/pm/PackageKeySetData;-><init>()V
 HSPLcom/android/server/pm/PackageKeySetData;-><init>(Lcom/android/server/pm/PackageKeySetData;)V
 HSPLcom/android/server/pm/PackageKeySetData;->getAliases()Landroid/util/ArrayMap;
@@ -6499,131 +5005,51 @@
 HSPLcom/android/server/pm/PackageKeySetData;->removeAllDefinedKeySets()V
 HSPLcom/android/server/pm/PackageKeySetData;->removeAllUpgradeKeySets()V
 HSPLcom/android/server/pm/PackageKeySetData;->setAliases(Ljava/util/Map;)V
-HSPLcom/android/server/pm/PackageKeySetData;->setProperSigningKeySet(J)V
-HSPLcom/android/server/pm/PackageManagerException;-><init>(ILjava/lang/String;)V
 HSPLcom/android/server/pm/PackageManagerException;-><init>(ILjava/lang/String;I)V
-HSPLcom/android/server/pm/PackageManagerException;-><init>(ILjava/lang/String;Ljava/lang/Throwable;)V
 HSPLcom/android/server/pm/PackageManagerException;->ofInternalError(Ljava/lang/String;I)Lcom/android/server/pm/PackageManagerException;
-HSPLcom/android/server/pm/PackageManagerInternalBase;-><init>(Lcom/android/server/pm/PackageManagerService;)V
-HPLcom/android/server/pm/PackageManagerInternalBase;->canAccessInstantApps(II)Z+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HPLcom/android/server/pm/PackageManagerInternalBase;->canAccessInstantApps(II)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HPLcom/android/server/pm/PackageManagerInternalBase;->canQueryPackage(ILjava/lang/String;)Z+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->filterAppAccess(Ljava/lang/String;IIZ)Z+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
-HSPLcom/android/server/pm/PackageManagerInternalBase;->forEachPackageState(Ljava/util/function/Consumer;)V
-HSPLcom/android/server/pm/PackageManagerInternalBase;->getApplicationEnabledState(Ljava/lang/String;I)I
+HSPLcom/android/server/pm/PackageManagerInternalBase;->getApplicationEnabledState(Ljava/lang/String;I)I+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->getApplicationInfo(Ljava/lang/String;JII)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HPLcom/android/server/pm/PackageManagerInternalBase;->getDistractingPackageRestrictions(Ljava/lang/String;I)I
+HPLcom/android/server/pm/PackageManagerInternalBase;->getDistractingPackageRestrictions(Ljava/lang/String;I)I+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->getInstantAppPackageName(I)Ljava/lang/String;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->getKnownPackageNames(II)[Ljava/lang/String;+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackage(I)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
-HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackage(Ljava/lang/String;)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
-HPLcom/android/server/pm/PackageManagerInternalBase;->getPackageInfo(Ljava/lang/String;JII)Landroid/content/pm/PackageInfo;
-HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackageStateInternal(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
-HPLcom/android/server/pm/PackageManagerInternalBase;->getPackageTargetSdkVersion(Ljava/lang/String;)I
+HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackage(Ljava/lang/String;)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
+HPLcom/android/server/pm/PackageManagerInternalBase;->getPackageInfo(Ljava/lang/String;JII)Landroid/content/pm/PackageInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackageStateInternal(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;
+HPLcom/android/server/pm/PackageManagerInternalBase;->getPackageTargetSdkVersion(Ljava/lang/String;)I+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackageUid(Ljava/lang/String;JI)I+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/PackageManagerInternalBase;->getSharedUserApi(I)Lcom/android/server/pm/pkg/SharedUserApi;
-HSPLcom/android/server/pm/PackageManagerInternalBase;->getUidTargetSdkVersion(I)I+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/PackageManagerInternalBase;->getUidTargetSdkVersion(I)I+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->grantImplicitAccess(ILandroid/content/Intent;IIZ)V+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->grantImplicitAccess(ILandroid/content/Intent;IIZZ)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/pm/PackageManagerInternalBase;->isInstantApp(Ljava/lang/String;I)Z
+HSPLcom/android/server/pm/PackageManagerInternalBase;->isCallerInstallerOfRecord(Lcom/android/server/pm/pkg/AndroidPackage;I)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/PackageManagerInternalBase;->isInstantApp(Ljava/lang/String;I)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->isPackageEphemeral(ILjava/lang/String;)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->isPackageFrozen(Ljava/lang/String;II)Z+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HPLcom/android/server/pm/PackageManagerInternalBase;->isPackageStateProtected(Ljava/lang/String;I)Z
-HSPLcom/android/server/pm/PackageManagerInternalBase;->isPackageSuspended(Ljava/lang/String;I)Z
+HSPLcom/android/server/pm/PackageManagerInternalBase;->isPackageStateProtected(Ljava/lang/String;I)Z+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/ProtectedPackages;Lcom/android/server/pm/ProtectedPackages;
+HSPLcom/android/server/pm/PackageManagerInternalBase;->isPackageSuspended(Ljava/lang/String;I)Z+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->isPermissionsReviewRequired(Ljava/lang/String;I)Z+]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->notifyComponentUsed(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HPLcom/android/server/pm/PackageManagerInternalBase;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;JII)Ljava/util/List;
-HSPLcom/android/server/pm/PackageManagerInternalBase;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;JIIZ)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerInternalBase;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;JII)Ljava/util/List;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/PackageManagerInternalBase;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;JIIZ)Ljava/util/List;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->resolveContentProvider(Ljava/lang/String;JII)Landroid/content/pm/ProviderInfo;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->resolveService(Landroid/content/Intent;Ljava/lang/String;JII)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->snapshot()Lcom/android/server/pm/Computer;+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;
 HSPLcom/android/server/pm/PackageManagerInternalBase;->snapshot()Lcom/android/server/pm/snapshot/PackageDataSnapshot;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda10;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda10;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda11;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda11;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda12;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda12;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda13;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda14;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda15;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda16;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda17;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda17;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda18;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda19;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda19;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda1;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda20;-><init>(Lcom/android/server/pm/verify/domain/DomainVerificationService;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda20;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda21;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda21;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda22;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda22;->produce(Ljava/lang/Class;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda23;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda24;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda24;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda25;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda26;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda26;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda27;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda28;-><init>(Landroid/content/Context;Lcom/android/server/pm/Installer;Ljava/lang/Object;Lcom/android/server/pm/PackageManagerTracedLock;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda28;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda29;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda29;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda2;-><init>(Lcom/android/server/pm/PackageManagerService;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda30;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda30;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda32;-><init>(Lcom/android/server/pm/verify/domain/DomainVerificationService;Landroid/os/Handler;Lcom/android/server/pm/PackageManagerTracedLock;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda32;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda33;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda33;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda34;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda34;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda35;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda35;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda36;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda36;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda37;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda37;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda38;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda38;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda3;-><init>(Lcom/android/server/pm/PackageManagerService;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda41;-><init>(Lcom/android/server/pm/PackageManagerService;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda42;-><init>(Lcom/android/server/pm/PackageManagerService;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda45;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;I)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda45;->run()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda47;->getOrThrow()Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda50;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda51;-><init>()V
 HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda55;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda6;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda6;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda7;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda7;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda8;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda8;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda9;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda9;->produce(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerService$1;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 HSPLcom/android/server/pm/PackageManagerService$1;->onChange(Lcom/android/server/utils/Watchable;)V
-HSPLcom/android/server/pm/PackageManagerService$2;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$3;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/compat/PlatformCompat;)V
 HSPLcom/android/server/pm/PackageManagerService$3;->getHiddenApiWhitelistedApps()Ljava/util/Set;
-HSPLcom/android/server/pm/PackageManagerService$DefaultSystemWrapper;-><init>()V
-HSPLcom/android/server/pm/PackageManagerService$DefaultSystemWrapper;-><init>(Lcom/android/server/pm/PackageManagerService$DefaultSystemWrapper-IA;)V
-HSPLcom/android/server/pm/PackageManagerService$DefaultSystemWrapper;->disablePackageCaches()V
-HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->checkPackageStartable(Ljava/lang/String;I)V
+HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->checkPackageStartable(Ljava/lang/String;I)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;
 HPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->getSystemAvailableFeatures()Landroid/content/pm/ParceledListSlice;
-HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->getUserMinAspectRatio(Ljava/lang/String;I)I+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->isProtectedBroadcast(Ljava/lang/String;)Z+]Ljava/lang/String;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->logAppProcessStartIfNeeded(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;I)V
-HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->notifyDexLoad(Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;)V+]Lcom/android/server/pm/PackageManagerLocal$FilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;]Lcom/android/server/art/DexUseManagerLocal;Lcom/android/server/art/DexUseManagerLocal;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->logAppProcessStartIfNeeded(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;I)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->notifyDexLoad(Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;)V+]Lcom/android/server/pm/PackageManagerLocal$FilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;]Lcom/android/server/art/DexUseManagerLocal;Lcom/android/server/art/DexUseManagerLocal;]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Ljava/lang/Object;Ljava/lang/String;]Landroid/os/UserHandle;Landroid/os/UserHandle;
 HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->notifyPackageUse(Ljava/lang/String;I)V
-HPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->notifyPackagesReplacedReceived([Ljava/lang/String;)V
+HPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->notifyPackagesReplacedReceived([Ljava/lang/String;)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->setComponentEnabledSetting(Landroid/content/ComponentName;IIILjava/lang/String;)V
-HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->setComponentEnabledSetting(Landroid/content/ComponentName;IIILjava/lang/String;)V+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getIncrementalStatesInfo(Ljava/lang/String;II)Landroid/content/pm/IncrementalStatesInfo;+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPermissionManager()Lcom/android/server/pm/permission/PermissionManagerServiceInternal;
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getProtectedPackages()Lcom/android/server/pm/ProtectedPackages;
@@ -6634,65 +5060,32 @@
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isSameApp(Ljava/lang/String;JII)Z+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->notifyPackageUse(Ljava/lang/String;I)V
 HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->writePermissionSettings([IZ)V+]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;
-HSPLcom/android/server/pm/PackageManagerService$Snapshot;-><init>(Lcom/android/server/pm/PackageManagerService;I)V
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$3kw1stMVsxw0hUSyOsS2FPnzpHQ(Landroid/content/Context;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/DefaultAppProvider;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$49MB1VcYhb5vNzYT8bGtg2MigyY(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/SystemConfig;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$Ak19Qy9hQiUyM128pbH0sxNNbxE(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Landroid/os/Handler;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$AtsdeBa8co53jl7kYt8ysrzmEo8(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/internal/pm/parsing/PackageParser2;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$LT765XNHeztBOay7rENBSJ4FpQo(Lcom/android/server/pm/verify/domain/DomainVerificationService;Landroid/os/Handler;Lcom/android/server/pm/PackageManagerTracedLock;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/Settings;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$OdKicpQs5x3SrKKW4-UnxBv2k4k(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/dex/ArtManagerService;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$P8SY61CGf4lgD7vmEgc6OJo18Jc(Landroid/content/Context;Lcom/android/server/pm/Installer;Ljava/lang/Object;Lcom/android/server/pm/PackageManagerTracedLock;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/UserManagerService;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$RJDxvoMUIzns2AakZT-srNoyjqA(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/BackgroundDexOptService;
+HSPLcom/android/server/pm/PackageManagerService$Snapshot;-><init>(Lcom/android/server/pm/PackageManagerService;I)V+]Lcom/android/server/utils/WatchedSparseBooleanArray;Lcom/android/server/utils/WatchedSparseBooleanArray;]Lcom/android/server/pm/InstantAppRegistry;Lcom/android/server/pm/InstantAppRegistry;]Lcom/android/server/pm/resolution/ComponentResolver;Lcom/android/server/pm/resolution/ComponentResolver;
 HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$SVfaWm0ftYEb_i0fK608nQic6a8(ILjava/util/function/Consumer;Lcom/android/server/pm/pkg/PackageStateInternal;)V
 HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$Sj0TiBD2qrAz-kSBJZjvN19KwM8(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;I)V
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$Ss9DVkISkXku8V-CYhxH_GTx3uk(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/compat/PlatformCompat;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$WTjLzvsZwKnygY1dXmiEXrU4wns(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Landroid/os/incremental/IncrementalManager;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$XIxgBW0a_Dim0prfYI26N63QYA8(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/permission/LegacyPermissionManagerInternal;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$XK0jyd8NWE8sX2dLVxJDSWyX-fc(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/resolution/ComponentResolver;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$bP6O2EM4vQjnURNcnMI3AEd8jvE(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/ApexManager;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$biXVbknQI0VSnqBwrsRYdId7lOg(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Landroid/util/DisplayMetrics;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$cgf9HzQDpIYBAM1FfODw1LJfeaA(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/SharedLibrariesImpl;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$f76IiBvzWjWrK7cEm3Fwh4D5vPI(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/PackageDexOptimizer;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$g8phPHwnEQKwNibO76kbTV-ernk(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/UpdateOwnershipHelper;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$gIhdWIFiJVJIMETTUG8yHCSxQyU(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/dex/DexManager;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$gt9gWkZ6s9W-_z9hX2383OetJQg(Lcom/android/server/pm/verify/domain/DomainVerificationService;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$hV-hx61rt_I-GSVq2c9QBKlQU-A(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/AppsFilterImpl;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$jI7_wgzMOIg2_ALwQh3N7aqxwk0(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/PackageMonitorCallbackHelper;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$peRMMEdjCdKA187FsiE-4lz5Nvw(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/dex/DynamicCodeLogger;
-HSPLcom/android/server/pm/PackageManagerService;->$r8$lambda$yd0vfnhyLdiG7JVKGsIrzU91iec(Landroid/content/Context;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/permission/PermissionManagerServiceInternal;
 HSPLcom/android/server/pm/PackageManagerService;->-$$Nest$fgetmAndroidApplication(Lcom/android/server/pm/PackageManagerService;)Landroid/content/pm/ApplicationInfo;
 HSPLcom/android/server/pm/PackageManagerService;->-$$Nest$fgetmInstantAppInstallerInfo(Lcom/android/server/pm/PackageManagerService;)Landroid/content/pm/ResolveInfo;
-HSPLcom/android/server/pm/PackageManagerService;->-$$Nest$fgetmInstrumentation(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/utils/WatchedArrayMap;
 HSPLcom/android/server/pm/PackageManagerService;->-$$Nest$fgetmResolveActivity(Lcom/android/server/pm/PackageManagerService;)Landroid/content/pm/ActivityInfo;
 HSPLcom/android/server/pm/PackageManagerService;->-$$Nest$fgetmResolveIntentHelper(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/ResolveIntentHelper;
 HSPLcom/android/server/pm/PackageManagerService;->-$$Nest$fgetmSharedLibraries(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/SharedLibrariesImpl;
 HSPLcom/android/server/pm/PackageManagerService;->-$$Nest$fgetmSuspendPackageHelper(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/SuspendPackageHelper;
 HSPLcom/android/server/pm/PackageManagerService;->-$$Nest$fgetmWebInstantAppsDisabled(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/utils/WatchedSparseBooleanArray;
 HSPLcom/android/server/pm/PackageManagerService;->-$$Nest$mnotifyPackageUseInternal(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;I)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;
-HSPLcom/android/server/pm/PackageManagerService;->-$$Nest$msetEnabledSettings(Lcom/android/server/pm/PackageManagerService;Ljava/util/List;ILjava/lang/String;)V
-HSPLcom/android/server/pm/PackageManagerService;-><clinit>()V
 HSPLcom/android/server/pm/PackageManagerService;-><init>(Lcom/android/server/pm/PackageManagerServiceInjector;ZLjava/lang/String;ZZILjava/lang/String;)V
 HSPLcom/android/server/pm/PackageManagerService;->addAllPackageProperties(Lcom/android/server/pm/pkg/AndroidPackage;)V
 HPLcom/android/server/pm/PackageManagerService;->addCrossProfileIntentFilter(Lcom/android/server/pm/Computer;Lcom/android/server/pm/WatchedIntentFilter;Ljava/lang/String;III)V
-HSPLcom/android/server/pm/PackageManagerService;->applyUpdatedSystemOverlayPaths()V
 HSPLcom/android/server/pm/PackageManagerService;->boostPriorityForPackageManagerTracedLockedSection()V
-HSPLcom/android/server/pm/PackageManagerService;->checkPackageStartable(Lcom/android/server/pm/Computer;Ljava/lang/String;I)V
+HSPLcom/android/server/pm/PackageManagerService;->checkPackageStartable(Lcom/android/server/pm/Computer;Ljava/lang/String;I)V+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/PackageManagerService;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;
-HSPLcom/android/server/pm/PackageManagerService;->createLiveComputer()Lcom/android/server/pm/ComputerLocked;
 HSPLcom/android/server/pm/PackageManagerService;->forEachPackage(Lcom/android/server/pm/Computer;Ljava/util/function/Consumer;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/function/Consumer;Lcom/android/server/pm/permission/PermissionManagerServiceImpl$$ExternalSyntheticLambda7;,Lcom/android/server/pm/permission/PermissionManagerServiceImpl$$ExternalSyntheticLambda15;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/PackageManagerService;->forEachPackageSetting(Ljava/util/function/Consumer;)V+]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/function/Consumer;Lcom/android/server/pm/permission/PermissionManagerServiceImpl$$ExternalSyntheticLambda12;
 HSPLcom/android/server/pm/PackageManagerService;->forEachPackageState(Landroid/util/ArrayMap;Ljava/util/function/Consumer;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Consumer;megamorphic_types
-HSPLcom/android/server/pm/PackageManagerService;->forEachPackageState(Lcom/android/server/pm/Computer;Ljava/util/function/Consumer;)V
-HSPLcom/android/server/pm/PackageManagerService;->getAppInstallDir()Ljava/io/File;
-HSPLcom/android/server/pm/PackageManagerService;->getCoreAndroidApplication()Landroid/content/pm/ApplicationInfo;
-HSPLcom/android/server/pm/PackageManagerService;->getDefParseFlags()I
 HSPLcom/android/server/pm/PackageManagerService;->getDefaultAppProvider()Lcom/android/server/pm/DefaultAppProvider;
 HSPLcom/android/server/pm/PackageManagerService;->getDexManager()Lcom/android/server/pm/dex/DexManager;
 HSPLcom/android/server/pm/PackageManagerService;->getKnownPackageNamesInternal(Lcom/android/server/pm/Computer;II)[Ljava/lang/String;+]Lcom/android/server/pm/KnownPackages;Lcom/android/server/pm/KnownPackages;
 HSPLcom/android/server/pm/PackageManagerService;->getPackageFromComponentString(I)Ljava/lang/String;
 HSPLcom/android/server/pm/PackageManagerService;->getPlatformPackage()Lcom/android/server/pm/pkg/AndroidPackage;
 HSPLcom/android/server/pm/PackageManagerService;->getSafeMode()Z
-HSPLcom/android/server/pm/PackageManagerService;->getSdkVersion()I
 HSPLcom/android/server/pm/PackageManagerService;->getSettingsVersionForPackage(Lcom/android/server/pm/pkg/AndroidPackage;)Lcom/android/server/pm/Settings$VersionInfo;
 HSPLcom/android/server/pm/PackageManagerService;->getSystemPackageScanFlags(Ljava/io/File;)I
 HSPLcom/android/server/pm/PackageManagerService;->grantImplicitAccess(Lcom/android/server/pm/Computer;ILandroid/content/Intent;IIZZ)V+]Lcom/android/server/pm/AppsFilterImpl;Lcom/android/server/pm/AppsFilterImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
@@ -6700,133 +5093,58 @@
 HSPLcom/android/server/pm/PackageManagerService;->invalidatePackageInfoCache()V
 HSPLcom/android/server/pm/PackageManagerService;->isDeviceUpgrading()Z
 HSPLcom/android/server/pm/PackageManagerService;->isExpectingBetter(Ljava/lang/String;)Z
+HSPLcom/android/server/pm/PackageManagerService;->isPackageDeviceAdmin(Ljava/lang/String;I)Z+]Landroid/app/admin/IDevicePolicyManager;Lcom/android/server/devicepolicy/DevicePolicyManagerService;
 HSPLcom/android/server/pm/PackageManagerService;->isPreNMR1Upgrade()Z
 HSPLcom/android/server/pm/PackageManagerService;->lambda$forEachInstalledPackage$60(ILjava/util/function/Consumer;Lcom/android/server/pm/pkg/PackageStateInternal;)V+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/function/Consumer;Lcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda5;,Lcom/android/server/policy/role/RoleServicePlatformHelperImpl$$ExternalSyntheticLambda0;,Lcom/android/server/people/data/DataManager$$ExternalSyntheticLambda12;,Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$$ExternalSyntheticLambda4;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$getDevicePolicyManagementRoleHolderPackageName$50(I)Ljava/lang/String;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$12(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/resolution/ComponentResolver;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$13(Landroid/content/Context;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/permission/PermissionManagerServiceInternal;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$14(Landroid/content/Context;Lcom/android/server/pm/Installer;Ljava/lang/Object;Lcom/android/server/pm/PackageManagerTracedLock;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/UserManagerService;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$15(Lcom/android/server/pm/verify/domain/DomainVerificationService;Landroid/os/Handler;Lcom/android/server/pm/PackageManagerTracedLock;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/Settings;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$16(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/AppsFilterImpl;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$17(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/compat/PlatformCompat;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$18(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/SystemConfig;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$19(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/PackageDexOptimizer;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$20(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/dex/DexManager;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$21(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/dex/DynamicCodeLogger;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$22(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/dex/ArtManagerService;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$23(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/ApexManager;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$24(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Landroid/os/incremental/IncrementalManager;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$27(Landroid/content/Context;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/DefaultAppProvider;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$28(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Landroid/util/DisplayMetrics;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$29(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/internal/pm/parsing/PackageParser2;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$35(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/permission/LegacyPermissionManagerInternal;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$36(Lcom/android/server/pm/verify/domain/DomainVerificationService;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$37(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Landroid/os/Handler;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$38(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/BackgroundDexOptService;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$40(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/SharedLibrariesImpl;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$42(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/UpdateOwnershipHelper;
-HSPLcom/android/server/pm/PackageManagerService;->lambda$main$43(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/PackageMonitorCallbackHelper;
 HSPLcom/android/server/pm/PackageManagerService;->lambda$requestChecksumsInternal$8(Landroid/os/Handler;Ljava/util/List;IILjava/lang/String;[Ljava/security/cert/Certificate;Landroid/content/pm/IOnChecksumsReadyListener;)V
 HSPLcom/android/server/pm/PackageManagerService;->lambda$setPackageStoppedState$57(Ljava/lang/String;I)V+]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/apphibernation/AppHibernationManagerInternal;Lcom/android/server/apphibernation/AppHibernationService$LocalService;
-HSPLcom/android/server/pm/PackageManagerService;->main(Landroid/content/Context;Lcom/android/server/pm/Installer;Lcom/android/server/pm/verify/domain/DomainVerificationService;Z)Lcom/android/server/pm/PackageManagerService;
 HSPLcom/android/server/pm/PackageManagerService;->notifyComponentUsed(Lcom/android/server/pm/Computer;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageManagerService;->notifyPackageUseInternal(Ljava/lang/String;I)V+]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;
 HSPLcom/android/server/pm/PackageManagerService;->onChange(Lcom/android/server/utils/Watchable;)V+]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
 HSPLcom/android/server/pm/PackageManagerService;->onChanged()V
-HSPLcom/android/server/pm/PackageManagerService;->rebuildSnapshot(Lcom/android/server/pm/Computer;I)Lcom/android/server/pm/Computer;
-HSPLcom/android/server/pm/PackageManagerService;->registerObservers(Z)V
-HSPLcom/android/server/pm/PackageManagerService;->renameStaticSharedLibraryPackage(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;)V
+HSPLcom/android/server/pm/PackageManagerService;->rebuildSnapshot(Lcom/android/server/pm/Computer;I)Lcom/android/server/pm/Computer;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/PackageManagerService;->requestChecksumsInternal(Lcom/android/server/pm/Computer;Ljava/lang/String;ZIILjava/util/List;Landroid/content/pm/IOnChecksumsReadyListener;ILjava/util/concurrent/Executor;Landroid/os/Handler;)V
 HSPLcom/android/server/pm/PackageManagerService;->resetPriorityAfterPackageManagerTracedLockedSection()V
 HSPLcom/android/server/pm/PackageManagerService;->scheduleWritePackageRestrictions(I)V
 HSPLcom/android/server/pm/PackageManagerService;->scheduleWriteSettings()V
-HSPLcom/android/server/pm/PackageManagerService;->setEnabledSettingInternalLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageManager$ComponentEnabledSetting;ILjava/lang/String;)Z
-HSPLcom/android/server/pm/PackageManagerService;->setEnabledSettings(Ljava/util/List;ILjava/lang/String;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/Handler;Lcom/android/server/pm/PackageHandler;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Landroid/content/pm/PackageManager$ComponentEnabledSetting;Landroid/content/pm/PackageManager$ComponentEnabledSetting;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/Map;Landroid/util/ArrayMap;]Lcom/android/server/pm/PendingPackageBroadcasts;Lcom/android/server/pm/PendingPackageBroadcasts;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Ljava/util/List;Ljava/util/ImmutableCollections$List12;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ProtectedPackages;Lcom/android/server/pm/ProtectedPackages;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/BroadcastHelper;Lcom/android/server/pm/BroadcastHelper;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/pm/PackageManagerService;->setPackageStoppedState(Lcom/android/server/pm/Computer;Ljava/lang/String;ZI)V+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/os/Handler;Lcom/android/server/pm/PackageHandler;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/PackageManagerService;->setPlatformPackage(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;)V
+HSPLcom/android/server/pm/PackageManagerService;->setEnabledSettingInternalLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageManager$ComponentEnabledSetting;ILjava/lang/String;)Z+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Landroid/content/pm/PackageManager$ComponentEnabledSetting;Landroid/content/pm/PackageManager$ComponentEnabledSetting;
+HSPLcom/android/server/pm/PackageManagerService;->setEnabledSettings(Ljava/util/List;ILjava/lang/String;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/Handler;Lcom/android/server/pm/PackageHandler;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Landroid/content/pm/PackageManager$ComponentEnabledSetting;Landroid/content/pm/PackageManager$ComponentEnabledSetting;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/Map;Landroid/util/ArrayMap;]Lcom/android/server/pm/BroadcastHelper;Lcom/android/server/pm/BroadcastHelper;]Lcom/android/server/pm/PendingPackageBroadcasts;Lcom/android/server/pm/PendingPackageBroadcasts;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Ljava/util/List;Ljava/util/ImmutableCollections$List12;,Ljava/util/ArrayList;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/pm/ProtectedPackages;Lcom/android/server/pm/ProtectedPackages;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/PackageManagerService;->setPackageStoppedState(Lcom/android/server/pm/Computer;Ljava/lang/String;ZI)V+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/os/Handler;Lcom/android/server/pm/PackageHandler;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PackageMonitorCallbackHelper;Lcom/android/server/pm/PackageMonitorCallbackHelper;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/PackageManagerService;->snapshotComputer()Lcom/android/server/pm/Computer;+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;
 HSPLcom/android/server/pm/PackageManagerService;->snapshotComputer(Z)Lcom/android/server/pm/Computer;+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/PackageManagerService;->toStaticSharedLibraryPackageName(Ljava/lang/String;J)Ljava/lang/String;
-HSPLcom/android/server/pm/PackageManagerServiceCompilerMapping;-><clinit>()V
-HSPLcom/android/server/pm/PackageManagerServiceCompilerMapping;->checkProperties()V
 HSPLcom/android/server/pm/PackageManagerServiceCompilerMapping;->getAndCheckValidity(I)Ljava/lang/String;
 HSPLcom/android/server/pm/PackageManagerServiceCompilerMapping;->getSystemPropertyName(I)Ljava/lang/String;
-HSPLcom/android/server/pm/PackageManagerServiceCompilerMapping;->isFilterAllowedForReason(ILjava/lang/String;)Z
-HSPLcom/android/server/pm/PackageManagerServiceInjector$Singleton;-><init>(Lcom/android/server/pm/PackageManagerServiceInjector$Producer;)V
 HSPLcom/android/server/pm/PackageManagerServiceInjector$Singleton;->get(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;+]Lcom/android/server/pm/PackageManagerServiceInjector$Producer;megamorphic_types
-HSPLcom/android/server/pm/PackageManagerServiceInjector;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerTracedLock;Lcom/android/server/pm/Installer;Ljava/lang/Object;Lcom/android/server/pm/PackageAbiHelper;Landroid/os/Handler;Ljava/util/List;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$ProducerWithArgument;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$SystemWrapper;Lcom/android/server/pm/PackageManagerServiceInjector$ServiceProducer;Lcom/android/server/pm/PackageManagerServiceInjector$ServiceProducer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerServiceInjector$Producer;)V
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->bootstrap(Lcom/android/server/pm/PackageManagerService;)V
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getAbiHelper()Lcom/android/server/pm/PackageAbiHelper;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getActivityManagerInternal()Landroid/app/ActivityManagerInternal;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getApexManager()Lcom/android/server/pm/ApexManager;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getAppsFilter()Lcom/android/server/pm/AppsFilterImpl;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getArtManagerService()Lcom/android/server/pm/dex/ArtManagerService;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getBackgroundDexOptService()Lcom/android/server/pm/BackgroundDexOptService;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getBackgroundHandler()Landroid/os/Handler;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getCompatibility()Lcom/android/server/compat/PlatformCompat;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getComponentResolver()Lcom/android/server/pm/resolution/ComponentResolver;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getContext()Landroid/content/Context;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getDefaultAppProvider()Lcom/android/server/pm/DefaultAppProvider;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getDexManager()Lcom/android/server/pm/dex/DexManager;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getDisplayMetrics()Landroid/util/DisplayMetrics;
+HSPLcom/android/server/pm/PackageManagerServiceInjector;->getCompatibility()Lcom/android/server/compat/PlatformCompat;+]Lcom/android/server/pm/PackageManagerServiceInjector$Singleton;Lcom/android/server/pm/PackageManagerServiceInjector$Singleton;
 HSPLcom/android/server/pm/PackageManagerServiceInjector;->getDomainVerificationManagerInternal()Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getDynamicCodeLogger()Lcom/android/server/pm/dex/DynamicCodeLogger;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getHandler()Landroid/os/Handler;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getIncrementalManager()Landroid/os/incremental/IncrementalManager;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getInstallLock()Ljava/lang/Object;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getInstaller()Lcom/android/server/pm/Installer;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getLegacyPermissionManagerInternal()Lcom/android/server/pm/permission/LegacyPermissionManagerInternal;
 HSPLcom/android/server/pm/PackageManagerServiceInjector;->getLocalService(Ljava/lang/Class;)Ljava/lang/Object;+]Lcom/android/server/pm/PackageManagerServiceInjector$ServiceProducer;Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda22;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getLock()Lcom/android/server/pm/PackageManagerTracedLock;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getPackageDexOptimizer()Lcom/android/server/pm/PackageDexOptimizer;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getPackageMonitorCallbackHelper()Lcom/android/server/pm/PackageMonitorCallbackHelper;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getPermissionManagerServiceInternal()Lcom/android/server/pm/permission/PermissionManagerServiceInternal;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getScanningCachingPackageParser()Lcom/android/internal/pm/parsing/PackageParser2;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getSettings()Lcom/android/server/pm/Settings;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getSharedLibrariesImpl()Lcom/android/server/pm/SharedLibrariesImpl;
 HSPLcom/android/server/pm/PackageManagerServiceInjector;->getSystemConfig()Lcom/android/server/SystemConfig;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getSystemPartitions()Ljava/util/List;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getSystemWrapper()Lcom/android/server/pm/PackageManagerServiceInjector$SystemWrapper;
-HSPLcom/android/server/pm/PackageManagerServiceInjector;->getUpdateOwnershipHelper()Lcom/android/server/pm/UpdateOwnershipHelper;
 HSPLcom/android/server/pm/PackageManagerServiceInjector;->getUserManagerInternal()Lcom/android/server/pm/UserManagerInternal;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;
 HSPLcom/android/server/pm/PackageManagerServiceInjector;->getUserManagerService()Lcom/android/server/pm/UserManagerService;+]Lcom/android/server/pm/PackageManagerServiceInjector$Singleton;Lcom/android/server/pm/PackageManagerServiceInjector$Singleton;
-HSPLcom/android/server/pm/PackageManagerServiceUtils$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/pm/PackageManagerServiceUtils$$ExternalSyntheticLambda1;-><init>()V
-HSPLcom/android/server/pm/PackageManagerServiceUtils$$ExternalSyntheticLambda2;-><init>()V
-HSPLcom/android/server/pm/PackageManagerServiceUtils$1;-><init>()V
-HSPLcom/android/server/pm/PackageManagerServiceUtils$1;->accept(Ljava/io/File;Ljava/lang/String;)Z
-HSPLcom/android/server/pm/PackageManagerServiceUtils;-><clinit>()V
-HSPLcom/android/server/pm/PackageManagerServiceUtils;->applyEnforceIntentFilterMatching(Lcom/android/server/compat/PlatformCompat;Lcom/android/server/pm/resolution/ComponentResolverApi;Ljava/util/List;ZLandroid/content/Intent;Ljava/lang/String;I)V+]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;]Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Landroid/content/pm/ComponentInfo;Landroid/content/pm/ServiceInfo;,Landroid/content/pm/ActivityInfo;
+HSPLcom/android/server/pm/PackageManagerServiceUtils;->applyEnforceIntentFilterMatching(Lcom/android/server/compat/PlatformCompat;Lcom/android/server/pm/resolution/ComponentResolverApi;Ljava/util/List;ZLandroid/content/Intent;Ljava/lang/String;I)V+]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;]Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;]Landroid/content/pm/ComponentInfo;Landroid/content/pm/ServiceInfo;,Landroid/content/pm/ActivityInfo;]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;
 HSPLcom/android/server/pm/PackageManagerServiceUtils;->canJoinSharedUserId(Ljava/lang/String;Landroid/content/pm/SigningDetails;Lcom/android/server/pm/SharedUserSetting;I)Z
-HSPLcom/android/server/pm/PackageManagerServiceUtils;->comparePackageSignatures(Lcom/android/server/pm/PackageSetting;Landroid/content/pm/SigningDetails;)Z
-HSPLcom/android/server/pm/PackageManagerServiceUtils;->compareSignatureArrays([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)I
+HSPLcom/android/server/pm/PackageManagerServiceUtils;->compareSignatureArrays([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)I+]Landroid/content/pm/Signature;Landroid/content/pm/Signature;
 HSPLcom/android/server/pm/PackageManagerServiceUtils;->compareSignatures(Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails;)I
-HSPLcom/android/server/pm/PackageManagerServiceUtils;->compressedFileExists(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/PackageManagerServiceUtils;->deriveAbiOverride(Ljava/lang/String;)Ljava/lang/String;
 HSPLcom/android/server/pm/PackageManagerServiceUtils;->enforceShellRestriction(Lcom/android/server/pm/UserManagerInternal;Ljava/lang/String;II)V+]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;
 HSPLcom/android/server/pm/PackageManagerServiceUtils;->getCompressedFiles(Ljava/lang/String;)[Ljava/io/File;
-HSPLcom/android/server/pm/PackageManagerServiceUtils;->getLastModifiedTime(Lcom/android/server/pm/pkg/AndroidPackage;)J
+HSPLcom/android/server/pm/PackageManagerServiceUtils;->getLastModifiedTime(Lcom/android/server/pm/pkg/AndroidPackage;)J+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/PackageManagerServiceUtils;->isSystemOrRoot()Z
 HSPLcom/android/server/pm/PackageManagerServiceUtils;->isSystemOrRootOrShell(I)Z
-HSPLcom/android/server/pm/PackageManagerServiceUtils;->preparePackageParserCache(ZZLjava/lang/String;)Ljava/io/File;
 HSPLcom/android/server/pm/PackageManagerServiceUtils;->verifySignatures(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/PackageSetting;Landroid/content/pm/SigningDetails;ZZZ)Z
-HSPLcom/android/server/pm/PackageManagerTracedLock;-><init>()V
 HPLcom/android/server/pm/PackageMonitorCallbackHelper$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLcom/android/server/pm/PackageMonitorCallbackHelper;-><init>()V
-HSPLcom/android/server/pm/PackageObserverHelper;-><init>()V
-HSPLcom/android/server/pm/PackageProperty;-><init>()V
 HSPLcom/android/server/pm/PackageProperty;->addAllProperties(Lcom/android/server/pm/pkg/AndroidPackage;)V
-HSPLcom/android/server/pm/PackageProperty;->addComponentProperties(Ljava/util/List;Landroid/util/ArrayMap;)Landroid/util/ArrayMap;+]Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/Collections$EmptyMap;
+HSPLcom/android/server/pm/PackageProperty;->addComponentProperties(Ljava/util/List;Landroid/util/ArrayMap;)Landroid/util/ArrayMap;+]Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/Collections$EmptyMap;,Ljava/util/HashMap;
 HSPLcom/android/server/pm/PackageProperty;->addProperties(Ljava/util/Map;Landroid/util/ArrayMap;)Landroid/util/ArrayMap;
 HSPLcom/android/server/pm/PackageSetting$1;-><init>(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/utils/Watchable;)V
 HSPLcom/android/server/pm/PackageSetting$1;->createSnapshot()Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageSetting;-><init>(Lcom/android/server/pm/PackageSetting;)V
 HSPLcom/android/server/pm/PackageSetting;-><init>(Lcom/android/server/pm/PackageSetting;Z)V+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageSetting;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;IILjava/util/UUID;)V
-HSPLcom/android/server/pm/PackageSetting;->copyMimeGroups(Ljava/util/Map;)V+]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/Collections$EmptyMap;,Lcom/android/server/pm/Settings$KeySetToValueMap;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$EmptyIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;,Ljava/util/Collections$EmptySet;
+HSPLcom/android/server/pm/PackageSetting;->copyMimeGroups(Ljava/util/Map;)V+]Ljava/util/Map;Landroid/util/ArrayMap;,Lcom/android/server/pm/Settings$KeySetToValueMap;,Ljava/util/Collections$EmptyMap;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$EmptyIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;,Ljava/util/Collections$EmptySet;,Landroid/util/ArraySet;
 HSPLcom/android/server/pm/PackageSetting;->copyPackageSetting(Lcom/android/server/pm/PackageSetting;Z)V+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;][B[B]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;
 HSPLcom/android/server/pm/PackageSetting;->disableComponentLPw(Ljava/lang/String;I)Z
-HSPLcom/android/server/pm/PackageSetting;->enableComponentLPw(Ljava/lang/String;I)Z
+HSPLcom/android/server/pm/PackageSetting;->enableComponentLPw(Ljava/lang/String;I)Z+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl;
 HSPLcom/android/server/pm/PackageSetting;->getAndroidPackage()Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageSetting;->getApexModuleName()Ljava/lang/String;+]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;
 HSPLcom/android/server/pm/PackageSetting;->getAppId()I
@@ -6835,9 +5153,9 @@
 HSPLcom/android/server/pm/PackageSetting;->getBoolean(I)Z
 HSPLcom/android/server/pm/PackageSetting;->getCategoryOverride()I
 HSPLcom/android/server/pm/PackageSetting;->getCpuAbiOverride()Ljava/lang/String;
-HSPLcom/android/server/pm/PackageSetting;->getCurrentEnabledStateLPr(Ljava/lang/String;I)I+]Lcom/android/server/pm/pkg/PackageUserStateInternal;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;
+HSPLcom/android/server/pm/PackageSetting;->getCurrentEnabledStateLPr(Ljava/lang/String;I)I+]Lcom/android/server/pm/pkg/PackageUserStateInternal;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;
 HSPLcom/android/server/pm/PackageSetting;->getDomainSetId()Ljava/util/UUID;
-HSPLcom/android/server/pm/PackageSetting;->getEnabled(I)I
+HSPLcom/android/server/pm/PackageSetting;->getEnabled(I)I+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageSetting;->getInstallSource()Lcom/android/server/pm/InstallSource;
 HSPLcom/android/server/pm/PackageSetting;->getInstalled(I)Z
 HSPLcom/android/server/pm/PackageSetting;->getInstantApp(I)Z
@@ -6850,7 +5168,6 @@
 HSPLcom/android/server/pm/PackageSetting;->getLoadingProgress()F
 HSPLcom/android/server/pm/PackageSetting;->getMimeGroups()Ljava/util/Map;
 HSPLcom/android/server/pm/PackageSetting;->getPackageName()Ljava/lang/String;
-HSPLcom/android/server/pm/PackageSetting;->getPath()Ljava/io/File;
 HSPLcom/android/server/pm/PackageSetting;->getPathString()Ljava/lang/String;
 HSPLcom/android/server/pm/PackageSetting;->getPkg()Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;
 HSPLcom/android/server/pm/PackageSetting;->getPkgState()Lcom/android/server/pm/pkg/PackageStateUnserialized;
@@ -6861,11 +5178,11 @@
 HSPLcom/android/server/pm/PackageSetting;->getSeInfo()Ljava/lang/String;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;
 HSPLcom/android/server/pm/PackageSetting;->getSecondaryCpuAbi()Ljava/lang/String;
 HSPLcom/android/server/pm/PackageSetting;->getSecondaryCpuAbiLegacy()Ljava/lang/String;
-HSPLcom/android/server/pm/PackageSetting;->getSharedLibraryDependencies()Ljava/util/List;
+HSPLcom/android/server/pm/PackageSetting;->getSharedLibraryDependencies()Ljava/util/List;+]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;
 HSPLcom/android/server/pm/PackageSetting;->getSharedUserAppId()I
 HSPLcom/android/server/pm/PackageSetting;->getSignatures()Lcom/android/server/pm/PackageSignatures;
 HSPLcom/android/server/pm/PackageSetting;->getSigningDetails()Landroid/content/pm/SigningDetails;
-HSPLcom/android/server/pm/PackageSetting;->getStateForUser(Landroid/os/UserHandle;)Lcom/android/server/pm/pkg/PackageUserState;
+HSPLcom/android/server/pm/PackageSetting;->getStateForUser(Landroid/os/UserHandle;)Lcom/android/server/pm/pkg/PackageUserState;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/PackageSetting;->getTargetSdkVersion()I
 HSPLcom/android/server/pm/PackageSetting;->getTransientState()Lcom/android/server/pm/pkg/PackageStateUnserialized;
 HSPLcom/android/server/pm/PackageSetting;->getUserStates()Landroid/util/SparseArray;
@@ -6879,8 +5196,8 @@
 HSPLcom/android/server/pm/PackageSetting;->getVirtualPreload(I)Z
 HSPLcom/android/server/pm/PackageSetting;->getVolumeUuid()Ljava/lang/String;
 HSPLcom/android/server/pm/PackageSetting;->hasSharedUser()Z
-HSPLcom/android/server/pm/PackageSetting;->isApex()Z
-HSPLcom/android/server/pm/PackageSetting;->isDefaultToDeviceProtectedStorage()Z
+HSPLcom/android/server/pm/PackageSetting;->isApex()Z+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
+HSPLcom/android/server/pm/PackageSetting;->isDefaultToDeviceProtectedStorage()Z+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageSetting;->isForceQueryableOverride()Z
 HSPLcom/android/server/pm/PackageSetting;->isInstallPermissionsFixed()Z
 HSPLcom/android/server/pm/PackageSetting;->isLoading()Z
@@ -6896,9 +5213,8 @@
 HSPLcom/android/server/pm/PackageSetting;->isVendor()Z+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageSetting;->makeCache()Lcom/android/server/utils/SnapshotCache;
 HSPLcom/android/server/pm/PackageSetting;->modifyUserState(I)Lcom/android/server/pm/pkg/PackageUserStateImpl;+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/pm/PackageSetting;->modifyUserStateComponents(IZZ)Lcom/android/server/pm/pkg/PackageUserStateImpl;
+HSPLcom/android/server/pm/PackageSetting;->modifyUserStateComponents(IZZ)Lcom/android/server/pm/pkg/PackageUserStateImpl;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl;
 HSPLcom/android/server/pm/PackageSetting;->readUserState(I)Lcom/android/server/pm/pkg/PackageUserStateInternal;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/pm/PackageSetting;->setApexModuleName(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageSetting;->setAppId(I)Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageSetting;->setAppMetadataFilePath(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/PackageSetting;->setAppMetadataSource(I)Lcom/android/server/pm/PackageSetting;
@@ -6948,62 +5264,23 @@
 HSPLcom/android/server/pm/PackageSignatures;->readXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/util/ArrayList;)V
 HSPLcom/android/server/pm/PackageSignatures;->writeCertsListXml(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/util/ArrayList;[Landroid/content/pm/Signature;Z)V+]Landroid/content/pm/Signature;Landroid/content/pm/Signature;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/PackageSignatures;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/lang/String;Ljava/util/ArrayList;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails;]Lcom/android/server/pm/PackageSignatures;Lcom/android/server/pm/PackageSignatures;
-HSPLcom/android/server/pm/PackageUsage;-><init>()V
-HSPLcom/android/server/pm/PackageUsage;->readToken(Ljava/io/InputStream;Ljava/lang/StringBuilder;C)Ljava/lang/String;
-HSPLcom/android/server/pm/ParallelPackageParser$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/pm/ParallelPackageParser;Ljava/io/File;I)V
+HSPLcom/android/server/pm/PackageUsage;->readToken(Ljava/io/InputStream;Ljava/lang/StringBuilder;C)Ljava/lang/String;+]Ljava/io/InputStream;Ljava/io/BufferedInputStream;
 HSPLcom/android/server/pm/ParallelPackageParser$$ExternalSyntheticLambda0;->run()V
-HSPLcom/android/server/pm/ParallelPackageParser$ParseResult;-><init>()V
-HSPLcom/android/server/pm/ParallelPackageParser;->$r8$lambda$uW6lAW1ixaCdJ_8ZINGbyQGIceg(Lcom/android/server/pm/ParallelPackageParser;Ljava/io/File;I)V
 HSPLcom/android/server/pm/ParallelPackageParser;-><init>(Lcom/android/internal/pm/parsing/PackageParser2;Ljava/util/concurrent/ExecutorService;)V
 HSPLcom/android/server/pm/ParallelPackageParser;->lambda$submit$0(Ljava/io/File;I)V
-HSPLcom/android/server/pm/ParallelPackageParser;->makeExecutorService()Ljava/util/concurrent/ExecutorService;
 HSPLcom/android/server/pm/ParallelPackageParser;->parsePackage(Ljava/io/File;I)Lcom/android/internal/pm/parsing/pkg/ParsedPackage;
 HSPLcom/android/server/pm/ParallelPackageParser;->submit(Ljava/io/File;I)V
 HSPLcom/android/server/pm/ParallelPackageParser;->take()Lcom/android/server/pm/ParallelPackageParser$ParseResult;
-HSPLcom/android/server/pm/PendingPackageBroadcasts;-><init>()V
-HSPLcom/android/server/pm/Policy$PolicyBuilder;->-$$Nest$fgetmCerts(Lcom/android/server/pm/Policy$PolicyBuilder;)Ljava/util/Set;
-HSPLcom/android/server/pm/Policy$PolicyBuilder;->-$$Nest$fgetmPkgMap(Lcom/android/server/pm/Policy$PolicyBuilder;)Ljava/util/Map;
-HSPLcom/android/server/pm/Policy$PolicyBuilder;->-$$Nest$fgetmSeinfo(Lcom/android/server/pm/Policy$PolicyBuilder;)Ljava/lang/String;
 HSPLcom/android/server/pm/Policy$PolicyBuilder;-><init>()V
-HSPLcom/android/server/pm/Policy$PolicyBuilder;->addSignature(Ljava/lang/String;)Lcom/android/server/pm/Policy$PolicyBuilder;
-HSPLcom/android/server/pm/Policy$PolicyBuilder;->build()Lcom/android/server/pm/Policy;
-HSPLcom/android/server/pm/Policy$PolicyBuilder;->setGlobalSeinfoOrThrow(Ljava/lang/String;)Lcom/android/server/pm/Policy$PolicyBuilder;
-HSPLcom/android/server/pm/Policy$PolicyBuilder;->validateValue(Ljava/lang/String;)Z
-HSPLcom/android/server/pm/Policy;->-$$Nest$fgetmCerts(Lcom/android/server/pm/Policy;)Ljava/util/Set;
-HSPLcom/android/server/pm/Policy;->-$$Nest$fgetmPkgMap(Lcom/android/server/pm/Policy;)Ljava/util/Map;
-HSPLcom/android/server/pm/Policy;->-$$Nest$fgetmSeinfo(Lcom/android/server/pm/Policy;)Ljava/lang/String;
 HSPLcom/android/server/pm/Policy;-><init>(Lcom/android/server/pm/Policy$PolicyBuilder;)V
-HSPLcom/android/server/pm/Policy;-><init>(Lcom/android/server/pm/Policy$PolicyBuilder;Lcom/android/server/pm/Policy-IA;)V
 HSPLcom/android/server/pm/Policy;->getMatchedSeInfo(Lcom/android/server/pm/pkg/AndroidPackage;)Ljava/lang/String;+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;
-HSPLcom/android/server/pm/Policy;->getSignatures()Ljava/util/Set;
-HSPLcom/android/server/pm/Policy;->hasInnerPackages()Z
-HSPLcom/android/server/pm/PolicyComparator;-><init>()V
-HSPLcom/android/server/pm/PolicyComparator;->compare(Lcom/android/server/pm/Policy;Lcom/android/server/pm/Policy;)I
-HSPLcom/android/server/pm/PolicyComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLcom/android/server/pm/PolicyComparator;->foundDuplicate()Z
-HSPLcom/android/server/pm/PreferredActivity$1;-><init>(Lcom/android/server/pm/PreferredActivity;Lcom/android/server/pm/PreferredActivity;Lcom/android/server/utils/Watchable;)V
-HSPLcom/android/server/pm/PreferredActivity;-><init>(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/pm/PreferredActivity;->makeCache()Lcom/android/server/utils/SnapshotCache;
-HSPLcom/android/server/pm/PreferredActivity;->onReadTag(Ljava/lang/String;Lcom/android/modules/utils/TypedXmlPullParser;)Z
-HSPLcom/android/server/pm/PreferredActivityHelper;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/BroadcastHelper;)V
-HPLcom/android/server/pm/PreferredActivityHelper;->replacePreferredActivity(Lcom/android/server/pm/Computer;Lcom/android/server/pm/WatchedIntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;I)V
+HSPLcom/android/server/pm/PreferredActivityHelper;->replacePreferredActivity(Lcom/android/server/pm/Computer;Lcom/android/server/pm/WatchedIntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;I)V
 HSPLcom/android/server/pm/PreferredComponent;-><init>(Lcom/android/server/pm/PreferredComponent$Callbacks;Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/pm/PreferredComponent;->getParseError()Ljava/lang/String;
-HPLcom/android/server/pm/PreferredComponent;->sameSet([Landroid/content/ComponentName;)Z
+HSPLcom/android/server/pm/PreferredComponent;->sameSet([Landroid/content/ComponentName;)Z
 HSPLcom/android/server/pm/PreferredComponent;->writeToXml(Lcom/android/modules/utils/TypedXmlSerializer;Z)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;,Lcom/android/internal/util/ArtBinaryXmlSerializer;
-HSPLcom/android/server/pm/PreferredIntentResolver$1;-><init>(Lcom/android/server/pm/PreferredIntentResolver;Lcom/android/server/pm/PreferredIntentResolver;Lcom/android/server/utils/Watchable;)V
-HSPLcom/android/server/pm/PreferredIntentResolver;-><init>()V
-HSPLcom/android/server/pm/PreferredIntentResolver;->getIntentFilter(Lcom/android/server/pm/PreferredActivity;)Landroid/content/IntentFilter;
+HSPLcom/android/server/pm/PreferredIntentResolver;->getIntentFilter(Lcom/android/server/pm/PreferredActivity;)Landroid/content/IntentFilter;+]Lcom/android/server/pm/WatchedIntentFilter;Lcom/android/server/pm/PreferredActivity;
 HSPLcom/android/server/pm/PreferredIntentResolver;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;+]Lcom/android/server/pm/PreferredIntentResolver;Lcom/android/server/pm/PreferredIntentResolver;
-HSPLcom/android/server/pm/PreferredIntentResolver;->makeCache()Lcom/android/server/utils/SnapshotCache;
-HSPLcom/android/server/pm/PreferredIntentResolver;->newArray(I)[Lcom/android/server/pm/PreferredActivity;
-HSPLcom/android/server/pm/PreferredIntentResolver;->newArray(I)[Ljava/lang/Object;
-HSPLcom/android/server/pm/PreferredIntentResolver;->shouldAddPreferredActivity(Lcom/android/server/pm/PreferredActivity;)Z
-HSPLcom/android/server/pm/ProcessLoggingHandler;-><init>()V
-HSPLcom/android/server/pm/ProcessLoggingHandler;->logAppProcessStart(Landroid/content/Context;Landroid/content/pm/PackageManagerInternal;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;I)V
-HSPLcom/android/server/pm/ProcessLoggingHandler;->processChecksum(Lcom/android/server/pm/ProcessLoggingHandler$LoggingInfo;[B)V
-HSPLcom/android/server/pm/ProtectedPackages;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/pm/ProtectedPackages;->hasDeviceOwnerOrProfileOwner(ILjava/lang/String;)Z+]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/pm/ProtectedPackages;->hasDeviceOwnerOrProfileOwner(ILjava/lang/String;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/pm/ProtectedPackages;->hasProtectedPackages(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/ProtectedPackages;->isOwnerProtectedPackage(ILjava/lang/String;)Z+]Lcom/android/server/pm/ProtectedPackages;Lcom/android/server/pm/ProtectedPackages;
 HSPLcom/android/server/pm/ProtectedPackages;->isPackageProtectedForUser(ILjava/lang/String;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Set;Landroid/util/ArraySet;
@@ -7011,53 +5288,40 @@
 HSPLcom/android/server/pm/ProtectedPackages;->isProtectedPackage(ILjava/lang/String;)Z+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/ProtectedPackages;Lcom/android/server/pm/ProtectedPackages;
 HPLcom/android/server/pm/QueryIntentActivitiesResult;-><init>(Ljava/util/List;)V
 HSPLcom/android/server/pm/QueryIntentActivitiesResult;-><init>(ZZLjava/util/List;)V
-HSPLcom/android/server/pm/ReconcilePackageUtils;-><clinit>()V
 HSPLcom/android/server/pm/ReconcilePackageUtils;->isCompatSignatureUpdateNeeded(Lcom/android/server/pm/Settings$VersionInfo;)Z
 HSPLcom/android/server/pm/ReconcilePackageUtils;->isRecoverSignatureUpdateNeeded(Lcom/android/server/pm/Settings$VersionInfo;)Z
 HSPLcom/android/server/pm/ReconciledPackage;-><init>(Ljava/util/List;Ljava/util/Map;Lcom/android/server/pm/InstallRequest;Lcom/android/server/pm/DeletePackageAction;Ljava/util/List;Landroid/content/pm/SigningDetails;ZZ)V
 HSPLcom/android/server/pm/ReconciledPackage;->getCombinedAvailablePackages()Ljava/util/Map;
-HSPLcom/android/server/pm/RemovePackageHelper;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/AppDataHelper;Lcom/android/server/pm/BroadcastHelper;)V
 HSPLcom/android/server/pm/ResilientAtomicFile;-><init>(Ljava/io/File;Ljava/io/File;Ljava/io/File;ILjava/lang/String;Lcom/android/server/pm/ResilientAtomicFile$ReadEventLogger;)V
 HSPLcom/android/server/pm/ResilientAtomicFile;->close()V
-HSPLcom/android/server/pm/ResilientAtomicFile;->finalizeOutStream(Ljava/io/FileOutputStream;)V
+HSPLcom/android/server/pm/ResilientAtomicFile;->finalizeOutStream(Ljava/io/FileOutputStream;)V+]Ljava/io/FileOutputStream;Ljava/io/FileOutputStream;
 HSPLcom/android/server/pm/ResilientAtomicFile;->finishWrite(Ljava/io/FileOutputStream;)V
 HSPLcom/android/server/pm/ResilientAtomicFile;->openRead()Ljava/io/FileInputStream;
 HSPLcom/android/server/pm/ResilientAtomicFile;->startWrite()Ljava/io/FileOutputStream;
-HSPLcom/android/server/pm/ResolveIntentHelper;-><init>(Landroid/content/Context;Lcom/android/server/pm/PreferredActivityHelper;Lcom/android/server/compat/PlatformCompat;Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;Lcom/android/server/pm/UserNeedsBadgingCache;Ljava/util/function/Supplier;Ljava/util/function/Supplier;Landroid/os/Handler;)V
-HSPLcom/android/server/pm/ResolveIntentHelper;->chooseBestActivity(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JJLjava/util/List;IZ)Landroid/content/pm/ResolveInfo;+]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/util/function/Supplier;Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda41;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Lcom/android/server/pm/PreferredActivityHelper;Lcom/android/server/pm/PreferredActivityHelper;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/UserNeedsBadgingCache;Lcom/android/server/pm/UserNeedsBadgingCache;]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper;
+HSPLcom/android/server/pm/ResolveIntentHelper;->chooseBestActivity(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JJLjava/util/List;IZ)Landroid/content/pm/ResolveInfo;+]Ljava/util/function/Supplier;Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda41;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/UserNeedsBadgingCache;Lcom/android/server/pm/UserNeedsBadgingCache;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper;]Lcom/android/server/pm/PreferredActivityHelper;Lcom/android/server/pm/PreferredActivityHelper;
 HSPLcom/android/server/pm/ResolveIntentHelper;->queryIntentReceiversInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JII)Ljava/util/List;
 HSPLcom/android/server/pm/ResolveIntentHelper;->queryIntentReceiversInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JIIZ)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/pm/ResolveIntentHelper;->resolveIntentInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JJIZI)Landroid/content/pm/ResolveInfo;
-HSPLcom/android/server/pm/ResolveIntentHelper;->resolveIntentInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JJIZIZI)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/ResolveIntentHelper;->resolveIntentInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JJIZIZI)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper;
 HSPLcom/android/server/pm/ResolveIntentHelper;->resolveServiceInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JII)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/RestrictionsSet;-><init>()V
 HSPLcom/android/server/pm/RestrictionsSet;->getRestrictions(I)Landroid/os/Bundle;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/pm/RestrictionsSet;->updateRestrictions(ILandroid/os/Bundle;)Z
-HSPLcom/android/server/pm/SELinuxMMAC;-><clinit>()V
+HSPLcom/android/server/pm/RestrictionsSet;->updateRestrictions(ILandroid/os/Bundle;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/SELinuxMMAC;->getPartition(Lcom/android/server/pm/pkg/PackageState;)Ljava/lang/String;
 HSPLcom/android/server/pm/SELinuxMMAC;->getSeInfo(Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/SharedUserApi;Lcom/android/server/compat/PlatformCompat;)Ljava/lang/String;
 HSPLcom/android/server/pm/SELinuxMMAC;->getSeInfo(Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/pkg/AndroidPackage;ZI)Ljava/lang/String;+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/pm/SELinuxMMAC;->getTargetSdkVersionForSeInfo(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/SharedUserApi;Lcom/android/server/compat/PlatformCompat;)I
 HSPLcom/android/server/pm/SELinuxMMAC;->readInstallPolicy()Z
-HSPLcom/android/server/pm/SELinuxMMAC;->readSeinfo(Lorg/xmlpull/v1/XmlPullParser;)V
 HSPLcom/android/server/pm/SELinuxMMAC;->readSignerOrThrow(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/pm/Policy;
 HSPLcom/android/server/pm/ScanPackageUtils;->adjustScanFlagsWithPackageSetting(ILcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Landroid/os/UserHandle;)I
 HSPLcom/android/server/pm/ScanPackageUtils;->applyPolicy(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ILcom/android/server/pm/pkg/AndroidPackage;Z)V
 HSPLcom/android/server/pm/ScanPackageUtils;->assertMinSignatureSchemeIsValid(Lcom/android/server/pm/pkg/AndroidPackage;I)V
-HSPLcom/android/server/pm/ScanPackageUtils;->assertPackageProcesses(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/util/List;Ljava/util/Map;Ljava/lang/String;)V
 HSPLcom/android/server/pm/ScanPackageUtils;->assertProcessesAreValid(Lcom/android/server/pm/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/ScanPackageUtils;->assertStaticSharedLibraryIsValid(Lcom/android/server/pm/pkg/AndroidPackage;I)V
 HSPLcom/android/server/pm/ScanPackageUtils;->collectCertificatesLI(Lcom/android/server/pm/PackageSetting;Lcom/android/internal/pm/parsing/pkg/ParsedPackage;Lcom/android/server/pm/Settings$VersionInfo;ZZZ)V
 HSPLcom/android/server/pm/ScanPackageUtils;->configurePackageComponents(Lcom/android/server/pm/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/ScanPackageUtils;->getAppLib32InstallDir()Ljava/io/File;
-HSPLcom/android/server/pm/ScanPackageUtils;->getRealPackageName(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;Z)Ljava/lang/String;
-HSPLcom/android/server/pm/ScanPackageUtils;->getVendorPartitionVersion()I
 HSPLcom/android/server/pm/ScanPackageUtils;->isPackageRenamed(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;)Z
 HSPLcom/android/server/pm/ScanPackageUtils;->scanPackageOnlyLI(Lcom/android/server/pm/ScanRequest;Lcom/android/server/pm/PackageManagerServiceInjector;ZJ)Lcom/android/server/pm/ScanResult;
-HSPLcom/android/server/pm/ScanPackageUtils;->setInstantAppForUser(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageSetting;IZZ)V
-HSPLcom/android/server/pm/ScanPartition;-><init>(Landroid/content/pm/PackagePartitions$SystemPartition;)V
-HSPLcom/android/server/pm/ScanPartition;-><init>(Ljava/io/File;Lcom/android/server/pm/ScanPartition;Lcom/android/server/pm/ApexManager$ActiveApexInfo;)V
-HSPLcom/android/server/pm/ScanPartition;->scanFlagForPartition(Landroid/content/pm/PackagePartitions$SystemPartition;)I
 HSPLcom/android/server/pm/ScanPartition;->toString()Ljava/lang/String;
 HSPLcom/android/server/pm/ScanRequest;-><init>(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Ljava/lang/String;IIZLandroid/os/UserHandle;Ljava/lang/String;)V
 HSPLcom/android/server/pm/ScanResult;-><init>(Lcom/android/server/pm/ScanRequest;Lcom/android/server/pm/PackageSetting;Ljava/util/List;ZILandroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;Ljava/util/List;)V
@@ -7069,33 +5333,18 @@
 HSPLcom/android/server/pm/SettingBase;->getLegacyPermissionState()Lcom/android/server/pm/permission/LegacyPermissionState;
 HSPLcom/android/server/pm/SettingBase;->getPrivateFlags()I
 HSPLcom/android/server/pm/SettingBase;->onChanged()V+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;,Lcom/android/server/pm/SharedUserSetting;
-HSPLcom/android/server/pm/SettingBase;->registerObserver(Lcom/android/server/utils/Watcher;)V
+HSPLcom/android/server/pm/SettingBase;->registerObserver(Lcom/android/server/utils/Watcher;)V+]Lcom/android/server/utils/Watchable;Lcom/android/server/utils/WatchableImpl;
 HSPLcom/android/server/pm/SettingBase;->setFlags(I)Lcom/android/server/pm/SettingBase;
 HSPLcom/android/server/pm/SettingBase;->setPrivateFlags(I)Lcom/android/server/pm/SettingBase;
-HSPLcom/android/server/pm/SettingBase;->unregisterObserver(Lcom/android/server/utils/Watcher;)V
-HSPLcom/android/server/pm/Settings$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/utils/WatchedArrayMap;)V
-HSPLcom/android/server/pm/Settings$$ExternalSyntheticLambda2;-><init>(Lcom/android/server/pm/Settings;)V
-HSPLcom/android/server/pm/Settings$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/pm/Settings$1;-><init>(Lcom/android/server/pm/Settings;)V
 HSPLcom/android/server/pm/Settings$1;->onChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;
-HSPLcom/android/server/pm/Settings$2;-><init>(Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;Lcom/android/server/utils/Watchable;)V
 HSPLcom/android/server/pm/Settings$2;->createSnapshot()Lcom/android/server/pm/Settings;
-HSPLcom/android/server/pm/Settings$3;-><init>(Lcom/android/server/pm/Settings;)V
-HSPLcom/android/server/pm/Settings$KeySetToValueMap;-><init>(Ljava/util/Set;Ljava/lang/Object;)V
-HSPLcom/android/server/pm/Settings$KeySetToValueMap;->keySet()Ljava/util/Set;
 HSPLcom/android/server/pm/Settings$KeySetToValueMap;->size()I
-HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence$MyHandler;-><init>(Lcom/android/server/pm/Settings$RuntimePermissionPersistence;)V
-HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence$PersistenceHandler;-><init>(Lcom/android/server/pm/Settings$RuntimePermissionPersistence;)V
-HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;-><clinit>()V
-HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;-><init>(Lcom/android/permission/persistence/RuntimePermissionsPersistence;Ljava/util/function/Consumer;)V
 HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->getPackagePermissions(ILcom/android/server/utils/WatchedArrayMap;)Ljava/util/Map;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/Settings$RuntimePermissionPersistence;Lcom/android/server/pm/Settings$RuntimePermissionPersistence;]Ljava/util/Map;Landroid/util/ArrayMap;
-HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->getPermissionsFromPermissionsState(Lcom/android/server/pm/permission/LegacyPermissionState;I)Ljava/util/List;+]Lcom/android/server/pm/permission/LegacyPermissionState;Lcom/android/server/pm/permission/LegacyPermissionState;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;,Ljava/util/Collections$EmptyList;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;,Ljava/util/Collections$EmptyIterator;]Lcom/android/server/pm/permission/LegacyPermissionState$PermissionState;Lcom/android/server/pm/permission/LegacyPermissionState$PermissionState;
-HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->readPermissionsState(Ljava/util/List;Lcom/android/server/pm/permission/LegacyPermissionState;I)V
+HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->getPermissionsFromPermissionsState(Lcom/android/server/pm/permission/LegacyPermissionState;I)Ljava/util/List;+]Lcom/android/server/pm/permission/LegacyPermissionState;Lcom/android/server/pm/permission/LegacyPermissionState;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;,Ljava/util/Collections$EmptyList;]Lcom/android/server/pm/permission/LegacyPermissionState$PermissionState;Lcom/android/server/pm/permission/LegacyPermissionState$PermissionState;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;,Ljava/util/Collections$EmptyIterator;
+HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->readPermissionsState(Ljava/util/List;Lcom/android/server/pm/permission/LegacyPermissionState;I)V+]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->readStateForUserSync(ILcom/android/server/pm/Settings$VersionInfo;Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;Ljava/io/File;)V
-HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->uniformRandom(DD)J
 HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->writeStateForUserAsync(I)V
-HSPLcom/android/server/pm/Settings$VersionInfo;-><init>()V
-HSPLcom/android/server/pm/Settings;->$r8$lambda$53NmgrwLNm2y5xSEATqhfDNuHBU(Lcom/android/server/pm/Settings;Lcom/android/server/pm/SharedUserSetting;)V
 HSPLcom/android/server/pm/Settings;-><clinit>()V
 HSPLcom/android/server/pm/Settings;-><init>(Lcom/android/server/pm/Settings;)V
 HSPLcom/android/server/pm/Settings;-><init>(Ljava/io/File;Lcom/android/permission/persistence/RuntimePermissionsPersistence;Lcom/android/server/pm/permission/LegacyPermissionDataProvider;Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;Landroid/os/Handler;Lcom/android/server/pm/PackageManagerTracedLock;)V
@@ -7103,16 +5352,12 @@
 HSPLcom/android/server/pm/Settings;->addPackageLPw(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;IIILjava/util/UUID;)Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/Settings;->addPackageSettingLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;)V
 HSPLcom/android/server/pm/Settings;->addSharedUserLPw(Ljava/lang/String;III)Lcom/android/server/pm/SharedUserSetting;
-HSPLcom/android/server/pm/Settings;->checkAndPruneSharedUserLPw(Lcom/android/server/pm/SharedUserSetting;Z)Z
 HSPLcom/android/server/pm/Settings;->createMimeGroups(Ljava/util/Set;)Ljava/util/Map;
 HSPLcom/android/server/pm/Settings;->createNewSetting(Ljava/lang/String;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Ljava/lang/String;Lcom/android/server/pm/SharedUserSetting;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JIILandroid/os/UserHandle;ZZZZLcom/android/server/pm/UserManagerService;[Ljava/lang/String;[J[Z[Ljava/lang/String;[JLjava/util/Set;Ljava/util/UUID;I[B)Lcom/android/server/pm/PackageSetting;
-HSPLcom/android/server/pm/Settings;->disableSystemPackageLPw(Ljava/lang/String;Z)Z
 HSPLcom/android/server/pm/Settings;->dispatchChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchableImpl;
 HSPLcom/android/server/pm/Settings;->editPreferredActivitiesLPw(I)Lcom/android/server/pm/PreferredIntentResolver;
-HSPLcom/android/server/pm/Settings;->findOrCreateVersion(Ljava/lang/String;)Lcom/android/server/pm/Settings$VersionInfo;
-HSPLcom/android/server/pm/Settings;->getAllUsers(Lcom/android/server/pm/UserManagerService;)Ljava/util/List;
-HSPLcom/android/server/pm/Settings;->getApplicationEnabledSettingLPr(Ljava/lang/String;I)I
-HPLcom/android/server/pm/Settings;->getBlockUninstallLPr(ILjava/lang/String;)Z
+HSPLcom/android/server/pm/Settings;->getApplicationEnabledSettingLPr(Ljava/lang/String;I)I+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;
+HPLcom/android/server/pm/Settings;->getBlockUninstallLPr(ILjava/lang/String;)Z+]Lcom/android/server/utils/WatchedSparseArray;Lcom/android/server/utils/WatchedSparseArray;
 HSPLcom/android/server/pm/Settings;->getComponentEnabledSettingLPr(Landroid/content/ComponentName;I)I+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Landroid/content/ComponentName;Landroid/content/ComponentName;
 HSPLcom/android/server/pm/Settings;->getCrossProfileIntentResolver(I)Lcom/android/server/pm/CrossProfileIntentResolver;+]Lcom/android/server/utils/WatchedSparseArray;Lcom/android/server/utils/WatchedSparseArray;
 HSPLcom/android/server/pm/Settings;->getDisabledSystemPkgLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
@@ -7124,81 +5369,52 @@
 HSPLcom/android/server/pm/Settings;->getSettingLPr(I)Lcom/android/server/pm/SettingBase;+]Lcom/android/server/pm/AppIdSettingMap;Lcom/android/server/pm/AppIdSettingMap;
 HSPLcom/android/server/pm/Settings;->getSettingsFile()Lcom/android/server/pm/ResilientAtomicFile;
 HSPLcom/android/server/pm/Settings;->getSharedUserLPw(Ljava/lang/String;IIZ)Lcom/android/server/pm/SharedUserSetting;
-HSPLcom/android/server/pm/Settings;->getSharedUserSettingLPr(Lcom/android/server/pm/PackageSetting;)Lcom/android/server/pm/SharedUserSetting;
+HSPLcom/android/server/pm/Settings;->getSharedUserSettingLPr(Lcom/android/server/pm/PackageSetting;)Lcom/android/server/pm/SharedUserSetting;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/Settings;->getSharedUserSettingLPr(Ljava/lang/String;)Lcom/android/server/pm/SharedUserSetting;
 HSPLcom/android/server/pm/Settings;->getUserPackagesStateFile(I)Lcom/android/server/pm/ResilientAtomicFile;
-HSPLcom/android/server/pm/Settings;->getUserRuntimePermissionsFile(I)Ljava/io/File;
 HSPLcom/android/server/pm/Settings;->getUserSystemDirectory(I)Ljava/io/File;
 HSPLcom/android/server/pm/Settings;->getUsers(Lcom/android/server/pm/UserManagerService;ZZ)Ljava/util/List;
 HSPLcom/android/server/pm/Settings;->insertPackageSettingLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/pkg/AndroidPackage;)V
-HSPLcom/android/server/pm/Settings;->lambda$pruneSharedUsersLPw$0(Lcom/android/server/pm/SharedUserSetting;)V
-HSPLcom/android/server/pm/Settings;->makeCache()Lcom/android/server/utils/SnapshotCache;
 HSPLcom/android/server/pm/Settings;->parseAppId(Lcom/android/modules/utils/TypedXmlPullParser;)I
 HSPLcom/android/server/pm/Settings;->parseSharedUserAppId(Lcom/android/modules/utils/TypedXmlPullParser;)I
-HSPLcom/android/server/pm/Settings;->pruneSharedUsersLPw()V
-HSPLcom/android/server/pm/Settings;->readBlockUninstallPackagesLPw(Lcom/android/modules/utils/TypedXmlPullParser;I)V
-HSPLcom/android/server/pm/Settings;->readComponentsLPr(Lcom/android/modules/utils/TypedXmlPullParser;)Landroid/util/ArraySet;
+HSPLcom/android/server/pm/Settings;->readComponentsLPr(Lcom/android/modules/utils/TypedXmlPullParser;)Landroid/util/ArraySet;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;
 HSPLcom/android/server/pm/Settings;->readCrossProfileIntentFiltersLPw(Lcom/android/modules/utils/TypedXmlPullParser;I)V
-HSPLcom/android/server/pm/Settings;->readDefaultApps(Lorg/xmlpull/v1/XmlPullParser;)Ljava/lang/String;
-HSPLcom/android/server/pm/Settings;->readDefaultAppsLPw(Lorg/xmlpull/v1/XmlPullParser;I)V
 HSPLcom/android/server/pm/Settings;->readDisabledSysPackageLPw(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/util/List;)V
 HSPLcom/android/server/pm/Settings;->readLPw(Lcom/android/server/pm/Computer;Ljava/util/List;)Z
 HSPLcom/android/server/pm/Settings;->readPackageLPw(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/util/ArrayList;Landroid/util/ArrayMap;Ljava/util/List;Landroid/util/ArrayMap;)V
 HSPLcom/android/server/pm/Settings;->readPackageRestrictionsLPr(ILandroid/util/ArrayMap;)V
-HSPLcom/android/server/pm/Settings;->readPersistentPreferredActivitiesLPw(Lcom/android/modules/utils/TypedXmlPullParser;I)V
 HSPLcom/android/server/pm/Settings;->readPreferredActivitiesLPw(Lcom/android/modules/utils/TypedXmlPullParser;I)V
 HSPLcom/android/server/pm/Settings;->readSettingsLPw(Lcom/android/server/pm/Computer;Ljava/util/List;Landroid/util/ArrayMap;)Z
 HSPLcom/android/server/pm/Settings;->readSharedUserLPw(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/util/ArrayList;Ljava/util/List;)V
-HSPLcom/android/server/pm/Settings;->readUsesStaticLibLPw(Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/server/pm/PackageSetting;)V
-HSPLcom/android/server/pm/Settings;->registerObserver(Lcom/android/server/utils/Watcher;)V
-HSPLcom/android/server/pm/Settings;->registerObservers()V
-HSPLcom/android/server/pm/Settings;->removeAppIdLPw(I)V
-HSPLcom/android/server/pm/Settings;->removeRenamedPackageLPw(Ljava/lang/String;)V
 HSPLcom/android/server/pm/Settings;->snapshot()Lcom/android/server/pm/Settings;
 HSPLcom/android/server/pm/Settings;->updatePackageSetting(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILcom/android/server/pm/UserManagerService;[Ljava/lang/String;[J[Z[Ljava/lang/String;[JLjava/util/Set;Ljava/util/UUID;I[BZ)V
 HSPLcom/android/server/pm/Settings;->writeArchiveStateLPr(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/pm/pkg/ArchiveState;)V
-HSPLcom/android/server/pm/Settings;->writeCrossProfileIntentFiltersLPr(Lcom/android/modules/utils/TypedXmlSerializer;I)V
-HSPLcom/android/server/pm/Settings;->writeDisabledSysPackageLPr(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/pm/PackageSetting;)V
-HSPLcom/android/server/pm/Settings;->writeKernelMappingLPr()V
+HSPLcom/android/server/pm/Settings;->writeCrossProfileIntentFiltersLPr(Lcom/android/modules/utils/TypedXmlSerializer;I)V+]Lcom/android/server/utils/WatchedSparseArray;Lcom/android/server/utils/WatchedSparseArray;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Lcom/android/server/IntentResolver;Lcom/android/server/pm/CrossProfileIntentResolver;]Lcom/android/server/pm/CrossProfileIntentFilter;Lcom/android/server/pm/CrossProfileIntentFilter;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;
+HSPLcom/android/server/pm/Settings;->writeDisabledSysPackageLPr(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/pm/PackageSetting;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/Settings;->writeKeySetAliasesLPr(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;]Lcom/android/server/pm/PackageKeySetData;Lcom/android/server/pm/PackageKeySetData;
 HSPLcom/android/server/pm/Settings;->writeLPr(Lcom/android/server/pm/Computer;Z)V+]Lcom/android/server/pm/permission/LegacyPermissionSettings;Lcom/android/server/pm/permission/LegacyPermissionSettings;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/ResilientAtomicFile;Lcom/android/server/pm/ResilientAtomicFile;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/KeySetManagerService;Lcom/android/server/pm/KeySetManagerService;]Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;Lcom/android/server/pm/verify/domain/DomainVerificationService;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Lcom/android/server/pm/PackageSignatures;Lcom/android/server/pm/PackageSignatures;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;
 HSPLcom/android/server/pm/Settings;->writeMimeGroupLPr(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/util/Map;)V+]Ljava/util/Map;Ljava/util/Collections$EmptyMap;]Ljava/util/Iterator;Ljava/util/Collections$EmptyIterator;]Ljava/util/Set;Ljava/util/Collections$EmptySet;
 HSPLcom/android/server/pm/Settings;->writePackageLPr(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/util/ArrayList;Lcom/android/server/pm/PackageSetting;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Ljava/lang/Object;Ljava/util/UUID;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/PackageSignatures;Lcom/android/server/pm/PackageSignatures;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/Settings;->writePackageListLPrInternal(I)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/IntArray;Landroid/util/IntArray;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/io/FileOutputStream;Ljava/io/FileOutputStream;]Lcom/android/internal/util/JournaledFile;Lcom/android/internal/util/JournaledFile;]Ljava/io/File;Ljava/io/File;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/permission/LegacyPermissionDataProvider;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/io/BufferedWriter;Ljava/io/BufferedWriter;
 HSPLcom/android/server/pm/Settings;->writePackageRestrictions(IJZ)V+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/ResilientAtomicFile;Lcom/android/server/pm/ResilientAtomicFile;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Lcom/android/server/pm/pkg/PackageUserStateInternal;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/SuspendParams;Lcom/android/server/pm/pkg/SuspendParams;
-HSPLcom/android/server/pm/Settings;->writePreferredActivitiesLPr(Lcom/android/modules/utils/TypedXmlSerializer;IZ)V
-HSPLcom/android/server/pm/Settings;->writeSigningKeySetLPr(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V
+HSPLcom/android/server/pm/Settings;->writePreferredActivitiesLPr(Lcom/android/modules/utils/TypedXmlSerializer;IZ)V+]Lcom/android/server/utils/WatchedSparseArray;Lcom/android/server/utils/WatchedSparseArray;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;,Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PreferredActivity;Lcom/android/server/pm/PreferredActivity;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Lcom/android/server/IntentResolver;Lcom/android/server/pm/PreferredIntentResolver;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;
+HSPLcom/android/server/pm/Settings;->writeSigningKeySetLPr(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageKeySetData;Lcom/android/server/pm/PackageKeySetData;
 HSPLcom/android/server/pm/Settings;->writeUserRestrictionsLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)V
 HSPLcom/android/server/pm/Settings;->writeUsesSdkLibLPw(Lcom/android/modules/utils/TypedXmlSerializer;[Ljava/lang/String;[J[Z)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;
 HSPLcom/android/server/pm/Settings;->writeUsesStaticLibLPw(Lcom/android/modules/utils/TypedXmlSerializer;[Ljava/lang/String;[J)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;
-HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;-><init>(Lcom/android/modules/utils/TypedXmlPullParser;)V
 HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->children()Lcom/android/server/pm/SettingsXml$ChildSection;
 HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->getBoolean(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->getBoolean(Ljava/lang/String;Z)Z
-HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->getInt(Ljava/lang/String;)I
-HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->getInt(Ljava/lang/String;I)I
-HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->getName()Ljava/lang/String;
 HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->getString(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->moveToFirstTag()V
 HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->moveToNext()Z
-HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->moveToNext(Ljava/lang/String;)Z
 HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->moveToNextInternal(Ljava/lang/String;)Z+]Ljava/util/Stack;Ljava/util/Stack;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;
 HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->attribute(Ljava/lang/String;I)Lcom/android/server/pm/SettingsXml$WriteSection;+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;
 HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->attribute(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/pm/SettingsXml$WriteSection;+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;
-HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->attribute(Ljava/lang/String;Z)Lcom/android/server/pm/SettingsXml$WriteSection;
+HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->attribute(Ljava/lang/String;Z)Lcom/android/server/pm/SettingsXml$WriteSection;+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;
 HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->close()V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/Stack;Ljava/util/Stack;
 HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->finish()V+]Lcom/android/server/pm/SettingsXml$WriteSectionImpl;Lcom/android/server/pm/SettingsXml$WriteSectionImpl;
 HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->startSection(Ljava/lang/String;)Lcom/android/server/pm/SettingsXml$WriteSection;+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/Stack;Ljava/util/Stack;
-HSPLcom/android/server/pm/SettingsXml;->parser(Lcom/android/modules/utils/TypedXmlPullParser;)Lcom/android/server/pm/SettingsXml$ReadSection;
-HPLcom/android/server/pm/ShareTargetInfo;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V
-HSPLcom/android/server/pm/SharedLibrariesImpl$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/pm/SharedLibrariesImpl$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLcom/android/server/pm/SharedLibrariesImpl$1;-><init>(Lcom/android/server/pm/SharedLibrariesImpl;)V
-HSPLcom/android/server/pm/SharedLibrariesImpl$1;->onChange(Lcom/android/server/utils/Watchable;)V
-HSPLcom/android/server/pm/SharedLibrariesImpl$2;-><init>(Lcom/android/server/pm/SharedLibrariesImpl;Lcom/android/server/pm/SharedLibrariesImpl;Lcom/android/server/utils/Watchable;)V
-HSPLcom/android/server/pm/SharedLibrariesImpl;->$r8$lambda$x5pbt1IWAO8LsYjbRIDnwkV8JxE(Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;)V
-HSPLcom/android/server/pm/SharedLibrariesImpl;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerServiceInjector;)V
-HSPLcom/android/server/pm/SharedLibrariesImpl;->addBuiltInSharedLibraryLPw(Lcom/android/server/SystemConfig$SharedLibraryEntry;)V
+HPLcom/android/server/pm/ShareTargetInfo;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;
 HSPLcom/android/server/pm/SharedLibrariesImpl;->addSharedLibraryLPr(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/util/Set;Landroid/content/pm/SharedLibraryInfo;Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;)V
 HSPLcom/android/server/pm/SharedLibrariesImpl;->applyDefiningSharedLibraryUpdateLPr(Lcom/android/server/pm/pkg/AndroidPackage;Landroid/content/pm/SharedLibraryInfo;Ljava/util/function/BiConsumer;)V
 HSPLcom/android/server/pm/SharedLibrariesImpl;->collectSharedLibraryInfos(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/util/Map;Ljava/util/Map;)Ljava/util/ArrayList;
@@ -7208,45 +5424,30 @@
 HSPLcom/android/server/pm/SharedLibrariesImpl;->dispatchChange(Lcom/android/server/utils/Watchable;)V
 HSPLcom/android/server/pm/SharedLibrariesImpl;->executeSharedLibrariesUpdateLPw(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Ljava/util/ArrayList;[I)V
 HSPLcom/android/server/pm/SharedLibrariesImpl;->getAllowedSharedLibInfos(Lcom/android/server/pm/InstallRequest;)Ljava/util/List;
-HSPLcom/android/server/pm/SharedLibrariesImpl;->getLatestStaticSharedLibraVersionLPr(Lcom/android/server/pm/pkg/AndroidPackage;)Landroid/content/pm/SharedLibraryInfo;
 HSPLcom/android/server/pm/SharedLibrariesImpl;->getSharedLibraryInfo(Ljava/lang/String;J)Landroid/content/pm/SharedLibraryInfo;
-HSPLcom/android/server/pm/SharedLibrariesImpl;->getSharedLibraryInfos(Ljava/lang/String;)Lcom/android/server/utils/WatchedLongSparseArray;
 HSPLcom/android/server/pm/SharedLibrariesImpl;->getStaticLibraryInfos(Ljava/lang/String;)Lcom/android/server/utils/WatchedLongSparseArray;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;
-HSPLcom/android/server/pm/SharedLibrariesImpl;->getStaticSharedLibLatestVersionSetting(Lcom/android/server/pm/InstallRequest;)Lcom/android/server/pm/PackageSetting;
-HSPLcom/android/server/pm/SharedLibrariesImpl;->lambda$executeSharedLibrariesUpdateLPw$0(Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;)V
-HSPLcom/android/server/pm/SharedLibrariesImpl;->makeCache()Lcom/android/server/utils/SnapshotCache;
-HSPLcom/android/server/pm/SharedLibrariesImpl;->registerObserver(Lcom/android/server/utils/Watcher;)V
-HSPLcom/android/server/pm/SharedLibrariesImpl;->registerObservers()V
-HSPLcom/android/server/pm/SharedLibrariesImpl;->setDeletePackageHelper(Lcom/android/server/pm/DeletePackageHelper;)V
 HSPLcom/android/server/pm/SharedLibrariesImpl;->snapshot()Lcom/android/server/pm/SharedLibrariesRead;
-HSPLcom/android/server/pm/SharedLibrariesImpl;->updateAllSharedLibrariesLPw(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Ljava/util/Map;)Ljava/util/ArrayList;
+HSPLcom/android/server/pm/SharedLibrariesImpl;->updateAllSharedLibrariesLPw(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Ljava/util/Map;)Ljava/util/ArrayList;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/SharedLibrariesImpl;->updateSharedLibraries(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Ljava/util/Map;)V
 HSPLcom/android/server/pm/SharedLibraryUtils;->addSharedLibraryToPackageVersionMap(Ljava/util/Map;Landroid/content/pm/SharedLibraryInfo;)Z
 HSPLcom/android/server/pm/SharedLibraryUtils;->getSharedLibraryInfo(Ljava/lang/String;JLjava/util/Map;Ljava/util/Map;)Landroid/content/pm/SharedLibraryInfo;
-HSPLcom/android/server/pm/SharedUserSetting$1;-><init>(Lcom/android/server/pm/SharedUserSetting;)V
 HSPLcom/android/server/pm/SharedUserSetting$1;->onChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/SharedUserSetting;
-HSPLcom/android/server/pm/SharedUserSetting$2;-><init>(Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/utils/Watchable;)V
 HSPLcom/android/server/pm/SharedUserSetting;-><init>(Lcom/android/server/pm/SharedUserSetting;)V
 HSPLcom/android/server/pm/SharedUserSetting;-><init>(Ljava/lang/String;II)V
 HSPLcom/android/server/pm/SharedUserSetting;->addPackage(Lcom/android/server/pm/PackageSetting;)V
 HSPLcom/android/server/pm/SharedUserSetting;->addProcesses(Ljava/util/Map;)V
-HSPLcom/android/server/pm/SharedUserSetting;->getDisabledPackageSettings()Lcom/android/server/utils/WatchedArraySet;
-HSPLcom/android/server/pm/SharedUserSetting;->getPackageSettings()Lcom/android/server/utils/WatchedArraySet;
 HSPLcom/android/server/pm/SharedUserSetting;->getPackageStates()Landroid/util/ArraySet;+]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;
 HSPLcom/android/server/pm/SharedUserSetting;->getPackages()Ljava/util/List;+]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/pm/SharedUserSetting;->getSeInfoTargetSdkVersion()I
-HSPLcom/android/server/pm/SharedUserSetting;->getSharedUserLegacyPermissionState()Lcom/android/server/pm/permission/LegacyPermissionState;
 HSPLcom/android/server/pm/SharedUserSetting;->getSigningDetails()Landroid/content/pm/SigningDetails;
 HSPLcom/android/server/pm/SharedUserSetting;->isPrivileged()Z
-HSPLcom/android/server/pm/SharedUserSetting;->makeCache()Lcom/android/server/utils/SnapshotCache;
 HSPLcom/android/server/pm/SharedUserSetting;->registerObservers()V
 HSPLcom/android/server/pm/SharedUserSetting;->snapshot()Lcom/android/server/pm/SharedUserSetting;+]Lcom/android/server/utils/SnapshotCache;Lcom/android/server/pm/SharedUserSetting$2;
+HSPLcom/android/server/pm/SharedUserSetting;->snapshot()Ljava/lang/Object;+]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;
 HPLcom/android/server/pm/ShortcutBitmapSaver;-><init>(Lcom/android/server/pm/ShortcutService;)V
 HPLcom/android/server/pm/ShortcutBitmapSaver;->saveBitmapLocked(Landroid/content/pm/ShortcutInfo;ILandroid/graphics/Bitmap$CompressFormat;I)V
 HPLcom/android/server/pm/ShortcutBitmapSaver;->waitForAllSavesLocked()Z
 HPLcom/android/server/pm/ShortcutLauncher;->getPinnedShortcutIds(Ljava/lang/String;I)Landroid/util/ArraySet;
 HPLcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda23;->accept(Ljava/lang/Object;)V
-HPLcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda28;-><init>(Lcom/android/server/pm/ShortcutPackage;Ljava/util/ArrayList;Lcom/android/server/pm/ShortcutService;[Z)V
 HPLcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda28;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HPLcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda29;-><init>(Lcom/android/server/pm/ShortcutPackage;Ljava/util/List;Ljava/util/function/Predicate;ILjava/lang/String;Landroid/util/ArraySet;Z)V
 HPLcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda29;->accept(Ljava/lang/Object;)V
@@ -7255,13 +5456,13 @@
 HPLcom/android/server/pm/ShortcutPackage;->$r8$lambda$PHafQNXd3rG88ujYp-2FnsxrvDY(Ljava/util/function/Consumer;Landroid/content/pm/ShortcutInfo;)Ljava/lang/Boolean;
 HPLcom/android/server/pm/ShortcutPackage;->$r8$lambda$siuXAQT-OivpKlIZX1n0iIppP6o(Lcom/android/server/pm/ShortcutPackage;Ljava/util/List;Ljava/util/function/Predicate;ILjava/lang/String;Landroid/util/ArraySet;ZLandroid/content/pm/ShortcutInfo;)V
 HPLcom/android/server/pm/ShortcutPackage;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;Lcom/android/server/pm/ShortcutPackageInfo;)V
-HPLcom/android/server/pm/ShortcutPackage;->adjustRanks()V
+HPLcom/android/server/pm/ShortcutPackage;->adjustRanks()V+]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/pm/ShortcutPackage;->areAllActivitiesStillEnabled()Z
 HPLcom/android/server/pm/ShortcutPackage;->ensureShortcutCountBeforePush()V
 HPLcom/android/server/pm/ShortcutPackage;->filter(Ljava/util/List;Ljava/util/function/Predicate;ILjava/lang/String;Landroid/util/ArraySet;ZLandroid/content/pm/ShortcutInfo;)V+]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/function/Predicate;megamorphic_types
-HPLcom/android/server/pm/ShortcutPackage;->findAll(Ljava/util/List;Ljava/util/function/Predicate;ILjava/lang/String;IZ)V
+HPLcom/android/server/pm/ShortcutPackage;->findAll(Ljava/util/List;Ljava/util/function/Predicate;ILjava/lang/String;IZ)V+]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutLauncher;Lcom/android/server/pm/ShortcutLauncher;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
 HPLcom/android/server/pm/ShortcutPackage;->findShortcutById(Ljava/lang/String;)Landroid/content/pm/ShortcutInfo;
-HPLcom/android/server/pm/ShortcutPackage;->forEachShortcut(Ljava/util/function/Consumer;)V
+HPLcom/android/server/pm/ShortcutPackage;->forEachShortcut(Ljava/util/function/Consumer;)V+]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;
 HPLcom/android/server/pm/ShortcutPackage;->forEachShortcutMutate(Ljava/util/function/Consumer;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Consumer;megamorphic_types
 HPLcom/android/server/pm/ShortcutPackage;->forEachShortcutStopWhen(Ljava/util/function/Function;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Function;Lcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda3;,Lcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda36;,Lcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda28;]Ljava/lang/Boolean;Ljava/lang/Boolean;
 HPLcom/android/server/pm/ShortcutPackage;->forceDeleteShortcutInner(Ljava/lang/String;)Landroid/content/pm/ShortcutInfo;
@@ -7275,23 +5476,23 @@
 HPLcom/android/server/pm/ShortcutPackage;->lambda$sortShortcutsToActivities$22(Landroid/util/ArrayMap;Landroid/content/pm/ShortcutInfo;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/pm/ShortcutPackage;->parseShortcut(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;IZ)Landroid/content/pm/ShortcutInfo;
 HPLcom/android/server/pm/ShortcutPackage;->pushDynamicShortcut(Landroid/content/pm/ShortcutInfo;Ljava/util/List;)Z
-HPLcom/android/server/pm/ShortcutPackage;->rescanPackageIfNeeded(ZZ)Z
-HPLcom/android/server/pm/ShortcutPackage;->saveShortcut(Lcom/android/modules/utils/TypedXmlSerializer;Landroid/content/pm/ShortcutInfo;ZZ)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;,Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;]Landroid/app/Person;Landroid/app/Person;]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;]Landroid/content/LocusId;Landroid/content/LocusId;]Ljava/util/Set;Landroid/util/ArraySet;
-HPLcom/android/server/pm/ShortcutPackage;->saveShortcut(Ljava/util/Collection;)V
+HPLcom/android/server/pm/ShortcutPackage;->rescanPackageIfNeeded(ZZ)Z+]Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/pm/ShortcutPackage;->saveShortcut(Lcom/android/modules/utils/TypedXmlSerializer;Landroid/content/pm/ShortcutInfo;ZZ)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;]Landroid/app/Person;Landroid/app/Person;]Landroid/content/LocusId;Landroid/content/LocusId;]Ljava/util/Set;Landroid/util/ArraySet;]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;
+HPLcom/android/server/pm/ShortcutPackage;->saveShortcut(Ljava/util/Collection;)V+]Ljava/util/Collection;Ljava/util/Arrays$ArrayList;]Ljava/util/Iterator;Ljava/util/Arrays$ArrayItr;
 HPLcom/android/server/pm/ShortcutPackage;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;Z)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;,Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/pm/ShareTargetInfo;Lcom/android/server/pm/ShareTargetInfo;
 HPLcom/android/server/pm/ShortcutPackage;->scheduleSaveToAppSearchLocked()V
+HPLcom/android/server/pm/ShortcutPackageInfo;-><init>(JJLjava/util/ArrayList;Z)V
 HPLcom/android/server/pm/ShortcutPackageInfo;->isShadow()Z
 HPLcom/android/server/pm/ShortcutPackageInfo;->saveToXml(Lcom/android/server/pm/ShortcutService;Lcom/android/modules/utils/TypedXmlSerializer;Z)V
 HPLcom/android/server/pm/ShortcutPackageItem;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;Lcom/android/server/pm/ShortcutPackageInfo;)V
 HPLcom/android/server/pm/ShortcutPackageItem;->attemptToRestoreIfNeededAndSave()V+]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;
-HPLcom/android/server/pm/ShortcutPackageItem;->getPackageInfo()Lcom/android/server/pm/ShortcutPackageInfo;
 HPLcom/android/server/pm/ShortcutPackageItem;->getPackageName()Ljava/lang/String;
 HPLcom/android/server/pm/ShortcutPackageItem;->getPackageUserId()I
 HPLcom/android/server/pm/ShortcutPackageItem;->getResilientFile(Ljava/io/File;)Lcom/android/server/pm/ResilientAtomicFile;
 HPLcom/android/server/pm/ShortcutPackageItem;->saveShortcutPackageItem()V
 HPLcom/android/server/pm/ShortcutPackageItem;->saveToFileLocked(Ljava/io/File;Z)V
-HPLcom/android/server/pm/ShortcutPackageItem;->scheduleSave()V
-HPLcom/android/server/pm/ShortcutParser;->parseShortcutsOneFile(Lcom/android/server/pm/ShortcutService;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILjava/util/List;Ljava/util/List;)Ljava/util/List;
+HPLcom/android/server/pm/ShortcutPackageItem;->scheduleSave()V+]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
+HPLcom/android/server/pm/ShortcutParser;->parseShortcutsOneFile(Lcom/android/server/pm/ShortcutService;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILjava/util/List;Ljava/util/List;)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/res/XmlResourceParser;Landroid/content/res/XmlBlock$Parser;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Landroid/content/Intent;Landroid/content/Intent;
 HPLcom/android/server/pm/ShortcutService$$ExternalSyntheticLambda16;-><init>(Lcom/android/server/pm/ShortcutService;ILjava/util/List;Ljava/lang/String;Landroid/os/UserHandle;Ljava/util/List;)V
 HPLcom/android/server/pm/ShortcutService$$ExternalSyntheticLambda22;-><init>(Lcom/android/server/pm/ShortcutService;I)V
 HPLcom/android/server/pm/ShortcutService$$ExternalSyntheticLambda22;->test(Ljava/lang/Object;)Z
@@ -7300,105 +5501,85 @@
 HSPLcom/android/server/pm/ShortcutService$4;->onUidStateChanged(IIJI)V+]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
 HPLcom/android/server/pm/ShortcutService$LocalService$$ExternalSyntheticLambda11;-><init>(JLandroid/util/ArraySet;Landroid/util/ArraySet;Landroid/content/ComponentName;ZZZZZ)V
 HPLcom/android/server/pm/ShortcutService$LocalService$$ExternalSyntheticLambda11;->test(Ljava/lang/Object;)Z
-HPLcom/android/server/pm/ShortcutService$LocalService;->$r8$lambda$4oN-teeezN_bMPNKBELK1aAUWLM(JLandroid/util/ArraySet;Landroid/util/ArraySet;Landroid/content/ComponentName;ZZZZZLandroid/content/pm/ShortcutInfo;)Z
+HPLcom/android/server/pm/ShortcutService$LocalService$$ExternalSyntheticLambda6;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/pm/ShortcutService$LocalService;->getFilterFromQuery(Landroid/util/ArraySet;Ljava/util/List;JLandroid/content/ComponentName;IZ)Ljava/util/function/Predicate;
-HPLcom/android/server/pm/ShortcutService$LocalService;->getShortcuts(ILjava/lang/String;JLjava/lang/String;Ljava/util/List;Ljava/util/List;Landroid/content/ComponentName;IIII)Ljava/util/List;
-HPLcom/android/server/pm/ShortcutService$LocalService;->getShortcutsInnerLocked(ILjava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;JLandroid/content/ComponentName;IILjava/util/ArrayList;III)V
-HPLcom/android/server/pm/ShortcutService$LocalService;->hasShortcutHostPermission(ILjava/lang/String;II)Z
+HPLcom/android/server/pm/ShortcutService$LocalService;->getShortcuts(ILjava/lang/String;JLjava/lang/String;Ljava/util/List;Ljava/util/List;Landroid/content/ComponentName;IIII)Ljava/util/List;+]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutLauncher;]Lcom/android/server/pm/ShortcutUser;Lcom/android/server/pm/ShortcutUser;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
+HPLcom/android/server/pm/ShortcutService$LocalService;->getShortcutsInnerLocked(ILjava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;JLandroid/content/ComponentName;IILjava/util/ArrayList;III)V+]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutUser;Lcom/android/server/pm/ShortcutUser;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
+HPLcom/android/server/pm/ShortcutService$LocalService;->hasShortcutHostPermission(ILjava/lang/String;II)Z+]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
 HPLcom/android/server/pm/ShortcutService$LocalService;->lambda$getFilterFromQuery$1(JLandroid/util/ArraySet;Landroid/util/ArraySet;Landroid/content/ComponentName;ZZZZZLandroid/content/pm/ShortcutInfo;)Z+]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/ComponentName;Landroid/content/ComponentName;
-HPLcom/android/server/pm/ShortcutService;->canSeeAnyPinnedShortcut(Ljava/lang/String;III)Z
+HPLcom/android/server/pm/ShortcutService;->canSeeAnyPinnedShortcut(Ljava/lang/String;III)Z+]Lcom/android/server/pm/ShortcutNonPersistentUser;Lcom/android/server/pm/ShortcutNonPersistentUser;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
+HPLcom/android/server/pm/ShortcutService;->fillInDefaultActivity(Ljava/util/List;)V
 HPLcom/android/server/pm/ShortcutService;->fixUpIncomingShortcutInfo(Landroid/content/pm/ShortcutInfo;ZZ)V
 HPLcom/android/server/pm/ShortcutService;->fixUpShortcutResourceNamesAndValues(Landroid/content/pm/ShortcutInfo;)V
 HPLcom/android/server/pm/ShortcutService;->getDefaultLauncher(I)Ljava/lang/String;
-HPLcom/android/server/pm/ShortcutService;->getLauncherShortcutsLocked(Ljava/lang/String;II)Lcom/android/server/pm/ShortcutLauncher;
+HPLcom/android/server/pm/ShortcutService;->getLauncherShortcutsLocked(Ljava/lang/String;II)Lcom/android/server/pm/ShortcutLauncher;+]Lcom/android/server/pm/ShortcutUser;Lcom/android/server/pm/ShortcutUser;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
 HPLcom/android/server/pm/ShortcutService;->getMainActivityIntent()Landroid/content/Intent;
 HPLcom/android/server/pm/ShortcutService;->getStatStartTime()J+]Lcom/android/internal/util/StatLogger;Lcom/android/internal/util/StatLogger;
 HPLcom/android/server/pm/ShortcutService;->getUserShortcutsLocked(I)Lcom/android/server/pm/ShortcutUser;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
 HSPLcom/android/server/pm/ShortcutService;->handleOnUidStateChanged(II)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
-HPLcom/android/server/pm/ShortcutService;->hasShortcutHostPermission(Ljava/lang/String;III)Z
-HPLcom/android/server/pm/ShortcutService;->injectApplicationInfoWithUninstalled(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;
+HPLcom/android/server/pm/ShortcutService;->hasShortcutHostPermission(Ljava/lang/String;III)Z+]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
+HPLcom/android/server/pm/ShortcutService;->injectApplicationInfoWithUninstalled(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
 HPLcom/android/server/pm/ShortcutService;->injectClearCallingIdentity()J
-HPLcom/android/server/pm/ShortcutService;->injectGetPackageUid(Ljava/lang/String;I)I
+HPLcom/android/server/pm/ShortcutService;->injectGetPackageUid(Ljava/lang/String;I)I+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
 HPLcom/android/server/pm/ShortcutService;->injectGetResourcesForApplicationAsUser(Ljava/lang/String;I)Landroid/content/res/Resources;
-HPLcom/android/server/pm/ShortcutService;->injectHasAccessShortcutsPermission(II)Z
+HPLcom/android/server/pm/ShortcutService;->injectHasAccessShortcutsPermission(II)Z+]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/pm/ShortcutService;->injectIsActivityEnabledAndExported(Landroid/content/ComponentName;I)Z
-HPLcom/android/server/pm/ShortcutService;->injectPackageInfoWithUninstalled(Ljava/lang/String;IZ)Landroid/content/pm/PackageInfo;
+HPLcom/android/server/pm/ShortcutService;->injectIsMainActivity(Landroid/content/ComponentName;I)Z
+HPLcom/android/server/pm/ShortcutService;->injectPackageInfoWithUninstalled(Ljava/lang/String;IZ)Landroid/content/pm/PackageInfo;+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
 HSPLcom/android/server/pm/ShortcutService;->injectPostToHandler(Ljava/lang/Runnable;)V+]Landroid/os/Handler;Landroid/os/Handler;
 HPLcom/android/server/pm/ShortcutService;->injectPostToHandlerDebounced(Ljava/lang/Object;Ljava/lang/Runnable;)V
+HPLcom/android/server/pm/ShortcutService;->injectRestoreCallingIdentity(J)V
 HPLcom/android/server/pm/ShortcutService;->isInstalled(Landroid/content/pm/ApplicationInfo;)Z
 HPLcom/android/server/pm/ShortcutService;->isUserUnlockedL(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;
-HPLcom/android/server/pm/ShortcutService;->lambda$notifyShortcutChangeCallbacks$3(ILjava/util/List;Ljava/lang/String;Landroid/os/UserHandle;Ljava/util/List;)V
+HPLcom/android/server/pm/ShortcutService;->lambda$notifyShortcutChangeCallbacks$3(ILjava/util/List;Ljava/lang/String;Landroid/os/UserHandle;Ljava/util/List;)V+]Landroid/content/pm/LauncherApps$ShortcutChangeCallback;Lcom/android/server/people/data/DataManager$ShortcutServiceCallback;,Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$ShortcutChangeHandler;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
 HPLcom/android/server/pm/ShortcutService;->lambda$queryActivities$16(ILandroid/content/pm/ResolveInfo;)Z
 HPLcom/android/server/pm/ShortcutService;->logDurationStat(IJ)V+]Lcom/android/internal/util/StatLogger;Lcom/android/internal/util/StatLogger;
 HPLcom/android/server/pm/ShortcutService;->notifyShortcutChangeCallbacks(Ljava/lang/String;ILjava/util/List;Ljava/util/List;)V
 HPLcom/android/server/pm/ShortcutService;->packageShortcutsChanged(Lcom/android/server/pm/ShortcutPackage;Ljava/util/List;Ljava/util/List;)V
 HPLcom/android/server/pm/ShortcutService;->pushDynamicShortcut(Ljava/lang/String;Landroid/content/pm/ShortcutInfo;I)V
-HPLcom/android/server/pm/ShortcutService;->queryActivities(Landroid/content/Intent;IZ)Ljava/util/List;
-HPLcom/android/server/pm/ShortcutService;->queryActivities(Landroid/content/Intent;Ljava/lang/String;Landroid/content/ComponentName;I)Ljava/util/List;
-HPLcom/android/server/pm/ShortcutService;->removeNonKeyFields(Ljava/util/List;)Ljava/util/List;
+HPLcom/android/server/pm/ShortcutService;->queryActivities(Landroid/content/Intent;IZ)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
+HPLcom/android/server/pm/ShortcutService;->queryActivities(Landroid/content/Intent;Ljava/lang/String;Landroid/content/ComponentName;I)Ljava/util/List;+]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Landroid/content/Intent;Landroid/content/Intent;
+HPLcom/android/server/pm/ShortcutService;->removeDynamicShortcuts(Ljava/lang/String;Ljava/util/List;I)V
+HPLcom/android/server/pm/ShortcutService;->removeNonKeyFields(Ljava/util/List;)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;
 HPLcom/android/server/pm/ShortcutService;->saveIconAndFixUpShortcutLocked(Lcom/android/server/pm/ShortcutPackage;Landroid/content/pm/ShortcutInfo;)V
 HPLcom/android/server/pm/ShortcutService;->setReturnedByServer(Ljava/util/List;)Ljava/util/List;+]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;]Ljava/util/List;Ljava/util/ArrayList;
-HPLcom/android/server/pm/ShortcutService;->throwIfUserLockedL(I)V
-HPLcom/android/server/pm/ShortcutService;->verifyCaller(Ljava/lang/String;I)V
+HPLcom/android/server/pm/ShortcutService;->throwIfUserLockedL(I)V+]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
+HPLcom/android/server/pm/ShortcutService;->verifyCaller(Ljava/lang/String;I)V+]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;
 HPLcom/android/server/pm/ShortcutService;->writeAttr(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/lang/String;J)V
 HPLcom/android/server/pm/ShortcutService;->writeAttr(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/lang/String;Ljava/lang/CharSequence;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;,Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/text/SpannableString;
 HPLcom/android/server/pm/ShortcutUser;->detectLocaleChange()V
-HPLcom/android/server/pm/ShortcutUser;->forAllPackages(Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;Lcom/android/server/pm/ShortcutService$LocalService$$ExternalSyntheticLambda6;,Lcom/android/server/pm/ShortcutUser$$ExternalSyntheticLambda8;
+HPLcom/android/server/pm/ShortcutUser;->forAllPackages(Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;megamorphic_types
 HPLcom/android/server/pm/ShortcutUser;->getAppSearch(Landroid/app/appsearch/AppSearchManager$SearchContext;)Lcom/android/internal/infra/AndroidFuture;
-HPLcom/android/server/pm/ShortcutUser;->getLauncherShortcuts(Ljava/lang/String;I)Lcom/android/server/pm/ShortcutLauncher;
-HPLcom/android/server/pm/ShortcutUser;->getPackageShortcutsIfExists(Ljava/lang/String;)Lcom/android/server/pm/ShortcutPackage;
-HPLcom/android/server/pm/ShortcutUser;->rescanPackageIfNeeded(Ljava/lang/String;Z)V
-HSPLcom/android/server/pm/SnapshotStatistics$1;-><init>(Lcom/android/server/pm/SnapshotStatistics;Landroid/os/Looper;)V
-HSPLcom/android/server/pm/SnapshotStatistics$BinMap;-><init>([I)V
+HPLcom/android/server/pm/ShortcutUser;->getLauncherShortcuts(Ljava/lang/String;I)Lcom/android/server/pm/ShortcutLauncher;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutLauncher;
+HPLcom/android/server/pm/ShortcutUser;->getPackageShortcutsIfExists(Ljava/lang/String;)Lcom/android/server/pm/ShortcutPackage;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;
+HPLcom/android/server/pm/ShortcutUser;->rescanPackageIfNeeded(Ljava/lang/String;Z)V+]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutUser;Lcom/android/server/pm/ShortcutUser;
 HSPLcom/android/server/pm/SnapshotStatistics$BinMap;->count()I
 HSPLcom/android/server/pm/SnapshotStatistics$BinMap;->getBin(I)I
 HSPLcom/android/server/pm/SnapshotStatistics$Stats;-><init>(Lcom/android/server/pm/SnapshotStatistics;J)V
-HSPLcom/android/server/pm/SnapshotStatistics$Stats;-><init>(Lcom/android/server/pm/SnapshotStatistics;JLcom/android/server/pm/SnapshotStatistics$Stats-IA;)V
 HSPLcom/android/server/pm/SnapshotStatistics$Stats;->rebuild(IIIIZZ)V
 HSPLcom/android/server/pm/SnapshotStatistics;->-$$Nest$fgetmTimeBins(Lcom/android/server/pm/SnapshotStatistics;)Lcom/android/server/pm/SnapshotStatistics$BinMap;
-HSPLcom/android/server/pm/SnapshotStatistics;->-$$Nest$fgetmUseBins(Lcom/android/server/pm/SnapshotStatistics;)Lcom/android/server/pm/SnapshotStatistics$BinMap;
-HSPLcom/android/server/pm/SnapshotStatistics;-><clinit>()V
-HSPLcom/android/server/pm/SnapshotStatistics;-><init>()V
-HSPLcom/android/server/pm/SnapshotStatistics;->rebuild(JJII)V
+HSPLcom/android/server/pm/SnapshotStatistics;->rebuild(JJII)V+]Lcom/android/server/pm/SnapshotStatistics$BinMap;Lcom/android/server/pm/SnapshotStatistics$BinMap;
 HSPLcom/android/server/pm/SnapshotStatistics;->scheduleTick()V
+HPLcom/android/server/pm/SnapshotStatistics;->shift([Lcom/android/server/pm/SnapshotStatistics$Stats;J)V
 HPLcom/android/server/pm/SnapshotStatistics;->tick()V
-HSPLcom/android/server/pm/StorageEventHelper;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/DeletePackageHelper;Lcom/android/server/pm/RemovePackageHelper;)V
 HSPLcom/android/server/pm/StorageEventHelper;->reconcileApps(Lcom/android/server/pm/Computer;Ljava/lang/String;)V
-HSPLcom/android/server/pm/SuspendPackageHelper;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/BroadcastHelper;Lcom/android/server/pm/ProtectedPackages;)V
 HPLcom/android/server/pm/SuspendPackageHelper;->canSuspendPackageForUser(Lcom/android/server/pm/Computer;[Ljava/lang/String;II)[Z
-HSPLcom/android/server/pm/SuspendPackageHelper;->isPackageSuspended(Lcom/android/server/pm/Computer;Ljava/lang/String;II)Z
-HSPLcom/android/server/pm/UpdateOwnershipHelper;-><init>()V
+HSPLcom/android/server/pm/SuspendPackageHelper;->isPackageSuspended(Lcom/android/server/pm/Computer;Ljava/lang/String;II)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/UpdateOwnershipHelper;->hasValidOwnershipDenyList(Lcom/android/server/pm/PackageSetting;)Z
 HSPLcom/android/server/pm/UpdateOwnershipHelper;->isUpdateOwnershipDenylisted(Ljava/lang/String;)Z
-HSPLcom/android/server/pm/UserDataPreparer;-><init>(Lcom/android/server/pm/Installer;Ljava/lang/Object;Landroid/content/Context;)V
-HSPLcom/android/server/pm/UserJourneyLogger;-><init>()V
-HSPLcom/android/server/pm/UserManagerInternal;-><init>()V
-HSPLcom/android/server/pm/UserManagerService$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/pm/UserManagerService;)V
-HSPLcom/android/server/pm/UserManagerService$$ExternalSyntheticLambda4;-><init>(Lcom/android/server/pm/UserManagerService;I)V
-HSPLcom/android/server/pm/UserManagerService$1;-><init>(Lcom/android/server/pm/UserManagerService;)V
-HSPLcom/android/server/pm/UserManagerService$2;-><init>(Lcom/android/server/pm/UserManagerService;)V
-HSPLcom/android/server/pm/UserManagerService$3;-><init>(Lcom/android/server/pm/UserManagerService;)V
-HSPLcom/android/server/pm/UserManagerService$LocalService;-><init>(Lcom/android/server/pm/UserManagerService;)V
-HSPLcom/android/server/pm/UserManagerService$LocalService;-><init>(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService$LocalService-IA;)V
 HSPLcom/android/server/pm/UserManagerService$LocalService;->exists(I)Z
 HSPLcom/android/server/pm/UserManagerService$LocalService;->getUserInfo(I)Landroid/content/pm/UserInfo;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/UserManagerService$LocalService;->getUserInfos()[Landroid/content/pm/UserInfo;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/UserManagerService$LocalService;->getUserProperties(I)Landroid/content/pm/UserProperties;
 HSPLcom/android/server/pm/UserManagerService$LocalService;->getUsers(ZZZ)Ljava/util/List;
 HSPLcom/android/server/pm/UserManagerService$LocalService;->hasUserRestriction(Ljava/lang/String;I)Z+]Landroid/os/Bundle;Landroid/os/Bundle;
-HPLcom/android/server/pm/UserManagerService$LocalService;->isProfileAccessible(IILjava/lang/String;Z)Z
-HSPLcom/android/server/pm/UserManagerService$LocalService;->isUserRunning(I)Z
+HPLcom/android/server/pm/UserManagerService$LocalService;->isProfileAccessible(IILjava/lang/String;Z)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
+HSPLcom/android/server/pm/UserManagerService$LocalService;->isUserRunning(I)Z+]Lcom/android/server/pm/UserManagerService$WatchedUserStates;Lcom/android/server/pm/UserManagerService$WatchedUserStates;
 HSPLcom/android/server/pm/UserManagerService$LocalService;->isUserUnlocked(I)Z+]Lcom/android/server/pm/UserManagerService$WatchedUserStates;Lcom/android/server/pm/UserManagerService$WatchedUserStates;
 HSPLcom/android/server/pm/UserManagerService$LocalService;->isUserUnlockingOrUnlocked(I)Z+]Lcom/android/server/pm/UserManagerService$WatchedUserStates;Lcom/android/server/pm/UserManagerService$WatchedUserStates;
 HSPLcom/android/server/pm/UserManagerService$LocalService;->isUserVisible(I)Z+]Lcom/android/server/pm/UserVisibilityMediator;Lcom/android/server/pm/UserVisibilityMediator;
-HSPLcom/android/server/pm/UserManagerService$MainHandler;-><init>(Lcom/android/server/pm/UserManagerService;)V
-HSPLcom/android/server/pm/UserManagerService$SettingsObserver;-><init>(Lcom/android/server/pm/UserManagerService;Landroid/os/Handler;)V
-HSPLcom/android/server/pm/UserManagerService$UserData;-><init>()V
-HSPLcom/android/server/pm/UserManagerService$UserData;->setLastRequestQuietModeEnabledMillis(J)V
-HSPLcom/android/server/pm/UserManagerService$WatchedUserStates;-><init>(Lcom/android/server/pm/UserManagerService;)V
+HSPLcom/android/server/pm/UserManagerService$LocalService;->setUserRestriction(ILjava/lang/String;Z)V+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/pm/UserManagerService$WatchedUserStates;->get(II)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HSPLcom/android/server/pm/UserManagerService$WatchedUserStates;->invalidateIsUserUnlockedCache()V
-HSPLcom/android/server/pm/UserManagerService$WatchedUserStates;->put(II)V
 HSPLcom/android/server/pm/UserManagerService;->-$$Nest$fgetmUserStates(Lcom/android/server/pm/UserManagerService;)Lcom/android/server/pm/UserManagerService$WatchedUserStates;
 HSPLcom/android/server/pm/UserManagerService;->-$$Nest$fgetmUserVisibilityMediator(Lcom/android/server/pm/UserManagerService;)Lcom/android/server/pm/UserVisibilityMediator;
 HSPLcom/android/server/pm/UserManagerService;->-$$Nest$fgetmUsers(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseArray;
@@ -7406,49 +5587,44 @@
 HSPLcom/android/server/pm/UserManagerService;->-$$Nest$mgetEffectiveUserRestrictions(Lcom/android/server/pm/UserManagerService;I)Landroid/os/Bundle;
 HSPLcom/android/server/pm/UserManagerService;->-$$Nest$mgetUserInfoNoChecks(Lcom/android/server/pm/UserManagerService;I)Landroid/content/pm/UserInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/pm/UserManagerService;->-$$Nest$mgetUserPropertiesInternal(Lcom/android/server/pm/UserManagerService;I)Landroid/content/pm/UserProperties;
-HSPLcom/android/server/pm/UserManagerService;->-$$Nest$mgetUsersInternal(Lcom/android/server/pm/UserManagerService;ZZZ)Ljava/util/List;
-HSPLcom/android/server/pm/UserManagerService;-><clinit>()V
-HSPLcom/android/server/pm/UserManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/UserDataPreparer;Ljava/lang/Object;)V
 HSPLcom/android/server/pm/UserManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/UserDataPreparer;Ljava/lang/Object;Ljava/io/File;Landroid/util/SparseArray;)V
 HSPLcom/android/server/pm/UserManagerService;->checkCreateUsersPermission(Ljava/lang/String;)V
 HSPLcom/android/server/pm/UserManagerService;->checkManageOrInteractPermissionIfCallerInOtherProfileGroup(ILjava/lang/String;)V+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
-HSPLcom/android/server/pm/UserManagerService;->checkQueryOrCreateUsersPermission(Ljava/lang/String;)V
+HSPLcom/android/server/pm/UserManagerService;->checkQueryOrCreateUsersPermission(Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/pm/UserManagerService;->checkQueryOrInteractPermissionIfCallerInOtherProfileGroup(ILjava/lang/String;)V+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
-HSPLcom/android/server/pm/UserManagerService;->emulateSystemUserModeIfNeeded()V
 HSPLcom/android/server/pm/UserManagerService;->exists(I)Z+]Lcom/android/server/pm/UserManagerService$LocalService;Lcom/android/server/pm/UserManagerService$LocalService;
 HPLcom/android/server/pm/UserManagerService;->getApplicationRestrictionsForUser(Ljava/lang/String;I)Landroid/os/Bundle;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/pm/UserManagerService;->getEffectiveUserRestrictions(I)Landroid/os/Bundle;+]Lcom/android/server/pm/RestrictionsSet;Lcom/android/server/pm/RestrictionsSet;
 HSPLcom/android/server/pm/UserManagerService;->getInstance()Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/pm/UserManagerService;->getInternalForInjectorOnly()Lcom/android/server/pm/UserManagerInternal;
 HSPLcom/android/server/pm/UserManagerService;->getMainUserIdUnchecked()I
-HSPLcom/android/server/pm/UserManagerService;->getOwnerName()Ljava/lang/String;
 HSPLcom/android/server/pm/UserManagerService;->getProfileIds(ILjava/lang/String;ZZ)[I+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/IntArray;Landroid/util/IntArray;
 HSPLcom/android/server/pm/UserManagerService;->getProfileIds(IZ)[I+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
-HSPLcom/android/server/pm/UserManagerService;->getProfileIdsLU(ILjava/lang/String;ZZ)Landroid/util/IntArray;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Ljava/lang/Object;Ljava/lang/String;
+HSPLcom/android/server/pm/UserManagerService;->getProfileIdsLU(ILjava/lang/String;ZZ)Landroid/util/IntArray;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
 HSPLcom/android/server/pm/UserManagerService;->getProfileParent(I)Landroid/content/pm/UserInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/pm/UserManagerService;->getProfileParentLU(I)Landroid/content/pm/UserInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/pm/UserManagerService;->getProfileType(I)Ljava/lang/String;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
 HSPLcom/android/server/pm/UserManagerService;->getProfiles(IZ)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/pm/UserManagerService;->getProfilesLU(ILjava/lang/String;ZZ)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/pm/UserManagerService;->getUidForPackage(Ljava/lang/String;)I+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
-HSPLcom/android/server/pm/UserManagerService;->getUserDataLU(I)Lcom/android/server/pm/UserManagerService$UserData;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/pm/UserManagerService;->getUserDataLU(I)Lcom/android/server/pm/UserManagerService$UserData;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/pm/UserManagerService;->getUserFile(I)Lcom/android/server/pm/ResilientAtomicFile;
 HSPLcom/android/server/pm/UserManagerService;->getUserHandle(I)I
+HSPLcom/android/server/pm/UserManagerService;->getUserIcon(I)Landroid/os/ParcelFileDescriptor;
 HSPLcom/android/server/pm/UserManagerService;->getUserIds()[I
 HSPLcom/android/server/pm/UserManagerService;->getUserIdsIncludingPreCreated()[I
 HSPLcom/android/server/pm/UserManagerService;->getUserInfo(I)Landroid/content/pm/UserInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
-HSPLcom/android/server/pm/UserManagerService;->getUserInfoLU(I)Landroid/content/pm/UserInfo;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
+HSPLcom/android/server/pm/UserManagerService;->getUserInfoLU(I)Landroid/content/pm/UserInfo;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/UserManagerService;->getUserInfoNoChecks(I)Landroid/content/pm/UserInfo;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/pm/UserManagerService;->getUserListFile()Lcom/android/server/pm/ResilientAtomicFile;
 HSPLcom/android/server/pm/UserManagerService;->getUserPropertiesCopy(I)Landroid/content/pm/UserProperties;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/pm/UserManagerService;->getUserPropertiesInternal(I)Landroid/content/pm/UserProperties;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
-HPLcom/android/server/pm/UserManagerService;->getUserRestrictionSources(Ljava/lang/String;I)Ljava/util/List;
+HPLcom/android/server/pm/UserManagerService;->getUserRestrictionSources(Ljava/lang/String;I)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/app/admin/DevicePolicyManagerInternal;Lcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;
 HSPLcom/android/server/pm/UserManagerService;->getUserSerialNumber(I)I+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HPLcom/android/server/pm/UserManagerService;->getUserStartRealtime()J+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HPLcom/android/server/pm/UserManagerService;->getUserStatusBarIconResId(I)I
 HSPLcom/android/server/pm/UserManagerService;->getUserSwitchability(I)I
-HPLcom/android/server/pm/UserManagerService;->getUserTypeDetailsNoChecks(I)Lcom/android/server/pm/UserTypeDetails;
-HPLcom/android/server/pm/UserManagerService;->getUserTypeNoChecks(I)Ljava/lang/String;
+HPLcom/android/server/pm/UserManagerService;->getUserTypeDetailsNoChecks(I)Lcom/android/server/pm/UserTypeDetails;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
+HPLcom/android/server/pm/UserManagerService;->getUserTypeNoChecks(I)Ljava/lang/String;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HPLcom/android/server/pm/UserManagerService;->getUserUnlockRealtime()J+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/pm/UserManagerService;->getUsers(ZZZ)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/pm/UserManagerService;->getUsersInternal(ZZZ)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
@@ -7460,154 +5636,62 @@
 HSPLcom/android/server/pm/UserManagerService;->hasQueryOrCreateUsersPermission()Z
 HSPLcom/android/server/pm/UserManagerService;->hasQueryUsersPermission()Z
 HSPLcom/android/server/pm/UserManagerService;->hasUserRestriction(Ljava/lang/String;I)Z+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/UserManagerService$LocalService;Lcom/android/server/pm/UserManagerService$LocalService;
-HSPLcom/android/server/pm/UserManagerService;->initDefaultGuestRestrictions()V
-HSPLcom/android/server/pm/UserManagerService;->invalidateOwnerNameIfNecessary(Landroid/content/res/Resources;Z)V
+HSPLcom/android/server/pm/UserManagerService;->isHeadlessSystemUserMode()Z
 HPLcom/android/server/pm/UserManagerService;->isProfile(I)Z
-HPLcom/android/server/pm/UserManagerService;->isProfileHidden(I)Z
+HPLcom/android/server/pm/UserManagerService;->isProfileHidden(I)Z+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/pm/UserManagerService;->isProfileOf(Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;)Z
-HPLcom/android/server/pm/UserManagerService;->isProfileUnchecked(I)Z
-HSPLcom/android/server/pm/UserManagerService;->isQuietModeEnabled(I)Z
+HPLcom/android/server/pm/UserManagerService;->isProfileUnchecked(I)Z+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
+HSPLcom/android/server/pm/UserManagerService;->isQuietModeEnabled(I)Z+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
 HSPLcom/android/server/pm/UserManagerService;->isSameProfileGroupNoChecks(II)Z+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/pm/UserManagerService;->isSettingRestrictedForUser(Ljava/lang/String;ILjava/lang/String;I)Z
-HSPLcom/android/server/pm/UserManagerService;->isUserRunning(I)Z
-HSPLcom/android/server/pm/UserManagerService;->isUserTypeSubtypeOfFull(Ljava/lang/String;)Z
-HSPLcom/android/server/pm/UserManagerService;->isUserTypeSubtypeOfProfile(Ljava/lang/String;)Z
-HSPLcom/android/server/pm/UserManagerService;->isUserTypeSubtypeOfSystem(Ljava/lang/String;)Z
-HSPLcom/android/server/pm/UserManagerService;->isUserUnlockingOrUnlocked(I)Z
+HSPLcom/android/server/pm/UserManagerService;->isUserRunning(I)Z+]Lcom/android/server/pm/UserManagerService$LocalService;Lcom/android/server/pm/UserManagerService$LocalService;
+HSPLcom/android/server/pm/UserManagerService;->isUserUnlocked(I)Z
+HSPLcom/android/server/pm/UserManagerService;->isUserUnlockingOrUnlocked(I)Z+]Lcom/android/server/pm/UserManagerService$LocalService;Lcom/android/server/pm/UserManagerService$LocalService;
 HPLcom/android/server/pm/UserManagerService;->packageToRestrictionsFileName(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/pm/UserManagerService;->readApplicationRestrictionsLAr(Landroid/util/AtomicFile;)Landroid/os/Bundle;+]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Ljava/io/File;Ljava/io/File;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;
 HPLcom/android/server/pm/UserManagerService;->readApplicationRestrictionsLAr(Ljava/lang/String;I)Landroid/os/Bundle;
 HPLcom/android/server/pm/UserManagerService;->readEntry(Landroid/os/Bundle;Ljava/util/ArrayList;Lcom/android/modules/utils/TypedXmlPullParser;)V+]Ljava/lang/String;Ljava/lang/String;]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/pm/UserManagerService;->readUserLP(II)Lcom/android/server/pm/UserManagerService$UserData;
 HSPLcom/android/server/pm/UserManagerService;->readUserLP(ILjava/io/InputStream;I)Lcom/android/server/pm/UserManagerService$UserData;
 HSPLcom/android/server/pm/UserManagerService;->readUserListLP()V
-HSPLcom/android/server/pm/UserManagerService;->setUserRestrictionInner(ILjava/lang/String;Z)V
-HSPLcom/android/server/pm/UserManagerService;->updateUserIds()V
-HSPLcom/android/server/pm/UserManagerService;->updateUsersWithFeatureFlags(Z)V
-HSPLcom/android/server/pm/UserManagerService;->upgradeIfNecessaryLP()V
-HSPLcom/android/server/pm/UserManagerService;->upgradeIfNecessaryLP(II)V
+HPLcom/android/server/pm/UserManagerService;->setApplicationRestrictions(Ljava/lang/String;Landroid/os/Bundle;I)V
+HSPLcom/android/server/pm/UserManagerService;->setUserRestrictionInner(ILjava/lang/String;Z)V+]Lcom/android/server/pm/RestrictionsSet;Lcom/android/server/pm/RestrictionsSet;
 HSPLcom/android/server/pm/UserManagerService;->userExists(I)Z
 HSPLcom/android/server/pm/UserManagerService;->userWithName(Landroid/content/pm/UserInfo;)Landroid/content/pm/UserInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HPLcom/android/server/pm/UserManagerService;->writeBundle(Landroid/os/Bundle;Lcom/android/modules/utils/TypedXmlSerializer;)V
-HSPLcom/android/server/pm/UserNeedsBadgingCache;-><init>(Lcom/android/server/pm/UserManagerService;)V
-HSPLcom/android/server/pm/UserNeedsBadgingCache;->get(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
+HSPLcom/android/server/pm/UserNeedsBadgingCache;->get(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
 HSPLcom/android/server/pm/UserRestrictionsUtils;-><clinit>()V
 HSPLcom/android/server/pm/UserRestrictionsUtils;->areEqual(Landroid/os/Bundle;Landroid/os/Bundle;)Z+]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;
+HPLcom/android/server/pm/UserRestrictionsUtils;->canProfileOwnerChange(Ljava/lang/String;ZZ)Z
 HPLcom/android/server/pm/UserRestrictionsUtils;->isGlobal(ILjava/lang/String;)Z
-HSPLcom/android/server/pm/UserRestrictionsUtils;->isSettingRestrictedForUser(Landroid/content/Context;Ljava/lang/String;ILjava/lang/String;I)Z
+HSPLcom/android/server/pm/UserRestrictionsUtils;->isSettingRestrictedForUser(Landroid/content/Context;Ljava/lang/String;ILjava/lang/String;I)Z+]Landroid/os/UserManager;Landroid/os/UserManager;
 HSPLcom/android/server/pm/UserRestrictionsUtils;->isValidRestriction(Ljava/lang/String;)Z+]Ljava/util/Set;Landroid/util/ArraySet;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
 HSPLcom/android/server/pm/UserRestrictionsUtils;->merge(Landroid/os/Bundle;Landroid/os/Bundle;)V
-HSPLcom/android/server/pm/UserRestrictionsUtils;->newSetWithUniqueCheck([Ljava/lang/String;)Ljava/util/Set;
-HSPLcom/android/server/pm/UserRestrictionsUtils;->readRestrictions(Lcom/android/modules/utils/TypedXmlPullParser;)Landroid/os/Bundle;
-HSPLcom/android/server/pm/UserRestrictionsUtils;->readRestrictions(Lcom/android/modules/utils/TypedXmlPullParser;Landroid/os/Bundle;)V
-HSPLcom/android/server/pm/UserSystemPackageInstaller;-><clinit>()V
-HSPLcom/android/server/pm/UserSystemPackageInstaller;-><init>(Lcom/android/server/pm/UserManagerService;Landroid/util/ArrayMap;)V
-HSPLcom/android/server/pm/UserSystemPackageInstaller;->determineWhitelistedPackagesForUserTypes(Lcom/android/server/SystemConfig;)Landroid/util/ArrayMap;
-HSPLcom/android/server/pm/UserSystemPackageInstaller;->getAndSortKeysFromMap(Landroid/util/ArrayMap;)[Ljava/lang/String;
-HSPLcom/android/server/pm/UserSystemPackageInstaller;->getBaseTypeBitSets()Ljava/util/Map;
 HSPLcom/android/server/pm/UserSystemPackageInstaller;->getTypesBitSet(Ljava/lang/Iterable;Ljava/util/Map;)J
-HSPLcom/android/server/pm/UserSystemPackageInstaller;->getUserTypeMask(Ljava/lang/String;)J
 HSPLcom/android/server/pm/UserTypeDetails$Builder;-><init>()V
 HSPLcom/android/server/pm/UserTypeDetails$Builder;->checkSystemAndMainUserPreconditions()V
 HSPLcom/android/server/pm/UserTypeDetails$Builder;->createUserTypeDetails()Lcom/android/server/pm/UserTypeDetails;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->getDefaultUserProperties()Landroid/content/pm/UserProperties;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->hasBadge()Z
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->hasValidBaseType()Z
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->hasValidPropertyFlags()Z
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->isProfile()Z
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setBadgeColors([I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setBadgeLabels([I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setBadgeNoBackground(I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setBadgePlain(I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setBaseType(I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setDarkThemeBadgeColors([I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setDefaultCrossProfileIntentFilters(Ljava/util/List;)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setDefaultRestrictions(Landroid/os/Bundle;)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setDefaultSecureSettings(Landroid/os/Bundle;)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setDefaultUserInfoPropertyFlags(I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setDefaultUserProperties(Landroid/content/pm/UserProperties$Builder;)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setEnabled(I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setIconBadge(I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setLabels([I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setMaxAllowed(I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setMaxAllowedPerParent(I)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setName(Ljava/lang/String;)Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeDetails$Builder;->setStatusBarIcon(I)Lcom/android/server/pm/UserTypeDetails$Builder;
 HSPLcom/android/server/pm/UserTypeDetails;-><init>(Ljava/lang/String;ZIII[IIIIII[I[I[ILandroid/os/Bundle;Landroid/os/Bundle;Landroid/os/Bundle;Ljava/util/List;Landroid/content/pm/UserProperties;)V
-HSPLcom/android/server/pm/UserTypeDetails;-><init>(Ljava/lang/String;ZIII[IIIIII[I[I[ILandroid/os/Bundle;Landroid/os/Bundle;Landroid/os/Bundle;Ljava/util/List;Landroid/content/pm/UserProperties;Lcom/android/server/pm/UserTypeDetails-IA;)V
-HSPLcom/android/server/pm/UserTypeDetails;->addDefaultRestrictionsTo(Landroid/os/Bundle;)V
-HSPLcom/android/server/pm/UserTypeDetails;->getDefaultUserPropertiesReference()Landroid/content/pm/UserProperties;
-HSPLcom/android/server/pm/UserTypeDetails;->isFull()Z
-HSPLcom/android/server/pm/UserTypeDetails;->isProfile()Z
-HSPLcom/android/server/pm/UserTypeDetails;->isSystem()Z
-HSPLcom/android/server/pm/UserTypeFactory;->customizeBuilders(Landroid/util/ArrayMap;Landroid/content/res/XmlResourceParser;)V
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultBuilders()Landroid/util/ArrayMap;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultCloneCrossProfileIntentFilter()Ljava/util/List;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultGuestUserRestrictions()Landroid/os/Bundle;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultManagedCrossProfileIntentFilter()Ljava/util/List;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultManagedProfileSecureSettings()Landroid/os/Bundle;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultNonManagedProfileSecureSettings()Landroid/os/Bundle;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultProfileRestrictions()Landroid/os/Bundle;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultSecondaryUserRestrictions()Landroid/os/Bundle;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultTypeFullDemo()Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultTypeFullGuest()Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultTypeFullRestricted()Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultTypeFullSecondary()Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultTypeFullSystem()Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultTypeProfileClone()Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultTypeProfileCommunal()Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultTypeProfileManaged()Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultTypeProfilePrivate()Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultTypeProfileTest()Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeFactory;->getDefaultTypeSystemHeadless()Lcom/android/server/pm/UserTypeDetails$Builder;
-HSPLcom/android/server/pm/UserTypeFactory;->getUserTypeVersion()I
-HSPLcom/android/server/pm/UserTypeFactory;->getUserTypeVersion(Landroid/content/res/XmlResourceParser;)I
-HSPLcom/android/server/pm/UserTypeFactory;->getUserTypes()Landroid/util/ArrayMap;
-HSPLcom/android/server/pm/UserVisibilityMediator;-><clinit>()V
-HSPLcom/android/server/pm/UserVisibilityMediator;-><init>(Landroid/os/Handler;)V
-HSPLcom/android/server/pm/UserVisibilityMediator;-><init>(ZZLandroid/os/Handler;)V
 HSPLcom/android/server/pm/UserVisibilityMediator;->isCurrentUserOrRunningProfileOfCurrentUser(I)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HSPLcom/android/server/pm/UserVisibilityMediator;->isUserVisible(I)Z+]Lcom/android/server/pm/UserVisibilityMediator;Lcom/android/server/pm/UserVisibilityMediator;
 HPLcom/android/server/pm/VerifyingSession;->sendPackageVerificationRequest(ILandroid/content/pm/PackageInfoLite;Lcom/android/server/pm/PackageVerificationState;)V
 HSPLcom/android/server/pm/WatchedIntentFilter;-><init>()V
 HSPLcom/android/server/pm/WatchedIntentFilter;-><init>(Landroid/content/IntentFilter;)V
-HSPLcom/android/server/pm/WatchedIntentFilter;->addAction(Ljava/lang/String;)V
-HSPLcom/android/server/pm/WatchedIntentFilter;->addCategory(Ljava/lang/String;)V
-HSPLcom/android/server/pm/WatchedIntentFilter;->addDataScheme(Ljava/lang/String;)V
-HSPLcom/android/server/pm/WatchedIntentFilter;->addDataType(Ljava/lang/String;)V
 HSPLcom/android/server/pm/WatchedIntentFilter;->getIntentFilter()Landroid/content/IntentFilter;
-HSPLcom/android/server/pm/WatchedIntentFilter;->onChanged()V
-HSPLcom/android/server/pm/WatchedIntentResolver$1;-><init>(Lcom/android/server/pm/WatchedIntentResolver;)V
-HSPLcom/android/server/pm/WatchedIntentResolver$2;-><init>()V
-HSPLcom/android/server/pm/WatchedIntentResolver;-><clinit>()V
 HSPLcom/android/server/pm/WatchedIntentResolver;-><init>()V
 HSPLcom/android/server/pm/WatchedIntentResolver;->addFilter(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Lcom/android/server/pm/WatchedIntentFilter;)V
 HSPLcom/android/server/pm/WatchedIntentResolver;->dispatchChange(Lcom/android/server/utils/Watchable;)V
 HSPLcom/android/server/pm/WatchedIntentResolver;->findFilters(Lcom/android/server/pm/WatchedIntentFilter;)Ljava/util/ArrayList;
 HSPLcom/android/server/pm/WatchedIntentResolver;->onChanged()V
-HSPLcom/android/server/pm/WatchedIntentResolver;->registerObserver(Lcom/android/server/utils/Watcher;)V
-HSPLcom/android/server/pm/dex/ArtManagerService$ArtManagerInternalImpl;-><init>(Lcom/android/server/pm/dex/ArtManagerService;)V
-HSPLcom/android/server/pm/dex/ArtManagerService$ArtManagerInternalImpl;-><init>(Lcom/android/server/pm/dex/ArtManagerService;Lcom/android/server/pm/dex/ArtManagerService$ArtManagerInternalImpl-IA;)V
-HSPLcom/android/server/pm/dex/ArtManagerService;-><clinit>()V
-HSPLcom/android/server/pm/dex/ArtManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/Installer;Ljava/lang/Object;)V
 HSPLcom/android/server/pm/dex/ArtManagerService;->getCompilationReasonTronValue(Ljava/lang/String;)I
-HSPLcom/android/server/pm/dex/ArtManagerService;->verifyTronLoggingConstants()V
-HSPLcom/android/server/pm/dex/ArtStatsLogUtils$ArtStatsLogger;-><init>()V
 HSPLcom/android/server/pm/dex/DexManager$PackageCodeLocations;-><init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
-HSPLcom/android/server/pm/dex/DexManager$PackageCodeLocations;->mergeAppDataDirs(Ljava/lang/String;I)V
-HSPLcom/android/server/pm/dex/DexManager;-><clinit>()V
-HSPLcom/android/server/pm/dex/DexManager;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageDexOptimizer;Lcom/android/server/pm/Installer;Ljava/lang/Object;Lcom/android/server/pm/dex/DynamicCodeLogger;)V
-HSPLcom/android/server/pm/dex/DexManager;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageDexOptimizer;Lcom/android/server/pm/Installer;Ljava/lang/Object;Lcom/android/server/pm/dex/DynamicCodeLogger;Landroid/content/pm/IPackageManager;)V
-HSPLcom/android/server/pm/dex/DexManager;->loadInternal(Ljava/util/Map;)V
-HSPLcom/android/server/pm/dex/DynamicCodeLogger;-><init>(Lcom/android/server/pm/Installer;)V
-HSPLcom/android/server/pm/dex/PackageDexUsage;-><init>()V
-HSPLcom/android/server/pm/dex/PackageDynamicCodeLoading;-><clinit>()V
-HSPLcom/android/server/pm/dex/PackageDynamicCodeLoading;-><init>()V
+HSPLcom/android/server/pm/dex/DexManager;->cachePackageCodeLocation(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;I)V
+HSPLcom/android/server/pm/dex/DexManager;->cachePackageInfo(Landroid/content/pm/PackageInfo;I)V
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl;-><init>(Lcom/android/server/pm/snapshot/PackageDataSnapshot;)V
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl;-><init>(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl-IA;)V
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl;->checkClosed()V
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl;->close()V
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;-><init>(ILandroid/os/UserHandle;Lcom/android/server/pm/snapshot/PackageDataSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;)V+]Landroid/os/UserHandle;Landroid/os/UserHandle;
+HSPLcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;-><init>(ILandroid/os/UserHandle;Lcom/android/server/pm/snapshot/PackageDataSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl-IA;)V
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;->checkClosed()V+]Lcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;->close()V
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;->getPackageState(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageState;+]Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
@@ -7616,12 +5700,9 @@
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;-><init>(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl-IA;)V
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;->close()V
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;->getPackageStates()Ljava/util/Map;+]Lcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
-HSPLcom/android/server/pm/local/PackageManagerLocalImpl;-><init>(Lcom/android/server/pm/PackageManagerService;)V
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl;->withFilteredSnapshot(ILandroid/os/UserHandle;)Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl;->withUnfilteredSnapshot()Lcom/android/server/pm/PackageManagerLocal$UnfilteredSnapshot;+]Lcom/android/server/pm/local/PackageManagerLocalImpl;Lcom/android/server/pm/local/PackageManagerLocalImpl;
 HSPLcom/android/server/pm/local/PackageManagerLocalImpl;->withUnfilteredSnapshot()Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;
-HSPLcom/android/server/pm/parsing/PackageCacher;-><clinit>()V
-HSPLcom/android/server/pm/parsing/PackageCacher;-><init>(Ljava/io/File;)V
 HSPLcom/android/server/pm/parsing/PackageCacher;->cacheResult(Ljava/io/File;ILcom/android/internal/pm/parsing/pkg/ParsedPackage;)V
 HSPLcom/android/server/pm/parsing/PackageCacher;->fromCacheEntryStatic([B)Lcom/android/internal/pm/parsing/pkg/ParsedPackage;
 HSPLcom/android/server/pm/parsing/PackageCacher;->getCacheKey(Ljava/io/File;I)Ljava/lang/String;
@@ -7629,7 +5710,7 @@
 HSPLcom/android/server/pm/parsing/PackageCacher;->isCacheUpToDate(Ljava/io/File;Ljava/io/File;)Z
 HSPLcom/android/server/pm/parsing/PackageCacher;->toCacheEntry(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;)[B
 HSPLcom/android/server/pm/parsing/PackageCacher;->toCacheEntryStatic(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;)[B
-HSPLcom/android/server/pm/parsing/PackageInfoUtils;-><clinit>()V
+HSPLcom/android/server/pm/parsing/PackageInfoUtils$CachedApplicationInfoGenerator;->generate(Lcom/android/server/pm/pkg/AndroidPackage;JLcom/android/server/pm/pkg/PackageUserStateInternal;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ApplicationInfo;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->appInfoFlags(ILcom/android/server/pm/pkg/PackageStateInternal;)I
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->appInfoFlags(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/PackageStateInternal;)I
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->appInfoPrivateFlags(ILcom/android/server/pm/pkg/PackageStateInternal;)I
@@ -7646,45 +5727,31 @@
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateApplicationInfo(Lcom/android/server/pm/pkg/AndroidPackage;JLcom/android/server/pm/pkg/PackageUserStateInternal;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/pkg/SharedLibraryWrapper;Lcom/android/server/pm/pkg/SharedLibraryWrapper;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generatePermissionGroupInfo(Lcom/android/internal/pm/pkg/component/ParsedPermissionGroup;J)Landroid/content/pm/PermissionGroupInfo;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generatePermissionInfo(Lcom/android/internal/pm/pkg/component/ParsedPermission;J)Landroid/content/pm/PermissionInfo;+]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl;]Landroid/os/Bundle;Landroid/os/Bundle;
-HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateProcessInfo(Ljava/util/Map;J)Landroid/util/ArrayMap;
+HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateProcessInfo(Ljava/util/Map;J)Landroid/util/ArrayMap;+]Lcom/android/internal/pm/pkg/component/ParsedProcess;Lcom/android/internal/pm/pkg/component/ParsedProcessImpl;]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/Collections$UnmodifiableMap;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;,Ljava/util/Collections$UnmodifiableSet;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateProviderInfo(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/pkg/component/ParsedProvider;JLcom/android/server/pm/pkg/PackageUserStateInternal;Landroid/content/pm/ApplicationInfo;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ProviderInfo;+]Ljava/lang/Object;Ljava/lang/String;]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateServiceInfo(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/pkg/component/ParsedService;JLcom/android/server/pm/pkg/PackageUserStateInternal;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ServiceInfo;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateServiceInfo(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/pkg/component/ParsedService;JLcom/android/server/pm/pkg/PackageUserStateInternal;Landroid/content/pm/ApplicationInfo;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ServiceInfo;+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;
-HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateWithComponents(Lcom/android/server/pm/pkg/AndroidPackage;[IJJJLjava/util/Set;Ljava/util/Set;Lcom/android/server/pm/pkg/PackageUserStateInternal;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/PackageInfo;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/internal/pm/pkg/component/ParsedAttribution;Lcom/android/internal/pm/pkg/component/ParsedAttributionImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/internal/pm/pkg/component/ParsedUsesPermission;Lcom/android/internal/pm/pkg/component/ParsedUsesPermissionImpl;]Ljava/util/Set;Landroid/util/ArraySet;,Ljava/util/Collections$UnmodifiableSet;,Lcom/android/server/permission/jarjar/kotlin/collections/EmptySet;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;
+HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateWithComponents(Lcom/android/server/pm/pkg/AndroidPackage;[IJJJLjava/util/Set;Ljava/util/Set;Lcom/android/server/pm/pkg/PackageUserStateInternal;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/PackageInfo;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/internal/pm/pkg/component/ParsedAttribution;Lcom/android/internal/pm/pkg/component/ParsedAttributionImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/internal/pm/pkg/component/ParsedUsesPermission;Lcom/android/internal/pm/pkg/component/ParsedUsesPermissionImpl;]Ljava/util/Set;Landroid/util/ArraySet;,Ljava/util/Collections$UnmodifiableSet;,Lcom/android/server/permission/jarjar/kotlin/collections/EmptySet;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->getDataDir(Lcom/android/server/pm/pkg/PackageStateInternal;I)Ljava/io/File;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->getDeprecatedSignatures(Landroid/content/pm/SigningDetails;J)[Landroid/content/pm/Signature;+]Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->initForUser(Landroid/content/pm/ApplicationInfo;Lcom/android/server/pm/pkg/AndroidPackage;ILcom/android/server/pm/pkg/PackageUserStateInternal;)V+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/internal/pm/parsing/pkg/PackageImpl;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/parsing/PackageInfoUtils;->updateApplicationInfo(Landroid/content/pm/ApplicationInfo;JLcom/android/server/pm/pkg/PackageUserState;)V+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;]Landroid/content/pm/overlay/OverlayPaths;Landroid/content/pm/overlay/OverlayPaths;]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/parsing/ParsedComponentStateUtils;->getNonLocalizedLabelAndIcon(Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/server/pm/pkg/PackageStateInternal;I)Landroid/util/Pair;+]Lcom/android/server/pm/pkg/PackageUserStateInternal;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;,Lcom/android/internal/pm/pkg/component/ParsedInstrumentationImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Integer;Ljava/lang/Integer;
-HSPLcom/android/server/pm/parsing/library/AndroidHidlUpdater;-><init>()V
 HSPLcom/android/server/pm/parsing/library/AndroidHidlUpdater;->updatePackage(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ZZ)V
-HSPLcom/android/server/pm/parsing/library/AndroidNetIpSecIkeUpdater;-><init>()V
 HSPLcom/android/server/pm/parsing/library/AndroidNetIpSecIkeUpdater;->updatePackage(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ZZ)V
-HSPLcom/android/server/pm/parsing/library/AndroidTestBaseUpdater;-><init>()V
 HSPLcom/android/server/pm/parsing/library/AndroidTestBaseUpdater;->isChangeEnabled(Lcom/android/server/pm/pkg/AndroidPackage;Z)Z
 HSPLcom/android/server/pm/parsing/library/AndroidTestBaseUpdater;->updatePackage(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ZZ)V
-HSPLcom/android/server/pm/parsing/library/ApexSharedLibraryUpdater;-><init>(Landroid/util/ArrayMap;)V
 HSPLcom/android/server/pm/parsing/library/ApexSharedLibraryUpdater;->updatePackage(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ZZ)V
 HSPLcom/android/server/pm/parsing/library/ApexSharedLibraryUpdater;->updateSharedLibraryForPackage(Lcom/android/server/SystemConfig$SharedLibraryEntry;Lcom/android/internal/pm/parsing/pkg/ParsedPackage;)V
-HSPLcom/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdater;-><init>()V
 HSPLcom/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdater;->updatePackage(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ZZ)V
-HSPLcom/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater;-><init>()V
 HSPLcom/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater;->apkTargetsApiLevelLessThanOrEqualToOMR1(Lcom/android/server/pm/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater;->updatePackage(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ZZ)V
-HSPLcom/android/server/pm/parsing/library/PackageBackwardCompatibility$AndroidTestRunnerSplitUpdater;-><init>()V
 HSPLcom/android/server/pm/parsing/library/PackageBackwardCompatibility$AndroidTestRunnerSplitUpdater;->updatePackage(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ZZ)V
-HSPLcom/android/server/pm/parsing/library/PackageBackwardCompatibility;-><clinit>()V
-HSPLcom/android/server/pm/parsing/library/PackageBackwardCompatibility;-><init>(Z[Lcom/android/server/pm/parsing/library/PackageSharedLibraryUpdater;)V
-HSPLcom/android/server/pm/parsing/library/PackageBackwardCompatibility;->addUpdaterForAndroidTestBase(Ljava/util/List;)Z
 HSPLcom/android/server/pm/parsing/library/PackageBackwardCompatibility;->modifySharedLibraries(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ZZ)V
-HSPLcom/android/server/pm/parsing/library/PackageBackwardCompatibility;->updatePackage(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ZZ)V
-HSPLcom/android/server/pm/parsing/library/PackageSharedLibraryUpdater;-><init>()V
+HSPLcom/android/server/pm/parsing/library/PackageBackwardCompatibility;->updatePackage(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ZZ)V+]Lcom/android/server/pm/parsing/library/PackageSharedLibraryUpdater;megamorphic_types
 HSPLcom/android/server/pm/parsing/library/PackageSharedLibraryUpdater;->isLibraryPresent(Ljava/util/List;Ljava/util/List;Ljava/lang/String;)Z
 HSPLcom/android/server/pm/parsing/library/PackageSharedLibraryUpdater;->prefixImplicitDependency(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/server/pm/parsing/library/PackageSharedLibraryUpdater;->prefixRequiredLibrary(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;Ljava/lang/String;)V
 HSPLcom/android/server/pm/parsing/library/PackageSharedLibraryUpdater;->removeLibrary(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;Ljava/lang/String;)V
-HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->createSharedLibraryForDynamic(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;)Landroid/content/pm/SharedLibraryInfo;
-HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->createSharedLibraryForStatic(Lcom/android/server/pm/pkg/AndroidPackage;)Landroid/content/pm/SharedLibraryInfo;
 HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->fillVersionCodes(Lcom/android/server/pm/pkg/AndroidPackage;Landroid/content/pm/PackageInfo;)V+]Lcom/android/internal/pm/pkg/parsing/ParsingPackageHidden;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->generateAppInfoWithoutState(Lcom/android/server/pm/pkg/AndroidPackage;)Landroid/content/pm/ApplicationInfo;
 HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->getAllCodePaths(Lcom/android/server/pm/pkg/AndroidPackage;)Ljava/util/List;
@@ -7695,44 +5762,25 @@
 HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->hasComponentClassName(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;)Z+]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
 HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->isLibrary(Lcom/android/server/pm/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->isMatchForSystemOnly(Lcom/android/server/pm/pkg/PackageState;J)Z+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;
-HSPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$1;-><init>(Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;)V
-HSPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$2;-><init>(Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;Landroid/os/Looper;)V
 HPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache;->getPermissionInfo(Ljava/lang/String;)Landroid/content/pm/PermissionInfo;+]Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$1;
-HPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache;->getPermissionState(Ljava/lang/String;Landroid/content/pm/PackageInfo;Landroid/os/UserHandle;)Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache$PermissionState;
-HSPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper;-><init>(Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;)V
-HSPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper;-><init>(Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper-IA;)V
+HPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache;->getPermissionState(Ljava/lang/String;Landroid/content/pm/PackageInfo;Landroid/os/UserHandle;)Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache$PermissionState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;-><clinit>()V
-HSPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;-><init>(Landroid/content/Context;)V
 HPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantRuntimePermissions(Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper;Landroid/content/pm/PackageInfo;Ljava/util/Set;ZZZI)V+]Landroid/permission/PermissionManager;Landroid/permission/PermissionManager;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;]Landroid/permission/PermissionManager$SplitPermissionInfo;Landroid/permission/PermissionManager$SplitPermissionInfo;]Ljava/util/Set;Landroid/util/ArraySet;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache;,Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$1;
-HSPLcom/android/server/pm/permission/DevicePermissionState;-><init>()V
 HSPLcom/android/server/pm/permission/DevicePermissionState;->getOrCreateUserState(I)Lcom/android/server/pm/permission/UserPermissionState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/permission/DevicePermissionState;->getUserState(I)Lcom/android/server/pm/permission/UserPermissionState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/permission/LegacyPermission;-><init>(Landroid/content/pm/PermissionInfo;II[I)V
 HSPLcom/android/server/pm/permission/LegacyPermission;-><init>(Ljava/lang/String;Ljava/lang/String;I)V
 HSPLcom/android/server/pm/permission/LegacyPermission;->getPermissionInfo()Landroid/content/pm/PermissionInfo;
-HSPLcom/android/server/pm/permission/LegacyPermission;->getType()I
 HSPLcom/android/server/pm/permission/LegacyPermission;->read(Ljava/util/Map;Lcom/android/modules/utils/TypedXmlPullParser;)Z
-HSPLcom/android/server/pm/permission/LegacyPermission;->readInt(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;Ljava/lang/String;I)I
 HSPLcom/android/server/pm/permission/LegacyPermission;->write(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;-><init>(Landroid/content/Context;)V
-HPLcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;->checkPermission(Ljava/lang/String;II)I+]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;->checkPermission(Ljava/lang/String;II)I+]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;->getCallingPid()I
 HSPLcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;->getCallingUid()I
-HPLcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;->getPackageUidForUser(Ljava/lang/String;I)I
-HSPLcom/android/server/pm/permission/LegacyPermissionManagerService$Internal;-><init>(Lcom/android/server/pm/permission/LegacyPermissionManagerService;)V
-HSPLcom/android/server/pm/permission/LegacyPermissionManagerService$Internal;-><init>(Lcom/android/server/pm/permission/LegacyPermissionManagerService;Lcom/android/server/pm/permission/LegacyPermissionManagerService$Internal-IA;)V
-HSPLcom/android/server/pm/permission/LegacyPermissionManagerService;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/pm/permission/LegacyPermissionManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;)V
-HSPLcom/android/server/pm/permission/LegacyPermissionManagerService;->checkDeviceIdentifierAccess(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)I+]Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;]Lcom/android/server/pm/permission/LegacyPermissionManagerService;Lcom/android/server/pm/permission/LegacyPermissionManagerService;]Landroid/app/admin/DevicePolicyManager;Landroid/app/admin/DevicePolicyManager;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
-HPLcom/android/server/pm/permission/LegacyPermissionManagerService;->checkPhoneNumberAccess(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)I+]Lcom/android/server/pm/permission/LegacyPermissionManagerService;Lcom/android/server/pm/permission/LegacyPermissionManagerService;]Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;
-HSPLcom/android/server/pm/permission/LegacyPermissionManagerService;->create(Landroid/content/Context;)Lcom/android/server/pm/permission/LegacyPermissionManagerInternal;
+HSPLcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;->getPackageUidForUser(Ljava/lang/String;I)I+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/pm/permission/LegacyPermissionManagerService;->checkDeviceIdentifierAccess(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)I+]Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;]Landroid/app/admin/DevicePolicyManager;Landroid/app/admin/DevicePolicyManager;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/pm/permission/LegacyPermissionManagerService;Lcom/android/server/pm/permission/LegacyPermissionManagerService;
+HSPLcom/android/server/pm/permission/LegacyPermissionManagerService;->checkPhoneNumberAccess(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)I+]Lcom/android/server/pm/permission/LegacyPermissionManagerService;Lcom/android/server/pm/permission/LegacyPermissionManagerService;]Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;
 HSPLcom/android/server/pm/permission/LegacyPermissionManagerService;->verifyCallerCanCheckAccess(Ljava/lang/String;Ljava/lang/String;II)V+]Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;
-HSPLcom/android/server/pm/permission/LegacyPermissionSettings;-><init>()V
-HSPLcom/android/server/pm/permission/LegacyPermissionSettings;->getPermissionTrees()Ljava/util/List;
-HSPLcom/android/server/pm/permission/LegacyPermissionSettings;->getPermissions()Ljava/util/List;
-HSPLcom/android/server/pm/permission/LegacyPermissionSettings;->readPermissionTrees(Lcom/android/modules/utils/TypedXmlPullParser;)V
 HSPLcom/android/server/pm/permission/LegacyPermissionSettings;->readPermissions(Landroid/util/ArrayMap;Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/pm/permission/LegacyPermissionSettings;->readPermissions(Lcom/android/modules/utils/TypedXmlPullParser;)V
 HSPLcom/android/server/pm/permission/LegacyPermissionSettings;->replacePermissions(Ljava/util/List;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/permission/LegacyPermission;Lcom/android/server/pm/permission/LegacyPermission;
 HSPLcom/android/server/pm/permission/LegacyPermissionSettings;->writePermissions(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Lcom/android/server/pm/permission/LegacyPermission;Lcom/android/server/pm/permission/LegacyPermission;
 HSPLcom/android/server/pm/permission/LegacyPermissionState$PermissionState;-><init>(Lcom/android/server/pm/permission/LegacyPermissionState$PermissionState;)V
@@ -7748,13 +5796,9 @@
 HSPLcom/android/server/pm/permission/LegacyPermissionState;-><init>()V
 HSPLcom/android/server/pm/permission/LegacyPermissionState;->checkUserId(I)V
 HSPLcom/android/server/pm/permission/LegacyPermissionState;->copyFrom(Lcom/android/server/pm/permission/LegacyPermissionState;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/pm/permission/LegacyPermissionState;->getPermissionStates(I)Ljava/util/Collection;
-HSPLcom/android/server/pm/permission/LegacyPermissionState;->isMissing(I)Z
+HSPLcom/android/server/pm/permission/LegacyPermissionState;->getPermissionStates(I)Ljava/util/Collection;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/permission/LegacyPermissionState;->putPermissionState(Lcom/android/server/pm/permission/LegacyPermissionState$PermissionState;I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/permission/LegacyPermissionState$UserState;Lcom/android/server/pm/permission/LegacyPermissionState$UserState;
 HSPLcom/android/server/pm/permission/LegacyPermissionState;->setMissing(ZI)V
-HSPLcom/android/server/pm/permission/Permission;-><init>(Landroid/content/pm/PermissionInfo;I)V
-HSPLcom/android/server/pm/permission/Permission;-><init>(Ljava/lang/String;Ljava/lang/String;I)V
-HSPLcom/android/server/pm/permission/Permission;->areGidsPerUser()Z
 HSPLcom/android/server/pm/permission/Permission;->computeGids(I)[I+][I[I
 HSPLcom/android/server/pm/permission/Permission;->createOrUpdate(Lcom/android/server/pm/permission/Permission;Landroid/content/pm/PermissionInfo;Lcom/android/server/pm/pkg/PackageState;Ljava/util/Collection;Z)Lcom/android/server/pm/permission/Permission;
 HSPLcom/android/server/pm/permission/Permission;->findPermissionTree(Ljava/util/Collection;Ljava/lang/String;)Lcom/android/server/pm/permission/Permission;
@@ -7764,16 +5808,12 @@
 HSPLcom/android/server/pm/permission/Permission;->getPackageName()Ljava/lang/String;
 HSPLcom/android/server/pm/permission/Permission;->getPermissionInfo()Landroid/content/pm/PermissionInfo;
 HSPLcom/android/server/pm/permission/Permission;->getProtection()I
-HSPLcom/android/server/pm/permission/Permission;->getRawGids()[I
 HSPLcom/android/server/pm/permission/Permission;->getType()I
 HSPLcom/android/server/pm/permission/Permission;->isAppOp()Z
-HSPLcom/android/server/pm/permission/Permission;->isConfigurator()Z
-HSPLcom/android/server/pm/permission/Permission;->isDefinitionChanged()Z
 HSPLcom/android/server/pm/permission/Permission;->isDynamic()Z
 HSPLcom/android/server/pm/permission/Permission;->isHardRestricted()Z
 HSPLcom/android/server/pm/permission/Permission;->isInstaller()Z
 HSPLcom/android/server/pm/permission/Permission;->isInternal()Z
-HSPLcom/android/server/pm/permission/Permission;->isModule()Z
 HSPLcom/android/server/pm/permission/Permission;->isNormal()Z
 HSPLcom/android/server/pm/permission/Permission;->isOem()Z
 HSPLcom/android/server/pm/permission/Permission;->isOverridingSystemPermission(Lcom/android/server/pm/permission/Permission;Landroid/content/pm/PermissionInfo;Landroid/content/pm/PackageManagerInternal;)Z
@@ -7785,20 +5825,11 @@
 HSPLcom/android/server/pm/permission/Permission;->isSoftRestricted()Z
 HSPLcom/android/server/pm/permission/Permission;->isVendorPrivileged()Z
 HSPLcom/android/server/pm/permission/Permission;->isVerifier()Z
-HSPLcom/android/server/pm/permission/Permission;->setGids([IZ)V
-HSPLcom/android/server/pm/permission/PermissionAllowlist;-><init>()V
 HSPLcom/android/server/pm/permission/PermissionAllowlist;->getApexPrivilegedAppAllowlistState(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Boolean;
-HSPLcom/android/server/pm/permission/PermissionAllowlist;->getApexPrivilegedAppAllowlists()Landroid/util/ArrayMap;
-HSPLcom/android/server/pm/permission/PermissionAllowlist;->getPrivilegedAppAllowlist()Landroid/util/ArrayMap;
 HSPLcom/android/server/pm/permission/PermissionAllowlist;->getPrivilegedAppAllowlistState(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Boolean;
-HSPLcom/android/server/pm/permission/PermissionAllowlist;->getProductPrivilegedAppAllowlist()Landroid/util/ArrayMap;
 HSPLcom/android/server/pm/permission/PermissionAllowlist;->getProductPrivilegedAppAllowlistState(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Boolean;
-HSPLcom/android/server/pm/permission/PermissionAllowlist;->getSystemExtPrivilegedAppAllowlist()Landroid/util/ArrayMap;
 HSPLcom/android/server/pm/permission/PermissionAllowlist;->getSystemExtPrivilegedAppAllowlistState(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Boolean;
-HSPLcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry;-><init>(Landroid/content/Context;)V
-HPLcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry;->isRegisteredAttributionSource(Landroid/content/AttributionSource;)Z+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;
-HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;-><clinit>()V
-HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry;->isRegisteredAttributionSource(Landroid/content/AttributionSource;)Z+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkAppOpPermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;ZZ)I+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkPermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;)Z+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/Set;Landroid/util/ArraySet;,Ljava/util/Collections$EmptySet;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal$HotwordDetectionServiceProvider;Lcom/android/server/voiceinteraction/HotwordDetectionConnection$2$$ExternalSyntheticLambda0;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkPermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;ZZZI)I+]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/AttributionSource;Landroid/content/AttributionSource;
@@ -7806,60 +5837,36 @@
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkRuntimePermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;ZZZI)I+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->getAttributionChainId(ZLandroid/content/AttributionSource;)I+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->performOpTransaction(Landroid/content/Context;Landroid/os/IBinder;ILandroid/content/AttributionSource;Ljava/lang/String;ZZZZZIIII)I+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
-HPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->resolveAttributionSource(Landroid/content/Context;Landroid/content/AttributionSource;)Landroid/content/AttributionSource;+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;
+HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->resolveAttributionSource(Landroid/content/Context;Landroid/content/AttributionSource;)Landroid/content/AttributionSource;+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->resolvePackageName(Landroid/content/Context;Landroid/content/AttributionSource;)Ljava/lang/String;+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
-HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;)V
-HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl-IA;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->checkPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/permission/PermissionManagerService;
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->checkUidPermission(ILjava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/permission/PermissionManagerService;
-HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getGidsForUid(I)[I
-HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getGrantedPermissions(Ljava/lang/String;I)Ljava/util/Set;
-HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getInstalledPermissions(Ljava/lang/String;)Ljava/util/Set;
+HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getGidsForUid(I)[I+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService;
+HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getGrantedPermissions(Ljava/lang/String;I)Ljava/util/Set;+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService;
+HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getInstalledPermissions(Ljava/lang/String;)Ljava/util/Set;+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService;
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->isPermissionsReviewRequired(Ljava/lang/String;I)Z+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;,Lcom/android/server/permission/access/permission/PermissionService;
 HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->onPackageAdded(Lcom/android/server/pm/pkg/PackageState;ZLcom/android/server/pm/pkg/AndroidPackage;)V
-HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->readLegacyPermissionStateTEMP()V
-HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->readLegacyPermissionsTEMP(Lcom/android/server/pm/permission/LegacyPermissionSettings;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService;->-$$Nest$fgetmPermissionManagerServiceImpl(Lcom/android/server/pm/permission/PermissionManagerService;)Lcom/android/server/pm/permission/PermissionManagerServiceInterface;
-HSPLcom/android/server/pm/permission/PermissionManagerService;-><clinit>()V
-HSPLcom/android/server/pm/permission/PermissionManagerService;-><init>(Landroid/content/Context;Landroid/util/ArrayMap;)V
 HSPLcom/android/server/pm/permission/PermissionManagerService;->checkPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;,Lcom/android/server/permission/access/permission/PermissionService;
 HSPLcom/android/server/pm/permission/PermissionManagerService;->checkUidPermission(ILjava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;,Lcom/android/server/permission/access/permission/PermissionService;]Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/permission/PermissionManagerService;
-HSPLcom/android/server/pm/permission/PermissionManagerService;->create(Landroid/content/Context;Landroid/util/ArrayMap;)Lcom/android/server/pm/permission/PermissionManagerServiceInternal;
 HSPLcom/android/server/pm/permission/PermissionManagerService;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;,Lcom/android/server/permission/access/permission/PermissionService;
 HSPLcom/android/server/pm/permission/PermissionManagerService;->getPermissionInfo(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;,Lcom/android/server/permission/access/permission/PermissionService;
 HSPLcom/android/server/pm/permission/PermissionManagerService;->getPersistentDeviceId(I)Ljava/lang/String;
-HSPLcom/android/server/pm/permission/PermissionManagerService;->getSplitPermissions()Ljava/util/List;
-HPLcom/android/server/pm/permission/PermissionManagerService;->isRegisteredAttributionSource(Landroid/content/AttributionSourceState;)Z+]Lcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry;Lcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry;
-HPLcom/android/server/pm/permission/PermissionManagerService;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;IIZLjava/lang/String;I)V+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
+HSPLcom/android/server/pm/permission/PermissionManagerService;->isRegisteredAttributionSource(Landroid/content/AttributionSourceState;)Z+]Lcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry;Lcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry;
+HSPLcom/android/server/pm/permission/PermissionManagerService;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;IIZLjava/lang/String;I)V+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;,Lcom/android/server/permission/access/permission/PermissionService;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$$ExternalSyntheticLambda12;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$$ExternalSyntheticLambda16;-><init>(Lcom/android/server/pm/permission/PermissionManagerServiceImpl;ZLcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;ZLjava/util/List;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$$ExternalSyntheticLambda16;->run()V
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$$ExternalSyntheticLambda7;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$$ExternalSyntheticLambda8;-><init>(Lcom/android/server/pm/permission/PermissionManagerServiceImpl;[I)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$$ExternalSyntheticLambda8;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$1;-><init>(Lcom/android/server/pm/permission/PermissionManagerServiceImpl;)V
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$1;->onPermissionUpdated([IZI)V+]Lcom/android/server/pm/permission/PermissionManagerServiceImpl$OnPermissionChangeListeners;Lcom/android/server/pm/permission/PermissionManagerServiceImpl$OnPermissionChangeListeners;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$OnPermissionChangeListeners;-><init>(Landroid/os/Looper;)V
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$OnPermissionChangeListeners;->handleOnPermissionsChanged(I)V+]Landroid/permission/IOnPermissionsChangeListener;Landroid/permission/PermissionManager$OnPermissionsChangeListenerDelegate;,Landroid/permission/IOnPermissionsChangeListener$Stub$Proxy;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$OnPermissionChangeListeners;->onPermissionsChanged(I)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$PermissionCallback;-><init>()V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl$PermissionCallback;-><init>(Lcom/android/server/pm/permission/PermissionManagerServiceImpl$PermissionCallback-IA;)V
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->$r8$lambda$8Sme45Qvw9zW2bBrdtvASVYcOVo(Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/pkg/AndroidPackage;ZLjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceImpl$PermissionCallback;Lcom/android/server/pm/pkg/AndroidPackage;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->$r8$lambda$LgrGsOx7VAKdJc4oDshdvCpA0pQ(Lcom/android/server/pm/permission/PermissionManagerServiceImpl;[ILcom/android/server/pm/PackageSetting;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->$r8$lambda$MGC-4_nFjXpM3q4woMu1yIiXTSs(Lcom/android/server/pm/permission/PermissionManagerServiceImpl;[ILcom/android/server/pm/pkg/PackageStateInternal;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->$r8$lambda$ZvgQQyQrxfZ6zPfSBdxIwcK3hmU(Lcom/android/server/pm/permission/PermissionManagerServiceImpl;ZLcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;ZLjava/util/List;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->-$$Nest$fgetmOnPermissionChangeListeners(Lcom/android/server/pm/permission/PermissionManagerServiceImpl;)Lcom/android/server/pm/permission/PermissionManagerServiceImpl$OnPermissionChangeListeners;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->-$$Nest$fgetmPackageManagerInt(Lcom/android/server/pm/permission/PermissionManagerServiceImpl;)Landroid/content/pm/PackageManagerInternal;
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;-><clinit>()V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;-><init>(Landroid/content/Context;Landroid/util/ArrayMap;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->addAllPermissionGroupsInternal(Lcom/android/server/pm/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->addAllPermissionsInternal(Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/pkg/AndroidPackage;)Ljava/util/List;
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->canAdoptPermissionsInternal(Ljava/lang/String;Lcom/android/server/pm/pkg/AndroidPackage;)Z
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->checkCrossUserPermission(IIIZ)Z+]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->checkPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->checkPermissionInternal(Lcom/android/server/pm/pkg/AndroidPackage;ZLjava/lang/String;I)I+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Ljava/util/Map;Ljava/util/HashMap;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->checkPrivilegedPermissionAllowlist(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/permission/Permission;)Z+]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ApexManager;Lcom/android/server/pm/ApexManager$ApexManagerImpl;
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->checkSinglePermissionInternalLocked(Lcom/android/server/pm/permission/UidPermissionState;Ljava/lang/String;Z)Z+]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;
+HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->checkSinglePermissionInternalLocked(Lcom/android/server/pm/permission/UidPermissionState;Ljava/lang/String;Z)Z+]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Lcom/android/server/pm/permission/PermissionRegistry;Lcom/android/server/pm/permission/PermissionRegistry;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->checkUidPermission(ILjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->checkUidPermissionInternal(Lcom/android/server/pm/pkg/AndroidPackage;ILjava/lang/String;)I+]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Ljava/util/Map;Ljava/util/HashMap;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->enforceCrossUserPermission(IIZZLjava/lang/String;)V+]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
@@ -7871,7 +5878,7 @@
 HPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getAllowlistedRestrictedPermissionsInternal(Lcom/android/server/pm/pkg/AndroidPackage;II)Ljava/util/List;+]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getGidsForUid(I)[I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getGrantedPermissions(Ljava/lang/String;I)Ljava/util/Set;+]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getGrantedPermissionsInternal(Ljava/lang/String;I)Ljava/util/Set;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/util/Set;Landroid/util/ArraySet;
+HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getGrantedPermissionsInternal(Ljava/lang/String;I)Ljava/util/Set;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getInstalledPermissions(Ljava/lang/String;)Ljava/util/Set;+]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Lcom/android/server/pm/permission/PermissionRegistry;Lcom/android/server/pm/permission/PermissionRegistry;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/ArraySet;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getPermissionFlagsInternal(Ljava/lang/String;Ljava/lang/String;II)I+]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/permission/PermissionRegistry;Lcom/android/server/pm/permission/PermissionRegistry;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
@@ -7881,83 +5888,56 @@
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getPrivilegedPermissionAllowlistState(Lcom/android/server/pm/pkg/PackageState;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Boolean;+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/SystemConfig;Lcom/android/server/SystemConfig;]Lcom/android/server/pm/permission/PermissionAllowlist;Lcom/android/server/pm/permission/PermissionAllowlist;]Lcom/android/server/pm/ApexManager;Lcom/android/server/pm/ApexManager$ApexManagerImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getSourcePackageSetting(Lcom/android/server/pm/permission/Permission;)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getSourcePackageSigningDetails(Lcom/android/server/pm/permission/Permission;)Landroid/content/pm/SigningDetails;+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getSplitPermissionInfos()Ljava/util/List;
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getSplitPermissions()Ljava/util/List;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getUidStateLocked(II)Lcom/android/server/pm/permission/UidPermissionState;+]Lcom/android/server/pm/permission/DevicePermissionState;Lcom/android/server/pm/permission/DevicePermissionState;]Lcom/android/server/pm/permission/UserPermissionState;Lcom/android/server/pm/permission/UserPermissionState;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getUidStateLocked(Lcom/android/server/pm/pkg/AndroidPackage;I)Lcom/android/server/pm/permission/UidPermissionState;+]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getUidStateLocked(Lcom/android/server/pm/pkg/PackageStateInternal;I)Lcom/android/server/pm/permission/UidPermissionState;+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->getVolumeUuidForPackage(Lcom/android/server/pm/pkg/AndroidPackage;)Ljava/lang/String;+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->isPermissionsReviewRequired(Ljava/lang/String;I)Z+]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->isPermissionsReviewRequiredInternal(Ljava/lang/String;I)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->lambda$onPackageAddedInternal$17(ZLcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;ZLjava/util/List;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->lambda$readLegacyPermissionStateTEMP$15([ILcom/android/server/pm/pkg/PackageStateInternal;)V
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->lambda$updatePermissions$11(Lcom/android/server/pm/pkg/AndroidPackage;ZLjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceImpl$PermissionCallback;Lcom/android/server/pm/pkg/AndroidPackage;)V
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->lambda$writeLegacyPermissionStateTEMP$16([ILcom/android/server/pm/PackageSetting;)V+]Lcom/android/server/pm/permission/DevicePermissionState;Lcom/android/server/pm/permission/DevicePermissionState;]Lcom/android/server/pm/permission/LegacyPermissionState;Lcom/android/server/pm/permission/LegacyPermissionState;]Lcom/android/server/pm/pkg/SharedUserApi;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/permission/UserPermissionState;Lcom/android/server/pm/permission/UserPermissionState;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Lcom/android/server/pm/permission/PermissionState;Lcom/android/server/pm/permission/PermissionState;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->onPackageAdded(Lcom/android/server/pm/pkg/PackageState;ZLcom/android/server/pm/pkg/AndroidPackage;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->onPackageAddedInternal(Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/pkg/AndroidPackage;ZLcom/android/server/pm/pkg/AndroidPackage;)V
 HPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->queryPermissionsByGroup(Ljava/lang/String;I)Ljava/util/List;+]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/permission/PermissionRegistry;Lcom/android/server/pm/permission/PermissionRegistry;]Lcom/android/internal/pm/pkg/component/ParsedPermissionGroup;Lcom/android/internal/pm/pkg/component/ParsedPermissionGroupImpl;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->readLegacyPermissionStateTEMP()V
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->readLegacyPermissionStatesLocked(Lcom/android/server/pm/permission/UidPermissionState;Ljava/util/Collection;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->readLegacyPermissionsTEMP(Lcom/android/server/pm/permission/LegacyPermissionSettings;)V
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->restorePermissionState(Lcom/android/server/pm/pkg/AndroidPackage;ZLjava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceImpl$PermissionCallback;I)V+]Lcom/android/server/policy/PermissionPolicyInternal;Lcom/android/server/policy/PermissionPolicyService$Internal;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl$PermissionCallback;Lcom/android/server/pm/permission/PermissionManagerServiceImpl$1;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Ljava/util/Collection;Landroid/util/ArraySet;,Ljava/util/Collections$UnmodifiableSet;]Lcom/android/server/pm/permission/PermissionState;Lcom/android/server/pm/permission/PermissionState;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/permission/DevicePermissionState;Lcom/android/server/pm/permission/DevicePermissionState;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/pm/permission/UserPermissionState;Lcom/android/server/pm/permission/UserPermissionState;]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/permission/PermissionRegistry;Lcom/android/server/pm/permission/PermissionRegistry;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->revokePermissionsNoLongerImplicitLocked(Lcom/android/server/pm/permission/UidPermissionState;Ljava/lang/String;Ljava/util/Collection;II[I)[I+]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Ljava/util/Collection;Landroid/util/ArraySet;,Ljava/util/Collections$UnmodifiableSet;]Lcom/android/server/pm/permission/PermissionRegistry;Lcom/android/server/pm/permission/PermissionRegistry;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$EmptyIterator;]Ljava/util/Set;Landroid/util/ArraySet;,Ljava/util/Collections$EmptySet;
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->revokeRuntimePermissionsIfGroupChangedInternal(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->revokeStoragePermissionsIfScopeExpandedInternal(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->revokeSystemAlertWindowIfUpgradedPast23(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;)V
-HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->setInitialGrantForNewImplicitPermissionsLocked(Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/pkg/AndroidPackage;Landroid/util/ArraySet;I[I)[I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Landroid/permission/PermissionManager$SplitPermissionInfo;Landroid/permission/PermissionManager$SplitPermissionInfo;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/permission/PermissionRegistry;Lcom/android/server/pm/permission/PermissionRegistry;]Ljava/util/Set;Landroid/util/ArraySet;
+HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->setInitialGrantForNewImplicitPermissionsLocked(Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/pkg/AndroidPackage;Landroid/util/ArraySet;I[I)[I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/permission/PermissionRegistry;Lcom/android/server/pm/permission/PermissionRegistry;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Landroid/permission/PermissionManager$SplitPermissionInfo;Landroid/permission/PermissionManager$SplitPermissionInfo;]Ljava/util/Set;Landroid/util/ArraySet;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->shouldGrantPermissionByProtectionFlags(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/permission/Permission;Landroid/util/ArraySet;)Z+]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ApexManager;Lcom/android/server/pm/ApexManager$ApexManagerImpl;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->shouldGrantPermissionBySignature(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/permission/Permission;)Z+]Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;IIZLjava/lang/String;I)V+]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
 HPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->updatePermissionFlagsInternal(Ljava/lang/String;Ljava/lang/String;IIIIZLcom/android/server/pm/permission/PermissionManagerServiceImpl$PermissionCallback;)V+]Lcom/android/server/pm/permission/PermissionManagerServiceImpl$PermissionCallback;Lcom/android/server/pm/permission/PermissionManagerServiceImpl$1;]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/permission/PermissionRegistry;Lcom/android/server/pm/permission/PermissionRegistry;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->updatePermissionSourcePackage(Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceImpl$PermissionCallback;)Z+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Lcom/android/server/pm/permission/PermissionRegistry;Lcom/android/server/pm/permission/PermissionRegistry;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/ArraySet;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/pm/permission/PermissionManagerServiceImpl;Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
 HSPLcom/android/server/pm/permission/PermissionManagerServiceImpl;->writeLegacyPermissionsTEMP(Lcom/android/server/pm/permission/LegacyPermissionSettings;)V+]Lcom/android/server/pm/permission/LegacyPermissionSettings;Lcom/android/server/pm/permission/LegacyPermissionSettings;]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/permission/PermissionRegistry;Lcom/android/server/pm/permission/PermissionRegistry;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
-HSPLcom/android/server/pm/permission/PermissionMigrationHelperImpl;-><clinit>()V
-HSPLcom/android/server/pm/permission/PermissionMigrationHelperImpl;-><init>()V
-HSPLcom/android/server/pm/permission/PermissionRegistry;-><init>()V
 HSPLcom/android/server/pm/permission/PermissionRegistry;->addAppOpPermissionPackage(Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/server/pm/permission/PermissionRegistry;->addPermission(Lcom/android/server/pm/permission/Permission;)V
-HSPLcom/android/server/pm/permission/PermissionRegistry;->addPermissionGroup(Lcom/android/internal/pm/pkg/component/ParsedPermissionGroup;)V
-HSPLcom/android/server/pm/permission/PermissionRegistry;->addPermissionTree(Lcom/android/server/pm/permission/Permission;)V
 HSPLcom/android/server/pm/permission/PermissionRegistry;->getPermission(Ljava/lang/String;)Lcom/android/server/pm/permission/Permission;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/pm/permission/PermissionRegistry;->getPermissionGroup(Ljava/lang/String;)Lcom/android/internal/pm/pkg/component/ParsedPermissionGroup;
-HSPLcom/android/server/pm/permission/PermissionRegistry;->getPermissionTree(Ljava/lang/String;)Lcom/android/server/pm/permission/Permission;
-HSPLcom/android/server/pm/permission/PermissionRegistry;->getPermissionTrees()Ljava/util/Collection;
 HSPLcom/android/server/pm/permission/PermissionState;-><init>(Lcom/android/server/pm/permission/Permission;)V
-HSPLcom/android/server/pm/permission/PermissionState;-><init>(Lcom/android/server/pm/permission/PermissionState;)V
 HSPLcom/android/server/pm/permission/PermissionState;->computeGids(I)[I+]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;
 HSPLcom/android/server/pm/permission/PermissionState;->getFlags()I
 HSPLcom/android/server/pm/permission/PermissionState;->getName()Ljava/lang/String;+]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;
 HSPLcom/android/server/pm/permission/PermissionState;->getPermission()Lcom/android/server/pm/permission/Permission;
 HSPLcom/android/server/pm/permission/PermissionState;->grant()Z
 HSPLcom/android/server/pm/permission/PermissionState;->isGranted()Z
-HSPLcom/android/server/pm/permission/PermissionState;->revoke()Z
 HSPLcom/android/server/pm/permission/PermissionState;->updateFlags(II)Z
-HSPLcom/android/server/pm/permission/UidPermissionState;-><init>()V
 HSPLcom/android/server/pm/permission/UidPermissionState;-><init>(Lcom/android/server/pm/permission/UidPermissionState;)V
 HSPLcom/android/server/pm/permission/UidPermissionState;->computeGids([II)[I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/IntArray;Landroid/util/IntArray;]Lcom/android/server/pm/permission/PermissionState;Lcom/android/server/pm/permission/PermissionState;
 HSPLcom/android/server/pm/permission/UidPermissionState;->getGrantedPermissions()Ljava/util/Set;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/permission/PermissionState;Lcom/android/server/pm/permission/PermissionState;]Ljava/util/Set;Landroid/util/ArraySet;
 HSPLcom/android/server/pm/permission/UidPermissionState;->getOrCreatePermissionState(Lcom/android/server/pm/permission/Permission;)Lcom/android/server/pm/permission/PermissionState;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/permission/Permission;Lcom/android/server/pm/permission/Permission;
 HSPLcom/android/server/pm/permission/UidPermissionState;->getPermissionFlags(Ljava/lang/String;)I+]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/permission/PermissionState;Lcom/android/server/pm/permission/PermissionState;
 HSPLcom/android/server/pm/permission/UidPermissionState;->getPermissionState(Ljava/lang/String;)Lcom/android/server/pm/permission/PermissionState;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/pm/permission/UidPermissionState;->getPermissionStates()Ljava/util/List;
 HSPLcom/android/server/pm/permission/UidPermissionState;->grantPermission(Lcom/android/server/pm/permission/Permission;)Z+]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/permission/PermissionState;Lcom/android/server/pm/permission/PermissionState;
 HSPLcom/android/server/pm/permission/UidPermissionState;->hasPermissionState(Ljava/lang/String;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/pm/permission/UidPermissionState;->invalidateCache()V
 HSPLcom/android/server/pm/permission/UidPermissionState;->isPermissionGranted(Ljava/lang/String;)Z+]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/permission/PermissionState;Lcom/android/server/pm/permission/PermissionState;
 HSPLcom/android/server/pm/permission/UidPermissionState;->putPermissionState(Lcom/android/server/pm/permission/Permission;ZI)V
-HSPLcom/android/server/pm/permission/UidPermissionState;->reset()V
 HSPLcom/android/server/pm/permission/UidPermissionState;->revokePermission(Lcom/android/server/pm/permission/Permission;)Z
-HSPLcom/android/server/pm/permission/UidPermissionState;->setMissing(Z)V
 HSPLcom/android/server/pm/permission/UidPermissionState;->updatePermissionFlags(Lcom/android/server/pm/permission/Permission;II)Z+]Lcom/android/server/pm/permission/UidPermissionState;Lcom/android/server/pm/permission/UidPermissionState;]Lcom/android/server/pm/permission/PermissionState;Lcom/android/server/pm/permission/PermissionState;
-HSPLcom/android/server/pm/permission/UserPermissionState;-><init>()V
 HSPLcom/android/server/pm/permission/UserPermissionState;->checkAppId(I)V
 HSPLcom/android/server/pm/permission/UserPermissionState;->getOrCreateUidState(I)Lcom/android/server/pm/permission/UidPermissionState;+]Lcom/android/server/pm/permission/UserPermissionState;Lcom/android/server/pm/permission/UserPermissionState;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/permission/UserPermissionState;->getUidState(I)Lcom/android/server/pm/permission/UidPermissionState;+]Lcom/android/server/pm/permission/UserPermissionState;Lcom/android/server/pm/permission/UserPermissionState;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/permission/UserPermissionState;->setInstallPermissionsFixed(Ljava/lang/String;Z)V
-HPLcom/android/server/pm/pkg/PackageStateInternal;->getUserStateOrDefault(I)Lcom/android/server/pm/pkg/PackageUserState;+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;
+HSPLcom/android/server/pm/pkg/PackageStateInternal;->getUserStateOrDefault(I)Lcom/android/server/pm/pkg/PackageUserState;+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/pkg/PackageStateInternal;->getUserStateOrDefault(I)Lcom/android/server/pm/pkg/PackageUserStateInternal;+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/pkg/PackageStateUnserialized;-><init>(Lcom/android/server/pm/PackageSetting;)V
-HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->getApexModuleName()Ljava/lang/String;
 HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->getLastPackageUsageTimeInMills()[J+]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;
 HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->getOverrideSeInfo()Ljava/lang/String;
 HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->getSeInfo()Ljava/lang/String;
@@ -7967,7 +5947,7 @@
 HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->isUpdatedSystemApp()Z
 HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->setApexModuleName(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateUnserialized;
 HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->setApkInUpdatedApex(Z)Lcom/android/server/pm/pkg/PackageStateUnserialized;
-HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->setLastPackageUsageTimeInMills(IJ)Lcom/android/server/pm/pkg/PackageStateUnserialized;
+HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->setLastPackageUsageTimeInMills(IJ)Lcom/android/server/pm/pkg/PackageStateUnserialized;+]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;
 HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->setSeInfo(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateUnserialized;
 HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->setUpdatedSystemApp(Z)Lcom/android/server/pm/pkg/PackageStateUnserialized;
 HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->setUsesLibraryFiles(Ljava/util/List;)Lcom/android/server/pm/pkg/PackageStateUnserialized;
@@ -7975,22 +5955,10 @@
 HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->updateFrom(Lcom/android/server/pm/pkg/PackageStateUnserialized;)V+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;
 HSPLcom/android/server/pm/pkg/PackageStateUtils;->isEnabledAndMatches(Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/content/pm/ComponentInfo;JI)Z+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/pkg/PackageStateUtils;->isEnabledAndMatches(Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/internal/pm/pkg/component/ParsedMainComponent;JI)Z+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
-HSPLcom/android/server/pm/pkg/PackageUserStateDefault;-><init>()V
-HSPLcom/android/server/pm/pkg/PackageUserStateDefault;->getAllOverlayPaths()Landroid/content/pm/overlay/OverlayPaths;
-HSPLcom/android/server/pm/pkg/PackageUserStateDefault;->getArchiveState()Lcom/android/server/pm/pkg/ArchiveState;
-HSPLcom/android/server/pm/pkg/PackageUserStateDefault;->getEnabledState()I
-HSPLcom/android/server/pm/pkg/PackageUserStateDefault;->getFirstInstallTimeMillis()J
-HSPLcom/android/server/pm/pkg/PackageUserStateDefault;->isHidden()Z
-HSPLcom/android/server/pm/pkg/PackageUserStateDefault;->isInstalled()Z
-HSPLcom/android/server/pm/pkg/PackageUserStateDefault;->isInstantApp()Z
-HSPLcom/android/server/pm/pkg/PackageUserStateDefault;->isStopped()Z
-HSPLcom/android/server/pm/pkg/PackageUserStateDefault;->isSuspended()Z
-HSPLcom/android/server/pm/pkg/PackageUserStateDefault;->isVirtualPreload()Z
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl$1;-><init>(Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/utils/Watchable;)V
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl$1;->createSnapshot()Lcom/android/server/pm/pkg/PackageUserStateImpl;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;-><init>(Lcom/android/server/utils/Watchable;)V
-HSPLcom/android/server/pm/pkg/PackageUserStateImpl;-><init>(Lcom/android/server/utils/Watchable;Lcom/android/server/pm/pkg/PackageUserStateImpl;)V
-HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->equals(Ljava/lang/Object;)Z
+HSPLcom/android/server/pm/pkg/PackageUserStateImpl;-><init>(Lcom/android/server/utils/Watchable;Lcom/android/server/pm/pkg/PackageUserStateImpl;)V+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getAllOverlayPaths()Landroid/content/pm/overlay/OverlayPaths;+]Landroid/content/pm/overlay/OverlayPaths$Builder;Landroid/content/pm/overlay/OverlayPaths$Builder;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getArchiveState()Lcom/android/server/pm/pkg/ArchiveState;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getBoolean(I)Z
@@ -8003,10 +5971,9 @@
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getEnabledComponentsNoCopy()Lcom/android/server/utils/WatchedArraySet;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getEnabledState()I
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getFirstInstallTimeMillis()J
-HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getHarmfulAppWarning()Ljava/lang/String;
-HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getLastDisableAppCaller()Ljava/lang/String;
+HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getInstallReason()I
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getMinAspectRatio()I
-HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getOverrideLabelIconForComponent(Landroid/content/ComponentName;)Landroid/util/Pair;
+HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getOverrideLabelIconForComponent(Landroid/content/ComponentName;)Landroid/util/Pair;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getUninstallReason()I
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isComponentDisabled(Ljava/lang/String;)Z+]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isComponentEnabled(Ljava/lang/String;)Z+]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;
@@ -8019,7 +5986,7 @@
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isSuspended()Z
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isVirtualPreload()Z
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->makeCache()Lcom/android/server/utils/SnapshotCache;
-HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->onChanged()V
+HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->onChanged()V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/Watchable;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setArchiveState(Lcom/android/server/pm/pkg/ArchiveState;)Lcom/android/server/pm/pkg/PackageUserStateImpl;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setBoolean(IZ)V
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setCeDataInode(J)Lcom/android/server/pm/pkg/PackageUserStateImpl;
@@ -8039,36 +6006,20 @@
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setNotLaunched(Z)Lcom/android/server/pm/pkg/PackageUserStateImpl;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setSplashScreenTheme(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageUserStateImpl;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setStopped(Z)Lcom/android/server/pm/pkg/PackageUserStateImpl;
-HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setSuspendParams(Landroid/util/ArrayMap;)Lcom/android/server/pm/pkg/PackageUserStateImpl;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setUninstallReason(I)Lcom/android/server/pm/pkg/PackageUserStateImpl;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setVirtualPreload(Z)Lcom/android/server/pm/pkg/PackageUserStateImpl;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setWatchable(Lcom/android/server/utils/Watchable;)Lcom/android/server/pm/pkg/PackageUserStateImpl;
 HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->snapshot()Lcom/android/server/pm/pkg/PackageUserStateImpl;
-HSPLcom/android/server/pm/pkg/PackageUserStateInternal;-><clinit>()V
 HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->isAvailable(Lcom/android/server/pm/pkg/PackageUserState;J)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;
-HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->isEnabled(Lcom/android/server/pm/pkg/PackageUserState;ZZLjava/lang/String;J)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;
+HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->isEnabled(Lcom/android/server/pm/pkg/PackageUserState;ZZLjava/lang/String;J)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;
 HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->isMatch(Lcom/android/server/pm/pkg/PackageUserState;Landroid/content/pm/ComponentInfo;J)Z+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;
 HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->isMatch(Lcom/android/server/pm/pkg/PackageUserState;ZZLcom/android/internal/pm/pkg/component/ParsedMainComponent;J)Z+]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;
 HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->isMatch(Lcom/android/server/pm/pkg/PackageUserState;ZZZZLjava/lang/String;J)Z
 HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->reportIfDebug(ZJ)Z
 HSPLcom/android/server/pm/pkg/SELinuxUtil;->getSeinfoUser(Lcom/android/server/pm/pkg/PackageUserState;)Ljava/lang/String;+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;,Lcom/android/server/pm/pkg/PackageUserStateDefault;
-HSPLcom/android/server/pm/pkg/SharedLibraryWrapper;-><init>(Landroid/content/pm/SharedLibraryInfo;)V
 HSPLcom/android/server/pm/pkg/SharedLibraryWrapper;->getInfo()Landroid/content/pm/SharedLibraryInfo;
-HSPLcom/android/server/pm/pkg/mutate/PackageStateMutator$StateWriteWrapper$UserStateWriteWrapper;-><init>()V
-HSPLcom/android/server/pm/pkg/mutate/PackageStateMutator$StateWriteWrapper$UserStateWriteWrapper;-><init>(Lcom/android/server/pm/pkg/mutate/PackageStateMutator$StateWriteWrapper$UserStateWriteWrapper-IA;)V
-HSPLcom/android/server/pm/pkg/mutate/PackageStateMutator$StateWriteWrapper;-><init>()V
-HSPLcom/android/server/pm/pkg/mutate/PackageStateMutator$StateWriteWrapper;-><init>(Lcom/android/server/pm/pkg/mutate/PackageStateMutator$StateWriteWrapper-IA;)V
-HSPLcom/android/server/pm/pkg/mutate/PackageStateMutator;-><clinit>()V
-HSPLcom/android/server/pm/pkg/mutate/PackageStateMutator;-><init>(Ljava/util/function/Function;Ljava/util/function/Function;)V
 HSPLcom/android/server/pm/pkg/mutate/PackageStateMutator;->onPackageStateChanged()V+]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong;
-HSPLcom/android/server/pm/resolution/ComponentResolver$$ExternalSyntheticLambda0;-><init>()V
 HSPLcom/android/server/pm/resolution/ComponentResolver$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
-HSPLcom/android/server/pm/resolution/ComponentResolver$$ExternalSyntheticLambda1;-><init>()V
-HSPLcom/android/server/pm/resolution/ComponentResolver$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/server/pm/resolution/ComponentResolver$$ExternalSyntheticLambda2;-><init>()V
-HSPLcom/android/server/pm/resolution/ComponentResolver$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/server/pm/resolution/ComponentResolver$1;-><init>(Lcom/android/server/pm/resolution/ComponentResolver;Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/utils/Watchable;Lcom/android/server/pm/UserNeedsBadgingCache;)V
-HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;-><init>(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserNeedsBadgingCache;)V
 HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->addActivity(Lcom/android/server/pm/Computer;Lcom/android/internal/pm/pkg/component/ParsedActivity;Ljava/lang/String;Ljava/util/List;)V+]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->addFilter(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/util/Pair;)V
 HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->allowFilterResult(Landroid/util/Pair;Ljava/util/List;)Z+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
@@ -8078,30 +6029,22 @@
 HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/util/Pair;)Z+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->isPackageForFilter(Ljava/lang/String;Ljava/lang/Object;)Z+]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->newArray(I)[Landroid/util/Pair;
-HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->newArray(I)[Ljava/lang/Object;
+HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->newArray(I)[Ljava/lang/Object;+]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->newResult(Lcom/android/server/pm/Computer;Landroid/util/Pair;IIJ)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/server/pm/UserNeedsBadgingCache;Lcom/android/server/pm/UserNeedsBadgingCache;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;,Lcom/android/server/pm/ComputerEngine;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->newResult(Lcom/android/server/pm/Computer;Ljava/lang/Object;IIJ)Ljava/lang/Object;+]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->queryIntent(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JI)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->queryIntentForPackage(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;,Ljava/util/ArrayList;]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
-HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->removeActivity(Lcom/android/internal/pm/pkg/component/ParsedActivity;Ljava/lang/String;)V
+HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->removeActivity(Lcom/android/internal/pm/pkg/component/ParsedActivity;Ljava/lang/String;)V+]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/IntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->sortResults(Ljava/util/List;)V+]Ljava/util/List;Ljava/util/ArrayList;
-HSPLcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver;-><init>(Lcom/android/server/pm/UserManagerService;)V
 HSPLcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver;->addFilter(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/util/Pair;)V+]Lcom/android/server/IntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;
 HSPLcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver;->applyMimeGroups(Lcom/android/server/pm/Computer;Landroid/util/Pair;)V+]Lcom/android/server/IntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;
 HSPLcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver;->isFilterStopped(Lcom/android/server/pm/Computer;Landroid/util/Pair;I)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver;->isFilterStopped(Lcom/android/server/pm/Computer;Ljava/lang/Object;I)Z+]Lcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;
-HSPLcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;-><init>(Lcom/android/server/pm/UserManagerService;)V
-HSPLcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;->addFilter(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/util/Pair;)V
 HSPLcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;->addProvider(Lcom/android/server/pm/Computer;Lcom/android/internal/pm/pkg/component/ParsedProvider;)V
 HSPLcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;->getIntentFilter(Landroid/util/Pair;)Landroid/content/IntentFilter;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;
-HSPLcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;->newArray(I)[Landroid/util/Pair;
-HSPLcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;->newArray(I)[Ljava/lang/Object;
-HPLcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;->newResult(Lcom/android/server/pm/Computer;Landroid/util/Pair;IIJ)Landroid/content/pm/ResolveInfo;
-HSPLcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;-><init>(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserNeedsBadgingCache;)V
-HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;-><init>(Lcom/android/server/pm/UserManagerService;)V
-HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->addFilter(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/util/Pair;)V
-HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->addService(Lcom/android/server/pm/Computer;Lcom/android/internal/pm/pkg/component/ParsedService;)V
+HPLcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;->newResult(Lcom/android/server/pm/Computer;Landroid/util/Pair;IIJ)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
+HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->addService(Lcom/android/server/pm/Computer;Lcom/android/internal/pm/pkg/component/ParsedService;)V+]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->allowFilterResult(Landroid/util/Pair;Ljava/util/List;)Z+]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->allowFilterResult(Ljava/lang/Object;Ljava/util/List;)Z+]Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->getIntentFilter(Landroid/util/Pair;)Landroid/content/IntentFilter;+]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;
@@ -8116,27 +6059,21 @@
 HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->queryIntentForPackage(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;,Ljava/util/ArrayList;]Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->sortResults(Ljava/util/List;)V+]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/pm/resolution/ComponentResolver;->$r8$lambda$UVMyfxjaimXrgxK-y9k5NRVVfkI(Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;)I
-HSPLcom/android/server/pm/resolution/ComponentResolver;-><clinit>()V
-HSPLcom/android/server/pm/resolution/ComponentResolver;-><init>(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserNeedsBadgingCache;)V
 HSPLcom/android/server/pm/resolution/ComponentResolver;->addActivitiesLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/AndroidPackage;Ljava/util/List;Z)V+]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
-HSPLcom/android/server/pm/resolution/ComponentResolver;->addAllComponents(Lcom/android/server/pm/pkg/AndroidPackage;ZLjava/lang/String;Lcom/android/server/pm/Computer;)V
-HSPLcom/android/server/pm/resolution/ComponentResolver;->addProvidersLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/AndroidPackage;Z)V
-HSPLcom/android/server/pm/resolution/ComponentResolver;->addReceiversLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/AndroidPackage;Z)V
-HSPLcom/android/server/pm/resolution/ComponentResolver;->addServicesLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/AndroidPackage;Z)V
-HSPLcom/android/server/pm/resolution/ComponentResolver;->adjustPriority(Lcom/android/server/pm/Computer;Ljava/util/List;Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Ljava/lang/String;)V
-HSPLcom/android/server/pm/resolution/ComponentResolver;->assertProvidersNotDefined(Lcom/android/server/pm/pkg/AndroidPackage;)V
-HSPLcom/android/server/pm/resolution/ComponentResolver;->findMatchingActivity(Ljava/util/List;Lcom/android/internal/pm/pkg/component/ParsedActivity;)Lcom/android/internal/pm/pkg/component/ParsedActivity;
-HSPLcom/android/server/pm/resolution/ComponentResolver;->getIntentListSubset(Ljava/util/List;Ljava/util/function/Function;Ljava/util/Iterator;)V
+HSPLcom/android/server/pm/resolution/ComponentResolver;->addAllComponents(Lcom/android/server/pm/pkg/AndroidPackage;ZLjava/lang/String;Lcom/android/server/pm/Computer;)V+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
+HSPLcom/android/server/pm/resolution/ComponentResolver;->addProvidersLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/AndroidPackage;Z)V+]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
+HSPLcom/android/server/pm/resolution/ComponentResolver;->addReceiversLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/AndroidPackage;Z)V+]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
+HSPLcom/android/server/pm/resolution/ComponentResolver;->addServicesLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/AndroidPackage;Z)V+]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
+HSPLcom/android/server/pm/resolution/ComponentResolver;->adjustPriority(Lcom/android/server/pm/Computer;Ljava/util/List;Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Ljava/lang/String;)V+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
+HSPLcom/android/server/pm/resolution/ComponentResolver;->findMatchingActivity(Ljava/util/List;Lcom/android/internal/pm/pkg/component/ParsedActivity;)Lcom/android/internal/pm/pkg/component/ParsedActivity;+]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;
 HSPLcom/android/server/pm/resolution/ComponentResolver;->isProtectedAction(Landroid/content/IntentFilter;)Z
 HSPLcom/android/server/pm/resolution/ComponentResolver;->lambda$static$0(Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;)I
-HSPLcom/android/server/pm/resolution/ComponentResolver;->onChanged()V
-HSPLcom/android/server/pm/resolution/ComponentResolver;->removeAllComponentsLocked(Lcom/android/server/pm/pkg/AndroidPackage;Z)V
+HSPLcom/android/server/pm/resolution/ComponentResolver;->removeAllComponentsLocked(Lcom/android/server/pm/pkg/AndroidPackage;Z)V+]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;
 HSPLcom/android/server/pm/resolution/ComponentResolver;->snapshot()Lcom/android/server/pm/resolution/ComponentResolverApi;
-HSPLcom/android/server/pm/resolution/ComponentResolverBase;-><init>(Lcom/android/server/pm/UserManagerService;)V
 HSPLcom/android/server/pm/resolution/ComponentResolverBase;->getActivity(Landroid/content/ComponentName;)Lcom/android/internal/pm/pkg/component/ParsedActivity;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/pm/resolution/ComponentResolverBase;->getReceiver(Landroid/content/ComponentName;)Lcom/android/internal/pm/pkg/component/ParsedActivity;
 HSPLcom/android/server/pm/resolution/ComponentResolverBase;->getService(Landroid/content/ComponentName;)Lcom/android/internal/pm/pkg/component/ParsedService;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryActivities(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JI)Ljava/util/List;
+HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryActivities(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JI)Ljava/util/List;+]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;
 HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryActivities(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List;+]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;
 HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryProvider(Lcom/android/server/pm/Computer;Ljava/lang/String;JI)Landroid/content/pm/ProviderInfo;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;
 HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryProviders(Lcom/android/server/pm/Computer;Ljava/lang/String;Ljava/lang/String;IJI)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/parsing/PackageInfoUtils$CachedApplicationInfoGenerator;Lcom/android/server/pm/parsing/PackageInfoUtils$CachedApplicationInfoGenerator;
@@ -8144,13 +6081,8 @@
 HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryReceivers(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List;
 HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryServices(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JI)Ljava/util/List;
 HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryServices(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List;
-HSPLcom/android/server/pm/resolution/ComponentResolverLocked;-><init>(Lcom/android/server/pm/UserManagerService;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector$$ExternalSyntheticLambda0;-><init>()V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->$r8$lambda$batCCh6Ga6j4xiWi4NlYNy9upmc(Landroid/util/ArraySet;Ljava/lang/String;)Ljava/lang/Boolean;
-HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;-><clinit>()V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;-><init>(Lcom/android/server/compat/PlatformCompat;Lcom/android/server/SystemConfig;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->byteSizeOf(Ljava/lang/String;)I
 HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->collectAllWebDomains(Lcom/android/server/pm/pkg/AndroidPackage;)Landroid/util/ArraySet;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->collectDomains(Lcom/android/server/pm/pkg/AndroidPackage;ZZ)Landroid/util/ArraySet;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->collectDomains(Lcom/android/server/pm/pkg/AndroidPackage;ZZLjava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;
@@ -8158,26 +6090,13 @@
 HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->collectDomainsLegacy(Lcom/android/server/pm/pkg/AndroidPackage;ZZLjava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->collectValidAutoVerifyDomains(Lcom/android/server/pm/pkg/AndroidPackage;)Landroid/util/ArraySet;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->isValidHost(Ljava/lang/String;)Z
-HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->lambda$static$0(Landroid/util/ArraySet;Ljava/lang/String;)Ljava/lang/Boolean;
-HSPLcom/android/server/pm/verify/domain/DomainVerificationDebug;-><init>(Lcom/android/server/pm/verify/domain/DomainVerificationCollector;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationEnforcer;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationEnforcer;->callerIsLegacyUserSelector(IILjava/lang/String;I)Z
-HSPLcom/android/server/pm/verify/domain/DomainVerificationEnforcer;->setCallback(Lcom/android/server/pm/verify/domain/DomainVerificationEnforcer$Callback;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState;-><init>()V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState;->addUserState(II)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationLegacySettings;-><init>()V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationLegacySettings;->add(Ljava/lang/String;II)V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationLegacySettings;->getOrCreateStateLocked(Ljava/lang/String;)Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState;
-HSPLcom/android/server/pm/verify/domain/DomainVerificationLegacySettings;->readSettings(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationLegacySettings;->readUserState(Lcom/android/server/pm/SettingsXml$ReadSection;Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationLegacySettings;->readUserStates(Lcom/android/server/pm/SettingsXml$ReadSection;)V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationLegacySettings;->writeSettings(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/pm/SettingsXml$Serializer;Lcom/android/server/pm/SettingsXml$Serializer;]Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState;Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState;]Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/SettingsXml$WriteSectionImpl;
-HSPLcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;-><clinit>()V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationManagerStub;-><init>(Lcom/android/server/pm/verify/domain/DomainVerificationService;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence$ReadResult;-><init>(Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->createPkgStateFromXml(Lcom/android/server/pm/SettingsXml$ReadSection;)Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->readDomainStates(Lcom/android/server/pm/SettingsXml$ReadSection;Landroid/util/ArrayMap;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->readFromXml(Lcom/android/modules/utils/TypedXmlPullParser;)Lcom/android/server/pm/verify/domain/DomainVerificationPersistence$ReadResult;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->readPackageStates(Lcom/android/server/pm/SettingsXml$ReadSection;Landroid/util/ArrayMap;)V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->writePackageStates(Lcom/android/server/pm/SettingsXml$WriteSection;Ljava/util/Collection;ILjava/util/function/Function;)V+]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;,Landroid/util/ArraySet;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->writePkgStateToXml(Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;ILjava/util/function/Function;)V+]Ljava/util/function/Function;Lcom/android/server/pm/verify/domain/DomainVerificationService$$ExternalSyntheticLambda0;]Ljava/lang/Object;Ljava/util/UUID;]Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/SettingsXml$WriteSectionImpl;]Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;
@@ -8185,55 +6104,37 @@
 HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->writeToXml(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/pm/verify/domain/models/DomainVerificationStateMap;Landroid/util/ArrayMap;Landroid/util/ArrayMap;ILjava/util/function/Function;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/verify/domain/models/DomainVerificationStateMap;Lcom/android/server/pm/verify/domain/models/DomainVerificationStateMap;]Lcom/android/server/pm/SettingsXml$Serializer;Lcom/android/server/pm/SettingsXml$Serializer;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/SettingsXml$WriteSectionImpl;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->writeUriRelativeFilterGroupMap(Lcom/android/server/pm/SettingsXml$WriteSection;Landroid/util/ArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->writeUserStates(Lcom/android/server/pm/SettingsXml$WriteSection;ILandroid/util/SparseArray;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/SettingsXml$WriteSectionImpl;
-HSPLcom/android/server/pm/verify/domain/DomainVerificationService;-><init>(Landroid/content/Context;Lcom/android/server/SystemConfig;Lcom/android/server/compat/PlatformCompat;)V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->addPackage(Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/content/pm/verify/domain/DomainSet;)V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->applyImmutableState(Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/util/ArrayMap;Landroid/util/ArraySet;)Z
-HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->applyPreVerifiedState(Landroid/util/ArrayMap;Landroid/util/ArraySet;Landroid/content/pm/verify/domain/DomainSet;)V
+HPLcom/android/server/pm/verify/domain/DomainVerificationService;->approvalLevelForDomain(Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/content/Intent;JI)I+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->generateNewId()Ljava/util/UUID;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->migrateState(Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/content/pm/verify/domain/DomainSet;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->onStart()V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->readLegacySettings(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->readSettings(Lcom/android/server/pm/Computer;Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->setConnection(Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal$Connection;)V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->setLegacyUserState(Ljava/lang/String;II)Z
-HSPLcom/android/server/pm/verify/domain/DomainVerificationSettings;-><init>(Lcom/android/server/pm/verify/domain/DomainVerificationCollector;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationSettings;->readSettings(Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/server/pm/verify/domain/models/DomainVerificationStateMap;Lcom/android/server/pm/Computer;)V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationSettings;->removePendingState(Ljava/lang/String;)Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;
-HSPLcom/android/server/pm/verify/domain/DomainVerificationShell;-><init>(Lcom/android/server/pm/verify/domain/DomainVerificationShell$Callback;)V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationUtils$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/pm/verify/domain/DomainVerificationUtils;-><clinit>()V
 HSPLcom/android/server/pm/verify/domain/DomainVerificationUtils;->buildMockAppInfo(Lcom/android/server/pm/pkg/AndroidPackage;)Landroid/content/pm/ApplicationInfo;
 HSPLcom/android/server/pm/verify/domain/DomainVerificationUtils;->isChangeEnabled(Lcom/android/server/compat/PlatformCompat;Lcom/android/server/pm/pkg/AndroidPackage;J)Z
-HPLcom/android/server/pm/verify/domain/DomainVerificationUtils;->isDomainVerificationIntent(Landroid/content/Intent;J)Z
+HPLcom/android/server/pm/verify/domain/DomainVerificationUtils;->isDomainVerificationIntent(Landroid/content/Intent;J)Z+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;]Landroid/net/Uri;Landroid/net/Uri$OpaqueUri;,Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;-><init>(Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;Ljava/util/UUID;Z)V
 HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;-><init>(Ljava/lang/String;Ljava/util/UUID;ZLandroid/util/ArrayMap;Landroid/util/SparseArray;Ljava/lang/String;Landroid/util/ArrayMap;)V
-HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->equals(Ljava/lang/Object;)Z
-HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->getBackupSignatureHash()Ljava/lang/String;
-HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->getId()Ljava/util/UUID;
 HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->getPackageName()Ljava/lang/String;
 HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->getStateMap()Landroid/util/ArrayMap;
 HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->getUriRelativeFilterGroupMap()Landroid/util/ArrayMap;
 HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->getUserStates()Landroid/util/SparseArray;
 HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->hashCode()I+]Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;
-HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->isHasAutoVerifyDomains()Z
-HSPLcom/android/server/pm/verify/domain/models/DomainVerificationStateMap;-><init>()V
-HSPLcom/android/server/pm/verify/domain/models/DomainVerificationStateMap;->get(Ljava/lang/String;)Ljava/lang/Object;
+HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->userStatesHashCode()I+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/pm/verify/domain/models/DomainVerificationStateMap;->put(Ljava/lang/String;Ljava/util/UUID;Ljava/lang/Object;)V
-HSPLcom/android/server/pm/verify/domain/models/DomainVerificationStateMap;->remove(Ljava/util/UUID;)Ljava/lang/Object;
-HSPLcom/android/server/pm/verify/domain/proxy/DomainVerificationProxyUnavailable;-><init>()V
-HPLcom/android/server/policy/AppOpsPolicy;->checkAudioOperation(IIILjava/lang/String;Lcom/android/internal/util/function/QuadFunction;)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/internal/util/function/QuadFunction;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda5;
+HPLcom/android/server/policy/AppOpsPolicy;->checkAudioOperation(IIILjava/lang/String;Lcom/android/internal/util/function/QuadFunction;)I+]Lcom/android/internal/util/function/QuadFunction;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda5;]Ljava/lang/Integer;Ljava/lang/Integer;
 HSPLcom/android/server/policy/AppOpsPolicy;->checkOperation(IILjava/lang/String;Ljava/lang/String;IZLcom/android/internal/util/function/HexFunction;)I+]Lcom/android/internal/util/function/HexFunction;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda9;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/policy/AppOpsPolicy;Lcom/android/server/policy/AppOpsPolicy;
 HSPLcom/android/server/policy/AppOpsPolicy;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;ILcom/android/internal/util/function/HexConsumer;)V+]Lcom/android/internal/util/function/HexConsumer;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda11;]Lcom/android/server/policy/AppOpsPolicy;Lcom/android/server/policy/AppOpsPolicy;
-HPLcom/android/server/policy/AppOpsPolicy;->isDatasourceAttributionTag(ILjava/lang/String;Ljava/lang/String;Ljava/util/Map;)Z
+HPLcom/android/server/policy/AppOpsPolicy;->isDatasourceAttributionTag(ILjava/lang/String;Ljava/lang/String;Ljava/util/Map;)Z+]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap;
 HSPLcom/android/server/policy/AppOpsPolicy;->noteOperation(IILjava/lang/String;Ljava/lang/String;IZLjava/lang/String;ZLcom/android/internal/util/function/OctFunction;)Landroid/app/SyncNotedAppOp;+]Lcom/android/internal/util/function/OctFunction;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda1;]Lcom/android/server/policy/AppOpsPolicy;Lcom/android/server/policy/AppOpsPolicy;
 HPLcom/android/server/policy/AppOpsPolicy;->noteProxyOperation(ILandroid/content/AttributionSource;ZLjava/lang/String;ZZLcom/android/internal/util/function/HexFunction;)Landroid/app/SyncNotedAppOp;
 HSPLcom/android/server/policy/AppOpsPolicy;->resolveDatasourceOp(IILjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/policy/AppOpsPolicy;Lcom/android/server/policy/AppOpsPolicy;
-HSPLcom/android/server/policy/AppOpsPolicy;->resolveRecordAudioOp(II)I
+HSPLcom/android/server/policy/AppOpsPolicy;->resolveRecordAudioOp(II)I+]Landroid/service/voice/VoiceInteractionManagerInternal$HotwordDetectionServiceIdentity;Landroid/service/voice/VoiceInteractionManagerInternal$HotwordDetectionServiceIdentity;]Landroid/service/voice/VoiceInteractionManagerInternal;Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$LocalService;
 HSPLcom/android/server/policy/AppOpsPolicy;->resolveSandboxedServiceOp(II)I
 HSPLcom/android/server/policy/AppOpsPolicy;->resolveUid(II)I+]Landroid/service/voice/VoiceInteractionManagerInternal$HotwordDetectionServiceIdentity;Landroid/service/voice/VoiceInteractionManagerInternal$HotwordDetectionServiceIdentity;]Landroid/service/voice/VoiceInteractionManagerInternal;Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$LocalService;
 HSPLcom/android/server/policy/AppOpsPolicy;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;IZZLjava/lang/String;ZIILcom/android/internal/util/function/DodecFunction;)Landroid/app/SyncNotedAppOp;+]Lcom/android/internal/util/function/DodecFunction;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda7;]Lcom/android/server/policy/AppOpsPolicy;Lcom/android/server/policy/AppOpsPolicy;
 HSPLcom/android/server/policy/PermissionPolicyService$$ExternalSyntheticLambda4;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLcom/android/server/policy/PermissionPolicyService$Internal;->isInitialized(I)Z
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser$OpToChange;-><init>(Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;ILjava/lang/String;I)V
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;-><init>(Lcom/android/server/policy/PermissionPolicyService;Landroid/content/Context;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addAppOps(Landroid/content/pm/PackageInfo;Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;)V+]Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
@@ -8241,7 +6142,6 @@
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addPackage(Ljava/lang/String;)V+]Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addPermissionAppOp(Landroid/content/pm/PackageInfo;Lcom/android/server/pm/pkg/AndroidPackage;Landroid/content/pm/PermissionInfo;)V+]Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->setUidMode(IIILjava/lang/String;)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/app/AppOpsManagerInternal;Lcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;
-HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->setUidModeAllowed(IILjava/lang/String;)V
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->shouldGrantAppOp(Landroid/content/pm/PackageInfo;Lcom/android/server/pm/pkg/AndroidPackage;Landroid/content/pm/PermissionInfo;)Z+]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/policy/SoftRestrictedPermissionPolicy;Lcom/android/server/policy/SoftRestrictedPermissionPolicy$3;,Lcom/android/server/policy/SoftRestrictedPermissionPolicy$2;
 HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->syncPackages()V+]Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;
 HSPLcom/android/server/policy/PermissionPolicyService;->-$$Nest$smgetSwitchOp(Ljava/lang/String;)I
@@ -8250,20 +6150,20 @@
 HSPLcom/android/server/policy/PermissionPolicyService;->isStarted(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/policy/PermissionPolicyService;->synchronizeUidPermissionsAndAppOps(I)V+]Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/SystemService;Lcom/android/server/policy/PermissionPolicyService;]Ljava/util/List;Ljava/util/Collections$SingletonList;,Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/policy/PermissionPolicyService;->synchronizeUidPermissionsAndAppOpsAsync(I)V
-HPLcom/android/server/policy/PhoneWindowManager;->inKeyguardRestrictedKeyInputMode()Z
+HPLcom/android/server/policy/PhoneWindowManager;->inKeyguardRestrictedKeyInputMode()Z+]Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;
 HPLcom/android/server/policy/PhoneWindowManager;->interceptKeyBeforeQueueing(Landroid/view/KeyEvent;I)I
 HSPLcom/android/server/policy/PhoneWindowManager;->isKeyguardHostWindow(Landroid/view/WindowManager$LayoutParams;)Z
 HSPLcom/android/server/policy/PhoneWindowManager;->isKeyguardLocked()Z+]Lcom/android/server/policy/PhoneWindowManager;Lcom/android/server/policy/PhoneWindowManager;
-HSPLcom/android/server/policy/PhoneWindowManager;->isKeyguardOccluded()Z
+HSPLcom/android/server/policy/PhoneWindowManager;->isKeyguardOccluded()Z+]Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;
 HSPLcom/android/server/policy/PhoneWindowManager;->isKeyguardSecure(I)Z+]Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;
 HSPLcom/android/server/policy/PhoneWindowManager;->isKeyguardShowing()Z+]Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;
 HSPLcom/android/server/policy/PhoneWindowManager;->isKeyguardShowingAndNotOccluded()Z+]Lcom/android/server/policy/PhoneWindowManager;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;
-HPLcom/android/server/policy/PhoneWindowManager;->isScreenOn()Z
+HPLcom/android/server/policy/PhoneWindowManager;->isScreenOn()Z+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
 HSPLcom/android/server/policy/PhoneWindowManager;->keyguardOn()Z+]Lcom/android/server/policy/PhoneWindowManager;Lcom/android/server/policy/PhoneWindowManager;
-HPLcom/android/server/policy/PhoneWindowManager;->okToAnimate(Z)Z
-HSPLcom/android/server/policy/PhoneWindowManager;->setAllowLockscreenWhenOn(IZ)V
+HPLcom/android/server/policy/PhoneWindowManager;->okToAnimate(Z)Z+]Lcom/android/server/policy/PhoneWindowManager;Lcom/android/server/policy/PhoneWindowManager;
+HSPLcom/android/server/policy/PhoneWindowManager;->setAllowLockscreenWhenOn(IZ)V+]Ljava/util/HashSet;Ljava/util/HashSet;
 HSPLcom/android/server/policy/PhoneWindowManager;->updateLockScreenTimeout()V+]Landroid/os/Handler;Lcom/android/server/policy/PhoneWindowManager$PolicyHandler;]Ljava/util/HashSet;Ljava/util/HashSet;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;
-HPLcom/android/server/policy/PhoneWindowManager;->userActivity(II)V+]Landroid/os/Handler;Lcom/android/server/policy/PhoneWindowManager$PolicyHandler;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
+HSPLcom/android/server/policy/PhoneWindowManager;->userActivity(II)V+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Landroid/os/Handler;Lcom/android/server/policy/PhoneWindowManager$PolicyHandler;
 HSPLcom/android/server/policy/SoftRestrictedPermissionPolicy$2;-><init>(ZIZZZZZZ)V
 HSPLcom/android/server/policy/SoftRestrictedPermissionPolicy;->forPermission(Landroid/content/Context;Landroid/content/pm/ApplicationInfo;Lcom/android/server/pm/pkg/AndroidPackage;Landroid/os/UserHandle;Ljava/lang/String;)Lcom/android/server/policy/SoftRestrictedPermissionPolicy;
 HSPLcom/android/server/policy/SoftRestrictedPermissionPolicy;->getMinimumTargetSDK(Landroid/content/Context;Landroid/content/pm/ApplicationInfo;Landroid/os/UserHandle;)I+]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
@@ -8277,60 +6177,34 @@
 HSPLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->isOccluded()Z
 HSPLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->isSecure(I)Z+]Lcom/android/server/policy/keyguard/KeyguardServiceWrapper;Lcom/android/server/policy/keyguard/KeyguardServiceWrapper;
 HSPLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->isShowing()Z+]Lcom/android/server/policy/keyguard/KeyguardServiceWrapper;Lcom/android/server/policy/keyguard/KeyguardServiceWrapper;
-HPLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isInputRestricted()Z
-HPLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isSecure(I)Z
+HPLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isInputRestricted()Z+]Lcom/android/server/policy/keyguard/KeyguardStateMonitor;Lcom/android/server/policy/keyguard/KeyguardStateMonitor;
+HPLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isSecure(I)Z+]Lcom/android/server/policy/keyguard/KeyguardStateMonitor;Lcom/android/server/policy/keyguard/KeyguardStateMonitor;
 HPLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isShowing()Z+]Lcom/android/server/policy/keyguard/KeyguardStateMonitor;Lcom/android/server/policy/keyguard/KeyguardStateMonitor;
 HPLcom/android/server/policy/keyguard/KeyguardStateMonitor;->isInputRestricted()Z
-HPLcom/android/server/policy/keyguard/KeyguardStateMonitor;->isSecure(I)Z
+HPLcom/android/server/policy/keyguard/KeyguardStateMonitor;->isSecure(I)Z+]Lcom/android/internal/widget/LockPatternUtils;Lcom/android/internal/widget/LockPatternUtils;
 HPLcom/android/server/policy/keyguard/KeyguardStateMonitor;->isShowing()Z
 HSPLcom/android/server/policy/role/RoleServicePlatformHelperImpl$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/policy/role/RoleServicePlatformHelperImpl;->lambda$computePackageStateHash$0(Ljava/io/DataOutputStream;Landroid/content/pm/PackageManagerInternal;ILcom/android/server/pm/pkg/AndroidPackage;)V+]Ljava/io/DataOutputStream;Ljava/io/DataOutputStream;]Landroid/content/pm/Signature;Landroid/content/pm/Signature;]Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/power/AmbientDisplaySuppressionController;-><init>(Lcom/android/server/power/AmbientDisplaySuppressionController$AmbientDisplaySuppressionChangedCallback;)V
-HSPLcom/android/server/power/AttentionDetector;-><init>(Ljava/lang/Runnable;Ljava/lang/Object;)V
 HSPLcom/android/server/power/AttentionDetector;->onUserActivity(JI)I
-HSPLcom/android/server/power/AttentionDetector;->updateUserActivity(JJ)J+]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;]Lcom/android/server/wm/WindowManagerInternal;Lcom/android/server/wm/WindowManagerService$LocalService;]Lcom/android/server/power/AttentionDetector;Lcom/android/server/power/AttentionDetector;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/attention/AttentionManagerInternal;Lcom/android/server/attention/AttentionManagerService$LocalService;
-HSPLcom/android/server/power/FaceDownDetector$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/power/FaceDownDetector;)V
-HPLcom/android/server/power/FaceDownDetector$$ExternalSyntheticLambda1;->run()V
-HSPLcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;->-$$Nest$fgetmMovingAverage(Lcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;)F
-HSPLcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;-><init>(Lcom/android/server/power/FaceDownDetector;F)V
-HSPLcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;-><init>(Lcom/android/server/power/FaceDownDetector;FF)V
-HSPLcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;->updateMovingAverage(F)V
-HSPLcom/android/server/power/FaceDownDetector$ScreenStateReceiver;-><init>(Lcom/android/server/power/FaceDownDetector;)V
-HSPLcom/android/server/power/FaceDownDetector$ScreenStateReceiver;-><init>(Lcom/android/server/power/FaceDownDetector;Lcom/android/server/power/FaceDownDetector$ScreenStateReceiver-IA;)V
-HSPLcom/android/server/power/FaceDownDetector;-><init>(Ljava/util/function/Consumer;)V
-HSPLcom/android/server/power/FaceDownDetector;->onSensorChanged(Landroid/hardware/SensorEvent;)V+]Ljava/time/Duration;Ljava/time/Duration;]Landroid/hardware/Sensor;Landroid/hardware/Sensor;]Lcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;Lcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;]Lcom/android/server/power/FaceDownDetector;Lcom/android/server/power/FaceDownDetector;
-HPLcom/android/server/power/FaceDownDetector;->userActivity(I)V+]Landroid/os/Handler;Landroid/os/Handler;
-HSPLcom/android/server/power/InattentiveSleepWarningController;-><init>()V
+HSPLcom/android/server/power/AttentionDetector;->updateUserActivity(JJ)J+]Landroid/attention/AttentionManagerInternal;Lcom/android/server/attention/AttentionManagerService$LocalService;]Lcom/android/server/wm/WindowManagerInternal;Lcom/android/server/wm/WindowManagerService$LocalService;]Lcom/android/server/power/AttentionDetector;Lcom/android/server/power/AttentionDetector;]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HPLcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;->-$$Nest$fgetmMovingAverage(Lcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;)F
+HPLcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;->updateMovingAverage(F)V
+HPLcom/android/server/power/FaceDownDetector;->onSensorChanged(Landroid/hardware/SensorEvent;)V+]Ljava/time/Duration;Ljava/time/Duration;]Landroid/hardware/Sensor;Landroid/hardware/Sensor;]Lcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;Lcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;]Lcom/android/server/power/FaceDownDetector;Lcom/android/server/power/FaceDownDetector;
+HSPLcom/android/server/power/FaceDownDetector;->userActivity(I)V
 HSPLcom/android/server/power/InattentiveSleepWarningController;->isShown()Z
-HSPLcom/android/server/power/LowPowerStandbyController$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/power/LowPowerStandbyController;)V
-HSPLcom/android/server/power/LowPowerStandbyController$$ExternalSyntheticLambda2;-><init>()V
-HSPLcom/android/server/power/LowPowerStandbyController$1;-><init>(Lcom/android/server/power/LowPowerStandbyController;)V
-HSPLcom/android/server/power/LowPowerStandbyController$2;-><init>(Lcom/android/server/power/LowPowerStandbyController;)V
-HSPLcom/android/server/power/LowPowerStandbyController$3;-><init>(Lcom/android/server/power/LowPowerStandbyController;)V
-HSPLcom/android/server/power/LowPowerStandbyController$DeviceConfigWrapper;-><init>()V
-HSPLcom/android/server/power/LowPowerStandbyController$LocalService;-><init>(Lcom/android/server/power/LowPowerStandbyController;)V
-HSPLcom/android/server/power/LowPowerStandbyController$LocalService;-><init>(Lcom/android/server/power/LowPowerStandbyController;Lcom/android/server/power/LowPowerStandbyController$LocalService-IA;)V
-HSPLcom/android/server/power/LowPowerStandbyController$LowPowerStandbyHandler;-><init>(Lcom/android/server/power/LowPowerStandbyController;Landroid/os/Looper;)V
-HSPLcom/android/server/power/LowPowerStandbyController$PhoneCallServiceTracker;-><init>(Lcom/android/server/power/LowPowerStandbyController;)V
-HSPLcom/android/server/power/LowPowerStandbyController$RealClock;-><init>()V
-HSPLcom/android/server/power/LowPowerStandbyController$RealClock;-><init>(Lcom/android/server/power/LowPowerStandbyController$RealClock-IA;)V
-HSPLcom/android/server/power/LowPowerStandbyController$SettingsObserver;-><init>(Lcom/android/server/power/LowPowerStandbyController;Landroid/os/Handler;)V
-HSPLcom/android/server/power/LowPowerStandbyController$TempAllowlistChangeListener;-><init>(Lcom/android/server/power/LowPowerStandbyController;)V
-HSPLcom/android/server/power/LowPowerStandbyController;-><clinit>()V
-HSPLcom/android/server/power/LowPowerStandbyController;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
-HSPLcom/android/server/power/LowPowerStandbyController;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/power/LowPowerStandbyController$Clock;Lcom/android/server/power/LowPowerStandbyController$DeviceConfigWrapper;Ljava/util/function/Supplier;Ljava/io/File;)V
-HSPLcom/android/server/power/LowPowerStandbyControllerInternal;-><init>()V
 HSPLcom/android/server/power/Notifier$NotifierHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/os/Handler;Lcom/android/server/power/Notifier$NotifierHandler;
-HSPLcom/android/server/power/Notifier;->-$$Nest$mscreenPolicyChanging(Lcom/android/server/power/Notifier;II)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;
+HSPLcom/android/server/power/Notifier;->-$$Nest$mscreenPolicyChanging(Lcom/android/server/power/Notifier;II)V
 HSPLcom/android/server/power/Notifier;->getBatteryStatsWakeLockMonitorType(I)I
 HSPLcom/android/server/power/Notifier;->notifyWakeLockListener(Landroid/os/IWakeLockCallback;Ljava/lang/String;Z)V
+HPLcom/android/server/power/Notifier;->onGlobalWakefulnessChangeStarted(IIJ)V
 HSPLcom/android/server/power/Notifier;->onScreenPolicyUpdate(II)V+]Landroid/os/Handler;Lcom/android/server/power/Notifier$NotifierHandler;]Landroid/os/Message;Landroid/os/Message;
-HSPLcom/android/server/power/Notifier;->onUserActivity(III)V+]Landroid/os/Handler;Lcom/android/server/power/Notifier$NotifierHandler;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;
+HSPLcom/android/server/power/Notifier;->onUserActivity(III)V+]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Landroid/os/Handler;Lcom/android/server/power/Notifier$NotifierHandler;]Landroid/os/Message;Landroid/os/Message;
 HSPLcom/android/server/power/Notifier;->onWakeLockAcquired(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/power/WakeLockLog;Lcom/android/server/power/WakeLockLog;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
-HPLcom/android/server/power/Notifier;->onWakeLockChanging(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;
+HSPLcom/android/server/power/Notifier;->onWakeLockChanging(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;
 HSPLcom/android/server/power/Notifier;->onWakeLockReleased(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/power/WakeLockLog;Lcom/android/server/power/WakeLockLog;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
 HSPLcom/android/server/power/Notifier;->screenPolicyChanging(II)V
-HPLcom/android/server/power/Notifier;->sendUserActivity(II)V+]Lcom/android/server/input/InputManagerInternal;Lcom/android/server/input/InputManagerService$LocalService;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/power/ScreenUndimDetector;Lcom/android/server/power/ScreenUndimDetector;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/telephony/TelephonyManager;Landroid/telephony/TelephonyManager;]Lcom/android/server/power/FaceDownDetector;Lcom/android/server/power/FaceDownDetector;
+HSPLcom/android/server/power/Notifier;->sendUserActivity(II)V+]Lcom/android/server/input/InputManagerInternal;Lcom/android/server/input/InputManagerService$LocalService;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/power/ScreenUndimDetector;Lcom/android/server/power/ScreenUndimDetector;]Landroid/telephony/TelephonyManager;Landroid/telephony/TelephonyManager;]Lcom/android/server/power/FaceDownDetector;Lcom/android/server/power/FaceDownDetector;]Landroid/content/Context;Landroid/app/ContextImpl;
+HPLcom/android/server/power/PowerGroup;->dozeLocked(JII)Z
 HSPLcom/android/server/power/PowerGroup;->getDesiredScreenPolicyLocked(ZZZZZ)I+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;
 HSPLcom/android/server/power/PowerGroup;->getGroupId()I
 HSPLcom/android/server/power/PowerGroup;->getLastUserActivityTimeLocked()J
@@ -8346,115 +6220,74 @@
 HSPLcom/android/server/power/PowerGroup;->needSuspendBlockerLocked(ZZ)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;
 HSPLcom/android/server/power/PowerGroup;->setReadyLocked(Z)Z
 HSPLcom/android/server/power/PowerGroup;->setUserActivitySummaryLocked(I)V
+HSPLcom/android/server/power/PowerGroup;->setWakeLockSummaryLocked(I)V
 HSPLcom/android/server/power/PowerGroup;->supportsSandmanLocked()Z
 HSPLcom/android/server/power/PowerGroup;->updateLocked(FZZIFZLandroid/os/PowerSaveState;ZZZZZZ)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;
 HSPLcom/android/server/power/PowerGroup;->wakeUpLocked(JILjava/lang/String;ILjava/lang/String;ILcom/android/internal/util/LatencyTracker;)V
-HSPLcom/android/server/power/PowerManagerService$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/power/PowerManagerService;)V
-HSPLcom/android/server/power/PowerManagerService$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/power/PowerManagerService;)V
-HSPLcom/android/server/power/PowerManagerService$1;-><init>(Lcom/android/server/power/PowerManagerService;)V
-HSPLcom/android/server/power/PowerManagerService$1;->acquireSuspendBlocker(Ljava/lang/String;)V
+HSPLcom/android/server/power/PowerManagerService$1;->acquireSuspendBlocker(Ljava/lang/String;)V+]Lcom/android/server/power/SuspendBlocker;Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;
 HSPLcom/android/server/power/PowerManagerService$1;->onStateChanged()V
-HSPLcom/android/server/power/PowerManagerService$4;-><init>(Lcom/android/server/power/PowerManagerService;)V
-HSPLcom/android/server/power/PowerManagerService$BinderService;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/content/Context;)V
+HSPLcom/android/server/power/PowerManagerService$1;->releaseSuspendBlocker(Ljava/lang/String;)V+]Lcom/android/server/power/SuspendBlocker;Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;
 HSPLcom/android/server/power/PowerManagerService$BinderService;->acquireWakeLock(Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;ILandroid/os/IWakeLockCallback;)V+]Landroid/os/WorkSource;Landroid/os/WorkSource;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/power/PowerManagerService$BinderService;->isDeviceIdleMode()Z+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService$BinderService;->isInteractive()Z
-HPLcom/android/server/power/PowerManagerService$BinderService;->isLightDeviceIdleMode()Z+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
-HPLcom/android/server/power/PowerManagerService$BinderService;->isLowPowerStandbyEnabled()Z
-HSPLcom/android/server/power/PowerManagerService$BinderService;->isPowerSaveMode()Z
+HSPLcom/android/server/power/PowerManagerService$BinderService;->isLightDeviceIdleMode()Z+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
+HPLcom/android/server/power/PowerManagerService$BinderService;->isLowPowerStandbyEnabled()Z+]Lcom/android/server/power/LowPowerStandbyController;Lcom/android/server/power/LowPowerStandbyController;
+HSPLcom/android/server/power/PowerManagerService$BinderService;->isPowerSaveMode()Z+]Lcom/android/server/power/batterysaver/BatterySaverStateMachine;Lcom/android/server/power/batterysaver/BatterySaverStateMachine;]Lcom/android/server/power/batterysaver/BatterySaverController;Lcom/android/server/power/batterysaver/BatterySaverController;
 HSPLcom/android/server/power/PowerManagerService$BinderService;->releaseWakeLock(Landroid/os/IBinder;I)V+]Landroid/content/Context;Landroid/app/ContextImpl;
 HPLcom/android/server/power/PowerManagerService$BinderService;->updateWakeLockUids(Landroid/os/IBinder;[I)V
-HPLcom/android/server/power/PowerManagerService$BinderService;->updateWakeLockWorkSource(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;)V+]Landroid/os/WorkSource;Landroid/os/WorkSource;]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/power/PowerManagerService$BinderService;->updateWakeLockWorkSource(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;)V+]Landroid/os/WorkSource;Landroid/os/WorkSource;]Landroid/content/Context;Landroid/app/ContextImpl;
 HSPLcom/android/server/power/PowerManagerService$BinderService;->userActivity(IJII)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;
-HSPLcom/android/server/power/PowerManagerService$Constants;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/Handler;)V
-HSPLcom/android/server/power/PowerManagerService$Injector$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/power/PowerManagerService$Injector$1;-><init>(Lcom/android/server/power/PowerManagerService$Injector;)V
-HSPLcom/android/server/power/PowerManagerService$Injector$1;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/power/PowerManagerService$Injector$2;-><init>(Lcom/android/server/power/PowerManagerService$Injector;)V
 HSPLcom/android/server/power/PowerManagerService$Injector$2;->uptimeMillis()J
-HSPLcom/android/server/power/PowerManagerService$Injector$3;-><init>(Lcom/android/server/power/PowerManagerService$Injector;)V
-HSPLcom/android/server/power/PowerManagerService$Injector;-><init>()V
-HSPLcom/android/server/power/PowerManagerService$Injector;->createAmbientDisplayConfiguration(Landroid/content/Context;)Landroid/hardware/display/AmbientDisplayConfiguration;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createAmbientDisplaySuppressionController(Lcom/android/server/power/AmbientDisplaySuppressionController$AmbientDisplaySuppressionChangedCallback;)Lcom/android/server/power/AmbientDisplaySuppressionController;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createBatterySaverStateMachine(Ljava/lang/Object;Landroid/content/Context;)Lcom/android/server/power/batterysaver/BatterySaverStateMachine;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createClock()Lcom/android/server/power/PowerManagerService$Clock;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createDeviceConfigParameterProvider()Lcom/android/server/display/feature/DeviceConfigParameterProvider;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createFoldGracePeriodProvider()Lcom/android/internal/foldables/FoldGracePeriodProvider;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createHandler(Landroid/os/Looper;Landroid/os/Handler$Callback;)Landroid/os/Handler;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createInattentiveSleepWarningController()Lcom/android/server/power/InattentiveSleepWarningController;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createLowPowerStandbyController(Landroid/content/Context;Landroid/os/Looper;)Lcom/android/server/power/LowPowerStandbyController;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createNativeWrapper()Lcom/android/server/power/PowerManagerService$NativeWrapper;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createPermissionCheckerWrapper()Lcom/android/server/power/PowerManagerService$PermissionCheckerWrapper;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createPowerPropertiesWrapper()Lcom/android/server/power/PowerManagerService$PowerPropertiesWrapper;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createSuspendBlocker(Lcom/android/server/power/PowerManagerService;Ljava/lang/String;)Lcom/android/server/power/SuspendBlocker;
-HSPLcom/android/server/power/PowerManagerService$Injector;->createSystemPropertiesWrapper()Lcom/android/server/power/SystemPropertiesWrapper;
-HSPLcom/android/server/power/PowerManagerService$Injector;->getFlags()Lcom/android/server/power/feature/PowerManagerFlags;
-HSPLcom/android/server/power/PowerManagerService$Injector;->invalidateIsInteractiveCaches()V
-HSPLcom/android/server/power/PowerManagerService$LocalService;-><init>(Lcom/android/server/power/PowerManagerService;)V
 HSPLcom/android/server/power/PowerManagerService$LocalService;->finishUidChanges()V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
-HSPLcom/android/server/power/PowerManagerService$LocalService;->getLowPowerState(I)Landroid/os/PowerSaveState;
-HSPLcom/android/server/power/PowerManagerService$LocalService;->registerLowPowerModeObserver(Landroid/os/PowerManagerInternal$LowPowerModeListener;)V
 HSPLcom/android/server/power/PowerManagerService$LocalService;->setScreenBrightnessOverrideFromWindowManager(F)V
 HSPLcom/android/server/power/PowerManagerService$LocalService;->setUserActivityTimeoutOverrideFromWindowManager(J)V
 HSPLcom/android/server/power/PowerManagerService$LocalService;->startUidChanges()V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService$LocalService;->uidActive(I)V
+HSPLcom/android/server/power/PowerManagerService$LocalService;->uidIdle(I)V
 HSPLcom/android/server/power/PowerManagerService$LocalService;->updateUidProcState(II)V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
-HSPLcom/android/server/power/PowerManagerService$NativeWrapper;-><init>()V
 HSPLcom/android/server/power/PowerManagerService$NativeWrapper;->nativeAcquireSuspendBlocker(Ljava/lang/String;)V
-HSPLcom/android/server/power/PowerManagerService$NativeWrapper;->nativeInit(Lcom/android/server/power/PowerManagerService;)V
 HSPLcom/android/server/power/PowerManagerService$NativeWrapper;->nativeReleaseSuspendBlocker(Ljava/lang/String;)V
-HSPLcom/android/server/power/PowerManagerService$NativeWrapper;->nativeSetAutoSuspend(Z)V
 HSPLcom/android/server/power/PowerManagerService$NativeWrapper;->nativeSetPowerMode(IZ)Z
-HSPLcom/android/server/power/PowerManagerService$PowerGroupWakefulnessChangeListener;-><init>(Lcom/android/server/power/PowerManagerService;)V
-HSPLcom/android/server/power/PowerManagerService$PowerGroupWakefulnessChangeListener;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$PowerGroupWakefulnessChangeListener-IA;)V
-HSPLcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback;-><init>(Lcom/android/server/power/PowerManagerService;)V
-HSPLcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback-IA;)V
 HSPLcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback;->handleMessage(Landroid/os/Message;)Z+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
-HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;-><init>(Lcom/android/server/power/PowerManagerService;Ljava/lang/String;)V
 HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->acquire()V
 HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->acquire(Ljava/lang/String;)V+]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper;]Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;
-HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->recordReferenceLocked(Ljava/lang/String;)V
+HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->recordReferenceLocked(Ljava/lang/String;)V+]Landroid/util/LongArray;Landroid/util/LongArray;
 HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->release(Ljava/lang/String;)V+]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper;]Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;
 HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->removeReferenceLocked(Ljava/lang/String;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/LongArray;Landroid/util/LongArray;
 HSPLcom/android/server/power/PowerManagerService$WakeLock;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;IILcom/android/server/power/PowerManagerService$UidState;Landroid/os/IWakeLockCallback;)V+]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;
 HSPLcom/android/server/power/PowerManagerService$WakeLock;->getPowerGroupId()Ljava/lang/Integer;+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;
-HPLcom/android/server/power/PowerManagerService$WakeLock;->hasSameProperties(ILjava/lang/String;Landroid/os/WorkSource;IILandroid/os/IWakeLockCallback;)Z
-HPLcom/android/server/power/PowerManagerService$WakeLock;->hasSameWorkSource(Landroid/os/WorkSource;)Z
-HSPLcom/android/server/power/PowerManagerService$WakeLock;->linkToDeath()V
+HSPLcom/android/server/power/PowerManagerService$WakeLock;->hasSameProperties(ILjava/lang/String;Landroid/os/WorkSource;IILandroid/os/IWakeLockCallback;)Z
+HSPLcom/android/server/power/PowerManagerService$WakeLock;->hasSameWorkSource(Landroid/os/WorkSource;)Z
+HSPLcom/android/server/power/PowerManagerService$WakeLock;->linkToDeath()V+]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/os/Binder;
 HSPLcom/android/server/power/PowerManagerService$WakeLock;->setDisabled(Z)Z
 HSPLcom/android/server/power/PowerManagerService$WakeLock;->unlinkToDeath()V+]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/os/Binder;
-HPLcom/android/server/power/PowerManagerService$WakeLock;->updateWorkSource(Landroid/os/WorkSource;)V
+HSPLcom/android/server/power/PowerManagerService$WakeLock;->updateWorkSource(Landroid/os/WorkSource;)V
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$fgetmBatterySaverStateMachine(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/batterysaver/BatterySaverStateMachine;
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$fgetmBatterySaverSupported(Lcom/android/server/power/PowerManagerService;)Z
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$fgetmContext(Lcom/android/server/power/PowerManagerService;)Landroid/content/Context;
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$fgetmNativeWrapper(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/PowerManagerService$NativeWrapper;
-HSPLcom/android/server/power/PowerManagerService;->-$$Nest$fgetmSuspendBlockers(Lcom/android/server/power/PowerManagerService;)Ljava/util/ArrayList;
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$fgetmSystemReady(Lcom/android/server/power/PowerManagerService;)Z
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$macquireWakeLockInternal(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;IILandroid/os/IWakeLockCallback;)V
-HSPLcom/android/server/power/PowerManagerService;->-$$Nest$mhandleSandman(Lcom/android/server/power/PowerManagerService;I)V
+HSPLcom/android/server/power/PowerManagerService;->-$$Nest$mhandleSandman(Lcom/android/server/power/PowerManagerService;I)V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$misGloballyInteractiveInternal(Lcom/android/server/power/PowerManagerService;)Z
-HSPLcom/android/server/power/PowerManagerService;->-$$Nest$mnativeInit(Lcom/android/server/power/PowerManagerService;)V
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$mreleaseWakeLockInternal(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;I)V
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$msetScreenBrightnessOverrideFromWindowManagerInternal(Lcom/android/server/power/PowerManagerService;F)V
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$msetUserActivityTimeoutOverrideFromWindowManagerInternal(Lcom/android/server/power/PowerManagerService;J)V
-HPLcom/android/server/power/PowerManagerService;->-$$Nest$mupdateWakeLockWorkSourceInternal(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V
+HSPLcom/android/server/power/PowerManagerService;->-$$Nest$mupdateWakeLockWorkSourceInternal(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$smcopyWorkSource(Landroid/os/WorkSource;)Landroid/os/WorkSource;
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$smnativeAcquireSuspendBlocker(Ljava/lang/String;)V
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$smnativeReleaseSuspendBlocker(Ljava/lang/String;)V
-HSPLcom/android/server/power/PowerManagerService;->-$$Nest$smnativeSetAutoSuspend(Z)V
 HSPLcom/android/server/power/PowerManagerService;->-$$Nest$smnativeSetPowerMode(IZ)Z
-HSPLcom/android/server/power/PowerManagerService;-><clinit>()V
-HSPLcom/android/server/power/PowerManagerService;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/power/PowerManagerService;-><init>(Landroid/content/Context;Lcom/android/server/power/PowerManagerService$Injector;)V
 HSPLcom/android/server/power/PowerManagerService;->acquireWakeLockInternal(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;IILandroid/os/IWakeLockCallback;)V+]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;
 HSPLcom/android/server/power/PowerManagerService;->adjustWakeLockSummary(II)I
-HSPLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnAcquireLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Landroid/os/WorkSource;Landroid/os/WorkSource;
-HSPLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnReleaseLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+HSPLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnAcquireLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;
+HSPLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnReleaseLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;
 HSPLcom/android/server/power/PowerManagerService;->areAllPowerGroupsReadyLocked()Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/power/PowerManagerService;->checkForLongWakeLocks()V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/power/PowerManagerService;->checkForLongWakeLocks()V+]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->copyWorkSource(Landroid/os/WorkSource;)Landroid/os/WorkSource;
 HSPLcom/android/server/power/PowerManagerService;->doesIdleStateBlockWakeLocksLocked()Z
-HSPLcom/android/server/power/PowerManagerService;->enqueueNotifyLongMsgLocked(J)V
+HSPLcom/android/server/power/PowerManagerService;->enqueueNotifyLongMsgLocked(J)V+]Landroid/os/Handler;Landroid/os/Handler;
 HSPLcom/android/server/power/PowerManagerService;->findWakeLockIndexLocked(Landroid/os/IBinder;)I+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/power/PowerManagerService;->finishUidChangesInternal()V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->finishWakefulnessChangeIfNeededLocked()V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
@@ -8467,45 +6300,42 @@
 HSPLcom/android/server/power/PowerManagerService;->getSleepTimeoutLocked(J)J
 HSPLcom/android/server/power/PowerManagerService;->getWakeLockSummaryFlags(Lcom/android/server/power/PowerManagerService$WakeLock;)I
 HSPLcom/android/server/power/PowerManagerService;->handleSandman(I)V+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Landroid/service/dreams/DreamManagerInternal;Lcom/android/server/dreams/DreamManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;
-HSPLcom/android/server/power/PowerManagerService;->isAttentiveTimeoutExpired(Lcom/android/server/power/PowerGroup;J)Z
+HSPLcom/android/server/power/PowerManagerService;->isAttentiveTimeoutExpired(Lcom/android/server/power/PowerGroup;J)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;
 HPLcom/android/server/power/PowerManagerService;->isBeingKeptAwakeLocked(Lcom/android/server/power/PowerGroup;)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;
 HSPLcom/android/server/power/PowerManagerService;->isDeviceIdleModeInternal()Z
 HSPLcom/android/server/power/PowerManagerService;->isGloballyInteractiveInternal()Z
-HSPLcom/android/server/power/PowerManagerService;->isItBedTimeYetLocked(Lcom/android/server/power/PowerGroup;)Z
-HPLcom/android/server/power/PowerManagerService;->isLightDeviceIdleModeInternal()Z
+HSPLcom/android/server/power/PowerManagerService;->isItBedTimeYetLocked(Lcom/android/server/power/PowerGroup;)Z+]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;
+HSPLcom/android/server/power/PowerManagerService;->isLightDeviceIdleModeInternal()Z
 HSPLcom/android/server/power/PowerManagerService;->isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()Z
 HSPLcom/android/server/power/PowerManagerService;->maybeHideInattentiveSleepWarningLocked(JJ)Z+]Lcom/android/server/power/InattentiveSleepWarningController;Lcom/android/server/power/InattentiveSleepWarningController;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
-HSPLcom/android/server/power/PowerManagerService;->maybeUpdateForegroundProfileLastActivityLocked(J)V
+HSPLcom/android/server/power/PowerManagerService;->maybeUpdateForegroundProfileLastActivityLocked(J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/power/PowerManagerService;->needSuspendBlockerLocked()Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->notifyWakeLockAcquiredLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
-HPLcom/android/server/power/PowerManagerService;->notifyWakeLockChangingLocked(Lcom/android/server/power/PowerManagerService$WakeLock;ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
+HSPLcom/android/server/power/PowerManagerService;->notifyWakeLockChangingLocked(Lcom/android/server/power/PowerManagerService$WakeLock;ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->notifyWakeLockLongFinishedLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;
 HSPLcom/android/server/power/PowerManagerService;->notifyWakeLockReleasedLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
-HSPLcom/android/server/power/PowerManagerService;->onBootPhase(I)V
-HSPLcom/android/server/power/PowerManagerService;->onStart()V
 HSPLcom/android/server/power/PowerManagerService;->releaseWakeLockInternal(Landroid/os/IBinder;I)V+]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/power/PowerManagerService;->removeWakeLockLocked(Lcom/android/server/power/PowerManagerService$WakeLock;I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/power/PowerManagerService;->restartNofifyLongTimerLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;
 HSPLcom/android/server/power/PowerManagerService;->scheduleSandmanLocked()V+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;
-HSPLcom/android/server/power/PowerManagerService;->scheduleUserInactivityTimeout(J)V
+HSPLcom/android/server/power/PowerManagerService;->scheduleUserInactivityTimeout(J)V+]Landroid/os/Handler;Landroid/os/Handler;
 HSPLcom/android/server/power/PowerManagerService;->setDeviceIdleTempWhitelistInternal([I)V
 HSPLcom/android/server/power/PowerManagerService;->setHalAutoSuspendModeLocked(Z)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper;
 HSPLcom/android/server/power/PowerManagerService;->setHalInteractiveModeLocked(Z)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper;
-HSPLcom/android/server/power/PowerManagerService;->setPowerBoostInternal(II)V+]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper;
 HSPLcom/android/server/power/PowerManagerService;->setScreenBrightnessOverrideFromWindowManagerInternal(F)V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->setUserActivityTimeoutOverrideFromWindowManagerInternal(J)V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->setWakeLockDisabledStateLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)Z+]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->shouldBoostScreenBrightness()Z
-HSPLcom/android/server/power/PowerManagerService;->shouldUseProximitySensorLocked()Z
+HSPLcom/android/server/power/PowerManagerService;->shouldUseProximitySensorLocked()Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/power/PowerManagerService;->startUidChangesInternal()V
-HSPLcom/android/server/power/PowerManagerService;->uidActiveInternal(I)V
-HSPLcom/android/server/power/PowerManagerService;->uidGoneInternal(I)V
-HSPLcom/android/server/power/PowerManagerService;->uidIdleInternal(I)V
+HSPLcom/android/server/power/PowerManagerService;->uidActiveInternal(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/power/PowerManagerService;->uidGoneInternal(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/power/PowerManagerService;->uidIdleInternal(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/power/PowerManagerService;->updateAttentiveStateLocked(JI)V+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->updateDreamLocked(IZ)V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HPLcom/android/server/power/PowerManagerService;->updateGlobalWakefulnessLocked(JIIILjava/lang/String;Ljava/lang/String;)V
 HSPLcom/android/server/power/PowerManagerService;->updateIsPoweredLocked(I)V+]Lcom/android/server/power/batterysaver/BatterySaverStateMachine;Lcom/android/server/power/batterysaver/BatterySaverStateMachine;]Landroid/os/BatteryManagerInternal;Lcom/android/server/BatteryService$LocalService;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/power/WirelessChargerDetector;Lcom/android/server/power/WirelessChargerDetector;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;
-HSPLcom/android/server/power/PowerManagerService;->updatePowerGroupsLocked(I)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/internal/util/LatencyTracker;Lcom/android/internal/util/LatencyTracker;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/batterysaver/BatterySaverStateMachine;Lcom/android/server/power/batterysaver/BatterySaverStateMachine;]Lcom/android/server/power/batterysaver/BatterySaverPolicy;Lcom/android/server/power/batterysaver/BatterySaverPolicy;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;
+HSPLcom/android/server/power/PowerManagerService;->updatePowerGroupsLocked(I)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/internal/util/LatencyTracker;Lcom/android/internal/util/LatencyTracker;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/batterysaver/BatterySaverStateMachine;Lcom/android/server/power/batterysaver/BatterySaverStateMachine;]Lcom/android/server/power/batterysaver/BatterySaverPolicy;Lcom/android/server/power/batterysaver/BatterySaverPolicy;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/power/PowerManagerService;->updatePowerStateLocked()V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;
 HSPLcom/android/server/power/PowerManagerService;->updateProfilesLocked(J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/power/PowerManagerService;->updateScreenBrightnessBoostLocked(I)V
@@ -8513,28 +6343,17 @@
 HSPLcom/android/server/power/PowerManagerService;->updateSuspendBlockerLocked()V+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/SuspendBlocker;Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->updateUidProcStateInternal(II)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->updateUserActivitySummaryLocked(JI)V+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Landroid/os/Handler;Landroid/os/Handler;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/AttentionDetector;Lcom/android/server/power/AttentionDetector;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
-HPLcom/android/server/power/PowerManagerService;->updateWakeLockDisabledStatesLocked()V
+HPLcom/android/server/power/PowerManagerService;->updateWakeLockDisabledStatesLocked()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/power/PowerManagerService;->updateWakeLockSummaryLocked(I)V+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/power/PowerManagerService;->updateWakeLockWorkSourceInternal(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V+]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/power/PowerManagerService;->updateWakeLockWorkSourceInternal(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V+]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/power/PowerManagerService;->updateWakefulnessLocked(I)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;
-HSPLcom/android/server/power/PowerManagerService;->userActivityInternal(IJIII)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;
+HSPLcom/android/server/power/PowerManagerService;->userActivityInternal(IJIII)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
 HSPLcom/android/server/power/PowerManagerService;->userActivityNoUpdateLocked(Lcom/android/server/power/PowerGroup;JIII)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/AttentionDetector;Lcom/android/server/power/AttentionDetector;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;
-HSPLcom/android/server/power/PowerManagerShellCommand;-><init>(Landroid/content/Context;Lcom/android/server/power/PowerManagerService$BinderService;)V
-HSPLcom/android/server/power/ScreenUndimDetector$InternalClock;-><init>()V
-HSPLcom/android/server/power/ScreenUndimDetector;-><clinit>()V
-HSPLcom/android/server/power/ScreenUndimDetector;-><init>()V
-HSPLcom/android/server/power/ScreenUndimDetector;->recordScreenPolicy(II)V
-HPLcom/android/server/power/ScreenUndimDetector;->userActivity(I)V
-HSPLcom/android/server/power/ThermalManagerService$1;-><init>(Lcom/android/server/power/ThermalManagerService;)V
+HSPLcom/android/server/power/ScreenUndimDetector;->recordScreenPolicy(II)V+]Lcom/android/server/power/ScreenUndimDetector;Lcom/android/server/power/ScreenUndimDetector;]Lcom/android/server/power/ScreenUndimDetector$InternalClock;Lcom/android/server/power/ScreenUndimDetector$InternalClock;
+HSPLcom/android/server/power/ScreenUndimDetector;->userActivity(I)V
 HPLcom/android/server/power/ThermalManagerService$1;->getCurrentTemperatures()[Landroid/os/Temperature;
 HSPLcom/android/server/power/ThermalManagerService$1;->getCurrentThermalStatus()I
-HSPLcom/android/server/power/ThermalManagerService$TemperatureWatcher;-><init>(Lcom/android/server/power/ThermalManagerService;)V
-HSPLcom/android/server/power/ThermalManagerService$ThermalHalAidlWrapper;->getCurrentTemperatures(ZI)Ljava/util/List;
-HSPLcom/android/server/power/ThermalManagerService;-><clinit>()V
-HSPLcom/android/server/power/ThermalManagerService;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/power/ThermalManagerService;-><init>(Landroid/content/Context;Lcom/android/server/power/ThermalManagerService$ThermalHalWrapper;)V
-HSPLcom/android/server/power/ThermalManagerService;->onBootPhase(I)V
-HSPLcom/android/server/power/ThermalManagerService;->onStart()V
+HSPLcom/android/server/power/ThermalManagerService$ThermalHalAidlWrapper;->getCurrentTemperatures(ZI)Ljava/util/List;+]Landroid/hardware/thermal/IThermal;Landroid/hardware/thermal/IThermal$Stub$Proxy;]Ljava/util/List;Ljava/util/ArrayList;
 HPLcom/android/server/power/WakeLockLog$EntryByteTranslator;->fromBytes([BJLcom/android/server/power/WakeLockLog$LogEntry;)Lcom/android/server/power/WakeLockLog$LogEntry;+]Lcom/android/server/power/WakeLockLog$LogEntry;Lcom/android/server/power/WakeLockLog$LogEntry;]Lcom/android/server/power/WakeLockLog$TagDatabase;Lcom/android/server/power/WakeLockLog$TagDatabase;
 HSPLcom/android/server/power/WakeLockLog$EntryByteTranslator;->toBytes(Lcom/android/server/power/WakeLockLog$LogEntry;[BJ)I+]Lcom/android/server/power/WakeLockLog$TagDatabase;Lcom/android/server/power/WakeLockLog$TagDatabase;]Lcom/android/server/power/WakeLockLog$EntryByteTranslator;Lcom/android/server/power/WakeLockLog$EntryByteTranslator;
 HSPLcom/android/server/power/WakeLockLog$Injector;->currentTimeMillis()J
@@ -8559,107 +6378,47 @@
 HSPLcom/android/server/power/WakeLockLog;->onWakeLockReleased(Ljava/lang/String;I)V
 HSPLcom/android/server/power/WakeLockLog;->tagNameReducer(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/power/WakeLockLog;->translateFlagsFromPowerManager(I)I
-HSPLcom/android/server/power/batterysaver/BatterySaverController$1;-><init>(Lcom/android/server/power/batterysaver/BatterySaverController;)V
-HPLcom/android/server/power/batterysaver/BatterySaverController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
-HSPLcom/android/server/power/batterysaver/BatterySaverController$MyHandler;-><init>(Lcom/android/server/power/batterysaver/BatterySaverController;Landroid/os/Looper;)V
-HSPLcom/android/server/power/batterysaver/BatterySaverController;-><init>(Ljava/lang/Object;Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/power/batterysaver/BatterySaverPolicy;Lcom/android/server/power/batterysaver/BatterySavingStats;)V
-HSPLcom/android/server/power/batterysaver/BatterySaverController;->addListener(Landroid/os/PowerManagerInternal$LowPowerModeListener;)V
+HSPLcom/android/server/power/batterysaver/BatterySaverController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/power/batterysaver/BatterySaverController$MyHandler;Lcom/android/server/power/batterysaver/BatterySaverController$MyHandler;
 HSPLcom/android/server/power/batterysaver/BatterySaverController;->getAdaptiveEnabledLocked()Z
 HSPLcom/android/server/power/batterysaver/BatterySaverController;->getBatterySaverPolicy()Lcom/android/server/power/batterysaver/BatterySaverPolicy;
 HSPLcom/android/server/power/batterysaver/BatterySaverController;->getFullEnabledLocked()Z
-HPLcom/android/server/power/batterysaver/BatterySaverController;->getPowerManager()Landroid/os/PowerManager;
-HSPLcom/android/server/power/batterysaver/BatterySaverController;->isEnabled()Z
-HPLcom/android/server/power/batterysaver/BatterySaverController;->updateBatterySavingStats()V
-HSPLcom/android/server/power/batterysaver/BatterySaverPolicy$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/power/batterysaver/BatterySaverPolicy;)V
+HSPLcom/android/server/power/batterysaver/BatterySaverController;->getPowerManager()Landroid/os/PowerManager;
+HSPLcom/android/server/power/batterysaver/BatterySaverController;->isEnabled()Z+]Lcom/android/server/power/batterysaver/BatterySaverPolicy;Lcom/android/server/power/batterysaver/BatterySaverPolicy;
+HSPLcom/android/server/power/batterysaver/BatterySaverController;->updateBatterySavingStats()V+]Lcom/android/server/power/batterysaver/BatterySavingStats;Lcom/android/server/power/batterysaver/BatterySavingStats;
 HSPLcom/android/server/power/batterysaver/BatterySaverPolicy$Policy;-><init>(FZZZZZZZZZZZZZZZII)V
 HSPLcom/android/server/power/batterysaver/BatterySaverPolicy$Policy;->equals(Ljava/lang/Object;)Z
 HPLcom/android/server/power/batterysaver/BatterySaverPolicy$Policy;->fromConfig(Landroid/os/BatterySaverPolicyConfig;)Lcom/android/server/power/batterysaver/BatterySaverPolicy$Policy;
-HSPLcom/android/server/power/batterysaver/BatterySaverPolicy$PolicyBoolean;-><init>(Lcom/android/server/power/batterysaver/BatterySaverPolicy;Ljava/lang/String;)V
-HSPLcom/android/server/power/batterysaver/BatterySaverPolicy$PolicyBoolean;-><init>(Lcom/android/server/power/batterysaver/BatterySaverPolicy;Ljava/lang/String;Lcom/android/server/power/batterysaver/BatterySaverPolicy$PolicyBoolean-IA;)V
-HSPLcom/android/server/power/batterysaver/BatterySaverPolicy;-><clinit>()V
-HSPLcom/android/server/power/batterysaver/BatterySaverPolicy;-><init>(Ljava/lang/Object;Landroid/content/Context;Lcom/android/server/power/batterysaver/BatterySavingStats;)V
-HSPLcom/android/server/power/batterysaver/BatterySaverPolicy;->addListener(Lcom/android/server/power/batterysaver/BatterySaverPolicy$BatterySaverPolicyListener;)V
 HSPLcom/android/server/power/batterysaver/BatterySaverPolicy;->getBatterySaverPolicy(I)Landroid/os/PowerSaveState;+]Landroid/os/PowerSaveState$Builder;Landroid/os/PowerSaveState$Builder;]Lcom/android/server/power/batterysaver/BatterySaverPolicy;Lcom/android/server/power/batterysaver/BatterySaverPolicy;
 HSPLcom/android/server/power/batterysaver/BatterySaverPolicy;->getCurrentPolicyLocked()Lcom/android/server/power/batterysaver/BatterySaverPolicy$Policy;
-HSPLcom/android/server/power/batterysaver/BatterySaverStateMachine$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/power/batterysaver/BatterySaverStateMachine;)V
-HSPLcom/android/server/power/batterysaver/BatterySaverStateMachine$1;-><init>(Lcom/android/server/power/batterysaver/BatterySaverStateMachine;Landroid/os/Handler;)V
-HSPLcom/android/server/power/batterysaver/BatterySaverStateMachine;-><clinit>()V
-HSPLcom/android/server/power/batterysaver/BatterySaverStateMachine;-><init>(Ljava/lang/Object;Landroid/content/Context;Lcom/android/server/power/batterysaver/BatterySaverController;)V
 HSPLcom/android/server/power/batterysaver/BatterySaverStateMachine;->getBatterySaverController()Lcom/android/server/power/batterysaver/BatterySaverController;
-HSPLcom/android/server/power/batterysaver/BatterySaverStateMachine;->getBatterySaverPolicy()Lcom/android/server/power/batterysaver/BatterySaverPolicy;
+HSPLcom/android/server/power/batterysaver/BatterySaverStateMachine;->getBatterySaverPolicy()Lcom/android/server/power/batterysaver/BatterySaverPolicy;+]Lcom/android/server/power/batterysaver/BatterySaverController;Lcom/android/server/power/batterysaver/BatterySaverController;
 HSPLcom/android/server/power/batterysaver/BatterySaverStateMachine;->setBatteryStatus(ZIZ)V
-HSPLcom/android/server/power/batterysaver/BatterySavingStats;-><init>(Ljava/lang/Object;)V
-HPLcom/android/server/power/batterysaver/BatterySavingStats;->endLastStateLocked(JII)V
-HPLcom/android/server/power/batterysaver/BatterySavingStats;->transitionState(IIII)V
-HPLcom/android/server/power/batterysaver/BatterySavingStats;->transitionStateLocked(I)V
-HSPLcom/android/server/power/feature/PowerManagerFlags$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/power/feature/PowerManagerFlags$FlagState;-><init>(Ljava/lang/String;Ljava/util/function/Supplier;)V
-HSPLcom/android/server/power/feature/PowerManagerFlags$FlagState;-><init>(Ljava/lang/String;Ljava/util/function/Supplier;Lcom/android/server/power/feature/PowerManagerFlags$FlagState-IA;)V
-HSPLcom/android/server/power/feature/PowerManagerFlags;-><init>()V
-HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;-><init>(Lcom/android/server/power/hint/HintManagerService;II[ILandroid/os/IBinder;JJ)V
-HPLcom/android/server/power/hint/HintManagerService$AppHintSession;->close()V
-HPLcom/android/server/power/hint/HintManagerService$AppHintSession;->reportActualWorkDuration2([Landroid/os/WorkDuration;)V+]Lcom/android/server/power/hint/HintManagerService$NativeWrapper;Lcom/android/server/power/hint/HintManagerService$NativeWrapper;]Lcom/android/server/power/hint/HintManagerService$AppHintSession;Lcom/android/server/power/hint/HintManagerService$AppHintSession;
+HSPLcom/android/server/power/batterysaver/BatterySavingStats;->endLastStateLocked(JII)V
+HSPLcom/android/server/power/batterysaver/BatterySavingStats;->transitionState(IIII)V
+HSPLcom/android/server/power/batterysaver/BatterySavingStats;->transitionStateLocked(I)V+]Lcom/android/server/power/batterysaver/BatterySavingStats;Lcom/android/server/power/batterysaver/BatterySavingStats;
+HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;-><init>(Lcom/android/server/power/hint/HintManagerService;II[ILandroid/os/IBinder;JJ)V+]Landroid/os/IBinder;Landroid/os/BinderProxy;
+HPLcom/android/server/power/hint/HintManagerService$AppHintSession;->close()V+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Lcom/android/server/power/hint/HintManagerService$NativeWrapper;Lcom/android/server/power/hint/HintManagerService$NativeWrapper;
 HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->sendHint(I)V+]Lcom/android/server/power/hint/HintManagerService$NativeWrapper;Lcom/android/server/power/hint/HintManagerService$NativeWrapper;
 HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->updateHintAllowed(Z)Z+]Lcom/android/server/power/hint/HintManagerService$AppHintSession;Lcom/android/server/power/hint/HintManagerService$AppHintSession;
-HPLcom/android/server/power/hint/HintManagerService$AppHintSession;->updateTargetWorkDuration(J)V
-HPLcom/android/server/power/hint/HintManagerService$AppHintSession;->validateWorkDuration(Landroid/os/WorkDuration;)V+]Landroid/os/WorkDuration;Landroid/os/WorkDuration;
-HSPLcom/android/server/power/hint/HintManagerService$BinderService;-><init>(Lcom/android/server/power/hint/HintManagerService;)V
-HSPLcom/android/server/power/hint/HintManagerService$BinderService;->createHintSession(Landroid/os/IBinder;[IJ)Landroid/os/IHintSession;
-HSPLcom/android/server/power/hint/HintManagerService$Injector;-><init>()V
-HSPLcom/android/server/power/hint/HintManagerService$Injector;->createNativeWrapper()Lcom/android/server/power/hint/HintManagerService$NativeWrapper;
+HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->updateTargetWorkDuration(J)V+]Lcom/android/server/power/hint/HintManagerService$NativeWrapper;Lcom/android/server/power/hint/HintManagerService$NativeWrapper;
+HSPLcom/android/server/power/hint/HintManagerService$BinderService;->createHintSession(Landroid/os/IBinder;[IJ)Landroid/os/IHintSession;+]Lcom/android/server/power/hint/HintManagerService$NativeWrapper;Lcom/android/server/power/hint/HintManagerService$NativeWrapper;
 HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/power/hint/HintManagerService$MyUidObserver;II)V
 HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver$$ExternalSyntheticLambda0;->run()V
 HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->$r8$lambda$G5ujTcrPvq25wCnbVcETC3ZVxqA(Lcom/android/server/power/hint/HintManagerService$MyUidObserver;II)V
-HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;-><init>(Lcom/android/server/power/hint/HintManagerService;)V
-HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->isUidForeground(I)Z
+HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->isUidForeground(I)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->lambda$onUidStateChanged$1(II)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/power/hint/HintManagerService$MyUidObserver;Lcom/android/server/power/hint/HintManagerService$MyUidObserver;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
 HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->onUidStateChanged(IIJI)V+]Landroid/os/Handler;Landroid/os/Handler;
-HSPLcom/android/server/power/hint/HintManagerService$NativeWrapper;-><init>()V
-HSPLcom/android/server/power/hint/HintManagerService$NativeWrapper;->halGetHintSessionPreferredRate()J
-HSPLcom/android/server/power/hint/HintManagerService$NativeWrapper;->halInit()V
-HPLcom/android/server/power/hint/HintManagerService$NativeWrapper;->halReportActualWorkDuration(J[Landroid/os/WorkDuration;)V
 HSPLcom/android/server/power/hint/HintManagerService$NativeWrapper;->halSendHint(JI)V
 HSPLcom/android/server/power/hint/HintManagerService;->-$$Nest$fgetmActiveSessions(Lcom/android/server/power/hint/HintManagerService;)Landroid/util/ArrayMap;
 HSPLcom/android/server/power/hint/HintManagerService;->-$$Nest$fgetmLock(Lcom/android/server/power/hint/HintManagerService;)Ljava/lang/Object;
 HSPLcom/android/server/power/hint/HintManagerService;->-$$Nest$fgetmNativeWrapper(Lcom/android/server/power/hint/HintManagerService;)Lcom/android/server/power/hint/HintManagerService$NativeWrapper;
-HSPLcom/android/server/power/hint/HintManagerService;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/power/hint/HintManagerService;-><init>(Landroid/content/Context;Lcom/android/server/power/hint/HintManagerService$Injector;)V
-HSPLcom/android/server/power/hint/HintManagerService;->checkTidValid(II[I)Ljava/lang/Integer;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
-HSPLcom/android/server/power/hint/HintManagerService;->onBootPhase(I)V
-HSPLcom/android/server/power/hint/HintManagerService;->onStart()V
-HSPLcom/android/server/power/optimization/FeatureFlagsImpl;-><init>()V
-HSPLcom/android/server/power/optimization/FeatureFlagsImpl;->disableSystemServicePowerAttr()Z
-HSPLcom/android/server/power/optimization/Flags;-><clinit>()V
 HSPLcom/android/server/power/optimization/Flags;->disableSystemServicePowerAttr()Z
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig$1;-><init>()V
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig$PowerComponent;-><init>(I)V
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig$PowerComponent;->getPowerComponentId()I
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig$PowerComponent;->getProcessor()Lcom/android/server/power/stats/AggregatedPowerStatsProcessor;
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig$PowerComponent;->setProcessor(Lcom/android/server/power/stats/AggregatedPowerStatsProcessor;)Lcom/android/server/power/stats/AggregatedPowerStatsConfig$PowerComponent;
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig$PowerComponent;->trackDeviceStates([I)Lcom/android/server/power/stats/AggregatedPowerStatsConfig$PowerComponent;
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig$PowerComponent;->trackUidStates([I)Lcom/android/server/power/stats/AggregatedPowerStatsConfig$PowerComponent;
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig;->-$$Nest$sfgetNO_OP_PROCESSOR()Lcom/android/server/power/stats/AggregatedPowerStatsProcessor;
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig;-><clinit>()V
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig;-><init>()V
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig;->getPowerComponentsAggregatedStatsConfigs()Ljava/util/List;
-HSPLcom/android/server/power/stats/AggregatedPowerStatsConfig;->trackPowerComponent(I)Lcom/android/server/power/stats/AggregatedPowerStatsConfig$PowerComponent;
-HSPLcom/android/server/power/stats/AggregatedPowerStatsProcessor;-><init>()V
 HPLcom/android/server/power/stats/AudioPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/AudioPowerCalculator;Lcom/android/server/power/stats/AudioPowerCalculator;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/AudioPowerCalculator;->calculateApp(Landroid/os/UidBatteryConsumer$Builder;Lcom/android/server/power/stats/AudioPowerCalculator$PowerAndDuration;Landroid/os/BatteryStats$Uid;J)V+]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda0;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda5;-><init>(Ljava/lang/Runnable;)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda5;->run()V
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda8;-><init>(Lcom/android/server/power/stats/BatteryExternalStatsWorker;I)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$1;-><init>(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$1;->run()V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$2;-><init>(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$2;->run()V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$Injector;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$1;->run()V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryExternalStatsWorker;Lcom/android/server/power/stats/BatteryExternalStatsWorker;
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$Injector;->getSystemService(Ljava/lang/Class;)Ljava/lang/Object;
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->$r8$lambda$TgNX_p2V0O5r6X5mUinj9SCyWf4(Ljava/lang/Runnable;)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->$r8$lambda$xuE6vcYTQgXCEAaRtlmzQWy8b9c(Ljava/lang/Runnable;)Ljava/lang/Thread;
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fgetmCurrentReason(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)Ljava/lang/String;
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fgetmOnBattery(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)Z
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fgetmOnBatteryScreenOff(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)Z
@@ -8667,92 +6426,44 @@
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fgetmScreenState(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)I
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fgetmStats(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)Lcom/android/server/power/stats/BatteryStatsImpl;
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fgetmUpdateFlags(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)I
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fgetmUseLatestStates(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)Z
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fgetmWorkerLock(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)Ljava/lang/Object;
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fputmCurrentFuture(Lcom/android/server/power/stats/BatteryExternalStatsWorker;Ljava/util/concurrent/Future;)V
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fputmCurrentReason(Lcom/android/server/power/stats/BatteryExternalStatsWorker;Ljava/lang/String;)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fputmLastCollectionTimeStamp(Lcom/android/server/power/stats/BatteryExternalStatsWorker;J)V
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fputmUpdateFlags(Lcom/android/server/power/stats/BatteryExternalStatsWorker;I)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$fputmUseLatestStates(Lcom/android/server/power/stats/BatteryExternalStatsWorker;Z)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$mcancelSyncDueToBatteryLevelChangeLocked(Lcom/android/server/power/stats/BatteryExternalStatsWorker;)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->-$$Nest$mupdateExternalStatsLocked(Lcom/android/server/power/stats/BatteryExternalStatsWorker;Ljava/lang/String;IZZI[IZ)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;-><init>(Landroid/content/Context;Lcom/android/server/power/stats/BatteryStatsImpl;)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;-><init>(Lcom/android/server/power/stats/BatteryExternalStatsWorker$Injector;Lcom/android/server/power/stats/BatteryStatsImpl;)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->addEnergyConsumerIdLocked(Landroid/util/IntArray;I)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->awaitControllerInfo(Landroid/os/SynchronousResultReceiver;)Landroid/os/Parcelable;
+HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->addEnergyConsumerIdLocked(Landroid/util/IntArray;I)V+]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->awaitControllerInfo(Landroid/os/SynchronousResultReceiver;)Landroid/os/Parcelable;+]Landroid/os/SynchronousResultReceiver;Landroid/os/SynchronousResultReceiver;
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->cancelCpuSyncDueToWakelockChange()V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->cancelSyncDueToBatteryLevelChangeLocked()V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->cancelSyncDueToProcessStateChange()V
-HPLcom/android/server/power/stats/BatteryExternalStatsWorker;->extractDeltaLocked(Landroid/os/connectivity/WifiActivityEnergyInfo;)Landroid/os/connectivity/WifiActivityEnergyInfo;
+HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->extractDeltaLocked(Landroid/os/connectivity/WifiActivityEnergyInfo;)Landroid/os/connectivity/WifiActivityEnergyInfo;
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->getEnergyConsumersLocked(I)Ljava/util/concurrent/CompletableFuture;
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->lambda$new$0(Ljava/lang/Runnable;)V
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->lambda$new$1(Ljava/lang/Runnable;)Ljava/lang/Thread;
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->lambda$updateExternalStatsLocked$8(Landroid/os/SynchronousResultReceiver;Landroid/os/connectivity/WifiActivityEnergyInfo;)V
+HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->lambda$updateExternalStatsLocked$8(Landroid/os/SynchronousResultReceiver;Landroid/os/connectivity/WifiActivityEnergyInfo;)V+]Landroid/os/SynchronousResultReceiver;Landroid/os/SynchronousResultReceiver;
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleCpuSyncDueToWakelockChange(J)Ljava/util/concurrent/Future;+]Lcom/android/server/power/stats/BatteryExternalStatsWorker;Lcom/android/server/power/stats/BatteryExternalStatsWorker;
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleDelayedSyncLocked(Ljava/util/concurrent/Future;Ljava/lang/Runnable;J)Ljava/util/concurrent/Future;+]Ljava/util/concurrent/Future;Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;]Ljava/util/concurrent/ScheduledExecutorService;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService;
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleRunnable(Ljava/lang/Runnable;)V+]Ljava/util/concurrent/ScheduledExecutorService;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService;
 HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleSyncDueToProcessStateChange(IJ)V+]Lcom/android/server/power/stats/BatteryExternalStatsWorker;Lcom/android/server/power/stats/BatteryExternalStatsWorker;
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleSyncLocked(Ljava/lang/String;I)Ljava/util/concurrent/Future;
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleWrite()Ljava/util/concurrent/Future;
-HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->updateExternalStatsLocked(Ljava/lang/String;IZZI[IZ)V
-HSPLcom/android/server/power/stats/BatteryStatsDumpHelperImpl;-><init>(Lcom/android/server/power/stats/BatteryUsageStatsProvider;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda10;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V
+HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleSyncLocked(Ljava/lang/String;I)Ljava/util/concurrent/Future;+]Ljava/util/concurrent/ScheduledExecutorService;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService;
+HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->updateExternalStatsLocked(Ljava/lang/String;IZZI[IZ)V+]Lcom/android/server/power/stats/BatteryExternalStatsWorker$Injector;Lcom/android/server/power/stats/BatteryExternalStatsWorker$Injector;]Landroid/net/wifi/WifiManager;Landroid/net/wifi/WifiManager;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/EnergyConsumerSnapshot;Lcom/android/server/power/stats/EnergyConsumerSnapshot;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;]Lcom/android/server/power/stats/BatteryExternalStatsWorker;Lcom/android/server/power/stats/BatteryExternalStatsWorker;]Landroid/telephony/TelephonyManager;Landroid/telephony/TelephonyManager;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda1;->onUidCpuTime(ILjava/lang/Object;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda2;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;JJZZZII[ILcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda2;->onUidCpuTime(ILjava/lang/Object;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda3;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;JJZLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda3;->onUidCpuTime(ILjava/lang/Object;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda4;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;JJIZLandroid/util/SparseLongArray;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda4;->onUidCpuTime(ILjava/lang/Object;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda6;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda9;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$1;-><init>()V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$2;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$4;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;-><init>(Lcom/android/internal/os/Clock;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;ILcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;->computeCurrentCountLocked()I
 HSPLcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;->computeOverage(J)J
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;->computeRunTimeLocked(JJ)J
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;->-$$Nest$fgetmPowerStatsThrottlePeriodCpu(Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;)J
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;->-$$Nest$fgetmResetOnUnplugAfterSignificantCharge(Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;)Z
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;->-$$Nest$fgetmResetOnUnplugHighBatteryLevel(Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;)Z
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;-><init>()V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;->build()Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;->setPowerStatsThrottlePeriodCpu(J)Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;->setResetOnUnplugAfterSignificantCharge(Z)Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;->setResetOnUnplugHighBatteryLevel(Z)Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig-IA;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig;->getPowerStatsThrottlePeriodCpu()J
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BinderCallStats;-><init>()V
 HPLcom/android/server/power/stats/BatteryStatsImpl$BinderCallStats;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Ljava/lang/Class;
 HPLcom/android/server/power/stats/BatteryStatsImpl$BinderCallStats;->hashCode()I+]Ljava/lang/Object;Ljava/lang/Class;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BluetoothActivityInfoCache;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$BluetoothActivityInfoCache;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl$BluetoothActivityInfoCache-IA;)V
 HPLcom/android/server/power/stats/BatteryStatsImpl$BluetoothActivityInfoCache;->set(Landroid/bluetooth/BluetoothActivityEnergyInfo;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Constants;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;Landroid/os/Handler;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;-><init>(Lcom/android/internal/os/Clock;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;I)V
 HPLcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;->getOrCreateTxTimeCounters()[Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;+]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;->readSummaryFromParcel(Landroid/os/Parcel;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;->readTimeMultiStateCounter(Landroid/os/Parcel;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;->readTimeMultiStateCounters(Landroid/os/Parcel;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;I)[Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;
 HPLcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;->setState(IJ)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;->writeSummaryToParcel(Landroid/os/Parcel;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;->writeTimeMultiStateCounter(Landroid/os/Parcel;Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;->writeTimeMultiStateCounters(Landroid/os/Parcel;[Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Counter;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Counter;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;->writeSummaryToParcel(Landroid/os/Parcel;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;
+HSPLcom/android/server/power/stats/BatteryStatsImpl$Counter;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Counter;->stepAtomic()V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Counter;->writeSummaryFromParcelLocked(Landroid/os/Parcel;)V+]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;]Landroid/os/Parcel;Landroid/os/Parcel;
 HPLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;-><init>(Lcom/android/server/power/stats/CpuPowerCalculator;I)V
 HPLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;->addCpuClusterDurationsMs(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;[J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;]Lcom/android/server/power/stats/CpuPowerCalculator;Lcom/android/server/power/stats/CpuPowerCalculator;
 HPLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;->addCpuClusterSpeedDurationsMs(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;IIJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;]Lcom/android/server/power/stats/CpuPowerCalculator;Lcom/android/server/power/stats/CpuPowerCalculator;
 HPLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;->getOrCreateUidCpuClusterCharges(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;)[D+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;-><init>(Lcom/android/internal/os/Clock;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;->readSummaryFromParcel(Landroid/os/Parcel;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;->writeSummaryToParcel(Landroid/os/Parcel;J)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;->writeSummaryToParcel(Landroid/os/Parcel;J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$DualTimer;-><init>(Lcom/android/internal/os/Clock;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$DualTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$DualTimer;->startRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$DualTimer;->stopRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$DualTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;
@@ -8769,46 +6480,31 @@
 HPLcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;->kernelWakeupReported(J)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;->uidProcessStateChanged(II)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;->wakelockStateChanged(ILandroid/os/WorkSource$WorkChain;Ljava/lang/String;IIZ)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$HistoryStepDetailsCalculatorImpl;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$HistoryStepDetailsCalculatorImpl;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl$HistoryStepDetailsCalculatorImpl-IA;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$HistoryStepDetailsCalculatorImpl;->addCpuStats(IIIIIIII)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$HistoryStepDetailsCalculatorImpl;->clear()V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$HistoryStepDetailsCalculatorImpl;->getHistoryStepDetails()Landroid/os/BatteryStats$HistoryStepDetails;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$PlatformIdleStateCallback;Lcom/android/server/am/BatteryStatsService;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl$HistoryStepDetailsCalculatorImpl;->getHistoryStepDetails()Landroid/os/BatteryStats$HistoryStepDetails;+]Lcom/android/server/power/stats/BatteryStatsImpl$PlatformIdleStateCallback;Lcom/android/server/am/BatteryStatsService;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->addCountLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->addCountLocked(JZ)V
 HPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->getCountLocked(I)J
-HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->onTimeStarted(JJJ)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->reset(ZJ)Z
 HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->writeSummaryFromParcelLocked(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;->-$$Nest$mreadSummaryFromParcelLocked(Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;Landroid/os/Parcel;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;->-$$Nest$mwriteSummaryToParcelLocked(Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;Landroid/os/Parcel;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;->addCountLocked([JZ)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;->readSummaryFromParcelLocked(Landroid/os/Parcel;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;->writeSummaryToParcelLocked(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;->writeSummaryToParcelLocked(Landroid/os/Parcel;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$MyHandler;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;Landroid/os/Looper;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;I)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;->add(Ljava/lang/String;Ljava/lang/Object;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;->getMap()Landroid/util/ArrayMap;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;->startObject(Ljava/lang/String;J)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$2;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;->stopObject(Ljava/lang/String;J)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;-><init>(ILcom/android/internal/os/Clock;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;->getFrequencyRangeCount()I
-HSPLcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;->getRxDurationCounter(IZ)Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;->getTxDurationCounter(IIZ)Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;->readSummaryFromParcel(Landroid/os/Parcel;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;->writeSummaryToParcel(Landroid/os/Parcel;J)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;->getTxDurationCounter(IIZ)Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;+]Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;
+HSPLcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;->writeSummaryToParcel(Landroid/os/Parcel;J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;-><init>(Lcom/android/internal/os/Clock;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V
-HPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->add(JIJ)V
+HPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->add(JIJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->computeCurrentCountLocked()I
 HSPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->computeRunTimeLocked(JJ)J
-HSPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->endSample(J)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->getUpdateVersion()I
-HSPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->onTimeStarted(JJJ)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->setUpdateVersion(I)V
 HPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->update(JIJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->update(JJIJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;
@@ -8820,7 +6516,6 @@
 HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->refreshTimersLocked(JLjava/util/ArrayList;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;)J+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->setMark(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->setTimeout(J)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->startRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->stopRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;-><init>(Z)V
@@ -8829,30 +6524,25 @@
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->computeUptime(JI)J+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->getRealtime(J)J
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->getUptime(J)J
-HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->init(JJ)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->init(JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->isRunning()Z
-HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->readSummaryFromParcel(Landroid/os/Parcel;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->setRunning(ZJJ)Z+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;megamorphic_types]Ljava/util/Collection;Ljava/util/HashSet;,Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/HashMap$KeyIterator;,Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->writeSummaryToParcel(Landroid/os/Parcel;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Landroid/os/Parcel;Landroid/os/Parcel;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;->-$$Nest$mwriteToParcel(Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;Landroid/os/Parcel;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;->-$$Nest$smreadFromParcel(Landroid/os/Parcel;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;IIJ)Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/internal/os/LongArrayMultiStateCounter;J)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;->getCounter()Lcom/android/internal/os/LongArrayMultiStateCounter;
 HPLcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;->getCountsLocked([JI)Z+]Lcom/android/internal/os/LongArrayMultiStateCounter;Lcom/android/internal/os/LongArrayMultiStateCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;->getStateCount()I+]Lcom/android/internal/os/LongArrayMultiStateCounter;Lcom/android/internal/os/LongArrayMultiStateCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;->onTimeStopped(JJJ)V+]Lcom/android/internal/os/LongArrayMultiStateCounter;Lcom/android/internal/os/LongArrayMultiStateCounter;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;->readFromParcel(Landroid/os/Parcel;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;IIJ)Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;->writeToParcel(Landroid/os/Parcel;)V+]Lcom/android/internal/os/LongArrayMultiStateCounter;Lcom/android/internal/os/LongArrayMultiStateCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->-$$Nest$msetState(Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;IJ)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->-$$Nest$mupdate(Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;JJ)J
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->-$$Nest$mwriteToParcel(Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;Landroid/os/Parcel;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->-$$Nest$smreadFromParcel(Landroid/os/Parcel;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;IJ)Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/internal/os/LongMultiStateCounter;J)V
 HPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->getCountForProcessState(I)J+]Lcom/android/internal/os/LongMultiStateCounter;Lcom/android/internal/os/LongMultiStateCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->getStateCount()I+]Lcom/android/internal/os/LongMultiStateCounter;Lcom/android/internal/os/LongMultiStateCounter;
 HPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->getTotalCountLocked()J+]Lcom/android/internal/os/LongMultiStateCounter;Lcom/android/internal/os/LongMultiStateCounter;
 HPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->increment(JJ)V+]Lcom/android/internal/os/LongMultiStateCounter;Lcom/android/internal/os/LongMultiStateCounter;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->readFromParcel(Landroid/os/Parcel;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;IJ)Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->setState(IJ)V+]Lcom/android/internal/os/LongMultiStateCounter;Lcom/android/internal/os/LongMultiStateCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->update(JJ)J+]Lcom/android/internal/os/LongMultiStateCounter;Lcom/android/internal/os/LongMultiStateCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;->writeToParcel(Landroid/os/Parcel;)V+]Lcom/android/internal/os/LongMultiStateCounter;Lcom/android/internal/os/LongMultiStateCounter;
@@ -8865,64 +6555,42 @@
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Timer;->onTimeStopped(JJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;megamorphic_types
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Timer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Timer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;megamorphic_types]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$1;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl;I)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$2;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl;I)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$2;->instantiateObject()Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$2;->instantiateObject()Ljava/lang/Object;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$3;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl;I)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$3;->instantiateObject()Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$3;->instantiateObject()Ljava/lang/Object;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->getStartTimeToNowLocked(J)J
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->startLaunchedLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->startRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
-HPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->stopLaunchedLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
-HPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->stopRunningLocked(J)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;->newServiceStatsLocked()Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;Ljava/lang/String;)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->stopLaunchedLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->stopRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
+HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;Ljava/lang/String;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;->addCpuTimeLocked(II)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;->addCpuTimeLocked(IIZ)V
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;->getForegroundTime(I)J
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;->getSystemTime(I)J
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;->getUserTime(I)J
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;->readExcessivePowerFromParcelLocked(Landroid/os/Parcel;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;->writeExcessivePowerToParcelLocked(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Sensor;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;I)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;->writeExcessivePowerToParcelLocked(Landroid/os/Parcel;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/Parcel;Landroid/os/Parcel;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;->getWakeTime(I)Landroid/os/BatteryStats$Timer;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;->getWakeTime(I)Lcom/android/server/power/stats/BatteryStatsImpl$Timer;
-HPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;->reset(J)Z
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->-$$Nest$fgetmMobileRadioApWakeupCount(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;)Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->-$$Nest$fgetmUidEnergyConsumerStats(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;)Lcom/android/internal/power/EnergyConsumerStats;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->-$$Nest$fgetmWifiRadioApWakeupCount(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;)Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->-$$Nest$fputmMobileRadioApWakeupCount(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->-$$Nest$fputmUidEnergyConsumerStats(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/internal/power/EnergyConsumerStats;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->-$$Nest$fputmWifiRadioApWakeupCount(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->-$$Nest$mgetCpuActiveTimeCounter(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;)Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->-$$Nest$mgetProcStateScreenOffTimeCounter(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;J)Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->-$$Nest$mgetProcStateTimeCounter(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;J)Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;-><clinit>()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl;IJJ)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->createAggregatedPartialWakelockTimerLocked()Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->createAudioTurnedOnTimerLocked()Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->createBluetoothScanResultBgCounterLocked()Lcom/android/server/power/stats/BatteryStatsImpl$Counter;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->createBluetoothScanResultCounterLocked()Lcom/android/server/power/stats/BatteryStatsImpl$Counter;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->createBluetoothScanTimerLocked()Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->createForegroundActivityTimerLocked()Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->createForegroundServiceTimerLocked()Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->createVibratorOnTimerLocked()Lcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->createVideoTurnedOnTimerLocked()Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
-HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->detachFromTimeBase()V
+HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->detachFromTimeBase()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$2;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->ensureMultiStateCounters(J)V+]Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/CpuScalingPolicies;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->ensureNetworkActivityLocked()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getBluetoothControllerActivity()Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getCameraTurnedOnTimer()Landroid/os/BatteryStats$Timer;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getCpuActiveTimeCounter()Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;+]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getCpuEnergyConsumptionUC(I)J+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
-HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getCustomEnergyConsumerBatteryConsumptionUC()[J
+HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getCpuFreqTimes([JI)Z+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;
+HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getCustomEnergyConsumerBatteryConsumptionUC()[J+]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getEnergyConsumptionUC(I)J+]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getEnergyConsumptionUC(II)J+]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;
+HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getFlashlightTurnedOnTimer()Landroid/os/BatteryStats$Timer;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getForegroundActivityTimer()Landroid/os/BatteryStats$Timer;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getForegroundActivityTimer()Lcom/android/server/power/stats/BatteryStatsImpl$Timer;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getMobileRadioActiveTimeCounter()Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;+]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;
@@ -8933,7 +6601,7 @@
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getOrCreateEnergyConsumerStatsIfSupportedLocked()Lcom/android/internal/power/EnergyConsumerStats;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getOrCreateEnergyConsumerStatsLocked()Lcom/android/internal/power/EnergyConsumerStats;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getPackageStatsLocked(Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getPidStatsLocked(I)Landroid/os/BatteryStats$Uid$Pid;
+HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getPidStatsLocked(I)Landroid/os/BatteryStats$Uid$Pid;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getProcStateScreenOffTimeCounter(J)Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getProcStateTimeCounter(J)Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getProcessStateTime(IJI)J+]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
@@ -8941,243 +6609,166 @@
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getSensorStats()Landroid/util/SparseArray;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getSensorTimerLocked(IZ)Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getServiceStatsLocked(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
-HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getSystemCpuTimeUs(I)J
+HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getSystemCpuTimeUs(I)J+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getUid()I
-HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getUserCpuTimeUs(I)J
+HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getUserCpuTimeUs(I)J+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;
+HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getVideoTurnedOnTimer()Lcom/android/server/power/stats/BatteryStatsImpl$Timer;
+HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getWakelockStats()Landroid/util/ArrayMap;+]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getWakelockTimerLocked(Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;I)Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getWifiControllerActivity()Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->initUserActivityLocked()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->isInBackground()Z
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->makeProcessState(ILandroid/os/Parcel;)V
-HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->markProcessForegroundTimeUs(JZ)J+]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->maybeScheduleExternalStatsSync(II)V+]Lcom/android/server/power/stats/BatteryStatsImpl$ExternalStatsSync;Lcom/android/server/power/stats/BatteryExternalStatsWorker;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteBinderCallStatsLocked(JLjava/util/Collection;)V+]Ljava/util/Collection;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteNetworkActivityLocked(IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
-HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteStartJobLocked(Ljava/lang/String;J)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteStartJobLocked(Ljava/lang/String;J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteStartWakeLocked(ILjava/lang/String;IJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;
-HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteStopJobLocked(Ljava/lang/String;JI)V
+HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteStopJobLocked(Ljava/lang/String;JI)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteStopWakeLocked(ILjava/lang/String;IJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteUserActivityLocked(I)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$Counter;Lcom/android/server/power/stats/BatteryStatsImpl$Counter;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->readJobCompletionsFromParcelLocked(Landroid/os/Parcel;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->readJobSummaryFromParcelLocked(Ljava/lang/String;Landroid/os/Parcel;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->readSyncSummaryFromParcelLocked(Ljava/lang/String;Landroid/os/Parcel;)V
+HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->nullIfAllZeros(Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;I)[J+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->readWakeSummaryFromParcelLocked(Ljava/lang/String;Landroid/os/Parcel;)V
 HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->reset(JJI)Z+]Lcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Sensor;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Sensor;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$2;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->updateOnBatteryBgTimeBase(JJ)Z+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->updateOnBatteryScreenOffBgTimeBase(JJ)Z+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->updateUidProcessStateLocked(IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/internal/os/LongArrayMultiStateCounter;Lcom/android/internal/os/LongArrayMultiStateCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;
 HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->writeJobCompletionsToParcelLocked(Landroid/os/Parcel;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/os/Parcel;Landroid/os/Parcel;
-HSPLcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider;-><init>()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider;->exists(I)Z
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->$r8$lambda$55y1ivO2sjC-T6ZAKfbd9ZmL96Q(Lcom/android/server/power/stats/BatteryStatsImpl;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->$r8$lambda$Fw1gZ2cEwJSh0boUgPpMekikpRY(Lcom/android/server/power/stats/BatteryStatsImpl;JJILjava/lang/Long;)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->$r8$lambda$QQoy6IxHqcVBz3RC3Dkg0gtOBF4(Lcom/android/server/power/stats/BatteryStatsImpl;JJIZLandroid/util/SparseLongArray;I[J)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->$r8$lambda$tZ49Gpx4tbunSvl_gryoQSS90kI(Lcom/android/server/power/stats/BatteryStatsImpl;JJZZZII[ILcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;I[J)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->$r8$lambda$uJcurdE-u3pESh_kBtKrLUt8riQ(Lcom/android/server/power/stats/BatteryStatsImpl;JJZLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;I[J)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmAudioTurnedOnTimers(Lcom/android/server/power/stats/BatteryStatsImpl;)Ljava/util/ArrayList;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmBluetoothScanOnTimers(Lcom/android/server/power/stats/BatteryStatsImpl;)Ljava/util/ArrayList;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmExternalSync(Lcom/android/server/power/stats/BatteryStatsImpl;)Lcom/android/server/power/stats/BatteryStatsImpl$ExternalStatsSync;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmFullWifiLockTimers(Lcom/android/server/power/stats/BatteryStatsImpl;)Ljava/util/ArrayList;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmPowerStatsCollectorEnabled(Lcom/android/server/power/stats/BatteryStatsImpl;)Z
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmSensorTimers(Lcom/android/server/power/stats/BatteryStatsImpl;)Landroid/util/SparseArray;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmSystemReady(Lcom/android/server/power/stats/BatteryStatsImpl;)Z
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmUidStats(Lcom/android/server/power/stats/BatteryStatsImpl;)Landroid/util/SparseArray;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmVideoTurnedOnTimers(Lcom/android/server/power/stats/BatteryStatsImpl;)Ljava/util/ArrayList;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmWifiMulticastTimers(Lcom/android/server/power/stats/BatteryStatsImpl;)Ljava/util/ArrayList;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmWifiRunningTimers(Lcom/android/server/power/stats/BatteryStatsImpl;)Ljava/util/ArrayList;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$fgetmWifiScanTimers(Lcom/android/server/power/stats/BatteryStatsImpl;)Ljava/util/ArrayList;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$mgetPowerManagerWakeLockLevel(Lcom/android/server/power/stats/BatteryStatsImpl;I)I
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$mgetPowerManagerWakeLockLevel(Lcom/android/server/power/stats/BatteryStatsImpl;I)I+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$mmapIsolatedUid(Lcom/android/server/power/stats/BatteryStatsImpl;I)I
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$mtrackPerProcStateCpuTimes(Lcom/android/server/power/stats/BatteryStatsImpl;)Z
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$smdetachIfNotNull(Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$smdetachIfNotNull([Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->-$$Nest$smisActiveRadioPowerState(I)Z
-HSPLcom/android/server/power/stats/BatteryStatsImpl;-><clinit>()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;-><init>(Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig;Lcom/android/internal/os/Clock;Lcom/android/internal/os/MonotonicClock;Ljava/io/File;Landroid/os/Handler;Lcom/android/server/power/stats/BatteryStatsImpl$PlatformIdleStateCallback;Lcom/android/server/power/stats/BatteryStatsImpl$EnergyStatsRetriever;Lcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider;Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/server/power/stats/PowerStatsUidResolver;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->access$000()Z
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->aggregateLastWakeupUptimeLocked(JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;]Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->clearPendingRemovedUidsLocked()V
-HPLcom/android/server/power/stats/BatteryStatsImpl;->computeDelta(Landroid/net/NetworkStats;Landroid/net/NetworkStats;)Ljava/util/List;+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->computeRealtime(JI)J
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->computeUptime(JI)J
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->clearPendingRemovedUidsLocked()V+]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Ljava/util/Queue;Ljava/util/LinkedList;
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->computeDelta(Landroid/net/NetworkStats;Landroid/net/NetworkStats;)Ljava/util/List;+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->detachIfNotNull(Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;megamorphic_types
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->detachIfNotNull([Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->detachIfNotNull([[Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->ensureKernelSingleUidTimeReaderLocked()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->fillLowPowerStats()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->getAvailableUidStatsLocked(I)Lcom/android/server/power/stats/BatteryStatsImpl$Uid;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->getBatteryConsumerProcessStateNames()[Ljava/lang/String;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->getBatteryUptimeLocked(J)J+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
-HPLcom/android/server/power/stats/BatteryStatsImpl;->getCellularBatteryStats()Landroid/os/connectivity/CellularBatteryStats;+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->getDischargeAmountScreenDozeSinceCharge()I
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->getDischargeAmountScreenOffSinceCharge()I
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->getDischargeAmountScreenOnSinceCharge()I
+HPLcom/android/server/power/stats/BatteryStatsImpl;->getCellularBatteryStats()Landroid/os/connectivity/CellularBatteryStats;+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$1;]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->getHighDischargeAmountSinceCharge()I
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->getHistory()Lcom/android/internal/os/BatteryStatsHistory;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->getIsOnBattery()Z
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->getKernelWakelockTimerLocked(Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->getLowDischargeAmountSinceCharge()I
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->getPowerManagerWakeLockLevel(I)I
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->getRatBatteryStatsLocked(I)Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->getRpmTimerLocked(Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->getRpmTimerLocked(Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;+]Ljava/util/HashMap;Ljava/util/HashMap;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->getServiceStatsLocked(ILjava/lang/String;Ljava/lang/String;JJ)Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->getStartClockTime()J
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->getUidStatsLocked(I)Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->getUidStatsLocked(I)Lcom/android/server/power/stats/BatteryStatsImpl$Uid;+]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->getUidStatsLocked(IJJ)Lcom/android/server/power/stats/BatteryStatsImpl$Uid;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->getWakeupReasonTimerLocked(Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;
-HPLcom/android/server/power/stats/BatteryStatsImpl;->incrementPerRatDataLocked(Landroid/telephony/ModemActivityInfo;J)Lcom/android/server/power/stats/BatteryStatsImpl$RxTxConsumption;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->informThatAllExternalStatsAreFlushed()V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->initDischarge(J)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->initKernelStatsReaders()V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->initPowerProfile()V
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->getWakeupReasonTimerLocked(Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;+]Ljava/util/HashMap;Ljava/util/HashMap;
+HPLcom/android/server/power/stats/BatteryStatsImpl;->incrementPerRatDataLocked(Landroid/telephony/ModemActivityInfo;J)Lcom/android/server/power/stats/BatteryStatsImpl$RxTxConsumption;+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/telephony/ModemActivityInfo;Landroid/telephony/ModemActivityInfo;]Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;]Lcom/android/server/power/stats/MobileRadioPowerCalculator;Lcom/android/server/power/stats/MobileRadioPowerCalculator;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->initTimersAndCounters()V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->initTimes(JJ)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->isOnBattery()Z
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->isOnBatteryLocked()Z
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->isOnBatteryScreenOffLocked()Z
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->lambda$new$10()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->lambda$readKernelUidCpuActiveTimesLocked$6(JJILjava/lang/Long;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider;Lcom/android/server/am/BatteryStatsService$3;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Long;Ljava/lang/Long;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->lambda$readKernelUidCpuClusterTimesLocked$7(JJZLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;I[J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;]Lcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider;Lcom/android/server/am/BatteryStatsService$3;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->lambda$readKernelUidCpuFreqTimesLocked$5(JJZZZII[ILcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;I[J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;]Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/CpuScalingPolicies;]Lcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider;Lcom/android/server/am/BatteryStatsService$3;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->lambda$readKernelUidCpuTimesLocked$4(JJIZLandroid/util/SparseLongArray;I[J)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider;Lcom/android/server/am/BatteryStatsService$3;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->mapIsolatedUid(I)I+]Lcom/android/server/power/stats/PowerStatsUidResolver;Lcom/android/server/power/stats/PowerStatsUidResolver;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->mapUid(I)I+]Lcom/android/server/power/stats/PowerStatsUidResolver;Lcom/android/server/power/stats/PowerStatsUidResolver;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->markPartialTimersAsEligible()V
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->markPartialTimersAsEligible()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/power/stats/BatteryStatsImpl;->noteBinderCallStats(IJLjava/util/Collection;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
 HPLcom/android/server/power/stats/BatteryStatsImpl;->noteChangeWakelockFromSourceLocked(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;ILandroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/WorkSource;Landroid/os/WorkSource;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteEventLocked(ILjava/lang/String;IJJ)V
-HPLcom/android/server/power/stats/BatteryStatsImpl;->noteJobFinishLocked(Ljava/lang/String;IIJJ)V
-HPLcom/android/server/power/stats/BatteryStatsImpl;->noteJobStartLocked(Ljava/lang/String;IJJ)V
-HPLcom/android/server/power/stats/BatteryStatsImpl;->noteModemControllerActivity(Landroid/telephony/ModemActivityInfo;JJJLandroid/app/usage/NetworkStatsManager;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Landroid/telephony/ModemActivityInfo;Landroid/telephony/ModemActivityInfo;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;]Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/PowerProfile;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;]Landroid/util/SparseDoubleArray;Landroid/util/SparseDoubleArray;]Lcom/android/server/power/stats/MobileRadioPowerCalculator;Lcom/android/server/power/stats/MobileRadioPowerCalculator;]Lcom/android/internal/os/RailStats;Lcom/android/internal/os/RailStats;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;
-HPLcom/android/server/power/stats/BatteryStatsImpl;->notePhoneDataConnectionStateLocked(IZIIIJJ)V
-HPLcom/android/server/power/stats/BatteryStatsImpl;->notePhoneSignalStrengthLocked(ILandroid/util/SparseIntArray;JJ)V
-HPLcom/android/server/power/stats/BatteryStatsImpl;->notePhoneSignalStrengthLocked(Landroid/telephony/SignalStrength;JJ)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->notePowerSaveModeLockedInit(ZJJ)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteProcessStartLocked(Ljava/lang/String;IJJ)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteEventLocked(ILjava/lang/String;IJJ)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;
+HPLcom/android/server/power/stats/BatteryStatsImpl;->noteJobFinishLocked(Ljava/lang/String;IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Landroid/os/BatteryStats$HistoryEventTracker;Landroid/os/BatteryStats$HistoryEventTracker;
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteJobStartLocked(Ljava/lang/String;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Landroid/os/BatteryStats$HistoryEventTracker;Landroid/os/BatteryStats$HistoryEventTracker;
+HPLcom/android/server/power/stats/BatteryStatsImpl;->noteModemControllerActivity(Landroid/telephony/ModemActivityInfo;JJJLandroid/app/usage/NetworkStatsManager;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/internal/os/RailStats;Lcom/android/internal/os/RailStats;]Landroid/telephony/ModemActivityInfo;Landroid/telephony/ModemActivityInfo;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;]Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/PowerProfile;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;]Landroid/util/SparseDoubleArray;Landroid/util/SparseDoubleArray;]Lcom/android/server/power/stats/MobileRadioPowerCalculator;Lcom/android/server/power/stats/MobileRadioPowerCalculator;
+HPLcom/android/server/power/stats/BatteryStatsImpl;->notePhoneDataConnectionStateLocked(IZIIIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;
+HPLcom/android/server/power/stats/BatteryStatsImpl;->notePhoneSignalStrengthLocked(ILandroid/util/SparseIntArray;JJ)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;
+HPLcom/android/server/power/stats/BatteryStatsImpl;->notePhoneSignalStrengthLocked(Landroid/telephony/SignalStrength;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/telephony/SignalStrength;Landroid/telephony/SignalStrength;]Landroid/telephony/CellSignalStrength;Landroid/telephony/CellSignalStrengthWcdma;
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteProcessStartLocked(Ljava/lang/String;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteScreenStateLocked(IIJJJ)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStartSensorLocked(IIJJ)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStartSensorLocked(IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStartWakeFromSourceLocked(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/WorkSource;Landroid/os/WorkSource;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStartWakeLocked(IILandroid/os/WorkSource$WorkChain;Ljava/lang/String;Ljava/lang/String;IZJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/PowerStatsUidResolver;Lcom/android/server/power/stats/PowerStatsUidResolver;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStopSensorLocked(IIJJ)V
-HPLcom/android/server/power/stats/BatteryStatsImpl;->noteStopWakeFromSourceLocked(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/WorkSource;Landroid/os/WorkSource;
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStopSensorLocked(IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStopWakeFromSourceLocked(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/WorkSource;Landroid/os/WorkSource;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStopWakeLocked(IILandroid/os/WorkSource$WorkChain;Ljava/lang/String;Ljava/lang/String;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteUidProcessStateLocked(IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteUserActivityLocked(IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;
-HPLcom/android/server/power/stats/BatteryStatsImpl;->noteWakeupReasonLocked(Ljava/lang/String;JJ)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteWakupAlarmLocked(Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;JJ)V
-HPLcom/android/server/power/stats/BatteryStatsImpl;->noteWifiRadioPowerState(IJIJJ)V
+HPLcom/android/server/power/stats/BatteryStatsImpl;->noteWakeupReasonLocked(Ljava/lang/String;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteWakupAlarmLocked(Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/WorkSource;Landroid/os/WorkSource;
+HPLcom/android/server/power/stats/BatteryStatsImpl;->noteWifiRadioPowerState(IJIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->pullPendingStateUpdatesLocked()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->readDailyItemTagDetailsLocked(Lcom/android/modules/utils/TypedXmlPullParser;Landroid/os/BatteryStats$DailyItem;ZLjava/lang/String;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->readDailyItemTagLocked(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->readDailyItemsLocked(Lcom/android/modules/utils/TypedXmlPullParser;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->readDailyStatsLocked()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->readKernelUidCpuActiveTimesLocked(Z)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->readKernelUidCpuClusterTimesLocked(ZLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->readKernelUidCpuFreqTimesLocked(Ljava/util/ArrayList;ZZLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;]Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/CpuScalingPolicies;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->readKernelUidCpuFreqTimesLocked(Ljava/util/ArrayList;ZZLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;]Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/CpuScalingPolicies;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->readKernelUidCpuTimesLocked(Ljava/util/ArrayList;Landroid/util/SparseLongArray;Z)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->readLocked()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->readSummaryFromParcel(Landroid/os/Parcel;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->recordDailyStatsIfNeededLocked(ZJ)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->recordHistoryEventLocked(JJILjava/lang/String;I)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->recordHistoryEventLocked(JJILjava/lang/String;I)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->reportChangesToStatsLog(III)V+]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;
 HPLcom/android/server/power/stats/BatteryStatsImpl;->requestWakelockCpuUpdate()V+]Lcom/android/server/power/stats/BatteryStatsImpl$ExternalStatsSync;Lcom/android/server/power/stats/BatteryExternalStatsWorker;
 HPLcom/android/server/power/stats/BatteryStatsImpl;->resetIfNotNull(Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;ZJ)Z+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;megamorphic_types
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->saveBatteryUsageStatsOnReset(Lcom/android/server/power/stats/BatteryUsageStatsProvider;Lcom/android/server/power/stats/PowerStatsStore;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->setBatteryStateLocked(IIIIIIIIJJJJ)V+]Landroid/os/Handler;Lcom/android/server/power/stats/BatteryStatsImpl$MyHandler;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/BatteryStats$LevelStepTracker;Landroid/os/BatteryStats$LevelStepTracker;]Lcom/android/server/power/stats/BatteryStatsImpl$ExternalStatsSync;Lcom/android/server/power/stats/BatteryExternalStatsWorker;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->setCallback(Lcom/android/server/power/stats/BatteryStatsImpl$BatteryCallback;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->setDisplayCountLocked(I)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->setExternalStatsSyncLocked(Lcom/android/server/power/stats/BatteryStatsImpl$ExternalStatsSync;)V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->setRadioScanningTimeoutLocked(J)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->setChargingLocked(Z)Z+]Landroid/os/Handler;Lcom/android/server/power/stats/BatteryStatsImpl$MyHandler;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->trackPerProcStateCpuTimes()Z
-HPLcom/android/server/power/stats/BatteryStatsImpl;->updateAllPhoneStateLocked(IIIJJ)V
-HPLcom/android/server/power/stats/BatteryStatsImpl;->updateBluetoothStateLocked(Landroid/bluetooth/BluetoothActivityEnergyInfo;JJJ)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$BluetoothActivityInfoCache;Lcom/android/server/power/stats/BatteryStatsImpl$BluetoothActivityInfoCache;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Landroid/bluetooth/BluetoothActivityEnergyInfo;Landroid/bluetooth/BluetoothActivityEnergyInfo;]Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/PowerProfile;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/bluetooth/UidTraffic;Landroid/bluetooth/UidTraffic;
+HPLcom/android/server/power/stats/BatteryStatsImpl;->updateAllPhoneStateLocked(IIIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;
+HPLcom/android/server/power/stats/BatteryStatsImpl;->updateBluetoothStateLocked(Landroid/bluetooth/BluetoothActivityEnergyInfo;JJJ)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Landroid/bluetooth/UidTraffic;Landroid/bluetooth/UidTraffic;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$BluetoothActivityInfoCache;Lcom/android/server/power/stats/BatteryStatsImpl$BluetoothActivityInfoCache;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Landroid/bluetooth/BluetoothActivityEnergyInfo;Landroid/bluetooth/BluetoothActivityEnergyInfo;]Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/PowerProfile;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateClusterSpeedTimes(Landroid/util/SparseLongArray;ZLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/CpuScalingPolicies;]Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/internal/os/KernelCpuSpeedReader;Lcom/android/internal/os/KernelCpuSpeedReader;
 HPLcom/android/server/power/stats/BatteryStatsImpl;->updateCpuEnergyConsumerStatsLocked([JLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateCpuTimeLocked(ZZ[J)V
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateCpuTimeLocked(ZZ[J)V+]Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/CpuScalingPolicies;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidUserSysTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidUserSysTimeReader;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidClusterTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidClusterTimeReader;]Lcom/android/internal/os/KernelCpuSpeedReader;Lcom/android/internal/os/KernelCpuSpeedReader;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidActiveTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidActiveTimeReader;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateCpuTimesForAllUids()V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/internal/os/LongArrayMultiStateCounter;Lcom/android/internal/os/LongArrayMultiStateCounter;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;]Lcom/android/internal/os/KernelSingleUidTimeReader;Lcom/android/internal/os/KernelSingleUidTimeReader;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateDailyDeadlineLocked()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateDisplayEnergyConsumerStatsLocked([J[IJ)V+]Landroid/util/SparseDoubleArray;Landroid/util/SparseDoubleArray;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateKernelMemoryBandwidthLocked(J)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateKernelWakelocksLocked(J)V+]Lcom/android/server/power/stats/KernelWakelockReader;Lcom/android/server/power/stats/KernelWakelockReader;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Ljava/util/HashMap;Ljava/util/HashMap;,Lcom/android/server/power/stats/KernelWakelockStats;]Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/Set;Ljava/util/HashMap$EntrySet;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateProcStateCpuTimesLocked(IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/internal/os/LongArrayMultiStateCounter;Lcom/android/internal/os/LongArrayMultiStateCounter;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;]Lcom/android/internal/os/KernelSingleUidTimeReader;Lcom/android/internal/os/KernelSingleUidTimeReader;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateRailStatsLocked()V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateRpmStatsLocked(J)V+]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateSystemServerThreadStats()V
 HPLcom/android/server/power/stats/BatteryStatsImpl;->updateSystemServiceCallStats()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateTimeBasesLocked(ZIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/power/stats/BatteryStatsImpl;->updateWifiState(Landroid/os/connectivity/WifiActivityEnergyInfo;JJJLandroid/app/usage/NetworkStatsManager;)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Lcom/android/internal/os/RailStats;Lcom/android/internal/os/RailStats;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Landroid/os/connectivity/WifiActivityEnergyInfo;Landroid/os/connectivity/WifiActivityEnergyInfo;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;,Ljava/util/ArrayList$Itr;]Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/PowerProfile;]Lcom/android/server/power/stats/BatteryStatsImpl$NetworkStatsDelta;Lcom/android/server/power/stats/BatteryStatsImpl$NetworkStatsDelta;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->writeAsyncLocked()V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->writeHistoryLocked()V
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateWifiState(Landroid/os/connectivity/WifiActivityEnergyInfo;JJJLandroid/app/usage/NetworkStatsManager;)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/internal/os/RailStats;Lcom/android/internal/os/RailStats;]Lcom/android/server/power/stats/BatteryStatsImpl$NetworkStatsDelta;Lcom/android/server/power/stats/BatteryStatsImpl$NetworkStatsDelta;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Landroid/os/connectivity/WifiActivityEnergyInfo;Landroid/os/connectivity/WifiActivityEnergyInfo;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;,Landroid/net/NetworkStats$1;]Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/PowerProfile;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->writeParcelToFileLocked(Landroid/os/Parcel;Landroid/util/AtomicFile;)V
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->writeStatsLocked()V
-HSPLcom/android/server/power/stats/BatteryStatsImpl;->writeSummaryToParcel(Landroid/os/Parcel;Z)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$Counter;Lcom/android/server/power/stats/BatteryStatsImpl$Counter;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;]Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;]Lcom/android/internal/os/MonotonicClock;Lcom/android/internal/os/MonotonicClock;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;,Landroid/util/MapCollections$MapIterator;]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;,Landroid/util/MapCollections$MapIterator;]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/BatteryStats$LevelStepTracker;Landroid/os/BatteryStats$LevelStepTracker;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;,Ljava/util/HashMap$EntrySet;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$2;
+HSPLcom/android/server/power/stats/BatteryStatsImpl;->writeSummaryToParcel(Landroid/os/Parcel;Z)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$Counter;Lcom/android/server/power/stats/BatteryStatsImpl$Counter;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;]Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;]Lcom/android/internal/os/MonotonicClock;Lcom/android/internal/os/MonotonicClock;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;,Landroid/util/MapCollections$MapIterator;]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;,Landroid/util/MapCollections$MapIterator;]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/BatteryStats$LevelStepTracker;Landroid/os/BatteryStats$LevelStepTracker;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;,Ljava/util/HashMap$EntrySet;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$2;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;
 HSPLcom/android/server/power/stats/BatteryStatsImpl;->writeSyncLocked()V
-HSPLcom/android/server/power/stats/BatteryUsageStatsProvider;-><init>(Landroid/content/Context;Lcom/android/server/power/stats/PowerStatsExporter;Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/server/power/stats/PowerStatsStore;Lcom/android/internal/os/Clock;)V
 HPLcom/android/server/power/stats/BatteryUsageStatsProvider;->getCurrentBatteryUsageStats(Lcom/android/server/power/stats/BatteryStatsImpl;Landroid/os/BatteryUsageStatsQuery;J)Landroid/os/BatteryUsageStats;+]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/power/stats/PowerCalculator;megamorphic_types]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Lcom/android/server/power/stats/BatteryUsageStatsProvider;Lcom/android/server/power/stats/BatteryUsageStatsProvider;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/BatteryUsageStatsProvider;->getProcessForegroundTimeMs(Landroid/os/BatteryStats$Uid;J)J+]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
 HPLcom/android/server/power/stats/BatteryUsageStatsProvider;->verify(Landroid/os/BatteryUsageStats;)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/BatteryUsageStats;Landroid/os/BatteryUsageStats;]Landroid/os/UidBatteryConsumer;Landroid/os/UidBatteryConsumer;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/power/stats/BluetoothPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Lcom/android/server/power/stats/BluetoothPowerCalculator;Lcom/android/server/power/stats/BluetoothPowerCalculator;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/BluetoothPowerCalculator;->calculateApp(Landroid/os/UidBatteryConsumer$Builder;Lcom/android/server/power/stats/BluetoothPowerCalculator$PowerAndDuration;Landroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Lcom/android/server/power/stats/BluetoothPowerCalculator;Lcom/android/server/power/stats/BluetoothPowerCalculator;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
-HPLcom/android/server/power/stats/BluetoothPowerCalculator;->calculatePowerAndDuration(Landroid/os/BatteryStats$Uid;IJLandroid/os/BatteryStats$ControllerActivityCounter;ZLcom/android/server/power/stats/BluetoothPowerCalculator$PowerAndDuration;)V+]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$1;]Lcom/android/server/power/stats/BluetoothPowerCalculator;Lcom/android/server/power/stats/BluetoothPowerCalculator;]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;
+HPLcom/android/server/power/stats/BluetoothPowerCalculator;->calculatePowerAndDuration(Landroid/os/BatteryStats$Uid;IJLandroid/os/BatteryStats$ControllerActivityCounter;ZLcom/android/server/power/stats/BluetoothPowerCalculator$PowerAndDuration;)V+]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$1;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Lcom/android/server/power/stats/BluetoothPowerCalculator;Lcom/android/server/power/stats/BluetoothPowerCalculator;
 HPLcom/android/server/power/stats/CameraPowerCalculator;->calculateApp(Landroid/os/UidBatteryConsumer$Builder;Landroid/os/BatteryStats$Uid;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
-HSPLcom/android/server/power/stats/CpuAggregatedPowerStatsProcessor;-><clinit>()V
-HSPLcom/android/server/power/stats/CpuAggregatedPowerStatsProcessor;-><init>(Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/CpuScalingPolicies;)V
 HPLcom/android/server/power/stats/CpuPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/CpuScalingPolicies;]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Lcom/android/server/power/stats/CpuPowerCalculator;Lcom/android/server/power/stats/CpuPowerCalculator;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/CpuPowerCalculator;->calculateApp(Landroid/os/UidBatteryConsumer$Builder;Landroid/os/BatteryStats$Uid;Landroid/os/BatteryUsageStatsQuery;Lcom/android/server/power/stats/CpuPowerCalculator$Result;[Landroid/os/BatteryConsumer$Key;)V+]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Lcom/android/server/power/stats/CpuPowerCalculator;Lcom/android/server/power/stats/CpuPowerCalculator;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/CpuPowerCalculator;->calculateEnergyConsumptionPerProcessState(Landroid/os/UidBatteryConsumer$Builder;Landroid/os/BatteryStats$Uid;[Landroid/os/BatteryConsumer$Key;)V+]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/CpuPowerCalculator;->calculateModeledPowerPerProcessState(Landroid/os/UidBatteryConsumer$Builder;Landroid/os/BatteryStats$Uid;[Landroid/os/BatteryConsumer$Key;Lcom/android/server/power/stats/CpuPowerCalculator$Result;)V+]Lcom/android/server/power/stats/CpuPowerCalculator;Lcom/android/server/power/stats/CpuPowerCalculator;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
-HPLcom/android/server/power/stats/CpuPowerCalculator;->calculatePerCpuClusterPowerMah(IJ)D
+HPLcom/android/server/power/stats/CpuPowerCalculator;->calculatePerCpuClusterPowerMah(IJ)D+]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;
 HPLcom/android/server/power/stats/CpuPowerCalculator;->calculatePerCpuFreqPowerMah(IIJ)D+]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;
 HPLcom/android/server/power/stats/CpuPowerCalculator;->calculatePowerAndDuration(Landroid/os/BatteryStats$Uid;IJILcom/android/server/power/stats/CpuPowerCalculator$Result;)V+]Landroid/os/BatteryStats$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;]Ljava/lang/String;Ljava/lang/String;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/power/stats/CpuPowerCalculator;Lcom/android/server/power/stats/CpuPowerCalculator;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
 HPLcom/android/server/power/stats/CpuPowerCalculator;->calculateUidModeledPowerMah(Landroid/os/BatteryStats$Uid;J[J[J)D+]Lcom/android/server/power/stats/CpuPowerCalculator;Lcom/android/server/power/stats/CpuPowerCalculator;]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;
-HSPLcom/android/server/power/stats/CpuPowerStatsCollector$$ExternalSyntheticLambda1;-><init>()V
-HSPLcom/android/server/power/stats/CpuPowerStatsCollector$KernelCpuStatsReader;-><init>()V
-HSPLcom/android/server/power/stats/CpuPowerStatsCollector;-><init>(Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/PowerProfile;Landroid/os/Handler;Lcom/android/server/power/stats/CpuPowerStatsCollector$KernelCpuStatsReader;Lcom/android/server/power/stats/PowerStatsUidResolver;Ljava/util/function/Supplier;Ljava/util/function/IntSupplier;JLcom/android/internal/os/Clock;II)V
-HSPLcom/android/server/power/stats/CpuPowerStatsCollector;-><init>(Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/PowerProfile;Lcom/android/server/power/stats/PowerStatsUidResolver;Ljava/util/function/IntSupplier;Landroid/os/Handler;J)V
 HPLcom/android/server/power/stats/CustomEnergyConsumerPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Lcom/android/server/power/stats/CustomEnergyConsumerPowerCalculator;Lcom/android/server/power/stats/CustomEnergyConsumerPowerCalculator;]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/CustomEnergyConsumerPowerCalculator;->calculateApp(Landroid/os/UidBatteryConsumer$Builder;Landroid/os/BatteryStats$Uid;[D)[D+]Lcom/android/server/power/stats/CustomEnergyConsumerPowerCalculator;Lcom/android/server/power/stats/CustomEnergyConsumerPowerCalculator;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/CustomEnergyConsumerPowerCalculator;->uCtoMah([J)[D
 HSPLcom/android/server/power/stats/EnergyConsumerSnapshot$EnergyConsumerDeltaData;-><init>()V
-HSPLcom/android/server/power/stats/EnergyConsumerSnapshot;->updateAndGetDelta([Landroid/hardware/power/stats/EnergyConsumerResult;I)Lcom/android/server/power/stats/EnergyConsumerSnapshot$EnergyConsumerDeltaData;
-HSPLcom/android/server/power/stats/EnergyConsumerSnapshot;->updateAndGetDeltaForTypeOther(Landroid/hardware/power/stats/EnergyConsumer;[Landroid/hardware/power/stats/EnergyConsumerAttribution;I)Landroid/util/SparseLongArray;+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/power/stats/EnergyConsumerSnapshot;Lcom/android/server/power/stats/EnergyConsumerSnapshot;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/power/stats/FlashlightPowerCalculator;->calculateApp(Landroid/os/UidBatteryConsumer$Builder;Landroid/os/BatteryStats$Uid;JJLandroid/os/BatteryUsageStatsQuery;)V
+HSPLcom/android/server/power/stats/EnergyConsumerSnapshot;->updateAndGetDelta([Landroid/hardware/power/stats/EnergyConsumerResult;I)Lcom/android/server/power/stats/EnergyConsumerSnapshot$EnergyConsumerDeltaData;+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/power/stats/EnergyConsumerSnapshot;->updateAndGetDeltaForTypeOther(Landroid/hardware/power/stats/EnergyConsumer;[Landroid/hardware/power/stats/EnergyConsumerAttribution;I)Landroid/util/SparseLongArray;+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/power/stats/EnergyConsumerSnapshot;Lcom/android/server/power/stats/EnergyConsumerSnapshot;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HPLcom/android/server/power/stats/FlashlightPowerCalculator;->calculateApp(Landroid/os/UidBatteryConsumer$Builder;Landroid/os/BatteryStats$Uid;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;
 HPLcom/android/server/power/stats/GnssPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Lcom/android/server/power/stats/GnssPowerCalculator;Lcom/android/server/power/stats/GnssPowerCalculator;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
-HSPLcom/android/server/power/stats/KernelWakelockReader;-><clinit>()V
-HSPLcom/android/server/power/stats/KernelWakelockReader;-><init>()V
-HSPLcom/android/server/power/stats/KernelWakelockReader;->getWakelockStatsFromSystemSuspend(Lcom/android/server/power/stats/KernelWakelockStats;)Lcom/android/server/power/stats/KernelWakelockStats;
-HSPLcom/android/server/power/stats/KernelWakelockReader;->readKernelWakelockStats(Lcom/android/server/power/stats/KernelWakelockStats;)Lcom/android/server/power/stats/KernelWakelockStats;
+HSPLcom/android/server/power/stats/KernelWakelockReader;->getWakelockStatsFromSystemSuspend(Lcom/android/server/power/stats/KernelWakelockStats;)Lcom/android/server/power/stats/KernelWakelockStats;+]Lcom/android/server/power/stats/KernelWakelockReader;Lcom/android/server/power/stats/KernelWakelockReader;]Landroid/system/suspend/internal/ISuspendControlServiceInternal;Landroid/system/suspend/internal/ISuspendControlServiceInternal$Stub$Proxy;
+HSPLcom/android/server/power/stats/KernelWakelockReader;->readKernelWakelockStats(Lcom/android/server/power/stats/KernelWakelockStats;)Lcom/android/server/power/stats/KernelWakelockStats;+]Lcom/android/server/power/stats/KernelWakelockReader;Lcom/android/server/power/stats/KernelWakelockReader;
 HSPLcom/android/server/power/stats/KernelWakelockReader;->removeOldStats(Lcom/android/server/power/stats/KernelWakelockStats;)Lcom/android/server/power/stats/KernelWakelockStats;+]Ljava/util/HashMap;Lcom/android/server/power/stats/KernelWakelockStats;]Ljava/util/Collection;Ljava/util/HashMap$Values;]Ljava/util/Iterator;Ljava/util/HashMap$ValueIterator;
 HSPLcom/android/server/power/stats/KernelWakelockReader;->updateVersion(Lcom/android/server/power/stats/KernelWakelockStats;)Lcom/android/server/power/stats/KernelWakelockStats;
 HSPLcom/android/server/power/stats/KernelWakelockReader;->updateWakelockStats([Landroid/system/suspend/internal/WakeLockInfo;Lcom/android/server/power/stats/KernelWakelockStats;)Lcom/android/server/power/stats/KernelWakelockStats;+]Ljava/util/HashMap;Lcom/android/server/power/stats/KernelWakelockStats;
-HSPLcom/android/server/power/stats/KernelWakelockReader;->waitForSuspendControlService()Landroid/system/suspend/internal/ISuspendControlServiceInternal;
-HSPLcom/android/server/power/stats/KernelWakelockStats$Entry;-><init>(IJJI)V
-HSPLcom/android/server/power/stats/KernelWakelockStats;-><init>()V
-HPLcom/android/server/power/stats/MobileRadioPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Lcom/android/server/power/stats/MobileRadioPowerCalculator;Lcom/android/server/power/stats/MobileRadioPowerCalculator;]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Landroid/util/LongArrayQueue;Landroid/util/LongArrayQueue;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
+HPLcom/android/server/power/stats/MobileRadioPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Lcom/android/server/power/stats/MobileRadioPowerCalculator;Lcom/android/server/power/stats/MobileRadioPowerCalculator;]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$1;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/util/LongArrayQueue;Landroid/util/LongArrayQueue;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/PowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Lcom/android/server/power/stats/PowerCalculator;Lcom/android/server/power/stats/FlashlightPowerCalculator;,Lcom/android/server/power/stats/CameraPowerCalculator;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/PowerCalculator;->getPowerModel(JLandroid/os/BatteryUsageStatsQuery;)I+]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;
 HPLcom/android/server/power/stats/PowerCalculator;->uCtoMah(J)D
-HSPLcom/android/server/power/stats/PowerStatsAggregator;-><init>(Lcom/android/server/power/stats/AggregatedPowerStatsConfig;Lcom/android/internal/os/BatteryStatsHistory;)V
-HSPLcom/android/server/power/stats/PowerStatsCollector;-><init>(Landroid/os/Handler;JLcom/android/internal/os/Clock;)V
-HSPLcom/android/server/power/stats/PowerStatsCollector;->addConsumer(Ljava/util/function/Consumer;)V
-HSPLcom/android/server/power/stats/PowerStatsExporter;-><clinit>()V
-HSPLcom/android/server/power/stats/PowerStatsExporter;-><init>(Lcom/android/server/power/stats/PowerStatsStore;Lcom/android/server/power/stats/PowerStatsAggregator;)V
-HSPLcom/android/server/power/stats/PowerStatsExporter;-><init>(Lcom/android/server/power/stats/PowerStatsStore;Lcom/android/server/power/stats/PowerStatsAggregator;J)V
-HSPLcom/android/server/power/stats/PowerStatsScheduler;-><clinit>()V
-HSPLcom/android/server/power/stats/PowerStatsScheduler;-><init>(Ljava/lang/Runnable;Lcom/android/server/power/stats/PowerStatsAggregator;JJLcom/android/server/power/stats/PowerStatsStore;Lcom/android/server/power/stats/PowerStatsScheduler$AlarmScheduler;Lcom/android/internal/os/Clock;Lcom/android/internal/os/MonotonicClock;Ljava/util/function/Supplier;Landroid/os/Handler;)V
-HSPLcom/android/server/power/stats/PowerStatsStore$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/power/stats/PowerStatsStore;)V
-HSPLcom/android/server/power/stats/PowerStatsStore$$ExternalSyntheticLambda1;->run()V
-HSPLcom/android/server/power/stats/PowerStatsStore$DefaultSectionReader;-><init>(Lcom/android/server/power/stats/AggregatedPowerStatsConfig;)V
-HSPLcom/android/server/power/stats/PowerStatsStore;->$r8$lambda$B2PF4qXDAYWwxqhYeVyGoe0li4E(Lcom/android/server/power/stats/PowerStatsStore;)V
-HSPLcom/android/server/power/stats/PowerStatsStore;-><init>(Ljava/io/File;JLandroid/os/Handler;Lcom/android/server/power/stats/PowerStatsSpan$SectionReader;)V
-HSPLcom/android/server/power/stats/PowerStatsStore;-><init>(Ljava/io/File;Landroid/os/Handler;Lcom/android/server/power/stats/AggregatedPowerStatsConfig;)V
-HSPLcom/android/server/power/stats/PowerStatsStore;->maybeClearLegacyStore()V
-HSPLcom/android/server/power/stats/PowerStatsUidResolver;-><init>()V
-HSPLcom/android/server/power/stats/PowerStatsUidResolver;->addListener(Lcom/android/server/power/stats/PowerStatsUidResolver$Listener;)V
 HSPLcom/android/server/power/stats/PowerStatsUidResolver;->mapUid(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HPLcom/android/server/power/stats/ScreenPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Lcom/android/server/power/stats/ScreenPowerCalculator;Lcom/android/server/power/stats/ScreenPowerCalculator;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
+HPLcom/android/server/power/stats/SensorPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Lcom/android/server/power/stats/SensorPowerCalculator;Lcom/android/server/power/stats/SensorPowerCalculator;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/SensorPowerCalculator;->calculateApp(Landroid/os/UidBatteryConsumer$Builder;Landroid/os/BatteryStats$Uid;J)D+]Lcom/android/server/power/stats/SensorPowerCalculator;Lcom/android/server/power/stats/SensorPowerCalculator;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
-HSPLcom/android/server/power/stats/SystemServerCpuThreadReader$SystemServiceCpuThreadTimes;-><init>()V
-HSPLcom/android/server/power/stats/SystemServerCpuThreadReader;-><init>(Lcom/android/internal/os/KernelSingleProcessCpuThreadReader;)V
+HPLcom/android/server/power/stats/SensorPowerCalculator;->calculateDuration(Landroid/os/BatteryStats$Uid;JI)J+]Landroid/os/BatteryStats$Uid$Sensor;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Sensor;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;
+HPLcom/android/server/power/stats/SensorPowerCalculator;->calculatePowerMah(Landroid/os/BatteryStats$Uid;JI)D+]Landroid/hardware/Sensor;Landroid/hardware/Sensor;]Landroid/os/BatteryStats$Uid$Sensor;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Sensor;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;
 HPLcom/android/server/power/stats/SystemServerCpuThreadReader;->readAbsolute()Lcom/android/server/power/stats/SystemServerCpuThreadReader$SystemServiceCpuThreadTimes;+]Lcom/android/internal/os/KernelSingleProcessCpuThreadReader;Lcom/android/internal/os/KernelSingleProcessCpuThreadReader;
 HSPLcom/android/server/power/stats/SystemServerCpuThreadReader;->readDelta()Lcom/android/server/power/stats/SystemServerCpuThreadReader$SystemServiceCpuThreadTimes;+]Lcom/android/internal/os/KernelSingleProcessCpuThreadReader;Lcom/android/internal/os/KernelSingleProcessCpuThreadReader;
 HPLcom/android/server/power/stats/UsageBasedPowerEstimator;->calculateDuration(Landroid/os/BatteryStats$Timer;JI)J+]Landroid/os/BatteryStats$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
@@ -9187,87 +6778,43 @@
 HPLcom/android/server/power/stats/WakelockPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Lcom/android/server/power/stats/WakelockPowerCalculator;Lcom/android/server/power/stats/WakelockPowerCalculator;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
 HPLcom/android/server/power/stats/WakelockPowerCalculator;->calculateApp(Lcom/android/server/power/stats/WakelockPowerCalculator$PowerAndDuration;Landroid/os/BatteryStats$Uid;JI)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BatteryStats$Uid$Wakelock;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;
 HPLcom/android/server/power/stats/WifiPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Lcom/android/server/power/stats/WifiPowerCalculator;Lcom/android/server/power/stats/WifiPowerCalculator;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;
-HPLcom/android/server/power/stats/WifiPowerCalculator;->calculateApp(Lcom/android/server/power/stats/WifiPowerCalculator$PowerDurationAndTraffic;Landroid/os/BatteryStats$Uid;IJIZJ)V+]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/WifiPowerCalculator;Lcom/android/server/power/stats/WifiPowerCalculator;]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$1;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;
-HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/power/stats/wakeups/CpuWakeupStats;)V
-HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats$Config;-><clinit>()V
-HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats$Config;-><init>()V
-HPLcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;-><init>(I[Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup$IrqDevice;JJLandroid/util/SparseBooleanArray;)V
+HPLcom/android/server/power/stats/WifiPowerCalculator;->calculateApp(Lcom/android/server/power/stats/WifiPowerCalculator$PowerDurationAndTraffic;Landroid/os/BatteryStats$Uid;IJIZJ)V+]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$1;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Lcom/android/server/power/stats/WifiPowerCalculator;Lcom/android/server/power/stats/WifiPowerCalculator;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;
 HPLcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;->parseWakeup(Ljava/lang/String;JJLcom/android/server/power/stats/wakeups/IrqDeviceMap;)Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;+]Lcom/android/server/power/stats/wakeups/IrqDeviceMap;Lcom/android/server/power/stats/wakeups/IrqDeviceMap;]Ljava/lang/String;Ljava/lang/String;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/regex/Pattern;Ljava/util/regex/Pattern;]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;
-HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;-><init>(Ljava/util/function/LongSupplier;)V
 HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;->recordActivity(IJLandroid/util/SparseIntArray;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Ljava/util/function/LongSupplier;Lcom/android/server/power/stats/wakeups/CpuWakeupStats$$ExternalSyntheticLambda0;
-HPLcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;->removeBetween(IJJ)Landroid/util/SparseIntArray;
-HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats;-><clinit>()V
-HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats;-><init>(Landroid/content/Context;ILandroid/os/Handler;)V
+HPLcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;->removeBetween(IJJ)Landroid/util/SparseIntArray;+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
 HPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->attemptAttributionFor(Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;Lcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;
-HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->attemptAttributionWith(IJLandroid/util/SparseIntArray;)Z
+HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->attemptAttributionWith(IJLandroid/util/SparseIntArray;)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
 HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->lambda$new$0()J
 HPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->logWakeupAttribution(Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;)V+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
 HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->noteUidProcessState(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->noteWakeupTimeAndReason(JJLjava/lang/String;)V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/power/stats/wakeups/CpuWakeupStats;Lcom/android/server/power/stats/wakeups/CpuWakeupStats;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
 HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->noteWakingActivity(IJ[I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/power/stats/wakeups/CpuWakeupStats;Lcom/android/server/power/stats/wakeups/CpuWakeupStats;]Lcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;Lcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;
-HPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->stringToKnownSubsystem(Ljava/lang/String;)I
-HSPLcom/android/server/power/stats/wakeups/IrqDeviceMap;-><clinit>()V
-HSPLcom/android/server/power/stats/wakeups/IrqDeviceMap;-><init>(Landroid/content/res/XmlResourceParser;)V
-HSPLcom/android/server/power/stats/wakeups/IrqDeviceMap;->getInstance(Landroid/content/Context;I)Lcom/android/server/power/stats/wakeups/IrqDeviceMap;
-HPLcom/android/server/powerstats/BatteryTrigger$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->stringToKnownSubsystem(Ljava/lang/String;)I+]Ljava/lang/Object;Ljava/lang/String;
+HPLcom/android/server/powerstats/BatteryTrigger$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;
 HPLcom/android/server/powerstats/PowerStatsDataStorage;->write([B)V
-HSPLcom/android/server/powerstats/PowerStatsHALWrapper$PowerStatsHAL20WrapperImpl;-><init>()V
-HSPLcom/android/server/powerstats/PowerStatsHALWrapper$PowerStatsHAL20WrapperImpl;->isInitialized()Z
-HPLcom/android/server/powerstats/PowerStatsHALWrapper$PowerStatsHAL20WrapperImpl;->readEnergyMeter([I)[Landroid/hardware/power/stats/EnergyMeasurement;
-HSPLcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache;-><init>()V
-HSPLcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache;-><init>(Lcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache-IA;)V
+HPLcom/android/server/powerstats/PowerStatsHALWrapper$PowerStatsHAL20WrapperImpl;->readEnergyMeter([I)[Landroid/hardware/power/stats/EnergyMeasurement;+]Ljava/util/function/Supplier;Lcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache;]Landroid/hardware/power/stats/IPowerStats;Landroid/hardware/power/stats/IPowerStats$Stub$Proxy;
 HSPLcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache;->get()Landroid/hardware/power/stats/IPowerStats;
-HSPLcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache;->get()Ljava/lang/Object;
-HSPLcom/android/server/powerstats/PowerStatsHALWrapper;-><clinit>()V
-HSPLcom/android/server/powerstats/PowerStatsHALWrapper;->getPowerStatsHalImpl()Lcom/android/server/powerstats/PowerStatsHALWrapper$IPowerStatsHALWrapper;
+HSPLcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache;->get()Ljava/lang/Object;+]Lcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache;Lcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache;
 HPLcom/android/server/powerstats/PowerStatsLogger;->handleMessage(Landroid/os/Message;)V
-HSPLcom/android/server/powerstats/PowerStatsService$1;-><init>(Lcom/android/server/powerstats/PowerStatsService;)V
-HSPLcom/android/server/powerstats/PowerStatsService$DeviceConfigListener;-><init>(Lcom/android/server/powerstats/PowerStatsService;)V
-HSPLcom/android/server/powerstats/PowerStatsService$DeviceConfigListener;-><init>(Lcom/android/server/powerstats/PowerStatsService;Lcom/android/server/powerstats/PowerStatsService$DeviceConfigListener-IA;)V
-HSPLcom/android/server/powerstats/PowerStatsService$Injector;-><init>()V
-HSPLcom/android/server/powerstats/PowerStatsService$Injector;->getClock()Lcom/android/internal/os/Clock;
-HSPLcom/android/server/powerstats/PowerStatsService$Injector;->getDeviceConfig()Landroid/provider/DeviceConfigInterface;
 HSPLcom/android/server/powerstats/PowerStatsService$Injector;->getPowerStatsHALWrapperImpl()Lcom/android/server/powerstats/PowerStatsHALWrapper$IPowerStatsHALWrapper;
 HPLcom/android/server/powerstats/PowerStatsService$LocalService$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/powerstats/PowerStatsService$LocalService;Ljava/util/concurrent/CompletableFuture;[I)V
-HSPLcom/android/server/powerstats/PowerStatsService$LocalService;-><init>(Lcom/android/server/powerstats/PowerStatsService;)V
-HSPLcom/android/server/powerstats/PowerStatsService$LocalService;-><init>(Lcom/android/server/powerstats/PowerStatsService;Lcom/android/server/powerstats/PowerStatsService$LocalService-IA;)V
 HSPLcom/android/server/powerstats/PowerStatsService$LocalService;->getEnergyConsumedAsync([I)Ljava/util/concurrent/CompletableFuture;
 HPLcom/android/server/powerstats/PowerStatsService$LocalService;->readEnergyMeterAsync([I)Ljava/util/concurrent/CompletableFuture;
 HSPLcom/android/server/powerstats/PowerStatsService;->-$$Nest$mgetHandler(Lcom/android/server/powerstats/PowerStatsService;)Landroid/os/Handler;
-HSPLcom/android/server/powerstats/PowerStatsService;-><clinit>()V
-HSPLcom/android/server/powerstats/PowerStatsService;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/powerstats/PowerStatsService;-><init>(Landroid/content/Context;Lcom/android/server/powerstats/PowerStatsService$Injector;)V
 HSPLcom/android/server/powerstats/PowerStatsService;->getHandler()Landroid/os/Handler;
-HSPLcom/android/server/powerstats/PowerStatsService;->getLooper()Landroid/os/Looper;
-HSPLcom/android/server/powerstats/PowerStatsService;->getPowerStatsHal()Lcom/android/server/powerstats/PowerStatsHALWrapper$IPowerStatsHALWrapper;
-HSPLcom/android/server/powerstats/PowerStatsService;->onBootPhase(I)V
-HSPLcom/android/server/powerstats/PowerStatsService;->onStart()V
-HPLcom/android/server/powerstats/PowerStatsService;->readEnergyMeterAsync(Ljava/util/concurrent/CompletableFuture;[I)V
-HPLcom/android/server/powerstats/ProtoStreamUtils$EnergyMeasurementUtils;->packProtoMessage([Landroid/hardware/power/stats/EnergyMeasurement;Landroid/util/proto/ProtoOutputStream;)V+]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;
+HPLcom/android/server/powerstats/PowerStatsService;->readEnergyMeterAsync(Ljava/util/concurrent/CompletableFuture;[I)V+]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;]Lcom/android/server/powerstats/PowerStatsHALWrapper$IPowerStatsHALWrapper;Lcom/android/server/powerstats/PowerStatsHALWrapper$PowerStatsHAL20WrapperImpl;
+HPLcom/android/server/powerstats/ProtoStreamUtils$EnergyConsumerResultUtils;->packProtoMessage([Landroid/hardware/power/stats/EnergyConsumerResult;Landroid/util/proto/ProtoOutputStream;Z)V+]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;
 HPLcom/android/server/powerstats/StatsPullAtomCallbackImpl;->pullOnDevicePowerMeasurement(ILjava/util/List;)I+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;]Landroid/power/PowerStatsInternal;Lcom/android/server/powerstats/PowerStatsService$LocalService;]Ljava/util/Map;Ljava/util/HashMap;
 HPLcom/android/server/powerstats/StatsPullAtomCallbackImpl;->pullSubsystemSleepState(ILjava/util/List;)I+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture;]Landroid/power/PowerStatsInternal;Lcom/android/server/powerstats/PowerStatsService$LocalService;]Ljava/util/Map;Ljava/util/HashMap;
 HPLcom/android/server/powerstats/TimerTrigger$2;->run()V
-HSPLcom/android/server/recoverysystem/RecoverySystemService$Injector;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/recoverysystem/RecoverySystemService$Injector;->getContext()Landroid/content/Context;
-HSPLcom/android/server/recoverysystem/RecoverySystemService$Lifecycle;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/recoverysystem/RecoverySystemService$Lifecycle;->onBootPhase(I)V
-HSPLcom/android/server/recoverysystem/RecoverySystemService$Lifecycle;->onStart()V
-HSPLcom/android/server/recoverysystem/RecoverySystemService$PreferencesManager;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/recoverysystem/RecoverySystemService;-><clinit>()V
-HSPLcom/android/server/recoverysystem/RecoverySystemService;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/recoverysystem/RecoverySystemService;-><init>(Landroid/content/Context;Lcom/android/server/recoverysystem/RecoverySystemService-IA;)V
-HSPLcom/android/server/recoverysystem/RecoverySystemService;-><init>(Lcom/android/server/recoverysystem/RecoverySystemService$Injector;)V
-HSPLcom/android/server/security/FileIntegrityService$1;-><init>(Lcom/android/server/security/FileIntegrityService;)V
-HSPLcom/android/server/security/FileIntegrityService;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/security/FileIntegrityService;->collectCertificate([B)V
-HSPLcom/android/server/security/FileIntegrityService;->loadAllCertificates()V
-HSPLcom/android/server/security/FileIntegrityService;->loadCertificatesFromDirectory(Ljava/nio/file/Path;)V
-HSPLcom/android/server/security/FileIntegrityService;->onStart()V
-HSPLcom/android/server/security/FileIntegrityService;->toCertificate([B)Ljava/security/cert/X509Certificate;
+HPLcom/android/server/security/KeyAttestationApplicationIdProviderService;->getKeyAttestationApplicationId(I)Landroid/security/keystore/KeyAttestationApplicationId;
+HPLcom/android/server/security/rkp/RemoteProvisioningRegistration;->getKey(ILandroid/security/rkp/IGetKeyCallback;)V
 HSPLcom/android/server/sensorprivacy/PersistedState$TypeUserSensor;-><init>(III)V
+HSPLcom/android/server/sensorprivacy/PersistedState$TypeUserSensor;->hashCode()I
 HSPLcom/android/server/sensorprivacy/PersistedState;->getState(III)Lcom/android/server/sensorprivacy/SensorState;
 HSPLcom/android/server/sensorprivacy/SensorPrivacyService$SensorPrivacyServiceImpl;->enforceObserveSensorPrivacyPermission()V
 HSPLcom/android/server/sensorprivacy/SensorPrivacyService$SensorPrivacyServiceImpl;->isToggleSensorPrivacyEnabled(II)Z
+HSPLcom/android/server/sensorprivacy/SensorPrivacyStateControllerImpl;->getStateLocked(III)Lcom/android/server/sensorprivacy/SensorState;
 HSPLcom/android/server/sensorprivacy/SensorState;-><init>(I)V
 HSPLcom/android/server/sensors/SensorService$ProximityListenerDelegate;->onProximityActive(Z)V
 HSPLcom/android/server/servicewatcher/CurrentUserServiceSupplier;->getServiceInfo()Lcom/android/server/servicewatcher/CurrentUserServiceSupplier$BoundServiceInfo;
@@ -9275,64 +6822,63 @@
 HPLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->isPathPrefixMatch([Ljava/lang/String;[Ljava/lang/String;)Z
 HPLcom/android/server/slice/SliceClientPermissions;->createFrom(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/slice/DirtyTracker;)Lcom/android/server/slice/SliceClientPermissions;
 HPLcom/android/server/slice/SliceClientPermissions;->getOrCreateAuthority(Lcom/android/server/slice/SlicePermissionManager$PkgUser;Lcom/android/server/slice/SlicePermissionManager$PkgUser;)Lcom/android/server/slice/SliceClientPermissions$SliceAuthority;
+HPLcom/android/server/slice/SliceClientPermissions;->grantUri(Landroid/net/Uri;Lcom/android/server/slice/SlicePermissionManager$PkgUser;)V+]Lcom/android/server/slice/SlicePermissionManager$PkgUser;Lcom/android/server/slice/SlicePermissionManager$PkgUser;]Lcom/android/server/slice/SliceClientPermissions$SliceAuthority;Lcom/android/server/slice/SliceClientPermissions$SliceAuthority;]Lcom/android/server/slice/SliceClientPermissions;Lcom/android/server/slice/SliceClientPermissions;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;
 HPLcom/android/server/slice/SliceClientPermissions;->hasPermission(Landroid/net/Uri;I)Z
-HPLcom/android/server/slice/SliceManagerService$PackageMatchingCache;->matches(Ljava/lang/String;)Z
-HPLcom/android/server/slice/SliceManagerService;->checkSlicePermissionInternal(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;II[Ljava/lang/String;)I
+HPLcom/android/server/slice/SliceManagerService$$ExternalSyntheticLambda2;->get()Ljava/lang/Object;
+HPLcom/android/server/slice/SliceManagerService$PackageMatchingCache;->matches(Ljava/lang/String;)Z+]Ljava/util/function/Supplier;Lcom/android/server/slice/SliceManagerService$$ExternalSyntheticLambda0;,Lcom/android/server/slice/SliceManagerService$$ExternalSyntheticLambda2;
+HPLcom/android/server/slice/SliceManagerService;->checkSlicePermissionInternal(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;II[Ljava/lang/String;)I+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/slice/SlicePermissionManager;Lcom/android/server/slice/SlicePermissionManager;
 HPLcom/android/server/slice/SliceManagerService;->enforceAccess(Ljava/lang/String;Landroid/net/Uri;)V
-HPLcom/android/server/slice/SliceManagerService;->getProviderPkg(Landroid/net/Uri;I)Ljava/lang/String;
-HPLcom/android/server/slice/SliceManagerService;->grantSlicePermission(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)V
+HPLcom/android/server/slice/SliceManagerService;->enforceOwner(Ljava/lang/String;Landroid/net/Uri;I)V
+HPLcom/android/server/slice/SliceManagerService;->getProviderPkg(Landroid/net/Uri;I)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;
+HPLcom/android/server/slice/SliceManagerService;->grantSlicePermission(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)V+]Lcom/android/server/slice/SlicePermissionManager;Lcom/android/server/slice/SlicePermissionManager;
 HPLcom/android/server/slice/SliceManagerService;->verifyCaller(Ljava/lang/String;)V
 HPLcom/android/server/slice/SlicePermissionManager$PkgUser;-><init>(Ljava/lang/String;I)V
 HPLcom/android/server/slice/SlicePermissionManager$PkgUser;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Lcom/android/server/slice/SlicePermissionManager$PkgUser;,Ljava/lang/Class;
 HPLcom/android/server/slice/SlicePermissionManager$PkgUser;->hashCode()I+]Ljava/lang/Object;Ljava/lang/String;
-HPLcom/android/server/slice/SlicePermissionManager;->getClient(Lcom/android/server/slice/SlicePermissionManager$PkgUser;)Lcom/android/server/slice/SliceClientPermissions;
-HPLcom/android/server/slice/SlicePermissionManager;->grantSliceAccess(Ljava/lang/String;ILjava/lang/String;ILandroid/net/Uri;)V
+HPLcom/android/server/slice/SlicePermissionManager;->getClient(Lcom/android/server/slice/SlicePermissionManager$PkgUser;)Lcom/android/server/slice/SliceClientPermissions;+]Lcom/android/server/slice/SlicePermissionManager$ParserHolder;Lcom/android/server/slice/SlicePermissionManager$ParserHolder;
+HPLcom/android/server/slice/SlicePermissionManager;->getProvider(Lcom/android/server/slice/SlicePermissionManager$PkgUser;)Lcom/android/server/slice/SliceProviderPermissions;+]Lcom/android/server/slice/SlicePermissionManager$ParserHolder;Lcom/android/server/slice/SlicePermissionManager$ParserHolder;
+HPLcom/android/server/slice/SlicePermissionManager;->grantSliceAccess(Ljava/lang/String;ILjava/lang/String;ILandroid/net/Uri;)V+]Lcom/android/server/slice/SliceClientPermissions;Lcom/android/server/slice/SliceClientPermissions;]Lcom/android/server/slice/SliceProviderPermissions$SliceAuthority;Lcom/android/server/slice/SliceProviderPermissions$SliceAuthority;]Lcom/android/server/slice/SliceProviderPermissions;Lcom/android/server/slice/SliceProviderPermissions;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;
 HPLcom/android/server/slice/SlicePermissionManager;->hasPermission(Ljava/lang/String;ILandroid/net/Uri;)Z
-HSPLcom/android/server/smartspace/SmartspaceManagerService$SmartspaceManagerStub$$ExternalSyntheticLambda3;-><init>(Landroid/app/smartspace/SmartspaceSessionId;)V
 HSPLcom/android/server/smartspace/SmartspaceManagerService$SmartspaceManagerStub$$ExternalSyntheticLambda3;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/smartspace/SmartspaceManagerService$SmartspaceManagerStub;->requestSmartspaceUpdate(Landroid/app/smartspace/SmartspaceSessionId;)V
-HSPLcom/android/server/smartspace/SmartspaceManagerService$SmartspaceManagerStub;->runForUserLocked(Ljava/lang/String;Landroid/app/smartspace/SmartspaceSessionId;Ljava/util/function/Consumer;)V
-HSPLcom/android/server/smartspace/SmartspacePerUserService$$ExternalSyntheticLambda6;-><init>(Landroid/app/smartspace/SmartspaceSessionId;)V
+HSPLcom/android/server/smartspace/SmartspaceManagerService$SmartspaceManagerStub;->runForUserLocked(Ljava/lang/String;Landroid/app/smartspace/SmartspaceSessionId;Ljava/util/function/Consumer;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/infra/ServiceNameResolver;Lcom/android/server/infra/FrameworkResourcesServiceNameResolver;]Ljava/util/function/Consumer;megamorphic_types
 HPLcom/android/server/smartspace/SmartspacePerUserService$$ExternalSyntheticLambda6;->run(Landroid/os/IInterface;)V
 HSPLcom/android/server/smartspace/SmartspacePerUserService;->getRemoteServiceLocked()Lcom/android/server/smartspace/RemoteSmartspaceService;
-HSPLcom/android/server/smartspace/SmartspacePerUserService;->requestSmartspaceUpdateLocked(Landroid/app/smartspace/SmartspaceSessionId;)V
-HSPLcom/android/server/smartspace/SmartspacePerUserService;->resolveService(Landroid/app/smartspace/SmartspaceSessionId;Lcom/android/internal/infra/AbstractRemoteService$AsyncRequest;)Z
+HSPLcom/android/server/smartspace/SmartspacePerUserService;->requestSmartspaceUpdateLocked(Landroid/app/smartspace/SmartspaceSessionId;)V+]Lcom/android/server/smartspace/SmartspacePerUserService;Lcom/android/server/smartspace/SmartspacePerUserService;
+HSPLcom/android/server/smartspace/SmartspacePerUserService;->resolveService(Landroid/app/smartspace/SmartspaceSessionId;Lcom/android/internal/infra/AbstractRemoteService$AsyncRequest;)Z+]Lcom/android/server/smartspace/RemoteSmartspaceService;Lcom/android/server/smartspace/RemoteSmartspaceService;
 HPLcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService$SessionImpl$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V+]Lcom/android/server/soundtrigger/SoundTriggerHelper;Lcom/android/server/soundtrigger/SoundTriggerHelper;]Ljava/lang/Boolean;Ljava/lang/Boolean;
 HPLcom/android/server/soundtrigger/SoundTriggerService$MyAppOpsListener;->onOpChanged(Ljava/lang/String;Ljava/lang/String;)V+]Ljava/util/function/Consumer;Lcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService$SessionImpl$$ExternalSyntheticLambda2;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
 HPLcom/android/server/stats/pull/ProcfsMemoryUtil$MemorySnapshot;-><init>()V
 HPLcom/android/server/stats/pull/ProcfsMemoryUtil;->getProcessCmdlines()Landroid/util/SparseArray;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/stats/pull/ProcfsMemoryUtil;->readCmdlineFromProcfs(I)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/stats/pull/ProcfsMemoryUtil;->readMemorySnapshotFromProcfs(I)Lcom/android/server/stats/pull/ProcfsMemoryUtil$MemorySnapshot;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HPLcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda15;-><init>(Lcom/android/server/stats/pull/netstats/NetworkStatsExt;)V
 HPLcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda15;->test(Ljava/lang/Object;)Z
 HPLcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda16;->onUidCpuTime(ILjava/lang/Object;)V
 HPLcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda19;->onUidCpuTime(ILjava/lang/Object;)V
 HPLcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda25;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object;
-HPLcom/android/server/stats/pull/StatsPullAtomService$StatsPullAtomCallbackImpl;->onPullAtom(ILjava/util/List;)I
+HPLcom/android/server/stats/pull/StatsPullAtomService$StatsPullAtomCallbackImpl;->onPullAtom(ILjava/util/List;)I+]Lcom/android/server/stats/pull/StatsPullAtomService;Lcom/android/server/stats/pull/StatsPullAtomService;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->$r8$lambda$PhevnzwyI0gXHjapgQmNiVldx0Q(Landroid/util/SparseArray;Landroid/app/ProcessMemoryState;)V
-HSPLcom/android/server/stats/pull/StatsPullAtomService;->$r8$lambda$TEZLHs4WxN3EZWG0F6PbGcl0Ejs(Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats$Entry;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->$r8$lambda$eeBLVT-jQhUTTPG8Ox0dr-BL7wg(Landroid/util/SparseArray;I[I[J[DI[J)V
-HPLcom/android/server/stats/pull/StatsPullAtomService;->$r8$lambda$ekv4UoGqsHEPM5t9Ano0NUSQAQI(Lcom/android/server/stats/pull/netstats/NetworkStatsExt;Lcom/android/server/stats/pull/netstats/NetworkStatsExt;)Z
-HPLcom/android/server/stats/pull/StatsPullAtomService;->$r8$lambda$jcX3zjpq9krbXk8OxSVb3-hyXuw(Ljava/util/List;II[J)V
-HPLcom/android/server/stats/pull/StatsPullAtomService;->addDataUsageBytesTransferAtoms(Lcom/android/server/stats/pull/netstats/NetworkStatsExt;Ljava/util/List;)V
+HPLcom/android/server/stats/pull/StatsPullAtomService;->addDataUsageBytesTransferAtoms(Lcom/android/server/stats/pull/netstats/NetworkStatsExt;Ljava/util/List;)V+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Ljava/util/List;Ljava/util/ArrayList;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->addNetworkStats(ILjava/util/List;Lcom/android/server/stats/pull/netstats/NetworkStatsExt;)V+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;
-HSPLcom/android/server/stats/pull/StatsPullAtomService;->collectNetworkStatsSnapshotForAtom(I)Ljava/util/List;
+HPLcom/android/server/stats/pull/StatsPullAtomService;->awaitControllerInfo(Landroid/os/SynchronousResultReceiver;)Landroid/os/Parcelable;
+HSPLcom/android/server/stats/pull/StatsPullAtomService;->collectNetworkStatsSnapshotForAtom(I)Ljava/util/List;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->fetchBluetoothData()Landroid/bluetooth/BluetoothActivityEnergyInfo;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->getDataUsageBytesTransferSnapshotForSub(Lcom/android/server/stats/pull/netstats/SubInfo;)Ljava/util/List;
-HSPLcom/android/server/stats/pull/StatsPullAtomService;->getUidNetworkStatsSnapshotForTemplate(Landroid/net/NetworkTemplate;Z)Landroid/net/NetworkStats;
+HSPLcom/android/server/stats/pull/StatsPullAtomService;->getUidNetworkStatsSnapshotForTemplate(Landroid/net/NetworkTemplate;Z)Landroid/net/NetworkStats;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager;
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->getUidNetworkStatsSnapshotForTransport(I)Landroid/net/NetworkStats;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->lambda$pullCpuCyclesPerUidClusterLocked$13(Landroid/util/SparseArray;I[I[J[DI[J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->lambda$pullCpuTimePerUidLocked$12(Ljava/util/List;II[J)V+]Ljava/util/List;Ljava/util/ArrayList;
-HPLcom/android/server/stats/pull/StatsPullAtomService;->lambda$pullDataBytesTransferLocked$7(Lcom/android/server/stats/pull/netstats/NetworkStatsExt;Lcom/android/server/stats/pull/netstats/NetworkStatsExt;)Z+]Lcom/android/server/stats/pull/netstats/NetworkStatsExt;Lcom/android/server/stats/pull/netstats/NetworkStatsExt;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->lambda$pullProcessMemorySnapshot$20(Landroid/util/SparseArray;Landroid/app/ProcessMemoryState;)V
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->lambda$sliceNetworkStatsByUid$8(Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats$Entry;+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->lambda$sliceNetworkStatsByUidAndFgbg$10(Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats$Entry;+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;
+HPLcom/android/server/stats/pull/StatsPullAtomService;->pullBluetoothActivityInfoLocked(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullCpuCyclesPerThreadGroupCluster(ILjava/util/List;)I+]Lcom/android/internal/os/SelectedProcessCpuThreadReader;Lcom/android/internal/os/SelectedProcessCpuThreadReader;]Landroid/os/BatteryStatsInternal;Lcom/android/server/am/BatteryStatsService$LocalService;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullCpuCyclesPerUidClusterLocked(ILjava/util/List;)I+]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/PowerProfile;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullDangerousPermissionStateLocked(ILjava/util/List;)I+]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Ljava/lang/String;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/util/Set;Ljava/util/HashSet;
-HPLcom/android/server/stats/pull/StatsPullAtomService;->pullDataBytesTransferLocked(ILjava/util/List;)I
-HPLcom/android/server/stats/pull/StatsPullAtomService;->pullHealthHalLocked(ILjava/util/List;)I
+HPLcom/android/server/stats/pull/StatsPullAtomService;->pullDataBytesTransferLocked(ILjava/util/List;)I+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HPLcom/android/server/stats/pull/StatsPullAtomService;->pullHealthHalLocked(ILjava/util/List;)I+]Lcom/android/server/health/HealthServiceWrapper;Lcom/android/server/health/HealthServiceWrapperAidl;]Ljava/util/List;Ljava/util/ArrayList;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullKernelWakelockLocked(ILjava/util/List;)I+]Lcom/android/server/power/stats/KernelWakelockReader;Lcom/android/server/power/stats/KernelWakelockReader;]Ljava/util/HashMap;Lcom/android/server/power/stats/KernelWakelockStats;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/Set;Ljava/util/HashMap$EntrySet;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullModemActivityInfoLocked(ILjava/util/List;)I
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullProcessCpuTimeLocked(ILjava/util/List;)I+]Lcom/android/internal/os/ProcessCpuTracker;Lcom/android/internal/os/ProcessCpuTracker;]Ljava/util/List;Ljava/util/ArrayList;
@@ -9340,39 +6886,37 @@
 HPLcom/android/server/stats/pull/StatsPullAtomService;->pullProcessMemorySnapshot(ILjava/util/List;)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/stats/pull/StatsPullAtomService;->removeEmptyEntries(Landroid/net/NetworkStats;)Landroid/net/NetworkStats;+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;
 HSPLcom/android/server/stats/pull/StatsPullAtomService;->sliceNetworkStats(Landroid/net/NetworkStats;Ljava/util/function/Function;)Landroid/net/NetworkStats;+]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Ljava/util/function/Function;Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda2;,Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda4;,Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda3;,Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda5;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;
-HSPLcom/android/server/stats/pull/StatsPullAtomService;->sliceNetworkStatsByUid(Landroid/net/NetworkStats;)Landroid/net/NetworkStats;
 HSPLcom/android/server/stats/pull/netstats/NetworkStatsExt;-><init>(Landroid/net/NetworkStats;[IZZZILcom/android/server/stats/pull/netstats/SubInfo;IZ)V
 HPLcom/android/server/stats/pull/netstats/NetworkStatsExt;->hasSameSlicing(Lcom/android/server/stats/pull/netstats/NetworkStatsExt;)Z
 HPLcom/android/server/statusbar/StatusBarManagerService$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;ILandroid/os/IBinder;IIZ)V
 HPLcom/android/server/statusbar/StatusBarManagerService$$ExternalSyntheticLambda1;->run()V
 HPLcom/android/server/statusbar/StatusBarManagerService$1;->setTopAppHidesStatusBar(Z)V+]Lcom/android/internal/statusbar/IStatusBar;Lcom/android/internal/statusbar/IStatusBar$Stub$Proxy;
-HPLcom/android/server/statusbar/StatusBarManagerService$UiState;->setImeWindowState(IIZLandroid/os/IBinder;)V
 HSPLcom/android/server/statusbar/StatusBarManagerService;->-$$Nest$fgetmBar(Lcom/android/server/statusbar/StatusBarManagerService;)Lcom/android/internal/statusbar/IStatusBar;
 HSPLcom/android/server/statusbar/StatusBarManagerService;->enforceStatusBar()V
 HSPLcom/android/server/statusbar/StatusBarManagerService;->enforceStatusBarService()V
-HPLcom/android/server/statusbar/StatusBarManagerService;->getUiState(I)Lcom/android/server/statusbar/StatusBarManagerService$UiState;
+HSPLcom/android/server/statusbar/StatusBarManagerService;->getUiState(I)Lcom/android/server/statusbar/StatusBarManagerService$UiState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/statusbar/StatusBarManagerService;->setImeWindowStatus(ILandroid/os/IBinder;IIZ)V
 HPLcom/android/server/storage/CacheQuotaStrategy;->getUnfulfilledRequests()Ljava/util/List;+]Landroid/app/usage/UsageStats;Landroid/app/usage/UsageStats;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/UserManager;Landroid/os/UserManager;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/app/usage/CacheQuotaHint$Builder;Landroid/app/usage/CacheQuotaHint$Builder;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;
-HSPLcom/android/server/storage/CacheQuotaStrategy;->pushProcessedQuotas(Ljava/util/List;)V+]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/usage/CacheQuotaHint;Landroid/app/usage/CacheQuotaHint;]Lcom/android/server/storage/CacheQuotaStrategy;Lcom/android/server/storage/CacheQuotaStrategy;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HSPLcom/android/server/storage/DeviceStorageMonitorService;->checkLow()V
+HSPLcom/android/server/storage/CacheQuotaStrategy;->pushProcessedQuotas(Ljava/util/List;)V+]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/app/usage/CacheQuotaHint;Landroid/app/usage/CacheQuotaHint;]Lcom/android/server/storage/CacheQuotaStrategy;Lcom/android/server/storage/CacheQuotaStrategy;
+HSPLcom/android/server/storage/DeviceStorageMonitorService;->checkLow()V+]Ljava/io/File;Ljava/io/File;]Landroid/os/storage/VolumeInfo;Landroid/os/storage/VolumeInfo;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/storage/StorageManager;Landroid/os/storage/StorageManager;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/storage/DeviceStorageMonitorService;->updateBroadcasts(Landroid/os/storage/VolumeInfo;III)V
 HSPLcom/android/server/tare/Agent$ActionAffordabilityNote;->-$$Nest$msetNewAffordability(Lcom/android/server/tare/Agent$ActionAffordabilityNote;Z)V
 HSPLcom/android/server/tare/Agent$ActionAffordabilityNote;-><init>(Lcom/android/server/tare/EconomyManagerInternal$ActionBill;Lcom/android/server/tare/EconomyManagerInternal$AffordabilityChangeListener;Lcom/android/server/tare/EconomicPolicy;)V+]Lcom/android/server/tare/EconomicPolicy;Lcom/android/server/tare/CompleteEconomicPolicy;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/server/tare/EconomyManagerInternal$ActionBill;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;
 HSPLcom/android/server/tare/Agent$ActionAffordabilityNote;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Lcom/android/server/job/controllers/TareController$$ExternalSyntheticLambda0;]Lcom/android/server/tare/EconomyManagerInternal$ActionBill;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;
 HSPLcom/android/server/tare/Agent$ActionAffordabilityNote;->hashCode()I+]Lcom/android/server/tare/EconomyManagerInternal$ActionBill;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;
-HSPLcom/android/server/tare/Agent$ActionAffordabilityNote;->setNewAffordability(Z)V
 HSPLcom/android/server/tare/Agent;->registerAffordabilityChangeListenerLocked(ILjava/lang/String;Lcom/android/server/tare/EconomyManagerInternal$AffordabilityChangeListener;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/tare/InternalResourceService;Lcom/android/server/tare/InternalResourceService;
 HPLcom/android/server/tare/Agent;->scheduleBalanceCheckLocked(ILjava/lang/String;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/tare/Agent$BalanceThresholdAlarmQueue;
-HPLcom/android/server/tare/Agent;->unregisterAffordabilityChangeListenerLocked(ILjava/lang/String;Lcom/android/server/tare/EconomyManagerInternal$AffordabilityChangeListener;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;)V+]Lcom/android/server/tare/Agent;Lcom/android/server/tare/Agent;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/tare/InternalResourceService;Lcom/android/server/tare/InternalResourceService;
-HSPLcom/android/server/tare/CompleteEconomicPolicy;->getAction(I)Lcom/android/server/tare/EconomicPolicy$Action;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/tare/EconomicPolicy;Lcom/android/server/tare/AlarmManagerEconomicPolicy;,Lcom/android/server/tare/JobSchedulerEconomicPolicy;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/tare/EconomyManagerInternal$ActionBill;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Ljava/util/Collections$UnmodifiableRandomAccessList;,Lcom/android/server/tare/EconomyManagerInternal$ActionBill;
+HPLcom/android/server/tare/Agent;->unregisterAffordabilityChangeListenerLocked(ILjava/lang/String;Lcom/android/server/tare/EconomyManagerInternal$AffordabilityChangeListener;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/tare/InternalResourceService;Lcom/android/server/tare/InternalResourceService;]Lcom/android/server/tare/Agent;Lcom/android/server/tare/Agent;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/tare/CompleteEconomicPolicy;->getAction(I)Lcom/android/server/tare/EconomicPolicy$Action;+]Lcom/android/server/tare/EconomicPolicy;Lcom/android/server/tare/AlarmManagerEconomicPolicy;,Lcom/android/server/tare/JobSchedulerEconomicPolicy;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/tare/EconomyManagerInternal$ActionBill;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Ljava/util/Collections$UnmodifiableRandomAccessList;,Lcom/android/server/tare/EconomyManagerInternal$ActionBill;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;
 HSPLcom/android/server/tare/EconomyManagerInternal$ActionBill;->getAnticipatedActions()Ljava/util/List;
 HSPLcom/android/server/tare/EconomyManagerInternal$ActionBill;->hashCode()I
-HPLcom/android/server/tare/InternalResourceService$LocalService;->noteInstantaneousEvent(ILjava/lang/String;ILjava/lang/String;)V
-HPLcom/android/server/tare/InternalResourceService$LocalService;->noteOngoingEventStarted(ILjava/lang/String;ILjava/lang/String;)V
+HPLcom/android/server/tare/EconomyManagerInternal$AnticipatedAction;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Lcom/android/server/tare/EconomyManagerInternal$AnticipatedAction;
+HSPLcom/android/server/tare/InternalResourceService$LocalService;->noteInstantaneousEvent(ILjava/lang/String;ILjava/lang/String;)V
+HSPLcom/android/server/tare/InternalResourceService$LocalService;->noteOngoingEventStarted(ILjava/lang/String;ILjava/lang/String;)V
 HPLcom/android/server/tare/InternalResourceService$LocalService;->noteOngoingEventStopped(ILjava/lang/String;ILjava/lang/String;)V
 HSPLcom/android/server/tare/InternalResourceService$LocalService;->registerAffordabilityChangeListener(ILjava/lang/String;Lcom/android/server/tare/EconomyManagerInternal$AffordabilityChangeListener;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;)V+]Lcom/android/server/tare/Agent;Lcom/android/server/tare/Agent;]Lcom/android/server/tare/InternalResourceService;Lcom/android/server/tare/InternalResourceService;
-HPLcom/android/server/tare/InternalResourceService$LocalService;->unregisterAffordabilityChangeListener(ILjava/lang/String;Lcom/android/server/tare/EconomyManagerInternal$AffordabilityChangeListener;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;)V+]Lcom/android/server/tare/Agent;Lcom/android/server/tare/Agent;]Lcom/android/server/tare/InternalResourceService;Lcom/android/server/tare/InternalResourceService;
+HSPLcom/android/server/tare/InternalResourceService$LocalService;->unregisterAffordabilityChangeListener(ILjava/lang/String;Lcom/android/server/tare/EconomyManagerInternal$AffordabilityChangeListener;Lcom/android/server/tare/EconomyManagerInternal$ActionBill;)V+]Lcom/android/server/tare/Agent;Lcom/android/server/tare/Agent;]Lcom/android/server/tare/InternalResourceService;Lcom/android/server/tare/InternalResourceService;
 HSPLcom/android/server/tare/InternalResourceService;->-$$Nest$fgetmAgent(Lcom/android/server/tare/InternalResourceService;)Lcom/android/server/tare/Agent;
 HSPLcom/android/server/tare/InternalResourceService;->-$$Nest$fgetmEnabledMode(Lcom/android/server/tare/InternalResourceService;)I
 HSPLcom/android/server/tare/InternalResourceService;->-$$Nest$fgetmLock(Lcom/android/server/tare/InternalResourceService;)Ljava/lang/Object;
@@ -9389,84 +6933,76 @@
 HSPLcom/android/server/timedetector/TimeDetectorService;->latestNetworkTime()Landroid/app/time/UnixEpochTime;+]Lcom/android/server/timedetector/TimeDetectorStrategy;Lcom/android/server/timedetector/TimeDetectorStrategyImpl;]Lcom/android/server/timedetector/NetworkTimeSuggestion;Lcom/android/server/timedetector/NetworkTimeSuggestion;
 HSPLcom/android/server/timedetector/TimeDetectorStrategyImpl;->getLatestNetworkSuggestion()Lcom/android/server/timedetector/NetworkTimeSuggestion;+]Lcom/android/server/timezonedetector/ReferenceWithHistory;Lcom/android/server/timezonedetector/ReferenceWithHistory;
 HSPLcom/android/server/timezonedetector/ReferenceWithHistory;->get()Ljava/lang/Object;+]Landroid/os/TimestampedValue;Landroid/os/TimestampedValue;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;
-HPLcom/android/server/trust/TrustManagerService$1;->isDeviceLocked(II)Z
-HPLcom/android/server/trust/TrustManagerService$1;->isDeviceSecure(II)Z
-HPLcom/android/server/trust/TrustManagerService;->-$$Nest$fgetmLockPatternUtils(Lcom/android/server/trust/TrustManagerService;)Lcom/android/internal/widget/LockPatternUtils;
-HPLcom/android/server/trust/TrustManagerService;->-$$Nest$mresolveProfileParent(Lcom/android/server/trust/TrustManagerService;I)I
-HSPLcom/android/server/trust/TrustManagerService;->isDeviceLockedInner(I)Z
+HSPLcom/android/server/trust/TrustManagerService$1;->isDeviceLocked(II)Z+]Lcom/android/server/trust/TrustManagerService;Lcom/android/server/trust/TrustManagerService;]Lcom/android/internal/widget/LockPatternUtils;Lcom/android/internal/widget/LockPatternUtils;
+HSPLcom/android/server/trust/TrustManagerService$1;->isDeviceSecure(II)Z+]Lcom/android/internal/widget/LockPatternUtils;Lcom/android/internal/widget/LockPatternUtils;
+HSPLcom/android/server/trust/TrustManagerService;->-$$Nest$fgetmLockPatternUtils(Lcom/android/server/trust/TrustManagerService;)Lcom/android/internal/widget/LockPatternUtils;
+HSPLcom/android/server/trust/TrustManagerService;->-$$Nest$mresolveProfileParent(Lcom/android/server/trust/TrustManagerService;I)I
+HSPLcom/android/server/trust/TrustManagerService;->isDeviceLockedInner(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/trust/TrustManagerService;->refreshAgentList(I)V
 HSPLcom/android/server/trust/TrustManagerService;->refreshDeviceLockedForUser(II)V
 HSPLcom/android/server/trust/TrustManagerService;->resolveAllowedTrustAgents(Landroid/content/pm/PackageManager;I)Ljava/util/List;
-HPLcom/android/server/trust/TrustManagerService;->resolveProfileParent(I)I
-HSPLcom/android/server/tv/TvInputHal;-><clinit>()V
+HSPLcom/android/server/trust/TrustManagerService;->resolveProfileParent(I)I+]Landroid/os/UserManager;Landroid/os/UserManager;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;
 HSPLcom/android/server/twilight/TwilightService$1;->unregisterListener(Lcom/android/server/twilight/TwilightListener;)V
 HSPLcom/android/server/uri/GrantUri;-><init>(ILandroid/net/Uri;I)V
 HPLcom/android/server/uri/GrantUri;->equals(Ljava/lang/Object;)Z+]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;
 HPLcom/android/server/uri/GrantUri;->resolve(ILandroid/net/Uri;I)Lcom/android/server/uri/GrantUri;
-HSPLcom/android/server/uri/UriGrantsManagerService$H;-><init>(Lcom/android/server/uri/UriGrantsManagerService;Landroid/os/Looper;)V
-HSPLcom/android/server/uri/UriGrantsManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/uri/UriGrantsManagerService$Lifecycle;->onBootPhase(I)V
-HSPLcom/android/server/uri/UriGrantsManagerService$Lifecycle;->onStart()V
-HSPLcom/android/server/uri/UriGrantsManagerService$LocalService;-><init>(Lcom/android/server/uri/UriGrantsManagerService;)V
-HSPLcom/android/server/uri/UriGrantsManagerService$LocalService;-><init>(Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService$LocalService-IA;)V
 HSPLcom/android/server/uri/UriGrantsManagerService$LocalService;->checkAuthorityGrants(ILandroid/content/pm/ProviderInfo;IZ)Z
 HPLcom/android/server/uri/UriGrantsManagerService$LocalService;->checkGrantUriPermission(ILjava/lang/String;Landroid/net/Uri;II)I
 HSPLcom/android/server/uri/UriGrantsManagerService$LocalService;->checkGrantUriPermissionFromIntent(Landroid/content/Intent;ILjava/lang/String;I)Lcom/android/server/uri/NeededUriGrants;+]Lcom/android/server/uri/UriGrantsManagerService$LocalService;Lcom/android/server/uri/UriGrantsManagerService$LocalService;
 HSPLcom/android/server/uri/UriGrantsManagerService$LocalService;->internalCheckGrantUriPermissionFromIntent(Landroid/content/Intent;ILjava/lang/String;ILjava/lang/Integer;)Lcom/android/server/uri/NeededUriGrants;+]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/uri/UriGrantsManagerService;->-$$Nest$mcheckGrantUriPermissionFromIntentUnlocked(Lcom/android/server/uri/UriGrantsManagerService;ILjava/lang/String;Landroid/content/Intent;ILcom/android/server/uri/NeededUriGrants;ILjava/lang/Integer;)Lcom/android/server/uri/NeededUriGrants;
-HSPLcom/android/server/uri/UriGrantsManagerService;->-$$Nest$mstart(Lcom/android/server/uri/UriGrantsManagerService;)V
-HSPLcom/android/server/uri/UriGrantsManagerService;-><init>()V
-HSPLcom/android/server/uri/UriGrantsManagerService;-><init>(Lcom/android/server/uri/UriGrantsManagerService-IA;)V
-HSPLcom/android/server/uri/UriGrantsManagerService;-><init>(Ljava/io/File;Ljava/lang/String;)V
-HSPLcom/android/server/uri/UriGrantsManagerService;->checkAuthorityGrantsLocked(ILandroid/content/pm/ProviderInfo;IZ)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/uri/UriGrantsManagerService;->checkGrantUriPermissionFromIntentUnlocked(ILjava/lang/String;Landroid/content/Intent;ILcom/android/server/uri/NeededUriGrants;ILjava/lang/Integer;)Lcom/android/server/uri/NeededUriGrants;+]Landroid/content/ClipData;Landroid/content/ClipData;]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/ClipData$Item;Landroid/content/ClipData$Item;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HSPLcom/android/server/uri/UriGrantsManagerService;->checkAuthorityGrantsLocked(ILandroid/content/pm/ProviderInfo;IZ)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;
+HSPLcom/android/server/uri/UriGrantsManagerService;->checkGrantUriPermissionFromIntentUnlocked(ILjava/lang/String;Landroid/content/Intent;ILcom/android/server/uri/NeededUriGrants;ILjava/lang/Integer;)Lcom/android/server/uri/NeededUriGrants;+]Landroid/content/ClipData;Landroid/content/ClipData;]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/ClipData$Item;Landroid/content/ClipData$Item;
 HPLcom/android/server/uri/UriGrantsManagerService;->checkGrantUriPermissionUnlocked(ILjava/lang/String;Landroid/net/Uri;II)I
-HPLcom/android/server/uri/UriGrantsManagerService;->checkGrantUriPermissionUnlocked(ILjava/lang/String;Lcom/android/server/uri/GrantUri;II)I+]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;]Landroid/os/PatternMatcher;Landroid/os/PatternMatcher;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HPLcom/android/server/uri/UriGrantsManagerService;->checkHoldingPermissionsInternalUnlocked(Landroid/content/pm/ProviderInfo;Lcom/android/server/uri/GrantUri;IIZ)Z+]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;]Landroid/content/pm/PathPermission;Landroid/content/pm/PathPermission;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
-HPLcom/android/server/uri/UriGrantsManagerService;->checkHoldingPermissionsUnlocked(Landroid/content/pm/ProviderInfo;Lcom/android/server/uri/GrantUri;II)Z
+HPLcom/android/server/uri/UriGrantsManagerService;->checkGrantUriPermissionUnlocked(ILjava/lang/String;Lcom/android/server/uri/GrantUri;II)I+]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;]Landroid/os/PatternMatcher;Landroid/os/PatternMatcher;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HPLcom/android/server/uri/UriGrantsManagerService;->checkHoldingPermissionsInternalUnlocked(Landroid/content/pm/ProviderInfo;Lcom/android/server/uri/GrantUri;IIZ)Z+]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;]Landroid/content/pm/PathPermission;Landroid/content/pm/PathPermission;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;
+HPLcom/android/server/uri/UriGrantsManagerService;->checkHoldingPermissionsUnlocked(Landroid/content/pm/ProviderInfo;Lcom/android/server/uri/GrantUri;II)Z+]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;
 HSPLcom/android/server/uri/UriGrantsManagerService;->enforceNotIsolatedCaller(Ljava/lang/String;)V
 HSPLcom/android/server/uri/UriGrantsManagerService;->getProviderInfo(Ljava/lang/String;III)Landroid/content/pm/ProviderInfo;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
+HPLcom/android/server/uri/UriGrantsManagerService;->getUriPermissions(Ljava/lang/String;ZZ)Landroid/content/pm/ParceledListSlice;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Object;Ljava/lang/String;
 HPLcom/android/server/uri/UriGrantsManagerService;->grantUriPermissionFromOwnerUnlocked(Landroid/os/IBinder;ILjava/lang/String;Landroid/net/Uri;III)V+]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
-HPLcom/android/server/uri/UriGrantsManagerService;->grantUriPermissionUnchecked(ILjava/lang/String;Lcom/android/server/uri/GrantUri;ILcom/android/server/uri/UriPermissionOwner;)V
-HPLcom/android/server/uri/UriGrantsManagerService;->isContentUriWithAccessModeFlags(Lcom/android/server/uri/GrantUri;ILjava/lang/String;)Z
-HSPLcom/android/server/uri/UriGrantsManagerService;->start()V
-HSPLcom/android/server/uri/UriMetricsHelper;-><clinit>()V
-HSPLcom/android/server/uri/UriMetricsHelper;-><init>(Landroid/content/Context;Lcom/android/server/uri/UriMetricsHelper$PersistentUriGrantsProvider;)V
-HPLcom/android/server/uri/UriPermissionOwner;->removeUriPermission(Lcom/android/server/uri/GrantUri;ILjava/lang/String;I)V+]Lcom/android/server/uri/GrantUri;Lcom/android/server/uri/GrantUri;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/uri/UriPermission;Lcom/android/server/uri/UriPermission;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
+HPLcom/android/server/uri/UriGrantsManagerService;->grantUriPermissionUnchecked(ILjava/lang/String;Lcom/android/server/uri/GrantUri;ILcom/android/server/uri/UriPermissionOwner;)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService;]Lcom/android/server/uri/UriPermission;Lcom/android/server/uri/UriPermission;
+HPLcom/android/server/uri/UriGrantsManagerService;->isContentUriWithAccessModeFlags(Lcom/android/server/uri/GrantUri;ILjava/lang/String;)Z+]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;
+HSPLcom/android/server/uri/UriPermission;->updateModeFlags()V
+HPLcom/android/server/uri/UriPermissionOwner;->removeUriPermission(Lcom/android/server/uri/GrantUri;ILjava/lang/String;I)V+]Lcom/android/server/uri/GrantUri;Lcom/android/server/uri/GrantUri;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/uri/UriPermission;Lcom/android/server/uri/UriPermission;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/usage/AppIdleHistory;->getAppStandbyBucket(Ljava/lang/String;IJ)I+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
-HPLcom/android/server/usage/AppIdleHistory;->getAppUsageHistory(Ljava/lang/String;IJ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
-HPLcom/android/server/usage/AppIdleHistory;->getElapsedTime(J)J
+HSPLcom/android/server/usage/AppIdleHistory;->getAppStandbyBuckets(IZ)Ljava/util/ArrayList;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/usage/AppIdleHistory;->getAppUsageHistory(Ljava/lang/String;IJ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
+HSPLcom/android/server/usage/AppIdleHistory;->getElapsedTime(J)J
 HPLcom/android/server/usage/AppIdleHistory;->getEstimatedLaunchTime(Ljava/lang/String;IJ)J
 HSPLcom/android/server/usage/AppIdleHistory;->getPackageHistory(Landroid/util/ArrayMap;Ljava/lang/String;JZ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HPLcom/android/server/usage/AppIdleHistory;->getThresholdIndex(Ljava/lang/String;IJ[J[J)I
+HSPLcom/android/server/usage/AppIdleHistory;->getThresholdIndex(Ljava/lang/String;IJ[J[J)I+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
 HSPLcom/android/server/usage/AppIdleHistory;->getUserHistory(I)Landroid/util/ArrayMap;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
 HSPLcom/android/server/usage/AppIdleHistory;->isIdle(Ljava/lang/String;IJ)Z+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
 HSPLcom/android/server/usage/AppIdleHistory;->readAppIdleTimes(ILandroid/util/ArrayMap;)V
 HPLcom/android/server/usage/AppIdleHistory;->removeElapsedExpiryTimes(Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;J)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;
 HPLcom/android/server/usage/AppIdleHistory;->reportUsage(Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;Ljava/lang/String;IIIJJ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
-HPLcom/android/server/usage/AppIdleHistory;->setAppStandbyBucket(Ljava/lang/String;IJIIZ)V
-HPLcom/android/server/usage/AppIdleHistory;->setLastJobRunTime(Ljava/lang/String;IJ)V
-HPLcom/android/server/usage/AppIdleHistory;->shouldInformListeners(Ljava/lang/String;IJI)Z
+HSPLcom/android/server/usage/AppIdleHistory;->setAppStandbyBucket(Ljava/lang/String;IJIIZ)V+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
+HSPLcom/android/server/usage/AppIdleHistory;->setLastJobRunTime(Ljava/lang/String;IJ)V+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
+HSPLcom/android/server/usage/AppIdleHistory;->shouldInformListeners(Ljava/lang/String;IJI)Z
 HPLcom/android/server/usage/AppIdleHistory;->writeAppIdleTimes(IJ)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/nio/charset/Charset;Lcom/android/icu/charset/CharsetICU;]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
-HSPLcom/android/server/usage/AppStandbyController$2;->onDisplayChanged(I)V
-HSPLcom/android/server/usage/AppStandbyController$AppStandbyHandler;->handleMessage(Landroid/os/Message;)V
-HSPLcom/android/server/usage/AppStandbyController$ContentProviderUsageRecord;->obtain(Ljava/lang/String;Ljava/lang/String;I)Lcom/android/server/usage/AppStandbyController$ContentProviderUsageRecord;
+HSPLcom/android/server/usage/AppStandbyController$2;->onDisplayChanged(I)V+]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
+HSPLcom/android/server/usage/AppStandbyController$AppStandbyHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/usage/AppStandbyController$ContentProviderUsageRecord;Lcom/android/server/usage/AppStandbyController$ContentProviderUsageRecord;]Lcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;Lcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;
+HSPLcom/android/server/usage/AppStandbyController$ContentProviderUsageRecord;->obtain(Ljava/lang/String;Ljava/lang/String;I)Lcom/android/server/usage/AppStandbyController$ContentProviderUsageRecord;+]Lcom/android/server/usage/AppStandbyController$Pool;Lcom/android/server/usage/AppStandbyController$Pool;
 HSPLcom/android/server/usage/AppStandbyController$Injector;->elapsedRealtime()J
-HSPLcom/android/server/usage/AppStandbyController$Injector;->getActiveNetworkScorer()Ljava/lang/String;
+HSPLcom/android/server/usage/AppStandbyController$Injector;->getActiveNetworkScorer()Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/net/NetworkScoreManager;Landroid/net/NetworkScoreManager;
 HPLcom/android/server/usage/AppStandbyController$Injector;->getValidCrossProfileTargets(Ljava/lang/String;I)Ljava/util/List;+]Landroid/content/pm/CrossProfileAppsInternal;Lcom/android/server/pm/CrossProfileAppsServiceImpl$LocalService;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/usage/AppStandbyController$Injector;->isBoundWidgetPackage(Landroid/appwidget/AppWidgetManager;Ljava/lang/String;I)Z
+HSPLcom/android/server/usage/AppStandbyController$Injector;->isBoundWidgetPackage(Landroid/appwidget/AppWidgetManager;Ljava/lang/String;I)Z+]Landroid/appwidget/AppWidgetManager;Landroid/appwidget/AppWidgetManager;
 HSPLcom/android/server/usage/AppStandbyController$Injector;->isNonIdleWhitelisted(Ljava/lang/String;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/usage/AppStandbyController$Injector;->isWellbeingPackage(Ljava/lang/String;)Z
-HSPLcom/android/server/usage/AppStandbyController$Injector;->shouldGetExactAlarmBucketElevation(Ljava/lang/String;I)Z
+HSPLcom/android/server/usage/AppStandbyController$Injector;->shouldGetExactAlarmBucketElevation(Ljava/lang/String;I)Z+]Lcom/android/server/AlarmManagerInternal;Lcom/android/server/alarm/AlarmManagerService$LocalService;
 HSPLcom/android/server/usage/AppStandbyController$Pool;->obtain()Ljava/lang/Object;
 HSPLcom/android/server/usage/AppStandbyController$Pool;->recycle(Ljava/lang/Object;)V
-HPLcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;->obtain(Ljava/lang/String;IIIZ)Lcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;
-HPLcom/android/server/usage/AppStandbyController;->checkAndUpdateStandbyState(Ljava/lang/String;IIJ)V+]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
-HPLcom/android/server/usage/AppStandbyController;->checkIdleStates(I)Z
+HSPLcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;->obtain(Ljava/lang/String;IIIZ)Lcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;
+HSPLcom/android/server/usage/AppStandbyController;->checkAndUpdateStandbyState(Ljava/lang/String;IIJ)V+]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController;
+HSPLcom/android/server/usage/AppStandbyController;->checkIdleStates(I)Z+]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;
+HPLcom/android/server/usage/AppStandbyController;->getAppId(Ljava/lang/String;)I
 HSPLcom/android/server/usage/AppStandbyController;->getAppMinBucket(Ljava/lang/String;II)I+]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
 HSPLcom/android/server/usage/AppStandbyController;->getAppStandbyBucket(Ljava/lang/String;IJZ)I+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
-HPLcom/android/server/usage/AppStandbyController;->getCrossProfileTargets(Ljava/lang/String;I)Ljava/util/List;
-HPLcom/android/server/usage/AppStandbyController;->informListeners(Ljava/lang/String;IIIZ)V
+HSPLcom/android/server/usage/AppStandbyController;->getBucketForLocked(Ljava/lang/String;IJ)I
+HPLcom/android/server/usage/AppStandbyController;->getCrossProfileTargets(Ljava/lang/String;I)Ljava/util/List;+]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;
+HSPLcom/android/server/usage/AppStandbyController;->getMinBucketWithValidExpiryTime(Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;IJ)I+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;
+HSPLcom/android/server/usage/AppStandbyController;->informListeners(Ljava/lang/String;IIIZ)V+]Lcom/android/server/usage/AppStandbyInternal$AppIdleStateChangeListener;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/usage/AppStandbyController;->isActiveDeviceAdmin(Ljava/lang/String;I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Set;Landroid/util/ArraySet;
 HSPLcom/android/server/usage/AppStandbyController;->isActiveNetworkScorer(Ljava/lang/String;)Z+]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Ljava/lang/Object;Ljava/lang/String;
 HSPLcom/android/server/usage/AppStandbyController;->isAdminProtectedPackages(Ljava/lang/String;I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Set;Landroid/util/ArraySet;
@@ -9474,95 +7010,91 @@
 HSPLcom/android/server/usage/AppStandbyController;->isAppIdleFiltered(Ljava/lang/String;IIJ)Z
 HPLcom/android/server/usage/AppStandbyController;->isAppIdleFiltered(Ljava/lang/String;IJZ)Z
 HSPLcom/android/server/usage/AppStandbyController;->isAppIdleUnfiltered(Ljava/lang/String;IJ)Z+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
-HSPLcom/android/server/usage/AppStandbyController;->isCarrierApp(Ljava/lang/String;)Z
+HSPLcom/android/server/usage/AppStandbyController;->isCarrierApp(Ljava/lang/String;)Z+]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;
 HSPLcom/android/server/usage/AppStandbyController;->isDeviceProvisioningPackage(Ljava/lang/String;)Z
 HSPLcom/android/server/usage/AppStandbyController;->isHeadlessSystemApp(Ljava/lang/String;)Z
 HSPLcom/android/server/usage/AppStandbyController;->isInParole()Z
-HPLcom/android/server/usage/AppStandbyController;->maybeInformListeners(Ljava/lang/String;IJIIZ)V+]Landroid/os/Handler;Lcom/android/server/usage/AppStandbyController$AppStandbyHandler;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
-HPLcom/android/server/usage/AppStandbyController;->onUsageEvent(ILandroid/app/usage/UsageEvents$Event;)V+]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;]Landroid/os/UserHandle;Landroid/os/UserHandle;
+HSPLcom/android/server/usage/AppStandbyController;->maybeInformListeners(Ljava/lang/String;IJIIZ)V+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;]Landroid/os/Handler;Lcom/android/server/usage/AppStandbyController$AppStandbyHandler;
+HPLcom/android/server/usage/AppStandbyController;->onUsageEvent(ILandroid/app/usage/UsageEvents$Event;)V+]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;
 HSPLcom/android/server/usage/AppStandbyController;->postReportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V
-HSPLcom/android/server/usage/AppStandbyController;->reportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V
+HSPLcom/android/server/usage/AppStandbyController;->reportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V+]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HPLcom/android/server/usage/AppStandbyController;->reportEventLocked(Ljava/lang/String;IJI)V+]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController;]Landroid/os/Handler;Lcom/android/server/usage/AppStandbyController$AppStandbyHandler;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
 HPLcom/android/server/usage/AppStandbyController;->setAppStandbyBucket(Ljava/lang/String;IIIJZ)V
-HPLcom/android/server/usage/AppStandbyController;->setLastJobRunTime(Ljava/lang/String;IJ)V
+HSPLcom/android/server/usage/AppStandbyController;->setLastJobRunTime(Ljava/lang/String;IJ)V+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;
 HPLcom/android/server/usage/AppTimeLimitController;->getAppUsageLimit(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/app/usage/UsageStatsManagerInternal$AppUsageLimitData;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/usage/AppTimeLimitController;Lcom/android/server/usage/AppTimeLimitController;
 HPLcom/android/server/usage/AppTimeLimitController;->getOrCreateUserDataLocked(I)Lcom/android/server/usage/AppTimeLimitController$UserData;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/usage/AppTimeLimitController;->noteUsageStop(Ljava/lang/String;I)V
-HPLcom/android/server/usage/BroadcastResponseStatsLogger$LogBuffer;->logNotificationEvent(ILjava/lang/String;Landroid/os/UserHandle;J)V
-HPLcom/android/server/usage/BroadcastResponseStatsLogger;->logNotificationEvent(ILjava/lang/String;Landroid/os/UserHandle;J)V
-HPLcom/android/server/usage/BroadcastResponseStatsTracker;->getBroadcastEventsLocked(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/util/ArraySet;
-HPLcom/android/server/usage/BroadcastResponseStatsTracker;->reportNotificationEvent(ILjava/lang/String;Landroid/os/UserHandle;J)V+]Lcom/android/server/usage/BroadcastResponseStatsLogger;Lcom/android/server/usage/BroadcastResponseStatsLogger;]Lcom/android/server/usage/BroadcastResponseStatsTracker;Lcom/android/server/usage/BroadcastResponseStatsTracker;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Landroid/util/LongArrayQueue;Landroid/util/LongArrayQueue;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/app/usage/BroadcastResponseStats;Landroid/app/usage/BroadcastResponseStats;]Lcom/android/server/usage/BroadcastEvent;Lcom/android/server/usage/BroadcastEvent;
+HPLcom/android/server/usage/BroadcastResponseStatsLogger$LogBuffer;->logNotificationEvent(ILjava/lang/String;Landroid/os/UserHandle;J)V+]Lcom/android/server/usage/BroadcastResponseStatsLogger$Data;Lcom/android/server/usage/BroadcastResponseStatsLogger$NotificationEvent;]Lcom/android/internal/util/RingBuffer;Lcom/android/server/usage/BroadcastResponseStatsLogger$LogBuffer;]Landroid/os/UserHandle;Landroid/os/UserHandle;
+HPLcom/android/server/usage/BroadcastResponseStatsLogger;->logNotificationEvent(ILjava/lang/String;Landroid/os/UserHandle;J)V+]Lcom/android/server/usage/BroadcastResponseStatsLogger$LogBuffer;Lcom/android/server/usage/BroadcastResponseStatsLogger$LogBuffer;
+HPLcom/android/server/usage/BroadcastResponseStatsTracker;->getBroadcastEventsLocked(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/util/ArraySet;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/usage/UserBroadcastEvents;Lcom/android/server/usage/UserBroadcastEvents;
+HPLcom/android/server/usage/BroadcastResponseStatsTracker;->reportNotificationEvent(ILjava/lang/String;Landroid/os/UserHandle;J)V+]Lcom/android/server/usage/BroadcastResponseStatsLogger;Lcom/android/server/usage/BroadcastResponseStatsLogger;]Landroid/util/LongArrayQueue;Landroid/util/LongArrayQueue;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/usage/BroadcastEvent;Lcom/android/server/usage/BroadcastEvent;]Lcom/android/server/usage/BroadcastResponseStatsTracker;Lcom/android/server/usage/BroadcastResponseStatsTracker;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/app/usage/BroadcastResponseStats;Landroid/app/usage/BroadcastResponseStats;
 HPLcom/android/server/usage/IntervalStats;-><init>()V
-HPLcom/android/server/usage/IntervalStats;->addEvent(Landroid/app/usage/UsageEvents$Event;)V
-HPLcom/android/server/usage/IntervalStats;->deobfuscateEvents(Lcom/android/server/usage/PackagesTokenData;)Z+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Lcom/android/server/usage/PackagesTokenData;Lcom/android/server/usage/PackagesTokenData;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HPLcom/android/server/usage/IntervalStats;->deobfuscateUsageStats(Lcom/android/server/usage/PackagesTokenData;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/usage/PackagesTokenData;Lcom/android/server/usage/PackagesTokenData;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
+HPLcom/android/server/usage/IntervalStats;->addEvent(Landroid/app/usage/UsageEvents$Event;)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;
+HPLcom/android/server/usage/IntervalStats;->deobfuscateEvents(Lcom/android/server/usage/PackagesTokenData;)Z+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/usage/PackagesTokenData;Lcom/android/server/usage/PackagesTokenData;
+HPLcom/android/server/usage/IntervalStats;->deobfuscateUsageStats(Lcom/android/server/usage/PackagesTokenData;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/usage/PackagesTokenData;Lcom/android/server/usage/PackagesTokenData;
 HPLcom/android/server/usage/IntervalStats;->getCachedStringRef(Ljava/lang/String;)Ljava/lang/String;+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HPLcom/android/server/usage/IntervalStats;->getOrCreateConfigurationStats(Landroid/content/res/Configuration;)Landroid/app/usage/ConfigurationStats;
 HPLcom/android/server/usage/IntervalStats;->getOrCreateUsageStats(Ljava/lang/String;)Landroid/app/usage/UsageStats;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/usage/IntervalStats;Lcom/android/server/usage/IntervalStats;
 HPLcom/android/server/usage/IntervalStats;->obfuscateEventsData(Lcom/android/server/usage/PackagesTokenData;)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Lcom/android/server/usage/PackagesTokenData;Lcom/android/server/usage/PackagesTokenData;
-HPLcom/android/server/usage/IntervalStats;->obfuscateUsageStatsData(Lcom/android/server/usage/PackagesTokenData;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/usage/PackagesTokenData;Lcom/android/server/usage/PackagesTokenData;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Ljava/lang/Integer;Ljava/lang/Integer;
+HPLcom/android/server/usage/IntervalStats;->obfuscateUsageStatsData(Lcom/android/server/usage/PackagesTokenData;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/usage/PackagesTokenData;Lcom/android/server/usage/PackagesTokenData;
 HPLcom/android/server/usage/IntervalStats;->update(Ljava/lang/String;Ljava/lang/String;JII)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/usage/UsageStats;Landroid/app/usage/UsageStats;]Lcom/android/server/usage/IntervalStats;Lcom/android/server/usage/IntervalStats;
 HPLcom/android/server/usage/PackagesTokenData;->getPackageString(I)Ljava/lang/String;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/usage/PackagesTokenData;->getPackageTokenOrAdd(Ljava/lang/String;J)I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/usage/PackagesTokenData;->getPackageTokenOrAdd(Ljava/lang/String;J)I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Long;Ljava/lang/Long;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/usage/PackagesTokenData;->getString(II)Ljava/lang/String;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/usage/PackagesTokenData;->getTokenOrAdd(ILjava/lang/String;Ljava/lang/String;)I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Object;Ljava/lang/String;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda1;-><init>(Landroid/content/pm/PackageStats;IZ)V
 HPLcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda2;-><init>(Landroid/content/pm/PackageStats;Ljava/lang/String;Landroid/os/UserHandle;Z)V
-HSPLcom/android/server/usage/StorageStatsService$H;->handleMessage(Landroid/os/Message;)V
-HPLcom/android/server/usage/StorageStatsService;->$r8$lambda$kx9ufaJ8xB2vrPlVgrwxhzbgP-E(Landroid/content/pm/PackageStats;IZLcom/android/server/usage/StorageStatsManagerLocal$StorageStatsAugmenter;)V
+HPLcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
+HSPLcom/android/server/usage/StorageStatsService$H;->handleMessage(Landroid/os/Message;)V+]Ljava/io/File;Ljava/io/File;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/StatFs;Landroid/os/StatFs;
 HPLcom/android/server/usage/StorageStatsService;->checkStatsPermission(ILjava/lang/String;Z)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
 HPLcom/android/server/usage/StorageStatsService;->enforceStatsPermission(ILjava/lang/String;)V+]Lcom/android/server/usage/StorageStatsService;Lcom/android/server/usage/StorageStatsService;
 HPLcom/android/server/usage/StorageStatsService;->forEachStorageStatsAugmenter(Ljava/util/function/Consumer;Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/function/Consumer;Lcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda1;,Lcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda0;,Lcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda2;
 HPLcom/android/server/usage/StorageStatsService;->getAppIds(I)[I+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HPLcom/android/server/usage/StorageStatsService;->getDefaultFlags()I
 HPLcom/android/server/usage/StorageStatsService;->lambda$queryStatsForUid$2(Landroid/content/pm/PackageStats;IZLcom/android/server/usage/StorageStatsManagerLocal$StorageStatsAugmenter;)V
-HPLcom/android/server/usage/StorageStatsService;->queryStatsForPackage(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;+]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/usage/StorageStatsService;Lcom/android/server/usage/StorageStatsService;]Landroid/content/Context;Landroid/app/ContextImpl;
-HPLcom/android/server/usage/StorageStatsService;->queryStatsForUid(Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;+]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/usage/StorageStatsService;Lcom/android/server/usage/StorageStatsService;]Landroid/content/Context;Landroid/app/ContextImpl;
-HPLcom/android/server/usage/StorageStatsService;->queryStatsForUser(Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;
+HPLcom/android/server/usage/StorageStatsService;->queryStatsForPackage(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;+]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/usage/StorageStatsService;Lcom/android/server/usage/StorageStatsService;
+HPLcom/android/server/usage/StorageStatsService;->queryStatsForUid(Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;+]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/usage/StorageStatsService;Lcom/android/server/usage/StorageStatsService;
 HPLcom/android/server/usage/StorageStatsService;->translate(Landroid/content/pm/PackageStats;)Landroid/app/usage/StorageStats;
-HPLcom/android/server/usage/UsageStatsDatabase;->filterStats(Lcom/android/server/usage/IntervalStats;)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Long;Ljava/lang/Long;
+HPLcom/android/server/usage/UsageStatsDatabase;->filterStats(Lcom/android/server/usage/IntervalStats;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Ljava/lang/Long;Ljava/lang/Long;
 HPLcom/android/server/usage/UsageStatsDatabase;->parseBeginTime(Ljava/io/File;)J+]Ljava/io/File;Ljava/io/File;
-HPLcom/android/server/usage/UsageStatsDatabase;->queryUsageStats(IJJLcom/android/server/usage/UsageStatsDatabase$StatCombiner;Z)Ljava/util/List;
+HPLcom/android/server/usage/UsageStatsDatabase;->queryUsageStats(IJJLcom/android/server/usage/UsageStatsDatabase$StatCombiner;Z)Ljava/util/List;+]Lcom/android/server/usage/UsageStatsDatabase$StatCombiner;Lcom/android/server/usage/UserUsageStatsService$$ExternalSyntheticLambda2;,Lcom/android/server/usage/UserUsageStatsService$1;,Lcom/android/server/usage/UserUsageStatsService$4;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;
 HPLcom/android/server/usage/UsageStatsDatabase;->readLocked(Landroid/util/AtomicFile;Lcom/android/server/usage/IntervalStats;ILcom/android/server/usage/PackagesTokenData;Z)Z
 HPLcom/android/server/usage/UsageStatsProtoV2;->loadConfigStats(Landroid/util/proto/ProtoInputStream;Lcom/android/server/usage/IntervalStats;)V+]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream;]Lcom/android/server/usage/IntervalStats;Lcom/android/server/usage/IntervalStats;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
 HPLcom/android/server/usage/UsageStatsProtoV2;->loadCountAndTime(Landroid/util/proto/ProtoInputStream;JLcom/android/server/usage/IntervalStats$EventTracker;)V+]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream;
 HPLcom/android/server/usage/UsageStatsProtoV2;->parseEvent(Landroid/util/proto/ProtoInputStream;J)Landroid/app/usage/UsageEvents$Event;+]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
 HPLcom/android/server/usage/UsageStatsProtoV2;->parseUsageStats(Landroid/util/proto/ProtoInputStream;J)Landroid/app/usage/UsageStats;+]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream;
-HPLcom/android/server/usage/UsageStatsProtoV2;->read(Ljava/io/InputStream;Lcom/android/server/usage/IntervalStats;Z)V+]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/app/usage/EventList;Landroid/app/usage/EventList;
+HPLcom/android/server/usage/UsageStatsProtoV2;->read(Ljava/io/InputStream;Lcom/android/server/usage/IntervalStats;Z)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/usage/UsageStatsProtoV2;->write(Ljava/io/OutputStream;Lcom/android/server/usage/IntervalStats;)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
-HPLcom/android/server/usage/UsageStatsProtoV2;->writeChooserCounts(Landroid/util/proto/ProtoOutputStream;Landroid/app/usage/UsageStats;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;
+HPLcom/android/server/usage/UsageStatsProtoV2;->writeChooserCounts(Landroid/util/proto/ProtoOutputStream;Landroid/app/usage/UsageStats;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/usage/UsageStatsProtoV2;->writeConfigStats(Landroid/util/proto/ProtoOutputStream;JLandroid/app/usage/ConfigurationStats;Z)V+]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
 HPLcom/android/server/usage/UsageStatsProtoV2;->writeEvent(Landroid/util/proto/ProtoOutputStream;JLandroid/app/usage/UsageEvents$Event;)V+]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
 HPLcom/android/server/usage/UsageStatsProtoV2;->writeObfuscatedData(Ljava/io/OutputStream;Lcom/android/server/usage/PackagesTokenData;)V+]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/usage/UsageStatsProtoV2;->writeOffsetTimestamp(Landroid/util/proto/ProtoOutputStream;JJJ)V+]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;
 HPLcom/android/server/usage/UsageStatsProtoV2;->writeUsageStats(Landroid/util/proto/ProtoOutputStream;JLandroid/app/usage/UsageStats;)V+]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;
 HSPLcom/android/server/usage/UsageStatsService$$ExternalSyntheticLambda0;->handleMessage(Landroid/os/Message;)Z
-HPLcom/android/server/usage/UsageStatsService$1;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+HSPLcom/android/server/usage/UsageStatsService$1;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
 HSPLcom/android/server/usage/UsageStatsService$3;->onUidStateChanged(IIJI)V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message;
-HPLcom/android/server/usage/UsageStatsService$BinderService;->getAppStandbyBucket(Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/usage/UsageStatsService$BinderService;Lcom/android/server/usage/UsageStatsService$BinderService;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Landroid/app/IActivityManager;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HPLcom/android/server/usage/UsageStatsService$BinderService;->hasQueryPermission(Ljava/lang/String;)Z+]Lcom/android/server/SystemService;Lcom/android/server/usage/UsageStatsService;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
-HPLcom/android/server/usage/UsageStatsService$BinderService;->isAppInactive(Ljava/lang/String;ILjava/lang/String;)Z
+HPLcom/android/server/usage/UsageStatsService$BinderService;->getAppStandbyBucket(Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Landroid/app/IActivityManager;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/usage/UsageStatsService$BinderService;Lcom/android/server/usage/UsageStatsService$BinderService;
+HPLcom/android/server/usage/UsageStatsService$BinderService;->hasQueryPermission(Ljava/lang/String;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/SystemService;Lcom/android/server/usage/UsageStatsService;
+HPLcom/android/server/usage/UsageStatsService$BinderService;->isAppInactive(Ljava/lang/String;ILjava/lang/String;)Z+]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Landroid/app/IActivityManager;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HPLcom/android/server/usage/UsageStatsService$BinderService;->queryEventsHelper(IJJLjava/lang/String;[ILandroid/util/ArraySet;)Landroid/app/usage/UsageEvents;
 HPLcom/android/server/usage/UsageStatsService$BinderService;->queryUsageStats(IJJLjava/lang/String;I)Landroid/content/pm/ParceledListSlice;
-HSPLcom/android/server/usage/UsageStatsService$H;->handleMessage(Landroid/os/Message;)V+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Landroid/os/Handler;Lcom/android/server/usage/UsageStatsService$H;]Landroid/app/usage/UsageStatsManagerInternal$EstimatedLaunchTimeChangedListener;Lcom/android/server/job/controllers/PrefetchController$1;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Ljava/util/concurrent/CopyOnWriteArraySet;Ljava/util/concurrent/CopyOnWriteArraySet;]Lcom/android/server/usage/BroadcastResponseStatsTracker;Lcom/android/server/usage/BroadcastResponseStatsTracker;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;
+HSPLcom/android/server/usage/UsageStatsService$H;->handleMessage(Landroid/os/Message;)V+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Landroid/os/Handler;Lcom/android/server/usage/UsageStatsService$H;]Landroid/app/usage/UsageStatsManagerInternal$EstimatedLaunchTimeChangedListener;Lcom/android/server/job/controllers/PrefetchController$1;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Ljava/util/concurrent/CopyOnWriteArraySet;Ljava/util/concurrent/CopyOnWriteArraySet;]Lcom/android/server/usage/BroadcastResponseStatsTracker;Lcom/android/server/usage/BroadcastResponseStatsTracker;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/usage/UsageStatsService$LocalService;->getAppStandbyBucket(Ljava/lang/String;IJ)I+]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;
-HSPLcom/android/server/usage/UsageStatsService$LocalService;->isAppIdle(Ljava/lang/String;II)Z
-HSPLcom/android/server/usage/UsageStatsService$LocalService;->reportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V
-HPLcom/android/server/usage/UsageStatsService$LocalService;->reportEvent(Landroid/content/ComponentName;IIILandroid/content/ComponentName;)V
+HSPLcom/android/server/usage/UsageStatsService$LocalService;->isAppIdle(Ljava/lang/String;II)Z+]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;
+HSPLcom/android/server/usage/UsageStatsService$LocalService;->reportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V+]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;
+HSPLcom/android/server/usage/UsageStatsService$LocalService;->reportEvent(Landroid/content/ComponentName;IIILandroid/content/ComponentName;)V
 HSPLcom/android/server/usage/UsageStatsService$LocalService;->reportEvent(Ljava/lang/String;II)V
 HPLcom/android/server/usage/UsageStatsService$LocalService;->reportInterruptiveNotification(Ljava/lang/String;Ljava/lang/String;I)V
-HPLcom/android/server/usage/UsageStatsService$LocalService;->reportLocusUpdate(Landroid/content/ComponentName;ILandroid/content/LocusId;Landroid/os/IBinder;)V
-HPLcom/android/server/usage/UsageStatsService$LocalService;->setLastJobRunTime(Ljava/lang/String;IJ)V
+HSPLcom/android/server/usage/UsageStatsService$LocalService;->setLastJobRunTime(Ljava/lang/String;IJ)V+]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;
 HSPLcom/android/server/usage/UsageStatsService;->$r8$lambda$TpcNng9zAtQEa_4AWZmaJYBdR0c(Lcom/android/server/usage/UsageStatsService;Landroid/os/Message;)Z+]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;
 HSPLcom/android/server/usage/UsageStatsService;->-$$Nest$fgetmIoHandler(Lcom/android/server/usage/UsageStatsService;)Landroid/os/Handler;
-HPLcom/android/server/usage/UsageStatsService;->-$$Nest$misInstantApp(Lcom/android/server/usage/UsageStatsService;Ljava/lang/String;I)Z+]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;
 HSPLcom/android/server/usage/UsageStatsService;->-$$Nest$mreportEventOrAddToQueue(Lcom/android/server/usage/UsageStatsService;ILandroid/app/usage/UsageEvents$Event;)V+]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;
-HPLcom/android/server/usage/UsageStatsService;->-$$Nest$mshouldObfuscateInstantAppsForCaller(Lcom/android/server/usage/UsageStatsService;II)Z+]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;
 HPLcom/android/server/usage/UsageStatsService;->convertToSystemTimeLocked(Landroid/app/usage/UsageEvents$Event;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/usage/UsageStatsService;->getUserUsageStatsServiceLocked(I)Lcom/android/server/usage/UserUsageStatsService;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/usage/UsageStatsService;->isInstantApp(Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-HSPLcom/android/server/usage/UsageStatsService;->lambda$new$0(Landroid/os/Message;)Z+]Landroid/app/usage/UsageStatsManagerInternal$UsageEventListener;Lcom/android/server/usage/AppStandbyController;,Lcom/android/server/apphibernation/AppHibernationService$$ExternalSyntheticLambda0;,Lcom/android/server/job/controllers/QuotaController$UsageEventTracker;,Lcom/android/server/pm/BackgroundInstallControlService$$ExternalSyntheticLambda0;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;
+HSPLcom/android/server/usage/UsageStatsService;->lambda$new$0(Landroid/os/Message;)Z+]Landroid/app/usage/UsageStatsManagerInternal$UsageEventListener;Lcom/android/server/usage/AppStandbyController;,Lcom/android/server/apphibernation/AppHibernationService$$ExternalSyntheticLambda0;,Lcom/android/server/pm/BackgroundInstallControlService$$ExternalSyntheticLambda0;,Lcom/android/server/job/controllers/QuotaController$UsageEventTracker;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;
 HPLcom/android/server/usage/UsageStatsService;->queryEventsWithQueryFilters(IJJI[ILandroid/util/ArraySet;)Landroid/app/usage/UsageEvents;
 HPLcom/android/server/usage/UsageStatsService;->queryUsageStats(IIJJZ)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;]Lcom/android/server/usage/UserUsageStatsService;Lcom/android/server/usage/UserUsageStatsService;]Ljava/util/concurrent/CopyOnWriteArraySet;Ljava/util/concurrent/CopyOnWriteArraySet;
 HPLcom/android/server/usage/UsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;I)V+]Landroid/os/Handler;Landroid/os/Handler;,Lcom/android/server/usage/UsageStatsService$H;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;]Ljava/util/Map;Landroid/util/ArrayMap;]Lcom/android/server/usage/UserUsageStatsService;Lcom/android/server/usage/UserUsageStatsService;]Ljava/util/concurrent/CopyOnWriteArraySet;Ljava/util/concurrent/CopyOnWriteArraySet;]Lcom/android/server/usage/AppTimeLimitController;Lcom/android/server/usage/AppTimeLimitController;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
@@ -9575,95 +7107,61 @@
 HPLcom/android/server/usage/UserUsageStatsService$4;->combine(Lcom/android/server/usage/IntervalStats;ZLjava/util/List;)Z+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;
 HPLcom/android/server/usage/UserUsageStatsService;->checkAndGetTimeLocked()J+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/usage/UserUsageStatsService;Lcom/android/server/usage/UserUsageStatsService;
 HPLcom/android/server/usage/UserUsageStatsService;->convertToSystemTimeLocked(Landroid/app/usage/UsageEvents$Event;)V
-HPLcom/android/server/usage/UserUsageStatsService;->lambda$queryEarliestEventsForPackage$2(JJLjava/lang/String;ILcom/android/server/usage/IntervalStats;ZLjava/util/List;)Z+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;
 HPLcom/android/server/usage/UserUsageStatsService;->queryEvents(JJI[ILandroid/util/ArraySet;)Landroid/app/usage/UsageEvents;
 HPLcom/android/server/usage/UserUsageStatsService;->queryStats(IJJLcom/android/server/usage/UsageStatsDatabase$StatCombiner;Z)Ljava/util/List;
 HPLcom/android/server/usage/UserUsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;)V+]Lcom/android/server/usage/UnixCalendar;Lcom/android/server/usage/UnixCalendar;]Ljava/lang/Object;Ljava/lang/String;]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;]Lcom/android/server/usage/IntervalStats;Lcom/android/server/usage/IntervalStats;]Lcom/android/server/usage/UserUsageStatsService;Lcom/android/server/usage/UserUsageStatsService;
-HPLcom/android/server/usb/UsbDeviceManager$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
-HSPLcom/android/server/usb/UsbDeviceManager$UsbHandler;->handleMessage(Landroid/os/Message;)V
-HPLcom/android/server/usb/UsbDeviceManager$UsbHandler;->sendMessage(IZ)V
-HSPLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateUsbNotification(Z)V
-HSPLcom/android/server/usb/UsbHostManager;-><clinit>()V
+HSPLcom/android/server/usb/UsbDeviceManager$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Lcom/android/server/usb/UsbDeviceManager$UsbHandler;Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;]Landroid/content/Intent;Landroid/content/Intent;
+HSPLcom/android/server/usb/UsbDeviceManager$UsbHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/usb/UsbDeviceManager$UsbHandler;Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;
+HSPLcom/android/server/usb/UsbDeviceManager$UsbHandler;->sendMessage(IZ)V
+HSPLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateUsbNotification(Z)V+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/usb/UsbDeviceManager$UsbHandler;Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;
 HSPLcom/android/server/usb/hal/port/UsbPortAidl$HALCallback;->notifyPortStatusChange([Landroid/hardware/usb/PortStatus;I)V
 HSPLcom/android/server/utils/AlarmQueue$1;->run()V
 HSPLcom/android/server/utils/AlarmQueue$AlarmPriorityQueue$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
 HSPLcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;->$r8$lambda$a9G3NCnbGSjGaU6KBkUKenfyhOo(Landroid/util/Pair;Landroid/util/Pair;)I
 HSPLcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;->lambda$static$0(Landroid/util/Pair;Landroid/util/Pair;)I+]Ljava/lang/Long;Ljava/lang/Long;
 HSPLcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;->removeKey(Ljava/lang/Object;)Z+]Ljava/lang/Object;Ljava/lang/String;,Lcom/android/server/job/controllers/JobStatus;,Landroid/content/pm/UserPackage;]Ljava/util/PriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;
-HSPLcom/android/server/utils/AlarmQueue;->addAlarm(Ljava/lang/Object;J)V+]Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;,Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue;,Lcom/android/server/job/controllers/PrefetchController$ThresholdAlarmListener;,Lcom/android/server/usage/UsageStatsService$LaunchTimeAlarmQueue;]Ljava/util/PriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;
+HSPLcom/android/server/utils/AlarmQueue;->addAlarm(Ljava/lang/Object;J)V+]Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;]Ljava/util/PriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;,Lcom/android/server/usage/UsageStatsService$LaunchTimeAlarmQueue;,Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue;,Lcom/android/server/job/controllers/PrefetchController$ThresholdAlarmListener;
 HPLcom/android/server/utils/AlarmQueue;->onAlarm()V
 HSPLcom/android/server/utils/AlarmQueue;->removeAlarmForKey(Ljava/lang/Object;)V+]Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;,Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue;,Lcom/android/server/job/controllers/PrefetchController$ThresholdAlarmListener;,Lcom/android/server/usage/UsageStatsService$LaunchTimeAlarmQueue;
 HSPLcom/android/server/utils/AlarmQueue;->setNextAlarmLocked()V
-HSPLcom/android/server/utils/AlarmQueue;->setNextAlarmLocked(J)V+]Landroid/os/Handler;Landroid/os/Handler;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/util/PriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;
-HSPLcom/android/server/utils/AnrTimer$FeatureDisabled;-><init>(Lcom/android/server/utils/AnrTimer;)V
-HSPLcom/android/server/utils/AnrTimer$FeatureDisabled;-><init>(Lcom/android/server/utils/AnrTimer;Lcom/android/server/utils/AnrTimer$FeatureDisabled-IA;)V
+HSPLcom/android/server/utils/AlarmQueue;->setNextAlarmLocked(J)V+]Ljava/util/PriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;]Landroid/os/Handler;Landroid/os/Handler;]Ljava/lang/Long;Ljava/lang/Long;
 HSPLcom/android/server/utils/AnrTimer$FeatureDisabled;->cancel(Ljava/lang/Object;)Z
-HSPLcom/android/server/utils/AnrTimer$FeatureDisabled;->enabled()Z
 HSPLcom/android/server/utils/AnrTimer$FeatureDisabled;->start(Ljava/lang/Object;IIJ)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;,Landroid/os/Handler;
-HSPLcom/android/server/utils/AnrTimer$FeatureSwitch;-><init>(Lcom/android/server/utils/AnrTimer;)V
-HSPLcom/android/server/utils/AnrTimer$FeatureSwitch;-><init>(Lcom/android/server/utils/AnrTimer;Lcom/android/server/utils/AnrTimer$FeatureSwitch-IA;)V
-HSPLcom/android/server/utils/AnrTimer$Injector;-><init>()V
-HSPLcom/android/server/utils/AnrTimer$Injector;->anrTimerServiceEnabled()Z
 HSPLcom/android/server/utils/AnrTimer;->-$$Nest$fgetmHandler(Lcom/android/server/utils/AnrTimer;)Landroid/os/Handler;
 HSPLcom/android/server/utils/AnrTimer;->-$$Nest$fgetmWhat(Lcom/android/server/utils/AnrTimer;)I
-HSPLcom/android/server/utils/AnrTimer;->-$$Nest$smanrTimerServiceEnabled()Z
-HSPLcom/android/server/utils/AnrTimer;-><clinit>()V
-HSPLcom/android/server/utils/AnrTimer;-><init>(Landroid/os/Handler;ILjava/lang/String;)V
-HSPLcom/android/server/utils/AnrTimer;-><init>(Landroid/os/Handler;ILjava/lang/String;Z)V
-HSPLcom/android/server/utils/AnrTimer;-><init>(Landroid/os/Handler;ILjava/lang/String;ZLcom/android/server/utils/AnrTimer$Injector;)V
-HSPLcom/android/server/utils/AnrTimer;->anrTimerServiceEnabled()Z
-HSPLcom/android/server/utils/AnrTimer;->cancel(Ljava/lang/Object;)Z
-HSPLcom/android/server/utils/AnrTimer;->createFeatureSwitch(Z)Lcom/android/server/utils/AnrTimer$FeatureSwitch;
+HSPLcom/android/server/utils/AnrTimer;->cancel(Ljava/lang/Object;)Z+]Lcom/android/server/utils/AnrTimer$FeatureSwitch;Lcom/android/server/utils/AnrTimer$FeatureDisabled;
 HSPLcom/android/server/utils/AnrTimer;->serviceEnabled()Z+]Lcom/android/server/utils/AnrTimer$FeatureSwitch;Lcom/android/server/utils/AnrTimer$FeatureDisabled;
-HSPLcom/android/server/utils/AnrTimer;->start(Ljava/lang/Object;IIJ)V
+HSPLcom/android/server/utils/AnrTimer;->start(Ljava/lang/Object;IIJ)V+]Lcom/android/server/utils/AnrTimer$FeatureSwitch;Lcom/android/server/utils/AnrTimer$FeatureDisabled;
 HSPLcom/android/server/utils/EventLogger$Event;-><init>()V
 HSPLcom/android/server/utils/EventLogger;->enqueue(Lcom/android/server/utils/EventLogger$Event;)V+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;
-HSPLcom/android/server/utils/FeatureFlagsImpl;-><init>()V
-HSPLcom/android/server/utils/FeatureFlagsImpl;->anrTimerService()Z
-HSPLcom/android/server/utils/Flags;-><clinit>()V
-HSPLcom/android/server/utils/Flags;->anrTimerService()Z
-HSPLcom/android/server/utils/FoldSettingProvider;-><clinit>()V
-HSPLcom/android/server/utils/FoldSettingProvider;-><init>(Landroid/content/Context;Lcom/android/internal/util/SettingsWrapper;Lcom/android/internal/foldables/FoldLockSettingAvailabilityProvider;)V
-HSPLcom/android/server/utils/Slogf;-><clinit>()V
 HSPLcom/android/server/utils/Slogf;->getMessage(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
-HSPLcom/android/server/utils/Slogf;->w(Ljava/lang/String;Ljava/lang/String;)I
 HSPLcom/android/server/utils/Slogf;->w(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
-HSPLcom/android/server/utils/SnapshotCache$Auto;-><init>(Lcom/android/server/utils/Snappable;Lcom/android/server/utils/Watchable;Ljava/lang/String;)V
 HSPLcom/android/server/utils/SnapshotCache$Auto;->createSnapshot()Lcom/android/server/utils/Snappable;+]Lcom/android/server/utils/Snappable;megamorphic_types
+HSPLcom/android/server/utils/SnapshotCache$Auto;->createSnapshot()Ljava/lang/Object;+]Lcom/android/server/utils/SnapshotCache$Auto;Lcom/android/server/utils/SnapshotCache$Auto;
 HSPLcom/android/server/utils/SnapshotCache$Sealed;-><init>()V
 HSPLcom/android/server/utils/SnapshotCache$Statistics;-><init>(Ljava/lang/String;)V
-HSPLcom/android/server/utils/SnapshotCache;-><clinit>()V
 HSPLcom/android/server/utils/SnapshotCache;-><init>()V
 HSPLcom/android/server/utils/SnapshotCache;-><init>(Ljava/lang/Object;Lcom/android/server/utils/Watchable;)V
-HSPLcom/android/server/utils/SnapshotCache;-><init>(Ljava/lang/Object;Lcom/android/server/utils/Watchable;Ljava/lang/String;)V
+HSPLcom/android/server/utils/SnapshotCache;-><init>(Ljava/lang/Object;Lcom/android/server/utils/Watchable;Ljava/lang/String;)V+]Lcom/android/server/utils/Watchable;megamorphic_types]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;
 HSPLcom/android/server/utils/SnapshotCache;->onChange(Lcom/android/server/utils/Watchable;)V
 HSPLcom/android/server/utils/SnapshotCache;->snapshot()Ljava/lang/Object;+]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;]Lcom/android/server/utils/SnapshotCache;megamorphic_types
 HSPLcom/android/server/utils/Snapshots;->maybeSnapshot(Ljava/lang/Object;)Ljava/lang/Object;+]Lcom/android/server/utils/Snappable;megamorphic_types
 HSPLcom/android/server/utils/TimingsTraceAndSlog;-><init>()V
-HSPLcom/android/server/utils/TimingsTraceAndSlog;-><init>(Ljava/lang/String;)V
 HSPLcom/android/server/utils/TimingsTraceAndSlog;-><init>(Ljava/lang/String;J)V
 HSPLcom/android/server/utils/TimingsTraceAndSlog;->logDuration(Ljava/lang/String;J)V
-HSPLcom/android/server/utils/TimingsTraceAndSlog;->newAsyncLog()Lcom/android/server/utils/TimingsTraceAndSlog;
 HSPLcom/android/server/utils/TimingsTraceAndSlog;->traceBegin(Ljava/lang/String;)V
-HSPLcom/android/server/utils/Watchable;->verifyWatchedAttributes(Ljava/lang/Object;Lcom/android/server/utils/Watcher;)V
-HSPLcom/android/server/utils/Watchable;->verifyWatchedAttributes(Ljava/lang/Object;Lcom/android/server/utils/Watcher;Z)V
 HSPLcom/android/server/utils/WatchableImpl;-><init>()V
 HSPLcom/android/server/utils/WatchableImpl;->dispatchChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/utils/Watcher;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/utils/WatchableImpl;->isRegisteredObserver(Lcom/android/server/utils/Watcher;)Z
 HSPLcom/android/server/utils/WatchableImpl;->registerObserver(Lcom/android/server/utils/Watcher;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/utils/WatchableImpl;->registeredObserverCount()I
 HSPLcom/android/server/utils/WatchableImpl;->seal()V
 HSPLcom/android/server/utils/WatchableImpl;->unregisterObserver(Lcom/android/server/utils/Watcher;)V
-HSPLcom/android/server/utils/WatchedArrayList$1;-><init>(Lcom/android/server/utils/WatchedArrayList;)V
 HSPLcom/android/server/utils/WatchedArrayList$1;->onChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedArrayList;
-HSPLcom/android/server/utils/WatchedArrayList;-><init>()V
 HSPLcom/android/server/utils/WatchedArrayList;-><init>(I)V
 HSPLcom/android/server/utils/WatchedArrayList;->add(Ljava/lang/Object;)Z
-HSPLcom/android/server/utils/WatchedArrayList;->clear()V
 HSPLcom/android/server/utils/WatchedArrayList;->get(I)Ljava/lang/Object;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/utils/WatchedArrayList;->onChanged()V
 HSPLcom/android/server/utils/WatchedArrayList;->registerChild(Ljava/lang/Object;)V
-HSPLcom/android/server/utils/WatchedArrayList;->registerObserver(Lcom/android/server/utils/Watcher;)V
 HSPLcom/android/server/utils/WatchedArrayList;->set(ILjava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/utils/WatchedArrayList;->size()I+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/utils/WatchedArrayList;->snapshot(Lcom/android/server/utils/WatchedArrayList;Lcom/android/server/utils/WatchedArrayList;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedArrayList;]Lcom/android/server/utils/WatchedArrayList;Lcom/android/server/utils/WatchedArrayList;]Ljava/util/ArrayList;Ljava/util/ArrayList;
@@ -9679,9 +7177,8 @@
 HSPLcom/android/server/utils/WatchedArrayMap;->keyAt(I)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/utils/WatchedArrayMap;->onChanged()V
 HSPLcom/android/server/utils/WatchedArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLcom/android/server/utils/WatchedArrayMap;->putAll(Ljava/util/Map;)V
-HSPLcom/android/server/utils/WatchedArrayMap;->registerChild(Ljava/lang/Object;)V
-HSPLcom/android/server/utils/WatchedArrayMap;->registerObserver(Lcom/android/server/utils/Watcher;)V
+HSPLcom/android/server/utils/WatchedArrayMap;->putAll(Ljava/util/Map;)V+]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/Map;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;
+HSPLcom/android/server/utils/WatchedArrayMap;->registerChild(Ljava/lang/Object;)V+]Lcom/android/server/utils/Watchable;Lcom/android/server/utils/WatchedLongSparseArray;,Lcom/android/server/pm/PackageSetting;,Lcom/android/server/pm/SharedUserSetting;
 HSPLcom/android/server/utils/WatchedArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
 HSPLcom/android/server/utils/WatchedArrayMap;->size()I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/utils/WatchedArrayMap;->snapshot(Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedArrayMap;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;
@@ -9693,24 +7190,21 @@
 HSPLcom/android/server/utils/WatchedArraySet$1;->onChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedArraySet;
 HSPLcom/android/server/utils/WatchedArraySet;-><init>()V
 HSPLcom/android/server/utils/WatchedArraySet;-><init>(IZ)V
-HSPLcom/android/server/utils/WatchedArraySet;->add(Ljava/lang/Object;)Z
+HSPLcom/android/server/utils/WatchedArraySet;->add(Ljava/lang/Object;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/utils/WatchedArraySet;->addAll(Ljava/util/Collection;)V
 HSPLcom/android/server/utils/WatchedArraySet;->clear()V
 HSPLcom/android/server/utils/WatchedArraySet;->contains(Ljava/lang/Object;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/utils/WatchedArraySet;->isEmpty()Z
 HSPLcom/android/server/utils/WatchedArraySet;->onChanged()V
-HSPLcom/android/server/utils/WatchedArraySet;->registerChild(Ljava/lang/Object;)V
+HSPLcom/android/server/utils/WatchedArraySet;->registerChild(Ljava/lang/Object;)V+]Lcom/android/server/utils/Watchable;Lcom/android/server/pm/PackageSetting;
 HSPLcom/android/server/utils/WatchedArraySet;->registerObserver(Lcom/android/server/utils/Watcher;)V
-HSPLcom/android/server/utils/WatchedArraySet;->remove(Ljava/lang/Object;)Z
+HSPLcom/android/server/utils/WatchedArraySet;->remove(Ljava/lang/Object;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/utils/WatchedArraySet;->size()I+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/utils/WatchedArraySet;->snapshot()Lcom/android/server/utils/WatchedArraySet;
 HSPLcom/android/server/utils/WatchedArraySet;->snapshot(Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedArraySet;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/utils/WatchedArraySet;->untrackedStorage()Landroid/util/ArraySet;
 HSPLcom/android/server/utils/WatchedArraySet;->valueAt(I)Ljava/lang/Object;+]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/utils/WatchedLongSparseArray$1;-><init>(Lcom/android/server/utils/WatchedLongSparseArray;)V
 HSPLcom/android/server/utils/WatchedLongSparseArray;-><init>()V
 HSPLcom/android/server/utils/WatchedLongSparseArray;->get(J)Ljava/lang/Object;
-HSPLcom/android/server/utils/WatchedLongSparseArray;->onChanged()V
 HSPLcom/android/server/utils/WatchedLongSparseArray;->put(JLjava/lang/Object;)V
 HSPLcom/android/server/utils/WatchedLongSparseArray;->registerChild(Ljava/lang/Object;)V
 HSPLcom/android/server/utils/WatchedLongSparseArray;->registerObserver(Lcom/android/server/utils/Watcher;)V
@@ -9721,23 +7215,16 @@
 HSPLcom/android/server/utils/WatchedSparseArray$1;->onChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedSparseArray;
 HSPLcom/android/server/utils/WatchedSparseArray;-><init>()V
 HSPLcom/android/server/utils/WatchedSparseArray;-><init>(I)V
-HSPLcom/android/server/utils/WatchedSparseArray;->delete(I)V
 HSPLcom/android/server/utils/WatchedSparseArray;->get(I)Ljava/lang/Object;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/utils/WatchedSparseArray;->keyAt(I)I
-HSPLcom/android/server/utils/WatchedSparseArray;->onChanged()V
-HSPLcom/android/server/utils/WatchedSparseArray;->put(ILjava/lang/Object;)V
+HSPLcom/android/server/utils/WatchedSparseArray;->keyAt(I)I+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/utils/WatchedSparseArray;->registerChild(Ljava/lang/Object;)V
-HSPLcom/android/server/utils/WatchedSparseArray;->registerObserver(Lcom/android/server/utils/Watcher;)V
-HSPLcom/android/server/utils/WatchedSparseArray;->remove(I)V
-HSPLcom/android/server/utils/WatchedSparseArray;->size()I
+HSPLcom/android/server/utils/WatchedSparseArray;->size()I+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/utils/WatchedSparseArray;->snapshot()Lcom/android/server/utils/WatchedSparseArray;
-HSPLcom/android/server/utils/WatchedSparseArray;->snapshot(Lcom/android/server/utils/WatchedSparseArray;Lcom/android/server/utils/WatchedSparseArray;)V
-HSPLcom/android/server/utils/WatchedSparseArray;->unregisterChildIf(Ljava/lang/Object;)V
-HSPLcom/android/server/utils/WatchedSparseBooleanArray;-><init>()V
+HSPLcom/android/server/utils/WatchedSparseArray;->snapshot(Lcom/android/server/utils/WatchedSparseArray;Lcom/android/server/utils/WatchedSparseArray;)V+]Lcom/android/server/utils/WatchedSparseArray;Lcom/android/server/utils/WatchedSparseArray;]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/utils/WatchedSparseArray;->valueAt(I)Ljava/lang/Object;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/utils/WatchedSparseBooleanArray;-><init>(Lcom/android/server/utils/WatchedSparseBooleanArray;)V
 HSPLcom/android/server/utils/WatchedSparseBooleanArray;->get(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HSPLcom/android/server/utils/WatchedSparseBooleanArray;->snapshot()Lcom/android/server/utils/WatchedSparseBooleanArray;
-HSPLcom/android/server/utils/WatchedSparseBooleanMatrix;-><init>()V
 HSPLcom/android/server/utils/WatchedSparseBooleanMatrix;-><init>(I)V
 HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->binarySearch([III)I
 HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->copyFrom(Lcom/android/server/utils/WatchedSparseBooleanMatrix;)V
@@ -9753,16 +7240,16 @@
 HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->valueAt(II)Z+]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix;
 HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->valueAtInternal(II)Z
 HSPLcom/android/server/utils/WatchedSparseIntArray;-><init>()V
+HSPLcom/android/server/utils/WatchedSparseIntArray;->size()I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HSPLcom/android/server/utils/WatchedSparseIntArray;->snapshot(Lcom/android/server/utils/WatchedSparseIntArray;Lcom/android/server/utils/WatchedSparseIntArray;)V
-HSPLcom/android/server/utils/WatchedSparseSetArray;-><init>()V
 HSPLcom/android/server/utils/WatchedSparseSetArray;-><init>(Lcom/android/server/utils/WatchedSparseSetArray;)V
 HSPLcom/android/server/utils/WatchedSparseSetArray;->add(ILjava/lang/Object;)Z+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;
-HPLcom/android/server/utils/WatchedSparseSetArray;->contains(ILjava/lang/Object;)Z+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;
+HSPLcom/android/server/utils/WatchedSparseSetArray;->contains(ILjava/lang/Object;)Z+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;
 HSPLcom/android/server/utils/WatchedSparseSetArray;->onChanged()V
+HSPLcom/android/server/utils/WatchedSparseSetArray;->snapshot()Ljava/lang/Object;
 HSPLcom/android/server/utils/Watcher;-><init>()V
 HSPLcom/android/server/utils/quota/Category;->equals(Ljava/lang/Object;)Z
 HSPLcom/android/server/utils/quota/Category;->hashCode()I
-HPLcom/android/server/utils/quota/CountQuotaTracker$EarliestEventTimeFunctor;->accept(Landroid/util/LongArrayQueue;)V
 HSPLcom/android/server/utils/quota/CountQuotaTracker;->getExecutionStatsLocked(ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/utils/quota/CountQuotaTracker$ExecutionStats;+]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;
 HSPLcom/android/server/utils/quota/CountQuotaTracker;->getExecutionStatsLocked(ILjava/lang/String;Ljava/lang/String;Z)Lcom/android/server/utils/quota/CountQuotaTracker$ExecutionStats;+]Lcom/android/server/utils/quota/UptcMap;Lcom/android/server/utils/quota/UptcMap;]Lcom/android/server/utils/quota/QuotaTracker$Injector;Lcom/android/server/utils/quota/QuotaTracker$Injector;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/utils/quota/Categorizer;Lcom/android/server/job/JobSchedulerService$$ExternalSyntheticLambda4;,Lcom/android/server/utils/quota/Categorizer$$ExternalSyntheticLambda0;]Ljava/lang/Long;Ljava/lang/Long;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;
 HSPLcom/android/server/utils/quota/CountQuotaTracker;->isUnderCountQuotaLocked(Lcom/android/server/utils/quota/CountQuotaTracker$ExecutionStats;)Z
@@ -9776,42 +7263,32 @@
 HSPLcom/android/server/utils/quota/QuotaTracker;->isEnabledLocked()Z
 HSPLcom/android/server/utils/quota/QuotaTracker;->isQuotaFreeLocked(ILjava/lang/String;)Z+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/lang/Boolean;Ljava/lang/Boolean;
 HSPLcom/android/server/utils/quota/QuotaTracker;->isWithinQuota(ILjava/lang/String;Ljava/lang/String;)Z+]Lcom/android/server/utils/quota/QuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;
-HSPLcom/android/server/utils/quota/UptcMap;->get(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/Object;
+HSPLcom/android/server/utils/quota/UptcMap;->get(ILjava/lang/String;Ljava/lang/String;)Ljava/lang/Object;+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;
 HSPLcom/android/server/utils/quota/UptcMap;->getOrCreate(ILjava/lang/String;Ljava/lang/String;Ljava/util/function/Function;)Ljava/lang/Object;+]Lcom/android/server/utils/quota/UptcMap;Lcom/android/server/utils/quota/UptcMap;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/function/Function;Lcom/android/server/utils/quota/CountQuotaTracker$$ExternalSyntheticLambda2;,Lcom/android/server/utils/quota/CountQuotaTracker$$ExternalSyntheticLambda1;
 HPLcom/android/server/utils/quota/UptcMap;->lambda$forEach$0(Ljava/util/function/Consumer;Landroid/util/ArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Consumer;Lcom/android/server/utils/quota/CountQuotaTracker$EarliestEventTimeFunctor;,Lcom/android/server/utils/quota/CountQuotaTracker$DeleteEventTimesFunctor;
-HPLcom/android/server/vcn/TelephonySubscriptionTracker$TelephonySubscriptionSnapshot;->getGroupForSubId(I)Landroid/os/ParcelUuid;
 HPLcom/android/server/vibrator/AbstractVibratorStep;-><init>(Lcom/android/server/vibrator/VibrationStepConductor;JLcom/android/server/vibrator/VibratorController;Landroid/os/VibrationEffect$Composed;IJ)V
-HPLcom/android/server/vibrator/AbstractVibratorStep;->acceptVibratorCompleteCallback(I)Z
-HPLcom/android/server/vibrator/AbstractVibratorStep;->handleVibratorOnResult(J)J
-HPLcom/android/server/vibrator/AbstractVibratorStep;->nextSteps(JI)Ljava/util/List;
-HPLcom/android/server/vibrator/AbstractVibratorStep;->stopVibrating()V
+HPLcom/android/server/vibrator/AbstractVibratorStep;->nextSteps(JI)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;
 HPLcom/android/server/vibrator/CompleteEffectVibratorStep;->play()Ljava/util/List;
-HPLcom/android/server/vibrator/ComposePrimitivesVibratorStep;->play()Ljava/util/List;
+HPLcom/android/server/vibrator/ComposePrimitivesVibratorStep;->play()Ljava/util/List;+]Landroid/os/VibratorInfo;Landroid/os/VibratorInfo;]Ljava/util/List;Ljava/util/ArrayList;
 HPLcom/android/server/vibrator/DeviceAdapter;->adaptToVibrator(ILandroid/os/VibrationEffect;)Landroid/os/VibrationEffect;+]Lcom/android/server/vibrator/VibrationSegmentsAdapter;megamorphic_types]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Lcom/android/server/vibrator/VibratorController;Lcom/android/server/vibrator/VibratorController;]Landroid/os/VibrationEffect$Composed;Landroid/os/VibrationEffect$Composed;
-HPLcom/android/server/vibrator/FinishSequentialEffectStep;->play()Ljava/util/List;
+HPLcom/android/server/vibrator/FinishSequentialEffectStep;->play()Ljava/util/List;+]Lcom/android/server/vibrator/VibrationThread$VibratorManagerHooks;Lcom/android/server/vibrator/VibratorManagerService$VibrationThreadCallbacks;
 HPLcom/android/server/vibrator/HalVibration;-><init>(Landroid/os/IBinder;Landroid/os/CombinedVibration;Lcom/android/server/vibrator/Vibration$CallerInfo;)V
-HPLcom/android/server/vibrator/HalVibration;->end(Lcom/android/server/vibrator/Vibration$EndInfo;)V
+HPLcom/android/server/vibrator/HalVibration;->end(Lcom/android/server/vibrator/Vibration$EndInfo;)V+]Ljava/util/concurrent/CountDownLatch;Ljava/util/concurrent/CountDownLatch;
 HPLcom/android/server/vibrator/HalVibration;->getDebugInfo()Lcom/android/server/vibrator/Vibration$DebugInfo;
 HPLcom/android/server/vibrator/HalVibration;->getStatsInfo(J)Lcom/android/server/vibrator/VibrationStats$StatsInfo;
 HPLcom/android/server/vibrator/PerformPrebakedVibratorStep;->play()Ljava/util/List;
-HPLcom/android/server/vibrator/StartSequentialEffectStep$DeviceEffectMap;-><init>(Lcom/android/server/vibrator/StartSequentialEffectStep;Landroid/os/CombinedVibration$Mono;)V
-HPLcom/android/server/vibrator/StartSequentialEffectStep$DeviceEffectMap;->calculateRequiredSyncCapabilities(Landroid/util/SparseArray;)J
-HPLcom/android/server/vibrator/StartSequentialEffectStep;-><init>(Lcom/android/server/vibrator/VibrationStepConductor;Landroid/os/CombinedVibration$Sequential;)V
-HPLcom/android/server/vibrator/StartSequentialEffectStep;->play()Ljava/util/List;
-HPLcom/android/server/vibrator/StartSequentialEffectStep;->startVibrating(Lcom/android/server/vibrator/AbstractVibratorStep;Ljava/util/List;)J
-HPLcom/android/server/vibrator/StartSequentialEffectStep;->startVibrating(Lcom/android/server/vibrator/StartSequentialEffectStep$DeviceEffectMap;Ljava/util/List;)J
-HPLcom/android/server/vibrator/Step;-><init>(Lcom/android/server/vibrator/VibrationStepConductor;J)V
-HPLcom/android/server/vibrator/Step;->calculateWaitTime()J
+HPLcom/android/server/vibrator/StartSequentialEffectStep$DeviceEffectMap;-><init>(Lcom/android/server/vibrator/StartSequentialEffectStep;Landroid/os/CombinedVibration$Mono;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HPLcom/android/server/vibrator/StartSequentialEffectStep$DeviceEffectMap;->calculateRequiredSyncCapabilities(Landroid/util/SparseArray;)J+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HPLcom/android/server/vibrator/StartSequentialEffectStep;->play()Ljava/util/List;+]Lcom/android/server/vibrator/VibrationThread$VibratorManagerHooks;Lcom/android/server/vibrator/VibratorManagerService$VibrationThreadCallbacks;]Ljava/util/List;Ljava/util/ArrayList;
+HPLcom/android/server/vibrator/StartSequentialEffectStep;->startVibrating(Lcom/android/server/vibrator/AbstractVibratorStep;Ljava/util/List;)J+]Lcom/android/server/vibrator/AbstractVibratorStep;Lcom/android/server/vibrator/ComposePrimitivesVibratorStep;,Lcom/android/server/vibrator/SetAmplitudeVibratorStep;,Lcom/android/server/vibrator/PerformPrebakedVibratorStep;]Lcom/android/server/vibrator/Step;Lcom/android/server/vibrator/ComposePrimitivesVibratorStep;,Lcom/android/server/vibrator/SetAmplitudeVibratorStep;,Lcom/android/server/vibrator/PerformPrebakedVibratorStep;]Ljava/util/List;Ljava/util/ArrayList;
+HPLcom/android/server/vibrator/StartSequentialEffectStep;->startVibrating(Lcom/android/server/vibrator/StartSequentialEffectStep$DeviceEffectMap;Ljava/util/List;)J+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/vibrator/Vibration$CallerInfo;-><init>(Landroid/os/VibrationAttributes;IILjava/lang/String;Ljava/lang/String;)V
-HPLcom/android/server/vibrator/Vibration$EndInfo;-><init>(Lcom/android/server/vibrator/Vibration$Status;Lcom/android/server/vibrator/Vibration$CallerInfo;)V
 HPLcom/android/server/vibrator/Vibration;-><init>(Landroid/os/IBinder;Lcom/android/server/vibrator/Vibration$CallerInfo;)V
-HPLcom/android/server/vibrator/VibrationScaler;->scale(Landroid/os/VibrationEffect;I)Landroid/os/VibrationEffect;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/vibrator/VibrationSettings;Lcom/android/server/vibrator/VibrationSettings;]Lcom/android/server/vibrator/VibrationScaler;Lcom/android/server/vibrator/VibrationScaler;]Landroid/os/VibrationEffect$Composed;Landroid/os/VibrationEffect$Composed;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/vibrator/VibrationEffectSegment;Landroid/os/vibrator/PrimitiveSegment;,Landroid/os/vibrator/PrebakedSegment;,Landroid/os/vibrator/StepSegment;
+HPLcom/android/server/vibrator/VibrationScaler;->scale(Landroid/os/VibrationEffect;I)Landroid/os/VibrationEffect;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/vibrator/VibrationEffectSegment;Landroid/os/vibrator/PrimitiveSegment;,Landroid/os/vibrator/PrebakedSegment;,Landroid/os/vibrator/StepSegment;]Lcom/android/server/vibrator/VibrationSettings;Lcom/android/server/vibrator/VibrationSettings;]Lcom/android/server/vibrator/VibrationScaler;Lcom/android/server/vibrator/VibrationScaler;]Landroid/os/VibrationEffect$Composed;Landroid/os/VibrationEffect$Composed;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/vibrator/VibrationSettings$VibrationUidObserver;->onUidStateChanged(IIJI)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/vibrator/VibrationSettings;->getCurrentIntensity(I)I
 HSPLcom/android/server/vibrator/VibrationSettings;->getDefaultIntensity(I)I
-HSPLcom/android/server/vibrator/VibrationSettings;->getRampStepDuration()I
-HPLcom/android/server/vibrator/VibrationSettings;->shouldIgnoreVibration(Lcom/android/server/vibrator/Vibration$CallerInfo;)Lcom/android/server/vibrator/Vibration$Status;
-HPLcom/android/server/vibrator/VibrationSettings;->shouldVibrateForUserSetting(Lcom/android/server/vibrator/Vibration$CallerInfo;)Z
+HPLcom/android/server/vibrator/VibrationSettings;->shouldIgnoreVibration(Lcom/android/server/vibrator/Vibration$CallerInfo;)Lcom/android/server/vibrator/Vibration$Status;+]Landroid/os/vibrator/VibrationConfig;Landroid/os/vibrator/VibrationConfig;
+HPLcom/android/server/vibrator/VibrationSettings;->shouldVibrateForUserSetting(Lcom/android/server/vibrator/Vibration$CallerInfo;)Z+]Landroid/os/vibrator/VibrationConfig;Landroid/os/vibrator/VibrationConfig;
 HPLcom/android/server/vibrator/VibrationStats$StatsInfo;-><init>(IIILcom/android/server/vibrator/Vibration$Status;Lcom/android/server/vibrator/VibrationStats;J)V
 HPLcom/android/server/vibrator/VibrationStats$StatsInfo;->filteredKeys(Landroid/util/SparseBooleanArray;Z)[I+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;
 HPLcom/android/server/vibrator/VibrationStats$StatsInfo;->writeVibrationReported()V
@@ -9820,113 +7297,101 @@
 HPLcom/android/server/vibrator/VibrationStats;->reportStarted()V
 HPLcom/android/server/vibrator/VibrationStepConductor;->calculateVibrationEndInfo()Lcom/android/server/vibrator/Vibration$EndInfo;
 HPLcom/android/server/vibrator/VibrationStepConductor;->expectIsVibrationThread(Z)V
-HPLcom/android/server/vibrator/VibrationStepConductor;->hasPendingNotifySignalLocked()Z
+HPLcom/android/server/vibrator/VibrationStepConductor;->hasPendingNotifySignalLocked()Z+]Landroid/util/IntArray;Landroid/util/IntArray;
 HPLcom/android/server/vibrator/VibrationStepConductor;->isFinished()Z+]Ljava/util/Queue;Ljava/util/LinkedList;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;
-HPLcom/android/server/vibrator/VibrationStepConductor;->nextVibrateStep(JLcom/android/server/vibrator/VibratorController;Landroid/os/VibrationEffect$Composed;IJ)Lcom/android/server/vibrator/AbstractVibratorStep;
+HPLcom/android/server/vibrator/VibrationStepConductor;->nextVibrateStep(JLcom/android/server/vibrator/VibratorController;Landroid/os/VibrationEffect$Composed;IJ)Lcom/android/server/vibrator/AbstractVibratorStep;+]Ljava/util/List;Ljava/util/ArrayList;
 HPLcom/android/server/vibrator/VibrationStepConductor;->pollNext()Lcom/android/server/vibrator/Step;+]Ljava/util/Queue;Ljava/util/LinkedList;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;
-HPLcom/android/server/vibrator/VibrationStepConductor;->prepareToStart()V
+HPLcom/android/server/vibrator/VibrationStepConductor;->prepareToStart()V+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;
 HPLcom/android/server/vibrator/VibrationStepConductor;->processAllNotifySignals()V+]Landroid/util/IntArray;Landroid/util/IntArray;]Lcom/android/server/vibrator/VibrationStepConductor;Lcom/android/server/vibrator/VibrationStepConductor;
-HPLcom/android/server/vibrator/VibrationStepConductor;->processVibratorsComplete([I)V
+HPLcom/android/server/vibrator/VibrationStepConductor;->processVibratorsComplete([I)V+]Lcom/android/server/vibrator/Step;Lcom/android/server/vibrator/SetAmplitudeVibratorStep;,Lcom/android/server/vibrator/TurnOffVibratorStep;,Lcom/android/server/vibrator/FinishSequentialEffectStep;,Lcom/android/server/vibrator/CompleteEffectVibratorStep;]Ljava/util/Queue;Ljava/util/LinkedList;]Ljava/util/Iterator;Ljava/util/PriorityQueue$Itr;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;
 HPLcom/android/server/vibrator/VibrationStepConductor;->runNextStep()V+]Lcom/android/server/vibrator/Step;megamorphic_types]Ljava/util/List;Ljava/util/Arrays$ArrayList;,Ljava/util/ArrayList;]Lcom/android/server/vibrator/VibrationStepConductor;Lcom/android/server/vibrator/VibrationStepConductor;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;
 HPLcom/android/server/vibrator/VibrationStepConductor;->waitUntilNextStepIsDue()Z+]Ljava/lang/Object;Ljava/lang/Object;]Lcom/android/server/vibrator/Step;megamorphic_types]Ljava/util/Queue;Ljava/util/LinkedList;]Lcom/android/server/vibrator/VibrationStepConductor;Lcom/android/server/vibrator/VibrationStepConductor;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue;
-HPLcom/android/server/vibrator/VibrationThread;->clientVibrationCompleteIfNotAlready(Lcom/android/server/vibrator/Vibration$EndInfo;)V
+HPLcom/android/server/vibrator/VibrationThread;->clientVibrationCompleteIfNotAlready(Lcom/android/server/vibrator/Vibration$EndInfo;)V+]Lcom/android/server/vibrator/VibrationThread$VibratorManagerHooks;Lcom/android/server/vibrator/VibratorManagerService$VibrationThreadCallbacks;
 HPLcom/android/server/vibrator/VibrationThread;->playVibration()V+]Lcom/android/server/vibrator/VibrationStepConductor;Lcom/android/server/vibrator/VibrationStepConductor;]Lcom/android/server/vibrator/VibrationThread;Lcom/android/server/vibrator/VibrationThread;
 HSPLcom/android/server/vibrator/VibrationThread;->run()V
 HPLcom/android/server/vibrator/VibrationThread;->runCurrentVibrationWithWakeLock()V
-HPLcom/android/server/vibrator/VibrationThread;->runCurrentVibrationWithWakeLockAndDeathLink()V
-HPLcom/android/server/vibrator/VibrationThread;->runVibrationOnVibrationThread(Lcom/android/server/vibrator/VibrationStepConductor;)Z
+HPLcom/android/server/vibrator/VibrationThread;->runCurrentVibrationWithWakeLockAndDeathLink()V+]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/os/Binder;,Lcom/android/server/vibrator/VibratorManagerService;
 HSPLcom/android/server/vibrator/VibrationThread;->waitForVibrationRequest()Lcom/android/server/vibrator/VibrationStepConductor;
-HPLcom/android/server/vibrator/VibratorController$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/vibrator/VibratorController;Z)V
 HSPLcom/android/server/vibrator/VibratorController;->getVibratorInfo()Landroid/os/VibratorInfo;
-HSPLcom/android/server/vibrator/VibratorController;->notifyListenerOnVibrating(Z)V
-HSPLcom/android/server/vibrator/VibratorController;->off()V
-HPLcom/android/server/vibrator/VibratorFrameworkStatsLogger;->writeVibrationReportedAsync(Lcom/android/server/vibrator/VibrationStats$StatsInfo;)V
-HPLcom/android/server/vibrator/VibratorFrameworkStatsLogger;->writeVibrationReportedFromQueue()V
-HPLcom/android/server/vibrator/VibratorManagerService$VibrationThreadCallbacks;->noteVibratorOff(I)V
-HPLcom/android/server/vibrator/VibratorManagerService$VibrationThreadCallbacks;->noteVibratorOn(IJ)V
+HSPLcom/android/server/vibrator/VibratorController;->notifyListenerOnVibrating(Z)V+]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
+HSPLcom/android/server/vibrator/VibratorController;->off()V+]Lcom/android/server/vibrator/VibratorController$NativeWrapper;Lcom/android/server/vibrator/VibratorController$NativeWrapper;
+HPLcom/android/server/vibrator/VibratorFrameworkStatsLogger;->writeVibrationReportedAsync(Lcom/android/server/vibrator/VibrationStats$StatsInfo;)V+]Ljava/util/Queue;Ljava/util/ArrayDeque;
+HPLcom/android/server/vibrator/VibratorFrameworkStatsLogger;->writeVibrationReportedFromQueue()V+]Ljava/util/Queue;Ljava/util/ArrayDeque;
+HPLcom/android/server/vibrator/VibratorManagerService$VibrationThreadCallbacks;->noteVibratorOn(IJ)V+]Lcom/android/server/vibrator/VibratorFrameworkStatsLogger;Lcom/android/server/vibrator/VibratorFrameworkStatsLogger;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;
 HPLcom/android/server/vibrator/VibratorManagerService$VibrationThreadCallbacks;->onVibrationCompleted(JLcom/android/server/vibrator/Vibration$EndInfo;)V
-HPLcom/android/server/vibrator/VibratorManagerService$VibrationThreadCallbacks;->onVibrationThreadReleased(J)V
+HPLcom/android/server/vibrator/VibratorManagerService$VibrationThreadCallbacks;->onVibrationThreadReleased(J)V+]Lcom/android/server/vibrator/VibratorFrameworkStatsLogger;Lcom/android/server/vibrator/VibratorFrameworkStatsLogger;
 HPLcom/android/server/vibrator/VibratorManagerService$VibratorManagerRecords;->record(Lcom/android/server/vibrator/Vibration$DebugInfo;)V
-HPLcom/android/server/vibrator/VibratorManagerService;->checkAppOpModeLocked(Lcom/android/server/vibrator/Vibration$CallerInfo;)I
+HPLcom/android/server/vibrator/VibratorManagerService;->checkAppOpModeLocked(Lcom/android/server/vibrator/Vibration$CallerInfo;)I+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
 HPLcom/android/server/vibrator/VibratorManagerService;->createVibrationStepConductor(Lcom/android/server/vibrator/HalVibration;)Lcom/android/server/vibrator/VibrationStepConductor;
-HPLcom/android/server/vibrator/VibratorManagerService;->endVibrationLocked(Lcom/android/server/vibrator/HalVibration;Lcom/android/server/vibrator/Vibration$EndInfo;Z)V
-HPLcom/android/server/vibrator/VibratorManagerService;->fillVibrationFallbacks(Lcom/android/server/vibrator/HalVibration;Landroid/os/CombinedVibration;)V
-HPLcom/android/server/vibrator/VibratorManagerService;->fillVibrationFallbacks(Lcom/android/server/vibrator/HalVibration;Landroid/os/VibrationEffect;)V+]Landroid/os/vibrator/PrebakedSegment;Landroid/os/vibrator/PrebakedSegment;]Lcom/android/server/vibrator/VibrationSettings;Lcom/android/server/vibrator/VibrationSettings;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/VibrationEffect$Composed;Landroid/os/VibrationEffect$Composed;]Lcom/android/server/vibrator/HalVibration;Lcom/android/server/vibrator/HalVibration;
-HPLcom/android/server/vibrator/VibratorManagerService;->fixupVibrationAttributes(Landroid/os/VibrationAttributes;Landroid/os/CombinedVibration;)Landroid/os/VibrationAttributes;
+HPLcom/android/server/vibrator/VibratorManagerService;->endVibrationLocked(Lcom/android/server/vibrator/HalVibration;Lcom/android/server/vibrator/Vibration$EndInfo;Z)V+]Lcom/android/server/vibrator/VibratorFrameworkStatsLogger;Lcom/android/server/vibrator/VibratorFrameworkStatsLogger;
+HPLcom/android/server/vibrator/VibratorManagerService;->fillVibrationFallbacks(Lcom/android/server/vibrator/HalVibration;Landroid/os/VibrationEffect;)V+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/vibrator/PrebakedSegment;Landroid/os/vibrator/PrebakedSegment;]Lcom/android/server/vibrator/VibrationSettings;Lcom/android/server/vibrator/VibrationSettings;]Landroid/os/VibrationEffect$Composed;Landroid/os/VibrationEffect$Composed;]Lcom/android/server/vibrator/HalVibration;Lcom/android/server/vibrator/HalVibration;
 HPLcom/android/server/vibrator/VibratorManagerService;->onVibrationComplete(IJ)V
 HPLcom/android/server/vibrator/VibratorManagerService;->reportFinishedVibrationLocked(Lcom/android/server/vibrator/Vibration$EndInfo;)V
-HPLcom/android/server/vibrator/VibratorManagerService;->startAppOpModeLocked(Lcom/android/server/vibrator/Vibration$CallerInfo;)I
+HPLcom/android/server/vibrator/VibratorManagerService;->startAppOpModeLocked(Lcom/android/server/vibrator/Vibration$CallerInfo;)I+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
 HPLcom/android/server/vibrator/VibratorManagerService;->startVibrationLocked(Lcom/android/server/vibrator/HalVibration;)Lcom/android/server/vibrator/Vibration$EndInfo;
 HPLcom/android/server/vibrator/VibratorManagerService;->startVibrationOnThreadLocked(Lcom/android/server/vibrator/VibrationStepConductor;)Lcom/android/server/vibrator/Vibration$EndInfo;
 HPLcom/android/server/vibrator/VibratorManagerService;->vibrateInternal(IILjava/lang/String;Landroid/os/CombinedVibration;Landroid/os/VibrationAttributes;Ljava/lang/String;Landroid/os/IBinder;)Lcom/android/server/vibrator/HalVibration;
 HPLcom/android/server/vibrator/VibratorManagerService;->vibrateWithPermissionCheck(IILjava/lang/String;Landroid/os/CombinedVibration;Landroid/os/VibrationAttributes;Ljava/lang/String;Landroid/os/IBinder;)Lcom/android/server/vibrator/HalVibration;
-HPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$$ExternalSyntheticLambda6;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;Landroid/os/IBinder;I)V
 HPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$$ExternalSyntheticLambda6;->runOrThrow()V
-HPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->notifyActivityEventChanged(Landroid/os/IBinder;I)V
-HPLcom/android/server/wallpaper/WallpaperDataParser;->writeWallpaperAttributes(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/lang/String;Lcom/android/server/wallpaper/WallpaperData;)V
+HSPLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->notifyActivityEventChanged(Landroid/os/IBinder;I)V
+HSPLcom/android/server/wallpaper/WallpaperDataParser;->writeWallpaperAttributes(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/lang/String;Lcom/android/server/wallpaper/WallpaperData;)V+]Ljava/util/Map$Entry;Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/app/WallpaperColors;Landroid/app/WallpaperColors;]Landroid/graphics/Color;Landroid/graphics/Color;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Lcom/android/server/wallpaper/WallpaperDisplayHelper;Lcom/android/server/wallpaper/WallpaperDisplayHelper;]Ljava/lang/Enum;Lcom/android/server/wallpaper/WallpaperData$BindSource;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/lang/Float;Ljava/lang/Float;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1;
 HSPLcom/android/server/wallpaper/WallpaperManagerService;->getActiveWallpapers()[Lcom/android/server/wallpaper/WallpaperData;
-HPLcom/android/server/webkit/WebViewUpdateService$BinderService;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;
-HPLcom/android/server/webkit/WebViewUpdateService$BinderService;->grantVisibilityToCaller(Ljava/lang/String;I)V
+HPLcom/android/server/webkit/WebViewUpdateService$BinderService;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;+]Lcom/android/server/webkit/WebViewUpdateServiceInterface;Lcom/android/server/webkit/WebViewUpdateServiceImpl;
+HPLcom/android/server/webkit/WebViewUpdateService$BinderService;->grantVisibilityToCaller(Ljava/lang/String;I)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
 HSPLcom/android/server/webkit/WebViewUpdateServiceImpl;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;
-HPLcom/android/server/wm/AbsAppSnapshotController;->createSnapshot(Lcom/android/server/wm/WindowContainer;FLandroid/graphics/Rect;Landroid/window/TaskSnapshot$Builder;)Landroid/window/ScreenCapture$ScreenshotHardwareBuffer;
 HPLcom/android/server/wm/AbsAppSnapshotController;->prepareTaskSnapshot(Lcom/android/server/wm/WindowContainer;Landroid/window/TaskSnapshot$Builder;)Landroid/graphics/Rect;
+HSPLcom/android/server/wm/AbsAppSnapshotController;->shouldDisableSnapshots()Z
 HPLcom/android/server/wm/AccessibilityController$AccessibilityControllerInternalImpl$UiChangesForAccessibilityCallbacksDispatcher;->onRectangleOnScreenRequested(ILandroid/graphics/Rect;)V
-HSPLcom/android/server/wm/AccessibilityController$AccessibilityControllerInternalImpl;->getInstance(Lcom/android/server/wm/WindowManagerService;)Lcom/android/server/wm/AccessibilityController$AccessibilityControllerInternalImpl;
 HSPLcom/android/server/wm/AccessibilityController$AccessibilityControllerInternalImpl;->isTracingEnabled(J)Z
 HSPLcom/android/server/wm/AccessibilityController;->hasCallbacks()Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/AccessibilityController$AccessibilityControllerInternalImpl;Lcom/android/server/wm/AccessibilityController$AccessibilityControllerInternalImpl;
-HSPLcom/android/server/wm/ActivityClientController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
-HPLcom/android/server/wm/ActivityClientController;->activityIdle(Landroid/os/IBinder;Landroid/content/res/Configuration;Z)V
+HSPLcom/android/server/wm/ActivityClientController;->activityIdle(Landroid/os/IBinder;Landroid/content/res/Configuration;Z)V
 HPLcom/android/server/wm/ActivityClientController;->activityStopped(Landroid/os/IBinder;Landroid/os/Bundle;Landroid/os/PersistableBundle;Ljava/lang/CharSequence;)V
 HSPLcom/android/server/wm/ActivityInterceptorCallback$ActivityInterceptorInfo$Builder;-><init>(IIIIILandroid/content/Intent;Landroid/content/pm/ResolveInfo;Landroid/content/pm/ActivityInfo;)V
 HSPLcom/android/server/wm/ActivityInterceptorCallback$ActivityInterceptorInfo;-><init>(Lcom/android/server/wm/ActivityInterceptorCallback$ActivityInterceptorInfo$Builder;)V
-HSPLcom/android/server/wm/ActivityMetricsLaunchObserver;-><init>()V
-HSPLcom/android/server/wm/ActivityMetricsLogger$LaunchingState;-><init>()V
-HPLcom/android/server/wm/ActivityMetricsLogger$LaunchingState;->stopTrace(ZLcom/android/server/wm/ActivityMetricsLogger$TransitionInfo;)V
+HSPLcom/android/server/wm/ActivityMetricsLogger$LaunchingState;->stopTrace(ZLcom/android/server/wm/ActivityMetricsLogger$TransitionInfo;)V
 HSPLcom/android/server/wm/ActivityMetricsLogger$TransitionInfo;-><init>(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityMetricsLogger$LaunchingState;Landroid/app/ActivityOptions;IZZIIZ)V
-HPLcom/android/server/wm/ActivityMetricsLogger$TransitionInfoSnapshot;-><init>(Lcom/android/server/wm/ActivityMetricsLogger$TransitionInfo;Lcom/android/server/wm/ActivityRecord;I)V
-HSPLcom/android/server/wm/ActivityMetricsLogger;-><clinit>()V
-HSPLcom/android/server/wm/ActivityMetricsLogger;-><init>(Lcom/android/server/wm/ActivityTaskSupervisor;Landroid/os/Looper;)V
-HSPLcom/android/server/wm/ActivityMetricsLogger;->getActiveTransitionInfo(Lcom/android/server/wm/ActivityRecord;)Lcom/android/server/wm/ActivityMetricsLogger$TransitionInfo;
-HSPLcom/android/server/wm/ActivityMetricsLogger;->logAppCompatState(Lcom/android/server/wm/ActivityRecord;)V
+HSPLcom/android/server/wm/ActivityMetricsLogger$TransitionInfoSnapshot;-><init>(Lcom/android/server/wm/ActivityMetricsLogger$TransitionInfo;Lcom/android/server/wm/ActivityRecord;I)V
+HSPLcom/android/server/wm/ActivityMetricsLogger;->getActiveTransitionInfo(Lcom/android/server/wm/ActivityRecord;)Lcom/android/server/wm/ActivityMetricsLogger$TransitionInfo;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/ActivityMetricsLogger;->logAppCompatState(Lcom/android/server/wm/ActivityRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/ActivityMetricsLogger;->logAppCompatStateInternal(Lcom/android/server/wm/ActivityRecord;ILcom/android/server/wm/ActivityMetricsLogger$PackageCompatStateInfo;)V
-HPLcom/android/server/wm/ActivityMetricsLogger;->logAppTransition(JILcom/android/server/wm/ActivityMetricsLogger$TransitionInfoSnapshot;ZII)V
+HSPLcom/android/server/wm/ActivityMetricsLogger;->logAppTransition(JILcom/android/server/wm/ActivityMetricsLogger$TransitionInfoSnapshot;ZII)V
 HPLcom/android/server/wm/ActivityMetricsLogger;->logWindowState()V
 HSPLcom/android/server/wm/ActivityMetricsLogger;->notifyActivityLaunched(Lcom/android/server/wm/ActivityMetricsLogger$LaunchingState;IZLcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;)V
-HPLcom/android/server/wm/ActivityMetricsLogger;->notifyTransitionStarting(Landroid/util/ArrayMap;)V
+HSPLcom/android/server/wm/ActivityMetricsLogger;->notifyBindApplication(Landroid/content/pm/ApplicationInfo;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/ActivityMetricsLogger;->notifyTransitionStarting(Landroid/util/ArrayMap;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord$$ExternalSyntheticLambda15;-><init>()V
-HSPLcom/android/server/wm/ActivityRecord$$ExternalSyntheticLambda16;-><init>(Lcom/android/server/wm/ActivityRecord;Landroid/graphics/Rect;)V
-HSPLcom/android/server/wm/ActivityRecord$$ExternalSyntheticLambda16;->get()Ljava/lang/Object;
 HSPLcom/android/server/wm/ActivityRecord$Builder;->build()Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/ActivityRecord$Token;->toString()Ljava/lang/String;+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;
 HSPLcom/android/server/wm/ActivityRecord;->$r8$lambda$y0npCffze-hoyeHGzAjmpNlZO0Y(Lcom/android/server/wm/ActivityRecord;Landroid/graphics/Rect;)Landroid/graphics/Rect;
 HSPLcom/android/server/wm/ActivityRecord;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/WindowProcessController;IILjava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/pm/ActivityInfo;Landroid/content/res/Configuration;Lcom/android/server/wm/ActivityRecord;Ljava/lang/String;IZZLcom/android/server/wm/ActivityTaskSupervisor;Landroid/app/ActivityOptions;Lcom/android/server/wm/ActivityRecord;Landroid/os/PersistableBundle;Landroid/app/ActivityManager$TaskDescription;J)V
 HPLcom/android/server/wm/ActivityRecord;->activityPaused(Z)V
-HPLcom/android/server/wm/ActivityRecord;->activityResumedLocked(Landroid/os/IBinder;Z)V
+HSPLcom/android/server/wm/ActivityRecord;->activityResumedLocked(Landroid/os/IBinder;Z)V
 HPLcom/android/server/wm/ActivityRecord;->activityStopped(Landroid/os/Bundle;Landroid/os/PersistableBundle;Ljava/lang/CharSequence;)V
 HSPLcom/android/server/wm/ActivityRecord;->addStartingWindow(Ljava/lang/String;ILcom/android/server/wm/ActivityRecord;ZZZZZZZ)Z
 HPLcom/android/server/wm/ActivityRecord;->addToStopping(ZZLjava/lang/String;)V
-HPLcom/android/server/wm/ActivityRecord;->allDrawnStatesConsidered()Z
+HSPLcom/android/server/wm/ActivityRecord;->allDrawnStatesConsidered()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/ActivityRecord;->areBoundsLetterboxed()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->asActivityRecord()Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/ActivityRecord;->attachedToProcess()Z
-HPLcom/android/server/wm/ActivityRecord;->canAffectSystemUiFlags()Z
+HSPLcom/android/server/wm/ActivityRecord;->attachedToProcess()Z+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;
+HSPLcom/android/server/wm/ActivityRecord;->canAffectSystemUiFlags()Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/ActivityRecord;->canBeTopRunning()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->canReceiveKeys()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLcom/android/server/wm/ActivityRecord;->canResumeByCompat()Z
+HSPLcom/android/server/wm/ActivityRecord;->canResumeByCompat()Z+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;
 HSPLcom/android/server/wm/ActivityRecord;->canShowWhenLocked()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->canShowWhenLocked(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->canShowWhenLockedInner(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/ActivityRecord;->canTurnScreenOn()Z
-HPLcom/android/server/wm/ActivityRecord;->checkKeyguardFlagsChanged()V
-HPLcom/android/server/wm/ActivityRecord;->commitVisibility(ZZZ)V
-HPLcom/android/server/wm/ActivityRecord;->completeResumeLocked()V
+HSPLcom/android/server/wm/ActivityRecord;->canTurnScreenOn()Z+]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
+HSPLcom/android/server/wm/ActivityRecord;->checkKeyguardFlagsChanged()V
+HSPLcom/android/server/wm/ActivityRecord;->commitVisibility(ZZZ)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/ActivityRecord;->completeResumeLocked()V
 HSPLcom/android/server/wm/ActivityRecord;->containsDismissKeyguardWindow()Z+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->containsShowWhenLockedWindow()Z+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->containsTurnScreenOnWindow()Z+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HPLcom/android/server/wm/ActivityRecord;->destroyImmediately(Ljava/lang/String;)Z
-HPLcom/android/server/wm/ActivityRecord;->destroySurfaces(Z)V
+HPLcom/android/server/wm/ActivityRecord;->destroySurfaces(Z)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/ActivityRecord;->ensureActivityConfiguration(Z)Z
 HSPLcom/android/server/wm/ActivityRecord;->fillsParent()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/ActivityRecord;->findMainWindow()Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/ActivityRecord;->findMainWindow()Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->findMainWindow(Z)Lcom/android/server/wm/WindowState;+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HPLcom/android/server/wm/ActivityRecord;->finishIfPossible(ILandroid/content/Intent;Lcom/android/server/uri/NeededUriGrants;Ljava/lang/String;Z)I
 HSPLcom/android/server/wm/ActivityRecord;->forAllActivities(Ljava/util/function/Consumer;Z)V+]Ljava/util/function/Consumer;megamorphic_types
@@ -9936,14 +7401,12 @@
 HSPLcom/android/server/wm/ActivityRecord;->getActivity(Ljava/util/function/Predicate;ZLcom/android/server/wm/ActivityRecord;)Lcom/android/server/wm/ActivityRecord;+]Ljava/util/function/Predicate;megamorphic_types
 HSPLcom/android/server/wm/ActivityRecord;->getAppCompatState(Z)I+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->getBounds()Landroid/graphics/Rect;+]Ljava/util/Optional;Ljava/util/Optional;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
-HPLcom/android/server/wm/ActivityRecord;->getCameraCompatControlState()I
 HSPLcom/android/server/wm/ActivityRecord;->getCompatDisplayInsets()Lcom/android/server/wm/ActivityRecord$CompatDisplayInsets;+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
-HPLcom/android/server/wm/ActivityRecord;->getDisplayArea()Lcom/android/server/wm/DisplayArea;+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/ActivityRecord;->getDisplayArea()Lcom/android/server/wm/TaskDisplayArea;
+HSPLcom/android/server/wm/ActivityRecord;->getDisplayArea()Lcom/android/server/wm/TaskDisplayArea;
 HSPLcom/android/server/wm/ActivityRecord;->getDisplayId()I
-HPLcom/android/server/wm/ActivityRecord;->getInputApplicationHandle(Z)Landroid/view/InputApplicationHandle;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/ActivityRecord;->getInputApplicationHandle(Z)Landroid/view/InputApplicationHandle;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->getLastParentBeforePip()Lcom/android/server/wm/Task;
-HPLcom/android/server/wm/ActivityRecord;->getLetterboxInnerBounds(Landroid/graphics/Rect;)V
+HSPLcom/android/server/wm/ActivityRecord;->getLetterboxInnerBounds(Landroid/graphics/Rect;)V+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
 HSPLcom/android/server/wm/ActivityRecord;->getLocusId()Landroid/content/LocusId;
 HSPLcom/android/server/wm/ActivityRecord;->getMinAspectRatio()F
 HSPLcom/android/server/wm/ActivityRecord;->getOrganizedTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
@@ -9954,67 +7417,64 @@
 HSPLcom/android/server/wm/ActivityRecord;->getRootTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/ActivityRecord;->getScreenResolvedBounds()Landroid/graphics/Rect;+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
 HSPLcom/android/server/wm/ActivityRecord;->getTask()Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/ActivityRecord;->getTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/ActivityRecord;->getTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->getTurnScreenOnFlag()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->getUid()I
-HPLcom/android/server/wm/ActivityRecord;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/ActivityRecord;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->hasOverlayOverUntrustedModeEmbedded()Z
 HSPLcom/android/server/wm/ActivityRecord;->hasProcess()Z
-HPLcom/android/server/wm/ActivityRecord;->hasSizeCompatBounds()Z
-HPLcom/android/server/wm/ActivityRecord;->hasStartingWindow()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HPLcom/android/server/wm/ActivityRecord;->hasWallpaperBackgroundForLetterbox()Z
-HPLcom/android/server/wm/ActivityRecord;->inSizeCompatMode()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/ActivityRecord;->hasSizeCompatBounds()Z
+HPLcom/android/server/wm/ActivityRecord;->hasStartingWindow()Z+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/ActivityRecord;->hasWallpaperBackgroundForLetterbox()Z
+HSPLcom/android/server/wm/ActivityRecord;->inSizeCompatMode()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->isConfigurationDispatchPaused()Z
-HPLcom/android/server/wm/ActivityRecord;->isEligibleForLetterboxEducation()Z+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/ActivityRecord;->isEmbeddedInUntrustedMode()Z
+HSPLcom/android/server/wm/ActivityRecord;->isEligibleForLetterboxEducation()Z+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/ActivityRecord;->isEmbeddedInUntrustedMode()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;
 HSPLcom/android/server/wm/ActivityRecord;->isFocusable()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HPLcom/android/server/wm/ActivityRecord;->isFullyTransparentBarAllowed(Landroid/graphics/Rect;)Z
-HPLcom/android/server/wm/ActivityRecord;->isInLetterboxAnimation()Z
-HPLcom/android/server/wm/ActivityRecord;->isInRootTaskLocked(Landroid/os/IBinder;)Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/ActivityRecord;->isInTransition()Z
+HSPLcom/android/server/wm/ActivityRecord;->isInLetterboxAnimation()Z
+HSPLcom/android/server/wm/ActivityRecord;->isInRootTaskLocked(Landroid/os/IBinder;)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/ActivityRecord;->isInTransition()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->isLetterboxedForFixedOrientationAndAspectRatio()Z
 HSPLcom/android/server/wm/ActivityRecord;->isRelaunching()Z
-HSPLcom/android/server/wm/ActivityRecord;->isReportedDrawn()Z
-HSPLcom/android/server/wm/ActivityRecord;->isResizeable(Z)Z
+HSPLcom/android/server/wm/ActivityRecord;->isResizeable(Z)Z+]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;
 HSPLcom/android/server/wm/ActivityRecord;->isState(Lcom/android/server/wm/ActivityRecord$State;)Z
-HPLcom/android/server/wm/ActivityRecord;->isSyncFinished(Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;)Z
+HSPLcom/android/server/wm/ActivityRecord;->isSyncFinished(Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/UnknownAppVisibilityController;Lcom/android/server/wm/UnknownAppVisibilityController;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/ActivityRecord;->isVisible()Z
 HSPLcom/android/server/wm/ActivityRecord;->isWaitingForTransitionStart()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/wm/ActivityRecord;->lambda$getBounds$22(Landroid/graphics/Rect;)Landroid/graphics/Rect;
-HPLcom/android/server/wm/ActivityRecord;->layoutLetterboxIfNeeded(Lcom/android/server/wm/WindowState;)V
-HSPLcom/android/server/wm/ActivityRecord;->makeActiveIfNeeded(Lcom/android/server/wm/ActivityRecord;)Z
+HSPLcom/android/server/wm/ActivityRecord;->makeActiveIfNeeded(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/wm/ActivityRecord;->makeInvisible()V+]Ljava/lang/Enum;Lcom/android/server/wm/ActivityRecord$State;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->needsZBoost()Z
 HSPLcom/android/server/wm/ActivityRecord;->occludesParent()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->occludesParent(Z)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->onConfigurationChanged(Landroid/content/res/Configuration;)V
 HSPLcom/android/server/wm/ActivityRecord;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HPLcom/android/server/wm/ActivityRecord;->onFirstWindowDrawn(Lcom/android/server/wm/WindowState;)V
+HSPLcom/android/server/wm/ActivityRecord;->onFirstWindowDrawn(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;
 HSPLcom/android/server/wm/ActivityRecord;->onParentChanged(Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ConfigurationContainer;)V
 HPLcom/android/server/wm/ActivityRecord;->onRemovedFromDisplay()V
-HPLcom/android/server/wm/ActivityRecord;->onWindowsVisible()V
-HPLcom/android/server/wm/ActivityRecord;->postApplyAnimation(ZZ)V
-HSPLcom/android/server/wm/ActivityRecord;->prepareSurfaces()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecordInputSink;Lcom/android/server/wm/ActivityRecordInputSink;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/ActivityRecord;->providesMaxBounds()Z
+HSPLcom/android/server/wm/ActivityRecord;->onWindowsVisible()V
+HSPLcom/android/server/wm/ActivityRecord;->postApplyAnimation(ZZ)V+]Lcom/android/server/wm/SnapshotController;Lcom/android/server/wm/SnapshotController;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
+HSPLcom/android/server/wm/ActivityRecord;->prepareSurfaces()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecordInputSink;Lcom/android/server/wm/ActivityRecordInputSink;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/ActivityRecord;->providesOrientation()Z
-HPLcom/android/server/wm/ActivityRecord;->removeLaunchTickRunnable()V
-HPLcom/android/server/wm/ActivityRecord;->removeStartingWindow()V
-HPLcom/android/server/wm/ActivityRecord;->removeStartingWindowAnimation(Z)V
-HSPLcom/android/server/wm/ActivityRecord;->requestUpdateWallpaperIfNeeded()V
+HSPLcom/android/server/wm/ActivityRecord;->removeLaunchTickRunnable()V
+HSPLcom/android/server/wm/ActivityRecord;->removeStartingWindow()V
+HSPLcom/android/server/wm/ActivityRecord;->removeStartingWindowAnimation(Z)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/StartingData;Lcom/android/server/wm/SnapshotStartingData;,Lcom/android/server/wm/SplashScreenStartingData;
+HSPLcom/android/server/wm/ActivityRecord;->requestUpdateWallpaperIfNeeded()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/ActivityRecord;->resolveAspectRatioRestriction(Landroid/content/res/Configuration;)V
 HSPLcom/android/server/wm/ActivityRecord;->resolveOverrideConfiguration(Landroid/content/res/Configuration;)V
-HPLcom/android/server/wm/ActivityRecord;->scheduleTopResumedActivityChanged(Z)Z
-HSPLcom/android/server/wm/ActivityRecord;->setState(Lcom/android/server/wm/ActivityRecord$State;Ljava/lang/String;)V
-HPLcom/android/server/wm/ActivityRecord;->setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V
-HSPLcom/android/server/wm/ActivityRecord;->setVisibility(Z)V
-HSPLcom/android/server/wm/ActivityRecord;->setVisibility(ZZ)V
-HPLcom/android/server/wm/ActivityRecord;->setVisible(Z)V
-HSPLcom/android/server/wm/ActivityRecord;->setVisibleRequested(Z)Z
-HSPLcom/android/server/wm/ActivityRecord;->shouldBeResumed(Lcom/android/server/wm/ActivityRecord;)Z
+HSPLcom/android/server/wm/ActivityRecord;->scheduleTopResumedActivityChanged(Z)Z+]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
+HSPLcom/android/server/wm/ActivityRecord;->setState(Lcom/android/server/wm/ActivityRecord$State;Ljava/lang/String;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/UnknownAppVisibilityController;Lcom/android/server/wm/UnknownAppVisibilityController;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/contentcapture/ContentCaptureManagerInternal;Lcom/android/server/contentcapture/ContentCaptureManagerService$LocalService;
+HSPLcom/android/server/wm/ActivityRecord;->setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Landroid/app/ActivityManager$TaskDescription;Landroid/app/ActivityManager$TaskDescription;]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;
+HSPLcom/android/server/wm/ActivityRecord;->setVisibility(Z)V+]Lcom/android/server/wm/ActivityMetricsLogger;Lcom/android/server/wm/ActivityMetricsLogger;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
+HSPLcom/android/server/wm/ActivityRecord;->setVisibility(ZZ)V+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;
+HSPLcom/android/server/wm/ActivityRecord;->setVisible(Z)V+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
+HSPLcom/android/server/wm/ActivityRecord;->setVisibleRequested(Z)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputTarget;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/ActivityRecord;->shouldBeResumed(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/ActivityRecord;->shouldBeVisibleUnchecked()Z+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/ActivityRecord;->shouldCreateCompatDisplayInsets()Z
+HSPLcom/android/server/wm/ActivityRecord;->shouldCreateCompatDisplayInsets()Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
 HSPLcom/android/server/wm/ActivityRecord;->shouldIgnoreOrientationRequests()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/ActivityRecord;->shouldMakeActive(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/ActivityRecord;->shouldMakeActive(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->shouldPauseActivity(Lcom/android/server/wm/ActivityRecord;)Z
 HSPLcom/android/server/wm/ActivityRecord;->shouldResumeActivity(Lcom/android/server/wm/ActivityRecord;)Z
 HSPLcom/android/server/wm/ActivityRecord;->shouldStartActivity()Z
@@ -10024,28 +7484,21 @@
 HSPLcom/android/server/wm/ActivityRecord;->supportsSizeChanges()I
 HSPLcom/android/server/wm/ActivityRecord;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/wm/ActivityRecord;->transferStartingWindowFromHiddenAboveTokenIfNeeded()V
-HPLcom/android/server/wm/ActivityRecord;->updateAllDrawn()V
-HSPLcom/android/server/wm/ActivityRecord;->updateCompatDisplayInsets()V
-HPLcom/android/server/wm/ActivityRecord;->updateDrawnWindowStates(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/internal/protolog/ProtoLogGroup;Lcom/android/internal/protolog/ProtoLogGroup;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/ActivityRecord;->updateLetterboxSurfaceIfNeeded(Lcom/android/server/wm/WindowState;)V
-HSPLcom/android/server/wm/ActivityRecord;->updateReportedConfigurationAndSend()Z
-HPLcom/android/server/wm/ActivityRecord;->updateReportedVisibilityLocked()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/ActivityRecord;->updateAllDrawn()V
+HSPLcom/android/server/wm/ActivityRecord;->updateCompatDisplayInsets()V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
+HSPLcom/android/server/wm/ActivityRecord;->updateDrawnWindowStates(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/internal/protolog/ProtoLogGroup;Lcom/android/internal/protolog/ProtoLogGroup;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/ActivityRecord;->updateLetterboxSurfaceIfNeeded(Lcom/android/server/wm/WindowState;)V
+HSPLcom/android/server/wm/ActivityRecord;->updateReportedConfigurationAndSend()Z+]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
+HSPLcom/android/server/wm/ActivityRecord;->updateReportedVisibilityLocked()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->updateVisibilityIgnoringKeyguard(Z)V+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityRecord;->updateVisibleForServiceConnection()V
 HSPLcom/android/server/wm/ActivityRecord;->validateStartingWindowTheme(Lcom/android/server/wm/ActivityRecord;Ljava/lang/String;I)Z
-HPLcom/android/server/wm/ActivityRecord;->windowsAreFocusable()Z
-HPLcom/android/server/wm/ActivityRecord;->windowsAreFocusable(Z)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/ActivityRecordInputSink;->applyChangesToSurfaceIfChanged(Landroid/view/SurfaceControl$Transaction;)V
-HPLcom/android/server/wm/ActivityRecordInputSink;->getInputWindowHandleWrapper()Lcom/android/server/wm/InputWindowHandleWrapper;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityRecordInputSink;Lcom/android/server/wm/ActivityRecordInputSink;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/ActivitySnapshotController;->handleTransitionFinish(Ljava/util/ArrayList;)V
-HSPLcom/android/server/wm/ActivityStartController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
-HSPLcom/android/server/wm/ActivityStartController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityStarter$Factory;)V
-HSPLcom/android/server/wm/ActivityStartInterceptor;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskSupervisor;)V
-HSPLcom/android/server/wm/ActivityStartInterceptor;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskSupervisor;Landroid/content/Context;)V
+HSPLcom/android/server/wm/ActivityRecord;->windowsAreFocusable(Z)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
+HSPLcom/android/server/wm/ActivityRecordInputSink;->applyChangesToSurfaceIfChanged(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;
+HSPLcom/android/server/wm/ActivityRecordInputSink;->getInputWindowHandleWrapper()Lcom/android/server/wm/InputWindowHandleWrapper;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityRecordInputSink;Lcom/android/server/wm/ActivityRecordInputSink;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/ActivitySnapshotController;->handleTransitionFinish(Ljava/util/ArrayList;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/ActivityStartInterceptor;->getInterceptorInfo(Ljava/lang/Runnable;)Lcom/android/server/wm/ActivityInterceptorCallback$ActivityInterceptorInfo;
-HSPLcom/android/server/wm/ActivityStartInterceptor;->intercept(Landroid/content/Intent;Landroid/content/pm/ResolveInfo;Landroid/content/pm/ActivityInfo;Ljava/lang/String;Lcom/android/server/wm/Task;Lcom/android/server/wm/TaskFragment;IILandroid/app/ActivityOptions;Lcom/android/server/wm/TaskDisplayArea;)Z
-HSPLcom/android/server/wm/ActivityStarter$DefaultFactory;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityStartInterceptor;)V
-HSPLcom/android/server/wm/ActivityStarter$DefaultFactory;->setController(Lcom/android/server/wm/ActivityStartController;)V
+HSPLcom/android/server/wm/ActivityStartInterceptor;->intercept(Landroid/content/Intent;Landroid/content/pm/ResolveInfo;Landroid/content/pm/ActivityInfo;Ljava/lang/String;Lcom/android/server/wm/Task;Lcom/android/server/wm/TaskFragment;IILandroid/app/ActivityOptions;Lcom/android/server/wm/TaskDisplayArea;)Z+]Lcom/android/server/wm/ActivityInterceptorCallback;Lcom/android/server/policy/PermissionPolicyService$Internal$1;,Lcom/android/server/companion/virtual/VirtualDeviceManagerService$2;,Lcom/android/server/sdksandbox/SdkSandboxManagerService$SdkSandboxInterceptorCallback;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HSPLcom/android/server/wm/ActivityStarter$Request;->reset()V
 HPLcom/android/server/wm/ActivityStarter$Request;->resolveActivity(Lcom/android/server/wm/ActivityTaskSupervisor;)V
 HSPLcom/android/server/wm/ActivityStarter$Request;->set(Lcom/android/server/wm/ActivityStarter$Request;)V
@@ -10057,105 +7510,85 @@
 HSPLcom/android/server/wm/ActivityStarter;->setInitialState(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/wm/Task;Lcom/android/server/wm/TaskFragment;ILcom/android/server/wm/ActivityRecord;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;II)V
 HPLcom/android/server/wm/ActivityStarter;->setTargetRootTaskIfNeeded(Lcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/ActivityStarter;->startActivityInner(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;ILandroid/app/ActivityOptions;Lcom/android/server/wm/Task;Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/BackgroundActivityStartController$BalVerdict;Lcom/android/server/uri/NeededUriGrants;I)I
-HSPLcom/android/server/wm/ActivityTaskManagerInternal;-><init>()V
-HPLcom/android/server/wm/ActivityTaskManagerService$$ExternalSyntheticLambda21;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
-HPLcom/android/server/wm/ActivityTaskManagerService$$ExternalSyntheticLambda22;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
-HSPLcom/android/server/wm/ActivityTaskManagerService$1;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
-HSPLcom/android/server/wm/ActivityTaskManagerService$H;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/os/Looper;)V
-HSPLcom/android/server/wm/ActivityTaskManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
-HSPLcom/android/server/wm/ActivityTaskManagerService$Lifecycle;->getService()Lcom/android/server/wm/ActivityTaskManagerService;
-HSPLcom/android/server/wm/ActivityTaskManagerService$Lifecycle;->onStart()V
-HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
-HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->attachApplication(Lcom/android/server/wm/WindowProcessController;)Z
-HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->clearHeavyWeightProcessIfEquals(Lcom/android/server/wm/WindowProcessController;)V
-HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->compatibilityInfoForPackage(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/CompatibilityInfo;
-HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->getApplicationConfig(Ljava/lang/String;I)Lcom/android/server/wm/ActivityTaskManagerInternal$PackageConfig;
-HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->getTaskToShowPermissionDialogOn(Ljava/lang/String;I)I
+HSPLcom/android/server/wm/ActivityTaskManagerService$$ExternalSyntheticLambda21;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
+HSPLcom/android/server/wm/ActivityTaskManagerService$$ExternalSyntheticLambda22;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
+HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->attachApplication(Lcom/android/server/wm/WindowProcessController;)Z+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->clearHeavyWeightProcessIfEquals(Lcom/android/server/wm/WindowProcessController;)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
+HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->compatibilityInfoForPackage(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/CompatibilityInfo;+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
+HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->getApplicationConfig(Ljava/lang/String;I)Lcom/android/server/wm/ActivityTaskManagerInternal$PackageConfig;+]Lcom/android/server/wm/PackageConfigPersister;Lcom/android/server/wm/PackageConfigPersister;
+HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->getTaskToShowPermissionDialogOn(Ljava/lang/String;I)I+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->getTopApp()Lcom/android/server/wm/WindowProcessController;
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->getTopProcessState()I
-HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->handleAppDied(Lcom/android/server/wm/WindowProcessController;ZLjava/lang/Runnable;)V
-HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->hasSystemAlertWindowPermission(IILjava/lang/String;)Z
+HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->handleAppDied(Lcom/android/server/wm/WindowProcessController;ZLjava/lang/Runnable;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->hasSystemAlertWindowPermission(IILjava/lang/String;)Z+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isCallerRecents(I)Z+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isGetTasksAllowed(Ljava/lang/String;II)Z+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isSleeping()Z
-HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isUidForeground(I)Z
+HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isUidForeground(I)Z+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onCleanUpApplicationRecord(Lcom/android/server/wm/WindowProcessController;)V
-HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onProcessAdded(Lcom/android/server/wm/WindowProcessController;)V
+HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onProcessAdded(Lcom/android/server/wm/WindowProcessController;)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onProcessMapped(ILcom/android/server/wm/WindowProcessController;)V
-HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onProcessRemoved(Ljava/lang/String;I)V
+HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onProcessRemoved(Ljava/lang/String;I)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;
 HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onProcessUnMapped(I)V
-HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->preBindApplication(Lcom/android/server/wm/WindowProcessController;)V
-HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->useTopSchedGroupForTopProcess()Z
-HSPLcom/android/server/wm/ActivityTaskManagerService$SleepTokenAcquirerImpl;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Ljava/lang/String;)V
-HSPLcom/android/server/wm/ActivityTaskManagerService$UiHandler;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
-HSPLcom/android/server/wm/ActivityTaskManagerService$UpdateConfigurationResult;-><init>()V
+HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onUidProcStateChanged(II)V
+HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->preBindApplication(Lcom/android/server/wm/WindowProcessController;)V+]Lcom/android/server/wm/ActivityMetricsLogger;Lcom/android/server/wm/ActivityMetricsLogger;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
+HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->useTopSchedGroupForTopProcess()Z
+HPLcom/android/server/wm/ActivityTaskManagerService$SleepTokenAcquirerImpl;->acquire(IZ)V
+HSPLcom/android/server/wm/ActivityTaskManagerService$SleepTokenAcquirerImpl;->release(I)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->-$$Nest$fgetmRetainPowerModeAndTopProcessState(Lcom/android/server/wm/ActivityTaskManagerService;)Z
 HSPLcom/android/server/wm/ActivityTaskManagerService;->-$$Nest$fgetmSleeping(Lcom/android/server/wm/ActivityTaskManagerService;)Z
-HSPLcom/android/server/wm/ActivityTaskManagerService;->-$$Nest$mstart(Lcom/android/server/wm/ActivityTaskManagerService;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;-><init>(Landroid/content/Context;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->addWindowLayoutReasons(I)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->checkCallingPermission(Ljava/lang/String;)I
 HPLcom/android/server/wm/ActivityTaskManagerService;->checkCanCloseSystemDialogs(IILjava/lang/String;)Z
 HSPLcom/android/server/wm/ActivityTaskManagerService;->checkComponentPermission(Ljava/lang/String;IIIZ)I
 HSPLcom/android/server/wm/ActivityTaskManagerService;->checkPermission(Ljava/lang/String;II)I
-HSPLcom/android/server/wm/ActivityTaskManagerService;->continueWindowLayout()V
-HSPLcom/android/server/wm/ActivityTaskManagerService;->createAppWarnings(Landroid/content/Context;Landroid/os/Handler;Landroid/os/Handler;Ljava/io/File;)Lcom/android/server/wm/AppWarnings;
-HSPLcom/android/server/wm/ActivityTaskManagerService;->createTaskSupervisor()Lcom/android/server/wm/ActivityTaskSupervisor;
-HSPLcom/android/server/wm/ActivityTaskManagerService;->deferWindowLayout()V
-HPLcom/android/server/wm/ActivityTaskManagerService;->endPowerMode(I)V
+HSPLcom/android/server/wm/ActivityTaskManagerService;->continueWindowLayout()V+]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->deferWindowLayout()V+]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->endPowerMode(I)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/UnknownAppVisibilityController;Lcom/android/server/wm/UnknownAppVisibilityController;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->enforceTaskPermission(Ljava/lang/String;)V
 HPLcom/android/server/wm/ActivityTaskManagerService;->getAppOpsManager()Landroid/app/AppOpsManager;
-HSPLcom/android/server/wm/ActivityTaskManagerService;->getCurrentUserId()I
-HPLcom/android/server/wm/ActivityTaskManagerService;->getFocusedRootTaskInfo()Landroid/app/ActivityTaskManager$RootTaskInfo;
-HSPLcom/android/server/wm/ActivityTaskManagerService;->getGlobalConfiguration()Landroid/content/res/Configuration;
-HSPLcom/android/server/wm/ActivityTaskManagerService;->getGlobalLock()Lcom/android/server/wm/WindowManagerGlobalLock;
-HPLcom/android/server/wm/ActivityTaskManagerService;->getLastResumedActivityUserId()I
-HPLcom/android/server/wm/ActivityTaskManagerService;->getLastStopAppSwitchesTime()J
+HSPLcom/android/server/wm/ActivityTaskManagerService;->getCurrentUserId()I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
+HPLcom/android/server/wm/ActivityTaskManagerService;->getFocusedRootTaskInfo()Landroid/app/ActivityTaskManager$RootTaskInfo;+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->getGlobalConfiguration()Landroid/content/res/Configuration;+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/RootWindowContainer;
+HPLcom/android/server/wm/ActivityTaskManagerService;->getLastResumedActivityUserId()I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->getLastStopAppSwitchesTime()J
 HSPLcom/android/server/wm/ActivityTaskManagerService;->getLifecycleManager()Lcom/android/server/wm/ClientLifecycleManager;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->getPackageManagerInternalLocked()Landroid/content/pm/PackageManagerInternal;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->getPermissionPolicyInternal()Lcom/android/server/policy/PermissionPolicyInternal;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->getProcessController(Landroid/app/IApplicationThread;)Lcom/android/server/wm/WindowProcessController;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
-HPLcom/android/server/wm/ActivityTaskManagerService;->getRecentTasks(III)Landroid/content/pm/ParceledListSlice;
-HSPLcom/android/server/wm/ActivityTaskManagerService;->getRootTaskInfo(II)Landroid/app/ActivityTaskManager$RootTaskInfo;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->getRecentTasks()Lcom/android/server/wm/RecentTasks;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->getRootTaskInfo(II)Landroid/app/ActivityTaskManager$RootTaskInfo;+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->getSysUiServiceComponentLocked()Landroid/content/ComponentName;
-HPLcom/android/server/wm/ActivityTaskManagerService;->getTaskBounds(I)Landroid/graphics/Rect;
+HPLcom/android/server/wm/ActivityTaskManagerService;->getTaskBounds(I)Landroid/graphics/Rect;+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->getTaskChangeNotificationController()Lcom/android/server/wm/TaskChangeNotificationController;
-HSPLcom/android/server/wm/ActivityTaskManagerService;->getTasks(IZZI)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
-HSPLcom/android/server/wm/ActivityTaskManagerService;->getTransitionController()Lcom/android/server/wm/TransitionController;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->getTasks(IZZI)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->getTransitionController()Lcom/android/server/wm/TransitionController;+]Lcom/android/server/wm/WindowOrganizerController;Lcom/android/server/wm/WindowOrganizerController;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->getUserManager()Lcom/android/server/pm/UserManagerService;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->hasActiveVisibleWindow(I)Z+]Lcom/android/server/wm/MirrorActiveUids;Lcom/android/server/wm/MirrorActiveUids;]Lcom/android/server/wm/VisibleActivityProcessTracker;Lcom/android/server/wm/VisibleActivityProcessTracker;
-HPLcom/android/server/wm/ActivityTaskManagerService;->hasSystemAlertWindowPermission(IILjava/lang/String;)Z
-HSPLcom/android/server/wm/ActivityTaskManagerService;->initialize(Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/am/PendingIntentController;Landroid/os/Looper;)V
+HPLcom/android/server/wm/ActivityTaskManagerService;->hasSystemAlertWindowPermission(IILjava/lang/String;)Z+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->isCallerRecents(I)Z+]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->isGetTasksAllowed(Ljava/lang/String;II)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HSPLcom/android/server/wm/ActivityTaskManagerService;->isSleepingLocked()Z
-HSPLcom/android/server/wm/ActivityTaskManagerService;->onActivityManagerInternalAdded()V
-HSPLcom/android/server/wm/ActivityTaskManagerService;->onInitPowerManagement()V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-HPLcom/android/server/wm/ActivityTaskManagerService;->setLastResumedActivityUncheckLocked(Lcom/android/server/wm/ActivityRecord;Ljava/lang/String;)V
+HSPLcom/android/server/wm/ActivityTaskManagerService;->setLastResumedActivityUncheckLocked(Lcom/android/server/wm/ActivityRecord;Ljava/lang/String;)V
 HPLcom/android/server/wm/ActivityTaskManagerService;->setLockScreenShown(ZZ)V
-HSPLcom/android/server/wm/ActivityTaskManagerService;->setRecentTasks(Lcom/android/server/wm/RecentTasks;)V
-HSPLcom/android/server/wm/ActivityTaskManagerService;->start()V
 HPLcom/android/server/wm/ActivityTaskManagerService;->startActivityAsUser(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;IZ)I
-HPLcom/android/server/wm/ActivityTaskManagerService;->updateActivityUsageStats(Lcom/android/server/wm/ActivityRecord;I)V
-HPLcom/android/server/wm/ActivityTaskManagerService;->updateBatteryStats(Lcom/android/server/wm/ActivityRecord;Z)V
-HPLcom/android/server/wm/ActivityTaskManagerService;->updateCpuStats()V
-HSPLcom/android/server/wm/ActivityTaskManagerService;->updateGlobalConfigurationLocked(Landroid/content/res/Configuration;ZZI)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Landroid/os/Handler;Lcom/android/server/wm/ActivityTaskManagerService$H;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/ActivityThread;Landroid/app/ActivityThread;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/internal/policy/AttributeCache;Lcom/android/internal/policy/AttributeCache;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/os/LocaleList;Landroid/os/LocaleList;]Lcom/android/server/wm/WindowProcessControllerMap;Lcom/android/server/wm/WindowProcessControllerMap;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;
-HPLcom/android/server/wm/ActivityTaskManagerService;->updateResumedAppTrace(Lcom/android/server/wm/ActivityRecord;)V
+HSPLcom/android/server/wm/ActivityTaskManagerService;->updateActivityUsageStats(Lcom/android/server/wm/ActivityRecord;I)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->updateBatteryStats(Lcom/android/server/wm/ActivityRecord;Z)V
+HSPLcom/android/server/wm/ActivityTaskManagerService;->updateGlobalConfigurationLocked(Landroid/content/res/Configuration;ZZI)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Landroid/os/Handler;Lcom/android/server/wm/ActivityTaskManagerService$H;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/ActivityThread;Landroid/app/ActivityThread;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/internal/policy/AttributeCache;Lcom/android/internal/policy/AttributeCache;]Landroid/os/LocaleList;Landroid/os/LocaleList;]Lcom/android/server/wm/WindowProcessControllerMap;Lcom/android/server/wm/WindowProcessControllerMap;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;
+HSPLcom/android/server/wm/ActivityTaskManagerService;->updateResumedAppTrace(Lcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/ActivityTaskManagerService;->updateSleepIfNeededLocked()V
-HPLcom/android/server/wm/ActivityTaskManagerService;->updateTopApp(Lcom/android/server/wm/ActivityRecord;)V
-HSPLcom/android/server/wm/ActivityTaskSupervisor$ActivityTaskSupervisorHandler;-><init>(Lcom/android/server/wm/ActivityTaskSupervisor;Landroid/os/Looper;)V
+HSPLcom/android/server/wm/ActivityTaskManagerService;->updateTopApp(Lcom/android/server/wm/ActivityRecord;)V+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/ActivityTaskSupervisor$ActivityTaskSupervisorHandler;->handleMessage(Landroid/os/Message;)V
-HSPLcom/android/server/wm/ActivityTaskSupervisor$ActivityTaskSupervisorHandler;->handleMessageInner(Landroid/os/Message;)Z
-HSPLcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;-><init>()V
+HSPLcom/android/server/wm/ActivityTaskSupervisor$ActivityTaskSupervisorHandler;->handleMessageInner(Landroid/os/Message;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;->getVisibleOpaqueActivity(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
 HSPLcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;->test(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;->test(Ljava/lang/Object;)Z+]Lcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;Lcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;
-HSPLcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;-><init>()V
-HSPLcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;->accept(Lcom/android/server/wm/ActivityRecord;)V+]Landroid/app/TaskInfo;Landroid/app/ActivityManager$RecentTaskInfo;,Landroid/app/ActivityManager$RunningTaskInfo;,Landroid/app/ActivityTaskManager$RootTaskInfo;
+HSPLcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;->accept(Lcom/android/server/wm/ActivityRecord;)V+]Landroid/app/TaskInfo;Landroid/app/ActivityManager$RecentTaskInfo;,Landroid/app/ActivityTaskManager$RootTaskInfo;,Landroid/app/ActivityManager$RunningTaskInfo;
 HSPLcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;->accept(Ljava/lang/Object;)V+]Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;
-HSPLcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;->fillAndReturnTop(Lcom/android/server/wm/Task;Landroid/app/TaskInfo;)Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/ActivityTaskSupervisor;-><clinit>()V
-HSPLcom/android/server/wm/ActivityTaskSupervisor;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/os/Looper;)V
-HPLcom/android/server/wm/ActivityTaskSupervisor;->activityIdleInternal(Lcom/android/server/wm/ActivityRecord;ZZLandroid/content/res/Configuration;)V
+HSPLcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;->fillAndReturnTop(Lcom/android/server/wm/Task;Landroid/app/TaskInfo;)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/ActivityTaskSupervisor;->activityIdleInternal(Lcom/android/server/wm/ActivityRecord;ZZLandroid/content/res/Configuration;)V+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/ActivityTaskSupervisor;->beginActivityVisibilityUpdate()V+]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
 HPLcom/android/server/wm/ActivityTaskSupervisor;->checkReadyForSleepLocked(Z)V
 HSPLcom/android/server/wm/ActivityTaskSupervisor;->computeProcessActivityStateBatch()V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList;
@@ -10163,78 +7596,62 @@
 HSPLcom/android/server/wm/ActivityTaskSupervisor;->getActivityMetricsLogger()Lcom/android/server/wm/ActivityMetricsLogger;
 HSPLcom/android/server/wm/ActivityTaskSupervisor;->getKeyguardController()Lcom/android/server/wm/KeyguardController;
 HSPLcom/android/server/wm/ActivityTaskSupervisor;->inActivityVisibilityUpdate()Z
-HSPLcom/android/server/wm/ActivityTaskSupervisor;->initPowerManagement()V
-HSPLcom/android/server/wm/ActivityTaskSupervisor;->initialize()V
 HSPLcom/android/server/wm/ActivityTaskSupervisor;->isRootVisibilityUpdateDeferred()Z
-HPLcom/android/server/wm/ActivityTaskSupervisor;->onProcessActivityStateChanged(Lcom/android/server/wm/WindowProcessController;Z)V
-HPLcom/android/server/wm/ActivityTaskSupervisor;->processStoppingAndFinishingActivities(Lcom/android/server/wm/ActivityRecord;ZLjava/lang/String;)V
-HPLcom/android/server/wm/ActivityTaskSupervisor;->realStartActivityLocked(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/WindowProcessController;ZZ)Z
+HSPLcom/android/server/wm/ActivityTaskSupervisor;->onProcessActivityStateChanged(Lcom/android/server/wm/WindowProcessController;Z)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/ActivityTaskSupervisor;->processStoppingAndFinishingActivities(Lcom/android/server/wm/ActivityRecord;ZLjava/lang/String;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/ActivityTaskSupervisor;->realStartActivityLocked(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/WindowProcessController;ZZ)Z
 HSPLcom/android/server/wm/ActivityTaskSupervisor;->removeHistoryRecords(Lcom/android/server/wm/WindowProcessController;)V
-HPLcom/android/server/wm/ActivityTaskSupervisor;->scheduleProcessStoppingAndFinishingActivitiesIfNeeded()V
+HSPLcom/android/server/wm/ActivityTaskSupervisor;->scheduleProcessStoppingAndFinishingActivitiesIfNeeded()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/ActivityTaskSupervisor;->scheduleTopResumedActivityStateLossIfNeeded()V
-HSPLcom/android/server/wm/ActivityTaskSupervisor;->setRecentTasks(Lcom/android/server/wm/RecentTasks;)V
-HSPLcom/android/server/wm/ActivityTaskSupervisor;->setRunningTasks(Lcom/android/server/wm/RunningTasks;)V
-HSPLcom/android/server/wm/ActivityTaskSupervisor;->updateTopResumedActivityIfNeeded(Ljava/lang/String;)V
-HSPLcom/android/server/wm/AppTransition$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;Ljava/lang/Object;)Z+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/ActivityTaskSupervisor;->updateTopResumedActivityIfNeeded(Ljava/lang/String;)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HSPLcom/android/server/wm/AppTransition$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;Ljava/lang/Object;)Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/lang/Integer;Ljava/lang/Integer;
+HSPLcom/android/server/wm/AppTransition;->appTransitionFlagsToString(I)Ljava/lang/String;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Integer;Ljava/lang/Integer;
 HSPLcom/android/server/wm/AppTransition;->isReady()Z
 HSPLcom/android/server/wm/AppTransition;->isRunning()Z
 HSPLcom/android/server/wm/AppTransition;->isTransitionSet()Z+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/wm/AppWarnings$UiHandler;-><init>(Lcom/android/server/wm/AppWarnings;Landroid/os/Looper;)V
-HSPLcom/android/server/wm/AppWarnings$WriteConfigTask;-><init>(Lcom/android/server/wm/AppWarnings;)V
-HSPLcom/android/server/wm/AppWarnings$WriteConfigTask;-><init>(Lcom/android/server/wm/AppWarnings;Lcom/android/server/wm/AppWarnings$WriteConfigTask-IA;)V
-HSPLcom/android/server/wm/AppWarnings;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/content/Context;Landroid/os/Handler;Landroid/os/Handler;Ljava/io/File;)V
-HSPLcom/android/server/wm/AppWarnings;->readConfigFromFileAmsThread()V
-HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup$1CommitCallback;->onCommitted(Landroid/view/SurfaceControl$Transaction;)V
+HSPLcom/android/server/wm/AppTransition;->toString()Ljava/lang/String;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
+HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup$1CommitCallback;->onCommitted(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
 HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup;-><init>(Lcom/android/server/wm/BLASTSyncEngine;Lcom/android/server/wm/BLASTSyncEngine$TransactionReadyListener;ILjava/lang/String;)V
-HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup;->addToSync(Lcom/android/server/wm/WindowContainer;)V
-HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup;->finishNow()V
-HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup;->setReady(Z)Z
-HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup;->tryFinish()Z
-HSPLcom/android/server/wm/BLASTSyncEngine;->getSyncSet(I)Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;
+HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup;->addToSync(Lcom/android/server/wm/WindowContainer;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;
+HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup;->finishNow()V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda23;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/BLASTSyncEngine$TransactionReadyListener;Lcom/android/server/wm/Transition;,Lcom/android/server/wm/WindowOrganizerController;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/Runnable;Lcom/android/server/wm/TransitionController$$ExternalSyntheticLambda3;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
+HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup;->setReady(Z)Z+]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;
+HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup;->tryFinish()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/BLASTSyncEngine;->getSyncSet(I)Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/BLASTSyncEngine;->onSurfacePlacement()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/BLASTSyncEngine;->startSyncSet(Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;JZ)V
-HPLcom/android/server/wm/BackNavigationController$AnimationHandler;->-$$Nest$fgetmComposed(Lcom/android/server/wm/BackNavigationController$AnimationHandler;)Z
-HSPLcom/android/server/wm/BackNavigationController$NavigationMonitor;-><init>(Lcom/android/server/wm/BackNavigationController;)V
-HSPLcom/android/server/wm/BackNavigationController$NavigationMonitor;-><init>(Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController$NavigationMonitor-IA;)V
 HPLcom/android/server/wm/BackNavigationController$NavigationMonitor;->isMonitorAnimationOrTransition()Z
-HSPLcom/android/server/wm/BackNavigationController;-><clinit>()V
-HSPLcom/android/server/wm/BackNavigationController;-><init>()V
-HSPLcom/android/server/wm/BackNavigationController;->checkAnimationReady(Lcom/android/server/wm/WallpaperController;)V
+HSPLcom/android/server/wm/BackNavigationController;->checkAnimationReady(Lcom/android/server/wm/WallpaperController;)V+]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator;
+HSPLcom/android/server/wm/BackNavigationController;->isWallpaperVisible(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/BackNavigationController$AnimationHandler;Lcom/android/server/wm/BackNavigationController$AnimationHandler;
 HPLcom/android/server/wm/BackNavigationController;->startBackNavigation(Landroid/os/RemoteCallback;Landroid/window/BackAnimationAdapter;)Landroid/window/BackNavigationInfo;
 HSPLcom/android/server/wm/BackgroundActivityStartController$BalState;-><init>(Lcom/android/server/wm/BackgroundActivityStartController;IILjava/lang/String;IILcom/android/server/wm/WindowProcessController;Lcom/android/server/am/PendingIntentRecord;Landroid/app/BackgroundStartPrivileges;Lcom/android/server/wm/ActivityRecord;Landroid/content/Intent;Landroid/app/ActivityOptions;)V
 HSPLcom/android/server/wm/BackgroundActivityStartController$BalVerdict;-><init>(IZLjava/lang/String;)V
-HSPLcom/android/server/wm/BackgroundActivityStartController;-><clinit>()V
-HSPLcom/android/server/wm/BackgroundActivityStartController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskSupervisor;)V
 HSPLcom/android/server/wm/BackgroundActivityStartController;->checkBackgroundActivityStartAllowedByCaller(Lcom/android/server/wm/BackgroundActivityStartController$BalState;)Lcom/android/server/wm/BackgroundActivityStartController$BalVerdict;
-HSPLcom/android/server/wm/BackgroundLaunchProcessController;-><init>(Ljava/util/function/IntPredicate;Lcom/android/server/wm/BackgroundActivityStartCallback;)V
 HSPLcom/android/server/wm/BackgroundLaunchProcessController;->addBoundClientUid(ILjava/lang/String;J)V+]Landroid/util/IntArray;Landroid/util/IntArray;
-HPLcom/android/server/wm/BackgroundLaunchProcessController;->areBackgroundActivityStartsAllowed(IILjava/lang/String;IZZZJJJ)Lcom/android/server/wm/BackgroundActivityStartController$BalVerdict;+]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController;
+HSPLcom/android/server/wm/BackgroundLaunchProcessController;->areBackgroundActivityStartsAllowed(IILjava/lang/String;IZZZJJJ)Lcom/android/server/wm/BackgroundActivityStartController$BalVerdict;+]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController;
 HSPLcom/android/server/wm/BackgroundLaunchProcessController;->clearBalOptInBoundClientUids()V+]Landroid/util/IntArray;Landroid/util/IntArray;
-HPLcom/android/server/wm/BackgroundLaunchProcessController;->isBackgroundStartAllowedByToken(ILjava/lang/String;Z)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/wm/BackgroundActivityStartCallback;Lcom/android/server/notification/NotificationManagerService$NotificationTrampolineCallback;
-HPLcom/android/server/wm/BackgroundLaunchProcessController;->isBoundByForegroundUid()Z+]Landroid/util/IntArray;Landroid/util/IntArray;]Ljava/util/function/IntPredicate;Lcom/android/server/wm/WindowProcessController$$ExternalSyntheticLambda8;
+HSPLcom/android/server/wm/BackgroundLaunchProcessController;->isBackgroundStartAllowedByToken(ILjava/lang/String;Z)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/wm/BackgroundActivityStartCallback;Lcom/android/server/notification/NotificationManagerService$NotificationTrampolineCallback;
+HSPLcom/android/server/wm/BackgroundLaunchProcessController;->isBoundByForegroundUid()Z+]Landroid/util/IntArray;Landroid/util/IntArray;]Ljava/util/function/IntPredicate;Lcom/android/server/wm/WindowProcessController$$ExternalSyntheticLambda8;
 HSPLcom/android/server/wm/BackgroundLaunchProcessController;->removeAllowBackgroundStartPrivileges(Landroid/os/Binder;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/wm/ClientLifecycleManager;-><init>()V
 HSPLcom/android/server/wm/ClientLifecycleManager;->dispatchPendingTransactions()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;
-HSPLcom/android/server/wm/ClientLifecycleManager;->getOrCreatePendingTransaction(Landroid/app/IApplicationThread;)Landroid/app/servertransaction/ClientTransaction;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;
-HSPLcom/android/server/wm/ClientLifecycleManager;->onClientTransactionItemScheduled(Landroid/app/servertransaction/ClientTransaction;Z)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/servertransaction/ClientTransaction;Landroid/app/servertransaction/ClientTransaction;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
-HSPLcom/android/server/wm/ClientLifecycleManager;->onLayoutContinued()V
-HSPLcom/android/server/wm/ClientLifecycleManager;->scheduleTransaction(Landroid/app/servertransaction/ClientTransaction;)V
+HSPLcom/android/server/wm/ClientLifecycleManager;->getOrCreatePendingTransaction(Landroid/app/IApplicationThread;)Landroid/app/servertransaction/ClientTransaction;+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Landroid/app/ActivityThread$ApplicationThread;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
+HSPLcom/android/server/wm/ClientLifecycleManager;->onClientTransactionItemScheduled(Landroid/app/servertransaction/ClientTransaction;Z)V+]Landroid/app/servertransaction/ClientTransaction;Landroid/app/servertransaction/ClientTransaction;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
+HSPLcom/android/server/wm/ClientLifecycleManager;->onLayoutContinued()V+]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;
+HSPLcom/android/server/wm/ClientLifecycleManager;->scheduleTransaction(Landroid/app/servertransaction/ClientTransaction;)V+]Landroid/app/servertransaction/ClientTransaction;Landroid/app/servertransaction/ClientTransaction;
 HSPLcom/android/server/wm/ClientLifecycleManager;->scheduleTransactionItem(Landroid/app/IApplicationThread;Landroid/app/servertransaction/ClientTransactionItem;)V+]Landroid/app/servertransaction/ClientTransaction;Landroid/app/servertransaction/ClientTransaction;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;
 HSPLcom/android/server/wm/ClientLifecycleManager;->shouldDispatchPendingTransactionsImmediately()Z+]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;
-HSPLcom/android/server/wm/CompatModePackages$CompatHandler;-><init>(Lcom/android/server/wm/CompatModePackages;Landroid/os/Looper;)V
-HSPLcom/android/server/wm/CompatModePackages;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Ljava/io/File;Landroid/os/Handler;)V
-HSPLcom/android/server/wm/CompatModePackages;->compatibilityInfoForPackageLocked(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/CompatibilityInfo;
+HSPLcom/android/server/wm/CompatModePackages;->compatibilityInfoForPackageLocked(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/CompatibilityInfo;+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HSPLcom/android/server/wm/CompatModePackages;->getCompatScale(Ljava/lang/String;IZ)F
-HSPLcom/android/server/wm/CompatModePackages;->getCompatScaleFromProvider(Ljava/lang/String;I)Landroid/content/res/CompatibilityInfo$CompatScale;
-HSPLcom/android/server/wm/CompatModePackages;->getPackageFlags(Ljava/lang/String;)I
+HSPLcom/android/server/wm/CompatModePackages;->getCompatScaleFromProvider(Ljava/lang/String;I)Landroid/content/res/CompatibilityInfo$CompatScale;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/CompatScaleProvider;Lcom/android/server/app/GameManagerService$LocalService;
+HSPLcom/android/server/wm/CompatModePackages;->getPackageFlags(Ljava/lang/String;)I+]Ljava/util/HashMap;Ljava/util/HashMap;
 HSPLcom/android/server/wm/ConfigurationContainer;-><init>()V
 HSPLcom/android/server/wm/ConfigurationContainer;->getActivityType()I+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
 HSPLcom/android/server/wm/ConfigurationContainer;->getBounds()Landroid/graphics/Rect;+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
+HSPLcom/android/server/wm/ConfigurationContainer;->getBounds(Landroid/graphics/Rect;)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/DisplayArea$Dimmable;
 HSPLcom/android/server/wm/ConfigurationContainer;->getConfiguration()Landroid/content/res/Configuration;
 HSPLcom/android/server/wm/ConfigurationContainer;->getMergedOverrideConfiguration()Landroid/content/res/Configuration;
-HSPLcom/android/server/wm/ConfigurationContainer;->getRequestedOverrideBounds()Landroid/graphics/Rect;
+HSPLcom/android/server/wm/ConfigurationContainer;->getRequestedOverrideBounds()Landroid/graphics/Rect;+]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
 HSPLcom/android/server/wm/ConfigurationContainer;->getRequestedOverrideConfiguration()Landroid/content/res/Configuration;
-HPLcom/android/server/wm/ConfigurationContainer;->getResolvedOverrideBounds()Landroid/graphics/Rect;
+HSPLcom/android/server/wm/ConfigurationContainer;->getResolvedOverrideBounds()Landroid/graphics/Rect;+]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
 HSPLcom/android/server/wm/ConfigurationContainer;->getResolvedOverrideConfiguration()Landroid/content/res/Configuration;
 HSPLcom/android/server/wm/ConfigurationContainer;->getWindowConfiguration()Landroid/app/WindowConfiguration;
 HSPLcom/android/server/wm/ConfigurationContainer;->getWindowingMode()I+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
@@ -10247,51 +7664,51 @@
 HSPLcom/android/server/wm/ConfigurationContainer;->isActivityTypeHomeOrRecents()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ConfigurationContainer;->isActivityTypeStandardOrUndefined()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/ConfigurationContainer;->isAlwaysOnTop()Z+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HPLcom/android/server/wm/ConfigurationContainer;->isCompatible(II)Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/ConfigurationContainer;->isCompatible(II)Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/ConfigurationContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V+]Lcom/android/server/wm/ConfigurationContainerListener;megamorphic_types]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
 HSPLcom/android/server/wm/ConfigurationContainer;->onMergedOverrideConfigurationChanged()V+]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLcom/android/server/wm/ConfigurationContainer;->onRequestedOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+HSPLcom/android/server/wm/ConfigurationContainer;->onParentChanged(Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ConfigurationContainer;)V
+HSPLcom/android/server/wm/ConfigurationContainer;->onRequestedOverrideConfigurationChanged(Landroid/content/res/Configuration;)V+]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types
 HSPLcom/android/server/wm/ConfigurationContainer;->registerConfigurationChangeListener(Lcom/android/server/wm/ConfigurationContainerListener;Z)V
 HSPLcom/android/server/wm/ConfigurationContainer;->resolveOverrideConfiguration(Landroid/content/res/Configuration;)V+]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
-HSPLcom/android/server/wm/ConfigurationContainer;->updateRequestedOverrideConfiguration(Landroid/content/res/Configuration;)V
-HSPLcom/android/server/wm/DesktopModeLaunchParamsModifier;-><clinit>()V
+HSPLcom/android/server/wm/ConfigurationContainer;->updateRequestedOverrideConfiguration(Landroid/content/res/Configuration;)V+]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
 HPLcom/android/server/wm/DimmerAnimationHelper$AnimationSpec;->apply(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;J)V
 HPLcom/android/server/wm/DimmerAnimationHelper$Change;-><init>(Lcom/android/server/wm/DimmerAnimationHelper$Change;)V
-HPLcom/android/server/wm/DimmerAnimationHelper;->applyChanges(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/SmoothDimmer$DimState;)V
-HSPLcom/android/server/wm/DisplayArea$Dimmable;->prepareSurfaces()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayArea$Dimmable;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayArea$Dimmable;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayArea$Dimmable;,Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/SmoothDimmer;
+HPLcom/android/server/wm/DimmerAnimationHelper;->applyChanges(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/SmoothDimmer$DimState;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DimmerAnimationHelper;Lcom/android/server/wm/DimmerAnimationHelper;]Lcom/android/server/wm/SmoothDimmer$DimState;Lcom/android/server/wm/SmoothDimmer$DimState;]Lcom/android/server/wm/DimmerAnimationHelper$Change;Lcom/android/server/wm/DimmerAnimationHelper$Change;
+HSPLcom/android/server/wm/DisplayArea$Dimmable;->prepareSurfaces()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayArea$Dimmable;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayArea$Dimmable;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayArea$Dimmable;,Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/SmoothDimmer;,Lcom/android/server/wm/LegacyDimmer;
 HSPLcom/android/server/wm/DisplayArea$Tokens$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/wm/DisplayArea$Tokens;->$r8$lambda$2Q0eZgOlf9COHBhGcrk7N74DbDw(Lcom/android/server/wm/DisplayArea$Tokens;Lcom/android/server/wm/WindowState;)Z
 HSPLcom/android/server/wm/DisplayArea$Tokens;->getOrientation(I)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayArea$Tokens;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayArea$Tokens;->lambda$new$0(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;
 HSPLcom/android/server/wm/DisplayArea$Type;->checkChild(Lcom/android/server/wm/DisplayArea$Type;Lcom/android/server/wm/DisplayArea$Type;)V
+HSPLcom/android/server/wm/DisplayArea$Type;->checkSiblings(Lcom/android/server/wm/DisplayArea$Type;Lcom/android/server/wm/DisplayArea$Type;)V
 HSPLcom/android/server/wm/DisplayArea$Type;->typeOf(Lcom/android/server/wm/WindowContainer;)Lcom/android/server/wm/DisplayArea$Type;+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/DisplayArea;->asDisplayArea()Lcom/android/server/wm/DisplayArea;
 HSPLcom/android/server/wm/DisplayArea;->fillsParent()Z
-HSPLcom/android/server/wm/DisplayArea;->findPositionForChildDisplayArea(ILcom/android/server/wm/DisplayArea;)I
+HSPLcom/android/server/wm/DisplayArea;->findPositionForChildDisplayArea(ILcom/android/server/wm/DisplayArea;)I+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayArea;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/DisplayArea$Dimmable;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/DisplayArea;->forAllLeafTaskFragments(Ljava/util/function/Predicate;)Z
 HSPLcom/android/server/wm/DisplayArea;->forAllLeafTasks(Ljava/util/function/Consumer;Z)V
 HSPLcom/android/server/wm/DisplayArea;->forAllLeafTasks(Ljava/util/function/Predicate;)Z
 HSPLcom/android/server/wm/DisplayArea;->forAllRootTasks(Ljava/util/function/Predicate;Z)Z
-HSPLcom/android/server/wm/DisplayArea;->getDisplayArea()Lcom/android/server/wm/DisplayArea;
 HSPLcom/android/server/wm/DisplayArea;->getIgnoreOrientationRequest()Z+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
 HSPLcom/android/server/wm/DisplayArea;->getItemFromTaskDisplayAreas(Ljava/util/function/Function;Z)Ljava/lang/Object;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/DisplayArea;megamorphic_types
-HSPLcom/android/server/wm/DisplayArea;->getOrientation(I)I+]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/DisplayArea;,Lcom/android/server/wm/DisplayArea$Dimmable;
+HSPLcom/android/server/wm/DisplayArea;->getOrientation(I)I+]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayArea;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/DisplayArea$Dimmable;
 HSPLcom/android/server/wm/DisplayArea;->getPendingTransaction()Landroid/view/SurfaceControl$Transaction;
 HSPLcom/android/server/wm/DisplayArea;->getRootTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/DisplayArea;->getSyncTransaction()Landroid/view/SurfaceControl$Transaction;
 HSPLcom/android/server/wm/DisplayArea;->getTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/DisplayArea;->isOrganized()Z
 HSPLcom/android/server/wm/DisplayArea;->needsZBoost()Z
-HSPLcom/android/server/wm/DisplayArea;->onChildPositionChanged(Lcom/android/server/wm/WindowContainer;)V
-HSPLcom/android/server/wm/DisplayArea;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V
+HSPLcom/android/server/wm/DisplayArea;->onChildPositionChanged(Lcom/android/server/wm/WindowContainer;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayArea$Tokens;,Lcom/android/server/wm/DisplayArea;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/DisplayContent$ImeContainer;
+HSPLcom/android/server/wm/DisplayArea;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+HSPLcom/android/server/wm/DisplayArea;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/DisplayArea;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/DisplayArea$Dimmable;,Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/DisplayArea;->resolveOverrideConfiguration(Landroid/content/res/Configuration;)V
 HSPLcom/android/server/wm/DisplayArea;->shouldIgnoreOrientationRequest(I)Z+]Lcom/android/server/wm/DisplayArea;megamorphic_types
 HSPLcom/android/server/wm/DisplayArea;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLcom/android/server/wm/DisplayAreaOrganizerController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
 HSPLcom/android/server/wm/DisplayAreaPolicyBuilder$Result;->getDefaultTaskDisplayArea()Lcom/android/server/wm/TaskDisplayArea;
 HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda24;-><init>(Lcom/android/server/wm/ActivityRecord;Z)V
 HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda24;->accept(Ljava/lang/Object;)V
-HPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
+HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda33;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda34;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda35;->accept(Ljava/lang/Object;)V
@@ -10304,17 +7721,16 @@
 HSPLcom/android/server/wm/DisplayContent$ImeContainer;->assignLayer(Landroid/view/SurfaceControl$Transaction;I)V
 HPLcom/android/server/wm/DisplayContent$ImeContainer;->assignRelativeLayer(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;IZ)V
 HSPLcom/android/server/wm/DisplayContent$ImeContainer;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
-HSPLcom/android/server/wm/DisplayContent$ImeContainer;->getOrientation(I)I
+HSPLcom/android/server/wm/DisplayContent$ImeContainer;->getOrientation(I)I+]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent$ImeContainer;
 HSPLcom/android/server/wm/DisplayContent$ImeContainer;->setNeedsLayer()V
 HSPLcom/android/server/wm/DisplayContent$ImeContainer;->skipImeWindowsDuringTraversal(Lcom/android/server/wm/DisplayContent;)Z
 HSPLcom/android/server/wm/DisplayContent$ImeContainer;->updateAboveInsetsState(Landroid/view/InsetsState;Landroid/util/SparseArray;Landroid/util/ArraySet;)V
-HPLcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;->notifyInsetsChanged()V
-HSPLcom/android/server/wm/DisplayContent;->$r8$lambda$-dBz3LtsWovWVT0SE5m__EwNfT4(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V
-HPLcom/android/server/wm/DisplayContent;->$r8$lambda$09LjI9IPIDqkx6xQRSSpO0paSaI(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)Z
+HPLcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;->notifyInsetsChanged()V+]Landroid/view/IDisplayWindowInsetsController;Landroid/view/IDisplayWindowInsetsController$Stub$Proxy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayContent;->$r8$lambda$-dBz3LtsWovWVT0SE5m__EwNfT4(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->$r8$lambda$0qT6GYhjGguOWMyvPDOpZD9lW8A(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)Z
-HPLcom/android/server/wm/DisplayContent;->$r8$lambda$8PRwSjo040f1qbJNSCW1eNrH3w8(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/Task;ILcom/android/server/wm/Task;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayContent;->$r8$lambda$8PRwSjo040f1qbJNSCW1eNrH3w8(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/Task;ILcom/android/server/wm/Task;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->$r8$lambda$YbN3cIeEsM0DLZIuG7yQvhoeuNM(Lcom/android/server/wm/ActivityRecord;ZLcom/android/server/wm/Task;)V
-HPLcom/android/server/wm/DisplayContent;->$r8$lambda$fxEggzNsTLRHb7So7DIvQvSPsEo(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/RecentsAnimationController;Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Region;[ILandroid/graphics/Region;Landroid/graphics/Region;Lcom/android/server/wm/WindowState;)V
+HSPLcom/android/server/wm/DisplayContent;->$r8$lambda$fxEggzNsTLRHb7So7DIvQvSPsEo(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/RecentsAnimationController;Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Region;[ILandroid/graphics/Region;Landroid/graphics/Region;Lcom/android/server/wm/WindowState;)V
 HSPLcom/android/server/wm/DisplayContent;->$r8$lambda$hkBcv35oI_sDzJ-r3_1RUH-fcfo(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V
 HSPLcom/android/server/wm/DisplayContent;->$r8$lambda$m3_QfYVQ2X5TCCaPfidklMmlJ3A(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V
 HSPLcom/android/server/wm/DisplayContent;->$r8$lambda$ro8qyeDvIUnuK9S-Ac1Fs1DW7Pc(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
@@ -10322,30 +7738,32 @@
 HSPLcom/android/server/wm/DisplayContent;->$r8$lambda$wQPrC0OEjFFleCp1VlzlAyiSCm4(Lcom/android/server/wm/RecentsAnimationController;Ljava/util/Set;Ljava/util/Set;Landroid/graphics/Matrix;[FLcom/android/server/wm/WindowState;)Z
 HSPLcom/android/server/wm/DisplayContent;->-$$Nest$fgetmImeLayeringTarget(Lcom/android/server/wm/DisplayContent;)Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/DisplayContent;->addToGlobalAndConsumeLimit(Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Rect;ILcom/android/server/wm/WindowState;I)I+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HPLcom/android/server/wm/DisplayContent;->adjustForImeIfNeeded()V
+HSPLcom/android/server/wm/DisplayContent;->addWindowToken(Landroid/os/IBinder;Lcom/android/server/wm/WindowToken;)V
+HSPLcom/android/server/wm/DisplayContent;->adjustForImeIfNeeded()V+]Lcom/android/server/wm/PinnedTaskController;Lcom/android/server/wm/PinnedTaskController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->amendWindowTapExcludeRegion(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/wm/DisplayContent;->applySurfaceChangesTransaction()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/DisplayRotation;Lcom/android/server/wm/DisplayRotation;]Lcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;Lcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;]Lcom/android/server/wm/ImeInsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;]Ljava/util/LinkedList;Ljava/util/LinkedList;]Lcom/android/server/wm/WallpaperVisibilityListeners;Lcom/android/server/wm/WallpaperVisibilityListeners;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/DisplayContent;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V
-HSPLcom/android/server/wm/DisplayContent;->assignRelativeLayerForIme(Landroid/view/SurfaceControl$Transaction;Z)V
-HPLcom/android/server/wm/DisplayContent;->assignWindowLayers(Z)V
+HSPLcom/android/server/wm/DisplayContent;->assignRelativeLayerForIme(Landroid/view/SurfaceControl$Transaction;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent$ImeContainer;]Lcom/android/server/wm/DisplayContent$ImeContainer;Lcom/android/server/wm/DisplayContent$ImeContainer;
+HPLcom/android/server/wm/DisplayContent;->assignWindowLayers(Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->beginHoldScreenUpdate()V
-HSPLcom/android/server/wm/DisplayContent;->calculateDisplayCutoutForRotation(I)Landroid/view/DisplayCutout;
-HSPLcom/android/server/wm/DisplayContent;->calculateDisplayShapeForRotation(I)Landroid/view/DisplayShape;
-HSPLcom/android/server/wm/DisplayContent;->calculatePrivacyIndicatorBoundsForRotation(I)Landroid/view/PrivacyIndicatorBounds;
-HSPLcom/android/server/wm/DisplayContent;->calculateRoundedCornersForRotation(I)Landroid/view/RoundedCorners;
-HPLcom/android/server/wm/DisplayContent;->calculateSystemGestureExclusion(Landroid/graphics/Region;Landroid/graphics/Region;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
+HSPLcom/android/server/wm/DisplayContent;->calculateDisplayCutoutForRotation(I)Landroid/view/DisplayCutout;+]Lcom/android/server/wm/utils/RotationCache;Lcom/android/server/wm/utils/RotationCache;]Lcom/android/server/wm/utils/WmDisplayCutout;Lcom/android/server/wm/utils/WmDisplayCutout;
+HSPLcom/android/server/wm/DisplayContent;->calculateDisplayShapeForRotation(I)Landroid/view/DisplayShape;+]Lcom/android/server/wm/utils/RotationCache;Lcom/android/server/wm/utils/RotationCache;
+HSPLcom/android/server/wm/DisplayContent;->calculatePrivacyIndicatorBoundsForRotation(I)Landroid/view/PrivacyIndicatorBounds;+]Lcom/android/server/wm/utils/RotationCache;Lcom/android/server/wm/utils/RotationCache;
+HSPLcom/android/server/wm/DisplayContent;->calculateRoundedCornersForRotation(I)Landroid/view/RoundedCorners;+]Lcom/android/server/wm/utils/RotationCache;Lcom/android/server/wm/utils/RotationCache;
+HSPLcom/android/server/wm/DisplayContent;->calculateSystemGestureExclusion(Landroid/graphics/Region;Landroid/graphics/Region;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
 HSPLcom/android/server/wm/DisplayContent;->canShowWithInsecureKeyguard()Z
 HSPLcom/android/server/wm/DisplayContent;->clearLayoutNeeded()V
-HPLcom/android/server/wm/DisplayContent;->computeImeControlTarget()Lcom/android/server/wm/InsetsControlTarget;
-HSPLcom/android/server/wm/DisplayContent;->computeImeParent()Landroid/view/SurfaceControl;
-HSPLcom/android/server/wm/DisplayContent;->computeImeTarget(Z)Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/DisplayContent;->computeImeControlTarget()Lcom/android/server/wm/InsetsControlTarget;+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/EmbeddedWindowController$EmbeddedWindow;
+HSPLcom/android/server/wm/DisplayContent;->computeImeParent()Landroid/view/SurfaceControl;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayArea;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayContent;->computeImeTarget(Z)Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayContent;->computeScreenAppConfiguration(Landroid/content/res/Configuration;III)V
 HSPLcom/android/server/wm/DisplayContent;->computeScreenConfiguration(Landroid/content/res/Configuration;)V
-HSPLcom/android/server/wm/DisplayContent;->ensureActivitiesVisible(Lcom/android/server/wm/ActivityRecord;Z)V
-HPLcom/android/server/wm/DisplayContent;->executeAppTransition()V
-HSPLcom/android/server/wm/DisplayContent;->findFocusedWindow()Lcom/android/server/wm/WindowState;
-HSPLcom/android/server/wm/DisplayContent;->findFocusedWindowIfNeeded(I)Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/DisplayContent;->ensureActivitiesVisible(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
+HSPLcom/android/server/wm/DisplayContent;->executeAppTransition()V+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;
+HSPLcom/android/server/wm/DisplayContent;->findFocusedWindow()Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayContent;->findFocusedWindowIfNeeded(I)Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->finishHoldScreenUpdate()V+]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;
-HPLcom/android/server/wm/DisplayContent;->forAllImeWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/DisplayContent;->forAllImeWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Lcom/android/server/wm/DisplayContent$ImeContainer;Lcom/android/server/wm/DisplayContent$ImeContainer;
 HSPLcom/android/server/wm/DisplayContent;->getAsyncRotationController()Lcom/android/server/wm/AsyncRotationController;
 HSPLcom/android/server/wm/DisplayContent;->getDefaultTaskDisplayArea()Lcom/android/server/wm/TaskDisplayArea;+]Lcom/android/server/wm/DisplayAreaPolicy;Lcom/android/server/wm/DisplayAreaPolicyBuilder$Result;
 HSPLcom/android/server/wm/DisplayContent;->getDisplayId()I
@@ -10354,171 +7772,169 @@
 HSPLcom/android/server/wm/DisplayContent;->getDisplayRotation()Lcom/android/server/wm/DisplayRotation;
 HSPLcom/android/server/wm/DisplayContent;->getFocusedRootTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->getImeInputTarget()Lcom/android/server/wm/InputTarget;
-HSPLcom/android/server/wm/DisplayContent;->getImePolicy()I
+HSPLcom/android/server/wm/DisplayContent;->getImePolicy()I+]Lcom/android/server/wm/DisplayWindowSettings;Lcom/android/server/wm/DisplayWindowSettings;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->getImeTarget(I)Lcom/android/server/wm/InsetsControlTarget;
-HPLcom/android/server/wm/DisplayContent;->getInputMethodWindowVisibleHeight()I
+HSPLcom/android/server/wm/DisplayContent;->getInputMethodWindowVisibleHeight()I+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->getInputMonitor()Lcom/android/server/wm/InputMonitor;
 HSPLcom/android/server/wm/DisplayContent;->getInsetsPolicy()Lcom/android/server/wm/InsetsPolicy;
 HSPLcom/android/server/wm/DisplayContent;->getInsetsStateController()Lcom/android/server/wm/InsetsStateController;
 HSPLcom/android/server/wm/DisplayContent;->getKeepClearAreas(Ljava/util/Set;Ljava/util/Set;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
-HSPLcom/android/server/wm/DisplayContent;->getOrientation()I
+HSPLcom/android/server/wm/DisplayContent;->getOrientation()I+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->getOrientationRequestingTaskDisplayArea()Lcom/android/server/wm/TaskDisplayArea;
-HSPLcom/android/server/wm/DisplayContent;->getRotation()I
+HSPLcom/android/server/wm/DisplayContent;->getRotation()I+]Lcom/android/server/wm/DisplayRotation;Lcom/android/server/wm/DisplayRotation;
 HSPLcom/android/server/wm/DisplayContent;->getWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/WindowToken;+]Ljava/util/HashMap;Ljava/util/HashMap;
 HSPLcom/android/server/wm/DisplayContent;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HPLcom/android/server/wm/DisplayContent;->handleTopActivityLaunchingInDifferentOrientation(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Z)Z
+HSPLcom/android/server/wm/DisplayContent;->handleTopActivityLaunchingInDifferentOrientation(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Z)Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/DisplayContent;->handlesOrientationChangeFromDescendant(I)Z+]Lcom/android/server/wm/DisplayRotation;Lcom/android/server/wm/DisplayRotation;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->hasAccess(I)Z
 HSPLcom/android/server/wm/DisplayContent;->hasOwnFocus()Z
 HSPLcom/android/server/wm/DisplayContent;->inTransition()Z
 HSPLcom/android/server/wm/DisplayContent;->isImeControlledByApp()Z+]Lcom/android/server/wm/InputTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/EmbeddedWindowController$EmbeddedWindow;
 HSPLcom/android/server/wm/DisplayContent;->isKeyguardGoingAway()Z+]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
-HSPLcom/android/server/wm/DisplayContent;->isKeyguardLocked()Z
+HSPLcom/android/server/wm/DisplayContent;->isKeyguardLocked()Z+]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
 HSPLcom/android/server/wm/DisplayContent;->isLayoutNeeded()Z
 HSPLcom/android/server/wm/DisplayContent;->isReady()Z
 HSPLcom/android/server/wm/DisplayContent;->isRemoved()Z
 HSPLcom/android/server/wm/DisplayContent;->isRemoving()Z
 HSPLcom/android/server/wm/DisplayContent;->isSleeping()Z
 HSPLcom/android/server/wm/DisplayContent;->isTrusted()Z+]Landroid/view/Display;Landroid/view/Display;
-HSPLcom/android/server/wm/DisplayContent;->isVisibleRequested()Z
-HPLcom/android/server/wm/DisplayContent;->lambda$calculateSystemGestureExclusion$34(Lcom/android/server/wm/RecentsAnimationController;Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Region;[ILandroid/graphics/Region;Landroid/graphics/Region;Lcom/android/server/wm/WindowState;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/DisplayContent;->isVisibleRequested()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayContent;->lambda$calculateSystemGestureExclusion$34(Lcom/android/server/wm/RecentsAnimationController;Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Region;[ILandroid/graphics/Region;Landroid/graphics/Region;Lcom/android/server/wm/WindowState;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/DisplayContent;->lambda$ensureActivitiesVisible$47(Lcom/android/server/wm/ActivityRecord;ZLcom/android/server/wm/Task;)V
 HSPLcom/android/server/wm/DisplayContent;->lambda$getKeepClearAreas$37(Lcom/android/server/wm/RecentsAnimationController;Ljava/util/Set;Ljava/util/Set;Landroid/graphics/Matrix;[FLcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/DisplayContent;->lambda$new$1(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/DisplayContent;->lambda$new$3(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/DisplayContent;->lambda$new$4(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->lambda$new$5(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HPLcom/android/server/wm/DisplayContent;->lambda$new$6(Lcom/android/server/wm/WindowState;)Z
 HSPLcom/android/server/wm/DisplayContent;->lambda$new$7(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->lambda$new$8(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/RefreshRatePolicy;Lcom/android/server/wm/RefreshRatePolicy;]Ljava/util/LinkedList;Ljava/util/LinkedList;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/DisplayContent;->lambda$updateTouchExcludeRegion$19(Lcom/android/server/wm/Task;ILcom/android/server/wm/Task;)V
-HPLcom/android/server/wm/DisplayContent;->logsGestureExclusionRestrictions(Lcom/android/server/wm/WindowState;)Z
-HSPLcom/android/server/wm/DisplayContent;->makeChildSurface(Lcom/android/server/wm/WindowContainer;)Landroid/view/SurfaceControl$Builder;
-HPLcom/android/server/wm/DisplayContent;->needsGestureExclusionRestrictions(Lcom/android/server/wm/WindowState;Z)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
-HSPLcom/android/server/wm/DisplayContent;->notifyInsetsChanged(Ljava/util/function/Consumer;)V
-HSPLcom/android/server/wm/DisplayContent;->okToAnimate(ZZ)Z
-HSPLcom/android/server/wm/DisplayContent;->okToDisplay(ZZ)Z
-HSPLcom/android/server/wm/DisplayContent;->onDisplayInfoChanged()V
-HSPLcom/android/server/wm/DisplayContent;->onDisplayInfoUpdated(Landroid/view/DisplayInfo;)V
-HPLcom/android/server/wm/DisplayContent;->onImeInsetsClientVisibilityUpdate()Z
+HSPLcom/android/server/wm/DisplayContent;->lambda$updateTouchExcludeRegion$19(Lcom/android/server/wm/Task;ILcom/android/server/wm/Task;)V
+HPLcom/android/server/wm/DisplayContent;->logsGestureExclusionRestrictions(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
+HSPLcom/android/server/wm/DisplayContent;->makeChildSurface(Lcom/android/server/wm/WindowContainer;)Landroid/view/SurfaceControl$Builder;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/view/SurfaceControl$Builder;Landroid/view/SurfaceControl$Builder;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayContent;->needsGestureExclusionRestrictions(Lcom/android/server/wm/WindowState;Z)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/DisplayContent;->notifyInsetsChanged(Ljava/util/function/Consumer;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
+HSPLcom/android/server/wm/DisplayContent;->okToAnimate(ZZ)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayContent;->okToDisplay(ZZ)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;
+HSPLcom/android/server/wm/DisplayContent;->onDisplayInfoChanged()V+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
+HSPLcom/android/server/wm/DisplayContent;->onDisplayInfoUpdated(Landroid/view/DisplayInfo;)V+]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowContextListenerController;Lcom/android/server/wm/WindowContextListenerController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/DisplayContent;->onImeInsetsClientVisibilityUpdate()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/EmbeddedWindowController$EmbeddedWindow;
 HSPLcom/android/server/wm/DisplayContent;->performLayout(ZZ)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->performLayoutNoTrace(ZZ)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;
 HSPLcom/android/server/wm/DisplayContent;->prepareSurfaces()V
-HPLcom/android/server/wm/DisplayContent;->processTaskForTouchExcludeRegion(Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;I)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;
+HSPLcom/android/server/wm/DisplayContent;->processTaskForTouchExcludeRegion(Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;I)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;
 HPLcom/android/server/wm/DisplayContent;->rotationForActivityInDifferentOrientation(Lcom/android/server/wm/ActivityRecord;)I
 HSPLcom/android/server/wm/DisplayContent;->setDisplayMirroring()Z+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;
-HPLcom/android/server/wm/DisplayContent;->setFocusedApp(Lcom/android/server/wm/ActivityRecord;)Z
+HSPLcom/android/server/wm/DisplayContent;->setFocusedApp(Lcom/android/server/wm/ActivityRecord;)Z
 HPLcom/android/server/wm/DisplayContent;->setImeInputTarget(Lcom/android/server/wm/InputTarget;)V
-HSPLcom/android/server/wm/DisplayContent;->setImeLayeringTargetInner(Lcom/android/server/wm/WindowState;)V
+HSPLcom/android/server/wm/DisplayContent;->setImeLayeringTargetInner(Lcom/android/server/wm/WindowState;)V+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/DisplayContent$ImeContainer;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent$ImeContainer;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->setLayoutNeeded()V
-HSPLcom/android/server/wm/DisplayContent;->shouldDeferRemoval()Z
+HSPLcom/android/server/wm/DisplayContent;->shouldDeferRemoval()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
 HSPLcom/android/server/wm/DisplayContent;->shouldImeAttachedToApp()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent$ImeContainer;
-HPLcom/android/server/wm/DisplayContent;->toString()Ljava/lang/String;
-HSPLcom/android/server/wm/DisplayContent;->updateBaseDisplayMetricsIfNeeded(Landroid/view/DisplayInfo;)V
+HSPLcom/android/server/wm/DisplayContent;->shouldSleep()Z
+HSPLcom/android/server/wm/DisplayContent;->toString()Ljava/lang/String;
+HSPLcom/android/server/wm/DisplayContent;->updateBaseDisplayMetricsIfNeeded(Landroid/view/DisplayInfo;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->updateDisplayAndOrientation(Landroid/content/res/Configuration;)Landroid/view/DisplayInfo;
-HSPLcom/android/server/wm/DisplayContent;->updateDisplayFrames(Lcom/android/server/wm/DisplayFrames;III)Z
-HSPLcom/android/server/wm/DisplayContent;->updateDisplayFrames(Z)V
-HSPLcom/android/server/wm/DisplayContent;->updateDisplayInfo(Landroid/view/DisplayInfo;)V
+HSPLcom/android/server/wm/DisplayContent;->updateDisplayFrames(Lcom/android/server/wm/DisplayFrames;III)Z+]Lcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/DisplayFrames;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayContent;->updateDisplayFrames(Z)V+]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayContent;->updateDisplayInfo(Landroid/view/DisplayInfo;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->updateDisplayOverrideConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/wm/ActivityRecord;Z)Z
-HSPLcom/android/server/wm/DisplayContent;->updateFocusedWindowLocked(IZI)Z
-HPLcom/android/server/wm/DisplayContent;->updateImeControlTarget(Z)V
+HSPLcom/android/server/wm/DisplayContent;->updateFocusedWindowLocked(IZI)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;
+HPLcom/android/server/wm/DisplayContent;->updateImeControlTarget(Z)V+]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;
 HPLcom/android/server/wm/DisplayContent;->updateImeInputAndControlTarget(Lcom/android/server/wm/InputTarget;)V
-HSPLcom/android/server/wm/DisplayContent;->updateImeParent()V
-HSPLcom/android/server/wm/DisplayContent;->updateKeepClearAreas()V+]Ljava/lang/Object;Landroid/util/ArraySet;]Lcom/android/server/wm/DisplayWindowListenerController;Lcom/android/server/wm/DisplayWindowListenerController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HSPLcom/android/server/wm/DisplayContent;->updateOrientation()Z
-HSPLcom/android/server/wm/DisplayContent;->updateOrientation(Z)Z
-HSPLcom/android/server/wm/DisplayContent;->updateRecording()V
+HSPLcom/android/server/wm/DisplayContent;->updateImeParent()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/DisplayContent$ImeContainer;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/DisplayContent$ImeContainer;
+HSPLcom/android/server/wm/DisplayContent;->updateKeepClearAreas()V+]Ljava/lang/Object;Landroid/util/ArraySet;]Lcom/android/server/wm/DisplayWindowListenerController;Lcom/android/server/wm/DisplayWindowListenerController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/Set;Landroid/util/ArraySet;
+HSPLcom/android/server/wm/DisplayContent;->updateOrientation()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayContent;->updateOrientation(Z)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/DisplayRotation;Lcom/android/server/wm/DisplayRotation;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController;]Lcom/android/server/wm/DisplayRotationReversionController;Lcom/android/server/wm/DisplayRotationReversionController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/DisplayContent;->updateRecording()V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->updateSystemGestureExclusion()Z+]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/view/ISystemGestureExclusionListener;Landroid/view/ISystemGestureExclusionListener$Stub$Proxy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
-HSPLcom/android/server/wm/DisplayContent;->updateSystemGestureExclusionLimit()V
+HSPLcom/android/server/wm/DisplayContent;->updateSystemGestureExclusionLimit()V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayContent;->updateTouchExcludeRegion()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TaskTapPointerEventListener;Lcom/android/server/wm/TaskTapPointerEventListener;]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/DisplayContent;->updateWindowsForAnimator()V
-HSPLcom/android/server/wm/DisplayFrames;->update(IIILandroid/view/DisplayCutout;Landroid/view/RoundedCorners;Landroid/view/PrivacyIndicatorBounds;Landroid/view/DisplayShape;)Z
+HSPLcom/android/server/wm/DisplayContent;->updateWindowsForAnimator()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;
+HSPLcom/android/server/wm/DisplayFrames;->update(IIILandroid/view/DisplayCutout;Landroid/view/RoundedCorners;Landroid/view/PrivacyIndicatorBounds;Landroid/view/DisplayShape;)Z+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/view/PrivacyIndicatorBounds;Landroid/view/PrivacyIndicatorBounds;]Landroid/view/RoundedCorners;Landroid/view/RoundedCorners;
 HPLcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HPLcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda13;->test(Ljava/lang/Object;)Z
-HPLcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda8;-><init>(II[Lcom/android/internal/view/AppearanceRegion;ZIILjava/lang/String;[Lcom/android/internal/statusbar/LetterboxDetails;)V
-HPLcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda8;->accept(Ljava/lang/Object;)V
+HSPLcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda13;->test(Ljava/lang/Object;)Z
+HSPLcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda8;-><init>(II[Lcom/android/internal/view/AppearanceRegion;ZIILjava/lang/String;[Lcom/android/internal/statusbar/LetterboxDetails;)V
+HSPLcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda8;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wm/DisplayPolicy$DecorInsets$Info;->update(Lcom/android/server/wm/DisplayContent;III)Landroid/view/InsetsState;
-HPLcom/android/server/wm/DisplayPolicy;->$r8$lambda$1_m4nH4Hb1g0NK20HZqMJmOu8w0(Lcom/android/server/wm/Task;)Z
 HPLcom/android/server/wm/DisplayPolicy;->$r8$lambda$WrdAsexcVfs8v_wSDSxSFmYy5EE(Lcom/android/server/wm/WindowState;IILcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowContainer;Landroid/graphics/Rect;)Ljava/lang/Integer;
 HPLcom/android/server/wm/DisplayPolicy;->addSystemBarColorApp(Lcom/android/server/wm/WindowState;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HSPLcom/android/server/wm/DisplayPolicy;->adjustWindowParamsLw(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;)V
+HSPLcom/android/server/wm/DisplayPolicy;->adjustWindowParamsLw(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;)V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/DisplayPolicy;->applyKeyguardPolicy(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/ImeInsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HSPLcom/android/server/wm/DisplayPolicy;->applyPostLayoutPolicyLw(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/DisplayPolicy;->areTypesForciblyShownTransiently(I)Z
+HSPLcom/android/server/wm/DisplayPolicy;->applyPostLayoutPolicyLw(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/DisplayPolicy;->areTypesForciblyShownTransiently(I)Z
 HSPLcom/android/server/wm/DisplayPolicy;->beginPostLayoutPolicyLw()V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/wm/DisplayPolicy;->calculateInsetsFrame(Landroid/graphics/Rect;Landroid/graphics/Insets;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HPLcom/android/server/wm/DisplayPolicy;->callStatusBarSafely(Ljava/util/function/Consumer;)V
-HPLcom/android/server/wm/DisplayPolicy;->chooseNavigationBackgroundWindow(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;I)Lcom/android/server/wm/WindowState;
-HPLcom/android/server/wm/DisplayPolicy;->chooseNavigationColorWindowLw(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;I)Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HPLcom/android/server/wm/DisplayPolicy;->configureNavBarOpacity(IZZ)I+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
-HPLcom/android/server/wm/DisplayPolicy;->configureStatusBarOpacity(I)I+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/wm/DisplayPolicy;->drawsBarBackground(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/DisplayPolicy;->chooseNavigationBackgroundWindow(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;I)Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/DisplayPolicy;->chooseNavigationColorWindowLw(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;I)Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/DisplayPolicy;->configureNavBarOpacity(IZZ)I+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
+HSPLcom/android/server/wm/DisplayPolicy;->configureStatusBarOpacity(I)I+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/DisplayPolicy;->drawsBarBackground(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/DisplayPolicy;->finishPostLayoutPolicyLw()V+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
-HPLcom/android/server/wm/DisplayPolicy;->focusChangedLw(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)V
+HSPLcom/android/server/wm/DisplayPolicy;->focusChangedLw(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
 HPLcom/android/server/wm/DisplayPolicy;->getBarContentFrameForWindow(Lcom/android/server/wm/WindowState;I)Landroid/graphics/Rect;+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/DisplayCutout;Landroid/view/DisplayCutout;
 HSPLcom/android/server/wm/DisplayPolicy;->getDisplayId()I+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HPLcom/android/server/wm/DisplayPolicy;->getInsetsPolicy()Lcom/android/server/wm/InsetsPolicy;+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HPLcom/android/server/wm/DisplayPolicy;->getNotificationShade()Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/DisplayPolicy;->getInsetsPolicy()Lcom/android/server/wm/InsetsPolicy;+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayPolicy;->getNotificationShade()Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/DisplayPolicy;->getRefreshRatePolicy()Lcom/android/server/wm/RefreshRatePolicy;
-HPLcom/android/server/wm/DisplayPolicy;->getStatusBar()Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/DisplayPolicy;->getStatusBar()Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/DisplayPolicy;->getStatusBarManagerInternal()Lcom/android/server/statusbar/StatusBarManagerInternal;
-HPLcom/android/server/wm/DisplayPolicy;->getTopFullscreenOpaqueWindow()Lcom/android/server/wm/WindowState;
-HPLcom/android/server/wm/DisplayPolicy;->intersectsAnyInsets(Landroid/graphics/Rect;Landroid/view/InsetsState;I)Z+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;
+HSPLcom/android/server/wm/DisplayPolicy;->getTopFullscreenOpaqueWindow()Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/DisplayPolicy;->intersectsAnyInsets(Landroid/graphics/Rect;Landroid/view/InsetsState;I)Z+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;
 HSPLcom/android/server/wm/DisplayPolicy;->isAwake()Z
-HPLcom/android/server/wm/DisplayPolicy;->isForceShowNavigationBarEnabled()Z
-HPLcom/android/server/wm/DisplayPolicy;->isFullyTransparentAllowed(Lcom/android/server/wm/WindowState;I)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
-HPLcom/android/server/wm/DisplayPolicy;->isImmersiveMode(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;
+HSPLcom/android/server/wm/DisplayPolicy;->isForceShowNavigationBarEnabled()Z
+HSPLcom/android/server/wm/DisplayPolicy;->isFullyTransparentAllowed(Lcom/android/server/wm/WindowState;I)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
+HSPLcom/android/server/wm/DisplayPolicy;->isImmersiveMode(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;
 HSPLcom/android/server/wm/DisplayPolicy;->isKeyguardOccluded()Z
 HSPLcom/android/server/wm/DisplayPolicy;->isKeyguardShowing()Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;
-HPLcom/android/server/wm/DisplayPolicy;->isLightBarAllowed(Lcom/android/server/wm/WindowState;I)Z
-HPLcom/android/server/wm/DisplayPolicy;->isOverlappingWithNavBar(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HPLcom/android/server/wm/DisplayPolicy;->isRemoteInsetsControllerControllingSystemBars()Z
+HPLcom/android/server/wm/DisplayPolicy;->isLightBarAllowed(Lcom/android/server/wm/WindowState;I)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/DisplayPolicy;->isOverlappingWithNavBar(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/DisplayPolicy;->isRemoteInsetsControllerControllingSystemBars()Z
 HSPLcom/android/server/wm/DisplayPolicy;->isScreenOnEarly()Z
 HSPLcom/android/server/wm/DisplayPolicy;->isShowingDreamLw()Z
+HSPLcom/android/server/wm/DisplayPolicy;->isWindowExcludedFromContent(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/internal/widget/PointerLocationView;Lcom/android/internal/widget/PointerLocationView;
 HPLcom/android/server/wm/DisplayPolicy;->lambda$getFrameProvider$1(Lcom/android/server/wm/WindowState;IILcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowContainer;Landroid/graphics/Rect;)Ljava/lang/Integer;+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/InsetsFrameProvider;Landroid/view/InsetsFrameProvider;]Landroid/view/InsetsFrameProvider$InsetsSizeOverride;Landroid/view/InsetsFrameProvider$InsetsSizeOverride;
-HPLcom/android/server/wm/DisplayPolicy;->lambda$updateSystemBarsLw$8(Lcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/DisplayPolicy;->lambda$updateSystemBarsLw$8(Lcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/DisplayPolicy;->layoutWindowLw(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/DisplayFrames;)V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/WindowLayout;Landroid/view/WindowLayout;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/DisplayPolicy;->navigationBarPosition(I)I
-HSPLcom/android/server/wm/DisplayPolicy;->onDisplayInfoChanged(Landroid/view/DisplayInfo;)V
+HSPLcom/android/server/wm/DisplayPolicy;->onDisplayInfoChanged(Landroid/view/DisplayInfo;)V+]Lcom/android/server/wm/SystemGesturesPointerEventListener;Lcom/android/server/wm/SystemGesturesPointerEventListener;
 HPLcom/android/server/wm/DisplayPolicy;->onUserActivityEventTouch()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HPLcom/android/server/wm/DisplayPolicy;->removeWindowLw(Lcom/android/server/wm/WindowState;)V
 HSPLcom/android/server/wm/DisplayPolicy;->shouldBeHiddenByKeyguard(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
-HPLcom/android/server/wm/DisplayPolicy;->topAppHidesSystemBar(I)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
-HPLcom/android/server/wm/DisplayPolicy;->updateLightNavigationBarLw(ILcom/android/server/wm/WindowState;)I
+HSPLcom/android/server/wm/DisplayPolicy;->topAppHidesSystemBar(I)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
+HSPLcom/android/server/wm/DisplayPolicy;->updateLightNavigationBarLw(ILcom/android/server/wm/WindowState;)I
 HSPLcom/android/server/wm/DisplayPolicy;->updateSystemBarAttributes()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/input/InputManagerService;Lcom/android/server/input/InputManagerService;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/wm/DisplayPolicy;->updateSystemBarsLw(Lcom/android/server/wm/WindowState;I)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/statusbar/StatusBarManagerInternal;Lcom/android/server/statusbar/StatusBarManagerService$1;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/ImmersiveModeConfirmation;Lcom/android/server/wm/ImmersiveModeConfirmation;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayPolicy;->updateSystemBarsLw(Lcom/android/server/wm/WindowState;I)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/statusbar/StatusBarManagerInternal;Lcom/android/server/statusbar/StatusBarManagerService$1;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/ImmersiveModeConfirmation;Lcom/android/server/wm/ImmersiveModeConfirmation;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/DisplayPolicy;->validateAddingWindowLw(Landroid/view/WindowManager$LayoutParams;II)I
 HSPLcom/android/server/wm/DisplayRotation;->getRotation()I
 HSPLcom/android/server/wm/DisplayRotation;->isFixedToUserRotation()Z
 HSPLcom/android/server/wm/DisplayRotation;->isRotatingSeamlessly()Z
 HPLcom/android/server/wm/DisplayRotation;->needSensorRunning()Z
-HPLcom/android/server/wm/DisplayRotation;->rotationForOrientation(II)I
-HSPLcom/android/server/wm/DisplayRotation;->updateOrientation(IZ)Z
+HPLcom/android/server/wm/DisplayRotation;->rotationForOrientation(II)I+]Lcom/android/server/wm/DisplayRotation;Lcom/android/server/wm/DisplayRotation;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/WindowOrientationListener;Lcom/android/server/wm/DisplayRotation$OrientationListener;
+HSPLcom/android/server/wm/DisplayRotation;->updateOrientation(IZ)Z+]Lcom/android/server/wm/DisplayRotation;Lcom/android/server/wm/DisplayRotation;
 HSPLcom/android/server/wm/DisplayRotation;->updateOrientationListenerLw()V
 HSPLcom/android/server/wm/DisplayRotation;->updateRotationUnchecked(Z)Z
-HSPLcom/android/server/wm/DisplayRotationCompatPolicy;->isTreatmentEnabledForDisplay()Z
-HPLcom/android/server/wm/DisplayRotationReversionController;->isRotationReversionEnabled()Z
-HSPLcom/android/server/wm/DisplayWindowSettings;->getImePolicyLocked(Lcom/android/server/wm/DisplayContent;)I
-HSPLcom/android/server/wm/DragDropController;->dragDropActiveLocked()Z
+HSPLcom/android/server/wm/DisplayRotationReversionController;->isRotationReversionEnabled()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DisplayWindowSettings;->getImePolicyLocked(Lcom/android/server/wm/DisplayContent;)I+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/DragDropController;->dragDropActiveLocked()Z+]Lcom/android/server/wm/DragState;Lcom/android/server/wm/DragState;
 HPLcom/android/server/wm/EmbeddedWindowController;->get(Landroid/os/IBinder;)Lcom/android/server/wm/EmbeddedWindowController$EmbeddedWindow;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
-HSPLcom/android/server/wm/EnsureActivitiesVisibleHelper;->process(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/EnsureActivitiesVisibleHelper;Lcom/android/server/wm/EnsureActivitiesVisibleHelper;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;,Ljava/util/ArrayList;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/EnsureActivitiesVisibleHelper;->reset(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/EnsureActivitiesVisibleHelper;->process(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/EnsureActivitiesVisibleHelper;Lcom/android/server/wm/EnsureActivitiesVisibleHelper;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;,Ljava/util/ArrayList;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/EnsureActivitiesVisibleHelper;->reset(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/EnsureActivitiesVisibleHelper;->setActivityVisibilityState(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/EnsureActivitiesVisibleHelper;Lcom/android/server/wm/EnsureActivitiesVisibleHelper;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/HighRefreshRateDenylist;->isDenylisted(Ljava/lang/String;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/wm/ImeInsetsSourceProvider;->checkShowImePostLayout()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ImeInsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/lang/Runnable;Lcom/android/server/wm/ImeInsetsSourceProvider$$ExternalSyntheticLambda0;
-HPLcom/android/server/wm/ImeInsetsSourceProvider;->getControl(Lcom/android/server/wm/InsetsControlTarget;)Landroid/view/InsetsSourceControl;
+HPLcom/android/server/wm/ImeInsetsSourceProvider;->getControl(Lcom/android/server/wm/InsetsControlTarget;)Landroid/view/InsetsSourceControl;+]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/InsetsStateController$1;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/view/InsetsSourceControl;Landroid/view/InsetsSourceControl;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Landroid/window/TaskSnapshot;Landroid/window/TaskSnapshot;
 HPLcom/android/server/wm/ImeInsetsSourceProvider;->isReadyToShowIme()Z+]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ImeInsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HPLcom/android/server/wm/ImeInsetsSourceProvider;->onSourceChanged()V+]Landroid/os/Handler;Lcom/android/server/wm/WindowManagerService$H;]Landroid/os/Message;Landroid/os/Message;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;
 HPLcom/android/server/wm/ImeInsetsSourceProvider;->setServerVisible(Z)V
-HPLcom/android/server/wm/ImeInsetsSourceProvider;->updateClientVisibility(Lcom/android/server/wm/InsetsControlTarget;)Z
+HPLcom/android/server/wm/ImeInsetsSourceProvider;->updateClientVisibility(Lcom/android/server/wm/InsetsControlTarget;)Z+]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HPLcom/android/server/wm/ImeInsetsSourceProvider;->updateVisibility()V
-HSPLcom/android/server/wm/ImeTargetVisibilityPolicy;->canComputeImeParent(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/InputTarget;)Z
-HPLcom/android/server/wm/ImeTargetVisibilityPolicy;->shouldComputeImeParentForEmbeddedActivity(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/InputTarget;)Z
-HSPLcom/android/server/wm/ImmediateDisplayUpdater;->updateDisplayInfo(Ljava/lang/Runnable;)V
-HPLcom/android/server/wm/InputConfigAdapter;->applyMapping(ILjava/util/List;)I+]Ljava/util/List;Ljava/util/ImmutableCollections$ListN;]Ljava/util/Iterator;Ljava/util/ImmutableCollections$ListItr;
-HPLcom/android/server/wm/InputConfigAdapter;->getInputConfigFromWindowParams(III)I
-HPLcom/android/server/wm/InputConfigAdapter;->getMask()I
-HPLcom/android/server/wm/InputConsumerImpl;->hide(Landroid/view/SurfaceControl$Transaction;)V
+HSPLcom/android/server/wm/ImeTargetVisibilityPolicy;->canComputeImeParent(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/InputTarget;)Z+]Lcom/android/server/wm/InputTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/EmbeddedWindowController$EmbeddedWindow;
+HPLcom/android/server/wm/ImeTargetVisibilityPolicy;->shouldComputeImeParentForEmbeddedActivity(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/InputTarget;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InputTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/EmbeddedWindowController$EmbeddedWindow;
+HSPLcom/android/server/wm/ImmediateDisplayUpdater;->updateDisplayInfo(Ljava/lang/Runnable;)V+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/lang/Runnable;Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda33;
+HSPLcom/android/server/wm/InputConfigAdapter;->applyMapping(ILjava/util/List;)I+]Ljava/util/List;Ljava/util/ImmutableCollections$ListN;]Ljava/util/Iterator;Ljava/util/ImmutableCollections$ListItr;
+HSPLcom/android/server/wm/InputConfigAdapter;->getInputConfigFromWindowParams(III)I
+HSPLcom/android/server/wm/InputConfigAdapter;->getMask()I
+HPLcom/android/server/wm/InputConsumerImpl;->hide(Landroid/view/SurfaceControl$Transaction;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
 HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->-$$Nest$mupdateInputWindows(Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;Z)V
 HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->accept(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/Task;]Ljava/util/Map;Ljava/util/Collections$SynchronizedMap;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/InputConsumerImpl;Lcom/android/server/wm/InputConsumerImpl;]Landroid/view/InputWindowHandle;Landroid/view/InputWindowHandle;]Lcom/android/server/wm/DragDropController;Lcom/android/server/wm/DragDropController;
 HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->accept(Ljava/lang/Object;)V+]Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;
@@ -10536,25 +7952,23 @@
 HSPLcom/android/server/wm/InputMonitor;->-$$Nest$mupdateInputFocusRequest(Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputConsumerImpl;)V
 HSPLcom/android/server/wm/InputMonitor;->-$$Nest$smgetWeak(Ljava/lang/ref/WeakReference;)Ljava/lang/Object;
 HSPLcom/android/server/wm/InputMonitor;->getInputConsumer(Ljava/lang/String;)Lcom/android/server/wm/InputConsumerImpl;+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/wm/InputMonitor;->getWeak(Ljava/lang/ref/WeakReference;)Ljava/lang/Object;+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;
-HSPLcom/android/server/wm/InputMonitor;->populateInputWindowHandle(Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;,Landroid/view/ViewRootImpl$W;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/InputMonitor;->populateInputWindowHandle(Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;,Landroid/view/ViewRootImpl$W;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HPLcom/android/server/wm/InputMonitor;->populateOverlayInputInfo(Lcom/android/server/wm/InputWindowHandleWrapper;)V+]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;
-HPLcom/android/server/wm/InputMonitor;->requestFocus(Landroid/os/IBinder;Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
+HSPLcom/android/server/wm/InputMonitor;->requestFocus(Landroid/os/IBinder;Ljava/lang/String;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HSPLcom/android/server/wm/InputMonitor;->resetInputConsumers(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/InputConsumerImpl;Lcom/android/server/wm/InputConsumerImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/InputMonitor;->scheduleUpdateInputWindows()V+]Landroid/os/Handler;Landroid/os/Handler;
-HPLcom/android/server/wm/InputMonitor;->setInputFocusLw(Lcom/android/server/wm/WindowState;Z)V
+HSPLcom/android/server/wm/InputMonitor;->setInputFocusLw(Lcom/android/server/wm/WindowState;Z)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/InputMonitor;->setInputWindowInfoIfNeeded(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;Lcom/android/server/wm/InputWindowHandleWrapper;)V
 HSPLcom/android/server/wm/InputMonitor;->setUpdateInputWindowsNeededLw()V
 HSPLcom/android/server/wm/InputMonitor;->updateInputFocusRequest(Lcom/android/server/wm/InputConsumerImpl;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/inputmethod/InputMethodManagerInternal;Lcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/InputTarget;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/InputMonitor;->updateInputWindowsLw(Z)V+]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;
-HPLcom/android/server/wm/InputWindowHandleWrapper;->clearTouchableRegion()V
-HPLcom/android/server/wm/InputWindowHandleWrapper;->getDisplayId()I
+HPLcom/android/server/wm/InputWindowHandleWrapper;->clearTouchableRegion()V+]Landroid/graphics/Region;Landroid/graphics/Region;
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->hasWallpaper()Z
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->isChanged()Z
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->isFocusable()Z
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->isPaused()Z
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setDispatchingTimeoutMillis(J)V
-HPLcom/android/server/wm/InputWindowHandleWrapper;->setDisplayId(I)V
+HSPLcom/android/server/wm/InputWindowHandleWrapper;->setDisplayId(I)V
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setFocusable(Z)V+]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Landroid/view/InputWindowHandle;Landroid/view/InputWindowHandle;
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setHasWallpaper(Z)V+]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Landroid/view/InputWindowHandle;Landroid/view/InputWindowHandle;
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setInputApplicationHandle(Landroid/view/InputApplicationHandle;)V
@@ -10562,6 +7976,7 @@
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setLayoutParamsFlags(I)V
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setLayoutParamsType(I)V
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setName(Ljava/lang/String;)V
+HSPLcom/android/server/wm/InputWindowHandleWrapper;->setPackageName(Ljava/lang/String;)V
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setPaused(Z)V+]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Landroid/view/InputWindowHandle;Landroid/view/InputWindowHandle;
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setReplaceTouchableRegionWithCrop(Z)V
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setScaleFactor(F)V
@@ -10571,306 +7986,255 @@
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setTouchableRegion(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setTouchableRegionCrop(Landroid/view/SurfaceControl;)V+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;]Landroid/view/InputWindowHandle;Landroid/view/InputWindowHandle;
 HSPLcom/android/server/wm/InputWindowHandleWrapper;->setWindowToken(Landroid/os/IBinder;)V+]Landroid/view/InputWindowHandle;Landroid/view/InputWindowHandle;
-HPLcom/android/server/wm/InsetsPolicy$BarWindow;->-$$Nest$mupdateVisibility(Lcom/android/server/wm/InsetsPolicy$BarWindow;Lcom/android/server/wm/InsetsControlTarget;I)V+]Lcom/android/server/wm/InsetsPolicy$BarWindow;Lcom/android/server/wm/InsetsPolicy$BarWindow;
-HPLcom/android/server/wm/InsetsPolicy$BarWindow;->setVisible(Z)V+]Lcom/android/server/statusbar/StatusBarManagerInternal;Lcom/android/server/statusbar/StatusBarManagerService$1;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HPLcom/android/server/wm/InsetsPolicy$BarWindow;->updateVisibility(Lcom/android/server/wm/InsetsControlTarget;I)V+]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/InsetsPolicy$ControlTarget;]Lcom/android/server/wm/InsetsPolicy$BarWindow;Lcom/android/server/wm/InsetsPolicy$BarWindow;
+HSPLcom/android/server/wm/InsetsPolicy$BarWindow;->-$$Nest$mupdateVisibility(Lcom/android/server/wm/InsetsPolicy$BarWindow;Lcom/android/server/wm/InsetsControlTarget;I)V+]Lcom/android/server/wm/InsetsPolicy$BarWindow;Lcom/android/server/wm/InsetsPolicy$BarWindow;
+HSPLcom/android/server/wm/InsetsPolicy$BarWindow;->setVisible(Z)V+]Lcom/android/server/statusbar/StatusBarManagerInternal;Lcom/android/server/statusbar/StatusBarManagerService$1;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/InsetsPolicy$BarWindow;->updateVisibility(Lcom/android/server/wm/InsetsControlTarget;I)V+]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/InsetsPolicy$ControlTarget;]Lcom/android/server/wm/InsetsPolicy$BarWindow;Lcom/android/server/wm/InsetsPolicy$BarWindow;
 HSPLcom/android/server/wm/InsetsPolicy;->adjustInsetsForRoundedCorners(Lcom/android/server/wm/WindowToken;Landroid/view/InsetsState;Z)Landroid/view/InsetsState;+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/InsetsPolicy;->adjustInsetsForWindow(Lcom/android/server/wm/WindowState;Landroid/view/InsetsState;Z)Landroid/view/InsetsState;
 HPLcom/android/server/wm/InsetsPolicy;->adjustVisibilityForFakeControllingSource(Landroid/view/InsetsState;ILandroid/view/InsetsSource;Lcom/android/server/wm/InsetsControlTarget;)Landroid/view/InsetsState;+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/InsetsPolicy$ControlTarget;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;
 HSPLcom/android/server/wm/InsetsPolicy;->adjustVisibilityForFakeControllingSources(Landroid/view/InsetsState;)Landroid/view/InsetsState;+]Landroid/view/InsetsState;Landroid/view/InsetsState;
 HSPLcom/android/server/wm/InsetsPolicy;->adjustVisibilityForIme(Lcom/android/server/wm/WindowState;Landroid/view/InsetsState;Z)Landroid/view/InsetsState;+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HPLcom/android/server/wm/InsetsPolicy;->areTypesForciblyShowing(I)Z
-HPLcom/android/server/wm/InsetsPolicy;->canBeTopFullscreenOpaqueWindow(Lcom/android/server/wm/WindowState;)Z+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/InsetsPolicy;->areTypesForciblyShowing(I)Z
+HSPLcom/android/server/wm/InsetsPolicy;->canBeTopFullscreenOpaqueWindow(Lcom/android/server/wm/WindowState;)Z+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/InsetsPolicy;->enforceInsetsPolicyForTarget(Landroid/view/WindowManager$LayoutParams;IZLandroid/view/InsetsState;)Landroid/view/InsetsState;+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsFrameProvider;Landroid/view/InsetsFrameProvider;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
-HPLcom/android/server/wm/InsetsPolicy;->forceShowingNavigationBars(Lcom/android/server/wm/WindowState;)Z
+HSPLcom/android/server/wm/InsetsPolicy;->forceShowingNavigationBars(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
 HSPLcom/android/server/wm/InsetsPolicy;->getInsetsForWindowMetrics(Lcom/android/server/wm/WindowToken;Landroid/view/InsetsState;)V+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/InsetsPolicy;->getNavControlTarget(Lcom/android/server/wm/WindowState;Z)Lcom/android/server/wm/InsetsControlTarget;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;
-HPLcom/android/server/wm/InsetsPolicy;->getStatusControlTarget(Lcom/android/server/wm/WindowState;Z)Lcom/android/server/wm/InsetsControlTarget;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
-HPLcom/android/server/wm/InsetsPolicy;->hasHiddenSources(I)Z+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
+HSPLcom/android/server/wm/InsetsPolicy;->getNavControlTarget(Lcom/android/server/wm/WindowState;Z)Lcom/android/server/wm/InsetsControlTarget;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;
+HSPLcom/android/server/wm/InsetsPolicy;->getStatusControlTarget(Lcom/android/server/wm/WindowState;Z)Lcom/android/server/wm/InsetsControlTarget;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
+HSPLcom/android/server/wm/InsetsPolicy;->hasHiddenSources(I)Z+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
 HSPLcom/android/server/wm/InsetsPolicy;->isTransient(I)Z
-HPLcom/android/server/wm/InsetsPolicy;->remoteInsetsControllerControlsSystemBars(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
-HPLcom/android/server/wm/InsetsPolicy;->updateBarControlTarget(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
-HPLcom/android/server/wm/InsetsPolicy;->updateSystemBars(Lcom/android/server/wm/WindowState;ZZ)V+]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
-HPLcom/android/server/wm/InsetsSourceProvider$ControlAdapter;-><init>(Lcom/android/server/wm/InsetsSourceProvider;Landroid/graphics/Point;)V
-HPLcom/android/server/wm/InsetsSourceProvider$ControlAdapter;->onAnimationCancelled(Landroid/view/SurfaceControl;)V
-HPLcom/android/server/wm/InsetsSourceProvider$ControlAdapter;->startAnimation(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;ILcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)V
-HPLcom/android/server/wm/InsetsSourceProvider;->getControl(Lcom/android/server/wm/InsetsControlTarget;)Landroid/view/InsetsSourceControl;
+HSPLcom/android/server/wm/InsetsPolicy;->remoteInsetsControllerControlsSystemBars(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;
+HSPLcom/android/server/wm/InsetsPolicy;->updateBarControlTarget(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
+HSPLcom/android/server/wm/InsetsPolicy;->updateSystemBars(Lcom/android/server/wm/WindowState;ZZ)V+]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
+HPLcom/android/server/wm/InsetsSourceProvider$ControlAdapter;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V+]Ljava/io/PrintWriter;Lcom/android/internal/util/FastPrintWriter;,Ljava/io/PrintWriter;
+HPLcom/android/server/wm/InsetsSourceProvider$ControlAdapter;->onAnimationCancelled(Landroid/view/SurfaceControl;)V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
+HPLcom/android/server/wm/InsetsSourceProvider$ControlAdapter;->startAnimation(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;ILcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)V+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
+HPLcom/android/server/wm/InsetsSourceProvider;->getControl(Lcom/android/server/wm/InsetsControlTarget;)Landroid/view/InsetsSourceControl;+]Landroid/view/InsetsSourceControl;Landroid/view/InsetsSourceControl;
 HPLcom/android/server/wm/InsetsSourceProvider;->getInsetsHint()Landroid/graphics/Insets;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
-HPLcom/android/server/wm/InsetsSourceProvider;->getSource()Landroid/view/InsetsSource;
-HPLcom/android/server/wm/InsetsSourceProvider;->getWindowFrameSurfacePosition()Landroid/graphics/Point;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Landroid/view/InsetsSourceControl;Landroid/view/InsetsSourceControl;
+HSPLcom/android/server/wm/InsetsSourceProvider;->getSource()Landroid/view/InsetsSource;
+HPLcom/android/server/wm/InsetsSourceProvider;->getWindowFrameSurfacePosition()Landroid/graphics/Point;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/view/InsetsSourceControl;Landroid/view/InsetsSourceControl;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HPLcom/android/server/wm/InsetsSourceProvider;->isClientVisible()Z
-HSPLcom/android/server/wm/InsetsSourceProvider;->onPostLayout()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Insets;Landroid/graphics/Insets;]Landroid/view/InsetsSourceControl;Landroid/view/InsetsSourceControl;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Ljava/util/function/Consumer;Lcom/android/server/wm/InsetsSourceProvider$$ExternalSyntheticLambda0;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;
+HSPLcom/android/server/wm/InsetsSourceProvider;->onPostLayout()V+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Insets;Landroid/graphics/Insets;]Landroid/view/InsetsSourceControl;Landroid/view/InsetsSourceControl;]Ljava/util/function/Consumer;Lcom/android/server/wm/InsetsSourceProvider$$ExternalSyntheticLambda0;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;
 HSPLcom/android/server/wm/InsetsSourceProvider;->overridesFrame(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/wm/InsetsSourceProvider;->setClientVisible(Z)V
-HPLcom/android/server/wm/InsetsSourceProvider;->setServerVisible(Z)V
-HPLcom/android/server/wm/InsetsSourceProvider;->updateClientVisibility(Lcom/android/server/wm/InsetsControlTarget;)Z+]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;,Lcom/android/server/wm/InsetsPolicy$ControlTarget;,Lcom/android/server/wm/InsetsStateController$1;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;
-HPLcom/android/server/wm/InsetsSourceProvider;->updateControlForTarget(Lcom/android/server/wm/InsetsControlTarget;Z)V
-HPLcom/android/server/wm/InsetsSourceProvider;->updateSourceFrame(Landroid/graphics/Rect;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/internal/util/function/TriFunction;Lcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda0;,Lcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda12;,Lcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda11;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HPLcom/android/server/wm/InsetsSourceProvider;->setServerVisible(Z)V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;
+HPLcom/android/server/wm/InsetsSourceProvider;->updateClientVisibility(Lcom/android/server/wm/InsetsControlTarget;)Z+]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/InsetsPolicy$ControlTarget;,Lcom/android/server/wm/InsetsStateController$1;,Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;
+HPLcom/android/server/wm/InsetsSourceProvider;->updateControlForTarget(Lcom/android/server/wm/InsetsControlTarget;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/InsetsStateController$1;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;
+HPLcom/android/server/wm/InsetsSourceProvider;->updateSourceFrame(Landroid/graphics/Rect;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/internal/util/function/TriFunction;Lcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda0;,Lcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda11;,Lcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda12;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HPLcom/android/server/wm/InsetsSourceProvider;->updateSourceFrameForServerVisibility()V+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/InsetsSourceProvider;->updateVisibility()V+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;
 HPLcom/android/server/wm/InsetsStateController$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
-HPLcom/android/server/wm/InsetsStateController;->addToControlMaps(Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsSourceProvider;Z)V
-HSPLcom/android/server/wm/InsetsStateController;->getControlsForDispatch(Lcom/android/server/wm/InsetsControlTarget;)[Landroid/view/InsetsSourceControl;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/wm/InsetsStateController;->addToControlMaps(Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsSourceProvider;Z)V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/InsetsStateController;->getControlsForDispatch(Lcom/android/server/wm/InsetsControlTarget;)[Landroid/view/InsetsSourceControl;+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/wm/InsetsStateController;->getImeSourceProvider()Lcom/android/server/wm/ImeInsetsSourceProvider;+]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
 HSPLcom/android/server/wm/InsetsStateController;->getOrCreateSourceProvider(II)Lcom/android/server/wm/InsetsSourceProvider;+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/wm/InsetsStateController;->getRawInsetsState()Landroid/view/InsetsState;
-HPLcom/android/server/wm/InsetsStateController;->lambda$new$0(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/InsetsStateController;->lambda$notifyPendingInsetsControlChanged$3()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/InsetsPolicy$ControlTarget;,Lcom/android/server/wm/InsetsStateController$1;,Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/InsetsStateController;->notifyInsetsChanged()V
-HPLcom/android/server/wm/InsetsStateController;->notifyPendingInsetsControlChanged()V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HPLcom/android/server/wm/InsetsStateController;->onBarControlTargetChanged(Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;)V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
+HSPLcom/android/server/wm/InsetsStateController;->notifyPendingInsetsControlChanged()V+]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/wm/InsetsStateController;->onBarControlTargetChanged(Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;)V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
 HPLcom/android/server/wm/InsetsStateController;->onControlTargetChanged(Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsControlTarget;Z)V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
-HPLcom/android/server/wm/InsetsStateController;->onImeControlTargetChanged(Lcom/android/server/wm/InsetsControlTarget;)V
+HPLcom/android/server/wm/InsetsStateController;->onImeControlTargetChanged(Lcom/android/server/wm/InsetsControlTarget;)V+]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/InsetsStateController$1;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
 HSPLcom/android/server/wm/InsetsStateController;->onPostLayout()V+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
 HPLcom/android/server/wm/InsetsStateController;->onRequestedVisibleTypesChanged(Lcom/android/server/wm/InsetsControlTarget;)V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HPLcom/android/server/wm/InsetsStateController;->removeFromControlMaps(Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsSourceProvider;Z)V
-HPLcom/android/server/wm/InsetsStateController;->setForcedConsumingTypes(I)V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
-HSPLcom/android/server/wm/InsetsStateController;->updateAboveInsetsState(Z)V
-HSPLcom/android/server/wm/KeyguardController$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/wm/KeyguardController;)V
+HPLcom/android/server/wm/InsetsStateController;->removeFromControlMaps(Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsSourceProvider;Z)V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/InsetsStateController;->setForcedConsumingTypes(I)V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;
+HSPLcom/android/server/wm/InsetsStateController;->updateAboveInsetsState(Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Ljava/util/function/Consumer;Lcom/android/server/wm/InsetsStateController$$ExternalSyntheticLambda2;
 HSPLcom/android/server/wm/KeyguardController$KeyguardDisplayState$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z
-HSPLcom/android/server/wm/KeyguardController$KeyguardDisplayState;->$r8$lambda$UYxm3jSn5iwGFQ04QlWkFzJcydA(Lcom/android/server/wm/Task;)Z
 HSPLcom/android/server/wm/KeyguardController$KeyguardDisplayState;->-$$Nest$fgetmKeyguardGoingAway(Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;)Z
 HSPLcom/android/server/wm/KeyguardController$KeyguardDisplayState;->-$$Nest$fgetmKeyguardShowing(Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;)Z
-HSPLcom/android/server/wm/KeyguardController$KeyguardDisplayState;->-$$Nest$fgetmRequestDismissKeyguard(Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;)Z
 HSPLcom/android/server/wm/KeyguardController$KeyguardDisplayState;->getRootTaskForControllingOccluding(Lcom/android/server/wm/DisplayContent;)Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/KeyguardController$KeyguardDisplayState;->lambda$getRootTaskForControllingOccluding$0(Lcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/KeyguardController$KeyguardDisplayState;->updateVisibility(Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Landroid/os/PowerManager;Landroid/os/PowerManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
+HSPLcom/android/server/wm/KeyguardController$KeyguardDisplayState;->updateVisibility(Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Landroid/os/PowerManager;Landroid/os/PowerManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;
 HSPLcom/android/server/wm/KeyguardController;->-$$Nest$fgetmService(Lcom/android/server/wm/KeyguardController;)Lcom/android/server/wm/ActivityTaskManagerService;
-HSPLcom/android/server/wm/KeyguardController;->-$$Nest$fgetmWindowManager(Lcom/android/server/wm/KeyguardController;)Lcom/android/server/wm/WindowManagerService;
-HSPLcom/android/server/wm/KeyguardController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskSupervisor;)V
-HSPLcom/android/server/wm/KeyguardController;->checkKeyguardVisibility(Lcom/android/server/wm/ActivityRecord;)Z
+HSPLcom/android/server/wm/KeyguardController;->checkKeyguardVisibility(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/KeyguardController;->getDisplayState(I)Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/wm/KeyguardController;->isKeyguardGoingAway(I)Z
 HSPLcom/android/server/wm/KeyguardController;->isKeyguardLocked(I)Z+]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;
 HSPLcom/android/server/wm/KeyguardController;->isKeyguardOrAodShowing(I)Z
 HPLcom/android/server/wm/KeyguardController;->setKeyguardShown(IZZ)V
 HSPLcom/android/server/wm/KeyguardController;->updateVisibility()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;
-HSPLcom/android/server/wm/LaunchObserverRegistryImpl;-><init>(Landroid/os/Looper;)V
-HSPLcom/android/server/wm/LaunchParamsController$LaunchParams;-><init>()V
 HSPLcom/android/server/wm/LaunchParamsController$LaunchParams;->set(Lcom/android/server/wm/LaunchParamsController$LaunchParams;)V
-HSPLcom/android/server/wm/LaunchParamsController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/LaunchParamsPersister;)V
-HSPLcom/android/server/wm/LaunchParamsController;->calculate(Lcom/android/server/wm/Task;Landroid/content/pm/ActivityInfo$WindowLayout;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/wm/ActivityStarter$Request;ILcom/android/server/wm/LaunchParamsController$LaunchParams;)V
-HSPLcom/android/server/wm/LaunchParamsController;->registerDefaultModifiers(Lcom/android/server/wm/ActivityTaskSupervisor;)V
-HSPLcom/android/server/wm/LaunchParamsController;->registerModifier(Lcom/android/server/wm/LaunchParamsController$LaunchParamsModifier;)V
-HSPLcom/android/server/wm/LaunchParamsPersister$$ExternalSyntheticLambda2;-><init>()V
-HSPLcom/android/server/wm/LaunchParamsPersister;-><init>(Lcom/android/server/wm/PersisterQueue;Lcom/android/server/wm/ActivityTaskSupervisor;)V
-HSPLcom/android/server/wm/LaunchParamsPersister;-><init>(Lcom/android/server/wm/PersisterQueue;Lcom/android/server/wm/ActivityTaskSupervisor;Ljava/util/function/IntFunction;)V
+HSPLcom/android/server/wm/LaunchParamsController;->calculate(Lcom/android/server/wm/Task;Landroid/content/pm/ActivityInfo$WindowLayout;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/wm/ActivityStarter$Request;ILcom/android/server/wm/LaunchParamsController$LaunchParams;)V+]Lcom/android/server/wm/LaunchParamsPersister;Lcom/android/server/wm/LaunchParamsPersister;]Lcom/android/server/wm/LaunchParamsController$LaunchParamsModifier;Lcom/android/server/wm/DesktopModeLaunchParamsModifier;,Lcom/android/server/wm/TaskLaunchParamsModifier;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/wm/LaunchParamsController$LaunchParams;Lcom/android/server/wm/LaunchParamsController$LaunchParams;
 HSPLcom/android/server/wm/LaunchParamsUtil;->adjustBoundsToFitInDisplayArea(Lcom/android/server/wm/TaskDisplayArea;ILandroid/content/pm/ActivityInfo$WindowLayout;Landroid/graphics/Rect;)V
 HSPLcom/android/server/wm/LaunchParamsUtil;->getDefaultFreeformSize(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/TaskDisplayArea;Landroid/content/pm/ActivityInfo$WindowLayout;ILandroid/graphics/Rect;)Landroid/util/Size;
-HPLcom/android/server/wm/LegacyTransitionTracer;->dumpTransitionTargetsToProto(Landroid/util/proto/ProtoOutputStream;Lcom/android/server/wm/Transition;Ljava/util/ArrayList;)V
-HPLcom/android/server/wm/LegacyTransitionTracer;->logFinishedTransition(Lcom/android/server/wm/Transition;)V
+HPLcom/android/server/wm/LegacyTransitionTracer;->dumpTransitionTargetsToProto(Landroid/util/proto/ProtoOutputStream;Lcom/android/server/wm/Transition;Ljava/util/ArrayList;)V+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/LegacyTransitionTracer;->logFinishedTransition(Lcom/android/server/wm/Transition;)V
 HPLcom/android/server/wm/LegacyTransitionTracer;->logSentTransition(Lcom/android/server/wm/Transition;Ljava/util/ArrayList;)V
-HPLcom/android/server/wm/Letterbox$LetterboxSurface;->layout(IIIILandroid/graphics/Point;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HPLcom/android/server/wm/Letterbox$LetterboxSurface;->needsApplySurfaceChanges()Z
-HPLcom/android/server/wm/Letterbox;->layout(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Point;)V
-HPLcom/android/server/wm/LetterboxConfiguration;->getDefaultLetterboxBackgroundType()I+]Lcom/android/server/wm/SynchedDeviceConfig;Lcom/android/server/wm/SynchedDeviceConfig;
-HPLcom/android/server/wm/LetterboxConfiguration;->getIsEducationEnabled()Z
+HPLcom/android/server/wm/Letterbox;->layout(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Point;)V+]Lcom/android/server/wm/Letterbox$LetterboxSurface;Lcom/android/server/wm/Letterbox$LetterboxSurface;
+HSPLcom/android/server/wm/LetterboxConfiguration;->getDefaultLetterboxBackgroundType()I+]Lcom/android/server/wm/SynchedDeviceConfig;Lcom/android/server/wm/SynchedDeviceConfig;
 HSPLcom/android/server/wm/LetterboxConfiguration;->getIsHorizontalReachabilityEnabled()Z
 HSPLcom/android/server/wm/LetterboxConfiguration;->getIsVerticalReachabilityEnabled()Z
-HPLcom/android/server/wm/LetterboxConfiguration;->getLetterboxBackgroundType()I+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;
+HSPLcom/android/server/wm/LetterboxConfiguration;->getLetterboxBackgroundType()I+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;
 HSPLcom/android/server/wm/LetterboxConfiguration;->isUserAppAspectRatioFullscreenEnabled()Z+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Lcom/android/server/wm/SynchedDeviceConfig;Lcom/android/server/wm/SynchedDeviceConfig;
 HSPLcom/android/server/wm/LetterboxConfiguration;->isUserAppAspectRatioSettingsEnabled()Z+]Lcom/android/server/wm/SynchedDeviceConfig;Lcom/android/server/wm/SynchedDeviceConfig;
 HSPLcom/android/server/wm/LetterboxUiController;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/LetterboxUiController;->findOpaqueNotFinishingActivityBelow()Ljava/util/Optional;
-HPLcom/android/server/wm/LetterboxUiController;->getCropBoundsIfNeeded(Lcom/android/server/wm/WindowState;)Landroid/graphics/Rect;+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/LetterboxUiController;->getLetterboxDetails()Lcom/android/internal/statusbar/LetterboxDetails;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/LetterboxUiController;->getLetterboxInnerBounds(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/Letterbox;Lcom/android/server/wm/Letterbox;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/LetterboxUiController;->getRoundedCornersRadius(Lcom/android/server/wm/WindowState;)I+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HSPLcom/android/server/wm/LetterboxUiController;->getUserMinAspectRatioOverrideCode()I+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
+HSPLcom/android/server/wm/LetterboxUiController;->getCropBoundsIfNeeded(Lcom/android/server/wm/WindowState;)Landroid/graphics/Rect;+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/LetterboxUiController;->getLetterboxDetails()Lcom/android/internal/statusbar/LetterboxDetails;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/LetterboxUiController;->getLetterboxInnerBounds(Landroid/graphics/Rect;)V+]Lcom/android/server/wm/Letterbox;Lcom/android/server/wm/Letterbox;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/LetterboxUiController;->getRoundedCornersRadius(Lcom/android/server/wm/WindowState;)I+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/LetterboxUiController;->hasInheritedLetterboxBehavior()Z
-HPLcom/android/server/wm/LetterboxUiController;->hasWallpaperBackgroundForLetterbox()Z
 HSPLcom/android/server/wm/LetterboxUiController;->isFromDoubleTap()Z
-HPLcom/android/server/wm/LetterboxUiController;->isFullyTransparentBarAllowed(Landroid/graphics/Rect;)Z
-HSPLcom/android/server/wm/LetterboxUiController;->isHorizontalReachabilityEnabled()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
+HPLcom/android/server/wm/LetterboxUiController;->isFullyTransparentBarAllowed(Landroid/graphics/Rect;)Z+]Lcom/android/server/wm/Letterbox;Lcom/android/server/wm/Letterbox;
+HSPLcom/android/server/wm/LetterboxUiController;->isHorizontalReachabilityEnabled()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
 HSPLcom/android/server/wm/LetterboxUiController;->isHorizontalReachabilityEnabled(Landroid/content/res/Configuration;)Z+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
 HSPLcom/android/server/wm/LetterboxUiController;->isLetterboxDoubleTapEducationEnabled()Z+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
-HPLcom/android/server/wm/LetterboxUiController;->isLetterboxedNotForDisplayCutout(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
-HPLcom/android/server/wm/LetterboxUiController;->isSurfaceVisible(Lcom/android/server/wm/WindowState;)Z
+HSPLcom/android/server/wm/LetterboxUiController;->isLetterboxedNotForDisplayCutout(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
+HSPLcom/android/server/wm/LetterboxUiController;->isSurfaceVisible(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/LetterboxUiController;->isSystemOverrideToFullscreenEnabled()Z
 HSPLcom/android/server/wm/LetterboxUiController;->isUserFullscreenOverrideEnabled()Z+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Ljava/lang/Object;Ljava/lang/Boolean;
-HSPLcom/android/server/wm/LetterboxUiController;->isVerticalReachabilityEnabled()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/LetterboxUiController;->isVerticalReachabilityEnabled()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
 HSPLcom/android/server/wm/LetterboxUiController;->isVerticalReachabilityEnabled(Landroid/content/res/Configuration;)Z+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HPLcom/android/server/wm/LetterboxUiController;->layoutLetterboxIfNeeded(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/Letterbox;Lcom/android/server/wm/Letterbox;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/LetterboxUiController;->layoutLetterboxIfNeeded(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/Letterbox;Lcom/android/server/wm/Letterbox;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/LetterboxUiController;->overrideOrientationIfNeeded(I)I+]Ljava/lang/Object;Ljava/lang/Boolean;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HPLcom/android/server/wm/LetterboxUiController;->requiresRoundedCorners(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;
-HSPLcom/android/server/wm/LetterboxUiController;->shouldApplyUserFullscreenOverride()Z+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
+HSPLcom/android/server/wm/LetterboxUiController;->requiresRoundedCorners(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;
+HSPLcom/android/server/wm/LetterboxUiController;->shouldApplyUserFullscreenOverride()Z+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Ljava/lang/Object;Ljava/lang/Boolean;
 HSPLcom/android/server/wm/LetterboxUiController;->shouldApplyUserMinAspectRatioOverride()Z+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
 HSPLcom/android/server/wm/LetterboxUiController;->shouldEnableUserAspectRatioSettings()Z+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Ljava/lang/Object;Ljava/lang/Boolean;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;
-HSPLcom/android/server/wm/LetterboxUiController;->shouldEnableWithOptInOverrideAndOptOutProperty(Ljava/util/function/BooleanSupplier;ZLjava/lang/Boolean;)Z+]Ljava/util/function/BooleanSupplier;megamorphic_types]Ljava/lang/Object;Ljava/lang/Boolean;
-HPLcom/android/server/wm/LetterboxUiController;->shouldNotLayoutLetterbox(Lcom/android/server/wm/WindowState;)Z
+HSPLcom/android/server/wm/LetterboxUiController;->shouldNotLayoutLetterbox(Lcom/android/server/wm/WindowState;)Z
 HSPLcom/android/server/wm/LetterboxUiController;->shouldOverrideForceNonResizeApp()Z
 HSPLcom/android/server/wm/LetterboxUiController;->shouldOverrideForceResizeApp()Z
-HSPLcom/android/server/wm/LetterboxUiController;->shouldOverrideMinAspectRatio()Z
-HPLcom/android/server/wm/LetterboxUiController;->shouldShowLetterboxUi(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/LetterboxUiController;->updateLetterboxSurfaceIfNeeded(Lcom/android/server/wm/WindowState;)V
-HPLcom/android/server/wm/LetterboxUiController;->updateLetterboxSurfaceIfNeeded(Lcom/android/server/wm/WindowState;Landroid/view/SurfaceControl$Transaction;)V
-HPLcom/android/server/wm/LetterboxUiController;->updateRoundedCornersIfNeeded(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/ActivityRecord;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
-HPLcom/android/server/wm/LetterboxUiController;->updateWallpaperForLetterbox(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;
-HSPLcom/android/server/wm/LockTaskController$LockTaskToken;-><init>()V
-HSPLcom/android/server/wm/LockTaskController$LockTaskToken;-><init>(Lcom/android/server/wm/LockTaskController$LockTaskToken-IA;)V
-HSPLcom/android/server/wm/LockTaskController;-><clinit>()V
-HSPLcom/android/server/wm/LockTaskController;-><init>(Landroid/content/Context;Lcom/android/server/wm/ActivityTaskSupervisor;Landroid/os/Handler;Lcom/android/server/wm/TaskChangeNotificationController;)V
-HSPLcom/android/server/wm/MirrorActiveUids;-><init>()V
+HSPLcom/android/server/wm/LetterboxUiController;->shouldShowLetterboxUi(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/LetterboxUiController;->updateLetterboxSurfaceIfNeeded(Lcom/android/server/wm/WindowState;)V
+HSPLcom/android/server/wm/LetterboxUiController;->updateLetterboxSurfaceIfNeeded(Lcom/android/server/wm/WindowState;Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/Letterbox;Lcom/android/server/wm/Letterbox;
+HSPLcom/android/server/wm/LetterboxUiController;->updateRoundedCornersIfNeeded(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/ActivityRecord;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
+HSPLcom/android/server/wm/LetterboxUiController;->updateWallpaperForLetterbox(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;
 HSPLcom/android/server/wm/MirrorActiveUids;->hasNonAppVisibleWindow(I)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HSPLcom/android/server/wm/MirrorActiveUids;->onNonAppSurfaceVisibilityChanged(IZ)V
+HSPLcom/android/server/wm/MirrorActiveUids;->onNonAppSurfaceVisibilityChanged(IZ)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
 HSPLcom/android/server/wm/MirrorActiveUids;->onUidProcStateChanged(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;
-HSPLcom/android/server/wm/PackageConfigPersister;-><clinit>()V
-HSPLcom/android/server/wm/PackageConfigPersister;-><init>(Lcom/android/server/wm/PersisterQueue;Lcom/android/server/wm/ActivityTaskManagerService;)V
 HPLcom/android/server/wm/PackageConfigPersister;->findPackageConfiguration(Ljava/lang/String;I)Lcom/android/server/wm/ActivityTaskManagerInternal$PackageConfig;
-HSPLcom/android/server/wm/PackageConfigPersister;->findRecord(Landroid/util/SparseArray;Ljava/lang/String;I)Lcom/android/server/wm/PackageConfigPersister$PackageConfigRecord;
+HSPLcom/android/server/wm/PackageConfigPersister;->findRecord(Landroid/util/SparseArray;Ljava/lang/String;I)Lcom/android/server/wm/PackageConfigPersister$PackageConfigRecord;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/HashMap;Ljava/util/HashMap;
 HSPLcom/android/server/wm/PackageConfigPersister;->updateConfigIfNeeded(Lcom/android/server/wm/ConfigurationContainer;ILjava/lang/String;)V
-HSPLcom/android/server/wm/PendingRemoteAnimationRegistry;-><init>(Lcom/android/server/wm/WindowManagerGlobalLock;Landroid/os/Handler;)V
-HSPLcom/android/server/wm/PersisterQueue$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/wm/PersisterQueue$LazyTaskWriterThread;-><init>(Lcom/android/server/wm/PersisterQueue;Ljava/lang/String;)V
-HSPLcom/android/server/wm/PersisterQueue$LazyTaskWriterThread;-><init>(Lcom/android/server/wm/PersisterQueue;Ljava/lang/String;Lcom/android/server/wm/PersisterQueue$LazyTaskWriterThread-IA;)V
 HSPLcom/android/server/wm/PersisterQueue$LazyTaskWriterThread;->run()V
-HSPLcom/android/server/wm/PersisterQueue;-><clinit>()V
-HSPLcom/android/server/wm/PersisterQueue;-><init>()V
-HSPLcom/android/server/wm/PersisterQueue;-><init>(JJ)V
-HSPLcom/android/server/wm/PersisterQueue;->addListener(Lcom/android/server/wm/PersisterQueue$Listener;)V
-HSPLcom/android/server/wm/PersisterQueue;->processNextItem()V
-HPLcom/android/server/wm/PointerEventDispatcher;->onInputEvent(Landroid/view/InputEvent;)V+]Landroid/view/InputEventReceiver;Lcom/android/server/wm/PointerEventDispatcher;]Landroid/view/WindowManagerPolicyConstants$PointerEventListener;Lcom/android/server/wm/TaskTapPointerEventListener;,Lcom/android/server/wm/RecentTasks$1;,Lcom/android/server/wm/SystemGesturesPointerEventListener;,Lcom/android/internal/widget/PointerLocationView;]Landroid/view/InputEvent;Landroid/view/MotionEvent;
-HSPLcom/android/server/wm/RecentTasks$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/wm/RecentTasks$$ExternalSyntheticLambda1;-><init>(Lcom/android/server/wm/RecentTasks;)V
-HSPLcom/android/server/wm/RecentTasks$1;-><init>(Lcom/android/server/wm/RecentTasks;)V
+HSPLcom/android/server/wm/PersisterQueue;->processNextItem()V+]Ljava/lang/Thread;Lcom/android/server/wm/PersisterQueue$LazyTaskWriterThread;]Lcom/android/server/wm/PersisterQueue$WriteQueueItem;Lcom/android/server/wm/TaskPersister$ImageWriteQueueItem;,Lcom/android/server/wm/TaskPersister$TaskWriteQueueItem;,Lcom/android/server/wm/PersisterQueue$$ExternalSyntheticLambda0;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HPLcom/android/server/wm/PointerEventDispatcher;->onInputEvent(Landroid/view/InputEvent;)V+]Landroid/view/InputEventReceiver;Lcom/android/server/wm/PointerEventDispatcher;]Landroid/view/WindowManagerPolicyConstants$PointerEventListener;Lcom/android/server/wm/TaskTapPointerEventListener;,Lcom/android/server/wm/RecentTasks$1;,Lcom/android/server/wm/SystemGesturesPointerEventListener;,Lcom/android/internal/widget/PointerLocationView;,Lcom/android/server/wm/WindowManagerService$MousePositionTracker;]Landroid/view/InputEvent;Landroid/view/MotionEvent;
 HPLcom/android/server/wm/RecentTasks$1;->onPointerEvent(Landroid/view/MotionEvent;)V+]Landroid/os/Handler;Lcom/android/server/wm/ActivityTaskManagerService$H;]Lcom/android/internal/util/function/pooled/PooledRunnable;Lcom/android/internal/util/function/pooled/PooledLambdaImpl;]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
 HPLcom/android/server/wm/RecentTasks;->-$$Nest$fgetmFreezeTaskListReordering(Lcom/android/server/wm/RecentTasks;)Z
-HSPLcom/android/server/wm/RecentTasks;-><clinit>()V
-HSPLcom/android/server/wm/RecentTasks;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskSupervisor;)V
-HSPLcom/android/server/wm/RecentTasks;->add(Lcom/android/server/wm/Task;)V
-HPLcom/android/server/wm/RecentTasks;->createRecentTaskInfo(Lcom/android/server/wm/Task;ZZ)Landroid/app/ActivityManager$RecentTaskInfo;
-HPLcom/android/server/wm/RecentTasks;->getRecentTasksImpl(IIZII)Ljava/util/ArrayList;
+HSPLcom/android/server/wm/RecentTasks;->add(Lcom/android/server/wm/Task;)V+]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController;
+HPLcom/android/server/wm/RecentTasks;->createRecentTaskInfo(Lcom/android/server/wm/Task;ZZ)Landroid/app/ActivityManager$RecentTaskInfo;+]Landroid/app/ActivityManager$RecentTaskInfo$PersistedTaskSnapshotData;Landroid/app/ActivityManager$RecentTaskInfo$PersistedTaskSnapshotData;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HPLcom/android/server/wm/RecentTasks;->getRecentTasksImpl(IIZII)Ljava/util/ArrayList;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Set;Landroid/util/ArraySet;
 HSPLcom/android/server/wm/RecentTasks;->isCallerRecents(I)Z
-HPLcom/android/server/wm/RecentTasks;->isVisibleRecentTask(Lcom/android/server/wm/Task;)Z
-HSPLcom/android/server/wm/RecentTasks;->loadParametersFromResources(Landroid/content/res/Resources;)V
-HSPLcom/android/server/wm/RecentTasks;->registerCallback(Lcom/android/server/wm/RecentTasks$Callbacks;)V
-HPLcom/android/server/wm/RecentTasks;->syncPersistentTaskIdsLocked()V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/RecentTasks;->isVisibleRecentTask(Lcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/LockTaskController;Lcom/android/server/wm/LockTaskController;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HPLcom/android/server/wm/RecentTasks;->syncPersistentTaskIdsLocked()V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;
 HSPLcom/android/server/wm/RefreshRatePolicy$FrameRateVote;->refreshRateEquals(F)Z
 HSPLcom/android/server/wm/RefreshRatePolicy$FrameRateVote;->reset()Z+]Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote;Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote;
 HSPLcom/android/server/wm/RefreshRatePolicy$FrameRateVote;->update(FII)Z+]Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote;Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote;
 HSPLcom/android/server/wm/RefreshRatePolicy$PackageRefreshRate;->get(Ljava/lang/String;)Landroid/view/SurfaceControl$RefreshRateRange;+]Ljava/util/HashMap;Ljava/util/HashMap;
-HSPLcom/android/server/wm/RefreshRatePolicy;->calculatePriority(Lcom/android/server/wm/WindowState;)I
+HSPLcom/android/server/wm/RefreshRatePolicy;->calculatePriority(Lcom/android/server/wm/WindowState;)I+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/RefreshRatePolicy;Lcom/android/server/wm/RefreshRatePolicy;
 HSPLcom/android/server/wm/RefreshRatePolicy;->getPreferredMaxRefreshRate(Lcom/android/server/wm/WindowState;)F+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/RefreshRatePolicy$PackageRefreshRate;Lcom/android/server/wm/RefreshRatePolicy$PackageRefreshRate;
 HSPLcom/android/server/wm/RefreshRatePolicy;->getPreferredMinRefreshRate(Lcom/android/server/wm/WindowState;)F+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/RefreshRatePolicy$PackageRefreshRate;Lcom/android/server/wm/RefreshRatePolicy$PackageRefreshRate;
 HSPLcom/android/server/wm/RefreshRatePolicy;->getPreferredModeId(Lcom/android/server/wm/WindowState;)I+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;
 HSPLcom/android/server/wm/RefreshRatePolicy;->updateFrameRateVote(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/HighRefreshRateDenylist;Lcom/android/server/wm/HighRefreshRateDenylist;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote;Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote;]Landroid/view/Display$Mode;Landroid/view/Display$Mode;
-HPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda16;-><init>(Lcom/android/server/wm/Task;[Z[I)V
+HSPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda13;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda16;->test(Ljava/lang/Object;)Z
-HPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda17;-><init>([ILandroid/app/ActivityTaskManager$RootTaskInfo;)V
 HPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda17;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda18;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda26;-><init>(Lcom/android/server/policy/PermissionPolicyInternal;ILjava/lang/String;[I)V
 HSPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda26;->test(Ljava/lang/Object;)Z
-HSPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda28;-><init>()V
 HSPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda28;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda29;-><init>(Lcom/android/server/wm/Task;[ZZLandroid/app/ActivityOptions;Lcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda29;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda34;->apply(Ljava/lang/Object;)Z
+HSPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda49;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda6;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wm/RootWindowContainer$AttachApplicationHelper;->accept(Lcom/android/server/wm/Task;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/RootWindowContainer$AttachApplicationHelper;->process(Lcom/android/server/wm/WindowProcessController;)Z
+HSPLcom/android/server/wm/RootWindowContainer$AttachApplicationHelper;->process(Lcom/android/server/wm/WindowProcessController;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/RootWindowContainer$AttachApplicationHelper;->reset()V
-HSPLcom/android/server/wm/RootWindowContainer$AttachApplicationHelper;->test(Lcom/android/server/wm/ActivityRecord;)Z
-HSPLcom/android/server/wm/RootWindowContainer$FindTaskResult;->test(Lcom/android/server/wm/Task;)Z
+HSPLcom/android/server/wm/RootWindowContainer$AttachApplicationHelper;->test(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
+HSPLcom/android/server/wm/RootWindowContainer$FindTaskResult;->test(Lcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/wm/RootWindowContainer$MyHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Ljava/lang/Long;Ljava/lang/Long;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/RootWindowContainer;->$r8$lambda$cnDv250HlSET-GBlf9zK0KW0JGk(Lcom/android/server/wm/DisplayContent;)V
-HSPLcom/android/server/wm/RootWindowContainer;->allPausedActivitiesComplete()Z
-HPLcom/android/server/wm/RootWindowContainer;->allResumedActivitiesIdle()Z
-HSPLcom/android/server/wm/RootWindowContainer;->anyTaskForId(II)Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/RootWindowContainer;->anyTaskForId(IILandroid/app/ActivityOptions;Z)Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/RootWindowContainer;->allPausedActivitiesComplete()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HSPLcom/android/server/wm/RootWindowContainer;->allResumedActivitiesIdle()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/RootWindowContainer;->anyTaskForId(II)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HSPLcom/android/server/wm/RootWindowContainer;->anyTaskForId(IILandroid/app/ActivityOptions;Z)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/internal/util/function/pooled/PooledPredicate;Lcom/android/internal/util/function/pooled/PooledLambdaImpl;]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/RootWindowContainer;->applySleepTokens(Z)V
 HSPLcom/android/server/wm/RootWindowContainer;->applySurfaceChangesTransaction()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HSPLcom/android/server/wm/RootWindowContainer;->attachApplication(Lcom/android/server/wm/WindowProcessController;)Z
-HSPLcom/android/server/wm/RootWindowContainer;->checkAppTransitionReady(Lcom/android/server/wm/WindowSurfacePlacer;)V+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;
+HSPLcom/android/server/wm/RootWindowContainer;->attachApplication(Lcom/android/server/wm/WindowProcessController;)Z+]Lcom/android/server/wm/RootWindowContainer$AttachApplicationHelper;Lcom/android/server/wm/RootWindowContainer$AttachApplicationHelper;
+HSPLcom/android/server/wm/RootWindowContainer;->checkAppTransitionReady(Lcom/android/server/wm/WindowSurfacePlacer;)V+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/AppTransitionController;Lcom/android/server/wm/AppTransitionController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/RootWindowContainer;->clearDisplayInfoCaches(I)V
-HSPLcom/android/server/wm/RootWindowContainer;->clearFrameChangingWindows()V
+HSPLcom/android/server/wm/RootWindowContainer;->clearFrameChangingWindows()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/RootWindowContainer;->copyAnimToLayoutParams()Z
+HSPLcom/android/server/wm/RootWindowContainer;->ensureActivitiesVisible(Lcom/android/server/wm/ActivityRecord;)V+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/RootWindowContainer;->ensureActivitiesVisible(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/RootWindowContainer;->forAllDisplays(Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/RootWindowContainer;->getDisplayContent(I)Lcom/android/server/wm/DisplayContent;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;
-HPLcom/android/server/wm/RootWindowContainer;->getRootTask(I)Lcom/android/server/wm/Task;
-HPLcom/android/server/wm/RootWindowContainer;->getRootTaskInfo(Lcom/android/server/wm/Task;)Landroid/app/ActivityTaskManager$RootTaskInfo;
+HPLcom/android/server/wm/RootWindowContainer;->getRootTask(I)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/RootWindowContainer;->getRootTaskInfo(Lcom/android/server/wm/Task;)Landroid/app/ActivityTaskManager$RootTaskInfo;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/wm/RootWindowContainer;->getRunningTasks(ILjava/util/List;IILandroid/util/ArraySet;I)V+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/RunningTasks;Lcom/android/server/wm/RunningTasks;
-HSPLcom/android/server/wm/RootWindowContainer;->getTaskToShowPermissionDialogOn(Ljava/lang/String;I)I
-HSPLcom/android/server/wm/RootWindowContainer;->getTopDisplayFocusedRootTask()Lcom/android/server/wm/Task;
-HPLcom/android/server/wm/RootWindowContainer;->getTopResumedActivity()Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/RootWindowContainer;->getWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/WindowToken;
+HSPLcom/android/server/wm/RootWindowContainer;->getTaskToShowPermissionDialogOn(Ljava/lang/String;I)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
+HSPLcom/android/server/wm/RootWindowContainer;->getTopDisplayFocusedRootTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/RootWindowContainer;->getTopResumedActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HSPLcom/android/server/wm/RootWindowContainer;->getWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/WindowToken;+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/RootWindowContainer;->handleNotObscuredLocked(Lcom/android/server/wm/WindowState;ZZ)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/RootWindowContainer;->handleResizingWindows()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/RootWindowContainer;->hasPendingLayoutChanges(Lcom/android/server/wm/WindowAnimator;)Z+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HSPLcom/android/server/wm/RootWindowContainer;->isLayoutNeeded()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HPLcom/android/server/wm/RootWindowContainer;->lambda$getRootTaskInfo$22([ILandroid/app/ActivityTaskManager$RootTaskInfo;Lcom/android/server/wm/Task;)V
-HSPLcom/android/server/wm/RootWindowContainer;->lambda$getTaskToShowPermissionDialogOn$43(Lcom/android/server/policy/PermissionPolicyInternal;ILjava/lang/String;[ILcom/android/server/wm/TaskFragment;)Z+]Lcom/android/server/policy/PermissionPolicyInternal;Lcom/android/server/policy/PermissionPolicyService$Internal;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/RootWindowContainer;->isLayoutNeeded()Z+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/RootWindowContainer;->lambda$getRootTaskInfo$22([ILandroid/app/ActivityTaskManager$RootTaskInfo;Lcom/android/server/wm/Task;)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/RootWindowContainer;->lambda$getTaskToShowPermissionDialogOn$42(Lcom/android/server/policy/PermissionPolicyInternal;Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/policy/PermissionPolicyInternal;Lcom/android/server/policy/PermissionPolicyService$Internal;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/RootWindowContainer;->lambda$getTaskToShowPermissionDialogOn$43(Lcom/android/server/policy/PermissionPolicyInternal;ILjava/lang/String;[ILcom/android/server/wm/TaskFragment;)Z+]Lcom/android/server/policy/PermissionPolicyInternal;Lcom/android/server/policy/PermissionPolicyService$Internal;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/RootWindowContainer;->lambda$performSurfacePlacementNoTrace$7(Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;
-HPLcom/android/server/wm/RootWindowContainer;->lambda$rankTaskLayers$29(Lcom/android/server/wm/Task;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/RootWindowContainer;->lambda$rankTaskLayers$29(Lcom/android/server/wm/Task;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/RootWindowContainer;->lambda$resumeFocusedTasksTopActivities$17(Lcom/android/server/wm/Task;[ZZLandroid/app/ActivityOptions;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/Task;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/RootWindowContainer;->lambda$updateDisplayImePolicyCache$26(Landroid/util/ArrayMap;Lcom/android/server/wm/DisplayContent;)V
-HSPLcom/android/server/wm/RootWindowContainer;->onDisplayChanged(I)V
+HSPLcom/android/server/wm/RootWindowContainer;->lambda$updateDisplayImePolicyCache$26(Landroid/util/ArrayMap;Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/RootWindowContainer;->onDisplayChanged(I)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacement()V+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
-HSPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacementNoTrace()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Landroid/os/Handler;Lcom/android/server/wm/RootWindowContainer$MyHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/TaskFragmentOrganizerController;Lcom/android/server/wm/TaskFragmentOrganizerController;]Lcom/android/server/wm/TaskOrganizerController;Lcom/android/server/wm/TaskOrganizerController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/BLASTSyncEngine;Lcom/android/server/wm/BLASTSyncEngine;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;,Ljava/util/ArrayList;
-HPLcom/android/server/wm/RootWindowContainer;->rankTaskLayers()V
+HSPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacementNoTrace()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Landroid/os/Handler;Lcom/android/server/wm/RootWindowContainer$MyHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/TaskFragmentOrganizerController;Lcom/android/server/wm/TaskFragmentOrganizerController;]Lcom/android/server/wm/TaskOrganizerController;Lcom/android/server/wm/TaskOrganizerController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/BLASTSyncEngine;Lcom/android/server/wm/BLASTSyncEngine;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;,Ljava/util/ArrayList;]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator;
+HSPLcom/android/server/wm/RootWindowContainer;->rankTaskLayers()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
 HPLcom/android/server/wm/RootWindowContainer;->removeSleepToken(Lcom/android/server/wm/RootWindowContainer$SleepToken;)V
-HSPLcom/android/server/wm/RootWindowContainer;->resumeFocusedTasksTopActivities(Lcom/android/server/wm/Task;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Z)Z
-HSPLcom/android/server/wm/RootWindowContainer;->updateDisplayImePolicyCache()V
-HSPLcom/android/server/wm/RootWindowContainer;->updateFocusedWindowLocked(IZ)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/RootWindowContainer;->resumeFocusedTasksTopActivities(Lcom/android/server/wm/Task;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Z)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HSPLcom/android/server/wm/RootWindowContainer;->updateDisplayImePolicyCache()V+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HSPLcom/android/server/wm/RootWindowContainer;->updateFocusedWindowLocked(IZ)Z+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/wm/RootWindowContainer;->updateUIDsPresentOnDisplay()V
-HSPLcom/android/server/wm/RunningTasks;-><init>()V
-HSPLcom/android/server/wm/RunningTasks;->accept(Lcom/android/server/wm/Task;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/wm/RunningTasks;->createRunningTaskInfo(Lcom/android/server/wm/Task;J)Landroid/app/ActivityManager$RunningTaskInfo;
-HSPLcom/android/server/wm/RunningTasks;->getTasks(ILjava/util/List;ILcom/android/server/wm/RecentTasks;Lcom/android/server/wm/WindowContainer;ILandroid/util/ArraySet;)V+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/RunningTasks;Lcom/android/server/wm/RunningTasks;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
-HSPLcom/android/server/wm/RunningTasks;->lambda$getTasks$0(Lcom/android/server/wm/DisplayContent;)V
+HSPLcom/android/server/wm/RunningTasks$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V
+HSPLcom/android/server/wm/RunningTasks;->accept(Lcom/android/server/wm/Task;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/util/ArraySet;Landroid/util/ArraySet;
+HSPLcom/android/server/wm/RunningTasks;->createRunningTaskInfo(Lcom/android/server/wm/Task;J)Landroid/app/ActivityManager$RunningTaskInfo;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/RunningTasks;->getTasks(ILjava/util/List;ILcom/android/server/wm/RecentTasks;Lcom/android/server/wm/WindowContainer;ILandroid/util/ArraySet;)V+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/RunningTasks;Lcom/android/server/wm/RunningTasks;
+HSPLcom/android/server/wm/RunningTasks;->lambda$getTasks$0(Lcom/android/server/wm/DisplayContent;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/SafeActivityOptions;-><init>(Landroid/app/ActivityOptions;)V
 HPLcom/android/server/wm/SafeActivityOptions;->setCallerOptions(Landroid/app/ActivityOptions;)V
 HPLcom/android/server/wm/Session$$ExternalSyntheticLambda1;-><init>(F)V
 HPLcom/android/server/wm/Session$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
-HPLcom/android/server/wm/Session;->$r8$lambda$KGk0Cvr6TVDYTfgJBINwLdTdv1c(FLcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WindowState;)V
 HSPLcom/android/server/wm/Session;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/view/IWindowSessionCallback;II)V
-HPLcom/android/server/wm/Session;->actionOnWallpaper(Landroid/os/IBinder;Ljava/util/function/BiConsumer;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Ljava/util/function/BiConsumer;Lcom/android/server/wm/Session$$ExternalSyntheticLambda5;,Lcom/android/server/wm/Session$$ExternalSyntheticLambda1;,Lcom/android/server/wm/Session$$ExternalSyntheticLambda3;
-HSPLcom/android/server/wm/Session;->finishDrawing(Landroid/view/IWindow;Landroid/view/SurfaceControl$Transaction;I)V
-HPLcom/android/server/wm/Session;->lambda$setWallpaperZoomOut$1(FLcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WindowState;)V
-HPLcom/android/server/wm/Session;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V
+HSPLcom/android/server/wm/Session;->actionOnWallpaper(Landroid/os/IBinder;Ljava/util/function/BiConsumer;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Ljava/util/function/BiConsumer;Lcom/android/server/wm/Session$$ExternalSyntheticLambda5;,Lcom/android/server/wm/Session$$ExternalSyntheticLambda1;,Lcom/android/server/wm/Session$$ExternalSyntheticLambda3;
+HSPLcom/android/server/wm/Session;->finishDrawing(Landroid/view/IWindow;Landroid/view/SurfaceControl$Transaction;I)V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
+HPLcom/android/server/wm/Session;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
 HSPLcom/android/server/wm/Session;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HSPLcom/android/server/wm/Session;->onWindowAdded(Lcom/android/server/wm/WindowState;)V
-HSPLcom/android/server/wm/Session;->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
-HPLcom/android/server/wm/Session;->reportSystemGestureExclusionChanged(Landroid/view/IWindow;Ljava/util/List;)V
-HSPLcom/android/server/wm/Session;->setInsets(Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
-HSPLcom/android/server/wm/Session;->setOnBackInvokedCallbackInfo(Landroid/view/IWindow;Landroid/window/OnBackInvokedCallbackInfo;)V
+HSPLcom/android/server/wm/Session;->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+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
+HPLcom/android/server/wm/Session;->reportSystemGestureExclusionChanged(Landroid/view/IWindow;Ljava/util/List;)V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
+HSPLcom/android/server/wm/Session;->setInsets(Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
+HSPLcom/android/server/wm/Session;->setOnBackInvokedCallbackInfo(Landroid/view/IWindow;Landroid/window/OnBackInvokedCallbackInfo;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/Session;->setWallpaperZoomOut(Landroid/os/IBinder;F)V+]Lcom/android/server/wm/Session;Lcom/android/server/wm/Session;
 HPLcom/android/server/wm/Session;->updateRequestedVisibleTypes(Landroid/view/IWindow;I)V
-HPLcom/android/server/wm/SmoothDimmer$DimState;->adjustSurfaceLayout(Landroid/view/SurfaceControl$Transaction;)V
+HPLcom/android/server/wm/SmoothDimmer$DimState;->adjustSurfaceLayout(Landroid/view/SurfaceControl$Transaction;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
 HSPLcom/android/server/wm/SmoothDimmer;->getDimBounds()Landroid/graphics/Rect;
 HSPLcom/android/server/wm/SmoothDimmer;->resetDimStates()V
-HPLcom/android/server/wm/SmoothDimmer;->updateDims(Landroid/view/SurfaceControl$Transaction;)Z
-HPLcom/android/server/wm/SnapshotCache;->getSnapshot(Ljava/lang/Integer;)Landroid/window/TaskSnapshot;
-HPLcom/android/server/wm/SnapshotController;->onTransactionReady(ILjava/util/ArrayList;)V
-HPLcom/android/server/wm/SnapshotController;->onTransitionFinish(ILjava/util/ArrayList;)V
+HPLcom/android/server/wm/SmoothDimmer;->updateDims(Landroid/view/SurfaceControl$Transaction;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/SmoothDimmer$DimState;Lcom/android/server/wm/SmoothDimmer$DimState;
+HSPLcom/android/server/wm/SnapshotCache;->getSnapshot(Ljava/lang/Integer;)Landroid/window/TaskSnapshot;
+HSPLcom/android/server/wm/SnapshotController;->onTransactionReady(ILjava/util/ArrayList;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/TaskSnapshotController;Lcom/android/server/wm/TaskSnapshotController;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/SnapshotController;->onTransitionFinish(ILjava/util/ArrayList;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/TaskSnapshotController;Lcom/android/server/wm/TaskSnapshotController;]Lcom/android/server/wm/ActivitySnapshotController;Lcom/android/server/wm/ActivitySnapshotController;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/SnapshotPersistQueue$1;->run()V
 HPLcom/android/server/wm/SnapshotPersistQueue$StoreWriteQueueItem;->writeBuffer()Z
 HPLcom/android/server/wm/SnapshotPersistQueue$StoreWriteQueueItem;->writeProto()Z
-HPLcom/android/server/wm/SnapshotPersistQueue;->addToQueueInternal(Lcom/android/server/wm/SnapshotPersistQueue$WriteQueueItem;Z)V
-HPLcom/android/server/wm/SurfaceAnimationRunner;->lambda$startAnimationLocked$4(Lcom/android/server/wm/SurfaceAnimationRunner$RunningAnimation;Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;)V+]Lcom/android/server/wm/SurfaceAnimationRunner;Lcom/android/server/wm/SurfaceAnimationRunner;]Landroid/animation/ValueAnimator;Lcom/android/server/wm/SurfaceAnimationRunner$SfValueAnimator;
+HPLcom/android/server/wm/SurfaceAnimationRunner;->lambda$startAnimationLocked$4(Lcom/android/server/wm/SurfaceAnimationRunner$RunningAnimation;Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;)V+]Landroid/animation/ValueAnimator;Lcom/android/server/wm/SurfaceAnimationRunner$SfValueAnimator;]Lcom/android/server/wm/SurfaceAnimationRunner;Lcom/android/server/wm/SurfaceAnimationRunner;
 HPLcom/android/server/wm/SurfaceAnimationRunner;->onAnimationLeashLost(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;)V
 HPLcom/android/server/wm/SurfaceAnimationRunner;->scheduleApplyTransaction()V+]Landroid/view/Choreographer;Landroid/view/Choreographer;
 HPLcom/android/server/wm/SurfaceAnimationRunner;->startAnimation(Lcom/android/server/wm/LocalAnimationAdapter$AnimationSpec;Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;Ljava/lang/Runnable;)V
-HSPLcom/android/server/wm/SurfaceAnimationThread;-><init>()V
-HSPLcom/android/server/wm/SurfaceAnimationThread;->ensureThreadLocked()V
-HSPLcom/android/server/wm/SurfaceAnimationThread;->get()Lcom/android/server/wm/SurfaceAnimationThread;
-HSPLcom/android/server/wm/SurfaceAnimationThread;->getHandler()Landroid/os/Handler;
 HSPLcom/android/server/wm/SurfaceAnimator$$ExternalSyntheticLambda0;-><init>(Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)V
 HSPLcom/android/server/wm/SurfaceAnimator;-><init>(Lcom/android/server/wm/SurfaceAnimator$Animatable;Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;Lcom/android/server/wm/WindowManagerService;)V
-HSPLcom/android/server/wm/SurfaceAnimator;->cancelAnimation(Landroid/view/SurfaceControl$Transaction;ZZ)V
-HPLcom/android/server/wm/SurfaceAnimator;->createAnimationLeash(Lcom/android/server/wm/SurfaceAnimator$Animatable;Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;IIIIIZLjava/util/function/Supplier;)Landroid/view/SurfaceControl;
+HSPLcom/android/server/wm/SurfaceAnimator;->cancelAnimation(Landroid/view/SurfaceControl$Transaction;ZZ)V+]Lcom/android/server/wm/AnimationAdapter;Lcom/android/server/wm/TaskOrganizerController$StartingWindowAnimationAdaptor;,Lcom/android/server/wm/LocalAnimationAdapter;,Lcom/android/server/wm/InsetsSourceProvider$ControlAdapter;,Lcom/android/server/wm/FadeAnimationController$FadeAnimationAdapter;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;Lcom/android/server/wm/WindowContainer$$ExternalSyntheticLambda13;
+HPLcom/android/server/wm/SurfaceAnimator;->createAnimationLeash(Lcom/android/server/wm/SurfaceAnimator$Animatable;Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;IIIIIZLjava/util/function/Supplier;)Landroid/view/SurfaceControl;+]Landroid/view/SurfaceControl$Builder;Landroid/view/SurfaceControl$Builder;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/SurfaceAnimator$Animatable;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;
 HSPLcom/android/server/wm/SurfaceAnimator;->getFinishedCallback(Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;
 HSPLcom/android/server/wm/SurfaceAnimator;->hasLeash()Z
 HSPLcom/android/server/wm/SurfaceAnimator;->isAnimating()Z
 HPLcom/android/server/wm/SurfaceAnimator;->lambda$getFinishedCallback$1(Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;ILcom/android/server/wm/AnimationAdapter;)V
-HPLcom/android/server/wm/SurfaceAnimator;->removeLeash(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/SurfaceAnimator$Animatable;Landroid/view/SurfaceControl;Z)Z
-HSPLcom/android/server/wm/SurfaceAnimator;->reset(Landroid/view/SurfaceControl$Transaction;Z)V
-HPLcom/android/server/wm/SurfaceAnimator;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;ZILcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;Ljava/lang/Runnable;Lcom/android/server/wm/AnimationAdapter;Lcom/android/server/wm/SurfaceFreezer;)V
+HPLcom/android/server/wm/SurfaceAnimator;->removeLeash(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/SurfaceAnimator$Animatable;Landroid/view/SurfaceControl;Z)Z+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/SurfaceAnimator$Animatable;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;
+HSPLcom/android/server/wm/SurfaceAnimator;->reset(Landroid/view/SurfaceControl$Transaction;Z)V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
+HPLcom/android/server/wm/SurfaceAnimator;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;ZILcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;Ljava/lang/Runnable;Lcom/android/server/wm/AnimationAdapter;Lcom/android/server/wm/SurfaceFreezer;)V+]Lcom/android/server/wm/AnimationAdapter;megamorphic_types]Lcom/android/server/wm/SurfaceFreezer;Lcom/android/server/wm/SurfaceFreezer;]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Lcom/android/server/wm/SurfaceAnimator$Animatable;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;
 HSPLcom/android/server/wm/SurfaceFreezer;-><init>(Lcom/android/server/wm/SurfaceFreezer$Freezable;Lcom/android/server/wm/WindowManagerService;)V
 HSPLcom/android/server/wm/SurfaceFreezer;->hasLeash()Z
 HPLcom/android/server/wm/SurfaceFreezer;->takeLeashForAnimation()Landroid/view/SurfaceControl;
-HSPLcom/android/server/wm/SurfaceFreezer;->unfreeze(Landroid/view/SurfaceControl$Transaction;)V
+HSPLcom/android/server/wm/SurfaceFreezer;->unfreeze(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/SurfaceFreezer$Freezable;megamorphic_types
 HSPLcom/android/server/wm/SynchedDeviceConfig$SynchedDeviceConfigEntry;->-$$Nest$mgetValue(Lcom/android/server/wm/SynchedDeviceConfig$SynchedDeviceConfigEntry;)Z
 HSPLcom/android/server/wm/SynchedDeviceConfig$SynchedDeviceConfigEntry;->getValue()Z
 HSPLcom/android/server/wm/SynchedDeviceConfig;->getFlagValue(Ljava/lang/String;)Z+]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap;
@@ -10881,8 +8245,8 @@
 HPLcom/android/server/wm/SystemGesturesPointerEventListener;->detectTrackpadThreeFingerSwipe(Landroid/view/MotionEvent;)I
 HPLcom/android/server/wm/SystemGesturesPointerEventListener;->findIndex(I)I
 HPLcom/android/server/wm/SystemGesturesPointerEventListener;->isTrackpadThreeFingerSwipe(Landroid/view/MotionEvent;)Z+]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
-HSPLcom/android/server/wm/SystemGesturesPointerEventListener;->onConfigurationChanged()V
-HSPLcom/android/server/wm/SystemGesturesPointerEventListener;->onDisplayInfoChanged(Landroid/view/DisplayInfo;)V
+HSPLcom/android/server/wm/SystemGesturesPointerEventListener;->onConfigurationChanged()V+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/Context;Landroid/app/ContextImpl;
+HSPLcom/android/server/wm/SystemGesturesPointerEventListener;->onDisplayInfoChanged(Landroid/view/DisplayInfo;)V+]Lcom/android/server/wm/SystemGesturesPointerEventListener;Lcom/android/server/wm/SystemGesturesPointerEventListener;
 HPLcom/android/server/wm/SystemGesturesPointerEventListener;->onPointerEvent(Landroid/view/MotionEvent;)V+]Landroid/view/GestureDetector;Lcom/android/server/wm/SystemGesturesPointerEventListener$1;]Lcom/android/server/wm/SystemGesturesPointerEventListener$Callbacks;Lcom/android/server/wm/DisplayPolicy$1;]Lcom/android/server/wm/SystemGesturesPointerEventListener;Lcom/android/server/wm/SystemGesturesPointerEventListener;]Landroid/view/MotionEvent;Landroid/view/MotionEvent;
 HSPLcom/android/server/wm/Task$$ExternalSyntheticLambda13;-><init>()V
 HSPLcom/android/server/wm/Task$$ExternalSyntheticLambda13;->test(Ljava/lang/Object;)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
@@ -10891,7 +8255,6 @@
 HSPLcom/android/server/wm/Task$$ExternalSyntheticLambda23;->test(Ljava/lang/Object;)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/Task$$ExternalSyntheticLambda2;-><init>(Lcom/android/server/wm/ActivityRecord;Z)V
 HSPLcom/android/server/wm/Task$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
-HSPLcom/android/server/wm/Task$$ExternalSyntheticLambda34;-><init>(Lcom/android/server/wm/TaskFragment;[ZLcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Z)V
 HSPLcom/android/server/wm/Task$$ExternalSyntheticLambda34;->accept(Ljava/lang/Object;)V
 HPLcom/android/server/wm/Task$$ExternalSyntheticLambda38;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wm/Task$$ExternalSyntheticLambda3;->test(Ljava/lang/Object;)Z
@@ -10908,24 +8271,24 @@
 HSPLcom/android/server/wm/Task;->asTask()Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/TrustedOverlayHost;Lcom/android/server/wm/TrustedOverlayHost;
 HSPLcom/android/server/wm/Task;->canAffectSystemUiFlags()Z
-HSPLcom/android/server/wm/Task;->checkTranslucentActivityWaiting(Lcom/android/server/wm/ActivityRecord;)V
-HPLcom/android/server/wm/Task;->cropWindowsToRootTaskBounds()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/Task;->dispatchTaskInfoChangedIfNeeded(Z)V
+HSPLcom/android/server/wm/Task;->checkTranslucentActivityWaiting(Lcom/android/server/wm/ActivityRecord;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/Task;->cropWindowsToRootTaskBounds()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/Task;->dispatchTaskInfoChangedIfNeeded(Z)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskOrganizerController;Lcom/android/server/wm/TaskOrganizerController;
 HSPLcom/android/server/wm/Task;->ensureActivitiesVisible(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/Task;->fillTaskInfo(Landroid/app/TaskInfo;)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->fillTaskInfo(Landroid/app/TaskInfo;Z)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/Task;->fillTaskInfo(Landroid/app/TaskInfo;ZLcom/android/server/wm/TaskDisplayArea;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Landroid/app/TaskInfo;Landroid/app/ActivityManager$RecentTaskInfo;,Landroid/app/ActivityManager$RunningTaskInfo;,Landroid/app/ActivityTaskManager$RootTaskInfo;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/app/PictureInPictureParams;Landroid/app/PictureInPictureParams;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Lcom/android/server/wm/WindowContainer$RemoteToken;Lcom/android/server/wm/WindowContainer$RemoteToken;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Landroid/app/AppCompatTaskInfo;Landroid/app/AppCompatTaskInfo;
-HSPLcom/android/server/wm/Task;->forAllLeafTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/function/Consumer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HSPLcom/android/server/wm/Task;->forAllLeafTasks(Ljava/util/function/Predicate;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/function/Predicate;Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda18;,Lcom/android/server/wm/RootWindowContainer$FindTaskResult;,Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda39;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/Task;->fillTaskInfo(Landroid/app/TaskInfo;ZLcom/android/server/wm/TaskDisplayArea;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;]Landroid/app/TaskInfo;Landroid/app/ActivityManager$RecentTaskInfo;,Landroid/app/ActivityManager$RunningTaskInfo;,Landroid/app/ActivityTaskManager$RootTaskInfo;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer$RemoteToken;Lcom/android/server/wm/WindowContainer$RemoteToken;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/app/PictureInPictureParams;Landroid/app/PictureInPictureParams;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Landroid/app/AppCompatTaskInfo;Landroid/app/AppCompatTaskInfo;
+HSPLcom/android/server/wm/Task;->forAllLeafTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/function/Consumer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/Task;->forAllLeafTasks(Ljava/util/function/Predicate;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/function/Predicate;Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda18;,Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda39;,Lcom/android/server/wm/RootWindowContainer$FindTaskResult;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/Task;->forAllRootTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/function/Consumer;megamorphic_types
 HPLcom/android/server/wm/Task;->forAllRootTasks(Ljava/util/function/Predicate;Z)Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/function/Predicate;Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda23;,Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda16;
 HSPLcom/android/server/wm/Task;->forAllTasks(Ljava/util/function/Consumer;Z)V+]Ljava/util/function/Consumer;Lcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda2;,Lcom/android/server/wm/TaskOrganizerController$$ExternalSyntheticLambda3;,Lcom/android/server/wm/LockTaskController$$ExternalSyntheticLambda1;
-HPLcom/android/server/wm/Task;->getAdjacentTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/Task;->getAdjacentTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->getBaseIntent()Landroid/content/Intent;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->getBounds(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
-HPLcom/android/server/wm/Task;->getDescendantTaskCount()I
-HPLcom/android/server/wm/Task;->getDimBounds(Landroid/graphics/Rect;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/Task;->getDisplayCutoutInsets()Landroid/graphics/Rect;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/view/DisplayCutout;Landroid/view/DisplayCutout;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HPLcom/android/server/wm/Task;->getDescendantTaskCount()I+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/Task;->getDimBounds(Landroid/graphics/Rect;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/Task;->getDisplayCutoutInsets()Landroid/graphics/Rect;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Landroid/view/DisplayCutout;Landroid/view/DisplayCutout;
 HSPLcom/android/server/wm/Task;->getDisplayInfo()Landroid/view/DisplayInfo;+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/Task;->getName()Ljava/lang/String;
 HSPLcom/android/server/wm/Task;->getOrganizedTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
@@ -10934,20 +8297,20 @@
 HSPLcom/android/server/wm/Task;->getRootActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->getRootActivity(ZZ)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/Task$FindRootHelper;Lcom/android/server/wm/Task$FindRootHelper;
 HSPLcom/android/server/wm/Task;->getRootTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/function/Predicate;megamorphic_types
-HSPLcom/android/server/wm/Task;->getRootTaskId()I
+HSPLcom/android/server/wm/Task;->getRootTaskId()I+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->getTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task;+]Ljava/util/function/Predicate;megamorphic_types
 HSPLcom/android/server/wm/Task;->getTaskDescription()Landroid/app/ActivityManager$TaskDescription;
-HSPLcom/android/server/wm/Task;->getTaskInfo()Landroid/app/ActivityManager$RunningTaskInfo;
-HSPLcom/android/server/wm/Task;->getTopLeafTask()Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/Task;->getTopPausingActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/Task;->getTaskInfo()Landroid/app/ActivityManager$RunningTaskInfo;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/Task;->getTopLeafTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/Task;->getTopPausingActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/Task;->getTopResumedActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/Task;->getTopVisibleActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->getTopVisibleAppMainWindow()Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/Task;->hasVisibleChildren()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->isAlwaysOnTop()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;
-HPLcom/android/server/wm/Task;->isCompatible(II)Z
+HSPLcom/android/server/wm/Task;->isCompatible(II)Z
 HSPLcom/android/server/wm/Task;->isFocused()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/Task;->isLeafTask()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/Task;->isLeafTask()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/Task;->isOrganized()Z
 HSPLcom/android/server/wm/Task;->isResizeable()Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->isResizeable(Z)Z
@@ -10960,55 +8323,27 @@
 HSPLcom/android/server/wm/Task;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController;
 HSPLcom/android/server/wm/Task;->onParentChanged(Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ConfigurationContainer;)V
 HSPLcom/android/server/wm/Task;->pauseActivityIfNeeded(Lcom/android/server/wm/ActivityRecord;Ljava/lang/String;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/Task;->prepareSurfaces()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/SmoothDimmer;]Lcom/android/server/wm/TrustedOverlayHost;Lcom/android/server/wm/TrustedOverlayHost;
-HPLcom/android/server/wm/Task;->removeLaunchTickMessages()V
+HSPLcom/android/server/wm/Task;->prepareSurfaces()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/SmoothDimmer;,Lcom/android/server/wm/LegacyDimmer;]Lcom/android/server/wm/TrustedOverlayHost;Lcom/android/server/wm/TrustedOverlayHost;
+HSPLcom/android/server/wm/Task;->removeLaunchTickMessages()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->resolveLeafTaskOnlyOverrideConfigs(Landroid/content/res/Configuration;Landroid/graphics/Rect;)V
-HSPLcom/android/server/wm/Task;->resumeTopActivityInnerLocked(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Z)Z
-HSPLcom/android/server/wm/Task;->resumeTopActivityUncheckedLocked(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Z)Z
+HSPLcom/android/server/wm/Task;->resumeTopActivityInnerLocked(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Z)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
+HSPLcom/android/server/wm/Task;->resumeTopActivityUncheckedLocked(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Z)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HPLcom/android/server/wm/Task;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V
 HSPLcom/android/server/wm/Task;->sendTaskFragmentParentInfoChangedIfNeeded()V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->setIntent(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;)V
-HSPLcom/android/server/wm/Task;->setTaskDescriptionFromActivityAboveRoot(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityManager$TaskDescription;)Z
-HPLcom/android/server/wm/Task;->shouldIgnoreInput()Z
+HSPLcom/android/server/wm/Task;->setTaskDescriptionFromActivityAboveRoot(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityManager$TaskDescription;)Z+]Landroid/app/ActivityManager$TaskDescription;Landroid/app/ActivityManager$TaskDescription;
+HSPLcom/android/server/wm/Task;->shouldIgnoreInput()Z
 HSPLcom/android/server/wm/Task;->shouldSleepActivities()Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/Task;->startActivityLocked(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/Task;ZZLandroid/app/ActivityOptions;Lcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/Task;->toString()Ljava/lang/String;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;
 HSPLcom/android/server/wm/Task;->topRunningActivityLocked()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/Task;->touchActiveTime()V
 HSPLcom/android/server/wm/Task;->updateSurfaceBounds()V
-HSPLcom/android/server/wm/Task;->updateSurfaceSize(Landroid/view/SurfaceControl$Transaction;)V+]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/Task;->updateTaskDescription()V
+HSPLcom/android/server/wm/Task;->updateSurfaceSize(Landroid/view/SurfaceControl$Transaction;)V+]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Landroid/graphics/Rect;Landroid/graphics/Rect;
+HSPLcom/android/server/wm/Task;->updateTaskDescription()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/internal/util/function/pooled/PooledPredicate;Lcom/android/internal/util/function/pooled/PooledLambdaImpl;]Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController;
 HSPLcom/android/server/wm/Task;->updateTaskMovement(ZZI)V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda10;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda11;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda12;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda13;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda14;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda15;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda16;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda17;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda18;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda19;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda1;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda20;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda21;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda22;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda23;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda24;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda2;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda3;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda4;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda5;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda6;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda7;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda8;-><init>()V
 HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda8;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
-HSPLcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda9;-><init>()V
-HSPLcom/android/server/wm/TaskChangeNotificationController$MainHandler;-><init>(Lcom/android/server/wm/TaskChangeNotificationController;Landroid/os/Looper;)V
 HSPLcom/android/server/wm/TaskChangeNotificationController$MainHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;
-HSPLcom/android/server/wm/TaskChangeNotificationController;->$r8$lambda$4eLcfeE5EsykOVynmzu3fgpLtiE(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
-HSPLcom/android/server/wm/TaskChangeNotificationController;->-$$Nest$mforAllRemoteListeners(Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer;Landroid/os/Message;)V
 HSPLcom/android/server/wm/TaskChangeNotificationController;-><init>(Lcom/android/server/wm/ActivityTaskSupervisor;Landroid/os/Handler;)V
 HSPLcom/android/server/wm/TaskChangeNotificationController;->forAllLocalListeners(Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer;Landroid/os/Message;)V+]Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/TaskChangeNotificationController;->forAllRemoteListeners(Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer;Landroid/os/Message;)V+]Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer;megamorphic_types]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;
@@ -11017,59 +8352,59 @@
 HSPLcom/android/server/wm/TaskChangeNotificationController;->notifyTaskDescriptionChanged(Landroid/app/TaskInfo;)V
 HSPLcom/android/server/wm/TaskChangeNotificationController;->notifyTaskDisplayChanged(II)V
 HPLcom/android/server/wm/TaskChangeNotificationController;->notifyTaskStackChanged()V
-HPLcom/android/server/wm/TaskDisplayArea$$ExternalSyntheticLambda0;-><init>(II)V
-HPLcom/android/server/wm/TaskDisplayArea$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z
-HPLcom/android/server/wm/TaskDisplayArea;->$r8$lambda$UO54rDaQ1J_Js1LvzH8layvsInU(IILcom/android/server/wm/Task;)Z
+HSPLcom/android/server/wm/TaskDisplayArea$$ExternalSyntheticLambda0;-><init>(II)V
+HSPLcom/android/server/wm/TaskDisplayArea$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z
+HSPLcom/android/server/wm/TaskDisplayArea;->$r8$lambda$UO54rDaQ1J_Js1LvzH8layvsInU(IILcom/android/server/wm/Task;)Z
 HSPLcom/android/server/wm/TaskDisplayArea;->adjustRootTaskLayer(Landroid/view/SurfaceControl$Transaction;Ljava/util/ArrayList;I)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Landroid/util/IntArray;Landroid/util/IntArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/wm/TaskDisplayArea;->allResumedActivitiesComplete()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/TaskDisplayArea;->allResumedActivitiesComplete()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/TaskDisplayArea;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;
 HSPLcom/android/server/wm/TaskDisplayArea;->assignRootTaskOrdering(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;,Ljava/util/ArrayList;
-HSPLcom/android/server/wm/TaskDisplayArea;->canSpecifyOrientation(I)Z
+HSPLcom/android/server/wm/TaskDisplayArea;->canSpecifyOrientation(I)Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/TaskDisplayArea;->findMaxPositionForRootTask(Lcom/android/server/wm/Task;)I
 HSPLcom/android/server/wm/TaskDisplayArea;->findMinPositionForRootTask(Lcom/android/server/wm/Task;)I
 HSPLcom/android/server/wm/TaskDisplayArea;->findPositionForRootTask(ILcom/android/server/wm/Task;Z)I
 HSPLcom/android/server/wm/TaskDisplayArea;->getFocusedRootTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HSPLcom/android/server/wm/TaskDisplayArea;->getOrientation(I)I
-HSPLcom/android/server/wm/TaskDisplayArea;->getPriority(Lcom/android/server/wm/WindowContainer;)I
+HSPLcom/android/server/wm/TaskDisplayArea;->getItemFromTaskDisplayAreas(Ljava/util/function/Function;Z)Ljava/lang/Object;+]Ljava/util/function/Function;megamorphic_types
+HSPLcom/android/server/wm/TaskDisplayArea;->getOrientation(I)I+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;
+HSPLcom/android/server/wm/TaskDisplayArea;->getPriority(Lcom/android/server/wm/WindowContainer;)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/TaskDisplayArea;->getRootHomeTask()Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/TaskDisplayArea;->getRootTask(II)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskDisplayArea;
-HPLcom/android/server/wm/TaskDisplayArea;->getTopRootTaskInWindowingMode(I)Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/TaskDisplayArea;->getTopRootTaskInWindowingMode(I)Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/TaskDisplayArea;->isRemoved()Z
-HPLcom/android/server/wm/TaskDisplayArea;->isRootTaskVisible(I)Z
-HPLcom/android/server/wm/TaskDisplayArea;->lambda$getRootTask$0(IILcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/TaskDisplayArea;->lambda$pauseBackTasks$5(Lcom/android/server/wm/ActivityRecord;[ILcom/android/server/wm/Task;)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/TaskDisplayArea;->isRootTaskVisible(I)Z
+HSPLcom/android/server/wm/TaskDisplayArea;->lambda$getRootTask$0(IILcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/TaskDisplayArea;->positionChildTaskAt(ILcom/android/server/wm/Task;Z)V
-HSPLcom/android/server/wm/TaskDisplayArea;->supportsActivityMinWidthHeightMultiWindow(IILandroid/content/pm/ActivityInfo;)Z+]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;
-HSPLcom/android/server/wm/TaskDisplayArea;->topRunningActivity(Z)Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/TaskDisplayArea;->supportsActivityMinWidthHeightMultiWindow(IILandroid/content/pm/ActivityInfo;)Z+]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;
+HSPLcom/android/server/wm/TaskDisplayArea;->topRunningActivity(Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/TaskFragment$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/wm/TaskFragment$$ExternalSyntheticLambda3;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/wm/TaskFragment;->$r8$lambda$cCOreq8AkspWCLOBq9Dd3lEozFQ(Lcom/android/server/wm/ActivityRecord;)Z
 HSPLcom/android/server/wm/TaskFragment;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/os/IBinder;ZZ)V
 HSPLcom/android/server/wm/TaskFragment;->asTaskFragment()Lcom/android/server/wm/TaskFragment;
-HSPLcom/android/server/wm/TaskFragment;->canBeResumed(Lcom/android/server/wm/ActivityRecord;)Z
-HSPLcom/android/server/wm/TaskFragment;->canSpecifyOrientation()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/TaskFragment;->canBeResumed(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/TaskFragment;->canSpecifyOrientation()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
 HPLcom/android/server/wm/TaskFragment;->completePause(ZLcom/android/server/wm/ActivityRecord;)V
 HSPLcom/android/server/wm/TaskFragment;->computeConfigResourceOverrides(Landroid/content/res/Configuration;Landroid/content/res/Configuration;Landroid/view/DisplayInfo;Lcom/android/server/wm/ActivityRecord$CompatDisplayInsets;)V
-HSPLcom/android/server/wm/TaskFragment;->fillsParent()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/TaskFragment;->fillsParent()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/TaskFragment;->forAllLeafTaskFragments(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Ljava/util/function/Consumer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;
-HSPLcom/android/server/wm/TaskFragment;->forAllLeafTaskFragments(Ljava/util/function/Predicate;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/function/Predicate;Lcom/android/server/wm/Task$$ExternalSyntheticLambda27;,Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda26;,Lcom/android/server/wm/ActivityRecord$$ExternalSyntheticLambda30;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/TaskFragment;->forAllLeafTaskFragments(Ljava/util/function/Predicate;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Ljava/util/function/Predicate;Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda26;,Lcom/android/server/wm/Task$$ExternalSyntheticLambda27;,Lcom/android/server/wm/ActivityRecord$$ExternalSyntheticLambda30;,Lcom/android/server/wm/TaskFragmentOrganizerController$$ExternalSyntheticLambda0;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/TaskFragment;->getActivityType()I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/TaskFragment;->getAdjacentTaskFragment()Lcom/android/server/wm/TaskFragment;
-HSPLcom/android/server/wm/TaskFragment;->getDisplayArea()Lcom/android/server/wm/DisplayArea;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/TaskFragment;->getDisplayArea()Lcom/android/server/wm/DisplayArea;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/TaskFragment;->getDisplayArea()Lcom/android/server/wm/TaskDisplayArea;
-HSPLcom/android/server/wm/TaskFragment;->getDisplayId()I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
-HSPLcom/android/server/wm/TaskFragment;->getOrganizedTaskFragment()Lcom/android/server/wm/TaskFragment;
-HSPLcom/android/server/wm/TaskFragment;->getOrientation(I)I+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/TaskFragment;->getDisplayId()I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/TaskFragment;->getOrganizedTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/TaskFragment;->getOrientation(I)I+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/TaskFragment;->getResumedActivity()Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/TaskFragment;->getRootTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
 HSPLcom/android/server/wm/TaskFragment;->getRootTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/TaskFragment;->getTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/TaskFragment;->getTaskFragment(Ljava/util/function/Predicate;)Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/TaskFragment;->getTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/TaskFragment;->getTaskFragment(Ljava/util/function/Predicate;)Lcom/android/server/wm/TaskFragment;+]Ljava/util/function/Predicate;Lcom/android/server/wm/Task$$ExternalSyntheticLambda3;
 HSPLcom/android/server/wm/TaskFragment;->getTopNonFinishingActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
-HSPLcom/android/server/wm/TaskFragment;->getTopNonFinishingActivity(Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
-HSPLcom/android/server/wm/TaskFragment;->getVisibility(Lcom/android/server/wm/ActivityRecord;)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HSPLcom/android/server/wm/TaskFragment;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
-HSPLcom/android/server/wm/TaskFragment;->hasRunningActivity(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/TaskFragment;->getTopNonFinishingActivity(Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/TaskFragment;->getVisibility(Lcom/android/server/wm/ActivityRecord;)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Landroid/graphics/Rect;Landroid/graphics/Rect;
+HSPLcom/android/server/wm/TaskFragment;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/TaskFragment;->hasRunningActivity(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/TaskFragment;->intersectWithInsetsIfFits(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
 HSPLcom/android/server/wm/TaskFragment;->isAttached()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;
 HSPLcom/android/server/wm/TaskFragment;->isEmbedded()Z
@@ -11078,198 +8413,181 @@
 HSPLcom/android/server/wm/TaskFragment;->isForceTranslucent()Z
 HSPLcom/android/server/wm/TaskFragment;->isLeafTaskFragment()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/TaskFragment;->isOrganizedTaskFragment()Z
-HSPLcom/android/server/wm/TaskFragment;->isTopActivityFocusable()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/TaskFragment;->isTopActivityFocusable()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/TaskFragment;->isTopActivityLaunchedBehind()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/TaskFragment;->isTranslucent(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;Lcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
-HSPLcom/android/server/wm/TaskFragment;->isTranslucent(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/TaskFragment;->isTranslucent(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/TaskFragment;->lambda$getTopNonFinishingActivity$2(Lcom/android/server/wm/ActivityRecord;)Z
 HSPLcom/android/server/wm/TaskFragment;->lambda$topRunningActivity$4(Lcom/android/server/wm/ActivityRecord;)Z
-HPLcom/android/server/wm/TaskFragment;->onActivityStateChanged(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord$State;Ljava/lang/String;)V
-HSPLcom/android/server/wm/TaskFragment;->prepareSurfaces()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/SmoothDimmer;]Landroid/graphics/Rect;Landroid/graphics/Rect;
+HSPLcom/android/server/wm/TaskFragment;->onActivityStateChanged(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord$State;Ljava/lang/String;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;
+HSPLcom/android/server/wm/TaskFragment;->prepareSurfaces()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/SmoothDimmer;,Lcom/android/server/wm/LegacyDimmer;]Landroid/graphics/Rect;Landroid/graphics/Rect;
 HSPLcom/android/server/wm/TaskFragment;->providesOrientation()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/TaskFragment;->resolveOverrideConfiguration(Landroid/content/res/Configuration;)V
-HSPLcom/android/server/wm/TaskFragment;->resumeTopActivity(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Z)Z
+HSPLcom/android/server/wm/TaskFragment;->resumeTopActivity(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Z)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/AppWarnings;Lcom/android/server/wm/AppWarnings;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/ActivityMetricsLogger;Lcom/android/server/wm/ActivityMetricsLogger;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HPLcom/android/server/wm/TaskFragment;->schedulePauseActivity(Lcom/android/server/wm/ActivityRecord;ZZZLjava/lang/String;)V
-HPLcom/android/server/wm/TaskFragment;->setResumedActivity(Lcom/android/server/wm/ActivityRecord;Ljava/lang/String;)V
-HSPLcom/android/server/wm/TaskFragment;->shouldBeVisible(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
-HSPLcom/android/server/wm/TaskFragment;->shouldDeferRemoval()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
-HSPLcom/android/server/wm/TaskFragment;->shouldReportOrientationUnspecified()Z
-HPLcom/android/server/wm/TaskFragment;->sleepIfPossible(Z)Z
+HSPLcom/android/server/wm/TaskFragment;->setResumedActivity(Lcom/android/server/wm/ActivityRecord;Ljava/lang/String;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/TaskFragment;->shouldBeVisible(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/TaskFragment;->shouldDeferRemoval()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/TaskFragment;->shouldReportOrientationUnspecified()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;
+HPLcom/android/server/wm/TaskFragment;->sleepIfPossible(Z)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/wm/TaskFragment;->startPausing(ZZLcom/android/server/wm/ActivityRecord;Ljava/lang/String;)Z
 HSPLcom/android/server/wm/TaskFragment;->supportsMultiWindowInDisplayArea(Lcom/android/server/wm/TaskDisplayArea;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;
 HSPLcom/android/server/wm/TaskFragment;->topRunningActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
 HSPLcom/android/server/wm/TaskFragment;->topRunningActivity(Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
 HSPLcom/android/server/wm/TaskFragment;->updateActivityVisibilities(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/EnsureActivitiesVisibleHelper;Lcom/android/server/wm/EnsureActivitiesVisibleHelper;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
-HSPLcom/android/server/wm/TaskFragmentOrganizerController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/WindowOrganizerController;)V
 HSPLcom/android/server/wm/TaskFragmentOrganizerController;->dispatchPendingEvents()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Lcom/android/server/wm/TaskFragmentOrganizerController;Lcom/android/server/wm/TaskFragmentOrganizerController;
-HSPLcom/android/server/wm/TaskLaunchParamsModifier;-><init>(Lcom/android/server/wm/ActivityTaskSupervisor;)V
-HSPLcom/android/server/wm/TaskLaunchParamsModifier;->calculate(Lcom/android/server/wm/Task;Landroid/content/pm/ActivityInfo$WindowLayout;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/wm/ActivityStarter$Request;ILcom/android/server/wm/LaunchParamsController$LaunchParams;Lcom/android/server/wm/LaunchParamsController$LaunchParams;)I
-HSPLcom/android/server/wm/TaskLaunchParamsModifier;->getPreferredLaunchTaskDisplayArea(Lcom/android/server/wm/Task;Landroid/app/ActivityOptions;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/LaunchParamsController$LaunchParams;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityStarter$Request;)Lcom/android/server/wm/TaskDisplayArea;
+HSPLcom/android/server/wm/TaskLaunchParamsModifier;->calculate(Lcom/android/server/wm/Task;Landroid/content/pm/ActivityInfo$WindowLayout;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/wm/ActivityStarter$Request;ILcom/android/server/wm/LaunchParamsController$LaunchParams;Lcom/android/server/wm/LaunchParamsController$LaunchParams;)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Landroid/app/ActivityOptions;Landroid/app/ActivityOptions;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/LaunchParamsController$LaunchParams;Lcom/android/server/wm/LaunchParamsController$LaunchParams;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HSPLcom/android/server/wm/TaskLaunchParamsModifier;->getPreferredLaunchTaskDisplayArea(Lcom/android/server/wm/Task;Landroid/app/ActivityOptions;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/LaunchParamsController$LaunchParams;Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityStarter$Request;)Lcom/android/server/wm/TaskDisplayArea;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Landroid/app/ActivityOptions;Landroid/app/ActivityOptions;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/TaskLaunchParamsModifier;->getTaskBounds(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/TaskDisplayArea;Landroid/content/pm/ActivityInfo$WindowLayout;IZLandroid/graphics/Rect;)V
-HSPLcom/android/server/wm/TaskOrganizerController$PendingTaskEvent;-><init>(Lcom/android/server/wm/Task;I)V
 HSPLcom/android/server/wm/TaskOrganizerController$PendingTaskEvent;-><init>(Lcom/android/server/wm/Task;Landroid/window/ITaskOrganizer;I)V
-HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;->onTaskInfoChanged(Lcom/android/server/wm/Task;Landroid/app/ActivityManager$RunningTaskInfo;)V
-HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;->addPendingTaskEvent(Lcom/android/server/wm/TaskOrganizerController$PendingTaskEvent;)V
-HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;->dispatchPendingEvent(Lcom/android/server/wm/TaskOrganizerController$PendingTaskEvent;)V
+HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;->onTaskInfoChanged(Lcom/android/server/wm/Task;Landroid/app/ActivityManager$RunningTaskInfo;)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Landroid/window/ITaskOrganizer;Landroid/window/ITaskOrganizer$Stub$Proxy;
+HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;->dispatchPendingEvent(Lcom/android/server/wm/TaskOrganizerController$PendingTaskEvent;)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;]Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;
 HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;->dispatchPendingEvents()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;
-HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;->dispatchTaskInfoChanged(Lcom/android/server/wm/Task;Z)V
-HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;->getPendingLifecycleTaskEvent(Lcom/android/server/wm/Task;)Lcom/android/server/wm/TaskOrganizerController$PendingTaskEvent;
+HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;->dispatchTaskInfoChanged(Lcom/android/server/wm/Task;Z)V+]Landroid/app/ActivityManager$RunningTaskInfo;Landroid/app/ActivityManager$RunningTaskInfo;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;]Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;
+HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;->getPendingLifecycleTaskEvent(Lcom/android/server/wm/Task;)Lcom/android/server/wm/TaskOrganizerController$PendingTaskEvent;+]Lcom/android/server/wm/TaskOrganizerController$PendingTaskEvent;Lcom/android/server/wm/TaskOrganizerController$PendingTaskEvent;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;->-$$Nest$fgetmPendingEventsQueue(Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerState;)Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;
-HSPLcom/android/server/wm/TaskOrganizerController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
 HSPLcom/android/server/wm/TaskOrganizerController;->dispatchPendingEvents()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;
-HSPLcom/android/server/wm/TaskOrganizerController;->onTaskInfoChanged(Lcom/android/server/wm/Task;Z)V
-HSPLcom/android/server/wm/TaskPersister;-><init>(Ljava/io/File;Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/PersisterQueue;)V
+HSPLcom/android/server/wm/TaskOrganizerController;->onTaskInfoChanged(Lcom/android/server/wm/Task;Z)V+]Landroid/window/ITaskOrganizer;Landroid/window/ITaskOrganizer$Stub$Proxy;
 HPLcom/android/server/wm/TaskPersister;->wakeup(Lcom/android/server/wm/Task;Z)V
 HPLcom/android/server/wm/TaskSnapshotCache;->putSnapshot(Lcom/android/server/wm/Task;Landroid/window/TaskSnapshot;)V
-HPLcom/android/server/wm/TaskSnapshotController;->getSnapshot(IIZZ)Landroid/window/TaskSnapshot;
-HPLcom/android/server/wm/TaskTapPointerEventListener;->onPointerEvent(Landroid/view/MotionEvent;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/TaskPositioningController;Lcom/android/server/wm/TaskPositioningController;]Landroid/view/MotionEvent;Landroid/view/MotionEvent;]Lcom/android/server/wm/TaskTapPointerEventListener;Lcom/android/server/wm/TaskTapPointerEventListener;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/TaskSnapshotController;->getSnapshot(IIZZ)Landroid/window/TaskSnapshot;+]Lcom/android/server/wm/BaseAppSnapshotPersister$PersistInfoProvider;Lcom/android/server/wm/BaseAppSnapshotPersister$PersistInfoProvider;]Lcom/android/server/wm/TaskSnapshotCache;Lcom/android/server/wm/TaskSnapshotCache;
+HPLcom/android/server/wm/TaskTapPointerEventListener;->onPointerEvent(Landroid/view/MotionEvent;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/view/MotionEvent;Landroid/view/MotionEvent;]Lcom/android/server/wm/TaskPositioningController;Lcom/android/server/wm/TaskPositioningController;]Lcom/android/server/wm/TaskTapPointerEventListener;Lcom/android/server/wm/TaskTapPointerEventListener;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/TaskTapPointerEventListener;->setTouchExcludeRegion(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;
-HSPLcom/android/server/wm/Transition$ChangeInfo;-><init>(Lcom/android/server/wm/WindowContainer;)V
-HPLcom/android/server/wm/Transition$ChangeInfo;->getChangeFlags(Lcom/android/server/wm/WindowContainer;)I
-HPLcom/android/server/wm/Transition$ChangeInfo;->hasChanged()Z
-HSPLcom/android/server/wm/Transition$ReadyTracker;-><init>(Lcom/android/server/wm/Transition;)V
-HSPLcom/android/server/wm/Transition$ReadyTrackerOld;->allReady()Z
-HPLcom/android/server/wm/Transition$ReadyTrackerOld;->setReadyFrom(Lcom/android/server/wm/WindowContainer;Z)V
-HPLcom/android/server/wm/Transition$Targets;->add(Lcom/android/server/wm/Transition$ChangeInfo;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HPLcom/android/server/wm/Transition$Targets;->getListSortedByZ()Ljava/util/ArrayList;
+HSPLcom/android/server/wm/Transition$ChangeInfo;-><init>(Lcom/android/server/wm/WindowContainer;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
+HSPLcom/android/server/wm/Transition$ChangeInfo;->getChangeFlags(Lcom/android/server/wm/WindowContainer;)I+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/StartingData;Lcom/android/server/wm/SnapshotStartingData;,Lcom/android/server/wm/SplashScreenStartingData;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;
+HSPLcom/android/server/wm/Transition$ChangeInfo;->hasChanged()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
+HSPLcom/android/server/wm/Transition$ReadyTrackerOld;->allReady()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/Transition$ReadyTrackerOld;->groupsToString()Ljava/lang/String;
+HSPLcom/android/server/wm/Transition$ReadyTrackerOld;->setReadyFrom(Lcom/android/server/wm/WindowContainer;Z)V
+HSPLcom/android/server/wm/Transition$Targets;->add(Lcom/android/server/wm/Transition$ChangeInfo;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/util/SparseArray;Landroid/util/SparseArray;
+HSPLcom/android/server/wm/Transition$Targets;->getListSortedByZ()Ljava/util/ArrayList;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
 HSPLcom/android/server/wm/Transition;-><init>(IILcom/android/server/wm/TransitionController;Lcom/android/server/wm/BLASTSyncEngine;)V
-HSPLcom/android/server/wm/Transition;->addOnTopTasks(Lcom/android/server/wm/DisplayContent;Ljava/util/ArrayList;)V
-HSPLcom/android/server/wm/Transition;->addOnTopTasks(Lcom/android/server/wm/Task;Ljava/util/ArrayList;)V
-HSPLcom/android/server/wm/Transition;->applyReady()V
-HPLcom/android/server/wm/Transition;->buildCleanupTransaction(Landroid/view/SurfaceControl$Transaction;Landroid/window/TransitionInfo;)V
-HPLcom/android/server/wm/Transition;->buildFinishTransaction(Landroid/view/SurfaceControl$Transaction;Landroid/window/TransitionInfo;)V
-HPLcom/android/server/wm/Transition;->calculateTargets(Landroid/util/ArraySet;Landroid/util/ArrayMap;)Ljava/util/ArrayList;
-HPLcom/android/server/wm/Transition;->calculateTransitionInfo(IILjava/util/ArrayList;Landroid/view/SurfaceControl$Transaction;)Landroid/window/TransitionInfo;
-HPLcom/android/server/wm/Transition;->calculateTransitionRoots(Landroid/window/TransitionInfo;Ljava/util/ArrayList;Landroid/view/SurfaceControl$Transaction;)V
-HPLcom/android/server/wm/Transition;->canPromote(Lcom/android/server/wm/Transition$ChangeInfo;Lcom/android/server/wm/Transition$Targets;Landroid/util/ArrayMap;)Z
-HSPLcom/android/server/wm/Transition;->collect(Lcom/android/server/wm/WindowContainer;)V
-HPLcom/android/server/wm/Transition;->collectOrderChanges(Z)V
-HPLcom/android/server/wm/Transition;->commitVisibleActivities(Landroid/view/SurfaceControl$Transaction;)V
-HPLcom/android/server/wm/Transition;->findCommonAncestor(Ljava/util/ArrayList;Lcom/android/server/wm/WindowContainer;)Lcom/android/server/wm/WindowContainer;
-HPLcom/android/server/wm/Transition;->finishTransition()V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/wm/TaskSnapshotController;Lcom/android/server/wm/TaskSnapshotController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/inputmethod/InputMethodManagerInternal;Lcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda23;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/ActivityRecordInputSink;Lcom/android/server/wm/ActivityRecordInputSink;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/SnapshotController;Lcom/android/server/wm/SnapshotController;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionTracer;Lcom/android/server/wm/LegacyTransitionTracer;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/Transition;->addOnTopTasks(Lcom/android/server/wm/DisplayContent;Ljava/util/ArrayList;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/Transition;->addOnTopTasks(Lcom/android/server/wm/Task;Ljava/util/ArrayList;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
+HSPLcom/android/server/wm/Transition;->applyReady()V+]Lcom/android/server/wm/Transition$ReadyTrackerOld;Lcom/android/server/wm/Transition$ReadyTrackerOld;]Lcom/android/server/wm/BLASTSyncEngine;Lcom/android/server/wm/BLASTSyncEngine;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/Transition;->buildCleanupTransaction(Landroid/view/SurfaceControl$Transaction;Landroid/window/TransitionInfo;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/Transition;->buildFinishTransaction(Landroid/view/SurfaceControl$Transaction;Landroid/window/TransitionInfo;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/Transition$IContainerFreezer;Lcom/android/server/wm/Transition$ScreenshotFreezer;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/Transition;->calculateTargets(Landroid/util/ArraySet;Landroid/util/ArrayMap;)Ljava/util/ArrayList;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/Transition$ChangeInfo;Lcom/android/server/wm/Transition$ChangeInfo;
+HSPLcom/android/server/wm/Transition;->calculateTransitionInfo(IILjava/util/ArrayList;Landroid/view/SurfaceControl$Transaction;)Landroid/window/TransitionInfo;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/Transition$ChangeInfo;Lcom/android/server/wm/Transition$ChangeInfo;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Landroid/app/ActivityManager$TaskDescription;Landroid/app/ActivityManager$TaskDescription;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/WindowContainer$RemoteToken;Lcom/android/server/wm/WindowContainer$RemoteToken;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
+HSPLcom/android/server/wm/Transition;->calculateTransitionRoots(Landroid/window/TransitionInfo;Ljava/util/ArrayList;Landroid/view/SurfaceControl$Transaction;)V+]Landroid/view/SurfaceControl$Builder;Landroid/view/SurfaceControl$Builder;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/Transition;->canPromote(Lcom/android/server/wm/Transition$ChangeInfo;Lcom/android/server/wm/Transition$Targets;Landroid/util/ArrayMap;)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/Transition$ChangeInfo;Lcom/android/server/wm/Transition$ChangeInfo;]Lcom/android/server/wm/Transition$Targets;Lcom/android/server/wm/Transition$Targets;
+HSPLcom/android/server/wm/Transition;->collect(Lcom/android/server/wm/WindowContainer;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/BLASTSyncEngine;Lcom/android/server/wm/BLASTSyncEngine;
+HSPLcom/android/server/wm/Transition;->collectOrderChanges(Z)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/Transition;->commitVisibleActivities(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/Transition;->findCommonAncestor(Ljava/util/ArrayList;Lcom/android/server/wm/WindowContainer;)Lcom/android/server/wm/WindowContainer;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/Transition$ChangeInfo;Lcom/android/server/wm/Transition$ChangeInfo;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/Transition;->finishTransition()V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/TaskSnapshotController;Lcom/android/server/wm/TaskSnapshotController;]Lcom/android/server/wm/ActivityRecordInputSink;Lcom/android/server/wm/ActivityRecordInputSink;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/SnapshotController;Lcom/android/server/wm/SnapshotController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda23;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/TransitionTracer;Lcom/android/server/wm/LegacyTransitionTracer;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/inputmethod/InputMethodManagerInternal;Lcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController;]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/Transition;->getAnimatableParent(Lcom/android/server/wm/WindowContainer;)Lcom/android/server/wm/WindowContainer;+]Lcom/android/server/wm/WindowContainer;megamorphic_types
-HSPLcom/android/server/wm/Transition;->getDisplayId(Lcom/android/server/wm/WindowContainer;)I
-HPLcom/android/server/wm/Transition;->getLayoutParamsForAnimationsStyle(ILjava/util/ArrayList;)Landroid/view/WindowManager$LayoutParams;
-HPLcom/android/server/wm/Transition;->getLeashSurface(Lcom/android/server/wm/WindowContainer;Landroid/view/SurfaceControl$Transaction;)Landroid/view/SurfaceControl;
-HPLcom/android/server/wm/Transition;->handleLegacyRecentsStartBehavior(Lcom/android/server/wm/DisplayContent;Landroid/window/TransitionInfo;)V
+HSPLcom/android/server/wm/Transition;->getDisplayId(Lcom/android/server/wm/WindowContainer;)I+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;megamorphic_types
+HSPLcom/android/server/wm/Transition;->getLayoutParamsForAnimationsStyle(ILjava/util/ArrayList;)Landroid/view/WindowManager$LayoutParams;
+HSPLcom/android/server/wm/Transition;->getLeashSurface(Lcom/android/server/wm/WindowContainer;Landroid/view/SurfaceControl$Transaction;)Landroid/view/SurfaceControl;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/Transition;->isInTransientHide(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/Transition;->isInTransition(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/util/ArraySet;Landroid/util/ArraySet;
 HSPLcom/android/server/wm/Transition;->isTransientVisible(Lcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;Lcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/Transition;->onTransactionReady(ILandroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/window/TransitionInfo$Root;Landroid/window/TransitionInfo$Root;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/SnapshotController;Lcom/android/server/wm/SnapshotController;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/AccessibilityController;Lcom/android/server/wm/AccessibilityController;]Lcom/android/server/wm/TransitionController$Logger;Lcom/android/server/wm/TransitionController$Logger;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda23;]Landroid/window/TransitionInfo;Landroid/window/TransitionInfo;]Lcom/android/server/wm/TransitionTracer;Lcom/android/server/wm/LegacyTransitionTracer;]Landroid/window/ITransitionPlayer;Landroid/window/ITransitionPlayer$Stub$Proxy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/window/TransitionInfo$AnimationOptions;Landroid/window/TransitionInfo$AnimationOptions;
-HPLcom/android/server/wm/Transition;->populateParentChanges(Lcom/android/server/wm/Transition$Targets;Landroid/util/ArrayMap;)V
-HSPLcom/android/server/wm/Transition;->recordDisplay(Lcom/android/server/wm/DisplayContent;)V
-HPLcom/android/server/wm/Transition;->reportStartReasonsToLogger()V
-HPLcom/android/server/wm/Transition;->resetSurfaceTransform(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/WindowContainer;Landroid/view/SurfaceControl;)V
-HPLcom/android/server/wm/Transition;->setReady(Lcom/android/server/wm/WindowContainer;Z)V
-HSPLcom/android/server/wm/Transition;->snapshotStartState(Lcom/android/server/wm/WindowContainer;)V
+HSPLcom/android/server/wm/Transition;->onTransactionReady(ILandroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/SnapshotController;Lcom/android/server/wm/SnapshotController;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/TransitionController$Logger;Lcom/android/server/wm/TransitionController$Logger;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda23;]Lcom/android/server/wm/TransitionTracer;Lcom/android/server/wm/LegacyTransitionTracer;]Landroid/window/ITransitionPlayer;Landroid/window/ITransitionPlayer$Stub$Proxy;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Landroid/window/TransitionInfo$Root;Landroid/window/TransitionInfo$Root;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/AccessibilityController;Lcom/android/server/wm/AccessibilityController;]Landroid/window/TransitionInfo;Landroid/window/TransitionInfo;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/window/TransitionInfo$AnimationOptions;Landroid/window/TransitionInfo$AnimationOptions;
+HSPLcom/android/server/wm/Transition;->populateParentChanges(Lcom/android/server/wm/Transition$Targets;Landroid/util/ArrayMap;)V+]Lcom/android/server/wm/Transition$ChangeInfo;Lcom/android/server/wm/Transition$ChangeInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/Transition$Targets;Lcom/android/server/wm/Transition$Targets;
+HSPLcom/android/server/wm/Transition;->recordDisplay(Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/Transition;->reportStartReasonsToLogger()V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/ActivityMetricsLogger;Lcom/android/server/wm/ActivityMetricsLogger;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
+HSPLcom/android/server/wm/Transition;->resetSurfaceTransform(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/WindowContainer;Landroid/view/SurfaceControl;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/TaskDisplayArea;
+HSPLcom/android/server/wm/Transition;->setReady(Lcom/android/server/wm/WindowContainer;Z)V+]Lcom/android/server/wm/Transition$ReadyTrackerOld;Lcom/android/server/wm/Transition$ReadyTrackerOld;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;
+HSPLcom/android/server/wm/Transition;->snapshotStartState(Lcom/android/server/wm/WindowContainer;)V+]Lcom/android/server/wm/Transition$ReadyTrackerOld;Lcom/android/server/wm/Transition$ReadyTrackerOld;
 HSPLcom/android/server/wm/Transition;->start()V
 HSPLcom/android/server/wm/Transition;->startCollecting(J)V
-HPLcom/android/server/wm/Transition;->toString()Ljava/lang/String;
-HPLcom/android/server/wm/Transition;->tryPromote(Lcom/android/server/wm/Transition$Targets;Landroid/util/ArrayMap;)V
-HSPLcom/android/server/wm/Transition;->updateTransientFlags(Lcom/android/server/wm/Transition$ChangeInfo;)V
-HSPLcom/android/server/wm/TransitionController$$ExternalSyntheticLambda4;-><init>(Lcom/android/server/wm/TransitionController;)V
-HSPLcom/android/server/wm/TransitionController$Lock;-><init>(Lcom/android/server/wm/TransitionController;)V
-HPLcom/android/server/wm/TransitionController$Logger;->buildOnFinishLog()Ljava/lang/String;
+HSPLcom/android/server/wm/Transition;->toString()Ljava/lang/String;
+HSPLcom/android/server/wm/Transition;->tryPromote(Lcom/android/server/wm/Transition$Targets;Landroid/util/ArrayMap;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/Transition$Targets;Lcom/android/server/wm/Transition$Targets;
+HSPLcom/android/server/wm/Transition;->updateTransientFlags(Lcom/android/server/wm/Transition$ChangeInfo;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;
+HSPLcom/android/server/wm/TransitionController$Logger;->buildOnFinishLog()Ljava/lang/String;
 HPLcom/android/server/wm/TransitionController$Logger;->buildOnSendLog()Ljava/lang/String;
 HPLcom/android/server/wm/TransitionController$Logger;->logOnSend()V
-HSPLcom/android/server/wm/TransitionController$RemotePlayer;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
-HSPLcom/android/server/wm/TransitionController$TransitionMetricsReporter;-><init>()V
-HSPLcom/android/server/wm/TransitionController;-><clinit>()V
-HSPLcom/android/server/wm/TransitionController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
 HSPLcom/android/server/wm/TransitionController;->canAssignLayers(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
-HPLcom/android/server/wm/TransitionController;->finishTransition(Lcom/android/server/wm/Transition;)V
+HSPLcom/android/server/wm/TransitionController;->finishTransition(Lcom/android/server/wm/Transition;)V
 HSPLcom/android/server/wm/TransitionController;->inCollectingTransition(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/TransitionController;->inPlayingTransition(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/wm/TransitionController;->inTransition()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/TransitionController;->inTransition()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/TransitionController;->inTransition(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
 HSPLcom/android/server/wm/TransitionController;->isCollecting()Z
-HPLcom/android/server/wm/TransitionController;->isCollecting(Lcom/android/server/wm/WindowContainer;)Z
+HSPLcom/android/server/wm/TransitionController;->isCollecting(Lcom/android/server/wm/WindowContainer;)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/TransitionController;->isPlaying()Z+]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/TransitionController;->isShellTransitionsEnabled()Z
-HPLcom/android/server/wm/TransitionController;->isTransientCollect(Lcom/android/server/wm/ActivityRecord;)Z
-HPLcom/android/server/wm/TransitionController;->isTransientLaunch(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/TransitionController;->isTransientCollect(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;
+HSPLcom/android/server/wm/TransitionController;->isTransientLaunch(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/TransitionController;->isTransientVisible(Lcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/TransitionController;->isTransitionOnDisplay(Lcom/android/server/wm/DisplayContent;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/TransitionController;->moveToCollecting(Lcom/android/server/wm/Transition;)V
-HPLcom/android/server/wm/TransitionController;->moveToPlaying(Lcom/android/server/wm/Transition;)V
+HSPLcom/android/server/wm/TransitionController;->moveToPlaying(Lcom/android/server/wm/Transition;)V
 HSPLcom/android/server/wm/TransitionController;->requestStartTransition(Lcom/android/server/wm/Transition;Lcom/android/server/wm/Task;Landroid/window/RemoteTransition;Landroid/window/TransitionRequestInfo$DisplayChange;)Lcom/android/server/wm/Transition;
-HPLcom/android/server/wm/TransitionController;->shouldKeepFocus(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/wm/TransitionController;->updateAnimatingState()V
-HPLcom/android/server/wm/TransitionController;->updateRunningRemoteAnimation(Lcom/android/server/wm/Transition;Z)V
-HSPLcom/android/server/wm/TransitionController;->useShellTransitionsRotation()Z
-HPLcom/android/server/wm/TransitionController;->validateStates()V
-HPLcom/android/server/wm/VisibleActivityProcessTracker$CpuTimeRecord;->run()V
-HSPLcom/android/server/wm/VisibleActivityProcessTracker;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
+HSPLcom/android/server/wm/TransitionController;->shouldKeepFocus(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/TransitionController;->updateAnimatingState()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/SnapshotController;Lcom/android/server/wm/SnapshotController;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/TransitionController;->updateRunningRemoteAnimation(Lcom/android/server/wm/Transition;Z)V+]Lcom/android/server/wm/TransitionController$RemotePlayer;Lcom/android/server/wm/TransitionController$RemotePlayer;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/TransitionController;->useShellTransitionsRotation()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
+HSPLcom/android/server/wm/TransitionController;->validateStates()V
+HSPLcom/android/server/wm/VisibleActivityProcessTracker$CpuTimeRecord;->run()V
 HSPLcom/android/server/wm/VisibleActivityProcessTracker;->hasVisibleActivity(I)Z
 HSPLcom/android/server/wm/VisibleActivityProcessTracker;->match(ILjava/util/function/Predicate;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Predicate;Lcom/android/server/wm/VisibleActivityProcessTracker$$ExternalSyntheticLambda0;
 HSPLcom/android/server/wm/VisibleActivityProcessTracker;->removeProcess(Lcom/android/server/wm/WindowProcessController;)Lcom/android/server/wm/VisibleActivityProcessTracker$CpuTimeRecord;
-HSPLcom/android/server/wm/VrController$1;-><init>(Lcom/android/server/wm/VrController;)V
-HSPLcom/android/server/wm/VrController;-><clinit>()V
-HSPLcom/android/server/wm/VrController;-><init>(Ljava/lang/Object;)V
-HPLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;->reset()V
-HPLcom/android/server/wm/WallpaperController;->adjustWallpaperWindows()V
+HPLcom/android/server/wm/WallpaperController$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V
+HSPLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;->getTopWallpaper(Z)Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;->reset()V
+HSPLcom/android/server/wm/WallpaperController;->adjustWallpaperWindows()V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HPLcom/android/server/wm/WallpaperController;->computeLastWallpaperZoomOut()V
-HPLcom/android/server/wm/WallpaperController;->findWallpaperTarget()V
-HPLcom/android/server/wm/WallpaperController;->getDisplayWidthOffset(ILandroid/graphics/Rect;Z)I+]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Landroid/graphics/Rect;Landroid/graphics/Rect;
-HPLcom/android/server/wm/WallpaperController;->getTokenForTarget(Lcom/android/server/wm/WindowState;)Lcom/android/server/wm/WallpaperWindowToken;
-HPLcom/android/server/wm/WallpaperController;->hideWallpapers(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/wm/WallpaperController;->isBackNavigationTarget(Lcom/android/server/wm/WindowState;)Z
-HPLcom/android/server/wm/WallpaperController;->isRecentsTransitionTarget(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
+HSPLcom/android/server/wm/WallpaperController;->findWallpaperTarget()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/WallpaperController;->findWallpapers()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/WallpaperController;->getDisplayWidthOffset(ILandroid/graphics/Rect;Z)I+]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Landroid/graphics/Rect;Landroid/graphics/Rect;
+HSPLcom/android/server/wm/WallpaperController;->hideWallpapers(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/WallpaperController;->isRecentsTransitionTarget(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
 HSPLcom/android/server/wm/WallpaperController;->isWallpaperTarget(Lcom/android/server/wm/WindowState;)Z
 HSPLcom/android/server/wm/WallpaperController;->isWallpaperVisible()Z+]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/wm/WallpaperController;->lambda$new$0(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/AnimationAdapter;Lcom/android/server/wm/BackNavigationController$AnimationHandler$BackWindowAnimationAdaptor;
+HSPLcom/android/server/wm/WallpaperController;->lambda$new$0(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/AnimationAdapter;Lcom/android/server/wm/BackNavigationController$AnimationHandler$BackWindowAnimationAdaptor;
+HPLcom/android/server/wm/WallpaperController;->lambda$new$1(Lcom/android/server/wm/WindowState;)V
 HPLcom/android/server/wm/WallpaperController;->setWallpaperZoomOut(Lcom/android/server/wm/WindowState;F)V+]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
-HPLcom/android/server/wm/WallpaperController;->updateWallpaperOffset(Lcom/android/server/wm/WindowState;Z)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;
-HPLcom/android/server/wm/WallpaperController;->updateWallpaperOffsetLocked(Lcom/android/server/wm/WindowState;Z)V
-HPLcom/android/server/wm/WallpaperController;->updateWallpaperTokens(ZZ)V
-HPLcom/android/server/wm/WallpaperController;->updateWallpaperWindowsTarget(Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;)V
-HPLcom/android/server/wm/WallpaperController;->zoomOutToScale(F)F
-HPLcom/android/server/wm/WallpaperVisibilityListeners;->notifyWallpaperVisibilityChanged(Lcom/android/server/wm/DisplayContent;)V
-HPLcom/android/server/wm/WallpaperWindowToken;->commitVisibility(Z)V+]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;
-HPLcom/android/server/wm/WallpaperWindowToken;->isVisible()Z+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken;
-HPLcom/android/server/wm/WallpaperWindowToken;->setVisibility(Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;
-HPLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperOffset(Z)V+]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HPLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperWindows(Z)V
+HSPLcom/android/server/wm/WallpaperController;->updateWallpaperOffset(Lcom/android/server/wm/WindowState;Z)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/wm/WallpaperController;->updateWallpaperOffsetLocked(Lcom/android/server/wm/WindowState;Z)V
+HSPLcom/android/server/wm/WallpaperController;->updateWallpaperTokens(ZZ)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/WallpaperController;->updateWallpaperWindowsTarget(Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WallpaperVisibilityListeners;->notifyWallpaperVisibilityChanged(Lcom/android/server/wm/DisplayContent;)V
+HSPLcom/android/server/wm/WallpaperWindowToken;->commitVisibility(Z)V+]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;
+HSPLcom/android/server/wm/WallpaperWindowToken;->isVisible()Z+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken;
+HSPLcom/android/server/wm/WallpaperWindowToken;->setVisibility(Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;
+HSPLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperOffset(Z)V+]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperWindows(Z)V+]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
 HPLcom/android/server/wm/WindowAnimationSpec;-><init>(Landroid/view/animation/Animation;Landroid/graphics/Point;Landroid/graphics/Rect;ZIZF)V
-HPLcom/android/server/wm/WindowAnimationSpec;->apply(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;J)V
+HPLcom/android/server/wm/WindowAnimationSpec;->apply(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;J)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/view/animation/Transformation;Landroid/view/animation/Transformation;]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;]Landroid/view/animation/Animation;Landroid/view/animation/AnimationSet;,Landroid/view/animation/TranslateAnimation;,Landroid/view/animation/AlphaAnimation;
 HSPLcom/android/server/wm/WindowAnimator$$ExternalSyntheticLambda1;->doFrame(J)V
 HSPLcom/android/server/wm/WindowAnimator;->$r8$lambda$AS_wbK9i-bc6ocCFop7s9PnXP80(Lcom/android/server/wm/WindowAnimator;J)V
 HPLcom/android/server/wm/WindowAnimator;->addAfterPrepareSurfacesRunnable(Ljava/lang/Runnable;)V
 HSPLcom/android/server/wm/WindowAnimator;->animate(J)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator;]Lcom/android/server/wm/AccessibilityController;Lcom/android/server/wm/AccessibilityController;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Lcom/android/server/wm/TaskOrganizerController;Lcom/android/server/wm/TaskOrganizerController;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowTracing;Lcom/android/server/wm/WindowTracing;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/WindowAnimator;->cancelAnimation()V
-HSPLcom/android/server/wm/WindowAnimator;->executeAfterPrepareSurfacesRunnables()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/Runnable;Lcom/android/server/wm/InsetsStateController$$ExternalSyntheticLambda0;
+HSPLcom/android/server/wm/WindowAnimator;->executeAfterPrepareSurfacesRunnables()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/Runnable;Lcom/android/server/wm/InsetsStateController$$ExternalSyntheticLambda0;,Lcom/android/server/wm/BackNavigationController$$ExternalSyntheticLambda9;
 HSPLcom/android/server/wm/WindowAnimator;->lambda$new$1(J)V+]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator;
 HSPLcom/android/server/wm/WindowAnimator;->scheduleAnimation()V+]Landroid/view/Choreographer;Landroid/view/Choreographer;
-HSPLcom/android/server/wm/WindowContainer$$ExternalSyntheticLambda3;-><init>()V
-HPLcom/android/server/wm/WindowContainer$$ExternalSyntheticLambda3;->test(Ljava/lang/Object;)Z
 HSPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->apply(Lcom/android/server/wm/WindowState;)Z+]Ljava/util/function/Consumer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->apply(Ljava/lang/Object;)Z+]Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;
 HSPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->release()V+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool;
 HSPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->setConsumer(Ljava/util/function/Consumer;)V
-HPLcom/android/server/wm/WindowContainer$RemoteToken;->toString()Ljava/lang/String;
+HPLcom/android/server/wm/WindowContainer$RemoteToken;->toString()Ljava/lang/String;+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;
 HSPLcom/android/server/wm/WindowContainer$RemoteToken;->toWindowContainerToken()Landroid/window/WindowContainerToken;
 HSPLcom/android/server/wm/WindowContainer;->-$$Nest$fgetmConsumerWrapperPool(Lcom/android/server/wm/WindowContainer;)Landroid/util/Pools$SynchronizedPool;
-HSPLcom/android/server/wm/WindowContainer;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+HSPLcom/android/server/wm/WindowContainer;-><init>(Lcom/android/server/wm/WindowManagerService;)V+]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda23;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HSPLcom/android/server/wm/WindowContainer;->addChild(Lcom/android/server/wm/WindowContainer;I)V
-HSPLcom/android/server/wm/WindowContainer;->addChild(Lcom/android/server/wm/WindowContainer;Ljava/util/Comparator;)V
+HSPLcom/android/server/wm/WindowContainer;->addChild(Lcom/android/server/wm/WindowContainer;Ljava/util/Comparator;)V+]Ljava/util/Comparator;Lcom/android/server/wm/WindowState$1;,Lcom/android/server/wm/WindowToken$$ExternalSyntheticLambda0;,Ljava/util/Comparator$$ExternalSyntheticLambda0;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->asDisplayArea()Lcom/android/server/wm/DisplayArea;
 HSPLcom/android/server/wm/WindowContainer;->asTask()Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/WindowContainer;->asTaskDisplayArea()Lcom/android/server/wm/TaskDisplayArea;
 HSPLcom/android/server/wm/WindowContainer;->asTaskFragment()Lcom/android/server/wm/TaskFragment;
 HSPLcom/android/server/wm/WindowContainer;->asWallpaperToken()Lcom/android/server/wm/WallpaperWindowToken;
 HSPLcom/android/server/wm/WindowContainer;->asWindowState()Lcom/android/server/wm/WindowState;
-HSPLcom/android/server/wm/WindowContainer;->assignChildLayers()V
+HSPLcom/android/server/wm/WindowContainer;->assignChildLayers()V+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->assignLayer(Landroid/view/SurfaceControl$Transaction;I)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
-HPLcom/android/server/wm/WindowContainer;->assignRelativeLayer(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;IZ)V
+HPLcom/android/server/wm/WindowContainer;->assignRelativeLayer(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;IZ)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent$ImeContainer;
 HSPLcom/android/server/wm/WindowContainer;->cancelAnimation()V
-HPLcom/android/server/wm/WindowContainer;->compareTo(Lcom/android/server/wm/WindowContainer;)I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WindowState;]Ljava/util/LinkedList;Ljava/util/LinkedList;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/WindowContainer;->compareTo(Lcom/android/server/wm/WindowContainer;)I+]Ljava/util/LinkedList;Ljava/util/LinkedList;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowContainer;->createMergedSparseArray(Landroid/util/SparseArray;Landroid/util/SparseArray;)Landroid/util/SparseArray;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/wm/WindowContainer;->doAnimationFinished(ILcom/android/server/wm/AnimationAdapter;)V
+HSPLcom/android/server/wm/WindowContainer;->createSurfaceControl(Z)V
+HSPLcom/android/server/wm/WindowContainer;->doAnimationFinished(ILcom/android/server/wm/AnimationAdapter;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowContainer;->finishSync(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;Z)V+]Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->forAllActivities(Ljava/util/function/Consumer;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->forAllActivities(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HSPLcom/android/server/wm/WindowContainer;->forAllActivities(Ljava/util/function/Predicate;)Z
+HSPLcom/android/server/wm/WindowContainer;->forAllActivities(Ljava/util/function/Predicate;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/WindowContainer;->forAllActivities(Ljava/util/function/Predicate;Z)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->forAllLeafTaskFragments(Ljava/util/function/Predicate;)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->forAllLeafTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
@@ -11281,7 +8599,7 @@
 HSPLcom/android/server/wm/WindowContainer;->forAllTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->forAllWindows(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;
-HSPLcom/android/server/wm/WindowContainer;->getActivity(Ljava/util/function/Predicate;)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/RootWindowContainer;,Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/WindowContainer;->getActivity(Ljava/util/function/Predicate;)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/WindowContainer;->getActivity(Ljava/util/function/Predicate;Lcom/android/server/wm/WindowContainer;ZZ)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;
 HSPLcom/android/server/wm/WindowContainer;->getActivity(Ljava/util/function/Predicate;Lcom/android/server/wm/WindowContainer;ZZ[Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->getActivity(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;megamorphic_types
@@ -11290,98 +8608,97 @@
 HSPLcom/android/server/wm/WindowContainer;->getAnimatingContainer(II)Lcom/android/server/wm/WindowContainer;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->getChildAt(I)Lcom/android/server/wm/WindowContainer;+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->getChildCount()I+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HPLcom/android/server/wm/WindowContainer;->getControllableInsetProvider()Lcom/android/server/wm/InsetsSourceProvider;
+HSPLcom/android/server/wm/WindowContainer;->getControllableInsetProvider()Lcom/android/server/wm/InsetsSourceProvider;
 HSPLcom/android/server/wm/WindowContainer;->getDisplayArea()Lcom/android/server/wm/DisplayArea;+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
 HPLcom/android/server/wm/WindowContainer;->getInsetsSourceProviders()Landroid/util/SparseArray;
 HSPLcom/android/server/wm/WindowContainer;->getItemFromTaskDisplayAreas(Ljava/util/function/Function;)Ljava/lang/Object;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/WindowContainer;->getLastOrientationSource()Lcom/android/server/wm/WindowContainer;+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->getOrientation()I
-HSPLcom/android/server/wm/WindowContainer;->getOrientation(I)I+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Ljava/lang/Object;megamorphic_types
+HSPLcom/android/server/wm/WindowContainer;->getOrientation(I)I+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/lang/Object;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->getOverrideOrientation()I
+HSPLcom/android/server/wm/WindowContainer;->getParent()Lcom/android/server/wm/ConfigurationContainer;
 HSPLcom/android/server/wm/WindowContainer;->getParent()Lcom/android/server/wm/WindowContainer;
-HPLcom/android/server/wm/WindowContainer;->getParentSurfaceControl()Landroid/view/SurfaceControl;
+HPLcom/android/server/wm/WindowContainer;->getParentSurfaceControl()Landroid/view/SurfaceControl;+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->getPendingTransaction()Landroid/view/SurfaceControl$Transaction;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;
-HPLcom/android/server/wm/WindowContainer;->getPrefixOrderIndex(Lcom/android/server/wm/WindowContainer;)I+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HSPLcom/android/server/wm/WindowContainer;->getRelativeDisplayRotation()I
+HSPLcom/android/server/wm/WindowContainer;->getPrefixOrderIndex(Lcom/android/server/wm/WindowContainer;)I+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/WindowContainer;->getRelativeDisplayRotation()I+]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
 HSPLcom/android/server/wm/WindowContainer;->getRelativePosition(Landroid/graphics/Point;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->getRelativePosition(Landroid/graphics/Rect;Landroid/graphics/Point;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/graphics/Point;Landroid/graphics/Point;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types
-HSPLcom/android/server/wm/WindowContainer;->getRequestedConfigurationOrientation(ZI)I
 HSPLcom/android/server/wm/WindowContainer;->getRootDisplayArea()Lcom/android/server/wm/RootDisplayArea;+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->getRootTask(Ljava/util/function/Predicate;)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowContainer;->getRootTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HSPLcom/android/server/wm/WindowContainer;->getSession()Landroid/view/SurfaceSession;
+HSPLcom/android/server/wm/WindowContainer;->getSession()Landroid/view/SurfaceSession;+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->getSurfaceControl()Landroid/view/SurfaceControl;
 HSPLcom/android/server/wm/WindowContainer;->getSyncGroup()Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;
 HSPLcom/android/server/wm/WindowContainer;->getSyncTransaction()Landroid/view/SurfaceControl$Transaction;+]Lcom/android/server/wm/WindowContainer;megamorphic_types
-HSPLcom/android/server/wm/WindowContainer;->getTask(Ljava/util/function/Predicate;)Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/WindowContainer;->getTask(Ljava/util/function/Predicate;)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/WindowContainer;->getTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->getTaskFragment(Ljava/util/function/Predicate;)Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->getTopChild()Lcom/android/server/wm/WindowContainer;+]Lcom/android/server/wm/WindowList;Lcom/android/server/wm/WindowList;
-HSPLcom/android/server/wm/WindowContainer;->getTopMostActivity()Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/WindowContainer;->getTopMostTask()Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/WindowContainer;->getTopMostActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;
+HSPLcom/android/server/wm/WindowContainer;->getTopMostTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;
 HSPLcom/android/server/wm/WindowContainer;->getWindow(Ljava/util/function/Predicate;)Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HPLcom/android/server/wm/WindowContainer;->hasActivity()Z
-HSPLcom/android/server/wm/WindowContainer;->hasChild(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HPLcom/android/server/wm/WindowContainer;->hasContentToDisplay()Z
+HSPLcom/android/server/wm/WindowContainer;->hasActivity()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/WindowContainer;->hasChild(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/ActivityRecord;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/WindowContainer;->hasContentToDisplay()Z
 HSPLcom/android/server/wm/WindowContainer;->hasInsetsSourceProvider()Z
 HSPLcom/android/server/wm/WindowContainer;->inTransition()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
 HSPLcom/android/server/wm/WindowContainer;->inTransitionSelfOrParent()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
 HSPLcom/android/server/wm/WindowContainer;->isAnimating(I)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowContainer;->isAnimating(II)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types
-HPLcom/android/server/wm/WindowContainer;->isAttached()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types
+HSPLcom/android/server/wm/WindowContainer;->isAttached()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->isClosingWhenResizing()Z
-HPLcom/android/server/wm/WindowContainer;->isDescendantOf(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types
+HSPLcom/android/server/wm/WindowContainer;->isDescendantOf(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->isExitAnimationRunningSelfOrChild()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->isFocusable()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->isOnTop()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/RootWindowContainer;
-HSPLcom/android/server/wm/WindowContainer;->isOrganized()Z
 HSPLcom/android/server/wm/WindowContainer;->isSelfAnimating(II)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;
 HSPLcom/android/server/wm/WindowContainer;->isSyncFinished(Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;)Z+]Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->isVisible()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->isVisibleRequested()Z
 HSPLcom/android/server/wm/WindowContainer;->isWaitingForTransitionStart()Z
-HPLcom/android/server/wm/WindowContainer;->makeAnimationLeash()Landroid/view/SurfaceControl$Builder;
+HSPLcom/android/server/wm/WindowContainer;->makeAnimationLeash()Landroid/view/SurfaceControl$Builder;+]Landroid/view/SurfaceControl$Builder;Landroid/view/SurfaceControl$Builder;]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->makeChildSurface(Lcom/android/server/wm/WindowContainer;)Landroid/view/SurfaceControl$Builder;+]Landroid/view/SurfaceControl$Builder;Landroid/view/SurfaceControl$Builder;]Lcom/android/server/wm/WindowContainer;megamorphic_types
-HSPLcom/android/server/wm/WindowContainer;->makeSurface()Landroid/view/SurfaceControl$Builder;
+HSPLcom/android/server/wm/WindowContainer;->makeSurface()Landroid/view/SurfaceControl$Builder;+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->needsZBoost()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->obtainConsumerWrapper(Ljava/util/function/Consumer;)Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;+]Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool;
-HSPLcom/android/server/wm/WindowContainer;->okToAnimate()Z
-HSPLcom/android/server/wm/WindowContainer;->okToAnimate(ZZ)Z
+HSPLcom/android/server/wm/WindowContainer;->okToAnimate()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types
+HSPLcom/android/server/wm/WindowContainer;->okToAnimate(ZZ)Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HPLcom/android/server/wm/WindowContainer;->onAnimationLeashCreated(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;)V
-HPLcom/android/server/wm/WindowContainer;->onAnimationLeashLost(Landroid/view/SurfaceControl$Transaction;)V
+HPLcom/android/server/wm/WindowContainer;->onAnimationLeashLost(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/SurfaceAnimationRunner;Lcom/android/server/wm/SurfaceAnimationRunner;
 HSPLcom/android/server/wm/WindowContainer;->onChildAdded(Lcom/android/server/wm/WindowContainer;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->onChildRemoved(Lcom/android/server/wm/WindowContainer;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->onChildVisibilityRequested(Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/SurfaceFreezer;Lcom/android/server/wm/SurfaceFreezer;
 HSPLcom/android/server/wm/WindowContainer;->onChildVisibleRequestedChanged(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HSPLcom/android/server/wm/WindowContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+HSPLcom/android/server/wm/WindowContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/wm/WindowContainerListener;Lcom/android/server/wm/WindowContextListenerController$WindowContextListenerImpl;,Lcom/android/server/wm/DisplayContent$2;,Lcom/android/server/wm/WindowContainer$2;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HSPLcom/android/server/wm/WindowContainer;->onParentChanged(Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ConfigurationContainer;)V
-HSPLcom/android/server/wm/WindowContainer;->onSyncReparent(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowContainer;)V
+HSPLcom/android/server/wm/WindowContainer;->onParentChanged(Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ConfigurationContainer;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types
+HSPLcom/android/server/wm/WindowContainer;->onSyncReparent(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowContainer;)V+]Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
 HSPLcom/android/server/wm/WindowContainer;->onUnfrozen()V
-HSPLcom/android/server/wm/WindowContainer;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V
+HSPLcom/android/server/wm/WindowContainer;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/WindowList;Lcom/android/server/wm/WindowList;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->prepareSurfaces()V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContainer;->prepareSync()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types
-HSPLcom/android/server/wm/WindowContainer;->processGetActivityWithBoundary(Ljava/util/function/Predicate;Lcom/android/server/wm/WindowContainer;ZZ[ZLcom/android/server/wm/WindowContainer;)Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/WindowContainer;->processGetActivityWithBoundary(Ljava/util/function/Predicate;Lcom/android/server/wm/WindowContainer;ZZ[ZLcom/android/server/wm/WindowContainer;)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;
 HSPLcom/android/server/wm/WindowContainer;->providesOrientation()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types
-HSPLcom/android/server/wm/WindowContainer;->reassignLayer(Landroid/view/SurfaceControl$Transaction;)V
+HSPLcom/android/server/wm/WindowContainer;->reassignLayer(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/DisplayArea$Tokens;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowContainer;->registerWindowContainerListener(Lcom/android/server/wm/WindowContainerListener;Z)V
-HSPLcom/android/server/wm/WindowContainer;->removeChild(Lcom/android/server/wm/WindowContainer;)V
-HSPLcom/android/server/wm/WindowContainer;->removeImmediately()V
-HPLcom/android/server/wm/WindowContainer;->resetSurfacePositionForAnimationLeash(Landroid/view/SurfaceControl$Transaction;)V
+HSPLcom/android/server/wm/WindowContainer;->removeChild(Lcom/android/server/wm/WindowContainer;)V+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/WindowContainer;->removeImmediately()V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/SurfaceFreezer;Lcom/android/server/wm/SurfaceFreezer;]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/wm/WindowList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/WindowContainerListener;Lcom/android/server/wm/WindowContextListenerController$WindowContextListenerImpl;,Lcom/android/server/wm/DisplayContent$2;,Lcom/android/server/wm/WindowContainer$2;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HPLcom/android/server/wm/WindowContainer;->resetSurfacePositionForAnimationLeash(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
 HSPLcom/android/server/wm/WindowContainer;->scheduleAnimation()V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
-HSPLcom/android/server/wm/WindowContainer;->sendAppVisibilityToClients()V
-HSPLcom/android/server/wm/WindowContainer;->setInitialSurfaceControlProperties(Landroid/view/SurfaceControl$Builder;)V
-HSPLcom/android/server/wm/WindowContainer;->setParent(Lcom/android/server/wm/WindowContainer;)V
+HSPLcom/android/server/wm/WindowContainer;->sendAppVisibilityToClients()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HSPLcom/android/server/wm/WindowContainer;->setInitialSurfaceControlProperties(Landroid/view/SurfaceControl$Builder;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/view/SurfaceControl$Builder;Landroid/view/SurfaceControl$Builder;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
+HSPLcom/android/server/wm/WindowContainer;->setParent(Lcom/android/server/wm/WindowContainer;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;
+HSPLcom/android/server/wm/WindowContainer;->setSurfaceControl(Landroid/view/SurfaceControl;)V
 HSPLcom/android/server/wm/WindowContainer;->setSyncGroup(Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;)V
 HSPLcom/android/server/wm/WindowContainer;->setVisibleRequested(Z)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/server/wm/WindowContainerListener;Lcom/android/server/wm/WindowContextListenerController$WindowContextListenerImpl;,Lcom/android/server/wm/DisplayContent$2;
 HSPLcom/android/server/wm/WindowContainer;->showWallpaper()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HPLcom/android/server/wm/WindowContainer;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;ZILcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;Ljava/lang/Runnable;Lcom/android/server/wm/AnimationAdapter;)V
-HSPLcom/android/server/wm/WindowContainer;->syncNextBuffer()Z
+HPLcom/android/server/wm/WindowContainer;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;ZILcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;Ljava/lang/Runnable;Lcom/android/server/wm/AnimationAdapter;)V+]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;
 HSPLcom/android/server/wm/WindowContainer;->updateAboveInsetsState(Landroid/view/InsetsState;Landroid/util/SparseArray;Landroid/util/ArraySet;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HPLcom/android/server/wm/WindowContainer;->updateOverlayInsetsState(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types
-HSPLcom/android/server/wm/WindowContainer;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V
+HSPLcom/android/server/wm/WindowContainer;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/SurfaceFreezer;Lcom/android/server/wm/SurfaceFreezer;]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
 HSPLcom/android/server/wm/WindowContainer;->updateSurfacePositionNonOrganized()V+]Lcom/android/server/wm/WindowContainer;megamorphic_types
 HSPLcom/android/server/wm/WindowContainer;->waitForSyncTransactionCommit(Landroid/util/ArraySet;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowContextListenerController$WindowContextListenerImpl;-><init>(Lcom/android/server/wm/WindowContextListenerController;Lcom/android/server/wm/WindowProcessController;Landroid/os/IBinder;Lcom/android/server/wm/WindowContainer;ILandroid/os/Bundle;)V
@@ -11390,94 +8707,90 @@
 HSPLcom/android/server/wm/WindowFrames;->didFrameSizeChange()Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;
 HSPLcom/android/server/wm/WindowFrames;->hasContentChanged()Z
 HSPLcom/android/server/wm/WindowFrames;->hasInsetsChanged()Z
-HPLcom/android/server/wm/WindowFrames;->parentFrameWasClippedByDisplayCutout()Z
+HSPLcom/android/server/wm/WindowFrames;->onResizeHandled()V
+HSPLcom/android/server/wm/WindowFrames;->parentFrameWasClippedByDisplayCutout()Z
 HSPLcom/android/server/wm/WindowFrames;->setContentChanged(Z)V
 HSPLcom/android/server/wm/WindowFrames;->setParentFrameWasClippedByDisplayCutout(Z)V
-HSPLcom/android/server/wm/WindowFrames;->setReportResizeHints()Z
+HSPLcom/android/server/wm/WindowFrames;->setReportResizeHints()Z+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;
 HSPLcom/android/server/wm/WindowList;->peekLast()Ljava/lang/Object;+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HSPLcom/android/server/wm/WindowManagerGlobalLock;-><init>()V
 HSPLcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda23;->get()Ljava/lang/Object;
 HSPLcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda24;->apply(Ljava/lang/Object;)Ljava/lang/Object;
 HPLcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda2;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;ZZ)V
-HPLcom/android/server/wm/WindowManagerService$4;->onAppTransitionFinishedLocked(Landroid/os/IBinder;)V
-HPLcom/android/server/wm/WindowManagerService$H;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/WindowManagerService$4;->onAppTransitionFinishedLocked(Landroid/os/IBinder;)V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;
+HSPLcom/android/server/wm/WindowManagerService$H;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
 HPLcom/android/server/wm/WindowManagerService$LocalService;->hasInputMethodClientFocus(Landroid/os/IBinder;III)I
 HPLcom/android/server/wm/WindowManagerService$LocalService;->isHardKeyboardAvailable()Z
 HPLcom/android/server/wm/WindowManagerService$LocalService;->isKeyguardShowingAndNotOccluded()Z+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
-HSPLcom/android/server/wm/WindowManagerService$LocalService;->requestTraversalFromDisplayManager()V
+HSPLcom/android/server/wm/WindowManagerService$LocalService;->requestTraversalFromDisplayManager()V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
 HPLcom/android/server/wm/WindowManagerService$LocalService;->updateInputMethodTargetWindow(Landroid/os/IBinder;Landroid/os/IBinder;)V
-HSPLcom/android/server/wm/WindowManagerService;-><clinit>()V
 HSPLcom/android/server/wm/WindowManagerService;->addWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;Landroid/view/WindowManager$LayoutParams;IIIILandroid/view/InputChannel;Landroid/view/InsetsState;Landroid/view/InsetsSourceControl$Array;Landroid/graphics/Rect;[F)I
+HSPLcom/android/server/wm/WindowManagerService;->attachWindowContextToDisplayArea(Landroid/app/IApplicationThread;Landroid/os/IBinder;IILandroid/os/Bundle;)Landroid/window/WindowContextInfo;
 HSPLcom/android/server/wm/WindowManagerService;->boostPriorityForLockedSection()V+]Lcom/android/server/wm/WindowManagerThreadPriorityBooster;Lcom/android/server/wm/WindowManagerThreadPriorityBooster;
 HSPLcom/android/server/wm/WindowManagerService;->checkDrawnWindowsLocked()V+]Landroid/os/Handler;Lcom/android/server/wm/WindowManagerService$H;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/wm/WindowManagerService;->createSurfaceControl(Landroid/view/SurfaceControl;ILcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;)I
-HPLcom/android/server/wm/WindowManagerService;->dipToPixel(ILandroid/util/DisplayMetrics;)I
+HSPLcom/android/server/wm/WindowManagerService;->createSurfaceControl(Landroid/view/SurfaceControl;ILcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;)I+]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController;
+HSPLcom/android/server/wm/WindowManagerService;->dipToPixel(ILandroid/util/DisplayMetrics;)I
 HPLcom/android/server/wm/WindowManagerService;->dispatchImeInputTargetVisibilityChanged(Landroid/os/IBinder;ZZ)V
 HSPLcom/android/server/wm/WindowManagerService;->enableScreenIfNeededLocked()V+]Ljava/lang/RuntimeException;Ljava/lang/RuntimeException;]Landroid/os/Handler;Lcom/android/server/wm/WindowManagerService$H;
-HSPLcom/android/server/wm/WindowManagerService;->finishDrawingWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;Landroid/view/SurfaceControl$Transaction;I)V
+HSPLcom/android/server/wm/WindowManagerService;->finishDrawingWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;Landroid/view/SurfaceControl$Transaction;I)V+]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;
 HSPLcom/android/server/wm/WindowManagerService;->getDefaultDisplayContentLocked()Lcom/android/server/wm/DisplayContent;+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HSPLcom/android/server/wm/WindowManagerService;->getDisplayContentOrCreate(ILandroid/os/IBinder;)Lcom/android/server/wm/DisplayContent;+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
 HPLcom/android/server/wm/WindowManagerService;->getInputTargetFromToken(Landroid/os/IBinder;)Lcom/android/server/wm/InputTarget;+]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/wm/EmbeddedWindowController;Lcom/android/server/wm/EmbeddedWindowController;
-HSPLcom/android/server/wm/WindowManagerService;->getInsetsSourceControls(Lcom/android/server/wm/WindowState;Landroid/view/InsetsSourceControl$Array;)V
+HSPLcom/android/server/wm/WindowManagerService;->getInsetsSourceControls(Lcom/android/server/wm/WindowState;Landroid/view/InsetsSourceControl$Array;)V+]Landroid/view/InsetsSourceControl$Array;Landroid/view/InsetsSourceControl$Array;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowManagerService;->getRecentsAnimationController()Lcom/android/server/wm/RecentsAnimationController;
-HSPLcom/android/server/wm/WindowManagerService;->getWindowInsets(ILandroid/os/IBinder;Landroid/view/InsetsState;)Z
+HSPLcom/android/server/wm/WindowManagerService;->getWindowInsets(ILandroid/os/IBinder;Landroid/view/InsetsState;)Z+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
 HSPLcom/android/server/wm/WindowManagerService;->hasNavigationBar(I)Z
 HSPLcom/android/server/wm/WindowManagerService;->isKeyguardLocked()Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;
 HSPLcom/android/server/wm/WindowManagerService;->isKeyguardSecure(I)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;
 HPLcom/android/server/wm/WindowManagerService;->isKeyguardShowingAndNotOccluded()Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;
 HSPLcom/android/server/wm/WindowManagerService;->isUserVisible(I)Z+]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;
-HSPLcom/android/server/wm/WindowManagerService;->makeSurfaceBuilder(Landroid/view/SurfaceSession;)Landroid/view/SurfaceControl$Builder;
+HSPLcom/android/server/wm/WindowManagerService;->makeSurfaceBuilder(Landroid/view/SurfaceSession;)Landroid/view/SurfaceControl$Builder;+]Ljava/util/function/Function;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda24;
 HSPLcom/android/server/wm/WindowManagerService;->mapOrientationRequest(I)I
-HPLcom/android/server/wm/WindowManagerService;->onAnimationFinished()V
-HPLcom/android/server/wm/WindowManagerService;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V
+HSPLcom/android/server/wm/WindowManagerService;->onAnimationFinished()V
+HPLcom/android/server/wm/WindowManagerService;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
 HPLcom/android/server/wm/WindowManagerService;->postWindowRemoveCleanupLocked(Lcom/android/server/wm/WindowState;)V
-HSPLcom/android/server/wm/WindowManagerService;->relayoutWindow(Lcom/android/server/wm/Session;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
-HPLcom/android/server/wm/WindowManagerService;->reportFocusChanged(Landroid/os/IBinder;Landroid/os/IBinder;)V
-HPLcom/android/server/wm/WindowManagerService;->reportSystemGestureExclusionChanged(Lcom/android/server/wm/Session;Landroid/view/IWindow;Ljava/util/List;)V
-HSPLcom/android/server/wm/WindowManagerService;->requestTraversal()V
+HSPLcom/android/server/wm/WindowManagerService;->relayoutWindow(Lcom/android/server/wm/Session;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+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/DisplayWindowPolicyControllerHelper;Lcom/android/server/wm/DisplayWindowPolicyControllerHelper;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Landroid/view/InsetsSourceControl$Array;Landroid/view/InsetsSourceControl$Array;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/UnknownAppVisibilityController;Lcom/android/server/wm/UnknownAppVisibilityController;]Landroid/view/InsetsFrameProvider;Landroid/view/InsetsFrameProvider;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Ljava/lang/RuntimeException;Ljava/lang/RuntimeException;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HPLcom/android/server/wm/WindowManagerService;->reportFocusChanged(Landroid/os/IBinder;Landroid/os/IBinder;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/AnrController;Lcom/android/server/wm/AnrController;]Lcom/android/server/wm/InputTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/EmbeddedWindowController$EmbeddedWindow;
+HPLcom/android/server/wm/WindowManagerService;->reportSystemGestureExclusionChanged(Lcom/android/server/wm/Session;Landroid/view/IWindow;Ljava/util/List;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/WindowManagerService;->requestTraversal()V+]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;
 HSPLcom/android/server/wm/WindowManagerService;->resetPriorityAfterLockedSection()V+]Lcom/android/server/wm/WindowManagerThreadPriorityBooster;Lcom/android/server/wm/WindowManagerThreadPriorityBooster;
 HSPLcom/android/server/wm/WindowManagerService;->scheduleAnimationLocked()V+]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator;
-HSPLcom/android/server/wm/WindowManagerService;->setInsetsWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
+HSPLcom/android/server/wm/WindowManagerService;->setInsetsWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowManagerService;->stopFreezingDisplayLocked()V
-HPLcom/android/server/wm/WindowManagerService;->tryStartExitingAnimation(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;)V
-HSPLcom/android/server/wm/WindowManagerService;->updateFocusedWindowLocked(IZ)Z
-HSPLcom/android/server/wm/WindowManagerService;->updateNonSystemOverlayWindowsVisibilityIfNeeded(Lcom/android/server/wm/WindowState;Z)V
+HPLcom/android/server/wm/WindowManagerService;->tryStartExitingAnimation(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/WindowManagerService;->updateFocusedWindowLocked(IZ)Z+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
+HSPLcom/android/server/wm/WindowManagerService;->updateNonSystemOverlayWindowsVisibilityIfNeeded(Lcom/android/server/wm/WindowState;Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/WindowManagerService;->updateRotationUnchecked(ZZ)V
 HSPLcom/android/server/wm/WindowManagerService;->windowForClientLocked(Lcom/android/server/wm/Session;Landroid/os/IBinder;Z)Lcom/android/server/wm/WindowState;+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
-HSPLcom/android/server/wm/WindowManagerService;->windowForClientLocked(Lcom/android/server/wm/Session;Landroid/view/IWindow;Z)Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;,Landroid/view/ViewRootImpl$W;
-HSPLcom/android/server/wm/WindowManagerThreadPriorityBooster;-><init>()V
+HSPLcom/android/server/wm/WindowManagerService;->windowForClientLocked(Lcom/android/server/wm/Session;Landroid/view/IWindow;Z)Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Landroid/view/IWindow;Landroid/view/ViewRootImpl$W;,Landroid/view/IWindow$Stub$Proxy;
 HSPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->boost()V
 HSPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->reset()V
 HSPLcom/android/server/wm/WindowOrganizerController$CallerInfo;-><init>()V
-HSPLcom/android/server/wm/WindowOrganizerController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
 HSPLcom/android/server/wm/WindowOrganizerController;->applyTransaction(Landroid/window/WindowContainerTransaction;ILcom/android/server/wm/Transition;Lcom/android/server/wm/WindowOrganizerController$CallerInfo;Lcom/android/server/wm/Transition;)I
 HPLcom/android/server/wm/WindowOrganizerController;->finishTransition(Landroid/os/IBinder;Landroid/window/WindowContainerTransaction;)V
-HSPLcom/android/server/wm/WindowOrganizerController;->getTransitionController()Lcom/android/server/wm/TransitionController;
 HSPLcom/android/server/wm/WindowOrganizerController;->startTransition(ILandroid/os/IBinder;Landroid/window/WindowContainerTransaction;)Landroid/os/IBinder;
 HPLcom/android/server/wm/WindowOrientationListener$OrientationSensorJudge;->onTouchEndLocked(J)V+]Lcom/android/server/wm/WindowOrientationListener$OrientationSensorJudge;Lcom/android/server/wm/WindowOrientationListener$OrientationSensorJudge;
-HPLcom/android/server/wm/WindowProcessController$$ExternalSyntheticLambda2;-><init>(Lcom/android/server/wm/WindowProcessController;Z)V
-HSPLcom/android/server/wm/WindowProcessController$$ExternalSyntheticLambda8;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
-HPLcom/android/server/wm/WindowProcessController$$ExternalSyntheticLambda8;->test(I)Z
-HSPLcom/android/server/wm/WindowProcessController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;IILjava/lang/Object;Lcom/android/server/wm/WindowProcessListener;)V
+HPLcom/android/server/wm/WindowProcessController$$ExternalSyntheticLambda8;->test(I)Z+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
+HSPLcom/android/server/wm/WindowProcessController;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;IILjava/lang/Object;Lcom/android/server/wm/WindowProcessListener;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/grammaticalinflection/GrammaticalInflectionManagerInternal;Lcom/android/server/grammaticalinflection/GrammaticalInflectionService$GrammaticalInflectionManagerInternalImpl;]Lcom/android/server/wm/PackageConfigPersister;Lcom/android/server/wm/PackageConfigPersister;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HSPLcom/android/server/wm/WindowProcessController;->addBoundClientUid(ILjava/lang/String;J)V+]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController;
-HSPLcom/android/server/wm/WindowProcessController;->addPackage(Ljava/lang/String;)V
-HPLcom/android/server/wm/WindowProcessController;->addToPendingTop()V
-HPLcom/android/server/wm/WindowProcessController;->areBackgroundActivityStartsAllowed(IZ)Lcom/android/server/wm/BackgroundActivityStartController$BalVerdict;+]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
-HSPLcom/android/server/wm/WindowProcessController;->clearActivities()V
-HSPLcom/android/server/wm/WindowProcessController;->clearRecentTasks()V
+HSPLcom/android/server/wm/WindowProcessController;->addPackage(Ljava/lang/String;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/WindowProcessController;->addToPendingTop()V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;
+HSPLcom/android/server/wm/WindowProcessController;->areBackgroundActivityStartsAllowed(IZ)Lcom/android/server/wm/BackgroundActivityStartController$BalVerdict;+]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
+HSPLcom/android/server/wm/WindowProcessController;->clearActivities()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/WindowProcessController;->clearRecentTasks()V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HPLcom/android/server/wm/WindowProcessController;->computeOomAdjFromActivities(Lcom/android/server/wm/WindowProcessController$ComputeOomAdjCallback;)I+]Lcom/android/server/wm/WindowProcessController$ComputeOomAdjCallback;Lcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;
-HPLcom/android/server/wm/WindowProcessController;->computeProcessActivityState()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/VisibleActivityProcessTracker;Lcom/android/server/wm/VisibleActivityProcessTracker;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
+HSPLcom/android/server/wm/WindowProcessController;->computeProcessActivityState()V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/VisibleActivityProcessTracker;Lcom/android/server/wm/VisibleActivityProcessTracker;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;
 HSPLcom/android/server/wm/WindowProcessController;->dispatchConfiguration(Landroid/content/res/Configuration;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HSPLcom/android/server/wm/WindowProcessController;->getParent()Lcom/android/server/wm/ConfigurationContainer;
 HSPLcom/android/server/wm/WindowProcessController;->getThread()Landroid/app/IApplicationThread;
-HSPLcom/android/server/wm/WindowProcessController;->getTopActivityDeviceId()I
+HSPLcom/android/server/wm/WindowProcessController;->getTopActivityDeviceId()I+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;
 HSPLcom/android/server/wm/WindowProcessController;->getTopNonFinishingActivity()Lcom/android/server/wm/ActivityRecord;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLcom/android/server/wm/WindowProcessController;->handleAppDied()Z
+HSPLcom/android/server/wm/WindowProcessController;->handleAppDied()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Ljava/util/ArrayList;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/WindowProcessController;->hasActivities()Z
 HSPLcom/android/server/wm/WindowProcessController;->hasActivitiesOrRecentTasks()Z
-HPLcom/android/server/wm/WindowProcessController;->hasActivityInVisibleTask()Z
+HSPLcom/android/server/wm/WindowProcessController;->hasActivityInVisibleTask()Z
 HSPLcom/android/server/wm/WindowProcessController;->hasRecentTasks()Z
-HPLcom/android/server/wm/WindowProcessController;->hasResumedActivity()Z
+HSPLcom/android/server/wm/WindowProcessController;->hasResumedActivity()Z
 HSPLcom/android/server/wm/WindowProcessController;->hasThread()Z
 HSPLcom/android/server/wm/WindowProcessController;->hasVisibleActivities()Z
 HSPLcom/android/server/wm/WindowProcessController;->isHeavyWeightProcess()Z
@@ -11488,11 +8801,11 @@
 HSPLcom/android/server/wm/WindowProcessController;->onConfigurationChanged(Landroid/content/res/Configuration;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
 HSPLcom/android/server/wm/WindowProcessController;->onServiceStarted(Landroid/content/pm/ServiceInfo;)V+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;
 HSPLcom/android/server/wm/WindowProcessController;->registeredForDisplayAreaConfigChanges()Z
-HSPLcom/android/server/wm/WindowProcessController;->removeBackgroundStartPrivileges(Landroid/os/Binder;)V
+HSPLcom/android/server/wm/WindowProcessController;->removeBackgroundStartPrivileges(Landroid/os/Binder;)V+]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController;
 HSPLcom/android/server/wm/WindowProcessController;->resolveOverrideConfiguration(Landroid/content/res/Configuration;)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLcom/android/server/wm/WindowProcessController;->scheduleClientTransactionItem(Landroid/app/IApplicationThread;Landroid/app/servertransaction/ClientTransactionItem;)V
+HSPLcom/android/server/wm/WindowProcessController;->scheduleClientTransactionItem(Landroid/app/IApplicationThread;Landroid/app/servertransaction/ClientTransactionItem;)V+]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/Session;Lcom/android/server/wm/Session;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
 HSPLcom/android/server/wm/WindowProcessController;->scheduleClientTransactionItem(Landroid/app/servertransaction/ClientTransactionItem;)V
-HPLcom/android/server/wm/WindowProcessController;->setAnimating(Z)V
+HSPLcom/android/server/wm/WindowProcessController;->setAnimating(Z)V
 HSPLcom/android/server/wm/WindowProcessController;->setCurrentAdj(I)V
 HSPLcom/android/server/wm/WindowProcessController;->setCurrentProcState(I)V
 HSPLcom/android/server/wm/WindowProcessController;->setCurrentSchedulingGroup(I)V
@@ -11502,28 +8815,26 @@
 HSPLcom/android/server/wm/WindowProcessController;->setPendingUiClean(Z)V
 HSPLcom/android/server/wm/WindowProcessController;->setPerceptible(Z)V
 HSPLcom/android/server/wm/WindowProcessController;->setPid(I)V
-HSPLcom/android/server/wm/WindowProcessController;->setReportedProcState(I)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;
-HSPLcom/android/server/wm/WindowProcessController;->setThread(Landroid/app/IApplicationThread;)V
+HSPLcom/android/server/wm/WindowProcessController;->setReportedProcState(I)V+]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLcom/android/server/wm/WindowProcessController;->setThread(Landroid/app/IApplicationThread;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/VisibleActivityProcessTracker;Lcom/android/server/wm/VisibleActivityProcessTracker;
 HPLcom/android/server/wm/WindowProcessController;->setWhenUnimportant(J)V
-HSPLcom/android/server/wm/WindowProcessController;->updateActivityConfigurationListener()V
-HPLcom/android/server/wm/WindowProcessController;->updateProcessInfo(ZZZZ)V
-HPLcom/android/server/wm/WindowProcessController;->updateTopResumingActivityInProcessIfNeeded(Lcom/android/server/wm/ActivityRecord;)Z
-HSPLcom/android/server/wm/WindowProcessControllerMap;-><init>()V
+HSPLcom/android/server/wm/WindowProcessController;->updateActivityConfigurationListener()V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/WindowProcessController;->updateProcessInfo(ZZZZ)V
+HSPLcom/android/server/wm/WindowProcessController;->updateTopResumingActivityInProcessIfNeeded(Lcom/android/server/wm/ActivityRecord;)Z
 HSPLcom/android/server/wm/WindowProcessControllerMap;->getProcess(I)Lcom/android/server/wm/WindowProcessController;+]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/wm/WindowProcessControllerMap;->put(ILcom/android/server/wm/WindowProcessController;)V
-HSPLcom/android/server/wm/WindowProcessControllerMap;->remove(I)V
-HSPLcom/android/server/wm/WindowProcessControllerMap;->removeProcessFromUidMap(Lcom/android/server/wm/WindowProcessController;)V
+HSPLcom/android/server/wm/WindowProcessControllerMap;->put(ILcom/android/server/wm/WindowProcessController;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Map;Ljava/util/HashMap;
+HSPLcom/android/server/wm/WindowProcessControllerMap;->remove(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;
+HSPLcom/android/server/wm/WindowProcessControllerMap;->removeProcessFromUidMap(Lcom/android/server/wm/WindowProcessController;)V+]Ljava/util/Map;Ljava/util/HashMap;
 HSPLcom/android/server/wm/WindowState$$ExternalSyntheticLambda2;-><init>(Landroid/view/InsetsState;Landroid/util/ArraySet;Landroid/util/SparseArray;)V
 HSPLcom/android/server/wm/WindowState$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V
-HPLcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;->reset()V
-HSPLcom/android/server/wm/WindowState;->$r8$lambda$ZpBAxyV_EYA5etsArmi-qkwlhf0(Landroid/view/InsetsState;Landroid/util/ArraySet;Landroid/util/SparseArray;Lcom/android/server/wm/WindowState;)V
+HSPLcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;->reset()V
 HSPLcom/android/server/wm/WindowState;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/Session;Landroid/view/IWindow;Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowState;ILandroid/view/WindowManager$LayoutParams;IIIZ)V
-HPLcom/android/server/wm/WindowState;->adjustRegionInFreefromWindowMode(Landroid/graphics/Rect;)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WindowState;->adjustRegionInFreefromWindowMode(Landroid/graphics/Rect;)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->adjustStartingWindowFlags()V
-HSPLcom/android/server/wm/WindowState;->applyDims()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/SmoothDimmer;
+HSPLcom/android/server/wm/WindowState;->applyDims()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/SmoothDimmer;,Lcom/android/server/wm/LegacyDimmer;
 HSPLcom/android/server/wm/WindowState;->applyImeWindowsIfNeeded(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowState;->applyInOrderWithImeWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/internal/util/ToBooleanFunction;megamorphic_types
-HPLcom/android/server/wm/WindowState;->areAppWindowBoundsLetterboxed()Z
+HSPLcom/android/server/wm/WindowState;->areAppWindowBoundsLetterboxed()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->asWindowState()Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;
 HSPLcom/android/server/wm/WindowState;->assignLayer(Landroid/view/SurfaceControl$Transaction;I)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
@@ -11535,55 +8846,55 @@
 HSPLcom/android/server/wm/WindowState;->canReceiveKeys(Z)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowState;->canReceiveKeysReason(Z)Ljava/lang/String;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/DisplayContent;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowState;->canReceiveTouchInput()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/WindowState;->canShowWhenLocked()Z
+HSPLcom/android/server/wm/WindowState;->canShowWhenLocked()Z
 HSPLcom/android/server/wm/WindowState;->cancelAndRedraw()Z
 HSPLcom/android/server/wm/WindowState;->computeDragResizing()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
 HPLcom/android/server/wm/WindowState;->consumeInsetsChange()V
 HSPLcom/android/server/wm/WindowState;->cropRegionToRootTaskBoundsIfNeeded(Landroid/graphics/Region;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;
-HPLcom/android/server/wm/WindowState;->destroySurface(ZZ)Z
-HPLcom/android/server/wm/WindowState;->destroySurfaceUnchecked()V
-HPLcom/android/server/wm/WindowState;->disposeInputChannel()V
-HSPLcom/android/server/wm/WindowState;->executeDrawHandlers(Landroid/view/SurfaceControl$Transaction;I)Z
-HSPLcom/android/server/wm/WindowState;->fillClientWindowFramesAndConfiguration(Landroid/window/ClientWindowFrames;Landroid/util/MergedConfiguration;ZZ)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
-HPLcom/android/server/wm/WindowState;->fillsDisplay()Z
-HSPLcom/android/server/wm/WindowState;->finishDrawing(Landroid/view/SurfaceControl$Transaction;I)Z
-HPLcom/android/server/wm/WindowState;->forAllWindowTopToBottom(Lcom/android/internal/util/ToBooleanFunction;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
+HPLcom/android/server/wm/WindowState;->destroySurface(ZZ)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;
+HPLcom/android/server/wm/WindowState;->destroySurfaceUnchecked()V+]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
+HPLcom/android/server/wm/WindowState;->disposeInputChannel()V+]Ljava/util/HashMap;Ljava/util/HashMap;]Lcom/android/server/input/InputManagerService;Lcom/android/server/input/InputManagerService;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Ljava/util/Map;Ljava/util/Collections$SynchronizedMap;
+HSPLcom/android/server/wm/WindowState;->executeDrawHandlers(Landroid/view/SurfaceControl$Transaction;I)Z+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/function/Consumer;Lcom/android/server/wm/AsyncRotationController$$ExternalSyntheticLambda3;,Lcom/android/server/wm/InsetsSourceProvider$$ExternalSyntheticLambda0;,Lcom/android/server/wm/Task$$ExternalSyntheticLambda33;,Lcom/android/server/wm/WindowState$$ExternalSyntheticLambda1;
+HSPLcom/android/server/wm/WindowState;->fillClientWindowFramesAndConfiguration(Landroid/window/ClientWindowFrames;Landroid/util/MergedConfiguration;ZZ)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Landroid/graphics/Rect;Landroid/graphics/Rect;
+HSPLcom/android/server/wm/WindowState;->fillsDisplay()Z
+HSPLcom/android/server/wm/WindowState;->finishDrawing(Landroid/view/SurfaceControl$Transaction;I)Z+]Lcom/android/server/wm/ActivityMetricsLogger;Lcom/android/server/wm/ActivityMetricsLogger;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/WindowState;->forAllWindowTopToBottom(Lcom/android/internal/util/ToBooleanFunction;)Z+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HPLcom/android/server/wm/WindowState;->frameCoversEntireAppTokenBounds()Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/WindowState;->getActivityRecord()Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/WindowState;->getActivityRecord()Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowState;->getAttrs()Landroid/view/WindowManager$LayoutParams;
 HSPLcom/android/server/wm/WindowState;->getBaseType()I+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->getBounds()Landroid/graphics/Rect;+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/WindowState;->getCompatInsetsState()Landroid/view/InsetsState;+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WindowState;->getCompatInsetsState()Landroid/view/InsetsState;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/view/InsetsState;Landroid/view/InsetsState;
 HSPLcom/android/server/wm/WindowState;->getCompatScaleForClient()F+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowState;->getConfiguration()Landroid/content/res/Configuration;+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
-HPLcom/android/server/wm/WindowState;->getDisableFlags()I
+HSPLcom/android/server/wm/WindowState;->getDisableFlags()I
 HSPLcom/android/server/wm/WindowState;->getDisplayFrames(Lcom/android/server/wm/DisplayFrames;)Lcom/android/server/wm/DisplayFrames;+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/WindowState;->getDisplayId()I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HPLcom/android/server/wm/WindowState;->getDisplayInfo()Landroid/view/DisplayInfo;
-HPLcom/android/server/wm/WindowState;->getEffectiveTouchableRegion(Landroid/graphics/Region;)V
+HSPLcom/android/server/wm/WindowState;->getDisplayId()I+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WindowState;->getDisplayInfo()Landroid/view/DisplayInfo;
+HSPLcom/android/server/wm/WindowState;->getEffectiveTouchableRegion(Landroid/graphics/Region;)V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowState;->getFrame()Landroid/graphics/Rect;
-HPLcom/android/server/wm/WindowState;->getImeInputTarget()Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WindowState;->getImeInputTarget()Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputTarget;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/EmbeddedWindowController$EmbeddedWindow;
 HSPLcom/android/server/wm/WindowState;->getInputDispatchingTimeoutMillis()J
 HSPLcom/android/server/wm/WindowState;->getInsetsState()Landroid/view/InsetsState;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->getInsetsState(Z)Landroid/view/InsetsState;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
-HSPLcom/android/server/wm/WindowState;->getKeepClearAreas(Ljava/util/Collection;Ljava/util/Collection;Landroid/graphics/Matrix;[F)V
+HSPLcom/android/server/wm/WindowState;->getKeepClearAreas(Ljava/util/Collection;Ljava/util/Collection;Landroid/graphics/Matrix;[F)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/Collection;Landroid/util/ArraySet;
 HSPLcom/android/server/wm/WindowState;->getKeyInterceptionInfo()Lcom/android/internal/policy/KeyInterceptionInfo;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/lang/CharSequence;Ljava/lang/String;
 HSPLcom/android/server/wm/WindowState;->getMergedInsetsState()Landroid/view/InsetsState;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowState;->getName()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->getOrientationChanging()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->getOwningPackage()Ljava/lang/String;
 HSPLcom/android/server/wm/WindowState;->getOwningUid()I
-HPLcom/android/server/wm/WindowState;->getParentFrame()Landroid/graphics/Rect;
+HSPLcom/android/server/wm/WindowState;->getParentFrame()Landroid/graphics/Rect;
 HSPLcom/android/server/wm/WindowState;->getParentWindow()Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->getProcessGlobalConfiguration()Landroid/content/res/Configuration;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;,Lcom/android/server/wm/RootWindowContainer;
 HSPLcom/android/server/wm/WindowState;->getRectsInScreenSpace(Ljava/util/List;Landroid/graphics/Matrix;[F)Ljava/util/List;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;
 HSPLcom/android/server/wm/WindowState;->getRequestedVisibleTypes()I
 HPLcom/android/server/wm/WindowState;->getRootTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowState;->getSession()Landroid/view/SurfaceSession;
-HSPLcom/android/server/wm/WindowState;->getSurfaceTouchableRegion(Landroid/graphics/Region;Landroid/view/WindowManager$LayoutParams;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/WindowState;->getSurfaceTouchableRegion(Landroid/graphics/Region;Landroid/view/WindowManager$LayoutParams;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/WindowState;->getSystemGestureExclusion()Ljava/util/List;
 HSPLcom/android/server/wm/WindowState;->getTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/WindowState;->getTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/WindowState;->getTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowState;->getTopParentWindow()Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->getTouchOcclusionMode()I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->getTouchableRegion(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
@@ -11594,7 +8905,7 @@
 HSPLcom/android/server/wm/WindowState;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->handleWindowMovedIfNeeded()V+]Lcom/android/server/wm/AccessibilityController;Lcom/android/server/wm/AccessibilityController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;,Landroid/view/ViewRootImpl$W;
 HSPLcom/android/server/wm/WindowState;->hasCompatScale()Z
-HPLcom/android/server/wm/WindowState;->hasContentToDisplay()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;
+HSPLcom/android/server/wm/WindowState;->hasContentToDisplay()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;
 HSPLcom/android/server/wm/WindowState;->hasMoved()Z+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
 HSPLcom/android/server/wm/WindowState;->hasWallpaper()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->hasWallpaperForLetterboxBackground()Z
@@ -11612,1759 +8923,210 @@
 HPLcom/android/server/wm/WindowState;->isFullyTransparentBarAllowed(Landroid/graphics/Rect;)Z
 HSPLcom/android/server/wm/WindowState;->isGoneForLayout()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->isImeLayeringTarget()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HSPLcom/android/server/wm/WindowState;->isImeOverlayLayeringTarget()Z
-HPLcom/android/server/wm/WindowState;->isImplicitlyExcludingAllSystemGestures()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HPLcom/android/server/wm/WindowState;->isInteresting()Z
+HSPLcom/android/server/wm/WindowState;->isImeOverlayLayeringTarget()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WindowState;->isImplicitlyExcludingAllSystemGestures()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WindowState;->isInteresting()Z+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
 HSPLcom/android/server/wm/WindowState;->isLaidOut()Z
 HSPLcom/android/server/wm/WindowState;->isLastConfigReportedToClient()Z
 HSPLcom/android/server/wm/WindowState;->isLegacyPolicyVisibility()Z
-HPLcom/android/server/wm/WindowState;->isLetterboxedForDisplayCutout()Z+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HSPLcom/android/server/wm/WindowState;->isObscuringDisplay()Z
+HSPLcom/android/server/wm/WindowState;->isLetterboxedForDisplayCutout()Z+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WindowState;->isObscuringDisplay()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->isOnScreen()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowState;->isOpaqueDrawn()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HSPLcom/android/server/wm/WindowState;->isParentWindowGoneForLayout()Z
+HSPLcom/android/server/wm/WindowState;->isParentWindowGoneForLayout()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->isParentWindowHidden()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HSPLcom/android/server/wm/WindowState;->isReadyForDisplay()Z
+HSPLcom/android/server/wm/WindowState;->isReadyForDisplay()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/WindowState;->isReadyToDispatchInsetsState()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HPLcom/android/server/wm/WindowState;->isRequestedVisible(I)Z
-HPLcom/android/server/wm/WindowState;->isRtl()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
-HSPLcom/android/server/wm/WindowState;->isSecureLocked()Z
+HSPLcom/android/server/wm/WindowState;->isRequestedVisible(I)Z
+HSPLcom/android/server/wm/WindowState;->isRtl()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;
+HSPLcom/android/server/wm/WindowState;->isSecureLocked()Z+]Lcom/android/server/wm/SensitiveContentPackages;Lcom/android/server/wm/SensitiveContentPackages;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/app/admin/DevicePolicyCache;Lcom/android/server/devicepolicy/DevicePolicyCacheImpl;
 HSPLcom/android/server/wm/WindowState;->isSelfAnimating(II)Z
 HSPLcom/android/server/wm/WindowState;->isStartingWindowAssociatedToTask()Z
-HPLcom/android/server/wm/WindowState;->isSyncFinished(Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;)Z
+HSPLcom/android/server/wm/WindowState;->isSyncFinished(Lcom/android/server/wm/BLASTSyncEngine$SyncGroup;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->isVisible()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->isVisibleByPolicy()Z
 HSPLcom/android/server/wm/WindowState;->isVisibleByPolicyOrInsets()Z+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->isVisibleRequested()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->isVisibleRequestedOrAdding()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->isWindowTrustedOverlay()Z
-HPLcom/android/server/wm/WindowState;->lambda$new$1(Landroid/view/SurfaceControl$Transaction;)V
+HSPLcom/android/server/wm/WindowState;->lambda$new$1(Landroid/view/SurfaceControl$Transaction;)V
 HSPLcom/android/server/wm/WindowState;->lambda$updateAboveInsetsState$3(Landroid/view/InsetsState;Landroid/util/ArraySet;Landroid/util/SparseArray;Lcom/android/server/wm/WindowState;)V+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/ArraySet;Landroid/util/ArraySet;
-HPLcom/android/server/wm/WindowState;->logExclusionRestrictions(I)V
+HPLcom/android/server/wm/WindowState;->logExclusionRestrictions(I)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/WindowState;->matchesDisplayAreaBounds()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/WindowState;->mightAffectAllDrawn()Z
-HSPLcom/android/server/wm/WindowState;->needsRelativeLayeringToIme()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/DisplayContent$ImeContainer;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WindowState;->mightAffectAllDrawn()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WindowState;->needsRelativeLayeringToIme()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/DisplayContent$ImeContainer;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowState;->needsZBoost()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/WindowState;->notifyInsetsChanged()V
-HPLcom/android/server/wm/WindowState;->notifyInsetsControlChanged(I)V
-HPLcom/android/server/wm/WindowState;->onAppVisibilityChanged(ZZ)V
+HPLcom/android/server/wm/WindowState;->notifyInsetsChanged()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;
+HPLcom/android/server/wm/WindowState;->notifyInsetsControlChanged(I)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;,Landroid/view/ViewRootImpl$W;
+HSPLcom/android/server/wm/WindowState;->onAppVisibilityChanged(ZZ)V+]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowState;->onConfigurationChanged(Landroid/content/res/Configuration;)V
 HPLcom/android/server/wm/WindowState;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HPLcom/android/server/wm/WindowState;->onExitAnimationDone()V
-HSPLcom/android/server/wm/WindowState;->onParentChanged(Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ConfigurationContainer;)V
-HSPLcom/android/server/wm/WindowState;->onResizeHandled()V
-HPLcom/android/server/wm/WindowState;->onResizePostDispatched(ZII)V
-HSPLcom/android/server/wm/WindowState;->onSurfaceShownChanged(Z)V
+HSPLcom/android/server/wm/WindowState;->onParentChanged(Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ConfigurationContainer;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/WindowState;->onResizeHandled()V+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;
+HPLcom/android/server/wm/WindowState;->onResizePostDispatched(ZII)V+]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
+HSPLcom/android/server/wm/WindowState;->onSurfaceShownChanged(Z)V+]Lcom/android/server/wm/MirrorActiveUids;Lcom/android/server/wm/MirrorActiveUids;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowState;->openInputChannel(Landroid/view/InputChannel;)V
-HSPLcom/android/server/wm/WindowState;->performShowLocked()Z
+HSPLcom/android/server/wm/WindowState;->performShowLocked()Z+]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowState;->prepareSurfaces()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HPLcom/android/server/wm/WindowState;->prepareSync()Z
-HSPLcom/android/server/wm/WindowState;->prepareWindowToDisplayDuringRelayout(Z)V
+HSPLcom/android/server/wm/WindowState;->prepareSync()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/WindowState;->prepareWindowToDisplayDuringRelayout(Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowState;->registeredForDisplayAreaConfigChanges()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;
-HSPLcom/android/server/wm/WindowState;->relayoutVisibleWindow(I)I
+HSPLcom/android/server/wm/WindowState;->relayoutVisibleWindow(I)I+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/WindowState;->removeIfPossible()V
 HPLcom/android/server/wm/WindowState;->removeImmediately()V
-HPLcom/android/server/wm/WindowState;->reportResized()V
-HPLcom/android/server/wm/WindowState;->requestUpdateWallpaperIfNeeded()V
+HPLcom/android/server/wm/WindowState;->reportResized()V+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
+HSPLcom/android/server/wm/WindowState;->requestUpdateWallpaperIfNeeded()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
 HSPLcom/android/server/wm/WindowState;->resetContentChanged()V+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;
-HPLcom/android/server/wm/WindowState;->sendAppVisibilityToClients()V
-HSPLcom/android/server/wm/WindowState;->setDisplayLayoutNeeded()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
+HSPLcom/android/server/wm/WindowState;->sendAppVisibilityToClients()V+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/ActivityRecord;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;
+HSPLcom/android/server/wm/WindowState;->setDisplayLayoutNeeded()V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->setDrawnStateEvaluated(Z)V
-HSPLcom/android/server/wm/WindowState;->setForceHideNonSystemOverlayWindowIfNeeded(Z)V
+HSPLcom/android/server/wm/WindowState;->setForceHideNonSystemOverlayWindowIfNeeded(Z)V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;
 HSPLcom/android/server/wm/WindowState;->setFrames(Landroid/window/ClientWindowFrames;II)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;
 HSPLcom/android/server/wm/WindowState;->setInitialSurfaceControlProperties(Landroid/view/SurfaceControl$Builder;)V
 HPLcom/android/server/wm/WindowState;->setLastExclusionHeights(III)V
 HSPLcom/android/server/wm/WindowState;->setOnBackInvokedCallbackInfo(Landroid/window/OnBackInvokedCallbackInfo;)V
-HSPLcom/android/server/wm/WindowState;->setReportResizeHints()Z
+HSPLcom/android/server/wm/WindowState;->setReportResizeHints()Z+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;
 HSPLcom/android/server/wm/WindowState;->setRequestedSize(II)V
-HPLcom/android/server/wm/WindowState;->setSystemGestureExclusion(Ljava/util/List;)Z
+HPLcom/android/server/wm/WindowState;->setSystemGestureExclusion(Ljava/util/List;)Z+]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/WindowState;->setViewVisibility(I)V
-HPLcom/android/server/wm/WindowState;->setWallpaperOffset(IIF)Z
+HSPLcom/android/server/wm/WindowState;->setWallpaperOffset(IIF)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->setWindowScale(II)V
 HSPLcom/android/server/wm/WindowState;->shouldCheckTokenVisibleRequested()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;
 HPLcom/android/server/wm/WindowState;->shouldControlIme()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->shouldDrawBlurBehind()Z
-HSPLcom/android/server/wm/WindowState;->shouldSendRedrawForSync()Z
+HSPLcom/android/server/wm/WindowState;->shouldSendRedrawForSync()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HPLcom/android/server/wm/WindowState;->show(ZZ)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;
 HSPLcom/android/server/wm/WindowState;->showForAllUsers()Z
-HSPLcom/android/server/wm/WindowState;->showToCurrentUser()Z
+HSPLcom/android/server/wm/WindowState;->showToCurrentUser()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;
 HSPLcom/android/server/wm/WindowState;->showWallpaper()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->skipLayout()Z
 HPLcom/android/server/wm/WindowState;->startAnimation(Landroid/view/animation/Animation;)V
 HSPLcom/android/server/wm/WindowState;->subtractTouchExcludeRegionIfNeeded(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;
-HSPLcom/android/server/wm/WindowState;->syncNextBuffer()Z
+HSPLcom/android/server/wm/WindowState;->syncNextBuffer()Z+]Ljava/util/List;Ljava/util/ArrayList;
 HSPLcom/android/server/wm/WindowState;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HSPLcom/android/server/wm/WindowState;->transformFrameToSurfacePosition(IILandroid/graphics/Point;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Point;Landroid/graphics/Point;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;
+HSPLcom/android/server/wm/WindowState;->transformFrameToSurfacePosition(IILandroid/graphics/Point;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Point;Landroid/graphics/Point;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowState;->transformSurfaceInsetsPosition(Landroid/graphics/Point;Landroid/graphics/Rect;)V
 HSPLcom/android/server/wm/WindowState;->updateAboveInsetsState(Landroid/view/InsetsState;Landroid/util/SparseArray;Landroid/util/ArraySet;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->updateFrameRateSelectionPriorityIfNeeded()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/RefreshRatePolicy;Lcom/android/server/wm/RefreshRatePolicy;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HPLcom/android/server/wm/WindowState;->updateRegionForModalActivityWindow(Landroid/graphics/Region;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
-HPLcom/android/server/wm/WindowState;->updateReportedVisibility(Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;
-HSPLcom/android/server/wm/WindowState;->updateResizingWindowIfNeeded()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/WindowState;->updateLastFrames()V
+HSPLcom/android/server/wm/WindowState;->updateRegionForModalActivityWindow(Landroid/graphics/Region;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/Task;]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/WindowState;->updateReportedVisibility(Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WindowState;->updateResizingWindowIfNeeded()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Landroid/os/Handler;Lcom/android/server/wm/WindowManagerService$H;
 HSPLcom/android/server/wm/WindowState;->updateScaleIfNeeded()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
 HSPLcom/android/server/wm/WindowState;->updateSourceFrame(Landroid/graphics/Rect;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;,Lcom/android/server/wm/ImeInsetsSourceProvider;]Landroid/util/SparseArray;Landroid/util/SparseArray;
-HSPLcom/android/server/wm/WindowState;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Matrix;Landroid/graphics/Matrix;]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Ljava/util/function/Consumer;Lcom/android/server/wm/WindowState$$ExternalSyntheticLambda1;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
+HSPLcom/android/server/wm/WindowState;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Landroid/graphics/Matrix;Landroid/graphics/Matrix;]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Ljava/util/function/Consumer;Lcom/android/server/wm/WindowState$$ExternalSyntheticLambda1;,Lcom/android/server/wm/WindowState$$ExternalSyntheticLambda3;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;
 HSPLcom/android/server/wm/WindowState;->wouldBeVisibleIfPolicyIgnored()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowState;->wouldBeVisibleRequestedIfPolicyIgnored()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
 HSPLcom/android/server/wm/WindowStateAnimator;-><init>(Lcom/android/server/wm/WindowState;)V
-HSPLcom/android/server/wm/WindowStateAnimator;->applyAnimationLocked(IZ)Z
-HSPLcom/android/server/wm/WindowStateAnimator;->applyEnterAnimationLocked()V
+HSPLcom/android/server/wm/WindowStateAnimator;->applyAnimationLocked(IZ)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;
+HSPLcom/android/server/wm/WindowStateAnimator;->applyEnterAnimationLocked()V+]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;
 HSPLcom/android/server/wm/WindowStateAnimator;->commitFinishDrawingLocked()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowStateAnimator;->computeShownFrameLocked()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
-HSPLcom/android/server/wm/WindowStateAnimator;->createSurfaceLocked()Lcom/android/server/wm/WindowSurfaceController;
-HPLcom/android/server/wm/WindowStateAnimator;->destroySurface(Landroid/view/SurfaceControl$Transaction;)V
-HPLcom/android/server/wm/WindowStateAnimator;->destroySurfaceLocked(Landroid/view/SurfaceControl$Transaction;)V
-HSPLcom/android/server/wm/WindowStateAnimator;->finishDrawingLocked(Landroid/view/SurfaceControl$Transaction;)Z
-HSPLcom/android/server/wm/WindowStateAnimator;->getShown()Z
+HSPLcom/android/server/wm/WindowStateAnimator;->createSurfaceLocked()Lcom/android/server/wm/WindowSurfaceController;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Ljava/lang/CharSequence;Ljava/lang/String;
+HPLcom/android/server/wm/WindowStateAnimator;->destroySurface(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController;
+HPLcom/android/server/wm/WindowStateAnimator;->destroySurfaceLocked(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;
+HSPLcom/android/server/wm/WindowStateAnimator;->finishDrawingLocked(Landroid/view/SurfaceControl$Transaction;)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
+HSPLcom/android/server/wm/WindowStateAnimator;->getShown()Z+]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController;
 HSPLcom/android/server/wm/WindowStateAnimator;->hasSurface()Z+]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController;
-HPLcom/android/server/wm/WindowStateAnimator;->hide(Landroid/view/SurfaceControl$Transaction;Ljava/lang/String;)V
+HSPLcom/android/server/wm/WindowStateAnimator;->hide(Landroid/view/SurfaceControl$Transaction;Ljava/lang/String;)V+]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController;
 HPLcom/android/server/wm/WindowStateAnimator;->onAnimationFinished()V
 HSPLcom/android/server/wm/WindowStateAnimator;->prepareSurfaceLocked(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
 HSPLcom/android/server/wm/WindowStateAnimator;->resetDrawState()V
-HPLcom/android/server/wm/WindowSurfaceController;-><init>(Ljava/lang/String;IILcom/android/server/wm/WindowStateAnimator;I)V
-HPLcom/android/server/wm/WindowSurfaceController;->destroy(Landroid/view/SurfaceControl$Transaction;)V
-HPLcom/android/server/wm/WindowSurfaceController;->getShown()Z
-HPLcom/android/server/wm/WindowSurfaceController;->getSurfaceControl(Landroid/view/SurfaceControl;)V
-HPLcom/android/server/wm/WindowSurfaceController;->hasSurface()Z
+HSPLcom/android/server/wm/WindowStateAnimator;->toString()Ljava/lang/String;
+HSPLcom/android/server/wm/WindowSurfaceController;-><init>(Ljava/lang/String;IILcom/android/server/wm/WindowStateAnimator;I)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Landroid/view/SurfaceControl$Builder;Landroid/view/SurfaceControl$Builder;
+HPLcom/android/server/wm/WindowSurfaceController;->destroy(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
+HSPLcom/android/server/wm/WindowSurfaceController;->getShown()Z
+HSPLcom/android/server/wm/WindowSurfaceController;->getSurfaceControl(Landroid/view/SurfaceControl;)V
+HSPLcom/android/server/wm/WindowSurfaceController;->hasSurface()Z
 HPLcom/android/server/wm/WindowSurfaceController;->hideSurface(Landroid/view/SurfaceControl$Transaction;)V
-HPLcom/android/server/wm/WindowSurfaceController;->setColorSpaceAgnostic(Landroid/view/SurfaceControl$Transaction;Z)V
-HPLcom/android/server/wm/WindowSurfaceController;->setShown(Z)V
-HPLcom/android/server/wm/WindowSurfaceController;->showRobustly(Landroid/view/SurfaceControl$Transaction;)V
+HSPLcom/android/server/wm/WindowSurfaceController;->setColorSpaceAgnostic(Landroid/view/SurfaceControl$Transaction;Z)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
+HSPLcom/android/server/wm/WindowSurfaceController;->setShown(Z)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/Session;Lcom/android/server/wm/Session;
+HSPLcom/android/server/wm/WindowSurfaceController;->showRobustly(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;
+HSPLcom/android/server/wm/WindowSurfaceController;->toString()Ljava/lang/String;+]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;
 HSPLcom/android/server/wm/WindowSurfacePlacer$Traverser;->run()V
 HSPLcom/android/server/wm/WindowSurfacePlacer;->continueLayout(Z)V
 HSPLcom/android/server/wm/WindowSurfacePlacer;->deferLayout()V
-HSPLcom/android/server/wm/WindowSurfacePlacer;->isInLayout()Z
 HSPLcom/android/server/wm/WindowSurfacePlacer;->isLayoutDeferred()Z
 HSPLcom/android/server/wm/WindowSurfacePlacer;->isTraversalScheduled()Z
 HSPLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacement()V+]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;
 HSPLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacement(Z)V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;
 HSPLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacementLoop()V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;
-HSPLcom/android/server/wm/WindowSurfacePlacer;->requestTraversal()V+]Landroid/os/Handler;Landroid/os/Handler;
-HPLcom/android/server/wm/WindowToken$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V
+HSPLcom/android/server/wm/WindowSurfacePlacer;->requestTraversal()V
+HSPLcom/android/server/wm/WindowToken$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V
 HSPLcom/android/server/wm/WindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;IZLcom/android/server/wm/DisplayContent;ZZZLandroid/os/Bundle;)V
 HSPLcom/android/server/wm/WindowToken;->addWindow(Lcom/android/server/wm/WindowState;)V
 HSPLcom/android/server/wm/WindowToken;->assignLayer(Landroid/view/SurfaceControl$Transaction;I)V
-HPLcom/android/server/wm/WindowToken;->getFixedRotationTransformDisplayBounds()Landroid/graphics/Rect;+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;
-HSPLcom/android/server/wm/WindowToken;->getFixedRotationTransformDisplayFrames()Lcom/android/server/wm/DisplayFrames;
-HSPLcom/android/server/wm/WindowToken;->getFixedRotationTransformInsetsState()Landroid/view/InsetsState;
-HPLcom/android/server/wm/WindowToken;->hasFixedRotationTransform()Z
+HSPLcom/android/server/wm/WindowToken;->getFixedRotationTransformDisplayBounds()Landroid/graphics/Rect;+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/WindowToken;->getFixedRotationTransformDisplayFrames()Lcom/android/server/wm/DisplayFrames;+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
+HSPLcom/android/server/wm/WindowToken;->getFixedRotationTransformInsetsState()Landroid/view/InsetsState;+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowToken;->isClientVisible()Z
-HPLcom/android/server/wm/WindowToken;->isFinishingFixedRotationTransform()Z
 HSPLcom/android/server/wm/WindowToken;->isFixedRotationTransforming()Z
 HSPLcom/android/server/wm/WindowToken;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;
-HSPLcom/android/server/wm/WindowToken;->setClientVisible(Z)V
+HSPLcom/android/server/wm/WindowToken;->setClientVisible(Z)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/ActivityRecord;
 HSPLcom/android/server/wm/WindowToken;->toString()Ljava/lang/String;
-HSPLcom/android/server/wm/WindowToken;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V
+HSPLcom/android/server/wm/WindowToken;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;,Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;
 HSPLcom/android/server/wm/WindowTracing;->isEnabled()Z
-HSPLcom/android/server/wm/WindowTracing;->logState(Ljava/lang/String;)V
-HSPLcom/android/server/wm/utils/DisplayInfoOverrides$$ExternalSyntheticLambda0;-><init>()V
-HSPLcom/android/server/wm/utils/DisplayInfoOverrides;-><clinit>()V
+HSPLcom/android/server/wm/WindowTracing;->logState(Ljava/lang/String;)V+]Lcom/android/server/wm/WindowTracing;Lcom/android/server/wm/WindowTracing;
 HSPLcom/android/server/wm/utils/DisplayInfoOverrides;->copyDisplayInfoFields(Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;Lcom/android/server/wm/utils/DisplayInfoOverrides$DisplayInfoFieldsUpdater;)V
 HSPLcom/android/server/wm/utils/DisplayInfoOverrides;->lambda$static$0(Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;)V
 HPLcom/android/server/wm/utils/RegionUtils;->forEachRectReverse(Landroid/graphics/Region;Ljava/util/function/Consumer;)V+]Landroid/graphics/RegionIterator;Landroid/graphics/RegionIterator;]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HPLcom/android/server/wm/utils/RegionUtils;->rectListToRegion(Ljava/util/List;Landroid/graphics/Region;)V
-HSPLcom/android/server/wm/utils/RotationCache;->getOrCompute(Ljava/lang/Object;I)Ljava/lang/Object;
-Landroid/app/ActivityThread$ApplicationThread;
-Landroid/app/ApplicationPackageManager;
-Landroid/content/pm/AuxiliaryResolveInfo$AuxiliaryFilter;
-Landroid/content/pm/PackageManagerInternal$ExternalSourcesPolicy;
-Landroid/content/pm/PackageManagerInternal;
-Landroid/content/pm/TestUtilityService;
-Landroid/hardware/light/HwLight$1;
-Landroid/hardware/light/HwLight;
-Landroid/hardware/light/ILights;
-Landroid/hardware/power/stats/Channel;
-Landroid/hardware/power/stats/EnergyConsumer;
-Landroid/hardware/power/stats/IPowerStats$Stub$Proxy;
-Landroid/hardware/power/stats/IPowerStats$Stub;
-Landroid/hardware/power/stats/IPowerStats;
-Landroid/net/ConnectivityModuleConnector$Dependencies;
-Landroid/net/ConnectivityModuleConnector$DependenciesImpl;
-Landroid/net/ConnectivityModuleConnector;
-Landroid/os/BatteryStatsInternal;
-Landroid/os/BinderProxy;
-Landroid/os/IInstalld$Stub$Proxy;
-Landroid/power/PowerStatsInternal;
-Landroid/sysprop/SurfaceFlingerProperties;
-Lcom/android/internal/pm/parsing/pkg/PackageImpl;
-Lcom/android/modules/utils/build/SdkLevel;
-Lcom/android/modules/utils/build/UnboundedSdkLevel;
-Lcom/android/server/AnimationThread;
-Lcom/android/server/AppFuseMountException;
+HSPLcom/android/server/wm/utils/RegionUtils;->rectListToRegion(Ljava/util/List;Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Ljava/util/List;Ljava/util/ArrayList;
+HSPLcom/android/server/wm/utils/RotationCache;->getOrCompute(Ljava/lang/Object;I)Ljava/lang/Object;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/utils/RotationCache$RotationDependentComputation;Lcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda38;
 Lcom/android/server/BatteryService$LocalService;
-Lcom/android/server/BinaryTransparencyService$BinaryTransparencyServiceImpl$$ExternalSyntheticLambda0;
-Lcom/android/server/BundleUtils;
-Lcom/android/server/ConsumerIrService;
 Lcom/android/server/DeviceIdleController$LocalService;
-Lcom/android/server/DisplayThread;
-Lcom/android/server/EventLogTags;
-Lcom/android/server/ExplicitHealthCheckController;
-Lcom/android/server/FgThread;
-Lcom/android/server/HardwarePropertiesManagerService;
-Lcom/android/server/IntentResolver$1;
-Lcom/android/server/IntentResolver;
-Lcom/android/server/IoThread;
-Lcom/android/server/LocalManagerRegistry$ManagerNotFoundException;
-Lcom/android/server/LocalManagerRegistry;
-Lcom/android/server/LockGuard$LockInfo;
-Lcom/android/server/LockGuard;
-Lcom/android/server/PackageWatchdog$$ExternalSyntheticLambda0;
-Lcom/android/server/PackageWatchdog$$ExternalSyntheticLambda6;
-Lcom/android/server/PackageWatchdog$$ExternalSyntheticLambda7;
-Lcom/android/server/PackageWatchdog$$ExternalSyntheticLambda8;
-Lcom/android/server/PackageWatchdog$$ExternalSyntheticLambda9;
-Lcom/android/server/PackageWatchdog$BootThreshold;
-Lcom/android/server/PackageWatchdog$MonitoredPackage;
-Lcom/android/server/PackageWatchdog$ObserverInternal;
-Lcom/android/server/PackageWatchdog$PackageHealthObserver;
-Lcom/android/server/PackageWatchdog$SystemClock;
-Lcom/android/server/PackageWatchdog;
-Lcom/android/server/RescueParty$RescuePartyObserver;
-Lcom/android/server/RescueParty;
-Lcom/android/server/SerialService;
-Lcom/android/server/ServiceThread;
-Lcom/android/server/SystemClockTime;
-Lcom/android/server/SystemConfig$PermissionEntry;
-Lcom/android/server/SystemConfig$SharedLibraryEntry;
-Lcom/android/server/SystemConfig;
-Lcom/android/server/SystemServer$$ExternalSyntheticLambda0;
-Lcom/android/server/SystemServer$$ExternalSyntheticLambda1;
-Lcom/android/server/SystemServer$$ExternalSyntheticLambda2;
-Lcom/android/server/SystemServer$SystemServerDumper;
-Lcom/android/server/SystemServer;
-Lcom/android/server/SystemServerInitThreadPool$$ExternalSyntheticLambda1;
-Lcom/android/server/SystemServerInitThreadPool;
-Lcom/android/server/SystemService;
-Lcom/android/server/SystemServiceManager;
-Lcom/android/server/SystemTimeZone;
-Lcom/android/server/ThreadPriorityBooster$1;
-Lcom/android/server/ThreadPriorityBooster$PriorityState;
-Lcom/android/server/ThreadPriorityBooster;
-Lcom/android/server/UiThread;
-Lcom/android/server/Watchdog$$ExternalSyntheticLambda0;
-Lcom/android/server/Watchdog$1;
-Lcom/android/server/Watchdog$BinderThreadMonitor;
-Lcom/android/server/Watchdog$HandlerChecker;
-Lcom/android/server/Watchdog$HandlerCheckerAndTimeout;
-Lcom/android/server/Watchdog$Monitor;
-Lcom/android/server/Watchdog$RebootRequestReceiver;
-Lcom/android/server/Watchdog$SettingsObserver;
-Lcom/android/server/Watchdog;
-Lcom/android/server/accessibility/AccessibilityManagerService$$ExternalSyntheticLambda35;
-Lcom/android/server/accessibility/BrailleDisplayConnection;
-Lcom/android/server/adb/AdbDebuggingManager$PairingThread;
-Lcom/android/server/am/ActiveServices$1;
-Lcom/android/server/am/ActiveServices$5;
-Lcom/android/server/am/ActiveServices$MediaProjectionFgsTypeCustomPermission;
-Lcom/android/server/am/ActiveServices$ProcessAnrTimer;
-Lcom/android/server/am/ActiveServices$ServiceAnrTimer;
-Lcom/android/server/am/ActiveServices$ServiceMap;
-Lcom/android/server/am/ActiveServices$ServiceRestarter;
-Lcom/android/server/am/ActiveServices$SystemExemptedFgsTypePermission;
-Lcom/android/server/am/ActiveServices;
-Lcom/android/server/am/ActiveUids;
-Lcom/android/server/am/ActivityManagerConstants$1;
-Lcom/android/server/am/ActivityManagerConstants$2;
-Lcom/android/server/am/ActivityManagerConstants;
-Lcom/android/server/am/ActivityManagerGlobalLock;
-Lcom/android/server/am/ActivityManagerLocal;
-Lcom/android/server/am/ActivityManagerProcLock;
-Lcom/android/server/am/ActivityManagerService$12;
-Lcom/android/server/am/ActivityManagerService$13;
-Lcom/android/server/am/ActivityManagerService$16;
 Lcom/android/server/am/ActivityManagerService$1;
-Lcom/android/server/am/ActivityManagerService$2;
-Lcom/android/server/am/ActivityManagerService$3;
-Lcom/android/server/am/ActivityManagerService$6;
-Lcom/android/server/am/ActivityManagerService$8;
-Lcom/android/server/am/ActivityManagerService$FgsTempAllowListItem;
-Lcom/android/server/am/ActivityManagerService$GetBackgroundStartPrivilegesFunctor;
-Lcom/android/server/am/ActivityManagerService$HiddenApiSettings;
-Lcom/android/server/am/ActivityManagerService$Injector;
-Lcom/android/server/am/ActivityManagerService$IntentFirewallInterface;
-Lcom/android/server/am/ActivityManagerService$Lifecycle;
 Lcom/android/server/am/ActivityManagerService$LocalService;
-Lcom/android/server/am/ActivityManagerService$MainHandler$1;
 Lcom/android/server/am/ActivityManagerService$MainHandler;
-Lcom/android/server/am/ActivityManagerService$PidMap;
-Lcom/android/server/am/ActivityManagerService$ProcessChangeItem;
-Lcom/android/server/am/ActivityManagerService$UiHandler;
-Lcom/android/server/am/ActivityManagerService;
-Lcom/android/server/am/ActivityManagerShellCommand;
-Lcom/android/server/am/AnrHelper$$ExternalSyntheticLambda0;
-Lcom/android/server/am/AnrHelper$$ExternalSyntheticLambda1;
-Lcom/android/server/am/AnrHelper$AnrConsumerThread;
-Lcom/android/server/am/AnrHelper;
-Lcom/android/server/am/AppBatteryExemptionTracker$AppBatteryExemptionPolicy;
-Lcom/android/server/am/AppBatteryExemptionTracker$UidBatteryStates;
-Lcom/android/server/am/AppBatteryExemptionTracker;
-Lcom/android/server/am/AppBatteryTracker$$ExternalSyntheticLambda0;
-Lcom/android/server/am/AppBatteryTracker$$ExternalSyntheticLambda1;
-Lcom/android/server/am/AppBatteryTracker$AppBatteryPolicy;
-Lcom/android/server/am/AppBatteryTracker$BatteryUsage;
-Lcom/android/server/am/AppBatteryTracker$ImmutableBatteryUsage;
-Lcom/android/server/am/AppBatteryTracker;
-Lcom/android/server/am/AppBindServiceEventsTracker$AppBindServiceEventsPolicy;
-Lcom/android/server/am/AppBindServiceEventsTracker;
-Lcom/android/server/am/AppBroadcastEventsTracker$AppBroadcastEventsPolicy;
-Lcom/android/server/am/AppBroadcastEventsTracker;
-Lcom/android/server/am/AppErrors;
-Lcom/android/server/am/AppExitInfoTracker$1;
-Lcom/android/server/am/AppExitInfoTracker$2;
-Lcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;
-Lcom/android/server/am/AppExitInfoTracker$AppTraceRetriever;
-Lcom/android/server/am/AppExitInfoTracker$IsolatedUidRecords;
-Lcom/android/server/am/AppExitInfoTracker$KillHandler;
-Lcom/android/server/am/AppExitInfoTracker;
-Lcom/android/server/am/AppFGSTracker$1;
-Lcom/android/server/am/AppFGSTracker$AppFGSPolicy;
-Lcom/android/server/am/AppFGSTracker$MyHandler;
-Lcom/android/server/am/AppFGSTracker$NotificationListener;
-Lcom/android/server/am/AppFGSTracker$PackageDurations;
-Lcom/android/server/am/AppFGSTracker;
-Lcom/android/server/am/AppMediaSessionTracker$$ExternalSyntheticLambda0;
-Lcom/android/server/am/AppMediaSessionTracker$AppMediaSessionPolicy;
-Lcom/android/server/am/AppMediaSessionTracker;
-Lcom/android/server/am/AppPermissionTracker$AppPermissionPolicy;
-Lcom/android/server/am/AppPermissionTracker$MyHandler;
-Lcom/android/server/am/AppPermissionTracker;
-Lcom/android/server/am/AppProfiler$$ExternalSyntheticLambda0;
-Lcom/android/server/am/AppProfiler$1;
-Lcom/android/server/am/AppProfiler$BgHandler;
-Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;
-Lcom/android/server/am/AppProfiler$ProcessCpuThread;
-Lcom/android/server/am/AppProfiler$ProfileData;
-Lcom/android/server/am/AppProfiler;
-Lcom/android/server/am/AppRestrictionController$$ExternalSyntheticLambda1;
-Lcom/android/server/am/AppRestrictionController$1;
-Lcom/android/server/am/AppRestrictionController$2;
-Lcom/android/server/am/AppRestrictionController$3;
-Lcom/android/server/am/AppRestrictionController$4;
-Lcom/android/server/am/AppRestrictionController$5;
-Lcom/android/server/am/AppRestrictionController$BgHandler;
-Lcom/android/server/am/AppRestrictionController$ConstantsObserver;
-Lcom/android/server/am/AppRestrictionController$Injector;
-Lcom/android/server/am/AppRestrictionController$NotificationHelper$1;
-Lcom/android/server/am/AppRestrictionController$NotificationHelper;
-Lcom/android/server/am/AppRestrictionController$RestrictionSettings;
-Lcom/android/server/am/AppRestrictionController$TrackerInfo;
-Lcom/android/server/am/AppRestrictionController$UidBatteryUsageProvider;
-Lcom/android/server/am/AppRestrictionController;
-Lcom/android/server/am/AppStartInfoTracker$1;
-Lcom/android/server/am/AppStartInfoTracker$2;
-Lcom/android/server/am/AppStartInfoTracker;
-Lcom/android/server/am/BaseAppStateDurations;
-Lcom/android/server/am/BaseAppStateDurationsTracker$SimplePackageDurations;
-Lcom/android/server/am/BaseAppStateDurationsTracker$UidStateDurations;
-Lcom/android/server/am/BaseAppStateDurationsTracker;
-Lcom/android/server/am/BaseAppStateEvents$Factory;
-Lcom/android/server/am/BaseAppStateEvents$MaxTrackingDurationConfig;
-Lcom/android/server/am/BaseAppStateEvents;
-Lcom/android/server/am/BaseAppStateEventsTracker$BaseAppStateEventsPolicy;
-Lcom/android/server/am/BaseAppStateEventsTracker;
-Lcom/android/server/am/BaseAppStatePolicy;
-Lcom/android/server/am/BaseAppStateTimeEvents;
-Lcom/android/server/am/BaseAppStateTimeSlotEvents;
-Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy;
-Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$H;
-Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;
-Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker;
-Lcom/android/server/am/BaseAppStateTracker$Injector;
-Lcom/android/server/am/BaseAppStateTracker$StateListener;
-Lcom/android/server/am/BaseAppStateTracker;
-Lcom/android/server/am/BaseErrorDialog;
-Lcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda14;
-Lcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda15;
-Lcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda16;
-Lcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda33;
-Lcom/android/server/am/BatteryStatsService$1;
-Lcom/android/server/am/BatteryStatsService$2;
 Lcom/android/server/am/BatteryStatsService$3;
 Lcom/android/server/am/BatteryStatsService$LocalService;
-Lcom/android/server/am/BatteryStatsService$WakeupReasonThread;
-Lcom/android/server/am/BatteryStatsService;
-Lcom/android/server/am/BroadcastConstants$SettingsObserver;
-Lcom/android/server/am/BroadcastConstants;
-Lcom/android/server/am/BroadcastDeliveryFailedException;
-Lcom/android/server/am/BroadcastFilter;
-Lcom/android/server/am/BroadcastHistory;
-Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;
-Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate;
-Lcom/android/server/am/BroadcastProcessQueue;
-Lcom/android/server/am/BroadcastQueue;
-Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda12;
-Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda13;
-Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda14;
-Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda15;
-Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda16;
-Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda17;
-Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda6;
-Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda7;
-Lcom/android/server/am/BroadcastQueueModernImpl$BroadcastAnrTimer;
-Lcom/android/server/am/BroadcastQueueModernImpl;
-Lcom/android/server/am/BroadcastRecord;
-Lcom/android/server/am/BroadcastRetryException;
-Lcom/android/server/am/BroadcastSkipPolicy;
-Lcom/android/server/am/CacheOomRanker$1;
-Lcom/android/server/am/CacheOomRanker$CacheUseComparator;
-Lcom/android/server/am/CacheOomRanker$LastActivityTimeComparator;
-Lcom/android/server/am/CacheOomRanker$LastRssComparator;
-Lcom/android/server/am/CacheOomRanker$ProcessDependencies;
-Lcom/android/server/am/CacheOomRanker$ProcessDependenciesImpl;
-Lcom/android/server/am/CacheOomRanker$RssComparator;
-Lcom/android/server/am/CacheOomRanker$ScoreComparator;
-Lcom/android/server/am/CacheOomRanker;
-Lcom/android/server/am/CachedAppOptimizer$1;
-Lcom/android/server/am/CachedAppOptimizer$2;
-Lcom/android/server/am/CachedAppOptimizer$3;
-Lcom/android/server/am/CachedAppOptimizer$4;
-Lcom/android/server/am/CachedAppOptimizer$AggregatedCompactionStats;
-Lcom/android/server/am/CachedAppOptimizer$AggregatedProcessCompactionStats;
-Lcom/android/server/am/CachedAppOptimizer$AggregatedSourceCompactionStats;
-Lcom/android/server/am/CachedAppOptimizer$CancelCompactReason;
-Lcom/android/server/am/CachedAppOptimizer$CompactProfile;
-Lcom/android/server/am/CachedAppOptimizer$CompactSource;
-Lcom/android/server/am/CachedAppOptimizer$DefaultProcessDependencies;
-Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;
-Lcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;
-Lcom/android/server/am/CachedAppOptimizer$ProcessDependencies;
-Lcom/android/server/am/CachedAppOptimizer$PropertyChangedCallbackForTest;
-Lcom/android/server/am/CachedAppOptimizer$SettingsContentObserver;
-Lcom/android/server/am/CachedAppOptimizer;
-Lcom/android/server/am/ComponentAliasResolver$1;
-Lcom/android/server/am/ComponentAliasResolver;
-Lcom/android/server/am/ContentProviderConnection;
-Lcom/android/server/am/ContentProviderHelper;
-Lcom/android/server/am/DropboxRateLimiter$Clock;
-Lcom/android/server/am/DropboxRateLimiter$DefaultClock;
-Lcom/android/server/am/DropboxRateLimiter;
-Lcom/android/server/am/EventLogTags;
-Lcom/android/server/am/FgsTempAllowList;
-Lcom/android/server/am/ForegroundServiceTypeLoggerModule;
-Lcom/android/server/am/HostingRecord;
-Lcom/android/server/am/InstrumentationReporter$MyThread;
-Lcom/android/server/am/InstrumentationReporter;
-Lcom/android/server/am/LmkdConnection$LmkdConnectionListener;
-Lcom/android/server/am/LmkdConnection;
-Lcom/android/server/am/LowMemDetector$LowMemThread;
-Lcom/android/server/am/LowMemDetector;
-Lcom/android/server/am/NativeCrashListener;
-Lcom/android/server/am/OomAdjProfiler$$ExternalSyntheticLambda0;
-Lcom/android/server/am/OomAdjProfiler$CpuTimes;
-Lcom/android/server/am/OomAdjProfiler;
-Lcom/android/server/am/OomAdjuster$$ExternalSyntheticLambda0;
-Lcom/android/server/am/OomAdjuster$1;
 Lcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;
-Lcom/android/server/am/OomAdjuster;
-Lcom/android/server/am/OomAdjusterModernImpl;
-Lcom/android/server/am/OomConnection$OomConnectionListener;
-Lcom/android/server/am/OomConnection$OomConnectionThread;
-Lcom/android/server/am/OomConnection;
-Lcom/android/server/am/PendingIntentController;
-Lcom/android/server/am/PendingIntentRecord;
-Lcom/android/server/am/PendingStartActivityUids;
-Lcom/android/server/am/PendingTempAllowlists;
-Lcom/android/server/am/PhantomProcessList$Injector;
-Lcom/android/server/am/PhantomProcessList;
-Lcom/android/server/am/PreBootBroadcaster;
-Lcom/android/server/am/ProcessList$$ExternalSyntheticLambda4;
-Lcom/android/server/am/ProcessList$1;
-Lcom/android/server/am/ProcessList$2;
-Lcom/android/server/am/ProcessList$ImperceptibleKillRunner$H;
-Lcom/android/server/am/ProcessList$ImperceptibleKillRunner$IdlenessReceiver;
-Lcom/android/server/am/ProcessList$ImperceptibleKillRunner;
-Lcom/android/server/am/ProcessList$IsolatedUidRange;
-Lcom/android/server/am/ProcessList$IsolatedUidRangeAllocator;
-Lcom/android/server/am/ProcessList$KillHandler;
-Lcom/android/server/am/ProcessList$MyProcessMap;
-Lcom/android/server/am/ProcessList$ProcStartHandler;
-Lcom/android/server/am/ProcessList;
 Lcom/android/server/am/ProcessRecord;
-Lcom/android/server/am/ProcessStatsService$1;
-Lcom/android/server/am/ProcessStatsService$3;
-Lcom/android/server/am/ProcessStatsService$4;
-Lcom/android/server/am/ProcessStatsService$LocalService;
-Lcom/android/server/am/ProcessStatsService;
-Lcom/android/server/am/ProviderMap;
-Lcom/android/server/am/ReceiverList;
-Lcom/android/server/am/ServiceRecord;
-Lcom/android/server/am/TraceErrorLogger;
-Lcom/android/server/am/UidObserverController$$ExternalSyntheticLambda0;
-Lcom/android/server/am/UidObserverController$ChangeRecord;
-Lcom/android/server/am/UidObserverController;
-Lcom/android/server/am/UidProcessMap;
-Lcom/android/server/am/UserController$1;
-Lcom/android/server/am/UserController$Injector$1;
-Lcom/android/server/am/UserController$Injector;
-Lcom/android/server/am/UserController$UserProgressListener;
-Lcom/android/server/am/UserController;
-Lcom/android/server/am/UserState;
-Lcom/android/server/app/GameManagerService;
 Lcom/android/server/apphibernation/AppHibernationService$$ExternalSyntheticLambda0;
-Lcom/android/server/appop/AppOpMigrationHelper;
-Lcom/android/server/appop/AppOpMigrationHelperImpl;
-Lcom/android/server/appop/AppOpsCheckingServiceImpl$1$1;
-Lcom/android/server/appop/AppOpsCheckingServiceImpl$1;
-Lcom/android/server/appop/AppOpsCheckingServiceImpl;
-Lcom/android/server/appop/AppOpsCheckingServiceInterface$AppOpsModeChangedListener;
-Lcom/android/server/appop/AppOpsCheckingServiceInterface;
-Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;
-Lcom/android/server/appop/AppOpsManagerLocal;
-Lcom/android/server/appop/AppOpsRestrictions$AppOpsRestrictionRemovedListener;
-Lcom/android/server/appop/AppOpsRestrictions;
-Lcom/android/server/appop/AppOpsRestrictionsImpl;
-Lcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda4;
-Lcom/android/server/appop/AppOpsService$1$1;
-Lcom/android/server/appop/AppOpsService$1;
 Lcom/android/server/appop/AppOpsService$2;
-Lcom/android/server/appop/AppOpsService$3;
-Lcom/android/server/appop/AppOpsService$4;
-Lcom/android/server/appop/AppOpsService$8;
 Lcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl;
-Lcom/android/server/appop/AppOpsService$AppOpsManagerLocalImpl;
 Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda1;
 Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda9;
-Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;
-Lcom/android/server/appop/AppOpsService$Constants;
-Lcom/android/server/appop/AppOpsService$ModeCallback;
-Lcom/android/server/appop/AppOpsService$Op;
-Lcom/android/server/appop/AppOpsService$Ops;
-Lcom/android/server/appop/AppOpsService$Shell;
-Lcom/android/server/appop/AppOpsService$UidState;
-Lcom/android/server/appop/AppOpsService;
-Lcom/android/server/appop/AppOpsUidStateTracker;
-Lcom/android/server/appop/AppOpsUidStateTrackerImpl;
-Lcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;
-Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool;
-Lcom/android/server/appop/AttributedOp;
-Lcom/android/server/appop/AudioRestrictionManager;
-Lcom/android/server/appop/DiscreteRegistry$DiscreteOps;
-Lcom/android/server/appop/DiscreteRegistry;
-Lcom/android/server/appop/HistoricalRegistry$1;
-Lcom/android/server/appop/HistoricalRegistry;
-Lcom/android/server/appop/LegacyAppOpStateParser;
-Lcom/android/server/appop/OnOpModeChangedListener;
-Lcom/android/server/biometrics/sensors/face/FaceService;
-Lcom/android/server/broadcastradio/hal1/BroadcastRadioService;
-Lcom/android/server/broadcastradio/hal1/Convert;
-Lcom/android/server/broadcastradio/hal1/Tuner;
-Lcom/android/server/broadcastradio/hal1/TunerCallback;
-Lcom/android/server/companion/virtual/InputController;
-Lcom/android/server/companion/virtual/VirtualDeviceManagerInternal;
-Lcom/android/server/compat/CompatChange$ChangeListener;
-Lcom/android/server/compat/CompatChange;
-Lcom/android/server/compat/CompatConfig;
-Lcom/android/server/compat/OverrideValidatorImpl$SettingsObserver;
-Lcom/android/server/compat/OverrideValidatorImpl;
-Lcom/android/server/compat/PlatformCompat$1;
-Lcom/android/server/compat/PlatformCompat;
-Lcom/android/server/compat/PlatformCompatNative;
-Lcom/android/server/compat/config/Change;
-Lcom/android/server/compat/config/Config;
-Lcom/android/server/compat/config/XmlParser;
 Lcom/android/server/connectivity/MultipathPolicyTracker$2;
-Lcom/android/server/connectivity/Vpn;
-Lcom/android/server/coverage/CoverageService;
-Lcom/android/server/criticalevents/CriticalEventLog$$ExternalSyntheticLambda0;
-Lcom/android/server/criticalevents/CriticalEventLog$$ExternalSyntheticLambda1;
-Lcom/android/server/criticalevents/CriticalEventLog$ILogLoader;
-Lcom/android/server/criticalevents/CriticalEventLog$LogLoader;
-Lcom/android/server/criticalevents/CriticalEventLog$ThreadSafeRingBuffer;
-Lcom/android/server/criticalevents/CriticalEventLog;
-Lcom/android/server/devicepolicy/CryptoTestHelper;
-Lcom/android/server/display/DeviceStateToLayoutMap;
-Lcom/android/server/display/DisplayAdapter$$ExternalSyntheticLambda0;
-Lcom/android/server/display/DisplayAdapter$$ExternalSyntheticLambda1;
-Lcom/android/server/display/DisplayAdapter$Listener;
-Lcom/android/server/display/DisplayAdapter;
-Lcom/android/server/display/DisplayBlanker;
-Lcom/android/server/display/DisplayControl;
-Lcom/android/server/display/DisplayDevice;
-Lcom/android/server/display/DisplayDeviceConfig$1;
-Lcom/android/server/display/DisplayDeviceConfig$HighBrightnessModeData;
-Lcom/android/server/display/DisplayDeviceConfig$ThermalBrightnessThrottlingData$ThrottlingLevel;
-Lcom/android/server/display/DisplayDeviceConfig$ThermalBrightnessThrottlingData;
-Lcom/android/server/display/DisplayDeviceConfig;
-Lcom/android/server/display/DisplayDeviceInfo;
-Lcom/android/server/display/DisplayDeviceRepository$Listener;
-Lcom/android/server/display/DisplayDeviceRepository;
-Lcom/android/server/display/DisplayGroup;
-Lcom/android/server/display/DisplayInfoProxy;
-Lcom/android/server/display/DisplayManagerService$1;
-Lcom/android/server/display/DisplayManagerService$2;
-Lcom/android/server/display/DisplayManagerService$BinderService;
-Lcom/android/server/display/DisplayManagerService$BrightnessPair;
-Lcom/android/server/display/DisplayManagerService$DisplayManagerHandler;
-Lcom/android/server/display/DisplayManagerService$ExternalDisplayPolicyInjector;
-Lcom/android/server/display/DisplayManagerService$Injector;
 Lcom/android/server/display/DisplayManagerService$LocalService;
-Lcom/android/server/display/DisplayManagerService$LogicalDisplayListener;
-Lcom/android/server/display/DisplayManagerService$SyncRoot;
-Lcom/android/server/display/DisplayManagerService$UidImportanceListener;
-Lcom/android/server/display/DisplayManagerService;
-Lcom/android/server/display/DisplayManagerShellCommand;
-Lcom/android/server/display/ExternalDisplayPolicy$Injector;
-Lcom/android/server/display/ExternalDisplayPolicy$SkinThermalStatusObserver;
-Lcom/android/server/display/ExternalDisplayPolicy;
-Lcom/android/server/display/ExternalDisplayStatsService$1$$ExternalSyntheticLambda0;
-Lcom/android/server/display/ExternalDisplayStatsService$1$$ExternalSyntheticLambda1;
-Lcom/android/server/display/ExternalDisplayStatsService$1;
-Lcom/android/server/display/ExternalDisplayStatsService$2;
-Lcom/android/server/display/ExternalDisplayStatsService$Injector;
-Lcom/android/server/display/ExternalDisplayStatsService;
-Lcom/android/server/display/HighBrightnessModeMetadataMapper;
-Lcom/android/server/display/LocalDisplayAdapter$BacklightAdapter;
-Lcom/android/server/display/LocalDisplayAdapter$DisplayEventListener;
-Lcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;
-Lcom/android/server/display/LocalDisplayAdapter$Injector;
-Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;
-Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayEventListener;
-Lcom/android/server/display/LocalDisplayAdapter$ProxyDisplayEventReceiver;
-Lcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy;
-Lcom/android/server/display/LocalDisplayAdapter;
-Lcom/android/server/display/LogicalDisplay;
-Lcom/android/server/display/LogicalDisplayMapper$$ExternalSyntheticLambda0;
-Lcom/android/server/display/LogicalDisplayMapper$$ExternalSyntheticLambda3;
-Lcom/android/server/display/LogicalDisplayMapper$Listener;
-Lcom/android/server/display/LogicalDisplayMapper$LogicalDisplayMapperHandler;
-Lcom/android/server/display/LogicalDisplayMapper;
-Lcom/android/server/display/OverlayDisplayAdapter;
-Lcom/android/server/display/PersistentDataStore$BrightnessConfigurations;
-Lcom/android/server/display/PersistentDataStore$DisplayState;
-Lcom/android/server/display/PersistentDataStore$Injector;
-Lcom/android/server/display/PersistentDataStore$StableDeviceValues;
-Lcom/android/server/display/PersistentDataStore;
-Lcom/android/server/display/SmallAreaDetectionController;
-Lcom/android/server/display/VirtualDisplayAdapter$1;
-Lcom/android/server/display/VirtualDisplayAdapter$SurfaceControlDisplayFactory;
-Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;
-Lcom/android/server/display/VirtualDisplayAdapter;
-Lcom/android/server/display/WifiDisplayAdapter;
-Lcom/android/server/display/config/AutoBrightnessModeName;
-Lcom/android/server/display/config/AutoBrightnessSettingName;
-Lcom/android/server/display/config/BrightnessThresholds;
-Lcom/android/server/display/config/BrightnessThrottlingMap;
-Lcom/android/server/display/config/BrightnessThrottlingPoint;
-Lcom/android/server/display/config/DisplayBrightnessMappingConfig;
-Lcom/android/server/display/config/DisplayConfiguration;
-Lcom/android/server/display/config/HbmTiming;
-Lcom/android/server/display/config/HdrBrightnessData;
-Lcom/android/server/display/config/HighBrightnessMode;
-Lcom/android/server/display/config/IntegerArray;
-Lcom/android/server/display/config/NitsMap;
-Lcom/android/server/display/config/Point;
-Lcom/android/server/display/config/PredefinedBrightnessLimitNames;
-Lcom/android/server/display/config/SdrHdrRatioMap;
-Lcom/android/server/display/config/SdrHdrRatioPoint;
-Lcom/android/server/display/config/SensorData;
-Lcom/android/server/display/config/SensorDetails;
-Lcom/android/server/display/config/ThermalStatus;
-Lcom/android/server/display/config/ThermalThrottling;
-Lcom/android/server/display/config/Thresholds;
-Lcom/android/server/display/config/XmlParser;
-Lcom/android/server/display/feature/DeviceConfigParameterProvider;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda0;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda10;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda11;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda12;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda13;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda14;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda15;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda16;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda17;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda18;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda19;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda1;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda20;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda2;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda3;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda4;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda5;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda6;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda7;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda8;
-Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda9;
-Lcom/android/server/display/feature/DisplayManagerFlags$FlagState;
-Lcom/android/server/display/feature/DisplayManagerFlags;
-Lcom/android/server/display/layout/DisplayIdProducer;
-Lcom/android/server/display/layout/Layout$Display;
-Lcom/android/server/display/layout/Layout;
-Lcom/android/server/display/mode/DisplayModeDirector$$ExternalSyntheticLambda0;
-Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda10;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda11;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda12;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda13;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda2;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda5;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda6;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda7;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda8;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda9;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$1;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener$1;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener;
-Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;
-Lcom/android/server/display/mode/DisplayModeDirector$DesiredDisplayModeSpecs;
-Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda0;
-Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda1;
-Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda2;
-Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda3;
-Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings;
-Lcom/android/server/display/mode/DisplayModeDirector$DisplayModeDirectorHandler;
-Lcom/android/server/display/mode/DisplayModeDirector$DisplayObserver;
-Lcom/android/server/display/mode/DisplayModeDirector$HbmObserver;
-Lcom/android/server/display/mode/DisplayModeDirector$Injector;
-Lcom/android/server/display/mode/DisplayModeDirector$RealInjector;
-Lcom/android/server/display/mode/DisplayModeDirector$SensorObserver;
-Lcom/android/server/display/mode/DisplayModeDirector$SettingsObserver;
-Lcom/android/server/display/mode/DisplayModeDirector$UdfpsObserver;
-Lcom/android/server/display/mode/DisplayModeDirector;
-Lcom/android/server/display/mode/RefreshRateVote$PhysicalVote;
-Lcom/android/server/display/mode/RefreshRateVote$RenderVote;
-Lcom/android/server/display/mode/RefreshRateVote;
-Lcom/android/server/display/mode/SkinThermalStatusObserver;
-Lcom/android/server/display/mode/SupportedModesVote;
-Lcom/android/server/display/mode/Vote;
-Lcom/android/server/display/mode/VotesStatsReporter;
-Lcom/android/server/display/mode/VotesStorage$Listener;
-Lcom/android/server/display/mode/VotesStorage;
-Lcom/android/server/display/notifications/ConnectedDisplayUsbErrorsDetector$Listener;
-Lcom/android/server/display/notifications/DisplayNotificationManager$1;
-Lcom/android/server/display/notifications/DisplayNotificationManager$Injector;
-Lcom/android/server/display/notifications/DisplayNotificationManager;
-Lcom/android/server/display/utils/DebugUtils;
-Lcom/android/server/display/utils/DeviceConfigParsingUtils;
 Lcom/android/server/dreams/DreamManagerService$LocalService;
-Lcom/android/server/firewall/AndFilter$1;
-Lcom/android/server/firewall/AndFilter;
-Lcom/android/server/firewall/CategoryFilter$1;
-Lcom/android/server/firewall/CategoryFilter;
-Lcom/android/server/firewall/Filter;
-Lcom/android/server/firewall/FilterFactory;
-Lcom/android/server/firewall/FilterList;
-Lcom/android/server/firewall/IntentFirewall$AMSInterface;
-Lcom/android/server/firewall/IntentFirewall$FirewallHandler;
-Lcom/android/server/firewall/IntentFirewall$FirewallIntentFilter;
-Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;
-Lcom/android/server/firewall/IntentFirewall$Rule;
-Lcom/android/server/firewall/IntentFirewall$RuleObserver;
-Lcom/android/server/firewall/IntentFirewall;
-Lcom/android/server/firewall/NotFilter$1;
-Lcom/android/server/firewall/NotFilter;
-Lcom/android/server/firewall/OrFilter$1;
-Lcom/android/server/firewall/OrFilter;
-Lcom/android/server/firewall/PortFilter$1;
-Lcom/android/server/firewall/PortFilter;
-Lcom/android/server/firewall/SenderFilter$1;
-Lcom/android/server/firewall/SenderFilter$2;
-Lcom/android/server/firewall/SenderFilter$3;
-Lcom/android/server/firewall/SenderFilter$4;
-Lcom/android/server/firewall/SenderFilter$5;
-Lcom/android/server/firewall/SenderFilter;
-Lcom/android/server/firewall/SenderPackageFilter$1;
-Lcom/android/server/firewall/SenderPackageFilter;
-Lcom/android/server/firewall/SenderPermissionFilter$1;
-Lcom/android/server/firewall/SenderPermissionFilter;
-Lcom/android/server/firewall/StringFilter$10;
-Lcom/android/server/firewall/StringFilter$1;
-Lcom/android/server/firewall/StringFilter$2;
-Lcom/android/server/firewall/StringFilter$3;
-Lcom/android/server/firewall/StringFilter$4;
-Lcom/android/server/firewall/StringFilter$5;
-Lcom/android/server/firewall/StringFilter$6;
-Lcom/android/server/firewall/StringFilter$7;
-Lcom/android/server/firewall/StringFilter$8;
-Lcom/android/server/firewall/StringFilter$9;
-Lcom/android/server/firewall/StringFilter$ContainsFilter;
-Lcom/android/server/firewall/StringFilter$EqualsFilter;
-Lcom/android/server/firewall/StringFilter$IsNullFilter;
-Lcom/android/server/firewall/StringFilter$PatternStringFilter;
-Lcom/android/server/firewall/StringFilter$RegexFilter;
-Lcom/android/server/firewall/StringFilter$StartsWithFilter;
-Lcom/android/server/firewall/StringFilter$ValueProvider;
-Lcom/android/server/firewall/StringFilter;
-Lcom/android/server/flags/DynamicFlagBinderDelegate$$ExternalSyntheticLambda0;
-Lcom/android/server/flags/DynamicFlagBinderDelegate$$ExternalSyntheticLambda1;
-Lcom/android/server/flags/DynamicFlagBinderDelegate$1;
-Lcom/android/server/flags/DynamicFlagBinderDelegate$BinderGriever;
-Lcom/android/server/flags/DynamicFlagBinderDelegate;
-Lcom/android/server/flags/FeatureFlagsBinder;
-Lcom/android/server/flags/FeatureFlagsService$PermissionsChecker;
-Lcom/android/server/flags/FeatureFlagsService;
-Lcom/android/server/flags/FlagCache$$ExternalSyntheticLambda0;
-Lcom/android/server/flags/FlagCache;
-Lcom/android/server/flags/FlagOverrideStore$FlagChangeCallback;
-Lcom/android/server/flags/FlagOverrideStore;
-Lcom/android/server/flags/FlagsShellCommand;
-Lcom/android/server/flags/GlobalSettingsProxy;
-Lcom/android/server/flags/SettingsProxy;
-Lcom/android/server/gpu/GpuService;
-Lcom/android/server/graphics/fonts/FontManagerService$Lifecycle;
-Lcom/android/server/input/InputManagerInternal;
-Lcom/android/server/input/InputManagerService$AdditionalDisplayInputProperties;
-Lcom/android/server/input/InputManagerService$InputFilterHost;
-Lcom/android/server/input/InputManagerService$InputManagerHandler;
 Lcom/android/server/input/InputManagerService$LocalService;
-Lcom/android/server/input/InputManagerService;
-Lcom/android/server/input/InputShellCommand;
-Lcom/android/server/input/NativeInputManagerService$NativeImpl;
-Lcom/android/server/input/NativeInputManagerService;
-Lcom/android/server/input/debug/FocusEventDebugView;
 Lcom/android/server/job/JobSchedulerService$4;
 Lcom/android/server/job/controllers/BackgroundJobsController$2;
-Lcom/android/server/lights/LightsManager;
-Lcom/android/server/lights/LightsService$1;
-Lcom/android/server/lights/LightsService$LightImpl;
-Lcom/android/server/lights/LightsService$LightsManagerBinderService;
-Lcom/android/server/lights/LightsService$VintfHalCache;
-Lcom/android/server/lights/LightsService;
-Lcom/android/server/lights/LogicalLight;
-Lcom/android/server/location/gnss/GnssConfiguration;
-Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler;
-Lcom/android/server/location/gnss/GnssVisibilityControl;
-Lcom/android/server/location/gnss/hal/GnssNative;
-Lcom/android/server/locksettings/SyntheticPasswordManager;
 Lcom/android/server/net/watchlist/NetworkWatchlistService$1;
-Lcom/android/server/notification/NotificationManagerService$12;
-Lcom/android/server/om/OverlayActorEnforcer$ActorState;
-Lcom/android/server/om/OverlayActorEnforcer;
-Lcom/android/server/om/OverlayManagerService$$ExternalSyntheticLambda4;
-Lcom/android/server/om/OverlayManagerService;
-Lcom/android/server/om/OverlayReferenceMapper$1;
-Lcom/android/server/om/OverlayReferenceMapper$Provider;
-Lcom/android/server/om/OverlayReferenceMapper;
-Lcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;
-Lcom/android/server/os/DeviceIdentifiersPolicyService;
-Lcom/android/server/pdb/PersistentDataBlockService;
-Lcom/android/server/permission/access/AccessCheckingService;
-Lcom/android/server/permission/access/AccessPersistence$Companion;
-Lcom/android/server/permission/access/AccessPersistence$WriteHandler;
-Lcom/android/server/permission/access/AccessPersistence;
-Lcom/android/server/permission/access/AccessPolicy$Companion;
-Lcom/android/server/permission/access/AccessPolicy;
-Lcom/android/server/permission/access/AccessState;
-Lcom/android/server/permission/access/GetStateScope;
-Lcom/android/server/permission/access/MutableAccessState;
-Lcom/android/server/permission/access/MutableUserState;
-Lcom/android/server/permission/access/MutateStateScope;
-Lcom/android/server/permission/access/SchemePolicy;
-Lcom/android/server/permission/access/UserState;
-Lcom/android/server/permission/access/WritableState;
-Lcom/android/server/permission/access/appop/AppIdAppOpMigration$Companion;
-Lcom/android/server/permission/access/appop/AppIdAppOpMigration;
-Lcom/android/server/permission/access/appop/AppIdAppOpPersistence$Companion;
-Lcom/android/server/permission/access/appop/AppIdAppOpPersistence;
-Lcom/android/server/permission/access/appop/AppIdAppOpPolicy$Companion;
-Lcom/android/server/permission/access/appop/AppIdAppOpPolicy$OnAppOpModeChangedListener;
-Lcom/android/server/permission/access/appop/AppIdAppOpPolicy;
-Lcom/android/server/permission/access/appop/AppIdAppOpUpgrade;
-Lcom/android/server/permission/access/appop/AppOpService$OnAppIdAppOpModeChangedListener;
-Lcom/android/server/permission/access/appop/AppOpService$OnPackageAppOpModeChangedListener;
 Lcom/android/server/permission/access/appop/AppOpService;
-Lcom/android/server/permission/access/appop/BaseAppOpPersistence$Companion;
-Lcom/android/server/permission/access/appop/BaseAppOpPersistence;
-Lcom/android/server/permission/access/appop/BaseAppOpPolicy;
-Lcom/android/server/permission/access/appop/PackageAppOpMigration$Companion;
-Lcom/android/server/permission/access/appop/PackageAppOpMigration;
-Lcom/android/server/permission/access/appop/PackageAppOpPersistence$Companion;
-Lcom/android/server/permission/access/appop/PackageAppOpPersistence;
-Lcom/android/server/permission/access/appop/PackageAppOpPolicy$Companion;
-Lcom/android/server/permission/access/appop/PackageAppOpPolicy$OnAppOpModeChangedListener;
-Lcom/android/server/permission/access/appop/PackageAppOpPolicy;
-Lcom/android/server/permission/access/appop/PackageAppOpUpgrade;
-Lcom/android/server/permission/access/collection/ArraySetExtensionsKt;
-Lcom/android/server/permission/access/immutable/Immutable;
-Lcom/android/server/permission/access/immutable/IndexedList;
-Lcom/android/server/permission/access/immutable/IndexedListSet;
-Lcom/android/server/permission/access/immutable/IndexedMap;
-Lcom/android/server/permission/access/immutable/IndexedReferenceMap;
-Lcom/android/server/permission/access/immutable/IndexedSet;
-Lcom/android/server/permission/access/immutable/IndexedSetExtensionsKt;
-Lcom/android/server/permission/access/immutable/IntMap;
-Lcom/android/server/permission/access/immutable/IntReferenceMap;
-Lcom/android/server/permission/access/immutable/IntSet;
-Lcom/android/server/permission/access/immutable/MutableIndexedList;
-Lcom/android/server/permission/access/immutable/MutableIndexedListSet;
-Lcom/android/server/permission/access/immutable/MutableIndexedMap;
-Lcom/android/server/permission/access/immutable/MutableIndexedReferenceMap;
-Lcom/android/server/permission/access/immutable/MutableIndexedSet;
-Lcom/android/server/permission/access/immutable/MutableIntMap;
-Lcom/android/server/permission/access/immutable/MutableIntReferenceMap;
-Lcom/android/server/permission/access/immutable/MutableIntSet;
-Lcom/android/server/permission/access/permission/AppIdPermissionMigration$Companion;
-Lcom/android/server/permission/access/permission/AppIdPermissionMigration;
-Lcom/android/server/permission/access/permission/AppIdPermissionPersistence$Companion;
-Lcom/android/server/permission/access/permission/AppIdPermissionPersistence;
-Lcom/android/server/permission/access/permission/AppIdPermissionPolicy$Companion;
-Lcom/android/server/permission/access/permission/AppIdPermissionPolicy;
-Lcom/android/server/permission/access/permission/AppIdPermissionUpgrade$Companion;
-Lcom/android/server/permission/access/permission/AppIdPermissionUpgrade;
-Lcom/android/server/permission/access/permission/DevicePermissionPersistence$Companion;
-Lcom/android/server/permission/access/permission/DevicePermissionPersistence;
-Lcom/android/server/permission/access/permission/DevicePermissionPolicy$Companion;
-Lcom/android/server/permission/access/permission/DevicePermissionPolicy;
-Lcom/android/server/permission/access/permission/PermissionService$Companion;
-Lcom/android/server/permission/access/permission/PermissionService;
-Lcom/android/server/permission/jarjar/kotlin/UninitializedPropertyAccessException;
-Lcom/android/server/permission/jarjar/kotlin/collections/ArraysKt;
-Lcom/android/server/permission/jarjar/kotlin/collections/ArraysKt__ArraysJVMKt;
-Lcom/android/server/permission/jarjar/kotlin/collections/ArraysKt__ArraysKt;
-Lcom/android/server/permission/jarjar/kotlin/collections/ArraysKt___ArraysJvmKt;
-Lcom/android/server/permission/jarjar/kotlin/collections/ArraysKt___ArraysKt;
-Lcom/android/server/permission/jarjar/kotlin/collections/ArraysUtilJVM;
-Lcom/android/server/permission/jarjar/kotlin/collections/EmptySet;
-Lcom/android/server/permission/jarjar/kotlin/collections/SetsKt;
-Lcom/android/server/permission/jarjar/kotlin/collections/SetsKt__SetsJVMKt;
-Lcom/android/server/permission/jarjar/kotlin/collections/SetsKt__SetsKt;
-Lcom/android/server/permission/jarjar/kotlin/collections/SetsKt___SetsKt;
-Lcom/android/server/permission/jarjar/kotlin/jvm/internal/Intrinsics;
-Lcom/android/server/pm/AbstractStatsBase$1;
-Lcom/android/server/pm/AbstractStatsBase;
-Lcom/android/server/pm/ApexManager$1;
-Lcom/android/server/pm/ApexManager$ActiveApexInfo;
-Lcom/android/server/pm/ApexManager$ApexManagerImpl;
-Lcom/android/server/pm/ApexManager$ScanResult;
-Lcom/android/server/pm/ApexManager;
-Lcom/android/server/pm/ApexSystemServiceInfo;
-Lcom/android/server/pm/AppDataHelper;
-Lcom/android/server/pm/AppIdSettingMap;
-Lcom/android/server/pm/AppsFilterBase;
-Lcom/android/server/pm/AppsFilterImpl$$ExternalSyntheticLambda0;
-Lcom/android/server/pm/AppsFilterImpl$1;
-Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;
-Lcom/android/server/pm/AppsFilterImpl;
-Lcom/android/server/pm/AppsFilterLocked;
-Lcom/android/server/pm/AppsFilterSnapshot;
-Lcom/android/server/pm/AppsFilterUtils;
-Lcom/android/server/pm/BackgroundDexOptService;
-Lcom/android/server/pm/BroadcastHelper;
-Lcom/android/server/pm/ChangedPackagesTracker;
-Lcom/android/server/pm/CompilerStats;
-Lcom/android/server/pm/Computer;
-Lcom/android/server/pm/ComputerEngine$$ExternalSyntheticLambda1;
-Lcom/android/server/pm/ComputerEngine$Settings;
-Lcom/android/server/pm/ComputerEngine;
-Lcom/android/server/pm/ComputerLocked;
-Lcom/android/server/pm/CrossProfileIntentFilter;
 Lcom/android/server/pm/CrossProfileIntentResolver;
-Lcom/android/server/pm/CrossProfileIntentResolverEngine;
-Lcom/android/server/pm/CrossProfileResolver;
-Lcom/android/server/pm/DataLoaderManagerService$DataLoaderManagerBinderService;
-Lcom/android/server/pm/DataLoaderManagerService;
-Lcom/android/server/pm/DefaultAppProvider;
-Lcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder;
-Lcom/android/server/pm/DefaultCrossProfileIntentFilter;
-Lcom/android/server/pm/DefaultCrossProfileIntentFiltersUtils;
-Lcom/android/server/pm/DefaultCrossProfileResolver;
-Lcom/android/server/pm/DeletePackageAction;
-Lcom/android/server/pm/DeletePackageHelper;
-Lcom/android/server/pm/DexOptHelper$1;
-Lcom/android/server/pm/DexOptHelper$DexoptDoneHandler;
-Lcom/android/server/pm/DexOptHelper;
-Lcom/android/server/pm/DistractingPackageHelper;
-Lcom/android/server/pm/DomainVerificationConnection;
-Lcom/android/server/pm/FeatureConfig;
-Lcom/android/server/pm/FreeStorageHelper;
-Lcom/android/server/pm/IncrementalProgressListener;
-Lcom/android/server/pm/InitAppsHelper$$ExternalSyntheticLambda1;
-Lcom/android/server/pm/InitAppsHelper$$ExternalSyntheticLambda2;
-Lcom/android/server/pm/InitAppsHelper;
-Lcom/android/server/pm/InstallArgs;
-Lcom/android/server/pm/InstallPackageHelper$$ExternalSyntheticLambda2;
-Lcom/android/server/pm/InstallPackageHelper$$ExternalSyntheticLambda3;
-Lcom/android/server/pm/InstallPackageHelper;
-Lcom/android/server/pm/InstallRequest;
-Lcom/android/server/pm/InstallSource;
-Lcom/android/server/pm/Installer$$ExternalSyntheticLambda0;
-Lcom/android/server/pm/Installer$InstallerException;
-Lcom/android/server/pm/Installer$LegacyDexoptDisabledException;
-Lcom/android/server/pm/Installer;
-Lcom/android/server/pm/InstantAppRegistry$1;
-Lcom/android/server/pm/InstantAppRegistry$2;
-Lcom/android/server/pm/InstantAppRegistry$CookiePersistence;
-Lcom/android/server/pm/InstantAppRegistry;
-Lcom/android/server/pm/InstantAppResolverConnection;
-Lcom/android/server/pm/InstructionSets;
-Lcom/android/server/pm/KeySetHandle;
-Lcom/android/server/pm/KeySetManagerService$PublicKeyHandle;
-Lcom/android/server/pm/KeySetManagerService;
-Lcom/android/server/pm/ModuleInfoProvider;
-Lcom/android/server/pm/MovePackageHelper$MoveCallbacks;
-Lcom/android/server/pm/NoFilteringResolver;
-Lcom/android/server/pm/PackageAbiHelper$Abis;
-Lcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths;
-Lcom/android/server/pm/PackageAbiHelper;
-Lcom/android/server/pm/PackageAbiHelperImpl;
-Lcom/android/server/pm/PackageArchiver;
-Lcom/android/server/pm/PackageDexOptimizer$1;
-Lcom/android/server/pm/PackageDexOptimizer$ForcedUpdatePackageDexOptimizer;
-Lcom/android/server/pm/PackageDexOptimizer$Injector;
-Lcom/android/server/pm/PackageDexOptimizer;
-Lcom/android/server/pm/PackageFreezer;
 Lcom/android/server/pm/PackageHandler;
-Lcom/android/server/pm/PackageInstallerService$1;
-Lcom/android/server/pm/PackageInstallerService$Lifecycle;
-Lcom/android/server/pm/PackageInstallerService$PackageDeleteObserverAdapter;
-Lcom/android/server/pm/PackageInstallerService;
-Lcom/android/server/pm/PackageKeySetData;
-Lcom/android/server/pm/PackageManagerException;
-Lcom/android/server/pm/PackageManagerInternalBase;
-Lcom/android/server/pm/PackageManagerLocal;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda10;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda11;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda12;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda13;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda14;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda15;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda16;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda17;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda18;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda19;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda1;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda20;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda21;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda22;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda23;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda24;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda25;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda26;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda27;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda28;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda29;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda2;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda30;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda32;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda33;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda34;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda35;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda36;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda37;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda38;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda3;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda41;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda42;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda50;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda51;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda6;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda7;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda8;
-Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda9;
-Lcom/android/server/pm/PackageManagerService$1;
-Lcom/android/server/pm/PackageManagerService$2;
-Lcom/android/server/pm/PackageManagerService$3;
-Lcom/android/server/pm/PackageManagerService$4;
-Lcom/android/server/pm/PackageManagerService$5;
-Lcom/android/server/pm/PackageManagerService$6;
-Lcom/android/server/pm/PackageManagerService$DefaultSystemWrapper;
 Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;
 Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-Lcom/android/server/pm/PackageManagerService$Snapshot;
-Lcom/android/server/pm/PackageManagerService;
-Lcom/android/server/pm/PackageManagerServiceCompilerMapping;
-Lcom/android/server/pm/PackageManagerServiceInjector$Producer;
-Lcom/android/server/pm/PackageManagerServiceInjector$ProducerWithArgument;
-Lcom/android/server/pm/PackageManagerServiceInjector$ServiceProducer;
-Lcom/android/server/pm/PackageManagerServiceInjector$Singleton;
-Lcom/android/server/pm/PackageManagerServiceInjector$SystemWrapper;
-Lcom/android/server/pm/PackageManagerServiceInjector;
-Lcom/android/server/pm/PackageManagerServiceUtils$$ExternalSyntheticLambda0;
-Lcom/android/server/pm/PackageManagerServiceUtils$$ExternalSyntheticLambda1;
-Lcom/android/server/pm/PackageManagerServiceUtils$$ExternalSyntheticLambda2;
-Lcom/android/server/pm/PackageManagerServiceUtils$1;
-Lcom/android/server/pm/PackageManagerServiceUtils;
-Lcom/android/server/pm/PackageManagerShellCommandDataLoader;
-Lcom/android/server/pm/PackageManagerTracedLock;
-Lcom/android/server/pm/PackageMetrics;
-Lcom/android/server/pm/PackageMonitorCallbackHelper;
-Lcom/android/server/pm/PackageObserverHelper;
-Lcom/android/server/pm/PackageProperty;
-Lcom/android/server/pm/PackageRemovedInfo;
-Lcom/android/server/pm/PackageSender;
-Lcom/android/server/pm/PackageSessionProvider;
-Lcom/android/server/pm/PackageSetting$1;
 Lcom/android/server/pm/PackageSetting;
-Lcom/android/server/pm/PackageSignatures;
-Lcom/android/server/pm/PackageUsage;
-Lcom/android/server/pm/ParallelPackageParser$$ExternalSyntheticLambda0;
-Lcom/android/server/pm/ParallelPackageParser$ParseResult;
-Lcom/android/server/pm/ParallelPackageParser;
-Lcom/android/server/pm/PendingPackageBroadcasts;
-Lcom/android/server/pm/PersistentPreferredActivity;
-Lcom/android/server/pm/PersistentPreferredIntentResolver;
-Lcom/android/server/pm/Policy$PolicyBuilder;
-Lcom/android/server/pm/Policy;
-Lcom/android/server/pm/PolicyComparator;
-Lcom/android/server/pm/PreferredActivity$1;
-Lcom/android/server/pm/PreferredActivity;
-Lcom/android/server/pm/PreferredActivityHelper;
-Lcom/android/server/pm/PreferredComponent$Callbacks;
-Lcom/android/server/pm/PreferredComponent;
-Lcom/android/server/pm/PreferredIntentResolver$1;
 Lcom/android/server/pm/PreferredIntentResolver;
-Lcom/android/server/pm/PrepareFailure;
-Lcom/android/server/pm/ProcessLoggingHandler;
-Lcom/android/server/pm/ProtectedPackages;
-Lcom/android/server/pm/ReconcileFailure;
-Lcom/android/server/pm/ReconcilePackageUtils;
-Lcom/android/server/pm/ReconciledPackage;
-Lcom/android/server/pm/RemovePackageHelper;
-Lcom/android/server/pm/ResilientAtomicFile$ReadEventLogger;
-Lcom/android/server/pm/ResilientAtomicFile;
-Lcom/android/server/pm/ResolveIntentHelper;
-Lcom/android/server/pm/RestrictionsSet;
-Lcom/android/server/pm/SELinuxMMAC;
-Lcom/android/server/pm/ScanPackageUtils;
-Lcom/android/server/pm/ScanPartition;
-Lcom/android/server/pm/ScanRequest;
-Lcom/android/server/pm/ScanResult;
-Lcom/android/server/pm/SettingBase;
-Lcom/android/server/pm/Settings$$ExternalSyntheticLambda1;
-Lcom/android/server/pm/Settings$$ExternalSyntheticLambda2;
-Lcom/android/server/pm/Settings$1;
-Lcom/android/server/pm/Settings$2;
-Lcom/android/server/pm/Settings$3;
-Lcom/android/server/pm/Settings$KeySetToValueMap;
-Lcom/android/server/pm/Settings$RuntimePermissionPersistence$MyHandler;
-Lcom/android/server/pm/Settings$RuntimePermissionPersistence$PersistenceHandler;
-Lcom/android/server/pm/Settings$RuntimePermissionPersistence;
-Lcom/android/server/pm/Settings$VersionInfo;
-Lcom/android/server/pm/Settings;
-Lcom/android/server/pm/SettingsXml$ChildSection;
-Lcom/android/server/pm/SettingsXml$ReadSection;
-Lcom/android/server/pm/SettingsXml$ReadSectionImpl;
-Lcom/android/server/pm/SettingsXml;
-Lcom/android/server/pm/SharedLibrariesImpl$$ExternalSyntheticLambda0;
-Lcom/android/server/pm/SharedLibrariesImpl$1;
-Lcom/android/server/pm/SharedLibrariesImpl$2;
-Lcom/android/server/pm/SharedLibrariesImpl;
-Lcom/android/server/pm/SharedLibrariesRead;
-Lcom/android/server/pm/SharedLibraryUtils;
-Lcom/android/server/pm/SharedUidMigration;
-Lcom/android/server/pm/SharedUserSetting$1;
-Lcom/android/server/pm/SharedUserSetting$2;
-Lcom/android/server/pm/SharedUserSetting;
-Lcom/android/server/pm/SnapshotStatistics$1;
-Lcom/android/server/pm/SnapshotStatistics$BinMap;
-Lcom/android/server/pm/SnapshotStatistics$Stats;
-Lcom/android/server/pm/SnapshotStatistics;
-Lcom/android/server/pm/StorageEventHelper;
-Lcom/android/server/pm/SuspendPackageHelper;
-Lcom/android/server/pm/SystemDeleteException;
-Lcom/android/server/pm/UpdateOwnershipHelper;
-Lcom/android/server/pm/UserDataPreparer;
-Lcom/android/server/pm/UserJourneyLogger;
-Lcom/android/server/pm/UserManagerInternal$UserLifecycleListener;
-Lcom/android/server/pm/UserManagerInternal;
-Lcom/android/server/pm/UserManagerService$$ExternalSyntheticLambda1;
-Lcom/android/server/pm/UserManagerService$$ExternalSyntheticLambda4;
-Lcom/android/server/pm/UserManagerService$1;
-Lcom/android/server/pm/UserManagerService$2;
-Lcom/android/server/pm/UserManagerService$3;
 Lcom/android/server/pm/UserManagerService$LocalService;
-Lcom/android/server/pm/UserManagerService$MainHandler;
-Lcom/android/server/pm/UserManagerService$SettingsObserver;
-Lcom/android/server/pm/UserManagerService$UserData;
-Lcom/android/server/pm/UserManagerService$WatchedUserStates;
-Lcom/android/server/pm/UserManagerService;
-Lcom/android/server/pm/UserManagerServiceShellCommand;
-Lcom/android/server/pm/UserNeedsBadgingCache;
-Lcom/android/server/pm/UserRestrictionsUtils;
-Lcom/android/server/pm/UserSystemPackageInstaller;
-Lcom/android/server/pm/UserTypeDetails$Builder;
-Lcom/android/server/pm/UserTypeDetails;
-Lcom/android/server/pm/UserTypeFactory;
-Lcom/android/server/pm/UserVisibilityMediator;
-Lcom/android/server/pm/WatchedIntentFilter;
-Lcom/android/server/pm/WatchedIntentResolver$1;
-Lcom/android/server/pm/WatchedIntentResolver$2;
-Lcom/android/server/pm/WatchedIntentResolver;
-Lcom/android/server/pm/dex/ArtManagerService$ArtManagerInternalImpl;
-Lcom/android/server/pm/dex/ArtManagerService;
-Lcom/android/server/pm/dex/ArtStatsLogUtils$ArtStatsLogger;
-Lcom/android/server/pm/dex/DexManager;
-Lcom/android/server/pm/dex/DynamicCodeLogger;
-Lcom/android/server/pm/dex/PackageDexUsage;
-Lcom/android/server/pm/dex/PackageDynamicCodeLoading;
-Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;
 Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;
 Lcom/android/server/pm/local/PackageManagerLocalImpl;
-Lcom/android/server/pm/parsing/PackageCacher;
-Lcom/android/server/pm/parsing/PackageInfoUtils;
-Lcom/android/server/pm/parsing/library/AndroidHidlUpdater;
-Lcom/android/server/pm/parsing/library/AndroidNetIpSecIkeUpdater;
-Lcom/android/server/pm/parsing/library/AndroidTestBaseUpdater;
-Lcom/android/server/pm/parsing/library/ApexSharedLibraryUpdater;
-Lcom/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdater;
-Lcom/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater;
-Lcom/android/server/pm/parsing/library/PackageBackwardCompatibility$AndroidTestRunnerSplitUpdater;
-Lcom/android/server/pm/parsing/library/PackageBackwardCompatibility;
-Lcom/android/server/pm/parsing/library/PackageSharedLibraryUpdater;
-Lcom/android/server/pm/parsing/pkg/AndroidPackageUtils;
-Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$1;
-Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$2;
-Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache;
-Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper;
-Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;
-Lcom/android/server/pm/permission/DevicePermissionState;
-Lcom/android/server/pm/permission/LegacyPermission;
-Lcom/android/server/pm/permission/LegacyPermissionDataProvider;
-Lcom/android/server/pm/permission/LegacyPermissionManagerInternal;
-Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;
-Lcom/android/server/pm/permission/LegacyPermissionManagerService$Internal;
-Lcom/android/server/pm/permission/LegacyPermissionManagerService;
-Lcom/android/server/pm/permission/LegacyPermissionSettings;
-Lcom/android/server/pm/permission/LegacyPermissionState$PermissionState;
-Lcom/android/server/pm/permission/LegacyPermissionState$UserState;
-Lcom/android/server/pm/permission/LegacyPermissionState;
-Lcom/android/server/pm/permission/Permission;
-Lcom/android/server/pm/permission/PermissionAllowlist;
-Lcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry;
-Lcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;
-Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;
-Lcom/android/server/pm/permission/PermissionManagerService;
-Lcom/android/server/pm/permission/PermissionManagerServiceImpl$$ExternalSyntheticLambda16;
-Lcom/android/server/pm/permission/PermissionManagerServiceImpl$$ExternalSyntheticLambda8;
-Lcom/android/server/pm/permission/PermissionManagerServiceImpl$1;
-Lcom/android/server/pm/permission/PermissionManagerServiceImpl$2;
-Lcom/android/server/pm/permission/PermissionManagerServiceImpl$OnPermissionChangeListeners;
-Lcom/android/server/pm/permission/PermissionManagerServiceImpl$PermissionCallback;
-Lcom/android/server/pm/permission/PermissionManagerServiceImpl;
-Lcom/android/server/pm/permission/PermissionManagerServiceInterface;
-Lcom/android/server/pm/permission/PermissionManagerServiceInternal;
-Lcom/android/server/pm/permission/PermissionMigrationHelper;
-Lcom/android/server/pm/permission/PermissionMigrationHelperImpl;
-Lcom/android/server/pm/permission/PermissionRegistry;
-Lcom/android/server/pm/permission/PermissionState;
-Lcom/android/server/pm/permission/UidPermissionState;
-Lcom/android/server/pm/permission/UserPermissionState;
-Lcom/android/server/pm/pkg/ArchiveState;
-Lcom/android/server/pm/pkg/PackageState;
-Lcom/android/server/pm/pkg/PackageStateInternal;
-Lcom/android/server/pm/pkg/PackageStateUnserialized;
-Lcom/android/server/pm/pkg/PackageStateUtils;
-Lcom/android/server/pm/pkg/PackageUserState;
-Lcom/android/server/pm/pkg/PackageUserStateDefault;
-Lcom/android/server/pm/pkg/PackageUserStateImpl$1;
 Lcom/android/server/pm/pkg/PackageUserStateImpl;
-Lcom/android/server/pm/pkg/PackageUserStateInternal;
-Lcom/android/server/pm/pkg/PackageUserStateUtils;
-Lcom/android/server/pm/pkg/SELinuxUtil;
-Lcom/android/server/pm/pkg/SharedLibrary;
-Lcom/android/server/pm/pkg/SharedLibraryWrapper;
-Lcom/android/server/pm/pkg/SharedUserApi;
-Lcom/android/server/pm/pkg/SuspendParams;
-Lcom/android/server/pm/pkg/mutate/PackageStateMutator$StateWriteWrapper$UserStateWriteWrapper;
-Lcom/android/server/pm/pkg/mutate/PackageStateMutator$StateWriteWrapper;
-Lcom/android/server/pm/pkg/mutate/PackageStateMutator;
-Lcom/android/server/pm/pkg/mutate/PackageStateWrite;
-Lcom/android/server/pm/pkg/mutate/PackageUserStateWrite;
-Lcom/android/server/pm/resolution/ComponentResolver$$ExternalSyntheticLambda0;
-Lcom/android/server/pm/resolution/ComponentResolver$$ExternalSyntheticLambda1;
-Lcom/android/server/pm/resolution/ComponentResolver$$ExternalSyntheticLambda2;
-Lcom/android/server/pm/resolution/ComponentResolver$1;
 Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;
-Lcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver;
 Lcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;
 Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;
 Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;
-Lcom/android/server/pm/resolution/ComponentResolver;
-Lcom/android/server/pm/resolution/ComponentResolverApi;
-Lcom/android/server/pm/resolution/ComponentResolverBase;
-Lcom/android/server/pm/resolution/ComponentResolverLocked;
-Lcom/android/server/pm/snapshot/PackageDataSnapshot;
-Lcom/android/server/pm/verify/domain/DomainVerificationCollector$$ExternalSyntheticLambda0;
-Lcom/android/server/pm/verify/domain/DomainVerificationCollector;
-Lcom/android/server/pm/verify/domain/DomainVerificationDebug;
-Lcom/android/server/pm/verify/domain/DomainVerificationEnforcer$Callback;
-Lcom/android/server/pm/verify/domain/DomainVerificationEnforcer;
-Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState;
-Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings;
-Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal$Connection;
-Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;
-Lcom/android/server/pm/verify/domain/DomainVerificationManagerStub;
-Lcom/android/server/pm/verify/domain/DomainVerificationPersistence$ReadResult;
-Lcom/android/server/pm/verify/domain/DomainVerificationPersistence;
-Lcom/android/server/pm/verify/domain/DomainVerificationService;
-Lcom/android/server/pm/verify/domain/DomainVerificationSettings;
-Lcom/android/server/pm/verify/domain/DomainVerificationShell$Callback;
-Lcom/android/server/pm/verify/domain/DomainVerificationShell;
-Lcom/android/server/pm/verify/domain/DomainVerificationUtils$$ExternalSyntheticLambda0;
-Lcom/android/server/pm/verify/domain/DomainVerificationUtils;
-Lcom/android/server/pm/verify/domain/models/DomainVerificationInternalUserState;
-Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;
-Lcom/android/server/pm/verify/domain/models/DomainVerificationStateMap;
-Lcom/android/server/pm/verify/domain/proxy/DomainVerificationProxy$BaseConnection;
-Lcom/android/server/pm/verify/domain/proxy/DomainVerificationProxy;
-Lcom/android/server/pm/verify/domain/proxy/DomainVerificationProxyUnavailable;
-Lcom/android/server/pm/verify/domain/proxy/DomainVerificationProxyV1$Connection;
-Lcom/android/server/pm/verify/domain/proxy/DomainVerificationProxyV2$Connection;
 Lcom/android/server/policy/PhoneWindowManager;
-Lcom/android/server/policy/WindowManagerPolicy$DisplayContentInfo;
-Lcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;
-Lcom/android/server/policy/WindowManagerPolicy$WindowState;
-Lcom/android/server/power/AmbientDisplaySuppressionController$AmbientDisplaySuppressionChangedCallback;
-Lcom/android/server/power/AmbientDisplaySuppressionController;
-Lcom/android/server/power/AttentionDetector$1;
-Lcom/android/server/power/AttentionDetector$AttentionCallbackInternalImpl;
-Lcom/android/server/power/AttentionDetector;
-Lcom/android/server/power/FaceDownDetector$$ExternalSyntheticLambda1;
-Lcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;
-Lcom/android/server/power/FaceDownDetector$ScreenStateReceiver;
-Lcom/android/server/power/FaceDownDetector;
-Lcom/android/server/power/InattentiveSleepWarningController;
-Lcom/android/server/power/LowPowerStandbyController$$ExternalSyntheticLambda1;
-Lcom/android/server/power/LowPowerStandbyController$$ExternalSyntheticLambda2;
-Lcom/android/server/power/LowPowerStandbyController$1;
-Lcom/android/server/power/LowPowerStandbyController$2;
-Lcom/android/server/power/LowPowerStandbyController$3;
-Lcom/android/server/power/LowPowerStandbyController$Clock;
-Lcom/android/server/power/LowPowerStandbyController$DeviceConfigWrapper;
-Lcom/android/server/power/LowPowerStandbyController$LocalService;
-Lcom/android/server/power/LowPowerStandbyController$LowPowerStandbyHandler;
-Lcom/android/server/power/LowPowerStandbyController$PhoneCallServiceTracker;
-Lcom/android/server/power/LowPowerStandbyController$RealClock;
-Lcom/android/server/power/LowPowerStandbyController$SettingsObserver;
-Lcom/android/server/power/LowPowerStandbyController$TempAllowlistChangeListener;
-Lcom/android/server/power/LowPowerStandbyController;
-Lcom/android/server/power/LowPowerStandbyControllerInternal;
-Lcom/android/server/power/PowerGroup$PowerGroupListener;
-Lcom/android/server/power/PowerManagerService$$ExternalSyntheticLambda0;
-Lcom/android/server/power/PowerManagerService$$ExternalSyntheticLambda1;
 Lcom/android/server/power/PowerManagerService$1;
-Lcom/android/server/power/PowerManagerService$3;
-Lcom/android/server/power/PowerManagerService$4;
-Lcom/android/server/power/PowerManagerService$BatteryReceiver;
-Lcom/android/server/power/PowerManagerService$BinderService;
-Lcom/android/server/power/PowerManagerService$Clock;
-Lcom/android/server/power/PowerManagerService$Constants;
-Lcom/android/server/power/PowerManagerService$DockReceiver;
-Lcom/android/server/power/PowerManagerService$DreamReceiver;
-Lcom/android/server/power/PowerManagerService$Injector$$ExternalSyntheticLambda0;
-Lcom/android/server/power/PowerManagerService$Injector$1;
-Lcom/android/server/power/PowerManagerService$Injector$2;
-Lcom/android/server/power/PowerManagerService$Injector$3;
-Lcom/android/server/power/PowerManagerService$Injector;
 Lcom/android/server/power/PowerManagerService$LocalService;
-Lcom/android/server/power/PowerManagerService$NativeWrapper;
-Lcom/android/server/power/PowerManagerService$PermissionCheckerWrapper;
-Lcom/android/server/power/PowerManagerService$PowerGroupWakefulnessChangeListener;
-Lcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback;
-Lcom/android/server/power/PowerManagerService$PowerPropertiesWrapper;
-Lcom/android/server/power/PowerManagerService$SettingsObserver;
-Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;
-Lcom/android/server/power/PowerManagerService$UserSwitchedReceiver;
-Lcom/android/server/power/PowerManagerService;
-Lcom/android/server/power/PowerManagerShellCommand;
-Lcom/android/server/power/ScreenUndimDetector$InternalClock;
-Lcom/android/server/power/ScreenUndimDetector;
-Lcom/android/server/power/SuspendBlocker;
-Lcom/android/server/power/SystemPropertiesWrapper;
-Lcom/android/server/power/ThermalManagerService$1;
-Lcom/android/server/power/ThermalManagerService$TemperatureWatcher;
-Lcom/android/server/power/ThermalManagerService$ThermalHal10Wrapper;
-Lcom/android/server/power/ThermalManagerService$ThermalHal11Wrapper;
-Lcom/android/server/power/ThermalManagerService$ThermalHal20Wrapper;
-Lcom/android/server/power/ThermalManagerService$ThermalHalAidlWrapper;
-Lcom/android/server/power/ThermalManagerService$ThermalHalWrapper;
-Lcom/android/server/power/ThermalManagerService$ThermalShellCommand;
-Lcom/android/server/power/ThermalManagerService;
-Lcom/android/server/power/batterysaver/BatterySaverController$1;
-Lcom/android/server/power/batterysaver/BatterySaverController$MyHandler;
-Lcom/android/server/power/batterysaver/BatterySaverController;
-Lcom/android/server/power/batterysaver/BatterySaverPolicy$$ExternalSyntheticLambda1;
-Lcom/android/server/power/batterysaver/BatterySaverPolicy$BatterySaverPolicyListener;
-Lcom/android/server/power/batterysaver/BatterySaverPolicy$Policy;
-Lcom/android/server/power/batterysaver/BatterySaverPolicy$PolicyBoolean;
-Lcom/android/server/power/batterysaver/BatterySaverPolicy;
-Lcom/android/server/power/batterysaver/BatterySaverStateMachine$$ExternalSyntheticLambda1;
-Lcom/android/server/power/batterysaver/BatterySaverStateMachine$1;
-Lcom/android/server/power/batterysaver/BatterySaverStateMachine;
-Lcom/android/server/power/batterysaver/BatterySavingStats;
-Lcom/android/server/power/feature/PowerManagerFlags$$ExternalSyntheticLambda0;
-Lcom/android/server/power/feature/PowerManagerFlags$FlagState;
-Lcom/android/server/power/feature/PowerManagerFlags;
-Lcom/android/server/power/hint/HintManagerService$BinderService;
-Lcom/android/server/power/hint/HintManagerService$Injector;
-Lcom/android/server/power/hint/HintManagerService$MyUidObserver;
-Lcom/android/server/power/hint/HintManagerService$NativeWrapper;
-Lcom/android/server/power/hint/HintManagerService;
-Lcom/android/server/power/optimization/FeatureFlags;
-Lcom/android/server/power/optimization/FeatureFlagsImpl;
-Lcom/android/server/power/optimization/Flags;
-Lcom/android/server/power/stats/AggregatedPowerStatsConfig$1;
-Lcom/android/server/power/stats/AggregatedPowerStatsConfig$PowerComponent;
-Lcom/android/server/power/stats/AggregatedPowerStatsConfig;
-Lcom/android/server/power/stats/AggregatedPowerStatsProcessor;
-Lcom/android/server/power/stats/AggregatedPowerStatsSection;
-Lcom/android/server/power/stats/BatteryChargeCalculator;
-Lcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda0;
-Lcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda5;
-Lcom/android/server/power/stats/BatteryExternalStatsWorker$1;
-Lcom/android/server/power/stats/BatteryExternalStatsWorker$2;
-Lcom/android/server/power/stats/BatteryExternalStatsWorker$Injector;
-Lcom/android/server/power/stats/BatteryExternalStatsWorker;
-Lcom/android/server/power/stats/BatteryStatsDumpHelperImpl;
-Lcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda10;
-Lcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda6;
-Lcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda7;
-Lcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda9;
 Lcom/android/server/power/stats/BatteryStatsImpl$1;
-Lcom/android/server/power/stats/BatteryStatsImpl$2;
-Lcom/android/server/power/stats/BatteryStatsImpl$3;
-Lcom/android/server/power/stats/BatteryStatsImpl$4;
-Lcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;
-Lcom/android/server/power/stats/BatteryStatsImpl$BatteryCallback;
-Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder;
-Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig;
-Lcom/android/server/power/stats/BatteryStatsImpl$BinderCallStats;
-Lcom/android/server/power/stats/BatteryStatsImpl$BluetoothActivityInfoCache;
-Lcom/android/server/power/stats/BatteryStatsImpl$Constants;
 Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;
-Lcom/android/server/power/stats/BatteryStatsImpl$Counter;
-Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;
 Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;
-Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;
-Lcom/android/server/power/stats/BatteryStatsImpl$EnergyStatsRetriever;
-Lcom/android/server/power/stats/BatteryStatsImpl$ExternalStatsSync;
-Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;
-Lcom/android/server/power/stats/BatteryStatsImpl$HistoryStepDetailsCalculatorImpl;
 Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;
-Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;
-Lcom/android/server/power/stats/BatteryStatsImpl$MyHandler;
-Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;
-Lcom/android/server/power/stats/BatteryStatsImpl$PlatformIdleStateCallback;
-Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;
-Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;
 Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
-Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;
-Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;
-Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;
 Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;
-Lcom/android/server/power/stats/BatteryStatsImpl$Timer;
-Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;
-Lcom/android/server/power/stats/BatteryStatsImpl$Uid$2;
-Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;
-Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;
 Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;
-Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;
 Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Sensor;
 Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;
 Lcom/android/server/power/stats/BatteryStatsImpl$Uid;
-Lcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider;
-Lcom/android/server/power/stats/BatteryStatsImpl;
-Lcom/android/server/power/stats/BatteryUsageStatsProvider;
-Lcom/android/server/power/stats/BatteryUsageStatsSection;
-Lcom/android/server/power/stats/BluetoothPowerCalculator;
-Lcom/android/server/power/stats/CpuAggregatedPowerStatsProcessor;
-Lcom/android/server/power/stats/CpuPowerCalculator;
-Lcom/android/server/power/stats/CpuPowerStatsCollector$$ExternalSyntheticLambda1;
-Lcom/android/server/power/stats/CpuPowerStatsCollector$CpuStatsArrayLayout;
-Lcom/android/server/power/stats/CpuPowerStatsCollector$KernelCpuStatsReader;
-Lcom/android/server/power/stats/CpuPowerStatsCollector;
-Lcom/android/server/power/stats/EnergyConsumerSnapshot;
-Lcom/android/server/power/stats/KernelWakelockReader;
-Lcom/android/server/power/stats/KernelWakelockStats$Entry;
-Lcom/android/server/power/stats/KernelWakelockStats;
-Lcom/android/server/power/stats/MobileRadioPowerCalculator;
-Lcom/android/server/power/stats/PowerCalculator;
-Lcom/android/server/power/stats/PowerStatsAggregator;
-Lcom/android/server/power/stats/PowerStatsCollector$StatsArrayLayout;
-Lcom/android/server/power/stats/PowerStatsCollector;
-Lcom/android/server/power/stats/PowerStatsExporter;
-Lcom/android/server/power/stats/PowerStatsScheduler$AlarmScheduler;
-Lcom/android/server/power/stats/PowerStatsScheduler;
-Lcom/android/server/power/stats/PowerStatsSpan$Section;
-Lcom/android/server/power/stats/PowerStatsSpan$SectionReader;
-Lcom/android/server/power/stats/PowerStatsStore$$ExternalSyntheticLambda1;
-Lcom/android/server/power/stats/PowerStatsStore$DefaultSectionReader;
-Lcom/android/server/power/stats/PowerStatsStore;
-Lcom/android/server/power/stats/PowerStatsUidResolver$Listener;
-Lcom/android/server/power/stats/PowerStatsUidResolver;
-Lcom/android/server/power/stats/SystemServerCpuThreadReader$SystemServiceCpuThreadTimes;
-Lcom/android/server/power/stats/SystemServerCpuThreadReader;
-Lcom/android/server/power/stats/WakelockPowerCalculator;
-Lcom/android/server/power/stats/WifiPowerCalculator;
-Lcom/android/server/power/stats/wakeups/CpuWakeupStats$$ExternalSyntheticLambda0;
-Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Config;
-Lcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;
-Lcom/android/server/power/stats/wakeups/CpuWakeupStats;
-Lcom/android/server/power/stats/wakeups/IrqDeviceMap;
-Lcom/android/server/powerstats/PowerStatsHALWrapper$IPowerStatsHALWrapper;
-Lcom/android/server/powerstats/PowerStatsHALWrapper$PowerStatsHAL10WrapperImpl;
-Lcom/android/server/powerstats/PowerStatsHALWrapper$PowerStatsHAL20WrapperImpl;
-Lcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache;
-Lcom/android/server/powerstats/PowerStatsHALWrapper;
-Lcom/android/server/powerstats/PowerStatsService$1;
-Lcom/android/server/powerstats/PowerStatsService$DeviceConfigListener;
-Lcom/android/server/powerstats/PowerStatsService$Injector;
 Lcom/android/server/powerstats/PowerStatsService$LocalService;
-Lcom/android/server/powerstats/PowerStatsService;
-Lcom/android/server/recoverysystem/RecoverySystemService$Injector;
-Lcom/android/server/recoverysystem/RecoverySystemService$Lifecycle;
-Lcom/android/server/recoverysystem/RecoverySystemService$PreferencesManager;
-Lcom/android/server/recoverysystem/RecoverySystemService;
-Lcom/android/server/recoverysystem/RecoverySystemShellCommand;
-Lcom/android/server/resources/ResourcesManagerService;
-Lcom/android/server/security/FileIntegrityService$1;
-Lcom/android/server/security/FileIntegrityService$FileIntegrityServiceShellCommand;
-Lcom/android/server/security/FileIntegrityService;
-Lcom/android/server/sensorprivacy/SensorPrivacyService;
-Lcom/android/server/sensors/SensorManagerInternal$ProximityActiveListener;
-Lcom/android/server/sensors/SensorManagerInternal$RuntimeSensorCallback;
-Lcom/android/server/sensors/SensorService;
-Lcom/android/server/soundtrigger_middleware/AudioSessionProviderImpl;
-Lcom/android/server/soundtrigger_middleware/ExternalCaptureStateTracker;
-Lcom/android/server/soundtrigger_middleware/ICaptureStateNotifier;
-Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl$AudioSessionProvider;
-Lcom/android/server/stats/pull/StatsPullAtomService;
-Lcom/android/server/storage/AppFuseBridge;
-Lcom/android/server/tv/TvInputHal;
-Lcom/android/server/tv/UinputBridge;
-Lcom/android/server/uri/UriGrantsManagerInternal;
-Lcom/android/server/uri/UriGrantsManagerService$1;
-Lcom/android/server/uri/UriGrantsManagerService$H;
-Lcom/android/server/uri/UriGrantsManagerService$Lifecycle;
 Lcom/android/server/uri/UriGrantsManagerService$LocalService;
-Lcom/android/server/uri/UriGrantsManagerService;
-Lcom/android/server/uri/UriMetricsHelper$PersistentUriGrantsProvider;
-Lcom/android/server/uri/UriMetricsHelper;
 Lcom/android/server/usage/AppStandbyController;
 Lcom/android/server/usage/UsageStatsService$LocalService;
-Lcom/android/server/usb/UsbAlsaJackDetector;
-Lcom/android/server/usb/UsbAlsaMidiDevice$2;
-Lcom/android/server/usb/UsbAlsaMidiDevice$3;
-Lcom/android/server/usb/UsbAlsaMidiDevice$InputReceiverProxy;
-Lcom/android/server/usb/UsbAlsaMidiDevice;
-Lcom/android/server/usb/UsbDeviceManager;
-Lcom/android/server/usb/UsbHostManager;
-Lcom/android/server/usb/descriptors/UsbDescriptor;
-Lcom/android/server/usb/descriptors/UsbInterfaceDescriptor;
-Lcom/android/server/utils/AnrTimer$Error;
-Lcom/android/server/utils/AnrTimer$FeatureDisabled;
-Lcom/android/server/utils/AnrTimer$FeatureEnabled;
-Lcom/android/server/utils/AnrTimer$FeatureSwitch;
-Lcom/android/server/utils/AnrTimer$Injector;
-Lcom/android/server/utils/AnrTimer;
-Lcom/android/server/utils/FeatureFlags;
-Lcom/android/server/utils/FeatureFlagsImpl;
-Lcom/android/server/utils/Flags;
-Lcom/android/server/utils/FoldSettingProvider;
-Lcom/android/server/utils/PriorityDump$PriorityDumper;
-Lcom/android/server/utils/Slogf;
-Lcom/android/server/utils/Snappable;
-Lcom/android/server/utils/SnapshotCache$Auto;
-Lcom/android/server/utils/SnapshotCache$Sealed;
-Lcom/android/server/utils/SnapshotCache$Statistics;
-Lcom/android/server/utils/SnapshotCache;
-Lcom/android/server/utils/TimingsTraceAndSlog;
-Lcom/android/server/utils/UserSettingDeviceConfigMediator$SettingsOverridesIndividualMediator;
-Lcom/android/server/utils/UserSettingDeviceConfigMediator;
-Lcom/android/server/utils/Watchable;
-Lcom/android/server/utils/WatchableImpl;
-Lcom/android/server/utils/Watched;
-Lcom/android/server/utils/WatchedArrayList$1;
-Lcom/android/server/utils/WatchedArrayList;
-Lcom/android/server/utils/WatchedArrayMap$1;
-Lcom/android/server/utils/WatchedArrayMap;
-Lcom/android/server/utils/WatchedArraySet$1;
-Lcom/android/server/utils/WatchedArraySet;
-Lcom/android/server/utils/WatchedLongSparseArray$1;
-Lcom/android/server/utils/WatchedLongSparseArray;
-Lcom/android/server/utils/WatchedSparseArray$1;
-Lcom/android/server/utils/WatchedSparseArray;
-Lcom/android/server/utils/WatchedSparseBooleanArray;
-Lcom/android/server/utils/WatchedSparseBooleanMatrix;
-Lcom/android/server/utils/WatchedSparseIntArray;
-Lcom/android/server/utils/WatchedSparseSetArray;
-Lcom/android/server/utils/Watcher;
-Lcom/android/server/vibrator/VibratorController$NativeWrapper;
-Lcom/android/server/vibrator/VibratorController$OnVibrationCompleteListener;
-Lcom/android/server/vibrator/VibratorManagerService$OnSyncedVibrationCompleteListener;
-Lcom/android/server/vibrator/VibratorManagerService;
-Lcom/android/server/vr/EnabledComponentsObserver$EnabledComponentChangeListener;
-Lcom/android/server/vr/VrManagerService;
-Lcom/android/server/wm/AbsAppSnapshotController;
-Lcom/android/server/wm/ActivityClientController;
-Lcom/android/server/wm/ActivityMetricsLaunchObserver;
-Lcom/android/server/wm/ActivityMetricsLaunchObserverRegistry;
-Lcom/android/server/wm/ActivityMetricsLogger;
-Lcom/android/server/wm/ActivityRecord;
-Lcom/android/server/wm/ActivityStartController;
-Lcom/android/server/wm/ActivityStartInterceptor;
-Lcom/android/server/wm/ActivityStarter$DefaultFactory;
-Lcom/android/server/wm/ActivityStarter$Factory;
-Lcom/android/server/wm/ActivityTaskManagerInternal$ScreenObserver;
-Lcom/android/server/wm/ActivityTaskManagerInternal$SleepTokenAcquirer;
-Lcom/android/server/wm/ActivityTaskManagerInternal;
-Lcom/android/server/wm/ActivityTaskManagerService$1;
-Lcom/android/server/wm/ActivityTaskManagerService$H;
-Lcom/android/server/wm/ActivityTaskManagerService$Lifecycle;
 Lcom/android/server/wm/ActivityTaskManagerService$LocalService;
-Lcom/android/server/wm/ActivityTaskManagerService$SleepTokenAcquirerImpl;
-Lcom/android/server/wm/ActivityTaskManagerService$UiHandler;
-Lcom/android/server/wm/ActivityTaskManagerService$UpdateConfigurationResult;
-Lcom/android/server/wm/ActivityTaskManagerService;
-Lcom/android/server/wm/ActivityTaskSupervisor$ActivityTaskSupervisorHandler;
-Lcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;
-Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;
-Lcom/android/server/wm/ActivityTaskSupervisor;
-Lcom/android/server/wm/AppTaskImpl;
-Lcom/android/server/wm/AppWarnings$BaseDialog;
-Lcom/android/server/wm/AppWarnings$UiHandler;
-Lcom/android/server/wm/AppWarnings$WriteConfigTask;
-Lcom/android/server/wm/AppWarnings;
-Lcom/android/server/wm/BLASTSyncEngine$TransactionReadyListener;
-Lcom/android/server/wm/BackNavigationController$NavigationMonitor;
-Lcom/android/server/wm/BackNavigationController;
-Lcom/android/server/wm/BackgroundActivityStartController$FinishedActivityEntry;
-Lcom/android/server/wm/BackgroundActivityStartController;
-Lcom/android/server/wm/ClientLifecycleManager;
-Lcom/android/server/wm/CompatModePackages$CompatHandler;
-Lcom/android/server/wm/CompatModePackages;
-Lcom/android/server/wm/ConfigurationContainer;
-Lcom/android/server/wm/ConfigurationContainerListener;
-Lcom/android/server/wm/DeprecatedAbiDialog;
-Lcom/android/server/wm/DeprecatedTargetSdkVersionDialog;
-Lcom/android/server/wm/DesktopModeLaunchParamsModifier;
-Lcom/android/server/wm/DisplayArea$Dimmable;
-Lcom/android/server/wm/DisplayArea;
-Lcom/android/server/wm/DisplayAreaOrganizerController;
-Lcom/android/server/wm/DisplayContent;
-Lcom/android/server/wm/FactoryErrorDialog;
-Lcom/android/server/wm/InputTarget;
-Lcom/android/server/wm/InsetsControlTarget;
-Lcom/android/server/wm/KeyguardController$$ExternalSyntheticLambda0;
-Lcom/android/server/wm/KeyguardController;
-Lcom/android/server/wm/LaunchObserverRegistryImpl;
-Lcom/android/server/wm/LaunchParamsController$LaunchParams;
-Lcom/android/server/wm/LaunchParamsController$LaunchParamsModifier;
-Lcom/android/server/wm/LaunchParamsController;
-Lcom/android/server/wm/LaunchParamsPersister$$ExternalSyntheticLambda2;
-Lcom/android/server/wm/LaunchParamsPersister;
-Lcom/android/server/wm/LockTaskController$LockTaskToken;
-Lcom/android/server/wm/LockTaskController;
-Lcom/android/server/wm/MirrorActiveUids;
-Lcom/android/server/wm/PackageConfigPersister;
-Lcom/android/server/wm/PendingRemoteAnimationRegistry;
-Lcom/android/server/wm/PersisterQueue$$ExternalSyntheticLambda0;
-Lcom/android/server/wm/PersisterQueue$LazyTaskWriterThread;
-Lcom/android/server/wm/PersisterQueue$Listener;
-Lcom/android/server/wm/PersisterQueue$WriteQueueItem;
-Lcom/android/server/wm/PersisterQueue;
-Lcom/android/server/wm/RecentTasks$$ExternalSyntheticLambda0;
-Lcom/android/server/wm/RecentTasks$$ExternalSyntheticLambda1;
-Lcom/android/server/wm/RecentTasks$1;
-Lcom/android/server/wm/RecentTasks$Callbacks;
-Lcom/android/server/wm/RecentTasks;
-Lcom/android/server/wm/RootDisplayArea;
-Lcom/android/server/wm/RootWindowContainer;
-Lcom/android/server/wm/RunningTasks;
-Lcom/android/server/wm/SurfaceAnimationThread;
-Lcom/android/server/wm/SurfaceAnimator$Animatable;
-Lcom/android/server/wm/SurfaceFreezer$Freezable;
-Lcom/android/server/wm/Task;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda0;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda10;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda11;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda12;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda13;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda14;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda15;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda16;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda17;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda18;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda19;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda1;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda20;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda21;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda22;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda23;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda24;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda2;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda3;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda4;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda5;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda6;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda7;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda8;
-Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda9;
-Lcom/android/server/wm/TaskChangeNotificationController$MainHandler;
-Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer;
-Lcom/android/server/wm/TaskChangeNotificationController;
-Lcom/android/server/wm/TaskDisplayArea;
-Lcom/android/server/wm/TaskFpsCallbackController;
-Lcom/android/server/wm/TaskFragment;
-Lcom/android/server/wm/TaskFragmentOrganizerController;
-Lcom/android/server/wm/TaskLaunchParamsModifier;
-Lcom/android/server/wm/TaskOrganizerController;
-Lcom/android/server/wm/TaskPersister;
-Lcom/android/server/wm/TaskSnapshotController;
-Lcom/android/server/wm/Transition$ReadyCondition;
-Lcom/android/server/wm/Transition;
-Lcom/android/server/wm/TransitionController$$ExternalSyntheticLambda4;
-Lcom/android/server/wm/TransitionController$Lock;
-Lcom/android/server/wm/TransitionController$RemotePlayer;
-Lcom/android/server/wm/TransitionController$TransitionMetricsReporter;
-Lcom/android/server/wm/TransitionController;
-Lcom/android/server/wm/UnsupportedCompileSdkDialog;
-Lcom/android/server/wm/UnsupportedDisplaySizeDialog;
-Lcom/android/server/wm/VisibleActivityProcessTracker;
-Lcom/android/server/wm/VrController$1;
-Lcom/android/server/wm/VrController;
-Lcom/android/server/wm/WindowContainer;
-Lcom/android/server/wm/WindowList;
-Lcom/android/server/wm/WindowManagerGlobalLock;
-Lcom/android/server/wm/WindowManagerInternal$AppTransitionListener;
-Lcom/android/server/wm/WindowManagerService$2;
-Lcom/android/server/wm/WindowManagerService$4;
-Lcom/android/server/wm/WindowManagerService$8;
-Lcom/android/server/wm/WindowManagerService$AppFreezeListener;
-Lcom/android/server/wm/WindowManagerService$H;
-Lcom/android/server/wm/WindowManagerService;
-Lcom/android/server/wm/WindowManagerShellCommand;
-Lcom/android/server/wm/WindowManagerThreadPriorityBooster;
-Lcom/android/server/wm/WindowOrganizerController;
-Lcom/android/server/wm/WindowProcessController$ComputeOomAdjCallback;
-Lcom/android/server/wm/WindowProcessController;
-Lcom/android/server/wm/WindowProcessControllerMap;
-Lcom/android/server/wm/WindowProcessListener;
 Lcom/android/server/wm/WindowState;
-Lcom/android/server/wm/WindowToken;
 Lcom/android/server/wm/utils/DisplayInfoOverrides$$ExternalSyntheticLambda0;
-Lcom/android/server/wm/utils/DisplayInfoOverrides$DisplayInfoFieldsUpdater;
-Lcom/android/server/wm/utils/DisplayInfoOverrides;
 Ljava/util/zip/GZIPInputStream;
-[Landroid/hardware/power/stats/Channel;
-[Landroid/hardware/power/stats/EnergyConsumer;
-[Lcom/android/server/am/ActivityManagerService$ProcessChangeItem;
-[Lcom/android/server/am/BroadcastProcessQueue;
-[Lcom/android/server/am/BroadcastRecord;
-[Lcom/android/server/am/CachedAppOptimizer$CancelCompactReason;
-[Lcom/android/server/am/CachedAppOptimizer$CompactSource;
-[Lcom/android/server/am/OomAdjProfiler$CpuTimes;
-[Lcom/android/server/am/UidObserverController$ChangeRecord;
-[Lcom/android/server/display/config/AutoBrightnessModeName;
-[Lcom/android/server/display/config/AutoBrightnessSettingName;
-[Lcom/android/server/display/config/PredefinedBrightnessLimitNames;
-[Lcom/android/server/display/config/ThermalStatus;
-[Lcom/android/server/firewall/FilterFactory;
-[Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;
-[Lcom/android/server/lights/LightsService$LightImpl;
-[Lcom/android/server/om/OverlayActorEnforcer$ActorState;
-[Lcom/android/server/pm/DefaultCrossProfileIntentFilter;
-[Lcom/android/server/pm/PreferredActivity;
-[Lcom/android/server/pm/SnapshotStatistics$Stats;
-[Lcom/android/server/pm/parsing/library/PackageSharedLibraryUpdater;
-[Lcom/android/server/power/stats/BatteryStatsImpl$Counter;
-[Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;
-[Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;
-[Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;
-[Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
-[Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;
-[Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;
-[Lcom/android/server/utils/AnrTimer$Error;
-[Lcom/android/server/wm/ActivityRecord;
-[[Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;
-[[Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;
-[[Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 07fcb50..9701292 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -79,6 +79,7 @@
 import android.view.autofill.IAutoFillManager;
 import android.view.autofill.IAutoFillManagerClient;
 
+import com.android.internal.R;
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.infra.AbstractRemoteService;
@@ -159,6 +160,7 @@
     final FrameworkResourcesServiceNameResolver mFieldClassificationResolver;
 
     private final AutoFillUI mUi;
+    final ComponentName mCredentialAutofillService;
 
     private final LocalLog mRequestsHistory = new LocalLog(20);
     private final LocalLog mUiLatencyHistory = new LocalLog(20);
@@ -288,6 +290,16 @@
                         mAugmentedAutofillResolver.isTemporary(userId));
             }
         }
+        String credentialManagerAutofillCompName = context.getResources().getString(
+                R.string.config_defaultCredentialManagerAutofillService);
+        if (credentialManagerAutofillCompName != null
+                && !credentialManagerAutofillCompName.isEmpty()) {
+            mCredentialAutofillService = ComponentName.unflattenFromString(
+                    credentialManagerAutofillCompName);
+        } else {
+            mCredentialAutofillService = null;
+            Slog.w(TAG, "Invalid CredentialAutofillService");
+        }
     }
 
     @Override // from AbstractMasterSystemService
@@ -363,6 +375,7 @@
                 case AutofillFeatureFlags.DEVICE_CONFIG_AUTOFILL_PCC_FEATURE_PROVIDER_HINTS:
                 case AutofillFeatureFlags.DEVICE_CONFIG_PREFER_PROVIDER_OVER_PCC:
                 case AutofillFeatureFlags.DEVICE_CONFIG_PCC_USE_FALLBACK:
+                case AutofillFeatureFlags.DEVICE_CONFIG_FILL_FIELDS_FROM_CURRENT_SESSION_ONLY:
                 case Flags.FLAG_AUTOFILL_CREDMAN_INTEGRATION:
                     setDeviceConfigProperties();
                     break;
@@ -416,7 +429,6 @@
         } finally {
             Binder.restoreCallingIdentity(token);
         }
-
         return managerService;
     }
 
@@ -710,7 +722,8 @@
                     AutofillFeatureFlags.DEVICE_CONFIG_MAX_INPUT_LENGTH_FOR_AUTOFILL,
                     AutofillFeatureFlags.DEFAULT_MAX_INPUT_LENGTH_FOR_AUTOFILL);
             mAutofillCredmanIntegrationEnabled = Flags.autofillCredmanIntegration();
-            mIsFillFieldsFromCurrentSessionOnly = Flags.fillFieldsFromCurrentSessionOnly();
+            mIsFillFieldsFromCurrentSessionOnly = AutofillFeatureFlags
+                    .shouldFillFieldsFromCurrentSessionOnly();
             if (verbose) {
                 Slog.v(mTag, "setDeviceConfigProperties() for PCC: "
                         + "mPccClassificationEnabled=" + mPccClassificationEnabled
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 272d63d..6822229 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -1291,7 +1291,8 @@
         RemoteFillService remoteService =
                 new RemoteFillService(
                         getContext(), mInfo.getServiceInfo().getComponentName(), mUserId,
-                        /* callbacks= */ null, mMaster.isInstantServiceAllowed());
+                        /* callbacks= */ null, mMaster.isInstantServiceAllowed(),
+                        mMaster.mCredentialAutofillService);
         remoteService.onSavedPasswordCountRequest(receiver);
     }
 
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index f914ed5..c96688c 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -62,10 +62,6 @@
     private static final long TIMEOUT_IDLE_BIND_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;
     private static final long TIMEOUT_REMOTE_REQUEST_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;
 
-    private static final ComponentName CREDMAN_SERVICE_COMPONENT_NAME =
-            new ComponentName("com.android.credentialmanager",
-                    "com.android.credentialmanager.autofill.CredentialAutofillService");
-
     private final FillServiceCallbacks mCallbacks;
     private final Object mLock = new Object();
     private CompletableFuture<FillResponse> mPendingFillRequest;
@@ -102,14 +98,15 @@
     }
 
     RemoteFillService(Context context, ComponentName componentName, int userId,
-            FillServiceCallbacks callbacks, boolean bindInstantServiceAllowed) {
+            FillServiceCallbacks callbacks, boolean bindInstantServiceAllowed,
+            @Nullable ComponentName credentialAutofillService) {
         super(context, new Intent(AutofillService.SERVICE_INTERFACE).setComponent(componentName),
                 Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS
                         | (bindInstantServiceAllowed ? Context.BIND_ALLOW_INSTANT : 0),
                 userId, IAutoFillService.Stub::asInterface);
         mCallbacks = callbacks;
         mComponentName = componentName;
-        mIsCredentialAutofillService = mComponentName.equals(CREDMAN_SERVICE_COMPONENT_NAME);
+        mIsCredentialAutofillService = mComponentName.equals(credentialAutofillService);
     }
 
     @Override // from ServiceConnector.Impl
diff --git a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
index 0af703e..4506779 100644
--- a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
+++ b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
@@ -59,9 +59,10 @@
 
     SecondaryProviderHandler(
             @NonNull Context context, int userId, boolean bindInstantServiceAllowed,
-            SecondaryProviderCallback callback, ComponentName componentName) {
+            SecondaryProviderCallback callback, ComponentName componentName,
+            @Nullable ComponentName credentialAutofillService) {
         mRemoteFillService = new RemoteFillService(context, componentName, userId, this,
-                bindInstantServiceAllowed);
+                bindInstantServiceAllowed, credentialAutofillService);
         mCallback = callback;
         Slog.v(TAG, "Creating a secondary provider handler with component name, " + componentName);
     }
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index d006cf6..0b68f5f 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -53,8 +53,10 @@
 import static android.view.autofill.AutofillManager.getSmartSuggestionModeToString;
 
 import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
+import static com.android.server.autofill.FillRequestEventLogger.TRIGGER_REASON_EXPLICITLY_REQUESTED;
 import static com.android.server.autofill.FillRequestEventLogger.TRIGGER_REASON_NORMAL_TRIGGER;
 import static com.android.server.autofill.FillRequestEventLogger.TRIGGER_REASON_PRE_TRIGGER;
+import static com.android.server.autofill.FillRequestEventLogger.TRIGGER_REASON_RETRIGGER;
 import static com.android.server.autofill.FillRequestEventLogger.TRIGGER_REASON_SERVED_FROM_CACHED_RESPONSE;
 import static com.android.server.autofill.FillResponseEventLogger.AVAILABLE_COUNT_WHEN_FILL_REQUEST_FAILED_OR_TIMEOUT;
 import static com.android.server.autofill.FillResponseEventLogger.DETECTION_PREFER_AUTOFILL_PROVIDER;
@@ -242,10 +244,6 @@
     private static final int DEFAULT__FILL_REQUEST_ID_SNAPSHOT = -2;
     private static final int DEFAULT__FIELD_CLASSIFICATION_REQUEST_ID_SNAPSHOT = -2;
 
-    private static final ComponentName CREDMAN_SERVICE_COMPONENT_NAME =
-            new ComponentName("com.android.credentialmanager",
-                    "com.android.credentialmanager.autofill.CredentialAutofillService");
-
     static final String SESSION_ID_KEY = "autofill_session_id";
     static final String REQUEST_ID_KEY = "autofill_request_id";
 
@@ -522,6 +520,9 @@
 
     private final ClassificationState mClassificationState = new ClassificationState();
 
+    @Nullable
+    private final ComponentName mCredentialAutofillService;
+
     // TODO(b/216576510): Share one BroadcastReceiver between all Sessions instead of creating a
     // new one per Session.
     private final BroadcastReceiver mDelayedFillBroadcastReceiver =
@@ -543,6 +544,8 @@
                     synchronized (mLock) {
                         int requestId = intent.getIntExtra(EXTRA_REQUEST_ID, 0);
                         FillResponse response = intent.getParcelableExtra(EXTRA_FILL_RESPONSE, android.service.autofill.FillResponse.class);
+                        mFillRequestEventLogger.maybeSetRequestTriggerReason(
+                                TRIGGER_REASON_RETRIGGER);
                         mAssistReceiver.processDelayedFillLocked(requestId, response);
                     }
                 }
@@ -1268,7 +1271,13 @@
         if(mPreviouslyFillDialogPotentiallyStarted) {
             mFillRequestEventLogger.maybeSetRequestTriggerReason(TRIGGER_REASON_PRE_TRIGGER);
         } else {
-            mFillRequestEventLogger.maybeSetRequestTriggerReason(TRIGGER_REASON_NORMAL_TRIGGER);
+            if ((flags & FLAG_MANUAL_REQUEST) != 0) {
+                mFillRequestEventLogger.maybeSetRequestTriggerReason(
+                        TRIGGER_REASON_EXPLICITLY_REQUESTED);
+            } else {
+                mFillRequestEventLogger.maybeSetRequestTriggerReason(
+                        TRIGGER_REASON_NORMAL_TRIGGER);
+            }
         }
         if (existingResponse != null) {
             setViewStatesLocked(
@@ -1471,23 +1480,26 @@
         mUi = ui;
         mHandler = handler;
 
+        mCredentialAutofillService = getCredentialAutofillService(context);
+
         ComponentName primaryServiceComponentName, secondaryServiceComponentName;
         if (isPrimaryCredential) {
-            primaryServiceComponentName = CREDMAN_SERVICE_COMPONENT_NAME;
+            primaryServiceComponentName = mCredentialAutofillService;
             secondaryServiceComponentName = serviceComponentName;
         } else {
             primaryServiceComponentName = serviceComponentName;
-            secondaryServiceComponentName = CREDMAN_SERVICE_COMPONENT_NAME;
+            secondaryServiceComponentName = mCredentialAutofillService;
         }
         Slog.v(TAG, "Primary service component name: " + primaryServiceComponentName
                 + ", secondary service component name: " + secondaryServiceComponentName);
 
         mRemoteFillService = primaryServiceComponentName == null ? null
                 : new RemoteFillService(context, primaryServiceComponentName, userId, this,
-                        bindInstantServiceAllowed);
+                        bindInstantServiceAllowed, mCredentialAutofillService);
         mSecondaryProviderHandler = secondaryServiceComponentName == null ? null
                 : new SecondaryProviderHandler(context, userId, bindInstantServiceAllowed,
-                this::onSecondaryFillResponse, secondaryServiceComponentName);
+                this::onSecondaryFillResponse, secondaryServiceComponentName,
+                        mCredentialAutofillService);
         mActivityToken = activityToken;
         mHasCallback = hasCallback;
         mUiLatencyHistory = uiLatencyHistory;
@@ -1546,6 +1558,21 @@
         mLogViewEntered = false;
     }
 
+    private ComponentName getCredentialAutofillService(Context context) {
+        ComponentName componentName = null;
+        String credentialManagerAutofillCompName = context.getResources().getString(
+                R.string.config_defaultCredentialManagerAutofillService);
+        if (credentialManagerAutofillCompName != null
+                && !credentialManagerAutofillCompName.isEmpty()) {
+            componentName = ComponentName.unflattenFromString(
+                    credentialManagerAutofillCompName);
+        }
+        if (componentName == null) {
+            Slog.w(TAG, "Invalid CredentialAutofillService");
+        }
+        return componentName;
+    }
+
     /**
      * Gets the currently registered activity token
      *
@@ -2383,6 +2410,7 @@
                 mFillResponseEventLogger.maybeSetResponseStatus(RESPONSE_STATUS_FAILURE);
             }
             mPresentationStatsEventLogger.logAndEndEvent();
+            mFillResponseEventLogger.maybeSetLatencyResponseProcessingMillis();
             mFillResponseEventLogger.logAndEndEvent();
         }
         notifyUnavailableToClient(AutofillManager.STATE_UNKNOWN_FAILED,
@@ -5130,7 +5158,8 @@
             return;
         }
         for (Dataset dataset: response.getDatasets()) {
-            if (isPinnedDataset(dataset)) {
+            if (dataset.getId() != null
+                    && dataset.getId().equals(AutofillManager.PINNED_DATASET_ID)) {
                 Slog.d(TAG, "Adding Credential Manager callback to a pinned entry");
                 addCredentialManagerCallbackForDataset(dataset, response.getRequestId());
             }
@@ -5400,6 +5429,7 @@
         }
         // Log the existing FillResponse event.
         mFillResponseEventLogger.maybeSetAvailableCount(0);
+        mFillResponseEventLogger.maybeSetLatencyResponseProcessingMillis();
         mFillResponseEventLogger.logAndEndEvent();
         mService.resetLastResponse();
 
diff --git a/services/backup/Android.bp b/services/backup/Android.bp
index 2a85eb6..e13746e 100644
--- a/services/backup/Android.bp
+++ b/services/backup/Android.bp
@@ -30,5 +30,6 @@
 aconfig_declarations {
     name: "backup_flags",
     package: "com.android.server.backup",
+    container: "system",
     srcs: ["flags.aconfig"],
 }
diff --git a/services/backup/flags.aconfig b/services/backup/flags.aconfig
index e9f959f..d53f949 100644
--- a/services/backup/flags.aconfig
+++ b/services/backup/flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.backup"
+container: "system"
 
 flag {
     name: "enable_skipping_restore_launched_apps"
@@ -50,4 +51,12 @@
             "logger."
     bug: "296844513"
     is_fixed_read_only: true
-}
\ No newline at end of file
+}
+
+flag {
+    name: "enable_increased_bmm_logging_for_restore_at_install"
+    namespace: "onboarding"
+    description: "Increase BMM logging coverage in restore at install flow."
+    bug: "331749778"
+    is_fixed_read_only: true
+}
diff --git a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
index c3d9790..52108bf1 100644
--- a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
+++ b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
@@ -781,6 +781,9 @@
                                 "Not restoring package "
                                         + key
                                         + " since it appears to have no signatures.");
+                        if (!data.readNextHeader()) {
+                            break;
+                        }
                         continue;
                     }
 
@@ -790,18 +793,15 @@
                     sigMap.put(key, new Metadata(versionCode, sigs));
                 }
 
-                boolean readNextHeader = data.readNextHeader();
-                if (!readNextHeader) {
-                    if (DEBUG) {
-                        Slog.v(
-                                TAG,
-                                "LegacyRestoreDataConsumer:"
-                                        + " we're done reading all the headers");
-                    }
+                if (!data.readNextHeader()) {
                     break;
                 }
             }
 
+            if (DEBUG) {
+                Slog.v(TAG, "LegacyRestoreDataConsumer:" + " we're done reading all the headers");
+            }
+
             // On successful completion, cache the signature map for the Backup Manager to use
             mRestoredSignatures = sigMap;
         }
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index 976504a..dc1cfb9 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -3903,11 +3903,33 @@
             skip = true;
         }
 
+        BackupManagerMonitorEventSender  mBMMEventSender =
+                getBMMEventSender(/*monitor=*/ null);
+        PackageInfo packageInfo = getPackageInfoForBMMLogging(packageName);
         TransportConnection transportConnection =
                 mTransportManager.getCurrentTransportClient("BMS.restoreAtInstall()");
         if (transportConnection == null) {
             if (DEBUG) Slog.w(TAG, addUserIdToLogMessage(mUserId, "No transport client"));
             skip = true;
+        } else if (Flags.enableIncreasedBmmLoggingForRestoreAtInstall()) {
+            try {
+                BackupTransportClient transportClient = transportConnection.connectOrThrow(
+                        "BMS.restoreAtInstall");
+                mBMMEventSender.setMonitor(transportClient.getBackupManagerMonitor());
+            } catch (TransportNotAvailableException | RemoteException e) {
+                mBMMEventSender.monitorEvent(
+                        BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_IS_NULL, packageInfo,
+                        BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT, null);
+            }
+        }
+
+        if (Flags.enableIncreasedBmmLoggingForRestoreAtInstall()) {
+            mBMMEventSender.monitorEvent(
+                    BackupManagerMonitor.LOG_EVENT_ID_RESTORE_AT_INSTALL_INVOKED, packageInfo,
+                    BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
+                    mBMMEventSender.putMonitoringExtra(/*extras=*/null,
+                            BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE,
+                            BackupAnnotations.OperationType.RESTORE));
         }
 
         if (!mAutoRestore) {
@@ -3943,7 +3965,7 @@
                         RestoreParams.createForRestoreAtInstall(
                                 transportConnection,
                                 /* observer */ null,
-                                /* monitor */ null,
+                                mBMMEventSender.getMonitor(),
                                 restoreSet,
                                 packageName,
                                 token,
@@ -3963,6 +3985,15 @@
         if (skip) {
             // Auto-restore disabled or no way to attempt a restore
 
+            if (Flags.enableIncreasedBmmLoggingForRestoreAtInstall()) {
+                mBMMEventSender.monitorEvent(
+                        BackupManagerMonitor.LOG_EVENT_ID_SKIP_RESTORE_AT_INSTALL, packageInfo,
+                        BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
+                        mBMMEventSender.putMonitoringExtra(/*extras=*/null,
+                                BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE,
+                                BackupAnnotations.OperationType.RESTORE));
+            }
+
             if (transportConnection != null) {
                 mTransportManager.disposeOfTransportClient(
                         transportConnection, "BMS.restoreAtInstall()");
@@ -3976,6 +4007,23 @@
         }
     }
 
+    private PackageInfo getPackageInfoForBMMLogging(String packageName) {
+        try {
+            return mPackageManager.getPackageInfoAsUser(packageName, 0, mUserId);
+        } catch (NameNotFoundException e) {
+            Slog.w(
+                    TAG,
+                    addUserIdToLogMessage(
+                            mUserId, "Asked to get PackageInfo for BMM logging of nonexistent pkg "
+                                    + packageName));
+
+            PackageInfo packageInfo = new PackageInfo();
+            packageInfo.packageName = packageName;
+
+            return packageInfo;
+        }
+    }
+
     /** Hand off a restore session. */
     public IRestoreSession beginRestoreSession(String packageName, String transport) {
         if (DEBUG) {
diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
index 2c9eb51..b414b25 100644
--- a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
@@ -29,6 +29,7 @@
 import android.app.IBackupAgent;
 import android.app.backup.BackupAgent;
 import android.app.backup.BackupAnnotations;
+import android.app.backup.BackupManagerMonitor;
 import android.app.backup.FullBackup;
 import android.app.backup.IBackupManagerMonitor;
 import android.app.backup.IFullBackupRestoreObserver;
@@ -57,6 +58,7 @@
 import com.android.server.backup.UserBackupManagerService;
 import com.android.server.backup.fullbackup.FullBackupObbConnection;
 import com.android.server.backup.utils.BackupEligibilityRules;
+import com.android.server.backup.utils.BackupManagerMonitorEventSender;
 import com.android.server.backup.utils.BytesReadListener;
 import com.android.server.backup.utils.FullBackupRestoreObserverUtils;
 import com.android.server.backup.utils.RestoreUtils;
@@ -143,6 +145,8 @@
 
     private FileMetadata mReadOnlyParent = null;
 
+    private BackupManagerMonitorEventSender mBackupManagerMonitorEventSender;
+
     public FullRestoreEngine(
             UserBackupManagerService backupManagerService, OperationStorage operationStorage,
             BackupRestoreTask monitorTask, IFullBackupRestoreObserver observer,
@@ -155,6 +159,7 @@
         mMonitorTask = monitorTask;
         mObserver = observer;
         mMonitor = monitor;
+        mBackupManagerMonitorEventSender = new BackupManagerMonitorEventSender(monitor);
         mOnlyPackage = onlyPackage;
         mAllowApks = allowApks;
         mAgentTimeoutParameters = Objects.requireNonNull(
@@ -225,6 +230,9 @@
                     // one app's data but see a different app's on the wire
                     if (onlyPackage != null) {
                         if (!pkg.equals(onlyPackage.packageName)) {
+                            logBMMEvent(
+                                    BackupManagerMonitor.LOG_EVENT_ID_RESTORE_DATA_DOES_NOT_BELONG_TO_PACKAGE,
+                                    onlyPackage);
                             Slog.w(TAG, "Expected data for " + onlyPackage + " but saw " + pkg);
                             setResult(RestoreEngine.TRANSPORT_FAILURE);
                             setRunning(false);
@@ -412,6 +420,9 @@
                         }
 
                         if (mAgent == null) {
+                            logBMMEvent(
+                                    BackupManagerMonitor.LOG_EVENT_ID_UNABLE_TO_CREATE_AGENT_FOR_RESTORE,
+                                    onlyPackage);
                             Slog.e(TAG, "Unable to create agent for " + pkg);
                             okay = false;
                             tearDownPipes();
@@ -501,6 +512,9 @@
                         } catch (RemoteException e) {
                             // whoops, remote entity went away.  We'll eat the content
                             // ourselves, then, and not copy it over.
+                            logBMMEvent(
+                                    BackupManagerMonitor.LOG_EVENT_ID_AGENT_CRASHED_BEFORE_RESTORE_DATA_IS_SENT,
+                                    onlyPackage);
                             Slog.e(TAG, "Agent crashed during full restore");
                             agentSuccess = false;
                             okay = false;
@@ -531,6 +545,9 @@
                                     } catch (IOException e) {
                                         Slog.e(TAG, "Failed to write to restore pipe: "
                                                 + e.getMessage());
+                                        logBMMEvent(
+                                                BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_SEND_DATA_TO_AGENT_DURING_RESTORE,
+                                                onlyPackage);
                                         pipeOkay = false;
                                     }
                                 }
@@ -548,6 +565,8 @@
                         // okay, if the remote end failed at any point, deal with
                         // it by ignoring the rest of the restore on it
                         if (!agentSuccess) {
+                            logBMMEvent(BackupManagerMonitor.LOG_EVENT_ID_AGENT_FAILURE_DURING_RESTORE,
+                                    onlyPackage);
                             Slog.w(TAG, "Agent failure restoring " + pkg + "; ending restore");
                             mBackupManagerService.getBackupHandler().removeMessages(
                                     MSG_RESTORE_OPERATION_TIMEOUT);
@@ -590,6 +609,8 @@
             if (DEBUG) {
                 Slog.w(TAG, "io exception on restore socket read: " + e.getMessage());
             }
+            logBMMEvent(BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_READ_DATA_FROM_TRANSPORT,
+                    onlyPackage);
             setResult(RestoreEngine.TRANSPORT_FAILURE);
             info = null;
         }
@@ -631,6 +652,16 @@
         return false;
     }
 
+    private void logBMMEvent(int eventId, PackageInfo pkgInfo) {
+        if (Flags.enableIncreasedBmmLoggingForRestoreAtInstall()) {
+            mBackupManagerMonitorEventSender.monitorEvent(eventId, pkgInfo,
+                    BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
+                    mBackupManagerMonitorEventSender.putMonitoringExtra(/*extras=*/
+                            null, BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE,
+                            BackupAnnotations.OperationType.RESTORE));
+        }
+    }
+
     private static boolean isValidParent(FileMetadata parentDir, @NonNull FileMetadata childDir) {
         return parentDir != null
                 && childDir.packageName.equals(parentDir.packageName)
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index 8fece82..e536876 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -418,25 +418,6 @@
     private void startRestore() {
         sendStartRestore(mAcceptSet.size());
 
-        // If we're starting a full-system restore, set up to begin widget ID remapping
-        if (mIsSystemRestore) {
-            AppWidgetBackupBridge.systemRestoreStarting(mUserId);
-            Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
-            mBackupManagerMonitorEventSender.monitorEvent(
-                    BackupManagerMonitor.LOG_EVENT_ID_START_SYSTEM_RESTORE,
-                    null,
-                    BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
-                    monitoringExtras);
-        } else {
-            // We are either performing RestoreAtInstall or Bmgr.
-            Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
-            mBackupManagerMonitorEventSender.monitorEvent(
-                    BackupManagerMonitor.LOG_EVENT_ID_START_RESTORE_AT_INSTALL,
-                    null,
-                    BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
-                    monitoringExtras);
-        }
-
         try {
             String transportDirName =
                     mTransportManager.getTransportDirName(
@@ -459,6 +440,34 @@
                 mBackupManagerMonitorEventSender.setMonitor(transport.getBackupManagerMonitor());
             }
 
+            if (Flags.enableIncreasedBmmLoggingForRestoreAtInstall()) {
+                for (PackageInfo info : mAcceptSet) {
+                    mBackupManagerMonitorEventSender.monitorEvent(
+                            BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_ACCEPTED_FOR_RESTORE, info,
+                            BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
+                            addRestoreOperationTypeToEvent(/* extras= */ null));
+                }
+            }
+
+            // If we're starting a full-system restore, set up to begin widget ID remapping
+            if (mIsSystemRestore) {
+                AppWidgetBackupBridge.systemRestoreStarting(mUserId);
+                Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
+                mBackupManagerMonitorEventSender.monitorEvent(
+                        BackupManagerMonitor.LOG_EVENT_ID_START_SYSTEM_RESTORE,
+                        null,
+                        BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
+                        monitoringExtras);
+            } else {
+                // We are either performing RestoreAtInstall or Bmgr.
+                Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
+                mBackupManagerMonitorEventSender.monitorEvent(
+                        BackupManagerMonitor.LOG_EVENT_ID_START_RESTORE_AT_INSTALL,
+                        null,
+                        BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
+                        monitoringExtras);
+            }
+
             mStatus = transport.startRestore(mToken, packages);
             if (mStatus != BackupTransport.TRANSPORT_OK) {
                 Slog.e(TAG, "Transport error " + mStatus + "; no restore possible");
@@ -638,7 +647,7 @@
                 Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
                 mBackupManagerMonitorEventSender.monitorEvent(
                         BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_NOT_PRESENT,
-                        mCurrentPackage,
+                        createPackageInfoForBMMLogging(pkgName),
                         BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
                         monitoringExtras);
                 EventLog.writeEvent(
@@ -739,7 +748,7 @@
             Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
             mBackupManagerMonitorEventSender.monitorEvent(
                     BackupManagerMonitor.LOG_EVENT_ID_NO_NEXT_RESTORE_TARGET,
-                    mCurrentPackage,
+                    null,
                     BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
                     monitoringExtras);
             EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
@@ -1804,4 +1813,10 @@
                 monitoringExtrasDenylist);
     }
 
+    private PackageInfo createPackageInfoForBMMLogging(String packageName) {
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = packageName;
+
+        return packageInfo;
+    }
 }
diff --git a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java
index 6d315ba..fad59d2 100644
--- a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java
@@ -371,6 +371,24 @@
                     "V to U restore pkg not eligible";
             case BackupManagerMonitor.LOG_EVENT_ID_V_TO_U_RESTORE_SET_LIST ->
                     "V to U restore lists";
+            case BackupManagerMonitor.LOG_EVENT_ID_RESTORE_AT_INSTALL_INVOKED ->
+                    "Invoked restore at install";
+            case BackupManagerMonitor.LOG_EVENT_ID_SKIP_RESTORE_AT_INSTALL ->
+                    "Skip restore at install";
+            case BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_ACCEPTED_FOR_RESTORE ->
+                    "Pkg accepted for restore";
+            case BackupManagerMonitor.LOG_EVENT_ID_RESTORE_DATA_DOES_NOT_BELONG_TO_PACKAGE ->
+                    "Restore data does not belong to package";
+            case BackupManagerMonitor.LOG_EVENT_ID_UNABLE_TO_CREATE_AGENT_FOR_RESTORE ->
+                    "Unable to create Agent";
+            case BackupManagerMonitor.LOG_EVENT_ID_AGENT_CRASHED_BEFORE_RESTORE_DATA_IS_SENT ->
+                    "Agent crashed before restore data is streamed";
+            case BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_SEND_DATA_TO_AGENT_DURING_RESTORE ->
+                    "Failed to send data to agent";
+            case BackupManagerMonitor.LOG_EVENT_ID_AGENT_FAILURE_DURING_RESTORE ->
+                    "Agent failure during restore";
+            case BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_READ_DATA_FROM_TRANSPORT ->
+                    "Failed to read data from Transport";
             default -> "Unknown log event ID: " + code;
         };
         return id;
diff --git a/services/companion/java/com/android/server/companion/BackupRestoreProcessor.java b/services/companion/java/com/android/server/companion/BackupRestoreProcessor.java
index 5e52e06..82e9a26 100644
--- a/services/companion/java/com/android/server/companion/BackupRestoreProcessor.java
+++ b/services/companion/java/com/android/server/companion/BackupRestoreProcessor.java
@@ -111,6 +111,11 @@
         Slog.i(TAG, "applyRestoredPayload() userId=[" + userId + "], payload size=["
                 + payload.length + "].");
 
+        if (payload.length == 0) {
+            Slog.i(TAG, "CDM backup payload was empty.");
+            return;
+        }
+
         ByteBuffer buffer = ByteBuffer.wrap(payload);
 
         // Make sure that payload version matches current version to ensure proper deserialization
@@ -120,15 +125,26 @@
             return;
         }
 
-        // Read the bytes containing backed-up associations
-        byte[] associationsPayload = new byte[buffer.getInt()];
-        buffer.get(associationsPayload);
+        // Pre-load the bytes into memory before processing them to ensure payload mal-formatting
+        // error is caught early on.
+        final byte[] associationsPayload;
+        final byte[] requestsPayload;
+        try {
+            // Read the bytes containing backed-up associations
+            associationsPayload = new byte[buffer.getInt()];
+            buffer.get(associationsPayload);
+
+            // Read the bytes containing backed-up system data transfer requests user consent
+            requestsPayload = new byte[buffer.getInt()];
+            buffer.get(requestsPayload);
+        } catch (Exception bufferException) {
+            Slog.e(TAG, "CDM backup payload was mal-formatted.", bufferException);
+            return;
+        }
+
         final Associations restoredAssociations = readAssociationsFromPayload(
                 associationsPayload, userId);
 
-        // Read the bytes containing backed-up system data transfer requests user consent
-        byte[] requestsPayload = new byte[buffer.getInt()];
-        buffer.get(requestsPayload);
         List<SystemDataTransferRequest> restoredRequestsForUser =
                 mSystemDataTransferRequestStore.readRequestsFromPayload(requestsPayload, userId);
 
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index f4f6c13..30e4a3e 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -23,7 +23,6 @@
 import static android.Manifest.permission.REQUEST_COMPANION_SELF_MANAGED;
 import static android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE;
 import static android.Manifest.permission.USE_COMPANION_TRANSPORTS;
-import static android.companion.DevicePresenceEvent.EVENT_BT_CONNECTED;
 import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 import static android.os.Process.SYSTEM_UID;
@@ -53,7 +52,7 @@
 import android.app.AppOpsManager;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
-import android.bluetooth.BluetoothDevice;
+import android.app.ecm.EnhancedConfirmationManager;
 import android.companion.AssociationInfo;
 import android.companion.AssociationRequest;
 import android.companion.IAssociationRequestCallback;
@@ -66,6 +65,7 @@
 import android.companion.datatransfer.PermissionSyncRequest;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
@@ -76,16 +76,15 @@
 import android.os.Environment;
 import android.os.Parcel;
 import android.os.ParcelFileDescriptor;
-import android.os.ParcelUuid;
 import android.os.PowerExemptionManager;
 import android.os.PowerManagerInternal;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.permission.flags.Flags;
 import android.util.ArraySet;
 import android.util.ExceptionUtils;
-import android.util.Log;
 import android.util.Slog;
 
 import com.android.internal.app.IAppOpsService;
@@ -107,10 +106,10 @@
 import com.android.server.companion.datatransfer.contextsync.CrossDeviceCall;
 import com.android.server.companion.datatransfer.contextsync.CrossDeviceSyncController;
 import com.android.server.companion.datatransfer.contextsync.CrossDeviceSyncControllerCallback;
-import com.android.server.companion.presence.CompanionAppBinder;
-import com.android.server.companion.presence.DevicePresenceProcessor;
-import com.android.server.companion.presence.ObservableUuid;
-import com.android.server.companion.presence.ObservableUuidStore;
+import com.android.server.companion.devicepresence.CompanionAppBinder;
+import com.android.server.companion.devicepresence.DevicePresenceProcessor;
+import com.android.server.companion.devicepresence.ObservableUuid;
+import com.android.server.companion.devicepresence.ObservableUuidStore;
 import com.android.server.companion.transport.CompanionTransportManager;
 import com.android.server.pm.UserManagerInternal;
 import com.android.server.wm.ActivityTaskManagerInternal;
@@ -118,16 +117,13 @@
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
 @SuppressLint("LongLogTag")
 public class CompanionDeviceManagerService extends SystemService {
-    static final String TAG = "CDM_CompanionDeviceManagerService";
-    static final boolean DEBUG = false;
+    private static final String TAG = "CDM_CompanionDeviceManagerService";
 
     private static final long PAIR_WITHOUT_PROMPT_WINDOW_MS = 10 * 60 * 1000; // 10 min
 
@@ -140,7 +136,6 @@
     private final IAppOpsService mAppOpsManager;
     private final PowerExemptionManager mPowerExemptionManager;
     private final PackageManagerInternal mPackageManagerInternal;
-    private final PowerManagerInternal mPowerManagerInternal;
 
     private final AssociationStore mAssociationStore;
     private final SystemDataTransferRequestStore mSystemDataTransferRequestStore;
@@ -148,11 +143,10 @@
     private final AssociationRequestsProcessor mAssociationRequestsProcessor;
     private final SystemDataTransferProcessor mSystemDataTransferProcessor;
     private final BackupRestoreProcessor mBackupRestoreProcessor;
-    private final DevicePresenceProcessor mDevicePresenceMonitor;
-    private final CompanionAppBinder mCompanionAppController;
+    private final DevicePresenceProcessor mDevicePresenceProcessor;
+    private final CompanionAppBinder mCompanionAppBinder;
     private final CompanionTransportManager mTransportManager;
     private final DisassociationProcessor mDisassociationProcessor;
-    private final InactiveAssociationsRemovalService mInactiveAssociationsRemovalService;
     private final CrossDeviceSyncController mCrossDeviceSyncController;
 
     public CompanionDeviceManagerService(Context context) {
@@ -166,7 +160,8 @@
         mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
         mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
         final UserManager userManager = context.getSystemService(UserManager.class);
-        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
+        final PowerManagerInternal powerManagerInternal = LocalServices.getService(
+                PowerManagerInternal.class);
 
         final AssociationDiskStore associationDiskStore = new AssociationDiskStore();
         mAssociationStore = new AssociationStore(context, userManager, associationDiskStore);
@@ -180,21 +175,17 @@
                 mAssociationStore, associationDiskStore, mSystemDataTransferRequestStore,
                 mAssociationRequestsProcessor);
 
-        mCompanionAppController = new CompanionAppBinder(
-                context, mAssociationStore, mObservableUuidStore, mPowerManagerInternal);
+        mCompanionAppBinder = new CompanionAppBinder(context);
 
-        mDevicePresenceMonitor = new DevicePresenceProcessor(context,
-                mCompanionAppController, userManager, mAssociationStore, mObservableUuidStore,
-                mPowerManagerInternal);
+        mDevicePresenceProcessor = new DevicePresenceProcessor(context,
+                mCompanionAppBinder, userManager, mAssociationStore, mObservableUuidStore,
+                powerManagerInternal);
 
         mTransportManager = new CompanionTransportManager(context, mAssociationStore);
 
         mDisassociationProcessor = new DisassociationProcessor(context, activityManager,
-                mAssociationStore, mPackageManagerInternal, mDevicePresenceMonitor,
-                mCompanionAppController, mSystemDataTransferRequestStore, mTransportManager);
-
-        mInactiveAssociationsRemovalService = new InactiveAssociationsRemovalService(
-                mAssociationStore, mDisassociationProcessor);
+                mAssociationStore, mPackageManagerInternal, mDevicePresenceProcessor,
+                mCompanionAppBinder, mSystemDataTransferRequestStore, mTransportManager);
 
         mSystemDataTransferProcessor = new SystemDataTransferProcessor(this,
                 mPackageManagerInternal, mAssociationStore,
@@ -229,7 +220,7 @@
             // delays (even in case of the Main Thread). It may be fine overall, but would require
             // updating the tests (adding a delay there).
             mPackageMonitor.register(context, FgThread.get().getLooper(), UserHandle.ALL, true);
-            mDevicePresenceMonitor.init(context);
+            mDevicePresenceProcessor.init(context);
         } else if (phase == PHASE_BOOT_COMPLETED) {
             // Run the Inactive Association Removal job service daily.
             InactiveAssociationsRemovalService.schedule(getContext());
@@ -255,47 +246,13 @@
 
     @Override
     public void onUserUnlocked(@NonNull TargetUser user) {
+        Slog.i(TAG, "onUserUnlocked() user=" + user);
         // Notify and bind the app after the phone is unlocked.
-        final int userId = user.getUserIdentifier();
-        final Set<BluetoothDevice> blueToothDevices =
-                mDevicePresenceMonitor.getPendingConnectedDevices().get(userId);
-
-        final List<ObservableUuid> observableUuids =
-                mObservableUuidStore.getObservableUuidsForUser(userId);
-
-        if (blueToothDevices != null) {
-            for (BluetoothDevice bluetoothDevice : blueToothDevices) {
-                final ParcelUuid[] bluetoothDeviceUuids = bluetoothDevice.getUuids();
-
-                final List<ParcelUuid> deviceUuids = ArrayUtils.isEmpty(bluetoothDeviceUuids)
-                        ? Collections.emptyList() : Arrays.asList(bluetoothDeviceUuids);
-
-                for (AssociationInfo ai :
-                        mAssociationStore.getActiveAssociationsByAddress(
-                                bluetoothDevice.getAddress())) {
-                    Slog.i(TAG, "onUserUnlocked, device id( " + ai.getId() + " ) is connected");
-                    mDevicePresenceMonitor.onBluetoothCompanionDeviceConnected(ai.getId());
-                }
-
-                for (ObservableUuid observableUuid : observableUuids) {
-                    if (deviceUuids.contains(observableUuid.getUuid())) {
-                        Slog.i(TAG, "onUserUnlocked, UUID( "
-                                + observableUuid.getUuid() + " ) is connected");
-                        mDevicePresenceMonitor.onDevicePresenceEventByUuid(
-                                observableUuid, EVENT_BT_CONNECTED);
-                    }
-                }
-            }
-        }
+        mDevicePresenceProcessor.sendDevicePresenceEventOnUnlocked(user.getUserIdentifier());
     }
 
     private void onPackageRemoveOrDataClearedInternal(
             @UserIdInt int userId, @NonNull String packageName) {
-        if (DEBUG) {
-            Log.i(TAG, "onPackageRemove_Or_DataCleared() u" + userId + "/"
-                    + packageName);
-        }
-
         // Clear all associations for the package.
         final List<AssociationInfo> associationsForPackage =
                 mAssociationStore.getAssociationsByPackage(userId, packageName);
@@ -314,12 +271,10 @@
             mObservableUuidStore.removeObservableUuid(userId, uuid.getUuid(), packageName);
         }
 
-        mCompanionAppController.onPackagesChanged(userId);
+        mCompanionAppBinder.onPackagesChanged(userId);
     }
 
     private void onPackageModifiedInternal(@UserIdInt int userId, @NonNull String packageName) {
-        if (DEBUG) Log.i(TAG, "onPackageModified() u" + userId + "/" + packageName);
-
         final List<AssociationInfo> associationsForPackage =
                 mAssociationStore.getAssociationsByPackage(userId, packageName);
         for (AssociationInfo association : associationsForPackage) {
@@ -327,7 +282,7 @@
                     association.getPackageName());
         }
 
-        mCompanionAppController.onPackagesChanged(userId);
+        mCompanionAppBinder.onPackagesChanged(userId);
     }
 
     private void onPackageAddedInternal(@UserIdInt int userId, @NonNull String packageName) {
@@ -335,7 +290,7 @@
     }
 
     void removeInactiveSelfManagedAssociations() {
-        mInactiveAssociationsRemovalService.removeIdleSelfManagedAssociations();
+        mDisassociationProcessor.removeIdleSelfManagedAssociations();
     }
 
     public class CompanionDeviceManagerImpl extends ICompanionDeviceManager.Stub {
@@ -496,15 +451,26 @@
             }
 
             return Binder.withCleanCallingIdentity(() -> {
+                final Intent intent;
                 if (!isRestrictedSettingsAllowed(getContext(), callingPackage, callingUid)) {
                     Slog.e(TAG, "Side loaded app must enable restricted "
                             + "setting before request the notification access");
-                    return null;
+                    if (Flags.enhancedConfirmationModeApisEnabled()) {
+                        intent = getContext()
+                                .getSystemService(EnhancedConfirmationManager.class)
+                                .createRestrictedSettingDialogIntent(callingPackage,
+                                        AppOpsManager.OPSTR_ACCESS_NOTIFICATIONS);
+                    } else {
+                        return null;
+                    }
+                } else {
+                    intent = NotificationAccessConfirmationActivityContract.launcherIntent(
+                            getContext(), userId, component);
                 }
+
                 return PendingIntent.getActivityAsUser(getContext(),
                         0 /* request code */,
-                        NotificationAccessConfirmationActivityContract.launcherIntent(
-                                getContext(), userId, component),
+                        intent,
                         PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT
                                 | PendingIntent.FLAG_CANCEL_CURRENT,
                         null /* options */,
@@ -548,7 +514,7 @@
                 int userId) throws RemoteException {
             legacyStartObservingDevicePresence_enforcePermission();
 
-            mDevicePresenceMonitor.startObservingDevicePresence(userId, callingPackage,
+            mDevicePresenceProcessor.startObservingDevicePresence(userId, callingPackage,
                     deviceAddress);
         }
 
@@ -559,7 +525,7 @@
                 int userId) throws RemoteException {
             legacyStopObservingDevicePresence_enforcePermission();
 
-            mDevicePresenceMonitor.stopObservingDevicePresence(userId, callingPackage,
+            mDevicePresenceProcessor.stopObservingDevicePresence(userId, callingPackage,
                     deviceAddress);
         }
 
@@ -569,7 +535,7 @@
                 String packageName, int userId) {
             startObservingDevicePresence_enforcePermission();
 
-            mDevicePresenceMonitor.startObservingDevicePresence(request, packageName, userId);
+            mDevicePresenceProcessor.startObservingDevicePresence(request, packageName, userId);
         }
 
         @Override
@@ -578,7 +544,7 @@
                 String packageName, int userId) {
             stopObservingDevicePresence_enforcePermission();
 
-            mDevicePresenceMonitor.stopObservingDevicePresence(request, packageName, userId);
+            mDevicePresenceProcessor.stopObservingDevicePresence(request, packageName, userId);
         }
 
         @Override
@@ -656,7 +622,7 @@
         public void notifySelfManagedDeviceAppeared(int associationId) {
             notifySelfManagedDeviceAppeared_enforcePermission();
 
-            mDevicePresenceMonitor.notifySelfManagedDevicePresenceEvent(associationId, true);
+            mDevicePresenceProcessor.notifySelfManagedDevicePresenceEvent(associationId, true);
         }
 
         @Override
@@ -664,12 +630,12 @@
         public void notifySelfManagedDeviceDisappeared(int associationId) {
             notifySelfManagedDeviceDisappeared_enforcePermission();
 
-            mDevicePresenceMonitor.notifySelfManagedDevicePresenceEvent(associationId, false);
+            mDevicePresenceProcessor.notifySelfManagedDevicePresenceEvent(associationId, false);
         }
 
         @Override
         public boolean isCompanionApplicationBound(String packageName, int userId) {
-            return mCompanionAppController.isCompanionApplicationBound(userId, packageName);
+            return mCompanionAppBinder.isCompanionApplicationBound(userId, packageName);
         }
 
         @Override
@@ -738,7 +704,7 @@
                 @NonNull ParcelFileDescriptor out, @NonNull ParcelFileDescriptor err,
                 @NonNull String[] args) {
             return new CompanionDeviceShellCommand(CompanionDeviceManagerService.this,
-                    mAssociationStore, mDevicePresenceMonitor, mTransportManager,
+                    mAssociationStore, mDevicePresenceProcessor, mTransportManager,
                     mSystemDataTransferProcessor, mAssociationRequestsProcessor,
                     mBackupRestoreProcessor, mDisassociationProcessor)
                     .exec(this, in.getFileDescriptor(), out.getFileDescriptor(),
@@ -753,8 +719,8 @@
             }
 
             mAssociationStore.dump(out);
-            mDevicePresenceMonitor.dump(out);
-            mCompanionAppController.dump(out);
+            mDevicePresenceProcessor.dump(out);
+            mCompanionAppBinder.dump(out);
             mTransportManager.dump(out);
             mSystemDataTransferRequestStore.dump(out);
         }
@@ -911,6 +877,12 @@
     }
 
     private class LocalService implements CompanionDeviceManagerServiceInternal {
+
+        @Override
+        public void removeInactiveSelfManagedAssociations() {
+            mDisassociationProcessor.removeIdleSelfManagedAssociations();
+        }
+
         @Override
         public void registerCallMetadataSyncCallback(CrossDeviceSyncControllerCallback callback,
                 @CrossDeviceSyncControllerCallback.Type int type) {
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerServiceInternal.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerServiceInternal.java
index e3b4c95..9d1250d 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerServiceInternal.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerServiceInternal.java
@@ -27,6 +27,12 @@
  * Companion Device Manager Local System Service Interface.
  */
 public interface CompanionDeviceManagerServiceInternal {
+
+    /**
+     * Remove idle self-managed associations.
+     */
+    void removeInactiveSelfManagedAssociations();
+
     /**
      * Registers a callback from an InCallService / ConnectionService to CDM to process sync
      * requests and perform call control actions.
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java b/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java
index a789384..9cfb535 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java
@@ -36,8 +36,8 @@
 import com.android.server.companion.datatransfer.SystemDataTransferProcessor;
 import com.android.server.companion.datatransfer.contextsync.BitmapUtils;
 import com.android.server.companion.datatransfer.contextsync.CrossDeviceSyncController;
-import com.android.server.companion.presence.DevicePresenceProcessor;
-import com.android.server.companion.presence.ObservableUuid;
+import com.android.server.companion.devicepresence.DevicePresenceProcessor;
+import com.android.server.companion.devicepresence.ObservableUuid;
 import com.android.server.companion.transport.CompanionTransportManager;
 
 import java.io.PrintWriter;
@@ -80,25 +80,6 @@
         final int associationId;
 
         try {
-            if ("simulate-device-event".equals(cmd) && Flags.devicePresence()) {
-                associationId = getNextIntArgRequired();
-                int event = getNextIntArgRequired();
-                mDevicePresenceProcessor.simulateDeviceEvent(associationId, event);
-                return 0;
-            }
-
-            if ("simulate-device-uuid-event".equals(cmd) && Flags.devicePresence()) {
-                String uuid = getNextArgRequired();
-                String packageName = getNextArgRequired();
-                int userId = getNextIntArgRequired();
-                int event = getNextIntArgRequired();
-                ObservableUuid observableUuid = new ObservableUuid(
-                        userId, ParcelUuid.fromString(uuid), packageName,
-                        System.currentTimeMillis());
-                mDevicePresenceProcessor.simulateDeviceEventByUuid(observableUuid, event);
-                return 0;
-            }
-
             switch (cmd) {
                 case "list": {
                     final int userId = getNextIntArgRequired();
@@ -167,6 +148,51 @@
                     mDevicePresenceProcessor.simulateDeviceEvent(associationId, /* event */ 1);
                     break;
 
+                case "simulate-device-event": {
+                    if (Flags.devicePresence()) {
+                        associationId = getNextIntArgRequired();
+                        int event = getNextIntArgRequired();
+                        mDevicePresenceProcessor.simulateDeviceEvent(associationId, event);
+                    }
+                    break;
+                }
+
+                case "simulate-device-uuid-event": {
+                    if (Flags.devicePresence()) {
+                        String uuid = getNextArgRequired();
+                        String packageName = getNextArgRequired();
+                        int userId = getNextIntArgRequired();
+                        int event = getNextIntArgRequired();
+                        ObservableUuid observableUuid = new ObservableUuid(
+                                userId, ParcelUuid.fromString(uuid), packageName,
+                                System.currentTimeMillis());
+                        mDevicePresenceProcessor.simulateDeviceEventByUuid(observableUuid, event);
+                    }
+                    break;
+                }
+
+                case "simulate-device-event-device-locked": {
+                    if (Flags.devicePresence()) {
+                        associationId = getNextIntArgRequired();
+                        int userId = getNextIntArgRequired();
+                        int event = getNextIntArgRequired();
+                        String uuid = getNextArgRequired();
+                        ParcelUuid parcelUuid =
+                                uuid.equals("null") ? null : ParcelUuid.fromString(uuid);
+                        mDevicePresenceProcessor.simulateDeviceEventOnDeviceLocked(
+                                associationId, userId, event, parcelUuid);
+                    }
+                    break;
+                }
+
+                case "simulate-device-event-device-unlocked": {
+                    if (Flags.devicePresence()) {
+                        int userId = getNextIntArgRequired();
+                        mDevicePresenceProcessor.simulateDeviceEventOnUserUnlocked(userId);
+                    }
+                    break;
+                }
+
                 case "get-backup-payload": {
                     final int userId = getNextIntArgRequired();
                     byte[] payload = mBackupRestoreProcessor.getBackupPayload(userId);
@@ -478,6 +504,17 @@
             pw.println("      Make CDM act as if the given DEVICE is BT disconnected base"
                     + "on the UUID");
             pw.println("      USE FOR DEBUGGING AND/OR TESTING PURPOSES ONLY.");
+
+            pw.println("  simulate-device-event-device-locked"
+                    + " ASSOCIATION_ID USER_ID DEVICE_EVENT PARCEL_UUID");
+            pw.println("  Simulate device event when the device is locked");
+            pw.println("  USE FOR DEBUGGING AND/OR TESTING PURPOSES ONLY.");
+
+            pw.println("  simulate-device-event-device-unlocked USER_ID");
+            pw.println("  Simulate device unlocked for given user. This will send corresponding");
+            pw.println("  callback after simulate-device-event-device-locked");
+            pw.println("  command has been called.");
+            pw.println("  USE FOR DEBUGGING AND/OR TESTING PURPOSES ONLY.");
         }
 
         pw.println("  remove-inactive-associations");
diff --git a/services/companion/java/com/android/server/companion/association/DisassociationProcessor.java b/services/companion/java/com/android/server/companion/association/DisassociationProcessor.java
index 20de121..8c1116b 100644
--- a/services/companion/java/com/android/server/companion/association/DisassociationProcessor.java
+++ b/services/companion/java/com/android/server/companion/association/DisassociationProcessor.java
@@ -22,6 +22,8 @@
 import static com.android.internal.util.CollectionUtils.any;
 import static com.android.server.companion.utils.RolesUtils.removeRoleHolderForAssociation;
 
+import static java.util.concurrent.TimeUnit.DAYS;
+
 import android.annotation.NonNull;
 import android.annotation.SuppressLint;
 import android.annotation.UserIdInt;
@@ -30,12 +32,13 @@
 import android.content.Context;
 import android.content.pm.PackageManagerInternal;
 import android.os.Binder;
+import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.util.Slog;
 
 import com.android.server.companion.datatransfer.SystemDataTransferRequestStore;
-import com.android.server.companion.presence.CompanionAppBinder;
-import com.android.server.companion.presence.DevicePresenceProcessor;
+import com.android.server.companion.devicepresence.CompanionAppBinder;
+import com.android.server.companion.devicepresence.DevicePresenceProcessor;
 import com.android.server.companion.transport.CompanionTransportManager;
 
 /**
@@ -46,6 +49,10 @@
 
     private static final String TAG = "CDM_DisassociationProcessor";
 
+    private static final String SYS_PROP_DEBUG_REMOVAL_TIME_WINDOW =
+            "debug.cdm.cdmservice.removal_time_window";
+    private static final long ASSOCIATION_REMOVAL_TIME_WINDOW_DEFAULT = DAYS.toMillis(90);
+
     @NonNull
     private final Context mContext;
     @NonNull
@@ -140,7 +147,7 @@
                 it -> it.isNotifyOnDeviceNearby()
                         && mDevicePresenceMonitor.isDevicePresent(it.getId()));
         if (!shouldStayBound) {
-            mCompanionAppController.unbindCompanionApplication(userId, packageName);
+            mCompanionAppController.unbindCompanionApp(userId, packageName);
         }
     }
 
@@ -194,6 +201,34 @@
     }
 
     /**
+     * Remove idle self-managed associations.
+     */
+    public void removeIdleSelfManagedAssociations() {
+        Slog.i(TAG, "Removing idle self-managed associations.");
+
+        final long currentTime = System.currentTimeMillis();
+        long removalWindow = SystemProperties.getLong(SYS_PROP_DEBUG_REMOVAL_TIME_WINDOW, -1);
+        if (removalWindow <= 0) {
+            // 0 or negative values indicate that the sysprop was never set or should be ignored.
+            removalWindow = ASSOCIATION_REMOVAL_TIME_WINDOW_DEFAULT;
+        }
+
+        for (AssociationInfo association : mAssociationStore.getAssociations()) {
+            if (!association.isSelfManaged()) continue;
+
+            final boolean isInactive =
+                    currentTime - association.getLastTimeConnectedMs() >= removalWindow;
+            if (!isInactive) continue;
+
+            final int id = association.getId();
+
+            Slog.i(TAG, "Removing inactive self-managed association=[" + association.toShortString()
+                    + "].");
+            disassociate(id);
+        }
+    }
+
+    /**
      * An OnUidImportanceListener class which watches the importance of the packages.
      * In this class, we ONLY interested in the importance of the running process is greater than
      * {@link ActivityManager.RunningAppProcessInfo#IMPORTANCE_VISIBLE}.
diff --git a/services/companion/java/com/android/server/companion/association/InactiveAssociationsRemovalService.java b/services/companion/java/com/android/server/companion/association/InactiveAssociationsRemovalService.java
index b52904a..b509e71 100644
--- a/services/companion/java/com/android/server/companion/association/InactiveAssociationsRemovalService.java
+++ b/services/companion/java/com/android/server/companion/association/InactiveAssociationsRemovalService.java
@@ -22,12 +22,13 @@
 import android.app.job.JobParameters;
 import android.app.job.JobScheduler;
 import android.app.job.JobService;
-import android.companion.AssociationInfo;
 import android.content.ComponentName;
 import android.content.Context;
-import android.os.SystemProperties;
 import android.util.Slog;
 
+import com.android.server.LocalServices;
+import com.android.server.companion.CompanionDeviceManagerServiceInternal;
+
 /**
  * A Job Service responsible for clean up self-managed associations if it's idle for 90 days.
  *
@@ -40,24 +41,13 @@
     private static final String JOB_NAMESPACE = "companion";
     private static final int JOB_ID = 1;
     private static final long ONE_DAY_INTERVAL = DAYS.toMillis(1);
-    private static final String SYS_PROP_DEBUG_REMOVAL_TIME_WINDOW =
-            "debug.cdm.cdmservice.removal_time_window";
-    private static final long ASSOCIATION_REMOVAL_TIME_WINDOW_DEFAULT = DAYS.toMillis(90);
-
-    private final AssociationStore mAssociationStore;
-    private final DisassociationProcessor mDisassociationProcessor;
-
-    public InactiveAssociationsRemovalService(AssociationStore associationStore,
-            DisassociationProcessor disassociationProcessor) {
-        mAssociationStore = associationStore;
-        mDisassociationProcessor = disassociationProcessor;
-    }
 
     @Override
     public boolean onStartJob(final JobParameters params) {
         Slog.i(TAG, "Execute the Association Removal job");
 
-        removeIdleSelfManagedAssociations();
+        LocalServices.getService(CompanionDeviceManagerServiceInternal.class)
+                .removeInactiveSelfManagedAssociations();
 
         jobFinished(params, false);
         return true;
@@ -87,29 +77,4 @@
                 .build();
         jobScheduler.schedule(job);
     }
-
-    /**
-     * Remove idle self-managed associations.
-     */
-    public void removeIdleSelfManagedAssociations() {
-        final long currentTime = System.currentTimeMillis();
-        long removalWindow = SystemProperties.getLong(SYS_PROP_DEBUG_REMOVAL_TIME_WINDOW, -1);
-        if (removalWindow <= 0) {
-            // 0 or negative values indicate that the sysprop was never set or should be ignored.
-            removalWindow = ASSOCIATION_REMOVAL_TIME_WINDOW_DEFAULT;
-        }
-
-        for (AssociationInfo association : mAssociationStore.getAssociations()) {
-            if (!association.isSelfManaged()) continue;
-
-            final boolean isInactive =
-                    currentTime - association.getLastTimeConnectedMs() >= removalWindow;
-            if (!isInactive) continue;
-
-            final int id = association.getId();
-
-            Slog.i(TAG, "Removing inactive self-managed association id=" + id);
-            mDisassociationProcessor.disassociate(id);
-        }
-    }
 }
diff --git a/services/companion/java/com/android/server/companion/devicepresence/BleDeviceProcessor.java b/services/companion/java/com/android/server/companion/devicepresence/BleDeviceProcessor.java
new file mode 100644
index 0000000..6cdc02e
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/devicepresence/BleDeviceProcessor.java
@@ -0,0 +1,303 @@
+/*
+ * 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.server.companion.devicepresence;
+
+import static android.bluetooth.BluetoothAdapter.ACTION_BLE_STATE_CHANGED;
+import static android.bluetooth.BluetoothAdapter.ACTION_STATE_CHANGED;
+import static android.bluetooth.le.ScanSettings.CALLBACK_TYPE_ALL_MATCHES;
+import static android.bluetooth.le.ScanSettings.CALLBACK_TYPE_FIRST_MATCH;
+import static android.bluetooth.le.ScanSettings.CALLBACK_TYPE_MATCH_LOST;
+import static android.bluetooth.le.ScanSettings.SCAN_MODE_LOW_POWER;
+
+import static java.util.Objects.requireNonNull;
+
+import android.annotation.MainThread;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.le.BluetoothLeScanner;
+import android.bluetooth.le.ScanCallback;
+import android.bluetooth.le.ScanFilter;
+import android.bluetooth.le.ScanResult;
+import android.bluetooth.le.ScanSettings;
+import android.companion.AssociationInfo;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Slog;
+
+import com.android.server.companion.association.AssociationStore;
+import com.android.server.companion.association.AssociationStore.ChangeType;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@SuppressLint("LongLogTag")
+class BleDeviceProcessor implements AssociationStore.OnChangeListener {
+    private static final String TAG = "CDM_BleDeviceProcessor";
+
+    interface Callback {
+        void onBleCompanionDeviceFound(int associationId, int userId);
+
+        void onBleCompanionDeviceLost(int associationId, int userId);
+    }
+
+    @NonNull
+    private final AssociationStore mAssociationStore;
+    @NonNull
+    private final Callback mCallback;
+
+    // Non-null after init().
+    @Nullable
+    private BluetoothAdapter mBtAdapter;
+    // Non-null after init() and when BLE is available. Otherwise - null.
+    @Nullable
+    private BluetoothLeScanner mBleScanner;
+    // Only accessed from the Main thread.
+    private boolean mScanning = false;
+
+    BleDeviceProcessor(@NonNull AssociationStore associationStore, @NonNull Callback callback) {
+        mAssociationStore = associationStore;
+        mCallback = callback;
+    }
+
+    @MainThread
+    void init(@NonNull Context context, @NonNull BluetoothAdapter btAdapter) {
+        if (mBtAdapter != null) {
+            throw new IllegalStateException(getClass().getSimpleName() + " is already initialized");
+        }
+        mBtAdapter = requireNonNull(btAdapter);
+
+        checkBleState();
+        registerBluetoothStateBroadcastReceiver(context);
+
+        mAssociationStore.registerLocalListener(this);
+    }
+
+    @MainThread
+    final void restartScan() {
+        enforceInitialized();
+
+        if (mBleScanner == null) {
+            return;
+        }
+
+        stopScanIfNeeded();
+        startScan();
+    }
+
+    @Override
+    public void onAssociationChanged(@ChangeType int changeType, AssociationInfo association) {
+        // Simply restart scanning.
+        if (Looper.getMainLooper().isCurrentThread()) {
+            restartScan();
+        } else {
+            new Handler(Looper.getMainLooper()).post(this::restartScan);
+        }
+    }
+
+    @MainThread
+    private void checkBleState() {
+        enforceInitialized();
+
+        final boolean bleAvailable = mBtAdapter.isLeEnabled();
+        if ((bleAvailable && mBleScanner != null) || (!bleAvailable && mBleScanner == null)) {
+            // Nothing changed.
+            return;
+        }
+
+        if (bleAvailable) {
+            mBleScanner = mBtAdapter.getBluetoothLeScanner();
+            if (mBleScanner == null) {
+                // Oops, that's a race condition. Can return.
+                return;
+            }
+
+            startScan();
+        } else {
+            stopScanIfNeeded();
+            mBleScanner = null;
+        }
+    }
+
+    @MainThread
+    void startScan() {
+        enforceInitialized();
+
+        Slog.i(TAG, "startBleScan()");
+        // This method should not be called if scan is already in progress.
+        if (mScanning) {
+            Slog.w(TAG, "Scan is already in progress.");
+            return;
+        }
+
+        // Neither should this method be called if the adapter is not available.
+        if (mBleScanner == null) {
+            Slog.w(TAG, "BLE is not available.");
+            return;
+        }
+
+        // Collect MAC addresses from all associations.
+        final Set<String> macAddresses = new HashSet<>();
+        for (AssociationInfo association : mAssociationStore.getActiveAssociations()) {
+            if (!association.isNotifyOnDeviceNearby()) continue;
+
+            // Beware that BT stack does not consider low-case MAC addresses valid, while
+            // MacAddress.toString() return a low-case String.
+            final String macAddress = association.getDeviceMacAddressAsString();
+            if (macAddress != null) {
+                macAddresses.add(macAddress);
+            }
+        }
+        if (macAddresses.isEmpty()) {
+            return;
+        }
+
+        final List<ScanFilter> filters = new ArrayList<>(macAddresses.size());
+        for (String macAddress : macAddresses) {
+            final ScanFilter filter = new ScanFilter.Builder()
+                    .setDeviceAddress(macAddress)
+                    .build();
+            filters.add(filter);
+        }
+
+        // BluetoothLeScanner will throw an IllegalStateException if startScan() is called while LE
+        // is not enabled.
+        if (mBtAdapter.isLeEnabled()) {
+            try {
+                mBleScanner.startScan(filters, SCAN_SETTINGS, mScanCallback);
+                mScanning = true;
+            } catch (IllegalStateException e) {
+                Slog.w(TAG, "Exception while starting BLE scanning", e);
+            }
+        } else {
+            Slog.w(TAG, "BLE scanning is not turned on");
+        }
+    }
+
+    void stopScanIfNeeded() {
+        enforceInitialized();
+
+        Slog.i(TAG, "stopBleScan()");
+        if (!mScanning) {
+            return;
+        }
+        // mScanCallback is non-null here - it cannot be null when mScanning is true.
+
+        // BluetoothLeScanner will throw an IllegalStateException if stopScan() is called while LE
+        // is not enabled.
+        if (mBtAdapter.isLeEnabled()) {
+            try {
+                mBleScanner.stopScan(mScanCallback);
+            } catch (IllegalStateException e) {
+                Slog.w(TAG, "Exception while stopping BLE scanning", e);
+            }
+        } else {
+            Slog.w(TAG, "BLE scanning is not turned on");
+        }
+
+        mScanning = false;
+    }
+
+    @MainThread
+    private void notifyDeviceFound(@NonNull BluetoothDevice device) {
+        for (AssociationInfo association : mAssociationStore.getActiveAssociationsByAddress(
+                device.getAddress())) {
+            mCallback.onBleCompanionDeviceFound(association.getId(), association.getUserId());
+        }
+    }
+
+    @MainThread
+    private void notifyDeviceLost(@NonNull BluetoothDevice device) {
+        for (AssociationInfo association : mAssociationStore.getActiveAssociationsByAddress(
+                device.getAddress())) {
+            mCallback.onBleCompanionDeviceLost(association.getId(), association.getUserId());
+        }
+    }
+
+    private void registerBluetoothStateBroadcastReceiver(Context context) {
+        final BroadcastReceiver receiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                checkBleState();
+            }
+        };
+
+        final IntentFilter filter = new IntentFilter();
+        filter.addAction(ACTION_STATE_CHANGED);
+        filter.addAction(ACTION_BLE_STATE_CHANGED);
+
+        context.registerReceiver(receiver, filter);
+    }
+
+    private void enforceInitialized() {
+        if (mBtAdapter != null) return;
+        throw new IllegalStateException(getClass().getSimpleName() + " is not initialized");
+    }
+
+    private final ScanCallback mScanCallback = new ScanCallback() {
+        @MainThread
+        @Override
+        public void onScanResult(int callbackType, ScanResult result) {
+            final BluetoothDevice device = result.getDevice();
+
+            switch (callbackType) {
+                case CALLBACK_TYPE_FIRST_MATCH:
+                    notifyDeviceFound(device);
+                    break;
+
+                case CALLBACK_TYPE_MATCH_LOST:
+                    notifyDeviceLost(device);
+                    break;
+
+                default:
+                    Slog.wtf(TAG, "Unexpected callback "
+                            + nameForBleScanCallbackType(callbackType));
+                    break;
+            }
+        }
+
+        @MainThread
+        @Override
+        public void onScanFailed(int errorCode) {
+            mScanning = false;
+        }
+    };
+
+    private static String nameForBleScanCallbackType(int callbackType) {
+        final String name = switch (callbackType) {
+            case CALLBACK_TYPE_ALL_MATCHES -> "ALL_MATCHES";
+            case CALLBACK_TYPE_FIRST_MATCH -> "FIRST_MATCH";
+            case CALLBACK_TYPE_MATCH_LOST -> "MATCH_LOST";
+            default -> "Unknown";
+        };
+        return name + "(" + callbackType + ")";
+    }
+
+    private static final ScanSettings SCAN_SETTINGS = new ScanSettings.Builder()
+            .setCallbackType(CALLBACK_TYPE_FIRST_MATCH | CALLBACK_TYPE_MATCH_LOST)
+            .setScanMode(SCAN_MODE_LOW_POWER)
+            .build();
+}
diff --git a/services/companion/java/com/android/server/companion/devicepresence/BluetoothDeviceProcessor.java b/services/companion/java/com/android/server/companion/devicepresence/BluetoothDeviceProcessor.java
new file mode 100644
index 0000000..612c156
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/devicepresence/BluetoothDeviceProcessor.java
@@ -0,0 +1,148 @@
+/*
+ * 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.server.companion.devicepresence;
+
+import static android.companion.DevicePresenceEvent.EVENT_BT_CONNECTED;
+import static android.companion.DevicePresenceEvent.EVENT_BT_DISCONNECTED;
+
+import android.annotation.NonNull;
+import android.annotation.SuppressLint;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.companion.AssociationInfo;
+import android.net.MacAddress;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.os.ParcelUuid;
+import android.os.UserHandle;
+
+import com.android.internal.util.ArrayUtils;
+import com.android.server.companion.association.AssociationStore;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@SuppressLint("LongLogTag")
+public class BluetoothDeviceProcessor
+        extends BluetoothAdapter.BluetoothConnectionCallback
+        implements AssociationStore.OnChangeListener {
+    private static final String TAG = "CDM_BluetoothDeviceProcessor";
+
+    interface Callback {
+        void onBluetoothCompanionDeviceConnected(int associationId, int userId);
+
+        void onBluetoothCompanionDeviceDisconnected(int associationId, int userId);
+
+        void onDevicePresenceEventByUuid(ObservableUuid uuid, int event);
+    }
+
+    @NonNull
+    private final AssociationStore mAssociationStore;
+    @NonNull
+    private final ObservableUuidStore mObservableUuidStore;
+    @NonNull
+    private final Callback mCallback;
+
+    /** A set of ALL connected BT device (not only companion.) */
+    @NonNull
+    private final Map<MacAddress, BluetoothDevice> mAllConnectedDevices = new HashMap<>();
+
+    BluetoothDeviceProcessor(@NonNull AssociationStore associationStore,
+            @NonNull ObservableUuidStore observableUuidStore, @NonNull Callback callback) {
+        mAssociationStore = associationStore;
+        mObservableUuidStore = observableUuidStore;
+        mCallback = callback;
+    }
+
+    void init(@NonNull BluetoothAdapter btAdapter) {
+        btAdapter.registerBluetoothConnectionCallback(
+                new HandlerExecutor(Handler.getMain()), /* callback */this);
+        mAssociationStore.registerLocalListener(this);
+    }
+
+    /**
+     * Overrides
+     * {@link BluetoothAdapter.BluetoothConnectionCallback#onDeviceConnected(BluetoothDevice)}.
+     */
+    @Override
+    public void onDeviceConnected(@NonNull BluetoothDevice device) {
+        final MacAddress macAddress = MacAddress.fromString(device.getAddress());
+
+        if (mAllConnectedDevices.put(macAddress, device) != null) {
+            return;
+        }
+
+        onDeviceConnectivityChanged(device, true);
+    }
+
+    /**
+     * Overrides
+     * {@link BluetoothAdapter.BluetoothConnectionCallback#onDeviceConnected(BluetoothDevice)}.
+     * Also invoked when user turns BT off while the device is connected.
+     */
+    @Override
+    public void onDeviceDisconnected(@NonNull BluetoothDevice device,
+            int reason) {
+        final MacAddress macAddress = MacAddress.fromString(device.getAddress());
+
+        if (mAllConnectedDevices.remove(macAddress) == null) {
+            return;
+        }
+
+        onDeviceConnectivityChanged(device, false);
+    }
+
+    private void onDeviceConnectivityChanged(@NonNull BluetoothDevice device, boolean connected) {
+        int userId = UserHandle.myUserId();
+        final List<AssociationInfo> associations =
+                mAssociationStore.getActiveAssociationsByAddress(device.getAddress());
+
+        for (AssociationInfo association : associations) {
+            if (!association.isNotifyOnDeviceNearby()) continue;
+            final int id = association.getId();
+            if (connected) {
+                mCallback.onBluetoothCompanionDeviceConnected(id, association.getUserId());
+            } else {
+                mCallback.onBluetoothCompanionDeviceDisconnected(id, association.getUserId());
+            }
+        }
+
+        final List<ObservableUuid> observableUuids =
+                mObservableUuidStore.getObservableUuidsForUser(userId);
+        final ParcelUuid[] bluetoothDeviceUuids = device.getUuids();
+        final List<ParcelUuid> deviceUuids = ArrayUtils.isEmpty(bluetoothDeviceUuids)
+                ? Collections.emptyList() : Arrays.asList(bluetoothDeviceUuids);
+
+        for (ObservableUuid uuid : observableUuids) {
+            if (deviceUuids.contains(uuid.getUuid())) {
+                mCallback.onDevicePresenceEventByUuid(uuid, connected ? EVENT_BT_CONNECTED
+                        : EVENT_BT_DISCONNECTED);
+            }
+        }
+    }
+
+    @Override
+    public void onAssociationAdded(AssociationInfo association) {
+        if (mAllConnectedDevices.containsKey(association.getDeviceMacAddress())) {
+            mCallback.onBluetoothCompanionDeviceConnected(
+                    association.getId(), association.getUserId());
+        }
+    }
+}
diff --git a/services/companion/java/com/android/server/companion/devicepresence/CompanionAppBinder.java b/services/companion/java/com/android/server/companion/devicepresence/CompanionAppBinder.java
new file mode 100644
index 0000000..60f4688
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/devicepresence/CompanionAppBinder.java
@@ -0,0 +1,321 @@
+/*
+ * 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.server.companion.devicepresence;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.UserIdInt;
+import android.companion.AssociationInfo;
+import android.companion.CompanionDeviceService;
+import android.companion.DevicePresenceEvent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Handler;
+import android.util.Pair;
+import android.util.Slog;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.infra.PerUser;
+import com.android.server.companion.CompanionDeviceManagerService;
+import com.android.server.companion.utils.PackageUtils;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Manages communication with companion applications via
+ * {@link android.companion.ICompanionDeviceService} interface, including "connecting" (binding) to
+ * the services, maintaining the connection (the binding), and invoking callback methods such as
+ * {@link CompanionDeviceService#onDeviceAppeared(AssociationInfo)},
+ * {@link CompanionDeviceService#onDeviceDisappeared(AssociationInfo)} and
+ * {@link CompanionDeviceService#onDevicePresenceEvent(DevicePresenceEvent)} in the
+ * application process.
+ *
+ * <p>
+ * The following is the list of the APIs provided by {@link CompanionAppBinder} (to be
+ * utilized by {@link CompanionDeviceManagerService}):
+ * <ul>
+ * <li> {@link #bindCompanionApp(int, String, boolean, CompanionServiceConnector.Listener)}
+ * <li> {@link #unbindCompanionApp(int, String)}
+ * <li> {@link #isCompanionApplicationBound(int, String)}
+ * <li> {@link #isRebindingCompanionApplicationScheduled(int, String)}
+ * </ul>
+ *
+ * @see CompanionDeviceService
+ * @see android.companion.ICompanionDeviceService
+ * @see CompanionServiceConnector
+ */
+@SuppressLint("LongLogTag")
+public class CompanionAppBinder {
+    private static final String TAG = "CDM_CompanionAppBinder";
+
+    private static final long REBIND_TIMEOUT = 10 * 1000; // 10 sec
+
+    @NonNull
+    private final Context mContext;
+    @NonNull
+    private final CompanionServicesRegister mCompanionServicesRegister;
+
+    @NonNull
+    @GuardedBy("mBoundCompanionApplications")
+    private final Map<Pair<Integer, String>, List<CompanionServiceConnector>>
+            mBoundCompanionApplications;
+    @NonNull
+    @GuardedBy("mScheduledForRebindingCompanionApplications")
+    private final Set<Pair<Integer, String>> mScheduledForRebindingCompanionApplications;
+
+    public CompanionAppBinder(@NonNull Context context) {
+        mContext = context;
+        mCompanionServicesRegister = new CompanionServicesRegister();
+        mBoundCompanionApplications = new HashMap<>();
+        mScheduledForRebindingCompanionApplications = new HashSet<>();
+    }
+
+    /**
+     * On package changed.
+     */
+    public void onPackagesChanged(@UserIdInt int userId) {
+        mCompanionServicesRegister.invalidate(userId);
+    }
+
+    /**
+     * CDM binds to the companion app.
+     */
+    public void bindCompanionApp(@UserIdInt int userId, @NonNull String packageName,
+            boolean isSelfManaged, CompanionServiceConnector.Listener listener) {
+        Slog.i(TAG, "Binding user=[" + userId + "], package=[" + packageName + "], isSelfManaged=["
+                + isSelfManaged + "]...");
+
+        final List<ComponentName> companionServices =
+                mCompanionServicesRegister.forPackage(userId, packageName);
+        if (companionServices.isEmpty()) {
+            Slog.e(TAG, "Can not bind companion applications u" + userId + "/" + packageName + ": "
+                    + "eligible CompanionDeviceService not found.\n"
+                    + "A CompanionDeviceService should declare an intent-filter for "
+                    + "\"android.companion.CompanionDeviceService\" action and require "
+                    + "\"android.permission.BIND_COMPANION_DEVICE_SERVICE\" permission.");
+            return;
+        }
+
+        final List<CompanionServiceConnector> serviceConnectors = new ArrayList<>();
+        synchronized (mBoundCompanionApplications) {
+            if (mBoundCompanionApplications.containsKey(new Pair<>(userId, packageName))) {
+                Slog.w(TAG, "The package is ALREADY bound.");
+                return;
+            }
+
+            for (int i = 0; i < companionServices.size(); i++) {
+                boolean isPrimary = i == 0;
+                serviceConnectors.add(CompanionServiceConnector.newInstance(mContext, userId,
+                        companionServices.get(i), isSelfManaged, isPrimary));
+            }
+
+            mBoundCompanionApplications.put(new Pair<>(userId, packageName), serviceConnectors);
+        }
+
+        // Set listeners for both Primary and Secondary connectors.
+        for (CompanionServiceConnector serviceConnector : serviceConnectors) {
+            serviceConnector.setListener(listener);
+        }
+
+        // Now "bind" all the connectors: the primary one and the rest of them.
+        for (CompanionServiceConnector serviceConnector : serviceConnectors) {
+            serviceConnector.connect();
+        }
+    }
+
+    /**
+     * CDM unbinds the companion app.
+     */
+    public void unbindCompanionApp(@UserIdInt int userId, @NonNull String packageName) {
+        Slog.i(TAG, "Unbinding user=[" + userId + "], package=[" + packageName + "]...");
+
+        final List<CompanionServiceConnector> serviceConnectors;
+
+        synchronized (mBoundCompanionApplications) {
+            serviceConnectors = mBoundCompanionApplications.remove(new Pair<>(userId, packageName));
+        }
+
+        synchronized (mScheduledForRebindingCompanionApplications) {
+            mScheduledForRebindingCompanionApplications.remove(new Pair<>(userId, packageName));
+        }
+
+        if (serviceConnectors == null) {
+            Slog.e(TAG, "The package is not bound.");
+            return;
+        }
+
+        for (CompanionServiceConnector serviceConnector : serviceConnectors) {
+            serviceConnector.postUnbind();
+        }
+    }
+
+    /**
+     * @return whether the companion application is bound now.
+     */
+    public boolean isCompanionApplicationBound(@UserIdInt int userId, @NonNull String packageName) {
+        synchronized (mBoundCompanionApplications) {
+            return mBoundCompanionApplications.containsKey(new Pair<>(userId, packageName));
+        }
+    }
+
+    /**
+     * Remove bound apps for package.
+     */
+    public void removePackage(int userId, String packageName) {
+        synchronized (mBoundCompanionApplications) {
+            mBoundCompanionApplications.remove(new Pair<>(userId, packageName));
+        }
+
+        synchronized (mScheduledForRebindingCompanionApplications) {
+            mScheduledForRebindingCompanionApplications.remove(new Pair<>(userId, packageName));
+        }
+    }
+
+    /**
+     * Schedule rebinding for the package.
+     */
+    public void scheduleRebinding(@UserIdInt int userId, @NonNull String packageName,
+            CompanionServiceConnector serviceConnector) {
+        Slog.i(TAG, "scheduleRebinding() " + userId + "/" + packageName);
+
+        if (isRebindingCompanionApplicationScheduled(userId, packageName)) {
+            Slog.i(TAG, "CompanionApplication rebinding has been scheduled, skipping "
+                    + serviceConnector.getComponentName());
+            return;
+        }
+
+        if (serviceConnector.isPrimary()) {
+            synchronized (mScheduledForRebindingCompanionApplications) {
+                mScheduledForRebindingCompanionApplications.add(new Pair<>(userId, packageName));
+            }
+        }
+
+        // Rebinding in 10 seconds.
+        Handler.getMain().postDelayed(() ->
+                        onRebindingCompanionApplicationTimeout(userId, packageName,
+                                serviceConnector),
+                REBIND_TIMEOUT);
+    }
+
+    private boolean isRebindingCompanionApplicationScheduled(
+            @UserIdInt int userId, @NonNull String packageName) {
+        synchronized (mScheduledForRebindingCompanionApplications) {
+            return mScheduledForRebindingCompanionApplications.contains(
+                    new Pair<>(userId, packageName));
+        }
+    }
+
+    private void onRebindingCompanionApplicationTimeout(
+            @UserIdInt int userId, @NonNull String packageName,
+            @NonNull CompanionServiceConnector serviceConnector) {
+        // Re-mark the application is bound.
+        if (serviceConnector.isPrimary()) {
+            synchronized (mBoundCompanionApplications) {
+                if (!mBoundCompanionApplications.containsKey(new Pair<>(userId, packageName))) {
+                    List<CompanionServiceConnector> serviceConnectors =
+                            Collections.singletonList(serviceConnector);
+                    mBoundCompanionApplications.put(new Pair<>(userId, packageName),
+                            serviceConnectors);
+                }
+            }
+
+            synchronized (mScheduledForRebindingCompanionApplications) {
+                mScheduledForRebindingCompanionApplications.remove(new Pair<>(userId, packageName));
+            }
+        }
+
+        serviceConnector.connect();
+    }
+
+    /**
+     * Dump bound apps.
+     */
+    public void dump(@NonNull PrintWriter out) {
+        out.append("Companion Device Application Controller: \n");
+
+        synchronized (mBoundCompanionApplications) {
+            out.append("  Bound Companion Applications: ");
+            if (mBoundCompanionApplications.isEmpty()) {
+                out.append("<empty>\n");
+            } else {
+                out.append("\n");
+                for (Map.Entry<Pair<Integer, String>, List<CompanionServiceConnector>> entry :
+                        mBoundCompanionApplications.entrySet()) {
+                    out.append("<u").append(String.valueOf(entry.getKey().first)).append(", ")
+                            .append(entry.getKey().second).append(">");
+                    for (CompanionServiceConnector serviceConnector : entry.getValue()) {
+                        out.append(", isPrimary=").append(
+                                String.valueOf(serviceConnector.isPrimary()));
+                    }
+                }
+            }
+        }
+
+        out.append("  Companion Applications Scheduled For Rebinding: ");
+        synchronized (mScheduledForRebindingCompanionApplications) {
+            if (mScheduledForRebindingCompanionApplications.isEmpty()) {
+                out.append("<empty>\n");
+            } else {
+                out.append("\n");
+                for (Pair<Integer, String> app : mScheduledForRebindingCompanionApplications) {
+                    out.append("<u").append(String.valueOf(app.first)).append(", ")
+                            .append(app.second).append(">");
+                }
+            }
+        }
+    }
+
+    @Nullable
+    CompanionServiceConnector getPrimaryServiceConnector(
+            @UserIdInt int userId, @NonNull String packageName) {
+        final List<CompanionServiceConnector> connectors;
+        synchronized (mBoundCompanionApplications) {
+            connectors = mBoundCompanionApplications.get(new Pair<>(userId, packageName));
+        }
+        return connectors != null ? connectors.get(0) : null;
+    }
+
+    private class CompanionServicesRegister extends PerUser<Map<String, List<ComponentName>>> {
+        @Override
+        public synchronized @NonNull Map<String, List<ComponentName>> forUser(
+                @UserIdInt int userId) {
+            return super.forUser(userId);
+        }
+
+        synchronized @NonNull List<ComponentName> forPackage(
+                @UserIdInt int userId, @NonNull String packageName) {
+            return forUser(userId).getOrDefault(packageName, Collections.emptyList());
+        }
+
+        synchronized void invalidate(@UserIdInt int userId) {
+            remove(userId);
+        }
+
+        @Override
+        protected final @NonNull Map<String, List<ComponentName>> create(@UserIdInt int userId) {
+            return PackageUtils.getCompanionServicesForUser(mContext, userId);
+        }
+    }
+}
diff --git a/services/companion/java/com/android/server/companion/devicepresence/CompanionServiceConnector.java b/services/companion/java/com/android/server/companion/devicepresence/CompanionServiceConnector.java
new file mode 100644
index 0000000..5923e70c
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/devicepresence/CompanionServiceConnector.java
@@ -0,0 +1,219 @@
+/*
+ * 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.server.companion.devicepresence;
+
+import static android.content.Context.BIND_ALMOST_PERCEPTIBLE;
+import static android.content.Context.BIND_TREAT_LIKE_VISIBLE_FOREGROUND_SERVICE;
+import static android.os.Process.THREAD_PRIORITY_DEFAULT;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.UserIdInt;
+import android.companion.AssociationInfo;
+import android.companion.CompanionDeviceService;
+import android.companion.DevicePresenceEvent;
+import android.companion.ICompanionDeviceService;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Handler;
+import android.os.IBinder;
+import android.util.Slog;
+
+import com.android.internal.infra.ServiceConnector;
+import com.android.server.ServiceThread;
+import com.android.server.companion.CompanionDeviceManagerService;
+
+/**
+ * Manages a connection (binding) to an instance of {@link CompanionDeviceService} running in the
+ * application process.
+ */
+@SuppressLint("LongLogTag")
+public class CompanionServiceConnector extends ServiceConnector.Impl<ICompanionDeviceService> {
+
+    /** Listener for changes to the state of the {@link CompanionServiceConnector}  */
+    public interface Listener {
+        /**
+         * Called when service binding is died.
+         */
+        void onBindingDied(@UserIdInt int userId, @NonNull String packageName,
+                @NonNull CompanionServiceConnector serviceConnector);
+    }
+
+    private static final String TAG = "CDM_CompanionServiceConnector";
+
+    /* Unbinding before executing the callbacks can cause problems. Wait 5-seconds before unbind. */
+    private static final long UNBIND_POST_DELAY_MS = 5_000;
+    @UserIdInt
+    private final int mUserId;
+    @NonNull
+    private final ComponentName mComponentName;
+    private final boolean mIsPrimary;
+    // IMPORTANT: this can (and will!) be null (at the moment, CompanionApplicationController only
+    // installs a listener to the primary ServiceConnector), hence we should always null-check the
+    // reference before calling on it.
+    @Nullable
+    private Listener mListener;
+
+    /**
+     * Create a CompanionDeviceServiceConnector instance.
+     *
+     * For self-managed apps, the binding flag will be BIND_TREAT_LIKE_VISIBLE_FOREGROUND_SERVICE
+     * (oom_score_adj = VISIBLE_APP_ADJ = 100).
+     *
+     * For non self-managed apps, the binding flag will be BIND_ALMOST_PERCEPTIBLE
+     * (oom_score_adj = PERCEPTIBLE_MEDIUM_APP = 225). The target service will be treated
+     * as important as a perceptible app (IMPORTANCE_VISIBLE = 200), and will be unbound when
+     * the app is removed from task manager.
+     *
+     * One time permission's importance level to keep session alive is
+     * IMPORTANCE_FOREGROUND_SERVICE = 125. In order to kill the one time permission session, the
+     * service importance level should be higher than 125.
+     */
+    static CompanionServiceConnector newInstance(@NonNull Context context,
+            @UserIdInt int userId, @NonNull ComponentName componentName, boolean isSelfManaged,
+            boolean isPrimary) {
+        final int bindingFlags = isSelfManaged ? BIND_TREAT_LIKE_VISIBLE_FOREGROUND_SERVICE
+                : BIND_ALMOST_PERCEPTIBLE;
+        return new CompanionServiceConnector(
+                context, userId, componentName, bindingFlags, isPrimary);
+    }
+
+    private CompanionServiceConnector(@NonNull Context context, @UserIdInt int userId,
+            @NonNull ComponentName componentName, int bindingFlags, boolean isPrimary) {
+        super(context, buildIntent(componentName), bindingFlags, userId, null);
+        mUserId = userId;
+        mComponentName = componentName;
+        mIsPrimary = isPrimary;
+    }
+
+    void setListener(@Nullable Listener listener) {
+        mListener = listener;
+    }
+
+    void postOnDeviceAppeared(@NonNull AssociationInfo associationInfo) {
+        post(companionService -> companionService.onDeviceAppeared(associationInfo));
+    }
+
+    void postOnDeviceDisappeared(@NonNull AssociationInfo associationInfo) {
+        post(companionService -> companionService.onDeviceDisappeared(associationInfo));
+    }
+
+    void postOnDevicePresenceEvent(@NonNull DevicePresenceEvent event) {
+        post(companionService -> companionService.onDevicePresenceEvent(event));
+    }
+
+    /**
+     * Post "unbind" job, which will run *after* all previously posted jobs complete.
+     *
+     * IMPORTANT: use this method instead of invoking {@link ServiceConnector#unbind()} directly,
+     * because the latter may cause previously posted callback, such as
+     * {@link ICompanionDeviceService#onDeviceDisappeared(AssociationInfo)} to be dropped.
+     *
+     * {@link ICompanionDeviceService} is a non-blocking interface and doesn't wait for job
+     * completion, which makes {@link ServiceConnector#post(VoidJob)} obsolete for ensuring the
+     * order of execution. Give 5 seconds for all the callbacks to finish before unbinding. They
+     * may or may not have finished executing, but we shouldn't let user-overridden methods block
+     * the service from unbinding indefinitely.
+     */
+    void postUnbind() {
+        getJobHandler().postDelayed(this::unbind, UNBIND_POST_DELAY_MS);
+    }
+
+    boolean isPrimary() {
+        return mIsPrimary;
+    }
+
+    @NonNull
+    ComponentName getComponentName() {
+        return mComponentName;
+    }
+
+    @Override
+    protected void onServiceConnectionStatusChanged(
+            @NonNull ICompanionDeviceService service, boolean isConnected) {
+        Slog.d(TAG, "onServiceConnectionStatusChanged() " + mComponentName.toShortString()
+                + " connected=" + isConnected);
+    }
+
+    @Override
+    public void binderDied() {
+        super.binderDied();
+
+        Slog.d(TAG, "binderDied() " + mComponentName.toShortString());
+
+        // Handle primary process being killed
+        if (mListener != null) {
+            mListener.onBindingDied(mUserId, mComponentName.getPackageName(), this);
+        }
+    }
+
+    @Override
+    protected ICompanionDeviceService binderAsInterface(@NonNull IBinder service) {
+        return ICompanionDeviceService.Stub.asInterface(service);
+    }
+
+    /**
+     * Overrides {@link ServiceConnector.Impl#getJobHandler()} to provide an alternative Thread
+     * ("in form of" a {@link Handler}) to process jobs on.
+     * <p>
+     * (By default, {@link ServiceConnector.Impl} process jobs on the
+     * {@link android.os.Looper#getMainLooper() MainThread} which is a shared singleton thread
+     * within system_server and thus tends to get heavily congested)
+     */
+    @Override
+    @NonNull
+    protected Handler getJobHandler() {
+        return getServiceThread().getThreadHandler();
+    }
+
+    @Override
+    protected long getAutoDisconnectTimeoutMs() {
+        // Do NOT auto-disconnect.
+        return -1;
+    }
+
+    @NonNull
+    private static Intent buildIntent(@NonNull ComponentName componentName) {
+        return new Intent(CompanionDeviceService.SERVICE_INTERFACE)
+                .setComponent(componentName);
+    }
+
+    @NonNull
+    private static ServiceThread getServiceThread() {
+        if (sServiceThread == null) {
+            synchronized (CompanionDeviceManagerService.class) {
+                if (sServiceThread == null) {
+                    sServiceThread = new ServiceThread("companion-device-service-connector",
+                            THREAD_PRIORITY_DEFAULT, /* allowIo */ false);
+                    sServiceThread.start();
+                }
+            }
+        }
+        return sServiceThread;
+    }
+
+    /**
+     * A worker thread for the {@link ServiceConnector} to process jobs on.
+     *
+     * <p>
+     *  Do NOT reference directly, use {@link #getServiceThread()} method instead.
+     */
+    @Nullable
+    private static volatile ServiceThread sServiceThread;
+}
diff --git a/services/companion/java/com/android/server/companion/devicepresence/DevicePresenceProcessor.java b/services/companion/java/com/android/server/companion/devicepresence/DevicePresenceProcessor.java
new file mode 100644
index 0000000..cfb7f337
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/devicepresence/DevicePresenceProcessor.java
@@ -0,0 +1,1207 @@
+/*
+ * 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.server.companion.devicepresence;
+
+import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PROJECTION;
+import static android.companion.DevicePresenceEvent.EVENT_BLE_APPEARED;
+import static android.companion.DevicePresenceEvent.EVENT_BLE_DISAPPEARED;
+import static android.companion.DevicePresenceEvent.EVENT_BT_CONNECTED;
+import static android.companion.DevicePresenceEvent.EVENT_BT_DISCONNECTED;
+import static android.companion.DevicePresenceEvent.EVENT_SELF_MANAGED_APPEARED;
+import static android.companion.DevicePresenceEvent.EVENT_SELF_MANAGED_DISAPPEARED;
+import static android.companion.DevicePresenceEvent.NO_ASSOCIATION;
+import static android.content.Context.BLUETOOTH_SERVICE;
+import static android.os.Process.ROOT_UID;
+import static android.os.Process.SHELL_UID;
+
+import static com.android.server.companion.utils.PermissionsUtils.enforceCallerCanManageAssociationsForPackage;
+import static com.android.server.companion.utils.PermissionsUtils.enforceCallerCanObserveDevicePresenceByUuid;
+
+import android.annotation.NonNull;
+import android.annotation.SuppressLint;
+import android.annotation.TestApi;
+import android.annotation.UserIdInt;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothManager;
+import android.companion.AssociationInfo;
+import android.companion.DeviceNotAssociatedException;
+import android.companion.DevicePresenceEvent;
+import android.companion.ObservingDevicePresenceRequest;
+import android.content.Context;
+import android.hardware.power.Mode;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.ParcelUuid;
+import android.os.PowerManagerInternal;
+import android.os.RemoteException;
+import android.os.UserManager;
+import android.util.Slog;
+import android.util.SparseArray;
+import android.util.SparseBooleanArray;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.companion.association.AssociationStore;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Class responsible for monitoring companion devices' "presence" status (i.e.
+ * connected/disconnected for Bluetooth devices; nearby or not for BLE devices).
+ *
+ * <p>
+ * Should only be used by
+ * {@link com.android.server.companion.CompanionDeviceManagerService CompanionDeviceManagerService}
+ * to which it provides the following API:
+ * <ul>
+ * <li> {@link #onSelfManagedDeviceConnected(int)}
+ * <li> {@link #onSelfManagedDeviceDisconnected(int)}
+ * <li> {@link #isDevicePresent(int)}
+ * </ul>
+ */
+@SuppressLint("LongLogTag")
+public class DevicePresenceProcessor implements AssociationStore.OnChangeListener,
+        BluetoothDeviceProcessor.Callback, BleDeviceProcessor.Callback {
+    private static final String TAG = "CDM_DevicePresenceProcessor";
+
+    @NonNull
+    private final Context mContext;
+    @NonNull
+    private final CompanionAppBinder mCompanionAppBinder;
+    @NonNull
+    private final AssociationStore mAssociationStore;
+    @NonNull
+    private final ObservableUuidStore mObservableUuidStore;
+    @NonNull
+    private final BluetoothDeviceProcessor mBluetoothDeviceProcessor;
+    @NonNull
+    private final BleDeviceProcessor mBleDeviceProcessor;
+    @NonNull
+    private final PowerManagerInternal mPowerManagerInternal;
+    @NonNull
+    private final UserManager mUserManager;
+
+    // NOTE: Same association may appear in more than one of the following sets at the same time.
+    // (E.g. self-managed devices that have MAC addresses, could be reported as present by their
+    // companion applications, while at the same be connected via BT, or detected nearby by BLE
+    // scanner)
+    @NonNull
+    private final Set<Integer> mConnectedBtDevices = new HashSet<>();
+    @NonNull
+    private final Set<Integer> mNearbyBleDevices = new HashSet<>();
+    @NonNull
+    private final Set<Integer> mReportedSelfManagedDevices = new HashSet<>();
+    @NonNull
+    private final Set<ParcelUuid> mConnectedUuidDevices = new HashSet<>();
+    @NonNull
+    @GuardedBy("mBtDisconnectedDevices")
+    private final Set<Integer> mBtDisconnectedDevices = new HashSet<>();
+
+    // A map to track device presence within 10 seconds of Bluetooth disconnection.
+    // The key is the association ID, and the boolean value indicates if the device
+    // was detected again within that time frame.
+    @GuardedBy("mBtDisconnectedDevices")
+    private final @NonNull SparseBooleanArray mBtDisconnectedDevicesBlePresence =
+            new SparseBooleanArray();
+
+    // Tracking "simulated" presence. Used for debugging and testing only.
+    private final @NonNull Set<Integer> mSimulated = new HashSet<>();
+    private final SimulatedDevicePresenceSchedulerHelper mSchedulerHelper =
+            new SimulatedDevicePresenceSchedulerHelper();
+
+    private final BleDeviceDisappearedScheduler mBleDeviceDisappearedScheduler =
+            new BleDeviceDisappearedScheduler();
+
+    /**
+     * A structure hold the DevicePresenceEvents that are pending to be reported to the companion
+     * app when the user unlocks the local device per userId.
+     */
+    @GuardedBy("mPendingDevicePresenceEvents")
+    public final SparseArray<List<DevicePresenceEvent>> mPendingDevicePresenceEvents =
+            new SparseArray<>();
+
+    public DevicePresenceProcessor(@NonNull Context context,
+            @NonNull CompanionAppBinder companionAppBinder,
+            @NonNull UserManager userManager,
+            @NonNull AssociationStore associationStore,
+            @NonNull ObservableUuidStore observableUuidStore,
+            @NonNull PowerManagerInternal powerManagerInternal) {
+        mContext = context;
+        mCompanionAppBinder = companionAppBinder;
+        mAssociationStore = associationStore;
+        mObservableUuidStore = observableUuidStore;
+        mUserManager = userManager;
+        mBluetoothDeviceProcessor = new BluetoothDeviceProcessor(associationStore,
+                mObservableUuidStore, this);
+        mBleDeviceProcessor = new BleDeviceProcessor(associationStore, this);
+        mPowerManagerInternal = powerManagerInternal;
+    }
+
+    /** Initialize {@link DevicePresenceProcessor} */
+    public void init(Context context) {
+        BluetoothManager bm = (BluetoothManager) context.getSystemService(BLUETOOTH_SERVICE);
+        if (bm == null) {
+            Slog.w(TAG, "BluetoothManager is not available.");
+            return;
+        }
+        final BluetoothAdapter btAdapter = bm.getAdapter();
+        if (btAdapter == null) {
+            Slog.w(TAG, "BluetoothAdapter is NOT available.");
+            return;
+        }
+
+        mBluetoothDeviceProcessor.init(btAdapter);
+        mBleDeviceProcessor.init(context, btAdapter);
+
+        mAssociationStore.registerLocalListener(this);
+    }
+
+    /**
+     * Process device presence start request.
+     */
+    public void startObservingDevicePresence(ObservingDevicePresenceRequest request,
+            String packageName, int userId) {
+        Slog.i(TAG,
+                "Start observing request=[" + request + "] for userId=[" + userId + "], package=["
+                        + packageName + "]...");
+        final ParcelUuid requestUuid = request.getUuid();
+
+        if (requestUuid != null) {
+            enforceCallerCanObserveDevicePresenceByUuid(mContext);
+
+            // If it's already being observed, then no-op.
+            if (mObservableUuidStore.isUuidBeingObserved(requestUuid, userId, packageName)) {
+                Slog.i(TAG, "UUID=[" + requestUuid + "], package=[" + packageName + "], userId=["
+                        + userId + "] is already being observed.");
+                return;
+            }
+
+            final ObservableUuid observableUuid = new ObservableUuid(userId, requestUuid,
+                    packageName, System.currentTimeMillis());
+            mObservableUuidStore.writeObservableUuid(userId, observableUuid);
+        } else {
+            final int associationId = request.getAssociationId();
+            AssociationInfo association = mAssociationStore.getAssociationWithCallerChecks(
+                    associationId);
+
+            // If it's already being observed, then no-op.
+            if (association.isNotifyOnDeviceNearby()) {
+                Slog.i(TAG, "Associated device id=[" + association.getId()
+                        + "] is already being observed. No-op.");
+                return;
+            }
+
+            association = (new AssociationInfo.Builder(association)).setNotifyOnDeviceNearby(true)
+                    .build();
+            mAssociationStore.updateAssociation(association);
+
+            // Send callback immediately if the device is present.
+            if (isDevicePresent(associationId)) {
+                Slog.i(TAG, "Device is already present. Triggering callback.");
+                if (isBlePresent(associationId)) {
+                    onDevicePresenceEvent(mNearbyBleDevices, associationId, EVENT_BLE_APPEARED);
+                } else if (isBtConnected(associationId)) {
+                    onDevicePresenceEvent(mConnectedBtDevices, associationId, EVENT_BT_CONNECTED);
+                } else if (isSimulatePresent(associationId)) {
+                    onDevicePresenceEvent(mSimulated, associationId, EVENT_BLE_APPEARED);
+                }
+            }
+        }
+
+        Slog.i(TAG, "Registered device presence listener.");
+    }
+
+    /**
+     * Process device presence stop request.
+     */
+    public void stopObservingDevicePresence(ObservingDevicePresenceRequest request,
+            String packageName, int userId) {
+        Slog.i(TAG,
+                "Stop observing request=[" + request + "] for userId=[" + userId + "], package=["
+                        + packageName + "]...");
+
+        final ParcelUuid requestUuid = request.getUuid();
+
+        if (requestUuid != null) {
+            enforceCallerCanObserveDevicePresenceByUuid(mContext);
+
+            if (!mObservableUuidStore.isUuidBeingObserved(requestUuid, userId, packageName)) {
+                Slog.i(TAG, "UUID=[" + requestUuid + "], package=[" + packageName + "], userId=["
+                        + userId + "] is already not being observed.");
+                return;
+            }
+
+            mObservableUuidStore.removeObservableUuid(userId, requestUuid, packageName);
+            removeCurrentConnectedUuidDevice(requestUuid);
+        } else {
+            final int associationId = request.getAssociationId();
+            AssociationInfo association = mAssociationStore.getAssociationWithCallerChecks(
+                    associationId);
+
+            // If it's already being observed, then no-op.
+            if (!association.isNotifyOnDeviceNearby()) {
+                Slog.i(TAG, "Associated device id=[" + association.getId()
+                        + "] is already not being observed. No-op.");
+                return;
+            }
+
+            association = (new AssociationInfo.Builder(association)).setNotifyOnDeviceNearby(false)
+                    .build();
+            mAssociationStore.updateAssociation(association);
+        }
+
+        Slog.i(TAG, "Unregistered device presence listener.");
+
+        // If last listener is unregistered, then unbind application.
+        if (!shouldBindPackage(userId, packageName)) {
+            mCompanionAppBinder.unbindCompanionApp(userId, packageName);
+        }
+    }
+
+    /**
+     * For legacy device presence below Android V.
+     *
+     * @deprecated Use {@link #startObservingDevicePresence(ObservingDevicePresenceRequest, String,
+     * int)}
+     */
+    @Deprecated
+    public void startObservingDevicePresence(int userId, String packageName, String deviceAddress)
+            throws RemoteException {
+        Slog.i(TAG,
+                "Start observing device=[" + deviceAddress + "] for userId=[" + userId
+                        + "], package=["
+                        + packageName + "]...");
+
+        enforceCallerCanManageAssociationsForPackage(mContext, userId, packageName, null);
+
+        AssociationInfo association = mAssociationStore.getFirstAssociationByAddress(userId,
+                packageName, deviceAddress);
+
+        if (association == null) {
+            throw new RemoteException(new DeviceNotAssociatedException("App " + packageName
+                    + " is not associated with device " + deviceAddress
+                    + " for user " + userId));
+        }
+
+        startObservingDevicePresence(
+                new ObservingDevicePresenceRequest.Builder().setAssociationId(association.getId())
+                        .build(), packageName, userId);
+    }
+
+    /**
+     * For legacy device presence below Android V.
+     *
+     * @deprecated Use {@link #stopObservingDevicePresence(ObservingDevicePresenceRequest, String,
+     * int)}
+     */
+    @Deprecated
+    public void stopObservingDevicePresence(int userId, String packageName, String deviceAddress)
+            throws RemoteException {
+        Slog.i(TAG,
+                "Stop observing device=[" + deviceAddress + "] for userId=[" + userId
+                        + "], package=["
+                        + packageName + "]...");
+
+        enforceCallerCanManageAssociationsForPackage(mContext, userId, packageName, null);
+
+        AssociationInfo association = mAssociationStore.getFirstAssociationByAddress(userId,
+                packageName, deviceAddress);
+
+        if (association == null) {
+            throw new RemoteException(new DeviceNotAssociatedException("App " + packageName
+                    + " is not associated with device " + deviceAddress
+                    + " for user " + userId));
+        }
+
+        stopObservingDevicePresence(
+                new ObservingDevicePresenceRequest.Builder().setAssociationId(association.getId())
+                        .build(), packageName, userId);
+    }
+
+    /**
+     * @return whether the package should be bound (i.e. at least one of the devices associated with
+     * the package is currently present OR the UUID to be observed by this package is
+     * currently present).
+     */
+    private boolean shouldBindPackage(@UserIdInt int userId, @NonNull String packageName) {
+        final List<AssociationInfo> packageAssociations =
+                mAssociationStore.getActiveAssociationsByPackage(userId, packageName);
+        final List<ObservableUuid> observableUuids =
+                mObservableUuidStore.getObservableUuidsForPackage(userId, packageName);
+
+        for (AssociationInfo association : packageAssociations) {
+            if (!association.shouldBindWhenPresent()) continue;
+            if (isDevicePresent(association.getId())) return true;
+        }
+
+        for (ObservableUuid uuid : observableUuids) {
+            if (isDeviceUuidPresent(uuid.getUuid())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Bind the system to the app if it's not bound.
+     *
+     * Set bindImportant to true when the association is self-managed to avoid the target service
+     * being killed.
+     */
+    private void bindApplicationIfNeeded(int userId, String packageName, boolean bindImportant) {
+        if (!mCompanionAppBinder.isCompanionApplicationBound(userId, packageName)) {
+            mCompanionAppBinder.bindCompanionApp(
+                    userId, packageName, bindImportant, this::onBinderDied);
+        } else {
+            Slog.i(TAG,
+                    "UserId=[" + userId + "], packageName=[" + packageName + "] is already bound.");
+        }
+    }
+
+    /**
+     * @return current connected UUID devices.
+     */
+    public Set<ParcelUuid> getCurrentConnectedUuidDevices() {
+        return mConnectedUuidDevices;
+    }
+
+    /**
+     * Remove current connected UUID device.
+     */
+    public void removeCurrentConnectedUuidDevice(ParcelUuid uuid) {
+        mConnectedUuidDevices.remove(uuid);
+    }
+
+    /**
+     * @return whether the associated companion devices is present. I.e. device is nearby (for BLE);
+     * or devices is connected (for Bluetooth); or reported (by the application) to be
+     * nearby (for "self-managed" associations).
+     */
+    public boolean isDevicePresent(int associationId) {
+        return mReportedSelfManagedDevices.contains(associationId)
+                || mConnectedBtDevices.contains(associationId)
+                || mNearbyBleDevices.contains(associationId)
+                || mSimulated.contains(associationId);
+    }
+
+    /**
+     * @return whether the current uuid to be observed is present.
+     */
+    public boolean isDeviceUuidPresent(ParcelUuid uuid) {
+        return mConnectedUuidDevices.contains(uuid);
+    }
+
+    /**
+     * @return whether the current device is BT connected and had already reported to the app.
+     */
+
+    public boolean isBtConnected(int associationId) {
+        return mConnectedBtDevices.contains(associationId);
+    }
+
+    /**
+     * @return whether the current device in BLE range and had already reported to the app.
+     */
+    public boolean isBlePresent(int associationId) {
+        return mNearbyBleDevices.contains(associationId);
+    }
+
+    /**
+     * @return whether the current device had been already reported by the simulator.
+     */
+    public boolean isSimulatePresent(int associationId) {
+        return mSimulated.contains(associationId);
+    }
+
+    /**
+     * Marks a "self-managed" device as connected.
+     *
+     * <p>
+     * Must ONLY be invoked by the
+     * {@link com.android.server.companion.CompanionDeviceManagerService
+     * CompanionDeviceManagerService}
+     * when an application invokes
+     * {@link android.companion.CompanionDeviceManager#notifyDeviceAppeared(int)
+     * notifyDeviceAppeared()}
+     */
+    public void onSelfManagedDeviceConnected(int associationId) {
+        onDevicePresenceEvent(mReportedSelfManagedDevices,
+                associationId, EVENT_SELF_MANAGED_APPEARED);
+    }
+
+    /**
+     * Marks a "self-managed" device as disconnected.
+     *
+     * <p>
+     * Must ONLY be invoked by the
+     * {@link com.android.server.companion.CompanionDeviceManagerService
+     * CompanionDeviceManagerService}
+     * when an application invokes
+     * {@link android.companion.CompanionDeviceManager#notifyDeviceDisappeared(int)
+     * notifyDeviceDisappeared()}
+     */
+    public void onSelfManagedDeviceDisconnected(int associationId) {
+        onDevicePresenceEvent(mReportedSelfManagedDevices,
+                associationId, EVENT_SELF_MANAGED_DISAPPEARED);
+    }
+
+    /**
+     * Marks a "self-managed" device as disconnected when binderDied.
+     */
+    public void onSelfManagedDeviceReporterBinderDied(int associationId) {
+        onDevicePresenceEvent(mReportedSelfManagedDevices,
+                associationId, EVENT_SELF_MANAGED_DISAPPEARED);
+    }
+
+    @Override
+    public void onBluetoothCompanionDeviceConnected(int associationId, int userId) {
+        Slog.i(TAG, "onBluetoothCompanionDeviceConnected: "
+                + "associationId( " + associationId + " )");
+        if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
+            onDeviceLocked(associationId, userId, EVENT_BT_CONNECTED, /* ParcelUuid */ null);
+            return;
+        }
+
+        synchronized (mBtDisconnectedDevices) {
+            // A device is considered reconnected within 10 seconds if a pending BLE lost report is
+            // followed by a detected Bluetooth connection.
+            boolean isReconnected = mBtDisconnectedDevices.contains(associationId);
+            if (isReconnected) {
+                Slog.i(TAG, "Device ( " + associationId + " ) is reconnected within 10s.");
+                mBleDeviceDisappearedScheduler.unScheduleDeviceDisappeared(associationId);
+            }
+
+            Slog.i(TAG, "onBluetoothCompanionDeviceConnected: "
+                    + "associationId( " + associationId + " )");
+            onDevicePresenceEvent(mConnectedBtDevices, associationId, EVENT_BT_CONNECTED);
+
+            // Stop the BLE scan if all devices report BT connected status and BLE was present.
+            if (canStopBleScan()) {
+                mBleDeviceProcessor.stopScanIfNeeded();
+            }
+
+        }
+    }
+
+    @Override
+    public void onBluetoothCompanionDeviceDisconnected(int associationId, int userId) {
+        Slog.i(TAG, "onBluetoothCompanionDeviceDisconnected "
+                + "associationId( " + associationId + " )");
+
+        if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
+            onDeviceLocked(associationId, userId, EVENT_BT_DISCONNECTED, /* ParcelUuid */ null);
+            return;
+        }
+
+        // Start BLE scanning when the device is disconnected.
+        mBleDeviceProcessor.startScan();
+
+        onDevicePresenceEvent(mConnectedBtDevices, associationId, EVENT_BT_DISCONNECTED);
+        // If current device is BLE present but BT is disconnected , means it will be
+        // potentially out of range later. Schedule BLE disappeared callback.
+        if (isBlePresent(associationId)) {
+            synchronized (mBtDisconnectedDevices) {
+                mBtDisconnectedDevices.add(associationId);
+            }
+            mBleDeviceDisappearedScheduler.scheduleBleDeviceDisappeared(associationId);
+        }
+    }
+
+
+    @Override
+    public void onBleCompanionDeviceFound(int associationId, int userId) {
+        Slog.i(TAG, "onBleCompanionDeviceFound " + "associationId( " + associationId + " )");
+        if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
+            onDeviceLocked(associationId, userId, EVENT_BLE_APPEARED, /* ParcelUuid */ null);
+            return;
+        }
+
+        onDevicePresenceEvent(mNearbyBleDevices, associationId, EVENT_BLE_APPEARED);
+        synchronized (mBtDisconnectedDevices) {
+            final boolean isCurrentPresent = mBtDisconnectedDevicesBlePresence.get(associationId);
+            if (mBtDisconnectedDevices.contains(associationId) && isCurrentPresent) {
+                mBleDeviceDisappearedScheduler.unScheduleDeviceDisappeared(associationId);
+            }
+        }
+    }
+
+    @Override
+    public void onBleCompanionDeviceLost(int associationId, int userId) {
+        Slog.i(TAG, "onBleCompanionDeviceLost " + "associationId( " + associationId + " )");
+        if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
+            onDeviceLocked(associationId, userId, EVENT_BLE_APPEARED, /* ParcelUuid */ null);
+            return;
+        }
+
+        onDevicePresenceEvent(mNearbyBleDevices, associationId, EVENT_BLE_DISAPPEARED);
+    }
+
+    /** FOR DEBUGGING AND/OR TESTING PURPOSES ONLY. */
+    @TestApi
+    public void simulateDeviceEvent(int associationId, int event) {
+        // IMPORTANT: this API should only be invoked via the
+        // 'companiondevice simulate-device-appeared' Shell command, so the only uid-s allowed to
+        // make this call are SHELL and ROOT.
+        // No other caller (including SYSTEM!) should be allowed.
+        enforceCallerShellOrRoot();
+        // Make sure the association exists.
+        enforceAssociationExists(associationId);
+
+        final AssociationInfo associationInfo = mAssociationStore.getAssociationById(associationId);
+
+        switch (event) {
+            case EVENT_BLE_APPEARED:
+                simulateDeviceAppeared(associationId, event);
+                break;
+            case EVENT_BT_CONNECTED:
+                onBluetoothCompanionDeviceConnected(associationId, associationInfo.getUserId());
+                break;
+            case EVENT_BLE_DISAPPEARED:
+                simulateDeviceDisappeared(associationId, event);
+                break;
+            case EVENT_BT_DISCONNECTED:
+                onBluetoothCompanionDeviceDisconnected(associationId, associationInfo.getUserId());
+                break;
+            default:
+                throw new IllegalArgumentException("Event: " + event + "is not supported");
+        }
+    }
+
+    /** FOR DEBUGGING AND/OR TESTING PURPOSES ONLY. */
+    @TestApi
+    public void simulateDeviceEventByUuid(ObservableUuid uuid, int event) {
+        // IMPORTANT: this API should only be invoked via the
+        // 'companiondevice simulate-device-uuid-events' Shell command, so the only uid-s allowed to
+        // make this call are SHELL and ROOT.
+        // No other caller (including SYSTEM!) should be allowed.
+        enforceCallerShellOrRoot();
+        onDevicePresenceEventByUuid(uuid, event);
+    }
+
+    /** FOR DEBUGGING AND/OR TESTING PURPOSES ONLY. */
+    @TestApi
+    public void simulateDeviceEventOnDeviceLocked(
+            int associationId, int userId, int event, ParcelUuid uuid) {
+        // IMPORTANT: this API should only be invoked via the
+        // 'companiondevice simulate-device-event-device-locked' Shell command,
+        // so the only uid-s allowed to make this call are SHELL and ROOT.
+        // No other caller (including SYSTEM!) should be allowed.
+        enforceCallerShellOrRoot();
+        onDeviceLocked(associationId, userId, event, uuid);
+    }
+
+    /** FOR DEBUGGING AND/OR TESTING PURPOSES ONLY. */
+    @TestApi
+    public void simulateDeviceEventOnUserUnlocked(int userId) {
+        // IMPORTANT: this API should only be invoked via the
+        // 'companiondevice simulate-device-event-device-unlocked' Shell command,
+        // so the only uid-s allowed to make this call are SHELL and ROOT.
+        // No other caller (including SYSTEM!) should be allowed.
+        enforceCallerShellOrRoot();
+        sendDevicePresenceEventOnUnlocked(userId);
+    }
+
+    private void simulateDeviceAppeared(int associationId, int state) {
+        onDevicePresenceEvent(mSimulated, associationId, state);
+        mSchedulerHelper.scheduleOnDeviceGoneCallForSimulatedDevicePresence(associationId);
+    }
+
+    private void simulateDeviceDisappeared(int associationId, int state) {
+        mSchedulerHelper.unscheduleOnDeviceGoneCallForSimulatedDevicePresence(associationId);
+        onDevicePresenceEvent(mSimulated, associationId, state);
+    }
+
+    private void enforceAssociationExists(int associationId) {
+        if (mAssociationStore.getAssociationById(associationId) == null) {
+            throw new IllegalArgumentException(
+                    "Association with id " + associationId + " does not exist.");
+        }
+    }
+
+    private void onDevicePresenceEvent(@NonNull Set<Integer> presentDevicesForSource,
+            int associationId, int eventType) {
+        Slog.i(TAG,
+                "onDevicePresenceEvent() id=[" + associationId + "], event=[" + eventType + "]...");
+
+        AssociationInfo association = mAssociationStore.getAssociationById(associationId);
+        if (association == null) {
+            Slog.e(TAG, "Association doesn't exist.");
+            return;
+        }
+
+        final int userId = association.getUserId();
+        final String packageName = association.getPackageName();
+        final DevicePresenceEvent event = new DevicePresenceEvent(associationId, eventType, null);
+
+        if (eventType == EVENT_BLE_APPEARED) {
+            synchronized (mBtDisconnectedDevices) {
+                // If a BLE device is detected within 10 seconds after BT is disconnected,
+                // flag it as BLE is present.
+                if (mBtDisconnectedDevices.contains(associationId)) {
+                    Slog.i(TAG, "Device ( " + associationId + " ) is present,"
+                            + " do not need to send the callback with event ( "
+                            + EVENT_BLE_APPEARED + " ).");
+                    mBtDisconnectedDevicesBlePresence.append(associationId, true);
+                }
+            }
+        }
+
+        switch (eventType) {
+            case EVENT_BLE_APPEARED:
+            case EVENT_BT_CONNECTED:
+            case EVENT_SELF_MANAGED_APPEARED:
+                final boolean added = presentDevicesForSource.add(associationId);
+                if (!added) {
+                    Slog.w(TAG, "The association is already present.");
+                }
+
+                if (association.shouldBindWhenPresent()) {
+                    bindApplicationIfNeeded(userId, packageName, association.isSelfManaged());
+                } else {
+                    return;
+                }
+
+                if (association.isSelfManaged() || added) {
+                    notifyDevicePresenceEvent(userId, packageName, event);
+                    // Also send the legacy callback.
+                    legacyNotifyDevicePresenceEvent(association, true);
+                }
+                break;
+            case EVENT_BLE_DISAPPEARED:
+            case EVENT_BT_DISCONNECTED:
+            case EVENT_SELF_MANAGED_DISAPPEARED:
+                final boolean removed = presentDevicesForSource.remove(associationId);
+                if (!removed) {
+                    Slog.w(TAG, "The association is already NOT present.");
+                }
+
+                if (!mCompanionAppBinder.isCompanionApplicationBound(userId, packageName)) {
+                    Slog.e(TAG, "Package is not bound");
+                    return;
+                }
+
+                if (association.isSelfManaged() || removed) {
+                    notifyDevicePresenceEvent(userId, packageName, event);
+                    // Also send the legacy callback.
+                    legacyNotifyDevicePresenceEvent(association, false);
+                }
+
+                // Check if there are other devices associated to the app that are present.
+                if (!shouldBindPackage(userId, packageName)) {
+                    mCompanionAppBinder.unbindCompanionApp(userId, packageName);
+                }
+                break;
+            default:
+                Slog.e(TAG, "Event: " + eventType + " is not supported.");
+                break;
+        }
+    }
+
+    @Override
+    public void onDevicePresenceEventByUuid(ObservableUuid uuid, int eventType) {
+        Slog.i(TAG, "onDevicePresenceEventByUuid ObservableUuid=[" + uuid + "], event=[" + eventType
+                + "]...");
+
+        final ParcelUuid parcelUuid = uuid.getUuid();
+        final int userId = uuid.getUserId();
+        if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
+            onDeviceLocked(NO_ASSOCIATION, userId, eventType, parcelUuid);
+            return;
+        }
+
+        final String packageName = uuid.getPackageName();
+        final DevicePresenceEvent event = new DevicePresenceEvent(NO_ASSOCIATION, eventType,
+                parcelUuid);
+
+        switch (eventType) {
+            case EVENT_BT_CONNECTED:
+                boolean added = mConnectedUuidDevices.add(parcelUuid);
+                if (!added) {
+                    Slog.w(TAG, "This device is already connected.");
+                }
+
+                bindApplicationIfNeeded(userId, packageName, false);
+
+                notifyDevicePresenceEvent(userId, packageName, event);
+                break;
+            case EVENT_BT_DISCONNECTED:
+                final boolean removed = mConnectedUuidDevices.remove(parcelUuid);
+                if (!removed) {
+                    Slog.w(TAG, "This device is already disconnected.");
+                    return;
+                }
+
+                if (!mCompanionAppBinder.isCompanionApplicationBound(userId, packageName)) {
+                    Slog.e(TAG, "Package is not bound.");
+                    return;
+                }
+
+                notifyDevicePresenceEvent(userId, packageName, event);
+
+                if (!shouldBindPackage(userId, packageName)) {
+                    mCompanionAppBinder.unbindCompanionApp(userId, packageName);
+                }
+                break;
+            default:
+                Slog.e(TAG, "Event: " + eventType + " is not supported");
+                break;
+        }
+    }
+
+    /**
+     * Notify device presence event to the app.
+     *
+     * @deprecated Use {@link #notifyDevicePresenceEvent(int, String, DevicePresenceEvent)} instead.
+     */
+    @Deprecated
+    private void legacyNotifyDevicePresenceEvent(AssociationInfo association,
+            boolean isAppeared) {
+        Slog.i(TAG, "legacyNotifyDevicePresenceEvent() association=[" + association.toShortString()
+                + "], isAppeared=[" + isAppeared + "]");
+
+        final int userId = association.getUserId();
+        final String packageName = association.getPackageName();
+
+        final CompanionServiceConnector primaryServiceConnector =
+                mCompanionAppBinder.getPrimaryServiceConnector(userId, packageName);
+        if (primaryServiceConnector == null) {
+            Slog.e(TAG, "Package is not bound.");
+            return;
+        }
+
+        if (isAppeared) {
+            primaryServiceConnector.postOnDeviceAppeared(association);
+        } else {
+            primaryServiceConnector.postOnDeviceDisappeared(association);
+        }
+    }
+
+    /**
+     * Notify the device presence event to the app.
+     */
+    private void notifyDevicePresenceEvent(int userId, String packageName,
+            DevicePresenceEvent event) {
+        Slog.i(TAG,
+                "notifyCompanionDevicePresenceEvent userId=[" + userId + "], packageName=["
+                        + packageName + "], event=[" + event + "]...");
+
+        final CompanionServiceConnector primaryServiceConnector =
+                mCompanionAppBinder.getPrimaryServiceConnector(userId, packageName);
+
+        if (primaryServiceConnector == null) {
+            Slog.e(TAG, "Package is NOT bound.");
+            return;
+        }
+
+        primaryServiceConnector.postOnDevicePresenceEvent(event);
+    }
+
+    /**
+     * Notify the self-managed device presence event to the app.
+     */
+    public void notifySelfManagedDevicePresenceEvent(int associationId, boolean isAppeared) {
+        Slog.i(TAG, "notifySelfManagedDeviceAppeared() id=" + associationId);
+
+        AssociationInfo association = mAssociationStore.getAssociationWithCallerChecks(
+                associationId);
+        if (!association.isSelfManaged()) {
+            throw new IllegalArgumentException("Association id=[" + associationId
+                    + "] is not self-managed.");
+        }
+        // AssociationInfo class is immutable: create a new AssociationInfo object with updated
+        // timestamp.
+        association = (new AssociationInfo.Builder(association))
+                .setLastTimeConnected(System.currentTimeMillis())
+                .build();
+        mAssociationStore.updateAssociation(association);
+
+        if (isAppeared) {
+            onSelfManagedDeviceConnected(associationId);
+        } else {
+            onSelfManagedDeviceDisconnected(associationId);
+        }
+
+        final String deviceProfile = association.getDeviceProfile();
+        if (DEVICE_PROFILE_AUTOMOTIVE_PROJECTION.equals(deviceProfile)) {
+            Slog.i(TAG, "Enable hint mode for device device profile: " + deviceProfile);
+            mPowerManagerInternal.setPowerMode(Mode.AUTOMOTIVE_PROJECTION, isAppeared);
+        }
+    }
+
+    private void onBinderDied(@UserIdInt int userId, @NonNull String packageName,
+            @NonNull CompanionServiceConnector serviceConnector) {
+
+        boolean isPrimary = serviceConnector.isPrimary();
+        Slog.i(TAG, "onBinderDied() u" + userId + "/" + packageName + " isPrimary: " + isPrimary);
+
+        // First, disable hint mode for Auto profile and mark not BOUND for primary service ONLY.
+        if (isPrimary) {
+            final List<AssociationInfo> associations =
+                    mAssociationStore.getActiveAssociationsByPackage(userId, packageName);
+
+            for (AssociationInfo association : associations) {
+                final String deviceProfile = association.getDeviceProfile();
+                if (DEVICE_PROFILE_AUTOMOTIVE_PROJECTION.equals(deviceProfile)) {
+                    Slog.i(TAG, "Disable hint mode for device profile: " + deviceProfile);
+                    mPowerManagerInternal.setPowerMode(Mode.AUTOMOTIVE_PROJECTION, false);
+                    break;
+                }
+            }
+
+            mCompanionAppBinder.removePackage(userId, packageName);
+        }
+
+        // Second: schedule rebinding if needed.
+        final boolean shouldScheduleRebind = shouldScheduleRebind(userId, packageName, isPrimary);
+
+        if (shouldScheduleRebind) {
+            mCompanionAppBinder.scheduleRebinding(userId, packageName, serviceConnector);
+        }
+    }
+
+    /**
+     * Check if the system should rebind the self-managed secondary services
+     * OR non-self-managed services.
+     */
+    private boolean shouldScheduleRebind(int userId, String packageName, boolean isPrimary) {
+        // Make sure do not schedule rebind for the case ServiceConnector still gets callback after
+        // app is uninstalled.
+        boolean stillAssociated = false;
+        // Make sure to clean up the state for all the associations
+        // that associate with this package.
+        boolean shouldScheduleRebind = false;
+        boolean shouldScheduleRebindForUuid = false;
+        final List<ObservableUuid> uuids =
+                mObservableUuidStore.getObservableUuidsForPackage(userId, packageName);
+
+        for (AssociationInfo ai :
+                mAssociationStore.getActiveAssociationsByPackage(userId, packageName)) {
+            final int associationId = ai.getId();
+            stillAssociated = true;
+            if (ai.isSelfManaged()) {
+                // Do not rebind if primary one is died for selfManaged application.
+                if (isPrimary && isDevicePresent(associationId)) {
+                    onSelfManagedDeviceReporterBinderDied(associationId);
+                    shouldScheduleRebind = false;
+                }
+                // Do not rebind if both primary and secondary services are died for
+                // selfManaged application.
+                shouldScheduleRebind = mCompanionAppBinder.isCompanionApplicationBound(userId,
+                        packageName);
+            } else if (ai.isNotifyOnDeviceNearby()) {
+                // Always rebind for non-selfManaged devices.
+                shouldScheduleRebind = true;
+            }
+        }
+
+        for (ObservableUuid uuid : uuids) {
+            if (isDeviceUuidPresent(uuid.getUuid())) {
+                shouldScheduleRebindForUuid = true;
+                break;
+            }
+        }
+
+        return (stillAssociated && shouldScheduleRebind) || shouldScheduleRebindForUuid;
+    }
+
+    /**
+     * Implements
+     * {@link AssociationStore.OnChangeListener#onAssociationRemoved(AssociationInfo)}
+     */
+    @Override
+    public void onAssociationRemoved(@NonNull AssociationInfo association) {
+        final int id = association.getId();
+
+        mConnectedBtDevices.remove(id);
+        mNearbyBleDevices.remove(id);
+        mReportedSelfManagedDevices.remove(id);
+        mSimulated.remove(id);
+        synchronized (mBtDisconnectedDevices) {
+            mBtDisconnectedDevices.remove(id);
+            mBtDisconnectedDevicesBlePresence.delete(id);
+        }
+
+        // Do NOT call mCallback.onDeviceDisappeared()!
+        // CompanionDeviceManagerService will know that the association is removed, and will do
+        // what's needed.
+    }
+
+
+    private static void enforceCallerShellOrRoot() {
+        final int callingUid = Binder.getCallingUid();
+        if (callingUid == SHELL_UID || callingUid == ROOT_UID) return;
+
+        throw new SecurityException("Caller is neither Shell nor Root");
+    }
+
+    /**
+     * The BLE scan can be only stopped if all the devices have been reported
+     * BT connected and BLE presence and are not pending to report BLE lost.
+     */
+    private boolean canStopBleScan() {
+        for (AssociationInfo ai : mAssociationStore.getActiveAssociations()) {
+            int id = ai.getId();
+            synchronized (mBtDisconnectedDevices) {
+                if (ai.isNotifyOnDeviceNearby() && !(isBtConnected(id)
+                        && isBlePresent(id) && mBtDisconnectedDevices.isEmpty())) {
+                    Slog.i(TAG, "The BLE scan cannot be stopped, "
+                            + "device( " + id + " ) is not yet connected "
+                            + "OR the BLE is not current present Or is pending to report BLE lost");
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Store the positive DevicePresenceEvent in the cache if the current device is still
+     * locked.
+     * Remove the current DevicePresenceEvent if there's a negative event occurs.
+     */
+    private void onDeviceLocked(int associationId, int userId, int event, ParcelUuid uuid) {
+        switch (event) {
+            case EVENT_BLE_APPEARED, EVENT_BT_CONNECTED -> {
+                // Try to bind and notify the app after the phone is unlocked.
+                Slog.i(TAG, "Current user is not in unlocking or unlocked stage yet. "
+                        + "Notify the application when the phone is unlocked");
+                synchronized (mPendingDevicePresenceEvents) {
+                    final DevicePresenceEvent devicePresenceEvent = new DevicePresenceEvent(
+                            associationId, event, uuid);
+                    List<DevicePresenceEvent> deviceEvents = mPendingDevicePresenceEvents.get(
+                            userId, new ArrayList<>());
+                    deviceEvents.add(devicePresenceEvent);
+                    mPendingDevicePresenceEvents.put(userId, deviceEvents);
+                }
+            }
+            case EVENT_BLE_DISAPPEARED -> {
+                synchronized (mPendingDevicePresenceEvents) {
+                    List<DevicePresenceEvent> deviceEvents = mPendingDevicePresenceEvents
+                            .get(userId);
+                    if (deviceEvents != null) {
+                        deviceEvents.removeIf(deviceEvent ->
+                                deviceEvent.getEvent() == EVENT_BLE_APPEARED
+                                        && Objects.equals(deviceEvent.getUuid(), uuid)
+                                        && deviceEvent.getAssociationId() == associationId);
+                    }
+                }
+            }
+            case EVENT_BT_DISCONNECTED -> {
+                // Do not need to report the event since the user is not unlock the
+                // phone so that cdm is not bind with the app yet.
+                synchronized (mPendingDevicePresenceEvents) {
+                    List<DevicePresenceEvent> deviceEvents = mPendingDevicePresenceEvents
+                            .get(userId);
+                    if (deviceEvents != null) {
+                        deviceEvents.removeIf(deviceEvent ->
+                                deviceEvent.getEvent() == EVENT_BT_CONNECTED
+                                        && Objects.equals(deviceEvent.getUuid(), uuid)
+                                        && deviceEvent.getAssociationId() == associationId);
+                    }
+                }
+            }
+            default -> Slog.e(TAG, "Event: " + event + "is not supported");
+        }
+    }
+
+    /**
+     * Send the device presence event by userID when the device is unlocked.
+     */
+    public void sendDevicePresenceEventOnUnlocked(int userId) {
+        final List<DevicePresenceEvent> deviceEvents = getPendingDevicePresenceEventsByUserId(
+                userId);
+        final List<ObservableUuid> observableUuids =
+                mObservableUuidStore.getObservableUuidsForUser(userId);
+        // Notify and bind the app after the phone is unlocked.
+        for (DevicePresenceEvent deviceEvent : deviceEvents) {
+            boolean isUuid = deviceEvent.getUuid() != null;
+            if (isUuid) {
+                for (ObservableUuid uuid : observableUuids) {
+                    if (uuid.getUuid().equals(deviceEvent.getUuid())) {
+                        onDevicePresenceEventByUuid(uuid, EVENT_BT_CONNECTED);
+                    }
+                }
+            } else {
+                int event = deviceEvent.getEvent();
+                int associationId = deviceEvent.getAssociationId();
+                final AssociationInfo associationInfo = mAssociationStore.getAssociationById(
+                        associationId);
+
+                if (associationInfo == null) {
+                    return;
+                }
+
+                switch (event) {
+                    case EVENT_BLE_APPEARED:
+                        onBleCompanionDeviceFound(
+                                associationInfo.getId(), associationInfo.getUserId());
+                        break;
+                    case EVENT_BT_CONNECTED:
+                        onBluetoothCompanionDeviceConnected(
+                                associationInfo.getId(), associationInfo.getUserId());
+                        break;
+                    default:
+                        Slog.e(TAG, "Event: " + event + "is not supported");
+                        break;
+                }
+            }
+        }
+
+        clearPendingDevicePresenceEventsByUserId(userId);
+    }
+
+    private List<DevicePresenceEvent> getPendingDevicePresenceEventsByUserId(int userId) {
+        synchronized (mPendingDevicePresenceEvents) {
+            return mPendingDevicePresenceEvents.get(userId, new ArrayList<>());
+        }
+    }
+
+    private void clearPendingDevicePresenceEventsByUserId(int userId) {
+        synchronized (mPendingDevicePresenceEvents) {
+            mPendingDevicePresenceEvents.get(userId).clear();
+        }
+    }
+
+    /**
+     * Dumps system information about devices that are marked as "present".
+     */
+    public void dump(@NonNull PrintWriter out) {
+        out.append("Companion Device Present: ");
+        if (mConnectedBtDevices.isEmpty()
+                && mNearbyBleDevices.isEmpty()
+                && mReportedSelfManagedDevices.isEmpty()) {
+            out.append("<empty>\n");
+            return;
+        } else {
+            out.append("\n");
+        }
+
+        out.append("  Connected Bluetooth Devices: ");
+        if (mConnectedBtDevices.isEmpty()) {
+            out.append("<empty>\n");
+        } else {
+            out.append("\n");
+            for (int associationId : mConnectedBtDevices) {
+                AssociationInfo a = mAssociationStore.getAssociationById(associationId);
+                out.append("    ").append(a.toShortString()).append('\n');
+            }
+        }
+
+        out.append("  Nearby BLE Devices: ");
+        if (mNearbyBleDevices.isEmpty()) {
+            out.append("<empty>\n");
+        } else {
+            out.append("\n");
+            for (int associationId : mNearbyBleDevices) {
+                AssociationInfo a = mAssociationStore.getAssociationById(associationId);
+                out.append("    ").append(a.toShortString()).append('\n');
+            }
+        }
+
+        out.append("  Self-Reported Devices: ");
+        if (mReportedSelfManagedDevices.isEmpty()) {
+            out.append("<empty>\n");
+        } else {
+            out.append("\n");
+            for (int associationId : mReportedSelfManagedDevices) {
+                AssociationInfo a = mAssociationStore.getAssociationById(associationId);
+                out.append("    ").append(a.toShortString()).append('\n');
+            }
+        }
+    }
+
+    private class SimulatedDevicePresenceSchedulerHelper extends Handler {
+        SimulatedDevicePresenceSchedulerHelper() {
+            super(Looper.getMainLooper());
+        }
+
+        void scheduleOnDeviceGoneCallForSimulatedDevicePresence(int associationId) {
+            // First, unschedule if it was scheduled previously.
+            if (hasMessages(/* what */ associationId)) {
+                removeMessages(/* what */ associationId);
+            }
+
+            sendEmptyMessageDelayed(/* what */ associationId, 60 * 1000 /* 60 seconds */);
+        }
+
+        void unscheduleOnDeviceGoneCallForSimulatedDevicePresence(int associationId) {
+            removeMessages(/* what */ associationId);
+        }
+
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            final int associationId = msg.what;
+            if (mSimulated.contains(associationId)) {
+                onDevicePresenceEvent(mSimulated, associationId, EVENT_BLE_DISAPPEARED);
+            }
+        }
+    }
+
+    private class BleDeviceDisappearedScheduler extends Handler {
+        BleDeviceDisappearedScheduler() {
+            super(Looper.getMainLooper());
+        }
+
+        void scheduleBleDeviceDisappeared(int associationId) {
+            if (hasMessages(associationId)) {
+                removeMessages(associationId);
+            }
+            Slog.i(TAG, "scheduleBleDeviceDisappeared for Device: ( " + associationId + " ).");
+            sendEmptyMessageDelayed(associationId, 10 * 1000 /* 10 seconds */);
+        }
+
+        void unScheduleDeviceDisappeared(int associationId) {
+            if (hasMessages(associationId)) {
+                Slog.i(TAG, "unScheduleDeviceDisappeared for Device( " + associationId + " )");
+                synchronized (mBtDisconnectedDevices) {
+                    mBtDisconnectedDevices.remove(associationId);
+                    mBtDisconnectedDevicesBlePresence.delete(associationId);
+                }
+
+                removeMessages(associationId);
+            }
+        }
+
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            final int associationId = msg.what;
+            synchronized (mBtDisconnectedDevices) {
+                final boolean isCurrentPresent = mBtDisconnectedDevicesBlePresence.get(
+                        associationId);
+                // If a device hasn't reported after 10 seconds and is not currently present,
+                // assume BLE is lost and trigger the onDeviceEvent callback with the
+                // EVENT_BLE_DISAPPEARED event.
+                if (mBtDisconnectedDevices.contains(associationId)
+                        && !isCurrentPresent) {
+                    Slog.i(TAG, "Device ( " + associationId + " ) is likely BLE out of range, "
+                            + "sending callback with event ( " + EVENT_BLE_DISAPPEARED + " )");
+                    onDevicePresenceEvent(mNearbyBleDevices, associationId, EVENT_BLE_DISAPPEARED);
+                }
+
+                mBtDisconnectedDevices.remove(associationId);
+                mBtDisconnectedDevicesBlePresence.delete(associationId);
+            }
+        }
+    }
+}
diff --git a/services/companion/java/com/android/server/companion/devicepresence/ObservableUuid.java b/services/companion/java/com/android/server/companion/devicepresence/ObservableUuid.java
new file mode 100644
index 0000000..c9f60ca
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/devicepresence/ObservableUuid.java
@@ -0,0 +1,54 @@
+/*
+ * 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.companion.devicepresence;
+
+import android.annotation.NonNull;
+import android.annotation.UserIdInt;
+import android.os.ParcelUuid;
+
+public class ObservableUuid {
+    private final int mUserId;
+    private final String mPackageName;
+
+    private final ParcelUuid mUuid;
+
+    private final long mTimeApprovedMs;
+
+    public ObservableUuid(@UserIdInt int userId, @NonNull ParcelUuid uuid,
+            @NonNull String packageName, Long timeApprovedMs) {
+        mUserId = userId;
+        mUuid = uuid;
+        mPackageName = packageName;
+        mTimeApprovedMs = timeApprovedMs;
+    }
+
+    public int getUserId() {
+        return mUserId;
+    }
+
+    public ParcelUuid getUuid() {
+        return mUuid;
+    }
+
+    public String getPackageName() {
+        return mPackageName;
+    }
+
+    public long getTimeApprovedMs() {
+        return mTimeApprovedMs;
+    }
+}
diff --git a/services/companion/java/com/android/server/companion/devicepresence/ObservableUuidStore.java b/services/companion/java/com/android/server/companion/devicepresence/ObservableUuidStore.java
new file mode 100644
index 0000000..4678a16
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/devicepresence/ObservableUuidStore.java
@@ -0,0 +1,317 @@
+/*
+ * 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.companion.devicepresence;
+
+import static com.android.internal.util.XmlUtils.readIntAttribute;
+import static com.android.internal.util.XmlUtils.readLongAttribute;
+import static com.android.internal.util.XmlUtils.readStringAttribute;
+import static com.android.internal.util.XmlUtils.writeIntAttribute;
+import static com.android.internal.util.XmlUtils.writeLongAttribute;
+import static com.android.internal.util.XmlUtils.writeStringAttribute;
+import static com.android.server.companion.utils.DataStoreUtils.createStorageFileForUser;
+import static com.android.server.companion.utils.DataStoreUtils.isEndOfTag;
+import static com.android.server.companion.utils.DataStoreUtils.isStartOfTag;
+import static com.android.server.companion.utils.DataStoreUtils.writeToFileSafely;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.os.ParcelUuid;
+import android.util.AtomicFile;
+import android.util.Slog;
+import android.util.SparseArray;
+import android.util.Xml;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.XmlUtils;
+import com.android.modules.utils.TypedXmlPullParser;
+import com.android.modules.utils.TypedXmlSerializer;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * This store manages the cache and disk data for observable uuids.
+ */
+public class ObservableUuidStore {
+    private static final String TAG = "CDM_ObservableUuidStore";
+    private static final String FILE_NAME = "observing_uuids_presence.xml";
+    private static final String XML_TAG_UUIDS = "uuids";
+    private static final String XML_TAG_UUID = "uuid";
+    private static final String XML_ATTR_UUID = "uuid";
+    private static final String XML_ATTR_TIME_APPROVED = "time_approved";
+    private static final String XML_ATTR_USER_ID = "user_id";
+    private static final String XML_ATTR_PACKAGE = "package_name";
+    private static final int READ_FROM_DISK_TIMEOUT = 5; // in seconds
+
+
+    private final ExecutorService mExecutor;
+    private final ConcurrentMap<Integer, AtomicFile> mUserIdToStorageFile =
+            new ConcurrentHashMap<>();
+
+    private final Object mLock = new Object();
+
+    @GuardedBy("mLock")
+    private final SparseArray<List<ObservableUuid>> mCachedPerUser =
+            new SparseArray<>();
+
+    public ObservableUuidStore() {
+        mExecutor = Executors.newSingleThreadExecutor();
+    }
+
+    /**
+     * Remove the observable uuid.
+     */
+    public void removeObservableUuid(@UserIdInt int userId, ParcelUuid uuid, String packageName) {
+        Slog.i(TAG, "Removing uuid=[" + uuid.getUuid() + "] from store...");
+
+        List<ObservableUuid> cachedObservableUuids;
+
+        synchronized (mLock) {
+            // Remove requests from cache
+            cachedObservableUuids = readObservableUuidsFromCache(userId);
+            cachedObservableUuids.removeIf(
+                    uuid1 -> uuid1.getPackageName().equals(packageName)
+                            && uuid1.getUuid().equals(uuid));
+            mCachedPerUser.set(userId, cachedObservableUuids);
+        }
+        // Remove requests from store
+        mExecutor.execute(() -> writeObservableUuidToStore(userId, cachedObservableUuids));
+    }
+
+    /**
+     * Write the observable uuid.
+     */
+    public void writeObservableUuid(@UserIdInt int userId, ObservableUuid uuid) {
+        Slog.i(TAG, "Writing uuid=[" + uuid.getUuid() + "] to store...");
+
+        List<ObservableUuid> cachedObservableUuids;
+        synchronized (mLock) {
+            // Write to cache
+            cachedObservableUuids = readObservableUuidsFromCache(userId);
+            cachedObservableUuids.removeIf(uuid1 -> uuid1.getUuid().equals(
+                    uuid.getUuid()) && uuid1.getPackageName().equals(uuid.getPackageName()));
+            cachedObservableUuids.add(uuid);
+            mCachedPerUser.set(userId, cachedObservableUuids);
+        }
+        // Write to store
+        mExecutor.execute(() -> writeObservableUuidToStore(userId, cachedObservableUuids));
+    }
+
+    private void writeObservableUuidToStore(@UserIdInt int userId,
+            @NonNull List<ObservableUuid> cachedObservableUuids) {
+        final AtomicFile file = getStorageFileForUser(userId);
+        Slog.i(TAG, "Writing ObservableUuid for user " + userId + " to file="
+                + file.getBaseFile().getPath());
+
+        // getStorageFileForUser() ALWAYS returns the SAME OBJECT, which allows us to synchronize
+        // accesses to the file on the file system using this AtomicFile object.
+        synchronized (file) {
+            writeToFileSafely(file, out -> {
+                final TypedXmlSerializer serializer = Xml.resolveSerializer(out);
+                serializer.setFeature(
+                        "http://xmlpull.org/v1/doc/features.html#indent-output", true);
+                serializer.startDocument(null, true);
+                writeObservableUuidToXml(serializer, cachedObservableUuids);
+                serializer.endDocument();
+            });
+        }
+    }
+
+    private void writeObservableUuidToXml(@NonNull TypedXmlSerializer serializer,
+            @Nullable Collection<ObservableUuid> uuids) throws IOException {
+        serializer.startTag(null, XML_TAG_UUIDS);
+
+        for (ObservableUuid uuid : uuids) {
+            writeUuidToXml(serializer, uuid);
+        }
+
+        serializer.endTag(null, XML_TAG_UUIDS);
+    }
+
+    private void writeUuidToXml(@NonNull TypedXmlSerializer serializer,
+            @NonNull ObservableUuid uuid) throws IOException {
+        serializer.startTag(null, XML_TAG_UUID);
+
+        writeIntAttribute(serializer, XML_ATTR_USER_ID, uuid.getUserId());
+        writeStringAttribute(serializer, XML_ATTR_UUID, uuid.getUuid().toString());
+        writeStringAttribute(serializer, XML_ATTR_PACKAGE, uuid.getPackageName());
+        writeLongAttribute(serializer, XML_ATTR_TIME_APPROVED, uuid.getTimeApprovedMs());
+
+        serializer.endTag(null, XML_TAG_UUID);
+    }
+
+    /**
+     * Read the observable UUIDs from the cache.
+     */
+    @GuardedBy("mLock")
+    private List<ObservableUuid> readObservableUuidsFromCache(@UserIdInt int userId) {
+        List<ObservableUuid> cachedObservableUuids = mCachedPerUser.get(userId);
+        if (cachedObservableUuids == null) {
+            Future<List<ObservableUuid>> future =
+                    mExecutor.submit(() -> readObservableUuidFromStore(userId));
+            try {
+                cachedObservableUuids = future.get(READ_FROM_DISK_TIMEOUT, TimeUnit.SECONDS);
+            } catch (InterruptedException e) {
+                Slog.e(TAG, "Thread reading ObservableUuid from disk is "
+                        + "interrupted.");
+            } catch (ExecutionException e) {
+                Slog.e(TAG, "Error occurred while reading ObservableUuid "
+                        + "from disk.");
+            } catch (TimeoutException e) {
+                Slog.e(TAG, "Reading ObservableUuid from disk timed out.");
+            }
+            mCachedPerUser.set(userId, cachedObservableUuids);
+        }
+        return cachedObservableUuids;
+    }
+
+    /**
+     * Reads previously persisted data for the given user
+     *
+     * @param userId Android UserID
+     * @return a list of ObservableUuid
+     */
+    @NonNull
+    public List<ObservableUuid> readObservableUuidFromStore(@UserIdInt int userId) {
+        final AtomicFile file = getStorageFileForUser(userId);
+        Slog.i(TAG, "Reading ObservableUuid for user " + userId + " from "
+                + "file=" + file.getBaseFile().getPath());
+
+        // getStorageFileForUser() ALWAYS returns the SAME OBJECT, which allows us to synchronize
+        // accesses to the file on the file system using this AtomicFile object.
+        synchronized (file) {
+            if (!file.getBaseFile().exists()) {
+                Slog.d(TAG, "File does not exist -> Abort");
+                return new ArrayList<>();
+            }
+            try (FileInputStream in = file.openRead()) {
+                final TypedXmlPullParser parser = Xml.resolvePullParser(in);
+                XmlUtils.beginDocument(parser, XML_TAG_UUIDS);
+
+                return readObservableUuidFromXml(parser);
+            } catch (XmlPullParserException | IOException e) {
+                Slog.e(TAG, "Error while reading requests file", e);
+                return new ArrayList<>();
+            }
+        }
+    }
+
+    @NonNull
+    private List<ObservableUuid> readObservableUuidFromXml(
+            @NonNull TypedXmlPullParser parser) throws XmlPullParserException, IOException {
+        if (!isStartOfTag(parser, XML_TAG_UUIDS)) {
+            throw new XmlPullParserException("The XML doesn't have start tag: " + XML_TAG_UUIDS);
+        }
+
+        List<ObservableUuid> observableUuids = new ArrayList<>();
+
+        while (true) {
+            parser.nextTag();
+            if (isEndOfTag(parser, XML_TAG_UUIDS)) {
+                break;
+            }
+            if (isStartOfTag(parser, XML_TAG_UUID)) {
+                observableUuids.add(readUuidFromXml(parser));
+            }
+        }
+
+        return observableUuids;
+    }
+
+    private ObservableUuid readUuidFromXml(@NonNull TypedXmlPullParser parser)
+            throws XmlPullParserException, IOException {
+        if (!isStartOfTag(parser, XML_TAG_UUID)) {
+            throw new XmlPullParserException("XML doesn't have start tag: " + XML_TAG_UUID);
+        }
+
+        final int userId = readIntAttribute(parser, XML_ATTR_USER_ID);
+        final ParcelUuid uuid = ParcelUuid.fromString(readStringAttribute(parser, XML_ATTR_UUID));
+        final String packageName = readStringAttribute(parser, XML_ATTR_PACKAGE);
+        final Long timeApproved = readLongAttribute(parser, XML_ATTR_TIME_APPROVED);
+
+        return new ObservableUuid(userId, uuid, packageName, timeApproved);
+    }
+
+    /**
+     * Creates and caches {@link AtomicFile} object that represents the back-up file for the given
+     * user.
+     * <p>
+     * IMPORTANT: the method will ALWAYS return the same {@link AtomicFile} object, which makes it
+     * possible to synchronize reads and writes to the file using the returned object.
+     */
+    @NonNull
+    private AtomicFile getStorageFileForUser(@UserIdInt int userId) {
+        return mUserIdToStorageFile.computeIfAbsent(userId,
+                u -> createStorageFileForUser(userId, FILE_NAME));
+    }
+
+    /**
+     * @return A list of ObservableUuids per package.
+     */
+    public List<ObservableUuid> getObservableUuidsForPackage(
+            @UserIdInt int userId, @NonNull String packageName) {
+        final List<ObservableUuid> uuidsTobeObservedPerPackage = new ArrayList<>();
+        synchronized (mLock) {
+            final List<ObservableUuid> uuids = readObservableUuidsFromCache(userId);
+
+            for (ObservableUuid uuid : uuids) {
+                if (uuid.getPackageName().equals(packageName)) {
+                    uuidsTobeObservedPerPackage.add(uuid);
+                }
+            }
+        }
+
+        return uuidsTobeObservedPerPackage;
+    }
+
+    /**
+     * @return A list of ObservableUuids per user.
+     */
+    public List<ObservableUuid> getObservableUuidsForUser(@UserIdInt int userId) {
+        synchronized (mLock) {
+            return readObservableUuidsFromCache(userId);
+        }
+    }
+
+    /**
+     * Check if a UUID is being observed by the package.
+     */
+    public boolean isUuidBeingObserved(ParcelUuid uuid, int userId, String packageName) {
+        final List<ObservableUuid> uuidsBeingObserved = getObservableUuidsForPackage(userId,
+                packageName);
+        for (ObservableUuid observableUuid : uuidsBeingObserved) {
+            if (observableUuid.getUuid().equals(uuid)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java b/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java
deleted file mode 100644
index 9c37881..0000000
--- a/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java
+++ /dev/null
@@ -1,403 +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.server.companion.presence;
-
-import static android.bluetooth.BluetoothAdapter.ACTION_BLE_STATE_CHANGED;
-import static android.bluetooth.BluetoothAdapter.ACTION_STATE_CHANGED;
-import static android.bluetooth.BluetoothAdapter.EXTRA_PREVIOUS_STATE;
-import static android.bluetooth.BluetoothAdapter.EXTRA_STATE;
-import static android.bluetooth.BluetoothAdapter.nameForState;
-import static android.bluetooth.le.ScanCallback.SCAN_FAILED_ALREADY_STARTED;
-import static android.bluetooth.le.ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED;
-import static android.bluetooth.le.ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED;
-import static android.bluetooth.le.ScanCallback.SCAN_FAILED_INTERNAL_ERROR;
-import static android.bluetooth.le.ScanCallback.SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES;
-import static android.bluetooth.le.ScanCallback.SCAN_FAILED_SCANNING_TOO_FREQUENTLY;
-import static android.bluetooth.le.ScanSettings.CALLBACK_TYPE_ALL_MATCHES;
-import static android.bluetooth.le.ScanSettings.CALLBACK_TYPE_FIRST_MATCH;
-import static android.bluetooth.le.ScanSettings.CALLBACK_TYPE_MATCH_LOST;
-import static android.bluetooth.le.ScanSettings.SCAN_MODE_LOW_POWER;
-
-import static com.android.server.companion.presence.DevicePresenceProcessor.DEBUG;
-import static com.android.server.companion.utils.Utils.btDeviceToString;
-
-import static java.util.Objects.requireNonNull;
-
-import android.annotation.MainThread;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SuppressLint;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.le.BluetoothLeScanner;
-import android.bluetooth.le.ScanCallback;
-import android.bluetooth.le.ScanFilter;
-import android.bluetooth.le.ScanResult;
-import android.bluetooth.le.ScanSettings;
-import android.companion.AssociationInfo;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Handler;
-import android.os.Looper;
-import android.util.Log;
-import android.util.Slog;
-
-import com.android.server.companion.association.AssociationStore;
-import com.android.server.companion.association.AssociationStore.ChangeType;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-@SuppressLint("LongLogTag")
-class BleCompanionDeviceScanner implements AssociationStore.OnChangeListener {
-    private static final String TAG = "CDM_BleCompanionDeviceScanner";
-
-    interface Callback {
-        void onBleCompanionDeviceFound(int associationId);
-
-        void onBleCompanionDeviceLost(int associationId);
-    }
-
-    private final @NonNull AssociationStore mAssociationStore;
-    private final @NonNull Callback mCallback;
-
-    // Non-null after init().
-    private @Nullable BluetoothAdapter mBtAdapter;
-    // Non-null after init() and when BLE is available. Otherwise - null.
-    private @Nullable BluetoothLeScanner mBleScanner;
-    // Only accessed from the Main thread.
-    private boolean mScanning = false;
-
-    BleCompanionDeviceScanner(
-            @NonNull AssociationStore associationStore, @NonNull Callback callback) {
-        mAssociationStore = associationStore;
-        mCallback = callback;
-    }
-
-    @MainThread
-    void init(@NonNull Context context, @NonNull BluetoothAdapter btAdapter) {
-        if (DEBUG) Log.i(TAG, "init()");
-
-        if (mBtAdapter != null) {
-            throw new IllegalStateException(getClass().getSimpleName() + " is already initialized");
-        }
-        mBtAdapter = requireNonNull(btAdapter);
-
-        checkBleState();
-        registerBluetoothStateBroadcastReceiver(context);
-
-        mAssociationStore.registerLocalListener(this);
-    }
-
-    @MainThread
-    final void restartScan() {
-        enforceInitialized();
-
-        if (DEBUG) Log.i(TAG , "restartScan()");
-        if (mBleScanner == null) {
-            if (DEBUG) Log.d(TAG, "  > BLE is not available");
-            return;
-        }
-
-        stopScanIfNeeded();
-        startScan();
-    }
-
-    @Override
-    public void onAssociationChanged(@ChangeType int changeType, AssociationInfo association) {
-        // Simply restart scanning.
-        if (Looper.getMainLooper().isCurrentThread()) {
-            restartScan();
-        } else {
-            new Handler(Looper.getMainLooper()).post(this::restartScan);
-        }
-    }
-
-    @MainThread
-    private void checkBleState() {
-        enforceInitialized();
-
-        final boolean bleAvailable = mBtAdapter.isLeEnabled();
-        if (DEBUG) {
-            Log.i(TAG, "checkBleState() bleAvailable=" + bleAvailable);
-        }
-        if ((bleAvailable && mBleScanner != null) || (!bleAvailable && mBleScanner == null)) {
-            // Nothing changed.
-            if (DEBUG) Log.i(TAG, "  > BLE status did not change");
-            return;
-        }
-
-        if (bleAvailable) {
-            mBleScanner = mBtAdapter.getBluetoothLeScanner();
-            if (mBleScanner == null) {
-                // Oops, that's a race condition. Can return.
-                return;
-            }
-            if (DEBUG) Log.i(TAG, "  > BLE is now available");
-
-            startScan();
-        } else {
-            if (DEBUG) Log.i(TAG, "  > BLE is now unavailable");
-
-            stopScanIfNeeded();
-            mBleScanner = null;
-        }
-    }
-
-    @MainThread
-    void startScan() {
-        enforceInitialized();
-
-        Slog.i(TAG, "startBleScan()");
-        // This method should not be called if scan is already in progress.
-        if (mScanning) {
-            Slog.w(TAG, "Scan is already in progress.");
-            return;
-        }
-
-        // Neither should this method be called if the adapter is not available.
-        if (mBleScanner == null) {
-            Slog.w(TAG, "BLE is not available.");
-            return;
-        }
-
-        // Collect MAC addresses from all associations.
-        final Set<String> macAddresses = new HashSet<>();
-        for (AssociationInfo association : mAssociationStore.getActiveAssociations()) {
-            if (!association.isNotifyOnDeviceNearby()) continue;
-
-            // Beware that BT stack does not consider low-case MAC addresses valid, while
-            // MacAddress.toString() return a low-case String.
-            final String macAddress = association.getDeviceMacAddressAsString();
-            if (macAddress != null) {
-                macAddresses.add(macAddress);
-            }
-        }
-        if (macAddresses.isEmpty()) {
-            if (DEBUG) Log.i(TAG, "  > there are no (associated) devices to Scan for.");
-            return;
-        } else {
-            if (DEBUG) {
-                Log.d(TAG, "  > addresses=(n=" + macAddresses.size() + ")"
-                        + "[" + String.join(", ", macAddresses) + "]");
-            }
-        }
-
-        final List<ScanFilter> filters = new ArrayList<>(macAddresses.size());
-        for (String macAddress : macAddresses) {
-            final ScanFilter filter = new ScanFilter.Builder()
-                    .setDeviceAddress(macAddress)
-                    .build();
-            filters.add(filter);
-        }
-
-        // BluetoothLeScanner will throw an IllegalStateException if startScan() is called while LE
-        // is not enabled.
-        if (mBtAdapter.isLeEnabled()) {
-            try {
-                mBleScanner.startScan(filters, SCAN_SETTINGS, mScanCallback);
-                mScanning = true;
-            } catch (IllegalStateException e) {
-                Slog.w(TAG, "Exception while starting BLE scanning", e);
-            }
-        } else {
-            Slog.w(TAG, "BLE scanning is not turned on");
-        }
-    }
-
-    void stopScanIfNeeded() {
-        enforceInitialized();
-
-        Slog.i(TAG, "stopBleScan()");
-        if (!mScanning) {
-            if (DEBUG) Log.d(TAG, "  > not scanning.");
-            return;
-        }
-        // mScanCallback is non-null here - it cannot be null when mScanning is true.
-
-        // BluetoothLeScanner will throw an IllegalStateException if stopScan() is called while LE
-        // is not enabled.
-        if (mBtAdapter.isLeEnabled()) {
-            try {
-                mBleScanner.stopScan(mScanCallback);
-            } catch (IllegalStateException e) {
-                Slog.w(TAG, "Exception while stopping BLE scanning", e);
-            }
-        } else {
-            Slog.w(TAG, "BLE scanning is not turned on");
-        }
-
-        mScanning = false;
-    }
-
-    @MainThread
-    private void notifyDeviceFound(@NonNull BluetoothDevice device) {
-        if (DEBUG) Log.i(TAG, "notifyDevice_Found()" + btDeviceToString(device));
-
-        final List<AssociationInfo> associations =
-                mAssociationStore.getActiveAssociationsByAddress(device.getAddress());
-        if (DEBUG) Log.d(TAG, "  > associations=" + Arrays.toString(associations.toArray()));
-
-        for (AssociationInfo association : associations) {
-            mCallback.onBleCompanionDeviceFound(association.getId());
-        }
-    }
-
-    @MainThread
-    private void notifyDeviceLost(@NonNull BluetoothDevice device) {
-        if (DEBUG) Log.i(TAG, "notifyDevice_Lost()" + btDeviceToString(device));
-
-        final List<AssociationInfo> associations =
-                mAssociationStore.getActiveAssociationsByAddress(device.getAddress());
-        if (DEBUG) Log.d(TAG, "  > associations=" + Arrays.toString(associations.toArray()));
-
-        for (AssociationInfo association : associations) {
-            mCallback.onBleCompanionDeviceLost(association.getId());
-        }
-    }
-
-    private void registerBluetoothStateBroadcastReceiver(Context context) {
-        final BroadcastReceiver receiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                final int prevState = intent.getIntExtra(EXTRA_PREVIOUS_STATE, -1);
-                final int state = intent.getIntExtra(EXTRA_STATE, -1);
-
-                if (DEBUG) {
-                    // The action is either STATE_CHANGED or BLE_STATE_CHANGED.
-                    final String action =
-                            intent.getAction().replace("android.bluetooth.adapter.", "bt.");
-                    Log.d(TAG, "on(Broadcast)Receive() " + action + ": "
-                            + nameForBtState(prevState) + "->" + nameForBtState(state));
-                }
-
-                checkBleState();
-            }
-        };
-
-        final IntentFilter filter = new IntentFilter();
-        filter.addAction(ACTION_STATE_CHANGED);
-        filter.addAction(ACTION_BLE_STATE_CHANGED);
-
-        context.registerReceiver(receiver, filter);
-    }
-
-    private void enforceInitialized() {
-        if (mBtAdapter != null) return;
-        throw new IllegalStateException(getClass().getSimpleName() + " is not initialized");
-    }
-
-    private final ScanCallback mScanCallback = new ScanCallback() {
-        @MainThread
-        @Override
-        public void onScanResult(int callbackType, ScanResult result) {
-            final BluetoothDevice device = result.getDevice();
-
-            if (DEBUG) {
-                Log.d(TAG, "onScanResult() " + nameForBleScanCallbackType(callbackType)
-                        + " device=" + btDeviceToString(device));
-                Log.v(TAG, "  > scanResult=" + result);
-
-                final List<AssociationInfo> associations =
-                        mAssociationStore.getActiveAssociationsByAddress(device.getAddress());
-                Log.v(TAG, "  > associations=" + Arrays.toString(associations.toArray()));
-            }
-
-            switch (callbackType) {
-                case CALLBACK_TYPE_FIRST_MATCH:
-                    notifyDeviceFound(device);
-                    break;
-
-                case CALLBACK_TYPE_MATCH_LOST:
-                    notifyDeviceLost(device);
-                    break;
-
-                default:
-                    Slog.wtf(TAG, "Unexpected callback "
-                            + nameForBleScanCallbackType(callbackType));
-                    break;
-            }
-        }
-
-        @MainThread
-        @Override
-        public void onScanFailed(int errorCode) {
-            if (DEBUG) Log.w(TAG, "onScanFailed() " + nameForBleScanErrorCode(errorCode));
-            mScanning = false;
-        }
-    };
-
-    private static String nameForBtState(int state) {
-        return nameForState(state) + "(" + state + ")";
-    }
-
-    private static String nameForBleScanCallbackType(int callbackType) {
-        final String name;
-        switch (callbackType) {
-            case CALLBACK_TYPE_ALL_MATCHES:
-                name = "ALL_MATCHES";
-                break;
-            case CALLBACK_TYPE_FIRST_MATCH:
-                name = "FIRST_MATCH";
-                break;
-            case CALLBACK_TYPE_MATCH_LOST:
-                name = "MATCH_LOST";
-                break;
-            default:
-                name = "Unknown";
-        }
-        return name + "(" + callbackType + ")";
-    }
-
-    private static String nameForBleScanErrorCode(int errorCode) {
-        final String name;
-        switch (errorCode) {
-            case SCAN_FAILED_ALREADY_STARTED:
-                name = "ALREADY_STARTED";
-                break;
-            case SCAN_FAILED_APPLICATION_REGISTRATION_FAILED:
-                name = "APPLICATION_REGISTRATION_FAILED";
-                break;
-            case SCAN_FAILED_INTERNAL_ERROR:
-                name = "INTERNAL_ERROR";
-                break;
-            case SCAN_FAILED_FEATURE_UNSUPPORTED:
-                name = "FEATURE_UNSUPPORTED";
-                break;
-            case SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES:
-                name = "OUT_OF_HARDWARE_RESOURCES";
-                break;
-            case SCAN_FAILED_SCANNING_TOO_FREQUENTLY:
-                name = "SCANNING_TOO_FREQUENTLY";
-                break;
-            default:
-                name = "Unknown";
-        }
-        return name + "(" + errorCode + ")";
-    }
-
-    private static final ScanSettings SCAN_SETTINGS = new ScanSettings.Builder()
-            .setCallbackType(CALLBACK_TYPE_FIRST_MATCH | CALLBACK_TYPE_MATCH_LOST)
-            .setScanMode(SCAN_MODE_LOW_POWER)
-            .build();
-}
diff --git a/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java b/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java
deleted file mode 100644
index 2d345c4..0000000
--- a/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java
+++ /dev/null
@@ -1,239 +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.server.companion.presence;
-
-import static android.companion.DevicePresenceEvent.EVENT_BT_CONNECTED;
-import static android.companion.DevicePresenceEvent.EVENT_BT_DISCONNECTED;
-
-import static com.android.server.companion.presence.DevicePresenceProcessor.DEBUG;
-import static com.android.server.companion.utils.Utils.btDeviceToString;
-
-import android.annotation.NonNull;
-import android.annotation.SuppressLint;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.companion.AssociationInfo;
-import android.net.MacAddress;
-import android.os.Handler;
-import android.os.HandlerExecutor;
-import android.os.ParcelUuid;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.util.ArrayUtils;
-import com.android.server.companion.association.AssociationStore;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-@SuppressLint("LongLogTag")
-public class BluetoothCompanionDeviceConnectionListener
-        extends BluetoothAdapter.BluetoothConnectionCallback
-        implements AssociationStore.OnChangeListener {
-    private static final String TAG = "CDM_BluetoothCompanionDeviceConnectionListener";
-
-    interface Callback {
-        void onBluetoothCompanionDeviceConnected(int associationId);
-
-        void onBluetoothCompanionDeviceDisconnected(int associationId);
-
-        void onDevicePresenceEventByUuid(ObservableUuid uuid, int event);
-    }
-
-    private final UserManager mUserManager;
-    private final @NonNull AssociationStore mAssociationStore;
-    private final @NonNull Callback mCallback;
-    /** A set of ALL connected BT device (not only companion.) */
-    private final @NonNull Map<MacAddress, BluetoothDevice> mAllConnectedDevices = new HashMap<>();
-
-    private final @NonNull ObservableUuidStore mObservableUuidStore;
-
-    /**
-     * A structure hold the connected BT devices that are pending to be reported to the companion
-     * app when the user unlocks the local device per userId.
-     */
-    @GuardedBy("mPendingConnectedDevices")
-    @NonNull
-    final SparseArray<Set<BluetoothDevice>> mPendingConnectedDevices = new SparseArray<>();
-
-    BluetoothCompanionDeviceConnectionListener(UserManager userManager,
-            @NonNull AssociationStore associationStore,
-            @NonNull ObservableUuidStore observableUuidStore, @NonNull Callback callback) {
-        mAssociationStore = associationStore;
-        mObservableUuidStore = observableUuidStore;
-        mCallback = callback;
-        mUserManager = userManager;
-    }
-
-    public void init(@NonNull BluetoothAdapter btAdapter) {
-        if (DEBUG) Log.i(TAG, "init()");
-
-        btAdapter.registerBluetoothConnectionCallback(
-                new HandlerExecutor(Handler.getMain()), /* callback */this);
-        mAssociationStore.registerLocalListener(this);
-    }
-
-    /**
-     * Overrides
-     * {@link BluetoothAdapter.BluetoothConnectionCallback#onDeviceConnected(BluetoothDevice)}.
-     */
-    @Override
-    public void onDeviceConnected(@NonNull BluetoothDevice device) {
-        if (DEBUG) Log.i(TAG, "onDevice_Connected() " + btDeviceToString(device));
-
-        final MacAddress macAddress = MacAddress.fromString(device.getAddress());
-        final int userId = UserHandle.myUserId();
-
-        if (mAllConnectedDevices.put(macAddress, device) != null) {
-            if (DEBUG) Log.w(TAG, "Device " + btDeviceToString(device) + " is already connected.");
-            return;
-        }
-        // Try to bind and notify the app after the phone is unlocked.
-        if (!mUserManager.isUserUnlockingOrUnlocked(UserHandle.myUserId())) {
-            Slog.i(TAG, "Current user is not in unlocking or unlocked stage yet. Notify "
-                        + "the application when the phone is unlocked");
-            synchronized (mPendingConnectedDevices) {
-                Set<BluetoothDevice> bluetoothDevices = mPendingConnectedDevices.get(
-                        userId, new HashSet<>());
-                bluetoothDevices.add(device);
-                mPendingConnectedDevices.put(userId, bluetoothDevices);
-            }
-        } else {
-            onDeviceConnectivityChanged(device, true);
-        }
-    }
-
-    /**
-     * Overrides
-     * {@link BluetoothAdapter.BluetoothConnectionCallback#onDeviceConnected(BluetoothDevice)}.
-     * Also invoked when user turns BT off while the device is connected.
-     */
-    @Override
-    public void onDeviceDisconnected(@NonNull BluetoothDevice device,
-            int reason) {
-        if (DEBUG) {
-            Log.i(TAG, "onDevice_Disconnected() " + btDeviceToString(device));
-            Log.d(TAG, "  reason=" + disconnectReasonToString(reason));
-        }
-
-        final MacAddress macAddress = MacAddress.fromString(device.getAddress());
-        final int userId = UserHandle.myUserId();
-
-        if (mAllConnectedDevices.remove(macAddress) == null) {
-            if (DEBUG) {
-                Log.w(TAG, "The device wasn't tracked as connected " + btDeviceToString(device));
-            }
-            return;
-        }
-
-        // Do not need to report the connectivity since the user is not unlock the phone so
-        // that cdm is not bind with the app yet.
-        if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
-            synchronized (mPendingConnectedDevices) {
-                Set<BluetoothDevice> bluetoothDevices = mPendingConnectedDevices.get(userId);
-                if (bluetoothDevices != null) {
-                    bluetoothDevices.remove(device);
-                }
-            }
-
-            return;
-        }
-
-        onDeviceConnectivityChanged(device, false);
-    }
-
-    private void onDeviceConnectivityChanged(@NonNull BluetoothDevice device, boolean connected) {
-        int userId = UserHandle.myUserId();
-        final List<AssociationInfo> associations =
-                mAssociationStore.getActiveAssociationsByAddress(device.getAddress());
-        final List<ObservableUuid> observableUuids =
-                mObservableUuidStore.getObservableUuidsForUser(userId);
-        final ParcelUuid[] bluetoothDeviceUuids = device.getUuids();
-
-        final List<ParcelUuid> deviceUuids = ArrayUtils.isEmpty(bluetoothDeviceUuids)
-                ? Collections.emptyList() : Arrays.asList(bluetoothDeviceUuids);
-
-        if (DEBUG) {
-            Log.d(TAG, "onDevice_ConnectivityChanged() " + btDeviceToString(device)
-                    + " connected=" + connected);
-            if (associations.isEmpty()) {
-                Log.d(TAG, "  > No CDM associations");
-            } else {
-                Log.d(TAG, "  > associations=" + Arrays.toString(associations.toArray()));
-            }
-        }
-
-        for (AssociationInfo association : associations) {
-            if (!association.isNotifyOnDeviceNearby()) continue;
-            final int id = association.getId();
-            if (connected) {
-                mCallback.onBluetoothCompanionDeviceConnected(id);
-            } else {
-                mCallback.onBluetoothCompanionDeviceDisconnected(id);
-            }
-        }
-
-        for (ObservableUuid uuid : observableUuids) {
-            if (deviceUuids.contains(uuid.getUuid())) {
-                mCallback.onDevicePresenceEventByUuid(
-                        uuid, connected ? EVENT_BT_CONNECTED
-                                : EVENT_BT_DISCONNECTED);
-            }
-        }
-    }
-
-    @Override
-    public void onAssociationAdded(AssociationInfo association) {
-        if (DEBUG) Log.d(TAG, "onAssociation_Added() " + association);
-
-        if (mAllConnectedDevices.containsKey(association.getDeviceMacAddress())) {
-            mCallback.onBluetoothCompanionDeviceConnected(association.getId());
-        }
-    }
-
-    @Override
-    public void onAssociationRemoved(AssociationInfo association) {
-        // Intentionally do nothing: CompanionDevicePresenceMonitor will do all the bookkeeping
-        // required.
-    }
-
-    @Override
-    public void onAssociationUpdated(AssociationInfo association, boolean addressChanged) {
-        if (DEBUG) {
-            Log.d(TAG, "onAssociation_Updated() addrChange=" + addressChanged
-                    + " " + association);
-        }
-
-        if (!addressChanged) {
-            // Don't need to do anything.
-            return;
-        }
-
-        // At the moment CDM does allow changing association addresses, so we will never come here.
-        // This will be implemented when CDM support updating addresses.
-        throw new IllegalArgumentException("Address changes are not supported.");
-    }
-}
diff --git a/services/companion/java/com/android/server/companion/presence/CompanionAppBinder.java b/services/companion/java/com/android/server/companion/presence/CompanionAppBinder.java
deleted file mode 100644
index 4ba4e2c..0000000
--- a/services/companion/java/com/android/server/companion/presence/CompanionAppBinder.java
+++ /dev/null
@@ -1,392 +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.server.companion.presence;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SuppressLint;
-import android.annotation.UserIdInt;
-import android.companion.AssociationInfo;
-import android.companion.CompanionDeviceService;
-import android.companion.DevicePresenceEvent;
-import android.content.ComponentName;
-import android.content.Context;
-import android.os.Handler;
-import android.os.PowerManagerInternal;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.infra.PerUser;
-import com.android.server.companion.CompanionDeviceManagerService;
-import com.android.server.companion.association.AssociationStore;
-import com.android.server.companion.utils.PackageUtils;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Manages communication with companion applications via
- * {@link android.companion.ICompanionDeviceService} interface, including "connecting" (binding) to
- * the services, maintaining the connection (the binding), and invoking callback methods such as
- * {@link CompanionDeviceService#onDeviceAppeared(AssociationInfo)},
- * {@link CompanionDeviceService#onDeviceDisappeared(AssociationInfo)} and
- * {@link CompanionDeviceService#onDevicePresenceEvent(DevicePresenceEvent)} in the
- * application process.
- *
- * <p>
- * The following is the list of the APIs provided by {@link CompanionAppBinder} (to be
- * utilized by {@link CompanionDeviceManagerService}):
- * <ul>
- * <li> {@link #bindCompanionApplication(int, String, boolean, CompanionServiceConnector.Listener)}
- * <li> {@link #unbindCompanionApplication(int, String)}
- * <li> {@link #isCompanionApplicationBound(int, String)}
- * <li> {@link #isRebindingCompanionApplicationScheduled(int, String)}
- * </ul>
- *
- * @see CompanionDeviceService
- * @see android.companion.ICompanionDeviceService
- * @see CompanionServiceConnector
- */
-@SuppressLint("LongLogTag")
-public class CompanionAppBinder {
-    private static final String TAG = "CDM_CompanionAppBinder";
-
-    private static final long REBIND_TIMEOUT = 10 * 1000; // 10 sec
-
-    @NonNull
-    private final Context mContext;
-    @NonNull
-    private final AssociationStore mAssociationStore;
-    @NonNull
-    private final ObservableUuidStore mObservableUuidStore;
-    @NonNull
-    private final CompanionServicesRegister mCompanionServicesRegister;
-
-    private final PowerManagerInternal mPowerManagerInternal;
-
-    @NonNull
-    @GuardedBy("mBoundCompanionApplications")
-    private final AndroidPackageMap<List<CompanionServiceConnector>>
-            mBoundCompanionApplications;
-    @NonNull
-    @GuardedBy("mScheduledForRebindingCompanionApplications")
-    private final AndroidPackageMap<Boolean> mScheduledForRebindingCompanionApplications;
-
-    public CompanionAppBinder(@NonNull Context context,
-            @NonNull AssociationStore associationStore,
-            @NonNull ObservableUuidStore observableUuidStore,
-            @NonNull PowerManagerInternal powerManagerInternal) {
-        mContext = context;
-        mAssociationStore = associationStore;
-        mObservableUuidStore = observableUuidStore;
-        mPowerManagerInternal = powerManagerInternal;
-        mCompanionServicesRegister = new CompanionServicesRegister();
-        mBoundCompanionApplications = new AndroidPackageMap<>();
-        mScheduledForRebindingCompanionApplications = new AndroidPackageMap<>();
-    }
-
-    /**
-     * On package changed.
-     */
-    public void onPackagesChanged(@UserIdInt int userId) {
-        mCompanionServicesRegister.invalidate(userId);
-    }
-
-    /**
-     * CDM binds to the companion app.
-     */
-    public void bindCompanionApplication(@UserIdInt int userId, @NonNull String packageName,
-            boolean isSelfManaged, CompanionServiceConnector.Listener listener) {
-        Slog.i(TAG, "Binding user=[" + userId + "], package=[" + packageName + "], isSelfManaged=["
-                + isSelfManaged + "]...");
-
-        final List<ComponentName> companionServices =
-                mCompanionServicesRegister.forPackage(userId, packageName);
-        if (companionServices.isEmpty()) {
-            Slog.e(TAG, "Can not bind companion applications u" + userId + "/" + packageName + ": "
-                    + "eligible CompanionDeviceService not found.\n"
-                    + "A CompanionDeviceService should declare an intent-filter for "
-                    + "\"android.companion.CompanionDeviceService\" action and require "
-                    + "\"android.permission.BIND_COMPANION_DEVICE_SERVICE\" permission.");
-            return;
-        }
-
-        final List<CompanionServiceConnector> serviceConnectors = new ArrayList<>();
-        synchronized (mBoundCompanionApplications) {
-            if (mBoundCompanionApplications.containsValueForPackage(userId, packageName)) {
-                Slog.w(TAG, "The package is ALREADY bound.");
-                return;
-            }
-
-            for (int i = 0; i < companionServices.size(); i++) {
-                boolean isPrimary = i == 0;
-                serviceConnectors.add(CompanionServiceConnector.newInstance(mContext, userId,
-                        companionServices.get(i), isSelfManaged, isPrimary));
-            }
-
-            mBoundCompanionApplications.setValueForPackage(userId, packageName, serviceConnectors);
-        }
-
-        // Set listeners for both Primary and Secondary connectors.
-        for (CompanionServiceConnector serviceConnector : serviceConnectors) {
-            serviceConnector.setListener(listener);
-        }
-
-        // Now "bind" all the connectors: the primary one and the rest of them.
-        for (CompanionServiceConnector serviceConnector : serviceConnectors) {
-            serviceConnector.connect();
-        }
-    }
-
-    /**
-     * CDM unbinds the companion app.
-     */
-    public void unbindCompanionApplication(@UserIdInt int userId, @NonNull String packageName) {
-        Slog.i(TAG, "Unbinding user=[" + userId + "], package=[" + packageName + "]...");
-
-        final List<CompanionServiceConnector> serviceConnectors;
-
-        synchronized (mBoundCompanionApplications) {
-            serviceConnectors = mBoundCompanionApplications.removePackage(userId, packageName);
-        }
-
-        synchronized (mScheduledForRebindingCompanionApplications) {
-            mScheduledForRebindingCompanionApplications.removePackage(userId, packageName);
-        }
-
-        if (serviceConnectors == null) {
-            Slog.e(TAG, "The package is not bound.");
-            return;
-        }
-
-        for (CompanionServiceConnector serviceConnector : serviceConnectors) {
-            serviceConnector.postUnbind();
-        }
-    }
-
-    /**
-     * @return whether the companion application is bound now.
-     */
-    public boolean isCompanionApplicationBound(@UserIdInt int userId, @NonNull String packageName) {
-        synchronized (mBoundCompanionApplications) {
-            return mBoundCompanionApplications.containsValueForPackage(userId, packageName);
-        }
-    }
-
-    /**
-     * Remove bound apps for package.
-     */
-    public void removePackage(int userId, String packageName) {
-        synchronized (mBoundCompanionApplications) {
-            mBoundCompanionApplications.removePackage(userId, packageName);
-        }
-    }
-
-    /**
-     * Schedule rebinding for the package.
-     */
-    public void scheduleRebinding(@UserIdInt int userId, @NonNull String packageName,
-            CompanionServiceConnector serviceConnector) {
-        Slog.i(TAG, "scheduleRebinding() " + userId + "/" + packageName);
-
-        if (isRebindingCompanionApplicationScheduled(userId, packageName)) {
-            Slog.i(TAG, "CompanionApplication rebinding has been scheduled, skipping "
-                        + serviceConnector.getComponentName());
-            return;
-        }
-
-        if (serviceConnector.isPrimary()) {
-            synchronized (mScheduledForRebindingCompanionApplications) {
-                mScheduledForRebindingCompanionApplications.setValueForPackage(
-                        userId, packageName, true);
-            }
-        }
-
-        // Rebinding in 10 seconds.
-        Handler.getMain().postDelayed(() ->
-                        onRebindingCompanionApplicationTimeout(userId, packageName,
-                                serviceConnector),
-                REBIND_TIMEOUT);
-    }
-
-    private boolean isRebindingCompanionApplicationScheduled(
-            @UserIdInt int userId, @NonNull String packageName) {
-        synchronized (mScheduledForRebindingCompanionApplications) {
-            return mScheduledForRebindingCompanionApplications.containsValueForPackage(
-                    userId, packageName);
-        }
-    }
-
-    private void onRebindingCompanionApplicationTimeout(
-            @UserIdInt int userId, @NonNull String packageName,
-            @NonNull CompanionServiceConnector serviceConnector) {
-        // Re-mark the application is bound.
-        if (serviceConnector.isPrimary()) {
-            synchronized (mBoundCompanionApplications) {
-                if (!mBoundCompanionApplications.containsValueForPackage(userId, packageName)) {
-                    List<CompanionServiceConnector> serviceConnectors =
-                            Collections.singletonList(serviceConnector);
-                    mBoundCompanionApplications.setValueForPackage(userId, packageName,
-                            serviceConnectors);
-                }
-            }
-
-            synchronized (mScheduledForRebindingCompanionApplications) {
-                mScheduledForRebindingCompanionApplications.removePackage(userId, packageName);
-            }
-        }
-
-        serviceConnector.connect();
-    }
-
-    /**
-     * Dump bound apps.
-     */
-    public void dump(@NonNull PrintWriter out) {
-        out.append("Companion Device Application Controller: \n");
-
-        synchronized (mBoundCompanionApplications) {
-            out.append("  Bound Companion Applications: ");
-            if (mBoundCompanionApplications.size() == 0) {
-                out.append("<empty>\n");
-            } else {
-                out.append("\n");
-                mBoundCompanionApplications.dump(out);
-            }
-        }
-
-        out.append("  Companion Applications Scheduled For Rebinding: ");
-        synchronized (mScheduledForRebindingCompanionApplications) {
-            if (mScheduledForRebindingCompanionApplications.size() == 0) {
-                out.append("<empty>\n");
-            } else {
-                out.append("\n");
-                mScheduledForRebindingCompanionApplications.dump(out);
-            }
-        }
-    }
-
-    @Nullable
-    CompanionServiceConnector getPrimaryServiceConnector(
-            @UserIdInt int userId, @NonNull String packageName) {
-        final List<CompanionServiceConnector> connectors;
-        synchronized (mBoundCompanionApplications) {
-            connectors = mBoundCompanionApplications.getValueForPackage(userId, packageName);
-        }
-        return connectors != null ? connectors.get(0) : null;
-    }
-
-    private class CompanionServicesRegister extends PerUser<Map<String, List<ComponentName>>> {
-        @Override
-        public synchronized @NonNull Map<String, List<ComponentName>> forUser(
-                @UserIdInt int userId) {
-            return super.forUser(userId);
-        }
-
-        synchronized @NonNull List<ComponentName> forPackage(
-                @UserIdInt int userId, @NonNull String packageName) {
-            return forUser(userId).getOrDefault(packageName, Collections.emptyList());
-        }
-
-        synchronized void invalidate(@UserIdInt int userId) {
-            remove(userId);
-        }
-
-        @Override
-        protected final @NonNull Map<String, List<ComponentName>> create(@UserIdInt int userId) {
-            return PackageUtils.getCompanionServicesForUser(mContext, userId);
-        }
-    }
-
-    /**
-     * Associates an Android package (defined by userId + packageName) with a value of type T.
-     */
-    private static class AndroidPackageMap<T> extends SparseArray<Map<String, T>> {
-
-        void setValueForPackage(
-                @UserIdInt int userId, @NonNull String packageName, @NonNull T value) {
-            Map<String, T> forUser = get(userId);
-            if (forUser == null) {
-                forUser = /* Map<String, T> */ new HashMap();
-                put(userId, forUser);
-            }
-
-            forUser.put(packageName, value);
-        }
-
-        boolean containsValueForPackage(@UserIdInt int userId, @NonNull String packageName) {
-            final Map<String, ?> forUser = get(userId);
-            return forUser != null && forUser.containsKey(packageName);
-        }
-
-        T getValueForPackage(@UserIdInt int userId, @NonNull String packageName) {
-            final Map<String, T> forUser = get(userId);
-            return forUser != null ? forUser.get(packageName) : null;
-        }
-
-        T removePackage(@UserIdInt int userId, @NonNull String packageName) {
-            final Map<String, T> forUser = get(userId);
-            if (forUser == null) return null;
-            return forUser.remove(packageName);
-        }
-
-        void dump() {
-            if (size() == 0) {
-                Log.d(TAG, "<empty>");
-                return;
-            }
-
-            for (int i = 0; i < size(); i++) {
-                final int userId = keyAt(i);
-                final Map<String, T> forUser = get(userId);
-                if (forUser.isEmpty()) {
-                    Log.d(TAG, "u" + userId + ": <empty>");
-                }
-
-                for (Map.Entry<String, T> packageValue : forUser.entrySet()) {
-                    final String packageName = packageValue.getKey();
-                    final T value = packageValue.getValue();
-                    Log.d(TAG, "u" + userId + "\\" + packageName + " -> " + value);
-                }
-            }
-        }
-
-        private void dump(@NonNull PrintWriter out) {
-            for (int i = 0; i < size(); i++) {
-                final int userId = keyAt(i);
-                final Map<String, T> forUser = get(userId);
-                if (forUser.isEmpty()) {
-                    out.append("    u").append(String.valueOf(userId)).append(": <empty>\n");
-                }
-
-                for (Map.Entry<String, T> packageValue : forUser.entrySet()) {
-                    final String packageName = packageValue.getKey();
-                    final T value = packageValue.getValue();
-                    out.append("    u").append(String.valueOf(userId)).append("\\")
-                            .append(packageName).append(" -> ")
-                            .append(value.toString()).append('\n');
-                }
-            }
-        }
-    }
-}
diff --git a/services/companion/java/com/android/server/companion/presence/CompanionServiceConnector.java b/services/companion/java/com/android/server/companion/presence/CompanionServiceConnector.java
deleted file mode 100644
index c01c319..0000000
--- a/services/companion/java/com/android/server/companion/presence/CompanionServiceConnector.java
+++ /dev/null
@@ -1,219 +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.server.companion.presence;
-
-import static android.content.Context.BIND_ALMOST_PERCEPTIBLE;
-import static android.content.Context.BIND_TREAT_LIKE_VISIBLE_FOREGROUND_SERVICE;
-import static android.os.Process.THREAD_PRIORITY_DEFAULT;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SuppressLint;
-import android.annotation.UserIdInt;
-import android.companion.AssociationInfo;
-import android.companion.CompanionDeviceService;
-import android.companion.DevicePresenceEvent;
-import android.companion.ICompanionDeviceService;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.IBinder;
-import android.util.Slog;
-
-import com.android.internal.infra.ServiceConnector;
-import com.android.server.ServiceThread;
-import com.android.server.companion.CompanionDeviceManagerService;
-
-/**
- * Manages a connection (binding) to an instance of {@link CompanionDeviceService} running in the
- * application process.
- */
-@SuppressLint("LongLogTag")
-public class CompanionServiceConnector extends ServiceConnector.Impl<ICompanionDeviceService> {
-
-    /** Listener for changes to the state of the {@link CompanionServiceConnector}  */
-    public interface Listener {
-        /**
-         * Called when service binding is died.
-         */
-        void onBindingDied(@UserIdInt int userId, @NonNull String packageName,
-                @NonNull CompanionServiceConnector serviceConnector);
-    }
-
-    private static final String TAG = "CDM_CompanionServiceConnector";
-
-    /* Unbinding before executing the callbacks can cause problems. Wait 5-seconds before unbind. */
-    private static final long UNBIND_POST_DELAY_MS = 5_000;
-    @UserIdInt
-    private final int mUserId;
-    @NonNull
-    private final ComponentName mComponentName;
-    private final boolean mIsPrimary;
-    // IMPORTANT: this can (and will!) be null (at the moment, CompanionApplicationController only
-    // installs a listener to the primary ServiceConnector), hence we should always null-check the
-    // reference before calling on it.
-    @Nullable
-    private Listener mListener;
-
-    /**
-     * Create a CompanionDeviceServiceConnector instance.
-     *
-     * For self-managed apps, the binding flag will be BIND_TREAT_LIKE_VISIBLE_FOREGROUND_SERVICE
-     * (oom_score_adj = VISIBLE_APP_ADJ = 100).
-     *
-     * For non self-managed apps, the binding flag will be BIND_ALMOST_PERCEPTIBLE
-     * (oom_score_adj = PERCEPTIBLE_MEDIUM_APP = 225). The target service will be treated
-     * as important as a perceptible app (IMPORTANCE_VISIBLE = 200), and will be unbound when
-     * the app is removed from task manager.
-     *
-     * One time permission's importance level to keep session alive is
-     * IMPORTANCE_FOREGROUND_SERVICE = 125. In order to kill the one time permission session, the
-     * service importance level should be higher than 125.
-     */
-    static CompanionServiceConnector newInstance(@NonNull Context context,
-            @UserIdInt int userId, @NonNull ComponentName componentName, boolean isSelfManaged,
-            boolean isPrimary) {
-        final int bindingFlags = isSelfManaged ? BIND_TREAT_LIKE_VISIBLE_FOREGROUND_SERVICE
-                : BIND_ALMOST_PERCEPTIBLE;
-        return new CompanionServiceConnector(
-                context, userId, componentName, bindingFlags, isPrimary);
-    }
-
-    private CompanionServiceConnector(@NonNull Context context, @UserIdInt int userId,
-            @NonNull ComponentName componentName, int bindingFlags, boolean isPrimary) {
-        super(context, buildIntent(componentName), bindingFlags, userId, null);
-        mUserId = userId;
-        mComponentName = componentName;
-        mIsPrimary = isPrimary;
-    }
-
-    void setListener(@Nullable Listener listener) {
-        mListener = listener;
-    }
-
-    void postOnDeviceAppeared(@NonNull AssociationInfo associationInfo) {
-        post(companionService -> companionService.onDeviceAppeared(associationInfo));
-    }
-
-    void postOnDeviceDisappeared(@NonNull AssociationInfo associationInfo) {
-        post(companionService -> companionService.onDeviceDisappeared(associationInfo));
-    }
-
-    void postOnDevicePresenceEvent(@NonNull DevicePresenceEvent event) {
-        post(companionService -> companionService.onDevicePresenceEvent(event));
-    }
-
-    /**
-     * Post "unbind" job, which will run *after* all previously posted jobs complete.
-     *
-     * IMPORTANT: use this method instead of invoking {@link ServiceConnector#unbind()} directly,
-     * because the latter may cause previously posted callback, such as
-     * {@link ICompanionDeviceService#onDeviceDisappeared(AssociationInfo)} to be dropped.
-     *
-     * {@link ICompanionDeviceService} is a non-blocking interface and doesn't wait for job
-     * completion, which makes {@link ServiceConnector#post(VoidJob)} obsolete for ensuring the
-     * order of execution. Give 5 seconds for all the callbacks to finish before unbinding. They
-     * may or may not have finished executing, but we shouldn't let user-overridden methods block
-     * the service from unbinding indefinitely.
-     */
-    void postUnbind() {
-        getJobHandler().postDelayed(this::unbind, UNBIND_POST_DELAY_MS);
-    }
-
-    boolean isPrimary() {
-        return mIsPrimary;
-    }
-
-    @NonNull
-    ComponentName getComponentName() {
-        return mComponentName;
-    }
-
-    @Override
-    protected void onServiceConnectionStatusChanged(
-            @NonNull ICompanionDeviceService service, boolean isConnected) {
-        Slog.d(TAG, "onServiceConnectionStatusChanged() " + mComponentName.toShortString()
-                + " connected=" + isConnected);
-    }
-
-    @Override
-    public void binderDied() {
-        super.binderDied();
-
-        Slog.d(TAG, "binderDied() " + mComponentName.toShortString());
-
-        // Handle primary process being killed
-        if (mListener != null) {
-            mListener.onBindingDied(mUserId, mComponentName.getPackageName(), this);
-        }
-    }
-
-    @Override
-    protected ICompanionDeviceService binderAsInterface(@NonNull IBinder service) {
-        return ICompanionDeviceService.Stub.asInterface(service);
-    }
-
-    /**
-     * Overrides {@link ServiceConnector.Impl#getJobHandler()} to provide an alternative Thread
-     * ("in form of" a {@link Handler}) to process jobs on.
-     * <p>
-     * (By default, {@link ServiceConnector.Impl} process jobs on the
-     * {@link android.os.Looper#getMainLooper() MainThread} which is a shared singleton thread
-     * within system_server and thus tends to get heavily congested)
-     */
-    @Override
-    @NonNull
-    protected Handler getJobHandler() {
-        return getServiceThread().getThreadHandler();
-    }
-
-    @Override
-    protected long getAutoDisconnectTimeoutMs() {
-        // Do NOT auto-disconnect.
-        return -1;
-    }
-
-    @NonNull
-    private static Intent buildIntent(@NonNull ComponentName componentName) {
-        return new Intent(CompanionDeviceService.SERVICE_INTERFACE)
-                .setComponent(componentName);
-    }
-
-    @NonNull
-    private static ServiceThread getServiceThread() {
-        if (sServiceThread == null) {
-            synchronized (CompanionDeviceManagerService.class) {
-                if (sServiceThread == null) {
-                    sServiceThread = new ServiceThread("companion-device-service-connector",
-                            THREAD_PRIORITY_DEFAULT, /* allowIo */ false);
-                    sServiceThread.start();
-                }
-            }
-        }
-        return sServiceThread;
-    }
-
-    /**
-     * A worker thread for the {@link ServiceConnector} to process jobs on.
-     *
-     * <p>
-     *  Do NOT reference directly, use {@link #getServiceThread()} method instead.
-     */
-    @Nullable
-    private static volatile ServiceThread sServiceThread;
-}
diff --git a/services/companion/java/com/android/server/companion/presence/DevicePresenceProcessor.java b/services/companion/java/com/android/server/companion/presence/DevicePresenceProcessor.java
deleted file mode 100644
index 2a933a8..0000000
--- a/services/companion/java/com/android/server/companion/presence/DevicePresenceProcessor.java
+++ /dev/null
@@ -1,1042 +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.server.companion.presence;
-
-import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PROJECTION;
-import static android.companion.DevicePresenceEvent.EVENT_BLE_APPEARED;
-import static android.companion.DevicePresenceEvent.EVENT_BLE_DISAPPEARED;
-import static android.companion.DevicePresenceEvent.EVENT_BT_CONNECTED;
-import static android.companion.DevicePresenceEvent.EVENT_BT_DISCONNECTED;
-import static android.companion.DevicePresenceEvent.EVENT_SELF_MANAGED_APPEARED;
-import static android.companion.DevicePresenceEvent.EVENT_SELF_MANAGED_DISAPPEARED;
-import static android.companion.DevicePresenceEvent.NO_ASSOCIATION;
-import static android.os.Process.ROOT_UID;
-import static android.os.Process.SHELL_UID;
-
-import static com.android.server.companion.utils.PermissionsUtils.enforceCallerCanManageAssociationsForPackage;
-import static com.android.server.companion.utils.PermissionsUtils.enforceCallerCanObserveDevicePresenceByUuid;
-
-import android.annotation.NonNull;
-import android.annotation.SuppressLint;
-import android.annotation.TestApi;
-import android.annotation.UserIdInt;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.companion.AssociationInfo;
-import android.companion.DeviceNotAssociatedException;
-import android.companion.DevicePresenceEvent;
-import android.companion.ObservingDevicePresenceRequest;
-import android.content.Context;
-import android.hardware.power.Mode;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.ParcelUuid;
-import android.os.PowerManagerInternal;
-import android.os.RemoteException;
-import android.os.UserManager;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArray;
-import android.util.SparseBooleanArray;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.server.companion.association.AssociationStore;
-
-import java.io.PrintWriter;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Class responsible for monitoring companion devices' "presence" status (i.e.
- * connected/disconnected for Bluetooth devices; nearby or not for BLE devices).
- *
- * <p>
- * Should only be used by
- * {@link com.android.server.companion.CompanionDeviceManagerService CompanionDeviceManagerService}
- * to which it provides the following API:
- * <ul>
- * <li> {@link #onSelfManagedDeviceConnected(int)}
- * <li> {@link #onSelfManagedDeviceDisconnected(int)}
- * <li> {@link #isDevicePresent(int)}
- * </ul>
- */
-@SuppressLint("LongLogTag")
-public class DevicePresenceProcessor implements AssociationStore.OnChangeListener,
-        BluetoothCompanionDeviceConnectionListener.Callback, BleCompanionDeviceScanner.Callback {
-    static final boolean DEBUG = false;
-    private static final String TAG = "CDM_DevicePresenceProcessor";
-
-    @NonNull
-    private final Context mContext;
-    @NonNull
-    private final CompanionAppBinder mCompanionAppBinder;
-    @NonNull
-    private final AssociationStore mAssociationStore;
-    @NonNull
-    private final ObservableUuidStore mObservableUuidStore;
-    @NonNull
-    private final BluetoothCompanionDeviceConnectionListener mBtConnectionListener;
-    @NonNull
-    private final BleCompanionDeviceScanner mBleScanner;
-    @NonNull
-    private final PowerManagerInternal mPowerManagerInternal;
-
-    // NOTE: Same association may appear in more than one of the following sets at the same time.
-    // (E.g. self-managed devices that have MAC addresses, could be reported as present by their
-    // companion applications, while at the same be connected via BT, or detected nearby by BLE
-    // scanner)
-    @NonNull
-    private final Set<Integer> mConnectedBtDevices = new HashSet<>();
-    @NonNull
-    private final Set<Integer> mNearbyBleDevices = new HashSet<>();
-    @NonNull
-    private final Set<Integer> mReportedSelfManagedDevices = new HashSet<>();
-    @NonNull
-    private final Set<ParcelUuid> mConnectedUuidDevices = new HashSet<>();
-    @NonNull
-    @GuardedBy("mBtDisconnectedDevices")
-    private final Set<Integer> mBtDisconnectedDevices = new HashSet<>();
-
-    // A map to track device presence within 10 seconds of Bluetooth disconnection.
-    // The key is the association ID, and the boolean value indicates if the device
-    // was detected again within that time frame.
-    @GuardedBy("mBtDisconnectedDevices")
-    private final @NonNull SparseBooleanArray mBtDisconnectedDevicesBlePresence =
-            new SparseBooleanArray();
-
-    // Tracking "simulated" presence. Used for debugging and testing only.
-    private final @NonNull Set<Integer> mSimulated = new HashSet<>();
-    private final SimulatedDevicePresenceSchedulerHelper mSchedulerHelper =
-            new SimulatedDevicePresenceSchedulerHelper();
-
-    private final BleDeviceDisappearedScheduler mBleDeviceDisappearedScheduler =
-            new BleDeviceDisappearedScheduler();
-
-    public DevicePresenceProcessor(@NonNull Context context,
-            @NonNull CompanionAppBinder companionAppBinder,
-            UserManager userManager,
-            @NonNull AssociationStore associationStore,
-            @NonNull ObservableUuidStore observableUuidStore,
-            @NonNull PowerManagerInternal powerManagerInternal) {
-        mContext = context;
-        mCompanionAppBinder = companionAppBinder;
-        mAssociationStore = associationStore;
-        mObservableUuidStore = observableUuidStore;
-        mBtConnectionListener = new BluetoothCompanionDeviceConnectionListener(userManager,
-                associationStore, mObservableUuidStore,
-                /* BluetoothCompanionDeviceConnectionListener.Callback */ this);
-        mBleScanner = new BleCompanionDeviceScanner(associationStore,
-                /* BleCompanionDeviceScanner.Callback */ this);
-        mPowerManagerInternal = powerManagerInternal;
-    }
-
-    /** Initialize {@link DevicePresenceProcessor} */
-    public void init(Context context) {
-        if (DEBUG) Slog.i(TAG, "init()");
-
-        final BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
-        if (btAdapter != null) {
-            mBtConnectionListener.init(btAdapter);
-            mBleScanner.init(context, btAdapter);
-        } else {
-            Slog.w(TAG, "BluetoothAdapter is NOT available.");
-        }
-
-        mAssociationStore.registerLocalListener(this);
-    }
-
-    /**
-     * Process device presence start request.
-     */
-    public void startObservingDevicePresence(ObservingDevicePresenceRequest request,
-            String packageName, int userId) {
-        Slog.i(TAG,
-                "Start observing request=[" + request + "] for userId=[" + userId + "], package=["
-                        + packageName + "]...");
-        final ParcelUuid requestUuid = request.getUuid();
-
-        if (requestUuid != null) {
-            enforceCallerCanObserveDevicePresenceByUuid(mContext);
-
-            // If it's already being observed, then no-op.
-            if (mObservableUuidStore.isUuidBeingObserved(requestUuid, userId, packageName)) {
-                Slog.i(TAG, "UUID=[" + requestUuid + "], package=[" + packageName + "], userId=["
-                        + userId + "] is already being observed.");
-                return;
-            }
-
-            final ObservableUuid observableUuid = new ObservableUuid(userId, requestUuid,
-                    packageName, System.currentTimeMillis());
-            mObservableUuidStore.writeObservableUuid(userId, observableUuid);
-        } else {
-            final int associationId = request.getAssociationId();
-            AssociationInfo association = mAssociationStore.getAssociationWithCallerChecks(
-                    associationId);
-
-            // If it's already being observed, then no-op.
-            if (association.isNotifyOnDeviceNearby()) {
-                Slog.i(TAG, "Associated device id=[" + association.getId()
-                        + "] is already being observed. No-op.");
-                return;
-            }
-
-            association = (new AssociationInfo.Builder(association)).setNotifyOnDeviceNearby(true)
-                    .build();
-            mAssociationStore.updateAssociation(association);
-
-            // Send callback immediately if the device is present.
-            if (isDevicePresent(associationId)) {
-                Slog.i(TAG, "Device is already present. Triggering callback.");
-                if (isBlePresent(associationId)) {
-                    onDevicePresenceEvent(mNearbyBleDevices, associationId, EVENT_BLE_APPEARED);
-                } else if (isBtConnected(associationId)) {
-                    onDevicePresenceEvent(mConnectedBtDevices, associationId, EVENT_BT_CONNECTED);
-                } else if (isSimulatePresent(associationId)) {
-                    onDevicePresenceEvent(mSimulated, associationId, EVENT_BLE_APPEARED);
-                }
-            }
-        }
-
-        Slog.i(TAG, "Registered device presence listener.");
-    }
-
-    /**
-     * Process device presence stop request.
-     */
-    public void stopObservingDevicePresence(ObservingDevicePresenceRequest request,
-            String packageName, int userId) {
-        Slog.i(TAG,
-                "Stop observing request=[" + request + "] for userId=[" + userId + "], package=["
-                        + packageName + "]...");
-
-        final ParcelUuid requestUuid = request.getUuid();
-
-        if (requestUuid != null) {
-            enforceCallerCanObserveDevicePresenceByUuid(mContext);
-
-            if (!mObservableUuidStore.isUuidBeingObserved(requestUuid, userId, packageName)) {
-                Slog.i(TAG, "UUID=[" + requestUuid + "], package=[" + packageName + "], userId=["
-                        + userId + "] is already not being observed.");
-                return;
-            }
-
-            mObservableUuidStore.removeObservableUuid(userId, requestUuid, packageName);
-            removeCurrentConnectedUuidDevice(requestUuid);
-        } else {
-            final int associationId = request.getAssociationId();
-            AssociationInfo association = mAssociationStore.getAssociationWithCallerChecks(
-                    associationId);
-
-            // If it's already being observed, then no-op.
-            if (!association.isNotifyOnDeviceNearby()) {
-                Slog.i(TAG, "Associated device id=[" + association.getId()
-                        + "] is already not being observed. No-op.");
-                return;
-            }
-
-            association = (new AssociationInfo.Builder(association)).setNotifyOnDeviceNearby(false)
-                    .build();
-            mAssociationStore.updateAssociation(association);
-        }
-
-        Slog.i(TAG, "Unregistered device presence listener.");
-
-        // If last listener is unregistered, then unbind application.
-        if (!shouldBindPackage(userId, packageName)) {
-            mCompanionAppBinder.unbindCompanionApplication(userId, packageName);
-        }
-    }
-
-    /**
-     * For legacy device presence below Android V.
-     *
-     * @deprecated Use {@link #startObservingDevicePresence(ObservingDevicePresenceRequest, String,
-     *             int)}
-     */
-    @Deprecated
-    public void startObservingDevicePresence(int userId, String packageName, String deviceAddress)
-            throws RemoteException {
-        Slog.i(TAG,
-                "Start observing device=[" + deviceAddress + "] for userId=[" + userId
-                        + "], package=["
-                        + packageName + "]...");
-
-        enforceCallerCanManageAssociationsForPackage(mContext, userId, packageName, null);
-
-        AssociationInfo association = mAssociationStore.getFirstAssociationByAddress(userId,
-                packageName, deviceAddress);
-
-        if (association == null) {
-            throw new RemoteException(new DeviceNotAssociatedException("App " + packageName
-                    + " is not associated with device " + deviceAddress
-                    + " for user " + userId));
-        }
-
-        startObservingDevicePresence(
-                new ObservingDevicePresenceRequest.Builder().setAssociationId(association.getId())
-                        .build(), packageName, userId);
-    }
-
-    /**
-     * For legacy device presence below Android V.
-     *
-     * @deprecated Use {@link #stopObservingDevicePresence(ObservingDevicePresenceRequest, String,
-     *             int)}
-     */
-    @Deprecated
-    public void stopObservingDevicePresence(int userId, String packageName, String deviceAddress)
-            throws RemoteException {
-        Slog.i(TAG,
-                "Stop observing device=[" + deviceAddress + "] for userId=[" + userId
-                        + "], package=["
-                        + packageName + "]...");
-
-        enforceCallerCanManageAssociationsForPackage(mContext, userId, packageName, null);
-
-        AssociationInfo association = mAssociationStore.getFirstAssociationByAddress(userId,
-                packageName, deviceAddress);
-
-        if (association == null) {
-            throw new RemoteException(new DeviceNotAssociatedException("App " + packageName
-                    + " is not associated with device " + deviceAddress
-                    + " for user " + userId));
-        }
-
-        stopObservingDevicePresence(
-                new ObservingDevicePresenceRequest.Builder().setAssociationId(association.getId())
-                        .build(), packageName, userId);
-    }
-
-    /**
-     * @return whether the package should be bound (i.e. at least one of the devices associated with
-     * the package is currently present OR the UUID to be observed by this package is
-     * currently present).
-     */
-    private boolean shouldBindPackage(@UserIdInt int userId, @NonNull String packageName) {
-        final List<AssociationInfo> packageAssociations =
-                mAssociationStore.getActiveAssociationsByPackage(userId, packageName);
-        final List<ObservableUuid> observableUuids =
-                mObservableUuidStore.getObservableUuidsForPackage(userId, packageName);
-
-        for (AssociationInfo association : packageAssociations) {
-            if (!association.shouldBindWhenPresent()) continue;
-            if (isDevicePresent(association.getId())) return true;
-        }
-
-        for (ObservableUuid uuid : observableUuids) {
-            if (isDeviceUuidPresent(uuid.getUuid())) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Bind the system to the app if it's not bound.
-     *
-     * Set bindImportant to true when the association is self-managed to avoid the target service
-     * being killed.
-     */
-    private void bindApplicationIfNeeded(int userId, String packageName, boolean bindImportant) {
-        if (!mCompanionAppBinder.isCompanionApplicationBound(userId, packageName)) {
-            mCompanionAppBinder.bindCompanionApplication(
-                    userId, packageName, bindImportant, this::onBinderDied);
-        } else {
-            Slog.i(TAG,
-                    "UserId=[" + userId + "], packageName=[" + packageName + "] is already bound.");
-        }
-    }
-
-    /**
-     * @return current connected UUID devices.
-     */
-    public Set<ParcelUuid> getCurrentConnectedUuidDevices() {
-        return mConnectedUuidDevices;
-    }
-
-    /**
-     * Remove current connected UUID device.
-     */
-    public void removeCurrentConnectedUuidDevice(ParcelUuid uuid) {
-        mConnectedUuidDevices.remove(uuid);
-    }
-
-    /**
-     * @return whether the associated companion devices is present. I.e. device is nearby (for BLE);
-     * or devices is connected (for Bluetooth); or reported (by the application) to be
-     * nearby (for "self-managed" associations).
-     */
-    public boolean isDevicePresent(int associationId) {
-        return mReportedSelfManagedDevices.contains(associationId)
-                || mConnectedBtDevices.contains(associationId)
-                || mNearbyBleDevices.contains(associationId)
-                || mSimulated.contains(associationId);
-    }
-
-    /**
-     * @return whether the current uuid to be observed is present.
-     */
-    public boolean isDeviceUuidPresent(ParcelUuid uuid) {
-        return mConnectedUuidDevices.contains(uuid);
-    }
-
-    /**
-     * @return whether the current device is BT connected and had already reported to the app.
-     */
-
-    public boolean isBtConnected(int associationId) {
-        return mConnectedBtDevices.contains(associationId);
-    }
-
-    /**
-     * @return whether the current device in BLE range and had already reported to the app.
-     */
-    public boolean isBlePresent(int associationId) {
-        return mNearbyBleDevices.contains(associationId);
-    }
-
-    /**
-     * @return whether the current device had been already reported by the simulator.
-     */
-    public boolean isSimulatePresent(int associationId) {
-        return mSimulated.contains(associationId);
-    }
-
-    /**
-     * Marks a "self-managed" device as connected.
-     *
-     * <p>
-     * Must ONLY be invoked by the
-     * {@link com.android.server.companion.CompanionDeviceManagerService
-     * CompanionDeviceManagerService}
-     * when an application invokes
-     * {@link android.companion.CompanionDeviceManager#notifyDeviceAppeared(int)
-     * notifyDeviceAppeared()}
-     */
-    public void onSelfManagedDeviceConnected(int associationId) {
-        onDevicePresenceEvent(mReportedSelfManagedDevices,
-                associationId, EVENT_SELF_MANAGED_APPEARED);
-    }
-
-    /**
-     * Marks a "self-managed" device as disconnected.
-     *
-     * <p>
-     * Must ONLY be invoked by the
-     * {@link com.android.server.companion.CompanionDeviceManagerService
-     * CompanionDeviceManagerService}
-     * when an application invokes
-     * {@link android.companion.CompanionDeviceManager#notifyDeviceDisappeared(int)
-     * notifyDeviceDisappeared()}
-     */
-    public void onSelfManagedDeviceDisconnected(int associationId) {
-        onDevicePresenceEvent(mReportedSelfManagedDevices,
-                associationId, EVENT_SELF_MANAGED_DISAPPEARED);
-    }
-
-    /**
-     * Marks a "self-managed" device as disconnected when binderDied.
-     */
-    public void onSelfManagedDeviceReporterBinderDied(int associationId) {
-        onDevicePresenceEvent(mReportedSelfManagedDevices,
-                associationId, EVENT_SELF_MANAGED_DISAPPEARED);
-    }
-
-    @Override
-    public void onBluetoothCompanionDeviceConnected(int associationId) {
-        synchronized (mBtDisconnectedDevices) {
-            // A device is considered reconnected within 10 seconds if a pending BLE lost report is
-            // followed by a detected Bluetooth connection.
-            boolean isReconnected = mBtDisconnectedDevices.contains(associationId);
-            if (isReconnected) {
-                Slog.i(TAG, "Device ( " + associationId + " ) is reconnected within 10s.");
-                mBleDeviceDisappearedScheduler.unScheduleDeviceDisappeared(associationId);
-            }
-
-            Slog.i(TAG, "onBluetoothCompanionDeviceConnected: "
-                    + "associationId( " + associationId + " )");
-            onDevicePresenceEvent(mConnectedBtDevices, associationId, EVENT_BT_CONNECTED);
-
-            // Stop the BLE scan if all devices report BT connected status and BLE was present.
-            if (canStopBleScan()) {
-                mBleScanner.stopScanIfNeeded();
-            }
-
-        }
-    }
-
-    @Override
-    public void onBluetoothCompanionDeviceDisconnected(int associationId) {
-        Slog.i(TAG, "onBluetoothCompanionDeviceDisconnected "
-                + "associationId( " + associationId + " )");
-        // Start BLE scanning when the device is disconnected.
-        mBleScanner.startScan();
-
-        onDevicePresenceEvent(mConnectedBtDevices, associationId, EVENT_BT_DISCONNECTED);
-        // If current device is BLE present but BT is disconnected , means it will be
-        // potentially out of range later. Schedule BLE disappeared callback.
-        if (isBlePresent(associationId)) {
-            synchronized (mBtDisconnectedDevices) {
-                mBtDisconnectedDevices.add(associationId);
-            }
-            mBleDeviceDisappearedScheduler.scheduleBleDeviceDisappeared(associationId);
-        }
-    }
-
-
-    @Override
-    public void onBleCompanionDeviceFound(int associationId) {
-        onDevicePresenceEvent(mNearbyBleDevices, associationId, EVENT_BLE_APPEARED);
-        synchronized (mBtDisconnectedDevices) {
-            final boolean isCurrentPresent = mBtDisconnectedDevicesBlePresence.get(associationId);
-            if (mBtDisconnectedDevices.contains(associationId) && isCurrentPresent) {
-                mBleDeviceDisappearedScheduler.unScheduleDeviceDisappeared(associationId);
-            }
-        }
-    }
-
-    @Override
-    public void onBleCompanionDeviceLost(int associationId) {
-        onDevicePresenceEvent(mNearbyBleDevices, associationId, EVENT_BLE_DISAPPEARED);
-    }
-
-    /** FOR DEBUGGING AND/OR TESTING PURPOSES ONLY. */
-    @TestApi
-    public void simulateDeviceEvent(int associationId, int event) {
-        // IMPORTANT: this API should only be invoked via the
-        // 'companiondevice simulate-device-appeared' Shell command, so the only uid-s allowed to
-        // make this call are SHELL and ROOT.
-        // No other caller (including SYSTEM!) should be allowed.
-        enforceCallerShellOrRoot();
-        // Make sure the association exists.
-        enforceAssociationExists(associationId);
-
-        switch (event) {
-            case EVENT_BLE_APPEARED:
-                simulateDeviceAppeared(associationId, event);
-                break;
-            case EVENT_BT_CONNECTED:
-                onBluetoothCompanionDeviceConnected(associationId);
-                break;
-            case EVENT_BLE_DISAPPEARED:
-                simulateDeviceDisappeared(associationId, event);
-                break;
-            case EVENT_BT_DISCONNECTED:
-                onBluetoothCompanionDeviceDisconnected(associationId);
-                break;
-            default:
-                throw new IllegalArgumentException("Event: " + event + "is not supported");
-        }
-    }
-
-    /** FOR DEBUGGING AND/OR TESTING PURPOSES ONLY. */
-    @TestApi
-    public void simulateDeviceEventByUuid(ObservableUuid uuid, int event) {
-        // IMPORTANT: this API should only be invoked via the
-        // 'companiondevice simulate-device-uuid-events' Shell command, so the only uid-s allowed to
-        // make this call are SHELL and ROOT.
-        // No other caller (including SYSTEM!) should be allowed.
-        enforceCallerShellOrRoot();
-        onDevicePresenceEventByUuid(uuid, event);
-    }
-
-    private void simulateDeviceAppeared(int associationId, int state) {
-        onDevicePresenceEvent(mSimulated, associationId, state);
-        mSchedulerHelper.scheduleOnDeviceGoneCallForSimulatedDevicePresence(associationId);
-    }
-
-    private void simulateDeviceDisappeared(int associationId, int state) {
-        mSchedulerHelper.unscheduleOnDeviceGoneCallForSimulatedDevicePresence(associationId);
-        onDevicePresenceEvent(mSimulated, associationId, state);
-    }
-
-    private void enforceAssociationExists(int associationId) {
-        if (mAssociationStore.getAssociationById(associationId) == null) {
-            throw new IllegalArgumentException(
-                    "Association with id " + associationId + " does not exist.");
-        }
-    }
-
-    private void onDevicePresenceEvent(@NonNull Set<Integer> presentDevicesForSource,
-            int associationId, int eventType) {
-        Slog.i(TAG,
-                "onDevicePresenceEvent() id=[" + associationId + "], event=[" + eventType + "]...");
-
-        AssociationInfo association = mAssociationStore.getAssociationById(associationId);
-        if (association == null) {
-            Slog.e(TAG, "Association doesn't exist.");
-            return;
-        }
-
-        final int userId = association.getUserId();
-        final String packageName = association.getPackageName();
-        final DevicePresenceEvent event = new DevicePresenceEvent(associationId, eventType, null);
-
-        if (eventType == EVENT_BLE_APPEARED) {
-            synchronized (mBtDisconnectedDevices) {
-                // If a BLE device is detected within 10 seconds after BT is disconnected,
-                // flag it as BLE is present.
-                if (mBtDisconnectedDevices.contains(associationId)) {
-                    Slog.i(TAG, "Device ( " + associationId + " ) is present,"
-                            + " do not need to send the callback with event ( "
-                            + EVENT_BLE_APPEARED + " ).");
-                    mBtDisconnectedDevicesBlePresence.append(associationId, true);
-                }
-            }
-        }
-
-        switch (eventType) {
-            case EVENT_BLE_APPEARED:
-            case EVENT_BT_CONNECTED:
-            case EVENT_SELF_MANAGED_APPEARED:
-                final boolean added = presentDevicesForSource.add(associationId);
-                if (!added) {
-                    Slog.w(TAG, "The association is already present.");
-                }
-
-                if (association.shouldBindWhenPresent()) {
-                    bindApplicationIfNeeded(userId, packageName, association.isSelfManaged());
-                } else {
-                    return;
-                }
-
-                if (association.isSelfManaged() || added) {
-                    notifyDevicePresenceEvent(userId, packageName, event);
-                    // Also send the legacy callback.
-                    legacyNotifyDevicePresenceEvent(association, true);
-                }
-                break;
-            case EVENT_BLE_DISAPPEARED:
-            case EVENT_BT_DISCONNECTED:
-            case EVENT_SELF_MANAGED_DISAPPEARED:
-                final boolean removed = presentDevicesForSource.remove(associationId);
-                if (!removed) {
-                    Slog.w(TAG, "The association is already NOT present.");
-                }
-
-                if (!mCompanionAppBinder.isCompanionApplicationBound(userId, packageName)) {
-                    Slog.e(TAG, "Package is not bound");
-                    return;
-                }
-
-                if (association.isSelfManaged() || removed) {
-                    notifyDevicePresenceEvent(userId, packageName, event);
-                    // Also send the legacy callback.
-                    legacyNotifyDevicePresenceEvent(association, false);
-                }
-
-                // Check if there are other devices associated to the app that are present.
-                if (!shouldBindPackage(userId, packageName)) {
-                    mCompanionAppBinder.unbindCompanionApplication(userId, packageName);
-                }
-                break;
-            default:
-                Slog.e(TAG, "Event: " + eventType + " is not supported.");
-                break;
-        }
-    }
-
-    @Override
-    public void onDevicePresenceEventByUuid(ObservableUuid uuid, int eventType) {
-        Slog.i(TAG, "onDevicePresenceEventByUuid ObservableUuid=[" + uuid + "], event=[" + eventType
-                + "]...");
-
-        final ParcelUuid parcelUuid = uuid.getUuid();
-        final String packageName = uuid.getPackageName();
-        final int userId = uuid.getUserId();
-        final DevicePresenceEvent event = new DevicePresenceEvent(NO_ASSOCIATION, eventType,
-                parcelUuid);
-
-        switch (eventType) {
-            case EVENT_BT_CONNECTED:
-                boolean added = mConnectedUuidDevices.add(parcelUuid);
-                if (!added) {
-                    Slog.w(TAG, "This device is already connected.");
-                }
-
-                bindApplicationIfNeeded(userId, packageName, false);
-
-                notifyDevicePresenceEvent(userId, packageName, event);
-                break;
-            case EVENT_BT_DISCONNECTED:
-                final boolean removed = mConnectedUuidDevices.remove(parcelUuid);
-                if (!removed) {
-                    Slog.w(TAG, "This device is already disconnected.");
-                    return;
-                }
-
-                if (!mCompanionAppBinder.isCompanionApplicationBound(userId, packageName)) {
-                    Slog.e(TAG, "Package is not bound.");
-                    return;
-                }
-
-                notifyDevicePresenceEvent(userId, packageName, event);
-
-                if (!shouldBindPackage(userId, packageName)) {
-                    mCompanionAppBinder.unbindCompanionApplication(userId, packageName);
-                }
-                break;
-            default:
-                Slog.e(TAG, "Event: " + eventType + " is not supported");
-                break;
-        }
-    }
-
-    /**
-     * Notify device presence event to the app.
-     *
-     * @deprecated Use {@link #notifyDevicePresenceEvent(int, String, DevicePresenceEvent)} instead.
-     */
-    @Deprecated
-    private void legacyNotifyDevicePresenceEvent(AssociationInfo association,
-            boolean isAppeared) {
-        Slog.i(TAG, "legacyNotifyDevicePresenceEvent() association=[" + association.toShortString()
-                + "], isAppeared=[" + isAppeared + "]");
-
-        final int userId = association.getUserId();
-        final String packageName = association.getPackageName();
-
-        final CompanionServiceConnector primaryServiceConnector =
-                mCompanionAppBinder.getPrimaryServiceConnector(userId, packageName);
-        if (primaryServiceConnector == null) {
-            Slog.e(TAG, "Package is not bound.");
-            return;
-        }
-
-        if (isAppeared) {
-            primaryServiceConnector.postOnDeviceAppeared(association);
-        } else {
-            primaryServiceConnector.postOnDeviceDisappeared(association);
-        }
-    }
-
-    /**
-     * Notify the device presence event to the app.
-     */
-    private void notifyDevicePresenceEvent(int userId, String packageName,
-            DevicePresenceEvent event) {
-        Slog.i(TAG,
-                "notifyCompanionDevicePresenceEvent userId=[" + userId + "], packageName=["
-                        + packageName + "], event=[" + event + "]...");
-
-        final CompanionServiceConnector primaryServiceConnector =
-                mCompanionAppBinder.getPrimaryServiceConnector(userId, packageName);
-
-        if (primaryServiceConnector == null) {
-            Slog.e(TAG, "Package is NOT bound.");
-            return;
-        }
-
-        primaryServiceConnector.postOnDevicePresenceEvent(event);
-    }
-
-    /**
-     * Notify the self-managed device presence event to the app.
-     */
-    public void notifySelfManagedDevicePresenceEvent(int associationId, boolean isAppeared) {
-        Slog.i(TAG, "notifySelfManagedDeviceAppeared() id=" + associationId);
-
-        AssociationInfo association = mAssociationStore.getAssociationWithCallerChecks(
-                associationId);
-        if (!association.isSelfManaged()) {
-            throw new IllegalArgumentException("Association id=[" + associationId
-                    + "] is not self-managed.");
-        }
-        // AssociationInfo class is immutable: create a new AssociationInfo object with updated
-        // timestamp.
-        association = (new AssociationInfo.Builder(association))
-                .setLastTimeConnected(System.currentTimeMillis())
-                .build();
-        mAssociationStore.updateAssociation(association);
-
-        if (isAppeared) {
-            onSelfManagedDeviceConnected(associationId);
-        } else {
-            onSelfManagedDeviceDisconnected(associationId);
-        }
-
-        final String deviceProfile = association.getDeviceProfile();
-        if (DEVICE_PROFILE_AUTOMOTIVE_PROJECTION.equals(deviceProfile)) {
-            Slog.i(TAG, "Enable hint mode for device device profile: " + deviceProfile);
-            mPowerManagerInternal.setPowerMode(Mode.AUTOMOTIVE_PROJECTION, isAppeared);
-        }
-    }
-
-    private void onBinderDied(@UserIdInt int userId, @NonNull String packageName,
-            @NonNull CompanionServiceConnector serviceConnector) {
-
-        boolean isPrimary = serviceConnector.isPrimary();
-        Slog.i(TAG, "onBinderDied() u" + userId + "/" + packageName + " isPrimary: " + isPrimary);
-
-        // First, disable hint mode for Auto profile and mark not BOUND for primary service ONLY.
-        if (isPrimary) {
-            final List<AssociationInfo> associations =
-                    mAssociationStore.getActiveAssociationsByPackage(userId, packageName);
-
-            for (AssociationInfo association : associations) {
-                final String deviceProfile = association.getDeviceProfile();
-                if (DEVICE_PROFILE_AUTOMOTIVE_PROJECTION.equals(deviceProfile)) {
-                    Slog.i(TAG, "Disable hint mode for device profile: " + deviceProfile);
-                    mPowerManagerInternal.setPowerMode(Mode.AUTOMOTIVE_PROJECTION, false);
-                    break;
-                }
-            }
-
-            mCompanionAppBinder.removePackage(userId, packageName);
-        }
-
-        // Second: schedule rebinding if needed.
-        final boolean shouldScheduleRebind = shouldScheduleRebind(userId, packageName, isPrimary);
-
-        if (shouldScheduleRebind) {
-            mCompanionAppBinder.scheduleRebinding(userId, packageName, serviceConnector);
-        }
-    }
-
-    /**
-     * Check if the system should rebind the self-managed secondary services
-     * OR non-self-managed services.
-     */
-    private boolean shouldScheduleRebind(int userId, String packageName, boolean isPrimary) {
-        // Make sure do not schedule rebind for the case ServiceConnector still gets callback after
-        // app is uninstalled.
-        boolean stillAssociated = false;
-        // Make sure to clean up the state for all the associations
-        // that associate with this package.
-        boolean shouldScheduleRebind = false;
-        boolean shouldScheduleRebindForUuid = false;
-        final List<ObservableUuid> uuids =
-                mObservableUuidStore.getObservableUuidsForPackage(userId, packageName);
-
-        for (AssociationInfo ai :
-                mAssociationStore.getActiveAssociationsByPackage(userId, packageName)) {
-            final int associationId = ai.getId();
-            stillAssociated = true;
-            if (ai.isSelfManaged()) {
-                // Do not rebind if primary one is died for selfManaged application.
-                if (isPrimary && isDevicePresent(associationId)) {
-                    onSelfManagedDeviceReporterBinderDied(associationId);
-                    shouldScheduleRebind = false;
-                }
-                // Do not rebind if both primary and secondary services are died for
-                // selfManaged application.
-                shouldScheduleRebind = mCompanionAppBinder.isCompanionApplicationBound(userId,
-                        packageName);
-            } else if (ai.isNotifyOnDeviceNearby()) {
-                // Always rebind for non-selfManaged devices.
-                shouldScheduleRebind = true;
-            }
-        }
-
-        for (ObservableUuid uuid : uuids) {
-            if (isDeviceUuidPresent(uuid.getUuid())) {
-                shouldScheduleRebindForUuid = true;
-                break;
-            }
-        }
-
-        return (stillAssociated && shouldScheduleRebind) || shouldScheduleRebindForUuid;
-    }
-
-    /**
-     * Implements
-     * {@link AssociationStore.OnChangeListener#onAssociationRemoved(AssociationInfo)}
-     */
-    @Override
-    public void onAssociationRemoved(@NonNull AssociationInfo association) {
-        final int id = association.getId();
-        if (DEBUG) {
-            Log.i(TAG, "onAssociationRemoved() id=" + id);
-            Log.d(TAG, "  > association=" + association);
-        }
-
-        mConnectedBtDevices.remove(id);
-        mNearbyBleDevices.remove(id);
-        mReportedSelfManagedDevices.remove(id);
-        mSimulated.remove(id);
-        synchronized (mBtDisconnectedDevices) {
-            mBtDisconnectedDevices.remove(id);
-            mBtDisconnectedDevicesBlePresence.delete(id);
-        }
-
-        // Do NOT call mCallback.onDeviceDisappeared()!
-        // CompanionDeviceManagerService will know that the association is removed, and will do
-        // what's needed.
-    }
-
-    /**
-     * Return a set of devices that pending to report connectivity
-     */
-    public SparseArray<Set<BluetoothDevice>> getPendingConnectedDevices() {
-        synchronized (mBtConnectionListener.mPendingConnectedDevices) {
-            return mBtConnectionListener.mPendingConnectedDevices;
-        }
-    }
-
-    private static void enforceCallerShellOrRoot() {
-        final int callingUid = Binder.getCallingUid();
-        if (callingUid == SHELL_UID || callingUid == ROOT_UID) return;
-
-        throw new SecurityException("Caller is neither Shell nor Root");
-    }
-
-    /**
-     * The BLE scan can be only stopped if all the devices have been reported
-     * BT connected and BLE presence and are not pending to report BLE lost.
-     */
-    private boolean canStopBleScan() {
-        for (AssociationInfo ai : mAssociationStore.getActiveAssociations()) {
-            int id = ai.getId();
-            synchronized (mBtDisconnectedDevices) {
-                if (ai.isNotifyOnDeviceNearby() && !(isBtConnected(id)
-                        && isBlePresent(id) && mBtDisconnectedDevices.isEmpty())) {
-                    Slog.i(TAG, "The BLE scan cannot be stopped, "
-                            + "device( " + id + " ) is not yet connected "
-                            + "OR the BLE is not current present Or is pending to report BLE lost");
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Dumps system information about devices that are marked as "present".
-     */
-    public void dump(@NonNull PrintWriter out) {
-        out.append("Companion Device Present: ");
-        if (mConnectedBtDevices.isEmpty()
-                && mNearbyBleDevices.isEmpty()
-                && mReportedSelfManagedDevices.isEmpty()) {
-            out.append("<empty>\n");
-            return;
-        } else {
-            out.append("\n");
-        }
-
-        out.append("  Connected Bluetooth Devices: ");
-        if (mConnectedBtDevices.isEmpty()) {
-            out.append("<empty>\n");
-        } else {
-            out.append("\n");
-            for (int associationId : mConnectedBtDevices) {
-                AssociationInfo a = mAssociationStore.getAssociationById(associationId);
-                out.append("    ").append(a.toShortString()).append('\n');
-            }
-        }
-
-        out.append("  Nearby BLE Devices: ");
-        if (mNearbyBleDevices.isEmpty()) {
-            out.append("<empty>\n");
-        } else {
-            out.append("\n");
-            for (int associationId : mNearbyBleDevices) {
-                AssociationInfo a = mAssociationStore.getAssociationById(associationId);
-                out.append("    ").append(a.toShortString()).append('\n');
-            }
-        }
-
-        out.append("  Self-Reported Devices: ");
-        if (mReportedSelfManagedDevices.isEmpty()) {
-            out.append("<empty>\n");
-        } else {
-            out.append("\n");
-            for (int associationId : mReportedSelfManagedDevices) {
-                AssociationInfo a = mAssociationStore.getAssociationById(associationId);
-                out.append("    ").append(a.toShortString()).append('\n');
-            }
-        }
-    }
-
-    private class SimulatedDevicePresenceSchedulerHelper extends Handler {
-        SimulatedDevicePresenceSchedulerHelper() {
-            super(Looper.getMainLooper());
-        }
-
-        void scheduleOnDeviceGoneCallForSimulatedDevicePresence(int associationId) {
-            // First, unschedule if it was scheduled previously.
-            if (hasMessages(/* what */ associationId)) {
-                removeMessages(/* what */ associationId);
-            }
-
-            sendEmptyMessageDelayed(/* what */ associationId, 60 * 1000 /* 60 seconds */);
-        }
-
-        void unscheduleOnDeviceGoneCallForSimulatedDevicePresence(int associationId) {
-            removeMessages(/* what */ associationId);
-        }
-
-        @Override
-        public void handleMessage(@NonNull Message msg) {
-            final int associationId = msg.what;
-            if (mSimulated.contains(associationId)) {
-                onDevicePresenceEvent(mSimulated, associationId, EVENT_BLE_DISAPPEARED);
-            }
-        }
-    }
-
-    private class BleDeviceDisappearedScheduler extends Handler {
-        BleDeviceDisappearedScheduler() {
-            super(Looper.getMainLooper());
-        }
-
-        void scheduleBleDeviceDisappeared(int associationId) {
-            if (hasMessages(associationId)) {
-                removeMessages(associationId);
-            }
-            Slog.i(TAG, "scheduleBleDeviceDisappeared for Device: ( " + associationId + " ).");
-            sendEmptyMessageDelayed(associationId, 10 * 1000 /* 10 seconds */);
-        }
-
-        void unScheduleDeviceDisappeared(int associationId) {
-            if (hasMessages(associationId)) {
-                Slog.i(TAG, "unScheduleDeviceDisappeared for Device( " + associationId + " )");
-                synchronized (mBtDisconnectedDevices) {
-                    mBtDisconnectedDevices.remove(associationId);
-                    mBtDisconnectedDevicesBlePresence.delete(associationId);
-                }
-
-                removeMessages(associationId);
-            }
-        }
-
-        @Override
-        public void handleMessage(@NonNull Message msg) {
-            final int associationId = msg.what;
-            synchronized (mBtDisconnectedDevices) {
-                final boolean isCurrentPresent = mBtDisconnectedDevicesBlePresence.get(
-                        associationId);
-                // If a device hasn't reported after 10 seconds and is not currently present,
-                // assume BLE is lost and trigger the onDeviceEvent callback with the
-                // EVENT_BLE_DISAPPEARED event.
-                if (mBtDisconnectedDevices.contains(associationId)
-                        && !isCurrentPresent) {
-                    Slog.i(TAG, "Device ( " + associationId + " ) is likely BLE out of range, "
-                            + "sending callback with event ( " + EVENT_BLE_DISAPPEARED + " )");
-                    onDevicePresenceEvent(mNearbyBleDevices, associationId, EVENT_BLE_DISAPPEARED);
-                }
-
-                mBtDisconnectedDevices.remove(associationId);
-                mBtDisconnectedDevicesBlePresence.delete(associationId);
-            }
-        }
-    }
-}
diff --git a/services/companion/java/com/android/server/companion/presence/ObservableUuid.java b/services/companion/java/com/android/server/companion/presence/ObservableUuid.java
deleted file mode 100644
index 9cfa270..0000000
--- a/services/companion/java/com/android/server/companion/presence/ObservableUuid.java
+++ /dev/null
@@ -1,54 +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.companion.presence;
-
-import android.annotation.NonNull;
-import android.annotation.UserIdInt;
-import android.os.ParcelUuid;
-
-public class ObservableUuid {
-    private final int mUserId;
-    private final String mPackageName;
-
-    private final ParcelUuid mUuid;
-
-    private final long mTimeApprovedMs;
-
-    public ObservableUuid(@UserIdInt int userId, @NonNull ParcelUuid uuid,
-            @NonNull String packageName, Long timeApprovedMs) {
-        mUserId = userId;
-        mUuid = uuid;
-        mPackageName = packageName;
-        mTimeApprovedMs = timeApprovedMs;
-    }
-
-    public int getUserId() {
-        return mUserId;
-    }
-
-    public ParcelUuid getUuid() {
-        return mUuid;
-    }
-
-    public String getPackageName() {
-        return mPackageName;
-    }
-
-    public long getTimeApprovedMs() {
-        return mTimeApprovedMs;
-    }
-}
diff --git a/services/companion/java/com/android/server/companion/presence/ObservableUuidStore.java b/services/companion/java/com/android/server/companion/presence/ObservableUuidStore.java
deleted file mode 100644
index fa0f6bd..0000000
--- a/services/companion/java/com/android/server/companion/presence/ObservableUuidStore.java
+++ /dev/null
@@ -1,317 +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.companion.presence;
-
-import static com.android.internal.util.XmlUtils.readIntAttribute;
-import static com.android.internal.util.XmlUtils.readLongAttribute;
-import static com.android.internal.util.XmlUtils.readStringAttribute;
-import static com.android.internal.util.XmlUtils.writeIntAttribute;
-import static com.android.internal.util.XmlUtils.writeLongAttribute;
-import static com.android.internal.util.XmlUtils.writeStringAttribute;
-import static com.android.server.companion.utils.DataStoreUtils.createStorageFileForUser;
-import static com.android.server.companion.utils.DataStoreUtils.isEndOfTag;
-import static com.android.server.companion.utils.DataStoreUtils.isStartOfTag;
-import static com.android.server.companion.utils.DataStoreUtils.writeToFileSafely;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.UserIdInt;
-import android.os.ParcelUuid;
-import android.util.AtomicFile;
-import android.util.Slog;
-import android.util.SparseArray;
-import android.util.Xml;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.util.XmlUtils;
-import com.android.modules.utils.TypedXmlPullParser;
-import com.android.modules.utils.TypedXmlSerializer;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * This store manages the cache and disk data for observable uuids.
- */
-public class ObservableUuidStore {
-    private static final String TAG = "CDM_ObservableUuidStore";
-    private static final String FILE_NAME = "observing_uuids_presence.xml";
-    private static final String XML_TAG_UUIDS = "uuids";
-    private static final String XML_TAG_UUID = "uuid";
-    private static final String XML_ATTR_UUID = "uuid";
-    private static final String XML_ATTR_TIME_APPROVED = "time_approved";
-    private static final String XML_ATTR_USER_ID = "user_id";
-    private static final String XML_ATTR_PACKAGE = "package_name";
-    private static final int READ_FROM_DISK_TIMEOUT = 5; // in seconds
-
-
-    private final ExecutorService mExecutor;
-    private final ConcurrentMap<Integer, AtomicFile> mUserIdToStorageFile =
-            new ConcurrentHashMap<>();
-
-    private final Object mLock = new Object();
-
-    @GuardedBy("mLock")
-    private final SparseArray<List<ObservableUuid>> mCachedPerUser =
-            new SparseArray<>();
-
-    public ObservableUuidStore() {
-        mExecutor = Executors.newSingleThreadExecutor();
-    }
-
-    /**
-     * Remove the observable uuid.
-     */
-    public void removeObservableUuid(@UserIdInt int userId, ParcelUuid uuid, String packageName) {
-        Slog.i(TAG, "Removing uuid=[" + uuid.getUuid() + "] from store...");
-
-        List<ObservableUuid> cachedObservableUuids;
-
-        synchronized (mLock) {
-            // Remove requests from cache
-            cachedObservableUuids = readObservableUuidsFromCache(userId);
-            cachedObservableUuids.removeIf(
-                    uuid1 -> uuid1.getPackageName().equals(packageName)
-                            && uuid1.getUuid().equals(uuid));
-            mCachedPerUser.set(userId, cachedObservableUuids);
-        }
-        // Remove requests from store
-        mExecutor.execute(() -> writeObservableUuidToStore(userId, cachedObservableUuids));
-    }
-
-    /**
-     * Write the observable uuid.
-     */
-    public void writeObservableUuid(@UserIdInt int userId, ObservableUuid uuid) {
-        Slog.i(TAG, "Writing uuid=[" + uuid.getUuid() + "] to store...");
-
-        List<ObservableUuid> cachedObservableUuids;
-        synchronized (mLock) {
-            // Write to cache
-            cachedObservableUuids = readObservableUuidsFromCache(userId);
-            cachedObservableUuids.removeIf(uuid1 -> uuid1.getUuid().equals(
-                    uuid.getUuid()) && uuid1.getPackageName().equals(uuid.getPackageName()));
-            cachedObservableUuids.add(uuid);
-            mCachedPerUser.set(userId, cachedObservableUuids);
-        }
-        // Write to store
-        mExecutor.execute(() -> writeObservableUuidToStore(userId, cachedObservableUuids));
-    }
-
-    private void writeObservableUuidToStore(@UserIdInt int userId,
-            @NonNull List<ObservableUuid> cachedObservableUuids) {
-        final AtomicFile file = getStorageFileForUser(userId);
-        Slog.i(TAG, "Writing ObservableUuid for user " + userId + " to file="
-                + file.getBaseFile().getPath());
-
-        // getStorageFileForUser() ALWAYS returns the SAME OBJECT, which allows us to synchronize
-        // accesses to the file on the file system using this AtomicFile object.
-        synchronized (file) {
-            writeToFileSafely(file, out -> {
-                final TypedXmlSerializer serializer = Xml.resolveSerializer(out);
-                serializer.setFeature(
-                        "http://xmlpull.org/v1/doc/features.html#indent-output", true);
-                serializer.startDocument(null, true);
-                writeObservableUuidToXml(serializer, cachedObservableUuids);
-                serializer.endDocument();
-            });
-        }
-    }
-
-    private void writeObservableUuidToXml(@NonNull TypedXmlSerializer serializer,
-            @Nullable Collection<ObservableUuid> uuids) throws IOException {
-        serializer.startTag(null, XML_TAG_UUIDS);
-
-        for (ObservableUuid uuid : uuids) {
-            writeUuidToXml(serializer, uuid);
-        }
-
-        serializer.endTag(null, XML_TAG_UUIDS);
-    }
-
-    private void writeUuidToXml(@NonNull TypedXmlSerializer serializer,
-            @NonNull ObservableUuid uuid) throws IOException {
-        serializer.startTag(null, XML_TAG_UUID);
-
-        writeIntAttribute(serializer, XML_ATTR_USER_ID, uuid.getUserId());
-        writeStringAttribute(serializer, XML_ATTR_UUID, uuid.getUuid().toString());
-        writeStringAttribute(serializer, XML_ATTR_PACKAGE, uuid.getPackageName());
-        writeLongAttribute(serializer, XML_ATTR_TIME_APPROVED, uuid.getTimeApprovedMs());
-
-        serializer.endTag(null, XML_TAG_UUID);
-    }
-
-    /**
-     * Read the observable UUIDs from the cache.
-     */
-    @GuardedBy("mLock")
-    private List<ObservableUuid> readObservableUuidsFromCache(@UserIdInt int userId) {
-        List<ObservableUuid> cachedObservableUuids = mCachedPerUser.get(userId);
-        if (cachedObservableUuids == null) {
-            Future<List<ObservableUuid>> future =
-                    mExecutor.submit(() -> readObservableUuidFromStore(userId));
-            try {
-                cachedObservableUuids = future.get(READ_FROM_DISK_TIMEOUT, TimeUnit.SECONDS);
-            } catch (InterruptedException e) {
-                Slog.e(TAG, "Thread reading ObservableUuid from disk is "
-                        + "interrupted.");
-            } catch (ExecutionException e) {
-                Slog.e(TAG, "Error occurred while reading ObservableUuid "
-                        + "from disk.");
-            } catch (TimeoutException e) {
-                Slog.e(TAG, "Reading ObservableUuid from disk timed out.");
-            }
-            mCachedPerUser.set(userId, cachedObservableUuids);
-        }
-        return cachedObservableUuids;
-    }
-
-    /**
-     * Reads previously persisted data for the given user
-     *
-     * @param userId Android UserID
-     * @return a list of ObservableUuid
-     */
-    @NonNull
-    public List<ObservableUuid> readObservableUuidFromStore(@UserIdInt int userId) {
-        final AtomicFile file = getStorageFileForUser(userId);
-        Slog.i(TAG, "Reading ObservableUuid for user " + userId + " from "
-                + "file=" + file.getBaseFile().getPath());
-
-        // getStorageFileForUser() ALWAYS returns the SAME OBJECT, which allows us to synchronize
-        // accesses to the file on the file system using this AtomicFile object.
-        synchronized (file) {
-            if (!file.getBaseFile().exists()) {
-                Slog.d(TAG, "File does not exist -> Abort");
-                return new ArrayList<>();
-            }
-            try (FileInputStream in = file.openRead()) {
-                final TypedXmlPullParser parser = Xml.resolvePullParser(in);
-                XmlUtils.beginDocument(parser, XML_TAG_UUIDS);
-
-                return readObservableUuidFromXml(parser);
-            } catch (XmlPullParserException | IOException e) {
-                Slog.e(TAG, "Error while reading requests file", e);
-                return new ArrayList<>();
-            }
-        }
-    }
-
-    @NonNull
-    private List<ObservableUuid> readObservableUuidFromXml(
-            @NonNull TypedXmlPullParser parser) throws XmlPullParserException, IOException {
-        if (!isStartOfTag(parser, XML_TAG_UUIDS)) {
-            throw new XmlPullParserException("The XML doesn't have start tag: " + XML_TAG_UUIDS);
-        }
-
-        List<ObservableUuid> observableUuids = new ArrayList<>();
-
-        while (true) {
-            parser.nextTag();
-            if (isEndOfTag(parser, XML_TAG_UUIDS)) {
-                break;
-            }
-            if (isStartOfTag(parser, XML_TAG_UUID)) {
-                observableUuids.add(readUuidFromXml(parser));
-            }
-        }
-
-        return observableUuids;
-    }
-
-    private ObservableUuid readUuidFromXml(@NonNull TypedXmlPullParser parser)
-            throws XmlPullParserException, IOException {
-        if (!isStartOfTag(parser, XML_TAG_UUID)) {
-            throw new XmlPullParserException("XML doesn't have start tag: " + XML_TAG_UUID);
-        }
-
-        final int userId = readIntAttribute(parser, XML_ATTR_USER_ID);
-        final ParcelUuid uuid = ParcelUuid.fromString(readStringAttribute(parser, XML_ATTR_UUID));
-        final String packageName = readStringAttribute(parser, XML_ATTR_PACKAGE);
-        final Long timeApproved = readLongAttribute(parser, XML_ATTR_TIME_APPROVED);
-
-        return new ObservableUuid(userId, uuid, packageName, timeApproved);
-    }
-
-    /**
-     * Creates and caches {@link AtomicFile} object that represents the back-up file for the given
-     * user.
-     * <p>
-     * IMPORTANT: the method will ALWAYS return the same {@link AtomicFile} object, which makes it
-     * possible to synchronize reads and writes to the file using the returned object.
-     */
-    @NonNull
-    private AtomicFile getStorageFileForUser(@UserIdInt int userId) {
-        return mUserIdToStorageFile.computeIfAbsent(userId,
-                u -> createStorageFileForUser(userId, FILE_NAME));
-    }
-
-    /**
-     * @return A list of ObservableUuids per package.
-     */
-    public List<ObservableUuid> getObservableUuidsForPackage(
-            @UserIdInt int userId, @NonNull String packageName) {
-        final List<ObservableUuid> uuidsTobeObservedPerPackage = new ArrayList<>();
-        synchronized (mLock) {
-            final List<ObservableUuid> uuids = readObservableUuidsFromCache(userId);
-
-            for (ObservableUuid uuid : uuids) {
-                if (uuid.getPackageName().equals(packageName)) {
-                    uuidsTobeObservedPerPackage.add(uuid);
-                }
-            }
-        }
-
-        return uuidsTobeObservedPerPackage;
-    }
-
-    /**
-     * @return A list of ObservableUuids per user.
-     */
-    public List<ObservableUuid> getObservableUuidsForUser(@UserIdInt int userId) {
-        synchronized (mLock) {
-            return readObservableUuidsFromCache(userId);
-        }
-    }
-
-    /**
-     * Check if a UUID is being observed by the package.
-     */
-    public boolean isUuidBeingObserved(ParcelUuid uuid, int userId, String packageName) {
-        final List<ObservableUuid> uuidsBeingObserved = getObservableUuidsForPackage(userId,
-                packageName);
-        for (ObservableUuid observableUuid : uuidsBeingObserved) {
-            if (observableUuid.getUuid().equals(uuid)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/services/companion/java/com/android/server/companion/utils/PackageUtils.java b/services/companion/java/com/android/server/companion/utils/PackageUtils.java
index 81dc36d..254d28b 100644
--- a/services/companion/java/com/android/server/companion/utils/PackageUtils.java
+++ b/services/companion/java/com/android/server/companion/utils/PackageUtils.java
@@ -241,7 +241,7 @@
             final int mode = context.getSystemService(AppOpsManager.class).noteOpNoThrow(
                     AppOpsManager.OP_ACCESS_RESTRICTED_SETTINGS, uid,
                     packageName, /* attributionTag= */ null, /* message= */ null);
-            return mode == AppOpsManager.MODE_ALLOWED;
+            return mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_DEFAULT;
         }
     }
 }
diff --git a/services/companion/java/com/android/server/companion/utils/PermissionsUtils.java b/services/companion/java/com/android/server/companion/utils/PermissionsUtils.java
index d7e766ee..f397814 100644
--- a/services/companion/java/com/android/server/companion/utils/PermissionsUtils.java
+++ b/services/companion/java/com/android/server/companion/utils/PermissionsUtils.java
@@ -16,6 +16,8 @@
 
 package com.android.server.companion.utils;
 
+import static android.Manifest.permission.BLUETOOTH_CONNECT;
+import static android.Manifest.permission.BLUETOOTH_SCAN;
 import static android.Manifest.permission.INTERACT_ACROSS_USERS;
 import static android.Manifest.permission.MANAGE_COMPANION_DEVICES;
 import static android.Manifest.permission.REQUEST_COMPANION_SELF_MANAGED;
@@ -209,7 +211,9 @@
      */
     public static void enforceCallerCanObserveDevicePresenceByUuid(@NonNull Context context) {
         if (context.checkCallingPermission(REQUEST_OBSERVE_DEVICE_UUID_PRESENCE)
-                != PERMISSION_GRANTED) {
+                != PERMISSION_GRANTED
+                || context.checkCallingPermission(BLUETOOTH_SCAN) != PERMISSION_GRANTED
+                || context.checkCallingPermission(BLUETOOTH_CONNECT) != PERMISSION_GRANTED) {
             throw new SecurityException("Caller (uid=" + getCallingUid() + ") does not have "
                     + "permissions to request observing device presence base on the UUID");
         }
diff --git a/services/companion/java/com/android/server/companion/virtual/Android.bp b/services/companion/java/com/android/server/companion/virtual/Android.bp
index 4a2030f..66313e6 100644
--- a/services/companion/java/com/android/server/companion/virtual/Android.bp
+++ b/services/companion/java/com/android/server/companion/virtual/Android.bp
@@ -10,6 +10,7 @@
 aconfig_declarations {
     name: "virtualdevice_flags",
     package: "com.android.server.companion.virtual",
+    container: "system",
     srcs: [
         "flags.aconfig",
     ],
diff --git a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
index 9e3f5ce..23373f1 100644
--- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
+++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
@@ -28,6 +28,7 @@
 import android.app.WindowConfiguration;
 import android.app.compat.CompatChanges;
 import android.companion.virtual.VirtualDeviceManager.ActivityListener;
+import android.companion.virtual.flags.Flags;
 import android.compat.annotation.ChangeId;
 import android.compat.annotation.EnabledSince;
 import android.content.AttributionSource;
@@ -298,14 +299,28 @@
     public boolean canActivityBeLaunched(@NonNull ActivityInfo activityInfo,
             @Nullable Intent intent, @WindowConfiguration.WindowingMode int windowingMode,
             int launchingFromDisplayId, boolean isNewTask) {
-        if (!canContainActivity(activityInfo, windowingMode, launchingFromDisplayId, isNewTask)) {
-            notifyActivityBlocked(activityInfo);
-            return false;
-        }
-        if (mIntentListenerCallback != null && intent != null
-                && mIntentListenerCallback.shouldInterceptIntent(intent)) {
-            Slog.d(TAG, "Virtual device intercepting intent");
-            return false;
+        if (Flags.interceptIntentsBeforeApplyingPolicy()) {
+            if (mIntentListenerCallback != null && intent != null
+                    && mIntentListenerCallback.shouldInterceptIntent(intent)) {
+                Slog.d(TAG, "Virtual device intercepting intent");
+                return false;
+            }
+            if (!canContainActivity(activityInfo, windowingMode, launchingFromDisplayId,
+                    isNewTask)) {
+                notifyActivityBlocked(activityInfo);
+                return false;
+            }
+        } else {
+            if (!canContainActivity(activityInfo, windowingMode, launchingFromDisplayId,
+                    isNewTask)) {
+                notifyActivityBlocked(activityInfo);
+                return false;
+            }
+            if (mIntentListenerCallback != null && intent != null
+                    && mIntentListenerCallback.shouldInterceptIntent(intent)) {
+                Slog.d(TAG, "Virtual device intercepting intent");
+                return false;
+            }
         }
         return true;
     }
@@ -334,7 +349,7 @@
             // The error dialog alerting users that streaming is blocked is always allowed.
             return true;
         }
-        if (!mAllowedUsers.contains(activityUser)) {
+        if (!activityUser.isSystem() && !mAllowedUsers.contains(activityUser)) {
             Slog.d(TAG, "Virtual device launch disallowed from user " + activityUser);
             return false;
         }
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 3ec6e47..215f640 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
@@ -28,8 +28,6 @@
 import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CLIPBOARD;
 import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_RECENTS;
 import static android.content.pm.PackageManager.ACTION_REQUEST_PERMISSIONS;
-import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
-import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
 import static android.companion.virtualdevice.flags.Flags.virtualCameraServiceDiscovery;
 
 import android.annotation.EnforcePermission;
@@ -272,7 +270,8 @@
                 params,
                 DisplayManagerGlobal.getInstance(),
                 isVirtualCameraEnabled()
-                        ? new VirtualCameraController(params.getDevicePolicy(POLICY_TYPE_CAMERA))
+                        ? new VirtualCameraController(
+                                params.getDevicePolicy(POLICY_TYPE_CAMERA), deviceId)
                         : null);
     }
 
@@ -1067,6 +1066,10 @@
 
     @Override
     public boolean hasCustomAudioInputSupport() throws RemoteException {
+        return hasCustomAudioInputSupportInternal();
+    }
+
+    private boolean hasCustomAudioInputSupportInternal() {
         if (!Flags.vdmPublicApis()) {
             return false;
         }
@@ -1078,8 +1081,8 @@
             return false;
         }
 
-        if (getDevicePolicy(POLICY_TYPE_AUDIO) == VirtualDeviceParams.DEVICE_POLICY_DEFAULT) {
-            return false;
+        if (getDevicePolicy(POLICY_TYPE_AUDIO) == VirtualDeviceParams.DEVICE_POLICY_CUSTOM) {
+            return true;
         }
         final long token = Binder.clearCallingIdentity();
         try {
@@ -1107,10 +1110,10 @@
         mParams.dump(fout, indent + indent);
         fout.println(indent + "mVirtualDisplayIds: ");
         synchronized (mVirtualDeviceLock) {
-            fout.println("    mDevicePolicies: " + mDevicePolicies);
             for (int i = 0; i < mVirtualDisplays.size(); i++) {
                 fout.println(indent + "  " + mVirtualDisplays.keyAt(i));
             }
+            fout.println("    mDevicePolicies: " + mDevicePolicies);
             fout.println(indent + "mDefaultShowPointerIcon: " + mDefaultShowPointerIcon);
         }
         mInputController.dump(fout);
@@ -1118,6 +1121,8 @@
         if (mVirtualCameraController != null) {
             mVirtualCameraController.dump(fout, indent);
         }
+        fout.println(
+                indent + "hasCustomAudioInputSupport: " + hasCustomAudioInputSupportInternal());
     }
 
     // For display mirroring, we want to dispatch all key events to the source (default) display,
@@ -1149,8 +1154,8 @@
                 Flags.vdmCustomHome() ? mParams.getHomeComponent() : null;
 
         final GenericWindowPolicyController gwpc = new GenericWindowPolicyController(
-                FLAG_SECURE,
-                SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS,
+                WindowManager.LayoutParams.FLAG_SECURE,
+                WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS,
                 mAttributionSource,
                 getAllowedUserHandles(),
                 activityLaunchAllowedByDefault,
@@ -1264,7 +1269,7 @@
         // if the secure window is shown on a non-secure virtual display.
         DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
         Display display = displayManager.getDisplay(displayId);
-        if ((display.getFlags() & FLAG_SECURE) == 0) {
+        if ((display.getFlags() & Display.FLAG_SECURE) == 0) {
             showToastWhereUidIsRunning(uid, com.android.internal.R.string.vdm_secure_window,
                     Toast.LENGTH_LONG, mContext.getMainLooper());
 
diff --git a/services/companion/java/com/android/server/companion/virtual/camera/VirtualCameraController.java b/services/companion/java/com/android/server/companion/virtual/camera/VirtualCameraController.java
index 3bb1e33..4547bd6 100644
--- a/services/companion/java/com/android/server/companion/virtual/camera/VirtualCameraController.java
+++ b/services/companion/java/com/android/server/companion/virtual/camera/VirtualCameraController.java
@@ -58,19 +58,21 @@
     @Nullable private IVirtualCameraService mVirtualCameraService;
     @DevicePolicy
     private final int mCameraPolicy;
+    private final int mDeviceId;
 
     @GuardedBy("mCameras")
     private final Map<IBinder, CameraDescriptor> mCameras = new ArrayMap<>();
 
-    public VirtualCameraController(@DevicePolicy int cameraPolicy) {
-        this(/* virtualCameraService= */ null, cameraPolicy);
+    public VirtualCameraController(@DevicePolicy int cameraPolicy, int deviceId) {
+        this(/* virtualCameraService= */ null, cameraPolicy, deviceId);
     }
 
     @VisibleForTesting
     VirtualCameraController(IVirtualCameraService virtualCameraService,
-            @DevicePolicy int cameraPolicy) {
+            @DevicePolicy int cameraPolicy, int deviceId) {
         mVirtualCameraService = virtualCameraService;
         mCameraPolicy = cameraPolicy;
+        mDeviceId = deviceId;
     }
 
     /**
@@ -251,7 +253,7 @@
         VirtualCameraConfiguration serviceConfiguration = getServiceCameraConfiguration(config);
         synchronized (mServiceLock) {
             return mVirtualCameraService.registerCamera(config.getCallback().asBinder(),
-                    serviceConfiguration);
+                    serviceConfiguration, mDeviceId);
         }
     }
 
diff --git a/services/companion/java/com/android/server/companion/virtual/flags.aconfig b/services/companion/java/com/android/server/companion/virtual/flags.aconfig
index 6297e91..616f5d0 100644
--- a/services/companion/java/com/android/server/companion/virtual/flags.aconfig
+++ b/services/companion/java/com/android/server/companion/virtual/flags.aconfig
@@ -1,6 +1,7 @@
 # OLD PACKAGE, DO NOT USE: Prefer `flags.aconfig` in core/java/android/companion/virtual
 # (or other custom files) to define your flags
 package: "com.android.server.companion.virtual"
+container: "system"
 
 flag {
   name: "dump_history"
diff --git a/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java b/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java
index b28bc1f..16a9933 100644
--- a/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java
+++ b/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java
@@ -29,6 +29,7 @@
 import android.annotation.RequiresPermission;
 import android.app.ActivityOptions;
 import android.app.admin.DevicePolicyManagerInternal;
+import android.app.contextualsearch.CallbackToken;
 import android.app.contextualsearch.ContextualSearchManager;
 import android.app.contextualsearch.ContextualSearchState;
 import android.app.contextualsearch.IContextualSearchCallback;
@@ -164,7 +165,7 @@
         }
     }
 
-    private Intent getContextualSearchIntent(int entrypoint, IBinder mToken) {
+    private Intent getContextualSearchIntent(int entrypoint, CallbackToken mToken) {
         final Intent launchIntent = getResolvedLaunchIntent();
         if (launchIntent == null) {
             return null;
@@ -256,14 +257,14 @@
     }
 
     private class ContextualSearchManagerStub extends IContextualSearchManager.Stub {
-        private @Nullable IBinder mToken;
+        private @Nullable CallbackToken mToken;
 
         @Override
         public void startContextualSearch(int entrypoint) {
             synchronized (this) {
                 if (DEBUG_USER) Log.d(TAG, "startContextualSearch");
                 enforcePermission("startContextualSearch");
-                mToken = new Binder();
+                mToken = new CallbackToken();
                 // We get the launch intent with the system server's identity because the system
                 // server has READ_FRAME_BUFFER permission to get the screenshot and because only
                 // the system server can invoke non-exported activities.
@@ -284,7 +285,7 @@
             if (DEBUG_USER) {
                 Log.i(TAG, "getContextualSearchState token: " + token + ", callback: " + callback);
             }
-            if (mToken == null || !mToken.equals(token)) {
+            if (mToken == null || !mToken.getToken().equals(token)) {
                 if (DEBUG_USER) {
                     Log.e(TAG, "getContextualSearchState: invalid token, returning error");
                 }
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 7f5867f..392c0c7 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -182,6 +182,7 @@
         "android.hardware.vibrator-V2-java",
         "app-compat-annotations",
         "framework-tethering.stubs.module_lib",
+        "keepanno-annotations",
         "service-art.stubs.system_server",
         "service-permission.stubs.system_server",
         "service-rkp.stubs.system_server",
@@ -213,7 +214,9 @@
         "android.hardware.health-V3-java", // AIDL
         "android.hardware.health-translate-java",
         "android.hardware.light-V1-java",
+        "android.hardware.security.authgraph-V1-java",
         "android.hardware.security.rkp-V3-java",
+        "android.hardware.security.secretkeeper-V1-java",
         "android.hardware.tv.cec-V1.1-java",
         "android.hardware.tv.hdmi.cec-V1-java",
         "android.hardware.tv.hdmi.connection-V1-java",
@@ -246,7 +249,7 @@
         "biometrics_flags_lib",
         "am_flags_lib",
         "com_android_server_accessibility_flags_lib",
-        "com_android_systemui_shared_flags_lib",
+        "//frameworks/libs/systemui:com_android_systemui_shared_flags_lib",
         "com_android_wm_shell_flags_lib",
         "com.android.server.utils_aconfig-java",
         "service-jobscheduler-deviceidle.flags-aconfig-java",
@@ -254,6 +257,7 @@
         "net_flags_lib",
         "stats_flags_lib",
         "core_os_flags_lib",
+        "connectivity_flags_lib",
     ],
     javac_shard_size: 50,
     javacflags: [
diff --git a/services/core/java/com/android/server/HardwarePropertiesManagerService.java b/services/core/java/com/android/server/HardwarePropertiesManagerService.java
index 6b3f5e2..730e508 100644
--- a/services/core/java/com/android/server/HardwarePropertiesManagerService.java
+++ b/services/core/java/com/android/server/HardwarePropertiesManagerService.java
@@ -16,6 +16,7 @@
 
 package com.android.server;
 
+import static android.app.admin.DevicePolicyManager.IS_DEVICE_OWNER_USER_AWARE;
 import static android.os.HardwarePropertiesManager.DEVICE_TEMPERATURE_BATTERY;
 import static android.os.HardwarePropertiesManager.DEVICE_TEMPERATURE_CPU;
 import static android.os.HardwarePropertiesManager.DEVICE_TEMPERATURE_GPU;
@@ -28,12 +29,14 @@
 import android.Manifest;
 import android.app.AppOpsManager;
 import android.app.admin.DevicePolicyManager;
+import android.app.compat.CompatChanges;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.os.Binder;
 import android.os.CpuUsageInfo;
 import android.os.IHardwarePropertiesManager;
 import android.os.UserHandle;
+import android.permission.flags.Flags;
 
 import com.android.internal.util.DumpUtils;
 import com.android.server.vr.VrManagerInternal;
@@ -168,7 +171,15 @@
         mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
         final int userId = UserHandle.getUserId(Binder.getCallingUid());
         final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
-        final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
+        final DevicePolicyManager dpm;
+        if (Flags.systemServerRoleControllerEnabled()
+                && CompatChanges.isChangeEnabled(IS_DEVICE_OWNER_USER_AWARE)) {
+            final UserHandle handle = new UserHandle(userId);
+            dpm = mContext.createContextAsUser(handle, 0)
+                    .getSystemService(DevicePolicyManager.class);
+        } else {
+            dpm = mContext.getSystemService(DevicePolicyManager.class);
+        }
         if (!dpm.isDeviceOwnerApp(callingPackage)
                 && mContext.checkCallingOrSelfPermission(Manifest.permission.DEVICE_POWER)
                         != PackageManager.PERMISSION_GRANTED
diff --git a/services/core/java/com/android/server/SensitiveContentProtectionManagerService.java b/services/core/java/com/android/server/SensitiveContentProtectionManagerService.java
index 589d8b3..4694e9f 100644
--- a/services/core/java/com/android/server/SensitiveContentProtectionManagerService.java
+++ b/services/core/java/com/android/server/SensitiveContentProtectionManagerService.java
@@ -20,6 +20,11 @@
 import static android.provider.Settings.Global.DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS;
 import static android.view.flags.Flags.sensitiveContentAppProtection;
 
+import static com.android.internal.util.FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION;
+import static com.android.internal.util.FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__FRAMEWORKS;
+import static com.android.internal.util.FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__START;
+import static com.android.internal.util.FrameworkStatsLog.SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__STOP;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.ComponentName;
@@ -43,10 +48,12 @@
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.FrameworkStatsLog;
 import com.android.server.wm.SensitiveContentPackages.PackageInfo;
 import com.android.server.wm.WindowManagerInternal;
 
 import java.util.Objects;
+import java.util.Random;
 import java.util.Set;
 
 /**
@@ -61,8 +68,17 @@
     @VisibleForTesting
     @Nullable
     NotificationListener mNotificationListener;
-    @Nullable private MediaProjectionManager mProjectionManager;
-    @Nullable private WindowManagerInternal mWindowManager;
+    @Nullable
+    private MediaProjectionManager mProjectionManager;
+
+    @GuardedBy("mSensitiveContentProtectionLock")
+    @Nullable
+    private MediaProjectionSession mMediaProjectionSession;
+
+    private PackageManagerInternal mPackageManagerInternal;
+
+    @Nullable
+    private WindowManagerInternal mWindowManager;
 
     // screen recorder packages exempted from screen share protection.
     private ArraySet<String> mExemptedPackages = null;
@@ -74,6 +90,60 @@
     @GuardedBy("mSensitiveContentProtectionLock")
     private boolean mProjectionActive = false;
 
+    private static class MediaProjectionSession {
+        final int mUid;
+        final long mSessionId;
+        final boolean mIsExempted;
+
+        MediaProjectionSession(int uid, boolean isExempted, long sessionId) {
+            mUid = uid;
+            mIsExempted = isExempted;
+            mSessionId = sessionId;
+        }
+
+        public void logProjectionSessionStart() {
+            FrameworkStatsLog.write(
+                    SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION,
+                    mSessionId,
+                    mUid,
+                    mIsExempted,
+                    SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__START,
+                    SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__FRAMEWORKS
+            );
+        }
+
+        public void logProjectionSessionStop() {
+            FrameworkStatsLog.write(
+                    SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION,
+                    mSessionId,
+                    mUid,
+                    mIsExempted,
+                    SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__STATE__STOP,
+                    SENSITIVE_CONTENT_MEDIA_PROJECTION_SESSION__SOURCE__FRAMEWORKS
+            );
+        }
+
+        public void logAppBlocked(int uid) {
+            FrameworkStatsLog.write(
+                    FrameworkStatsLog.SENSITIVE_CONTENT_APP_PROTECTION,
+                    mSessionId,
+                    uid,
+                    mUid,
+                    FrameworkStatsLog.SENSITIVE_CONTENT_APP_PROTECTION__STATE__BLOCKED
+            );
+        }
+
+        public void logAppUnblocked(int uid) {
+            FrameworkStatsLog.write(
+                    FrameworkStatsLog.SENSITIVE_CONTENT_APP_PROTECTION,
+                    mSessionId,
+                    uid,
+                    mUid,
+                    FrameworkStatsLog.SENSITIVE_CONTENT_APP_PROTECTION__STATE__UNBLOCKED
+            );
+        }
+    }
+
     private final MediaProjectionManager.Callback mProjectionCallback =
             new MediaProjectionManager.Callback() {
                 @Override
@@ -82,7 +152,7 @@
                     Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER,
                             "SensitiveContentProtectionManagerService.onProjectionStart");
                     try {
-                        onProjectionStart(info.getPackageName());
+                        onProjectionStart(info);
                     } finally {
                         Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
                     }
@@ -118,10 +188,11 @@
         }
 
         if (DEBUG) Log.d(TAG, "onBootPhase - PHASE_BOOT_COMPLETED");
-
         init(getContext().getSystemService(MediaProjectionManager.class),
                 LocalServices.getService(WindowManagerInternal.class),
-                getExemptedPackages());
+                LocalServices.getService(PackageManagerInternal.class),
+                getExemptedPackages()
+        );
         if (sensitiveContentAppProtection()) {
             publishBinderService(Context.SENSITIVE_CONTENT_PROTECTION_SERVICE,
                     new SensitiveContentProtectionManagerServiceBinder());
@@ -130,7 +201,7 @@
 
     @VisibleForTesting
     void init(MediaProjectionManager projectionManager, WindowManagerInternal windowManager,
-            ArraySet<String> exemptedPackages) {
+            PackageManagerInternal packageManagerInternal, ArraySet<String> exemptedPackages) {
         if (DEBUG) Log.d(TAG, "init");
 
         Objects.requireNonNull(projectionManager);
@@ -138,6 +209,7 @@
 
         mProjectionManager = projectionManager;
         mWindowManager = windowManager;
+        mPackageManagerInternal = packageManagerInternal;
         mExemptedPackages = exemptedPackages;
 
         // TODO(b/317250444): use MediaProjectionManagerService directly, reduces unnecessary
@@ -186,23 +258,29 @@
         return SystemConfig.getInstance().getBugreportWhitelistedPackages();
     }
 
-    private void onProjectionStart(String packageName) {
-        // exempt on device screen recorder as well.
-        if ((mExemptedPackages != null && mExemptedPackages.contains(packageName))
-                || canRecordSensitiveContent(packageName)) {
-            Log.w(TAG, packageName + " is exempted from screen share protection.");
-            return;
-        }
+    private void onProjectionStart(MediaProjectionInfo projectionInfo) {
+        boolean isPackageExempted = (mExemptedPackages != null && mExemptedPackages.contains(
+                projectionInfo.getPackageName()))
+                || canRecordSensitiveContent(projectionInfo.getPackageName())
+                || isAutofillServiceRecorderPackage(projectionInfo.getUserHandle().getIdentifier(),
+                        projectionInfo.getPackageName());
         // TODO(b/324447419): move GlobalSettings lookup to background thread
-        boolean disableScreenShareProtections =
-                Settings.Global.getInt(getContext().getContentResolver(),
-                        DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS, 0) != 0;
-        if (disableScreenShareProtections) {
-            Log.w(TAG, "Screen share protections disabled, ignoring projection start");
-            return;
-        }
-
+        boolean isFeatureDisabled = Settings.Global.getInt(getContext().getContentResolver(),
+                DISABLE_SCREEN_SHARE_PROTECTIONS_FOR_APPS_AND_NOTIFICATIONS, 0) != 0;
+        int uid = mPackageManagerInternal.getPackageUid(projectionInfo.getPackageName(), 0,
+                projectionInfo.getUserHandle().getIdentifier());
         synchronized (mSensitiveContentProtectionLock) {
+            mMediaProjectionSession = new MediaProjectionSession(
+                    uid, isPackageExempted || isFeatureDisabled, new Random().nextLong());
+            mMediaProjectionSession.logProjectionSessionStart();
+
+            if (isPackageExempted || isFeatureDisabled) {
+                Log.w(TAG, "projection session is exempted, package ="
+                        + projectionInfo.getPackageName() + ", isFeatureDisabled="
+                        + isFeatureDisabled);
+                return;
+            }
+
             mProjectionActive = true;
             if (sensitiveNotificationAppProtection()) {
                 updateAppsThatShouldBlockScreenCapture();
@@ -217,6 +295,10 @@
     private void onProjectionEnd() {
         synchronized (mSensitiveContentProtectionLock) {
             mProjectionActive = false;
+            if (mMediaProjectionSession != null) {
+                mMediaProjectionSession.logProjectionSessionStop();
+                mMediaProjectionSession = null;
+            }
 
             // notify windowmanager to clear any sensitive notifications observed during projection
             // session
@@ -248,8 +330,9 @@
         // notify windowmanager of any currently posted sensitive content notifications
         ArraySet<PackageInfo> packageInfos =
                 getSensitivePackagesFromNotifications(notifications, rankingMap);
-
-        mWindowManager.addBlockScreenCaptureForApps(packageInfos);
+        if (packageInfos.size() > 0) {
+            mWindowManager.addBlockScreenCaptureForApps(packageInfos);
+        }
     }
 
     private ArraySet<PackageInfo> getSensitivePackagesFromNotifications(
@@ -351,9 +434,9 @@
      * Block projection for a package window when the window is showing sensitive content on
      * the screen, the projection is unblocked when window no more shows sensitive content.
      *
-     * @param windowToken window where the content is shown.
-     * @param packageName package name.
-     * @param uid uid of the package.
+     * @param windowToken               window where the content is shown.
+     * @param packageName               package name.
+     * @param uid                       uid of the package.
      * @param isShowingSensitiveContent whether the window is showing sensitive content.
      */
     @VisibleForTesting
@@ -375,6 +458,7 @@
             if (!mProjectionActive) {
                 return;
             }
+
             if (DEBUG) {
                 Log.d(TAG, "setSensitiveContentProtection - current package=" + packageInfo
                         + ", isShowingSensitiveContent=" + isShowingSensitiveContent
@@ -385,20 +469,41 @@
             packageInfos.add(packageInfo);
             if (isShowingSensitiveContent) {
                 mWindowManager.addBlockScreenCaptureForApps(packageInfos);
+                if (mMediaProjectionSession != null) {
+                    mMediaProjectionSession.logAppBlocked(uid);
+                }
             } else {
                 mWindowManager.removeBlockScreenCaptureForApps(packageInfos);
+                if (mMediaProjectionSession != null) {
+                    mMediaProjectionSession.logAppUnblocked(uid);
+                }
             }
         }
     }
 
-    private final class SensitiveContentProtectionManagerServiceBinder
-            extends ISensitiveContentProtectionManager.Stub {
-        private final PackageManagerInternal mPackageManagerInternal;
-
-        SensitiveContentProtectionManagerServiceBinder() {
-            mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
+    // TODO: b/328251279 - Autofill service exemption is temporary and will be removed in future.
+    private boolean isAutofillServiceRecorderPackage(int userId, String projectionPackage) {
+        String autofillServiceName = Settings.Secure.getStringForUser(
+                getContext().getContentResolver(), Settings.Secure.AUTOFILL_SERVICE, userId);
+        if (DEBUG) {
+            Log.d(TAG, "autofill service for user " + userId + " is " + autofillServiceName);
         }
 
+        if (autofillServiceName == null) {
+            return false;
+        }
+        ComponentName serviceComponent = ComponentName.unflattenFromString(autofillServiceName);
+        if (serviceComponent == null) {
+            return false;
+        }
+        String autofillServicePackage = serviceComponent.getPackageName();
+
+        return autofillServicePackage != null
+                && autofillServicePackage.equals(projectionPackage);
+    }
+
+    private final class SensitiveContentProtectionManagerServiceBinder
+            extends ISensitiveContentProtectionManager.Stub {
         public void setSensitiveContentProtection(IBinder windowToken, String packageName,
                 boolean isShowingSensitiveContent) {
             Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER,
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index e7fae24..67e18ca 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -107,6 +107,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.storage.DiskInfo;
+import android.os.storage.ICeStorageLockEventListener;
 import android.os.storage.IObbActionListener;
 import android.os.storage.IStorageEventListener;
 import android.os.storage.IStorageManager;
@@ -139,6 +140,7 @@
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.app.IAppOpsService;
 import com.android.internal.content.PackageMonitor;
 import com.android.internal.os.AppFuseMount;
@@ -185,6 +187,7 @@
 import java.util.Objects;
 import java.util.Set;
 import java.util.UUID;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -602,6 +605,9 @@
     // Not guarded by lock, always used on the ActivityManager thread
     private final SparseArray<PackageMonitor> mPackageMonitorsForUser = new SparseArray<>();
 
+    /** List of listeners registered for ce storage callbacks */
+    private final CopyOnWriteArrayList<ICeStorageLockEventListener>
+            mCeStorageEventCallbacks = new CopyOnWriteArrayList<>();
 
     class ObbState implements IBinder.DeathRecipient {
         public ObbState(String rawPath, String canonicalPath, int callingUid,
@@ -3315,6 +3321,11 @@
         synchronized (mLock) {
             mCeUnlockedUsers.remove(userId);
         }
+        if (android.os.Flags.allowPrivateProfile()
+                && android.multiuser.Flags.enablePrivateSpaceFeatures()
+                && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()) {
+            dispatchCeStorageLockedEvent(userId);
+        }
     }
 
     @Override
@@ -4580,6 +4591,18 @@
         return StorageManager.MOUNT_MODE_EXTERNAL_NONE;
     }
 
+    @VisibleForTesting
+    CopyOnWriteArrayList<ICeStorageLockEventListener> getCeStorageEventCallbacks() {
+        return mCeStorageEventCallbacks;
+    }
+
+    @VisibleForTesting
+    void dispatchCeStorageLockedEvent(int userId) {
+        for (ICeStorageLockEventListener listener: mCeStorageEventCallbacks) {
+            listener.onStorageLocked(userId);
+        }
+    }
+
     private static class Callbacks extends Handler {
         private static final int MSG_STORAGE_STATE_CHANGED = 1;
         private static final int MSG_VOLUME_STATE_CHANGED = 2;
@@ -5066,5 +5089,23 @@
                 throw new IOException(e);
             }
         }
+
+        @Override
+        public void registerStorageLockEventListener(
+                @NonNull ICeStorageLockEventListener listener) {
+            boolean registered = mCeStorageEventCallbacks.add(listener);
+            if (!registered) {
+                Slog.w(TAG, "Failed to register listener: " + listener);
+            }
+        }
+
+        @Override
+        public void unregisterStorageLockEventListener(
+                @NonNull ICeStorageLockEventListener listener) {
+            boolean unregistered = mCeStorageEventCallbacks.remove(listener);
+            if (!unregistered) {
+                Slog.w(TAG, "Unregistering " + listener + " that was not registered");
+            }
+        }
     }
 }
diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING
index 25337a4..5933639 100644
--- a/services/core/java/com/android/server/TEST_MAPPING
+++ b/services/core/java/com/android/server/TEST_MAPPING
@@ -62,6 +62,27 @@
             "file_patterns": ["SensorPrivacyService\\.java"]
         },
         {
+            "name": "FrameworksMockingServicesTests",
+            "options": [
+                {
+                    "include-filter": "com.android.server.SensitiveContentProtectionManagerServiceContentTest"
+                },
+                {
+                    "include-filter": "com.android.server.SensitiveContentProtectionManagerServiceNotificationTest"
+                }
+            ],
+            "file_patterns": ["SensitiveContentProtectionManagerService\\.java"]
+        },
+        {
+            "name": "FrameworksMockingServicesTests",
+            "options": [
+                {
+                    "include-filter": "com.android.server.StorageManagerServiceTest"
+                }
+            ],
+            "file_patterns": ["StorageManagerService\\.java"]
+        },
+        {
             "name": "FrameworksServicesTests",
             "options": [
                 {
@@ -163,6 +184,9 @@
                 }
             ],
             "file_patterns": ["PinnerService\\.java"]
+        },
+        {
+            "name": "SelinuxFrameworksTests"
         }
     ]
 }
diff --git a/services/core/java/com/android/server/VpnManagerService.java b/services/core/java/com/android/server/VpnManagerService.java
index 1d1e2d9..626fa70 100644
--- a/services/core/java/com/android/server/VpnManagerService.java
+++ b/services/core/java/com/android/server/VpnManagerService.java
@@ -1007,6 +1007,71 @@
         }
     }
 
+    /**
+     * Get the vpn profile owned by the calling uid with the given name from the vpn database.
+     *
+     * <p>Note this method should not be used for platform VPN profiles. </p>
+     *
+     * @param name The name of the profile to retrieve.
+     * @return the unstructured blob for the matching vpn profile.
+     * Returns null if no profile with a matching name was found.
+     * @hide
+     */
+    @Override
+    @Nullable
+    public byte[] getFromVpnProfileStore(@NonNull String name) {
+        return mVpnProfileStore.get(name);
+    }
+
+    /**
+     * Put the given vpn profile owned by the calling uid with the given name into the vpn database.
+     * Existing profiles with the same name will be replaced.
+     *
+     * <p>Note this method should not be used for platform VPN profiles.
+     * To update a platform VPN, use provisionVpnProfile() instead. </p>
+     *
+     * @param name The name of the profile to put.
+     * @param blob The profile.
+     * @return true if the profile was successfully added. False otherwise.
+     * @hide
+     */
+    @Override
+    public boolean putIntoVpnProfileStore(@NonNull String name, @NonNull byte[] blob) {
+        return mVpnProfileStore.put(name, blob);
+    }
+
+    /**
+     * Removes the vpn profile owned by the calling uid with the given name from the vpn database.
+     *
+     * <p>Note this method should not be used for platform VPN profiles.
+     * To remove a platform VPN, use deleteVpnProfile() instead.</p>
+     *
+     * @param name The name of the profile to be removed.
+     * @return true if a profile was removed. False if no profile with a matching name was found.
+     * @hide
+     */
+    @Override
+    public boolean removeFromVpnProfileStore(@NonNull String name) {
+        return mVpnProfileStore.remove(name);
+    }
+
+    /**
+     * Returns a list of the name suffixes of the vpn profiles owned by the calling uid in the vpn
+     * database matching the given prefix, sorted in ascending order.
+     *
+     * <p>Note this method should not be used for platform VPN profiles. </p>
+     *
+     * @param prefix The prefix to match.
+     * @return an array of strings representing the name suffixes stored in the profile database
+     * matching the given prefix. The return value may be empty but never null.
+     * @hide
+     */
+    @Override
+    @NonNull
+    public String[] listFromVpnProfileStore(@NonNull String prefix) {
+        return mVpnProfileStore.list(prefix);
+    }
+
     private void ensureRunningOnHandlerThread() {
         if (mHandler.getLooper().getThread() != Thread.currentThread()) {
             throw new IllegalStateException(
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index c18bacb..72a55dbe 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -177,6 +177,7 @@
             "android.hardware.biometrics.fingerprint.IFingerprint/",
             "android.hardware.bluetooth.IBluetoothHci/",
             "android.hardware.camera.provider.ICameraProvider/",
+            "android.hardware.drm.IDrmFactory/",
             "android.hardware.gnss.IGnss/",
             "android.hardware.graphics.allocator.IAllocator/",
             "android.hardware.graphics.composer3.IComposer/",
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 1334a95..603a95c 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -897,6 +897,11 @@
                         }
                     }
                     for (String packageNameToNotify : accountRemovedReceivers) {
+                        int currentVisibility =
+                                resolveAccountVisibility(account, packageNameToNotify, accounts);
+                        if (isVisible(currentVisibility)) {
+                            continue;
+                        }
                         sendAccountRemovedBroadcast(
                                 account,
                                 packageNameToNotify,
@@ -3666,6 +3671,11 @@
 
             // Strip auth token from result.
             result.remove(AccountManager.KEY_AUTHTOKEN);
+            if (!checkKeyIntent(Binder.getCallingUid(), result)) {
+                onError(AccountManager.ERROR_CODE_INVALID_RESPONSE,
+                        "invalid intent in bundle returned");
+                return;
+            }
 
             if (Log.isLoggable(TAG, Log.VERBOSE)) {
                 Log.v(TAG,
@@ -5276,6 +5286,11 @@
                     } else {
                         if (mStripAuthTokenFromResult) {
                             result.remove(AccountManager.KEY_AUTHTOKEN);
+                            if (!checkKeyIntent(Binder.getCallingUid(), result)) {
+                                onError(AccountManager.ERROR_CODE_INVALID_RESPONSE,
+                                        "invalid intent in bundle returned");
+                                return;
+                            }
                         }
                         if (Log.isLoggable(TAG, Log.VERBOSE)) {
                             Log.v(TAG, getClass().getSimpleName()
diff --git a/services/core/java/com/android/server/am/AccessCheckDelegateHelper.java b/services/core/java/com/android/server/am/AccessCheckDelegateHelper.java
new file mode 100644
index 0000000..62c6329
--- /dev/null
+++ b/services/core/java/com/android/server/am/AccessCheckDelegateHelper.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.am;
+
+import android.annotation.Nullable;
+import android.os.Process;
+import android.os.UserHandle;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.appop.AppOpsService;
+import com.android.server.pm.permission.AccessCheckDelegate;
+import com.android.server.pm.permission.PermissionManagerServiceInternal;
+
+import java.util.Collections;
+import java.util.List;
+
+class AccessCheckDelegateHelper {
+    private final ActivityManagerGlobalLock mProcLock;
+
+    @GuardedBy("mProcLock")
+    private final List<ActiveInstrumentation> mActiveInstrumentation;
+
+    private final AppOpsService mAppOpsService;
+
+    private final PermissionManagerServiceInternal mPermissionManagerInternal;
+
+    @GuardedBy("mProcLock")
+    private AccessCheckDelegate mAccessCheckDelegate;
+
+    AccessCheckDelegateHelper(ActivityManagerGlobalLock procLock,
+            List<ActiveInstrumentation> activeInstrumentation, AppOpsService appOpsService,
+            PermissionManagerServiceInternal permissionManagerInternal) {
+        mProcLock = procLock;
+        mActiveInstrumentation = activeInstrumentation;
+        mAppOpsService = appOpsService;
+        mPermissionManagerInternal = permissionManagerInternal;
+    }
+
+    @GuardedBy("mProcLock")
+    private AccessCheckDelegate getAccessCheckDelegateLPr(boolean create) {
+        if (create && mAccessCheckDelegate == null) {
+            mAccessCheckDelegate = new AccessCheckDelegate.AccessCheckDelegateImpl();
+            mAppOpsService.setCheckOpsDelegate(mAccessCheckDelegate);
+            mPermissionManagerInternal.setCheckPermissionDelegate(mAccessCheckDelegate);
+        }
+
+        return mAccessCheckDelegate;
+    }
+
+    @GuardedBy("mProcLock")
+    private void removeAccessCheckDelegateLPr() {
+        mAccessCheckDelegate = null;
+        mAppOpsService.setCheckOpsDelegate(null);
+        mPermissionManagerInternal.setCheckPermissionDelegate(null);
+    }
+
+    void startDelegateShellPermissionIdentity(int delegateUid,
+            @Nullable String[] permissions) {
+        if (UserHandle.getCallingAppId() != Process.SHELL_UID
+                && UserHandle.getCallingAppId() != Process.ROOT_UID) {
+            throw new SecurityException("Only the shell can delegate its permissions");
+        }
+
+        synchronized (mProcLock) {
+            AccessCheckDelegate delegate = getAccessCheckDelegateLPr(false);
+            if (delegate != null && !delegate.isDelegateAndOwnerUid(delegateUid)) {
+                throw new SecurityException("Shell can delegate permissions only "
+                        + "to one instrumentation at a time");
+            }
+            final int instrCount = mActiveInstrumentation.size();
+            for (int i = 0; i < instrCount; i++) {
+                final ActiveInstrumentation instr =
+                        mActiveInstrumentation.get(i);
+                if (instr.mTargetInfo.uid != delegateUid) {
+                    continue;
+                }
+
+                // If instrumentation started from the shell the connection is not null
+                if (instr.mUiAutomationConnection == null) {
+                    throw new SecurityException("Shell can delegate its permissions"
+                            + " only to an instrumentation started from the shell");
+                }
+
+                final String packageName = instr.mTargetInfo.packageName;
+                delegate = getAccessCheckDelegateLPr(true);
+                delegate.setShellPermissionDelegate(delegateUid, packageName, permissions);
+                return;
+            }
+        }
+    }
+
+    void stopDelegateShellPermissionIdentity() {
+        if (UserHandle.getCallingAppId() != Process.SHELL_UID
+                && UserHandle.getCallingAppId() != Process.ROOT_UID) {
+            throw new SecurityException("Only the shell can delegate its permissions");
+        }
+        synchronized (mProcLock) {
+            AccessCheckDelegate delegate = getAccessCheckDelegateLPr(false);
+            if (delegate == null) {
+                return;
+            }
+
+            if (!delegate.hasShellPermissionDelegate()) {
+                return;
+            }
+
+            delegate.removeShellPermissionDelegate();
+
+            if (!delegate.hasDelegateOrOverrides()) {
+                removeAccessCheckDelegateLPr();
+            }
+        }
+    }
+
+    List<String> getDelegatedShellPermissions() {
+        if (UserHandle.getCallingAppId() != Process.SHELL_UID
+                && UserHandle.getCallingAppId() != Process.ROOT_UID) {
+            throw new SecurityException("Only the shell can get delegated permissions");
+        }
+        synchronized (mProcLock) {
+            AccessCheckDelegate delegate = getAccessCheckDelegateLPr(false);
+            if (delegate == null) {
+                return Collections.EMPTY_LIST;
+            }
+
+            return delegate.getDelegatedPermissionNames();
+        }
+    }
+
+    void addOverridePermissionState(int originatingUid, int uid, String permission, int result) {
+        if (UserHandle.getCallingAppId() != Process.ROOT_UID) {
+            throw new SecurityException("Only root can override permissions");
+        }
+
+        synchronized (mProcLock) {
+            final int instrCount = mActiveInstrumentation.size();
+            for (int i = 0; i < instrCount; i++) {
+                final ActiveInstrumentation instr =
+                        mActiveInstrumentation.get(i);
+                if (instr.mTargetInfo.uid != originatingUid) {
+                    continue;
+                }
+                // If instrumentation started from the shell the connection is not null
+                if (instr.mSourceUid != Process.ROOT_UID || instr.mUiAutomationConnection == null) {
+                    throw new SecurityException("Root can only override permissions only if the "
+                            + "owning app was instrumented from root.");
+                }
+
+                AccessCheckDelegate delegate =
+                        getAccessCheckDelegateLPr(true);
+                if (delegate.hasOverriddenPermissions()
+                        && !delegate.isDelegateAndOwnerUid(originatingUid)) {
+                    throw new SecurityException("Only one instrumentation to grant"
+                            + " overrides is allowed at a time.");
+                }
+
+                delegate.addOverridePermissionState(originatingUid, uid, permission, result);
+                return;
+            }
+        }
+    }
+
+    void removeOverridePermissionState(int originatingUid, int uid, String permission) {
+        if (UserHandle.getCallingAppId() != Process.ROOT_UID) {
+            throw new SecurityException("Only root can override permissions.");
+        }
+
+        synchronized (mProcLock) {
+            AccessCheckDelegate delegate = getAccessCheckDelegateLPr(false);
+            if (delegate == null) {
+                return;
+            }
+
+            if (!delegate.isDelegateAndOwnerUid(originatingUid)) {
+                if (delegate.hasOverriddenPermissions()) {
+                    throw new SecurityException("Only the granter of current overrides can remove "
+                            + "them.");
+                }
+                return;
+            }
+
+            delegate.removeOverridePermissionState(uid, permission);
+
+            if (!delegate.hasDelegateOrOverrides()) {
+                removeAccessCheckDelegateLPr();
+            }
+        }
+    }
+
+    void clearOverridePermissionStates(int originatingUid, int uid) {
+        if (UserHandle.getCallingAppId() != Process.ROOT_UID) {
+            throw new SecurityException("Only root can override permissions.");
+        }
+        synchronized (mProcLock) {
+            AccessCheckDelegate delegate = getAccessCheckDelegateLPr(false);
+            if (delegate == null) {
+                return;
+            }
+
+            if (!delegate.isDelegateAndOwnerUid(originatingUid)) {
+                if (delegate.hasOverriddenPermissions()) {
+                    throw new SecurityException(
+                            "Only the granter of current overrides can remove them.");
+                }
+                return;
+            }
+
+            delegate.clearOverridePermissionStates(uid);
+
+            if (!delegate.hasDelegateOrOverrides()) {
+                removeAccessCheckDelegateLPr();
+            }
+        }
+    }
+
+    void clearAllOverridePermissionStates(int originatingUid) {
+        if (UserHandle.getCallingAppId() != Process.ROOT_UID) {
+            throw new SecurityException("Only root can override permissions.");
+        }
+        synchronized (mProcLock) {
+            AccessCheckDelegate delegate = getAccessCheckDelegateLPr(false);
+            if (delegate == null) {
+                return;
+            }
+
+            if (!delegate.isDelegateAndOwnerUid(originatingUid)) {
+                if (delegate.hasOverriddenPermissions()) {
+                    throw new SecurityException(
+                            "Only the granter of current overrides can remove them.");
+                }
+                return;
+            }
+
+            delegate.clearAllOverridePermissionStates();
+
+            if (!delegate.hasDelegateOrOverrides()) {
+                removeAccessCheckDelegateLPr();
+            }
+        }
+    }
+
+    void onInstrumentationFinished(int uid, String packageName) {
+        synchronized (mProcLock) {
+            AccessCheckDelegate delegate = getAccessCheckDelegateLPr(false);
+            if (delegate != null) {
+                if (delegate.isDelegatePackage(uid, packageName)) {
+                    delegate.removeShellPermissionDelegate();
+                }
+                if (delegate.isDelegateAndOwnerUid(uid)) {
+                    delegate.clearAllOverridePermissionStates();
+                }
+                if (!delegate.hasDelegateOrOverrides()) {
+                    removeAccessCheckDelegateLPr();
+                }
+            }
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 133a77d..7ea82b0 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -1192,7 +1192,7 @@
             // Use that as a shortcut if possible to avoid having to recheck all the conditions.
             final boolean whileInUseAllowsUiJobScheduling =
                     ActivityManagerService.doesReasonCodeAllowSchedulingUserInitiatedJobs(
-                            r.getFgsAllowWiu_forStart());
+                            r.getFgsAllowWiu_forStart(), callingUid);
             r.updateAllowUiJobScheduling(whileInUseAllowsUiJobScheduling
                     || mAm.canScheduleUserInitiatedJobs(callingUid, callingPid, callingPackage));
         } else {
@@ -2659,6 +2659,9 @@
                         }
                         updateNumForegroundServicesLocked();
                     }
+
+                    maybeUpdateShortFgsTrackingLocked(r,
+                            extendShortServiceTimeout);
                     // Even if the service is already a FGS, we need to update the notification,
                     // so we need to call it again.
                     signalForegroundServiceObserversLocked(r);
@@ -2670,8 +2673,6 @@
                     mAm.notifyPackageUse(r.serviceInfo.packageName,
                             PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE);
 
-                    maybeUpdateShortFgsTrackingLocked(r,
-                            extendShortServiceTimeout);
                     maybeUpdateFgsTrackingLocked(r, extendFgsTimeout);
                 } else {
                     if (DEBUG_FOREGROUND_SERVICE) {
@@ -4158,7 +4159,7 @@
                         || (callerApp.mState.getCurProcState() <= PROCESS_STATE_TOP
                             && c.hasFlag(Context.BIND_TREAT_LIKE_ACTIVITY)),
                         b.client);
-                if (!s.mOomAdjBumpedInExec && (serviceBindingOomAdjPolicy
+                if (!s.wasOomAdjUpdated() && (serviceBindingOomAdjPolicy
                         & SERVICE_BIND_OOMADJ_POLICY_SKIP_OOM_UPDATE_ON_CONNECT) == 0) {
                     needOomAdj = true;
                     mAm.enqueueOomAdjTargetLocked(s.app);
@@ -4308,7 +4309,7 @@
                 }
 
                 serviceDoneExecutingLocked(r, mDestroyingServices.contains(r), false, false,
-                        !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec
+                        !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated()
                         ? OOM_ADJ_REASON_EXECUTING_SERVICE : OOM_ADJ_REASON_NONE);
             }
         } finally {
@@ -4456,7 +4457,7 @@
                 }
 
                 serviceDoneExecutingLocked(r, inDestroying, false, false,
-                        !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec
+                        !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated()
                         ? OOM_ADJ_REASON_UNBIND_SERVICE : OOM_ADJ_REASON_NONE);
             }
         } finally {
@@ -5004,13 +5005,16 @@
                 }
             }
         }
-        if (oomAdjReason != OOM_ADJ_REASON_NONE && r.app != null
+        if (r.app != null
                 && r.app.mState.getCurProcState() > ActivityManager.PROCESS_STATE_SERVICE) {
-            // Force an immediate oomAdjUpdate, so the client app could be in the correct process
-            // state before doing any service related transactions
+            // Enqueue the oom adj target anyway for opportunistic oom adj updates.
             mAm.enqueueOomAdjTargetLocked(r.app);
-            mAm.updateOomAdjPendingTargetsLocked(oomAdjReason);
-            r.mOomAdjBumpedInExec = true;
+            r.updateOomAdjSeq();
+            if (oomAdjReason != OOM_ADJ_REASON_NONE) {
+                // Force an immediate oomAdjUpdate, so the client app could be in the correct
+                // process state before doing any service related transactions
+                mAm.updateOomAdjPendingTargetsLocked(oomAdjReason);
+            }
         }
         r.executeFg |= fg;
         r.executeNesting++;
@@ -5050,7 +5054,7 @@
                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Crashed while binding " + r, e);
                 final boolean inDestroying = mDestroyingServices.contains(r);
                 serviceDoneExecutingLocked(r, inDestroying, inDestroying, false,
-                        !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec
+                        !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated()
                         ? OOM_ADJ_REASON_UNBIND_SERVICE : OOM_ADJ_REASON_NONE);
                 throw e;
             } catch (RemoteException e) {
@@ -5058,7 +5062,7 @@
                 // Keep the executeNesting count accurate.
                 final boolean inDestroying = mDestroyingServices.contains(r);
                 serviceDoneExecutingLocked(r, inDestroying, inDestroying, false,
-                        !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec
+                        !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated()
                         ? OOM_ADJ_REASON_UNBIND_SERVICE : OOM_ADJ_REASON_NONE);
                 return false;
             }
@@ -5551,6 +5555,7 @@
             boolean enqueueOomAdj, @ServiceBindingOomAdjPolicy int serviceBindingOomAdjPolicy)
             throws TransactionTooLargeException {
         if (r.app != null && r.app.isThreadReady()) {
+            r.updateOomAdjSeq();
             sendServiceArgsLocked(r, execInFg, false);
             return null;
         }
@@ -5854,8 +5859,8 @@
             // Force an immediate oomAdjUpdate, so the host app could be in the correct
             // process state before doing any service related transactions
             mAm.enqueueOomAdjTargetLocked(app);
+            r.updateOomAdjSeq();
             mAm.updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_START_SERVICE);
-            r.mOomAdjBumpedInExec = true;
         } else {
             // Since we skipped the oom adj update, the Service#onCreate() might be running in
             // the cached state, if the service process drops into the cached state after the call.
@@ -5896,7 +5901,7 @@
                 // Keep the executeNesting count accurate.
                 final boolean inDestroying = mDestroyingServices.contains(r);
                 serviceDoneExecutingLocked(r, inDestroying, inDestroying, false,
-                        !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec
+                        !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated()
                         ? OOM_ADJ_REASON_STOP_SERVICE : OOM_ADJ_REASON_NONE);
 
                 // Cleanup.
@@ -5932,7 +5937,7 @@
                     null, null, 0, null, null, ActivityManager.PROCESS_STATE_UNKNOWN));
         }
 
-        sendServiceArgsLocked(r, execInFg, r.mOomAdjBumpedInExec);
+        sendServiceArgsLocked(r, execInFg, r.wasOomAdjUpdated());
 
         if (r.delayed) {
             if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "REM FR DELAY LIST (new proc): " + r);
@@ -6119,7 +6124,7 @@
             }
         }
 
-        boolean oomAdjusted = Flags.serviceBindingOomAdjPolicy() && r.mOomAdjBumpedInExec;
+        boolean oomAdjusted = Flags.serviceBindingOomAdjPolicy() && r.wasOomAdjUpdated();
 
         // Tell the service that it has been unbound.
         if (r.app != null && r.app.isThreadReady()) {
@@ -6132,7 +6137,7 @@
                         bumpServiceExecutingLocked(r, false, "bring down unbind",
                                 oomAdjusted ? OOM_ADJ_REASON_NONE : OOM_ADJ_REASON_UNBIND_SERVICE,
                                 oomAdjusted /* skipTimeoutIfPossible */);
-                        oomAdjusted |= r.mOomAdjBumpedInExec;
+                        oomAdjusted |= r.wasOomAdjUpdated();
                         ibr.hasBound = false;
                         ibr.requested = false;
                         r.app.getThread().scheduleUnbindService(r,
@@ -6292,7 +6297,7 @@
                                 oomAdjusted ? OOM_ADJ_REASON_NONE : OOM_ADJ_REASON_UNBIND_SERVICE,
                                 oomAdjusted /* skipTimeoutIfPossible */);
                         mDestroyingServices.add(r);
-                        oomAdjusted |= r.mOomAdjBumpedInExec;
+                        oomAdjusted |= r.wasOomAdjUpdated();
                         r.destroying = true;
                         r.app.getThread().scheduleStopService(r);
                     } catch (Exception e) {
@@ -6579,7 +6584,7 @@
             }
             final long origId = mAm.mInjector.clearCallingIdentity();
             serviceDoneExecutingLocked(r, inDestroying, inDestroying, enqueueOomAdj,
-                    !Flags.serviceBindingOomAdjPolicy() || r.mOomAdjBumpedInExec || needOomAdj
+                    !Flags.serviceBindingOomAdjPolicy() || r.wasOomAdjUpdated() || needOomAdj
                     ? OOM_ADJ_REASON_EXECUTING_SERVICE : OOM_ADJ_REASON_NONE);
             mAm.mInjector.restoreCallingIdentity(origId);
         } else {
@@ -6645,7 +6650,7 @@
                 } else {
                     // Skip oom adj if it wasn't bumped during the bumpServiceExecutingLocked()
                 }
-                r.mOomAdjBumpedInExec = false;
+                r.updateOomAdjSeq();
             }
             r.executeFg = false;
             if (r.tracker != null) {
@@ -7029,7 +7034,6 @@
             sr.setProcess(null, null, 0, null);
             sr.isolationHostProc = null;
             sr.executeNesting = 0;
-            sr.mOomAdjBumpedInExec = false;
             synchronized (mAm.mProcessStats.mLock) {
                 sr.forceClearTracker();
             }
@@ -8560,29 +8564,24 @@
             }
         }
 
-        // The flag being enabled isn't enough to deny background start: we need to also check
-        // if there is a system alert UI present.
         if (ret == REASON_DENIED) {
-            // Flag check: are we disabling SAW FGS background starts?
-            final boolean shouldDisableSaw = Flags.fgsDisableSaw()
-                    && CompatChanges.isChangeEnabled(FGS_BOOT_COMPLETED_RESTRICTIONS, callingUid);
-            if (shouldDisableSaw) {
-                final ProcessRecord processRecord = mAm
-                        .getProcessRecordLocked(targetService.processName,
-                                targetService.appInfo.uid);
-                if (processRecord != null) {
-                    if (processRecord.mState.hasOverlayUi()) {
-                        if (mAm.mAtmInternal.hasSystemAlertWindowPermission(callingUid, callingPid,
-                                callingPackage)) {
-                            ret = REASON_SYSTEM_ALERT_WINDOW_PERMISSION;
+            if (mAm.mAtmInternal.hasSystemAlertWindowPermission(
+                                    callingUid, callingPid, callingPackage)) {
+                // Starting from Android V, it is not enough to only have the SYSTEM_ALERT_WINDOW
+                // permission granted - apps must also be showing an overlay window.
+                if (Flags.fgsDisableSaw()
+                        && CompatChanges.isChangeEnabled(FGS_SAW_RESTRICTIONS, callingUid)) {
+                    final UidRecord uidRecord = mAm.mProcessList.getUidRecordLOSP(callingUid);
+                    if (uidRecord != null) {
+                        for (int i = uidRecord.getNumOfProcs() - 1; i >= 0; i--) {
+                            final ProcessRecord pr = uidRecord.getProcessRecordByIndex(i);
+                            if (pr != null && pr.mState.hasOverlayUi()) {
+                                ret = REASON_SYSTEM_ALERT_WINDOW_PERMISSION;
+                                break;
+                            }
                         }
                     }
-                } else {
-                    Slog.e(TAG, "Could not find process record for SAW check");
-                }
-            } else {
-                if (mAm.mAtmInternal.hasSystemAlertWindowPermission(callingUid, callingPid,
-                        callingPackage)) {
+                } else { // pre-V logic
                     ret = REASON_SYSTEM_ALERT_WINDOW_PERMISSION;
                 }
             }
@@ -9009,6 +9008,7 @@
         r.isForeground = true;
         r.mFgsEnterTime = SystemClock.uptimeMillis();
         r.foregroundServiceType = options.mForegroundServiceTypes;
+        r.updateOomAdjSeq();
         setFgsRestrictionLocked(callingPackage, callingPid, callingUid, intent, r, userId,
                 BackgroundStartPrivileges.NONE,  false /* isBindService */);
         final ProcessServiceRecord psr = callerApp.mServices;
@@ -9071,6 +9071,7 @@
             }
         }
         if (r != null) {
+            r.updateOomAdjSeq();
             bringDownServiceLocked(r, false);
         } else {
             Slog.e(TAG, "stopForegroundServiceDelegateLocked delegate does not exist "
@@ -9096,6 +9097,7 @@
             }
         }
         if (r != null) {
+            r.updateOomAdjSeq();
             bringDownServiceLocked(r, false);
         } else {
             Slog.e(TAG, "stopForegroundServiceDelegateLocked delegate does not exist");
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 272e84b..f7ed702 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -163,7 +163,6 @@
 
     static final String KEY_USE_TIERED_CACHED_ADJ = "use_tiered_cached_adj";
     static final String KEY_TIERED_CACHED_ADJ_DECAY_TIME = "tiered_cached_adj_decay_time";
-    static final String KEY_USE_MODERN_TRIM = "use_modern_trim";
 
     /**
      * Whether or not to enable the new oom adjuster implementation.
@@ -239,8 +238,6 @@
     private static final boolean DEFAULT_USE_TIERED_CACHED_ADJ = false;
     private static final long DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME = 60 * 1000;
 
-    private static final boolean DEFAULT_USE_MODERN_TRIM = true;
-
     /**
      * The default value to {@link #KEY_ENABLE_NEW_OOMADJ}.
      */
@@ -1136,9 +1133,6 @@
     /** @see #KEY_TIERED_CACHED_ADJ_DECAY_TIME */
     public long TIERED_CACHED_ADJ_DECAY_TIME = DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME;
 
-    /** @see #KEY_USE_MODERN_TRIM */
-    public boolean USE_MODERN_TRIM = DEFAULT_USE_MODERN_TRIM;
-
     /** @see #KEY_ENABLE_NEW_OOMADJ */
     public boolean ENABLE_NEW_OOMADJ = DEFAULT_ENABLE_NEW_OOM_ADJ;
 
@@ -1343,9 +1337,6 @@
                             case KEY_TIERED_CACHED_ADJ_DECAY_TIME:
                                 updateUseTieredCachedAdj();
                                 break;
-                            case KEY_USE_MODERN_TRIM:
-                                updateUseModernTrim();
-                                break;
                             case KEY_DISABLE_APP_PROFILER_PSS_PROFILING:
                                 updateDisableAppProfilerPssProfiling();
                                 break;
@@ -2233,13 +2224,6 @@
             DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME);
     }
 
-    private void updateUseModernTrim() {
-        USE_MODERN_TRIM = DeviceConfig.getBoolean(
-            DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
-            KEY_USE_MODERN_TRIM,
-            DEFAULT_USE_MODERN_TRIM);
-    }
-
     private void updateEnableNewOomAdj() {
         ENABLE_NEW_OOMADJ = DeviceConfig.getBoolean(
             DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT,
diff --git a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
index 55b161a..dcda5c2 100644
--- a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
+++ b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
@@ -55,9 +55,7 @@
     static final boolean DEBUG_BACKGROUND_CHECK = DEBUG_ALL || false;
     static final boolean DEBUG_BACKUP = DEBUG_ALL || false;
     static final boolean DEBUG_BROADCAST = DEBUG_ALL || false;
-    static final boolean DEBUG_BROADCAST_BACKGROUND = DEBUG_BROADCAST || false;
     static final boolean DEBUG_BROADCAST_LIGHT = DEBUG_BROADCAST || false;
-    static final boolean DEBUG_BROADCAST_DEFERRAL = DEBUG_BROADCAST || false;
     static final boolean DEBUG_COMPACTION = DEBUG_ALL || false;
     static final boolean DEBUG_FREEZER = DEBUG_ALL || false;
     static final boolean DEBUG_LRU = DEBUG_ALL || false;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 4364f16..ad15ea9 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -51,7 +51,6 @@
 import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_SHELL;
 import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_SYSTEM_INIT;
 import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_UI_VISIBILITY;
-import static android.app.AppOpsManager.MODE_ALLOWED;
 import static android.app.AppOpsManager.OP_NONE;
 import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_BACKUP;
 import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_INSTRUMENTATION;
@@ -136,6 +135,7 @@
 import static com.android.internal.util.FrameworkStatsLog.UNSAFE_INTENT_EVENT_REPORTED__EVENT_TYPE__INTERNAL_NON_EXPORTED_COMPONENT_MATCH;
 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;
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL;
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALLOWLISTS;
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKGROUND_CHECK;
@@ -250,7 +250,6 @@
 import android.app.ProcessMemoryState;
 import android.app.ProfilerInfo;
 import android.app.ServiceStartNotAllowedException;
-import android.app.SyncNotedAppOp;
 import android.app.WaitResult;
 import android.app.assist.ActivityId;
 import android.app.backup.BackupAnnotations.BackupDestination;
@@ -414,6 +413,7 @@
 import com.android.internal.os.BinderCallHeavyHitterWatcher.BinderCallHeavyHitterListener;
 import com.android.internal.os.BinderCallHeavyHitterWatcher.HeavyHitterContainer;
 import com.android.internal.os.BinderInternal;
+import com.android.internal.os.BinderInternal.BinderProxyCountEventListener;
 import com.android.internal.os.BinderTransactionNameResolver;
 import com.android.internal.os.ByteTransferPipe;
 import com.android.internal.os.IResultReceiver;
@@ -425,17 +425,11 @@
 import com.android.internal.pm.pkg.parsing.ParsingPackageUtils;
 import com.android.internal.policy.AttributeCache;
 import com.android.internal.protolog.common.ProtoLog;
-import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.DumpUtils;
 import com.android.internal.util.FastPrintWriter;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.MemInfoReader;
 import com.android.internal.util.Preconditions;
-import com.android.internal.util.function.DodecFunction;
-import com.android.internal.util.function.HexFunction;
-import com.android.internal.util.function.OctFunction;
-import com.android.internal.util.function.QuadFunction;
-import com.android.internal.util.function.UndecFunction;
 import com.android.server.AlarmManagerInternal;
 import com.android.server.BootReceiver;
 import com.android.server.DeviceIdleInternal;
@@ -614,8 +608,8 @@
     private static final int MINIMUM_MEMORY_GROWTH_THRESHOLD = 10 * 1000; // 10 MB
 
     /**
-     * The number of binder proxies we need to have before we start warning and
-     * dumping debug info.
+     * The number of binder proxies we need to have before we start dumping debug info
+     * and kill the offenders.
      */
     private static final int BINDER_PROXY_HIGH_WATERMARK = 6000;
 
@@ -625,6 +619,11 @@
      */
     private static final int BINDER_PROXY_LOW_WATERMARK = 5500;
 
+    /**
+     * The number of binder proxies we need to have before we start warning.
+     */
+    private static final int BINDER_PROXY_WARNING_WATERMARK = 5750;
+
     // Max character limit for a notification title. If the notification title is larger than this
     // the notification will not be legible to the user.
     private static final int MAX_BUGREPORT_TITLE_SIZE = 100;
@@ -636,7 +635,8 @@
     static final String EXTRA_DESCRIPTION = "android.intent.extra.DESCRIPTION";
     static final String EXTRA_BUGREPORT_TYPE = "android.intent.extra.BUGREPORT_TYPE";
     static final String EXTRA_BUGREPORT_NONCE = "android.intent.extra.BUGREPORT_NONCE";
-
+    static final String EXTRA_EXTRA_ATTACHMENT_URI =
+            "android.intent.extra.EXTRA_ATTACHMENT_URI";
     /**
      * It is now required for apps to explicitly set either
      * {@link android.content.Context#RECEIVER_EXPORTED} or
@@ -725,6 +725,9 @@
     // Whether we should use SCHED_FIFO for UI and RenderThreads.
     final boolean mUseFifoUiScheduling;
 
+    /** Whether some specified important processes are allowed to use FIFO priority. */
+    boolean mAllowSpecifiedFifoScheduling = true;
+
     @GuardedBy("this")
     private final SparseArray<IUnsafeIntentStrictModeCallback>
             mStrictModeCallbacks = new SparseArray<>();
@@ -763,6 +766,8 @@
     @GuardedBy("mDeliveryGroupPolicyIgnoredActions")
     private final ArraySet<String> mDeliveryGroupPolicyIgnoredActions = new ArraySet();
 
+    private AccessCheckDelegateHelper mAccessCheckDelegateHelper;
+
     /**
      * Uids of apps with current active camera sessions.  Access synchronized on
      * the IntArray instance itself, and no other locks must be acquired while that
@@ -1046,6 +1051,10 @@
     @GuardedBy("this")
     final SparseArray<ImportanceToken> mImportantProcesses = new SparseArray<ImportanceToken>();
 
+    /** The processes that are allowed to use SCHED_FIFO prorioty. */
+    @GuardedBy("mProcLock")
+    final ArrayList<ProcessRecord> mSpecifiedFifoProcesses = new ArrayList<>();
+
     /**
      * List of records for processes that someone had tried to start before the
      * system was ready.  We don't start them at that point, but ensure they
@@ -1680,6 +1689,11 @@
     PermissionManagerServiceInternal mPermissionManagerInt;
     private TestUtilityService mTestUtilityService;
 
+    // Packages which have received a (LOCKED_)BOOT_COMPLETED broadcast since
+    // the private space profile has been started
+    @GuardedBy("this")
+    private final ArraySet<String> mPrivateSpaceBootCompletedPackages = new ArraySet<String>();
+
     /**
      * Whether to force background check on all apps (for battery saver) or not.
      */
@@ -2307,6 +2321,19 @@
         @Override
         public void onUserStopped(@NonNull TargetUser user) {
             mService.mBatteryStatsService.onCleanupUser(user.getUserIdentifier());
+
+            if (android.os.Flags.allowPrivateProfile()
+                    && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
+                final UserManagerInternal umInternal =
+                        LocalServices.getService(UserManagerInternal.class);
+                UserInfo userInfo = umInternal.getUserInfo(user.getUserIdentifier());
+
+                if (userInfo != null && userInfo.isPrivateProfile()) {
+                    synchronized (mService) {
+                        mService.mPrivateSpaceBootCompletedPackages.clear();
+                    }
+                }
+            }
         }
 
         public ActivityManagerService getService() {
@@ -2656,6 +2683,11 @@
         return mBackgroundLaunchBroadcasts;
     }
 
+    private String getWearRemoteIntentAction() {
+        return mContext.getResources().getString(
+                    com.android.internal.R.string.config_wearRemoteIntentAction);
+    }
+
     /**
      * Ensures that the given package name has an explicit set of allowed associations.
      * If it does not, give it an empty set.
@@ -4394,7 +4426,9 @@
                         packageName, null, userId);
         }
 
-        if (packageName == null || uninstalling || packageStateStopped) {
+        final boolean clearPendingIntentsForStoppedApp = (android.content.pm.Flags.stayStopped()
+                && packageStateStopped);
+        if (packageName == null || uninstalling || clearPendingIntentsForStoppedApp) {
             didSomething |= mPendingIntentController.removePendingIntentsForPackage(
                     packageName, userId, appId, doit);
         }
@@ -5037,13 +5071,32 @@
     }
 
     /**
-     * Send LOCKED_BOOT_COMPLETED and BOOT_COMPLETED to the package explicitly when unstopped
+     * Send LOCKED_BOOT_COMPLETED and BOOT_COMPLETED to the package explicitly when unstopped,
+     * or when the package first starts in private space
      */
     private void maybeSendBootCompletedLocked(ProcessRecord app) {
-        if (!android.content.pm.Flags.stayStopped()) return;
-        // Nothing to do if it wasn't previously stopped
-        if (!app.wasForceStopped() && !app.getWindowProcessController().wasForceStopped()) {
-            return;
+        boolean sendBroadcast = false;
+        if (android.os.Flags.allowPrivateProfile()
+                && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
+            final UserManagerInternal umInternal =
+                    LocalServices.getService(UserManagerInternal.class);
+            UserInfo userInfo = umInternal.getUserInfo(app.userId);
+
+            if (userInfo != null && userInfo.isPrivateProfile()) {
+                // Packages in private space get deferred boot completed whenever they start the
+                // first time since profile start
+                if (!mPrivateSpaceBootCompletedPackages.contains(app.info.packageName)) {
+                    mPrivateSpaceBootCompletedPackages.add(app.info.packageName);
+                    sendBroadcast = true;
+                } // else, stopped packages in private space may still hit the logic below
+            }
+        }
+        if (!sendBroadcast) {
+            if (!android.content.pm.Flags.stayStopped()) return;
+            // Nothing to do if it wasn't previously stopped
+            if (!app.wasForceStopped() && !app.getWindowProcessController().wasForceStopped()) {
+                return;
+            }
         }
 
         // Send LOCKED_BOOT_COMPLETED, if necessary
@@ -6419,7 +6472,7 @@
      * This is a shortcut and <b>DOES NOT</b> include all reasons.
      * Use {@link #canScheduleUserInitiatedJobs(int, int, String)} to cover all cases.
      */
-    static boolean doesReasonCodeAllowSchedulingUserInitiatedJobs(int reasonCode) {
+    static boolean doesReasonCodeAllowSchedulingUserInitiatedJobs(int reasonCode, int uid) {
         switch (reasonCode) {
             case REASON_PROC_STATE_PERSISTENT:
             case REASON_PROC_STATE_PERSISTENT_UI:
@@ -6429,11 +6482,21 @@
             case REASON_SYSTEM_UID:
             case REASON_START_ACTIVITY_FLAG:
             case REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD:
-            case REASON_SYSTEM_ALERT_WINDOW_PERMISSION:
             case REASON_COMPANION_DEVICE_MANAGER:
             case REASON_BACKGROUND_ACTIVITY_PERMISSION:
             case REASON_INSTR_BACKGROUND_ACTIVITY_PERMISSION:
                 return true;
+            case REASON_SYSTEM_ALERT_WINDOW_PERMISSION:
+                if (!Flags.fgsDisableSaw()
+                        || !CompatChanges.isChangeEnabled(FGS_SAW_RESTRICTIONS, uid)) {
+                    return true;
+                } else {
+                    // With the new SAW restrictions starting Android V, only allow the app to
+                    // schedule a user-initiated job if it's currently showing an overlay window
+                    // in additional to holding the permission - this additional logic will be
+                    // checked in #canScheduleUserInitiatedJobs(int, int, String) below since this
+                    // method is simply a shortcut for checking based on the reason codes.
+                }
         }
         return false;
     }
@@ -6446,7 +6509,7 @@
      */
     @GuardedBy(anyOf = {"this", "mProcLock"})
     private boolean isProcessInStateToScheduleUserInitiatedJobsLocked(
-            @Nullable ProcessRecord pr, long nowElapsed) {
+            @Nullable ProcessRecord pr, long nowElapsed, int uid) {
         if (pr == null) {
             return false;
         }
@@ -6463,7 +6526,7 @@
         final int procstate = state.getCurProcState();
         if (procstate <= PROCESS_STATE_BOUND_TOP) {
             if (doesReasonCodeAllowSchedulingUserInitiatedJobs(
-                    getReasonCodeFromProcState(procstate))) {
+                    getReasonCodeFromProcState(procstate), uid)) {
                 return true;
             }
         }
@@ -6505,7 +6568,8 @@
             final long nowElapsed = SystemClock.elapsedRealtime();
             final BackgroundStartPrivileges backgroundStartPrivileges;
             if (processRecord != null) {
-                if (isProcessInStateToScheduleUserInitiatedJobsLocked(processRecord, nowElapsed)) {
+                if (isProcessInStateToScheduleUserInitiatedJobsLocked(
+                        processRecord, nowElapsed, uid)) {
                     return true;
                 }
                 backgroundStartPrivileges = processRecord.getBackgroundStartPrivileges();
@@ -6531,17 +6595,30 @@
             }
 
             final UidRecord uidRecord = mProcessList.getUidRecordLOSP(uid);
+            final boolean hasSawPermission = mAtmInternal.hasSystemAlertWindowPermission(uid, pid,
+                                                            pkgName);
+            final boolean strictSawCheckEnabled = Flags.fgsDisableSaw()
+                            && CompatChanges.isChangeEnabled(FGS_SAW_RESTRICTIONS, uid);
             if (uidRecord != null) {
                 for (int i = uidRecord.getNumOfProcs() - 1; i >= 0; --i) {
                     ProcessRecord pr = uidRecord.getProcessRecordByIndex(i);
-                    if (isProcessInStateToScheduleUserInitiatedJobsLocked(pr, nowElapsed)) {
+                    if (isProcessInStateToScheduleUserInitiatedJobsLocked(pr, nowElapsed, uid)) {
                         return true;
+                    } else if (hasSawPermission && strictSawCheckEnabled) {
+                        // isProcessInStateToScheduleUserInitiatedJobsLocked() doesn't do a strict
+                        // check for the SAW permission which is enabled from V onwards, so perform
+                        // that here (pre-V versions will be checked in the conditional below)
+                        // Starting Android V, only allow the app to schedule a user-initiated job
+                        // if it's granted the permission and currently showing an overlay window
+                        if (pr != null && pr.mState.hasOverlayUi()) {
+                            return true;
+                        }
                     }
                 }
             }
 
-            if (mAtmInternal.hasSystemAlertWindowPermission(uid, pid, pkgName)) {
-                // REASON_SYSTEM_ALERT_WINDOW_PERMISSION;
+            if (hasSawPermission && !strictSawCheckEnabled) {
+                // REASON_SYSTEM_ALERT_WINDOW_PERMISSION (pre-V)
                 return true;
             }
 
@@ -6864,6 +6941,16 @@
         return mPermissionManagerInt;
     }
 
+    private AccessCheckDelegateHelper getAccessCheckDelegateHelper() {
+        // Intentionally hold no locks: in case of race conditions, the mPermissionManagerInt will
+        // be set to the same value anyway.
+        if (mAccessCheckDelegateHelper == null) {
+            mAccessCheckDelegateHelper = new AccessCheckDelegateHelper(mProcLock,
+                    mActiveInstrumentation, mAppOpsService, getPermissionManagerInternal());
+        }
+        return mAccessCheckDelegateHelper;
+    }
+
     /** Returns whether the given package was ever launched since install */
     boolean wasPackageEverLaunched(String packageName, @UserIdInt int userId) {
         boolean wasLaunched = false;
@@ -7577,6 +7664,16 @@
      */
     public void requestBugReportWithDescription(@Nullable String shareTitle,
             @Nullable String shareDescription, int bugreportType, long nonce) {
+        requestBugReportWithDescription(shareTitle, shareDescription, bugreportType, nonce, null);
+    }
+
+    /**
+     * Takes a bugreport using bug report API ({@code BugreportManager}) which gets
+     * triggered by sending a broadcast to Shell. Optionally adds an extra attachment.
+     */
+    public void requestBugReportWithDescription(@Nullable String shareTitle,
+            @Nullable String shareDescription, int bugreportType, long nonce,
+            @Nullable Uri extraAttachment) {
         String type = null;
         switch (bugreportType) {
             case BugreportParams.BUGREPORT_MODE_FULL:
@@ -7631,6 +7728,10 @@
         triggerShellBugreport.setPackage(SHELL_APP_PACKAGE);
         triggerShellBugreport.putExtra(EXTRA_BUGREPORT_TYPE, bugreportType);
         triggerShellBugreport.putExtra(EXTRA_BUGREPORT_NONCE, nonce);
+        if (extraAttachment != null) {
+            triggerShellBugreport.putExtra(EXTRA_EXTRA_ATTACHMENT_URI, extraAttachment);
+            triggerShellBugreport.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        }
         triggerShellBugreport.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
         triggerShellBugreport.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
         if (shareTitle != null) {
@@ -7684,6 +7785,15 @@
     }
 
     /**
+     * Takes an interactive bugreport with a progress notification. Also attaches given file uri.
+     */
+    @Override
+    public void requestBugReportWithExtraAttachment(@NonNull Uri extraAttachment) {
+        requestBugReportWithDescription(null, null, BugreportParams.BUGREPORT_MODE_INTERACTIVE, 0L,
+                extraAttachment);
+    }
+
+    /**
      * Takes an interactive bugreport with a progress notification. Also, shows the given title and
      * description on the final share notification
      */
@@ -7973,6 +8083,18 @@
         return uidRecord != null && !uidRecord.isSetIdle();
     }
 
+    @Override
+    public long getUidLastIdleElapsedTime(int uid, String callingPackage) {
+        if (!hasUsageStatsPermission(callingPackage)) {
+            enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
+                    "getUidLastIdleElapsedTime");
+        }
+        synchronized (mProcLock) {
+            final UidRecord uidRecord = mProcessList.getUidRecordLOSP(uid);
+            return uidRecord != null ? uidRecord.getRealLastIdleTime() : 0;
+        }
+    }
+
     @GuardedBy("mUidFrozenStateChangedCallbackList")
     private final RemoteCallbackList<IUidFrozenStateChangedCallback>
             mUidFrozenStateChangedCallbackList = new RemoteCallbackList<>();
@@ -8129,6 +8251,27 @@
         return false;
     }
 
+    /**
+     * Switches the priority between SCHED_FIFO and SCHED_OTHER for the main thread and render
+     * thread of the given process.
+     */
+    @GuardedBy("mProcLock")
+    static void setFifoPriority(@NonNull ProcessRecord app, boolean enable) {
+        final int pid = app.getPid();
+        final int renderThreadTid = app.getRenderThreadTid();
+        if (enable) {
+            scheduleAsFifoPriority(pid, true /* suppressLogs */);
+            if (renderThreadTid != 0) {
+                scheduleAsFifoPriority(renderThreadTid, true /* suppressLogs */);
+            }
+        } else {
+            scheduleAsRegularPriority(pid, true /* suppressLogs */);
+            if (renderThreadTid != 0) {
+                scheduleAsRegularPriority(renderThreadTid, true /* suppressLogs */);
+            }
+        }
+    }
+
     @Override
     public void setRenderThread(int tid) {
         synchronized (mProcLock) {
@@ -8154,7 +8297,7 @@
                 // promote to FIFO now
                 if (proc.mState.getCurrentSchedulingGroup() == ProcessList.SCHED_GROUP_TOP_APP) {
                     if (DEBUG_OOM_ADJ) Slog.d("UI_FIFO", "Promoting " + tid + "out of band");
-                    if (mUseFifoUiScheduling) {
+                    if (proc.useFifoUiScheduling()) {
                         setThreadScheduler(proc.getRenderThreadTid(),
                                 SCHED_FIFO | SCHED_RESET_ON_FORK, 1);
                     } else {
@@ -9009,34 +9152,10 @@
 
             t.traceBegin("setBinderProxies");
             BinderInternal.nSetBinderProxyCountWatermarks(BINDER_PROXY_HIGH_WATERMARK,
-                    BINDER_PROXY_LOW_WATERMARK);
+                    BINDER_PROXY_LOW_WATERMARK, BINDER_PROXY_WARNING_WATERMARK);
             BinderInternal.nSetBinderProxyCountEnabled(true);
-            BinderInternal.setBinderProxyCountCallback(
-                    (uid) -> {
-                        Slog.wtf(TAG, "Uid " + uid + " sent too many Binders to uid "
-                                + Process.myUid());
-                        BinderProxy.dumpProxyDebugInfo();
-                        CriticalEventLog.getInstance().logExcessiveBinderCalls(uid);
-                        if (uid == Process.SYSTEM_UID) {
-                            Slog.i(TAG, "Skipping kill (uid is SYSTEM)");
-                        } else {
-                            killUid(UserHandle.getAppId(uid), UserHandle.getUserId(uid),
-                                    ApplicationExitInfo.REASON_EXCESSIVE_RESOURCE_USAGE,
-                                    ApplicationExitInfo.SUBREASON_EXCESSIVE_BINDER_OBJECTS,
-                                    "Too many Binders sent to SYSTEM");
-                            // We need to run a GC here, because killing the processes involved
-                            // actually isn't guaranteed to free up the proxies; in fact, if the
-                            // GC doesn't run for a long time, we may even exceed the global
-                            // proxy limit for a process (20000), resulting in system_server itself
-                            // being killed.
-                            // Note that the GC here might not actually clean up all the proxies,
-                            // because the binder reference decrements will come in asynchronously;
-                            // but if new processes belonging to the UID keep adding proxies, we
-                            // will get another callback here, and run the GC again - this time
-                            // cleaning up the old proxies.
-                            VMRuntime.getRuntime().requestConcurrentGC();
-                        }
-                    }, mHandler);
+            BinderInternal.setBinderProxyCountCallback(new MyBinderProxyCountEventListener(),
+                    mHandler);
             t.traceEnd(); // setBinderProxies
 
             t.traceEnd(); // ActivityManagerStartApps
@@ -9051,6 +9170,46 @@
         }
     }
 
+    private class MyBinderProxyCountEventListener implements BinderProxyCountEventListener {
+        @Override
+        public void onLimitReached(int uid) {
+            Slog.wtf(TAG, "Uid " + uid + " sent too many Binders to uid "
+                    + Process.myUid());
+            BinderProxy.dumpProxyDebugInfo();
+            CriticalEventLog.getInstance().logExcessiveBinderCalls(uid);
+            if (uid == Process.SYSTEM_UID) {
+                Slog.i(TAG, "Skipping kill (uid is SYSTEM)");
+            } else {
+                killUid(UserHandle.getAppId(uid), UserHandle.getUserId(uid),
+                        ApplicationExitInfo.REASON_EXCESSIVE_RESOURCE_USAGE,
+                        ApplicationExitInfo.SUBREASON_EXCESSIVE_BINDER_OBJECTS,
+                        "Too many Binders sent to SYSTEM");
+                // We need to run a GC here, because killing the processes involved
+                // actually isn't guaranteed to free up the proxies; in fact, if the
+                // GC doesn't run for a long time, we may even exceed the global
+                // proxy limit for a process (20000), resulting in system_server itself
+                // being killed.
+                // Note that the GC here might not actually clean up all the proxies,
+                // because the binder reference decrements will come in asynchronously;
+                // but if new processes belonging to the UID keep adding proxies, we
+                // will get another callback here, and run the GC again - this time
+                // cleaning up the old proxies.
+                VMRuntime.getRuntime().requestConcurrentGC();
+            }
+        }
+
+        @Override
+        public void onWarningThresholdReached(int uid) {
+            if (Flags.logExcessiveBinderProxies()) {
+                Slog.w(TAG, "Uid " + uid + " sent too many ("
+                        + BINDER_PROXY_WARNING_WATERMARK + ") Binders to uid " + Process.myUid());
+                FrameworkStatsLog.write(
+                        FrameworkStatsLog.EXCESSIVE_BINDER_PROXY_COUNT_REPORTED,
+                        uid);
+            }
+        }
+    }
+
     private void watchDeviceProvisioning(Context context) {
         // setting system property based on whether device is provisioned
 
@@ -11175,6 +11334,9 @@
             if (mAlwaysFinishActivities) {
                 pw.println("  mAlwaysFinishActivities=" + mAlwaysFinishActivities);
             }
+            if (mAllowSpecifiedFifoScheduling) {
+                pw.println("  mAllowSpecifiedFifoScheduling=true");
+            }
             if (dumpAll) {
                 pw.println("  Total persistent processes: " + numPers);
                 pw.println("  mProcessesReady=" + mProcessesReady
@@ -11979,18 +12141,23 @@
         for (int i=0; i<items.size(); i++) {
             MemItem mi = items.get(i);
             if (!isCompact) {
-                pw.printf("%s%s: %s%s\n", prefix, stringifyKBSize(dumpPss ? mi.pss : mi.mRss),
+                String printFormat = "%s%s: %s%s\n";
+                if ((dumpPss && dumpSwapPss) || dumpPrivateDirty) {
+                    StringBuilder format = new StringBuilder();
+                    format.append("%s%s: %-60s%s");
+                    if (dumpSwapPss) {
+                        format.append(String.format("(%s in swap%s", stringifyKBSize(mi.swapPss),
+                                dumpPrivateDirty ? ", " : ")"));
+                    }
+                    if (dumpPrivateDirty) {
+                        format.append(String.format("%s%s private dirty)", dumpSwapPss ? "" : "(",
+                                stringifyKBSize(mi.mPrivateDirty)));
+                    }
+                    printFormat = format.append("\n").toString();
+                }
+                pw.printf(printFormat, prefix, stringifyKBSize(dumpPss ? mi.pss : mi.mRss),
                             mi.label,
                             mi.userId != UserHandle.USER_SYSTEM ? " (user " + mi.userId + ")" : "");
-                if (dumpPss && dumpSwapPss) {
-                    pw.printf("(%s in swap%s", stringifyKBSize(mi.swapPss),
-                            dumpPrivateDirty ? ", " : ")");
-                }
-                if (dumpPrivateDirty) {
-                    pw.printf("%s%s private dirty)", dumpSwapPss ? "" : "(",
-                            stringifyKBSize(mi.mPrivateDirty));
-                }
-                pw.printf("\n");
             } else if (mi.isProc) {
                 pw.print("proc,"); pw.print(tag); pw.print(","); pw.print(mi.shortLabel);
                 pw.print(","); pw.print(mi.id); pw.print(",");
@@ -15213,6 +15380,18 @@
                 intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
             }
 
+            // TODO: b/329211459 - Remove this after background remote intent is fixed.
+            if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)
+                    && getWearRemoteIntentAction().equals(action)) {
+                final int callerProcState = callerApp != null
+                        ? callerApp.getCurProcState()
+                        : ActivityManager.PROCESS_STATE_NONEXISTENT;
+                if (ActivityManager.RunningAppProcessInfo.procStateToImportance(callerProcState)
+                        > ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
+                    return ActivityManager.START_CANCELED;
+                }
+            }
+
             switch (action) {
                 case Intent.ACTION_MEDIA_SCANNER_SCAN_FILE:
                     UserManagerInternal umInternal = LocalServices.getService(
@@ -16485,8 +16664,8 @@
                         // Go back to the default mode of denying OP_NO_ISOLATED_STORAGE app op.
                         mAppOpsService.setMode(AppOpsManager.OP_NO_ISOLATED_STORAGE, app.uid,
                                 app.info.packageName, AppOpsManager.MODE_ERRORED);
-                        mAppOpsService.setAppOpsServiceDelegate(null);
-                        getPermissionManagerInternal().stopShellPermissionIdentityDelegation();
+                        getAccessCheckDelegateHelper()
+                                .onInstrumentationFinished(app.uid, app.info.packageName);
                         mHandler.obtainMessage(SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG,
                                 instr.mUiAutomationConnection).sendToTarget();
                     }
@@ -17226,6 +17405,12 @@
                 }
             }
         }
+
+        if (com.android.window.flags.Flags.fifoPriorityForMajorUiProcesses()) {
+            synchronized (mProcLock) {
+                adjustFifoProcessesIfNeeded(uid, !active /* allowFifo */);
+            }
+        }
     }
 
     final boolean isCameraActiveForUid(@UserIdInt int uid) {
@@ -17234,6 +17419,34 @@
         }
     }
 
+    /**
+     * This is called when the given uid is using camera. If the uid has top process state, then
+     * cancel the FIFO priority of the high priority processes.
+     */
+    @VisibleForTesting
+    @GuardedBy("mProcLock")
+    void adjustFifoProcessesIfNeeded(int preemptiveUid, boolean allowSpecifiedFifo) {
+        if (allowSpecifiedFifo == mAllowSpecifiedFifoScheduling) {
+            return;
+        }
+        if (!allowSpecifiedFifo) {
+            final UidRecord uidRec = mProcessList.mActiveUids.get(preemptiveUid);
+            if (uidRec == null || uidRec.getCurProcState() > PROCESS_STATE_TOP) {
+                // To avoid frequent switching by background camera usages, e.g. face unlock,
+                // face detection (auto rotation), screen attention (keep screen on).
+                return;
+            }
+        }
+        mAllowSpecifiedFifoScheduling = allowSpecifiedFifo;
+        for (int i = mSpecifiedFifoProcesses.size() - 1; i >= 0; i--) {
+            final ProcessRecord proc = mSpecifiedFifoProcesses.get(i);
+            if (proc.mState.getSetSchedGroup() != ProcessList.SCHED_GROUP_TOP_APP) {
+                continue;
+            }
+            setFifoPriority(proc, allowSpecifiedFifo /* enable */);
+        }
+    }
+
     @GuardedBy("this")
     final void doStopUidLocked(int uid, final UidRecord uidRec) {
         mServices.stopInBackgroundLocked(uid);
@@ -17500,7 +17713,8 @@
 
     @Override
     public boolean dumpHeap(String process, int userId, boolean managed, boolean mallocInfo,
-            boolean runGc, String path, ParcelFileDescriptor fd, RemoteCallback finishCallback) {
+            boolean runGc, String dumpBitmaps,
+            String path, ParcelFileDescriptor fd, RemoteCallback finishCallback) {
         try {
             // note: hijacking SET_ACTIVITY_WATCHER, but should be changed to
             // its own permission (same as profileControl).
@@ -17534,7 +17748,8 @@
                         }
                     }, null);
 
-                thread.dumpHeap(managed, mallocInfo, runGc, path, fd, intermediateCallback);
+                thread.dumpHeap(managed, mallocInfo, runGc, dumpBitmaps,
+                                path, fd, intermediateCallback);
                 fd = null;
                 return true;
             }
@@ -17746,9 +17961,35 @@
         mUserController.setStopUserOnSwitch(value);
     }
 
+    /** @deprecated use {@link #stopUserWithCallback(int, IStopUserCallback)} instead */
+    @Deprecated
     @Override
-    public int stopUser(final int userId, boolean force, final IStopUserCallback callback) {
-        return mUserController.stopUser(userId, force, /* allowDelayedLocking= */ false,
+    public int stopUser(final int userId,
+            boolean stopProfileRegardlessOfParent, final IStopUserCallback callback) {
+        return stopUserExceptCertainProfiles(userId, stopProfileRegardlessOfParent, callback);
+    }
+
+    /** Stops the given user. */
+    @Override
+    public int stopUserWithCallback(@UserIdInt int userId, @Nullable IStopUserCallback callback) {
+        return mUserController.stopUser(userId, /* allowDelayedLocking= */ false,
+                /* callback= */ callback, /* keyEvictedCallback= */ null);
+    }
+
+    /**
+     * Stops the given user.
+     *
+     * Usually, callers can just use @link{#stopUserWithCallback(int, IStopUserCallback)} instead.
+     *
+     * @param stopProfileRegardlessOfParent whether to stop the profile regardless of who its
+     *                                      parent is, e.g. even if the parent is the current user;
+     *                                      its value is irrelevant for non-profile users.
+     */
+    @Override
+    public int stopUserExceptCertainProfiles(@UserIdInt int userId,
+            boolean stopProfileRegardlessOfParent, @Nullable IStopUserCallback callback) {
+        return mUserController.stopUser(userId,
+                stopProfileRegardlessOfParent, /* allowDelayedLocking= */ false,
                 /* callback= */ callback, /* keyEvictedCallback= */ null);
     }
 
@@ -17757,11 +17998,9 @@
      * stopping only if {@code config_multiuserDelayUserDataLocking} overlay is set true.
      *
      * <p>When delayed locking is not enabled through the overlay, this call becomes the same
-     * with {@link #stopUser(int, boolean, IStopUserCallback)} call.
+     * with {@link #stopUserWithCallback(int, IStopUserCallback)} call.
      *
      * @param userId User id to stop.
-     * @param force Force stop the user even if the user is related with system user or current
-     *              user.
      * @param callback Callback called when user has stopped.
      *
      * @return {@link ActivityManager#USER_OP_SUCCESS} when user is stopped successfully. Returns
@@ -17771,9 +18010,8 @@
     // TODO(b/302662311): Add javadoc changes corresponding to the user property that allows
     // delayed locking behavior once the private space flag is finalized.
     @Override
-    public int stopUserWithDelayedLocking(final int userId, boolean force,
-            final IStopUserCallback callback) {
-        return mUserController.stopUser(userId, force, /* allowDelayedLocking= */ true,
+    public int stopUserWithDelayedLocking(@UserIdInt int userId, IStopUserCallback callback) {
+        return mUserController.stopUser(userId, /* allowDelayedLocking= */ true,
                 /* callback= */ callback, /* keyEvictedCallback= */ null);
     }
 
@@ -18009,7 +18247,8 @@
         public ComponentName startSdkSandboxService(Intent service, int clientAppUid,
                 String clientAppPackage, String processName) throws RemoteException {
             validateSdkSandboxParams(service, clientAppUid, clientAppPackage, processName);
-            if (mAppOpsService.checkPackage(clientAppUid, clientAppPackage) != MODE_ALLOWED) {
+            if (mAppOpsService.checkPackage(clientAppUid, clientAppPackage)
+                    != AppOpsManager.MODE_ALLOWED) {
                 throw new IllegalArgumentException("uid does not belong to provided package");
             }
             // TODO(b/269598719): Is passing the application thread of the system_server alright?
@@ -18078,7 +18317,8 @@
                 String processName, long flags)
                 throws RemoteException {
             validateSdkSandboxParams(service, clientAppUid, clientAppPackage, processName);
-            if (mAppOpsService.checkPackage(clientAppUid, clientAppPackage) != MODE_ALLOWED) {
+            if (mAppOpsService.checkPackage(clientAppUid, clientAppPackage)
+                    != AppOpsManager.MODE_ALLOWED) {
                 throw new IllegalArgumentException("uid does not belong to provided package");
             }
             if (conn == null) {
@@ -18172,6 +18412,11 @@
         }
 
         @Override
+        public boolean startUserInBackground(final int userId) {
+            return ActivityManagerService.this.startUserInBackground(userId);
+        }
+
+        @Override
         public void killForegroundAppsForUser(@UserIdInt int userId) {
             final ArrayList<ProcessRecord> procs = new ArrayList<>();
             synchronized (mProcLock) {
@@ -19630,7 +19875,7 @@
                 record.procStateSeqWaitingForNetwork = 0;
                 final long totalTime = SystemClock.uptimeMillis() - startTime;
                 if (totalTime >= mConstants.mNetworkAccessTimeoutMs || DEBUG_NETWORK) {
-                    Slog.w(TAG_NETWORK, "Total time waited for network rules to get updated: "
+                    Slog.wtf(TAG_NETWORK, "Total time waited for network rules to get updated: "
                             + totalTime + ". Uid: " + callingUid + " procStateSeq: "
                             + procStateSeq + " UidRec: " + record
                             + " validateUidRec: "
@@ -20381,268 +20626,41 @@
     @Override
     public void startDelegateShellPermissionIdentity(int delegateUid,
             @Nullable String[] permissions) {
-        if (UserHandle.getCallingAppId() != Process.SHELL_UID
-                && UserHandle.getCallingAppId() != Process.ROOT_UID) {
-            throw new SecurityException("Only the shell can delegate its permissions");
-        }
-
-        // We allow delegation only to one instrumentation started from the shell
-        synchronized (mProcLock) {
-            // If the delegate is already set up for the target UID, nothing to do.
-            if (mAppOpsService.getAppOpsServiceDelegate() != null) {
-                if (!(mAppOpsService.getAppOpsServiceDelegate() instanceof ShellDelegate)) {
-                    throw new IllegalStateException("Bad shell delegate state");
-                }
-                final ShellDelegate delegate = (ShellDelegate) mAppOpsService
-                        .getAppOpsServiceDelegate();
-                if (delegate.getDelegateUid() != delegateUid) {
-                    throw new SecurityException("Shell can delegate permissions only "
-                            + "to one instrumentation at a time");
-                }
-            }
-
-            final int instrCount = mActiveInstrumentation.size();
-            for (int i = 0; i < instrCount; i++) {
-                final ActiveInstrumentation instr = mActiveInstrumentation.get(i);
-                if (instr.mTargetInfo.uid != delegateUid) {
-                    continue;
-                }
-                // If instrumentation started from the shell the connection is not null
-                if (instr.mUiAutomationConnection == null) {
-                    throw new SecurityException("Shell can delegate its permissions" +
-                            " only to an instrumentation started from the shell");
-                }
-
-                // Hook them up...
-                final ShellDelegate shellDelegate = new ShellDelegate(delegateUid,
-                        permissions);
-                mAppOpsService.setAppOpsServiceDelegate(shellDelegate);
-                final String packageName = instr.mTargetInfo.packageName;
-                final List<String> permissionNames = permissions != null ?
-                        Arrays.asList(permissions) : null;
-                getPermissionManagerInternal().startShellPermissionIdentityDelegation(
-                        delegateUid, packageName, permissionNames);
-                return;
-            }
-        }
+        getAccessCheckDelegateHelper()
+                .startDelegateShellPermissionIdentity(delegateUid, permissions);
     }
 
     @Override
     public void stopDelegateShellPermissionIdentity() {
-        if (UserHandle.getCallingAppId() != Process.SHELL_UID
-                && UserHandle.getCallingAppId() != Process.ROOT_UID) {
-            throw new SecurityException("Only the shell can delegate its permissions");
-        }
-        synchronized (mProcLock) {
-            mAppOpsService.setAppOpsServiceDelegate(null);
-            getPermissionManagerInternal().stopShellPermissionIdentityDelegation();
-        }
+        getAccessCheckDelegateHelper().stopDelegateShellPermissionIdentity();
     }
 
     @Override
     public List<String> getDelegatedShellPermissions() {
-        if (UserHandle.getCallingAppId() != Process.SHELL_UID
-                && UserHandle.getCallingAppId() != Process.ROOT_UID) {
-            throw new SecurityException("Only the shell can get delegated permissions");
-        }
-        synchronized (mProcLock) {
-            return getPermissionManagerInternal().getDelegatedShellPermissions();
-        }
+        return getAccessCheckDelegateHelper().getDelegatedShellPermissions();
     }
 
-    private class ShellDelegate implements CheckOpsDelegate {
-        private final int mTargetUid;
-        @Nullable
-        private final String[] mPermissions;
+    @Override
+    public void addOverridePermissionState(int originatingUid, int uid, String permission,
+            int result) {
+        getAccessCheckDelegateHelper()
+                .addOverridePermissionState(originatingUid, uid, permission, result);
+    }
 
-        ShellDelegate(int targetUid, @Nullable String[] permissions) {
-            mTargetUid = targetUid;
-            mPermissions = permissions;
-        }
+    @Override
+    public void removeOverridePermissionState(int originatingUid, int uid, String permission) {
+        getAccessCheckDelegateHelper()
+                .removeOverridePermissionState(originatingUid, uid, permission);
+    }
 
-        int getDelegateUid() {
-            return mTargetUid;
-        }
+    @Override
+    public void clearOverridePermissionStates(int originatingUid, int uid) {
+        getAccessCheckDelegateHelper().clearOverridePermissionStates(originatingUid, uid);
+    }
 
-        @Override
-        public int checkOperation(int code, int uid, String packageName, String attributionTag,
-                int virtualDeviceId, boolean raw, HexFunction<Integer, Integer, String, String,
-                        Integer, Boolean, Integer> superImpl) {
-            if (uid == mTargetUid && isTargetOp(code)) {
-                final int shellUid = UserHandle.getUid(UserHandle.getUserId(uid),
-                        Process.SHELL_UID);
-                final long identity = Binder.clearCallingIdentity();
-                try {
-                    return superImpl.apply(code, shellUid, "com.android.shell", null,
-                            virtualDeviceId, raw);
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-            return superImpl.apply(code, uid, packageName, attributionTag, virtualDeviceId, raw);
-        }
-
-        @Override
-        public int checkAudioOperation(int code, int usage, int uid, String packageName,
-                QuadFunction<Integer, Integer, Integer, String, Integer> superImpl) {
-            if (uid == mTargetUid && isTargetOp(code)) {
-                final int shellUid = UserHandle.getUid(UserHandle.getUserId(uid),
-                        Process.SHELL_UID);
-                final long identity = Binder.clearCallingIdentity();
-                try {
-                    return superImpl.apply(code, usage, shellUid, "com.android.shell");
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-            return superImpl.apply(code, usage, uid, packageName);
-        }
-
-        @Override
-        public SyncNotedAppOp noteOperation(int code, int uid, @Nullable String packageName,
-                @Nullable String featureId, int virtualDeviceId, boolean shouldCollectAsyncNotedOp,
-                @Nullable String message, boolean shouldCollectMessage,
-                @NonNull OctFunction<Integer, Integer, String, String, Integer, Boolean, String,
-                        Boolean, SyncNotedAppOp> superImpl) {
-            if (uid == mTargetUid && isTargetOp(code)) {
-                final int shellUid = UserHandle.getUid(UserHandle.getUserId(uid),
-                        Process.SHELL_UID);
-                final long identity = Binder.clearCallingIdentity();
-                try {
-                    return superImpl.apply(code, shellUid, "com.android.shell", featureId,
-                            virtualDeviceId, shouldCollectAsyncNotedOp, message,
-                            shouldCollectMessage);
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-            return superImpl.apply(code, uid, packageName, featureId, virtualDeviceId,
-                    shouldCollectAsyncNotedOp, message, shouldCollectMessage);
-        }
-
-        @Override
-        public SyncNotedAppOp noteProxyOperation(int code,
-                @NonNull AttributionSource attributionSource, boolean shouldCollectAsyncNotedOp,
-                @Nullable String message, boolean shouldCollectMessage, boolean skiProxyOperation,
-                @NonNull HexFunction<Integer, AttributionSource, Boolean, String, Boolean,
-                                Boolean, SyncNotedAppOp> superImpl) {
-            if (attributionSource.getUid() == mTargetUid && isTargetOp(code)) {
-                final int shellUid = UserHandle.getUid(UserHandle.getUserId(
-                        attributionSource.getUid()), Process.SHELL_UID);
-                final long identity = Binder.clearCallingIdentity();
-                try {
-                    return superImpl.apply(code, new AttributionSource(shellUid,
-                            Process.INVALID_PID, "com.android.shell",
-                            attributionSource.getAttributionTag(), attributionSource.getToken(),
-                            /*renouncedPermissions*/ null, attributionSource.getDeviceId(),
-                            attributionSource.getNext()),
-                            shouldCollectAsyncNotedOp, message, shouldCollectMessage,
-                            skiProxyOperation);
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-            return superImpl.apply(code, attributionSource, shouldCollectAsyncNotedOp,
-                    message, shouldCollectMessage, skiProxyOperation);
-        }
-
-        @Override
-        public SyncNotedAppOp startOperation(IBinder token, int code, int uid,
-                @Nullable String packageName, @Nullable String attributionTag, int virtualDeviceId,
-                boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp,
-                @Nullable String message, boolean shouldCollectMessage,
-                @AttributionFlags int attributionFlags, int attributionChainId,
-                @NonNull DodecFunction<IBinder, Integer, Integer, String, String, Integer, Boolean,
-                        Boolean, String, Boolean, Integer, Integer, SyncNotedAppOp> superImpl) {
-            if (uid == mTargetUid && isTargetOp(code)) {
-                final int shellUid = UserHandle.getUid(UserHandle.getUserId(uid),
-                        Process.SHELL_UID);
-                final long identity = Binder.clearCallingIdentity();
-                try {
-                    return superImpl.apply(token, code, shellUid, "com.android.shell",
-                            attributionTag, virtualDeviceId, startIfModeDefault,
-                            shouldCollectAsyncNotedOp, message, shouldCollectMessage,
-                            attributionFlags, attributionChainId);
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-            return superImpl.apply(token, code, uid, packageName, attributionTag, virtualDeviceId,
-                    startIfModeDefault, shouldCollectAsyncNotedOp, message, shouldCollectMessage,
-                    attributionFlags, attributionChainId);
-        }
-
-        @Override
-        public SyncNotedAppOp startProxyOperation(@NonNull IBinder clientId, int code,
-                @NonNull AttributionSource attributionSource, boolean startIfModeDefault,
-                boolean shouldCollectAsyncNotedOp, String message, boolean shouldCollectMessage,
-                boolean skipProxyOperation, @AttributionFlags int proxyAttributionFlags,
-                @AttributionFlags int proxiedAttributionFlags, int attributionChainId,
-                @NonNull UndecFunction<IBinder, Integer, AttributionSource,
-                        Boolean, Boolean, String, Boolean, Boolean, Integer, Integer, Integer,
-                        SyncNotedAppOp> superImpl) {
-            if (attributionSource.getUid() == mTargetUid && isTargetOp(code)) {
-                final int shellUid = UserHandle.getUid(UserHandle.getUserId(
-                        attributionSource.getUid()), Process.SHELL_UID);
-                final long identity = Binder.clearCallingIdentity();
-                try {
-                    return superImpl.apply(clientId, code, new AttributionSource(shellUid,
-                            Process.INVALID_PID, "com.android.shell",
-                            attributionSource.getAttributionTag(), attributionSource.getToken(),
-                            /*renouncedPermissions*/ null, attributionSource.getDeviceId(),
-                            attributionSource.getNext()),
-                            startIfModeDefault, shouldCollectAsyncNotedOp, message,
-                            shouldCollectMessage, skipProxyOperation, proxyAttributionFlags,
-                            proxiedAttributionFlags, attributionChainId);
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-            return superImpl.apply(clientId, code, attributionSource, startIfModeDefault,
-                    shouldCollectAsyncNotedOp, message, shouldCollectMessage, skipProxyOperation,
-                    proxyAttributionFlags, proxiedAttributionFlags, attributionChainId);
-        }
-
-        @Override
-        public void finishProxyOperation(@NonNull IBinder clientId, int code,
-                @NonNull AttributionSource attributionSource, boolean skipProxyOperation,
-                @NonNull QuadFunction<IBinder, Integer, AttributionSource, Boolean,
-                        Void> superImpl) {
-            if (attributionSource.getUid() == mTargetUid && isTargetOp(code)) {
-                final int shellUid = UserHandle.getUid(UserHandle.getUserId(
-                        attributionSource.getUid()), Process.SHELL_UID);
-                final long identity = Binder.clearCallingIdentity();
-                try {
-                    superImpl.apply(clientId, code, new AttributionSource(shellUid,
-                            Process.INVALID_PID, "com.android.shell",
-                            attributionSource.getAttributionTag(), attributionSource.getToken(),
-                            /*renouncedPermissions*/ null, attributionSource.getDeviceId(),
-                            attributionSource.getNext()),
-                            skipProxyOperation);
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-            superImpl.apply(clientId, code, attributionSource, skipProxyOperation);
-        }
-
-        private boolean isTargetOp(int code) {
-            // null permissions means all ops are targeted
-            if (mPermissions == null) {
-                return true;
-            }
-            // no permission for the op means the op is targeted
-            final String permission = AppOpsManager.opToPermission(code);
-            if (permission == null) {
-                return true;
-            }
-            return isTargetPermission(permission);
-        }
-
-        private boolean isTargetPermission(@NonNull String permission) {
-            // null permissions means all permissions are targeted
-            return (mPermissions == null || ArrayUtils.contains(mPermissions, permission));
-        }
+    @Override
+    public void clearAllOverridePermissionStates(int originatingUid) {
+        getAccessCheckDelegateHelper().clearAllOverridePermissionStates(originatingUid);
     }
 
     /**
@@ -20851,4 +20869,14 @@
         }
         mOomAdjuster.mCachedAppOptimizer.binderError(debugPid, app, code, flags, err);
     }
+
+    @GuardedBy("this")
+    void enqueuePendingTopAppIfNecessaryLocked() {
+        mPendingStartActivityUids.enqueuePendingTopAppIfNecessaryLocked(this);
+    }
+
+    @GuardedBy("this")
+    void clearPendingTopAppLocked() {
+        mPendingStartActivityUids.clear();
+    }
 }
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 5a97e87..e70722c 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -1239,6 +1239,7 @@
         final PrintWriter err = getErrPrintWriter();
         boolean managed = true;
         boolean mallocInfo = false;
+        String dumpBitmaps = null;
         int userId = UserHandle.USER_CURRENT;
         boolean runGc = false;
 
@@ -1257,6 +1258,11 @@
             } else if (opt.equals("-m")) {
                 managed = false;
                 mallocInfo = true;
+            } else if (opt.equals("-b")) {
+                dumpBitmaps = getNextArg();
+                if (dumpBitmaps == null) {
+                    dumpBitmaps = "png"; // default to PNG in dumping bitmaps
+                }
             } else {
                 err.println("Error: Unknown option: " + opt);
                 return -1;
@@ -1288,8 +1294,8 @@
             }
         }, null);
 
-        if (!mInterface.dumpHeap(process, userId, managed, mallocInfo, runGc, heapFile, fd,
-                finishCallback)) {
+        if (!mInterface.dumpHeap(process, userId, managed, mallocInfo, runGc, dumpBitmaps,
+                heapFile, fd, finishCallback)) {
             err.println("HEAP DUMP FAILED on process " + process);
             return -1;
         }
@@ -2554,7 +2560,8 @@
         Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
                 "shell_runStopUser-" + userId + "-[stopUser]");
         try {
-            int res = mInterface.stopUser(userId, force, callback);
+            int res = mInterface.stopUserExceptCertainProfiles(
+                    userId, /* stopProfileRegardlessOfParent= */ force, callback);
             if (res != ActivityManager.USER_OP_SUCCESS) {
                 String txt = "";
                 switch (res) {
@@ -4284,11 +4291,14 @@
             pw.println("      --user <USER_ID> | current: When supplying a process name,");
             pw.println("          specify user of process to profile; uses current user if not");
             pw.println("          specified.");
-            pw.println("  dumpheap [--user <USER_ID> current] [-n] [-g] <PROCESS> <FILE>");
+            pw.println("  dumpheap [--user <USER_ID> current] [-n] [-g] [-b <format>] ");
+            pw.println("           <PROCESS> <FILE>");
             pw.println("      Dump the heap of a process.  The given <PROCESS> argument may");
             pw.println("        be either a process name or pid.  Options are:");
             pw.println("      -n: dump native heap instead of managed heap");
             pw.println("      -g: force GC before dumping the heap");
+            pw.println("      -b <format>: dump contents of bitmaps in the format specified,");
+            pw.println("         which can be \"png\", \"jpg\" or \"webp\".");
             pw.println("      --user <USER_ID> | current: When supplying a process name,");
             pw.println("          specify user of process to dump; uses current user if not specified.");
             pw.println("  set-debug-app [-w] [--persistent] <PACKAGE>");
@@ -4385,7 +4395,7 @@
             pw.println("      Stop execution of USER_ID, not allowing it to run any");
             pw.println("      code until a later explicit start or switch to it.");
             pw.println("      -w: wait for stop-user to complete.");
-            pw.println("      -f: force stop even if there are related users that cannot be stopped.");
+            pw.println("      -f: force stop, even if user has an unstoppable parent.");
             pw.println("  is-user-stopped <USER_ID>");
             pw.println("      Returns whether <USER_ID> has been stopped or not.");
             pw.println("  get-started-user-state <USER_ID>");
diff --git a/services/core/java/com/android/server/am/Android.bp b/services/core/java/com/android/server/am/Android.bp
index af1200e..0294ffe 100644
--- a/services/core/java/com/android/server/am/Android.bp
+++ b/services/core/java/com/android/server/am/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "am_flags",
     package: "com.android.server.am",
+    container: "system",
     srcs: ["*.aconfig"],
 }
 
diff --git a/services/core/java/com/android/server/am/AppBatteryTracker.java b/services/core/java/com/android/server/am/AppBatteryTracker.java
index 147f8d1..374abe0 100644
--- a/services/core/java/com/android/server/am/AppBatteryTracker.java
+++ b/services/core/java/com/android/server/am/AppBatteryTracker.java
@@ -2014,7 +2014,7 @@
             if (!mBgCurrentDrainHighThresholdByBgLocation) {
                 return false;
             }
-            if (mTracker.mContext.checkPermission(ACCESS_BACKGROUND_LOCATION,
+            if (mTracker.mInjector.checkPermission(ACCESS_BACKGROUND_LOCATION,
                     Process.INVALID_PID, uid) == PERMISSION_GRANTED) {
                 return true;
             }
diff --git a/services/core/java/com/android/server/am/AppPermissionTracker.java b/services/core/java/com/android/server/am/AppPermissionTracker.java
index c641b35..a47beae 100644
--- a/services/core/java/com/android/server/am/AppPermissionTracker.java
+++ b/services/core/java/com/android/server/am/AppPermissionTracker.java
@@ -293,7 +293,7 @@
                 mPermissionGranted = true;
                 return;
             }
-            mPermissionGranted = mContext.checkPermission(mPermission, Process.INVALID_PID, mUid)
+            mPermissionGranted = mInjector.checkPermission(mPermission, Process.INVALID_PID, mUid)
                     == PERMISSION_GRANTED;
         }
 
diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java
index 48daef8..6c16fba0 100644
--- a/services/core/java/com/android/server/am/AppProfiler.java
+++ b/services/core/java/com/android/server/am/AppProfiler.java
@@ -1051,7 +1051,9 @@
                                     + mProfile.mApp + " to " + mDumpUri.getPath());
                         }
                         thread.dumpHeap(/* managed= */ true,
-                                /* mallocInfo= */ false, /* runGc= */ false,
+                                /* mallocInfo= */ false,
+                                /* runGc= */ false,
+                                /* dumpbitmaps= */ null,
                                 mDumpUri.getPath(), fd,
                                 /* finishCallback= */ null);
                     } catch (RemoteException e) {
@@ -1357,7 +1359,7 @@
     }
 
     @GuardedBy({"mService", "mProcLock"})
-    boolean updateLowMemStateLSP(int numCached, int numEmpty, int numTrimming, long now) {
+    void updateLowMemStateLSP(int numCached, int numEmpty, int numTrimming, long now) {
         int memFactor;
         if (mLowMemDetector != null && mLowMemDetector.isAvailable()) {
             memFactor = mLowMemDetector.getMemFactor();
@@ -1422,114 +1424,37 @@
 
         mLastMemoryLevel = memFactor;
         mLastNumProcesses = mService.mProcessList.getLruSizeLOSP();
-        if (mService.mConstants.USE_MODERN_TRIM) {
-            // Modern trim is not sent based on lowmem state
-            // Dispatch UI_HIDDEN to processes that need it
-            mService.mProcessList.forEachLruProcessesLOSP(true, app -> {
-                final ProcessProfileRecord profile = app.mProfile;
-                final IApplicationThread thread;
-                final ProcessStateRecord state = app.mState;
-                if (state.hasProcStateChanged()) {
-                    state.setProcStateChanged(false);
-                }
-                int procState = app.mState.getCurProcState();
-                if (((procState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
-                        && procState < ActivityManager.PROCESS_STATE_CACHED_ACTIVITY)
-                        || app.mState.isSystemNoUi()) && app.mProfile.hasPendingUiClean()) {
-                    // If this application is now in the background and it
-                    // had done UI, then give it the special trim level to
-                    // have it free UI resources.
-                    if ((thread = app.getThread()) != null) {
-                        try {
-                            thread.scheduleTrimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
-                            app.mProfile.setPendingUiClean(false);
-                        } catch (RemoteException e) {
 
+        // Dispatch UI_HIDDEN to processes that need it
+        mService.mProcessList.forEachLruProcessesLOSP(
+                true,
+                app -> {
+                    final ProcessProfileRecord profile = app.mProfile;
+                    final IApplicationThread thread;
+                    final ProcessStateRecord state = app.mState;
+                    if (state.hasProcStateChanged()) {
+                        state.setProcStateChanged(false);
+                    }
+                    int procState = app.mState.getCurProcState();
+                    if (((procState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
+                                            && procState
+                                                    < ActivityManager.PROCESS_STATE_CACHED_ACTIVITY)
+                                    || app.mState.isSystemNoUi())
+                            && app.mProfile.hasPendingUiClean()) {
+                        // If this application is now in the background and it
+                        // had done UI, then give it the special trim level to
+                        // have it free UI resources.
+                        if ((thread = app.getThread()) != null) {
+                            try {
+                                thread.scheduleTrimMemory(
+                                        ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
+                                app.mProfile.setPendingUiClean(false);
+                            } catch (RemoteException e) {
+
+                            }
                         }
                     }
-                }
-            });
-            return false;
-        }
-
-        if (memFactor != ADJ_MEM_FACTOR_NORMAL) {
-            if (mLowRamStartTime == 0) {
-                mLowRamStartTime = now;
-            }
-            int fgTrimLevel;
-            switch (memFactor) {
-                case ADJ_MEM_FACTOR_CRITICAL:
-                    fgTrimLevel = ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL;
-                    break;
-                case ADJ_MEM_FACTOR_LOW:
-                    fgTrimLevel = ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW;
-                    break;
-                default:
-                    fgTrimLevel = ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE;
-                    break;
-            }
-            int factor = numTrimming / 3;
-            int minFactor = 2;
-            if (mHasHomeProcess) minFactor++;
-            if (mHasPreviousProcess) minFactor++;
-            if (factor < minFactor) factor = minFactor;
-            final int actualFactor = factor;
-            final int[] step = {0};
-            final int[] curLevel = {ComponentCallbacks2.TRIM_MEMORY_COMPLETE};
-            mService.mProcessList.forEachLruProcessesLOSP(true, app -> {
-                final ProcessProfileRecord profile = app.mProfile;
-                final int trimMemoryLevel = profile.getTrimMemoryLevel();
-                final ProcessStateRecord state = app.mState;
-                final int curProcState = state.getCurProcState();
-                IApplicationThread thread;
-                if (allChanged || state.hasProcStateChanged()) {
-                    mService.setProcessTrackerStateLOSP(app, trackerMemFactor);
-                    state.setProcStateChanged(false);
-                }
-                trimMemoryUiHiddenIfNecessaryLSP(app);
-                if (curProcState >= ActivityManager.PROCESS_STATE_HOME && !app.isKilledByAm()) {
-                    scheduleTrimMemoryLSP(app, curLevel[0], "Trimming memory of ");
-                    profile.setTrimMemoryLevel(curLevel[0]);
-                    step[0]++;
-                    if (step[0] >= actualFactor) {
-                        step[0] = 0;
-                        switch (curLevel[0]) {
-                            case ComponentCallbacks2.TRIM_MEMORY_COMPLETE:
-                                curLevel[0] = ComponentCallbacks2.TRIM_MEMORY_MODERATE;
-                                break;
-                            case ComponentCallbacks2.TRIM_MEMORY_MODERATE:
-                                curLevel[0] = ComponentCallbacks2.TRIM_MEMORY_BACKGROUND;
-                                break;
-                        }
-                    }
-                } else if (curProcState == ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
-                        && !app.isKilledByAm()) {
-                    scheduleTrimMemoryLSP(app, ComponentCallbacks2.TRIM_MEMORY_BACKGROUND,
-                            "Trimming memory of heavy-weight ");
-                    profile.setTrimMemoryLevel(ComponentCallbacks2.TRIM_MEMORY_BACKGROUND);
-                } else {
-                    scheduleTrimMemoryLSP(app, fgTrimLevel, "Trimming memory of fg ");
-                    profile.setTrimMemoryLevel(fgTrimLevel);
-                }
-            });
-        } else {
-            if (mLowRamStartTime != 0) {
-                mLowRamTimeSinceLastIdle += now - mLowRamStartTime;
-                mLowRamStartTime = 0;
-            }
-            mService.mProcessList.forEachLruProcessesLOSP(true, app -> {
-                final ProcessProfileRecord profile = app.mProfile;
-                final IApplicationThread thread;
-                final ProcessStateRecord state = app.mState;
-                if (allChanged || state.hasProcStateChanged()) {
-                    mService.setProcessTrackerStateLOSP(app, trackerMemFactor);
-                    state.setProcStateChanged(false);
-                }
-                trimMemoryUiHiddenIfNecessaryLSP(app);
-                profile.setTrimMemoryLevel(0);
-            });
-        }
-        return allChanged;
+                });
     }
 
     @GuardedBy({"mService", "mProcLock"})
diff --git a/services/core/java/com/android/server/am/AppRestrictionController.java b/services/core/java/com/android/server/am/AppRestrictionController.java
index 88f6bc9..8b1300b 100644
--- a/services/core/java/com/android/server/am/AppRestrictionController.java
+++ b/services/core/java/com/android/server/am/AppRestrictionController.java
@@ -235,6 +235,7 @@
     private final HandlerThread mBgHandlerThread;
     private final BgHandler mBgHandler;
     private final HandlerExecutor mBgExecutor;
+    private final HandlerExecutor mExecutor;
 
     // No lock is needed, as it's immutable after initialization in constructor.
     private final ArrayList<BaseAppStateTracker> mAppStateTrackers = new ArrayList<>();
@@ -1489,6 +1490,7 @@
         mConstantsObserver = new ConstantsObserver(mBgHandler, mContext);
         mNotificationHelper = new NotificationHelper(this);
         injector.initAppStateTrackers(this);
+        mExecutor = new HandlerExecutor(injector.getDefaultHandler());
     }
 
     void onSystemReady() {
@@ -1506,7 +1508,7 @@
         mInjector.getAppStateTracker().addBackgroundRestrictedAppListener(
                 mBackgroundRestrictionListener);
         mInjector.getAppStandbyInternal().addListener(mAppIdleStateChangeListener);
-        mInjector.getRoleManager().addOnRoleHoldersChangedListenerAsUser(mBgExecutor,
+        mInjector.getRoleManager().addOnRoleHoldersChangedListenerAsUser(mExecutor,
                 mRoleHolderChangedListener, UserHandle.ALL);
         mInjector.scheduleInitTrackers(mBgHandler, () -> {
             for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
@@ -2896,7 +2898,7 @@
         for (int i = 0; i < numPhones; i++) {
             final PhoneCarrierPrivilegesCallback callback = new PhoneCarrierPrivilegesCallback(i);
             callbacks.add(callback);
-            telephonyManager.registerCarrierPrivilegesCallback(i, mBgExecutor, callback);
+            telephonyManager.registerCarrierPrivilegesCallback(i, mExecutor, callback);
         }
         mCarrierPrivilegesCallbacks = callbacks;
     }
@@ -3288,6 +3290,10 @@
             return System.currentTimeMillis();
         }
 
+        Handler getDefaultHandler() {
+            return mAppRestrictionController.mActivityManagerService.mHandler;
+        }
+
         boolean isTest() {
             return false;
         }
diff --git a/services/core/java/com/android/server/am/BaseAppStateTracker.java b/services/core/java/com/android/server/am/BaseAppStateTracker.java
index 8d60910..5179d58 100644
--- a/services/core/java/com/android/server/am/BaseAppStateTracker.java
+++ b/services/core/java/com/android/server/am/BaseAppStateTracker.java
@@ -75,11 +75,11 @@
     static final int STATE_TYPE_INDEX_PERMISSION = 4;
 
     protected final AppRestrictionController mAppRestrictionController;
-    protected final Injector<T> mInjector;
     protected final Context mContext;
     protected final Handler mBgHandler;
     protected final Object mLock;
     protected final ArrayList<StateListener> mStateListeners = new ArrayList<>();
+    final Injector<T> mInjector;
 
     interface StateListener {
         void onStateChange(int uid, String packageName, boolean start, long now, int stateType);
@@ -292,6 +292,7 @@
         RoleManager mRoleManager;
         NotificationManagerInternal mNotificationManagerInternal;
         IAppOpsService mIAppOpsService;
+        Context mContext;
 
         void setPolicy(T policy) {
             mAppStatePolicy = policy;
@@ -316,6 +317,7 @@
                     NotificationManagerInternal.class);
             mIAppOpsService = IAppOpsService.Stub.asInterface(
                     ServiceManager.getService(Context.APP_OPS_SERVICE));
+            mContext = context;
 
             getPolicy().onSystemReady();
         }
@@ -390,5 +392,9 @@
         IAppOpsService getIAppOpsService() {
             return mIAppOpsService;
         }
+
+        int checkPermission(String perm, int pid, int uid) {
+            return mContext.checkPermission(perm, pid, uid);
+        }
     }
 }
diff --git a/services/core/java/com/android/server/am/BroadcastSkipPolicy.java b/services/core/java/com/android/server/am/BroadcastSkipPolicy.java
index b8ef03f..f4a931f 100644
--- a/services/core/java/com/android/server/am/BroadcastSkipPolicy.java
+++ b/services/core/java/com/android/server/am/BroadcastSkipPolicy.java
@@ -289,27 +289,22 @@
 
         if (info.activityInfo.applicationInfo.uid != Process.SYSTEM_UID &&
                 r.requiredPermissions != null && r.requiredPermissions.length > 0) {
-            final AttributionSource attributionSource;
+            final AttributionSource[] attributionSources;
             if (usePermissionManagerForBroadcastDeliveryCheck()) {
-                attributionSource =
-                        new AttributionSource.Builder(info.activityInfo.applicationInfo.uid)
-                                .setPackageName(info.activityInfo.packageName)
-                                .build();
+                attributionSources = createAttributionSourcesForResolveInfo(info);
             } else {
-                attributionSource = null;
+                attributionSources = null;
             }
             for (int i = 0; i < r.requiredPermissions.length; i++) {
                 String requiredPermission = r.requiredPermissions[i];
                 try {
                     if (usePermissionManagerForBroadcastDeliveryCheck()) {
-                        final PermissionManager permissionManager = getPermissionManager();
-                        if (permissionManager != null) {
-                            perm = permissionManager.checkPermissionForDataDelivery(
-                                    requiredPermission, attributionSource, null /* message */);
-                        } else {
-                            // Assume permission denial if PermissionManager is not yet available.
-                            perm = PackageManager.PERMISSION_DENIED;
-                        }
+                        perm = hasPermissionForDataDelivery(
+                                requiredPermission,
+                                "Broadcast delivered to " + info.activityInfo.name,
+                                attributionSources)
+                                        ? PackageManager.PERMISSION_GRANTED
+                                        : PackageManager.PERMISSION_DENIED;
                     } else {
                         perm = AppGlobals.getPackageManager()
                                 .checkPermission(
@@ -457,10 +452,35 @@
 
         // Check that the receiver has the required permission(s) to receive this broadcast.
         if (r.requiredPermissions != null && r.requiredPermissions.length > 0) {
+            final AttributionSource attributionSource;
+            if (usePermissionManagerForBroadcastDeliveryCheck()) {
+                attributionSource =
+                        new AttributionSource.Builder(filter.receiverList.uid)
+                                .setPid(filter.receiverList.pid)
+                                .setPackageName(filter.packageName)
+                                .setAttributionTag(filter.featureId)
+                                .build();
+            } else {
+                attributionSource = null;
+            }
             for (int i = 0; i < r.requiredPermissions.length; i++) {
                 String requiredPermission = r.requiredPermissions[i];
-                int perm = checkComponentPermission(requiredPermission,
-                        filter.receiverList.pid, filter.receiverList.uid, -1, true);
+                final int perm;
+                if (usePermissionManagerForBroadcastDeliveryCheck()) {
+                    perm = hasPermissionForDataDelivery(
+                            requiredPermission,
+                            "Broadcast delivered to registered receiver " + filter.receiverId,
+                            attributionSource)
+                                    ? PackageManager.PERMISSION_GRANTED
+                                    : PackageManager.PERMISSION_DENIED;
+                } else {
+                    perm = checkComponentPermission(
+                            requiredPermission,
+                            filter.receiverList.pid,
+                            filter.receiverList.uid,
+                            -1 /* owningUid */,
+                            true /* exported */);
+                }
                 if (perm != PackageManager.PERMISSION_GRANTED) {
                     return "Permission Denial: receiving "
                             + r.intent.toString()
@@ -471,21 +491,23 @@
                             + " due to sender " + r.callerPackage
                             + " (uid " + r.callingUid + ")";
                 }
-                int appOp = AppOpsManager.permissionToOpCode(requiredPermission);
-                if (appOp != AppOpsManager.OP_NONE && appOp != r.appOp
-                        && mService.getAppOpsManager().noteOpNoThrow(appOp,
-                        filter.receiverList.uid, filter.packageName, filter.featureId,
-                        "Broadcast delivered to registered receiver " + filter.receiverId)
-                        != AppOpsManager.MODE_ALLOWED) {
-                    return "Appop Denial: receiving "
-                            + r.intent.toString()
-                            + " to " + filter.receiverList.app
-                            + " (pid=" + filter.receiverList.pid
-                            + ", uid=" + filter.receiverList.uid + ")"
-                            + " requires appop " + AppOpsManager.permissionToOp(
-                            requiredPermission)
-                            + " due to sender " + r.callerPackage
-                            + " (uid " + r.callingUid + ")";
+                if (!usePermissionManagerForBroadcastDeliveryCheck()) {
+                    int appOp = AppOpsManager.permissionToOpCode(requiredPermission);
+                    if (appOp != AppOpsManager.OP_NONE && appOp != r.appOp
+                            && mService.getAppOpsManager().noteOpNoThrow(appOp,
+                            filter.receiverList.uid, filter.packageName, filter.featureId,
+                            "Broadcast delivered to registered receiver " + filter.receiverId)
+                            != AppOpsManager.MODE_ALLOWED) {
+                        return "Appop Denial: receiving "
+                                + r.intent.toString()
+                                + " to " + filter.receiverList.app
+                                + " (pid=" + filter.receiverList.pid
+                                + ", uid=" + filter.receiverList.uid + ")"
+                                + " requires appop " + AppOpsManager.permissionToOp(
+                                requiredPermission)
+                                + " due to sender " + r.callerPackage
+                                + " (uid " + r.callingUid + ")";
+                    }
                 }
             }
         }
@@ -724,10 +746,54 @@
         return false;
     }
 
+    @Nullable
     private PermissionManager getPermissionManager() {
         if (mPermissionManager == null) {
             mPermissionManager = mService.mContext.getSystemService(PermissionManager.class);
         }
         return mPermissionManager;
     }
+
+    private boolean hasPermissionForDataDelivery(
+            @NonNull String permission,
+            @NonNull String message,
+            @NonNull AttributionSource... attributionSources) {
+        final PermissionManager permissionManager = getPermissionManager();
+        if (permissionManager == null) {
+            return false;
+        }
+
+        for (AttributionSource attributionSource : attributionSources) {
+            final int permissionCheckResult =
+                    permissionManager.checkPermissionForDataDelivery(
+                            permission, attributionSource, message);
+            if (permissionCheckResult != PackageManager.PERMISSION_GRANTED) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private AttributionSource[] createAttributionSourcesForResolveInfo(ResolveInfo info) {
+        final String[] attributionTags = info.activityInfo.attributionTags;
+        if (ArrayUtils.isEmpty(attributionTags)) {
+            return new AttributionSource[] {
+                    new AttributionSource.Builder(info.activityInfo.applicationInfo.uid)
+                            .setPackageName(info.activityInfo.packageName)
+                            .build()
+            };
+        }
+
+        final AttributionSource[] attributionSources =
+                new AttributionSource[attributionTags.length];
+        for (int i = 0; i < attributionTags.length; i++) {
+            attributionSources[i] =
+                    new AttributionSource.Builder(info.activityInfo.applicationInfo.uid)
+                            .setPackageName(info.activityInfo.packageName)
+                            .setAttributionTag(attributionTags[i])
+                            .build();
+        }
+        return attributionSources;
+    }
 }
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index 6e20f6c..fa6b54b 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -98,6 +98,8 @@
 import java.util.Random;
 import java.util.Set;
 
+import dalvik.annotation.optimization.NeverCompile;
+
 public final class CachedAppOptimizer {
 
     // Flags stored in the DeviceConfig API.
@@ -582,6 +584,7 @@
             mTotalCpuTimeMillis += totalCpuTimeMillis;
         }
 
+        @NeverCompile
         public void dump(PrintWriter pw) {
             long totalCompactRequested = mSomeCompactRequested + mFullCompactRequested;
             long totalCompactPerformed = mSomeCompactPerformed + mFullCompactPerformed;
@@ -735,6 +738,7 @@
     }
 
     @GuardedBy("mProcLock")
+    @NeverCompile
     void dump(PrintWriter pw) {
         pw.println("CachedAppOptimizer settings");
         synchronized (mPhenotypeFlagLock) {
@@ -1461,8 +1465,7 @@
             return;
         }
 
-        if (mAm.mConstants.USE_MODERN_TRIM
-                && app.mState.getSetAdj() >= ProcessList.CACHED_APP_MIN_ADJ) {
+        if (app.mState.getSetAdj() >= ProcessList.CACHED_APP_MIN_ADJ) {
             final IApplicationThread thread = app.getThread();
             if (thread != null) {
                 try {
@@ -1836,6 +1839,7 @@
             return mRssAfterCompaction;
         }
 
+        @NeverCompile
         void dump(PrintWriter pw) {
             pw.println("    (" + mProcessName + "," + mSourceType.name() + "," + mDeltaAnonRssKBs
                     + "," + mZramConsumedKBs + "," + mAnonMemFreedKBs + "," + getCompactEfficiency()
diff --git a/services/core/java/com/android/server/am/LmkdStatsReporter.java b/services/core/java/com/android/server/am/LmkdStatsReporter.java
index 595d16d..b55f35d 100644
--- a/services/core/java/com/android/server/am/LmkdStatsReporter.java
+++ b/services/core/java/com/android/server/am/LmkdStatsReporter.java
@@ -44,6 +44,7 @@
     private static final int LOW_MEM_AND_SWAP_UTIL = 6;
     private static final int LOW_FILECACHE_AFTER_THRASHING = 7;
     private static final int LOW_MEM = 8;
+    private static final int DIRECT_RECL_STUCK = 9;
 
     /**
      * Processes the LMK_KILL_OCCURRED packet data
@@ -98,6 +99,8 @@
                 return FrameworkStatsLog.LMK_KILL_OCCURRED__REASON__LOW_FILECACHE_AFTER_THRASHING;
             case LOW_MEM:
                 return FrameworkStatsLog.LMK_KILL_OCCURRED__REASON__LOW_MEM;
+            case DIRECT_RECL_STUCK:
+                return FrameworkStatsLog.LMK_KILL_OCCURRED__REASON__DIRECT_RECL_STUCK;
             default:
                 return FrameworkStatsLog.LMK_KILL_OCCURRED__REASON__UNKNOWN;
         }
diff --git a/services/core/java/com/android/server/am/OWNERS b/services/core/java/com/android/server/am/OWNERS
index bf7cc10..b517631 100644
--- a/services/core/java/com/android/server/am/OWNERS
+++ b/services/core/java/com/android/server/am/OWNERS
@@ -9,7 +9,6 @@
 [email protected]
 [email protected]
 [email protected]
[email protected]
 [email protected]
 [email protected]
 
@@ -18,6 +17,7 @@
 
 # Permissions & Packages
 [email protected]
+per-file AccessCheckDelegateHelper.java = file:/core/java/android/permission/OWNERS
 
 # Battery Stats
 [email protected]
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 1a7629f..ea7a21d 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -71,8 +71,7 @@
 import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK;
 import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE;
 import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_PHONE_CALL;
-import static android.media.audio.Flags.foregroundAudioControl;
-import static android.os.Process.SCHED_OTHER;
+import static android.media.audio.Flags.roForegroundAudioControl;
 import static android.os.Process.THREAD_GROUP_BACKGROUND;
 import static android.os.Process.THREAD_GROUP_DEFAULT;
 import static android.os.Process.THREAD_GROUP_RESTRICTED;
@@ -81,7 +80,6 @@
 import static android.os.Process.THREAD_PRIORITY_TOP_APP_BOOST;
 import static android.os.Process.setProcessGroup;
 import static android.os.Process.setThreadPriority;
-import static android.os.Process.setThreadScheduler;
 
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL;
 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKUP;
@@ -409,6 +407,12 @@
 
     private final OomAdjusterDebugLogger mLogger;
 
+    /**
+     * The process state of the current TOP app.
+     */
+    @GuardedBy("mService")
+    protected int mProcessStateCurTop = PROCESS_STATE_TOP;
+
     /** Overrideable by a test */
     @VisibleForTesting
     protected boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId,
@@ -518,59 +522,6 @@
     }
 
     /**
-     * Perform oom adj update on the given process. It does NOT do the re-computation
-     * if there is a cycle, caller should check {@link #mProcessesInCycle} and do it on its own.
-     */
-    @GuardedBy({"mService", "mProcLock"})
-    private boolean performUpdateOomAdjLSP(ProcessRecord app, int cachedAdj,
-            ProcessRecord topApp, long now, @OomAdjReason int oomAdjReason) {
-        if (app.getThread() == null) {
-            return false;
-        }
-
-        app.mState.resetCachedInfo();
-        app.mState.setCurBoundByNonBgRestrictedApp(false);
-        UidRecord uidRec = app.getUidRecord();
-        if (uidRec != null) {
-            if (DEBUG_UID_OBSERVERS) {
-                Slog.i(TAG_UID_OBSERVERS, "Starting update of " + uidRec);
-            }
-            uidRec.reset();
-        }
-
-        // Check if this process is in the pending list too, remove from pending list if so.
-        mPendingProcessSet.remove(app);
-
-        mProcessesInCycle.clear();
-        computeOomAdjLSP(app, cachedAdj, topApp, false, now, false, true, oomAdjReason, true);
-        if (!mProcessesInCycle.isEmpty()) {
-            // We can't use the score here if there is a cycle, abort.
-            for (int i = mProcessesInCycle.size() - 1; i >= 0; i--) {
-                // Reset the adj seq
-                mProcessesInCycle.valueAt(i).mState.setCompletedAdjSeq(mAdjSeq - 1);
-            }
-            return true;
-        }
-
-        if (uidRec != null) {
-            // After uidRec.reset() above, for UidRecord with multiple processes (ProcessRecord),
-            // we need to apply all ProcessRecord into UidRecord.
-            uidRec.forEachProcess(this::updateAppUidRecIfNecessaryLSP);
-            if (uidRec.getCurProcState() != PROCESS_STATE_NONEXISTENT
-                    && (uidRec.getSetProcState() != uidRec.getCurProcState()
-                    || uidRec.getSetCapability() != uidRec.getCurCapability()
-                    || uidRec.isSetAllowListed() != uidRec.isCurAllowListed())) {
-                final ActiveUids uids = mTmpUidRecords;
-                uids.clear();
-                uids.put(uidRec.getUid(), uidRec);
-                updateUidsLSP(uids, SystemClock.elapsedRealtime());
-            }
-        }
-
-        return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime(), oomAdjReason);
-    }
-
-    /**
      * Update OomAdj for all processes in LRU list
      */
     @GuardedBy("mService")
@@ -599,6 +550,7 @@
     @GuardedBy({"mService", "mProcLock"})
     protected void performUpdateOomAdjLSP(@OomAdjReason int oomAdjReason) {
         final ProcessRecord topApp = mService.getTopApp();
+        mProcessStateCurTop = mService.mAtmInternal.getTopProcessState();
         // Clear any pending ones because we are doing a full update now.
         mPendingProcessSet.clear();
         mService.mAppProfiler.mHasPreviousProcess = mService.mAppProfiler.mHasHomeProcess = false;
@@ -649,54 +601,14 @@
         mLastReason = oomAdjReason;
         Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason));
         mService.mOomAdjProfiler.oomAdjStarted();
-        mAdjSeq++;
 
         final ProcessStateRecord state = app.mState;
-        final boolean wasCached = state.isCached();
-        final int oldAdj = state.getCurRawAdj();
-        final int cachedAdj = oldAdj >= CACHED_APP_MIN_ADJ
-                ? oldAdj : UNKNOWN_ADJ;
-
-        // Firstly, try to see if the importance of itself gets changed
-        final boolean wasBackground = ActivityManager.isProcStateBackground(
-                state.getSetProcState());
-        final int oldCap = state.getSetCapability();
-        state.setContainsCycle(false);
-        state.setProcStateChanged(false);
-        state.resetCachedInfo();
-        state.setCurBoundByNonBgRestrictedApp(false);
-        // Check if this process is in the pending list too, remove from pending list if so.
-        mPendingProcessSet.remove(app);
-        app.mOptRecord.setLastOomAdjChangeReason(oomAdjReason);
-        boolean success = performUpdateOomAdjLSP(app, cachedAdj, topApp,
-                SystemClock.uptimeMillis(), oomAdjReason);
-        // The 'app' here itself might or might not be in the cycle, for example,
-        // the case A <=> B vs. A -> B <=> C; anyway, if we spot a cycle here, re-compute them.
-        if (!success || (wasCached == state.isCached() && oldAdj != INVALID_ADJ
-                && mProcessesInCycle.isEmpty() /* Force re-compute if there is a cycle */
-                && oldCap == state.getCurCapability()
-                && wasBackground == ActivityManager.isProcStateBackground(
-                        state.getSetProcState()))) {
-            mProcessesInCycle.clear();
-            // Okay, it's unchanged, it won't impact any service it binds to, we're done here.
-            if (DEBUG_OOM_ADJ) {
-                Slog.i(TAG_OOM_ADJ, "No oomadj changes for " + app);
-            }
-            mService.mOomAdjProfiler.oomAdjEnded();
-            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
-            return success;
-        }
 
         // Next to find out all its reachable processes
         ArrayList<ProcessRecord> processes = mTmpProcessList;
         ActiveUids uids = mTmpUidRecords;
         mPendingProcessSet.add(app);
-
-        // Add all processes with cycles into the list to scan
-        for (int i = mProcessesInCycle.size() - 1; i >= 0; i--) {
-            mPendingProcessSet.add(mProcessesInCycle.valueAt(i));
-        }
-        mProcessesInCycle.clear();
+        mProcessStateCurTop = enqueuePendingTopAppIfNecessaryLSP();
 
         boolean containsCycle = collectReachableProcessesLocked(mPendingProcessSet,
                 processes, uids);
@@ -704,14 +616,8 @@
         // Clear the pending set as they should've been included in 'processes'.
         mPendingProcessSet.clear();
 
-        if (!containsCycle) {
-            // Remove this app from the return list because we've done the computation on it.
-            processes.remove(app);
-        }
-
         int size = processes.size();
         if (size > 0) {
-            mAdjSeq--;
             // Update these reachable processes
             updateOomAdjInnerLSP(oomAdjReason, topApp, processes, uids, containsCycle, false);
         } else if (state.getCurRawAdj() == UNKNOWN_ADJ) {
@@ -723,11 +629,25 @@
                     SystemClock.elapsedRealtime(), oomAdjReason);
         }
         mTmpProcessList.clear();
+        mService.clearPendingTopAppLocked();
         mService.mOomAdjProfiler.oomAdjEnded();
         Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
         return true;
     }
 
+    @GuardedBy({"mService", "mProcLock"})
+    protected int enqueuePendingTopAppIfNecessaryLSP() {
+        final int prevTopProcessState = mService.mAtmInternal.getTopProcessState();
+        mService.enqueuePendingTopAppIfNecessaryLocked();
+        final int topProcessState = mService.mAtmInternal.getTopProcessState();
+        if (prevTopProcessState != topProcessState) {
+            // Unlikely but possible: WM just updated the top process state, it may have
+            // enqueued the new top app to the pending top UID list. Enqueue that one here too.
+            mService.enqueuePendingTopAppIfNecessaryLocked();
+        }
+        return topProcessState;
+    }
+
     /**
      * Collect the reachable processes from the given {@code apps}, the result will be
      * returned in the given {@code processes}, which will include the processes from
@@ -930,6 +850,7 @@
         mLastReason = oomAdjReason;
         Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason));
         mService.mOomAdjProfiler.oomAdjStarted();
+        mProcessStateCurTop = enqueuePendingTopAppIfNecessaryLSP();
 
         final ArrayList<ProcessRecord> processes = mTmpProcessList;
         final ActiveUids uids = mTmpUidRecords;
@@ -939,6 +860,7 @@
             updateOomAdjInnerLSP(oomAdjReason, topApp, processes, uids, true, false);
         }
         processes.clear();
+        mService.clearPendingTopAppLocked();
 
         mService.mOomAdjProfiler.oomAdjEnded();
         Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
@@ -1090,7 +1012,7 @@
         mNumNonCachedProcs = 0;
         mNumCachedHiddenProcs = 0;
 
-        final boolean allChanged = updateAndTrimProcessLSP(now, nowElapsed, oldTime, activeUids,
+        updateAndTrimProcessLSP(now, nowElapsed, oldTime, activeUids,
                 oomAdjReason, doingAll);
         mNumServiceProcs = mNewNumServiceProcs;
 
@@ -1100,11 +1022,6 @@
             mService.mAtmInternal.scheduleDestroyAllActivities("always-finish");
         }
 
-        if (allChanged) {
-            mService.mAppProfiler.requestPssAllProcsLPr(now, false,
-                    mService.mProcessStats.isMemFactorLowered());
-        }
-
         updateUidsLSP(activeUids, nowElapsed);
 
         synchronized (mService.mProcessStats.mLock) {
@@ -1300,7 +1217,7 @@
     }
 
     @GuardedBy({"mService", "mProcLock"})
-    private boolean updateAndTrimProcessLSP(final long now, final long nowElapsed,
+    private void updateAndTrimProcessLSP(final long now, final long nowElapsed,
             final long oldTime, final ActiveUids activeUids, @OomAdjReason int oomAdjReason,
             boolean doingAll) {
         ArrayList<ProcessRecord> lruList = mProcessList.getLruProcessesLOSP();
@@ -1342,6 +1259,7 @@
                     // Avoid trimming processes that are still initializing. If they aren't
                     // hosting any components yet because they may be unfairly killed.
                     // We however apply the oom scores set at #setAttachingProcessStatesLSP.
+                    updateAppUidRecLSP(app);
                     continue;
                 }
 
@@ -1450,7 +1368,7 @@
 
         mLastFreeSwapPercent = freeSwapPercent;
 
-        return mService.mAppProfiler.updateLowMemStateLSP(numCached, numEmpty, numTrimming, now);
+        mService.mAppProfiler.updateLowMemStateLSP(numCached, numEmpty, numTrimming, now);
     }
 
     @GuardedBy({"mService", "mProcLock"})
@@ -1887,7 +1805,7 @@
 
         state.setSystemNoUi(false);
 
-        final int PROCESS_STATE_CUR_TOP = mService.mAtmInternal.getTopProcessState();
+        final int PROCESS_STATE_CUR_TOP = mProcessStateCurTop;
 
         // Determine the importance of the process, starting with most
         // important to least, and assign an appropriate OOM adjustment.
@@ -2292,7 +2210,7 @@
                             (fgsType & FOREGROUND_SERVICE_TYPE_LOCATION)
                                     != 0 ? PROCESS_CAPABILITY_FOREGROUND_LOCATION : 0;
 
-                    if (foregroundAudioControl()) { // flag check
+                    if (roForegroundAudioControl()) { // flag check
                         final int fgsAudioType = FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
                                 | FOREGROUND_SERVICE_TYPE_CAMERA
                                 | FOREGROUND_SERVICE_TYPE_MICROPHONE
@@ -3291,13 +3209,15 @@
                     // If the partial values are no better, skip until the next
                     // attempt
                     if (client.getCurRawProcState() >= procState
-                            && client.getCurRawAdj() >= adj) {
+                            && client.getCurRawAdj() >= adj
+                            && (client.getCurCapability() & app.mState.getCurCapability())
+                            == client.getCurCapability()) {
                         return true;
                     }
                     // Else use the client's partial procstate and adj to adjust the
                     // effect of the binding
                 } else {
-                    return true;
+                    return false;
                 }
             }
         }
@@ -3393,22 +3313,10 @@
                         // do nothing if we already switched to RT
                         if (oldSchedGroup != SCHED_GROUP_TOP_APP) {
                             app.getWindowProcessController().onTopProcChanged();
-                            if (mService.mUseFifoUiScheduling) {
+                            if (app.useFifoUiScheduling()) {
                                 // Switch UI pipeline for app to SCHED_FIFO
                                 state.setSavedPriority(Process.getThreadPriority(app.getPid()));
-                                mService.scheduleAsFifoPriority(app.getPid(), true);
-                                if (renderThreadTid != 0) {
-                                    mService.scheduleAsFifoPriority(renderThreadTid,
-                                            /* suppressLogs */true);
-                                    if (DEBUG_OOM_ADJ) {
-                                        Slog.d("UI_FIFO", "Set RenderThread (TID " +
-                                                renderThreadTid + ") to FIFO");
-                                    }
-                                } else {
-                                    if (DEBUG_OOM_ADJ) {
-                                        Slog.d("UI_FIFO", "Not setting RenderThread TID");
-                                    }
-                                }
+                                ActivityManagerService.setFifoPriority(app, true /* enable */);
                             } else {
                                 // Boost priority for top app UI and render threads
                                 setThreadPriority(app.getPid(), THREAD_PRIORITY_TOP_APP_BOOST);
@@ -3425,22 +3333,10 @@
                     } else if (oldSchedGroup == SCHED_GROUP_TOP_APP
                             && curSchedGroup != SCHED_GROUP_TOP_APP) {
                         app.getWindowProcessController().onTopProcChanged();
-                        if (mService.mUseFifoUiScheduling) {
-                            try {
-                                // Reset UI pipeline to SCHED_OTHER
-                                setThreadScheduler(app.getPid(), SCHED_OTHER, 0);
-                                setThreadPriority(app.getPid(), state.getSavedPriority());
-                                if (renderThreadTid != 0) {
-                                    setThreadScheduler(renderThreadTid,
-                                            SCHED_OTHER, 0);
-                                }
-                            } catch (IllegalArgumentException e) {
-                                Slog.w(TAG,
-                                        "Failed to set scheduling policy, thread does not exist:\n"
-                                                + e);
-                            } catch (SecurityException e) {
-                                Slog.w(TAG, "Failed to set scheduling policy, not allowed:\n" + e);
-                            }
+                        if (app.useFifoUiScheduling()) {
+                            // Reset UI pipeline to SCHED_OTHER
+                            ActivityManagerService.setFifoPriority(app, false /* enable */);
+                            setThreadPriority(app.getPid(), state.getSavedPriority());
                         } else {
                             // Reset priority for top app UI and render threads
                             setThreadPriority(app.getPid(), 0);
@@ -3635,7 +3531,7 @@
                 // {@link SCHED_GROUP_TOP_APP}. We don't check render thread because it
                 // is not ready when attaching.
                 app.getWindowProcessController().onTopProcChanged();
-                if (mService.mUseFifoUiScheduling) {
+                if (app.useFifoUiScheduling()) {
                     mService.scheduleAsFifoPriority(app.getPid(), true);
                 } else {
                     setThreadPriority(app.getPid(), THREAD_PRIORITY_TOP_APP_BOOST);
@@ -3759,7 +3655,7 @@
         for (int i = N - 1; i >= 0; i--) {
             final UidRecord uidRec = mActiveUids.valueAt(i);
             final long bgTime = uidRec.getLastBackgroundTime();
-            final long idleTime = uidRec.getLastIdleTime();
+            final long idleTime = uidRec.getLastIdleTimeIfStillIdle();
             if (bgTime > 0 && (!uidRec.isIdle() || idleTime == 0)) {
                 if (bgTime <= maxBgTime) {
                     EventLogTags.writeAmUidIdle(uidRec.getUid());
diff --git a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
index 5feac1f..00e1482 100644
--- a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
+++ b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java
@@ -737,6 +737,7 @@
     @Override
     protected void performUpdateOomAdjLSP(@OomAdjReason int oomAdjReason) {
         final ProcessRecord topApp = mService.getTopApp();
+        mProcessStateCurTop = mService.mAtmInternal.getTopProcessState();
         // Clear any pending ones because we are doing a full update now.
         mPendingProcessSet.clear();
         mService.mAppProfiler.mHasPreviousProcess = mService.mAppProfiler.mHasHomeProcess = false;
@@ -763,6 +764,7 @@
     @Override
     protected void performUpdateOomAdjPendingTargetsLocked(@OomAdjReason int oomAdjReason) {
         mLastReason = oomAdjReason;
+        mProcessStateCurTop = enqueuePendingTopAppIfNecessaryLSP();
         Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason));
         mService.mOomAdjProfiler.oomAdjStarted();
 
diff --git a/services/core/java/com/android/server/am/PendingStartActivityUids.java b/services/core/java/com/android/server/am/PendingStartActivityUids.java
index da09317..e912d07 100644
--- a/services/core/java/com/android/server/am/PendingStartActivityUids.java
+++ b/services/core/java/com/android/server/am/PendingStartActivityUids.java
@@ -87,4 +87,22 @@
     synchronized boolean isPendingTopUid(int uid) {
         return mPendingUids.get(uid) != null;
     }
+
+    // Must called with AMS locked.
+    synchronized void enqueuePendingTopAppIfNecessaryLocked(ActivityManagerService ams) {
+        for (int i = 0, size = mPendingUids.size(); i < size; i++) {
+            final Pair<Integer, Long> p = mPendingUids.valueAt(i);
+            final ProcessRecord app;
+            synchronized (ams.mPidsSelfLocked) {
+                app = ams.mPidsSelfLocked.get(p.first);
+            }
+            if (app != null) {
+                ams.enqueueOomAdjTargetLocked(app);
+            }
+        }
+    }
+
+    synchronized void clear() {
+        mPendingUids.clear();
+    }
 }
diff --git a/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java b/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
index a8fe734..ea92571 100644
--- a/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
+++ b/services/core/java/com/android/server/am/ProcessCachedOptimizerRecord.java
@@ -25,6 +25,8 @@
 
 import java.io.PrintWriter;
 
+import dalvik.annotation.optimization.NeverCompile;
+
 /**
  * The state info of app when it's cached, used by the optimizer.
  */
@@ -340,6 +342,7 @@
     }
 
     @GuardedBy("mProcLock")
+    @NeverCompile
     void dump(PrintWriter pw, String prefix, long nowUptime) {
         pw.print(prefix); pw.print("lastCompactTime="); pw.print(mLastCompactTime);
         pw.print(" lastCompactProfile=");
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 48a9d6a..6779f7a 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -351,6 +351,7 @@
     // LMK_UPDATE_PROPS
     // LMK_KILL_OCCURRED
     // LMK_START_MONITORING
+    // LMK_BOOT_COMPLETED
     static final byte LMK_TARGET = 0;
     static final byte LMK_PROCPRIO = 1;
     static final byte LMK_PROCREMOVE = 2;
@@ -361,6 +362,7 @@
     static final byte LMK_UPDATE_PROPS = 7;
     static final byte LMK_KILL_OCCURRED = 8; // Msg to subscribed clients on kill occurred event
     static final byte LMK_START_MONITORING = 9; // Start monitoring if delayed earlier
+    static final byte LMK_BOOT_COMPLETED = 10;
 
     // Low Memory Killer Daemon command codes.
     // These must be kept in sync with async_event_type definitions in lmkd.h
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index b939089..0816527 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -745,6 +745,9 @@
             mOnewayThread = thread;
         }
         mWindowProcessController.setThread(thread);
+        if (mWindowProcessController.useFifoUiScheduling()) {
+            mService.mSpecifiedFifoProcesses.add(this);
+        }
     }
 
     @GuardedBy({"mService", "mProcLock"})
@@ -752,9 +755,19 @@
         mThread = null;
         mOnewayThread = null;
         mWindowProcessController.setThread(null);
+        if (mWindowProcessController.useFifoUiScheduling()) {
+            mService.mSpecifiedFifoProcesses.remove(this);
+        }
         mProfile.onProcessInactive(tracker);
     }
 
+    @GuardedBy(anyOf = {"mService", "mProcLock"})
+    boolean useFifoUiScheduling() {
+        return mService.mUseFifoUiScheduling
+                || (mService.mAllowSpecifiedFifoScheduling
+                        && mWindowProcessController.useFifoUiScheduling());
+    }
+
     @GuardedBy("mService")
     int getDyingPid() {
         return mDyingPid;
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index e3aac02..5834dcd 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -267,9 +267,13 @@
     int mAllowStart_byBindings = REASON_DENIED;
 
     /**
-     * Whether or not we've bumped its oom adj scores during its execution.
+     * The oom adj seq number snapshot of the host process. We're taking a snapshot
+     * before executing the service. Since we may or may not bump the host process's
+     * proc state / oom adj value before that, at the end of the execution, we could
+     * compare this seq against the current seq of the host process to see if we could
+     * skip the oom adj update from there too.
      */
-    boolean mOomAdjBumpedInExec;
+    int mAdjSeq;
 
     /**
      * Whether to use the new "while-in-use permission" logic for FGS start
@@ -1884,4 +1888,17 @@
         }
         return true;
     }
+
+    /**
+     * @return {@code true} if the host process has updated its oom adj scores.
+     */
+    boolean wasOomAdjUpdated() {
+        return app != null && app.mState.getAdjSeq() > mAdjSeq;
+    }
+
+    void updateOomAdjSeq() {
+        if (app != null) {
+            mAdjSeq = app.mState.getAdjSeq();
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index 48d3c09..390dca3 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -125,13 +125,13 @@
         "app_widgets",
         "arc_next",
         "avic",
+        "biometrics",
+        "biometrics_framework",
+        "biometrics_integration",
         "bluetooth",
         "brownout_mitigation_audio",
         "brownout_mitigation_modem",
         "build",
-        "biometrics",
-        "biometrics_framework",
-        "biometrics_integration",
         "camera_hal",
         "camera_platform",
         "car_framework",
@@ -160,8 +160,8 @@
         "media_audio",
         "media_drm",
         "media_reliability",
-        "media_tv",
         "media_solutions",
+        "media_tv",
         "nfc",
         "pdf_viewer",
         "perfetto",
@@ -183,18 +183,20 @@
         "rust",
         "safety_center",
         "sensors",
+        "spoon",
+        "statsd",
         "system_performance",
         "system_sw_touch",
         "system_sw_usb",
-        "statsd",
         "test_suites",
         "text",
         "threadnetwork",
+        "treble",
         "tv_system_ui",
         "usb",
         "vibrator",
-        "virtualization",
         "virtual_devices",
+        "virtualization",
         "wallet_integration",
         "wear_calling_messaging",
         "wear_connectivity",
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index 45fd470..86fa0fc 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -17,6 +17,7 @@
 package com.android.server.am;
 
 import android.Manifest;
+import android.annotation.ElapsedRealtimeLong;
 import android.app.ActivityManager;
 import android.content.pm.PackageManager;
 import android.os.SystemClock;
@@ -65,8 +66,19 @@
     @CompositeRWLock({"mService", "mProcLock"})
     private long mLastBackgroundTime;
 
+    /**
+     * Last time the UID became idle. This is set to 0, once the UID becomes active.
+     */
+    @ElapsedRealtimeLong
     @CompositeRWLock({"mService", "mProcLock"})
-    private long mLastIdleTime;
+    private long mLastIdleTimeIfStillIdle;
+
+    /**
+     * Last time the UID became idle. Unlike {@link #mLastIdleTimeIfStillIdle}, we never clear it.
+     */
+    @ElapsedRealtimeLong
+    @CompositeRWLock({"mService", "mProcLock"})
+    private long mRealLastIdleTime;
 
     @CompositeRWLock({"mService", "mProcLock"})
     private boolean mEphemeral;
@@ -257,14 +269,28 @@
         mLastBackgroundTime = lastBackgroundTime;
     }
 
+    /**
+     * Last time the UID became idle. This is set to 0, once the UID becomes active.
+     */
     @GuardedBy(anyOf = {"mService", "mProcLock"})
-    long getLastIdleTime() {
-        return mLastIdleTime;
+    long getLastIdleTimeIfStillIdle() {
+        return mLastIdleTimeIfStillIdle;
+    }
+
+    /**
+     * Last time the UID became idle. Unlike {@link #getLastIdleTimeIfStillIdle}, we never clear it.
+     */
+    @GuardedBy(anyOf = {"mService", "mProcLock"})
+    long getRealLastIdleTime() {
+        return mRealLastIdleTime;
     }
 
     @GuardedBy({"mService", "mProcLock"})
-    void setLastIdleTime(long lastActiveTime) {
-        mLastIdleTime = lastActiveTime;
+    void setLastIdleTime(@ElapsedRealtimeLong long lastIdleTime) {
+        mLastIdleTimeIfStillIdle = lastIdleTime;
+        if (lastIdleTime > 0) {
+            mRealLastIdleTime = lastIdleTime;
+        }
     }
 
     @GuardedBy(anyOf = {"mService", "mProcLock"})
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index a917909..dd4cee4 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -246,6 +246,7 @@
      *
      * <p>Note: Current and system user (and their related profiles) are never stopped when
      * switching users. Due to that, the actual number of running users can exceed mMaxRunningUsers
+     // TODO(b/310249114): Strongly consider *not* exempting the SYSTEM user's profile.
      */
     @GuardedBy("mLock")
     private int mMaxRunningUsers;
@@ -576,7 +577,10 @@
             }
             // allowDelayedLocking set here as stopping user is done without any explicit request
             // from outside.
-            if (stopUsersLU(userId, /* force= */ false, /* allowDelayedLocking= */ true,
+            Slogf.i(TAG, "Too many running users (%d). Attempting to stop user %d",
+                    currentlyRunningLru.size(), userId);
+            if (stopUsersLU(userId,
+                    /* stopProfileRegardlessOfParent= */ false, /* allowDelayedLocking= */ true,
                     /* stopUserCallback= */ null, /* keyEvictedCallback= */ null)
                     == USER_OP_SUCCESS) {
                 // Technically, stopUsersLU can remove more than one user when stopping a parent.
@@ -669,6 +673,14 @@
     }
 
     private void sendLockedBootCompletedBroadcast(IIntentReceiver receiver, @UserIdInt int userId) {
+        if (android.os.Flags.allowPrivateProfile()
+                && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
+            final UserInfo userInfo = getUserInfo(userId);
+            if (userInfo != null && userInfo.isPrivateProfile()) {
+                Slogf.i(TAG, "Skipping LOCKED_BOOT_COMPLETED for private profile user #" + userId);
+                return;
+            }
+        }
         final Intent intent = new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED, null);
         intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
         intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
@@ -865,7 +877,7 @@
             Slogf.i(TAG, "Stopping pre-created user " + userInfo.toFullString());
             // Pre-created user was started right after creation so services could properly
             // intialize it; it should be stopped right away as it's not really a "real" user.
-            stopUser(userInfo.id, /* force= */ true, /* allowDelayedLocking= */ false,
+            stopUser(userInfo.id, /* allowDelayedLocking= */ false,
                     /* stopUserCallback= */ null, /* keyEvictedCallback= */ null);
             return;
         }
@@ -875,6 +887,13 @@
 
         mHandler.obtainMessage(USER_UNLOCKED_MSG, userId, 0).sendToTarget();
 
+        if (android.os.Flags.allowPrivateProfile()
+                && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
+            if (userInfo.isPrivateProfile()) {
+                Slogf.i(TAG, "Skipping BOOT_COMPLETED for private profile user #" + userId);
+                return;
+            }
+        }
         Slogf.i(TAG, "Posting BOOT_COMPLETED user #" + userId);
         // Do not report secondary users, runtime restarts or first boot/upgrade
         if (userId == UserHandle.USER_SYSTEM
@@ -913,7 +932,7 @@
     }
 
     int restartUser(final int userId, @UserStartMode int userStartMode) {
-        return stopUser(userId, /* force= */ true, /* allowDelayedLocking= */ false,
+        return stopUser(userId, /* allowDelayedLocking= */ false,
                 /* stopUserCallback= */ null, new KeyEvictedCallback() {
                     @Override
                     public void keyEvicted(@UserIdInt int userId) {
@@ -949,18 +968,24 @@
 
         enforceShellRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, userId);
         synchronized (mLock) {
-            return stopUsersLU(userId, /* force= */ true, /* allowDelayedLocking= */
-                    false, /* stopUserCallback= */ null, /* keyEvictedCallback= */ null)
+            return stopUsersLU(userId, /* allowDelayedLocking= */ false,
+                    /* stopUserCallback= */ null, /* keyEvictedCallback= */ null)
                     == ActivityManager.USER_OP_SUCCESS;
         }
     }
 
-    int stopUser(final int userId, final boolean force, boolean allowDelayedLocking,
+    int stopUser(final int userId, boolean allowDelayedLocking,
+            final IStopUserCallback stopUserCallback, KeyEvictedCallback keyEvictedCallback) {
+        return stopUser(userId, true, allowDelayedLocking, stopUserCallback, keyEvictedCallback);
+    }
+
+    int stopUser(final int userId,
+            final boolean stopProfileRegardlessOfParent, final boolean allowDelayedLocking,
             final IStopUserCallback stopUserCallback, KeyEvictedCallback keyEvictedCallback) {
         TimingsTraceAndSlog t = new TimingsTraceAndSlog();
 
         t.traceBegin("UserController"
-                + (force ? "-force" : "")
+                + (stopProfileRegardlessOfParent ? "-stopProfileRegardlessOfParent" : "")
                 + (allowDelayedLocking ? "-allowDelayedLocking" : "")
                 + (stopUserCallback != null ? "-withStopUserCallback" : "")
                 + "-" + userId + "-[stopUser]");
@@ -970,20 +995,32 @@
 
             enforceShellRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, userId);
             synchronized (mLock) {
-                return stopUsersLU(userId, force, allowDelayedLocking, stopUserCallback,
-                        keyEvictedCallback);
+                return stopUsersLU(userId, stopProfileRegardlessOfParent, allowDelayedLocking,
+                        stopUserCallback, keyEvictedCallback);
             }
         } finally {
             t.traceEnd();
         }
     }
 
+    /** Stops the user along with its profiles. */
+    @GuardedBy("mLock")
+    private int stopUsersLU(final int userId, boolean allowDelayedLocking,
+            final IStopUserCallback stopUserCallback, KeyEvictedCallback keyEvictedCallback) {
+        return stopUsersLU(userId, /* stopProfileRegardlessOfParent= */ true,
+                allowDelayedLocking, stopUserCallback, keyEvictedCallback);
+    }
+
     /**
      * Stops the user along with its profiles. The method calls
      * {@link #getUsersToStopLU(int)} to determine the list of users that should be stopped.
+     *
+     * @param stopProfileRegardlessOfParent whether to stop the profile regardless of who its
+     *                                      parent is, e.g. even if the parent is the current user
      */
     @GuardedBy("mLock")
-    private int stopUsersLU(final int userId, boolean force, boolean allowDelayedLocking,
+    private int stopUsersLU(final int userId,
+            boolean stopProfileRegardlessOfParent, boolean allowDelayedLocking,
             final IStopUserCallback stopUserCallback, KeyEvictedCallback keyEvictedCallback) {
         if (userId == UserHandle.USER_SYSTEM) {
             return USER_OP_ERROR_IS_SYSTEM;
@@ -991,27 +1028,28 @@
         if (isCurrentUserLU(userId)) {
             return USER_OP_IS_CURRENT;
         }
-        TimingsTraceAndSlog t = new TimingsTraceAndSlog();
-        int[] usersToStop = getUsersToStopLU(userId);
-        // If one of related users is system or current, no related users should be stopped
+        if (!stopProfileRegardlessOfParent) {
+            final int parentId = mUserProfileGroupIds.get(userId, UserInfo.NO_PROFILE_GROUP_ID);
+            if (parentId != UserInfo.NO_PROFILE_GROUP_ID && parentId != userId) {
+                // TODO(b/310249114): Strongly consider *not* exempting the SYSTEM user's profile.
+                if ((UserHandle.USER_SYSTEM == parentId || isCurrentUserLU(parentId))) {
+                    return USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
+                }
+            }
+        }
+        final int[] usersToStop = getUsersToStopLU(userId);
+
+        // Final safety check: abort if one of the users we would plan to stop must not be stopped.
+        // This should be impossible in the current code, but just in case.
         for (int relatedUserId : usersToStop) {
             if ((UserHandle.USER_SYSTEM == relatedUserId) || isCurrentUserLU(relatedUserId)) {
-                if (DEBUG_MU) {
-                    Slogf.i(TAG, "stopUsersLocked cannot stop related user " + relatedUserId);
-                }
-                // We still need to stop the requested user if it's a force stop.
-                if (force) {
-                    Slogf.i(TAG,
-                            "Force stop user " + userId + ". Related users will not be stopped");
-                    t.traceBegin("stopSingleUserLU-force-" + userId + "-[stopUser]");
-                    stopSingleUserLU(userId, allowDelayedLocking, stopUserCallback,
-                            keyEvictedCallback);
-                    t.traceEnd();
-                    return USER_OP_SUCCESS;
-                }
+                Slogf.e(TAG, "Cannot stop user %d because it is related to user %d. ",
+                        userId, relatedUserId);
                 return USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
             }
         }
+
+        TimingsTraceAndSlog t = new TimingsTraceAndSlog();
         if (DEBUG_MU) Slogf.i(TAG, "stopUsersLocked usersToStop=" + Arrays.toString(usersToStop));
         for (int userIdToStop : usersToStop) {
             t.traceBegin("stopSingleUserLU-" + userIdToStop + "-[stopUser]");
@@ -1280,8 +1318,8 @@
             mInjector.activityManagerOnUserStopped(userId);
             // Clean up all state and processes associated with the user.
             // Kill all the processes for the user.
-            t.traceBegin("forceStopUser-" + userId + "-[stopUser]");
-            forceStopUser(userId, "finish user");
+            t.traceBegin("stopPackagesOfStoppedUser-" + userId + "-[stopUser]");
+            stopPackagesOfStoppedUser(userId, "finish user");
             t.traceEnd();
         }
 
@@ -1492,8 +1530,8 @@
         return userIds.toArray();
     }
 
-    private void forceStopUser(@UserIdInt int userId, String reason) {
-        if (DEBUG_MU) Slogf.i(TAG, "forceStopUser(%d): %s", userId, reason);
+    private void stopPackagesOfStoppedUser(@UserIdInt int userId, String reason) {
+        if (DEBUG_MU) Slogf.i(TAG, "stopPackagesOfStoppedUser(%d): %s", userId, reason);
         mInjector.activityManagerForceStopPackage(userId, reason);
         if (mInjector.getUserManager().isPreCreated(userId)) {
             // Don't fire intent for precreated.
@@ -1540,9 +1578,9 @@
         }
         if (userInfo.isGuest() || userInfo.isEphemeral()) {
             // This is a user to be stopped.
+            Slogf.i(TAG, "Stopping background guest or ephemeral user " + oldUserId);
             synchronized (mLock) {
-                stopUsersLU(oldUserId, /* force= */ true, /* allowDelayedLocking= */ false,
-                        null, null);
+                stopUsersLU(oldUserId, /* allowDelayedLocking= */ false, null, null);
             }
         }
     }
@@ -2219,6 +2257,10 @@
         mUserSwitchObservers.finishBroadcast();
     }
 
+    /**
+     * Possibly stops the given full user (or its profile) when we switch out of it, if dictated
+     * by policy.
+     */
     private void stopUserOnSwitchIfEnforced(@UserIdInt int oldUserId) {
         // Never stop system user
         if (oldUserId == UserHandle.USER_SYSTEM) {
@@ -2228,20 +2270,27 @@
                 hasUserRestriction(UserManager.DISALLOW_RUN_IN_BACKGROUND, oldUserId);
         synchronized (mLock) {
             // If running in background is disabled or mStopUserOnSwitch mode, stop the user.
-            boolean disallowRunInBg = hasRestriction || shouldStopUserOnSwitch();
-            if (!disallowRunInBg) {
-                if (DEBUG_MU) {
-                    Slogf.i(TAG, "stopUserOnSwitchIfEnforced() NOT stopping %d and related users",
-                            oldUserId);
-                }
+            if (hasRestriction || shouldStopUserOnSwitch()) {
+                Slogf.i(TAG, "Stopping user %d and its profiles on user switch", oldUserId);
+                stopUsersLU(oldUserId, /* allowDelayedLocking= */ false, null, null);
                 return;
             }
-            if (DEBUG_MU) {
-                Slogf.i(TAG, "stopUserOnSwitchIfEnforced() stopping %d and related users",
-                        oldUserId);
+        }
+
+        // We didn't need to stop the parent, but perhaps one of its profiles needs to be stopped.
+        final List<UserInfo> profiles = mInjector.getUserManager().getProfiles(
+                oldUserId, /* enabledOnly= */ false);
+        final int count = profiles.size();
+        for (int i = 0; i < count; i++) {
+            final int profileUserId = profiles.get(i).id;
+            if (hasUserRestriction(UserManager.DISALLOW_RUN_IN_BACKGROUND, profileUserId)) {
+                Slogf.i(TAG, "Stopping profile %d on user switch", profileUserId);
+                synchronized (mLock) {
+                    stopUsersLU(profileUserId,
+                            /* stopProfileRegardlessOfParent= */ false,
+                            /* allowDelayedLocking= */ false, null, null);
+                }
             }
-            stopUsersLU(oldUserId, /* force= */ false, /* allowDelayedLocking= */ true,
-                    null, null);
         }
     }
 
diff --git a/services/core/java/com/android/server/am/flags.aconfig b/services/core/java/com/android/server/am/flags.aconfig
index fd847f1..e1ccf4d 100644
--- a/services/core/java/com/android/server/am/flags.aconfig
+++ b/services/core/java/com/android/server/am/flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.am"
+container: "system"
 
 flag {
     name: "oomadjuster_correctness_rewrite"
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index fb62785..debd9d0 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -2671,14 +2671,10 @@
         }
     }
 
-    public CheckOpsDelegate getAppOpsServiceDelegate() {
-        synchronized (AppOpsService.this) {
-            final CheckOpsDelegateDispatcher dispatcher = mCheckOpsDelegateDispatcher;
-            return (dispatcher != null) ? dispatcher.getCheckOpsDelegate() : null;
-        }
-    }
-
-    public void setAppOpsServiceDelegate(CheckOpsDelegate delegate) {
+    /**
+     * Sets the CheckOpDelegate
+     */
+    public void setCheckOpsDelegate(CheckOpsDelegate delegate) {
         synchronized (AppOpsService.this) {
             final CheckOpsDelegateDispatcher oldDispatcher = mCheckOpsDelegateDispatcher;
             final CheckOpsDelegate policy = (oldDispatcher != null) ? oldDispatcher.mPolicy : null;
@@ -7157,10 +7153,6 @@
             mCheckOpsDelegate = checkOpsDelegate;
         }
 
-        public @NonNull CheckOpsDelegate getCheckOpsDelegate() {
-            return mCheckOpsDelegate;
-        }
-
         public int checkOperation(int code, int uid, String packageName,
                 @Nullable String attributionTag, int virtualDeviceId, boolean raw) {
             if (mPolicy != null) {
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index f1eea72..77654d4 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -127,8 +127,7 @@
     private final Object mDeviceStateLock = new Object();
 
     // Request to override default use of A2DP for media.
-    @GuardedBy("mDeviceStateLock")
-    private boolean mBluetoothA2dpEnabled;
+    private AtomicBoolean mBluetoothA2dpEnabled = new AtomicBoolean(false);
 
     // lock always taken when accessing AudioService.mSetModeDeathHandlers
     // TODO do not "share" the lock between AudioService and BtHelpr, see b/123769055
@@ -275,17 +274,8 @@
     }
 
     /*package*/ void setBluetoothA2dpOn_Async(boolean on, String source) {
-        synchronized (mDeviceStateLock) {
-            if (mBluetoothA2dpEnabled == on) {
-                return;
-            }
-            mBluetoothA2dpEnabled = on;
-            mBrokerHandler.removeMessages(MSG_IIL_SET_FORCE_BT_A2DP_USE);
-            sendIILMsgNoDelay(MSG_IIL_SET_FORCE_BT_A2DP_USE, SENDMSG_QUEUE,
-                    AudioSystem.FOR_MEDIA,
-                    mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP,
-                    source);
-        }
+        mBluetoothA2dpEnabled.set(on);
+        sendLMsgNoDelay(MSG_L_SET_FORCE_BT_A2DP_USE, SENDMSG_REPLACE, source);
     }
 
     /**
@@ -1223,16 +1213,8 @@
         }
     }
 
-    /*package*/ boolean isAvrcpAbsoluteVolumeSupported() {
-        synchronized (mDeviceStateLock) {
-            return mBtHelper.isAvrcpAbsoluteVolumeSupported();
-        }
-    }
-
     /*package*/ boolean isBluetoothA2dpOn() {
-        synchronized (mDeviceStateLock) {
-            return mBluetoothA2dpEnabled;
-        }
+        return mBluetoothA2dpEnabled.get();
     }
 
     /*package*/ void postSetAvrcpAbsoluteVolumeIndex(int index) {
@@ -1535,8 +1517,9 @@
         sendLMsgNoDelay(MSG_L_SYNCHRONIZE_ADI_DEVICES_IN_INVENTORY, SENDMSG_QUEUE, deviceState);
     }
 
-    /*package*/ void postUpdatedAdiDeviceState(AdiDeviceState deviceState) {
-        sendLMsgNoDelay(MSG_L_UPDATED_ADI_DEVICE_STATE, SENDMSG_QUEUE, deviceState);
+    /*package*/ void postUpdatedAdiDeviceState(AdiDeviceState deviceState, boolean initSA) {
+        sendILMsgNoDelay(
+                MSG_IL_UPDATED_ADI_DEVICE_STATE, SENDMSG_QUEUE, initSA ? 1 : 0, deviceState);
     }
 
     /*package*/ static final class CommunicationDeviceInfo {
@@ -1601,15 +1584,12 @@
                 .append(") from u/pid:").append(Binder.getCallingUid()).append("/")
                 .append(Binder.getCallingPid()).append(" src:").append(source).toString();
 
-        synchronized (mDeviceStateLock) {
-            mBluetoothA2dpEnabled = on;
-            mBrokerHandler.removeMessages(MSG_IIL_SET_FORCE_BT_A2DP_USE);
-            onSetForceUse(
-                    AudioSystem.FOR_MEDIA,
-                    mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP,
-                    fromA2dp,
-                    eventSource);
-        }
+        mBluetoothA2dpEnabled.set(on);
+        onSetForceUse(
+                AudioSystem.FOR_MEDIA,
+                on ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP,
+                fromA2dp,
+                eventSource);
     }
 
     /*package*/ boolean handleDeviceConnection(@NonNull AudioDeviceAttributes attributes,
@@ -1658,9 +1638,7 @@
     }
 
     /*package*/ boolean getBluetoothA2dpEnabled() {
-        synchronized (mDeviceStateLock) {
-            return mBluetoothA2dpEnabled;
-        }
+        return mBluetoothA2dpEnabled.get();
     }
 
     /*package*/ int getLeAudioDeviceGroupId(BluetoothDevice device) {
@@ -1821,9 +1799,12 @@
                     }
                     break;
                 case MSG_IIL_SET_FORCE_USE: // intended fall-through
-                case MSG_IIL_SET_FORCE_BT_A2DP_USE:
-                    onSetForceUse(msg.arg1, msg.arg2,
-                                  (msg.what == MSG_IIL_SET_FORCE_BT_A2DP_USE), (String) msg.obj);
+                    onSetForceUse(msg.arg1, msg.arg2, false, (String) msg.obj);
+                    break;
+                case MSG_L_SET_FORCE_BT_A2DP_USE:
+                    int forcedUsage = mBluetoothA2dpEnabled.get()
+                            ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP;
+                    onSetForceUse(AudioSystem.FOR_MEDIA, forcedUsage, true, (String) msg.obj);
                     break;
                 case MSG_REPORT_NEW_ROUTES:
                 case MSG_REPORT_NEW_ROUTES_A2DP:
@@ -1831,35 +1812,37 @@
                         mDeviceInventory.onReportNewRoutes();
                     }
                     break;
-                case MSG_L_SET_BT_ACTIVE_DEVICE:
-                    synchronized (mSetModeLock) {
-                        synchronized (mDeviceStateLock) {
-                            final BtDeviceInfo btInfo = (BtDeviceInfo) msg.obj;
-                            if (btInfo.mState == BluetoothProfile.STATE_CONNECTED
-                                    && !mBtHelper.isProfilePoxyConnected(btInfo.mProfile)) {
-                                AudioService.sDeviceLogger.enqueue((new EventLogger.StringEvent(
-                                        "msg: MSG_L_SET_BT_ACTIVE_DEVICE "
-                                            + "received with null profile proxy: "
-                                            + btInfo)).printLog(TAG));
-                            } else {
-                                @AudioSystem.AudioFormatNativeEnumForBtCodec final int codec =
-                                        mBtHelper.getCodecWithFallback(btInfo.mDevice,
-                                                btInfo.mProfile, btInfo.mIsLeOutput,
-                                                "MSG_L_SET_BT_ACTIVE_DEVICE");
-                                mDeviceInventory.onSetBtActiveDevice(btInfo, codec,
-                                        (btInfo.mProfile
-                                                != BluetoothProfile.LE_AUDIO || btInfo.mIsLeOutput)
-                                                ? mAudioService.getBluetoothContextualVolumeStream()
-                                                : AudioSystem.STREAM_DEFAULT);
+                case MSG_L_SET_BT_ACTIVE_DEVICE: {
+                    final BtDeviceInfo btInfo = (BtDeviceInfo) msg.obj;
+                    if (btInfo.mState == BluetoothProfile.STATE_CONNECTED
+                            && !mBtHelper.isProfilePoxyConnected(btInfo.mProfile)) {
+                        AudioService.sDeviceLogger.enqueue((new EventLogger.StringEvent(
+                                "msg: MSG_L_SET_BT_ACTIVE_DEVICE "
+                                        + "received with null profile proxy: "
+                                        + btInfo)).printLog(TAG));
+                    } else {
+                        final Pair<Integer, Boolean> codecAndChanged =
+                                mBtHelper.getCodecWithFallback(btInfo.mDevice,
+                                        btInfo.mProfile, btInfo.mIsLeOutput,
+                                        "MSG_L_SET_BT_ACTIVE_DEVICE");
+                        synchronized (mSetModeLock) {
+                            synchronized (mDeviceStateLock) {
+                                mDeviceInventory.onSetBtActiveDevice(btInfo, codecAndChanged.first,
+                                        (btInfo.mProfile != BluetoothProfile.LE_AUDIO
+                                                || btInfo.mIsLeOutput)
+                                            ? mAudioService.getBluetoothContextualVolumeStream()
+                                            : AudioSystem.STREAM_DEFAULT);
                                 if (btInfo.mProfile == BluetoothProfile.LE_AUDIO
-                                        || btInfo.mProfile == BluetoothProfile.HEARING_AID) {
-                                    onUpdateCommunicationRouteClient(isBluetoothScoRequested(),
+                                        || btInfo.mProfile
+                                        == BluetoothProfile.HEARING_AID) {
+                                    onUpdateCommunicationRouteClient(
+                                            isBluetoothScoRequested(),
                                             "setBluetoothActiveDevice");
                                 }
                             }
                         }
                     }
-                    break;
+                } break;
                 case MSG_BT_HEADSET_CNCT_FAILED:
                     synchronized (mSetModeLock) {
                         synchronized (mDeviceStateLock) {
@@ -1883,13 +1866,13 @@
                     break;
                 case MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE: {
                     final BtDeviceInfo btInfo = (BtDeviceInfo) msg.obj;
+                    final Pair<Integer, Boolean> codecAndChanged = mBtHelper.getCodecWithFallback(
+                            btInfo.mDevice, btInfo.mProfile, btInfo.mIsLeOutput,
+                            "MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE");
                     synchronized (mDeviceStateLock) {
-                        @AudioSystem.AudioFormatNativeEnumForBtCodec final int codec =
-                                mBtHelper.getCodecWithFallback(btInfo.mDevice,
-                                        btInfo.mProfile, btInfo.mIsLeOutput,
-                                        "MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE");
-                        mDeviceInventory.onBluetoothDeviceConfigChange(
-                                btInfo, codec, BtHelper.EVENT_DEVICE_CONFIG_CHANGE);
+                        mDeviceInventory.onBluetoothDeviceConfigChange(btInfo,
+                                codecAndChanged.first, codecAndChanged.second,
+                                BtHelper.EVENT_DEVICE_CONFIG_CHANGE);
                     }
                 } break;
                 case MSG_BROADCAST_AUDIO_BECOMING_NOISY:
@@ -2066,8 +2049,8 @@
                         }
                     } break;
 
-                case MSG_L_UPDATED_ADI_DEVICE_STATE:
-                    mAudioService.onUpdatedAdiDeviceState((AdiDeviceState) msg.obj);
+                case MSG_IL_UPDATED_ADI_DEVICE_STATE:
+                    mAudioService.onUpdatedAdiDeviceState((AdiDeviceState) msg.obj, msg.arg1 == 1);
                     break;
 
                 default:
@@ -2098,7 +2081,7 @@
     private static final int MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE = 2;
     private static final int MSG_I_BROADCAST_BT_CONNECTION_STATE = 3;
     private static final int MSG_IIL_SET_FORCE_USE = 4;
-    private static final int MSG_IIL_SET_FORCE_BT_A2DP_USE = 5;
+    private static final int MSG_L_SET_FORCE_BT_A2DP_USE = 5;
     private static final int MSG_TOGGLE_HDMI = 6;
     private static final int MSG_L_SET_BT_ACTIVE_DEVICE = 7;
     private static final int MSG_BT_HEADSET_CNCT_FAILED = 9;
@@ -2154,7 +2137,7 @@
     private static final int MSG_CHECK_COMMUNICATION_ROUTE_CLIENT_STATE = 56;
     private static final int MSG_I_UPDATE_LE_AUDIO_GROUP_ADDRESSES = 57;
     private static final int MSG_L_SYNCHRONIZE_ADI_DEVICES_IN_INVENTORY = 58;
-    private static final int MSG_L_UPDATED_ADI_DEVICE_STATE = 59;
+    private static final int MSG_IL_UPDATED_ADI_DEVICE_STATE = 59;
 
 
 
@@ -2295,7 +2278,7 @@
         MESSAGES_MUTE_MUSIC.add(MSG_L_SET_BT_ACTIVE_DEVICE);
         MESSAGES_MUTE_MUSIC.add(MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE);
         MESSAGES_MUTE_MUSIC.add(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT);
-        MESSAGES_MUTE_MUSIC.add(MSG_IIL_SET_FORCE_BT_A2DP_USE);
+        MESSAGES_MUTE_MUSIC.add(MSG_L_SET_FORCE_BT_A2DP_USE);
     }
 
     private AtomicBoolean mMusicMuted = new AtomicBoolean(false);
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index 14428c4..f38b381 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -173,7 +173,7 @@
                 if (ads.getAudioDeviceCategory() != category && (userDefined
                         || category != AUDIO_DEVICE_CATEGORY_UNKNOWN)) {
                     ads.setAudioDeviceCategory(category);
-                    mDeviceBroker.postUpdatedAdiDeviceState(ads);
+                    mDeviceBroker.postUpdatedAdiDeviceState(ads, false /*initSA*/);
                     mDeviceBroker.postPersistAudioDeviceSettings();
                 }
                 mDeviceBroker.postSynchronizeAdiDevicesInInventory(ads);
@@ -186,7 +186,7 @@
             mDeviceInventory.put(ads.getDeviceId(), ads);
             checkDeviceInventorySize_l();
 
-            mDeviceBroker.postUpdatedAdiDeviceState(ads);
+            mDeviceBroker.postUpdatedAdiDeviceState(ads, true /*initSA*/);
             mDeviceBroker.postPersistAudioDeviceSettings();
         }
     }
@@ -216,7 +216,7 @@
             checkDeviceInventorySize_l();
         }
         if (updatedCategory.get()) {
-            mDeviceBroker.postUpdatedAdiDeviceState(deviceState);
+            mDeviceBroker.postUpdatedAdiDeviceState(deviceState, false /*initSA*/);
         }
         mDeviceBroker.postSynchronizeAdiDevicesInInventory(deviceState);
     }
@@ -318,7 +318,7 @@
                     }
                     ads2.setAudioDeviceCategory(updatedDevice.getAudioDeviceCategory());
 
-                    mDeviceBroker.postUpdatedAdiDeviceState(ads2);
+                    mDeviceBroker.postUpdatedAdiDeviceState(ads2, false /*initSA*/);
                     AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                             "synchronizeBleDeviceInInventory synced device pair ads1="
                                     + updatedDevice + " ads2=" + ads2).printLog(TAG));
@@ -339,7 +339,7 @@
                     }
                     ads2.setAudioDeviceCategory(updatedDevice.getAudioDeviceCategory());
 
-                    mDeviceBroker.postUpdatedAdiDeviceState(ads2);
+                    mDeviceBroker.postUpdatedAdiDeviceState(ads2, false /*initSA*/);
                     AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                             "synchronizeBleDeviceInInventory synced device pair ads1="
                                     + updatedDevice + " peer ads2=" + ads2).printLog(TAG));
@@ -364,7 +364,7 @@
             }
             ads.setAudioDeviceCategory(updatedDevice.getAudioDeviceCategory());
 
-            mDeviceBroker.postUpdatedAdiDeviceState(ads);
+            mDeviceBroker.postUpdatedAdiDeviceState(ads, false /*initSA*/);
             AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                     "synchronizeDeviceProfilesInInventory synced device pair ads1="
                             + updatedDevice + " ads2=" + ads).printLog(TAG));
@@ -868,7 +868,8 @@
     @GuardedBy("mDeviceBroker.mDeviceStateLock")
     /*package*/ void onBluetoothDeviceConfigChange(
             @NonNull AudioDeviceBroker.BtDeviceInfo btInfo,
-            @AudioSystem.AudioFormatNativeEnumForBtCodec int codec, int event) {
+            @AudioSystem.AudioFormatNativeEnumForBtCodec int codec,
+            boolean codecChanged, int event) {
         MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId
                 + "onBluetoothDeviceConfigChange")
                 .set(MediaMetrics.Property.EVENT, BtHelper.deviceEventToString(event));
@@ -916,14 +917,12 @@
 
 
             if (event == BtHelper.EVENT_DEVICE_CONFIG_CHANGE) {
-                boolean codecChange = false;
                 if (btInfo.mProfile == BluetoothProfile.A2DP
                         || btInfo.mProfile == BluetoothProfile.LE_AUDIO
                         || btInfo.mProfile == BluetoothProfile.LE_AUDIO_BROADCAST) {
-                    if (di.mDeviceCodecFormat != codec) {
+                    if (codecChanged) {
                         di.mDeviceCodecFormat = codec;
                         mConnectedDevices.replace(key, di);
-                        codecChange = true;
                         final int res = mAudioSystem.handleDeviceConfigChange(
                                 btInfo.mAudioSystemDevice, address,
                                 BtHelper.getName(btDevice), codec);
@@ -947,7 +946,7 @@
                         }
                     }
                 }
-                if (!codecChange) {
+                if (!codecChanged) {
                     updateBluetoothPreferredModes_l(btDevice /*connectedDevice*/);
                 }
             }
diff --git a/services/core/java/com/android/server/audio/AudioManagerShellCommand.java b/services/core/java/com/android/server/audio/AudioManagerShellCommand.java
index 85acf70..570d4e9 100644
--- a/services/core/java/com/android/server/audio/AudioManagerShellCommand.java
+++ b/services/core/java/com/android/server/audio/AudioManagerShellCommand.java
@@ -53,6 +53,12 @@
                 return getSoundDoseValue();
             case "reset-sound-dose-timeout":
                 return resetSoundDoseTimeout();
+            case "set-volume":
+                return setVolume();
+            case "adj-mute":
+                return adjMute();
+            case "adj-unmute":
+                return adjUnmute();
         }
         return 0;
     }
@@ -78,6 +84,12 @@
         pw.println("    Returns the current sound dose value");
         pw.println("  reset-sound-dose-timeout");
         pw.println("    Resets the sound dose timeout used for momentary exposure");
+        pw.println("  set-volume STREAM_TYPE VOLUME_INDEX");
+        pw.println("    Sets the volume for STREAM_TYPE to VOLUME_INDEX");
+        pw.println("  adj-mute STREAM_TYPE");
+        pw.println("    mutes the STREAM_TYPE");
+        pw.println("  adj-unmute STREAM_TYPE");
+        pw.println("    unmutes the STREAM_TYPE");
     }
 
     private int setSurroundFormatEnabled() {
@@ -216,4 +228,54 @@
         getOutPrintWriter().println("Reset sound dose momentary exposure timeout");
         return 0;
     }
+
+    private int setVolume() {
+        final Context context = mService.mContext;
+        final AudioManager am = context.getSystemService(AudioManager.class);
+        final int stream = readIntArg();
+        final int index = readIntArg();
+        getOutPrintWriter().println("calling AudioManager.setStreamVolume("
+                + stream + ", " + index + ", 0)");
+        am.setStreamVolume(stream, index, 0);
+        return 0;
+    }
+
+    private int adjMute() {
+        final Context context = mService.mContext;
+        final AudioManager am = context.getSystemService(AudioManager.class);
+        final int stream = readIntArg();
+        getOutPrintWriter().println("calling AudioManager.adjustStreamVolume("
+                + stream + ", AudioManager.ADJUST_MUTE, 0)");
+        am.adjustStreamVolume(stream, AudioManager.ADJUST_MUTE, 0);
+        return 0;
+    }
+
+    private int adjUnmute() {
+        final Context context = mService.mContext;
+        final AudioManager am = context.getSystemService(AudioManager.class);
+        final int stream = readIntArg();
+        getOutPrintWriter().println("calling AudioManager.adjustStreamVolume("
+                + stream + ", AudioManager.ADJUST_UNMUTE, 0)");
+        am.adjustStreamVolume(stream, AudioManager.ADJUST_UNMUTE, 0);
+        return 0;
+    }
+
+    private int readIntArg() throws IllegalArgumentException {
+        String argText = getNextArg();
+
+        if (argText == null) {
+            getErrPrintWriter().println("Error: no argument provided");
+            throw new IllegalArgumentException("No argument provided");
+        }
+
+        int argIntVal = Integer.MIN_VALUE;
+        try {
+            argIntVal = Integer.parseInt(argText);
+        } catch (NumberFormatException e) {
+            getErrPrintWriter().println("Error: wrong format for argument " + argText);
+            throw new IllegalArgumentException("Wrong format for argument " + argText);
+        }
+
+        return argIntVal;
+    }
 }
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 0f951746..9896d9d 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -34,7 +34,7 @@
 import static android.media.audio.Flags.automaticBtDeviceType;
 import static android.media.audio.Flags.featureSpatialAudioHeadtrackingLowLatency;
 import static android.media.audio.Flags.focusFreezeTestApi;
-import static android.media.audio.Flags.foregroundAudioControl;
+import static android.media.audio.Flags.roForegroundAudioControl;
 import static android.media.audiopolicy.Flags.enableFadeManagerConfiguration;
 import static android.os.Process.FIRST_APPLICATION_UID;
 import static android.os.Process.INVALID_UID;
@@ -46,6 +46,8 @@
 import static com.android.media.audio.Flags.alarmMinVolumeZero;
 import static com.android.media.audio.Flags.disablePrescaleAbsoluteVolume;
 import static com.android.media.audio.Flags.ringerModeAffectsAlarm;
+import static com.android.media.audio.Flags.setStreamVolumeOrder;
+import static com.android.media.audio.Flags.vgsVssSyncMuteOrder;
 import static com.android.server.audio.SoundDoseHelper.ACTION_CHECK_MUSIC_ACTIVE;
 import static com.android.server.utils.EventLogger.Event.ALOGE;
 import static com.android.server.utils.EventLogger.Event.ALOGI;
@@ -4538,8 +4540,13 @@
                 + focusFreezeTestApi());
         pw.println("\tcom.android.media.audio.disablePrescaleAbsoluteVolume:"
                 + disablePrescaleAbsoluteVolume());
-        pw.println("\tandroid.media.audio.foregroundAudioControl:"
-                + foregroundAudioControl());
+
+        pw.println("\tcom.android.media.audio.setStreamVolumeOrder:"
+                + setStreamVolumeOrder());
+        pw.println("\tandroid.media.audio.roForegroundAudioControl:"
+                + roForegroundAudioControl());
+        pw.println("\tcom.android.media.audio.vgsVssSyncMuteOrder:"
+                + vgsVssSyncMuteOrder());
     }
 
     private void dumpAudioMode(PrintWriter pw) {
@@ -4622,6 +4629,7 @@
             case AudioSystem.MODE_CALL_SCREENING:
             case AudioSystem.MODE_CALL_REDIRECT:
             case AudioSystem.MODE_COMMUNICATION_REDIRECT:
+            case AudioSystem.MODE_RINGTONE:
                 break;
             default:
                 // no-op is enough for all other values
@@ -4704,6 +4712,30 @@
 
         index = rescaleIndex(index * 10, streamType, streamTypeAlias);
 
+        if (setStreamVolumeOrder()) {
+            flags &= ~AudioManager.FLAG_FIXED_VOLUME;
+            if (streamTypeAlias == AudioSystem.STREAM_MUSIC && isFixedVolumeDevice(device)) {
+                flags |= AudioManager.FLAG_FIXED_VOLUME;
+
+                // volume is either 0 or max allowed for fixed volume devices
+                if (index != 0) {
+                    index = mSoundDoseHelper.getSafeMediaVolumeIndex(device);
+                    if (index < 0) {
+                        index = streamState.getMaxIndex();
+                    }
+                }
+            }
+
+            if (!mSoundDoseHelper.willDisplayWarningAfterCheckVolume(streamType, index, device,
+                    flags)) {
+                onSetStreamVolume(streamType, index, flags, device, caller, hasModifyAudioSettings,
+                        // ada is non-null when called from setDeviceVolume,
+                        // which shouldn't update the mute state
+                        canChangeMuteAndUpdateController /*canChangeMute*/);
+                index = mStreamStates[streamType].getIndex(device);
+            }
+        }
+
         if (streamTypeAlias == AudioSystem.STREAM_MUSIC
                 && AudioSystem.DEVICE_OUT_ALL_A2DP_SET.contains(device)
                 && (flags & AudioManager.FLAG_BLUETOOTH_ABS_VOLUME) == 0) {
@@ -4737,26 +4769,28 @@
             mDeviceBroker.postSetHearingAidVolumeIndex(index, streamType);
         }
 
-        flags &= ~AudioManager.FLAG_FIXED_VOLUME;
-        if (streamTypeAlias == AudioSystem.STREAM_MUSIC && isFixedVolumeDevice(device)) {
-            flags |= AudioManager.FLAG_FIXED_VOLUME;
+        if (!setStreamVolumeOrder()) {
+            flags &= ~AudioManager.FLAG_FIXED_VOLUME;
+            if (streamTypeAlias == AudioSystem.STREAM_MUSIC && isFixedVolumeDevice(device)) {
+                flags |= AudioManager.FLAG_FIXED_VOLUME;
 
-            // volume is either 0 or max allowed for fixed volume devices
-            if (index != 0) {
-                index = mSoundDoseHelper.getSafeMediaVolumeIndex(device);
-                if (index < 0) {
-                    index = streamState.getMaxIndex();
+                // volume is either 0 or max allowed for fixed volume devices
+                if (index != 0) {
+                    index = mSoundDoseHelper.getSafeMediaVolumeIndex(device);
+                    if (index < 0) {
+                        index = streamState.getMaxIndex();
+                    }
                 }
             }
-        }
 
-        if (!mSoundDoseHelper.willDisplayWarningAfterCheckVolume(streamType, index, device,
-                flags)) {
-            onSetStreamVolume(streamType, index, flags, device, caller, hasModifyAudioSettings,
-                    // ada is non-null when called from setDeviceVolume,
-                    // which shouldn't update the mute state
-                    canChangeMuteAndUpdateController /*canChangeMute*/);
-            index = mStreamStates[streamType].getIndex(device);
+            if (!mSoundDoseHelper.willDisplayWarningAfterCheckVolume(streamType, index, device,
+                    flags)) {
+                onSetStreamVolume(streamType, index, flags, device, caller, hasModifyAudioSettings,
+                        // ada is non-null when called from setDeviceVolume,
+                        // which shouldn't update the mute state
+                        canChangeMuteAndUpdateController /*canChangeMute*/);
+                index = mStreamStates[streamType].getIndex(device);
+            }
         }
 
         synchronized (mHdmiClientLock) {
@@ -5430,19 +5464,19 @@
 
     /** @see AudioManager#setMicrophoneMuteFromSwitch(boolean) */
     public void setMicrophoneMuteFromSwitch(boolean on) {
-        int userId = Binder.getCallingUid();
-        if (userId != android.os.Process.SYSTEM_UID) {
+        int callingUid = Binder.getCallingUid();
+        if (callingUid != android.os.Process.SYSTEM_UID) {
             Log.e(TAG, "setMicrophoneMuteFromSwitch() called from non system user!");
             return;
         }
         mMicMuteFromSwitch = on;
         new MediaMetrics.Item(MediaMetrics.Name.AUDIO_MIC)
-                .setUid(userId)
+                .setUid(callingUid)
                 .set(MediaMetrics.Property.EVENT, "setMicrophoneMuteFromSwitch")
                 .set(MediaMetrics.Property.REQUEST, on
                         ? MediaMetrics.Value.MUTE : MediaMetrics.Value.UNMUTE)
                 .record();
-        setMicrophoneMuteNoCallerCheck(userId);
+        setMicrophoneMuteNoCallerCheck(UserHandle.getCallingUserId());
     }
 
     private void setMicMuteFromSwitchInput() {
@@ -5473,9 +5507,10 @@
         if (DEBUG_VOL) {
             Log.d(TAG, String.format("Mic mute %b, user=%d", muted, userId));
         }
-        // only mute for the current user
-        if (getCurrentUserId() == userId || userId == android.os.Process.SYSTEM_UID) {
+        // only mute for the current user or for the system user.
+        if (getCurrentUserId() == userId || userId == UserHandle.USER_SYSTEM) {
             final boolean currentMute = mAudioSystem.isMicrophoneMuted();
+            int callingUid = Binder.getCallingUid();
             final long identity = Binder.clearCallingIdentity();
             try {
                 final int ret = mAudioSystem.muteMicrophone(muted);
@@ -5488,7 +5523,7 @@
                 }
 
                 new MediaMetrics.Item(MediaMetrics.Name.AUDIO_MIC)
-                        .setUid(userId)
+                        .setUid(callingUid)
                         .set(MediaMetrics.Property.EVENT, "setMicrophoneMuteNoCallerCheck")
                         .set(MediaMetrics.Property.MUTE, mMicMuteFromSystemCached
                                 ? MediaMetrics.Value.ON : MediaMetrics.Value.OFF)
@@ -8286,13 +8321,23 @@
                                         synced = true;
                                         continue;
                                     }
+                                    if (vgsVssSyncMuteOrder()) {
+                                        if ((isMuted() != streamMuted) && isVssMuteBijective(
+                                                stream)) {
+                                            mStreamStates[stream].mute(isMuted(),
+                                                    "VGS.applyAllVolumes#1");
+                                        }
+                                    }
                                     if (indexForStream != index) {
                                         mStreamStates[stream].setIndex(index * 10, device, caller,
                                                 true /*hasModifyAudioSettings*/);
                                     }
-                                    if ((isMuted() != streamMuted) && isVssMuteBijective(stream)) {
-                                        mStreamStates[stream].mute(isMuted(),
-                                                "VGS.applyAllVolumes#1");
+                                    if (!vgsVssSyncMuteOrder()) {
+                                        if ((isMuted() != streamMuted) && isVssMuteBijective(
+                                                stream)) {
+                                            mStreamStates[stream].mute(isMuted(),
+                                                    "VGS.applyAllVolumes#1");
+                                        }
                                     }
                                 }
                             }
@@ -8824,6 +8869,7 @@
             boolean changed;
             int oldIndex;
             final boolean isCurrentDevice;
+            final StringBuilder aliasStreamIndexes = new StringBuilder();
             synchronized (mSettingsLock) {
                 synchronized (VolumeStreamState.class) {
                     oldIndex = getIndex(device);
@@ -8850,13 +8896,17 @@
                                 (changed || !aliasStreamState.hasIndexForDevice(device))) {
                             final int scaledIndex =
                                     rescaleIndex(aliasIndex, mStreamType, streamType);
-                            aliasStreamState.setIndex(scaledIndex, device, caller,
-                                    hasModifyAudioSettings);
+                            boolean changedAlias = aliasStreamState.setIndex(scaledIndex, device,
+                                    caller, hasModifyAudioSettings);
                             if (isCurrentDevice) {
-                                aliasStreamState.setIndex(scaledIndex,
+                                changedAlias |= aliasStreamState.setIndex(scaledIndex,
                                         getDeviceForStream(streamType), caller,
                                         hasModifyAudioSettings);
                             }
+                            if (changedAlias) {
+                                aliasStreamIndexes.append(AudioSystem.streamToString(streamType))
+                                        .append(":").append((scaledIndex + 5) / 10).append(" ");
+                            }
                         }
                     }
                     // Mirror changes in SPEAKER ringtone volume on SCO when
@@ -8896,8 +8946,15 @@
                                 oldIndex);
                         mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE_ALIAS,
                                 mStreamVolumeAlias[mStreamType]);
-                        AudioService.sVolumeLogger.enqueue(new VolChangedBroadcastEvent(
-                                mStreamType, mStreamVolumeAlias[mStreamType], index, oldIndex));
+                        if (mStreamType == mStreamVolumeAlias[mStreamType]) {
+                            String aliasStreamIndexesString = "";
+                            if (!aliasStreamIndexes.isEmpty()) {
+                                aliasStreamIndexesString =
+                                        " aliased streams: " + aliasStreamIndexes;
+                            }
+                            AudioService.sVolumeLogger.enqueue(new VolChangedBroadcastEvent(
+                                    mStreamType, aliasStreamIndexesString, index, oldIndex));
+                        }
                         sendBroadcastToAll(mVolumeChanged, mVolumeChangedOptions);
                     }
                 }
@@ -11240,7 +11297,8 @@
         mDeviceBroker.addOrUpdateBtAudioDeviceCategoryInInventory(deviceState);
         mDeviceBroker.postPersistAudioDeviceSettings();
 
-        mSpatializerHelper.refreshDevice(deviceState.getAudioDeviceAttributes());
+        mSpatializerHelper.refreshDevice(deviceState.getAudioDeviceAttributes(),
+                false /* initState */);
         mSoundDoseHelper.setAudioDeviceCategory(addr, internalType,
                 btAudioDeviceCategory == AUDIO_DEVICE_CATEGORY_HEADPHONES);
     }
@@ -11311,11 +11369,11 @@
 
     /** Update the sound dose and spatializer state based on the new AdiDeviceState. */
     @VisibleForTesting(visibility = PACKAGE)
-    public void onUpdatedAdiDeviceState(AdiDeviceState deviceState) {
+    public void onUpdatedAdiDeviceState(AdiDeviceState deviceState, boolean initSA) {
         if (deviceState == null) {
             return;
         }
-        mSpatializerHelper.refreshDevice(deviceState.getAudioDeviceAttributes());
+        mSpatializerHelper.refreshDevice(deviceState.getAudioDeviceAttributes(), initSA);
         mSoundDoseHelper.setAudioDeviceCategory(deviceState.getDeviceAddress(),
                 deviceState.getInternalDeviceType(),
                 deviceState.getAudioDeviceCategory() == AUDIO_DEVICE_CATEGORY_HEADPHONES);
diff --git a/services/core/java/com/android/server/audio/AudioServiceEvents.java b/services/core/java/com/android/server/audio/AudioServiceEvents.java
index 3b1c011..749044e 100644
--- a/services/core/java/com/android/server/audio/AudioServiceEvents.java
+++ b/services/core/java/com/android/server/audio/AudioServiceEvents.java
@@ -151,13 +151,13 @@
 
     static final class VolChangedBroadcastEvent extends EventLogger.Event {
         final int mStreamType;
-        final int mAliasStreamType;
+        final String mAliasStreamIndexes;
         final int mIndex;
         final int mOldIndex;
 
-        VolChangedBroadcastEvent(int stream, int alias, int index, int oldIndex) {
+        VolChangedBroadcastEvent(int stream, String aliasIndexes, int index, int oldIndex) {
             mStreamType = stream;
-            mAliasStreamType = alias;
+            mAliasStreamIndexes = aliasIndexes;
             mIndex = index;
             mOldIndex = oldIndex;
         }
@@ -167,8 +167,8 @@
             return new StringBuilder("sending VOLUME_CHANGED stream:")
                     .append(AudioSystem.streamToString(mStreamType))
                     .append(" index:").append(mIndex)
-                    .append(" (was:").append(mOldIndex)
-                    .append(") alias:").append(AudioSystem.streamToString(mAliasStreamType))
+                    .append(" (was:").append(mOldIndex).append(")")
+                    .append(mAliasStreamIndexes)
                     .toString();
         }
     }
diff --git a/services/core/java/com/android/server/audio/BtHelper.java b/services/core/java/com/android/server/audio/BtHelper.java
index 0f3f807..edeabdc 100644
--- a/services/core/java/com/android/server/audio/BtHelper.java
+++ b/services/core/java/com/android/server/audio/BtHelper.java
@@ -98,9 +98,16 @@
 
     private @Nullable BluetoothLeAudio mLeAudio;
 
+    private @Nullable BluetoothLeAudioCodecConfig mLeAudioCodecConfig;
+
     // Reference to BluetoothA2dp to query for AbsoluteVolume.
     private @Nullable BluetoothA2dp mA2dp;
 
+    private @Nullable BluetoothCodecConfig mA2dpCodecConfig;
+
+    private @AudioSystem.AudioFormatNativeEnumForBtCodec
+            int mLeAudioBroadcastCodec = AudioSystem.AUDIO_FORMAT_DEFAULT;
+
     // If absolute volume is supported in AVRCP device
     private boolean mAvrcpAbsVolSupported = false;
 
@@ -235,10 +242,6 @@
         mDeviceBroker.setForceUse_Async(AudioSystem.FOR_MEDIA, forMed, "onAudioServerDied()");
     }
 
-    /*package*/ synchronized boolean isAvrcpAbsoluteVolumeSupported() {
-        return (mA2dp != null && mAvrcpAbsVolSupported);
-    }
-
     /*package*/ synchronized void setAvrcpAbsoluteVolumeSupported(boolean supported) {
         mAvrcpAbsVolSupported = supported;
         Log.i(TAG, "setAvrcpAbsoluteVolumeSupported supported=" + supported);
@@ -269,12 +272,15 @@
         }
     }
 
-    /*package*/ synchronized @AudioSystem.AudioFormatNativeEnumForBtCodec int getCodec(
+    private synchronized Pair<Integer, Boolean> getCodec(
             @NonNull BluetoothDevice device, @AudioService.BtProfile int profile) {
+
         switch (profile) {
             case BluetoothProfile.A2DP: {
+                boolean changed = mA2dpCodecConfig != null;
                 if (mA2dp == null) {
-                    return AudioSystem.AUDIO_FORMAT_DEFAULT;
+                    mA2dpCodecConfig = null;
+                    return new Pair<>(AudioSystem.AUDIO_FORMAT_DEFAULT, changed);
                 }
                 BluetoothCodecStatus btCodecStatus = null;
                 try {
@@ -283,17 +289,24 @@
                     Log.e(TAG, "Exception while getting status of " + device, e);
                 }
                 if (btCodecStatus == null) {
-                    return AudioSystem.AUDIO_FORMAT_DEFAULT;
+                    mA2dpCodecConfig = null;
+                    return new Pair<>(AudioSystem.AUDIO_FORMAT_DEFAULT, changed);
                 }
                 final BluetoothCodecConfig btCodecConfig = btCodecStatus.getCodecConfig();
                 if (btCodecConfig == null) {
-                    return AudioSystem.AUDIO_FORMAT_DEFAULT;
+                    mA2dpCodecConfig = null;
+                    return new Pair<>(AudioSystem.AUDIO_FORMAT_DEFAULT, changed);
                 }
-                return AudioSystem.bluetoothA2dpCodecToAudioFormat(btCodecConfig.getCodecType());
+                changed = !btCodecConfig.equals(mA2dpCodecConfig);
+                mA2dpCodecConfig = btCodecConfig;
+                return new Pair<>(AudioSystem.bluetoothA2dpCodecToAudioFormat(
+                        btCodecConfig.getCodecType()), changed);
             }
             case BluetoothProfile.LE_AUDIO: {
+                boolean changed = mLeAudioCodecConfig != null;
                 if (mLeAudio == null) {
-                    return AudioSystem.AUDIO_FORMAT_DEFAULT;
+                    mLeAudioCodecConfig = null;
+                    return new Pair<>(AudioSystem.AUDIO_FORMAT_DEFAULT, changed);
                 }
                 BluetoothLeAudioCodecStatus btLeCodecStatus = null;
                 int groupId = mLeAudio.getGroupId(device);
@@ -303,42 +316,54 @@
                     Log.e(TAG, "Exception while getting status of " + device, e);
                 }
                 if (btLeCodecStatus == null) {
-                    return AudioSystem.AUDIO_FORMAT_DEFAULT;
+                    mLeAudioCodecConfig = null;
+                    return new Pair<>(AudioSystem.AUDIO_FORMAT_DEFAULT, changed);
                 }
                 BluetoothLeAudioCodecConfig btLeCodecConfig =
                         btLeCodecStatus.getOutputCodecConfig();
                 if (btLeCodecConfig == null) {
-                    return AudioSystem.AUDIO_FORMAT_DEFAULT;
+                    mLeAudioCodecConfig = null;
+                    return new Pair<>(AudioSystem.AUDIO_FORMAT_DEFAULT, changed);
                 }
-                return AudioSystem.bluetoothLeCodecToAudioFormat(btLeCodecConfig.getCodecType());
+                changed = !btLeCodecConfig.equals(mLeAudioCodecConfig);
+                mLeAudioCodecConfig = btLeCodecConfig;
+                return new Pair<>(AudioSystem.bluetoothLeCodecToAudioFormat(
+                        btLeCodecConfig.getCodecType()), changed);
+            }
+            case BluetoothProfile.LE_AUDIO_BROADCAST: {
+                // We assume LC3 for LE Audio broadcast codec as there is no API to get the codec
+                // config on LE Broadcast profile proxy.
+                boolean changed = mLeAudioBroadcastCodec != AudioSystem.AUDIO_FORMAT_LC3;
+                mLeAudioBroadcastCodec = AudioSystem.AUDIO_FORMAT_LC3;
+                return new Pair<>(mLeAudioBroadcastCodec, changed);
             }
             default:
-                return AudioSystem.AUDIO_FORMAT_DEFAULT;
+                return new Pair<>(AudioSystem.AUDIO_FORMAT_DEFAULT, false);
         }
     }
 
-    /*package*/ synchronized @AudioSystem.AudioFormatNativeEnumForBtCodec
-            int getCodecWithFallback(
-                    @NonNull BluetoothDevice device, @AudioService.BtProfile int profile,
-                    boolean isLeOutput, @NonNull String source) {
+    /*package*/ synchronized Pair<Integer, Boolean>
+                    getCodecWithFallback(@NonNull BluetoothDevice device,
+                                         @AudioService.BtProfile int profile,
+                                         boolean isLeOutput, @NonNull String source) {
         // For profiles other than A2DP and LE Audio output, the audio codec format must be
         // AUDIO_FORMAT_DEFAULT as native audio policy manager expects a specific audio format
         // only if audio HW module selection based on format is supported for the device type.
         if (!(profile == BluetoothProfile.A2DP
                 || (isLeOutput && ((profile == BluetoothProfile.LE_AUDIO)
                         || (profile == BluetoothProfile.LE_AUDIO_BROADCAST))))) {
-            return AudioSystem.AUDIO_FORMAT_DEFAULT;
+            return new Pair<>(AudioSystem.AUDIO_FORMAT_DEFAULT, false);
         }
-        @AudioSystem.AudioFormatNativeEnumForBtCodec int codec =
+        Pair<Integer, Boolean> codecAndChanged =
                 getCodec(device, profile);
-        if (codec == AudioSystem.AUDIO_FORMAT_DEFAULT) {
+        if (codecAndChanged.first == AudioSystem.AUDIO_FORMAT_DEFAULT) {
             AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                     "getCodec DEFAULT from " + source + " fallback to "
                             + (profile == BluetoothProfile.A2DP ? "SBC" : "LC3")));
-            return profile == BluetoothProfile.A2DP
-                    ? AudioSystem.AUDIO_FORMAT_SBC : AudioSystem.AUDIO_FORMAT_LC3;
+            return new Pair<>(profile == BluetoothProfile.A2DP
+                    ? AudioSystem.AUDIO_FORMAT_SBC : AudioSystem.AUDIO_FORMAT_LC3, true);
         }
-        return codec;
+        return codecAndChanged;
     }
 
     // @GuardedBy("mDeviceBroker.mSetModeLock")
@@ -543,15 +568,19 @@
                 break;
             case BluetoothProfile.A2DP:
                 mA2dp = null;
+                mA2dpCodecConfig = null;
                 break;
             case BluetoothProfile.HEARING_AID:
                 mHearingAid = null;
                 break;
             case BluetoothProfile.LE_AUDIO:
                 mLeAudio = null;
+                mLeAudioCodecConfig = null;
+                break;
+            case BluetoothProfile.LE_AUDIO_BROADCAST:
+                mLeAudioBroadcastCodec = AudioSystem.AUDIO_FORMAT_DEFAULT;
                 break;
             case BluetoothProfile.A2DP_SINK:
-            case BluetoothProfile.LE_AUDIO_BROADCAST:
                 // nothing to do in BtHelper
                 break;
             default:
@@ -648,8 +677,6 @@
         }
     }
 
-    // @GuardedBy("mDeviceBroker.mSetModeLock")
-    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
     /*package*/ synchronized boolean isProfilePoxyConnected(int profile) {
         switch (profile) {
             case BluetoothProfile.HEADSET:
diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
index 08da32e..28af222 100644
--- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
@@ -235,6 +235,10 @@
     public int trackPlayer(PlayerBase.PlayerIdCard pic) {
         final int newPiid = AudioSystem.newAudioPlayerId();
         if (DEBUG) { Log.v(TAG, "trackPlayer() new piid=" + newPiid); }
+        if (newPiid == PLAYER_PIID_INVALID) {
+            Log.w(TAG, "invalid piid assigned from AudioSystem");
+            return newPiid;
+        }
         final AudioPlaybackConfiguration apc =
                 new AudioPlaybackConfiguration(pic, newPiid,
                         Binder.getCallingUid(), Binder.getCallingPid());
@@ -365,15 +369,14 @@
             sEventLogger.enqueue(new PlayerEvent(piid, event, eventValue));
 
             if (event == AudioPlaybackConfiguration.PLAYER_UPDATE_PORT_ID) {
-                mEventHandler.sendMessage(
-                        mEventHandler.obtainMessage(MSG_II_UPDATE_PORT_EVENT, eventValue, piid));
+                mPortIdToPiid.put(eventValue, piid);
                 return;
             } else if (event == AudioPlaybackConfiguration.PLAYER_STATE_STARTED) {
                 for (Integer uidInteger: mBannedUids) {
                     if (checkBanPlayer(apc, uidInteger.intValue())) {
                         // player was banned, do not update its state
                         sEventLogger.enqueue(new EventLogger.StringEvent(
-                                "not starting piid:" + piid + " ,is banned"));
+                                "not starting piid:" + piid + ", is banned"));
                         return;
                     }
                 }
@@ -429,16 +432,12 @@
         synchronized (mPlayerLock) {
             int piid = mPortIdToPiid.get(portId, PLAYER_PIID_INVALID);
             if (piid == PLAYER_PIID_INVALID) {
-                if (DEBUG) {
-                    Log.v(TAG, "No piid assigned for invalid/internal port id " + portId);
-                }
+                Log.w(TAG, "No piid assigned for invalid/internal port id " + portId);
                 return;
             }
             final AudioPlaybackConfiguration apc = mPlayers.get(piid);
             if (apc == null) {
-                if (DEBUG) {
-                    Log.v(TAG, "No AudioPlaybackConfiguration assigned for piid " + piid);
-                }
+                Log.w(TAG, "No AudioPlaybackConfiguration assigned for piid " + piid);
                 return;
             }
 
@@ -470,11 +469,18 @@
     public void releasePlayer(int piid, int binderUid) {
         if (DEBUG) { Log.v(TAG, "releasePlayer() for piid=" + piid); }
         boolean change = false;
+        if (piid == PLAYER_PIID_INVALID) {
+            Log.w(TAG, "Received releasePlayer with invalid piid: " + piid);
+            sEventLogger.enqueue(new EventLogger.StringEvent("releasePlayer with invalid piid:"
+                    + piid + ", uid:" + binderUid));
+            return;
+        }
+
         synchronized(mPlayerLock) {
             final AudioPlaybackConfiguration apc = mPlayers.get(new Integer(piid));
             if (checkConfigurationCaller(piid, apc, binderUid)) {
                 sEventLogger.enqueue(new EventLogger.StringEvent(
-                        "releasing player piid:" + piid));
+                        "releasing player piid:" + piid + ", uid:" + binderUid));
                 mPlayers.remove(new Integer(piid));
                 mDuckingManager.removeReleased(apc);
                 mFadeOutManager.removeReleased(apc);
@@ -484,8 +490,10 @@
                         AudioPlaybackConfiguration.PLAYER_DEVICEID_INVALID);
 
                 // remove all port ids mapped to the released player
-                mEventHandler.sendMessage(
-                        mEventHandler.obtainMessage(MSG_I_CLEAR_PORTS_FOR_PIID, piid, /*arg2=*/0));
+                int portIdx;
+                while ((portIdx = mPortIdToPiid.indexOfValue(piid)) >= 0) {
+                    mPortIdToPiid.removeAt(portIdx);
+                }
 
                 if (change && mDoNotLogPiidList.contains(piid)) {
                     // do not dispatch a change for a "do not log" player
@@ -1609,14 +1617,6 @@
     private static final int MSG_L_TIMEOUT_MUTE_AWAIT_CONNECTION = 1;
 
     /**
-     * assign new port id to piid
-     * args:
-     *     msg.arg1: port id
-     *     msg.arg2: piid
-     */
-    private static final int MSG_II_UPDATE_PORT_EVENT = 2;
-
-    /**
      * event for player getting muted
      * args:
      *     msg.arg1: piid
@@ -1624,14 +1624,7 @@
      *     msg.obj: extras describing the mute reason
      *         type: PersistableBundle
      */
-    private static final int MSG_IIL_UPDATE_PLAYER_MUTED_EVENT = 3;
-
-    /**
-     * clear all ports assigned to a given piid
-     * args:
-     *     msg.arg1: the piid
-     */
-    private static final int MSG_I_CLEAR_PORTS_FOR_PIID = 4;
+    private static final int MSG_IIL_UPDATE_PLAYER_MUTED_EVENT = 2;
 
     /**
      * event for player reporting playback format and spatialization status
@@ -1641,7 +1634,7 @@
      *     msg.obj: extras describing the sample rate, channel mask, spatialized
      *         type: PersistableBundle
      */
-    private static final int MSG_IIL_UPDATE_PLAYER_FORMAT = 5;
+    private static final int MSG_IIL_UPDATE_PLAYER_FORMAT = 3;
 
     private void initEventHandler() {
         mEventThread = new HandlerThread(TAG);
@@ -1660,11 +1653,6 @@
                         mMuteAwaitConnectionTimeoutCb.accept((AudioDeviceAttributes) msg.obj);
                         break;
 
-                    case MSG_II_UPDATE_PORT_EVENT:
-                        synchronized (mPlayerLock) {
-                            mPortIdToPiid.put(/*portId*/msg.arg1, /*piid*/msg.arg2);
-                        }
-                        break;
                     case MSG_IIL_UPDATE_PLAYER_MUTED_EVENT:
                         // TODO: replace PersistableBundle with own struct
                         PersistableBundle extras = (PersistableBundle) msg.obj;
@@ -1680,10 +1668,7 @@
                             sEventLogger.enqueue(
                                     new PlayerEvent(piid, PLAYER_UPDATE_MUTED, eventValue));
 
-                            final AudioPlaybackConfiguration apc;
-                            synchronized (mPlayerLock) {
-                                apc = mPlayers.get(piid);
-                            }
+                            final AudioPlaybackConfiguration apc = mPlayers.get(piid);
                             if (apc == null || !apc.handleMutedEvent(eventValue)) {
                                 break;  // do not dispatch
                             }
@@ -1691,21 +1676,6 @@
                         }
                         break;
 
-                    case MSG_I_CLEAR_PORTS_FOR_PIID:
-                        int piid = msg.arg1;
-                        if (piid == AudioPlaybackConfiguration.PLAYER_PIID_INVALID) {
-                            Log.w(TAG, "Received clear ports with invalid piid");
-                            break;
-                        }
-
-                        synchronized (mPlayerLock) {
-                            int portIdx;
-                            while ((portIdx = mPortIdToPiid.indexOfValue(piid)) >= 0) {
-                                mPortIdToPiid.removeAt(portIdx);
-                            }
-                        }
-                        break;
-
                     case MSG_IIL_UPDATE_PLAYER_FORMAT:
                         final PersistableBundle formatExtras = (PersistableBundle) msg.obj;
                         if (formatExtras == null) {
diff --git a/services/core/java/com/android/server/audio/SpatializerHelper.java b/services/core/java/com/android/server/audio/SpatializerHelper.java
index 3b5fa7f..38fa79f 100644
--- a/services/core/java/com/android/server/audio/SpatializerHelper.java
+++ b/services/core/java/com/android/server/audio/SpatializerHelper.java
@@ -295,11 +295,11 @@
             // could have been called another time after boot in case of audioserver restart
             addCompatibleAudioDevice(
                     new AudioDeviceAttributes(AudioSystem.DEVICE_OUT_SPEAKER, ""),
-                            false /*forceEnable*/);
+                            false /*forceEnable*/, false /*forceInit*/);
             // not force-enabling as this device might already be in the device list
             addCompatibleAudioDevice(
                     new AudioDeviceAttributes(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE, ""),
-                            false /*forceEnable*/);
+                            false /*forceEnable*/, false /*forceInit*/);
         } catch (RemoteException e) {
             resetCapabilities();
         } finally {
@@ -526,7 +526,7 @@
     }
 
     synchronized void addCompatibleAudioDevice(@NonNull AudioDeviceAttributes ada) {
-        addCompatibleAudioDevice(ada, true /*forceEnable*/);
+        addCompatibleAudioDevice(ada, true /*forceEnable*/, false /*forceInit*/);
     }
 
     /**
@@ -540,7 +540,7 @@
      */
     @GuardedBy("this")
     private void addCompatibleAudioDevice(@NonNull AudioDeviceAttributes ada,
-            boolean forceEnable) {
+            boolean forceEnable, boolean forceInit) {
         if (!isDeviceCompatibleWithSpatializationModes(ada)) {
             return;
         }
@@ -548,6 +548,9 @@
         final AdiDeviceState deviceState = findSACompatibleDeviceStateForAudioDeviceAttributes(ada);
         AdiDeviceState updatedDevice = null; // non-null on update.
         if (deviceState != null) {
+            if (forceInit) {
+                initSAState(deviceState);
+            }
             if (forceEnable && !deviceState.isSAEnabled()) {
                 updatedDevice = deviceState;
                 updatedDevice.setSAEnabled(true);
@@ -756,10 +759,10 @@
         }
     }
 
-    synchronized void refreshDevice(@NonNull AudioDeviceAttributes ada) {
+    synchronized void refreshDevice(@NonNull AudioDeviceAttributes ada, boolean initState) {
         final AdiDeviceState deviceState = findSACompatibleDeviceStateForAudioDeviceAttributes(ada);
         if (isAvailableForAdiDeviceState(deviceState)) {
-            addCompatibleAudioDevice(ada, /*forceEnable=*/deviceState.isSAEnabled());
+            addCompatibleAudioDevice(ada, /*forceEnable=*/deviceState.isSAEnabled(), initState);
             setHeadTrackerEnabled(deviceState.isHeadTrackerEnabled(), ada);
         } else {
             removeCompatibleAudioDevice(ada);
diff --git a/services/core/java/com/android/server/backup/SystemBackupAgent.java b/services/core/java/com/android/server/backup/SystemBackupAgent.java
index 5b9469b..1ea72d7 100644
--- a/services/core/java/com/android/server/backup/SystemBackupAgent.java
+++ b/services/core/java/com/android/server/backup/SystemBackupAgent.java
@@ -34,10 +34,11 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.Slog;
-import com.google.android.collect.Sets;
 
 import com.android.server.backup.Flags;
 
+import com.google.android.collect.Sets;
+
 import java.io.File;
 import java.io.IOException;
 import java.util.Set;
@@ -64,6 +65,7 @@
     private static final String APP_LOCALES_HELPER = "app_locales";
     private static final String APP_GENDER_HELPER = "app_gender";
     private static final String COMPANION_HELPER = "companion";
+    private static final String SYSTEM_GENDER_HELPER = "system_gender";
 
     // These paths must match what the WallpaperManagerService uses.  The leaf *_FILENAME
     // are also used in the full-backup file format, so must not change unless steps are
@@ -99,7 +101,9 @@
                     NOTIFICATION_HELPER,
                     SYNC_SETTINGS_HELPER,
                     APP_LOCALES_HELPER,
-                    COMPANION_HELPER);
+                    COMPANION_HELPER,
+                    APP_GENDER_HELPER,
+                    SYSTEM_GENDER_HELPER);
 
     /** Helpers that are enabled for full, non-system users. */
     private static final Set<String> sEligibleHelpersForNonSystemUser =
@@ -139,6 +143,8 @@
         addHelperIfEligibleForUser(APP_GENDER_HELPER,
                 new AppGrammaticalGenderBackupHelper(mUserId));
         addHelperIfEligibleForUser(COMPANION_HELPER, new CompanionBackupHelper(mUserId));
+        addHelperIfEligibleForUser(SYSTEM_GENDER_HELPER,
+                new SystemGrammaticalGenderBackupHelper(mUserId));
     }
 
     @Override
diff --git a/services/core/java/com/android/server/backup/SystemGrammaticalGenderBackupHelper.java b/services/core/java/com/android/server/backup/SystemGrammaticalGenderBackupHelper.java
new file mode 100644
index 0000000..c0d398e
--- /dev/null
+++ b/services/core/java/com/android/server/backup/SystemGrammaticalGenderBackupHelper.java
@@ -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.server.backup;
+
+import static android.app.backup.BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED;
+
+import android.annotation.UserIdInt;
+import android.app.backup.BackupDataOutput;
+import android.app.backup.BlobBackupHelper;
+import android.os.ParcelFileDescriptor;
+
+import com.android.server.LocalServices;
+import com.android.server.grammaticalinflection.GrammaticalInflectionManagerInternal;
+
+public class SystemGrammaticalGenderBackupHelper extends BlobBackupHelper {
+    private static final int BLOB_VERSION = 1;
+    private static final String KEY_SYSTEM_GENDER = "system_gender";
+
+    private final @UserIdInt int mUserId;
+    private final GrammaticalInflectionManagerInternal mGrammarInflectionManagerInternal;
+
+    public SystemGrammaticalGenderBackupHelper(int userId) {
+        super(BLOB_VERSION, KEY_SYSTEM_GENDER);
+        mUserId = userId;
+        mGrammarInflectionManagerInternal = LocalServices.getService(
+                GrammaticalInflectionManagerInternal.class);
+    }
+
+    @Override
+    public void performBackup(ParcelFileDescriptor oldStateFd, BackupDataOutput data,
+            ParcelFileDescriptor newStateFd) {
+        // Only backup the gender data if e2e encryption is present
+        if ((data.getTransportFlags() & FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) == 0) {
+            return;
+        }
+
+        super.performBackup(oldStateFd, data, newStateFd);
+    }
+
+    @Override
+    protected byte[] getBackupPayload(String key) {
+        return KEY_SYSTEM_GENDER.equals(key) && mGrammarInflectionManagerInternal != null
+                ? mGrammarInflectionManagerInternal.getSystemBackupPayload(mUserId) : null;
+    }
+
+    @Override
+    protected void applyRestoredPayload(String key, byte[] payload) {
+        if (KEY_SYSTEM_GENDER.equals(key) && mGrammarInflectionManagerInternal != null) {
+            mGrammarInflectionManagerInternal.applyRestoredSystemPayload(payload, mUserId);
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/biometrics/Android.bp b/services/core/java/com/android/server/biometrics/Android.bp
index 6cbe4ad..ed5de03 100644
--- a/services/core/java/com/android/server/biometrics/Android.bp
+++ b/services/core/java/com/android/server/biometrics/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "biometrics_flags",
     package: "com.android.server.biometrics",
+    container: "system",
     srcs: [
         "biometrics.aconfig",
     ],
diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java
index b7e11a7..7df63b1 100644
--- a/services/core/java/com/android/server/biometrics/AuthService.java
+++ b/services/core/java/com/android/server/biometrics/AuthService.java
@@ -312,8 +312,8 @@
             if (promptInfo.containsPrivateApiConfigurations()) {
                 checkInternalPermission();
             }
-            if (promptInfo.containsSetLogoApiConfigurations()) {
-                checkManageBiometricPermission();
+            if (promptInfo.containsAdvancedApiConfigurations()) {
+                checkBiometricAdvancedPermission();
             }
 
             final long identity = Binder.clearCallingIdentity();
@@ -869,9 +869,7 @@
             }
 
             if (faceAidlInstances != null && faceAidlInstances.length > 0) {
-                mFaceSensorConfigurations.addAidlConfigs(faceAidlInstances,
-                        name -> IFace.Stub.asInterface(Binder.allowBlocking(
-                                ServiceManager.waitForDeclaredService(name))));
+                mFaceSensorConfigurations.addAidlConfigs(faceAidlInstances);
             }
 
             if (faceService != null) {
@@ -909,9 +907,7 @@
             }
 
             if (fingerprintAidlInstances != null && fingerprintAidlInstances.length > 0) {
-                mFingerprintSensorConfigurations.addAidlSensors(fingerprintAidlInstances,
-                        name -> IFingerprint.Stub.asInterface(Binder.allowBlocking(
-                                ServiceManager.waitForDeclaredService(name))));
+                mFingerprintSensorConfigurations.addAidlSensors(fingerprintAidlInstances);
             }
 
             if (fingerprintService != null) {
@@ -1029,7 +1025,7 @@
                 "Must have USE_BIOMETRIC_INTERNAL permission");
     }
 
-    private void checkManageBiometricPermission() {
+    private void checkBiometricAdvancedPermission() {
         getContext().enforceCallingOrSelfPermission(SET_BIOMETRIC_DIALOG_ADVANCED,
                 "Must have SET_BIOMETRIC_DIALOG_ADVANCED permission");
     }
diff --git a/services/core/java/com/android/server/biometrics/AuthSession.java b/services/core/java/com/android/server/biometrics/AuthSession.java
index c507300..c03b3b8 100644
--- a/services/core/java/com/android/server/biometrics/AuthSession.java
+++ b/services/core/java/com/android/server/biometrics/AuthSession.java
@@ -56,7 +56,7 @@
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.security.KeyStore;
+import android.security.KeyStoreAuthorization;
 import android.util.Slog;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -111,7 +111,7 @@
     @NonNull private final BiometricContext mBiometricContext;
     private final IStatusBarService mStatusBarService;
     @VisibleForTesting final IBiometricSysuiReceiver mSysuiReceiver;
-    private final KeyStore mKeyStore;
+    private final KeyStoreAuthorization mKeyStoreAuthorization;
     private final Random mRandom;
     private final ClientDeathReceiver mClientDeathReceiver;
     final PreAuthInfo mPreAuthInfo;
@@ -158,7 +158,7 @@
             @NonNull BiometricContext biometricContext,
             @NonNull IStatusBarService statusBarService,
             @NonNull IBiometricSysuiReceiver sysuiReceiver,
-            @NonNull KeyStore keystore,
+            @NonNull KeyStoreAuthorization keyStoreAuthorization,
             @NonNull Random random,
             @NonNull ClientDeathReceiver clientDeathReceiver,
             @NonNull PreAuthInfo preAuthInfo,
@@ -172,8 +172,8 @@
             @NonNull PromptInfo promptInfo,
             boolean debugEnabled,
             @NonNull List<FingerprintSensorPropertiesInternal> fingerprintSensorProperties) {
-        this(context, biometricContext, statusBarService, sysuiReceiver, keystore, random,
-                clientDeathReceiver, preAuthInfo, token, requestId, operationId, userId,
+        this(context, biometricContext, statusBarService, sysuiReceiver, keyStoreAuthorization,
+                random, clientDeathReceiver, preAuthInfo, token, requestId, operationId, userId,
                 sensorReceiver, clientReceiver, opPackageName, promptInfo, debugEnabled,
                 fingerprintSensorProperties, BiometricFrameworkStatsLogger.getInstance());
     }
@@ -183,7 +183,7 @@
             @NonNull BiometricContext biometricContext,
             @NonNull IStatusBarService statusBarService,
             @NonNull IBiometricSysuiReceiver sysuiReceiver,
-            @NonNull KeyStore keystore,
+            @NonNull KeyStoreAuthorization keyStoreAuthorization,
             @NonNull Random random,
             @NonNull ClientDeathReceiver clientDeathReceiver,
             @NonNull PreAuthInfo preAuthInfo,
@@ -203,7 +203,7 @@
         mBiometricContext = biometricContext;
         mStatusBarService = statusBarService;
         mSysuiReceiver = sysuiReceiver;
-        mKeyStore = keystore;
+        mKeyStoreAuthorization = keyStoreAuthorization;
         mRandom = random;
         mClientDeathReceiver = clientDeathReceiver;
         mPreAuthInfo = preAuthInfo;
@@ -814,14 +814,14 @@
             switch (reason) {
                 case BiometricPrompt.DISMISSED_REASON_CREDENTIAL_CONFIRMED:
                     if (credentialAttestation != null) {
-                        mKeyStore.addAuthToken(credentialAttestation);
+                        mKeyStoreAuthorization.addAuthToken(credentialAttestation);
                     } else {
                         Slog.e(TAG, "credentialAttestation is null");
                     }
                 case BiometricPrompt.DISMISSED_REASON_BIOMETRIC_CONFIRMED:
                 case BiometricPrompt.DISMISSED_REASON_BIOMETRIC_CONFIRM_NOT_REQUIRED:
                     if (mTokenEscrow != null) {
-                        final int result = mKeyStore.addAuthToken(mTokenEscrow);
+                        final int result = mKeyStoreAuthorization.addAuthToken(mTokenEscrow);
                         Slog.d(TAG, "addAuthToken: " + result);
                     } else {
                         Slog.e(TAG, "mTokenEscrow is null");
@@ -831,6 +831,7 @@
                     break;
 
                 case BiometricPrompt.DISMISSED_REASON_NEGATIVE:
+                case BiometricPrompt.DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS:
                     mClientReceiver.onDialogDismissed(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 894b4d5..3737d6f 100644
--- a/services/core/java/com/android/server/biometrics/BiometricService.java
+++ b/services/core/java/com/android/server/biometrics/BiometricService.java
@@ -65,15 +65,11 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.ServiceManager;
-import android.os.ServiceSpecificException;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
-import android.security.Authorization;
 import android.security.GateKeeper;
-import android.security.KeyStore;
-import android.security.authorization.IKeystoreAuthorization;
-import android.security.authorization.ResponseCode;
+import android.security.KeyStoreAuthorization;
 import android.service.gatekeeper.IGateKeeperService;
 import android.text.TextUtils;
 import android.util.ArraySet;
@@ -123,11 +119,9 @@
     @VisibleForTesting
     IStatusBarService mStatusBarService;
     @VisibleForTesting
-    KeyStore mKeyStore;
-    @VisibleForTesting
     ITrustManager mTrustManager;
     @VisibleForTesting
-    IKeystoreAuthorization mKeystoreAuthorization;
+    KeyStoreAuthorization mKeyStoreAuthorization;
     @VisibleForTesting
     IGateKeeperService mGateKeeper;
 
@@ -674,19 +668,7 @@
             int[] authTypesArray = hardwareAuthenticators.stream()
                     .mapToInt(Integer::intValue)
                     .toArray();
-            try {
-                return mKeystoreAuthorization.getLastAuthTime(secureUserId, authTypesArray);
-            } catch (RemoteException e) {
-                Slog.w(TAG, "Error getting last auth time: " + e);
-                return BiometricConstants.BIOMETRIC_NO_AUTHENTICATION;
-            } catch (ServiceSpecificException e) {
-                // This is returned when the feature flag test fails in keystore2
-                if (e.errorCode == ResponseCode.PERMISSION_DENIED) {
-                    throw new UnsupportedOperationException();
-                }
-
-                return BiometricConstants.BIOMETRIC_NO_AUTHENTICATION;
-            }
+            return mKeyStoreAuthorization.getLastAuthTime(secureUserId, authTypesArray);
         }
 
         @android.annotation.EnforcePermission(android.Manifest.permission.USE_BIOMETRIC_INTERNAL)
@@ -1011,8 +993,8 @@
             return ActivityManager.getService();
         }
 
-        public IKeystoreAuthorization getKeystoreAuthorizationService() {
-            return Authorization.getService();
+        public KeyStoreAuthorization getKeyStoreAuthorization() {
+            return KeyStoreAuthorization.getInstance();
         }
 
         public IGateKeeperService getGateKeeperService() {
@@ -1036,10 +1018,6 @@
             return new SettingObserver(context, handler, callbacks);
         }
 
-        public KeyStore getKeyStore() {
-            return KeyStore.getInstance();
-        }
-
         /**
          * Allows to enable/disable debug logs.
          */
@@ -1138,7 +1116,7 @@
         mBiometricContext = injector.getBiometricContext(context);
         mUserManager = injector.getUserManager(context);
         mBiometricCameraManager = injector.getBiometricCameraManager(context);
-        mKeystoreAuthorization = injector.getKeystoreAuthorizationService();
+        mKeyStoreAuthorization = injector.getKeyStoreAuthorization();
         mGateKeeper = injector.getGateKeeperService();
         mBiometricNotificationLogger = injector.getNotificationLogger();
 
@@ -1159,7 +1137,6 @@
 
     @Override
     public void onStart() {
-        mKeyStore = mInjector.getKeyStore();
         mStatusBarService = mInjector.getStatusBarService();
         mTrustManager = mInjector.getTrustManager();
         mInjector.publishBinderService(this, mImpl);
@@ -1481,7 +1458,7 @@
 
         final boolean debugEnabled = mInjector.isDebugEnabled(getContext(), userId);
         mAuthSession = new AuthSession(getContext(), mBiometricContext, mStatusBarService,
-                createSysuiReceiver(requestId), mKeyStore, mRandom,
+                createSysuiReceiver(requestId), mKeyStoreAuthorization, mRandom,
                 createClientDeathReceiver(requestId), preAuthInfo, token, requestId,
                 operationId, userId, createBiometricSensorReceiver(requestId), receiver,
                 opPackageName, promptInfo, debugEnabled,
diff --git a/services/core/java/com/android/server/biometrics/Utils.java b/services/core/java/com/android/server/biometrics/Utils.java
index f51b62d..4af30a9 100644
--- a/services/core/java/com/android/server/biometrics/Utils.java
+++ b/services/core/java/com/android/server/biometrics/Utils.java
@@ -89,11 +89,23 @@
         return true;
     }
 
-    /** If virtualized biometrics are supported (requires debug build). */
-    public static boolean isVirtualEnabled(@NonNull Context context) {
+    /** If virtualized fingerprint sensor is supported. */
+    public static boolean isFingerprintVirtualEnabled(@NonNull Context context) {
         return Build.isDebuggable()
-                && Settings.Secure.getIntForUser(context.getContentResolver(),
-                Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1;
+                && (Settings.Secure.getIntForUser(context.getContentResolver(),
+                Settings.Secure.BIOMETRIC_FINGERPRINT_VIRTUAL_ENABLED, 0,
+                UserHandle.USER_CURRENT) == 1
+                || Settings.Secure.getIntForUser(context.getContentResolver(),
+                Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1);
+    }
+
+    /** If virtualized face sensor is supported. */
+    public static boolean isFaceVirtualEnabled(@NonNull Context context) {
+        return Build.isDebuggable()
+                && (Settings.Secure.getIntForUser(context.getContentResolver(),
+                Settings.Secure.BIOMETRIC_FACE_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1
+                || Settings.Secure.getIntForUser(context.getContentResolver(),
+                Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1);
     }
 
     /**
diff --git a/services/core/java/com/android/server/biometrics/biometrics.aconfig b/services/core/java/com/android/server/biometrics/biometrics.aconfig
index b12d831..7a9491e 100644
--- a/services/core/java/com/android/server/biometrics/biometrics.aconfig
+++ b/services/core/java/com/android/server/biometrics/biometrics.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.biometrics"
+container: "system"
 
 flag {
   name: "face_vhal_feature"
diff --git a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
index 62c21cf..4fa8741 100644
--- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java
@@ -30,7 +30,7 @@
 import android.hardware.biometrics.BiometricRequestConstants;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.security.KeyStore;
+import android.security.KeyStoreAuthorization;
 import android.util.EventLog;
 import android.util.Slog;
 
@@ -255,7 +255,7 @@
 
             // For BP, BiometricService will add the authToken to Keystore.
             if (!isBiometricPrompt() && mIsStrongBiometric) {
-                final int result = KeyStore.getInstance().addAuthToken(byteToken);
+                final int result = KeyStoreAuthorization.getInstance().addAuthToken(byteToken);
                 if (result != 0) {
                     Slog.d(TAG, "Error adding auth token : " + result);
                 } else {
diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricSchedulerOperation.java b/services/core/java/com/android/server/biometrics/sensors/BiometricSchedulerOperation.java
index 0c3dfa7..eb78fe6 100644
--- a/services/core/java/com/android/server/biometrics/sensors/BiometricSchedulerOperation.java
+++ b/services/core/java/com/android/server/biometrics/sensors/BiometricSchedulerOperation.java
@@ -23,6 +23,7 @@
 import android.os.Build;
 import android.os.Handler;
 import android.os.IBinder;
+import android.os.RemoteException;
 import android.util.Slog;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -135,6 +136,14 @@
         mCancelWatchdog = () -> {
             if (!isFinished()) {
                 Slog.e(TAG, "[Watchdog Triggered]: " + this);
+                try {
+                    mClientMonitor.getListener().onError(mClientMonitor.getSensorId(),
+                            mClientMonitor.getCookie(), BiometricConstants.BIOMETRIC_ERROR_CANCELED,
+                            0 /* vendorCode */);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "Remote exception when trying to send error in cancel "
+                            + "watchdog.");
+                }
                 getWrappedCallback(mOnStartCallback)
                         .onClientFinished(mClientMonitor, false /* success */);
             }
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
index 7ee2a7a..a946af8 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java
@@ -729,8 +729,8 @@
         private List<ServiceProvider> getProviders(
                 FaceSensorConfigurations faceSensorConfigurations) {
             final List<ServiceProvider> providers = new ArrayList<>();
-            final Pair<String, SensorProps[]> filteredSensorProps =
-                    filterAvailableHalInstances(faceSensorConfigurations);
+            final Pair<String, SensorProps[]> filteredSensorProps = filterAvailableHalInstances(
+                            faceSensorConfigurations);
             providers.add(mFaceProviderFunction.getFaceProvider(filteredSensorProps,
                     faceSensorConfigurations.getResetLockoutRequiresChallenge()));
             return providers;
@@ -739,28 +739,36 @@
         @NonNull
         private Pair<String, SensorProps[]> filterAvailableHalInstances(
                 FaceSensorConfigurations faceSensorConfigurations) {
-            Pair<String, SensorProps[]> finalSensorPair = faceSensorConfigurations.getSensorPair();
+            String finalSensorInstance = faceSensorConfigurations.getSensorInstance();
 
             if (faceSensorConfigurations.isSingleSensorConfigurationPresent()) {
-                return finalSensorPair;
+                return new Pair<>(finalSensorInstance,
+                        faceSensorConfigurations.getSensorPropForInstance(finalSensorInstance));
             }
-
-            final Pair<String, SensorProps[]> virtualSensorProps = faceSensorConfigurations
-                    .getSensorPairForInstance("virtual");
-
-            if (Utils.isVirtualEnabled(getContext())) {
-                if (virtualSensorProps != null) {
-                    return virtualSensorProps;
+            final String virtualInstance = "virtual";
+            final boolean isVirtualHalPresent =
+                    faceSensorConfigurations.doesInstanceExist(virtualInstance);
+            if (Flags.faceVhalFeature() && Utils.isFaceVirtualEnabled(getContext())) {
+                if (isVirtualHalPresent) {
+                    return new Pair<>(virtualInstance,
+                            faceSensorConfigurations.getSensorPropForInstance(virtualInstance));
                 } else {
                     Slog.e(TAG, "Could not find virtual interface while it is enabled");
-                    return finalSensorPair;
+                    return new Pair<>(finalSensorInstance,
+                            faceSensorConfigurations.getSensorPropForInstance(finalSensorInstance));
                 }
             } else {
-                if (virtualSensorProps != null) {
-                    return faceSensorConfigurations.getSensorPairNotForInstance("virtual");
+                if (isVirtualHalPresent) {
+                    final String notAVirtualInstance =
+                            faceSensorConfigurations.getSensorNameNotForInstance(virtualInstance);
+                    if (notAVirtualInstance != null) {
+                        return new Pair<>(notAVirtualInstance, faceSensorConfigurations
+                                .getSensorPropForInstance(notAVirtualInstance));
+                    }
                 }
             }
-            return finalSensorPair;
+            return new Pair<>(finalSensorInstance, faceSensorConfigurations
+                    .getSensorPropForInstance(finalSensorInstance));
         }
 
         private Pair<List<FaceSensorPropertiesInternal>, List<String>>
@@ -778,7 +786,7 @@
             }
 
             final int virtualAt = aidlInstances.indexOf("virtual");
-            if (Flags.faceVhalFeature() && Utils.isVirtualEnabled(getContext())) {
+            if (Flags.faceVhalFeature() && Utils.isFaceVirtualEnabled(getContext())) {
                 if (virtualAt != -1) {
                     //only virtual instance should be returned
                     Slog.i(TAG, "virtual hal is used");
@@ -920,7 +928,7 @@
 
     void syncEnrollmentsNow() {
         Utils.checkPermissionOrShell(getContext(), MANAGE_FACE);
-        if (Flags.faceVhalFeature() && Utils.isVirtualEnabled(getContext())) {
+        if (Flags.faceVhalFeature() && Utils.isFaceVirtualEnabled(getContext())) {
             Slog.i(TAG, "Sync virtual enrollments");
             final int userId = ActivityManager.getCurrentUser();
             for (ServiceProvider provider : mRegistry.getProviders()) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
index 1ba1213..d762914 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
@@ -1128,27 +1128,36 @@
     @NonNull
     private Pair<String, SensorProps[]> filterAvailableHalInstances(
             FingerprintSensorConfigurations fingerprintSensorConfigurations) {
-        Pair<String, SensorProps[]> finalSensorPair =
-                fingerprintSensorConfigurations.getSensorPair();
+        final String finalSensorInstance = fingerprintSensorConfigurations.getSensorInstance();
         if (fingerprintSensorConfigurations.isSingleSensorConfigurationPresent()) {
-            return finalSensorPair;
+            return new Pair<>(finalSensorInstance,
+                    fingerprintSensorConfigurations.getSensorPropForInstance(finalSensorInstance));
         }
-
-        final Pair<String, SensorProps[]> virtualSensorPropsPair = fingerprintSensorConfigurations
-                .getSensorPairForInstance("virtual");
-        if (Utils.isVirtualEnabled(getContext())) {
-            if (virtualSensorPropsPair != null) {
-                return virtualSensorPropsPair;
+        final String virtualInstance = "virtual";
+        final boolean isVirtualHalPresent =
+                fingerprintSensorConfigurations.doesInstanceExist(virtualInstance);
+        if (Utils.isFingerprintVirtualEnabled(getContext())) {
+            if (isVirtualHalPresent) {
+                return new Pair<>(virtualInstance,
+                        fingerprintSensorConfigurations.getSensorPropForInstance(virtualInstance));
             } else {
                 Slog.e(TAG, "Could not find virtual interface while it is enabled");
-                return finalSensorPair;
+                return new Pair<>(finalSensorInstance,
+                        fingerprintSensorConfigurations.getSensorPropForInstance(
+                                finalSensorInstance));
             }
         } else {
-            if (virtualSensorPropsPair != null) {
-                return fingerprintSensorConfigurations.getSensorPairNotForInstance("virtual");
+            if (isVirtualHalPresent) {
+                final String notAVirtualInstance = fingerprintSensorConfigurations
+                        .getSensorNameNotForInstance(virtualInstance);
+                if (notAVirtualInstance != null) {
+                    return new Pair<>(notAVirtualInstance, fingerprintSensorConfigurations
+                            .getSensorPropForInstance(notAVirtualInstance));
+                }
             }
         }
-        return finalSensorPair;
+        return new Pair<>(finalSensorInstance, fingerprintSensorConfigurations
+                .getSensorPropForInstance(finalSensorInstance));
     }
 
     private Pair<List<FingerprintSensorPropertiesInternal>, List<String>>
@@ -1160,7 +1169,7 @@
         }
 
         final int virtualAt = aidlInstances.indexOf("virtual");
-        if (Utils.isVirtualEnabled(getContext())) {
+        if (Utils.isFingerprintVirtualEnabled(getContext())) {
             if (virtualAt != -1) {
                 //only virtual instance should be returned
                 Slog.i(TAG, "virtual hal is used");
@@ -1286,7 +1295,7 @@
 
     void syncEnrollmentsNow() {
         Utils.checkPermissionOrShell(getContext(), MANAGE_FINGERPRINT);
-        if (Utils.isVirtualEnabled(getContext())) {
+        if (Utils.isFingerprintVirtualEnabled(getContext())) {
             Slog.i(TAG, "Sync virtual enrollments");
             final int userId = ActivityManager.getCurrentUser();
             final CountDownLatch latch = new CountDownLatch(mRegistry.getProviders().size());
@@ -1315,7 +1324,7 @@
     }
 
     void simulateVhalFingerDown() {
-        if (Utils.isVirtualEnabled(getContext())) {
+        if (Utils.isFingerprintVirtualEnabled(getContext())) {
             Slog.i(TAG, "Simulate virtual HAL finger down event");
             final Pair<Integer, ServiceProvider> provider = mRegistry.getSingleProvider();
             if (provider != null) {
diff --git a/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java b/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java
index 3ede0a2..028b9b0 100644
--- a/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java
+++ b/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java
@@ -26,7 +26,7 @@
 
 import java.util.ArrayList;
 
-public class BroadcastRadioService extends SystemService {
+public final class BroadcastRadioService extends SystemService {
     private final IRadioService mServiceImpl;
 
     public BroadcastRadioService(Context context) {
diff --git a/services/core/java/com/android/server/broadcastradio/IRadioServiceAidlImpl.java b/services/core/java/com/android/server/broadcastradio/IRadioServiceAidlImpl.java
index 42b2682..16514fa 100644
--- a/services/core/java/com/android/server/broadcastradio/IRadioServiceAidlImpl.java
+++ b/services/core/java/com/android/server/broadcastradio/IRadioServiceAidlImpl.java
@@ -52,7 +52,7 @@
     private static final List<String> SERVICE_NAMES = Arrays.asList(
             IBroadcastRadio.DESCRIPTOR + "/amfm", IBroadcastRadio.DESCRIPTOR + "/dab");
 
-    private final BroadcastRadioServiceImpl mHalAidl;
+    private final BroadcastRadioServiceImpl mAidlHalClient;
     private final BroadcastRadioService mService;
 
     /**
@@ -77,14 +77,14 @@
     @VisibleForTesting
     IRadioServiceAidlImpl(BroadcastRadioService service, BroadcastRadioServiceImpl halAidl) {
         mService = Objects.requireNonNull(service, "Broadcast radio service cannot be null");
-        mHalAidl = Objects.requireNonNull(halAidl,
+        mAidlHalClient = Objects.requireNonNull(halAidl,
                 "Broadcast radio service implementation for AIDL HAL cannot be null");
     }
 
     @Override
     public List<RadioManager.ModuleProperties> listModules() {
         mService.enforcePolicyAccess();
-        return mHalAidl.listModules();
+        return mAidlHalClient.listModules();
     }
 
     @Override
@@ -97,7 +97,7 @@
         if (callback == null) {
             throw new IllegalArgumentException("Callback must not be null");
         }
-        return mHalAidl.openSession(moduleId, bandConfig, withAudio, callback);
+        return mAidlHalClient.openSession(moduleId, bandConfig, withAudio, callback);
     }
 
     @Override
@@ -110,7 +110,7 @@
         Objects.requireNonNull(listener, "Announcement listener cannot be null");
         mService.enforcePolicyAccess();
 
-        return mHalAidl.addAnnouncementListener(enabledTypes, listener);
+        return mAidlHalClient.addAnnouncementListener(enabledTypes, listener);
     }
 
     @Override
@@ -126,10 +126,10 @@
         radioPrintWriter.printf("BroadcastRadioService\n");
 
         radioPrintWriter.increaseIndent();
-        radioPrintWriter.printf("AIDL HAL:\n");
+        radioPrintWriter.printf("AIDL HAL client:\n");
 
         radioPrintWriter.increaseIndent();
-        mHalAidl.dumpInfo(radioPrintWriter);
+        mAidlHalClient.dumpInfo(radioPrintWriter);
         radioPrintWriter.decreaseIndent();
 
         radioPrintWriter.decreaseIndent();
diff --git a/services/core/java/com/android/server/broadcastradio/IRadioServiceHidlImpl.java b/services/core/java/com/android/server/broadcastradio/IRadioServiceHidlImpl.java
index bc72a4b..ab08342 100644
--- a/services/core/java/com/android/server/broadcastradio/IRadioServiceHidlImpl.java
+++ b/services/core/java/com/android/server/broadcastradio/IRadioServiceHidlImpl.java
@@ -49,8 +49,8 @@
 final class IRadioServiceHidlImpl extends IRadioService.Stub {
     private static final String TAG = "BcRadioSrvHidl";
 
-    private final com.android.server.broadcastradio.hal1.BroadcastRadioService mHal1;
-    private final com.android.server.broadcastradio.hal2.BroadcastRadioService mHal2;
+    private final com.android.server.broadcastradio.hal1.BroadcastRadioService mHal1Client;
+    private final com.android.server.broadcastradio.hal2.BroadcastRadioService mHal2Client;
 
     private final Object mLock = new Object();
 
@@ -61,10 +61,10 @@
 
     IRadioServiceHidlImpl(BroadcastRadioService service) {
         mService = Objects.requireNonNull(service, "broadcast radio service cannot be null");
-        mHal1 = new com.android.server.broadcastradio.hal1.BroadcastRadioService();
-        mV1Modules = mHal1.loadModules();
+        mHal1Client = new com.android.server.broadcastradio.hal1.BroadcastRadioService();
+        mV1Modules = mHal1Client.loadModules();
         OptionalInt max = mV1Modules.stream().mapToInt(RadioManager.ModuleProperties::getId).max();
-        mHal2 = new com.android.server.broadcastradio.hal2.BroadcastRadioService(
+        mHal2Client = new com.android.server.broadcastradio.hal2.BroadcastRadioService(
                 max.isPresent() ? max.getAsInt() + 1 : 0);
     }
 
@@ -73,17 +73,17 @@
             com.android.server.broadcastradio.hal1.BroadcastRadioService hal1,
             com.android.server.broadcastradio.hal2.BroadcastRadioService hal2) {
         mService = Objects.requireNonNull(service, "Broadcast radio service cannot be null");
-        mHal1 = Objects.requireNonNull(hal1,
+        mHal1Client = Objects.requireNonNull(hal1,
                 "Broadcast radio service implementation for HIDL 1 HAL cannot be null");
-        mV1Modules = mHal1.loadModules();
-        mHal2 = Objects.requireNonNull(hal2,
+        mV1Modules = mHal1Client.loadModules();
+        mHal2Client = Objects.requireNonNull(hal2,
                 "Broadcast radio service implementation for HIDL 2 HAL cannot be null");
     }
 
     @Override
     public List<RadioManager.ModuleProperties> listModules() {
         mService.enforcePolicyAccess();
-        Collection<RadioManager.ModuleProperties> v2Modules = mHal2.listModules();
+        Collection<RadioManager.ModuleProperties> v2Modules = mHal2Client.listModules();
         List<RadioManager.ModuleProperties> modules;
         synchronized (mLock) {
             modules = new ArrayList<>(mV1Modules.size() + v2Modules.size());
@@ -102,10 +102,10 @@
         mService.enforcePolicyAccess();
         Objects.requireNonNull(callback, "Callback must not be null");
         synchronized (mLock) {
-            if (mHal2.hasModule(moduleId)) {
-                return mHal2.openSession(moduleId, bandConfig, withAudio, callback);
+            if (mHal2Client.hasModule(moduleId)) {
+                return mHal2Client.openSession(moduleId, bandConfig, withAudio, callback);
             } else {
-                return mHal1.openTuner(moduleId, bandConfig, withAudio, callback);
+                return mHal1Client.openTuner(moduleId, bandConfig, withAudio, callback);
             }
         }
     }
@@ -121,12 +121,12 @@
         mService.enforcePolicyAccess();
 
         synchronized (mLock) {
-            if (!mHal2.hasAnyModules()) {
+            if (!mHal2Client.hasAnyModules()) {
                 Slog.w(TAG, "There are no HAL 2.0 modules registered");
                 return new AnnouncementAggregator(listener, mLock);
             }
 
-            return mHal2.addAnnouncementListener(enabledTypes, listener);
+            return mHal2Client.addAnnouncementListener(enabledTypes, listener);
         }
     }
 
@@ -143,18 +143,18 @@
         radioPw.printf("BroadcastRadioService\n");
 
         radioPw.increaseIndent();
-        radioPw.printf("HAL1: %s\n", mHal1);
+        radioPw.printf("HAL1 client: %s\n", mHal1Client);
 
         radioPw.increaseIndent();
         synchronized (mLock) {
-            radioPw.printf("Modules of HAL1: %s\n", mV1Modules);
+            radioPw.printf("Modules of HAL1 client: %s\n", mV1Modules);
         }
         radioPw.decreaseIndent();
 
-        radioPw.printf("HAL2:\n");
+        radioPw.printf("HAL2 client:\n");
 
         radioPw.increaseIndent();
-        mHal2.dumpInfo(radioPw);
+        mHal2Client.dumpInfo(radioPw);
         radioPw.decreaseIndent();
 
         radioPw.decreaseIndent();
diff --git a/services/core/java/com/android/server/broadcastradio/RadioServiceUserController.java b/services/core/java/com/android/server/broadcastradio/RadioServiceUserController.java
index 4b847a2..c705ebe 100644
--- a/services/core/java/com/android/server/broadcastradio/RadioServiceUserController.java
+++ b/services/core/java/com/android/server/broadcastradio/RadioServiceUserController.java
@@ -48,8 +48,8 @@
      * @return foreground user id.
      */
     public static int getCurrentUser() {
-        final long identity = Binder.clearCallingIdentity();
         int userId = UserHandle.USER_NULL;
+        final long identity = Binder.clearCallingIdentity();
         try {
             userId = ActivityManager.getCurrentUser();
         } catch (RuntimeException e) {
diff --git a/services/core/java/com/android/server/broadcastradio/hal1/Convert.java b/services/core/java/com/android/server/broadcastradio/hal1/Convert.java
index 219ee4c..08ff662 100644
--- a/services/core/java/com/android/server/broadcastradio/hal1/Convert.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/Convert.java
@@ -18,12 +18,13 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.util.Slog;
+
+import com.android.server.utils.Slogf;
 
 import java.util.Map;
 import java.util.Set;
 
-class Convert {
+final class Convert {
 
     private static final String TAG = "BcRadio1Srv.Convert";
 
@@ -34,12 +35,12 @@
      * side, which requires several separate java calls for each element.
      *
      * @param map map to convert.
-     * @returns array (sized the same as map) of two-element string arrays
-     *          (first element is the key, second is value).
+     * @return array (sized the same as map) of two-element string arrays
+     *         (first element is the key, second is value).
      */
     static @NonNull String[][] stringMapToNative(@Nullable Map<String, String> map) {
         if (map == null) {
-            Slog.v(TAG, "map is null, returning zero-elements array");
+            Slogf.v(TAG, "map is null, returning zero-elements array");
             return new String[0][0];
         }
 
@@ -54,7 +55,7 @@
             i++;
         }
 
-        Slog.v(TAG, "converted " + i + " element(s)");
+        Slogf.v(TAG, "converted " + i + " element(s)");
         return arr;
     }
 }
diff --git a/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java b/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
index 8e5f6b5..7cac409 100644
--- a/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
@@ -26,7 +26,6 @@
 import android.hardware.radio.RadioManager;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.util.Slog;
 
 import com.android.server.broadcastradio.RadioServiceUserController;
 import com.android.server.utils.Slogf;
@@ -44,9 +43,9 @@
     private final long mNativeContext;
 
     private final Object mLock = new Object();
-    @NonNull private final TunerCallback mTunerCallback;
-    @NonNull private final ITunerCallback mClientCallback;
-    @NonNull private final IBinder.DeathRecipient mDeathRecipient;
+    private final TunerCallback mTunerCallback;
+    private final ITunerCallback mClientCallback;
+    private final IBinder.DeathRecipient mDeathRecipient;
 
     private boolean mIsClosed = false;
     private boolean mIsMuted = false;
@@ -122,7 +121,7 @@
 
     private boolean checkConfiguredLocked() {
         if (mTunerCallback.isInitialConfigurationDone()) return true;
-        Slog.w(TAG, "Initial configuration is still pending, skipping the operation");
+        Slogf.w(TAG, "Initial configuration is still pending, skipping the operation");
         return false;
     }
 
@@ -159,14 +158,14 @@
             checkNotClosedLocked();
             if (mIsMuted == mute) return;
             mIsMuted = mute;
-            Slog.w(TAG, "Mute via RadioService is not implemented - please handle it via app");
+            Slogf.w(TAG, "Mute via RadioService is not implemented - please handle it via app");
         }
     }
 
     @Override
     public boolean isMuted() {
         if (!mWithAudio) {
-            Slog.w(TAG, "Tuner did not request audio, pretending it was muted");
+            Slogf.w(TAG, "Tuner did not request audio, pretending it was muted");
             return true;
         }
         synchronized (mLock) {
@@ -210,7 +209,7 @@
         if (selector == null) {
             throw new IllegalArgumentException("The argument must not be a null pointer");
         }
-        Slog.i(TAG, "Tuning to " + selector);
+        Slogf.i(TAG, "Tuning to " + selector);
         synchronized (mLock) {
             checkNotClosedLocked();
             if (!checkConfiguredLocked()) return;
diff --git a/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
index aa43b75..e013643 100644
--- a/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
@@ -25,7 +25,8 @@
 import android.hardware.radio.RadioTuner;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.util.Slog;
+
+import com.android.server.utils.Slogf;
 
 import java.util.List;
 import java.util.Map;
@@ -42,8 +43,8 @@
      */
     private final long mNativeContext;
 
-    @NonNull private final Tuner mTuner;
-    @NonNull private final ITunerCallback mClientCallback;
+    private final Tuner mTuner;
+    private final ITunerCallback mClientCallback;
 
     private final AtomicReference<ProgramList.Filter> mProgramListFilter = new AtomicReference<>();
     private boolean mInitialConfigurationDone = false;
@@ -76,7 +77,7 @@
         try {
             func.run();
         } catch (RemoteException e) {
-            Slog.e(TAG, "client died", e);
+            Slogf.e(TAG, "client died", e);
         }
     }
 
@@ -107,7 +108,7 @@
 
     @Override
     public void onTuneFailed(int result, ProgramSelector selector) {
-        Slog.e(TAG, "Not applicable for HAL 1.x");
+        Slogf.e(TAG, "Not applicable for HAL 1.x");
     }
 
     @Override
@@ -160,7 +161,7 @@
         try {
             modified = mTuner.getProgramList(filter.getVendorFilter());
         } catch (IllegalStateException ex) {
-            Slog.d(TAG, "Program list not ready yet");
+            Slogf.d(TAG, "Program list not ready yet");
             return;
         }
         Set<RadioManager.ProgramInfo> modifiedSet = modified.stream().collect(Collectors.toSet());
@@ -175,12 +176,12 @@
 
     @Override
     public void onConfigFlagUpdated(int flag, boolean value) {
-        Slog.w(TAG, "Not applicable for HAL 1.x");
+        Slogf.w(TAG, "Not applicable for HAL 1.x");
     }
 
     @Override
     public void onParametersUpdated(Map<String, String> parameters) {
-        Slog.w(TAG, "Not applicable for HAL 1.x");
+        Slogf.w(TAG, "Not applicable for HAL 1.x");
     }
 
     @Override
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/AnnouncementAggregator.java b/services/core/java/com/android/server/broadcastradio/hal2/AnnouncementAggregator.java
index 85c13ae..0327ee7 100644
--- a/services/core/java/com/android/server/broadcastradio/hal2/AnnouncementAggregator.java
+++ b/services/core/java/com/android/server/broadcastradio/hal2/AnnouncementAggregator.java
@@ -23,20 +23,20 @@
 import android.hardware.radio.ICloseHandle;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
+import com.android.server.utils.Slogf;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Objects;
 
-public class AnnouncementAggregator extends ICloseHandle.Stub {
+public final class AnnouncementAggregator extends ICloseHandle.Stub {
     private static final String TAG = "BcRadio2Srv.AnnAggr";
 
     private final Object mLock;
-    @NonNull private final IAnnouncementListener mListener;
+    private final IAnnouncementListener mListener;
     private final IBinder.DeathRecipient mDeathRecipient = new DeathRecipient();
 
     @GuardedBy("mLock")
@@ -77,14 +77,16 @@
         public void binderDied() {
             try {
                 close();
-            } catch (RemoteException ex) {}
+            } catch (RemoteException ex) {
+                Slogf.e(TAG, ex, "Cannot close Announcement aggregator for DeathRecipient");
+            }
         }
     }
 
     private void onListUpdated() {
         synchronized (mLock) {
             if (mIsClosed) {
-                Slog.e(TAG, "Announcement aggregator is closed, it shouldn't receive callbacks");
+                Slogf.e(TAG, "Announcement aggregator is closed, it shouldn't receive callbacks");
                 return;
             }
             List<Announcement> combined = new ArrayList<>();
@@ -94,7 +96,7 @@
             try {
                 mListener.onListUpdated(combined);
             } catch (RemoteException ex) {
-                Slog.e(TAG, "mListener.onListUpdated() failed: ", ex);
+                Slogf.e(TAG, "mListener.onListUpdated() failed: ", ex);
             }
         }
     }
@@ -111,7 +113,7 @@
             try {
                 closeHandle = module.addAnnouncementListener(enabledTypes, watcher);
             } catch (RemoteException ex) {
-                Slog.e(TAG, "Failed to add announcement listener", ex);
+                Slogf.e(TAG, "Failed to add announcement listener", ex);
                 return;
             }
             watcher.setCloseHandle(closeHandle);
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/BroadcastRadioService.java b/services/core/java/com/android/server/broadcastradio/hal2/BroadcastRadioService.java
index 1e31f20..3198842 100644
--- a/services/core/java/com/android/server/broadcastradio/hal2/BroadcastRadioService.java
+++ b/services/core/java/com/android/server/broadcastradio/hal2/BroadcastRadioService.java
@@ -29,8 +29,8 @@
 import android.hidl.manager.V1_0.IServiceNotification;
 import android.os.IHwBinder.DeathRecipient;
 import android.os.RemoteException;
+import android.util.ArrayMap;
 import android.util.IndentingPrintWriter;
-import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
@@ -38,7 +38,6 @@
 import com.android.server.utils.Slogf;
 
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -55,16 +54,17 @@
     private int mNextModuleId;
 
     @GuardedBy("mLock")
-    private final Map<String, Integer> mServiceNameToModuleIdMap = new HashMap<>();
+    private final Map<String, Integer> mServiceNameToModuleIdMap = new ArrayMap<>();
 
     // Map from module ID to RadioModule created by mServiceListener.onRegistration().
     @GuardedBy("mLock")
-    private final Map<Integer, RadioModule> mModules = new HashMap<>();
+    private final Map<Integer, RadioModule> mModules = new ArrayMap<>();
 
-    private IServiceNotification.Stub mServiceListener = new IServiceNotification.Stub() {
+    private final IServiceNotification.Stub mServiceListener = new IServiceNotification.Stub() {
         @Override
         public void onRegistration(String fqName, String serviceName, boolean preexisting) {
-            Slog.v(TAG, "onRegistration(" + fqName + ", " + serviceName + ", " + preexisting + ")");
+            Slogf.v(TAG, "onRegistration(" + fqName + ", " + serviceName + ", " + preexisting
+                    + ")");
             Integer moduleId;
             synchronized (mLock) {
                 // If the service has been registered before, reuse its previous module ID.
@@ -75,13 +75,13 @@
                     moduleId = mNextModuleId;
                 }
 
-                RadioModule module = RadioModule.tryLoadingModule(moduleId, serviceName);
-                if (module == null) {
+                RadioModule radioModule = RadioModule.tryLoadingModule(moduleId, serviceName);
+                if (radioModule == null) {
                     return;
                 }
-                Slog.v(TAG, "loaded broadcast radio module " + moduleId + ": " + serviceName
+                Slogf.v(TAG, "loaded broadcast radio module " + moduleId + ": " + serviceName
                         + " (HAL 2.0)");
-                RadioModule prevModule = mModules.put(moduleId, module);
+                RadioModule prevModule = mModules.put(moduleId, radioModule);
                 if (prevModule != null) {
                     prevModule.closeSessions(RadioTuner.ERROR_HARDWARE_FAILURE);
                 }
@@ -92,7 +92,7 @@
                 }
 
                 try {
-                    module.getService().linkToDeath(mDeathRecipient, moduleId);
+                    radioModule.getService().linkToDeath(mDeathRecipient, moduleId);
                 } catch (RemoteException ex) {
                     // Service has already died, so remove its entry from mModules.
                     mModules.remove(moduleId);
@@ -101,10 +101,10 @@
         }
     };
 
-    private DeathRecipient mDeathRecipient = new DeathRecipient() {
+    private final DeathRecipient mDeathRecipient = new DeathRecipient() {
         @Override
         public void serviceDied(long cookie) {
-            Slog.v(TAG, "serviceDied(" + cookie + ")");
+            Slogf.v(TAG, "serviceDied(" + cookie + ")");
             synchronized (mLock) {
                 int moduleId = (int) cookie;
                 RadioModule prevModule = mModules.remove(moduleId);
@@ -114,7 +114,7 @@
 
                 for (Map.Entry<String, Integer> entry : mServiceNameToModuleIdMap.entrySet()) {
                     if (entry.getValue() == moduleId) {
-                        Slog.i(TAG, "service " + entry.getKey()
+                        Slogf.i(TAG, "service " + entry.getKey()
                                 + " died; removed RadioModule with ID " + moduleId);
                         return;
                     }
@@ -128,12 +128,12 @@
         try {
             IServiceManager manager = IServiceManager.getService();
             if (manager == null) {
-                Slog.e(TAG, "failed to get HIDL Service Manager");
+                Slogf.e(TAG, "failed to get HIDL Service Manager");
                 return;
             }
             manager.registerForNotifications(IBroadcastRadio.kInterfaceName, "", mServiceListener);
         } catch (RemoteException ex) {
-            Slog.e(TAG, "failed to register for service notifications: ", ex);
+            Slogf.e(TAG, "failed to register for service notifications: ", ex);
         }
     }
 
@@ -144,12 +144,12 @@
         try {
             manager.registerForNotifications(IBroadcastRadio.kInterfaceName, "", mServiceListener);
         } catch (RemoteException ex) {
-            Slog.e(TAG, "Failed to register for service notifications: ", ex);
+            Slogf.e(TAG, "Failed to register for service notifications: ", ex);
         }
     }
 
     public @NonNull Collection<RadioManager.ModuleProperties> listModules() {
-        Slog.v(TAG, "List HIDL 2.0 modules");
+        Slogf.v(TAG, "List HIDL 2.0 modules");
         synchronized (mLock) {
             return mModules.values().stream().map(module -> module.getProperties())
                     .collect(Collectors.toList());
@@ -170,7 +170,7 @@
 
     public ITuner openSession(int moduleId, @Nullable RadioManager.BandConfig legacyConfig,
             boolean withAudio, @NonNull ITunerCallback callback) throws RemoteException {
-        Slog.v(TAG, "Open HIDL 2.0 session with module id " + moduleId);
+        Slogf.v(TAG, "Open HIDL 2.0 session with module id " + moduleId);
         if (!RadioServiceUserController.isCurrentOrSystemUser()) {
             Slogf.e(TAG, "Cannot open tuner on HAL 2.0 client for non-current user");
             throw new IllegalStateException("Cannot open session for non-current user");
@@ -198,7 +198,7 @@
 
     public ICloseHandle addAnnouncementListener(@NonNull int[] enabledTypes,
             @NonNull IAnnouncementListener listener) {
-        Slog.v(TAG, "Add announcementListener");
+        Slogf.v(TAG, "Add announcementListener");
         AnnouncementAggregator aggregator = new AnnouncementAggregator(listener, mLock);
         boolean anySupported = false;
         synchronized (mLock) {
@@ -207,12 +207,12 @@
                     aggregator.watchModule(module, enabledTypes);
                     anySupported = true;
                 } catch (UnsupportedOperationException ex) {
-                    Slog.v(TAG, "Announcements not supported for this module", ex);
+                    Slogf.v(TAG, "Announcements not supported for this module", ex);
                 }
             }
         }
         if (!anySupported) {
-            Slog.i(TAG, "There are no HAL modules that support announcements");
+            Slogf.i(TAG, "There are no HAL modules that support announcements");
         }
         return aggregator;
     }
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/Convert.java b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java
index fb1138f..34bfa6c 100644
--- a/services/core/java/com/android/server/broadcastradio/hal2/Convert.java
+++ b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java
@@ -37,21 +37,22 @@
 import android.hardware.radio.RadioMetadata;
 import android.hardware.radio.RadioTuner;
 import android.os.ParcelableException;
-import android.util.Slog;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.SparseArray;
+
+import com.android.server.utils.Slogf;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
-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.stream.Collectors;
 
-class Convert {
+final class Convert {
 
     private static final String TAG = "BcRadio2Srv.convert";
 
@@ -111,7 +112,7 @@
             elem.key = entry.getKey();
             elem.value = entry.getValue();
             if (elem.key == null || elem.value == null) {
-                Slog.w(TAG, "VendorKeyValue contains null pointers");
+                Slogf.w(TAG, "VendorKeyValue contains null pointers");
                 continue;
             }
             list.add(elem);
@@ -120,20 +121,21 @@
         return list;
     }
 
-    static @NonNull Map<String, String>
-    vendorInfoFromHal(@Nullable List<VendorKeyValue> info) {
-        if (info == null) return Collections.emptyMap();
-
-        Map<String, String> map = new HashMap<>();
-        for (VendorKeyValue kvp : info) {
-            if (kvp.key == null || kvp.value == null) {
-                Slog.w(TAG, "VendorKeyValue contains null pointers");
-                continue;
-            }
-            map.put(kvp.key, kvp.value);
+    static @NonNull Map<String, String> vendorInfoFromHal(@Nullable List<VendorKeyValue> info) {
+        Map<String, String> vendorInfoMap = new ArrayMap<>();
+        if (info == null) {
+            return vendorInfoMap;
         }
 
-        return map;
+        for (VendorKeyValue kvp : info) {
+            if (kvp.key == null || kvp.value == null) {
+                Slogf.w(TAG, "VendorKeyValue contains null pointers");
+                continue;
+            }
+            vendorInfoMap.put(kvp.key, kvp.value);
+        }
+
+        return vendorInfoMap;
     }
 
     private static @ProgramSelector.ProgramType int identifierTypeToProgramType(
@@ -168,7 +170,7 @@
 
     private static @NonNull int[]
     identifierTypesToProgramTypes(@NonNull int[] idTypes) {
-        Set<Integer> pTypes = new HashSet<>();
+        Set<Integer> pTypes = new ArraySet<>();
 
         for (int idType : idTypes) {
             int pType = identifierTypeToProgramType(idType);
@@ -202,7 +204,7 @@
         for (AmFmBandRange range : config.ranges) {
             FrequencyBand bandType = Utils.getBand(range.lowerBound);
             if (bandType == FrequencyBand.UNKNOWN) {
-                Slog.e(TAG, "Unknown frequency band at " + range.lowerBound + "kHz");
+                Slogf.e(TAG, "Unknown frequency band at " + range.lowerBound + "kHz");
                 continue;
             }
             if (bandType == FrequencyBand.FM) {
@@ -304,7 +306,7 @@
             @NonNull android.hardware.broadcastradio.V2_0.ProgramSelector sel) {
         if (sel.primaryId.type != 0) return false;
         if (sel.primaryId.value != 0) return false;
-        if (sel.secondaryIds.size() != 0) return false;
+        if (!sel.secondaryIds.isEmpty()) return false;
         return true;
     }
 
@@ -319,7 +321,7 @@
         return new ProgramSelector(
                 identifierTypeToProgramType(sel.primaryId.type),
                 Objects.requireNonNull(programIdentifierFromHal(sel.primaryId)),
-                secondaryIds, null);
+                secondaryIds, /* vendorIds= */ null);
     }
 
     private enum MetadataType {
@@ -335,40 +337,40 @@
         }
     }
 
-    private static final Map<Integer, MetadataDef> metadataKeys;
+    private static final SparseArray<MetadataDef> METADATA_KEYS;
     static {
-        metadataKeys = new HashMap<>();
-        metadataKeys.put(MetadataKey.RDS_PS, new MetadataDef(
+        METADATA_KEYS = new SparseArray<>();
+        METADATA_KEYS.put(MetadataKey.RDS_PS, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_RDS_PS));
-        metadataKeys.put(MetadataKey.RDS_PTY, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.RDS_PTY, new MetadataDef(
                 MetadataType.INT, RadioMetadata.METADATA_KEY_RDS_PTY));
-        metadataKeys.put(MetadataKey.RBDS_PTY, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.RBDS_PTY, new MetadataDef(
                 MetadataType.INT, RadioMetadata.METADATA_KEY_RBDS_PTY));
-        metadataKeys.put(MetadataKey.RDS_RT, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.RDS_RT, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_RDS_RT));
-        metadataKeys.put(MetadataKey.SONG_TITLE, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.SONG_TITLE, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_TITLE));
-        metadataKeys.put(MetadataKey.SONG_ARTIST, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.SONG_ARTIST, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_ARTIST));
-        metadataKeys.put(MetadataKey.SONG_ALBUM, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.SONG_ALBUM, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_ALBUM));
-        metadataKeys.put(MetadataKey.STATION_ICON, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.STATION_ICON, new MetadataDef(
                 MetadataType.INT, RadioMetadata.METADATA_KEY_ICON));
-        metadataKeys.put(MetadataKey.ALBUM_ART, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.ALBUM_ART, new MetadataDef(
                 MetadataType.INT, RadioMetadata.METADATA_KEY_ART));
-        metadataKeys.put(MetadataKey.PROGRAM_NAME, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.PROGRAM_NAME, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_PROGRAM_NAME));
-        metadataKeys.put(MetadataKey.DAB_ENSEMBLE_NAME, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.DAB_ENSEMBLE_NAME, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_ENSEMBLE_NAME));
-        metadataKeys.put(MetadataKey.DAB_ENSEMBLE_NAME_SHORT, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.DAB_ENSEMBLE_NAME_SHORT, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_ENSEMBLE_NAME_SHORT));
-        metadataKeys.put(MetadataKey.DAB_SERVICE_NAME, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.DAB_SERVICE_NAME, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_SERVICE_NAME));
-        metadataKeys.put(MetadataKey.DAB_SERVICE_NAME_SHORT, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.DAB_SERVICE_NAME_SHORT, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_SERVICE_NAME_SHORT));
-        metadataKeys.put(MetadataKey.DAB_COMPONENT_NAME, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.DAB_COMPONENT_NAME, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_COMPONENT_NAME));
-        metadataKeys.put(MetadataKey.DAB_COMPONENT_NAME_SHORT, new MetadataDef(
+        METADATA_KEYS.put(MetadataKey.DAB_COMPONENT_NAME_SHORT, new MetadataDef(
                 MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_COMPONENT_NAME_SHORT));
     }
 
@@ -376,9 +378,9 @@
         RadioMetadata.Builder builder = new RadioMetadata.Builder();
 
         for (Metadata entry : meta) {
-            MetadataDef keyDef = metadataKeys.get(entry.key);
+            MetadataDef keyDef = METADATA_KEYS.get(entry.key);
             if (keyDef == null) {
-                Slog.i(TAG, "Ignored unknown metadata entry: " + MetadataKey.toString(entry.key));
+                Slogf.i(TAG, "Ignored unknown metadata entry: " + MetadataKey.toString(entry.key));
                 continue;
             }
             if (keyDef.type == MetadataType.STRING) {
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/RadioEventLogger.java b/services/core/java/com/android/server/broadcastradio/hal2/RadioEventLogger.java
index 48112c4..b8d1228 100644
--- a/services/core/java/com/android/server/broadcastradio/hal2/RadioEventLogger.java
+++ b/services/core/java/com/android/server/broadcastradio/hal2/RadioEventLogger.java
@@ -19,7 +19,8 @@
 import android.util.IndentingPrintWriter;
 import android.util.LocalLog;
 import android.util.Log;
-import android.util.Slog;
+
+import com.android.server.utils.Slogf;
 
 final class RadioEventLogger {
     private final String mTag;
@@ -30,11 +31,12 @@
         mEventLogger = new LocalLog(loggerQueueSize);
     }
 
+    @SuppressWarnings("AnnotateFormatMethod")
     void logRadioEvent(String logFormat, Object... args) {
         String log = String.format(logFormat, args);
         mEventLogger.log(log);
         if (Log.isLoggable(mTag, Log.DEBUG)) {
-            Slog.d(mTag, log);
+            Slogf.d(mTag, log);
         }
     }
 
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java b/services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java
index a54af2e..0e11df8 100644
--- a/services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java
+++ b/services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java
@@ -39,16 +39,16 @@
 import android.os.Looper;
 import android.os.RemoteException;
 import android.os.UserHandle;
+import android.util.ArraySet;
 import android.util.IndentingPrintWriter;
 import android.util.MutableInt;
-import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.broadcastradio.RadioServiceUserController;
+import com.android.server.utils.Slogf;
 
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -59,12 +59,12 @@
     private static final String TAG = "BcRadio2Srv.module";
     private static final int RADIO_EVENT_LOGGER_QUEUE_SIZE = 25;
 
-    @NonNull private final IBroadcastRadio mService;
-    @NonNull private final RadioManager.ModuleProperties mProperties;
+    private final IBroadcastRadio mService;
+    private final RadioManager.ModuleProperties mProperties;
 
     private final Object mLock = new Object();
-    @NonNull private final Handler mHandler;
-    @NonNull private final RadioEventLogger mEventLogger;
+    private final Handler mHandler;
+    private final RadioEventLogger mEventLogger;
 
     @GuardedBy("mLock")
     private ITunerSession mHalTunerSession;
@@ -144,7 +144,7 @@
 
     // Collection of active AIDL tuner sessions created through openSession().
     @GuardedBy("mLock")
-    private final Set<TunerSession> mAidlTunerSessions = new HashSet<>();
+    private final Set<TunerSession> mAidlTunerSessions = new ArraySet<>();
 
     @VisibleForTesting
     RadioModule(@NonNull IBroadcastRadio service,
@@ -158,10 +158,10 @@
     @Nullable
     static RadioModule tryLoadingModule(int idx, @NonNull String fqName) {
         try {
-            Slog.i(TAG, "Try loading module for idx " + idx + ", fqName " + fqName);
+            Slogf.i(TAG, "Try loading module for idx " + idx + ", fqName " + fqName);
             IBroadcastRadio service = IBroadcastRadio.getService(fqName);
             if (service == null) {
-                Slog.w(TAG, "No service found for fqName " + fqName);
+                Slogf.w(TAG, "No service found for fqName " + fqName);
                 return null;
             }
 
@@ -180,7 +180,7 @@
 
             return new RadioModule(service, prop);
         } catch (RemoteException ex) {
-            Slog.e(TAG, "Failed to load module " + fqName, ex);
+            Slogf.e(TAG, "Failed to load module " + fqName, ex);
             return null;
         }
     }
@@ -256,8 +256,8 @@
             }
 
             if (idTypes == null) {
-                idTypes = new HashSet<>(filter.getIdentifierTypes());
-                ids = new HashSet<>(filter.getIdentifiers());
+                idTypes = new ArraySet<>(filter.getIdentifierTypes());
+                ids = new ArraySet<>(filter.getIdentifiers());
                 includeCategories = filter.areCategoriesIncluded();
                 excludeModifications = filter.areModificationsExcluded();
                 continue;
@@ -305,7 +305,7 @@
             try {
                 mHalTunerSession.stopProgramListUpdates();
             } catch (RemoteException ex) {
-                Slog.e(TAG, "mHalTunerSession.stopProgramListUpdates() failed: ", ex);
+                Slogf.e(TAG, "mHalTunerSession.stopProgramListUpdates() failed: ", ex);
             }
             return;
         }
@@ -327,7 +327,7 @@
                     newFilter));
             Convert.throwOnError("startProgramListUpdates", halResult);
         } catch (RemoteException ex) {
-            Slog.e(TAG, "mHalTunerSession.startProgramListUpdates() failed: ", ex);
+            Slogf.e(TAG, "mHalTunerSession.startProgramListUpdates() failed: ", ex);
         }
     }
 
@@ -348,7 +348,7 @@
             try {
                 mHalTunerSession.close();
             } catch (RemoteException ex) {
-                Slog.e(TAG, "mHalTunerSession.close() failed: ", ex);
+                Slogf.e(TAG, "mHalTunerSession.close() failed: ", ex);
             }
             mHalTunerSession = null;
         }
@@ -385,18 +385,17 @@
                 runnable.run(tunerSession.mCallback);
             } catch (DeadObjectException ex) {
                 // The other side died without calling close(), so just purge it from our records.
-                Slog.e(TAG, "Removing dead TunerSession");
+                Slogf.e(TAG, "Removing dead TunerSession");
                 if (deadSessions == null) {
                     deadSessions = new ArrayList<>();
                 }
                 deadSessions.add(tunerSession);
             } catch (RemoteException ex) {
-                Slog.e(TAG, "Failed to invoke ITunerCallback: ", ex);
+                Slogf.e(TAG, "Failed to invoke ITunerCallback: ", ex);
             }
         }
         if (deadSessions != null) {
-            onTunerSessionsClosedLocked(deadSessions.toArray(
-                    new TunerSession[deadSessions.size()]));
+            onTunerSessionsClosedLocked(deadSessions.toArray(new TunerSession[0]));
         }
     }
 
@@ -429,7 +428,7 @@
                 try {
                     hwCloseHandle.value.close();
                 } catch (RemoteException ex) {
-                    Slog.e(TAG, "Failed closing announcement listener", ex);
+                    Slogf.e(TAG, "Failed closing announcement listener", ex);
                 }
                 hwCloseHandle.value = null;
             }
@@ -447,7 +446,9 @@
             rawImage[i] = rawList.get(i);
         }
 
-        if (rawImage == null || rawImage.length == 0) return null;
+        if (rawImage.length == 0) {
+            return null;
+        }
 
         return BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length);
     }
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java b/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java
index 978dc01..6d435e3 100644
--- a/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java
+++ b/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java
@@ -30,27 +30,25 @@
 import android.os.Binder;
 import android.os.RemoteException;
 import android.util.ArrayMap;
+import android.util.ArraySet;
 import android.util.IndentingPrintWriter;
 import android.util.MutableBoolean;
 import android.util.MutableInt;
-import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.server.broadcastradio.RadioServiceUserController;
 import com.android.server.utils.Slogf;
 
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
-class TunerSession extends ITuner.Stub {
+final class TunerSession extends ITuner.Stub {
     private static final String TAG = "BcRadio2Srv.session";
-    private static final String kAudioDeviceName = "Radio tuner source";
     private static final int TUNER_EVENT_LOGGER_QUEUE_SIZE = 25;
 
     private final Object mLock = new Object();
-    @NonNull private final RadioEventLogger mEventLogger;
+    private final RadioEventLogger mEventLogger;
 
     private final RadioModule mModule;
     private final ITunerSession mHwSession;
@@ -99,7 +97,7 @@
             try {
                 mCallback.onError(error);
             } catch (RemoteException ex) {
-                Slog.w(TAG, "mCallback.onError() failed: ", ex);
+                Slogf.w(TAG, "mCallback.onError() failed: ", ex);
             }
         }
         mModule.onTunerSessionClosed(this);
@@ -129,7 +127,7 @@
             checkNotClosedLocked();
             mDummyConfig = Objects.requireNonNull(config);
         }
-        Slog.i(TAG, "Ignoring setConfiguration - not applicable for broadcastradio HAL 2.0");
+        Slogf.i(TAG, "Ignoring setConfiguration - not applicable for broadcastradio HAL 2.0");
         mModule.fanoutAidlCallback(cb -> cb.onConfigurationChanged(config));
     }
 
@@ -148,7 +146,7 @@
             if (mIsMuted == mute) return;
             mIsMuted = mute;
         }
-        Slog.w(TAG, "Mute via RadioService is not implemented - please handle it via app");
+        Slogf.w(TAG, "Mute via RadioService is not implemented - please handle it via app");
     }
 
     @Override
@@ -205,7 +203,7 @@
 
     @Override
     public void cancel() {
-        Slog.i(TAG, "Cancel");
+        Slogf.i(TAG, "Cancel");
         if (!RadioServiceUserController.isCurrentOrSystemUser()) {
             Slogf.w(TAG, "Cannot cancel on HAL 2.0 client from non-current user");
             return;
@@ -218,7 +216,8 @@
 
     @Override
     public void cancelAnnouncement() {
-        Slog.w(TAG, "Announcements control doesn't involve cancelling at the HAL level in HAL 2.0");
+        Slogf.w(TAG,
+                "Announcements control doesn't involve cancelling at the HAL level in HAL 2.0");
     }
 
     @Override
@@ -229,7 +228,7 @@
 
     @Override
     public boolean startBackgroundScan() {
-        Slog.w(TAG, "Explicit background scan trigger is not supported with HAL 2.0");
+        Slogf.w(TAG, "Explicit background scan trigger is not supported with HAL 2.0");
         if (!RadioServiceUserController.isCurrentOrSystemUser()) {
             Slogf.w(TAG,
                     "Cannot start background scan on HAL 2.0 client from non-current user");
@@ -240,7 +239,7 @@
     }
 
     @Override
-    public void startProgramListUpdates(ProgramList.Filter filter) throws RemoteException {
+    public void startProgramListUpdates(ProgramList.Filter filter) {
         mEventLogger.logRadioEvent("start programList updates %s", filter);
         if (!RadioServiceUserController.isCurrentOrSystemUser()) {
             Slogf.w(TAG,
@@ -250,8 +249,8 @@
         // If the AIDL client provides a null filter, it wants all updates, so use the most broad
         // filter.
         if (filter == null) {
-            filter = new ProgramList.Filter(new HashSet<Integer>(),
-                    new HashSet<android.hardware.radio.ProgramSelector.Identifier>(), true, false);
+            filter = new ProgramList.Filter(new ArraySet<>(), new ArraySet<>(),
+                    /* includeCategories= */ true, /* excludeModifications= */ false);
         }
         synchronized (mLock) {
             checkNotClosedLocked();
@@ -285,7 +284,7 @@
             if (mProgramInfoCache == null) {
                 return;
             }
-            clientUpdateChunks = mProgramInfoCache.filterAndUpdateFrom(halCache, true);
+            clientUpdateChunks = mProgramInfoCache.filterAndUpdateFrom(halCache, /* purge= */ true);
         }
         dispatchClientUpdateChunks(clientUpdateChunks);
     }
@@ -298,7 +297,7 @@
             try {
                 mCallback.onProgramListUpdated(chunk);
             } catch (RemoteException ex) {
-                Slog.w(TAG, "mCallback.onProgramListUpdated() failed: ", ex);
+                Slogf.w(TAG, "mCallback.onProgramListUpdated() failed: ", ex);
             }
         }
     }
diff --git a/services/core/java/com/android/server/connectivity/Android.bp b/services/core/java/com/android/server/connectivity/Android.bp
new file mode 100644
index 0000000..a374ec2
--- /dev/null
+++ b/services/core/java/com/android/server/connectivity/Android.bp
@@ -0,0 +1,10 @@
+aconfig_declarations {
+    name: "connectivity_flags",
+    package: "com.android.server.connectivity",
+    srcs: ["flags.aconfig"],
+}
+
+java_aconfig_library {
+    name: "connectivity_flags_lib",
+    aconfig_declarations: "connectivity_flags",
+}
diff --git a/services/core/java/com/android/server/connectivity/flags.aconfig b/services/core/java/com/android/server/connectivity/flags.aconfig
new file mode 100644
index 0000000..32593d4
--- /dev/null
+++ b/services/core/java/com/android/server/connectivity/flags.aconfig
@@ -0,0 +1,8 @@
+package: "com.android.server.connectivity"
+
+flag {
+    name: "replace_vpn_profile_store"
+    namespace: "android_core_networking"
+    description: "This flag controls the usage of VpnBlobStore to replace LegacyVpnProfileStore."
+    bug: "307903113"
+}
\ No newline at end of file
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index 333f62a..3ad6a4a 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -347,6 +347,11 @@
             return target + ", enabled=" + enabled + ", syncable=" + syncable + ", backoff="
                     + backoffTime + ", delay=" + delayUntil;
         }
+
+        public String toSafeString() {
+            return target.toSafeString() + ", enabled=" + enabled + ", syncable=" + syncable
+                    + ", backoff=" + backoffTime + ", delay=" + delayUntil;
+        }
     }
 
     public static class SyncHistoryItem {
@@ -553,7 +558,7 @@
             final int size = mAuthorities.size();
             mLogger.log("Loaded ", size, " items");
             for (int i = 0; i < size; i++) {
-                mLogger.log(mAuthorities.valueAt(i));
+                mLogger.log(mAuthorities.valueAt(i).toSafeString());
             }
         }
     }
@@ -734,7 +739,7 @@
             Slog.d(TAG, "setSyncAutomatically: " + /* account + */" provider " + providerName
                     + ", user " + userId + " -> " + sync);
         }
-        mLogger.log("Set sync auto account=", account,
+        mLogger.log("Set sync auto account=", account.toSafeString(),
                 " user=", userId,
                 " authority=", providerName,
                 " value=", Boolean.toString(sync),
@@ -812,7 +817,8 @@
     private void setSyncableStateForEndPoint(EndPoint target, int syncable,
             int callingUid, int callingPid) {
         AuthorityInfo aInfo;
-        mLogger.log("Set syncable ", target, " value=", Integer.toString(syncable),
+        mLogger.log("Set syncable ", target.toSafeString(),
+                " value=", Integer.toString(syncable),
                 " cuid=", callingUid,
                 " cpid=", callingPid);
         synchronized (mAuthorities) {
diff --git a/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java b/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java
index e2ae3de..e8394d4 100644
--- a/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java
+++ b/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java
@@ -399,7 +399,7 @@
         final DeviceState baseState = mBaseState.orElse(INVALID_DEVICE_STATE);
         final DeviceState currentState = mCommittedState.orElse(INVALID_DEVICE_STATE);
 
-        return new DeviceStateInfo(supportedStates, baseState,
+        return new DeviceStateInfo(new ArrayList<>(supportedStates), baseState,
                 createMergedDeviceState(currentState, baseState));
     }
 
diff --git a/services/core/java/com/android/server/devicestate/OWNERS b/services/core/java/com/android/server/devicestate/OWNERS
index ae79fc0..43f3f0c 100644
--- a/services/core/java/com/android/server/devicestate/OWNERS
+++ b/services/core/java/com/android/server/devicestate/OWNERS
@@ -1,3 +1,4 @@
 [email protected]
 [email protected]
[email protected]
[email protected]
[email protected]
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index 4aab9d2..9c020a7 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -55,6 +55,7 @@
 import com.android.server.EventLogTags;
 import com.android.server.display.brightness.BrightnessEvent;
 import com.android.server.display.brightness.clamper.BrightnessClamperController;
+import com.android.server.display.config.HysteresisLevels;
 
 import java.io.PrintWriter;
 import java.lang.annotation.Retention;
@@ -424,7 +425,7 @@
         return mScreenAutoBrightness;
     }
 
-    float getRawAutomaticScreenBrightness() {
+    public float getRawAutomaticScreenBrightness() {
         return mRawScreenAutoBrightness;
     }
 
@@ -673,14 +674,10 @@
         }
 
         pw.println();
-        pw.println("  mAmbientBrightnessThresholds=");
-        mAmbientBrightnessThresholds.dump(pw);
-        pw.println("  mScreenBrightnessThresholds=");
-        mScreenBrightnessThresholds.dump(pw);
-        pw.println("  mScreenBrightnessThresholdsIdle=");
-        mScreenBrightnessThresholdsIdle.dump(pw);
-        pw.println("  mAmbientBrightnessThresholdsIdle=");
-        mAmbientBrightnessThresholdsIdle.dump(pw);
+        pw.println("  mAmbientBrightnessThresholds=" + mAmbientBrightnessThresholds);
+        pw.println("  mAmbientBrightnessThresholdsIdle=" + mAmbientBrightnessThresholdsIdle);
+        pw.println("  mScreenBrightnessThresholds=" + mScreenBrightnessThresholds);
+        pw.println("  mScreenBrightnessThresholdsIdle=" + mScreenBrightnessThresholdsIdle);
     }
 
     public float[] getLastSensorValues() {
diff --git a/services/core/java/com/android/server/display/BrightnessRangeController.java b/services/core/java/com/android/server/display/BrightnessRangeController.java
index 10030b3..dc0e80c 100644
--- a/services/core/java/com/android/server/display/BrightnessRangeController.java
+++ b/services/core/java/com/android/server/display/BrightnessRangeController.java
@@ -117,6 +117,7 @@
                 () -> mNormalBrightnessModeController.setAutoBrightnessState(state),
                 () ->  mHbmController.setAutoBrightnessEnabled(state)
         );
+        mHdrClamper.setAutoBrightnessState(state);
     }
 
     void onBrightnessChanged(float brightness, float unthrottledBrightness,
diff --git a/services/core/java/com/android/server/display/DisplayBrightnessState.java b/services/core/java/com/android/server/display/DisplayBrightnessState.java
index d50a43a..e3e3be2 100644
--- a/services/core/java/com/android/server/display/DisplayBrightnessState.java
+++ b/services/core/java/com/android/server/display/DisplayBrightnessState.java
@@ -18,6 +18,7 @@
 
 import android.text.TextUtils;
 
+import com.android.server.display.brightness.BrightnessEvent;
 import com.android.server.display.brightness.BrightnessReason;
 
 import java.util.Objects;
@@ -43,6 +44,8 @@
 
     private final float mCustomAnimationRate;
 
+    private final BrightnessEvent mBrightnessEvent;
+
     private DisplayBrightnessState(Builder builder) {
         mBrightness = builder.getBrightness();
         mSdrBrightness = builder.getSdrBrightness();
@@ -54,6 +57,7 @@
         mMinBrightness = builder.getMinBrightness();
         mCustomAnimationRate = builder.getCustomAnimationRate();
         mShouldUpdateScreenBrightnessSetting = builder.shouldUpdateScreenBrightnessSetting();
+        mBrightnessEvent = builder.getBrightnessEvent();
     }
 
     /**
@@ -127,6 +131,13 @@
         return mShouldUpdateScreenBrightnessSetting;
     }
 
+    /**
+     * @return The BrightnessEvent object
+     */
+    public BrightnessEvent getBrightnessEvent() {
+        return mBrightnessEvent;
+    }
+
     @Override
     public String toString() {
         StringBuilder stringBuilder = new StringBuilder("DisplayBrightnessState:");
@@ -144,6 +155,8 @@
         stringBuilder.append("\n    customAnimationRate:").append(mCustomAnimationRate);
         stringBuilder.append("\n    shouldUpdateScreenBrightnessSetting:")
                 .append(mShouldUpdateScreenBrightnessSetting);
+        stringBuilder.append("\n    mBrightnessEvent:")
+                .append(Objects.toString(mBrightnessEvent, "null"));
         return stringBuilder.toString();
     }
 
@@ -173,7 +186,8 @@
                 && mMinBrightness == otherState.getMinBrightness()
                 && mCustomAnimationRate == otherState.getCustomAnimationRate()
                 && mShouldUpdateScreenBrightnessSetting
-                    == otherState.shouldUpdateScreenBrightnessSetting();
+                    == otherState.shouldUpdateScreenBrightnessSetting()
+                && Objects.equals(mBrightnessEvent, otherState.getBrightnessEvent());
     }
 
     @Override
@@ -181,7 +195,7 @@
         return Objects.hash(mBrightness, mSdrBrightness, mBrightnessReason,
                 mShouldUseAutoBrightness, mIsSlowChange, mMaxBrightness, mMinBrightness,
                 mCustomAnimationRate,
-                mShouldUpdateScreenBrightnessSetting);
+                mShouldUpdateScreenBrightnessSetting, mBrightnessEvent);
     }
 
     /**
@@ -206,6 +220,8 @@
         private float mCustomAnimationRate = CUSTOM_ANIMATION_RATE_NOT_SET;
         private boolean mShouldUpdateScreenBrightnessSetting;
 
+        private BrightnessEvent mBrightnessEvent;
+
         /**
          * Create a builder starting with the values from the specified {@link
          * DisplayBrightnessState}.
@@ -225,6 +241,7 @@
             builder.setCustomAnimationRate(state.getCustomAnimationRate());
             builder.setShouldUpdateScreenBrightnessSetting(
                     state.shouldUpdateScreenBrightnessSetting());
+            builder.setBrightnessEvent(state.getBrightnessEvent());
             return builder;
         }
 
@@ -400,5 +417,22 @@
         public DisplayBrightnessState build() {
             return new DisplayBrightnessState(this);
         }
+
+
+        /**
+         * This is used to get the BrightnessEvent object from its builder
+         */
+        public BrightnessEvent getBrightnessEvent() {
+            return mBrightnessEvent;
+        }
+
+
+        /**
+         * This is used to set the BrightnessEvent object
+         */
+        public Builder setBrightnessEvent(BrightnessEvent brightnessEvent) {
+            mBrightnessEvent = brightnessEvent;
+            return this;
+        }
     }
 }
diff --git a/services/core/java/com/android/server/display/DisplayDevice.java b/services/core/java/com/android/server/display/DisplayDevice.java
index 0ebb2a3..4bbddae 100644
--- a/services/core/java/com/android/server/display/DisplayDevice.java
+++ b/services/core/java/com/android/server/display/DisplayDevice.java
@@ -26,6 +26,7 @@
 import android.hardware.display.DisplayManagerInternal.DisplayOffloadSession;
 import android.hardware.display.DisplayViewport;
 import android.os.IBinder;
+import android.util.ArraySet;
 import android.util.Slog;
 import android.view.Display;
 import android.view.DisplayAddress;
@@ -35,6 +36,7 @@
 import com.android.server.display.mode.DisplayModeDirector;
 
 import java.io.PrintWriter;
+import java.util.Arrays;
 
 /**
  * Represents a display device such as the built-in display, an external monitor, a WiFi display,
@@ -160,8 +162,8 @@
         DisplayDeviceInfo displayDeviceInfo = getDisplayDeviceInfoLocked();
         var width = displayDeviceInfo.width;
         var height = displayDeviceInfo.height;
-        if (mIsAnisotropyCorrectionEnabled && displayDeviceInfo.yDpi > 0
-                    && displayDeviceInfo.xDpi > 0) {
+        if (mIsAnisotropyCorrectionEnabled && displayDeviceInfo.type == Display.TYPE_EXTERNAL
+                    && displayDeviceInfo.yDpi > 0 && displayDeviceInfo.xDpi > 0) {
             if (displayDeviceInfo.xDpi > displayDeviceInfo.yDpi * MAX_ANISOTROPY) {
                 height = (int) (height * displayDeviceInfo.xDpi / displayDeviceInfo.yDpi + 0.5);
             } else if (displayDeviceInfo.xDpi * MAX_ANISOTROPY < displayDeviceInfo.yDpi) {
@@ -429,6 +431,21 @@
         return mCurrentOrientation == ROTATION_90 || mCurrentOrientation == ROTATION_270;
     }
 
+    /**
+     * @return set of supported resolutions as an ascending sorted array.
+     */
+    Point[] getSupportedResolutionsLocked() {
+        ArraySet<Point> resolutions = new ArraySet<>(2);
+        Display.Mode[] supportedModes = getDisplayDeviceInfoLocked().supportedModes;
+        for (Display.Mode mode : supportedModes) {
+            resolutions.add(new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight()));
+        }
+        Point[] sortedArray = new Point[resolutions.size()];
+        resolutions.toArray(sortedArray);
+        Arrays.sort(sortedArray, (p1, p2) -> p1.x * p1.y - p2.x * p2.y);
+        return sortedArray;
+    }
+
     private DisplayDeviceConfig loadDisplayDeviceConfig() {
         return DisplayDeviceConfig.create(mContext, /* useConfigXml= */ false,
                 mDisplayAdapter.getFeatureFlags());
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index 851d197..85a231f 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -33,7 +33,6 @@
 import android.os.PowerManager;
 import android.text.TextUtils;
 import android.util.MathUtils;
-import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.Spline;
@@ -46,7 +45,6 @@
 import com.android.server.display.config.AutoBrightness;
 import com.android.server.display.config.BlockingZoneConfig;
 import com.android.server.display.config.BrightnessLimitMap;
-import com.android.server.display.config.BrightnessThresholds;
 import com.android.server.display.config.BrightnessThrottlingMap;
 import com.android.server.display.config.BrightnessThrottlingPoint;
 import com.android.server.display.config.Density;
@@ -54,14 +52,15 @@
 import com.android.server.display.config.DisplayBrightnessPoint;
 import com.android.server.display.config.DisplayConfiguration;
 import com.android.server.display.config.DisplayQuirks;
+import com.android.server.display.config.EvenDimmerBrightnessData;
 import com.android.server.display.config.HbmTiming;
 import com.android.server.display.config.HdrBrightnessData;
 import com.android.server.display.config.HighBrightnessMode;
+import com.android.server.display.config.HysteresisLevels;
 import com.android.server.display.config.IdleScreenRefreshRateTimeout;
 import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholdPoint;
 import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholds;
 import com.android.server.display.config.IntegerArray;
-import com.android.server.display.config.LowBrightnessData;
 import com.android.server.display.config.LuxThrottling;
 import com.android.server.display.config.NitsMap;
 import com.android.server.display.config.NonNegativeFloatToFloatPoint;
@@ -80,7 +79,6 @@
 import com.android.server.display.config.SensorData;
 import com.android.server.display.config.ThermalStatus;
 import com.android.server.display.config.ThermalThrottling;
-import com.android.server.display.config.ThresholdPoint;
 import com.android.server.display.config.UsiVersion;
 import com.android.server.display.config.XmlParser;
 import com.android.server.display.feature.DisplayManagerFlags;
@@ -556,7 +554,7 @@
  *         <majorVersion>2</majorVersion>
  *         <minorVersion>0</minorVersion>
  *     </usiVersion>
- *     <lowBrightness enabled="true">
+ *     <evenDimmer enabled="true">
  *       <transitionPoint>0.1</transitionPoint>
  *
  *       <nits>0.2</nits>
@@ -573,7 +571,7 @@
  *       <brightness>0.1</brightness>
  *       <brightness>0.5</brightness>
  *       <brightness>1.0</brightness>
- *     </lowBrightness>
+ *     </evenDimmer>
  *     <screenBrightnessCapForWearBedtimeMode>0.1</screenBrightnessCapForWearBedtimeMode>
  *     <idleScreenRefreshRateTimeout>
  *          <luxThresholds>
@@ -625,13 +623,6 @@
     private static final int DEFAULT_HIGH_REFRESH_RATE = 0;
     private static final float[] DEFAULT_BRIGHTNESS_THRESHOLDS = new float[]{};
 
-    private static final float[] DEFAULT_AMBIENT_THRESHOLD_LEVELS = new float[]{0f};
-    private static final float[] DEFAULT_AMBIENT_BRIGHTENING_THRESHOLDS = new float[]{100f};
-    private static final float[] DEFAULT_AMBIENT_DARKENING_THRESHOLDS = new float[]{200f};
-    private static final float[] DEFAULT_SCREEN_THRESHOLD_LEVELS = new float[]{0f};
-    private static final float[] DEFAULT_SCREEN_BRIGHTENING_THRESHOLDS = new float[]{100f};
-    private static final float[] DEFAULT_SCREEN_DARKENING_THRESHOLDS = new float[]{200f};
-
     private static final int INTERPOLATION_DEFAULT = 0;
     private static final int INTERPOLATION_LINEAR = 1;
 
@@ -713,38 +704,16 @@
     private long mBrightnessRampIncreaseMaxIdleMillis = 0;
     private int mAmbientHorizonLong = AMBIENT_LIGHT_LONG_HORIZON_MILLIS;
     private int mAmbientHorizonShort = AMBIENT_LIGHT_SHORT_HORIZON_MILLIS;
-    private float mScreenBrighteningMinThreshold = 0.0f;     // Retain behaviour as though there is
-    private float mScreenBrighteningMinThresholdIdle = 0.0f; // no minimum threshold for change in
-    private float mScreenDarkeningMinThreshold = 0.0f;       // screen brightness or ambient
-    private float mScreenDarkeningMinThresholdIdle = 0.0f;   // brightness.
-    private float mAmbientLuxBrighteningMinThreshold = 0.0f;
-    private float mAmbientLuxBrighteningMinThresholdIdle = 0.0f;
-    private float mAmbientLuxDarkeningMinThreshold = 0.0f;
-    private float mAmbientLuxDarkeningMinThresholdIdle = 0.0f;
 
-    // Screen brightness thresholds levels & percentages
-    private float[] mScreenBrighteningLevels = DEFAULT_SCREEN_THRESHOLD_LEVELS;
-    private float[] mScreenBrighteningPercentages = DEFAULT_SCREEN_BRIGHTENING_THRESHOLDS;
-    private float[] mScreenDarkeningLevels = DEFAULT_SCREEN_THRESHOLD_LEVELS;
-    private float[] mScreenDarkeningPercentages = DEFAULT_SCREEN_DARKENING_THRESHOLDS;
-
-    // Screen brightness thresholds levels & percentages for idle mode
-    private float[] mScreenBrighteningLevelsIdle = DEFAULT_SCREEN_THRESHOLD_LEVELS;
-    private float[] mScreenBrighteningPercentagesIdle = DEFAULT_SCREEN_BRIGHTENING_THRESHOLDS;
-    private float[] mScreenDarkeningLevelsIdle = DEFAULT_SCREEN_THRESHOLD_LEVELS;
-    private float[] mScreenDarkeningPercentagesIdle = DEFAULT_SCREEN_DARKENING_THRESHOLDS;
-
-    // Ambient brightness thresholds levels & percentages
-    private float[] mAmbientBrighteningLevels = DEFAULT_AMBIENT_THRESHOLD_LEVELS;
-    private float[] mAmbientBrighteningPercentages = DEFAULT_AMBIENT_BRIGHTENING_THRESHOLDS;
-    private float[] mAmbientDarkeningLevels = DEFAULT_AMBIENT_THRESHOLD_LEVELS;
-    private float[] mAmbientDarkeningPercentages = DEFAULT_AMBIENT_DARKENING_THRESHOLDS;
-
-    // Ambient brightness thresholds levels & percentages for idle mode
-    private float[] mAmbientBrighteningLevelsIdle = DEFAULT_AMBIENT_THRESHOLD_LEVELS;
-    private float[] mAmbientBrighteningPercentagesIdle = DEFAULT_AMBIENT_BRIGHTENING_THRESHOLDS;
-    private float[] mAmbientDarkeningLevelsIdle = DEFAULT_AMBIENT_THRESHOLD_LEVELS;
-    private float[] mAmbientDarkeningPercentagesIdle = DEFAULT_AMBIENT_DARKENING_THRESHOLDS;
+    // Hysteresis levels for screen/ambient brightness for normal/idle modes
+    private HysteresisLevels mScreenBrightnessHysteresis =
+            HysteresisLevels.loadDisplayBrightnessConfig(null, null);
+    private HysteresisLevels mScreenBrightnessIdleHysteresis =
+            HysteresisLevels.loadDisplayBrightnessIdleConfig(null, null);
+    private HysteresisLevels mAmbientBrightnessHysteresis =
+            HysteresisLevels.loadAmbientBrightnessConfig(null, null);
+    private HysteresisLevels mAmbientBrightnessIdleHysteresis =
+            HysteresisLevels.loadAmbientBrightnessIdleConfig(null, null);
 
     // A mapping between screen off sensor values and lux values
     private int[] mScreenOffBrightnessSensorValueToLux;
@@ -894,9 +863,9 @@
     @Nullable
     private HdrBrightnessData mHdrBrightnessData;
 
-    // Null if low brightness mode is disabled - in config or by flag.
+    // Null if even dimmer is disabled - in config or by flag.
     @Nullable
-    public LowBrightnessData mLowBrightnessData;
+    public EvenDimmerBrightnessData mEvenDimmerBrightnessData;
 
     /**
      * Maximum screen brightness setting when screen brightness capped in Wear Bedtime mode.
@@ -1064,8 +1033,8 @@
      * @return The brightness mapping nits array.
      */
     public float[] getNits() {
-        if (mLowBrightnessData != null) {
-            return mLowBrightnessData.mNits;
+        if (mEvenDimmerBrightnessData != null) {
+            return mEvenDimmerBrightnessData.mNits;
         }
         return mNits;
     }
@@ -1077,8 +1046,8 @@
      */
     @VisibleForTesting
     public float[] getBacklight() {
-        if (mLowBrightnessData != null) {
-            return mLowBrightnessData.mBacklight;
+        if (mEvenDimmerBrightnessData != null) {
+            return mEvenDimmerBrightnessData.mBacklight;
         }
         return mBacklight;
     }
@@ -1091,22 +1060,32 @@
      * @return backlight value on the HAL scale of 0-1
      */
     public float getBacklightFromBrightness(float brightness) {
-        if (mLowBrightnessData != null) {
-            return mLowBrightnessData.mBrightnessToBacklight.interpolate(brightness);
+        if (mEvenDimmerBrightnessData != null) {
+            return mEvenDimmerBrightnessData.mBrightnessToBacklight.interpolate(brightness);
         }
         return mBrightnessToBacklightSpline.interpolate(brightness);
     }
 
-    private float getBrightnessFromBacklight(float brightness) {
-        if (mLowBrightnessData != null) {
-            return mLowBrightnessData.mBacklightToBrightness.interpolate(brightness);
+    /**
+     * Calculates the screen brightness value - as used among the system from the HAL backlight
+     * level
+     * @param backlight value from 0-1 HAL scale
+     * @return brightness value from 0-1 framework scale
+     */
+    public float getBrightnessFromBacklight(float backlight) {
+        if (mEvenDimmerBrightnessData != null) {
+            return mEvenDimmerBrightnessData.mBacklightToBrightness.interpolate(backlight);
         }
-        return mBacklightToBrightnessSpline.interpolate(brightness);
+        return mBacklightToBrightnessSpline.interpolate(backlight);
     }
 
+    /**
+     *
+     * @return HAL backlight mapping to framework brightness
+     */
     private Spline getBacklightToBrightnessSpline() {
-        if (mLowBrightnessData != null) {
-            return mLowBrightnessData.mBacklightToBrightness;
+        if (mEvenDimmerBrightnessData != null) {
+            return mEvenDimmerBrightnessData.mBacklightToBrightness;
         }
         return mBacklightToBrightnessSpline;
     }
@@ -1118,12 +1097,12 @@
      * exits.
      */
     public float getNitsFromBacklight(float backlight) {
-        if (mLowBrightnessData != null) {
-            if (mLowBrightnessData.mBacklightToNits == null) {
+        if (mEvenDimmerBrightnessData != null) {
+            if (mEvenDimmerBrightnessData.mBacklightToNits == null) {
                 return INVALID_NITS;
             }
             backlight = Math.max(backlight, mBacklightMinimum);
-            return mLowBrightnessData.mBacklightToNits.interpolate(backlight);
+            return mEvenDimmerBrightnessData.mBacklightToNits.interpolate(backlight);
         }
 
         if (mBacklightToNitsSpline == null) {
@@ -1133,21 +1112,49 @@
         return mBacklightToNitsSpline.interpolate(backlight);
     }
 
-    private float getBacklightFromNits(float nits) {
-        if (mLowBrightnessData != null) {
-            return mLowBrightnessData.mNitsToBacklight.interpolate(nits);
+    /**
+     *
+     * @param nits - display brightness
+     * @return corresponding HAL backlight value
+     */
+    public float getBacklightFromNits(float nits) {
+        if (mEvenDimmerBrightnessData != null) {
+            return mEvenDimmerBrightnessData.mNitsToBacklight.interpolate(nits);
         }
         return mNitsToBacklightSpline.interpolate(nits);
     }
 
     private Spline getNitsToBacklightSpline() {
-        if (mLowBrightnessData != null) {
-            return mLowBrightnessData.mNitsToBacklight;
+        if (mEvenDimmerBrightnessData != null) {
+            return mEvenDimmerBrightnessData.mNitsToBacklight;
         }
         return mNitsToBacklightSpline;
     }
 
     /**
+     *
+     * @param lux - ambient brightness
+     * @return minimum allowed nits, given the lux.
+     */
+    public float getMinNitsFromLux(float lux) {
+        if (mEvenDimmerBrightnessData == null) {
+            return INVALID_NITS;
+        }
+        return mEvenDimmerBrightnessData.mMinLuxToNits.interpolate(lux);
+    }
+
+    /**
+     *
+     * @return even dimmer mode transition point
+     */
+    public float getEvenDimmerTransitionPoint() {
+        if (mEvenDimmerBrightnessData == null) {
+            return PowerManager.BRIGHTNESS_MIN;
+        }
+        return mEvenDimmerBrightnessData.mTransitionPoint;
+    }
+
+    /**
      * @return true if there is sdrHdrRatioMap, false otherwise.
      */
     public boolean hasSdrToHdrRatioSpline() {
@@ -1201,8 +1208,8 @@
      * @return brightness array
      */
     public float[] getBrightness() {
-        if (mLowBrightnessData != null) {
-            return mLowBrightnessData.mBrightness;
+        if (mEvenDimmerBrightnessData != null) {
+            return mEvenDimmerBrightnessData.mBrightness;
         }
         return mBrightness;
     }
@@ -1264,324 +1271,20 @@
         return mAmbientHorizonShort;
     }
 
-    /**
-     * The minimum value for the screen brightness increase to actually occur.
-     * @return float value in brightness scale of 0 - 1.
-     */
-    public float getScreenBrighteningMinThreshold() {
-        return mScreenBrighteningMinThreshold;
+    public HysteresisLevels getAmbientBrightnessHysteresis() {
+        return mAmbientBrightnessHysteresis;
     }
 
-    /**
-     * The minimum value for the screen brightness decrease to actually occur.
-     * @return float value in brightness scale of 0 - 1.
-     */
-    public float getScreenDarkeningMinThreshold() {
-        return mScreenDarkeningMinThreshold;
+    public HysteresisLevels getAmbientBrightnessIdleHysteresis() {
+        return mAmbientBrightnessIdleHysteresis;
     }
 
-    /**
-     * The minimum value for the screen brightness increase to actually occur while in idle screen
-     * brightness mode.
-     * @return float value in brightness scale of 0 - 1.
-     */
-    public float getScreenBrighteningMinThresholdIdle() {
-        return mScreenBrighteningMinThresholdIdle;
+    public HysteresisLevels getScreenBrightnessHysteresis() {
+        return mScreenBrightnessHysteresis;
     }
 
-    /**
-     * The minimum value for the screen brightness decrease to actually occur while in idle screen
-     * brightness mode.
-     * @return float value in brightness scale of 0 - 1.
-     */
-    public float getScreenDarkeningMinThresholdIdle() {
-        return mScreenDarkeningMinThresholdIdle;
-    }
-
-    /**
-     * The minimum value for the ambient lux increase for a screen brightness change to actually
-     * occur.
-     * @return float value in lux.
-     */
-    public float getAmbientLuxBrighteningMinThreshold() {
-        return mAmbientLuxBrighteningMinThreshold;
-    }
-
-    /**
-     * The minimum value for the ambient lux decrease for a screen brightness change to actually
-     * occur.
-     * @return float value in lux.
-     */
-    public float getAmbientLuxDarkeningMinThreshold() {
-        return mAmbientLuxDarkeningMinThreshold;
-    }
-
-    /**
-     * The minimum value for the ambient lux increase for a screen brightness change to actually
-     * occur while in idle screen brightness mode.
-     * @return float value in lux.
-     */
-    public float getAmbientLuxBrighteningMinThresholdIdle() {
-        return mAmbientLuxBrighteningMinThresholdIdle;
-    }
-
-    /**
-     * The minimum value for the ambient lux decrease for a screen brightness change to actually
-     * occur while in idle screen brightness mode.
-     * @return float value in lux.
-     */
-    public float getAmbientLuxDarkeningMinThresholdIdle() {
-        return mAmbientLuxDarkeningMinThresholdIdle;
-    }
-
-    /**
-     * The array that describes the range of screen brightness that each threshold percentage
-     * applies within.
-     *
-     * The (zero-based) index is calculated as follows
-     * value = current screen brightness value
-     * level = mScreenBrighteningLevels
-     *
-     * condition                       return
-     * value < level[0]                = 0.0f
-     * level[n] <= value < level[n+1]  = mScreenBrighteningPercentages[n]
-     * level[MAX] <= value             = mScreenBrighteningPercentages[MAX]
-     *
-     * @return the screen brightness levels between 0.0 and 1.0 for which each
-     * mScreenBrighteningPercentages applies
-     */
-    public float[] getScreenBrighteningLevels() {
-        return mScreenBrighteningLevels;
-    }
-
-    /**
-     * The array that describes the screen brightening threshold percentage change at each screen
-     * brightness level described in mScreenBrighteningLevels.
-     *
-     * @return the percentages between 0 and 100 of brightness increase required in order for the
-     * screen brightness to change
-     */
-    public float[] getScreenBrighteningPercentages() {
-        return mScreenBrighteningPercentages;
-    }
-
-    /**
-     * The array that describes the range of screen brightness that each threshold percentage
-     * applies within.
-     *
-     * The (zero-based) index is calculated as follows
-     * value = current screen brightness value
-     * level = mScreenDarkeningLevels
-     *
-     * condition                       return
-     * value < level[0]                = 0.0f
-     * level[n] <= value < level[n+1]  = mScreenDarkeningPercentages[n]
-     * level[MAX] <= value             = mScreenDarkeningPercentages[MAX]
-     *
-     * @return the screen brightness levels between 0.0 and 1.0 for which each
-     * mScreenDarkeningPercentages applies
-     */
-    public float[] getScreenDarkeningLevels() {
-        return mScreenDarkeningLevels;
-    }
-
-    /**
-     * The array that describes the screen darkening threshold percentage change at each screen
-     * brightness level described in mScreenDarkeningLevels.
-     *
-     * @return the percentages between 0 and 100 of brightness decrease required in order for the
-     * screen brightness to change
-     */
-    public float[] getScreenDarkeningPercentages() {
-        return mScreenDarkeningPercentages;
-    }
-
-    /**
-     * The array that describes the range of ambient brightness that each threshold
-     * percentage applies within.
-     *
-     * The (zero-based) index is calculated as follows
-     * value = current ambient brightness value
-     * level = mAmbientBrighteningLevels
-     *
-     * condition                       return
-     * value < level[0]                = 0.0f
-     * level[n] <= value < level[n+1]  = mAmbientBrighteningPercentages[n]
-     * level[MAX] <= value             = mAmbientBrighteningPercentages[MAX]
-     *
-     * @return the ambient brightness levels from 0 lux upwards for which each
-     * mAmbientBrighteningPercentages applies
-     */
-    public float[] getAmbientBrighteningLevels() {
-        return mAmbientBrighteningLevels;
-    }
-
-    /**
-     * The array that describes the ambient brightening threshold percentage change at each ambient
-     * brightness level described in mAmbientBrighteningLevels.
-     *
-     * @return the percentages between 0 and 100 of brightness increase required in order for the
-     * screen brightness to change
-     */
-    public float[] getAmbientBrighteningPercentages() {
-        return mAmbientBrighteningPercentages;
-    }
-
-    /**
-     * The array that describes the range of ambient brightness that each threshold percentage
-     * applies within.
-     *
-     * The (zero-based) index is calculated as follows
-     * value = current ambient brightness value
-     * level = mAmbientDarkeningLevels
-     *
-     * condition                       return
-     * value < level[0]                = 0.0f
-     * level[n] <= value < level[n+1]  = mAmbientDarkeningPercentages[n]
-     * level[MAX] <= value             = mAmbientDarkeningPercentages[MAX]
-     *
-     * @return the ambient brightness levels from 0 lux upwards for which each
-     * mAmbientDarkeningPercentages applies
-     */
-    public float[] getAmbientDarkeningLevels() {
-        return mAmbientDarkeningLevels;
-    }
-
-    /**
-     * The array that describes the ambient darkening threshold percentage change at each ambient
-     * brightness level described in mAmbientDarkeningLevels.
-     *
-     * @return the percentages between 0 and 100 of brightness decrease required in order for the
-     * screen brightness to change
-     */
-    public float[] getAmbientDarkeningPercentages() {
-        return mAmbientDarkeningPercentages;
-    }
-
-    /**
-     * The array that describes the range of screen brightness that each threshold percentage
-     * applies within whilst in idle screen brightness mode.
-     *
-     * The (zero-based) index is calculated as follows
-     * value = current screen brightness value
-     * level = mScreenBrighteningLevelsIdle
-     *
-     * condition                       return
-     * value < level[0]                = 0.0f
-     * level[n] <= value < level[n+1]  = mScreenBrighteningPercentagesIdle[n]
-     * level[MAX] <= value             = mScreenBrighteningPercentagesIdle[MAX]
-     *
-     * @return the screen brightness levels between 0.0 and 1.0 for which each
-     * mScreenBrighteningPercentagesIdle applies
-     */
-    public float[] getScreenBrighteningLevelsIdle() {
-        return mScreenBrighteningLevelsIdle;
-    }
-
-    /**
-     * The array that describes the screen brightening threshold percentage change at each screen
-     * brightness level described in mScreenBrighteningLevelsIdle.
-     *
-     * @return the percentages between 0 and 100 of brightness increase required in order for the
-     * screen brightness to change while in idle mode.
-     */
-    public float[] getScreenBrighteningPercentagesIdle() {
-        return mScreenBrighteningPercentagesIdle;
-    }
-
-    /**
-     * The array that describes the range of screen brightness that each threshold percentage
-     * applies within whilst in idle screen brightness mode.
-     *
-     * The (zero-based) index is calculated as follows
-     * value = current screen brightness value
-     * level = mScreenDarkeningLevelsIdle
-     *
-     * condition                       return
-     * value < level[0]                = 0.0f
-     * level[n] <= value < level[n+1]  = mScreenDarkeningPercentagesIdle[n]
-     * level[MAX] <= value             = mScreenDarkeningPercentagesIdle[MAX]
-     *
-     * @return the screen brightness levels between 0.0 and 1.0 for which each
-     * mScreenDarkeningPercentagesIdle applies
-     */
-    public float[] getScreenDarkeningLevelsIdle() {
-        return mScreenDarkeningLevelsIdle;
-    }
-
-    /**
-     * The array that describes the screen darkening threshold percentage change at each screen
-     * brightness level described in mScreenDarkeningLevelsIdle.
-     *
-     * @return the percentages between 0 and 100 of brightness decrease required in order for the
-     * screen brightness to change while in idle mode.
-     */
-    public float[] getScreenDarkeningPercentagesIdle() {
-        return mScreenDarkeningPercentagesIdle;
-    }
-
-    /**
-     * The array that describes the range of ambient brightness that each threshold percentage
-     * applies within whilst in idle screen brightness mode.
-     *
-     * The (zero-based) index is calculated as follows
-     * value = current ambient brightness value
-     * level = mAmbientBrighteningLevelsIdle
-     *
-     * condition                       return
-     * value < level[0]                = 0.0f
-     * level[n] <= value < level[n+1]  = mAmbientBrighteningPercentagesIdle[n]
-     * level[MAX] <= value             = mAmbientBrighteningPercentagesIdle[MAX]
-     *
-     * @return the ambient brightness levels from 0 lux upwards for which each
-     * mAmbientBrighteningPercentagesIdle applies
-     */
-    public float[] getAmbientBrighteningLevelsIdle() {
-        return mAmbientBrighteningLevelsIdle;
-    }
-
-    /**
-     * The array that describes the ambient brightness threshold percentage change whilst in
-     * idle screen brightness mode at each ambient brightness level described in
-     * mAmbientBrighteningLevelsIdle.
-     *
-     * @return the percentages between 0 and 100 of ambient brightness increase required in order
-     * for the screen brightness to change
-     */
-    public float[] getAmbientBrighteningPercentagesIdle() {
-        return mAmbientBrighteningPercentagesIdle;
-    }
-
-    /**
-     * The array that describes the range of ambient brightness that each threshold percentage
-     * applies within whilst in idle screen brightness mode.
-     *
-     * The (zero-based) index is calculated as follows
-     * value = current ambient brightness value
-     * level = mAmbientDarkeningLevelsIdle
-     *
-     * condition                       return
-     * value < level[0]                = 0.0f
-     * level[n] <= value < level[n+1]  = mAmbientDarkeningPercentagesIdle[n]
-     * level[MAX] <= value             = mAmbientDarkeningPercentagesIdle[MAX]
-     *
-     * @return the ambient brightness levels from 0 lux upwards for which each
-     * mAmbientDarkeningPercentagesIdle applies
-     */
-    public float[] getAmbientDarkeningLevelsIdle() {
-        return mAmbientDarkeningLevelsIdle;
-    }
-
-    /**
-     * The array that describes the ambient brightness threshold percentage change whilst in
-     * idle screen brightness mode at each ambient brightness level described in
-     * mAmbientDarkeningLevelsIdle.
-     *
-     * @return the percentages between 0 and 100 of ambient brightness decrease required in order
-     * for the screen brightness to change
-     */
-    public float[] getAmbientDarkeningPercentagesIdle() {
-        return mAmbientDarkeningPercentagesIdle;
+    public HysteresisLevels getScreenBrightnessIdleHysteresis() {
+        return mScreenBrightnessIdleHysteresis;
     }
 
     public SensorData getAmbientLightSensor() {
@@ -1890,11 +1593,10 @@
 
     /**
      *
-     * @return true if low brightness mode is enabled
+     * @return true if even dimmer mode is enabled
      */
-    @VisibleForTesting
-    public boolean getLbmEnabled() {
-        return mLowBrightnessData != null;
+    public boolean isEvenDimmerAvailable() {
+        return mEvenDimmerBrightnessData != null;
     }
 
     /**
@@ -1948,49 +1650,13 @@
                 + "mAmbientHorizonLong=" + mAmbientHorizonLong
                 + ", mAmbientHorizonShort=" + mAmbientHorizonShort
                 + "\n"
-                + "mScreenDarkeningMinThreshold=" + mScreenDarkeningMinThreshold
-                + ", mScreenDarkeningMinThresholdIdle=" + mScreenDarkeningMinThresholdIdle
-                + ", mScreenBrighteningMinThreshold=" + mScreenBrighteningMinThreshold
-                + ", mScreenBrighteningMinThresholdIdle=" + mScreenBrighteningMinThresholdIdle
-                + ", mAmbientLuxDarkeningMinThreshold=" + mAmbientLuxDarkeningMinThreshold
-                + ", mAmbientLuxDarkeningMinThresholdIdle=" + mAmbientLuxDarkeningMinThresholdIdle
-                + ", mAmbientLuxBrighteningMinThreshold=" + mAmbientLuxBrighteningMinThreshold
-                + ", mAmbientLuxBrighteningMinThresholdIdle="
-                + mAmbientLuxBrighteningMinThresholdIdle
+                + "mAmbientBrightnessHysteresis=" + mAmbientBrightnessHysteresis
                 + "\n"
-                + "mScreenBrighteningLevels=" + Arrays.toString(
-                mScreenBrighteningLevels)
-                + ", mScreenBrighteningPercentages=" + Arrays.toString(
-                mScreenBrighteningPercentages)
-                + ", mScreenDarkeningLevels=" + Arrays.toString(
-                mScreenDarkeningLevels)
-                + ", mScreenDarkeningPercentages=" + Arrays.toString(
-                mScreenDarkeningPercentages)
-                + ", mAmbientBrighteningLevels=" + Arrays.toString(
-                mAmbientBrighteningLevels)
-                + ", mAmbientBrighteningPercentages=" + Arrays.toString(
-                mAmbientBrighteningPercentages)
-                + ", mAmbientDarkeningLevels=" + Arrays.toString(
-                mAmbientDarkeningLevels)
-                + ", mAmbientDarkeningPercentages=" + Arrays.toString(
-                mAmbientDarkeningPercentages)
+                + "mAmbientIdleHysteresis=" + mAmbientBrightnessIdleHysteresis
                 + "\n"
-                + "mAmbientBrighteningLevelsIdle=" + Arrays.toString(
-                mAmbientBrighteningLevelsIdle)
-                + ", mAmbientBrighteningPercentagesIdle=" + Arrays.toString(
-                mAmbientBrighteningPercentagesIdle)
-                + ", mAmbientDarkeningLevelsIdle=" + Arrays.toString(
-                mAmbientDarkeningLevelsIdle)
-                + ", mAmbientDarkeningPercentagesIdle=" + Arrays.toString(
-                mAmbientDarkeningPercentagesIdle)
-                + ", mScreenBrighteningLevelsIdle=" + Arrays.toString(
-                mScreenBrighteningLevelsIdle)
-                + ", mScreenBrighteningPercentagesIdle=" + Arrays.toString(
-                mScreenBrighteningPercentagesIdle)
-                + ", mScreenDarkeningLevelsIdle=" + Arrays.toString(
-                mScreenDarkeningLevelsIdle)
-                + ", mScreenDarkeningPercentagesIdle=" + Arrays.toString(
-                mScreenDarkeningPercentagesIdle)
+                + "mScreenBrightnessHysteresis=" + mScreenBrightnessHysteresis
+                + "\n"
+                + "mScreenBrightnessIdleHysteresis=" + mScreenBrightnessIdleHysteresis
                 + "\n"
                 + "mAmbientLightSensor=" + mAmbientLightSensor
                 + ", mScreenOffBrightnessSensor=" + mScreenOffBrightnessSensor
@@ -2037,8 +1703,8 @@
                 + "mHdrBrightnessData= " + mHdrBrightnessData + "\n"
                 + "mBrightnessCapForWearBedtimeMode= " + mBrightnessCapForWearBedtimeMode
                 + "\n"
-                + "mLowBrightnessData:" + (mLowBrightnessData != null
-                ? mLowBrightnessData.toString() : "null")
+                + "mEvenDimmerBrightnessData:" + (mEvenDimmerBrightnessData != null
+                ? mEvenDimmerBrightnessData.toString() : "null")
                 + "}";
     }
 
@@ -2090,7 +1756,7 @@
                 loadBrightnessDefaultFromDdcXml(config);
                 loadBrightnessConstraintsFromConfigXml();
                 if (mFlags.isEvenDimmerEnabled()) {
-                    mLowBrightnessData = LowBrightnessData.loadConfig(config);
+                    mEvenDimmerBrightnessData = EvenDimmerBrightnessData.loadConfig(config);
                 }
                 loadBrightnessMap(config);
                 loadThermalThrottlingConfig(config);
@@ -2102,7 +1768,7 @@
                 mAmbientLightSensor = SensorData.loadAmbientLightSensorConfig(config,
                         mContext.getResources());
                 mScreenOffBrightnessSensor = SensorData.loadScreenOffBrightnessSensorConfig(config);
-                mProximitySensor = SensorData.loadProxSensorConfig(config);
+                mProximitySensor = SensorData.loadProxSensorConfig(mFlags, config);
                 mTempSensor = SensorData.loadTempSensorConfig(mFlags, config);
                 loadAmbientHorizonFromDdc(config);
                 loadBrightnessChangeThresholds(config);
@@ -2885,7 +2551,7 @@
     private void createBacklightConversionSplines() {
 
 
-        // Create original brightness splines - not using low brightness mode arrays - this is
+        // Create original brightness splines - not using even dimmer mode arrays - this is
         // so that we can continue to log the original brightness splines.
 
         mBrightness = new float[mBacklight.length];
@@ -3100,281 +2766,15 @@
     }
 
     private void loadBrightnessChangeThresholds(DisplayConfiguration config) {
-        loadDisplayBrightnessThresholds(config);
-        loadAmbientBrightnessThresholds(config);
-        loadDisplayBrightnessThresholdsIdle(config);
-        loadAmbientBrightnessThresholdsIdle(config);
-    }
-
-    private void loadDisplayBrightnessThresholds(DisplayConfiguration config) {
-        BrightnessThresholds brighteningScreen = null;
-        BrightnessThresholds darkeningScreen = null;
-        if (config != null && config.getDisplayBrightnessChangeThresholds() != null) {
-            brighteningScreen =
-                    config.getDisplayBrightnessChangeThresholds().getBrighteningThresholds();
-            darkeningScreen =
-                    config.getDisplayBrightnessChangeThresholds().getDarkeningThresholds();
-
-        }
-
-        // Screen bright/darkening threshold levels for active mode
-        Pair<float[], float[]> screenBrighteningPair = getBrightnessLevelAndPercentage(
-                brighteningScreen,
-                com.android.internal.R.array.config_screenThresholdLevels,
-                com.android.internal.R.array.config_screenBrighteningThresholds,
-                DEFAULT_SCREEN_THRESHOLD_LEVELS, DEFAULT_SCREEN_BRIGHTENING_THRESHOLDS,
-                /* potentialOldBrightnessScale= */ true);
-
-        mScreenBrighteningLevels = screenBrighteningPair.first;
-        mScreenBrighteningPercentages = screenBrighteningPair.second;
-
-        Pair<float[], float[]> screenDarkeningPair = getBrightnessLevelAndPercentage(
-                darkeningScreen,
-                com.android.internal.R.array.config_screenThresholdLevels,
-                com.android.internal.R.array.config_screenDarkeningThresholds,
-                DEFAULT_SCREEN_THRESHOLD_LEVELS, DEFAULT_SCREEN_DARKENING_THRESHOLDS,
-                /* potentialOldBrightnessScale= */ true);
-        mScreenDarkeningLevels = screenDarkeningPair.first;
-        mScreenDarkeningPercentages = screenDarkeningPair.second;
-
-        // Screen bright/darkening threshold minimums for active mode
-        if (brighteningScreen != null && brighteningScreen.getMinimum() != null) {
-            mScreenBrighteningMinThreshold = brighteningScreen.getMinimum().floatValue();
-        }
-        if (darkeningScreen != null && darkeningScreen.getMinimum() != null) {
-            mScreenDarkeningMinThreshold = darkeningScreen.getMinimum().floatValue();
-        }
-    }
-
-    private void loadAmbientBrightnessThresholds(DisplayConfiguration config) {
-        // Ambient Brightness Threshold Levels
-        BrightnessThresholds brighteningAmbientLux = null;
-        BrightnessThresholds darkeningAmbientLux = null;
-        if (config != null && config.getAmbientBrightnessChangeThresholds() != null) {
-            brighteningAmbientLux =
-                    config.getAmbientBrightnessChangeThresholds().getBrighteningThresholds();
-            darkeningAmbientLux =
-                    config.getAmbientBrightnessChangeThresholds().getDarkeningThresholds();
-        }
-
-        // Ambient bright/darkening threshold levels for active mode
-        Pair<float[], float[]> ambientBrighteningPair = getBrightnessLevelAndPercentage(
-                brighteningAmbientLux,
-                com.android.internal.R.array.config_ambientThresholdLevels,
-                com.android.internal.R.array.config_ambientBrighteningThresholds,
-                DEFAULT_AMBIENT_THRESHOLD_LEVELS, DEFAULT_AMBIENT_BRIGHTENING_THRESHOLDS);
-        mAmbientBrighteningLevels = ambientBrighteningPair.first;
-        mAmbientBrighteningPercentages = ambientBrighteningPair.second;
-
-        Pair<float[], float[]> ambientDarkeningPair = getBrightnessLevelAndPercentage(
-                darkeningAmbientLux,
-                com.android.internal.R.array.config_ambientThresholdLevels,
-                com.android.internal.R.array.config_ambientDarkeningThresholds,
-                DEFAULT_AMBIENT_THRESHOLD_LEVELS, DEFAULT_AMBIENT_DARKENING_THRESHOLDS);
-        mAmbientDarkeningLevels = ambientDarkeningPair.first;
-        mAmbientDarkeningPercentages = ambientDarkeningPair.second;
-
-        // Ambient bright/darkening threshold minimums for active/idle mode
-        if (brighteningAmbientLux != null && brighteningAmbientLux.getMinimum() != null) {
-            mAmbientLuxBrighteningMinThreshold =
-                    brighteningAmbientLux.getMinimum().floatValue();
-        }
-
-        if (darkeningAmbientLux != null && darkeningAmbientLux.getMinimum() != null) {
-            mAmbientLuxDarkeningMinThreshold = darkeningAmbientLux.getMinimum().floatValue();
-        }
-    }
-
-    private void loadDisplayBrightnessThresholdsIdle(DisplayConfiguration config) {
-        BrightnessThresholds brighteningScreenIdle = null;
-        BrightnessThresholds darkeningScreenIdle = null;
-        if (config != null && config.getDisplayBrightnessChangeThresholdsIdle() != null) {
-            brighteningScreenIdle =
-                    config.getDisplayBrightnessChangeThresholdsIdle().getBrighteningThresholds();
-            darkeningScreenIdle =
-                    config.getDisplayBrightnessChangeThresholdsIdle().getDarkeningThresholds();
-        }
-
-        Pair<float[], float[]> screenBrighteningPair = getBrightnessLevelAndPercentage(
-                brighteningScreenIdle,
-                com.android.internal.R.array.config_screenThresholdLevels,
-                com.android.internal.R.array.config_screenBrighteningThresholds,
-                DEFAULT_SCREEN_THRESHOLD_LEVELS, DEFAULT_SCREEN_BRIGHTENING_THRESHOLDS,
-                /* potentialOldBrightnessScale= */ true);
-        mScreenBrighteningLevelsIdle = screenBrighteningPair.first;
-        mScreenBrighteningPercentagesIdle = screenBrighteningPair.second;
-
-        Pair<float[], float[]> screenDarkeningPair = getBrightnessLevelAndPercentage(
-                darkeningScreenIdle,
-                com.android.internal.R.array.config_screenThresholdLevels,
-                com.android.internal.R.array.config_screenDarkeningThresholds,
-                DEFAULT_SCREEN_THRESHOLD_LEVELS, DEFAULT_SCREEN_DARKENING_THRESHOLDS,
-                /* potentialOldBrightnessScale= */ true);
-        mScreenDarkeningLevelsIdle = screenDarkeningPair.first;
-        mScreenDarkeningPercentagesIdle = screenDarkeningPair.second;
-
-        if (brighteningScreenIdle != null
-                && brighteningScreenIdle.getMinimum() != null) {
-            mScreenBrighteningMinThresholdIdle =
-                    brighteningScreenIdle.getMinimum().floatValue();
-        }
-        if (darkeningScreenIdle != null && darkeningScreenIdle.getMinimum() != null) {
-            mScreenDarkeningMinThresholdIdle =
-                    darkeningScreenIdle.getMinimum().floatValue();
-        }
-    }
-
-    private void loadAmbientBrightnessThresholdsIdle(DisplayConfiguration config) {
-        BrightnessThresholds brighteningAmbientLuxIdle = null;
-        BrightnessThresholds darkeningAmbientLuxIdle = null;
-        if (config != null && config.getAmbientBrightnessChangeThresholdsIdle() != null) {
-            brighteningAmbientLuxIdle =
-                    config.getAmbientBrightnessChangeThresholdsIdle().getBrighteningThresholds();
-            darkeningAmbientLuxIdle =
-                    config.getAmbientBrightnessChangeThresholdsIdle().getDarkeningThresholds();
-        }
-
-        Pair<float[], float[]> ambientBrighteningPair = getBrightnessLevelAndPercentage(
-                brighteningAmbientLuxIdle,
-                com.android.internal.R.array.config_ambientThresholdLevels,
-                com.android.internal.R.array.config_ambientBrighteningThresholds,
-                DEFAULT_AMBIENT_THRESHOLD_LEVELS, DEFAULT_AMBIENT_BRIGHTENING_THRESHOLDS);
-        mAmbientBrighteningLevelsIdle = ambientBrighteningPair.first;
-        mAmbientBrighteningPercentagesIdle = ambientBrighteningPair.second;
-
-        Pair<float[], float[]> ambientDarkeningPair = getBrightnessLevelAndPercentage(
-                darkeningAmbientLuxIdle,
-                com.android.internal.R.array.config_ambientThresholdLevels,
-                com.android.internal.R.array.config_ambientDarkeningThresholds,
-                DEFAULT_AMBIENT_THRESHOLD_LEVELS, DEFAULT_AMBIENT_DARKENING_THRESHOLDS);
-        mAmbientDarkeningLevelsIdle = ambientDarkeningPair.first;
-        mAmbientDarkeningPercentagesIdle = ambientDarkeningPair.second;
-
-        if (brighteningAmbientLuxIdle != null
-                && brighteningAmbientLuxIdle.getMinimum() != null) {
-            mAmbientLuxBrighteningMinThresholdIdle =
-                    brighteningAmbientLuxIdle.getMinimum().floatValue();
-        }
-
-        if (darkeningAmbientLuxIdle != null && darkeningAmbientLuxIdle.getMinimum() != null) {
-            mAmbientLuxDarkeningMinThresholdIdle =
-                    darkeningAmbientLuxIdle.getMinimum().floatValue();
-        }
-    }
-
-    private Pair<float[], float[]> getBrightnessLevelAndPercentage(BrightnessThresholds thresholds,
-            int configFallbackThreshold, int configFallbackPercentage, float[] defaultLevels,
-            float[] defaultPercentage) {
-        return getBrightnessLevelAndPercentage(thresholds, configFallbackThreshold,
-                configFallbackPercentage, defaultLevels, defaultPercentage, false);
-    }
-
-    // Returns two float arrays, one of the brightness levels and one of the corresponding threshold
-    // percentages for brightness levels at or above the lux value.
-    // Historically, config.xml would have an array for brightness levels that was 1 shorter than
-    // the levels array. Now we prepend a 0 to this array so they can be treated the same in the
-    // rest of the framework. Values were also defined in different units (permille vs percent).
-    private Pair<float[], float[]> getBrightnessLevelAndPercentage(BrightnessThresholds thresholds,
-            int configFallbackThreshold, int configFallbackPermille,
-            float[] defaultLevels, float[] defaultPercentage,
-            boolean potentialOldBrightnessScale) {
-        if (thresholds != null
-                && thresholds.getBrightnessThresholdPoints() != null
-                && thresholds.getBrightnessThresholdPoints()
-                        .getBrightnessThresholdPoint().size() != 0) {
-
-            // The level and percentages arrays are equal length in the ddc (new system)
-            List<ThresholdPoint> points =
-                    thresholds.getBrightnessThresholdPoints().getBrightnessThresholdPoint();
-            final int size = points.size();
-
-            float[] thresholdLevels = new float[size];
-            float[] thresholdPercentages = new float[size];
-
-            int i = 0;
-            for (ThresholdPoint point : points) {
-                thresholdLevels[i] = point.getThreshold().floatValue();
-                thresholdPercentages[i] = point.getPercentage().floatValue();
-                i++;
-            }
-            return new Pair<>(thresholdLevels, thresholdPercentages);
-        } else {
-            // The level and percentages arrays are unequal length in config.xml (old system)
-            // We prefix the array with a 0 value to ensure they can be handled consistently
-            // with the new system.
-
-            // Load levels array
-            int[] configThresholdArray = mContext.getResources().getIntArray(
-                    configFallbackThreshold);
-            int configThresholdsSize;
-            if (configThresholdArray == null || configThresholdArray.length == 0) {
-                configThresholdsSize = 1;
-            } else {
-                configThresholdsSize = configThresholdArray.length + 1;
-            }
-
-
-            // Load percentage array
-            int[] configPermille = mContext.getResources().getIntArray(
-                    configFallbackPermille);
-
-            // Ensure lengths match up
-            boolean emptyArray = configPermille == null || configPermille.length == 0;
-            if (emptyArray && configThresholdsSize == 1) {
-                return new Pair<>(defaultLevels, defaultPercentage);
-            }
-            if (emptyArray || configPermille.length != configThresholdsSize) {
-                throw new IllegalArgumentException(
-                        "Brightness threshold arrays do not align in length");
-            }
-
-            // Calculate levels array
-            float[] configThresholdWithZeroPrefixed = new float[configThresholdsSize];
-            // Start at 1, so that 0 index value is 0.0f (default)
-            for (int i = 1; i < configThresholdsSize; i++) {
-                configThresholdWithZeroPrefixed[i] = (float) configThresholdArray[i - 1];
-            }
-            if (potentialOldBrightnessScale) {
-                configThresholdWithZeroPrefixed =
-                        constraintInRangeIfNeeded(configThresholdWithZeroPrefixed);
-            }
-
-            // Calculate percentages array
-            float[] configPercentage = new float[configThresholdsSize];
-            for (int i = 0; i < configPermille.length; i++) {
-                configPercentage[i] = configPermille[i] / 10.0f;
-            }            return new Pair<>(configThresholdWithZeroPrefixed, configPercentage);
-        }
-    }
-
-    /**
-     * This check is due to historical reasons, where screen thresholdLevels used to be
-     * integer values in the range of [0-255], but then was changed to be float values from [0,1].
-     * To accommodate both the possibilities, we first check if all the thresholdLevels are in
-     * [0,1], and if not, we divide all the levels with 255 to bring them down to the same scale.
-     */
-    private float[] constraintInRangeIfNeeded(float[] thresholdLevels) {
-        if (isAllInRange(thresholdLevels, /* minValueInclusive= */ 0.0f,
-                /* maxValueInclusive= */ 1.0f)) {
-            return thresholdLevels;
-        }
-
-        Slog.w(TAG, "Detected screen thresholdLevels on a deprecated brightness scale");
-        float[] thresholdLevelsScaled = new float[thresholdLevels.length];
-        for (int index = 0; thresholdLevels.length > index; ++index) {
-            thresholdLevelsScaled[index] = thresholdLevels[index] / 255.0f;
-        }
-        return thresholdLevelsScaled;
-    }
-
-    private boolean isAllInRange(float[] configArray, float minValueInclusive,
-            float maxValueInclusive) {
-        for (float v : configArray) {
-            if (v < minValueInclusive || v > maxValueInclusive) {
-                return false;
-            }
-        }
-        return true;
+        Resources res = mContext.getResources();
+        mScreenBrightnessHysteresis =
+                HysteresisLevels.loadDisplayBrightnessConfig(config, res);
+        mScreenBrightnessIdleHysteresis =
+                HysteresisLevels.loadDisplayBrightnessIdleConfig(config, res);
+        mAmbientBrightnessHysteresis =
+                HysteresisLevels.loadAmbientBrightnessConfig(config, res);
+        mAmbientBrightnessIdleHysteresis =
+                HysteresisLevels.loadAmbientBrightnessIdleConfig(config, res);
     }
 
     private boolean thermalStatusIsValid(ThermalStatus value) {
@@ -3471,6 +2871,12 @@
                     throw new RuntimeException("Lux values should be in ascending order in the"
                             + " idle screen refresh rate timeout config");
                 }
+
+                int timeout = point.getTimeout().intValue();
+                if (timeout < 0) {
+                    throw new RuntimeException("The timeout value cannot be negative in"
+                            + " idle screen refresh rate timeout config");
+                }
                 previousLux = newLux;
             }
         }
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 84eebe8..31092f2 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -45,6 +45,9 @@
 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.Secure.RESOLUTION_MODE_FULL;
+import static android.provider.Settings.Secure.RESOLUTION_MODE_HIGH;
+import static android.provider.Settings.Secure.RESOLUTION_MODE_UNKNOWN;
 
 import android.Manifest;
 import android.annotation.EnforcePermission;
@@ -147,6 +150,7 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.display.BrightnessSynchronizer;
+import com.android.internal.foldables.FoldGracePeriodProvider;
 import com.android.internal.foldables.FoldLockSettingAvailabilityProvider;
 import com.android.internal.os.BackgroundThread;
 import com.android.internal.util.ArrayUtils;
@@ -461,10 +465,11 @@
     // May be used outside of the lock but only on the handler thread.
     private final ArrayList<CallbackRecord> mTempCallbacks = new ArrayList<CallbackRecord>();
 
-    // Pending callback records indexed by calling process uid.
+    // Pending callback records indexed by calling process uid and pid.
     // Must be used outside of the lock mSyncRoot and should be selflocked.
     @GuardedBy("mPendingCallbackSelfLocked")
-    public final SparseArray<PendingCallback> mPendingCallbackSelfLocked = new SparseArray<>();
+    public final SparseArray<SparseArray<PendingCallback>> mPendingCallbackSelfLocked =
+            new SparseArray<>();
 
     // Temporary viewports, used when sending new viewport information to the
     // input system.  May be used outside of the lock but only on the handler thread.
@@ -531,6 +536,18 @@
         }
     };
 
+    private final BroadcastReceiver mResolutionRestoreReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (Intent.ACTION_SETTING_RESTORED.equals(intent.getAction())) {
+                if (Settings.Secure.SCREEN_RESOLUTION_MODE.equals(
+                        intent.getExtra(Intent.EXTRA_SETTING_NAME))) {
+                    restoreResolutionFromBackup();
+                }
+            }
+        }
+    };
+
     private final BrightnessSynchronizer mBrightnessSynchronizer;
 
     private final DeviceConfigParameterProvider mConfigParameterProvider;
@@ -560,6 +577,9 @@
     @EnabledSince(targetSdkVersion = android.os.Build.VERSION_CODES.S)
     static final long DISPLAY_MODE_RETURNS_PHYSICAL_REFRESH_RATE = 170503758L;
 
+    private final Uri mScreenResolutionModeUri = Settings.Secure.getUriFor(
+            Settings.Secure.SCREEN_RESOLUTION_MODE);
+
     public DisplayManagerService(Context context) {
         this(context, new Injector());
     }
@@ -577,7 +597,7 @@
         mUiHandler = UiThread.getHandler();
         mDisplayDeviceRepo = new DisplayDeviceRepository(mSyncRoot, mPersistentDataStore);
         mLogicalDisplayMapper = new LogicalDisplayMapper(mContext,
-                foldSettingProvider,
+                foldSettingProvider, new FoldGracePeriodProvider(),
                 mDisplayDeviceRepo, new LogicalDisplayListener(), mSyncRoot, mHandler, mFlags);
         mDisplayModeDirector = new DisplayModeDirector(context, mHandler, mFlags);
         mBrightnessSynchronizer = new BrightnessSynchronizer(mContext,
@@ -737,6 +757,7 @@
             mContext.getSystemService(DeviceStateManager.class).registerCallback(
                     new HandlerExecutor(mHandler), new DeviceStateListener());
 
+            mLogicalDisplayMapper.onWindowManagerReady();
             scheduleTraversalLocked(false);
         }
     }
@@ -782,6 +803,11 @@
 
         mContext.registerReceiver(mIdleModeReceiver, filter);
 
+        if (mFlags.isResolutionBackupRestoreEnabled()) {
+            final IntentFilter restoreFilter = new IntentFilter(Intent.ACTION_SETTING_RESTORED);
+            mContext.registerReceiver(mResolutionRestoreReceiver, restoreFilter);
+        }
+
         mSmallAreaDetectionController = (mFlags.isSmallAreaDetectionEnabled())
                 ? SmallAreaDetectionController.create(mContext) : null;
     }
@@ -988,8 +1014,8 @@
                 }
 
                 // Do we care about this uid?
-                PendingCallback pendingCallback = mPendingCallbackSelfLocked.get(uid);
-                if (pendingCallback == null) {
+                SparseArray<PendingCallback> pendingCallbacks = mPendingCallbackSelfLocked.get(uid);
+                if (pendingCallbacks == null) {
                     return;
                 }
 
@@ -997,7 +1023,12 @@
                 if (DEBUG) {
                     Slog.d(TAG, "Uid " + uid + " becomes " + importance);
                 }
-                pendingCallback.sendPendingDisplayEvent();
+                for (int i = 0; i < pendingCallbacks.size(); i++) {
+                    PendingCallback pendingCallback = pendingCallbacks.valueAt(i);
+                    if (pendingCallback != null) {
+                        pendingCallback.sendPendingDisplayEvent();
+                    }
+                }
                 mPendingCallbackSelfLocked.delete(uid);
             }
         }
@@ -1031,6 +1062,44 @@
                 1, UserHandle.USER_CURRENT) != 0);
     }
 
+    private void restoreResolutionFromBackup() {
+        int savedMode = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                Settings.Secure.SCREEN_RESOLUTION_MODE,
+                RESOLUTION_MODE_UNKNOWN, UserHandle.USER_CURRENT);
+        if (savedMode == RESOLUTION_MODE_UNKNOWN) {
+            // Nothing to restore.
+            return;
+        }
+
+        synchronized (mSyncRoot) {
+            LogicalDisplay display =
+                    mLogicalDisplayMapper.getDisplayLocked(Display.DEFAULT_DISPLAY);
+            DisplayDevice device = display == null ? null : display.getPrimaryDisplayDeviceLocked();
+            if (device == null) {
+                Slog.w(TAG, "No default display device present to restore resolution mode");
+                return;
+            }
+
+            Point[] supportedRes = device.getSupportedResolutionsLocked();
+            if (supportedRes.length != 2) {
+                if (DEBUG) {
+                    Slog.d(TAG, "Skipping resolution restore - " + supportedRes.length);
+                }
+                return;
+            }
+
+            // We follow the same logic as Settings but in reverse. If the display supports 2
+            // resolutions, we treat the small (index=0) one as HIGH and the larger (index=1)
+            // one as FULL and restore the correct resolution accordingly.
+            int index = savedMode == RESOLUTION_MODE_HIGH ? 0 : 1;
+            Point res = supportedRes[index];
+            Display.Mode newMode = new Display.Mode(res.x, res.y, /*refreshRate=*/ 0);
+            Slog.i(TAG, "Restoring resolution from backup: (" + savedMode + ") "
+                    + res.x + "x" + res.y);
+            setUserPreferredDisplayModeInternal(Display.DEFAULT_DISPLAY, newMode);
+        }
+    }
+
     private void updateUserDisabledHdrTypesFromSettingsLocked() {
         mAreUserDisabledHdrTypesAllowed = (Settings.Global.getInt(
                 mContext.getContentResolver(),
@@ -2348,6 +2417,28 @@
         if (displayDevice == null) {
             return;
         }
+
+        // We do not yet support backup and restore for our PersistentDataStore, however, we want to
+        // preserve the user's choice for HIGH/FULL resolution setting, so we when we are given a
+        // a new resolution for the default display (normally stored in PDS), we will also save it
+        // to a setting that is backed up.
+        // TODO(b/330943343) - Consider a full fidelity DisplayBackupHelper for this instead.
+        if (mFlags.isResolutionBackupRestoreEnabled() && displayId == Display.DEFAULT_DISPLAY) {
+            // Checks to see which of the two resolutions is selected
+            // TODO(b/330906790) Uses the same logic as Settings, but should be made to support
+            //     more than two resolutions using explicit mode enums long-term.
+            Point[] resolutions = displayDevice.getSupportedResolutionsLocked();
+            if (resolutions.length == 2) {
+                Point newMode = new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight());
+                int resolutionMode = newMode.equals(resolutions[0]) ? RESOLUTION_MODE_HIGH
+                        : newMode.equals(resolutions[1]) ? RESOLUTION_MODE_FULL
+                        : RESOLUTION_MODE_UNKNOWN;
+                Settings.Secure.putIntForUser(mContext.getContentResolver(),
+                        Settings.Secure.SCREEN_RESOLUTION_MODE, resolutionMode,
+                        UserHandle.USER_CURRENT);
+            }
+        }
+
         displayDevice.setUserPreferredDisplayModeLocked(mode);
     }
 
@@ -3110,16 +3201,23 @@
         for (int i = 0; i < mTempCallbacks.size(); i++) {
             CallbackRecord callbackRecord = mTempCallbacks.get(i);
             final int uid = callbackRecord.mUid;
+            final int pid = callbackRecord.mPid;
             if (isUidCached(uid)) {
                 // For cached apps, save the pending event until it becomes non-cached
                 synchronized (mPendingCallbackSelfLocked) {
-                    PendingCallback pendingCallback = mPendingCallbackSelfLocked.get(uid);
+                    SparseArray<PendingCallback> pendingCallbacks = mPendingCallbackSelfLocked.get(
+                            uid);
                     if (extraLogging(callbackRecord.mPackageName)) {
-                        Slog.i(TAG,
-                                "Uid is cached: " + uid + ", pendingCallback: " + pendingCallback);
+                        Slog.i(TAG, "Uid is cached: " + uid
+                                + ", pendingCallbacks: " + pendingCallbacks);
                     }
+                    if (pendingCallbacks == null) {
+                        pendingCallbacks = new SparseArray<>();
+                        mPendingCallbackSelfLocked.put(uid, pendingCallbacks);
+                    }
+                    PendingCallback pendingCallback = pendingCallbacks.get(pid);
                     if (pendingCallback == null) {
-                        mPendingCallbackSelfLocked.put(uid,
+                        pendingCallbacks.put(pid,
                                 new PendingCallback(callbackRecord, displayId, event));
                     } else {
                         pendingCallback.addDisplayEvent(displayId, event);
diff --git a/services/core/java/com/android/server/display/DisplayOffloadSessionImpl.java b/services/core/java/com/android/server/display/DisplayOffloadSessionImpl.java
index b1defe9..65c9f35 100644
--- a/services/core/java/com/android/server/display/DisplayOffloadSessionImpl.java
+++ b/services/core/java/com/android/server/display/DisplayOffloadSessionImpl.java
@@ -21,6 +21,7 @@
 import android.annotation.Nullable;
 import android.hardware.display.DisplayManagerInternal;
 import android.os.Trace;
+import android.view.Display;
 
 /**
  * An implementation of the offload session that keeps track of whether the session is active.
@@ -42,7 +43,7 @@
 
     @Override
     public void setDozeStateOverride(int displayState) {
-        mDisplayPowerController.overrideDozeScreenState(displayState);
+        mDisplayPowerController.overrideDozeScreenState(displayState, Display.STATE_REASON_OFFLOAD);
     }
 
     @Override
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 90ad8c0..cfdb75f 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -61,6 +61,7 @@
 import android.util.MathUtils;
 import android.util.MutableFloat;
 import android.util.MutableInt;
+import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
 import android.view.Display;
@@ -82,9 +83,10 @@
 import com.android.server.display.brightness.BrightnessUtils;
 import com.android.server.display.brightness.DisplayBrightnessController;
 import com.android.server.display.brightness.clamper.BrightnessClamperController;
-import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy;
+import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy2;
 import com.android.server.display.color.ColorDisplayService.ColorDisplayServiceInternal;
 import com.android.server.display.color.ColorDisplayService.ReduceBrightColorsListener;
+import com.android.server.display.config.HysteresisLevels;
 import com.android.server.display.feature.DisplayManagerFlags;
 import com.android.server.display.layout.Layout;
 import com.android.server.display.state.DisplayStateController;
@@ -438,7 +440,7 @@
 
     // Responsible for evaluating and tracking the automatic brightness relevant states.
     // Todo: This is a temporary workaround. Ideally DPC2 should never talk to the strategies
-    private final AutomaticBrightnessStrategy mAutomaticBrightnessStrategy;
+    private final AutomaticBrightnessStrategy2 mAutomaticBrightnessStrategy;
 
     // A record of state for skipping brightness ramps.
     private int mSkipRampState = RAMP_STATE_SKIP_NONE;
@@ -787,14 +789,14 @@
     }
 
     @Override
-    public void overrideDozeScreenState(int displayState) {
+    public void overrideDozeScreenState(int displayState, @Display.StateReason int reason) {
         mHandler.postAtTime(() -> {
             if (mDisplayOffloadSession == null
                     || !(DisplayOffloadSession.isSupportedOffloadState(displayState)
                     || displayState == Display.STATE_UNKNOWN)) {
                 return;
             }
-            mDisplayStateController.overrideDozeScreenState(displayState);
+            mDisplayStateController.overrideDozeScreenState(displayState, reason);
             sendUpdatePowerState();
         }, mClock.uptimeMillis());
     }
@@ -974,7 +976,7 @@
                 && mAutomaticBrightnessController.isInIdleMode());
         mScreenBrightnessRampAnimator.setListener(mRampAnimatorListener);
 
-        noteScreenState(mPowerState.getScreenState());
+        noteScreenState(mPowerState.getScreenState(), Display.STATE_REASON_DEFAULT_POLICY);
         noteScreenBrightness(mPowerState.getScreenBrightness());
 
         // Initialize all of the brightness tracking state
@@ -1049,76 +1051,20 @@
 
         if (defaultModeBrightnessMapper != null) {
             // Ambient Lux - Active Mode Brightness Thresholds
-            float[] ambientBrighteningThresholds =
-                    mDisplayDeviceConfig.getAmbientBrighteningPercentages();
-            float[] ambientDarkeningThresholds =
-                    mDisplayDeviceConfig.getAmbientDarkeningPercentages();
-            float[] ambientBrighteningLevels =
-                    mDisplayDeviceConfig.getAmbientBrighteningLevels();
-            float[] ambientDarkeningLevels =
-                    mDisplayDeviceConfig.getAmbientDarkeningLevels();
-            float ambientDarkeningMinThreshold =
-                    mDisplayDeviceConfig.getAmbientLuxDarkeningMinThreshold();
-            float ambientBrighteningMinThreshold =
-                    mDisplayDeviceConfig.getAmbientLuxBrighteningMinThreshold();
-            HysteresisLevels ambientBrightnessThresholds = mInjector.getHysteresisLevels(
-                    ambientBrighteningThresholds, ambientDarkeningThresholds,
-                    ambientBrighteningLevels, ambientDarkeningLevels, ambientDarkeningMinThreshold,
-                    ambientBrighteningMinThreshold);
+            HysteresisLevels ambientBrightnessThresholds =
+                    mDisplayDeviceConfig.getAmbientBrightnessHysteresis();
 
             // Display - Active Mode Brightness Thresholds
-            float[] screenBrighteningThresholds =
-                    mDisplayDeviceConfig.getScreenBrighteningPercentages();
-            float[] screenDarkeningThresholds =
-                    mDisplayDeviceConfig.getScreenDarkeningPercentages();
-            float[] screenBrighteningLevels =
-                    mDisplayDeviceConfig.getScreenBrighteningLevels();
-            float[] screenDarkeningLevels =
-                    mDisplayDeviceConfig.getScreenDarkeningLevels();
-            float screenDarkeningMinThreshold =
-                    mDisplayDeviceConfig.getScreenDarkeningMinThreshold();
-            float screenBrighteningMinThreshold =
-                    mDisplayDeviceConfig.getScreenBrighteningMinThreshold();
-            HysteresisLevels screenBrightnessThresholds = mInjector.getHysteresisLevels(
-                    screenBrighteningThresholds, screenDarkeningThresholds,
-                    screenBrighteningLevels, screenDarkeningLevels, screenDarkeningMinThreshold,
-                    screenBrighteningMinThreshold, true);
+            HysteresisLevels screenBrightnessThresholds =
+                    mDisplayDeviceConfig.getScreenBrightnessHysteresis();
 
             // Ambient Lux - Idle Screen Brightness Thresholds
-            float ambientDarkeningMinThresholdIdle =
-                    mDisplayDeviceConfig.getAmbientLuxDarkeningMinThresholdIdle();
-            float ambientBrighteningMinThresholdIdle =
-                    mDisplayDeviceConfig.getAmbientLuxBrighteningMinThresholdIdle();
-            float[] ambientBrighteningThresholdsIdle =
-                    mDisplayDeviceConfig.getAmbientBrighteningPercentagesIdle();
-            float[] ambientDarkeningThresholdsIdle =
-                    mDisplayDeviceConfig.getAmbientDarkeningPercentagesIdle();
-            float[] ambientBrighteningLevelsIdle =
-                    mDisplayDeviceConfig.getAmbientBrighteningLevelsIdle();
-            float[] ambientDarkeningLevelsIdle =
-                    mDisplayDeviceConfig.getAmbientDarkeningLevelsIdle();
-            HysteresisLevels ambientBrightnessThresholdsIdle = mInjector.getHysteresisLevels(
-                    ambientBrighteningThresholdsIdle, ambientDarkeningThresholdsIdle,
-                    ambientBrighteningLevelsIdle, ambientDarkeningLevelsIdle,
-                    ambientDarkeningMinThresholdIdle, ambientBrighteningMinThresholdIdle);
+            HysteresisLevels ambientBrightnessThresholdsIdle =
+                    mDisplayDeviceConfig.getAmbientBrightnessIdleHysteresis();
 
             // Display - Idle Screen Brightness Thresholds
-            float screenDarkeningMinThresholdIdle =
-                    mDisplayDeviceConfig.getScreenDarkeningMinThresholdIdle();
-            float screenBrighteningMinThresholdIdle =
-                    mDisplayDeviceConfig.getScreenBrighteningMinThresholdIdle();
-            float[] screenBrighteningThresholdsIdle =
-                    mDisplayDeviceConfig.getScreenBrighteningPercentagesIdle();
-            float[] screenDarkeningThresholdsIdle =
-                    mDisplayDeviceConfig.getScreenDarkeningPercentagesIdle();
-            float[] screenBrighteningLevelsIdle =
-                    mDisplayDeviceConfig.getScreenBrighteningLevelsIdle();
-            float[] screenDarkeningLevelsIdle =
-                    mDisplayDeviceConfig.getScreenDarkeningLevelsIdle();
-            HysteresisLevels screenBrightnessThresholdsIdle = mInjector.getHysteresisLevels(
-                    screenBrighteningThresholdsIdle, screenDarkeningThresholdsIdle,
-                    screenBrighteningLevelsIdle, screenDarkeningLevelsIdle,
-                    screenDarkeningMinThresholdIdle, screenBrighteningMinThresholdIdle);
+            HysteresisLevels screenBrightnessThresholdsIdle =
+                    mDisplayDeviceConfig.getScreenBrightnessIdleHysteresis();
 
             long brighteningLightDebounce = mDisplayDeviceConfig
                     .getAutoBrightnessBrighteningLightDebounce();
@@ -1366,8 +1312,10 @@
             displayBrightnessFollowers = mDisplayBrightnessFollowers.clone();
         }
 
-        int state = mDisplayStateController
-                .updateDisplayState(mPowerRequest, mIsEnabled, mIsInTransition);
+        final Pair<Integer, Integer> stateAndReason =
+                mDisplayStateController
+                        .updateDisplayState(mPowerRequest, mIsEnabled, mIsInTransition);
+        int state = stateAndReason.first;
 
         // Initialize things the first time the power state is changed.
         if (mustInitialize) {
@@ -1377,7 +1325,9 @@
         // Animate the screen state change unless already animating.
         // The transition may be deferred, so after this point we will use the
         // actual state instead of the desired one.
-        animateScreenStateChange(state, mDisplayStateController.shouldPerformScreenOffTransition());
+        animateScreenStateChange(
+                state, /* reason= */ stateAndReason.second,
+                mDisplayStateController.shouldPerformScreenOffTransition());
         state = mPowerState.getScreenState();
 
         // Switch to doze auto-brightness mode if needed
@@ -1387,9 +1337,6 @@
                     ? AUTO_BRIGHTNESS_MODE_DOZE : AUTO_BRIGHTNESS_MODE_DEFAULT);
         }
 
-        final boolean userSetBrightnessChanged = mDisplayBrightnessController
-                .updateUserSetScreenBrightness();
-
         DisplayBrightnessState displayBrightnessState = mDisplayBrightnessController
                 .updateBrightness(mPowerRequest, state);
         float brightnessState = displayBrightnessState.getBrightness();
@@ -1398,7 +1345,11 @@
         boolean slowChange = displayBrightnessState.isSlowChange();
         // custom transition duration
         float customAnimationRate = displayBrightnessState.getCustomAnimationRate();
-
+        final boolean userSetBrightnessChanged =
+                mDisplayBrightnessController.getIsUserSetScreenBrightnessUpdated();
+        if (displayBrightnessState.getBrightnessEvent() != null) {
+            mTempBrightnessEvent.copyFrom(displayBrightnessState.getBrightnessEvent());
+        }
         // Set up the ScreenOff controller used when coming out of SCREEN_OFF and the ALS sensor
         // doesn't yet have a valid lux value to use with auto-brightness.
         if (mScreenOffBrightnessSensorController != null) {
@@ -1414,11 +1365,13 @@
         // request changes.
         final boolean wasShortTermModelActive =
                 mAutomaticBrightnessStrategy.isShortTermModelActive();
-        mAutomaticBrightnessStrategy.setAutoBrightnessState(state,
-                mDisplayBrightnessController.isAllowAutoBrightnessWhileDozingConfig(),
-                mBrightnessReasonTemp.getReason(), mPowerRequest.policy,
-                mDisplayBrightnessController.getLastUserSetScreenBrightness(),
-                userSetBrightnessChanged);
+        if (!mFlags.isRefactorDisplayPowerControllerEnabled()) {
+            mAutomaticBrightnessStrategy.setAutoBrightnessState(state,
+                    mDisplayBrightnessController.isAllowAutoBrightnessWhileDozingConfig(),
+                    mBrightnessReasonTemp.getReason(), mPowerRequest.policy,
+                    mDisplayBrightnessController.getLastUserSetScreenBrightness(),
+                    userSetBrightnessChanged);
+        }
 
         // If the brightness is already set then it's been overridden by something other than the
         // user, or is a temporary adjustment.
@@ -1426,21 +1379,36 @@
                 && (mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentChanged()
                 || userSetBrightnessChanged);
 
-        mBrightnessRangeController.setAutoBrightnessEnabled(
-                mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()
+        final int autoBrightnessState = mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()
                 ? AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED
                 : mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff()
                         ? AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE
-                        : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED);
+                        : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED;
+
+        mBrightnessRangeController.setAutoBrightnessEnabled(autoBrightnessState);
+        mBrightnessClamperController.setAutoBrightnessState(autoBrightnessState);
 
         boolean updateScreenBrightnessSetting =
                 displayBrightnessState.shouldUpdateScreenBrightnessSetting();
         float currentBrightnessSetting = mDisplayBrightnessController.getCurrentBrightness();
         // Apply auto-brightness.
         int brightnessAdjustmentFlags = 0;
+        // All the conditions inside this if block will be moved to AutomaticBrightnessStrategy
+        if (mFlags.isRefactorDisplayPowerControllerEnabled()
+                && displayBrightnessState.getBrightnessReason().getReason()
+                        == BrightnessReason.REASON_AUTOMATIC) {
+            brightnessAdjustmentFlags =
+                    mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentReasonsFlags();
+            updateScreenBrightnessSetting = currentBrightnessSetting != brightnessState;
+            mBrightnessReasonTemp.setReason(BrightnessReason.REASON_AUTOMATIC);
+            if (mScreenOffBrightnessSensorController != null) {
+                mScreenOffBrightnessSensorController.setLightSensorEnabled(false);
+            }
+            setBrightnessFromOffload(PowerManager.BRIGHTNESS_INVALID_FLOAT);
+        }
         // AutomaticBrightnessStrategy has higher priority than OffloadBrightnessStrategy
-        if (Float.isNaN(brightnessState)
-                || mBrightnessReasonTemp.getReason() == BrightnessReason.REASON_OFFLOAD) {
+        if (!mFlags.isRefactorDisplayPowerControllerEnabled() && (Float.isNaN(brightnessState)
+                || mBrightnessReasonTemp.getReason() == BrightnessReason.REASON_OFFLOAD)) {
             if (mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()) {
                 brightnessState = mAutomaticBrightnessStrategy.getAutomaticScreenBrightness(
                         mTempBrightnessEvent);
@@ -1470,8 +1438,8 @@
             }
         } else {
             // Any non-auto-brightness values such as override or temporary should still be subject
-            // to clamping so that they don't go beyond the current max as specified by HBM
-            // Controller.
+            // to clamping so that they don't go beyond the current max as specified by Brightness
+            // Range Controller.
             brightnessState = clampScreenBrightness(brightnessState);
             mAutomaticBrightnessStrategy.setAutoBrightnessApplied(false);
         }
@@ -2112,11 +2080,11 @@
                 Trace.TRACE_TAG_POWER, SCREEN_ON_BLOCKED_BY_DISPLAYOFFLOAD_TRACE_NAME, 0);
     }
 
-    private boolean setScreenState(int state) {
-        return setScreenState(state, false /*reportOnly*/);
+    private boolean setScreenState(int state, @Display.StateReason int reason) {
+        return setScreenState(state, reason, false /*reportOnly*/);
     }
 
-    private boolean setScreenState(int state, boolean reportOnly) {
+    private boolean setScreenState(int state, @Display.StateReason int reason, boolean reportOnly) {
         final boolean isOff = (state == Display.STATE_OFF);
         final boolean isOn = (state == Display.STATE_ON);
         final boolean changed = mPowerState.getScreenState() != state;
@@ -2163,9 +2131,9 @@
                             + " value=" + propertyValue + " " + e.getMessage());
                 }
 
-                mPowerState.setScreenState(state);
+                mPowerState.setScreenState(state, reason);
                 // Tell battery stats about the transition.
-                noteScreenState(state);
+                noteScreenState(state, reason);
             }
         }
 
@@ -2262,7 +2230,8 @@
         }
     }
 
-    private void animateScreenStateChange(int target, boolean performScreenOffTransition) {
+    private void animateScreenStateChange(
+            int target, @Display.StateReason int reason, boolean performScreenOffTransition) {
         // If there is already an animation in progress, don't interfere with it.
         if (mColorFadeEnabled
                 && (mColorFadeOnAnimator.isStarted() || mColorFadeOffAnimator.isStarted())) {
@@ -2288,14 +2257,14 @@
             // display has turned off so it can prepare the appropriate power on animation, but we
             // don't want to actually transition to the fully off state since that takes
             // significantly longer to transition from.
-            setScreenState(Display.STATE_OFF, target != Display.STATE_OFF /*reportOnly*/);
+            setScreenState(Display.STATE_OFF, reason, target != Display.STATE_OFF /*reportOnly*/);
         }
 
         // If we were in the process of turning off the screen but didn't quite
         // finish.  Then finish up now to prevent a jarring transition back
         // to screen on if we skipped blocking screen on as usual.
         if (mPendingScreenOff && target != Display.STATE_OFF) {
-            setScreenState(Display.STATE_OFF);
+            setScreenState(Display.STATE_OFF, reason);
             mPendingScreenOff = false;
             mPowerState.dismissColorFadeResources();
         }
@@ -2304,7 +2273,7 @@
             // Want screen on.  The contents of the screen may not yet
             // be visible if the color fade has not been dismissed because
             // its last frame of animation is solid black.
-            if (!setScreenState(Display.STATE_ON)) {
+            if (!setScreenState(Display.STATE_ON, reason)) {
                 return; // screen on blocked
             }
             if (USE_COLOR_FADE_ON_ANIMATION && mColorFadeEnabled && mPowerRequest.isBrightOrDim()) {
@@ -2334,7 +2303,7 @@
             }
 
             // Set screen state.
-            if (!setScreenState(Display.STATE_DOZE)) {
+            if (!setScreenState(Display.STATE_DOZE, reason)) {
                 return; // screen on blocked
             }
 
@@ -2353,10 +2322,10 @@
             // If not already suspending, temporarily set the state to doze until the
             // screen on is unblocked, then suspend.
             if (mPowerState.getScreenState() != Display.STATE_DOZE_SUSPEND) {
-                if (!setScreenState(Display.STATE_DOZE)) {
+                if (!setScreenState(Display.STATE_DOZE, reason)) {
                     return; // screen on blocked
                 }
-                setScreenState(Display.STATE_DOZE_SUSPEND); // already on so can't block
+                setScreenState(Display.STATE_DOZE_SUSPEND, reason); // already on so can't block
             }
 
             // Dismiss the black surface without fanfare.
@@ -2374,10 +2343,10 @@
             // If not already suspending, temporarily set the state to on until the
             // screen on is unblocked, then suspend.
             if (mPowerState.getScreenState() != Display.STATE_ON_SUSPEND) {
-                if (!setScreenState(Display.STATE_ON)) {
+                if (!setScreenState(Display.STATE_ON, reason)) {
                     return;
                 }
-                setScreenState(Display.STATE_ON_SUSPEND);
+                setScreenState(Display.STATE_ON_SUSPEND, reason);
             }
 
             // Dismiss the black surface without fanfare.
@@ -2393,7 +2362,7 @@
             if (mPowerState.getColorFadeLevel() == 0.0f) {
                 // Turn the screen off.
                 // A black surface is already hiding the contents of the screen.
-                setScreenState(Display.STATE_OFF);
+                setScreenState(Display.STATE_OFF, reason);
                 mPendingScreenOff = false;
                 mPowerState.dismissColorFadeResources();
             } else if (performScreenOffTransition
@@ -2755,10 +2724,10 @@
     }
 
 
-    private void noteScreenState(int screenState) {
+    private void noteScreenState(int screenState, @Display.StateReason int reason) {
         // Log screen state change with display id
         FrameworkStatsLog.write(FrameworkStatsLog.SCREEN_STATE_CHANGED_V2,
-                screenState, mDisplayStatsId);
+                screenState, mDisplayStatsId, reason);
         if (mBatteryStats != null) {
             try {
                 // TODO(multi-display): make this multi-display
@@ -3200,25 +3169,6 @@
                     AUTO_BRIGHTNESS_MODE_DEFAULT, displayWhiteBalanceController);
         }
 
-        HysteresisLevels getHysteresisLevels(float[] brighteningThresholdsPercentages,
-                float[] darkeningThresholdsPercentages, float[] brighteningThresholdLevels,
-                float[] darkeningThresholdLevels, float minDarkeningThreshold,
-                float minBrighteningThreshold) {
-            return new HysteresisLevels(brighteningThresholdsPercentages,
-                    darkeningThresholdsPercentages, brighteningThresholdLevels,
-                    darkeningThresholdLevels, minDarkeningThreshold, minBrighteningThreshold);
-        }
-
-        HysteresisLevels getHysteresisLevels(float[] brighteningThresholdsPercentages,
-                float[] darkeningThresholdsPercentages, float[] brighteningThresholdLevels,
-                float[] darkeningThresholdLevels, float minDarkeningThreshold,
-                float minBrighteningThreshold, boolean potentialOldBrightnessRange) {
-            return new HysteresisLevels(brighteningThresholdsPercentages,
-                    darkeningThresholdsPercentages, brighteningThresholdLevels,
-                    darkeningThresholdLevels, minDarkeningThreshold, minBrighteningThreshold,
-                    potentialOldBrightnessRange);
-        }
-
         ScreenOffBrightnessSensorController getScreenOffBrightnessSensorController(
                 SensorManager sensorManager,
                 Sensor lightSensor,
diff --git a/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java b/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java
index 408d610..d28578a 100644
--- a/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java
+++ b/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java
@@ -23,6 +23,7 @@
 import android.hardware.display.BrightnessInfo;
 import android.hardware.display.DisplayManagerInternal;
 import android.os.PowerManager;
+import android.view.Display;
 
 import java.io.PrintWriter;
 
@@ -137,7 +138,13 @@
     boolean requestPowerState(DisplayManagerInternal.DisplayPowerRequest request,
             boolean waitForNegativeProximity);
 
-    void overrideDozeScreenState(int displayState);
+    /**
+     * Overrides the current doze screen state.
+     *
+     * @param displayState the new doze display state.
+     * @param reason the reason behind the new doze display state.
+     */
+    void overrideDozeScreenState(int displayState, @Display.StateReason int reason);
 
     void setDisplayOffloadSession(DisplayManagerInternal.DisplayOffloadSession session);
 
diff --git a/services/core/java/com/android/server/display/DisplayPowerState.java b/services/core/java/com/android/server/display/DisplayPowerState.java
index 90bad12..e5efebc 100644
--- a/services/core/java/com/android/server/display/DisplayPowerState.java
+++ b/services/core/java/com/android/server/display/DisplayPowerState.java
@@ -159,12 +159,13 @@
     /**
      * Sets whether the screen is on, off, or dozing.
      */
-    public void setScreenState(int state) {
+    public void setScreenState(int state, @Display.StateReason int reason) {
         if (mScreenState != state) {
             if (DEBUG) {
-                Slog.w(TAG, "setScreenState: state=" + Display.stateToString(state));
+                Slog.w(TAG,
+                        "setScreenState: state=" + Display.stateToString(state)
+                        + "; reason=" + Display.stateReasonToString(reason));
             }
-
             mScreenState = state;
             mScreenReady = false;
             scheduleScreenUpdate();
diff --git a/services/core/java/com/android/server/display/ExternalDisplayPolicy.java b/services/core/java/com/android/server/display/ExternalDisplayPolicy.java
index a12d248..b24caf4 100644
--- a/services/core/java/com/android/server/display/ExternalDisplayPolicy.java
+++ b/services/core/java/com/android/server/display/ExternalDisplayPolicy.java
@@ -222,7 +222,7 @@
         } else {
             // As external display is enabled by default, need to disable it now.
             // TODO(b/292196201) Remove when the display can be disabled before DPC is created.
-            logicalDisplay.setEnabledLocked(false);
+            mLogicalDisplayMapper.setDisplayEnabledLocked(logicalDisplay, false);
         }
 
         if (!isExternalDisplayAllowed()) {
diff --git a/services/core/java/com/android/server/display/HysteresisLevels.java b/services/core/java/com/android/server/display/HysteresisLevels.java
deleted file mode 100644
index 0521b8a..0000000
--- a/services/core/java/com/android/server/display/HysteresisLevels.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.Slog;
-
-import com.android.server.display.utils.DebugUtils;
-
-import java.io.PrintWriter;
-import java.util.Arrays;
-
-/**
- * A helper class for handling access to illuminance hysteresis level values.
- */
-public class HysteresisLevels {
-    private static final String TAG = "HysteresisLevels";
-
-    // To enable these logs, run:
-    // 'adb shell setprop persist.log.tag.HysteresisLevels DEBUG && adb reboot'
-    private static final boolean DEBUG = DebugUtils.isDebuggable(TAG);
-
-    private final float[] mBrighteningThresholdsPercentages;
-    private final float[] mDarkeningThresholdsPercentages;
-    private final float[] mBrighteningThresholdLevels;
-    private final float[] mDarkeningThresholdLevels;
-    private final float mMinDarkening;
-    private final float mMinBrightening;
-
-    /**
-     * Creates a {@code HysteresisLevels} object with the given equal-length
-     * float arrays.
-     * @param brighteningThresholdsPercentages 0-100 of thresholds
-     * @param darkeningThresholdsPercentages 0-100 of thresholds
-     * @param brighteningThresholdLevels float array of brightness values in the relevant units
-     * @param minBrighteningThreshold the minimum value for which the brightening value needs to
-     *                                return.
-     * @param minDarkeningThreshold the minimum value for which the darkening value needs to return.
-     * @param potentialOldBrightnessRange whether or not the values used could be from the old
-     *                                    screen brightness range ie, between 1-255.
-    */
-    HysteresisLevels(float[] brighteningThresholdsPercentages,
-            float[] darkeningThresholdsPercentages,
-            float[] brighteningThresholdLevels, float[] darkeningThresholdLevels,
-            float minDarkeningThreshold, float minBrighteningThreshold,
-            boolean potentialOldBrightnessRange) {
-        if (brighteningThresholdsPercentages.length != brighteningThresholdLevels.length
-                || darkeningThresholdsPercentages.length != darkeningThresholdLevels.length) {
-            throw new IllegalArgumentException("Mismatch between hysteresis array lengths.");
-        }
-        mBrighteningThresholdsPercentages =
-                setArrayFormat(brighteningThresholdsPercentages, 100.0f);
-        mDarkeningThresholdsPercentages =
-                setArrayFormat(darkeningThresholdsPercentages, 100.0f);
-        mBrighteningThresholdLevels = setArrayFormat(brighteningThresholdLevels, 1.0f);
-        mDarkeningThresholdLevels = setArrayFormat(darkeningThresholdLevels, 1.0f);
-        mMinDarkening = minDarkeningThreshold;
-        mMinBrightening = minBrighteningThreshold;
-    }
-
-    HysteresisLevels(float[] brighteningThresholdsPercentages,
-            float[] darkeningThresholdsPercentages,
-            float[] brighteningThresholdLevels, float[] darkeningThresholdLevels,
-            float minDarkeningThreshold, float minBrighteningThreshold) {
-        this(brighteningThresholdsPercentages, darkeningThresholdsPercentages,
-                brighteningThresholdLevels, darkeningThresholdLevels, minDarkeningThreshold,
-                minBrighteningThreshold, false);
-    }
-
-    /**
-     * Return the brightening hysteresis threshold for the given value level.
-     */
-    public float getBrighteningThreshold(float value) {
-        final float brightConstant = getReferenceLevel(value,
-                mBrighteningThresholdLevels, mBrighteningThresholdsPercentages);
-
-        float brightThreshold = value * (1.0f + brightConstant);
-        if (DEBUG) {
-            Slog.d(TAG, "bright hysteresis constant=" + brightConstant + ", threshold="
-                    + brightThreshold + ", value=" + value);
-        }
-
-        brightThreshold = Math.max(brightThreshold, value + mMinBrightening);
-        return brightThreshold;
-    }
-
-    /**
-     * Return the darkening hysteresis threshold for the given value level.
-     */
-    public float getDarkeningThreshold(float value) {
-        final float darkConstant = getReferenceLevel(value,
-                mDarkeningThresholdLevels, mDarkeningThresholdsPercentages);
-        float darkThreshold = value * (1.0f - darkConstant);
-        if (DEBUG) {
-            Slog.d(TAG, "dark hysteresis constant=: " + darkConstant + ", threshold="
-                    + darkThreshold + ", value=" + value);
-        }
-        darkThreshold = Math.min(darkThreshold, value - mMinDarkening);
-        return Math.max(darkThreshold, 0.0f);
-    }
-
-    /**
-     * Return the hysteresis constant for the closest threshold value from the given array.
-     */
-    private float getReferenceLevel(float value, float[] thresholdLevels,
-            float[] thresholdPercentages) {
-        if (thresholdLevels == null || thresholdLevels.length == 0 || value < thresholdLevels[0]) {
-            return 0.0f;
-        }
-        int index = 0;
-        while (index < thresholdLevels.length - 1 && value >= thresholdLevels[index + 1]) {
-            index++;
-        }
-        return thresholdPercentages[index];
-    }
-
-    /**
-     * Return a float array where each i-th element equals {@code configArray[i]/divideFactor}.
-     */
-    private float[] setArrayFormat(float[] configArray, float divideFactor) {
-        float[] levelArray = new float[configArray.length];
-        for (int index = 0; levelArray.length > index; ++index) {
-            levelArray[index] = configArray[index] / divideFactor;
-        }
-        return levelArray;
-    }
-
-    void dump(PrintWriter pw) {
-        pw.println("HysteresisLevels");
-        pw.println("  mBrighteningThresholdLevels=" + Arrays.toString(mBrighteningThresholdLevels));
-        pw.println("  mBrighteningThresholdsPercentages="
-                + Arrays.toString(mBrighteningThresholdsPercentages));
-        pw.println("  mMinBrightening=" + mMinBrightening);
-        pw.println("  mDarkeningThresholdLevels=" + Arrays.toString(mDarkeningThresholdLevels));
-        pw.println("  mDarkeningThresholdsPercentages="
-                + Arrays.toString(mDarkeningThresholdsPercentages));
-        pw.println("  mMinDarkening=" + mMinDarkening);
-    }
-}
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 3b3a03b..182b05a 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -53,6 +53,7 @@
 import com.android.internal.display.BrightnessSynchronizer;
 import com.android.internal.util.function.pooled.PooledLambda;
 import com.android.server.LocalServices;
+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;
@@ -81,11 +82,8 @@
     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 = 70.0f; // not too dim yet.
+    private static final float EVEN_DIMMER_MAX_STRENGTH = 90.0f;
     private static final float BRIGHTNESS_MIN = 0.0f;
-    // The brightness at which we start using color matrices rather than backlight,
-    // to dim the display
-    private static final float BACKLIGHT_COLOR_TRANSITION_POINT = 0.1f;
 
     private final LongSparseArray<LocalDisplayDevice> mDevices = new LongSparseArray<>();
 
@@ -100,6 +98,7 @@
     private Context mOverlayContext;
 
     private int mEvenDimmerStrength = -1;
+    private ColorDisplayService.ColorDisplayServiceInternal mCdsi;
 
     // Called with SyncRoot lock held.
     LocalDisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context,
@@ -938,7 +937,9 @@
                             final float nits = backlightToNits(backlight);
                             final float sdrNits = backlightToNits(sdrBacklight);
 
-                            if (getFeatureFlags().isEvenDimmerEnabled()) {
+                            if (getFeatureFlags().isEvenDimmerEnabled()
+                                    && mDisplayDeviceConfig != null
+                                    && mDisplayDeviceConfig.isEvenDimmerAvailable()) {
                                 applyColorMatrixBasedDimming(brightnessState);
                             }
 
@@ -991,18 +992,27 @@
 
                     private void applyColorMatrixBasedDimming(float brightnessState) {
                         int strength = (int) (MathUtils.constrainedMap(
-                                EVEN_DIMMER_MAX_STRENGTH, EVEN_DIMMER_MIN_STRENGTH, // to this range
-                                BRIGHTNESS_MIN, BACKLIGHT_COLOR_TRANSITION_POINT, // from this range
-                                brightnessState) + 0.5); // map this (+ rounded up)
+                                // 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;
 
-                        // TODO: use `enabled` and `mRbcStrength` to set color matrices here
-                        // TODO: boolean enabled = mEvenDimmerStrength > 0.0f;
+                        if (mCdsi == null) {
+                            mCdsi = LocalServices.getService(
+                                    ColorDisplayService.ColorDisplayServiceInternal.class);
+                        }
+                        if (mCdsi != null) {
+                            mCdsi.applyEvenDimmerColorChanges(enabled, strength);
+                        }
                     }
                 };
             }
@@ -1103,7 +1113,8 @@
                         new SurfaceControl.DesiredDisplayModeSpecs(baseSfModeId,
                                 mDisplayModeSpecs.allowGroupSwitching,
                                 mDisplayModeSpecs.primary,
-                                mDisplayModeSpecs.appRequest)));
+                                mDisplayModeSpecs.appRequest,
+                                mDisplayModeSpecs.mIdleScreenRefreshRateConfig)));
             }
         }
 
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index 22e4bc5..189e366 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -482,7 +482,8 @@
             int maskedWidth = deviceInfo.width - maskingInsets.left - maskingInsets.right;
             int maskedHeight = deviceInfo.height - maskingInsets.top - maskingInsets.bottom;
 
-            if (mIsAnisotropyCorrectionEnabled && deviceInfo.xDpi > 0 && deviceInfo.yDpi > 0) {
+            if (mIsAnisotropyCorrectionEnabled && deviceInfo.type == Display.TYPE_EXTERNAL
+                        && deviceInfo.xDpi > 0 && deviceInfo.yDpi > 0) {
                 if (deviceInfo.xDpi > deviceInfo.yDpi * DisplayDevice.MAX_ANISOTROPY) {
                     maskedHeight = (int) (maskedHeight * deviceInfo.xDpi / deviceInfo.yDpi + 0.5);
                 } else if (deviceInfo.xDpi * DisplayDevice.MAX_ANISOTROPY < deviceInfo.yDpi) {
@@ -711,8 +712,8 @@
         var displayLogicalWidth = displayInfo.logicalWidth;
         var displayLogicalHeight = displayInfo.logicalHeight;
 
-        if (mIsAnisotropyCorrectionEnabled && displayDeviceInfo.xDpi > 0
-                    && displayDeviceInfo.yDpi > 0) {
+        if (mIsAnisotropyCorrectionEnabled && displayDeviceInfo.type == Display.TYPE_EXTERNAL
+                    && displayDeviceInfo.xDpi > 0 && displayDeviceInfo.yDpi > 0) {
             if (displayDeviceInfo.xDpi > displayDeviceInfo.yDpi * DisplayDevice.MAX_ANISOTROPY) {
                 var scalingFactor = displayDeviceInfo.yDpi / displayDeviceInfo.xDpi;
                 if (rotated) {
diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
index f727eac..bca53cf 100644
--- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java
+++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
@@ -40,10 +40,13 @@
 import android.view.DisplayInfo;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.foldables.FoldGracePeriodProvider;
+import com.android.server.LocalServices;
 import com.android.server.display.feature.DisplayManagerFlags;
 import com.android.server.display.layout.DisplayIdProducer;
 import com.android.server.display.layout.Layout;
 import com.android.server.display.utils.DebugUtils;
+import com.android.server.policy.WindowManagerPolicy;
 import com.android.server.utils.FoldSettingProvider;
 
 import java.io.PrintWriter;
@@ -120,7 +123,7 @@
     /**
      * Sleep the device when transitioning into these device state.
      */
-    private final SparseBooleanArray mDeviceStatesOnWhichToSleep;
+    private final SparseBooleanArray mDeviceStatesOnWhichToSelectiveSleep;
 
     /**
      * Map of all logical displays indexed by logical display id.
@@ -153,6 +156,7 @@
     private final DisplayManagerService.SyncRoot mSyncRoot;
     private final LogicalDisplayMapperHandler mHandler;
     private final FoldSettingProvider mFoldSettingProvider;
+    private final FoldGracePeriodProvider mFoldGracePeriodProvider;
     private final PowerManager mPowerManager;
 
     /**
@@ -187,6 +191,7 @@
      * #updateLogicalDisplaysLocked} to establish which Virtual Devices own which Virtual Displays.
      */
     private final ArrayMap<String, Integer> mVirtualDeviceDisplayMapping = new ArrayMap<>();
+    private WindowManagerPolicy mWindowManagerPolicy;
 
     private int mNextNonDefaultGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;
     private final DisplayIdProducer mIdProducer = (isDefault) ->
@@ -201,15 +206,18 @@
     private final DisplayManagerFlags mFlags;
 
     LogicalDisplayMapper(@NonNull Context context, FoldSettingProvider foldSettingProvider,
+            FoldGracePeriodProvider foldGracePeriodProvider,
             @NonNull DisplayDeviceRepository repo,
             @NonNull Listener listener, @NonNull DisplayManagerService.SyncRoot syncRoot,
             @NonNull Handler handler, DisplayManagerFlags flags) {
-        this(context, foldSettingProvider, repo, listener, syncRoot, handler,
+        this(context, foldSettingProvider, foldGracePeriodProvider, repo, listener, syncRoot,
+                handler,
                 new DeviceStateToLayoutMap((isDefault) -> isDefault ? DEFAULT_DISPLAY
                         : sNextNonDefaultDisplayId++, flags), flags);
     }
 
     LogicalDisplayMapper(@NonNull Context context, FoldSettingProvider foldSettingProvider,
+            FoldGracePeriodProvider foldGracePeriodProvider,
             @NonNull DisplayDeviceRepository repo,
             @NonNull Listener listener, @NonNull DisplayManagerService.SyncRoot syncRoot,
             @NonNull Handler handler, @NonNull DeviceStateToLayoutMap deviceStateToLayoutMap,
@@ -221,13 +229,15 @@
         mDisplayDeviceRepo = repo;
         mListener = listener;
         mFoldSettingProvider = foldSettingProvider;
+        mFoldGracePeriodProvider = foldGracePeriodProvider;
         mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false);
         mSupportsConcurrentInternalDisplays = context.getResources().getBoolean(
                 com.android.internal.R.bool.config_supportsConcurrentInternalDisplays);
         mDeviceStatesOnWhichToWakeUp = toSparseBooleanArray(context.getResources().getIntArray(
                 com.android.internal.R.array.config_deviceStatesOnWhichToWakeUp));
-        mDeviceStatesOnWhichToSleep = toSparseBooleanArray(context.getResources().getIntArray(
-                com.android.internal.R.array.config_deviceStatesOnWhichToSleep));
+        mDeviceStatesOnWhichToSelectiveSleep = toSparseBooleanArray(
+                context.getResources().getIntArray(
+                        com.android.internal.R.array.config_deviceStatesOnWhichToSleep));
         mDisplayDeviceRepo.addListener(this);
         mDeviceStateToLayoutMap = deviceStateToLayoutMap;
         mFlags = flags;
@@ -267,6 +277,10 @@
         mListener.onTraversalRequested();
     }
 
+    public void onWindowManagerReady() {
+        mWindowManagerPolicy = LocalServices.getService(WindowManagerPolicy.class);
+    }
+
     public LogicalDisplay getDisplayLocked(int displayId) {
         return getDisplayLocked(displayId, /* includeDisabled= */ true);
     }
@@ -404,7 +418,7 @@
         ipw.println("mSingleDisplayDemoMode=" + mSingleDisplayDemoMode);
         ipw.println("mCurrentLayout=" + mCurrentLayout);
         ipw.println("mDeviceStatesOnWhichToWakeUp=" + mDeviceStatesOnWhichToWakeUp);
-        ipw.println("mDeviceStatesOnWhichToSleep=" + mDeviceStatesOnWhichToSleep);
+        ipw.println("mDeviceStatesOnWhichSelectiveSleep=" + mDeviceStatesOnWhichToSelectiveSleep);
         ipw.println("mInteractive=" + mInteractive);
         ipw.println("mBootCompleted=" + mBootCompleted);
 
@@ -569,8 +583,8 @@
     boolean shouldDeviceBePutToSleep(int pendingState, int currentState, boolean isInteractive,
             boolean isBootCompleted) {
         return currentState != DeviceStateManager.INVALID_DEVICE_STATE_IDENTIFIER
-                && mDeviceStatesOnWhichToSleep.get(pendingState)
-                && !mDeviceStatesOnWhichToSleep.get(currentState)
+                && mDeviceStatesOnWhichToSelectiveSleep.get(pendingState)
+                && !mDeviceStatesOnWhichToSelectiveSleep.get(currentState)
                 && isInteractive
                 && isBootCompleted
                 && !mFoldSettingProvider.shouldStayAwakeOnFold();
@@ -611,9 +625,12 @@
         final boolean waitingToWakeDevice = mDeviceStatesOnWhichToWakeUp.get(mPendingDeviceState)
                 && !mDeviceStatesOnWhichToWakeUp.get(mDeviceState)
                 && !mInteractive && mBootCompleted;
-        final boolean waitingToSleepDevice = mDeviceStatesOnWhichToSleep.get(mPendingDeviceState)
-                && !mDeviceStatesOnWhichToSleep.get(mDeviceState)
-                && mInteractive && mBootCompleted;
+        // The device should only wait for sleep if #shouldStayAwakeOnFold method returns false.
+        // If not, device should be marked ready for transition immediately.
+        final boolean waitingToSleepDevice = mDeviceStatesOnWhichToSelectiveSleep.get(
+                mPendingDeviceState)
+                && !mDeviceStatesOnWhichToSelectiveSleep.get(mDeviceState)
+                && mInteractive && mBootCompleted && !shouldStayAwakeOnFold();
 
         final boolean displaysOff = areAllTransitioningDisplaysOffLocked();
         final boolean isReadyToTransition = displaysOff && !waitingToWakeDevice
@@ -1104,14 +1121,22 @@
             final int logicalDisplayId = displayLayout.getLogicalDisplayId();
 
             LogicalDisplay newDisplay = getDisplayLocked(logicalDisplayId);
+            boolean newDisplayCreated = false;
             if (newDisplay == null) {
                 newDisplay = createNewLogicalDisplayLocked(
                         null /*displayDevice*/, logicalDisplayId);
+                newDisplayCreated = true;
             }
 
             // Now swap the underlying display devices between the old display and the new display
             final LogicalDisplay oldDisplay = getDisplayLocked(device);
             if (newDisplay != oldDisplay) {
+                // Display is swapping, notify WindowManager, so it can prepare for
+                // the display switch
+                if (!newDisplayCreated && mWindowManagerPolicy != null) {
+                    mWindowManagerPolicy.onDisplaySwitchStart(newDisplay.getDisplayIdLocked());
+                }
+
                 newDisplay.swapDisplaysLocked(oldDisplay);
             }
             DisplayDeviceConfig config = device.getDisplayDeviceConfig();
@@ -1233,6 +1258,16 @@
         return retval;
     }
 
+    /**
+     * Returns true if the device would definitely have outer display ON/Stay Awake on fold based on
+     * the value of `Continue using app on fold` setting
+     */
+    private boolean shouldStayAwakeOnFold() {
+        return mFoldSettingProvider.shouldStayAwakeOnFold() || (
+                mFoldSettingProvider.shouldSelectiveStayAwakeOnFold()
+                        && mFoldGracePeriodProvider.isEnabled());
+    }
+
     private String displayEventToString(int msg) {
         switch(msg) {
             case LOGICAL_DISPLAY_EVENT_ADDED:
diff --git a/services/core/java/com/android/server/display/NormalBrightnessModeController.java b/services/core/java/com/android/server/display/NormalBrightnessModeController.java
index 135ebd8..e94cf00 100644
--- a/services/core/java/com/android/server/display/NormalBrightnessModeController.java
+++ b/services/core/java/com/android/server/display/NormalBrightnessModeController.java
@@ -79,10 +79,12 @@
             maxBrightnessPoints = mMaxBrightnessLimits.get(BrightnessLimitMapType.ADAPTIVE);
         }
 
-        if (maxBrightnessPoints == null) {
+        // AutoBrightnessController sends ambientLux values *only* when auto brightness enabled.
+        // Temporary disabling this Controller if auto brightness is off, to avoid capping
+        // brightness based on stale ambient lux. The issue is tracked here: b/322445088
+        if (mAutoBrightnessEnabled && maxBrightnessPoints == null) {
             maxBrightnessPoints = mMaxBrightnessLimits.get(BrightnessLimitMapType.DEFAULT);
         }
-
         if (maxBrightnessPoints != null) {
             for (Map.Entry<Float, Float> brightnessPoint : maxBrightnessPoints.entrySet()) {
                 float ambientBoundary = brightnessPoint.getKey();
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 8084685..8b3e4a4 100644
--- a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java
+++ b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java
@@ -31,7 +31,7 @@
 import com.android.server.display.BrightnessMappingStrategy;
 import com.android.server.display.BrightnessSetting;
 import com.android.server.display.DisplayBrightnessState;
-import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy;
+import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy2;
 import com.android.server.display.brightness.strategy.DisplayBrightnessStrategy;
 import com.android.server.display.feature.DisplayManagerFlags;
 
@@ -76,6 +76,10 @@
     @GuardedBy("mLock")
     private float mLastUserSetScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
 
+    // Represents if the system has adjusted the brightness based on the user suggested value. Will
+    // be false if the brightness change is coming from a non-user source
+    private boolean mUserSetScreenBrightnessUpdated;
+
     // The listener which is to be notified everytime there is a change in the brightness in the
     // BrightnessSetting.
     private BrightnessSetting.BrightnessSettingListener mBrightnessSettingListener;
@@ -138,7 +142,6 @@
     public DisplayBrightnessState updateBrightness(
             DisplayManagerInternal.DisplayPowerRequest displayPowerRequest,
             int targetDisplayState) {
-
         DisplayBrightnessState state;
         synchronized (mLock) {
             mDisplayBrightnessStrategy = mDisplayBrightnessStrategySelector.selectStrategy(
@@ -246,28 +249,14 @@
     }
 
     /**
-     * We want to return true if the user has set the screen brightness.
-     * RBC on, off, and intensity changes will return false.
-     * Slider interactions whilst in RBC will return true, just as when in non-rbc.
+     * Returns if the system has adjusted the brightness based on the user suggested value. Will
+     * be false if the brightness change is coming from a non-user source.
+     *
+     * Todo: 294444204 This is a temporary workaround, and should be moved to the manual brightness
+     * strategy once that is introduced
      */
-    public boolean updateUserSetScreenBrightness() {
-        synchronized (mLock) {
-            if (!BrightnessUtils.isValidBrightnessValue(mPendingScreenBrightness)) {
-                return false;
-            }
-            if (mCurrentScreenBrightness == mPendingScreenBrightness) {
-                mPendingScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
-                setTemporaryBrightnessLocked(PowerManager.BRIGHTNESS_INVALID_FLOAT);
-                return false;
-            }
-            setCurrentScreenBrightnessLocked(mPendingScreenBrightness);
-            mLastUserSetScreenBrightness = mPendingScreenBrightness;
-            mPendingScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
-            setTemporaryBrightnessLocked(PowerManager.BRIGHTNESS_INVALID_FLOAT);
-        }
-        notifyCurrentScreenBrightness();
-        return true;
-
+    public boolean getIsUserSetScreenBrightnessUpdated() {
+        return mUserSetScreenBrightnessUpdated;
     }
 
     /**
@@ -355,7 +344,7 @@
     /**
      * TODO(b/253226419): Remove once auto-brightness is a fully-functioning strategy.
      */
-    public AutomaticBrightnessStrategy getAutomaticBrightnessStrategy() {
+    public AutomaticBrightnessStrategy2 getAutomaticBrightnessStrategy() {
         return mDisplayBrightnessStrategySelector.getAutomaticBrightnessStrategy();
     }
 
@@ -442,6 +431,33 @@
         }
     }
 
+    /**
+     * We want to return true if the user has set the screen brightness.
+     * RBC on, off, and intensity changes will return false.
+     * Slider interactions whilst in RBC will return true, just as when in non-rbc.
+     */
+    @VisibleForTesting
+    boolean updateUserSetScreenBrightness() {
+        mUserSetScreenBrightnessUpdated = false;
+        synchronized (mLock) {
+            if (!BrightnessUtils.isValidBrightnessValue(mPendingScreenBrightness)) {
+                return false;
+            }
+            if (mCurrentScreenBrightness == mPendingScreenBrightness) {
+                mPendingScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
+                setTemporaryBrightnessLocked(PowerManager.BRIGHTNESS_INVALID_FLOAT);
+                return false;
+            }
+            setCurrentScreenBrightnessLocked(mPendingScreenBrightness);
+            mLastUserSetScreenBrightness = mPendingScreenBrightness;
+            mPendingScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
+            setTemporaryBrightnessLocked(PowerManager.BRIGHTNESS_INVALID_FLOAT);
+        }
+        notifyCurrentScreenBrightness();
+        mUserSetScreenBrightnessUpdated = true;
+        return true;
+    }
+
     @VisibleForTesting
     static class Injector {
         DisplayBrightnessStrategySelector getDisplayBrightnessStrategySelector(Context context,
@@ -470,7 +486,7 @@
      * TODO(b/253226419): Remove once auto-brightness is a fully-functioning strategy.
      */
     private DisplayBrightnessState addAutomaticBrightnessState(DisplayBrightnessState state) {
-        AutomaticBrightnessStrategy autoStrat = getAutomaticBrightnessStrategy();
+        AutomaticBrightnessStrategy2 autoStrat = getAutomaticBrightnessStrategy();
 
         DisplayBrightnessState.Builder builder = DisplayBrightnessState.Builder.from(state);
         builder.setShouldUseAutoBrightness(
@@ -526,6 +542,12 @@
     private StrategySelectionRequest constructStrategySelectionRequest(
             DisplayManagerInternal.DisplayPowerRequest displayPowerRequest,
             int targetDisplayState) {
-        return new StrategySelectionRequest(displayPowerRequest, targetDisplayState);
+        boolean userSetBrightnessChanged = updateUserSetScreenBrightness();
+        float lastUserSetScreenBrightness;
+        synchronized (mLock) {
+            lastUserSetScreenBrightness = mLastUserSetScreenBrightness;
+        }
+        return new StrategySelectionRequest(displayPowerRequest, targetDisplayState,
+                lastUserSetScreenBrightness, userSetBrightnessChanged);
     }
 }
diff --git a/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java b/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java
index 165c24b..da66879a 100644
--- a/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java
+++ b/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java
@@ -27,6 +27,7 @@
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy;
+import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy2;
 import com.android.server.display.brightness.strategy.BoostBrightnessStrategy;
 import com.android.server.display.brightness.strategy.DisplayBrightnessStrategy;
 import com.android.server.display.brightness.strategy.DozeBrightnessStrategy;
@@ -65,7 +66,16 @@
     // The brightness strategy used to manage the brightness state when the request is invalid.
     private final InvalidBrightnessStrategy mInvalidBrightnessStrategy;
     // Controls brightness when automatic (adaptive) brightness is running.
-    private final AutomaticBrightnessStrategy mAutomaticBrightnessStrategy;
+    private final AutomaticBrightnessStrategy2 mAutomaticBrightnessStrategy;
+
+    // The automatic strategy which controls the brightness when adaptive mode is ON.
+    private final AutomaticBrightnessStrategy mAutomaticBrightnessStrategy1;
+
+    // The deprecated AutomaticBrightnessStrategy. Avoid using it for any new features without
+    // consulting with the display frameworks team. Use {@link AutomaticBrightnessStrategy} instead.
+    // This will be removed once the flag
+    // {@link DisplayManagerFlags#isRefactorDisplayPowerControllerEnabled is fully rolled out
+    private final AutomaticBrightnessStrategy2 mAutomaticBrightnessStrategy2;
     // Controls the brightness if adaptive brightness is on and there exists an active offload
     // session. Brightness value is provided by the offload session.
     @Nullable
@@ -101,7 +111,15 @@
         mBoostBrightnessStrategy = injector.getBoostBrightnessStrategy();
         mFollowerBrightnessStrategy = injector.getFollowerBrightnessStrategy(displayId);
         mInvalidBrightnessStrategy = injector.getInvalidBrightnessStrategy();
-        mAutomaticBrightnessStrategy = injector.getAutomaticBrightnessStrategy(context, displayId);
+        mAutomaticBrightnessStrategy1 =
+                (!mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled()) ? null
+                        : injector.getAutomaticBrightnessStrategy1(context, displayId);
+        mAutomaticBrightnessStrategy2 =
+                (mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled()) ? null
+                        : injector.getAutomaticBrightnessStrategy2(context, displayId);
+        mAutomaticBrightnessStrategy =
+                (mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled())
+                        ? mAutomaticBrightnessStrategy1 : mAutomaticBrightnessStrategy2;
         if (flags.isDisplayOffloadEnabled()) {
             mOffloadBrightnessStrategy = injector.getOffloadBrightnessStrategy();
         } else {
@@ -110,7 +128,7 @@
         mDisplayBrightnessStrategies = new DisplayBrightnessStrategy[]{mInvalidBrightnessStrategy,
                 mScreenOffBrightnessStrategy, mDozeBrightnessStrategy, mFollowerBrightnessStrategy,
                 mBoostBrightnessStrategy, mOverrideBrightnessStrategy, mTemporaryBrightnessStrategy,
-                mOffloadBrightnessStrategy};
+                mAutomaticBrightnessStrategy1, mOffloadBrightnessStrategy};
         mAllowAutoBrightnessWhileDozingConfig = context.getResources().getBoolean(
                 R.bool.config_allowAutoBrightnessWhileDozing);
         mOldBrightnessStrategyName = mInvalidBrightnessStrategy.getName();
@@ -142,6 +160,9 @@
         } else if (BrightnessUtils.isValidBrightnessValue(
                 mTemporaryBrightnessStrategy.getTemporaryScreenBrightness())) {
             displayBrightnessStrategy = mTemporaryBrightnessStrategy;
+        } else if (mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled()
+                && isAutomaticBrightnessStrategyValid(strategySelectionRequest)) {
+            displayBrightnessStrategy = mAutomaticBrightnessStrategy1;
         } else if (mAutomaticBrightnessStrategy.shouldUseAutoBrightness()
                 && mOffloadBrightnessStrategy != null && BrightnessUtils.isValidBrightnessValue(
                 mOffloadBrightnessStrategy.getOffloadScreenBrightness())) {
@@ -149,7 +170,8 @@
         }
 
         if (mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled()) {
-            postProcess(constructStrategySelectionNotifyRequest(displayBrightnessStrategy));
+            postProcess(constructStrategySelectionNotifyRequest(displayBrightnessStrategy,
+                    strategySelectionRequest));
         }
 
         if (!mOldBrightnessStrategyName.equals(displayBrightnessStrategy.getName())) {
@@ -170,7 +192,7 @@
         return mFollowerBrightnessStrategy;
     }
 
-    public AutomaticBrightnessStrategy getAutomaticBrightnessStrategy() {
+    public AutomaticBrightnessStrategy2 getAutomaticBrightnessStrategy() {
         return mAutomaticBrightnessStrategy;
     }
 
@@ -206,9 +228,28 @@
         }
     }
 
+    private boolean isAutomaticBrightnessStrategyValid(
+            StrategySelectionRequest strategySelectionRequest) {
+        mAutomaticBrightnessStrategy1.setAutoBrightnessState(
+                strategySelectionRequest.getTargetDisplayState(),
+                mAllowAutoBrightnessWhileDozingConfig,
+                BrightnessReason.REASON_UNKNOWN,
+                strategySelectionRequest.getDisplayPowerRequest().policy,
+                strategySelectionRequest.getLastUserSetScreenBrightness(),
+                strategySelectionRequest.isUserSetBrightnessChanged());
+        return mAutomaticBrightnessStrategy1.isAutoBrightnessValid();
+    }
+
     private StrategySelectionNotifyRequest constructStrategySelectionNotifyRequest(
-            DisplayBrightnessStrategy selectedDisplayBrightnessStrategy) {
-        return new StrategySelectionNotifyRequest(selectedDisplayBrightnessStrategy);
+            DisplayBrightnessStrategy selectedDisplayBrightnessStrategy,
+            StrategySelectionRequest strategySelectionRequest) {
+        return new StrategySelectionNotifyRequest(
+                        strategySelectionRequest.getDisplayPowerRequest(),
+                strategySelectionRequest.getTargetDisplayState(),
+                selectedDisplayBrightnessStrategy,
+                strategySelectionRequest.getLastUserSetScreenBrightness(),
+                strategySelectionRequest.isUserSetBrightnessChanged(),
+                isAllowAutoBrightnessWhileDozingConfig());
     }
 
     private void postProcess(StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
@@ -263,10 +304,16 @@
             return new InvalidBrightnessStrategy();
         }
 
-        AutomaticBrightnessStrategy getAutomaticBrightnessStrategy(Context context, int displayId) {
+        AutomaticBrightnessStrategy getAutomaticBrightnessStrategy1(Context context,
+                int displayId) {
             return new AutomaticBrightnessStrategy(context, displayId);
         }
 
+        AutomaticBrightnessStrategy2 getAutomaticBrightnessStrategy2(Context context,
+                int displayId) {
+            return new AutomaticBrightnessStrategy2(context, displayId);
+        }
+
         OffloadBrightnessStrategy getOffloadBrightnessStrategy() {
             return new OffloadBrightnessStrategy();
         }
diff --git a/services/core/java/com/android/server/display/brightness/StrategySelectionNotifyRequest.java b/services/core/java/com/android/server/display/brightness/StrategySelectionNotifyRequest.java
index d8bd2e4..6e6c972 100644
--- a/services/core/java/com/android/server/display/brightness/StrategySelectionNotifyRequest.java
+++ b/services/core/java/com/android/server/display/brightness/StrategySelectionNotifyRequest.java
@@ -16,6 +16,8 @@
 
 package com.android.server.display.brightness;
 
+import android.hardware.display.DisplayManagerInternal;
+
 import com.android.server.display.brightness.strategy.DisplayBrightnessStrategy;
 
 import java.util.Objects;
@@ -25,11 +27,36 @@
  * DisplayBrightnessStrategy
  */
 public final class StrategySelectionNotifyRequest {
+    // The request to change the associated display's state and brightness
+    private DisplayManagerInternal.DisplayPowerRequest mDisplayPowerRequest;
+
+    // The display state to which the screen is switching to
+    private int mTargetDisplayState;
+
     // The strategy that was selected with the current request
     private final DisplayBrightnessStrategy mSelectedDisplayBrightnessStrategy;
 
-    public StrategySelectionNotifyRequest(DisplayBrightnessStrategy displayBrightnessStrategy) {
+    // The last brightness that was set by the user and not temporary. Set to
+    // PowerManager.BRIGHTNESS_INVALID_FLOAT when a brightness has yet to be recorded.
+    private float mLastUserSetScreenBrightness;
+
+    // Represents if the user set screen brightness was changed or not.
+    private boolean mUserSetBrightnessChanged;
+
+    // True if light sensor is to be used to automatically determine doze screen brightness.
+    private final boolean mAllowAutoBrightnessWhileDozingConfig;
+
+    public StrategySelectionNotifyRequest(
+            DisplayManagerInternal.DisplayPowerRequest displayPowerRequest, int targetDisplayState,
+            DisplayBrightnessStrategy displayBrightnessStrategy,
+            float lastUserSetScreenBrightness,
+            boolean userSetBrightnessChanged, boolean allowAutoBrightnessWhileDozingConfig) {
+        mDisplayPowerRequest = displayPowerRequest;
+        mTargetDisplayState = targetDisplayState;
         mSelectedDisplayBrightnessStrategy = displayBrightnessStrategy;
+        mLastUserSetScreenBrightness = lastUserSetScreenBrightness;
+        mUserSetBrightnessChanged = userSetBrightnessChanged;
+        mAllowAutoBrightnessWhileDozingConfig = allowAutoBrightnessWhileDozingConfig;
     }
 
     public DisplayBrightnessStrategy getSelectedDisplayBrightnessStrategy() {
@@ -43,11 +70,52 @@
         }
         StrategySelectionNotifyRequest other = (StrategySelectionNotifyRequest) obj;
         return other.getSelectedDisplayBrightnessStrategy()
-                == getSelectedDisplayBrightnessStrategy();
+                == getSelectedDisplayBrightnessStrategy()
+                && Objects.equals(mDisplayPowerRequest, other.getDisplayPowerRequest())
+                && mTargetDisplayState == other.getTargetDisplayState()
+                && mUserSetBrightnessChanged == other.isUserSetBrightnessChanged()
+                && mLastUserSetScreenBrightness == other.getLastUserSetScreenBrightness()
+                && mAllowAutoBrightnessWhileDozingConfig
+                == other.isAllowAutoBrightnessWhileDozingConfig();
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mSelectedDisplayBrightnessStrategy);
+        return Objects.hash(mSelectedDisplayBrightnessStrategy, mDisplayPowerRequest,
+                mTargetDisplayState, mUserSetBrightnessChanged, mLastUserSetScreenBrightness,
+                mAllowAutoBrightnessWhileDozingConfig);
+    }
+
+    public float getLastUserSetScreenBrightness() {
+        return mLastUserSetScreenBrightness;
+    }
+
+    public boolean isUserSetBrightnessChanged() {
+        return mUserSetBrightnessChanged;
+    }
+
+    public DisplayManagerInternal.DisplayPowerRequest getDisplayPowerRequest() {
+        return mDisplayPowerRequest;
+    }
+
+    public int getTargetDisplayState() {
+        return mTargetDisplayState;
+    }
+
+    public boolean isAllowAutoBrightnessWhileDozingConfig() {
+        return mAllowAutoBrightnessWhileDozingConfig;
+    }
+
+    /**
+     * A utility to stringify a StrategySelectionNotifyRequest
+     */
+    public String toString() {
+        return "StrategySelectionNotifyRequest:"
+                + " mDisplayPowerRequest=" + mDisplayPowerRequest
+                + " mTargetDisplayState=" + mTargetDisplayState
+                + " mSelectedDisplayBrightnessStrategy=" + mSelectedDisplayBrightnessStrategy
+                + " mLastUserSetScreenBrightness=" + mLastUserSetScreenBrightness
+                + " mUserSetBrightnessChanged=" + mUserSetBrightnessChanged
+                + " mAllowAutoBrightnessWhileDozingConfig=" + mAllowAutoBrightnessWhileDozingConfig;
     }
 }
diff --git a/services/core/java/com/android/server/display/brightness/StrategySelectionRequest.java b/services/core/java/com/android/server/display/brightness/StrategySelectionRequest.java
index e618596..ae745efc 100644
--- a/services/core/java/com/android/server/display/brightness/StrategySelectionRequest.java
+++ b/services/core/java/com/android/server/display/brightness/StrategySelectionRequest.java
@@ -31,10 +31,20 @@
     // The display state to which the screen is switching to
     private int mTargetDisplayState;
 
+    // The last brightness that was set by the user and not temporary. Set to
+    // PowerManager.BRIGHTNESS_INVALID_FLOAT when a brightness has yet to be recorded.
+    private float mLastUserSetScreenBrightness;
+
+    // Represents if the user set screen brightness was changed or not.
+    private boolean mUserSetBrightnessChanged;
+
     public StrategySelectionRequest(DisplayManagerInternal.DisplayPowerRequest displayPowerRequest,
-            int targetDisplayState) {
+            int targetDisplayState, float lastUserSetScreenBrightness,
+            boolean userSetBrightnessChanged) {
         mDisplayPowerRequest = displayPowerRequest;
         mTargetDisplayState = targetDisplayState;
+        mLastUserSetScreenBrightness = lastUserSetScreenBrightness;
+        mUserSetBrightnessChanged = userSetBrightnessChanged;
     }
 
     public DisplayManagerInternal.DisplayPowerRequest getDisplayPowerRequest() {
@@ -45,18 +55,30 @@
         return mTargetDisplayState;
     }
 
+
+    public float getLastUserSetScreenBrightness() {
+        return mLastUserSetScreenBrightness;
+    }
+
+    public boolean isUserSetBrightnessChanged() {
+        return mUserSetBrightnessChanged;
+    }
+
     @Override
     public boolean equals(Object obj) {
         if (!(obj instanceof StrategySelectionRequest)) {
             return false;
         }
         StrategySelectionRequest other = (StrategySelectionRequest) obj;
-        return Objects.equals(other.getDisplayPowerRequest(), getDisplayPowerRequest())
-                && other.getTargetDisplayState() == getTargetDisplayState();
+        return Objects.equals(mDisplayPowerRequest, other.getDisplayPowerRequest())
+                && mTargetDisplayState == other.getTargetDisplayState()
+                && mLastUserSetScreenBrightness == other.getLastUserSetScreenBrightness()
+                && mUserSetBrightnessChanged == other.isUserSetBrightnessChanged();
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mDisplayPowerRequest, mTargetDisplayState);
+        return Objects.hash(mDisplayPowerRequest, mTargetDisplayState,
+                mLastUserSetScreenBrightness, mUserSetBrightnessChanged);
     }
 }
diff --git a/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java b/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java
index d8a4500..a46975fb 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java
@@ -66,6 +66,7 @@
     private float mCustomAnimationRate = DisplayBrightnessState.CUSTOM_ANIMATION_RATE_NOT_SET;
     @Nullable
     private Type mClamperType = null;
+    private int mAutoBrightnessState = -1;
 
     private boolean mClamperApplied = false;
 
@@ -94,7 +95,8 @@
 
         mClampers = injector.getClampers(handler, clamperChangeListenerInternal, data, flags,
                 context);
-        mModifiers = injector.getModifiers(flags, context, handler, clamperChangeListener);
+        mModifiers = injector.getModifiers(flags, context, handler, clamperChangeListener,
+                data.mDisplayDeviceConfig);
         mOnPropertiesChangedListener =
                 properties -> mClampers.forEach(BrightnessClamper::onDeviceConfigChanged);
         start();
@@ -197,6 +199,19 @@
         mModifiers.forEach(modifier -> modifier.onAmbientLuxChange(ambientLux));
     }
 
+    /**
+     * Sets the autobrightness state for clampers that need to be aware of the state.
+     * @param state autobrightness state
+     */
+    public void setAutoBrightnessState(int state) {
+        if (state == mAutoBrightnessState) {
+            return;
+        }
+        mModifiers.forEach(modifier -> modifier.setAutoBrightnessState(state));
+        mAutoBrightnessState = state;
+        recalculateBrightnessCap();
+    }
+
     // Called in DisplayControllerHandler
     private void recalculateBrightnessCap() {
         float brightnessCap = PowerManager.BRIGHTNESS_MAX;
@@ -265,12 +280,14 @@
         }
 
         List<BrightnessStateModifier> getModifiers(DisplayManagerFlags flags, Context context,
-                Handler handler, ClamperChangeListener listener) {
+                Handler handler, ClamperChangeListener listener,
+                DisplayDeviceConfig displayDeviceConfig) {
             List<BrightnessStateModifier> modifiers = new ArrayList<>();
             modifiers.add(new DisplayDimModifier(context));
             modifiers.add(new BrightnessLowPowerModeModifier());
-            if (flags.isEvenDimmerEnabled()) {
-                modifiers.add(new BrightnessLowLuxModifier(handler, listener, context));
+            if (flags.isEvenDimmerEnabled() && displayDeviceConfig != null) {
+                modifiers.add(new BrightnessLowLuxModifier(handler, listener, context,
+                        displayDeviceConfig));
             }
             return modifiers;
         }
diff --git a/services/core/java/com/android/server/display/brightness/clamper/BrightnessLowLuxModifier.java b/services/core/java/com/android/server/display/brightness/clamper/BrightnessLowLuxModifier.java
index a91bb59..a3dfe22 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/BrightnessLowLuxModifier.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/BrightnessLowLuxModifier.java
@@ -16,13 +16,14 @@
 
 package com.android.server.display.brightness.clamper;
 
+import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED;
+
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.ContentObserver;
 import android.hardware.display.DisplayManagerInternal;
 import android.net.Uri;
 import android.os.Handler;
-import android.os.PowerManager;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.util.Slog;
@@ -30,6 +31,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.display.BrightnessSynchronizer;
 import com.android.server.display.DisplayBrightnessState;
+import com.android.server.display.DisplayDeviceConfig;
 import com.android.server.display.brightness.BrightnessReason;
 import com.android.server.display.utils.DebugUtils;
 
@@ -45,25 +47,30 @@
     // 'adb shell setprop persist.log.tag.BrightnessLowLuxModifier DEBUG && adb reboot'
     private static final String TAG = "BrightnessLowLuxModifier";
     private static final boolean DEBUG = DebugUtils.isDebuggable(TAG);
-    private static final float MIN_NITS = 2.0f;
+    private static final float MIN_NITS_DEFAULT = 0.2f;
     private final SettingsObserver mSettingsObserver;
     private final ContentResolver mContentResolver;
     private final Handler mHandler;
     private final BrightnessClamperController.ClamperChangeListener mChangeListener;
     private int mReason;
     private float mBrightnessLowerBound;
+    private float mMinNitsAllowed;
     private boolean mIsActive;
+    private boolean mAutoBrightnessEnabled;
     private float mAmbientLux;
+    private final DisplayDeviceConfig mDisplayDeviceConfig;
 
     @VisibleForTesting
     BrightnessLowLuxModifier(Handler handler,
-            BrightnessClamperController.ClamperChangeListener listener, Context context) {
+            BrightnessClamperController.ClamperChangeListener listener, Context context,
+            DisplayDeviceConfig displayDeviceConfig) {
         super();
 
         mChangeListener = listener;
         mHandler = handler;
         mContentResolver = context.getContentResolver();
         mSettingsObserver = new SettingsObserver(mHandler);
+        mDisplayDeviceConfig = displayDeviceConfig;
         mHandler.post(() -> {
             start();
         });
@@ -78,41 +85,45 @@
         int userId = UserHandle.USER_CURRENT;
         float settingNitsLowerBound = Settings.Secure.getFloatForUser(
                 mContentResolver, Settings.Secure.EVEN_DIMMER_MIN_NITS,
-                /* def= */ MIN_NITS, userId);
+                /* def= */ MIN_NITS_DEFAULT, userId);
 
         boolean isActive = Settings.Secure.getFloatForUser(mContentResolver,
                 Settings.Secure.EVEN_DIMMER_ACTIVATED,
-                /* def= */ 0, userId) == 1.0f;
+                /* def= */ 0, userId) == 1.0f && mAutoBrightnessEnabled;
 
-        // TODO: luxBasedNitsLowerBound = mMinLuxToNitsSpline(currentLux);
-        float luxBasedNitsLowerBound = 2.0f;
+        float luxBasedNitsLowerBound = mDisplayDeviceConfig.getMinNitsFromLux(mAmbientLux);
 
-        final float nitsLowerBound = isActive ? Math.max(settingNitsLowerBound,
-                 luxBasedNitsLowerBound) : MIN_NITS;
+        final int reason;
+        float minNitsAllowed = -1f; // undefined, if setting is off.
+        final float minBrightnessAllowed;
 
-        final int reason = settingNitsLowerBound > luxBasedNitsLowerBound
-                ? BrightnessReason.MODIFIER_MIN_USER_SET_LOWER_BOUND
-                : BrightnessReason.MODIFIER_MIN_LUX;
+        if (isActive) {
+            minNitsAllowed = Math.max(settingNitsLowerBound,
+                    luxBasedNitsLowerBound);
+            minBrightnessAllowed = getBrightnessFromNits(minNitsAllowed);
+            reason = settingNitsLowerBound > luxBasedNitsLowerBound
+                    ? BrightnessReason.MODIFIER_MIN_USER_SET_LOWER_BOUND
+                    : BrightnessReason.MODIFIER_MIN_LUX;
+        } else {
+            minBrightnessAllowed = mDisplayDeviceConfig.getEvenDimmerTransitionPoint();
+            reason = 0;
+        }
 
-        // TODO: brightnessLowerBound = nitsToBrightnessSpline(nitsLowerBound);
-        final float brightnessLowerBound = PowerManager.BRIGHTNESS_MIN;
-
-        if (mBrightnessLowerBound != brightnessLowerBound
+        if (mBrightnessLowerBound != minBrightnessAllowed
                 || mReason != reason
                 || mIsActive != isActive) {
             mIsActive = isActive;
             mReason = reason;
             if (DEBUG) {
                 Slog.i(TAG, "isActive: " + isActive
-                        + ", brightnessLowerBound: " + brightnessLowerBound
+                        + ", minBrightnessAllowed: " + minBrightnessAllowed
                         + ", mAmbientLux: " + mAmbientLux
-                        + ", mReason: " + (
-                        mReason == BrightnessReason.MODIFIER_MIN_USER_SET_LOWER_BOUND ? "minSetting"
-                                : "lux")
-                        + ", nitsLowerBound: " + nitsLowerBound
+                        + ", mReason: " + (mReason)
+                        + ", minNitsAllowed: " + minNitsAllowed
                 );
             }
-            mBrightnessLowerBound = brightnessLowerBound;
+            mMinNitsAllowed = minNitsAllowed;
+            mBrightnessLowerBound = minBrightnessAllowed;
             mChangeListener.onChanged();
         }
     }
@@ -177,11 +188,23 @@
     }
 
     @Override
+    public void setAutoBrightnessState(int state) {
+        mAutoBrightnessEnabled = state == AUTO_BRIGHTNESS_ENABLED;
+    }
+
+    @Override
     public void dump(PrintWriter pw) {
         pw.println("BrightnessLowLuxModifier:");
         pw.println("  mIsActive=" + mIsActive);
         pw.println("  mBrightnessLowerBound=" + mBrightnessLowerBound);
         pw.println("  mReason=" + mReason);
+        pw.println("  mAmbientLux=" + mAmbientLux);
+        pw.println("  mMinNitsAllowed=" + mMinNitsAllowed);
+    }
+
+    private float getBrightnessFromNits(float nits) {
+        return mDisplayDeviceConfig.getBrightnessFromBacklight(
+                mDisplayDeviceConfig.getBacklightFromNits(nits));
     }
 
     private final class SettingsObserver extends ContentObserver {
diff --git a/services/core/java/com/android/server/display/brightness/clamper/BrightnessModifier.java b/services/core/java/com/android/server/display/brightness/clamper/BrightnessModifier.java
index 2a3dd87..db5a524d 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/BrightnessModifier.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/BrightnessModifier.java
@@ -73,4 +73,9 @@
     public void onAmbientLuxChange(float ambientLux) {
         // do nothing
     }
+
+    @Override
+    public void setAutoBrightnessState(int state) {
+        // do nothing
+    }
 }
diff --git a/services/core/java/com/android/server/display/brightness/clamper/BrightnessStateModifier.java b/services/core/java/com/android/server/display/brightness/clamper/BrightnessStateModifier.java
index 2234258..1606159c 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/BrightnessStateModifier.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/BrightnessStateModifier.java
@@ -48,4 +48,10 @@
      * @param ambientLux current debounced lux.
      */
     void onAmbientLuxChange(float ambientLux);
+
+    /**
+     * Sets the autobrightness state for clampers that need to be aware of the state.
+     * @param state autobrightness state
+     */
+    void setAutoBrightnessState(int state);
 }
diff --git a/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java b/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java
index 01a8d360a..f1cb66c 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java
@@ -24,6 +24,7 @@
 import android.view.SurfaceControlHdrLayerInfoListener;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.display.AutomaticBrightnessController;
 import com.android.server.display.config.HdrBrightnessData;
 
 import java.io.PrintWriter;
@@ -56,6 +57,8 @@
     private float mTransitionRate = -1f;
     private float mDesiredTransitionRate = -1f;
 
+    private boolean mAutoBrightnessEnabled = false;
+
     public HdrClamper(BrightnessClamperController.ClamperChangeListener clamperChangeListener,
             Handler handler) {
         this(clamperChangeListener, handler, new Injector());
@@ -122,6 +125,18 @@
         recalculateBrightnessCap(data, mAmbientLux, mHdrVisible);
     }
 
+    /**
+     * Sets state of auto brightness to temporary disabling this Clamper if auto brightness is off.
+     * The issue is tracked here: b/322445088
+     */
+    public void setAutoBrightnessState(int state) {
+        boolean isEnabled = state == AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED;
+        if (isEnabled != mAutoBrightnessEnabled) {
+            mAutoBrightnessEnabled = isEnabled;
+            recalculateBrightnessCap(mHdrBrightnessData, mAmbientLux, mHdrVisible);
+        }
+    }
+
     /** Clean up all resources */
     @SuppressLint("AndroidFrameworkRequiresPermission")
     public void stop() {
@@ -145,6 +160,7 @@
                 : mHdrBrightnessData.toString()));
         pw.println("  mHdrListener registered=" + (mRegisteredDisplayToken != null));
         pw.println("  mAmbientLux=" + mAmbientLux);
+        pw.println("  mAutoBrightnessEnabled=" + mAutoBrightnessEnabled);
     }
 
     private void reset() {
@@ -163,7 +179,10 @@
 
     private void recalculateBrightnessCap(HdrBrightnessData data, float ambientLux,
             boolean hdrVisible) {
-        if (data == null || !hdrVisible) {
+        // AutoBrightnessController sends ambientLux values *only* when auto brightness enabled.
+        // Temporary disabling this Clamper if auto brightness is off, to avoid capping
+        // brightness based on stale ambient lux. The issue is tracked here: b/322445088
+        if (data == null || !hdrVisible || !mAutoBrightnessEnabled) {
             reset();
             return;
         }
diff --git a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java
index 08d4cfd..4be7332 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java
@@ -20,6 +20,7 @@
 import android.annotation.Nullable;
 import android.content.Context;
 import android.hardware.display.BrightnessConfiguration;
+import android.hardware.display.DisplayManagerInternal;
 import android.os.PowerManager;
 import android.os.UserHandle;
 import android.provider.Settings;
@@ -27,9 +28,11 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.display.AutomaticBrightnessController;
+import com.android.server.display.DisplayBrightnessState;
 import com.android.server.display.brightness.BrightnessEvent;
 import com.android.server.display.brightness.BrightnessReason;
 import com.android.server.display.brightness.BrightnessUtils;
+import com.android.server.display.brightness.StrategySelectionNotifyRequest;
 
 import java.io.PrintWriter;
 
@@ -40,7 +43,8 @@
  * that it is being executed from the power thread, and hence doesn't synchronize
  * any of its resources
  */
-public class AutomaticBrightnessStrategy {
+public class AutomaticBrightnessStrategy extends AutomaticBrightnessStrategy2
+        implements DisplayBrightnessStrategy{
     private final Context mContext;
     // The DisplayId of the associated logical display
     private final int mDisplayId;
@@ -88,7 +92,12 @@
     @Nullable
     private BrightnessConfiguration mBrightnessConfiguration;
 
+    // Indicates if the strategy is already configured for a request, in which case we wouldn't
+    // want to re-evaluate the auto-brightness state
+    private boolean mIsConfigured;
+
     public AutomaticBrightnessStrategy(Context context, int displayId) {
+        super(context, displayId);
         mContext = context;
         mDisplayId = displayId;
         mAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting();
@@ -112,7 +121,7 @@
         mAutoBrightnessDisabledDueToDisplayOff = shouldUseAutoBrightness()
                 && !(targetDisplayState == Display.STATE_ON || autoBrightnessEnabledInDoze);
         final int autoBrightnessState = mIsAutoBrightnessEnabled
-                    && brightnessReason != BrightnessReason.REASON_FOLLOWER
+                && brightnessReason != BrightnessReason.REASON_FOLLOWER
                 ? AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED
                 : mAutoBrightnessDisabledDueToDisplayOff
                         ? AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE
@@ -120,12 +129,36 @@
 
         accommodateUserBrightnessChanges(userSetBrightnessChanged, lastUserSetScreenBrightness,
                 policy, targetDisplayState, mBrightnessConfiguration, autoBrightnessState);
+        mIsConfigured = true;
+    }
+
+    public void setIsConfigured(boolean configure) {
+        mIsConfigured = configure;
     }
 
     public boolean isAutoBrightnessEnabled() {
         return mIsAutoBrightnessEnabled;
     }
 
+    /**
+     * Validates if the auto-brightness strategy is valid or not considering the current system
+     * state.
+     */
+    public boolean isAutoBrightnessValid() {
+        boolean isValid = false;
+        if (isAutoBrightnessEnabled()) {
+            float brightness = (mAutomaticBrightnessController != null)
+                    ? mAutomaticBrightnessController.getAutomaticScreenBrightness(null)
+                    : PowerManager.BRIGHTNESS_INVALID_FLOAT;
+            if (BrightnessUtils.isValidBrightnessValue(brightness)
+                    || brightness == PowerManager.BRIGHTNESS_OFF_FLOAT) {
+                isValid = true;
+            }
+        }
+        setAutoBrightnessApplied(isValid);
+        return isValid;
+    }
+
     public boolean isAutoBrightnessDisabledDueToDisplayOff() {
         return mAutoBrightnessDisabledDueToDisplayOff;
     }
@@ -217,6 +250,29 @@
         mTemporaryAutoBrightnessAdjustment = temporaryAutoBrightnessAdjustment;
     }
 
+    @Override
+    public DisplayBrightnessState updateBrightness(
+            DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+        BrightnessReason brightnessReason = new BrightnessReason();
+        brightnessReason.setReason(BrightnessReason.REASON_AUTOMATIC);
+        BrightnessEvent brightnessEvent = new BrightnessEvent(mDisplayId);
+        float brightness = getAutomaticScreenBrightness(brightnessEvent);
+        return new DisplayBrightnessState.Builder()
+                .setBrightness(brightness)
+                .setSdrBrightness(brightness)
+                .setBrightnessReason(brightnessReason)
+                .setDisplayBrightnessStrategyName(getName())
+                .setIsSlowChange(hasAppliedAutoBrightness()
+                        && !getAutoBrightnessAdjustmentChanged())
+                .setBrightnessEvent(brightnessEvent)
+                .build();
+    }
+
+    @Override
+    public String getName() {
+        return "AutomaticBrightnessStrategy";
+    }
+
     /**
      * Dumps the state of this class.
      */
@@ -238,6 +294,26 @@
                 + mAutoBrightnessAdjustmentReasonsFlags);
     }
 
+    @Override
+    public void strategySelectionPostProcessor(
+            StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
+        if (!mIsConfigured) {
+            setAutoBrightnessState(strategySelectionNotifyRequest.getTargetDisplayState(),
+                    strategySelectionNotifyRequest.isAllowAutoBrightnessWhileDozingConfig(),
+                    strategySelectionNotifyRequest.getSelectedDisplayBrightnessStrategy()
+                            .getReason(),
+                    strategySelectionNotifyRequest.getDisplayPowerRequest().policy,
+                    strategySelectionNotifyRequest.getLastUserSetScreenBrightness(),
+                    strategySelectionNotifyRequest.isUserSetBrightnessChanged());
+        }
+        mIsConfigured = false;
+    }
+
+    @Override
+    public int getReason() {
+        return BrightnessReason.REASON_AUTOMATIC;
+    }
+
     /**
      * Indicates if any auto-brightness adjustments have happened since the last auto-brightness was
      * set.
diff --git a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2.java b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2.java
new file mode 100644
index 0000000..25e8b23
--- /dev/null
+++ b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2.java
@@ -0,0 +1,430 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.brightness.strategy;
+
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.hardware.display.BrightnessConfiguration;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.view.Display;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.display.AutomaticBrightnessController;
+import com.android.server.display.brightness.BrightnessEvent;
+import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.brightness.BrightnessUtils;
+import com.android.server.display.feature.DisplayManagerFlags;
+
+import java.io.PrintWriter;
+
+/**
+ * Helps manage the brightness based on the ambient environment (Ambient Light/lux sensor) using
+ * mappings from lux to nits to brightness, configured in the
+ * {@link com.android.server.display.DisplayDeviceConfig} class. This class inherently assumes
+ * that it is being executed from the power thread, and hence doesn't synchronize
+ * any of its resources
+ *
+ * @deprecated This class is relevant only while the
+ * {@link DisplayManagerFlags#isRefactorDisplayPowerControllerEnabled()} is not fully rolled out.
+ * Till then, please replicated your changes to {@link AutomaticBrightnessStrategy} as well.
+ */
+@Deprecated
+public class AutomaticBrightnessStrategy2 {
+    private final Context mContext;
+    // The DisplayId of the associated logical display
+    private final int mDisplayId;
+    // The last auto brightness adjustment that was set by the user and is not temporary. Set to
+    // Float.NaN when an auto-brightness adjustment hasn't been recorded yet.
+    private float mAutoBrightnessAdjustment;
+    // The pending auto brightness adjustment that will take effect on the next power state update.
+    private float mPendingAutoBrightnessAdjustment;
+    // The temporary auto brightness adjustment. This was historically used when a user interacts
+    // with the adjustment slider but hasn't settled on a choice yet.
+    // Set to PowerManager.BRIGHTNESS_INVALID_FLOAT when there's no temporary adjustment set.
+    private float mTemporaryAutoBrightnessAdjustment;
+    // Indicates if the temporary auto brightness adjustment has been applied while updating the
+    // associated display brightness
+    private boolean mAppliedTemporaryAutoBrightnessAdjustment;
+    // Indicates if the auto brightness adjustment has happened.
+    private boolean mAutoBrightnessAdjustmentChanged;
+    // Indicates the reasons for the auto-brightness adjustment
+    private int mAutoBrightnessAdjustmentReasonsFlags = 0;
+    // Indicates if the short term model should be reset before fetching the new brightness
+    // Todo(273543270): Short term model is an internal information of
+    //  AutomaticBrightnessController and shouldn't be exposed outside of that class
+    private boolean mShouldResetShortTermModel = false;
+    // Remembers whether the auto-brightness has been applied in the latest brightness update.
+    private boolean mAppliedAutoBrightness = false;
+    // The controller for the automatic brightness level.
+    @Nullable
+    private AutomaticBrightnessController mAutomaticBrightnessController;
+    // The system setting denoting if the auto-brightness for the current user is enabled or not
+    private boolean mUseAutoBrightness = false;
+    // Indicates if the auto-brightness is currently enabled or not. It's possible that even if
+    // the user has enabled the auto-brightness from the settings, it is disabled because the
+    // display is off
+    private boolean mIsAutoBrightnessEnabled = false;
+    // Indicates if auto-brightness is disabled due to the display being off. Needed for metric
+    // purposes.
+    private boolean mAutoBrightnessDisabledDueToDisplayOff;
+    // If the auto-brightness model for the last manual changes done by the user.
+    private boolean mIsShortTermModelActive = false;
+
+    // The BrightnessConfiguration currently being used
+    // Todo(273543270): BrightnessConfiguration is an internal implementation detail of
+    //  AutomaticBrightnessController, and AutomaticBrightnessStrategy shouldn't be aware of its
+    //  existence.
+    @Nullable
+    private BrightnessConfiguration mBrightnessConfiguration;
+
+    public AutomaticBrightnessStrategy2(Context context, int displayId) {
+        mContext = context;
+        mDisplayId = displayId;
+        mAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting();
+        mPendingAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT;
+        mTemporaryAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT;
+    }
+
+    /**
+     * Sets up the automatic brightness states of this class. Also configures
+     * AutomaticBrightnessController accounting for any manual changes made by the user.
+     */
+    public void setAutoBrightnessState(int targetDisplayState,
+            boolean allowAutoBrightnessWhileDozingConfig, int brightnessReason, int policy,
+            float lastUserSetScreenBrightness, boolean userSetBrightnessChanged) {
+        final boolean autoBrightnessEnabledInDoze =
+                allowAutoBrightnessWhileDozingConfig && policy == POLICY_DOZE;
+        mIsAutoBrightnessEnabled = shouldUseAutoBrightness()
+                && (targetDisplayState == Display.STATE_ON || autoBrightnessEnabledInDoze)
+                && brightnessReason != BrightnessReason.REASON_OVERRIDE
+                && mAutomaticBrightnessController != null;
+        mAutoBrightnessDisabledDueToDisplayOff = shouldUseAutoBrightness()
+                && !(targetDisplayState == Display.STATE_ON || autoBrightnessEnabledInDoze);
+        final int autoBrightnessState = mIsAutoBrightnessEnabled
+                && brightnessReason != BrightnessReason.REASON_FOLLOWER
+                ? AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED
+                : mAutoBrightnessDisabledDueToDisplayOff
+                        ? AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE
+                        : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED;
+
+        accommodateUserBrightnessChanges(userSetBrightnessChanged, lastUserSetScreenBrightness,
+                policy, targetDisplayState, mBrightnessConfiguration, autoBrightnessState);
+    }
+
+    public boolean isAutoBrightnessEnabled() {
+        return mIsAutoBrightnessEnabled;
+    }
+
+    public boolean isAutoBrightnessDisabledDueToDisplayOff() {
+        return mAutoBrightnessDisabledDueToDisplayOff;
+    }
+
+    /**
+     * Updates the {@link BrightnessConfiguration} that is currently being used by the associated
+     * display.
+     */
+    public void setBrightnessConfiguration(BrightnessConfiguration brightnessConfiguration,
+            boolean shouldResetShortTermModel) {
+        mBrightnessConfiguration = brightnessConfiguration;
+        setShouldResetShortTermModel(shouldResetShortTermModel);
+    }
+
+    /**
+     * Promotes the pending auto-brightness adjustments which are yet to be applied to the current
+     * adjustments. Note that this is not applying the new adjustments to the AutoBrightness mapping
+     * strategies, but is only accommodating the changes in this class.
+     */
+    public boolean processPendingAutoBrightnessAdjustments() {
+        mAutoBrightnessAdjustmentChanged = false;
+        if (Float.isNaN(mPendingAutoBrightnessAdjustment)) {
+            return false;
+        }
+        if (mAutoBrightnessAdjustment == mPendingAutoBrightnessAdjustment) {
+            mPendingAutoBrightnessAdjustment = Float.NaN;
+            return false;
+        }
+        mAutoBrightnessAdjustment = mPendingAutoBrightnessAdjustment;
+        mPendingAutoBrightnessAdjustment = Float.NaN;
+        mTemporaryAutoBrightnessAdjustment = Float.NaN;
+        mAutoBrightnessAdjustmentChanged = true;
+        return true;
+    }
+
+    /**
+     * Updates the associated AutomaticBrightnessController
+     */
+    public void setAutomaticBrightnessController(
+            AutomaticBrightnessController automaticBrightnessController) {
+        if (automaticBrightnessController == mAutomaticBrightnessController) {
+            return;
+        }
+        if (mAutomaticBrightnessController != null) {
+            mAutomaticBrightnessController.stop();
+        }
+        mAutomaticBrightnessController = automaticBrightnessController;
+    }
+
+    /**
+     * Returns if the auto-brightness of the associated display has been enabled or not
+     */
+    public boolean shouldUseAutoBrightness() {
+        return mUseAutoBrightness;
+    }
+
+    /**
+     * Sets the auto-brightness state of the associated display. Called when the user makes a change
+     * in the system setting to enable/disable the auto-brightness.
+     */
+    public void setUseAutoBrightness(boolean useAutoBrightness) {
+        mUseAutoBrightness = useAutoBrightness;
+    }
+
+    /**
+     * Returns if the user made brightness change events(Typically when they interact with the
+     * brightness slider) were accommodated in the auto-brightness mapping strategies. This doesn't
+     * account for the latest changes that have been made by the user.
+     */
+    public boolean isShortTermModelActive() {
+        return mIsShortTermModelActive;
+    }
+
+    /**
+     * Sets the pending auto-brightness adjustments in the system settings. Executed
+     * when there is a change in the brightness system setting, or when there is a user switch.
+     */
+    public void updatePendingAutoBrightnessAdjustments() {
+        final float adj = Settings.System.getFloatForUser(mContext.getContentResolver(),
+                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.0f, UserHandle.USER_CURRENT);
+        mPendingAutoBrightnessAdjustment = Float.isNaN(adj) ? Float.NaN
+                : BrightnessUtils.clampBrightnessAdjustment(adj);
+    }
+
+    /**
+     * Sets the temporary auto-brightness adjustments
+     */
+    public void setTemporaryAutoBrightnessAdjustment(float temporaryAutoBrightnessAdjustment) {
+        mTemporaryAutoBrightnessAdjustment = temporaryAutoBrightnessAdjustment;
+    }
+
+    /**
+     * Dumps the state of this class.
+     */
+    public void dump(PrintWriter writer) {
+        writer.println("AutomaticBrightnessStrategy:");
+        writer.println("  mDisplayId=" + mDisplayId);
+        writer.println("  mAutoBrightnessAdjustment=" + mAutoBrightnessAdjustment);
+        writer.println("  mPendingAutoBrightnessAdjustment=" + mPendingAutoBrightnessAdjustment);
+        writer.println(
+                "  mTemporaryAutoBrightnessAdjustment=" + mTemporaryAutoBrightnessAdjustment);
+        writer.println("  mShouldResetShortTermModel=" + mShouldResetShortTermModel);
+        writer.println("  mAppliedAutoBrightness=" + mAppliedAutoBrightness);
+        writer.println("  mAutoBrightnessAdjustmentChanged=" + mAutoBrightnessAdjustmentChanged);
+        writer.println("  mAppliedTemporaryAutoBrightnessAdjustment="
+                + mAppliedTemporaryAutoBrightnessAdjustment);
+        writer.println("  mUseAutoBrightness=" + mUseAutoBrightness);
+        writer.println("  mWasShortTermModelActive=" + mIsShortTermModelActive);
+        writer.println("  mAutoBrightnessAdjustmentReasonsFlags="
+                + mAutoBrightnessAdjustmentReasonsFlags);
+    }
+
+    /**
+     * Indicates if any auto-brightness adjustments have happened since the last auto-brightness was
+     * set.
+     */
+    public boolean getAutoBrightnessAdjustmentChanged() {
+        return mAutoBrightnessAdjustmentChanged;
+    }
+
+    /**
+     * Returns whether the latest temporary auto-brightness adjustments have been applied or not
+     */
+    public boolean isTemporaryAutoBrightnessAdjustmentApplied() {
+        return mAppliedTemporaryAutoBrightnessAdjustment;
+    }
+
+    /**
+     * Evaluates the target automatic brightness of the associated display.
+     * @param brightnessEvent Event object to populate with details about why the specific
+     *                        brightness was chosen.
+     */
+    public float getAutomaticScreenBrightness(BrightnessEvent brightnessEvent) {
+        float brightness = (mAutomaticBrightnessController != null)
+                ? mAutomaticBrightnessController.getAutomaticScreenBrightness(brightnessEvent)
+                : PowerManager.BRIGHTNESS_INVALID_FLOAT;
+        adjustAutomaticBrightnessStateIfValid(brightness);
+        return brightness;
+    }
+
+    /**
+     * Get the automatic screen brightness based on the last observed lux reading. Used e.g. when
+     * entering doze - we disable the light sensor, invalidate the lux, but we still need to set
+     * the initial brightness in doze mode.
+     * @param brightnessEvent Event object to populate with details about why the specific
+     *                        brightness was chosen.
+     */
+    public float getAutomaticScreenBrightnessBasedOnLastObservedLux(
+            BrightnessEvent brightnessEvent) {
+        float brightness = (mAutomaticBrightnessController != null)
+                ? mAutomaticBrightnessController
+                .getAutomaticScreenBrightnessBasedOnLastObservedLux(brightnessEvent)
+                : PowerManager.BRIGHTNESS_INVALID_FLOAT;
+        adjustAutomaticBrightnessStateIfValid(brightness);
+        return brightness;
+    }
+
+    /**
+     * Gets the auto-brightness adjustment flag change reason
+     */
+    public int getAutoBrightnessAdjustmentReasonsFlags() {
+        return mAutoBrightnessAdjustmentReasonsFlags;
+    }
+
+    /**
+     * Returns if the auto brightness has been applied
+     */
+    public boolean hasAppliedAutoBrightness() {
+        return mAppliedAutoBrightness;
+    }
+
+    /**
+     * Used to adjust the state of this class when the automatic brightness value for the
+     * associated display is valid
+     */
+    @VisibleForTesting
+    void adjustAutomaticBrightnessStateIfValid(float brightnessState) {
+        mAutoBrightnessAdjustmentReasonsFlags = isTemporaryAutoBrightnessAdjustmentApplied()
+                ? BrightnessReason.ADJUSTMENT_AUTO_TEMP
+                : BrightnessReason.ADJUSTMENT_AUTO;
+        float newAutoBrightnessAdjustment =
+                (mAutomaticBrightnessController != null)
+                        ? mAutomaticBrightnessController.getAutomaticScreenBrightnessAdjustment()
+                        : 0.0f;
+        if (!Float.isNaN(newAutoBrightnessAdjustment)
+                && mAutoBrightnessAdjustment != newAutoBrightnessAdjustment) {
+            // If the auto-brightness controller has decided to change the adjustment value
+            // used, make sure that's reflected in settings.
+            putAutoBrightnessAdjustmentSetting(newAutoBrightnessAdjustment);
+        } else {
+            mAutoBrightnessAdjustmentReasonsFlags = 0;
+        }
+    }
+
+    /**
+     * Sets up the system to reset the short term model. Note that this will not reset the model
+     * right away, but ensures that the reset happens whenever the next brightness change happens
+     */
+    @VisibleForTesting
+    void setShouldResetShortTermModel(boolean shouldResetShortTermModel) {
+        mShouldResetShortTermModel = shouldResetShortTermModel;
+    }
+
+    @VisibleForTesting
+    boolean shouldResetShortTermModel() {
+        return mShouldResetShortTermModel;
+    }
+
+    @VisibleForTesting
+    float getAutoBrightnessAdjustment() {
+        return mAutoBrightnessAdjustment;
+    }
+
+    @VisibleForTesting
+    float getPendingAutoBrightnessAdjustment() {
+        return mPendingAutoBrightnessAdjustment;
+    }
+
+    @VisibleForTesting
+    float getTemporaryAutoBrightnessAdjustment() {
+        return mTemporaryAutoBrightnessAdjustment;
+    }
+
+    @VisibleForTesting
+    void putAutoBrightnessAdjustmentSetting(float adjustment) {
+        if (mDisplayId == Display.DEFAULT_DISPLAY) {
+            mAutoBrightnessAdjustment = adjustment;
+            Settings.System.putFloatForUser(mContext.getContentResolver(),
+                    Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adjustment,
+                    UserHandle.USER_CURRENT);
+        }
+    }
+
+    /**
+     * Sets if the auto-brightness is applied on the latest brightness change.
+     */
+    public void setAutoBrightnessApplied(boolean autoBrightnessApplied) {
+        mAppliedAutoBrightness = autoBrightnessApplied;
+    }
+
+    /**
+     * Accommodates the latest manual changes made by the user. Also updates {@link
+     * AutomaticBrightnessController} about the changes and configures it accordingly.
+     */
+    @VisibleForTesting
+    void accommodateUserBrightnessChanges(boolean userSetBrightnessChanged,
+            float lastUserSetScreenBrightness, int policy, int displayState,
+            BrightnessConfiguration brightnessConfiguration, int autoBrightnessState) {
+        // Update the pending auto-brightness adjustments if any. This typically checks and adjusts
+        // the state of the class if the user moves the brightness slider and has settled to a
+        // different value
+        processPendingAutoBrightnessAdjustments();
+        // Update the temporary auto-brightness adjustments if any. This typically checks and
+        // adjusts the state of this class if the user is in the process of moving the brightness
+        // slider, but hasn't settled to any value yet
+        float autoBrightnessAdjustment = updateTemporaryAutoBrightnessAdjustments();
+        mIsShortTermModelActive = false;
+        // Configure auto-brightness.
+        if (mAutomaticBrightnessController != null) {
+            // Accommodate user changes if any in the auto-brightness model
+            mAutomaticBrightnessController.configure(autoBrightnessState,
+                    brightnessConfiguration,
+                    lastUserSetScreenBrightness,
+                    userSetBrightnessChanged, autoBrightnessAdjustment,
+                    mAutoBrightnessAdjustmentChanged, policy, displayState,
+                    mShouldResetShortTermModel);
+            mShouldResetShortTermModel = false;
+            // We take note if the user brightness point is still being used in the current
+            // auto-brightness model.
+            mIsShortTermModelActive = mAutomaticBrightnessController.hasUserDataPoints();
+        }
+    }
+
+    /**
+     * Evaluates if there are any temporary auto-brightness adjustments which is not applied yet.
+     * Temporary brightness adjustments happen when the user moves the brightness slider in the
+     * auto-brightness mode, but hasn't settled to a value yet
+     */
+    private float updateTemporaryAutoBrightnessAdjustments() {
+        mAppliedTemporaryAutoBrightnessAdjustment =
+                !Float.isNaN(mTemporaryAutoBrightnessAdjustment);
+        // We do not update the mAutoBrightnessAdjustment with mTemporaryAutoBrightnessAdjustment
+        // since we have not settled to a value yet
+        return mAppliedTemporaryAutoBrightnessAdjustment
+                ? mTemporaryAutoBrightnessAdjustment : mAutoBrightnessAdjustment;
+    }
+
+    /**
+     * Returns the auto-brightness adjustment that is set in the system setting.
+     */
+    private float getAutoBrightnessAdjustmentSetting() {
+        final float adj = Settings.System.getFloatForUser(mContext.getContentResolver(),
+                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.0f, UserHandle.USER_CURRENT);
+        return Float.isNaN(adj) ? 0.0f : BrightnessUtils.clampBrightnessAdjustment(adj);
+    }
+}
diff --git a/services/core/java/com/android/server/display/brightness/strategy/BoostBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/BoostBrightnessStrategy.java
index 11edde9..9c1aceab 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/BoostBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/BoostBrightnessStrategy.java
@@ -53,6 +53,11 @@
     }
 
     @Override
+    public int getReason() {
+        return BrightnessReason.REASON_BOOST;
+    }
+
+    @Override
     public void dump(PrintWriter writer) {}
 
     @Override
diff --git a/services/core/java/com/android/server/display/brightness/strategy/DisplayBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/DisplayBrightnessStrategy.java
index 7b49957..61dd6d5 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/DisplayBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/DisplayBrightnessStrategy.java
@@ -45,6 +45,11 @@
     String getName();
 
     /**
+     * Returns the reason for the change of the brightness
+     */
+    int getReason();
+
+    /**
      * Dumps the state of the Strategy
      * @param writer
      */
diff --git a/services/core/java/com/android/server/display/brightness/strategy/DozeBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/DozeBrightnessStrategy.java
index 5afdc42..1f7efd1 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/DozeBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/DozeBrightnessStrategy.java
@@ -53,4 +53,9 @@
             StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
         // DO NOTHING
     }
+
+    @Override
+    public int getReason() {
+        return BrightnessReason.REASON_DOZE;
+    }
 }
diff --git a/services/core/java/com/android/server/display/brightness/strategy/FollowerBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/FollowerBrightnessStrategy.java
index 0650c1c..baac276 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/FollowerBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/FollowerBrightnessStrategy.java
@@ -89,4 +89,9 @@
             StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
         // DO NOTHING
     }
+
+    @Override
+    public int getReason() {
+        return BrightnessReason.REASON_FOLLOWER;
+    }
 }
diff --git a/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java
index bf37ee0..4abd028 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java
@@ -51,4 +51,9 @@
             StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
         // DO NOTHING
     }
+
+    @Override
+    public int getReason() {
+        return BrightnessReason.REASON_UNKNOWN;
+    }
 }
diff --git a/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java
index d2bb1e2..64dc47c 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java
@@ -79,4 +79,9 @@
             StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
         // DO NOTHING
     }
+
+    @Override
+    public int getReason() {
+        return BrightnessReason.REASON_OFFLOAD;
+    }
 }
diff --git a/services/core/java/com/android/server/display/brightness/strategy/OverrideBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/OverrideBrightnessStrategy.java
index 653170c..9605a88 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/OverrideBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/OverrideBrightnessStrategy.java
@@ -52,4 +52,9 @@
             StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
         // DO NOTHING
     }
+
+    @Override
+    public int getReason() {
+        return BrightnessReason.REASON_OVERRIDE;
+    }
 }
diff --git a/services/core/java/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategy.java
index f0cce23..c9dc298 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/ScreenOffBrightnessStrategy.java
@@ -53,4 +53,9 @@
             StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
         // DO NOTHING
     }
+
+    @Override
+    public int getReason() {
+        return BrightnessReason.REASON_SCREEN_OFF;
+    }
 }
diff --git a/services/core/java/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategy.java
index 91e1d09..6a691d1 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/TemporaryBrightnessStrategy.java
@@ -80,4 +80,9 @@
             StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
         // DO NOTHING
     }
+
+    @Override
+    public int getReason() {
+        return BrightnessReason.REASON_TEMPORARY;
+    }
 }
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 a313bcf..0bb93a9 100644
--- a/services/core/java/com/android/server/display/color/ColorDisplayService.java
+++ b/services/core/java/com/android/server/display/color/ColorDisplayService.java
@@ -1632,6 +1632,15 @@
             return mAppSaturationController
                     .addColorTransformController(packageName, userId, controller);
         }
+
+        /**
+         * Applies tint changes for even dimmer feature.
+         */
+        public void applyEvenDimmerColorChanges(boolean enabled, int strength) {
+            mReduceBrightColorsTintController.setActivated(enabled);
+            mReduceBrightColorsTintController.setMatrix(strength);
+            mHandler.sendEmptyMessage(MSG_APPLY_REDUCE_BRIGHT_COLORS);
+        }
     }
 
     /**
diff --git a/services/core/java/com/android/server/display/config/EvenDimmerBrightnessData.java b/services/core/java/com/android/server/display/config/EvenDimmerBrightnessData.java
new file mode 100644
index 0000000..7e2e10a
--- /dev/null
+++ b/services/core/java/com/android/server/display/config/EvenDimmerBrightnessData.java
@@ -0,0 +1,191 @@
+/*
+ * 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.display.config;
+
+import android.annotation.Nullable;
+import android.util.Slog;
+import android.util.Spline;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Brightness config for even dimmer
+ */
+public class EvenDimmerBrightnessData {
+    private static final String TAG = "EvenDimmerBrightnessData";
+
+    /**
+     * Brightness value at which even dimmer methods are used.
+     */
+    public final float mTransitionPoint;
+
+    /**
+     * Nits array, maps to mBacklight
+     */
+    public final float[] mNits;
+
+    /**
+     * Backlight array, maps to mBrightness and mNits
+     */
+    public final float[] mBacklight;
+
+    /**
+     * Brightness array, maps to mBacklight
+     */
+    public final float[] mBrightness;
+    /**
+     * Spline, mapping between backlight and nits
+     */
+    public final Spline mBacklightToNits;
+    /**
+     * Spline, mapping between nits and backlight
+     */
+    public final Spline mNitsToBacklight;
+    /**
+     * Spline, mapping between brightness and backlight
+     */
+    public final Spline mBrightnessToBacklight;
+    /**
+     * Spline, mapping between backlight and brightness
+     */
+    public final Spline mBacklightToBrightness;
+
+    /**
+     * Spline, mapping the minimum nits for each lux condition.
+     */
+    public final Spline mMinLuxToNits;
+
+    @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;
+    }
+
+    @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
+                + "} ";
+    }
+
+    /**
+     * Loads EvenDimmerBrightnessData from DisplayConfiguration
+     */
+    @Nullable
+    public static EvenDimmerBrightnessData loadConfig(DisplayConfiguration config) {
+        final EvenDimmerMode lbm = config.getEvenDimmer();
+        if (lbm == null) {
+            return null;
+        }
+
+        boolean lbmIsEnabled = lbm.getEnabled();
+        if (!lbmIsEnabled) {
+            return null;
+        }
+
+        ComprehensiveBrightnessMap map = lbm.getBrightnessMapping();
+        if (map == null) {
+            return null;
+        }
+        String interpolation = map.getInterpolation();
+
+        List<BrightnessPoint> brightnessPoints = map.getBrightnessPoint();
+        if (brightnessPoints.isEmpty()) {
+            return null;
+        }
+
+        float[] nits = new float[brightnessPoints.size()];
+        float[] backlight = new float[brightnessPoints.size()];
+        float[] brightness = new float[brightnessPoints.size()];
+
+        for (int i = 0; i < brightnessPoints.size(); i++) {
+            BrightnessPoint val = brightnessPoints.get(i);
+            nits[i] = val.getNits().floatValue();
+            backlight[i] = val.getBacklight().floatValue();
+            brightness[i] = val.getBrightness().floatValue();
+        }
+
+        float transitionPoint = lbm.getTransitionPoint().floatValue();
+        final NitsMap minimumNitsMap = lbm.getLuxToMinimumNitsMap();
+        if (minimumNitsMap == null) {
+            Slog.e(TAG, "Invalid min lux to nits mapping");
+            return null;
+        }
+        final List<Point> points = minimumNitsMap.getPoint();
+        final int size = points.size();
+
+        float[] minLux = new float[size];
+        float[] minNits = new float[size];
+
+        int i = 0;
+        for (Point point : points) {
+            minLux[i] = point.getValue().floatValue();
+            minNits[i] = point.getNits().floatValue();
+            if (i > 0) {
+                if (minLux[i] < minLux[i - 1]) {
+                    Slog.e(TAG, "minLuxToNitsSpline must be non-decreasing, ignoring rest "
+                            + " of configuration. Value: " + minLux[i] + " < " + minLux[i - 1]);
+                }
+                if (minNits[i] < minNits[i - 1]) {
+                    Slog.e(TAG, "minLuxToNitsSpline must be non-decreasing, ignoring rest "
+                            + " of configuration. Nits: " + minNits[i] + " < " + minNits[i - 1]);
+                }
+            }
+            ++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),
+                Spline.createSpline(minLux, minNits)
+        );
+    }
+}
diff --git a/services/core/java/com/android/server/display/config/HysteresisLevels.java b/services/core/java/com/android/server/display/config/HysteresisLevels.java
new file mode 100644
index 0000000..e659d88
--- /dev/null
+++ b/services/core/java/com/android/server/display/config/HysteresisLevels.java
@@ -0,0 +1,463 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.config;
+
+import android.annotation.ArrayRes;
+import android.annotation.Nullable;
+import android.content.res.Resources;
+import android.util.Pair;
+import android.util.Slog;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.display.utils.DebugUtils;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * A helper class for handling access to illuminance hysteresis level values.
+ */
+public class HysteresisLevels {
+    private static final String TAG = "HysteresisLevels";
+
+    private static final float[] DEFAULT_AMBIENT_BRIGHTENING_THRESHOLDS = new float[]{100f};
+    private static final float[] DEFAULT_AMBIENT_DARKENING_THRESHOLDS = new float[]{200f};
+    private static final float[] DEFAULT_AMBIENT_THRESHOLD_LEVELS = new float[]{0f};
+    private static final float[] DEFAULT_SCREEN_THRESHOLD_LEVELS = new float[]{0f};
+    private static final float[] DEFAULT_SCREEN_BRIGHTENING_THRESHOLDS = new float[]{100f};
+    private static final float[] DEFAULT_SCREEN_DARKENING_THRESHOLDS = new float[]{200f};
+
+    // To enable these logs, run:
+    // 'adb shell setprop persist.log.tag.HysteresisLevels DEBUG && adb reboot'
+    private static final boolean DEBUG = DebugUtils.isDebuggable(TAG);
+
+    /**
+     * The array that describes the brightness threshold percentage change
+     * at each brightness level described in mBrighteningThresholdLevels.
+     */
+    private final float[] mBrighteningThresholdsPercentages;
+
+    /**
+     * The array that describes the brightness threshold percentage change
+     * at each brightness level described in mDarkeningThresholdLevels.
+     */
+    private final float[] mDarkeningThresholdsPercentages;
+
+    /**
+     * The array that describes the range of brightness that each threshold percentage applies to
+     *
+     * The (zero-based) index is calculated as follows
+     * value = current brightness value
+     * level = mBrighteningThresholdLevels
+     *
+     * condition                       return
+     * value < mBrighteningThresholdLevels[0]                = 0.0f
+     * level[n] <= value < level[n+1]  = mBrighteningThresholdsPercentages[n]
+     * level[MAX] <= value             = mBrighteningThresholdsPercentages[MAX]
+     */
+    private final float[] mBrighteningThresholdLevels;
+
+    /**
+     * The array that describes the range of brightness that each threshold percentage applies to
+     *
+     * The (zero-based) index is calculated as follows
+     * value = current brightness value
+     * level = mDarkeningThresholdLevels
+     *
+     * condition                       return
+     * value < level[0]                = 0.0f
+     * level[n] <= value < level[n+1]  = mDarkeningThresholdsPercentages[n]
+     * level[MAX] <= value             = mDarkeningThresholdsPercentages[MAX]
+     */
+    private final float[] mDarkeningThresholdLevels;
+
+    /**
+     * The minimum value decrease for darkening event
+     */
+    private final float mMinDarkening;
+
+    /**
+     * The minimum value increase for brightening event.
+     */
+    private final float mMinBrightening;
+
+    /**
+     * Creates a {@code HysteresisLevels} object with the given equal-length
+     * float arrays.
+     *
+     * @param brighteningThresholdsPercentages 0-100 of thresholds
+     * @param darkeningThresholdsPercentages   0-100 of thresholds
+     * @param brighteningThresholdLevels       float array of brightness values in the relevant
+     *                                         units
+     * @param minBrighteningThreshold          the minimum value for which the brightening value
+     *                                         needs to
+     *                                         return.
+     * @param minDarkeningThreshold            the minimum value for which the darkening value needs
+     *                                         to return.
+     */
+    @VisibleForTesting
+    public HysteresisLevels(float[] brighteningThresholdsPercentages,
+            float[] darkeningThresholdsPercentages,
+            float[] brighteningThresholdLevels, float[] darkeningThresholdLevels,
+            float minDarkeningThreshold, float minBrighteningThreshold) {
+        if (brighteningThresholdsPercentages.length != brighteningThresholdLevels.length
+                || darkeningThresholdsPercentages.length != darkeningThresholdLevels.length) {
+            throw new IllegalArgumentException("Mismatch between hysteresis array lengths.");
+        }
+        mBrighteningThresholdsPercentages =
+                setArrayFormat(brighteningThresholdsPercentages, 100.0f);
+        mDarkeningThresholdsPercentages =
+                setArrayFormat(darkeningThresholdsPercentages, 100.0f);
+        mBrighteningThresholdLevels = setArrayFormat(brighteningThresholdLevels, 1.0f);
+        mDarkeningThresholdLevels = setArrayFormat(darkeningThresholdLevels, 1.0f);
+        mMinDarkening = minDarkeningThreshold;
+        mMinBrightening = minBrighteningThreshold;
+    }
+
+    /**
+     * Return the brightening hysteresis threshold for the given value level.
+     */
+    public float getBrighteningThreshold(float value) {
+        final float brightConstant = getReferenceLevel(value,
+                mBrighteningThresholdLevels, mBrighteningThresholdsPercentages);
+
+        float brightThreshold = value * (1.0f + brightConstant);
+        if (DEBUG) {
+            Slog.d(TAG, "bright hysteresis constant=" + brightConstant + ", threshold="
+                    + brightThreshold + ", value=" + value);
+        }
+
+        brightThreshold = Math.max(brightThreshold, value + mMinBrightening);
+        return brightThreshold;
+    }
+
+    /**
+     * Return the darkening hysteresis threshold for the given value level.
+     */
+    public float getDarkeningThreshold(float value) {
+        final float darkConstant = getReferenceLevel(value,
+                mDarkeningThresholdLevels, mDarkeningThresholdsPercentages);
+        float darkThreshold = value * (1.0f - darkConstant);
+        if (DEBUG) {
+            Slog.d(TAG, "dark hysteresis constant=: " + darkConstant + ", threshold="
+                    + darkThreshold + ", value=" + value);
+        }
+        darkThreshold = Math.min(darkThreshold, value - mMinDarkening);
+        return Math.max(darkThreshold, 0.0f);
+    }
+
+    @VisibleForTesting
+    public float[] getBrighteningThresholdsPercentages() {
+        return mBrighteningThresholdsPercentages;
+    }
+
+    @VisibleForTesting
+    public float[] getDarkeningThresholdsPercentages() {
+        return mDarkeningThresholdsPercentages;
+    }
+
+    @VisibleForTesting
+    public float[] getBrighteningThresholdLevels() {
+        return mBrighteningThresholdLevels;
+    }
+
+    @VisibleForTesting
+    public float[] getDarkeningThresholdLevels() {
+        return mDarkeningThresholdLevels;
+    }
+
+    @VisibleForTesting
+    public float getMinDarkening() {
+        return mMinDarkening;
+    }
+
+    @VisibleForTesting
+    public float getMinBrightening() {
+        return mMinBrightening;
+    }
+
+    /**
+     * Return the hysteresis constant for the closest threshold value from the given array.
+     */
+    private float getReferenceLevel(float value, float[] thresholdLevels,
+            float[] thresholdPercentages) {
+        if (thresholdLevels == null || thresholdLevels.length == 0 || value < thresholdLevels[0]) {
+            return 0.0f;
+        }
+        int index = 0;
+        while (index < thresholdLevels.length - 1 && value >= thresholdLevels[index + 1]) {
+            index++;
+        }
+        return thresholdPercentages[index];
+    }
+
+    /**
+     * Return a float array where each i-th element equals {@code configArray[i]/divideFactor}.
+     */
+    private float[] setArrayFormat(float[] configArray, float divideFactor) {
+        float[] levelArray = new float[configArray.length];
+        for (int index = 0; levelArray.length > index; ++index) {
+            levelArray[index] = configArray[index] / divideFactor;
+        }
+        return levelArray;
+    }
+
+    @Override
+    public String toString() {
+        return "HysteresisLevels {"
+                + "\n"
+                + "    mBrighteningThresholdLevels=" + Arrays.toString(mBrighteningThresholdLevels)
+                + ",\n"
+                + "    mBrighteningThresholdsPercentages="
+                + Arrays.toString(mBrighteningThresholdsPercentages)
+                + ",\n"
+                + "    mMinBrightening=" + mMinBrightening
+                + ",\n"
+                + "    mDarkeningThresholdLevels=" + Arrays.toString(mDarkeningThresholdLevels)
+                + ",\n"
+                + "    mDarkeningThresholdsPercentages="
+                + Arrays.toString(mDarkeningThresholdsPercentages)
+                + ",\n"
+                + "    mMinDarkening=" + mMinDarkening
+                + "\n"
+                + "}";
+    }
+
+    /**
+     * Creates hysteresis levels for Active Ambient Lux
+     */
+    public static HysteresisLevels loadAmbientBrightnessConfig(
+            @Nullable DisplayConfiguration config, @Nullable Resources resources) {
+        return createHysteresisLevels(
+                config == null ? null : config.getAmbientBrightnessChangeThresholds(),
+                com.android.internal.R.array.config_ambientThresholdLevels,
+                com.android.internal.R.array.config_ambientBrighteningThresholds,
+                com.android.internal.R.array.config_ambientDarkeningThresholds,
+                DEFAULT_AMBIENT_THRESHOLD_LEVELS,
+                DEFAULT_AMBIENT_BRIGHTENING_THRESHOLDS,
+                DEFAULT_AMBIENT_DARKENING_THRESHOLDS,
+                resources, /* potentialOldBrightnessScale= */ false);
+    }
+
+    /**
+     * Creates hysteresis levels for Active Screen Brightness
+     */
+    public static HysteresisLevels loadDisplayBrightnessConfig(
+            @Nullable DisplayConfiguration config, @Nullable Resources resources) {
+        return createHysteresisLevels(
+                config == null ? null : config.getDisplayBrightnessChangeThresholds(),
+                com.android.internal.R.array.config_screenThresholdLevels,
+                com.android.internal.R.array.config_screenBrighteningThresholds,
+                com.android.internal.R.array.config_screenDarkeningThresholds,
+                DEFAULT_SCREEN_THRESHOLD_LEVELS,
+                DEFAULT_SCREEN_BRIGHTENING_THRESHOLDS,
+                DEFAULT_SCREEN_DARKENING_THRESHOLDS,
+                resources, /* potentialOldBrightnessScale= */ true);
+    }
+
+    /**
+     * Creates hysteresis levels for Idle Ambient Lux
+     */
+    public static HysteresisLevels loadAmbientBrightnessIdleConfig(
+            @Nullable DisplayConfiguration config, @Nullable Resources resources) {
+        return createHysteresisLevels(
+                config == null ? null : config.getAmbientBrightnessChangeThresholdsIdle(),
+                com.android.internal.R.array.config_ambientThresholdLevels,
+                com.android.internal.R.array.config_ambientBrighteningThresholds,
+                com.android.internal.R.array.config_ambientDarkeningThresholds,
+                DEFAULT_AMBIENT_THRESHOLD_LEVELS,
+                DEFAULT_AMBIENT_BRIGHTENING_THRESHOLDS,
+                DEFAULT_AMBIENT_DARKENING_THRESHOLDS,
+                resources, /* potentialOldBrightnessScale= */ false);
+    }
+
+    /**
+     * Creates hysteresis levels for Idle Screen Brightness
+     */
+    public static HysteresisLevels loadDisplayBrightnessIdleConfig(
+            @Nullable DisplayConfiguration config, @Nullable Resources resources) {
+        return createHysteresisLevels(
+                config == null ? null : config.getDisplayBrightnessChangeThresholdsIdle(),
+                com.android.internal.R.array.config_screenThresholdLevels,
+                com.android.internal.R.array.config_screenBrighteningThresholds,
+                com.android.internal.R.array.config_screenDarkeningThresholds,
+                DEFAULT_SCREEN_THRESHOLD_LEVELS,
+                DEFAULT_SCREEN_BRIGHTENING_THRESHOLDS,
+                DEFAULT_SCREEN_DARKENING_THRESHOLDS,
+                resources, /* potentialOldBrightnessScale= */ true);
+    }
+
+
+    private static HysteresisLevels createHysteresisLevels(
+            @Nullable Thresholds thresholds,
+            @ArrayRes int configLevels,
+            @ArrayRes int configBrighteningThresholds,
+            @ArrayRes int configDarkeningThresholds,
+            float[] defaultLevels,
+            float[] defaultBrighteningThresholds,
+            float[] defaultDarkeningThresholds,
+            @Nullable Resources resources,
+            boolean potentialOldBrightnessScale
+    ) {
+        BrightnessThresholds brighteningThresholds =
+                thresholds == null ? null : thresholds.getBrighteningThresholds();
+        BrightnessThresholds darkeningThresholds =
+                thresholds == null ? null : thresholds.getDarkeningThresholds();
+
+        Pair<float[], float[]> brighteningPair = getBrightnessLevelAndPercentage(
+                brighteningThresholds,
+                configLevels, configBrighteningThresholds,
+                defaultLevels, defaultBrighteningThresholds,
+                potentialOldBrightnessScale, resources);
+
+        Pair<float[], float[]> darkeningPair = getBrightnessLevelAndPercentage(
+                darkeningThresholds,
+                configLevels, configDarkeningThresholds,
+                defaultLevels, defaultDarkeningThresholds,
+                potentialOldBrightnessScale, resources);
+
+        float brighteningMinThreshold =
+                brighteningThresholds != null && brighteningThresholds.getMinimum() != null
+                        ? brighteningThresholds.getMinimum().floatValue() : 0f;
+        float darkeningMinThreshold =
+                darkeningThresholds != null && darkeningThresholds.getMinimum() != null
+                        ? darkeningThresholds.getMinimum().floatValue() : 0f;
+
+        return new HysteresisLevels(
+                brighteningPair.second,
+                darkeningPair.second,
+                brighteningPair.first,
+                darkeningPair.first,
+                darkeningMinThreshold,
+                brighteningMinThreshold
+        );
+    }
+
+    // Returns two float arrays, one of the brightness levels and one of the corresponding threshold
+    // percentages for brightness levels at or above the lux value.
+    // Historically, config.xml would have an array for brightness levels that was 1 shorter than
+    // the levels array. Now we prepend a 0 to this array so they can be treated the same in the
+    // rest of the framework. Values were also defined in different units (permille vs percent).
+    private static Pair<float[], float[]> getBrightnessLevelAndPercentage(
+            @Nullable BrightnessThresholds thresholds,
+            int configFallbackThreshold, int configFallbackPermille,
+            float[] defaultLevels, float[] defaultPercentage, boolean potentialOldBrightnessScale,
+            @Nullable Resources resources) {
+        if (thresholds != null
+                && thresholds.getBrightnessThresholdPoints() != null
+                && !thresholds.getBrightnessThresholdPoints().getBrightnessThresholdPoint()
+                .isEmpty()) {
+
+            // The level and percentages arrays are equal length in the ddc (new system)
+            List<ThresholdPoint> points =
+                    thresholds.getBrightnessThresholdPoints().getBrightnessThresholdPoint();
+            final int size = points.size();
+
+            float[] thresholdLevels = new float[size];
+            float[] thresholdPercentages = new float[size];
+
+            int i = 0;
+            for (ThresholdPoint point : points) {
+                thresholdLevels[i] = point.getThreshold().floatValue();
+                thresholdPercentages[i] = point.getPercentage().floatValue();
+                i++;
+            }
+            return new Pair<>(thresholdLevels, thresholdPercentages);
+        } else if (resources != null) {
+            // The level and percentages arrays are unequal length in config.xml (old system)
+            // We prefix the array with a 0 value to ensure they can be handled consistently
+            // with the new system.
+
+            // Load levels array
+            int[] configThresholdArray = resources.getIntArray(configFallbackThreshold);
+            int configThresholdsSize;
+            // null check is not needed here, however it test we are mocking resources that might
+            // return null
+            if (configThresholdArray == null || configThresholdArray.length == 0) {
+                configThresholdsSize = 1;
+            } else {
+                configThresholdsSize = configThresholdArray.length + 1;
+            }
+
+            // Load percentage array
+            int[] configPermille = resources.getIntArray(configFallbackPermille);
+
+            // Ensure lengths match up
+            // null check is not needed here, however it test we are mocking resources that might
+            // return null
+            boolean emptyArray = configPermille == null || configPermille.length == 0;
+            if (emptyArray && configThresholdsSize == 1) {
+                return new Pair<>(defaultLevels, defaultPercentage);
+            }
+            if (emptyArray || configPermille.length != configThresholdsSize) {
+                throw new IllegalArgumentException(
+                        "Brightness threshold arrays do not align in length");
+            }
+
+            // Calculate levels array
+            float[] configThresholdWithZeroPrefixed = new float[configThresholdsSize];
+            // Start at 1, so that 0 index value is 0.0f (default)
+            for (int i = 1; i < configThresholdsSize; i++) {
+                configThresholdWithZeroPrefixed[i] = (float) configThresholdArray[i - 1];
+            }
+            if (potentialOldBrightnessScale) {
+                configThresholdWithZeroPrefixed =
+                        constraintInRangeIfNeeded(configThresholdWithZeroPrefixed);
+            }
+
+            // Calculate percentages array
+            float[] configPercentage = new float[configThresholdsSize];
+            for (int i = 0; i < configPermille.length; i++) {
+                configPercentage[i] = configPermille[i] / 10.0f;
+            }
+            return new Pair<>(configThresholdWithZeroPrefixed, configPercentage);
+        } else {
+            return new Pair<>(defaultLevels, defaultPercentage);
+        }
+    }
+
+    /**
+     * This check is due to historical reasons, where screen thresholdLevels used to be
+     * integer values in the range of [0-255], but then was changed to be float values from [0,1].
+     * To accommodate both the possibilities, we first check if all the thresholdLevels are in
+     * [0,1], and if not, we divide all the levels with 255 to bring them down to the same scale.
+     */
+    private static float[] constraintInRangeIfNeeded(float[] thresholdLevels) {
+        if (isAllInRange(thresholdLevels, /* minValueInclusive= */ 0.0f,
+                /* maxValueInclusive= */ 1.0f)) {
+            return thresholdLevels;
+        }
+
+        Slog.w(TAG, "Detected screen thresholdLevels on a deprecated brightness scale");
+        float[] thresholdLevelsScaled = new float[thresholdLevels.length];
+        for (int index = 0; thresholdLevels.length > index; ++index) {
+            thresholdLevelsScaled[index] = thresholdLevels[index] / 255.0f;
+        }
+        return thresholdLevelsScaled;
+    }
+
+    private static boolean isAllInRange(float[] configArray, float minValueInclusive,
+            float maxValueInclusive) {
+        for (float v : configArray) {
+            if (v < minValueInclusive || v > maxValueInclusive) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+}
diff --git a/services/core/java/com/android/server/display/config/LowBrightnessData.java b/services/core/java/com/android/server/display/config/LowBrightnessData.java
deleted file mode 100644
index aa82533..0000000
--- a/services/core/java/com/android/server/display/config/LowBrightnessData.java
+++ /dev/null
@@ -1,142 +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.display.config;
-
-import android.annotation.Nullable;
-import android.util.Slog;
-import android.util.Spline;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Brightness config for low brightness mode
- */
-public class LowBrightnessData {
-    private static final String TAG = "LowBrightnessData";
-
-    /**
-     * Brightness value at which lower brightness methods are used.
-     */
-    public final float mTransitionPoint;
-
-    /**
-     * Nits array, maps to mBacklight
-     */
-    public final float[] mNits;
-
-    /**
-     * Backlight array, maps to mBrightness and mNits
-     */
-    public final float[] mBacklight;
-
-    /**
-     * Brightness array, maps to mBacklight
-     */
-    public final float[] mBrightness;
-    /**
-     * Spline, mapping between backlight and nits
-     */
-    public final Spline mBacklightToNits;
-    /**
-     * Spline, mapping between nits and backlight
-     */
-    public final Spline mNitsToBacklight;
-    /**
-     * Spline, mapping between brightness and backlight
-     */
-    public final Spline mBrightnessToBacklight;
-    /**
-     * Spline, mapping between backlight and brightness
-     */
-    public final Spline mBacklightToBrightness;
-
-    @VisibleForTesting
-    public LowBrightnessData(float transitionPoint, float[] nits,
-            float[] backlight, float[] brightness, Spline backlightToNits,
-            Spline nitsToBacklight, Spline brightnessToBacklight, Spline backlightToBrightness) {
-        mTransitionPoint = transitionPoint;
-        mNits = nits;
-        mBacklight = backlight;
-        mBrightness = brightness;
-        mBacklightToNits = backlightToNits;
-        mNitsToBacklight = nitsToBacklight;
-        mBrightnessToBacklight = brightnessToBacklight;
-        mBacklightToBrightness = backlightToBrightness;
-    }
-
-    @Override
-    public String toString() {
-        return "LowBrightnessData {"
-                + "mTransitionPoint: " + mTransitionPoint
-                + ", mNits: " + Arrays.toString(mNits)
-                + ", mBacklight: " + Arrays.toString(mBacklight)
-                + ", mBrightness: " + Arrays.toString(mBrightness)
-                + ", mBacklightToNits: " + mBacklightToNits
-                + ", mNitsToBacklight: " + mNitsToBacklight
-                + ", mBrightnessToBacklight: " + mBrightnessToBacklight
-                + ", mBacklightToBrightness: " + mBacklightToBrightness
-                + "} ";
-    }
-
-    /**
-     * Loads LowBrightnessData from DisplayConfiguration
-     */
-    @Nullable
-    public static LowBrightnessData loadConfig(DisplayConfiguration config) {
-        final LowBrightnessMode lbm = config.getLowBrightness();
-        if (lbm == null) {
-            return null;
-        }
-
-        boolean lbmIsEnabled = lbm.getEnabled();
-        if (!lbmIsEnabled) {
-            return null;
-        }
-
-        List<Float> nitsList = lbm.getNits();
-        List<Float> backlightList = lbm.getBacklight();
-        List<Float> brightnessList = lbm.getBrightness();
-        float transitionPoints = lbm.getTransitionPoint().floatValue();
-
-        if (nitsList.isEmpty()
-                || backlightList.size() != brightnessList.size()
-                || backlightList.size() != nitsList.size()) {
-            Slog.e(TAG, "Invalid low brightness array lengths");
-            return null;
-        }
-
-        float[] nits = new float[nitsList.size()];
-        float[] backlight = new float[nitsList.size()];
-        float[] brightness = new float[nitsList.size()];
-
-        for (int i = 0; i < nitsList.size(); i++) {
-            nits[i] = nitsList.get(i);
-            backlight[i] = backlightList.get(i);
-            brightness[i] = brightnessList.get(i);
-        }
-
-        return new LowBrightnessData(transitionPoints, nits, backlight, brightness,
-                Spline.createSpline(backlight, nits),
-                Spline.createSpline(nits, backlight),
-                Spline.createSpline(brightness, backlight),
-                Spline.createSpline(backlight, brightness)
-                );
-    }
-}
diff --git a/services/core/java/com/android/server/display/config/SensorData.java b/services/core/java/com/android/server/display/config/SensorData.java
index 8e716f8..6ad13c3 100644
--- a/services/core/java/com/android/server/display/config/SensorData.java
+++ b/services/core/java/com/android/server/display/config/SensorData.java
@@ -129,21 +129,46 @@
      * Loads proximity sensor data from DisplayConfiguration
      */
     @Nullable
-    public static SensorData loadProxSensorConfig(DisplayConfiguration config) {
-        SensorDetails sensorDetails = config.getProxSensor();
-        if (sensorDetails != null) {
-            String name = sensorDetails.getName();
-            String type = sensorDetails.getType();
-            if ("".equals(name) && "".equals(type)) {
+    public static SensorData loadProxSensorConfig(
+            DisplayManagerFlags flags, DisplayConfiguration config) {
+        SensorData DEFAULT_SENSOR = new SensorData();
+        List<SensorDetails> sensorDetailsList = config.getProxSensor();
+        if (sensorDetailsList.isEmpty()) {
+            return DEFAULT_SENSOR;
+        }
+
+        SensorData selectedSensor = DEFAULT_SENSOR;
+        // Prioritize flagged sensors.
+        for (SensorDetails sensorDetails : sensorDetailsList) {
+            String flagStr = sensorDetails.getFeatureFlag();
+            if (flags.isUseFusionProxSensorEnabled() &&
+                flags.getUseFusionProxSensorFlagName().equals(flagStr)) {
+                selectedSensor = loadSensorData(sensorDetails);
+                break;
+            }
+        }
+
+        // Check for normal un-flagged sensor if a flagged one wasn't found.
+        if (DEFAULT_SENSOR == selectedSensor) {
+            for (SensorDetails sensorDetails : sensorDetailsList) {
+                if (sensorDetails.getFeatureFlag() != null) {
+                    continue;
+                }
+                selectedSensor = loadSensorData(sensorDetails);
+                break;
+            }
+        }
+
+        // Check if we shouldn't use a sensor at all.
+        if (DEFAULT_SENSOR != selectedSensor) {
+            if ("".equals(selectedSensor.name) && "".equals(selectedSensor.type)) {
                 // <proxSensor> with empty values to the config means no sensor should be used.
                 // See also {@link com.android.server.display.utils.SensorUtils}
-                return null;
-            } else {
-                return loadSensorData(sensorDetails);
+                selectedSensor = null;
             }
-        } else {
-            return new SensorData();
         }
+
+        return selectedSensor;
     }
 
     /**
diff --git a/services/core/java/com/android/server/display/feature/Android.bp b/services/core/java/com/android/server/display/feature/Android.bp
index a0ead38..daf8832 100644
--- a/services/core/java/com/android/server/display/feature/Android.bp
+++ b/services/core/java/com/android/server/display/feature/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "display_flags",
     package: "com.android.server.display.feature.flags",
+    container: "system",
     srcs: [
         "*.aconfig",
     ],
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 e1a166e..50b1464 100644
--- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
+++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
@@ -96,6 +96,10 @@
             Flags.FLAG_ENABLE_RESTRICT_DISPLAY_MODES,
             Flags::enableRestrictDisplayModes);
 
+    private final FlagState mResolutionBackupRestore = new FlagState(
+            Flags.FLAG_RESOLUTION_BACKUP_RESTORE,
+            Flags::resolutionBackupRestore);
+
     private final FlagState mVsyncLowPowerVote = new FlagState(
             Flags.FLAG_ENABLE_VSYNC_LOW_POWER_VOTE,
             Flags::enableVsyncLowPowerVote);
@@ -140,12 +144,15 @@
             Flags::idleScreenRefreshRateTimeout
     );
 
-
     private final FlagState mRefactorDisplayPowerController = new FlagState(
             Flags.FLAG_REFACTOR_DISPLAY_POWER_CONTROLLER,
             Flags::refactorDisplayPowerController
     );
 
+    private final FlagState mUseFusionProxSensor = new FlagState(
+            Flags.FLAG_USE_FUSION_PROX_SENSOR,
+            Flags::useFusionProxSensor
+    );
 
     /**
      * @return {@code true} if 'port' is allowed in display layout configuration file.
@@ -246,6 +253,10 @@
         return mRestrictDisplayModes.isEnabled();
     }
 
+    public boolean isResolutionBackupRestoreEnabled() {
+        return mResolutionBackupRestore.isEnabled();
+    }
+
     public boolean isVsyncLowPowerVoteEnabled() {
         return mVsyncLowPowerVote.isEnabled();
     }
@@ -293,6 +304,14 @@
         return mRefactorDisplayPowerController.isEnabled();
     }
 
+    public boolean isUseFusionProxSensorEnabled() {
+        return mUseFusionProxSensor.isEnabled();
+    }
+
+    public String getUseFusionProxSensorFlagName() {
+        return mUseFusionProxSensor.getName();
+    }
+
     /**
      * dumps all flagstates
      * @param pw printWriter
@@ -309,6 +328,7 @@
         pw.println(" " + mHdrClamperFlagState);
         pw.println(" " + mNbmControllerFlagState);
         pw.println(" " + mPowerThrottlingClamperFlagState);
+        pw.println(" " + mEvenDimmerFlagState);
         pw.println(" " + mSmallAreaDetectionFlagState);
         pw.println(" " + mBrightnessIntRangeUserPerceptionFlagState);
         pw.println(" " + mRestrictDisplayModes);
@@ -321,6 +341,8 @@
         pw.println(" " + mSensorBasedBrightnessThrottling);
         pw.println(" " + mIdleScreenRefreshRateTimeout);
         pw.println(" " + mRefactorDisplayPowerController);
+        pw.println(" " + mResolutionBackupRestore);
+        pw.println(" " + mUseFusionProxSensor);
     }
 
     private static class FlagState {
@@ -336,6 +358,10 @@
             mFlagFunction = flagFunction;
         }
 
+        private String getName() {
+            return mName;
+        }
+
         private boolean isEnabled() {
             if (mEnabledSet) {
                 if (DEBUG) {
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 a5f241f..c68ef9b 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
@@ -1,4 +1,5 @@
 package: "com.android.server.display.feature.flags"
+container: "system"
 
 # Important: Flags must be accessed through DisplayManagerFlags.
 
@@ -11,6 +12,14 @@
 }
 
 flag {
+    name: "resolution_backup_restore"
+    namespace: "display_manager"
+    description: "Backup/Restore support for High Resolution setting"
+    bug: "321821289"
+    is_fixed_read_only: true
+}
+
+flag {
     name: "enable_connected_display_management"
     namespace: "display_manager"
     description: "Feature flag for Connected Display management"
@@ -227,3 +236,11 @@
     bug: "310026579"
     is_fixed_read_only: true
 }
+
+flag {
+    name: "use_fusion_prox_sensor"
+    namespace: "display_manager"
+    description: "Feature flag to control usage of a Fusion Proximity sensor if configued."
+    bug: "306203895"
+    is_fixed_read_only: true
+}
diff --git a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
index 495ae87..d084d1c 100644
--- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
@@ -64,6 +64,8 @@
 import android.util.SparseIntArray;
 import android.view.Display;
 import android.view.DisplayInfo;
+import android.view.SurfaceControl;
+import android.view.SurfaceControl.IdleScreenRefreshRateConfig;
 import android.view.SurfaceControl.RefreshRateRange;
 import android.view.SurfaceControl.RefreshRateRanges;
 
@@ -74,6 +76,7 @@
 import com.android.internal.os.BackgroundThread;
 import com.android.server.LocalServices;
 import com.android.server.display.DisplayDeviceConfig;
+import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholdPoint;
 import com.android.server.display.feature.DeviceConfigParameterProvider;
 import com.android.server.display.feature.DisplayManagerFlags;
 import com.android.server.display.utils.AmbientFilter;
@@ -184,6 +187,8 @@
 
     private final boolean mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled;
 
+    private final DisplayManagerFlags mDisplayManagerFlags;
+
     private final boolean mDvrrSupported;
 
 
@@ -206,7 +211,7 @@
             .isDisplaysRefreshRatesSynchronizationEnabled();
         mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled = displayManagerFlags
                 .isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled();
-
+        mDisplayManagerFlags = displayManagerFlags;
         mContext = context;
         mHandler = new DisplayModeDirectorHandler(handler.getLooper());
         mInjector = injector;
@@ -374,7 +379,7 @@
                 final RefreshRateRanges ranges = new RefreshRateRanges(range, range);
                 return new DesiredDisplayModeSpecs(defaultMode.getModeId(),
                         /*allowGroupSwitching */ false,
-                        ranges, ranges);
+                        ranges, ranges, mBrightnessObserver.getIdleScreenRefreshRateConfig());
             }
 
             boolean modeSwitchingDisabled =
@@ -422,7 +427,8 @@
                                     appRequestSummary.maxPhysicalRefreshRate),
                             new RefreshRateRange(
                                     appRequestSummary.minRenderFrameRate,
-                                    appRequestSummary.maxRenderFrameRate)));
+                                    appRequestSummary.maxRenderFrameRate)),
+                    mBrightnessObserver.getIdleScreenRefreshRateConfig());
         }
     }
 
@@ -764,6 +770,16 @@
         public boolean allowGroupSwitching;
 
         /**
+         * Represents the idle time of the screen after which the associated display's refresh rate
+         * is to be reduced to preserve power
+         * Defaults to null, meaning that the device is not configured to have a timeout based on
+         * the surrounding conditions
+         * -1 means that the current conditions require no timeout
+         */
+        @Nullable
+        public IdleScreenRefreshRateConfig mIdleScreenRefreshRateConfig;
+
+        /**
          * The primary refresh rate ranges.
          */
         public final RefreshRateRanges primary;
@@ -783,11 +799,13 @@
         public DesiredDisplayModeSpecs(int baseModeId,
                 boolean allowGroupSwitching,
                 @NonNull RefreshRateRanges primary,
-                @NonNull RefreshRateRanges appRequest) {
+                @NonNull RefreshRateRanges appRequest,
+                @Nullable SurfaceControl.IdleScreenRefreshRateConfig idleScreenRefreshRateConfig) {
             this.baseModeId = baseModeId;
             this.allowGroupSwitching = allowGroupSwitching;
             this.primary = primary;
             this.appRequest = appRequest;
+            this.mIdleScreenRefreshRateConfig = idleScreenRefreshRateConfig;
         }
 
         /**
@@ -797,9 +815,10 @@
         public String toString() {
             return String.format("baseModeId=%d allowGroupSwitching=%b"
                             + " primary=%s"
-                            + " appRequest=%s",
+                            + " appRequest=%s"
+                            + " idleScreenRefreshRateConfig=%s",
                     baseModeId, allowGroupSwitching, primary.toString(),
-                    appRequest.toString());
+                    appRequest.toString(), String.valueOf(mIdleScreenRefreshRateConfig));
         }
 
         /**
@@ -830,12 +849,18 @@
                     desiredDisplayModeSpecs.appRequest)) {
                 return false;
             }
+
+            if (!Objects.equals(mIdleScreenRefreshRateConfig,
+                    desiredDisplayModeSpecs.mIdleScreenRefreshRateConfig)) {
+                return false;
+            }
             return true;
         }
 
         @Override
         public int hashCode() {
-            return Objects.hash(baseModeId, allowGroupSwitching, primary, appRequest);
+            return Objects.hash(baseModeId, allowGroupSwitching, primary, appRequest,
+                    mIdleScreenRefreshRateConfig);
         }
 
         /**
@@ -853,6 +878,14 @@
             appRequest.physical.max = other.appRequest.physical.max;
             appRequest.render.min = other.appRequest.render.min;
             appRequest.render.max = other.appRequest.render.max;
+
+            if (other.mIdleScreenRefreshRateConfig == null) {
+                mIdleScreenRefreshRateConfig = null;
+            } else {
+                mIdleScreenRefreshRateConfig =
+                        new IdleScreenRefreshRateConfig(
+                                other.mIdleScreenRefreshRateConfig.timeoutMillis);
+            }
         }
     }
 
@@ -1109,7 +1142,11 @@
                 maxRefreshRate = Math.min(defaultRefreshRate, peakRefreshRate);
             }
 
-            mBrightnessObserver.onRefreshRateSettingChangedLocked(minRefreshRate, maxRefreshRate);
+            // TODO(b/310237068): Make this work for multiple displays
+            if (displayId == Display.DEFAULT_DISPLAY) {
+                mBrightnessObserver.onRefreshRateSettingChangedLocked(minRefreshRate,
+                        maxRefreshRate);
+            }
         }
 
         private void removeRefreshRateSetting(int displayId) {
@@ -1543,12 +1580,20 @@
         private float mAmbientLux = -1.0f;
         private AmbientFilter mAmbientFilter;
 
+        /**
+         * The current timeout configuration. This value is used by surface flinger to track the
+         * time after which an idle screen's refresh rate is to be reduced.
+         */
+        @Nullable
+        private SurfaceControl.IdleScreenRefreshRateConfig mIdleScreenRefreshRateConfig;
+
         private float mBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
 
         private final Context mContext;
         private final Injector mInjector;
         private final Handler mHandler;
 
+
         private final boolean mVsyncLowLightBlockingVoteEnabled;
 
         private final IThermalEventListener.Stub mThermalListener =
@@ -1643,6 +1688,11 @@
             return mRefreshRateInLowZone;
         }
 
+        @VisibleForTesting
+        IdleScreenRefreshRateConfig getIdleScreenRefreshRateConfig() {
+            return mIdleScreenRefreshRateConfig;
+        }
+
         private void loadLowBrightnessThresholds(@Nullable DisplayDeviceConfig displayDeviceConfig,
                 boolean attemptReadFromFeatureParams) {
             loadRefreshRateInHighZone(displayDeviceConfig, attemptReadFromFeatureParams);
@@ -2381,6 +2431,10 @@
                     // is interrupted by a new sensor event.
                     mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS);
                 }
+
+                if (mDisplayManagerFlags.isIdleScreenRefreshRateTimeoutEnabled()) {
+                    updateIdleScreenRefreshRate(mAmbientLux);
+                }
             }
 
             @Override
@@ -2440,6 +2494,40 @@
                 }
             };
         }
+
+        private void updateIdleScreenRefreshRate(float ambientLux) {
+            List<IdleScreenRefreshRateTimeoutLuxThresholdPoint>
+                    idleScreenRefreshRateTimeoutLuxThresholdPoints;
+            synchronized (mLock) {
+                if (mDefaultDisplayDeviceConfig == null || mDefaultDisplayDeviceConfig
+                        .getIdleScreenRefreshRateTimeoutLuxThresholdPoint().isEmpty()) {
+                    // Setting this to null will let surface flinger know that the idle timer is not
+                    // configured in the display configs
+                    mIdleScreenRefreshRateConfig = null;
+                    return;
+                }
+
+                idleScreenRefreshRateTimeoutLuxThresholdPoints =
+                        mDefaultDisplayDeviceConfig
+                                .getIdleScreenRefreshRateTimeoutLuxThresholdPoint();
+            }
+            int newTimeout = -1;
+            for (IdleScreenRefreshRateTimeoutLuxThresholdPoint point :
+                    idleScreenRefreshRateTimeoutLuxThresholdPoints) {
+                int newLux = point.getLux().intValue();
+                if (newLux <= ambientLux) {
+                    newTimeout = point.getTimeout().intValue();
+                }
+            }
+            if (mIdleScreenRefreshRateConfig == null
+                    || newTimeout != mIdleScreenRefreshRateConfig.timeoutMillis) {
+                mIdleScreenRefreshRateConfig =
+                        new IdleScreenRefreshRateConfig(newTimeout);
+                synchronized (mLock) {
+                    notifyDesiredDisplayModeSpecsChangedLocked();
+                }
+            }
+        }
     }
 
     private class UdfpsObserver extends IUdfpsRefreshRateRequestCallback.Stub {
diff --git a/services/core/java/com/android/server/display/state/DisplayStateController.java b/services/core/java/com/android/server/display/state/DisplayStateController.java
index 5f28934..21bb208 100644
--- a/services/core/java/com/android/server/display/state/DisplayStateController.java
+++ b/services/core/java/com/android/server/display/state/DisplayStateController.java
@@ -18,6 +18,7 @@
 
 import android.hardware.display.DisplayManagerInternal;
 import android.util.IndentingPrintWriter;
+import android.util.Pair;
 import android.view.Display;
 
 import com.android.server.display.DisplayPowerProximityStateController;
@@ -33,6 +34,7 @@
     private DisplayPowerProximityStateController mDisplayPowerProximityStateController;
     private boolean mPerformScreenOffTransition = false;
     private int mDozeStateOverride = Display.STATE_UNKNOWN;
+    private int mDozeStateOverrideReason = Display.STATE_REASON_UNKNOWN;
 
     public DisplayStateController(DisplayPowerProximityStateController
             displayPowerProximityStateController) {
@@ -47,14 +49,19 @@
      * @param isDisplayEnabled      A boolean flag representing if the display is enabled
      * @param isDisplayInTransition A boolean flag representing if the display is undergoing the
      *                              transition phase
+     * @return a {@link Pair} of integers, the first being the updated display state, and the second
+     *                              being the reason behind the new display state.
      */
-    public int updateDisplayState(DisplayManagerInternal.DisplayPowerRequest displayPowerRequest,
-            boolean isDisplayEnabled, boolean isDisplayInTransition) {
+    public Pair<Integer, Integer> updateDisplayState(
+            DisplayManagerInternal.DisplayPowerRequest displayPowerRequest,
+            boolean isDisplayEnabled,
+            boolean isDisplayInTransition) {
         mPerformScreenOffTransition = false;
         // Compute the basic display state using the policy.
         // We might override this below based on other factors.
         // Initialise brightness as invalid.
         int state;
+        int reason = Display.STATE_REASON_DEFAULT_POLICY;
         switch (displayPowerRequest.policy) {
             case DisplayManagerInternal.DisplayPowerRequest.POLICY_OFF:
                 state = Display.STATE_OFF;
@@ -63,8 +70,10 @@
             case DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE:
                 if (mDozeStateOverride != Display.STATE_UNKNOWN) {
                     state = mDozeStateOverride;
+                    reason = mDozeStateOverrideReason;
                 } else if (displayPowerRequest.dozeScreenState != Display.STATE_UNKNOWN) {
                     state = displayPowerRequest.dozeScreenState;
+                    reason = displayPowerRequest.dozeScreenStateReason;
                 } else {
                     state = Display.STATE_DOZE;
                 }
@@ -84,11 +93,13 @@
             state = Display.STATE_OFF;
         }
 
-        return state;
+        return new Pair(state, reason);
     }
 
-    public void overrideDozeScreenState(int displayState) {
+    /** Overrides the doze screen state with a given reason. */
+    public void overrideDozeScreenState(int displayState, @Display.StateReason int reason) {
         mDozeStateOverride = displayState;
+        mDozeStateOverrideReason = reason;
     }
 
     /**
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index d997020..42c9e08 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -512,7 +512,7 @@
     }
 
     private void startDozingInternal(IBinder token, int screenState,
-            int screenBrightness) {
+            @Display.StateReason int reason, int screenBrightness) {
         if (DEBUG) {
             Slog.d(TAG, "Dream requested to start dozing: " + token
                     + ", screenState=" + screenState
@@ -524,7 +524,7 @@
                 mCurrentDream.dozeScreenState = screenState;
                 mCurrentDream.dozeScreenBrightness = screenBrightness;
                 mPowerManagerInternal.setDozeOverrideFromDreamManager(
-                        screenState, screenBrightness);
+                        screenState, reason, screenBrightness);
                 if (!mCurrentDream.isDozing) {
                     mCurrentDream.isDozing = true;
                     mDozeWakeLock.acquire();
@@ -543,7 +543,9 @@
                 mCurrentDream.isDozing = false;
                 mDozeWakeLock.release();
                 mPowerManagerInternal.setDozeOverrideFromDreamManager(
-                        Display.STATE_UNKNOWN, PowerManager.BRIGHTNESS_DEFAULT);
+                        Display.STATE_UNKNOWN,
+                        Display.STATE_REASON_DREAM_MANAGER,
+                        PowerManager.BRIGHTNESS_DEFAULT);
             }
         }
     }
@@ -1046,7 +1048,9 @@
         }
 
         @Override // Binder call
-        public void startDozing(IBinder token, int screenState, int screenBrightness) {
+        public void startDozing(
+                IBinder token, int screenState, @Display.StateReason int reason,
+                int screenBrightness) {
             // Requires no permission, called by Dream from an arbitrary process.
             if (token == null) {
                 throw new IllegalArgumentException("token must not be null");
@@ -1054,7 +1058,7 @@
 
             final long ident = Binder.clearCallingIdentity();
             try {
-                startDozingInternal(token, screenState, screenBrightness);
+                startDozingInternal(token, screenState, reason, screenBrightness);
             } finally {
                 Binder.restoreCallingIdentity(ident);
             }
diff --git a/services/core/java/com/android/server/feature/Android.bp b/services/core/java/com/android/server/feature/Android.bp
index 067288d..b0fbab6 100644
--- a/services/core/java/com/android/server/feature/Android.bp
+++ b/services/core/java/com/android/server/feature/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "dropbox_flags",
     package: "com.android.server.feature.flags",
+    container: "system",
     srcs: [
         "dropbox_flags.aconfig",
     ],
diff --git a/services/core/java/com/android/server/feature/dropbox_flags.aconfig b/services/core/java/com/android/server/feature/dropbox_flags.aconfig
index 14e964b..98978f0 100644
--- a/services/core/java/com/android/server/feature/dropbox_flags.aconfig
+++ b/services/core/java/com/android/server/feature/dropbox_flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.feature.flags"
+container: "system"
 
 flag{
     name: "enable_read_dropbox_permission"
diff --git a/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionBackupHelper.java b/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionBackupHelper.java
index 5be0735..d494be5 100644
--- a/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionBackupHelper.java
+++ b/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionBackupHelper.java
@@ -17,6 +17,7 @@
 package com.android.server.grammaticalinflection;
 
 import android.app.backup.BackupManager;
+import android.content.AttributionSource;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
@@ -30,6 +31,7 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.nio.ByteBuffer;
 import java.time.Clock;
 import java.time.Duration;
 import java.util.HashMap;
@@ -47,6 +49,7 @@
     private final PackageManager mPackageManager;
     private final GrammaticalInflectionService mGrammaticalGenderService;
     private final Clock mClock;
+    private final AttributionSource mAttributionSource;
 
     static class StagedData {
         final long mCreationTimeMillis;
@@ -58,8 +61,9 @@
         }
     }
 
-    public GrammaticalInflectionBackupHelper(GrammaticalInflectionService grammaticalGenderService,
-            PackageManager packageManager) {
+    public GrammaticalInflectionBackupHelper(AttributionSource attributionSource,
+            GrammaticalInflectionService grammaticalGenderService, PackageManager packageManager) {
+        mAttributionSource = attributionSource;
         mGrammaticalGenderService = grammaticalGenderService;
         mPackageManager = packageManager;
         mClock = Clock.systemUTC();
@@ -115,6 +119,23 @@
         }
     }
 
+    /**
+     * Returns the system-gender to be backed up as a data-blob.
+     */
+    public byte[] getSystemBackupPayload(int userId) {
+        int gender = mGrammaticalGenderService.getSystemGrammaticalGender(mAttributionSource,
+                userId);
+        return intToByteArray(gender);
+    }
+
+    /**
+     * Restores the system-gender that were previously backed up.
+     */
+    public void applyRestoredSystemPayload(byte[] payload, int userId) {
+        int gender = convertByteArrayToInt(payload);
+        mGrammaticalGenderService.setSystemWideGrammaticalGender(gender, userId);
+    }
+
     private boolean hasSetBeforeRestoring(String pkgName, int userId) {
         return mGrammaticalGenderService.getApplicationGrammaticalGender(pkgName, userId)
                 != Configuration.GRAMMATICAL_GENDER_NOT_SPECIFIED;
@@ -157,6 +178,17 @@
         }
     }
 
+    private byte[] intToByteArray(final int gender) {
+        ByteBuffer bb = ByteBuffer.allocate(4);
+        bb.putInt(gender);
+        return bb.array();
+    }
+
+    private int convertByteArrayToInt(byte[] intBytes) {
+        ByteBuffer byteBuffer = ByteBuffer.wrap(intBytes);
+        return byteBuffer.getInt();
+    }
+
     private HashMap<String, Integer> readFromByteArray(byte[] payload) {
         HashMap<String, Integer> data = new HashMap<>();
 
diff --git a/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionManagerInternal.java b/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionManagerInternal.java
index c2c82ed..2816d08 100644
--- a/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionManagerInternal.java
+++ b/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionManagerInternal.java
@@ -62,5 +62,16 @@
      * Whether the package can get the system grammatical gender or not.
      */
     public abstract boolean canGetSystemGrammaticalGender(int uid, @Nullable String packageName);
+
+
+    /**
+     * Returns the system-gender to be backed up as a data-blob.
+     */
+    public abstract @Nullable byte[] getSystemBackupPayload(int userId);
+
+    /**
+     * Restores the system-gender that were previously backed up.
+     */
+    public abstract void applyRestoredSystemPayload(byte[] payload, int userId);
 }
 
diff --git a/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionService.java b/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionService.java
index 3fafca8..93a71b9 100644
--- a/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionService.java
+++ b/services/core/java/com/android/server/grammaticalinflection/GrammaticalInflectionService.java
@@ -102,7 +102,8 @@
         mContext = context;
         mActivityTaskManagerInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
         mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
-        mBackupHelper = new GrammaticalInflectionBackupHelper(this, context.getPackageManager());
+        mBackupHelper = new GrammaticalInflectionBackupHelper(mContext.getAttributionSource(), this,
+                context.getPackageManager());
         mBinderService = new GrammaticalInflectionBinderService();
         mPermissionManager = context.getSystemService(PermissionManager.class);
     }
@@ -143,6 +144,15 @@
         }
 
         @Override
+        public int peekSystemGrammaticalGenderByUserId(AttributionSource attributionSource,
+                int userId) {
+            return canGetSystemGrammaticalGender(attributionSource)
+                    ? GrammaticalInflectionService.this.getSystemGrammaticalGender(
+                    attributionSource, userId)
+                    : GRAMMATICAL_GENDER_NOT_SPECIFIED;
+        }
+
+        @Override
         public void onShellCommand(FileDescriptor in, FileDescriptor out,
                 FileDescriptor err, String[] args, ShellCallback callback,
                 ResultReceiver resultReceiver) {
@@ -167,6 +177,18 @@
         }
 
         @Override
+        @Nullable
+        public byte[] getSystemBackupPayload(int userId) {
+            isCallerAllowed();
+            return mBackupHelper.getSystemBackupPayload(userId);
+        }
+
+        @Override
+        public void applyRestoredSystemPayload(byte[] payload, int userId) {
+            mBackupHelper.applyRestoredSystemPayload(payload, userId);
+        }
+
+        @Override
         public int getSystemGrammaticalGender(int userId) {
             return checkSystemTermsOfAddressIsEnabled()
                     ? GrammaticalInflectionService.this.getSystemGrammaticalGender(
@@ -281,6 +303,7 @@
                     userId,
                     grammaticalGender != GRAMMATICAL_GENDER_NOT_SPECIFIED,
                     preValue != GRAMMATICAL_GENDER_NOT_SPECIFIED);
+            GrammaticalInflectionBackupHelper.notifyBackupManager();
         } catch (RemoteException e) {
             Log.w(TAG, "Can not update configuration", e);
         }
diff --git a/services/core/java/com/android/server/graphics/fonts/FontManagerService.java b/services/core/java/com/android/server/graphics/fonts/FontManagerService.java
index 7b844a0..f383679 100644
--- a/services/core/java/com/android/server/graphics/fonts/FontManagerService.java
+++ b/services/core/java/com/android/server/graphics/fonts/FontManagerService.java
@@ -165,7 +165,11 @@
 
         @Override
         public void onBootPhase(int phase) {
-            if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
+            final int latestFontLoadBootPhase =
+                    (Flags.completeFontLoadInSystemServicesReady())
+                            ? SystemService.PHASE_SYSTEM_SERVICES_READY
+                            : SystemService.PHASE_ACTIVITY_MANAGER_READY;
+            if (phase == latestFontLoadBootPhase) {
                 // Wait for FontManagerService to start since it will be needed after this point.
                 mServiceStarted.join();
             }
diff --git a/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java b/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java
index 1715254..ea240c7 100644
--- a/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java
+++ b/services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java
@@ -196,8 +196,12 @@
                 File signatureFile = new File(dir, FONT_SIGNATURE_FILE);
                 if (!signatureFile.exists()) {
                     Slog.i(TAG, "The signature file is missing.");
-                    FileUtils.deleteContentsAndDir(dir);
-                    continue;
+                    if (com.android.text.flags.Flags.fixFontUpdateFailure()) {
+                        return;
+                    } else {
+                        FileUtils.deleteContentsAndDir(dir);
+                        continue;
+                    }
                 }
                 byte[] signature;
                 try {
@@ -222,10 +226,42 @@
 
                 FontFileInfo fontFileInfo = validateFontFile(fontFile, signature);
                 if (fontConfig == null) {
-                    fontConfig = getSystemFontConfig();
+                    if (com.android.text.flags.Flags.fixFontUpdateFailure()) {
+                        // Use preinstalled font config for checking revision number.
+                        fontConfig = mConfigSupplier.apply(Collections.emptyMap());
+                    } else {
+                        fontConfig = getSystemFontConfig();
+                    }
                 }
                 addFileToMapIfSameOrNewer(fontFileInfo, fontConfig, true /* deleteOldFile */);
             }
+
+            if (com.android.text.flags.Flags.fixFontUpdateFailure()) {
+                // Treat as error if post script name of font family was not installed.
+                for (int i = 0; i < config.fontFamilies.size(); ++i) {
+                    FontUpdateRequest.Family family = config.fontFamilies.get(i);
+                    for (int j = 0; j < family.getFonts().size(); ++j) {
+                        FontUpdateRequest.Font font = family.getFonts().get(j);
+                        if (mFontFileInfoMap.containsKey(font.getPostScriptName())) {
+                            continue;
+                        }
+
+                        if (fontConfig == null) {
+                            fontConfig = mConfigSupplier.apply(Collections.emptyMap());
+                        }
+
+                        if (getFontByPostScriptName(font.getPostScriptName(), fontConfig) != null) {
+                            continue;
+                        }
+
+                        Slog.e(TAG, "Unknown font that has PostScript name "
+                                + font.getPostScriptName() + " is requested in FontFamily "
+                                + family.getName());
+                        return;
+                    }
+                }
+            }
+
             success = true;
         } catch (Throwable t) {
             // If something happened during loading system fonts, clear all contents in finally
@@ -237,6 +273,9 @@
                 mFontFileInfoMap.clear();
                 mLastModifiedMillis = 0;
                 FileUtils.deleteContents(mFilesDir);
+                if (com.android.text.flags.Flags.fixFontUpdateFailure()) {
+                    mConfigFile.delete();
+                }
             }
         }
     }
@@ -485,8 +524,7 @@
         return shouldAddToMap;
     }
 
-    private long getPreinstalledFontRevision(FontFileInfo info, FontConfig fontConfig) {
-        String psName = info.getPostScriptName();
+    private FontConfig.Font getFontByPostScriptName(String psName, FontConfig fontConfig) {
         FontConfig.Font targetFont = null;
         for (int i = 0; i < fontConfig.getFontFamilies().size(); i++) {
             FontConfig.FontFamily family = fontConfig.getFontFamilies().get(i);
@@ -511,6 +549,13 @@
                 }
             }
         }
+        return targetFont;
+    }
+
+    private long getPreinstalledFontRevision(FontFileInfo info, FontConfig fontConfig) {
+        String psName = info.getPostScriptName();
+        FontConfig.Font targetFont = getFontByPostScriptName(psName, fontConfig);
+
         if (targetFont == null) {
             return -1;
         }
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java
index a79fb88..f6dfc9e 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecController.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java
@@ -528,15 +528,17 @@
      */
     @ServiceThreadOnly
     void pollDevices(DevicePollingCallback callback, int sourceAddress, int pickStrategy,
-            int retryCount) {
+            int retryCount, long pollingMessageInterval) {
         assertRunOnServiceThread();
 
         // Extract polling candidates. No need to poll against local devices.
         List<Integer> pollingCandidates = pickPollCandidates(pickStrategy);
         ArrayList<Integer> allocated = new ArrayList<>();
+        // pollStarted indication to avoid polling delay for the first message
         mControlHandler.postDelayed(
-                () -> runDevicePolling(
-                        sourceAddress, pollingCandidates, retryCount, callback, allocated),
+                ()
+                        -> runDevicePolling(sourceAddress, pollingCandidates, retryCount, callback,
+                                allocated, pollingMessageInterval, /**pollStarted**/ false),
                 mPollDevicesDelay);
     }
 
@@ -576,9 +578,10 @@
     }
 
     @ServiceThreadOnly
-    private void runDevicePolling(final int sourceAddress,
-            final List<Integer> candidates, final int retryCount,
-            final DevicePollingCallback callback, final List<Integer> allocated) {
+    private void runDevicePolling(final int sourceAddress, final List<Integer> candidates,
+            final int retryCount, final DevicePollingCallback callback,
+            final List<Integer> allocated, final long pollingMessageInterval,
+            final boolean pollStarted) {
         assertRunOnServiceThread();
         if (candidates.isEmpty()) {
             if (callback != null) {
@@ -587,11 +590,10 @@
             }
             return;
         }
-
         final Integer candidate = candidates.remove(0);
         // Proceed polling action for the next address once polling action for the
         // previous address is done.
-        runOnIoThread(new Runnable() {
+        mIoHandler.postDelayed(new Runnable() {
             @Override
             public void run() {
                 if (sendPollMessage(sourceAddress, candidate, retryCount)) {
@@ -600,12 +602,12 @@
                 runOnServiceThread(new Runnable() {
                     @Override
                     public void run() {
-                        runDevicePolling(sourceAddress, candidates, retryCount, callback,
-                                allocated);
+                        runDevicePolling(sourceAddress, candidates, retryCount, callback, allocated,
+                                pollingMessageInterval, /**pollStarted**/ true);
                     }
                 });
             }
-        });
+        }, pollStarted ? pollingMessageInterval : 0);
     }
 
     @IoThreadOnly
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
index 5db114b..234d6d3 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
@@ -229,7 +229,13 @@
 
     protected final void pollDevices(DevicePollingCallback callback, int pickStrategy,
             int retryCount) {
-        mService.pollDevices(callback, getSourceAddress(), pickStrategy, retryCount);
+        pollDevices(callback, pickStrategy, retryCount, 0);
+    }
+
+    protected final void pollDevices(DevicePollingCallback callback, int pickStrategy,
+            int retryCount, long pollingMessageInterval) {
+        mService.pollDevices(
+                callback, getSourceAddress(), pickStrategy, retryCount, pollingMessageInterval);
     }
 
     /**
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index 731c78e..d21fc85 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -29,6 +29,7 @@
 import android.os.Handler;
 import android.os.PowerManager;
 import android.os.SystemProperties;
+import android.os.UserHandle;
 import android.sysprop.HdmiProperties;
 import android.util.Slog;
 
@@ -53,6 +54,16 @@
     @VisibleForTesting
     static final long STANDBY_AFTER_HOTPLUG_OUT_DELAY_MS = 30_000;
 
+    // How long to wait on active source lost before possibly going to Standby.
+    @VisibleForTesting
+    static final long STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS = 30_000;
+
+    // How long to wait after losing active source, before launching the pop-up that allows the user
+    // to keep the device as the current active source.
+    // We do this to prevent an unnecessary pop-up from being displayed when we lose and regain
+    // active source within this timeout.
+    static final long POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS = 5_000;
+
     // Used to keep the device awake while it is the active source. For devices that
     // cannot wake up via CEC commands, this address the inconvenience of having to
     // turn them on. True by default, and can be disabled (i.e. device can go to sleep
@@ -64,6 +75,14 @@
     // Handler for queueing a delayed Standby runnable after hotplug out.
     private Handler mDelayedStandbyHandler;
 
+    // Handler for queueing a delayed Standby runnable after active source lost and after the pop-up
+    // on active source lost was displayed.
+    Handler mDelayedStandbyOnActiveSourceLostHandler;
+
+    // Handler for queueing a delayed runnable that triggers a pop-up notification on active source
+    // lost.
+    private Handler mDelayedPopupOnActiveSourceLostHandler;
+
     // Determines what action should be taken upon receiving Routing Control messages.
     @VisibleForTesting
     protected HdmiProperties.playback_device_action_on_routing_control_values
@@ -75,6 +94,8 @@
         super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
 
         mDelayedStandbyHandler = new Handler(service.getServiceLooper());
+        mDelayedStandbyOnActiveSourceLostHandler = new Handler(service.getServiceLooper());
+        mDelayedPopupOnActiveSourceLostHandler = new Handler(service.getServiceLooper());
         mStandbyHandler = new HdmiCecStandbyModeHandler(service, this);
     }
 
@@ -239,6 +260,28 @@
         }
     }
 
+    private class DelayedStandbyOnActiveSourceLostRunnable implements Runnable {
+        @Override
+        public void run() {
+            if (mService.getPowerManagerInternal().wasDeviceIdleFor(
+                    STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS)) {
+                mService.standby();
+            } else {
+                mService.setAndBroadcastActiveSource(mService.getPhysicalAddress(),
+                        getDeviceInfo().getDeviceType(), Constants.ADDR_TV,
+                        "DelayedActiveSourceLostStandbyRunnable");
+            }
+        }
+    }
+
+    @ServiceThreadOnly
+    void dismissUiOnActiveSourceStatusRecovered() {
+        assertRunOnServiceThread();
+        Intent intent = new Intent(HdmiControlManager.ACTION_ON_ACTIVE_SOURCE_RECOVERED_DISMISS_UI);
+        mService.getContext().sendBroadcastAsUser(intent, UserHandle.ALL,
+                HdmiControlService.PERMISSION);
+    }
+
     @Override
     @ServiceThreadOnly
     protected void onStandby(boolean initiatedByCec, int standbyAction,
@@ -387,13 +430,47 @@
         switch (mService.getHdmiCecConfig().getStringValue(
                     HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST)) {
             case HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW:
-                mService.standby();
+                mDelayedPopupOnActiveSourceLostHandler.removeCallbacksAndMessages(null);
+                mDelayedPopupOnActiveSourceLostHandler.postDelayed(
+                        new Runnable() {
+                            @Override
+                            public void run() {
+                                if (!isActiveSource()) {
+                                    startHdmiCecActiveSourceLostActivity();
+                                    mDelayedStandbyOnActiveSourceLostHandler
+                                            .removeCallbacksAndMessages(null);
+                                    mDelayedStandbyOnActiveSourceLostHandler.postDelayed(
+                                            new DelayedStandbyOnActiveSourceLostRunnable(),
+                                            STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+                                }
+                            }
+                        }, POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
                 return;
             case HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE:
                 return;
         }
     }
 
+    @VisibleForTesting
+    @ServiceThreadOnly
+    void startHdmiCecActiveSourceLostActivity() {
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            Context context = mService.getContext();
+            Intent intent = new Intent();
+            intent.setComponent(
+                    ComponentName.unflattenFromString(context.getResources().getString(
+                            com.android.internal.R.string.config_hdmiCecActiveSourceLostActivity
+                    )));
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            context.startActivityAsUser(intent, context.getUser());
+        } catch (ActivityNotFoundException e) {
+            Slog.e(TAG, "Unable to start HdmiCecActiveSourceLostActivity");
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
     @ServiceThreadOnly
     @Constants.HandleMessageResult
     protected int handleUserControlPressed(HdmiCecMessage message) {
@@ -557,6 +634,7 @@
             setActiveSource(physicalAddress,
                     "HdmiCecLocalDevicePlayback#handleRoutingChangeAndInformation()");
         }
+        dismissUiOnActiveSourceStatusRecovered();
         switch (mPlaybackDeviceActionOnRoutingControl) {
             case WAKE_UP_AND_SEND_ACTIVE_SOURCE:
                 setAndBroadcastActiveSource(message, physicalAddress,
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index d0532b99..54e1217 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -1823,10 +1823,10 @@
      */
     @ServiceThreadOnly
     void pollDevices(DevicePollingCallback callback, int sourceAddress, int pickStrategy,
-            int retryCount) {
+            int retryCount, long pollingMessageInterval) {
         assertRunOnServiceThread();
         mCecController.pollDevices(callback, sourceAddress, checkPollStrategy(pickStrategy),
-                retryCount);
+                retryCount, pollingMessageInterval);
     }
 
     private int checkPollStrategy(int pickStrategy) {
@@ -4205,10 +4205,12 @@
         // playback will claim active source. Otherwise audio system will.
         if (deviceType == HdmiDeviceInfo.DEVICE_PLAYBACK) {
             HdmiCecLocalDevicePlayback playback = playback();
+            playback.dismissUiOnActiveSourceStatusRecovered();
             playback.setActiveSource(playback.getDeviceInfo().getLogicalAddress(), physicalAddress,
                     caller);
             playback.wakeUpIfActiveSource();
             playback.maySendActiveSource(source);
+            playback.mDelayedStandbyOnActiveSourceLostHandler.removeCallbacksAndMessages(null);
         }
 
         if (deviceType == HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM) {
diff --git a/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java b/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
index da40ce59..30842b2 100644
--- a/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
+++ b/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
@@ -38,8 +38,10 @@
 final class HotplugDetectionAction extends HdmiCecFeatureAction {
     private static final String TAG = "HotPlugDetectionAction";
 
-    public static final int POLLING_INTERVAL_MS_FOR_TV = 5000;
-    public static final int POLLING_INTERVAL_MS_FOR_PLAYBACK = 60000;
+    public static final long POLLING_MESSAGE_INTERVAL_MS_FOR_TV = 0;
+    public static final long POLLING_MESSAGE_INTERVAL_MS_FOR_PLAYBACK = 500;
+    public static final int POLLING_BATCH_INTERVAL_MS_FOR_TV = 5000;
+    public static final int POLLING_BATCH_INTERVAL_MS_FOR_PLAYBACK = 60000;
     public static final int TIMEOUT_COUNT = 3;
     private static final int AVR_COUNT_MAX = 3;
 
@@ -69,8 +71,9 @@
         super(source);
     }
 
-    private int getPollingInterval() {
-        return mIsTvDevice ? POLLING_INTERVAL_MS_FOR_TV : POLLING_INTERVAL_MS_FOR_PLAYBACK;
+    private int getPollingBatchInterval() {
+        return mIsTvDevice ? POLLING_BATCH_INTERVAL_MS_FOR_TV
+                           : POLLING_BATCH_INTERVAL_MS_FOR_PLAYBACK;
     }
 
     @Override
@@ -83,7 +86,7 @@
         // Start timer without polling.
         // The first check for all devices will be initiated 15 seconds later for TV panels and 60
         // seconds later for playback devices.
-        addTimer(mState, getPollingInterval());
+        addTimer(mState, getPollingBatchInterval());
         return true;
     }
 
@@ -107,11 +110,11 @@
                 } else if (tv().isSystemAudioActivated()) {
                     pollAudioSystem();
                 }
-                addTimer(mState, POLLING_INTERVAL_MS_FOR_TV);
+                addTimer(mState, POLLING_BATCH_INTERVAL_MS_FOR_TV);
                 return;
             }
             pollAllDevices();
-            addTimer(mState, POLLING_INTERVAL_MS_FOR_PLAYBACK);
+            addTimer(mState, POLLING_BATCH_INTERVAL_MS_FOR_PLAYBACK);
         }
     }
 
@@ -127,19 +130,24 @@
         mState = STATE_WAIT_FOR_NEXT_POLLING;
         pollAllDevices();
 
-        addTimer(mState, getPollingInterval());
+        addTimer(mState, getPollingBatchInterval());
     }
 
     private void pollAllDevices() {
         Slog.v(TAG, "Poll all devices.");
 
-        pollDevices(new DevicePollingCallback() {
-            @Override
-            public void onPollingFinished(List<Integer> ackedAddress) {
-                checkHotplug(ackedAddress, false);
-            }
-        }, Constants.POLL_ITERATION_IN_ORDER
-                | Constants.POLL_STRATEGY_REMOTES_DEVICES, HdmiConfig.HOTPLUG_DETECTION_RETRY);
+        pollDevices(
+                new DevicePollingCallback() {
+                    @Override
+                    public void onPollingFinished(List<Integer> ackedAddress) {
+                        checkHotplug(ackedAddress, false);
+                        Slog.v(TAG, "Finish poll all devices.");
+                    }
+                },
+                Constants.POLL_ITERATION_IN_ORDER | Constants.POLL_STRATEGY_REMOTES_DEVICES,
+                HdmiConfig.HOTPLUG_DETECTION_RETRY,
+                mIsTvDevice ? POLLING_MESSAGE_INTERVAL_MS_FOR_TV
+                            : POLLING_MESSAGE_INTERVAL_MS_FOR_PLAYBACK);
     }
 
     private void pollAudioSystem() {
diff --git a/services/core/java/com/android/server/input/AmbientKeyboardBacklightController.java b/services/core/java/com/android/server/input/AmbientKeyboardBacklightController.java
index ce86849..569322c 100644
--- a/services/core/java/com/android/server/input/AmbientKeyboardBacklightController.java
+++ b/services/core/java/com/android/server/input/AmbientKeyboardBacklightController.java
@@ -234,6 +234,9 @@
         DisplayManagerInternal displayManagerInternal = LocalServices.getService(
                 DisplayManagerInternal.class);
         DisplayInfo displayInfo = displayManagerInternal.getDisplayInfo(Display.DEFAULT_DISPLAY);
+        if (displayInfo == null) {
+            return;
+        }
         synchronized (sAmbientControllerLock) {
             if (Objects.equals(mCurrentDefaultDisplayUniqueId, displayInfo.uniqueId)) {
                 return;
diff --git a/services/core/java/com/android/server/input/InputManagerInternal.java b/services/core/java/com/android/server/input/InputManagerInternal.java
index 7e190dd..4e9cf51 100644
--- a/services/core/java/com/android/server/input/InputManagerInternal.java
+++ b/services/core/java/com/android/server/input/InputManagerInternal.java
@@ -141,6 +141,11 @@
      */
     public abstract void unregisterLidSwitchCallback(@NonNull LidSwitchCallback callbacks);
 
+    /**
+     * Notify the input manager that an IME connection is becoming active or is no longer active.
+     */
+    public abstract void notifyInputMethodConnectionActive(boolean connectionIsActive);
+
     /** Callback interface for notifications relating to the lid switch. */
     public interface LidSwitchCallback {
         /**
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 468b902..f32c11d 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -1197,54 +1197,11 @@
     }
 
     @Override // Binder call
-    public KeyboardLayout[] getKeyboardLayoutsForInputDevice(
-            final InputDeviceIdentifier identifier) {
-        return mKeyboardLayoutManager.getKeyboardLayoutsForInputDevice(identifier);
-    }
-
-    @Override // Binder call
     public KeyboardLayout getKeyboardLayout(String keyboardLayoutDescriptor) {
         return mKeyboardLayoutManager.getKeyboardLayout(keyboardLayoutDescriptor);
     }
 
     @Override // Binder call
-    public String getCurrentKeyboardLayoutForInputDevice(InputDeviceIdentifier identifier) {
-        return mKeyboardLayoutManager.getCurrentKeyboardLayoutForInputDevice(identifier);
-    }
-
-    @EnforcePermission(Manifest.permission.SET_KEYBOARD_LAYOUT)
-    @Override // Binder call
-    public void setCurrentKeyboardLayoutForInputDevice(InputDeviceIdentifier identifier,
-            String keyboardLayoutDescriptor) {
-        super.setCurrentKeyboardLayoutForInputDevice_enforcePermission();
-        mKeyboardLayoutManager.setCurrentKeyboardLayoutForInputDevice(identifier,
-                keyboardLayoutDescriptor);
-    }
-
-    @Override // Binder call
-    public String[] getEnabledKeyboardLayoutsForInputDevice(InputDeviceIdentifier identifier) {
-        return mKeyboardLayoutManager.getEnabledKeyboardLayoutsForInputDevice(identifier);
-    }
-
-    @EnforcePermission(Manifest.permission.SET_KEYBOARD_LAYOUT)
-    @Override // Binder call
-    public void addKeyboardLayoutForInputDevice(InputDeviceIdentifier identifier,
-            String keyboardLayoutDescriptor) {
-        super.addKeyboardLayoutForInputDevice_enforcePermission();
-        mKeyboardLayoutManager.addKeyboardLayoutForInputDevice(identifier,
-                keyboardLayoutDescriptor);
-    }
-
-    @EnforcePermission(Manifest.permission.SET_KEYBOARD_LAYOUT)
-    @Override // Binder call
-    public void removeKeyboardLayoutForInputDevice(InputDeviceIdentifier identifier,
-            String keyboardLayoutDescriptor) {
-        super.removeKeyboardLayoutForInputDevice_enforcePermission();
-        mKeyboardLayoutManager.removeKeyboardLayoutForInputDevice(identifier,
-                keyboardLayoutDescriptor);
-    }
-
-    @Override // Binder call
     public KeyboardLayoutSelectionResult getKeyboardLayoutForInputDevice(
             InputDeviceIdentifier identifier, @UserIdInt int userId,
             @NonNull InputMethodInfo imeInfo, @Nullable InputMethodSubtype imeSubtype) {
@@ -1270,11 +1227,6 @@
                 imeInfo, imeSubtype);
     }
 
-
-    public void switchKeyboardLayout(int deviceId, int direction) {
-        mKeyboardLayoutManager.switchKeyboardLayout(deviceId, direction);
-    }
-
     public void setFocusedApplication(int displayId, InputApplicationHandle application) {
         mNative.setFocusedApplication(displayId, application);
     }
@@ -2846,13 +2798,6 @@
                 lockedModifierState);
     }
 
-    // Native callback.
-    @SuppressWarnings("unused")
-    boolean isInputMethodConnectionActive() {
-        return mInputMethodManagerInternal != null
-                && mInputMethodManagerInternal.isAnyInputConnectionActive();
-    }
-
     /**
      * Callback interface implemented by the Window Manager.
      */
@@ -3301,6 +3246,11 @@
         }
 
         @Override
+        public void notifyInputMethodConnectionActive(boolean connectionIsActive) {
+            mNative.setInputMethodConnectionIsActive(connectionIsActive);
+        }
+
+        @Override
         public InputChannel createInputChannel(String inputChannelName) {
             return InputManagerService.this.createInputChannel(inputChannelName);
         }
diff --git a/services/core/java/com/android/server/input/KeyboardLayoutManager.java b/services/core/java/com/android/server/input/KeyboardLayoutManager.java
index 6610081..9ba647f 100644
--- a/services/core/java/com/android/server/input/KeyboardLayoutManager.java
+++ b/services/core/java/com/android/server/input/KeyboardLayoutManager.java
@@ -60,7 +60,6 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.ArrayMap;
-import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.util.Slog;
 import android.util.SparseArray;
@@ -69,7 +68,6 @@
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
 import android.view.inputmethod.InputMethodSubtype;
-import android.widget.Toast;
 
 import com.android.internal.R;
 import com.android.internal.annotations.GuardedBy;
@@ -96,7 +94,6 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
-import java.util.stream.Stream;
 
 /**
  * A component of {@link InputManagerService} responsible for managing Physical Keyboard layouts.
@@ -112,9 +109,8 @@
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
     private static final int MSG_UPDATE_EXISTING_DEVICES = 1;
-    private static final int MSG_SWITCH_KEYBOARD_LAYOUT = 2;
-    private static final int MSG_RELOAD_KEYBOARD_LAYOUTS = 3;
-    private static final int MSG_UPDATE_KEYBOARD_LAYOUTS = 4;
+    private static final int MSG_RELOAD_KEYBOARD_LAYOUTS = 2;
+    private static final int MSG_UPDATE_KEYBOARD_LAYOUTS = 3;
 
     private final Context mContext;
     private final NativeInputManagerService mNative;
@@ -126,13 +122,14 @@
     // Connected keyboards with associated keyboard layouts (either auto-detected or manually
     // selected layout).
     private final SparseArray<KeyboardConfiguration> mConfiguredKeyboards = new SparseArray<>();
-    private Toast mSwitchedKeyboardLayoutToast;
 
     // This cache stores "best-matched" layouts so that we don't need to run the matching
     // algorithm repeatedly.
     @GuardedBy("mKeyboardLayoutCache")
     private final Map<String, KeyboardLayoutSelectionResult> mKeyboardLayoutCache =
             new ArrayMap<>();
+
+    private HashSet<String> mAvailableLayouts = new HashSet<>();
     private final Object mImeInfoLock = new Object();
     @Nullable
     @GuardedBy("mImeInfoLock")
@@ -206,68 +203,51 @@
         }
 
         boolean needToShowNotification = false;
-        if (!useNewSettingsUi()) {
-            synchronized (mDataStore) {
-                String layout = getCurrentKeyboardLayoutForInputDevice(inputDevice.getIdentifier());
-                if (layout == null) {
-                    layout = getDefaultKeyboardLayout(inputDevice);
-                    if (layout != null) {
-                        setCurrentKeyboardLayoutForInputDevice(inputDevice.getIdentifier(), layout);
-                    }
-                }
-                if (layout == null) {
-                    // In old settings show notification always until user manually selects a
-                    // layout in the settings.
+        Set<String> selectedLayouts = new HashSet<>();
+        List<ImeInfo> imeInfoList = getImeInfoListForLayoutMapping();
+        List<KeyboardLayoutSelectionResult> resultList = new ArrayList<>();
+        boolean hasMissingLayout = false;
+        for (ImeInfo imeInfo : imeInfoList) {
+            // Check if the layout has been previously configured
+            KeyboardLayoutSelectionResult result = getKeyboardLayoutForInputDeviceInternal(
+                    keyboardIdentifier, imeInfo);
+            if (result.getLayoutDescriptor() != null) {
+                selectedLayouts.add(result.getLayoutDescriptor());
+            } else {
+                hasMissingLayout = true;
+            }
+            resultList.add(result);
+        }
+
+        if (DEBUG) {
+            Slog.d(TAG,
+                    "Layouts selected for input device: " + keyboardIdentifier
+                            + " -> selectedLayouts: " + selectedLayouts);
+        }
+
+        // If even one layout not configured properly, we need to ask user to configure
+        // the keyboard properly from the Settings.
+        if (hasMissingLayout) {
+            selectedLayouts.clear();
+        }
+
+        config.setConfiguredLayouts(selectedLayouts);
+
+        synchronized (mDataStore) {
+            try {
+                final String key = keyboardIdentifier.toString();
+                if (mDataStore.setSelectedKeyboardLayouts(key, selectedLayouts)) {
+                    // Need to show the notification only if layout selection changed
+                    // from the previous configuration
                     needToShowNotification = true;
                 }
-            }
-        } else {
-            Set<String> selectedLayouts = new HashSet<>();
-            List<ImeInfo> imeInfoList = getImeInfoListForLayoutMapping();
-            List<KeyboardLayoutSelectionResult> resultList = new ArrayList<>();
-            boolean hasMissingLayout = false;
-            for (ImeInfo imeInfo : imeInfoList) {
-                // Check if the layout has been previously configured
-                KeyboardLayoutSelectionResult result = getKeyboardLayoutForInputDeviceInternal(
-                        keyboardIdentifier, imeInfo);
-                boolean noLayoutFound = result.getLayoutDescriptor() == null;
-                if (!noLayoutFound) {
-                    selectedLayouts.add(result.getLayoutDescriptor());
+
+                if (shouldLogConfiguration) {
+                    logKeyboardConfigurationEvent(inputDevice, imeInfoList, resultList,
+                            !mDataStore.hasInputDeviceEntry(key));
                 }
-                resultList.add(result);
-                hasMissingLayout |= noLayoutFound;
-            }
-
-            if (DEBUG) {
-                Slog.d(TAG,
-                        "Layouts selected for input device: " + keyboardIdentifier
-                                + " -> selectedLayouts: " + selectedLayouts);
-            }
-
-            // If even one layout not configured properly, we need to ask user to configure
-            // the keyboard properly from the Settings.
-            if (hasMissingLayout) {
-                selectedLayouts.clear();
-            }
-
-            config.setConfiguredLayouts(selectedLayouts);
-
-            synchronized (mDataStore) {
-                try {
-                    final String key = keyboardIdentifier.toString();
-                    if (mDataStore.setSelectedKeyboardLayouts(key, selectedLayouts)) {
-                        // Need to show the notification only if layout selection changed
-                        // from the previous configuration
-                        needToShowNotification = true;
-                    }
-
-                    if (shouldLogConfiguration) {
-                        logKeyboardConfigurationEvent(inputDevice, imeInfoList, resultList,
-                                !mDataStore.hasInputDeviceEntry(key));
-                    }
-                } finally {
-                    mDataStore.saveIfNeeded();
-                }
+            } finally {
+                mDataStore.saveIfNeeded();
             }
         }
         if (needToShowNotification) {
@@ -275,63 +255,6 @@
         }
     }
 
-    private String getDefaultKeyboardLayout(final InputDevice inputDevice) {
-        final Locale systemLocale = mContext.getResources().getConfiguration().locale;
-        // If our locale doesn't have a language for some reason, then we don't really have a
-        // reasonable default.
-        if (TextUtils.isEmpty(systemLocale.getLanguage())) {
-            return null;
-        }
-        final List<KeyboardLayout> layouts = new ArrayList<>();
-        visitAllKeyboardLayouts((resources, keyboardLayoutResId, layout) -> {
-            // Only select a default when we know the layout is appropriate. For now, this
-            // means it's a custom layout for a specific keyboard.
-            if (layout.getVendorId() != inputDevice.getVendorId()
-                    || layout.getProductId() != inputDevice.getProductId()) {
-                return;
-            }
-            final LocaleList locales = layout.getLocales();
-            for (int localeIndex = 0; localeIndex < locales.size(); ++localeIndex) {
-                final Locale locale = locales.get(localeIndex);
-                if (locale != null && isCompatibleLocale(systemLocale, locale)) {
-                    layouts.add(layout);
-                    break;
-                }
-            }
-        });
-
-        if (layouts.isEmpty()) {
-            return null;
-        }
-
-        // First sort so that ones with higher priority are listed at the top
-        Collections.sort(layouts);
-        // Next we want to try to find an exact match of language, country and variant.
-        for (KeyboardLayout layout : layouts) {
-            final LocaleList locales = layout.getLocales();
-            for (int localeIndex = 0; localeIndex < locales.size(); ++localeIndex) {
-                final Locale locale = locales.get(localeIndex);
-                if (locale != null && locale.getCountry().equals(systemLocale.getCountry())
-                        && locale.getVariant().equals(systemLocale.getVariant())) {
-                    return layout.getDescriptor();
-                }
-            }
-        }
-        // Then try an exact match of language and country
-        for (KeyboardLayout layout : layouts) {
-            final LocaleList locales = layout.getLocales();
-            for (int localeIndex = 0; localeIndex < locales.size(); ++localeIndex) {
-                final Locale locale = locales.get(localeIndex);
-                if (locale != null && locale.getCountry().equals(systemLocale.getCountry())) {
-                    return layout.getDescriptor();
-                }
-            }
-        }
-
-        // Give up and just use the highest priority layout with matching language
-        return layouts.get(0).getDescriptor();
-    }
-
     private static boolean isCompatibleLocale(Locale systemLocale, Locale keyboardLocale) {
         // Different languages are never compatible
         if (!systemLocale.getLanguage().equals(keyboardLocale.getLanguage())) {
@@ -343,11 +266,19 @@
                 || systemLocale.getCountry().equals(keyboardLocale.getCountry());
     }
 
+    @MainThread
     private void updateKeyboardLayouts() {
         // Scan all input devices state for keyboard layouts that have been uninstalled.
-        final HashSet<String> availableKeyboardLayouts = new HashSet<String>();
+        final HashSet<String> availableKeyboardLayouts = new HashSet<>();
         visitAllKeyboardLayouts((resources, keyboardLayoutResId, layout) ->
                 availableKeyboardLayouts.add(layout.getDescriptor()));
+
+        // If available layouts don't change, there is no need to reload layouts.
+        if (mAvailableLayouts.equals(availableKeyboardLayouts)) {
+            return;
+        }
+        mAvailableLayouts = availableKeyboardLayouts;
+
         synchronized (mDataStore) {
             try {
                 mDataStore.removeUninstalledKeyboardLayouts(availableKeyboardLayouts);
@@ -374,53 +305,6 @@
     }
 
     @AnyThread
-    public KeyboardLayout[] getKeyboardLayoutsForInputDevice(
-            final InputDeviceIdentifier identifier) {
-        if (useNewSettingsUi()) {
-            // Provide all supported keyboard layouts since Ime info is not provided
-            return getKeyboardLayouts();
-        }
-        final String[] enabledLayoutDescriptors =
-                getEnabledKeyboardLayoutsForInputDevice(identifier);
-        final ArrayList<KeyboardLayout> enabledLayouts =
-                new ArrayList<>(enabledLayoutDescriptors.length);
-        final ArrayList<KeyboardLayout> potentialLayouts = new ArrayList<>();
-        visitAllKeyboardLayouts(new KeyboardLayoutVisitor() {
-            boolean mHasSeenDeviceSpecificLayout;
-
-            @Override
-            public void visitKeyboardLayout(Resources resources,
-                    int keyboardLayoutResId, KeyboardLayout layout) {
-                // First check if it's enabled. If the keyboard layout is enabled then we always
-                // want to return it as a possible layout for the device.
-                for (String s : enabledLayoutDescriptors) {
-                    if (s != null && s.equals(layout.getDescriptor())) {
-                        enabledLayouts.add(layout);
-                        return;
-                    }
-                }
-                // Next find any potential layouts that aren't yet enabled for the device. For
-                // devices that have special layouts we assume there's a reason that the generic
-                // layouts don't work for them so we don't want to return them since it's likely
-                // to result in a poor user experience.
-                if (layout.getVendorId() == identifier.getVendorId()
-                        && layout.getProductId() == identifier.getProductId()) {
-                    if (!mHasSeenDeviceSpecificLayout) {
-                        mHasSeenDeviceSpecificLayout = true;
-                        potentialLayouts.clear();
-                    }
-                    potentialLayouts.add(layout);
-                } else if (layout.getVendorId() == -1 && layout.getProductId() == -1
-                        && !mHasSeenDeviceSpecificLayout) {
-                    potentialLayouts.add(layout);
-                }
-            }
-        });
-        return Stream.concat(enabledLayouts.stream(), potentialLayouts.stream()).toArray(
-                KeyboardLayout[]::new);
-    }
-
-    @AnyThread
     @Nullable
     public KeyboardLayout getKeyboardLayout(@NonNull String keyboardLayoutDescriptor) {
         Objects.requireNonNull(keyboardLayoutDescriptor,
@@ -580,195 +464,16 @@
         return LocaleList.forLanguageTags(languageTags.replace('|', ','));
     }
 
-    @AnyThread
-    @Nullable
-    public String getCurrentKeyboardLayoutForInputDevice(InputDeviceIdentifier identifier) {
-        if (useNewSettingsUi()) {
-            Slog.e(TAG, "getCurrentKeyboardLayoutForInputDevice API not supported");
-            return null;
-        }
-        String key = new KeyboardIdentifier(identifier).toString();
-        synchronized (mDataStore) {
-            String layout;
-            // try loading it using the layout descriptor if we have it
-            layout = mDataStore.getCurrentKeyboardLayout(key);
-            if (layout == null && !key.equals(identifier.getDescriptor())) {
-                // if it doesn't exist fall back to the device descriptor
-                layout = mDataStore.getCurrentKeyboardLayout(identifier.getDescriptor());
-            }
-            if (DEBUG) {
-                Slog.d(TAG, "getCurrentKeyboardLayoutForInputDevice() "
-                        + identifier.toString() + ": " + layout);
-            }
-            return layout;
-        }
-    }
-
-    @AnyThread
-    public void setCurrentKeyboardLayoutForInputDevice(InputDeviceIdentifier identifier,
-            String keyboardLayoutDescriptor) {
-        if (useNewSettingsUi()) {
-            Slog.e(TAG, "setCurrentKeyboardLayoutForInputDevice API not supported");
-            return;
-        }
-
-        Objects.requireNonNull(keyboardLayoutDescriptor,
-                "keyboardLayoutDescriptor must not be null");
-        String key = new KeyboardIdentifier(identifier).toString();
-        synchronized (mDataStore) {
-            try {
-                if (mDataStore.setCurrentKeyboardLayout(key, keyboardLayoutDescriptor)) {
-                    if (DEBUG) {
-                        Slog.d(TAG, "setCurrentKeyboardLayoutForInputDevice() " + identifier
-                                + " key: " + key
-                                + " keyboardLayoutDescriptor: " + keyboardLayoutDescriptor);
-                    }
-                    mHandler.sendEmptyMessage(MSG_RELOAD_KEYBOARD_LAYOUTS);
-                }
-            } finally {
-                mDataStore.saveIfNeeded();
-            }
-        }
-    }
-
-    @AnyThread
-    public String[] getEnabledKeyboardLayoutsForInputDevice(InputDeviceIdentifier identifier) {
-        if (useNewSettingsUi()) {
-            Slog.e(TAG, "getEnabledKeyboardLayoutsForInputDevice API not supported");
-            return new String[0];
-        }
-        String key = new KeyboardIdentifier(identifier).toString();
-        synchronized (mDataStore) {
-            String[] layouts = mDataStore.getKeyboardLayouts(key);
-            if ((layouts == null || layouts.length == 0)
-                    && !key.equals(identifier.getDescriptor())) {
-                layouts = mDataStore.getKeyboardLayouts(identifier.getDescriptor());
-            }
-            return layouts;
-        }
-    }
-
-    @AnyThread
-    public void addKeyboardLayoutForInputDevice(InputDeviceIdentifier identifier,
-            String keyboardLayoutDescriptor) {
-        if (useNewSettingsUi()) {
-            Slog.e(TAG, "addKeyboardLayoutForInputDevice API not supported");
-            return;
-        }
-        Objects.requireNonNull(keyboardLayoutDescriptor,
-                "keyboardLayoutDescriptor must not be null");
-
-        String key = new KeyboardIdentifier(identifier).toString();
-        synchronized (mDataStore) {
-            try {
-                String oldLayout = mDataStore.getCurrentKeyboardLayout(key);
-                if (oldLayout == null && !key.equals(identifier.getDescriptor())) {
-                    oldLayout = mDataStore.getCurrentKeyboardLayout(identifier.getDescriptor());
-                }
-                if (mDataStore.addKeyboardLayout(key, keyboardLayoutDescriptor)
-                        && !Objects.equals(oldLayout,
-                        mDataStore.getCurrentKeyboardLayout(key))) {
-                    mHandler.sendEmptyMessage(MSG_RELOAD_KEYBOARD_LAYOUTS);
-                }
-            } finally {
-                mDataStore.saveIfNeeded();
-            }
-        }
-    }
-
-    @AnyThread
-    public void removeKeyboardLayoutForInputDevice(InputDeviceIdentifier identifier,
-            String keyboardLayoutDescriptor) {
-        if (useNewSettingsUi()) {
-            Slog.e(TAG, "removeKeyboardLayoutForInputDevice API not supported");
-            return;
-        }
-        Objects.requireNonNull(keyboardLayoutDescriptor,
-                "keyboardLayoutDescriptor must not be null");
-
-        String key = new KeyboardIdentifier(identifier).toString();
-        synchronized (mDataStore) {
-            try {
-                String oldLayout = mDataStore.getCurrentKeyboardLayout(key);
-                if (oldLayout == null && !key.equals(identifier.getDescriptor())) {
-                    oldLayout = mDataStore.getCurrentKeyboardLayout(identifier.getDescriptor());
-                }
-                boolean removed = mDataStore.removeKeyboardLayout(key, keyboardLayoutDescriptor);
-                if (!key.equals(identifier.getDescriptor())) {
-                    // We need to remove from both places to ensure it is gone
-                    removed |= mDataStore.removeKeyboardLayout(identifier.getDescriptor(),
-                            keyboardLayoutDescriptor);
-                }
-                if (removed && !Objects.equals(oldLayout,
-                        mDataStore.getCurrentKeyboardLayout(key))) {
-                    mHandler.sendEmptyMessage(MSG_RELOAD_KEYBOARD_LAYOUTS);
-                }
-            } finally {
-                mDataStore.saveIfNeeded();
-            }
-        }
-    }
-
-    @AnyThread
-    public void switchKeyboardLayout(int deviceId, int direction) {
-        if (useNewSettingsUi()) {
-            Slog.e(TAG, "switchKeyboardLayout API not supported");
-            return;
-        }
-        mHandler.obtainMessage(MSG_SWITCH_KEYBOARD_LAYOUT, deviceId, direction).sendToTarget();
-    }
-
-    @MainThread
-    private void handleSwitchKeyboardLayout(int deviceId, int direction) {
-        final InputDevice device = getInputDevice(deviceId);
-        if (device != null) {
-            final boolean changed;
-            final String keyboardLayoutDescriptor;
-
-            String key = new KeyboardIdentifier(device.getIdentifier()).toString();
-            synchronized (mDataStore) {
-                try {
-                    changed = mDataStore.switchKeyboardLayout(key, direction);
-                    keyboardLayoutDescriptor = mDataStore.getCurrentKeyboardLayout(
-                            key);
-                } finally {
-                    mDataStore.saveIfNeeded();
-                }
-            }
-
-            if (changed) {
-                if (mSwitchedKeyboardLayoutToast != null) {
-                    mSwitchedKeyboardLayoutToast.cancel();
-                    mSwitchedKeyboardLayoutToast = null;
-                }
-                if (keyboardLayoutDescriptor != null) {
-                    KeyboardLayout keyboardLayout = getKeyboardLayout(keyboardLayoutDescriptor);
-                    if (keyboardLayout != null) {
-                        mSwitchedKeyboardLayoutToast = Toast.makeText(
-                                mContext, keyboardLayout.getLabel(), Toast.LENGTH_SHORT);
-                        mSwitchedKeyboardLayoutToast.show();
-                    }
-                }
-
-                reloadKeyboardLayouts();
-            }
-        }
-    }
-
     @Nullable
     @AnyThread
     public String[] getKeyboardLayoutOverlay(InputDeviceIdentifier identifier, String languageTag,
             String layoutType) {
         String keyboardLayoutDescriptor;
-        if (useNewSettingsUi()) {
-            synchronized (mImeInfoLock) {
-                KeyboardLayoutSelectionResult result = getKeyboardLayoutForInputDeviceInternal(
-                        new KeyboardIdentifier(identifier, languageTag, layoutType),
-                        mCurrentImeInfo);
-                keyboardLayoutDescriptor = result.getLayoutDescriptor();
-            }
-        } else {
-            keyboardLayoutDescriptor = getCurrentKeyboardLayoutForInputDevice(identifier);
+        synchronized (mImeInfoLock) {
+            KeyboardLayoutSelectionResult result = getKeyboardLayoutForInputDeviceInternal(
+                    new KeyboardIdentifier(identifier, languageTag, layoutType),
+                    mCurrentImeInfo);
+            keyboardLayoutDescriptor = result.getLayoutDescriptor();
         }
         if (keyboardLayoutDescriptor == null) {
             return null;
@@ -797,10 +502,6 @@
     public KeyboardLayoutSelectionResult getKeyboardLayoutForInputDevice(
             InputDeviceIdentifier identifier, @UserIdInt int userId,
             @NonNull InputMethodInfo imeInfo, @Nullable InputMethodSubtype imeSubtype) {
-        if (!useNewSettingsUi()) {
-            Slog.e(TAG, "getKeyboardLayoutForInputDevice() API not supported");
-            return FAILED;
-        }
         InputDevice inputDevice = getInputDevice(identifier);
         if (inputDevice == null || inputDevice.isVirtual() || !inputDevice.isFullKeyboard()) {
             return FAILED;
@@ -820,10 +521,6 @@
             @UserIdInt int userId, @NonNull InputMethodInfo imeInfo,
             @Nullable InputMethodSubtype imeSubtype,
             String keyboardLayoutDescriptor) {
-        if (!useNewSettingsUi()) {
-            Slog.e(TAG, "setKeyboardLayoutForInputDevice() API not supported");
-            return;
-        }
         Objects.requireNonNull(keyboardLayoutDescriptor,
                 "keyboardLayoutDescriptor must not be null");
         InputDevice inputDevice = getInputDevice(identifier);
@@ -854,10 +551,6 @@
     public KeyboardLayout[] getKeyboardLayoutListForInputDevice(InputDeviceIdentifier identifier,
             @UserIdInt int userId, @NonNull InputMethodInfo imeInfo,
             @Nullable InputMethodSubtype imeSubtype) {
-        if (!useNewSettingsUi()) {
-            Slog.e(TAG, "getKeyboardLayoutListForInputDevice() API not supported");
-            return new KeyboardLayout[0];
-        }
         InputDevice inputDevice = getInputDevice(identifier);
         if (inputDevice == null || inputDevice.isVirtual() || !inputDevice.isFullKeyboard()) {
             return new KeyboardLayout[0];
@@ -923,10 +616,6 @@
     public void onInputMethodSubtypeChanged(@UserIdInt int userId,
             @Nullable InputMethodSubtypeHandle subtypeHandle,
             @Nullable InputMethodSubtype subtype) {
-        if (!useNewSettingsUi()) {
-            Slog.e(TAG, "onInputMethodSubtypeChanged() API not supported");
-            return;
-        }
         if (subtypeHandle == null) {
             if (DEBUG) {
                 Slog.d(TAG, "No InputMethod is running, ignoring change");
@@ -1289,9 +978,6 @@
                     onInputDeviceAdded(deviceId);
                 }
                 return true;
-            case MSG_SWITCH_KEYBOARD_LAYOUT:
-                handleSwitchKeyboardLayout(msg.arg1, msg.arg2);
-                return true;
             case MSG_RELOAD_KEYBOARD_LAYOUTS:
                 reloadKeyboardLayouts();
                 return true;
@@ -1303,10 +989,6 @@
         }
     }
 
-    private boolean useNewSettingsUi() {
-        return FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI);
-    }
-
     @Nullable
     private InputDevice getInputDevice(int deviceId) {
         InputManager inputManager = mContext.getSystemService(InputManager.class);
diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java
index 972a9e3..32d5044 100644
--- a/services/core/java/com/android/server/input/NativeInputManagerService.java
+++ b/services/core/java/com/android/server/input/NativeInputManagerService.java
@@ -273,6 +273,8 @@
      */
     void setAccessibilityStickyKeysEnabled(boolean enabled);
 
+    void setInputMethodConnectionIsActive(boolean isActive);
+
     /** The native implementation of InputManagerService methods. */
     class NativeImpl implements NativeInputManagerService {
         /** Pointer to native input manager service object, used by native code. */
@@ -549,5 +551,8 @@
 
         @Override
         public native void setAccessibilityStickyKeysEnabled(boolean enabled);
+
+        @Override
+        public native void setInputMethodConnectionIsActive(boolean isActive);
     }
 }
diff --git a/services/core/java/com/android/server/input/PersistentDataStore.java b/services/core/java/com/android/server/input/PersistentDataStore.java
index 31083fd..7859253 100644
--- a/services/core/java/com/android/server/input/PersistentDataStore.java
+++ b/services/core/java/com/android/server/input/PersistentDataStore.java
@@ -27,7 +27,6 @@
 import android.view.Surface;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.XmlUtils;
 import com.android.modules.utils.TypedXmlPullParser;
 import com.android.modules.utils.TypedXmlSerializer;
@@ -42,7 +41,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -74,7 +72,7 @@
             new HashMap<String, InputDeviceState>();
 
     // The interface for methods which should be replaced by the test harness.
-    private Injector mInjector;
+    private final Injector mInjector;
 
     // True if the data has been loaded.
     private boolean mLoaded;
@@ -83,7 +81,7 @@
     private boolean mDirty;
 
     // Storing key remapping
-    private Map<Integer, Integer> mKeyRemapping = new HashMap<>();
+    private final Map<Integer, Integer> mKeyRemapping = new HashMap<>();
 
     public PersistentDataStore() {
         this(new Injector());
@@ -130,22 +128,6 @@
     }
 
     @Nullable
-    public String getCurrentKeyboardLayout(String inputDeviceDescriptor) {
-        InputDeviceState state = getInputDeviceState(inputDeviceDescriptor);
-        return state != null ? state.getCurrentKeyboardLayout() : null;
-    }
-
-    public boolean setCurrentKeyboardLayout(String inputDeviceDescriptor,
-            String keyboardLayoutDescriptor) {
-        InputDeviceState state = getOrCreateInputDeviceState(inputDeviceDescriptor);
-        if (state.setCurrentKeyboardLayout(keyboardLayoutDescriptor)) {
-            setDirty();
-            return true;
-        }
-        return false;
-    }
-
-    @Nullable
     public String getKeyboardLayout(String inputDeviceDescriptor, String key) {
         InputDeviceState state = getInputDeviceState(inputDeviceDescriptor);
         return state != null ? state.getKeyboardLayout(key) : null;
@@ -171,43 +153,6 @@
         return false;
     }
 
-    public String[] getKeyboardLayouts(String inputDeviceDescriptor) {
-        InputDeviceState state = getInputDeviceState(inputDeviceDescriptor);
-        if (state == null) {
-            return (String[])ArrayUtils.emptyArray(String.class);
-        }
-        return state.getKeyboardLayouts();
-    }
-
-    public boolean addKeyboardLayout(String inputDeviceDescriptor,
-            String keyboardLayoutDescriptor) {
-        InputDeviceState state = getOrCreateInputDeviceState(inputDeviceDescriptor);
-        if (state.addKeyboardLayout(keyboardLayoutDescriptor)) {
-            setDirty();
-            return true;
-        }
-        return false;
-    }
-
-    public boolean removeKeyboardLayout(String inputDeviceDescriptor,
-            String keyboardLayoutDescriptor) {
-        InputDeviceState state = getOrCreateInputDeviceState(inputDeviceDescriptor);
-        if (state.removeKeyboardLayout(keyboardLayoutDescriptor)) {
-            setDirty();
-            return true;
-        }
-        return false;
-    }
-
-    public boolean switchKeyboardLayout(String inputDeviceDescriptor, int direction) {
-        InputDeviceState state = getInputDeviceState(inputDeviceDescriptor);
-        if (state != null && state.switchKeyboardLayout(direction)) {
-            setDirty();
-            return true;
-        }
-        return false;
-    }
-
     public boolean setKeyboardBacklightBrightness(String inputDeviceDescriptor, int lightId,
             int brightness) {
         InputDeviceState state = getOrCreateInputDeviceState(inputDeviceDescriptor);
@@ -417,9 +362,6 @@
                 "x_ymix", "x_offset", "y_xmix", "y_scale", "y_offset" };
 
         private final TouchCalibration[] mTouchCalibration = new TouchCalibration[4];
-        @Nullable
-        private String mCurrentKeyboardLayout;
-        private final ArrayList<String> mKeyboardLayouts = new ArrayList<String>();
         private final SparseIntArray mKeyboardBacklightBrightnessMap = new SparseIntArray();
 
         private final Map<String, String> mKeyboardLayoutMap = new ArrayMap<>();
@@ -465,49 +407,6 @@
             return true;
         }
 
-        @Nullable
-        public String getCurrentKeyboardLayout() {
-            return mCurrentKeyboardLayout;
-        }
-
-        public boolean setCurrentKeyboardLayout(String keyboardLayout) {
-            if (Objects.equals(mCurrentKeyboardLayout, keyboardLayout)) {
-                return false;
-            }
-            addKeyboardLayout(keyboardLayout);
-            mCurrentKeyboardLayout = keyboardLayout;
-            return true;
-        }
-
-        public String[] getKeyboardLayouts() {
-            if (mKeyboardLayouts.isEmpty()) {
-                return (String[])ArrayUtils.emptyArray(String.class);
-            }
-            return mKeyboardLayouts.toArray(new String[mKeyboardLayouts.size()]);
-        }
-
-        public boolean addKeyboardLayout(String keyboardLayout) {
-            int index = Collections.binarySearch(mKeyboardLayouts, keyboardLayout);
-            if (index >= 0) {
-                return false;
-            }
-            mKeyboardLayouts.add(-index - 1, keyboardLayout);
-            if (mCurrentKeyboardLayout == null) {
-                mCurrentKeyboardLayout = keyboardLayout;
-            }
-            return true;
-        }
-
-        public boolean removeKeyboardLayout(String keyboardLayout) {
-            int index = Collections.binarySearch(mKeyboardLayouts, keyboardLayout);
-            if (index < 0) {
-                return false;
-            }
-            mKeyboardLayouts.remove(index);
-            updateCurrentKeyboardLayoutIfRemoved(keyboardLayout, index);
-            return true;
-        }
-
         public boolean setKeyboardBacklightBrightness(int lightId, int brightness) {
             if (mKeyboardBacklightBrightnessMap.get(lightId, INVALID_VALUE) == brightness) {
                 return false;
@@ -521,48 +420,8 @@
             return brightness == INVALID_VALUE ? OptionalInt.empty() : OptionalInt.of(brightness);
         }
 
-        private void updateCurrentKeyboardLayoutIfRemoved(
-                String removedKeyboardLayout, int removedIndex) {
-            if (Objects.equals(mCurrentKeyboardLayout, removedKeyboardLayout)) {
-                if (!mKeyboardLayouts.isEmpty()) {
-                    int index = removedIndex;
-                    if (index == mKeyboardLayouts.size()) {
-                        index = 0;
-                    }
-                    mCurrentKeyboardLayout = mKeyboardLayouts.get(index);
-                } else {
-                    mCurrentKeyboardLayout = null;
-                }
-            }
-        }
-
-        public boolean switchKeyboardLayout(int direction) {
-            final int size = mKeyboardLayouts.size();
-            if (size < 2) {
-                return false;
-            }
-            int index = Collections.binarySearch(mKeyboardLayouts, mCurrentKeyboardLayout);
-            assert index >= 0;
-            if (direction > 0) {
-                index = (index + 1) % size;
-            } else {
-                index = (index + size - 1) % size;
-            }
-            mCurrentKeyboardLayout = mKeyboardLayouts.get(index);
-            return true;
-        }
-
         public boolean removeUninstalledKeyboardLayouts(Set<String> availableKeyboardLayouts) {
             boolean changed = false;
-            for (int i = mKeyboardLayouts.size(); i-- > 0; ) {
-                String keyboardLayout = mKeyboardLayouts.get(i);
-                if (!availableKeyboardLayouts.contains(keyboardLayout)) {
-                    Slog.i(TAG, "Removing uninstalled keyboard layout " + keyboardLayout);
-                    mKeyboardLayouts.remove(i);
-                    updateCurrentKeyboardLayoutIfRemoved(keyboardLayout, i);
-                    changed = true;
-                }
-            }
             List<String> removedEntries = new ArrayList<>();
             for (String key : mKeyboardLayoutMap.keySet()) {
                 if (!availableKeyboardLayouts.contains(mKeyboardLayoutMap.get(key))) {
@@ -582,27 +441,7 @@
                 throws IOException, XmlPullParserException {
             final int outerDepth = parser.getDepth();
             while (XmlUtils.nextElementWithin(parser, outerDepth)) {
-                if (parser.getName().equals("keyboard-layout")) {
-                    String descriptor = parser.getAttributeValue(null, "descriptor");
-                    if (descriptor == null) {
-                        throw new XmlPullParserException(
-                                "Missing descriptor attribute on keyboard-layout.");
-                    }
-                    String current = parser.getAttributeValue(null, "current");
-                    if (mKeyboardLayouts.contains(descriptor)) {
-                        throw new XmlPullParserException(
-                                "Found duplicate keyboard layout.");
-                    }
-
-                    mKeyboardLayouts.add(descriptor);
-                    if (current != null && current.equals("true")) {
-                        if (mCurrentKeyboardLayout != null) {
-                            throw new XmlPullParserException(
-                                    "Found multiple current keyboard layouts.");
-                        }
-                        mCurrentKeyboardLayout = descriptor;
-                    }
-                } else if (parser.getName().equals("keyed-keyboard-layout")) {
+                if (parser.getName().equals("keyed-keyboard-layout")) {
                     String key = parser.getAttributeValue(null, "key");
                     if (key == null) {
                         throw new XmlPullParserException(
@@ -676,27 +515,9 @@
                     }
                 }
             }
-
-            // Maintain invariant that layouts are sorted.
-            Collections.sort(mKeyboardLayouts);
-
-            // Maintain invariant that there is always a current keyboard layout unless
-            // there are none installed.
-            if (mCurrentKeyboardLayout == null && !mKeyboardLayouts.isEmpty()) {
-                mCurrentKeyboardLayout = mKeyboardLayouts.get(0);
-            }
         }
 
         public void saveToXml(TypedXmlSerializer serializer) throws IOException {
-            for (String layout : mKeyboardLayouts) {
-                serializer.startTag(null, "keyboard-layout");
-                serializer.attribute(null, "descriptor", layout);
-                if (layout.equals(mCurrentKeyboardLayout)) {
-                    serializer.attributeBoolean(null, "current", true);
-                }
-                serializer.endTag(null, "keyboard-layout");
-            }
-
             for (String key : mKeyboardLayoutMap.keySet()) {
                 serializer.startTag(null, "keyed-keyboard-layout");
                 serializer.attribute(null, "key", key);
diff --git a/services/core/java/com/android/server/inputmethod/AdditionalSubtypeMapRepository.java b/services/core/java/com/android/server/inputmethod/AdditionalSubtypeMapRepository.java
index dd6433d..c7b60da 100644
--- a/services/core/java/com/android/server/inputmethod/AdditionalSubtypeMapRepository.java
+++ b/services/core/java/com/android/server/inputmethod/AdditionalSubtypeMapRepository.java
@@ -19,13 +19,11 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UserIdInt;
-import android.content.Context;
 import android.content.pm.UserInfo;
 import android.os.Handler;
 import android.util.SparseArray;
 
 import com.android.internal.annotations.GuardedBy;
-import com.android.internal.inputmethod.DirectBootAwareness;
 import com.android.server.LocalServices;
 import com.android.server.pm.UserManagerInternal;
 
@@ -69,7 +67,7 @@
         AdditionalSubtypeUtils.save(map, inputMethodMap, userId);
     }
 
-    static void initialize(@NonNull Handler handler, @NonNull Context context) {
+    static void initialize(@NonNull Handler handler) {
         final UserManagerInternal userManagerInternal =
                 LocalServices.getService(UserManagerInternal.class);
         handler.post(() -> {
@@ -81,16 +79,8 @@
                             handler.post(() -> {
                                 synchronized (ImfLock.class) {
                                     if (!sPerUserMap.contains(userId)) {
-                                        final AdditionalSubtypeMap additionalSubtypeMap =
-                                                AdditionalSubtypeUtils.load(userId);
-                                        sPerUserMap.put(userId, additionalSubtypeMap);
-                                        final InputMethodSettings settings =
-                                                InputMethodManagerService
-                                                        .queryInputMethodServicesInternal(context,
-                                                                userId,
-                                                                additionalSubtypeMap,
-                                                                DirectBootAwareness.AUTO);
-                                        InputMethodSettingsRepository.put(userId, settings);
+                                        sPerUserMap.put(userId,
+                                                AdditionalSubtypeUtils.load(userId));
                                     }
                                 }
                             });
diff --git a/services/core/java/com/android/server/inputmethod/ImeTrackerService.java b/services/core/java/com/android/server/inputmethod/ImeTrackerService.java
index 85ab773..1c14fc1 100644
--- a/services/core/java/com/android/server/inputmethod/ImeTrackerService.java
+++ b/services/core/java/com/android/server/inputmethod/ImeTrackerService.java
@@ -165,6 +165,15 @@
         }
     }
 
+    @EnforcePermission(Manifest.permission.TEST_INPUT_METHOD)
+    @Override
+    public void finishTrackingPendingImeVisibilityRequests() {
+        super.finishTrackingPendingImeVisibilityRequests_enforcePermission();
+        synchronized (mLock) {
+            mHistory.mLiveEntries.clear();
+        }
+    }
+
     /**
      * A circular buffer storing the most recent few {@link ImeTracker.Token} entries information.
      */
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
index 29cccdf..a100fe0 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
@@ -74,6 +74,7 @@
     @GuardedBy("ImfLock.class") @Nullable private IInputMethodInvoker mCurMethod;
     @GuardedBy("ImfLock.class") private int mCurMethodUid = Process.INVALID_UID;
     @GuardedBy("ImfLock.class") @Nullable private IBinder mCurToken;
+    @GuardedBy("ImfLock.class") private int mCurSeq;
     @GuardedBy("ImfLock.class") private boolean mVisibleBound;
     @GuardedBy("ImfLock.class") private boolean mSupportsStylusHw;
     @GuardedBy("ImfLock.class") private boolean mSupportsConnectionlessStylusHw;
@@ -194,6 +195,27 @@
     }
 
     /**
+     * The current binding sequence number, incremented every time there is
+     * a new bind performed.
+     */
+    @GuardedBy("ImfLock.class")
+    int getSequenceNumber() {
+        return mCurSeq;
+    }
+
+    /**
+     * Increase the current binding sequence number by one.
+     * Reset to 1 on overflow.
+     */
+    @GuardedBy("ImfLock.class")
+    void advanceSequenceNumber() {
+        mCurSeq += 1;
+        if (mCurSeq <= 0) {
+            mCurSeq = 1;
+        }
+    }
+
+    /**
      * If non-null, this is the input method service we are currently connected
      * to.
      */
@@ -413,11 +435,9 @@
             mLastBindTime = SystemClock.uptimeMillis();
 
             addFreshWindowToken();
-            final UserData monitor = UserData.getOrCreate(
-                    mService.getCurrentImeUserIdLocked());
             return new InputBindResult(
                     InputBindResult.ResultCode.SUCCESS_WAITING_IME_BINDING,
-                    null, null, null, mCurId, monitor.mSequence.getSequenceNumber(), false);
+                    null, null, null, mCurId, mCurSeq, false);
         }
 
         Slog.w(InputMethodManagerService.TAG,
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
index dda50ca..1d048cb 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java
@@ -235,12 +235,6 @@
             IBinder targetWindowToken);
 
     /**
-     * Returns true if any InputConnection is currently active.
-     * {@hide}
-     */
-    public abstract boolean isAnyInputConnectionActive();
-
-    /**
      * Fake implementation of {@link InputMethodManagerInternal}. All the methods do nothing.
      */
     private static final InputMethodManagerInternal NOP =
@@ -331,11 +325,6 @@
                 public void onSwitchKeyboardLayoutShortcut(int direction, int displayId,
                         IBinder targetWindowToken) {
                 }
-
-                @Override
-                public boolean isAnyInputConnectionActive() {
-                    return false;
-                }
             };
 
     /**
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index cfd64c4..1d07eee 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -284,12 +284,9 @@
     final Context mContext;
     final Resources mRes;
     private final Handler mHandler;
-
+    @NonNull
     @MultiUserUnawareField
-    @UserIdInt
-    @GuardedBy("ImfLock.class")
-    private int mCurrentUserId;
-
+    private InputMethodSettings mSettings;
     @MultiUserUnawareField
     final SettingsObserver mSettingsObserver;
     final WindowManagerInternal mWindowManagerInternal;
@@ -479,8 +476,7 @@
      */
     @GuardedBy("ImfLock.class")
     private int getSequenceNumberLocked() {
-        final UserData monitor = UserData.getOrCreate(mCurrentUserId);
-        return monitor.mSequence.getSequenceNumber();
+        return mBindingController.getSequenceNumber();
     }
 
     /**
@@ -489,14 +485,13 @@
      */
     @GuardedBy("ImfLock.class")
     private void advanceSequenceNumberLocked() {
-        final UserData monitor = UserData.getOrCreate(mCurrentUserId);
-        monitor.mSequence.advanceSequenceNumber();
+        mBindingController.advanceSequenceNumber();
     }
 
     @GuardedBy("ImfLock.class")
     @Nullable
     InputMethodInfo queryInputMethodForCurrentUserLocked(@NonNull String imeId) {
-        return InputMethodSettingsRepository.get(mCurrentUserId).getMethodMap().get(imeId);
+        return mSettings.getMethodMap().get(imeId);
     }
 
     /**
@@ -817,8 +812,7 @@
                     InputMethodManager.invalidateLocalStylusHandwritingAvailabilityCaches();
                 } else {
                     boolean enabledChanged = false;
-                    String newEnabled = InputMethodSettingsRepository.get(mCurrentUserId)
-                            .getEnabledInputMethodsStr();
+                    String newEnabled = mSettings.getEnabledInputMethodsStr();
                     if (!mLastEnabled.equals(newEnabled)) {
                         mLastEnabled = newEnabled;
                         enabledChanged = true;
@@ -850,11 +844,9 @@
                 // sender userId can be a real user ID or USER_ALL.
                 final int senderUserId = pendingResult.getSendingUserId();
                 if (senderUserId != UserHandle.USER_ALL) {
-                    synchronized (ImfLock.class) {
-                        if (senderUserId != mCurrentUserId) {
-                            // A background user is trying to hide the dialog. Ignore.
-                            return;
-                        }
+                    if (senderUserId != mSettings.getUserId()) {
+                        // A background user is trying to hide the dialog. Ignore.
+                        return;
                     }
                 }
                 mMenuController.hideInputMethodMenu();
@@ -878,14 +870,9 @@
             if (!mSystemReady) {
                 return;
             }
-            for (int userId : mUserManagerInternal.getUserIds()) {
-                final InputMethodSettings settings = queryInputMethodServicesInternal(
-                                mContext,
-                                userId,
-                                AdditionalSubtypeMapRepository.get(userId),
-                                DirectBootAwareness.AUTO);
-                InputMethodSettingsRepository.put(userId, settings);
-            }
+            mSettings = queryInputMethodServicesInternal(mContext, mSettings.getUserId(),
+                    AdditionalSubtypeMapRepository.get(mSettings.getUserId()),
+                    DirectBootAwareness.AUTO);
             postInputMethodSettingUpdatedLocked(true /* resetDefaultEnabledIme */);
             // If the locale is changed, needs to reset the default ime
             resetDefaultImeLocked(mContext);
@@ -946,7 +933,7 @@
         @GuardedBy("ImfLock.class")
         private boolean isChangingPackagesOfCurrentUserLocked() {
             final int userId = getChangingUserId();
-            final boolean retval = userId == mCurrentUserId;
+            final boolean retval = userId == mSettings.getUserId();
             if (DEBUG) {
                 if (!retval) {
                     Slog.d(TAG, "--- ignore this call back from a background user: " + userId);
@@ -961,10 +948,8 @@
                 if (!isChangingPackagesOfCurrentUserLocked()) {
                     return false;
                 }
-                final InputMethodSettings settings =
-                        InputMethodSettingsRepository.get(mCurrentUserId);
-                String curInputMethodId = settings.getSelectedInputMethod();
-                final List<InputMethodInfo> methodList = settings.getMethodList();
+                String curInputMethodId = mSettings.getSelectedInputMethod();
+                final List<InputMethodInfo> methodList = mSettings.getMethodList();
                 final int numImes = methodList.size();
                 if (curInputMethodId != null) {
                     for (int i = 0; i < numImes; i++) {
@@ -1081,10 +1066,16 @@
         private void onFinishPackageChangesInternal() {
             synchronized (ImfLock.class) {
                 final int userId = getChangingUserId();
-                final boolean isCurrentUser = (userId == mCurrentUserId);
+                final boolean isCurrentUser = (userId == mSettings.getUserId());
                 final AdditionalSubtypeMap additionalSubtypeMap =
                         AdditionalSubtypeMapRepository.get(userId);
-                final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
+                final InputMethodSettings settings;
+                if (isCurrentUser) {
+                    settings = mSettings;
+                } else {
+                    settings = queryInputMethodServicesInternal(mContext, userId,
+                            additionalSubtypeMap, DirectBootAwareness.AUTO);
+                }
 
                 InputMethodInfo curIm = null;
                 String curInputMethodId = settings.getSelectedInputMethod();
@@ -1128,17 +1119,16 @@
                     AdditionalSubtypeMapRepository.putAndSave(userId, newAdditionalSubtypeMap,
                             settings.getMethodMap());
                 }
-                if (isCurrentUser
-                        && !(additionalSubtypeChanged || shouldRebuildInputMethodListLocked())) {
-                    return;
-                }
 
-                final InputMethodSettings newSettings = queryInputMethodServicesInternal(mContext,
-                        userId, newAdditionalSubtypeMap, DirectBootAwareness.AUTO);
-                InputMethodSettingsRepository.put(userId, newSettings);
                 if (!isCurrentUser) {
                     return;
                 }
+
+                if (!(additionalSubtypeChanged || shouldRebuildInputMethodListLocked())) {
+                    return;
+                }
+                mSettings = queryInputMethodServicesInternal(mContext, userId,
+                        newAdditionalSubtypeMap, DirectBootAwareness.AUTO);
                 postInputMethodSettingUpdatedLocked(false /* resetDefaultEnabledIme */);
 
                 boolean changed = false;
@@ -1299,20 +1289,21 @@
 
     void onUnlockUser(@UserIdInt int userId) {
         synchronized (ImfLock.class) {
+            final int currentUserId = mSettings.getUserId();
             if (DEBUG) {
-                Slog.d(TAG, "onUnlockUser: userId=" + userId + " curUserId=" + mCurrentUserId);
+                Slog.d(TAG, "onUnlockUser: userId=" + userId + " curUserId=" + currentUserId);
+            }
+            if (userId != currentUserId) {
+                return;
             }
             if (!mSystemReady) {
                 return;
             }
-            final InputMethodSettings newSettings = queryInputMethodServicesInternal(mContext,
-                    userId, AdditionalSubtypeMapRepository.get(userId), DirectBootAwareness.AUTO);
-            InputMethodSettingsRepository.put(userId, newSettings);
-            if (mCurrentUserId == userId) {
-                // We need to rebuild IMEs.
-                postInputMethodSettingUpdatedLocked(false /* resetDefaultEnabledIme */);
-                updateInputMethodsFromSettingsLocked(true /* enabledChanged */);
-            }
+            mSettings = queryInputMethodServicesInternal(mContext, userId,
+                    AdditionalSubtypeMapRepository.get(userId), DirectBootAwareness.AUTO);
+            // We need to rebuild IMEs.
+            postInputMethodSettingUpdatedLocked(false /* resetDefaultEnabledIme */);
+            updateInputMethodsFromSettingsLocked(true /* enabledChanged */);
         }
     }
 
@@ -1345,85 +1336,84 @@
             Context context,
             @Nullable ServiceThread serviceThreadForTesting,
             @Nullable InputMethodBindingController bindingControllerForTesting) {
-        mContext = context;
-        mRes = context.getResources();
-        SecureSettingsWrapper.onStart(mContext);
-        // TODO(b/196206770): Disallow I/O on this thread. Currently it's needed for loading
-        // additional subtypes in switchUserOnHandlerLocked().
-        final ServiceThread thread =
-                serviceThreadForTesting != null
-                        ? serviceThreadForTesting
-                        : new ServiceThread(
-                                HANDLER_THREAD_NAME,
-                                Process.THREAD_PRIORITY_FOREGROUND,
-                                true /* allowIo */);
-        thread.start();
-        mHandler = Handler.createAsync(thread.getLooper(), this);
-        SystemLocaleWrapper.onStart(context, this::onActionLocaleChanged, mHandler);
-        mImeTrackerService = new ImeTrackerService(serviceThreadForTesting != null
-                ? serviceThreadForTesting.getLooper() : Looper.getMainLooper());
-        // Note: SettingsObserver doesn't register observers in its constructor.
-        mSettingsObserver = new SettingsObserver(mHandler);
-        mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
-        mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
-        mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
-        mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
-        mImePlatformCompatUtils = new ImePlatformCompatUtils();
-        mInputMethodDeviceConfigs = new InputMethodDeviceConfigs();
-        mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
-
-        mSlotIme = mContext.getString(com.android.internal.R.string.status_bar_ime);
-
-        mShowOngoingImeSwitcherForPhones = false;
-
-        // InputMethodSettingsRepository should be initialized before buildInputMethodListLocked
-        InputMethodSettingsRepository.initialize(mHandler, mContext);
-        AdditionalSubtypeMapRepository.initialize(mHandler, mContext);
-        UserData.initialize(mHandler);
-
-        mCurrentUserId = mActivityManagerInternal.getCurrentUserId();
-
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-
-        mSwitchingController =
-                InputMethodSubtypeSwitchingController.createInstanceLocked(context,
-                        settings.getMethodMap(), settings.getUserId());
-        mHardwareKeyboardShortcutController =
-                new HardwareKeyboardShortcutController(settings.getMethodMap(),
-                        settings.getUserId());
-        mMenuController = new InputMethodMenuController(this);
-        mBindingController =
-                bindingControllerForTesting != null
-                        ? bindingControllerForTesting
-                        : new InputMethodBindingController(this);
-        mAutofillController = new AutofillSuggestionsController(this);
-
-        mVisibilityStateComputer = new ImeVisibilityStateComputer(this);
-        mVisibilityApplier = new DefaultImeVisibilityApplier(this);
-
-        mClientController = new ClientController(mPackageManagerInternal);
         synchronized (ImfLock.class) {
+            mContext = context;
+            mRes = context.getResources();
+            SecureSettingsWrapper.onStart(mContext);
+
+            // TODO(b/196206770): Disallow I/O on this thread. Currently it's needed for loading
+            // additional subtypes in switchUserOnHandlerLocked().
+            final ServiceThread thread =
+                    serviceThreadForTesting != null
+                            ? serviceThreadForTesting
+                            : new ServiceThread(
+                                    HANDLER_THREAD_NAME,
+                                    Process.THREAD_PRIORITY_FOREGROUND,
+                                    true /* allowIo */);
+            thread.start();
+            mHandler = Handler.createAsync(thread.getLooper(), this);
+            SystemLocaleWrapper.onStart(context, this::onActionLocaleChanged, mHandler);
+            mImeTrackerService = new ImeTrackerService(serviceThreadForTesting != null
+                    ? serviceThreadForTesting.getLooper() : Looper.getMainLooper());
+            // Note: SettingsObserver doesn't register observers in its constructor.
+            mSettingsObserver = new SettingsObserver(mHandler);
+            mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
+            mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
+            mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
+            mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
+            mImePlatformCompatUtils = new ImePlatformCompatUtils();
+            mInputMethodDeviceConfigs = new InputMethodDeviceConfigs();
+            mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
+
+            mSlotIme = mContext.getString(com.android.internal.R.string.status_bar_ime);
+
+            mShowOngoingImeSwitcherForPhones = false;
+
+            AdditionalSubtypeMapRepository.initialize(mHandler);
+
+            final int userId = mActivityManagerInternal.getCurrentUserId();
+
+            // mSettings should be created before buildInputMethodListLocked
+            mSettings = InputMethodSettings.createEmptyMap(userId);
+
+            mSwitchingController =
+                    InputMethodSubtypeSwitchingController.createInstanceLocked(context,
+                            mSettings.getMethodMap(), userId);
+            mHardwareKeyboardShortcutController =
+                    new HardwareKeyboardShortcutController(mSettings.getMethodMap(),
+                            mSettings.getUserId());
+            mMenuController = new InputMethodMenuController(this);
+            mBindingController =
+                    bindingControllerForTesting != null
+                            ? bindingControllerForTesting
+                            : new InputMethodBindingController(this);
+            mAutofillController = new AutofillSuggestionsController(this);
+
+            mVisibilityStateComputer = new ImeVisibilityStateComputer(this);
+            mVisibilityApplier = new DefaultImeVisibilityApplier(this);
+
+            mClientController = new ClientController(mPackageManagerInternal);
             mClientController.addClientControllerCallback(c -> onClientRemoved(c));
             mImeBindingState = ImeBindingState.newEmptyState();
-        }
 
-        mPreventImeStartupUnlessTextEditor = mRes.getBoolean(
-                com.android.internal.R.bool.config_preventImeStartupUnlessTextEditor);
-        mNonPreemptibleInputMethods = mRes.getStringArray(
-                com.android.internal.R.array.config_nonPreemptibleInputMethods);
-        IntConsumer toolTypeConsumer =
-                Flags.useHandwritingListenerForTooltype()
-                        ? toolType -> onUpdateEditorToolType(toolType) : null;
-        Runnable discardDelegationTextRunnable = () -> discardHandwritingDelegationText();
-        mHwController = new HandwritingModeController(mContext, thread.getLooper(),
-                new InkWindowInitializer(), toolTypeConsumer, discardDelegationTextRunnable);
-        registerDeviceListenerAndCheckStylusSupport();
+            mPreventImeStartupUnlessTextEditor = mRes.getBoolean(
+                    com.android.internal.R.bool.config_preventImeStartupUnlessTextEditor);
+            mNonPreemptibleInputMethods = mRes.getStringArray(
+                    com.android.internal.R.array.config_nonPreemptibleInputMethods);
+            IntConsumer toolTypeConsumer =
+                    Flags.useHandwritingListenerForTooltype()
+                            ? toolType -> onUpdateEditorToolType(toolType) : null;
+            Runnable discardDelegationTextRunnable = () -> discardHandwritingDelegationText();
+            mHwController = new HandwritingModeController(mContext, thread.getLooper(),
+                    new InkWindowInitializer(), toolTypeConsumer, discardDelegationTextRunnable);
+            registerDeviceListenerAndCheckStylusSupport();
+        }
     }
 
     @GuardedBy("ImfLock.class")
     @UserIdInt
     int getCurrentImeUserIdLocked() {
-        return mCurrentUserId;
+        return mSettings.getUserId();
     }
 
     private final class InkWindowInitializer implements Runnable {
@@ -1459,13 +1449,12 @@
     private void resetDefaultImeLocked(Context context) {
         // Do not reset the default (current) IME when it is a 3rd-party IME
         String selectedMethodId = getSelectedMethodIdLocked();
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
         if (selectedMethodId != null
-                && !settings.getMethodMap().get(selectedMethodId).isSystem()) {
+                && !mSettings.getMethodMap().get(selectedMethodId).isSystem()) {
             return;
         }
         final List<InputMethodInfo> suitableImes = InputMethodInfoUtils.getDefaultEnabledImes(
-                context, settings.getEnabledInputMethodList());
+                context, mSettings.getEnabledInputMethodList());
         if (suitableImes.isEmpty()) {
             Slog.i(TAG, "No default found");
             return;
@@ -1521,7 +1510,7 @@
             IInputMethodClientInvoker clientToBeReset) {
         if (DEBUG) {
             Slog.d(TAG, "Switching user stage 1/3. newUserId=" + newUserId
-                    + " currentUserId=" + mCurrentUserId);
+                    + " currentUserId=" + mSettings.getUserId());
         }
 
         maybeInitImeNavbarConfigLocked(newUserId);
@@ -1529,9 +1518,8 @@
         // ContentObserver should be registered again when the user is changed
         mSettingsObserver.registerContentObserverLocked(newUserId);
 
-        mCurrentUserId = newUserId;
-        final String defaultImiId = SecureSettingsWrapper.getString(
-                Settings.Secure.DEFAULT_INPUT_METHOD, null, newUserId);
+        mSettings = InputMethodSettings.createEmptyMap(newUserId);
+        final String defaultImiId = mSettings.getSelectedInputMethod();
 
         if (DEBUG) {
             Slog.d(TAG, "Switching user stage 2/3. newUserId=" + newUserId
@@ -1549,9 +1537,10 @@
         // and user switch would not happen at that time.
         resetCurrentMethodAndClientLocked(UnbindReason.SWITCH_USER);
 
-        final InputMethodSettings newSettings = InputMethodSettingsRepository.get(newUserId);
+        mSettings = queryInputMethodServicesInternal(mContext, newUserId,
+                AdditionalSubtypeMapRepository.get(newUserId), DirectBootAwareness.AUTO);
         postInputMethodSettingUpdatedLocked(initialUserSwitch /* resetDefaultEnabledIme */);
-        if (TextUtils.isEmpty(newSettings.getSelectedInputMethod())) {
+        if (TextUtils.isEmpty(mSettings.getSelectedInputMethod())) {
             // This is the first time of the user switch and
             // set the current ime to the proper one.
             resetDefaultImeLocked(mContext);
@@ -1561,12 +1550,12 @@
         if (initialUserSwitch) {
             InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(
                     getPackageManagerForUser(mContext, newUserId),
-                    newSettings.getEnabledInputMethodList());
+                    mSettings.getEnabledInputMethodList());
         }
 
         if (DEBUG) {
             Slog.d(TAG, "Switching user stage 3/3. newUserId=" + newUserId
-                    + " selectedIme=" + newSettings.getSelectedInputMethod());
+                    + " selectedIme=" + mSettings.getSelectedInputMethod());
         }
 
         if (mIsInteractive && clientToBeReset != null) {
@@ -1589,7 +1578,7 @@
             }
             if (!mSystemReady) {
                 mSystemReady = true;
-                final int currentUserId = mCurrentUserId;
+                final int currentUserId = mSettings.getUserId();
                 mStatusBarManagerInternal =
                         LocalServices.getService(StatusBarManagerInternal.class);
                 hideStatusBarIconLocked();
@@ -1610,7 +1599,7 @@
                     // the "mImeDrawsImeNavBarResLazyInitFuture" field.
                     synchronized (ImfLock.class) {
                         mImeDrawsImeNavBarResLazyInitFuture = null;
-                        if (currentUserId != mCurrentUserId) {
+                        if (currentUserId != mSettings.getUserId()) {
                             // This means that the current user is already switched to other user
                             // before the background task is executed. In this scenario the relevant
                             // field should already be initialized.
@@ -1629,19 +1618,17 @@
                         UserHandle.ALL, broadcastFilterForAllUsers, null, null,
                         Context.RECEIVER_EXPORTED);
 
-                final String defaultImiId = SecureSettingsWrapper.getString(
-                        Settings.Secure.DEFAULT_INPUT_METHOD, null, currentUserId);
+                final String defaultImiId = mSettings.getSelectedInputMethod();
                 final boolean imeSelectedOnBoot = !TextUtils.isEmpty(defaultImiId);
-                final InputMethodSettings newSettings = queryInputMethodServicesInternal(mContext,
-                        currentUserId, AdditionalSubtypeMapRepository.get(currentUserId),
+                mSettings = queryInputMethodServicesInternal(mContext, currentUserId,
+                        AdditionalSubtypeMapRepository.get(mSettings.getUserId()),
                         DirectBootAwareness.AUTO);
-                InputMethodSettingsRepository.put(currentUserId, newSettings);
                 postInputMethodSettingUpdatedLocked(
                         !imeSelectedOnBoot /* resetDefaultEnabledIme */);
                 updateFromSettingsLocked(true);
                 InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(
                         getPackageManagerForUser(mContext, currentUserId),
-                        newSettings.getEnabledInputMethodList());
+                        mSettings.getEnabledInputMethodList());
             }
         }
     }
@@ -1688,7 +1675,7 @@
         }
         synchronized (ImfLock.class) {
             final int[] resolvedUserIds = InputMethodUtils.resolveUserId(userId,
-                    mCurrentUserId, null);
+                    mSettings.getUserId(), null);
             if (resolvedUserIds.length != 1) {
                 return Collections.emptyList();
             }
@@ -1711,7 +1698,7 @@
         }
         synchronized (ImfLock.class) {
             final int[] resolvedUserIds = InputMethodUtils.resolveUserId(userId,
-                    mCurrentUserId, null);
+                    mSettings.getUserId(), null);
             if (resolvedUserIds.length != 1) {
                 return Collections.emptyList();
             }
@@ -1739,12 +1726,14 @@
             }
 
             // Check if selected IME of current user supports handwriting.
-            if (userId == mCurrentUserId) {
+            if (userId == mSettings.getUserId()) {
                 return mBindingController.supportsStylusHandwriting()
                         && (!connectionless
                                 || mBindingController.supportsConnectionlessStylusHandwriting());
             }
-            final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
+            //TODO(b/197848765): This can be optimized by caching multi-user methodMaps/methodList.
+            //TODO(b/210039666): use cache.
+            final InputMethodSettings settings = queryMethodMapForUserLocked(userId);
             final InputMethodInfo imi = settings.getMethodMap().get(
                     settings.getSelectedInputMethod());
             return imi != null && imi.supportsStylusHandwriting()
@@ -1768,8 +1757,9 @@
     private List<InputMethodInfo> getInputMethodListLocked(@UserIdInt int userId,
             @DirectBootAwareness int directBootAwareness, int callingUid) {
         final InputMethodSettings settings;
-        if (directBootAwareness == DirectBootAwareness.AUTO) {
-            settings = InputMethodSettingsRepository.get(userId);
+        if (userId == mSettings.getUserId()
+                && directBootAwareness == DirectBootAwareness.AUTO) {
+            settings = mSettings;
         } else {
             final AdditionalSubtypeMap additionalSubtypeMap =
                     AdditionalSubtypeMapRepository.get(userId);
@@ -1787,8 +1777,15 @@
     @GuardedBy("ImfLock.class")
     private List<InputMethodInfo> getEnabledInputMethodListLocked(@UserIdInt int userId,
             int callingUid) {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
-        final ArrayList<InputMethodInfo> methodList = settings.getEnabledInputMethodList();
+        final ArrayList<InputMethodInfo> methodList;
+        final InputMethodSettings settings;
+        if (userId == mSettings.getUserId()) {
+            methodList = mSettings.getEnabledInputMethodList();
+            settings = mSettings;
+        } else {
+            settings = queryMethodMapForUserLocked(userId);
+            methodList = settings.getEnabledInputMethodList();
+        }
         // filter caller's access to input methods
         methodList.removeIf(imi ->
                 !canCallerAccessInputMethod(imi.getPackageName(), callingUid, userId, settings));
@@ -1846,7 +1843,22 @@
     @GuardedBy("ImfLock.class")
     private List<InputMethodSubtype> getEnabledInputMethodSubtypeListLocked(String imiId,
             boolean allowsImplicitlyEnabledSubtypes, @UserIdInt int userId, int callingUid) {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
+        if (userId == mSettings.getUserId()) {
+            final InputMethodInfo imi;
+            String selectedMethodId = getSelectedMethodIdLocked();
+            if (imiId == null && selectedMethodId != null) {
+                imi = mSettings.getMethodMap().get(selectedMethodId);
+            } else {
+                imi = mSettings.getMethodMap().get(imiId);
+            }
+            if (imi == null || !canCallerAccessInputMethod(
+                    imi.getPackageName(), callingUid, userId, mSettings)) {
+                return Collections.emptyList();
+            }
+            return mSettings.getEnabledInputMethodSubtypeList(
+                    imi, allowsImplicitlyEnabledSubtypes);
+        }
+        final InputMethodSettings settings = queryMethodMapForUserLocked(userId);
         final InputMethodInfo imi = settings.getMethodMap().get(imiId);
         if (imi == null) {
             return Collections.emptyList();
@@ -2026,7 +2038,7 @@
 
         final boolean restarting = !initial;
         final Binder startInputToken = new Binder();
-        final StartInputInfo info = new StartInputInfo(mCurrentUserId,
+        final StartInputInfo info = new StartInputInfo(mSettings.getUserId(),
                 getCurTokenLocked(),
                 mCurTokenDisplayId, getCurIdLocked(), startInputReason, restarting,
                 UserHandle.getUserId(mCurClient.mUid),
@@ -2040,9 +2052,9 @@
         // same-user scenarios.
         // That said ignoring cross-user scenario will never affect IMEs that do not have
         // INTERACT_ACROSS_USERS(_FULL) permissions, which is actually almost always the case.
-        if (mCurrentUserId == UserHandle.getUserId(
+        if (mSettings.getUserId() == UserHandle.getUserId(
                 mCurClient.mUid)) {
-            mPackageManagerInternal.grantImplicitAccess(mCurrentUserId,
+            mPackageManagerInternal.grantImplicitAccess(mSettings.getUserId(),
                     null /* intent */, UserHandle.getAppId(getCurMethodUidLocked()),
                     mCurClient.mUid, true /* direct */);
         }
@@ -2065,8 +2077,7 @@
         }
 
         String curId = getCurIdLocked();
-        final InputMethodInfo curInputMethodInfo = InputMethodSettingsRepository.get(mCurrentUserId)
-                .getMethodMap().get(curId);
+        final InputMethodInfo curInputMethodInfo = mSettings.getMethodMap().get(curId);
         final boolean suppressesSpellChecker =
                 curInputMethodInfo != null && curInputMethodInfo.suppressesSpellChecker();
         final SparseArray<IAccessibilityInputMethodSession> accessibilityInputMethodSessions =
@@ -2167,6 +2178,8 @@
             prepareClientSwitchLocked(cs);
         }
 
+        final boolean connectionWasActive = mCurInputConnection != null;
+
         // Bump up the sequence for this client and attach it.
         advanceSequenceNumberLocked();
         mCurClient = cs;
@@ -2185,6 +2198,12 @@
         }
         mCurEditorInfo = editorInfo;
 
+        // Notify input manager if the connection state changes.
+        final boolean connectionIsActive = mCurInputConnection != null;
+        if (connectionIsActive != connectionWasActive) {
+            mInputManagerInternal.notifyInputMethodConnectionActive(connectionIsActive);
+        }
+
         // If configured, we want to avoid starting up the IME if it is not supposed to be showing
         if (shouldPreventImeStartupLocked(selectedMethodId, startInputFlags,
                 unverifiedTargetSdkVersion)) {
@@ -2246,18 +2265,17 @@
             return currentMethodId;
         }
 
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
         final int oldDeviceId = mDeviceIdToShowIme;
         mDeviceIdToShowIme = mVdmInternal.getDeviceIdForDisplayId(mDisplayIdToShowIme);
         if (mDeviceIdToShowIme == DEVICE_ID_DEFAULT) {
             if (oldDeviceId == DEVICE_ID_DEFAULT) {
                 return currentMethodId;
             }
-            final String defaultDeviceMethodId = settings.getSelectedDefaultDeviceInputMethod();
+            final String defaultDeviceMethodId = mSettings.getSelectedDefaultDeviceInputMethod();
             if (DEBUG) {
                 Slog.v(TAG, "Restoring default device input method: " + defaultDeviceMethodId);
             }
-            settings.putSelectedDefaultDeviceInputMethod(null);
+            mSettings.putSelectedDefaultDeviceInputMethod(null);
             return defaultDeviceMethodId;
         }
 
@@ -2265,7 +2283,7 @@
                 mVirtualDeviceMethodMap.get(mDeviceIdToShowIme, currentMethodId);
         if (Objects.equals(deviceMethodId, currentMethodId)) {
             return currentMethodId;
-        } else if (!settings.getMethodMap().containsKey(deviceMethodId)) {
+        } else if (!mSettings.getMethodMap().containsKey(deviceMethodId)) {
             if (DEBUG) {
                 Slog.v(TAG, "Disabling IME on virtual device with id " + mDeviceIdToShowIme
                         + " because its custom input method is not available: " + deviceMethodId);
@@ -2277,7 +2295,7 @@
             if (DEBUG) {
                 Slog.v(TAG, "Storing default device input method " + currentMethodId);
             }
-            settings.putSelectedDefaultDeviceInputMethod(currentMethodId);
+            mSettings.putSelectedDefaultDeviceInputMethod(currentMethodId);
         }
         if (DEBUG) {
             Slog.v(TAG, "Switching current input method from " + currentMethodId
@@ -2307,8 +2325,7 @@
         if (isSoftInputModeStateVisibleAllowed(unverifiedTargetSdkVersion, startInputFlags)) {
             return false;
         }
-        final InputMethodInfo imi = InputMethodSettingsRepository.get(mCurrentUserId)
-                .getMethodMap().get(selectedMethodId);
+        final InputMethodInfo imi = mSettings.getMethodMap().get(selectedMethodId);
         if (imi == null) {
             return false;
         }
@@ -2652,7 +2669,7 @@
                 } else if (packageName != null) {
                     if (DEBUG) Slog.d(TAG, "show a small icon for the input method");
                     final PackageManager userAwarePackageManager =
-                            getPackageManagerForUser(mContext, mCurrentUserId);
+                            getPackageManagerForUser(mContext, mSettings.getUserId());
                     ApplicationInfo applicationInfo = null;
                     try {
                         applicationInfo = userAwarePackageManager.getApplicationInfo(packageName,
@@ -2714,7 +2731,7 @@
             return false;
         }
         if (mWindowManagerInternal.isKeyguardShowingAndNotOccluded()
-                && mWindowManagerInternal.isKeyguardSecure(mCurrentUserId)) {
+                && mWindowManagerInternal.isKeyguardSecure(mSettings.getUserId())) {
             return false;
         }
         if ((visibility & InputMethodService.IME_ACTIVE) == 0
@@ -2731,8 +2748,7 @@
             return false;
         }
 
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-        List<InputMethodInfo> imes = settings.getEnabledInputMethodListWithFilter(
+        List<InputMethodInfo> imes = mSettings.getEnabledInputMethodListWithFilter(
                 InputMethodInfo::shouldShowInInputMethodPicker);
         final int numImes = imes.size();
         if (numImes > 2) return true;
@@ -2744,7 +2760,7 @@
         for (int i = 0; i < numImes; ++i) {
             final InputMethodInfo imi = imes.get(i);
             final List<InputMethodSubtype> subtypes =
-                    settings.getEnabledInputMethodSubtypeList(imi, true);
+                    mSettings.getEnabledInputMethodSubtypeList(imi, true);
             final int subtypeCount = subtypes.size();
             if (subtypeCount == 0) {
                 ++nonAuxCount;
@@ -2896,12 +2912,11 @@
 
     @GuardedBy("ImfLock.class")
     void updateInputMethodsFromSettingsLocked(boolean enabledMayChange) {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
         if (enabledMayChange) {
             final PackageManager userAwarePackageManager = getPackageManagerForUser(mContext,
-                    settings.getUserId());
+                    mSettings.getUserId());
 
-            List<InputMethodInfo> enabled = settings.getEnabledInputMethodList();
+            List<InputMethodInfo> enabled = mSettings.getEnabledInputMethodList();
             for (int i = 0; i < enabled.size(); i++) {
                 // We allow the user to select "disabled until used" apps, so if they
                 // are enabling one of those here we now need to make it enabled.
@@ -2928,20 +2943,20 @@
 
         if (mDeviceIdToShowIme == DEVICE_ID_DEFAULT) {
             String ime = SecureSettingsWrapper.getString(
-                    Settings.Secure.DEFAULT_INPUT_METHOD, null, settings.getUserId());
+                    Settings.Secure.DEFAULT_INPUT_METHOD, null, mSettings.getUserId());
             String defaultDeviceIme = SecureSettingsWrapper.getString(
-                    Settings.Secure.DEFAULT_DEVICE_INPUT_METHOD, null, settings.getUserId());
+                    Settings.Secure.DEFAULT_DEVICE_INPUT_METHOD, null, mSettings.getUserId());
             if (defaultDeviceIme != null && !Objects.equals(ime, defaultDeviceIme)) {
                 if (DEBUG) {
                     Slog.v(TAG, "Current input method " + ime + " differs from the stored default"
-                            + " device input method for user " + settings.getUserId()
+                            + " device input method for user " + mSettings.getUserId()
                             + " - restoring " + defaultDeviceIme);
                 }
                 SecureSettingsWrapper.putString(
                         Settings.Secure.DEFAULT_INPUT_METHOD, defaultDeviceIme,
-                        settings.getUserId());
+                        mSettings.getUserId());
                 SecureSettingsWrapper.putString(
-                        Settings.Secure.DEFAULT_DEVICE_INPUT_METHOD, null, settings.getUserId());
+                        Settings.Secure.DEFAULT_DEVICE_INPUT_METHOD, null, mSettings.getUserId());
             }
         }
 
@@ -2949,14 +2964,14 @@
         // ENABLED_INPUT_METHODS is taking care of keeping them correctly in
         // sync, so we will never have a DEFAULT_INPUT_METHOD that is not
         // enabled.
-        String id = settings.getSelectedInputMethod();
+        String id = mSettings.getSelectedInputMethod();
         // There is no input method selected, try to choose new applicable input method.
         if (TextUtils.isEmpty(id) && chooseNewDefaultIMELocked()) {
-            id = settings.getSelectedInputMethod();
+            id = mSettings.getSelectedInputMethod();
         }
         if (!TextUtils.isEmpty(id)) {
             try {
-                setInputMethodLocked(id, settings.getSelectedInputMethodSubtypeId(id));
+                setInputMethodLocked(id, mSettings.getSelectedInputMethodSubtypeId(id));
             } catch (IllegalArgumentException e) {
                 Slog.w(TAG, "Unknown input method from prefs: " + id, e);
                 resetCurrentMethodAndClientLocked(UnbindReason.SWITCH_IME_FAILED);
@@ -2967,18 +2982,18 @@
         }
 
         // TODO: Instantiate mSwitchingController for each user.
-        if (settings.getUserId() == mSwitchingController.getUserId()) {
-            mSwitchingController.resetCircularListLocked(settings.getMethodMap());
+        if (mSettings.getUserId() == mSwitchingController.getUserId()) {
+            mSwitchingController.resetCircularListLocked(mSettings.getMethodMap());
         } else {
             mSwitchingController = InputMethodSubtypeSwitchingController.createInstanceLocked(
-                    mContext, settings.getMethodMap(), settings.getUserId());
+                    mContext, mSettings.getMethodMap(), mSettings.getUserId());
         }
         // TODO: Instantiate mHardwareKeyboardShortcutController for each user.
-        if (settings.getUserId() == mHardwareKeyboardShortcutController.getUserId()) {
-            mHardwareKeyboardShortcutController.reset(settings.getMethodMap());
+        if (mSettings.getUserId() == mHardwareKeyboardShortcutController.getUserId()) {
+            mHardwareKeyboardShortcutController.reset(mSettings.getMethodMap());
         } else {
             mHardwareKeyboardShortcutController = new HardwareKeyboardShortcutController(
-                    settings.getMethodMap(), settings.getUserId());
+                    mSettings.getMethodMap(), mSettings.getUserId());
         }
         sendOnNavButtonFlagsChangedLocked();
     }
@@ -3002,15 +3017,14 @@
 
     @GuardedBy("ImfLock.class")
     void setInputMethodLocked(String id, int subtypeId, int deviceId) {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-        InputMethodInfo info = settings.getMethodMap().get(id);
+        InputMethodInfo info = mSettings.getMethodMap().get(id);
         if (info == null) {
             throw getExceptionForUnknownImeId(id);
         }
 
         // See if we need to notify a subtype change within the same IME.
         if (id.equals(getSelectedMethodIdLocked())) {
-            final int userId = settings.getUserId();
+            final int userId = mSettings.getUserId();
             final int subtypeCount = info.getSubtypeCount();
             if (subtypeCount <= 0) {
                 notifyInputMethodSubtypeChangedLocked(userId, info, null);
@@ -3051,7 +3065,7 @@
             // method is a custom one specific to a virtual device. So only update the settings
             // entry used to restore the default device input method once we want to show the IME
             // back on the default device.
-            settings.putSelectedDefaultDeviceInputMethod(id);
+            mSettings.putSelectedDefaultDeviceInputMethod(id);
             return;
         }
         IInputMethodInvoker curMethod = getCurMethodLocked();
@@ -3562,7 +3576,7 @@
                             return InputBindResult.USER_SWITCHING;
                         }
                         final int[] profileIdsWithDisabled = mUserManagerInternal.getProfileIds(
-                                mCurrentUserId, false /* enabledOnly */);
+                                mSettings.getUserId(), false /* enabledOnly */);
                         for (int profileId : profileIdsWithDisabled) {
                             if (profileId == userId) {
                                 scheduleSwitchUserTaskLocked(userId, cs.mClient);
@@ -3608,10 +3622,10 @@
                     }
 
                     // Verify if caller is a background user.
-                    if (userId != mCurrentUserId) {
+                    final int currentUserId = mSettings.getUserId();
+                    if (userId != currentUserId) {
                         if (ArrayUtils.contains(
-                                mUserManagerInternal.getProfileIds(mCurrentUserId, false),
-                                userId)) {
+                                mUserManagerInternal.getProfileIds(currentUserId, false), userId)) {
                             // cross-profile access is always allowed here to allow
                             // profile-switching.
                             scheduleSwitchUserTaskLocked(userId, cs.mClient);
@@ -3800,7 +3814,7 @@
                 && mImeBindingState.mFocusedWindowClient.mClient.asBinder() == client.asBinder()) {
             return true;
         }
-        if (mCurrentUserId != UserHandle.getUserId(uid)) {
+        if (mSettings.getUserId() != UserHandle.getUserId(uid)) {
             return false;
         }
         if (getCurIntentLocked() != null && InputMethodUtils.checkIfPackageBelongsToUid(
@@ -3868,10 +3882,9 @@
             if (!calledWithValidTokenLocked(token)) {
                 return;
             }
-            final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-            final InputMethodInfo imi = settings.getMethodMap().get(id);
+            final InputMethodInfo imi = mSettings.getMethodMap().get(id);
             if (imi == null || !canCallerAccessInputMethod(
-                    imi.getPackageName(), callingUid, userId, settings)) {
+                    imi.getPackageName(), callingUid, userId, mSettings)) {
                 throw getExceptionForUnknownImeId(id);
             }
             setInputMethodWithSubtypeIdLocked(token, id, NOT_A_SUBTYPE_ID);
@@ -3887,10 +3900,9 @@
             if (!calledWithValidTokenLocked(token)) {
                 return;
             }
-            final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-            final InputMethodInfo imi = settings.getMethodMap().get(id);
+            final InputMethodInfo imi = mSettings.getMethodMap().get(id);
             if (imi == null || !canCallerAccessInputMethod(
-                    imi.getPackageName(), callingUid, userId, settings)) {
+                    imi.getPackageName(), callingUid, userId, mSettings)) {
                 throw getExceptionForUnknownImeId(id);
             }
             if (subtype != null) {
@@ -3908,11 +3920,10 @@
             if (!calledWithValidTokenLocked(token)) {
                 return false;
             }
-            final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-            final Pair<String, String> lastIme = settings.getLastInputMethodAndSubtype();
+            final Pair<String, String> lastIme = mSettings.getLastInputMethodAndSubtype();
             final InputMethodInfo lastImi;
             if (lastIme != null) {
-                lastImi = settings.getMethodMap().get(lastIme.first);
+                lastImi = mSettings.getMethodMap().get(lastIme.first);
             } else {
                 lastImi = null;
             }
@@ -3936,7 +3947,7 @@
                 // This is a safety net. If the currentSubtype can't be added to the history
                 // and the framework couldn't find the last ime, we will make the last ime be
                 // the most applicable enabled keyboard subtype of the system imes.
-                final List<InputMethodInfo> enabled = settings.getEnabledInputMethodList();
+                final List<InputMethodInfo> enabled = mSettings.getEnabledInputMethodList();
                 if (enabled != null) {
                     final int enabledCount = enabled.size();
                     final String locale;
@@ -3944,7 +3955,7 @@
                             && !TextUtils.isEmpty(mCurrentSubtype.getLocale())) {
                         locale = mCurrentSubtype.getLocale();
                     } else {
-                        locale = SystemLocaleWrapper.get(mCurrentUserId).get(0).toString();
+                        locale = SystemLocaleWrapper.get(mSettings.getUserId()).get(0).toString();
                     }
                     for (int i = 0; i < enabledCount; ++i) {
                         final InputMethodInfo imi = enabled.get(i);
@@ -3991,9 +4002,8 @@
 
     @GuardedBy("ImfLock.class")
     private boolean switchToNextInputMethodLocked(@Nullable IBinder token, boolean onlyCurrentIme) {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
         final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked(
-                onlyCurrentIme, settings.getMethodMap().get(getSelectedMethodIdLocked()),
+                onlyCurrentIme, mSettings.getMethodMap().get(getSelectedMethodIdLocked()),
                 mCurrentSubtype);
         if (nextSubtype == null) {
             return false;
@@ -4009,10 +4019,9 @@
             if (!calledWithValidTokenLocked(token)) {
                 return false;
             }
-            final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
             final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked(
                     false /* onlyCurrentIme */,
-                    settings.getMethodMap().get(getSelectedMethodIdLocked()), mCurrentSubtype);
+                    mSettings.getMethodMap().get(getSelectedMethodIdLocked()), mCurrentSubtype);
             return nextSubtype != null;
         }
     }
@@ -4024,7 +4033,12 @@
                     Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
         }
         synchronized (ImfLock.class) {
-            return InputMethodSettingsRepository.get(userId).getLastInputMethodSubtype();
+            if (mSettings.getUserId() == userId) {
+                return mSettings.getLastInputMethodSubtype();
+            }
+
+            final InputMethodSettings settings = queryMethodMapForUserLocked(userId);
+            return settings.getLastInputMethodSubtype();
         }
     }
 
@@ -4055,20 +4069,23 @@
             }
 
             final var additionalSubtypeMap = AdditionalSubtypeMapRepository.get(userId);
-            final boolean isCurrentUser = (mCurrentUserId == userId);
-            final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
+            final boolean isCurrentUser = (mSettings.getUserId() == userId);
+            final InputMethodSettings settings = isCurrentUser
+                    ? mSettings
+                    : queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap,
+                            DirectBootAwareness.AUTO);
             final var newAdditionalSubtypeMap = settings.getNewAdditionalSubtypeMap(
                     imiId, toBeAdded, additionalSubtypeMap, mPackageManagerInternal, callingUid);
             if (additionalSubtypeMap != newAdditionalSubtypeMap) {
                 AdditionalSubtypeMapRepository.putAndSave(userId, newAdditionalSubtypeMap,
                         settings.getMethodMap());
-                final InputMethodSettings newSettings = queryInputMethodServicesInternal(mContext,
-                        userId, AdditionalSubtypeMapRepository.get(userId),
-                        DirectBootAwareness.AUTO);
-                InputMethodSettingsRepository.put(userId, newSettings);
                 if (isCurrentUser) {
                     final long ident = Binder.clearCallingIdentity();
                     try {
+                        mSettings = queryInputMethodServicesInternal(mContext,
+                                mSettings.getUserId(),
+                                AdditionalSubtypeMapRepository.get(mSettings.getUserId()),
+                                DirectBootAwareness.AUTO);
                         postInputMethodSettingUpdatedLocked(false /* resetDefaultEnabledIme */);
                     } finally {
                         Binder.restoreCallingIdentity(ident);
@@ -4098,8 +4115,9 @@
         final long ident = Binder.clearCallingIdentity();
         try {
             synchronized (ImfLock.class) {
-                final boolean currentUser = (mCurrentUserId == userId);
-                final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
+                final boolean currentUser = (mSettings.getUserId() == userId);
+                final InputMethodSettings settings = currentUser
+                        ? mSettings : queryMethodMapForUserLocked(userId);
                 if (!settings.setEnabledInputMethodSubtypes(imeId, subtypeHashCodes)) {
                     return;
                 }
@@ -4209,6 +4227,7 @@
         }, mHandler);
     }
 
+    @GuardedBy("ImfLock.class")
     private void addStylusDeviceIdLocked(int deviceId) {
         if (mStylusIds == null) {
             mStylusIds = new IntArray();
@@ -4449,11 +4468,11 @@
                 }
                 return;
             }
-            if (mCurrentUserId != mSwitchingController.getUserId()) {
+            if (mSettings.getUserId() != mSwitchingController.getUserId()) {
                 return;
             }
-            final InputMethodInfo imi = InputMethodSettingsRepository.get(mCurrentUserId)
-                    .getMethodMap().get(getSelectedMethodIdLocked());
+            final InputMethodInfo imi =
+                    mSettings.getMethodMap().get(getSelectedMethodIdLocked());
             if (imi != null) {
                 mSwitchingController.onUserActionLocked(imi, mCurrentSubtype);
             }
@@ -4513,9 +4532,8 @@
             return;
         } else {
             // Called with current IME's token.
-            final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-            if (settings.getMethodMap().get(id) != null
-                    && settings.getEnabledInputMethodListWithFilter(
+            if (mSettings.getMethodMap().get(id) != null
+                    && mSettings.getEnabledInputMethodListWithFilter(
                             (info) -> info.getId().equals(id)).isEmpty()) {
                 throw new IllegalStateException("Requested IME is not enabled: " + id);
             }
@@ -4694,23 +4712,21 @@
                         return false;
                 }
                 synchronized (ImfLock.class) {
-                    final InputMethodSettings settings =
-                            InputMethodSettingsRepository.get(mCurrentUserId);
                     final boolean isScreenLocked = mWindowManagerInternal.isKeyguardLocked()
-                            && mWindowManagerInternal.isKeyguardSecure(settings.getUserId());
-                    final String lastInputMethodId = settings.getSelectedInputMethod();
+                            && mWindowManagerInternal.isKeyguardSecure(mSettings.getUserId());
+                    final String lastInputMethodId = mSettings.getSelectedInputMethod();
                     int lastInputMethodSubtypeId =
-                            settings.getSelectedInputMethodSubtypeId(lastInputMethodId);
+                            mSettings.getSelectedInputMethodSubtypeId(lastInputMethodId);
 
                     final List<ImeSubtypeListItem> imList = InputMethodSubtypeSwitchingController
                             .getSortedInputMethodAndSubtypeList(
                                     showAuxSubtypes, isScreenLocked, true /* forImeMenu */,
-                                    mContext, settings.getMethodMap(), settings.getUserId());
+                                    mContext, mSettings.getMethodMap(), mSettings.getUserId());
                     if (imList.isEmpty()) {
                         Slog.w(TAG, "Show switching menu failed, imList is empty,"
                                 + " showAuxSubtypes: " + showAuxSubtypes
                                 + " isScreenLocked: " + isScreenLocked
-                                + " userId: " + settings.getUserId());
+                                + " userId: " + mSettings.getUserId());
                         return false;
                     }
 
@@ -4896,9 +4912,8 @@
 
     @GuardedBy("ImfLock.class")
     private boolean chooseNewDefaultIMELocked() {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
         final InputMethodInfo imi = InputMethodInfoUtils.getMostApplicableDefaultIME(
-                settings.getEnabledInputMethodList());
+                mSettings.getEnabledInputMethodList());
         if (imi != null) {
             if (DEBUG) {
                 Slog.d(TAG, "New default IME was selected: " + imi.getId());
@@ -5012,8 +5027,6 @@
         mMethodMapUpdateCount++;
         mMyPackageMonitor.clearKnownImePackageNamesLocked();
 
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-
         // Construct the set of possible IME packages for onPackageChanged() to avoid false
         // negatives when the package state remains to be the same but only the component state is
         // changed.
@@ -5024,7 +5037,7 @@
             final List<ResolveInfo> allInputMethodServices =
                     mContext.getPackageManager().queryIntentServicesAsUser(
                             new Intent(InputMethod.SERVICE_INTERFACE),
-                            PackageManager.MATCH_DISABLED_COMPONENTS, settings.getUserId());
+                            PackageManager.MATCH_DISABLED_COMPONENTS, mSettings.getUserId());
             final int numImes = allInputMethodServices.size();
             for (int i = 0; i < numImes; ++i) {
                 final ServiceInfo si = allInputMethodServices.get(i).serviceInfo;
@@ -5039,11 +5052,11 @@
         if (!resetDefaultEnabledIme) {
             boolean enabledImeFound = false;
             boolean enabledNonAuxImeFound = false;
-            final List<InputMethodInfo> enabledImes = settings.getEnabledInputMethodList();
+            final List<InputMethodInfo> enabledImes = mSettings.getEnabledInputMethodList();
             final int numImes = enabledImes.size();
             for (int i = 0; i < numImes; ++i) {
                 final InputMethodInfo imi = enabledImes.get(i);
-                if (settings.getMethodMap().containsKey(imi.getId())) {
+                if (mSettings.getMethodMap().containsKey(imi.getId())) {
                     enabledImeFound = true;
                     if (!imi.isAuxiliaryIme()) {
                         enabledNonAuxImeFound = true;
@@ -5067,7 +5080,7 @@
 
         if (resetDefaultEnabledIme || reenableMinimumNonAuxSystemImes) {
             final ArrayList<InputMethodInfo> defaultEnabledIme =
-                    InputMethodInfoUtils.getDefaultEnabledImes(mContext, settings.getMethodList(),
+                    InputMethodInfoUtils.getDefaultEnabledImes(mContext, mSettings.getMethodList(),
                             reenableMinimumNonAuxSystemImes);
             final int numImes = defaultEnabledIme.size();
             for (int i = 0; i < numImes; ++i) {
@@ -5079,9 +5092,9 @@
             }
         }
 
-        final String defaultImiId = settings.getSelectedInputMethod();
+        final String defaultImiId = mSettings.getSelectedInputMethod();
         if (!TextUtils.isEmpty(defaultImiId)) {
-            if (!settings.getMethodMap().containsKey(defaultImiId)) {
+            if (!mSettings.getMethodMap().containsKey(defaultImiId)) {
                 Slog.w(TAG, "Default IME is uninstalled. Choose new default IME.");
                 if (chooseNewDefaultIMELocked()) {
                     updateInputMethodsFromSettingsLocked(true);
@@ -5095,26 +5108,26 @@
         updateDefaultVoiceImeIfNeededLocked();
 
         // TODO: Instantiate mSwitchingController for each user.
-        if (settings.getUserId() == mSwitchingController.getUserId()) {
-            mSwitchingController.resetCircularListLocked(settings.getMethodMap());
+        if (mSettings.getUserId() == mSwitchingController.getUserId()) {
+            mSwitchingController.resetCircularListLocked(mSettings.getMethodMap());
         } else {
             mSwitchingController = InputMethodSubtypeSwitchingController.createInstanceLocked(
-                    mContext, settings.getMethodMap(), mCurrentUserId);
+                    mContext, mSettings.getMethodMap(), mSettings.getUserId());
         }
         // TODO: Instantiate mHardwareKeyboardShortcutController for each user.
-        if (settings.getUserId() == mHardwareKeyboardShortcutController.getUserId()) {
-            mHardwareKeyboardShortcutController.reset(settings.getMethodMap());
+        if (mSettings.getUserId() == mHardwareKeyboardShortcutController.getUserId()) {
+            mHardwareKeyboardShortcutController.reset(mSettings.getMethodMap());
         } else {
             mHardwareKeyboardShortcutController = new HardwareKeyboardShortcutController(
-                    settings.getMethodMap(), settings.getUserId());
+                    mSettings.getMethodMap(), mSettings.getUserId());
         }
 
         sendOnNavButtonFlagsChangedLocked();
 
         // Notify InputMethodListListeners of the new installed InputMethods.
-        final List<InputMethodInfo> inputMethodList = settings.getMethodList();
+        final List<InputMethodInfo> inputMethodList = mSettings.getMethodList();
         mHandler.obtainMessage(MSG_DISPATCH_ON_INPUT_METHOD_LIST_UPDATED,
-                settings.getUserId(), 0 /* unused */, inputMethodList).sendToTarget();
+                mSettings.getUserId(), 0 /* unused */, inputMethodList).sendToTarget();
     }
 
     @GuardedBy("ImfLock.class")
@@ -5129,12 +5142,11 @@
 
     @GuardedBy("ImfLock.class")
     private void updateDefaultVoiceImeIfNeededLocked() {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
         final String systemSpeechRecognizer =
                 mContext.getString(com.android.internal.R.string.config_systemSpeechRecognizer);
-        final String currentDefaultVoiceImeId = settings.getDefaultVoiceInputMethod();
+        final String currentDefaultVoiceImeId = mSettings.getDefaultVoiceInputMethod();
         final InputMethodInfo newSystemVoiceIme = InputMethodInfoUtils.chooseSystemVoiceIme(
-                settings.getMethodMap(), systemSpeechRecognizer, currentDefaultVoiceImeId);
+                mSettings.getMethodMap(), systemSpeechRecognizer, currentDefaultVoiceImeId);
         if (newSystemVoiceIme == null) {
             if (DEBUG) {
                 Slog.i(TAG, "Found no valid default Voice IME. If the user is still locked,"
@@ -5143,7 +5155,7 @@
             // Clear DEFAULT_VOICE_INPUT_METHOD when necessary.  Note that InputMethodSettings
             // does not update the actual Secure Settings until the user is unlocked.
             if (!TextUtils.isEmpty(currentDefaultVoiceImeId)) {
-                settings.putDefaultVoiceInputMethod("");
+                mSettings.putDefaultVoiceInputMethod("");
                 // We don't support disabling the voice ime when a package is removed from the
                 // config.
             }
@@ -5156,7 +5168,7 @@
             Slog.i(TAG, "Enabling the default Voice IME:" + newSystemVoiceIme);
         }
         setInputMethodEnabledLocked(newSystemVoiceIme.getId(), true);
-        settings.putDefaultVoiceInputMethod(newSystemVoiceIme.getId());
+        mSettings.putDefaultVoiceInputMethod(newSystemVoiceIme.getId());
     }
 
     // ----------------------------------------------------------------------
@@ -5171,9 +5183,8 @@
      */
     @GuardedBy("ImfLock.class")
     private boolean setInputMethodEnabledLocked(String id, boolean enabled) {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
         if (enabled) {
-            final String enabledImeIdsStr = settings.getEnabledInputMethodsStr();
+            final String enabledImeIdsStr = mSettings.getEnabledInputMethodsStr();
             final String newEnabledImeIdsStr = InputMethodUtils.concatEnabledImeIds(
                     enabledImeIdsStr, id);
             if (TextUtils.equals(enabledImeIdsStr, newEnabledImeIdsStr)) {
@@ -5181,29 +5192,29 @@
                 // Nothing to do. The previous state was enabled.
                 return true;
             }
-            settings.putEnabledInputMethodsStr(newEnabledImeIdsStr);
+            mSettings.putEnabledInputMethodsStr(newEnabledImeIdsStr);
             // Previous state was disabled.
             return false;
         } else {
-            final List<Pair<String, ArrayList<String>>> enabledInputMethodsList = settings
+            final List<Pair<String, ArrayList<String>>> enabledInputMethodsList = mSettings
                     .getEnabledInputMethodsAndSubtypeList();
             StringBuilder builder = new StringBuilder();
-            if (settings.buildAndPutEnabledInputMethodsStrRemovingId(
+            if (mSettings.buildAndPutEnabledInputMethodsStrRemovingId(
                     builder, enabledInputMethodsList, id)) {
                 if (mDeviceIdToShowIme == DEVICE_ID_DEFAULT) {
                     // Disabled input method is currently selected, switch to another one.
-                    final String selId = settings.getSelectedInputMethod();
+                    final String selId = mSettings.getSelectedInputMethod();
                     if (id.equals(selId) && !chooseNewDefaultIMELocked()) {
                         Slog.i(TAG, "Can't find new IME, unsetting the current input method.");
                         resetSelectedInputMethodAndSubtypeLocked("");
                     }
-                } else if (id.equals(settings.getSelectedDefaultDeviceInputMethod())) {
+                } else if (id.equals(mSettings.getSelectedDefaultDeviceInputMethod())) {
                     // Disabled default device IME while using a virtual device one, choose a
                     // new default one but only update the settings.
                     InputMethodInfo newDefaultIme =
                             InputMethodInfoUtils.getMostApplicableDefaultIME(
-                                    settings.getEnabledInputMethodList());
-                    settings.putSelectedDefaultDeviceInputMethod(
+                                        mSettings.getEnabledInputMethodList());
+                    mSettings.putSelectedDefaultDeviceInputMethod(
                             newDefaultIme == null ? null : newDefaultIme.getId());
                 }
                 // Previous state was enabled.
@@ -5219,30 +5230,29 @@
     @GuardedBy("ImfLock.class")
     private void setSelectedInputMethodAndSubtypeLocked(InputMethodInfo imi, int subtypeId,
             boolean setSubtypeOnly) {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-        settings.saveCurrentInputMethodAndSubtypeToHistory(getSelectedMethodIdLocked(),
+        mSettings.saveCurrentInputMethodAndSubtypeToHistory(getSelectedMethodIdLocked(),
                 mCurrentSubtype);
 
         // Set Subtype here
         if (imi == null || subtypeId < 0) {
-            settings.putSelectedSubtype(NOT_A_SUBTYPE_ID);
+            mSettings.putSelectedSubtype(NOT_A_SUBTYPE_ID);
             mCurrentSubtype = null;
         } else {
             if (subtypeId < imi.getSubtypeCount()) {
                 InputMethodSubtype subtype = imi.getSubtypeAt(subtypeId);
-                settings.putSelectedSubtype(subtype.hashCode());
+                mSettings.putSelectedSubtype(subtype.hashCode());
                 mCurrentSubtype = subtype;
             } else {
-                settings.putSelectedSubtype(NOT_A_SUBTYPE_ID);
+                mSettings.putSelectedSubtype(NOT_A_SUBTYPE_ID);
                 // If the subtype is not specified, choose the most applicable one
                 mCurrentSubtype = getCurrentInputMethodSubtypeLocked();
             }
         }
-        notifyInputMethodSubtypeChangedLocked(settings.getUserId(), imi, mCurrentSubtype);
+        notifyInputMethodSubtypeChangedLocked(mSettings.getUserId(), imi, mCurrentSubtype);
 
         if (!setSubtypeOnly) {
             // Set InputMethod here
-            settings.putSelectedInputMethod(imi != null ? imi.getId() : "");
+            mSettings.putSelectedInputMethod(imi != null ? imi.getId() : "");
         }
     }
 
@@ -5250,15 +5260,13 @@
     private void resetSelectedInputMethodAndSubtypeLocked(String newDefaultIme) {
         mDeviceIdToShowIme = DEVICE_ID_DEFAULT;
         mDisplayIdToShowIme = INVALID_DISPLAY;
+        mSettings.putSelectedDefaultDeviceInputMethod(null);
 
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-        settings.putSelectedDefaultDeviceInputMethod(null);
-
-        InputMethodInfo imi = settings.getMethodMap().get(newDefaultIme);
+        InputMethodInfo imi = mSettings.getMethodMap().get(newDefaultIme);
         int lastSubtypeId = NOT_A_SUBTYPE_ID;
         // newDefaultIme is empty when there is no candidate for the selected IME.
         if (imi != null && !TextUtils.isEmpty(newDefaultIme)) {
-            String subtypeHashCode = settings.getLastSubtypeForInputMethod(newDefaultIme);
+            String subtypeHashCode = mSettings.getLastSubtypeForInputMethod(newDefaultIme);
             if (subtypeHashCode != null) {
                 try {
                     lastSubtypeId = SubtypeUtils.getSubtypeIdFromHashCode(imi,
@@ -5285,12 +5293,12 @@
                     Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
         }
         synchronized (ImfLock.class) {
-            if (mCurrentUserId == userId) {
+            if (mSettings.getUserId() == userId) {
                 return getCurrentInputMethodSubtypeLocked();
             }
 
-            return InputMethodSettingsRepository.get(userId)
-                    .getCurrentInputMethodSubtypeForNonCurrentUsers();
+            final InputMethodSettings settings = queryMethodMapForUserLocked(userId);
+            return settings.getCurrentInputMethodSubtypeForNonCurrentUsers();
         }
     }
 
@@ -5310,27 +5318,26 @@
         if (selectedMethodId == null) {
             return null;
         }
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-        final boolean subtypeIsSelected = settings.isSubtypeSelected();
-        final InputMethodInfo imi = settings.getMethodMap().get(selectedMethodId);
+        final boolean subtypeIsSelected = mSettings.isSubtypeSelected();
+        final InputMethodInfo imi = mSettings.getMethodMap().get(selectedMethodId);
         if (imi == null || imi.getSubtypeCount() == 0) {
             return null;
         }
         if (!subtypeIsSelected || mCurrentSubtype == null
                 || !SubtypeUtils.isValidSubtypeId(imi, mCurrentSubtype.hashCode())) {
-            int subtypeId = settings.getSelectedInputMethodSubtypeId(selectedMethodId);
+            int subtypeId = mSettings.getSelectedInputMethodSubtypeId(selectedMethodId);
             if (subtypeId == NOT_A_SUBTYPE_ID) {
                 // If there are no selected subtypes, the framework will try to find
                 // the most applicable subtype from explicitly or implicitly enabled
                 // subtypes.
                 List<InputMethodSubtype> explicitlyOrImplicitlyEnabledSubtypes =
-                        settings.getEnabledInputMethodSubtypeList(imi, true);
+                        mSettings.getEnabledInputMethodSubtypeList(imi, true);
                 // If there is only one explicitly or implicitly enabled subtype,
                 // just returns it.
                 if (explicitlyOrImplicitlyEnabledSubtypes.size() == 1) {
                     mCurrentSubtype = explicitlyOrImplicitlyEnabledSubtypes.get(0);
                 } else if (explicitlyOrImplicitlyEnabledSubtypes.size() > 1) {
-                    final String locale = SystemLocaleWrapper.get(settings.getUserId())
+                    final String locale = SystemLocaleWrapper.get(mSettings.getUserId())
                             .get(0).toString();
                     mCurrentSubtype = SubtypeUtils.findLastResortApplicableSubtype(
                             explicitlyOrImplicitlyEnabledSubtypes,
@@ -5353,22 +5360,38 @@
      */
     @GuardedBy("ImfLock.class")
     private InputMethodInfo queryDefaultInputMethodForUserIdLocked(@UserIdInt int userId) {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
+        final InputMethodSettings settings;
+        if (userId == mSettings.getUserId()) {
+            settings = mSettings;
+        } else {
+            final AdditionalSubtypeMap additionalSubtypeMap =
+                    AdditionalSubtypeMapRepository.get(userId);
+            settings = queryInputMethodServicesInternal(mContext, userId,
+                    additionalSubtypeMap, DirectBootAwareness.AUTO);
+        }
         return settings.getMethodMap().get(settings.getSelectedInputMethod());
     }
 
     @GuardedBy("ImfLock.class")
+    private InputMethodSettings queryMethodMapForUserLocked(@UserIdInt int userId) {
+        final AdditionalSubtypeMap additionalSubtypeMap =
+                AdditionalSubtypeMapRepository.get(userId);
+        return queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap,
+                DirectBootAwareness.AUTO);
+    }
+
+    @GuardedBy("ImfLock.class")
     private boolean switchToInputMethodLocked(String imeId, @UserIdInt int userId) {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
-        if (userId == mCurrentUserId) {
-            if (!settings.getMethodMap().containsKey(imeId)
-                    || !settings.getEnabledInputMethodList()
-                    .contains(settings.getMethodMap().get(imeId))) {
+        if (userId == mSettings.getUserId()) {
+            if (!mSettings.getMethodMap().containsKey(imeId)
+                    || !mSettings.getEnabledInputMethodList()
+                    .contains(mSettings.getMethodMap().get(imeId))) {
                 return false; // IME is not found or not enabled.
             }
             setInputMethodLocked(imeId, NOT_A_SUBTYPE_ID);
             return true;
         }
+        final InputMethodSettings settings = queryMethodMapForUserLocked(userId);
         if (!settings.getMethodMap().containsKey(imeId)
                 || !settings.getEnabledInputMethodList().contains(
                         settings.getMethodMap().get(imeId))) {
@@ -5409,9 +5432,8 @@
 
     @GuardedBy("ImfLock.class")
     private void switchKeyboardLayoutLocked(int direction) {
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
-
-        final InputMethodInfo currentImi = settings.getMethodMap().get(getSelectedMethodIdLocked());
+        final InputMethodInfo currentImi = mSettings.getMethodMap().get(
+                getSelectedMethodIdLocked());
         if (currentImi == null) {
             return;
         }
@@ -5423,7 +5445,7 @@
         if (nextSubtypeHandle == null) {
             return;
         }
-        final InputMethodInfo nextImi = settings.getMethodMap().get(nextSubtypeHandle.getImeId());
+        final InputMethodInfo nextImi = mSettings.getMethodMap().get(nextSubtypeHandle.getImeId());
         if (nextImi == null) {
             return;
         }
@@ -5502,14 +5524,17 @@
         @Override
         public boolean setInputMethodEnabled(String imeId, boolean enabled, @UserIdInt int userId) {
             synchronized (ImfLock.class) {
-                final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
-                if (!settings.getMethodMap().containsKey(imeId)) {
-                    return false; // IME is not found.
-                }
-                if (userId == mCurrentUserId) {
+                if (userId == mSettings.getUserId()) {
+                    if (!mSettings.getMethodMap().containsKey(imeId)) {
+                        return false; // IME is not found.
+                    }
                     setInputMethodEnabledLocked(imeId, enabled);
                     return true;
                 }
+                final InputMethodSettings settings = queryMethodMapForUserLocked(userId);
+                if (!settings.getMethodMap().containsKey(imeId)) {
+                    return false; // IME is not found.
+                }
                 if (enabled) {
                     final String enabledImeIdsStr = settings.getEnabledInputMethodsStr();
                     final String newEnabledImeIdsStr = InputMethodUtils.concatEnabledImeIds(
@@ -5677,14 +5702,6 @@
                 switchKeyboardLayoutLocked(direction);
             }
         }
-
-        /**
-         * Returns true if any InputConnection is currently active.
-         */
-        @Override
-        public boolean isAnyInputConnectionActive() {
-            return mCurInputConnection != null;
-        }
     }
 
     @BinderThread
@@ -5844,9 +5861,8 @@
         final Printer p = new PrintWriterPrinter(pw);
 
         synchronized (ImfLock.class) {
-            final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId);
             p.println("Current Input Method Manager state:");
-            final List<InputMethodInfo> methodList = settings.getMethodList();
+            final List<InputMethodInfo> methodList = mSettings.getMethodList();
             int numImes = methodList.size();
             p.println("  Input Methods: mMethodMapUpdateCount=" + mMethodMapUpdateCount);
             for (int i = 0; i < numImes; i++) {
@@ -5870,7 +5886,6 @@
                 p.println("    curSession=" + c.mCurSession);
             };
             mClientController.forAllClients(clientControllerDump);
-            p.println("  mCurrentUserId=" + mCurrentUserId);
             p.println("  mCurMethodId=" + getSelectedMethodIdLocked());
             client = mCurClient;
             p.println("  mCurClient=" + client + " mCurSeq=" + getSequenceNumberLocked());
@@ -5896,6 +5911,8 @@
                     ? Arrays.toString(mStylusIds.toArray()) : ""));
             p.println("  mSwitchingController:");
             mSwitchingController.dump(p);
+            p.println("  mSettings:");
+            mSettings.dump(p, "    ");
 
             p.println("  mStartInputHistory:");
             mStartInputHistory.dump(pw, "    ");
@@ -6150,7 +6167,7 @@
         }
         synchronized (ImfLock.class) {
             final int[] userIds = InputMethodUtils.resolveUserId(userIdToBeResolved,
-                    mCurrentUserId, shellCommand.getErrPrintWriter());
+                    mSettings.getUserId(), shellCommand.getErrPrintWriter());
             try (PrintWriter pr = shellCommand.getOutPrintWriter()) {
                 for (int userId : userIds) {
                     final List<InputMethodInfo> methods = all
@@ -6195,7 +6212,7 @@
              PrintWriter error = shellCommand.getErrPrintWriter()) {
             synchronized (ImfLock.class) {
                 final int[] userIds = InputMethodUtils.resolveUserId(userIdToBeResolved,
-                        mCurrentUserId, shellCommand.getErrPrintWriter());
+                        mSettings.getUserId(), shellCommand.getErrPrintWriter());
                 for (int userId : userIds) {
                     if (!userHasDebugPriv(userId, shellCommand)) {
                         continue;
@@ -6254,14 +6271,14 @@
             PrintWriter error) {
         boolean failedToEnableUnknownIme = false;
         boolean previouslyEnabled = false;
-        final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
-        if (userId == mCurrentUserId) {
-            if (enabled && !settings.getMethodMap().containsKey(imeId)) {
+        if (userId == mSettings.getUserId()) {
+            if (enabled && !mSettings.getMethodMap().containsKey(imeId)) {
                 failedToEnableUnknownIme = true;
             } else {
                 previouslyEnabled = setInputMethodEnabledLocked(imeId, enabled);
             }
         } else {
+            final InputMethodSettings settings = queryMethodMapForUserLocked(userId);
             if (enabled) {
                 if (!settings.getMethodMap().containsKey(imeId)) {
                     failedToEnableUnknownIme = true;
@@ -6316,7 +6333,7 @@
              PrintWriter error = shellCommand.getErrPrintWriter()) {
             synchronized (ImfLock.class) {
                 final int[] userIds = InputMethodUtils.resolveUserId(userIdToBeResolved,
-                        mCurrentUserId, shellCommand.getErrPrintWriter());
+                        mSettings.getUserId(), shellCommand.getErrPrintWriter());
                 for (int userId : userIds) {
                     if (!userHasDebugPriv(userId, shellCommand)) {
                         continue;
@@ -6356,7 +6373,7 @@
         synchronized (ImfLock.class) {
             try (PrintWriter out = shellCommand.getOutPrintWriter()) {
                 final int[] userIds = InputMethodUtils.resolveUserId(userIdToBeResolved,
-                        mCurrentUserId, shellCommand.getErrPrintWriter());
+                        mSettings.getUserId(), shellCommand.getErrPrintWriter());
                 for (int userId : userIds) {
                     if (!userHasDebugPriv(userId, shellCommand)) {
                         continue;
@@ -6368,16 +6385,15 @@
                     }
                     final String nextIme;
                     final List<InputMethodInfo> nextEnabledImes;
-                    final InputMethodSettings settings = InputMethodSettingsRepository.get(userId);
-                    if (userId == mCurrentUserId) {
+                    if (userId == mSettings.getUserId()) {
                         hideCurrentInputLocked(mImeBindingState.mFocusedWindow, 0 /* flags */,
                                 SoftInputShowHideReason.HIDE_RESET_SHELL_COMMAND);
                         mBindingController.unbindCurrentMethod();
 
                         // Enable default IMEs, disable others
-                        var toDisable = settings.getEnabledInputMethodList();
+                        var toDisable = mSettings.getEnabledInputMethodList();
                         var defaultEnabled = InputMethodInfoUtils.getDefaultEnabledImes(
-                                mContext, settings.getMethodList());
+                                mContext, mSettings.getMethodList());
                         toDisable.removeAll(defaultEnabled);
                         for (InputMethodInfo info : toDisable) {
                             setInputMethodEnabledLocked(info.getId(), false);
@@ -6391,11 +6407,16 @@
                         }
                         updateInputMethodsFromSettingsLocked(true /* enabledMayChange */);
                         InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(
-                                getPackageManagerForUser(mContext, settings.getUserId()),
-                                settings.getEnabledInputMethodList());
-                        nextIme = settings.getSelectedInputMethod();
-                        nextEnabledImes = settings.getEnabledInputMethodList();
+                                getPackageManagerForUser(mContext, mSettings.getUserId()),
+                                mSettings.getEnabledInputMethodList());
+                        nextIme = mSettings.getSelectedInputMethod();
+                        nextEnabledImes = mSettings.getEnabledInputMethodList();
                     } else {
+                        final AdditionalSubtypeMap additionalSubtypeMap =
+                                AdditionalSubtypeMapRepository.get(userId);
+                        final InputMethodSettings settings = queryInputMethodServicesInternal(
+                                mContext, userId, additionalSubtypeMap, DirectBootAwareness.AUTO);
+
                         nextEnabledImes = InputMethodInfoUtils.getDefaultEnabledImes(mContext,
                                 settings.getMethodList());
                         nextIme = InputMethodInfoUtils.getMostApplicableDefaultIME(
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodSettingsRepository.java b/services/core/java/com/android/server/inputmethod/InputMethodSettingsRepository.java
deleted file mode 100644
index 60b9a4c..0000000
--- a/services/core/java/com/android/server/inputmethod/InputMethodSettingsRepository.java
+++ /dev/null
@@ -1,86 +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.server.inputmethod;
-
-import android.annotation.NonNull;
-import android.annotation.UserIdInt;
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.os.Handler;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.inputmethod.DirectBootAwareness;
-import com.android.server.LocalServices;
-import com.android.server.pm.UserManagerInternal;
-
-final class InputMethodSettingsRepository {
-    @GuardedBy("ImfLock.class")
-    @NonNull
-    private static final SparseArray<InputMethodSettings> sPerUserMap = new SparseArray<>();
-
-    /**
-     * Not intended to be instantiated.
-     */
-    private InputMethodSettingsRepository() {
-    }
-
-    @NonNull
-    @GuardedBy("ImfLock.class")
-    static InputMethodSettings get(@UserIdInt int userId) {
-        final InputMethodSettings obj = sPerUserMap.get(userId);
-        if (obj != null) {
-            return obj;
-        }
-        return InputMethodSettings.createEmptyMap(userId);
-    }
-
-    @GuardedBy("ImfLock.class")
-    static void put(@UserIdInt int userId, @NonNull InputMethodSettings obj) {
-        sPerUserMap.put(userId, obj);
-    }
-
-    static void initialize(@NonNull Handler handler, @NonNull Context context) {
-        final UserManagerInternal userManagerInternal =
-                LocalServices.getService(UserManagerInternal.class);
-        handler.post(() -> {
-            userManagerInternal.addUserLifecycleListener(
-                    new UserManagerInternal.UserLifecycleListener() {
-                        @Override
-                        public void onUserRemoved(UserInfo user) {
-                            final int userId = user.id;
-                            handler.post(() -> {
-                                synchronized (ImfLock.class) {
-                                    sPerUserMap.remove(userId);
-                                }
-                            });
-                        }
-                    });
-            synchronized (ImfLock.class) {
-                for (int userId : userManagerInternal.getUserIds()) {
-                    final InputMethodSettings settings =
-                            InputMethodManagerService.queryInputMethodServicesInternal(
-                                    context,
-                                    userId,
-                                    AdditionalSubtypeMapRepository.get(userId),
-                                    DirectBootAwareness.AUTO);
-                    sPerUserMap.put(userId, settings);
-                }
-            }
-        });
-    }
-}
diff --git a/services/core/java/com/android/server/inputmethod/LocaleUtils.java b/services/core/java/com/android/server/inputmethod/LocaleUtils.java
index 0b16af2..dbcd21a 100644
--- a/services/core/java/com/android/server/inputmethod/LocaleUtils.java
+++ b/services/core/java/com/android/server/inputmethod/LocaleUtils.java
@@ -46,29 +46,44 @@
      * @param desired The locale preferred by user.
      * @return A score based on the locale matching for the default subtype enabling.
      */
-    @IntRange(from = 1, to = 3)
+    @IntRange(from = 1, to = 4)
     private static byte calculateMatchingSubScore(@NonNull final ULocale supported,
             @NonNull final ULocale desired) {
         // Assuming supported/desired is fully expanded.
         if (supported.equals(desired)) {
-            return 3;  // Exact match.
+            return 4;  // Exact match.
         }
 
+        // addLikelySubtags is a maximization process as per
+        // https://www.unicode.org/reports/tr35/#Likely_Subtags
+        ULocale maxDesired = ULocale.addLikelySubtags(desired);
+
         // Skip language matching since it was already done in calculateMatchingScore.
 
         final String supportedScript = supported.getScript();
-        if (supportedScript.isEmpty() || !supportedScript.equals(desired.getScript())) {
+        if (supportedScript.isEmpty() || !supportedScript.equals(maxDesired.getScript())) {
             // TODO: Need subscript matching. For example, Hanb should match with Bopo.
             return 1;
         }
 
         final String supportedCountry = supported.getCountry();
-        if (supportedCountry.isEmpty() || !supportedCountry.equals(desired.getCountry())) {
+        if (supportedCountry.isEmpty() || !supportedCountry.equals(maxDesired.getCountry())) {
             return 2;
         }
 
         // Ignore others e.g. variants, extensions.
-        return 3;
+
+        // Since addLikelySubtags can canonicalize subtags, e.g. the deprecated country codes
+        // an locale with an identical script and country before addLikelySubtags is in favour,
+        // and a score of 4 is returned.
+        String desiredScript = desired.getScript();
+        String desiredCountry = desired.getCountry();
+        if ((desiredScript.isEmpty() || desiredScript.equals(maxDesired.getScript()))
+                && (desiredCountry.isEmpty() || desiredCountry.equals(maxDesired.getCountry()))) {
+            return 4;
+        } else {
+            return 3;
+        }
     }
 
     private static final class ScoreEntry implements Comparable<ScoreEntry> {
@@ -180,8 +195,7 @@
                             ULocale.forLocale(preferredLocale));
                 }
                 score[j] = calculateMatchingSubScore(
-                        preferredULocaleCache[j],
-                        ULocale.addLikelySubtags(ULocale.forLocale(locale)));
+                        preferredULocaleCache[j], ULocale.forLocale(locale));
                 if (canSkip && score[j] != 0) {
                     canSkip = false;
                 }
diff --git a/services/core/java/com/android/server/inputmethod/Sequence.java b/services/core/java/com/android/server/inputmethod/Sequence.java
deleted file mode 100644
index 05e31ce..0000000
--- a/services/core/java/com/android/server/inputmethod/Sequence.java
+++ /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.server.inputmethod;
-
-import com.android.internal.annotations.GuardedBy;
-
-/**
- * A sequence number utility class that only generate positive numbers.
- */
-final class Sequence {
-
-    private final Object mLock = new Object();
-
-    private int mSequence;
-
-    int getSequenceNumber() {
-        synchronized (mLock) {
-            return mSequence;
-        }
-    }
-
-    @GuardedBy("ImfLock.class")
-    void advanceSequenceNumber() {
-        synchronized (mLock) {
-            mSequence++;
-            if (mSequence <= 0) {
-                mSequence = 1;
-            }
-        }
-    }
-}
diff --git a/services/core/java/com/android/server/inputmethod/UserData.java b/services/core/java/com/android/server/inputmethod/UserData.java
deleted file mode 100644
index fc2a422..0000000
--- a/services/core/java/com/android/server/inputmethod/UserData.java
+++ /dev/null
@@ -1,88 +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.server.inputmethod;
-
-import android.annotation.NonNull;
-import android.annotation.UserIdInt;
-import android.content.pm.UserInfo;
-import android.os.Handler;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.server.LocalServices;
-import com.android.server.pm.UserManagerInternal;
-
-final class UserData {
-
-    @NonNull
-    private static final SparseArray<UserData> sPerUserMonitor = new SparseArray<>();
-
-    @UserIdInt
-    final int mUserId;
-
-    @GuardedBy("ImfLock.class")
-    final Sequence mSequence = new Sequence();
-
-    /**
-     * Not intended to be instantiated.
-     */
-    private UserData(int userId) {
-        mUserId = userId;
-    }
-
-    @GuardedBy("ImfLock.class")
-    static UserData getOrCreate(@UserIdInt int userId) {
-        UserData monitor = sPerUserMonitor.get(userId);
-        if (monitor == null) {
-            monitor = new UserData(userId);
-            sPerUserMonitor.put(userId, monitor);
-        }
-        return monitor;
-    }
-
-    static void initialize(Handler handler) {
-        final UserManagerInternal userManagerInternal =
-                LocalServices.getService(UserManagerInternal.class);
-        userManagerInternal.addUserLifecycleListener(
-                new UserManagerInternal.UserLifecycleListener() {
-                    @Override
-                    public void onUserRemoved(UserInfo user) {
-                        final int userId = user.id;
-                        handler.post(() -> {
-                            synchronized (ImfLock.class) {
-                                sPerUserMonitor.remove(userId);
-                            }
-                        });
-                    }
-
-                    @Override
-                    public void onUserCreated(UserInfo user, Object unusedToken) {
-                        final int userId = user.id;
-                        handler.post(() -> {
-                            synchronized (ImfLock.class) {
-                                getOrCreate(userId);
-                            }
-                        });
-                    }
-                });
-        synchronized (ImfLock.class) {
-            for (int userId : userManagerInternal.getUserIds()) {
-                getOrCreate(userId);
-            }
-        }
-    }
-}
diff --git a/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java b/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java
index 31ce630..ffc2319 100644
--- a/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java
+++ b/services/core/java/com/android/server/inputmethod/ZeroJankProxy.java
@@ -196,7 +196,10 @@
         return true;
     }
 
-    private void sendResultReceiverFailure(ResultReceiver resultReceiver) {
+    private void sendResultReceiverFailure(@Nullable ResultReceiver resultReceiver) {
+        if (resultReceiver == null) {
+            return;
+        }
         resultReceiver.send(
                 mIsInputShown.getAsBoolean()
                         ? InputMethodManager.RESULT_UNCHANGED_SHOWN
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index c80f988..19562ef 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -102,12 +102,14 @@
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.os.storage.ICeStorageLockEventListener;
 import android.os.storage.IStorageManager;
 import android.os.storage.StorageManager;
+import android.os.storage.StorageManagerInternal;
 import android.provider.DeviceConfig;
 import android.provider.Settings;
 import android.security.AndroidKeyStoreMaintenance;
-import android.security.Authorization;
+import android.security.KeyStoreAuthorization;
 import android.security.keystore.KeyProperties;
 import android.security.keystore.KeyProtection;
 import android.security.keystore.recovery.KeyChainProtectionParams;
@@ -293,6 +295,7 @@
     private final SyntheticPasswordManager mSpManager;
 
     private final KeyStore mKeyStore;
+    private final KeyStoreAuthorization mKeyStoreAuthorization;
     private final RecoverableKeyStoreManager mRecoverableKeyStoreManager;
     private final UnifiedProfilePasswordCache mUnifiedProfilePasswordCache;
 
@@ -337,6 +340,8 @@
     private final CopyOnWriteArrayList<LockSettingsStateListener> mLockSettingsStateListeners =
             new CopyOnWriteArrayList<>();
 
+    private final StorageManagerInternal mStorageManagerInternal;
+
     // This class manages life cycle events for encrypted users on File Based Encryption (FBE)
     // devices. The most basic of these is to show/hide notifications about missing features until
     // the user unlocks the account and credential-encrypted storage is available.
@@ -576,6 +581,10 @@
             return null;
         }
 
+        public StorageManagerInternal getStorageManagerInternal() {
+            return LocalServices.getService(StorageManagerInternal.class);
+        }
+
         public SyntheticPasswordManager getSyntheticPasswordManager(LockSettingsStorage storage) {
             return new SyntheticPasswordManager(getContext(), storage, getUserManager(),
                     new PasswordSlotManager());
@@ -627,6 +636,10 @@
             }
         }
 
+        public KeyStoreAuthorization getKeyStoreAuthorization() {
+            return KeyStoreAuthorization.getInstance();
+        }
+
         public @NonNull UnifiedProfilePasswordCache getUnifiedProfilePasswordCache(KeyStore ks) {
             return new UnifiedProfilePasswordCache(ks);
         }
@@ -650,6 +663,7 @@
         mInjector = injector;
         mContext = injector.getContext();
         mKeyStore = injector.getKeyStore();
+        mKeyStoreAuthorization = injector.getKeyStoreAuthorization();
         mRecoverableKeyStoreManager = injector.getRecoverableKeyStoreManager();
         mHandler = injector.getHandler(injector.getServiceThread());
         mStrongAuth = injector.getStrongAuth();
@@ -666,6 +680,7 @@
         mNotificationManager = injector.getNotificationManager();
         mUserManager = injector.getUserManager();
         mStorageManager = injector.getStorageManager();
+        mStorageManagerInternal = injector.getStorageManagerInternal();
         mStrongAuthTracker = injector.getStrongAuthTracker();
         mStrongAuthTracker.register(mStrongAuth);
         mGatekeeperPasswords = new LongSparseArray<>();
@@ -919,8 +934,34 @@
         mStorage.prefetchUser(UserHandle.USER_SYSTEM);
         mBiometricDeferredQueue.systemReady(mInjector.getFingerprintManager(),
                 mInjector.getFaceManager(), mInjector.getBiometricManager());
+        if (android.os.Flags.allowPrivateProfile()
+                && android.multiuser.Flags.enablePrivateSpaceFeatures()
+                && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()) {
+            mStorageManagerInternal.registerStorageLockEventListener(mCeStorageLockEventListener);
+        }
     }
 
+    private final ICeStorageLockEventListener mCeStorageLockEventListener =
+            new ICeStorageLockEventListener() {
+                @Override
+                public void onStorageLocked(int userId) {
+                    Slog.i(TAG, "Storage lock event received for " + userId);
+                    if (android.os.Flags.allowPrivateProfile()
+                            && android.multiuser.Flags.enablePrivateSpaceFeatures()
+                            && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()) {
+                        mHandler.post(() -> {
+                            UserProperties userProperties =
+                                    mUserManager.getUserProperties(UserHandle.of(userId));
+                            if (userProperties != null
+                                    && userProperties.getAllowStoppingUserWithDelayedLocking()) {
+                                int strongAuthRequired = LockPatternUtils.StrongAuthTracker
+                                        .getDefaultFlags(mContext);
+                                requireStrongAuth(strongAuthRequired, userId);
+                            }
+                        });
+                    }
+                }};
+
     private void loadEscrowData() {
         mRebootEscrowManager.loadRebootEscrowDataIfAvailable(mHandler);
     }
@@ -1460,7 +1501,7 @@
     }
 
     private void unlockKeystore(int userId, SyntheticPassword sp) {
-        Authorization.onDeviceUnlocked(userId, sp.deriveKeyStorePassword());
+        mKeyStoreAuthorization.onDeviceUnlocked(userId, sp.deriveKeyStorePassword());
     }
 
     @VisibleForTesting /** Note: this method is overridden in unit tests */
diff --git a/services/core/java/com/android/server/locksettings/TEST_MAPPING b/services/core/java/com/android/server/locksettings/TEST_MAPPING
index ddf3d76..256d9ba 100644
--- a/services/core/java/com/android/server/locksettings/TEST_MAPPING
+++ b/services/core/java/com/android/server/locksettings/TEST_MAPPING
@@ -24,5 +24,11 @@
                 }
             ]
         }
+    ],
+    "postsubmit": [
+        {
+            // TODO(b/332974906): Promote in presubmit-large.
+            "name": "CtsDevicePolicyManagerTestCases_LockSettings_NoFlakes"
+        }
     ]
 }
diff --git a/services/core/java/com/android/server/media/AudioManagerRouteController.java b/services/core/java/com/android/server/media/AudioManagerRouteController.java
index 087f5a6..f27ade4 100644
--- a/services/core/java/com/android/server/media/AudioManagerRouteController.java
+++ b/services/core/java/com/android/server/media/AudioManagerRouteController.java
@@ -42,6 +42,7 @@
 import android.util.SparseArray;
 
 import com.android.internal.R;
+import com.android.internal.annotations.GuardedBy;
 import com.android.server.media.BluetoothRouteController.NoOpBluetoothRouteController;
 
 import java.util.HashMap;
@@ -57,8 +58,21 @@
  *
  * <p>This implementation obtains and manages all routes via {@link AudioManager}, with the
  * exception of {@link AudioManager#handleBluetoothActiveDeviceChanged inactive bluetooth} routes
- * which are managed by {@link BluetoothDeviceRoutesManager}, which depends on the
- * bluetooth stack ({@link BluetoothAdapter} and related classes).
+ * which are managed by {@link BluetoothDeviceRoutesManager}, which depends on the bluetooth stack
+ * ({@link BluetoothAdapter} and related classes).
+ *
+ * <p>This class runs as part of the system_server process, but depends on classes that may
+ * communicate with other processes, like bluetooth or audio server. And these other processes may
+ * require binder threads from system server. As a result, there are a few threading considerations
+ * to keep in mind:
+ *
+ * <ul>
+ *   <li>Some of this class' internal state is synchronized using {@code this} as lock.
+ *   <li>Binder threads may call into this class and run synchronized code.
+ *   <li>As a result the above, in order to avoid deadlocks, calls to components that may call into
+ *       other processes (like {@link AudioManager} or {@link BluetoothDeviceRoutesManager}) must
+ *       not be synchronized nor occur on a binder thread.
+ * </ul>
  */
 /* package */ final class AudioManagerRouteController implements DeviceRouteController {
     private static final String TAG = SystemMediaRoute2Provider.TAG;
@@ -77,10 +91,6 @@
     @NonNull private final OnDeviceRouteChangedListener mOnDeviceRouteChangedListener;
     @NonNull private final BluetoothDeviceRoutesManager mBluetoothRouteController;
 
-    @NonNull
-    private final Map<String, MediaRoute2InfoHolder> mRouteIdToAvailableDeviceRoutes =
-            new HashMap<>();
-
     @NonNull private final AudioProductStrategy mStrategyForMedia;
 
     @NonNull private final AudioDeviceCallback mAudioDeviceCallback = new AudioDeviceCallbackImpl();
@@ -91,7 +101,14 @@
     private final AudioManager.OnDevicesForAttributesChangedListener
             mOnDevicesForAttributesChangedListener = this::onDevicesForAttributesChangedListener;
 
-    @NonNull private MediaRoute2Info mSelectedRoute;
+    @GuardedBy("this")
+    @NonNull
+    private final Map<String, MediaRoute2InfoHolder> mRouteIdToAvailableDeviceRoutes =
+            new HashMap<>();
+
+    @GuardedBy("this")
+    @NonNull
+    private MediaRoute2Info mSelectedRoute;
 
     // TODO: b/305199571 - Support nullable btAdapter and strategyForMedia which, when null, means
     // no support for transferring to inactive bluetooth routes and transferring to any routes
@@ -119,7 +136,7 @@
 
         mBluetoothRouteController =
                 new BluetoothDeviceRoutesManager(
-                        mContext, btAdapter, this::rebuildAvailableRoutesAndNotify);
+                        mContext, mHandler, btAdapter, this::rebuildAvailableRoutesAndNotify);
         // Just build routes but don't notify. The caller may not expect the listener to be invoked
         // before this constructor has finished executing.
         rebuildAvailableRoutes();
@@ -170,7 +187,7 @@
 
     @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     @Override
-    public synchronized void transferTo(@Nullable String routeId) {
+    public void transferTo(@Nullable String routeId) {
         if (routeId == null) {
             // This should never happen: This branch should only execute when the matching bluetooth
             // route controller is not the no-op one.
@@ -179,25 +196,32 @@
             Slog.e(TAG, "Unexpected call to AudioPoliciesDeviceRouteController#transferTo(null)");
             return;
         }
-        MediaRoute2InfoHolder mediaRoute2InfoHolder = mRouteIdToAvailableDeviceRoutes.get(routeId);
+        MediaRoute2InfoHolder mediaRoute2InfoHolder;
+        synchronized (this) {
+            mediaRoute2InfoHolder = mRouteIdToAvailableDeviceRoutes.get(routeId);
+        }
         if (mediaRoute2InfoHolder == null) {
             Slog.w(TAG, "transferTo: Ignoring transfer request to unknown route id : " + routeId);
             return;
         }
-        if (mediaRoute2InfoHolder.mCorrespondsToInactiveBluetoothRoute) {
-            // By default, the last connected device is the active route so we don't need to apply a
-            // routing audio policy.
-            mBluetoothRouteController.activateBluetoothDeviceWithAddress(
-                    mediaRoute2InfoHolder.mMediaRoute2Info.getAddress());
-            mAudioManager.removePreferredDeviceForStrategy(mStrategyForMedia);
-        } else {
-            AudioDeviceAttributes attr =
-                    new AudioDeviceAttributes(
-                            AudioDeviceAttributes.ROLE_OUTPUT,
-                            mediaRoute2InfoHolder.mAudioDeviceInfoType,
-                            /* address= */ ""); // This is not a BT device, hence no address needed.
-            mAudioManager.setPreferredDeviceForStrategy(mStrategyForMedia, attr);
-        }
+        Runnable transferAction = getTransferActionForRoute(mediaRoute2InfoHolder);
+        Runnable guardedTransferAction =
+                () -> {
+                    try {
+                        transferAction.run();
+                    } catch (Throwable throwable) {
+                        // We swallow the exception to avoid crashing system_server, since this
+                        // doesn't run on a binder thread.
+                        Slog.e(
+                                TAG,
+                                "Unexpected exception while transferring to route id: " + routeId,
+                                throwable);
+                        mHandler.post(this::rebuildAvailableRoutesAndNotify);
+                    }
+                };
+        // We post the transfer operation to the handler to avoid making these calls on a binder
+        // thread. See class javadoc for details.
+        mHandler.post(guardedTransferAction);
     }
 
     @RequiresPermission(
@@ -206,13 +230,35 @@
                 Manifest.permission.QUERY_AUDIO_STATE
             })
     @Override
-    public synchronized boolean updateVolume(int volume) {
+    public boolean updateVolume(int volume) {
         // TODO: b/305199571 - Optimize so that we only update the volume of the selected route. We
         // don't need to rebuild all available routes.
         rebuildAvailableRoutesAndNotify();
         return true;
     }
 
+    private Runnable getTransferActionForRoute(MediaRoute2InfoHolder mediaRoute2InfoHolder) {
+        if (mediaRoute2InfoHolder.mCorrespondsToInactiveBluetoothRoute) {
+            String deviceAddress = mediaRoute2InfoHolder.mMediaRoute2Info.getAddress();
+            return () -> {
+                // By default, the last connected device is the active route so we don't
+                // need to apply a routing audio policy.
+                mBluetoothRouteController.activateBluetoothDeviceWithAddress(deviceAddress);
+                mAudioManager.removePreferredDeviceForStrategy(mStrategyForMedia);
+            };
+
+        } else {
+            AudioDeviceAttributes deviceAttributes =
+                    new AudioDeviceAttributes(
+                            AudioDeviceAttributes.ROLE_OUTPUT,
+                            mediaRoute2InfoHolder.mAudioDeviceInfoType,
+                            /* address= */ ""); // This is not a BT device, hence no address needed.
+            return () ->
+                    mAudioManager.setPreferredDeviceForStrategy(
+                            mStrategyForMedia, deviceAttributes);
+        }
+    }
+
     @RequiresPermission(
             anyOf = {
                 Manifest.permission.MODIFY_AUDIO_ROUTING,
@@ -231,7 +277,7 @@
                 Manifest.permission.MODIFY_AUDIO_ROUTING,
                 Manifest.permission.QUERY_AUDIO_STATE
             })
-    private synchronized void rebuildAvailableRoutesAndNotify() {
+    private void rebuildAvailableRoutesAndNotify() {
         rebuildAvailableRoutes();
         mOnDeviceRouteChangedListener.onDeviceRouteChanged();
     }
@@ -241,7 +287,7 @@
                 Manifest.permission.MODIFY_AUDIO_ROUTING,
                 Manifest.permission.QUERY_AUDIO_STATE
             })
-    private synchronized void rebuildAvailableRoutes() {
+    private void rebuildAvailableRoutes() {
         List<AudioDeviceAttributes> attributesOfSelectedOutputDevices =
                 mAudioManager.getDevicesForAttributes(MEDIA_USAGE_AUDIO_ATTRIBUTES);
         int selectedDeviceAttributesType;
@@ -260,8 +306,43 @@
             selectedDeviceAttributesType = attributesOfSelectedOutputDevices.get(0).getType();
         }
 
-        AudioDeviceInfo[] audioDeviceInfos =
-                mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
+        updateAvailableRoutes(
+                selectedDeviceAttributesType,
+                /* audioDeviceInfos= */ mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS),
+                /* availableBluetoothRoutes= */ mBluetoothRouteController
+                        .getAvailableBluetoothRoutes(),
+                /* musicVolume= */ mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC),
+                /* musicMaxVolume= */ mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
+                /* isVolumeFixed= */ mAudioManager.isVolumeFixed());
+    }
+
+    /**
+     * Updates route and session info using the given information from {@link AudioManager}.
+     *
+     * <p>Synchronization is limited to this method in order to avoid calling into {@link
+     * AudioManager} or {@link BluetoothDeviceRoutesManager} while holding a lock that may also be
+     * acquired by binder threads. See class javadoc for more details.
+     *
+     * @param selectedDeviceAttributesType The {@link AudioDeviceInfo#getType() type} that
+     *     corresponds to the currently selected route.
+     * @param audioDeviceInfos The available audio outputs as obtained from {@link
+     *     AudioManager#getDevices}.
+     * @param availableBluetoothRoutes The available bluetooth routes as obtained from {@link
+     *     BluetoothDeviceRoutesManager#getAvailableBluetoothRoutes()}.
+     * @param musicVolume The volume of the music stream as obtained from {@link
+     *     AudioManager#getStreamVolume}.
+     * @param musicMaxVolume The max volume of the music stream as obtained from {@link
+     *     AudioManager#getStreamMaxVolume}.
+     * @param isVolumeFixed Whether the volume is fixed as obtained from {@link
+     *     AudioManager#isVolumeFixed()}.
+     */
+    private synchronized void updateAvailableRoutes(
+            int selectedDeviceAttributesType,
+            AudioDeviceInfo[] audioDeviceInfos,
+            List<MediaRoute2Info> availableBluetoothRoutes,
+            int musicVolume,
+            int musicMaxVolume,
+            boolean isVolumeFixed) {
         mRouteIdToAvailableDeviceRoutes.clear();
         MediaRoute2InfoHolder newSelectedRouteHolder = null;
         for (AudioDeviceInfo audioDeviceInfo : audioDeviceInfos) {
@@ -301,7 +382,8 @@
             newSelectedRouteHolder = mRouteIdToAvailableDeviceRoutes.values().iterator().next();
         }
         MediaRoute2InfoHolder selectedRouteHolderWithUpdatedVolumeInfo =
-                newSelectedRouteHolder.copyWithVolumeInfoFromAudioManager(mAudioManager);
+                newSelectedRouteHolder.copyWithVolumeInfo(
+                        musicVolume, musicMaxVolume, isVolumeFixed);
         mRouteIdToAvailableDeviceRoutes.put(
                 newSelectedRouteHolder.mMediaRoute2Info.getId(),
                 selectedRouteHolderWithUpdatedVolumeInfo);
@@ -309,7 +391,7 @@
 
         // We only add those BT routes that we have not already obtained from audio manager (which
         // are active).
-        mBluetoothRouteController.getAvailableBluetoothRoutes().stream()
+        availableBluetoothRoutes.stream()
                 .filter(it -> !mRouteIdToAvailableDeviceRoutes.containsKey(it.getId()))
                 .map(MediaRoute2InfoHolder::createForInactiveBluetoothRoute)
                 .forEach(
@@ -328,16 +410,20 @@
     private MediaRoute2Info createMediaRoute2InfoFromAudioDeviceInfo(
             AudioDeviceInfo audioDeviceInfo) {
         String address = audioDeviceInfo.getAddress();
+
         // Passing a null route id means we want to get the default id for the route. Generally, we
         // only expect to pass null for non-Bluetooth routes.
-        String routeId =
-                TextUtils.isEmpty(address)
-                        ? null
-                        : mBluetoothRouteController.getRouteIdForBluetoothAddress(address);
+        String routeId = null;
+
         // We use the name from the port instead AudioDeviceInfo#getProductName because the latter
         // replaces empty names with the name of the device (example: Pixel 8). In that case we want
         // to derive a name ourselves from the type instead.
         String deviceName = audioDeviceInfo.getPort().name();
+
+        if (!TextUtils.isEmpty(address)) {
+            routeId = mBluetoothRouteController.getRouteIdForBluetoothAddress(address);
+            deviceName = mBluetoothRouteController.getNameForBluetoothAddress(address);
+        }
         return createMediaRoute2Info(routeId, audioDeviceInfo.getType(), deviceName, address);
     }
 
@@ -430,17 +516,16 @@
             mCorrespondsToInactiveBluetoothRoute = correspondsToInactiveBluetoothRoute;
         }
 
-        public MediaRoute2InfoHolder copyWithVolumeInfoFromAudioManager(
-                AudioManager mAudioManager) {
+        public MediaRoute2InfoHolder copyWithVolumeInfo(
+                int musicVolume, int musicMaxVolume, boolean isVolumeFixed) {
             MediaRoute2Info routeInfoWithVolumeInfo =
                     new MediaRoute2Info.Builder(mMediaRoute2Info)
                             .setVolumeHandling(
-                                    mAudioManager.isVolumeFixed()
+                                    isVolumeFixed
                                             ? MediaRoute2Info.PLAYBACK_VOLUME_FIXED
                                             : MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE)
-                            .setVolume(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC))
-                            .setVolumeMax(
-                                    mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC))
+                            .setVolume(musicVolume)
+                            .setVolumeMax(musicMaxVolume)
                             .build();
             return new MediaRoute2InfoHolder(
                     routeInfoWithVolumeInfo,
diff --git a/services/core/java/com/android/server/media/BluetoothDeviceRoutesManager.java b/services/core/java/com/android/server/media/BluetoothDeviceRoutesManager.java
index 8119628..8b65ea3 100644
--- a/services/core/java/com/android/server/media/BluetoothDeviceRoutesManager.java
+++ b/services/core/java/com/android/server/media/BluetoothDeviceRoutesManager.java
@@ -31,6 +31,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.media.MediaRoute2Info;
+import android.os.Handler;
 import android.os.UserHandle;
 import android.text.TextUtils;
 import android.util.Log;
@@ -77,26 +78,35 @@
 
     @NonNull
     private final Context mContext;
-    @NonNull
-    private final BluetoothAdapter mBluetoothAdapter;
+    @NonNull private final Handler mHandler;
+    @NonNull private final BluetoothAdapter mBluetoothAdapter;
     @NonNull
     private final BluetoothRouteController.BluetoothRoutesUpdatedListener mListener;
     @NonNull
     private final BluetoothProfileMonitor mBluetoothProfileMonitor;
 
-    BluetoothDeviceRoutesManager(@NonNull Context context,
+    BluetoothDeviceRoutesManager(
+            @NonNull Context context,
+            @NonNull Handler handler,
             @NonNull BluetoothAdapter bluetoothAdapter,
             @NonNull BluetoothRouteController.BluetoothRoutesUpdatedListener listener) {
-        this(context, bluetoothAdapter,
-                new BluetoothProfileMonitor(context, bluetoothAdapter), listener);
+        this(
+                context,
+                handler,
+                bluetoothAdapter,
+                new BluetoothProfileMonitor(context, bluetoothAdapter),
+                listener);
     }
 
     @VisibleForTesting
-    BluetoothDeviceRoutesManager(@NonNull Context context,
+    BluetoothDeviceRoutesManager(
+            @NonNull Context context,
+            @NonNull Handler handler,
             @NonNull BluetoothAdapter bluetoothAdapter,
             @NonNull BluetoothProfileMonitor bluetoothProfileMonitor,
             @NonNull BluetoothRouteController.BluetoothRoutesUpdatedListener listener) {
         mContext = Objects.requireNonNull(context);
+        mHandler = handler;
         mBluetoothAdapter = Objects.requireNonNull(bluetoothAdapter);
         mBluetoothProfileMonitor = Objects.requireNonNull(bluetoothProfileMonitor);
         mListener = Objects.requireNonNull(listener);
@@ -119,6 +129,7 @@
                 BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
         deviceStateChangedIntentFilter.addAction(
                 BluetoothLeAudio.ACTION_LE_AUDIO_CONNECTION_STATE_CHANGED);
+        deviceStateChangedIntentFilter.addAction(BluetoothDevice.ACTION_ALIAS_CHANGED);
 
         mContext.registerReceiverAsUser(mDeviceStateChangedReceiver, user,
                 deviceStateChangedIntentFilter, null, null);
@@ -133,13 +144,17 @@
     @Nullable
     public synchronized String getRouteIdForBluetoothAddress(@Nullable String address) {
         BluetoothDevice bluetoothDevice = mAddressToBondedDevice.get(address);
-        // TODO: b/305199571 - Optimize the following statement to avoid creating the full
-        // MediaRoute2Info instance. We just need the id.
         return bluetoothDevice != null
-                ? createBluetoothRoute(bluetoothDevice).mRoute.getId()
+                ? getRouteIdForType(bluetoothDevice, getDeviceType(bluetoothDevice))
                 : null;
     }
 
+    @Nullable
+    public synchronized String getNameForBluetoothAddress(@NonNull String address) {
+        BluetoothDevice bluetoothDevice = mAddressToBondedDevice.get(address);
+        return bluetoothDevice != null ? getDeviceName(bluetoothDevice) : null;
+    }
+
     public synchronized void activateBluetoothDeviceWithAddress(String address) {
         BluetoothRouteInfo btRouteInfo = mBluetoothRoutes.get(address);
 
@@ -218,33 +233,12 @@
         BluetoothRouteInfo
                 newBtRoute = new BluetoothRouteInfo();
         newBtRoute.mBtDevice = device;
-        String deviceName =
-                Flags.enableUseOfBluetoothDeviceGetAliasForMr2infoGetName()
-                        ? device.getAlias()
-                        : device.getName();
-        if (TextUtils.isEmpty(deviceName)) {
-            deviceName = mContext.getResources().getText(R.string.unknownName).toString();
-        }
+        String deviceName = getDeviceName(device);
 
-        String routeId = device.getAddress();
-        int type = MediaRoute2Info.TYPE_BLUETOOTH_A2DP;
-        newBtRoute.mConnectedProfiles = new SparseBooleanArray();
-        if (mBluetoothProfileMonitor.isProfileSupported(BluetoothProfile.A2DP, device)) {
-            newBtRoute.mConnectedProfiles.put(BluetoothProfile.A2DP, true);
-        }
-        if (mBluetoothProfileMonitor.isProfileSupported(BluetoothProfile.HEARING_AID, device)) {
-            newBtRoute.mConnectedProfiles.put(BluetoothProfile.HEARING_AID, true);
-            routeId = HEARING_AID_ROUTE_ID_PREFIX
-                    + mBluetoothProfileMonitor.getGroupId(BluetoothProfile.HEARING_AID, device);
-            type = MediaRoute2Info.TYPE_HEARING_AID;
-        }
-        if (mBluetoothProfileMonitor.isProfileSupported(BluetoothProfile.LE_AUDIO, device)) {
-            newBtRoute.mConnectedProfiles.put(BluetoothProfile.LE_AUDIO, true);
-            routeId = LE_AUDIO_ROUTE_ID_PREFIX
-                    + mBluetoothProfileMonitor.getGroupId(BluetoothProfile.LE_AUDIO, device);
-            type = MediaRoute2Info.TYPE_BLE_HEADSET;
-        }
+        int type = getDeviceType(device);
+        String routeId = getRouteIdForType(device, type);
 
+        newBtRoute.mConnectedProfiles = getConnectedProfiles(device);
         // Note that volume is only relevant for active bluetooth routes, and those are managed via
         // AudioManager.
         newBtRoute.mRoute =
@@ -262,6 +256,78 @@
         return newBtRoute;
     }
 
+    private String getDeviceName(BluetoothDevice device) {
+        String deviceName =
+                Flags.enableUseOfBluetoothDeviceGetAliasForMr2infoGetName()
+                        ? device.getAlias()
+                        : device.getName();
+        if (TextUtils.isEmpty(deviceName)) {
+            deviceName = mContext.getResources().getText(R.string.unknownName).toString();
+        }
+        return deviceName;
+    }
+    private SparseBooleanArray getConnectedProfiles(@NonNull BluetoothDevice device) {
+        SparseBooleanArray connectedProfiles = new SparseBooleanArray();
+        if (mBluetoothProfileMonitor.isProfileSupported(BluetoothProfile.A2DP, device)) {
+            connectedProfiles.put(BluetoothProfile.A2DP, true);
+        }
+        if (mBluetoothProfileMonitor.isProfileSupported(BluetoothProfile.HEARING_AID, device)) {
+            connectedProfiles.put(BluetoothProfile.HEARING_AID, true);
+        }
+        if (mBluetoothProfileMonitor.isProfileSupported(BluetoothProfile.LE_AUDIO, device)) {
+            connectedProfiles.put(BluetoothProfile.LE_AUDIO, true);
+        }
+
+        return connectedProfiles;
+    }
+
+    private int getDeviceType(@NonNull BluetoothDevice device) {
+        if (mBluetoothProfileMonitor.isProfileSupported(BluetoothProfile.LE_AUDIO, device)) {
+            return MediaRoute2Info.TYPE_BLE_HEADSET;
+        }
+
+        if (mBluetoothProfileMonitor.isProfileSupported(BluetoothProfile.HEARING_AID, device)) {
+            return MediaRoute2Info.TYPE_HEARING_AID;
+        }
+
+        return MediaRoute2Info.TYPE_BLUETOOTH_A2DP;
+    }
+
+    private String getRouteIdForType(@NonNull BluetoothDevice device, int type) {
+        return switch (type) {
+            case (MediaRoute2Info.TYPE_BLE_HEADSET) ->
+                    LE_AUDIO_ROUTE_ID_PREFIX
+                            + mBluetoothProfileMonitor.getGroupId(
+                                    BluetoothProfile.LE_AUDIO, device);
+            case (MediaRoute2Info.TYPE_HEARING_AID) ->
+                    HEARING_AID_ROUTE_ID_PREFIX
+                            + mBluetoothProfileMonitor.getGroupId(
+                                    BluetoothProfile.HEARING_AID, device);
+            // TYPE_BLUETOOTH_A2DP
+            default -> device.getAddress();
+        };
+    }
+
+    private void handleBluetoothAdapterStateChange(int state) {
+        if (state == BluetoothAdapter.STATE_OFF || state == BluetoothAdapter.STATE_TURNING_OFF) {
+            synchronized (BluetoothDeviceRoutesManager.this) {
+                mBluetoothRoutes.clear();
+            }
+            notifyBluetoothRoutesUpdated();
+        } else if (state == BluetoothAdapter.STATE_ON) {
+            updateBluetoothRoutes();
+
+            boolean shouldCallListener;
+            synchronized (BluetoothDeviceRoutesManager.this) {
+                shouldCallListener = !mBluetoothRoutes.isEmpty();
+            }
+
+            if (shouldCallListener) {
+                notifyBluetoothRoutesUpdated();
+            }
+        }
+    }
+
     private static class BluetoothRouteInfo {
         private BluetoothDevice mBtDevice;
         private MediaRoute2Info mRoute;
@@ -272,23 +338,10 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
-            if (state == BluetoothAdapter.STATE_OFF
-                    || state == BluetoothAdapter.STATE_TURNING_OFF) {
-                synchronized (BluetoothDeviceRoutesManager.this) {
-                    mBluetoothRoutes.clear();
-                }
-                notifyBluetoothRoutesUpdated();
-            } else if (state == BluetoothAdapter.STATE_ON) {
-                updateBluetoothRoutes();
-
-                boolean shouldCallListener;
-                synchronized (BluetoothDeviceRoutesManager.this) {
-                    shouldCallListener = !mBluetoothRoutes.isEmpty();
-                }
-
-                if (shouldCallListener) {
-                    notifyBluetoothRoutesUpdated();
-                }
+            if (Flags.enableMr2ServiceNonMainBgThread()) {
+                mHandler.post(() -> handleBluetoothAdapterStateChange(state));
+            } else {
+                handleBluetoothAdapterStateChange(state);
             }
         }
     }
@@ -300,8 +353,17 @@
                 case BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED:
                 case BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED:
                 case BluetoothLeAudio.ACTION_LE_AUDIO_CONNECTION_STATE_CHANGED:
-                    updateBluetoothRoutes();
-                    notifyBluetoothRoutesUpdated();
+                case BluetoothDevice.ACTION_ALIAS_CHANGED:
+                    if (Flags.enableMr2ServiceNonMainBgThread()) {
+                        mHandler.post(
+                                () -> {
+                                    updateBluetoothRoutes();
+                                    notifyBluetoothRoutesUpdated();
+                                });
+                    } else {
+                        updateBluetoothRoutes();
+                        notifyBluetoothRoutesUpdated();
+                    }
             }
         }
     }
diff --git a/services/core/java/com/android/server/media/MediaKeyDispatcher.java b/services/core/java/com/android/server/media/MediaKeyDispatcher.java
index 66cafab..e4f2ec3 100644
--- a/services/core/java/com/android/server/media/MediaKeyDispatcher.java
+++ b/services/core/java/com/android/server/media/MediaKeyDispatcher.java
@@ -44,7 +44,6 @@
  * Note: When instantiating this class, {@link MediaSessionService} will only use the constructor
  * without any parameters.
  */
-// TODO: Move this class to apex/media/
 public abstract class MediaKeyDispatcher {
     @IntDef(flag = true, value = {
             KEY_EVENT_SINGLE_TAP,
diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java
index 5d415c2..db83d4b 100644
--- a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java
+++ b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java
@@ -232,7 +232,9 @@
         if (!mRunning) {
             return false;
         }
-        if (!getSessionInfos().isEmpty() || mIsManagerScanning) {
+        boolean bindDueToManagerScan =
+                mIsManagerScanning && Flags.enablePreventionOfManagerScansWhenNoAppsScan();
+        if (!getSessionInfos().isEmpty() || bindDueToManagerScan) {
             // We bind if any manager is scanning (regardless of whether an app is scanning) to give
             // the opportunity for providers to publish routing sessions that were established
             // directly between the app and the provider (typically via AndroidX MediaRouter). See
@@ -662,7 +664,9 @@
         }
 
         @Override
-        public void notifyProviderUpdated(MediaRoute2ProviderInfo providerInfo) {
+        public void notifyProviderUpdated(@NonNull MediaRoute2ProviderInfo providerInfo) {
+            Objects.requireNonNull(providerInfo, "providerInfo must not be null");
+
             for (MediaRoute2Info route : providerInfo.getRoutes()) {
                 if (route.isSystemRoute()) {
                     throw new SecurityException(
diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java b/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java
index fcca94b0..178eb71 100644
--- a/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java
+++ b/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java
@@ -145,6 +145,10 @@
                                     new ComponentName(serviceInfo.packageName, serviceInfo.name),
                                     isSelfScanOnlyProvider,
                                     mUserId);
+                    Slog.i(
+                            TAG,
+                            "Enabling proxy for MediaRoute2ProviderService: "
+                                    + proxy.mComponentName);
                     proxy.start(/* rebindIfDisconnected= */ false);
                     mProxies.add(targetIndex++, proxy);
                     mCallback.onAddProviderService(proxy);
@@ -162,6 +166,9 @@
         if (targetIndex < mProxies.size()) {
             for (int i = mProxies.size() - 1; i >= targetIndex; i--) {
                 MediaRoute2ProviderServiceProxy proxy = mProxies.get(i);
+                Slog.i(
+                        TAG,
+                        "Disabling proxy for MediaRoute2ProviderService: " + proxy.mComponentName);
                 mCallback.onRemoveProviderService(proxy);
                 mProxies.remove(proxy);
                 proxy.stop();
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index 51a8aef..e50189b 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -114,6 +114,7 @@
             };
 
     private final Context mContext;
+    private final Looper mLooper;
     private final UserManagerInternal mUserManagerInternal;
     private final Object mLock = new Object();
     private final AppOpsManager mAppOpsManager;
@@ -178,8 +179,9 @@
                 Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS,
                 Manifest.permission.WATCH_APPOPS
             })
-    /* package */ MediaRouter2ServiceImpl(Context context) {
+    /* package */ MediaRouter2ServiceImpl(@NonNull Context context, @NonNull Looper looper) {
         mContext = context;
+        mLooper = looper;
         mActivityManager = mContext.getSystemService(ActivityManager.class);
         mActivityManager.addOnUidImportanceListener(mOnUidImportanceListener,
                 REQUIRED_PACKAGE_IMPORTANCE_FOR_SCANNING);
@@ -187,12 +189,10 @@
         mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
         mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
 
-        if (!Flags.disableScreenOffBroadcastReceiver()) {
-            IntentFilter screenOnOffIntentFilter = new IntentFilter();
-            screenOnOffIntentFilter.addAction(ACTION_SCREEN_ON);
-            screenOnOffIntentFilter.addAction(ACTION_SCREEN_OFF);
-            mContext.registerReceiver(mScreenOnOffReceiver, screenOnOffIntentFilter);
-        }
+        IntentFilter screenOnOffIntentFilter = new IntentFilter();
+        screenOnOffIntentFilter.addAction(ACTION_SCREEN_ON);
+        screenOnOffIntentFilter.addAction(ACTION_SCREEN_OFF);
+        mContext.registerReceiver(mScreenOnOffReceiver, screenOnOffIntentFilter);
 
         // Passing null package name to listen to all events.
         mAppOpsManager.startWatchingMode(
@@ -221,18 +221,27 @@
     // Start of methods that implement MediaRouter2 operations.
 
     @NonNull
-    public List<MediaRoute2Info> getSystemRoutes() {
+    public List<MediaRoute2Info> getSystemRoutes(@NonNull String callerPackageName,
+            boolean isProxyRouter) {
         final int uid = Binder.getCallingUid();
         final int pid = Binder.getCallingPid();
         final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier();
-        final boolean hasSystemRoutingPermission = checkCallerHasSystemRoutingPermissions(pid, uid);
+
+        boolean hasSystemRoutingPermissions;
+        if (!isProxyRouter) {
+            hasSystemRoutingPermissions = checkCallerHasSystemRoutingPermissions(pid, uid);
+        } else {
+            // Request from ProxyRouter.
+            hasSystemRoutingPermissions =
+                    checkCallerHasPrivilegedRoutingPermissions(pid, uid, callerPackageName);
+        }
 
         final long token = Binder.clearCallingIdentity();
         try {
             Collection<MediaRoute2Info> systemRoutes;
             synchronized (mLock) {
                 UserRecord userRecord = getOrCreateUserRecordLocked(userId);
-                if (hasSystemRoutingPermission) {
+                if (hasSystemRoutingPermissions) {
                     MediaRoute2ProviderInfo providerInfo =
                             userRecord.mHandler.mSystemProvider.getProviderInfo();
                     if (providerInfo != null) {
@@ -795,12 +804,21 @@
 
     @Nullable
     public RoutingSessionInfo getSystemSessionInfo(
-            @Nullable String packageName, boolean setDeviceRouteSelected) {
+            @NonNull String callerPackageName,
+            @Nullable String targetPackageName,
+            boolean setDeviceRouteSelected) {
         final int uid = Binder.getCallingUid();
         final int pid = Binder.getCallingPid();
         final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier();
-        final boolean hasSystemRoutingPermissions =
-                checkCallerHasSystemRoutingPermissions(pid, uid);
+
+        boolean hasSystemRoutingPermissions;
+        if (targetPackageName == null) {
+            hasSystemRoutingPermissions = checkCallerHasSystemRoutingPermissions(pid, uid);
+        } else {
+            // Request from ProxyRouter.
+            hasSystemRoutingPermissions =
+                    checkCallerHasPrivilegedRoutingPermissions(pid, uid, callerPackageName);
+        }
 
         final long token = Binder.clearCallingIdentity();
         try {
@@ -812,14 +830,14 @@
                         // Return a fake system session that shows the device route as selected and
                         // available bluetooth routes as transferable.
                         return userRecord.mHandler.mSystemProvider
-                                .generateDeviceRouteSelectedSessionInfo(packageName);
+                                .generateDeviceRouteSelectedSessionInfo(targetPackageName);
                     } else {
                         sessionInfos = userRecord.mHandler.mSystemProvider.getSessionInfos();
                         if (!sessionInfos.isEmpty()) {
                             // Return a copy of the current system session with no modification,
                             // except setting the client package name.
                             return new RoutingSessionInfo.Builder(sessionInfos.get(0))
-                                    .setClientPackageName(packageName)
+                                    .setClientPackageName(targetPackageName)
                                     .build();
                         } else {
                             Slog.w(TAG, "System provider does not have any session info.");
@@ -828,7 +846,7 @@
                 } else {
                     return new RoutingSessionInfo.Builder(
                                     userRecord.mHandler.mSystemProvider.getDefaultSessionInfo())
-                            .setClientPackageName(packageName)
+                            .setClientPackageName(targetPackageName)
                             .build();
                 }
             }
@@ -843,6 +861,12 @@
                 || checkCallerHasBluetoothPermissions(pid, uid);
     }
 
+    private boolean checkCallerHasPrivilegedRoutingPermissions(
+            int pid, int uid, @NonNull String callerPackageName) {
+        return checkMediaContentControlPermission(uid, pid)
+                || checkMediaRoutingControlPermission(uid, pid, callerPackageName);
+    }
+
     private boolean checkCallerHasModifyAudioRoutingPermission(int pid, int uid) {
         return mContext.checkPermission(Manifest.permission.MODIFY_AUDIO_ROUTING, pid, uid)
                 == PackageManager.PERMISSION_GRANTED;
@@ -864,30 +888,29 @@
                 Manifest.permission.MEDIA_CONTENT_CONTROL
             })
     private void enforcePrivilegedRoutingPermissions(
-            int callerUid, int callerPid, @Nullable String callerPackageName) {
-        if (hasMediaContentControlPermission(callerUid, callerPid)) {
+            int callerUid, int callerPid, @NonNull String callerPackageName) {
+        if (checkMediaContentControlPermission(callerUid, callerPid)) {
             return;
         }
 
-        if (!Flags.enablePrivilegedRoutingForMediaRoutingControl()) {
-            throw new SecurityException("Must hold MEDIA_CONTENT_CONTROL");
-        }
-
         if (!checkMediaRoutingControlPermission(callerUid, callerPid, callerPackageName)) {
             throw new SecurityException(
                     "Must hold MEDIA_CONTENT_CONTROL or MEDIA_ROUTING_CONTROL permissions.");
         }
     }
 
-    @RequiresPermission(Manifest.permission.MEDIA_CONTENT_CONTROL)
-    private boolean hasMediaContentControlPermission(int callerUid, int callerPid) {
+    private boolean checkMediaContentControlPermission(int callerUid, int callerPid) {
         return mContext.checkPermission(
                         Manifest.permission.MEDIA_CONTENT_CONTROL, callerPid, callerUid)
                 == PackageManager.PERMISSION_GRANTED;
     }
 
     private boolean checkMediaRoutingControlPermission(
-            int callerUid, int callerPid, @Nullable String callerPackageName) {
+            int callerUid, int callerPid, @NonNull String callerPackageName) {
+        if (!Flags.enablePrivilegedRoutingForMediaRoutingControl()) {
+            return false;
+        }
+
         return PermissionChecker.checkPermissionForDataDelivery(
                         mContext,
                         Manifest.permission.MEDIA_ROUTING_CONTROL,
@@ -1022,7 +1045,7 @@
 
         // Uid and package name are shared across all manager records in the list.
         boolean isAppOpAllowed =
-                mAppOpsManager.unsafeCheckOp(
+                mAppOpsManager.unsafeCheckOpNoThrow(
                                 AppOpsManager.OPSTR_MEDIA_ROUTING_CONTROL,
                                 record.mOwnerUid,
                                 record.mOwnerPackageName)
@@ -1520,7 +1543,7 @@
         boolean hasMediaRoutingControl =
                 checkMediaRoutingControlPermission(callerUid, callerPid, callerPackageName);
 
-        boolean hasMediaContentControl = hasMediaContentControlPermission(callerUid, callerPid);
+        boolean hasMediaContentControl = checkMediaContentControlPermission(callerUid, callerPid);
 
         Slog.i(
                 TAG,
@@ -1868,7 +1891,7 @@
     private UserRecord getOrCreateUserRecordLocked(int userId) {
         UserRecord userRecord = mUserRecords.get(userId);
         if (userRecord == null) {
-            userRecord = new UserRecord(userId);
+            userRecord = new UserRecord(userId, mLooper);
             mUserRecords.put(userId, userRecord);
             userRecord.init();
             if (isUserActiveLocked(userId)) {
@@ -1939,9 +1962,13 @@
         Set<String> mActivelyScanningPackages = Set.of();
         final UserHandler mHandler;
 
-        UserRecord(int userId) {
+        UserRecord(int userId, @NonNull Looper looper) {
             mUserId = userId;
-            mHandler = new UserHandler(MediaRouter2ServiceImpl.this, this);
+            mHandler =
+                    new UserHandler(
+                            /* service= */ MediaRouter2ServiceImpl.this,
+                            /* userRecord= */ this,
+                            looper);
         }
 
         void init() {
@@ -2342,12 +2369,16 @@
         private boolean mRunning;
 
         // TODO: (In Android S+) Pull out SystemMediaRoute2Provider out of UserHandler.
-        UserHandler(@NonNull MediaRouter2ServiceImpl service, @NonNull UserRecord userRecord) {
-            super(Looper.getMainLooper(), null, true);
+        UserHandler(
+                @NonNull MediaRouter2ServiceImpl service,
+                @NonNull UserRecord userRecord,
+                @NonNull Looper looper) {
+            super(looper, /* callback= */ null, /* async= */ true);
             mServiceRef = new WeakReference<>(service);
             mUserRecord = userRecord;
-            mSystemProvider = new SystemMediaRoute2Provider(service.mContext,
-                    UserHandle.of(userRecord.mUserId));
+            mSystemProvider =
+                    new SystemMediaRoute2Provider(
+                            service.mContext, UserHandle.of(userRecord.mUserId), looper);
             mRouteProviders.add(mSystemProvider);
             mWatcher = new MediaRoute2ProviderWatcher(service.mContext, this,
                     this, mUserRecord.mUserId);
@@ -3402,9 +3433,7 @@
         @NonNull
         private static List<RouterRecord> getIndividuallyActiveRouters(
                 MediaRouter2ServiceImpl service, List<RouterRecord> allRouterRecords) {
-            if (!Flags.disableScreenOffBroadcastReceiver()
-                    && !service.mPowerManager.isInteractive()
-                    && !Flags.enableScreenOffScanning()) {
+            if (!service.mPowerManager.isInteractive() && !Flags.enableScreenOffScanning()) {
                 return Collections.emptyList();
             }
 
@@ -3420,9 +3449,7 @@
 
         private static boolean areManagersScanning(
                 MediaRouter2ServiceImpl service, List<ManagerRecord> managerRecords) {
-            if (!Flags.disableScreenOffBroadcastReceiver()
-                    && !service.mPowerManager.isInteractive()
-                    && !Flags.enableScreenOffScanning()) {
+            if (!service.mPowerManager.isInteractive() && !Flags.enableScreenOffScanning()) {
                 return false;
             }
 
diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java
index 6af3480..1a129cb 100644
--- a/services/core/java/com/android/server/media/MediaRouterService.java
+++ b/services/core/java/com/android/server/media/MediaRouterService.java
@@ -53,6 +53,7 @@
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.HandlerThread;
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
@@ -70,6 +71,7 @@
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.util.DumpUtils;
+import com.android.media.flags.Flags;
 import com.android.server.LocalServices;
 import com.android.server.Watchdog;
 import com.android.server.pm.UserManagerInternal;
@@ -94,6 +96,7 @@
         implements Watchdog.Monitor {
     private static final String TAG = "MediaRouterService";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    private static final String WORKER_THREAD_NAME = "MediaRouterServiceThread";
 
     /**
      * Timeout in milliseconds for a selected route to transition from a disconnected state to a
@@ -110,6 +113,7 @@
     private static final long CONNECTED_TIMEOUT = 60000;
 
     private final Context mContext;
+    private final Looper mLooper;
 
     // State guarded by mLock.
     private final Object mLock = new Object();
@@ -125,7 +129,7 @@
 
     private final IAudioService mAudioService;
     private final AudioPlayerStateMonitor mAudioPlayerStateMonitor;
-    private final Handler mHandler = new Handler();
+    private final Handler mHandler;
     private final IntArray mActivePlayerMinPriorityQueue = new IntArray();
     private final IntArray mActivePlayerUidMinPriorityQueue = new IntArray();
 
@@ -141,7 +145,15 @@
 
     @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS)
     public MediaRouterService(Context context) {
-        mService2 = new MediaRouter2ServiceImpl(context);
+        if (Flags.enableMr2ServiceNonMainBgThread()) {
+            HandlerThread handlerThread = new HandlerThread(WORKER_THREAD_NAME);
+            handlerThread.start();
+            mLooper = handlerThread.getLooper();
+        } else {
+            mLooper = Looper.myLooper();
+        }
+        mHandler = new Handler(mLooper);
+        mService2 = new MediaRouter2ServiceImpl(context, mLooper);
         mContext = context;
         Watchdog.getInstance().addMonitor(this);
         Resources res = context.getResources();
@@ -411,15 +423,21 @@
 
     // Binder call
     @Override
-    public List<MediaRoute2Info> getSystemRoutes() {
-        return mService2.getSystemRoutes();
+    public List<MediaRoute2Info> getSystemRoutes(@NonNull String callerPackageName,
+            boolean isProxyRouter) {
+        if (!validatePackageName(Binder.getCallingUid(), callerPackageName)) {
+            throw new SecurityException("callerPackageName does not match calling uid.");
+        }
+        return mService2.getSystemRoutes(callerPackageName, isProxyRouter);
     }
 
     // Binder call
     @Override
     public RoutingSessionInfo getSystemSessionInfo() {
         return mService2.getSystemSessionInfo(
-                null /* packageName */, false /* setDeviceRouteSelected */);
+                /* callerPackageName */ null,
+                /* targetPackageName */ null, /* setDeviceRouteSelected */
+                false);
     }
 
     // Binder call
@@ -530,16 +548,22 @@
 
     // Binder call
     @Override
-    public RoutingSessionInfo getSystemSessionInfoForPackage(@Nullable String packageName) {
+    public RoutingSessionInfo getSystemSessionInfoForPackage(
+            @NonNull String callerPackageName, @Nullable String targetPackageName) {
         final int uid = Binder.getCallingUid();
         final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier();
+
+        if (!validatePackageName(uid, callerPackageName)) {
+            throw new SecurityException("callerPackageName does not match calling uid.");
+        }
+
         boolean setDeviceRouteSelected = false;
         synchronized (mLock) {
             UserRecord userRecord = mUserRecords.get(userId);
             List<ClientRecord> userClientRecords =
                     userRecord != null ? userRecord.mClientRecords : Collections.emptyList();
             for (ClientRecord clientRecord : userClientRecords) {
-                if (TextUtils.equals(clientRecord.mPackageName, packageName)) {
+                if (TextUtils.equals(clientRecord.mPackageName, targetPackageName)) {
                     if (mDefaultAudioRouteId.equals(clientRecord.mSelectedRouteId)) {
                         setDeviceRouteSelected = true;
                         break;
@@ -547,7 +571,8 @@
                 }
             }
         }
-        return mService2.getSystemSessionInfo(packageName, setDeviceRouteSelected);
+        return mService2.getSystemSessionInfo(
+                callerPackageName, targetPackageName, setDeviceRouteSelected);
     }
 
     // Binder call
@@ -1091,7 +1116,7 @@
 
         public UserRecord(int userId) {
             mUserId = userId;
-            mHandler = new UserHandler(MediaRouterService.this, this);
+            mHandler = new UserHandler(MediaRouterService.this, this, mLooper);
         }
 
         public void dump(final PrintWriter pw, String prefix) {
@@ -1199,8 +1224,8 @@
         private long mConnectionTimeoutStartTime;
         private boolean mClientStateUpdateScheduled;
 
-        public UserHandler(MediaRouterService service, UserRecord userRecord) {
-            super(Looper.getMainLooper(), null, true);
+        private UserHandler(MediaRouterService service, UserRecord userRecord, Looper looper) {
+            super(looper, null, true);
             mService = service;
             mUserRecord = userRecord;
             mWatcher = new RemoteDisplayProviderWatcher(service.mContext, this,
diff --git a/services/core/java/com/android/server/media/MediaSession2Record.java b/services/core/java/com/android/server/media/MediaSession2Record.java
index 1dc86f2..0cd7654 100644
--- a/services/core/java/com/android/server/media/MediaSession2Record.java
+++ b/services/core/java/com/android/server/media/MediaSession2Record.java
@@ -17,6 +17,7 @@
 package com.android.server.media;
 
 import android.app.ForegroundServiceDelegationOptions;
+import android.app.Notification;
 import android.media.MediaController2;
 import android.media.Session2CommandGroup;
 import android.media.Session2Token;
@@ -169,6 +170,12 @@
     }
 
     @Override
+    boolean isLinkedToNotification(Notification notification) {
+        // Currently it's not possible to link MediaSession2 with a Notification
+        return false;
+    }
+
+    @Override
     public int getSessionPolicies() {
         synchronized (mLock) {
             return mPolicies;
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 5b3934e..62a9471 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -30,6 +30,7 @@
 import android.app.ActivityManager;
 import android.app.ActivityManagerInternal;
 import android.app.ForegroundServiceDelegationOptions;
+import android.app.Notification;
 import android.app.PendingIntent;
 import android.app.compat.CompatChanges;
 import android.compat.annotation.ChangeId;
@@ -89,6 +90,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.NoSuchElementException;
+import java.util.Objects;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
@@ -429,28 +431,9 @@
             int stream = getVolumeStream(mAudioAttrs);
             final int volumeValue = value;
             mHandler.post(
-                    new Runnable() {
-                        @Override
-                        public void run() {
-                            try {
-                                mAudioManager.setStreamVolumeForUid(
-                                        stream,
-                                        volumeValue,
-                                        flags,
-                                        opPackageName,
-                                        uid,
-                                        pid,
-                                        mContext.getApplicationInfo().targetSdkVersion);
-                            } catch (IllegalArgumentException | SecurityException e) {
-                                Slog.e(
-                                        TAG,
-                                        "Cannot set volume: stream=" + stream
-                                                + ", value=" + volumeValue
-                                                + ", flags=" + flags,
-                                        e);
-                            }
-                        }
-                    });
+                    () ->
+                            setStreamVolumeForUid(
+                                    opPackageName, pid, uid, flags, stream, volumeValue));
         } else {
             if (mVolumeControlType != VOLUME_CONTROL_ABSOLUTE) {
                 if (DEBUG) {
@@ -480,6 +463,27 @@
         }
     }
 
+    private void setStreamVolumeForUid(
+            String opPackageName, int pid, int uid, int flags, int stream, int volumeValue) {
+        try {
+            mAudioManager.setStreamVolumeForUid(
+                    stream,
+                    volumeValue,
+                    flags,
+                    opPackageName,
+                    uid,
+                    pid,
+                    mContext.getApplicationInfo().targetSdkVersion);
+        } catch (IllegalArgumentException | SecurityException e) {
+            Slog.e(
+                    TAG,
+                    "Cannot set volume: stream=" + stream
+                            + ", value=" + volumeValue
+                            + ", flags=" + flags,
+                    e);
+        }
+    }
+
     /**
      * Check if this session has been set to active by the app.
      * <p>
@@ -639,6 +643,15 @@
     }
 
     @Override
+    boolean isLinkedToNotification(Notification notification) {
+        return notification.isMediaNotification()
+                && Objects.equals(
+                        notification.extras.getParcelable(
+                                Notification.EXTRA_MEDIA_SESSION, MediaSession.Token.class),
+                        mSessionToken);
+    }
+
+    @Override
     public int getSessionPolicies() {
         synchronized (mLock) {
             return mPolicies;
@@ -738,52 +751,70 @@
             pid = callingPid;
         }
         mHandler.post(
-                new Runnable() {
-                    @Override
-                    public void run() {
-                        try {
-                            if (useSuggested) {
-                                if (AudioSystem.isStreamActive(stream, 0)) {
-                                    mAudioManager.adjustSuggestedStreamVolumeForUid(
-                                            stream,
-                                            direction,
-                                            flags,
-                                            opPackageName,
-                                            uid,
-                                            pid,
-                                            mContext.getApplicationInfo().targetSdkVersion);
-                                } else {
-                                    mAudioManager.adjustSuggestedStreamVolumeForUid(
-                                            AudioManager.USE_DEFAULT_STREAM_TYPE,
-                                            direction,
-                                            flags | previousFlagPlaySound,
-                                            opPackageName,
-                                            uid,
-                                            pid,
-                                            mContext.getApplicationInfo().targetSdkVersion);
-                                }
-                            } else {
-                                mAudioManager.adjustStreamVolumeForUid(
-                                        stream,
-                                        direction,
-                                        flags,
-                                        opPackageName,
-                                        uid,
-                                        pid,
-                                        mContext.getApplicationInfo().targetSdkVersion);
-                            }
-                        } catch (IllegalArgumentException | SecurityException e) {
-                            Slog.e(
-                                    TAG,
-                                    "Cannot adjust volume: direction=" + direction
-                                            + ", stream=" + stream + ", flags=" + flags
-                                            + ", opPackageName=" + opPackageName + ", uid=" + uid
-                                            + ", useSuggested=" + useSuggested
-                                            + ", previousFlagPlaySound=" + previousFlagPlaySound,
-                                    e);
-                        }
-                    }
-                });
+                () ->
+                        adjustSuggestedStreamVolumeForUid(
+                                stream,
+                                direction,
+                                flags,
+                                useSuggested,
+                                previousFlagPlaySound,
+                                opPackageName,
+                                uid,
+                                pid));
+    }
+
+    private void adjustSuggestedStreamVolumeForUid(
+            int stream,
+            int direction,
+            int flags,
+            boolean useSuggested,
+            int previousFlagPlaySound,
+            String opPackageName,
+            int uid,
+            int pid) {
+        try {
+            if (useSuggested) {
+                if (AudioSystem.isStreamActive(stream, 0)) {
+                    mAudioManager.adjustSuggestedStreamVolumeForUid(
+                            stream,
+                            direction,
+                            flags,
+                            opPackageName,
+                            uid,
+                            pid,
+                            mContext.getApplicationInfo().targetSdkVersion);
+                } else {
+                    mAudioManager.adjustSuggestedStreamVolumeForUid(
+                            AudioManager.USE_DEFAULT_STREAM_TYPE,
+                            direction,
+                            flags | previousFlagPlaySound,
+                            opPackageName,
+                            uid,
+                            pid,
+                            mContext.getApplicationInfo().targetSdkVersion);
+                }
+            } else {
+                mAudioManager.adjustStreamVolumeForUid(
+                        stream,
+                        direction,
+                        flags,
+                        opPackageName,
+                        uid,
+                        pid,
+                        mContext.getApplicationInfo().targetSdkVersion);
+            }
+        } catch (IllegalArgumentException | SecurityException e) {
+            Slog.e(
+                    TAG,
+                    "Cannot adjust volume: direction=" + direction
+                            + ", stream=" + stream
+                            + ", flags=" + flags
+                            + ", opPackageName=" + opPackageName
+                            + ", uid=" + uid
+                            + ", useSuggested=" + useSuggested
+                            + ", previousFlagPlaySound=" + previousFlagPlaySound,
+                    e);
+        }
     }
 
     private void logCallbackException(
@@ -818,7 +849,7 @@
             }
         }
         if (deadCallbackHolders != null) {
-            mControllerCallbackHolders.removeAll(deadCallbackHolders);
+            removeControllerHoldersSafely(deadCallbackHolders);
         }
     }
 
@@ -845,7 +876,7 @@
             }
         }
         if (deadCallbackHolders != null) {
-            mControllerCallbackHolders.removeAll(deadCallbackHolders);
+            removeControllerHoldersSafely(deadCallbackHolders);
         }
     }
 
@@ -880,7 +911,7 @@
             }
         }
         if (deadCallbackHolders != null) {
-            mControllerCallbackHolders.removeAll(deadCallbackHolders);
+            removeControllerHoldersSafely(deadCallbackHolders);
         }
     }
 
@@ -907,7 +938,7 @@
             }
         }
         if (deadCallbackHolders != null) {
-            mControllerCallbackHolders.removeAll(deadCallbackHolders);
+            removeControllerHoldersSafely(deadCallbackHolders);
         }
     }
 
@@ -934,7 +965,7 @@
             }
         }
         if (deadCallbackHolders != null) {
-            mControllerCallbackHolders.removeAll(deadCallbackHolders);
+            removeControllerHoldersSafely(deadCallbackHolders);
         }
     }
 
@@ -961,7 +992,7 @@
             }
         }
         if (deadCallbackHolders != null) {
-            mControllerCallbackHolders.removeAll(deadCallbackHolders);
+            removeControllerHoldersSafely(deadCallbackHolders);
         }
     }
 
@@ -986,7 +1017,7 @@
             }
         }
         if (deadCallbackHolders != null) {
-            mControllerCallbackHolders.removeAll(deadCallbackHolders);
+            removeControllerHoldersSafely(deadCallbackHolders);
         }
     }
 
@@ -1011,7 +1042,7 @@
             }
         }
         // After notifying clear all listeners
-        mControllerCallbackHolders.clear();
+        removeControllerHoldersSafely(null);
     }
 
     private PlaybackState getStateWithUpdatedPosition() {
@@ -1059,6 +1090,17 @@
         return -1;
     }
 
+    private void removeControllerHoldersSafely(
+            Collection<ISessionControllerCallbackHolder> holders) {
+        synchronized (mLock) {
+            if (holders == null) {
+                mControllerCallbackHolders.clear();
+            } else {
+                mControllerCallbackHolders.removeAll(holders);
+            }
+        }
+    }
+
     private PlaybackInfo getVolumeAttributes() {
         int volumeType;
         AudioAttributes attributes;
@@ -1078,16 +1120,14 @@
                 volumeType, VOLUME_CONTROL_ABSOLUTE, max, current, attributes, null);
     }
 
-    private final Runnable mClearOptimisticVolumeRunnable = new Runnable() {
-        @Override
-        public void run() {
-            boolean needUpdate = (mOptimisticVolume != mCurrentVolume);
-            mOptimisticVolume = -1;
-            if (needUpdate) {
-                pushVolumeUpdate();
-            }
-        }
-    };
+    private final Runnable mClearOptimisticVolumeRunnable =
+            () -> {
+                boolean needUpdate = (mOptimisticVolume != mCurrentVolume);
+                mOptimisticVolume = -1;
+                if (needUpdate) {
+                    pushVolumeUpdate();
+                }
+            };
 
     @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS)
     private static boolean componentNameExists(
diff --git a/services/core/java/com/android/server/media/MediaSessionRecordImpl.java b/services/core/java/com/android/server/media/MediaSessionRecordImpl.java
index e4b2fad..0999199 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecordImpl.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecordImpl.java
@@ -17,6 +17,7 @@
 package com.android.server.media;
 
 import android.app.ForegroundServiceDelegationOptions;
+import android.app.Notification;
 import android.media.AudioManager;
 import android.media.session.PlaybackState;
 import android.os.ResultReceiver;
@@ -153,6 +154,9 @@
      */
     public abstract boolean canHandleVolumeKey();
 
+    /** Returns whether this session is linked to the passed notification. */
+    abstract boolean isLinkedToNotification(Notification notification);
+
     /**
      * Get session policies from custom policy provider set when MediaSessionRecord is instantiated.
      * If custom policy does not exist, will return null.
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index e2163c5..53c32cf 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -32,6 +32,7 @@
 import android.app.ActivityManagerInternal;
 import android.app.ForegroundServiceDelegationOptions;
 import android.app.KeyguardManager;
+import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.usage.UsageStatsManager;
@@ -81,6 +82,8 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
+import android.service.notification.NotificationListenerService;
+import android.service.notification.StatusBarNotification;
 import android.speech.RecognizerIntent;
 import android.text.TextUtils;
 import android.util.Log;
@@ -105,6 +108,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -136,9 +140,9 @@
     /**
      * Action reported to UsageStatsManager when a media session is no longer active and user
      * engaged for a given app. If media session only pauses for a brief time the event will not
-     * necessarily be reported in case user is still "engaging" and will restart it momentarily.
+     * necessarily be reported in case user is still "engaged" and will restart it momentarily.
      * In such case, action may be reported after a short delay to ensure user is truly no longer
-     * engaging. Afterwards, the app is no longer expected to show an ongoing notification.
+     * engaged. Afterwards, the app is no longer expected to show an ongoing notification.
      */
     private static final String USAGE_STATS_ACTION_STOP = "stop";
     private static final String USAGE_STATS_CATEGORY = "android.media";
@@ -164,14 +168,35 @@
 
     private KeyguardManager mKeyguardManager;
     private AudioManager mAudioManager;
+    private NotificationListener mNotificationListener;
     private boolean mHasFeatureLeanback;
     private ActivityManagerInternal mActivityManagerInternal;
     private UsageStatsManagerInternal mUsageStatsManagerInternal;
 
-    /* Maps uid with all user engaging session tokens associated to it */
-    private final SparseArray<Set<MediaSessionRecordImpl>> mUserEngagingSessions =
+    /**
+     * Maps uid with all user engaged session records associated to it. It's used for logging start
+     * and stop events to UsageStatsManagerInternal. This collection contains MediaSessionRecord(s)
+     * and MediaSession2Record(s).
+     * When the media session is paused, the stop event is being logged immediately unlike fgs which
+     * waits for a certain timeout before considering it disengaged.
+     */
+    private final SparseArray<Set<MediaSessionRecordImpl>> mUserEngagedSessionsForUsageLogging =
             new SparseArray<>();
 
+    /**
+     * Maps uid with all user engaged session records associated to it. It's used for calling
+     * ActivityManagerInternal startFGS and stopFGS. This collection doesn't contain
+     * MediaSession2Record(s). When the media session is paused, There exists a timeout before
+     * calling stopFGS unlike usage logging which considers it disengaged immediately.
+     */
+    @GuardedBy("mLock")
+    private final Map<Integer, Set<MediaSessionRecordImpl>> mUserEngagedSessionsForFgs =
+            new HashMap<>();
+
+    /* Maps uid with all media notifications associated to it */
+    @GuardedBy("mLock")
+    private final Map<Integer, Set<Notification>> mMediaNotifications = new HashMap<>();
+
     // The FullUserRecord of the current users. (i.e. The foreground user that isn't a profile)
     // It's always not null after the MediaSessionService is started.
     private FullUserRecord mCurrentFullUserRecord;
@@ -228,6 +253,7 @@
         mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent");
         mNotificationManager = mContext.getSystemService(NotificationManager.class);
         mAudioManager = mContext.getSystemService(AudioManager.class);
+        mNotificationListener = new NotificationListener();
     }
 
     @Override
@@ -283,6 +309,16 @@
                 mCommunicationManager = mContext.getSystemService(MediaCommunicationManager.class);
                 mCommunicationManager.registerSessionCallback(new HandlerExecutor(mHandler),
                         mSession2TokenCallback);
+                if (Flags.enableNotifyingActivityManagerWithMediaSessionStatusChange()) {
+                    try {
+                        mNotificationListener.registerAsSystemService(
+                                mContext,
+                                new ComponentName(mContext, NotificationListener.class),
+                                UserHandle.USER_ALL);
+                    } catch (RemoteException e) {
+                        // Intra-process call, should never happen.
+                    }
+                }
                 break;
             case PHASE_ACTIVITY_MANAGER_READY:
                 MediaSessionDeviceConfig.initialize(mContext);
@@ -630,11 +666,52 @@
             return;
         }
         if (allowRunningInForeground) {
-            mActivityManagerInternal.startForegroundServiceDelegate(
-                    foregroundServiceDelegationOptions, /* connection= */ null);
+            onUserSessionEngaged(record);
         } else {
-            mActivityManagerInternal.stopForegroundServiceDelegate(
-                    foregroundServiceDelegationOptions);
+            onUserDisengaged(record);
+        }
+    }
+
+    private void onUserSessionEngaged(MediaSessionRecordImpl mediaSessionRecord) {
+        synchronized (mLock) {
+            int uid = mediaSessionRecord.getUid();
+            mUserEngagedSessionsForFgs.putIfAbsent(uid, new HashSet<>());
+            mUserEngagedSessionsForFgs.get(uid).add(mediaSessionRecord);
+            for (Notification mediaNotification : mMediaNotifications.getOrDefault(uid, Set.of())) {
+                if (mediaSessionRecord.isLinkedToNotification(mediaNotification)) {
+                    mActivityManagerInternal.startForegroundServiceDelegate(
+                            mediaSessionRecord.getForegroundServiceDelegationOptions(),
+                            /* connection= */ null);
+                    return;
+                }
+            }
+        }
+    }
+
+    private void onUserDisengaged(MediaSessionRecordImpl mediaSessionRecord) {
+        synchronized (mLock) {
+            int uid = mediaSessionRecord.getUid();
+            if (mUserEngagedSessionsForFgs.containsKey(uid)) {
+                mUserEngagedSessionsForFgs.get(uid).remove(mediaSessionRecord);
+                if (mUserEngagedSessionsForFgs.get(uid).isEmpty()) {
+                    mUserEngagedSessionsForFgs.remove(uid);
+                }
+            }
+
+            boolean shouldStopFgs = true;
+            for (MediaSessionRecordImpl sessionRecord :
+                    mUserEngagedSessionsForFgs.getOrDefault(uid, Set.of())) {
+                for (Notification mediaNotification : mMediaNotifications.getOrDefault(uid,
+                        Set.of())) {
+                    if (sessionRecord.isLinkedToNotification(mediaNotification)) {
+                        shouldStopFgs = false;
+                    }
+                }
+            }
+            if (shouldStopFgs) {
+                mActivityManagerInternal.stopForegroundServiceDelegate(
+                        mediaSessionRecord.getForegroundServiceDelegationOptions());
+            }
         }
     }
 
@@ -646,18 +723,18 @@
         String packageName = record.getPackageName();
         int sessionUid = record.getUid();
         if (userEngaged) {
-            if (!mUserEngagingSessions.contains(sessionUid)) {
-                mUserEngagingSessions.put(sessionUid, new HashSet<>());
+            if (!mUserEngagedSessionsForUsageLogging.contains(sessionUid)) {
+                mUserEngagedSessionsForUsageLogging.put(sessionUid, new HashSet<>());
                 reportUserInteractionEvent(
-                    USAGE_STATS_ACTION_START, record.getUserId(), packageName);
+                        USAGE_STATS_ACTION_START, record.getUserId(), packageName);
             }
-            mUserEngagingSessions.get(sessionUid).add(record);
-        } else if (mUserEngagingSessions.contains(sessionUid)) {
-            mUserEngagingSessions.get(sessionUid).remove(record);
-            if (mUserEngagingSessions.get(sessionUid).isEmpty()) {
+            mUserEngagedSessionsForUsageLogging.get(sessionUid).add(record);
+        } else if (mUserEngagedSessionsForUsageLogging.contains(sessionUid)) {
+            mUserEngagedSessionsForUsageLogging.get(sessionUid).remove(record);
+            if (mUserEngagedSessionsForUsageLogging.get(sessionUid).isEmpty()) {
                 reportUserInteractionEvent(
-                    USAGE_STATS_ACTION_STOP, record.getUserId(), packageName);
-                mUserEngagingSessions.remove(sessionUid);
+                        USAGE_STATS_ACTION_STOP, record.getUserId(), packageName);
+                mUserEngagedSessionsForUsageLogging.remove(sessionUid);
             }
         }
     }
@@ -3043,4 +3120,88 @@
             obtainMessage(msg, userIdInteger).sendToTarget();
         }
     }
+
+    private final class NotificationListener extends NotificationListenerService {
+        @Override
+        public void onNotificationPosted(StatusBarNotification sbn) {
+            super.onNotificationPosted(sbn);
+            Notification postedNotification = sbn.getNotification();
+            int uid = sbn.getUid();
+
+            if (!postedNotification.isMediaNotification()) {
+                return;
+            }
+            synchronized (mLock) {
+                mMediaNotifications.putIfAbsent(uid, new HashSet<>());
+                mMediaNotifications.get(uid).add(postedNotification);
+                for (MediaSessionRecordImpl mediaSessionRecord :
+                        mUserEngagedSessionsForFgs.getOrDefault(uid, Set.of())) {
+                    ForegroundServiceDelegationOptions foregroundServiceDelegationOptions =
+                            mediaSessionRecord.getForegroundServiceDelegationOptions();
+                    if (mediaSessionRecord.isLinkedToNotification(postedNotification)
+                            && foregroundServiceDelegationOptions != null) {
+                        mActivityManagerInternal.startForegroundServiceDelegate(
+                                foregroundServiceDelegationOptions,
+                                /* connection= */ null);
+                        return;
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void onNotificationRemoved(StatusBarNotification sbn) {
+            super.onNotificationRemoved(sbn);
+            Notification removedNotification = sbn.getNotification();
+            int uid = sbn.getUid();
+            if (!removedNotification.isMediaNotification()) {
+                return;
+            }
+            synchronized (mLock) {
+                Set<Notification> uidMediaNotifications = mMediaNotifications.get(uid);
+                if (uidMediaNotifications != null) {
+                    uidMediaNotifications.remove(removedNotification);
+                    if (uidMediaNotifications.isEmpty()) {
+                        mMediaNotifications.remove(uid);
+                    }
+                }
+
+                MediaSessionRecordImpl notificationRecord =
+                        getLinkedMediaSessionRecord(uid, removedNotification);
+
+                if (notificationRecord == null) {
+                    return;
+                }
+
+                boolean shouldStopFgs = true;
+                for (MediaSessionRecordImpl mediaSessionRecord :
+                        mUserEngagedSessionsForFgs.getOrDefault(uid, Set.of())) {
+                    for (Notification mediaNotification :
+                            mMediaNotifications.getOrDefault(uid, Set.of())) {
+                        if (mediaSessionRecord.isLinkedToNotification(mediaNotification)) {
+                            shouldStopFgs = false;
+                        }
+                    }
+                }
+                if (shouldStopFgs
+                        && notificationRecord.getForegroundServiceDelegationOptions() != null) {
+                    mActivityManagerInternal.stopForegroundServiceDelegate(
+                            notificationRecord.getForegroundServiceDelegationOptions());
+                }
+            }
+        }
+
+        private MediaSessionRecordImpl getLinkedMediaSessionRecord(
+                int uid, Notification notification) {
+            synchronized (mLock) {
+                for (MediaSessionRecordImpl mediaSessionRecord :
+                        mUserEngagedSessionsForFgs.getOrDefault(uid, Set.of())) {
+                    if (mediaSessionRecord.isLinkedToNotification(notification)) {
+                        return mediaSessionRecord;
+                    }
+                }
+            }
+            return null;
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
index f7210dd..8df38a8 100644
--- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
+++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
@@ -86,12 +86,11 @@
     @GuardedBy("mTransferLock")
     @Nullable private volatile SessionCreationRequest mPendingTransferRequest;
 
-    SystemMediaRoute2Provider(Context context, UserHandle user) {
+    SystemMediaRoute2Provider(Context context, UserHandle user, Looper looper) {
         super(COMPONENT_NAME);
         mIsSystemRouteProvider = true;
         mContext = context;
         mUser = user;
-        Looper looper = Looper.getMainLooper();
         mHandler = new Handler(looper);
 
         mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
@@ -336,6 +335,14 @@
                     }
                 }
             }
+
+            if (Flags.enableBuiltInSpeakerRouteSuitabilityStatuses()) {
+                RoutingSessionInfo oldSessionInfo = mSessionInfos.get(0);
+                builder.setTransferReason(oldSessionInfo.getTransferReason())
+                        .setTransferInitiator(oldSessionInfo.getTransferInitiatorUserHandle(),
+                                oldSessionInfo.getTransferInitiatorPackageName());
+            }
+
             return builder.setProviderId(mUniqueId).build();
         }
     }
@@ -646,7 +653,11 @@
                 return;
             }
 
-            updateVolume();
+            if (Flags.enableMr2ServiceNonMainBgThread()) {
+                mHandler.post(SystemMediaRoute2Provider.this::updateVolume);
+            } else {
+                updateVolume();
+            }
         }
     }
 }
diff --git a/services/core/java/com/android/server/media/TEST_MAPPING b/services/core/java/com/android/server/media/TEST_MAPPING
index b3e5b9e..43e2afd 100644
--- a/services/core/java/com/android/server/media/TEST_MAPPING
+++ b/services/core/java/com/android/server/media/TEST_MAPPING
@@ -2,9 +2,7 @@
   "presubmit": [
     {
       "name": "CtsMediaBetterTogetherTestCases"
-    }
-  ],
-  "postsubmit": [
+    },
     {
       "name": "MediaRouterServiceTests"
     }
diff --git a/services/core/java/com/android/server/net/Android.bp b/services/core/java/com/android/server/net/Android.bp
index 71d8e6b..3ac2d23 100644
--- a/services/core/java/com/android/server/net/Android.bp
+++ b/services/core/java/com/android/server/net/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "net_flags",
     package: "com.android.server.net",
+    container: "system",
     srcs: ["*.aconfig"],
 }
 
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 25095ed..22f5332 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -1214,16 +1214,14 @@
                 return false;
             }
             final int previousProcState = previousInfo.procState;
-            if (mBackgroundNetworkRestricted && (previousProcState >= BACKGROUND_THRESHOLD_STATE)
-                    != (newProcState >= BACKGROUND_THRESHOLD_STATE)) {
-                // Proc-state change crossed BACKGROUND_THRESHOLD_STATE: Network rules for the
-                // BACKGROUND chain may change.
-                return true;
-            }
             if ((previousProcState <= TOP_THRESHOLD_STATE)
-                    != (newProcState <= TOP_THRESHOLD_STATE)) {
-                // Proc-state change crossed TOP_THRESHOLD_STATE: Network rules for the
-                // LOW_POWER_STANDBY chain may change.
+                    || (newProcState <= TOP_THRESHOLD_STATE)) {
+                // If the proc-state change crossed TOP_THRESHOLD_STATE, network rules for the
+                // LOW_POWER_STANDBY chain may change, so we need to evaluate the transition.
+                // In addition, we always process changes when the new process state is
+                // TOP_THRESHOLD_STATE or below, to avoid situations where the TOP app ends up
+                // waiting for NPMS to finish processing newProcStateSeq, even when it was
+                // redundant (b/327303931).
                 return true;
             }
             if ((previousProcState <= FOREGROUND_THRESHOLD_STATE)
@@ -1232,6 +1230,12 @@
                 // different chains may change.
                 return true;
             }
+            if (mBackgroundNetworkRestricted && (previousProcState >= BACKGROUND_THRESHOLD_STATE)
+                    != (newProcState >= BACKGROUND_THRESHOLD_STATE)) {
+                // Proc-state change crossed BACKGROUND_THRESHOLD_STATE: Network rules for the
+                // BACKGROUND chain may change.
+                return true;
+            }
             final int networkCapabilities = PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK
                     | PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK;
             if ((previousInfo.capability & networkCapabilities)
diff --git a/services/core/java/com/android/server/net/flags.aconfig b/services/core/java/com/android/server/net/flags.aconfig
index 419665a..d9491de5 100644
--- a/services/core/java/com/android/server/net/flags.aconfig
+++ b/services/core/java/com/android/server/net/flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.net"
+container: "system"
 
 flag {
     name: "network_blocked_for_top_sleeping_and_above"
diff --git a/services/core/java/com/android/server/notification/Android.bp b/services/core/java/com/android/server/notification/Android.bp
index 9be4358..d757470 100644
--- a/services/core/java/com/android/server/notification/Android.bp
+++ b/services/core/java/com/android/server/notification/Android.bp
@@ -10,6 +10,7 @@
 aconfig_declarations {
     name: "notification_flags",
     package: "com.android.server.notification",
+    container: "system",
     srcs: [
         "flags.aconfig",
     ],
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 3ecc58e..3949dfe 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -25,6 +25,8 @@
 import static android.os.UserHandle.USER_SYSTEM;
 import static android.service.notification.NotificationListenerService.META_DATA_DEFAULT_AUTOBIND;
 
+import static com.android.server.notification.NotificationManagerService.privateSpaceFlagsEnabled;
+
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.app.ActivityManager;
@@ -1433,7 +1435,7 @@
     protected void rebindServices(boolean forceRebind, int userToRebind) {
         if (DEBUG) Slog.d(TAG, "rebindServices " + forceRebind + " " + userToRebind);
         IntArray userIds = mUserProfiles.getCurrentProfileIds();
-        boolean rebindAllCurrentUsers = mUserProfiles.isProfileUser(userToRebind)
+        boolean rebindAllCurrentUsers = mUserProfiles.isProfileUser(userToRebind, mContext)
                 && allowRebindForParentUser();
         if (userToRebind != USER_ALL && !rebindAllCurrentUsers) {
             userIds = new IntArray(1);
@@ -1615,7 +1617,8 @@
         intent.putExtra(Intent.EXTRA_CLIENT_LABEL, mConfig.clientLabel);
 
         final ActivityOptions activityOptions = ActivityOptions.makeBasic();
-        activityOptions.setIgnorePendingIntentCreatorForegroundState(true);
+        activityOptions.setPendingIntentCreatorBackgroundActivityStartMode(
+                ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_DENIED);
         final PendingIntent pendingIntent = PendingIntent.getActivity(
                 mContext, 0, new Intent(mConfig.settingsAction), PendingIntent.FLAG_IMMUTABLE,
                 activityOptions.toBundle());
@@ -1958,7 +1961,7 @@
          * from receiving events from the profile.
          */
         public boolean isPermittedForProfile(int userId) {
-            if (!mUserProfiles.isProfileUser(userId)) {
+            if (!mUserProfiles.isProfileUser(userId, mContext)) {
                 return true;
             }
             DevicePolicyManager dpm =
@@ -2036,16 +2039,26 @@
             }
         }
 
-        public boolean isProfileUser(int userId) {
+        public boolean isProfileUser(int userId, Context context) {
             synchronized (mCurrentProfiles) {
                 UserInfo user = mCurrentProfiles.get(userId);
                 if (user == null) {
                     return false;
                 }
-                if (user.isManagedProfile() || user.isCloneProfile()) {
-                    return true;
+                if (privateSpaceFlagsEnabled()) {
+                    return user.isProfile() && hasParent(user, context);
                 }
-                return false;
+                return user.isManagedProfile() || user.isCloneProfile();
+            }
+        }
+
+        boolean hasParent(UserInfo profile, Context context) {
+            final long identity = Binder.clearCallingIdentity();
+            try {
+                UserManager um = context.getSystemService(UserManager.class);
+                return um.getProfileParent(profile.id) != null;
+            } finally {
+                Binder.restoreCallingIdentity(identity);
             }
         }
     }
diff --git a/services/core/java/com/android/server/notification/NotificationAttentionHelper.java b/services/core/java/com/android/server/notification/NotificationAttentionHelper.java
index 097daf2..96f32f3 100644
--- a/services/core/java/com/android/server/notification/NotificationAttentionHelper.java
+++ b/services/core/java/com/android/server/notification/NotificationAttentionHelper.java
@@ -16,6 +16,7 @@
 
 package com.android.server.notification;
 
+import static android.app.Flags.updateRankingTime;
 import static android.app.Notification.FLAG_INSISTENT;
 import static android.app.Notification.FLAG_ONLY_ALERT_ONCE;
 import static android.app.NotificationManager.IMPORTANCE_MIN;
@@ -496,6 +497,11 @@
                     Slog.v(TAG, "INTERRUPTIVENESS: "
                             + record.getKey() + " is interruptive: alerted");
                 }
+                if (updateRankingTime()) {
+                    if (buzz || beep) {
+                        record.resetRankingTime();
+                    }
+                }
             }
         }
         final int buzzBeepBlinkLoggingCode =
@@ -508,12 +514,16 @@
             EventLogTags.writeNotificationAlert(key, buzz ? 1 : 0, beep ? 1 : 0, blink ? 1 : 0,
                     getPolitenessState(record));
         }
-        record.setAudiblyAlerted(buzz || beep);
         if (Flags.politeNotifications()) {
             // Update last alert time
             if (buzz || beep) {
                 mStrategy.setLastNotificationUpdateTimeMs(record, System.currentTimeMillis());
             }
+
+            record.setAudiblyAlerted((buzz || beep)
+                    && getPolitenessState(record) != PolitenessStrategy.POLITE_STATE_MUTED);
+        } else {
+            record.setAudiblyAlerted(buzz || beep);
         }
         return buzzBeepBlinkLoggingCode;
     }
@@ -672,7 +682,7 @@
 
         // The user can choose to apply cooldown for all apps/conversations only from the
         // Settings app
-        if (!mNotificationCooldownApplyToAll && record.getChannel().getConversationId() == null) {
+        if (!mNotificationCooldownApplyToAll && !record.isConversation()) {
             return false;
         }
 
@@ -1197,7 +1207,7 @@
             setLastNotificationUpdateTimeMs(record, 0);
         }
 
-        public final @PolitenessState int getPolitenessState(final NotificationRecord record) {
+        public @PolitenessState int getPolitenessState(final NotificationRecord record) {
             return mVolumeStates.getOrDefault(getChannelKey(record), POLITE_STATE_DEFAULT);
         }
 
@@ -1358,7 +1368,12 @@
 
                 final String key = getChannelKey(record);
                 @PolitenessState final int currState = getPolitenessState(record);
-                @PolitenessState int nextState = getNextState(currState, timeSinceLastNotif);
+                @PolitenessState int nextState;
+                if (Flags.politeNotificationsAttnUpdate()) {
+                    nextState = getNextState(currState, timeSinceLastNotif, record);
+                } else {
+                    nextState = getNextState(currState, timeSinceLastNotif);
+                }
 
                 if (DEBUG) {
                     Log.i(TAG,
@@ -1373,6 +1388,26 @@
             mAppStrategy.onNotificationPosted(record);
         }
 
+        @PolitenessState int getNextState(@PolitenessState final int currState,
+                final long timeSinceLastNotif, final NotificationRecord record) {
+            // Mute all except priority conversations
+            if (!isAvalancheExempted(record)) {
+                return POLITE_STATE_MUTED;
+            }
+            if (isAvalancheExemptedFullVolume(record)) {
+                return POLITE_STATE_DEFAULT;
+            }
+            return getNextState(currState, timeSinceLastNotif);
+        }
+
+        public @PolitenessState int getPolitenessState(final NotificationRecord record) {
+            if (isAvalancheActive()) {
+                return super.getPolitenessState(record);
+            } else {
+                return mAppStrategy.getPolitenessState(record);
+            }
+        }
+
         @Override
         public float getSoundVolume(final NotificationRecord record) {
             if (isAvalancheActive()) {
@@ -1390,13 +1425,27 @@
 
         @Override
         String getChannelKey(final NotificationRecord record) {
-            // If the user explicitly changed the channel notification sound:
-            // handle as a separate channel
-            if (record.getChannel().hasUserSetSound()) {
-                return super.getChannelKey(record);
+            if (isAvalancheActive()) {
+                if (Flags.politeNotificationsAttnUpdate()) {
+                    // Treat high importance conversations independently
+                    if (isAvalancheExempted(record)) {
+                        return super.getChannelKey(record);
+                    } else {
+                        // Use one global key per user
+                        return record.getSbn().getNormalizedUserId() + ":" + COMMON_KEY;
+                    }
+                } else {
+                    // If the user explicitly changed the channel notification sound:
+                    // handle as a separate channel
+                    if (record.getChannel().hasUserSetSound()) {
+                        return super.getChannelKey(record);
+                    } else {
+                        // Use one global key per user
+                        return record.getSbn().getNormalizedUserId() + ":" + COMMON_KEY;
+                    }
+                }
             } else {
-                // Use one global key per user
-                return record.getSbn().getNormalizedUserId() + ":" + COMMON_KEY;
+                return mAppStrategy.getChannelKey(record);
             }
         }
 
@@ -1409,10 +1458,19 @@
         }
 
         long getLastNotificationUpdateTimeMs(final NotificationRecord record) {
-            if (record.getChannel().hasUserSetSound()) {
-                return super.getLastNotificationUpdateTimeMs(record);
+            if (Flags.politeNotificationsAttnUpdate()) {
+                // Mute all except priority conversations
+                if (isAvalancheExempted(record)) {
+                    return super.getLastNotificationUpdateTimeMs(record);
+                } else {
+                    return mLastNotificationTimestamp;
+                }
             } else {
-                return mLastNotificationTimestamp;
+                if (record.getChannel().hasUserSetSound()) {
+                    return super.getLastNotificationUpdateTimeMs(record);
+                } else {
+                    return mLastNotificationTimestamp;
+                }
             }
         }
 
@@ -1439,6 +1497,51 @@
         void setTriggerTimeMs(long timestamp) {
             mLastAvalancheTriggerTimestamp = timestamp;
         }
+
+        private boolean isAvalancheExemptedFullVolume(final NotificationRecord record) {
+            // important conversation
+            if (record.isConversation()
+                    && (record.getImportance() > NotificationManager.IMPORTANCE_DEFAULT
+                    || record.getChannel().isImportantConversation())) {
+                return true;
+            }
+
+            // call notification
+            if (record.getNotification().isStyle(Notification.CallStyle.class)) {
+                return true;
+            }
+
+            // alarm/reminder
+            final String category = record.getNotification().category;
+            if (Notification.CATEGORY_REMINDER.equals(category)
+                    || Notification.CATEGORY_EVENT.equals(category)) {
+                return true;
+            }
+
+            return false;
+        }
+
+        private boolean isAvalancheExempted(final NotificationRecord record) {
+            if (isAvalancheExemptedFullVolume(record)) {
+                return true;
+            }
+
+            // recent conversation
+            if (record.isConversation()
+                    && record.getNotification().when > mLastAvalancheTriggerTimestamp) {
+                return true;
+            }
+
+            if (record.getNotification().fullScreenIntent != null) {
+                return true;
+            }
+
+            if (record.getNotification().isColorized()) {
+                return true;
+            }
+
+            return false;
+        }
     }
 
     //======================  Observers  =============================
diff --git a/services/core/java/com/android/server/notification/NotificationChannelExtractor.java b/services/core/java/com/android/server/notification/NotificationChannelExtractor.java
index 2f60e42..bd73cb6 100644
--- a/services/core/java/com/android/server/notification/NotificationChannelExtractor.java
+++ b/services/core/java/com/android/server/notification/NotificationChannelExtractor.java
@@ -15,8 +15,16 @@
 */
 package com.android.server.notification;
 
+import static android.app.Flags.restrictAudioAttributesAlarm;
+import static android.app.Flags.restrictAudioAttributesCall;
+import static android.app.Flags.restrictAudioAttributesMedia;
+import static android.app.Notification.CATEGORY_ALARM;
+import static android.media.AudioAttributes.USAGE_NOTIFICATION;
+
+import android.app.Notification;
 import android.app.NotificationChannel;
 import android.content.Context;
+import android.media.AudioAttributes;
 import android.util.Slog;
 
 /**
@@ -50,6 +58,36 @@
                 record.getSbn().getShortcutId(), true, false);
         record.updateNotificationChannel(updatedChannel);
 
+        if (restrictAudioAttributesCall() || restrictAudioAttributesAlarm()
+                || restrictAudioAttributesMedia()) {
+            AudioAttributes attributes = record.getChannel().getAudioAttributes();
+            boolean updateAttributes =  false;
+            if (restrictAudioAttributesCall()
+                    && !record.getNotification().isStyle(Notification.CallStyle.class)
+                    && attributes.getUsage() == AudioAttributes.USAGE_NOTIFICATION_RINGTONE) {
+                updateAttributes = true;
+            }
+            if (restrictAudioAttributesAlarm()
+                    && record.getNotification().category != CATEGORY_ALARM
+                    && attributes.getUsage() == AudioAttributes.USAGE_ALARM) {
+                updateAttributes = true;
+            }
+
+            if (restrictAudioAttributesMedia()
+                    && (attributes.getUsage() == AudioAttributes.USAGE_UNKNOWN
+                    || attributes.getUsage() == AudioAttributes.USAGE_MEDIA)) {
+                updateAttributes = true;
+            }
+
+            if (updateAttributes) {
+                NotificationChannel clone = record.getChannel().copy();
+                clone.setSound(clone.getSound(), new AudioAttributes.Builder(attributes)
+                        .setUsage(USAGE_NOTIFICATION)
+                        .build());
+                record.updateNotificationChannel(clone);
+            }
+        }
+
         return null;
     }
 
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index e80c79a8..956e10c 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -22,6 +22,8 @@
 import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
 import static android.app.ActivityManagerInternal.ServiceNotificationPolicy.NOT_FOREGROUND_SERVICE;
 import static android.app.AppOpsManager.MODE_ALLOWED;
+import static android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR;
+import static android.app.Flags.lifetimeExtensionRefactor;
 import static android.app.Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION;
 import static android.app.Notification.EXTRA_BUILDER_APPLICATION_INFO;
 import static android.app.Notification.EXTRA_LARGE_ICON_BIG;
@@ -34,7 +36,6 @@
 import static android.app.Notification.FLAG_BUBBLE;
 import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
 import static android.app.Notification.FLAG_FSI_REQUESTED_BUT_DENIED;
-import static android.app.Notification.FLAG_INSISTENT;
 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;
@@ -71,8 +72,6 @@
 import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_OFF;
 import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_ON;
 import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR;
-import static android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR;
-import static android.app.Flags.lifetimeExtensionRefactor;
 import static android.app.NotificationManager.zenModeFromInterruptionFilter;
 import static android.app.StatusBarManager.ACTION_KEYGUARD_PRIVATE_NOTIFICATIONS_CHANGED;
 import static android.app.StatusBarManager.EXTRA_KM_PRIVATE_NOTIFS_ALLOWED;
@@ -88,8 +87,6 @@
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
 import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.media.audio.Flags.focusExclusiveWithRecording;
-import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE;
 import static android.os.Flags.allowPrivateProfile;
 import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL;
 import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_NORMAL;
@@ -98,8 +95,8 @@
 import static android.os.UserHandle.USER_ALL;
 import static android.os.UserHandle.USER_NULL;
 import static android.os.UserHandle.USER_SYSTEM;
-import static android.service.notification.Flags.redactSensitiveNotificationsFromUntrustedListeners;
 import static android.service.notification.Flags.callstyleCallbackApi;
+import static android.service.notification.Flags.redactSensitiveNotificationsFromUntrustedListeners;
 import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ALERTING;
 import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_CONVERSATIONS;
 import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ONGOING;
@@ -139,8 +136,8 @@
 import static android.service.notification.NotificationListenerService.Ranking.RANKING_UNCHANGED;
 import static android.service.notification.NotificationListenerService.TRIM_FULL;
 import static android.service.notification.NotificationListenerService.TRIM_LIGHT;
-import static android.view.contentprotection.flags.Flags.rapidClearNotificationsByListenerAppOpEnabled;
 import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
+import static android.view.contentprotection.flags.Flags.rapidClearNotificationsByListenerAppOpEnabled;
 
 import static com.android.internal.util.FrameworkStatsLog.DND_MODE_RULE;
 import static com.android.internal.util.FrameworkStatsLog.PACKAGE_NOTIFICATION_CHANNEL_GROUP_PREFERENCES;
@@ -184,7 +181,6 @@
 import android.app.ITransientNotification;
 import android.app.ITransientNotificationCallback;
 import android.app.IUriGrantsManager;
-import android.app.KeyguardManager;
 import android.app.Notification;
 import android.app.Notification.MessagingStyle;
 import android.app.NotificationChannel;
@@ -198,7 +194,6 @@
 import android.app.RemoteServiceException.BadForegroundServiceNotificationException;
 import android.app.RemoteServiceException.BadUserInitiatedJobNotificationException;
 import android.app.StatsManager;
-import android.app.StatusBarManager;
 import android.app.UriGrantsManager;
 import android.app.admin.DevicePolicyManagerInternal;
 import android.app.backup.BackupManager;
@@ -237,10 +232,6 @@
 import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.graphics.drawable.Icon;
-import android.media.AudioAttributes;
-import android.media.AudioManager;
-import android.media.AudioManagerInternal;
-import android.media.IRingtonePlayer;
 import android.metrics.LogMaker;
 import android.net.Uri;
 import android.os.Binder;
@@ -269,7 +260,6 @@
 import android.os.Trace;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.os.VibrationEffect;
 import android.os.WorkSource;
 import android.permission.PermissionManager;
 import android.provider.DeviceConfig;
@@ -295,7 +285,6 @@
 import android.service.notification.ZenModeProto;
 import android.service.notification.ZenPolicy;
 import android.telecom.TelecomManager;
-import android.telephony.PhoneStateListener;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
@@ -312,7 +301,6 @@
 import android.util.Xml;
 import android.util.proto.ProtoOutputStream;
 import android.view.Display;
-import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
 import android.widget.RemoteViews;
 import android.widget.Toast;
@@ -352,7 +340,6 @@
 import com.android.server.SystemService;
 import com.android.server.job.JobSchedulerInternal;
 import com.android.server.lights.LightsManager;
-import com.android.server.lights.LogicalLight;
 import com.android.server.notification.GroupHelper.NotificationAttributes;
 import com.android.server.notification.ManagedServices.ManagedServiceInfo;
 import com.android.server.notification.ManagedServices.UserProfiles;
@@ -602,6 +589,8 @@
 
     private static final Duration POST_WAKE_LOCK_TIMEOUT = Duration.ofSeconds(30);
 
+    static final long NOTIFICATION_TTL = Duration.ofDays(3).toMillis();
+
     private IActivityManager mAm;
     private ActivityTaskManagerInternal mAtm;
     private ActivityManager mActivityManager;
@@ -612,8 +601,7 @@
     PackageManagerInternal mPackageManagerInternal;
     private PermissionManager mPermissionManager;
     private PermissionPolicyInternal mPermissionPolicyInternal;
-    AudioManager mAudioManager;
-    AudioManagerInternal mAudioManagerInternal;
+
     // Can be null for wear
     @Nullable StatusBarManagerInternal mStatusBar;
     private WindowManagerInternal mWindowManagerInternal;
@@ -641,34 +629,12 @@
     private final HandlerThread mRankingThread = new HandlerThread("ranker",
             Process.THREAD_PRIORITY_BACKGROUND);
 
-    private LogicalLight mNotificationLight;
-    LogicalLight mAttentionLight;
-
-    private boolean mUseAttentionLight;
-    boolean mHasLight = true;
-    boolean mSystemReady;
-
-    private boolean mDisableNotificationEffects;
-    private int mCallState;
-    private String mSoundNotificationKey;
-    private String mVibrateNotificationKey;
-
     private final SparseArray<ArraySet<ComponentName>> mListenersDisablingEffects =
             new SparseArray<>();
     private List<ComponentName> mEffectsSuppressors = new ArrayList<>();
     private int mListenerHints;  // right now, all hints are global
     private int mInterruptionFilter = NotificationListenerService.INTERRUPTION_FILTER_UNKNOWN;
 
-    // for enabling and disabling notification pulse behavior
-    boolean mScreenOn = true;
-    protected boolean mInCallStateOffHook = false;
-    boolean mNotificationPulseEnabled;
-
-    private Uri mInCallNotificationUri;
-    private AudioAttributes mInCallNotificationAudioAttributes;
-    private float mInCallNotificationVolume;
-    private Binder mCallNotificationToken = null;
-
     private SystemUiSystemPropertiesFlags.FlagResolver mFlagResolver;
 
     // used as a mutex for access to all active notifications & listeners
@@ -696,11 +662,6 @@
     // Used for rate limiting toasts by package.
     private MultiRateLimiter mToastRateLimiter;
 
-    private KeyguardManager mKeyguardManager;
-
-    // The last key in this list owns the hardware.
-    ArrayList<String> mLights = new ArrayList<>();
-
     private AppOpsManager mAppOps;
     private UsageStatsManagerInternal mAppUsageStats;
     private DevicePolicyManagerInternal mDpm;
@@ -725,7 +686,6 @@
     RankingHelper mRankingHelper;
     @VisibleForTesting
     PreferencesHelper mPreferencesHelper;
-    private VibratorHelper mVibratorHelper;
 
     private final UserProfiles mUserProfiles = new UserProfiles();
     private NotificationListeners mListeners;
@@ -751,8 +711,6 @@
     private GroupHelper mGroupHelper;
     private int mAutoGroupAtCount;
     private boolean mIsTelevision;
-    private boolean mIsAutomotive;
-    private boolean mNotificationEffectsEnabledForAutomotive;
     private DeviceConfig.OnPropertiesChangedListener mDeviceConfigChangedListener;
     protected NotificationAttentionHelper mAttentionHelper;
 
@@ -957,8 +915,7 @@
         final List<UserInfo> activeUsers = mUm.getUsers();
         for (UserInfo userInfo : activeUsers) {
             int userId = userInfo.getUserHandle().getIdentifier();
-            if (isNASMigrationDone(userId)
-                    || userInfo.isManagedProfile() || userInfo.isCloneProfile()) {
+            if (isNASMigrationDone(userId) || isProfileUser(userInfo)) {
                 continue;
             }
             List<ComponentName> allowedComponents = mAssistants.getAllowedComponents(userId);
@@ -989,6 +946,17 @@
                 Settings.Secure.NAS_SETTINGS_UPDATED, 0, userId) == 1);
     }
 
+    boolean isProfileUser(UserInfo userInfo) {
+        if (privateSpaceFlagsEnabled()) {
+            return userInfo.isProfile() && hasParent(userInfo);
+        }
+        return userInfo.isManagedProfile() || userInfo.isCloneProfile();
+    }
+
+    boolean hasParent(UserInfo profile) {
+        return mUmInternal.getProfileParentId(profile.id) != profile.id;
+    }
+
     protected void setDefaultAssistantForUser(int userId) {
         String overrideDefaultAssistantString = DeviceConfig.getProperty(
                 DeviceConfig.NAMESPACE_SYSTEMUI,
@@ -1097,8 +1065,7 @@
         XmlUtils.beginDocument(parser, TAG_NOTIFICATION_POLICY);
         boolean migratedManagedServices = false;
         UserInfo userInfo = mUmInternal.getUserInfo(userId);
-        boolean ineligibleForManagedServices = forRestore &&
-                (userInfo.isManagedProfile() || userInfo.isCloneProfile());
+        boolean ineligibleForManagedServices = forRestore && isProfileUser(userInfo);
         int outerDepth = parser.getDepth();
         while (XmlUtils.nextElementWithin(parser, outerDepth)) {
             if (ZenModeConfig.ZEN_TAG.equals(parser.getName())) {
@@ -1205,7 +1172,7 @@
         }
     }
 
-    private static boolean privateSpaceFlagsEnabled() {
+    protected static boolean privateSpaceFlagsEnabled() {
         return allowPrivateProfile() && android.multiuser.Flags.enablePrivateSpaceFeatures();
     }
 
@@ -1270,17 +1237,7 @@
         @Override
         public void onSetDisabled(int status) {
             synchronized (mNotificationLock) {
-                if (Flags.refactorAttentionHelper()) {
-                    mAttentionHelper.updateDisableNotificationEffectsLocked(status);
-                } else {
-                    mDisableNotificationEffects =
-                            (status & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) != 0;
-                    if (disableNotificationEffects(null) != null) {
-                        // cancel whatever's going on
-                        clearSoundLocked();
-                        clearVibrateLocked();
-                    }
-                }
+                mAttentionHelper.updateDisableNotificationEffectsLocked(status);
             }
         }
 
@@ -1363,7 +1320,29 @@
                 // Notifications that have been interacted with should no longer be lifetime
                 // extended.
                 if (lifetimeExtensionRefactor()) {
-                    r.getSbn().getNotification().flags &= ~FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+                    // This cancellation should only work if
+                    // the notification still has FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY
+                    // We wait for 200 milliseconds before posting the cancel, to allow the app
+                    // time to update the notification in response instead.
+                    // If that update goes through, the notification won't have the lifetime
+                    // extended flag, and this cancellation will be dropped.
+                    mHandler.scheduleCancelNotification(
+                            new CancelNotificationRunnable(
+                                    callingUid,
+                                    callingPid,
+                                    r.getSbn().getPackageName(),
+                                    r.getSbn().getTag(),
+                                    r.getSbn().getId(),
+                                    FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY /*=mustHaveFlags*/,
+                                    FLAG_NO_DISMISS /*=mustNotHaveFlags*/,
+                                    false /*=sendDelete*/,
+                                    r.getUserId(),
+                                    REASON_CLICK,
+                                    -1 /*=rank*/,
+                                    -1 /*=count*/,
+                                    null /*=listener*/,
+                                    SystemClock.elapsedRealtime()),
+                            200);
                 }
             }
         }
@@ -1421,13 +1400,7 @@
         public void clearEffects() {
             synchronized (mNotificationLock) {
                 if (DBG) Slog.d(TAG, "clearEffects");
-                if (Flags.refactorAttentionHelper()) {
-                    mAttentionHelper.clearAttentionEffects();
-                } else {
-                    clearSoundLocked();
-                    clearVibrateLocked();
-                    clearLightsLocked();
-                }
+                mAttentionHelper.clearAttentionEffects();
             }
         }
 
@@ -1695,11 +1668,7 @@
                         int changedFlags = data.getFlags() ^ flags;
                         if ((changedFlags & FLAG_SUPPRESS_NOTIFICATION) != 0) {
                             // Suppress notification flag changed, clear any effects
-                            if (Flags.refactorAttentionHelper()) {
-                                mAttentionHelper.clearEffectsLocked(key);
-                            } else {
-                                clearEffectsLocked(key);
-                            }
+                            mAttentionHelper.clearEffectsLocked(key);
                         }
                         data.setFlags(flags);
                         // Shouldn't alert again just because of a flag change.
@@ -1832,60 +1801,13 @@
                 hasSensitiveContent, lifespanMs);
     }
 
-    @GuardedBy("mNotificationLock")
-    void clearSoundLocked() {
-        mSoundNotificationKey = null;
-        final long identity = Binder.clearCallingIdentity();
-        try {
-            final IRingtonePlayer player = mAudioManager.getRingtonePlayer();
-            if (player != null) {
-                player.stopAsync();
-            }
-        } catch (RemoteException e) {
-        } finally {
-            Binder.restoreCallingIdentity(identity);
-        }
-    }
-
-    @GuardedBy("mNotificationLock")
-    void clearVibrateLocked() {
-        mVibrateNotificationKey = null;
-        final long identity = Binder.clearCallingIdentity();
-        try {
-            mVibratorHelper.cancelVibration();
-        } finally {
-            Binder.restoreCallingIdentity(identity);
-        }
-    }
-
-    @GuardedBy("mNotificationLock")
-    private void clearLightsLocked() {
-        // light
-        mLights.clear();
-        updateLightsLocked();
-    }
-
-    @GuardedBy("mNotificationLock")
-    private void clearEffectsLocked(String key) {
-        if (key.equals(mSoundNotificationKey)) {
-            clearSoundLocked();
-        }
-        if (key.equals(mVibrateNotificationKey)) {
-            clearVibrateLocked();
-        }
-        boolean removed = mLights.remove(key);
-        if (removed) {
-            updateLightsLocked();
-        }
-    }
-
     protected final BroadcastReceiver mLocaleChangeReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             if (Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())) {
                 // update system notification channels
                 SystemNotificationChannels.createAll(context);
-                mZenModeHelper.updateDefaultZenRules(Binder.getCallingUid());
+                mZenModeHelper.updateZenRulesOnLocaleChange();
                 mPreferencesHelper.onLocaleChanged(context, ActivityManager.getCurrentUser());
             }
         }
@@ -1933,14 +1855,6 @@
                                 FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB
                                         | FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY,
                                 true, record.getUserId(), REASON_TIMEOUT, null);
-                        // If cancellation will be prevented due to lifetime extension, we send an
-                        // update to system UI.
-                        final int packageImportance = getPackageImportanceWithIdentity(
-                                record.getSbn().getPackageName());
-                        synchronized (mNotificationLock) {
-                            maybeNotifySystemUiListenerLifetimeExtendedLocked(record,
-                                    record.getSbn().getPackageName(), packageImportance);
-                        }
                     } else {
                         cancelNotification(record.getSbn().getUid(),
                                 record.getSbn().getInitialPid(),
@@ -2068,27 +1982,6 @@
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
 
-            if (!Flags.refactorAttentionHelper()) {
-                if (action.equals(Intent.ACTION_SCREEN_ON)) {
-                    // Keep track of screen on/off state, but do not turn off the notification light
-                    // until user passes through the lock screen or views the notification.
-                    mScreenOn = true;
-                    updateNotificationPulse();
-                } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
-                    mScreenOn = false;
-                    updateNotificationPulse();
-                } else if (action.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
-                    mInCallStateOffHook = TelephonyManager.EXTRA_STATE_OFFHOOK
-                        .equals(intent.getStringExtra(TelephonyManager.EXTRA_STATE));
-                    updateNotificationPulse();
-                } else if (action.equals(Intent.ACTION_USER_PRESENT)) {
-                    // turn off LED when user passes through lock screen
-                    if (mNotificationLight != null) {
-                        mNotificationLight.turnOff();
-                    }
-                }
-            }
-
             if (action.equals(Intent.ACTION_USER_STOPPED)) {
                 int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                 if (userHandle >= 0) {
@@ -2106,7 +1999,7 @@
             } else if (action.equals(Intent.ACTION_USER_SWITCHED)) {
                 final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
                 mUserProfiles.updateCache(context);
-                if (!mUserProfiles.isProfileUser(userId)) {
+                if (!mUserProfiles.isProfileUser(userId, context)) {
                     // reload per-user settings
                     mSettingsObserver.update(null);
                     // Refresh managed services
@@ -2121,7 +2014,7 @@
                 final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
                 if (userId != USER_NULL) {
                     mUserProfiles.updateCache(context);
-                    if (!mUserProfiles.isProfileUser(userId)) {
+                    if (!mUserProfiles.isProfileUser(userId, context)) {
                         allowDefaultApprovedServices(userId);
                     }
                     mHistoryManager.onUserAdded(userId);
@@ -2142,7 +2035,7 @@
                 final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
                 mUserProfiles.updateCache(context);
                 mAssistants.onUserUnlocked(userId);
-                if (!mUserProfiles.isProfileUser(userId)) {
+                if (!mUserProfiles.isProfileUser(userId, context)) {
                     mConditionProviders.onUserUnlocked(userId);
                     mListeners.onUserUnlocked(userId);
                     if (!android.app.Flags.modesApi()) {
@@ -2164,8 +2057,6 @@
                 = Settings.Secure.getUriFor(Settings.Secure.NOTIFICATION_BADGING);
         private final Uri NOTIFICATION_BUBBLES_URI
                 = Settings.Secure.getUriFor(Settings.Secure.NOTIFICATION_BUBBLES);
-        private final Uri NOTIFICATION_LIGHT_PULSE_URI
-                = Settings.System.getUriFor(Settings.System.NOTIFICATION_LIGHT_PULSE);
         private final Uri NOTIFICATION_RATE_LIMIT_URI
                 = Settings.Global.getUriFor(Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE);
         private final Uri NOTIFICATION_HISTORY_ENABLED
@@ -2188,10 +2079,6 @@
             ContentResolver resolver = getContext().getContentResolver();
             resolver.registerContentObserver(NOTIFICATION_BADGING_URI,
                     false, this, UserHandle.USER_ALL);
-            if (!Flags.refactorAttentionHelper()) {
-                resolver.registerContentObserver(NOTIFICATION_LIGHT_PULSE_URI,
-                    false, this, UserHandle.USER_ALL);
-            }
             resolver.registerContentObserver(NOTIFICATION_RATE_LIMIT_URI,
                     false, this, UserHandle.USER_ALL);
             resolver.registerContentObserver(NOTIFICATION_BUBBLES_URI,
@@ -2218,17 +2105,6 @@
 
         public void update(Uri uri) {
             ContentResolver resolver = getContext().getContentResolver();
-            if (!Flags.refactorAttentionHelper()) {
-                if (uri == null || NOTIFICATION_LIGHT_PULSE_URI.equals(uri)) {
-                    boolean pulseEnabled = Settings.System.getIntForUser(resolver,
-                        Settings.System.NOTIFICATION_LIGHT_PULSE, 0, UserHandle.USER_CURRENT)
-                        != 0;
-                    if (mNotificationPulseEnabled != pulseEnabled) {
-                        mNotificationPulseEnabled = pulseEnabled;
-                        updateNotificationPulse();
-                    }
-                }
-            }
             if (uri == null || NOTIFICATION_RATE_LIMIT_URI.equals(uri)) {
                 mMaxPackageEnqueueRate = Settings.Global.getFloat(resolver,
                             Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE, mMaxPackageEnqueueRate);
@@ -2347,21 +2223,11 @@
 
     // TODO - replace these methods with new fields in the VisibleForTesting constructor
     @VisibleForTesting
-    void setAudioManager(AudioManager audioManager) {
-        mAudioManager = audioManager;
-    }
-
-    @VisibleForTesting
     void setStrongAuthTracker(StrongAuthTracker strongAuthTracker) {
         mStrongAuthTracker = strongAuthTracker;
     }
 
     @VisibleForTesting
-    void setKeyguardManager(KeyguardManager keyguardManager) {
-        mKeyguardManager = keyguardManager;
-    }
-
-    @VisibleForTesting
     ShortcutHelper getShortcutHelper() {
         return mShortcutHelper;
     }
@@ -2372,33 +2238,6 @@
     }
 
     @VisibleForTesting
-    VibratorHelper getVibratorHelper() {
-        return mVibratorHelper;
-    }
-
-    @VisibleForTesting
-    void setVibratorHelper(VibratorHelper helper) {
-        mVibratorHelper = helper;
-    }
-
-    @VisibleForTesting
-    void setHints(int hints) {
-        mListenerHints = hints;
-    }
-
-    @VisibleForTesting
-    void setLights(LogicalLight light) {
-        mNotificationLight = light;
-        mAttentionLight = light;
-        mNotificationPulseEnabled = true;
-    }
-
-    @VisibleForTesting
-    void setScreenOn(boolean on) {
-        mScreenOn = on;
-    }
-
-    @VisibleForTesting
     int getNotificationRecordCount() {
         synchronized (mNotificationLock) {
             int count = mNotificationList.size() + mNotificationsByKey.size()
@@ -2446,12 +2285,6 @@
         return mNotificationsByKey.get(key);
     }
 
-
-    @VisibleForTesting
-    void setSystemReady(boolean systemReady) {
-        mSystemReady = systemReady;
-    }
-
     @VisibleForTesting
     void setHandler(WorkerHandler handler) {
         mHandler = handler;
@@ -2471,13 +2304,8 @@
     }
 
     @VisibleForTesting
-    void setIsAutomotive(boolean isAutomotive) {
-        mIsAutomotive = isAutomotive;
-    }
-
-    @VisibleForTesting
-    void setNotificationEffectsEnabledForAutomotive(boolean isEnabled) {
-        mNotificationEffectsEnabledForAutomotive = isEnabled;
+    void setAttentionHelper(NotificationAttentionHelper nah) {
+        mAttentionHelper = nah;
     }
 
     @VisibleForTesting
@@ -2486,16 +2314,6 @@
     }
 
     @VisibleForTesting
-    void setUsageStats(NotificationUsageStats us) {
-        mUsageStats = us;
-    }
-
-    @VisibleForTesting
-    void setAccessibilityManager(AccessibilityManager am) {
-        mAccessibilityManager = am;
-    }
-
-    @VisibleForTesting
     void setTelecomManager(TelecomManager tm) {
         mTelecomManager = tm;
     }
@@ -2513,7 +2331,7 @@
             DevicePolicyManagerInternal dpm, IUriGrantsManager ugm,
             UriGrantsManagerInternal ugmInternal, AppOpsManager appOps, UserManager userManager,
             NotificationHistoryManager historyManager, StatsManager statsManager,
-            TelephonyManager telephonyManager, ActivityManagerInternal ami,
+            ActivityManagerInternal ami,
             MultiRateLimiter toastRateLimiter, PermissionHelper permissionHelper,
             UsageStatsManagerInternal usageStatsManagerInternal,
             TelecomManager telecomManager, NotificationChannelLogger channelLogger,
@@ -2645,7 +2463,6 @@
                 extractorNames);
         mSnoozeHelper = snoozeHelper;
         mGroupHelper = groupHelper;
-        mVibratorHelper = new VibratorHelper(getContext());
         mHistoryManager = historyManager;
 
         // This is a ManagedServices object that keeps track of the listeners.
@@ -2664,43 +2481,9 @@
             mStatusBar.setNotificationDelegate(mNotificationDelegate);
         }
 
-        mNotificationLight = lightsManager.getLight(LightsManager.LIGHT_ID_NOTIFICATIONS);
-        mAttentionLight = lightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
-
-        mInCallNotificationUri = Uri.parse("file://" +
-                resources.getString(R.string.config_inCallNotificationSound));
-        mInCallNotificationAudioAttributes = new AudioAttributes.Builder()
-                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
-                .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
-                .build();
-        mInCallNotificationVolume = resources.getFloat(R.dimen.config_inCallNotificationVolume);
-
-        mUseAttentionLight = resources.getBoolean(R.bool.config_useAttentionLight);
-        mHasLight =
-                resources.getBoolean(com.android.internal.R.bool.config_intrusiveNotificationLed);
-
-        // Don't start allowing notifications until the setup wizard has run once.
-        // After that, including subsequent boots, init with notifications turned on.
-        // This works on the first boot because the setup wizard will toggle this
-        // flag at least once and we'll go back to 0 after that.
-        if (0 == Settings.Global.getInt(getContext().getContentResolver(),
-                    Settings.Global.DEVICE_PROVISIONED, 0)) {
-            mDisableNotificationEffects = true;
-        }
         mZenModeHelper.initZenMode();
         mInterruptionFilter = mZenModeHelper.getZenModeListenerInterruptionFilter();
 
-        if (mPackageManagerClient.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
-            telephonyManager.listen(new PhoneStateListener() {
-                @Override
-                public void onCallStateChanged(int state, String incomingNumber) {
-                    if (mCallState == state) return;
-                    if (DBG) Slog.d(TAG, "Call state changed: " + callStateToString(state));
-                    mCallState = state;
-                }
-            }, PhoneStateListener.LISTEN_CALL_STATE);
-        }
-
         mSettingsObserver = new SettingsObserver(mHandler);
 
         mArchive = new Archive(resources.getInteger(
@@ -2709,11 +2492,6 @@
         mIsTelevision = mPackageManagerClient.hasSystemFeature(FEATURE_LEANBACK)
                 || mPackageManagerClient.hasSystemFeature(FEATURE_TELEVISION);
 
-        mIsAutomotive =
-                mPackageManagerClient.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0);
-        mNotificationEffectsEnabledForAutomotive =
-                resources.getBoolean(R.bool.config_enableServerNotificationEffectsForAutomotive);
-
         mZenModeHelper.setPriorityOnlyDndExemptPackages(getContext().getResources().getStringArray(
                 com.android.internal.R.array.config_priorityOnlyDndExemptPackages));
 
@@ -2733,22 +2511,14 @@
 
         mToastRateLimiter = toastRateLimiter;
 
-        if (Flags.refactorAttentionHelper()) {
-            mAttentionHelper = new NotificationAttentionHelper(getContext(), lightsManager,
+        mAttentionHelper = new NotificationAttentionHelper(getContext(), lightsManager,
                 mAccessibilityManager, mPackageManagerClient, userManager, usageStats,
                 mNotificationManagerPrivate, mZenModeHelper, flagResolver);
-        }
 
         // register for various Intents.
         // If this is called within a test, make sure to unregister the intent receivers by
         // calling onDestroy()
         IntentFilter filter = new IntentFilter();
-        if (!Flags.refactorAttentionHelper()) {
-            filter.addAction(Intent.ACTION_SCREEN_ON);
-            filter.addAction(Intent.ACTION_SCREEN_OFF);
-            filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
-            filter.addAction(Intent.ACTION_USER_PRESENT);
-        }
         filter.addAction(Intent.ACTION_USER_STOPPED);
         filter.addAction(Intent.ACTION_USER_SWITCHED);
         filter.addAction(Intent.ACTION_USER_ADDED);
@@ -2874,7 +2644,6 @@
                 new NotificationHistoryManager(getContext(), handler),
                 mStatsManager = (StatsManager) getContext().getSystemService(
                         Context.STATS_MANAGER),
-                getContext().getSystemService(TelephonyManager.class),
                 LocalServices.getService(ActivityManagerInternal.class),
                 createToastRateLimiter(), new PermissionHelper(getContext(),
                         AppGlobals.getPackageManager(),
@@ -3054,14 +2823,7 @@
     @VisibleForTesting
     void onBootPhase(int phase, Looper mainLooper) {
         if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
-            // no beeping until we're basically done booting
-            mSystemReady = true;
-
-            // Grab our optional AudioService
-            mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
-            mAudioManagerInternal = getLocalService(AudioManagerInternal.class);
             mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
-            mKeyguardManager = getContext().getSystemService(KeyguardManager.class);
             mZenModeHelper.onSystemReady();
             RoleObserver roleObserver = new RoleObserver(getContext(),
                     getContext().getSystemService(RoleManager.class),
@@ -3080,9 +2842,7 @@
             }
             registerNotificationPreferencesPullers();
             new LockPatternUtils(getContext()).registerStrongAuthTracker(mStrongAuthTracker);
-            if (Flags.refactorAttentionHelper()) {
-                mAttentionHelper.onSystemReady();
-            }
+            mAttentionHelper.onSystemReady();
         } else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
             // This observer will force an update when observe is called, causing us to
             // bind to listener services.
@@ -3905,15 +3665,6 @@
             if (lifetimeExtensionRefactor()) {
                 // Also don't allow client apps to cancel lifetime extended notifs.
                 mustNotHaveFlags |= FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
-                // If cancellation will be prevented due to lifetime extension, we send an update to
-                // system UI.
-                NotificationRecord record = null;
-                final int packageImportance = getPackageImportanceWithIdentity(pkg);
-                synchronized (mNotificationLock) {
-                    record = findNotificationLocked(pkg, tag, id, userId);
-                    maybeNotifySystemUiListenerLifetimeExtendedLocked(record, pkg,
-                            packageImportance);
-                }
             }
 
             cancelNotificationInternal(pkg, opPkg, Binder.getCallingUid(), Binder.getCallingPid(),
@@ -5110,7 +4861,7 @@
                                     || isNotificationRecent(r.getUpdateTimeMs());
                             cancelNotificationFromListenerLocked(info, callingUid, callingPid,
                                     r.getSbn().getPackageName(), r.getSbn().getTag(),
-                                    r.getSbn().getId(), userId, reason, packageImportance);
+                                    r.getSbn().getId(), userId, reason);
                         }
                     } else {
                         for (NotificationRecord notificationRecord : mNotificationList) {
@@ -5250,14 +5001,10 @@
         @GuardedBy("mNotificationLock")
         private void cancelNotificationFromListenerLocked(ManagedServiceInfo info,
                 int callingUid, int callingPid, String pkg, String tag, int id, int userId,
-                int reason, int packageImportance) {
+                int reason) {
             int mustNotHaveFlags = FLAG_ONGOING_EVENT;
             if (lifetimeExtensionRefactor()) {
                 mustNotHaveFlags |= FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
-                // If cancellation will be prevented due to lifetime extension, we send an update
-                // to system UI.
-                NotificationRecord record = findNotificationLocked(pkg, tag, id, userId);
-                maybeNotifySystemUiListenerLifetimeExtendedLocked(record, pkg, packageImportance);
             }
             cancelNotification(callingUid, callingPid, pkg, tag, id, 0 /* mustHaveFlags */,
                     mustNotHaveFlags,
@@ -5400,13 +5147,7 @@
             final int callingUid = Binder.getCallingUid();
             final int callingPid = Binder.getCallingPid();
             final long identity = Binder.clearCallingIdentity();
-            final int packageImportance;
             try {
-                if (lifetimeExtensionRefactor()) {
-                    packageImportance = getPackageImportanceWithIdentity(pkg);
-                } else {
-                    packageImportance = IMPORTANCE_NONE;
-                }
                 synchronized (mNotificationLock) {
                     final ManagedServiceInfo info = mListeners.checkServiceTokenLocked(token);
                     int cancelReason = REASON_LISTENER_CANCEL;
@@ -5419,7 +5160,7 @@
                                 + " use cancelNotification(key) instead.");
                     } else {
                         cancelNotificationFromListenerLocked(info, callingUid, callingPid,
-                                pkg, tag, id, info.userid, cancelReason, packageImportance);
+                                pkg, tag, id, info.userid, cancelReason);
                     }
                 }
             } finally {
@@ -6866,33 +6607,6 @@
         return null;
     }
 
-    private String disableNotificationEffects(NotificationRecord record) {
-        if (mDisableNotificationEffects) {
-            return "booleanState";
-        }
-        if ((mListenerHints & HINT_HOST_DISABLE_EFFECTS) != 0) {
-            return "listenerHints";
-        }
-        if (record != null && record.getAudioAttributes() != null) {
-            if ((mListenerHints & HINT_HOST_DISABLE_NOTIFICATION_EFFECTS) != 0) {
-                if (record.getAudioAttributes().getUsage()
-                        != AudioAttributes.USAGE_NOTIFICATION_RINGTONE) {
-                    return "listenerNoti";
-                }
-            }
-            if ((mListenerHints & HINT_HOST_DISABLE_CALL_EFFECTS) != 0) {
-                if (record.getAudioAttributes().getUsage()
-                        == AudioAttributes.USAGE_NOTIFICATION_RINGTONE) {
-                    return "listenerCall";
-                }
-            }
-        }
-        if (mCallState != TelephonyManager.CALL_STATE_IDLE && !mZenModeHelper.isCall(record)) {
-            return "callState";
-        }
-        return null;
-    }
-
     // Gets packages that have requested notification permission, and whether that has been
     // allowed/denied, for all users on the device.
     // Returns a single map containing that info keyed by (uid, package name) for all users.
@@ -7061,33 +6775,10 @@
                     dumpNotificationRecords(pw, filter);
                 }
                 if (!filter.filtered) {
-                    N = mLights.size();
-                    if (N > 0) {
-                        pw.println("  Lights List:");
-                        for (int i=0; i<N; i++) {
-                            if (i == N - 1) {
-                                pw.print("  > ");
-                            } else {
-                                pw.print("    ");
-                            }
-                            pw.println(mLights.get(i));
-                        }
-                        pw.println("  ");
-                    }
-                    pw.println("  mUseAttentionLight=" + mUseAttentionLight);
-                    pw.println("  mHasLight=" + mHasLight);
-                    pw.println("  mNotificationPulseEnabled=" + mNotificationPulseEnabled);
-                    pw.println("  mSoundNotificationKey=" + mSoundNotificationKey);
-                    pw.println("  mVibrateNotificationKey=" + mVibrateNotificationKey);
-                    pw.println("  mDisableNotificationEffects=" + mDisableNotificationEffects);
-                    pw.println("  mCallState=" + callStateToString(mCallState));
-                    pw.println("  mSystemReady=" + mSystemReady);
                     pw.println("  mMaxPackageEnqueueRate=" + mMaxPackageEnqueueRate);
                     pw.println("  hideSilentStatusBar="
                             + mPreferencesHelper.shouldHideSilentStatusIcons());
-                    if (Flags.refactorAttentionHelper()) {
-                        mAttentionHelper.dump(pw, "    ", filter);
-                    }
+                    mAttentionHelper.dump(pw, "    ", filter);
                 }
                 pw.println("  mArchive=" + mArchive.toString());
                 mArchive.dumpImpl(pw, filter);
@@ -7886,6 +7577,12 @@
 
         // Remote views? Are they too big?
         checkRemoteViews(pkg, tag, id, notification);
+
+        if (Flags.allNotifsNeedTtl()) {
+            if (notification.getTimeoutAfter() == 0) {
+                notification.setTimeoutAfter(NOTIFICATION_TTL);
+            }
+        }
     }
 
     /**
@@ -8379,11 +8076,7 @@
             boolean wasPosted = removeFromNotificationListsLocked(r);
             cancelNotificationLocked(r, false, REASON_SNOOZED, wasPosted, null,
                     SystemClock.elapsedRealtime());
-            if (Flags.refactorAttentionHelper()) {
-                mAttentionHelper.updateLightsLocked();
-            } else {
-                updateLightsLocked();
-            }
+            mAttentionHelper.updateLightsLocked();
             if (isSnoozable(r)) {
                 if (mSnoozeCriterionId != null) {
                     mAssistants.notifyAssistantSnoozedLocked(r, mSnoozeCriterionId);
@@ -8458,19 +8151,30 @@
                 EventLogTags.writeNotificationCancel(mCallingUid, mCallingPid, mPkg, mId, mTag,
                         mUserId, mMustHaveFlags, mMustNotHaveFlags, mReason, listenerName);
             }
-
+            int packageImportance = IMPORTANCE_NONE;
+            if (lifetimeExtensionRefactor()) {
+                packageImportance = getPackageImportanceWithIdentity(mPkg);
+            }
             synchronized (mNotificationLock) {
                 // Look for the notification, searching both the posted and enqueued lists.
                 NotificationRecord r = findNotificationLocked(mPkg, mTag, mId, mUserId);
+
                 if (r != null) {
                     // The notification was found, check if it should be removed.
-
                     // Ideally we'd do this in the caller of this method. However, that would
                     // require the caller to also find the notification.
                     if (mReason == REASON_CLICK) {
                         mUsageStats.registerClickedByUser(r);
                     }
 
+                    // If cancellation will be prevented due to lifetime extension, we need to
+                    // send an update to system UI. This must be checked before flags are checked.
+                    // We do not want to send this update.
+                    if (lifetimeExtensionRefactor() && mReason != REASON_CLICK) {
+                        maybeNotifySystemUiListenerLifetimeExtendedLocked(r, mPkg,
+                                packageImportance);
+                    }
+
                     if ((mReason == REASON_LISTENER_CANCEL
                             && r.getNotification().isBubbleNotification())
                             || (mReason == REASON_CLICK && r.canBubble()
@@ -8519,11 +8223,7 @@
                     cancelGroupChildrenLocked(r, mCallingUid, mCallingPid, listenerName,
                             mSendDelete, childrenFlagChecker, mReason,
                             mCancellationElapsedTimeMs);
-                    if (Flags.refactorAttentionHelper()) {
-                        mAttentionHelper.updateLightsLocked();
-                    } else {
-                        updateLightsLocked();
-                    }
+                    mAttentionHelper.updateLightsLocked();
                     if (mShortcutHelper != null) {
                         mShortcutHelper.maybeListenForShortcutChangesForBubbles(r,
                                 true /* isRemoved */,
@@ -8802,6 +8502,11 @@
                         r.isUpdate = true;
                         final boolean isInterruptive = isVisuallyInterruptive(old, r);
                         r.setTextChanged(isInterruptive);
+                        if (android.app.Flags.updateRankingTime()) {
+                            if (isInterruptive) {
+                                r.resetRankingTime();
+                            }
+                        }
                     }
 
                     mNotificationsByKey.put(n.getKey(), r);
@@ -8818,14 +8523,10 @@
 
                     int buzzBeepBlinkLoggingCode = 0;
                     if (!r.isHidden()) {
-                        if (Flags.refactorAttentionHelper()) {
-                            buzzBeepBlinkLoggingCode = mAttentionHelper.buzzBeepBlinkLocked(r,
+                        buzzBeepBlinkLoggingCode = mAttentionHelper.buzzBeepBlinkLocked(r,
                                 new NotificationAttentionHelper.Signals(
-                                    mUserProfiles.isCurrentProfile(r.getUserId()),
-                                    mListenerHints));
-                        } else {
-                            buzzBeepBlinkLoggingCode = buzzBeepBlinkLocked(r);
-                        }
+                                        mUserProfiles.isCurrentProfile(r.getUserId()),
+                                        mListenerHints));
                     }
 
                     if (notification.getSmallIcon() != null) {
@@ -8946,14 +8647,26 @@
             return false;
         }
 
-        // Ignore visual interruptions from foreground services because users
-        // consider them one 'session'. Count them for everything else.
-        if ((r.getSbn().getNotification().flags & FLAG_FOREGROUND_SERVICE) != 0) {
-            if (DEBUG_INTERRUPTIVENESS) {
-                Slog.v(TAG, "INTERRUPTIVENESS: "
-                        +  r.getKey() + " is not interruptive: foreground service");
+        if (android.app.Flags.updateRankingTime()) {
+            // Ignore visual interruptions from FGS/UIJs because users
+            // consider them one 'session'. Count them for everything else.
+            if (r.getSbn().getNotification().isFgsOrUij()) {
+                if (DEBUG_INTERRUPTIVENESS) {
+                    Slog.v(TAG, "INTERRUPTIVENESS: "
+                            + r.getKey() + " is not interruptive: FGS/UIJ");
+                }
+                return false;
             }
-            return false;
+        } else {
+            // Ignore visual interruptions from foreground services because users
+            // consider them one 'session'. Count them for everything else.
+            if ((r.getSbn().getNotification().flags & FLAG_FOREGROUND_SERVICE) != 0) {
+                if (DEBUG_INTERRUPTIVENESS) {
+                    Slog.v(TAG, "INTERRUPTIVENESS: "
+                            + r.getKey() + " is not interruptive: foreground service");
+                }
+                return false;
+            }
         }
 
         final String oldTitle = String.valueOf(oldN.extras.get(Notification.EXTRA_TITLE));
@@ -9150,425 +8863,6 @@
         }
     }
 
-    @VisibleForTesting
-    @GuardedBy("mNotificationLock")
-    /**
-     * Determine whether this notification should attempt to make noise, vibrate, or flash the LED
-     * @return buzzBeepBlink - bitfield (buzz ? 1 : 0) | (beep ? 2 : 0) | (blink ? 4 : 0)
-     */
-    int buzzBeepBlinkLocked(NotificationRecord record) {
-        if (mIsAutomotive && !mNotificationEffectsEnabledForAutomotive) {
-            return 0;
-        }
-        boolean buzz = false;
-        boolean beep = false;
-        boolean blink = false;
-
-        final String key = record.getKey();
-
-        // Should this notification make noise, vibe, or use the LED?
-        final boolean aboveThreshold =
-                mIsAutomotive
-                        ? record.getImportance() > NotificationManager.IMPORTANCE_DEFAULT
-                        : record.getImportance() >= NotificationManager.IMPORTANCE_DEFAULT;
-        // Remember if this notification already owns the notification channels.
-        boolean wasBeep = key != null && key.equals(mSoundNotificationKey);
-        boolean wasBuzz = key != null && key.equals(mVibrateNotificationKey);
-        // These are set inside the conditional if the notification is allowed to make noise.
-        boolean hasValidVibrate = false;
-        boolean hasValidSound = false;
-        boolean sentAccessibilityEvent = false;
-
-        // If the notification will appear in the status bar, it should send an accessibility event
-        final boolean suppressedByDnd = record.isIntercepted()
-                && (record.getSuppressedVisualEffects() & SUPPRESSED_EFFECT_STATUS_BAR) != 0;
-        if (!record.isUpdate
-                && record.getImportance() > IMPORTANCE_MIN
-                && !suppressedByDnd
-                && isNotificationForCurrentUser(record)) {
-            sendAccessibilityEvent(record);
-            sentAccessibilityEvent = true;
-        }
-
-        if (aboveThreshold && isNotificationForCurrentUser(record)) {
-            if (mSystemReady && mAudioManager != null) {
-                Uri soundUri = record.getSound();
-                hasValidSound = soundUri != null && !Uri.EMPTY.equals(soundUri);
-                VibrationEffect vibration = record.getVibration();
-                // Demote sound to vibration if vibration missing & phone in vibration mode.
-                if (vibration == null
-                        && hasValidSound
-                        && (mAudioManager.getRingerModeInternal()
-                        == AudioManager.RINGER_MODE_VIBRATE)
-                        && mAudioManager.getStreamVolume(
-                        AudioAttributes.toLegacyStreamType(record.getAudioAttributes())) == 0) {
-                    boolean insistent = (record.getFlags() & Notification.FLAG_INSISTENT) != 0;
-                    vibration = mVibratorHelper.createFallbackVibration(insistent);
-                }
-                hasValidVibrate = vibration != null;
-                boolean hasAudibleAlert = hasValidSound || hasValidVibrate;
-                if (hasAudibleAlert && !shouldMuteNotificationLocked(record)) {
-                    if (!sentAccessibilityEvent) {
-                        sendAccessibilityEvent(record);
-                        sentAccessibilityEvent = true;
-                    }
-                    if (DBG) Slog.v(TAG, "Interrupting!");
-                    boolean isInsistentUpdate = isInsistentUpdate(record);
-                    if (hasValidSound) {
-                        if (isInsistentUpdate) {
-                            // don't reset insistent sound, it's jarring
-                            beep = true;
-                        } else {
-                            if (isInCall()) {
-                                playInCallNotification();
-                                beep = true;
-                            } else {
-                                beep = playSound(record, soundUri);
-                            }
-                            if (beep) {
-                                mSoundNotificationKey = key;
-                            }
-                        }
-                    }
-
-                    final boolean ringerModeSilent =
-                            mAudioManager.getRingerModeInternal()
-                                    == AudioManager.RINGER_MODE_SILENT;
-                    if (!isInCall() && hasValidVibrate && !ringerModeSilent) {
-                        if (isInsistentUpdate) {
-                            buzz = true;
-                        } else {
-                            buzz = playVibration(record, vibration, hasValidSound);
-                            if (buzz) {
-                                mVibrateNotificationKey = key;
-                            }
-                        }
-                    }
-
-                    // Try to start flash notification event whenever an audible and non-suppressed
-                    // notification is received
-                    mAccessibilityManager.startFlashNotificationEvent(getContext(),
-                            AccessibilityManager.FLASH_REASON_NOTIFICATION,
-                            record.getSbn().getPackageName());
-
-                } else if ((record.getFlags() & Notification.FLAG_INSISTENT) != 0) {
-                    hasValidSound = false;
-                }
-            }
-        }
-        // If a notification is updated to remove the actively playing sound or vibrate,
-        // cancel that feedback now
-        if (wasBeep && !hasValidSound) {
-            clearSoundLocked();
-        }
-        if (wasBuzz && !hasValidVibrate) {
-            clearVibrateLocked();
-        }
-
-        // light
-        // release the light
-        boolean wasShowLights = mLights.remove(key);
-        if (canShowLightsLocked(record, aboveThreshold)) {
-            mLights.add(key);
-            updateLightsLocked();
-            if (mUseAttentionLight && mAttentionLight != null) {
-                mAttentionLight.pulse();
-            }
-            blink = true;
-        } else if (wasShowLights) {
-            updateLightsLocked();
-        }
-        final int buzzBeepBlink = (buzz ? 1 : 0) | (beep ? 2 : 0) | (blink ? 4 : 0);
-        if (buzzBeepBlink > 0) {
-            // Ignore summary updates because we don't display most of the information.
-            if (record.getSbn().isGroup() && record.getSbn().getNotification().isGroupSummary()) {
-                if (DEBUG_INTERRUPTIVENESS) {
-                    Slog.v(TAG, "INTERRUPTIVENESS: "
-                            + record.getKey() + " is not interruptive: summary");
-                }
-            } else if (record.canBubble()) {
-                if (DEBUG_INTERRUPTIVENESS) {
-                    Slog.v(TAG, "INTERRUPTIVENESS: "
-                            + record.getKey() + " is not interruptive: bubble");
-                }
-            } else {
-                record.setInterruptive(true);
-                if (DEBUG_INTERRUPTIVENESS) {
-                    Slog.v(TAG, "INTERRUPTIVENESS: "
-                            + record.getKey() + " is interruptive: alerted");
-                }
-            }
-            MetricsLogger.action(record.getLogMaker()
-                    .setCategory(MetricsEvent.NOTIFICATION_ALERT)
-                    .setType(MetricsEvent.TYPE_OPEN)
-                    .setSubtype(buzzBeepBlink));
-            EventLogTags.writeNotificationAlert(key, buzz ? 1 : 0, beep ? 1 : 0, blink ? 1 : 0, 0);
-        }
-        record.setAudiblyAlerted(buzz || beep);
-        return buzzBeepBlink;
-    }
-
-    @GuardedBy("mNotificationLock")
-    boolean canShowLightsLocked(final NotificationRecord record, boolean aboveThreshold) {
-        // device lacks light
-        if (!mHasLight) {
-            return false;
-        }
-        // user turned lights off globally
-        if (!mNotificationPulseEnabled) {
-            return false;
-        }
-        // the notification/channel has no light
-        if (record.getLight() == null) {
-            return false;
-        }
-        // unimportant notification
-        if (!aboveThreshold) {
-            return false;
-        }
-        // suppressed due to DND
-        if ((record.getSuppressedVisualEffects() & SUPPRESSED_EFFECT_LIGHTS) != 0) {
-            return false;
-        }
-        // Suppressed because it's a silent update
-        final Notification notification = record.getNotification();
-        if (record.isUpdate && (notification.flags & FLAG_ONLY_ALERT_ONCE) != 0) {
-            return false;
-        }
-        // Suppressed because another notification in its group handles alerting
-        if (record.getSbn().isGroup() && record.getNotification().suppressAlertingDueToGrouping()) {
-            return false;
-        }
-        // not if in call
-        if (isInCall()) {
-            return false;
-        }
-        // check current user
-        if (!isNotificationForCurrentUser(record)) {
-            return false;
-        }
-        // Light, but only when the screen is off
-        return true;
-    }
-
-    @GuardedBy("mNotificationLock")
-    boolean isInsistentUpdate(final NotificationRecord record) {
-        return (Objects.equals(record.getKey(), mSoundNotificationKey)
-                || Objects.equals(record.getKey(), mVibrateNotificationKey))
-                && isCurrentlyInsistent();
-    }
-
-    @GuardedBy("mNotificationLock")
-    boolean isCurrentlyInsistent() {
-        return isLoopingRingtoneNotification(mNotificationsByKey.get(mSoundNotificationKey))
-                || isLoopingRingtoneNotification(mNotificationsByKey.get(mVibrateNotificationKey));
-    }
-
-    @GuardedBy("mNotificationLock")
-    boolean shouldMuteNotificationLocked(final NotificationRecord record) {
-        // Suppressed because it's a silent update
-        final Notification notification = record.getNotification();
-        if (record.isUpdate && (notification.flags & FLAG_ONLY_ALERT_ONCE) != 0) {
-            return true;
-        }
-
-        // Suppressed because a user manually unsnoozed something (or similar)
-        if (record.shouldPostSilently()) {
-            return true;
-        }
-
-        // muted by listener
-        final String disableEffects = disableNotificationEffects(record);
-        if (disableEffects != null) {
-            ZenLog.traceDisableEffects(record, disableEffects);
-            return true;
-        }
-
-        // suppressed due to DND
-        if (record.isIntercepted()) {
-            return true;
-        }
-
-        // Suppressed because another notification in its group handles alerting
-        if (record.getSbn().isGroup()) {
-            if (notification.suppressAlertingDueToGrouping()) {
-                return true;
-            }
-        }
-
-        // Suppressed for being too recently noisy
-        final String pkg = record.getSbn().getPackageName();
-        if (mUsageStats.isAlertRateLimited(pkg)) {
-            Slog.e(TAG, "Muting recently noisy " + record.getKey());
-            return true;
-        }
-
-        // A different looping ringtone, such as an incoming call is playing
-        if (isCurrentlyInsistent() && !isInsistentUpdate(record)) {
-            return true;
-        }
-
-        // Suppressed since it's a non-interruptive update to a bubble-suppressed notification
-        final boolean isBubbleOrOverflowed = record.canBubble() && (record.isFlagBubbleRemoved()
-                || record.getNotification().isBubbleNotification());
-        if (record.isUpdate && !record.isInterruptive() && isBubbleOrOverflowed
-                && record.getNotification().getBubbleMetadata() != null) {
-            if (record.getNotification().getBubbleMetadata().isNotificationSuppressed()) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    @GuardedBy("mNotificationLock")
-    private boolean isLoopingRingtoneNotification(final NotificationRecord playingRecord) {
-        if (playingRecord != null) {
-            if (playingRecord.getAudioAttributes().getUsage() == USAGE_NOTIFICATION_RINGTONE
-                    && (playingRecord.getNotification().flags & FLAG_INSISTENT) != 0) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean playSound(final NotificationRecord record, Uri soundUri) {
-        final boolean shouldPlay;
-        if (focusExclusiveWithRecording()) {
-            // flagged path
-            shouldPlay = mAudioManager.shouldNotificationSoundPlay(record.getAudioAttributes());
-        } else {
-            // legacy path
-            // play notifications if there is no user of exclusive audio focus
-            // and the stream volume is not 0 (non-zero volume implies not silenced by SILENT or
-            //   VIBRATE ringer mode)
-            shouldPlay = !mAudioManager.isAudioFocusExclusive()
-                    && (mAudioManager.getStreamVolume(
-                        AudioAttributes.toLegacyStreamType(record.getAudioAttributes())) != 0);
-        }
-        if (!shouldPlay) {
-            if (DBG) Slog.v(TAG, "Not playing sound " + soundUri + " due to focus/volume");
-            return false;
-        }
-
-        boolean looping = (record.getNotification().flags & FLAG_INSISTENT) != 0;
-        final long identity = Binder.clearCallingIdentity();
-        try {
-            final IRingtonePlayer player = mAudioManager.getRingtonePlayer();
-            if (player != null) {
-                if (DBG) {
-                    Slog.v(TAG, "Playing sound " + soundUri
-                            + " with attributes " + record.getAudioAttributes());
-                }
-                player.playAsync(soundUri, record.getSbn().getUser(), looping,
-                        record.getAudioAttributes(), 1.0f);
-                return true;
-            }
-        } catch (RemoteException e) {
-        } finally {
-            Binder.restoreCallingIdentity(identity);
-        }
-        return false;
-    }
-
-    private boolean playVibration(final NotificationRecord record, final VibrationEffect effect,
-            boolean delayVibForSound) {
-        // Escalate privileges so we can use the vibrator even if the
-        // notifying app does not have the VIBRATE permission.
-        final long identity = Binder.clearCallingIdentity();
-        try {
-            if (delayVibForSound) {
-                new Thread(() -> {
-                    // delay the vibration by the same amount as the notification sound
-                    final int waitMs = mAudioManager.getFocusRampTimeMs(
-                            AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,
-                            record.getAudioAttributes());
-                    if (DBG) {
-                        Slog.v(TAG, "Delaying vibration for notification "
-                                + record.getKey() + " by " + waitMs + "ms");
-                    }
-                    try {
-                        Thread.sleep(waitMs);
-                    } catch (InterruptedException e) { }
-                    // Notifications might be canceled before it actually vibrates due to waitMs,
-                    // so need to check that the notification is still valid for vibrate.
-                    synchronized (mNotificationLock) {
-                        if (mNotificationsByKey.get(record.getKey()) != null) {
-                            if (record.getKey().equals(mVibrateNotificationKey)) {
-                                vibrate(record, effect, true);
-                            } else {
-                                if (DBG) {
-                                    Slog.v(TAG, "No vibration for notification "
-                                            + record.getKey() + ": a new notification is "
-                                            + "vibrating, or effects were cleared while waiting");
-                                }
-                            }
-                        } else {
-                            Slog.w(TAG, "No vibration for canceled notification "
-                                    + record.getKey());
-                        }
-                    }
-                }).start();
-            } else {
-                vibrate(record, effect, false);
-            }
-            return true;
-        } finally{
-            Binder.restoreCallingIdentity(identity);
-        }
-    }
-
-    private void vibrate(NotificationRecord record, VibrationEffect effect, boolean delayed) {
-        // We need to vibrate as "android" so we can breakthrough DND. VibratorManagerService
-        // doesn't have a concept of vibrating on an app's behalf, so add the app information
-        // to the reason so we can still debug from bugreports
-        String reason = "Notification (" + record.getSbn().getOpPkg() + " "
-                + record.getSbn().getUid() + ") " + (delayed ? "(Delayed)" : "");
-        mVibratorHelper.vibrate(effect, record.getAudioAttributes(), reason);
-    }
-
-    private boolean isNotificationForCurrentUser(NotificationRecord record) {
-        final int currentUser;
-        final long token = Binder.clearCallingIdentity();
-        try {
-            currentUser = ActivityManager.getCurrentUser();
-        } finally {
-            Binder.restoreCallingIdentity(token);
-        }
-        return (record.getUserId() == UserHandle.USER_ALL ||
-                record.getUserId() == currentUser ||
-                mUserProfiles.isCurrentProfile(record.getUserId()));
-    }
-
-    protected void playInCallNotification() {
-        final ContentResolver cr = getContext().getContentResolver();
-        if (mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_NORMAL
-                && Settings.Secure.getIntForUser(cr,
-                Settings.Secure.IN_CALL_NOTIFICATION_ENABLED, 1, cr.getUserId()) != 0) {
-            new Thread() {
-                @Override
-                public void run() {
-                    final long identity = Binder.clearCallingIdentity();
-                    try {
-                        final IRingtonePlayer player = mAudioManager.getRingtonePlayer();
-                        if (player != null) {
-                            if (mCallNotificationToken != null) {
-                                player.stop(mCallNotificationToken);
-                            }
-                            mCallNotificationToken = new Binder();
-                            player.play(mCallNotificationToken, mInCallNotificationUri,
-                                    mInCallNotificationAudioAttributes,
-                                    mInCallNotificationVolume, false);
-                        }
-                    } catch (RemoteException e) {
-                    } finally {
-                        Binder.restoreCallingIdentity(identity);
-                    }
-                }
-            }.start();
-        }
-    }
-
     @GuardedBy("mToastQueue")
     void showNextToastLocked(boolean lastToastWasTextRecord) {
         if (mIsCurrentToastShown) {
@@ -9840,13 +9134,10 @@
                     || interruptiveChanged;
             if (interceptBefore && !record.isIntercepted()
                     && record.isNewEnoughForAlerting(System.currentTimeMillis())) {
-                if (Flags.refactorAttentionHelper()) {
-                    mAttentionHelper.buzzBeepBlinkLocked(record,
-                        new NotificationAttentionHelper.Signals(
-                            mUserProfiles.isCurrentProfile(record.getUserId()), mListenerHints));
-                } else {
-                    buzzBeepBlinkLocked(record);
-                }
+
+                mAttentionHelper.buzzBeepBlinkLocked(record,
+                        new NotificationAttentionHelper.Signals(mUserProfiles.isCurrentProfile(
+                                record.getUserId()), mListenerHints));
 
                 // Log alert after change in intercepted state to Zen Log as well
                 ZenLog.traceAlertOnUpdatedIntercept(record);
@@ -10051,12 +9342,17 @@
             }
         }
 
-        protected void scheduleCancelNotification(CancelNotificationRunnable cancelRunnable) {
-            if (Flags.notificationReduceMessagequeueUsage()) {
-                sendMessage(Message.obtain(this, cancelRunnable));
+        protected void scheduleCancelNotification(CancelNotificationRunnable cancelRunnable,
+                                                  int delay) {
+            if (lifetimeExtensionRefactor()) {
+                sendMessageDelayed(Message.obtain(this, cancelRunnable), delay);
             } else {
-                if (!hasCallbacks(cancelRunnable)) {
+                if (Flags.notificationReduceMessagequeueUsage()) {
                     sendMessage(Message.obtain(this, cancelRunnable));
+                } else {
+                    if (!hasCallbacks(cancelRunnable)) {
+                        sendMessage(Message.obtain(this, cancelRunnable));
+                    }
                 }
             }
         }
@@ -10113,37 +9409,6 @@
         return (x < low) ? low : ((x > high) ? high : x);
     }
 
-    void sendAccessibilityEvent(NotificationRecord record) {
-        if (!mAccessibilityManager.isEnabled()) {
-            return;
-        }
-
-        final Notification notification = record.getNotification();
-        final CharSequence packageName = record.getSbn().getPackageName();
-        final AccessibilityEvent event =
-            AccessibilityEvent.obtain(AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED);
-        event.setPackageName(packageName);
-        event.setClassName(Notification.class.getName());
-        final int visibilityOverride = record.getPackageVisibilityOverride();
-        final int notifVisibility = visibilityOverride == NotificationManager.VISIBILITY_NO_OVERRIDE
-                ? notification.visibility : visibilityOverride;
-        final int userId = record.getUser().getIdentifier();
-        final boolean needPublic = userId >= 0 && mKeyguardManager.isDeviceLocked(userId);
-        if (needPublic && notifVisibility != Notification.VISIBILITY_PUBLIC) {
-            // Emit the public version if we're on the lockscreen and this notification isn't
-            // publicly visible.
-            event.setParcelableData(notification.publicVersion);
-        } else {
-            event.setParcelableData(notification);
-        }
-        final CharSequence tickerText = notification.tickerText;
-        if (!TextUtils.isEmpty(tickerText)) {
-            event.getText().add(tickerText);
-        }
-
-        mAccessibilityManager.sendAccessibilityEvent(event);
-    }
-
     /**
      * Removes all NotificationsRecords with the same key as the given notification record
      * from both lists. Do not call this method while iterating over either list.
@@ -10228,22 +9493,7 @@
                 }
             }
 
-            if (Flags.refactorAttentionHelper()) {
-                mAttentionHelper.clearEffectsLocked(canceledKey);
-            } else {
-                // sound
-                if (canceledKey.equals(mSoundNotificationKey)) {
-                    clearSoundLocked();
-                }
-
-                // vibrate
-                if (canceledKey.equals(mVibrateNotificationKey)) {
-                    clearVibrateLocked();
-                }
-
-                // light
-                mLights.remove(canceledKey);
-            }
+            mAttentionHelper.clearEffectsLocked(canceledKey);
         }
 
         // Record usage stats
@@ -10458,7 +9708,7 @@
         // remove notification call ends up in not removing the notification.
         mHandler.scheduleCancelNotification(new CancelNotificationRunnable(callingUid, callingPid,
                 pkg, tag, id, mustHaveFlags, mustNotHaveFlags, sendDelete, userId, reason, rank,
-                count, listener, SystemClock.elapsedRealtime()));
+                count, listener, SystemClock.elapsedRealtime()), 0);
     }
 
     /**
@@ -10592,11 +9842,7 @@
                             cancellationElapsedTimeMs);
                 }
             }
-            if (Flags.refactorAttentionHelper()) {
-                mAttentionHelper.updateLightsLocked();
-            } else {
-                updateLightsLocked();
-            }
+            mAttentionHelper.updateLightsLocked();
         }
     }
 
@@ -10745,37 +9991,6 @@
     }
 
     @GuardedBy("mNotificationLock")
-    void updateLightsLocked()
-    {
-        if (mNotificationLight == null) {
-            return;
-        }
-
-        // handle notification lights
-        NotificationRecord ledNotification = null;
-        while (ledNotification == null && !mLights.isEmpty()) {
-            final String owner = mLights.get(mLights.size() - 1);
-            ledNotification = mNotificationsByKey.get(owner);
-            if (ledNotification == null) {
-                Slog.wtfStack(TAG, "LED Notification does not exist: " + owner);
-                mLights.remove(owner);
-            }
-        }
-
-        // Don't flash while we are in a call or screen is on
-        if (ledNotification == null || isInCall() || mScreenOn) {
-            mNotificationLight.turnOff();
-        } else {
-            NotificationRecord.Light light = ledNotification.getLight();
-            if (light != null && mNotificationPulseEnabled) {
-                // pulse repeatedly
-                mNotificationLight.setFlashing(light.color, LogicalLight.LIGHT_FLASH_TIMED,
-                        light.onMs, light.offMs);
-            }
-        }
-    }
-
-    @GuardedBy("mNotificationLock")
     @NonNull
     List<NotificationRecord> findCurrentAndSnoozedGroupNotificationsLocked(String pkg,
             String groupKey, int userId) {
@@ -10974,12 +10189,6 @@
         }
     }
 
-    private void updateNotificationPulse() {
-        synchronized (mNotificationLock) {
-            updateLightsLocked();
-        }
-    }
-
     protected boolean isCallingUidSystem() {
         final int uid = Binder.getCallingUid();
         return uid == Process.SYSTEM_UID;
@@ -11350,18 +10559,6 @@
         }
     }
 
-    private boolean isInCall() {
-        if (mInCallStateOffHook) {
-            return true;
-        }
-        int audioMode = mAudioManager.getMode();
-        if (audioMode == AudioManager.MODE_IN_CALL
-                || audioMode == AudioManager.MODE_IN_COMMUNICATION) {
-            return true;
-        }
-        return false;
-    }
-
     public class NotificationAssistants extends ManagedServices {
         static final String TAG_ENABLED_NOTIFICATION_ASSISTANTS = "enabled_assistants";
 
@@ -11924,6 +11121,9 @@
         if (record != null && (record.getSbn().getNotification().flags
                 & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY) > 0) {
             boolean isAppForeground = pkg != null && packageImportance == IMPORTANCE_FOREGROUND;
+
+            // Lifetime extended notifications don't need to alert on state change.
+            record.setPostSilently(true);
             mHandler.post(new EnqueueNotificationRunnable(record.getUser().getIdentifier(),
                     record, isAppForeground,
                     mPostNotificationTrackerFactory.newTracker(null)));
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 6ab4b99..97d2620 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -15,6 +15,10 @@
  */
 package com.android.server.notification;
 
+import static android.app.Flags.restrictAudioAttributesAlarm;
+import static android.app.Flags.restrictAudioAttributesCall;
+import static android.app.Flags.restrictAudioAttributesMedia;
+import static android.app.Flags.updateRankingTime;
 import static android.app.NotificationChannel.USER_LOCKED_IMPORTANCE;
 import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
 import static android.app.NotificationManager.IMPORTANCE_HIGH;
@@ -65,14 +69,12 @@
 import android.util.TimeUtils;
 import android.util.proto.ProtoOutputStream;
 import android.widget.RemoteViews;
-
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.server.EventLogTags;
 import com.android.server.LocalServices;
 import com.android.server.uri.UriGrantsManagerInternal;
-
 import dalvik.annotation.optimization.NeverCompile;
 
 import java.io.PrintWriter;
@@ -1090,8 +1092,14 @@
     private long calculateRankingTimeMs(long previousRankingTimeMs) {
         Notification n = getNotification();
         // Take developer provided 'when', unless it's in the future.
-        if (n.when != 0 && n.when <= getSbn().getPostTime()) {
-            return n.when;
+        if (updateRankingTime()) {
+            if (n.hasAppProvidedWhen() && n.when <= getSbn().getPostTime()){
+                return n.when;
+            }
+        } else {
+            if (n.when != 0 && n.when <= getSbn().getPostTime()) {
+                return n.when;
+            }
         }
         // If we've ranked a previous instance with a timestamp, inherit it. This case is
         // important in order to have ranking stability for updating notifications.
@@ -1154,6 +1162,11 @@
             mChannel = channel;
             calculateImportance();
             calculateUserSentiment();
+            mVibration = calculateVibration();
+            if (restrictAudioAttributesCall() || restrictAudioAttributesAlarm()
+                    || restrictAudioAttributesMedia()) {
+                mAttributes = channel.getAudioAttributes();
+            }
         }
     }
 
@@ -1193,6 +1206,12 @@
         return mPeopleOverride;
     }
 
+    public void resetRankingTime() {
+        if (updateRankingTime()) {
+            mRankingTimeMs = calculateRankingTimeMs(getSbn().getPostTime());
+        }
+    }
+
     public void setInterruptive(boolean interruptive) {
         mIsInterruptive = interruptive;
         final long now = System.currentTimeMillis();
diff --git a/services/core/java/com/android/server/notification/NotificationTimeComparator.java b/services/core/java/com/android/server/notification/NotificationTimeComparator.java
new file mode 100644
index 0000000..550c428
--- /dev/null
+++ b/services/core/java/com/android/server/notification/NotificationTimeComparator.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 com.android.server.notification;
+
+import java.util.Comparator;
+
+/**
+ * Sorts notifications by stabilised recency.
+ */
+public class NotificationTimeComparator implements Comparator<NotificationRecord> {
+    /**
+     * Sorts by time, with some stability being applied to updates
+     *
+     * Time stability logic lives in NotificationRecord.
+     */
+    @Override
+    public int compare(NotificationRecord left, NotificationRecord right) {
+        // earliest first
+        return -1 * Long.compare(left.getRankingTimeMs(), right.getRankingTimeMs());
+    }
+}
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 773d10b..68e0eaa 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -15,6 +15,8 @@
  */
 package com.android.server.notification;
 
+import static android.app.Flags.sortSectionByTime;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
 import static android.text.TextUtils.formatSimple;
 
 import android.annotation.NonNull;
@@ -25,15 +27,20 @@
 import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
 
+import com.android.tools.r8.keepanno.annotations.KeepItemKind;
+import com.android.tools.r8.keepanno.annotations.KeepTarget;
+import com.android.tools.r8.keepanno.annotations.UsesReflection;
+
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 
 public class RankingHelper {
     private static final String TAG = "RankingHelper";
 
     private final NotificationSignalExtractor[] mSignalExtractors;
-    private final NotificationComparator mPreliminaryComparator;
+    private final Comparator mPreliminaryComparator;
     private final GlobalSortKeyComparator mFinalComparator = new GlobalSortKeyComparator();
 
     private final ArrayMap<String, NotificationRecord> mProxyByGroupTmp = new ArrayMap<>();
@@ -41,12 +48,22 @@
     private final Context mContext;
     private final RankingHandler mRankingHandler;
 
-
+    @UsesReflection(
+            value = {
+                @KeepTarget(
+                        kind = KeepItemKind.CLASS_AND_MEMBERS,
+                        instanceOfClassConstantExclusive = NotificationSignalExtractor.class,
+                        methodName = "<init>")
+            })
     public RankingHelper(Context context, RankingHandler rankingHandler, RankingConfig config,
             ZenModeHelper zenHelper, NotificationUsageStats usageStats, String[] extractorNames) {
         mContext = context;
         mRankingHandler = rankingHandler;
-        mPreliminaryComparator = new NotificationComparator(mContext);
+        if (sortSectionByTime()) {
+            mPreliminaryComparator = new NotificationTimeComparator();
+        } else {
+            mPreliminaryComparator = new NotificationComparator(mContext);
+        }
 
         final int N = extractorNames.length;
         mSignalExtractors = new NotificationSignalExtractor[N];
@@ -104,9 +121,13 @@
         }
 
         // Rank each record individually.
-        // Lock comparator state for consistent compare() results.
-        synchronized (mPreliminaryComparator.mStateLock) {
+        if (sortSectionByTime()) {
             notificationList.sort(mPreliminaryComparator);
+        } else {
+            // Lock comparator state for consistent compare() results.
+            synchronized (((NotificationComparator) mPreliminaryComparator).mStateLock) {
+                notificationList.sort(mPreliminaryComparator);
+            }
         }
 
         synchronized (mProxyByGroupTmp) {
@@ -114,10 +135,22 @@
             for (int i = 0; i < N; i++) {
                 final NotificationRecord record = notificationList.get(i);
                 record.setAuthoritativeRank(i);
-                final String groupKey = record.getGroupKey();
-                NotificationRecord existingProxy = mProxyByGroupTmp.get(groupKey);
-                if (existingProxy == null) {
-                    mProxyByGroupTmp.put(groupKey, record);
+                if (sortSectionByTime()) {
+                    final String groupKey = record.getGroupKey();
+                    NotificationRecord existingProxy = mProxyByGroupTmp.get(groupKey);
+                    // summaries are mostly hidden in systemui - if there is a child notification
+                    // with better information, use its rank
+                    if (existingProxy == null
+                            || (existingProxy.getNotification().isGroupSummary()
+                            && !existingProxy.getNotification().hasAppProvidedWhen())) {
+                        mProxyByGroupTmp.put(groupKey, record);
+                    }
+                } else {
+                    final String groupKey = record.getGroupKey();
+                    NotificationRecord existingProxy = mProxyByGroupTmp.get(groupKey);
+                    if (existingProxy == null) {
+                        mProxyByGroupTmp.put(groupKey, record);
+                    }
                 }
             }
             // assign global sort key:
@@ -142,12 +175,14 @@
                 }
 
                 boolean isGroupSummary = record.getNotification().isGroupSummary();
+                char intrusiveRank = sortSectionByTime()
+                        ? '2'
+                        : record.isRecentlyIntrusive() && record.getImportance() > IMPORTANCE_MIN
+                        ? '0' : '1';
                 record.setGlobalSortKey(
                         formatSimple("crtcl=0x%04x:intrsv=%c:grnk=0x%04x:gsmry=%c:%s:rnk=0x%04x",
                         record.getCriticality(),
-                        record.isRecentlyIntrusive()
-                                && record.getImportance() > NotificationManager.IMPORTANCE_MIN
-                                ? '0' : '1',
+                        intrusiveRank,
                         groupProxy.getAuthoritativeRank(),
                         isGroupSummary ? '0' : '1',
                         groupSortKeyPortion,
diff --git a/services/core/java/com/android/server/notification/ZenModeEventLogger.java b/services/core/java/com/android/server/notification/ZenModeEventLogger.java
index 8e37b4f..418eacc 100644
--- a/services/core/java/com/android/server/notification/ZenModeEventLogger.java
+++ b/services/core/java/com/android/server/notification/ZenModeEventLogger.java
@@ -436,7 +436,7 @@
          * Only available when {@code MODES_API} is active; otherwise returns an empty list.
          */
         int[] getActiveRuleTypes() {
-            if (!Flags.modesApi() || mNewZenMode == ZEN_MODE_OFF) {
+            if (!Flags.modesApi()) {
                 return new int[0];
             }
 
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 289faf4..20b7fd4 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -86,6 +86,7 @@
 import android.service.notification.Condition;
 import android.service.notification.ConditionProviderService;
 import android.service.notification.DeviceEffectsApplier;
+import android.service.notification.SystemZenRules;
 import android.service.notification.ZenAdapters;
 import android.service.notification.ZenDeviceEffects;
 import android.service.notification.ZenModeConfig;
@@ -214,7 +215,7 @@
         mNotificationManager = context.getSystemService(NotificationManager.class);
 
         mDefaultConfig = readDefaultConfig(mContext.getResources());
-        updateDefaultAutomaticRuleNames();
+        updateDefaultConfigAutomaticRules();
         if (Flags.modesApi()) {
             updateDefaultAutomaticRulePolicies();
         }
@@ -1020,27 +1021,41 @@
         }
     }
 
-    protected void updateDefaultZenRules(int callingUid) {
-        updateDefaultAutomaticRuleNames();
+    void updateZenRulesOnLocaleChange() {
+        updateDefaultConfigAutomaticRules();
         synchronized (mConfigLock) {
+            if (mConfig == null) {
+                return;
+            }
+            ZenModeConfig config = mConfig.copy();
+            boolean updated = false;
             for (ZenRule defaultRule : mDefaultConfig.automaticRules.values()) {
-                ZenRule currRule = mConfig.automaticRules.get(defaultRule.id);
-                // if default rule wasn't user-modified nor enabled, use localized name
+                ZenRule currRule = config.automaticRules.get(defaultRule.id);
+                // if default rule wasn't user-modified use localized name
                 // instead of previous system name
-                if (currRule != null && !currRule.modified && !currRule.enabled
+                if (currRule != null
+                        && !currRule.modified
+                        && (currRule.zenPolicyUserModifiedFields & AutomaticZenRule.FIELD_NAME) == 0
                         && !defaultRule.name.equals(currRule.name)) {
-                    if (canManageAutomaticZenRule(currRule)) {
-                        if (DEBUG) {
-                            Slog.d(TAG, "Locale change - updating default zen rule name "
-                                    + "from " + currRule.name + " to " + defaultRule.name);
-                        }
-                        // update default rule (if locale changed, name of rule will change)
-                        currRule.name = defaultRule.name;
-                        updateAutomaticZenRule(defaultRule.id, zenRuleToAutomaticZenRule(currRule),
-                                UPDATE_ORIGIN_SYSTEM_OR_SYSTEMUI, "locale changed", callingUid);
+                    if (DEBUG) {
+                        Slog.d(TAG, "Locale change - updating default zen rule name "
+                                + "from " + currRule.name + " to " + defaultRule.name);
+                    }
+                    currRule.name = defaultRule.name;
+                    updated = true;
+                }
+            }
+            if (Flags.modesApi() && Flags.modesUi()) {
+                for (ZenRule rule : config.automaticRules.values()) {
+                    if (SystemZenRules.isSystemOwnedRule(rule)) {
+                        updated |= SystemZenRules.updateTriggerDescription(mContext, rule);
                     }
                 }
             }
+            if (updated) {
+                setConfigLocked(config, null, UPDATE_ORIGIN_SYSTEM_OR_SYSTEMUI,
+                        "updateZenRulesOnLocaleChange", Process.SYSTEM_UID);
+            }
         }
     }
 
@@ -1631,6 +1646,10 @@
                 reason += ", reset to default rules";
             }
 
+            if (Flags.modesApi() && Flags.modesUi()) {
+                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) {
@@ -2054,7 +2073,7 @@
         }
     }
 
-    private void updateDefaultAutomaticRuleNames() {
+    private void updateDefaultConfigAutomaticRules() {
         for (ZenRule rule : mDefaultConfig.automaticRules.values()) {
             if (ZenModeConfig.EVENTS_DEFAULT_RULE_ID.equals(rule.id)) {
                 rule.name = mContext.getResources()
@@ -2063,6 +2082,9 @@
                 rule.name = mContext.getResources()
                         .getString(R.string.zen_mode_default_every_night_name);
             }
+            if (Flags.modesApi() && Flags.modesUi()) {
+                SystemZenRules.updateTriggerDescription(mContext, rule);
+            }
         }
     }
 
diff --git a/services/core/java/com/android/server/notification/flags.aconfig b/services/core/java/com/android/server/notification/flags.aconfig
index 43361ed..077ed5a 100644
--- a/services/core/java/com/android/server/notification/flags.aconfig
+++ b/services/core/java/com/android/server/notification/flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.notification"
+container: "system"
 
 flag {
   name: "expire_bitmaps"
@@ -78,4 +79,19 @@
   metadata {
     purpose: PURPOSE_BUGFIX
   }
-}
\ No newline at end of file
+}
+
+flag {
+  name: "polite_notifications_attn_update"
+  namespace: "systemui"
+  description: "This flag controls the polite notification attention behavior updates as per UXR feedback"
+  bug: "270456865"
+}
+
+flag {
+  name: "all_notifs_need_ttl"
+  namespace: "systemui"
+  description: "This flag sets a TTL on all notifications that don't already have an app provided one"
+  bug: "331967355"
+}
+
diff --git a/services/core/java/com/android/server/ondeviceintelligence/BundleUtil.java b/services/core/java/com/android/server/ondeviceintelligence/BundleUtil.java
new file mode 100644
index 0000000..681dd0b
--- /dev/null
+++ b/services/core/java/com/android/server/ondeviceintelligence/BundleUtil.java
@@ -0,0 +1,352 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.ondeviceintelligence;
+
+import static android.system.OsConstants.F_GETFL;
+import static android.system.OsConstants.O_ACCMODE;
+import static android.system.OsConstants.O_RDONLY;
+import static android.system.OsConstants.PROT_READ;
+
+import android.app.ondeviceintelligence.IResponseCallback;
+import android.app.ondeviceintelligence.IStreamingResponseCallback;
+import android.app.ondeviceintelligence.ITokenInfoCallback;
+import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.InferenceParams;
+import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.ResponseParams;
+import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.StateParams;
+import android.app.ondeviceintelligence.TokenInfo;
+import android.database.CursorWindow;
+import android.graphics.Bitmap;
+import android.os.BadParcelableException;
+import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+import android.os.PersistableBundle;
+import android.os.RemoteCallback;
+import android.os.RemoteException;
+import android.os.SharedMemory;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.util.Log;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Util methods for ensuring the Bundle passed in various methods are read-only and restricted to
+ * some known types.
+ */
+public class BundleUtil {
+    private static final String TAG = "BundleUtil";
+
+    /**
+     * Validation of the inference request payload as described in {@link InferenceParams}
+     * description.
+     *
+     * @throws BadParcelableException when the bundle does not meet the read-only requirements.
+     */
+    public static void sanitizeInferenceParams(
+            @InferenceParams Bundle bundle) {
+        ensureValidBundle(bundle);
+
+        if (!bundle.hasFileDescriptors()) {
+            return; //safe to exit if there are no FDs and Binders
+        }
+
+        for (String key : bundle.keySet()) {
+            Object obj = bundle.get(key);
+            if (obj == null) {
+                /* Null value here could also mean deserializing a custom parcelable has failed,
+                 *  and since {@link Bundle} is marked as defusable in system-server - the
+                 * {@link ClassNotFoundException} exception is swallowed and `null` is returned
+                 * instead. We want to ensure cleanup of null entries in such case.
+                 */
+                bundle.putObject(key, null);
+                continue;
+            }
+            if (canMarshall(obj) || obj instanceof CursorWindow) {
+                continue;
+            }
+
+            if (obj instanceof ParcelFileDescriptor) {
+                validatePfdReadOnly((ParcelFileDescriptor) obj);
+            } else if (obj instanceof SharedMemory) {
+                ((SharedMemory) obj).setProtect(PROT_READ);
+            } else if (obj instanceof Bitmap) {
+                if (((Bitmap) obj).isMutable()) {
+                    throw new BadParcelableException(
+                            "Encountered a mutable Bitmap in the Bundle at key : " + key);
+                }
+            } else {
+                throw new BadParcelableException(
+                        "Unsupported Parcelable type encountered in the Bundle: "
+                                + obj.getClass().getSimpleName());
+            }
+        }
+    }
+
+    /**
+     * Validation of the inference request payload as described in {@link ResponseParams}
+     * description.
+     *
+     * @throws BadParcelableException when the bundle does not meet the read-only requirements.
+     */
+    public static void sanitizeResponseParams(
+            @ResponseParams Bundle bundle) {
+        ensureValidBundle(bundle);
+
+        if (!bundle.hasFileDescriptors()) {
+            return; //safe to exit if there are no FDs and Binders
+        }
+
+        for (String key : bundle.keySet()) {
+            Object obj = bundle.get(key);
+            if (obj == null) {
+                /* Null value here could also mean deserializing a custom parcelable has failed,
+                 *  and since {@link Bundle} is marked as defusable in system-server - the
+                 * {@link ClassNotFoundException} exception is swallowed and `null` is returned
+                 * instead. We want to ensure cleanup of null entries in such case.
+                 */
+                bundle.putObject(key, null);
+                continue;
+            }
+            if (canMarshall(obj)) {
+                continue;
+            }
+
+            if (obj instanceof ParcelFileDescriptor) {
+                validatePfdReadOnly((ParcelFileDescriptor) obj);
+            } else if (obj instanceof Bitmap) {
+                if (((Bitmap) obj).isMutable()) {
+                    throw new BadParcelableException(
+                            "Encountered a mutable Bitmap in the Bundle at key : " + key);
+                }
+            } else {
+                throw new BadParcelableException(
+                        "Unsupported Parcelable type encountered in the Bundle: "
+                                + obj.getClass().getSimpleName());
+            }
+        }
+        Log.e(TAG, "validateResponseParams : Finished");
+    }
+
+    /**
+     * Validation of the inference request payload as described in {@link StateParams}
+     * description.
+     *
+     * @throws BadParcelableException when the bundle does not meet the read-only requirements.
+     */
+    public static void sanitizeStateParams(
+            @StateParams Bundle bundle) {
+        ensureValidBundle(bundle);
+
+        if (!bundle.hasFileDescriptors()) {
+            return; //safe to exit if there are no FDs and Binders
+        }
+
+        for (String key : bundle.keySet()) {
+            Object obj = bundle.get(key);
+            if (obj == null) {
+                /* Null value here could also mean deserializing a custom parcelable has failed,
+                 *  and since {@link Bundle} is marked as defusable in system-server - the
+                 * {@link ClassNotFoundException} exception is swallowed and `null` is returned
+                 * instead. We want to ensure cleanup of null entries in such case.
+                 */
+                bundle.putObject(key, null);
+                continue;
+            }
+            if (canMarshall(obj)) {
+                continue;
+            }
+
+            if (obj instanceof ParcelFileDescriptor) {
+                validatePfdReadOnly((ParcelFileDescriptor) obj);
+            } else {
+                throw new BadParcelableException(
+                        "Unsupported Parcelable type encountered in the Bundle: "
+                                + obj.getClass().getSimpleName());
+            }
+        }
+    }
+
+
+    public static IStreamingResponseCallback wrapWithValidation(
+            IStreamingResponseCallback streamingResponseCallback,
+            Executor resourceClosingExecutor) {
+        return new IStreamingResponseCallback.Stub() {
+            @Override
+            public void onNewContent(Bundle processedResult) throws RemoteException {
+                try {
+                    sanitizeResponseParams(processedResult);
+                    streamingResponseCallback.onNewContent(processedResult);
+                } finally {
+                    resourceClosingExecutor.execute(() -> tryCloseResource(processedResult));
+                }
+            }
+
+            @Override
+            public void onSuccess(Bundle resultBundle)
+                    throws RemoteException {
+                try {
+                    sanitizeResponseParams(resultBundle);
+                    streamingResponseCallback.onSuccess(resultBundle);
+                } finally {
+                    resourceClosingExecutor.execute(() -> tryCloseResource(resultBundle));
+                }
+            }
+
+            @Override
+            public void onFailure(int errorCode, String errorMessage,
+                    PersistableBundle errorParams) throws RemoteException {
+                streamingResponseCallback.onFailure(errorCode, errorMessage, errorParams);
+            }
+
+            @Override
+            public void onDataAugmentRequest(Bundle processedContent,
+                    RemoteCallback remoteCallback)
+                    throws RemoteException {
+                try {
+                    sanitizeResponseParams(processedContent);
+                    streamingResponseCallback.onDataAugmentRequest(processedContent,
+                            new RemoteCallback(
+                                    augmentedData -> {
+                                        try {
+                                            sanitizeInferenceParams(augmentedData);
+                                            remoteCallback.sendResult(augmentedData);
+                                        } finally {
+                                            resourceClosingExecutor.execute(
+                                                    () -> tryCloseResource(augmentedData));
+                                        }
+                                    }));
+                } finally {
+                    resourceClosingExecutor.execute(() -> tryCloseResource(processedContent));
+                }
+            }
+        };
+    }
+
+    public static IResponseCallback wrapWithValidation(IResponseCallback responseCallback,
+            Executor resourceClosingExecutor) {
+        return new IResponseCallback.Stub() {
+            @Override
+            public void onSuccess(Bundle resultBundle)
+                    throws RemoteException {
+                try {
+                    sanitizeResponseParams(resultBundle);
+                    responseCallback.onSuccess(resultBundle);
+                } finally {
+                    resourceClosingExecutor.execute(() -> tryCloseResource(resultBundle));
+                }
+            }
+
+            @Override
+            public void onFailure(int errorCode, String errorMessage,
+                    PersistableBundle errorParams) throws RemoteException {
+                responseCallback.onFailure(errorCode, errorMessage, errorParams);
+            }
+
+            @Override
+            public void onDataAugmentRequest(Bundle processedContent,
+                    RemoteCallback remoteCallback)
+                    throws RemoteException {
+                try {
+                    sanitizeResponseParams(processedContent);
+                    responseCallback.onDataAugmentRequest(processedContent, new RemoteCallback(
+                            augmentedData -> {
+                                try {
+                                    sanitizeInferenceParams(augmentedData);
+                                    remoteCallback.sendResult(augmentedData);
+                                } finally {
+                                    resourceClosingExecutor.execute(
+                                            () -> tryCloseResource(augmentedData));
+                                }
+                            }));
+                } finally {
+                    resourceClosingExecutor.execute(() -> tryCloseResource(processedContent));
+                }
+            }
+        };
+    }
+
+
+    public static ITokenInfoCallback wrapWithValidation(ITokenInfoCallback responseCallback) {
+        return new ITokenInfoCallback.Stub() {
+            @Override
+            public void onSuccess(TokenInfo tokenInfo) throws RemoteException {
+                responseCallback.onSuccess(tokenInfo);
+            }
+
+            @Override
+            public void onFailure(int errorCode, String errorMessage, PersistableBundle errorParams)
+                    throws RemoteException {
+                responseCallback.onFailure(errorCode, errorMessage, errorParams);
+            }
+        };
+    }
+
+    private static boolean canMarshall(Object obj) {
+        return obj instanceof byte[] || obj instanceof PersistableBundle
+                || PersistableBundle.isValidType(obj);
+    }
+
+    private static void ensureValidBundle(Bundle bundle) {
+        if (bundle == null) {
+            throw new IllegalArgumentException("Request passed is expected to be non-null");
+        }
+
+        if (bundle.hasBinders() != Bundle.STATUS_BINDERS_NOT_PRESENT) {
+            throw new BadParcelableException("Bundle should not contain IBinder objects.");
+        }
+    }
+
+    public static void validatePfdReadOnly(ParcelFileDescriptor pfd) {
+        if (pfd == null) {
+            return;
+        }
+        try {
+            int readMode = Os.fcntlInt(pfd.getFileDescriptor(), F_GETFL, 0) & O_ACCMODE;
+            if (readMode != O_RDONLY) {
+                throw new BadParcelableException(
+                        "Bundle contains a parcel file descriptor which is not read-only.");
+            }
+        } catch (ErrnoException e) {
+            throw new BadParcelableException(
+                    "Invalid File descriptor passed in the Bundle.", e);
+        }
+    }
+
+    public static void tryCloseResource(Bundle bundle) {
+        if (bundle == null || bundle.isEmpty() || !bundle.hasFileDescriptors()) {
+            return;
+        }
+
+        for (String key : bundle.keySet()) {
+            Object obj = bundle.get(key);
+
+            try {
+                // TODO(b/329898589) : This can be cleaned up after the flag passing is fixed.
+                if (obj instanceof ParcelFileDescriptor) {
+                    ((ParcelFileDescriptor) obj).close();
+                } else if (obj instanceof CursorWindow) {
+                    ((CursorWindow) obj).close();
+                } else if (obj instanceof SharedMemory) {
+                    // TODO(b/331796886) : Shared memory should honour parcelable flags.
+                    ((SharedMemory) obj).close();
+                }
+            } catch (Exception e) {
+                Log.e(TAG, "Error closing resource with key: " + key, e);
+            }
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java b/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
index 953300a..af339df 100644
--- a/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
+++ b/services/core/java/com/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService.java
@@ -16,6 +16,12 @@
 
 package com.android.server.ondeviceintelligence;
 
+import static com.android.server.ondeviceintelligence.BundleUtil.sanitizeInferenceParams;
+import static com.android.server.ondeviceintelligence.BundleUtil.validatePfdReadOnly;
+import static com.android.server.ondeviceintelligence.BundleUtil.sanitizeStateParams;
+import static com.android.server.ondeviceintelligence.BundleUtil.wrapWithValidation;
+
+
 import android.Manifest;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -61,6 +67,7 @@
 import android.service.ondeviceintelligence.OnDeviceIntelligenceService;
 import android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService;
 import android.text.TextUtils;
+import android.util.Log;
 import android.util.Slog;
 
 import com.android.internal.R;
@@ -72,8 +79,11 @@
 import com.android.server.SystemService;
 
 import java.io.FileDescriptor;
+import java.io.IOException;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
 
 /**
  * This is the system service for handling calls on the
@@ -99,6 +109,9 @@
     private static final boolean DEFAULT_SERVICE_ENABLED = true;
     private static final String NAMESPACE_ON_DEVICE_INTELLIGENCE = "ondeviceintelligence";
 
+    private final Executor resourceClosingExecutor = Executors.newCachedThreadPool();
+    private final Executor callbackExecutor = Executors.newCachedThreadPool();
+
     private final Context mContext;
     protected final Object mLock = new Object();
 
@@ -261,7 +274,7 @@
                 ensureRemoteIntelligenceServiceInitialized();
                 mRemoteOnDeviceIntelligenceService.run(
                         service -> service.requestFeatureDownload(Binder.getCallingUid(), feature,
-                                cancellationSignalFuture,
+                                wrapCancellationFuture(cancellationSignalFuture),
                                 downloadCallback));
             }
 
@@ -272,26 +285,35 @@
                     AndroidFuture cancellationSignalFuture,
                     ITokenInfoCallback tokenInfoCallback) throws RemoteException {
                 Slog.i(TAG, "OnDeviceIntelligenceManagerInternal requestTokenInfo");
-                Objects.requireNonNull(feature);
-                Objects.requireNonNull(request);
-                Objects.requireNonNull(tokenInfoCallback);
+                AndroidFuture<Void> result = null;
+                try {
+                    Objects.requireNonNull(feature);
+                    sanitizeInferenceParams(request);
+                    Objects.requireNonNull(tokenInfoCallback);
 
-                mContext.enforceCallingOrSelfPermission(
-                        Manifest.permission.USE_ON_DEVICE_INTELLIGENCE, TAG);
-                if (!mIsServiceEnabled) {
-                    Slog.w(TAG, "Service not available");
-                    tokenInfoCallback.onFailure(
-                            OnDeviceIntelligenceException.ON_DEVICE_INTELLIGENCE_SERVICE_UNAVAILABLE,
-                            "OnDeviceIntelligenceManagerService is unavailable",
-                            PersistableBundle.EMPTY);
+                    mContext.enforceCallingOrSelfPermission(
+                            Manifest.permission.USE_ON_DEVICE_INTELLIGENCE, TAG);
+                    if (!mIsServiceEnabled) {
+                        Slog.w(TAG, "Service not available");
+                        tokenInfoCallback.onFailure(
+                                OnDeviceIntelligenceException.ON_DEVICE_INTELLIGENCE_SERVICE_UNAVAILABLE,
+                                "OnDeviceIntelligenceManagerService is unavailable",
+                                PersistableBundle.EMPTY);
+                    }
+                    ensureRemoteInferenceServiceInitialized();
+
+                    result = mRemoteInferenceService.post(
+                            service -> service.requestTokenInfo(Binder.getCallingUid(), feature,
+                                    request,
+                                    wrapCancellationFuture(cancellationSignalFuture),
+                                    wrapWithValidation(tokenInfoCallback)));
+                    result.whenCompleteAsync((c, e) -> BundleUtil.tryCloseResource(request),
+                            resourceClosingExecutor);
+                } finally {
+                    if (result == null) {
+                        resourceClosingExecutor.execute(() -> BundleUtil.tryCloseResource(request));
+                    }
                 }
-                ensureRemoteInferenceServiceInitialized();
-
-                mRemoteInferenceService.run(
-                        service -> service.requestTokenInfo(Binder.getCallingUid(), feature,
-                                request,
-                                cancellationSignalFuture,
-                                tokenInfoCallback));
             }
 
             @Override
@@ -302,24 +324,36 @@
                     AndroidFuture processingSignalFuture,
                     IResponseCallback responseCallback)
                     throws RemoteException {
-                Slog.i(TAG, "OnDeviceIntelligenceManagerInternal processRequest");
-                Objects.requireNonNull(feature);
-                Objects.requireNonNull(responseCallback);
-                mContext.enforceCallingOrSelfPermission(
-                        Manifest.permission.USE_ON_DEVICE_INTELLIGENCE, TAG);
-                if (!mIsServiceEnabled) {
-                    Slog.w(TAG, "Service not available");
-                    responseCallback.onFailure(
-                            OnDeviceIntelligenceException.PROCESSING_ERROR_SERVICE_UNAVAILABLE,
-                            "OnDeviceIntelligenceManagerService is unavailable",
-                            PersistableBundle.EMPTY);
+                AndroidFuture<Void> result = null;
+                try {
+                    Slog.i(TAG, "OnDeviceIntelligenceManagerInternal processRequest");
+                    Objects.requireNonNull(feature);
+                    sanitizeInferenceParams(request);
+                    Objects.requireNonNull(responseCallback);
+                    mContext.enforceCallingOrSelfPermission(
+                            Manifest.permission.USE_ON_DEVICE_INTELLIGENCE, TAG);
+                    if (!mIsServiceEnabled) {
+                        Slog.w(TAG, "Service not available");
+                        responseCallback.onFailure(
+                                OnDeviceIntelligenceException.PROCESSING_ERROR_SERVICE_UNAVAILABLE,
+                                "OnDeviceIntelligenceManagerService is unavailable",
+                                PersistableBundle.EMPTY);
+                    }
+                    ensureRemoteInferenceServiceInitialized();
+                    result = mRemoteInferenceService.post(
+                            service -> service.processRequest(Binder.getCallingUid(), feature,
+                                    request,
+                                    requestType,
+                                    wrapCancellationFuture(cancellationSignalFuture),
+                                    wrapProcessingFuture(processingSignalFuture),
+                                    wrapWithValidation(responseCallback, resourceClosingExecutor)));
+                    result.whenCompleteAsync((c, e) -> BundleUtil.tryCloseResource(request),
+                            resourceClosingExecutor);
+                } finally {
+                    if (result == null) {
+                        resourceClosingExecutor.execute(() -> BundleUtil.tryCloseResource(request));
+                    }
                 }
-                ensureRemoteInferenceServiceInitialized();
-                mRemoteInferenceService.run(
-                        service -> service.processRequest(Binder.getCallingUid(), feature, request,
-                                requestType,
-                                cancellationSignalFuture, processingSignalFuture,
-                                responseCallback));
             }
 
             @Override
@@ -329,24 +363,36 @@
                     AndroidFuture cancellationSignalFuture,
                     AndroidFuture processingSignalFuture,
                     IStreamingResponseCallback streamingCallback) throws RemoteException {
-                Slog.i(TAG, "OnDeviceIntelligenceManagerInternal processRequestStreaming");
-                Objects.requireNonNull(feature);
-                Objects.requireNonNull(streamingCallback);
-                mContext.enforceCallingOrSelfPermission(
-                        Manifest.permission.USE_ON_DEVICE_INTELLIGENCE, TAG);
-                if (!mIsServiceEnabled) {
-                    Slog.w(TAG, "Service not available");
-                    streamingCallback.onFailure(
-                            OnDeviceIntelligenceException.PROCESSING_ERROR_SERVICE_UNAVAILABLE,
-                            "OnDeviceIntelligenceManagerService is unavailable",
-                            PersistableBundle.EMPTY);
+                AndroidFuture<Void> result = null;
+                try {
+                    Slog.i(TAG, "OnDeviceIntelligenceManagerInternal processRequestStreaming");
+                    Objects.requireNonNull(feature);
+                    sanitizeInferenceParams(request);
+                    Objects.requireNonNull(streamingCallback);
+                    mContext.enforceCallingOrSelfPermission(
+                            Manifest.permission.USE_ON_DEVICE_INTELLIGENCE, TAG);
+                    if (!mIsServiceEnabled) {
+                        Slog.w(TAG, "Service not available");
+                        streamingCallback.onFailure(
+                                OnDeviceIntelligenceException.PROCESSING_ERROR_SERVICE_UNAVAILABLE,
+                                "OnDeviceIntelligenceManagerService is unavailable",
+                                PersistableBundle.EMPTY);
+                    }
+                    ensureRemoteInferenceServiceInitialized();
+                    result = mRemoteInferenceService.post(
+                            service -> service.processRequestStreaming(Binder.getCallingUid(),
+                                    feature,
+                                    request, requestType,
+                                    wrapCancellationFuture(cancellationSignalFuture),
+                                    wrapProcessingFuture(processingSignalFuture),
+                                    streamingCallback));
+                    result.whenCompleteAsync((c, e) -> BundleUtil.tryCloseResource(request),
+                            resourceClosingExecutor);
+                } finally {
+                    if (result == null) {
+                        resourceClosingExecutor.execute(() -> BundleUtil.tryCloseResource(request));
+                    }
                 }
-                ensureRemoteInferenceServiceInitialized();
-                mRemoteInferenceService.run(
-                        service -> service.processRequestStreaming(Binder.getCallingUid(), feature,
-                                request, requestType,
-                                cancellationSignalFuture, processingSignalFuture,
-                                streamingCallback));
             }
 
             @Override
@@ -374,6 +420,7 @@
                                 try {
                                     service.registerRemoteServices(
                                             getRemoteProcessingService());
+                                    service.ready();
                                 } catch (RemoteException ex) {
                                     Slog.w(TAG, "Failed to send connected event", ex);
                                 }
@@ -390,10 +437,24 @@
             public void updateProcessingState(
                     Bundle processingState,
                     IProcessingUpdateStatusCallback callback) {
-                ensureRemoteInferenceServiceInitialized();
-                mRemoteInferenceService.run(
-                        service -> service.updateProcessingState(
-                                processingState, callback));
+                callbackExecutor.execute(() -> {
+                    AndroidFuture<Void> result = null;
+                    try {
+                        sanitizeStateParams(processingState);
+                        ensureRemoteInferenceServiceInitialized();
+                        result = mRemoteInferenceService.post(
+                                service -> service.updateProcessingState(
+                                        processingState, callback));
+                        result.whenCompleteAsync(
+                                (c, e) -> BundleUtil.tryCloseResource(processingState),
+                                resourceClosingExecutor);
+                    } finally {
+                        if (result == null) {
+                            resourceClosingExecutor.execute(
+                                    () -> BundleUtil.tryCloseResource(processingState));
+                        }
+                    }
+                });
             }
         };
     }
@@ -414,7 +475,7 @@
                                 try {
                                     ensureRemoteIntelligenceServiceInitialized();
                                     mRemoteOnDeviceIntelligenceService.run(
-                                            intelligenceService -> intelligenceService.notifyInferenceServiceConnected());
+                                            IOnDeviceIntelligenceService::notifyInferenceServiceConnected);
                                     service.registerRemoteStorageService(
                                             getIRemoteStorageService());
                                 } catch (RemoteException ex) {
@@ -433,18 +494,49 @@
             public void getReadOnlyFileDescriptor(
                     String filePath,
                     AndroidFuture<ParcelFileDescriptor> future) {
+                ensureRemoteIntelligenceServiceInitialized();
+                AndroidFuture<ParcelFileDescriptor> pfdFuture = new AndroidFuture<>();
                 mRemoteOnDeviceIntelligenceService.run(
                         service -> service.getReadOnlyFileDescriptor(
-                                filePath, future));
+                                filePath, pfdFuture));
+                pfdFuture.whenCompleteAsync((pfd, error) -> {
+                    try {
+                        if (error != null) {
+                            future.completeExceptionally(error);
+                        } else {
+                            validatePfdReadOnly(pfd);
+                            future.complete(pfd);
+                        }
+                    } finally {
+                        tryClosePfd(pfd);
+                    }
+                }, callbackExecutor);
             }
 
             @Override
             public void getReadOnlyFeatureFileDescriptorMap(
                     Feature feature,
                     RemoteCallback remoteCallback) {
+                ensureRemoteIntelligenceServiceInitialized();
                 mRemoteOnDeviceIntelligenceService.run(
                         service -> service.getReadOnlyFeatureFileDescriptorMap(
-                                feature, remoteCallback));
+                                feature,
+                                new RemoteCallback(result -> callbackExecutor.execute(() -> {
+                                    try {
+                                        if (result == null) {
+                                            remoteCallback.sendResult(null);
+                                        }
+                                        for (String key : result.keySet()) {
+                                            ParcelFileDescriptor pfd = result.getParcelable(key,
+                                                    ParcelFileDescriptor.class);
+                                            validatePfdReadOnly(pfd);
+                                        }
+                                        remoteCallback.sendResult(result);
+                                    } finally {
+                                        resourceClosingExecutor.execute(
+                                                () -> BundleUtil.tryCloseResource(result));
+                                    }
+                                }))));
             }
         };
     }
@@ -460,7 +552,8 @@
             ServiceInfo serviceInfo = AppGlobals.getPackageManager().getServiceInfo(
                     serviceComponent,
                     PackageManager.MATCH_DIRECT_BOOT_AWARE
-                            | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, 0);
+                            | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
+                    UserHandle.SYSTEM.getIdentifier());
             if (serviceInfo != null) {
                 if (!checkIsolated) {
                     checkServiceRequiresPermission(serviceInfo,
@@ -538,8 +631,14 @@
                 Manifest.permission.USE_ON_DEVICE_INTELLIGENCE, TAG);
         synchronized (mLock) {
             mTemporaryServiceNames = componentNames;
-            mRemoteOnDeviceIntelligenceService = null;
-            mRemoteInferenceService = null;
+            if (mRemoteInferenceService != null) {
+                mRemoteInferenceService.unbind();
+                mRemoteInferenceService = null;
+            }
+            if (mRemoteOnDeviceIntelligenceService != null) {
+                mRemoteOnDeviceIntelligenceService.unbind();
+                mRemoteOnDeviceIntelligenceService = null;
+            }
             if (mTemporaryHandler == null) {
                 mTemporaryHandler = new Handler(Looper.getMainLooper(), null, true) {
                     @Override
@@ -589,4 +688,57 @@
 
         throw new SecurityException(message + ": Only shell user can call it");
     }
+
+    private AndroidFuture<IBinder> wrapCancellationFuture(
+            AndroidFuture future) {
+        if (future == null) {
+            return null;
+        }
+        AndroidFuture<IBinder> cancellationFuture = new AndroidFuture<>();
+        cancellationFuture.whenCompleteAsync((c, e) -> {
+            if (e != null) {
+                Log.e(TAG, "Error forwarding ICancellationSignal to manager layer", e);
+                future.completeExceptionally(e);
+            } else {
+                future.complete(new ICancellationSignal.Stub() {
+                    @Override
+                    public void cancel() throws RemoteException {
+                        ICancellationSignal.Stub.asInterface(c).cancel();
+                    }
+                });
+            }
+        });
+        return cancellationFuture;
+    }
+
+    private AndroidFuture<IBinder> wrapProcessingFuture(
+            AndroidFuture future) {
+        if (future == null) {
+            return null;
+        }
+        AndroidFuture<IBinder> processingSignalFuture = new AndroidFuture<>();
+        processingSignalFuture.whenCompleteAsync((c, e) -> {
+            if (e != null) {
+                future.completeExceptionally(e);
+            } else {
+                future.complete(new IProcessingSignal.Stub() {
+                    @Override
+                    public void sendSignal(PersistableBundle actionParams) throws RemoteException {
+                        IProcessingSignal.Stub.asInterface(c).sendSignal(actionParams);
+                    }
+                });
+            }
+        });
+        return processingSignalFuture;
+    }
+
+    private static void tryClosePfd(ParcelFileDescriptor pfd) {
+        if (pfd != null) {
+            try {
+                pfd.close();
+            } catch (IOException e) {
+                Log.e(TAG, "Failed to close parcel file descriptor ", e);
+            }
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/os/Android.bp b/services/core/java/com/android/server/os/Android.bp
index 565dc3b..c588670 100644
--- a/services/core/java/com/android/server/os/Android.bp
+++ b/services/core/java/com/android/server/os/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "core_os_flags",
     package: "com.android.server.os",
+    container: "system",
     srcs: [
         "*.aconfig",
     ],
diff --git a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
index 4eb8b2b..c8fd7e4 100644
--- a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
+++ b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
@@ -184,6 +184,16 @@
                         throwInvalidBugreportFileForCallerException(
                                 bugreportFile, callingInfo.second);
                     }
+
+                    boolean keepBugreportOnRetrieval = false;
+                    if (onboardingBugreportV2Enabled()) {
+                        keepBugreportOnRetrieval = mBugreportFilesToPersist.contains(
+                                bugreportFile);
+                    }
+
+                    if (!keepBugreportOnRetrieval) {
+                        bugreportFilesForUid.remove(bugreportFile);
+                    }
                 } else {
                     ArraySet<String> bugreportFilesForCaller = mBugreportFiles.get(callingInfo);
                     if (bugreportFilesForCaller != null
diff --git a/services/core/java/com/android/server/os/TEST_MAPPING b/services/core/java/com/android/server/os/TEST_MAPPING
index d937af1..50c8964 100644
--- a/services/core/java/com/android/server/os/TEST_MAPPING
+++ b/services/core/java/com/android/server/os/TEST_MAPPING
@@ -45,6 +45,10 @@
     },
     {
       "file_patterns": ["Bugreport[^/]*\\.java"],
+      "name": "CtsRootBugreportTestCases"
+    },
+    {
+      "file_patterns": ["Bugreport[^/]*\\.java"],
       "name": "ShellTests"
     }
   ]
diff --git a/services/core/java/com/android/server/os/core_os_flags.aconfig b/services/core/java/com/android/server/os/core_os_flags.aconfig
index cbc0d54..ae33df8 100644
--- a/services/core/java/com/android/server/os/core_os_flags.aconfig
+++ b/services/core/java/com/android/server/os/core_os_flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.os"
+container: "system"
 
 flag {
     name: "proto_tombstone"
diff --git a/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java b/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java
index 017cf55..306f77d 100644
--- a/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java
+++ b/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java
@@ -25,6 +25,7 @@
 
 import android.content.Intent;
 import android.hardware.usb.UsbManager;
+import android.nfc.NfcAdapter;
 import android.provider.AlarmClock;
 import android.provider.MediaStore;
 
@@ -361,6 +362,7 @@
                     .addCategory(Intent.CATEGORY_DEFAULT)
                     .build();
 
+
     public static List<DefaultCrossProfileIntentFilter> getDefaultManagedProfileFilters() {
         List<DefaultCrossProfileIntentFilter> filters =
                 new ArrayList<DefaultCrossProfileIntentFilter>();
@@ -637,6 +639,33 @@
                     .addDataType("video/*")
                     .build();
 
+    /** NFC TAG intent is always resolved by the primary user. */
+    static final DefaultCrossProfileIntentFilter PARENT_TO_CLONE_NFC_TAG_DISCOVERED =
+            new DefaultCrossProfileIntentFilter.Builder(
+                    DefaultCrossProfileIntentFilter.Direction.TO_PROFILE,
+                    /* flags= */0,
+                    /* letsPersonalDataIntoProfile= */ false)
+                    .addAction(NfcAdapter.ACTION_TAG_DISCOVERED)
+                    .build();
+
+    /** NFC TAG intent is always resolved by the primary user. */
+    static final DefaultCrossProfileIntentFilter PARENT_TO_CLONE_NFC_TECH_DISCOVERED =
+            new DefaultCrossProfileIntentFilter.Builder(
+                    DefaultCrossProfileIntentFilter.Direction.TO_PROFILE,
+                    /* flags= */0,
+                    /* letsPersonalDataIntoProfile= */ false)
+                    .addAction(NfcAdapter.ACTION_TECH_DISCOVERED)
+                    .build();
+
+    /** NFC TAG intent is always resolved by the primary user. */
+    static final DefaultCrossProfileIntentFilter PARENT_TO_CLONE_NFC_NDEF_DISCOVERED =
+            new DefaultCrossProfileIntentFilter.Builder(
+                    DefaultCrossProfileIntentFilter.Direction.TO_PROFILE,
+                    /* flags= */0,
+                    /* letsPersonalDataIntoProfile= */ false)
+                    .addAction(NfcAdapter.ACTION_NDEF_DISCOVERED)
+                    .build();
+
     public static List<DefaultCrossProfileIntentFilter> getDefaultCloneProfileFilters() {
         return Arrays.asList(
                 PARENT_TO_CLONE_SEND_ACTION,
@@ -652,7 +681,10 @@
                 CLONE_TO_PARENT_SMS_MMS,
                 CLONE_TO_PARENT_PHOTOPICKER_SELECTION,
                 CLONE_TO_PARENT_ACTION_PICK_IMAGES,
-                CLONE_TO_PARENT_ACTION_PICK_IMAGES_WITH_DATA_TYPES
+                CLONE_TO_PARENT_ACTION_PICK_IMAGES_WITH_DATA_TYPES,
+                PARENT_TO_CLONE_NFC_TAG_DISCOVERED,
+                PARENT_TO_CLONE_NFC_TECH_DISCOVERED,
+                PARENT_TO_CLONE_NFC_NDEF_DISCOVERED
         );
     }
 
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index c559892..2a3b939 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -19,6 +19,7 @@
 import static android.content.pm.Flags.disallowSdkLibsToBeApps;
 import static android.content.pm.PackageManager.APP_METADATA_SOURCE_APK;
 import static android.content.pm.PackageManager.APP_METADATA_SOURCE_INSTALLER;
+import static android.content.pm.PackageManager.APP_METADATA_SOURCE_UNKNOWN;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
 import static android.content.pm.PackageManager.INSTALL_FAILED_ALREADY_EXISTS;
@@ -36,6 +37,7 @@
 import static android.content.pm.PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
 import static android.content.pm.PackageManager.INSTALL_STAGED;
 import static android.content.pm.PackageManager.INSTALL_SUCCEEDED;
+import static android.content.pm.PackageManager.PROPERTY_ANDROID_SAFETY_LABEL_PATH;
 import static android.content.pm.PackageManager.UNINSTALL_REASON_UNKNOWN;
 import static android.content.pm.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V4;
 import static android.content.pm.parsing.ApkLiteParseUtils.isApkFile;
@@ -45,8 +47,8 @@
 import static android.os.storage.StorageManager.FLAG_STORAGE_DE;
 import static android.os.storage.StorageManager.FLAG_STORAGE_EXTERNAL;
 
-import static com.android.internal.pm.pkg.parsing.ParsingPackageUtils.APP_METADATA_FILE_NAME;
 import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
+import static com.android.server.pm.PackageManagerService.APP_METADATA_FILE_NAME;
 import static com.android.server.pm.PackageManagerService.DEBUG_COMPRESSION;
 import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL;
 import static com.android.server.pm.PackageManagerService.DEBUG_PACKAGE_SCANNING;
@@ -746,7 +748,7 @@
                                 onInstallComplete(PackageManager.INSTALL_SUCCEEDED, mContext,
                                         onCompleteSender);
                             }
-                        });
+                        }, pkgSetting.getAppId(), callingUid, pkgSetting.isSystem());
                 restoreAndPostInstall(request);
             }
         } finally {
@@ -2206,8 +2208,10 @@
                         ps.setAppMetadataSource(APP_METADATA_SOURCE_INSTALLER);
                     }
                 } else {
+                    Map<String, PackageManager.Property> properties = parsedPackage.getProperties();
                     if (Flags.aslInApkAppMetadataSource()
-                            && parsedPackage.isAppMetadataFileInApk()) {
+                            && properties.containsKey(PROPERTY_ANDROID_SAFETY_LABEL_PATH)) {
+                        // ASL file extraction is done in post-install
                         ps.setAppMetadataFilePath(appMetadataFile.getAbsolutePath());
                         ps.setAppMetadataSource(APP_METADATA_SOURCE_APK);
                     } else {
@@ -2807,6 +2811,20 @@
         }
 
         if (succeeded) {
+            if (Flags.aslInApkAppMetadataSource()
+                    && pkgSetting.getAppMetadataSource() == APP_METADATA_SOURCE_APK) {
+                if (!PackageManagerServiceUtils.extractAppMetadataFromApk(request.getPkg(),
+                        pkgSetting.getAppMetadataFilePath())) {
+                    synchronized (mPm.mLock) {
+                        PackageSetting setting = mPm.mSettings.getPackageLPr(packageName);
+                        if (setting != null) {
+                            setting.setAppMetadataFilePath(null)
+                                    .setAppMetadataSource(APP_METADATA_SOURCE_UNKNOWN);
+                        }
+                    }
+                }
+            }
+
             // Clear the uid cache after we installed a new package.
             mPm.mPerUidReadTimeoutsCache = null;
 
diff --git a/services/core/java/com/android/server/pm/InstallRequest.java b/services/core/java/com/android/server/pm/InstallRequest.java
index c10196f..4dcee04 100644
--- a/services/core/java/com/android/server/pm/InstallRequest.java
+++ b/services/core/java/com/android/server/pm/InstallRequest.java
@@ -158,6 +158,8 @@
     @Nullable
     private DomainSet mPreVerifiedDomains;
 
+    private int mInstallerUidForInstallExisting = INVALID_UID;
+
     // New install
     InstallRequest(InstallingSession params) {
         mUserId = params.getUser().getIdentifier();
@@ -180,7 +182,7 @@
 
     // Install existing package as user
     InstallRequest(int userId, int returnCode, AndroidPackage pkg, int[] newUsers,
-            Runnable runnable) {
+            Runnable runnable, int appId, int installerUid, boolean isSystem) {
         mUserId = userId;
         mInstallArgs = null;
         mReturnCode = returnCode;
@@ -191,6 +193,9 @@
         mIsInstallForUsers = true;
         mSessionId = -1;
         mRequireUserAction = USER_ACTION_UNSPECIFIED;
+        mAppId = appId;
+        mInstallerUidForInstallExisting = installerUid;
+        mSystem = isSystem;
     }
 
     // addForInit
@@ -381,7 +386,8 @@
 
     public int getInstallerPackageUid() {
         return (mInstallArgs != null && mInstallArgs.mInstallSource != null)
-                ? mInstallArgs.mInstallSource.mInstallerPackageUid : INVALID_UID;
+                ? mInstallArgs.mInstallSource.mInstallerPackageUid
+                : mInstallerUidForInstallExisting;
     }
 
     public int getDataLoaderType() {
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index 20b669b..4c95e83 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -104,6 +104,7 @@
 import android.os.ShellCommand;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.provider.DeviceConfig;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -161,9 +162,8 @@
 public class LauncherAppsService extends SystemService {
     private static final String WM_TRACE_DIR = "/data/misc/wmtrace/";
     private static final String VC_FILE_SUFFIX = ".vc";
-    // TODO(b/310027945): Update the intent name.
     private static final String PS_SETTINGS_INTENT =
-            "com.android.settings.action.PRIVATE_SPACE_SETUP_FLOW";
+            "com.android.settings.action.OPEN_PRIVATE_SPACE_SETTINGS";
 
     private static final Set<PosixFilePermission> WM_TRACE_FILE_PERMISSIONS = Set.of(
             PosixFilePermission.OWNER_WRITE,
@@ -215,7 +215,9 @@
     static class LauncherAppsImpl extends ILauncherApps.Stub {
         private static final boolean DEBUG = false;
         private static final String TAG = "LauncherAppsService";
-
+        private static final String NAMESPACE_MULTIUSER = "multiuser";
+        private static final String FLAG_NON_SYSTEM_ACCESS_TO_HIDDEN_PROFILES =
+                "allow_3p_launchers_access_via_launcher_apps_apis";
         private final Context mContext;
         private final UserManager mUm;
         private final RoleManager mRoleManager;
@@ -563,6 +565,10 @@
                     return true;
                 }
 
+                if (isAccessToHiddenProfilesForNonSystemAppsForbidden()) {
+                    return false;
+                }
+
                 if (!mRoleManager
                         .getRoleHoldersAsUser(
                                 RoleManager.ROLE_HOME, UserHandle.getUserHandleForUid(callingUid))
@@ -570,7 +576,6 @@
                     return false;
                 }
 
-                // TODO(b/321988638): add option to disable with a flag
                 return mContext.checkPermission(
                                 android.Manifest.permission.ACCESS_HIDDEN_PROFILES,
                                 callingPid,
@@ -581,6 +586,13 @@
             }
         }
 
+        private boolean isAccessToHiddenProfilesForNonSystemAppsForbidden() {
+            return !DeviceConfig.getBoolean(
+                    NAMESPACE_MULTIUSER,
+                    FLAG_NON_SYSTEM_ACCESS_TO_HIDDEN_PROFILES,
+                    /* defaultValue= */ true);
+        }
+
         private boolean areHiddenApisChecksEnabled() {
             return android.os.Flags.allowPrivateProfile()
                     && Flags.enableHidingProfiles()
@@ -1788,15 +1800,26 @@
                 Slog.e(TAG, "Caller cannot access hidden profiles");
                 return null;
             }
+            final int callingUser = getCallingUserId();
+            final int callingUid = getCallingUid();
             final long identity = Binder.clearCallingIdentity();
             try {
                 Intent psSettingsIntent = new Intent(PS_SETTINGS_INTENT);
                 psSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                         | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-                final PendingIntent pi = PendingIntent.getActivity(mContext,
+                List<ResolveInfo> ri = mPackageManagerInternal.queryIntentActivities(
+                        psSettingsIntent,
+                        psSettingsIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
+                        PackageManager.MATCH_SYSTEM_ONLY, callingUid, callingUser);
+                if (ri.isEmpty()) {
+                    return null;
+                }
+                final PendingIntent pi = PendingIntent.getActivityAsUser(mContext,
                         /* requestCode */ 0,
                         psSettingsIntent,
-                        PendingIntent.FLAG_IMMUTABLE | FLAG_UPDATE_CURRENT);
+                        PendingIntent.FLAG_IMMUTABLE | FLAG_UPDATE_CURRENT,
+                        null,
+                        UserHandle.of(callingUser));
                 return pi == null ? null : pi.getIntentSender();
             } finally {
                 Binder.restoreCallingIdentity(identity);
diff --git a/services/core/java/com/android/server/pm/NoFilteringResolver.java b/services/core/java/com/android/server/pm/NoFilteringResolver.java
index b87256d..712413c 100644
--- a/services/core/java/com/android/server/pm/NoFilteringResolver.java
+++ b/services/core/java/com/android/server/pm/NoFilteringResolver.java
@@ -60,9 +60,12 @@
     public static boolean isIntentRedirectionAllowed(Context context,
             AppCloningDeviceConfigHelper appCloningDeviceConfigHelper, boolean resolveForStart,
             long flags) {
+        boolean canMatchCloneProfile = (flags & PackageManager.MATCH_CLONE_PROFILE) != 0
+                || (flags & PackageManager.MATCH_CLONE_PROFILE_LONG) != 0;
         return isAppCloningBuildingBlocksEnabled(context, appCloningDeviceConfigHelper)
-                    && (resolveForStart || (((flags & PackageManager.MATCH_CLONE_PROFILE) != 0)
-                    && hasPermission(context, Manifest.permission.QUERY_CLONED_APPS)));
+                && (resolveForStart
+                    || (canMatchCloneProfile
+                        && hasPermission(context, Manifest.permission.QUERY_CLONED_APPS)));
     }
 
     public NoFilteringResolver(ComponentResolverApi componentResolver,
diff --git a/services/core/java/com/android/server/pm/PackageArchiver.java b/services/core/java/com/android/server/pm/PackageArchiver.java
index ec98fff..fda4dc6 100644
--- a/services/core/java/com/android/server/pm/PackageArchiver.java
+++ b/services/core/java/com/android/server/pm/PackageArchiver.java
@@ -187,7 +187,7 @@
     }
 
     public static boolean isArchivingEnabled() {
-        return Flags.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false);
+        return Flags.archiving();
     }
 
     @VisibleForTesting
@@ -293,9 +293,26 @@
             return START_PERMISSION_DENIED;
         }
 
-        Slog.i(TAG, TextUtils.formatSimple("Unarchival is starting for: %s", packageName));
-
         try {
+            boolean openAppDetailsIfOngoingUnarchival = getAppOpsManager().checkOp(
+                    AppOpsManager.OP_UNARCHIVAL_CONFIRMATION, callingUid, callerPackageName)
+                    == MODE_ALLOWED;
+            if (openAppDetailsIfOngoingUnarchival) {
+                PackageInstaller.SessionInfo activeUnarchivalSession = getActiveUnarchivalSession(
+                        packageName, userId);
+                if (activeUnarchivalSession != null) {
+                    mPm.mHandler.post(() -> {
+                        Slog.i(TAG, "Opening app details page for ongoing unarchival of: "
+                                + packageName);
+                        getLauncherApps().startPackageInstallerSessionDetailsActivity(
+                                activeUnarchivalSession, null, null);
+                    });
+                    return START_ABORTED;
+                }
+            }
+
+            Slog.i(TAG, TextUtils.formatSimple("Unarchival is starting for: %s", packageName));
+
             requestUnarchive(packageName, callerPackageName,
                     getOrCreateLauncherListener(userId, packageName),
                     UserHandle.of(userId),
@@ -793,8 +810,27 @@
             }
         }
 
-        mPm.mHandler.post(
-                () -> unarchiveInternal(packageName, userHandle, installerPackage, draftSessionId));
+        mPm.mHandler.post(() -> {
+            Slog.i(TAG, "Starting app unarchival for: " + packageName);
+            unarchiveInternal(packageName, userHandle, installerPackage,
+                    draftSessionId);
+        });
+    }
+
+    @Nullable
+    private PackageInstaller.SessionInfo getActiveUnarchivalSession(String packageName,
+            int userId) {
+        List<PackageInstaller.SessionInfo> activeSessions =
+                mPm.mInstallerService.getAllSessions(userId).getList();
+        for (int idx = 0; idx < activeSessions.size(); idx++) {
+            PackageInstaller.SessionInfo activeSession = activeSessions.get(idx);
+            if (activeSession.appPackageName.equals(packageName)
+                    && activeSession.userId == userId && activeSession.active
+                    && activeSession.isUnarchival()) {
+                return activeSession;
+            }
+        }
+        return null;
     }
 
     private void requestUnarchiveConfirmation(String packageName, IntentSender statusReceiver,
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 29320ae..a5cd821 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -838,7 +838,8 @@
 
         if ((params.installFlags & PackageManager.INSTALL_BYPASS_LOW_TARGET_SDK_BLOCK) != 0
                 && !PackageManagerServiceUtils.isSystemOrRootOrShell(callingUid)
-                && !Build.IS_DEBUGGABLE) {
+                && !Build.IS_DEBUGGABLE
+                && !PackageManagerServiceUtils.isAdoptedShell(callingUid, mContext)) {
             // If the bypass flag is set, but not running as system root or shell then remove
             // the flag
             params.installFlags &= ~PackageManager.INSTALL_BYPASS_LOW_TARGET_SDK_BLOCK;
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 3eeeae7..80a5f3a 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -1085,11 +1085,17 @@
         final boolean isUpdateOwnershipEnforcementEnabled =
                 mPm.isUpdateOwnershipEnforcementAvailable()
                         && existingUpdateOwnerPackageName != null;
+        // 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.
+        final boolean isInstallUnarchive =
+                (params.installFlags & PackageManager.INSTALL_UNARCHIVE) != 0;
 
         // Device owners and affiliated profile owners are allowed to silently install packages, so
         // the permission check is waived if the installer is the device owner.
         final boolean noUserActionNecessary = isInstallerRoot || isInstallerSystem
-                || isInstallerDeviceOwnerOrAffiliatedProfileOwner() || isEmergencyInstall;
+                || isInstallerDeviceOwnerOrAffiliatedProfileOwner() || isEmergencyInstall
+                || isInstallUnarchive;
 
         if (noUserActionNecessary) {
             return userActionNotTypicallyNeededResponse;
diff --git a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java
index 7a72e70..d2b60a4 100644
--- a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java
+++ b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java
@@ -16,7 +16,7 @@
 
 package com.android.server.pm;
 
-import static android.app.admin.flags.Flags.crossUserSuspensionEnabled;
+import static android.app.admin.flags.Flags.crossUserSuspensionEnabledRo;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
 import static android.content.pm.PackageManager.RESTRICTION_NONE;
 
@@ -690,7 +690,7 @@
     @Deprecated
     public final void unsuspendAdminSuspendedPackages(int affectedUser) {
         final int suspendingUserId =
-                crossUserSuspensionEnabled() ? UserHandle.USER_SYSTEM : affectedUser;
+                crossUserSuspensionEnabledRo() ? UserHandle.USER_SYSTEM : affectedUser;
         mService.unsuspendForSuspendingPackage(
                 snapshot(), PLATFORM_PACKAGE_NAME, suspendingUserId, /* inAllUsers= */ false);
     }
@@ -699,7 +699,7 @@
     @Deprecated
     public final boolean isAdminSuspendingAnyPackages(int userId) {
         final int suspendingUserId =
-                crossUserSuspensionEnabled() ? UserHandle.USER_SYSTEM : userId;
+                crossUserSuspensionEnabledRo() ? UserHandle.USER_SYSTEM : userId;
         return snapshot().isSuspendingAnyPackages(PLATFORM_PACKAGE_NAME, suspendingUserId, userId);
     }
 
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 9a2b98f..68cd3e4 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -18,9 +18,7 @@
 import static android.Manifest.permission.MANAGE_DEVICE_ADMINS;
 import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
 import static android.app.AppOpsManager.MODE_IGNORED;
-import static android.app.admin.flags.Flags.crossUserSuspensionEnabled;
-import static android.content.pm.PackageManager.APP_METADATA_SOURCE_APK;
-import static android.content.pm.PackageManager.APP_METADATA_SOURCE_UNKNOWN;
+import static android.app.admin.flags.Flags.crossUserSuspensionEnabledRo;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
@@ -593,7 +591,6 @@
     static final char RANDOM_CODEPATH_PREFIX = '-';
 
     public static final String APP_METADATA_FILE_NAME = "app.metadata";
-    public static final String APP_METADATA_FILE_IN_APK_PATH = "assets/" + APP_METADATA_FILE_NAME;
 
     static final int DEFAULT_FILE_ACCESS_MODE = 0644;
 
@@ -2447,7 +2444,7 @@
             ComponentName intentFilterVerifierComponent =
                     getIntentFilterVerifierComponentNameLPr(computer);
             ComponentName domainVerificationAgent =
-                    getDomainVerificationAgentComponentNameLPr(computer);
+                    getDomainVerificationAgentComponentNameLPr(computer, UserHandle.USER_SYSTEM);
 
             DomainVerificationProxy domainVerificationProxy = DomainVerificationProxy.makeProxy(
                     intentFilterVerifierComponent, domainVerificationAgent, mContext,
@@ -2755,12 +2752,13 @@
     }
 
     @Nullable
-    private ComponentName getDomainVerificationAgentComponentNameLPr(@NonNull Computer computer) {
+    private ComponentName getDomainVerificationAgentComponentNameLPr(@NonNull Computer computer,
+            int userId) {
         Intent intent = new Intent(Intent.ACTION_DOMAINS_NEED_VERIFICATION);
         List<ResolveInfo> matches =
                 mResolveIntentHelper.queryIntentReceiversInternal(computer, intent, null,
                         MATCH_SYSTEM_ONLY | MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE,
-                        UserHandle.USER_SYSTEM, Binder.getCallingUid());
+                        userId, Binder.getCallingUid());
         ResolveInfo best = null;
         final int N = matches.size();
         for (int i = 0; i < N; i++) {
@@ -2768,7 +2766,7 @@
             final String packageName = cur.getComponentInfo().packageName;
             if (checkPermission(
                     android.Manifest.permission.DOMAIN_VERIFICATION_AGENT, packageName,
-                    UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) {
+                    userId) != PackageManager.PERMISSION_GRANTED) {
                 Slog.w(TAG, "Domain verification agent found but does not hold permission: "
                         + packageName);
                 continue;
@@ -2776,7 +2774,7 @@
 
             if (best == null || cur.priority > best.priority) {
                 if (computer.isComponentEffectivelyEnabled(cur.getComponentInfo(),
-                        UserHandle.SYSTEM)) {
+                        UserHandle.of(userId))) {
                     best = cur;
                 } else {
                     Slog.w(TAG, "Domain verification agent found but not enabled");
@@ -3182,7 +3180,7 @@
                     callingMethod);
         }
 
-        if (crossUserSuspensionEnabled()) {
+        if (crossUserSuspensionEnabledRo()) {
             final int suspendingPackageUid =
                     snapshot.getPackageUid(suspender.packageName, 0, suspender.userId);
             if (suspendingPackageUid != callingUid) {
@@ -3220,7 +3218,7 @@
         final String[] allPackages = computer.getPackageStates().keySet().toArray(new String[0]);
         final Predicate<UserPackage> suspenderPredicate =
                 UserPackage.of(suspendingUserId, suspendingPackage)::equals;
-        if (!crossUserSuspensionEnabled() || !inAllUsers) {
+        if (!crossUserSuspensionEnabledRo() || !inAllUsers) {
             mSuspendPackageHelper.removeSuspensionsBySuspendingPackage(computer,
                     allPackages, suspenderPredicate, suspendingUserId);
         } else {
@@ -4366,7 +4364,7 @@
         }
         mInstantAppRegistry.onUserRemoved(userId);
         mPackageMonitorCallbackHelper.onUserRemoved(userId);
-        if (crossUserSuspensionEnabled()) {
+        if (crossUserSuspensionEnabledRo()) {
             cleanUpCrossUserSuspension(userId);
         }
     }
@@ -5232,21 +5230,6 @@
                 return null;
             }
             File file = new File(filePath);
-            if (Flags.aslInApkAppMetadataSource() && !file.exists()
-                    && ps.getAppMetadataSource() == APP_METADATA_SOURCE_APK) {
-                String apkPath = ps.getPkg().getSplits().get(0).getPath();
-                if (!PackageManagerServiceUtils.extractAppMetadataFromApk(apkPath, file)) {
-                    if (file.exists()) {
-                        file.delete();
-                    }
-                    synchronized (mLock) {
-                        PackageSetting pkgSetting = mSettings.getPackageLPr(packageName);
-                        pkgSetting.setAppMetadataFilePath(null);
-                        pkgSetting.setAppMetadataSource(APP_METADATA_SOURCE_UNKNOWN);
-                    }
-                    return null;
-                }
-            }
             try {
                 return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
             } catch (FileNotFoundException e) {
@@ -6257,9 +6240,26 @@
                 packageStateWrite.setMimeGroup(mimeGroup, mimeTypesSet);
             });
             if (mComponentResolver.updateMimeGroup(snapshotComputer(), packageName, mimeGroup)) {
-                Binder.withCleanCallingIdentity(() ->
-                        mPreferredActivityHelper.clearPackagePreferredActivities(packageName,
-                                UserHandle.USER_ALL));
+                Binder.withCleanCallingIdentity(() -> {
+                    mPreferredActivityHelper.clearPackagePreferredActivities(packageName,
+                            UserHandle.USER_ALL);
+                    // Send the ACTION_PACKAGE_CHANGED when the mimeGroup has changes
+                    final Computer snapShot = snapshotComputer();
+                    final ArrayList<String> components = new ArrayList<>(
+                            Collections.singletonList(packageName));
+                    final int appId = packageState.getAppId();
+                    final int[] userIds = resolveUserIds(UserHandle.USER_ALL);
+                    final String reason = "The mimeGroup is changed";
+                    for (int i = 0; i < userIds.length; i++) {
+                        final PackageUserStateInternal pkgUserState =
+                                packageState.getUserStates().get(userIds[i]);
+                        if (pkgUserState != null && pkgUserState.isInstalled()) {
+                            final int packageUid = UserHandle.getUid(userIds[i], appId);
+                            mBroadcastHelper.sendPackageChangedBroadcast(snapShot, packageName,
+                                    true /* dontKillApp */, components, packageUid, reason);
+                        }
+                    }
+                });
             }
 
             scheduleWriteSettings();
@@ -6280,7 +6280,7 @@
             final boolean quarantined = ((flags & PackageManager.FLAG_SUSPEND_QUARANTINED) != 0)
                     && Flags.quarantinedEnabled();
             final Computer snapshot = snapshotComputer();
-            final UserPackage suspender = crossUserSuspensionEnabled()
+            final UserPackage suspender = crossUserSuspensionEnabledRo()
                     ? UserPackage.of(suspendingUserId, suspendingPackage)
                     : UserPackage.of(targetUserId, suspendingPackage);
             enforceCanSetPackagesSuspendedAsUser(snapshot, quarantined, suspender, callingUid,
@@ -6491,13 +6491,25 @@
 
         @Override
         @Nullable
-        public ComponentName getDomainVerificationAgent() {
+        public ComponentName getDomainVerificationAgent(int userId) {
             final int callerUid = Binder.getCallingUid();
             if (!PackageManagerServiceUtils.isRootOrShell(callerUid)) {
                 throw new SecurityException("Not allowed to query domain verification agent");
             }
             final Computer snapshot = snapshotComputer();
-            return getDomainVerificationAgentComponentNameLPr(snapshot);
+            final ComponentName agent = mDomainVerificationManager.getProxy().getComponentName();
+            final PackageStateInternal ps = snapshot.getPackageStateForInstalledAndFiltered(
+                    agent.getPackageName(), callerUid, userId);
+            if (ps == null) {
+                return null;
+            }
+            final var disabledComponents =
+                    ps.getUserStateOrDefault(userId).getDisabledComponentsNoCopy();
+            if (disabledComponents != null && disabledComponents.contains(agent.getClassName())) {
+                return null;
+            }
+            // Only return the result if the agent is installed and enabled on the target user
+            return agent;
         }
 
         @Override
@@ -6753,7 +6765,7 @@
             // Suspension by admin isn't attributed to admin package but to the platform,
             // Using USER_SYSTEM for consistency with other internal suspenders, like shell or root.
             final int suspendingUserId =
-                    crossUserSuspensionEnabled() ? UserHandle.USER_SYSTEM : userId;
+                    crossUserSuspensionEnabledRo() ? UserHandle.USER_SYSTEM : userId;
             final UserPackage suspender = UserPackage.of(
                     suspendingUserId, PackageManagerService.PLATFORM_PACKAGE_NAME);
             return mSuspendPackageHelper.setPackagesSuspended(snapshotComputer(), packageNames,
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 189a138..9484d0d 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -19,6 +19,7 @@
 import static android.content.pm.PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
 import static android.content.pm.PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
 import static android.content.pm.PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE;
+import static android.content.pm.PackageManager.PROPERTY_ANDROID_SAFETY_LABEL_PATH;
 import static android.content.pm.SigningDetails.CertCapabilities.SHARED_USER_ID;
 import static android.system.OsConstants.O_CREAT;
 import static android.system.OsConstants.O_RDWR;
@@ -29,7 +30,6 @@
 import static com.android.server.LocalManagerRegistry.ManagerNotFoundException;
 import static com.android.server.pm.PackageInstallerSession.APP_METADATA_FILE_ACCESS_MODE;
 import static com.android.server.pm.PackageInstallerSession.getAppMetadataSizeLimit;
-import static com.android.server.pm.PackageManagerService.APP_METADATA_FILE_IN_APK_PATH;
 import static com.android.server.pm.PackageManagerService.COMPRESSED_EXTENSION;
 import static com.android.server.pm.PackageManagerService.DEBUG_COMPRESSION;
 import static com.android.server.pm.PackageManagerService.DEBUG_INTENT_MATCHING;
@@ -60,6 +60,7 @@
 import android.content.pm.PackageInfoLite;
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.Property;
 import android.content.pm.PackagePartitions;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
@@ -111,6 +112,7 @@
 import com.android.server.compat.PlatformCompat;
 import com.android.server.pm.dex.PackageDexUsage;
 import com.android.server.pm.pkg.AndroidPackage;
+import com.android.server.pm.pkg.AndroidPackageSplit;
 import com.android.server.pm.pkg.PackageStateInternal;
 import com.android.server.pm.resolution.ComponentResolverApi;
 import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
@@ -140,13 +142,14 @@
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
+import java.util.zip.ZipFile;
 
 /**
  * Class containing helper methods for the PackageManagerService.
@@ -1567,30 +1570,41 @@
     /**
      * Extract the app.metadata file from apk.
      */
-    public static boolean extractAppMetadataFromApk(String apkPath, File appMetadataFile) {
-        boolean found = false;
-        try (ZipInputStream zipInputStream =
-                     new ZipInputStream(new FileInputStream(new File(apkPath)))) {
-            ZipEntry zipEntry = null;
-            while ((zipEntry = zipInputStream.getNextEntry()) != null) {
-                if (zipEntry.getName().equals(APP_METADATA_FILE_IN_APK_PATH)) {
-                    found = true;
-                    try (FileOutputStream out = new FileOutputStream(appMetadataFile)) {
-                        FileUtils.copy(zipInputStream, out);
-                    }
-                    if (appMetadataFile.length() > getAppMetadataSizeLimit()) {
-                        appMetadataFile.delete();
-                        return false;
-                    }
-                    Os.chmod(appMetadataFile.getAbsolutePath(), APP_METADATA_FILE_ACCESS_MODE);
-                    break;
-                }
-            }
-        } catch (Exception e) {
-            Slog.e(TAG, e.getMessage());
+    public static boolean extractAppMetadataFromApk(AndroidPackage pkg,
+            String appMetadataFilePath) {
+        if (appMetadataFilePath == null) {
             return false;
         }
-        return found;
+        File appMetadataFile = new File(appMetadataFilePath);
+        Map<String, Property> properties = pkg.getProperties();
+        if (!properties.containsKey(PROPERTY_ANDROID_SAFETY_LABEL_PATH)) {
+            return false;
+        }
+        Property fileInAPkPathProperty = properties.get(PROPERTY_ANDROID_SAFETY_LABEL_PATH);
+        if (!fileInAPkPathProperty.isString()) {
+            return false;
+        }
+        String fileInApkPath = fileInAPkPathProperty.getString();
+        List<AndroidPackageSplit> splits = pkg.getSplits();
+        for (int i = 0; i < splits.size(); i++) {
+            try (ZipFile zipFile = new ZipFile(splits.get(i).getPath())) {
+                ZipEntry zipEntry = zipFile.getEntry(fileInApkPath);
+                if (zipEntry != null && zipEntry.getSize() <= getAppMetadataSizeLimit()) {
+                    try (InputStream in = zipFile.getInputStream(zipEntry)) {
+                        try (FileOutputStream out = new FileOutputStream(appMetadataFile)) {
+                            FileUtils.copy(in, out);
+                            Os.chmod(appMetadataFile.getAbsolutePath(),
+                                    APP_METADATA_FILE_ACCESS_MODE);
+                            return true;
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                Slog.e(TAG, e.getMessage());
+                appMetadataFile.delete();
+            }
+        }
+        return false;
     }
 
     public static void linkFilesToOldDirs(@NonNull Installer installer,
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index a9e1725..1793794 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -28,7 +28,6 @@
 import static android.content.pm.PackageManager.RESTRICTION_NONE;
 
 import static com.android.server.LocalManagerRegistry.ManagerNotFoundException;
-import static com.android.server.pm.PackageManagerService.DEFAULT_FILE_ACCESS_MODE;
 
 import android.accounts.IAccountManager;
 import android.annotation.NonNull;
@@ -45,6 +44,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ArchivedPackageParcel;
 import android.content.pm.FeatureInfo;
+import android.content.pm.Flags;
 import android.content.pm.IPackageDataObserver;
 import android.content.pm.IPackageInstaller;
 import android.content.pm.IPackageManager;
@@ -3387,6 +3387,18 @@
                     }
                     sessionParams.setEnableRollback(true, rollbackStrategy);
                     break;
+                case "--rollback-impact-level":
+                    if (!Flags.recoverabilityDetection()) {
+                        throw new IllegalArgumentException("Unknown option " + opt);
+                    }
+                    int rollbackImpactLevel = Integer.parseInt(peekNextArg());
+                    if (rollbackImpactLevel < PackageManager.ROLLBACK_USER_IMPACT_LOW
+                            || rollbackImpactLevel
+                                    > PackageManager.ROLLBACK_USER_IMPACT_ONLY_MANUAL) {
+                        throw new IllegalArgumentException(
+                            rollbackImpactLevel + " is not a valid rollback impact level.");
+                    }
+                    sessionParams.setRollbackImpactLevel(rollbackImpactLevel);
                 case "--staged-ready-timeout":
                     params.stagedReadyTimeoutMs = Long.parseLong(getNextArgRequired());
                     break;
@@ -4412,8 +4424,31 @@
 
     private int runGetDomainVerificationAgent() throws RemoteException {
         final PrintWriter pw = getOutPrintWriter();
+        int userId = UserHandle.USER_ALL;
+
+        String opt;
+        while ((opt = getNextOption()) != null) {
+            if (opt.equals("--user")) {
+                userId = UserHandle.parseUserArg(getNextArgRequired());
+                if (userId != UserHandle.USER_ALL && userId != UserHandle.USER_CURRENT) {
+                    UserManagerInternal umi =
+                            LocalServices.getService(UserManagerInternal.class);
+                    UserInfo userInfo = umi.getUserInfo(userId);
+                    if (userInfo == null) {
+                        pw.println("Failure [user " + userId + " doesn't exist]");
+                        return 1;
+                    }
+                }
+            } else {
+                pw.println("Error: Unknown option: " + opt);
+                return 1;
+            }
+        }
+        final int translatedUserId =
+                translateUserId(userId, UserHandle.USER_SYSTEM, "runGetDomainVerificationAgent");
         try {
-            final ComponentName domainVerificationAgent = mInterface.getDomainVerificationAgent();
+            final ComponentName domainVerificationAgent =
+                    mInterface.getDomainVerificationAgent(translatedUserId);
             pw.println(domainVerificationAgent == null
                     ? "No Domain Verifier available!" : domainVerificationAgent.flattenToString());
         } catch (Exception e) {
@@ -4466,7 +4501,9 @@
         pw.println("      -d: filter to only show disabled packages");
         pw.println("      -e: filter to only show enabled packages");
         pw.println("      -s: filter to only show system packages");
-        pw.println("      -q: filter to only show quarantined packages");
+        if (Flags.quarantinedEnabled()) {
+            pw.println("      -q: filter to only show quarantined packages");
+        }
         pw.println("      -3: filter to only show third party packages");
         pw.println("      -i: see the installer for the packages");
         pw.println("      -l: ignored (used for compatibility with older releases)");
@@ -4546,6 +4583,11 @@
         pw.println("      --full: cause the app to be installed as a non-ephemeral full app");
         pw.println("      --enable-rollback: enable rollbacks for the upgrade.");
         pw.println("          0=restore (default), 1=wipe, 2=retain");
+        if (Flags.recoverabilityDetection()) {
+            pw.println(
+                    "      --rollback-impact-level: set device impact required for rollback.");
+            pw.println("          0=low (default), 1=high, 2=manual only");
+        }
         pw.println("      --install-location: force the install location:");
         pw.println("          0=auto, 1=internal only, 2=prefer external");
         pw.println("      --install-reason: indicates why the app is being installed:");
@@ -4823,8 +4865,10 @@
         pw.println("    to unarchive an app to the responsible installer. Options are:");
         pw.println("      --user: request unarchival of the app from the given user.");
         pw.println("");
-        pw.println("  get-domain-verification-agent");
+        pw.println("  get-domain-verification-agent [--user USER_ID]");
         pw.println("    Displays the component name of the domain verification agent on device.");
+        pw.println("    If the component isn't enabled, an error message will be displayed.");
+        pw.println("      --user: return the agent of the given user (SYSTEM_USER if unspecified)");
         pw.println("");
         printArtServiceHelp();
         pw.println("");
diff --git a/services/core/java/com/android/server/pm/PackageMetrics.java b/services/core/java/com/android/server/pm/PackageMetrics.java
index 24d2a26..a0b6897 100644
--- a/services/core/java/com/android/server/pm/PackageMetrics.java
+++ b/services/core/java/com/android/server/pm/PackageMetrics.java
@@ -29,6 +29,7 @@
 
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.server.LocalServices;
+import com.android.server.pm.pkg.AndroidPackage;
 
 import java.io.File;
 import java.io.IOException;
@@ -111,17 +112,20 @@
 
         long versionCode = 0, apksSize = 0;
         if (success) {
-            // TODO: Remove temp try-catch to avoid IllegalStateException. The reason is because
-            //  the scan result is null for installExistingPackageAsUser(). Because it's installing
-            //  a package that's already existing, there's no scanning or parsing involved
-            try {
+            if (mInstallRequest.isInstallForUsers()) {
+                // In case of installExistingPackageAsUser, there's no scanned PackageSetting
+                // in the request but the pkg object should be readily available
+                AndroidPackage pkg = mInstallRequest.getPkg();
+                if (pkg != null) {
+                    versionCode = pkg.getLongVersionCode();
+                    apksSize = getApksSize(new File(pkg.getPath()));
+                }
+            } else {
                 final PackageSetting ps = mInstallRequest.getScannedPackageSetting();
                 if (ps != null) {
                     versionCode = ps.getVersionCode();
                     apksSize = getApksSize(ps.getPath());
                 }
-            } catch (IllegalStateException | NullPointerException e) {
-                // no-op
             }
         }
 
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index b44042c..7870b17 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -16,7 +16,7 @@
 
 package com.android.server.pm;
 
-import static android.app.admin.flags.Flags.crossUserSuspensionEnabled;
+import static android.app.admin.flags.Flags.crossUserSuspensionEnabledRo;
 import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
@@ -1241,7 +1241,7 @@
                 for (int j = 0; j < state.getSuspendParams().size(); j++) {
                     proto.write(PackageProto.UserInfoProto.SUSPENDING_PACKAGE,
                             state.getSuspendParams().keyAt(j).packageName);
-                    if (crossUserSuspensionEnabled()) {
+                    if (crossUserSuspensionEnabledRo()) {
                         proto.write(PackageProto.UserInfoProto.SUSPENDING_USER,
                                 state.getSuspendParams().keyAt(j).userId);
                     }
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index f5ed8d4..0f868eb 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -16,7 +16,7 @@
 
 package com.android.server.pm;
 
-import static android.app.admin.flags.Flags.crossUserSuspensionEnabled;
+import static android.app.admin.flags.Flags.crossUserSuspensionEnabledRo;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
@@ -93,6 +93,7 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.os.BackgroundThread;
+import com.android.internal.pm.parsing.pkg.AndroidPackageInternal;
 import com.android.internal.pm.pkg.component.ParsedComponent;
 import com.android.internal.pm.pkg.component.ParsedIntentInfo;
 import com.android.internal.pm.pkg.component.ParsedPermission;
@@ -911,8 +912,10 @@
             sharedUserSetting.mDisabledPackages.remove(p);
         }
         p.getPkgState().setUpdatedSystemApp(false);
+        final AndroidPackageInternal pkg = p.getPkg();
         PackageSetting ret = addPackageLPw(name, p.getRealName(), p.getPath(), p.getAppId(),
-                p.getFlags(), p.getPrivateFlags(), mDomainVerificationManager.generateNewId());
+                p.getFlags(), p.getPrivateFlags(), mDomainVerificationManager.generateNewId(),
+                pkg == null ? false : pkg.isSdkLibrary());
         if (ret != null) {
             ret.setLegacyNativeLibraryPath(p.getLegacyNativeLibraryPath());
             ret.setPrimaryCpuAbi(p.getPrimaryCpuAbiLegacy());
@@ -951,8 +954,8 @@
         }
     }
 
-    PackageSetting addPackageLPw(String name, String realName, File codePath, int uid, int pkgFlags,
-                                 int pkgPrivateFlags, @NonNull UUID domainSetId) {
+    PackageSetting addPackageLPw(String name, String realName, File codePath, int uid,
+            int pkgFlags, int pkgPrivateFlags, @NonNull UUID domainSetId, boolean isSdkLibrary) {
         PackageSetting p = mPackages.get(name);
         if (p != null) {
             if (p.getAppId() == uid) {
@@ -964,7 +967,8 @@
         }
         p = new PackageSetting(name, realName, codePath, pkgFlags, pkgPrivateFlags, domainSetId)
                 .setAppId(uid);
-        if (mAppIds.registerExistingAppId(uid, p, name)) {
+        if ((uid == Process.INVALID_UID && isSdkLibrary && Flags.disallowSdkLibsToBeApps())
+                || mAppIds.registerExistingAppId(uid, p, name)) {
             mPackages.put(name, p);
             return p;
         }
@@ -2054,7 +2058,7 @@
             return null;
         }
         int suspendingUserId;
-        if (crossUserSuspensionEnabled()) {
+        if (crossUserSuspensionEnabledRo()) {
             suspendingUserId = parser.getAttributeInt(
                     null, ATTR_SUSPENDING_USER, UserHandle.USER_NULL);
             if (suspendingUserId == UserHandle.USER_NULL) {
@@ -2433,7 +2437,7 @@
                                 serializer.startTag(null, TAG_SUSPEND_PARAMS);
                                 serializer.attribute(null, ATTR_SUSPENDING_PACKAGE,
                                         suspendingPackage.packageName);
-                                if (crossUserSuspensionEnabled()) {
+                                if (crossUserSuspensionEnabledRo()) {
                                     serializer.attributeInt(null, ATTR_SUSPENDING_USER,
                                             suspendingPackage.userId);
                                 }
@@ -4176,7 +4180,7 @@
             } else if (appId > 0 || (appId == Process.INVALID_UID && isSdkLibrary
                     && Flags.disallowSdkLibsToBeApps())) {
                 packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr),
-                        appId, pkgFlags, pkgPrivateFlags, domainSetId);
+                        appId, pkgFlags, pkgPrivateFlags, domainSetId, isSdkLibrary);
                 if (PackageManagerService.DEBUG_SETTINGS)
                     Log.i(PackageManagerService.TAG, "Reading package " + name + ": appId="
                             + appId + " pkg=" + packageSetting);
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 88e7596..e3261bd 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -567,7 +567,7 @@
                     int autoLockPreference =
                             Settings.Secure.getIntForUser(mContext.getContentResolver(),
                                     Settings.Secure.PRIVATE_SPACE_AUTO_LOCK,
-                                    Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_NEVER,
+                                    Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_AFTER_DEVICE_RESTART,
                                     getMainUserIdUnchecked());
                     Slog.i(LOG_TAG, "Auto-lock settings changed to " + autoLockPreference);
                     setOrUpdateAutoLockPreferenceForPrivateProfile(autoLockPreference);
@@ -615,7 +615,7 @@
         int privateSpaceAutoLockPreference =
                 Settings.Secure.getIntForUser(mContext.getContentResolver(),
                         Settings.Secure.PRIVATE_SPACE_AUTO_LOCK,
-                        Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_NEVER,
+                        Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_AFTER_DEVICE_RESTART,
                         getMainUserIdUnchecked());
         if (privateSpaceAutoLockPreference
                 != Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_AFTER_INACTIVITY) {
@@ -714,7 +714,7 @@
         if (isAutoLockForPrivateSpaceEnabled()) {
             int autoLockPreference = Settings.Secure.getIntForUser(mContext.getContentResolver(),
                     Settings.Secure.PRIVATE_SPACE_AUTO_LOCK,
-                    Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_NEVER,
+                    Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_AFTER_DEVICE_RESTART,
                     getMainUserIdUnchecked());
             boolean isAutoLockOnDeviceLockSelected =
                     autoLockPreference == Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_ON_DEVICE_LOCK;
@@ -1052,7 +1052,8 @@
                 setOrUpdateAutoLockPreferenceForPrivateProfile(
                         Settings.Secure.getIntForUser(mContext.getContentResolver(),
                                 Settings.Secure.PRIVATE_SPACE_AUTO_LOCK,
-                                Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_NEVER, mainUserId));
+                                Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_AFTER_DEVICE_RESTART,
+                                mainUserId));
             }
         }
 
@@ -1717,20 +1718,28 @@
                         return false;
                     }
 
-                    if (android.multiuser.Flags.showSetScreenLockDialog()) {
-                        // Show the prompt to set a new screen lock if the device does not have one
-                        final KeyguardManager km = mContext.getSystemService(KeyguardManager.class);
-                        if (km != null && !km.isDeviceSecure()) {
-                            Intent setScreenLockPromptIntent =
-                                    SetScreenLockDialogActivity
-                                            .createBaseIntent(LAUNCH_REASON_DISABLE_QUIET_MODE);
-                            setScreenLockPromptIntent.putExtra(EXTRA_ORIGIN_USER_ID, userId);
-                            mContext.startActivity(setScreenLockPromptIntent);
-                            return false;
-                        }
+                    final KeyguardManager km = mContext.getSystemService(KeyguardManager.class);
+                    int parentUserId = getProfileParentId(userId);
+                    if (km != null && km.isDeviceSecure(parentUserId)) {
+                        showConfirmCredentialToDisableQuietMode(userId, target, callingPackage);
+                        return false;
+                    } else if (km != null && !km.isDeviceSecure(parentUserId)
+                            && android.multiuser.Flags.showSetScreenLockDialog()
+                            // TODO(b/330720545): Add a better way to accomplish this, also use it
+                            //  to block profile creation w/o device credentials present.
+                            && Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                                Settings.Secure.USER_SETUP_COMPLETE, 0, userId) == 1) {
+                        Intent setScreenLockPromptIntent =
+                                SetScreenLockDialogActivity
+                                        .createBaseIntent(LAUNCH_REASON_DISABLE_QUIET_MODE);
+                        setScreenLockPromptIntent.putExtra(EXTRA_ORIGIN_USER_ID, userId);
+                        mContext.startActivityAsUser(setScreenLockPromptIntent,
+                                UserHandle.of(parentUserId));
+                        return false;
+                    } else {
+                        Slog.w(LOG_TAG, "Allowing profile unlock even when device credentials "
+                                + "are not set for user " + userId);
                     }
-                    showConfirmCredentialToDisableQuietMode(userId, target, callingPackage);
-                    return false;
                 }
             }
             final boolean hasUnifiedChallenge =
@@ -1873,11 +1882,10 @@
                 && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
             // Allow delayed locking since some profile types want to be able to unlock again via
             // biometrics.
-            ActivityManager.getService()
-                    .stopUserWithDelayedLocking(userId, /* force= */ true, null);
+            ActivityManager.getService().stopUserWithDelayedLocking(userId, null);
             return;
         }
-        ActivityManager.getService().stopUser(userId, /* force= */ true, null);
+        ActivityManager.getService().stopUserWithCallback(userId, null);
     }
 
     private void logQuietModeEnabled(@UserIdInt int userId, boolean enableQuietMode,
@@ -6123,7 +6131,7 @@
             if (DBG) Slog.i(LOG_TAG, "Stopping user " + userId);
             int res;
             try {
-                res = ActivityManager.getService().stopUser(userId, /* force= */ true,
+                res = ActivityManager.getService().stopUserWithCallback(userId,
                 new IStopUserCallback.Stub() {
                             @Override
                             public void userStopped(int userIdParam) {
diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
index 73e7485..4e02470 100644
--- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
+++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
@@ -717,10 +717,12 @@
                     break;
                 case UserManager.DISALLOW_RUN_IN_BACKGROUND:
                     if (newValue) {
-                        int currentUser = ActivityManager.getCurrentUser();
-                        if (currentUser != userId && userId != UserHandle.USER_SYSTEM) {
+                        final ActivityManager am = context.getSystemService(ActivityManager.class);
+                        if (!am.isProfileForeground(UserHandle.of(userId))
+                                && userId != UserHandle.USER_SYSTEM) {
                             try {
-                                ActivityManager.getService().stopUser(userId, false, null);
+                                ActivityManager.getService().stopUserExceptCertainProfiles(
+                                        userId, false, null);
                             } catch (RemoteException e) {
                                 throw e.rethrowAsRuntimeException();
                             }
diff --git a/services/core/java/com/android/server/pm/UserTypeFactory.java b/services/core/java/com/android/server/pm/UserTypeFactory.java
index 7f9c1cf..1e7fdfe 100644
--- a/services/core/java/com/android/server/pm/UserTypeFactory.java
+++ b/services/core/java/com/android/server/pm/UserTypeFactory.java
@@ -306,7 +306,7 @@
                         R.color.black)
                 .setDarkThemeBadgeColors(
                         R.color.white)
-                .setDefaultRestrictions(getDefaultProfileRestrictions())
+                .setDefaultRestrictions(getDefaultPrivateProfileRestrictions())
                 .setDefaultCrossProfileIntentFilters(getDefaultPrivateCrossProfileIntentFilter())
                 .setDefaultUserProperties(new UserProperties.Builder()
                         .setStartWithParent(true)
@@ -327,7 +327,8 @@
                                 UserProperties.CROSS_PROFILE_CONTENT_SHARING_DELEGATE_FROM_PARENT)
                         .setProfileApiVisibility(
                                 UserProperties.PROFILE_API_VISIBILITY_HIDDEN)
-                        .setItemsRestrictedOnHomeScreen(true));
+                        .setItemsRestrictedOnHomeScreen(true)
+                        .setUpdateCrossProfileIntentFiltersOnOTA(true));
     }
 
     /**
@@ -429,6 +430,13 @@
         return restrictions;
     }
 
+    @VisibleForTesting
+    static Bundle getDefaultPrivateProfileRestrictions() {
+        final Bundle restrictions = getDefaultProfileRestrictions();
+        restrictions.putBoolean(UserManager.DISALLOW_BLUETOOTH_SHARING, true);
+        return restrictions;
+    }
+
     private static Bundle getDefaultManagedProfileSecureSettings() {
         // Only add String values to the bundle, settings are written as Strings eventually
         final Bundle settings = new Bundle();
diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
index b18503d..1c70af0 100644
--- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
@@ -596,7 +596,7 @@
         ai.requiredDisplayCategory = a.getRequiredDisplayCategory();
         ai.requireContentUriPermissionFromCaller = a.getRequireContentUriPermissionFromCaller();
         ai.setKnownActivityEmbeddingCerts(a.getKnownActivityEmbeddingCerts());
-        assignFieldsComponentInfoParsedMainComponent(ai, a, pkgSetting, state, userId);
+        assignFieldsComponentInfoParsedMainComponent(ai, a, pkgSetting, userId);
         return ai;
     }
 
@@ -659,7 +659,7 @@
             // Backwards compatibility, coerce to null if empty
             si.metaData = metaData.isEmpty() ? null : metaData;
         }
-        assignFieldsComponentInfoParsedMainComponent(si, s, pkgSetting, state, userId);
+        assignFieldsComponentInfoParsedMainComponent(si, s, pkgSetting, userId);
         return si;
     }
 
@@ -710,7 +710,7 @@
             pi.metaData = metaData.isEmpty() ? null : metaData;
         }
         pi.applicationInfo = applicationInfo;
-        assignFieldsComponentInfoParsedMainComponent(pi, p, pkgSetting, state, userId);
+        assignFieldsComponentInfoParsedMainComponent(pi, p, pkgSetting, userId);
         return pi;
     }
 
@@ -903,13 +903,8 @@
 
     private static void assignFieldsComponentInfoParsedMainComponent(
             @NonNull ComponentInfo info, @NonNull ParsedMainComponent component,
-            @NonNull PackageStateInternal pkgSetting, @NonNull PackageUserStateInternal state,
-            @UserIdInt int userId) {
+            @NonNull PackageStateInternal pkgSetting, @UserIdInt int userId) {
         assignFieldsComponentInfoParsedMainComponent(info, component);
-        // overwrite the enabled state with the current user state
-        info.enabled = PackageUserStateUtils.isEnabled(state, info.applicationInfo.enabled,
-                info.enabled, info.name, /* flags */ 0);
-
         Pair<CharSequence, Integer> labelAndIcon =
                 ParsedComponentStateUtils.getNonLocalizedLabelAndIcon(component, pkgSetting,
                         userId);
diff --git a/services/core/java/com/android/server/pm/permission/AccessCheckDelegate.java b/services/core/java/com/android/server/pm/permission/AccessCheckDelegate.java
new file mode 100644
index 0000000..3edd697
--- /dev/null
+++ b/services/core/java/com/android/server/pm/permission/AccessCheckDelegate.java
@@ -0,0 +1,499 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.permission;
+
+import static android.os.Process.INVALID_UID;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.app.AppOpsManager;
+import android.app.AppOpsManager.AttributionFlags;
+import android.app.AppOpsManagerInternal.CheckOpsDelegate;
+import android.app.SyncNotedAppOp;
+import android.content.AttributionSource;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.Process;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.SparseArray;
+
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.function.DodecFunction;
+import com.android.internal.util.function.HexFunction;
+import com.android.internal.util.function.OctFunction;
+import com.android.internal.util.function.QuadFunction;
+import com.android.internal.util.function.TriFunction;
+import com.android.internal.util.function.UndecFunction;
+import com.android.server.LocalServices;
+import com.android.server.pm.permission.PermissionManagerServiceInternal.CheckPermissionDelegate;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Interface to intercept incoming parameters and outgoing results to permission and appop checks
+ */
+public interface AccessCheckDelegate extends CheckPermissionDelegate, CheckOpsDelegate {
+
+    /**
+     * Assigns the package whose permissions are delegated the state of Shell's permissions.
+     *
+     * @param delegateUid the UID whose permissions are delegated to shell
+     * @param packageName the name of the package whose permissions are delegated to shell
+     * @param permissions the set of permissions to delegate to shell. If null then all
+     *                    permission will be delegated
+     */
+    void setShellPermissionDelegate(int delegateUid, @NonNull String packageName,
+            @Nullable String[] permissions);
+
+    /**
+     * Removes the assigned Shell permission delegate.
+     */
+    void removeShellPermissionDelegate();
+
+    /**
+     * @return a list of permissions delegated to Shell's permission state
+     */
+    @NonNull
+    List<String> getDelegatedPermissionNames();
+
+    /**
+     * @return whether there exists a Shell permission delegate
+     */
+    boolean hasShellPermissionDelegate();
+
+    /**
+     * @param uid the UID to check
+     * @return whether the UID's permissions are delegated to Shell's and the owner of overrides
+     */
+    boolean isDelegateAndOwnerUid(int uid);
+
+    /**
+     * @param uid the UID to check
+     * @param packageName the package to check
+     * @return whether the UID and package combination's permissions are delegated to Shell's
+     * permissions
+     */
+    boolean isDelegatePackage(int uid, @NonNull String packageName);
+
+    /**
+     * Adds permission to be overridden to the given state.
+     *
+     * @param ownerUid the UID of the app who assigned the permission override
+     * @param uid The UID of the app whose permission will be overridden
+     * @param permission The permission whose state will be overridden
+     * @param result The state to override the permission to
+     */
+    void addOverridePermissionState(int ownerUid, int uid, @NonNull String permission,
+            int result);
+
+    /**
+     * Removes overridden permission. UiAutomation must be connected to root user.
+     *
+     * @param uid The UID of the app whose permission is overridden
+     * @param permission The permission whose state will no longer be overridden
+     *
+     * @hide
+     */
+    void removeOverridePermissionState(int uid, @NonNull String permission);
+
+    /**
+     * Clears all overridden permissions for the given UID.
+     *
+     * @param uid The UID of the app whose permissions will no longer be overridden
+     */
+    void clearOverridePermissionStates(int uid);
+
+    /**
+     * Clears all overridden permissions on the device.
+     */
+    void clearAllOverridePermissionStates();
+
+    /**
+     * @return whether there exists any permission overrides
+     */
+    boolean hasOverriddenPermissions();
+
+    /**
+     * @return whether there exists permissions delegated to Shell's permissions or overridden
+     */
+    boolean hasDelegateOrOverrides();
+
+    class AccessCheckDelegateImpl implements AccessCheckDelegate {
+        public static final String SHELL_PKG = "com.android.shell";
+        private int mDelegateAndOwnerUid = INVALID_UID;
+        @Nullable
+        private String mDelegatePackage;
+        @Nullable
+        private String[] mDelegatePermissions;
+        boolean mDelegateAllPermissions;
+        @Nullable
+        private SparseArray<ArrayMap<String, Integer>> mOverridePermissionStates;
+
+        @Override
+        public void setShellPermissionDelegate(int uid, @NonNull String packageName,
+                @Nullable String[] permissions) {
+            mDelegateAndOwnerUid = uid;
+            mDelegatePackage = packageName;
+            mDelegatePermissions = permissions;
+            mDelegateAllPermissions = permissions == null;
+            PackageManager.invalidatePackageInfoCache();
+        }
+
+        @Override
+        public void removeShellPermissionDelegate() {
+            mDelegatePackage = null;
+            mDelegatePermissions = null;
+            mDelegateAllPermissions = false;
+            PackageManager.invalidatePackageInfoCache();
+        }
+
+        @Override
+        public void addOverridePermissionState(int ownerUid, int uid, @NonNull String permission,
+                int state) {
+            if (mOverridePermissionStates == null) {
+                mDelegateAndOwnerUid = ownerUid;
+                mOverridePermissionStates = new SparseArray<>();
+            }
+
+            int uidIdx = mOverridePermissionStates.indexOfKey(uid);
+            ArrayMap<String, Integer> perUidOverrides;
+            if (uidIdx < 0) {
+                perUidOverrides = new ArrayMap<>();
+                mOverridePermissionStates.put(uid, perUidOverrides);
+            } else {
+                perUidOverrides = mOverridePermissionStates.valueAt(uidIdx);
+            }
+
+            perUidOverrides.put(permission, state);
+            PackageManager.invalidatePackageInfoCache();
+        }
+
+        @Override
+        public void removeOverridePermissionState(int uid, @NonNull String permission) {
+            if (mOverridePermissionStates == null) {
+                return;
+            }
+
+            ArrayMap<String, Integer> perUidOverrides = mOverridePermissionStates.get(uid);
+
+            if (perUidOverrides == null) {
+                return;
+            }
+
+            perUidOverrides.remove(permission);
+            PackageManager.invalidatePackageInfoCache();
+
+            if (perUidOverrides.isEmpty()) {
+                mOverridePermissionStates.remove(uid);
+            }
+            if (mOverridePermissionStates.size() == 0) {
+                mOverridePermissionStates = null;
+            }
+        }
+
+        @Override
+        public void clearOverridePermissionStates(int uid) {
+            if (mOverridePermissionStates == null) {
+                return;
+            }
+
+            mOverridePermissionStates.remove(uid);
+            PackageManager.invalidatePackageInfoCache();
+
+            if (mOverridePermissionStates.size() == 0) {
+                mOverridePermissionStates = null;
+            }
+        }
+
+        @Override
+        public void clearAllOverridePermissionStates() {
+            mOverridePermissionStates = null;
+            PackageManager.invalidatePackageInfoCache();
+        }
+
+        @Override
+        public List<String> getDelegatedPermissionNames() {
+            return mDelegatePermissions == null ? null : List.of(mDelegatePermissions);
+        }
+
+        @Override
+        public boolean hasShellPermissionDelegate() {
+            return mDelegateAllPermissions || mDelegatePermissions != null;
+        }
+
+        @Override
+        public boolean isDelegatePackage(int uid, @NonNull String packageName) {
+            return mDelegateAndOwnerUid == uid && TextUtils.equals(mDelegatePackage, packageName);
+        }
+
+        @Override
+        public boolean hasOverriddenPermissions() {
+            return mOverridePermissionStates != null;
+        }
+
+        @Override
+        public boolean isDelegateAndOwnerUid(int uid) {
+            return uid == mDelegateAndOwnerUid;
+        }
+
+        @Override
+        public boolean hasDelegateOrOverrides() {
+            return hasShellPermissionDelegate() || hasOverriddenPermissions();
+        }
+
+        @Override
+        public int checkPermission(@NonNull String packageName, @NonNull String permissionName,
+                @NonNull String persistentDeviceId, @UserIdInt int userId,
+                @NonNull QuadFunction<String, String, String, Integer, Integer> superImpl) {
+            if (TextUtils.equals(mDelegatePackage, packageName) && !SHELL_PKG.equals(packageName)) {
+                if (isDelegatePermission(permissionName)) {
+                    final long identity = Binder.clearCallingIdentity();
+                    try {
+                        return checkPermission(SHELL_PKG, permissionName,
+                                persistentDeviceId, userId, superImpl);
+                    } finally {
+                        Binder.restoreCallingIdentity(identity);
+                    }
+                }
+            }
+            if (mOverridePermissionStates != null) {
+                int uid = LocalServices.getService(PackageManagerInternal.class)
+                                .getPackageUid(packageName, 0, userId);
+                if (uid >= 0) {
+                    Map<String, Integer> permissionGrants = mOverridePermissionStates.get(uid);
+                    if (permissionGrants != null && permissionGrants.containsKey(permissionName)) {
+                        return permissionGrants.get(permissionName);
+                    }
+                }
+            }
+            return superImpl.apply(packageName, permissionName, persistentDeviceId, userId);
+        }
+
+        @Override
+        public int checkUidPermission(int uid, @NonNull String permissionName,
+                @NonNull String persistentDeviceId,
+                @NonNull TriFunction<Integer, String, String, Integer> superImpl) {
+            if (uid == mDelegateAndOwnerUid && uid != Process.SHELL_UID) {
+                if (isDelegatePermission(permissionName)) {
+                    final long identity = Binder.clearCallingIdentity();
+                    try {
+                        return checkUidPermission(Process.SHELL_UID, permissionName,
+                                persistentDeviceId, superImpl);
+                    } finally {
+                        Binder.restoreCallingIdentity(identity);
+                    }
+                }
+            }
+            if (mOverridePermissionStates != null) {
+                Map<String, Integer> permissionGrants = mOverridePermissionStates.get(uid);
+                if (permissionGrants != null && permissionGrants.containsKey(permissionName)) {
+                    return permissionGrants.get(permissionName);
+                }
+            }
+            return superImpl.apply(uid, permissionName, persistentDeviceId);
+        }
+
+        @Override
+        public int checkOperation(int code, int uid, @Nullable String packageName,
+                @Nullable String attributionTag, int virtualDeviceId, boolean raw,
+                @NonNull HexFunction<Integer, Integer, String, String, Integer, Boolean, Integer>
+                        superImpl) {
+            if (uid == mDelegateAndOwnerUid && isDelegateOp(code)) {
+                final int shellUid = UserHandle.getUid(UserHandle.getUserId(uid),
+                        Process.SHELL_UID);
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    return superImpl.apply(code, shellUid, "com.android.shell", null,
+                            virtualDeviceId, raw);
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+            return superImpl.apply(code, uid, packageName, attributionTag, virtualDeviceId, raw);
+        }
+
+        @Override
+        public int checkAudioOperation(int code, int usage, int uid, @Nullable String packageName,
+                @NonNull QuadFunction<Integer, Integer, Integer, String, Integer> superImpl) {
+            if (uid == mDelegateAndOwnerUid && isDelegateOp(code)) {
+                final int shellUid = UserHandle.getUid(UserHandle.getUserId(uid),
+                        Process.SHELL_UID);
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    return superImpl.apply(code, usage, shellUid, "com.android.shell");
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+            return superImpl.apply(code, usage, uid, packageName);
+        }
+
+        @Override
+        public SyncNotedAppOp noteOperation(int code, int uid, @Nullable String packageName,
+                @Nullable String featureId, int virtualDeviceId, boolean shouldCollectAsyncNotedOp,
+                @Nullable String message, boolean shouldCollectMessage,
+                @NonNull OctFunction<Integer, Integer, String, String, Integer, Boolean, String,
+                        Boolean, SyncNotedAppOp> superImpl) {
+            if (uid == mDelegateAndOwnerUid && isDelegateOp(code)) {
+                final int shellUid = UserHandle.getUid(UserHandle.getUserId(uid),
+                        Process.SHELL_UID);
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    return superImpl.apply(code, shellUid, "com.android.shell", featureId,
+                            virtualDeviceId, shouldCollectAsyncNotedOp, message,
+                            shouldCollectMessage);
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+            return superImpl.apply(code, uid, packageName, featureId, virtualDeviceId,
+                    shouldCollectAsyncNotedOp, message, shouldCollectMessage);
+        }
+
+        @Override
+        public SyncNotedAppOp noteProxyOperation(int code,
+                @NonNull AttributionSource attributionSource, boolean shouldCollectAsyncNotedOp,
+                @Nullable String message, boolean shouldCollectMessage, boolean skiProxyOperation,
+                @NonNull HexFunction<Integer, AttributionSource, Boolean, String, Boolean,
+                        Boolean, SyncNotedAppOp> superImpl) {
+            if (attributionSource.getUid() == mDelegateAndOwnerUid && isDelegateOp(code)) {
+                final int shellUid = UserHandle.getUid(
+                        UserHandle.getUserId(attributionSource.getUid()), Process.SHELL_UID);
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    return superImpl.apply(code,
+                            new AttributionSource(shellUid, Process.INVALID_PID,
+                                    "com.android.shell", attributionSource.getAttributionTag(),
+                                    attributionSource.getToken(), /*renouncedPermissions*/ null,
+                                    attributionSource.getDeviceId(), attributionSource.getNext()),
+                            shouldCollectAsyncNotedOp, message, shouldCollectMessage,
+                            skiProxyOperation);
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+            return superImpl.apply(code, attributionSource, shouldCollectAsyncNotedOp,
+                    message, shouldCollectMessage, skiProxyOperation);
+        }
+
+        @Override
+        public SyncNotedAppOp startOperation(@NonNull IBinder token, int code, int uid,
+                @Nullable String packageName, @Nullable String attributionTag, int virtualDeviceId,
+                boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp,
+                @Nullable String message, boolean shouldCollectMessage,
+                @AttributionFlags int attributionFlags, int attributionChainId,
+                @NonNull DodecFunction<IBinder, Integer, Integer, String, String, Integer, Boolean,
+                        Boolean, String, Boolean, Integer, Integer, SyncNotedAppOp> superImpl) {
+            if (uid == mDelegateAndOwnerUid && isDelegateOp(code)) {
+                final int shellUid = UserHandle.getUid(UserHandle.getUserId(uid),
+                        Process.SHELL_UID);
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    return superImpl.apply(token, code, shellUid, "com.android.shell",
+                            attributionTag, virtualDeviceId, startIfModeDefault,
+                            shouldCollectAsyncNotedOp, message, shouldCollectMessage,
+                            attributionFlags, attributionChainId);
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+            return superImpl.apply(token, code, uid, packageName, attributionTag, virtualDeviceId,
+                    startIfModeDefault, shouldCollectAsyncNotedOp, message, shouldCollectMessage,
+                    attributionFlags, attributionChainId);
+        }
+
+        @Override
+        public SyncNotedAppOp startProxyOperation(@NonNull IBinder clientId, int code,
+                @NonNull AttributionSource attributionSource, boolean startIfModeDefault,
+                boolean shouldCollectAsyncNotedOp, @Nullable String message,
+                boolean shouldCollectMessage, boolean skipProxyOperation,
+                @AttributionFlags int proxyAttributionFlags,
+                @AttributionFlags int proxiedAttributionFlags, int attributionChainId,
+                @NonNull UndecFunction<IBinder, Integer, AttributionSource, Boolean,
+                        Boolean, String, Boolean, Boolean, Integer, Integer, Integer,
+                        SyncNotedAppOp> superImpl) {
+            if (attributionSource.getUid() == mDelegateAndOwnerUid && isDelegateOp(code)) {
+                final int shellUid = UserHandle.getUid(UserHandle.getUserId(
+                        attributionSource.getUid()), Process.SHELL_UID);
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    return superImpl.apply(clientId, code,
+                            new AttributionSource(shellUid, Process.INVALID_PID,
+                                    "com.android.shell", attributionSource.getAttributionTag(),
+                                    attributionSource.getToken(), /*renouncedPermissions*/ null,
+                                    attributionSource.getDeviceId(), attributionSource.getNext()),
+                            startIfModeDefault, shouldCollectAsyncNotedOp, message,
+                            shouldCollectMessage, skipProxyOperation, proxyAttributionFlags,
+                            proxiedAttributionFlags, attributionChainId);
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+            return superImpl.apply(clientId, code, attributionSource, startIfModeDefault,
+                    shouldCollectAsyncNotedOp, message, shouldCollectMessage, skipProxyOperation,
+                    proxyAttributionFlags, proxiedAttributionFlags, attributionChainId);
+        }
+
+        @Override
+        public void finishProxyOperation(@NonNull IBinder clientId, int code,
+                @NonNull AttributionSource attributionSource, boolean skipProxyOperation,
+                @NonNull QuadFunction<IBinder, Integer, AttributionSource, Boolean,
+                        Void> superImpl) {
+            if (attributionSource.getUid() == mDelegateAndOwnerUid && isDelegateOp(code)) {
+                final int shellUid = UserHandle.getUid(UserHandle.getUserId(
+                        attributionSource.getUid()), Process.SHELL_UID);
+                final long identity = Binder.clearCallingIdentity();
+                try {
+                    superImpl.apply(clientId, code,
+                            new AttributionSource(shellUid, Process.INVALID_PID,
+                                    "com.android.shell", attributionSource.getAttributionTag(),
+                                    attributionSource.getToken(), /*renouncedPermissions*/ null,
+                                    attributionSource.getDeviceId(), attributionSource.getNext()),
+                            skipProxyOperation);
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+            }
+            superImpl.apply(clientId, code, attributionSource, skipProxyOperation);
+        }
+
+        private boolean isDelegatePermission(@NonNull String permission) {
+            // null permissions means all permissions are delegated
+            return mDelegateAndOwnerUid != INVALID_UID
+                    && (mDelegateAllPermissions
+                    || ArrayUtils.contains(mDelegatePermissions, permission));
+        }
+
+        private boolean isDelegateOp(int code) {
+            if (mDelegateAllPermissions) {
+                return true;
+            }
+            // no permission for the op means the op is targeted
+            final String permission = AppOpsManager.opToPermission(code);
+            if (permission == null) {
+                return true;
+            }
+            return isDelegatePermission(permission);
+        }
+    }
+}
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 21e2bf2..bd0501d9 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -76,11 +76,10 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.Preconditions;
-import com.android.internal.util.function.QuadFunction;
-import com.android.internal.util.function.TriFunction;
 import com.android.server.LocalServices;
 import com.android.server.companion.virtual.VirtualDeviceManagerInternal;
 import com.android.server.pm.UserManagerService;
+import com.android.server.pm.permission.PermissionManagerServiceInternal.CheckPermissionDelegate;
 import com.android.server.pm.permission.PermissionManagerServiceInternal.HotwordDetectionServiceProvider;
 import com.android.server.pm.pkg.AndroidPackage;
 import com.android.server.pm.pkg.PackageState;
@@ -88,7 +87,6 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
@@ -323,6 +321,12 @@
         return true;
     }
 
+    private void setCheckPermissionDelegateInternal(CheckPermissionDelegate delegate) {
+        synchronized (mLock) {
+            mCheckPermissionDelegate = delegate;
+        }
+    }
+
     private boolean checkAutoRevokeAccess(AndroidPackage pkg, int callingUid) {
         final boolean isCallerPrivileged = mContext.checkCallingOrSelfPermission(
                 Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS)
@@ -369,42 +373,6 @@
         }
     }
 
-    private void startShellPermissionIdentityDelegationInternal(int uid,
-            @NonNull String packageName, @Nullable List<String> permissionNames) {
-        synchronized (mLock) {
-            final CheckPermissionDelegate oldDelegate = mCheckPermissionDelegate;
-            if (oldDelegate != null && oldDelegate.getDelegatedUid() != uid) {
-                throw new SecurityException(
-                        "Shell can delegate permissions only to one UID at a time");
-            }
-            final ShellDelegate delegate = new ShellDelegate(uid, packageName, permissionNames);
-            setCheckPermissionDelegateLocked(delegate);
-        }
-    }
-
-    private void stopShellPermissionIdentityDelegationInternal() {
-        synchronized (mLock) {
-            setCheckPermissionDelegateLocked(null);
-        }
-    }
-
-    @Nullable
-    private List<String> getDelegatedShellPermissionsInternal() {
-        synchronized (mLock) {
-            if (mCheckPermissionDelegate == null) {
-                return Collections.EMPTY_LIST;
-            }
-            return mCheckPermissionDelegate.getDelegatedPermissionNames();
-        }
-    }
-
-    private void setCheckPermissionDelegateLocked(@Nullable CheckPermissionDelegate delegate) {
-        if (delegate != null || mCheckPermissionDelegate != null) {
-            PackageManager.invalidatePackageInfoCache();
-        }
-        mCheckPermissionDelegate = delegate;
-    }
-
     @NonNull
     private OneTimePermissionUserManager getOneTimePermissionUserManager(@UserIdInt int userId) {
         OneTimePermissionUserManager oneTimePermissionUserManager;
@@ -663,24 +631,6 @@
         }
 
         @Override
-        public void startShellPermissionIdentityDelegation(int uid, @NonNull String packageName,
-                @Nullable List<String> permissionNames) {
-            Objects.requireNonNull(packageName, "packageName");
-            startShellPermissionIdentityDelegationInternal(uid, packageName, permissionNames);
-        }
-
-        @Override
-        public void stopShellPermissionIdentityDelegation() {
-            stopShellPermissionIdentityDelegationInternal();
-        }
-
-        @Override
-        @NonNull
-        public List<String> getDelegatedShellPermissions() {
-            return getDelegatedShellPermissionsInternal();
-        }
-
-        @Override
         public void setHotwordDetectionServiceProvider(HotwordDetectionServiceProvider provider) {
             mHotwordDetectionServiceProvider = provider;
         }
@@ -891,6 +841,11 @@
                     .getAllPermissionsWithProtectionFlags(protectionFlags);
         }
 
+        @Override
+        public void setCheckPermissionDelegate(CheckPermissionDelegate delegate) {
+            setCheckPermissionDelegateInternal(delegate);
+        }
+
         /* End of delegate methods to PermissionManagerServiceInterface */
     }
 
@@ -902,120 +857,6 @@
     private int[] getAllUserIds() {
         return UserManagerService.getInstance().getUserIdsIncludingPreCreated();
     }
-
-    /**
-     * Interface to intercept permission checks and optionally pass through to the original
-     * implementation.
-     */
-    private interface CheckPermissionDelegate {
-        /**
-         * Get the UID whose permission checks is being delegated.
-         *
-         * @return the UID
-         */
-        int getDelegatedUid();
-
-        /**
-         * Check whether the given package has been granted the specified permission.
-         *
-         * @param packageName the name of the package to be checked
-         * @param permissionName the name of the permission to be checked
-         * @param persistentDeviceId The persistent device ID
-         * @param userId the user ID
-         * @param superImpl the original implementation that can be delegated to
-         * @return {@link android.content.pm.PackageManager#PERMISSION_GRANTED} if the package has
-         * the permission, or {@link android.content.pm.PackageManager#PERMISSION_DENIED} otherwise
-         *
-         * @see android.content.pm.PackageManager#checkPermission(String, String)
-         */
-        int checkPermission(@NonNull String packageName, @NonNull String permissionName,
-                String persistentDeviceId, @UserIdInt int userId,
-                @NonNull QuadFunction<String, String, String, Integer, Integer> superImpl);
-
-        /**
-         * Check whether the given UID has been granted the specified permission.
-         *
-         * @param uid the UID to be checked
-         * @param permissionName the name of the permission to be checked
-         * @param persistentDeviceId The persistent device ID
-         * @param superImpl the original implementation that can be delegated to
-         * @return {@link android.content.pm.PackageManager#PERMISSION_GRANTED} if the package has
-         * the permission, or {@link android.content.pm.PackageManager#PERMISSION_DENIED} otherwise
-         */
-        int checkUidPermission(int uid, @NonNull String permissionName, String persistentDeviceId,
-                TriFunction<Integer, String, String, Integer> superImpl);
-
-        /**
-         * @return list of delegated permissions
-         */
-        List<String> getDelegatedPermissionNames();
-    }
-
-    private class ShellDelegate implements CheckPermissionDelegate {
-        private final int mDelegatedUid;
-        @NonNull
-        private final String mDelegatedPackageName;
-        @Nullable
-        private final List<String> mDelegatedPermissionNames;
-
-        public ShellDelegate(int delegatedUid, @NonNull String delegatedPackageName,
-                @Nullable List<String> delegatedPermissionNames) {
-            mDelegatedUid = delegatedUid;
-            mDelegatedPackageName = delegatedPackageName;
-            mDelegatedPermissionNames = delegatedPermissionNames;
-        }
-
-        @Override
-        public int getDelegatedUid() {
-            return mDelegatedUid;
-        }
-
-        @Override
-        public int checkPermission(@NonNull String packageName, @NonNull String permissionName,
-                String persistentDeviceId, int userId,
-                @NonNull QuadFunction<String, String, String, Integer, Integer> superImpl) {
-            if (mDelegatedPackageName.equals(packageName)
-                    && isDelegatedPermission(permissionName)) {
-                final long identity = Binder.clearCallingIdentity();
-                try {
-                    return superImpl.apply("com.android.shell", permissionName, persistentDeviceId,
-                            userId);
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-            return superImpl.apply(packageName, permissionName, persistentDeviceId, userId);
-        }
-
-        @Override
-        public int checkUidPermission(int uid, @NonNull String permissionName,
-                String persistentDeviceId,
-                @NonNull TriFunction<Integer, String, String, Integer> superImpl) {
-            if (uid == mDelegatedUid && isDelegatedPermission(permissionName)) {
-                final long identity = Binder.clearCallingIdentity();
-                try {
-                    return superImpl.apply(Process.SHELL_UID, permissionName, persistentDeviceId);
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-            return superImpl.apply(uid, permissionName, persistentDeviceId);
-        }
-
-        @Override
-        public List<String> getDelegatedPermissionNames() {
-            return mDelegatedPermissionNames == null
-                    ? null
-                    : new ArrayList<>(mDelegatedPermissionNames);
-        }
-
-        private boolean isDelegatedPermission(@NonNull String permissionName) {
-            // null permissions means all permissions are targeted
-            return mDelegatedPermissionNames == null
-                    || mDelegatedPermissionNames.contains(permissionName);
-        }
-    }
-
     private static final class AttributionSourceRegistry {
         private final Object mLock = new Object();
 
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
index 70913c3..cd1d799 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
@@ -675,6 +675,7 @@
                 // TODO: switch this back to SecurityException
                 Slog.wtf(TAG, "Not allowed to modify non-dynamic permission "
                         + permName);
+                return;
             }
             mRegistry.removePermission(permName);
         }
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
index 132cdce..a5c1284 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
@@ -25,6 +25,8 @@
 import android.permission.PermissionManagerInternal;
 import android.util.ArrayMap;
 
+import com.android.internal.util.function.QuadFunction;
+import com.android.internal.util.function.TriFunction;
 import com.android.server.pm.pkg.AndroidPackage;
 import com.android.server.pm.pkg.PackageState;
 
@@ -173,29 +175,47 @@
             @PermissionInfo.ProtectionFlags int protectionFlags);
 
     /**
-     * Start delegate the permission identity of the shell UID to the given UID.
-     *
-     * @param uid the UID to delegate shell permission identity to
-     * @param packageName the name of the package to delegate shell permission identity to
-     * @param permissionNames the names of the permissions to delegate shell permission identity
-     *                       for, or {@code null} for all permissions
+     * Sets the current check permission delegate
      */
-    //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
-    void startShellPermissionIdentityDelegation(int uid,
-            @NonNull String packageName, @Nullable List<String> permissionNames);
+    void setCheckPermissionDelegate(CheckPermissionDelegate delegate);
 
-    /**
-     * Stop delegating the permission identity of the shell UID.
-     *
-     * @see #startShellPermissionIdentityDelegation(int, String, List)
+     /**
+     * Interface to intercept permission checks and optionally pass through to the original
+     * implementation.
      */
-    //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
-    void stopShellPermissionIdentityDelegation();
+    interface CheckPermissionDelegate {
 
-    /**
-     * Get all delegated shell permissions.
-     */
-    @NonNull List<String> getDelegatedShellPermissions();
+        /**
+         * Check whether the given package has been granted the specified permission.
+         *
+         * @param packageName the name of the package to be checked
+         * @param permissionName the name of the permission to be checked
+         * @param persistentDeviceId The persistent device ID
+         * @param userId the user ID
+         * @param superImpl the original implementation that can be delegated to
+         * @return {@link android.content.pm.PackageManager#PERMISSION_GRANTED} if the package has
+         * the permission, or {@link android.content.pm.PackageManager#PERMISSION_DENIED} otherwise
+         *
+         * @see android.content.pm.PackageManager#checkPermission(String, String)
+         */
+        int checkPermission(@NonNull String packageName, @NonNull String permissionName,
+                @NonNull String persistentDeviceId, @UserIdInt int userId,
+                @NonNull QuadFunction<String, String, String, Integer, Integer> superImpl);
+
+        /**
+         * Check whether the given UID has been granted the specified permission.
+         *
+         * @param uid the UID to be checked
+         * @param permissionName the name of the permission to be checked
+         * @param persistentDeviceId The persistent device ID
+         * @param superImpl the original implementation that can be delegated to
+         * @return {@link android.content.pm.PackageManager#PERMISSION_GRANTED} if the package has
+         * the permission, or {@link android.content.pm.PackageManager#PERMISSION_DENIED} otherwise
+         */
+        int checkUidPermission(int uid, @NonNull String permissionName,
+                @NonNull String persistentDeviceId,
+                @NonNull TriFunction<Integer, String, String, Integer> superImpl);
+    }
 
     /**
      * Read legacy permissions from legacy permission settings.
diff --git a/services/core/java/com/android/server/policy/Android.bp b/services/core/java/com/android/server/policy/Android.bp
index fa55bf0..325b6cb 100644
--- a/services/core/java/com/android/server/policy/Android.bp
+++ b/services/core/java/com/android/server/policy/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "policy_flags",
     package: "com.android.server.policy",
+    container: "system",
     srcs: ["*.aconfig"],
 }
 
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 76bf8fd..b4919a4 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -174,7 +174,6 @@
 import android.service.vr.IPersistentVrStateCallbacks;
 import android.speech.RecognizerIntent;
 import android.telecom.TelecomManager;
-import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.util.MathUtils;
 import android.util.MutableBoolean;
@@ -4121,14 +4120,10 @@
 
     private void handleSwitchKeyboardLayout(@NonNull KeyEvent event, int direction,
             IBinder focusedToken) {
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI)) {
-            IBinder targetWindowToken =
-                    mWindowManagerInternal.getTargetWindowTokenFromInputToken(focusedToken);
-            InputMethodManagerInternal.get().onSwitchKeyboardLayoutShortcut(direction,
-                    event.getDisplayId(), targetWindowToken);
-        } else {
-            mWindowManagerFuncs.switchKeyboardLayout(event.getDeviceId(), direction);
-        }
+        IBinder targetWindowToken =
+                mWindowManagerInternal.getTargetWindowTokenFromInputToken(focusedToken);
+        InputMethodManagerInternal.get().onSwitchKeyboardLayoutShortcut(direction,
+                event.getDisplayId(), targetWindowToken);
     }
 
     private boolean interceptFallback(IBinder focusedToken, KeyEvent fallbackEvent,
@@ -5664,6 +5659,13 @@
         }
     }
 
+    @Override
+    public void onDisplaySwitchStart(int displayId) {
+        if (displayId == DEFAULT_DISPLAY) {
+            mDefaultDisplayPolicy.onDisplaySwitchStart();
+        }
+    }
+
     private long getKeyguardDrawnTimeout() {
         final boolean bootCompleted =
                 LocalServices.getService(SystemServiceManager.class).isBootCompleted();
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index 5956594..9ca4e27 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -251,12 +251,6 @@
          */
         public int getCameraLensCoverState();
 
-        /**
-         * Switch the keyboard layout for the given device.
-         * Direction should be +1 or -1 to go to the next or previous keyboard layout.
-         */
-        public void switchKeyboardLayout(int deviceId, int direction);
-
         public void shutdown(boolean confirm);
         public void reboot(boolean confirm);
         public void rebootSafeMode(boolean confirm);
@@ -895,6 +889,9 @@
         void onScreenOff();
     }
 
+    /** Called when the physical display starts to switch, e.g. fold/unfold. */
+    void onDisplaySwitchStart(int displayId);
+
     /**
      * Return whether the default display is on and not blocked by a black surface.
      */
diff --git a/services/core/java/com/android/server/policy/window_policy_flags.aconfig b/services/core/java/com/android/server/policy/window_policy_flags.aconfig
index 2154a26..7914b94 100644
--- a/services/core/java/com/android/server/policy/window_policy_flags.aconfig
+++ b/services/core/java/com/android/server/policy/window_policy_flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.policy"
+container: "system"
 
 flag {
     name: "support_input_wakeup_delegate"
diff --git a/services/core/java/com/android/server/power/Android.bp b/services/core/java/com/android/server/power/Android.bp
index 863ff76..5d4065d 100644
--- a/services/core/java/com/android/server/power/Android.bp
+++ b/services/core/java/com/android/server/power/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "backstage_power_flags",
     package: "com.android.server.power.optimization",
+    container: "system",
     srcs: [
         "stats/*.aconfig",
     ],
diff --git a/services/core/java/com/android/server/power/PowerGroup.java b/services/core/java/com/android/server/power/PowerGroup.java
index 6a0fe90..77bdc45 100644
--- a/services/core/java/com/android/server/power/PowerGroup.java
+++ b/services/core/java/com/android/server/power/PowerGroup.java
@@ -431,8 +431,10 @@
     }
 
     boolean updateLocked(float screenBrightnessOverride, boolean useProximitySensor,
-            boolean boostScreenBrightness, int dozeScreenState, float dozeScreenBrightness,
-            boolean overrideDrawWakeLock, PowerSaveState powerSaverState, boolean quiescent,
+            boolean boostScreenBrightness, int dozeScreenState,
+            @Display.StateReason int dozeScreenStateReason,
+            float dozeScreenBrightness, boolean overrideDrawWakeLock,
+            PowerSaveState powerSaverState, boolean quiescent,
             boolean dozeAfterScreenOff, boolean bootCompleted,
             boolean screenBrightnessBoostInProgress, boolean waitForNegativeProximity,
             boolean brightWhenDozing) {
@@ -444,18 +446,25 @@
 
         if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) {
             mDisplayPowerRequest.dozeScreenState = dozeScreenState;
+            mDisplayPowerRequest.dozeScreenStateReason = dozeScreenStateReason;
             if ((getWakeLockSummaryLocked() & WAKE_LOCK_DRAW) != 0 && !overrideDrawWakeLock) {
                 if (mDisplayPowerRequest.dozeScreenState == Display.STATE_DOZE_SUSPEND) {
                     mDisplayPowerRequest.dozeScreenState = Display.STATE_DOZE;
+                    mDisplayPowerRequest.dozeScreenStateReason =
+                            Display.STATE_REASON_DRAW_WAKE_LOCK;
                 }
                 if (mDisplayPowerRequest.dozeScreenState == Display.STATE_ON_SUSPEND) {
                     mDisplayPowerRequest.dozeScreenState = Display.STATE_ON;
+                    mDisplayPowerRequest.dozeScreenStateReason =
+                            Display.STATE_REASON_DRAW_WAKE_LOCK;
                 }
             }
             mDisplayPowerRequest.dozeScreenBrightness = dozeScreenBrightness;
         } else {
             mDisplayPowerRequest.dozeScreenState = Display.STATE_UNKNOWN;
             mDisplayPowerRequest.dozeScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
+            mDisplayPowerRequest.dozeScreenStateReason =
+                    Display.STATE_REASON_DEFAULT_POLICY;
         }
         mDisplayPowerRequest.lowPowerMode = powerSaverState.batterySaverEnabled;
         mDisplayPowerRequest.screenLowPowerBrightnessFactor = powerSaverState.brightnessFactor;
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index ea9ab30..b5d49b3 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -179,6 +179,9 @@
     // Message: Sent when an attentive timeout occurs to update the power state.
     private static final int MSG_ATTENTIVE_TIMEOUT = 5;
 
+    // Message: Sent when the policy want to release all timeout override wake locks.
+    private static final int MSG_RELEASE_ALL_OVERRIDE_WAKE_LOCKS = 6;
+
     // Dirty bit: mWakeLocks changed
     private static final int DIRTY_WAKE_LOCKS = 1 << 0;
     // Dirty bit: mWakefulness changed
@@ -219,6 +222,7 @@
     static final int WAKE_LOCK_STAY_AWAKE = 1 << 5; // only set if already awake
     static final int WAKE_LOCK_DOZE = 1 << 6;
     static final int WAKE_LOCK_DRAW = 1 << 7;
+    static final int WAKE_LOCK_SCREEN_TIMEOUT_OVERRIDE = 1 << 8;
 
     // Summarizes the user activity state.
     static final int USER_ACTIVITY_SCREEN_BRIGHT = 1 << 0;
@@ -616,7 +620,8 @@
     public final float mScreenBrightnessDim;
 
     // Value we store for tracking face down behavior.
-    private boolean mIsFaceDown = false;
+    @VisibleForTesting
+    boolean mIsFaceDown = false;
     private long mLastFlipTime = 0L;
 
     // The screen brightness setting override from the window manager
@@ -640,6 +645,8 @@
     // The screen state to use while dozing.
     private int mDozeScreenStateOverrideFromDreamManager = Display.STATE_UNKNOWN;
 
+    private int mDozeScreenStateOverrideReasonFromDreamManager = Display.STATE_REASON_UNKNOWN;
+
     // The screen brightness to use while dozing.
     private int mDozeScreenBrightnessOverrideFromDreamManager = PowerManager.BRIGHTNESS_DEFAULT;
 
@@ -705,6 +712,9 @@
     // Whether to keep dreaming when the device is unplugging.
     private boolean mKeepDreamingWhenUnplugging;
 
+    @GuardedBy("mLock")
+    private ScreenTimeoutOverridePolicy mScreenTimeoutOverridePolicy;
+
     private final class DreamManagerStateListener implements
             DreamManagerInternal.DreamManagerStateListener {
         @Override
@@ -732,6 +742,12 @@
                 userActivityNoUpdateLocked(mPowerGroups.get(groupId), eventTime,
                         PowerManager.USER_ACTIVITY_EVENT_OTHER, flags, uid);
             }
+
+            // Release wake lock when default display is not interactive.
+            if (mScreenTimeoutOverridePolicy != null && groupId == Display.DEFAULT_DISPLAY_GROUP) {
+                mScreenTimeoutOverridePolicy.onWakefulnessChange(mWakeLockSummary, wakefulness);
+            }
+
             mDirty |= DIRTY_DISPLAY_GROUP_WAKEFULNESS;
             mNotifier.onGroupWakefulnessChangeStarted(groupId, wakefulness, reason, eventTime);
             updateGlobalWakefulnessLocked(eventTime, reason, uid, opUid, opPackageName, details);
@@ -1399,6 +1415,13 @@
             // Go.
             readConfigurationLocked();
             updateSettingsLocked();
+            if (mFeatureFlags.isEarlyScreenTimeoutDetectorEnabled()) {
+                mScreenTimeoutOverridePolicy = new ScreenTimeoutOverridePolicy(mContext,
+                        mMinimumScreenOffTimeoutConfig, () -> {
+                    Message msg = mHandler.obtainMessage(MSG_RELEASE_ALL_OVERRIDE_WAKE_LOCKS);
+                    mHandler.sendMessageAtTime(msg, mClock.uptimeMillis());
+                });
+            }
             mDirty |= DIRTY_BATTERY_STATE;
             updatePowerStateLocked();
         }
@@ -1803,7 +1826,7 @@
     }
 
     @GuardedBy("mLock")
-    private void removeWakeLockLocked(WakeLock wakeLock, int index) {
+    private void removeWakeLockNoUpdateLocked(WakeLock wakeLock, int index) {
         mWakeLocks.remove(index);
         UidState state = wakeLock.mUidState;
         state.mNumWakeLocks--;
@@ -1811,10 +1834,15 @@
                 state.mProcState == ActivityManager.PROCESS_STATE_NONEXISTENT) {
             mUidState.remove(state.mUid);
         }
-        notifyWakeLockReleasedLocked(wakeLock);
 
+        notifyWakeLockReleasedLocked(wakeLock);
         applyWakeLockFlagsOnReleaseLocked(wakeLock);
         mDirty |= DIRTY_WAKE_LOCKS;
+    }
+
+    @GuardedBy("mLock")
+    private void removeWakeLockLocked(WakeLock wakeLock, int index) {
+        removeWakeLockNoUpdateLocked(wakeLock, index);
         updatePowerStateLocked();
     }
 
@@ -1997,7 +2025,9 @@
 
                 case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
                     return mSystemReady && mDisplayManagerInternal.isProximitySensorAvailable();
-
+                case PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK:
+                    return mSystemReady && mFeatureFlags.isEarlyScreenTimeoutDetectorEnabled()
+                            && mScreenTimeoutOverridePolicy != null;
                 default:
                     return false;
             }
@@ -2094,6 +2124,10 @@
             mNotifier.onUserActivity(powerGroup.getGroupId(), event, uid);
             mAttentionDetector.onUserActivity(eventTime, event);
 
+            if (mScreenTimeoutOverridePolicy != null) {
+                mScreenTimeoutOverridePolicy.onUserActivity(mWakeLockSummary, event);
+            }
+
             if (mUserInactiveOverrideFromWindowManager) {
                 mUserInactiveOverrideFromWindowManager = false;
                 mOverriddenTimeout = -1;
@@ -2749,6 +2783,11 @@
                 }
             }
 
+            // Screen wake lock or non-interactive will release all override wake locks.
+            if (mScreenTimeoutOverridePolicy != null) {
+                mScreenTimeoutOverridePolicy.checkScreenWakeLock(mWakeLockSummary);
+            }
+
             for (int idx = 0; idx < mPowerGroups.size(); idx++) {
                 final PowerGroup powerGroup = mPowerGroups.valueAt(idx);
                 final int wakeLockSummary = adjustWakeLockSummary(powerGroup.getWakefulnessLocked(),
@@ -2824,6 +2863,8 @@
                 return WAKE_LOCK_DOZE;
             case PowerManager.DRAW_WAKE_LOCK:
                 return WAKE_LOCK_DRAW;
+            case PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK:
+                return WAKE_LOCK_SCREEN_TIMEOUT_OVERRIDE;
         }
         return 0;
     }
@@ -2904,11 +2945,10 @@
 
         final long attentiveTimeout = getAttentiveTimeoutLocked();
         final long sleepTimeout = getSleepTimeoutLocked(attentiveTimeout);
-        long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout,
+        final long defaultScreenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout,
                 attentiveTimeout);
-        final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
-        screenOffTimeout =
-                getScreenOffTimeoutWithFaceDownLocked(screenOffTimeout, screenDimDuration);
+        final long defaultScreenDimDuration = getScreenDimDurationLocked(defaultScreenOffTimeout);
+
         final boolean userInactiveOverride = mUserInactiveOverrideFromWindowManager;
         long nextTimeout = -1;
         boolean hasUserActivitySummary = false;
@@ -2917,6 +2957,16 @@
             long groupNextTimeout = 0;
             final PowerGroup powerGroup = mPowerGroups.valueAt(idx);
             final int wakefulness = powerGroup.getWakefulnessLocked();
+
+            // The default display screen timeout could be overridden by policy.
+            long screenOffTimeout = defaultScreenOffTimeout;
+            long screenDimDuration = defaultScreenDimDuration;
+            if (powerGroup.getGroupId() == Display.DEFAULT_DISPLAY_GROUP) {
+                screenOffTimeout =
+                        getScreenOffTimeoutOverrideLocked(screenOffTimeout, screenDimDuration);
+                screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
+            }
+
             if (wakefulness != WAKEFULNESS_ASLEEP) {
                 final long lastUserActivityTime = powerGroup.getLastUserActivityTimeLocked();
                 final long lastUserActivityTimeNoChangeLights =
@@ -3194,15 +3244,20 @@
                 (long)(screenOffTimeout * mMaximumScreenDimRatioConfig));
     }
 
+    @VisibleForTesting
     @GuardedBy("mLock")
-    private long getScreenOffTimeoutWithFaceDownLocked(
-            long screenOffTimeout, long screenDimDuration) {
-        // If face down, we decrease the timeout to equal the dim duration so that the
-        // device will go into a dim state.
-        if (mIsFaceDown) {
-            return Math.min(screenDimDuration, screenOffTimeout);
+    long getScreenOffTimeoutOverrideLocked(long screenOffTimeout, long screenDimDuration) {
+        long shortestScreenOffTimeout = screenOffTimeout;
+        if (mScreenTimeoutOverridePolicy != null) {
+            shortestScreenOffTimeout =
+                    mScreenTimeoutOverridePolicy.getScreenTimeoutOverrideLocked(
+                            mWakeLockSummary, screenOffTimeout);
         }
-        return screenOffTimeout;
+        if (mIsFaceDown) {
+            shortestScreenOffTimeout = Math.min(screenDimDuration, shortestScreenOffTimeout);
+        }
+
+        return shortestScreenOffTimeout;
     }
 
     /**
@@ -3574,6 +3629,7 @@
                 boolean ready = powerGroup.updateLocked(screenBrightnessOverride,
                         shouldUseProximitySensorLocked(), shouldBoostScreenBrightness(),
                         mDozeScreenStateOverrideFromDreamManager,
+                        mDozeScreenStateOverrideReasonFromDreamManager,
                         mDozeScreenBrightnessOverrideFromDreamManagerFloat,
                         mDrawWakeLockOverrideFromSidekick,
                         mBatterySaverSupported
@@ -4383,11 +4439,12 @@
     }
 
     private void setDozeOverrideFromDreamManagerInternal(
-            int screenState, int screenBrightness) {
+            int screenState, @Display.StateReason int reason, int screenBrightness) {
         synchronized (mLock) {
             if (mDozeScreenStateOverrideFromDreamManager != screenState
                     || mDozeScreenBrightnessOverrideFromDreamManager != screenBrightness) {
                 mDozeScreenStateOverrideFromDreamManager = screenState;
+                mDozeScreenStateOverrideReasonFromDreamManager = reason;
                 mDozeScreenBrightnessOverrideFromDreamManager = screenBrightness;
                 mDozeScreenBrightnessOverrideFromDreamManagerFloat =
                         BrightnessSynchronizer.brightnessIntToFloat(mDozeScreenBrightnessOverrideFromDreamManager);
@@ -4811,6 +4868,13 @@
         mAmbientDisplaySuppressionController.dump(pw);
 
         mLowPowerStandbyController.dump(pw);
+
+        synchronized (mLock) {
+            if (mScreenTimeoutOverridePolicy != null) {
+                mScreenTimeoutOverridePolicy.dump(pw);
+            }
+        }
+
         mFeatureFlags.dump(pw);
     }
 
@@ -5280,6 +5344,9 @@
                 case MSG_ATTENTIVE_TIMEOUT:
                     handleAttentiveTimeout();
                     break;
+                case MSG_RELEASE_ALL_OVERRIDE_WAKE_LOCKS:
+                    releaseAllOverrideWakeLocks();
+                    break;
             }
 
             return true;
@@ -5471,21 +5538,23 @@
         private String getLockLevelString() {
             switch (mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
                 case PowerManager.FULL_WAKE_LOCK:
-                    return "FULL_WAKE_LOCK                ";
+                    return "FULL_WAKE_LOCK                   ";
                 case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
-                    return "SCREEN_BRIGHT_WAKE_LOCK       ";
+                    return "SCREEN_BRIGHT_WAKE_LOCK          ";
                 case PowerManager.SCREEN_DIM_WAKE_LOCK:
-                    return "SCREEN_DIM_WAKE_LOCK          ";
+                    return "SCREEN_DIM_WAKE_LOCK             ";
                 case PowerManager.PARTIAL_WAKE_LOCK:
-                    return "PARTIAL_WAKE_LOCK             ";
+                    return "PARTIAL_WAKE_LOCK                ";
                 case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
-                    return "PROXIMITY_SCREEN_OFF_WAKE_LOCK";
+                    return "PROXIMITY_SCREEN_OFF_WAKE_LOCK   ";
                 case PowerManager.DOZE_WAKE_LOCK:
-                    return "DOZE_WAKE_LOCK                ";
+                    return "DOZE_WAKE_LOCK                   ";
                 case PowerManager.DRAW_WAKE_LOCK:
-                    return "DRAW_WAKE_LOCK                ";
+                    return "DRAW_WAKE_LOCK                   ";
+                case PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK:
+                    return "SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK";
                 default:
-                    return "???                           ";
+                    return "???                              ";
             }
         }
 
@@ -5728,6 +5797,17 @@
                 mContext.enforceCallingOrSelfPermission(
                         android.Manifest.permission.DEVICE_POWER, null);
             }
+
+            if ((flags & PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK) != 0) {
+                if (!mFeatureFlags.isEarlyScreenTimeoutDetectorEnabled()) {
+                    throw new IllegalArgumentException("Acquiring an unsupported wake lock:"
+                            + " flags=" + flags + ", tag=" + tag);
+                }
+
+                mContext.enforceCallingOrSelfPermission(
+                        android.Manifest.permission.SCREEN_TIMEOUT_OVERRIDE, null);
+            }
+
             if (ws != null && !ws.isEmpty()) {
                 mContext.enforceCallingOrSelfPermission(
                         android.Manifest.permission.UPDATE_DEVICE_STATS, null);
@@ -6985,7 +7065,8 @@
         }
 
         @Override
-        public void setDozeOverrideFromDreamManager(int screenState, int screenBrightness) {
+        public void setDozeOverrideFromDreamManager(
+                int screenState, int reason, int screenBrightness) {
             switch (screenState) {
                 case Display.STATE_UNKNOWN:
                 case Display.STATE_OFF:
@@ -7002,7 +7083,7 @@
                     || screenBrightness > PowerManager.BRIGHTNESS_ON) {
                 screenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
             }
-            setDozeOverrideFromDreamManagerInternal(screenState, screenBrightness);
+            setDozeOverrideFromDreamManagerInternal(screenState, reason, screenBrightness);
         }
 
         @Override
@@ -7177,4 +7258,23 @@
         }
         return false;
     }
+
+    private void releaseAllOverrideWakeLocks() {
+        synchronized (mLock) {
+            final int size = mWakeLocks.size();
+            boolean change = false;
+            for (int i = size - 1; i >= 0; i--) {
+                final WakeLock wakeLock = mWakeLocks.get(i);
+                if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
+                        == PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK) {
+                    removeWakeLockNoUpdateLocked(wakeLock, i);
+                    change = true;
+                }
+            }
+
+            if (change) {
+                updatePowerStateLocked();
+            }
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/power/ScreenTimeoutOverridePolicy.java b/services/core/java/com/android/server/power/ScreenTimeoutOverridePolicy.java
new file mode 100644
index 0000000..adde518
--- /dev/null
+++ b/services/core/java/com/android/server/power/ScreenTimeoutOverridePolicy.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;
+
+import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
+
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_BUTTON_BRIGHT;
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_SCREEN_BRIGHT;
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_SCREEN_DIM;
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_SCREEN_TIMEOUT_OVERRIDE;
+
+import android.content.Context;
+import android.os.PowerManager;
+import android.util.IndentingPrintWriter;
+import android.util.Slog;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.PrintWriter;
+
+/**
+  * Policy that handle the screen timeout override wake lock behavior.
+  */
+@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+final class ScreenTimeoutOverridePolicy {
+    private static final String TAG = "ScreenTimeoutOverridePolicy";
+
+    /**
+     * Release reason code: The wake lock is never acquired.
+     */
+    public static final int RELEASE_REASON_UNKNOWN = -1;
+
+    /**
+     * Release reason code: The wake lock can't be acquired because of screen off.
+     */
+    public static final int RELEASE_REASON_NON_INTERACTIVE = 1;
+
+    /**
+     * Release reason code: Release because user activity occurred.
+     */
+    public static final int RELEASE_REASON_USER_ACTIVITY = 2;
+    /**
+     * Release reason code: Release because a screen lock is acquired.
+     */
+    public static final int RELEASE_REASON_SCREEN_LOCK = 3;
+
+    // The screen timeout override config in milliseconds.
+    private long mScreenTimeoutOverrideConfig;
+
+    // The last reason that wake locks had been released by service.
+    private int mLastAutoReleaseReason = RELEASE_REASON_UNKNOWN;
+
+    interface PolicyCallback {
+        /**
+         * Notify {@link PowerManagerService} to release all override wake locks.
+         */
+        void releaseAllScreenTimeoutOverrideWakelocks();
+    }
+    private PolicyCallback mPolicyCallback;
+
+    ScreenTimeoutOverridePolicy(Context context, long minimumScreenOffTimeoutConfig,
+            PolicyCallback callback) {
+        mScreenTimeoutOverrideConfig = context.getResources().getInteger(
+                com.android.internal.R.integer.config_screenTimeoutOverride);
+        if (mScreenTimeoutOverrideConfig < minimumScreenOffTimeoutConfig) {
+            Slog.w(TAG, "Screen timeout override is smaller than the minimum timeout : "
+                    + mScreenTimeoutOverrideConfig);
+            mScreenTimeoutOverrideConfig = -1;
+        }
+        mPolicyCallback = callback;
+    }
+
+    /**
+     * Return the valid screen timeout override value.
+     */
+    long getScreenTimeoutOverrideLocked(int wakeLockSummary, long screenOffTimeout) {
+        if (!isWakeLockAcquired(wakeLockSummary)) {
+            return screenOffTimeout;
+        }
+
+        if (mScreenTimeoutOverrideConfig < 0) {
+            return screenOffTimeout;
+        }
+
+        // If screen timeout overlay wake lock is acquired, return the policy timeout.
+        return Math.min(mScreenTimeoutOverrideConfig, screenOffTimeout);
+    }
+
+    /**
+     * Called when the policy have to release all wake lock when user activity occurred.
+     */
+    void onUserActivity(int wakeLockSummary, @PowerManager.UserActivityEvent int event) {
+        if (!isWakeLockAcquired(wakeLockSummary)) {
+            return;
+        }
+
+        switch (event) {
+            case PowerManager.USER_ACTIVITY_EVENT_ATTENTION:
+            case PowerManager.USER_ACTIVITY_EVENT_OTHER:
+            case PowerManager.USER_ACTIVITY_EVENT_BUTTON:
+            case PowerManager.USER_ACTIVITY_EVENT_TOUCH:
+            case PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY:
+                releaseAllWakeLocks(RELEASE_REASON_USER_ACTIVITY);
+        }
+    }
+
+    /**
+     * Check the summary whether a screen wake lock acquired .
+     */
+    void checkScreenWakeLock(int wakeLockSummary) {
+        if (!isWakeLockAcquired(wakeLockSummary)) {
+            return;
+        }
+
+        if ((wakeLockSummary & (WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM
+                | WAKE_LOCK_BUTTON_BRIGHT)) != 0) {
+            releaseAllWakeLocks(RELEASE_REASON_SCREEN_LOCK);
+        }
+    }
+
+    /**
+     * Check the device is in non-interactive
+     */
+    void onWakefulnessChange(int wakeLockSummary, int globalWakefulness) {
+        if (!isWakeLockAcquired(wakeLockSummary)) {
+            return;
+        }
+
+        if (globalWakefulness != WAKEFULNESS_AWAKE) {
+            releaseAllWakeLocks(RELEASE_REASON_NON_INTERACTIVE);
+        }
+    }
+
+    private boolean isWakeLockAcquired(int wakeLockSummary) {
+        return (wakeLockSummary & WAKE_LOCK_SCREEN_TIMEOUT_OVERRIDE) != 0;
+    }
+
+    private void logReleaseReason() {
+        Slog.i(TAG, "Releasing all screen timeout override wake lock."
+                + " (reason=" + mLastAutoReleaseReason + ")");
+    }
+
+    private void releaseAllWakeLocks(int reason) {
+        mPolicyCallback.releaseAllScreenTimeoutOverrideWakelocks();
+        mLastAutoReleaseReason = reason;
+        logReleaseReason();
+    }
+
+    void dump(PrintWriter pw) {
+        final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
+
+        ipw.println();
+        ipw.println("ScreenTimeoutOverridePolicy:");
+        ipw.increaseIndent();
+
+        ipw.println("mScreenTimeoutOverrideConfig=" + mScreenTimeoutOverrideConfig);
+        ipw.println("mLastAutoReleaseReason=" + mLastAutoReleaseReason);
+    }
+}
diff --git a/services/core/java/com/android/server/power/WakeLockLog.java b/services/core/java/com/android/server/power/WakeLockLog.java
index d3486a4..b131311 100644
--- a/services/core/java/com/android/server/power/WakeLockLog.java
+++ b/services/core/java/com/android/server/power/WakeLockLog.java
@@ -86,7 +86,7 @@
     private static final int TAG_DATABASE_SIZE = 128;
     private static final int TAG_DATABASE_SIZE_MAX = 128;
 
-    private static final int LEVEL_UNKNOWN = 0;
+    private static final int LEVEL_SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK = 0;
     private static final int LEVEL_PARTIAL_WAKE_LOCK = 1;
     private static final int LEVEL_FULL_WAKE_LOCK = 2;
     private static final int LEVEL_SCREEN_DIM_WAKE_LOCK = 3;
@@ -96,7 +96,7 @@
     private static final int LEVEL_DRAW_WAKE_LOCK = 7;
 
     private static final String[] LEVEL_TO_STRING = {
-        "unknown",
+        "override",
         "partial",
         "full",
         "screen-dim",
@@ -311,6 +311,9 @@
             case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
                 newFlags = LEVEL_PROXIMITY_SCREEN_OFF_WAKE_LOCK;
                 break;
+            case PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK:
+                newFlags = LEVEL_SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+                break;
             default:
                 Slog.w(TAG, "Unsupported lock level for logging, flags: " + flags);
                 break;
diff --git a/services/core/java/com/android/server/power/batterysaver/OWNERS b/services/core/java/com/android/server/power/batterysaver/OWNERS
index cf23bea..dc2d0b3 100644
--- a/services/core/java/com/android/server/power/batterysaver/OWNERS
+++ b/services/core/java/com/android/server/power/batterysaver/OWNERS
@@ -1,3 +1,2 @@
[email protected]
 [email protected]
[email protected]
\ No newline at end of file
[email protected]
diff --git a/services/core/java/com/android/server/power/feature/Android.bp b/services/core/java/com/android/server/power/feature/Android.bp
index 2295b41..fee3114 100644
--- a/services/core/java/com/android/server/power/feature/Android.bp
+++ b/services/core/java/com/android/server/power/feature/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "power_flags",
     package: "com.android.server.power.feature.flags",
+    container: "system",
     srcs: [
         "*.aconfig",
     ],
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 f5dfb5c..ca58153 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
@@ -1,4 +1,5 @@
 package: "com.android.server.power.feature.flags"
+container: "system"
 
 # Important: Flags must be accessed through PowerManagerFlags.
 
diff --git a/services/core/java/com/android/server/power/hint/Android.bp b/services/core/java/com/android/server/power/hint/Android.bp
index 8a98de6..d7dd902 100644
--- a/services/core/java/com/android/server/power/hint/Android.bp
+++ b/services/core/java/com/android/server/power/hint/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "power_hint_flags",
     package: "com.android.server.power.hint",
+    container: "system",
     srcs: [
         "flags.aconfig",
     ],
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 3f1b1c1..101983e 100644
--- a/services/core/java/com/android/server/power/hint/HintManagerService.java
+++ b/services/core/java/com/android/server/power/hint/HintManagerService.java
@@ -456,6 +456,9 @@
                         totalDurationNs / durationNsList.length);
                 int th90DurationUs = (int) TimeUnit.NANOSECONDS.toMicros(
                         durationNsList[(int) (durationNsList.length * 0.9)]);
+                FrameworkStatsLog.write(FrameworkStatsLog.ADPF_HINT_SESSION_TID_CLEANUP, uid,
+                        totalDurationUs, maxDurationUs, totalTidCnt, totalInvalidTidCnt,
+                        maxInvalidTidCnt, sessionCnt, isForeground);
                 Slog.d(TAG,
                         "Invalid tid found for UID" + uid + " in " + totalDurationUs + "us:\n\t"
                                 + "count("
diff --git a/services/core/java/com/android/server/power/hint/TEST_MAPPING b/services/core/java/com/android/server/power/hint/TEST_MAPPING
index 10c5362..ce6277d 100644
--- a/services/core/java/com/android/server/power/hint/TEST_MAPPING
+++ b/services/core/java/com/android/server/power/hint/TEST_MAPPING
@@ -1,5 +1,5 @@
 {
-  "postsubmit": [
+  "presubmit": [
     {
       "name": "FrameworksServicesTests",
       "options": [
@@ -10,6 +10,17 @@
           "exclude-annotation": "androidx.test.filters.FlakyTest"
         }
       ]
+    },
+    {
+      "name": "CtsStatsdAtomHostTestCases",
+      "options": [
+        {"exclude-annotation": "androidx.test.filters.FlakyTest"},
+        {"exclude-annotation": "org.junit.Ignore"},
+        {"include-filter": "android.cts.statsdatom.powermanager"}
+      ],
+      "file_patterns": [
+        "(/|^)ThermalManagerService.java"
+      ]
     }
   ]
 }
\ No newline at end of file
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 f4afcb1..0997744 100644
--- a/services/core/java/com/android/server/power/hint/flags.aconfig
+++ b/services/core/java/com/android/server/power/hint/flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.power.hint"
+container: "system"
 
 flag {
     name: "powerhint_thread_cleanup"
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 8e3c6ac..3a84897 100644
--- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
+++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
@@ -3844,6 +3844,7 @@
         public abstract T instantiateObject();
     }
 
+    @SuppressWarnings("ParcelableCreator")
     public static class ControllerActivityCounterImpl extends ControllerActivityCounter
             implements Parcelable {
         private final Clock mClock;
diff --git a/services/core/java/com/android/server/power/stats/flags.aconfig b/services/core/java/com/android/server/power/stats/flags.aconfig
index c42ccea..54ae84f4 100644
--- a/services/core/java/com/android/server/power/stats/flags.aconfig
+++ b/services/core/java/com/android/server/power/stats/flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.power.optimization"
+container: "system"
 
 flag {
     name: "power_monitor_api"
diff --git a/services/core/java/com/android/server/powerstats/PowerStatsService.java b/services/core/java/com/android/server/powerstats/PowerStatsService.java
index 9f0a975..8f99d28 100644
--- a/services/core/java/com/android/server/powerstats/PowerStatsService.java
+++ b/services/core/java/com/android/server/powerstats/PowerStatsService.java
@@ -568,23 +568,25 @@
             int index = 0;
 
             Channel[] channels = getEnergyMeterInfo();
-            for (Channel channel : channels) {
-                PowerMonitor monitor = new PowerMonitor(index++,
-                        PowerMonitor.POWER_MONITOR_TYPE_MEASUREMENT,
-                        getChannelName(channel));
-                monitors.add(monitor);
-                states.add(new PowerMonitorState(monitor, channel.id));
+            if (channels != null) {
+                for (Channel channel : channels) {
+                    PowerMonitor monitor = new PowerMonitor(index++,
+                            PowerMonitor.POWER_MONITOR_TYPE_MEASUREMENT,
+                            getChannelName(channel));
+                    monitors.add(monitor);
+                    states.add(new PowerMonitorState(monitor, channel.id));
+                }
             }
-
             EnergyConsumer[] energyConsumers = getEnergyConsumerInfo();
-            for (EnergyConsumer consumer : energyConsumers) {
-                PowerMonitor monitor = new PowerMonitor(index++,
-                        PowerMonitor.POWER_MONITOR_TYPE_CONSUMER,
-                        getEnergyConsumerName(consumer, energyConsumers));
-                monitors.add(monitor);
-                states.add(new PowerMonitorState(monitor, consumer.id));
+            if (energyConsumers != null) {
+                for (EnergyConsumer consumer : energyConsumers) {
+                    PowerMonitor monitor = new PowerMonitor(index++,
+                            PowerMonitor.POWER_MONITOR_TYPE_CONSUMER,
+                            getEnergyConsumerName(consumer, energyConsumers));
+                    monitors.add(monitor);
+                    states.add(new PowerMonitorState(monitor, consumer.id));
+                }
             }
-
             mPowerMonitors = monitors.toArray(new PowerMonitor[monitors.size()]);
             mPowerMonitorStates = states.toArray(new PowerMonitorState[monitors.size()]);
         }
diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
index 3c0547e..c24240b 100644
--- a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
+++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
@@ -30,6 +30,7 @@
 import static com.android.internal.widget.LockSettingsInternal.ARM_REBOOT_ERROR_NO_PROVIDER;
 
 import android.annotation.IntDef;
+import android.annotation.Nullable;
 import android.apex.CompressedApexInfo;
 import android.apex.CompressedApexInfoList;
 import android.content.Context;
@@ -37,6 +38,7 @@
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.hardware.boot.IBootControl;
+import android.hardware.security.secretkeeper.ISecretkeeper;
 import android.net.LocalSocket;
 import android.net.LocalSocketAddress;
 import android.os.Binder;
@@ -52,6 +54,7 @@
 import android.os.ShellCallback;
 import android.os.SystemProperties;
 import android.provider.DeviceConfig;
+import android.security.AndroidKeyStoreMaintenance;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.FastImmutableArraySet;
@@ -68,6 +71,7 @@
 import com.android.server.Watchdog;
 import com.android.server.pm.ApexManager;
 import com.android.server.recoverysystem.hal.BootControlHIDL;
+import com.android.server.utils.Slogf;
 
 import libcore.io.IoUtils;
 
@@ -122,6 +126,8 @@
     static final String LSKF_CAPTURED_TIMESTAMP_PREF = "lskf_captured_timestamp";
     static final String LSKF_CAPTURED_COUNT_PREF = "lskf_captured_count";
 
+    static final String RECOVERY_WIPE_DATA_COMMAND = "--wipe_data";
+
     private final Injector mInjector;
     private final Context mContext;
 
@@ -525,18 +531,57 @@
     @Override // Binder call
     public void rebootRecoveryWithCommand(String command) {
         if (DEBUG) Slog.d(TAG, "rebootRecoveryWithCommand: [" + command + "]");
+
+        boolean isForcedWipe = command != null && command.contains(RECOVERY_WIPE_DATA_COMMAND);
         synchronized (sRequestLock) {
             if (!setupOrClearBcb(true, command)) {
                 Slog.e(TAG, "rebootRecoveryWithCommand failed to setup BCB");
                 return;
             }
 
+            if (isForcedWipe) {
+                deleteSecrets();
+                // TODO: consider adding a dedicated forced-wipe-reboot method to PowerManager and
+                // calling here.
+            }
+
             // Having set up the BCB, go ahead and reboot.
             PowerManager pm = mInjector.getPowerManager();
             pm.reboot(PowerManager.REBOOT_RECOVERY);
         }
     }
 
+    private static void deleteSecrets() {
+        Slogf.w(TAG, "deleteSecrets");
+        try {
+            AndroidKeyStoreMaintenance.deleteAllKeys();
+        } catch (android.security.KeyStoreException e) {
+            Log.wtf(TAG, "Failed to delete all keys from keystore.", e);
+        }
+
+        try {
+            ISecretkeeper secretKeeper = getSecretKeeper();
+            if (secretKeeper != null) {
+                Slogf.i(TAG, "ISecretkeeper.deleteAll();");
+                secretKeeper.deleteAll();
+            }
+        } catch (RemoteException e) {
+            Log.wtf(TAG, "Failed to delete all secrets from secretkeeper.", e);
+        }
+    }
+
+    private static @Nullable ISecretkeeper getSecretKeeper() {
+        ISecretkeeper result = null;
+        try {
+            result = ISecretkeeper.Stub.asInterface(
+                ServiceManager.waitForDeclaredService(ISecretkeeper.DESCRIPTOR + "/default"));
+        } catch (SecurityException e) {
+            Slog.w(TAG, "Does not have permissions to get AIDL secretkeeper service");
+        }
+
+        return result;
+    }
+
     private void enforcePermissionForResumeOnReboot() {
         if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.RECOVERY)
                 != PackageManager.PERMISSION_GRANTED
diff --git a/services/core/java/com/android/server/rollback/README.md b/services/core/java/com/android/server/rollback/README.md
index f6bcbd0..a38315c 100644
--- a/services/core/java/com/android/server/rollback/README.md
+++ b/services/core/java/com/android/server/rollback/README.md
@@ -203,6 +203,15 @@
 $ adb install --enable-rollback 1 FooV2.apk
 ```
 
+### Setting Rollback Impact Level
+
+The `adb install` command accepts the `--rollback-impact-level [0/1/2]` flag to control
+when a rollback can be performed by `PackageWatchdog`.
+
+The default rollback impact level is `ROLLBACK_USER_IMPACT_LOW` (0). To use a
+different impact level, use `ROLLBACK_USER_IMPACT_HIGH` (1) or `ROLLBACK_USER_IMPACT_ONLY_MANUAL`
+(2).
+
 ### Triggering Rollback Manually
 
 If rollback is available for an application, the pm command can be used to
@@ -225,6 +234,8 @@
 469808841:
   -state: committed
   -timestamp: 2019-04-23T14:57:35.944Z
+  -rollbackLifetimeMillis: 0
+  -rollbackUserImpact: 1
   -packages:
     com.android.tests.rollback.testapp.B 2 -> 1 [0]
   -causePackages:
@@ -232,6 +243,8 @@
 649899517:
   -state: committed
   -timestamp: 2019-04-23T12:55:21.342Z
+  -rollbackLifetimeMillis: 0
+  -rollbackUserImpact: 0
   -stagedSessionId: 343374391
   -packages:
     com.android.tests.rollback.testapex 2 -> 1 [0]
diff --git a/services/core/java/com/android/server/rollback/Rollback.java b/services/core/java/com/android/server/rollback/Rollback.java
index d1f91c8..8f39ffb 100644
--- a/services/core/java/com/android/server/rollback/Rollback.java
+++ b/services/core/java/com/android/server/rollback/Rollback.java
@@ -27,6 +27,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentSender;
+import android.content.pm.Flags;
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
@@ -960,6 +961,9 @@
         ipw.println("-stateDescription: " + mStateDescription);
         ipw.println("-timestamp: " + getTimestamp());
         ipw.println("-rollbackLifetimeMillis: " + getRollbackLifetimeMillis());
+        if (Flags.recoverabilityDetection()) {
+            ipw.println("-rollbackImpactLevel: " + info.getRollbackImpactLevel());
+        }
         ipw.println("-isStaged: " + isStaged());
         ipw.println("-originalSessionId: " + getOriginalSessionId());
         ipw.println("-packages:");
diff --git a/services/core/java/com/android/server/stats/Android.bp b/services/core/java/com/android/server/stats/Android.bp
index e597c3a..f7955e8 100644
--- a/services/core/java/com/android/server/stats/Android.bp
+++ b/services/core/java/com/android/server/stats/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "stats_flags",
     package: "com.android.server.stats",
+    container: "system",
     srcs: [
         "stats_flags.aconfig",
     ],
diff --git a/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java b/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java
index 881583ad..2088e41 100644
--- a/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java
+++ b/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java
@@ -16,6 +16,7 @@
 
 package com.android.server.stats.pull;
 
+import android.annotation.NonNull;
 import android.app.ActivityManager;
 import android.app.StatsManager;
 import android.app.usage.NetworkStatsManager;
@@ -125,6 +126,11 @@
     @GuardedBy("mLock")
     private final Map<UidProcState, MobileDataStats> mUidStats;
 
+    // No reason to keep more dimensions than 3000. The 3000 is the hard top for the statsd metrics
+    // dimensions guardrail. It also will keep the result binder transaction size capped to
+    // approximately 220kB for 3000 atoms
+    private static final int UID_STATS_MAX_SIZE = 3000;
+
     private final SparseIntArray mUidPreviousState;
 
     private NetworkStats mLastMobileUidStats = new NetworkStats(0, -1);
@@ -135,7 +141,7 @@
 
     private final RateLimiter mRateLimiter;
 
-    AggregatedMobileDataStatsPuller(NetworkStatsManager networkStatsManager) {
+    AggregatedMobileDataStatsPuller(@NonNull NetworkStatsManager networkStatsManager) {
         if (DEBUG) {
             if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
                 Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER,
@@ -188,14 +194,18 @@
         }
 
         final UidProcState statsKey = new UidProcState(uid, previousState);
-        MobileDataStats stats;
         if (mUidStats.containsKey(statsKey)) {
-            stats = mUidStats.get(statsKey);
-        } else {
-            stats = new MobileDataStats();
-            mUidStats.put(statsKey, stats);
+            return mUidStats.get(statsKey);
         }
-        return stats;
+        if (mUidStats.size() < UID_STATS_MAX_SIZE) {
+            MobileDataStats stats = new MobileDataStats();
+            mUidStats.put(statsKey, stats);
+            return stats;
+        }
+        if (DEBUG) {
+            Slog.w(TAG, "getUidStatsForPreviousStateLocked() UID_STATS_MAX_SIZE reached");
+        }
+        return null;
     }
 
     private void noteUidProcessStateImpl(int uid, int state) {
@@ -252,10 +262,12 @@
                     continue;
                 }
                 MobileDataStats stats = getUidStatsForPreviousStateLocked(entry.getUid());
-                stats.addTxBytes(entry.getTxBytes());
-                stats.addRxBytes(entry.getRxBytes());
-                stats.addTxPackets(entry.getTxPackets());
-                stats.addRxPackets(entry.getRxPackets());
+                if (stats != null) {
+                    stats.addTxBytes(entry.getTxBytes());
+                    stats.addRxBytes(entry.getRxBytes());
+                    stats.addTxPackets(entry.getTxPackets());
+                    stats.addRxPackets(entry.getRxPackets());
+                }
             }
         }
     }
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 0ffd002..b5df30f 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -37,6 +37,7 @@
 import static android.net.NetworkTemplate.OEM_MANAGED_PAID;
 import static android.net.NetworkTemplate.OEM_MANAGED_PRIVATE;
 import static android.os.Debug.getIonHeapsSizeKb;
+import static android.os.Process.INVALID_UID;
 import static android.os.Process.LAST_SHARED_APPLICATION_GID;
 import static android.os.Process.SYSTEM_UID;
 import static android.os.Process.getUidForPid;
@@ -844,8 +845,6 @@
         mStorageManager = (StorageManager) mContext.getSystemService(StorageManager.class);
         mNetworkStatsManager = mContext.getSystemService(NetworkStatsManager.class);
 
-        initMobileDataStatsPuller();
-
         // Initialize DiskIO
         mStoragedUidIoStatsReader = new StoragedUidIoStatsReader();
 
@@ -1015,7 +1014,8 @@
         }
         if (ENABLE_MOBILE_DATA_STATS_AGGREGATED_PULLER) {
             mAggregatedMobileDataStatsPuller =
-                    new AggregatedMobileDataStatsPuller(mNetworkStatsManager);
+                    new AggregatedMobileDataStatsPuller(
+                            mContext.getSystemService(NetworkStatsManager.class));
         }
     }
 
@@ -1061,6 +1061,7 @@
         registerMobileBytesTransfer();
         registerMobileBytesTransferBackground();
         if (ENABLE_MOBILE_DATA_STATS_AGGREGATED_PULLER) {
+            initMobileDataStatsPuller();
             registerMobileBytesTransferByProcState();
         }
         registerBytesTransferByTagAndMetered();
@@ -3537,17 +3538,23 @@
                     String roleName = roleEntry.getKey();
                     Set<String> packageNames = roleEntry.getValue();
 
-                    for (String packageName : packageNames) {
-                        PackageInfo pkg;
-                        try {
-                            pkg = pm.getPackageInfoAsUser(packageName, 0, userId);
-                        } catch (PackageManager.NameNotFoundException e) {
-                            Slog.w(TAG, "Role holder " + packageName + " not found");
-                            return StatsManager.PULL_SKIP;
-                        }
+                    if (!packageNames.isEmpty()) {
+                        for (String packageName : packageNames) {
+                            PackageInfo pkg;
+                            try {
+                                pkg = pm.getPackageInfoAsUser(packageName, 0, userId);
+                            } catch (PackageManager.NameNotFoundException e) {
+                                Slog.w(TAG, "Role holder " + packageName + " not found");
+                                return StatsManager.PULL_SKIP;
+                            }
 
+                            pulledData.add(FrameworkStatsLog.buildStatsEvent(
+                                    atomTag, pkg.applicationInfo.uid, packageName, roleName));
+                        }
+                    } else {
+                        // Ensure that roles set to None are logged with an empty state.
                         pulledData.add(FrameworkStatsLog.buildStatsEvent(
-                                atomTag, pkg.applicationInfo.uid, packageName, roleName));
+                                atomTag, INVALID_UID, "", roleName));
                     }
                 }
             }
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 5101a69..101b98e 100644
--- a/services/core/java/com/android/server/stats/stats_flags.aconfig
+++ b/services/core/java/com/android/server/stats/stats_flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.stats"
+container: "system"
 
 flag {
     name: "add_mobile_bytes_transfer_by_proc_state_puller"
diff --git a/services/core/java/com/android/server/storage/StorageSessionController.java b/services/core/java/com/android/server/storage/StorageSessionController.java
index 5fd787a..b9c9b64 100644
--- a/services/core/java/com/android/server/storage/StorageSessionController.java
+++ b/services/core/java/com/android/server/storage/StorageSessionController.java
@@ -29,6 +29,7 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.content.pm.UserInfo;
+import android.os.Binder;
 import android.os.IVold;
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
@@ -246,17 +247,18 @@
      * Call {@link #onVolumeRemove} to remove the connection without waiting for exit
      */
     public void onVolumeUnmount(VolumeInfo vol) {
-        StorageUserConnection connection = onVolumeRemove(vol);
-
-        Slog.i(TAG, "On volume unmount " + vol);
-        if (connection != null) {
-            String sessionId = vol.getId();
-
-            try {
-                connection.removeSessionAndWait(sessionId);
-            } catch (ExternalStorageServiceException e) {
-                Slog.e(TAG, "Failed to end session for vol with id: " + sessionId, e);
+        String sessionId = vol.getId();
+        final long token = Binder.clearCallingIdentity();
+        try {
+            StorageUserConnection connection = onVolumeRemove(vol);
+            Slog.i(TAG, "On volume unmount " + vol);
+            if (connection != null) {
+              connection.removeSessionAndWait(sessionId);
             }
+        } catch (ExternalStorageServiceException e) {
+            Slog.e(TAG, "Failed to end session for vol with id: " + sessionId, e);
+        } finally {
+            Binder.restoreCallingIdentity(token);
         }
     }
 
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index 2b05993..f62c76e 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -61,7 +61,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
-import android.security.Authorization;
+import android.security.KeyStoreAuthorization;
 import android.service.trust.GrantTrustResult;
 import android.service.trust.TrustAgentService;
 import android.text.TextUtils;
@@ -155,6 +155,7 @@
     /* package */ final TrustArchive mArchive = new TrustArchive();
     private final Context mContext;
     private final LockPatternUtils mLockPatternUtils;
+    private final KeyStoreAuthorization mKeyStoreAuthorization;
     private final UserManager mUserManager;
     private final ActivityManager mActivityManager;
     private FingerprintManager mFingerprintManager;
@@ -252,25 +253,27 @@
      * cases.
      */
     protected static class Injector {
-        private final LockPatternUtils mLockPatternUtils;
-        private final Looper mLooper;
+        private final Context mContext;
 
-        public Injector(LockPatternUtils lockPatternUtils, Looper looper) {
-            mLockPatternUtils = lockPatternUtils;
-            mLooper = looper;
+        public Injector(Context context) {
+            mContext = context;
         }
 
         LockPatternUtils getLockPatternUtils() {
-            return mLockPatternUtils;
+            return new LockPatternUtils(mContext);
+        }
+
+        KeyStoreAuthorization getKeyStoreAuthorization() {
+            return KeyStoreAuthorization.getInstance();
         }
 
         Looper getLooper() {
-            return mLooper;
+            return Looper.myLooper();
         }
     }
 
     public TrustManagerService(Context context) {
-        this(context, new Injector(new LockPatternUtils(context), Looper.myLooper()));
+        this(context, new Injector(context));
     }
 
     protected TrustManagerService(Context context, Injector injector) {
@@ -280,6 +283,7 @@
         mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
         mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
         mLockPatternUtils = injector.getLockPatternUtils();
+        mKeyStoreAuthorization = injector.getKeyStoreAuthorization();
         mStrongAuthTracker = new StrongAuthTracker(context, injector.getLooper());
         mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
     }
@@ -915,16 +919,16 @@
                 int authUserId = mLockPatternUtils.isProfileWithUnifiedChallenge(userId)
                         ? resolveProfileParent(userId) : userId;
 
-                Authorization.onDeviceLocked(userId, getBiometricSids(authUserId),
+                mKeyStoreAuthorization.onDeviceLocked(userId, getBiometricSids(authUserId),
                         isWeakUnlockMethodEnabled(authUserId));
             } else {
-                Authorization.onDeviceLocked(userId, getBiometricSids(userId), false);
+                mKeyStoreAuthorization.onDeviceLocked(userId, getBiometricSids(userId), false);
             }
         } else {
             // Notify Keystore that the device is now unlocked for the user.  Note that for unlocks
             // with LSKF, this is redundant with the call from LockSettingsService which provides
             // the password.  However, for unlocks with biometric or trust agent, this is required.
-            Authorization.onDeviceUnlocked(userId, /* password= */ null);
+            mKeyStoreAuthorization.onDeviceUnlocked(userId, /* password= */ null);
         }
     }
 
diff --git a/services/core/java/com/android/server/utils/Android.bp b/services/core/java/com/android/server/utils/Android.bp
index 3a334be..ffb9aec 100644
--- a/services/core/java/com/android/server/utils/Android.bp
+++ b/services/core/java/com/android/server/utils/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "com.android.server.utils-aconfig",
     package: "com.android.server.utils",
+    container: "system",
     srcs: ["*.aconfig"],
 }
 
diff --git a/services/core/java/com/android/server/utils/flags.aconfig b/services/core/java/com/android/server/utils/flags.aconfig
index 163116b..6f37837 100644
--- a/services/core/java/com/android/server/utils/flags.aconfig
+++ b/services/core/java/com/android/server/utils/flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.utils"
+container: "system"
 
 flag {
      name: "anr_timer_service"
diff --git a/services/core/java/com/android/server/utils/quota/OWNERS b/services/core/java/com/android/server/utils/quota/OWNERS
index a2943f3..469acb2 100644
--- a/services/core/java/com/android/server/utils/quota/OWNERS
+++ b/services/core/java/com/android/server/utils/quota/OWNERS
@@ -1,4 +1,3 @@
 [email protected]
[email protected]
 [email protected]
 [email protected]
diff --git a/services/core/java/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java b/services/core/java/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java
index a25d67a..ed9fa65 100644
--- a/services/core/java/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java
+++ b/services/core/java/com/android/server/vcn/routeselection/IpSecPacketLossDetector.java
@@ -24,8 +24,10 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.net.ConnectivityManager;
 import android.net.IpSecTransformState;
 import android.net.Network;
+import android.net.vcn.Flags;
 import android.net.vcn.VcnManager;
 import android.os.Handler;
 import android.os.HandlerExecutor;
@@ -71,6 +73,7 @@
 
     @NonNull private final Handler mHandler;
     @NonNull private final PowerManager mPowerManager;
+    @NonNull private final ConnectivityManager mConnectivityManager;
     @NonNull private final Object mCancellationToken = new Object();
     @NonNull private final PacketLossCalculator mPacketLossCalculator;
 
@@ -98,6 +101,8 @@
         mHandler = new Handler(getVcnContext().getLooper());
 
         mPowerManager = getVcnContext().getContext().getSystemService(PowerManager.class);
+        mConnectivityManager =
+                getVcnContext().getContext().getSystemService(ConnectivityManager.class);
 
         mPacketLossCalculator = deps.getPacketLossCalculator();
 
@@ -205,6 +210,18 @@
     }
 
     @Override
+    public void onLinkPropertiesOrCapabilitiesChanged() {
+        if (!isStarted()) return;
+
+        reschedulePolling();
+    }
+
+    private void reschedulePolling() {
+        mHandler.removeCallbacksAndEqualMessages(mCancellationToken);
+        mHandler.postDelayed(new PollIpSecStateRunnable(), mCancellationToken, 0L);
+    }
+
+    @Override
     protected void start() {
         super.start();
         clearTransformStateAndPollingEvents();
@@ -313,6 +330,13 @@
         } else {
             logInfo(logMsg);
             onValidationResultReceivedInternal(true /* isFailed */);
+
+            if (Flags.validateNetworkOnIpsecLoss()) {
+                // Trigger re-validation of the underlying network; if it fails, the VCN will
+                // attempt to migrate away.
+                mConnectivityManager.reportNetworkConnectivity(
+                        getNetwork(), false /* hasConnectivity */);
+            }
         }
     }
 
diff --git a/services/core/java/com/android/server/vcn/routeselection/NetworkMetricMonitor.java b/services/core/java/com/android/server/vcn/routeselection/NetworkMetricMonitor.java
index 1704aa1..a1b212f 100644
--- a/services/core/java/com/android/server/vcn/routeselection/NetworkMetricMonitor.java
+++ b/services/core/java/com/android/server/vcn/routeselection/NetworkMetricMonitor.java
@@ -186,6 +186,11 @@
         // Subclasses MUST override it if they care
     }
 
+    /** Called when LinkProperties or NetworkCapabilities have changed */
+    public void onLinkPropertiesOrCapabilitiesChanged() {
+        // Subclasses MUST override it if they care
+    }
+
     public boolean isValidationFailed() {
         return mIsValidationFailed;
     }
@@ -203,6 +208,11 @@
         return mVcnContext;
     }
 
+    @NonNull
+    public Network getNetwork() {
+        return mNetwork;
+    }
+
     // Override methods for AutoCloseable. Subclasses MUST call super when overriding this method
     @Override
     public void close() {
diff --git a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java
index 2f4cf5e..78e06d4 100644
--- a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java
+++ b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java
@@ -25,6 +25,7 @@
 import android.net.LinkProperties;
 import android.net.Network;
 import android.net.NetworkCapabilities;
+import android.net.vcn.Flags;
 import android.net.vcn.VcnManager;
 import android.net.vcn.VcnUnderlyingNetworkTemplate;
 import android.os.Handler;
@@ -295,6 +296,12 @@
 
         updatePriorityClass(
                 underlyingNetworkTemplates, subscriptionGroup, lastSnapshot, carrierConfig);
+
+        if (Flags.evaluateIpsecLossOnLpNcChange()) {
+            for (NetworkMetricMonitor monitor : mMetricMonitors) {
+                monitor.onLinkPropertiesOrCapabilitiesChanged();
+            }
+        }
     }
 
     /** Set the LinkProperties */
@@ -308,6 +315,12 @@
 
         updatePriorityClass(
                 underlyingNetworkTemplates, subscriptionGroup, lastSnapshot, carrierConfig);
+
+        if (Flags.evaluateIpsecLossOnLpNcChange()) {
+            for (NetworkMetricMonitor monitor : mMetricMonitors) {
+                monitor.onLinkPropertiesOrCapabilitiesChanged();
+            }
+        }
     }
 
     /** Set whether the network is blocked */
diff --git a/services/core/java/com/android/server/vibrator/Vibration.java b/services/core/java/com/android/server/vibrator/Vibration.java
index 6fc9d9a..ad54efc 100644
--- a/services/core/java/com/android/server/vibrator/Vibration.java
+++ b/services/core/java/com/android/server/vibrator/Vibration.java
@@ -32,8 +32,9 @@
 import android.util.proto.ProtoOutputStream;
 
 import java.io.PrintWriter;
-import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.Locale;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -42,10 +43,11 @@
  * The base class for all vibrations.
  */
 abstract class Vibration {
-    private static final SimpleDateFormat DEBUG_TIME_FORMAT =
-            new SimpleDateFormat("HH:mm:ss.SSS");
-    private static final SimpleDateFormat DEBUG_DATE_TIME_FORMAT =
-            new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
+    private static final DateTimeFormatter DEBUG_TIME_FORMATTER = DateTimeFormatter.ofPattern(
+            "HH:mm:ss.SSS").withZone(ZoneId.systemDefault());
+    private static final DateTimeFormatter DEBUG_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(
+            "MM-dd HH:mm:ss.SSS").withZone(ZoneId.systemDefault());
+
     // Used to generate globally unique vibration ids.
     private static final AtomicInteger sNextVibrationId = new AtomicInteger(1); // 0 = no callback
 
@@ -240,10 +242,12 @@
 
         @Override
         public String toString() {
-            return "createTime: " + DEBUG_DATE_TIME_FORMAT.format(new Date(mCreateTime))
-                    + ", startTime: " + DEBUG_DATE_TIME_FORMAT.format(new Date(mStartTime))
-                    + ", endTime: "
-                    + (mEndTime == 0 ? null : DEBUG_DATE_TIME_FORMAT.format(new Date(mEndTime)))
+            return "createTime: " + DEBUG_DATE_TIME_FORMATTER.format(
+                    Instant.ofEpochMilli(mCreateTime))
+                    + ", startTime: " + DEBUG_DATE_TIME_FORMATTER.format(
+                    Instant.ofEpochMilli(mStartTime))
+                    + ", endTime: " + (mEndTime == 0 ? null : DEBUG_DATE_TIME_FORMATTER.format(
+                    Instant.ofEpochMilli(mEndTime)))
                     + ", durationMs: " + mDurationMs
                     + ", status: " + mStatus.name().toLowerCase(Locale.ROOT)
                     + ", playedEffect: " + mPlayedEffect
@@ -267,12 +271,14 @@
             boolean isExternalVibration = mPlayedEffect == null;
             String timingsStr = String.format(Locale.ROOT,
                     "%s | %8s | %20s | duration: %5dms | start: %12s | end: %12s",
-                    DEBUG_DATE_TIME_FORMAT.format(new Date(mCreateTime)),
+                    DEBUG_DATE_TIME_FORMATTER.format(Instant.ofEpochMilli(mCreateTime)),
                     isExternalVibration ? "external" : "effect",
                     mStatus.name().toLowerCase(Locale.ROOT),
                     mDurationMs,
-                    mStartTime == 0 ? "" : DEBUG_TIME_FORMAT.format(new Date(mStartTime)),
-                    mEndTime == 0 ? "" : DEBUG_TIME_FORMAT.format(new Date(mEndTime)));
+                    mStartTime == 0 ? ""
+                            : DEBUG_TIME_FORMATTER.format(Instant.ofEpochMilli(mStartTime)),
+                    mEndTime == 0 ? ""
+                            : DEBUG_TIME_FORMATTER.format(Instant.ofEpochMilli(mEndTime)));
             String paramStr = String.format(Locale.ROOT,
                     " | scale: %8s (adaptive=%.2f) | flags: %4s | usage: %s",
                     VibrationScaler.scaleLevelToString(mScaleLevel), mAdaptiveScale,
@@ -307,10 +313,12 @@
             pw.increaseIndent();
             pw.println("status = " + mStatus.name().toLowerCase(Locale.ROOT));
             pw.println("durationMs = " + mDurationMs);
-            pw.println("createTime = " + DEBUG_DATE_TIME_FORMAT.format(new Date(mCreateTime)));
-            pw.println("startTime = " + DEBUG_DATE_TIME_FORMAT.format(new Date(mStartTime)));
-            pw.println("endTime = "
-                    + (mEndTime == 0 ? null : DEBUG_DATE_TIME_FORMAT.format(new Date(mEndTime))));
+            pw.println("createTime = " + DEBUG_DATE_TIME_FORMATTER.format(
+                    Instant.ofEpochMilli(mCreateTime)));
+            pw.println("startTime = " + DEBUG_DATE_TIME_FORMATTER.format(
+                    Instant.ofEpochMilli(mStartTime)));
+            pw.println("endTime = " + (mEndTime == 0 ? null
+                    : DEBUG_DATE_TIME_FORMATTER.format(Instant.ofEpochMilli(mEndTime))));
             pw.println("playedEffect = " + mPlayedEffect);
             pw.println("originalEffect = " + mOriginalEffect);
             pw.println("scale = " + VibrationScaler.scaleLevelToString(mScaleLevel));
diff --git a/services/core/java/com/android/server/vibrator/VibratorControlService.java b/services/core/java/com/android/server/vibrator/VibratorControlService.java
index 10317c9..b33fa6f 100644
--- a/services/core/java/com/android/server/vibrator/VibratorControlService.java
+++ b/services/core/java/com/android/server/vibrator/VibratorControlService.java
@@ -51,8 +51,9 @@
 import com.android.internal.util.ArrayUtils;
 
 import java.io.PrintWriter;
-import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.Locale;
 import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
@@ -66,8 +67,8 @@
     private static final int UNRECOGNIZED_VIBRATION_TYPE = -1;
     private static final int NO_SCALE = -1;
 
-    private static final SimpleDateFormat DEBUG_DATE_TIME_FORMAT =
-            new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
+    private static final DateTimeFormatter DEBUG_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(
+            "MM-dd HH:mm:ss.SSS").withZone(ZoneId.systemDefault());
 
     private final VibrationParamsRecords mVibrationParamsRecords;
     private final VibratorControllerHolder mVibratorControllerHolder;
@@ -567,7 +568,7 @@
         public void dump(IndentingPrintWriter pw) {
             String line = String.format(Locale.ROOT,
                     "%s | %6s | scale: %5s | typesMask: %6s | usages: %s",
-                    DEBUG_DATE_TIME_FORMAT.format(new Date(mCreateTime)),
+                    DEBUG_DATE_TIME_FORMATTER.format(Instant.ofEpochMilli(mCreateTime)),
                     mOperation.name().toLowerCase(Locale.ROOT),
                     (mScale == NO_SCALE) ? "" : String.format(Locale.ROOT, "%.2f", mScale),
                     Long.toBinaryString(mTypesMask), createVibrationUsagesString());
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperCropper.java b/services/core/java/com/android/server/wallpaper/WallpaperCropper.java
index 5175b74..f6e0168 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperCropper.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperCropper.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wallpaper;
 
+import static android.app.WallpaperManager.ORIENTATION_UNKNOWN;
 import static android.app.WallpaperManager.getOrientation;
 import static android.app.WallpaperManager.getRotatedOrientation;
 import static android.view.Display.DEFAULT_DISPLAY;
@@ -86,7 +87,7 @@
     public interface WallpaperCropUtils {
 
         /**
-         * Equivalent to {@link #getCrop(Point, Point, SparseArray, boolean)}
+         * Equivalent to {@link WallpaperCropper#getCrop(Point, Point, SparseArray, boolean)}
          */
         Rect getCrop(Point displaySize, Point bitmapSize,
                 SparseArray<Rect> suggestedCrops, boolean rtl);
@@ -120,16 +121,44 @@
     public Rect getCrop(Point displaySize, Point bitmapSize,
             SparseArray<Rect> suggestedCrops, boolean rtl) {
 
-        // Case 1: if no crops are provided, center align the full image
+        int orientation = getOrientation(displaySize);
+
+        // Case 1: if no crops are provided, show the full image (from the left, or right if RTL).
         if (suggestedCrops == null || suggestedCrops.size() == 0) {
-            Rect crop = new Rect(0, 0, displaySize.x, displaySize.y);
-            float scale = Math.min(
-                    ((float) bitmapSize.x) / displaySize.x,
-                    ((float) bitmapSize.y) / displaySize.y);
-            crop.scale(scale);
-            crop.offset((bitmapSize.x - crop.width()) / 2,
-                    (bitmapSize.y - crop.height()) / 2);
-            return crop;
+            Rect crop = new Rect(0, 0, bitmapSize.x, bitmapSize.y);
+
+            // The first exception is if the device is a foldable and we're on the folded screen.
+            // In that case, show the center of what's on the unfolded screen.
+            int unfoldedOrientation = mWallpaperDisplayHelper.getUnfoldedOrientation(orientation);
+            if (unfoldedOrientation != ORIENTATION_UNKNOWN) {
+                // Let the system know that we're showing the full image on the unfolded screen
+                SparseArray<Rect> newSuggestedCrops = new SparseArray<>();
+                newSuggestedCrops.put(unfoldedOrientation, crop);
+                // This will fall into "Case 4" of this function and center the folded screen
+                return getCrop(displaySize, bitmapSize, newSuggestedCrops, rtl);
+            }
+
+            // The second exception is if we're on tablet and we're on portrait mode.
+            // In that case, center the wallpaper relatively to landscape and put some parallax.
+            boolean isTablet = mWallpaperDisplayHelper.isLargeScreen()
+                    && !mWallpaperDisplayHelper.isFoldable();
+            if (isTablet && displaySize.x < displaySize.y) {
+                Point rotatedDisplaySize = new Point(displaySize.y, displaySize.x);
+                // compute the crop on landscape (without parallax)
+                Rect landscapeCrop = getCrop(rotatedDisplaySize, bitmapSize, suggestedCrops, rtl);
+                landscapeCrop = noParallax(landscapeCrop, rotatedDisplaySize, bitmapSize, rtl);
+                // compute the crop on portrait at the center of the landscape crop
+                crop = getAdjustedCrop(landscapeCrop, bitmapSize, displaySize, false, rtl, ADD);
+
+                // add some parallax (until the border of the landscape crop without parallax)
+                if (rtl) {
+                    crop.left = landscapeCrop.left;
+                } else {
+                    crop.right = landscapeCrop.right;
+                }
+            }
+
+            return getAdjustedCrop(crop, bitmapSize, displaySize, true, rtl, ADD);
         }
 
         // If any suggested crop is invalid, fallback to case 1
@@ -142,8 +171,6 @@
             }
         }
 
-        int orientation = getOrientation(displaySize);
-
         // Case 2: if the orientation exists in the suggested crops, adjust the suggested crop
         Rect suggestedCrop = suggestedCrops.get(orientation);
         if (suggestedCrop != null) {
@@ -168,11 +195,21 @@
         suggestedCrop = suggestedCrops.get(unfoldedOrientation);
         suggestedDisplaySize = defaultDisplaySizes.get(unfoldedOrientation);
         if (suggestedCrop != null) {
-            // only keep the visible part (without parallax)
+            // compute the visible part (without parallax) of the unfolded screen
             Rect adjustedCrop = noParallax(suggestedCrop, suggestedDisplaySize, bitmapSize, rtl);
-            return getAdjustedCrop(adjustedCrop, bitmapSize, displaySize, false, rtl, REMOVE);
+            // compute the folded crop, at the center of the crop of the unfolded screen
+            Rect res = getAdjustedCrop(adjustedCrop, bitmapSize, displaySize, false, rtl, REMOVE);
+            // if we removed some width, add it back to add a parallax effect
+            if (res.width() < adjustedCrop.width()) {
+                if (rtl) res.left = Math.min(res.left, adjustedCrop.left);
+                else res.right = Math.max(res.right, adjustedCrop.right);
+                // use getAdjustedCrop(parallax=true) to make sure we don't exceed MAX_PARALLAX
+                res = getAdjustedCrop(res, bitmapSize, displaySize, true, rtl, ADD);
+            }
+            return res;
         }
 
+
         // Case 5: if the device is a foldable, if we're looking for an unfolded orientation and
         // have the suggested crop of the relative folded orientation, reuse it by adding content.
         int foldedOrientation = mWallpaperDisplayHelper.getFoldedOrientation(orientation);
@@ -274,11 +311,8 @@
             if (additionalWidthForParallax > MAX_PARALLAX) {
                 int widthToRemove = (int) Math.ceil(
                         (additionalWidthForParallax - MAX_PARALLAX) * screenRatio * crop.height());
-                if (rtl) {
-                    adjustedCrop.left += widthToRemove;
-                } else {
-                    adjustedCrop.right -= widthToRemove;
-                }
+                adjustedCrop.left += widthToRemove / 2;
+                adjustedCrop.right -= widthToRemove / 2 + widthToRemove % 2;
             }
         } else {
             // TODO (b/281648899) the third case is not always correct, fix that.
@@ -366,6 +400,24 @@
      */
     SparseArray<Rect> getDefaultCrops(SparseArray<Rect> suggestedCrops, Point bitmapSize) {
 
+        // If the suggested crops is single-element map with (ORIENTATION_UNKNOWN, cropHint),
+        // Crop the bitmap using the cropHint and compute the crops for cropped bitmap.
+        Rect cropHint = suggestedCrops.get(ORIENTATION_UNKNOWN);
+        if (cropHint != null) {
+            Rect bitmapRect = new Rect(0, 0, bitmapSize.x, bitmapSize.y);
+            if (suggestedCrops.size() != 1 || !bitmapRect.contains(cropHint)) {
+                Slog.w(TAG, "Couldn't get default crops from suggested crops " + suggestedCrops
+                        + " for bitmap of size " + bitmapSize + "; ignoring suggested crops");
+                return getDefaultCrops(new SparseArray<>(), bitmapSize);
+            }
+            Point cropSize = new Point(cropHint.width(), cropHint.height());
+            SparseArray<Rect> relativeDefaultCrops = getDefaultCrops(new SparseArray<>(), cropSize);
+            for (int i = 0; i < relativeDefaultCrops.size(); i++) {
+                relativeDefaultCrops.valueAt(i).offset(cropHint.left, cropHint.top);
+            }
+            return relativeDefaultCrops;
+        }
+
         SparseArray<Point> defaultDisplaySizes = mWallpaperDisplayHelper.getDefaultDisplaySizes();
         boolean rtl = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
                 == View.LAYOUT_DIRECTION_RTL;
@@ -422,28 +474,78 @@
         } else {
             boolean needCrop = false;
             boolean needScale;
-            boolean multiCrop = multiCrop() && wallpaper.mSupportsMultiCrop;
 
             Point bitmapSize = new Point(options.outWidth, options.outHeight);
+            Rect bitmapRect = new Rect(0, 0, bitmapSize.x, bitmapSize.y);
 
+            if (multiCrop()) {
+                // Check that the suggested crops per screen orientation are all within the bitmap.
+                for (int i = 0; i < wallpaper.mCropHints.size(); i++) {
+                    int orientation = wallpaper.mCropHints.keyAt(i);
+                    Rect crop = wallpaper.mCropHints.valueAt(i);
+                    if (crop.isEmpty() || !bitmapRect.contains(crop)) {
+                        Slog.w(TAG, "Invalid crop " + crop + " for orientation " + orientation
+                                + " and bitmap size " + bitmapSize + "; clearing suggested crops.");
+                        wallpaper.mCropHints.clear();
+                        wallpaper.cropHint.set(bitmapRect);
+                        break;
+                    }
+                }
+            }
             final Rect cropHint;
-            if (multiCrop) {
-                SparseArray<Rect> defaultDisplayCrops =
-                        getDefaultCrops(wallpaper.mCropHints, bitmapSize);
-                // adapt the entries in wallpaper.mCropHints for the actual display
+            final SparseArray<Rect> defaultCrops;
+
+            // A wallpaper with cropHints = Map.of(ORIENTATION_UNKNOWN, rect) is treated like
+            // a wallpaper with cropHints = null and  cropHint = rect.
+            Rect tempCropHint = wallpaper.mCropHints.get(ORIENTATION_UNKNOWN);
+            if (multiCrop() && tempCropHint != null) {
+                wallpaper.cropHint.set(tempCropHint);
+                wallpaper.mCropHints.clear();
+            }
+            if (multiCrop() && wallpaper.mCropHints.size() > 0) {
+                // Some suggested crops per screen orientation were provided,
+                // use them to compute the default crops for this device
+                defaultCrops = getDefaultCrops(wallpaper.mCropHints, bitmapSize);
+                // Adapt the provided crops to match the actual crops for the default display
                 SparseArray<Rect> updatedCropHints = new SparseArray<>();
                 for (int i = 0; i < wallpaper.mCropHints.size(); i++) {
                     int orientation = wallpaper.mCropHints.keyAt(i);
-                    Rect defaultCrop = defaultDisplayCrops.get(orientation);
+                    Rect defaultCrop = defaultCrops.get(orientation);
                     if (defaultCrop != null) {
                         updatedCropHints.put(orientation, defaultCrop);
                     }
                 }
                 wallpaper.mCropHints = updatedCropHints;
-                cropHint = getTotalCrop(defaultDisplayCrops);
+
+                // Finally, compute the cropHint based on the default crops
+                cropHint = getTotalCrop(defaultCrops);
                 wallpaper.cropHint.set(cropHint);
+                if (DEBUG) {
+                    Slog.d(TAG, "Generated default crops for wallpaper: " + defaultCrops
+                            + " based on suggested crops: " + wallpaper.mCropHints);
+                }
+            } else if (multiCrop()) {
+                // No crops per screen orientation were provided, but an overall cropHint may be
+                // defined in wallpaper.cropHint. Compute the default crops for the sub-image
+                // defined by the cropHint, then recompute the cropHint based on the default crops.
+                // If the cropHint is empty or invalid, ignore it and use the full image.
+                if (wallpaper.cropHint.isEmpty()) wallpaper.cropHint.set(bitmapRect);
+                if (!bitmapRect.contains(wallpaper.cropHint)) {
+                    Slog.w(TAG, "Ignoring wallpaper.cropHint = " + wallpaper.cropHint
+                            + "; not within the bitmap of size " + bitmapSize);
+                    wallpaper.cropHint.set(bitmapRect);
+                }
+                Point cropSize = new Point(wallpaper.cropHint.width(), wallpaper.cropHint.height());
+                defaultCrops = getDefaultCrops(new SparseArray<>(), cropSize);
+                cropHint = getTotalCrop(defaultCrops);
+                cropHint.offset(wallpaper.cropHint.left, wallpaper.cropHint.top);
+                wallpaper.cropHint.set(cropHint);
+                if (DEBUG) {
+                    Slog.d(TAG, "Generated default crops for wallpaper: " + defaultCrops);
+                }
             } else {
                 cropHint = new Rect(wallpaper.cropHint);
+                defaultCrops = null;
             }
 
             if (DEBUG) {
@@ -455,11 +557,11 @@
             }
 
             // Empty crop means use the full image
-            if (cropHint.isEmpty()) {
+            if (!multiCrop() && cropHint.isEmpty()) {
                 cropHint.left = cropHint.top = 0;
                 cropHint.right = options.outWidth;
                 cropHint.bottom = options.outHeight;
-            } else {
+            } else if (!multiCrop()) {
                 // force the crop rect to lie within the measured bounds
                 int dx = cropHint.right > options.outWidth ? options.outWidth - cropHint.right : 0;
                 int dy = cropHint.bottom > options.outHeight
@@ -473,19 +575,46 @@
                 if (cropHint.top < 0) {
                     cropHint.top = 0;
                 }
-
-                // Don't bother cropping if what we're left with is identity
-                needCrop = (options.outHeight > cropHint.height()
-                        || options.outWidth > cropHint.width());
             }
 
+            // Don't bother cropping if what we're left with is identity
+            needCrop = (options.outHeight > cropHint.height()
+                    || options.outWidth > cropHint.width());
+
             // scale if the crop height winds up not matching the recommended metrics
             needScale = cropHint.height() > wpData.mHeight
                     || cropHint.height() > GLHelper.getMaxTextureSize()
                     || cropHint.width() > GLHelper.getMaxTextureSize();
 
+            float sampleSize = Float.MAX_VALUE;
+            if (multiCrop()) {
+                // If all crops for all orientations have more width and height in pixel
+                // than the display for this orientation, downsample the image
+                for (int i = 0; i < defaultCrops.size(); i++) {
+                    int orientation = defaultCrops.keyAt(i);
+                    Rect crop = defaultCrops.valueAt(i);
+                    Point displayForThisOrientation = mWallpaperDisplayHelper
+                            .getDefaultDisplaySizes().get(orientation);
+                    if (displayForThisOrientation == null) continue;
+                    float sampleSizeForThisOrientation = Math.max(1f, Math.min(
+                            crop.width() / displayForThisOrientation.x,
+                            crop.height() / displayForThisOrientation.y));
+                    sampleSize = Math.min(sampleSize, sampleSizeForThisOrientation);
+                }
+                // If the total crop has more width or height than either the max texture size
+                // or twice the largest display dimension, downsample the image
+                int maxCropSize = Math.min(
+                        2 * mWallpaperDisplayHelper.getDefaultDisplayLargestDimension(),
+                        GLHelper.getMaxTextureSize());
+                float minimumSampleSize = Math.max(1f, Math.max(
+                        (float) cropHint.height() / maxCropSize,
+                        (float) cropHint.width()) / maxCropSize);
+                sampleSize = Math.max(sampleSize, minimumSampleSize);
+                needScale = sampleSize > 1f;
+            }
+
             //make sure screen aspect ratio is preserved if width is scaled under screen size
-            if (needScale && !multiCrop) {
+            if (needScale && !multiCrop()) {
                 final float scaleByHeight = (float) wpData.mHeight / (float) cropHint.height();
                 final int newWidth = (int) (cropHint.width() * scaleByHeight);
                 if (newWidth < displayInfo.logicalWidth) {
@@ -498,7 +627,8 @@
 
             if (DEBUG_CROP) {
                 Slog.v(TAG, "crop: w=" + cropHint.width() + " h=" + cropHint.height());
-                Slog.v(TAG, "dims: w=" + wpData.mWidth + " h=" + wpData.mHeight);
+                if (multiCrop()) Slog.v(TAG, "defaultCrops: " + defaultCrops);
+                if (!multiCrop()) Slog.v(TAG, "dims: w=" + wpData.mWidth + " h=" + wpData.mHeight);
                 Slog.v(TAG, "meas: w=" + options.outWidth + " h=" + options.outHeight);
                 Slog.v(TAG, "crop?=" + needCrop + " scale?=" + needScale);
             }
@@ -541,28 +671,17 @@
                     options.inJustDecodeBounds = false;
 
                     final Rect estimateCrop = new Rect(cropHint);
-                    estimateCrop.scale(1f / options.inSampleSize);
+                    if (!multiCrop()) estimateCrop.scale(1f / options.inSampleSize);
+                    else estimateCrop.scale(1f / sampleSize);
                     float hRatio = (float) wpData.mHeight / estimateCrop.height();
-                    if (multiCrop) {
-                        // make sure the crop height is at most the display largest dimension
-                        hRatio = (float) mWallpaperDisplayHelper.getDefaultDisplayLargestDimension()
-                                / estimateCrop.height();
-                        hRatio = Math.min(hRatio, 1f);
-                    }
                     final int destHeight = (int) (estimateCrop.height() * hRatio);
                     final int destWidth = (int) (estimateCrop.width() * hRatio);
 
                     // We estimated an invalid crop, try to adjust the cropHint to get a valid one.
-                    if (destWidth > GLHelper.getMaxTextureSize()) {
+                    if (!multiCrop() && destWidth > GLHelper.getMaxTextureSize()) {
                         if (DEBUG) {
                             Slog.w(TAG, "Invalid crop dimensions, trying to adjust.");
                         }
-                        if (multiCrop) {
-                            // clear custom crop guidelines, fallback to system default
-                            wallpaper.mCropHints.clear();
-                            generateCropInternal(wallpaper);
-                            return;
-                        }
 
                         int newHeight = (int) (wpData.mHeight / hRatio);
                         int newWidth = (int) (wpData.mWidth / hRatio);
@@ -579,16 +698,27 @@
                     // We've got the safe cropHint; now we want to scale it properly to
                     // the desired rectangle.
                     // That's a height-biased operation: make it fit the hinted height.
-                    final int safeHeight = (int) (estimateCrop.height() * hRatio + 0.5f);
-                    final int safeWidth = (int) (estimateCrop.width() * hRatio + 0.5f);
+                    final int safeHeight = !multiCrop()
+                            ? (int) (estimateCrop.height() * hRatio + 0.5f)
+                            : (int) (cropHint.height() / sampleSize + 0.5f);
+                    final int safeWidth = !multiCrop()
+                            ? (int) (estimateCrop.width() * hRatio + 0.5f)
+                            : (int) (cropHint.width() / sampleSize + 0.5f);
 
                     if (DEBUG_CROP) {
                         Slog.v(TAG, "Decode parameters:");
-                        Slog.v(TAG, "  cropHint=" + cropHint + ", estimateCrop=" + estimateCrop);
-                        Slog.v(TAG, "  down sampling=" + options.inSampleSize
-                                + ", hRatio=" + hRatio);
-                        Slog.v(TAG, "  dest=" + destWidth + "x" + destHeight);
-                        Slog.v(TAG, "  safe=" + safeWidth + "x" + safeHeight);
+                        if (!multiCrop()) {
+                            Slog.v(TAG,
+                                    "  cropHint=" + cropHint + ", estimateCrop=" + estimateCrop);
+                            Slog.v(TAG, "  down sampling=" + options.inSampleSize
+                                    + ", hRatio=" + hRatio);
+                            Slog.v(TAG, "  dest=" + destWidth + "x" + destHeight);
+                        }
+                        if (multiCrop()) {
+                            Slog.v(TAG, "  cropHint=" + cropHint);
+                            Slog.v(TAG, "  sampleSize=" + sampleSize);
+                        }
+                        Slog.v(TAG, "  targetSize=" + safeWidth + "x" + safeHeight);
                         Slog.v(TAG, "  maxTextureSize=" + GLHelper.getMaxTextureSize());
                     }
 
@@ -603,24 +733,28 @@
 
                     final ImageDecoder.Source srcData =
                             ImageDecoder.createSource(wallpaper.getWallpaperFile());
-                    final int sampleSize = scale;
+                    final int finalScale = scale;
+                    final int rescaledBitmapWidth = (int) (0.5f + bitmapSize.x / sampleSize);
+                    final int rescaledBitmapHeight = (int) (0.5f + bitmapSize.y / sampleSize);
                     Bitmap cropped = ImageDecoder.decodeBitmap(srcData, (decoder, info, src) -> {
-                        decoder.setTargetSampleSize(sampleSize);
+                        if (!multiCrop()) decoder.setTargetSampleSize(finalScale);
+                        if (multiCrop()) {
+                            decoder.setTargetSize(rescaledBitmapWidth, rescaledBitmapHeight);
+                        }
                         decoder.setCrop(estimateCrop);
                     });
 
                     record.delete();
 
-                    if (cropped == null) {
+                    if (!multiCrop() && cropped == null) {
                         Slog.e(TAG, "Could not decode new wallpaper");
                     } else {
                         // We are safe to create final crop with safe dimensions now.
-                        final Bitmap finalCrop = Bitmap.createScaledBitmap(cropped,
-                                safeWidth, safeHeight, true);
+                        final Bitmap finalCrop = multiCrop() ? cropped
+                                : Bitmap.createScaledBitmap(cropped, safeWidth, safeHeight, true);
 
-                        if (multiCrop) {
-                            wallpaper.mSampleSize =
-                                    ((float) cropHint.height()) / finalCrop.getHeight();
+                        if (multiCrop()) {
+                            wallpaper.mSampleSize = sampleSize;
                         }
 
                         if (DEBUG) {
@@ -639,9 +773,7 @@
                         success = true;
                     }
                 } catch (Exception e) {
-                    if (DEBUG) {
-                        Slog.e(TAG, "Error decoding crop", e);
-                    }
+                    Slog.e(TAG, "Error decoding crop", e);
                 } finally {
                     IoUtils.closeQuietly(bos);
                     IoUtils.closeQuietly(f);
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperData.java b/services/core/java/com/android/server/wallpaper/WallpaperData.java
index 02594d2..b792f79 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperData.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperData.java
@@ -172,11 +172,6 @@
     SparseArray<Rect> mCropHints = new SparseArray<>();
 
     /**
-     * cropHints will be ignored if this flag is false
-     */
-    boolean mSupportsMultiCrop;
-
-    /**
      * The phone orientation when the wallpaper was set. Only relevant for image wallpapers
      */
     int mOrientationWhenSet = ORIENTATION_UNKNOWN;
@@ -204,7 +199,6 @@
         if (source.mCropHints != null) {
             this.mCropHints = source.mCropHints.clone();
         }
-        this.mSupportsMultiCrop = source.mSupportsMultiCrop;
         this.allowBackup = source.allowBackup;
         this.primaryColors = source.primaryColors;
         this.mWallpaperDimAmount = source.mWallpaperDimAmount;
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java b/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java
index 7f53ea3..4aefb54 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java
@@ -324,10 +324,7 @@
                 getAttributeInt(parser, "totalCropTop", 0),
                 getAttributeInt(parser, "totalCropRight", 0),
                 getAttributeInt(parser, "totalCropBottom", 0));
-        wallpaper.mSupportsMultiCrop = multiCrop() && (
-                parser.getAttributeBoolean(null, "supportsMultiCrop", false)
-                || mImageWallpaper.equals(wallpaper.wallpaperComponent));
-        if (wallpaper.mSupportsMultiCrop) {
+        if (multiCrop() && mImageWallpaper.equals(wallpaper.nextWallpaperComponent)) {
             wallpaper.mCropHints = new SparseArray<>();
             for (Pair<Integer, String> pair: screenDimensionPairs()) {
                 Rect cropHint = new Rect(
@@ -342,16 +339,14 @@
             }
             if (wallpaper.mCropHints.size() == 0 && totalCropHint.isEmpty()) {
                 // migration case: the crops per screen orientation are not specified.
-                int orientation = legacyCropHint.width() < legacyCropHint.height()
-                        ? WallpaperManager.PORTRAIT : WallpaperManager.LANDSCAPE;
                 if (!legacyCropHint.isEmpty()) {
-                    wallpaper.mCropHints.put(orientation, legacyCropHint);
+                    wallpaper.cropHint.set(legacyCropHint);
                 }
             } else {
                 wallpaper.cropHint.set(totalCropHint);
             }
             wallpaper.mSampleSize = parser.getAttributeFloat(null, "sampleSize", 1f);
-        } else {
+        } else if (!multiCrop()) {
             wallpaper.cropHint.set(legacyCropHint);
         }
         final DisplayData wpData = mWallpaperDisplayHelper
@@ -467,13 +462,12 @@
         out.startTag(null, tag);
         out.attributeInt(null, "id", wallpaper.wallpaperId);
 
-        out.attributeBoolean(null, "supportsMultiCrop", wallpaper.mSupportsMultiCrop);
-
-        if (multiCrop() && wallpaper.mSupportsMultiCrop) {
+        if (multiCrop() && mImageWallpaper.equals(wallpaper.wallpaperComponent)) {
             if (wallpaper.mCropHints == null) {
                 Slog.e(TAG, "cropHints should not be null when saved");
                 wallpaper.mCropHints = new SparseArray<>();
             }
+            Rect rectToPutInLegacyCrop = new Rect(wallpaper.cropHint);
             for (Pair<Integer, String> pair : screenDimensionPairs()) {
                 Rect cropHint = wallpaper.mCropHints.get(pair.first);
                 if (cropHint == null) continue;
@@ -493,12 +487,14 @@
                     }
                 }
                 if (pair.first == orientationToPutInLegacyCrop) {
-                    out.attributeInt(null, "cropLeft", cropHint.left);
-                    out.attributeInt(null, "cropTop", cropHint.top);
-                    out.attributeInt(null, "cropRight", cropHint.right);
-                    out.attributeInt(null, "cropBottom", cropHint.bottom);
+                    rectToPutInLegacyCrop.set(cropHint);
                 }
             }
+            out.attributeInt(null, "cropLeft", rectToPutInLegacyCrop.left);
+            out.attributeInt(null, "cropTop", rectToPutInLegacyCrop.top);
+            out.attributeInt(null, "cropRight", rectToPutInLegacyCrop.right);
+            out.attributeInt(null, "cropBottom", rectToPutInLegacyCrop.bottom);
+
             out.attributeInt(null, "totalCropLeft", wallpaper.cropHint.left);
             out.attributeInt(null, "totalCropTop", wallpaper.cropHint.top);
             out.attributeInt(null, "totalCropRight", wallpaper.cropHint.right);
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperDisplayHelper.java b/services/core/java/com/android/server/wallpaper/WallpaperDisplayHelper.java
index 9e1b5d2..3636f5a 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperDisplayHelper.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperDisplayHelper.java
@@ -59,6 +59,8 @@
     }
 
     private static final String TAG = WallpaperDisplayHelper.class.getSimpleName();
+    private static final float LARGE_SCREEN_MIN_DP = 600f;
+
     private final SparseArray<DisplayData> mDisplayDatas = new SparseArray<>();
     private final DisplayManager mDisplayManager;
     private final WindowManagerInternal mWindowManagerInternal;
@@ -67,7 +69,8 @@
     // related orientations pairs for foldable (folded orientation, unfolded orientation)
     private final List<Pair<Integer, Integer>> mFoldableOrientationPairs = new ArrayList<>();
 
-    private boolean mIsFoldable;
+    private final boolean mIsFoldable;
+    private boolean mIsLargeScreen = false;
 
     WallpaperDisplayHelper(
             DisplayManager displayManager,
@@ -94,6 +97,9 @@
                     mDefaultDisplaySizes.put(orientation, point);
                 }
             }
+
+            mIsLargeScreen |= (displaySize.x / metric.getDensity() >= LARGE_SCREEN_MIN_DP);
+
             if (populateOrientationPairs) {
                 int orientation = WallpaperManager.getOrientation(displaySize);
                 float newSurface = displaySize.x * displaySize.y
@@ -215,6 +221,13 @@
     }
 
     /**
+     * Return true if any of the screens of the default display is considered large (DP >= 600)
+     */
+    boolean isLargeScreen() {
+        return mIsLargeScreen;
+    }
+
+    /**
      * If a given orientation corresponds to an unfolded orientation on foldable, return the
      * corresponding folded orientation. Otherwise, return UNKNOWN. Always return UNKNOWN if the
      * device is not a foldable.
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 885baf6..9a5961a 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -42,6 +42,7 @@
 import static com.android.server.wallpaper.WallpaperUtils.getWallpaperDir;
 import static com.android.server.wallpaper.WallpaperUtils.makeWallpaperIdLocked;
 import static com.android.window.flags.Flags.multiCrop;
+import static com.android.window.flags.Flags.offloadColorExtraction;
 
 import android.annotation.NonNull;
 import android.app.ActivityManager;
@@ -131,6 +132,9 @@
 import com.android.server.wallpaper.WallpaperData.BindSource;
 import com.android.server.wm.ActivityTaskManagerInternal;
 import com.android.server.wm.WindowManagerInternal;
+import com.android.tools.r8.keepanno.annotations.KeepItemKind;
+import com.android.tools.r8.keepanno.annotations.KeepTarget;
+import com.android.tools.r8.keepanno.annotations.UsesReflection;
 
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -166,6 +170,13 @@
         }
 
         @Override
+        @UsesReflection(
+                value = {
+                    @KeepTarget(
+                            kind = KeepItemKind.CLASS_AND_MEMBERS,
+                            instanceOfClassConstantExclusive = IWallpaperManagerService.class,
+                            methodName = "<init>")
+                })
         public void onStart() {
             try {
                 final Class<? extends IWallpaperManagerService> klass =
@@ -380,7 +391,7 @@
             }
 
             // Outside of the lock since it will synchronize itself
-            notifyWallpaperColorsChanged(wallpaper);
+            if (!offloadColorExtraction()) notifyWallpaperColorsChanged(wallpaper);
         }
 
         @Override
@@ -403,12 +414,16 @@
     }
 
     void notifyWallpaperColorsChanged(@NonNull WallpaperData wallpaper) {
+        notifyWallpaperColorsChanged(wallpaper, wallpaper.mWhich);
+    }
+
+    private void notifyWallpaperColorsChanged(@NonNull WallpaperData wallpaper, int which) {
         if (DEBUG) {
             Slog.i(TAG, "Notifying wallpaper colors changed");
         }
         if (wallpaper.connection != null) {
             wallpaper.connection.forEachDisplayConnector(connector ->
-                    notifyWallpaperColorsChangedOnDisplay(wallpaper, connector.mDisplayId));
+                    notifyWallpaperColorsChangedOnDisplay(wallpaper, connector.mDisplayId, which));
         }
     }
 
@@ -425,6 +440,11 @@
 
     private void notifyWallpaperColorsChangedOnDisplay(@NonNull WallpaperData wallpaper,
             int displayId) {
+        notifyWallpaperColorsChangedOnDisplay(wallpaper, displayId, wallpaper.mWhich);
+    }
+
+    private void notifyWallpaperColorsChangedOnDisplay(@NonNull WallpaperData wallpaper,
+            int displayId, int which) {
         boolean needsExtraction;
         synchronized (mLock) {
             final RemoteCallbackList<IWallpaperManagerCallback> currentUserColorListeners =
@@ -449,8 +469,8 @@
             notify = extractColors(wallpaper);
         }
         if (notify) {
-            notifyColorListeners(getAdjustedWallpaperColorsOnDimming(wallpaper),
-                    wallpaper.mWhich, wallpaper.userId, displayId);
+            notifyColorListeners(getAdjustedWallpaperColorsOnDimming(wallpaper), which,
+                    wallpaper.userId, displayId);
         }
     }
 
@@ -504,6 +524,7 @@
      * @return true unless the wallpaper changed during the color computation
      */
     private boolean extractColors(WallpaperData wallpaper) {
+        if (offloadColorExtraction()) return !mImageWallpaper.equals(wallpaper.wallpaperComponent);
         String cropFile = null;
         boolean defaultImageWallpaper = false;
         int wallpaperId;
@@ -803,7 +824,7 @@
                     null /* options */);
             mWindowManagerInternal.setWallpaperShowWhenLocked(
                     mToken, (wallpaper.mWhich & FLAG_LOCK) != 0);
-            if (multiCrop() && wallpaper.mSupportsMultiCrop) {
+            if (multiCrop() && mImageWallpaper.equals(wallpaper.wallpaperComponent)) {
                 mWindowManagerInternal.setWallpaperCropHints(mToken,
                         mWallpaperCropper.getRelativeCropHints(wallpaper));
             } else {
@@ -1148,10 +1169,16 @@
             synchronized (mLock) {
                 // Do not broadcast changes on ImageWallpaper since it's handled
                 // internally by this class.
-                if (mImageWallpaper.equals(mWallpaper.wallpaperComponent)) {
+                boolean isImageWallpaper = mImageWallpaper.equals(mWallpaper.wallpaperComponent);
+                if (isImageWallpaper && (!offloadColorExtraction() || primaryColors == null)) {
                     return;
                 }
                 mWallpaper.primaryColors = primaryColors;
+                // only save the colors for ImageWallpaper - for live wallpapers, the colors
+                // are always recomputed after a reboot.
+                if (offloadColorExtraction() && isImageWallpaper) {
+                    saveSettingsLocked(mWallpaper.userId);
+                }
             }
             notifyWallpaperColorsChangedOnDisplay(mWallpaper, displayId);
         }
@@ -1177,7 +1204,9 @@
                 try {
                     // This will trigger onComputeColors in the wallpaper engine.
                     // It's fine to be locked in here since the binder is oneway.
-                    connector.mEngine.requestWallpaperColors();
+                    if (!offloadColorExtraction() || mWallpaper.primaryColors == null) {
+                        connector.mEngine.requestWallpaperColors();
+                    }
                 } catch (RemoteException e) {
                     Slog.w(TAG, "Failed to request wallpaper colors", e);
                 }
@@ -1811,6 +1840,7 @@
             // Offload color extraction to another thread since switchUser will be called
             // from the main thread.
             FgThread.getHandler().post(() -> {
+                if (offloadColorExtraction()) return;
                 notifyWallpaperColorsChanged(systemWallpaper);
                 if (lockWallpaper != systemWallpaper) notifyWallpaperColorsChanged(lockWallpaper);
                 notifyWallpaperColorsChanged(mFallbackWallpaper);
@@ -1917,11 +1947,17 @@
             final ComponentName component;
             final int finalWhich;
 
-            if ((which & FLAG_LOCK) > 0 && lockWallpaper != null) {
-                clearWallpaperBitmaps(lockWallpaper);
-            }
-            if ((which & FLAG_SYSTEM) > 0) {
-                clearWallpaperBitmaps(wallpaper);
+            // Clear any previous ImageWallpaper related fields
+            List<WallpaperData> toClear = new ArrayList<>();
+            if ((which & FLAG_LOCK) > 0 && lockWallpaper != null) toClear.add(lockWallpaper);
+            if ((which & FLAG_SYSTEM) > 0) toClear.add(wallpaper);
+            for (WallpaperData wallpaperToClear : toClear) {
+                clearWallpaperBitmaps(wallpaperToClear);
+                if (multiCrop()) {
+                    wallpaperToClear.mCropHints.clear();
+                    wallpaperToClear.cropHint.set(0, 0, 0, 0);
+                    wallpaperToClear.mSampleSize = 1;
+                }
             }
 
             // lock only case: set the system wallpaper component to both screens
@@ -2225,7 +2261,9 @@
             checkPermission(READ_WALLPAPER_INTERNAL);
             WallpaperData wallpaper = (which == FLAG_LOCK) ? mLockWallpaperMap.get(userId)
                     : mWallpaperMap.get(userId);
-            if (wallpaper == null || !wallpaper.mSupportsMultiCrop) return null;
+            if (wallpaper == null || !mImageWallpaper.equals(wallpaper.wallpaperComponent)) {
+                return null;
+            }
             SparseArray<Rect> relativeSuggestedCrops =
                     mWallpaperCropper.getRelativeCropHints(wallpaper);
             Point croppedBitmapSize = new Point(
@@ -2255,7 +2293,7 @@
     @Override
     public List<Rect> getFutureBitmapCrops(Point bitmapSize, List<Point> displaySizes,
             int[] screenOrientations, List<Rect> crops) {
-        SparseArray<Rect> cropMap = getCropMap(screenOrientations, crops, ORIENTATION_UNKNOWN);
+        SparseArray<Rect> cropMap = getCropMap(screenOrientations, crops);
         SparseArray<Rect> defaultCrops = mWallpaperCropper.getDefaultCrops(cropMap, bitmapSize);
         List<Rect> result = new ArrayList<>();
         boolean rtl = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
@@ -2272,7 +2310,7 @@
             throw new UnsupportedOperationException(
                     "This method should only be called with the multi crop flag enabled");
         }
-        SparseArray<Rect> cropMap = getCropMap(screenOrientations, crops, ORIENTATION_UNKNOWN);
+        SparseArray<Rect> cropMap = getCropMap(screenOrientations, crops);
         SparseArray<Rect> defaultCrops = mWallpaperCropper.getDefaultCrops(cropMap, bitmapSize);
         return WallpaperCropper.getTotalCrop(defaultCrops);
     }
@@ -2714,8 +2752,10 @@
                         });
                         // Need to extract colors again to re-calculate dark hints after
                         // applying dimming.
-                        wp.mIsColorExtractedFromDim = true;
-                        pendingColorExtraction.add(wp);
+                        if (!offloadColorExtraction()) {
+                            wp.mIsColorExtractedFromDim = true;
+                            pendingColorExtraction.add(wp);
+                        }
                         changed = true;
                     }
                 }
@@ -2724,7 +2764,7 @@
                 }
             }
             for (WallpaperData wp: pendingColorExtraction) {
-                notifyWallpaperColorsChanged(wp);
+                if (!offloadColorExtraction()) notifyWallpaperColorsChanged(wp);
             }
         } finally {
             Binder.restoreCallingIdentity(ident);
@@ -2860,10 +2900,8 @@
             return null;
         }
 
-        int currentOrientation = mWallpaperDisplayHelper.getDefaultDisplayCurrentOrientation();
-        SparseArray<Rect> cropMap = !multiCrop() ? null
-                : getCropMap(screenOrientations, crops, currentOrientation);
-        Rect cropHint = multiCrop() || crops == null ? null : crops.get(0);
+        SparseArray<Rect> cropMap = !multiCrop() ? null : getCropMap(screenOrientations, crops);
+        Rect cropHint = multiCrop() || crops == null || crops.isEmpty() ? new Rect() : crops.get(0);
         final boolean fromForegroundApp = !multiCrop() ? false
                 : isFromForegroundApp(callingPackage);
 
@@ -2912,12 +2950,16 @@
                     wallpaper.setComplete = completion;
                     wallpaper.fromForegroundApp = multiCrop() ? fromForegroundApp
                             : isFromForegroundApp(callingPackage);
-                    if (!multiCrop()) wallpaper.cropHint.set(cropHint);
-                    if (multiCrop()) wallpaper.mSupportsMultiCrop = true;
-                    if (multiCrop()) wallpaper.mCropHints = cropMap;
+                    wallpaper.cropHint.set(cropHint);
+                    if (multiCrop()) {
+                        wallpaper.mCropHints = cropMap;
+                        wallpaper.mSampleSize = 1f;
+                        wallpaper.mOrientationWhenSet =
+                                mWallpaperDisplayHelper.getDefaultDisplayCurrentOrientation();
+                    }
                     wallpaper.allowBackup = allowBackup;
                     wallpaper.mWallpaperDimAmount = getWallpaperDimAmount();
-                    wallpaper.mOrientationWhenSet = currentOrientation;
+                    if (offloadColorExtraction()) wallpaper.primaryColors = null;
                 }
                 return pfd;
             } finally {
@@ -2926,16 +2968,14 @@
         }
     }
 
-    private SparseArray<Rect> getCropMap(int[] screenOrientations, List<Rect> crops,
-            int currentOrientation) {
+    private SparseArray<Rect> getCropMap(int[] screenOrientations, List<Rect> crops) {
         if ((crops == null ^ screenOrientations == null)
                 || (crops != null && crops.size() != screenOrientations.length)) {
             throw new IllegalArgumentException(
                     "Illegal crops/orientations lists: must both be null, or both the same size");
         }
         SparseArray<Rect> cropMap = new SparseArray<>();
-        boolean unknown = false;
-        if (crops != null && crops.size() != 0) {
+        if (crops != null && !crops.isEmpty()) {
             for (int i = 0; i < crops.size(); i++) {
                 Rect crop = crops.get(i);
                 int width = crop.width(), height = crop.height();
@@ -2943,22 +2983,13 @@
                     throw new IllegalArgumentException("Invalid crop rect supplied: " + crop);
                 }
                 int orientation = screenOrientations[i];
-                if (orientation == ORIENTATION_UNKNOWN) {
-                    if (currentOrientation == ORIENTATION_UNKNOWN) {
-                        throw new IllegalArgumentException(
-                                "Invalid orientation: " + ORIENTATION_UNKNOWN);
-                    }
-                    unknown = true;
-                    orientation = currentOrientation;
+                if (orientation == ORIENTATION_UNKNOWN && cropMap.size() > 1) {
+                    throw new IllegalArgumentException("Invalid crops supplied: the UNKNOWN"
+                            + "screen orientation should only be used in a singleton map");
                 }
                 cropMap.put(orientation, crop);
             }
         }
-        if (unknown && cropMap.size() > 1) {
-            throw new IllegalArgumentException("Invalid crops supplied: the UNKNOWN screen "
-                    + "orientation should only be used in a singleton map (in which case it"
-                    + "represents the current orientation of the default display)");
-        }
         return cropMap;
     }
 
@@ -2975,7 +3006,6 @@
         WallpaperData lockWP = new WallpaperData(userId, FLAG_LOCK);
         lockWP.wallpaperId = sysWP.wallpaperId;
         lockWP.cropHint.set(sysWP.cropHint);
-        lockWP.mSupportsMultiCrop = sysWP.mSupportsMultiCrop;
         if (sysWP.mCropHints != null) {
             lockWP.mCropHints = sysWP.mCropHints.clone();
         }
@@ -3072,6 +3102,10 @@
         checkPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT);
 
         boolean shouldNotifyColors = false;
+
+        // If the lockscreen wallpaper is set to the same as the home screen, notify that the
+        // lockscreen wallpaper colors changed, even if we don't bind a new wallpaper engine.
+        boolean shouldNotifyLockscreenColors = false;
         boolean bindSuccess;
         final WallpaperData newWallpaper;
 
@@ -3096,7 +3130,6 @@
             final long ident = Binder.clearCallingIdentity();
 
             try {
-                newWallpaper.mSupportsMultiCrop = mImageWallpaper.equals(name);
                 newWallpaper.imageWallpaperPending = false;
                 newWallpaper.mWhich = which;
                 newWallpaper.mSystemWasBoth = systemIsBoth;
@@ -3118,7 +3151,7 @@
                 bindSuccess = bindWallpaperComponentLocked(name, /* force */
                         forceRebind, /* fromUser */ true, newWallpaper, reply);
                 if (bindSuccess) {
-                    if (!same) {
+                    if (!same || (offloadColorExtraction() && forceRebind)) {
                         newWallpaper.primaryColors = null;
                     } else {
                         if (newWallpaper.connection != null) {
@@ -3142,6 +3175,11 @@
                     newWallpaper.wallpaperId = makeWallpaperIdLocked();
                     notifyCallbacksLocked(newWallpaper);
                     shouldNotifyColors = true;
+                    if (offloadColorExtraction()) {
+                        shouldNotifyColors = false;
+                        shouldNotifyLockscreenColors = !force && same && !systemIsBoth
+                                && which == (FLAG_SYSTEM | FLAG_LOCK);
+                    }
 
                     if (which == (FLAG_SYSTEM | FLAG_LOCK)) {
                         if (DEBUG) {
@@ -3170,6 +3208,10 @@
         if (shouldNotifyColors) {
             notifyWallpaperColorsChanged(newWallpaper);
         }
+        if (shouldNotifyLockscreenColors) {
+            notifyWallpaperColorsChanged(newWallpaper, FLAG_LOCK);
+        }
+
         return bindSuccess;
     }
 
diff --git a/services/core/java/com/android/server/wearable/RemoteWearableSensingService.java b/services/core/java/com/android/server/wearable/RemoteWearableSensingService.java
index e230b95..6776f26 100644
--- a/services/core/java/com/android/server/wearable/RemoteWearableSensingService.java
+++ b/services/core/java/com/android/server/wearable/RemoteWearableSensingService.java
@@ -20,6 +20,7 @@
 import static android.content.Context.BIND_INCLUDE_CAPABILITIES;
 
 import android.app.wearable.Flags;
+import android.app.wearable.IWearableSensingCallback;
 import android.app.wearable.WearableSensingManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -75,10 +76,14 @@
      * Provides a secure connection to the wearable.
      *
      * @param secureWearableConnection The secure connection to the wearable
-     * @param callback The callback for service status
+     * @param wearableSensingCallback The callback for requests such as openFile from the
+     *     WearableSensingService.
+     * @param statusCallback The callback for service status
      */
     public void provideSecureConnection(
-            ParcelFileDescriptor secureWearableConnection, RemoteCallback callback) {
+            ParcelFileDescriptor secureWearableConnection,
+            IWearableSensingCallback wearableSensingCallback,
+            RemoteCallback statusCallback) {
         if (DEBUG) {
             Slog.i(TAG, "#provideSecureConnection");
         }
@@ -87,7 +92,8 @@
                     TAG,
                     "FLAG_ENABLE_RESTART_WSS_PROCESS is disabled. Do not attempt to restart the"
                         + " WearableSensingService process");
-            provideSecureConnectionInternal(secureWearableConnection, callback);
+            provideSecureConnectionInternal(
+                    secureWearableConnection, wearableSensingCallback, statusCallback);
             return;
         }
         synchronized (mSecureConnectionLock) {
@@ -105,30 +111,37 @@
                             WearableSensingManager.STATUS_CHANNEL_ERROR);
                 }
                 mNextSecureConnectionContext =
-                        new SecureWearableConnectionContext(secureWearableConnection, callback);
+                        new SecureWearableConnectionContext(
+                                secureWearableConnection, wearableSensingCallback, statusCallback);
                 return;
             }
             if (!mSecureConnectionProvided) {
                 // no need to kill the process
-                provideSecureConnectionInternal(secureWearableConnection, callback);
+                provideSecureConnectionInternal(
+                        secureWearableConnection, wearableSensingCallback, statusCallback);
                 mSecureConnectionProvided = true;
                 return;
             }
             mNextSecureConnectionContext =
-                    new SecureWearableConnectionContext(secureWearableConnection, callback);
+                    new SecureWearableConnectionContext(
+                            secureWearableConnection, wearableSensingCallback, statusCallback);
             // Killing the process causes the binder to die. #binderDied will then be triggered
             killWearableSensingServiceProcess();
         }
     }
 
     private void provideSecureConnectionInternal(
-            ParcelFileDescriptor secureWearableConnection, RemoteCallback callback) {
+            ParcelFileDescriptor secureWearableConnection,
+            IWearableSensingCallback wearableSensingCallback,
+            RemoteCallback statusCallback) {
         Slog.d(TAG, "Providing secure wearable connection.");
         var unused =
                 post(
                         service -> {
                             service.provideSecureConnection(
-                                    secureWearableConnection, callback);
+                                    secureWearableConnection,
+                                    wearableSensingCallback,
+                                    statusCallback);
                             try {
                                 // close the local fd after it has been sent to the WSS process
                                 secureWearableConnection.close();
@@ -146,6 +159,7 @@
                 // This will call #post, which will recreate the process and bind to it
                 provideSecureConnectionInternal(
                         mNextSecureConnectionContext.mSecureConnection,
+                        mNextSecureConnectionContext.mWearableSensingCallback,
                         mNextSecureConnectionContext.mStatusCallback);
                 mNextSecureConnectionContext = null;
             } else {
@@ -164,23 +178,29 @@
      * Provides the implementation a data stream to the wearable.
      *
      * @param parcelFileDescriptor The data stream to the wearable
+     * @param wearableSensingCallback The callback for requests such as openFile from the
+     *     WearableSensingService.
      * @param callback The callback for service status
      */
-    public void provideDataStream(ParcelFileDescriptor parcelFileDescriptor,
+    public void provideDataStream(
+            ParcelFileDescriptor parcelFileDescriptor,
+            IWearableSensingCallback wearableSensingCallback,
             RemoteCallback callback) {
         if (DEBUG) {
             Slog.i(TAG, "Providing data stream.");
         }
-        var unused = post(
-                service -> {
-                    service.provideDataStream(parcelFileDescriptor, callback);
-                    try {
-                        // close the local fd after it has been sent to the WSS process
-                        parcelFileDescriptor.close();
-                    } catch (IOException ex) {
-                        Slog.w(TAG, "Unable to close the local parcelFileDescriptor.", ex);
-                    }
-                });
+        var unused =
+                post(
+                        service -> {
+                            service.provideDataStream(
+                                    parcelFileDescriptor, wearableSensingCallback, callback);
+                            try {
+                                // close the local fd after it has been sent to the WSS process
+                                parcelFileDescriptor.close();
+                            } catch (IOException ex) {
+                                Slog.w(TAG, "Unable to close the local parcelFileDescriptor.", ex);
+                            }
+                        });
     }
 
     /**
@@ -308,12 +328,16 @@
 
     private static class SecureWearableConnectionContext {
         final ParcelFileDescriptor mSecureConnection;
+        final IWearableSensingCallback mWearableSensingCallback;
         final RemoteCallback mStatusCallback;
 
         SecureWearableConnectionContext(
-                ParcelFileDescriptor secureWearableConnection, RemoteCallback statusCallback) {
-            this.mSecureConnection = secureWearableConnection;
-            this.mStatusCallback = statusCallback;
+                ParcelFileDescriptor secureWearableConnection,
+                IWearableSensingCallback wearableSensingCallback,
+                RemoteCallback statusCallback) {
+            mSecureConnection = secureWearableConnection;
+            mWearableSensingCallback = wearableSensingCallback;
+            mStatusCallback = statusCallback;
         }
     }
 }
diff --git a/services/core/java/com/android/server/wearable/WearableSensingManagerPerUserService.java b/services/core/java/com/android/server/wearable/WearableSensingManagerPerUserService.java
index 34b9fe96..c6b401b 100644
--- a/services/core/java/com/android/server/wearable/WearableSensingManagerPerUserService.java
+++ b/services/core/java/com/android/server/wearable/WearableSensingManagerPerUserService.java
@@ -17,6 +17,9 @@
 package com.android.server.wearable;
 
 import static android.service.wearable.WearableSensingService.HOTWORD_AUDIO_STREAM_BUNDLE_KEY;
+import static android.system.OsConstants.F_GETFL;
+import static android.system.OsConstants.O_ACCMODE;
+import static android.system.OsConstants.O_RDONLY;
 
 import android.Manifest;
 import android.annotation.NonNull;
@@ -25,10 +28,12 @@
 import android.app.AppGlobals;
 import android.app.ambientcontext.AmbientContextEvent;
 import android.app.wearable.Flags;
+import android.app.wearable.IWearableSensingCallback;
 import android.app.wearable.WearableSensingManager;
 import android.companion.CompanionDeviceManager;
 import android.content.ComponentName;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
 import android.content.pm.ServiceInfo;
 import android.os.Binder;
 import android.os.Bundle;
@@ -40,12 +45,15 @@
 import android.service.voice.HotwordAudioStream;
 import android.service.voice.VoiceInteractionManagerInternal;
 import android.service.voice.VoiceInteractionManagerInternal.WearableHotwordDetectionCallback;
+import android.system.ErrnoException;
+import android.system.Os;
 import android.system.OsConstants;
 import android.util.IndentingPrintWriter;
 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.LocalServices;
 import com.android.server.infra.AbstractPerUserSystemService;
 
@@ -61,12 +69,17 @@
                 WearableSensingManagerService> {
     private static final String TAG = WearableSensingManagerPerUserService.class.getSimpleName();
 
+    private final PackageManagerInternal mPackageManagerInternal;
+
     @Nullable
     @VisibleForTesting
     RemoteWearableSensingService mRemoteService;
 
     @Nullable private VoiceInteractionManagerInternal mVoiceInteractionManagerInternal;
+
+    @GuardedBy("mLock")
     private ComponentName mComponentName;
+
     private final Object mSecureChannelLock = new Object();
 
     @GuardedBy("mSecureChannelLock")
@@ -75,6 +88,7 @@
     WearableSensingManagerPerUserService(
             @NonNull WearableSensingManagerService master, Object lock, @UserIdInt int userId) {
         super(master, lock, userId);
+        mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
     }
 
     public static void notifyStatusCallback(RemoteCallback statusCallback, int statusCode) {
@@ -190,14 +204,19 @@
      * service.
      */
     public void onProvideConnection(
-            ParcelFileDescriptor wearableConnection, RemoteCallback callback) {
+            ParcelFileDescriptor wearableConnection,
+            IWearableSensingCallback wearableSensingCallback,
+            RemoteCallback statusCallback) {
         Slog.i(TAG, "onProvideConnection in per user service.");
+        final IWearableSensingCallback wrappedWearableSensingCallback;
         synchronized (mLock) {
             if (!setUpServiceIfNeeded()) {
                 Slog.w(TAG, "Detection service is not available at this moment.");
-                notifyStatusCallback(callback, WearableSensingManager.STATUS_SERVICE_UNAVAILABLE);
+                notifyStatusCallback(
+                        statusCallback, WearableSensingManager.STATUS_SERVICE_UNAVAILABLE);
                 return;
             }
+            wrappedWearableSensingCallback = wrapWearableSensingCallback(wearableSensingCallback);
         }
         synchronized (mSecureChannelLock) {
             if (mSecureChannel != null) {
@@ -218,7 +237,9 @@
                                         synchronized (mLock) {
                                             ensureRemoteServiceInitiated();
                                             mRemoteService.provideSecureConnection(
-                                                    secureTransport, callback);
+                                                    secureTransport,
+                                                    wrappedWearableSensingCallback,
+                                                    statusCallback);
                                         }
                                     }
 
@@ -237,7 +258,7 @@
                                         }
                                         if (Flags.enableProvideWearableConnectionApi()) {
                                             notifyStatusCallback(
-                                                    callback,
+                                                    statusCallback,
                                                     WearableSensingManager.STATUS_CHANNEL_ERROR);
                                         }
                                     }
@@ -246,7 +267,8 @@
             } catch (IOException ex) {
                 Slog.e(TAG, "Unable to create the secure channel.", ex);
                 if (Flags.enableProvideWearableConnectionApi()) {
-                    notifyStatusCallback(callback, WearableSensingManager.STATUS_CHANNEL_ERROR);
+                    notifyStatusCallback(
+                            statusCallback, WearableSensingManager.STATUS_CHANNEL_ERROR);
                 }
             }
         }
@@ -257,17 +279,25 @@
      */
     public void onProvideDataStream(
             ParcelFileDescriptor parcelFileDescriptor,
-            RemoteCallback callback) {
-        Slog.i(TAG, "onProvideDataStream in per user service.");
+            @Nullable IWearableSensingCallback wearableSensingCallback,
+            RemoteCallback statusCallback) {
+        Slog.i(
+                TAG,
+                "onProvideDataStream in per user service. Is data stream read-only? "
+                        + isReadOnly(parcelFileDescriptor));
         synchronized (mLock) {
             if (!setUpServiceIfNeeded()) {
                 Slog.w(TAG, "Detection service is not available at this moment.");
-                notifyStatusCallback(callback, WearableSensingManager.STATUS_SERVICE_UNAVAILABLE);
+                notifyStatusCallback(
+                        statusCallback, WearableSensingManager.STATUS_SERVICE_UNAVAILABLE);
                 return;
             }
             Slog.i(TAG, "calling over to remote servvice.");
             ensureRemoteServiceInitiated();
-            mRemoteService.provideDataStream(parcelFileDescriptor, callback);
+            mRemoteService.provideDataStream(
+                    parcelFileDescriptor,
+                    wrapWearableSensingCallback(wearableSensingCallback),
+                    statusCallback);
         }
     }
 
@@ -456,4 +486,76 @@
             }
         };
     }
+
+    @GuardedBy("mLock")
+    private @Nullable IWearableSensingCallback wrapWearableSensingCallback(
+            IWearableSensingCallback callbackFromAppProcess) {
+        if (callbackFromAppProcess == null) {
+            return null;
+        }
+        if (mComponentName == null) {
+            Slog.w(TAG, "Cannot create WearableSensingCallback because mComponentName is null.");
+            return null;
+        }
+        if (Binder.getCallingUid()
+                != mPackageManagerInternal.getPackageUid(
+                        mComponentName.getPackageName(), /* flags= */ 0, mUserId)) {
+            Slog.d(
+                    TAG,
+                    "Caller does not belong to the package that provides the WearableSensingService"
+                            + " implementation. Do not forward WearableSensingCallback to"
+                            + " WearableSensingService.");
+            return null;
+        }
+        return new IWearableSensingCallback.Stub() {
+            @Override
+            public void openFile(
+                    String filename,
+                    AndroidFuture<ParcelFileDescriptor> futureFromWearableSensingService)
+                    throws RemoteException {
+                AndroidFuture<ParcelFileDescriptor> futureFromSystemServer =
+                        new AndroidFuture<ParcelFileDescriptor>()
+                                .whenComplete(
+                                        (pfdFromApp, throwable) -> {
+                                            if (throwable != null) {
+                                                Slog.e(
+                                                        TAG,
+                                                        "Error when reading file " + filename,
+                                                        throwable);
+                                                futureFromWearableSensingService.complete(null);
+                                                return;
+                                            }
+                                            if (isReadOnly(pfdFromApp)) {
+                                                futureFromWearableSensingService.complete(
+                                                        pfdFromApp);
+                                            } else {
+                                                Slog.w(
+                                                        TAG,
+                                                        "Received writable ParcelFileDescriptor"
+                                                            + " from app process. To prevent"
+                                                            + " arbitrary data egress, sending null"
+                                                            + " to WearableSensingService"
+                                                            + " instead.");
+                                                futureFromWearableSensingService.complete(null);
+                                            }
+                                        });
+                callbackFromAppProcess.openFile(filename, futureFromSystemServer);
+            }
+        };
+    }
+
+    private static boolean isReadOnly(ParcelFileDescriptor parcelFileDescriptor) {
+        try {
+            int readMode =
+                    Os.fcntlInt(parcelFileDescriptor.getFileDescriptor(), F_GETFL, 0) & O_ACCMODE;
+            return readMode == O_RDONLY;
+        } catch (ErrnoException ex) {
+            Slog.w(
+                    TAG,
+                    "Error encountered when trying to determine if the parcelFileDescriptor is"
+                        + " read-only. Treating it as not read-only",
+                    ex);
+        }
+        return false;
+    }
 }
diff --git a/services/core/java/com/android/server/wearable/WearableSensingManagerService.java b/services/core/java/com/android/server/wearable/WearableSensingManagerService.java
index 8742ab1..110100a 100644
--- a/services/core/java/com/android/server/wearable/WearableSensingManagerService.java
+++ b/services/core/java/com/android/server/wearable/WearableSensingManagerService.java
@@ -20,11 +20,13 @@
 
 import android.Manifest;
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.annotation.UserIdInt;
 import android.app.ActivityOptions;
 import android.app.BroadcastOptions;
 import android.app.PendingIntent;
 import android.app.ambientcontext.AmbientContextEvent;
+import android.app.wearable.IWearableSensingCallback;
 import android.app.wearable.IWearableSensingManager;
 import android.app.wearable.WearableSensingDataRequest;
 import android.app.wearable.WearableSensingManager;
@@ -213,21 +215,37 @@
         return null;
     }
 
+    /**
+     * Provides a data stream to the WearableSensingService.
+     *
+     * <p>This method is only called from adb command via {@link WearableSensingShellCommand}.
+     */
     @VisibleForTesting
-    void provideDataStream(@UserIdInt int userId, ParcelFileDescriptor parcelFileDescriptor,
+    void provideDataStream(
+            @UserIdInt int userId,
+            ParcelFileDescriptor parcelFileDescriptor,
             RemoteCallback callback) {
         synchronized (mLock) {
             final WearableSensingManagerPerUserService mService = getServiceForUserLocked(userId);
             if (mService != null) {
-                mService.onProvideDataStream(parcelFileDescriptor, callback);
+                mService.onProvideDataStream(
+                        parcelFileDescriptor, /* wearableSensingCallback= */ null, callback);
             } else {
                 Slog.w(TAG, "Service not available.");
             }
         }
     }
 
+    /**
+     * Provides data to the WearableSensingService.
+     *
+     * <p>This method is only called from adb command via {@link WearableSensingShellCommand}.
+     */
     @VisibleForTesting
-    void provideData(@UserIdInt int userId, PersistableBundle data, SharedMemory sharedMemory,
+    void provideData(
+            @UserIdInt int userId,
+            PersistableBundle data,
+            SharedMemory sharedMemory,
             RemoteCallback callback) {
         synchronized (mLock) {
             final WearableSensingManagerPerUserService mService = getServiceForUserLocked(userId);
@@ -400,40 +418,48 @@
 
         @Override
         public void provideConnection(
-                ParcelFileDescriptor wearableConnection, RemoteCallback callback) {
+                ParcelFileDescriptor wearableConnection,
+                IWearableSensingCallback wearableSensingCallback,
+                RemoteCallback statusCallback) {
             Slog.i(TAG, "WearableSensingManagerInternal provideConnection.");
             Objects.requireNonNull(wearableConnection);
-            Objects.requireNonNull(callback);
+            Objects.requireNonNull(statusCallback);
             mContext.enforceCallingOrSelfPermission(
                     Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE, TAG);
             if (!mIsServiceEnabled) {
                 Slog.w(TAG, "Service not available.");
                 WearableSensingManagerPerUserService.notifyStatusCallback(
-                        callback, WearableSensingManager.STATUS_SERVICE_UNAVAILABLE);
+                        statusCallback, WearableSensingManager.STATUS_SERVICE_UNAVAILABLE);
                 return;
             }
             callPerUserServiceIfExist(
-                    service -> service.onProvideConnection(wearableConnection, callback),
-                    callback);
+                    service ->
+                            service.onProvideConnection(
+                                    wearableConnection, wearableSensingCallback, statusCallback),
+                    statusCallback);
         }
 
         @Override
         public void provideDataStream(
-                ParcelFileDescriptor parcelFileDescriptor, RemoteCallback callback) {
+                ParcelFileDescriptor parcelFileDescriptor,
+                @Nullable IWearableSensingCallback wearableSensingCallback,
+                RemoteCallback statusCallback) {
             Slog.i(TAG, "WearableSensingManagerInternal provideDataStream.");
             Objects.requireNonNull(parcelFileDescriptor);
-            Objects.requireNonNull(callback);
+            Objects.requireNonNull(statusCallback);
             mContext.enforceCallingOrSelfPermission(
                     Manifest.permission.MANAGE_WEARABLE_SENSING_SERVICE, TAG);
             if (!mIsServiceEnabled) {
                 Slog.w(TAG, "Service not available.");
-                WearableSensingManagerPerUserService.notifyStatusCallback(callback,
-                        WearableSensingManager.STATUS_SERVICE_UNAVAILABLE);
+                WearableSensingManagerPerUserService.notifyStatusCallback(
+                        statusCallback, WearableSensingManager.STATUS_SERVICE_UNAVAILABLE);
                 return;
             }
             callPerUserServiceIfExist(
-                    service -> service.onProvideDataStream(parcelFileDescriptor, callback),
-                    callback);
+                    service ->
+                            service.onProvideDataStream(
+                                    parcelFileDescriptor, wearableSensingCallback, statusCallback),
+                    statusCallback);
         }
 
         @Override
diff --git a/services/core/java/com/android/server/webkit/SystemImpl.java b/services/core/java/com/android/server/webkit/SystemImpl.java
index c6e8eb8..5e34596 100644
--- a/services/core/java/com/android/server/webkit/SystemImpl.java
+++ b/services/core/java/com/android/server/webkit/SystemImpl.java
@@ -310,8 +310,10 @@
 
         ArrayList<String> apksToPin = new ArrayList<>();
         boolean pinSharedFirst = appInfo.metaData.getBoolean("PIN_SHARED_LIBS_FIRST", true);
-        for (String sharedLib : appInfo.sharedLibraryFiles) {
-            apksToPin.add(sharedLib);
+        if (appInfo.sharedLibraryFiles != null) {
+            for (String sharedLib : appInfo.sharedLibraryFiles) {
+                apksToPin.add(sharedLib);
+            }
         }
         apksToPin.add(appInfo.sourceDir);
         if (!pinSharedFirst) {
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index 4189988..2b43326 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -24,6 +24,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
 import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY;
+import static android.view.WindowManager.TRANSIT_FLAG_IS_RECENTS;
 
 import static com.android.internal.util.DumpUtils.dumpSparseArray;
 import static com.android.internal.util.DumpUtils.dumpSparseArrayValues;
@@ -93,6 +94,8 @@
 import android.view.ViewConfiguration;
 import android.view.WindowInfo;
 import android.view.WindowManager;
+import android.view.WindowManager.TransitionFlags;
+import android.view.WindowManager.TransitionType;
 import android.view.WindowManagerPolicyConstants;
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.Interpolator;
@@ -357,14 +360,15 @@
         // Not relevant for the window observer.
     }
 
-    void onWMTransition(int displayId, @WindowManager.TransitionType int type) {
+    void onWMTransition(int displayId, @TransitionType int type, @TransitionFlags int flags) {
         if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
-            mAccessibilityTracing.logTrace(TAG + ".onAppWindowTransition",
-                    FLAGS_MAGNIFICATION_CALLBACK, "displayId=" + displayId + "; type=" + type);
+            mAccessibilityTracing.logTrace(TAG + ".onWMTransition",
+                    FLAGS_MAGNIFICATION_CALLBACK,
+                    "displayId=" + displayId + "; type=" + type + "; flags=" + flags);
         }
         final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId);
         if (displayMagnifier != null) {
-            displayMagnifier.onWMTransition(displayId, type);
+            displayMagnifier.onWMTransition(displayId, type, flags);
         }
         // Not relevant for the window observer.
     }
@@ -463,7 +467,7 @@
     }
 
     void drawMagnifiedRegionBorderIfNeeded(int displayId) {
-        if (Flags.magnificationAlwaysDrawFullscreenBorder()) {
+        if (Flags.alwaysDrawMagnificationFullscreenBorder()) {
             return;
         }
 
@@ -574,6 +578,11 @@
     void onFocusChanged(InputTarget lastTarget, InputTarget newTarget) {
         if (lastTarget != null) {
             mFocusedWindow.remove(lastTarget.getDisplayId());
+            final DisplayMagnifier displayMagnifier =
+                    mDisplayMagnifiers.get(lastTarget.getDisplayId());
+            if (displayMagnifier != null) {
+                displayMagnifier.onFocusLost(lastTarget);
+            }
         }
         if (newTarget != null) {
             int displayId = newTarget.getDisplayId();
@@ -625,6 +634,7 @@
         private final AccessibilityControllerInternalImpl mAccessibilityTracing;
 
         private final MagnificationCallbacks mCallbacks;
+        private final UserContextChangedNotifier mUserContextChangedNotifier;
 
         private final long mLongAnimationDuration;
 
@@ -653,7 +663,8 @@
             mDisplayContent = displayContent;
             mDisplay = display;
             mHandler = new MyHandler(mService.mH.getLooper());
-            mMagnifiedViewport = Flags.magnificationAlwaysDrawFullscreenBorder()
+            mUserContextChangedNotifier = new UserContextChangedNotifier(mHandler);
+            mMagnifiedViewport = Flags.alwaysDrawMagnificationFullscreenBorder()
                     ? null : new MagnifiedViewport();
             mAccessibilityTracing =
                     AccessibilityController.getAccessibilityControllerInternal(mService);
@@ -697,7 +708,7 @@
                 mMagnificationSpec.clear();
             }
 
-            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
+            if (!Flags.alwaysDrawMagnificationFullscreenBorder()) {
                 mMagnifiedViewport.setShowMagnifiedBorderIfNeeded();
             }
         }
@@ -708,7 +719,7 @@
                         FLAGS_MAGNIFICATION_CALLBACK, "activated=" + activated);
             }
             mIsFullscreenMagnificationActivated = activated;
-            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
+            if (!Flags.alwaysDrawMagnificationFullscreenBorder()) {
                 mMagnifiedViewport.setMagnifiedRegionBorderShown(activated, true);
                 mMagnifiedViewport.showMagnificationBoundsIfNeeded();
             }
@@ -746,7 +757,7 @@
             }
 
             recomputeBounds();
-            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
+            if (!Flags.alwaysDrawMagnificationFullscreenBorder()) {
                 mMagnifiedViewport.onDisplaySizeChanged();
             }
             mHandler.sendEmptyMessage(MyHandler.MESSAGE_NOTIFY_DISPLAY_SIZE_CHANGED);
@@ -764,40 +775,43 @@
                         + " displayId: " + displayId);
             }
             final boolean isMagnifierActivated = isFullscreenMagnificationActivated();
-            if (isMagnifierActivated) {
-                switch (transition) {
-                    case WindowManager.TRANSIT_OLD_ACTIVITY_OPEN:
-                    case WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN:
-                    case WindowManager.TRANSIT_OLD_TASK_OPEN:
-                    case WindowManager.TRANSIT_OLD_TASK_TO_FRONT:
-                    case WindowManager.TRANSIT_OLD_WALLPAPER_OPEN:
-                    case WindowManager.TRANSIT_OLD_WALLPAPER_CLOSE:
-                    case WindowManager.TRANSIT_OLD_WALLPAPER_INTRA_OPEN: {
-                        mHandler.sendEmptyMessage(MyHandler.MESSAGE_NOTIFY_USER_CONTEXT_CHANGED);
-                    }
+            if (!isMagnifierActivated) {
+                return;
+            }
+            switch (transition) {
+                case WindowManager.TRANSIT_OLD_ACTIVITY_OPEN:
+                case WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN:
+                case WindowManager.TRANSIT_OLD_TASK_OPEN:
+                case WindowManager.TRANSIT_OLD_TASK_TO_FRONT:
+                case WindowManager.TRANSIT_OLD_WALLPAPER_OPEN:
+                case WindowManager.TRANSIT_OLD_WALLPAPER_CLOSE:
+                case WindowManager.TRANSIT_OLD_WALLPAPER_INTRA_OPEN: {
+                    mUserContextChangedNotifier.onAppWindowTransition(transition);
                 }
             }
         }
 
-        void onWMTransition(int displayId, @WindowManager.TransitionType int type) {
+        void onWMTransition(int displayId, @TransitionType int type, @TransitionFlags int flags) {
             if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
                 mAccessibilityTracing.logTrace(LOG_TAG + ".onWMTransition",
-                        FLAGS_MAGNIFICATION_CALLBACK, "displayId=" + displayId + "; type=" + type);
+                        FLAGS_MAGNIFICATION_CALLBACK,
+                        "displayId=" + displayId + "; type=" + type + "; flags=" + flags);
             }
             if (DEBUG_WINDOW_TRANSITIONS) {
                 Slog.i(LOG_TAG, "Window transition: " + WindowManager.transitTypeToString(type)
                         + " displayId: " + displayId);
             }
             final boolean isMagnifierActivated = isFullscreenMagnificationActivated();
-            if (isMagnifierActivated) {
-                // All opening/closing situations.
-                switch (type) {
-                    case WindowManager.TRANSIT_OPEN:
-                    case WindowManager.TRANSIT_TO_FRONT:
-                    case WindowManager.TRANSIT_CLOSE:
-                    case WindowManager.TRANSIT_TO_BACK:
-                        mHandler.sendEmptyMessage(MyHandler.MESSAGE_NOTIFY_USER_CONTEXT_CHANGED);
-                }
+            if (!isMagnifierActivated) {
+                return;
+            }
+            // All opening/closing situations.
+            switch (type) {
+                case WindowManager.TRANSIT_OPEN:
+                case WindowManager.TRANSIT_TO_FRONT:
+                case WindowManager.TRANSIT_CLOSE:
+                case WindowManager.TRANSIT_TO_BACK:
+                    mUserContextChangedNotifier.onWMTransition(type, flags);
             }
         }
 
@@ -813,13 +827,14 @@
                         + " displayId: " + windowState.getDisplayId());
             }
             final boolean isMagnifierActivated = isFullscreenMagnificationActivated();
+            if (!isMagnifierActivated || !windowState.shouldMagnify()) {
+                return;
+            }
+            mUserContextChangedNotifier.onWindowTransition(windowState, transition);
             final int type = windowState.mAttrs.type;
             switch (transition) {
                 case WindowManagerPolicy.TRANSIT_ENTER:
                 case WindowManagerPolicy.TRANSIT_SHOW: {
-                    if (!isMagnifierActivated || !windowState.shouldMagnify()) {
-                        break;
-                    }
                     switch (type) {
                         case WindowManager.LayoutParams.TYPE_APPLICATION:
                         case WindowManager.LayoutParams.TYPE_DRAWN_APPLICATION:
@@ -859,6 +874,14 @@
             }
         }
 
+        void onFocusLost(InputTarget target) {
+            final boolean isMagnifierActivated = isFullscreenMagnificationActivated();
+            if (!isMagnifierActivated) {
+                return;
+            }
+            mUserContextChangedNotifier.onFocusLost(target);
+        }
+
         void getMagnifiedFrameInContentCoords(Rect rect) {
             mMagnificationRegion.getBounds(rect);
             rect.offset((int) -mMagnificationSpec.offsetX, (int) -mMagnificationSpec.offsetY);
@@ -908,7 +931,7 @@
                 mAccessibilityTracing.logTrace(LOG_TAG + ".destroy", FLAGS_MAGNIFICATION_CALLBACK);
             }
 
-            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
+            if (!Flags.alwaysDrawMagnificationFullscreenBorder()) {
                 mMagnifiedViewport.destroyWindow();
             }
         }
@@ -919,7 +942,7 @@
                         FLAGS_MAGNIFICATION_CALLBACK);
             }
 
-            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
+            if (!Flags.alwaysDrawMagnificationFullscreenBorder()) {
                 mMagnifiedViewport.drawWindowIfNeeded();
             }
         }
@@ -961,16 +984,37 @@
                 populateTransformationMatrix(windowState, matrix);
                 Region touchableRegion = mTempRegion3;
                 windowState.getTouchableRegion(touchableRegion);
-                Rect touchableFrame = mTempRect1;
-                touchableRegion.getBounds(touchableFrame);
-                RectF windowFrame = mTempRectF;
-                windowFrame.set(touchableFrame);
-                windowFrame.offset(-windowState.getFrame().left,
-                        -windowState.getFrame().top);
-                matrix.mapRect(windowFrame);
                 Region windowBounds = mTempRegion2;
-                windowBounds.set((int) windowFrame.left, (int) windowFrame.top,
-                        (int) windowFrame.right, (int) windowFrame.bottom);
+                if (Flags.useWindowOriginalTouchableRegionWhenMagnificationRecomputeBounds()) {
+                    // For b/323366243, if using the bounds from touchableRegion.getBounds, in
+                    // non-magnifiable windowBounds computation, part of the non-touchableRegion
+                    // may be included into nonMagnifiedBounds. This will make users lose
+                    // the magnification control on mis-included areas.
+                    // Therefore, to prevent the above issue, we change to use the window exact
+                    // touchableRegion in magnificationRegion computation.
+                    // Like the original approach, the touchableRegion is in non-magnified display
+                    // space, so first we need to offset the region by the windowFrames bounds, then
+                    // apply the transform matrix to the region to get the exact region in magnified
+                    // display space.
+                    // TODO: For a long-term plan, since touchable regions provided by WindowState
+                    //  doesn't actually reflect the real touchable regions on display, we should
+                    //  delete the WindowState dependency and migrate to use the touchableRegion
+                    //  from WindowInfoListener data. (b/330653961)
+                    touchableRegion.translate(-windowState.getFrame().left,
+                            -windowState.getFrame().top);
+                    applyMatrixToRegion(matrix, touchableRegion);
+                    windowBounds.set(touchableRegion);
+                } else {
+                    Rect touchableFrame = mTempRect1;
+                    touchableRegion.getBounds(touchableFrame);
+                    RectF windowFrame = mTempRectF;
+                    windowFrame.set(touchableFrame);
+                    windowFrame.offset(-windowState.getFrame().left,
+                            -windowState.getFrame().top);
+                    matrix.mapRect(windowFrame);
+                    windowBounds.set((int) windowFrame.left, (int) windowFrame.top,
+                            (int) windowFrame.right, (int) windowFrame.bottom);
+                }
                 // Only update new regions
                 Region portionOfWindowAlreadyAccountedFor = mTempRegion3;
                 portionOfWindowAlreadyAccountedFor.set(mMagnificationRegion);
@@ -1018,14 +1062,14 @@
             }
             visibleWindows.clear();
 
-            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
+            if (!Flags.alwaysDrawMagnificationFullscreenBorder()) {
                 mMagnifiedViewport.intersectWithDrawBorderInset(screenWidth, screenHeight);
             }
 
             final boolean magnifiedChanged =
                     !mOldMagnificationRegion.equals(mMagnificationRegion);
             if (magnifiedChanged) {
-                if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
+                if (!Flags.alwaysDrawMagnificationFullscreenBorder()) {
                     mMagnifiedViewport.updateBorderDrawingStatus(screenWidth, screenHeight);
                 }
                 mOldMagnificationRegion.set(mMagnificationRegion);
@@ -1066,6 +1110,30 @@
                     || windowType == TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY;
         }
 
+        private void applyMatrixToRegion(Matrix matrix, Region region) {
+            // Since Matrix does not support mapRegion api, so we follow the Matrix#mapRect logic
+            // to apply the matrix to the given region.
+            // In Matrix#mapRect, the internal calculation is applying the transform matrix to
+            // rect's 4 corner points with the below calculation. (see SkMatrix::mapPoints)
+            //      |A B C| |x|                               Ax+By+C   Dx+Ey+F
+            //      |D E F| |y| = |Ax+By+C Dx+Ey+F Gx+Hy+I| = ------- , -------
+            //      |G H I| |1|                               Gx+Hy+I   Gx+Hy+I
+            // For magnification usage, the matrix is created from
+            // WindowState#getTransformationMatrix. We can simplify the matrix calculation to be
+            //      |scale   0   trans_x| |x|
+            //      |  0   scale trans_y| |y| = (scale*x + trans_x, scale*y + trans_y)
+            //      |  0     0      1   | |1|
+            // So, to follow the simplified matrix computation, we first scale the region with
+            // matrix.scale, then translate the region with matrix.trans_x and matrix.trans_y.
+            float[] transformArray = sTempFloats;
+            matrix.getValues(transformArray);
+            // For magnification transform matrix, the scale_x and scale_y are equal.
+            region.scale(transformArray[Matrix.MSCALE_X]);
+            region.translate(
+                    (int) transformArray[Matrix.MTRANS_X],
+                    (int) transformArray[Matrix.MTRANS_Y]);
+        }
+
         private void populateWindowsOnScreen(SparseArray<WindowState> outWindows) {
             mTempLayer = 0;
             mDisplayContent.forAllWindows((w) -> {
@@ -1084,7 +1152,7 @@
         }
 
         void dump(PrintWriter pw, String prefix) {
-            if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
+            if (!Flags.alwaysDrawMagnificationFullscreenBorder()) {
                 mMagnifiedViewport.dump(pw, prefix);
             }
         }
@@ -1190,7 +1258,7 @@
             }
 
             // TODO(291891390): Remove this class when we clean up the flag
-            //  magnificationAlwaysDrawFullscreenBorder
+            //  alwaysDrawMagnificationFullscreenBorder
             private final class ViewportWindow implements Runnable {
                 private static final String SURFACE_TITLE = "Magnification Overlay";
 
@@ -1495,7 +1563,7 @@
             public static final int MESSAGE_NOTIFY_DISPLAY_SIZE_CHANGED = 4;
 
             // TODO(291891390): Remove this field when we clean up the flag
-            //  magnificationAlwaysDrawFullscreenBorder
+            //  alwaysDrawMagnificationFullscreenBorder
             public static final int MESSAGE_SHOW_MAGNIFIED_REGION_BOUNDS_IF_NEEDED = 5;
             public static final int MESSAGE_NOTIFY_IME_WINDOW_VISIBILITY_CHANGED = 6;
 
@@ -1524,7 +1592,7 @@
                     case MESSAGE_SHOW_MAGNIFIED_REGION_BOUNDS_IF_NEEDED : {
                         synchronized (mService.mGlobalLock) {
                             if (isFullscreenMagnificationActivated()) {
-                                if (!Flags.magnificationAlwaysDrawFullscreenBorder()) {
+                                if (!Flags.alwaysDrawMagnificationFullscreenBorder()) {
                                     mMagnifiedViewport.setMagnifiedRegionBorderShown(true, true);
                                 }
                                 mService.scheduleAnimationLocked();
@@ -1539,6 +1607,65 @@
                 }
             }
         }
+
+        private class UserContextChangedNotifier {
+
+            private final Handler mHandler;
+
+            private boolean mHasDelayedNotificationForRecentsToFrontTransition;
+
+            UserContextChangedNotifier(Handler handler) {
+                mHandler = handler;
+            }
+
+            void onAppWindowTransition(int transition) {
+                sendUserContextChangedNotification();
+            }
+
+            // For b/324949652, if the onWMTransition callback is triggered when the finger down
+            // event on navigation bar to bring the recents window to front, we'll delay the
+            // notifying of the context changed, then send it if there is a following onFocusChanged
+            // callback triggered. Before the onFocusChanged, if there are some other transitions
+            // causing the notifying, or the recents/home window is removed, then we won't need the
+            // delayed notification anymore.
+            void onWMTransition(@TransitionType int type, @TransitionFlags int flags) {
+                if (Flags.delayNotificationToMagnificationWhenRecentsWindowToFrontTransition()
+                        && type == WindowManager.TRANSIT_TO_FRONT
+                        && (flags & TRANSIT_FLAG_IS_RECENTS) != 0) {
+                    // Delay the recents to front transition notification then send after if needed.
+                    mHasDelayedNotificationForRecentsToFrontTransition = true;
+                } else {
+                    sendUserContextChangedNotification();
+                }
+            }
+
+            void onWindowTransition(WindowState windowState, int transition) {
+                // If there is a delayed notification for recents to front transition but the
+                // home/recents window has been removed from screen, the delayed notification is not
+                // needed anymore.
+                if (transition == WindowManagerPolicy.TRANSIT_EXIT
+                        && windowState.isActivityTypeHomeOrRecents()
+                        && mHasDelayedNotificationForRecentsToFrontTransition) {
+                    mHasDelayedNotificationForRecentsToFrontTransition = false;
+                }
+            }
+
+            void onFocusLost(InputTarget target) {
+                // If there is a delayed notification for recents to front transition and
+                // onFocusLost is triggered, we assume that the users leave current window to
+                // the home/recents window, thus we'll need to send the delayed notification.
+                if (mHasDelayedNotificationForRecentsToFrontTransition) {
+                    sendUserContextChangedNotification();
+                }
+            }
+
+            private void sendUserContextChangedNotification() {
+                // Since the context changed will be notified, the delayed notification is
+                // not needed anymore.
+                mHasDelayedNotificationForRecentsToFrontTransition = false;
+                mHandler.sendEmptyMessage(MyHandler.MESSAGE_NOTIFY_USER_CONTEXT_CHANGED);
+            }
+        }
     }
 
     static boolean isUntouchableNavigationBar(WindowState windowState,
@@ -1678,7 +1805,7 @@
                 mA11yWindowsPopulator.populateVisibleWindowsOnScreenLocked(
                         mDisplayId, visibleWindows);
 
-                if (!com.android.server.accessibility.Flags.computeWindowChangesOnA11y()) {
+                if (!com.android.server.accessibility.Flags.computeWindowChangesOnA11yV2()) {
                     windows = buildWindowInfoListLocked(visibleWindows, screenSize);
                 }
 
@@ -1687,7 +1814,7 @@
                 topFocusedWindowToken = topFocusedWindowState.mClient.asBinder();
             }
 
-            if (com.android.server.accessibility.Flags.computeWindowChangesOnA11y()) {
+            if (com.android.server.accessibility.Flags.computeWindowChangesOnA11yV2()) {
                 mCallback.onAccessibilityWindowsChanged(forceSend, topFocusedDisplayId,
                         topFocusedWindowToken, screenSize, visibleWindows);
             } else {
@@ -1702,7 +1829,7 @@
             mInitialized = true;
         }
 
-        // Here are old code paths, called when computeWindowChangesOnA11y flag is disabled.
+        // Here are old code paths, called when computeWindowChangesOnA11yV2 flag is disabled.
         // LINT.IfChange
 
         /**
diff --git a/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java b/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java
index ac3251c..f6afc52 100644
--- a/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java
+++ b/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java
@@ -722,7 +722,7 @@
             }
 
             // Compute system bar insets frame if needed.
-            if (com.android.server.accessibility.Flags.computeWindowChangesOnA11y()
+            if (com.android.server.accessibility.Flags.computeWindowChangesOnA11yV2()
                     && windowState != null && instance.isUntouchableNavigationBar()) {
                 final InsetsSourceProvider provider =
                         windowState.getControllableInsetProvider();
diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java
index 981c4c0..fe4522a 100644
--- a/services/core/java/com/android/server/wm/ActivityClientController.java
+++ b/services/core/java/com/android/server/wm/ActivityClientController.java
@@ -1254,14 +1254,16 @@
     private static void executeMultiWindowFullscreenRequest(int fullscreenRequest, Task requester) {
         final int targetWindowingMode;
         if (fullscreenRequest == FULLSCREEN_MODE_REQUEST_ENTER) {
-            requester.mMultiWindowRestoreWindowingMode =
-                    requester.getRequestedOverrideWindowingMode();
+            final int restoreWindowingMode = requester.getRequestedOverrideWindowingMode();
             targetWindowingMode = WINDOWING_MODE_FULLSCREEN;
+            requester.setWindowingMode(targetWindowingMode);
+            // The restore windowing mode must be set after the windowing mode is set since
+            // Task#setWindowingMode resets the restore windowing mode to WINDOWING_MODE_INVALID.
+            requester.mMultiWindowRestoreWindowingMode = restoreWindowingMode;
         } else {
             targetWindowingMode = requester.mMultiWindowRestoreWindowingMode;
-            requester.mMultiWindowRestoreWindowingMode = INVALID_WINDOWING_MODE;
+            requester.setWindowingMode(targetWindowingMode);
         }
-        requester.setWindowingMode(targetWindowingMode);
         if (targetWindowingMode == WINDOWING_MODE_FULLSCREEN) {
             requester.setBounds(null);
         }
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
index 59a56de..19f3449 100644
--- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
@@ -149,6 +149,10 @@
     private static final int WINDOW_STATE_MULTI_WINDOW = 4;
     private static final int WINDOW_STATE_INVALID = -1;
 
+    // These should match AppStartOccurred.MultiWindowLaunchType in the atoms.proto
+    private static final int MULTI_WINDOW_LAUNCH_TYPE_UNSPECIFIED = 0;
+    private static final int MULTI_WINDOW_LAUNCH_TYPE_APP_PAIR = 1;
+
     /**
      * If a launching activity isn't visible within this duration when the device is sleeping, e.g.
      * keyguard is locked, its transition info will be dropped.
@@ -329,6 +333,8 @@
         @Nullable Runnable mPendingFullyDrawn;
         /** Non-null if the trace is active. */
         @Nullable String mLaunchTraceName;
+        /** Whether this transition info is for an activity that is a part of multi-window. */
+        int mMultiWindowLaunchType = MULTI_WINDOW_LAUNCH_TYPE_UNSPECIFIED;
 
         /** @return Non-null if there will be a window drawn event for the launch. */
         @Nullable
@@ -477,6 +483,7 @@
         final int activityRecordIdHashCode;
         final boolean relaunched;
         final long timestampNs;
+        final int multiWindowLaunchType;
 
         private TransitionInfoSnapshot(TransitionInfo info) {
             this(info, info.mLastLaunchedActivity, INVALID_DELAY);
@@ -507,6 +514,7 @@
             this.windowsFullyDrawnDelayMs = windowsFullyDrawnDelayMs;
             relaunched = info.mRelaunched;
             timestampNs = info.mLaunchingState.mStartRealtimeNs;
+            multiWindowLaunchType = info.mMultiWindowLaunchType;
         }
 
         @WaitResult.LaunchState int getLaunchState() {
@@ -744,6 +752,10 @@
             return;
         }
 
+        // Look at all other transition infos and mark them as a split pair if they belong to
+        // adjacent tasks
+        updateSplitPairLaunches(newInfo);
+
         if (DEBUG_METRICS) Slog.i(TAG, "notifyActivityLaunched successful");
         // A new launch sequence has begun. Start tracking it.
         mTransitionInfoList.add(newInfo);
@@ -769,6 +781,36 @@
         }
     }
 
+    /**
+     * Updates all transition infos including the given {@param info} if they are a part of a
+     * split pair launch.
+     */
+    private void updateSplitPairLaunches(@NonNull TransitionInfo info) {
+        final Task launchedActivityTask = info.mLastLaunchedActivity.getTask();
+        final Task adjacentToLaunchedTask = launchedActivityTask.getAdjacentTask();
+        if (adjacentToLaunchedTask == null) {
+            // Not a part of a split pair
+            return;
+        }
+        for (int i = mTransitionInfoList.size() - 1; i >= 0; i--) {
+            final TransitionInfo otherInfo = mTransitionInfoList.get(i);
+            if (otherInfo == info) {
+                continue;
+            }
+            final Task otherTask = otherInfo.mLastLaunchedActivity.getTask();
+            // The adjacent task is the split root in which activities are started
+            if (otherTask.isDescendantOf(adjacentToLaunchedTask)) {
+                if (DEBUG_METRICS) {
+                    Slog.i(TAG, "Found adjacent tasks t1=" + launchedActivityTask.mTaskId
+                            + " t2=" + otherTask.mTaskId);
+                }
+                // These tasks are adjacent, so mark them as such
+                info.mMultiWindowLaunchType = MULTI_WINDOW_LAUNCH_TYPE_APP_PAIR;
+                otherInfo.mMultiWindowLaunchType = MULTI_WINDOW_LAUNCH_TYPE_APP_PAIR;
+            }
+        }
+    }
+
     private void scheduleCheckActivityToBeDrawnIfSleeping(@NonNull ActivityRecord r) {
         if (r.mDisplayContent.isSleeping()) {
             // It is unknown whether the activity can be drawn or not, e.g. it depends on the
@@ -1168,7 +1210,8 @@
                 packageState,
                 false, // is_xr_activity
                 firstLaunch,
-                0L /* TODO: stoppedDuration */);
+                0L /* TODO: stoppedDuration */,
+                info.multiWindowLaunchType);
         // Reset the stopped state to avoid reporting stopped again
         if (info.processRecord != null) {
             info.processRecord.setWasStoppedLogged(true);
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 17e6996..207d42b6 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -3198,10 +3198,18 @@
         if (!Flags.activityWindowInfoFlag() || !isAttached()) {
             return mTmpActivityWindowInfo;
         }
-        mTmpActivityWindowInfo.set(
-                isEmbeddedInHostContainer(),
-                getTask().getBounds(),
-                getTaskFragment().getBounds());
+        if (isFixedRotationTransforming()) {
+            // Fixed rotation only applied to fullscreen activity, thus using the activity bounds
+            // for Task/TaskFragment so that it is "pre-rotated" and in sync with the Configuration
+            // update.
+            final Rect bounds = getBounds();
+            mTmpActivityWindowInfo.set(false /* isEmbedded */, bounds, bounds);
+        } else {
+            mTmpActivityWindowInfo.set(
+                    isEmbeddedInHostContainer(),
+                    getTask().getBounds(),
+                    getTaskFragment().getBounds());
+        }
         return mTmpActivityWindowInfo;
     }
 
@@ -6501,9 +6509,7 @@
         }
         newIntents = null;
 
-        if (isActivityTypeHome()) {
-            mTaskSupervisor.updateHomeProcess(task.getBottomMostActivity().app);
-        }
+        mTaskSupervisor.updateHomeProcessIfNeeded(this);
 
         if (nowVisible) {
             mTaskSupervisor.stopWaitingForActivityVisible(this);
@@ -8507,8 +8513,9 @@
 
         applySizeOverrideIfNeeded(newParentConfiguration, parentWindowingMode, resolvedConfig);
 
-        final boolean isFixedOrientationLetterboxAllowed =
-                parentWindowingMode == WINDOWING_MODE_MULTI_WINDOW
+        // Bubble activities should always fill their parent and should not be letterboxed.
+        final boolean isFixedOrientationLetterboxAllowed = !getLaunchedFromBubble()
+                && (parentWindowingMode == WINDOWING_MODE_MULTI_WINDOW
                         || parentWindowingMode == WINDOWING_MODE_FULLSCREEN
                         // When starting to switch between PiP and fullscreen, the task is pinned
                         // and the activity is fullscreen. But only allow to apply letterbox if the
@@ -8516,7 +8523,7 @@
                         || (!mWaitForEnteringPinnedMode
                                 && parentWindowingMode == WINDOWING_MODE_PINNED
                                 && resolvedConfig.windowConfiguration.getWindowingMode()
-                                        == WINDOWING_MODE_FULLSCREEN);
+                                        == WINDOWING_MODE_FULLSCREEN));
         // TODO(b/181207944): Consider removing the if condition and always run
         // resolveFixedOrientationConfiguration() since this should be applied for all cases.
         if (isFixedOrientationLetterboxAllowed) {
@@ -8638,7 +8645,7 @@
 
         // Override starts here.
         final Rect stableInsets = mDisplayContent.getDisplayPolicy().getDecorInsetsInfo(
-                rotation, fullBounds.width(), fullBounds.height()).mLegacyConfigInsets;
+                rotation, fullBounds.width(), fullBounds.height()).mOverrideConfigInsets;
         // This should be the only place override the configuration for ActivityRecord. Override
         // the value if not calculated yet.
         Rect outAppBounds = inOutConfig.windowConfiguration.getAppBounds();
@@ -8674,7 +8681,7 @@
             mDisplayContent.getDisplay().getDisplayInfo(info);
             mDisplayContent.computeSizeRanges(info, rotated, info.logicalWidth,
                     info.logicalHeight, mDisplayContent.getDisplayMetrics().density,
-                    inOutConfig, true /* legacyConfig */);
+                    inOutConfig, true /* overrideConfig */);
         }
 
         // It's possible that screen size will be considered in different orientation with or
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 6af496f..354cab3 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -2160,19 +2160,6 @@
         return rect;
     }
 
-    @Override
-    public ActivityManager.TaskDescription getTaskDescription(int id) {
-        synchronized (mGlobalLock) {
-            enforceTaskPermission("getTaskDescription()");
-            final Task tr = mRootWindowContainer.anyTaskForId(id,
-                    MATCH_ATTACHED_TASK_OR_RECENT_TASKS);
-            if (tr != null) {
-                return tr.getTaskDescription();
-            }
-        }
-        return null;
-    }
-
     /**
      * Sets the locusId for a particular activity.
      *
@@ -3072,8 +3059,33 @@
 
     @Override
     public Bitmap getTaskDescriptionIcon(String filePath, int userId) {
-        userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
-                userId, "getTaskDescriptionIcon");
+        final int callingUid = Binder.getCallingUid();
+        // Verify that the caller can make the request for the given userId
+        userId = handleIncomingUser(Binder.getCallingPid(), callingUid, userId,
+                "getTaskDescriptionIcon");
+        synchronized (mGlobalLock) {
+            // Verify that the caller can make the request for given icon file path
+            final ActivityRecord matchingActivity = mRootWindowContainer.getActivity(
+                    r -> {
+                        if (r.taskDescription == null
+                                || r.taskDescription.getIconFilename() == null) {
+                            return false;
+                        }
+                        return r.taskDescription.getIconFilename().equals(filePath);
+                    });
+            if (matchingActivity == null || (matchingActivity.getUid() != callingUid)) {
+                // Caller UID doesn't match the requested Activity's UID, check if caller is
+                // privileged
+                try {
+                    enforceActivityTaskPermission("getTaskDescriptionIcon");
+                } catch (SecurityException e) {
+                    Slog.w(TAG, "getTaskDescriptionIcon(): request (callingUid=" + callingUid
+                            + ", filePath=" + filePath + ", user=" + userId + ") doesn't match any "
+                            + "activity");
+                    throw e;
+                }
+            }
+        }
 
         final File passedIconFile = new File(filePath);
         final File legitIconFile = new File(TaskPersister.getUserImagesDir(userId),
@@ -3303,6 +3315,13 @@
         return false;
     }
 
+    /**
+     * An instance method that's easier for mocking in tests.
+     */
+    void enforceActivityTaskPermission(String func) {
+        enforceTaskPermission(func);
+    }
+
     static void enforceTaskPermission(String func) {
         if (checkCallingPermission(MANAGE_ACTIVITY_TASKS) == PackageManager.PERMISSION_GRANTED) {
             return;
@@ -5060,6 +5079,9 @@
                 FrameworkStatsLog.write(FrameworkStatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED,
                         FrameworkStatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED__STATE__AWAKE);
                 startTimeTrackingFocusedActivityLocked();
+                if (mTopApp != null) {
+                    mTopApp.addToPendingTop();
+                }
                 mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
                 Slog.d(TAG, "Top Process State changed to PROCESS_STATE_TOP");
                 mTaskSupervisor.comeOutOfSleepIfNeededLocked();
diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
index 4ec2f57..430232c 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
@@ -902,10 +902,7 @@
                                 + " andResume=" + andResume);
                 EventLogTags.writeWmRestartActivity(r.mUserId, System.identityHashCode(r),
                         task.mTaskId, r.shortComponentName);
-                if (r.isActivityTypeHome()) {
-                    // Home process is the root process of the task.
-                    updateHomeProcess(task.getBottomMostActivity().app);
-                }
+                updateHomeProcessIfNeeded(r);
                 mService.getPackageManagerInternalLocked().notifyPackageUse(
                         r.intent.getComponent().getPackageName(), NOTIFY_PACKAGE_USE_ACTIVITY);
                 mService.getAppWarningsLocked().onStartActivity(r);
@@ -1050,6 +1047,16 @@
         return true;
     }
 
+    void updateHomeProcessIfNeeded(@NonNull ActivityRecord r) {
+        if (!r.isActivityTypeHome()) return;
+        // Make sure that we use the bottom most activity from the same package, because the home
+        // task can also embed third-party -1 activities.
+        final ActivityRecord bottom = r.getTask().getBottomMostActivityInSamePackage();
+        if (bottom != null) {
+            updateHomeProcess(bottom.app);
+        }
+    }
+
     void updateHomeProcess(WindowProcessController app) {
         if (app != null && mService.mHomeProcess != app) {
             scheduleStartHome("homeChanged");
@@ -2266,7 +2273,7 @@
      * activity releases the top state and reports back, message about acquiring top state will be
      * sent to the new top resumed activity.
      */
-    void updateTopResumedActivityIfNeeded(String reason) {
+    ActivityRecord updateTopResumedActivityIfNeeded(String reason) {
         final ActivityRecord prevTopActivity = mTopResumedActivity;
         final Task topRootTask = mRootWindowContainer.getTopDisplayFocusedRootTask();
         if (topRootTask == null || topRootTask.getTopResumedActivity() == prevTopActivity) {
@@ -2279,7 +2286,7 @@
                 // according to the current top focused activity.
                 mService.updateTopApp(null /* topResumedActivity */);
             }
-            return;
+            return mTopResumedActivity;
         }
 
         // Ask previous activity to release the top state.
@@ -2306,6 +2313,8 @@
         scheduleTopResumedActivityStateIfNeeded();
 
         mService.updateTopApp(mTopResumedActivity);
+
+        return mTopResumedActivity;
     }
 
     /** Schedule current top resumed activity state loss */
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 5184e49..c2b9128 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -96,7 +96,6 @@
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 import static com.android.server.wm.WindowManagerInternal.AppTransitionListener;
-import static com.android.server.wm.WindowManagerInternal.KeyguardExitAnimationStartListener;
 import static com.android.server.wm.WindowStateAnimator.ROOT_TASK_CLIP_AFTER_ANIM;
 import static com.android.server.wm.WindowStateAnimator.ROOT_TASK_CLIP_NONE;
 
@@ -105,7 +104,6 @@
 import android.annotation.Nullable;
 import android.content.ComponentName;
 import android.content.Context;
-import android.content.res.Configuration;
 import android.content.res.TypedArray;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
@@ -117,7 +115,6 @@
 import android.os.IRemoteCallback;
 import android.os.RemoteException;
 import android.os.SystemClock;
-import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.util.Pair;
 import android.util.Slog;
@@ -137,6 +134,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.policy.TransitionAnimation;
+import com.android.internal.protolog.common.LogLevel;
 import com.android.internal.protolog.common.ProtoLog;
 import com.android.internal.util.DumpUtils.Dump;
 import com.android.internal.util.function.pooled.PooledLambda;
@@ -244,7 +242,7 @@
         mHandler = new Handler(service.mH.getLooper());
         mDisplayContent = displayContent;
         mTransitionAnimation = new TransitionAnimation(
-                context, ProtoLog.isEnabled(WM_DEBUG_ANIM), TAG);
+                context, ProtoLog.isEnabled(WM_DEBUG_ANIM, LogLevel.DEBUG), TAG);
 
         final TypedArray windowStyle = mContext.getTheme().obtainStyledAttributes(
                 com.android.internal.R.styleable.Window);
diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java
index 48d78f5..f7b4a67 100644
--- a/services/core/java/com/android/server/wm/BackNavigationController.java
+++ b/services/core/java/com/android/server/wm/BackNavigationController.java
@@ -20,6 +20,7 @@
 import static android.view.RemoteAnimationTarget.MODE_CLOSING;
 import static android.view.RemoteAnimationTarget.MODE_OPENING;
 import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
+import static android.view.WindowManager.TRANSIT_CHANGE;
 import static android.view.WindowManager.TRANSIT_CLOSE;
 import static android.view.WindowManager.TRANSIT_OLD_NONE;
 import static android.view.WindowManager.TRANSIT_TO_BACK;
@@ -359,6 +360,7 @@
                         mAnimationHandler.prepareAnimation(
                                 backType,
                                 adapter,
+                                mNavigationMonitor,
                                 currentTask,
                                 prevTask,
                                 currentActivity,
@@ -422,7 +424,6 @@
         // Searching previous
         final ActivityRecord prevActivity = currentTask.getActivity((below) -> !below.finishing,
                 currentActivity, false /*includeBoundary*/, true /*traverseTopToBottom*/);
-
         final TaskFragment currTF = currentActivity.getTaskFragment();
         if (currTF != null && currTF.asTask() == null) {
             // The currentActivity is embedded, search for the candidate previous activities.
@@ -431,13 +432,34 @@
                 outPrevActivities.add(prevActivity);
                 return true;
             }
-            if (currTF.getAdjacentTaskFragment() != null) {
-                // The two TFs are adjacent (visually displayed side-by-side), search if any
-                // activity below the lowest one
-                // If companion, those two TF will be closed together.
-                if (currTF.getCompanionTaskFragment() != null) {
+            if (currTF.getAdjacentTaskFragment() == null) {
+                final TaskFragment nextTF = findNextTaskFragment(currentTask, currTF);
+                if (isSecondCompanionToFirst(currTF, nextTF)) {
+                    // TF is isStacked, search bottom activity from companion TF.
+                    //
+                    // Sample hierarchy: search for underPrevious if any.
+                    //     Current TF
+                    //     Companion TF (bottomActivityInCompanion)
+                    //     Bottom Activity not inside companion TF (underPrevious)
+                    // find bottom activity in Companion TF.
+                    final ActivityRecord bottomActivityInCompanion = nextTF.getActivity(
+                            (below) -> !below.finishing, false /* traverseTopToBottom */);
+                    final ActivityRecord underPrevious = currentTask.getActivity(
+                            (below) -> !below.finishing, bottomActivityInCompanion,
+                            false /*includeBoundary*/, true /*traverseTopToBottom*/);
+                    if (underPrevious != null) {
+                        outPrevActivities.add(underPrevious);
+                        addPreviousAdjacentActivityIfExist(underPrevious, outPrevActivities);
+                    }
+                    return true;
+                }
+            } else {
+                // If adjacent TF has companion to current TF, those two TF will be closed together.
+                final TaskFragment adjacentTF = currTF.getAdjacentTaskFragment();
+                if (isSecondCompanionToFirst(currTF, adjacentTF)) {
+                    // The two TFs are adjacent (visually displayed side-by-side), search if any
+                    // activity below the lowest one.
                     final WindowContainer commonParent = currTF.getParent();
-                    final TaskFragment adjacentTF = currTF.getAdjacentTaskFragment();
                     final TaskFragment lowerTF = commonParent.mChildren.indexOf(currTF)
                             < commonParent.mChildren.indexOf(adjacentTF)
                             ? currTF : adjacentTF;
@@ -451,25 +473,6 @@
                 // Unable to predict if no companion, it can only close current activity and make
                 // prev Activity full screened.
                 return false;
-            } else if (currTF.getCompanionTaskFragment() != null) {
-                // TF is isStacked, search bottom activity from companion TF.
-                //
-                // Sample hierarchy: search for underPrevious if any.
-                //     Current TF
-                //     Companion TF (bottomActivityInCompanion)
-                //     Bottom Activity not inside companion TF (underPrevious)
-                final TaskFragment companionTF = currTF.getCompanionTaskFragment();
-                // find bottom activity in Companion TF.
-                final ActivityRecord bottomActivityInCompanion = companionTF.getActivity(
-                        (below) -> !below.finishing, false /* traverseTopToBottom */);
-                final ActivityRecord underPrevious = currentTask.getActivity(
-                        (below) -> !below.finishing, bottomActivityInCompanion,
-                        false /*includeBoundary*/, true /*traverseTopToBottom*/);
-                if (underPrevious != null) {
-                    outPrevActivities.add(underPrevious);
-                    addPreviousAdjacentActivityIfExist(underPrevious, outPrevActivities);
-                }
-                return true;
             }
         }
 
@@ -484,6 +487,24 @@
         return true;
     }
 
+    private static TaskFragment findNextTaskFragment(@NonNull Task currentTask,
+            @NonNull TaskFragment topTF) {
+        final int topIndex = currentTask.mChildren.indexOf(topTF);
+        if (topIndex <= 0) {
+            return null;
+        }
+        final WindowContainer next = currentTask.mChildren.get(topIndex - 1);
+        return next.asTaskFragment();
+    }
+
+    /**
+     * Whether the second TF has set companion to first TF.
+     * When set, the second TF will be removed by organizer if the first TF is removed.
+     */
+    private static boolean isSecondCompanionToFirst(TaskFragment first, TaskFragment second) {
+        return second != null && second.getCompanionTaskFragment() == first;
+    }
+
     private static void addPreviousAdjacentActivityIfExist(@NonNull ActivityRecord prevActivity,
             @NonNull ArrayList<ActivityRecord> outPrevActivities) {
         final TaskFragment prevTF = prevActivity.getTaskFragment();
@@ -648,7 +669,8 @@
         mAnimationHandler.markWindowHasDrawn(openActivity);
     }
 
-    private class NavigationMonitor {
+    @VisibleForTesting
+    class NavigationMonitor {
         // The window which triggering the back navigation.
         private WindowState mNavigatingWindow;
         private RemoteCallback mObserver;
@@ -748,12 +770,20 @@
         if (!isMonitoringTransition() || targets.isEmpty()) {
             return;
         }
+        if (mAnimationHandler.hasTargetDetached()) {
+            mNavigationMonitor.cancelBackNavigating("targetDetached");
+            return;
+        }
         for (int i = targets.size() - 1; i >= 0; --i) {
             final WindowContainer wc = targets.get(i).mContainer;
             if (wc.asActivityRecord() == null && wc.asTask() == null
                     && wc.asTaskFragment() == null) {
                 continue;
             }
+            // Only care if visibility changed.
+            if (targets.get(i).getTransitMode(wc) == TRANSIT_CHANGE) {
+                continue;
+            }
             // WC can be visible due to setLaunchBehind
             if (wc.isVisibleRequested()) {
                 mTmpOpenApps.add(wc);
@@ -818,14 +848,14 @@
      * @param targets The final animation targets derived in transition.
      * @param finishedTransition The finished transition target.
     */
-    boolean onTransitionFinish(ArrayList<Transition.ChangeInfo> targets,
+    void onTransitionFinish(ArrayList<Transition.ChangeInfo> targets,
             @NonNull Transition finishedTransition) {
         if (finishedTransition == mWaitTransitionFinish) {
             clearBackAnimations();
         }
 
         if (!mBackAnimationInProgress || mPendingAnimationBuilder == null) {
-            return false;
+            return;
         }
         ProtoLog.d(WM_DEBUG_BACK_PREVIEW,
                 "Handling the deferred animation after transition finished");
@@ -853,7 +883,7 @@
                     + " open: " + Arrays.toString(mPendingAnimationBuilder.mOpenTargets)
                     + " close: " + mPendingAnimationBuilder.mCloseTarget);
             cancelPendingAnimation();
-            return false;
+            return;
         }
 
         // Ensure the final animation targets which hidden by transition could be visible.
@@ -862,9 +892,14 @@
             wc.prepareSurfaces();
         }
 
-        scheduleAnimation(mPendingAnimationBuilder);
-        mPendingAnimationBuilder = null;
-        return true;
+        // The pending builder could be cleared due to prepareSurfaces
+        // => updateNonSystemOverlayWindowsVisibilityIfNeeded
+        // => setForceHideNonSystemOverlayWindowIfNeeded
+        // => updateFocusedWindowLocked => onFocusWindowChanged.
+        if (mPendingAnimationBuilder != null) {
+            scheduleAnimation(mPendingAnimationBuilder);
+            mPendingAnimationBuilder = null;
+        }
     }
 
     private void cancelPendingAnimation() {
@@ -1122,6 +1157,21 @@
                     || containTarget(openApps, false /* open */));
         }
 
+        /**
+         * Check if any animation target is detached, possibly due to app crash.
+         */
+        boolean hasTargetDetached() {
+            if (!mComposed) {
+                return false;
+            }
+            for (int i = mOpenAnimAdaptor.mAdaptors.length - 1; i >= 0; --i) {
+                if (!mOpenAnimAdaptor.mAdaptors[i].mTarget.isAttached()) {
+                    return true;
+                }
+            }
+            return !mCloseAdaptor.mTarget.isAttached();
+        }
+
         @Override
         public String toString() {
             return "AnimationTargets{"
@@ -1454,28 +1504,31 @@
         ScheduleAnimationBuilder prepareAnimation(
                 int backType,
                 BackAnimationAdapter adapter,
+                NavigationMonitor monitor,
                 Task currentTask,
                 Task previousTask,
                 ActivityRecord currentActivity,
                 ArrayList<ActivityRecord> previousActivity,
                 WindowContainer removedWindowContainer) {
+            final ScheduleAnimationBuilder builder =
+                    new ScheduleAnimationBuilder(backType, adapter, monitor);
             switch (backType) {
                 case BackNavigationInfo.TYPE_RETURN_TO_HOME:
-                    return new ScheduleAnimationBuilder(backType, adapter)
+                    return builder
                             .setIsLaunchBehind(true)
                             .setComposeTarget(currentTask, previousTask);
                 case BackNavigationInfo.TYPE_CROSS_ACTIVITY:
                     ActivityRecord[] prevActs = new ActivityRecord[previousActivity.size()];
                     prevActs = previousActivity.toArray(prevActs);
-                    return new ScheduleAnimationBuilder(backType, adapter)
+                    return builder
                             .setComposeTarget(currentActivity, prevActs)
                             .setIsLaunchBehind(false);
                 case BackNavigationInfo.TYPE_CROSS_TASK:
-                    return new ScheduleAnimationBuilder(backType, adapter)
+                    return builder
                             .setComposeTarget(currentTask, previousTask)
                             .setIsLaunchBehind(false);
                 case BackNavigationInfo.TYPE_DIALOG_CLOSE:
-                    return new ScheduleAnimationBuilder(backType, adapter)
+                    return builder
                             .setComposeTarget(removedWindowContainer, currentActivity)
                             .setIsLaunchBehind(false);
             }
@@ -1485,13 +1538,16 @@
         class ScheduleAnimationBuilder {
             final int mType;
             final BackAnimationAdapter mBackAnimationAdapter;
+            final NavigationMonitor mNavigationMonitor;
             WindowContainer mCloseTarget;
             WindowContainer[] mOpenTargets;
             boolean mIsLaunchBehind;
 
-            ScheduleAnimationBuilder(int type, BackAnimationAdapter backAnimationAdapter) {
+            ScheduleAnimationBuilder(int type, BackAnimationAdapter adapter,
+                    NavigationMonitor monitor) {
                 mType = type;
-                mBackAnimationAdapter = backAnimationAdapter;
+                mBackAnimationAdapter = adapter;
+                mNavigationMonitor = monitor;
             }
 
             ScheduleAnimationBuilder setComposeTarget(@NonNull WindowContainer close,
@@ -1506,15 +1562,17 @@
                 return this;
             }
 
+            // WC must be Activity/TaskFragment/Task
             boolean containTarget(@NonNull WindowContainer wc) {
                 if (mOpenTargets != null) {
                     for (int i = mOpenTargets.length - 1; i >= 0; --i) {
-                        if (wc == mOpenTargets[i] || mOpenTargets[i].hasChild(wc)) {
+                        if (wc == mOpenTargets[i] || mOpenTargets[i].hasChild(wc)
+                                || wc.hasChild(mOpenTargets[i])) {
                             return true;
                         }
                     }
                 }
-                return wc == mCloseTarget || mCloseTarget.hasChild(wc);
+                return wc == mCloseTarget || mCloseTarget.hasChild(wc) || wc.hasChild(mCloseTarget);
             }
 
             /**
@@ -1572,8 +1630,13 @@
 
                 return () -> {
                     try {
-                        mBackAnimationAdapter.getRunner().onAnimationStart(
-                                targets, null, null, callback);
+                        if (hasTargetDetached() || !validateAnimationTargets(targets)) {
+                            mNavigationMonitor.cancelBackNavigating("cancelAnimation");
+                            mBackAnimationAdapter.getRunner().onAnimationCancelled();
+                        } else {
+                            mBackAnimationAdapter.getRunner().onAnimationStart(
+                                    targets, null, null, callback);
+                        }
                     } catch (RemoteException e) {
                         e.printStackTrace();
                     }
@@ -1603,6 +1666,21 @@
     }
 
     /**
+     * Validate animation targets.
+     */
+    private static boolean validateAnimationTargets(RemoteAnimationTarget[] apps) {
+        if (apps == null || apps.length == 0) {
+            return false;
+        }
+        for (int i = apps.length - 1; i >= 0; --i) {
+            if (!apps[i].leash.isValid()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
      * Finds next opening activity(ies) based on open targets, which could be:
      * 1. If the open window is Task, then the open activity can either be an activity, or
      * two activities inside two TaskFragments
@@ -1659,6 +1737,10 @@
     }
 
     private static void restoreLaunchBehind(@NonNull ActivityRecord activity) {
+        if (!activity.isAttached()) {
+            // The activity was detached from hierarchy.
+            return;
+        }
         activity.mDisplayContent.continueUpdateOrientationForDiffOrienLaunchingApp();
 
         // Restore the launch-behind state.
diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
index 2788342..0e446b8 100644
--- a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
+++ b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
@@ -38,9 +38,11 @@
 import static com.android.server.wm.ActivityTaskManagerService.APP_SWITCH_FG_ONLY;
 import static com.android.server.wm.ActivityTaskSupervisor.getApplicationLabel;
 import static com.android.server.wm.PendingRemoteAnimationRegistry.TIMEOUT_MS;
+import static com.android.window.flags.Flags.balDontBringExistingBackgroundTaskStackToFg;
 import static com.android.window.flags.Flags.balImproveRealCallerVisibilityCheck;
 import static com.android.window.flags.Flags.balRequireOptInByPendingIntentCreator;
 import static com.android.window.flags.Flags.balRequireOptInSameUid;
+import static com.android.window.flags.Flags.balRespectAppSwitchStateWhenCheckBoundByForegroundUid;
 import static com.android.window.flags.Flags.balShowToastsBlocked;
 
 import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -539,6 +541,16 @@
                 sb.append("; balAllowedByPiSender: ").append(mBalAllowedByPiSender);
                 sb.append("; resultIfPiSenderAllowsBal: ").append(mResultForRealCaller);
             }
+            // features
+            sb.append("; balImproveRealCallerVisibilityCheck: ")
+                    .append(balImproveRealCallerVisibilityCheck());
+            sb.append("; balRequireOptInByPendingIntentCreator: ")
+                    .append(balRequireOptInByPendingIntentCreator());
+            sb.append("; balRequireOptInSameUid: ").append(balRequireOptInSameUid());
+            sb.append("; balRespectAppSwitchStateWhenCheckBoundByForegroundUid: ")
+                    .append(balRespectAppSwitchStateWhenCheckBoundByForegroundUid());
+            sb.append("; balDontBringExistingBackgroundTaskStackToFg: ")
+                    .append(balDontBringExistingBackgroundTaskStackToFg());
             sb.append("]");
             return sb.toString();
         }
@@ -783,7 +795,7 @@
         if (balShowToastsBlocked()
                 && (state.mResultForCaller.allows() || state.mResultForRealCaller.allows())) {
             // only show a toast if either caller or real caller could launch if they opted in
-            showToast("BAL blocked. go/debug-bal");
+            showToast("BAL blocked. goo.gle/android-bal");
         }
         return statsLog(BalVerdict.BLOCK, state);
     }
@@ -853,8 +865,7 @@
         }
 
         // don't abort if the callingUid has START_ACTIVITIES_FROM_BACKGROUND permission
-        if (ActivityTaskManagerService.checkPermission(START_ACTIVITIES_FROM_BACKGROUND,
-                callingPid, callingUid) == PERMISSION_GRANTED) {
+        if (hasBalPermission(callingUid, callingPid)) {
             return new BalVerdict(BAL_ALLOW_PERMISSION,
                     /*background*/ true,
                     "START_ACTIVITIES_FROM_BACKGROUND permission granted");
@@ -919,9 +930,7 @@
     BalVerdict checkBackgroundActivityStartAllowedBySender(BalState state) {
 
         if (state.isPendingIntentBalAllowedByPermission()
-                && ActivityManager.checkComponentPermission(
-                android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND,
-                state.mRealCallingUid, NO_PROCESS_UID, true) == PackageManager.PERMISSION_GRANTED) {
+                && hasBalPermission(state.mRealCallingUid, state.mRealCallingPid)) {
             return new BalVerdict(BAL_ALLOW_PERMISSION,
                     /*background*/ false,
                     "realCallingUid has BAL permission.");
@@ -980,6 +989,11 @@
         return BalVerdict.BLOCK;
     }
 
+    @VisibleForTesting boolean hasBalPermission(int uid, int pid) {
+        return ActivityTaskManagerService.checkPermission(START_ACTIVITIES_FROM_BACKGROUND,
+                pid, uid) == PERMISSION_GRANTED;
+    }
+
     /**
      * Check if the app allows BAL.
      * <p>
diff --git a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
index a29cb60..ca5f26a 100644
--- a/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
+++ b/services/core/java/com/android/server/wm/DeferredDisplayUpdater.java
@@ -26,6 +26,10 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.graphics.Rect;
+import android.os.Message;
+import android.os.Trace;
+import android.util.Log;
+import android.util.Slog;
 import android.view.DisplayInfo;
 import android.window.DisplayAreaInfo;
 import android.window.TransitionRequestInfo;
@@ -35,6 +39,7 @@
 import com.android.internal.display.BrightnessSynchronizer;
 import com.android.internal.protolog.common.ProtoLog;
 import com.android.server.wm.utils.DisplayInfoOverrides.DisplayInfoFieldsUpdater;
+import com.android.window.flags.Flags;
 
 import java.util.Arrays;
 import java.util.Objects;
@@ -65,6 +70,12 @@
         WM_OVERRIDE_FIELDS.setFields(out, override);
     };
 
+    private static final String TAG = "DeferredDisplayUpdater";
+
+    private static final String TRACE_TAG_WAIT_FOR_TRANSITION =
+            "Screen unblock: wait for transition";
+    private static final int WAIT_FOR_TRANSITION_TIMEOUT = 1000;
+
     private final DisplayContent mDisplayContent;
 
     @NonNull
@@ -88,6 +99,18 @@
     @NonNull
     private final DisplayInfo mOutputDisplayInfo = new DisplayInfo();
 
+    /** Whether {@link #mScreenUnblocker} should wait for transition to be ready. */
+    private boolean mShouldWaitForTransitionWhenScreenOn;
+
+    /** The message to notify PhoneWindowManager#finishWindowsDrawn. */
+    @Nullable
+    private Message mScreenUnblocker;
+
+    private final Runnable mScreenUnblockTimeoutRunnable = () -> {
+        Slog.e(TAG, "Timeout waiting for the display switch transition to start");
+        continueScreenUnblocking();
+    };
+
     public DeferredDisplayUpdater(@NonNull DisplayContent displayContent) {
         mDisplayContent = displayContent;
         mNonOverrideDisplayInfo.copyFrom(mDisplayContent.getDisplayInfo());
@@ -248,6 +271,7 @@
                 getCurrentDisplayChange(fromRotation, startBounds);
         displayChange.setPhysicalDisplayChanged(true);
 
+        transition.addTransactionCompletedListener(this::continueScreenUnblocking);
         mDisplayContent.mTransitionController.requestStartTransition(transition,
                 /* startTask= */ null, /* remoteTransition= */ null, displayChange);
 
@@ -277,6 +301,58 @@
         return !Objects.equals(first.uniqueId, second.uniqueId);
     }
 
+    @Override
+    public void onDisplayContentDisplayPropertiesPostChanged(int previousRotation, int newRotation,
+            DisplayAreaInfo newDisplayAreaInfo) {
+        // Unblock immediately in case there is no transition. This is unlikely to happen.
+        if (mScreenUnblocker != null && !mDisplayContent.mTransitionController.inTransition()) {
+            mScreenUnblocker.sendToTarget();
+            mScreenUnblocker = null;
+        }
+    }
+
+    @Override
+    public void onDisplaySwitching(boolean switching) {
+        mShouldWaitForTransitionWhenScreenOn = switching;
+    }
+
+    @Override
+    public boolean waitForTransition(@NonNull Message screenUnblocker) {
+        if (!Flags.waitForTransitionOnDisplaySwitch()) return false;
+        if (!mShouldWaitForTransitionWhenScreenOn) {
+            return false;
+        }
+        mScreenUnblocker = screenUnblocker;
+        if (Trace.isTagEnabled(Trace.TRACE_TAG_WINDOW_MANAGER)) {
+            Trace.beginAsyncSection(TRACE_TAG_WAIT_FOR_TRANSITION, screenUnblocker.hashCode());
+        }
+
+        mDisplayContent.mWmService.mH.removeCallbacks(mScreenUnblockTimeoutRunnable);
+        mDisplayContent.mWmService.mH.postDelayed(mScreenUnblockTimeoutRunnable,
+                WAIT_FOR_TRANSITION_TIMEOUT);
+        return true;
+    }
+
+    /**
+     * Continues the screen unblocking flow, could be called either on a binder thread as
+     * a result of surface transaction completed listener or from {@link WindowManagerService#mH}
+     * handler in case of timeout
+     */
+    private void continueScreenUnblocking() {
+        synchronized (mDisplayContent.mWmService.mGlobalLock) {
+            mShouldWaitForTransitionWhenScreenOn = false;
+            mDisplayContent.mWmService.mH.removeCallbacks(mScreenUnblockTimeoutRunnable);
+            if (mScreenUnblocker == null) {
+                return;
+            }
+            mScreenUnblocker.sendToTarget();
+            if (Trace.isTagEnabled(Trace.TRACE_TAG_WINDOW_MANAGER)) {
+                Trace.endAsyncSection(TRACE_TAG_WAIT_FOR_TRANSITION, mScreenUnblocker.hashCode());
+            }
+            mScreenUnblocker = null;
+        }
+    }
+
     /**
      * Diff result: fields are the same
      */
diff --git a/services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java b/services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java
index 925a077..61f5679 100644
--- a/services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java
+++ b/services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java
@@ -19,13 +19,17 @@
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityOptions;
+import android.content.Context;
 import android.content.pm.ActivityInfo;
 import android.graphics.Rect;
 import android.os.SystemProperties;
 import android.util.Slog;
 
+import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.wm.LaunchParamsController.LaunchParamsModifier;
 import com.android.window.flags.Flags;
 /**
@@ -37,14 +41,24 @@
             TAG_WITH_CLASS_NAME ? "DesktopModeLaunchParamsModifier" : TAG_ATM;
     private static final boolean DEBUG = false;
 
-    private static final boolean DESKTOP_MODE_PROTO2_SUPPORTED =
-            SystemProperties.getBoolean("persist.wm.debug.desktop_mode_2", false);
     public static final float DESKTOP_MODE_INITIAL_BOUNDS_SCALE =
             SystemProperties
                     .getInt("persist.wm.debug.desktop_mode_initial_bounds_scale", 75) / 100f;
 
+    /**
+     * Flag to indicate whether to restrict desktop mode to supported devices.
+     */
+    private static final boolean ENFORCE_DEVICE_RESTRICTIONS = SystemProperties.getBoolean(
+            "persist.wm.debug.desktop_mode_enforce_device_restrictions", true);
+
     private StringBuilder mLogBuilder;
 
+    private final Context mContext;
+
+    DesktopModeLaunchParamsModifier(@NonNull Context context) {
+        mContext = context;
+    }
+
     @Override
     public int onCalculate(@Nullable Task task, @Nullable ActivityInfo.WindowLayout layout,
             @Nullable ActivityRecord activity, @Nullable ActivityRecord source,
@@ -65,7 +79,7 @@
             LaunchParamsController.LaunchParams currentParams,
             LaunchParamsController.LaunchParams outParams) {
 
-        if (!isDesktopModeEnabled()) {
+        if (!canEnterDesktopMode(mContext)) {
             appendLog("desktop mode is not enabled, continuing");
             return RESULT_CONTINUE;
         }
@@ -90,7 +104,7 @@
         // previous windowing mode to be restored even if the desktop mode state has changed.
         // Let task launches inherit the windowing mode from the source task if available, which
         // should have the desired windowing mode set by WM Shell. See b/286929122.
-        if (isDesktopModeEnabled() && source != null && source.getTask() != null) {
+        if (source != null && source.getTask() != null) {
             final Task sourceTask = source.getTask();
             outParams.mWindowingMode = sourceTask.getWindowingMode();
             appendLog("inherit-from-source=" + outParams.mWindowingMode);
@@ -147,4 +161,29 @@
     static boolean isDesktopModeEnabled() {
         return Flags.enableDesktopWindowingMode();
     }
+
+    /**
+     * Return {@code true} if desktop mode should be restricted to supported devices.
+     */
+    @VisibleForTesting
+    public boolean enforceDeviceRestrictions() {
+        return ENFORCE_DEVICE_RESTRICTIONS;
+    }
+
+    /**
+     * Return {@code true} if the current device supports desktop mode.
+     */
+    @VisibleForTesting
+    public boolean isDesktopModeSupported(@NonNull Context context) {
+        return context.getResources().getBoolean(R.bool.config_isDesktopModeSupported);
+    }
+
+    /**
+     * Return {@code true} if desktop mode can be entered on the current device.
+     */
+    boolean canEnterDesktopMode(@NonNull Context context) {
+        return isDesktopModeEnabled()
+                && (!enforceDeviceRestrictions() || isDesktopModeSupported(context));
+    }
+
 }
diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java
index efeb85f..d49a507 100644
--- a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java
@@ -40,6 +40,10 @@
 import android.os.Bundle;
 import android.text.TextUtils;
 
+import com.android.tools.r8.keepanno.annotations.KeepItemKind;
+import com.android.tools.r8.keepanno.annotations.KeepTarget;
+import com.android.tools.r8.keepanno.annotations.UsesReflection;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -184,6 +188,13 @@
         /**
          * Instantiates the device-specific {@link Provider}.
          */
+        @UsesReflection(
+                value = {
+                        @KeepTarget(
+                                kind = KeepItemKind.CLASS_AND_MEMBERS,
+                                instanceOfClassConstantExclusive = Provider.class,
+                                methodName = "<init>")
+                })
         static Provider fromResources(Resources res) {
             String name = res.getString(
                     com.android.internal.R.string.config_deviceSpecificDisplayAreaPolicyProvider);
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 46d4ce4..739f76e 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -470,7 +470,7 @@
     private final DisplayRotation mDisplayRotation;
     @Nullable final DisplayRotationCompatPolicy mDisplayRotationCompatPolicy;
     DisplayFrames mDisplayFrames;
-    private final DisplayUpdater mDisplayUpdater;
+    final DisplayUpdater mDisplayUpdater;
 
     private boolean mInTouchMode;
 
@@ -1007,8 +1007,6 @@
 
     private final Consumer<WindowState> mApplySurfaceChangesTransaction = w -> {
         final WindowSurfacePlacer surfacePlacer = mWmService.mWindowPlacerLocked;
-        final boolean obscuredChanged = w.mObscured !=
-                mTmpApplySurfaceChangesTransactionState.obscured;
         final RootWindowContainer root = mWmService.mRoot;
 
         if (w.mHasSurface) {
@@ -1107,12 +1105,6 @@
             }
         }
 
-        if (obscuredChanged && w.isVisible() && mWallpaperController.isWallpaperTarget(w)) {
-            // This is the wallpaper target and its obscured state changed... make sure the
-            // current wallpaper's visibility has been updated accordingly.
-            mWallpaperController.updateWallpaperTokens(mDisplayContent.isKeyguardLocked());
-        }
-
         w.handleWindowMovedIfNeeded();
 
         //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing");
@@ -2277,7 +2269,7 @@
         }
 
         computeSizeRanges(mDisplayInfo, rotated, dw, dh, mDisplayMetrics.density, outConfig,
-                false /* legacyConfig */);
+                false /* overrideConfig */);
 
         setDisplayInfoOverride();
 
@@ -2414,7 +2406,7 @@
         final DisplayCutout displayCutout = calculateDisplayCutoutForRotation(rotation);
         displayInfo.displayCutout = displayCutout.isEmpty() ? null : displayCutout;
         computeSizeRanges(displayInfo, rotated, dw, dh, mDisplayMetrics.density, outConfig,
-                false /* legacyConfig */);
+                false /* overrideConfig */);
         return displayInfo;
     }
 
@@ -2588,11 +2580,10 @@
      * @param dh Display Height in current rotation.
      * @param density Display density.
      * @param outConfig The output configuration to
-     * @param legacyConfig Whether we need to report the legacy result, which is excluding system
-     *                     decorations.
+     * @param overrideConfig Whether we need to report the override config result
      */
     void computeSizeRanges(DisplayInfo displayInfo, boolean rotated,
-            int dw, int dh, float density, Configuration outConfig, boolean legacyConfig) {
+            int dw, int dh, float density, Configuration outConfig, boolean overrideConfig) {
 
         // We need to determine the smallest width that will occur under normal
         // operation.  To this, start with the base screen size and compute the
@@ -2610,10 +2601,12 @@
         displayInfo.smallestNominalAppHeight = 1<<30;
         displayInfo.largestNominalAppWidth = 0;
         displayInfo.largestNominalAppHeight = 0;
-        adjustDisplaySizeRanges(displayInfo, Surface.ROTATION_0, unrotDw, unrotDh, legacyConfig);
-        adjustDisplaySizeRanges(displayInfo, Surface.ROTATION_90, unrotDh, unrotDw, legacyConfig);
-        adjustDisplaySizeRanges(displayInfo, Surface.ROTATION_180, unrotDw, unrotDh, legacyConfig);
-        adjustDisplaySizeRanges(displayInfo, Surface.ROTATION_270, unrotDh, unrotDw, legacyConfig);
+        adjustDisplaySizeRanges(displayInfo, Surface.ROTATION_0, unrotDw, unrotDh, overrideConfig);
+        adjustDisplaySizeRanges(displayInfo, Surface.ROTATION_90, unrotDh, unrotDw, overrideConfig);
+        adjustDisplaySizeRanges(displayInfo, Surface.ROTATION_180, unrotDw, unrotDh,
+                overrideConfig);
+        adjustDisplaySizeRanges(displayInfo, Surface.ROTATION_270, unrotDh, unrotDw,
+                overrideConfig);
 
         if (outConfig == null) {
             return;
@@ -2623,17 +2616,17 @@
     }
 
     private void adjustDisplaySizeRanges(DisplayInfo displayInfo, int rotation, int dw, int dh,
-            boolean legacyConfig) {
+            boolean overrideConfig) {
         final DisplayPolicy.DecorInsets.Info info = mDisplayPolicy.getDecorInsetsInfo(
                 rotation, dw, dh);
         final int w;
         final int h;
-        if (!legacyConfig) {
+        if (!overrideConfig) {
             w = info.mConfigFrame.width();
             h = info.mConfigFrame.height();
         } else {
-            w = info.mLegacyConfigFrame.width();
-            h = info.mLegacyConfigFrame.height();
+            w = info.mOverrideConfigFrame.width();
+            h = info.mOverrideConfigFrame.height();
         }
         if (w < displayInfo.smallestNominalAppWidth) {
             displayInfo.smallestNominalAppWidth = w;
@@ -2705,7 +2698,11 @@
      * Returns true if the specified UID has access to this display.
      */
     boolean hasAccess(int uid) {
-        return mDisplay.hasAccess(uid);
+        int userId = UserHandle.getUserId(uid);
+        boolean isUserVisibleOnDisplay = mWmService.mUmInternal.isUserVisible(
+                userId, mDisplayId);
+        return mDisplay.hasAccess(uid)
+                && (userId == UserHandle.USER_SYSTEM || isUserVisibleOnDisplay);
     }
 
     boolean isPrivate() {
@@ -4562,7 +4559,12 @@
             }
         }
 
-        void attachAndShow(Transaction t) {
+        /**
+         * Attaches the snapshot of IME (a snapshot will be taken if there wasn't one) to the IME
+         * target task and shows it. If the given {@param anyTargetTask} is true, the snapshot won't
+         * be skipped by the activity type of IME target task.
+         */
+        void attachAndShow(Transaction t, boolean anyTargetTask) {
             final DisplayContent dc = mImeTarget.getDisplayContent();
             // Prepare IME screenshot for the target if it allows to attach into.
             final Task task = mImeTarget.getTask();
@@ -4570,7 +4572,9 @@
             final boolean renewImeSurface = mImeSurface == null
                     || mImeSurface.getWidth() != dc.mInputMethodWindow.getFrame().width()
                     || mImeSurface.getHeight() != dc.mInputMethodWindow.getFrame().height();
-            if (task != null && !task.isActivityTypeHomeOrRecents()) {
+            // The exclusion of home/recents is an optimization for regular task switch because
+            // home/recents won't appear in recents task.
+            if (task != null && (anyTargetTask || !task.isActivityTypeHomeOrRecents())) {
                 ScreenCapture.ScreenshotHardwareBuffer imeBuffer = renewImeSurface
                         ? dc.mWmService.mTaskSnapshotController.snapshotImeFromAttachedTask(task)
                         : null;
@@ -4638,7 +4642,9 @@
         removeImeSurfaceImmediately();
         mImeScreenshot = new ImeScreenshot(
                 mWmService.mSurfaceControlFactory.apply(null), imeTarget);
-        mImeScreenshot.attachAndShow(t);
+        // If the caller requests to hide IME, then allow to show IME snapshot for any target task.
+        // So IME won't look like suddenly disappeared. It usually happens when turning off screen.
+        mImeScreenshot.attachAndShow(t, hideImeWindow /* anyTargetTask */);
         if (mInputMethodWindow != null && hideImeWindow) {
             // Hide the IME window when deciding to show IME snapshot on demand.
             // InsetsController will make IME visible again before animating it.
@@ -5097,7 +5103,9 @@
         } finally {
             Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
         }
-        prepareSurfaces();
+        if (!com.android.window.flags.Flags.removePrepareSurfaceInPlacement()) {
+            prepareSurfaces();
+        }
 
         // This should be called after the insets have been dispatched to clients and we have
         // committed finish drawing windows.
@@ -6995,7 +7003,7 @@
             // by finishing the recents animation and moving it to top. That also avoids flickering
             // due to wait for previous activity to be paused if it supports PiP that ignores the
             // effect of resume-while-pausing.
-            if (r == null || r == mAnimatingRecents) {
+            if (r == null || r == mAnimatingRecents || r.getDisplayId() != mDisplayId) {
                 return;
             }
             if (mAnimatingRecents != null && mRecentsWillBeTop) {
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 16f7373..5e0d4f9 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -779,6 +779,11 @@
         return mLidState;
     }
 
+    private void onDisplaySwitchFinished() {
+        mDisplayContent.mWallpaperController.onDisplaySwitchFinished();
+        mDisplayContent.mDisplayUpdater.onDisplaySwitching(false);
+    }
+
     public void setAwake(boolean awake) {
         synchronized (mLock) {
             if (awake == mAwake) {
@@ -797,7 +802,7 @@
             mService.mAtmService.mKeyguardController.updateDeferTransitionForAod(
                     mAwake /* waiting */);
             if (!awake) {
-                mDisplayContent.mWallpaperController.onDisplaySwitchFinished();
+                onDisplaySwitchFinished();
             }
         }
     }
@@ -866,7 +871,7 @@
 
     /** It is called after {@link #finishScreenTurningOn}. This runs on PowerManager's thread. */
     public void screenTurnedOn() {
-        mDisplayContent.mWallpaperController.onDisplaySwitchFinished();
+        onDisplaySwitchFinished();
     }
 
     public void screenTurnedOff() {
@@ -1930,9 +1935,9 @@
             final Rect mConfigInsets = new Rect();
 
             /**
-             * Legacy value of mConfigInsets for app compatibility purpose.
+             * Override value of mConfigInsets for app compatibility purpose.
              */
-            final Rect mLegacyConfigInsets = new Rect();
+            final Rect mOverrideConfigInsets = new Rect();
 
             /** The display frame available after excluding {@link #mNonDecorInsets}. */
             final Rect mNonDecorFrame = new Rect();
@@ -1945,9 +1950,9 @@
             final Rect mConfigFrame = new Rect();
 
             /**
-             * Legacy value of mConfigFrame for app compatibility purpose.
+             * Override value of mConfigFrame for app compatibility purpose.
              */
-            final Rect mLegacyConfigFrame = new Rect();
+            final Rect mOverrideConfigFrame = new Rect();
 
             private boolean mNeedUpdate = true;
 
@@ -1963,22 +1968,22 @@
                         ? decor
                         : insetsState.calculateInsets(displayFrame, dc.mWmService.mConfigTypes,
                                 true /* ignoreVisibility */);
-                final Insets legacyConfigInsets = dc.mWmService.mConfigTypes
-                        == dc.mWmService.mLegacyConfigTypes
+                final Insets overrideConfigInsets = dc.mWmService.mConfigTypes
+                        == dc.mWmService.mOverrideConfigTypes
                         ? configInsets
                         : insetsState.calculateInsets(displayFrame,
-                                dc.mWmService.mLegacyConfigTypes, true /* ignoreVisibility */);
+                                dc.mWmService.mOverrideConfigTypes, true /* ignoreVisibility */);
                 mNonDecorInsets.set(decor.left, decor.top, decor.right, decor.bottom);
                 mConfigInsets.set(configInsets.left, configInsets.top, configInsets.right,
                         configInsets.bottom);
-                mLegacyConfigInsets.set(legacyConfigInsets.left, legacyConfigInsets.top,
-                        legacyConfigInsets.right, legacyConfigInsets.bottom);
+                mOverrideConfigInsets.set(overrideConfigInsets.left, overrideConfigInsets.top,
+                        overrideConfigInsets.right, overrideConfigInsets.bottom);
                 mNonDecorFrame.set(displayFrame);
                 mNonDecorFrame.inset(mNonDecorInsets);
                 mConfigFrame.set(displayFrame);
                 mConfigFrame.inset(mConfigInsets);
-                mLegacyConfigFrame.set(displayFrame);
-                mLegacyConfigFrame.inset(mLegacyConfigInsets);
+                mOverrideConfigFrame.set(displayFrame);
+                mOverrideConfigFrame.inset(mOverrideConfigInsets);
                 mNeedUpdate = false;
                 return insetsState;
             }
@@ -1986,10 +1991,10 @@
             void set(Info other) {
                 mNonDecorInsets.set(other.mNonDecorInsets);
                 mConfigInsets.set(other.mConfigInsets);
-                mLegacyConfigInsets.set(other.mLegacyConfigInsets);
+                mOverrideConfigInsets.set(other.mOverrideConfigInsets);
                 mNonDecorFrame.set(other.mNonDecorFrame);
                 mConfigFrame.set(other.mConfigFrame);
-                mLegacyConfigFrame.set(other.mLegacyConfigFrame);
+                mOverrideConfigFrame.set(other.mOverrideConfigFrame);
                 mNeedUpdate = false;
             }
 
@@ -2102,7 +2107,7 @@
         final InsetsState newInsetsState = newInfo.update(mDisplayContent, rotation, dw, dh);
         final DecorInsets.Info currentInfo = getDecorInsetsInfo(rotation, dw, dh);
         if (newInfo.mConfigFrame.equals(currentInfo.mConfigFrame)
-                && newInfo.mLegacyConfigFrame.equals(currentInfo.mLegacyConfigFrame)) {
+                && newInfo.mOverrideConfigFrame.equals(currentInfo.mOverrideConfigFrame)) {
             // Even if the config frame is not changed in current rotation, it may change the
             // insets in other rotations if the frame of insets source is changed.
             final InsetsState currentInsetsState = mDisplayContent.mDisplayFrames.mInsetsState;
@@ -2187,6 +2192,11 @@
                 mDisplayContent.mTransitionController.getCollectingTransitionId();
     }
 
+    /** If this is called, expect that there will be an onDisplayChanged about unique id. */
+    public void onDisplaySwitchStart() {
+        mDisplayContent.mDisplayUpdater.onDisplaySwitching(true);
+    }
+
     @NavigationBarPosition
     int navigationBarPosition(int displayRotation) {
         if (mNavigationBar != null) {
diff --git a/services/core/java/com/android/server/wm/DisplayUpdater.java b/services/core/java/com/android/server/wm/DisplayUpdater.java
index e611177..918b180 100644
--- a/services/core/java/com/android/server/wm/DisplayUpdater.java
+++ b/services/core/java/com/android/server/wm/DisplayUpdater.java
@@ -17,6 +17,7 @@
 package com.android.server.wm;
 
 import android.annotation.NonNull;
+import android.os.Message;
 import android.view.Surface;
 import android.window.DisplayAreaInfo;
 
@@ -49,4 +50,16 @@
             @Surface.Rotation int previousRotation, @Surface.Rotation int newRotation,
             @NonNull DisplayAreaInfo newDisplayAreaInfo) {
     }
+
+    /**
+     * Called with {@code true} when physical display is going to switch. And {@code false} when
+     * the display is turned on or the device goes to sleep.
+     */
+    default void onDisplaySwitching(boolean switching) {
+    }
+
+    /** Returns {@code true} if the transition will control when to turn on the screen. */
+    default boolean waitForTransition(@NonNull Message screenUnBlocker) {
+        return false;
+    }
 }
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index 21326be..2dbb370 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -38,7 +38,6 @@
 import android.view.InsetsSourceControl;
 import android.view.WindowInsets;
 import android.view.inputmethod.ImeTracker;
-import android.window.TaskSnapshot;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.protolog.common.ProtoLog;
@@ -68,8 +67,9 @@
     /** @see #setServerVisible(boolean) */
     private boolean mServerVisible;
 
-    ImeInsetsSourceProvider(InsetsSource source,
-            InsetsStateController stateController, DisplayContent displayContent) {
+    ImeInsetsSourceProvider(@NonNull InsetsSource source,
+            @NonNull InsetsStateController stateController,
+            @NonNull DisplayContent displayContent) {
         super(source, stateController, displayContent);
     }
 
@@ -78,17 +78,22 @@
         final InsetsSourceControl control = super.getControl(target);
         if (control != null && target != null && target.getWindow() != null) {
             final WindowState targetWin = target.getWindow();
+            final Task task = targetWin.getTask();
             // If the control target changes during the app transition with the task snapshot
             // starting window and the IME snapshot is visible, in case not have duplicated IME
             // showing animation during transitioning, use a flag to inform IME source control to
             // skip showing animation once.
-            final TaskSnapshot snapshot = targetWin.getRootTask() != null
-                    ? targetWin.mWmService.getTaskSnapshot(targetWin.getRootTask().mTaskId,
-                        0 /* userId */, false /* isLowResolution */, false /* restoreFromDisk */)
-                    : null;
-            control.setSkipAnimationOnce(targetWin.mActivityRecord != null
-                    && targetWin.mActivityRecord.hasStartingWindow()
-                    && snapshot != null && snapshot.hasImeSurface());
+            StartingData startingData = null;
+            if (task != null) {
+                startingData = targetWin.mActivityRecord.mStartingData;
+                if (startingData == null) {
+                    final WindowState startingWin = task.topStartingWindow();
+                    if (startingWin != null) {
+                        startingData = startingWin.mStartingData;
+                    }
+                }
+            }
+            control.setSkipAnimationOnce(startingData != null && startingData.hasImeSurface());
         }
         return control;
     }
@@ -226,7 +231,7 @@
         if (mImeRequesterStatsToken != null) {
             // Cancel the pre-existing stats token, if any.
             // Log state on pre-existing request cancel.
-            logShowImePostLayoutState();
+            logShowImePostLayoutState(false /* aborted */);
             ImeTracker.forLogging().onCancelled(
                     mImeRequesterStatsToken, ImeTracker.PHASE_WM_SHOW_IME_RUNNER);
         }
@@ -306,7 +311,7 @@
         ProtoLog.d(WM_DEBUG_IME, "abortShowImePostLayout");
         if (mImeRequesterStatsToken != null) {
             // Log state on abort.
-            logShowImePostLayoutState();
+            logShowImePostLayoutState(true /* aborted */);
             ImeTracker.forLogging().onFailed(
                     mImeRequesterStatsToken, ImeTracker.PHASE_WM_ABORT_SHOW_IME_POST_LAYOUT);
             mImeRequesterStatsToken = null;
@@ -329,11 +334,30 @@
         //  actual IME target.
         final InsetsControlTarget dcTarget = mDisplayContent.getImeTarget(IME_TARGET_LAYERING);
         if (dcTarget == null || mImeRequester == null) {
+            // Not ready to show if there is no IME layering target, or no IME requester.
             return false;
         }
-        // Not ready to show if there is no IME control target.
-        final InsetsControlTarget controlTarget = mDisplayContent.getImeTarget(IME_TARGET_CONTROL);
+        final InsetsControlTarget controlTarget = getControlTarget();
         if (controlTarget == null) {
+            // Not ready to show if there is no IME control target.
+            return false;
+        }
+        if (controlTarget != mDisplayContent.getImeTarget(IME_TARGET_CONTROL)) {
+            // Not ready to show if control target does not match the one in DisplayContent.
+            return false;
+        }
+        if (!mServerVisible || mFrozen) {
+            // Not ready to show if the window container is not available and considered visible.
+            // If frozen, the server visibility is not set until unfrozen.
+            return false;
+        }
+        if (mStateController.hasPendingControls(controlTarget)) {
+            // Not ready to show if control target has pending controls.
+            return false;
+        }
+        if (getLeash(controlTarget) == null) {
+            // Not ready to show if control target has no source control leash (or leash is not
+            // ready for dispatching).
             return false;
         }
 
@@ -349,35 +373,56 @@
     }
 
     /**
-     * Logs the current state required for scheduleShowImePostLayout's runnable to be triggered.
+     * Logs the current state required for showImePostLayout to be triggered.
+     *
+     * @param aborted whether the showImePostLayout was aborted or cancelled.
      */
-    private void logShowImePostLayoutState() {
+    private void logShowImePostLayoutState(boolean aborted) {
         final var windowState = mWindowContainer != null ? mWindowContainer.asWindowState() : null;
         final var dcTarget = mDisplayContent.getImeTarget(IME_TARGET_LAYERING);
-        final var controlTarget = mDisplayContent.getImeTarget(IME_TARGET_CONTROL);
+        final var controlTarget = getControlTarget();
         final var sb = new StringBuilder();
-        sb.append("mWindowContainer: ").append(mWindowContainer);
-        sb.append(" windowState: ").append(windowState);
+        sb.append("showImePostLayout ").append(aborted ? "aborted" : "cancelled");
+        sb.append(", mWindowContainer is: ");
+        sb.append(mWindowContainer != null ? "non-null" : "null");
+        sb.append(", windowState: ").append(windowState);
         if (windowState != null) {
-            sb.append(" windowState.isDrawn(): ").append(windowState.isDrawn());
-            sb.append(" windowState.mGivenInsetsPending: ").append(windowState.mGivenInsetsPending);
+            sb.append(", windowState.isDrawn(): ");
+            sb.append(windowState.isDrawn());
+            sb.append(", windowState.mGivenInsetsPending: ");
+            sb.append(windowState.mGivenInsetsPending);
         }
-        sb.append(" mIsImeLayoutDrawn: ").append(mIsImeLayoutDrawn);
-        sb.append(" mShowImeRunner: ").append(mShowImeRunner);
-        sb.append(" mImeRequester: ").append(mImeRequester);
-        sb.append(" dcTarget: ").append(dcTarget);
-        sb.append(" controlTarget: ").append(controlTarget);
-        sb.append(" isReadyToShowIme(): ").append(isReadyToShowIme());
+        sb.append(", mIsImeLayoutDrawn: ").append(mIsImeLayoutDrawn);
+        sb.append(", mShowImeRunner: ").append(mShowImeRunner);
+        sb.append(", mImeRequester: ").append(mImeRequester);
+        sb.append(", dcTarget: ").append(dcTarget);
+        sb.append(", controlTarget: ").append(controlTarget);
+        sb.append("\n");
+        sb.append("isReadyToShowIme(): ").append(isReadyToShowIme());
         if (mImeRequester != null && dcTarget != null && controlTarget != null) {
-            sb.append(" isImeLayeringTarget: ");
+            sb.append(", controlTarget == DisplayContent.controlTarget: ");
+            sb.append(controlTarget == mDisplayContent.getImeTarget(IME_TARGET_CONTROL));
+            sb.append(", hasPendingControls: ");
+            sb.append(mStateController.hasPendingControls(controlTarget));
+            sb.append(", serverVisible: ");
+            sb.append(mServerVisible);
+            sb.append(", frozen: ");
+            sb.append(mFrozen);
+            sb.append(", leash is: ");
+            sb.append(getLeash(controlTarget) != null ? "non-null" : "null");
+            sb.append(", control is: ");
+            sb.append(mControl != null ? "non-null" : "null");
+            sb.append(", mIsLeashReadyForDispatching: ");
+            sb.append(mIsLeashReadyForDispatching);
+            sb.append(", isImeLayeringTarget: ");
             sb.append(isImeLayeringTarget(mImeRequester, dcTarget));
-            sb.append(" isAboveImeLayeringTarget: ");
+            sb.append(", isAboveImeLayeringTarget: ");
             sb.append(isAboveImeLayeringTarget(mImeRequester, dcTarget));
-            sb.append(" isImeFallbackTarget: ");
+            sb.append(", isImeFallbackTarget: ");
             sb.append(isImeFallbackTarget(mImeRequester));
-            sb.append(" isImeInputTarget: ");
+            sb.append(", isImeInputTarget: ");
             sb.append(isImeInputTarget(mImeRequester));
-            sb.append(" sameAsImeControlTarget: ");
+            sb.append(", sameAsImeControlTarget: ");
             sb.append(sameAsImeControlTarget());
         }
         Slog.d(TAG, sb.toString());
diff --git a/services/core/java/com/android/server/wm/InputConfigAdapter.java b/services/core/java/com/android/server/wm/InputConfigAdapter.java
index 2dcde4e..ef1b02d 100644
--- a/services/core/java/com/android/server/wm/InputConfigAdapter.java
+++ b/services/core/java/com/android/server/wm/InputConfigAdapter.java
@@ -56,7 +56,10 @@
                     InputConfig.DISABLE_USER_ACTIVITY, false /* inverted */),
             new FlagMapping(
                     LayoutParams.INPUT_FEATURE_SPY,
-                    InputConfig.SPY, false /* inverted */));
+                    InputConfig.SPY, false /* inverted */),
+            new FlagMapping(
+                    LayoutParams.INPUT_FEATURE_SENSITIVE_FOR_TRACING,
+                    InputConfig.SENSITIVE_FOR_TRACING, false /* inverted */));
 
     @InputConfigFlags
     private static final int INPUT_FEATURE_TO_CONFIG_MASK =
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index 83f44d2..a8cbc62 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -64,15 +64,16 @@
 
     private static final Rect EMPTY_RECT = new Rect();
 
-    protected final DisplayContent mDisplayContent;
     protected final @NonNull InsetsSource mSource;
-    protected WindowContainer mWindowContainer;
+    protected final @NonNull DisplayContent mDisplayContent;
+    protected final @NonNull InsetsStateController mStateController;
+    protected @Nullable WindowContainer mWindowContainer;
+    protected @Nullable InsetsSourceControl mControl;
+    protected boolean mIsLeashReadyForDispatching;
 
     private final Rect mTmpRect = new Rect();
-    private final InsetsStateController mStateController;
     private final InsetsSourceControl mFakeControl;
     private final Consumer<Transaction> mSetLeashPositionConsumer;
-    private @Nullable InsetsSourceControl mControl;
     private @Nullable InsetsControlTarget mControlTarget;
     private @Nullable InsetsControlTarget mPendingControlTarget;
     private @Nullable InsetsControlTarget mFakeControlTarget;
@@ -82,7 +83,6 @@
     private SparseArray<TriFunction<DisplayFrames, WindowContainer, Rect, Integer>>
             mOverrideFrameProviders;
     private final SparseArray<Rect> mOverrideFrames = new SparseArray<Rect>();
-    private boolean mIsLeashReadyForDispatching;
     private final Rect mSourceFrame = new Rect();
     private final Rect mLastSourceFrame = new Rect();
     private @NonNull Insets mInsetsHint = Insets.NONE;
@@ -114,8 +114,9 @@
      */
     private boolean mCropToProvidingInsets = false;
 
-    InsetsSourceProvider(InsetsSource source, InsetsStateController stateController,
-            DisplayContent displayContent) {
+    InsetsSourceProvider(@NonNull InsetsSource source,
+            @NonNull InsetsStateController stateController,
+            @NonNull DisplayContent displayContent) {
         mClientVisible = (WindowInsets.Type.defaultVisible() & source.getType()) != 0;
         mSource = source;
         mDisplayContent = displayContent;
@@ -560,7 +561,7 @@
         mDisplayContent.mWmService.mWindowPlacerLocked.requestTraversal();
     }
 
-    @VisibleForTesting
+    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED)
     void setServerVisible(boolean serverVisible) {
         mServerVisible = serverVisible;
         updateSourceFrameForServerVisibility();
@@ -575,6 +576,14 @@
                 mServerVisible, mClientVisible);
     }
 
+    /**
+     * Gets the source control for the given control target. If this is the provider's control
+     * target, but the leash is not ready for dispatching, a new source control object with the
+     * leash set to {@code null} is returned.
+     *
+     * @param target the control target to get the source control for.
+     */
+    @Nullable
     InsetsSourceControl getControl(InsetsControlTarget target) {
         if (target == mControlTarget) {
             if (!mIsLeashReadyForDispatching && mControl != null) {
@@ -593,10 +602,25 @@
         return null;
     }
 
+    /**
+     * Gets the leash of the source control for the given control target. If this is not the
+     * provider's control target, or the leash is not ready for dispatching, this will
+     * return {@code null}.
+     *
+     * @param target the control target to get the source control leash for.
+     */
+    @Nullable
+    protected SurfaceControl getLeash(@NonNull InsetsControlTarget target) {
+        return target == mControlTarget && mIsLeashReadyForDispatching && mControl != null
+                ? mControl.getLeash() : null;
+    }
+
+    @Nullable
     InsetsControlTarget getControlTarget() {
         return mControlTarget;
     }
 
+    @Nullable
     InsetsControlTarget getFakeControlTarget() {
         return mFakeControlTarget;
     }
diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java
index 6b9fcf4..3a04bcd 100644
--- a/services/core/java/com/android/server/wm/InsetsStateController.java
+++ b/services/core/java/com/android/server/wm/InsetsStateController.java
@@ -388,6 +388,9 @@
                 onRequestedVisibleTypesChanged(newControlTargets.valueAt(i));
             }
             newControlTargets.clear();
+            // Check for and try to run the scheduled show IME request (if it exists), as we
+            // now applied the surface transaction and notified the target of the new control.
+            getImeSourceProvider().checkShowImePostLayout();
         });
     }
 
@@ -395,6 +398,15 @@
         mDisplayContent.notifyInsetsChanged(mDispatchInsetsChanged);
     }
 
+    /**
+     * Checks if the control target has pending controls.
+     *
+     * @param target the control target to check.
+     */
+    boolean hasPendingControls(@NonNull InsetsControlTarget target) {
+        return mPendingControlChanged.contains(target);
+    }
+
     void dump(String prefix, PrintWriter pw) {
         pw.println(prefix + "WindowInsetsStateController");
         prefix = prefix + "  ";
diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java
index b8bb258..0ad601d 100644
--- a/services/core/java/com/android/server/wm/KeyguardController.java
+++ b/services/core/java/com/android/server/wm/KeyguardController.java
@@ -61,6 +61,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;
 
@@ -225,13 +226,16 @@
             if (keyguardShowing) {
                 state.mDismissalRequested = false;
             }
-            if (goingAwayRemoved) {
-                // Keyguard dismiss is canceled. Send a transition to undo the changes and clean up
-                // before holding the sleep token again.
+            if (goingAwayRemoved || (keyguardShowing && Flags.keyguardAppearTransition())) {
+                // Keyguard decided to show or stopped going away. Send a transition to animate back
+                // to the locked state before holding the sleep token again
                 final DisplayContent dc = mRootWindowContainer.getDefaultDisplay();
                 dc.requestTransitionAndLegacyPrepare(
                         TRANSIT_TO_FRONT, TRANSIT_FLAG_KEYGUARD_APPEARING);
-                mWindowManager.executeAppTransition();
+                if (Flags.keyguardAppearTransition()) {
+                    dc.mWallpaperController.adjustWallpaperWindows();
+                }
+                dc.executeAppTransition();
             }
         }
 
diff --git a/services/core/java/com/android/server/wm/LaunchParamsController.java b/services/core/java/com/android/server/wm/LaunchParamsController.java
index 97b5925..d3c3d28 100644
--- a/services/core/java/com/android/server/wm/LaunchParamsController.java
+++ b/services/core/java/com/android/server/wm/LaunchParamsController.java
@@ -64,7 +64,7 @@
     void registerDefaultModifiers(ActivityTaskSupervisor supervisor) {
         // {@link TaskLaunchParamsModifier} handles window layout preferences.
         registerModifier(new TaskLaunchParamsModifier(supervisor));
-        registerModifier(new DesktopModeLaunchParamsModifier());
+        registerModifier(new DesktopModeLaunchParamsModifier(mService.mContext));
     }
 
     /**
diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java
index dd77a69..3f24545 100644
--- a/services/core/java/com/android/server/wm/LetterboxUiController.java
+++ b/services/core/java/com/android/server/wm/LetterboxUiController.java
@@ -22,6 +22,7 @@
 import static android.content.pm.ActivityInfo.OVERRIDE_ANY_ORIENTATION;
 import static android.content.pm.ActivityInfo.OVERRIDE_ANY_ORIENTATION_TO_USER;
 import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION;
+import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT;
 import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH;
 import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE;
 import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS;
@@ -130,6 +131,7 @@
 import com.android.server.wm.LetterboxConfiguration.LetterboxBackgroundType;
 import com.android.server.wm.utils.OptPropFactory;
 import com.android.server.wm.utils.OptPropFactory.OptProp;
+import com.android.window.flags.Flags;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -350,7 +352,6 @@
                 isCompatChangeEnabled(OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA);
         mIsOverrideRespectRequestedOrientationEnabled =
                 isCompatChangeEnabled(OVERRIDE_RESPECT_REQUESTED_ORIENTATION);
-
     }
 
     /** Cleans up {@link Letterbox} if it exists.*/
@@ -714,6 +715,25 @@
                 isCompatChangeEnabled(OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION));
     }
 
+    /**
+     * Whether activity is eligible for camera compatibility free-form treatment.
+     *
+     * <p>The treatment is applied to a fixed-orientation camera activity in free-form windowing
+     * mode. The treatment letterboxes or pillarboxes the activity to the expected orientation and
+     * provides changes to the camera and display orientation signals to match those expected on a
+     * portrait device in that orientation (for example, on a standard phone).
+     *
+     * <p>The treatment is enabled when the following conditions are met:
+     * <ul>
+     * <li>Property gating the camera compatibility free-form treatment is enabled.
+     * <li>Activity isn't opted out by the device manufacturer with override.
+     * </ul>
+     */
+    boolean shouldApplyFreeformTreatmentForCameraCompat() {
+        return Flags.cameraCompatForFreeform() && !isCompatChangeEnabled(
+                        OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT);
+    }
+
     private boolean isCameraCompatTreatmentActive() {
         DisplayContent displayContent = mActivityRecord.mDisplayContent;
         if (displayContent == null) {
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index 3ef6eeb..63bbb31 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -44,6 +44,7 @@
 import android.view.WindowManager;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.protolog.common.LogLevel;
 import com.android.internal.protolog.common.ProtoLog;
 import com.android.internal.util.FastPrintWriter;
 import com.android.server.wm.SurfaceAnimator.AnimationType;
@@ -209,7 +210,7 @@
                 Slog.e(TAG, "Failed to start remote animation", e);
                 onAnimationFinished();
             }
-            if (ProtoLog.isEnabled(WM_DEBUG_REMOTE_ANIMATIONS)) {
+            if (ProtoLog.isEnabled(WM_DEBUG_REMOTE_ANIMATIONS, LogLevel.DEBUG)) {
                 ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "startAnimation(): Notify animation start:");
                 writeStartDebugStatement();
             }
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index d66005f..9dba8c6 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -31,6 +31,7 @@
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE;
 import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
 import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
+import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_OCCLUDING;
 import static android.view.WindowManager.TRANSIT_NONE;
 import static android.view.WindowManager.TRANSIT_PIP;
 import static android.view.WindowManager.TRANSIT_SLEEP;
@@ -2496,15 +2497,17 @@
                 // Use NONE if keyguard is not showing.
                 int transit = TRANSIT_NONE;
                 Task startTask = null;
+                int flags = 0;
+                if (display.isKeyguardOccluded()) {
+                    startTask = display.getTaskOccludingKeyguard();
+                    flags = TRANSIT_FLAG_KEYGUARD_OCCLUDING;
+                    transit = WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
+                }
                 if (wasSleeping) {
                     transit = TRANSIT_WAKE;
-                } else if (display.isKeyguardOccluded()) {
-                    // The display was awake so this is resuming activity for occluding keyguard.
-                    transit = WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
-                    startTask = display.getTaskOccludingKeyguard();
                 }
                 display.mTransitionController.requestStartTransition(
-                        display.mTransitionController.createTransition(transit),
+                        display.mTransitionController.createTransition(transit, flags),
                         startTask, null /* remoteTransition */, null /* displayChange */);
             }
             // Set the sleeping state of the root tasks on the display.
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java
index d67684c..c632714 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimator.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java
@@ -32,6 +32,7 @@
 import android.view.SurfaceControl.Transaction;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.protolog.common.LogLevel;
 import com.android.internal.protolog.common.ProtoLog;
 
 import java.io.PrintWriter;
@@ -192,7 +193,7 @@
             return;
         }
         mAnimation.startAnimation(mLeash, t, type, mInnerAnimationFinishedCallback);
-        if (ProtoLog.isEnabled(WM_DEBUG_ANIM)) {
+        if (ProtoLog.isEnabled(WM_DEBUG_ANIM, LogLevel.DEBUG)) {
             StringWriter sw = new StringWriter();
             PrintWriter pw = new PrintWriter(sw);
             mAnimation.dump(pw, "");
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 18d2718..d79d113 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -1074,9 +1074,11 @@
         // as the one in the task because either one of them could be the alias activity.
         if (Objects.equals(realActivity, r.mActivityComponent) && this.intent != null) {
             intent.setComponent(this.intent.getComponent());
-            // Make sure the package name the same to prevent one of the intent is set while the
-            // other one is not.
-            intent.setPackage(this.intent.getPackage());
+            if (intent.getSelector() == null) {
+                // Make sure the package name the same to prevent one of the intent is set while the
+                // other one is not.
+                intent.setPackage(this.intent.getPackage());
+            }
         }
         return intent.filterEquals(this.intent);
     }
@@ -1275,8 +1277,9 @@
             final ActivityRecord top = topRunningActivity();
             final ActivityRecord resumedActivity = getResumedActivity();
             if (resumedActivity != null
-                    && (top.getTaskFragment() != this || !canBeResumed(resuming))) {
-                // Pausing the resumed activity because it is occluded by other task fragment.
+                    && (top == null || top.getTaskFragment() != this || !canBeResumed(resuming))) {
+                // Pausing the resumed activity because it is occluded by other task fragment, or
+                // should not be remained in resumed state.
                 if (startPausing(false /* uiSleeping*/, resuming, reason)) {
                     someActivityPaused[0]++;
                 }
@@ -4679,9 +4682,10 @@
 
     @Override
     public void setWindowingMode(int windowingMode) {
-        // Calling Task#setWindowingMode() for leaf task since this is the a specialization of
+        // Calling Task#setWindowingMode() for leaf task since this is a specialization of
         // {@link #setWindowingMode(int)} for root task.
         if (!isRootTask()) {
+            mMultiWindowRestoreWindowingMode = INVALID_WINDOWING_MODE;
             super.setWindowingMode(windowingMode);
             return;
         }
@@ -4725,6 +4729,9 @@
             return;
         }
 
+        // Reset multi-window restore windowing mode.
+        mMultiWindowRestoreWindowingMode = INVALID_WINDOWING_MODE;
+
         final ActivityRecord topActivity = getTopNonFinishingActivity();
 
         // For now, assume that the root task's windowing mode is what will actually be used
@@ -5786,7 +5793,7 @@
         // If we have a watcher, preflight the move before committing to it.  First check
         // for *other* available tasks, but if none are available, then try again allowing the
         // current task to be selected.
-        if (isTopRootTaskInDisplayArea() && mAtmService.mController != null) {
+        if (mAtmService.mController != null && isTopRootTaskInDisplayArea()) {
             ActivityRecord next = topRunningActivity(null, task.mTaskId);
             if (next == null) {
                 next = topRunningActivity(null, INVALID_TASK_ID);
@@ -5830,6 +5837,15 @@
                 + tr.mTaskId);
 
         if (mTransitionController.isShellTransitionsEnabled()) {
+            // TODO(b/277838915): Consider to make it concurrent to eliminate the special case.
+            final Transition collecting = mTransitionController.getCollectingTransition();
+            if (collecting != null && collecting.mType == TRANSIT_OPEN) {
+                // It can be a CLOSING participate of an OPEN transition. This avoids the deferred
+                // transition from moving task to back after the task was moved to front.
+                collecting.collect(tr);
+                moveTaskToBackInner(tr, collecting);
+                return true;
+            }
             final Transition transition = new Transition(TRANSIT_TO_BACK, 0 /* flags */,
                     mTransitionController, mWmService.mSyncEngine);
             // Guarantee that this gets its own transition by queueing on SyncEngine
@@ -5858,7 +5874,7 @@
         return true;
     }
 
-    private boolean moveTaskToBackInner(@NonNull Task task, @Nullable Transition transition) {
+    private void moveTaskToBackInner(@NonNull Task task, @Nullable Transition transition) {
         final Transition.ReadyCondition movedToBack =
                 new Transition.ReadyCondition("moved-to-back", task);
         if (transition != null) {
@@ -5873,7 +5889,7 @@
 
             if (inPinnedWindowingMode()) {
                 mTaskSupervisor.removeRootTask(this);
-                return true;
+                return;
             }
 
             mRootWindowContainer.ensureVisibilityAndConfig(null /* starting */,
@@ -5896,7 +5912,6 @@
         } else {
             mRootWindowContainer.resumeFocusedTasksTopActivities();
         }
-        return true;
     }
 
     boolean willActivityBeVisible(IBinder token) {
@@ -6789,6 +6804,15 @@
         }
     }
 
+    @Nullable
+    ActivityRecord getBottomMostActivityInSamePackage() {
+        if (realActivity == null) {
+            return null;
+        }
+        return getActivity(ar -> ar.packageName.equals(
+                realActivity.getPackageName()), false /* traverseTopToBottom */);
+    }
+
     /**
      * Associates the decor surface with the given TF, or create one if there
      * isn't one in the Task yet. The surface will be removed with the TF,
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index dc0e034..129af90 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -579,7 +579,13 @@
 
         final ActivityRecord prevR = mResumedActivity;
         mResumedActivity = r;
-        mTaskSupervisor.updateTopResumedActivityIfNeeded(reason);
+        final ActivityRecord topResumed = mTaskSupervisor.updateTopResumedActivityIfNeeded(reason);
+        if (mResumedActivity != null && topResumed != null && topResumed.isEmbedded()
+                && topResumed.getTaskFragment().getAdjacentTaskFragment() == this) {
+            // Explicitly updates the last resumed Activity if the resumed activity is
+            // adjacent to the top-resumed embedded activity.
+            mAtmService.setLastResumedActivityUncheckLocked(mResumedActivity, reason);
+        }
         if (r == null && prevR.mDisplayContent != null
                 && prevR.mDisplayContent.getFocusedRootTask() == null) {
             // Only need to notify DWPC when no activity will resume.
@@ -2421,7 +2427,7 @@
         if (!useLegacyInsetsForStableBounds) {
             intersectWithInsetsIfFits(outStableBounds, mTmpBounds, info.mConfigInsets);
         } else {
-            intersectWithInsetsIfFits(outStableBounds, mTmpBounds, info.mLegacyConfigInsets);
+            intersectWithInsetsIfFits(outStableBounds, mTmpBounds, info.mOverrideConfigInsets);
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 319e2b0..1b380aa 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -112,6 +112,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.Executor;
 import java.util.function.Predicate;
 
 /**
@@ -233,6 +234,9 @@
      */
     private ArrayList<Task> mTransientHideTasks;
 
+    @VisibleForTesting
+    ArrayList<Runnable> mTransactionCompletedListeners = null;
+
     /** Custom activity-level animation options and callbacks. */
     private TransitionInfo.AnimationOptions mOverrideOptions;
     private IRemoteCallback mClientAnimationStartCallback = null;
@@ -1640,6 +1644,14 @@
         commitVisibleActivities(transaction);
         commitVisibleWallpapers();
 
+        if (mTransactionCompletedListeners != null) {
+            for (int i = 0; i < mTransactionCompletedListeners.size(); i++) {
+                final Runnable listener = mTransactionCompletedListeners.get(i);
+                transaction.addTransactionCompletedListener(Runnable::run,
+                        (stats) -> listener.run());
+            }
+        }
+
         // Fall-back to the default display if there isn't one participating.
         final DisplayContent primaryDisplay = !mTargetDisplays.isEmpty() ? mTargetDisplays.get(0)
                 : mController.mAtm.mRootWindowContainer.getDefaultDisplay();
@@ -1814,7 +1826,7 @@
                 final AccessibilityController accessibilityController =
                         dc.mWmService.mAccessibilityController;
                 if (accessibilityController.hasCallbacks()) {
-                    accessibilityController.onWMTransition(dc.getDisplayId(), mType);
+                    accessibilityController.onWMTransition(dc.getDisplayId(), mType, mFlags);
                 }
             }
         } else {
@@ -1862,6 +1874,17 @@
     }
 
     /**
+     * Adds a listener that will be executed after the start transaction of this transition
+     * is presented on the screen, the listener will be executed on a binder thread
+     */
+    void addTransactionCompletedListener(Runnable listener) {
+        if (mTransactionCompletedListeners == null) {
+            mTransactionCompletedListeners = new ArrayList<>();
+        }
+        mTransactionCompletedListeners.add(listener);
+    }
+
+    /**
      * Checks if the transition contains order changes.
      *
      * This is a shallow check that doesn't account for collection in parallel, unlike
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java
index ac03a1b..222abc3 100644
--- a/services/core/java/com/android/server/wm/TransitionController.java
+++ b/services/core/java/com/android/server/wm/TransitionController.java
@@ -300,7 +300,7 @@
      * Creates a transition. It can immediately collect participants.
      */
     @NonNull
-    private Transition createTransition(@WindowManager.TransitionType int type,
+    Transition createTransition(@WindowManager.TransitionType int type,
             @WindowManager.TransitionFlags int flags) {
         if (mTransitionPlayer == null) {
             throw new IllegalStateException("Shell Transitions not enabled");
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index a2f6fb4..65e1761 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -22,7 +22,6 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
 
 import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WALLPAPER;
@@ -857,19 +856,12 @@
         result.setWallpaperTarget(wallpaperTarget);
     }
 
-    public void updateWallpaperTokens(boolean keyguardLocked) {
-        if (DEBUG_WALLPAPER) {
-            Slog.v(TAG, "Wallpaper vis: target " + mWallpaperTarget + " prev="
-                    + mPrevWallpaperTarget);
-        }
-        updateWallpaperTokens(mWallpaperTarget != null || mPrevWallpaperTarget != null,
-                keyguardLocked);
-    }
-
     /**
      * Change the visibility of the top wallpaper to {@param visibility} and hide all the others.
      */
     private void updateWallpaperTokens(boolean visibility, boolean keyguardLocked) {
+        ProtoLog.v(WM_DEBUG_WALLPAPER, "updateWallpaperTokens requestedVisibility=%b on"
+                + " keyguardLocked=%b", visibility, keyguardLocked);
         WindowState topWallpaper = mFindResults.getTopWallpaper(keyguardLocked);
         WallpaperWindowToken topWallpaperToken =
                 topWallpaper == null ? null : topWallpaper.mToken.asWallpaperToken();
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
index dc500a2..5c24eee 100644
--- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java
+++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
@@ -192,7 +192,18 @@
     void setVisibility(boolean visible) {
         if (mVisibleRequested != visible) {
             // Before setting mVisibleRequested so we can track changes.
-            mTransitionController.collect(this);
+            final WindowState wpTarget = mDisplayContent.mWallpaperController.getWallpaperTarget();
+            final boolean isTargetNotCollectedActivity = wpTarget != null
+                    && wpTarget.mActivityRecord != null
+                    && !mTransitionController.isCollecting(wpTarget.mActivityRecord);
+            // Skip collecting requesting-invisible wallpaper if the wallpaper target is an activity
+            // and it is not collected. Because the visibility change may be called after the
+            // transition of activity is finished, e.g. WallpaperController#hideWallpapers from
+            // hiding surface of the target. Then if there is a next transition, the wallpaper
+            // change may be collected into the unrelated transition and cause a weird animation.
+            if (!isTargetNotCollectedActivity || visible) {
+                mTransitionController.collect(this);
+            }
 
             setVisibleRequested(visible);
         }
@@ -263,6 +274,12 @@
     }
 
     @Override
+    boolean isSyncFinished(BLASTSyncEngine.SyncGroup group) {
+        // TODO(b/233286785): Support sync state for wallpaper. See WindowState#prepareSync.
+        return !mVisibleRequested || !hasVisibleNotDrawnWallpaper();
+    }
+
+    @Override
     public String toString() {
         if (stringName == null) {
             StringBuilder sb = new StringBuilder();
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index e01842c..90ac576 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -113,6 +113,7 @@
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.graphics.ColorUtils;
+import com.android.internal.protolog.common.LogLevel;
 import com.android.internal.protolog.common.ProtoLog;
 import com.android.internal.util.ToBooleanFunction;
 import com.android.server.wm.SurfaceAnimator.Animatable;
@@ -3286,10 +3287,6 @@
 
             if (isTaskTransitOld(transit) && getWindowingMode() == WINDOWING_MODE_FULLSCREEN) {
                 animationRunnerBuilder.setTaskBackgroundColor(getTaskAnimationBackgroundColor());
-                // TODO: Remove when we migrate to shell (b/202383002)
-                if (mWmService.mTaskTransitionSpec != null) {
-                    animationRunnerBuilder.hideInsetSourceViewOverflows();
-                }
             }
 
             // Check if the animation requests to show background color for Activity and embedded
@@ -3409,7 +3406,7 @@
                 // ActivityOption#makeCustomAnimation or WindowManager#overridePendingTransition.
                 a.restrictDuration(MAX_APP_TRANSITION_DURATION);
             }
-            if (ProtoLog.isEnabled(WM_DEBUG_ANIM)) {
+            if (ProtoLog.isEnabled(WM_DEBUG_ANIM, LogLevel.DEBUG)) {
                 ProtoLog.i(WM_DEBUG_ANIM, "Loaded animation %s for %s, duration: %d, stack=%s",
                         a, this, ((a != null) ? a.getDuration() : 0), Debug.getCallers(20));
             }
@@ -4255,27 +4252,6 @@
             }
         }
 
-        private void hideInsetSourceViewOverflows() {
-            final SparseArray<InsetsSourceProvider> providers =
-                    getDisplayContent().getInsetsStateController().getSourceProviders();
-            for (int i = providers.size(); i >= 0; i--) {
-                final InsetsSourceProvider insetProvider = providers.valueAt(i);
-                if (!insetProvider.getSource().hasFlags(InsetsSource.FLAG_INSETS_ROUNDED_CORNER)) {
-                    return;
-                }
-
-                // Will apply it immediately to current leash and to all future inset animations
-                // until we disable it.
-                insetProvider.setCropToProvidingInsetsBounds(getPendingTransaction());
-
-                // Only clear the size restriction of the inset once the surface animation is over
-                // and not if it's canceled to be replace by another animation.
-                mOnAnimationFinished.add(() -> {
-                    insetProvider.removeCropToProvidingInsetsBounds(getPendingTransaction());
-                });
-            }
-        }
-
         private IAnimationStarter build() {
             return (Transaction t, AnimationAdapter adapter, boolean hidden,
                     @AnimationType int type, @Nullable AnimationAdapter snapshotAnim) -> {
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index daf8129..7e2ffd4 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -160,7 +160,7 @@
 
         /**
          * Called when the windows for accessibility changed. This is called if
-         * {@link com.android.server.accessibility.Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y} is
+         * {@link com.android.server.accessibility.Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y_V2} is
          * false.
          *
          * @param forceSend Send the windows for accessibility even if they haven't changed.
@@ -173,7 +173,7 @@
 
         /**
          * Called when the windows for accessibility changed. This is called if
-         * {@link com.android.server.accessibility.Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y} is
+         * {@link com.android.server.accessibility.Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y_V2} is
          * true.
          * TODO(b/322444245): Remove screenSize parameter by getting it from
          *  DisplayManager#getDisplay(int).getRealSize() on the a11y side.
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index f09ef96..ed88b5a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -43,11 +43,13 @@
 import static android.os.Process.myPid;
 import static android.os.Process.myUid;
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
+import static android.permission.flags.Flags.sensitiveContentImprovements;
 import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
 import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW;
 import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS;
 import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES;
 import static android.provider.Settings.Global.DEVELOPMENT_WM_DISPLAY_SETTINGS_PATH;
+import static android.service.dreams.Flags.dreamHandlesConfirmKeys;
 import static android.view.ContentRecordingSession.RECORD_CONTENT_TASK;
 import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.Display.INVALID_DISPLAY;
@@ -65,6 +67,7 @@
 import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
 import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY;
 import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL;
+import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SENSITIVE_FOR_TRACING;
 import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SPY;
 import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE;
 import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
@@ -238,6 +241,7 @@
 import android.util.ArraySet;
 import android.util.DisplayMetrics;
 import android.util.EventLog;
+import android.util.IntArray;
 import android.util.MergedConfiguration;
 import android.util.Pair;
 import android.util.Slog;
@@ -305,6 +309,7 @@
 import android.view.displayhash.DisplayHash;
 import android.view.displayhash.VerifiedDisplayHash;
 import android.view.inputmethod.ImeTracker;
+import android.widget.Toast;
 import android.window.ActivityWindowInfo;
 import android.window.AddToSurfaceSyncGroupResult;
 import android.window.ClientWindowFrames;
@@ -563,7 +568,7 @@
     /** Device default insets types shall be excluded from config app sizes. */
     final int mConfigTypes;
 
-    final int mLegacyConfigTypes;
+    final int mOverrideConfigTypes;
 
     final boolean mLimitedAlphaCompositing;
     final int mMaxUiWidth;
@@ -1102,6 +1107,14 @@
 
     @GuardedBy("mGlobalLock")
     final SensitiveContentPackages mSensitiveContentPackages = new SensitiveContentPackages();
+    /**
+     * UIDs for which a Toast has been shown to indicate
+     * {@link LocalService#addBlockScreenCaptureForApps(ArraySet) screen capture blocking}. This is
+     * used to ensure we don't keep re-showing the Toast every time the window becomes visible.
+     * UIDs are removed when the app is removed from the block list.
+     */
+    @GuardedBy("mGlobalLock")
+    private final IntArray mCaptureBlockedToastShownUids = new IntArray();
 
     /** Listener to notify activity manager about app transitions. */
     final WindowManagerInternal.AppTransitionListener mActivityManagerAppTransitionNotifier
@@ -1234,20 +1247,18 @@
         if (mFlags.mInsetsDecoupledConfiguration) {
             mDecorTypes = 0;
             mConfigTypes = 0;
-        } else if (isScreenSizeDecoupledFromStatusBarAndCutout) {
-            mDecorTypes = WindowInsets.Type.navigationBars();
-            mConfigTypes = WindowInsets.Type.navigationBars();
         } else {
             mDecorTypes = WindowInsets.Type.displayCutout() | WindowInsets.Type.navigationBars();
             mConfigTypes = WindowInsets.Type.displayCutout() | WindowInsets.Type.statusBars()
                     | WindowInsets.Type.navigationBars();
         }
-        if (isScreenSizeDecoupledFromStatusBarAndCutout) {
-            // Do not fallback to legacy value for enabled devices.
-            mLegacyConfigTypes = WindowInsets.Type.navigationBars();
+        if (isScreenSizeDecoupledFromStatusBarAndCutout && !mFlags.mInsetsDecoupledConfiguration) {
+            // If the global new behavior is not there, but the partial decouple flag is on.
+            mOverrideConfigTypes = 0;
         } else {
-            mLegacyConfigTypes = WindowInsets.Type.displayCutout() | WindowInsets.Type.statusBars()
-                    | WindowInsets.Type.navigationBars();
+            mOverrideConfigTypes =
+                    WindowInsets.Type.displayCutout() | WindowInsets.Type.statusBars()
+                            | WindowInsets.Type.navigationBars();
         }
 
         mLetterboxConfiguration = new LetterboxConfiguration(
@@ -1718,8 +1729,8 @@
             final DisplayPolicy displayPolicy = displayContent.getDisplayPolicy();
             displayPolicy.adjustWindowParamsLw(win, win.mAttrs);
             attrs.flags = sanitizeFlagSlippery(attrs.flags, win.getName(), callingUid, callingPid);
-            attrs.inputFeatures = sanitizeSpyWindow(attrs.inputFeatures, win.getName(), callingUid,
-                    callingPid);
+            attrs.inputFeatures = sanitizeInputFeatures(attrs.inputFeatures, win.getName(),
+                    callingUid, callingPid, win.isTrustedOverlay());
             win.setRequestedVisibleTypes(requestedVisibleTypes);
 
             res = displayPolicy.validateAddingWindowLw(attrs, callingPid, callingUid);
@@ -2289,8 +2300,8 @@
             if (attrs != null) {
                 displayPolicy.adjustWindowParamsLw(win, attrs);
                 attrs.flags = sanitizeFlagSlippery(attrs.flags, win.getName(), uid, pid);
-                attrs.inputFeatures = sanitizeSpyWindow(attrs.inputFeatures, win.getName(), uid,
-                        pid);
+                attrs.inputFeatures = sanitizeInputFeatures(attrs.inputFeatures, win.getName(), uid,
+                        pid, win.isTrustedOverlay());
                 int disableFlags =
                         (attrs.systemUiVisibility | attrs.subtreeSystemUiVisibility) & DISABLE_MASK;
                 if (disableFlags != 0 && !hasStatusBarPermission(pid, uid)) {
@@ -2581,14 +2592,18 @@
             }
 
             if (outFrames != null && outMergedConfiguration != null) {
+                final boolean shouldReportActivityWindowInfo = outBundle != null
+                        && win.mLastReportedActivityWindowInfo != null;
+                final ActivityWindowInfo outActivityWindowInfo = shouldReportActivityWindowInfo
+                        ? new ActivityWindowInfo()
+                        : null;
+
                 win.fillClientWindowFramesAndConfiguration(outFrames, outMergedConfiguration,
-                        false /* useLatestConfig */, shouldRelayout);
-                if (Flags.activityWindowInfoFlag() && outBundle != null
-                        && win.mActivityRecord != null) {
-                    final ActivityWindowInfo activityWindowInfo = win.mActivityRecord
-                            .getActivityWindowInfo();
+                        outActivityWindowInfo, false /* useLatestConfig */, shouldRelayout);
+
+                if (shouldReportActivityWindowInfo) {
                     outBundle.putParcelable(IWindowSession.KEY_RELAYOUT_BUNDLE_ACTIVITY_WINDOW_INFO,
-                            activityWindowInfo);
+                            outActivityWindowInfo);
                 }
 
                 // Set resize-handled here because the values are sent back to the client.
@@ -3420,7 +3435,7 @@
         if (!checkCallingPermission(permission.CONTROL_KEYGUARD, "dismissKeyguard")) {
             throw new SecurityException("Requires CONTROL_KEYGUARD permission");
         }
-        if (mAtmService.mKeyguardController.isShowingDream()) {
+        if (!dreamHandlesConfirmKeys() && mAtmService.mKeyguardController.isShowingDream()) {
             mAtmService.mTaskSupervisor.wakeUp("leaveDream");
         }
         synchronized (mGlobalLock) {
@@ -3677,12 +3692,6 @@
 
     // Called by window manager policy.  Not exposed externally.
     @Override
-    public void switchKeyboardLayout(int deviceId, int direction) {
-        mInputManager.switchKeyboardLayout(deviceId, direction);
-    }
-
-    // Called by window manager policy.  Not exposed externally.
-    @Override
     public void shutdown(boolean confirm) {
         // Pass in the UI context, since ShutdownThread requires it (to show UI).
         ShutdownThread.shutdown(ActivityThread.currentActivityThread().getSystemUiContext(),
@@ -8069,6 +8078,10 @@
             }
             boolean allWindowsDrawn = false;
             synchronized (mGlobalLock) {
+                if (mRoot.getDefaultDisplay().mDisplayUpdater.waitForTransition(message)) {
+                    // Use the ready-to-play of transition as the signal.
+                    return;
+                }
                 container.waitForAllWindowsDrawn();
                 mWindowPlacerLocked.requestTraversal();
                 mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT, container);
@@ -8721,6 +8734,15 @@
                         mSensitiveContentPackages.addBlockScreenCaptureForApps(packageInfos);
                 if (modified) {
                     WindowManagerService.this.refreshScreenCaptureDisabled();
+                    if (sensitiveContentImprovements()) {
+                        // TODO(b/331842561): Combine this traversal with the one inside
+                        // refreshScreenCaptureDisabled above.
+                        mRoot.forAllWindows((w) -> {
+                            if (w.isVisible()) {
+                                WindowManagerService.this.showToastIfBlockingScreenCapture(w);
+                            }
+                        }, /* traverseTopToBottom= */ true);
+                    }
                 }
             }
         }
@@ -8733,6 +8755,15 @@
                 if (modified) {
                     WindowManagerService.this.refreshScreenCaptureDisabled();
                 }
+                if (sensitiveContentImprovements()) {
+                    for (int i = 0; i < packageInfos.size(); i++) {
+                        int uid = packageInfos.valueAt(i).getUid();
+                        if (mCaptureBlockedToastShownUids.contains(uid)) {
+                            mCaptureBlockedToastShownUids.remove(
+                                    mCaptureBlockedToastShownUids.indexOf(uid));
+                        }
+                    }
+                }
             }
         }
 
@@ -8743,6 +8774,9 @@
                 if (modified) {
                     WindowManagerService.this.refreshScreenCaptureDisabled();
                 }
+                if (sensitiveContentImprovements()) {
+                    mCaptureBlockedToastShownUids.clear();
+                }
             }
         }
 
@@ -9105,18 +9139,26 @@
     }
 
     /**
-     * You need MONITOR_INPUT permission to be able to set INPUT_FEATURE_SPY.
+     * Ensure the caller has the right permissions to be able to set the requested input features.
      */
-    private int sanitizeSpyWindow(int inputFeatures, String windowName, int callingUid,
-            int callingPid) {
-        if ((inputFeatures & INPUT_FEATURE_SPY) == 0) {
-            return inputFeatures;
+    private int sanitizeInputFeatures(int inputFeatures, String windowName, int callingUid,
+            int callingPid, boolean isTrustedOverlay) {
+        // You need MONITOR_INPUT permission to be able to set INPUT_FEATURE_SPY.
+        if ((inputFeatures & INPUT_FEATURE_SPY) != 0) {
+            final int permissionResult = mContext.checkPermission(
+                    permission.MONITOR_INPUT, callingPid, callingUid);
+            if (permissionResult != PackageManager.PERMISSION_GRANTED) {
+                throw new IllegalArgumentException(
+                        "Cannot use INPUT_FEATURE_SPY from '" + windowName
+                                + "' because it doesn't the have MONITOR_INPUT permission");
+            }
         }
-        final int permissionResult = mContext.checkPermission(
-                permission.MONITOR_INPUT, callingPid, callingUid);
-        if (permissionResult != PackageManager.PERMISSION_GRANTED) {
-            throw new IllegalArgumentException("Cannot use INPUT_FEATURE_SPY from '" + windowName
-                    + "' because it doesn't the have MONITOR_INPUT permission");
+
+        // You can only use INPUT_FEATURE_SENSITIVE_FOR_TRACING on a trusted overlay.
+        if ((inputFeatures & INPUT_FEATURE_SENSITIVE_FOR_TRACING) != 0 && !isTrustedOverlay) {
+            Slog.w(TAG, "Removing INPUT_FEATURE_SENSITIVE_FOR_TRACING from '" + windowName
+                    + "' because it isn't a trusted overlay");
+            return inputFeatures & ~INPUT_FEATURE_SENSITIVE_FOR_TRACING;
         }
         return inputFeatures;
     }
@@ -9194,8 +9236,10 @@
         h.setWindowToken(clientToken);
         h.name = name;
 
+        final boolean isTrustedOverlay = (privateFlags & PRIVATE_FLAG_TRUSTED_OVERLAY) != 0;
         flags = sanitizeFlagSlippery(flags, name, callingUid, callingPid);
-        inputFeatures = sanitizeSpyWindow(inputFeatures, name, callingUid, callingPid);
+        inputFeatures = sanitizeInputFeatures(inputFeatures, name, callingUid, callingPid,
+                isTrustedOverlay);
 
         final int sanitizedLpFlags =
                 (flags & (FLAG_NOT_TOUCHABLE | FLAG_SLIPPERY | LayoutParams.FLAG_NOT_FOCUSABLE))
@@ -9232,7 +9276,7 @@
 
         final SurfaceControl.Transaction t = mTransactionFactory.get();
         //  Check private trusted overlay flag to set trustedOverlay field of input window handle.
-        h.setTrustedOverlay(t, surface, (privateFlags & PRIVATE_FLAG_TRUSTED_OVERLAY) != 0);
+        h.setTrustedOverlay(t, surface, isTrustedOverlay);
         t.setInputWindowInfo(surface, h);
         t.apply();
         t.close();
@@ -10119,4 +10163,34 @@
     boolean getDisableSecureWindows() {
         return mDisableSecureWindows;
     }
+
+    /**
+     * Called to notify WMS that the specified window has become visible. This shows a Toast if the
+     * window is deemed to hold sensitive content.
+     */
+    void onWindowVisible(@NonNull WindowState w) {
+        showToastIfBlockingScreenCapture(w);
+    }
+
+    /**
+     * Shows a Toast if the specified window is
+     * {@link LocalService#addBlockScreenCaptureForApps(ArraySet) blocked} from screen capture based
+     * on sensitive content protections.
+     */
+    private void showToastIfBlockingScreenCapture(@NonNull WindowState w) {
+        int uid = w.getOwningUid();
+        if (mCaptureBlockedToastShownUids.contains(uid)) {
+            return;
+        }
+        if (mSensitiveContentPackages.shouldBlockScreenCaptureForApp(w.getOwningPackage(), uid,
+                w.getWindowToken())) {
+            mCaptureBlockedToastShownUids.add(uid);
+            mH.post(() -> {
+                Toast.makeText(mContext, Looper.getMainLooper(),
+                                mContext.getString(R.string.screen_not_shared_sensitive_content),
+                                Toast.LENGTH_SHORT)
+                        .show();
+            });
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 6ac2774..9d8246d 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -110,8 +110,8 @@
     private static final String TAG_RELEASE = TAG + POSTFIX_RELEASE;
     private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
 
-    private static final int MAX_RAPID_ACTIVITY_LAUNCH_COUNT = 500;
-    private static final long RAPID_ACTIVITY_LAUNCH_MS = 300;
+    private static final int MAX_RAPID_ACTIVITY_LAUNCH_COUNT = 50;
+    private static final long RAPID_ACTIVITY_LAUNCH_MS = 500;
     private static final long RESET_RAPID_ACTIVITY_LAUNCH_MS = 5 * RAPID_ACTIVITY_LAUNCH_MS;
 
     public static final int STOPPED_STATE_NOT_STOPPED = 0;
@@ -202,6 +202,12 @@
     // Whether this process has ever started a service with the BIND_INPUT_METHOD permission.
     private volatile boolean mHasImeService;
 
+    /**
+     * Whether this process can use realtime prioirity (SCHED_FIFO) for its UI and render threads
+     * when this process is SCHED_GROUP_TOP_APP.
+     */
+    private final boolean mUseFifoUiScheduling;
+
     /** Whether {@link #mActivities} is not empty. */
     private volatile boolean mHasActivities;
     /** All activities running in the process (exclude destroying). */
@@ -340,6 +346,8 @@
             // TODO(b/151161907): Remove after support for display-independent (raw) SysUi configs.
             mIsActivityConfigOverrideAllowed = false;
         }
+        mUseFifoUiScheduling = com.android.window.flags.Flags.fifoPriorityForMajorUiProcesses()
+                && (isSysUiPackage || mAtm.isCallerRecents(uid));
 
         mCanUseSystemGrammaticalGender = mAtm.mGrammaticalManagerInternal != null
                 && mAtm.mGrammaticalManagerInternal.canGetSystemGrammaticalGender(mUid,
@@ -631,9 +639,15 @@
         }
 
         if (mRapidActivityLaunchCount > MAX_RAPID_ACTIVITY_LAUNCH_COUNT) {
-            Slog.w(TAG, "Killing " + mPid + " because of rapid activity launch");
-            r.getRootTask().moveTaskToBack(r.getTask());
-            mAtm.mH.post(() -> mAtm.mAmInternal.killProcess(mName, mUid, "rapidActivityLaunch"));
+            mRapidActivityLaunchCount = 0;
+            final Task task = r.getTask();
+            Slog.w(TAG, "Removing task " + task.mTaskId + " because of rapid activity launch");
+            mAtm.mH.post(() -> {
+                synchronized (mAtm.mGlobalLock) {
+                    task.removeImmediately("rapid-activity-launch");
+                }
+                mAtm.mAmInternal.killProcess(mName, mUid, "rapidActivityLaunch");
+            });
         }
     }
 
@@ -1901,6 +1915,11 @@
         }
     }
 
+    /** Returns {@code true} if the process prefers to use fifo scheduling. */
+    public boolean useFifoUiScheduling() {
+        return mUseFifoUiScheduling;
+    }
+
     @HotPath(caller = HotPath.OOM_ADJUSTMENT)
     public void onTopProcChanged() {
         if (mAtm.mVrController.isInterestingToSchedGroup()) {
@@ -2078,6 +2097,9 @@
             }
             pw.println();
         }
+        if (mUseFifoUiScheduling) {
+            pw.println(prefix + " mUseFifoUiScheduling=true");
+        }
 
         final int stateFlags = mActivityStateFlags;
         if (stateFlags != ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER) {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 37b2d0e..7a0245b 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -28,6 +28,7 @@
 import static android.os.InputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
 import static android.os.PowerManager.DRAW_WAKE_LOCK;
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
+import static android.permission.flags.Flags.sensitiveContentImprovements;
 import static android.view.SurfaceControl.Transaction;
 import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT;
 import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
@@ -246,6 +247,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.policy.KeyInterceptionInfo;
+import com.android.internal.protolog.common.LogLevel;
 import com.android.internal.protolog.common.ProtoLog;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.ToBooleanFunction;
@@ -421,6 +423,13 @@
      */
     private final MergedConfiguration mLastReportedConfiguration = new MergedConfiguration();
 
+    /**
+     * Similar to {@link #mLastReportedConfiguration}, used to store last reported to client
+     * ActivityWindowInfo. {@code null} if this is not an Activity window.
+     */
+    @Nullable
+    final ActivityWindowInfo mLastReportedActivityWindowInfo;
+
     /** @see #isLastConfigReportedToClient() */
     private boolean mLastConfigReportedToClient;
 
@@ -1080,6 +1089,9 @@
         mPolicy = mWmService.mPolicy;
         mContext = mWmService.mContext;
         mForceSeamlesslyRotate = token.mRoundedCornerOverlay;
+        mLastReportedActivityWindowInfo = Flags.activityWindowInfoFlag() && mActivityRecord != null
+                ? new ActivityWindowInfo()
+                : null;
         mInputWindowHandle = new InputWindowHandleWrapper(new InputWindowHandle(
                 mActivityRecord != null
                         ? mActivityRecord.getInputApplicationHandle(false /* update */) : null,
@@ -2127,6 +2139,9 @@
                 }
             }
             setDisplayLayoutNeeded();
+            if (sensitiveContentImprovements() && visible) {
+                mWmService.onWindowVisible(this);
+            }
         }
     }
 
@@ -3603,12 +3618,15 @@
      *
      * @param outFrames The frames that will be sent to the client.
      * @param outMergedConfiguration The configuration that will be sent to the client.
+     * @param outActivityWindowInfo The ActivityWindowInfo that will be sent to the client if set.
+     *                              {@code null} if this is not activity window.
      * @param useLatestConfig Whether to use the latest configuration.
      * @param relayoutVisible Whether to consider visibility to use the latest configuration.
      */
-    void fillClientWindowFramesAndConfiguration(ClientWindowFrames outFrames,
-            MergedConfiguration outMergedConfiguration, boolean useLatestConfig,
-            boolean relayoutVisible) {
+    void fillClientWindowFramesAndConfiguration(@NonNull ClientWindowFrames outFrames,
+            @NonNull MergedConfiguration outMergedConfiguration,
+            @Nullable ActivityWindowInfo outActivityWindowInfo,
+            boolean useLatestConfig, boolean relayoutVisible) {
         outFrames.frame.set(mWindowFrames.mCompatFrame);
         outFrames.displayFrame.set(mWindowFrames.mDisplayFrame);
         if (mInvGlobalScale != 1f) {
@@ -3638,8 +3656,15 @@
             if (outMergedConfiguration != mLastReportedConfiguration) {
                 mLastReportedConfiguration.setTo(outMergedConfiguration);
             }
+            if (outActivityWindowInfo != null && mLastReportedActivityWindowInfo != null) {
+                outActivityWindowInfo.set(mActivityRecord.getActivityWindowInfo());
+                mLastReportedActivityWindowInfo.set(outActivityWindowInfo);
+            }
         } else {
             outMergedConfiguration.setTo(mLastReportedConfiguration);
+            if (outActivityWindowInfo != null && mLastReportedActivityWindowInfo != null) {
+                outActivityWindowInfo.set(mLastReportedActivityWindowInfo);
+            }
         }
         mLastConfigReportedToClient = true;
     }
@@ -3676,10 +3701,22 @@
         mDragResizingChangeReported = true;
         mWindowFrames.clearReportResizeHints();
 
+        // App window resize may trigger Activity#onConfigurationChanged, so we need to update
+        // ActivityWindowInfo as well.
+        final IBinder activityToken;
+        final ActivityWindowInfo activityWindowInfo;
+        if (mLastReportedActivityWindowInfo != null) {
+            activityToken = mActivityRecord.token;
+            activityWindowInfo = mLastReportedActivityWindowInfo;
+        } else {
+            activityToken = null;
+            activityWindowInfo = null;
+        }
+
         final int prevRotation = mLastReportedConfiguration
                 .getMergedConfiguration().windowConfiguration.getRotation();
         fillClientWindowFramesAndConfiguration(mClientWindowFrames, mLastReportedConfiguration,
-                true /* useLatestConfig */, false /* relayoutVisible */);
+                activityWindowInfo, true /* useLatestConfig */, false /* relayoutVisible */);
         final boolean syncRedraw = shouldSendRedrawForSync();
         final boolean syncWithBuffers = syncRedraw && shouldSyncWithBuffers();
         final boolean reportDraw = syncRedraw || drawPending;
@@ -3697,18 +3734,6 @@
 
         markRedrawForSyncReported();
 
-        // App window resize may trigger Activity#onConfigurationChanged, so we need to update
-        // ActivityWindowInfo as well.
-        final IBinder activityToken;
-        final ActivityWindowInfo activityWindowInfo;
-        if (Flags.activityWindowInfoFlag() && mActivityRecord != null) {
-            activityToken = mActivityRecord.token;
-            activityWindowInfo = mActivityRecord.getActivityWindowInfo();
-        } else {
-            activityToken = null;
-            activityWindowInfo = null;
-        }
-
         if (Flags.bundleClientTransactionFlag()) {
             getProcess().scheduleClientTransactionItem(
                     WindowStateResizeItem.obtain(mClient, mClientWindowFrames, reportDraw,
@@ -4132,6 +4157,10 @@
             }
             pw.println(prefix + "mFullConfiguration=" + getConfiguration());
             pw.println(prefix + "mLastReportedConfiguration=" + getLastReportedConfiguration());
+            if (mLastReportedActivityWindowInfo != null) {
+                pw.println(prefix + "mLastReportedActivityWindowInfo="
+                        + mLastReportedActivityWindowInfo);
+            }
         }
         pw.println(prefix + "mHasSurface=" + mHasSurface
                 + " isReadyForDisplay()=" + isReadyForDisplay()
@@ -4711,7 +4740,7 @@
     }
 
     void onExitAnimationDone() {
-        if (ProtoLog.isEnabled(WM_DEBUG_ANIM)) {
+        if (ProtoLog.isEnabled(WM_DEBUG_ANIM, LogLevel.VERBOSE)) {
             final AnimationAdapter animationAdapter = mSurfaceAnimator.getAnimation();
             StringWriter sw = new StringWriter();
             if (animationAdapter != null) {
@@ -4949,8 +4978,15 @@
                 displayInfo.appWidth, displayInfo.appHeight);
         anim.restrictDuration(MAX_ANIMATION_DURATION);
         anim.scaleCurrentDuration(mWmService.getWindowAnimationScaleLocked());
+        final Point position = new Point();
+        if (com.android.window.flags.Flags.removePrepareSurfaceInPlacement()) {
+            transformFrameToSurfacePosition(mWindowFrames.mFrame.left, mWindowFrames.mFrame.top,
+                    position);
+        } else {
+            position.set(mSurfacePosition);
+        }
         final AnimationAdapter adapter = new LocalAnimationAdapter(
-                new WindowAnimationSpec(anim, mSurfacePosition, false /* canSkipFirstFrame */,
+                new WindowAnimationSpec(anim, position, false /* canSkipFirstFrame */,
                         0 /* windowCornerRadius */),
                 mWmService.mSurfaceAnimationRunner);
         startAnimation(getPendingTransaction(), adapter);
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index a242d42..6fd7aa0 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -61,6 +61,7 @@
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 
+import com.android.internal.protolog.common.LogLevel;
 import com.android.internal.protolog.common.ProtoLog;
 import com.android.server.policy.WindowManagerPolicy;
 
@@ -586,7 +587,7 @@
                             mWin.mAttrs, attr, TRANSIT_OLD_NONE);
                 }
             }
-            if (ProtoLog.isEnabled(WM_DEBUG_ANIM)) {
+            if (ProtoLog.isEnabled(WM_DEBUG_ANIM, LogLevel.VERBOSE)) {
                 ProtoLog.v(WM_DEBUG_ANIM, "applyAnimation: win=%s"
                         + " anim=%d attr=0x%x a=%s transit=%d type=%d isEntrance=%b Callers %s",
                         this, anim, attr, a, transit, mAttrType, isEntrance, Debug.getCallers(20));
diff --git a/services/core/jni/com_android_server_accessibility_BrailleDisplayConnection.cpp b/services/core/jni/com_android_server_accessibility_BrailleDisplayConnection.cpp
index c337523..180081c 100644
--- a/services/core/jni/com_android_server_accessibility_BrailleDisplayConnection.cpp
+++ b/services/core/jni/com_android_server_accessibility_BrailleDisplayConnection.cpp
@@ -32,10 +32,10 @@
 
 namespace {
 
-// Max size we allow for the result from HIDIOCGRAWUNIQ (Bluetooth address or USB serial number).
-// Copied from linux/hid.h struct hid_device->uniq char array size; the ioctl implementation
-// writes at most this many bytes to the provided buffer.
-constexpr int UNIQ_SIZE_MAX = 64;
+// Max sizes we allow for results from string ioctl calls, copied from UAPI linux/uhid.h.
+// The ioctl implementation writes at most this many bytes to the provided buffer:
+constexpr int NAME_SIZE_MAX = 128; // HIDIOCGRAWNAME (device name)
+constexpr int UNIQ_SIZE_MAX = 64;  // HIDIOCGRAWUNIQ (BT address or USB serial number)
 
 } // anonymous namespace
 
@@ -82,6 +82,16 @@
     return info.bustype;
 }
 
+static jstring com_android_server_accessibility_BrailleDisplayConnection_getHidrawName(
+        JNIEnv* env, jclass /*clazz*/, int fd) {
+    char buf[NAME_SIZE_MAX];
+    if (ioctl(fd, HIDIOCGRAWNAME(NAME_SIZE_MAX), buf) < 0) {
+        return nullptr;
+    }
+    // Local ref is not deleted because it is returned to Java
+    return env->NewStringUTF(buf);
+}
+
 static const JNINativeMethod gMethods[] = {
         {"nativeGetHidrawDescSize", "(I)I",
          (void*)com_android_server_accessibility_BrailleDisplayConnection_getHidrawDescSize},
@@ -91,6 +101,8 @@
          (void*)com_android_server_accessibility_BrailleDisplayConnection_getHidrawUniq},
         {"nativeGetHidrawBusType", "(I)I",
          (void*)com_android_server_accessibility_BrailleDisplayConnection_getHidrawBusType},
+        {"nativeGetHidrawName", "(I)Ljava/lang/String;",
+         (void*)com_android_server_accessibility_BrailleDisplayConnection_getHidrawName},
 };
 
 int register_com_android_server_accessibility_BrailleDisplayConnection(JNIEnv* env) {
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 70224db..88c47f3 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -117,7 +117,6 @@
     jmethodID notifySensorAccuracy;
     jmethodID notifyStickyModifierStateChanged;
     jmethodID notifyStylusGestureStarted;
-    jmethodID isInputMethodConnectionActive;
     jmethodID notifyVibratorState;
     jmethodID filterInputEvent;
     jmethodID interceptKeyBeforeQueueing;
@@ -311,6 +310,7 @@
     void setStylusButtonMotionEventsEnabled(bool enabled);
     FloatPoint getMouseCursorPosition(int32_t displayId);
     void setStylusPointerIconEnabled(bool enabled);
+    void setInputMethodConnectionIsActive(bool isActive);
 
     /* --- InputReaderPolicyInterface implementation --- */
 
@@ -453,6 +453,9 @@
 
         // True if a pointer icon should be shown for stylus pointers.
         bool stylusPointerIconEnabled{false};
+
+        // True if there is an active input method connection.
+        bool isInputMethodConnectionActive{false};
     } mLocked GUARDED_BY(mLock);
 
     std::atomic<bool> mInteractive;
@@ -1507,11 +1510,8 @@
 }
 
 bool NativeInputManager::isInputMethodConnectionActive() {
-    JNIEnv* env = jniEnv();
-    const jboolean result =
-            env->CallBooleanMethod(mServiceObj, gServiceClassInfo.isInputMethodConnectionActive);
-    checkAndClearExceptionFromCallback(env, "isInputMethodConnectionActive");
-    return result;
+    std::scoped_lock _l(mLock);
+    return mLocked.isInputMethodConnectionActive;
 }
 
 std::optional<DisplayViewport> NativeInputManager::getPointerViewportForAssociatedDisplay(
@@ -1862,6 +1862,15 @@
             InputReaderConfiguration::Change::DISPLAY_INFO);
 }
 
+void NativeInputManager::setInputMethodConnectionIsActive(bool isActive) {
+    { // acquire lock
+        std::scoped_lock _l(mLock);
+        mLocked.isInputMethodConnectionActive = isActive;
+    } // release lock
+
+    mInputManager->getDispatcher().setInputMethodConnectionIsActive(isActive);
+}
+
 // ----------------------------------------------------------------------------
 
 static NativeInputManager* getNativeInputManager(JNIEnv* env, jobject clazz) {
@@ -2854,6 +2863,12 @@
     }
 }
 
+static void nativeSetInputMethodConnectionIsActive(JNIEnv* env, jobject nativeImplObj,
+                                                   jboolean isActive) {
+    NativeInputManager* im = getNativeInputManager(env, nativeImplObj);
+    im->setInputMethodConnectionIsActive(isActive);
+}
+
 // ----------------------------------------------------------------------------
 
 static const JNINativeMethod gInputManagerMethods[] = {
@@ -2964,6 +2979,7 @@
          (void*)nativeSetAccessibilitySlowKeysThreshold},
         {"setAccessibilityStickyKeysEnabled", "(Z)V",
          (void*)nativeSetAccessibilityStickyKeysEnabled},
+        {"setInputMethodConnectionIsActive", "(Z)V", (void*)nativeSetInputMethodConnectionIsActive},
 };
 
 #define FIND_CLASS(var, className) \
@@ -3028,9 +3044,6 @@
     GET_METHOD_ID(gServiceClassInfo.notifyStylusGestureStarted, clazz, "notifyStylusGestureStarted",
                   "(IJ)V");
 
-    GET_METHOD_ID(gServiceClassInfo.isInputMethodConnectionActive, clazz,
-                  "isInputMethodConnectionActive", "()Z");
-
     GET_METHOD_ID(gServiceClassInfo.notifyVibratorState, clazz, "notifyVibratorState", "(IZ)V");
 
     GET_METHOD_ID(gServiceClassInfo.notifyNoFocusedWindowAnr, clazz, "notifyNoFocusedWindowAnr",
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 1f545181..f1962cb 100644
--- a/services/core/xsd/display-device-config/display-device-config.xsd
+++ b/services/core/xsd/display-device-config/display-device-config.xsd
@@ -114,7 +114,7 @@
                 <xs:element type="sensorDetails" name="screenOffBrightnessSensor">
                     <xs:annotation name="final"/>
                 </xs:element>
-                <xs:element type="sensorDetails" name="proxSensor">
+                <xs:element type="sensorDetails" name="proxSensor" maxOccurs="2">
                     <xs:annotation name="final"/>
                 </xs:element>
                 <xs:element type="sensorDetails" name="tempSensor">
@@ -162,7 +162,7 @@
                 <xs:element type="usiVersion" name="usiVersion">
                     <xs:annotation name="final"/>
                 </xs:element>
-                <xs:element type="lowBrightnessMode" name="lowBrightness">
+                <xs:element type="evenDimmerMode" name="evenDimmer">
                     <xs:attribute name="enabled" type="xs:boolean" use="optional"/>
                     <xs:annotation name="final"/>
                 </xs:element>
@@ -221,16 +221,16 @@
         </xs:restriction>
     </xs:simpleType>
 
-    <xs:complexType name="lowBrightnessMode">
+    <xs:complexType name="evenDimmerMode">
         <xs:sequence>
             <xs:element name="transitionPoint" type="nonNegativeDecimal" minOccurs="1"
                 maxOccurs="1">
             </xs:element>
-            <xs:element name="nits" type="xs:float" maxOccurs="unbounded">
+            <!-- Mapping of nits -> backlight -> brightness -->
+            <xs:element name="brightnessMapping" type="comprehensiveBrightnessMap" maxOccurs="1">
             </xs:element>
-            <xs:element name="backlight" type="xs:float" maxOccurs="unbounded">
-            </xs:element>
-            <xs:element name="brightness" type="xs:float" maxOccurs="unbounded">
+            <!-- Mapping of current lux to minimum allowed nits values. -->
+            <xs:element name="luxToMinimumNitsMap" type="nitsMap" maxOccurs="1">
             </xs:element>
         </xs:sequence>
         <xs:attribute name="enabled" type="xs:boolean" use="optional"/>
@@ -446,6 +446,35 @@
         </xs:sequence>
     </xs:complexType>
 
+    <xs:complexType name="comprehensiveBrightnessMap">
+        <xs:sequence>
+            <xs:element name="brightnessPoint" type="brightnessPoint" maxOccurs="unbounded" minOccurs="2">
+                <xs:annotation name="nonnull"/>
+                <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">
+        <xs:sequence>
+            <xs:element type="nonNegativeDecimal" name="nits">
+                <xs:annotation name="nonnull"/>
+                <xs:annotation name="final"/>
+            </xs:element>
+            <xs:element type="nonNegativeDecimal" name="backlight">
+                <xs:annotation name="nonnull"/>
+                <xs:annotation name="final"/>
+            </xs:element>
+            <xs:element type="nonNegativeDecimal" name="brightness">
+                <xs:annotation name="nonnull"/>
+                <xs:annotation name="final"/>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+
     <xs:complexType name="sdrHdrRatioMap">
         <xs:sequence>
             <xs:element name="point" type="sdrHdrRatioPoint" maxOccurs="unbounded" minOccurs="2">
@@ -475,6 +504,7 @@
     </xs:simpleType>
 
     <xs:complexType name="sensorDetails">
+        <xs:attribute name="featureFlag" type="xs:string" use="optional"/>
         <xs:sequence>
             <xs:element type="xs:string" name="type" minOccurs="0" maxOccurs="1">
                 <xs:annotation name="nullable"/>
diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt
index c39c3d7..170434c 100644
--- a/services/core/xsd/display-device-config/schema/current.txt
+++ b/services/core/xsd/display-device-config/schema/current.txt
@@ -53,6 +53,16 @@
     method public final void setType(@NonNull com.android.server.display.config.PredefinedBrightnessLimitNames);
   }
 
+  public class BrightnessPoint {
+    ctor public BrightnessPoint();
+    method @NonNull public final java.math.BigDecimal getBacklight();
+    method @NonNull public final java.math.BigDecimal getBrightness();
+    method @NonNull public final java.math.BigDecimal getNits();
+    method public final void setBacklight(@NonNull java.math.BigDecimal);
+    method public final void setBrightness(@NonNull java.math.BigDecimal);
+    method public final void setNits(@NonNull java.math.BigDecimal);
+  }
+
   public class BrightnessThresholds {
     ctor public BrightnessThresholds();
     method public final com.android.server.display.config.ThresholdPoints getBrightnessThresholdPoints();
@@ -76,6 +86,13 @@
     method public final void setThermalStatus(@NonNull com.android.server.display.config.ThermalStatus);
   }
 
+  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 {
     ctor public Density();
     method @NonNull public final java.math.BigInteger getDensity();
@@ -109,15 +126,15 @@
     method @Nullable public final com.android.server.display.config.DensityMapping getDensityMapping();
     method @NonNull public final com.android.server.display.config.Thresholds getDisplayBrightnessChangeThresholds();
     method public final com.android.server.display.config.Thresholds getDisplayBrightnessChangeThresholdsIdle();
+    method public final com.android.server.display.config.EvenDimmerMode getEvenDimmer();
     method @Nullable public final com.android.server.display.config.HdrBrightnessConfig getHdrBrightnessConfig();
     method public com.android.server.display.config.HighBrightnessMode getHighBrightnessMode();
     method public final com.android.server.display.config.IdleScreenRefreshRateTimeout getIdleScreenRefreshRateTimeout();
     method public final com.android.server.display.config.SensorDetails getLightSensor();
-    method public final com.android.server.display.config.LowBrightnessMode getLowBrightness();
     method public com.android.server.display.config.LuxThrottling getLuxThrottling();
     method @Nullable public final String getName();
     method public com.android.server.display.config.PowerThrottlingConfig getPowerThrottlingConfig();
-    method public final com.android.server.display.config.SensorDetails getProxSensor();
+    method public final java.util.List<com.android.server.display.config.SensorDetails> getProxSensor();
     method public com.android.server.display.config.DisplayQuirks getQuirks();
     method public com.android.server.display.config.RefreshRateConfigs getRefreshRate();
     method public final java.math.BigDecimal getScreenBrightnessCapForWearBedtimeMode();
@@ -146,15 +163,14 @@
     method public final void setDensityMapping(@Nullable com.android.server.display.config.DensityMapping);
     method public final void setDisplayBrightnessChangeThresholds(@NonNull com.android.server.display.config.Thresholds);
     method public final void setDisplayBrightnessChangeThresholdsIdle(com.android.server.display.config.Thresholds);
+    method public final void setEvenDimmer(com.android.server.display.config.EvenDimmerMode);
     method public final void setHdrBrightnessConfig(@Nullable com.android.server.display.config.HdrBrightnessConfig);
     method public void setHighBrightnessMode(com.android.server.display.config.HighBrightnessMode);
     method public final void setIdleScreenRefreshRateTimeout(com.android.server.display.config.IdleScreenRefreshRateTimeout);
     method public final void setLightSensor(com.android.server.display.config.SensorDetails);
-    method public final void setLowBrightness(com.android.server.display.config.LowBrightnessMode);
     method public void setLuxThrottling(com.android.server.display.config.LuxThrottling);
     method public final void setName(@Nullable String);
     method public void setPowerThrottlingConfig(com.android.server.display.config.PowerThrottlingConfig);
-    method public final void setProxSensor(com.android.server.display.config.SensorDetails);
     method public void setQuirks(com.android.server.display.config.DisplayQuirks);
     method public void setRefreshRate(com.android.server.display.config.RefreshRateConfigs);
     method public final void setScreenBrightnessCapForWearBedtimeMode(java.math.BigDecimal);
@@ -182,6 +198,18 @@
     method public java.util.List<java.lang.String> getQuirk();
   }
 
+  public class EvenDimmerMode {
+    ctor public EvenDimmerMode();
+    method public com.android.server.display.config.ComprehensiveBrightnessMap getBrightnessMapping();
+    method public boolean getEnabled();
+    method public com.android.server.display.config.NitsMap getLuxToMinimumNitsMap();
+    method public java.math.BigDecimal getTransitionPoint();
+    method public void setBrightnessMapping(com.android.server.display.config.ComprehensiveBrightnessMap);
+    method public void setEnabled(boolean);
+    method public void setLuxToMinimumNitsMap(com.android.server.display.config.NitsMap);
+    method public void setTransitionPoint(java.math.BigDecimal);
+  }
+
   public class HbmTiming {
     ctor public HbmTiming();
     method @NonNull public final java.math.BigInteger getTimeMaxSecs_all();
@@ -250,17 +278,6 @@
     method public java.util.List<java.math.BigInteger> getItem();
   }
 
-  public class LowBrightnessMode {
-    ctor public LowBrightnessMode();
-    method public java.util.List<java.lang.Float> getBacklight();
-    method public java.util.List<java.lang.Float> getBrightness();
-    method public boolean getEnabled();
-    method public java.util.List<java.lang.Float> getNits();
-    method public java.math.BigDecimal getTransitionPoint();
-    method public void setEnabled(boolean);
-    method public void setTransitionPoint(java.math.BigDecimal);
-  }
-
   public class LuxThrottling {
     ctor public LuxThrottling();
     method @NonNull public final java.util.List<com.android.server.display.config.BrightnessLimitMap> getBrightnessLimitMap();
@@ -403,10 +420,12 @@
 
   public class SensorDetails {
     ctor public SensorDetails();
+    method public String getFeatureFlag();
     method @Nullable public final String getName();
     method @Nullable public final com.android.server.display.config.RefreshRateRange getRefreshRate();
     method @Nullable public final com.android.server.display.config.NonNegativeFloatToFloatMap getSupportedModes();
     method @Nullable public final String getType();
+    method public void setFeatureFlag(String);
     method public final void setName(@Nullable String);
     method public final void setRefreshRate(@Nullable com.android.server.display.config.RefreshRateRange);
     method public final void setSupportedModes(@Nullable com.android.server.display.config.NonNegativeFloatToFloatMap);
diff --git a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java
index f5ba50d..bb46c44 100644
--- a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.credentials.ClearCredentialStateException;
 import android.credentials.ClearCredentialStateRequest;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.IClearCredentialStateCallback;
 import android.credentials.selection.ProviderData;
@@ -41,7 +42,7 @@
 public final class ClearRequestSession extends RequestSession<ClearCredentialStateRequest,
         IClearCredentialStateCallback, Void>
         implements ProviderSession.ProviderInternalCallback<Void> {
-    private static final String TAG = "GetRequestSession";
+    private static final String TAG = CredentialManager.TAG;
 
     public ClearRequestSession(Context context, RequestSession.SessionLifetime sessionCallback,
             Object lock, int userId, int callingUid,
diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
index cac42b1..3513cb5 100644
--- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java
@@ -50,7 +50,7 @@
 public final class CreateRequestSession extends RequestSession<CreateCredentialRequest,
         ICreateCredentialCallback, CreateCredentialResponse>
         implements ProviderSession.ProviderInternalCallback<CreateCredentialResponse> {
-    private static final String TAG = "CreateRequestSession";
+    private static final String TAG = CredentialManager.TAG;
     private final Set<ComponentName> mPrimaryProviders;
 
     CreateRequestSession(@NonNull Context context, RequestSession.SessionLifetime sessionCallback,
diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
index 281fb1c..6ef1436 100644
--- a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
+++ b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
@@ -34,6 +34,7 @@
 import android.credentials.ClearCredentialStateRequest;
 import android.credentials.CreateCredentialException;
 import android.credentials.CreateCredentialRequest;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialOption;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.GetCandidateCredentialsException;
@@ -92,7 +93,7 @@
         extends AbstractMasterSystemService<
         CredentialManagerService, CredentialManagerServiceImpl> {
 
-    private static final String TAG = "CredManSysService";
+    private static final String TAG = CredentialManager.TAG;
     private static final String PERMISSION_DENIED_ERROR = "permission_denied";
     private static final String PERMISSION_DENIED_WRITE_SECURE_SETTINGS_ERROR =
             "Caller is missing WRITE_SECURE_SETTINGS permission";
diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerServiceImpl.java b/services/credentials/java/com/android/server/credentials/CredentialManagerServiceImpl.java
index 379800b..38ad5b6 100644
--- a/services/credentials/java/com/android/server/credentials/CredentialManagerServiceImpl.java
+++ b/services/credentials/java/com/android/server/credentials/CredentialManagerServiceImpl.java
@@ -21,6 +21,7 @@
 import android.content.ComponentName;
 import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialProviderInfo;
 import android.service.credentials.CredentialProviderInfoFactory;
 import android.util.Slog;
@@ -36,7 +37,7 @@
  */
 public final class CredentialManagerServiceImpl extends
         AbstractPerUserSystemService<CredentialManagerServiceImpl, CredentialManagerService> {
-    private static final String TAG = "CredManSysServiceImpl";
+    private static final String TAG = CredentialManager.TAG;
 
     @GuardedBy("mLock")
     @NonNull
@@ -93,7 +94,10 @@
     public ProviderSession initiateProviderSessionForRequestLocked(
             RequestSession requestSession, List<String> requestOptions) {
         if (!requestOptions.isEmpty() && !isServiceCapableLocked(requestOptions)) {
-            Slog.i(TAG, "Service does not have the required capabilities");
+            if (mInfo != null) {
+                Slog.i(TAG, "Service does not have the required capabilities: "
+                        + mInfo.getComponentName());
+            }
             return null;
         }
         if (mInfo == null) {
diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java
index 24f6697..bfa2d61 100644
--- a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java
+++ b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java
@@ -48,7 +48,6 @@
 
 /** Initiates the Credential Manager UI and receives results. */
 public class CredentialManagerUi {
-    private static final String TAG = "CredentialManagerUi";
     @NonNull
     private final CredentialManagerUiCallback mCallbacks;
     @NonNull
diff --git a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java
index fd2a9a2..69d32a0 100644
--- a/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/GetCandidateRequestSession.java
@@ -22,6 +22,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.credentials.Constants;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.GetCandidateCredentialsException;
 import android.credentials.GetCandidateCredentialsResponse;
@@ -54,7 +55,7 @@
 public class GetCandidateRequestSession extends RequestSession<GetCredentialRequest,
         IGetCandidateCredentialsCallback, GetCandidateCredentialsResponse>
         implements ProviderSession.ProviderInternalCallback<GetCredentialResponse> {
-    private static final String TAG = "GetCandidateRequestSession";
+    private static final String TAG = CredentialManager.TAG;
 
     private static final String SESSION_ID_KEY = "autofill_session_id";
     private static final String REQUEST_ID_KEY = "autofill_request_id";
diff --git a/services/credentials/java/com/android/server/credentials/GetRequestSession.java b/services/credentials/java/com/android/server/credentials/GetRequestSession.java
index d55d8ef..c26229b 100644
--- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java
@@ -20,6 +20,7 @@
 import android.annotation.Nullable;
 import android.content.ComponentName;
 import android.content.Context;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialOption;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.GetCredentialException;
@@ -48,7 +49,7 @@
 public class GetRequestSession extends RequestSession<GetCredentialRequest,
         IGetCredentialCallback, GetCredentialResponse>
         implements ProviderSession.ProviderInternalCallback<GetCredentialResponse> {
-    private static final String TAG = "GetRequestSession";
+    private static final String TAG = CredentialManager.TAG;
 
     public GetRequestSession(Context context, RequestSession.SessionLifetime sessionCallback,
             Object lock, int userId, int callingUid,
diff --git a/services/credentials/java/com/android/server/credentials/MetricUtilities.java b/services/credentials/java/com/android/server/credentials/MetricUtilities.java
index 16bf1778..ac4aac6 100644
--- a/services/credentials/java/com/android/server/credentials/MetricUtilities.java
+++ b/services/credentials/java/com/android/server/credentials/MetricUtilities.java
@@ -20,6 +20,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.credentials.CredentialManager;
 import android.util.Slog;
 
 import com.android.internal.util.FrameworkStatsLog;
@@ -44,7 +45,7 @@
 public class MetricUtilities {
     private static final boolean LOG_FLAG = true;
 
-    private static final String TAG = "MetricUtilities";
+    private static final String TAG = CredentialManager.TAG;
     public static final String USER_CANCELED_SUBSTRING = "TYPE_USER_CANCELED";
     public static final int MIN_EMIT_WAIT_TIME_MS = 10;
 
diff --git a/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java b/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java
index e4b5c77..f6b107b 100644
--- a/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/PrepareGetRequestSession.java
@@ -21,6 +21,7 @@
 import android.app.PendingIntent;
 import android.content.ComponentName;
 import android.content.Context;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialOption;
 import android.credentials.GetCredentialRequest;
 import android.credentials.IGetCredentialCallback;
@@ -44,7 +45,7 @@
  * responses from providers, and the UX app, and updates the provider(s) state.
  */
 public class PrepareGetRequestSession extends GetRequestSession {
-    private static final String TAG = "PrepareGetRequestSession";
+    private static final String TAG = CredentialManager.TAG;
 
     private final IPrepareGetCredentialCallback mPrepareGetCredentialCallback;
 
diff --git a/services/credentials/java/com/android/server/credentials/ProviderClearSession.java b/services/credentials/java/com/android/server/credentials/ProviderClearSession.java
index 6a1b1db7..6759dbb 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderClearSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderClearSession.java
@@ -20,6 +20,7 @@
 import android.annotation.UserIdInt;
 import android.content.Context;
 import android.credentials.ClearCredentialStateException;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.selection.ProviderData;
 import android.credentials.selection.ProviderPendingIntentResponse;
@@ -37,7 +38,7 @@
         Void>
         implements
         RemoteCredentialService.ProviderCallbacks<Void> {
-    private static final String TAG = "ProviderClearSession";
+    private static final String TAG = CredentialManager.TAG;
 
     private ClearCredentialStateException mProviderException;
 
diff --git a/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java b/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java
index 6361aeb..bee7f6c 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java
@@ -24,6 +24,7 @@
 import android.content.Intent;
 import android.credentials.CreateCredentialException;
 import android.credentials.CreateCredentialResponse;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.selection.CreateCredentialProviderData;
 import android.credentials.selection.Entry;
@@ -51,7 +52,7 @@
  */
 public final class ProviderCreateSession extends ProviderSession<
         BeginCreateCredentialRequest, BeginCreateCredentialResponse> {
-    private static final String TAG = "ProviderCreateSession";
+    private static final String TAG = CredentialManager.TAG;
 
     // Key to be used as an entry key for a save entry
     public static final String SAVE_ENTRY_KEY = "save_entry_key";
diff --git a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java
index c5f2921..e18ef2b 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java
@@ -22,6 +22,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialOption;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.GetCredentialException;
@@ -61,7 +62,7 @@
         BeginGetCredentialResponse>
         implements
         RemoteCredentialService.ProviderCallbacks<BeginGetCredentialResponse> {
-    private static final String TAG = "ProviderGetSession";
+    private static final String TAG = CredentialManager.TAG;
     // Key to be used as the entry key for an action entry
     public static final String ACTION_ENTRY_KEY = "action_key";
     // Key to be used as the entry key for the authentication entry
diff --git a/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java b/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java
index f162916..83f9c24 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java
@@ -22,6 +22,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialOption;
 import android.credentials.GetCredentialException;
 import android.credentials.GetCredentialResponse;
@@ -58,7 +59,7 @@
 public class ProviderRegistryGetSession extends ProviderSession<CredentialOption,
         Set<CredentialDescriptionRegistry.FilterResult>> {
 
-    private static final String TAG = "ProviderRegistryGetSession";
+    private static final String TAG = CredentialManager.TAG;
     @VisibleForTesting
     static final String CREDENTIAL_ENTRY_KEY = "credential_key";
 
diff --git a/services/credentials/java/com/android/server/credentials/ProviderSession.java b/services/credentials/java/com/android/server/credentials/ProviderSession.java
index dfc08f0..8f0ae90 100644
--- a/services/credentials/java/com/android/server/credentials/ProviderSession.java
+++ b/services/credentials/java/com/android/server/credentials/ProviderSession.java
@@ -24,6 +24,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.credentials.Credential;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.selection.ProviderData;
 import android.credentials.selection.ProviderPendingIntentResponse;
@@ -44,7 +45,7 @@
 public abstract class ProviderSession<T, R>
         implements RemoteCredentialService.ProviderCallbacks<R> {
 
-    private static final String TAG = "ProviderSession";
+    private static final String TAG = CredentialManager.TAG;
 
     @NonNull
     protected final Context mContext;
diff --git a/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java b/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java
index 4bcf8be..c361406 100644
--- a/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java
+++ b/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java
@@ -23,6 +23,7 @@
 import android.content.Intent;
 import android.credentials.ClearCredentialStateException;
 import android.credentials.CreateCredentialException;
+import android.credentials.CredentialManager;
 import android.credentials.GetCredentialException;
 import android.os.Binder;
 import android.os.Handler;
@@ -58,7 +59,7 @@
  */
 public class RemoteCredentialService extends ServiceConnector.Impl<ICredentialProviderService> {
 
-    private static final String TAG = "RemoteCredentialService";
+    private static final String TAG = CredentialManager.TAG;
     /** Timeout for a single request. */
     private static final long TIMEOUT_REQUEST_MILLIS = 3 * DateUtils.SECOND_IN_MILLIS;
     /** Timeout to unbind after the task queue is empty. */
diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java
index a5b9aa6..054ba2b 100644
--- a/services/credentials/java/com/android/server/credentials/RequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/RequestSession.java
@@ -23,6 +23,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.credentials.CredentialManager;
 import android.credentials.CredentialProviderInfo;
 import android.credentials.flags.Flags;
 import android.credentials.selection.ProviderData;
@@ -56,7 +57,7 @@
  * every time a new response type is expected from the providers.
  */
 abstract class RequestSession<T, U, V> implements CredentialManagerUi.CredentialManagerUiCallback {
-    private static final String TAG = "RequestSession";
+    private static final String TAG = CredentialManager.TAG;
 
     public interface SessionLifetime {
         /** Called when the user makes a selection. */
diff --git a/services/devicepolicy/TEST_MAPPING b/services/devicepolicy/TEST_MAPPING
index 0d5534b..b8cb4a9 100644
--- a/services/devicepolicy/TEST_MAPPING
+++ b/services/devicepolicy/TEST_MAPPING
@@ -26,5 +26,12 @@
         }
       ]
     }
+  ],
+  "postsubmit": [
+    {
+      // TODO(b/332974906): Promote in presubmit presubmit-devicepolicy.
+      "name": "CtsDevicePolicyManagerTestCases_NoFlakes_NoLarge",
+      "name": "CtsDevicePolicyManagerTestCases_ParentProfileApiDisabled"
+    }
   ]
 }
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BundlePolicySerializer.java b/services/devicepolicy/java/com/android/server/devicepolicy/BundlePolicySerializer.java
index 82f9aad..d24afabe 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/BundlePolicySerializer.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/BundlePolicySerializer.java
@@ -92,7 +92,7 @@
                 while (count > 0 && (type = parser.next()) != XmlPullParser.END_DOCUMENT) {
                     if (type == XmlPullParser.START_TAG
                             && parser.getName().equals(TAG_VALUE)) {
-                        values.add(parser.nextText().trim());
+                        values.add(parser.nextText());
                         count--;
                     }
                 }
@@ -111,7 +111,7 @@
                 restrictions.putParcelableArray(key,
                         bundleList.toArray(new Bundle[bundleList.size()]));
             } else {
-                String value = parser.nextText().trim();
+                String value = parser.nextText();
                 if (ATTR_TYPE_BOOLEAN.equals(valType)) {
                     restrictions.putBoolean(key, Boolean.parseBoolean(value));
                 } else if (ATTR_TYPE_INTEGER.equals(valType)) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
index 6aeb4fd5..f39d019 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
@@ -1640,6 +1640,10 @@
                     mAdminPolicySize.get(admin.getUserId()).get(admin) - sizeOf(
                             policyState.getPoliciesSetByAdmins().get(admin)));
         }
+        if (!mAdminPolicySize.contains(admin.getUserId())
+                || !mAdminPolicySize.get(admin.getUserId()).containsKey(admin)) {
+            return;
+        }
         if (mAdminPolicySize.get(admin.getUserId()).get(admin) <= 0) {
             mAdminPolicySize.get(admin.getUserId()).remove(admin);
         }
@@ -1671,19 +1675,29 @@
     public void dump(IndentingPrintWriter pw) {
         synchronized (mLock) {
             pw.println("Local Policies: ");
+            pw.increaseIndent();
             for (int i = 0; i < mLocalPolicies.size(); i++) {
-                for (PolicyKey policy : mLocalPolicies.get(mLocalPolicies.keyAt(i)).keySet()) {
-                    PolicyState<?> policyState = mLocalPolicies.get(
-                            mLocalPolicies.keyAt(i)).get(policy);
-                    pw.println(policyState);
+                int userId = mLocalPolicies.keyAt(i);
+                pw.printf("User %d:\n", userId);
+                pw.increaseIndent();
+                for (PolicyKey policy : mLocalPolicies.get(userId).keySet()) {
+                    PolicyState<?> policyState = mLocalPolicies.get(userId).get(policy);
+                    policyState.dump(pw);
+                    pw.println();
                 }
+                pw.decreaseIndent();
             }
+            pw.decreaseIndent();
             pw.println();
+
             pw.println("Global Policies: ");
+            pw.increaseIndent();
             for (PolicyKey policy : mGlobalPolicies.keySet()) {
                 PolicyState<?> policyState = mGlobalPolicies.get(policy);
-                pw.println(policyState);
+                policyState.dump(pw);
+                pw.println();
             }
+            pw.decreaseIndent();
         }
     }
 
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index f955b91..1dd719e 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -727,7 +727,6 @@
 
         SYSTEM_SETTINGS_ALLOWLIST = new ArraySet<>();
         SYSTEM_SETTINGS_ALLOWLIST.add(Settings.System.SCREEN_BRIGHTNESS);
-        SYSTEM_SETTINGS_ALLOWLIST.add(Settings.System.SCREEN_BRIGHTNESS_FLOAT);
         SYSTEM_SETTINGS_ALLOWLIST.add(Settings.System.SCREEN_BRIGHTNESS_MODE);
         SYSTEM_SETTINGS_ALLOWLIST.add(Settings.System.SCREEN_OFF_TIMEOUT);
 
@@ -888,6 +887,8 @@
     private static final String APPLICATION_EXEMPTIONS_FLAG = "application_exemptions";
     private static final boolean DEFAULT_APPLICATION_EXEMPTIONS_FLAG = true;
 
+    private static final int RETRY_COPY_ACCOUNT_ATTEMPTS = 3;
+
     /**
      * For apps targeting U+
      * Enable multiple admins to coexist on the same device.
@@ -9028,7 +9029,13 @@
 
     void sendDeviceOwnerOrProfileOwnerCommand(String action, Bundle extras, int userId) {
         if (userId == UserHandle.USER_ALL) {
-            userId = UserHandle.USER_SYSTEM;
+            if (Flags.headlessDeviceOwnerDelegateSecurityLoggingBugFix()
+                    && getHeadlessDeviceOwnerModeForDeviceOwner()
+                    == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER) {
+                userId = mOwners.getDeviceOwnerUserId();
+            } else {
+                userId = UserHandle.USER_SYSTEM;
+            }
         }
         boolean inForeground = false;
         ComponentName receiverComponent = null;
@@ -11502,10 +11509,17 @@
 
     @Override
     public void setApplicationRestrictions(ComponentName who, String callerPackage,
-            String packageName, Bundle restrictions) {
+            String packageName, Bundle restrictions, boolean parent) {
         final CallerIdentity caller = getCallerIdentity(who, callerPackage);
         checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_APPLICATION_RESTRICTIONS);
 
+        // This check is eventually made in UMS, checking here to fail early.
+        String validationResult =
+                FrameworkParsingPackageUtils.validateName(packageName, false, false);
+        if (validationResult != null) {
+            throw new IllegalArgumentException("Invalid package name: " + validationResult);
+        }
+
         if (isUnicornFlagEnabled()) {
             EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin(
                     who,
@@ -11513,12 +11527,6 @@
                     caller.getPackageName(),
                     caller.getUserId()
             );
-            // This check is eventually made in UMS, checking here to fail early.
-            String validationResult =
-                    FrameworkParsingPackageUtils.validateName(packageName, false, false);
-            if (validationResult != null) {
-                throw new IllegalArgumentException("Invalid package name: " + validationResult);
-            }
 
             if (restrictions == null || restrictions.isEmpty()) {
                 mDevicePolicyEngine.removeLocalPolicy(
@@ -11534,6 +11542,57 @@
             }
             setBackwardsCompatibleAppRestrictions(
                     caller, packageName, restrictions, caller.getUserHandle());
+        } else if (Flags.dmrhCanSetAppRestriction()) {
+            final boolean isRoleHolder;
+            if (who != null) {
+                // DO or PO
+                Preconditions.checkCallAuthorization(
+                        (isProfileOwner(caller) || isDefaultDeviceOwner(caller)));
+                Preconditions.checkCallAuthorization(!parent,
+                        "DO or PO cannot call this on parent");
+                // Caller has opted to be treated as DPC (by passing a non-null who), so don't
+                // consider it as the DMRH, even if the caller is both the DPC and the DMRH.
+                isRoleHolder = false;
+            } else {
+                // Delegates, or the DMRH. Only DMRH can call this on COPE parent
+                isRoleHolder = isCallerDevicePolicyManagementRoleHolder(caller);
+                if (parent) {
+                    Preconditions.checkCallAuthorization(isRoleHolder);
+                    Preconditions.checkState(isOrganizationOwnedDeviceWithManagedProfile(),
+                            "Role Holder can only operate parent app restriction on COPE devices");
+                } else {
+                    Preconditions.checkCallAuthorization(isRoleHolder
+                            || isCallerDelegate(caller, DELEGATION_APP_RESTRICTIONS));
+                }
+            }
+            // DMRH caller uses policy engine, others still use legacy code path
+            if (isRoleHolder) {
+                EnforcingAdmin enforcingAdmin = getEnforcingAdminForCaller(/* who */ null,
+                        caller.getPackageName());
+                int affectedUserId = parent
+                        ? getProfileParentId(caller.getUserId()) : caller.getUserId();
+                if (restrictions == null || restrictions.isEmpty()) {
+                    mDevicePolicyEngine.removeLocalPolicy(
+                            PolicyDefinition.APPLICATION_RESTRICTIONS(packageName),
+                            enforcingAdmin,
+                            affectedUserId);
+                } else {
+                    mDevicePolicyEngine.setLocalPolicy(
+                            PolicyDefinition.APPLICATION_RESTRICTIONS(packageName),
+                            enforcingAdmin,
+                            new BundlePolicyValue(restrictions),
+                            affectedUserId);
+                }
+                Intent changeIntent = new Intent(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED);
+                changeIntent.setPackage(packageName);
+                changeIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
+                mContext.sendBroadcastAsUser(changeIntent, UserHandle.of(affectedUserId));
+            } else {
+                mInjector.binderWithCleanCallingIdentity(() -> {
+                    mUserManager.setApplicationRestrictions(packageName, restrictions,
+                            caller.getUserHandle());
+                });
+            }
         } else {
             Preconditions.checkCallAuthorization((caller.hasAdminComponent()
                     && (isProfileOwner(caller) || isDefaultDeviceOwner(caller)))
@@ -12816,7 +12875,7 @@
         Slogf.i(LOG_TAG, "Stopping user %d", userId);
         final long id = mInjector.binderClearCallingIdentity();
         try {
-            switch (mInjector.getIActivityManager().stopUser(userId, true /*force*/, null)) {
+            switch (mInjector.getIActivityManager().stopUserWithCallback(userId, null)) {
                 case ActivityManager.USER_OP_SUCCESS:
                     return UserManager.USER_OPERATION_SUCCESS;
                 case ActivityManager.USER_OP_IS_CURRENT:
@@ -12865,7 +12924,7 @@
 
     @Override
     public Bundle getApplicationRestrictions(ComponentName who, String callerPackage,
-            String packageName) {
+            String packageName, boolean parent) {
         final CallerIdentity caller = getCallerIdentity(who, callerPackage);
 
         if (isUnicornFlagEnabled()) {
@@ -12884,6 +12943,50 @@
                 return Bundle.EMPTY;
             }
             return policies.get(enforcingAdmin).getValue();
+        } else if (Flags.dmrhCanSetAppRestriction()) {
+            final boolean isRoleHolder;
+            if (who != null) {
+                // Caller is DO or PO. They cannot call this on parent
+                Preconditions.checkCallAuthorization(!parent
+                        && (isProfileOwner(caller) || isDefaultDeviceOwner(caller)));
+                // Caller has opted to be treated as DPC (by passing a non-null who), so don't
+                // consider it as the DMRH, even if the caller is both the DPC and the DMRH.
+                isRoleHolder = false;
+            } else {
+                // Caller is delegates or the DMRH. Only DMRH can call this on parent
+                isRoleHolder = isCallerDevicePolicyManagementRoleHolder(caller);
+                if (parent) {
+                    Preconditions.checkCallAuthorization(isRoleHolder);
+                    Preconditions.checkState(isOrganizationOwnedDeviceWithManagedProfile(),
+                            "Role Holder can only operate parent app restriction on COPE devices");
+                } else {
+                    Preconditions.checkCallAuthorization(isRoleHolder
+                            || isCallerDelegate(caller, DELEGATION_APP_RESTRICTIONS));
+                }
+            }
+            if (isRoleHolder) {
+                EnforcingAdmin enforcingAdmin = getEnforcingAdminForCaller(/* who */ null,
+                        caller.getPackageName());
+                int affectedUserId = parent
+                        ? getProfileParentId(caller.getUserId()) : caller.getUserId();
+                LinkedHashMap<EnforcingAdmin, PolicyValue<Bundle>> policies =
+                        mDevicePolicyEngine.getLocalPoliciesSetByAdmins(
+                                PolicyDefinition.APPLICATION_RESTRICTIONS(packageName),
+                                affectedUserId);
+                if (!policies.containsKey(enforcingAdmin)) {
+                    return Bundle.EMPTY;
+                }
+                return policies.get(enforcingAdmin).getValue();
+            } else {
+                return mInjector.binderWithCleanCallingIdentity(() -> {
+                    Bundle bundle = mUserManager.getApplicationRestrictions(packageName,
+                            caller.getUserHandle());
+                    // if no restrictions were saved, mUserManager.getApplicationRestrictions
+                    // returns null, but DPM method should return an empty Bundle as per JavaDoc
+                    return bundle != null ? bundle : Bundle.EMPTY;
+                });
+            }
+
         } else {
             Preconditions.checkCallAuthorization((caller.hasAdminComponent()
                     && (isProfileOwner(caller) || isDefaultDeviceOwner(caller)))
@@ -15804,19 +15907,16 @@
             for (EnforcingAdmin admin : policies.keySet()) {
                 restrictions.add(policies.get(admin).getValue());
             }
-            if (!restrictions.isEmpty()) {
-                return restrictions;
-            }
 
             return mInjector.binderWithCleanCallingIdentity(() -> {
-                // Could be a device that has a DPC that hasn't migrated yet, so just return any
+                // Could be a device that has a DPC that hasn't migrated yet, so also return any
                 // restrictions saved in userManager.
                 Bundle bundle = mUserManager.getApplicationRestrictions(
                         packageName, UserHandle.of(userId));
-                if (bundle == null || bundle.isEmpty()) {
-                    return new ArrayList<>();
+                if (bundle != null && !bundle.isEmpty()) {
+                    restrictions.add(bundle);
                 }
-                return List.of(bundle);
+                return restrictions;
             });
         }
 
@@ -21514,13 +21614,26 @@
             Slogf.w(LOG_TAG, "sourceUser and targetUser are the same, won't migrate account.");
             return;
         }
-        copyAccount(targetUser, sourceUser, accountToMigrate, callerPackage);
+
+        if (Flags.copyAccountWithRetryEnabled()) {
+            boolean copySucceeded = false;
+            int retryAttemptsLeft = RETRY_COPY_ACCOUNT_ATTEMPTS;
+            while (!copySucceeded && (retryAttemptsLeft > 0)) {
+                Slogf.i(LOG_TAG, "Copying account. Attempts left : " + retryAttemptsLeft);
+                copySucceeded =
+                        copyAccount(targetUser, sourceUser, accountToMigrate, callerPackage);
+                retryAttemptsLeft--;
+            }
+        } else {
+            copyAccount(targetUser, sourceUser, accountToMigrate, callerPackage);
+        }
         if (!keepAccountMigrated) {
             removeAccount(accountToMigrate, sourceUserId);
         }
+
     }
 
-    private void copyAccount(
+    private boolean copyAccount(
             UserHandle targetUser, UserHandle sourceUser, Account accountToMigrate,
             String callerPackage) {
         final long startTime = SystemClock.elapsedRealtime();
@@ -21538,6 +21651,8 @@
                         DevicePolicyEnums.PLATFORM_PROVISIONING_COPY_ACCOUNT_MS,
                         startTime,
                         callerPackage);
+                Slogf.i(LOG_TAG, "Copy account successful to " + targetUser);
+                return true;
             } else {
                 logCopyAccountStatus(COPY_ACCOUNT_FAILED, callerPackage);
                 Slogf.e(LOG_TAG, "Failed to copy account to " + targetUser);
@@ -21550,6 +21665,7 @@
             logCopyAccountStatus(COPY_ACCOUNT_EXCEPTION, callerPackage);
             Slogf.e(LOG_TAG, "Exception copying account to " + targetUser, e);
         }
+        return false;
     }
 
     private static void logCopyAccountStatus(@CopyAccountStatus int status, String callerPackage) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/EnforcingAdmin.java b/services/devicepolicy/java/com/android/server/devicepolicy/EnforcingAdmin.java
index 49ffb0d..d234dee 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/EnforcingAdmin.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/EnforcingAdmin.java
@@ -325,8 +325,22 @@
 
     @Override
     public String toString() {
-        return "EnforcingAdmin { mPackageName= " + mPackageName + ", mComponentName= "
-                + mComponentName + ", mAuthorities= " + mAuthorities + ", mUserId= "
-                + mUserId + ", mIsRoleAuthority= " + mIsRoleAuthority + " }\n";
+        StringBuilder sb = new StringBuilder();
+        sb.append("EnforcingAdmin { mPackageName= ");
+        sb.append(mPackageName);
+        if (mComponentName != null) {
+            sb.append(", mComponentName= ");
+            sb.append(mComponentName);
+        }
+        if (mAuthorities != null) {
+            sb.append(", mAuthorities= ");
+            sb.append(mAuthorities);
+        }
+        sb.append(", mUserId= ");
+        sb.append(mUserId);
+        sb.append(", mIsRoleAuthority= ");
+        sb.append(mIsRoleAuthority);
+        sb.append(" }");
+        return sb.toString();
     }
 }
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java
index c2e370e..c544ebc 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyState.java
@@ -19,6 +19,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.admin.PolicyValue;
+import android.util.IndentingPrintWriter;
 
 import com.android.internal.util.XmlUtils;
 import com.android.modules.utils.TypedXmlPullParser;
@@ -195,6 +196,33 @@
                 + ",\nmCurrentResolvedPolicy= \n\t" + mCurrentResolvedPolicy + " }";
     }
 
+    public void dump(IndentingPrintWriter pw) {
+        pw.println(mPolicyDefinition.getPolicyKey());
+        pw.increaseIndent();
+
+        pw.println("Per-admin Policy");
+        pw.increaseIndent();
+        if (mPoliciesSetByAdmins.size() == 0) {
+            pw.println("null");
+        } else {
+            for (EnforcingAdmin admin : mPoliciesSetByAdmins.keySet()) {
+                pw.println(admin);
+                pw.increaseIndent();
+                pw.println(mPoliciesSetByAdmins.get(admin));
+                pw.decreaseIndent();
+            }
+        }
+        pw.decreaseIndent();
+
+        pw.printf("Resolved Policy (%s):\n",
+                mPolicyDefinition.getResolutionMechanism().getClass().getSimpleName());
+        pw.increaseIndent();
+        pw.println(mCurrentResolvedPolicy);
+        pw.decreaseIndent();
+
+        pw.decreaseIndent();
+    }
+
     void saveToXml(TypedXmlSerializer serializer) throws IOException {
         serializer.startTag(/* namespace= */ null, TAG_POLICY_DEFINITION_ENTRY);
         mPolicyDefinition.saveToXml(serializer);
diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp
index 6ad8d79..6393e11 100644
--- a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp
+++ b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp
@@ -1,6 +1,7 @@
 aconfig_declarations {
     name: "device_state_flags",
     package: "com.android.server.policy.feature.flags",
+    container: "system",
     srcs: [
         "device_state_flags.aconfig",
     ],
diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig
index 29e258c..21e33dd 100644
--- a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig
+++ b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.policy.feature.flags"
+container: "system"
 
 flag {
     name: "enable_dual_display_blocking"
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index e202bbf..3c6b500 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -108,29 +108,50 @@
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.widget.ILockSettings;
 import com.android.internal.widget.LockSettingsInternal;
+import com.android.server.accessibility.AccessibilityManagerService;
+import com.android.server.accounts.AccountManagerService;
 import com.android.server.adaptiveauth.AdaptiveAuthService;
+import com.android.server.adb.AdbService;
+import com.android.server.alarm.AlarmManagerService;
 import com.android.server.am.ActivityManagerService;
+import com.android.server.ambientcontext.AmbientContextManagerService;
+import com.android.server.app.GameManagerService;
 import com.android.server.appbinding.AppBindingService;
+import com.android.server.apphibernation.AppHibernationService;
 import com.android.server.appop.AppOpMigrationHelper;
 import com.android.server.appop.AppOpMigrationHelperImpl;
+import com.android.server.appprediction.AppPredictionManagerService;
+import com.android.server.appwidget.AppWidgetService;
 import com.android.server.art.ArtModuleServiceInitializer;
 import com.android.server.art.DexUseManagerLocal;
 import com.android.server.attention.AttentionManagerService;
 import com.android.server.audio.AudioService;
+import com.android.server.autofill.AutofillManagerService;
+import com.android.server.backup.BackupManagerService;
 import com.android.server.biometrics.AuthService;
 import com.android.server.biometrics.BiometricService;
 import com.android.server.biometrics.sensors.face.FaceService;
 import com.android.server.biometrics.sensors.fingerprint.FingerprintService;
 import com.android.server.biometrics.sensors.iris.IrisService;
+import com.android.server.blob.BlobStoreManagerService;
 import com.android.server.broadcastradio.BroadcastRadioService;
 import com.android.server.camera.CameraServiceProxy;
 import com.android.server.clipboard.ClipboardService;
+import com.android.server.companion.CompanionDeviceManagerService;
+import com.android.server.companion.virtual.VirtualDeviceManagerService;
 import com.android.server.compat.PlatformCompat;
 import com.android.server.compat.PlatformCompatNative;
+import com.android.server.compat.overrides.AppCompatOverridesService;
+import com.android.server.connectivity.IpConnectivityMetrics;
 import com.android.server.connectivity.PacProxyService;
+import com.android.server.content.ContentService;
 import com.android.server.contentcapture.ContentCaptureManagerInternal;
+import com.android.server.contentcapture.ContentCaptureManagerService;
+import com.android.server.contentsuggestions.ContentSuggestionsManagerService;
+import com.android.server.contextualsearch.ContextualSearchManagerService;
 import com.android.server.coverage.CoverageService;
 import com.android.server.cpu.CpuMonitorService;
+import com.android.server.credentials.CredentialManagerService;
 import com.android.server.criticalevents.CriticalEventLog;
 import com.android.server.devicepolicy.DevicePolicyManagerService;
 import com.android.server.devicestate.DeviceStateManagerService;
@@ -147,14 +168,20 @@
 import com.android.server.input.InputManagerService;
 import com.android.server.inputmethod.InputMethodManagerService;
 import com.android.server.integrity.AppIntegrityManagerService;
+import com.android.server.job.JobSchedulerService;
 import com.android.server.lights.LightsService;
 import com.android.server.locales.LocaleManagerService;
 import com.android.server.location.LocationManagerService;
 import com.android.server.location.altitude.AltitudeService;
+import com.android.server.locksettings.LockSettingsService;
 import com.android.server.logcat.LogcatManagerService;
+import com.android.server.media.MediaResourceMonitorService;
 import com.android.server.media.MediaRouterService;
+import com.android.server.media.MediaSessionService;
 import com.android.server.media.metrics.MediaMetricsManagerService;
 import com.android.server.media.projection.MediaProjectionManagerService;
+import com.android.server.midi.MidiService;
+import com.android.server.musicrecognition.MusicRecognitionManagerService;
 import com.android.server.net.NetworkManagementService;
 import com.android.server.net.NetworkPolicyManagerService;
 import com.android.server.net.watchlist.NetworkWatchlistService;
@@ -195,12 +222,16 @@
 import com.android.server.power.ThermalManagerService;
 import com.android.server.power.hint.HintManagerService;
 import com.android.server.powerstats.PowerStatsService;
+import com.android.server.print.PrintManagerService;
 import com.android.server.profcollect.ProfcollectForwardingService;
 import com.android.server.recoverysystem.RecoverySystemService;
 import com.android.server.resources.ResourcesManagerService;
 import com.android.server.restrictions.RestrictionsManagerService;
 import com.android.server.role.RoleServicePlatformHelper;
+import com.android.server.rollback.RollbackManagerService;
 import com.android.server.rotationresolver.RotationResolverManagerService;
+import com.android.server.search.SearchManagerService;
+import com.android.server.searchui.SearchUiManagerService;
 import com.android.server.security.AttestationVerificationManagerService;
 import com.android.server.security.FileIntegrityService;
 import com.android.server.security.KeyAttestationApplicationIdProviderService;
@@ -210,16 +241,28 @@
 import com.android.server.sensorprivacy.SensorPrivacyService;
 import com.android.server.sensors.SensorService;
 import com.android.server.signedconfig.SignedConfigService;
+import com.android.server.slice.SliceManagerService;
+import com.android.server.smartspace.SmartspaceManagerService;
 import com.android.server.soundtrigger.SoundTriggerService;
 import com.android.server.soundtrigger_middleware.SoundTriggerMiddlewareService;
+import com.android.server.speech.SpeechRecognitionManagerService;
+import com.android.server.stats.bootstrap.StatsBootstrapAtomService;
+import com.android.server.stats.pull.StatsPullAtomService;
 import com.android.server.statusbar.StatusBarManagerService;
 import com.android.server.storage.DeviceStorageMonitorService;
+import com.android.server.systemcaptions.SystemCaptionsManagerService;
 import com.android.server.telecom.TelecomLoaderService;
 import com.android.server.testharness.TestHarnessModeService;
 import com.android.server.textclassifier.TextClassificationManagerService;
 import com.android.server.textservices.TextServicesManagerService;
+import com.android.server.texttospeech.TextToSpeechManagerService;
+import com.android.server.timedetector.GnssTimeUpdateService;
 import com.android.server.timedetector.NetworkTimeUpdateService;
+import com.android.server.timedetector.TimeDetectorService;
+import com.android.server.timezonedetector.TimeZoneDetectorService;
+import com.android.server.timezonedetector.location.LocationTimeZoneManagerService;
 import com.android.server.tracing.TracingServiceProxy;
+import com.android.server.translation.TranslationManagerService;
 import com.android.server.trust.TrustManagerService;
 import com.android.server.tv.TvInputManagerService;
 import com.android.server.tv.TvRemoteService;
@@ -227,10 +270,15 @@
 import com.android.server.tv.tunerresourcemanager.TunerResourceManagerService;
 import com.android.server.twilight.TwilightService;
 import com.android.server.uri.UriGrantsManagerService;
+import com.android.server.usage.StorageStatsService;
 import com.android.server.usage.UsageStatsService;
+import com.android.server.usb.UsbService;
 import com.android.server.utils.TimingsTraceAndSlog;
 import com.android.server.vibrator.VibratorManagerService;
+import com.android.server.voiceinteraction.VoiceInteractionManagerService;
 import com.android.server.vr.VrManagerService;
+import com.android.server.wallpaper.WallpaperManagerService;
+import com.android.server.wallpapereffectsgeneration.WallpaperEffectsGenerationManagerService;
 import com.android.server.wearable.WearableSensingManagerService;
 import com.android.server.webkit.WebViewUpdateService;
 import com.android.server.wm.ActivityTaskManagerService;
@@ -268,44 +316,20 @@
      * Implementation class names. TODO: Move them to a codegen class or load
      * them from the build system somehow.
      */
-    private static final String BACKUP_MANAGER_SERVICE_CLASS =
-            "com.android.server.backup.BackupManagerService$Lifecycle";
-    private static final String APPWIDGET_SERVICE_CLASS =
-            "com.android.server.appwidget.AppWidgetService";
     private static final String ARC_NETWORK_SERVICE_CLASS =
             "com.android.server.arc.net.ArcNetworkService";
     private static final String ARC_PERSISTENT_DATA_BLOCK_SERVICE_CLASS =
             "com.android.server.arc.persistent_data_block.ArcPersistentDataBlockService";
     private static final String ARC_SYSTEM_HEALTH_SERVICE =
             "com.android.server.arc.health.ArcSystemHealthService";
-    private static final String VOICE_RECOGNITION_MANAGER_SERVICE_CLASS =
-            "com.android.server.voiceinteraction.VoiceInteractionManagerService";
-    private static final String APP_HIBERNATION_SERVICE_CLASS =
-            "com.android.server.apphibernation.AppHibernationService";
-    private static final String PRINT_MANAGER_SERVICE_CLASS =
-            "com.android.server.print.PrintManagerService";
-    private static final String COMPANION_DEVICE_MANAGER_SERVICE_CLASS =
-            "com.android.server.companion.CompanionDeviceManagerService";
-    private static final String VIRTUAL_DEVICE_MANAGER_SERVICE_CLASS =
-            "com.android.server.companion.virtual.VirtualDeviceManagerService";
     private static final String STATS_COMPANION_APEX_PATH =
             "/apex/com.android.os.statsd/javalib/service-statsd.jar";
+    private static final String STATS_COMPANION_LIFECYCLE_CLASS =
+            "com.android.server.stats.StatsCompanion$Lifecycle";
     private static final String SCHEDULING_APEX_PATH =
             "/apex/com.android.scheduling/javalib/service-scheduling.jar";
     private static final String REBOOT_READINESS_LIFECYCLE_CLASS =
             "com.android.server.scheduling.RebootReadinessManagerService$Lifecycle";
-    private static final String CONNECTIVITY_SERVICE_APEX_PATH =
-            "/apex/com.android.tethering/javalib/service-connectivity.jar";
-    private static final String STATS_COMPANION_LIFECYCLE_CLASS =
-            "com.android.server.stats.StatsCompanion$Lifecycle";
-    private static final String STATS_PULL_ATOM_SERVICE_CLASS =
-            "com.android.server.stats.pull.StatsPullAtomService";
-    private static final String STATS_BOOTSTRAP_ATOM_SERVICE_LIFECYCLE_CLASS =
-            "com.android.server.stats.bootstrap.StatsBootstrapAtomService$Lifecycle";
-    private static final String USB_SERVICE_CLASS =
-            "com.android.server.usb.UsbService$Lifecycle";
-    private static final String MIDI_SERVICE_CLASS =
-            "com.android.server.midi.MidiService$Lifecycle";
     private static final String WIFI_APEX_SERVICE_JAR_PATH =
             "/apex/com.android.wifi/javalib/service-wifi.jar";
     private static final String WIFI_SERVICE_CLASS =
@@ -320,18 +344,6 @@
             "com.android.server.wifi.p2p.WifiP2pService";
     private static final String LOWPAN_SERVICE_CLASS =
             "com.android.server.lowpan.LowpanService";
-    private static final String JOB_SCHEDULER_SERVICE_CLASS =
-            "com.android.server.job.JobSchedulerService";
-    private static final String LOCK_SETTINGS_SERVICE_CLASS =
-            "com.android.server.locksettings.LockSettingsService$Lifecycle";
-    private static final String RESOURCE_ECONOMY_SERVICE_CLASS =
-            "com.android.server.tare.InternalResourceService";
-    private static final String STORAGE_MANAGER_SERVICE_CLASS =
-            "com.android.server.StorageManagerService$Lifecycle";
-    private static final String STORAGE_STATS_SERVICE_CLASS =
-            "com.android.server.usage.StorageStatsService$Lifecycle";
-    private static final String SEARCH_MANAGER_SERVICE_CLASS =
-            "com.android.server.search.SearchManagerService$Lifecycle";
     private static final String THERMAL_OBSERVER_CLASS =
             "com.android.clockwork.ThermalObserver";
     private static final String WEAR_CONNECTIVITY_SERVICE_CLASS =
@@ -356,91 +368,26 @@
             "com.android.clockwork.settings.WearSettingsService";
     private static final String WRIST_ORIENTATION_SERVICE_CLASS =
             "com.android.clockwork.wristorientation.WristOrientationService";
-    private static final String ACCOUNT_SERVICE_CLASS =
-            "com.android.server.accounts.AccountManagerService$Lifecycle";
-    private static final String CONTENT_SERVICE_CLASS =
-            "com.android.server.content.ContentService$Lifecycle";
-    private static final String WALLPAPER_SERVICE_CLASS =
-            "com.android.server.wallpaper.WallpaperManagerService$Lifecycle";
-    private static final String AUTO_FILL_MANAGER_SERVICE_CLASS =
-            "com.android.server.autofill.AutofillManagerService";
-    private static final String CREDENTIAL_MANAGER_SERVICE_CLASS =
-            "com.android.server.credentials.CredentialManagerService";
-    private static final String CONTENT_CAPTURE_MANAGER_SERVICE_CLASS =
-            "com.android.server.contentcapture.ContentCaptureManagerService";
-    private static final String TRANSLATION_MANAGER_SERVICE_CLASS =
-            "com.android.server.translation.TranslationManagerService";
-    private static final String MUSIC_RECOGNITION_MANAGER_SERVICE_CLASS =
-            "com.android.server.musicrecognition.MusicRecognitionManagerService";
-    private static final String AMBIENT_CONTEXT_MANAGER_SERVICE_CLASS =
-            "com.android.server.ambientcontext.AmbientContextManagerService";
-    private static final String SYSTEM_CAPTIONS_MANAGER_SERVICE_CLASS =
-            "com.android.server.systemcaptions.SystemCaptionsManagerService";
-    private static final String TEXT_TO_SPEECH_MANAGER_SERVICE_CLASS =
-            "com.android.server.texttospeech.TextToSpeechManagerService";
+
     private static final String IOT_SERVICE_CLASS =
             "com.android.things.server.IoTSystemService";
-    private static final String SLICE_MANAGER_SERVICE_CLASS =
-            "com.android.server.slice.SliceManagerService$Lifecycle";
     private static final String CAR_SERVICE_HELPER_SERVICE_CLASS =
             "com.android.internal.car.CarServiceHelperService";
-    private static final String TIME_DETECTOR_SERVICE_CLASS =
-            "com.android.server.timedetector.TimeDetectorService$Lifecycle";
-    private static final String TIME_ZONE_DETECTOR_SERVICE_CLASS =
-            "com.android.server.timezonedetector.TimeZoneDetectorService$Lifecycle";
-    private static final String LOCATION_TIME_ZONE_MANAGER_SERVICE_CLASS =
-            "com.android.server.timezonedetector.location.LocationTimeZoneManagerService$Lifecycle";
-    private static final String GNSS_TIME_UPDATE_SERVICE_CLASS =
-            "com.android.server.timedetector.GnssTimeUpdateService$Lifecycle";
-    private static final String ACCESSIBILITY_MANAGER_SERVICE_CLASS =
-            "com.android.server.accessibility.AccessibilityManagerService$Lifecycle";
-    private static final String ADB_SERVICE_CLASS =
-            "com.android.server.adb.AdbService$Lifecycle";
-    private static final String SPEECH_RECOGNITION_MANAGER_SERVICE_CLASS =
-            "com.android.server.speech.SpeechRecognitionManagerService";
-    private static final String WALLPAPER_EFFECTS_GENERATION_MANAGER_SERVICE_CLASS =
-            "com.android.server.wallpapereffectsgeneration.WallpaperEffectsGenerationManagerService";
-    private static final String APP_PREDICTION_MANAGER_SERVICE_CLASS =
-            "com.android.server.appprediction.AppPredictionManagerService";
-    private static final String CONTENT_SUGGESTIONS_SERVICE_CLASS =
-            "com.android.server.contentsuggestions.ContentSuggestionsManagerService";
-    private static final String SEARCH_UI_MANAGER_SERVICE_CLASS =
-            "com.android.server.searchui.SearchUiManagerService";
-    private static final String SMARTSPACE_MANAGER_SERVICE_CLASS =
-            "com.android.server.smartspace.SmartspaceManagerService";
-    private static final String CONTEXTUAL_SEARCH_MANAGER_SERVICE_CLASS =
-            "com.android.server.contextualsearch.ContextualSearchManagerService";
-    private static final String DEVICE_IDLE_CONTROLLER_CLASS =
-            "com.android.server.DeviceIdleController";
-    private static final String BLOB_STORE_MANAGER_SERVICE_CLASS =
-            "com.android.server.blob.BlobStoreManagerService";
     private static final String APPSEARCH_MODULE_LIFECYCLE_CLASS =
             "com.android.server.appsearch.AppSearchModule$Lifecycle";
     private static final String ISOLATED_COMPILATION_SERVICE_CLASS =
             "com.android.server.compos.IsolatedCompilationService";
-    private static final String ROLLBACK_MANAGER_SERVICE_CLASS =
-            "com.android.server.rollback.RollbackManagerService";
-    private static final String ALARM_MANAGER_SERVICE_CLASS =
-            "com.android.server.alarm.AlarmManagerService";
-    private static final String MEDIA_SESSION_SERVICE_CLASS =
-            "com.android.server.media.MediaSessionService";
-    private static final String MEDIA_RESOURCE_MONITOR_SERVICE_CLASS =
-            "com.android.server.media.MediaResourceMonitorService";
+    private static final String CONNECTIVITY_SERVICE_APEX_PATH =
+            "/apex/com.android.tethering/javalib/service-connectivity.jar";
     private static final String CONNECTIVITY_SERVICE_INITIALIZER_CLASS =
             "com.android.server.ConnectivityServiceInitializer";
     private static final String NETWORK_STATS_SERVICE_INITIALIZER_CLASS =
             "com.android.server.NetworkStatsServiceInitializer";
-    private static final String IP_CONNECTIVITY_METRICS_CLASS =
-            "com.android.server.connectivity.IpConnectivityMetrics";
     private static final String MEDIA_COMMUNICATION_SERVICE_CLASS =
             "com.android.server.media.MediaCommunicationService";
-    private static final String APP_COMPAT_OVERRIDES_SERVICE_CLASS =
-            "com.android.server.compat.overrides.AppCompatOverridesService$Lifecycle";
     private static final String HEALTHCONNECT_MANAGER_SERVICE_CLASS =
             "com.android.server.healthconnect.HealthConnectManagerService";
     private static final String ROLE_SERVICE_CLASS = "com.android.role.RoleService";
-    private static final String GAME_MANAGER_SERVICE_CLASS =
-            "com.android.server.app.GameManagerService$Lifecycle";
     private static final String ENHANCED_CONFIRMATION_SERVICE_CLASS =
             "com.android.ecm.EnhancedConfirmationService";
 
@@ -463,6 +410,7 @@
                     + "OnDevicePersonalizationSystemService$Lifecycle";
     private static final String UPDATABLE_DEVICE_CONFIG_SERVICE_CLASS =
             "com.android.server.deviceconfig.DeviceConfigInit$Lifecycle";
+
     private static final String DEVICE_LOCK_SERVICE_CLASS =
             "com.android.server.devicelock.DeviceLockService";
     private static final String DEVICE_LOCK_APEX_PATH =
@@ -1437,7 +1385,7 @@
 
         // Manages apk rollbacks.
         t.traceBegin("StartRollbackManagerService");
-        mSystemServiceManager.startService(ROLLBACK_MANAGER_SERVICE_CLASS);
+        mSystemServiceManager.startService(RollbackManagerService.class);
         t.traceEnd();
 
         // Tracks native tombstones.
@@ -1582,11 +1530,11 @@
 
             // The AccountManager must come before the ContentService
             t.traceBegin("StartAccountManagerService");
-            mSystemServiceManager.startService(ACCOUNT_SERVICE_CLASS);
+            mSystemServiceManager.startService(AccountManagerService.Lifecycle.class);
             t.traceEnd();
 
             t.traceBegin("StartContentService");
-            mSystemServiceManager.startService(CONTENT_SERVICE_CLASS);
+            mSystemServiceManager.startService(ContentService.Lifecycle.class);
             t.traceEnd();
 
             t.traceBegin("InstallSystemProviders");
@@ -1640,13 +1588,8 @@
             }
 
             // TODO(aml-jobscheduler): Think about how to do it properly.
-            t.traceBegin("StartResourceEconomy");
-            mSystemServiceManager.startService(RESOURCE_ECONOMY_SERVICE_CLASS);
-            t.traceEnd();
-
-            // TODO(aml-jobscheduler): Think about how to do it properly.
             t.traceBegin("StartAlarmManagerService");
-            mSystemServiceManager.startService(ALARM_MANAGER_SERVICE_CLASS);
+            mSystemServiceManager.startService(AlarmManagerService.class);
             t.traceEnd();
 
             t.traceBegin("StartInputManagerService");
@@ -1728,7 +1671,7 @@
             }
 
             t.traceBegin("IpConnectivityMetrics");
-            mSystemServiceManager.startService(IP_CONNECTIVITY_METRICS_CLASS);
+            mSystemServiceManager.startService(IpConnectivityMetrics.class);
             t.traceEnd();
 
             t.traceBegin("NetworkWatchlistService");
@@ -1803,7 +1746,7 @@
 
             t.traceBegin("StartAccessibilityManagerService");
             try {
-                mSystemServiceManager.startService(ACCESSIBILITY_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(AccessibilityManagerService.Lifecycle.class);
             } catch (Throwable e) {
                 reportWtf("starting Accessibility Manager", e);
             }
@@ -1826,7 +1769,7 @@
                      * NotificationManagerService is dependant on StorageManagerService,
                      * (for media / usb notifications) so we must start StorageManagerService first.
                      */
-                    mSystemServiceManager.startService(STORAGE_MANAGER_SERVICE_CLASS);
+                    mSystemServiceManager.startService(StorageManagerService.Lifecycle.class);
                     storageManager = IStorageManager.Stub.asInterface(
                             ServiceManager.getService("mount"));
                 } catch (Throwable e) {
@@ -1836,7 +1779,7 @@
 
                 t.traceBegin("StartStorageStatsService");
                 try {
-                    mSystemServiceManager.startService(STORAGE_STATS_SERVICE_CLASS);
+                    mSystemServiceManager.startService(StorageStatsService.Lifecycle.class);
                 } catch (Throwable e) {
                     reportWtf("starting StorageStatsService", e);
                 }
@@ -1867,7 +1810,7 @@
         t.traceEnd();
 
         t.traceBegin("StartAppHibernationService");
-        mSystemServiceManager.startService(APP_HIBERNATION_SERVICE_CLASS);
+        mSystemServiceManager.startService(AppHibernationService.class);
         t.traceEnd();
 
         t.traceBegin("ArtManagerLocal");
@@ -1899,7 +1842,7 @@
         } else {
             t.traceBegin("StartLockSettingsService");
             try {
-                mSystemServiceManager.startService(LOCK_SETTINGS_SERVICE_CLASS);
+                mSystemServiceManager.startService(LockSettingsService.Lifecycle.class);
                 lockSettings = ILockSettings.Stub.asInterface(
                         ServiceManager.getService("lock_settings"));
             } catch (Throwable e) {
@@ -1932,7 +1875,7 @@
             }
 
             t.traceBegin("StartDeviceIdleController");
-            mSystemServiceManager.startService(DEVICE_IDLE_CONTROLLER_CLASS);
+            mSystemServiceManager.startService(DeviceIdleController.class);
             t.traceEnd();
 
             // Always start the Device Policy Manager, so that the API is compatible with
@@ -1955,7 +1898,7 @@
             if (deviceHasConfigString(context,
                     R.string.config_defaultMusicRecognitionService)) {
                 t.traceBegin("StartMusicRecognitionManagerService");
-                mSystemServiceManager.startService(MUSIC_RECOGNITION_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(MusicRecognitionManagerService.class);
                 t.traceEnd();
             } else {
                 Slog.d(TAG,
@@ -1973,7 +1916,7 @@
             if (deviceHasConfigString(
                     context, R.string.config_defaultAmbientContextDetectionService)) {
                 t.traceBegin("StartAmbientContextService");
-                mSystemServiceManager.startService(AMBIENT_CONTEXT_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(AmbientContextManagerService.class);
                 t.traceEnd();
             } else {
                 Slog.d(TAG, "AmbientContextManagerService not defined by OEM or disabled by flag");
@@ -1981,13 +1924,13 @@
 
             // System Speech Recognition Service
             t.traceBegin("StartSpeechRecognitionManagerService");
-            mSystemServiceManager.startService(SPEECH_RECOGNITION_MANAGER_SERVICE_CLASS);
+            mSystemServiceManager.startService(SpeechRecognitionManagerService.class);
             t.traceEnd();
 
             // App prediction manager service
             if (deviceHasConfigString(context, R.string.config_defaultAppPredictionService)) {
                 t.traceBegin("StartAppPredictionService");
-                mSystemServiceManager.startService(APP_PREDICTION_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(AppPredictionManagerService.class);
                 t.traceEnd();
             } else {
                 Slog.d(TAG, "AppPredictionService not defined by OEM");
@@ -1996,7 +1939,7 @@
             // Content suggestions manager service
             if (deviceHasConfigString(context, R.string.config_defaultContentSuggestionsService)) {
                 t.traceBegin("StartContentSuggestionsService");
-                mSystemServiceManager.startService(CONTENT_SUGGESTIONS_SERVICE_CLASS);
+                mSystemServiceManager.startService(ContentSuggestionsManagerService.class);
                 t.traceEnd();
             } else {
                 Slog.d(TAG, "ContentSuggestionsService not defined by OEM");
@@ -2005,14 +1948,14 @@
             // Search UI manager service
             if (deviceHasConfigString(context, R.string.config_defaultSearchUiService)) {
                 t.traceBegin("StartSearchUiService");
-                mSystemServiceManager.startService(SEARCH_UI_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(SearchUiManagerService.class);
                 t.traceEnd();
             }
 
             // Smartspace manager service
             if (deviceHasConfigString(context, R.string.config_defaultSmartspaceService)) {
                 t.traceBegin("StartSmartspaceService");
-                mSystemServiceManager.startService(SMARTSPACE_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(SmartspaceManagerService.class);
                 t.traceEnd();
             } else {
                 Slog.d(TAG, "SmartspaceManagerService not defined by OEM or disabled by flag");
@@ -2022,7 +1965,7 @@
             if (deviceHasConfigString(context,
                     R.string.config_defaultContextualSearchPackageName)) {
                 t.traceBegin("StartContextualSearchService");
-                mSystemServiceManager.startService(CONTEXTUAL_SEARCH_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(ContextualSearchManagerService.class);
                 t.traceEnd();
             } else {
                 Slog.d(TAG, "ContextualSearchManagerService not defined or disabled by flag");
@@ -2221,7 +2164,7 @@
 
             t.traceBegin("StartTimeDetectorService");
             try {
-                mSystemServiceManager.startService(TIME_DETECTOR_SERVICE_CLASS);
+                mSystemServiceManager.startService(TimeDetectorService.Lifecycle.class);
             } catch (Throwable e) {
                 reportWtf("starting TimeDetectorService service", e);
             }
@@ -2242,7 +2185,7 @@
 
             t.traceBegin("StartTimeZoneDetectorService");
             try {
-                mSystemServiceManager.startService(TIME_ZONE_DETECTOR_SERVICE_CLASS);
+                mSystemServiceManager.startService(TimeZoneDetectorService.Lifecycle.class);
             } catch (Throwable e) {
                 reportWtf("starting TimeZoneDetectorService service", e);
             }
@@ -2258,7 +2201,7 @@
 
             t.traceBegin("StartLocationTimeZoneManagerService");
             try {
-                mSystemServiceManager.startService(LOCATION_TIME_ZONE_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(LocationTimeZoneManagerService.Lifecycle.class);
             } catch (Throwable e) {
                 reportWtf("starting LocationTimeZoneManagerService service", e);
             }
@@ -2267,7 +2210,7 @@
             if (context.getResources().getBoolean(R.bool.config_enableGnssTimeUpdateService)) {
                 t.traceBegin("StartGnssTimeUpdateService");
                 try {
-                    mSystemServiceManager.startService(GNSS_TIME_UPDATE_SERVICE_CLASS);
+                    mSystemServiceManager.startService(GnssTimeUpdateService.Lifecycle.class);
                 } catch (Throwable e) {
                     reportWtf("starting GnssTimeUpdateService service", e);
                 }
@@ -2277,7 +2220,7 @@
             if (!isWatch) {
                 t.traceBegin("StartSearchManagerService");
                 try {
-                    mSystemServiceManager.startService(SEARCH_MANAGER_SERVICE_CLASS);
+                    mSystemServiceManager.startService(SearchManagerService.Lifecycle.class);
                 } catch (Throwable e) {
                     reportWtf("starting Search Service", e);
                 }
@@ -2286,7 +2229,7 @@
 
             if (context.getResources().getBoolean(R.bool.config_enableWallpaperService)) {
                 t.traceBegin("StartWallpaperManagerService");
-                mSystemServiceManager.startService(WALLPAPER_SERVICE_CLASS);
+                mSystemServiceManager.startService(WallpaperManagerService.Lifecycle.class);
                 t.traceEnd();
             } else {
                 Slog.i(TAG, "Wallpaper service disabled by config");
@@ -2296,8 +2239,7 @@
             if (deviceHasConfigString(context,
                 R.string.config_defaultWallpaperEffectsGenerationService)) {
                 t.traceBegin("StartWallpaperEffectsGenerationService");
-                mSystemServiceManager.startService(
-                    WALLPAPER_EFFECTS_GENERATION_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(WallpaperEffectsGenerationManagerService.class);
                 t.traceEnd();
             }
 
@@ -2352,14 +2294,14 @@
             if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
                 // Start MIDI Manager service
                 t.traceBegin("StartMidiManager");
-                mSystemServiceManager.startService(MIDI_SERVICE_CLASS);
+                mSystemServiceManager.startService(MidiService.Lifecycle.class);
                 t.traceEnd();
             }
 
             // Start ADB Debugging Service
             t.traceBegin("StartAdbService");
             try {
-                mSystemServiceManager.startService(ADB_SERVICE_CLASS);
+                mSystemServiceManager.startService(AdbService.Lifecycle.class);
             } catch (Throwable e) {
                 Slog.e(TAG, "Failure starting AdbService");
             }
@@ -2371,7 +2313,7 @@
                     || Build.IS_EMULATOR) {
                 // Manage USB host and device support
                 t.traceBegin("StartUsbService");
-                mSystemServiceManager.startService(USB_SERVICE_CLASS);
+                mSystemServiceManager.startService(UsbService.Lifecycle.class);
                 t.traceEnd();
             }
 
@@ -2403,7 +2345,7 @@
 
             // TODO(aml-jobscheduler): Think about how to do it properly.
             t.traceBegin("StartJobScheduler");
-            mSystemServiceManager.startService(JOB_SCHEDULER_SERVICE_CLASS);
+            mSystemServiceManager.startService(JobSchedulerService.class);
             t.traceEnd();
 
             t.traceBegin("StartSoundTrigger");
@@ -2416,14 +2358,14 @@
 
             if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_BACKUP)) {
                 t.traceBegin("StartBackupManager");
-                mSystemServiceManager.startService(BACKUP_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(BackupManagerService.Lifecycle.class);
                 t.traceEnd();
             }
 
             if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_APP_WIDGETS)
                     || context.getResources().getBoolean(R.bool.config_enableAppWidgetService)) {
                 t.traceBegin("StartAppWidgetService");
-                mSystemServiceManager.startService(APPWIDGET_SERVICE_CLASS);
+                mSystemServiceManager.startService(AppWidgetService.class);
                 t.traceEnd();
             }
 
@@ -2432,7 +2374,7 @@
             // of initializing various settings.  It will internally modify its behavior
             // based on that feature.
             t.traceBegin("StartVoiceRecognitionManager");
-            mSystemServiceManager.startService(VOICE_RECOGNITION_MANAGER_SERVICE_CLASS);
+            mSystemServiceManager.startService(VoiceInteractionManagerService.class);
             t.traceEnd();
 
             if (GestureLauncherService.isGestureLauncherEnabled(context.getResources())) {
@@ -2493,7 +2435,7 @@
             }
 
             t.traceBegin(START_BLOB_STORE_SERVICE);
-            mSystemServiceManager.startService(BLOB_STORE_MANAGER_SERVICE_CLASS);
+            mSystemServiceManager.startService(BlobStoreManagerService.class);
             t.traceEnd();
 
             // Dreams (interactive idle-time views, a/k/a screen savers, and doze mode)
@@ -2514,7 +2456,7 @@
 
             if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_PRINTING)) {
                 t.traceBegin("StartPrintManager");
-                mSystemServiceManager.startService(PRINT_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(PrintManagerService.class);
                 t.traceEnd();
             }
 
@@ -2524,13 +2466,13 @@
 
             if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_COMPANION_DEVICE_SETUP)) {
                 t.traceBegin("StartCompanionDeviceManager");
-                mSystemServiceManager.startService(COMPANION_DEVICE_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(CompanionDeviceManagerService.class);
                 t.traceEnd();
             }
 
             if (context.getResources().getBoolean(R.bool.config_enableVirtualDeviceManager)) {
                 t.traceBegin("StartVirtualDeviceManager");
-                mSystemServiceManager.startService(VIRTUAL_DEVICE_MANAGER_SERVICE_CLASS);
+                mSystemServiceManager.startService(VirtualDeviceManagerService.class);
                 t.traceEnd();
             }
 
@@ -2539,7 +2481,7 @@
             t.traceEnd();
 
             t.traceBegin("StartMediaSessionService");
-            mSystemServiceManager.startService(MEDIA_SESSION_SERVICE_CLASS);
+            mSystemServiceManager.startService(MediaSessionService.class);
             t.traceEnd();
 
             if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_HDMI_CEC)) {
@@ -2570,7 +2512,7 @@
 
             if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) {
                 t.traceBegin("StartMediaResourceMonitor");
-                mSystemServiceManager.startService(MEDIA_RESOURCE_MONITOR_SERVICE_CLASS);
+                mSystemServiceManager.startService(MediaResourceMonitorService.class);
                 t.traceEnd();
             }
 
@@ -2742,7 +2684,7 @@
 
         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_SLICES_DISABLED)) {
             t.traceBegin("StartSliceManagerService");
-            mSystemServiceManager.startService(SLICE_MANAGER_SERVICE_CLASS);
+            mSystemServiceManager.startService(SliceManagerService.Lifecycle.class);
             t.traceEnd();
         }
 
@@ -2766,12 +2708,12 @@
 
         // Statsd pulled atoms
         t.traceBegin("StartStatsPullAtomService");
-        mSystemServiceManager.startService(STATS_PULL_ATOM_SERVICE_CLASS);
+        mSystemServiceManager.startService(StatsPullAtomService.class);
         t.traceEnd();
 
         // Log atoms to statsd from bootstrap processes.
         t.traceBegin("StatsBootstrapAtomService");
-        mSystemServiceManager.startService(STATS_BOOTSTRAP_ATOM_SERVICE_LIFECYCLE_CLASS);
+        mSystemServiceManager.startService(StatsBootstrapAtomService.Lifecycle.class);
         t.traceEnd();
 
         // Incidentd and dumpstated helper
@@ -2818,7 +2760,7 @@
 
         if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOFILL)) {
             t.traceBegin("StartAutoFillService");
-            mSystemServiceManager.startService(AUTO_FILL_MANAGER_SERVICE_CLASS);
+            mSystemServiceManager.startService(AutofillManagerService.class);
             t.traceEnd();
         }
 
@@ -2827,13 +2769,12 @@
                     DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_CREDENTIAL,
                     CredentialManager.DEVICE_CONFIG_ENABLE_CREDENTIAL_MANAGER, true);
             if (credentialManagerEnabled) {
-                if(isWatch &&
-                  !android.credentials.flags.Flags.wearCredentialManagerEnabled()) {
-                  Slog.d(TAG, "CredentialManager disabled on wear.");
+                if (isWatch && !android.credentials.flags.Flags.wearCredentialManagerEnabled()) {
+                    Slog.d(TAG, "CredentialManager disabled on wear.");
                 } else {
-                  t.traceBegin("StartCredentialManagerService");
-                  mSystemServiceManager.startService(CREDENTIAL_MANAGER_SERVICE_CLASS);
-                  t.traceEnd();
+                    t.traceBegin("StartCredentialManagerService");
+                    mSystemServiceManager.startService(CredentialManagerService.class);
+                    t.traceEnd();
                 }
             } else {
                 Slog.d(TAG, "CredentialManager disabled.");
@@ -2843,7 +2784,7 @@
         // Translation manager service
         if (deviceHasConfigString(context, R.string.config_defaultTranslationService)) {
             t.traceBegin("StartTranslationManagerService");
-            mSystemServiceManager.startService(TRANSLATION_MANAGER_SERVICE_CLASS);
+            mSystemServiceManager.startService(TranslationManagerService.class);
             t.traceEnd();
         } else {
             Slog.d(TAG, "TranslationService not defined by OEM");
@@ -2987,7 +2928,7 @@
         t.traceEnd();
 
         t.traceBegin("GameManagerService");
-        mSystemServiceManager.startService(GAME_MANAGER_SERVICE_CLASS);
+        mSystemServiceManager.startService(GameManagerService.Lifecycle.class);
         t.traceEnd();
 
         if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_UWB)) {
@@ -3019,7 +2960,7 @@
         t.traceEnd();
 
         t.traceBegin("AppCompatOverridesService");
-        mSystemServiceManager.startService(APP_COMPAT_OVERRIDES_SERVICE_CLASS);
+        mSystemServiceManager.startService(AppCompatOverridesService.Lifecycle.class);
         t.traceEnd();
 
         t.traceBegin("HealthConnectManagerService");
@@ -3404,14 +3345,14 @@
         }
 
         t.traceBegin("StartSystemCaptionsManagerService");
-        mSystemServiceManager.startService(SYSTEM_CAPTIONS_MANAGER_SERVICE_CLASS);
+        mSystemServiceManager.startService(SystemCaptionsManagerService.class);
         t.traceEnd();
     }
 
     private void startTextToSpeechManagerService(@NonNull Context context,
             @NonNull TimingsTraceAndSlog t) {
         t.traceBegin("StartTextToSpeechManagerService");
-        mSystemServiceManager.startService(TEXT_TO_SPEECH_MANAGER_SERVICE_CLASS);
+        mSystemServiceManager.startService(TextToSpeechManagerService.class);
         t.traceEnd();
     }
 
@@ -3446,7 +3387,7 @@
         }
 
         t.traceBegin("StartContentCaptureService");
-        mSystemServiceManager.startService(CONTENT_CAPTURE_MANAGER_SERVICE_CLASS);
+        mSystemServiceManager.startService(ContentCaptureManagerService.class);
 
         ContentCaptureManagerInternal ccmi =
                 LocalServices.getService(ContentCaptureManagerInternal.class);
diff --git a/services/permission/TEST_MAPPING b/services/permission/TEST_MAPPING
index 00bfcd3..4de4a56 100644
--- a/services/permission/TEST_MAPPING
+++ b/services/permission/TEST_MAPPING
@@ -103,6 +103,28 @@
                     "include-filter": "android.permission.cts.PermissionMaxSdkVersionTest"
                 }
             ]
+        },
+        {
+            "name": "CtsVirtualDevicesAudioTestCases",
+            "options": [
+                {
+                    "exclude-annotation": "androidx.test.filters.FlakyTest"
+                },
+                {
+                    "include-filter": "android.virtualdevice.cts.audio.VirtualAudioPermissionTest"
+                }
+            ]
+        },
+        {
+            "name": "CtsVirtualDevicesAppLaunchTestCases",
+            "options": [
+                {
+                    "exclude-annotation": "androidx.test.filters.FlakyTest"
+                },
+                {
+                    "include-filter": "android.virtualdevice.cts.applaunch.VirtualDevicePermissionTest"
+                }
+            ]
         }
     ],
     "imports": [
diff --git a/services/permission/java/com/android/server/permission/access/AccessPolicy.kt b/services/permission/java/com/android/server/permission/access/AccessPolicy.kt
index 36bea7d..3675834 100644
--- a/services/permission/java/com/android/server/permission/access/AccessPolicy.kt
+++ b/services/permission/java/com/android/server/permission/access/AccessPolicy.kt
@@ -16,6 +16,7 @@
 
 package com.android.server.permission.access
 
+import android.permission.flags.Flags
 import android.util.Slog
 import com.android.modules.utils.BinaryXmlPullParser
 import com.android.modules.utils.BinaryXmlSerializer
@@ -78,6 +79,9 @@
             setPackageStates(packageStates)
             setDisabledSystemPackageStates(disabledSystemPackageStates)
             packageStates.forEach { (_, packageState) ->
+                if (Flags.ignoreApexPermissions() && packageState.isApex) {
+                    return@forEach
+                }
                 mutateAppIdPackageNames()
                     .mutateOrPut(packageState.appId) { MutableIndexedListSet() }
                     .add(packageState.packageName)
@@ -103,6 +107,9 @@
         newState.mutateUserStatesNoWrite()[userId] = MutableUserState()
         forEachSchemePolicy { with(it) { onUserAdded(userId) } }
         newState.externalState.packageStates.forEach { (_, packageState) ->
+            if (Flags.ignoreApexPermissions() && packageState.isApex) {
+                return@forEach
+            }
             upgradePackageVersion(packageState, userId)
         }
     }
@@ -126,6 +133,9 @@
             setPackageStates(packageStates)
             setDisabledSystemPackageStates(disabledSystemPackageStates)
             packageStates.forEach { (packageName, packageState) ->
+                if (Flags.ignoreApexPermissions() && packageState.isApex) {
+                    return@forEach
+                }
                 if (packageState.volumeUuid == volumeUuid) {
                     // The APK for a package on a mounted storage volume may still be unavailable
                     // due to APK being deleted, e.g. after an OTA.
@@ -151,6 +161,9 @@
             with(it) { onStorageVolumeMounted(volumeUuid, packageNames, isSystemUpdated) }
         }
         packageStates.forEach { (_, packageState) ->
+            if (Flags.ignoreApexPermissions() && packageState.isApex) {
+                return@forEach
+            }
             if (packageState.volumeUuid == volumeUuid) {
                 newState.userStates.forEachIndexed { _, userId, _ ->
                     upgradePackageVersion(packageState, userId)
diff --git a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt
index 47fd970..63fb468 100644
--- a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt
+++ b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt
@@ -81,6 +81,9 @@
 
     override fun MutateStateScope.onUserAdded(userId: Int) {
         newState.externalState.packageStates.forEach { (_, packageState) ->
+            if (Flags.ignoreApexPermissions() && packageState.isApex) {
+                return@forEach
+            }
             evaluateAllPermissionStatesForPackageAndUser(packageState, userId, null)
         }
         newState.externalState.appIdPackageNames.forEachIndexed { _, appId, _ ->
diff --git a/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt b/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt
index b32c544..44ed3df 100644
--- a/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt
+++ b/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt
@@ -1445,6 +1445,9 @@
         val packageStates = packageManagerLocal.withUnfilteredSnapshot().use { it.packageStates }
         service.mutateState {
             packageStates.forEach { (packageName, packageState) ->
+                if (Flags.ignoreApexPermissions() && packageState.isApex) {
+                    return@forEach
+                }
                 val androidPackage = packageState.androidPackage ?: return@forEach
                 androidPackage.requestedPermissions.forEach { permissionName ->
                     updatePermissionFlags(
@@ -1598,7 +1601,7 @@
         ) {
             with(policy) { getPermissionFlags(appId, userId, permissionName) }
         } else {
-            if (permissionName !in DEVICE_AWARE_PERMISSIONS) {
+            if (permissionName !in PermissionManager.DEVICE_AWARE_PERMISSIONS) {
                 Slog.i(
                     LOG_TAG,
                     "$permissionName is not device aware permission, " +
@@ -1623,7 +1626,7 @@
         ) {
             with(policy) { setPermissionFlags(appId, userId, permissionName, flags) }
         } else {
-            if (permissionName !in DEVICE_AWARE_PERMISSIONS) {
+            if (permissionName !in PermissionManager.DEVICE_AWARE_PERMISSIONS) {
                 Slog.i(
                     LOG_TAG,
                     "$permissionName is not device aware permission, " +
@@ -1877,6 +1880,9 @@
         packageManagerLocal.withUnfilteredSnapshot().use { snapshot ->
             service.mutateState {
                 snapshot.packageStates.forEach { (_, packageState) ->
+                    if (Flags.ignoreApexPermissions() && packageState.isApex) {
+                        return@forEach
+                    }
                     with(policy) { resetRuntimePermissions(packageState.packageName, userId) }
                     with(devicePolicy) { resetRuntimePermissions(packageState.packageName, userId) }
                 }
@@ -1918,8 +1924,11 @@
         }
 
         packageManagerLocal.withUnfilteredSnapshot().use { snapshot ->
-            snapshot.packageStates.forEach packageStates@{ (_, packageState) ->
-                val androidPackage = packageState.androidPackage ?: return@packageStates
+            snapshot.packageStates.forEach { (_, packageState) ->
+                if (Flags.ignoreApexPermissions() && packageState.isApex) {
+                    return@forEach
+                }
+                val androidPackage = packageState.androidPackage ?: return@forEach
                 if (permissionName in androidPackage.requestedPermissions) {
                     packageNames += androidPackage.packageName
                 }
@@ -1934,6 +1943,9 @@
         val permissions = service.getState { with(policy) { getPermissions() } }
         packageManagerLocal.withUnfilteredSnapshot().use { snapshot ->
             snapshot.packageStates.forEach packageStates@{ (_, packageState) ->
+                if (Flags.ignoreApexPermissions() && packageState.isApex) {
+                    return@packageStates
+                }
                 val androidPackage = packageState.androidPackage ?: return@packageStates
                 androidPackage.requestedPermissions.forEach requestedPermissions@{ permissionName ->
                     val permission = permissions[permissionName] ?: return@requestedPermissions
@@ -2060,6 +2072,9 @@
 
         val appIdPackageNames = MutableIndexedMap<Int, MutableIndexedSet<String>>()
         packageStates.forEach { (_, packageState) ->
+            if (Flags.ignoreApexPermissions() && packageState.isApex) {
+                return@forEach
+            }
             appIdPackageNames
                 .getOrPut(packageState.appId) { MutableIndexedSet() }
                 .add(packageState.packageName)
@@ -2313,6 +2328,10 @@
         isInstantApp: Boolean,
         oldPackage: AndroidPackage?
     ) {
+        if (Flags.ignoreApexPermissions() && packageState.isApex) {
+            return
+        }
+
         synchronized(storageVolumeLock) {
             // Accumulating the package names here because we want to maintain the same call order
             // of onPackageAdded() and reuse this order in onStorageVolumeAdded(). We need the
@@ -2339,6 +2358,10 @@
         params: PermissionManagerServiceInternal.PackageInstalledParams,
         userId: Int
     ) {
+        if (Flags.ignoreApexPermissions() && androidPackage.isApex) {
+            return
+        }
+
         if (params === PermissionManagerServiceInternal.PackageInstalledParams.DEFAULT) {
             // TODO: We should actually stop calling onPackageInstalled() when we are passing
             //  PackageInstalledParams.DEFAULT in InstallPackageHelper, because there's actually no
@@ -2391,6 +2414,10 @@
         sharedUserPkgs: List<AndroidPackage>,
         userId: Int
     ) {
+        if (Flags.ignoreApexPermissions() && packageState.isApex) {
+            return
+        }
+
         val userIds =
             if (userId == UserHandle.USER_ALL) {
                 userManagerService.userIdsIncludingPreCreated
@@ -2820,15 +2847,6 @@
                 PackageManager.FLAG_PERMISSION_WHITELIST_SYSTEM or
                 PackageManager.FLAG_PERMISSION_WHITELIST_INSTALLER
 
-        /** These permissions are supported for virtual devices. */
-        // TODO: b/298661870 - Use new API to get the list of device aware permissions.
-        val DEVICE_AWARE_PERMISSIONS =
-            if (Flags.deviceAwarePermissionsEnabled()) {
-                setOf(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
-            } else {
-                emptySet<String>()
-            }
-
         fun getFullerPermission(permissionName: String): String? =
             FULLER_PERMISSIONS[permissionName]
     }
diff --git a/services/proguard.flags b/services/proguard.flags
index 88561b4..f84eff7 100644
--- a/services/proguard.flags
+++ b/services/proguard.flags
@@ -33,12 +33,6 @@
 -keep,allowoptimization,allowaccessmodification class * extends com.android.server.SystemService {
   public <methods>;
 }
--keep,allowoptimization,allowaccessmodification class * extends com.android.server.devicepolicy.BaseIDevicePolicyManager {
-  public <init>(...);
-}
--keep,allowoptimization,allowaccessmodification class com.android.server.wallpaper.WallpaperManagerService {
-  public <init>(...);
-}
 
 # Accessed from com.android.compos APEX
 -keep,allowoptimization,allowaccessmodification class com.android.internal.art.ArtStatsLog {
@@ -54,7 +48,10 @@
 -keep,allowoptimization,allowaccessmodification class android.app.admin.flags.FeatureFlagsImpl { *; }
 -keep,allowoptimization,allowaccessmodification class com.android.server.input.NativeInputManagerService$NativeImpl { *; }
 -keep,allowoptimization,allowaccessmodification class com.android.server.ThreadPriorityBooster { *; }
--keep,allowaccessmodification class android.app.admin.flags.Flags { *; }
+
+# Keep all aconfig Flag class as they might be statically referenced by other packages
+# An merge or inlining could lead to missing dependencies that cause run time errors
+-keepclassmembernames class android.**.Flags, com.android.**.Flags { public *; }
 
 # Referenced via CarServiceHelperService in car-frameworks-service (avoid removing)
 -keep public class com.android.server.utils.Slogf { *; }
@@ -65,13 +62,6 @@
 -keep public class android.hidl.manager.** { *; }
 -keep public class com.android.server.wm.WindowManagerInternal { *; }
 
-# Notification extractors
-# TODO(b/210510433): Revisit and consider generating from frameworks/base/core/res/res/values/config.xml.
--keep,allowoptimization,allowaccessmodification public class com.android.server.notification.** implements com.android.server.notification.NotificationSignalExtractor
-
-# OEM provided DisplayAreaPolicy.Provider defined in frameworks/base/core/res/res/values/config.xml.
--keep,allowoptimization,allowaccessmodification class com.android.server.wm.** implements com.android.server.wm.DisplayAreaPolicy$Provider
-
 # JNI keep rules
 # The global keep rule for native methods allows stripping of such methods if they're unreferenced
 # in Java. However, because system_server explicitly registers these methods from native code,
@@ -115,9 +105,6 @@
 
 # Miscellaneous reflection keep rules
 # TODO(b/210510433): Revisit and fix with @Keep.
--keep,allowoptimization,allowaccessmodification class com.android.server.usage.AppStandbyController {
-  public <init>(...);
-}
 -keep,allowoptimization,allowaccessmodification class android.hardware.usb.gadget.** { *; }
 
 # Needed when optimizations enabled
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/LocaleUtilsTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/LocaleUtilsTest.java
index d0b46f5..a3aa7de 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/LocaleUtilsTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/LocaleUtilsTest.java
@@ -351,6 +351,29 @@
             assertEquals(1, dest.size());
             assertEquals(availableLocales.get(0), dest.get(0));  // "sr-Latn-RS"
         }
+        // Locale with deprecated subtag, e.g. CS for Serbia and Montenegro, should not win
+        // even if the other available locale doesn't have explicit script / country.
+        // On Android, users don't normally use deprecated subtags unless the application requests.
+        {
+            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-RS");
+            final ArrayList<Locale> availableLocales = new ArrayList<>();
+            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-CS"));
+            availableLocales.add(Locale.forLanguageTag("sr-RS"));
+            final ArrayList<Locale> dest = new ArrayList<>();
+            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
+            assertEquals(1, dest.size());
+            assertEquals(availableLocales.get(1), dest.get(0));  // "sr-RS"
+        }
+        {
+            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-RS");
+            final ArrayList<Locale> availableLocales = new ArrayList<>();
+            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-CS"));
+            availableLocales.add(Locale.forLanguageTag("sr"));
+            final ArrayList<Locale> dest = new ArrayList<>();
+            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
+            assertEquals(1, dest.size());
+            assertEquals(availableLocales.get(1), dest.get(0));  // "sr"
+        }
     }
 
     @Test
diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt
index 96e9ca0c..d4b57f1 100644
--- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt
+++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt
@@ -275,7 +275,6 @@
         AndroidPackage::isUpdatableSystem,
         AndroidPackage::getEmergencyInstaller,
         AndroidPackage::isAllowCrossUidActivitySwitchFromBelow,
-        PackageImpl::isAppMetadataFileInApk,
     )
 
     override fun extraParams() = listOf(
diff --git a/services/tests/VpnTests/java/com/android/server/VpnManagerServiceTest.java b/services/tests/VpnTests/java/com/android/server/VpnManagerServiceTest.java
index ecc70e3..8495de44 100644
--- a/services/tests/VpnTests/java/com/android/server/VpnManagerServiceTest.java
+++ b/services/tests/VpnTests/java/com/android/server/VpnManagerServiceTest.java
@@ -397,4 +397,35 @@
         // Even lockdown is enabled but no Vpn is created for SECONDARY_USER.
         assertNull(mService.getVpnLockdownAllowlist(SECONDARY_USER.id));
     }
+
+    @Test
+    public void testGetFromVpnProfileStore() {
+        final String name = Credentials.VPN + TEST_VPN_PKG;
+        mService.getFromVpnProfileStore(name);
+        verify(mVpnProfileStore).get(name);
+    }
+
+    @Test
+    public void testPutIntoVpnProfileStore() {
+        final String name = Credentials.VPN + TEST_VPN_PKG;
+        final VpnProfile vpnProfile = new VpnProfile(TEST_VPN_PKG);
+        final byte[] encodedProfile = vpnProfile.encode();
+
+        mService.putIntoVpnProfileStore(name, encodedProfile);
+        verify(mVpnProfileStore).put(name, encodedProfile);
+    }
+
+    @Test
+    public void testRemoveFromVpnProfileStore() {
+        final String name = Credentials.VPN + TEST_VPN_PKG;
+        mService.removeFromVpnProfileStore(name);
+        verify(mVpnProfileStore).remove(name);
+    }
+
+    @Test
+    public void testListFromVpnProfileStore() {
+        final String name = Credentials.VPN + TEST_VPN_PKG;
+        mService.listFromVpnProfileStore(name);
+        verify(mVpnProfileStore).list(name);
+    }
 }
diff --git a/services/tests/VpnTests/java/com/android/server/connectivity/VpnTest.java b/services/tests/VpnTests/java/com/android/server/connectivity/VpnTest.java
index 9115f95..08155c7 100644
--- a/services/tests/VpnTests/java/com/android/server/connectivity/VpnTest.java
+++ b/services/tests/VpnTests/java/com/android/server/connectivity/VpnTest.java
@@ -3158,13 +3158,6 @@
         assertEquals(profile, ikev2VpnProfile.toVpnProfile());
     }
 
-    private void assertTransportInfoMatches(NetworkCapabilities nc, int type) {
-        assertNotNull(nc);
-        VpnTransportInfo ti = (VpnTransportInfo) nc.getTransportInfo();
-        assertNotNull(ti);
-        assertEquals(type, ti.getType());
-    }
-
     // Make it public and un-final so as to spy it
     public class TestDeps extends Vpn.Dependencies {
         TestDeps() {}
diff --git a/services/tests/displayservicetests/AndroidManifest.xml b/services/tests/displayservicetests/AndroidManifest.xml
index e71ea26..74260cd 100644
--- a/services/tests/displayservicetests/AndroidManifest.xml
+++ b/services/tests/displayservicetests/AndroidManifest.xml
@@ -29,6 +29,7 @@
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
     <uses-permission android:name="android.permission.MANAGE_USB" />
+    <uses-permission android:name="android.permission.MODIFY_USER_PREFERRED_DISPLAY_MODE" />
 
     <!-- Permissions needed for DisplayTransformManagerTest -->
     <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
diff --git a/services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
index 54de64e..64253e1 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java
@@ -53,6 +53,7 @@
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.server.display.brightness.clamper.BrightnessClamperController;
+import com.android.server.display.config.HysteresisLevels;
 import com.android.server.testutils.OffsettableClock;
 
 import org.junit.After;
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayBrightnessStateTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayBrightnessStateTest.java
index ad4d91f..6d89e80 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayBrightnessStateTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayBrightnessStateTest.java
@@ -27,6 +27,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Objects;
+
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class DisplayBrightnessStateTest {
@@ -101,7 +103,9 @@
                 .append("\n    customAnimationRate:")
                 .append(displayBrightnessState.getCustomAnimationRate())
                 .append("\n    shouldUpdateScreenBrightnessSetting:")
-                .append(displayBrightnessState.shouldUpdateScreenBrightnessSetting());
+                .append(displayBrightnessState.shouldUpdateScreenBrightnessSetting())
+                .append("\n    mBrightnessEvent:")
+                .append(Objects.toString(displayBrightnessState.getBrightnessEvent(), "null"));
         return sb.toString();
     }
 }
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 73a2f65..5897d76 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java
@@ -55,6 +55,7 @@
 
 import com.android.internal.R;
 import com.android.server.display.config.HdrBrightnessData;
+import com.android.server.display.config.HysteresisLevels;
 import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholdPoint;
 import com.android.server.display.config.ThermalStatus;
 import com.android.server.display.feature.DisplayManagerFlags;
@@ -169,53 +170,57 @@
         assertArrayEquals(mDisplayDeviceConfig.getBacklight(), BRIGHTNESS, ZERO_DELTA);
 
         // Test thresholds
-        assertEquals(10, mDisplayDeviceConfig.getAmbientLuxBrighteningMinThreshold(),
-                ZERO_DELTA);
-        assertEquals(20, mDisplayDeviceConfig.getAmbientLuxBrighteningMinThresholdIdle(),
-                ZERO_DELTA);
-        assertEquals(30, mDisplayDeviceConfig.getAmbientLuxDarkeningMinThreshold(), ZERO_DELTA);
-        assertEquals(40, mDisplayDeviceConfig.getAmbientLuxDarkeningMinThresholdIdle(), ZERO_DELTA);
+        HysteresisLevels ambientHysteresis = mDisplayDeviceConfig.getAmbientBrightnessHysteresis();
+        HysteresisLevels ambientIdleHysteresis =
+                mDisplayDeviceConfig.getAmbientBrightnessIdleHysteresis();
+        HysteresisLevels screenHysteresis = mDisplayDeviceConfig.getScreenBrightnessHysteresis();
+        HysteresisLevels screenIdleHysteresis =
+                mDisplayDeviceConfig.getScreenBrightnessIdleHysteresis();
+        assertEquals(10, ambientHysteresis.getMinBrightening(), ZERO_DELTA);
+        assertEquals(20, ambientIdleHysteresis.getMinBrightening(), ZERO_DELTA);
+        assertEquals(30, ambientHysteresis.getMinDarkening(), ZERO_DELTA);
+        assertEquals(40, ambientIdleHysteresis.getMinDarkening(), ZERO_DELTA);
 
-        assertEquals(0.1f, mDisplayDeviceConfig.getScreenBrighteningMinThreshold(), ZERO_DELTA);
-        assertEquals(0.2f, mDisplayDeviceConfig.getScreenBrighteningMinThresholdIdle(), ZERO_DELTA);
-        assertEquals(0.3f, mDisplayDeviceConfig.getScreenDarkeningMinThreshold(), ZERO_DELTA);
-        assertEquals(0.4f, mDisplayDeviceConfig.getScreenDarkeningMinThresholdIdle(), ZERO_DELTA);
+        assertEquals(0.1f, screenHysteresis.getMinBrightening(), ZERO_DELTA);
+        assertEquals(0.2f, screenIdleHysteresis.getMinBrightening(), ZERO_DELTA);
+        assertEquals(0.3f, screenHysteresis.getMinDarkening(), ZERO_DELTA);
+        assertEquals(0.4f, screenIdleHysteresis.getMinDarkening(), ZERO_DELTA);
 
         assertArrayEquals(new float[]{0, 0.10f, 0.20f},
-                mDisplayDeviceConfig.getScreenBrighteningLevels(), ZERO_DELTA);
-        assertArrayEquals(new float[]{9, 10, 11},
-                mDisplayDeviceConfig.getScreenBrighteningPercentages(), ZERO_DELTA);
+                screenHysteresis.getBrighteningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.09f, 0.10f, 0.11f},
+                screenHysteresis.getBrighteningThresholdsPercentages(), ZERO_DELTA);
         assertArrayEquals(new float[]{0, 0.11f, 0.21f},
-                mDisplayDeviceConfig.getScreenDarkeningLevels(), ZERO_DELTA);
-        assertArrayEquals(new float[]{11, 12, 13},
-                mDisplayDeviceConfig.getScreenDarkeningPercentages(), ZERO_DELTA);
+                screenHysteresis.getDarkeningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.11f, 0.12f, 0.13f},
+                screenHysteresis.getDarkeningThresholdsPercentages(), ZERO_DELTA);
 
         assertArrayEquals(new float[]{0, 100, 200},
-                mDisplayDeviceConfig.getAmbientBrighteningLevels(), ZERO_DELTA);
-        assertArrayEquals(new float[]{13, 14, 15},
-                mDisplayDeviceConfig.getAmbientBrighteningPercentages(), ZERO_DELTA);
+                ambientHysteresis.getBrighteningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.13f, 0.14f, 0.15f},
+                ambientHysteresis.getBrighteningThresholdsPercentages(), ZERO_DELTA);
         assertArrayEquals(new float[]{0, 300, 400},
-                mDisplayDeviceConfig.getAmbientDarkeningLevels(), ZERO_DELTA);
-        assertArrayEquals(new float[]{15, 16, 17},
-                mDisplayDeviceConfig.getAmbientDarkeningPercentages(), ZERO_DELTA);
+                ambientHysteresis.getDarkeningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.15f, 0.16f, 0.17f},
+                ambientHysteresis.getDarkeningThresholdsPercentages(), ZERO_DELTA);
 
         assertArrayEquals(new float[]{0, 0.12f, 0.22f},
-                mDisplayDeviceConfig.getScreenBrighteningLevelsIdle(), ZERO_DELTA);
-        assertArrayEquals(new float[]{17, 18, 19},
-                mDisplayDeviceConfig.getScreenBrighteningPercentagesIdle(), ZERO_DELTA);
+                screenIdleHysteresis.getBrighteningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.17f, 0.18f, 0.19f},
+                screenIdleHysteresis.getBrighteningThresholdsPercentages(), ZERO_DELTA);
         assertArrayEquals(new float[]{0, 0.13f, 0.23f},
-                mDisplayDeviceConfig.getScreenDarkeningLevelsIdle(), ZERO_DELTA);
-        assertArrayEquals(new float[]{19, 20, 21},
-                mDisplayDeviceConfig.getScreenDarkeningPercentagesIdle(), ZERO_DELTA);
+                screenIdleHysteresis.getDarkeningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.19f, 0.20f, 0.21f},
+                screenIdleHysteresis.getDarkeningThresholdsPercentages(), ZERO_DELTA);
 
         assertArrayEquals(new float[]{0, 500, 600},
-                mDisplayDeviceConfig.getAmbientBrighteningLevelsIdle(), ZERO_DELTA);
-        assertArrayEquals(new float[]{21, 22, 23},
-                mDisplayDeviceConfig.getAmbientBrighteningPercentagesIdle(), ZERO_DELTA);
+                ambientIdleHysteresis.getBrighteningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.21f, 0.22f, 0.23f},
+                ambientIdleHysteresis.getBrighteningThresholdsPercentages(), ZERO_DELTA);
         assertArrayEquals(new float[]{0, 700, 800},
-                mDisplayDeviceConfig.getAmbientDarkeningLevelsIdle(), ZERO_DELTA);
-        assertArrayEquals(new float[]{23, 24, 25},
-                mDisplayDeviceConfig.getAmbientDarkeningPercentagesIdle(), ZERO_DELTA);
+                ambientIdleHysteresis.getDarkeningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.23f, 0.24f, 0.25f},
+                ambientIdleHysteresis.getDarkeningThresholdsPercentages(), ZERO_DELTA);
 
         assertEquals(75, mDisplayDeviceConfig.getDefaultLowBlockingZoneRefreshRate());
         assertEquals(90, mDisplayDeviceConfig.getDefaultHighBlockingZoneRefreshRate());
@@ -686,55 +691,60 @@
                 new float[]{brightnessIntToFloat(50), brightnessIntToFloat(100),
                         brightnessIntToFloat(150)}, SMALL_DELTA);
 
+        HysteresisLevels ambientHysteresis = mDisplayDeviceConfig.getAmbientBrightnessHysteresis();
+        HysteresisLevels ambientIdleHysteresis =
+                mDisplayDeviceConfig.getAmbientBrightnessIdleHysteresis();
+        HysteresisLevels screenHysteresis = mDisplayDeviceConfig.getScreenBrightnessHysteresis();
+        HysteresisLevels screenIdleHysteresis =
+                mDisplayDeviceConfig.getScreenBrightnessIdleHysteresis();
         // Test thresholds
-        assertEquals(0, mDisplayDeviceConfig.getAmbientLuxBrighteningMinThreshold(), ZERO_DELTA);
-        assertEquals(0, mDisplayDeviceConfig.getAmbientLuxBrighteningMinThresholdIdle(),
-                ZERO_DELTA);
-        assertEquals(0, mDisplayDeviceConfig.getAmbientLuxDarkeningMinThreshold(), ZERO_DELTA);
-        assertEquals(0, mDisplayDeviceConfig.getAmbientLuxDarkeningMinThresholdIdle(), ZERO_DELTA);
+        assertEquals(0, ambientHysteresis.getMinBrightening(), ZERO_DELTA);
+        assertEquals(0, ambientIdleHysteresis.getMinBrightening(), ZERO_DELTA);
+        assertEquals(0, ambientHysteresis.getMinDarkening(), ZERO_DELTA);
+        assertEquals(0, ambientIdleHysteresis.getMinDarkening(), ZERO_DELTA);
 
-        assertEquals(0, mDisplayDeviceConfig.getScreenBrighteningMinThreshold(), ZERO_DELTA);
-        assertEquals(0, mDisplayDeviceConfig.getScreenBrighteningMinThresholdIdle(), ZERO_DELTA);
-        assertEquals(0, mDisplayDeviceConfig.getScreenDarkeningMinThreshold(), ZERO_DELTA);
-        assertEquals(0, mDisplayDeviceConfig.getScreenDarkeningMinThresholdIdle(), ZERO_DELTA);
+        assertEquals(0, screenHysteresis.getMinBrightening(), ZERO_DELTA);
+        assertEquals(0, screenIdleHysteresis.getMinBrightening(), ZERO_DELTA);
+        assertEquals(0, screenHysteresis.getMinDarkening(), ZERO_DELTA);
+        assertEquals(0, screenIdleHysteresis.getMinDarkening(), ZERO_DELTA);
 
         // screen levels will be considered "old screen brightness scale"
         // and therefore will divide by 255
         assertArrayEquals(new float[]{0, 42 / 255f, 43 / 255f},
-                mDisplayDeviceConfig.getScreenBrighteningLevels(), SMALL_DELTA);
-        assertArrayEquals(new float[]{35, 36, 37},
-                mDisplayDeviceConfig.getScreenBrighteningPercentages(), ZERO_DELTA);
+                screenHysteresis.getBrighteningThresholdLevels(), SMALL_DELTA);
+        assertArrayEquals(new float[]{0.35f, 0.36f, 0.37f},
+                screenHysteresis.getBrighteningThresholdsPercentages(), ZERO_DELTA);
         assertArrayEquals(new float[]{0, 42 / 255f, 43 / 255f},
-                mDisplayDeviceConfig.getScreenDarkeningLevels(), SMALL_DELTA);
-        assertArrayEquals(new float[]{37, 38, 39},
-                mDisplayDeviceConfig.getScreenDarkeningPercentages(), ZERO_DELTA);
+                screenHysteresis.getDarkeningThresholdLevels(), SMALL_DELTA);
+        assertArrayEquals(new float[]{0.37f, 0.38f, 0.39f},
+                screenHysteresis.getDarkeningThresholdsPercentages(), ZERO_DELTA);
 
         assertArrayEquals(new float[]{0, 30, 31},
-                mDisplayDeviceConfig.getAmbientBrighteningLevels(), ZERO_DELTA);
-        assertArrayEquals(new float[]{27, 28, 29},
-                mDisplayDeviceConfig.getAmbientBrighteningPercentages(), ZERO_DELTA);
+                ambientHysteresis.getBrighteningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.27f, 0.28f, 0.29f},
+                ambientHysteresis.getBrighteningThresholdsPercentages(), ZERO_DELTA);
         assertArrayEquals(new float[]{0, 30, 31},
-                mDisplayDeviceConfig.getAmbientDarkeningLevels(), ZERO_DELTA);
-        assertArrayEquals(new float[]{29, 30, 31},
-                mDisplayDeviceConfig.getAmbientDarkeningPercentages(), ZERO_DELTA);
+                ambientHysteresis.getDarkeningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.29f, 0.30f, 0.31f},
+                ambientHysteresis.getDarkeningThresholdsPercentages(), ZERO_DELTA);
 
         assertArrayEquals(new float[]{0, 42 / 255f, 43 / 255f},
-                mDisplayDeviceConfig.getScreenBrighteningLevelsIdle(), SMALL_DELTA);
-        assertArrayEquals(new float[]{35, 36, 37},
-                mDisplayDeviceConfig.getScreenBrighteningPercentagesIdle(), ZERO_DELTA);
+                screenIdleHysteresis.getBrighteningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.35f, 0.36f, 0.37f},
+                screenIdleHysteresis.getBrighteningThresholdsPercentages(), ZERO_DELTA);
         assertArrayEquals(new float[]{0, 42 / 255f, 43 / 255f},
-                mDisplayDeviceConfig.getScreenDarkeningLevelsIdle(), SMALL_DELTA);
-        assertArrayEquals(new float[]{37, 38, 39},
-                mDisplayDeviceConfig.getScreenDarkeningPercentagesIdle(), ZERO_DELTA);
+                screenIdleHysteresis.getDarkeningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.37f, 0.38f, 0.39f},
+                screenIdleHysteresis.getDarkeningThresholdsPercentages(), ZERO_DELTA);
 
         assertArrayEquals(new float[]{0, 30, 31},
-                mDisplayDeviceConfig.getAmbientBrighteningLevelsIdle(), ZERO_DELTA);
-        assertArrayEquals(new float[]{27, 28, 29},
-                mDisplayDeviceConfig.getAmbientBrighteningPercentagesIdle(), ZERO_DELTA);
+                ambientIdleHysteresis.getBrighteningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.27f, 0.28f, 0.29f},
+                ambientIdleHysteresis.getBrighteningThresholdsPercentages(), ZERO_DELTA);
         assertArrayEquals(new float[]{0, 30, 31},
-                mDisplayDeviceConfig.getAmbientDarkeningLevelsIdle(), ZERO_DELTA);
-        assertArrayEquals(new float[]{29, 30, 31},
-                mDisplayDeviceConfig.getAmbientDarkeningPercentagesIdle(), ZERO_DELTA);
+                ambientIdleHysteresis.getDarkeningThresholdLevels(), ZERO_DELTA);
+        assertArrayEquals(new float[]{0.29f, 0.30f, 0.31f},
+                ambientIdleHysteresis.getDarkeningThresholdsPercentages(), ZERO_DELTA);
         assertEquals(mDisplayDeviceConfig.getDefaultLowBlockingZoneRefreshRate(),
                 DEFAULT_LOW_BLOCKING_ZONE_REFRESH_RATE);
         assertEquals(mDisplayDeviceConfig.getDefaultHighBlockingZoneRefreshRate(),
@@ -913,8 +923,8 @@
         setupDisplayDeviceConfigFromDisplayConfigFile(getContent(getValidLuxThrottling(),
                 getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer */ true));
 
-        assertTrue(mDisplayDeviceConfig.getLbmEnabled());
-        assertEquals(0.0001f, mDisplayDeviceConfig.getBacklightFromBrightness(0.1f), ZERO_DELTA);
+        assertTrue(mDisplayDeviceConfig.isEvenDimmerAvailable());
+        assertEquals(0.01f, mDisplayDeviceConfig.getBacklightFromBrightness(0.002f), ZERO_DELTA);
         assertEquals(0.2f, mDisplayDeviceConfig.getNitsFromBacklight(0.0f), ZERO_DELTA);
     }
 
@@ -1637,21 +1647,42 @@
     }
 
     private String evenDimmerConfig(boolean enabled) {
-        return (enabled ? "<lowBrightness enabled=\"true\">" : "<lowBrightness enabled=\"false\">")
+        return (enabled ? "<evenDimmer enabled=\"true\">" : "<evenDimmer enabled=\"false\">")
                 + "  <transitionPoint>0.1</transitionPoint>\n"
-                + "  <nits>0.2</nits>\n"
-                + "  <nits>2.0</nits>\n"
-                + "  <nits>500.0</nits>\n"
-                + "  <nits>1000.0</nits>\n"
-                + "  <backlight>0</backlight>\n"
-                + "  <backlight>0.0001</backlight>\n"
-                + "  <backlight>0.5</backlight>\n"
-                + "  <backlight>1.0</backlight>\n"
-                + "  <brightness>0</brightness>\n"
-                + "  <brightness>0.1</brightness>\n"
-                + "  <brightness>0.5</brightness>\n"
-                + "  <brightness>1.0</brightness>\n"
-                + "</lowBrightness>";
+                + "  <brightnessMapping>\n"
+                + "      <brightnessPoint>\n"
+                + "        <nits>0.2</nits>\n"
+                + "        <backlight>0</backlight>\n"
+                + "        <brightness>0</brightness>\n"
+                + "      </brightnessPoint>\n"
+                + "      <brightnessPoint>\n"
+                + "        <nits>2.0</nits>\n"
+                + "        <backlight>0.01</backlight>\n"
+                + "        <brightness>0.002</brightness>\n"
+                + "      </brightnessPoint>\n"
+                + "      <brightnessPoint>\n"
+                + "        <nits>500.0</nits>\n"
+                + "        <backlight>0.5</backlight>\n"
+                + "        <brightness>0.5</brightness>\n"
+                + "      </brightnessPoint>\n"
+                + "      <brightnessPoint>\n"
+                + "        <nits>1000</nits>\n"
+                + "        <backlight>1.0</backlight>\n"
+                + "        <brightness>1.0</brightness>\n"
+                + "      </brightnessPoint>\n"
+                + "  </brightnessMapping>\n"
+                + " <luxToMinimumNitsMap>\n"
+                + "     <point>\n"
+                + "         <value>10</value> <nits>0.3</nits>\n"
+                + "     </point>\n"
+                + "     <point>\n"
+                + "         <value>50</value> <nits>0.7</nits>\n"
+                + "     </point>\n"
+                + "     <point>\n"
+                + "         <value>100</value> <nits>1.0</nits>\n"
+                + "     </point>\n"
+                + " </luxToMinimumNitsMap>\n"
+                + "</evenDimmer>";
     }
 
     private void mockDeviceConfigs() {
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceTest.java
index 1c71abc..00296745a 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceTest.java
@@ -26,6 +26,7 @@
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.platform.test.annotations.Presubmit;
+import android.view.Display;
 import android.view.SurfaceControl;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -72,6 +73,7 @@
 
     @Test
     public void testGetDisplaySurfaceDefaultSizeLocked_notRotated_anisotropyCorrection() {
+        mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mDisplayDeviceInfo.xDpi = 0.5f;
         mDisplayDeviceInfo.yDpi = 1.0f;
         DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
@@ -81,6 +83,16 @@
     }
 
     @Test
+    public void testGetDisplaySurfaceDefaultSizeLocked_notRotated_noAnisotropyCorrection() {
+        mDisplayDeviceInfo.type = Display.TYPE_INTERNAL;
+        mDisplayDeviceInfo.xDpi = 0.5f;
+        mDisplayDeviceInfo.yDpi = 1.0f;
+        DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
+                mMockDisplayAdapter, /*isAnisotropyCorrectionEnabled=*/ true);
+        assertThat(displayDevice.getDisplaySurfaceDefaultSizeLocked()).isEqualTo(PORTRAIT_SIZE);
+    }
+
+    @Test
     public void testGetDisplaySurfaceDefaultSizeLocked_notRotated() {
         DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
                 mMockDisplayAdapter);
@@ -97,6 +109,7 @@
 
     @Test
     public void testGetDisplaySurfaceDefaultSizeLocked_rotation90_anisotropyCorrection() {
+        mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mDisplayDeviceInfo.xDpi = 0.5f;
         mDisplayDeviceInfo.yDpi = 1.0f;
         DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
@@ -107,6 +120,17 @@
     }
 
     @Test
+    public void testGetDisplaySurfaceDefaultSizeLocked_rotation90_noAnisotropyCorrection() {
+        mDisplayDeviceInfo.type = Display.TYPE_INTERNAL;
+        mDisplayDeviceInfo.xDpi = 0.5f;
+        mDisplayDeviceInfo.yDpi = 1.0f;
+        DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
+                mMockDisplayAdapter, /*isAnisotropyCorrectionEnabled=*/ true);
+        displayDevice.setProjectionLocked(mMockTransaction, ROTATION_90, new Rect(), new Rect());
+        assertThat(displayDevice.getDisplaySurfaceDefaultSizeLocked()).isEqualTo(LANDSCAPE_SIZE);
+    }
+
+    @Test
     public void testGetDisplaySurfaceDefaultSizeLocked_rotation90() {
         DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
                 mMockDisplayAdapter);
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 869cec8..eea94a4 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java
@@ -45,6 +45,7 @@
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Mockito.any;
@@ -56,6 +57,7 @@
 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;
 
@@ -68,8 +70,11 @@
 import android.companion.virtual.VirtualDeviceManager;
 import android.companion.virtual.flags.Flags;
 import android.compat.testing.PlatformCompatChangeRule;
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.ContextWrapper;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.UserInfo;
@@ -107,6 +112,7 @@
 import android.os.UserManager;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
 import android.test.mock.MockContentResolver;
 import android.util.SparseArray;
 import android.view.ContentRecordingSession;
@@ -153,6 +159,7 @@
 import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
+import org.mockito.ArgumentMatcher;
 import org.mockito.Captor;
 import org.mockito.InOrder;
 import org.mockito.Mock;
@@ -327,6 +334,7 @@
     }
 
     private final DisplayManagerService.Injector mBasicInjector = new BasicInjector();
+    private final FakeSettingsProvider mFakeSettingsProvider = new FakeSettingsProvider();
 
     @Mock DisplayNotificationManager mMockedDisplayNotificationManager;
     @Mock IMediaProjectionManager mMockProjectionService;
@@ -384,6 +392,7 @@
                 ApplicationProvider.getApplicationContext().createDisplayContext(display)));
         final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContext);
         when(mContext.getContentResolver()).thenReturn(resolver);
+        resolver.addProvider(Settings.AUTHORITY, mFakeSettingsProvider);
         mResources = Mockito.spy(mContext.getResources());
         mPowerHandler = new Handler(Looper.getMainLooper());
         manageDisplaysPermission(/* granted= */ false);
@@ -951,6 +960,9 @@
         final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(
                 VIRTUAL_DISPLAY_NAME, width, height, dpi);
         builder.setUniqueId(uniqueId);
+        builder.setFlags(VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR);
+        when(mContext.checkCallingPermission(CAPTURE_VIDEO_OUTPUT))
+                .thenReturn(PackageManager.PERMISSION_GRANTED);
         final int firstDisplayId = binderService.createVirtualDisplay(builder.build(),
                 mMockAppToken /* callback */, null /* projection */, PACKAGE_NAME);
         verify(mMockProjectionService, never()).setContentRecordingSession(any(),
@@ -963,6 +975,7 @@
                 VIRTUAL_DISPLAY_NAME, width, height, dpi).setUniqueId(uniqueId2);
         builder2.setUniqueId(uniqueId2);
         builder2.setDisplayIdToMirror(firstDisplayId);
+        builder2.setFlags(VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR);
         final int secondDisplayId = binderService.createVirtualDisplay(builder2.build(),
                 mMockAppToken2 /* callback */, null /* projection */,
                 PACKAGE_NAME);
@@ -2439,8 +2452,9 @@
         LogicalDisplay display =
                 logicalDisplayMapper.getDisplayLocked(displayDevice, /* includeDisabled= */ true);
         assertThat(display.isEnabledLocked()).isFalse();
+        // TODO(b/332711269) make sure only one DISPLAY_GROUP_EVENT_ADDED sent.
         assertThat(callback.receivedEvents()).containsExactly(DISPLAY_GROUP_EVENT_ADDED,
-                EVENT_DISPLAY_CONNECTED).inOrder();
+                DISPLAY_GROUP_EVENT_ADDED, EVENT_DISPLAY_CONNECTED).inOrder();
     }
 
     @Test
@@ -2826,6 +2840,7 @@
 
         float brightness1 = 0.3f;
         float brightness2 = 0.45f;
+        waitForIdleHandler(mPowerHandler);
 
         int userId1 = 123;
         int userId2 = 456;
@@ -2835,8 +2850,8 @@
         userInfo2.id = userId2;
         when(mUserManager.getUserSerialNumber(userId1)).thenReturn(12345);
         when(mUserManager.getUserSerialNumber(userId2)).thenReturn(45678);
-        final SystemService.TargetUser from = new SystemService.TargetUser(userInfo1);
-        final SystemService.TargetUser to = new SystemService.TargetUser(userInfo2);
+        final SystemService.TargetUser user1 = new SystemService.TargetUser(userInfo1);
+        final SystemService.TargetUser user2 = new SystemService.TargetUser(userInfo2);
 
         // The same brightness will be restored for a user only if auto-brightness is off,
         // otherwise the current lux will be used to determine the brightness.
@@ -2844,20 +2859,20 @@
                 Settings.System.SCREEN_BRIGHTNESS_MODE,
                 Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
 
-        displayManager.onUserSwitching(to, from);
+        displayManager.onUserSwitching(/* from= */ user2, /* to= */ user1);
         waitForIdleHandler(mPowerHandler);
         displayManagerBinderService.setBrightness(Display.DEFAULT_DISPLAY, brightness1);
-        displayManager.onUserSwitching(from, to);
+        displayManager.onUserSwitching(/* from= */ user1, /* to= */ user2);
         waitForIdleHandler(mPowerHandler);
         displayManagerBinderService.setBrightness(Display.DEFAULT_DISPLAY, brightness2);
 
-        displayManager.onUserSwitching(to, from);
+        displayManager.onUserSwitching(/* from= */ user2, /* to= */ user1);
         waitForIdleHandler(mPowerHandler);
         assertEquals(brightness1,
                 displayManagerBinderService.getBrightness(Display.DEFAULT_DISPLAY),
                 FLOAT_TOLERANCE);
 
-        displayManager.onUserSwitching(from, to);
+        displayManager.onUserSwitching(/* from= */ user1, /* to= */ user2);
         waitForIdleHandler(mPowerHandler);
         assertEquals(brightness2,
                 displayManagerBinderService.getBrightness(Display.DEFAULT_DISPLAY),
@@ -2893,6 +2908,110 @@
                 FLOAT_TOLERANCE);
     }
 
+    @Test
+    public void testResolutionChangeGetsBackedUp_FeatureFlagFalse() throws Exception {
+        when(mMockFlags.isResolutionBackupRestoreEnabled()).thenReturn(false);
+        DisplayManagerService displayManager =
+                new DisplayManagerService(mContext, mBasicInjector);
+
+        Display.Mode[] modes = new Display.Mode[2];
+        modes[0] = new Display.Mode(/*id=*/ 101, /*width=*/ 100, /*height=*/ 200, /*rr=*/ 60);
+        modes[1] = new Display.Mode(/*id=*/ 101, /*width=*/ 200, /*height=*/ 400, /*rr=*/ 60);
+        FakeDisplayDevice displayDevice = createFakeDisplayDevice(displayManager, modes);
+        waitForIdleHandler(displayManager.getDisplayHandler());
+
+        displayManager.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+
+        DisplayManagerService.BinderService bs = displayManager.new BinderService();
+
+        bs.setUserPreferredDisplayMode(Display.DEFAULT_DISPLAY, new Display.Mode(100, 200, 0));
+        try {
+            Settings.Secure.getInt(mContext.getContentResolver(),
+                    Settings.Secure.SCREEN_RESOLUTION_MODE);
+            fail("SettingNotFoundException should have been thrown.");
+        } catch (SettingNotFoundException expected) {
+        }
+    }
+
+    @Test
+    public void testResolutionChangeGetsBackedUp() throws Exception {
+        when(mMockFlags.isResolutionBackupRestoreEnabled()).thenReturn(true);
+        DisplayManagerService displayManager =
+                new DisplayManagerService(mContext, mBasicInjector);
+
+        Display.Mode[] modes = new Display.Mode[2];
+        modes[0] = new Display.Mode(/*id=*/ 101, /*width=*/ 100, /*height=*/ 200, /*rr=*/ 60);
+        modes[1] = new Display.Mode(/*id=*/ 101, /*width=*/ 200, /*height=*/ 400, /*rr=*/ 60);
+        FakeDisplayDevice displayDevice = createFakeDisplayDevice(displayManager, modes);
+        waitForIdleHandler(displayManager.getDisplayHandler());
+
+        displayManager.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+
+        DisplayManagerService.BinderService bs = displayManager.new BinderService();
+
+        bs.setUserPreferredDisplayMode(Display.DEFAULT_DISPLAY, new Display.Mode(100, 200, 0));
+        assertEquals(Settings.Secure.RESOLUTION_MODE_HIGH,
+                Settings.Secure.getInt(mContext.getContentResolver(),
+                        Settings.Secure.SCREEN_RESOLUTION_MODE));
+
+        bs.setUserPreferredDisplayMode(Display.DEFAULT_DISPLAY, new Display.Mode(200, 400, 0));
+        assertEquals(Settings.Secure.RESOLUTION_MODE_FULL,
+                Settings.Secure.getInt(mContext.getContentResolver(),
+                        Settings.Secure.SCREEN_RESOLUTION_MODE));
+    }
+
+    @Test
+    public void testResolutionGetsRestored() throws Exception {
+        when(mMockFlags.isResolutionBackupRestoreEnabled()).thenReturn(true);
+        DisplayManagerService displayManager =
+                new DisplayManagerService(mContext, mBasicInjector);
+
+        displayManager.systemReady(false /* safeMode */);
+        ArgumentCaptor<BroadcastReceiver> receiverCaptor =
+                ArgumentCaptor.forClass(BroadcastReceiver.class);
+        ArgumentMatcher<IntentFilter> matchesFilter =
+                (filter) -> Intent.ACTION_SETTING_RESTORED.equals(filter.getAction(0));
+        verify(mContext).registerReceiver(receiverCaptor.capture(), argThat(matchesFilter));
+        BroadcastReceiver receiver = receiverCaptor.getValue();
+
+        Display.Mode emptyMode = new Display.Mode.Builder().build();
+        Display.Mode[] modes = new Display.Mode[2];
+        modes[0] = new Display.Mode(/*id=*/ 101, /*width=*/ 100, /*height=*/ 200, /*rr=*/ 60);
+        modes[1] = new Display.Mode(/*id=*/ 102, /*width=*/ 200, /*height=*/ 400, /*rr=*/ 60);
+        FakeDisplayDevice displayDevice = createFakeDisplayDevice(displayManager, modes);
+        waitForIdleHandler(displayManager.getDisplayHandler());
+
+        displayManager.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+        DisplayManagerService.BinderService bs = displayManager.new BinderService();
+
+        // Get the current display mode, ensure it is null
+        Display.Mode prevMode = bs.getUserPreferredDisplayMode(Display.DEFAULT_DISPLAY);
+        assertEquals(emptyMode, prevMode);
+
+        // Set a new mode (FULL) via restore
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.SCREEN_RESOLUTION_MODE, Settings.Secure.RESOLUTION_MODE_FULL);
+        Intent restoreIntent = new Intent(Intent.ACTION_SETTING_RESTORED);
+        restoreIntent.putExtra(Intent.EXTRA_SETTING_NAME, Settings.Secure.SCREEN_RESOLUTION_MODE);
+        receiver.onReceive(mContext, restoreIntent);
+
+        Display.Mode newMode = bs.getUserPreferredDisplayMode(Display.DEFAULT_DISPLAY);
+        assertEquals(modes[1], newMode);
+    }
+
+    @Test
+    public void testResolutionGetsRestored_FeatureFlagFalse() throws Exception {
+        when(mMockFlags.isResolutionBackupRestoreEnabled()).thenReturn(false);
+        DisplayManagerService displayManager =
+                new DisplayManagerService(mContext, mBasicInjector);
+
+        displayManager.systemReady(false /* safeMode */);
+        ArgumentMatcher<IntentFilter> matchesFilter =
+                (filter) -> Intent.ACTION_SETTING_RESTORED.equals(filter.getAction(0));
+        verify(mContext, times(0)).registerReceiver(any(BroadcastReceiver.class),
+                argThat(matchesFilter));
+    }
+
     private void initDisplayPowerController(DisplayManagerInternal localService) {
         localService.initPowerManagement(new DisplayManagerInternal.DisplayPowerCallbacks() {
             @Override
@@ -3116,6 +3235,29 @@
     }
 
     private FakeDisplayDevice createFakeDisplayDevice(DisplayManagerService displayManager,
+                                                      Display.Mode[] modes) {
+        FakeDisplayDevice displayDevice = new FakeDisplayDevice();
+        DisplayDeviceInfo displayDeviceInfo = new DisplayDeviceInfo();
+        displayDeviceInfo.supportedModes = modes;
+        displayDeviceInfo.modeId = 101;
+        displayDeviceInfo.type = Display.TYPE_INTERNAL;
+        displayDeviceInfo.renderFrameRate = displayDeviceInfo.supportedModes[0].getRefreshRate();
+        displayDeviceInfo.width = displayDeviceInfo.supportedModes[0].getPhysicalWidth();
+        displayDeviceInfo.height = displayDeviceInfo.supportedModes[0].getPhysicalHeight();
+        final Rect zeroRect = new Rect();
+        displayDeviceInfo.displayCutout = new DisplayCutout(
+                Insets.of(0, 10, 0, 0),
+                zeroRect, new Rect(0, 0, 10, 10), zeroRect, zeroRect);
+        displayDeviceInfo.flags = DisplayDeviceInfo.FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY;
+        displayDeviceInfo.address = new TestUtils.TestDisplayAddress();
+        displayDevice.setDisplayDeviceInfo(displayDeviceInfo);
+        displayManager.getDisplayDeviceRepository()
+                .onDisplayDeviceEvent(displayDevice, DisplayAdapter.DISPLAY_DEVICE_EVENT_ADDED);
+        return displayDevice;
+    }
+
+    private FakeDisplayDevice createFakeDisplayDevice(DisplayManagerService displayManager,
+
                                                       float[] refreshRates) {
         return createFakeDisplayDevice(displayManager, refreshRates, Display.TYPE_UNKNOWN);
     }
@@ -3307,6 +3449,7 @@
 
     private class FakeDisplayDevice extends DisplayDevice {
         private DisplayDeviceInfo mDisplayDeviceInfo;
+        private Display.Mode mPreferredMode = new Display.Mode.Builder().build();
 
         FakeDisplayDevice() {
             super(mMockDisplayAdapter, /* displayToken= */ null, /* uniqueId= */ "", mContext);
@@ -3325,5 +3468,23 @@
         public DisplayDeviceInfo getDisplayDeviceInfoLocked() {
             return mDisplayDeviceInfo;
         }
+
+        @Override
+        public void setUserPreferredDisplayModeLocked(Display.Mode preferredMode) {
+            for (Display.Mode mode : mDisplayDeviceInfo.supportedModes) {
+                if (mode.matchesIfValid(
+                          preferredMode.getPhysicalWidth(),
+                          preferredMode.getPhysicalHeight(),
+                          preferredMode.getRefreshRate())) {
+                    mPreferredMode = mode;
+                    break;
+                }
+            }
+        }
+
+        @Override
+        public Display.Mode getUserPreferredDisplayModeLocked() {
+            return mPreferredMode;
+        }
     }
 }
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 5842dac..de93914 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
@@ -82,6 +82,7 @@
 import com.android.server.display.brightness.clamper.BrightnessClamperController;
 import com.android.server.display.brightness.clamper.HdrClamper;
 import com.android.server.display.color.ColorDisplayService;
+import com.android.server.display.config.HysteresisLevels;
 import com.android.server.display.config.SensorData;
 import com.android.server.display.feature.DisplayManagerFlags;
 import com.android.server.display.feature.flags.Flags;
@@ -264,7 +265,8 @@
         advanceTime(1);
 
         // The display should have been turned off
-        verify(mHolder.displayPowerState).setScreenState(Display.STATE_OFF);
+        verify(mHolder.displayPowerState)
+                .setScreenState(Display.STATE_OFF, Display.STATE_REASON_DEFAULT_POLICY);
 
         clearInvocations(mHolder.displayPowerState);
         when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_OFF);
@@ -275,13 +277,15 @@
         advanceTime(1);
 
         // The prox sensor is debounced so the display should not have been turned back on yet
-        verify(mHolder.displayPowerState, never()).setScreenState(Display.STATE_ON);
+        verify(mHolder.displayPowerState, never())
+                .setScreenState(Display.STATE_ON, Display.STATE_REASON_DEFAULT_POLICY);
 
         // Advance time by more than PROXIMITY_SENSOR_NEGATIVE_DEBOUNCE_DELAY
         advanceTime(1000);
 
         // The display should have been turned back on
-        verify(mHolder.displayPowerState).setScreenState(Display.STATE_ON);
+        verify(mHolder.displayPowerState)
+                .setScreenState(Display.STATE_ON, Display.STATE_REASON_DEFAULT_POLICY);
     }
 
     @Test
@@ -304,7 +308,8 @@
         advanceTime(1);
 
         // The display should have been turned off
-        verify(mHolder.displayPowerState).setScreenState(Display.STATE_OFF);
+        verify(mHolder.displayPowerState)
+                .setScreenState(Display.STATE_OFF, Display.STATE_REASON_DEFAULT_POLICY);
 
         when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_OFF);
         // The display device changes and we no longer have a prox sensor
@@ -317,7 +322,8 @@
 
         // The display should have been turned back on and the listener should have been
         // unregistered
-        verify(mHolder.displayPowerState).setScreenState(Display.STATE_ON);
+        verify(mHolder.displayPowerState)
+                .setScreenState(Display.STATE_ON, Display.STATE_REASON_DEFAULT_POLICY);
         verify(mSensorManagerMock).unregisterListener(listener);
     }
 
@@ -813,17 +819,17 @@
         DisplayPowerRequest dpr = new DisplayPowerRequest();
         mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
         advanceTime(1); // Run updatePowerState
-        verify(mHolder.displayPowerState).setScreenState(anyInt());
+        verify(mHolder.displayPowerState).setScreenState(anyInt(), anyInt());
 
         mHolder = createDisplayPowerController(42, UNIQUE_ID);
 
         mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
         advanceTime(1); // Run updatePowerState
-        verify(mHolder.displayPowerState, never()).setScreenState(anyInt());
+        verify(mHolder.displayPowerState, never()).setScreenState(anyInt(), anyInt());
 
         mHolder.dpc.onBootCompleted();
         advanceTime(1); // Run updatePowerState
-        verify(mHolder.displayPowerState).setScreenState(anyInt());
+        verify(mHolder.displayPowerState).setScreenState(anyInt(), anyInt());
     }
 
     @Test
@@ -1479,7 +1485,7 @@
         doAnswer(invocation -> {
             when(mHolder.displayPowerState.getScreenState()).thenReturn(invocation.getArgument(0));
             return null;
-        }).when(mHolder.displayPowerState).setScreenState(anyInt());
+        }).when(mHolder.displayPowerState).setScreenState(anyInt(), anyInt());
         mHolder.dpc.setDisplayOffloadSession(mDisplayOffloadSession);
 
         // start with DOZE.
@@ -1489,10 +1495,12 @@
         mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
         advanceTime(1); // Run updatePowerState
 
-        mHolder.dpc.overrideDozeScreenState(supportedTargetState);
+        mHolder.dpc.overrideDozeScreenState(
+                supportedTargetState, Display.STATE_REASON_DEFAULT_POLICY);
         advanceTime(1); // Run updatePowerState
 
-        verify(mHolder.displayPowerState).setScreenState(supportedTargetState);
+        verify(mHolder.displayPowerState)
+                .setScreenState(supportedTargetState, Display.STATE_REASON_DEFAULT_POLICY);
     }
 
     @Test
@@ -1505,7 +1513,7 @@
         doAnswer(invocation -> {
             when(mHolder.displayPowerState.getScreenState()).thenReturn(invocation.getArgument(0));
             return null;
-        }).when(mHolder.displayPowerState).setScreenState(anyInt());
+        }).when(mHolder.displayPowerState).setScreenState(anyInt(), anyInt());
         mHolder.dpc.setDisplayOffloadSession(mDisplayOffloadSession);
 
         // start with DOZE.
@@ -1515,10 +1523,12 @@
         mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
         advanceTime(1); // Run updatePowerState
 
-        mHolder.dpc.overrideDozeScreenState(unSupportedTargetState);
+        mHolder.dpc.overrideDozeScreenState(
+                unSupportedTargetState, Display.STATE_REASON_DEFAULT_POLICY);
         advanceTime(1); // Run updatePowerState
 
-        verify(mHolder.displayPowerState, never()).setScreenState(anyInt());
+        verify(mHolder.displayPowerState, never())
+                .setScreenState(anyInt(), eq(Display.STATE_REASON_DEFAULT_POLICY));
     }
 
     @Test
@@ -1530,7 +1540,7 @@
         doAnswer(invocation -> {
             when(mHolder.displayPowerState.getScreenState()).thenReturn(invocation.getArgument(0));
             return null;
-        }).when(mHolder.displayPowerState).setScreenState(anyInt());
+        }).when(mHolder.displayPowerState).setScreenState(anyInt(), anyInt());
         mHolder.dpc.setDisplayOffloadSession(mDisplayOffloadSession);
 
         // start with OFF.
@@ -1540,10 +1550,11 @@
         mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
         advanceTime(1); // Run updatePowerState
 
-        mHolder.dpc.overrideDozeScreenState(supportedTargetState);
+        mHolder.dpc.overrideDozeScreenState(
+                supportedTargetState, Display.STATE_REASON_DEFAULT_POLICY);
         advanceTime(1); // Run updatePowerState
 
-        verify(mHolder.displayPowerState, never()).setScreenState(anyInt());
+        verify(mHolder.displayPowerState, never()).setScreenState(anyInt(), anyInt());
     }
 
     @Test
@@ -1944,6 +1955,14 @@
                 .thenReturn(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE);
         when(displayDeviceConfigMock.getBrightnessRampDecreaseMaxIdleMillis())
                 .thenReturn(BRIGHTNESS_RAMP_DECREASE_MAX_IDLE);
+
+        final HysteresisLevels hysteresisLevels = mock(HysteresisLevels.class);
+        when(displayDeviceConfigMock.getAmbientBrightnessHysteresis()).thenReturn(hysteresisLevels);
+        when(displayDeviceConfigMock.getAmbientBrightnessIdleHysteresis()).thenReturn(
+                hysteresisLevels);
+        when(displayDeviceConfigMock.getScreenBrightnessHysteresis()).thenReturn(hysteresisLevels);
+        when(displayDeviceConfigMock.getScreenBrightnessIdleHysteresis()).thenReturn(
+                hysteresisLevels);
     }
 
     private DisplayPowerControllerHolder createDisplayPowerController(int displayId,
@@ -1985,7 +2004,7 @@
 
         TestInjector injector = spy(new TestInjector(displayPowerState, animator,
                 automaticBrightnessController, wakelockController, brightnessMappingStrategy,
-                hysteresisLevels, screenOffBrightnessSensorController,
+                screenOffBrightnessSensorController,
                 hbmController, normalBrightnessModeController, hdrClamper,
                 clamperController, mDisplayManagerFlagsMock));
 
@@ -1995,6 +2014,11 @@
         final BrightnessSetting brightnessSetting = mock(BrightnessSetting.class);
         final DisplayDeviceConfig config = mock(DisplayDeviceConfig.class);
 
+        when(config.getAmbientBrightnessHysteresis()).thenReturn(hysteresisLevels);
+        when(config.getAmbientBrightnessIdleHysteresis()).thenReturn(hysteresisLevels);
+        when(config.getScreenBrightnessHysteresis()).thenReturn(hysteresisLevels);
+        when(config.getScreenBrightnessIdleHysteresis()).thenReturn(hysteresisLevels);
+
         setUpDisplay(displayId, uniqueId, display, device, config, isEnabled);
         when(config.isAutoBrightnessAvailable()).thenReturn(isAutoBrightnessAvailable);
 
@@ -2070,7 +2094,6 @@
         private final AutomaticBrightnessController mAutomaticBrightnessController;
         private final WakelockController mWakelockController;
         private final BrightnessMappingStrategy mBrightnessMappingStrategy;
-        private final HysteresisLevels mHysteresisLevels;
         private final ScreenOffBrightnessSensorController mScreenOffBrightnessSensorController;
         private final HighBrightnessModeController mHighBrightnessModeController;
 
@@ -2086,7 +2109,6 @@
                 AutomaticBrightnessController automaticBrightnessController,
                 WakelockController wakelockController,
                 BrightnessMappingStrategy brightnessMappingStrategy,
-                HysteresisLevels hysteresisLevels,
                 ScreenOffBrightnessSensorController screenOffBrightnessSensorController,
                 HighBrightnessModeController highBrightnessModeController,
                 NormalBrightnessModeController normalBrightnessModeController,
@@ -2098,7 +2120,6 @@
             mAutomaticBrightnessController = automaticBrightnessController;
             mWakelockController = wakelockController;
             mBrightnessMappingStrategy = brightnessMappingStrategy;
-            mHysteresisLevels = hysteresisLevels;
             mScreenOffBrightnessSensorController = screenOffBrightnessSensorController;
             mHighBrightnessModeController = highBrightnessModeController;
             mNormalBrightnessModeController = normalBrightnessModeController;
@@ -2176,22 +2197,6 @@
         }
 
         @Override
-        HysteresisLevels getHysteresisLevels(float[] brighteningThresholdsPercentages,
-                float[] darkeningThresholdsPercentages, float[] brighteningThresholdLevels,
-                float[] darkeningThresholdLevels, float minDarkeningThreshold,
-                float minBrighteningThreshold) {
-            return mHysteresisLevels;
-        }
-
-        @Override
-        HysteresisLevels getHysteresisLevels(float[] brighteningThresholdsPercentages,
-                float[] darkeningThresholdsPercentages, float[] brighteningThresholdLevels,
-                float[] darkeningThresholdLevels, float minDarkeningThreshold,
-                float minBrighteningThreshold, boolean potentialOldBrightnessRange) {
-            return mHysteresisLevels;
-        }
-
-        @Override
         ScreenOffBrightnessSensorController getScreenOffBrightnessSensorController(
                 SensorManager sensorManager, Sensor lightSensor, Handler handler,
                 ScreenOffBrightnessSensorController.Clock clock, int[] sensorValueToLux,
diff --git a/services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayPolicyTest.java b/services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayPolicyTest.java
index 1a71e77..ea08be4 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayPolicyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/ExternalDisplayPolicyTest.java
@@ -317,7 +317,8 @@
                 mDisplayEventCaptor.capture());
         assertThat(mLogicalDisplayCaptor.getValue()).isEqualTo(mMockedLogicalDisplay);
         assertThat(mDisplayEventCaptor.getValue()).isEqualTo(EVENT_DISPLAY_CONNECTED);
-        verify(mMockedLogicalDisplay).setEnabledLocked(false);
+        verify(mMockedLogicalDisplayMapper).setDisplayEnabledLocked(eq(mMockedLogicalDisplay),
+                eq(false));
         clearInvocations(mMockedLogicalDisplayMapper);
         clearInvocations(mMockedLogicalDisplay);
     }
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 14de527..7fd96c5 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
@@ -49,6 +49,7 @@
 import android.view.Display;
 import android.view.DisplayAddress;
 import android.view.SurfaceControl;
+import android.view.SurfaceControl.IdleScreenRefreshRateConfig;
 import android.view.SurfaceControl.RefreshRateRange;
 import android.view.SurfaceControl.RefreshRateRanges;
 
@@ -830,18 +831,20 @@
                 .get()
                 .getModeId();
 
+        IdleScreenRefreshRateConfig
+                idleScreenRefreshRateConfig = new SurfaceControl.IdleScreenRefreshRateConfig(500);
         displayDevice.setDesiredDisplayModeSpecsLocked(
                 new DisplayModeDirector.DesiredDisplayModeSpecs(
                         /*baseModeId*/ baseModeId,
                         /*allowGroupSwitching*/ false,
-                        REFRESH_RATE_RANGES, REFRESH_RATE_RANGES
+                        REFRESH_RATE_RANGES, REFRESH_RATE_RANGES, idleScreenRefreshRateConfig
                 ));
         waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
         verify(mSurfaceControlProxy).setDesiredDisplayModeSpecs(display.token,
                 new SurfaceControl.DesiredDisplayModeSpecs(
                         /* baseModeId */ 0,
                         /* allowGroupSwitching */ false,
-                        REFRESH_RATE_RANGES, REFRESH_RATE_RANGES
+                        REFRESH_RATE_RANGES, REFRESH_RATE_RANGES, idleScreenRefreshRateConfig
                 ));
 
         // Change the display
@@ -862,12 +865,13 @@
 
         baseModeId = displayDevice.getDisplayDeviceInfoLocked().supportedModes[0].getModeId();
 
+        idleScreenRefreshRateConfig = new SurfaceControl.IdleScreenRefreshRateConfig(600);
         // The traversal request will call setDesiredDisplayModeSpecsLocked on the display device
         displayDevice.setDesiredDisplayModeSpecsLocked(
                 new DisplayModeDirector.DesiredDisplayModeSpecs(
                         /*baseModeId*/ baseModeId,
                         /*allowGroupSwitching*/ false,
-                        REFRESH_RATE_RANGES, REFRESH_RATE_RANGES
+                        REFRESH_RATE_RANGES, REFRESH_RATE_RANGES, idleScreenRefreshRateConfig
                 ));
 
         waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
@@ -877,7 +881,7 @@
                 new SurfaceControl.DesiredDisplayModeSpecs(
                         /* baseModeId */ 2,
                         /* allowGroupSwitching */ false,
-                        REFRESH_RATE_RANGES, REFRESH_RATE_RANGES
+                        REFRESH_RATE_RANGES, REFRESH_RATE_RANGES, idleScreenRefreshRateConfig
                 ));
     }
 
@@ -1319,7 +1323,8 @@
                 new SurfaceControl.DesiredDisplayModeSpecs(
                         /* defaultMode */ 0,
                         /* allowGroupSwitching */ false,
-                        REFRESH_RATE_RANGES, REFRESH_RATE_RANGES
+                        REFRESH_RATE_RANGES, REFRESH_RATE_RANGES,
+                        new IdleScreenRefreshRateConfig(100)
                 );
 
         private FakeDisplay(int port) {
diff --git a/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayMapperTest.java b/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayMapperTest.java
index d0c7077..1a03e78 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayMapperTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayMapperTest.java
@@ -20,6 +20,8 @@
 import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.Display.DEFAULT_DISPLAY_GROUP;
 import static android.view.Display.FLAG_REAR;
+import static android.view.Display.STATE_OFF;
+import static android.view.Display.STATE_ON;
 import static android.view.Display.TYPE_EXTERNAL;
 import static android.view.Display.TYPE_INTERNAL;
 import static android.view.Display.TYPE_VIRTUAL;
@@ -28,6 +30,7 @@
 import static com.android.server.display.DisplayAdapter.DISPLAY_DEVICE_EVENT_ADDED;
 import static com.android.server.display.DisplayAdapter.DISPLAY_DEVICE_EVENT_CHANGED;
 import static com.android.server.display.DisplayAdapter.DISPLAY_DEVICE_EVENT_REMOVED;
+import static com.android.server.display.DisplayDeviceInfo.DIFF_EVERYTHING;
 import static com.android.server.display.DisplayDeviceInfo.FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY;
 import static com.android.server.display.LogicalDisplayMapper.LOGICAL_DISPLAY_EVENT_ADDED;
 import static com.android.server.display.LogicalDisplayMapper.LOGICAL_DISPLAY_EVENT_CONNECTED;
@@ -35,6 +38,9 @@
 import static com.android.server.display.LogicalDisplayMapper.LOGICAL_DISPLAY_EVENT_REMOVED;
 import static com.android.server.display.layout.Layout.Display.POSITION_REAR;
 import static com.android.server.display.layout.Layout.Display.POSITION_UNKNOWN;
+import static com.android.server.utils.FoldSettingProvider.SETTING_VALUE_SELECTIVE_STAY_AWAKE;
+import static com.android.server.utils.FoldSettingProvider.SETTING_VALUE_SLEEP_ON_FOLD;
+import static com.android.server.utils.FoldSettingProvider.SETTING_VALUE_STAY_AWAKE_ON_FOLD;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -72,12 +78,17 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
+import com.android.internal.foldables.FoldGracePeriodProvider;
+import com.android.internal.util.test.LocalServiceKeeperRule;
+import com.android.server.LocalServices;
 import com.android.server.display.feature.DisplayManagerFlags;
 import com.android.server.display.layout.DisplayIdProducer;
 import com.android.server.display.layout.Layout;
+import com.android.server.policy.WindowManagerPolicy;
 import com.android.server.utils.FoldSettingProvider;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -96,9 +107,13 @@
 @RunWith(AndroidJUnit4.class)
 public class LogicalDisplayMapperTest {
     private static int sUniqueTestDisplayId = 0;
+    private static final int TIMEOUT_STATE_TRANSITION_MILLIS = 500;
+    private static final int FOLD_SETTLE_DELAY = 1000;
     private static final int DEVICE_STATE_CLOSED = 0;
+    private static final int DEVICE_STATE_HALF_OPEN = 1;
     private static final int DEVICE_STATE_OPEN = 2;
     private static final int FLAG_GO_TO_SLEEP_ON_FOLD = 0;
+    private static final int FLAG_GO_TO_SLEEP_FLAG_SOFT_SLEEP = 2;
     private static int sNextNonDefaultDisplayId = DEFAULT_DISPLAY + 1;
     private static final File NON_EXISTING_FILE = new File("/non_existing_folder/should_not_exist");
 
@@ -113,14 +128,19 @@
 
     private DeviceStateToLayoutMap mDeviceStateToLayoutMapSpy;
 
+    @Rule
+    public LocalServiceKeeperRule mLocalServiceKeeperRule = new LocalServiceKeeperRule();
+
     @Mock LogicalDisplayMapper.Listener mListenerMock;
     @Mock Context mContextMock;
     @Mock FoldSettingProvider mFoldSettingProviderMock;
+    @Mock FoldGracePeriodProvider mFoldGracePeriodProvider;
     @Mock Resources mResourcesMock;
     @Mock IPowerManager mIPowerManagerMock;
     @Mock IThermalService mIThermalServiceMock;
     @Mock DisplayManagerFlags mFlagsMock;
     @Mock DisplayAdapter mDisplayAdapterMock;
+    @Mock WindowManagerPolicy mWindowManagerPolicy;
 
     @Captor ArgumentCaptor<LogicalDisplay> mDisplayCaptor;
     @Captor ArgumentCaptor<Integer> mDisplayEventCaptor;
@@ -131,6 +151,9 @@
         System.setProperty("dexmaker.share_classloader", "true");
         MockitoAnnotations.initMocks(this);
 
+        mLocalServiceKeeperRule.overrideLocalService(WindowManagerPolicy.class,
+                mWindowManagerPolicy);
+
         mDeviceStateToLayoutMapSpy =
                 spy(new DeviceStateToLayoutMap(mIdProducer, mFlagsMock, NON_EXISTING_FILE));
         mDisplayDeviceRepo = new DisplayDeviceRepository(
@@ -160,6 +183,7 @@
                 .thenReturn(Context.POWER_SERVICE);
         when(mFoldSettingProviderMock.shouldStayAwakeOnFold()).thenReturn(false);
         when(mFoldSettingProviderMock.shouldSleepOnFold()).thenReturn(false);
+        when(mFoldSettingProviderMock.shouldSelectiveStayAwakeOnFold()).thenReturn(true);
         when(mIPowerManagerMock.isInteractive()).thenReturn(true);
         when(mContextMock.getSystemService(PowerManager.class)).thenReturn(mPowerManager);
         when(mContextMock.getResources()).thenReturn(mResourcesMock);
@@ -177,9 +201,11 @@
         mLooper = new TestLooper();
         mHandler = new Handler(mLooper.getLooper());
         mLogicalDisplayMapper = new LogicalDisplayMapper(mContextMock, mFoldSettingProviderMock,
+                mFoldGracePeriodProvider,
                 mDisplayDeviceRepo,
                 mListenerMock, new DisplayManagerService.SyncRoot(), mHandler,
                 mDeviceStateToLayoutMapSpy, mFlagsMock);
+        mLogicalDisplayMapper.onWindowManagerReady();
     }
 
 
@@ -681,22 +707,185 @@
         when(mFoldSettingProviderMock.shouldSleepOnFold()).thenReturn(true);
 
         finishBootAndFoldDevice();
+        advanceTime(FOLD_SETTLE_DELAY);
 
         verify(mIPowerManagerMock, atLeastOnce()).goToSleep(anyLong(), anyInt(),
                 eq(FLAG_GO_TO_SLEEP_ON_FOLD));
     }
 
     @Test
+    public void testDeviceShouldPutToSleepWhenFoldSettingSelective() throws RemoteException {
+        when(mFoldSettingProviderMock.shouldSelectiveStayAwakeOnFold()).thenReturn(true);
+
+        finishBootAndFoldDevice();
+        advanceTime(FOLD_SETTLE_DELAY);
+
+        verify(mIPowerManagerMock, atLeastOnce()).goToSleep(anyLong(), anyInt(),
+                eq(FLAG_GO_TO_SLEEP_FLAG_SOFT_SLEEP));
+    }
+
+    @Test
     public void testDeviceShouldNotBePutToSleepWhenSleepSettingFalse() throws RemoteException {
         when(mFoldSettingProviderMock.shouldSleepOnFold()).thenReturn(false);
 
         finishBootAndFoldDevice();
+        advanceTime(FOLD_SETTLE_DELAY);
 
         verify(mIPowerManagerMock, never()).goToSleep(anyLong(), anyInt(),
                 eq(FLAG_GO_TO_SLEEP_ON_FOLD));
     }
 
     @Test
+    public void testWaitForSleepWhenFoldSettingSleep() {
+        // Test device should not be marked ready for transition immediately, when 'Continue
+        // using app on fold' set to 'Never'
+        setFoldLockBehaviorSettingValue(SETTING_VALUE_SLEEP_ON_FOLD);
+        setGracePeriodAvailability(false);
+        FoldableDisplayDevices foldableDisplayDevices = createFoldableDeviceStateToLayoutMap();
+
+        finishBootAndFoldDevice();
+        foldableDisplayDevices.mInner.setState(STATE_OFF);
+        notifyDisplayChanges(foldableDisplayDevices.mOuter);
+
+        assertDisplayDisabled(foldableDisplayDevices.mOuter);
+        assertDisplayEnabled(foldableDisplayDevices.mInner);
+    }
+
+    @Test
+    public void testSwapDeviceStateWithDelayWhenFoldSettingSleep() {
+        // Test device should be marked ready for transition after a delay when 'Continue using
+        // app on fold' set to 'Never'
+        setFoldLockBehaviorSettingValue(SETTING_VALUE_SLEEP_ON_FOLD);
+        setGracePeriodAvailability(false);
+        FoldableDisplayDevices foldableDisplayDevices = createFoldableDeviceStateToLayoutMap();
+
+        finishBootAndFoldDevice();
+        foldableDisplayDevices.mInner.setState(STATE_OFF);
+        notifyDisplayChanges(foldableDisplayDevices.mOuter);
+        advanceTime(TIMEOUT_STATE_TRANSITION_MILLIS);
+
+        assertDisplayEnabled(foldableDisplayDevices.mOuter);
+        assertDisplayDisabled(foldableDisplayDevices.mInner);
+    }
+
+    @Test
+    public void testDisplaySwappedAfterDeviceStateChange_windowManagerIsNotified() {
+        FoldableDisplayDevices foldableDisplayDevices = createFoldableDeviceStateToLayoutMap();
+        mLogicalDisplayMapper.setDeviceStateLocked(DEVICE_STATE_OPEN);
+        mLogicalDisplayMapper.onEarlyInteractivityChange(true);
+        mLogicalDisplayMapper.onBootCompleted();
+        advanceTime(1000);
+        clearInvocations(mWindowManagerPolicy);
+
+        // Switch from 'inner' to 'outer' display (fold a foldable device)
+        mLogicalDisplayMapper.setDeviceStateLocked(DEVICE_STATE_CLOSED);
+        // Continue folding device state transition by turning off the inner display
+        foldableDisplayDevices.mInner.setState(STATE_OFF);
+        notifyDisplayChanges(foldableDisplayDevices.mOuter);
+        advanceTime(TIMEOUT_STATE_TRANSITION_MILLIS);
+
+        verify(mWindowManagerPolicy).onDisplaySwitchStart(DEFAULT_DISPLAY);
+    }
+
+    @Test
+    public void testCreateNewLogicalDisplay_windowManagerIsNotNotifiedAboutSwitch() {
+        DisplayDevice device1 = createDisplayDevice(TYPE_EXTERNAL, 600, 800,
+                FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY);
+        when(mDeviceStateToLayoutMapSpy.size()).thenReturn(1);
+        LogicalDisplay display1 = add(device1);
+
+        assertTrue(display1.isEnabledLocked());
+
+        DisplayDevice device2 = createDisplayDevice(TYPE_INTERNAL, 600, 800,
+                FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY);
+        when(mDeviceStateToLayoutMapSpy.size()).thenReturn(2);
+        add(device2);
+
+        // As it is not a display switch but adding a new display, we should not notify
+        // about display switch start to window manager
+        verify(mWindowManagerPolicy, never()).onDisplaySwitchStart(anyInt());
+    }
+
+    @Test
+    public void testDoNotWaitForSleepWhenFoldSettingStayAwake() {
+        // Test device should be marked ready for transition immediately when 'Continue using app
+        // on fold' set to 'Always'
+        setFoldLockBehaviorSettingValue(SETTING_VALUE_STAY_AWAKE_ON_FOLD);
+        setGracePeriodAvailability(false);
+        FoldableDisplayDevices foldableDisplayDevices = createFoldableDeviceStateToLayoutMap();
+
+        finishBootAndFoldDevice();
+        foldableDisplayDevices.mInner.setState(STATE_OFF);
+        notifyDisplayChanges(foldableDisplayDevices.mOuter);
+
+        assertDisplayEnabled(foldableDisplayDevices.mOuter);
+        assertDisplayDisabled(foldableDisplayDevices.mInner);
+    }
+
+    @Test
+    public void testDoNotWaitForSleepWhenFoldSettingSelectiveStayAwake() {
+        // Test device should be marked ready for transition immediately when 'Continue using app
+        // on fold' set to 'Swipe up to continue'
+        setFoldLockBehaviorSettingValue(SETTING_VALUE_SELECTIVE_STAY_AWAKE);
+        setGracePeriodAvailability(true);
+        FoldableDisplayDevices foldableDisplayDevices = createFoldableDeviceStateToLayoutMap();
+
+        finishBootAndFoldDevice();
+        foldableDisplayDevices.mInner.setState(STATE_OFF);
+        notifyDisplayChanges(foldableDisplayDevices.mOuter);
+
+        assertDisplayEnabled(foldableDisplayDevices.mOuter);
+        assertDisplayDisabled(foldableDisplayDevices.mInner);
+    }
+
+    @Test
+    public void testWaitForSleepWhenGracePeriodSettingDisabled() {
+        // Test device should not be marked ready for transition immediately when 'Continue using
+        // app on fold' set to 'Swipe up to continue' but Grace Period flag is disabled
+        setFoldLockBehaviorSettingValue(SETTING_VALUE_SELECTIVE_STAY_AWAKE);
+        setGracePeriodAvailability(false);
+        FoldableDisplayDevices foldableDisplayDevices = createFoldableDeviceStateToLayoutMap();
+
+        finishBootAndFoldDevice();
+        foldableDisplayDevices.mInner.setState(STATE_OFF);
+        notifyDisplayChanges(foldableDisplayDevices.mOuter);
+
+        assertDisplayDisabled(foldableDisplayDevices.mOuter);
+        assertDisplayEnabled(foldableDisplayDevices.mInner);
+    }
+
+    @Test
+    public void testWaitForSleepWhenTransitionDisplayStaysOn() {
+        // Test device should not be marked ready for transition immediately, when 'Continue
+        // using app on fold' set to 'Always' but not all transitioning displays are OFF.
+        setFoldLockBehaviorSettingValue(SETTING_VALUE_STAY_AWAKE_ON_FOLD);
+        setGracePeriodAvailability(false);
+        FoldableDisplayDevices foldableDisplayDevices = createFoldableDeviceStateToLayoutMap();
+
+        finishBootAndFoldDevice();
+        notifyDisplayChanges(foldableDisplayDevices.mOuter);
+
+        assertDisplayDisabled(foldableDisplayDevices.mOuter);
+        assertDisplayEnabled(foldableDisplayDevices.mInner);
+    }
+
+    @Test
+    public void testSwapDeviceStateWithDelayWhenTransitionDisplayStaysOn() {
+        // Test device should be marked ready for transition after a delay, when 'Continue using
+        // app on fold' set to 'Never' but not all transitioning displays are OFF.
+        setFoldLockBehaviorSettingValue(SETTING_VALUE_SLEEP_ON_FOLD);
+        setGracePeriodAvailability(false);
+        FoldableDisplayDevices foldableDisplayDevices = createFoldableDeviceStateToLayoutMap();
+
+        finishBootAndFoldDevice();
+        notifyDisplayChanges(foldableDisplayDevices.mOuter);
+        advanceTime(TIMEOUT_STATE_TRANSITION_MILLIS);
+
+        assertDisplayEnabled(foldableDisplayDevices.mOuter);
+        assertDisplayDisabled(foldableDisplayDevices.mInner);
+    }
+
+    @Test
     public void testDeviceStateLocked() {
         DisplayDevice device1 = createDisplayDevice(TYPE_INTERNAL, 600, 800,
                 FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY);
@@ -950,13 +1139,77 @@
     // Helper Methods
     /////////////////
 
+    private void setGracePeriodAvailability(boolean isGracePeriodEnabled) {
+        when(mFoldGracePeriodProvider.isEnabled()).thenReturn(isGracePeriodEnabled);
+    }
+
+    private void setFoldLockBehaviorSettingValue(String foldLockBehaviorSettingValue) {
+        when(mFoldSettingProviderMock.shouldSleepOnFold()).thenReturn(false);
+        when(mFoldSettingProviderMock.shouldStayAwakeOnFold()).thenReturn(false);
+        when(mFoldSettingProviderMock.shouldSelectiveStayAwakeOnFold()).thenReturn(false);
+
+        switch (foldLockBehaviorSettingValue) {
+            case SETTING_VALUE_STAY_AWAKE_ON_FOLD:
+                when(mFoldSettingProviderMock.shouldStayAwakeOnFold()).thenReturn(true);
+                break;
+
+            case SETTING_VALUE_SLEEP_ON_FOLD:
+                when(mFoldSettingProviderMock.shouldSleepOnFold()).thenReturn(true);
+                break;
+
+            default:
+                when(mFoldSettingProviderMock.shouldSelectiveStayAwakeOnFold()).thenReturn(true);
+                break;
+        }
+    }
+
+    private FoldableDisplayDevices createFoldableDeviceStateToLayoutMap() {
+        TestDisplayDevice outer = createDisplayDevice(TYPE_INTERNAL, 600, 800,
+                FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY);
+        TestDisplayDevice inner = createDisplayDevice(TYPE_INTERNAL, 600, 800,
+                FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY);
+        outer.setState(STATE_OFF);
+        inner.setState(STATE_ON);
+
+        Layout layout = new Layout();
+        createDefaultDisplay(layout, outer);
+        createNonDefaultDisplay(layout, inner, /* enabled= */ false, /* group= */ null);
+        when(mDeviceStateToLayoutMapSpy.get(DEVICE_STATE_CLOSED)).thenReturn(layout);
+
+        layout = new Layout();
+        createNonDefaultDisplay(layout, outer, /* enabled= */ false, /* group= */ null);
+        createDefaultDisplay(layout, inner);
+        when(mDeviceStateToLayoutMapSpy.get(DEVICE_STATE_HALF_OPEN)).thenReturn(layout);
+        when(mDeviceStateToLayoutMapSpy.get(DEVICE_STATE_OPEN)).thenReturn(layout);
+        when(mDeviceStateToLayoutMapSpy.size()).thenReturn(4);
+
+        add(outer);
+        add(inner);
+
+        return new FoldableDisplayDevices(outer, inner);
+    }
+
     private void finishBootAndFoldDevice() {
         mLogicalDisplayMapper.setDeviceStateLocked(DEVICE_STATE_OPEN);
+        mLogicalDisplayMapper.onEarlyInteractivityChange(true);
         advanceTime(1000);
         mLogicalDisplayMapper.onBootCompleted();
         advanceTime(1000);
         mLogicalDisplayMapper.setDeviceStateLocked(DEVICE_STATE_CLOSED);
-        advanceTime(1000);
+    }
+
+    private void notifyDisplayChanges(TestDisplayDevice displayDevice) {
+        mLogicalDisplayMapper.onDisplayDeviceChangedLocked(displayDevice, DIFF_EVERYTHING);
+    }
+
+    private void assertDisplayEnabled(DisplayDevice displayDevice) {
+        assertThat(
+                mLogicalDisplayMapper.getDisplayLocked(displayDevice).isEnabledLocked()).isTrue();
+    }
+
+    private void assertDisplayDisabled(DisplayDevice displayDevice) {
+        assertThat(
+                mLogicalDisplayMapper.getDisplayLocked(displayDevice).isEnabledLocked()).isFalse();
     }
 
     private void createDefaultDisplay(Layout layout, DisplayDevice device) {
@@ -1058,6 +1311,16 @@
         assertNotEquals(DEFAULT_DISPLAY, id(displayRemoved));
     }
 
+    private final static class FoldableDisplayDevices {
+        final TestDisplayDevice mOuter;
+        final TestDisplayDevice mInner;
+
+        FoldableDisplayDevices(TestDisplayDevice outer, TestDisplayDevice inner) {
+            this.mOuter = outer;
+            this.mInner = inner;
+        }
+    }
+
     class TestDisplayDevice extends DisplayDevice {
         private DisplayDeviceInfo mInfo;
         private DisplayDeviceInfo mSentInfo;
@@ -1083,6 +1346,16 @@
             mSentInfo = null;
         }
 
+        public void setState(int state) {
+            mState = state;
+            if (mSentInfo == null) {
+                mInfo.state = state;
+            } else {
+                mInfo.state = state;
+                mSentInfo.state = state;
+            }
+        }
+
         @Override
         public boolean hasStableUniqueId() {
             return true;
diff --git a/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayTest.java b/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayTest.java
index e798aa2..779445e 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayTest.java
@@ -142,8 +142,39 @@
         assertEquals(new Point(0, DISPLAY_HEIGHT / 4), mLogicalDisplay.getDisplayPosition());
     }
 
+
+    @Test
+    public void testNoLetterbox_noAnisotropyCorrectionForInternalDisplay() {
+        mDisplayDeviceInfo.type = Display.TYPE_INTERNAL;
+        mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
+                /*isAnisotropyCorrectionEnabled=*/ true,
+                /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
+
+        // In case of Anisotropy of pixels, then the content should be rescaled so it would adjust
+        // to using the whole screen. This is because display will rescale it back to fill the
+        // screen (in case the display menu setting is set to stretch the pixels across the display)
+        mDisplayDeviceInfo.xDpi = 0.5f;
+        mDisplayDeviceInfo.yDpi = 1.0f;
+
+        mLogicalDisplay.updateLocked(mDeviceRepo);
+        var originalDisplayInfo = mLogicalDisplay.getDisplayInfoLocked();
+        // Content width not scaled
+        assertEquals(DISPLAY_WIDTH, originalDisplayInfo.logicalWidth);
+        assertEquals(DISPLAY_HEIGHT, originalDisplayInfo.logicalHeight);
+
+        SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
+        mLogicalDisplay.configureDisplayLocked(t, mDisplayDevice, false);
+
+        // Applications need to think that they are shown on a display with square pixels.
+        // as applications can be displayed on multiple displays simultaneously (mirrored).
+        // Content is too wide, should have become letterboxed - but it won't because of anisotropy
+        // correction
+        assertEquals(new Point(0, 0), mLogicalDisplay.getDisplayPosition());
+    }
+
     @Test
     public void testNoLetterbox_anisotropyCorrection() {
+        mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
                 /*isAnisotropyCorrectionEnabled=*/ true,
                 /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
@@ -172,6 +203,7 @@
 
     @Test
     public void testLetterbox_anisotropyCorrectionYDpi() {
+        mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
                 /*isAnisotropyCorrectionEnabled=*/ true,
                 /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
@@ -229,6 +261,7 @@
 
     @Test
     public void testPillarbox_anisotropyCorrection() {
+        mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
                 /*isAnisotropyCorrectionEnabled=*/ true,
                 /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
@@ -257,6 +290,7 @@
 
     @Test
     public void testNoPillarbox_anisotropyCorrectionYDpi() {
+        mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
                 /*isAnisotropyCorrectionEnabled=*/ true,
                 /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
@@ -318,6 +352,7 @@
 
     @Test
     public void testGetDisplayPositionAlwaysRotateDisplayEnabled() {
+        mDisplayDeviceInfo.type = Display.TYPE_EXTERNAL;
         mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice,
                 /*isAnisotropyCorrectionEnabled=*/ true,
                 /*isAlwaysRotateDisplayDeviceEnabled=*/ true);
diff --git a/services/tests/displayservicetests/src/com/android/server/display/NormalBrightnessModeControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/NormalBrightnessModeControllerTest.java
index c379d6b..3fd3cef 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/NormalBrightnessModeControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/NormalBrightnessModeControllerTest.java
@@ -43,6 +43,11 @@
 
     private final NormalBrightnessModeController mController = new NormalBrightnessModeController();
 
+    // AutoBrightnessController sends ambientLux values *only* when auto brightness enabled.
+    // NormalBrightnessModeController is temporary disabled  if auto brightness is off,
+    // to avoid capping brightness based on stale ambient lux. Temporary disabling tests with
+    // auto brightness off and default config pres
+    // The issue is tracked here: b/322445088
     @Keep
     private static Object[][] brightnessData() {
         return new Object[][]{
@@ -59,10 +64,10 @@
                         ImmutableMap.of(99f, 0.1f, 101f, 0.2f)
                 ), 0.2f},
                 // Auto brightness - off, config only for default
-                {100, AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED, ImmutableMap.of(
-                        BrightnessLimitMapType.DEFAULT,
-                        ImmutableMap.of(99f, 0.1f, 101f, 0.2f)
-                ), 0.2f},
+                // {100, AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED, ImmutableMap.of(
+                //        BrightnessLimitMapType.DEFAULT,
+                //        ImmutableMap.of(99f, 0.1f, 101f, 0.2f)
+                // ), 0.2f},
                 // Auto brightness - off, config only for adaptive
                 {100, AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED, ImmutableMap.of(
                         BrightnessLimitMapType.ADAPTIVE,
@@ -81,12 +86,12 @@
                         ImmutableMap.of(99f, 0.3f, 101f, 0.4f)
                 ), 0.4f},
                 // Auto brightness - off, config for both
-                {100, AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED, ImmutableMap.of(
-                        BrightnessLimitMapType.DEFAULT,
-                        ImmutableMap.of(99f, 0.1f, 101f, 0.2f),
-                        BrightnessLimitMapType.ADAPTIVE,
-                        ImmutableMap.of(99f, 0.3f, 101f, 0.4f)
-                ), 0.2f},
+                // {100, AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED, ImmutableMap.of(
+                //        BrightnessLimitMapType.DEFAULT,
+                //        ImmutableMap.of(99f, 0.1f, 101f, 0.2f),
+                //        BrightnessLimitMapType.ADAPTIVE,
+                //        ImmutableMap.of(99f, 0.3f, 101f, 0.4f)
+                // ), 0.2f},
                 // Auto brightness - on, config for both, ambient high
                 {1000, AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED, ImmutableMap.of(
                         BrightnessLimitMapType.DEFAULT,
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java
index 6ed8238..1ae4099 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java
@@ -19,7 +19,7 @@
 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.ArgumentMatchers.any;
 import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
@@ -111,8 +111,7 @@
         DisplayBrightnessStrategy displayBrightnessStrategy = mock(DisplayBrightnessStrategy.class);
         int targetDisplayState = Display.STATE_DOZE;
         when(mDisplayBrightnessStrategySelector.selectStrategy(
-                eq(new StrategySelectionRequest(displayPowerRequest, targetDisplayState))))
-                .thenReturn(displayBrightnessStrategy);
+                any(StrategySelectionRequest.class))).thenReturn(displayBrightnessStrategy);
         mDisplayBrightnessController.updateBrightness(displayPowerRequest, targetDisplayState);
         verify(displayBrightnessStrategy).updateBrightness(displayPowerRequest);
         assertEquals(mDisplayBrightnessController.getCurrentDisplayBrightnessStrategy(),
@@ -164,6 +163,7 @@
         // No brightness is set if the pending brightness is invalid
         mDisplayBrightnessController.setPendingScreenBrightness(Float.NaN);
         assertFalse(mDisplayBrightnessController.updateUserSetScreenBrightness());
+        assertFalse(mDisplayBrightnessController.getIsUserSetScreenBrightnessUpdated());
 
         // user set brightness is not set if the current and the pending brightness are same.
         float currentBrightness = 0.4f;
@@ -175,6 +175,7 @@
         mDisplayBrightnessController.setPendingScreenBrightness(currentBrightness);
         mDisplayBrightnessController.setTemporaryBrightness(currentBrightness);
         assertFalse(mDisplayBrightnessController.updateUserSetScreenBrightness());
+        assertFalse(mDisplayBrightnessController.getIsUserSetScreenBrightnessUpdated());
         verify(temporaryBrightnessStrategy).setTemporaryScreenBrightness(
                 PowerManager.BRIGHTNESS_INVALID_FLOAT);
         assertEquals(mDisplayBrightnessController.getPendingScreenBrightness(),
@@ -188,6 +189,7 @@
         mDisplayBrightnessController.setPendingScreenBrightness(pendingScreenBrightness);
         mDisplayBrightnessController.setTemporaryBrightness(temporaryScreenBrightness);
         assertTrue(mDisplayBrightnessController.updateUserSetScreenBrightness());
+        assertTrue(mDisplayBrightnessController.getIsUserSetScreenBrightnessUpdated());
         assertEquals(mDisplayBrightnessController.getCurrentBrightness(),
                 pendingScreenBrightness, /* delta= */ 0.0f);
         assertEquals(mDisplayBrightnessController.getLastUserSetScreenBrightness(),
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java
index 4c9dd58..b8858cc 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java
@@ -22,6 +22,7 @@
 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.ContentResolver;
@@ -40,6 +41,7 @@
 import com.android.internal.util.test.FakeSettingsProvider;
 import com.android.internal.util.test.FakeSettingsProviderRule;
 import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy;
+import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy2;
 import com.android.server.display.brightness.strategy.BoostBrightnessStrategy;
 import com.android.server.display.brightness.strategy.DozeBrightnessStrategy;
 import com.android.server.display.brightness.strategy.FollowerBrightnessStrategy;
@@ -80,6 +82,8 @@
     @Mock
     private AutomaticBrightnessStrategy mAutomaticBrightnessStrategy;
     @Mock
+    private AutomaticBrightnessStrategy2 mAutomaticBrightnessStrategy2;
+    @Mock
     private OffloadBrightnessStrategy mOffloadBrightnessStrategy;
     @Mock
     private Resources mResources;
@@ -126,12 +130,18 @@
                 }
 
                 @Override
-                AutomaticBrightnessStrategy getAutomaticBrightnessStrategy(Context context,
+                AutomaticBrightnessStrategy getAutomaticBrightnessStrategy1(Context context,
                         int displayId) {
                     return mAutomaticBrightnessStrategy;
                 }
 
                 @Override
+                AutomaticBrightnessStrategy2 getAutomaticBrightnessStrategy2(Context context,
+                        int displayId) {
+                    return mAutomaticBrightnessStrategy2;
+                }
+
+                @Override
                 OffloadBrightnessStrategy getOffloadBrightnessStrategy() {
                     return mOffloadBrightnessStrategy;
                 }
@@ -162,7 +172,8 @@
         when(mResources.getBoolean(R.bool.config_allowAutoBrightnessWhileDozing)).thenReturn(
                 DISALLOW_AUTO_BRIGHTNESS_WHILE_DOZING);
         assertEquals(mDisplayBrightnessStrategySelector.selectStrategy(
-                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_DOZE)),
+                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_DOZE,
+                                0.1f, false)),
                 mDozeBrightnessModeStrategy);
     }
 
@@ -175,7 +186,8 @@
         when(mResources.getBoolean(R.bool.config_allowAutoBrightnessWhileDozing)).thenReturn(
                 DISALLOW_AUTO_BRIGHTNESS_WHILE_DOZING);
         assertNotEquals(mDisplayBrightnessStrategySelector.selectStrategy(
-                new StrategySelectionRequest(displayPowerRequest, Display.STATE_DOZE)),
+                new StrategySelectionRequest(displayPowerRequest, Display.STATE_DOZE,
+                        0.1f, false)),
                 mDozeBrightnessModeStrategy);
     }
 
@@ -184,7 +196,8 @@
         DisplayManagerInternal.DisplayPowerRequest displayPowerRequest = mock(
                 DisplayManagerInternal.DisplayPowerRequest.class);
         assertEquals(mDisplayBrightnessStrategySelector.selectStrategy(
-                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_OFF)),
+                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_OFF,
+                                0.1f, false)),
                 mScreenOffBrightnessModeStrategy);
     }
 
@@ -195,7 +208,8 @@
         displayPowerRequest.screenBrightnessOverride = 0.4f;
         when(mFollowerBrightnessStrategy.getBrightnessToFollow()).thenReturn(Float.NaN);
         assertEquals(mDisplayBrightnessStrategySelector.selectStrategy(
-                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON)),
+                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON,
+                                0.1f, false)),
                 mOverrideBrightnessStrategy);
     }
 
@@ -207,7 +221,8 @@
         when(mFollowerBrightnessStrategy.getBrightnessToFollow()).thenReturn(Float.NaN);
         when(mTemporaryBrightnessStrategy.getTemporaryScreenBrightness()).thenReturn(0.3f);
         assertEquals(mDisplayBrightnessStrategySelector.selectStrategy(
-                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON)),
+                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON,
+                                0.1f, false)),
                 mTemporaryBrightnessStrategy);
     }
 
@@ -220,7 +235,8 @@
         displayPowerRequest.screenBrightnessOverride = Float.NaN;
         when(mTemporaryBrightnessStrategy.getTemporaryScreenBrightness()).thenReturn(Float.NaN);
         assertEquals(mDisplayBrightnessStrategySelector.selectStrategy(
-                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON)),
+                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON,
+                                0.1f, false)),
                 mBoostBrightnessStrategy);
     }
 
@@ -233,7 +249,8 @@
         when(mTemporaryBrightnessStrategy.getTemporaryScreenBrightness()).thenReturn(Float.NaN);
         when(mOffloadBrightnessStrategy.getOffloadScreenBrightness()).thenReturn(Float.NaN);
         assertEquals(mDisplayBrightnessStrategySelector.selectStrategy(
-                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON)),
+                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON,
+                                0.1f, false)),
                 mInvalidBrightnessStrategy);
     }
 
@@ -243,7 +260,8 @@
                 DisplayManagerInternal.DisplayPowerRequest.class);
         when(mFollowerBrightnessStrategy.getBrightnessToFollow()).thenReturn(0.3f);
         assertEquals(mDisplayBrightnessStrategySelector.selectStrategy(
-                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON)),
+                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON,
+                                0.1f, false)),
                 mFollowerBrightnessStrategy);
     }
 
@@ -257,14 +275,39 @@
         displayPowerRequest.screenBrightnessOverride = Float.NaN;
         when(mFollowerBrightnessStrategy.getBrightnessToFollow()).thenReturn(Float.NaN);
         when(mTemporaryBrightnessStrategy.getTemporaryScreenBrightness()).thenReturn(Float.NaN);
-        when(mAutomaticBrightnessStrategy.shouldUseAutoBrightness()).thenReturn(true);
+        when(mAutomaticBrightnessStrategy2.shouldUseAutoBrightness()).thenReturn(true);
         when(mOffloadBrightnessStrategy.getOffloadScreenBrightness()).thenReturn(0.3f);
         assertEquals(mDisplayBrightnessStrategySelector.selectStrategy(
-                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON)),
+                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON,
+                                0.1f, false)),
                 mOffloadBrightnessStrategy);
     }
 
     @Test
+    public void selectStrategy_selectsAutomaticStrategyWhenValid() {
+        when(mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled()).thenReturn(true);
+        mDisplayBrightnessStrategySelector = new DisplayBrightnessStrategySelector(mContext,
+                mInjector, DISPLAY_ID, mDisplayManagerFlags);
+        DisplayManagerInternal.DisplayPowerRequest displayPowerRequest = mock(
+                DisplayManagerInternal.DisplayPowerRequest.class);
+        displayPowerRequest.policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT;
+        displayPowerRequest.screenBrightnessOverride = Float.NaN;
+        when(mFollowerBrightnessStrategy.getBrightnessToFollow()).thenReturn(Float.NaN);
+        when(mTemporaryBrightnessStrategy.getTemporaryScreenBrightness()).thenReturn(Float.NaN);
+        when(mAutomaticBrightnessStrategy.shouldUseAutoBrightness()).thenReturn(true);
+        when(mAutomaticBrightnessStrategy.isAutoBrightnessValid()).thenReturn(true);
+        assertEquals(mDisplayBrightnessStrategySelector.selectStrategy(
+                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON,
+                                0.1f, false)),
+                mAutomaticBrightnessStrategy);
+        verifyZeroInteractions(mOffloadBrightnessStrategy);
+        verify(mAutomaticBrightnessStrategy).setAutoBrightnessState(Display.STATE_ON,
+                false, BrightnessReason.REASON_UNKNOWN,
+                DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT, 0.1f, false);
+
+    }
+
+    @Test
     public void selectStrategyDoesNotSelectOffloadStrategyWhenFeatureFlagDisabled() {
         when(mDisplayManagerFlags.isDisplayOffloadEnabled()).thenReturn(false);
         mDisplayBrightnessStrategySelector = new DisplayBrightnessStrategySelector(mContext,
@@ -277,7 +320,8 @@
         when(mOffloadBrightnessStrategy.getOffloadScreenBrightness()).thenReturn(0.3f);
         assertNotEquals(mOffloadBrightnessStrategy,
                 mDisplayBrightnessStrategySelector.selectStrategy(
-                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON)));
+                        new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON,
+                                0.1f, false)));
     }
 
     @Test
@@ -290,10 +334,13 @@
         when(mFollowerBrightnessStrategy.getBrightnessToFollow()).thenReturn(0.3f);
 
         mDisplayBrightnessStrategySelector.selectStrategy(
-                new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON));
+                new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON,
+                        0.1f, false));
 
         StrategySelectionNotifyRequest strategySelectionNotifyRequest =
-                new StrategySelectionNotifyRequest(mFollowerBrightnessStrategy);
+                new StrategySelectionNotifyRequest(displayPowerRequest, Display.STATE_ON,
+                        mFollowerBrightnessStrategy, 0.1f,
+                        false, false);
         verify(mInvalidBrightnessStrategy).strategySelectionPostProcessor(
                 eq(strategySelectionNotifyRequest));
         verify(mScreenOffBrightnessModeStrategy).strategySelectionPostProcessor(
@@ -308,5 +355,22 @@
                 eq(strategySelectionNotifyRequest));
         verify(mTemporaryBrightnessStrategy).strategySelectionPostProcessor(
                 eq(strategySelectionNotifyRequest));
+        verify(mAutomaticBrightnessStrategy).strategySelectionPostProcessor(
+                eq(strategySelectionNotifyRequest));
+    }
+
+    @Test
+    public void getAutomaticBrightnessStrategy_getsAutomaticStrategy2IfRefactoringFlagIsNotSet() {
+        assertEquals(mAutomaticBrightnessStrategy2,
+                mDisplayBrightnessStrategySelector.getAutomaticBrightnessStrategy());
+    }
+
+    @Test
+    public void getAutomaticBrightnessStrategy_getsAutomaticStrategyIfRefactoringFlagIsSet() {
+        when(mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled()).thenReturn(true);
+        mDisplayBrightnessStrategySelector = new DisplayBrightnessStrategySelector(mContext,
+                mInjector, DISPLAY_ID, mDisplayManagerFlags);
+        assertEquals(mAutomaticBrightnessStrategy,
+                mDisplayBrightnessStrategySelector.getAutomaticBrightnessStrategy());
     }
 }
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java
index 5294943..5487bc5 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java
@@ -35,6 +35,7 @@
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.server.display.DisplayBrightnessState;
+import com.android.server.display.DisplayDeviceConfig;
 import com.android.server.display.brightness.BrightnessReason;
 import com.android.server.display.feature.DeviceConfigParameterProvider;
 import com.android.server.display.feature.DisplayManagerFlags;
@@ -280,7 +281,8 @@
 
         @Override
         List<BrightnessStateModifier> getModifiers(DisplayManagerFlags flags, Context context,
-                Handler handler, BrightnessClamperController.ClamperChangeListener listener) {
+                Handler handler, BrightnessClamperController.ClamperChangeListener listener,
+                DisplayDeviceConfig displayDeviceConfig) {
             return mModifiers;
         }
     }
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessLowLuxModifierTest.kt b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessLowLuxModifierTest.kt
index e4a7d98..21e066d 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessLowLuxModifierTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessLowLuxModifierTest.kt
@@ -15,88 +15,219 @@
  */
 package com.android.server.display.brightness.clamper
 
-import android.os.PowerManager
 import android.os.UserHandle
+import android.platform.test.annotations.RequiresFlagsEnabled
 import android.provider.Settings
 import android.testing.TestableContext
 import androidx.test.platform.app.InstrumentationRegistry
+import com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED
+import com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED
+import com.android.server.display.DisplayDeviceConfig
 import com.android.server.display.brightness.BrightnessReason
+import com.android.server.display.feature.flags.Flags
 import com.android.server.testutils.TestHandler
+import com.android.server.testutils.whenever
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
 import org.mockito.kotlin.mock
 
-private const val userId = UserHandle.USER_CURRENT
+private const val USER_ID = UserHandle.USER_CURRENT
 
 class BrightnessLowLuxModifierTest {
 
     private var mockClamperChangeListener =
-            mock<BrightnessClamperController.ClamperChangeListener>()
+        mock<BrightnessClamperController.ClamperChangeListener>()
 
     val context = TestableContext(
-            InstrumentationRegistry.getInstrumentation().getContext())
+        InstrumentationRegistry.getInstrumentation().getContext())
 
     private val testHandler = TestHandler(null)
     private lateinit var modifier: BrightnessLowLuxModifier
 
+    private var mockDisplayDeviceConfig = mock<DisplayDeviceConfig>()
+
+    private val LOW_LUX_BRIGHTNESS = 0.1f
+    private val TRANSITION_POINT = 0.25f
+    private val NORMAL_RANGE_BRIGHTNESS = 0.3f
+
     @Before
     fun setUp() {
-        modifier = BrightnessLowLuxModifier(testHandler, mockClamperChangeListener, context)
+        modifier =
+            BrightnessLowLuxModifier(testHandler,
+                mockClamperChangeListener,
+                context,
+                mockDisplayDeviceConfig)
+
+        // values below transition point (even dimmer range)
+        // nits: 0.1 -> backlight 0.02 -> brightness -> 0.1
+        whenever(mockDisplayDeviceConfig.getBacklightFromNits(/* nits= */ 1.0f))
+                .thenReturn(0.02f)
+        whenever(mockDisplayDeviceConfig.getBrightnessFromBacklight(/* backlight = */ 0.02f))
+                .thenReturn(LOW_LUX_BRIGHTNESS)
+
+        // values above transition point (noraml range)
+        // nits: 10 -> backlight 0.2 -> brightness -> 0.3
+        whenever(mockDisplayDeviceConfig.getBacklightFromNits(/* nits= */ 2f))
+                .thenReturn(0.15f)
+        whenever(mockDisplayDeviceConfig.getBrightnessFromBacklight(/* backlight = */ 0.15f))
+                .thenReturn(0.24f)
+
+        // values above transition point (normal range)
+        // nits: 10 -> backlight 0.2 -> brightness -> 0.3
+        whenever(mockDisplayDeviceConfig.getBacklightFromNits(/* nits= */ 10f))
+                .thenReturn(0.2f)
+        whenever(mockDisplayDeviceConfig.getBrightnessFromBacklight(/* backlight = */ 0.2f))
+                .thenReturn(NORMAL_RANGE_BRIGHTNESS)
+
+        // min nits when lux of 400
+        whenever(mockDisplayDeviceConfig.getMinNitsFromLux(/* lux= */ 400f))
+                .thenReturn(1.0f)
+
+
+        whenever(mockDisplayDeviceConfig.evenDimmerTransitionPoint).thenReturn(TRANSITION_POINT)
+
         testHandler.flush()
     }
 
     @Test
-    fun testThrottlingBounds() {
-        Settings.Secure.putIntForUser(context.contentResolver,
-                Settings.Secure.EVEN_DIMMER_ACTIVATED, 1, userId) // true
-        Settings.Secure.putFloatForUser(context.contentResolver,
-                Settings.Secure.EVEN_DIMMER_MIN_NITS, 0.7f, userId)
-        modifier.recalculateLowerBound()
-        testHandler.flush()
-        assertThat(modifier.isActive).isTrue()
-
-        // TODO: code currently returns MIN/MAX; update with lux values
-        assertThat(modifier.brightnessLowerBound).isEqualTo(PowerManager.BRIGHTNESS_MIN)
-    }
-
-    @Test
-    fun testGetReason_UserSet() {
-        Settings.Secure.putIntForUser(context.contentResolver,
-                Settings.Secure.EVEN_DIMMER_ACTIVATED, 1, userId)
-        Settings.Secure.putFloatForUser(context.contentResolver,
-                Settings.Secure.EVEN_DIMMER_MIN_NITS, 30.0f, userId)
-        modifier.recalculateLowerBound()
-        testHandler.flush()
-        assertThat(modifier.isActive).isTrue()
-
-        // Test restriction from user setting
-        assertThat(modifier.brightnessReason)
-                .isEqualTo(BrightnessReason.MODIFIER_MIN_USER_SET_LOWER_BOUND)
-    }
-
-    @Test
-    fun testGetReason_Lux() {
-        Settings.Secure.putIntForUser(context.contentResolver,
-                Settings.Secure.EVEN_DIMMER_ACTIVATED, 1, userId)
-        Settings.Secure.putFloatForUser(context.contentResolver,
-                Settings.Secure.EVEN_DIMMER_MIN_NITS, 0.0f, userId)
-        modifier.onAmbientLuxChange(3000.0f)
-        testHandler.flush()
-        assertThat(modifier.isActive).isTrue()
-
-        // Test restriction from lux setting
-        assertThat(modifier.brightnessReason).isEqualTo(BrightnessReason.MODIFIER_MIN_LUX)
-    }
-
-    @Test
     fun testSettingOffDisablesModifier() {
+        // test transition point ensures brightness doesn't drop when setting is off.
         Settings.Secure.putIntForUser(context.contentResolver,
-            Settings.Secure.EVEN_DIMMER_ACTIVATED, 0, userId)
-        assertThat(modifier.brightnessLowerBound).isEqualTo(PowerManager.BRIGHTNESS_MIN)
+            Settings.Secure.EVEN_DIMMER_ACTIVATED, 0, USER_ID)
+        modifier.setAutoBrightnessState(AUTO_BRIGHTNESS_ENABLED)
+        modifier.recalculateLowerBound()
+        testHandler.flush()
+        assertThat(modifier.brightnessLowerBound).isEqualTo(TRANSITION_POINT)
+        assertThat(modifier.brightnessReason).isEqualTo(0) // no reason - ie off
         modifier.onAmbientLuxChange(3000.0f)
         testHandler.flush()
         assertThat(modifier.isActive).isFalse()
-        assertThat(modifier.brightnessLowerBound).isEqualTo(PowerManager.BRIGHTNESS_MIN)
+        assertThat(modifier.brightnessLowerBound).isEqualTo(TRANSITION_POINT)
+        assertThat(modifier.brightnessReason).isEqualTo(0) // no reason - ie off
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_EVEN_DIMMER)
+    fun testLuxRestrictsBrightnessRange() {
+        // test that high lux prevents low brightness range.
+        Settings.Secure.putIntForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_ACTIVATED, 1, USER_ID)
+        Settings.Secure.putFloatForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_MIN_NITS, 0.1f, USER_ID)
+        modifier.setAutoBrightnessState(AUTO_BRIGHTNESS_ENABLED)
+        modifier.onAmbientLuxChange(400.0f)
+        testHandler.flush()
+
+        assertThat(modifier.isActive).isTrue()
+        // Test restriction from lux setting
+        assertThat(modifier.brightnessReason).isEqualTo(BrightnessReason.MODIFIER_MIN_LUX)
+        assertThat(modifier.brightnessLowerBound).isEqualTo(LOW_LUX_BRIGHTNESS)
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_EVEN_DIMMER)
+    fun testUserRestrictsBrightnessRange() {
+        // test that user minimum nits setting prevents low brightness range.
+        Settings.Secure.putIntForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_ACTIVATED, 1, USER_ID)
+        Settings.Secure.putFloatForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_MIN_NITS, 10.0f, USER_ID)
+        modifier.setAutoBrightnessState(AUTO_BRIGHTNESS_ENABLED)
+        modifier.recalculateLowerBound()
+        testHandler.flush()
+
+        // Test restriction from user setting
+        assertThat(modifier.isActive).isTrue()
+        assertThat(modifier.brightnessReason)
+                .isEqualTo(BrightnessReason.MODIFIER_MIN_USER_SET_LOWER_BOUND)
+        assertThat(modifier.brightnessLowerBound).isEqualTo(NORMAL_RANGE_BRIGHTNESS)
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_EVEN_DIMMER)
+    fun testOnToOff() {
+        // test that high lux prevents low brightness range.
+        Settings.Secure.putIntForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_ACTIVATED, 1, USER_ID) // on
+        Settings.Secure.putFloatForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_MIN_NITS, 1.0f, USER_ID)
+        modifier.setAutoBrightnessState(AUTO_BRIGHTNESS_ENABLED)
+        modifier.onAmbientLuxChange(400.0f)
+        testHandler.flush()
+
+        assertThat(modifier.isActive).isTrue()
+        // Test restriction from lux setting
+        assertThat(modifier.brightnessReason).isEqualTo(BrightnessReason.MODIFIER_MIN_LUX)
+        assertThat(modifier.brightnessLowerBound).isEqualTo(LOW_LUX_BRIGHTNESS)
+
+        Settings.Secure.putIntForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_ACTIVATED, 0, USER_ID) // off
+
+        modifier.recalculateLowerBound()
+        testHandler.flush()
+
+        assertThat(modifier.isActive).isFalse()
+        assertThat(modifier.brightnessLowerBound).isEqualTo(TRANSITION_POINT)
+        assertThat(modifier.brightnessReason).isEqualTo(0) // no reason - ie off
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_EVEN_DIMMER)
+    fun testOffToOn() {
+        // test that high lux prevents low brightness range.
+        Settings.Secure.putIntForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_ACTIVATED, 0, USER_ID) // off
+        Settings.Secure.putFloatForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_MIN_NITS, 1.0f, USER_ID)
+        modifier.setAutoBrightnessState(AUTO_BRIGHTNESS_ENABLED)
+        modifier.onAmbientLuxChange(400.0f)
+        testHandler.flush()
+
+        assertThat(modifier.isActive).isFalse()
+        assertThat(modifier.brightnessLowerBound).isEqualTo(TRANSITION_POINT)
+        assertThat(modifier.brightnessReason).isEqualTo(0) // no reason - ie off
+
+
+
+        Settings.Secure.putIntForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_ACTIVATED, 1, USER_ID) // on
+        modifier.recalculateLowerBound()
+        testHandler.flush()
+
+        assertThat(modifier.isActive).isTrue()
+        // Test restriction from lux setting
+        assertThat(modifier.brightnessReason).isEqualTo(BrightnessReason.MODIFIER_MIN_LUX)
+        assertThat(modifier.brightnessLowerBound).isEqualTo(LOW_LUX_BRIGHTNESS)
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_EVEN_DIMMER)
+    fun testDisabledWhenAutobrightnessIsOff() {
+        // test that high lux prevents low brightness range.
+        Settings.Secure.putIntForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_ACTIVATED, 1, USER_ID) // on
+        Settings.Secure.putFloatForUser(context.contentResolver,
+            Settings.Secure.EVEN_DIMMER_MIN_NITS, 1.0f, USER_ID)
+
+        modifier.setAutoBrightnessState(AUTO_BRIGHTNESS_ENABLED)
+        modifier.onAmbientLuxChange(400.0f)
+        testHandler.flush()
+
+        assertThat(modifier.isActive).isTrue()
+        // Test restriction from lux setting
+        assertThat(modifier.brightnessReason).isEqualTo(BrightnessReason.MODIFIER_MIN_LUX)
+        assertThat(modifier.brightnessLowerBound).isEqualTo(LOW_LUX_BRIGHTNESS)
+
+
+        modifier.setAutoBrightnessState(AUTO_BRIGHTNESS_DISABLED)
+        modifier.onAmbientLuxChange(400.0f)
+        testHandler.flush()
+
+        assertThat(modifier.isActive).isFalse()
+        // Test restriction from lux setting
+        assertThat(modifier.brightnessReason).isEqualTo(0)
+        assertThat(modifier.brightnessLowerBound).isEqualTo(TRANSITION_POINT)
     }
 }
+
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java
index 87fc7a4..39ffe5b 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java
@@ -33,6 +33,7 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.server.display.AutomaticBrightnessController;
 import com.android.server.display.config.HdrBrightnessData;
 import com.android.server.testutils.OffsettableClock;
 import com.android.server.testutils.TestHandler;
@@ -230,6 +231,11 @@
     }
 
     private void configureClamper() {
+        // AutoBrightnessController sends ambientLux values *only* when auto brightness enabled.
+        // HdrClamper is temporary disabled  if auto brightness is off.
+        // Temporary setting AutoBrightnessState to enabled for this test
+        // The issue is tracked here: b/322445088
+        mHdrClamper.setAutoBrightnessState(AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED);
         mHdrClamper.resetHdrConfig(TEST_HDR_DATA, WIDTH, HEIGHT, MIN_HDR_PERCENT, mMockBinder);
         mHdrChangeListener.onHdrVisible(true);
     }
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2Test.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2Test.java
new file mode 100644
index 0000000..fd43720
--- /dev/null
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2Test.java
@@ -0,0 +1,415 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.brightness.strategy;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.hardware.display.BrightnessConfiguration;
+import android.hardware.display.DisplayManagerInternal;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.test.mock.MockContentResolver;
+import android.view.Display;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.internal.util.test.FakeSettingsProviderRule;
+import com.android.server.display.AutomaticBrightnessController;
+import com.android.server.display.brightness.BrightnessEvent;
+import com.android.server.display.brightness.BrightnessReason;
+
+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;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AutomaticBrightnessStrategy2Test {
+    private static final int DISPLAY_ID = 0;
+    @Rule
+    public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
+
+    @Mock
+    private AutomaticBrightnessController mAutomaticBrightnessController;
+
+    private BrightnessConfiguration mBrightnessConfiguration;
+    private float mDefaultScreenAutoBrightnessAdjustment;
+    private Context mContext;
+    private AutomaticBrightnessStrategy2 mAutomaticBrightnessStrategy;
+
+    @Before
+    public void before() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(new ContextWrapper(ApplicationProvider.getApplicationContext()));
+        final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContext);
+        when(mContext.getContentResolver()).thenReturn(resolver);
+        mDefaultScreenAutoBrightnessAdjustment = Settings.System.getFloat(
+                mContext.getContentResolver(),
+                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, Float.NaN);
+        Settings.System.putFloat(mContext.getContentResolver(),
+                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.5f);
+        mAutomaticBrightnessStrategy = new AutomaticBrightnessStrategy2(mContext, DISPLAY_ID);
+
+        mBrightnessConfiguration = new BrightnessConfiguration.Builder(
+                new float[]{0f, 1f}, new float[]{0, PowerManager.BRIGHTNESS_ON}).build();
+        when(mAutomaticBrightnessController.hasUserDataPoints()).thenReturn(true);
+        mAutomaticBrightnessStrategy.setAutomaticBrightnessController(
+                mAutomaticBrightnessController);
+        mAutomaticBrightnessStrategy.setBrightnessConfiguration(mBrightnessConfiguration,
+                true);
+    }
+
+    @After
+    public void after() {
+        Settings.System.putFloat(mContext.getContentResolver(),
+                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, mDefaultScreenAutoBrightnessAdjustment);
+    }
+
+    @Test
+    public void testAutoBrightnessState_AutoBrightnessDisabled() {
+        mAutomaticBrightnessStrategy.setUseAutoBrightness(false);
+        int targetDisplayState = Display.STATE_ON;
+        boolean allowAutoBrightnessWhileDozing = false;
+        int brightnessReason = BrightnessReason.REASON_UNKNOWN;
+        int policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT;
+        float lastUserSetBrightness = 0.2f;
+        boolean userSetBrightnessChanged = true;
+        mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments();
+        mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState,
+                allowAutoBrightnessWhileDozing, brightnessReason, policy, lastUserSetBrightness,
+                userSetBrightnessChanged);
+        verify(mAutomaticBrightnessController)
+                .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED,
+                        mBrightnessConfiguration,
+                        lastUserSetBrightness,
+                        userSetBrightnessChanged, /* adjustment */ 0.5f,
+                        /* userChangedAutoBrightnessAdjustment= */ false, policy,
+                        targetDisplayState, /* shouldResetShortTermModel */ true);
+        assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessEnabled());
+        assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff());
+    }
+
+    @Test
+    public void testAutoBrightnessState_DisplayIsOff() {
+        mAutomaticBrightnessStrategy.setUseAutoBrightness(true);
+        int targetDisplayState = Display.STATE_OFF;
+        boolean allowAutoBrightnessWhileDozing = false;
+        int brightnessReason = BrightnessReason.REASON_UNKNOWN;
+        int policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_OFF;
+        float lastUserSetBrightness = 0.2f;
+        boolean userSetBrightnessChanged = true;
+        mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments();
+        mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState,
+                allowAutoBrightnessWhileDozing, brightnessReason, policy, lastUserSetBrightness,
+                userSetBrightnessChanged);
+        verify(mAutomaticBrightnessController)
+                .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE,
+                        mBrightnessConfiguration,
+                        lastUserSetBrightness,
+                        userSetBrightnessChanged, /* adjustment */ 0.5f,
+                        /* userChangedAutoBrightnessAdjustment= */ false, policy,
+                        targetDisplayState, /* shouldResetShortTermModel */ true);
+        assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessEnabled());
+        assertTrue(mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff());
+    }
+
+    @Test
+    public void testAutoBrightnessState_DisplayIsInDoze_ConfigDoesNotAllow() {
+        mAutomaticBrightnessStrategy.setUseAutoBrightness(true);
+        int targetDisplayState = Display.STATE_DOZE;
+        boolean allowAutoBrightnessWhileDozing = false;
+        int brightnessReason = BrightnessReason.REASON_UNKNOWN;
+        int policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE;
+        float lastUserSetBrightness = 0.2f;
+        boolean userSetBrightnessChanged = true;
+        mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments();
+        mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState,
+                allowAutoBrightnessWhileDozing, brightnessReason, policy, lastUserSetBrightness,
+                userSetBrightnessChanged);
+        verify(mAutomaticBrightnessController)
+                .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE,
+                        mBrightnessConfiguration,
+                        lastUserSetBrightness,
+                        userSetBrightnessChanged, /* adjustment */ 0.5f,
+                        /* userChangedAutoBrightnessAdjustment= */ false, policy,
+                        targetDisplayState, /* shouldResetShortTermModel */ true);
+        assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessEnabled());
+        assertTrue(mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff());
+    }
+
+    @Test
+    public void testAutoBrightnessState_BrightnessReasonIsOverride() {
+        mAutomaticBrightnessStrategy.setUseAutoBrightness(true);
+        int targetDisplayState = Display.STATE_ON;
+        boolean allowAutoBrightnessWhileDozing = false;
+        int brightnessReason = BrightnessReason.REASON_OVERRIDE;
+        int policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT;
+        float lastUserSetBrightness = 0.2f;
+        boolean userSetBrightnessChanged = true;
+        mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments();
+        mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState,
+                allowAutoBrightnessWhileDozing, brightnessReason, policy, lastUserSetBrightness,
+                userSetBrightnessChanged);
+        verify(mAutomaticBrightnessController)
+                .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED,
+                        mBrightnessConfiguration,
+                        lastUserSetBrightness,
+                        userSetBrightnessChanged, /* adjustment */ 0.5f,
+                        /* userChangedAutoBrightnessAdjustment= */ false, policy,
+                        targetDisplayState, /* shouldResetShortTermModel */ true);
+        assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessEnabled());
+        assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff());
+    }
+
+    @Test
+    public void testAutoBrightnessState_DisplayIsInDoze_ConfigDoesAllow() {
+        mAutomaticBrightnessStrategy.setUseAutoBrightness(true);
+        int targetDisplayState = Display.STATE_DOZE;
+        boolean allowAutoBrightnessWhileDozing = true;
+        int brightnessReason = BrightnessReason.REASON_UNKNOWN;
+        int policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE;
+        float lastUserSetBrightness = 0.2f;
+        boolean userSetBrightnessChanged = true;
+        Settings.System.putFloat(mContext.getContentResolver(),
+                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.4f);
+        mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments();
+        mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState,
+                allowAutoBrightnessWhileDozing, brightnessReason, policy, lastUserSetBrightness,
+                userSetBrightnessChanged);
+        verify(mAutomaticBrightnessController)
+                .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED,
+                        mBrightnessConfiguration,
+                        lastUserSetBrightness,
+                        userSetBrightnessChanged, /* adjustment */ 0.4f,
+                        /* userChangedAutoBrightnessAdjustment= */ true, policy,
+                        targetDisplayState, /* shouldResetShortTermModel */ true);
+        assertTrue(mAutomaticBrightnessStrategy.isAutoBrightnessEnabled());
+        assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff());
+    }
+
+    @Test
+    public void testAutoBrightnessState_DisplayIsOn() {
+        mAutomaticBrightnessStrategy.setUseAutoBrightness(true);
+        int targetDisplayState = Display.STATE_ON;
+        boolean allowAutoBrightnessWhileDozing = false;
+        int brightnessReason = BrightnessReason.REASON_UNKNOWN;
+        float lastUserSetBrightness = 0.2f;
+        boolean userSetBrightnessChanged = true;
+        int policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT;
+        float pendingBrightnessAdjustment = 0.1f;
+        Settings.System.putFloat(mContext.getContentResolver(),
+                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, pendingBrightnessAdjustment);
+        mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments();
+        mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState,
+                allowAutoBrightnessWhileDozing, brightnessReason, policy, lastUserSetBrightness,
+                userSetBrightnessChanged);
+        verify(mAutomaticBrightnessController)
+                .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED,
+                        mBrightnessConfiguration,
+                        lastUserSetBrightness,
+                        userSetBrightnessChanged, pendingBrightnessAdjustment,
+                        /* userChangedAutoBrightnessAdjustment= */ true, policy, targetDisplayState,
+                        /* shouldResetShortTermModel */ true);
+        assertTrue(mAutomaticBrightnessStrategy.isAutoBrightnessEnabled());
+        assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff());
+    }
+
+    @Test
+    public void accommodateUserBrightnessChangesWorksAsExpected() {
+        // Verify the state if automaticBrightnessController is configured.
+        assertFalse(mAutomaticBrightnessStrategy.isShortTermModelActive());
+        boolean userSetBrightnessChanged = true;
+        float lastUserSetScreenBrightness = 0.2f;
+        int policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT;
+        int targetDisplayState = Display.STATE_ON;
+        BrightnessConfiguration brightnessConfiguration = new BrightnessConfiguration.Builder(
+                new float[]{0f, 1f}, new float[]{0, PowerManager.BRIGHTNESS_ON}).build();
+        int autoBrightnessState = AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED;
+        float temporaryAutoBrightnessAdjustments = 0.4f;
+        mAutomaticBrightnessStrategy.setShouldResetShortTermModel(true);
+        setTemporaryAutoBrightnessAdjustment(temporaryAutoBrightnessAdjustments);
+        mAutomaticBrightnessStrategy.accommodateUserBrightnessChanges(userSetBrightnessChanged,
+                lastUserSetScreenBrightness, policy, targetDisplayState, brightnessConfiguration,
+                autoBrightnessState);
+        verify(mAutomaticBrightnessController).configure(autoBrightnessState,
+                brightnessConfiguration,
+                lastUserSetScreenBrightness,
+                userSetBrightnessChanged, temporaryAutoBrightnessAdjustments,
+                /* userChangedAutoBrightnessAdjustment= */ false, policy, targetDisplayState,
+                /* shouldResetShortTermModel= */ true);
+        assertTrue(mAutomaticBrightnessStrategy.isTemporaryAutoBrightnessAdjustmentApplied());
+        assertFalse(mAutomaticBrightnessStrategy.shouldResetShortTermModel());
+        assertTrue(mAutomaticBrightnessStrategy.isShortTermModelActive());
+        // Verify the state when automaticBrightnessController is not configured
+        setTemporaryAutoBrightnessAdjustment(Float.NaN);
+        mAutomaticBrightnessStrategy.setAutomaticBrightnessController(null);
+        mAutomaticBrightnessStrategy.setShouldResetShortTermModel(true);
+        mAutomaticBrightnessStrategy.accommodateUserBrightnessChanges(userSetBrightnessChanged,
+                lastUserSetScreenBrightness, policy, targetDisplayState, brightnessConfiguration,
+                autoBrightnessState);
+        assertFalse(mAutomaticBrightnessStrategy.isTemporaryAutoBrightnessAdjustmentApplied());
+        assertTrue(mAutomaticBrightnessStrategy.shouldResetShortTermModel());
+        assertFalse(mAutomaticBrightnessStrategy.isShortTermModelActive());
+    }
+
+    @Test
+    public void adjustAutomaticBrightnessStateIfValid() throws Settings.SettingNotFoundException {
+        float brightnessState = 0.3f;
+        float autoBrightnessAdjustment = 0.2f;
+        when(mAutomaticBrightnessController.getAutomaticScreenBrightnessAdjustment()).thenReturn(
+                autoBrightnessAdjustment);
+        mAutomaticBrightnessStrategy.adjustAutomaticBrightnessStateIfValid(brightnessState);
+        assertEquals(autoBrightnessAdjustment,
+                mAutomaticBrightnessStrategy.getAutoBrightnessAdjustment(), 0.0f);
+        assertEquals(autoBrightnessAdjustment, Settings.System.getFloatForUser(
+                mContext.getContentResolver(),
+                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ,
+                UserHandle.USER_CURRENT), 0.0f);
+        assertEquals(BrightnessReason.ADJUSTMENT_AUTO,
+                mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentReasonsFlags());
+        float invalidBrightness = -0.5f;
+        mAutomaticBrightnessStrategy
+                .adjustAutomaticBrightnessStateIfValid(invalidBrightness);
+        assertEquals(autoBrightnessAdjustment,
+                mAutomaticBrightnessStrategy.getAutoBrightnessAdjustment(), 0.0f);
+        assertEquals(0,
+                mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentReasonsFlags());
+    }
+
+    @Test
+    public void updatePendingAutoBrightnessAdjustments() {
+        // Verify the state when the pendingAutoBrightnessAdjustments are not present
+        setPendingAutoBrightnessAdjustment(Float.NaN);
+        assertFalse(mAutomaticBrightnessStrategy.processPendingAutoBrightnessAdjustments());
+        assertFalse(mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentChanged());
+        // Verify the state when the pendingAutoBrightnessAdjustments are present, but
+        // pendingAutoBrightnessAdjustments and autoBrightnessAdjustments are the same
+        float autoBrightnessAdjustment = 0.3f;
+        setPendingAutoBrightnessAdjustment(autoBrightnessAdjustment);
+        setAutoBrightnessAdjustment(autoBrightnessAdjustment);
+        assertFalse(mAutomaticBrightnessStrategy.processPendingAutoBrightnessAdjustments());
+        assertFalse(mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentChanged());
+        assertEquals(Float.NaN, mAutomaticBrightnessStrategy.getPendingAutoBrightnessAdjustment(),
+                0.0f);
+        // Verify the state when the pendingAutoBrightnessAdjustments are present, and
+        // pendingAutoBrightnessAdjustments and autoBrightnessAdjustments are not the same
+        float pendingAutoBrightnessAdjustment = 0.2f;
+        setPendingAutoBrightnessAdjustment(pendingAutoBrightnessAdjustment);
+        setTemporaryAutoBrightnessAdjustment(0.1f);
+        assertTrue(mAutomaticBrightnessStrategy.processPendingAutoBrightnessAdjustments());
+        assertTrue(mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentChanged());
+        assertEquals(pendingAutoBrightnessAdjustment,
+                mAutomaticBrightnessStrategy.getAutoBrightnessAdjustment(), 0.0f);
+        assertEquals(Float.NaN, mAutomaticBrightnessStrategy.getPendingAutoBrightnessAdjustment(),
+                0.0f);
+        assertEquals(Float.NaN, mAutomaticBrightnessStrategy.getTemporaryAutoBrightnessAdjustment(),
+                0.0f);
+    }
+
+    @Test
+    public void setAutomaticBrightnessWorksAsExpected() {
+        float automaticScreenBrightness = 0.3f;
+        AutomaticBrightnessController automaticBrightnessController = mock(
+                AutomaticBrightnessController.class);
+        when(automaticBrightnessController.getAutomaticScreenBrightness(any(BrightnessEvent.class)))
+                .thenReturn(automaticScreenBrightness);
+        when(automaticBrightnessController.getAutomaticScreenBrightnessBasedOnLastObservedLux(
+                any(BrightnessEvent.class)))
+                .thenReturn(automaticScreenBrightness);
+        mAutomaticBrightnessStrategy.setAutomaticBrightnessController(
+                automaticBrightnessController);
+        assertEquals(automaticScreenBrightness,
+                mAutomaticBrightnessStrategy.getAutomaticScreenBrightness(
+                        new BrightnessEvent(DISPLAY_ID)), 0.0f);
+        assertEquals(automaticScreenBrightness,
+                mAutomaticBrightnessStrategy.getAutomaticScreenBrightnessBasedOnLastObservedLux(
+                        new BrightnessEvent(DISPLAY_ID)), 0.0f);
+    }
+
+    @Test
+    public void shouldUseAutoBrightness() {
+        mAutomaticBrightnessStrategy.setUseAutoBrightness(true);
+        assertTrue(mAutomaticBrightnessStrategy.shouldUseAutoBrightness());
+    }
+
+    @Test
+    public void setPendingAutoBrightnessAdjustments() throws Settings.SettingNotFoundException {
+        float pendingAutoBrightnessAdjustments = 0.3f;
+        setPendingAutoBrightnessAdjustment(pendingAutoBrightnessAdjustments);
+        assertEquals(pendingAutoBrightnessAdjustments,
+                mAutomaticBrightnessStrategy.getPendingAutoBrightnessAdjustment(), 0.0f);
+        assertEquals(pendingAutoBrightnessAdjustments, Settings.System.getFloatForUser(
+                mContext.getContentResolver(),
+                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ,
+                UserHandle.USER_CURRENT), 0.0f);
+    }
+
+    @Test
+    public void setTemporaryAutoBrightnessAdjustment() {
+        float temporaryAutoBrightnessAdjustment = 0.3f;
+        mAutomaticBrightnessStrategy.setTemporaryAutoBrightnessAdjustment(
+                temporaryAutoBrightnessAdjustment);
+        assertEquals(temporaryAutoBrightnessAdjustment,
+                mAutomaticBrightnessStrategy.getTemporaryAutoBrightnessAdjustment(), 0.0f);
+    }
+
+    @Test
+    public void setAutoBrightnessApplied() {
+        mAutomaticBrightnessStrategy.setAutoBrightnessApplied(true);
+        assertTrue(mAutomaticBrightnessStrategy.hasAppliedAutoBrightness());
+    }
+
+    @Test
+    public void testVerifyNoAutoBrightnessAdjustmentsArePopulatedForNonDefaultDisplay() {
+        int newDisplayId = 1;
+        mAutomaticBrightnessStrategy = new AutomaticBrightnessStrategy2(mContext, newDisplayId);
+        mAutomaticBrightnessStrategy.putAutoBrightnessAdjustmentSetting(0.3f);
+        assertEquals(0.5f, mAutomaticBrightnessStrategy.getAutoBrightnessAdjustment(),
+                0.0f);
+    }
+
+    private void setPendingAutoBrightnessAdjustment(float pendingAutoBrightnessAdjustment) {
+        Settings.System.putFloat(mContext.getContentResolver(),
+                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, pendingAutoBrightnessAdjustment);
+        mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments();
+    }
+
+    private void setTemporaryAutoBrightnessAdjustment(float temporaryAutoBrightnessAdjustment) {
+        mAutomaticBrightnessStrategy.setTemporaryAutoBrightnessAdjustment(
+                temporaryAutoBrightnessAdjustment);
+    }
+
+    private void setAutoBrightnessAdjustment(float autoBrightnessAdjustment) {
+        mAutomaticBrightnessStrategy.putAutoBrightnessAdjustmentSetting(autoBrightnessAdjustment);
+    }
+}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java
index 4e55270..6e163ca 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java
@@ -398,6 +398,34 @@
                 0.0f);
     }
 
+    @Test
+    public void isAutoBrightnessValid_returnsFalseWhenAutoBrightnessIsDisabled() {
+        assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessValid());
+    }
+
+    @Test
+    public void isAutoBrightnessValid_returnsFalseWhenBrightnessIsInvalid() {
+        mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_ON, true,
+                BrightnessReason.REASON_UNKNOWN,
+                DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT, 0.1f,
+                false);
+        when(mAutomaticBrightnessController.getAutomaticScreenBrightness(null))
+                .thenReturn(Float.NaN);
+        assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessValid());
+    }
+
+    @Test
+    public void isAutoBrightnessValid_returnsTrueWhenBrightnessIsValid() {
+        mAutomaticBrightnessStrategy.setUseAutoBrightness(true);
+        mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_ON, true,
+                BrightnessReason.REASON_UNKNOWN,
+                DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT, 0.1f,
+                false);
+        when(mAutomaticBrightnessController.getAutomaticScreenBrightness(null))
+                .thenReturn(0.2f);
+        assertTrue(mAutomaticBrightnessStrategy.isAutoBrightnessValid());
+    }
+
     private void setPendingAutoBrightnessAdjustment(float pendingAutoBrightnessAdjustment) {
         Settings.System.putFloat(mContext.getContentResolver(),
                 Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, pendingAutoBrightnessAdjustment);
diff --git a/services/tests/displayservicetests/src/com/android/server/display/color/ColorDisplayServiceTest.java b/services/tests/displayservicetests/src/com/android/server/display/color/ColorDisplayServiceTest.java
index ec27f9d..f391e40 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/color/ColorDisplayServiceTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/color/ColorDisplayServiceTest.java
@@ -38,6 +38,9 @@
 import android.hardware.display.Time;
 import android.os.Handler;
 import android.os.UserHandle;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.provider.Settings;
 import android.provider.Settings.Secure;
 import android.provider.Settings.System;
@@ -51,6 +54,7 @@
 import com.android.internal.util.test.FakeSettingsProvider;
 import com.android.internal.util.test.LocalServiceKeeperRule;
 import com.android.server.SystemService;
+import com.android.server.display.feature.flags.Flags;
 import com.android.server.twilight.TwilightListener;
 import com.android.server.twilight.TwilightManager;
 import com.android.server.twilight.TwilightState;
@@ -94,6 +98,9 @@
     @Rule
     public LocalServiceKeeperRule mLocalServiceKeeperRule = new LocalServiceKeeperRule();
 
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
     @Before
     public void setUp() {
         mContext = Mockito.spy(new ContextWrapper(
@@ -1003,6 +1010,20 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_EVEN_DIMMER)
+    public void ensureRbcDisabledWhenEvenDimmerEnabled() {
+        // If rbc & even dimmer are enabled
+        doReturn(true).when(mResourcesSpy).getBoolean(
+                R.bool.config_reduceBrightColorsAvailable);
+        doReturn(true).when(mResourcesSpy).getBoolean(
+                com.android.internal.R.bool.config_evenDimmerEnabled);
+        startService();
+
+        // ensure rbc isn't enabled, since even dimmer is the successor.
+        assertThat(ColorDisplayManager.isReduceBrightColorsAvailable(mContext)).isFalse();
+    }
+
+    @Test
     public void displayWhiteBalance_enabled() {
         setDisplayWhiteBalanceEnabled(true);
         setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */);
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java b/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java
index 3eced7f..fbc38a2 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java
@@ -75,6 +75,8 @@
 import android.util.TypedValue;
 import android.view.Display;
 import android.view.DisplayInfo;
+import android.view.SurfaceControl;
+import android.view.SurfaceControl.IdleScreenRefreshRateConfig;
 import android.view.SurfaceControl.RefreshRateRange;
 import android.view.SurfaceControl.RefreshRateRanges;
 
@@ -91,6 +93,7 @@
 import com.android.modules.utils.testing.ExtendedMockitoRule;
 import com.android.server.display.DisplayDeviceConfig;
 import com.android.server.display.TestUtils;
+import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholdPoint;
 import com.android.server.display.feature.DisplayManagerFlags;
 import com.android.server.display.mode.DisplayModeDirector.BrightnessObserver;
 import com.android.server.display.mode.DisplayModeDirector.DesiredDisplayModeSpecs;
@@ -112,6 +115,7 @@
 import org.mockito.quality.Strictness;
 import org.mockito.stubbing.Answer;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -1345,6 +1349,84 @@
     }
 
     @Test
+    public void testLockFps_DisplayWithOneMode() throws Exception {
+        when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled())
+                .thenReturn(true);
+        DisplayModeDirector director =
+                new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags);
+        director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
+
+        Display.Mode[] modes1 = new Display.Mode[] {
+                new Display.Mode(/* modeId= */ 1, /* width= */ 1280, /* height= */ 720,
+                        /* refreshRate= */ 60),
+                new Display.Mode(/* modeId= */ 2, /* width= */ 1280, /* height= */ 720,
+                        /* refreshRate= */ 90),
+        };
+        Display.Mode[] modes2 = new Display.Mode[] {
+                new Display.Mode(/* modeId= */ 1, /* width= */ 1280, /* height= */ 720,
+                        /* refreshRate= */ 60),
+        };
+        SparseArray<Display.Mode[]> supportedModesByDisplay = new SparseArray<>();
+        supportedModesByDisplay.put(DISPLAY_ID, modes1);
+        supportedModesByDisplay.put(DISPLAY_ID_2, modes2);
+
+        final FakeDeviceConfig config = mInjector.getDeviceConfig();
+        config.setRefreshRateInLowZone(90);
+        config.setLowDisplayBrightnessThresholds(new int[] { 10 });
+        config.setLowAmbientBrightnessThresholds(new int[] { 20 });
+
+        Sensor lightSensor = createLightSensor();
+        SensorManager sensorManager = createMockSensorManager(lightSensor);
+
+        director.start(sensorManager);
+        director.injectSupportedModesByDisplay(supportedModesByDisplay);
+        director.getSettingsObserver().setDefaultRefreshRate(90);
+
+        setPeakRefreshRate(Float.POSITIVE_INFINITY);
+
+        ArgumentCaptor<DisplayListener> displayListenerCaptor =
+                ArgumentCaptor.forClass(DisplayListener.class);
+        verify(mInjector).registerDisplayListener(displayListenerCaptor.capture(),
+                any(Handler.class),
+                eq(DisplayManager.EVENT_FLAG_DISPLAY_CHANGED
+                        | DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS));
+        DisplayListener displayListener = displayListenerCaptor.getValue();
+
+        ArgumentCaptor<SensorEventListener> sensorListenerCaptor =
+                ArgumentCaptor.forClass(SensorEventListener.class);
+        Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1)))
+                .registerListener(
+                        sensorListenerCaptor.capture(),
+                        eq(lightSensor),
+                        anyInt(),
+                        any(Handler.class));
+        SensorEventListener sensorListener = sensorListenerCaptor.getValue();
+
+        setBrightness(10, 10, displayListener);
+        // Sensor reads 20 lux
+        sensorListener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, /* lux= */ 20));
+
+        Vote vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE);
+        assertVoteForPhysicalRefreshRate(vote, /* fps= */ 90);
+        vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE_SWITCH);
+        assertThat(vote).isNotNull();
+        assertThat(vote).isInstanceOf(DisableRefreshRateSwitchingVote.class);
+        DisableRefreshRateSwitchingVote disableVote = (DisableRefreshRateSwitchingVote) vote;
+        assertThat(disableVote.mDisableRefreshRateSwitching).isTrue();
+
+        // We expect DisplayModeDirector to act on BrightnessInfo.adjustedBrightness; set only this
+        // parameter to the necessary threshold
+        setBrightness(10, 125, displayListener);
+        // Sensor reads 1000 lux
+        sensorListener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, /* lux= */ 1000));
+
+        vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE);
+        assertThat(vote).isNull();
+        vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE_SWITCH);
+        assertThat(vote).isNull();
+    }
+
+    @Test
     public void testLockFpsForHighZone() throws Exception {
         DisplayModeDirector director =
                 createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
@@ -1405,6 +1487,81 @@
     }
 
     @Test
+    public void testIdleScreenTimeOnLuxChanges() throws Exception {
+        DisplayModeDirector director =
+                createDirectorFromRefreshRateArray(new float[] {60.f, 90.f, 120.f}, 0);
+        setPeakRefreshRate(120 /*fps*/);
+        director.getSettingsObserver().setDefaultRefreshRate(120);
+        director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
+
+        // Set the DisplayDeviceConfig
+        DisplayDeviceConfig ddcMock = mock(DisplayDeviceConfig.class);
+        when(ddcMock.getDefaultHighBlockingZoneRefreshRate()).thenReturn(90);
+        when(ddcMock.getHighDisplayBrightnessThresholds()).thenReturn(new float[] { 200 });
+        when(ddcMock.getHighAmbientBrightnessThresholds()).thenReturn(new float[] { 8000 });
+        when(ddcMock.getDefaultLowBlockingZoneRefreshRate()).thenReturn(90);
+        when(ddcMock.getLowDisplayBrightnessThresholds()).thenReturn(new float[] {});
+        when(ddcMock.getLowAmbientBrightnessThresholds()).thenReturn(new float[] {});
+
+        director.defaultDisplayDeviceUpdated(ddcMock); // set the ddc
+
+        Sensor lightSensor = createLightSensor();
+        SensorManager sensorManager = createMockSensorManager(lightSensor);
+        director.start(sensorManager);
+
+        // Get the sensor listener so that we can give it new light sensor events
+        ArgumentCaptor<SensorEventListener> listenerCaptor =
+                ArgumentCaptor.forClass(SensorEventListener.class);
+        verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1)))
+                .registerListener(
+                        listenerCaptor.capture(),
+                        eq(lightSensor),
+                        anyInt(),
+                        any(Handler.class));
+        SensorEventListener sensorListener = listenerCaptor.getValue();
+
+        // Disable the idle screen flag
+        when(mDisplayManagerFlags.isIdleScreenRefreshRateTimeoutEnabled())
+                .thenReturn(false);
+
+        // Sensor reads 5 lux, with idleScreenRefreshRate timeout not configured
+        sensorListener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 5));
+        waitForIdleSync();
+        assertEquals(null, director.getBrightnessObserver().getIdleScreenRefreshRateConfig());
+
+        // Enable the idle screen flag
+        when(mDisplayManagerFlags.isIdleScreenRefreshRateTimeoutEnabled())
+                .thenReturn(true);
+        sensorListener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 8));
+        waitForIdleSync();
+        assertEquals(null, director.getBrightnessObserver().getIdleScreenRefreshRateConfig());
+
+        // Configure DDC with idle screen timeout
+        when(ddcMock.getIdleScreenRefreshRateTimeoutLuxThresholdPoint())
+                .thenReturn(List.of(getIdleScreenRefreshRateTimeoutLuxThresholdPoint(6, 1000),
+                        getIdleScreenRefreshRateTimeoutLuxThresholdPoint(100, 800)));
+
+        // Sensor reads 5 lux
+        sensorListener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 5));
+        waitForIdleSync();
+        assertEquals(new SurfaceControl.IdleScreenRefreshRateConfig(-1),
+                director.getBrightnessObserver().getIdleScreenRefreshRateConfig());
+
+        // Sensor reads 50 lux
+        sensorListener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 50));
+        waitForIdleSync();
+        assertEquals(new IdleScreenRefreshRateConfig(1000),
+                director.getBrightnessObserver().getIdleScreenRefreshRateConfig());
+
+        // Sensor reads 200 lux
+        sensorListener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 200));
+        waitForIdleSync();
+        assertEquals(new SurfaceControl.IdleScreenRefreshRateConfig(800),
+                director.getBrightnessObserver().getIdleScreenRefreshRateConfig());
+
+    }
+
+    @Test
     public void testLockFpsForHighZoneWithThermalCondition() throws Exception {
         // First, configure brightness zones or DMD won't register for sensor data.
         final FakeDeviceConfig config = mInjector.getDeviceConfig();
@@ -1440,11 +1597,11 @@
 
         // Get the display listener so that we can send it new brightness events
         ArgumentCaptor<DisplayListener> displayListenerCaptor =
-                  ArgumentCaptor.forClass(DisplayListener.class);
+                ArgumentCaptor.forClass(DisplayListener.class);
         verify(mInjector).registerDisplayListener(displayListenerCaptor.capture(),
                 any(Handler.class),
                 eq(DisplayManager.EVENT_FLAG_DISPLAY_CHANGED
-                    | DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS));
+                        | DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS));
         DisplayListener displayListener = displayListenerCaptor.getValue();
 
         // Get the sensor listener so that we can give it new light sensor events
@@ -3746,4 +3903,14 @@
             }
         }
     }
+
+    private IdleScreenRefreshRateTimeoutLuxThresholdPoint
+            getIdleScreenRefreshRateTimeoutLuxThresholdPoint(int lux, int timeout) {
+        IdleScreenRefreshRateTimeoutLuxThresholdPoint
+                idleScreenRefreshRateTimeoutLuxThresholdPoint =
+                new IdleScreenRefreshRateTimeoutLuxThresholdPoint();
+        idleScreenRefreshRateTimeoutLuxThresholdPoint.setLux(BigInteger.valueOf(lux));
+        idleScreenRefreshRateTimeoutLuxThresholdPoint.setTimeout(BigInteger.valueOf(timeout));
+        return idleScreenRefreshRateTimeoutLuxThresholdPoint;
+    }
 }
diff --git a/services/tests/displayservicetests/src/com/android/server/display/state/DisplayStateControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/state/DisplayStateControllerTest.java
index f5c6bb2..de53266 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/state/DisplayStateControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/state/DisplayStateControllerTest.java
@@ -18,11 +18,13 @@
 
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.hardware.display.DisplayManagerInternal;
+import android.util.Pair;
 import android.view.Display;
 
 import androidx.test.filters.SmallTest;
@@ -61,9 +63,11 @@
                 DisplayManagerInternal.DisplayPowerRequest.class);
 
         displayPowerRequest.policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_OFF;
-        int state = mDisplayStateController.updateDisplayState(displayPowerRequest, DISPLAY_ENABLED,
-                !DISPLAY_IN_TRANSITION);
-        assertEquals(Display.STATE_OFF, state);
+        Pair<Integer, Integer> stateAndReason =
+                mDisplayStateController.updateDisplayState(
+                        displayPowerRequest, DISPLAY_ENABLED, !DISPLAY_IN_TRANSITION);
+        assertTrue(Display.STATE_OFF == stateAndReason.first);
+        assertTrue(Display.STATE_REASON_DEFAULT_POLICY == stateAndReason.second);
         verify(mDisplayPowerProximityStateController).updateProximityState(displayPowerRequest,
                 Display.STATE_OFF);
         assertEquals(true, mDisplayStateController.shouldPerformScreenOffTransition());
@@ -101,9 +105,11 @@
                 DisplayManagerInternal.DisplayPowerRequest.class);
 
         displayPowerRequest.policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT;
-        int state = mDisplayStateController.updateDisplayState(displayPowerRequest,
-                !DISPLAY_ENABLED, !DISPLAY_IN_TRANSITION);
-        assertEquals(Display.STATE_OFF, state);
+        Pair<Integer, Integer> stateAndReason =
+                mDisplayStateController.updateDisplayState(
+                        displayPowerRequest, !DISPLAY_ENABLED, !DISPLAY_IN_TRANSITION);
+        assertTrue(Display.STATE_OFF == stateAndReason.first);
+        assertTrue(Display.STATE_REASON_DEFAULT_POLICY == stateAndReason.second);
         verify(mDisplayPowerProximityStateController).updateProximityState(displayPowerRequest,
                 Display.STATE_ON);
         assertEquals(false, mDisplayStateController.shouldPerformScreenOffTransition());
@@ -117,9 +123,11 @@
                 DisplayManagerInternal.DisplayPowerRequest.class);
 
         displayPowerRequest.policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT;
-        int state = mDisplayStateController.updateDisplayState(displayPowerRequest, DISPLAY_ENABLED,
-                DISPLAY_IN_TRANSITION);
-        assertEquals(Display.STATE_OFF, state);
+        Pair<Integer, Integer> stateAndReason =
+                mDisplayStateController.updateDisplayState(
+                        displayPowerRequest, DISPLAY_ENABLED, DISPLAY_IN_TRANSITION);
+        assertTrue(Display.STATE_OFF == stateAndReason.first);
+        assertTrue(Display.STATE_REASON_DEFAULT_POLICY == stateAndReason.second);
         verify(mDisplayPowerProximityStateController).updateProximityState(displayPowerRequest,
                 Display.STATE_ON);
         assertEquals(false, mDisplayStateController.shouldPerformScreenOffTransition());
@@ -133,9 +141,11 @@
                 DisplayManagerInternal.DisplayPowerRequest.class);
 
         displayPowerRequest.policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT;
-        int state = mDisplayStateController.updateDisplayState(displayPowerRequest, DISPLAY_ENABLED,
-                !DISPLAY_IN_TRANSITION);
-        assertEquals(Display.STATE_OFF, state);
+        Pair<Integer, Integer> stateAndReason =
+                mDisplayStateController.updateDisplayState(
+                        displayPowerRequest, DISPLAY_ENABLED, !DISPLAY_IN_TRANSITION);
+        assertTrue(Display.STATE_OFF == stateAndReason.first);
+        assertTrue(Display.STATE_REASON_DEFAULT_POLICY == stateAndReason.second);
         verify(mDisplayPowerProximityStateController).updateProximityState(displayPowerRequest,
                 Display.STATE_ON);
         assertEquals(false, mDisplayStateController.shouldPerformScreenOffTransition());
@@ -146,12 +156,15 @@
         DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
                 new DisplayManagerInternal.DisplayPowerRequest();
         displayPowerRequest.policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE;
-        mDisplayStateController.overrideDozeScreenState(Display.STATE_DOZE_SUSPEND);
+        mDisplayStateController.overrideDozeScreenState(
+                Display.STATE_DOZE_SUSPEND, Display.STATE_REASON_OFFLOAD);
 
-        int state = mDisplayStateController.updateDisplayState(displayPowerRequest, DISPLAY_ENABLED,
-                !DISPLAY_IN_TRANSITION);
+        Pair<Integer, Integer> stateAndReason =
+                mDisplayStateController.updateDisplayState(
+                        displayPowerRequest, DISPLAY_ENABLED, !DISPLAY_IN_TRANSITION);
 
-        assertEquals(state, Display.STATE_DOZE_SUSPEND);
+        assertTrue(Display.STATE_DOZE_SUSPEND == stateAndReason.first);
+        assertTrue(Display.STATE_REASON_OFFLOAD == stateAndReason.second);
     }
 
     @Test
@@ -159,12 +172,15 @@
         DisplayManagerInternal.DisplayPowerRequest displayPowerRequest =
                 new DisplayManagerInternal.DisplayPowerRequest();
         displayPowerRequest.policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_OFF;
-        mDisplayStateController.overrideDozeScreenState(Display.STATE_DOZE_SUSPEND);
+        mDisplayStateController.overrideDozeScreenState(
+                Display.STATE_DOZE_SUSPEND, Display.STATE_REASON_DEFAULT_POLICY);
 
-        int state = mDisplayStateController.updateDisplayState(displayPowerRequest, DISPLAY_ENABLED,
-                !DISPLAY_IN_TRANSITION);
+        Pair<Integer, Integer> stateAndReason =
+                mDisplayStateController.updateDisplayState(
+                        displayPowerRequest, DISPLAY_ENABLED, !DISPLAY_IN_TRANSITION);
 
-        assertEquals(state, Display.STATE_OFF);
+        assertTrue(Display.STATE_OFF == stateAndReason.first);
+        assertTrue(Display.STATE_REASON_DEFAULT_POLICY == stateAndReason.second);
     }
 
     private void validDisplayState(int policy, int displayState, boolean isEnabled,
@@ -172,9 +188,10 @@
         DisplayManagerInternal.DisplayPowerRequest displayPowerRequest = mock(
                 DisplayManagerInternal.DisplayPowerRequest.class);
         displayPowerRequest.policy = policy;
-        int state = mDisplayStateController.updateDisplayState(displayPowerRequest, isEnabled,
-                isInTransition);
-        assertEquals(displayState, state);
+        Pair<Integer, Integer> stateAndReason =
+                mDisplayStateController.updateDisplayState(
+                        displayPowerRequest, isEnabled, isInTransition);
+        assertTrue(displayState == stateAndReason.first);
         verify(mDisplayPowerProximityStateController).updateProximityState(displayPowerRequest,
                 displayState);
         assertEquals(false, mDisplayStateController.shouldPerformScreenOffTransition());
diff --git a/services/tests/media/mediarouterservicetest/src/com/android/server/media/AudioManagerRouteControllerTest.java b/services/tests/media/mediarouterservicetest/src/com/android/server/media/AudioManagerRouteControllerTest.java
index a918be2..8bdfc50 100644
--- a/services/tests/media/mediarouterservicetest/src/com/android/server/media/AudioManagerRouteControllerTest.java
+++ b/services/tests/media/mediarouterservicetest/src/com/android/server/media/AudioManagerRouteControllerTest.java
@@ -69,6 +69,13 @@
 public class AudioManagerRouteControllerTest {
 
     private static final String FAKE_ROUTE_NAME = "fake name";
+
+    /**
+     * The number of milliseconds to wait for an asynchronous operation before failing an associated
+     * assertion.
+     */
+    private static final int ASYNC_CALL_TIMEOUTS_MS = 1000;
+
     private static final AudioDeviceInfo FAKE_AUDIO_DEVICE_INFO_BUILTIN_SPEAKER =
             createAudioDeviceInfo(
                     AudioSystem.DEVICE_OUT_SPEAKER, "name_builtin", /* address= */ null);
@@ -231,7 +238,7 @@
         MediaRoute2Info builtInSpeakerRoute =
                 getAvailableRouteWithType(MediaRoute2Info.TYPE_BUILTIN_SPEAKER);
         mControllerUnderTest.transferTo(builtInSpeakerRoute.getId());
-        verify(mMockAudioManager)
+        verify(mMockAudioManager, Mockito.timeout(ASYNC_CALL_TIMEOUTS_MS))
                 .setPreferredDeviceForStrategy(
                         mMediaAudioProductStrategy,
                         createAudioDeviceAttribute(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER));
@@ -239,7 +246,7 @@
         MediaRoute2Info wiredHeadsetRoute =
                 getAvailableRouteWithType(MediaRoute2Info.TYPE_WIRED_HEADSET);
         mControllerUnderTest.transferTo(wiredHeadsetRoute.getId());
-        verify(mMockAudioManager)
+        verify(mMockAudioManager, Mockito.timeout(ASYNC_CALL_TIMEOUTS_MS))
                 .setPreferredDeviceForStrategy(
                         mMediaAudioProductStrategy,
                         createAudioDeviceAttribute(AudioDeviceInfo.TYPE_WIRED_HEADSET));
diff --git a/services/tests/mockingservicestests/src/com/android/server/OWNERS b/services/tests/mockingservicestests/src/com/android/server/OWNERS
index f801560..dc5cb8d6 100644
--- a/services/tests/mockingservicestests/src/com/android/server/OWNERS
+++ b/services/tests/mockingservicestests/src/com/android/server/OWNERS
@@ -1,5 +1,7 @@
 per-file *Alarm* = file:/apex/jobscheduler/OWNERS
 per-file *AppStateTracker* = file:/apex/jobscheduler/OWNERS
 per-file *DeviceIdleController* = file:/apex/jobscheduler/OWNERS
-per-file SensitiveContentProtectionManagerServiceTest.java = file:/core/java/android/permission/OWNERS
+per-file SensitiveContentProtectionManagerService* = file:/core/java/android/permission/OWNERS
 per-file RescuePartyTest.java = file:/packages/CrashRecovery/OWNERS
+per-file *Storage* = file:/core/java/android/os/storage/OWNERS
+
diff --git a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java
index 682569f..697548c 100644
--- a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java
@@ -1111,16 +1111,9 @@
 
         // mock properties in BootThreshold
         try {
-            if (Flags.recoverabilityDetection()) {
-                mSpyBootThreshold = spy(watchdog.new BootThreshold(
-                    PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT,
-                    PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS,
-                    PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT));
-            } else {
-                mSpyBootThreshold = spy(watchdog.new BootThreshold(
+            mSpyBootThreshold = spy(watchdog.new BootThreshold(
                     PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT,
                     PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS));
-            }
             mCrashRecoveryPropertiesMap = new HashMap<>();
 
             doAnswer((Answer<Integer>) invocationOnMock -> {
diff --git a/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceContentTest.java b/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceContentTest.java
index 2366f56..7aafa8e 100644
--- a/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceContentTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceContentTest.java
@@ -24,9 +24,11 @@
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyZeroInteractions;
 
+import android.content.pm.PackageManagerInternal;
 import android.media.projection.MediaProjectionInfo;
 import android.media.projection.MediaProjectionManager;
 import android.os.Binder;
@@ -72,6 +74,7 @@
 
     @Mock private WindowManagerInternal mWindowManager;
     @Mock private MediaProjectionManager mProjectionManager;
+    @Mock private PackageManagerInternal mPackageManagerInternal;
     private MediaProjectionInfo mMediaProjectionInfo;
 
     @Captor
@@ -91,7 +94,7 @@
         mSensitiveContentProtectionManagerService =
                 new SensitiveContentProtectionManagerService(mContext);
         mSensitiveContentProtectionManagerService.init(mProjectionManager, mWindowManager,
-                new ArraySet<>(Set.of(mExemptedScreenRecorderPackage)));
+                mPackageManagerInternal, new ArraySet<>(Set.of(mExemptedScreenRecorderPackage)));
         verify(mProjectionManager).addCallback(mMediaProjectionCallbackCaptor.capture(), any());
         mMediaPorjectionCallback = mMediaProjectionCallbackCaptor.getValue();
         mMediaProjectionInfo =
@@ -146,6 +149,20 @@
     }
 
     @Test
+    public void testAutofillServicePackageExemption() {
+        String testAutofillService = mScreenRecorderPackage + "/com.example.SampleAutofillService";
+        int userId = Process.myUserHandle().getIdentifier();
+        Settings.Secure.putStringForUser(mContext.getContentResolver(),
+                Settings.Secure.AUTOFILL_SERVICE, testAutofillService , userId);
+
+        mMediaPorjectionCallback.onStart(mMediaProjectionInfo);
+        mSensitiveContentProtectionManagerService.setSensitiveContentProtection(
+                mPackageInfo.getWindowToken(), mPackageInfo.getPkg(), mPackageInfo.getUid(), true);
+        verify(mWindowManager, never())
+                .addBlockScreenCaptureForApps(mPackageInfoCaptor.capture());
+    }
+
+    @Test
     public void testDeveloperOptionDisableFeature() {
         mockDisabledViaDeveloperOption();
         mMediaProjectionCallbackCaptor.getValue().onStart(mMediaProjectionInfo);
diff --git a/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceNotificationTest.java b/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceNotificationTest.java
index e74fe29..edee8cd 100644
--- a/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceNotificationTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/SensitiveContentProtectionManagerServiceNotificationTest.java
@@ -25,14 +25,15 @@
 import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
-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.pm.PackageManagerInternal;
 import android.media.projection.MediaProjectionInfo;
 import android.media.projection.MediaProjectionManager;
+import android.os.Process;
 import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
@@ -78,7 +79,8 @@
     private static final String NOTIFICATION_PKG_1 = "com.android.server.notification.one";
     private static final String NOTIFICATION_PKG_2 = "com.android.server.notification.two";
 
-    private static final String EXEMPTED_SCREEN_RECORDER_PACKAGE = "test.screen.recorder.package";
+    private static final String SCREEN_RECORDER_PACKAGE = "test.screen.recorder.package";
+    private static final String EXEMPTED_SCREEN_RECORDER_PACKAGE = "exempt.screen.recorder.package";
 
     private static final int NOTIFICATION_UID_1 = 5;
     private static final int NOTIFICATION_UID_2 = 6;
@@ -104,6 +106,9 @@
     private WindowManagerInternal mWindowManager;
 
     @Mock
+    private PackageManagerInternal mPackageManagerInternal;
+
+    @Mock
     private StatusBarNotification mNotification1;
 
     @Mock
@@ -141,7 +146,7 @@
         setupSensitiveNotification();
 
         mSensitiveContentProtectionManagerService.init(mProjectionManager, mWindowManager,
-                new ArraySet<>(Set.of(EXEMPTED_SCREEN_RECORDER_PACKAGE)));
+                mPackageManagerInternal, new ArraySet<>(Set.of(EXEMPTED_SCREEN_RECORDER_PACKAGE)));
 
         // Obtain useful mMediaProjectionCallback
         verify(mProjectionManager).addCallback(mMediaProjectionCallbackCaptor.capture(), any());
@@ -277,10 +282,18 @@
                 .getActiveNotifications();
     }
 
+    private MediaProjectionInfo createMediaProjectionInfo() {
+        return new MediaProjectionInfo(SCREEN_RECORDER_PACKAGE, Process.myUserHandle(), null);
+    }
+
+    private MediaProjectionInfo createExemptMediaProjectionInfo() {
+        return new MediaProjectionInfo(
+                EXEMPTED_SCREEN_RECORDER_PACKAGE, Process.myUserHandle(), null);
+    }
+
     @Test
     public void mediaProjectionOnStart_verifyExemptedRecorderPackage() {
-        MediaProjectionInfo mediaProjectionInfo = mock(MediaProjectionInfo.class);
-        when(mediaProjectionInfo.getPackageName()).thenReturn(EXEMPTED_SCREEN_RECORDER_PACKAGE);
+        MediaProjectionInfo mediaProjectionInfo = createExemptMediaProjectionInfo();
 
         mMediaProjectionCallbackCaptor.getValue().onStart(mediaProjectionInfo);
 
@@ -291,7 +304,7 @@
     public void mediaProjectionOnStart_onProjectionStart_setWmBlockedPackages() {
         ArraySet<PackageInfo> expectedBlockedPackages = setupSensitiveNotification();
 
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
 
         verify(mWindowManager).addBlockScreenCaptureForApps(expectedBlockedPackages);
     }
@@ -300,18 +313,18 @@
     public void mediaProjectionOnStart_noSensitiveNotifications_noBlockedPackages() {
         setupNoSensitiveNotifications();
 
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
     public void mediaProjectionOnStart_noNotifications_noBlockedPackages() {
         setupNoNotifications();
 
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -319,7 +332,7 @@
         ArraySet<PackageInfo> expectedBlockedPackages =
                 setupMultipleSensitiveNotificationsFromSamePackageAndUid();
 
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
 
         verify(mWindowManager).addBlockScreenCaptureForApps(expectedBlockedPackages);
     }
@@ -329,7 +342,7 @@
         ArraySet<PackageInfo> expectedBlockedPackages =
                 setupMultipleSensitiveNotificationsFromDifferentPackage();
 
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
 
         verify(mWindowManager).addBlockScreenCaptureForApps(expectedBlockedPackages);
     }
@@ -339,7 +352,7 @@
         ArraySet<PackageInfo> expectedBlockedPackages =
                 setupMultipleSensitiveNotificationsFromDifferentUid();
 
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
 
         verify(mWindowManager).addBlockScreenCaptureForApps(expectedBlockedPackages);
     }
@@ -348,7 +361,7 @@
     public void mediaProjectionOnStop_onProjectionEnd_clearWmBlockedPackages() {
         setupSensitiveNotification();
 
-        MediaProjectionInfo mediaProjectionInfo = mock(MediaProjectionInfo.class);
+        MediaProjectionInfo mediaProjectionInfo = createMediaProjectionInfo();
         mMediaProjectionCallbackCaptor.getValue().onStart(mediaProjectionInfo);
         Mockito.reset(mWindowManager);
 
@@ -361,7 +374,7 @@
     public void mediaProjectionOnStart_afterOnStop_onProjectionStart_setWmBlockedPackages() {
         ArraySet<PackageInfo> expectedBlockedPackages = setupSensitiveNotification();
 
-        MediaProjectionInfo mediaProjectionInfo = mock(MediaProjectionInfo.class);
+        MediaProjectionInfo mediaProjectionInfo = createMediaProjectionInfo();
         mMediaProjectionCallbackCaptor.getValue().onStart(mediaProjectionInfo);
         mMediaProjectionCallbackCaptor.getValue().onStop(mediaProjectionInfo);
         Mockito.reset(mWindowManager);
@@ -377,9 +390,9 @@
                 .when(mSensitiveContentProtectionManagerService.mNotificationListener)
                 .getActiveNotifications();
 
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -388,9 +401,9 @@
                 .when(mSensitiveContentProtectionManagerService.mNotificationListener)
                 .getCurrentRanking();
 
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -399,9 +412,9 @@
                 .when(mSensitiveContentProtectionManagerService.mNotificationListener)
                 .getCurrentRanking();
 
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -412,9 +425,9 @@
                 .when(mSensitiveContentProtectionManagerService.mNotificationListener)
                 .getCurrentRanking();
 
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -422,7 +435,7 @@
         mockDisabledViaDevelopOption();
         setupSensitiveNotification();
 
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
 
         verifyZeroInteractions(mWindowManager);
     }
@@ -443,8 +456,9 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
-        mMediaProjectionCallbackCaptor.getValue().onStop(mock(MediaProjectionInfo.class));
+        MediaProjectionInfo mediaProjectionInfo = createMediaProjectionInfo();
+        mMediaProjectionCallbackCaptor.getValue().onStart(mediaProjectionInfo);
+        mMediaProjectionCallbackCaptor.getValue().onStop(mediaProjectionInfo);
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener.onListenerConnected();
@@ -457,7 +471,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         ArraySet<PackageInfo> expectedBlockedPackages = setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener.onListenerConnected();
@@ -468,23 +482,23 @@
     @Test
     public void nlsOnListenerConnected_noSensitiveNotifications_noBlockedPackages() {
         setupNoSensitiveNotifications();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener.onListenerConnected();
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
     public void nlsOnListenerConnected_noNotifications_noBlockedPackages() {
         setupNoNotifications();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener.onListenerConnected();
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -492,7 +506,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
         doReturn(null)
                 .when(mSensitiveContentProtectionManagerService.mNotificationListener)
@@ -500,7 +514,7 @@
 
         mSensitiveContentProtectionManagerService.mNotificationListener.onListenerConnected();
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -508,7 +522,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
         when(mRankingMap.getRawRankingObject(eq(NOTIFICATION_KEY_1))).thenReturn(null);
         doReturn(mRankingMap)
@@ -517,7 +531,7 @@
 
         mSensitiveContentProtectionManagerService.mNotificationListener.onListenerConnected();
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -526,7 +540,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         mSensitiveContentProtectionManagerService.mNotificationListener.onListenerConnected();
 
         verifyZeroInteractions(mWindowManager);
@@ -549,8 +563,9 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
-        mMediaProjectionCallbackCaptor.getValue().onStop(mock(MediaProjectionInfo.class));
+        MediaProjectionInfo mediaProjectionInfo = createMediaProjectionInfo();
+        mMediaProjectionCallbackCaptor.getValue().onStart(mediaProjectionInfo);
+        mMediaProjectionCallbackCaptor.getValue().onStop(mediaProjectionInfo);
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener
@@ -564,7 +579,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         ArraySet<PackageInfo> expectedBlockedPackages = setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener
@@ -576,25 +591,25 @@
     @Test
     public void nlsOnNotificationRankingUpdate_noSensitiveNotifications_noBlockedPackages() {
         setupNoSensitiveNotifications();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener
                 .onNotificationRankingUpdate(mRankingMap);
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
     public void nlsOnNotificationRankingUpdate_noNotifications_noBlockedPackages() {
         setupNoNotifications();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener
                 .onNotificationRankingUpdate(mRankingMap);
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -602,13 +617,13 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener
                 .onNotificationRankingUpdate(null);
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -616,7 +631,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
         when(mRankingMap.getRawRankingObject(eq(NOTIFICATION_KEY_1))).thenReturn(null);
         doReturn(mRankingMap)
@@ -626,7 +641,7 @@
         mSensitiveContentProtectionManagerService.mNotificationListener
                 .onNotificationRankingUpdate(mRankingMap);
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -634,7 +649,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         doThrow(SecurityException.class)
@@ -644,7 +659,7 @@
         mSensitiveContentProtectionManagerService.mNotificationListener
                 .onNotificationRankingUpdate(mRankingMap);
 
-        verify(mWindowManager).addBlockScreenCaptureForApps(EMPTY_SET);
+        verifyZeroInteractions(mWindowManager);
     }
 
     @Test
@@ -653,7 +668,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         mSensitiveContentProtectionManagerService.mNotificationListener
                 .onNotificationRankingUpdate(mRankingMap);
 
@@ -677,8 +692,9 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
-        mMediaProjectionCallbackCaptor.getValue().onStop(mock(MediaProjectionInfo.class));
+        MediaProjectionInfo mediaProjectionInfo = createMediaProjectionInfo();
+        mMediaProjectionCallbackCaptor.getValue().onStart(mediaProjectionInfo);
+        mMediaProjectionCallbackCaptor.getValue().onStop(mediaProjectionInfo);
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener
@@ -692,7 +708,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener
@@ -708,7 +724,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener
@@ -722,7 +738,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener
@@ -736,7 +752,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
 
         mSensitiveContentProtectionManagerService.mNotificationListener
@@ -750,7 +766,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         Mockito.reset(mWindowManager);
         when(mRankingMap.getRawRankingObject(eq(NOTIFICATION_KEY_1))).thenReturn(null);
 
@@ -766,7 +782,7 @@
         // Sets up mNotification1 & mRankingMap to be a sensitive notification, and mNotification2
         // as non-sensitive
         setupSensitiveNotification();
-        mMediaProjectionCallbackCaptor.getValue().onStart(mock(MediaProjectionInfo.class));
+        mMediaProjectionCallbackCaptor.getValue().onStart(createMediaProjectionInfo());
         mSensitiveContentProtectionManagerService.mNotificationListener
                 .onNotificationPosted(mNotification1, mRankingMap);
 
diff --git a/services/tests/mockingservicestests/src/com/android/server/StorageManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/StorageManagerServiceTest.java
new file mode 100644
index 0000000..2e4b97e
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/StorageManagerServiceTest.java
@@ -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.server;
+
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+import android.multiuser.Flags;
+import android.os.UserManager;
+import android.os.storage.ICeStorageLockEventListener;
+import android.os.storage.StorageManagerInternal;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.util.concurrent.CopyOnWriteArrayList;
+
+public class StorageManagerServiceTest {
+
+    private final Context mRealContext = androidx.test.platform.app.InstrumentationRegistry
+            .getInstrumentation().getTargetContext();
+    private StorageManagerService mStorageManagerService;
+    private StorageManagerInternal mStorageManagerInternal;
+
+    private static final int TEST_USER_ID = 1001;
+
+    @Rule
+    public final ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this)
+            .spyStatic(UserManager.class)
+            .build();
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    private static class TestStorageEventListener implements ICeStorageLockEventListener {
+
+        private int mExpectedUserId;
+
+        private TestStorageEventListener(int userId) {
+            mExpectedUserId = userId;
+        }
+
+        @Override
+        public void onStorageLocked(int userId) {
+            assertThat(userId).isEqualTo(mExpectedUserId);
+        }
+    }
+
+
+    @Before
+    public void setFixtures() {
+        // Called when WatchedUserStates is constructed
+        doNothing().when(() -> UserManager.invalidateIsUserUnlockedCache());
+
+        mStorageManagerService = new StorageManagerService(mRealContext);
+        mStorageManagerInternal = LocalServices.getService(StorageManagerInternal.class);
+        assertWithMessage("LocalServices.getService(StorageManagerInternal.class)")
+                .that(mStorageManagerInternal).isNotNull();
+    }
+
+    @After
+    public void tearDown() {
+        LocalServices.removeServiceForTest(StorageManagerInternal.class);
+    }
+
+    @Test
+    public void testRegisterLockEventListener() {
+        mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+                Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE,
+                Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+        mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE);
+        CopyOnWriteArrayList<ICeStorageLockEventListener> storageLockEventListeners =
+                mStorageManagerService.getCeStorageEventCallbacks();
+        assertThat(storageLockEventListeners).isNotNull();
+        int registeredCallbackCount = storageLockEventListeners.size();
+        TestStorageEventListener testStorageEventListener =
+                new TestStorageEventListener(TEST_USER_ID);
+        mStorageManagerInternal.registerStorageLockEventListener(testStorageEventListener);
+        assertNumberOfStorageCallbackReceivers(registeredCallbackCount + 1);
+
+        mStorageManagerInternal.unregisterStorageLockEventListener(testStorageEventListener);
+        assertNumberOfStorageCallbackReceivers(registeredCallbackCount);
+    }
+
+    @Test
+    public void testDispatchCeStorageLockEvent() {
+        mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+                Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE,
+                Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+
+        assertThat(mStorageManagerService.getCeStorageEventCallbacks()).isNotNull();
+        int callbackReceiverSize = mStorageManagerService.getCeStorageEventCallbacks().size();
+        TestStorageEventListener testStorageEventListener =
+                spy(new TestStorageEventListener(TEST_USER_ID));
+
+        // Add testStorageEventListener to the list of storage callback listeners
+        mStorageManagerService.getCeStorageEventCallbacks().add(testStorageEventListener);
+        assertNumberOfStorageCallbackReceivers(callbackReceiverSize + 1);
+
+        mStorageManagerService.dispatchCeStorageLockedEvent(TEST_USER_ID);
+        verify(testStorageEventListener).onStorageLocked(eq(TEST_USER_ID));
+
+        // Remove testStorageEventListener from the list of storage callback listeners
+        mStorageManagerService.getCeStorageEventCallbacks().remove(testStorageEventListener);
+        assertNumberOfStorageCallbackReceivers(callbackReceiverSize);
+    }
+
+    private void assertNumberOfStorageCallbackReceivers(int callbackReceiverSize) {
+        assertThat(mStorageManagerService.getCeStorageEventCallbacks()).isNotNull();
+        assertThat(mStorageManagerService.getCeStorageEventCallbacks().size())
+                    .isEqualTo(callbackReceiverSize);
+    }
+}
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
index 9975221..c359412 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -69,7 +69,6 @@
 import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_EXACT_ALARMS;
 import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_EXACT_LISTENER_ALARMS_ON_CACHED;
 import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_FOR_CANCELED;
-import static com.android.server.alarm.AlarmManagerService.AlarmHandler.TARE_AFFORDABILITY_CHANGED;
 import static com.android.server.alarm.AlarmManagerService.AlarmHandler.TEMPORARY_QUOTA_CHANGED;
 import static com.android.server.alarm.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_COMPAT_QUOTA;
 import static com.android.server.alarm.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_COMPAT_WINDOW;
@@ -126,7 +125,6 @@
 import android.app.IAlarmManager;
 import android.app.PendingIntent;
 import android.app.compat.CompatChanges;
-import android.app.tare.EconomyManager;
 import android.app.usage.UsageStatsManagerInternal;
 import android.companion.virtual.VirtualDeviceManager;
 import android.content.ContentResolver;
@@ -137,6 +135,8 @@
 import android.net.Uri;
 import android.os.BatteryManager;
 import android.os.Bundle;
+import android.os.Environment;
+import android.os.FileUtils;
 import android.os.Handler;
 import android.os.HandlerExecutor;
 import android.os.IBinder;
@@ -149,6 +149,7 @@
 import android.os.ServiceManager;
 import android.os.SystemProperties;
 import android.os.UserHandle;
+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;
@@ -159,6 +160,7 @@
 import android.util.Log;
 import android.util.SparseArray;
 
+import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.dx.mockito.inline.extended.MockedVoidMethod;
@@ -177,12 +179,11 @@
 import com.android.server.pm.permission.PermissionManagerService;
 import com.android.server.pm.permission.PermissionManagerServiceInternal;
 import com.android.server.pm.pkg.AndroidPackage;
-import com.android.server.tare.AlarmManagerEconomicPolicy;
-import com.android.server.tare.EconomyManagerInternal;
 import com.android.server.usage.AppStandbyInternal;
 
 import libcore.util.EmptyArray;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -194,6 +195,7 @@
 import org.mockito.quality.Strictness;
 import org.mockito.stubbing.Answer;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -224,6 +226,7 @@
     private ActivityManager.UidFrozenStateChangedCallback mUidFrozenStateCallback;
     private IAppOpsCallback mIAppOpsCallback;
     private IAlarmManager mBinder;
+    private File mTestDir;
     @Mock
     private Context mMockContext;
     @Mock
@@ -257,8 +260,6 @@
     @Mock
     private PowerManager.WakeLock mWakeLock;
     @Mock
-    private EconomyManagerInternal mEconomyManagerInternal;
-    @Mock
     DeviceConfig.Properties mDeviceConfigProperties;
     HashSet<String> mDeviceConfigKeys = new HashSet<>();
 
@@ -413,6 +414,7 @@
             .mockStatic(PermissionManagerService.class)
             .mockStatic(ServiceManager.class)
             .mockStatic(SystemProperties.class)
+            .mockStatic(Environment.class)
             .spyStatic(UserHandle.class)
             .afterSessionFinished(
                     () -> LocalServices.removeServiceForTest(AlarmManagerInternal.class))
@@ -429,7 +431,8 @@
      */
     private void disableFlagsNotSetByAnnotation() {
         try {
-            mSetFlagsRule.disableFlags(Flags.FLAG_USE_FROZEN_STATE_TO_DROP_LISTENER_ALARMS);
+            mSetFlagsRule.disableFlags(Flags.FLAG_USE_FROZEN_STATE_TO_DROP_LISTENER_ALARMS,
+                    Flags.FLAG_START_USER_BEFORE_SCHEDULED_ALARMS);
         } catch (FlagSetException fse) {
             // Expected if the test about to be run requires this enabled.
         }
@@ -440,8 +443,6 @@
         doReturn(mIActivityManager).when(ActivityManager::getService);
         doReturn(mDeviceIdleInternal).when(
                 () -> LocalServices.getService(DeviceIdleInternal.class));
-        doReturn(mEconomyManagerInternal).when(
-                () -> LocalServices.getService(EconomyManagerInternal.class));
         doReturn(mPermissionManagerInternal).when(
                 () -> LocalServices.getService(PermissionManagerServiceInternal.class));
         doReturn(mActivityManagerInternal).when(
@@ -460,7 +461,10 @@
         when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE),
                 eq(TEST_CALLING_USER), anyLong())).thenReturn(STANDBY_BUCKET_ACTIVE);
         doReturn(Looper.getMainLooper()).when(Looper::myLooper);
-
+        mTestDir = new File(InstrumentationRegistry.getInstrumentation().getTargetContext()
+                .getFilesDir(), "alarmsTestDir");
+        mTestDir.mkdirs();
+        doReturn(mTestDir).when(Environment::getDataSystemDirectory);
         when(mMockContext.getContentResolver()).thenReturn(mContentResolver);
 
         doReturn(mDeviceConfigKeys).when(mDeviceConfigProperties).getKeyset();
@@ -532,7 +536,6 @@
         mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
 
         verify(mBatteryManager).isCharging();
-        setTareEnabled(EconomyManager.ENABLED_MODE_OFF);
         mAppStandbyWindow = mService.mConstants.APP_STANDBY_WINDOW;
         mAllowWhileIdleWindow = mService.mConstants.ALLOW_WHILE_IDLE_WINDOW;
 
@@ -579,6 +582,12 @@
         setTestableQuotas();
     }
 
+    @After
+    public void tearDown() {
+        // Clean up test dir to remove persisted user files.
+        FileUtils.deleteContentsAndDir(mTestDir);
+    }
+
     private void setTestAlarm(int type, long triggerTime, PendingIntent operation) {
         setTestAlarm(type, triggerTime, operation, 0, FLAG_STANDALONE, TEST_CALLING_UID);
     }
@@ -702,12 +711,6 @@
         mService.mConstants.onPropertiesChanged(mDeviceConfigProperties);
     }
 
-    private void setTareEnabled(int enabledMode) {
-        when(mEconomyManagerInternal.getEnabledMode(eq(AlarmManagerEconomicPolicy.POLICY_ALARM)))
-                .thenReturn(enabledMode);
-        mService.mConstants.onTareEnabledModeChanged(enabledMode);
-    }
-
     /**
      * Lowers quotas to make testing feasible. Careful while calling as this will replace any
      * existing settings for the calling test.
@@ -2083,44 +2086,6 @@
     }
 
     @Test
-    public void tareThrottling() {
-        setTareEnabled(EconomyManager.ENABLED_MODE_ON);
-        final ArgumentCaptor<EconomyManagerInternal.AffordabilityChangeListener> listenerCaptor =
-                ArgumentCaptor.forClass(EconomyManagerInternal.AffordabilityChangeListener.class);
-        final ArgumentCaptor<EconomyManagerInternal.ActionBill> billCaptor =
-                ArgumentCaptor.forClass(EconomyManagerInternal.ActionBill.class);
-
-        when(mEconomyManagerInternal
-                .canPayFor(eq(TEST_CALLING_USER), eq(TEST_CALLING_PACKAGE), billCaptor.capture()))
-                .thenReturn(false);
-
-        final PendingIntent alarmPi = getNewMockPendingIntent();
-        setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 15, alarmPi);
-        assertEquals(mNowElapsedTest + INDEFINITE_DELAY, mTestTimer.getElapsed());
-
-        final EconomyManagerInternal.ActionBill bill = billCaptor.getValue();
-        verify(mEconomyManagerInternal).registerAffordabilityChangeListener(
-                eq(TEST_CALLING_USER), eq(TEST_CALLING_PACKAGE),
-                listenerCaptor.capture(), eq(bill));
-        final EconomyManagerInternal.AffordabilityChangeListener listener =
-                listenerCaptor.getValue();
-
-        when(mEconomyManagerInternal
-                .canPayFor(eq(TEST_CALLING_USER), eq(TEST_CALLING_PACKAGE), eq(bill)))
-                .thenReturn(true);
-        listener.onAffordabilityChanged(TEST_CALLING_USER, TEST_CALLING_PACKAGE, bill, true);
-        assertAndHandleMessageSync(TARE_AFFORDABILITY_CHANGED);
-        assertEquals(mNowElapsedTest + 15, mTestTimer.getElapsed());
-
-        when(mEconomyManagerInternal
-                .canPayFor(eq(TEST_CALLING_USER), eq(TEST_CALLING_PACKAGE), eq(bill)))
-                .thenReturn(false);
-        listener.onAffordabilityChanged(TEST_CALLING_USER, TEST_CALLING_PACKAGE, bill, false);
-        assertAndHandleMessageSync(TARE_AFFORDABILITY_CHANGED);
-        assertEquals(mNowElapsedTest + INDEFINITE_DELAY, mTestTimer.getElapsed());
-    }
-
-    @Test
     public void dispatchOrder() throws Exception {
         setDeviceConfigLong(KEY_MAX_DEVICE_IDLE_FUZZ, 0);
 
@@ -3396,32 +3361,6 @@
     }
 
     @Test
-    public void tareEventPushed_on() throws Exception {
-        setTareEnabled(EconomyManager.ENABLED_MODE_ON);
-        runTareEventPushed();
-    }
-
-    @Test
-    public void tareEventPushed_shadow() throws Exception {
-        setTareEnabled(EconomyManager.ENABLED_MODE_SHADOW);
-        runTareEventPushed();
-    }
-
-    private void runTareEventPushed() throws Exception {
-        for (int i = 0; i < 10; i++) {
-            final int type = (i % 2 == 1) ? ELAPSED_REALTIME : ELAPSED_REALTIME_WAKEUP;
-            setTestAlarm(type, mNowElapsedTest + i, getNewMockPendingIntent());
-        }
-
-        final ArrayList<Alarm> alarms = mService.mAlarmStore.remove((alarm) -> {
-            return alarm.creatorUid == TEST_CALLING_UID;
-        });
-        mService.deliverAlarmsLocked(alarms, mNowElapsedTest);
-        verify(mEconomyManagerInternal, times(10)).noteInstantaneousEvent(
-                eq(TEST_CALLING_USER), eq(TEST_CALLING_PACKAGE), anyInt(), any());
-    }
-
-    @Test
     public void setTimeZoneImpl() {
         final long durationMs = 20000L;
         when(mActivityManagerInternal.getBootTimeTempAllowListDuration()).thenReturn(durationMs);
@@ -3792,6 +3731,7 @@
     }
 
     @EnableFlags(Flags.FLAG_USE_FROZEN_STATE_TO_DROP_LISTENER_ALARMS)
+    @DisableFlags(Flags.FLAG_START_USER_BEFORE_SCHEDULED_ALARMS)
     @Test
     public void exactListenerAlarmsRemovedOnFrozen() {
         mockChangeEnabled(EXACT_LISTENER_ALARMS_DROPPED_ON_CACHED, true);
@@ -3823,6 +3763,7 @@
     }
 
     @EnableFlags(Flags.FLAG_USE_FROZEN_STATE_TO_DROP_LISTENER_ALARMS)
+    @DisableFlags(Flags.FLAG_START_USER_BEFORE_SCHEDULED_ALARMS)
     @Test
     public void alarmCountOnListenerFrozen() {
         mockChangeEnabled(EXACT_LISTENER_ALARMS_DROPPED_ON_CACHED, true);
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java
index 246b0f04..d802b96 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java
@@ -28,7 +28,6 @@
 import static com.android.server.alarm.Alarm.NUM_POLICIES;
 import static com.android.server.alarm.Alarm.REQUESTER_POLICY_INDEX;
 import static com.android.server.alarm.AlarmManagerService.isExemptFromAppStandby;
-import static com.android.server.alarm.AlarmManagerService.isExemptFromTare;
 import static com.android.server.alarm.Constants.TEST_CALLING_PACKAGE;
 import static com.android.server.alarm.Constants.TEST_CALLING_UID;
 
@@ -196,22 +195,6 @@
     }
 
     @Test
-    public void testIsExemptFromTare() {
-        final long anything = 54321;    // Arbitrary number, doesn't matter for this test.
-
-        assertFalse("Basic alarm exempt", isExemptFromTare(
-                createDefaultAlarm(anything, anything, 0)));
-        assertFalse("FLAG_ALLOW_WHILE_IDLE_COMPAT exempt", isExemptFromTare(
-                createDefaultAlarm(anything, anything, FLAG_ALLOW_WHILE_IDLE_COMPAT)));
-        assertFalse("ALLOW_WHILE_IDLE exempt", isExemptFromTare(
-                createDefaultAlarm(anything, anything, FLAG_ALLOW_WHILE_IDLE)));
-
-        assertTrue("ALLOW_WHILE_IDLE_UNRESTRICTED not exempt", isExemptFromTare(
-                createDefaultAlarm(anything, anything, FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED)));
-        assertTrue("Alarm clock not exempt", isExemptFromTare(createAlarmClock(anything)));
-    }
-
-    @Test
     public void snapshotImmutable() {
         final Alarm a = createDefaultAlarm(0, 0, 0);
 
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/UserWakeupStoreTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/UserWakeupStoreTest.java
new file mode 100644
index 0000000..5d3e499
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/UserWakeupStoreTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.alarm;
+
+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.alarm.UserWakeupStore.BUFFER_TIME_MS;
+import static com.android.server.alarm.UserWakeupStore.USER_START_TIME_DEVIATION_LIMIT_MS;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.os.Environment;
+import android.os.FileUtils;
+import android.os.SystemClock;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.os.BackgroundThread;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.concurrent.ExecutorService;
+
+@RunWith(AndroidJUnit4.class)
+public class UserWakeupStoreTest {
+    private static final int USER_ID_1 = 10;
+    private static final int USER_ID_2 = 11;
+    private static final int USER_ID_3 = 12;
+    private static final long TEST_TIMESTAMP = 150_000;
+    private static final File TEST_SYSTEM_DIR = new File(InstrumentationRegistry
+            .getInstrumentation().getContext().getDataDir(), "alarmsTestDir");
+    private static final File ROOT_DIR = new File(TEST_SYSTEM_DIR, UserWakeupStore.ROOT_DIR_NAME);
+    private ExecutorService mMockExecutorService = null;
+    UserWakeupStore mUserWakeupStore;
+
+    @Rule
+    public final ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this)
+            .mockStatic(Environment.class)
+            .mockStatic(BackgroundThread.class)
+            .build();
+
+    @Before
+    public void setUp() {
+        TEST_SYSTEM_DIR.mkdirs();
+        doReturn(TEST_SYSTEM_DIR).when(Environment::getDataSystemDirectory);
+        mMockExecutorService = Mockito.mock(ExecutorService.class);
+        Mockito.doAnswer((invocation) -> {
+            Runnable task = invocation.getArgument(0);
+            task.run();
+            return null;
+        }).when(mMockExecutorService).execute(Mockito.any(Runnable.class));
+        doReturn(mMockExecutorService).when(BackgroundThread::getExecutor);
+        mUserWakeupStore = new UserWakeupStore();
+        spyOn(mUserWakeupStore);
+        mUserWakeupStore.init();
+    }
+
+    @After
+    public void tearDown() {
+        // Clean up test dir to remove persisted user files.
+        FileUtils.deleteContentsAndDir(TEST_SYSTEM_DIR);
+    }
+
+    @Test
+    public void testAddWakeups() {
+        mUserWakeupStore.addUserWakeup(USER_ID_1, TEST_TIMESTAMP - 19_000);
+        mUserWakeupStore.addUserWakeup(USER_ID_2, TEST_TIMESTAMP - 7_000);
+        mUserWakeupStore.addUserWakeup(USER_ID_3, TEST_TIMESTAMP - 13_000);
+        assertEquals(3, mUserWakeupStore.getUserIdsToWakeup(TEST_TIMESTAMP).length);
+        ArrayList<Integer> userIds = new ArrayList<>();
+        userIds.add(USER_ID_1);
+        userIds.add(USER_ID_2);
+        userIds.add(USER_ID_3);
+        final int[] usersToWakeup = mUserWakeupStore.getUserIdsToWakeup(TEST_TIMESTAMP);
+        ArrayList<Integer> userWakeups = new ArrayList<>();
+        for (int i = 0; i < usersToWakeup.length; i++) {
+            userWakeups.add(usersToWakeup[i]);
+        }
+        Collections.sort(userIds);
+        Collections.sort(userWakeups);
+        assertEquals(userIds, userWakeups);
+
+        final File file = new File(ROOT_DIR , "usersWithAlarmClocks.xml");
+        assertTrue(file.exists());
+    }
+
+    @Test
+    public void testAddMultipleWakeupsForUser_ensureOnlyLastWakeupRemains() {
+        final long finalAlarmTime = TEST_TIMESTAMP - 13_000;
+        mUserWakeupStore.addUserWakeup(USER_ID_1, TEST_TIMESTAMP - 29_000);
+        mUserWakeupStore.addUserWakeup(USER_ID_1, TEST_TIMESTAMP - 7_000);
+        mUserWakeupStore.addUserWakeup(USER_ID_1, finalAlarmTime);
+        assertEquals(1, mUserWakeupStore.getUserIdsToWakeup(TEST_TIMESTAMP).length);
+        final long alarmTime = mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_1)
+                + BUFFER_TIME_MS;
+        assertTrue(finalAlarmTime + USER_START_TIME_DEVIATION_LIMIT_MS >= alarmTime);
+        assertTrue(finalAlarmTime - USER_START_TIME_DEVIATION_LIMIT_MS <= alarmTime);
+    }
+
+    @Test
+    public void testRemoveWakeupForUser_negativeWakeupTimeIsReturnedForUser() {
+        mUserWakeupStore.addUserWakeup(USER_ID_1, TEST_TIMESTAMP - 19_000);
+        mUserWakeupStore.addUserWakeup(USER_ID_2, TEST_TIMESTAMP - 7_000);
+        mUserWakeupStore.addUserWakeup(USER_ID_3, TEST_TIMESTAMP - 13_000);
+        assertEquals(3, mUserWakeupStore.getUserIdsToWakeup(TEST_TIMESTAMP).length);
+        mUserWakeupStore.removeUserWakeup(USER_ID_3);
+        assertEquals(-1, mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_3));
+        assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_2) > 0);
+    }
+
+    @Test
+    public void testGetNextUserWakeup() {
+        mUserWakeupStore.addUserWakeup(USER_ID_1, TEST_TIMESTAMP - 19_000);
+        mUserWakeupStore.addUserWakeup(USER_ID_2, TEST_TIMESTAMP - 3_000);
+        mUserWakeupStore.addUserWakeup(USER_ID_3, TEST_TIMESTAMP - 13_000);
+        assertEquals(mUserWakeupStore.getNextWakeupTime(),
+                mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_1));
+        mUserWakeupStore.removeUserWakeup(USER_ID_1);
+        assertEquals(mUserWakeupStore.getNextWakeupTime(),
+                mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_3));
+    }
+
+    @Test
+    public void testWriteAndReadUsersFromFile() {
+        mUserWakeupStore.addUserWakeup(USER_ID_1, TEST_TIMESTAMP - 19_000);
+        mUserWakeupStore.addUserWakeup(USER_ID_2, TEST_TIMESTAMP - 7_000);
+        mUserWakeupStore.addUserWakeup(USER_ID_3, TEST_TIMESTAMP - 13_000);
+        assertEquals(3, mUserWakeupStore.getUserIdsToWakeup(TEST_TIMESTAMP).length);
+        mUserWakeupStore.init();
+        final long realtime = SystemClock.elapsedRealtime();
+        assertEquals(0, mUserWakeupStore.getUserIdsToWakeup(TEST_TIMESTAMP).length);
+        assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_2) > realtime);
+        assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_1)
+                < mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_3));
+        assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_3)
+                < mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_2));
+        assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_1) - realtime
+                < BUFFER_TIME_MS + USER_START_TIME_DEVIATION_LIMIT_MS);
+        assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_3) - realtime
+                < 2 * BUFFER_TIME_MS + USER_START_TIME_DEVIATION_LIMIT_MS);
+        assertTrue(mUserWakeupStore.getWakeupTimeForUserForTest(USER_ID_2) - realtime
+                < 3 * BUFFER_TIME_MS + USER_START_TIME_DEVIATION_LIMIT_MS);
+    }
+    //TODO: b/330264023 - Add tests for I/O in usersWithAlarmClocks.xml.
+}
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 a7430e5..419bcb8 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -38,6 +38,7 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
 import static com.android.server.am.ActivityManagerInternalTest.CustomThread;
 import static com.android.server.am.ActivityManagerService.Injector;
@@ -692,6 +693,31 @@
         assertEquals(uid, -1);
     }
 
+    @SuppressWarnings("GuardedBy")
+    @Test
+    public void testFifoSwitch() {
+        addUidRecord(TEST_UID, TEST_PACKAGE);
+        final ProcessRecord fifoProc = mAms.getProcessRecordLocked(TEST_PACKAGE, TEST_UID);
+        final var wpc = fifoProc.getWindowProcessController();
+        spyOn(wpc);
+        doReturn(true).when(wpc).useFifoUiScheduling();
+        fifoProc.makeActive(fifoProc.getThread(), mAms.mProcessStats);
+        assertTrue(fifoProc.useFifoUiScheduling());
+        assertTrue(mAms.mSpecifiedFifoProcesses.contains(fifoProc));
+
+        // If there is a request to use more CPU resource (e.g. camera), the current fifo process
+        // should switch the capability of using fifo.
+        final UidRecord uidRecord = addUidRecord(TEST_UID + 1, TEST_PACKAGE + 1);
+        uidRecord.setCurProcState(PROCESS_STATE_TOP);
+        mAms.adjustFifoProcessesIfNeeded(uidRecord.getUid(), false /* allowSpecifiedFifo */);
+        assertFalse(fifoProc.useFifoUiScheduling());
+        mAms.adjustFifoProcessesIfNeeded(uidRecord.getUid(), true /* allowSpecifiedFifo */);
+        assertTrue(fifoProc.useFifoUiScheduling());
+
+        fifoProc.makeInactive(mAms.mProcessStats);
+        assertFalse(mAms.mSpecifiedFifoProcesses.contains(fifoProc));
+    }
+
     @Test
     public void testGlobalIsolatedUidAllocator() {
         final IsolatedUidRange globalUidRange = mAms.mProcessList.mGlobalIsolatedUids;
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
index 067dd3b..637c73f 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BackgroundRestrictionTest.java
@@ -126,6 +126,7 @@
 import android.os.BatteryStatsInternal;
 import android.os.BatteryUsageStats;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.MessageQueue;
 import android.os.Process;
 import android.os.RemoteException;
@@ -321,6 +322,7 @@
     private BindServiceEventListener mBindServiceEventListener;
 
     private Context mContext = getInstrumentation().getTargetContext();
+    private Handler mDefaultHandler = new Handler(Looper.getMainLooper());
     private TestBgRestrictionInjector mInjector;
     private AppRestrictionController mBgRestrictionController;
     private AppBatteryTracker mAppBatteryTracker;
@@ -346,10 +348,6 @@
         mActivityManagerService.mConstants = mActivityManagerConstants;
         mPhoneCarrierPrivileges = new PhoneCarrierPrivileges(
                 mInjector.getTelephonyManager(), MOCK_PRIVILEGED_PACKAGES.length);
-        for (int i = 0; i < MOCK_PRIVILEGED_PACKAGES.length; i++) {
-            mPhoneCarrierPrivileges.addNewPrivilegePackages(i,
-                    MOCK_PRIVILEGED_PACKAGES[i], MOCK_PRIVILEGED_UIDS[i]);
-        }
 
         doReturn(PROCESS_STATE_FOREGROUND_SERVICE).when(mActivityManagerInternal)
                 .getUidProcessState(anyInt());
@@ -3048,6 +3046,11 @@
 
     @Test
     public void testCarrierPrivilegedAppListener() throws Exception {
+        for (int i = 0; i < MOCK_PRIVILEGED_PACKAGES.length; i++) {
+            mPhoneCarrierPrivileges.addNewPrivilegePackages(i,
+                    MOCK_PRIVILEGED_PACKAGES[i], MOCK_PRIVILEGED_UIDS[i]);
+        }
+
         final long shortMs = 1_000L;
         for (int i = 0; i < MOCK_PRIVILEGED_PACKAGES.length; i++) {
             verifyPotentialSystemExemptionReason(REASON_CARRIER_PRIVILEGED_APP,
@@ -3356,6 +3359,11 @@
         }
 
         @Override
+        Handler getDefaultHandler() {
+            return mDefaultHandler;
+        }
+
+        @Override
         boolean isTest() {
             return true;
         }
@@ -3445,6 +3453,16 @@
         IAppOpsService getIAppOpsService() {
             return BackgroundRestrictionTest.this.mIAppOpsService;
         }
+
+        @Override
+        int checkPermission(String perm, int pid, int uid) {
+            try {
+                return BackgroundRestrictionTest.this.mIActivityManager.checkPermission(
+                        perm, pid, uid);
+            } catch (RemoteException e) {
+                return PERMISSION_DENIED;
+            }
+        }
     }
 
     private class TestAppBatteryTrackerInjector extends TestBaseTrackerInjector<AppBatteryPolicy> {
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
index 1b2c0e4..97ae0bd 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
@@ -940,8 +940,7 @@
 
         final ProcessRecord receiverGreenApp = mAms.getProcessRecordLocked(PACKAGE_GREEN,
                 getUidForPackage(PACKAGE_GREEN));
-        // Modern queue always kills the target process when broadcast delivery fails, where as
-        // the legacy queue leaves the process killing task to AMS
+        // Broadcast queue always kills the target process when broadcast delivery fails.
         assertNull(receiverGreenApp);
         final ProcessRecord receiverBlueApp = mAms.getProcessRecordLocked(PACKAGE_BLUE,
                 getUidForPackage(PACKAGE_BLUE));
@@ -1054,8 +1053,6 @@
         }
 
         waitForIdle();
-        // Legacy stack does not remove registered receivers as part of
-        // cleanUpDisabledPackageReceiversLocked() call, so verify this only on modern queue.
         verifyScheduleReceiver(never(), callerApp, USER_GUEST);
         verifyScheduleRegisteredReceiver(never(), callerApp, USER_GUEST);
         for (String pkg : new String[] {
@@ -1166,8 +1163,7 @@
         final ProcessRecord receiverOrangeApp = mAms.getProcessRecordLocked(PACKAGE_ORANGE,
                 getUidForPackage(PACKAGE_ORANGE));
 
-        // Modern queue always kills the target process when broadcast delivery fails, where as
-        // the legacy queue leaves the process killing task to AMS
+        // Broadcast queue always kills the target process when broadcast delivery fails.
         assertNull(receiverGreenApp);
         verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, airplane);
         verifyScheduleReceiver(times(1), receiverYellowApp, airplane);
@@ -1210,8 +1206,6 @@
         final ProcessRecord restartedReceiverBlueApp = mAms.getProcessRecordLocked(PACKAGE_BLUE,
                 getUidForPackage(PACKAGE_BLUE));
         assertNotEquals(receiverBlueApp, restartedReceiverBlueApp);
-        // Legacy queue will always try delivering the broadcast even if the process
-        // has been killed.
         verifyScheduleReceiver(never(), receiverBlueApp, airplane);
         // Verify that the new process receives the broadcast.
         verifyScheduleReceiver(times(1), restartedReceiverBlueApp, airplane);
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
index 872ac40..4c7a8fe 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
@@ -479,15 +479,7 @@
         sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
         updateOomAdj(app);
 
-        final int expectedAdj;
-        if (sService.mConstants.ENABLE_NEW_OOMADJ) {
-            // A cached empty process can be at best a level higher than the min cached adj.
-            expectedAdj = sFirstCachedAdj;
-        } else {
-            // This is wrong but legacy behavior is going to be removed and not worth fixing.
-            expectedAdj = CACHED_APP_MIN_ADJ;
-        }
-
+        final int expectedAdj = sFirstCachedAdj;
         assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj,
                 SCHED_GROUP_BACKGROUND);
     }
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java
index 680ab16..daa827ea 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/ServiceBindingOomAdjPolicyTest.java
@@ -186,7 +186,7 @@
         doReturn(true).when(mAms.mOomAdjuster.mCachedAppOptimizer).useFreezer();
         doNothing().when(mAms.mOomAdjuster.mCachedAppOptimizer).freezeAppAsyncAtEarliestLSP(
                 any());
-        doReturn(false).when(mAms.mAppProfiler).updateLowMemStateLSP(anyInt(), anyInt(),
+        doNothing().when(mAms.mAppProfiler).updateLowMemStateLSP(anyInt(), anyInt(),
                 anyInt(), anyLong());
 
         mCurrentCallingUid = TEST_APP1_UID;
diff --git a/services/tests/mockingservicestests/src/com/android/server/backup/PackageManagerBackupAgentTest.java b/services/tests/mockingservicestests/src/com/android/server/backup/PackageManagerBackupAgentTest.java
index 822dacf..f6f4eae 100644
--- a/services/tests/mockingservicestests/src/com/android/server/backup/PackageManagerBackupAgentTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/backup/PackageManagerBackupAgentTest.java
@@ -211,6 +211,30 @@
         assertThat(mNewState.length()).isEqualTo(0);
     }
 
+    @Test
+    public void onRestore_legacyBackupWithMissingSignature_restoresBackup() throws Exception {
+        PackageInfo pkgWithoutSigs = createPackage("pkg.no.sigs", 1);
+        pkgWithoutSigs.signingInfo =
+                new SigningInfo(new SigningDetails(new Signature[0], 1, null, null));
+        when(mPackageManager.getPackageInfoAsUser(
+                        eq(pkgWithoutSigs.packageName), anyInt(), anyInt()))
+                .thenReturn(pkgWithoutSigs);
+        ImmutableList<PackageInfo> packages =
+                ImmutableList.<PackageInfo>builder().addAll(mPackages).add(pkgWithoutSigs).build();
+        mPackageManagerBackupAgent =
+                new PackageManagerBackupAgent(mPackageManager, packages, USER_ID);
+        // A legacy backup is one without an ancestral record version. Ancestral record versions
+        // are always written however, so we'll need to delete it from the backup data before
+        // restoring.
+        runBackupAgentOnBackup();
+        deleteKeyFromBackupData(mBackupData, PackageManagerBackupAgent.ANCESTRAL_RECORD_KEY);
+
+        runBackupAgentOnRestore(); // should not fail or timeout
+
+        assertThat(mPackageManagerBackupAgent.getRestoredPackages())
+                .containsExactly(EXISTING_PACKAGE_NAME);
+    }
+
     private void runBackupAgentOnBackup() throws Exception {
         try (ParcelFileDescriptor oldStateDescriptor = openForReading(mOldState);
                 ParcelFileDescriptor backupDataDescriptor = openForWriting(mBackupData);
diff --git a/services/tests/mockingservicestests/src/com/android/server/backup/SystemBackupAgentTest.java b/services/tests/mockingservicestests/src/com/android/server/backup/SystemBackupAgentTest.java
index 18dc114..7e17909 100644
--- a/services/tests/mockingservicestests/src/com/android/server/backup/SystemBackupAgentTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/backup/SystemBackupAgentTest.java
@@ -18,6 +18,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.when;
+
 import android.annotation.NonNull;
 import android.app.backup.BackupHelper;
 import android.app.backup.BackupHelperWithLogger;
@@ -29,8 +31,6 @@
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.util.ArraySet;
 
-import static org.mockito.Mockito.when;
-
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
@@ -92,7 +92,8 @@
                         "people",
                         "app_locales",
                         "app_gender",
-                        "companion");
+                        "companion",
+                        "system_gender");
     }
 
     @Test
@@ -116,7 +117,8 @@
                         "people",
                         "app_locales",
                         "app_gender",
-                        "companion");
+                        "companion",
+                        "system_gender");
     }
 
     @Test
@@ -132,7 +134,9 @@
                         "notifications",
                         "permissions",
                         "app_locales",
-                        "companion");
+                        "companion",
+                        "app_gender",
+                        "system_gender");
     }
 
     @Test
@@ -152,7 +156,9 @@
                         "account_manager",
                         "usage_stats",
                         "shortcut_manager",
-                        "companion");
+                        "companion",
+                        "app_gender",
+                        "system_gender");
     }
 
     @Test
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java
index fab7610..11f20e3 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java
@@ -85,7 +85,6 @@
 import com.android.server.job.controllers.ConnectivityController;
 import com.android.server.job.controllers.JobStatus;
 import com.android.server.job.controllers.QuotaController;
-import com.android.server.job.controllers.TareController;
 import com.android.server.pm.UserManagerInternal;
 import com.android.server.usage.AppStandbyInternal;
 
@@ -617,12 +616,8 @@
 
         QuotaController quotaController = mService.getQuotaController();
         spyOn(quotaController);
-        TareController tareController = mService.getTareController();
-        spyOn(tareController);
         doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
                 .when(quotaController).getMaxJobExecutionTimeMsLocked(any());
-        doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
-                .when(tareController).getMaxJobExecutionTimeMsLocked(any());
 
         grantRunUserInitiatedJobsPermission(true);
         assertEquals(mService.mConstants.RUNTIME_UI_LIMIT_MS,
@@ -655,12 +650,8 @@
 
         QuotaController quotaController = mService.getQuotaController();
         spyOn(quotaController);
-        TareController tareController = mService.getTareController();
-        spyOn(tareController);
         doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
                 .when(quotaController).getMaxJobExecutionTimeMsLocked(any());
-        doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
-                .when(tareController).getMaxJobExecutionTimeMsLocked(any());
 
         mService.mConstants.ENABLE_EXECUTION_SAFEGUARDS_UDC = false;
         mService.mConstants.EXECUTION_SAFEGUARDS_UDC_TIMEOUT_UIJ_COUNT = 2;
@@ -784,12 +775,8 @@
 
         QuotaController quotaController = mService.getQuotaController();
         spyOn(quotaController);
-        TareController tareController = mService.getTareController();
-        spyOn(tareController);
         doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
                 .when(quotaController).getMaxJobExecutionTimeMsLocked(any());
-        doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
-                .when(tareController).getMaxJobExecutionTimeMsLocked(any());
 
         mService.mConstants.ENABLE_EXECUTION_SAFEGUARDS_UDC = true;
         mService.mConstants.EXECUTION_SAFEGUARDS_UDC_TIMEOUT_UIJ_COUNT = 2;
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
index c6608e6..2d0f4b6 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
@@ -1345,13 +1345,11 @@
     private void markExpeditedQuotaApproved(JobStatus job, boolean isApproved) {
         if (job.isRequestedExpeditedJob()) {
             job.setExpeditedJobQuotaApproved(sElapsedRealtimeClock.millis(), isApproved);
-            job.setExpeditedJobTareApproved(sElapsedRealtimeClock.millis(), isApproved);
         }
     }
 
     private void markImplicitConstraintsSatisfied(JobStatus job, boolean isSatisfied) {
         job.setQuotaConstraintSatisfied(sElapsedRealtimeClock.millis(), isSatisfied);
-        job.setTareWealthConstraintSatisfied(sElapsedRealtimeClock.millis(), isSatisfied);
         job.setDeviceNotDozingConstraintSatisfied(
                 sElapsedRealtimeClock.millis(), isSatisfied, false);
         job.setBackgroundNotRestrictedConstraintSatisfied(
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
index 1a95d66..da5cbab3 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
@@ -200,9 +200,7 @@
         js.setBackgroundNotRestrictedConstraintSatisfied(
                 sElapsedRealtimeClock.millis(), true, false);
         js.setQuotaConstraintSatisfied(sElapsedRealtimeClock.millis(), true);
-        js.setTareWealthConstraintSatisfied(sElapsedRealtimeClock.millis(), true);
         js.setExpeditedJobQuotaApproved(sElapsedRealtimeClock.millis(), true);
-        js.setExpeditedJobTareApproved(sElapsedRealtimeClock.millis(), true);
         js.setFlexibilityConstraintSatisfied(sElapsedRealtimeClock.millis(), true);
         return js;
     }
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
index 0702764..6df4907 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
@@ -33,6 +33,7 @@
 import static com.android.server.job.JobSchedulerService.WORKING_INDEX;
 import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
 import static com.android.server.job.JobSchedulerService.sSystemClock;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
@@ -400,8 +401,6 @@
                 /* state */ true, /* allowlisted */false);
         js.setBackgroundNotRestrictedConstraintSatisfied(
                 sElapsedRealtimeClock.millis(), true, false);
-        js.setTareWealthConstraintSatisfied(sElapsedRealtimeClock.millis(), true);
-        js.setExpeditedJobTareApproved(sElapsedRealtimeClock.millis(), true);
         js.setFlexibilityConstraintSatisfied(sElapsedRealtimeClock.millis(), true);
         return js;
     }
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
index 538c0ee..c9aab53 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
@@ -166,7 +166,7 @@
             null
         }
         whenever(mocks.settings.addPackageLPw(nullable(), nullable(), nullable(), nullable(),
-                nullable(), nullable(), nullable())) {
+                nullable(), nullable(), nullable(), nullable())) {
             val name: String = getArgument(0)
             val pendingAdd = mPendingPackageAdds.firstOrNull { it.first == name }
                     ?: return@whenever null
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java
index 6aa1825..79f1574 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java
@@ -34,6 +34,7 @@
 
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
@@ -58,6 +59,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.storage.StorageManager;
+import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.Settings;
 import android.util.Log;
@@ -139,7 +141,8 @@
             .mockStatic(Settings.Secure.class)
             .build();
 
-    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(
+            SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT);
 
     private final Object mPackagesLock = new Object();
     private final Context mRealContext = androidx.test.InstrumentationRegistry.getInstrumentation()
@@ -584,10 +587,12 @@
     public void testAutoLockPrivateProfile() {
         mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
                 android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+        int mainUser = mUms.getMainUserId();
+        assumeTrue(mUms.canAddPrivateProfile(mainUser));
         UserManagerService mSpiedUms = spy(mUms);
         UserInfo privateProfileUser =
                 mSpiedUms.createProfileForUserEvenWhenDisallowedWithThrow(PRIVATE_PROFILE_NAME,
-                        USER_TYPE_PROFILE_PRIVATE, 0, 0, null);
+                        USER_TYPE_PROFILE_PRIVATE, 0, mainUser, null);
         Mockito.doNothing().when(mSpiedUms).setQuietModeEnabledAsync(
                 eq(privateProfileUser.getUserHandle().getIdentifier()), eq(true), any(),
                 any());
@@ -604,10 +609,12 @@
         mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
                 android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
         mSetFlagsRule.enableFlags(Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+        int mainUser = mUms.getMainUserId();
+        assumeTrue(mUms.canAddPrivateProfile(mainUser));
         UserManagerService mSpiedUms = spy(mUms);
         UserInfo privateProfileUser =
                 mSpiedUms.createProfileForUserEvenWhenDisallowedWithThrow(PRIVATE_PROFILE_NAME,
-                USER_TYPE_PROFILE_PRIVATE, 0, 0, null);
+                USER_TYPE_PROFILE_PRIVATE, 0, mainUser, null);
         mockAutoLockForPrivateSpace(Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_ON_DEVICE_LOCK);
         Mockito.doNothing().when(mSpiedUms).setQuietModeEnabledAsync(
                 eq(privateProfileUser.getUserHandle().getIdentifier()), eq(true), any(),
@@ -625,6 +632,7 @@
         mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
                 android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
         mSetFlagsRule.enableFlags(Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+        assumeTrue(mUms.canAddPrivateProfile(0));
         UserManagerService mSpiedUms = spy(mUms);
         UserInfo privateProfileUser =
                 mSpiedUms.createProfileForUserEvenWhenDisallowedWithThrow(PRIVATE_PROFILE_NAME,
@@ -644,10 +652,12 @@
         mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
                 android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
         mSetFlagsRule.disableFlags(Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+        int mainUser = mUms.getMainUserId();
+        assumeTrue(mUms.canAddPrivateProfile(mainUser));
         UserManagerService mSpiedUms = spy(mUms);
         UserInfo privateProfileUser =
                 mSpiedUms.createProfileForUserEvenWhenDisallowedWithThrow(PRIVATE_PROFILE_NAME,
-                USER_TYPE_PROFILE_PRIVATE, 0, 0, null);
+                USER_TYPE_PROFILE_PRIVATE, 0, mainUser, null);
 
         mSpiedUms.tryAutoLockingPrivateSpaceOnKeyguardChanged(true);
 
@@ -664,13 +674,15 @@
         mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
                 android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
         mSetFlagsRule.enableFlags(Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+        int mainUser = mUms.getMainUserId();
+        assumeTrue(mUms.canAddPrivateProfile(mainUser));
         UserManagerService mSpiedUms = spy(mUms);
         mockAutoLockForPrivateSpace(Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_AFTER_INACTIVITY);
         when(mPowerManager.isInteractive()).thenReturn(false);
 
         UserInfo privateProfileUser =
                 mSpiedUms.createProfileForUserEvenWhenDisallowedWithThrow(PRIVATE_PROFILE_NAME,
-                        USER_TYPE_PROFILE_PRIVATE, 0, 0, null);
+                        USER_TYPE_PROFILE_PRIVATE, 0, mainUser, null);
         Mockito.doNothing().when(mSpiedUms).scheduleMessageToAutoLockPrivateSpace(
                 eq(privateProfileUser.getUserHandle().getIdentifier()), any(),
                 anyLong());
@@ -702,8 +714,10 @@
         mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
                 android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
         mSetFlagsRule.enableFlags(Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+        int mainUser = mUms.getMainUserId();
+        assumeTrue(mUms.canAddPrivateProfile(mainUser));
         mUms.createProfileForUserEvenWhenDisallowedWithThrow(PRIVATE_PROFILE_NAME,
-                        USER_TYPE_PROFILE_PRIVATE, 0, 0, null);
+                        USER_TYPE_PROFILE_PRIVATE, 0, mainUser, null);
 
         // Set the preference to auto lock on device lock
         mUms.setOrUpdateAutoLockPreferenceForPrivateProfile(
@@ -736,9 +750,10 @@
         Mockito.clearInvocations(mKeyguardManager);
         Mockito.clearInvocations(mSpiedContext);
 
-        // Finally, set the preference to don't auto-lock
+        // Finally, set the preference to auto-lock only after device restart, which is the default
+        // behaviour
         mUms.setOrUpdateAutoLockPreferenceForPrivateProfile(
-                Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_NEVER);
+                Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_AFTER_DEVICE_RESTART);
 
         // Verify that inactivity broadcasts are unregistered and keyguard listener was removed
         Mockito.verify(mSpiedContext).unregisterReceiver(any());
@@ -753,6 +768,7 @@
         mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
                 android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_HIDING_PROFILES);
+        assumeTrue(mUms.canAddPrivateProfile(0));
         UserInfo privateProfileUser =
                 mUms.createProfileForUserEvenWhenDisallowedWithThrow("TestPrivateProfile",
                         USER_TYPE_PROFILE_PRIVATE, 0, 0, null);
@@ -762,23 +778,23 @@
     }
 
     @Test
+    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
     public void testCreatePrivateProfileOnHeadlessSystemUser_shouldAllowCreation() {
-        mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
-        mSetFlagsRule.enableFlags(Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION);
         UserManagerService mSpiedUms = spy(mUms);
+        assumeTrue(mUms.isHeadlessSystemUserMode());
         int mainUser = mSpiedUms.getMainUserId();
-        doReturn(true).when(mSpiedUms).isHeadlessSystemUserMode();
-        assertThat(mSpiedUms.canAddPrivateProfile(mainUser)).isTrue();
+        // Check whether private space creation is blocked on the device
+        assumeTrue(mSpiedUms.canAddPrivateProfile(mainUser));
         assertThat(mSpiedUms.createProfileForUserEvenWhenDisallowedWithThrow(
                 PRIVATE_PROFILE_NAME, USER_TYPE_PROFILE_PRIVATE, 0, mainUser, null)).isNotNull();
     }
 
     @Test
+    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
     public void testCreatePrivateProfileOnSecondaryUser_shouldNotAllowCreation() {
-        mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
-        mSetFlagsRule.enableFlags(Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION);
+        assumeTrue(mUms.canAddMoreUsersOfType(USER_TYPE_FULL_SECONDARY));
         UserInfo user = mUms.createUserWithThrow(generateLongString(), USER_TYPE_FULL_SECONDARY, 0);
         assertThat(mUms.canAddPrivateProfile(user.id)).isFalse();
         assertThrows(ServiceSpecificException.class,
@@ -787,52 +803,48 @@
     }
 
     @Test
+    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
     public void testCreatePrivateProfileOnAutoDevices_shouldNotAllowCreation() {
-        mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
-        mSetFlagsRule.enableFlags(Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION);
         doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_AUTOMOTIVE), anyInt());
         int mainUser = mUms.getMainUserId();
-        assertThat(mUms.canAddPrivateProfile(0)).isFalse();
+        assertThat(mUms.canAddPrivateProfile(mainUser)).isFalse();
         assertThrows(ServiceSpecificException.class,
                 () -> mUms.createProfileForUserWithThrow(PRIVATE_PROFILE_NAME,
                         USER_TYPE_PROFILE_PRIVATE, 0, mainUser, null));
     }
 
     @Test
+    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
     public void testCreatePrivateProfileOnTV_shouldNotAllowCreation() {
-        mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
-        mSetFlagsRule.enableFlags(Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION);
         doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_LEANBACK), anyInt());
         int mainUser = mUms.getMainUserId();
-        assertThat(mUms.canAddPrivateProfile(0)).isFalse();
+        assertThat(mUms.canAddPrivateProfile(mainUser)).isFalse();
         assertThrows(ServiceSpecificException.class,
                 () -> mUms.createProfileForUserEvenWhenDisallowedWithThrow(PRIVATE_PROFILE_NAME,
                         USER_TYPE_PROFILE_PRIVATE, 0, mainUser, null));
     }
 
     @Test
+    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
     public void testCreatePrivateProfileOnEmbedded_shouldNotAllowCreation() {
-        mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
-        mSetFlagsRule.enableFlags(Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION);
         doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_EMBEDDED), anyInt());
         int mainUser = mUms.getMainUserId();
-        assertThat(mUms.canAddPrivateProfile(0)).isFalse();
+        assertThat(mUms.canAddPrivateProfile(mainUser)).isFalse();
         assertThrows(ServiceSpecificException.class,
                 () -> mUms.createProfileForUserEvenWhenDisallowedWithThrow(PRIVATE_PROFILE_NAME,
                         USER_TYPE_PROFILE_PRIVATE, 0, mainUser, null));
     }
 
     @Test
+    @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+            Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
     public void testCreatePrivateProfileOnWatch_shouldNotAllowCreation() {
-        mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
-                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
-        mSetFlagsRule.enableFlags(Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION);
         doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_WATCH), anyInt());
         int mainUser = mUms.getMainUserId();
-        assertThat(mUms.canAddPrivateProfile(0)).isFalse();
+        assertThat(mUms.canAddPrivateProfile(mainUser)).isFalse();
         assertThrows(ServiceSpecificException.class,
                 () -> mUms.createProfileForUserEvenWhenDisallowedWithThrow(PRIVATE_PROFILE_NAME,
                         USER_TYPE_PROFILE_PRIVATE, 0, mainUser, null));
diff --git a/services/tests/mockingservicestests/src/com/android/server/selinux/SelinuxAuditLogsCollectorTest.java b/services/tests/mockingservicestests/src/com/android/server/selinux/SelinuxAuditLogsCollectorTest.java
deleted file mode 100644
index 9758ea5..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/selinux/SelinuxAuditLogsCollectorTest.java
+++ /dev/null
@@ -1,644 +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.selinux;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-
-import android.util.EventLog;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.internal.os.Clock;
-import com.android.internal.util.FrameworkStatsLog;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoSession;
-
-import java.time.Duration;
-import java.time.Instant;
-import java.util.Arrays;
-import java.util.stream.Collectors;
-
-@RunWith(AndroidJUnit4.class)
-public class SelinuxAuditLogsCollectorTest {
-
-    // Fake tag to use for testing
-    private static final int ANSWER_TAG = 42;
-
-    private final MockClock mClock = new MockClock();
-
-    private final SelinuxAuditLogsCollector mSelinuxAutidLogsCollector =
-            // Ignore rate limiting for tests
-            new SelinuxAuditLogsCollector(
-                    new RateLimiter(mClock, /* window= */ Duration.ofMillis(0)),
-                    new QuotaLimiter(
-                            mClock, /* windowSize= */ Duration.ofHours(1), /* maxPermits= */ 5));
-
-    private MockitoSession mMockitoSession;
-
-    @Before
-    public void setUp() {
-        // move the clock forward for the limiters.
-        mClock.currentTimeMillis += Duration.ofHours(1).toMillis();
-        // Ignore what was written in the event logs by previous tests.
-        mSelinuxAutidLogsCollector.mLastWrite = Instant.now();
-
-        mMockitoSession =
-                mockitoSession().initMocks(this).mockStatic(FrameworkStatsLog.class).startMocking();
-    }
-
-    @After
-    public void tearDown() {
-        mMockitoSession.finishMocking();
-    }
-
-    @Test
-    public void testWriteSdkSandboxAuditLogs() {
-        writeTestLog("granted", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm1", "sdk_sandbox_audit", "ttype1", "tclass1");
-
-        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-
-        assertThat(done).isTrue();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                true,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                null,
-                                "ttype",
-                                null,
-                                "tclass",
-                                null,
-                                false));
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm1"},
-                                "sdk_sandbox_audit",
-                                null,
-                                "ttype1",
-                                null,
-                                "tclass1",
-                                null,
-                                false));
-    }
-
-    @Test
-    public void testWriteSdkSandboxAuditLogs_multiplePerms() {
-        writeTestLog("denied", "perm1 perm2", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm3 perm4", "sdk_sandbox_audit", "ttype", "tclass");
-
-        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-
-        assertThat(done).isTrue();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm1", "perm2"},
-                                "sdk_sandbox_audit",
-                                null,
-                                "ttype",
-                                null,
-                                "tclass",
-                                null,
-                                false));
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm3", "perm4"},
-                                "sdk_sandbox_audit",
-                                null,
-                                "ttype",
-                                null,
-                                "tclass",
-                                null,
-                                false));
-    }
-
-    @Test
-    public void testWriteSdkSandboxAuditLogs_withPaths() {
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", "/good/path");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", "/very/long/path");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", "/short_path");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", "not_a_path");
-
-        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-
-        assertThat(done).isTrue();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                null,
-                                "ttype",
-                                null,
-                                "tclass",
-                                "/good/path",
-                                false));
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                null,
-                                "ttype",
-                                null,
-                                "tclass",
-                                "/very/long",
-                                false));
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                null,
-                                "ttype",
-                                null,
-                                "tclass",
-                                "/short_path",
-                                false));
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                null,
-                                "ttype",
-                                null,
-                                "tclass",
-                                null,
-                                false));
-    }
-
-    @Test
-    public void testWriteSdkSandboxAuditLogs_withCategories() {
-        writeTestLog(
-                "denied", "perm", "sdk_sandbox_audit", new int[] {123}, "ttype", null, "tclass");
-        writeTestLog(
-                "denied",
-                "perm",
-                "sdk_sandbox_audit",
-                new int[] {123, 456},
-                "ttype",
-                null,
-                "tclass");
-        writeTestLog(
-                "denied", "perm", "sdk_sandbox_audit", null, "ttype", new int[] {666}, "tclass");
-        writeTestLog(
-                "denied",
-                "perm",
-                "sdk_sandbox_audit",
-                new int[] {123, 456},
-                "ttype",
-                new int[] {666, 777},
-                "tclass");
-
-        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-
-        assertThat(done).isTrue();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                new int[] {123},
-                                "ttype",
-                                null,
-                                "tclass",
-                                null,
-                                false));
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                new int[] {123, 456},
-                                "ttype",
-                                null,
-                                "tclass",
-                                null,
-                                false));
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                null,
-                                "ttype",
-                                new int[] {666},
-                                "tclass",
-                                null,
-                                false));
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                new int[] {123, 456},
-                                "ttype",
-                                new int[] {666, 777},
-                                "tclass",
-                                null,
-                                false));
-    }
-
-    @Test
-    public void testWriteSdkSandboxAuditLogs_withPathAndCategories() {
-        writeTestLog(
-                "denied",
-                "perm",
-                "sdk_sandbox_audit",
-                new int[] {123},
-                "ttype",
-                new int[] {666},
-                "tclass",
-                "/a/path");
-
-        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-
-        assertThat(done).isTrue();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                new int[] {123},
-                                "ttype",
-                                new int[] {666},
-                                "tclass",
-                                "/a/path",
-                                false));
-    }
-
-    @Test
-    public void testWriteSdkSandboxAuditLogs_permissive() {
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", true);
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", false);
-
-        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-
-        assertThat(done).isTrue();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                null,
-                                "ttype",
-                                null,
-                                "tclass",
-                                null,
-                                false),
-                times(2));
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
-                                false,
-                                new String[] {"perm"},
-                                "sdk_sandbox_audit",
-                                null,
-                                "ttype",
-                                null,
-                                "tclass",
-                                null,
-                                true));
-    }
-
-    @Test
-    public void testNotWriteAuditLogs_notSdkSandbox() {
-        writeTestLog("denied", "perm", "stype", "ttype", "tclass");
-
-        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-
-        assertThat(done).isTrue();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                anyInt(),
-                                anyBoolean(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyBoolean()),
-                never());
-    }
-
-    @Test
-    public void testWriteSdkSandboxAuditLogs_upToQuota() {
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        // These are not pushed.
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-
-        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-
-        assertThat(done).isTrue();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                anyInt(),
-                                anyBoolean(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyBoolean()),
-                times(5));
-    }
-
-    @Test
-    public void testWriteSdkSandboxAuditLogs_resetQuota() {
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-
-        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-        assertThat(done).isTrue();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                anyInt(),
-                                anyBoolean(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyBoolean()),
-                times(5));
-
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        // move the clock forward to reset the quota limiter.
-        mClock.currentTimeMillis += Duration.ofHours(1).toMillis();
-        done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-        assertThat(done).isTrue();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                anyInt(),
-                                anyBoolean(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyBoolean()),
-                times(10));
-    }
-
-    @Test
-    public void testNotWriteAuditLogs_stopRequested() {
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        // These are not pushed.
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-
-        mSelinuxAutidLogsCollector.mStopRequested.set(true);
-        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-        assertThat(done).isFalse();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                anyInt(),
-                                anyBoolean(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyBoolean()),
-                never());
-
-        mSelinuxAutidLogsCollector.mStopRequested.set(false);
-        done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-        assertThat(done).isTrue();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                anyInt(),
-                                anyBoolean(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyBoolean()),
-                times(5));
-    }
-
-    @Test
-    public void testAuditLogs_resumeJobDoesNotExceedLimit() {
-        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
-        mSelinuxAutidLogsCollector.mStopRequested.set(true);
-
-        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
-
-        assertThat(done).isFalse();
-        verify(
-                () ->
-                        FrameworkStatsLog.write(
-                                anyInt(),
-                                anyBoolean(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyString(),
-                                any(),
-                                anyBoolean()),
-                never());
-    }
-
-    private static void writeTestLog(
-            String granted, String permissions, String sType, String tType, String tClass) {
-        EventLog.writeEvent(
-                ANSWER_TAG,
-                String.format(
-                        "avc: %s { %s } scontext=u:r:%s:s0 tcontext=u:object_r:%s:s0 tclass=%s",
-                        granted, permissions, sType, tType, tClass));
-    }
-
-    private static void writeTestLog(
-            String granted,
-            String permissions,
-            String sType,
-            String tType,
-            String tClass,
-            String path) {
-        EventLog.writeEvent(
-                ANSWER_TAG,
-                String.format(
-                        "avc: %s { %s } path=\"%s\" scontext=u:r:%s:s0 tcontext=u:object_r:%s:s0"
-                                + " tclass=%s",
-                        granted, permissions, path, sType, tType, tClass));
-    }
-
-    private static void writeTestLog(
-            String granted,
-            String permissions,
-            String sType,
-            int[] sCategories,
-            String tType,
-            int[] tCategories,
-            String tClass) {
-        EventLog.writeEvent(
-                ANSWER_TAG,
-                String.format(
-                        "avc: %s { %s } scontext=u:r:%s:s0%s tcontext=u:object_r:%s:s0%s tclass=%s",
-                        granted,
-                        permissions,
-                        sType,
-                        toCategoriesString(sCategories),
-                        tType,
-                        toCategoriesString(tCategories),
-                        tClass));
-    }
-
-    private static void writeTestLog(
-            String granted,
-            String permissions,
-            String sType,
-            int[] sCategories,
-            String tType,
-            int[] tCategories,
-            String tClass,
-            String path) {
-        EventLog.writeEvent(
-                ANSWER_TAG,
-                String.format(
-                        "avc: %s { %s } path=\"%s\" scontext=u:r:%s:s0%s"
-                                + " tcontext=u:object_r:%s:s0%s tclass=%s",
-                        granted,
-                        permissions,
-                        path,
-                        sType,
-                        toCategoriesString(sCategories),
-                        tType,
-                        toCategoriesString(tCategories),
-                        tClass));
-    }
-
-    private static void writeTestLog(
-            String granted,
-            String permissions,
-            String sType,
-            String tType,
-            String tClass,
-            boolean permissive) {
-        EventLog.writeEvent(
-                ANSWER_TAG,
-                String.format(
-                        "avc: %s { %s } scontext=u:r:%s:s0 tcontext=u:object_r:%s:s0 tclass=%s"
-                                + " permissive=%s",
-                        granted, permissions, sType, tType, tClass, permissive ? "1" : "0"));
-    }
-
-    private static String toCategoriesString(int[] categories) {
-        return (categories == null || categories.length == 0)
-                ? ""
-                : ":c"
-                        + Arrays.stream(categories)
-                                .mapToObj(String::valueOf)
-                                .collect(Collectors.joining(",c"));
-    }
-
-    private static final class MockClock extends Clock {
-
-        public long currentTimeMillis = 0;
-
-        @Override
-        public long currentTimeMillis() {
-            return currentTimeMillis;
-        }
-    }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/AgentTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/AgentTest.java
deleted file mode 100644
index a3917765..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/AgentTest.java
+++ /dev/null
@@ -1,230 +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.server.tare;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.server.tare.TareTestUtils.assertLedgersEqual;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.mock;
-
-import android.app.AlarmManager;
-import android.content.Context;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.server.LocalServices;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-
-/** Tests various aspects of the Agent. */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class AgentTest {
-    private MockitoSession mMockingSession;
-    @Mock
-    private CompleteEconomicPolicy mEconomicPolicy;
-    @Mock
-    private Analyst mAnalyst;
-    @Mock
-    private Context mContext;
-    @Mock
-    private InternalResourceService mIrs;
-
-    private Agent mAgent;
-    private Scribe mScribe;
-
-    private static class MockScribe extends Scribe {
-        MockScribe(InternalResourceService irs, Analyst analyst) {
-            super(irs, analyst);
-        }
-
-        @Override
-        void postWrite() {
-            // Do nothing
-        }
-    }
-
-    @Before
-    public void setUp() {
-        mMockingSession = mockitoSession()
-                .initMocks(this)
-                .strictness(Strictness.LENIENT)
-                .mockStatic(LocalServices.class)
-                .startMocking();
-        doReturn(mContext).when(mIrs).getContext();
-        doReturn(mEconomicPolicy).when(mIrs).getCompleteEconomicPolicyLocked();
-        doReturn(mIrs).when(mIrs).getLock();
-        doReturn(mock(AlarmManager.class)).when(mContext).getSystemService(Context.ALARM_SERVICE);
-        mScribe = new MockScribe(mIrs, mAnalyst);
-        mAgent = new Agent(mIrs, mScribe, mAnalyst);
-    }
-
-    @After
-    public void tearDown() {
-        mAgent.tearDownLocked();
-
-        if (mMockingSession != null) {
-            mMockingSession.finishMocking();
-        }
-    }
-
-    @Test
-    public void testAppRemoval() {
-        final long consumptionLimit = 1_000_000L;
-        final long remainingCakes = consumptionLimit / 2;
-        mScribe.setConsumptionLimitLocked(consumptionLimit);
-        mScribe.adjustRemainingConsumableCakesLocked(remainingCakes - consumptionLimit);
-        assertEquals(remainingCakes, mScribe.getRemainingConsumableCakesLocked());
-
-        final int userId = 0;
-        final String pkgName = "com.test";
-        final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-
-        doReturn(consumptionLimit).when(mIrs).getConsumptionLimitLocked();
-        doReturn(consumptionLimit).when(mEconomicPolicy)
-                .getMaxSatiatedBalance(anyInt(), anyString());
-
-        Ledger.Transaction transaction = new Ledger.Transaction(0, 0, 0, null, 5, 10);
-        mAgent.recordTransactionLocked(userId, pkgName, ledger, transaction, false);
-        assertEquals(5, ledger.getCurrentBalance());
-        assertEquals(remainingCakes - 10, mScribe.getRemainingConsumableCakesLocked());
-
-        mAgent.onPackageRemovedLocked(userId, pkgName);
-        assertEquals(remainingCakes - 10, mScribe.getRemainingConsumableCakesLocked());
-        assertLedgersEqual(new Ledger(), mScribe.getLedgerLocked(userId, pkgName));
-    }
-
-    @Test
-    public void testRecordTransaction_UnderMax() {
-        Ledger ledger = new Ledger();
-
-        doReturn(1_000_000L).when(mIrs).getConsumptionLimitLocked();
-        doReturn(1_000_000L).when(mEconomicPolicy).getMaxSatiatedBalance(anyInt(), anyString());
-
-        Ledger.Transaction transaction = new Ledger.Transaction(0, 0, 0, null, 5, 0);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(5, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, 995, 0);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(1000, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, -500, 250);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(500, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, 999_500L, 500);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(1_000_000L, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, -1_000_001L, 1000);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(-1, ledger.getCurrentBalance());
-    }
-
-    @Test
-    public void testRecordTransaction_MaxConsumptionLimit() {
-        Ledger ledger = new Ledger();
-
-        doReturn(1000L).when(mIrs).getConsumptionLimitLocked();
-        doReturn(1_000_000L).when(mEconomicPolicy).getMaxSatiatedBalance(anyInt(), anyString());
-
-        Ledger.Transaction transaction = new Ledger.Transaction(0, 0, 0, null, 5, 0);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(5, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, 995, 0);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(1000, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, -500, 250);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(500, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, 2000, 0);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(2500, ledger.getCurrentBalance());
-
-        // ConsumptionLimit can change as the battery level changes. Ledger balances shouldn't be
-        // affected.
-        doReturn(900L).when(mIrs).getConsumptionLimitLocked();
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, 100, 0);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(2600, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, -50, 50);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(2550, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, -200, 100);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(2350, ledger.getCurrentBalance());
-
-        doReturn(800L).when(mIrs).getConsumptionLimitLocked();
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, 100, 0);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(2450, ledger.getCurrentBalance());
-    }
-
-    @Test
-    public void testRecordTransaction_MaxSatiatedBalance() {
-        Ledger ledger = new Ledger();
-
-        doReturn(1_000_000L).when(mIrs).getConsumptionLimitLocked();
-        doReturn(1000L).when(mEconomicPolicy).getMaxSatiatedBalance(anyInt(), anyString());
-
-        Ledger.Transaction transaction = new Ledger.Transaction(0, 0, 0, null, 5, 0);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(5, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, 995, 0);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(1000, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, -500, 250);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(500, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, 999_500L, 1000);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(1_000, ledger.getCurrentBalance());
-
-        // Shouldn't change in normal operation, but adding test case in case it does.
-        doReturn(900L).when(mEconomicPolicy).getMaxSatiatedBalance(anyInt(), anyString());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, 500, 0);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(1_000, ledger.getCurrentBalance());
-
-        transaction = new Ledger.Transaction(0, 0, 0, null, -1001, 500);
-        mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
-        assertEquals(-1, ledger.getCurrentBalance());
-    }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/AgentTrendCalculatorTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/AgentTrendCalculatorTest.java
deleted file mode 100644
index 799a7fe..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/AgentTrendCalculatorTest.java
+++ /dev/null
@@ -1,453 +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.server.tare;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.util.ArraySet;
-import android.util.SparseLongArray;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.server.tare.Agent.ActionAffordabilityNote;
-import com.android.server.tare.Agent.OngoingEvent;
-import com.android.server.tare.Agent.TrendCalculator;
-import com.android.server.tare.EconomyManagerInternal.ActionBill;
-import com.android.server.tare.EconomyManagerInternal.AffordabilityChangeListener;
-import com.android.server.tare.EconomyManagerInternal.AnticipatedAction;
-
-import libcore.util.EmptyArray;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.List;
-
-/** Tests the TrendCalculator in the Agent. */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class AgentTrendCalculatorTest {
-
-    private MockEconomicPolicy mEconomicPolicy;
-
-    private static class MockEconomicPolicy extends EconomicPolicy {
-        private final SparseLongArray mEventCosts = new SparseLongArray();
-
-        MockEconomicPolicy(InternalResourceService irs) {
-            super(irs);
-        }
-
-        @Override
-        long getMinSatiatedBalance(int userId, String pkgName) {
-            return 0;
-        }
-
-        @Override
-        long getMaxSatiatedBalance(int userId, String pkgName) {
-            return 0;
-        }
-
-        @Override
-        long getInitialSatiatedConsumptionLimit() {
-            return 0;
-        }
-
-        @Override
-        long getMinSatiatedConsumptionLimit() {
-            return 0;
-        }
-
-        @Override
-        long getMaxSatiatedConsumptionLimit() {
-            return 0;
-        }
-
-        @Override
-        int[] getCostModifiers() {
-            return EmptyArray.INT;
-        }
-
-        @Override
-        Action getAction(int actionId) {
-            if (mEventCosts.indexOfKey(actionId) < 0) {
-                return null;
-            }
-            return new Action(actionId, 0, mEventCosts.get(actionId));
-        }
-
-        @Override
-        Reward getReward(int rewardId) {
-            if (mEventCosts.indexOfKey(rewardId) < 0) {
-                return null;
-            }
-            return new Reward(rewardId, mEventCosts.get(rewardId), mEventCosts.get(rewardId),
-                    10 * mEventCosts.get(rewardId));
-        }
-    }
-
-    @Before
-    public void setUp() {
-        final InternalResourceService irs = mock(InternalResourceService.class);
-        when(irs.isVip(anyInt(), anyString(), anyLong())).thenReturn(false);
-        mEconomicPolicy = new MockEconomicPolicy(irs);
-    }
-
-    @Test
-    public void testNoOngoingEvents() {
-        TrendCalculator trendCalculator = new TrendCalculator();
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_TIMEOUT, 20);
-
-        trendCalculator.reset(0, 0, null);
-        assertEquals("Expected not to cross lower threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-
-        ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_TIMEOUT, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        for (ActionAffordabilityNote note : affordabilityNotes) {
-            note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
-        }
-
-        trendCalculator.reset(1234, 1234, affordabilityNotes);
-        assertEquals("Expected not to cross lower threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-    }
-
-    @Test
-    public void testNoAffordabilityNotes() {
-        TrendCalculator trendCalculator = new TrendCalculator();
-
-        OngoingEvent[] events = new OngoingEvent[]{
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
-                        1, new EconomicPolicy.Cost(1, 4)),
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, "2",
-                        2, new EconomicPolicy.Cost(3, 6)),
-                new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "3", 3,
-                        new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 0, 3, 3)),
-        };
-
-        trendCalculator.reset(0, 100, null);
-        for (OngoingEvent event : events) {
-            trendCalculator.accept(event);
-        }
-        assertEquals(25_000, trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-
-        ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
-        trendCalculator.reset(1234, 1234, affordabilityNotes);
-        for (OngoingEvent event : events) {
-            trendCalculator.accept(event);
-        }
-        assertEquals(308_000, trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-    }
-
-    @Test
-    public void testNoTrendToThreshold() {
-        TrendCalculator trendCalculator = new TrendCalculator();
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 10);
-
-        ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 0, 1000))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        for (ActionAffordabilityNote note : affordabilityNotes) {
-            note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
-        }
-
-        // Balance is already above threshold and events are all positive delta.
-        // There should be no time to report.
-        trendCalculator.reset(1234, 1234, affordabilityNotes);
-        trendCalculator.accept(
-                new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "1", 1,
-                        new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 1, 1, 1)));
-        trendCalculator.accept(
-                new OngoingEvent(EconomicPolicy.REWARD_OTHER_USER_INTERACTION, "2", 2,
-                        new EconomicPolicy.Reward(EconomicPolicy.REWARD_OTHER_USER_INTERACTION,
-                                3, 3, 3)));
-
-        assertEquals("Expected not to cross lower threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-
-        // Balance is already below threshold and events are all negative delta.
-        // There should be no time to report.
-        trendCalculator.reset(1, 0, affordabilityNotes);
-        trendCalculator.accept(
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
-                        1, new EconomicPolicy.Cost(1, 1)));
-        trendCalculator.accept(
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, "2",
-                        2, new EconomicPolicy.Cost(3, 3)));
-
-        assertEquals("Expected not to cross lower threshold",
-                0,
-                trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-    }
-
-    @Test
-    public void testSimpleTrendToThreshold_Balance() {
-        TrendCalculator trendCalculator = new TrendCalculator();
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 20);
-
-        ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        for (ActionAffordabilityNote note : affordabilityNotes) {
-            note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
-        }
-
-        // Balance is below threshold and events are all positive delta.
-        // Should report the correct time to the upper threshold.
-        trendCalculator.reset(0, 1000, affordabilityNotes);
-        trendCalculator.accept(
-                new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "1", 1,
-                        new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 1, 1, 1)));
-        trendCalculator.accept(
-                new OngoingEvent(EconomicPolicy.REWARD_OTHER_USER_INTERACTION, "2", 2,
-                        new EconomicPolicy.Reward(EconomicPolicy.REWARD_OTHER_USER_INTERACTION,
-                                3, 3, 3)));
-
-        assertEquals("Expected not to cross lower threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals(5_000, trendCalculator.getTimeToCrossUpperThresholdMs());
-
-        // Balance is above the threshold and events are all negative delta.
-        // Should report the correct time to the lower threshold.
-        trendCalculator.reset(40, 100, affordabilityNotes);
-        trendCalculator.accept(
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
-                        1, new EconomicPolicy.Cost(1, 1)));
-        trendCalculator.accept(
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, "2",
-                        2, new EconomicPolicy.Cost(3, 3)));
-
-        assertEquals(5_000, trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-    }
-
-    @Test
-    public void testSelectCorrectThreshold_Balance() {
-        TrendCalculator trendCalculator = new TrendCalculator();
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 20);
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 15);
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START, 10);
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START, 5);
-
-        ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        for (ActionAffordabilityNote note : affordabilityNotes) {
-            note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
-        }
-
-        // Balance is below threshold and events are all positive delta.
-        // Should report the correct time to the correct upper threshold.
-        trendCalculator.reset(0, 10_000, affordabilityNotes);
-        trendCalculator.accept(
-                new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "1", 1,
-                        new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 1, 1, 1)));
-
-        assertEquals("Expected not to cross lower threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals(5_000, trendCalculator.getTimeToCrossUpperThresholdMs());
-
-        // Balance is above the threshold and events are all negative delta.
-        // Should report the correct time to the correct lower threshold.
-        trendCalculator.reset(30, 500, affordabilityNotes);
-        trendCalculator.accept(
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
-                        1, new EconomicPolicy.Cost(1, 1)));
-
-        assertEquals(10_000, trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-    }
-
-    @Test
-    public void testTrendsToBothThresholds_Balance() {
-        TrendCalculator trendCalculator = new TrendCalculator();
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 20);
-        mEconomicPolicy.mEventCosts.put(AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK, 50);
-
-        ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        for (ActionAffordabilityNote note : affordabilityNotes) {
-            note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
-        }
-
-        // Balance is between both thresholds and events are mixed positive/negative delta.
-        // Should report the correct time to each threshold.
-        trendCalculator.reset(35, 10_000, affordabilityNotes);
-        trendCalculator.accept(
-                new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "1", 1,
-                        new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 3, 3, 3)));
-        trendCalculator.accept(
-                new OngoingEvent(EconomicPolicy.REWARD_OTHER_USER_INTERACTION, "2", 2,
-                        new EconomicPolicy.Reward(EconomicPolicy.REWARD_OTHER_USER_INTERACTION, 2,
-                                2, 2)));
-        trendCalculator.accept(
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_RUNNING, "3",
-                        3, new EconomicPolicy.Cost(2, 2)));
-        trendCalculator.accept(
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "4",
-                        4, new EconomicPolicy.Cost(3, 3)));
-
-        assertEquals(3_000, trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals(3_000, trendCalculator.getTimeToCrossUpperThresholdMs());
-    }
-
-    @Test
-    public void testSimpleTrendToThreshold_ConsumptionLimit() {
-        TrendCalculator trendCalculator = new TrendCalculator();
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 20);
-
-        ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        for (ActionAffordabilityNote note : affordabilityNotes) {
-            note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
-        }
-
-        // Events are all negative delta. Consumable credits will run out before app's balance.
-        // Should report the correct time to the lower threshold.
-        trendCalculator.reset(10000, 40, affordabilityNotes);
-        trendCalculator.accept(
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
-                        1, new EconomicPolicy.Cost(1, 10)));
-        trendCalculator.accept(
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, "2",
-                        2, new EconomicPolicy.Cost(3, 40)));
-
-        assertEquals(10_000, trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-    }
-
-    @Test
-    public void testSelectCorrectThreshold() {
-        TrendCalculator trendCalculator = new TrendCalculator();
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 20);
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 15);
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START, 10);
-        mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START, 5);
-
-        ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
-                new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START, 1, 0))),
-                mock(AffordabilityChangeListener.class), mEconomicPolicy));
-        for (ActionAffordabilityNote note : affordabilityNotes) {
-            note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
-        }
-
-        // Balance is above threshold, consumable credits is 0, and events are all positive delta.
-        // There should be no time to the upper threshold since consumable credits is the limiting
-        // factor.
-        trendCalculator.reset(10_000, 0, affordabilityNotes);
-        trendCalculator.accept(
-                new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "1", 1,
-                        new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 1, 1, 1)));
-
-        assertEquals("Expected not to cross lower threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-
-        // Balance is above threshold, consumable credits is low, and events are all negative delta.
-        trendCalculator.reset(10_000, 4, affordabilityNotes);
-        trendCalculator.accept(
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
-                        1, new EconomicPolicy.Cost(1, 10)));
-
-        assertEquals(4000, trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-
-        // Balance is above threshold, consumable credits is 0, and events are all negative delta.
-        // Time to the lower threshold should be 0 since consumable credits is already 0.
-        trendCalculator.reset(10_000, 0, affordabilityNotes);
-        trendCalculator.accept(
-                new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
-                        1, new EconomicPolicy.Cost(1, 10)));
-
-        assertEquals(0, trendCalculator.getTimeToCrossLowerThresholdMs());
-        assertEquals("Expected not to cross upper threshold",
-                TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
-                trendCalculator.getTimeToCrossUpperThresholdMs());
-    }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/AlarmManagerEconomicPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/AlarmManagerEconomicPolicyTest.java
deleted file mode 100644
index 77723d7..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/AlarmManagerEconomicPolicyTest.java
+++ /dev/null
@@ -1,238 +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.server.tare;
-
-import static android.app.tare.EconomyManager.arcToCake;
-import static android.provider.Settings.Global.TARE_ALARM_MANAGER_CONSTANTS;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-
-import android.app.ActivityManager;
-import android.app.IActivityManager;
-import android.app.tare.EconomyManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.os.BatteryManager;
-import android.os.Looper;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.provider.DeviceConfig;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
-import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-import org.mockito.stubbing.Answer;
-
-@RunWith(AndroidJUnit4.class)
-public class AlarmManagerEconomicPolicyTest {
-    private AlarmManagerEconomicPolicy mEconomicPolicy;
-    private DeviceConfig.Properties.Builder mDeviceConfigPropertiesBuilder;
-    private EconomicPolicy.Injector mInjector = new InjectorForTest();
-
-    private MockitoSession mMockingSession;
-    @Mock
-    private Context mContext;
-    @Mock
-    private InternalResourceService mIrs;
-
-    private static class InjectorForTest extends EconomicPolicy.Injector {
-        public String settingsConstant;
-
-        @Nullable
-        @Override
-        String getSettingsGlobalString(@NonNull ContentResolver resolver, @NonNull String name) {
-            return TARE_ALARM_MANAGER_CONSTANTS.equals(name) ? settingsConstant : null;
-        }
-    }
-
-    @Before
-    public void setUp() {
-        mMockingSession = mockitoSession()
-            .initMocks(this)
-            .strictness(Strictness.LENIENT)
-            .spyStatic(DeviceConfig.class)
-            .startMocking();
-
-        when(mIrs.getContext()).thenReturn(mContext);
-        when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
-        when(mContext.getContentResolver()).thenReturn(mock(ContentResolver.class));
-        // Called by Modifiers.
-        when(mContext.getSystemService(BatteryManager.class))
-            .thenReturn(mock(BatteryManager.class));
-        when(mContext.getSystemService(PowerManager.class))
-            .thenReturn(mock(PowerManager.class));
-        IActivityManager activityManager = ActivityManager.getService();
-        spyOn(activityManager);
-        try {
-            doNothing().when(activityManager).registerUidObserver(any(), anyInt(), anyInt(), any());
-        } catch (RemoteException e) {
-            fail("registerUidObserver threw exception: " + e.getMessage());
-        }
-
-        mDeviceConfigPropertiesBuilder =
-                new DeviceConfig.Properties.Builder(DeviceConfig.NAMESPACE_TARE);
-        doAnswer(
-                (Answer<DeviceConfig.Properties>) invocationOnMock
-                        -> mDeviceConfigPropertiesBuilder.build())
-                .when(() -> DeviceConfig.getProperties(
-                        eq(DeviceConfig.NAMESPACE_TARE), ArgumentMatchers.<String>any()));
-
-        // Initialize real objects.
-        // Capture the listeners.
-        mEconomicPolicy = new AlarmManagerEconomicPolicy(mIrs, mInjector);
-    }
-
-    @After
-    public void tearDown() {
-        if (mMockingSession != null) {
-            mMockingSession.finishMocking();
-        }
-    }
-
-    private void setDeviceConfigCakes(String key, long valCakes) {
-        mDeviceConfigPropertiesBuilder.setString(key, valCakes + "c");
-        mEconomicPolicy.setup(mDeviceConfigPropertiesBuilder.build());
-    }
-
-    @Test
-    public void testDefaults() {
-        assertEquals(EconomyManager.DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(EconomyManager.DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(EconomyManager.DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-
-        final String pkgRestricted = "com.pkg.restricted";
-        when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
-        assertEquals(0, mEconomicPolicy.getMinSatiatedBalance(0, pkgRestricted));
-        assertEquals(0, mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-
-        final String pkgExempted = "com.pkg.exempted";
-        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
-        assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
-                mEconomicPolicy.getMaxSatiatedBalance(0, pkgExempted));
-
-        final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
-        when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
-        assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
-        assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
-                mEconomicPolicy.getMaxSatiatedBalance(0, pkgHeadlessSystemApp));
-
-        assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-        assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
-                mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-    }
-
-    @Test
-    public void testConstantsUpdating_ValidValues() {
-        setDeviceConfigCakes(EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT, arcToCake(5));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_CONSUMPTION_LIMIT, arcToCake(3));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT, arcToCake(25));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(10));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(9));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
-                arcToCake(8));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(7));
-
-        assertEquals(arcToCake(5), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(arcToCake(3), mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(arcToCake(25), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        final String pkgRestricted = "com.pkg.restricted";
-        when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
-        assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-        assertEquals(arcToCake(10), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-        final String pkgExempted = "com.pkg.exempted";
-        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
-        assertEquals(arcToCake(9), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
-        when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
-        assertEquals(arcToCake(8), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
-        assertEquals(arcToCake(7), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-    }
-
-    @Test
-    public void testConstantsUpdating_InvalidValues() {
-        // Test negatives.
-        setDeviceConfigCakes(EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT, arcToCake(-5));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_CONSUMPTION_LIMIT, arcToCake(-5));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT, arcToCake(-5));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(-1));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(-2));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
-                arcToCake(-3));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(-3));
-
-        assertEquals(arcToCake(1), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(arcToCake(1), mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(arcToCake(1), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        final String pkgRestricted = "com.pkg.restricted";
-        when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
-        assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-        assertEquals(arcToCake(1), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-        final String pkgExempted = "com.pkg.exempted";
-        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
-        assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
-        when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
-        assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
-        assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-
-        // Test min+max reversed.
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_CONSUMPTION_LIMIT, arcToCake(5));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT, arcToCake(4));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT, arcToCake(3));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(10));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(11));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
-                arcToCake(12));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(13));
-
-        assertEquals(arcToCake(5), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(arcToCake(5), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-        assertEquals(arcToCake(13), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-        assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
-        assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-    }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/CompleteEconomicPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/CompleteEconomicPolicyTest.java
deleted file mode 100644
index c5fdb6f..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/CompleteEconomicPolicyTest.java
+++ /dev/null
@@ -1,266 +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.server.tare;
-
-import static android.app.tare.EconomyManager.arcToCake;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-
-import static org.junit.Assert.assertEquals;
-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.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-
-import android.app.ActivityManager;
-import android.app.IActivityManager;
-import android.app.tare.EconomyManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.os.BatteryManager;
-import android.os.Looper;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.provider.DeviceConfig;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
-import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-import org.mockito.stubbing.Answer;
-
-@RunWith(AndroidJUnit4.class)
-public class CompleteEconomicPolicyTest {
-    private CompleteEconomicPolicy mEconomicPolicy;
-    private DeviceConfig.Properties.Builder mDeviceConfigPropertiesBuilder;
-    private final CompleteEconomicPolicy.CompleteInjector mInjector = new InjectorForTest();
-
-    private MockitoSession mMockingSession;
-    @Mock
-    private Context mContext;
-    @Mock
-    private InternalResourceService mIrs;
-
-    private static class InjectorForTest extends CompleteEconomicPolicy.CompleteInjector {
-        public String settingsConstant;
-
-        @Nullable
-        @Override
-        String getSettingsGlobalString(@NonNull ContentResolver resolver, @NonNull String name) {
-            return settingsConstant;
-        }
-
-        @Override
-        boolean isPolicyEnabled(int policy, @Nullable DeviceConfig.Properties properties) {
-            // Use a limited set of policies so that the test doesn't need to be updated whenever
-            // a policy is added or removed.
-            if (policy == EconomicPolicy.POLICY_ALARM || policy == EconomicPolicy.POLICY_JOB) {
-                return super.isPolicyEnabled(policy, properties);
-            }
-            return false;
-        }
-    }
-
-    @Before
-    public void setUp() {
-        mMockingSession = mockitoSession()
-                .initMocks(this)
-                .strictness(Strictness.LENIENT)
-                .spyStatic(DeviceConfig.class)
-                .startMocking();
-
-        when(mIrs.getContext()).thenReturn(mContext);
-        when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
-        when(mContext.getContentResolver()).thenReturn(mock(ContentResolver.class));
-        // Called by Modifiers.
-        when(mContext.getSystemService(BatteryManager.class))
-            .thenReturn(mock(BatteryManager.class));
-        when(mContext.getSystemService(PowerManager.class))
-            .thenReturn(mock(PowerManager.class));
-        IActivityManager activityManager = ActivityManager.getService();
-        spyOn(activityManager);
-        try {
-            doNothing().when(activityManager).registerUidObserver(any(), anyInt(), anyInt(), any());
-        } catch (RemoteException e) {
-            fail("registerUidObserver threw exception: " + e.getMessage());
-        }
-
-        mDeviceConfigPropertiesBuilder =
-                new DeviceConfig.Properties.Builder(DeviceConfig.NAMESPACE_TARE);
-        doAnswer(
-                (Answer<DeviceConfig.Properties>) invocationOnMock
-                        -> mDeviceConfigPropertiesBuilder.build())
-                .when(() -> DeviceConfig.getProperties(
-                        eq(DeviceConfig.NAMESPACE_TARE), ArgumentMatchers.<String>any()));
-        mDeviceConfigPropertiesBuilder
-                .setBoolean(EconomyManager.KEY_ENABLE_POLICY_ALARM, true)
-                .setBoolean(EconomyManager.KEY_ENABLE_POLICY_JOB_SCHEDULER, true);
-
-        // Initialize real objects.
-        // Capture the listeners.
-        mEconomicPolicy = new CompleteEconomicPolicy(mIrs, mInjector);
-        mEconomicPolicy.setup(mDeviceConfigPropertiesBuilder.build());
-    }
-
-    @After
-    public void tearDown() {
-        if (mMockingSession != null) {
-            mMockingSession.finishMocking();
-        }
-    }
-
-    private void setDeviceConfigBoolean(String key, boolean val) {
-        mDeviceConfigPropertiesBuilder.setBoolean(key, val);
-        mEconomicPolicy.setup(mDeviceConfigPropertiesBuilder.build());
-    }
-
-    private void setDeviceConfigCakes(String key, long valCakes) {
-        mDeviceConfigPropertiesBuilder.setString(key, valCakes + "c");
-        mEconomicPolicy.setup(mDeviceConfigPropertiesBuilder.build());
-    }
-
-    @Test
-    public void testDefaults() {
-        assertEquals(EconomyManager.DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES
-                + EconomyManager.DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(EconomyManager.DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES
-                + EconomyManager.DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(EconomyManager.DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES
-                + EconomyManager.DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        final String pkgRestricted = "com.pkg.restricted";
-        when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
-        assertEquals(0, mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-        assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES
-                + EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
-                mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-        final String pkgExempted = "com.pkg.exempted";
-        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
-        assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES
-                + EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES
-                + EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-    }
-
-    @Test
-    public void testConstantsUpdated() {
-        setDeviceConfigCakes(EconomyManager.KEY_JS_INITIAL_CONSUMPTION_LIMIT, arcToCake(4));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT, arcToCake(6));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_CONSUMPTION_LIMIT, arcToCake(2));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_CONSUMPTION_LIMIT, arcToCake(3));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_CONSUMPTION_LIMIT, arcToCake(24));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT, arcToCake(26));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_SATIATED_BALANCE, arcToCake(9));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(11));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(8));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(5));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
-                arcToCake(6));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
-                arcToCake(4));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(3));
-        setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(2));
-
-        assertEquals(arcToCake(10), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(arcToCake(50), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        final String pkgRestricted = "com.pkg.restricted";
-        when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
-        assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-        assertEquals(arcToCake(20), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-        final String pkgExempted = "com.pkg.exempted";
-        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
-        assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
-        when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
-        assertEquals(arcToCake(10), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
-        assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-    }
-
-
-    @Test
-    public void testPolicyToggling() {
-        setDeviceConfigBoolean(EconomyManager.KEY_ENABLE_POLICY_ALARM, true);
-        setDeviceConfigBoolean(EconomyManager.KEY_ENABLE_POLICY_JOB_SCHEDULER, false);
-        assertEquals(EconomyManager.DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(EconomyManager.DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(EconomyManager.DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        final String pkgRestricted = "com.pkg.restricted";
-        when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
-        assertEquals(0, mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-        assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
-                mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-        final String pkgExempted = "com.pkg.exempted";
-        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
-        assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-        assertNotNull(mEconomicPolicy.getAction(AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK));
-        assertNull(mEconomicPolicy.getAction(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START));
-        assertEquals(EconomicPolicy.POLICY_ALARM, mEconomicPolicy.getEnabledPolicyIds());
-        assertTrue(mEconomicPolicy.isPolicyEnabled(EconomicPolicy.POLICY_ALARM));
-        assertFalse(mEconomicPolicy.isPolicyEnabled(EconomicPolicy.POLICY_JOB));
-
-        setDeviceConfigBoolean(EconomyManager.KEY_ENABLE_POLICY_ALARM, false);
-        setDeviceConfigBoolean(EconomyManager.KEY_ENABLE_POLICY_JOB_SCHEDULER, true);
-        assertEquals(EconomyManager.DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(EconomyManager.DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(EconomyManager.DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
-        assertEquals(0, mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-        assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
-                mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
-        assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-        assertNull(mEconomicPolicy.getAction(AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK));
-        assertNotNull(mEconomicPolicy.getAction(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START));
-        assertEquals(EconomicPolicy.POLICY_JOB, mEconomicPolicy.getEnabledPolicyIds());
-        assertFalse(mEconomicPolicy.isPolicyEnabled(EconomicPolicy.POLICY_ALARM));
-        assertTrue(mEconomicPolicy.isPolicyEnabled(EconomicPolicy.POLICY_JOB));
-    }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/EconomicPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/EconomicPolicyTest.java
deleted file mode 100644
index 29bddfc..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/EconomicPolicyTest.java
+++ /dev/null
@@ -1,36 +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.server.tare;
-
-import static org.junit.Assert.assertEquals;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class EconomicPolicyTest {
-
-    @Test
-    public void testMasksDisjoint() {
-        assertEquals(-1,
-                (-1 & EconomicPolicy.MASK_TYPE)
-                        + (-1 & EconomicPolicy.MASK_POLICY)
-                        + (-1 & EconomicPolicy.MASK_EVENT));
-    }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/JobSchedulerEconomicPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/JobSchedulerEconomicPolicyTest.java
deleted file mode 100644
index d41c93ba2..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/JobSchedulerEconomicPolicyTest.java
+++ /dev/null
@@ -1,265 +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.server.tare;
-
-import static android.app.tare.EconomyManager.arcToCake;
-import static android.provider.Settings.Global.TARE_JOB_SCHEDULER_CONSTANTS;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-
-import android.app.ActivityManager;
-import android.app.IActivityManager;
-import android.app.tare.EconomyManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.os.BatteryManager;
-import android.os.Looper;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.provider.DeviceConfig;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
-import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-import org.mockito.stubbing.Answer;
-
-@RunWith(AndroidJUnit4.class)
-public class JobSchedulerEconomicPolicyTest {
-    private JobSchedulerEconomicPolicy mEconomicPolicy;
-    private DeviceConfig.Properties.Builder mDeviceConfigPropertiesBuilder;
-    private final EconomicPolicy.Injector mInjector = new InjectorForTest();
-
-    private MockitoSession mMockingSession;
-    @Mock
-    private Context mContext;
-    @Mock
-    private InternalResourceService mIrs;
-
-    private static class InjectorForTest extends EconomicPolicy.Injector {
-        public String settingsConstant;
-
-        @Nullable
-        @Override
-        String getSettingsGlobalString(@NonNull ContentResolver resolver, @NonNull String name) {
-            return TARE_JOB_SCHEDULER_CONSTANTS.equals(name) ? settingsConstant : null;
-        }
-    }
-
-    @Before
-    public void setUp() {
-        mMockingSession = mockitoSession()
-                .initMocks(this)
-                .strictness(Strictness.LENIENT)
-                .spyStatic(DeviceConfig.class)
-                .startMocking();
-
-        when(mIrs.getContext()).thenReturn(mContext);
-        when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
-        when(mContext.getContentResolver()).thenReturn(mock(ContentResolver.class));
-        // Called by Modifiers.
-        when(mContext.getSystemService(BatteryManager.class))
-            .thenReturn(mock(BatteryManager.class));
-        when(mContext.getSystemService(PowerManager.class))
-            .thenReturn(mock(PowerManager.class));
-        IActivityManager activityManager = ActivityManager.getService();
-        spyOn(activityManager);
-        try {
-            doNothing().when(activityManager).registerUidObserver(any(), anyInt(), anyInt(), any());
-        } catch (RemoteException e) {
-            fail("registerUidObserver threw exception: " + e.getMessage());
-        }
-
-        mDeviceConfigPropertiesBuilder =
-                new DeviceConfig.Properties.Builder(DeviceConfig.NAMESPACE_TARE);
-        doAnswer(
-                (Answer<DeviceConfig.Properties>) invocationOnMock
-                        -> mDeviceConfigPropertiesBuilder.build())
-                .when(() -> DeviceConfig.getProperties(
-                        eq(DeviceConfig.NAMESPACE_TARE), ArgumentMatchers.<String>any()));
-
-        // Initialize real objects.
-        // Capture the listeners.
-        mEconomicPolicy = new JobSchedulerEconomicPolicy(mIrs, mInjector);
-    }
-
-    @After
-    public void tearDown() {
-        if (mMockingSession != null) {
-            mMockingSession.finishMocking();
-        }
-    }
-
-    private void setDeviceConfigCakes(String key, long valCakes) {
-        mDeviceConfigPropertiesBuilder.setString(key, valCakes + "c");
-        mEconomicPolicy.setup(mDeviceConfigPropertiesBuilder.build());
-    }
-
-    @Test
-    public void testDefaults() {
-        assertEquals(EconomyManager.DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(EconomyManager.DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(EconomyManager.DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES,
-                mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-
-        final String pkgRestricted = "com.pkg.restricted";
-        when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
-        assertEquals(0, mEconomicPolicy.getMinSatiatedBalance(0, pkgRestricted));
-        assertEquals(0, mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-
-        final String pkgExempted = "com.pkg.exempted";
-        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
-        assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
-                mEconomicPolicy.getMaxSatiatedBalance(0, pkgExempted));
-
-        final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
-        when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
-        assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
-        assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
-                mEconomicPolicy.getMaxSatiatedBalance(0, pkgHeadlessSystemApp));
-
-        final String pkgUpdater = "com.pkg.updater";
-        when(mIrs.getAppUpdateResponsibilityCount(anyInt(), eq(pkgUpdater))).thenReturn(5);
-        assertEquals(5 * EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES
-                        + EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, pkgUpdater));
-        assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
-                mEconomicPolicy.getMaxSatiatedBalance(0, pkgUpdater));
-        // Make sure it doesn't suggest a min balance greater than max.
-        final int updateCount = (int) (EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES
-                / EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES);
-        when(mIrs.getAppUpdateResponsibilityCount(anyInt(), eq(pkgUpdater)))
-                .thenReturn(updateCount);
-        assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, pkgUpdater));
-
-        assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
-                mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-        assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
-                mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-    }
-
-    @Test
-    public void testConstantsUpdating_ValidValues() {
-        setDeviceConfigCakes(EconomyManager.KEY_JS_INITIAL_CONSUMPTION_LIMIT, arcToCake(5));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_CONSUMPTION_LIMIT, arcToCake(2));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_CONSUMPTION_LIMIT, arcToCake(25));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_SATIATED_BALANCE, arcToCake(10));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(6));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
-                arcToCake(5));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(4));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER,
-                arcToCake(1));
-
-        assertEquals(arcToCake(5), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(arcToCake(2), mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(arcToCake(25), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        final String pkgRestricted = "com.pkg.restricted";
-        when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
-        assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-        assertEquals(arcToCake(10), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-        final String pkgExempted = "com.pkg.exempted";
-        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
-        assertEquals(arcToCake(6), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
-        when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
-        assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
-        assertEquals(arcToCake(4), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-        final String pkgUpdater = "com.pkg.updater";
-        when(mIrs.getAppUpdateResponsibilityCount(anyInt(), eq(pkgUpdater))).thenReturn(3);
-        assertEquals(arcToCake(4) + 3 * arcToCake(1),
-                mEconomicPolicy.getMinSatiatedBalance(0, pkgUpdater));
-    }
-
-    @Test
-    public void testConstantsUpdating_InvalidValues() {
-        // Test negatives.
-        setDeviceConfigCakes(EconomyManager.KEY_JS_INITIAL_CONSUMPTION_LIMIT, arcToCake(-5));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_CONSUMPTION_LIMIT, arcToCake(-5));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_CONSUMPTION_LIMIT, arcToCake(-5));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_SATIATED_BALANCE, arcToCake(-1));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(-2));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
-                arcToCake(-3));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(-3));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER,
-                arcToCake(-4));
-
-        assertEquals(arcToCake(1), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(arcToCake(1), mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(arcToCake(1), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        final String pkgRestricted = "com.pkg.restricted";
-        when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
-        assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-        assertEquals(arcToCake(1), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-        final String pkgExempted = "com.pkg.exempted";
-        when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
-        assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
-        when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
-        assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
-        assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-        final String pkgUpdater = "com.pkg.updater";
-        when(mIrs.getAppUpdateResponsibilityCount(anyInt(), eq(pkgUpdater))).thenReturn(5);
-        assertEquals(arcToCake(0) + 5 * arcToCake(0),
-                mEconomicPolicy.getMinSatiatedBalance(0, pkgUpdater));
-
-        // Test min+max reversed.
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_CONSUMPTION_LIMIT, arcToCake(5));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_INITIAL_CONSUMPTION_LIMIT, arcToCake(4));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_CONSUMPTION_LIMIT, arcToCake(3));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_SATIATED_BALANCE, arcToCake(10));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(11));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
-                arcToCake(12));
-        setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(13));
-
-        assertEquals(arcToCake(5), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
-        assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedConsumptionLimit());
-        assertEquals(arcToCake(5), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-        assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-        assertEquals(arcToCake(13), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
-        assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
-        assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
-        assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-    }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/OWNERS b/services/tests/mockingservicestests/src/com/android/server/tare/OWNERS
deleted file mode 100644
index 217a5ed..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-include /apex/jobscheduler/service/java/com/android/server/tare/OWNERS
\ No newline at end of file
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java
deleted file mode 100644
index e81b63c..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java
+++ /dev/null
@@ -1,409 +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.server.tare;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.inOrder;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.server.tare.TareTestUtils.assertLedgersEqual;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Mockito.when;
-
-import android.app.tare.EconomyManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.os.UserHandle;
-import android.util.Log;
-import android.util.SparseArrayMap;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.server.LocalServices;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.InOrder;
-import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Tests for various Scribe behavior, including reading and writing correctly from file.
- *
- * atest FrameworksServicesTests:ScribeTest
- */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class ScribeTest {
-    private static final String TAG = "ScribeTest";
-
-    private static final int TEST_USER_ID = 27;
-    private static final String TEST_PACKAGE = "com.android.test";
-
-    private MockitoSession mMockingSession;
-    private Scribe mScribeUnderTest;
-    private File mTestFileDir;
-    private final SparseArrayMap<String, InstalledPackageInfo> mInstalledPackages =
-            new SparseArrayMap<>();
-    private final List<Analyst.Report> mReports = new ArrayList<>();
-
-    @Mock
-    private Analyst mAnalyst;
-    @Mock
-    private InternalResourceService mIrs;
-
-    private Context getContext() {
-        return InstrumentationRegistry.getContext();
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        mMockingSession = mockitoSession()
-                .initMocks(this)
-                .strictness(Strictness.LENIENT)
-                .mockStatic(LocalServices.class)
-                .startMocking();
-        when(mIrs.getLock()).thenReturn(new Object());
-        when(mIrs.getEnabledMode()).thenReturn(EconomyManager.ENABLED_MODE_ON);
-        when(mIrs.getInstalledPackages()).thenReturn(mInstalledPackages);
-        when(mAnalyst.getReports()).thenReturn(mReports);
-        mTestFileDir = new File(getContext().getFilesDir(), "scribe_test");
-        //noinspection ResultOfMethodCallIgnored
-        mTestFileDir.mkdirs();
-        Log.d(TAG, "Saving data to '" + mTestFileDir + "'");
-        mScribeUnderTest = new Scribe(mIrs, mAnalyst, mTestFileDir);
-
-        addInstalledPackage(TEST_USER_ID, TEST_PACKAGE);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        mScribeUnderTest.tearDownLocked();
-        if (mTestFileDir.exists() && !mTestFileDir.delete()) {
-            Log.w(TAG, "Failed to delete test file directory");
-        }
-        if (mMockingSession != null) {
-            mMockingSession.finishMocking();
-        }
-    }
-
-    @Test
-    public void testWritingAnalystReportsToDisk() {
-        ArgumentCaptor<List<Analyst.Report>> reportCaptor =
-                ArgumentCaptor.forClass(List.class);
-
-        InOrder inOrder = inOrder(mAnalyst);
-
-        // Empty set
-        mReports.clear();
-        mScribeUnderTest.writeImmediatelyForTesting();
-        mScribeUnderTest.loadFromDiskLocked();
-        inOrder.verify(mAnalyst).loadReports(reportCaptor.capture());
-        List<Analyst.Report> result = reportCaptor.getValue();
-        assertReportListsEqual(mReports, result);
-
-        Analyst.Report report1 = new Analyst.Report();
-        report1.cumulativeBatteryDischarge = 1;
-        report1.currentBatteryLevel = 2;
-        report1.cumulativeProfit = 3;
-        report1.numProfitableActions = 4;
-        report1.cumulativeLoss = 5;
-        report1.numUnprofitableActions = 6;
-        report1.cumulativeRewards = 7;
-        report1.numRewards = 8;
-        report1.cumulativePositiveRegulations = 9;
-        report1.numPositiveRegulations = 10;
-        report1.cumulativeNegativeRegulations = 11;
-        report1.numNegativeRegulations = 12;
-        report1.screenOffDurationMs = 13;
-        report1.screenOffDischargeMah = 14;
-        mReports.add(report1);
-        mScribeUnderTest.writeImmediatelyForTesting();
-        mScribeUnderTest.loadFromDiskLocked();
-        inOrder.verify(mAnalyst).loadReports(reportCaptor.capture());
-        result = reportCaptor.getValue();
-        assertReportListsEqual(mReports, result);
-
-        Analyst.Report report2 = new Analyst.Report();
-        report2.cumulativeBatteryDischarge = 10;
-        report2.currentBatteryLevel = 20;
-        report2.cumulativeProfit = 30;
-        report2.numProfitableActions = 40;
-        report2.cumulativeLoss = 50;
-        report2.numUnprofitableActions = 60;
-        report2.cumulativeRewards = 70;
-        report2.numRewards = 80;
-        report2.cumulativePositiveRegulations = 90;
-        report2.numPositiveRegulations = 100;
-        report2.cumulativeNegativeRegulations = 110;
-        report2.numNegativeRegulations = 120;
-        report2.screenOffDurationMs = 130;
-        report2.screenOffDischargeMah = 140;
-        mReports.add(report2);
-        mScribeUnderTest.writeImmediatelyForTesting();
-        mScribeUnderTest.loadFromDiskLocked();
-        inOrder.verify(mAnalyst).loadReports(reportCaptor.capture());
-        result = reportCaptor.getValue();
-        assertReportListsEqual(mReports, result);
-    }
-
-    @Test
-    public void testWriteHighLevelStateToDisk() {
-        long lastReclamationTime = System.currentTimeMillis();
-        long remainingConsumableCakes = 2000L;
-        long consumptionLimit = 500_000L;
-        when(mIrs.getConsumptionLimitLocked()).thenReturn(consumptionLimit);
-
-        Ledger ledger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE);
-        ledger.recordTransaction(
-                new Ledger.Transaction(0, 1000L, EconomicPolicy.TYPE_REWARD | 1, null, 2000, 0));
-        // Negative ledger balance shouldn't affect the total circulation value.
-        ledger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID + 1, TEST_PACKAGE);
-        ledger.recordTransaction(
-                new Ledger.Transaction(0, 1000L,
-                        EconomicPolicy.TYPE_ACTION | 1, null, -5000, 3000));
-        mScribeUnderTest.setLastReclamationTimeLocked(lastReclamationTime);
-        mScribeUnderTest.setConsumptionLimitLocked(consumptionLimit);
-        mScribeUnderTest.adjustRemainingConsumableCakesLocked(
-                remainingConsumableCakes - consumptionLimit);
-
-        assertEquals(lastReclamationTime, mScribeUnderTest.getLastReclamationTimeLocked());
-        assertEquals(remainingConsumableCakes,
-                mScribeUnderTest.getRemainingConsumableCakesLocked());
-        assertEquals(consumptionLimit, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
-
-        mScribeUnderTest.writeImmediatelyForTesting();
-        mScribeUnderTest.loadFromDiskLocked();
-
-        assertEquals(lastReclamationTime, mScribeUnderTest.getLastReclamationTimeLocked());
-        assertEquals(remainingConsumableCakes,
-                mScribeUnderTest.getRemainingConsumableCakesLocked());
-        assertEquals(consumptionLimit, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
-    }
-
-    @Test
-    public void testWritingEmptyLedgerToDisk() {
-        final Ledger ogLedger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE);
-        mScribeUnderTest.writeImmediatelyForTesting();
-
-        mScribeUnderTest.loadFromDiskLocked();
-        assertLedgersEqual(ogLedger, mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE));
-    }
-
-    @Test
-    public void testWritingPopulatedLedgerToDisk() {
-        final Ledger ogLedger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE);
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REWARD | 1, null, 51, 0));
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(1500, 2000,
-                        EconomicPolicy.TYPE_REWARD | 2, "green", 52, -1));
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(2500, 3000, EconomicPolicy.TYPE_REWARD | 3, "blue", 3, 12));
-        mScribeUnderTest.writeImmediatelyForTesting();
-
-        mScribeUnderTest.loadFromDiskLocked();
-        assertLedgersEqual(ogLedger, mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE));
-    }
-
-    @Test
-    public void testWritingMultipleLedgersToDisk() {
-        final SparseArrayMap<String, Ledger> ledgers = new SparseArrayMap<>();
-        final int numUsers = 3;
-        final int numLedgers = 5;
-        for (int u = 0; u < numUsers; ++u) {
-            final int userId = TEST_USER_ID + u;
-            for (int l = 0; l < numLedgers; ++l) {
-                final String pkgName = TEST_PACKAGE + l;
-                addInstalledPackage(userId, pkgName);
-                final Ledger ledger = mScribeUnderTest.getLedgerLocked(userId, pkgName);
-                ledger.recordTransaction(new Ledger.Transaction(
-                        0, 1000L * u + l, EconomicPolicy.TYPE_ACTION | 1, null, -51L * u + l, 50));
-                ledger.recordTransaction(new Ledger.Transaction(
-                        1500L * u + l, 2000L * u + l,
-                        EconomicPolicy.TYPE_REWARD | 2 * u + l, "green" + u + l, 52L * u + l, 0));
-                ledger.recordTransaction(new Ledger.Transaction(
-                        2500L * u + l, 3000L * u + l,
-                        EconomicPolicy.TYPE_REWARD | 3 * u + l, "blue" + u + l, 3L * u + l, 0));
-                ledgers.add(userId, pkgName, ledger);
-            }
-        }
-        mScribeUnderTest.writeImmediatelyForTesting();
-
-        mScribeUnderTest.loadFromDiskLocked();
-        ledgers.forEach((userId, pkgName, ledger)
-                -> assertLedgersEqual(ledger, mScribeUnderTest.getLedgerLocked(userId, pkgName)));
-    }
-
-    @Test
-    public void testDiscardLedgerFromDisk() {
-        final Ledger ogLedger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE);
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REWARD | 1, null, 51, 1));
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(1500, 2000, EconomicPolicy.TYPE_REWARD | 2, "green", 52, 0));
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(2500, 3000, EconomicPolicy.TYPE_REWARD | 3, "blue", 3, 1));
-        mScribeUnderTest.writeImmediatelyForTesting();
-
-        mScribeUnderTest.loadFromDiskLocked();
-        assertLedgersEqual(ogLedger, mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE));
-
-        mScribeUnderTest.discardLedgerLocked(TEST_USER_ID, TEST_PACKAGE);
-        mScribeUnderTest.writeImmediatelyForTesting();
-
-        // Make sure there's no more saved ledger.
-        mScribeUnderTest.loadFromDiskLocked();
-        assertLedgersEqual(new Ledger(),
-                mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE));
-    }
-
-    @Test
-    public void testLoadingMissingPackageFromDisk() {
-        final String pkgName = TEST_PACKAGE + ".uninstalled";
-        final Ledger ogLedger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID, pkgName);
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REGULATION | 1, null, 51, 1));
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(1500, 2000, EconomicPolicy.TYPE_REWARD | 2, "green", 52, 2));
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(2500, 3000, EconomicPolicy.TYPE_ACTION | 3, "blue", -3, 3));
-        mScribeUnderTest.writeImmediatelyForTesting();
-
-        // Package isn't installed, so make sure it's not saved to memory after loading.
-        mScribeUnderTest.loadFromDiskLocked();
-        assertLedgersEqual(new Ledger(), mScribeUnderTest.getLedgerLocked(TEST_USER_ID, pkgName));
-    }
-
-    @Test
-    public void testLoadingMissingUserFromDisk() {
-        final int userId = TEST_USER_ID + 1;
-        final Ledger ogLedger = mScribeUnderTest.getLedgerLocked(userId, TEST_PACKAGE);
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REWARD | 1, null, 51, 0));
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(1500, 2000, EconomicPolicy.TYPE_REWARD | 2, "green", 52, 1));
-        ogLedger.recordTransaction(
-                new Ledger.Transaction(2500, 3000,
-                        EconomicPolicy.TYPE_REGULATION | 3, "blue", 3, 3));
-        mScribeUnderTest.writeImmediatelyForTesting();
-
-        // User doesn't show up with any packages, so make sure nothing is saved after loading.
-        mScribeUnderTest.loadFromDiskLocked();
-        assertLedgersEqual(new Ledger(), mScribeUnderTest.getLedgerLocked(userId, TEST_PACKAGE));
-    }
-
-    @Test
-    public void testChangingConsumable() {
-        assertEquals(0, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
-        assertEquals(0, mScribeUnderTest.getRemainingConsumableCakesLocked());
-
-        // Limit increased, so remaining value should be adjusted as well
-        mScribeUnderTest.setConsumptionLimitLocked(1000);
-        assertEquals(1000, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
-        assertEquals(1000, mScribeUnderTest.getRemainingConsumableCakesLocked());
-
-        // Limit decreased below remaining, so remaining value should be adjusted as well
-        mScribeUnderTest.setConsumptionLimitLocked(500);
-        assertEquals(500, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
-        assertEquals(500, mScribeUnderTest.getRemainingConsumableCakesLocked());
-
-        mScribeUnderTest.adjustRemainingConsumableCakesLocked(-100);
-        assertEquals(500, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
-        assertEquals(400, mScribeUnderTest.getRemainingConsumableCakesLocked());
-
-        // Limit increased, so remaining value should be adjusted by the difference as well
-        mScribeUnderTest.setConsumptionLimitLocked(1000);
-        assertEquals(1000, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
-        assertEquals(900, mScribeUnderTest.getRemainingConsumableCakesLocked());
-
-
-        // Limit decreased, but above remaining, so remaining value should left alone
-        mScribeUnderTest.setConsumptionLimitLocked(950);
-        assertEquals(950, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
-        assertEquals(900, mScribeUnderTest.getRemainingConsumableCakesLocked());
-    }
-
-    private void assertReportListsEqual(List<Analyst.Report> expected,
-            List<Analyst.Report> actual) {
-        if (expected == null) {
-            assertNull(actual);
-            return;
-        }
-        assertNotNull(actual);
-        assertEquals(expected.size(), actual.size());
-        for (int i = 0; i < expected.size(); ++i) {
-            Analyst.Report eReport = expected.get(i);
-            Analyst.Report aReport = actual.get(i);
-            if (eReport == null) {
-                assertNull(aReport);
-                continue;
-            }
-            assertNotNull(aReport);
-            assertEquals("Reports #" + i + " cumulativeBatteryDischarge are not equal",
-                    eReport.cumulativeBatteryDischarge, aReport.cumulativeBatteryDischarge);
-            assertEquals("Reports #" + i + " currentBatteryLevel are not equal",
-                    eReport.currentBatteryLevel, aReport.currentBatteryLevel);
-            assertEquals("Reports #" + i + " cumulativeProfit are not equal",
-                    eReport.cumulativeProfit, aReport.cumulativeProfit);
-            assertEquals("Reports #" + i + " numProfitableActions are not equal",
-                    eReport.numProfitableActions, aReport.numProfitableActions);
-            assertEquals("Reports #" + i + " cumulativeLoss are not equal",
-                    eReport.cumulativeLoss, aReport.cumulativeLoss);
-            assertEquals("Reports #" + i + " numUnprofitableActions are not equal",
-                    eReport.numUnprofitableActions, aReport.numUnprofitableActions);
-            assertEquals("Reports #" + i + " cumulativeRewards are not equal",
-                    eReport.cumulativeRewards, aReport.cumulativeRewards);
-            assertEquals("Reports #" + i + " numRewards are not equal",
-                    eReport.numRewards, aReport.numRewards);
-            assertEquals("Reports #" + i + " cumulativePositiveRegulations are not equal",
-                    eReport.cumulativePositiveRegulations, aReport.cumulativePositiveRegulations);
-            assertEquals("Reports #" + i + " numPositiveRegulations are not equal",
-                    eReport.numPositiveRegulations, aReport.numPositiveRegulations);
-            assertEquals("Reports #" + i + " cumulativeNegativeRegulations are not equal",
-                    eReport.cumulativeNegativeRegulations, aReport.cumulativeNegativeRegulations);
-            assertEquals("Reports #" + i + " numNegativeRegulations are not equal",
-                    eReport.numNegativeRegulations, aReport.numNegativeRegulations);
-            assertEquals("Reports #" + i + " screenOffDurationMs are not equal",
-                    eReport.screenOffDurationMs, aReport.screenOffDurationMs);
-            assertEquals("Reports #" + i + " screenOffDischargeMah are not equal",
-                    eReport.screenOffDischargeMah, aReport.screenOffDischargeMah);
-        }
-    }
-
-    private void addInstalledPackage(int userId, String pkgName) {
-        PackageInfo pkgInfo = new PackageInfo();
-        pkgInfo.packageName = pkgName;
-        ApplicationInfo applicationInfo = new ApplicationInfo();
-        applicationInfo.uid = UserHandle.getUid(userId, Math.abs(pkgName.hashCode()));
-        pkgInfo.applicationInfo = applicationInfo;
-        mInstalledPackages.add(userId, pkgName, new InstalledPackageInfo(getContext(), userId,
-                pkgInfo));
-    }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/TareTestUtils.java b/services/tests/mockingservicestests/src/com/android/server/tare/TareTestUtils.java
deleted file mode 100644
index 1e4684b..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/TareTestUtils.java
+++ /dev/null
@@ -1,89 +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.server.tare;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import android.util.SparseLongArray;
-
-import java.util.List;
-
-public class TareTestUtils {
-    static void assertLedgersEqual(Ledger expected, Ledger actual) {
-        if (expected == null) {
-            assertNull(actual);
-            return;
-        }
-        assertNotNull(actual);
-        assertEquals(expected.getCurrentBalance(), actual.getCurrentBalance());
-
-        List<Ledger.Transaction> expectedTransactions = expected.getTransactions();
-        List<Ledger.Transaction> actualTransactions = actual.getTransactions();
-        assertEquals(expectedTransactions.size(), actualTransactions.size());
-        for (int i = 0; i < expectedTransactions.size(); ++i) {
-            assertTransactionsEqual(expectedTransactions.get(i), actualTransactions.get(i));
-        }
-
-        List<Ledger.RewardBucket> expectedRewardBuckets = expected.getRewardBuckets();
-        List<Ledger.RewardBucket> actualRewardBuckets = actual.getRewardBuckets();
-        assertEquals(expectedRewardBuckets.size(), actualRewardBuckets.size());
-        for (int i = 0; i < expectedRewardBuckets.size(); ++i) {
-            assertRewardBucketsEqual(expectedRewardBuckets.get(i), actualRewardBuckets.get(i));
-        }
-    }
-
-
-    static void assertSparseLongArraysEqual(SparseLongArray expected, SparseLongArray actual) {
-        if (expected == null) {
-            assertNull(actual);
-            return;
-        }
-        assertNotNull(actual);
-        final int size = expected.size();
-        assertEquals(size, actual.size());
-        for (int i = 0; i < size; ++i) {
-            assertEquals(expected.keyAt(i), actual.keyAt(i));
-            assertEquals(expected.valueAt(i), actual.valueAt(i));
-        }
-    }
-
-    static void assertRewardBucketsEqual(Ledger.RewardBucket expected, Ledger.RewardBucket actual) {
-        if (expected == null) {
-            assertNull(actual);
-            return;
-        }
-        assertNotNull(actual);
-        assertEquals(expected.startTimeMs, actual.startTimeMs);
-        assertSparseLongArraysEqual(expected.cumulativeDelta, actual.cumulativeDelta);
-    }
-
-    static void assertTransactionsEqual(Ledger.Transaction expected, Ledger.Transaction actual) {
-        if (expected == null) {
-            assertNull(actual);
-            return;
-        }
-        assertNotNull(actual);
-        assertEquals(expected.startTimeMs, actual.startTimeMs);
-        assertEquals(expected.endTimeMs, actual.endTimeMs);
-        assertEquals(expected.eventId, actual.eventId);
-        assertEquals(expected.tag, actual.tag);
-        assertEquals(expected.delta, actual.delta);
-        assertEquals(expected.ctp, actual.ctp);
-    }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/trust/TrustManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/trust/TrustManagerServiceTest.java
index b415682..0532e04 100644
--- a/services/tests/mockingservicestests/src/com/android/server/trust/TrustManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/trust/TrustManagerServiceTest.java
@@ -55,6 +55,7 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.IBinder;
+import android.os.Looper;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.UserHandle;
@@ -63,8 +64,7 @@
 import android.platform.test.flag.junit.CheckFlagsRule;
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.provider.Settings;
-import android.security.Authorization;
-import android.security.authorization.IKeystoreAuthorization;
+import android.security.KeyStoreAuthorization;
 import android.service.trust.TrustAgentService;
 import android.testing.TestableContext;
 import android.view.IWindowManager;
@@ -96,7 +96,6 @@
     @Rule
     public final ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this)
             .spyStatic(ActivityManager.class)
-            .spyStatic(Authorization.class)
             .mockStatic(ServiceManager.class)
             .mockStatic(WindowManagerGlobal.class)
             .build();
@@ -126,14 +125,13 @@
     private @Mock DevicePolicyManager mDevicePolicyManager;
     private @Mock FaceManager mFaceManager;
     private @Mock FingerprintManager mFingerprintManager;
-    private @Mock IKeystoreAuthorization mKeystoreAuthorization;
+    private @Mock KeyStoreAuthorization mKeyStoreAuthorization;
     private @Mock LockPatternUtils mLockPatternUtils;
     private @Mock PackageManager mPackageManager;
     private @Mock UserManager mUserManager;
     private @Mock IWindowManager mWindowManager;
 
     private HandlerThread mHandlerThread;
-    private TrustManagerService.Injector mInjector;
     private TrustManagerService mService;
     private ITrustManager mTrustManager;
 
@@ -145,8 +143,6 @@
         when(mFaceManager.getSensorProperties()).thenReturn(List.of());
         when(mFingerprintManager.getSensorProperties()).thenReturn(List.of());
 
-        doReturn(mKeystoreAuthorization).when(() -> Authorization.getService());
-
         when(mLockPatternUtils.getDevicePolicyManager()).thenReturn(mDevicePolicyManager);
         when(mLockPatternUtils.isSecure(TEST_USER_ID)).thenReturn(true);
         when(mLockPatternUtils.getKnownTrustAgents(TEST_USER_ID)).thenReturn(mKnownTrustAgents);
@@ -193,8 +189,7 @@
 
         mHandlerThread = new HandlerThread("handler");
         mHandlerThread.start();
-        mInjector = new TrustManagerService.Injector(mLockPatternUtils, mHandlerThread.getLooper());
-        mService = new TrustManagerService(mMockContext, mInjector);
+        mService = new TrustManagerService(mMockContext, new MockInjector(mMockContext));
 
         // Get the ITrustManager from the new TrustManagerService.
         mService.onStart();
@@ -204,6 +199,27 @@
         mTrustManager = ITrustManager.Stub.asInterface(binderArgumentCaptor.getValue());
     }
 
+    private class MockInjector extends TrustManagerService.Injector {
+        MockInjector(Context context) {
+            super(context);
+        }
+
+        @Override
+        LockPatternUtils getLockPatternUtils() {
+            return mLockPatternUtils;
+        }
+
+        @Override
+        KeyStoreAuthorization getKeyStoreAuthorization() {
+            return mKeyStoreAuthorization;
+        }
+
+        @Override
+        Looper getLooper() {
+            return mHandlerThread.getLooper();
+        }
+    }
+
     @After
     public void tearDown() {
         LocalServices.removeServiceForTest(SystemServiceManager.class);
@@ -371,14 +387,14 @@
 
         when(mWindowManager.isKeyguardLocked()).thenReturn(false);
         mTrustManager.reportKeyguardShowingChanged();
-        verify(mKeystoreAuthorization).onDeviceUnlocked(PARENT_USER_ID, null);
-        verify(mKeystoreAuthorization).onDeviceUnlocked(PROFILE_USER_ID, null);
+        verify(mKeyStoreAuthorization).onDeviceUnlocked(PARENT_USER_ID, null);
+        verify(mKeyStoreAuthorization).onDeviceUnlocked(PROFILE_USER_ID, null);
 
         when(mWindowManager.isKeyguardLocked()).thenReturn(true);
         mTrustManager.reportKeyguardShowingChanged();
-        verify(mKeystoreAuthorization)
+        verify(mKeyStoreAuthorization)
                 .onDeviceLocked(eq(PARENT_USER_ID), eq(PARENT_BIOMETRIC_SIDS), eq(false));
-        verify(mKeystoreAuthorization)
+        verify(mKeyStoreAuthorization)
                 .onDeviceLocked(eq(PROFILE_USER_ID), eq(PARENT_BIOMETRIC_SIDS), eq(false));
     }
 
@@ -392,10 +408,10 @@
         setupMocksForProfile(/* unifiedChallenge= */ false);
 
         mTrustManager.setDeviceLockedForUser(PROFILE_USER_ID, false);
-        verify(mKeystoreAuthorization).onDeviceUnlocked(PROFILE_USER_ID, null);
+        verify(mKeyStoreAuthorization).onDeviceUnlocked(PROFILE_USER_ID, null);
 
         mTrustManager.setDeviceLockedForUser(PROFILE_USER_ID, true);
-        verify(mKeystoreAuthorization)
+        verify(mKeyStoreAuthorization)
                 .onDeviceLocked(eq(PROFILE_USER_ID), eq(PROFILE_BIOMETRIC_SIDS), eq(false));
     }
 
@@ -572,11 +588,11 @@
     private void verifyWeakUnlockValue(boolean expectedWeakUnlockEnabled) throws Exception {
         when(mWindowManager.isKeyguardLocked()).thenReturn(false);
         mTrustManager.reportKeyguardShowingChanged();
-        verify(mKeystoreAuthorization).onDeviceUnlocked(TEST_USER_ID, null);
+        verify(mKeyStoreAuthorization).onDeviceUnlocked(TEST_USER_ID, null);
 
         when(mWindowManager.isKeyguardLocked()).thenReturn(true);
         mTrustManager.reportKeyguardShowingChanged();
-        verify(mKeystoreAuthorization).onDeviceLocked(eq(TEST_USER_ID), any(),
+        verify(mKeyStoreAuthorization).onDeviceLocked(eq(TEST_USER_ID), any(),
                 eq(expectedWeakUnlockEnabled));
     }
 
diff --git a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperCropperTest.java b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperCropperTest.java
index 7ecc7fd..29f3720 100644
--- a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperCropperTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperCropperTest.java
@@ -235,12 +235,11 @@
         int expectedWidth = (int) (displaySize.x * (1 + WallpaperCropper.MAX_PARALLAX));
         Point expectedCropSize = new Point(expectedWidth, 1000);
         for (int mode: ALL_MODES) {
-            assertThat(WallpaperCropper.getAdjustedCrop(
-                    crop, bitmapSize, displaySize, true, false, mode))
-                    .isEqualTo(leftOf(crop, expectedCropSize));
-            assertThat(WallpaperCropper.getAdjustedCrop(
-                    crop, bitmapSize, displaySize, true, true, mode))
-                    .isEqualTo(rightOf(crop, expectedCropSize));
+            for (boolean rtl: List.of(false, true)) {
+                assertThat(WallpaperCropper.getAdjustedCrop(
+                        crop, bitmapSize, displaySize, true, rtl, mode))
+                        .isEqualTo(centerOf(crop, expectedCropSize));
+            }
         }
     }
 
@@ -362,11 +361,13 @@
     }
 
     /**
-     * Test that {@link WallpaperCropper#getCrop} follows a simple centre-align strategy when
-     * no suggested crops are provided.
+     * Test that {@link WallpaperCropper#getCrop} uses the full image when no crops are provided.
+     * If the image has more width/height ratio than the screen, keep that width for parallax up
+     * to {@link WallpaperCropper#MAX_PARALLAX}. If the crop has less width/height ratio, remove the
+     * surplus height, on both sides to keep the wallpaper centered.
      */
     @Test
-    public void testGetCrop_noSuggestedCrops_centersWallpaper() {
+    public void testGetCrop_noSuggestedCrops() {
         setUpWithDisplays(STANDARD_DISPLAY);
         Point bitmapSize = new Point(800, 1000);
         Rect bitmapRect = new Rect(0, 0, bitmapSize.x, bitmapSize.y);
@@ -374,9 +375,11 @@
 
         List<Point> displaySizes = List.of(
                 new Point(500, 1000),
+                new Point(200, 1000),
                 new Point(1000, 500));
         List<Point> expectedCropSizes = List.of(
-                new Point(500, 1000),
+                new Point(Math.min(800, (int) (500 * (1 + WallpaperCropper.MAX_PARALLAX))), 1000),
+                new Point(Math.min(800, (int) (200 * (1 + WallpaperCropper.MAX_PARALLAX))), 1000),
                 new Point(800, 400));
 
         for (int i = 0; i < displaySizes.size(); i++) {
@@ -450,7 +453,8 @@
     /**
      * Test that {@link WallpaperCropper#getCrop}, when asked for a folded crop with a suggested
      * crop only for the relative unfolded orientation, creates the folded crop at the center of the
-     * unfolded crop, by removing content on two sides to match the folded screen dimensions.
+     * unfolded crop, by removing content on two sides to match the folded screen dimensions, and
+     * then adds some width for parallax.
      * <p>
      * To simplify, in this test case all crops have the same size as the display (no zoom)
      * and are at the center of the image.
@@ -468,6 +472,7 @@
             int unfoldedTwo = getRotatedOrientation(unfoldedOne);
             Rect unfoldedCropOne = centerOf(bitmapRect, mDisplaySizes.get(unfoldedOne));
             Rect unfoldedCropTwo = centerOf(bitmapRect, mDisplaySizes.get(unfoldedTwo));
+            List<Rect> unfoldedCrops = List.of(unfoldedCropOne, unfoldedCropTwo);
             SparseArray<Rect> suggestedCrops = new SparseArray<>();
             suggestedCrops.put(unfoldedOne, unfoldedCropOne);
             suggestedCrops.put(unfoldedTwo, unfoldedCropTwo);
@@ -476,15 +481,28 @@
             int foldedTwo = getFoldedOrientation(unfoldedTwo);
             Point foldedDisplayOne = mDisplaySizes.get(foldedOne);
             Point foldedDisplayTwo = mDisplaySizes.get(foldedTwo);
+            List<Point> foldedDisplays = List.of(foldedDisplayOne, foldedDisplayTwo);
 
             for (boolean rtl : List.of(false, true)) {
-                assertThat(mWallpaperCropper.getCrop(
-                        foldedDisplayOne, bitmapSize, suggestedCrops, rtl))
-                        .isEqualTo(centerOf(unfoldedCropOne, foldedDisplayOne));
+                for (int i = 0; i < 2; i++) {
+                    Rect unfoldedCrop = unfoldedCrops.get(i);
+                    Point foldedDisplay = foldedDisplays.get(i);
+                    Rect expectedCrop = centerOf(unfoldedCrop, foldedDisplay);
+                    int maxParallax = (int) (WallpaperCropper.MAX_PARALLAX * unfoldedCrop.width());
 
-                assertThat(mWallpaperCropper.getCrop(
-                        foldedDisplayTwo, bitmapSize, suggestedCrops, rtl))
-                        .isEqualTo(centerOf(unfoldedCropTwo, foldedDisplayTwo));
+                    // the expected behaviour is that we add width for parallax until we reach
+                    // either MAX_PARALLAX or the edge of the crop for the unfolded screen.
+                    if (rtl) {
+                        expectedCrop.left = Math.max(
+                                unfoldedCrop.left, expectedCrop.left - maxParallax);
+                    } else {
+                        expectedCrop.right = Math.min(
+                                unfoldedCrop.right, unfoldedCrop.right + maxParallax);
+                    }
+                    assertThat(mWallpaperCropper.getCrop(
+                            foldedDisplay, bitmapSize, suggestedCrops, rtl))
+                            .isEqualTo(expectedCrop);
+                }
             }
         }
     }
diff --git a/services/tests/powerservicetests/AndroidManifest.xml b/services/tests/powerservicetests/AndroidManifest.xml
index 26d9eec..f7eb4ad 100644
--- a/services/tests/powerservicetests/AndroidManifest.xml
+++ b/services/tests/powerservicetests/AndroidManifest.xml
@@ -24,6 +24,7 @@
     <uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/>
     <uses-permission android:name="android.permission.READ_DREAM_STATE"/>
     <uses-permission android:name="android.permission.READ_DREAM_SUPPRESSION"/>
+    <uses-permission android:name="android.permission.SCREEN_TIMEOUT_OVERRIDE"/>
     <uses-permission android:name="android.permission.STATUS_BAR_SERVICE"/>
     <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS"/>
     <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/>
diff --git a/services/tests/powerservicetests/src/com/android/server/power/PowerGroupTest.java b/services/tests/powerservicetests/src/com/android/server/power/PowerGroupTest.java
index a776eec..94b8d68 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/PowerGroupTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/PowerGroupTest.java
@@ -260,6 +260,7 @@
                 /* useProximitySensor= */ false,
                 /* boostScreenBrightness= */ false,
                 /* dozeScreenStateOverride= */ Display.STATE_ON,
+                /* dozeScreenStateReason= */ Display.STATE_REASON_DEFAULT_POLICY,
                 /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
                 /* overrideDrawWakeLock= */ false,
                 powerSaveState,
@@ -299,6 +300,7 @@
                 /* useProximitySensor= */ true,
                 /* boostScreenBrightness= */ true,
                 /* dozeScreenStateOverride= */ Display.STATE_ON,
+                /* dozeScreenStateReason= */ Display.STATE_REASON_DEFAULT_POLICY,
                 /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
                 /* overrideDrawWakeLock= */ false,
                 powerSaveState,
@@ -337,6 +339,7 @@
                 /* useProximitySensor= */ true,
                 /* boostScreenBrightness= */ true,
                 /* dozeScreenStateOverride= */ Display.STATE_ON,
+                /* dozeScreenStateReason= */ Display.STATE_REASON_DEFAULT_POLICY,
                 /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
                 /* overrideDrawWakeLock= */ false,
                 powerSaveState,
@@ -374,6 +377,7 @@
                 /* useProximitySensor= */ true,
                 /* boostScreenBrightness= */ true,
                 /* dozeScreenStateOverride= */ Display.STATE_ON,
+                /* dozeScreenStateReason= */ Display.STATE_REASON_DEFAULT_POLICY,
                 /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
                 /* overrideDrawWakeLock= */ false,
                 powerSaveState,
@@ -411,6 +415,7 @@
                 /* useProximitySensor= */ true,
                 /* boostScreenBrightness= */ true,
                 /* dozeScreenStateOverride= */ Display.STATE_ON,
+                /* dozeScreenStateReason= */ Display.STATE_REASON_DEFAULT_POLICY,
                 /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
                 /* overrideDrawWakeLock= */ false,
                 powerSaveState,
@@ -449,6 +454,7 @@
                 /* useProximitySensor= */ true,
                 /* boostScreenBrightness= */ true,
                 /* dozeScreenStateOverride= */ Display.STATE_ON,
+                /* dozeScreenStateReason= */ Display.STATE_REASON_DEFAULT_POLICY,
                 /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
                 /* overrideDrawWakeLock= */ false,
                 powerSaveState,
@@ -485,6 +491,7 @@
                 /* useProximitySensor= */ true,
                 /* boostScreenBrightness= */ true,
                 /* dozeScreenStateOverride= */ Display.STATE_ON,
+                /* dozeScreenStateReason= */ Display.STATE_REASON_DEFAULT_POLICY,
                 /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
                 /* overrideDrawWakeLock= */ false,
                 powerSaveState,
@@ -522,6 +529,7 @@
                 /* useProximitySensor= */ true,
                 /* boostScreenBrightness= */ true,
                 /* dozeScreenStateOverride= */ Display.STATE_ON,
+                /* dozeScreenStateReason= */ Display.STATE_REASON_DEFAULT_POLICY,
                 /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
                 /* overrideDrawWakeLock= */ false,
                 powerSaveState,
@@ -558,6 +566,7 @@
                 /* useProximitySensor= */ true,
                 /* boostScreenBrightness= */ true,
                 /* dozeScreenStateOverride= */ Display.STATE_ON,
+                /* dozeScreenStateReason= */ Display.STATE_REASON_DEFAULT_POLICY,
                 /* dozeScreenBrightness= */ BRIGHTNESS_DOZE,
                 /* overrideDrawWakeLock= */ false,
                 powerSaveState,
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 f86ff14..67409a4 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -32,6 +32,7 @@
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
@@ -492,6 +493,12 @@
                 mIsBatterySaverSupported);
     }
 
+    private void setScreenTimeoutOverrideConfig(int screenTimeoutOverrideConfig) {
+        when(mResourcesSpy.getInteger(
+                com.android.internal.R.integer.config_screenTimeoutOverride))
+                .thenReturn(screenTimeoutOverrideConfig);
+    }
+
     @Test
     public void testCreateService_initializesNativeServiceAndSetsPowerModes() {
         PowerManagerService service = createService();
@@ -1293,7 +1300,10 @@
 
         // Override the display state by DreamManager and verify is reacquires the blocker.
         mService.getLocalServiceInstance()
-                .setDozeOverrideFromDreamManager(Display.STATE_ON, PowerManager.BRIGHTNESS_DEFAULT);
+                .setDozeOverrideFromDreamManager(
+                        Display.STATE_ON,
+                        Display.STATE_REASON_DEFAULT_POLICY,
+                        PowerManager.BRIGHTNESS_DEFAULT);
         assertTrue(isAcquired[0]);
     }
 
@@ -2938,6 +2948,299 @@
         assertThat(wakeLock.mDisabled).isFalse();
     }
 
+    @Test
+    public void testScreenTimeoutOverrideWakeLock() {
+        mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+                .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+        setAttentiveTimeout(30000);
+        setScreenTimeoutOverrideConfig(10000);
+
+        createService();
+        startSystem();
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+        // Grab a wakelock
+        final String tag = "wakelock1";
+        final String packageName = "pkg.name";
+        final IBinder token = new Binder();
+        final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+        mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+                null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+                null /* callback */);
+
+        // Early screen off while acquired the wake lock.
+        advanceTime(10000);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+
+        // Should not affect anything after release the wake lock.
+        mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+    }
+
+    @Test
+    public void testScreenTimeoutOverrideWakeLockOnFeatureDisable() {
+        // Feature flag is not enabled
+        mSetFlagsRule.disableFlags(com.android.server.power.feature.flags
+                .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+        setAttentiveTimeout(30000);
+        setScreenTimeoutOverrideConfig(10000);
+
+        createService();
+        startSystem();
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+        // Grab a wakelock
+        final String tag = "wakelock1";
+        final String packageName = "pkg.name";
+        final IBinder token = new Binder();
+        final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+        try {
+            mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+                    null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+                    null /* callback */);
+        } catch (IllegalArgumentException e) {
+            return;
+        }
+
+        fail("Have to throw a IllegalArgumentException when feature is not enabled.");
+    }
+
+    @Test
+    public void testScreenTimeoutOverrideWakeLockAcquiredAfterTimeout() {
+        mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+                .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+        setAttentiveTimeout(30000);
+        setScreenTimeoutOverrideConfig(10000);
+
+        createService();
+        startSystem();
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+        advanceTime(10000);
+
+        // Grab a wakelock
+        final String tag = "wakelock1";
+        final String packageName = "pkg.name";
+        final IBinder token = new Binder();
+        final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+        mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+                null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+                null /* callback */);
+
+        // Early screen off while acquired the wake lock.
+        advanceTime(0);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+
+        // Should not affect anything after release the wake lock.
+        mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+    }
+
+    @Test
+    public void testScreenTimeoutOverrideWakeLockAcquiredAfterSleep() {
+        mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+                .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+        setAttentiveTimeout(30000);
+        setScreenTimeoutOverrideConfig(10000);
+
+        createService();
+        startSystem();
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+        advanceTime(30000);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+
+        // Grab a wakelock
+        final String tag = "wakelock1";
+        final String packageName = "pkg.name";
+        final IBinder token = new Binder();
+        final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+        mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+                null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+                null /* callback */);
+
+        // Keep screen off and the wake lock won't be acquired when screen off.
+        advanceTime(0);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+
+        // Verify if the wake lock is still valid.
+        forceAwake();
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+        advanceTime(10000);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+        // Should not affect anything after release the wake lock.
+        mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+    }
+
+    @Test
+    public void testScreenTimeoutOverrideWakeLockUserActivity() {
+        mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+                .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+        final DisplayInfo info = new DisplayInfo();
+        info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP;
+        when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info);
+
+        setAttentiveTimeout(30000);
+        setScreenTimeoutOverrideConfig(10000);
+
+        createService();
+        startSystem();
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+        // Grab a wakelock
+        final String tag = "wakelock1";
+        final String packageName = "pkg.name";
+        final IBinder token = new Binder();
+        final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+        mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+                null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+                null /* callback */);
+
+        // Still keep awake when not timeout.
+        advanceTime(500);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+        mService.getBinderServiceInstance().userActivity(Display.DEFAULT_DISPLAY, mClock.now(),
+                PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
+
+        // screen timeout override wake lock should be released after user activity.
+        advanceTime(10000);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+        assertThat(mService.findWakeLockLocked(token)).isEqualTo(null);
+
+        // Should not affect anything after release the wake lock.
+        mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+    }
+
+    @Test
+    public void testScreenTimeoutOverrideWakeLockFullWakeLock() {
+        mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+                .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+        setAttentiveTimeout(30000);
+        setScreenTimeoutOverrideConfig(10000);
+
+        createService();
+        startSystem();
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+        // Grab a wakelock
+        final String tag1 = "wakelock1";
+        final String packageName1 = "pkg.name";
+        final IBinder token1 = new Binder();
+        final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+        mService.getBinderServiceInstance().acquireWakeLock(token1, flags, tag1, packageName1,
+                null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+                null /* callback */);
+
+        advanceTime(500);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+        // Grab a full wake lock
+        final String tag2 = "wakelock2";
+        final String packageName2 = "pkg2.name";
+        final IBinder token2 = new Binder();
+        final int flags2 = PowerManager.FULL_WAKE_LOCK;
+        mService.getBinderServiceInstance().acquireWakeLock(token2, flags2, tag2, packageName2,
+                null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+                null /* callback */);
+
+        // wake lock should be released when another full wake lock acquired.
+        advanceTime(10000);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+        assertThat(mService.findWakeLockLocked(token1)).isEqualTo(null);
+
+        // Should not affect anything after release the wake locks.
+        mService.getBinderServiceInstance().releaseWakeLock(token1, 0 /* flags */);
+        mService.getBinderServiceInstance().releaseWakeLock(token2, 0 /* flags */);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+    }
+
+    @Test
+    public void testScreenTimeoutOverrideWakeLockMultiClients() {
+        mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+                .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+        setAttentiveTimeout(30000);
+        setScreenTimeoutOverrideConfig(10000);
+
+        createService();
+        startSystem();
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+        // Grab a wakelock
+        final String tag1 = "wakelock1";
+        final String packageName1 = "pkg.name";
+        final IBinder token1 = new Binder();
+        final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+        mService.getBinderServiceInstance().acquireWakeLock(token1, flags, tag1, packageName1,
+                null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+                null /* callback */);
+
+        // Grab a full wake lock
+        final String tag2 = "wakelock2";
+        final String packageName2 = "pkg2.name";
+        final IBinder token2 = new Binder();
+        final int flags2 = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+        mService.getBinderServiceInstance().acquireWakeLock(token2, flags2, tag2, packageName2,
+                null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+                null /* callback */);
+
+        advanceTime(500);
+        // Release the first lock to ensure the second lock is still valid.
+        mService.getBinderServiceInstance().releaseWakeLock(token1, 0 /* flags */);
+        advanceTime(10000);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+
+        // Should not affect anything after release the wake locks.
+        mService.getBinderServiceInstance().releaseWakeLock(token2, 0 /* flags */);
+        assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+    }
+
+    @Test
+    public void testGetScreenOffTimeoutOverrideApi() {
+        mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+                .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+        final int screenTimeout = 30000;
+        final int screenDimTimeout = 7000;
+        final int screenTimeoutOverride = 10000;
+        setScreenTimeoutOverrideConfig(screenTimeoutOverride);
+
+        createService();
+        startSystem();
+
+        final String tag = "wakelock";
+        final String packageName = "pkg.name";
+        final IBinder token = new Binder();
+        final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+
+        // define cases as {isFaceDown, isTimeoutOverride, expectedTimeout}
+        final int[][] testCases = {{0, 0, screenTimeout}, {0, 1, screenTimeoutOverride},
+                {1, 0, screenDimTimeout}, {1, 1, screenDimTimeout}};
+
+        for (int[] expect : testCases) {
+            mService.mIsFaceDown = expect[0] == 1;
+            final boolean acquireWakeLock = expect[1] == 1;
+            if (acquireWakeLock) {
+                mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+                        null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+                        null /* callback */);
+            }
+            assertThat(mService.getScreenOffTimeoutOverrideLocked(screenTimeout, screenDimTimeout))
+                    .isEqualTo(expect[2]);
+            if (acquireWakeLock) {
+                mService.getBinderServiceInstance().releaseWakeLock(token, 0);
+            }
+        }
+    }
+
     private void setCachedUidProcState(int uid) {
         mService.updateUidProcStateInternal(uid, PROCESS_STATE_TOP_SLEEPING);
     }
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsUserLifecycleTests.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsUserLifecycleTests.java
index 05d8a00..c4561b1 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsUserLifecycleTests.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsUserLifecycleTests.java
@@ -87,7 +87,7 @@
 
         final boolean[] userStopped = new boolean[1];
         CountDownLatch stopUserLatch = new CountDownLatch(1);
-        mIam.stopUser(mTestUserId, true, new IStopUserCallback.Stub() {
+        mIam.stopUserWithCallback(mTestUserId, new IStopUserCallback.Stub() {
             @Override
             public void userStopped(int userId) throws RemoteException {
                 userStopped[0] = true;
diff --git a/services/tests/selinux/Android.bp b/services/tests/selinux/Android.bp
new file mode 100644
index 0000000..f387238
--- /dev/null
+++ b/services/tests/selinux/Android.bp
@@ -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 {
+    default_team: "trendy_team_foundation_security_rust_pkvm_",
+    // 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"],
+}
+
+java_defaults {
+    name: "mockito_extended",
+    static_libs: [
+        "mockito-target-extended-minus-junit4",
+    ],
+    jni_libs: [
+        "libdexmakerjvmtiagent",
+        "libstaticjvmtiagent",
+    ],
+}
+
+android_test {
+    name: "SelinuxFrameworksTests",
+    srcs: [
+        "src/**/*.java",
+    ],
+    defaults: [
+        "mockito_extended",
+    ],
+    libs: [
+        "android.test.base",
+        "android.test.mock",
+        "android.test.runner",
+        "servicestests-core-utils",
+    ],
+    static_libs: [
+        "androidx.test.core",
+        "androidx.test.ext.junit",
+        "androidx.test.ext.truth",
+        "androidx.test.runner",
+        "services.core",
+    ],
+    test_suites: [
+        "device-tests",
+    ],
+}
diff --git a/services/tests/selinux/AndroidManifest.xml b/services/tests/selinux/AndroidManifest.xml
new file mode 100644
index 0000000..9273795
--- /dev/null
+++ b/services/tests/selinux/AndroidManifest.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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+     package="com.android.frameworks.selinuxtests">
+
+     <application android:debuggable="true">
+          <uses-library android:name="android.test.runner" />
+     </application>
+
+     <instrumentation
+          android:name="androidx.test.runner.AndroidJUnitRunner"
+          android:targetPackage="com.android.frameworks.selinuxtests"
+          android:label="Selinux Frameworks Tests" />
+</manifest>
\ No newline at end of file
diff --git a/services/tests/selinux/AndroidTest.xml b/services/tests/selinux/AndroidTest.xml
new file mode 100644
index 0000000..16d8e07
--- /dev/null
+++ b/services/tests/selinux/AndroidTest.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.
+-->
+<configuration description="Runs Selinux Frameworks Tests.">
+    <option name="test-suite-tag" value="apct" />
+    <option name="test-suite-tag" value="apct-instrumentation" />
+
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="install-arg" value="-t" />
+        <option name="test-file-name" value="SelinuxFrameworksTests.apk" />
+    </target_preparer>
+
+    <option name="test-tag" value="SelinuxFrameworksTests" />
+
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="com.android.frameworks.selinuxtests" />
+        <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
+    </test>
+</configuration>
diff --git a/services/tests/mockingservicestests/src/com/android/server/selinux/OWNERS b/services/tests/selinux/OWNERS
similarity index 100%
rename from services/tests/mockingservicestests/src/com/android/server/selinux/OWNERS
rename to services/tests/selinux/OWNERS
diff --git a/services/tests/mockingservicestests/src/com/android/server/selinux/RateLimiterTest.java b/services/tests/selinux/src/com/android/server/selinux/RateLimiterTest.java
similarity index 100%
rename from services/tests/mockingservicestests/src/com/android/server/selinux/RateLimiterTest.java
rename to services/tests/selinux/src/com/android/server/selinux/RateLimiterTest.java
diff --git a/services/tests/mockingservicestests/src/com/android/server/selinux/SelinuxAuditLogsBuilderTest.java b/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsBuilderTest.java
similarity index 100%
rename from services/tests/mockingservicestests/src/com/android/server/selinux/SelinuxAuditLogsBuilderTest.java
rename to services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsBuilderTest.java
diff --git a/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsCollectorTest.java b/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsCollectorTest.java
new file mode 100644
index 0000000..4a70ad3
--- /dev/null
+++ b/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsCollectorTest.java
@@ -0,0 +1,643 @@
+/*
+ * 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.selinux;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+
+import android.util.EventLog;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.internal.os.Clock;
+import com.android.internal.util.FrameworkStatsLog;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoSession;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
+@RunWith(AndroidJUnit4.class)
+public class SelinuxAuditLogsCollectorTest {
+
+    // Fake tag to use for testing
+    private static final int ANSWER_TAG = 42;
+
+    private final MockClock mClock = new MockClock();
+
+    private final SelinuxAuditLogsCollector mSelinuxAutidLogsCollector =
+            // Ignore rate limiting for tests
+            new SelinuxAuditLogsCollector(
+                    new RateLimiter(mClock, /* window= */ Duration.ofMillis(0)),
+                    new QuotaLimiter(
+                            mClock, /* windowSize= */ Duration.ofHours(1), /* maxPermits= */ 5));
+
+    private MockitoSession mMockitoSession;
+
+    @Before
+    public void setUp() {
+        // move the clock forward for the limiters.
+        mClock.currentTimeMillis += Duration.ofHours(1).toMillis();
+        // Ignore what was written in the event logs by previous tests.
+        mSelinuxAutidLogsCollector.mLastWrite = Instant.now();
+
+        mMockitoSession = mockitoSession().mockStatic(FrameworkStatsLog.class).startMocking();
+    }
+
+    @After
+    public void tearDown() {
+        mMockitoSession.finishMocking();
+    }
+
+    @Test
+    public void testWriteSdkSandboxAuditLogs() {
+        writeTestLog("granted", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm1", "sdk_sandbox_audit", "ttype1", "tclass1");
+
+        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+
+        assertThat(done).isTrue();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                true,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                null,
+                                "ttype",
+                                null,
+                                "tclass",
+                                null,
+                                false));
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm1"},
+                                "sdk_sandbox_audit",
+                                null,
+                                "ttype1",
+                                null,
+                                "tclass1",
+                                null,
+                                false));
+    }
+
+    @Test
+    public void testWriteSdkSandboxAuditLogs_multiplePerms() {
+        writeTestLog("denied", "perm1 perm2", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm3 perm4", "sdk_sandbox_audit", "ttype", "tclass");
+
+        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+
+        assertThat(done).isTrue();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm1", "perm2"},
+                                "sdk_sandbox_audit",
+                                null,
+                                "ttype",
+                                null,
+                                "tclass",
+                                null,
+                                false));
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm3", "perm4"},
+                                "sdk_sandbox_audit",
+                                null,
+                                "ttype",
+                                null,
+                                "tclass",
+                                null,
+                                false));
+    }
+
+    @Test
+    public void testWriteSdkSandboxAuditLogs_withPaths() {
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", "/good/path");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", "/very/long/path");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", "/short_path");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", "not_a_path");
+
+        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+
+        assertThat(done).isTrue();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                null,
+                                "ttype",
+                                null,
+                                "tclass",
+                                "/good/path",
+                                false));
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                null,
+                                "ttype",
+                                null,
+                                "tclass",
+                                "/very/long",
+                                false));
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                null,
+                                "ttype",
+                                null,
+                                "tclass",
+                                "/short_path",
+                                false));
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                null,
+                                "ttype",
+                                null,
+                                "tclass",
+                                null,
+                                false));
+    }
+
+    @Test
+    public void testWriteSdkSandboxAuditLogs_withCategories() {
+        writeTestLog(
+                "denied", "perm", "sdk_sandbox_audit", new int[] {123}, "ttype", null, "tclass");
+        writeTestLog(
+                "denied",
+                "perm",
+                "sdk_sandbox_audit",
+                new int[] {123, 456},
+                "ttype",
+                null,
+                "tclass");
+        writeTestLog(
+                "denied", "perm", "sdk_sandbox_audit", null, "ttype", new int[] {666}, "tclass");
+        writeTestLog(
+                "denied",
+                "perm",
+                "sdk_sandbox_audit",
+                new int[] {123, 456},
+                "ttype",
+                new int[] {666, 777},
+                "tclass");
+
+        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+
+        assertThat(done).isTrue();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                new int[] {123},
+                                "ttype",
+                                null,
+                                "tclass",
+                                null,
+                                false));
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                new int[] {123, 456},
+                                "ttype",
+                                null,
+                                "tclass",
+                                null,
+                                false));
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                null,
+                                "ttype",
+                                new int[] {666},
+                                "tclass",
+                                null,
+                                false));
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                new int[] {123, 456},
+                                "ttype",
+                                new int[] {666, 777},
+                                "tclass",
+                                null,
+                                false));
+    }
+
+    @Test
+    public void testWriteSdkSandboxAuditLogs_withPathAndCategories() {
+        writeTestLog(
+                "denied",
+                "perm",
+                "sdk_sandbox_audit",
+                new int[] {123},
+                "ttype",
+                new int[] {666},
+                "tclass",
+                "/a/path");
+
+        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+
+        assertThat(done).isTrue();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                new int[] {123},
+                                "ttype",
+                                new int[] {666},
+                                "tclass",
+                                "/a/path",
+                                false));
+    }
+
+    @Test
+    public void testWriteSdkSandboxAuditLogs_permissive() {
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", true);
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass", false);
+
+        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+
+        assertThat(done).isTrue();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                null,
+                                "ttype",
+                                null,
+                                "tclass",
+                                null,
+                                false),
+                times(2));
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                FrameworkStatsLog.SELINUX_AUDIT_LOG,
+                                false,
+                                new String[] {"perm"},
+                                "sdk_sandbox_audit",
+                                null,
+                                "ttype",
+                                null,
+                                "tclass",
+                                null,
+                                true));
+    }
+
+    @Test
+    public void testNotWriteAuditLogs_notSdkSandbox() {
+        writeTestLog("denied", "perm", "stype", "ttype", "tclass");
+
+        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+
+        assertThat(done).isTrue();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                anyInt(),
+                                anyBoolean(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyBoolean()),
+                never());
+    }
+
+    @Test
+    public void testWriteSdkSandboxAuditLogs_upToQuota() {
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        // These are not pushed.
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+
+        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+
+        assertThat(done).isTrue();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                anyInt(),
+                                anyBoolean(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyBoolean()),
+                times(5));
+    }
+
+    @Test
+    public void testWriteSdkSandboxAuditLogs_resetQuota() {
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+
+        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+        assertThat(done).isTrue();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                anyInt(),
+                                anyBoolean(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyBoolean()),
+                times(5));
+
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        // move the clock forward to reset the quota limiter.
+        mClock.currentTimeMillis += Duration.ofHours(1).toMillis();
+        done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+        assertThat(done).isTrue();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                anyInt(),
+                                anyBoolean(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyBoolean()),
+                times(10));
+    }
+
+    @Test
+    public void testNotWriteAuditLogs_stopRequested() {
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        // These are not pushed.
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+
+        mSelinuxAutidLogsCollector.mStopRequested.set(true);
+        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+        assertThat(done).isFalse();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                anyInt(),
+                                anyBoolean(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyBoolean()),
+                never());
+
+        mSelinuxAutidLogsCollector.mStopRequested.set(false);
+        done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+        assertThat(done).isTrue();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                anyInt(),
+                                anyBoolean(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyBoolean()),
+                times(5));
+    }
+
+    @Test
+    public void testAuditLogs_resumeJobDoesNotExceedLimit() {
+        writeTestLog("denied", "perm", "sdk_sandbox_audit", "ttype", "tclass");
+        mSelinuxAutidLogsCollector.mStopRequested.set(true);
+
+        boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG);
+
+        assertThat(done).isFalse();
+        verify(
+                () ->
+                        FrameworkStatsLog.write(
+                                anyInt(),
+                                anyBoolean(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyString(),
+                                any(),
+                                anyBoolean()),
+                never());
+    }
+
+    private static void writeTestLog(
+            String granted, String permissions, String sType, String tType, String tClass) {
+        EventLog.writeEvent(
+                ANSWER_TAG,
+                String.format(
+                        "avc: %s { %s } scontext=u:r:%s:s0 tcontext=u:object_r:%s:s0 tclass=%s",
+                        granted, permissions, sType, tType, tClass));
+    }
+
+    private static void writeTestLog(
+            String granted,
+            String permissions,
+            String sType,
+            String tType,
+            String tClass,
+            String path) {
+        EventLog.writeEvent(
+                ANSWER_TAG,
+                String.format(
+                        "avc: %s { %s } path=\"%s\" scontext=u:r:%s:s0 tcontext=u:object_r:%s:s0"
+                                + " tclass=%s",
+                        granted, permissions, path, sType, tType, tClass));
+    }
+
+    private static void writeTestLog(
+            String granted,
+            String permissions,
+            String sType,
+            int[] sCategories,
+            String tType,
+            int[] tCategories,
+            String tClass) {
+        EventLog.writeEvent(
+                ANSWER_TAG,
+                String.format(
+                        "avc: %s { %s } scontext=u:r:%s:s0%s tcontext=u:object_r:%s:s0%s tclass=%s",
+                        granted,
+                        permissions,
+                        sType,
+                        toCategoriesString(sCategories),
+                        tType,
+                        toCategoriesString(tCategories),
+                        tClass));
+    }
+
+    private static void writeTestLog(
+            String granted,
+            String permissions,
+            String sType,
+            int[] sCategories,
+            String tType,
+            int[] tCategories,
+            String tClass,
+            String path) {
+        EventLog.writeEvent(
+                ANSWER_TAG,
+                String.format(
+                        "avc: %s { %s } path=\"%s\" scontext=u:r:%s:s0%s"
+                                + " tcontext=u:object_r:%s:s0%s tclass=%s",
+                        granted,
+                        permissions,
+                        path,
+                        sType,
+                        toCategoriesString(sCategories),
+                        tType,
+                        toCategoriesString(tCategories),
+                        tClass));
+    }
+
+    private static void writeTestLog(
+            String granted,
+            String permissions,
+            String sType,
+            String tType,
+            String tClass,
+            boolean permissive) {
+        EventLog.writeEvent(
+                ANSWER_TAG,
+                String.format(
+                        "avc: %s { %s } scontext=u:r:%s:s0 tcontext=u:object_r:%s:s0 tclass=%s"
+                                + " permissive=%s",
+                        granted, permissions, sType, tType, tClass, permissive ? "1" : "0"));
+    }
+
+    private static String toCategoriesString(int[] categories) {
+        return (categories == null || categories.length == 0)
+                ? ""
+                : ":c"
+                        + Arrays.stream(categories)
+                                .mapToObj(String::valueOf)
+                                .collect(Collectors.joining(",c"));
+    }
+
+    private static final class MockClock extends Clock {
+
+        public long currentTimeMillis = 0;
+
+        @Override
+        public long currentTimeMillis() {
+            return currentTimeMillis;
+        }
+    }
+}
diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp
index 65986ea..94a71be 100644
--- a/services/tests/servicestests/Android.bp
+++ b/services/tests/servicestests/Android.bp
@@ -270,3 +270,89 @@
         "done && " +
         "$(location soong_zip) -o $(out) -C $(genDir)/res -D $(genDir)/res",
 }
+
+FLAKY_AND_IGNORED = [
+    "androidx.test.filters.FlakyTest",
+    "org.junit.Ignore",
+]
+// Used by content protection TEST_MAPPING
+test_module_config {
+    name: "FrameworksServicesTests_contentprotection",
+    base: "FrameworksServicesTests",
+    test_suites: ["general-tests"],
+    include_filters: ["com.android.server.contentprotection"],
+    exclude_annotations: FLAKY_AND_IGNORED,
+}
+
+test_module_config {
+    name: "FrameworksServicesTests_om",
+    base: "FrameworksServicesTests",
+    test_suites: ["general-tests"],
+    include_filters: ["com.android.server.om."],
+    exclude_annotations: FLAKY_AND_IGNORED,
+}
+
+// Used by contexthub TEST_MAPPING
+test_module_config {
+    name: "FrameworksServicesTests_contexthub_presubmit",
+    base: "FrameworksServicesTests",
+    test_suites: ["general-tests"],
+    include_filters: ["com.android.server.location.contexthub."],
+    // TODO(ron): are these right, does it run anything?
+    include_annotations: ["android.platform.test.annotations.Presubmit"],
+    exclude_annotations: FLAKY_AND_IGNORED,
+}
+
+test_module_config {
+    name: "FrameworksServicesTests_contexthub_postsubmit",
+    base: "FrameworksServicesTests",
+    test_suites: ["general-tests"],
+    include_filters: ["com.android.server.location.contexthub."],
+    // TODO(ron): are these right, does it run anything?
+    include_annotations: ["android.platform.test.annotations.Postsubmit"],
+    exclude_annotations: FLAKY_AND_IGNORED,
+}
+
+// Used by contentcapture
+test_module_config {
+    name: "FrameworksServicesTests_contentcapture",
+    base: "FrameworksServicesTests",
+    test_suites: ["general-tests"],
+    include_filters: ["com.android.server.contentcapture"],
+    exclude_annotations: FLAKY_AND_IGNORED,
+}
+
+test_module_config {
+    name: "FrameworksServicesTests_recoverysystem",
+    base: "FrameworksServicesTests",
+    test_suites: ["general-tests"],
+    include_filters: ["com.android.server.recoverysystem."],
+    exclude_annotations: ["androidx.test.filters.FlakyTest"],
+}
+
+// server pm TEST_MAPPING
+test_module_config {
+    name: "FrameworksServicesTests_pm_presubmit",
+    base: "FrameworksServicesTests",
+    test_suites: ["general-tests"],
+    include_annotations: ["android.platform.test.annotations.Presubmit"],
+    include_filters: ["com.android.server.pm."],
+    exclude_annotations: FLAKY_AND_IGNORED,
+}
+
+test_module_config {
+    name: "FrameworksServicesTests_pm_postsubmit",
+    base: "FrameworksServicesTests",
+    test_suites: ["general-tests"],
+    include_annotations: ["android.platform.test.annotations.Postsubmit"],
+    include_filters: ["com.android.server.pm."],
+    exclude_annotations: FLAKY_AND_IGNORED,
+}
+
+// server os TEST_MAPPING
+test_module_config {
+    name: "FrameworksServicesTests_os",
+    base: "FrameworksServicesTests",
+    test_suites: ["general-tests"],
+    include_filters: ["com.android.server.os."],
+}
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 9d32ed8..1bf9a9d 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
@@ -25,6 +25,7 @@
 
 import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
+import static com.android.server.accessibility.AccessibilityManagerService.ACTION_LAUNCH_HEARING_DEVICES_DIALOG;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -771,6 +772,7 @@
 
     @SmallTest
     @Test
+    @RequiresFlagsDisabled(com.android.systemui.Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG)
     public void testPerformAccessibilityShortcut_hearingAids_startActivityWithExpectedComponent() {
         final AccessibilityUserState userState = mA11yms.mUserStates.get(
                 mA11yms.getCurrentUserIdLocked());
@@ -786,6 +788,27 @@
                 ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
     }
 
+    @SmallTest
+    @Test
+    @RequiresFlagsEnabled(com.android.systemui.Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG)
+    public void testPerformAccessibilityShortcut_hearingAids_sendExpectedBroadcast() {
+        final AccessibilityUserState userState = mA11yms.mUserStates.get(
+                mA11yms.getCurrentUserIdLocked());
+        mockManageAccessibilityGranted(mTestableContext);
+        userState.mAccessibilityShortcutKeyTargets.add(
+                ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
+
+        mA11yms.performAccessibilityShortcut(
+                ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
+        mTestableLooper.processAllMessages();
+
+        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mTestableContext.getMockContext()).sendBroadcastAsUser(intentCaptor.capture(),
+                eq(UserHandle.SYSTEM));
+        assertThat(intentCaptor.getValue().getAction()).isEqualTo(
+                ACTION_LAUNCH_HEARING_DEVICES_DIALOG);
+    }
+
     @Test
     public void testPackagesForceStopped_disablesRelevantService() {
         final AccessibilityServiceInfo info_a = new AccessibilityServiceInfo();
@@ -1618,6 +1641,11 @@
         }
 
         @Override
+        public void sendBroadcastAsUser(Intent intent, UserHandle user) {
+            mMockContext.sendBroadcastAsUser(intent, user);
+        }
+
+        @Override
         public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
                 IntentFilter filter, String broadcastPermission, Handler scheduler) {
             Iterator<String> actions = filter.actionsIterator();
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerTest.java
index 8717a05..403930d 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerTest.java
@@ -86,11 +86,12 @@
 // LINT.IfChange
 
 /**
- * Tests for the AccessibilityWindowManager with Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y enabled.
+ * Tests for the AccessibilityWindowManager with Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y_V2
+ * enabled.
  * TODO(b/322444245): Merge with AccessibilityWindowManagerWithAccessibilityWindowTest
  *  after completing the flag migration.
  */
-@RequiresFlagsDisabled(Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y)
+@RequiresFlagsDisabled(Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y_V2)
 public class AccessibilityWindowManagerTest {
     private static final String PACKAGE_NAME = "com.android.server.accessibility";
     private static final boolean FORCE_SEND = true;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerWithAccessibilityWindowTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerWithAccessibilityWindowTest.java
index f44879f..9083a1e 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerWithAccessibilityWindowTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityWindowManagerWithAccessibilityWindowTest.java
@@ -89,11 +89,11 @@
 import java.util.List;
 
 /**
- * Tests for the AccessibilityWindowManager with Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y
+ * Tests for the AccessibilityWindowManager with Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y_V2
  * TODO(b/322444245): Merge with AccessibilityWindowManagerTest
  *  after completing the flag migration.
  */
-@RequiresFlagsEnabled(Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y)
+@RequiresFlagsEnabled(Flags.FLAG_COMPUTE_WINDOW_CHANGES_ON_A11Y_V2)
 public class AccessibilityWindowManagerWithAccessibilityWindowTest {
     private static final String PACKAGE_NAME = "com.android.server.accessibility";
     private static final boolean FORCE_SEND = true;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/BrailleDisplayConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/BrailleDisplayConnectionTest.java
index 344e2c2..69a98ac 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/BrailleDisplayConnectionTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/BrailleDisplayConnectionTest.java
@@ -27,6 +27,7 @@
 import static org.mockito.Mockito.when;
 
 import android.accessibilityservice.BrailleDisplayController;
+import android.accessibilityservice.IBrailleDisplayController;
 import android.content.Context;
 import android.os.Bundle;
 import android.os.IBinder;
@@ -174,6 +175,17 @@
         }
 
         @Test
+        public void defaultNativeScanner_getName_returnsName() {
+            String name = "My Braille Display";
+            when(mNativeInterface.getHidrawName(anyInt())).thenReturn(name);
+
+            BrailleDisplayConnection.BrailleDisplayScanner scanner =
+                    BrailleDisplayConnection.getDefaultNativeScanner(mNativeInterface);
+
+            assertThat(scanner.getName(NULL_PATH)).isEqualTo(name);
+        }
+
+        @Test
         public void write_bypassesServiceSideCheckWithLargeBuffer_disconnects() {
             Mockito.doNothing().when(mBrailleDisplayConnection).disconnect();
             mBrailleDisplayConnection.write(
@@ -201,6 +213,38 @@
             verify(mBrailleDisplayConnection).disconnect();
         }
 
+        @Test
+        public void connect_unableToGetUniq_usesNameFallback() throws Exception {
+            try {
+                IBrailleDisplayController controller =
+                        Mockito.mock(IBrailleDisplayController.class);
+                final Path path = Path.of("/dev/null");
+                final String macAddress = "00:11:22:33:AA:BB";
+                final String name = "My Braille Display";
+                final byte[] descriptor = {0x05, 0x41};
+                Bundle bd = new Bundle();
+                bd.putString(BrailleDisplayController.TEST_BRAILLE_DISPLAY_HIDRAW_PATH,
+                        path.toString());
+                bd.putByteArray(BrailleDisplayController.TEST_BRAILLE_DISPLAY_DESCRIPTOR,
+                        descriptor);
+                bd.putString(BrailleDisplayController.TEST_BRAILLE_DISPLAY_NAME, name);
+                bd.putBoolean(BrailleDisplayController.TEST_BRAILLE_DISPLAY_BUS_BLUETOOTH, true);
+                bd.putString(BrailleDisplayController.TEST_BRAILLE_DISPLAY_UNIQUE_ID, null);
+                BrailleDisplayConnection.BrailleDisplayScanner scanner =
+                        mBrailleDisplayConnection.setTestData(List.of(bd));
+                // Validate that the test data is set up correctly before attempting connection:
+                assertThat(scanner.getUniqueId(path)).isNull();
+                assertThat(scanner.getName(path)).isEqualTo(name);
+
+                mBrailleDisplayConnection.connectLocked(
+                        macAddress, name, BrailleDisplayConnection.BUS_BLUETOOTH, controller);
+
+                verify(controller).onConnected(eq(mBrailleDisplayConnection), eq(descriptor));
+            } finally {
+                mBrailleDisplayConnection.disconnect();
+            }
+        }
+
         // BrailleDisplayConnection#setTestData() is used to enable CTS testing with
         // test Braille display data, but its own implementation should also be tested
         // so that issues in this helper don't cause confusing failures in CTS.
@@ -220,6 +264,9 @@
             String uniq1 = "uniq1", uniq2 = "uniq2";
             bd1.putString(BrailleDisplayController.TEST_BRAILLE_DISPLAY_UNIQUE_ID, uniq1);
             bd2.putString(BrailleDisplayController.TEST_BRAILLE_DISPLAY_UNIQUE_ID, uniq2);
+            String name1 = "name1", name2 = "name2";
+            bd1.putString(BrailleDisplayController.TEST_BRAILLE_DISPLAY_NAME, name1);
+            bd2.putString(BrailleDisplayController.TEST_BRAILLE_DISPLAY_NAME, name2);
             int bus1 = BrailleDisplayConnection.BUS_USB, bus2 =
                     BrailleDisplayConnection.BUS_BLUETOOTH;
             bd1.putBoolean(BrailleDisplayController.TEST_BRAILLE_DISPLAY_BUS_BLUETOOTH,
@@ -235,6 +282,8 @@
             expect.that(scanner.getDeviceReportDescriptor(path2)).isEqualTo(desc2);
             expect.that(scanner.getUniqueId(path1)).isEqualTo(uniq1);
             expect.that(scanner.getUniqueId(path2)).isEqualTo(uniq2);
+            expect.that(scanner.getName(path1)).isEqualTo(name1);
+            expect.that(scanner.getName(path2)).isEqualTo(name2);
             expect.that(scanner.getDeviceBusType(path1)).isEqualTo(bus1);
             expect.that(scanner.getDeviceBusType(path2)).isEqualTo(bus2);
         }
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
index 1a51c45..58567ca 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
@@ -1272,7 +1272,7 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(Flags.FLAG_MAGNIFICATION_ALWAYS_DRAW_FULLSCREEN_BORDER)
+    @RequiresFlagsEnabled(Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER)
     public void onFullscreenMagnificationActivationState_systemUiBorderFlagOn_notifyConnection() {
         mMagnificationController.onFullScreenMagnificationActivationState(
                 TEST_DISPLAY, /* activated= */ true);
@@ -1282,7 +1282,7 @@
     }
 
     @Test
-    @RequiresFlagsDisabled(Flags.FLAG_MAGNIFICATION_ALWAYS_DRAW_FULLSCREEN_BORDER)
+    @RequiresFlagsDisabled(Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER)
     public void
             onFullscreenMagnificationActivationState_systemUiBorderFlagOff_neverNotifyConnection() {
         mMagnificationController.onFullScreenMagnificationActivationState(
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 e0a99b0..ab36ba2 100644
--- a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
@@ -26,6 +26,7 @@
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.nullable;
 import static org.mockito.Mockito.times;
@@ -45,6 +46,7 @@
 import android.app.admin.DevicePolicyManager;
 import android.app.admin.DevicePolicyManagerInternal;
 import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -57,6 +59,7 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.Signature;
 import android.content.pm.UserInfo;
+import android.content.res.Resources;
 import android.database.Cursor;
 import android.database.DatabaseErrorHandler;
 import android.database.sqlite.SQLiteDatabase;
@@ -155,6 +158,8 @@
         mPackageInfo.applicationInfo = new ApplicationInfo();
         mPackageInfo.applicationInfo.privateFlags = ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
         when(mMockPackageManager.getPackageInfo(anyString(), anyInt())).thenReturn(mPackageInfo);
+        when(mMockPackageManager.getPackageInfoAsUser(
+                        anyString(), anyInt(), anyInt())).thenReturn(mPackageInfo);
         when(mMockContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mMockAppOpsManager);
         when(mMockContext.getSystemService(Context.USER_SERVICE)).thenReturn(mMockUserManager);
         when(mMockContext.getSystemServiceName(AppOpsManager.class)).thenReturn(
@@ -3156,6 +3161,39 @@
     }
 
     @SmallTest
+    public void testAccountRemovedBroadcastMarkedAccountAsVisibleTwice() throws Exception {
+        unlockSystemUser();
+
+        HashMap<String, Integer> visibility = new HashMap<>();
+        visibility.put("testpackage1", AccountManager.VISIBILITY_USER_MANAGED_VISIBLE);
+
+        addAccountRemovedReceiver("testpackage1");
+        mAms.registerAccountListener(
+                new String [] {AccountManagerServiceTestFixtures.ACCOUNT_TYPE_1},
+                "testpackage1");
+        mAms.addAccountExplicitlyWithVisibility(
+                AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS,
+                /* password= */ "p11",
+                /* extras= */ null,
+                visibility,
+                /* callerPackage= */ null);
+
+        updateBroadcastCounters(2);
+        assertEquals(mVisibleAccountsChangedBroadcasts, 1);
+        assertEquals(mLoginAccountsChangedBroadcasts, 1);
+        assertEquals(mAccountRemovedBroadcasts, 0);
+
+        mAms.setAccountVisibility(AccountManagerServiceTestFixtures.ACCOUNT_SUCCESS,
+                "testpackage1",
+                AccountManager.VISIBILITY_VISIBLE);
+
+        updateBroadcastCounters(3);
+        assertEquals(mVisibleAccountsChangedBroadcasts, 1); // visibility was not changed
+        assertEquals(mLoginAccountsChangedBroadcasts, 2);
+        assertEquals(mAccountRemovedBroadcasts, 0);
+    }
+
+    @SmallTest
     public void testRegisterAccountListenerCredentialsUpdate() throws Exception {
         unlockSystemUser();
         mAms.registerAccountListener(
@@ -3493,6 +3531,12 @@
         }
 
         @Override
+        public boolean bindServiceAsUser(Intent service, ServiceConnection conn,
+                Context.BindServiceFlags flags, UserHandle user) {
+            return mTestContext.bindServiceAsUser(service, conn, flags, user);
+        }
+
+        @Override
         public void unbindService(ServiceConnection conn) {
             mTestContext.unbindService(conn);
         }
@@ -3547,6 +3591,19 @@
         }
 
         @Override
+        public Resources getResources() {
+            Resources mockResources = mock(Resources.class);
+            // config_canRemoveFirstAccount = true
+            when(mockResources.getBoolean(anyInt())).thenReturn(true);
+            return mockResources;
+        }
+
+        @Override
+        public ContentResolver getContentResolver() {
+            return mock(ContentResolver.class);
+        }
+
+        @Override
         public void sendBroadcastAsUser(Intent intent, UserHandle user) {
             sendBroadcastAsUser(intent, user, null, null);
         }
diff --git a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
index 643dcec..7c0dbf4 100644
--- a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
@@ -123,6 +123,7 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -678,6 +679,87 @@
     }
 
     /**
+     * Test that, when exceeding the maximum number of running users, a profile of the current user
+     * is not stopped.
+     */
+    @Test
+    public void testStoppingExcessRunningUsersAfterSwitch_currentProfileNotStopped()
+            throws Exception {
+        mUserController.setInitialConfig(/* userSwitchUiEnabled= */ true,
+                /* maxRunningUsers= */ 5, /* delayUserDataLocking= */ false);
+
+        final int PARENT_ID = 200;
+        final int PROFILE1_ID = 201;
+        final int PROFILE2_ID = 202;
+        final int FG_USER_ID = 300;
+        final int BG_USER_ID = 400;
+
+        setUpUser(PARENT_ID, 0).profileGroupId = PARENT_ID;
+        setUpUser(PROFILE1_ID, UserInfo.FLAG_PROFILE).profileGroupId = PARENT_ID;
+        setUpUser(PROFILE2_ID, UserInfo.FLAG_PROFILE).profileGroupId = PARENT_ID;
+        setUpUser(FG_USER_ID, 0).profileGroupId = FG_USER_ID;
+        setUpUser(BG_USER_ID, 0).profileGroupId = UserInfo.NO_PROFILE_GROUP_ID;
+        mUserController.onSystemReady(); // To set the profileGroupIds in UserController.
+
+        assertEquals(newHashSet(
+                SYSTEM_USER_ID),
+                new HashSet<>(mUserController.getRunningUsersLU()));
+
+        int numberOfUserSwitches = 1;
+        addForegroundUserAndContinueUserSwitch(PARENT_ID, UserHandle.USER_SYSTEM,
+                numberOfUserSwitches, false);
+        mUserController.finishUserSwitch(mUserStates.get(PARENT_ID));
+        waitForHandlerToComplete(mInjector.mHandler, HANDLER_WAIT_TIME_MS);
+        assertTrue(mUserController.canStartMoreUsers());
+        assertEquals(newHashSet(
+                SYSTEM_USER_ID, PARENT_ID),
+                new HashSet<>(mUserController.getRunningUsersLU()));
+
+        assertThat(mUserController.startProfile(PROFILE1_ID, true, null)).isTrue();
+        assertEquals(newHashSet(
+                SYSTEM_USER_ID, PROFILE1_ID, PARENT_ID),
+                new HashSet<>(mUserController.getRunningUsersLU()));
+
+        numberOfUserSwitches++;
+        addForegroundUserAndContinueUserSwitch(FG_USER_ID, PARENT_ID,
+                numberOfUserSwitches, false);
+        mUserController.finishUserSwitch(mUserStates.get(FG_USER_ID));
+        waitForHandlerToComplete(mInjector.mHandler, HANDLER_WAIT_TIME_MS);
+        assertTrue(mUserController.canStartMoreUsers());
+        assertEquals(newHashSet(
+                SYSTEM_USER_ID, PROFILE1_ID, PARENT_ID, FG_USER_ID),
+                new HashSet<>(mUserController.getRunningUsersLU()));
+
+        mUserController.startUser(BG_USER_ID, USER_START_MODE_BACKGROUND);
+        assertEquals(newHashSet(
+                SYSTEM_USER_ID, PROFILE1_ID, PARENT_ID, BG_USER_ID, FG_USER_ID),
+                new HashSet<>(mUserController.getRunningUsersLU()));
+
+        // Now we exceed the maxRunningUsers parameter (of 5):
+        assertThat(mUserController.startProfile(PROFILE2_ID, true, null)).isTrue();
+        // Currently, starting a profile doesn't trigger evaluating whether we've exceeded max, so
+        // we expect no users to be stopped. This policy may change in the future. Log but no fail.
+        if (!newHashSet(SYSTEM_USER_ID, PROFILE1_ID, BG_USER_ID, PROFILE2_ID, PARENT_ID, FG_USER_ID)
+                .equals(new HashSet<>(mUserController.getRunningUsersLU()))) {
+            Log.w(TAG, "Starting a profile that exceeded max running users didn't lead to "
+                    + "expectations: " + mUserController.getRunningUsersLU());
+        }
+
+        numberOfUserSwitches++;
+        addForegroundUserAndContinueUserSwitch(PARENT_ID, FG_USER_ID,
+                numberOfUserSwitches, false);
+        mUserController.finishUserSwitch(mUserStates.get(PARENT_ID));
+        waitForHandlerToComplete(mInjector.mHandler, HANDLER_WAIT_TIME_MS);
+        // We've now done a user switch and should notice that we've exceeded the maximum number of
+        // users. The oldest background user should be stopped (BG_USER); even though PROFILE1 was
+        // older, it should not be stopped since it's a profile of the (new) current user.
+        assertFalse(mUserController.canStartMoreUsers());
+        assertEquals(newHashSet(
+                SYSTEM_USER_ID, PROFILE1_ID, PROFILE2_ID, FG_USER_ID, PARENT_ID),
+                new HashSet<>(mUserController.getRunningUsersLU()));
+    }
+
+    /**
      * Test that, in getRunningUsersLU, parents come after their profile, even if the profile was
      * started afterwards.
      */
@@ -806,7 +888,7 @@
         int userId = -1;
 
         assertThrows(IllegalArgumentException.class,
-                () -> mUserController.stopUser(userId, /* force= */ true,
+                () -> mUserController.stopUser(userId,
                         /* allowDelayedLocking= */ true, /* stopUserCallback= */ null,
                         /* keyEvictedCallback= */ null));
     }
@@ -815,7 +897,7 @@
     public void testStopUser_systemUser() {
         int userId = UserHandle.USER_SYSTEM;
 
-        int r = mUserController.stopUser(userId, /* force= */ true,
+        int r = mUserController.stopUser(userId,
                 /* allowDelayedLocking= */ true, /* stopUserCallback= */ null,
                 /* keyEvictedCallback= */ null);
 
@@ -827,7 +909,7 @@
         setUpUser(TEST_USER_ID1, /* flags= */ 0);
         mUserController.startUser(TEST_USER_ID1, USER_START_MODE_FOREGROUND);
 
-        int r = mUserController.stopUser(TEST_USER_ID1, /* force= */ true,
+        int r = mUserController.stopUser(TEST_USER_ID1,
                 /* allowDelayedLocking= */ true, /* stopUserCallback= */ null,
                 /* keyEvictedCallback= */ null);
 
@@ -1256,7 +1338,7 @@
 
     private void assertUserLockedOrUnlockedAfterStopping(int userId, boolean allowDelayedLocking,
             KeyEvictedCallback keyEvictedCallback, boolean expectLocking) throws Exception {
-        int r = mUserController.stopUser(userId, /* force= */ true, /* allowDelayedLocking= */
+        int r = mUserController.stopUser(userId, /* allowDelayedLocking= */
                 allowDelayedLocking, null, keyEvictedCallback);
         assertThat(r).isEqualTo(ActivityManager.USER_OP_SUCCESS);
         assertUserLockedOrUnlockedState(userId, allowDelayedLocking, expectLocking);
diff --git a/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetXmlUtilTest.kt b/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetXmlUtilTest.kt
new file mode 100644
index 0000000..e2b9944
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetXmlUtilTest.kt
@@ -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.server.appwidget
+
+import android.util.SizeF
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.server.appwidget.AppWidgetXmlUtil.deserializeWidgetSizesStr
+import com.android.server.appwidget.AppWidgetXmlUtil.serializeWidgetSizes
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class AppWidgetXmlUtilTest {
+
+    private val sizes = ArrayList<SizeF>()
+    private val sizeStr = "1.0x2.1,-9.91x6291.134,0.0x0.0"
+
+    @Before
+    fun setup() {
+        sizes.add(SizeF(1.0f, 2.1f))
+        sizes.add(SizeF(-9.91f, 6291.134f))
+        sizes.add(SizeF(0f, 0f))
+    }
+
+    @Test
+    fun serializeWidgetSizes() {
+        val serializedSizeStr = serializeWidgetSizes(sizes)
+
+        assertThat(serializedSizeStr).isEqualTo(sizeStr)
+    }
+
+    @Test
+    fun deserializeWidgetSizesStr() {
+        val deserializedSizes = deserializeWidgetSizesStr(sizeStr)
+
+        assertThat(deserializedSizes).isEqualTo(sizes)
+    }
+
+    @Test
+    fun deserializeInvalidWidgetSizesStr1() {
+        assertThat(deserializeWidgetSizesStr("abc,def")).isEqualTo(null)
+    }
+
+    @Test
+    fun deserializeInvalidWidgetSizesStr2() {
+        assertThat(deserializeWidgetSizesStr("+30x9,90")).isEqualTo(null)
+    }
+
+    @Test
+    fun deserializeNullWidgetSizesStr1() {
+        assertThat(deserializeWidgetSizesStr(null)).isEqualTo(null)
+    }
+
+    @Test
+    fun deserializeEmptyWidgetSizesStr1() {
+        assertThat(deserializeWidgetSizesStr("")).isEqualTo(null)
+    }
+
+    @Test
+    fun deserializeEmptyWidgetSizesStr2() {
+        assertThat(deserializeWidgetSizesStr(",")).isEqualTo(ArrayList<SizeF>())
+    }
+
+    @Test
+    fun deserializeEmptyWidgetSizesStr3() {
+        assertThat(deserializeWidgetSizesStr(",,,")).isEqualTo(ArrayList<SizeF>())
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java
index f1c1dc3..59f4d56b 100644
--- a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java
+++ b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java
@@ -24,6 +24,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.any;
@@ -315,7 +316,7 @@
                                 mFakeBtDevice.getAddress()));
                 verify(mMockAudioService,
                         timeout(MAX_MESSAGE_HANDLING_DELAY_MS).times(0)).onUpdatedAdiDeviceState(
-                        eq(devState));
+                        eq(devState), anyBoolean());
             }
 
             // metadata set
@@ -326,7 +327,7 @@
                                 mFakeBtDevice.getAddress()));
                 verify(mMockAudioService,
                         timeout(MAX_MESSAGE_HANDLING_DELAY_MS)).onUpdatedAdiDeviceState(
-                        any());
+                        any(), anyBoolean());
             }
         } finally {
             // reset the metadata device type
@@ -354,7 +355,7 @@
         verify(mMockAudioService,
                 timeout(MAX_MESSAGE_HANDLING_DELAY_MS).atLeast(1)).onUpdatedAdiDeviceState(
                 ArgumentMatchers.argThat(devState -> devState.getAudioDeviceCategory()
-                        == AudioManager.AUDIO_DEVICE_CATEGORY_OTHER));
+                        == AudioManager.AUDIO_DEVICE_CATEGORY_OTHER), anyBoolean());
     }
 
     private void doTestConnectionDisconnectionReconnection(int delayAfterDisconnection,
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 83bbd0e..23728db34 100644
--- a/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java
@@ -35,6 +35,7 @@
 import static android.media.AudioManager.STREAM_RING;
 import static android.media.AudioManager.STREAM_SYSTEM;
 import static android.media.AudioManager.STREAM_VOICE_CALL;
+import static android.media.audio.Flags.autoPublicVolumeApiHardening;
 import static android.view.KeyEvent.ACTION_DOWN;
 import static android.view.KeyEvent.KEYCODE_VOLUME_UP;
 
@@ -47,6 +48,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeNotNull;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -66,6 +68,8 @@
 import android.annotation.Nullable;
 import android.app.AppOpsManager;
 import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.media.AudioDeviceAttributes;
 import android.media.AudioDeviceInfo;
 import android.media.AudioManager;
@@ -214,6 +218,19 @@
 
         reset(mSpyAudioSystem);
 
+        final boolean useFixedVolume = mContext.getResources().getBoolean(
+                Resources.getSystem().getIdentifier("config_useFixedVolume", "bool", "android"));
+        final PackageManager packageManager = mContext.getPackageManager();
+        final boolean isTelevision = packageManager != null
+                && (packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
+                || packageManager.hasSystemFeature(PackageManager.FEATURE_TELEVISION));
+        final boolean isSingleVolume = mContext.getResources().getBoolean(
+                Resources.getSystem().getIdentifier("config_single_volume", "bool", "android"));
+        final boolean automotiveHardened = mContext.getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_AUTOMOTIVE) && autoPublicVolumeApiHardening();
+        assumeFalse("Skipping test for fixed, TV, single volume and auto devices",
+                useFixedVolume || isTelevision || isSingleVolume || automotiveHardened);
+
         InstrumentationRegistry.getInstrumentation().getUiAutomation()
                 .adoptShellPermissionIdentity(Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED,
                         Manifest.permission.MODIFY_AUDIO_ROUTING,
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
index f0dc5f0..7e04277 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
@@ -269,7 +269,7 @@
                 mFingerprintSensorConfigurationsCaptor.capture());
 
         final SensorProps[] fingerprintProp = mFingerprintSensorConfigurationsCaptor.getValue()
-                .getSensorPairForInstance("defaultHIDL").second;
+                .getSensorPropForInstance("defaultHIDL");
 
         assertEquals(fingerprintProp[0].commonProps.sensorId, fingerprintId);
         assertEquals(fingerprintProp[0].commonProps.sensorStrength,
@@ -280,7 +280,7 @@
 
         final android.hardware.biometrics.face.SensorProps[] faceProp =
                 mFaceSensorConfigurationsCaptor.getValue()
-                        .getSensorPairForInstance("defaultHIDL").second;
+                        .getSensorPropForInstance("defaultHIDL");
 
         assertEquals(faceProp[0].commonProps.sensorId, faceId);
         assertEquals(faceProp[0].commonProps.sensorStrength,
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java
index 74eb79d..34092b6 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java
@@ -68,7 +68,7 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.platform.test.annotations.Presubmit;
-import android.security.KeyStore;
+import android.security.KeyStoreAuthorization;
 
 import androidx.test.filters.SmallTest;
 
@@ -105,7 +105,7 @@
     @Mock private IBiometricServiceReceiver mClientReceiver;
     @Mock private IStatusBarService mStatusBarService;
     @Mock private IBiometricSysuiReceiver mSysuiReceiver;
-    @Mock private KeyStore mKeyStore;
+    @Mock private KeyStoreAuthorization mKeyStoreAuthorization;
     @Mock private AuthSession.ClientDeathReceiver mClientDeathReceiver;
     @Mock private BiometricFrameworkStatsLogger mBiometricFrameworkStatsLogger;
     @Mock private BiometricCameraManager mBiometricCameraManager;
@@ -665,9 +665,10 @@
         final PreAuthInfo preAuthInfo = createPreAuthInfo(sensors, userId, promptInfo,
                 checkDevicePolicyManager);
         return new AuthSession(mContext, mBiometricContext, mStatusBarService, mSysuiReceiver,
-                mKeyStore, mRandom, mClientDeathReceiver, preAuthInfo, mToken, requestId,
-                operationId, userId, mSensorReceiver, mClientReceiver, TEST_PACKAGE, promptInfo,
-                false /* debugEnabled */, mFingerprintSensorProps, mBiometricFrameworkStatsLogger);
+                mKeyStoreAuthorization, mRandom, mClientDeathReceiver, preAuthInfo, mToken,
+                requestId, operationId, userId, mSensorReceiver, mClientReceiver, TEST_PACKAGE,
+                promptInfo, false /* debugEnabled */, mFingerprintSensorProps,
+                mBiometricFrameworkStatsLogger);
     }
 
     private PromptInfo createPromptInfo(@Authenticators.Types int authenticators) {
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java
index 49583ef..5fd29c2 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java
@@ -82,8 +82,7 @@
 import android.platform.test.annotations.Presubmit;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.security.GateKeeper;
-import android.security.KeyStore;
-import android.security.authorization.IKeystoreAuthorization;
+import android.security.KeyStoreAuthorization;
 import android.service.gatekeeper.IGateKeeperService;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
@@ -182,7 +181,7 @@
     private BiometricHandlerProvider mBiometricHandlerProvider;
 
     @Mock
-    private IKeystoreAuthorization mKeystoreAuthService;
+    private KeyStoreAuthorization mKeyStoreAuthorization;
 
     @Mock
     private IGateKeeperService mGateKeeperService;
@@ -207,7 +206,7 @@
         when(mInjector.getStatusBarService()).thenReturn(mock(IStatusBarService.class));
         when(mInjector.getSettingObserver(any(), any(), any()))
                 .thenReturn(mock(BiometricService.SettingObserver.class));
-        when(mInjector.getKeyStore()).thenReturn(mock(KeyStore.class));
+        when(mInjector.getKeyStoreAuthorization()).thenReturn(mock(KeyStoreAuthorization.class));
         when(mInjector.isDebugEnabled(any(), anyInt())).thenReturn(false);
         when(mInjector.getBiometricStrengthController(any()))
                 .thenReturn(mock(BiometricStrengthController.class));
@@ -243,7 +242,7 @@
                 mStatusBarService, null /* handler */,
                 mAuthSessionCoordinator);
         when(mInjector.getBiometricContext(any())).thenReturn(mBiometricContextProvider);
-        when(mInjector.getKeystoreAuthorizationService()).thenReturn(mKeystoreAuthService);
+        when(mInjector.getKeyStoreAuthorization()).thenReturn(mKeyStoreAuthorization);
         when(mInjector.getGateKeeperService()).thenReturn(mGateKeeperService);
         when(mInjector.getNotificationLogger()).thenReturn(mNotificationLogger);
         when(mGateKeeperService.getSecureUserId(anyInt())).thenReturn(42L);
@@ -682,9 +681,9 @@
         waitForIdle();
         // HAT sent to keystore
         if (isStrongBiometric) {
-            verify(mBiometricService.mKeyStore).addAuthToken(AdditionalMatchers.aryEq(HAT));
+            verify(mKeyStoreAuthorization).addAuthToken(AdditionalMatchers.aryEq(HAT));
         } else {
-            verify(mBiometricService.mKeyStore, never()).addAuthToken(any(byte[].class));
+            verify(mKeyStoreAuthorization, never()).addAuthToken(any(byte[].class));
         }
         // Send onAuthenticated to client
         verify(mReceiver1).onAuthenticationSucceeded(
@@ -747,7 +746,7 @@
         waitForIdle();
         // Waiting for SystemUI to send confirmation callback
         assertEquals(STATE_AUTH_PENDING_CONFIRM, mBiometricService.mAuthSession.getState());
-        verify(mBiometricService.mKeyStore, never()).addAuthToken(any(byte[].class));
+        verify(mKeyStoreAuthorization, never()).addAuthToken(any(byte[].class));
 
         // SystemUI sends confirm, HAT is sent to keystore and client is notified.
         mBiometricService.mAuthSession.mSysuiReceiver.onDialogDismissed(
@@ -755,9 +754,9 @@
                 null /* credentialAttestation */);
         waitForIdle();
         if (isStrongBiometric) {
-            verify(mBiometricService.mKeyStore).addAuthToken(AdditionalMatchers.aryEq(HAT));
+            verify(mKeyStoreAuthorization).addAuthToken(AdditionalMatchers.aryEq(HAT));
         } else {
-            verify(mBiometricService.mKeyStore, never()).addAuthToken(any(byte[].class));
+            verify(mKeyStoreAuthorization, never()).addAuthToken(any(byte[].class));
         }
         verify(mReceiver1).onAuthenticationSucceeded(
                 BiometricPrompt.AUTHENTICATION_RESULT_TYPE_BIOMETRIC);
@@ -1313,11 +1312,33 @@
                 eq(TYPE_FACE),
                 eq(BiometricConstants.BIOMETRIC_ERROR_USER_CANCELED),
                 eq(0 /* vendorCode */));
-        verify(mBiometricService.mKeyStore, never()).addAuthToken(any(byte[].class));
+        verify(mKeyStoreAuthorization, never()).addAuthToken(any(byte[].class));
         assertNull(mBiometricService.mAuthSession);
     }
 
     @Test
+    public void testDismissedReasonMoreOptions_whilePaused_invokeHalCancel() throws Exception {
+        setupAuthForOnly(TYPE_FACE, Authenticators.BIOMETRIC_STRONG);
+        invokeAuthenticateAndStart(mBiometricService.mImpl, mReceiver1,
+                false /* requireConfirmation */, null /* authenticators */);
+
+        mBiometricService.mAuthSession.mSensorReceiver.onError(
+                SENSOR_ID_FACE,
+                getCookieForCurrentSession(mBiometricService.mAuthSession),
+                BiometricConstants.BIOMETRIC_ERROR_TIMEOUT,
+                0 /* vendorCode */);
+        mBiometricService.mAuthSession.mSysuiReceiver.onDialogDismissed(
+                BiometricPrompt.DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS,
+                null /* credentialAttestation */);
+        waitForIdle();
+
+        verify(mReceiver1).onDialogDismissed(
+                eq(BiometricPrompt.DISMISSED_REASON_CONTENT_VIEW_MORE_OPTIONS));
+        verify(mBiometricService.mSensors.get(0).impl)
+                .cancelAuthenticationFromService(any(), any(), anyLong());
+    }
+
+    @Test
     public void testAcquire_whenAuthenticating_sentToSystemUI() throws Exception {
         when(mContext.getResources().getString(anyInt())).thenReturn("test string");
 
@@ -1817,7 +1838,7 @@
 
         final long expectedResult = 31337L;
 
-        when(mKeystoreAuthService.getLastAuthTime(eq(secureUserId), eq(hardwareAuthenticators)))
+        when(mKeyStoreAuthorization.getLastAuthTime(eq(secureUserId), eq(hardwareAuthenticators)))
                 .thenReturn(expectedResult);
 
         mBiometricService = new BiometricService(mContext, mInjector, mBiometricHandlerProvider);
@@ -1826,7 +1847,8 @@
                 Authenticators.BIOMETRIC_STRONG | Authenticators.DEVICE_CREDENTIAL);
 
         assertEquals(expectedResult, result);
-        verify(mKeystoreAuthService).getLastAuthTime(eq(secureUserId), eq(hardwareAuthenticators));
+        verify(mKeyStoreAuthorization).getLastAuthTime(eq(secureUserId),
+                eq(hardwareAuthenticators));
     }
 
     // Helper methods
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerOperationTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerOperationTest.java
index 527bc5b..f6da411 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerOperationTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerOperationTest.java
@@ -20,6 +20,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyBoolean;
 import static org.mockito.Mockito.eq;
@@ -29,7 +30,9 @@
 import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertThrows;
 
+import android.hardware.biometrics.BiometricConstants;
 import android.os.Handler;
+import android.os.RemoteException;
 import android.platform.test.annotations.Presubmit;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
@@ -72,6 +75,8 @@
     @Mock
     private BaseClientMonitor mNonInterruptableClientMonitor;
     @Mock
+    private ClientMonitorCallbackConverter mListener;
+    @Mock
     private ClientMonitorCallback mClientCallback;
     @Mock
     private ClientMonitorCallback mOnStartCallback;
@@ -435,17 +440,18 @@
     }
 
     @Test
-    public void cancelWatchdogWhenStarted() {
+    public void cancelWatchdogWhenStarted() throws RemoteException {
         cancelWatchdog(true);
     }
 
     @Test
-    public void cancelWatchdogWithoutStarting() {
+    public void cancelWatchdogWithoutStarting() throws RemoteException {
         cancelWatchdog(false);
     }
 
-    private void cancelWatchdog(boolean start) {
+    private void cancelWatchdog(boolean start) throws RemoteException {
         when(mInterruptableClientMonitor.getFreshDaemon()).thenReturn(mHal);
+        when(mInterruptableClientMonitor.getListener()).thenReturn(mListener);
 
         mInterruptableOperation.start(mOnStartCallback);
         if (start) {
@@ -461,6 +467,8 @@
 
         assertThat(mInterruptableOperation.isFinished()).isTrue();
         assertThat(mInterruptableOperation.isCanceling()).isFalse();
+        verify(mInterruptableClientMonitor.getListener()).onError(anyInt(), anyInt(), eq(
+                BiometricConstants.BIOMETRIC_ERROR_CANCELED), eq(0));
         verify(mOnStartCallback).onClientFinished(eq(mInterruptableClientMonitor), eq(false));
         verify(mInterruptableClientMonitor).destroy();
     }
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
index 981eba5..971323a 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java
@@ -135,6 +135,8 @@
     private ISession mSession;
     @Mock
     private IFingerprint mFingerprint;
+    @Mock
+    private ClientMonitorCallbackConverter mListener;
 
     @Before
     public void setUp() {
@@ -206,7 +208,7 @@
         // Pretend the scheduler is busy so the first operation doesn't start right away. We want
         // to pretend like there are two operations in the queue before kicking things off
         mScheduler.mCurrentOperation = new BiometricSchedulerOperation(
-                mock(BaseClientMonitor.class), mock(ClientMonitorCallback.class));
+                createBaseClientMonitor(), mock(ClientMonitorCallback.class));
 
         mScheduler.scheduleClientMonitor(client1, callback1);
         assertEquals(1, mScheduler.mPendingOperations.size());
@@ -244,7 +246,7 @@
         // Pretend the scheduler is busy so the first operation doesn't start right away. We want
         // to pretend like there are two operations in the queue before kicking things off
         mScheduler.mCurrentOperation = new BiometricSchedulerOperation(
-                mock(BaseClientMonitor.class), mock(ClientMonitorCallback.class));
+                createBaseClientMonitor(), mock(ClientMonitorCallback.class));
 
         mScheduler.scheduleClientMonitor(client1, callback1);
         assertEquals(1, mScheduler.mPendingOperations.size());
@@ -612,10 +614,10 @@
 
     @Test
     public void testInterruptPrecedingClients_whenExpected() {
-        final BaseClientMonitor interruptableMonitor = mock(BaseClientMonitor.class);
+        final BaseClientMonitor interruptableMonitor = createBaseClientMonitor();
         when(interruptableMonitor.isInterruptable()).thenReturn(true);
 
-        final BaseClientMonitor interrupter = mock(BaseClientMonitor.class);
+        final BaseClientMonitor interrupter = createBaseClientMonitor();
         when(interrupter.interruptsPrecedingClients()).thenReturn(true);
 
         mScheduler.scheduleClientMonitor(interruptableMonitor);
@@ -628,10 +630,10 @@
 
     @Test
     public void testDoesNotInterruptPrecedingClients_whenNotExpected() {
-        final BaseClientMonitor interruptableMonitor = mock(BaseClientMonitor.class);
+        final BaseClientMonitor interruptableMonitor = createBaseClientMonitor();
         when(interruptableMonitor.isInterruptable()).thenReturn(true);
 
-        final BaseClientMonitor interrupter = mock(BaseClientMonitor.class);
+        final BaseClientMonitor interrupter = createBaseClientMonitor();
         when(interrupter.interruptsPrecedingClients()).thenReturn(false);
 
         mScheduler.scheduleClientMonitor(interruptableMonitor);
@@ -741,7 +743,7 @@
         //Start watchdog
         mScheduler.startWatchdog();
         waitForIdle();
-        mScheduler.scheduleClientMonitor(mock(BaseClientMonitor.class),
+        mScheduler.scheduleClientMonitor(createBaseClientMonitor(),
                 mock(ClientMonitorCallback.class));
         waitForIdle();
 
@@ -775,9 +777,9 @@
         //Start watchdog
         mScheduler.startWatchdog();
         waitForIdle();
-        mScheduler.scheduleClientMonitor(mock(BaseClientMonitor.class),
+        mScheduler.scheduleClientMonitor(createBaseClientMonitor(),
                 mock(ClientMonitorCallback.class));
-        mScheduler.scheduleClientMonitor(mock(BaseClientMonitor.class),
+        mScheduler.scheduleClientMonitor(createBaseClientMonitor(),
                 mock(ClientMonitorCallback.class));
         waitForIdle();
 
@@ -857,7 +859,7 @@
     public void testScheduleOperation_whenNoUser() {
         mCurrentUserId = UserHandle.USER_NULL;
 
-        final BaseClientMonitor nextClient = mock(BaseClientMonitor.class);
+        final BaseClientMonitor nextClient = createBaseClientMonitor();
         when(nextClient.getTargetUserId()).thenReturn(0);
 
         mScheduler.scheduleClientMonitor(nextClient);
@@ -875,9 +877,9 @@
         mStartOperationsFinish = false;
 
         final BaseClientMonitor[] nextClients = new BaseClientMonitor[]{
-                mock(BaseClientMonitor.class),
-                mock(BaseClientMonitor.class),
-                mock(BaseClientMonitor.class)
+                createBaseClientMonitor(),
+                createBaseClientMonitor(),
+                createBaseClientMonitor()
         };
         for (BaseClientMonitor client : nextClients) {
             when(client.getTargetUserId()).thenReturn(5);
@@ -899,7 +901,7 @@
         mCurrentUserId = UserHandle.USER_NULL;
         mStartOperationsFinish = false;
 
-        final BaseClientMonitor client = mock(BaseClientMonitor.class);
+        final BaseClientMonitor client = createBaseClientMonitor();
 
         when(client.getTargetUserId()).thenReturn(5);
 
@@ -913,7 +915,7 @@
         assertThat(mScheduler.mCurrentOperation).isNull();
 
         final BiometricSchedulerOperation fakeOperation = new BiometricSchedulerOperation(
-                mock(BaseClientMonitor.class), new ClientMonitorCallback() {});
+                createBaseClientMonitor(), new ClientMonitorCallback() {});
         mScheduler.mCurrentOperation = fakeOperation;
         startUserClient.mCallback.onClientFinished(startUserClient, true);
 
@@ -925,7 +927,7 @@
     public void testScheduleOperation_whenSameUser() {
         mCurrentUserId = 10;
 
-        BaseClientMonitor nextClient = mock(BaseClientMonitor.class);
+        BaseClientMonitor nextClient = createBaseClientMonitor();
         when(nextClient.getTargetUserId()).thenReturn(mCurrentUserId);
 
         mScheduler.scheduleClientMonitor(nextClient);
@@ -943,7 +945,7 @@
         mCurrentUserId = 10;
 
         final int nextUserId = 11;
-        BaseClientMonitor nextClient = mock(BaseClientMonitor.class);
+        BaseClientMonitor nextClient = createBaseClientMonitor();
         when(nextClient.getTargetUserId()).thenReturn(nextUserId);
 
         mScheduler.scheduleClientMonitor(nextClient);
@@ -963,7 +965,7 @@
     public void testStartUser_alwaysStartsNextOperation() {
         mCurrentUserId = UserHandle.USER_NULL;
 
-        BaseClientMonitor nextClient = mock(BaseClientMonitor.class);
+        BaseClientMonitor nextClient = createBaseClientMonitor();
         when(nextClient.getTargetUserId()).thenReturn(10);
 
         mScheduler.scheduleClientMonitor(nextClient);
@@ -977,7 +979,7 @@
 
         // schedule second operation but swap out the current operation
         // before it runs so that it's not current when it's completion callback runs
-        nextClient = mock(BaseClientMonitor.class);
+        nextClient = createBaseClientMonitor();
         when(nextClient.getTargetUserId()).thenReturn(11);
         mScheduler.scheduleClientMonitor(nextClient);
 
@@ -994,7 +996,7 @@
 
         // When a stop user client fails, check that mStopUserClient
         // is set to null to prevent the scheduler from getting stuck.
-        BaseClientMonitor nextClient = mock(BaseClientMonitor.class);
+        BaseClientMonitor nextClient = createBaseClientMonitor();
         when(nextClient.getTargetUserId()).thenReturn(10);
 
         mScheduler.scheduleClientMonitor(nextClient);
@@ -1008,7 +1010,7 @@
 
         // schedule second operation but swap out the current operation
         // before it runs so that it's not current when it's completion callback runs
-        nextClient = mock(BaseClientMonitor.class);
+        nextClient = createBaseClientMonitor();
         when(nextClient.getTargetUserId()).thenReturn(11);
         mShouldFailStopUser = true;
         mScheduler.scheduleClientMonitor(nextClient);
@@ -1023,6 +1025,13 @@
         return BiometricSchedulerProto.parseFrom(mScheduler.dumpProtoState(clearSchedulerBuffer));
     }
 
+    private BaseClientMonitor createBaseClientMonitor() {
+        BaseClientMonitor client = mock(BaseClientMonitor.class);
+        when(client.getListener()).thenReturn(mListener);
+
+        return client;
+    }
+
     private void waitForIdle() {
         TestableLooper.get(this).processAllMessages();
     }
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/FaceServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/FaceServiceTest.java
index 3aaac2e..e4c56a7 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/FaceServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/FaceServiceTest.java
@@ -32,8 +32,6 @@
 import android.content.pm.PackageManager;
 import android.hardware.biometrics.BiometricAuthenticator;
 import android.hardware.biometrics.IBiometricService;
-import android.hardware.biometrics.face.IFace;
-import android.hardware.biometrics.face.SensorProps;
 import android.hardware.face.FaceAuthenticateOptions;
 import android.hardware.face.FaceSensorConfigurations;
 import android.hardware.face.FaceSensorPropertiesInternal;
@@ -93,18 +91,12 @@
     @Mock
     private FaceProvider mFaceProviderVirtual;
     @Mock
-    private IFace mDefaultFaceDaemon;
-    @Mock
-    private IFace mVirtualFaceDaemon;
-    @Mock
     private IBiometricService mIBiometricService;
     @Mock
     private IBinder mToken;
     @Mock
     private IFaceServiceReceiver mFaceServiceReceiver;
 
-    private final SensorProps mDefaultSensorProps = new SensorProps();
-    private final SensorProps mVirtualSensorProps = new SensorProps();
     private FaceService mFaceService;
     private final FaceSensorPropertiesInternal mSensorPropsDefault =
             new FaceSensorPropertiesInternal(ID_DEFAULT, STRENGTH_STRONG,
@@ -126,10 +118,6 @@
 
     @Before
     public void setUp() throws RemoteException {
-        when(mDefaultFaceDaemon.getSensorProps()).thenReturn(
-                new SensorProps[]{mDefaultSensorProps});
-        when(mVirtualFaceDaemon.getSensorProps()).thenReturn(
-                new SensorProps[]{mVirtualSensorProps});
         when(mFaceProviderDefault.getSensorProperties()).thenReturn(List.of(mSensorPropsDefault));
         when(mFaceProviderVirtual.getSensorProperties()).thenReturn(List.of(mSensorPropsVirtual));
         when(mFaceProviderDefault.containsSensor(anyInt()))
@@ -140,15 +128,7 @@
         mContext.getTestablePermissions().setPermission(
                 USE_BIOMETRIC_INTERNAL, PackageManager.PERMISSION_GRANTED);
         mFaceSensorConfigurations = new FaceSensorConfigurations(false);
-        mFaceSensorConfigurations.addAidlConfigs(new String[]{NAME_DEFAULT, NAME_VIRTUAL},
-                (name) -> {
-                    if (name.equals(IFace.DESCRIPTOR + "/" + NAME_DEFAULT)) {
-                        return mDefaultFaceDaemon;
-                    } else if (name.equals(IFace.DESCRIPTOR + "/" + NAME_VIRTUAL)) {
-                        return mVirtualFaceDaemon;
-                    }
-                    return null;
-                });
+        mFaceSensorConfigurations.addAidlConfigs(new String[]{NAME_DEFAULT, NAME_VIRTUAL});
     }
 
     private void initService() {
@@ -181,7 +161,7 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(Flags.FLAG_DE_HIDL)
+    @RequiresFlagsEnabled({Flags.FLAG_DE_HIDL, Flags.FLAG_FACE_VHAL_FEATURE})
     public void registerAuthenticatorsLegacy_virtualOnly() throws Exception {
         initService();
         Settings.Secure.putInt(mSettingsRule.mockContentResolver(mContext),
@@ -196,18 +176,25 @@
     }
 
     @Test
+    @RequiresFlagsEnabled({Flags.FLAG_DE_HIDL, Flags.FLAG_FACE_VHAL_FEATURE})
+    public void registerAuthenticatorsLegacy_virtualFaceOnly() throws Exception {
+        initService();
+        Settings.Secure.putInt(mSettingsRule.mockContentResolver(mContext),
+                Settings.Secure.BIOMETRIC_FACE_VIRTUAL_ENABLED, 1);
+
+        mFaceService.mServiceWrapper.registerAuthenticatorsLegacy(mFaceSensorConfigurations);
+        waitForRegistration();
+
+        verify(mIBiometricService).registerAuthenticator(eq(ID_VIRTUAL),
+                eq(BiometricAuthenticator.TYPE_FACE),
+                eq(Utils.propertyStrengthToAuthenticatorStrength(STRENGTH_STRONG)), any());
+    }
+
+    @Test
     @RequiresFlagsEnabled(Flags.FLAG_DE_HIDL)
     public void registerAuthenticatorsLegacy_virtualAlwaysWhenNoOther() throws Exception {
         mFaceSensorConfigurations = new FaceSensorConfigurations(false);
-        mFaceSensorConfigurations.addAidlConfigs(new String[]{NAME_VIRTUAL},
-                (name) -> {
-                    if (name.equals(IFace.DESCRIPTOR + "/" + NAME_DEFAULT)) {
-                        return mDefaultFaceDaemon;
-                    } else if (name.equals(IFace.DESCRIPTOR + "/" + NAME_VIRTUAL)) {
-                        return mVirtualFaceDaemon;
-                    }
-                    return null;
-                });
+        mFaceSensorConfigurations.addAidlConfigs(new String[]{NAME_VIRTUAL});
         initService();
 
         mFaceService.mServiceWrapper.registerAuthenticatorsLegacy(mFaceSensorConfigurations);
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/FingerprintServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/FingerprintServiceTest.java
index 88956b6..9a8cd48 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/FingerprintServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/FingerprintServiceTest.java
@@ -43,8 +43,6 @@
 import android.content.ComponentName;
 import android.content.pm.PackageManager;
 import android.hardware.biometrics.IBiometricService;
-import android.hardware.biometrics.fingerprint.IFingerprint;
-import android.hardware.biometrics.fingerprint.SensorProps;
 import android.hardware.fingerprint.FingerprintAuthenticateOptions;
 import android.hardware.fingerprint.FingerprintSensorConfigurations;
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
@@ -123,10 +121,6 @@
     private IBinder mToken;
     @Mock
     private VirtualDeviceManagerInternal mVdmInternal;
-    @Mock
-    private IFingerprint mDefaultFingerprintDaemon;
-    @Mock
-    private IFingerprint mVirtualFingerprintDaemon;
 
     @Captor
     private ArgumentCaptor<FingerprintAuthenticateOptions> mAuthenticateOptionsCaptor;
@@ -145,8 +139,6 @@
                     false /* resetLockoutRequiresHardwareAuthToken */);
     private FingerprintSensorConfigurations mFingerprintSensorConfigurations;
     private FingerprintService mService;
-    private final SensorProps mDefaultSensorProps = new SensorProps();
-    private final SensorProps mVirtualSensorProps = new SensorProps();
 
     @Before
     public void setup() throws Exception {
@@ -159,10 +151,6 @@
                 .thenAnswer(i -> i.getArguments()[0].equals(ID_DEFAULT));
         when(mFingerprintVirtual.containsSensor(anyInt()))
                 .thenAnswer(i -> i.getArguments()[0].equals(ID_VIRTUAL));
-        when(mDefaultFingerprintDaemon.getSensorProps()).thenReturn(
-                new SensorProps[]{mDefaultSensorProps});
-        when(mVirtualFingerprintDaemon.getSensorProps()).thenReturn(
-                new SensorProps[]{mVirtualSensorProps});
 
         mContext.addMockSystemService(AppOpsManager.class, mAppOpsManager);
         for (int permission : List.of(OP_USE_BIOMETRIC, OP_USE_FINGERPRINT)) {
@@ -177,15 +165,7 @@
 
         mFingerprintSensorConfigurations = new FingerprintSensorConfigurations(
                 true /* resetLockoutRequiresHardwareAuthToken */);
-        mFingerprintSensorConfigurations.addAidlSensors(new String[]{NAME_DEFAULT, NAME_VIRTUAL},
-                (name) -> {
-                    if (name.equals(IFingerprint.DESCRIPTOR + "/" + NAME_DEFAULT)) {
-                        return mDefaultFingerprintDaemon;
-                    } else if (name.equals(IFingerprint.DESCRIPTOR + "/" + NAME_VIRTUAL)) {
-                        return mVirtualFingerprintDaemon;
-                    }
-                    return null;
-                });
+        mFingerprintSensorConfigurations.addAidlSensors(new String[]{NAME_DEFAULT, NAME_VIRTUAL});
     }
 
     private void initServiceWith(String... aidlInstances) {
@@ -243,6 +223,18 @@
     }
 
     @Test
+    public void registerAuthenticators_virtualFingerprintOnly() throws Exception {
+        initServiceWith(NAME_DEFAULT, NAME_VIRTUAL);
+        Settings.Secure.putInt(mSettingsRule.mockContentResolver(mContext),
+                Settings.Secure.BIOMETRIC_FINGERPRINT_VIRTUAL_ENABLED, 1);
+
+        mService.mServiceWrapper.registerAuthenticators(HIDL_AUTHENTICATORS);
+        waitForRegistration();
+
+        verify(mIBiometricService).registerAuthenticator(eq(ID_VIRTUAL), anyInt(), anyInt(), any());
+    }
+
+    @Test
     @RequiresFlagsEnabled(Flags.FLAG_DE_HIDL)
     public void registerAuthenticatorsLegacy_virtualOnly() throws Exception {
         initServiceWith(NAME_DEFAULT, NAME_VIRTUAL);
@@ -270,15 +262,7 @@
     public void registerAuthenticatorsLegacy_virtualAlwaysWhenNoOther() throws Exception {
         mFingerprintSensorConfigurations =
                 new FingerprintSensorConfigurations(true);
-        mFingerprintSensorConfigurations.addAidlSensors(new String[]{NAME_VIRTUAL},
-                        (name) -> {
-                            if (name.equals(IFingerprint.DESCRIPTOR + "/" + NAME_DEFAULT)) {
-                                return mDefaultFingerprintDaemon;
-                            } else if (name.equals(IFingerprint.DESCRIPTOR + "/" + NAME_VIRTUAL)) {
-                                return mVirtualFingerprintDaemon;
-                            }
-                            return null;
-                        });
+        mFingerprintSensorConfigurations.addAidlSensors(new String[]{NAME_VIRTUAL});
         initServiceWith(NAME_VIRTUAL);
 
         mService.mServiceWrapper.registerAuthenticatorsLegacy(mFingerprintSensorConfigurations);
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/GenericWindowPolicyControllerTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/GenericWindowPolicyControllerTest.java
index ec3e97b..0678140 100644
--- a/services/tests/servicestests/src/com/android/server/companion/virtual/GenericWindowPolicyControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/GenericWindowPolicyControllerTest.java
@@ -123,6 +123,7 @@
     @Test
     public void containsUid() {
         GenericWindowPolicyController gwpc = createGwpc();
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
 
         assertThat(gwpc.containsUid(TEST_UID)).isFalse();
 
@@ -136,6 +137,7 @@
     @Test
     public void isEnteringPipAllowed_falseByDefault() {
         GenericWindowPolicyController gwpc = createGwpc();
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
 
         assertThat(gwpc.isEnteringPipAllowed(TEST_UID)).isFalse();
         verify(mPipBlockedCallback, timeout(TIMEOUT_MILLIS)).onEnteringPipBlocked(TEST_UID);
@@ -144,6 +146,7 @@
     @Test
     public void isEnteringPipAllowed_dpcSupportsPinned_allowed() {
         GenericWindowPolicyController gwpc = createGwpc();
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
         gwpc.setSupportedWindowingModes(new HashSet<>(
                 Arrays.asList(WindowConfiguration.WINDOWING_MODE_FULLSCREEN,
                         WindowConfiguration.WINDOWING_MODE_PINNED)));
@@ -160,11 +163,25 @@
                 NONBLOCKED_APP_PACKAGE_NAME,
                 NONBLOCKED_APP_PACKAGE_NAME,
                 /* displayOnRemoteDevices */ true,
-                /* targetDisplayCategory */ null);
+                /* targetDisplayCategory */ null,
+                /* uid */ UserHandle.PER_USER_RANGE + 1);
         assertActivityIsBlocked(gwpc, activityInfo);
     }
 
     @Test
+    public void userNotAllowlisted_systemUser_isNotBlocked() {
+        GenericWindowPolicyController gwpc = createGwpcWithNoAllowedUsers();
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
+
+        ActivityInfo activityInfo = getActivityInfo(
+                NONBLOCKED_APP_PACKAGE_NAME,
+                NONBLOCKED_APP_PACKAGE_NAME,
+                /* displayOnRemoteDevices */ true,
+                /* targetDisplayCategory */ null);
+        assertActivityCanBeLaunched(gwpc, activityInfo);
+    }
+
+    @Test
     public void userNotAllowlisted_systemUserCanLaunchBlockedAppStreamingActivity() {
         GenericWindowPolicyController gwpc = createGwpcWithNoAllowedUsers();
         gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
@@ -521,6 +538,7 @@
     public void registerRunningAppsChangedListener_onRunningAppsChanged_listenersNotified() {
         ArraySet<Integer> uids = new ArraySet<>(Arrays.asList(TEST_UID));
         GenericWindowPolicyController gwpc = createGwpc();
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
 
         gwpc.registerRunningAppsChangedListener(mRunningAppsChangedListener);
         gwpc.onRunningAppsChanged(uids);
@@ -545,6 +563,7 @@
     public void noRunningAppsChangedListener_onRunningAppsChanged_doesNotThrowException() {
         ArraySet<Integer> uids = new ArraySet<>(Arrays.asList(TEST_UID));
         GenericWindowPolicyController gwpc = createGwpc();
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
 
         gwpc.onRunningAppsChanged(uids);
 
@@ -557,6 +576,7 @@
     public void registerUnregisterRunningAppsChangedListener_onRunningAppsChanged_doesNotThrowException() {
         ArraySet<Integer> uids = new ArraySet<>(Arrays.asList(TEST_UID));
         GenericWindowPolicyController gwpc = createGwpc();
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
 
         gwpc.registerRunningAppsChangedListener(mRunningAppsChangedListener);
         gwpc.unregisterRunningAppsChangedListener(mRunningAppsChangedListener);
@@ -579,6 +599,7 @@
         doReturn(interceptor).when(interceptor).queryLocalInterface(anyString());
 
         GenericWindowPolicyController gwpc = createGwpc();
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
         ActivityInfo activityInfo = getActivityInfo(
                 NONBLOCKED_APP_PACKAGE_NAME,
                 NONBLOCKED_APP_PACKAGE_NAME,
@@ -603,6 +624,7 @@
         Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("testing"));
 
         GenericWindowPolicyController gwpc = createGwpc();
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
         ActivityInfo activityInfo = getActivityInfo(
                 NONBLOCKED_APP_PACKAGE_NAME,
                 NONBLOCKED_APP_PACKAGE_NAME,
@@ -621,6 +643,7 @@
     @Test
     public void onTopActivitychanged_null_noCallback() {
         GenericWindowPolicyController gwpc = createGwpc();
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
 
         gwpc.onTopActivityChanged(null, 0, 0);
         verify(mActivityListener, after(TIMEOUT_MILLIS).never())
@@ -697,6 +720,7 @@
     @Test
     public void getCustomHomeComponent_noneSet() {
         GenericWindowPolicyController gwpc = createGwpc();
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
 
         assertThat(gwpc.getCustomHomeComponent()).isNull();
     }
@@ -705,6 +729,7 @@
     public void getCustomHomeComponent_returnsHomeComponent() {
         GenericWindowPolicyController gwpc = createGwpcWithCustomHomeComponent(
                 NONBLOCKED_COMPONENT);
+        gwpc.setDisplayId(DISPLAY_ID, /* isMirrorDisplay= */ false);
 
         assertThat(gwpc.getCustomHomeComponent()).isEqualTo(NONBLOCKED_COMPONENT);
     }
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 5e0806d..7d90a8b 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
@@ -2004,7 +2004,7 @@
                         mRunningAppsChangedCallback,
                         params,
                         new DisplayManagerGlobal(mIDisplayManager),
-                        new VirtualCameraController(DEVICE_POLICY_DEFAULT));
+                        new VirtualCameraController(DEVICE_POLICY_DEFAULT, virtualDeviceId));
         mVdms.addVirtualDevice(virtualDeviceImpl);
         assertThat(virtualDeviceImpl.getAssociationId()).isEqualTo(mAssociationInfo.getId());
         assertThat(virtualDeviceImpl.getPersistentDeviceId())
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/camera/VirtualCameraControllerTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/camera/VirtualCameraControllerTest.java
index 9ca1df0..4505a8b 100644
--- a/services/tests/servicestests/src/com/android/server/companion/virtual/camera/VirtualCameraControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/camera/VirtualCameraControllerTest.java
@@ -29,6 +29,7 @@
 
 import static org.junit.Assert.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -62,6 +63,7 @@
 @TestableLooper.RunWithLooper(setAsMainLooper = true)
 public class VirtualCameraControllerTest {
 
+    private static final int DEVICE_ID = 5;
     private static final String CAMERA_NAME_1 = "Virtual camera 1";
     private static final int CAMERA_WIDTH_1 = 100;
     private static final int CAMERA_HEIGHT_1 = 200;
@@ -91,8 +93,9 @@
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
         mVirtualCameraController = new VirtualCameraController(mVirtualCameraServiceMock,
-                DEVICE_POLICY_CUSTOM);
-        when(mVirtualCameraServiceMock.registerCamera(any(), any())).thenReturn(true);
+                DEVICE_POLICY_CUSTOM, DEVICE_ID);
+        when(mVirtualCameraServiceMock.registerCamera(any(), any(), anyInt())).thenReturn(true);
+        when(mVirtualCameraServiceMock.getCameraId(any())).thenReturn(0);
     }
 
     @After
@@ -109,7 +112,10 @@
 
         ArgumentCaptor<VirtualCameraConfiguration> configurationCaptor =
                 ArgumentCaptor.forClass(VirtualCameraConfiguration.class);
-        verify(mVirtualCameraServiceMock).registerCamera(any(), configurationCaptor.capture());
+        ArgumentCaptor<Integer> deviceIdCaptor = ArgumentCaptor.forClass(Integer.class);
+        verify(mVirtualCameraServiceMock).registerCamera(any(), configurationCaptor.capture(),
+                deviceIdCaptor.capture());
+        assertThat(deviceIdCaptor.getValue()).isEqualTo(DEVICE_ID);
         VirtualCameraConfiguration virtualCameraConfiguration = configurationCaptor.getValue();
         assertThat(virtualCameraConfiguration.supportedStreamConfigs.length).isEqualTo(1);
         assertVirtualCameraConfiguration(virtualCameraConfiguration, CAMERA_WIDTH_1,
@@ -146,8 +152,11 @@
 
         ArgumentCaptor<VirtualCameraConfiguration> configurationCaptor =
                 ArgumentCaptor.forClass(VirtualCameraConfiguration.class);
+        ArgumentCaptor<Integer> deviceIdCaptor = ArgumentCaptor.forClass(Integer.class);
         verify(mVirtualCameraServiceMock, times(2)).registerCamera(any(),
-                configurationCaptor.capture());
+                configurationCaptor.capture(), deviceIdCaptor.capture());
+        List<Integer> deviceIds = deviceIdCaptor.getAllValues();
+        assertThat(deviceIds).containsExactly(DEVICE_ID, DEVICE_ID);
         List<VirtualCameraConfiguration> virtualCameraConfigurations =
                 configurationCaptor.getAllValues();
         assertThat(virtualCameraConfigurations).hasSize(2);
@@ -177,8 +186,8 @@
     @Test
     public void registerCamera_withDefaultCameraPolicy_throwsException(int lensFacing) {
         mVirtualCameraController.close();
-        mVirtualCameraController = new VirtualCameraController(
-                mVirtualCameraServiceMock, DEVICE_POLICY_DEFAULT);
+        mVirtualCameraController = new VirtualCameraController(mVirtualCameraServiceMock,
+                DEVICE_POLICY_DEFAULT, DEVICE_ID);
 
         assertThrows(IllegalArgumentException.class,
                 () -> mVirtualCameraController.registerCamera(createVirtualCameraConfig(
diff --git a/services/tests/servicestests/src/com/android/server/contentcapture/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/contentcapture/TEST_MAPPING
index 0ffa891..0946229 100644
--- a/services/tests/servicestests/src/com/android/server/contentcapture/TEST_MAPPING
+++ b/services/tests/servicestests/src/com/android/server/contentcapture/TEST_MAPPING
@@ -1,18 +1,7 @@
 {
   "presubmit": [
     {
-      "name": "FrameworksServicesTests",
-      "options": [
-        {
-          "include-filter": "com.android.server.contentcapture"
-        },
-        {
-          "exclude-annotation": "androidx.test.filters.FlakyTest"
-        },
-        {
-          "exclude-annotation": "org.junit.Ignore"
-        }
-      ]
+      "name": "FrameworksServicesTests_contentcapture"
     }
   ]
 }
diff --git a/services/tests/servicestests/src/com/android/server/contentprotection/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/contentprotection/TEST_MAPPING
index 419508c..1ad7baa 100644
--- a/services/tests/servicestests/src/com/android/server/contentprotection/TEST_MAPPING
+++ b/services/tests/servicestests/src/com/android/server/contentprotection/TEST_MAPPING
@@ -1,18 +1,7 @@
 {
   "presubmit": [
     {
-      "name": "FrameworksServicesTests",
-      "options": [
-        {
-          "include-filter": "com.android.server.contentprotection"
-        },
-        {
-          "exclude-annotation": "androidx.test.filters.FlakyTest"
-        },
-        {
-          "exclude-annotation": "org.junit.Ignore"
-        }
-      ]
+      "name": "FrameworksServicesTests_contentprotection"
     }
   ]
 }
diff --git a/services/tests/servicestests/src/com/android/server/grammaticalinflection/GrammaticalInflectionBackupTest.java b/services/tests/servicestests/src/com/android/server/grammaticalinflection/GrammaticalInflectionBackupTest.java
index 6c5a569..af6f6f2 100644
--- a/services/tests/servicestests/src/com/android/server/grammaticalinflection/GrammaticalInflectionBackupTest.java
+++ b/services/tests/servicestests/src/com/android/server/grammaticalinflection/GrammaticalInflectionBackupTest.java
@@ -18,6 +18,7 @@
 
 import static junit.framework.Assert.assertNull;
 import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.assertEquals;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
@@ -46,6 +47,7 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.List;
 
@@ -67,7 +69,7 @@
     @Before
     public void setUp() throws Exception {
         mBackupHelper = new GrammaticalInflectionBackupHelper(
-                mGrammaticalInflectionService, mMockPackageManager);
+                null, mGrammaticalInflectionService, mMockPackageManager);
     }
 
     @Test
@@ -106,6 +108,28 @@
                 eq(Configuration.GRAMMATICAL_GENDER_NEUTRAL));
     }
 
+    @Test
+    public void testSystemBackupPayload_returnsGender()
+            throws IOException, ClassNotFoundException {
+        doReturn(Configuration.GRAMMATICAL_GENDER_MASCULINE).when(mGrammaticalInflectionService)
+                .getSystemGrammaticalGender(any(), eq(DEFAULT_USER_ID));
+
+        int gender = convertByteArrayToInt(mBackupHelper.getSystemBackupPayload(DEFAULT_USER_ID));
+
+        assertEquals(gender, Configuration.GRAMMATICAL_GENDER_MASCULINE);
+    }
+
+    @Test
+    public void testApplySystemPayload_setSystemWideGrammaticalGender()
+            throws IOException {
+        mBackupHelper.applyRestoredSystemPayload(
+                intToByteArray(Configuration.GRAMMATICAL_GENDER_NEUTRAL), DEFAULT_USER_ID);
+
+        verify(mGrammaticalInflectionService).setSystemWideGrammaticalGender(
+                eq(Configuration.GRAMMATICAL_GENDER_NEUTRAL),
+                eq(DEFAULT_USER_ID));
+    }
+
     private void mockAppInstalled() {
         ApplicationInfo dummyApp = new ApplicationInfo();
         dummyApp.packageName = DEFAULT_PACKAGE_NAME;
@@ -141,4 +165,15 @@
         }
         return data;
     }
+
+    private byte[] intToByteArray(final int gender) {
+        ByteBuffer bb = ByteBuffer.allocate(4);
+        bb.putInt(gender);
+        return bb.array();
+    }
+
+    private int convertByteArrayToInt(byte[] intBytes) {
+        ByteBuffer byteBuffer = ByteBuffer.wrap(intBytes);
+        return byteBuffer.getInt();
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java b/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java
index dacff4c..44aa868 100644
--- a/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java
+++ b/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java
@@ -30,6 +30,9 @@
 import android.os.FileUtils;
 import android.os.ParcelFileDescriptor;
 import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 import android.system.Os;
 import android.text.FontConfig;
 import android.util.Xml;
@@ -38,8 +41,11 @@
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.text.flags.Flags;
+
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.xmlpull.v1.XmlPullParser;
@@ -69,6 +75,9 @@
 
     private static final String LEGACY_FONTS_XML = "/system/etc/fonts.xml";
 
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
     /**
      * A {@link UpdatableFontDir.FontFileParser} for testing. Instead of using real font files,
      * this test uses fake font files. A fake font file has its PostScript naem and revision as the
@@ -999,6 +1008,587 @@
         assertThat(mUpdatableFontFilesDir.list()).hasLength(0);
     }
 
+    private UpdatableFontDir createNewUpdateDir() {
+        UpdatableFontDir dir = new UpdatableFontDir(
+                mUpdatableFontFilesDir, mParser, mFakeFsverityUtil,
+                mConfigFile, mCurrentTimeSupplier, mConfigSupplier);
+        dir.loadFontFileMap();
+        return dir;
+    }
+
+    private UpdatableFontDir installTestFontFamilies(int version) {
+        UpdatableFontDir dir = createNewUpdateDir();
+        try {
+            dir.update(Arrays.asList(
+                    newFontUpdateRequest("foo.ttf," + version + ",foo", GOOD_SIGNATURE),
+                    newFontUpdateRequest("bar.ttf," + version + ",bar", GOOD_SIGNATURE),
+                    newAddFontFamilyRequest("<family name='foobar'>"
+                            + "  <font>foo.ttf</font>"
+                            + "  <font>bar.ttf</font>"
+                            + "</family>")));
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return dir;
+    }
+
+    private UpdatableFontDir installTestFontFile(int numFonts, int version) {
+        UpdatableFontDir dir = createNewUpdateDir();
+        List<FontUpdateRequest> requests = new ArrayList<>();
+        if (numFonts <= 0 || numFonts > 3) {
+            throw new IllegalArgumentException("numFont must be 1, 2 or 3");
+        }
+        try {
+            requests.add(newFontUpdateRequest("foo.ttf," + version + ",foo", GOOD_SIGNATURE));
+            if (numFonts >= 2) {
+                requests.add(newFontUpdateRequest("bar.ttf," + version + ",bar", GOOD_SIGNATURE));
+            }
+            if (numFonts == 3) {
+                requests.add(newFontUpdateRequest("baz.ttf," + version + ",baz", GOOD_SIGNATURE));
+            }
+            dir.update(requests);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return dir;
+    }
+
+    private List<File> collectSignatureFiles() {
+        return Arrays.stream(mUpdatableFontFilesDir.listFiles())
+                .map((file) -> file.listFiles((unused, s) -> s.endsWith(".fsv_sig")))
+                .flatMap(Arrays::stream)
+                .toList();
+    }
+
+    private List<File> collectFontFiles() {
+        return Arrays.stream(mUpdatableFontFilesDir.listFiles())
+                .map((file) -> file.listFiles((unused, s) -> s.endsWith(".ttf")))
+                .flatMap(Arrays::stream)
+                .toList();
+    }
+
+    private void removeAll(List<File> files) {
+        files.forEach((File file) -> {
+            if (file.isDirectory()) {
+                removeAll(List.of(file.listFiles()));
+            } else {
+                assertThat(file.delete()).isTrue();
+            }
+        });
+    }
+
+    private void assertTestFontFamilyInstalled(UpdatableFontDir dir, int version) {
+        try {
+            assertNamedFamilyExists(dir.getSystemFontConfig(), "foobar");
+            assertThat(dir.getFontFamilyMap()).containsKey("foobar");
+            assertThat(dir.getFontFamilyMap().get("foobar").getFamilies().size()).isEqualTo(1);
+            FontConfig.FontFamily foobar = dir.getFontFamilyMap().get("foobar").getFamilies()
+                    .get(0);
+            assertThat(foobar.getFontList()).hasSize(2);
+            assertThat(foobar.getFontList().get(0).getFile())
+                    .isEqualTo(dir.getPostScriptMap().get("foo"));
+            assertThat(mParser.getRevision(dir.getPostScriptMap().get("foo"))).isEqualTo(version);
+            assertThat(foobar.getFontList().get(1).getFile())
+                    .isEqualTo(dir.getPostScriptMap().get("bar"));
+            assertThat(mParser.getRevision(dir.getPostScriptMap().get("bar"))).isEqualTo(version);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private void assertTestFontInstalled(UpdatableFontDir dir, int version) {
+        try {
+            assertThat(dir.getPostScriptMap().containsKey("foo")).isTrue();
+            assertThat(mParser.getRevision(dir.getPostScriptMap().get("foo"))).isEqualTo(version);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void signatureMissingCase_fontFamilyInstalled_fontFamilyInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1 /* version */);
+
+        // Delete one signature file
+        assertThat(collectSignatureFiles().get(0).delete()).isTrue();
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void signatureMissingCase_fontFamilyInstalled_fontInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1);
+
+        // Delete one signature file
+        assertThat(collectSignatureFiles().get(0).delete()).isTrue();
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(1 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void signatureMissingCase_fontFileInstalled_fontFamilyInstallLater() {
+        // Install font file, foo.ttf and bar.ttf
+        installTestFontFile(2 /* numFonts */, 1 /* version */);
+
+        // Delete one signature file
+        assertThat(collectSignatureFiles().get(0).delete()).isTrue();
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void signatureMissingCase_fontFileInstalled_fontFileInstallLater() {
+        // Install font file, foo.ttf and bar.ttf
+        installTestFontFile(2 /* numFonts */, 1 /* version */);
+
+        // Delete one signature file
+        assertThat(collectSignatureFiles().get(0).delete()).isTrue();
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(2 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void signatureAllMissingCase_fontFamilyInstalled_fontFamilyInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1 /* version */);
+
+        // Delete all signature files
+        removeAll(collectSignatureFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void signatureAllMissingCase_fontFamilyInstalled_fontInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1 /* version */);
+
+        // Delete all signature files
+        removeAll(collectSignatureFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(1 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void signatureAllMissingCase_fontFileInstalled_fontFamilyInstallLater() {
+        // Install font file, foo.ttf
+        installTestFontFile(1 /* numFonts */, 1 /* version */);
+
+        // Delete all signature files
+        removeAll(collectSignatureFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void signatureAllMissingCase_fontFileInstalled_fontFileInstallLater() {
+        // Install font file, foo.ttf
+        installTestFontFile(1 /* numFonts */, 1 /* version */);
+
+        // Delete all signature files
+        removeAll(collectSignatureFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(1 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontMissingCase_fontFamilyInstalled_fontFamilyInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1 /* version */);
+
+        // Delete one font file
+        assertThat(collectFontFiles().get(0).delete()).isTrue();
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontMissingCase_fontFamilyInstalled_fontInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1);
+
+        // Delete one font file
+        assertThat(collectFontFiles().get(0).delete()).isTrue();
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(1 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontMissingCase_fontFileInstalled_fontFamilyInstallLater() {
+        // Install font file, foo.ttf and bar.ttf
+        installTestFontFile(2 /* numFonts */, 1 /* version */);
+
+        // Delete one font file
+        assertThat(collectFontFiles().get(0).delete()).isTrue();
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontMissingCase_fontFileInstalled_fontFileInstallLater() {
+        // Install font file, foo.ttf and bar.ttf
+        installTestFontFile(2 /* numFonts */, 1 /* version */);
+
+        // Delete one font file
+        assertThat(collectFontFiles().get(0).delete()).isTrue();
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(2 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontAllMissingCase_fontFamilyInstalled_fontFamilyInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1 /* version */);
+
+        // Delete all font files
+        removeAll(collectFontFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontAllMissingCase_fontFamilyInstalled_fontInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1 /* version */);
+
+        // Delete all font files
+        removeAll(collectFontFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(1 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontAllMissingCase_fontFileInstalled_fontFamilyInstallLater() {
+        // Install font file, foo.ttf
+        installTestFontFile(1 /* numFonts */, 1 /* version */);
+
+        // Delete all font files
+        removeAll(collectFontFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontAllMissingCase_fontFileInstalled_fontFileInstallLater() {
+        // Install font file, foo.ttf
+        installTestFontFile(1 /* numFonts */, 1 /* version */);
+
+        // Delete all font files
+        removeAll(collectFontFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(1 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontDirAllMissingCase_fontFamilyInstalled_fontFamilyInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1 /* version */);
+
+        // Delete all font files
+        removeAll(List.of(mUpdatableFontFilesDir.listFiles()));
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontDirAllMissingCase_fontFamilyInstalled_fontInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1 /* version */);
+
+        // Delete all font files
+        removeAll(List.of(mUpdatableFontFilesDir.listFiles()));
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(1 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontDirAllMissingCase_fontFileInstalled_fontFamilyInstallLater() {
+        // Install font file, foo.ttf
+        installTestFontFile(1 /* numFonts */, 1 /* version */);
+
+        // Delete all font files
+        removeAll(List.of(mUpdatableFontFilesDir.listFiles()));
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void fontDirAllMissingCase_fontFileInstalled_fontFileInstallLater() {
+        // Install font file, foo.ttf
+        installTestFontFile(1 /* numFonts */, 1 /* version */);
+
+        // Delete all font files
+        removeAll(List.of(mUpdatableFontFilesDir.listFiles()));
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(1 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void dirContentAllMissingCase_fontFamilyInstalled_fontFamilyInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1 /* version */);
+
+        // Delete all font files
+        removeAll(collectFontFiles());
+        removeAll(collectSignatureFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void dirContentAllMissingCase_fontFamilyInstalled_fontInstallLater() {
+        // Install font families, foo.ttf, bar.ttf.
+        installTestFontFamilies(1 /* version */);
+
+        // Delete all font files
+        removeAll(collectFontFiles());
+        removeAll(collectSignatureFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(1 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void dirContentAllMissingCase_fontFileInstalled_fontFamilyInstallLater() {
+        // Install font file, foo.ttf
+        installTestFontFile(1 /* numFonts */, 1 /* version */);
+
+        // Delete all font files
+        removeAll(collectFontFiles());
+        removeAll(collectSignatureFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFamilies(2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontFamilyInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontFamilyInstalled(nextDir, 2 /* version */);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_FIX_FONT_UPDATE_FAILURE)
+    public void dirContentAllMissingCase_fontFileInstalled_fontFileInstallLater() {
+        // Install font file, foo.ttf
+        installTestFontFile(1 /* numFonts */, 1 /* version */);
+
+        // Delete all font files
+        removeAll(collectFontFiles());
+        removeAll(collectSignatureFiles());
+
+        // New instance of UpdatableFontDir, this emulate a device reboot.
+        UpdatableFontDir dir = installTestFontFile(1 /* numFonts */, 2 /* version */);
+
+        // Make sure the font installation succeeds.
+        assertTestFontInstalled(dir, 2 /* version */);
+
+        // Make sure after the reboot, the configuration remains.
+        UpdatableFontDir nextDir = createNewUpdateDir();
+        assertTestFontInstalled(nextDir, 2 /* version */);
+    }
+
     private FontUpdateRequest newFontUpdateRequest(String content, String signature)
             throws Exception {
         File file = File.createTempFile("font", "ttf", mCacheDir);
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
index 1bd6e29..28da97c 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
@@ -21,6 +21,9 @@
 import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
 import static com.android.server.hdmi.Constants.ADDR_INVALID;
 import static com.android.server.hdmi.Constants.ADDR_TV;
+import static com.android.server.hdmi.HdmiCecLocalDevicePlayback.POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS;
+import static com.android.server.hdmi.HdmiCecLocalDevicePlayback.STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS;
+import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_BOOT_UP;
 import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -58,7 +61,9 @@
 public class HdmiCecLocalDevicePlaybackTest {
     private static final int TIMEOUT_MS = HdmiConfig.TIMEOUT_MS + 1;
     private static final int HOTPLUG_INTERVAL =
-            HotplugDetectionAction.POLLING_INTERVAL_MS_FOR_PLAYBACK;
+            HotplugDetectionAction.POLLING_BATCH_INTERVAL_MS_FOR_PLAYBACK;
+    private static final long POLLING_DELAY =
+            HotplugDetectionAction.POLLING_MESSAGE_INTERVAL_MS_FOR_PLAYBACK;
 
     private static final int PORT_1 = 1;
     private static final HdmiDeviceInfo INFO_TV = HdmiDeviceInfo.cecDeviceBuilder()
@@ -87,6 +92,8 @@
     private FakePowerManagerInternalWrapper mPowerManagerInternal =
             new FakePowerManagerInternalWrapper();
 
+    private boolean mIsOnActiveSourceLostPopupActive;
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
@@ -141,6 +148,18 @@
                 mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter());
         mHdmiControlService.setCecController(mHdmiCecController);
         mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
+        mHdmiCecLocalDevicePlayback = new HdmiCecLocalDevicePlayback(mHdmiControlService) {
+            @Override
+            void startHdmiCecActiveSourceLostActivity() {
+                mIsOnActiveSourceLostPopupActive = true;
+            }
+
+            @Override
+            void dismissUiOnActiveSourceStatusRecovered() {
+                mIsOnActiveSourceLostPopupActive = false;
+            }
+        };
+        mHdmiCecLocalDevicePlayback.init();
         HdmiPortInfo[] hdmiPortInfos = new HdmiPortInfo[1];
         hdmiPortInfos[0] =
                 new HdmiPortInfo.Builder(1, HdmiPortInfo.PORT_OUTPUT, 0x0000)
@@ -158,14 +177,15 @@
         mPlaybackPhysicalAddress = 0x2000;
         mNativeWrapper.setPhysicalAddress(mPlaybackPhysicalAddress);
         mTestLooper.dispatchAll();
-        mHdmiCecLocalDevicePlayback = mHdmiControlService.playback();
         mLocalDevices.add(mHdmiCecLocalDevicePlayback);
-        mPlaybackLogicalAddress = mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress();
         mHdmiControlService.getHdmiCecNetwork().addCecDevice(INFO_TV);
         mNativeWrapper.clearResultMessages();
         mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
                 HdmiProperties.playback_device_action_on_routing_control_values.NONE;
         mHdmiControlService.setPowerStatus(HdmiControlManager.POWER_STATUS_ON);
+        mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_BOOT_UP);
+        mTestLooper.dispatchAll();
+        mPlaybackLogicalAddress = mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress();
     }
 
     @Test
@@ -379,6 +399,8 @@
         assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
                 .isEqualTo(Constants.HANDLED);
         assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
+        // After 30s of device inactivity, device would go to sleep.
+        skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
         assertThat(mPowerManager.isInteractive()).isFalse();
     }
 
@@ -420,6 +442,8 @@
         assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
                 .isEqualTo(Constants.HANDLED);
         assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
+        // After 30s of device inactivity, device would go to sleep.
+        skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
         assertThat(mPowerManager.isInteractive()).isFalse();
     }
 
@@ -578,6 +602,8 @@
         assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
                 .isEqualTo(Constants.HANDLED);
         assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
+        // After 30s of device inactivity, device would go to sleep.
+        skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
         assertThat(mPowerManager.isInteractive()).isFalse();
     }
 
@@ -681,6 +707,8 @@
         // See {@link HdmiCecLocalDevicePlayback#handleRoutingChangeAndInformation}.
         assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
                 ADDR_INVALID);
+        // After 30s of device inactivity, device would go to sleep.
+        skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
         assertThat(mPowerManager.isInteractive()).isFalse();
     }
 
@@ -1223,6 +1251,9 @@
         assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message))
                 .isEqualTo(Constants.HANDLED);
         mTestLooper.dispatchAll();
+
+        // After 30s of device inactivity, device would go to sleep.
+        skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
         assertThat(mPowerManager.isInteractive()).isFalse();
         assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
     }
@@ -1297,6 +1328,8 @@
         assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message2))
                 .isEqualTo(Constants.HANDLED);
         assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
+        // After 30s of device inactivity, device would go to sleep.
+        skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
         assertThat(mPowerManager.isInteractive()).isFalse();
         mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
         // 3. DUT becomes <AS> again.
@@ -1657,6 +1690,9 @@
         assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message))
                 .isEqualTo(Constants.HANDLED);
         assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
+
+        // After 30s of device inactivity, device would go to sleep.
+        skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
         assertThat(mPowerManager.isInteractive()).isFalse();
     }
 
@@ -1867,9 +1903,14 @@
 
         mNativeWrapper.setPollAddressResponse(otherPlaybackLogicalAddress,
                 SendMessageResult.SUCCESS);
+        // Moving forward to skip hotplug interval for polling to start
         mTestLooper.moveTimeForward(HOTPLUG_INTERVAL);
         mTestLooper.dispatchAll();
-
+        // Skipping each polling delay and dispatch each polling message
+        for (int i = 0; i < 14; i++) {
+            mTestLooper.moveTimeForward(POLLING_DELAY);
+            mTestLooper.dispatchAll();
+        }
         // Check for <Give Physical Address> being sent to the newly discovered device.
         // This message is sent as part of the HotplugDetectionAction to available devices.
         HdmiCecMessage givePhysicalAddress = HdmiCecMessageBuilder.buildGivePhysicalAddress(
@@ -2248,6 +2289,159 @@
     }
 
     @Test
+    public void onActiveSourceLostToTv_noInteractionWithDut_standbyAfterTimeout() {
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
+
+        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
+                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
+        mPowerManager.setInteractive(true);
+        mNativeWrapper.clearResultMessages();
+        mTestLooper.dispatchAll();
+
+        HdmiCecMessage activeSourceFromTv =
+                HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
+
+        assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(activeSourceFromTv))
+                .isEqualTo(Constants.HANDLED);
+        assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(ADDR_TV);
+        mTestLooper.dispatchAll();
+
+        // After 30s of device inactivity, device would go to sleep.
+        skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+        assertThat(mPowerManager.isInteractive()).isFalse();
+    }
+
+    @Test
+    public void onActiveSourceLost_interactionWithDut_noStandbyAfterTimeout() {
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
+        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
+                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
+        mPowerManager.setInteractive(true);
+        mNativeWrapper.clearResultMessages();
+        mTestLooper.dispatchAll();
+
+        HdmiCecMessage activeSourceFromTv =
+                HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
+        HdmiCecMessage activeSourceFromPlayback =
+                HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
+                        mPlaybackPhysicalAddress);
+
+        assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(activeSourceFromTv))
+                .isEqualTo(Constants.HANDLED);
+        assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(ADDR_TV);
+        mTestLooper.dispatchAll();
+
+        // User interacted with the DUT, so the device will not go to standby.
+        skipActiveSourceLostUi(0);
+        assertThat(mIsOnActiveSourceLostPopupActive).isFalse();
+        assertThat(mPowerManager.isInteractive()).isTrue();
+        assertThat(mNativeWrapper.getResultMessages().contains(activeSourceFromPlayback)).isTrue();
+        assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress)
+                .isEqualTo(mPlaybackLogicalAddress);
+        assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress)
+                .isEqualTo(mPlaybackPhysicalAddress);
+    }
+
+    @Test
+    public void onActiveSourceLost_incomingSetStreamPathToDut_noStandbyAfterTimeout() {
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
+        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
+                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
+        mPowerManager.setInteractive(true);
+        mNativeWrapper.clearResultMessages();
+        mTestLooper.dispatchAll();
+
+        HdmiCecMessage activeSourceFromTv =
+                HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
+        HdmiCecMessage activeSourceFromPlayback =
+                HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
+                        mPlaybackPhysicalAddress);
+        HdmiCecMessage setStreamPathToPlayback = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV,
+                mPlaybackPhysicalAddress);
+
+        assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(activeSourceFromTv))
+                .isEqualTo(Constants.HANDLED);
+        assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(ADDR_TV);
+        mTestLooper.dispatchAll();
+
+        // Pop-up is triggered.
+        mTestLooper.moveTimeForward(POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+        mTestLooper.dispatchAll();
+        assertThat(mIsOnActiveSourceLostPopupActive).isTrue();
+
+        assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(setStreamPathToPlayback))
+                .isEqualTo(Constants.HANDLED);
+        mTestLooper.dispatchAll();
+
+        assertThat(mIsOnActiveSourceLostPopupActive).isFalse();
+        assertThat(mNativeWrapper.getResultMessages().contains(activeSourceFromPlayback)).isTrue();
+        assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress)
+                .isEqualTo(mPlaybackLogicalAddress);
+        assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress)
+                .isEqualTo(mPlaybackPhysicalAddress);
+        mTestLooper.moveTimeForward(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+        mTestLooper.dispatchAll();
+
+        assertThat(mPowerManager.isInteractive()).isTrue();
+    }
+
+    @Test
+    public void onActiveSourceLost_incomingRoutingChangeToDut_noStandbyAfterTimeout() {
+        mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+                HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+                HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
+        mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
+                HdmiProperties
+                        .playback_device_action_on_routing_control_values
+                        .WAKE_UP_AND_SEND_ACTIVE_SOURCE;
+        mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
+                mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
+        mPowerManager.setInteractive(true);
+        mNativeWrapper.clearResultMessages();
+        mTestLooper.dispatchAll();
+
+        HdmiCecMessage activeSourceFromTv =
+                HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
+        HdmiCecMessage activeSourceFromPlayback =
+                HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
+                        mPlaybackPhysicalAddress);
+        HdmiCecMessage routingChangeToPlayback =
+                HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
+                        mPlaybackPhysicalAddress);
+
+        assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(activeSourceFromTv))
+                .isEqualTo(Constants.HANDLED);
+        assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(ADDR_TV);
+        mTestLooper.dispatchAll();
+
+        // Pop-up is triggered.
+        mTestLooper.moveTimeForward(POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+        mTestLooper.dispatchAll();
+        assertThat(mIsOnActiveSourceLostPopupActive).isTrue();
+
+        assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(routingChangeToPlayback))
+                .isEqualTo(Constants.HANDLED);
+        mTestLooper.dispatchAll();
+
+        assertThat(mIsOnActiveSourceLostPopupActive).isFalse();
+        assertThat(mNativeWrapper.getResultMessages().contains(activeSourceFromPlayback)).isTrue();
+        assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress)
+                .isEqualTo(mPlaybackLogicalAddress);
+        assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress)
+                .isEqualTo(mPlaybackPhysicalAddress);
+        mTestLooper.moveTimeForward(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+        mTestLooper.dispatchAll();
+
+        assertThat(mPowerManager.isInteractive()).isTrue();
+    }
+
+    @Test
     public void handleRoutingChange_addressNotAllocated_removeActiveSourceAction() {
         long allocationDelay = TimeUnit.SECONDS.toMillis(60);
         mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
@@ -2353,4 +2547,14 @@
         assertThat(mHdmiCecLocalDevicePlayback.getActions(ActiveSourceAction.class)).isEmpty();
         assertThat(mNativeWrapper.getResultMessages()).doesNotContain(unexpectedMessage);
     }
+
+    private void skipActiveSourceLostUi(long idleDuration) {
+        mTestLooper.moveTimeForward(POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+        mTestLooper.dispatchAll();
+        assertThat(mIsOnActiveSourceLostPopupActive).isTrue();
+
+        mPowerManagerInternal.setIdleDuration(idleDuration);
+        mTestLooper.moveTimeForward(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+        mTestLooper.dispatchAll();
+    }
 }
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 67ae998..902ffed 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
@@ -829,8 +829,8 @@
         // Playback 1 begins ACKing polls, allowing detection by HotplugDetectionAction
         mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_1, SendMessageResult.SUCCESS);
         for (int pollCount = 0; pollCount < HotplugDetectionAction.TIMEOUT_COUNT; pollCount++) {
-            mTestLooper.moveTimeForward(
-                    TimeUnit.SECONDS.toMillis(HotplugDetectionAction.POLLING_INTERVAL_MS_FOR_TV));
+            mTestLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(
+                    HotplugDetectionAction.POLLING_BATCH_INTERVAL_MS_FOR_TV));
             mTestLooper.dispatchAll();
         }
 
@@ -872,7 +872,7 @@
         // Assert that this device is removed from the list of devices.
         mNativeWrapper.setPollAddressResponse(Constants.ADDR_PLAYBACK_2, SendMessageResult.NACK);
         for (int pollCount = 0; pollCount < HotplugDetectionAction.TIMEOUT_COUNT; pollCount++) {
-            mTestLooper.moveTimeForward(HotplugDetectionAction.POLLING_INTERVAL_MS_FOR_TV);
+            mTestLooper.moveTimeForward(HotplugDetectionAction.POLLING_BATCH_INTERVAL_MS_FOR_TV);
             mTestLooper.dispatchAll();
         }
 
@@ -920,7 +920,7 @@
         // Assert that this device is removed from the list of devices.
         mNativeWrapper.setPollAddressResponse(ADDR_AUDIO_SYSTEM, SendMessageResult.NACK);
         for (int pollCount = 0; pollCount < HotplugDetectionAction.TIMEOUT_COUNT; pollCount++) {
-            mTestLooper.moveTimeForward(HotplugDetectionAction.POLLING_INTERVAL_MS_FOR_TV);
+            mTestLooper.moveTimeForward(HotplugDetectionAction.POLLING_BATCH_INTERVAL_MS_FOR_TV);
             mTestLooper.dispatchAll();
         }
 
diff --git a/services/tests/servicestests/src/com/android/server/location/contexthub/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/location/contexthub/TEST_MAPPING
index 6035250..58f5bb3 100644
--- a/services/tests/servicestests/src/com/android/server/location/contexthub/TEST_MAPPING
+++ b/services/tests/servicestests/src/com/android/server/location/contexthub/TEST_MAPPING
@@ -1,21 +1,7 @@
 {
   "presubmit": [
     {
-      "name": "FrameworksServicesTests",
-      "options": [
-        {
-          "include-filter": "com.android.server.location.contexthub."
-        },
-        {
-          "include-annotation": "android.platform.test.annotations.Presubmit"
-        },
-        {
-          "exclude-annotation": "androidx.test.filters.FlakyTest"
-        },
-        {
-          "exclude-annotation": "org.junit.Ignore"
-        }
-      ]
+      "name": "FrameworksServicesTests_contexthub_presubmit"
     }
   ],
   "postsubmit": [
@@ -26,6 +12,8 @@
           "include-filter": "com.android.server.location.contexthub."
         },
         {
+          // I believe this include annotation is preventing tests from being run
+          // as there are no matching tests with the Postsubmit annotation.
           "include-annotation": "android.platform.test.annotations.Postsubmit"
         },
         {
diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
index 1249707..3cab75b 100644
--- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
@@ -2315,10 +2315,11 @@
         }
         waitForUidEventHandlerIdle();
         try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
-            // Doesn't cross any other threshold.
+            // Doesn't cross any threshold, but changes below TOP_THRESHOLD_STATE should always
+            // be processed
             callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE - 1, testProcStateSeq++,
                     PROCESS_CAPABILITY_NONE);
-            assertFalse(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
+            assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
         }
         waitForUidEventHandlerIdle();
     }
@@ -2349,21 +2350,21 @@
         int testProcStateSeq = 0;
         try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
             // First callback for uid.
-            callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
+            callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++,
                     PROCESS_CAPABILITY_NONE);
             assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
         }
         waitForUidEventHandlerIdle();
         try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
             // The same process-state with one network capability added.
-            callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
+            callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++,
                     PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK);
             assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
         }
         waitForUidEventHandlerIdle();
         try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
             // The same process-state with another network capability added.
-            callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
+            callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++,
                     PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK
                             | PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK);
             assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
@@ -2371,11 +2372,21 @@
         waitForUidEventHandlerIdle();
         try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
             // The same process-state with all capabilities, but no change in network capabilities.
-            callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
+            callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++,
                     PROCESS_CAPABILITY_ALL);
             assertFalse(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
         }
         waitForUidEventHandlerIdle();
+
+        callAndWaitOnUidStateChanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
+                PROCESS_CAPABILITY_ALL);
+        try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
+            // No change in capabilities, but TOP_THRESHOLD_STATE change should always be processed.
+            callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
+                    PROCESS_CAPABILITY_ALL);
+            assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
+        }
+        waitForUidEventHandlerIdle();
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/om/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/om/TEST_MAPPING
index 558e259..944c1df 100644
--- a/services/tests/servicestests/src/com/android/server/om/TEST_MAPPING
+++ b/services/tests/servicestests/src/com/android/server/om/TEST_MAPPING
@@ -1,12 +1,7 @@
 {
   "presubmit": [
     {
-      "name": "FrameworksServicesTests",
-      "options": [
-        {
-          "include-filter": "com.android.server.om."
-        }
-      ]
+      "name": "FrameworksServicesTests_om"
     },
     {
       "name": "PackageManagerServiceHostTests",
diff --git a/services/tests/servicestests/src/com/android/server/os/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/os/TEST_MAPPING
index 5a46f8c4..2138da9 100644
--- a/services/tests/servicestests/src/com/android/server/os/TEST_MAPPING
+++ b/services/tests/servicestests/src/com/android/server/os/TEST_MAPPING
@@ -1,12 +1,7 @@
 {
   "presubmit": [
     {
-      "name": "FrameworksServicesTests",
-      "options": [
-        {
-          "include-filter": "com.android.server.os."
-        }
-      ]
+      "name": "FrameworksServicesTests_os"
     }
   ]
 }
diff --git a/services/tests/servicestests/src/com/android/server/pm/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/pm/TEST_MAPPING
index 85a73bb..861562d 100644
--- a/services/tests/servicestests/src/com/android/server/pm/TEST_MAPPING
+++ b/services/tests/servicestests/src/com/android/server/pm/TEST_MAPPING
@@ -20,21 +20,13 @@
   ],
   "postsubmit": [
     {
-      "name": "FrameworksServicesTests",
-      "options": [
-        {
-          "include-filter": "com.android.server.pm."
-        },
-        {
-          "include-annotation": "android.platform.test.annotations.Postsubmit"
-        },
-        {
-          "exclude-annotation": "androidx.test.filters.FlakyTest"
-        },
-        {
-          "exclude-annotation": "org.junit.Ignore"
-        }
-      ]
+      // Presubmit is intentional here while testing with SLO checker.
+      // Tests are flaky, waiting to bypass.
+      "name": "FrameworksServicesTests_pm_presubmit"
+    },
+    {
+      // Leave postsubmit here when migrating
+      "name": "FrameworksServicesTests_pm_postsubmit"
     }
   ]
 }
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java b/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java
index 43bf537..72caae3 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java
@@ -242,7 +242,7 @@
     private void stopUser(int userId) throws RemoteException, InterruptedException {
         runWithLatch("stop user", countDownLatch -> {
             ActivityManager.getService()
-                    .stopUser(userId, /* force= */ true, new IStopUserCallback.Stub() {
+                    .stopUserWithCallback(userId, new IStopUserCallback.Stub() {
                         @Override
                         public void userStopped(int userId) {
                             countDownLatch.countDown();
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
index 1591a96..b91ef7c 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
@@ -180,25 +180,26 @@
 
         // Test that only one clone user can be created
         final int mainUserId = mainUser.getIdentifier();
-        UserInfo userInfo = createProfileForUser("Clone user1",
+        UserInfo cloneProfileUser = createProfileForUser("Clone user1",
                 UserManager.USER_TYPE_PROFILE_CLONE,
                 mainUserId);
-        assertThat(userInfo).isNotNull();
-        UserInfo userInfo2 = createProfileForUser("Clone user2",
+        assertThat(cloneProfileUser).isNotNull();
+        UserInfo cloneProfileUser2 = createProfileForUser("Clone user2",
                 UserManager.USER_TYPE_PROFILE_CLONE,
                 mainUserId);
-        assertThat(userInfo2).isNull();
+        assertThat(cloneProfileUser2).isNull();
 
-        final Context userContext = mContext.createPackageContextAsUser("system", 0,
-                UserHandle.of(userInfo.id));
-        assertThat(userContext.getSystemService(
+        final Context profileUserContest = mContext.createPackageContextAsUser("system", 0,
+                UserHandle.of(cloneProfileUser.id));
+        final UserManager profileUM = UserManager.get(profileUserContest);
+        assertThat(profileUserContest.getSystemService(
                 UserManager.class).isMediaSharedWithParent()).isTrue();
-        assertThat(Settings.Secure.getInt(userContext.getContentResolver(),
+        assertThat(Settings.Secure.getInt(profileUserContest.getContentResolver(),
                 Settings.Secure.USER_SETUP_COMPLETE, 0)).isEqualTo(1);
 
         List<UserInfo> list = mUserManager.getUsers();
         List<UserInfo> cloneUsers = list.stream().filter(
-                user -> (user.id == userInfo.id && user.name.equals("Clone user1")
+                user -> (user.id == cloneProfileUser.id && user.name.equals("Clone user1")
                         && user.isCloneProfile()))
                 .collect(Collectors.toList());
         assertThat(cloneUsers.size()).isEqualTo(1);
@@ -206,7 +207,7 @@
         // Check that the new clone user has the expected properties (relative to the defaults)
         // provided that the test caller has the necessary permissions.
         UserProperties cloneUserProperties =
-                mUserManager.getUserProperties(UserHandle.of(userInfo.id));
+                mUserManager.getUserProperties(UserHandle.of(cloneProfileUser.id));
         assertThat(typeProps.getUseParentsContacts())
                 .isEqualTo(cloneUserProperties.getUseParentsContacts());
         assertThat(typeProps.getShowInLauncher())
@@ -226,15 +227,15 @@
         assertThrows(SecurityException.class, cloneUserProperties::getAlwaysVisible);
         assertThat(typeProps.getProfileApiVisibility()).isEqualTo(
                 cloneUserProperties.getProfileApiVisibility());
-        compareDrawables(mUserManager.getUserBadge(),
+        compareDrawables(profileUM.getUserBadge(),
                 Resources.getSystem().getDrawable(userTypeDetails.getBadgePlain()));
 
         // Verify clone user parent
         assertThat(mUserManager.getProfileParent(mainUserId)).isNull();
-        UserInfo parentProfileInfo = mUserManager.getProfileParent(userInfo.id);
+        UserInfo parentProfileInfo = mUserManager.getProfileParent(cloneProfileUser.id);
         assertThat(parentProfileInfo).isNotNull();
         assertThat(mainUserId).isEqualTo(parentProfileInfo.id);
-        removeUser(userInfo.id);
+        removeUser(cloneProfileUser.id);
         assertThat(mUserManager.getProfileParent(mainUserId)).isNull();
     }
 
@@ -322,19 +323,22 @@
 
         // Test that only one private profile  can be created
         final int mainUserId = mainUser.getIdentifier();
-        UserInfo userInfo = createProfileForUser("Private profile1",
+        UserInfo privateProfileUser = createProfileForUser("Private profile1",
                 UserManager.USER_TYPE_PROFILE_PRIVATE,
                 mainUserId);
-        assertThat(userInfo).isNotNull();
-        UserInfo userInfo2 = createProfileForUser("Private profile2",
+        assertThat(privateProfileUser).isNotNull();
+        UserInfo privateProfileUser2 = createProfileForUser("Private profile2",
                 UserManager.USER_TYPE_PROFILE_PRIVATE,
                 mainUserId);
-        assertThat(userInfo2).isNull();
+        assertThat(privateProfileUser2).isNull();
+        final UserManager profileUM = UserManager.get(
+                mContext.createPackageContextAsUser("android", 0,
+                        UserHandle.of(privateProfileUser.id)));
 
         // Check that the new private profile has the expected properties (relative to the defaults)
         // provided that the test caller has the necessary permissions.
         UserProperties privateProfileUserProperties =
-                mUserManager.getUserProperties(UserHandle.of(userInfo.id));
+                mUserManager.getUserProperties(UserHandle.of(privateProfileUser.id));
         assertThat(typeProps.getShowInLauncher())
                 .isEqualTo(privateProfileUserProperties.getShowInLauncher());
         assertThrows(SecurityException.class, privateProfileUserProperties::getStartWithParent);
@@ -356,17 +360,17 @@
                 privateProfileUserProperties.getProfileApiVisibility());
         assertThat(typeProps.areItemsRestrictedOnHomeScreen())
                 .isEqualTo(privateProfileUserProperties.areItemsRestrictedOnHomeScreen());
-        compareDrawables(mUserManager.getUserBadge(),
+        compareDrawables(profileUM.getUserBadge(),
                 Resources.getSystem().getDrawable(userTypeDetails.getBadgePlain()));
 
         // Verify private profile parent
         assertThat(mUserManager.getProfileParent(mainUserId)).isNull();
-        UserInfo parentProfileInfo = mUserManager.getProfileParent(userInfo.id);
+        UserInfo parentProfileInfo = mUserManager.getProfileParent(privateProfileUser.id);
         assertThat(parentProfileInfo).isNotNull();
         assertThat(mainUserId).isEqualTo(parentProfileInfo.id);
-        removeUser(userInfo.id);
+        removeUser(privateProfileUser.id);
         assertThat(mUserManager.getProfileParent(mainUserId)).isNull();
-        assertThat(mUserManager.getProfileLabel()).isEqualTo(
+        assertThat(profileUM.getProfileLabel()).isEqualTo(
                 Resources.getSystem().getString(userTypeDetails.getLabel(0)));
     }
 
@@ -964,10 +968,13 @@
         assertThat(userTypeDetails.getName()).isEqualTo(UserManager.USER_TYPE_PROFILE_MANAGED);
 
         int mainUserId = mUserManager.getMainUser().getIdentifier();
-        UserInfo userInfo = createProfileForUser("Managed",
+        UserInfo managedProfileUser = createProfileForUser("Managed",
                 UserManager.USER_TYPE_PROFILE_MANAGED, mainUserId);
-        assertThat(userInfo).isNotNull();
-        final int userId = userInfo.id;
+        assertThat(managedProfileUser).isNotNull();
+        final int userId = managedProfileUser.id;
+        final UserManager profileUM = UserManager.get(
+                mContext.createPackageContextAsUser("android", 0,
+                        UserHandle.of(managedProfileUser.id)));
 
         assertThat(mUserManager.hasBadge(userId)).isEqualTo(userTypeDetails.hasBadge());
         assertThat(mUserManager.getUserIconBadgeResId(userId))
@@ -978,10 +985,10 @@
                 .isEqualTo(userTypeDetails.getBadgeNoBackground());
         assertThat(mUserManager.getUserStatusBarIconResId(userId))
                 .isEqualTo(userTypeDetails.getStatusBarIcon());
-        compareDrawables(mUserManager.getUserBadge(),
+        compareDrawables(profileUM.getUserBadge(),
                 Resources.getSystem().getDrawable(userTypeDetails.getBadgePlain()));
 
-        final int badgeIndex = userInfo.profileBadge;
+        final int badgeIndex = managedProfileUser.profileBadge;
         assertThat(mUserManager.getUserBadgeColor(userId)).isEqualTo(
                 Resources.getSystem().getColor(userTypeDetails.getBadgeColor(badgeIndex), null));
         assertThat(mUserManager.getUserBadgeDarkColor(userId)).isEqualTo(
@@ -1013,10 +1020,10 @@
 
         // Create an actual user (of this user type) and get its properties.
         int mainUserId = mUserManager.getMainUser().getIdentifier();
-        final UserInfo userInfo = createProfileForUser("Managed",
+        final UserInfo managedProfileUser = createProfileForUser("Managed",
                 UserManager.USER_TYPE_PROFILE_MANAGED, mainUserId);
-        assertThat(userInfo).isNotNull();
-        final int userId = userInfo.id;
+        assertThat(managedProfileUser).isNotNull();
+        final int userId = managedProfileUser.id;
         final UserProperties userProps = mUserManager.getUserProperties(UserHandle.of(userId));
 
         // Check that this new user has the expected properties (relative to the defaults)
@@ -1249,6 +1256,30 @@
 
     @MediumTest
     @Test
+    public void testDefaultUserRestrictionsForPrivateProfile() {
+        assumeTrue(mUserManager.canAddPrivateProfile());
+        final int currentUserId = ActivityManager.getCurrentUser();
+        UserInfo privateProfileInfo = null;
+        try {
+            privateProfileInfo = createProfileForUser("Private",
+                    UserManager.USER_TYPE_PROFILE_PRIVATE, currentUserId);
+            assertThat(privateProfileInfo).isNotNull();
+        } catch (Exception e) {
+            fail("Creation of private profile failed due to " + e.getMessage());
+        }
+        assertDefaultPrivateProfileRestrictions(privateProfileInfo.getUserHandle());
+    }
+
+    private void assertDefaultPrivateProfileRestrictions(UserHandle userHandle) {
+        Bundle defaultPrivateProfileRestrictions =
+                UserTypeFactory.getDefaultPrivateProfileRestrictions();
+        for (String restriction : defaultPrivateProfileRestrictions.keySet()) {
+            assertThat(mUserManager.hasUserRestrictionForUser(restriction, userHandle)).isTrue();
+        }
+    }
+
+    @MediumTest
+    @Test
     public void testAddRestrictedProfile() throws Exception {
         if (isAutomotive() || UserManager.isHeadlessSystemUserMode()) return;
         assertWithMessage("There should be no associated restricted profiles before the test")
diff --git a/services/tests/servicestests/src/com/android/server/power/hint/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/power/hint/TEST_MAPPING
index 2d5df07..874eec7 100644
--- a/services/tests/servicestests/src/com/android/server/power/hint/TEST_MAPPING
+++ b/services/tests/servicestests/src/com/android/server/power/hint/TEST_MAPPING
@@ -1,5 +1,5 @@
 {
-  "postsubmit": [
+  "presubmit": [
     {
       "name": "FrameworksServicesTests",
       "options": [
diff --git a/services/tests/servicestests/src/com/android/server/recoverysystem/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/recoverysystem/TEST_MAPPING
index e9d8b2e..eb7453d 100644
--- a/services/tests/servicestests/src/com/android/server/recoverysystem/TEST_MAPPING
+++ b/services/tests/servicestests/src/com/android/server/recoverysystem/TEST_MAPPING
@@ -1,15 +1,7 @@
 {
-    "presubmit": [
-        {
-            "name": "FrameworksServicesTests",
-            "options": [
-                {
-                    "include-filter": "com.android.server.recoverysystem."
-                },
-                {
-                    "exclude-annotation": "androidx.test.filters.FlakyTest"
-                }
-            ]
-        }
-    ]
-}
\ No newline at end of file
+  "presubmit": [
+    {
+      "name": "FrameworksServicesTests_recoverysystem"
+    }
+  ]
+}
diff --git a/services/tests/servicestests/src/com/android/server/tare/AnalystTest.java b/services/tests/servicestests/src/com/android/server/tare/AnalystTest.java
deleted file mode 100644
index a603b93..0000000
--- a/services/tests/servicestests/src/com/android/server/tare/AnalystTest.java
+++ /dev/null
@@ -1,272 +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.server.tare;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.app.IBatteryStats;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** Test that the Analyst processes transactions correctly. */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class AnalystTest {
-
-    @Test
-    public void testInitialState() {
-        final Analyst analyst = new Analyst();
-        assertEquals(0, analyst.getReports().size());
-    }
-
-    @Test
-    public void testBatteryLevelChange() {
-        final Analyst analyst = new Analyst();
-
-        Analyst.Report expected = new Analyst.Report();
-        expected.currentBatteryLevel = 75;
-        analyst.noteBatteryLevelChange(75);
-        assertEquals(1, analyst.getReports().size());
-        assertReportsEqual(expected, analyst.getReports().get(0));
-
-        // Discharging
-        analyst.noteBatteryLevelChange(54);
-        expected.currentBatteryLevel = 54;
-        expected.cumulativeBatteryDischarge = 21;
-        assertEquals(1, analyst.getReports().size());
-        assertReportsEqual(expected, analyst.getReports().get(0));
-        analyst.noteBatteryLevelChange(50);
-        expected.currentBatteryLevel = 50;
-        expected.cumulativeBatteryDischarge = 25;
-        assertEquals(1, analyst.getReports().size());
-        assertReportsEqual(expected, analyst.getReports().get(0));
-
-        // Charging
-        analyst.noteBatteryLevelChange(51);
-        expected.currentBatteryLevel = 51;
-        assertEquals(1, analyst.getReports().size());
-        assertReportsEqual(expected, analyst.getReports().get(0));
-        analyst.noteBatteryLevelChange(55);
-        expected.currentBatteryLevel = 55;
-        assertEquals(1, analyst.getReports().size());
-        assertReportsEqual(expected, analyst.getReports().get(0));
-
-        // Reset
-        analyst.noteBatteryLevelChange(100);
-        assertEquals(2, analyst.getReports().size());
-        assertReportsEqual(expected, analyst.getReports().get(0));
-        expected.currentBatteryLevel = 100;
-        expected.cumulativeBatteryDischarge = 0;
-        assertReportsEqual(expected, analyst.getReports().get(1));
-    }
-
-    @Test
-    public void testTransaction() {
-        runTestTransactions(new Analyst(), new Analyst.Report(), 1);
-    }
-
-    @Test
-    public void testTransaction_PeriodChange() throws Exception {
-        IBatteryStats iBatteryStats = mock(IBatteryStats.class);
-        final Analyst analyst = new Analyst(iBatteryStats);
-
-        // Reset from enough discharge.
-        Analyst.Report expected = new Analyst.Report();
-        expected.currentBatteryLevel = 75;
-        analyst.noteBatteryLevelChange(75);
-
-        runTestTransactions(analyst, expected, 1);
-
-        expected.currentBatteryLevel = 49;
-        expected.cumulativeBatteryDischarge = 26;
-        analyst.noteBatteryLevelChange(49);
-
-        runTestTransactions(analyst, expected, 1);
-
-        expected = new Analyst.Report();
-        expected.currentBatteryLevel = 90;
-        analyst.noteBatteryLevelChange(90);
-        expected.cumulativeBatteryDischarge = 0;
-
-        runTestTransactions(analyst, expected, 2);
-
-        // Reset from report being long enough.
-        doReturn(Analyst.MIN_REPORT_DURATION_FOR_RESET)
-                .when(iBatteryStats).computeBatteryScreenOffRealtimeMs();
-        expected.currentBatteryLevel = 85;
-        analyst.noteBatteryLevelChange(85);
-        expected.cumulativeBatteryDischarge = 5;
-        expected.screenOffDurationMs = Analyst.MIN_REPORT_DURATION_FOR_RESET;
-
-        runTestTransactions(analyst, expected, 2);
-
-        expected.currentBatteryLevel = 79;
-        analyst.noteBatteryLevelChange(79);
-        expected.cumulativeBatteryDischarge = 11;
-
-        runTestTransactions(analyst, expected, 2);
-
-        expected = new Analyst.Report();
-        expected.currentBatteryLevel = 80;
-        analyst.noteBatteryLevelChange(80);
-        expected.cumulativeBatteryDischarge = 0;
-        expected.screenOffDurationMs = 0;
-
-        runTestTransactions(analyst, expected, 3);
-    }
-
-    private void runTestTransactions(Analyst analyst, Analyst.Report lastExpectedReport,
-            int numExpectedReports) {
-        Analyst.Report expected = lastExpectedReport;
-
-        // Profit
-        analyst.noteTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_ACTION, null, -51, 1));
-        expected.cumulativeProfit += 50;
-        expected.numProfitableActions += 1;
-        assertEquals(numExpectedReports, analyst.getReports().size());
-        assertReportsEqual(expected, analyst.getReports().get(numExpectedReports - 1));
-
-        // Loss
-        analyst.noteTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_ACTION, null, -51, 100));
-        expected.cumulativeLoss += 49;
-        expected.numUnprofitableActions += 1;
-        assertEquals(numExpectedReports, analyst.getReports().size());
-        assertReportsEqual(expected, analyst.getReports().get(numExpectedReports - 1));
-
-        // Reward
-        analyst.noteTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REWARD, null, 51, 0));
-        expected.cumulativeRewards += 51;
-        expected.numRewards += 1;
-        assertEquals(numExpectedReports, analyst.getReports().size());
-        assertReportsEqual(expected, analyst.getReports().get(numExpectedReports - 1));
-
-        // Regulations
-        analyst.noteTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REGULATION, null, 25, 0));
-        expected.cumulativePositiveRegulations += 25;
-        expected.numPositiveRegulations += 1;
-        assertEquals(numExpectedReports, analyst.getReports().size());
-        assertReportsEqual(expected, analyst.getReports().get(numExpectedReports - 1));
-        analyst.noteTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REGULATION, null, -25, 0));
-        expected.cumulativeNegativeRegulations += 25;
-        expected.numNegativeRegulations += 1;
-        assertEquals(numExpectedReports, analyst.getReports().size());
-        assertReportsEqual(expected, analyst.getReports().get(numExpectedReports - 1));
-
-        // No-ops
-        analyst.noteTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_ACTION, null, -100, 100));
-        analyst.noteTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REGULATION, null, 0, 0));
-        analyst.noteTransaction(
-                new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REWARD, null, 0, 0));
-        assertEquals(numExpectedReports, analyst.getReports().size());
-    }
-
-    @Test
-    public void testLoadReports() {
-        final Analyst analyst = new Analyst();
-
-        List<Analyst.Report> expected = new ArrayList<>();
-        analyst.loadReports(expected);
-        assertReportListsEqual(expected, analyst.getReports());
-
-        Analyst.Report report1 = new Analyst.Report();
-        report1.cumulativeBatteryDischarge = 1;
-        report1.currentBatteryLevel = 2;
-        report1.cumulativeProfit = 3;
-        report1.numProfitableActions = 4;
-        report1.cumulativeLoss = 5;
-        report1.numUnprofitableActions = 6;
-        report1.cumulativeRewards = 7;
-        report1.numRewards = 8;
-        report1.cumulativePositiveRegulations = 9;
-        report1.numPositiveRegulations = 10;
-        report1.cumulativeNegativeRegulations = 11;
-        report1.numNegativeRegulations = 12;
-        expected.add(report1);
-        analyst.loadReports(expected);
-        assertReportListsEqual(expected, analyst.getReports());
-
-        Analyst.Report report2 = new Analyst.Report();
-        report2.cumulativeBatteryDischarge = 10;
-        report2.currentBatteryLevel = 20;
-        report2.cumulativeProfit = 30;
-        report2.numProfitableActions = 40;
-        report2.cumulativeLoss = 50;
-        report2.numUnprofitableActions = 60;
-        report2.cumulativeRewards = 70;
-        report2.numRewards = 80;
-        report2.cumulativePositiveRegulations = 90;
-        report2.numPositiveRegulations = 100;
-        report2.cumulativeNegativeRegulations = 110;
-        report2.numNegativeRegulations = 120;
-        expected.add(report2);
-        analyst.loadReports(expected);
-        assertReportListsEqual(expected, analyst.getReports());
-    }
-
-    private void assertReportsEqual(Analyst.Report expected, Analyst.Report actual) {
-        if (expected == null) {
-            assertNull(actual);
-            return;
-        }
-        assertNotNull(actual);
-        assertEquals(expected.cumulativeBatteryDischarge, actual.cumulativeBatteryDischarge);
-        assertEquals(expected.currentBatteryLevel, actual.currentBatteryLevel);
-        assertEquals(expected.cumulativeProfit, actual.cumulativeProfit);
-        assertEquals(expected.numProfitableActions, actual.numProfitableActions);
-        assertEquals(expected.cumulativeLoss, actual.cumulativeLoss);
-        assertEquals(expected.numUnprofitableActions, actual.numUnprofitableActions);
-        assertEquals(expected.cumulativeRewards, actual.cumulativeRewards);
-        assertEquals(expected.numRewards, actual.numRewards);
-        assertEquals(expected.cumulativePositiveRegulations, actual.cumulativePositiveRegulations);
-        assertEquals(expected.numPositiveRegulations, actual.numPositiveRegulations);
-        assertEquals(expected.cumulativeNegativeRegulations, actual.cumulativeNegativeRegulations);
-        assertEquals(expected.numNegativeRegulations, actual.numNegativeRegulations);
-        assertEquals(expected.screenOffDurationMs, actual.screenOffDurationMs);
-        assertEquals(expected.screenOffDischargeMah, actual.screenOffDischargeMah);
-    }
-
-    private void assertReportListsEqual(List<Analyst.Report> expected,
-            List<Analyst.Report> actual) {
-        if (expected == null) {
-            assertNull(actual);
-            return;
-        }
-        assertNotNull(actual);
-        assertEquals(expected.size(), actual.size());
-        for (int i = 0; i < expected.size(); ++i) {
-            assertReportsEqual(expected.get(i), actual.get(i));
-        }
-    }
-}
diff --git a/services/tests/servicestests/src/com/android/server/tare/LedgerTest.java b/services/tests/servicestests/src/com/android/server/tare/LedgerTest.java
deleted file mode 100644
index 54566c3..0000000
--- a/services/tests/servicestests/src/com/android/server/tare/LedgerTest.java
+++ /dev/null
@@ -1,376 +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.server.tare;
-
-import static android.text.format.DateUtils.HOUR_IN_MILLIS;
-import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
-
-import static com.android.server.tare.TareUtils.getCurrentTimeMillis;
-
-import static org.junit.Assert.assertEquals;
-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 android.util.SparseLongArray;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.time.Clock;
-import java.time.Duration;
-import java.time.ZoneOffset;
-import java.util.ArrayList;
-import java.util.List;
-
-/** Test that the ledger records transactions correctly. */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class LedgerTest {
-
-    @Before
-    public void setUp() {
-        TareUtils.sSystemClock = Clock.fixed(Clock.systemUTC().instant(), ZoneOffset.UTC);
-    }
-
-    private void shiftSystemTime(long incrementMs) {
-        TareUtils.sSystemClock =
-                Clock.offset(TareUtils.sSystemClock, Duration.ofMillis(incrementMs));
-    }
-
-    @Test
-    public void testInitialState() {
-        final Ledger ledger = new Ledger();
-        assertEquals(0, ledger.getCurrentBalance());
-        assertEquals(0, ledger.get24HourSum(0, 0));
-    }
-
-    @Test
-    public void testInitialization_FullLists() {
-        final long balance = 1234567890L;
-        List<Ledger.Transaction> transactions = new ArrayList<>();
-        List<Ledger.RewardBucket> rewardBuckets = new ArrayList<>();
-
-        final long now = getCurrentTimeMillis();
-        Ledger.Transaction secondTxn = null;
-        Ledger.RewardBucket remainingBucket = null;
-        for (int i = 0; i < Ledger.MAX_TRANSACTION_COUNT; ++i) {
-            final long start = now - 10 * HOUR_IN_MILLIS + i * MINUTE_IN_MILLIS;
-            Ledger.Transaction transaction = new Ledger.Transaction(
-                    start, start + MINUTE_IN_MILLIS, 1, null, 400, 0);
-            if (i == 1) {
-                secondTxn = transaction;
-            }
-            transactions.add(transaction);
-        }
-        for (int b = 0; b < Ledger.NUM_REWARD_BUCKET_WINDOWS; ++b) {
-            final long start = now - (Ledger.NUM_REWARD_BUCKET_WINDOWS - b) * 24 * HOUR_IN_MILLIS;
-            Ledger.RewardBucket rewardBucket = new Ledger.RewardBucket();
-            rewardBucket.startTimeMs = start;
-            for (int r = 0; r < 5; ++r) {
-                rewardBucket.cumulativeDelta.put(EconomicPolicy.TYPE_REWARD | r, b * start + r);
-            }
-            if (b == Ledger.NUM_REWARD_BUCKET_WINDOWS - 1) {
-                remainingBucket = rewardBucket;
-            }
-            rewardBuckets.add(rewardBucket);
-        }
-        final Ledger ledger = new Ledger(balance, transactions, rewardBuckets);
-        assertEquals(balance, ledger.getCurrentBalance());
-        assertEquals(transactions, ledger.getTransactions());
-        // Everything but the last bucket is old, so the returned list should only contain that
-        // bucket.
-        rewardBuckets.clear();
-        rewardBuckets.add(remainingBucket);
-        assertEquals(rewardBuckets, ledger.getRewardBuckets());
-
-        // Make sure the ledger can properly record new transactions.
-        final long start = now - MINUTE_IN_MILLIS;
-        final long delta = 400;
-        final Ledger.Transaction transaction = new Ledger.Transaction(
-                start, start + MINUTE_IN_MILLIS, EconomicPolicy.TYPE_REWARD | 1, null, delta, 0);
-        ledger.recordTransaction(transaction);
-        assertEquals(balance + delta, ledger.getCurrentBalance());
-        transactions = ledger.getTransactions();
-        assertEquals(secondTxn, transactions.get(0));
-        assertEquals(transaction, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 1));
-        final Ledger.RewardBucket rewardBucket = new Ledger.RewardBucket();
-        rewardBucket.startTimeMs = now;
-        rewardBucket.cumulativeDelta.put(EconomicPolicy.TYPE_REWARD | 1, delta);
-        rewardBuckets = ledger.getRewardBuckets();
-        assertRewardBucketsEqual(remainingBucket, rewardBuckets.get(0));
-        assertRewardBucketsEqual(rewardBucket, rewardBuckets.get(1));
-    }
-
-    @Test
-    public void testInitialization_OverflowingLists() {
-        final long balance = 1234567890L;
-        final List<Ledger.Transaction> transactions = new ArrayList<>();
-        final List<Ledger.RewardBucket> rewardBuckets = new ArrayList<>();
-
-        final long now = getCurrentTimeMillis();
-        for (int i = 0; i < 2 * Ledger.MAX_TRANSACTION_COUNT; ++i) {
-            final long start = now - 20 * HOUR_IN_MILLIS + i * MINUTE_IN_MILLIS;
-            Ledger.Transaction transaction = new Ledger.Transaction(
-                    start, start + MINUTE_IN_MILLIS, 1, null, 400, 0);
-            transactions.add(transaction);
-        }
-        for (int b = 0; b < 2 * Ledger.NUM_REWARD_BUCKET_WINDOWS; ++b) {
-            final long start = now
-                    - (2 * Ledger.NUM_REWARD_BUCKET_WINDOWS - b) * 6 * HOUR_IN_MILLIS;
-            Ledger.RewardBucket rewardBucket = new Ledger.RewardBucket();
-            rewardBucket.startTimeMs = start;
-            for (int r = 0; r < 5; ++r) {
-                rewardBucket.cumulativeDelta.put(EconomicPolicy.TYPE_REWARD | r, b * start + r);
-            }
-            rewardBuckets.add(rewardBucket);
-        }
-        final Ledger ledger = new Ledger(balance, transactions, rewardBuckets);
-        assertEquals(balance, ledger.getCurrentBalance());
-        assertEquals(transactions.subList(Ledger.MAX_TRANSACTION_COUNT,
-                        2 * Ledger.MAX_TRANSACTION_COUNT),
-                ledger.getTransactions());
-        assertEquals(rewardBuckets.subList(Ledger.NUM_REWARD_BUCKET_WINDOWS,
-                        2 * Ledger.NUM_REWARD_BUCKET_WINDOWS),
-                ledger.getRewardBuckets());
-    }
-
-    @Test
-    public void testMultipleTransactions() {
-        final Ledger ledger = new Ledger();
-        ledger.recordTransaction(new Ledger.Transaction(0, 1000, 1, null, 5, 0));
-        assertEquals(5, ledger.getCurrentBalance());
-        ledger.recordTransaction(new Ledger.Transaction(2000, 2000, 1, null, 25, 0));
-        assertEquals(30, ledger.getCurrentBalance());
-        ledger.recordTransaction(new Ledger.Transaction(5000, 5500, 1, null, -10, 5));
-        assertEquals(20, ledger.getCurrentBalance());
-    }
-
-    @Test
-    public void test24HourSum() {
-        final long now = getCurrentTimeMillis();
-        final long end = now + 24 * HOUR_IN_MILLIS;
-        final int reward1 = EconomicPolicy.TYPE_REWARD | 1;
-        final int reward2 = EconomicPolicy.TYPE_REWARD | 2;
-        final Ledger ledger = new Ledger();
-
-        // First bucket
-        assertEquals(0, ledger.get24HourSum(reward1, end));
-        ledger.recordTransaction(new Ledger.Transaction(now, now + 1000, reward1, null, 500, 0));
-        assertEquals(500, ledger.get24HourSum(reward1, end));
-        assertEquals(0, ledger.get24HourSum(reward2, end));
-        ledger.recordTransaction(
-                new Ledger.Transaction(now + 2 * HOUR_IN_MILLIS, now + 3 * HOUR_IN_MILLIS,
-                        reward1, null, 2500, 0));
-        assertEquals(3000, ledger.get24HourSum(reward1, end));
-        // Second bucket
-        shiftSystemTime(7 * HOUR_IN_MILLIS); // now + 7
-        ledger.recordTransaction(
-                new Ledger.Transaction(now + 7 * HOUR_IN_MILLIS, now + 7 * HOUR_IN_MILLIS,
-                        reward1, null, 1, 0));
-        ledger.recordTransaction(
-                new Ledger.Transaction(now + 7 * HOUR_IN_MILLIS, now + 7 * HOUR_IN_MILLIS,
-                        reward2, null, 42, 0));
-        assertEquals(3001, ledger.get24HourSum(reward1, end));
-        assertEquals(42, ledger.get24HourSum(reward2, end));
-        // Third bucket
-        shiftSystemTime(12 * HOUR_IN_MILLIS); // now + 19
-        ledger.recordTransaction(
-                new Ledger.Transaction(now + 12 * HOUR_IN_MILLIS, now + 13 * HOUR_IN_MILLIS,
-                        reward1, null, 300, 0));
-        assertEquals(3301, ledger.get24HourSum(reward1, end));
-        assertRewardBucketsInOrder(ledger.getRewardBuckets());
-        // Older buckets should be excluded
-        assertEquals(301, ledger.get24HourSum(reward1, end + HOUR_IN_MILLIS));
-        assertEquals(301, ledger.get24HourSum(reward1, end + 2 * HOUR_IN_MILLIS));
-        // 2nd bucket should still be included since it started at the 7 hour mark
-        assertEquals(301, ledger.get24HourSum(reward1, end + 6 * HOUR_IN_MILLIS));
-        assertEquals(42, ledger.get24HourSum(reward2, end + 6 * HOUR_IN_MILLIS));
-        assertEquals(300, ledger.get24HourSum(reward1, end + 7 * HOUR_IN_MILLIS + 1));
-        assertEquals(0, ledger.get24HourSum(reward2, end + 8 * HOUR_IN_MILLIS));
-        assertEquals(0, ledger.get24HourSum(reward1, end + 19 * HOUR_IN_MILLIS + 1));
-    }
-
-    @Test
-    public void testRemoveOldTransactions() {
-        final Ledger ledger = new Ledger();
-        ledger.removeOldTransactions(24 * HOUR_IN_MILLIS);
-        assertNull(ledger.getEarliestTransaction());
-
-        final long now = getCurrentTimeMillis();
-        Ledger.Transaction transaction1 = new Ledger.Transaction(
-                now - 48 * HOUR_IN_MILLIS, now - 40 * HOUR_IN_MILLIS, 1, null, 4800, 0);
-        Ledger.Transaction transaction2 = new Ledger.Transaction(
-                now - 24 * HOUR_IN_MILLIS, now - 23 * HOUR_IN_MILLIS, 1, null, 600, 0);
-        Ledger.Transaction transaction3 = new Ledger.Transaction(
-                now - 22 * HOUR_IN_MILLIS, now - 21 * HOUR_IN_MILLIS, 1, null, 600, 0);
-        // Instant event
-        Ledger.Transaction transaction4 = new Ledger.Transaction(
-                now - 20 * HOUR_IN_MILLIS, now - 20 * HOUR_IN_MILLIS, 1, null, 500, 0);
-        // Recent event
-        Ledger.Transaction transaction5 = new Ledger.Transaction(
-                now - 5 * MINUTE_IN_MILLIS, now - MINUTE_IN_MILLIS, 1, null, 400, 0);
-        ledger.recordTransaction(transaction1);
-        ledger.recordTransaction(transaction2);
-        ledger.recordTransaction(transaction3);
-        ledger.recordTransaction(transaction4);
-        ledger.recordTransaction(transaction5);
-
-        assertEquals(transaction1, ledger.getEarliestTransaction());
-        ledger.removeOldTransactions(24 * HOUR_IN_MILLIS);
-        assertEquals(transaction2, ledger.getEarliestTransaction());
-        ledger.removeOldTransactions(23 * HOUR_IN_MILLIS);
-        assertEquals(transaction3, ledger.getEarliestTransaction());
-        // Shouldn't delete transaction3 yet since there's still a piece of it within the min age
-        // window.
-        ledger.removeOldTransactions(21 * HOUR_IN_MILLIS + 30 * MINUTE_IN_MILLIS);
-        assertEquals(transaction3, ledger.getEarliestTransaction());
-        // Instant event should be removed as soon as we hit the exact threshold.
-        ledger.removeOldTransactions(20 * HOUR_IN_MILLIS);
-        assertEquals(transaction5, ledger.getEarliestTransaction());
-        ledger.removeOldTransactions(0);
-        assertNull(ledger.getEarliestTransaction());
-    }
-
-    @Test
-    public void testTransactionsAlwaysInOrder() {
-        final Ledger ledger = new Ledger();
-        List<Ledger.Transaction> transactions = ledger.getTransactions();
-        assertTrue(transactions.isEmpty());
-
-        final long now = getCurrentTimeMillis();
-        Ledger.Transaction transaction1 = new Ledger.Transaction(
-                now - 48 * HOUR_IN_MILLIS, now - 40 * HOUR_IN_MILLIS, 1, null, 4800, 0);
-        Ledger.Transaction transaction2 = new Ledger.Transaction(
-                now - 24 * HOUR_IN_MILLIS, now - 23 * HOUR_IN_MILLIS, 1, null, 600, 0);
-        Ledger.Transaction transaction3 = new Ledger.Transaction(
-                now - 22 * HOUR_IN_MILLIS, now - 21 * HOUR_IN_MILLIS, 1, null, 600, 0);
-        // Instant event
-        Ledger.Transaction transaction4 = new Ledger.Transaction(
-                now - 20 * HOUR_IN_MILLIS, now - 20 * HOUR_IN_MILLIS, 1, null, 500, 0);
-
-        Ledger.Transaction transaction5 = new Ledger.Transaction(
-                now - 15 * HOUR_IN_MILLIS, now - 15 * HOUR_IN_MILLIS + MINUTE_IN_MILLIS,
-                1, null, 400, 0);
-        ledger.recordTransaction(transaction1);
-        ledger.recordTransaction(transaction2);
-        ledger.recordTransaction(transaction3);
-        ledger.recordTransaction(transaction4);
-        ledger.recordTransaction(transaction5);
-
-        transactions = ledger.getTransactions();
-        assertEquals(5, transactions.size());
-        assertTransactionsInOrder(transactions);
-
-        for (int i = 0; i < Ledger.MAX_TRANSACTION_COUNT - 5; ++i) {
-            final long start = now - 10 * HOUR_IN_MILLIS + i * MINUTE_IN_MILLIS;
-            Ledger.Transaction transaction = new Ledger.Transaction(
-                    start, start + MINUTE_IN_MILLIS, 1, null, 400, 0);
-            ledger.recordTransaction(transaction);
-        }
-        transactions = ledger.getTransactions();
-        assertEquals(Ledger.MAX_TRANSACTION_COUNT, transactions.size());
-        assertTransactionsInOrder(transactions);
-
-        long start = now - 5 * HOUR_IN_MILLIS;
-        Ledger.Transaction transactionLast5 = new Ledger.Transaction(
-                start, start + MINUTE_IN_MILLIS, 1, null, 4800, 0);
-        start = now - 4 * HOUR_IN_MILLIS;
-        Ledger.Transaction transactionLast4 = new Ledger.Transaction(
-                start, start + MINUTE_IN_MILLIS, 1, null, 600, 0);
-        start = now - 3 * HOUR_IN_MILLIS;
-        Ledger.Transaction transactionLast3 = new Ledger.Transaction(
-                start, start + MINUTE_IN_MILLIS, 1, null, 600, 0);
-        // Instant event
-        start = now - 2 * HOUR_IN_MILLIS;
-        Ledger.Transaction transactionLast2 = new Ledger.Transaction(
-                start, start, 1, null, 500, 0);
-        Ledger.Transaction transactionLast1 = new Ledger.Transaction(
-                start, start + MINUTE_IN_MILLIS, 1, null, 400, 0);
-        ledger.recordTransaction(transactionLast5);
-        ledger.recordTransaction(transactionLast4);
-        ledger.recordTransaction(transactionLast3);
-        ledger.recordTransaction(transactionLast2);
-        ledger.recordTransaction(transactionLast1);
-
-        transactions = ledger.getTransactions();
-        assertEquals(Ledger.MAX_TRANSACTION_COUNT, transactions.size());
-        assertTransactionsInOrder(transactions);
-        assertEquals(transactionLast1, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 1));
-        assertEquals(transactionLast2, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 2));
-        assertEquals(transactionLast3, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 3));
-        assertEquals(transactionLast4, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 4));
-        assertEquals(transactionLast5, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 5));
-        assertFalse(transactions.contains(transaction1));
-        assertFalse(transactions.contains(transaction2));
-        assertFalse(transactions.contains(transaction3));
-        assertFalse(transactions.contains(transaction4));
-        assertFalse(transactions.contains(transaction5));
-    }
-
-    private void assertSparseLongArraysEqual(SparseLongArray expected, SparseLongArray actual) {
-        if (expected == null) {
-            assertNull(actual);
-            return;
-        }
-        assertNotNull(actual);
-        final int size = expected.size();
-        assertEquals(size, actual.size());
-        for (int i = 0; i < size; ++i) {
-            assertEquals(expected.keyAt(i), actual.keyAt(i));
-            assertEquals(expected.valueAt(i), actual.valueAt(i));
-        }
-    }
-
-    private void assertRewardBucketsEqual(Ledger.RewardBucket expected,
-            Ledger.RewardBucket actual) {
-        if (expected == null) {
-            assertNull(actual);
-            return;
-        }
-        assertNotNull(actual);
-        assertEquals(expected.startTimeMs, actual.startTimeMs);
-        assertSparseLongArraysEqual(expected.cumulativeDelta, actual.cumulativeDelta);
-    }
-
-    private void assertRewardBucketsInOrder(List<Ledger.RewardBucket> rewardBuckets) {
-        assertNotNull(rewardBuckets);
-        for (int i = 1; i < rewardBuckets.size(); ++i) {
-            final Ledger.RewardBucket prev = rewardBuckets.get(i - 1);
-            final Ledger.RewardBucket cur = rewardBuckets.get(i);
-            assertTrue("Newer bucket stored before older bucket @ index " + i
-                            + ": " + prev.startTimeMs + " vs " + cur.startTimeMs,
-                    prev.startTimeMs <= cur.startTimeMs);
-        }
-    }
-
-    private void assertTransactionsInOrder(List<Ledger.Transaction> transactions) {
-        assertNotNull(transactions);
-        for (int i = 1; i < transactions.size(); ++i) {
-            final Ledger.Transaction prev = transactions.get(i - 1);
-            final Ledger.Transaction cur = transactions.get(i);
-            assertTrue("Newer transaction stored before older transaction @ index " + i
-                            + ": " + prev.endTimeMs + " vs " + cur.endTimeMs,
-                    prev.endTimeMs <= cur.endTimeMs);
-        }
-    }
-}
diff --git a/services/tests/servicestests/src/com/android/server/tare/OWNERS b/services/tests/servicestests/src/com/android/server/tare/OWNERS
deleted file mode 100644
index 217a5ed..0000000
--- a/services/tests/servicestests/src/com/android/server/tare/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-include /apex/jobscheduler/service/java/com/android/server/tare/OWNERS
\ No newline at end of file
diff --git a/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
index 06fc017..b3ec215 100644
--- a/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
+++ b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
@@ -19,10 +19,13 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
+import android.annotation.UserIdInt;
 import android.content.Intent;
 import android.content.pm.PackageManagerInternal;
 import android.net.Uri;
+import android.os.Binder;
 import android.os.Build;
+import android.os.UserHandle;
 import android.testing.TestableContext;
 
 import androidx.test.InstrumentationRegistry;
@@ -45,10 +48,20 @@
     protected static final String PKG_P = "com.example.p";
     protected static final String PKG_R = "com.example.r";
 
+    protected static final int UID_N_MR1 = 10001;
+    protected static final int UID_O = 10002;
+    protected static final int UID_P = 10003;
+    protected static final int UID_R = 10004;
+
     @Rule
     public TestableContext mContext =
             spy(new TestableContext(InstrumentationRegistry.getContext(), null));
 
+    protected final int mUid = Binder.getCallingUid();
+    protected final @UserIdInt int mUserId = UserHandle.getUserId(mUid);
+    protected final UserHandle mUser = UserHandle.of(mUserId);
+    protected final String mPkg = mContext.getPackageName();
+
     protected TestableContext getContext() {
         return mContext;
     }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
deleted file mode 100644
index 517dcb4..0000000
--- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
+++ /dev/null
@@ -1,1969 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.notification;
-
-import static android.app.Notification.FLAG_BUBBLE;
-import static android.app.Notification.GROUP_ALERT_ALL;
-import static android.app.Notification.GROUP_ALERT_CHILDREN;
-import static android.app.Notification.GROUP_ALERT_SUMMARY;
-import static android.app.NotificationManager.IMPORTANCE_HIGH;
-import static android.app.NotificationManager.IMPORTANCE_LOW;
-import static android.app.NotificationManager.IMPORTANCE_MIN;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_LIGHTS;
-import static android.media.AudioAttributes.USAGE_NOTIFICATION;
-import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE;
-
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.assertTrue;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.mockito.ArgumentMatchers.anyFloat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyObject;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.argThat;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.after;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.timeout;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.annotation.SuppressLint;
-import android.app.ActivityManager;
-import android.app.KeyguardManager;
-import android.app.Notification;
-import android.app.Notification.Builder;
-import android.app.NotificationChannel;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.graphics.Color;
-import android.graphics.drawable.Icon;
-import android.media.AudioAttributes;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.os.VibrationAttributes;
-import android.os.VibrationEffect;
-import android.os.Vibrator;
-import android.provider.Settings;
-import android.service.notification.NotificationListenerService;
-import android.service.notification.StatusBarNotification;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.IAccessibilityManager;
-import android.view.accessibility.IAccessibilityManagerClient;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.logging.InstanceIdSequence;
-import com.android.internal.logging.InstanceIdSequenceFake;
-import com.android.internal.util.IntPair;
-import com.android.server.UiServiceTestCase;
-import com.android.server.lights.LogicalLight;
-import com.android.server.pm.PackageManagerService;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatcher;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-import org.mockito.verification.VerificationMode;
-
-import java.util.Objects;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-@SuppressLint("GuardedBy") // It's ok for this test to access guarded methods from the service.
-public class BuzzBeepBlinkTest extends UiServiceTestCase {
-
-    @Mock AudioManager mAudioManager;
-    @Mock Vibrator mVibrator;
-    @Mock android.media.IRingtonePlayer mRingtonePlayer;
-    @Mock LogicalLight mLight;
-    @Mock
-    NotificationManagerService.WorkerHandler mHandler;
-    @Mock
-    NotificationUsageStats mUsageStats;
-    @Mock
-    IAccessibilityManager mAccessibilityService;
-    @Mock
-    KeyguardManager mKeyguardManager;
-    NotificationRecordLoggerFake mNotificationRecordLogger = new NotificationRecordLoggerFake();
-    private InstanceIdSequence mNotificationInstanceIdSequence = new InstanceIdSequenceFake(
-            1 << 30);
-
-    private NotificationManagerService mService;
-    private String mPkg = "com.android.server.notification";
-    private int mId = 1001;
-    private int mOtherId = 1002;
-    private String mTag = null;
-    private int mUid = 1000;
-    private int mPid = 2000;
-    private android.os.UserHandle mUser = UserHandle.of(ActivityManager.getCurrentUser());
-    private NotificationChannel mChannel;
-
-    private VibrateRepeatMatcher mVibrateOnceMatcher = new VibrateRepeatMatcher(-1);
-    private VibrateRepeatMatcher mVibrateLoopMatcher = new VibrateRepeatMatcher(0);
-
-    private static final long[] CUSTOM_VIBRATION = new long[] {
-            300, 400, 300, 400, 300, 400, 300, 400, 300, 400, 300, 400,
-            300, 400, 300, 400, 300, 400, 300, 400, 300, 400, 300, 400,
-            300, 400, 300, 400, 300, 400, 300, 400, 300, 400, 300, 400 };
-    private static final Uri CUSTOM_SOUND = Settings.System.DEFAULT_ALARM_ALERT_URI;
-    private static final AudioAttributes CUSTOM_ATTRIBUTES = new AudioAttributes.Builder()
-            .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
-            .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
-            .build();
-    private static final int CUSTOM_LIGHT_COLOR = Color.BLACK;
-    private static final int CUSTOM_LIGHT_ON = 10000;
-    private static final int CUSTOM_LIGHT_OFF = 10000;
-    private static final int MAX_VIBRATION_DELAY = 1000;
-    private static final float DEFAULT_VOLUME = 1.0f;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        getContext().addMockSystemService(Vibrator.class, mVibrator);
-
-        when(mAudioManager.isAudioFocusExclusive()).thenReturn(false);
-        when(mAudioManager.getRingtonePlayer()).thenReturn(mRingtonePlayer);
-        when(mAudioManager.getStreamVolume(anyInt())).thenReturn(10);
-        // consistent with focus not exclusive and volume not muted
-        when(mAudioManager.shouldNotificationSoundPlay(any(AudioAttributes.class)))
-                .thenReturn(true);
-        when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
-        when(mAudioManager.getFocusRampTimeMs(anyInt(), any(AudioAttributes.class))).thenReturn(50);
-        when(mUsageStats.isAlertRateLimited(any())).thenReturn(false);
-        when(mVibrator.hasFrequencyControl()).thenReturn(false);
-        when(mKeyguardManager.isDeviceLocked(anyInt())).thenReturn(false);
-
-        long serviceReturnValue = IntPair.of(
-                AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED,
-                AccessibilityEvent.TYPES_ALL_MASK);
-        when(mAccessibilityService.addClient(any(), anyInt())).thenReturn(serviceReturnValue);
-        AccessibilityManager accessibilityManager =
-                new AccessibilityManager(getContext(), Handler.getMain(), mAccessibilityService,
-                        0, true);
-        verify(mAccessibilityService).addClient(any(IAccessibilityManagerClient.class), anyInt());
-        assertTrue(accessibilityManager.isEnabled());
-
-        mService = spy(new NotificationManagerService(getContext(), mNotificationRecordLogger,
-                mNotificationInstanceIdSequence));
-        mService.setVibratorHelper(new VibratorHelper(getContext()));
-        mService.setAudioManager(mAudioManager);
-        mService.setSystemReady(true);
-        mService.setHandler(mHandler);
-        mService.setLights(mLight);
-        mService.setScreenOn(false);
-        mService.setUsageStats(mUsageStats);
-        mService.setAccessibilityManager(accessibilityManager);
-        mService.setKeyguardManager(mKeyguardManager);
-        mService.mScreenOn = false;
-        mService.mInCallStateOffHook = false;
-        mService.mNotificationPulseEnabled = true;
-
-        mChannel = new NotificationChannel("test", "test", IMPORTANCE_HIGH);
-    }
-
-    //
-    // Convenience functions for creating notification records
-    //
-
-    private NotificationRecord getNoisyOtherNotification() {
-        return getNotificationRecord(mOtherId, false /* insistent */, false /* once */,
-                true /* noisy */, true /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getBeepyNotification() {
-        return getNotificationRecord(mId, false /* insistent */, false /* once */,
-                true /* noisy */, false /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getBeepyOtherNotification() {
-        return getNotificationRecord(mOtherId, false /* insistent */, false /* once */,
-                true /* noisy */, false /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getBeepyOnceNotification() {
-        return getNotificationRecord(mId, false /* insistent */, true /* once */,
-                true /* noisy */, false /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getQuietNotification() {
-        return getNotificationRecord(mId, false /* insistent */, true /* once */,
-                false /* noisy */, false /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getQuietOtherNotification() {
-        return getNotificationRecord(mOtherId, false /* insistent */, false /* once */,
-                false /* noisy */, false /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getQuietOnceNotification() {
-        return getNotificationRecord(mId, false /* insistent */, true /* once */,
-                false /* noisy */, false /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getInsistentBeepyNotification() {
-        return getNotificationRecord(mId, true /* insistent */, false /* once */,
-                true /* noisy */, false /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getInsistentBeepyOnceNotification() {
-        return getNotificationRecord(mId, true /* insistent */, true /* once */,
-                true /* noisy */, false /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getInsistentBeepyLeanbackNotification() {
-        return getLeanbackNotificationRecord(mId, true /* insistent */, false /* once */,
-                true /* noisy */, false /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getBuzzyNotification() {
-        return getNotificationRecord(mId, false /* insistent */, false /* once */,
-                false /* noisy */, true /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getBuzzyOtherNotification() {
-        return getNotificationRecord(mOtherId, false /* insistent */, false /* once */,
-                false /* noisy */, true /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getBuzzyOnceNotification() {
-        return getNotificationRecord(mId, false /* insistent */, true /* once */,
-                false /* noisy */, true /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getInsistentBuzzyNotification() {
-        return getNotificationRecord(mId, true /* insistent */, false /* once */,
-                false /* noisy */, true /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getBuzzyBeepyNotification() {
-        return getNotificationRecord(mId, false /* insistent */, false /* once */,
-                true /* noisy */, true /* buzzy*/, false /* lights */);
-    }
-
-    private NotificationRecord getLightsNotification() {
-        return getNotificationRecord(mId, false /* insistent */, false /* once */,
-                false /* noisy */, false /* buzzy*/, true /* lights */);
-    }
-
-    private NotificationRecord getLightsOnceNotification() {
-        return getNotificationRecord(mId, false /* insistent */, true /* once */,
-                false /* noisy */, false /* buzzy*/, true /* lights */);
-    }
-
-    private NotificationRecord getCallRecord(int id, NotificationChannel channel, boolean looping) {
-        final Builder builder = new Builder(getContext())
-                .setContentTitle("foo")
-                .setSmallIcon(android.R.drawable.sym_def_app_icon)
-                .setPriority(Notification.PRIORITY_HIGH);
-        Notification n = builder.build();
-        if (looping) {
-            n.flags |= Notification.FLAG_INSISTENT;
-        }
-        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, id, mTag, mUid,
-                mPid, n, mUser, null, System.currentTimeMillis());
-        NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
-        mService.addNotification(r);
-
-        return r;
-    }
-
-    private NotificationRecord getNotificationRecord(int id, boolean insistent, boolean once,
-            boolean noisy, boolean buzzy, boolean lights) {
-        return getNotificationRecord(id, insistent, once, noisy, buzzy, lights, buzzy, noisy,
-                lights, null, Notification.GROUP_ALERT_ALL, false);
-    }
-
-    private NotificationRecord getLeanbackNotificationRecord(int id, boolean insistent,
-            boolean once,
-            boolean noisy, boolean buzzy, boolean lights) {
-        return getNotificationRecord(id, insistent, once, noisy, buzzy, lights, true, true,
-                true,
-                null, Notification.GROUP_ALERT_ALL, true);
-    }
-
-    private NotificationRecord getBeepyNotificationRecord(String groupKey, int groupAlertBehavior) {
-        return getNotificationRecord(mId, false, false, true, false, false, true, true, true,
-                groupKey, groupAlertBehavior, false);
-    }
-
-    private NotificationRecord getLightsNotificationRecord(String groupKey,
-            int groupAlertBehavior) {
-        return getNotificationRecord(mId, false, false, false, false, true /*lights*/, true,
-                true, true, groupKey, groupAlertBehavior, false);
-    }
-
-    private NotificationRecord getNotificationRecord(int id,
-            boolean insistent, boolean once,
-            boolean noisy, boolean buzzy, boolean lights, boolean defaultVibration,
-            boolean defaultSound, boolean defaultLights, String groupKey, int groupAlertBehavior,
-            boolean isLeanback) {
-
-        final Builder builder = new Builder(getContext())
-                .setContentTitle("foo")
-                .setSmallIcon(android.R.drawable.sym_def_app_icon)
-                .setPriority(Notification.PRIORITY_HIGH)
-                .setOnlyAlertOnce(once);
-
-        int defaults = 0;
-        if (noisy) {
-            if (defaultSound) {
-                defaults |= Notification.DEFAULT_SOUND;
-                mChannel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI,
-                        Notification.AUDIO_ATTRIBUTES_DEFAULT);
-            } else {
-                builder.setSound(CUSTOM_SOUND);
-                mChannel.setSound(CUSTOM_SOUND, CUSTOM_ATTRIBUTES);
-            }
-        } else {
-            mChannel.setSound(null, null);
-        }
-        if (buzzy) {
-            if (defaultVibration) {
-                defaults |= Notification.DEFAULT_VIBRATE;
-            } else {
-                builder.setVibrate(CUSTOM_VIBRATION);
-                mChannel.setVibrationPattern(CUSTOM_VIBRATION);
-            }
-            mChannel.enableVibration(true);
-        } else {
-            mChannel.setVibrationPattern(null);
-            mChannel.enableVibration(false);
-        }
-
-        if (lights) {
-            if (defaultLights) {
-                defaults |= Notification.DEFAULT_LIGHTS;
-            } else {
-                builder.setLights(CUSTOM_LIGHT_COLOR, CUSTOM_LIGHT_ON, CUSTOM_LIGHT_OFF);
-            }
-            mChannel.enableLights(true);
-        } else {
-            mChannel.enableLights(false);
-        }
-        builder.setDefaults(defaults);
-
-        builder.setGroup(groupKey);
-        builder.setGroupAlertBehavior(groupAlertBehavior);
-
-        Notification n = builder.build();
-        if (insistent) {
-            n.flags |= Notification.FLAG_INSISTENT;
-        }
-
-        Context context = spy(getContext());
-        PackageManager packageManager = spy(context.getPackageManager());
-        when(context.getPackageManager()).thenReturn(packageManager);
-        when(packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK))
-                .thenReturn(isLeanback);
-
-        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, id, mTag, mUid,
-                mPid, n, mUser, null, System.currentTimeMillis());
-        NotificationRecord r = new NotificationRecord(context, sbn, mChannel);
-        mService.addNotification(r);
-        return r;
-    }
-
-    //
-    // Convenience functions for interacting with mocks
-    //
-
-    private void verifyNeverBeep() throws RemoteException {
-        verify(mRingtonePlayer, never()).playAsync(any(), any(), anyBoolean(), any(), anyFloat());
-    }
-
-    private void verifyBeepUnlooped() throws RemoteException  {
-        verify(mRingtonePlayer, times(1)).playAsync(any(), any(), eq(false), any(),
-                eq(DEFAULT_VOLUME));
-    }
-
-    private void verifyBeepLooped() throws RemoteException  {
-        verify(mRingtonePlayer, times(1)).playAsync(any(), any(), eq(true), any(),
-                eq(DEFAULT_VOLUME));
-    }
-
-    private void verifyBeep(int times)  throws RemoteException  {
-        verify(mRingtonePlayer, times(times)).playAsync(any(), any(), anyBoolean(), any(),
-                eq(DEFAULT_VOLUME));
-    }
-
-    private void verifyNeverStopAudio() throws RemoteException {
-        verify(mRingtonePlayer, never()).stopAsync();
-    }
-
-    private void verifyStopAudio() throws RemoteException {
-        verify(mRingtonePlayer, times(1)).stopAsync();
-    }
-
-    private void verifyNeverVibrate() {
-        verify(mVibrator, never()).vibrate(anyInt(), anyString(), any(), anyString(),
-                any(VibrationAttributes.class));
-    }
-
-    private void verifyVibrate() {
-        verifyVibrate(/* times= */ 1);
-    }
-
-    private void verifyVibrate(int times) {
-        verifyVibrate(mVibrateOnceMatcher, times(times));
-    }
-
-    private void verifyVibrateLooped() {
-        verifyVibrate(mVibrateLoopMatcher, times(1));
-    }
-
-    private void verifyDelayedVibrateLooped() {
-        verifyVibrate(mVibrateLoopMatcher, timeout(MAX_VIBRATION_DELAY).times(1));
-    }
-
-    private void verifyDelayedVibrate(VibrationEffect effect) {
-        verifyVibrate(argument -> Objects.equals(effect, argument),
-                timeout(MAX_VIBRATION_DELAY).times(1));
-    }
-
-    private void verifyDelayedNeverVibrate() {
-        verify(mVibrator, after(MAX_VIBRATION_DELAY).never()).vibrate(anyInt(), anyString(), any(),
-                anyString(), any(VibrationAttributes.class));
-    }
-
-    private void verifyVibrate(ArgumentMatcher<VibrationEffect> effectMatcher,
-            VerificationMode verification) {
-        ArgumentCaptor<VibrationAttributes> captor =
-                ArgumentCaptor.forClass(VibrationAttributes.class);
-        verify(mVibrator, verification).vibrate(eq(Process.SYSTEM_UID),
-                eq(PackageManagerService.PLATFORM_PACKAGE_NAME), argThat(effectMatcher),
-                anyString(), captor.capture());
-        assertEquals(0, (captor.getValue().getFlags()
-                & VibrationAttributes.FLAG_BYPASS_INTERRUPTION_POLICY));
-    }
-
-    private void verifyStopVibrate() {
-        int alarmClassUsageFilter =
-                VibrationAttributes.USAGE_CLASS_ALARM | ~VibrationAttributes.USAGE_CLASS_MASK;
-        verify(mVibrator, times(1)).cancel(eq(alarmClassUsageFilter));
-    }
-
-    private void verifyNeverStopVibrate() {
-        verify(mVibrator, never()).cancel();
-        verify(mVibrator, never()).cancel(anyInt());
-    }
-
-    private void verifyNeverLights() {
-        verify(mLight, never()).setFlashing(anyInt(), anyInt(), anyInt(), anyInt());
-    }
-
-    private void verifyLights() {
-        verify(mLight, times(1)).setFlashing(anyInt(), anyInt(), anyInt(), anyInt());
-    }
-
-    //
-    // Tests
-    //
-
-    @Test
-    public void testLights() throws Exception {
-        NotificationRecord r = getLightsNotification();
-        r.setSystemImportance(NotificationManager.IMPORTANCE_DEFAULT);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyLights();
-        assertTrue(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testBeep() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyBeepUnlooped();
-        verifyNeverVibrate();
-        verify(mAccessibilityService, times(1)).sendAccessibilityEvent(any(), anyInt());
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testLockedPrivateA11yRedaction() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        r.setPackageVisibilityOverride(NotificationManager.VISIBILITY_NO_OVERRIDE);
-        r.getNotification().visibility = Notification.VISIBILITY_PRIVATE;
-        when(mKeyguardManager.isDeviceLocked(anyInt())).thenReturn(true);
-        AccessibilityManager accessibilityManager = Mockito.mock(AccessibilityManager.class);
-        when(accessibilityManager.isEnabled()).thenReturn(true);
-        mService.setAccessibilityManager(accessibilityManager);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        ArgumentCaptor<AccessibilityEvent> eventCaptor =
-                ArgumentCaptor.forClass(AccessibilityEvent.class);
-
-        verify(accessibilityManager, times(1))
-                .sendAccessibilityEvent(eventCaptor.capture());
-
-        AccessibilityEvent event = eventCaptor.getValue();
-        assertEquals(r.getNotification().publicVersion, event.getParcelableData());
-    }
-
-    @Test
-    public void testLockedOverridePrivateA11yRedaction() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        r.setPackageVisibilityOverride(Notification.VISIBILITY_PRIVATE);
-        r.getNotification().visibility = Notification.VISIBILITY_PUBLIC;
-        when(mKeyguardManager.isDeviceLocked(anyInt())).thenReturn(true);
-        AccessibilityManager accessibilityManager = Mockito.mock(AccessibilityManager.class);
-        when(accessibilityManager.isEnabled()).thenReturn(true);
-        mService.setAccessibilityManager(accessibilityManager);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        ArgumentCaptor<AccessibilityEvent> eventCaptor =
-                ArgumentCaptor.forClass(AccessibilityEvent.class);
-
-        verify(accessibilityManager, times(1))
-                .sendAccessibilityEvent(eventCaptor.capture());
-
-        AccessibilityEvent event = eventCaptor.getValue();
-        assertEquals(r.getNotification().publicVersion, event.getParcelableData());
-    }
-
-    @Test
-    public void testLockedPublicA11yNoRedaction() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        r.setPackageVisibilityOverride(NotificationManager.VISIBILITY_NO_OVERRIDE);
-        r.getNotification().visibility = Notification.VISIBILITY_PUBLIC;
-        when(mKeyguardManager.isDeviceLocked(anyInt())).thenReturn(true);
-        AccessibilityManager accessibilityManager = Mockito.mock(AccessibilityManager.class);
-        when(accessibilityManager.isEnabled()).thenReturn(true);
-        mService.setAccessibilityManager(accessibilityManager);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        ArgumentCaptor<AccessibilityEvent> eventCaptor =
-                ArgumentCaptor.forClass(AccessibilityEvent.class);
-
-        verify(accessibilityManager, times(1))
-                .sendAccessibilityEvent(eventCaptor.capture());
-
-        AccessibilityEvent event = eventCaptor.getValue();
-        assertEquals(r.getNotification(), event.getParcelableData());
-    }
-
-    @Test
-    public void testUnlockedPrivateA11yNoRedaction() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        r.setPackageVisibilityOverride(NotificationManager.VISIBILITY_NO_OVERRIDE);
-        r.getNotification().visibility = Notification.VISIBILITY_PRIVATE;
-        when(mKeyguardManager.isDeviceLocked(anyInt())).thenReturn(false);
-        AccessibilityManager accessibilityManager = Mockito.mock(AccessibilityManager.class);
-        when(accessibilityManager.isEnabled()).thenReturn(true);
-        mService.setAccessibilityManager(accessibilityManager);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        ArgumentCaptor<AccessibilityEvent> eventCaptor =
-                ArgumentCaptor.forClass(AccessibilityEvent.class);
-
-        verify(accessibilityManager, times(1))
-                .sendAccessibilityEvent(eventCaptor.capture());
-
-        AccessibilityEvent event = eventCaptor.getValue();
-        assertEquals(r.getNotification(), event.getParcelableData());
-    }
-
-    @Test
-    public void testBeepInsistently() throws Exception {
-        NotificationRecord r = getInsistentBeepyNotification();
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyBeepLooped();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testNoLeanbackBeep() throws Exception {
-        NotificationRecord r = getInsistentBeepyLeanbackNotification();
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverBeep();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testNoBeepForAutomotiveIfEffectsDisabled() throws Exception {
-        mService.setIsAutomotive(true);
-        mService.setNotificationEffectsEnabledForAutomotive(false);
-
-        NotificationRecord r = getBeepyNotification();
-        r.setSystemImportance(NotificationManager.IMPORTANCE_HIGH);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverBeep();
-        assertFalse(r.isInterruptive());
-    }
-
-    @Test
-    public void testNoBeepForImportanceDefaultInAutomotiveIfEffectsEnabled() throws Exception {
-        mService.setIsAutomotive(true);
-        mService.setNotificationEffectsEnabledForAutomotive(true);
-
-        NotificationRecord r = getBeepyNotification();
-        r.setSystemImportance(NotificationManager.IMPORTANCE_DEFAULT);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverBeep();
-        assertFalse(r.isInterruptive());
-    }
-
-    @Test
-    public void testBeepForImportanceHighInAutomotiveIfEffectsEnabled() throws Exception {
-        mService.setIsAutomotive(true);
-        mService.setNotificationEffectsEnabledForAutomotive(true);
-
-        NotificationRecord r = getBeepyNotification();
-        r.setSystemImportance(NotificationManager.IMPORTANCE_HIGH);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyBeepUnlooped();
-        assertTrue(r.isInterruptive());
-    }
-
-    @Test
-    public void testNoInterruptionForMin() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        r.setSystemImportance(NotificationManager.IMPORTANCE_MIN);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverBeep();
-        verifyNeverVibrate();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testNoInterruptionForIntercepted() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        r.setIntercepted(true);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverBeep();
-        verifyNeverVibrate();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testBeepTwice() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        Mockito.reset(mRingtonePlayer);
-
-        // update should beep
-        r.isUpdate = true;
-        mService.buzzBeepBlinkLocked(r);
-        verifyBeepUnlooped();
-        verify(mAccessibilityService, times(2)).sendAccessibilityEvent(any(), anyInt());
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testHonorAlertOnlyOnceForBeep() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        NotificationRecord s = getBeepyOnceNotification();
-        s.isUpdate = true;
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        Mockito.reset(mRingtonePlayer);
-
-        // update should not beep
-        mService.buzzBeepBlinkLocked(s);
-        verifyNeverBeep();
-        verify(mAccessibilityService, times(1)).sendAccessibilityEvent(any(), anyInt());
-    }
-
-    @Test
-    public void testNoisyUpdateDoesNotCancelAudio() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-
-        mService.buzzBeepBlinkLocked(r);
-        r.isUpdate = true;
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverStopAudio();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testNoisyOnceUpdateDoesNotCancelAudio() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        NotificationRecord s = getBeepyOnceNotification();
-        s.isUpdate = true;
-
-        mService.buzzBeepBlinkLocked(r);
-        mService.buzzBeepBlinkLocked(s);
-
-        verifyNeverStopAudio();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-        assertFalse(s.isInterruptive());
-        assertEquals(-1, s.getLastAudiblyAlertedMs());
-    }
-
-    /**
-     * Tests the case where the user re-posts a {@link Notification} with looping sound where
-     * {@link Notification.Builder#setOnlyAlertOnce(true)} has been called.  This should silence
-     * the sound associated with the notification.
-     * @throws Exception
-     */
-    @Test
-    public void testNoisyOnceUpdateDoesCancelAudio() throws Exception {
-        NotificationRecord r = getInsistentBeepyNotification();
-        NotificationRecord s = getInsistentBeepyOnceNotification();
-        s.isUpdate = true;
-
-        mService.buzzBeepBlinkLocked(r);
-        mService.buzzBeepBlinkLocked(s);
-
-        verifyStopAudio();
-    }
-
-    @Test
-    public void testQuietUpdateDoesNotCancelAudioFromOther() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        NotificationRecord s = getQuietNotification();
-        s.isUpdate = true;
-        NotificationRecord other = getNoisyOtherNotification();
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        mService.buzzBeepBlinkLocked(other); // this takes the audio stream
-        Mockito.reset(mRingtonePlayer);
-
-        // should not stop noise, since we no longer own it
-        mService.buzzBeepBlinkLocked(s); // this no longer owns the stream
-        verifyNeverStopAudio();
-        assertTrue(other.isInterruptive());
-        assertNotEquals(-1, other.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testQuietInterloperDoesNotCancelAudio() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        NotificationRecord other = getQuietOtherNotification();
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        Mockito.reset(mRingtonePlayer);
-
-        // should not stop noise, since it does not own it
-        mService.buzzBeepBlinkLocked(other);
-        verifyNeverStopAudio();
-    }
-
-    @Test
-    public void testQuietUpdateCancelsAudio() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        NotificationRecord s = getQuietNotification();
-        s.isUpdate = true;
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-        Mockito.reset(mRingtonePlayer);
-
-        // quiet update should stop making noise
-        mService.buzzBeepBlinkLocked(s);
-        verifyStopAudio();
-        assertFalse(s.isInterruptive());
-        assertEquals(-1, s.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testQuietOnceUpdateCancelsAudio() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        NotificationRecord s = getQuietOnceNotification();
-        s.isUpdate = true;
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-        Mockito.reset(mRingtonePlayer);
-
-        // stop making noise - this is a weird corner case, but quiet should override once
-        mService.buzzBeepBlinkLocked(s);
-        verifyStopAudio();
-        assertFalse(s.isInterruptive());
-        assertEquals(-1, s.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testInCallNotification() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        Mockito.reset(mRingtonePlayer);
-
-        mService.mInCallStateOffHook = true;
-        mService.buzzBeepBlinkLocked(r);
-
-        verify(mService, times(1)).playInCallNotification();
-        verifyNeverBeep(); // doesn't play normal beep
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testNoDemoteSoundToVibrateIfVibrateGiven() throws Exception {
-        NotificationRecord r = getBuzzyBeepyNotification();
-        assertTrue(r.getSound() != null);
-
-        // the phone is quiet
-        when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
-        when(mAudioManager.getStreamVolume(anyInt())).thenReturn(0);
-        when(mAudioManager.shouldNotificationSoundPlay(any())).thenReturn(false);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyDelayedVibrate(r.getVibration());
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testNoDemoteSoundToVibrateIfNonNotificationStream() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        assertTrue(r.getSound() != null);
-        assertNull(r.getVibration());
-
-        // the phone is quiet
-        when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
-        when(mAudioManager.getStreamVolume(anyInt())).thenReturn(1);
-        // all streams at 1 means no muting from audio framework
-        when(mAudioManager.shouldNotificationSoundPlay(any())).thenReturn(true);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverVibrate();
-        verifyBeepUnlooped();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testDemoteSoundToVibrate() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        assertTrue(r.getSound() != null);
-        assertNull(r.getVibration());
-
-        // the phone is quiet
-        when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
-        when(mAudioManager.getStreamVolume(anyInt())).thenReturn(0);
-        when(mAudioManager.shouldNotificationSoundPlay(any())).thenReturn(false);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyDelayedVibrate(
-                mService.getVibratorHelper().createFallbackVibration(/* insistent= */ false));
-        verify(mRingtonePlayer, never()).playAsync
-                (anyObject(), anyObject(), anyBoolean(), anyObject(), anyFloat());
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testDemoteInsistentSoundToVibrate() throws Exception {
-        NotificationRecord r = getInsistentBeepyNotification();
-        assertTrue(r.getSound() != null);
-        assertNull(r.getVibration());
-
-        // the phone is quiet
-        when(mAudioManager.getStreamVolume(anyInt())).thenReturn(0);
-        when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
-        when(mAudioManager.shouldNotificationSoundPlay(any())).thenReturn(false);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyDelayedVibrateLooped();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testVibrate() throws Exception {
-        NotificationRecord r = getBuzzyNotification();
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverBeep();
-        verifyVibrate();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testInsistentVibrate() {
-        NotificationRecord r = getInsistentBuzzyNotification();
-
-        mService.buzzBeepBlinkLocked(r);
-        verifyVibrateLooped();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testVibrateTwice() {
-        NotificationRecord r = getBuzzyNotification();
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        Mockito.reset(mVibrator);
-
-        // update should vibrate
-        r.isUpdate = true;
-        mService.buzzBeepBlinkLocked(r);
-        verifyVibrate();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testPostSilently() throws Exception {
-        NotificationRecord r = getBuzzyNotification();
-        r.setPostSilently(true);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverBeep();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertSummarySilenceChild() throws Exception {
-        NotificationRecord child = getBeepyNotificationRecord("a", GROUP_ALERT_SUMMARY);
-
-        mService.buzzBeepBlinkLocked(child);
-
-        verifyNeverBeep();
-        assertFalse(child.isInterruptive());
-        assertEquals(-1, child.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertSummaryNoSilenceSummary() throws Exception {
-        NotificationRecord summary = getBeepyNotificationRecord("a", GROUP_ALERT_SUMMARY);
-        summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
-
-        mService.buzzBeepBlinkLocked(summary);
-
-        verifyBeepUnlooped();
-        // summaries are never interruptive for notification counts
-        assertFalse(summary.isInterruptive());
-        assertNotEquals(-1, summary.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertSummaryNoSilenceNonGroupChild() throws Exception {
-        NotificationRecord nonGroup = getBeepyNotificationRecord(null, GROUP_ALERT_SUMMARY);
-
-        mService.buzzBeepBlinkLocked(nonGroup);
-
-        verifyBeepUnlooped();
-        assertTrue(nonGroup.isInterruptive());
-        assertNotEquals(-1, nonGroup.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertChildSilenceSummary() throws Exception {
-        NotificationRecord summary = getBeepyNotificationRecord("a", GROUP_ALERT_CHILDREN);
-        summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
-
-        mService.buzzBeepBlinkLocked(summary);
-
-        verifyNeverBeep();
-        assertFalse(summary.isInterruptive());
-        assertEquals(-1, summary.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertChildNoSilenceChild() throws Exception {
-        NotificationRecord child = getBeepyNotificationRecord("a", GROUP_ALERT_CHILDREN);
-
-        mService.buzzBeepBlinkLocked(child);
-
-        verifyBeepUnlooped();
-        assertTrue(child.isInterruptive());
-        assertNotEquals(-1, child.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertChildNoSilenceNonGroupSummary() throws Exception {
-        NotificationRecord nonGroup = getBeepyNotificationRecord(null, GROUP_ALERT_CHILDREN);
-
-        mService.buzzBeepBlinkLocked(nonGroup);
-
-        verifyBeepUnlooped();
-        assertTrue(nonGroup.isInterruptive());
-        assertNotEquals(-1, nonGroup.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertAllNoSilenceGroup() throws Exception {
-        NotificationRecord group = getBeepyNotificationRecord("a", GROUP_ALERT_ALL);
-
-        mService.buzzBeepBlinkLocked(group);
-
-        verifyBeepUnlooped();
-        assertTrue(group.isInterruptive());
-        assertNotEquals(-1, group.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testHonorAlertOnlyOnceForBuzz() throws Exception {
-        NotificationRecord r = getBuzzyNotification();
-        NotificationRecord s = getBuzzyOnceNotification();
-        s.isUpdate = true;
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        Mockito.reset(mVibrator);
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-
-        // update should not beep
-        mService.buzzBeepBlinkLocked(s);
-        verifyNeverVibrate();
-        assertFalse(s.isInterruptive());
-        assertEquals(-1, s.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testNoisyUpdateDoesNotCancelVibrate() throws Exception {
-        NotificationRecord r = getBuzzyNotification();
-
-        mService.buzzBeepBlinkLocked(r);
-        r.isUpdate = true;
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverStopVibrate();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testNoisyOnceUpdateDoesNotCancelVibrate() throws Exception {
-        NotificationRecord r = getBuzzyNotification();
-        NotificationRecord s = getBuzzyOnceNotification();
-        s.isUpdate = true;
-
-        mService.buzzBeepBlinkLocked(r);
-        mService.buzzBeepBlinkLocked(s);
-
-        verifyNeverStopVibrate();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-        assertFalse(s.isInterruptive());
-        assertEquals(-1, s.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testQuietUpdateDoesNotCancelVibrateFromOther() throws Exception {
-        NotificationRecord r = getBuzzyNotification();
-        NotificationRecord s = getQuietNotification();
-        s.isUpdate = true;
-        NotificationRecord other = getNoisyOtherNotification();
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        mService.buzzBeepBlinkLocked(other); // this takes the vibrate stream
-        Mockito.reset(mVibrator);
-
-        // should not stop vibrate, since we no longer own it
-        mService.buzzBeepBlinkLocked(s); // this no longer owns the stream
-        verifyNeverStopVibrate();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-        assertTrue(other.isInterruptive());
-        assertNotEquals(-1, other.getLastAudiblyAlertedMs());
-        assertFalse(s.isInterruptive());
-        assertEquals(-1, s.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testQuietInterloperDoesNotCancelVibrate() throws Exception {
-        NotificationRecord r = getBuzzyNotification();
-        NotificationRecord other = getQuietOtherNotification();
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        Mockito.reset(mVibrator);
-
-        // should not stop noise, since it does not own it
-        mService.buzzBeepBlinkLocked(other);
-        verifyNeverStopVibrate();
-        assertFalse(other.isInterruptive());
-        assertEquals(-1, other.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testQuietUpdateCancelsVibrate() {
-        NotificationRecord r = getBuzzyNotification();
-        NotificationRecord s = getQuietNotification();
-        s.isUpdate = true;
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        verifyVibrate();
-
-        // quiet update should stop making noise
-        mService.buzzBeepBlinkLocked(s);
-        verifyStopVibrate();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-        assertFalse(s.isInterruptive());
-        assertEquals(-1, s.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testQuietOnceUpdateCancelVibrate() throws Exception {
-        NotificationRecord r = getBuzzyNotification();
-        NotificationRecord s = getQuietOnceNotification();
-        s.isUpdate = true;
-
-        // set up internal state
-        mService.buzzBeepBlinkLocked(r);
-        verifyVibrate();
-
-        // stop making noise - this is a weird corner case, but quiet should override once
-        mService.buzzBeepBlinkLocked(s);
-        verifyStopVibrate();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-        assertFalse(s.isInterruptive());
-        assertEquals(-1, s.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testQuietUpdateCancelsDemotedVibrate() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-        NotificationRecord s = getQuietNotification();
-
-        // the phone is quiet
-        when(mAudioManager.getStreamVolume(anyInt())).thenReturn(0);
-        when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
-        when(mAudioManager.shouldNotificationSoundPlay(any())).thenReturn(false);
-
-        mService.buzzBeepBlinkLocked(r);
-        verifyDelayedVibrate(mService.getVibratorHelper().createFallbackVibration(false));
-
-        // quiet update should stop making noise
-        mService.buzzBeepBlinkLocked(s);
-        verifyStopVibrate();
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-        assertFalse(s.isInterruptive());
-        assertEquals(-1, s.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testEmptyUriSoundTreatedAsNoSound() throws Exception {
-        NotificationChannel channel = new NotificationChannel("test", "test", IMPORTANCE_HIGH);
-        channel.setSound(Uri.EMPTY, null);
-        final Notification n = new Builder(getContext(), "test")
-                .setSmallIcon(android.R.drawable.sym_def_app_icon).build();
-
-        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 0, mTag, mUid,
-                mPid, n, mUser, null, System.currentTimeMillis());
-        NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
-        mService.addNotification(r);
-
-        mService.buzzBeepBlinkLocked(r);
-        verifyNeverBeep();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testRepeatedSoundOverLimitMuted() throws Exception {
-        when(mUsageStats.isAlertRateLimited(any())).thenReturn(true);
-
-        NotificationRecord r = getBeepyNotification();
-
-        mService.buzzBeepBlinkLocked(r);
-        verifyNeverBeep();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testPostingSilentNotificationDoesNotAffectRateLimiting() throws Exception {
-        NotificationRecord r = getQuietNotification();
-        mService.buzzBeepBlinkLocked(r);
-
-        verify(mUsageStats, never()).isAlertRateLimited(any());
-    }
-
-    @Test
-    public void testPostingGroupSuppressedDoesNotAffectRateLimiting() throws Exception {
-        NotificationRecord summary = getBeepyNotificationRecord("a", GROUP_ALERT_CHILDREN);
-        summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
-
-        mService.buzzBeepBlinkLocked(summary);
-        verify(mUsageStats, never()).isAlertRateLimited(any());
-    }
-
-    @Test
-    public void testGroupSuppressionFailureDoesNotAffectRateLimiting() {
-        NotificationRecord summary = getBeepyNotificationRecord("a", GROUP_ALERT_SUMMARY);
-        summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
-
-        mService.buzzBeepBlinkLocked(summary);
-        verify(mUsageStats, times(1)).isAlertRateLimited(any());
-    }
-
-    @Test
-    public void testCrossUserSoundMuted() throws Exception {
-        final Notification n = new Builder(getContext(), "test")
-                .setSmallIcon(android.R.drawable.sym_def_app_icon).build();
-
-        int userId = mUser.getIdentifier() + 1;
-        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 0, mTag, mUid,
-                mPid, n, UserHandle.of(userId), null, System.currentTimeMillis());
-        NotificationRecord r = new NotificationRecord(getContext(), sbn,
-                new NotificationChannel("test", "test", IMPORTANCE_HIGH));
-
-        mService.buzzBeepBlinkLocked(r);
-        verifyNeverBeep();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testA11yMinInitialPost() throws Exception {
-        NotificationRecord r = getQuietNotification();
-        r.setSystemImportance(IMPORTANCE_MIN);
-        mService.buzzBeepBlinkLocked(r);
-        verify(mAccessibilityService, never()).sendAccessibilityEvent(any(), anyInt());
-    }
-
-    @Test
-    public void testA11yQuietInitialPost() throws Exception {
-        NotificationRecord r = getQuietNotification();
-        mService.buzzBeepBlinkLocked(r);
-        verify(mAccessibilityService, times(1)).sendAccessibilityEvent(any(), anyInt());
-    }
-
-    @Test
-    public void testA11yQuietUpdate() throws Exception {
-        NotificationRecord r = getQuietNotification();
-        mService.buzzBeepBlinkLocked(r);
-        r.isUpdate = true;
-        mService.buzzBeepBlinkLocked(r);
-        verify(mAccessibilityService, times(1)).sendAccessibilityEvent(any(), anyInt());
-    }
-
-    @Test
-    public void testA11yCrossUserEventNotSent() throws Exception {
-        final Notification n = new Builder(getContext(), "test")
-                .setSmallIcon(android.R.drawable.sym_def_app_icon).build();
-        int userId = mUser.getIdentifier() + 1;
-        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 0, mTag, mUid,
-                mPid, n, UserHandle.of(userId), null, System.currentTimeMillis());
-        NotificationRecord r = new NotificationRecord(getContext(), sbn,
-                new NotificationChannel("test", "test", IMPORTANCE_HIGH));
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verify(mAccessibilityService, never()).sendAccessibilityEvent(any(), anyInt());
-    }
-
-    @Test
-    public void testLightsScreenOn() {
-        mService.mScreenOn = true;
-        NotificationRecord r = getLightsNotification();
-        mService.buzzBeepBlinkLocked(r);
-        verifyNeverLights();
-        assertTrue(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testLightsInCall() {
-        mService.mInCallStateOffHook = true;
-        NotificationRecord r = getLightsNotification();
-        mService.buzzBeepBlinkLocked(r);
-        verifyNeverLights();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testLightsSilentUpdate() {
-        NotificationRecord r = getLightsOnceNotification();
-        mService.buzzBeepBlinkLocked(r);
-        verifyLights();
-        assertTrue(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-
-        r = getLightsOnceNotification();
-        r.isUpdate = true;
-        mService.buzzBeepBlinkLocked(r);
-        // checks that lights happened once, i.e. this new call didn't trigger them again
-        verifyLights();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testLightsUnimportant() {
-        NotificationRecord r = getLightsNotification();
-        r.setSystemImportance(IMPORTANCE_LOW);
-        mService.buzzBeepBlinkLocked(r);
-        verifyNeverLights();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testLightsNoLights() {
-        NotificationRecord r = getQuietNotification();
-        mService.buzzBeepBlinkLocked(r);
-        verifyNeverLights();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testLightsNoLightOnDevice() {
-        mService.mHasLight = false;
-        NotificationRecord r = getLightsNotification();
-        mService.buzzBeepBlinkLocked(r);
-        verifyNeverLights();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testLightsLightsOffGlobally() {
-        mService.mNotificationPulseEnabled = false;
-        NotificationRecord r = getLightsNotification();
-        mService.buzzBeepBlinkLocked(r);
-        verifyNeverLights();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testLightsDndIntercepted() {
-        NotificationRecord r = getLightsNotification();
-        r.setSuppressedVisualEffects(SUPPRESSED_EFFECT_LIGHTS);
-        mService.buzzBeepBlinkLocked(r);
-        verifyNeverLights();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertSummaryNoLightsChild() {
-        NotificationRecord child = getLightsNotificationRecord("a", GROUP_ALERT_SUMMARY);
-
-        mService.buzzBeepBlinkLocked(child);
-
-        verifyNeverLights();
-        assertFalse(child.isInterruptive());
-        assertEquals(-1, child.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertSummaryLightsSummary() {
-        NotificationRecord summary = getLightsNotificationRecord("a", GROUP_ALERT_SUMMARY);
-        summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
-
-        mService.buzzBeepBlinkLocked(summary);
-
-        verifyLights();
-        // summaries should never count for interruptiveness counts
-        assertFalse(summary.isInterruptive());
-        assertEquals(-1, summary.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertSummaryLightsNonGroupChild() {
-        NotificationRecord nonGroup = getLightsNotificationRecord(null, GROUP_ALERT_SUMMARY);
-
-        mService.buzzBeepBlinkLocked(nonGroup);
-
-        verifyLights();
-        assertTrue(nonGroup.isInterruptive());
-        assertEquals(-1, nonGroup.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertChildNoLightsSummary() {
-        NotificationRecord summary = getLightsNotificationRecord("a", GROUP_ALERT_CHILDREN);
-        summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
-
-        mService.buzzBeepBlinkLocked(summary);
-
-        verifyNeverLights();
-        assertFalse(summary.isInterruptive());
-        assertEquals(-1, summary.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertChildLightsChild() {
-        NotificationRecord child = getLightsNotificationRecord("a", GROUP_ALERT_CHILDREN);
-
-        mService.buzzBeepBlinkLocked(child);
-
-        verifyLights();
-        assertTrue(child.isInterruptive());
-        assertEquals(-1, child.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertChildLightsNonGroupSummary() {
-        NotificationRecord nonGroup = getLightsNotificationRecord(null, GROUP_ALERT_CHILDREN);
-
-        mService.buzzBeepBlinkLocked(nonGroup);
-
-        verifyLights();
-        assertTrue(nonGroup.isInterruptive());
-        assertEquals(-1, nonGroup.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testGroupAlertAllLightsGroup() {
-        NotificationRecord group = getLightsNotificationRecord("a", GROUP_ALERT_ALL);
-
-        mService.buzzBeepBlinkLocked(group);
-
-        verifyLights();
-        assertTrue(group.isInterruptive());
-        assertEquals(-1, group.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testLightsCheckCurrentUser() {
-        final Notification n = new Builder(getContext(), "test")
-                .setSmallIcon(android.R.drawable.sym_def_app_icon).build();
-        int userId = mUser.getIdentifier() + 10;
-        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 0, mTag, mUid,
-                mPid, n, UserHandle.of(userId), null, System.currentTimeMillis());
-        NotificationRecord r = new NotificationRecord(getContext(), sbn,
-                new NotificationChannel("test", "test", IMPORTANCE_HIGH));
-
-        mService.buzzBeepBlinkLocked(r);
-        verifyNeverLights();
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testListenerHintCall() throws Exception {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(Settings.System.DEFAULT_RINGTONE_URI,
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        NotificationRecord r = getCallRecord(1, ringtoneChannel, true);
-
-        mService.setHints(NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverBeep();
-    }
-
-    @Test
-    public void testListenerHintCall_notificationSound() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-
-        mService.setHints(NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyBeepUnlooped();
-    }
-
-    @Test
-    public void testListenerHintNotification() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-
-        mService.setHints(NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverBeep();
-    }
-
-    @Test
-    public void testListenerHintBoth() throws Exception {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(Settings.System.DEFAULT_RINGTONE_URI,
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        NotificationRecord r = getCallRecord(1, ringtoneChannel, true);
-        NotificationRecord s = getBeepyNotification();
-
-        mService.setHints(NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS
-                | NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS);
-
-        mService.buzzBeepBlinkLocked(r);
-        mService.buzzBeepBlinkLocked(s);
-
-        verifyNeverBeep();
-    }
-
-    @Test
-    public void testListenerHintNotification_callSound() throws Exception {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(Settings.System.DEFAULT_RINGTONE_URI,
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        NotificationRecord r = getCallRecord(1, ringtoneChannel, true);
-
-        mService.setHints(NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyBeepLooped();
-    }
-
-    @Test
-    public void testCannotInterruptRingtoneInsistentBeep() throws Exception {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(Settings.System.DEFAULT_RINGTONE_URI,
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, true);
-        mService.addNotification(ringtoneNotification);
-
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-        verifyBeepLooped();
-
-        NotificationRecord interrupter = getBeepyOtherNotification();
-        assertTrue(mService.shouldMuteNotificationLocked(interrupter));
-        mService.buzzBeepBlinkLocked(interrupter);
-
-        verifyBeep(1);
-
-        assertFalse(interrupter.isInterruptive());
-        assertEquals(-1, interrupter.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testRingtoneInsistentBeep_canUpdate() throws Exception {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(Uri.fromParts("a", "b", "c"),
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        ringtoneChannel.enableVibration(true);
-        NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, true);
-        mService.addNotification(ringtoneNotification);
-        assertFalse(mService.shouldMuteNotificationLocked(ringtoneNotification));
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-        verifyBeepLooped();
-        verifyDelayedVibrateLooped();
-        Mockito.reset(mVibrator);
-        Mockito.reset(mRingtonePlayer);
-
-        assertFalse(mService.shouldMuteNotificationLocked(ringtoneNotification));
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-
-        // beep wasn't reset
-        verifyNeverBeep();
-        verifyNeverVibrate();
-        verifyNeverStopAudio();
-        verifyNeverStopVibrate();
-    }
-
-    @Test
-    public void testRingtoneInsistentBeep_clearEffectsStopsSoundAndVibration() throws Exception {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(Uri.fromParts("a", "b", "c"),
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        ringtoneChannel.enableVibration(true);
-        NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, true);
-        mService.addNotification(ringtoneNotification);
-        assertFalse(mService.shouldMuteNotificationLocked(ringtoneNotification));
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-        verifyBeepLooped();
-        verifyDelayedVibrateLooped();
-
-        mService.clearSoundLocked();
-        mService.clearVibrateLocked();
-
-        verifyStopAudio();
-        verifyStopVibrate();
-    }
-
-    @Test
-    public void testRingtoneInsistentBeep_neverVibratesWhenEffectsClearedBeforeDelay()
-            throws Exception {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(Uri.fromParts("a", "b", "c"),
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        ringtoneChannel.enableVibration(true);
-        NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, true);
-        mService.addNotification(ringtoneNotification);
-        assertFalse(mService.shouldMuteNotificationLocked(ringtoneNotification));
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-        verifyBeepLooped();
-        verifyNeverVibrate();
-
-        mService.clearSoundLocked();
-        mService.clearVibrateLocked();
-
-        verifyStopAudio();
-        verifyDelayedNeverVibrate();
-    }
-
-    @Test
-    public void testCannotInterruptRingtoneInsistentBuzz() {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(Uri.EMPTY,
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        ringtoneChannel.enableVibration(true);
-        NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, true);
-        assertFalse(mService.shouldMuteNotificationLocked(ringtoneNotification));
-
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-        verifyVibrateLooped();
-
-        NotificationRecord interrupter = getBuzzyOtherNotification();
-        assertTrue(mService.shouldMuteNotificationLocked(interrupter));
-        mService.buzzBeepBlinkLocked(interrupter);
-
-        verifyVibrate(1);
-
-        assertFalse(interrupter.isInterruptive());
-        assertEquals(-1, interrupter.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testCanInterruptRingtoneNonInsistentBeep() throws Exception {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(Settings.System.DEFAULT_RINGTONE_URI,
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, false);
-
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-        verifyBeepUnlooped();
-
-        NotificationRecord interrupter = getBeepyOtherNotification();
-        mService.buzzBeepBlinkLocked(interrupter);
-
-        verifyBeep(2);
-
-        assertTrue(interrupter.isInterruptive());
-    }
-
-    @Test
-    public void testCanInterruptRingtoneNonInsistentBuzz() {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(null,
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        ringtoneChannel.enableVibration(true);
-        NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, false);
-
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-        verifyVibrate();
-
-        NotificationRecord interrupter = getBuzzyOtherNotification();
-        mService.buzzBeepBlinkLocked(interrupter);
-
-        verifyVibrate(2);
-
-        assertTrue(interrupter.isInterruptive());
-    }
-
-    @Test
-    public void testRingtoneInsistentBeep_doesNotBlockFutureSoundsOnceStopped() throws Exception {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(Settings.System.DEFAULT_RINGTONE_URI,
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, true);
-
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-        verifyBeepLooped();
-
-        mService.clearSoundLocked();
-
-        NotificationRecord interrupter = getBeepyOtherNotification();
-        mService.buzzBeepBlinkLocked(interrupter);
-
-        verifyBeep(2);
-
-        assertTrue(interrupter.isInterruptive());
-    }
-
-    @Test
-    public void testRingtoneInsistentBuzz_doesNotBlockFutureSoundsOnceStopped() {
-        NotificationChannel ringtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        ringtoneChannel.setSound(null,
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION_RINGTONE).build());
-        ringtoneChannel.enableVibration(true);
-        NotificationRecord ringtoneNotification = getCallRecord(1, ringtoneChannel, true);
-
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-        verifyVibrateLooped();
-
-        mService.clearVibrateLocked();
-
-        NotificationRecord interrupter = getBuzzyOtherNotification();
-        mService.buzzBeepBlinkLocked(interrupter);
-
-        verifyVibrate(2);
-
-        assertTrue(interrupter.isInterruptive());
-    }
-
-    @Test
-    public void testCanInterruptNonRingtoneInsistentBeep() throws Exception {
-        NotificationChannel fakeRingtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        NotificationRecord ringtoneNotification = getCallRecord(1, fakeRingtoneChannel, true);
-
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-        verifyBeepLooped();
-
-        NotificationRecord interrupter = getBeepyOtherNotification();
-        mService.buzzBeepBlinkLocked(interrupter);
-
-        verifyBeep(2);
-
-        assertTrue(interrupter.isInterruptive());
-    }
-
-    @Test
-    public void testCanInterruptNonRingtoneInsistentBuzz() {
-        NotificationChannel fakeRingtoneChannel =
-                new NotificationChannel("ringtone", "", IMPORTANCE_HIGH);
-        fakeRingtoneChannel.enableVibration(true);
-        fakeRingtoneChannel.setSound(null,
-                new AudioAttributes.Builder().setUsage(USAGE_NOTIFICATION).build());
-        NotificationRecord ringtoneNotification = getCallRecord(1, fakeRingtoneChannel, true);
-
-        mService.buzzBeepBlinkLocked(ringtoneNotification);
-
-        NotificationRecord interrupter = getBuzzyOtherNotification();
-        mService.buzzBeepBlinkLocked(interrupter);
-
-        verifyVibrate(2);
-
-        assertTrue(interrupter.isInterruptive());
-    }
-
-    @Test
-    public void testBubbleSuppressedNotificationDoesntMakeSound() {
-        Notification.BubbleMetadata metadata = new Notification.BubbleMetadata.Builder(
-                        mock(PendingIntent.class), mock(Icon.class))
-                .build();
-
-        NotificationRecord record = getBuzzyNotification();
-        metadata.setFlags(Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION);
-        record.getNotification().setBubbleMetadata(metadata);
-        record.setAllowBubble(true);
-        record.getNotification().flags |= FLAG_BUBBLE;
-        record.isUpdate = true;
-        record.setInterruptive(false);
-
-        mService.buzzBeepBlinkLocked(record);
-        verifyNeverVibrate();
-    }
-
-    @Test
-    public void testOverflowBubbleSuppressedNotificationDoesntMakeSound() {
-        Notification.BubbleMetadata metadata = new Notification.BubbleMetadata.Builder(
-                mock(PendingIntent.class), mock(Icon.class))
-                .build();
-
-        NotificationRecord record = getBuzzyNotification();
-        metadata.setFlags(Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION);
-        record.getNotification().setBubbleMetadata(metadata);
-        record.setFlagBubbleRemoved(true);
-        record.setAllowBubble(true);
-        record.isUpdate = true;
-        record.setInterruptive(false);
-
-        mService.buzzBeepBlinkLocked(record);
-        verifyNeverVibrate();
-    }
-
-    @Test
-    public void testBubbleUpdateMakesSound() {
-        Notification.BubbleMetadata metadata = new Notification.BubbleMetadata.Builder(
-                mock(PendingIntent.class), mock(Icon.class))
-                .build();
-
-        NotificationRecord record = getBuzzyNotification();
-        record.getNotification().setBubbleMetadata(metadata);
-        record.setAllowBubble(true);
-        record.getNotification().flags |= FLAG_BUBBLE;
-        record.isUpdate = true;
-        record.setInterruptive(true);
-
-        mService.buzzBeepBlinkLocked(record);
-        verifyVibrate(1);
-    }
-
-    @Test
-    public void testNewBubbleSuppressedNotifMakesSound() {
-        Notification.BubbleMetadata metadata = new Notification.BubbleMetadata.Builder(
-                mock(PendingIntent.class), mock(Icon.class))
-                .build();
-
-        NotificationRecord record = getBuzzyNotification();
-        metadata.setFlags(Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION);
-        record.getNotification().setBubbleMetadata(metadata);
-        record.setAllowBubble(true);
-        record.getNotification().flags |= FLAG_BUBBLE;
-        record.isUpdate = false;
-        record.setInterruptive(true);
-
-        mService.buzzBeepBlinkLocked(record);
-        verifyVibrate(1);
-    }
-
-    @Test
-    public void testStartFlashNotificationEvent_receiveBeepyNotification() throws Exception {
-        NotificationRecord r = getBeepyNotification();
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyBeepUnlooped();
-        verifyNeverVibrate();
-        verify(mAccessibilityService).startFlashNotificationEvent(any(), anyInt(),
-                eq(r.getSbn().getPackageName()));
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testStartFlashNotificationEvent_receiveBuzzyNotification() throws Exception {
-        NotificationRecord r = getBuzzyNotification();
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverBeep();
-        verifyVibrate();
-        verify(mAccessibilityService).startFlashNotificationEvent(any(), anyInt(),
-                eq(r.getSbn().getPackageName()));
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testStartFlashNotificationEvent_receiveBuzzyBeepyNotification() throws Exception {
-        NotificationRecord r = getBuzzyBeepyNotification();
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyBeepUnlooped();
-        verifyDelayedVibrate(r.getVibration());
-        verify(mAccessibilityService).startFlashNotificationEvent(any(), anyInt(),
-                eq(r.getSbn().getPackageName()));
-        assertTrue(r.isInterruptive());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    @Test
-    public void testStartFlashNotificationEvent_receiveBuzzyBeepyNotification_ringerModeSilent()
-            throws Exception {
-        NotificationRecord r = getBuzzyBeepyNotification();
-        when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
-        when(mAudioManager.getStreamVolume(anyInt())).thenReturn(0);
-        when(mAudioManager.shouldNotificationSoundPlay(any())).thenReturn(false);
-
-        mService.buzzBeepBlinkLocked(r);
-
-        verifyNeverBeep();
-        verifyNeverVibrate();
-        verify(mAccessibilityService).startFlashNotificationEvent(any(), anyInt(),
-                eq(r.getSbn().getPackageName()));
-        assertFalse(r.isInterruptive());
-        assertEquals(-1, r.getLastAudiblyAlertedMs());
-    }
-
-    static class VibrateRepeatMatcher implements ArgumentMatcher<VibrationEffect> {
-        private final int mRepeatIndex;
-
-        VibrateRepeatMatcher(int repeatIndex) {
-            mRepeatIndex = repeatIndex;
-        }
-
-        @Override
-        public boolean matches(VibrationEffect actual) {
-            if (actual instanceof VibrationEffect.Composed
-                    && ((VibrationEffect.Composed) actual).getRepeatIndex() == mRepeatIndex) {
-                return true;
-            }
-            // All non-waveform effects are essentially one shots.
-            return mRepeatIndex == -1;
-        }
-
-        @Override
-        public String toString() {
-            return "repeatIndex=" + mRepeatIndex;
-        }
-    }
-}
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 05b6c90..e5c42082 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
@@ -20,10 +20,12 @@
 import static android.os.UserManager.USER_TYPE_FULL_SECONDARY;
 import static android.os.UserManager.USER_TYPE_PROFILE_CLONE;
 import static android.os.UserManager.USER_TYPE_PROFILE_MANAGED;
+import static android.os.UserManager.USER_TYPE_PROFILE_PRIVATE;
 import static android.service.notification.NotificationListenerService.META_DATA_DEFAULT_AUTOBIND;
 
 import static com.android.server.notification.ManagedServices.APPROVAL_BY_COMPONENT;
 import static com.android.server.notification.ManagedServices.APPROVAL_BY_PACKAGE;
+import static com.android.server.notification.NotificationManagerService.privateSpaceFlagsEnabled;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -1803,7 +1805,7 @@
 
     @Test
     public void testInfoIsPermittedForProfile_notProfile() {
-        when(mUserProfiles.isProfileUser(anyInt())).thenReturn(false);
+        when(mUserProfiles.isProfileUser(anyInt(), any(Context.class))).thenReturn(false);
 
         IInterface service = mock(IInterface.class);
         when(service.asBinder()).thenReturn(mock(IBinder.class));
@@ -1817,7 +1819,7 @@
 
     @Test
     public void testInfoIsPermittedForProfile_profileAndDpmAllows() {
-        when(mUserProfiles.isProfileUser(anyInt())).thenReturn(true);
+        when(mUserProfiles.isProfileUser(anyInt(), any(Context.class))).thenReturn(true);
         when(mDpm.isNotificationListenerServicePermitted(anyString(), anyInt())).thenReturn(true);
 
         IInterface service = mock(IInterface.class);
@@ -1833,7 +1835,7 @@
 
     @Test
     public void testInfoIsPermittedForProfile_profileAndDpmDenies() {
-        when(mUserProfiles.isProfileUser(anyInt())).thenReturn(true);
+        when(mUserProfiles.isProfileUser(anyInt(), any(Context.class))).thenReturn(true);
         when(mDpm.isNotificationListenerServicePermitted(anyString(), anyInt())).thenReturn(false);
 
         IInterface service = mock(IInterface.class);
@@ -1853,20 +1855,29 @@
         UserInfo profile = new UserInfo(ActivityManager.getCurrentUser(), "current", 0);
         profile.userType = USER_TYPE_FULL_SECONDARY;
         users.add(profile);
-        UserInfo managed = new UserInfo(12, "12", 0);
+        UserInfo managed = new UserInfo(12, "12", UserInfo.FLAG_PROFILE);
         managed.userType = USER_TYPE_PROFILE_MANAGED;
         users.add(managed);
-        UserInfo clone = new UserInfo(13, "13", 0);
+        UserInfo clone = new UserInfo(13, "13", UserInfo.FLAG_PROFILE);
         clone.userType = USER_TYPE_PROFILE_CLONE;
         users.add(clone);
+        UserInfo privateProfile = new UserInfo(14, "14", UserInfo.FLAG_PROFILE);
+        if (privateSpaceFlagsEnabled()) {
+            privateProfile.userType = USER_TYPE_PROFILE_PRIVATE;
+            users.add(privateProfile);
+        }
         when(mUm.getProfiles(ActivityManager.getCurrentUser())).thenReturn(users);
+        when(mUm.getProfileParent(anyInt())).thenReturn(new UserInfo(0, "primary", 0));
 
         ManagedServices.UserProfiles profiles = new ManagedServices.UserProfiles();
         profiles.updateCache(mContext);
 
-        assertFalse(profiles.isProfileUser(ActivityManager.getCurrentUser()));
-        assertTrue(profiles.isProfileUser(12));
-        assertTrue(profiles.isProfileUser(13));
+        assertFalse(profiles.isProfileUser(ActivityManager.getCurrentUser(), mContext));
+        assertTrue(profiles.isProfileUser(12, mContext));
+        assertTrue(profiles.isProfileUser(13, mContext));
+        if (privateSpaceFlagsEnabled()) {
+            assertTrue(profiles.isProfileUser(14, mContext));
+        }
     }
 
     @Test
@@ -2015,7 +2026,7 @@
     @Test
     public void isComponentEnabledForCurrentProfiles_profileUserId() {
         final int profileUserId = 10;
-        when(mUserProfiles.isProfileUser(profileUserId)).thenReturn(true);
+        when(mUserProfiles.isProfileUser(profileUserId, mContext)).thenReturn(true);
         // Only approve for parent user (0)
         mService.addApprovedList("pkg1/cmp1:pkg2/cmp2:pkg3/cmp3", 0, true);
 
@@ -2028,7 +2039,7 @@
     @Test
     public void isComponentEnabledForCurrentProfiles_profileUserId_NAS() {
         final int profileUserId = 10;
-        when(mUserProfiles.isProfileUser(profileUserId)).thenReturn(true);
+        when(mUserProfiles.isProfileUser(profileUserId, mContext)).thenReturn(true);
         // Do not rebind for parent users (NAS use-case)
         ManagedServices service = spy(mService);
         when(service.allowRebindForParentUser()).thenReturn(false);
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 a1c24f1..0d6fdc9 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAttentionHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAttentionHelperTest.java
@@ -65,6 +65,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.graphics.Color;
 import android.graphics.drawable.Icon;
@@ -210,10 +211,11 @@
         assertTrue(mAccessibilityManager.isEnabled());
 
         // TODO (b/291907312): remove feature flag
-        mSetFlagsRule.enableFlags(Flags.FLAG_REFACTOR_ATTENTION_HELPER);
         // Disable feature flags by default. Tests should enable as needed.
         mSetFlagsRule.disableFlags(Flags.FLAG_POLITE_NOTIFICATIONS,
-                Flags.FLAG_CROSS_APP_POLITE_NOTIFICATIONS, Flags.FLAG_VIBRATE_WHILE_UNLOCKED);
+                Flags.FLAG_CROSS_APP_POLITE_NOTIFICATIONS,
+                Flags.FLAG_VIBRATE_WHILE_UNLOCKED,
+                Flags.FLAG_POLITE_NOTIFICATIONS_ATTN_UPDATE);
 
         mService = spy(new NotificationManagerService(getContext(), mNotificationRecordLogger,
             mNotificationInstanceIdSequence));
@@ -411,8 +413,8 @@
             boolean defaultSound, boolean defaultLights, String groupKey, int groupAlertBehavior,
             boolean isLeanback, UserHandle userHandle) {
         return getNotificationRecord(id, insistent, once, noisy, buzzy, lights, defaultVibration,
-                defaultSound, defaultLights, groupKey, groupAlertBehavior, isLeanback, userHandle,
-                mPkg);
+                defaultSound, defaultLights, groupKey, groupAlertBehavior, isLeanback, false,
+                userHandle, mPkg);
     }
 
     private NotificationRecord getNotificationRecord(int id,
@@ -420,6 +422,16 @@
             boolean noisy, boolean buzzy, boolean lights, boolean defaultVibration,
             boolean defaultSound, boolean defaultLights, String groupKey, int groupAlertBehavior,
             boolean isLeanback, UserHandle userHandle, String packageName) {
+        return getNotificationRecord(id, insistent, once, noisy, buzzy, lights, defaultVibration,
+                defaultSound, defaultLights, groupKey, groupAlertBehavior, isLeanback, false,
+                userHandle, packageName);
+    }
+
+    private NotificationRecord getNotificationRecord(int id,
+            boolean insistent, boolean once,
+            boolean noisy, boolean buzzy, boolean lights, boolean defaultVibration,
+            boolean defaultSound, boolean defaultLights, String groupKey, int groupAlertBehavior,
+            boolean isLeanback, boolean isConversation, UserHandle userHandle, String packageName) {
 
         final Builder builder = new Builder(getContext())
             .setContentTitle("foo")
@@ -427,6 +439,10 @@
             .setPriority(Notification.PRIORITY_HIGH)
             .setOnlyAlertOnce(once);
 
+        if (isConversation) {
+            builder.setStyle(new Notification.MessagingStyle("test user"));
+        }
+
         int defaults = 0;
         if (noisy) {
             if (defaultSound) {
@@ -486,6 +502,19 @@
         return r;
     }
 
+    private NotificationRecord getConversationNotificationRecord(int id,
+            boolean insistent, boolean once,
+            boolean noisy, boolean buzzy, boolean lights, boolean defaultVibration,
+            boolean defaultSound, boolean defaultLights, String groupKey, int groupAlertBehavior,
+            boolean isLeanback, UserHandle userHandle, String packageName, String shortcutId) {
+        NotificationRecord r = getNotificationRecord(id, insistent, once, noisy, buzzy, lights,
+                defaultVibration, defaultSound, defaultLights, groupKey, groupAlertBehavior,
+                isLeanback, true, userHandle, packageName);
+        ShortcutInfo.Builder sb = new ShortcutInfo.Builder(getContext());
+        r.setShortcutInfo(sb.setId(shortcutId).build());
+        return r;
+    }
+
     //
     // Convenience functions for interacting with mocks
     //
@@ -2058,12 +2087,14 @@
 
         // set up internal state
         mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
+        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
         Mockito.reset(mRingtonePlayer);
 
         // update should beep at 50% volume
         r.isUpdate = true;
         mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
         verifyBeepVolume(0.5f);
+        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
 
         // 2nd update should beep at 0% volume
         Mockito.reset(mRingtonePlayer);
@@ -2071,7 +2102,7 @@
         verifyBeepVolume(0.0f);
 
         verify(mAccessibilityService, times(3)).sendAccessibilityEvent(any(), anyInt());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
+        assertEquals(-1, r.getLastAudiblyAlertedMs());
     }
 
     @Test
@@ -2092,6 +2123,7 @@
 
         // set up internal state
         mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
+        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
         Mockito.reset(mRingtonePlayer);
 
         // Use different package for next notifications
@@ -2102,6 +2134,7 @@
         // update should beep at 50% volume
         mAttentionHelper.buzzBeepBlinkLocked(r2, DEFAULT_SIGNALS);
         verifyBeepVolume(0.5f);
+        assertNotEquals(-1, r2.getLastAudiblyAlertedMs());
 
         // Use different package for next notifications
         NotificationRecord r3 = getNotificationRecord(mId, false /* insistent */, false /* once */,
@@ -2114,7 +2147,7 @@
         verifyBeepVolume(0.0f);
 
         verify(mAccessibilityService, times(3)).sendAccessibilityEvent(any(), anyInt());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
+        assertEquals(-1, r3.getLastAudiblyAlertedMs());
     }
 
     @Test
@@ -2159,6 +2192,117 @@
     }
 
     @Test
+    public void testBeepVolume_politeNotif_AvalancheStrategy_AttnUpdate() 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);
+
+        // Trigger avalanche trigger intent
+        final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+        intent.putExtra("state", false);
+        mAvalancheBroadcastReceiver.onReceive(getContext(), intent);
+
+        NotificationRecord r = getBeepyNotification();
+
+        // set up internal state
+        mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
+        assertEquals(-1, r.getLastAudiblyAlertedMs());
+        Mockito.reset(mRingtonePlayer);
+
+        // Use different package for next notifications
+        NotificationRecord r2 = getNotificationRecord(mId, false /* insistent */, false /* once */,
+                true /* noisy */, false /* buzzy*/, false /* lights */, true, true,
+                false, null, Notification.GROUP_ALERT_ALL, false, mUser, "anotherPkg");
+
+        // update should beep at 0% volume
+        mAttentionHelper.buzzBeepBlinkLocked(r2, DEFAULT_SIGNALS);
+        assertEquals(-1, r2.getLastAudiblyAlertedMs());
+        verifyBeepVolume(0.0f);
+
+        // Use different package for next notifications
+        NotificationRecord r3 = getNotificationRecord(mId, false /* insistent */, false /* once */,
+                true /* noisy */, false /* buzzy*/, false /* lights */, true, true,
+                false, null, Notification.GROUP_ALERT_ALL, false, mUser, "yetAnotherPkg");
+
+        // 2nd update should beep at 0% volume
+        Mockito.reset(mRingtonePlayer);
+        mAttentionHelper.buzzBeepBlinkLocked(r3, DEFAULT_SIGNALS);
+        verifyBeepVolume(0.0f);
+
+        verify(mAccessibilityService, times(3)).sendAccessibilityEvent(any(), anyInt());
+        assertEquals(-1, r3.getLastAudiblyAlertedMs());
+    }
+
+    @Test
+    public void testBeepVolume_politeNotif_AvalancheStrategy_exempt_AttnUpdate()
+            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);
+
+        // Trigger avalanche trigger intent
+        final Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+        intent.putExtra("state", false);
+        mAvalancheBroadcastReceiver.onReceive(getContext(), intent);
+
+        NotificationRecord r = getBeepyNotification();
+        r.getNotification().category = Notification.CATEGORY_EVENT;
+
+        // Should beep at 100% volume
+        mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
+        verifyBeepVolume(1.0f);
+        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
+        Mockito.reset(mRingtonePlayer);
+
+        // Use different package for next notifications
+        NotificationRecord r2 = getConversationNotificationRecord(mId, false /* insistent */,
+                false /* once */, true /* noisy */, false /* buzzy*/, false /* lights */, true,
+                true, false, null, Notification.GROUP_ALERT_ALL, false, mUser, "anotherPkg",
+                "shortcut");
+
+        // Should beep at 100% volume
+        mAttentionHelper.buzzBeepBlinkLocked(r2, DEFAULT_SIGNALS);
+        assertNotEquals(-1, r2.getLastAudiblyAlertedMs());
+        verifyBeepVolume(1.0f);
+
+        // Use different package for next notifications
+        mChannel = new NotificationChannel("test3", "test3", IMPORTANCE_DEFAULT);
+        NotificationRecord r3 = getNotificationRecord(mId, false /* insistent */, false /* once */,
+                true /* noisy */, false /* buzzy*/, false /* lights */, true, true,
+                false, null, Notification.GROUP_ALERT_ALL, false, mUser, "yetAnotherPkg");
+
+        r3.getNotification().category = Notification.CATEGORY_REMINDER;
+
+        // Should beep at 100% volume
+        Mockito.reset(mRingtonePlayer);
+        mAttentionHelper.buzzBeepBlinkLocked(r3, DEFAULT_SIGNALS);
+        assertNotEquals(-1, r3.getLastAudiblyAlertedMs());
+        verifyBeepVolume(1.0f);
+
+        // Same package as r3 for next notifications
+        NotificationRecord r4 = getConversationNotificationRecord(mId, false /* insistent */,
+                false /* once */, true /* noisy */, false /* buzzy*/, false /* lights */, true,
+                true, false, null, Notification.GROUP_ALERT_ALL, false, mUser, "yetAnotherPkg",
+                "shortcut");
+
+        // 2nd update should beep at 50% volume
+        Mockito.reset(mRingtonePlayer);
+        mAttentionHelper.buzzBeepBlinkLocked(r4, DEFAULT_SIGNALS);
+        verifyBeepVolume(0.5f);
+
+        verify(mAccessibilityService, times(4)).sendAccessibilityEvent(any(), anyInt());
+        assertNotEquals(-1, r4.getLastAudiblyAlertedMs());
+    }
+
+    @Test
     public void testBeepVolume_politeNotif_applyPerApp() throws Exception {
         mSetFlagsRule.enableFlags(Flags.FLAG_POLITE_NOTIFICATIONS);
         mSetFlagsRule.disableFlags(Flags.FLAG_CROSS_APP_POLITE_NOTIFICATIONS);
@@ -2182,11 +2326,13 @@
         // update should beep at 50% volume
         NotificationRecord r2 = getBeepyNotification();
         mAttentionHelper.buzzBeepBlinkLocked(r2, DEFAULT_SIGNALS);
+        assertNotEquals(-1, r2.getLastAudiblyAlertedMs());
         verifyBeepVolume(0.5f);
 
         // 2nd update should beep at 0% volume
         Mockito.reset(mRingtonePlayer);
         mAttentionHelper.buzzBeepBlinkLocked(r2, DEFAULT_SIGNALS);
+        assertEquals(-1, r2.getLastAudiblyAlertedMs());
         verifyBeepVolume(0.0f);
 
         // Use different package for next notifications
@@ -2200,7 +2346,7 @@
         verifyBeepVolume(1.0f);
 
         verify(mAccessibilityService, times(4)).sendAccessibilityEvent(any(), anyInt());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
+        assertNotEquals(-1, r3.getLastAudiblyAlertedMs());
     }
 
     @Test
@@ -2228,11 +2374,13 @@
         // update should beep at 100% volume
         NotificationRecord r2 = getBeepyNotification();
         mAttentionHelper.buzzBeepBlinkLocked(r2, DEFAULT_SIGNALS);
+        assertNotEquals(-1, r2.getLastAudiblyAlertedMs());
         verifyBeepVolume(1.0f);
 
         // 2nd update should beep at 50% volume
         Mockito.reset(mRingtonePlayer);
         mAttentionHelper.buzzBeepBlinkLocked(r2, DEFAULT_SIGNALS);
+        assertNotEquals(-1, r2.getLastAudiblyAlertedMs());
         verifyBeepVolume(0.5f);
 
         // Use different package for next notifications
@@ -2247,7 +2395,7 @@
         verifyBeepVolume(1.0f);
 
         verify(mAccessibilityService, times(4)).sendAccessibilityEvent(any(), anyInt());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
+        assertNotEquals(-1, r3.getLastAudiblyAlertedMs());
     }
 
     @Test
@@ -2356,12 +2504,14 @@
 
         // set up internal state
         mAttentionHelper.buzzBeepBlinkLocked(r, WORK_PROFILE_SIGNALS);
+        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
         Mockito.reset(mRingtonePlayer);
 
         // update should beep at 50% volume
         r.isUpdate = true;
         mAttentionHelper.buzzBeepBlinkLocked(r, WORK_PROFILE_SIGNALS);
         verifyBeepVolume(0.5f);
+        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
 
         // 2nd update should beep at 0% volume
         Mockito.reset(mRingtonePlayer);
@@ -2369,7 +2519,7 @@
         verifyBeepVolume(0.0f);
 
         verify(mAccessibilityService, times(3)).sendAccessibilityEvent(any(), anyInt());
-        assertNotEquals(-1, r.getLastAudiblyAlertedMs());
+        assertEquals(-1, r.getLastAudiblyAlertedMs());
     }
 
     @Test
@@ -2486,6 +2636,17 @@
         }
     }
 
+    @Test
+    public void testSoundResetsRankingTime() throws Exception {
+        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_UPDATE_RANKING_TIME);
+        TestableFlagResolver flagResolver = new TestableFlagResolver();
+        initAttentionHelper(flagResolver);
+
+        NotificationRecord r = getBuzzyBeepyNotification();
+        mAttentionHelper.buzzBeepBlinkLocked(r, DEFAULT_SIGNALS);
+        assertThat(r.getRankingTimeMs()).isEqualTo(r.getSbn().getPostTime());
+    }
+
     static class VibrateRepeatMatcher implements ArgumentMatcher<VibrationEffect> {
         private final int mRepeatIndex;
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java
index 77ce2f0..ad25d76 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java
@@ -16,26 +16,43 @@
 
 package com.android.server.notification;
 
+import static android.app.Notification.CATEGORY_ALARM;
 import static android.app.NotificationManager.IMPORTANCE_HIGH;
 import static android.app.NotificationManager.IMPORTANCE_LOW;
 
+import static android.media.AudioAttributes.USAGE_ALARM;
+import static android.media.AudioAttributes.USAGE_MEDIA;
+import static android.media.AudioAttributes.USAGE_NOTIFICATION;
+import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE;
+import static android.media.AudioAttributes.USAGE_UNKNOWN;
+import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
+import static com.google.common.truth.Truth.assertThat;
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertNull;
 
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import android.app.Flags;
 import android.app.Notification;
 import android.app.NotificationChannel;
+import android.app.PendingIntent;
+import android.app.Person;
+import android.media.AudioAttributes;
+import android.net.Uri;
 import android.os.UserHandle;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.Settings;
 import android.service.notification.StatusBarNotification;
 
 import com.android.server.UiServiceTestCase;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -44,25 +61,34 @@
 
     @Mock RankingConfig mConfig;
 
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT);
+
+    NotificationChannelExtractor mExtractor;
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+
+        mExtractor = new NotificationChannelExtractor();
+        mExtractor.setConfig(mConfig);
+        mExtractor.initialize(mContext, null);
+    }
+
+    private NotificationRecord getRecord(NotificationChannel channel, Notification n) {
+        StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
+                0, n, UserHandle.ALL, null, System.currentTimeMillis());
+        return new NotificationRecord(getContext(), sbn, channel);
     }
 
     @Test
-    public void testExtractsUpdatedChannel() {
-        NotificationChannelExtractor extractor = new NotificationChannelExtractor();
-        extractor.setConfig(mConfig);
-        extractor.initialize(mContext, null);
-
+    public void testExtractsUpdatedConversationChannel() {
         NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_LOW);
-        final Notification.Builder builder = new Notification.Builder(getContext())
+        final Notification n = new Notification.Builder(getContext())
                 .setContentTitle("foo")
-                .setSmallIcon(android.R.drawable.sym_def_app_icon);
-        Notification n = builder.build();
-        StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
-                0, n, UserHandle.ALL, null, System.currentTimeMillis());
-        NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+        NotificationRecord r = getRecord(channel, n);
 
         NotificationChannel updatedChannel =
                 new NotificationChannel("a", "", IMPORTANCE_HIGH);
@@ -70,26 +96,19 @@
                 any(), anyInt(), eq("a"), eq(null), eq(true), eq(false)))
                 .thenReturn(updatedChannel);
 
-        assertNull(extractor.process(r));
+        assertNull(mExtractor.process(r));
         assertEquals(updatedChannel, r.getChannel());
     }
 
     @Test
-    public void testInvalidShortcutFlagEnabled_looksUpCorrectChannel() {
-
-        NotificationChannelExtractor extractor = new NotificationChannelExtractor();
-        extractor.setConfig(mConfig);
-        extractor.initialize(mContext, null);
-
+    public void testInvalidShortcutFlagEnabled_looksUpCorrectNonChannel() {
         NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_LOW);
-        final Notification.Builder builder = new Notification.Builder(getContext())
+        final Notification n = new Notification.Builder(getContext())
                 .setContentTitle("foo")
                 .setStyle(new Notification.MessagingStyle("name"))
-                .setSmallIcon(android.R.drawable.sym_def_app_icon);
-        Notification n = builder.build();
-        StatusBarNotification sbn = new StatusBarNotification("", "", 0, "tag", 0,
-                0, n, UserHandle.ALL, null, System.currentTimeMillis());
-        NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+        NotificationRecord r = getRecord(channel, n);
 
         NotificationChannel updatedChannel =
                 new NotificationChannel("a", "", IMPORTANCE_HIGH);
@@ -98,26 +117,19 @@
                 eq(true), eq(false)))
                 .thenReturn(updatedChannel);
 
-        assertNull(extractor.process(r));
+        assertNull(mExtractor.process(r));
         assertEquals(updatedChannel, r.getChannel());
     }
 
     @Test
     public void testInvalidShortcutFlagDisabled_looksUpCorrectChannel() {
-
-        NotificationChannelExtractor extractor = new NotificationChannelExtractor();
-        extractor.setConfig(mConfig);
-        extractor.initialize(mContext, null);
-
         NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_LOW);
-        final Notification.Builder builder = new Notification.Builder(getContext())
+        final Notification n = new Notification.Builder(getContext())
                 .setContentTitle("foo")
                 .setStyle(new Notification.MessagingStyle("name"))
-                .setSmallIcon(android.R.drawable.sym_def_app_icon);
-        Notification n = builder.build();
-        StatusBarNotification sbn = new StatusBarNotification("", "", 0, "tag", 0,
-                0, n, UserHandle.ALL, null, System.currentTimeMillis());
-        NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+        NotificationRecord r = getRecord(channel, n);
 
         NotificationChannel updatedChannel =
                 new NotificationChannel("a", "", IMPORTANCE_HIGH);
@@ -125,7 +137,129 @@
                 any(), anyInt(), eq("a"), eq(null), eq(true), eq(false)))
                 .thenReturn(updatedChannel);
 
-        assertNull(extractor.process(r));
+        assertNull(mExtractor.process(r));
         assertEquals(updatedChannel, r.getChannel());
     }
+
+    @Test
+    @EnableFlags(Flags.FLAG_RESTRICT_AUDIO_ATTRIBUTES_CALL)
+    public void testAudioAttributes_callStyleCanUseCallUsage() {
+        NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+        channel.setSound(Uri.EMPTY, new AudioAttributes.Builder()
+                .setUsage(USAGE_NOTIFICATION_RINGTONE)
+                .build());
+        final Notification n = new Notification.Builder(getContext())
+                .setContentTitle("foo")
+                .setStyle(Notification.CallStyle.forIncomingCall(
+                        new Person.Builder().setName("A Caller").build(),
+                        mock(PendingIntent.class),
+                        mock(PendingIntent.class)
+                ))
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+        NotificationRecord r = getRecord(channel, n);
+
+        assertThat(mExtractor.process(r)).isNull();
+        assertThat(r.getAudioAttributes().getUsage()).isEqualTo(USAGE_NOTIFICATION_RINGTONE);
+        assertThat(r.getChannel()).isEqualTo(channel);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_RESTRICT_AUDIO_ATTRIBUTES_CALL)
+    public void testAudioAttributes_nonCallStyleCannotUseCallUsage() {
+        NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+        channel.setSound(Uri.EMPTY, new AudioAttributes.Builder()
+                .setUsage(USAGE_NOTIFICATION_RINGTONE)
+                .build());
+        final Notification n = new Notification.Builder(getContext())
+                .setContentTitle("foo")
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+        NotificationRecord r = getRecord(channel, n);
+
+        assertThat(mExtractor.process(r)).isNull();
+        // instance updated
+        assertThat(r.getAudioAttributes().getUsage()).isEqualTo(USAGE_NOTIFICATION);
+        // in-memory channel unchanged
+        assertThat(channel.getAudioAttributes().getUsage()).isEqualTo(USAGE_NOTIFICATION_RINGTONE);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_RESTRICT_AUDIO_ATTRIBUTES_ALARM)
+    public void testAudioAttributes_alarmCategoryCanUseAlarmUsage() {
+        NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+        channel.setSound(Uri.EMPTY, new AudioAttributes.Builder()
+                .setUsage(USAGE_ALARM)
+                .build());
+        final Notification n = new Notification.Builder(getContext())
+                .setContentTitle("foo")
+                .setCategory(CATEGORY_ALARM)
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+        NotificationRecord r = getRecord(channel, n);
+
+        assertThat(mExtractor.process(r)).isNull();
+        assertThat(r.getAudioAttributes().getUsage()).isEqualTo(USAGE_ALARM);
+        assertThat(r.getChannel()).isEqualTo(channel);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_RESTRICT_AUDIO_ATTRIBUTES_ALARM)
+    public void testAudioAttributes_nonAlarmCategoryCannotUseAlarmUsage() {
+        NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+        channel.setSound(Uri.EMPTY, new AudioAttributes.Builder()
+                .setUsage(USAGE_ALARM)
+                .build());
+        final Notification n = new Notification.Builder(getContext())
+                .setContentTitle("foo")
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+        NotificationRecord r = getRecord(channel, n);
+
+        assertThat(mExtractor.process(r)).isNull();
+        // instance updated
+        assertThat(r.getAudioAttributes().getUsage()).isEqualTo(USAGE_NOTIFICATION);
+        // in-memory channel unchanged
+        assertThat(channel.getAudioAttributes().getUsage()).isEqualTo(USAGE_ALARM);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_RESTRICT_AUDIO_ATTRIBUTES_MEDIA)
+    public void testAudioAttributes_noMediaUsage() {
+        NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+        channel.setSound(Uri.EMPTY, new AudioAttributes.Builder()
+                .setUsage(USAGE_MEDIA)
+                .build());
+        final Notification n = new Notification.Builder(getContext())
+                .setContentTitle("foo")
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+        NotificationRecord r = getRecord(channel, n);
+
+        assertThat(mExtractor.process(r)).isNull();
+        // instance updated
+        assertThat(r.getAudioAttributes().getUsage()).isEqualTo(USAGE_NOTIFICATION);
+        // in-memory channel unchanged
+        assertThat(channel.getAudioAttributes().getUsage()).isEqualTo(USAGE_MEDIA);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_RESTRICT_AUDIO_ATTRIBUTES_MEDIA)
+    public void testAudioAttributes_noUnknownUsage() {
+        NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+        channel.setSound(Uri.EMPTY, new AudioAttributes.Builder()
+                .setUsage(USAGE_UNKNOWN)
+                .build());
+        final Notification n = new Notification.Builder(getContext())
+                .setContentTitle("foo")
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+        NotificationRecord r = getRecord(channel, n);
+
+        assertThat(mExtractor.process(r)).isNull();
+        // instance updated
+        assertThat(r.getAudioAttributes().getUsage()).isEqualTo(USAGE_NOTIFICATION);
+        // in-memory channel unchanged
+        assertThat(channel.getAudioAttributes().getUsage()).isEqualTo(USAGE_UNKNOWN);
+    }
 }
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 99ab405..6106278 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -24,6 +24,7 @@
 import static android.app.ActivityManagerInternal.ServiceNotificationPolicy.SHOW_IMMEDIATELY;
 import static android.app.ActivityTaskManager.INVALID_TASK_ID;
 import static android.app.Flags.FLAG_KEYGUARD_PRIVATE_NOTIFICATIONS;
+import static android.app.Flags.FLAG_UPDATE_RANKING_TIME;
 import static android.app.Notification.EXTRA_ALLOW_DURING_SETUP;
 import static android.app.Notification.EXTRA_PICTURE;
 import static android.app.Notification.EXTRA_PICTURE_ICON;
@@ -34,6 +35,7 @@
 import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
 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;
 import static android.app.Notification.FLAG_ONGOING_EVENT;
 import static android.app.Notification.FLAG_ONLY_ALERT_ONCE;
 import static android.app.Notification.FLAG_USER_INITIATED_JOB;
@@ -71,6 +73,8 @@
 import static android.content.pm.PackageManager.FEATURE_WATCH;
 import static android.content.pm.PackageManager.PERMISSION_DENIED;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.media.AudioAttributes.USAGE_MEDIA;
+import static android.media.AudioAttributes.USAGE_NOTIFICATION;
 import static android.os.Build.VERSION_CODES.O_MR1;
 import static android.os.Build.VERSION_CODES.P;
 import static android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE;
@@ -81,6 +85,7 @@
 import static android.os.UserManager.USER_TYPE_FULL_SECONDARY;
 import static android.os.UserManager.USER_TYPE_PROFILE_CLONE;
 import static android.os.UserManager.USER_TYPE_PROFILE_MANAGED;
+import static android.os.UserManager.USER_TYPE_PROFILE_PRIVATE;
 import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
 import static android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
 import static android.service.notification.Adjustment.KEY_CONTEXTUAL_ACTIONS;
@@ -108,6 +113,7 @@
 import static com.android.server.am.PendingIntentRecord.FLAG_SERVICE_SENDER;
 import static com.android.server.notification.NotificationManagerService.BITMAP_DURATION;
 import static com.android.server.notification.NotificationManagerService.DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE;
+import static com.android.server.notification.NotificationManagerService.NOTIFICATION_TTL;
 import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_ADJUSTED;
 import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_POSTED;
 import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_UPDATED;
@@ -132,24 +138,7 @@
 import static org.mockito.Matchers.anyLong;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.atLeastOnce;
-import static org.mockito.Mockito.clearInvocations;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.inOrder;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.timeout;
-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 static org.mockito.Mockito.*;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
@@ -206,8 +195,8 @@
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.graphics.drawable.Icon;
+import android.media.AudioAttributes;
 import android.media.AudioManager;
-import android.media.IRingtonePlayer;
 import android.media.session.MediaSession;
 import android.net.Uri;
 import android.os.Binder;
@@ -246,7 +235,6 @@
 import android.service.notification.ZenModeConfig;
 import android.service.notification.ZenPolicy;
 import android.telecom.TelecomManager;
-import android.telephony.TelephonyManager;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
@@ -358,9 +346,6 @@
                     .setOwner(new ComponentName("pkg", "cls"))
                     .build();
 
-    private final int mUid = Binder.getCallingUid();
-    private final @UserIdInt int mUserId = UserHandle.getUserId(mUid);
-
     @ClassRule
     public static final LimitDevicesRule sLimitDevicesRule = new LimitDevicesRule();
 
@@ -384,7 +369,6 @@
     @Mock
     private PermissionHelper mPermissionHelper;
     private NotificationChannelLoggerFake mLogger = new NotificationChannelLoggerFake();
-    private final String PKG = mContext.getPackageName();
     private TestableLooper mTestableLooper;
     @Mock
     private RankingHelper mRankingHelper;
@@ -439,6 +423,8 @@
     private NotificationChannel mTestNotificationChannel = new NotificationChannel(
             TEST_CHANNEL_ID, TEST_CHANNEL_ID, IMPORTANCE_DEFAULT);
 
+    NotificationChannel mSilentChannel = new NotificationChannel("low", "low", IMPORTANCE_LOW);
+
     private static final int NOTIFICATION_LOCATION_UNKNOWN = 0;
 
     private static final String VALID_CONVO_SHORTCUT_ID = "shortcut";
@@ -494,6 +480,9 @@
     @Mock
     StatusBarManagerInternal mStatusBar;
 
+    @Mock
+    NotificationAttentionHelper mAttentionHelper;
+
     private NotificationManagerService.WorkerHandler mWorkerHandler;
 
     private class TestableToastCallback extends ITransientNotification.Stub {
@@ -588,8 +577,8 @@
         when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
         when(mPackageManagerClient.hasSystemFeature(FEATURE_WATCH)).thenReturn(false);
         when(mUgmInternal.newUriPermissionOwner(anyString())).thenReturn(mPermOwner);
-        when(mPackageManager.getPackagesForUid(mUid)).thenReturn(new String[]{PKG});
-        when(mPackageManagerClient.getPackagesForUid(anyInt())).thenReturn(new String[]{PKG});
+        when(mPackageManager.getPackagesForUid(mUid)).thenReturn(new String[]{mPkg});
+        when(mPackageManagerClient.getPackagesForUid(anyInt())).thenReturn(new String[]{mPkg});
         when(mAtm.getTaskToShowPermissionDialogOn(anyString(), anyInt()))
                 .thenReturn(INVALID_TASK_ID);
         mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class));
@@ -621,7 +610,7 @@
         when(mNlf.isPackageAllowed(null)).thenReturn(true);
         when(mListeners.getNotificationListenerFilter(any())).thenReturn(mNlf);
         mListener = mListeners.new ManagedServiceInfo(
-                null, new ComponentName(PKG, "test_class"),
+                null, new ComponentName(mPkg, "test_class"),
                 mUserId, true, null, 0, 123);
         ComponentName defaultComponent = ComponentName.unflattenFromString("config/device");
         ArraySet<ComponentName> components = new ArraySet<>();
@@ -661,7 +650,7 @@
         // TODO (b/291907312): remove feature flag
         // NOTE: Prefer using the @EnableFlag annotation where possible. Do not add any android.app
         //  flags here.
-        mSetFlagsRule.disableFlags(Flags.FLAG_REFACTOR_ATTENTION_HELPER,
+        mSetFlagsRule.disableFlags(
                 Flags.FLAG_POLITE_NOTIFICATIONS, Flags.FLAG_AUTOGROUP_SUMMARY_ICON_UPDATE);
 
         initNMS();
@@ -695,11 +684,12 @@
                 mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager, mGroupHelper, mAm, mAtm,
                 mAppUsageStats, mDevicePolicyManager, mUgm, mUgmInternal,
                 mAppOpsManager, mUm, mHistoryManager, mStatsManager,
-                mock(TelephonyManager.class),
                 mAmi, mToastRateLimiter, mPermissionHelper, mock(UsageStatsManagerInternal.class),
                 mTelecomManager, mLogger, mTestFlagResolver, mPermissionManager,
                 mPowerManager, mPostNotificationTrackerFactory);
 
+        mService.setAttentionHelper(mAttentionHelper);
+
         // Return first true for RoleObserver main-thread check
         when(mMainLooper.isCurrentThread()).thenReturn(true).thenReturn(false);
 
@@ -715,13 +705,6 @@
             verify(mHistoryManager).onBootPhaseAppsCanStart();
         }
 
-        // TODO b/291907312: remove feature flag
-        if (Flags.refactorAttentionHelper()) {
-            mService.mAttentionHelper.setAudioManager(mAudioManager);
-        } else {
-            mService.setAudioManager(mAudioManager);
-        }
-
         mStrongAuthTracker = mService.new StrongAuthTrackerFake(mContext);
         mService.setStrongAuthTracker(mStrongAuthTracker);
 
@@ -771,7 +754,7 @@
         // Pretend the shortcut exists
         List<ShortcutInfo> shortcutInfos = new ArrayList<>();
         ShortcutInfo info = mock(ShortcutInfo.class);
-        when(info.getPackage()).thenReturn(PKG);
+        when(info.getPackage()).thenReturn(mPkg);
         when(info.getId()).thenReturn(VALID_CONVO_SHORTCUT_ID);
         when(info.getUserId()).thenReturn(USER_SYSTEM);
         when(info.isLongLived()).thenReturn(true);
@@ -793,14 +776,16 @@
         mBinderService = mService.getBinderService();
         mInternalService = mService.getInternalService();
 
-        mBinderService.createNotificationChannels(
-                PKG, new ParceledListSlice(Arrays.asList(mTestNotificationChannel)));
-        mBinderService.createNotificationChannels(
-                PKG_P, new ParceledListSlice(Arrays.asList(mTestNotificationChannel)));
-        mBinderService.createNotificationChannels(
-                PKG_O, new ParceledListSlice(Arrays.asList(mTestNotificationChannel)));
+        mBinderService.createNotificationChannels(mPkg, new ParceledListSlice(
+                Arrays.asList(mTestNotificationChannel, mSilentChannel)));
+        mBinderService.createNotificationChannels(PKG_P, new ParceledListSlice(
+                Arrays.asList(mTestNotificationChannel, mSilentChannel)));
+        mBinderService.createNotificationChannels(PKG_O, new ParceledListSlice(
+                Arrays.asList(mTestNotificationChannel, mSilentChannel)));
         assertNotNull(mBinderService.getNotificationChannel(
-                PKG, mContext.getUserId(), PKG, TEST_CHANNEL_ID));
+                mPkg, mContext.getUserId(), mPkg, TEST_CHANNEL_ID));
+        assertNotNull(mBinderService.getNotificationChannel(
+                mPkg, mContext.getUserId(), mPkg, mSilentChannel.getId()));
         clearInvocations(mRankingHandler);
         when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
 
@@ -1002,7 +987,7 @@
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
                 .setGroup(groupKey)
                 .setGroupSummary(isSummary);
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, id,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, id,
                 tag, mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         return new NotificationRecord(mContext, sbn, channel);
@@ -1024,14 +1009,14 @@
         if (extender != null) {
             nb.extend(extender);
         }
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         return new NotificationRecord(mContext, sbn, channel);
     }
 
     private NotificationRecord generateNotificationRecord(NotificationChannel channel,
             long postTime) {
-        final StatusBarNotification sbn = generateSbn(PKG, mUid, postTime, mUserId);
+        final StatusBarNotification sbn = generateSbn(mPkg, mUid, postTime, mUserId);
         return new NotificationRecord(mContext, sbn, channel);
     }
 
@@ -1041,13 +1026,18 @@
 
     private NotificationRecord generateNotificationRecord(NotificationChannel channel, int id,
             int userId) {
+        return generateNotificationRecord(channel, id, userId, "foo");
+    }
+
+    private NotificationRecord generateNotificationRecord(NotificationChannel channel, int id,
+            int userId, String title) {
         if (channel == null) {
             channel = mTestNotificationChannel;
         }
         Notification.Builder nb = new Notification.Builder(mContext, channel.getId())
-                .setContentTitle("foo")
+                .setContentTitle(title)
                 .setSmallIcon(android.R.drawable.sym_def_app_icon);
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, id, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, id, "tag", mUid, 0,
                 nb.build(), new UserHandle(userId), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, channel);
         return r;
@@ -1067,7 +1057,7 @@
             tag = "tag";
         }
         Notification.Builder nb = getMessageStyleNotifBuilder(addMetadata, groupKey, isSummary);
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, id,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, id,
                 tag, mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         return new NotificationRecord(mContext, sbn, channel);
@@ -1079,7 +1069,7 @@
                 .setContentTitle("foo")
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
                 .setContentText(REDACTED_TEXT);
-        return new StatusBarNotification(PKG, PKG, id, "tag", mUid, 0,
+        return new StatusBarNotification(mPkg, mPkg, id, "tag", mUid, 0,
                 nb.build(), new UserHandle(userId), null, 0);
     }
 
@@ -1201,13 +1191,13 @@
         NotificationRecord nrBubble = generateMessageBubbleNotifRecord(true /* addMetadata */,
                 mTestNotificationChannel, 1 /* id */, "tag", groupKey, false /* isSummary */);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nrBubble.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nrBubble.getSbn().getTag(),
                 nrBubble.getSbn().getId(), nrBubble.getSbn().getNotification(),
                 nrBubble.getSbn().getUserId());
         waitForIdle();
 
         // Make sure we are a bubble
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsAfter.length);
         assertTrue((notifsAfter[0].getNotification().flags & FLAG_BUBBLE) != 0);
 
@@ -1215,12 +1205,12 @@
         NotificationRecord nrPlain = generateMessageBubbleNotifRecord(false /* addMetadata */,
                 mTestNotificationChannel, 2 /* id */, "tag", groupKey, false /* isSummary */);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nrPlain.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nrPlain.getSbn().getTag(),
                 nrPlain.getSbn().getId(), nrPlain.getSbn().getNotification(),
                 nrPlain.getSbn().getUserId());
         waitForIdle();
 
-        notifsAfter = mBinderService.getActiveNotifications(PKG);
+        notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertEquals(2, notifsAfter.length);
 
         // Summary notification for both of those
@@ -1230,12 +1220,12 @@
         if (summaryAutoCancel) {
             nrSummary.getNotification().flags |= FLAG_AUTO_CANCEL;
         }
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nrSummary.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nrSummary.getSbn().getTag(),
                 nrSummary.getSbn().getId(), nrSummary.getSbn().getNotification(),
                 nrSummary.getSbn().getUserId());
         waitForIdle();
 
-        notifsAfter = mBinderService.getActiveNotifications(PKG);
+        notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertEquals(3, notifsAfter.length);
 
         return nrSummary;
@@ -1250,7 +1240,7 @@
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
                 .setTimeoutAfter(1);
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, channel);
 
@@ -1290,17 +1280,17 @@
     public void testCreateNotificationChannels_SingleChannel() throws Exception {
         final NotificationChannel channel =
                 new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(channel)));
         final NotificationChannel createdChannel =
-                mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id");
+                mBinderService.getNotificationChannel(mPkg, mContext.getUserId(), mPkg, "id");
         assertTrue(createdChannel != null);
     }
 
     @Test
     public void testCreateNotificationChannels_NullChannelThrowsException() throws Exception {
         try {
-            mBinderService.createNotificationChannels(PKG,
+            mBinderService.createNotificationChannels(mPkg,
                     new ParceledListSlice(Arrays.asList((Object[])null)));
             fail("Exception should be thrown immediately.");
         } catch (NullPointerException e) {
@@ -1325,11 +1315,11 @@
     public void testCreateNotificationChannels_SecondChannelWithFgndTaskDoesntStartPermDialog()
             throws Exception {
         when(mAtm.getTaskToShowPermissionDialogOn(anyString(), anyInt())).thenReturn(TEST_TASK_ID);
-        assertTrue(mBinderService.getNumNotificationChannelsForPackage(PKG, mUid, true) > 0);
+        assertTrue(mBinderService.getNumNotificationChannelsForPackage(mPkg, mUid, true) > 0);
 
         final NotificationChannel channel =
                 new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(channel)));
         verify(mWorkerHandler, never()).post(any(
                 NotificationManagerService.ShowNotificationPermissionPromptRunnable.class));
@@ -1343,7 +1333,7 @@
 
         final NotificationChannel channel =
                 new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(channel)));
 
         verify(mWorkerHandler, never()).post(any(
@@ -1356,12 +1346,12 @@
                 new NotificationChannel("id1", "name", IMPORTANCE_DEFAULT);
         final NotificationChannel channel2 =
                 new NotificationChannel("id2", "name", IMPORTANCE_DEFAULT);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(channel1, channel2)));
         assertTrue(mBinderService.getNotificationChannel(
-                PKG, mContext.getUserId(), PKG, "id1") != null);
+                mPkg, mContext.getUserId(), mPkg, "id1") != null);
         assertTrue(mBinderService.getNotificationChannel(
-                PKG, mContext.getUserId(), PKG, "id2") != null);
+                mPkg, mContext.getUserId(), mPkg, "id2") != null);
     }
 
     @Test
@@ -1369,16 +1359,16 @@
             throws Exception {
         final NotificationChannel channel =
                 new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(channel)));
 
         // Recreating the channel doesn't throw, but ignores importance.
         final NotificationChannel dupeChannel =
                 new NotificationChannel("id", "name", IMPORTANCE_HIGH);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(dupeChannel)));
         final NotificationChannel createdChannel =
-                mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id");
+                mBinderService.getNotificationChannel(mPkg, mContext.getUserId(), mPkg, "id");
         assertEquals(IMPORTANCE_DEFAULT, createdChannel.getImportance());
     }
 
@@ -1387,16 +1377,16 @@
             throws Exception {
         final NotificationChannel channel =
                 new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(channel)));
 
         // Recreating with a lower importance is allowed to modify the channel.
         final NotificationChannel dupeChannel =
                 new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_LOW);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(dupeChannel)));
         final NotificationChannel createdChannel =
-                mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id");
+                mBinderService.getNotificationChannel(mPkg, mContext.getUserId(), mPkg, "id");
         assertEquals(NotificationManager.IMPORTANCE_LOW, createdChannel.getImportance());
     }
 
@@ -1405,21 +1395,21 @@
             throws Exception {
         final NotificationChannel channel =
                 new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(channel)));
 
         // The user modifies importance directly, can no longer be changed by the app.
         final NotificationChannel updatedChannel =
                 new NotificationChannel("id", "name", IMPORTANCE_HIGH);
-        mBinderService.updateNotificationChannelForPackage(PKG, mUid, updatedChannel);
+        mBinderService.updateNotificationChannelForPackage(mPkg, mUid, updatedChannel);
 
         // Recreating with a lower importance leaves channel unchanged.
         final NotificationChannel dupeChannel =
                 new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_LOW);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(dupeChannel)));
         final NotificationChannel createdChannel =
-                mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id");
+                mBinderService.getNotificationChannel(mPkg, mContext.getUserId(), mPkg, "id");
         assertEquals(IMPORTANCE_HIGH, createdChannel.getImportance());
     }
 
@@ -1430,10 +1420,10 @@
                 new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
         final NotificationChannel channel2 =
                 new NotificationChannel("id", "name", IMPORTANCE_HIGH);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(channel1, channel2)));
         final NotificationChannel createdChannel =
-                mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id");
+                mBinderService.getNotificationChannel(mPkg, mContext.getUserId(), mPkg, "id");
         assertEquals(IMPORTANCE_DEFAULT, createdChannel.getImportance());
     }
 
@@ -1459,9 +1449,9 @@
         assertTrue(mService.isRecordBlockedLocked(r));
 
         mBinderService.createNotificationChannels(
-                PKG, new ParceledListSlice(Arrays.asList(channel)));
+                mPkg, new ParceledListSlice(Arrays.asList(channel)));
         final StatusBarNotification sbn = generateNotificationRecord(channel).getSbn();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testBlockedNotifications_blockedChannel",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         waitForIdle();
@@ -1478,18 +1468,18 @@
         NotificationChannel channel = new NotificationChannel("blocked", "name",
                 NotificationManager.IMPORTANCE_NONE);
         mBinderService.createNotificationChannels(
-                PKG, new ParceledListSlice(Arrays.asList(channel)));
+                mPkg, new ParceledListSlice(Arrays.asList(channel)));
 
         final StatusBarNotification sbn = generateNotificationRecord(channel).getSbn();
         sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         waitForIdle();
         assertEquals(1, mBinderService.getActiveNotifications(sbn.getPackageName()).length);
         assertEquals(IMPORTANCE_LOW,
                 mService.getNotificationRecord(sbn.getKey()).getImportance());
         assertEquals(IMPORTANCE_LOW, mBinderService.getNotificationChannel(
-                PKG, mContext.getUserId(), PKG, channel.getId()).getImportance());
+                mPkg, mContext.getUserId(), mPkg, channel.getId()).getImportance());
     }
 
     @Test
@@ -1502,18 +1492,18 @@
         NotificationChannel channel =
                 new NotificationChannel("blockedbyuser", "name", IMPORTANCE_HIGH);
         mBinderService.createNotificationChannels(
-                PKG, new ParceledListSlice(Arrays.asList(channel)));
+                mPkg, new ParceledListSlice(Arrays.asList(channel)));
 
         NotificationChannel update =
                 new NotificationChannel("blockedbyuser", "name", IMPORTANCE_NONE);
-        mBinderService.updateNotificationChannelForPackage(PKG, mUid, update);
+        mBinderService.updateNotificationChannelForPackage(mPkg, mUid, update);
         waitForIdle();
         assertEquals(IMPORTANCE_NONE, mBinderService.getNotificationChannel(
-                PKG, mContext.getUserId(), PKG, channel.getId()).getImportance());
+                mPkg, mContext.getUserId(), mPkg, channel.getId()).getImportance());
 
         StatusBarNotification sbn = generateNotificationRecord(channel).getSbn();
         sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         waitForIdle();
         // The first time a foreground service notification is shown, we allow the channel
@@ -1522,20 +1512,20 @@
         assertEquals(IMPORTANCE_LOW,
                 mService.getNotificationRecord(sbn.getKey()).getImportance());
         assertEquals(IMPORTANCE_LOW, mBinderService.getNotificationChannel(
-                PKG, mContext.getUserId(), PKG, channel.getId()).getImportance());
-        mBinderService.cancelNotificationWithTag(PKG, PKG, "tag", sbn.getId(), sbn.getUserId());
+                mPkg, mContext.getUserId(), mPkg, channel.getId()).getImportance());
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, "tag", sbn.getId(), sbn.getUserId());
         waitForIdle();
 
         update = new NotificationChannel("blockedbyuser", "name", IMPORTANCE_NONE);
         update.setUserVisibleTaskShown(true);
-        mBinderService.updateNotificationChannelForPackage(PKG, mUid, update);
+        mBinderService.updateNotificationChannelForPackage(mPkg, mUid, update);
         waitForIdle();
         assertEquals(IMPORTANCE_NONE, mBinderService.getNotificationChannel(
-                PKG, mContext.getUserId(), PKG, channel.getId()).getImportance());
+                mPkg, mContext.getUserId(), mPkg, channel.getId()).getImportance());
 
         sbn = generateNotificationRecord(channel).getSbn();
         sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testEnqueuedBlockedNotifications_userBlockedChannelForegroundService",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         waitForIdle();
@@ -1543,7 +1533,7 @@
         assertEquals(0, mBinderService.getActiveNotifications(sbn.getPackageName()).length);
         assertNull(mService.getNotificationRecord(sbn.getKey()));
         assertEquals(IMPORTANCE_NONE, mBinderService.getNotificationChannel(
-                PKG, mContext.getUserId(), PKG, channel.getId()).getImportance());
+                mPkg, mContext.getUserId(), mPkg, channel.getId()).getImportance());
     }
 
     @Test
@@ -1566,7 +1556,7 @@
         when(mPermissionHelper.hasPermission(mUid)).thenReturn(false);
 
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testEnqueuedBlockedNotifications_blockedApp",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         waitForIdle();
@@ -1582,7 +1572,7 @@
 
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testEnqueuedBlockedNotifications_blockedAppForegroundService",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         waitForIdle();
@@ -1611,12 +1601,12 @@
             final StatusBarNotification sbn =
                     generateNotificationRecord(mTestNotificationChannel, ++id, "", false).getSbn();
             sbn.getNotification().category = category;
-            mBinderService.enqueueNotificationWithTag(PKG, PKG,
+            mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                     "testEnqueuedRestrictedNotifications_asSystem",
                     sbn.getId(), sbn.getNotification(), sbn.getUserId());
         }
         waitForIdle();
-        assertEquals(categories.size(), mBinderService.getActiveNotifications(PKG).length);
+        assertEquals(categories.size(), mBinderService.getActiveNotifications(mPkg).length);
     }
 
 
@@ -1635,12 +1625,12 @@
             final StatusBarNotification sbn =
                     generateNotificationRecord(mTestNotificationChannel, ++id, "", false).getSbn();
             sbn.getNotification().category = category;
-            mBinderService.enqueueNotificationWithTag(PKG, PKG,
+            mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                     "testEnqueuedRestrictedNotifications_notAutomotive",
                     sbn.getId(), sbn.getNotification(), sbn.getUserId());
         }
         waitForIdle();
-        assertEquals(categories.size(), mBinderService.getActiveNotifications(PKG).length);
+        assertEquals(categories.size(), mBinderService.getActiveNotifications(mPkg).length);
     }
 
     /**
@@ -1658,7 +1648,7 @@
             final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
             sbn.getNotification().category = category;
             try {
-                mBinderService.enqueueNotificationWithTag(PKG, PKG,
+                mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                         "testEnqueuedRestrictedNotifications_badUser",
                         sbn.getId(), sbn.getNotification(), sbn.getUserId());
                 fail("Calls from non system apps should not allow use of restricted categories");
@@ -1667,7 +1657,7 @@
             }
         }
         waitForIdle();
-        assertEquals(0, mBinderService.getActiveNotifications(PKG).length);
+        assertEquals(0, mBinderService.getActiveNotifications(mPkg).length);
     }
 
     @Test
@@ -1747,7 +1737,7 @@
         NotificationRecord nr = generateNotificationRecord(
                 new NotificationChannel("did not create", "", IMPORTANCE_DEFAULT));
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -1757,7 +1747,7 @@
         reset(mPermissionHelper);
         when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -1769,7 +1759,7 @@
     public void testEnqueueNotification_appBlocked() throws Exception {
         when(mPermissionHelper.hasPermission(mUid)).thenReturn(false);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testEnqueueNotification_appBlocked", 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
         waitForIdle();
@@ -1779,11 +1769,11 @@
 
     @Test
     public void testEnqueueNotificationWithTag_PopulatesGetActiveNotifications() throws Exception {
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testEnqueueNotificationWithTag_PopulatesGetActiveNotifications", 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
         waitForIdle();
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifs.length);
         assertEquals(1, mService.getNotificationRecordCount());
     }
@@ -1791,7 +1781,7 @@
     @Test
     public void testEnqueueNotificationWithTag_WritesExpectedLogs() throws Exception {
         final String tag = "testEnqueueNotificationWithTag_WritesExpectedLog";
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
         waitForIdle();
         assertEquals(1, mNotificationRecordLogger.numCalls());
@@ -1803,7 +1793,7 @@
         assertNull(call.old);
         assertEquals(0, call.position);
         assertEquals(0, call.buzzBeepBlink);
-        assertEquals(PKG, call.r.getSbn().getPackageName());
+        assertEquals(mPkg, call.r.getSbn().getPackageName());
         assertEquals(0, call.r.getSbn().getId());
         assertEquals(tag, call.r.getSbn().getTag());
         assertEquals(1, call.getInstanceId());  // Fake instance IDs are assigned in order
@@ -1811,34 +1801,17 @@
     }
 
     @Test
-    public void testEnqueueNotificationWithTag_WritesExpectedLogs_NAHRefactor() throws Exception {
-        // TODO b/291907312: remove feature flag
-        mSetFlagsRule.enableFlags(Flags.FLAG_REFACTOR_ATTENTION_HELPER);
-        // Cleanup NMS before re-initializing
-        if (mService != null) {
-            try {
-                mService.onDestroy();
-            } catch (IllegalStateException | IllegalArgumentException e) {
-                // can throw if a broadcast receiver was never registered
-            }
-        }
-        initNMS();
-
-        testEnqueueNotificationWithTag_WritesExpectedLogs();
-    }
-
-    @Test
     public void testEnqueueNotificationWithTag_LogsOnMajorUpdates() throws Exception {
         final String tag = "testEnqueueNotificationWithTag_LogsOnMajorUpdates";
         Notification original = new Notification.Builder(mContext,
                 mTestNotificationChannel.getId())
                 .setSmallIcon(android.R.drawable.sym_def_app_icon).build();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0, original, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0, original, mUserId);
         Notification update = new Notification.Builder(mContext,
                 mTestNotificationChannel.getId())
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
                 .setCategory(Notification.CATEGORY_ALARM).build();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0, update, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0, update, mUserId);
         waitForIdle();
         assertEquals(2, mNotificationRecordLogger.numCalls());
 
@@ -1857,9 +1830,9 @@
     @Test
     public void testEnqueueNotificationWithTag_DoesNotLogOnMinorUpdate() throws Exception {
         final String tag = "testEnqueueNotificationWithTag_DoesNotLogOnMinorUpdate";
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
         waitForIdle();
         assertEquals(2, mNotificationRecordLogger.numCalls());
@@ -1872,12 +1845,12 @@
     @Test
     public void testEnqueueNotificationWithTag_DoesNotLogOnTitleUpdate() throws Exception {
         final String tag = "testEnqueueNotificationWithTag_DoesNotLogOnTitleUpdate";
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0,
                 generateNotificationRecord(null).getNotification(),
                 mUserId);
         final Notification notif = generateNotificationRecord(null).getNotification();
         notif.extras.putString(Notification.EXTRA_TITLE, "Changed title");
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0, notif, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0, notif, mUserId);
         waitForIdle();
         assertEquals(2, mNotificationRecordLogger.numCalls());
         assertEquals(NOTIFICATION_POSTED, mNotificationRecordLogger.event(0));
@@ -1890,11 +1863,11 @@
         Notification notification = new Notification.Builder(mContext,
                 mTestNotificationChannel.getId())
                 .setSmallIcon(android.R.drawable.sym_def_app_icon).build();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0, notification, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0, notification, mUserId);
         waitForIdle();
-        mBinderService.cancelNotificationWithTag(PKG, PKG, tag, 0, mUserId);
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, tag, 0, mUserId);
         waitForIdle();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0, notification, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0, notification, mUserId);
         waitForIdle();
         assertEquals(3, mNotificationRecordLogger.numCalls());
 
@@ -1931,14 +1904,14 @@
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
                 .setFlag(FLAG_FOREGROUND_SERVICE, true)
                 .build();
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, tag, mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, tag, mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, tag,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag,
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         waitForIdle();
 
         StatusBarNotification[] notifs =
-                mBinderService.getActiveNotifications(PKG);
+                mBinderService.getActiveNotifications(mPkg);
         assertThat(notifs[0].getNotification().flags).isEqualTo(
                 FLAG_FOREGROUND_SERVICE | FLAG_CAN_COLORIZE | FLAG_NO_CLEAR);
     }
@@ -1954,10 +1927,10 @@
                 .build();
         n.actions[1] = null;
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, n, mUserId);
         waitForIdle();
 
-        StatusBarNotification[] posted = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] posted = mBinderService.getActiveNotifications(mPkg);
         assertThat(posted).hasLength(1);
         assertThat(posted[0].getNotification().actions).hasLength(2);
         assertThat(posted[0].getNotification().actions[0].title.toString()).isEqualTo("one");
@@ -1975,17 +1948,17 @@
         n.actions[0] = null;
         n.actions[1] = null;
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, n, mUserId);
         waitForIdle();
 
-        StatusBarNotification[] posted = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] posted = mBinderService.getActiveNotifications(mPkg);
         assertThat(posted).hasLength(1);
         assertThat(posted[0].getNotification().actions).isNull();
     }
 
     @Test
     public void enqueueNotificationWithTag_usesAndFinishesTracker() throws Exception {
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testEnqueueNotificationWithTag_PopulatesGetActiveNotifications", 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
 
@@ -1994,7 +1967,7 @@
 
         waitForIdle();
 
-        assertThat(mBinderService.getActiveNotifications(PKG)).hasLength(1);
+        assertThat(mBinderService.getActiveNotifications(mPkg)).hasLength(1);
         assertThat(mPostNotificationTrackerFactory.mCreatedTrackers).hasSize(1);
         assertThat(mPostNotificationTrackerFactory.mCreatedTrackers.get(0).isOngoing()).isFalse();
     }
@@ -2003,13 +1976,13 @@
     public void enqueueNotificationWithTag_throws_usesAndCancelsTracker() throws Exception {
         // Simulate not enqueued due to rejected inputs.
         assertThrows(Exception.class,
-                () -> mBinderService.enqueueNotificationWithTag(PKG, PKG,
+                () -> mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                         "testEnqueueNotificationWithTag_PopulatesGetActiveNotifications", 0,
                         /* notification= */ null, mUserId));
 
         waitForIdle();
 
-        assertThat(mBinderService.getActiveNotifications(PKG)).hasLength(0);
+        assertThat(mBinderService.getActiveNotifications(mPkg)).hasLength(0);
         assertThat(mPostNotificationTrackerFactory.mCreatedTrackers).hasSize(1);
         assertThat(mPostNotificationTrackerFactory.mCreatedTrackers.get(0).isOngoing()).isFalse();
     }
@@ -2020,12 +1993,12 @@
         when(mSnoozeHelper.getSnoozeContextForUnpostedNotification(anyInt(), any(), any()))
                 .thenReturn("zzzzzzz");
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testEnqueueNotificationWithTag_PopulatesGetActiveNotifications", 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
         waitForIdle();
 
-        assertThat(mBinderService.getActiveNotifications(PKG)).hasLength(0);
+        assertThat(mBinderService.getActiveNotifications(mPkg)).hasLength(0);
         assertThat(mPostNotificationTrackerFactory.mCreatedTrackers).hasSize(1);
         assertThat(mPostNotificationTrackerFactory.mCreatedTrackers.get(0).isOngoing()).isFalse();
     }
@@ -2035,19 +2008,19 @@
         // Simulate not posted due to blocked app.
         when(mPermissionHelper.hasPermission(anyInt())).thenReturn(false);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testEnqueueNotificationWithTag_PopulatesGetActiveNotifications", 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
         waitForIdle();
 
-        assertThat(mBinderService.getActiveNotifications(PKG)).hasLength(0);
+        assertThat(mBinderService.getActiveNotifications(mPkg)).hasLength(0);
         assertThat(mPostNotificationTrackerFactory.mCreatedTrackers).hasSize(1);
         assertThat(mPostNotificationTrackerFactory.mCreatedTrackers.get(0).isOngoing()).isFalse();
     }
 
     @Test
     public void enqueueNotification_acquiresAndReleasesWakeLock() throws Exception {
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "enqueueNotification_acquiresAndReleasesWakeLock", 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
 
@@ -2065,7 +2038,7 @@
     public void enqueueNotification_throws_acquiresAndReleasesWakeLock() throws Exception {
         // Simulate not enqueued due to rejected inputs.
         assertThrows(Exception.class,
-                () -> mBinderService.enqueueNotificationWithTag(PKG, PKG,
+                () -> mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                         "enqueueNotification_throws_acquiresAndReleasesWakeLock", 0,
                         /* notification= */ null, mUserId));
 
@@ -2080,7 +2053,7 @@
         when(mSnoozeHelper.getSnoozeContextForUnpostedNotification(anyInt(), any(), any()))
                 .thenReturn("zzzzzzz");
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "enqueueNotification_notEnqueued_acquiresAndReleasesWakeLock", 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
 
@@ -2101,7 +2074,7 @@
                 .setContentTitle("foo")
                 .build();
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "enqueueNotification_notPosted_acquiresAndReleasesWakeLock", 0,
                 notif, mUserId);
 
@@ -2126,14 +2099,14 @@
         WakeLock wakeLock = mock(WakeLock.class);
         when(mPowerManager.newWakeLock(anyInt(), anyString())).thenReturn(wakeLock);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "enqueueNotification_setsWakeLockWorkSource", 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
         waitForIdle();
 
         InOrder inOrder = inOrder(mPowerManager, wakeLock);
         inOrder.verify(mPowerManager).newWakeLock(eq(PARTIAL_WAKE_LOCK), anyString());
-        inOrder.verify(wakeLock).setWorkSource(eq(new WorkSource(mUid, PKG)));
+        inOrder.verify(wakeLock).setWorkSource(eq(new WorkSource(mUid, mPkg)));
         inOrder.verify(wakeLock).acquire(anyLong());
         inOrder.verify(wakeLock).release();
         inOrder.verifyNoMoreInteractions();
@@ -2141,7 +2114,7 @@
 
     @Test
     public void testCancelNonexistentNotification() throws Exception {
-        mBinderService.cancelNotificationWithTag(PKG, PKG,
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg,
                 "testCancelNonexistentNotification", 0, mUserId);
         waitForIdle();
         // The notification record logger doesn't even get called when a nonexistent notification
@@ -2151,14 +2124,14 @@
 
     @Test
     public void testCancelNotificationImmediatelyAfterEnqueue() throws Exception {
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelNotificationImmediatelyAfterEnqueue", 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
-        mBinderService.cancelNotificationWithTag(PKG, PKG,
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg,
                 "testCancelNotificationImmediatelyAfterEnqueue", 0, mUserId);
         waitForIdle();
         StatusBarNotification[] notifs =
-                mBinderService.getActiveNotifications(PKG);
+                mBinderService.getActiveNotifications(mPkg);
         assertEquals(0, notifs.length);
         assertEquals(0, mService.getNotificationRecordCount());
     }
@@ -2167,39 +2140,39 @@
     public void testPostCancelPostNotifiesListeners() throws Exception {
         // WHEN a notification is posted
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", sbn.getId(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", sbn.getId(),
                 sbn.getNotification(), sbn.getUserId());
         mTestableLooper.moveTimeForward(1);
         // THEN it is canceled
-        mBinderService.cancelNotificationWithTag(PKG, PKG, "tag", sbn.getId(), sbn.getUserId());
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, "tag", sbn.getId(), sbn.getUserId());
         mTestableLooper.moveTimeForward(1);
         // THEN it is posted again (before the cancel has a chance to finish)
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", sbn.getId(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", sbn.getId(),
                 sbn.getNotification(), sbn.getUserId());
         // THEN the later enqueue isn't swallowed by the cancel. I.e., ordering is respected
         waitForIdle();
 
         // The final enqueue made it to the listener instead of being canceled
         StatusBarNotification[] notifs =
-                mBinderService.getActiveNotifications(PKG);
+                mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifs.length);
         assertEquals(1, mService.getNotificationRecordCount());
     }
 
     @Test
     public void testCancelNotificationWhilePostedAndEnqueued() throws Exception {
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelNotificationWhilePostedAndEnqueued", 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
         waitForIdle();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelNotificationWhilePostedAndEnqueued", 0,
                 generateNotificationRecord(null).getNotification(), mUserId);
-        mBinderService.cancelNotificationWithTag(PKG, PKG,
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg,
                 "testCancelNotificationWhilePostedAndEnqueued", 0, mUserId);
         waitForIdle();
         StatusBarNotification[] notifs =
-                mBinderService.getActiveNotifications(PKG);
+                mBinderService.getActiveNotifications(mPkg);
         assertEquals(0, notifs.length);
         assertEquals(0, mService.getNotificationRecordCount());
         ArgumentCaptor<NotificationStats> captor = ArgumentCaptor.forClass(NotificationStats.class);
@@ -2211,7 +2184,7 @@
     public void testCancelNotificationsFromListenerImmediatelyAfterEnqueue() throws Exception {
         NotificationRecord r = generateNotificationRecord(null);
         final StatusBarNotification sbn = r.getSbn();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelNotificationsFromListenerImmediatelyAfterEnqueue",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         mBinderService.cancelNotificationsFromListener(null, null);
@@ -2225,10 +2198,10 @@
     @Test
     public void testCancelAllNotificationsImmediatelyAfterEnqueue() throws Exception {
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelAllNotificationsImmediatelyAfterEnqueue",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+        mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
         waitForIdle();
         StatusBarNotification[] notifs =
                 mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -2241,7 +2214,7 @@
         final NotificationRecord n = generateNotificationRecord(
                 mTestNotificationChannel, 1, "group", true);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testUserInitiatedClearAll_noLeak",
                 n.getSbn().getId(), n.getSbn().getNotification(), n.getSbn().getUserId());
         waitForIdle();
@@ -2265,17 +2238,17 @@
         final NotificationRecord child = generateNotificationRecord(
                 mTestNotificationChannel, 2, "group1", false);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelAllNotificationsCancelsChildren",
                 parent.getSbn().getId(), parent.getSbn().getNotification(),
                 parent.getSbn().getUserId());
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelAllNotificationsCancelsChildren",
                 child.getSbn().getId(), child.getSbn().getNotification(),
                 child.getSbn().getUserId());
         waitForIdle();
 
-        mBinderService.cancelAllNotifications(PKG, parent.getSbn().getUserId());
+        mBinderService.cancelAllNotifications(mPkg, parent.getSbn().getUserId());
         waitForIdle();
         assertEquals(0, mService.getNotificationRecordCount());
     }
@@ -2284,11 +2257,11 @@
     public void testCancelAllNotificationsMultipleEnqueuedDoesNotCrash() throws Exception {
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         for (int i = 0; i < 10; i++) {
-            mBinderService.enqueueNotificationWithTag(PKG, PKG,
+            mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                     "testCancelAllNotificationsMultipleEnqueuedDoesNotCrash",
                     sbn.getId(), sbn.getNotification(), sbn.getUserId());
         }
-        mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+        mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
         waitForIdle();
 
         assertEquals(0, mService.getNotificationRecordCount());
@@ -2304,7 +2277,7 @@
                 mTestNotificationChannel, 2, "group1", false);
 
         // fully post parent notification
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelGroupSummaryMultipleEnqueuedChildrenDoesNotCrash",
                 parent.getSbn().getId(), parent.getSbn().getNotification(),
                 parent.getSbn().getUserId());
@@ -2312,13 +2285,13 @@
 
         // enqueue the child several times
         for (int i = 0; i < 10; i++) {
-            mBinderService.enqueueNotificationWithTag(PKG, PKG,
+            mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                     "testCancelGroupSummaryMultipleEnqueuedChildrenDoesNotCrash",
                     child.getSbn().getId(), child.getSbn().getNotification(),
                     child.getSbn().getUserId());
         }
         // make the parent a child, which will cancel the child notification
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelGroupSummaryMultipleEnqueuedChildrenDoesNotCrash",
                 parentAsChild.getSbn().getId(), parentAsChild.getSbn().getNotification(),
                 parentAsChild.getSbn().getUserId());
@@ -2370,10 +2343,10 @@
                 any(), anyString(), anyInt(), anyString(), anyInt())).thenReturn(SHOW_IMMEDIATELY);
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelAllNotifications_IgnoreForegroundService",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+        mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
         waitForIdle();
         StatusBarNotification[] notifs =
                 mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -2388,10 +2361,10 @@
                 .thenReturn(NOT_FOREGROUND_SERVICE);
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelAllNotifications_IgnoreForegroundService",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+        mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
         waitForIdle();
         StatusBarNotification[] notifs =
                 mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -2405,7 +2378,7 @@
                 .thenReturn(SHOW_IMMEDIATELY);
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelAllNotifications_IgnoreOtherPackages",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         mBinderService.cancelAllNotifications("other_pkg_name", sbn.getUserId());
@@ -2419,7 +2392,7 @@
     @Test
     public void testCancelAllNotifications_NullPkgRemovesAll() throws Exception {
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelAllNotifications_NullPkgRemovesAll",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         mBinderService.cancelAllNotifications(null, sbn.getUserId());
@@ -2433,7 +2406,7 @@
     @Test
     public void testCancelAllNotifications_NullPkgIgnoresUserAllNotifications() throws Exception {
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelAllNotifications_NullPkgIgnoresUserAllNotifications",
                 sbn.getId(), sbn.getNotification(), UserHandle.USER_ALL);
         // Null pkg is how we signal a user switch.
@@ -2449,10 +2422,10 @@
     public void testAppInitiatedCancelAllNotifications_CancelsNoClearFlag() throws Exception {
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags |= Notification.FLAG_NO_CLEAR;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testAppInitiatedCancelAllNotifications_CancelsNoClearFlag",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+        mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
         waitForIdle();
         StatusBarNotification[] notifs =
                 mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -2465,7 +2438,7 @@
                 mTestNotificationChannel, 1, "group", true);
         notif.getNotification().flags |= Notification.FLAG_NO_CLEAR;
         mService.addNotification(notif);
-        mService.cancelAllNotificationsInt(mUid, 0, PKG, null, 0, 0,
+        mService.cancelAllNotificationsInt(mUid, 0, mPkg, null, 0, 0,
                 notif.getUserId(), REASON_CANCEL);
         waitForIdle();
         StatusBarNotification[] notifs =
@@ -2500,9 +2473,9 @@
         StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, null, mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, null,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, null,
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        mInternalService.removeForegroundServiceFlagFromNotification(PKG, sbn.getId(),
+        mInternalService.removeForegroundServiceFlagFromNotification(mPkg, sbn.getId(),
                 sbn.getUserId());
         waitForIdle();
         StatusBarNotification[] notifs =
@@ -2515,12 +2488,12 @@
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags =
                 Notification.FLAG_ONGOING_EVENT | FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         sbn.getNotification().flags = Notification.FLAG_ONGOING_EVENT;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        mBinderService.cancelNotificationWithTag(PKG, PKG, sbn.getTag(), sbn.getId(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, sbn.getTag(), sbn.getId(),
                 sbn.getUserId());
         waitForIdle();
         assertEquals(0, mBinderService.getActiveNotifications(sbn.getPackageName()).length);
@@ -2539,7 +2512,7 @@
         assertThat(mBinderService.getActiveNotifications(sbn.getPackageName()).length).isEqualTo(1);
         assertThat(mService.getNotificationRecordCount()).isEqualTo(1);
 
-        mBinderService.cancelNotificationWithTag(PKG, PKG, sbn.getTag(), sbn.getId(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, sbn.getTag(), sbn.getId(),
                 sbn.getUserId());
         waitForIdle();
 
@@ -2558,7 +2531,7 @@
                 FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY);
 
         mSetFlagsRule.disableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
-        mBinderService.cancelNotificationWithTag(PKG, PKG, sbn.getTag(), sbn.getId(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, sbn.getTag(), sbn.getId(),
                 sbn.getUserId());
         waitForIdle();
 
@@ -2580,13 +2553,13 @@
                 mTestNotificationChannel, 2, null, false);
         mService.addNotification(notifCancelable);
         // Verify that both notifications have been posted and are active.
-        assertThat(mBinderService.getActiveNotifications(PKG).length).isEqualTo(2);
+        assertThat(mBinderService.getActiveNotifications(mPkg).length).isEqualTo(2);
 
-        mBinderService.cancelAllNotifications(PKG, notif.getSbn().getUserId());
+        mBinderService.cancelAllNotifications(mPkg, notif.getSbn().getUserId());
         waitForIdle();
 
         // The non-lifetime extended notification, with id = 2, has been cancelled.
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertThat(notifs.length).isEqualTo(1);
         assertThat(notifs[0].getId()).isEqualTo(1);
 
@@ -3268,7 +3241,7 @@
     public void testGroupInstanceIds() throws Exception {
         final NotificationRecord group1 = generateNotificationRecord(
                 mTestNotificationChannel, 1, "group1", true);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "testGroupInstanceIds",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testGroupInstanceIds",
                 group1.getSbn().getId(), group1.getSbn().getNotification(),
                 group1.getSbn().getUserId());
         waitForIdle();
@@ -3276,7 +3249,7 @@
         // same group, child, should be returned
         final NotificationRecord group1Child = generateNotificationRecord(
                 mTestNotificationChannel, 2, "group1", false);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "testGroupInstanceIds",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testGroupInstanceIds",
                 group1Child.getSbn().getId(),
                 group1Child.getSbn().getNotification(), group1Child.getSbn().getUserId());
         waitForIdle();
@@ -3297,7 +3270,7 @@
         // should not be returned
         final NotificationRecord group2 = generateNotificationRecord(
                 mTestNotificationChannel, 2, "group2", true);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "testFindGroupNotificationsLocked",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testFindGroupNotificationsLocked",
                 group2.getSbn().getId(), group2.getSbn().getNotification(),
                 group2.getSbn().getUserId());
         waitForIdle();
@@ -3305,7 +3278,7 @@
         // should not be returned
         final NotificationRecord nonGroup = generateNotificationRecord(
                 mTestNotificationChannel, 3, null, false);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "testFindGroupNotificationsLocked",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testFindGroupNotificationsLocked",
                 nonGroup.getSbn().getId(), nonGroup.getSbn().getNotification(),
                 nonGroup.getSbn().getUserId());
         waitForIdle();
@@ -3313,13 +3286,13 @@
         // same group, child, should be returned
         final NotificationRecord group1Child = generateNotificationRecord(
                 mTestNotificationChannel, 4, "group1", false);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "testFindGroupNotificationsLocked",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testFindGroupNotificationsLocked",
                 group1Child.getSbn().getId(),
                 group1Child.getSbn().getNotification(), group1Child.getSbn().getUserId());
         waitForIdle();
 
         List<NotificationRecord> inGroup1 =
-                mService.findGroupNotificationsLocked(PKG, group1.getGroupKey(),
+                mService.findGroupNotificationsLocked(mPkg, group1.getGroupKey(),
                         group1.getSbn().getUserId());
         assertEquals(3, inGroup1.size());
         for (NotificationRecord record : inGroup1) {
@@ -3334,7 +3307,7 @@
                 mTestNotificationChannel, 1, "group", true);
         notif.getNotification().flags |= Notification.FLAG_NO_CLEAR;
         mService.addNotification(notif);
-        mService.cancelAllNotificationsInt(mUid, 0, PKG, null, 0,
+        mService.cancelAllNotificationsInt(mUid, 0, mPkg, null, 0,
                 Notification.FLAG_ONGOING_EVENT, notif.getUserId(), REASON_CANCEL);
         waitForIdle();
         StatusBarNotification[] notifs =
@@ -3346,10 +3319,10 @@
     public void testAppInitiatedCancelAllNotifications_CancelsOngoingFlag() throws Exception {
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags |= Notification.FLAG_ONGOING_EVENT;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testAppInitiatedCancelAllNotifications_CancelsOnGoingFlag",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+        mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
         waitForIdle();
         StatusBarNotification[] notifs =
                 mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -3362,7 +3335,7 @@
                 mTestNotificationChannel, 1, "group", true);
         notif.getNotification().flags |= Notification.FLAG_ONGOING_EVENT;
         mService.addNotification(notif);
-        mService.cancelAllNotificationsInt(mUid, 0, PKG, null, 0, 0,
+        mService.cancelAllNotificationsInt(mUid, 0, mPkg, null, 0, 0,
                 notif.getUserId(), REASON_CANCEL);
         waitForIdle();
         StatusBarNotification[] notifs =
@@ -3458,16 +3431,16 @@
     @Test
     public void testPostNotification_appPermissionFixed() throws Exception {
         when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
-        when(mPermissionHelper.isPermissionFixed(PKG, mUserId)).thenReturn(true);
+        when(mPermissionHelper.isPermissionFixed(mPkg, mUserId)).thenReturn(true);
 
         NotificationRecord temp = generateNotificationRecord(mTestNotificationChannel);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testPostNotification_appPermissionFixed", 0,
                 temp.getNotification(), mUserId);
         waitForIdle();
         assertThat(mService.getNotificationRecordCount()).isEqualTo(1);
         StatusBarNotification[] notifs =
-                mBinderService.getActiveNotifications(PKG);
+                mBinderService.getActiveNotifications(mPkg);
         assertThat(mService.getNotificationRecord(notifs[0].getKey()).isImportanceFixed()).isTrue();
     }
 
@@ -3477,7 +3450,7 @@
         mService.addNotification(temp);
 
         when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
-        when(mPermissionHelper.isPermissionFixed(PKG, temp.getUserId())).thenReturn(true);
+        when(mPermissionHelper.isPermissionFixed(mPkg, temp.getUserId())).thenReturn(true);
 
         NotificationRecord r = mService.createAutoGroupSummary(temp.getUserId(),
                 temp.getSbn().getPackageName(), temp.getKey(), 0, mock(Icon.class), 0,
@@ -3495,7 +3468,7 @@
                     new NotificationChannel("foo", "foo", IMPORTANCE_HIGH));
 
         Notification.TvExtender tv = new Notification.TvExtender().setChannelId("foo");
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "testTvExtenderChannelOverride_onTv", 0,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testTvExtenderChannelOverride_onTv", 0,
                 generateNotificationRecord(null, tv).getNotification(), mUserId);
         verify(mPreferencesHelper, times(1)).getConversationNotificationChannel(
                 anyString(), anyInt(), eq("foo"), eq(null), anyBoolean(), anyBoolean());
@@ -3510,7 +3483,7 @@
                 mTestNotificationChannel);
 
         Notification.TvExtender tv = new Notification.TvExtender().setChannelId("foo");
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "testTvExtenderChannelOverride_notOnTv",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testTvExtenderChannelOverride_notOnTv",
                 0, generateNotificationRecord(null, tv).getNotification(), mUserId);
         verify(mPreferencesHelper, times(1)).getConversationNotificationChannel(
                 anyString(), anyInt(), eq(mTestNotificationChannel.getId()), eq(null),
@@ -3623,7 +3596,7 @@
     public void testUpdateAppNotifyCreatorBlock() throws Exception {
         when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
 
-        mBinderService.setNotificationsEnabledForPackage(PKG, mUid, false);
+        mBinderService.setNotificationsEnabledForPackage(mPkg, mUid, false);
         Thread.sleep(500);
         waitForIdle();
 
@@ -3632,7 +3605,7 @@
 
         assertEquals(NotificationManager.ACTION_APP_BLOCK_STATE_CHANGED,
                 captor.getValue().getAction());
-        assertEquals(PKG, captor.getValue().getPackage());
+        assertEquals(mPkg, captor.getValue().getPackage());
         assertTrue(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, true));
     }
 
@@ -3640,7 +3613,7 @@
     public void testUpdateAppNotifyCreatorBlock_notIfMatchesExistingSetting() throws Exception {
         when(mPermissionHelper.hasPermission(mUid)).thenReturn(false);
 
-        mBinderService.setNotificationsEnabledForPackage(PKG, 0, false);
+        mBinderService.setNotificationsEnabledForPackage(mPkg, 0, false);
         verify(mContext, never()).sendBroadcastAsUser(any(), any(), eq(null));
     }
 
@@ -3648,7 +3621,7 @@
     public void testUpdateAppNotifyCreatorUnblock() throws Exception {
         when(mPermissionHelper.hasPermission(mUid)).thenReturn(false);
 
-        mBinderService.setNotificationsEnabledForPackage(PKG, mUid, true);
+        mBinderService.setNotificationsEnabledForPackage(mPkg, mUid, true);
         Thread.sleep(500);
         waitForIdle();
 
@@ -3657,14 +3630,14 @@
 
         assertEquals(NotificationManager.ACTION_APP_BLOCK_STATE_CHANGED,
                 captor.getValue().getAction());
-        assertEquals(PKG, captor.getValue().getPackage());
+        assertEquals(mPkg, captor.getValue().getPackage());
         assertFalse(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, true));
     }
 
     @Test
     public void testUpdateChannelNotifyCreatorBlock() throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
                 eq(mTestNotificationChannel.getId()), anyBoolean()))
                 .thenReturn(mTestNotificationChannel);
 
@@ -3672,13 +3645,13 @@
                 new NotificationChannel(mTestNotificationChannel.getId(),
                         mTestNotificationChannel.getName(), IMPORTANCE_NONE);
 
-        mBinderService.updateNotificationChannelForPackage(PKG, 0, updatedChannel);
+        mBinderService.updateNotificationChannelForPackage(mPkg, 0, updatedChannel);
         ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
         verify(mContext, times(1)).sendBroadcastAsUser(captor.capture(), any(), eq(null));
 
         assertEquals(NotificationManager.ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED,
                 captor.getValue().getAction());
-        assertEquals(PKG, captor.getValue().getPackage());
+        assertEquals(mPkg, captor.getValue().getPackage());
         assertEquals(mTestNotificationChannel.getId(), captor.getValue().getStringExtra(
                         NotificationManager.EXTRA_NOTIFICATION_CHANNEL_ID));
         assertTrue(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false));
@@ -3690,17 +3663,17 @@
                 new NotificationChannel(mTestNotificationChannel.getId(),
                         mTestNotificationChannel.getName(), IMPORTANCE_NONE);
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
                 eq(mTestNotificationChannel.getId()), anyBoolean()))
                 .thenReturn(existingChannel);
 
-        mBinderService.updateNotificationChannelForPackage(PKG, 0, mTestNotificationChannel);
+        mBinderService.updateNotificationChannelForPackage(mPkg, 0, mTestNotificationChannel);
         ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
         verify(mContext, times(1)).sendBroadcastAsUser(captor.capture(), any(), eq(null));
 
         assertEquals(NotificationManager.ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED,
                 captor.getValue().getAction());
-        assertEquals(PKG, captor.getValue().getPackage());
+        assertEquals(mPkg, captor.getValue().getPackage());
         assertEquals(mTestNotificationChannel.getId(), captor.getValue().getStringExtra(
                 NotificationManager.EXTRA_NOTIFICATION_CHANNEL_ID));
         assertFalse(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false));
@@ -3712,11 +3685,11 @@
                 new NotificationChannel(mTestNotificationChannel.getId(),
                         mTestNotificationChannel.getName(), IMPORTANCE_MAX);
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
                 eq(mTestNotificationChannel.getId()), anyBoolean()))
                 .thenReturn(existingChannel);
 
-        mBinderService.updateNotificationChannelForPackage(PKG, 0, mTestNotificationChannel);
+        mBinderService.updateNotificationChannelForPackage(mPkg, 0, mTestNotificationChannel);
         verify(mContext, never()).sendBroadcastAsUser(any(), any(), eq(null));
     }
 
@@ -3725,19 +3698,19 @@
         NotificationChannelGroup existing = new NotificationChannelGroup("id", "name");
         mService.setPreferencesHelper(mPreferencesHelper);
         when(mPreferencesHelper.getNotificationChannelGroup(eq(existing.getId()),
-                eq(PKG), anyInt()))
+                eq(mPkg), anyInt()))
                 .thenReturn(existing);
 
         NotificationChannelGroup updated = new NotificationChannelGroup("id", "name");
         updated.setBlocked(true);
 
-        mBinderService.updateNotificationChannelGroupForPackage(PKG, 0, updated);
+        mBinderService.updateNotificationChannelGroupForPackage(mPkg, 0, updated);
         ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
         verify(mContext, times(1)).sendBroadcastAsUser(captor.capture(), any(), eq(null));
 
         assertEquals(NotificationManager.ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED,
                 captor.getValue().getAction());
-        assertEquals(PKG, captor.getValue().getPackage());
+        assertEquals(mPkg, captor.getValue().getPackage());
         assertEquals(existing.getId(), captor.getValue().getStringExtra(
                 NotificationManager.EXTRA_NOTIFICATION_CHANNEL_GROUP_ID));
         assertTrue(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false));
@@ -3749,17 +3722,17 @@
         existing.setBlocked(true);
         mService.setPreferencesHelper(mPreferencesHelper);
         when(mPreferencesHelper.getNotificationChannelGroup(eq(existing.getId()),
-                eq(PKG), anyInt()))
+                eq(mPkg), anyInt()))
                 .thenReturn(existing);
 
         mBinderService.updateNotificationChannelGroupForPackage(
-                PKG, 0, new NotificationChannelGroup("id", "name"));
+                mPkg, 0, new NotificationChannelGroup("id", "name"));
         ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
         verify(mContext, times(1)).sendBroadcastAsUser(captor.capture(), any(), eq(null));
 
         assertEquals(NotificationManager.ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED,
                 captor.getValue().getAction());
-        assertEquals(PKG, captor.getValue().getPackage());
+        assertEquals(mPkg, captor.getValue().getPackage());
         assertEquals(existing.getId(), captor.getValue().getStringExtra(
                 NotificationManager.EXTRA_NOTIFICATION_CHANNEL_GROUP_ID));
         assertFalse(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false));
@@ -3770,131 +3743,131 @@
         NotificationChannelGroup existing = new NotificationChannelGroup("id", "name");
         mService.setPreferencesHelper(mPreferencesHelper);
         when(mPreferencesHelper.getNotificationChannelGroup(
-                eq(existing.getId()), eq(PKG), anyInt()))
+                eq(existing.getId()), eq(mPkg), anyInt()))
                 .thenReturn(existing);
 
         mBinderService.updateNotificationChannelGroupForPackage(
-                PKG, 0, new NotificationChannelGroup("id", "new name"));
+                mPkg, 0, new NotificationChannelGroup("id", "new name"));
         verify(mContext, never()).sendBroadcastAsUser(any(), any(), eq(null));
     }
 
     @Test
     public void testCreateChannelNotifyListener() throws Exception {
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
                 eq(mTestNotificationChannel.getId()), anyBoolean()))
                 .thenReturn(mTestNotificationChannel);
         NotificationChannel channel2 = new NotificationChannel("a", "b", IMPORTANCE_LOW);
-        when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
                 eq(channel2.getId()), anyBoolean()))
                 .thenReturn(channel2);
-        when(mPreferencesHelper.createNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.createNotificationChannel(eq(mPkg), anyInt(),
                 eq(channel2), anyBoolean(), anyBoolean(), anyInt(), anyBoolean()))
                 .thenReturn(true);
 
         reset(mListeners);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(mTestNotificationChannel, channel2)));
-        verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+        verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(mTestNotificationChannel),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
-        verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+        verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(channel2),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
     }
 
     @Test
     public void testCreateChannelGroupNotifyListener() throws Exception {
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
         mService.setPreferencesHelper(mPreferencesHelper);
         NotificationChannelGroup group1 = new NotificationChannelGroup("a", "b");
         NotificationChannelGroup group2 = new NotificationChannelGroup("n", "m");
 
         reset(mListeners);
-        mBinderService.createNotificationChannelGroups(PKG,
+        mBinderService.createNotificationChannelGroups(mPkg,
                 new ParceledListSlice(Arrays.asList(group1, group2)));
-        verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+        verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(group1),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
-        verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+        verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(group2),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
     }
 
     @Test
     public void testUpdateChannelNotifyListener() throws Exception {
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
         mService.setPreferencesHelper(mPreferencesHelper);
         mTestNotificationChannel.setLightColor(Color.CYAN);
-        when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
                 eq(mTestNotificationChannel.getId()), anyBoolean()))
                 .thenReturn(mTestNotificationChannel);
 
         reset(mListeners);
-        mBinderService.updateNotificationChannelForPackage(PKG, mUid, mTestNotificationChannel);
-        verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+        mBinderService.updateNotificationChannelForPackage(mPkg, mUid, mTestNotificationChannel);
+        verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(mTestNotificationChannel),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
     }
 
     @Test
     public void testDeleteChannelNotifyListener() throws Exception {
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
                 eq(mTestNotificationChannel.getId()), anyBoolean()))
                 .thenReturn(mTestNotificationChannel);
-        when(mPreferencesHelper.deleteNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.deleteNotificationChannel(eq(mPkg), anyInt(),
                 eq(mTestNotificationChannel.getId()),  anyInt(), anyBoolean())).thenReturn(true);
         reset(mListeners);
-        mBinderService.deleteNotificationChannel(PKG, mTestNotificationChannel.getId());
-        verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+        mBinderService.deleteNotificationChannel(mPkg, mTestNotificationChannel.getId());
+        verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(mTestNotificationChannel),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_DELETED));
     }
 
     @Test
     public void testDeleteChannelOnlyDoExtraWorkIfExisted() throws Exception {
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
                 eq(mTestNotificationChannel.getId()), anyBoolean()))
                 .thenReturn(null);
         reset(mListeners);
-        mBinderService.deleteNotificationChannel(PKG, mTestNotificationChannel.getId());
+        mBinderService.deleteNotificationChannel(mPkg, mTestNotificationChannel.getId());
         verifyNoMoreInteractions(mListeners);
         verifyNoMoreInteractions(mHistoryManager);
     }
 
     @Test
     public void testDeleteChannelGroupNotifyListener() throws Exception {
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
         NotificationChannelGroup ncg = new NotificationChannelGroup("a", "b/c");
         mService.setPreferencesHelper(mPreferencesHelper);
         when(mPreferencesHelper.getNotificationChannelGroupWithChannels(
-                eq(PKG), anyInt(), eq(ncg.getId()), anyBoolean()))
+                eq(mPkg), anyInt(), eq(ncg.getId()), anyBoolean()))
                 .thenReturn(ncg);
         reset(mListeners);
-        mBinderService.deleteNotificationChannelGroup(PKG, ncg.getId());
-        verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+        mBinderService.deleteNotificationChannelGroup(mPkg, ncg.getId());
+        verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(ncg),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_DELETED));
     }
 
     @Test
     public void testDeleteChannelGroupChecksForFgses() throws Exception {
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
         CountDownLatch latch = new CountDownLatch(2);
         mService.createNotificationChannelGroup(
-                PKG, mUid, new NotificationChannelGroup("group", "group"), true, false);
+                mPkg, mUid, new NotificationChannelGroup("group", "group"), true, false);
         new Thread(() -> {
             NotificationChannel notificationChannel = new NotificationChannel("id", "id",
                     NotificationManager.IMPORTANCE_HIGH);
@@ -3902,7 +3875,7 @@
             ParceledListSlice<NotificationChannel> pls =
                     new ParceledListSlice(ImmutableList.of(notificationChannel));
             try {
-                mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
+                mBinderService.createNotificationChannelsForPackage(mPkg, mUid, pls);
             } catch (RemoteException e) {
                 throw new RuntimeException(e);
             }
@@ -3913,7 +3886,7 @@
                 synchronized (this) {
                     wait(5000);
                 }
-                mService.createNotificationChannelGroup(PKG, mUid,
+                mService.createNotificationChannelGroup(mPkg, mUid,
                         new NotificationChannelGroup("new", "new group"), true, false);
                 NotificationChannel notificationChannel =
                         new NotificationChannel("id", "id", NotificationManager.IMPORTANCE_HIGH);
@@ -3921,8 +3894,8 @@
                 ParceledListSlice<NotificationChannel> pls =
                         new ParceledListSlice(ImmutableList.of(notificationChannel));
                 try {
-                mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
-                mBinderService.deleteNotificationChannelGroup(PKG, "group");
+                mBinderService.createNotificationChannelsForPackage(mPkg, mUid, pls);
+                mBinderService.deleteNotificationChannelGroup(mPkg, "group");
                 } catch (RemoteException e) {
                     throw new RuntimeException(e);
                 }
@@ -3939,19 +3912,19 @@
     @Test
     public void testUpdateNotificationChannelFromPrivilegedListener_success() throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
-        when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
                 eq(mTestNotificationChannel.getId()), anyBoolean()))
                 .thenReturn(mTestNotificationChannel);
 
         mBinderService.updateNotificationChannelFromPrivilegedListener(
-                null, PKG, Process.myUserHandle(), mTestNotificationChannel);
+                null, mPkg, Process.myUserHandle(), mTestNotificationChannel);
 
         verify(mPreferencesHelper, times(1)).updateNotificationChannel(
                 anyString(), anyInt(), any(), anyBoolean(),  anyInt(), anyBoolean());
 
-        verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+        verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(mTestNotificationChannel),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
     }
@@ -3959,12 +3932,12 @@
     @Test
     public void testUpdateNotificationChannelFromPrivilegedListener_noAccess() throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(emptyList());
 
         try {
             mBinderService.updateNotificationChannelFromPrivilegedListener(
-                    null, PKG, Process.myUserHandle(), mTestNotificationChannel);
+                    null, mPkg, Process.myUserHandle(), mTestNotificationChannel);
             fail("listeners that don't have a companion device shouldn't be able to call this");
         } catch (SecurityException e) {
             // pass
@@ -3973,7 +3946,7 @@
         verify(mPreferencesHelper, never()).updateNotificationChannel(
                 anyString(), anyInt(), any(), anyBoolean(),  anyInt(), anyBoolean());
 
-        verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+        verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(mTestNotificationChannel),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
     }
@@ -3981,16 +3954,16 @@
     @Test
     public void testUpdateNotificationChannelFromPrivilegedListener_badUser() throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
         mListener = mock(ManagedServices.ManagedServiceInfo.class);
-        mListener.component = new ComponentName(PKG, PKG);
+        mListener.component = new ComponentName(mPkg, mPkg);
         when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
         when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
 
         try {
             mBinderService.updateNotificationChannelFromPrivilegedListener(
-                    null, PKG, UserHandle.ALL, mTestNotificationChannel);
+                    null, mPkg, UserHandle.ALL, mTestNotificationChannel);
             fail("incorrectly allowed a change to a user listener cannot see");
         } catch (SecurityException e) {
             // pass
@@ -3999,7 +3972,7 @@
         verify(mPreferencesHelper, never()).updateNotificationChannel(
                 anyString(), anyInt(), any(), anyBoolean(),  anyInt(), anyBoolean());
 
-        verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+        verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(mTestNotificationChannel),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
     }
@@ -4008,9 +3981,9 @@
     public void testUpdateNotificationChannelFromPrivilegedListener_noSoundUriPermission()
             throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
-        when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
                 eq(mTestNotificationChannel.getId()), anyBoolean()))
                 .thenReturn(mTestNotificationChannel);
 
@@ -4025,13 +3998,13 @@
                 anyInt(), eq(Process.myUserHandle().getIdentifier()));
 
         assertThrows(SecurityException.class,
-                () -> mBinderService.updateNotificationChannelFromPrivilegedListener(null, PKG,
+                () -> mBinderService.updateNotificationChannelFromPrivilegedListener(null, mPkg,
                 Process.myUserHandle(), updatedNotificationChannel));
 
         verify(mPreferencesHelper, never()).updateNotificationChannel(
                 anyString(), anyInt(), any(), anyBoolean(),  anyInt(), anyBoolean());
 
-        verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+        verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(mTestNotificationChannel),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
     }
@@ -4040,9 +4013,9 @@
     public void testUpdateNotificationChannelFromPrivilegedListener_noSoundUriPermission_sameSound()
             throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
-        when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+        when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
                 eq(mTestNotificationChannel.getId()), anyBoolean()))
                 .thenReturn(mTestNotificationChannel);
 
@@ -4057,12 +4030,12 @@
                     anyInt(), eq(Process.myUserHandle().getIdentifier()));
 
         mBinderService.updateNotificationChannelFromPrivilegedListener(
-                null, PKG, Process.myUserHandle(), updatedNotificationChannel);
+                null, mPkg, Process.myUserHandle(), updatedNotificationChannel);
 
         verify(mPreferencesHelper, times(1)).updateNotificationChannel(
                 anyString(), anyInt(), any(), anyBoolean(),  anyInt(), anyBoolean());
 
-        verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+        verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
                 eq(Process.myUserHandle()), eq(mTestNotificationChannel),
                 eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
     }
@@ -4070,11 +4043,11 @@
     @Test
     public void testGetNotificationChannelFromPrivilegedListener_cdm_success() throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
 
         mBinderService.getNotificationChannelsFromPrivilegedListener(
-                null, PKG, Process.myUserHandle());
+                null, mPkg, Process.myUserHandle());
 
         verify(mPreferencesHelper, times(1)).getNotificationChannels(
                 anyString(), anyInt(), anyBoolean());
@@ -4083,12 +4056,12 @@
     @Test
     public void testGetNotificationChannelFromPrivilegedListener_cdm_noAccess() throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(emptyList());
 
         try {
             mBinderService.getNotificationChannelsFromPrivilegedListener(
-                    null, PKG, Process.myUserHandle());
+                    null, mPkg, Process.myUserHandle());
             fail("listeners that don't have a companion device shouldn't be able to call this");
         } catch (SecurityException e) {
             // pass
@@ -4102,12 +4075,12 @@
     public void testGetNotificationChannelFromPrivilegedListener_assistant_success()
             throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(emptyList());
         when(mAssistants.isServiceTokenValidLocked(any())).thenReturn(true);
 
         mBinderService.getNotificationChannelsFromPrivilegedListener(
-                null, PKG, Process.myUserHandle());
+                null, mPkg, Process.myUserHandle());
 
         verify(mPreferencesHelper, times(1)).getNotificationChannels(
                 anyString(), anyInt(), anyBoolean());
@@ -4117,13 +4090,13 @@
     public void testGetNotificationChannelFromPrivilegedListener_assistant_noAccess()
             throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(emptyList());
         when(mAssistants.isServiceTokenValidLocked(any())).thenReturn(false);
 
         try {
             mBinderService.getNotificationChannelsFromPrivilegedListener(
-                    null, PKG, Process.myUserHandle());
+                    null, mPkg, Process.myUserHandle());
             fail("listeners that don't have a companion device shouldn't be able to call this");
         } catch (SecurityException e) {
             // pass
@@ -4136,16 +4109,16 @@
     @Test
     public void testGetNotificationChannelFromPrivilegedListener_badUser() throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
         mListener = mock(ManagedServices.ManagedServiceInfo.class);
-        mListener.component = new ComponentName(PKG, PKG);
+        mListener.component = new ComponentName(mPkg, mPkg);
         when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
         when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
 
         try {
             mBinderService.getNotificationChannelsFromPrivilegedListener(
-                    null, PKG, Process.myUserHandle());
+                    null, mPkg, Process.myUserHandle());
             fail("listener getting channels from a user they cannot see");
         } catch (SecurityException e) {
             // pass
@@ -4158,11 +4131,11 @@
     @Test
     public void testGetNotificationChannelGroupsFromPrivilegedListener_success() throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
 
         mBinderService.getNotificationChannelGroupsFromPrivilegedListener(
-                null, PKG, Process.myUserHandle());
+                null, mPkg, Process.myUserHandle());
 
         verify(mPreferencesHelper, times(1)).getNotificationChannelGroups(anyString(), anyInt());
     }
@@ -4170,12 +4143,12 @@
     @Test
     public void testGetNotificationChannelGroupsFromPrivilegedListener_noAccess() throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(emptyList());
 
         try {
             mBinderService.getNotificationChannelGroupsFromPrivilegedListener(
-                    null, PKG, Process.myUserHandle());
+                    null, mPkg, Process.myUserHandle());
             fail("listeners that don't have a companion device shouldn't be able to call this");
         } catch (SecurityException e) {
             // pass
@@ -4187,15 +4160,15 @@
     @Test
     public void testGetNotificationChannelGroupsFromPrivilegedListener_badUser() throws Exception {
         mService.setPreferencesHelper(mPreferencesHelper);
-        when(mCompanionMgr.getAssociations(PKG, mUserId))
+        when(mCompanionMgr.getAssociations(mPkg, mUserId))
                 .thenReturn(emptyList());
         mListener = mock(ManagedServices.ManagedServiceInfo.class);
-        mListener.component = new ComponentName(PKG, PKG);
+        mListener.component = new ComponentName(mPkg, mPkg);
         when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
         when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
         try {
             mBinderService.getNotificationChannelGroupsFromPrivilegedListener(
-                    null, PKG, Process.myUserHandle());
+                    null, mPkg, Process.myUserHandle());
             fail("listeners that don't have a companion device shouldn't be able to call this");
         } catch (SecurityException e) {
             // pass
@@ -4228,7 +4201,7 @@
         mService.addNotification(r2);
 
         mListener = mock(ManagedServices.ManagedServiceInfo.class);
-        mListener.component = new ComponentName(PKG, PKG);
+        mListener.component = new ComponentName(mPkg, mPkg);
         when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
         when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
 
@@ -4247,7 +4220,7 @@
         mService.addNotification(r2);
 
         mListener = mock(ManagedServices.ManagedServiceInfo.class);
-        mListener.component = new ComponentName(PKG, PKG);
+        mListener.component = new ComponentName(mPkg, mPkg);
         when(mListener.enabledAndUserMatches(anyInt())).thenReturn(true);
         when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
 
@@ -4269,7 +4242,7 @@
         mService.addNotification(nr1);
 
         mListener = mock(ManagedServices.ManagedServiceInfo.class);
-        mListener.component = new ComponentName(PKG, PKG);
+        mListener.component = new ComponentName(mPkg, mPkg);
         when(mListener.enabledAndUserMatches(anyInt())).thenReturn(true);
         when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
 
@@ -4280,7 +4253,7 @@
                 any(NotificationManagerService.SnoozeNotificationRunnable.class));
         // Ensure cancel event is logged.
         verify(mAppOpsManager).noteOpNoThrow(
-                AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, PKG, null,
+                AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, mPkg, null,
                 null);
     }
 
@@ -4295,7 +4268,7 @@
         mService.addNotification(nr1);
 
         mListener = mock(ManagedServices.ManagedServiceInfo.class);
-        mListener.component = new ComponentName(PKG, PKG);
+        mListener.component = new ComponentName(mPkg, mPkg);
         when(mListener.enabledAndUserMatches(anyInt())).thenReturn(true);
         when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
 
@@ -4321,7 +4294,7 @@
         mService.addNotification(nr1);
 
         mListener = mock(ManagedServices.ManagedServiceInfo.class);
-        mListener.component = new ComponentName(PKG, PKG);
+        mListener.component = new ComponentName(mPkg, mPkg);
         when(mListener.enabledAndUserMatches(anyInt())).thenReturn(true);
         when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
 
@@ -4347,7 +4320,7 @@
         mService.addNotification(nr1);
 
         mListener = mock(ManagedServices.ManagedServiceInfo.class);
-        mListener.component = new ComponentName(PKG, PKG);
+        mListener.component = new ComponentName(mPkg, mPkg);
         when(mListener.enabledAndUserMatches(anyInt())).thenReturn(true);
         when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
 
@@ -4657,7 +4630,7 @@
         final NotificationRecord child = generateNotificationRecord(
                 mTestNotificationChannel, 2, "group", false);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "testPostNonGroup_noUnsnoozing",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testPostNonGroup_noUnsnoozing",
                 child.getSbn().getId(), child.getSbn().getNotification(),
                 child.getSbn().getUserId());
         waitForIdle();
@@ -4671,7 +4644,7 @@
         final NotificationRecord record = generateNotificationRecord(
                 mTestNotificationChannel, 2, null, false);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "testPostNonGroup_noUnsnoozing",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testPostNonGroup_noUnsnoozing",
                 record.getSbn().getId(), record.getSbn().getNotification(),
                 record.getSbn().getUserId());
         waitForIdle();
@@ -4684,7 +4657,7 @@
         final NotificationRecord parent = generateNotificationRecord(
                 mTestNotificationChannel, 2, "group", true);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "testPostGroupSummary_noUnsnoozing",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testPostGroupSummary_noUnsnoozing",
                 parent.getSbn().getId(), parent.getSbn().getNotification(),
                 parent.getSbn().getUserId());
         waitForIdle();
@@ -4697,7 +4670,7 @@
         final NotificationRecord nr = generateNotificationRecord(
                 mTestNotificationChannel, 2, "group", false);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testSystemNotificationListenerCanUnsnooze",
                 nr.getSbn().getId(), nr.getSbn().getNotification(),
                 nr.getSbn().getUserId());
@@ -4708,13 +4681,13 @@
         snoozeNotificationRunnable.run();
 
         ManagedServices.ManagedServiceInfo listener = mListeners.new ManagedServiceInfo(
-                null, new ComponentName(PKG, "test_class"), mUid, true, null, 0, 234);
+                null, new ComponentName(mPkg, "test_class"), mUid, true, null, 0, 234);
         listener.isSystem = true;
         when(mListeners.checkServiceTokenLocked(any())).thenReturn(listener);
 
         mBinderService.unsnoozeNotificationFromSystemListener(null, nr.getKey());
         waitForIdle();
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifs.length);
         assertNotNull(notifs[0].getKey());//mService.getNotificationRecord(nr.getSbn().getKey()));
     }
@@ -5235,17 +5208,17 @@
                 .setContentTitle("foo")
                 .addExtras(extras)
                 .setSmallIcon(android.R.drawable.sym_def_app_icon);
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "testNoNotificationDuringSetupPermission", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
         NotificationRecord posted = mService.findNotificationLocked(
-                PKG, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
+                mPkg, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
 
         assertTrue(posted.getNotification().extras.containsKey(EXTRA_ALLOW_DURING_SETUP));
     }
@@ -5260,17 +5233,17 @@
                 .setColorized(true).setColor(Color.WHITE)
                 .setFlag(FLAG_CAN_COLORIZE, true)
                 .setSmallIcon(android.R.drawable.sym_def_app_icon);
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "testNoFakeColorizedPermission", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
         NotificationRecord posted = mService.findNotificationLocked(
-                PKG, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
+                mPkg, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
 
         assertFalse(posted.getNotification().isColorized());
     }
@@ -5468,9 +5441,9 @@
         // anything that's currently enqueued or posted
         int userId = mUserId;
         assertEquals(40,
-                mService.getNotificationCount(PKG, userId, 0, null));
+                mService.getNotificationCount(mPkg, userId, 0, null));
         assertEquals(40,
-                mService.getNotificationCount(PKG, userId, 0, "tag2"));
+                mService.getNotificationCount(mPkg, userId, 0, "tag2"));
 
         // return all for package "a" - "banana" tag isn't used
         assertEquals(2,
@@ -5478,7 +5451,7 @@
 
         // exclude a known notification - it's excluded from only the posted list, not enqueued
         assertEquals(39, mService.getNotificationCount(
-                PKG, userId, sampleIdToExclude, sampleTagToExclude));
+                mPkg, userId, sampleIdToExclude, sampleTagToExclude));
     }
 
     @Test
@@ -5619,8 +5592,7 @@
                 + "<service_listing approved=\"test\" user=\"10\" primary=\"true\" />"
                 + "</dnd_apps>"
                 + "</notification-policy>";
-        UserInfo ui = new UserInfo();
-        ui.id = 10;
+        UserInfo ui = new UserInfo(10, "Clone", UserInfo.FLAG_PROFILE);
         ui.userType = USER_TYPE_PROFILE_CLONE;
         when(mUmInternal.getUserInfo(10)).thenReturn(ui);
         mService.readPolicyXml(
@@ -5646,8 +5618,7 @@
                 + "<service_listing approved=\"test\" user=\"10\" primary=\"true\" />"
                 + "</dnd_apps>"
                 + "</notification-policy>";
-        UserInfo ui = new UserInfo();
-        ui.id = 10;
+        UserInfo ui = new UserInfo(10, "Work", UserInfo.FLAG_PROFILE);
         ui.userType = USER_TYPE_PROFILE_MANAGED;
         when(mUmInternal.getUserInfo(10)).thenReturn(ui);
         mService.readPolicyXml(
@@ -5660,6 +5631,34 @@
     }
 
     @Test
+    public void testReadPolicyXml_doesNotRestoreManagedServicesForPrivateUser() throws Exception {
+        mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+        final String policyXml = "<notification-policy version=\"1\">"
+                + "<ranking></ranking>"
+                + "<enabled_listeners>"
+                + "<service_listing approved=\"test\" user=\"10\" primary=\"true\" />"
+                + "</enabled_listeners>"
+                + "<enabled_assistants>"
+                + "<service_listing approved=\"test\" user=\"10\" primary=\"true\" />"
+                + "</enabled_assistants>"
+                + "<dnd_apps>"
+                + "<service_listing approved=\"test\" user=\"10\" primary=\"true\" />"
+                + "</dnd_apps>"
+                + "</notification-policy>";
+        UserInfo ui = new UserInfo(10, "Private", UserInfo.FLAG_PROFILE);
+        ui.userType = USER_TYPE_PROFILE_PRIVATE;
+        when(mUmInternal.getUserInfo(10)).thenReturn(ui);
+        mService.readPolicyXml(
+                new BufferedInputStream(new ByteArrayInputStream(policyXml.getBytes())),
+                true,
+                10);
+        verify(mListeners, never()).readXml(any(), any(), eq(true), eq(10));
+        verify(mConditionProviders, never()).readXml(any(), any(), eq(true), eq(10));
+        verify(mAssistants, never()).readXml(any(), any(), eq(true), eq(10));
+    }
+
+    @Test
     public void testReadPolicyXml_restoresManagedServicesForNonManagedUser() throws Exception {
         final String policyXml = "<notification-policy version=\"1\">"
                 + "<ranking></ranking>"
@@ -5693,8 +5692,7 @@
         mService.mLocaleChangeReceiver.onReceive(mContext,
                 new Intent(Intent.ACTION_LOCALE_CHANGED));
 
-        verify(mZenModeHelper, times(1)).updateDefaultZenRules(
-                anyInt());
+        verify(mZenModeHelper).updateZenRulesOnLocaleChange();
     }
 
     private void simulateNotificationTimeoutBroadcast(String notificationKey) {
@@ -5715,7 +5713,7 @@
         waitForIdle();
 
         // Check that the notification was cancelled.
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertThat(notifsAfter.length).isEqualTo(0);
         assertThat(mService.getNotificationRecord(notif.getKey())).isNull();
     }
@@ -5731,7 +5729,7 @@
         waitForIdle();
 
         // Check that the notification was not cancelled.
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertThat(notifsAfter.length).isEqualTo(1);
         assertThat(mService.getNotificationRecord(notif.getKey())).isEqualTo(notif);
     }
@@ -5747,7 +5745,7 @@
         waitForIdle();
 
         // Check that the notification was not cancelled.
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertThat(notifsAfter.length).isEqualTo(1);
         assertThat(mService.getNotificationRecord(notif.getKey())).isEqualTo(notif);
     }
@@ -5765,7 +5763,7 @@
         waitForIdle();
 
         // Check that the notification was not cancelled.
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertThat(notifsAfter.length).isEqualTo(1);
         assertThat(mService.getNotificationRecord(notif.getKey())).isEqualTo(notif);
 
@@ -5862,6 +5860,7 @@
         assertThat(captor.getValue().getNotification().flags
                 & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isEqualTo(
                 FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY);
+        assertThat(captor.getValue().shouldPostSilently()).isTrue();
     }
 
     @Test
@@ -5938,7 +5937,7 @@
         mService.addNotification(r);
 
         final NotificationVisibility nv = NotificationVisibility.obtain(r.getKey(), 0, 1, true);
-        mService.mNotificationDelegate.onNotificationClear(mUid, 0, PKG, r.getUserId(),
+        mService.mNotificationDelegate.onNotificationClear(mUid, 0, mPkg, r.getUserId(),
                 r.getKey(), NotificationStats.DISMISSAL_AOD,
                 NotificationStats.DISMISS_SENTIMENT_POSITIVE, nv);
         waitForIdle();
@@ -5961,7 +5960,7 @@
         mService.addNotification(r);
 
         final NotificationVisibility nv = NotificationVisibility.obtain(r.getKey(), 0, 1, true);
-        mService.mNotificationDelegate.onNotificationClear(mUid, 0, PKG, r.getUserId(),
+        mService.mNotificationDelegate.onNotificationClear(mUid, 0, mPkg, r.getUserId(),
                 r.getKey(), NotificationStats.DISMISSAL_AOD,
                 NotificationStats.DISMISS_SENTIMENT_NEGATIVE, nv);
         waitForIdle();
@@ -5991,7 +5990,7 @@
         NotificationRecord original = generateNotificationRecord(mTestNotificationChannel);
         mService.addNotification(original);
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, original.getSbn().getId(),
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, original.getSbn().getId(),
                 original.getSbn().getTag(), mUid, 0,
                 new Notification.Builder(mContext, mTestNotificationChannel.getId())
                         .setContentTitle("new title").build(),
@@ -6050,7 +6049,7 @@
         waitForIdle();
 
         verify(handler, timeout(300).times(0)).scheduleSendRankingUpdate();
-        verify(handler, times(1)).scheduleCancelNotification(any());
+        verify(handler, times(1)).scheduleCancelNotification(any(), eq(0));
     }
 
     @Test
@@ -6309,7 +6308,7 @@
                         NotificationManagerService.CancelNotificationRunnable.class);
 
         verify(handler, times(1)).scheduleCancelNotification(
-                captor.capture());
+                captor.capture(), eq(0));
 
         // Run the runnable given to the cancel notification, and see if it logs properly
         NotificationManagerService.CancelNotificationRunnable runnable = captor.getValue();
@@ -6423,7 +6422,7 @@
                         .addMessage(message1)
                         .addMessage(message2));
         NotificationRecord recordA = new NotificationRecord(mContext, new StatusBarNotification(
-                PKG, PKG, 0, "tag", mUid, 0, nbA.build(), UserHandle.getUserHandleForUid(mUid),
+                mPkg, mPkg, 0, "tag", mUid, 0, nbA.build(), UserHandle.getUserHandleForUid(mUid),
                 null, 0), c);
 
         // First post means we grant access to both
@@ -6441,8 +6440,8 @@
                 .setContentTitle("foo")
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
                 .setStyle(new Notification.MessagingStyle("").addMessage(message2));
-        NotificationRecord recordB = new NotificationRecord(mContext, new StatusBarNotification(PKG,
-                PKG, 0, "tag", mUid, 0, nbB.build(), UserHandle.getUserHandleForUid(mUid), null, 0),
+        NotificationRecord recordB = new NotificationRecord(mContext, new StatusBarNotification(mPkg,
+                mPkg, 0, "tag", mUid, 0, nbB.build(), UserHandle.getUserHandleForUid(mUid), null, 0),
                 c);
 
         // Update means we drop access to first
@@ -6482,7 +6481,7 @@
                 .setStyle(new Notification.MessagingStyle("")
                         .addMessage(message1));
         NotificationRecord recordA = new NotificationRecord(mContext, new StatusBarNotification(
-                PKG, PKG, 0, "tag", mUid, 0, nbA.build(), UserHandle.getUserHandleForUid(mUid),
+                mPkg, mPkg, 0, "tag", mUid, 0, nbA.build(), UserHandle.getUserHandleForUid(mUid),
                 null, 0), c);
 
         doThrow(new SecurityException("no access")).when(mUgm)
@@ -6941,7 +6940,7 @@
     public void testVisualDifference_foreground() {
         Notification.Builder nb1 = new Notification.Builder(mContext, "")
                 .setContentTitle("foo");
-        StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r1 =
                 new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
@@ -6949,7 +6948,7 @@
         Notification.Builder nb2 = new Notification.Builder(mContext, "")
                 .setFlag(FLAG_FOREGROUND_SERVICE, true)
                 .setContentTitle("bar");
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -6961,14 +6960,14 @@
     public void testVisualDifference_diffTitle() {
         Notification.Builder nb1 = new Notification.Builder(mContext, "")
                 .setContentTitle("foo");
-        StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r1 =
                 new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
 
         Notification.Builder nb2 = new Notification.Builder(mContext, "")
                 .setContentTitle("bar");
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -6981,7 +6980,7 @@
         Notification.Builder nb1 = new Notification.Builder(mContext, "")
                 .setStyle(new Notification.InboxStyle()
                     .addLine("line1").addLine("line2"));
-        StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r1 =
                 new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
@@ -6989,7 +6988,7 @@
         Notification.Builder nb2 = new Notification.Builder(mContext, "")
                 .setStyle(new Notification.InboxStyle()
                         .addLine("line1").addLine("line2_changed"));
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -6999,7 +6998,7 @@
         Notification.Builder nb3 = new Notification.Builder(mContext, "")
                 .setStyle(new Notification.InboxStyle()
                         .addLine("line1"));
-        StatusBarNotification sbn3 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn3 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb3.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r3 =
                 new NotificationRecord(mContext, sbn3, mock(NotificationChannel.class));
@@ -7009,7 +7008,7 @@
         Notification.Builder nb4 = new Notification.Builder(mContext, "")
                 .setStyle(new Notification.InboxStyle()
                         .addLine("line1").addLine("line2").addLine("line3"));
-        StatusBarNotification sbn4 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn4 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb4.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r4 =
                 new NotificationRecord(mContext, sbn4, mock(NotificationChannel.class));
@@ -7018,7 +7017,7 @@
 
         Notification.Builder nb5 = new Notification.Builder(mContext, "")
             .setContentText("not an inbox");
-        StatusBarNotification sbn5 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn5 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb5.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r5 =
                 new NotificationRecord(mContext, sbn5, mock(NotificationChannel.class));
@@ -7030,14 +7029,14 @@
     public void testVisualDifference_diffText() {
         Notification.Builder nb1 = new Notification.Builder(mContext, "")
                 .setContentText("foo");
-        StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r1 =
                 new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
 
         Notification.Builder nb2 = new Notification.Builder(mContext, "")
                 .setContentText("bar");
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7049,14 +7048,14 @@
     public void testVisualDifference_sameText() {
         Notification.Builder nb1 = new Notification.Builder(mContext, "")
                 .setContentText("foo");
-        StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r1 =
                 new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
 
         Notification.Builder nb2 = new Notification.Builder(mContext, "")
                 .setContentText("foo");
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7068,14 +7067,14 @@
     public void testVisualDifference_sameTextButStyled() {
         Notification.Builder nb1 = new Notification.Builder(mContext, "")
                 .setContentText(Html.fromHtml("<b>foo</b>"));
-        StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r1 =
                 new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
 
         Notification.Builder nb2 = new Notification.Builder(mContext, "")
                 .setContentText(Html.fromHtml("<b>foo</b>"));
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7087,14 +7086,14 @@
     public void testVisualDifference_diffTextButStyled() {
         Notification.Builder nb1 = new Notification.Builder(mContext, "")
                 .setContentText(Html.fromHtml("<b>foo</b>"));
-        StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r1 =
                 new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
 
         Notification.Builder nb2 = new Notification.Builder(mContext, "")
                 .setContentText(Html.fromHtml("<b>bar</b>"));
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7106,14 +7105,14 @@
     public void testVisualDifference_diffProgress() {
         Notification.Builder nb1 = new Notification.Builder(mContext, "")
                 .setProgress(100, 90, false);
-        StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r1 =
                 new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
 
         Notification.Builder nb2 = new Notification.Builder(mContext, "")
                 .setProgress(100, 100, false);
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7125,14 +7124,14 @@
     public void testVisualDifference_diffProgressNotDone() {
         Notification.Builder nb1 = new Notification.Builder(mContext, "")
                 .setProgress(100, 90, false);
-        StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r1 =
                 new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
 
         Notification.Builder nb2 = new Notification.Builder(mContext, "")
                 .setProgress(100, 91, false);
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7144,14 +7143,14 @@
     public void testVisualDifference_sameProgressStillDone() {
         Notification.Builder nb1 = new Notification.Builder(mContext, "")
                 .setProgress(100, 100, false);
-        StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r1 =
                 new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
 
         Notification.Builder nb2 = new Notification.Builder(mContext, "")
                 .setProgress(100, 100, false);
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7165,7 +7164,7 @@
                 .setGroup("bananas")
                 .setFlag(Notification.FLAG_GROUP_SUMMARY, true)
                 .setContentText("foo");
-        StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r1 =
                 new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
@@ -7174,7 +7173,7 @@
                 .setGroup("bananas")
                 .setFlag(Notification.FLAG_GROUP_SUMMARY, true)
                 .setContentText("bar");
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7188,7 +7187,7 @@
                 .setGroup("bananas")
                 .setFlag(Notification.FLAG_GROUP_SUMMARY, true)
                 .setContentText("bar");
-        StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
                 nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r2 =
                 new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7239,10 +7238,31 @@
         assertThat(mService.isVisuallyInterruptive(r1, r2)).isTrue();
     }
 
+    @Test
+    @EnableFlags({android.app.Flags.FLAG_UPDATE_RANKING_TIME})
+    public void testVisualDifference_userInitiatedJob() {
+        Notification.Builder nb1 = new Notification.Builder(mContext, "")
+                .setContentTitle("foo");
+        StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
+                nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
+        NotificationRecord r1 =
+                new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
+
+        Notification.Builder nb2 = new Notification.Builder(mContext, "")
+                .setFlag(FLAG_USER_INITIATED_JOB, true)
+                .setContentTitle("bar");
+        StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
+                nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
+        NotificationRecord r2 =
+                new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
+
+        assertFalse(mService.isVisuallyInterruptive(r1, r2));
+    }
+
     private NotificationRecord notificationToRecord(Notification n) {
         return new NotificationRecord(
                 mContext,
-                new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0, n,
+                new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0, n,
                         UserHandle.getUserHandleForUid(mUid), null, 0),
                 mock(NotificationChannel.class));
     }
@@ -7258,13 +7278,13 @@
         mService.addNotification(notif2);
 
         // on broadcast, hide the 2 notifications
-        simulatePackageSuspendBroadcast(true, PKG, notif1.getUid());
+        simulatePackageSuspendBroadcast(true, mPkg, notif1.getUid());
         ArgumentCaptor<List> captorHide = ArgumentCaptor.forClass(List.class);
         verify(mListeners, times(1)).notifyHiddenLocked(captorHide.capture());
         assertEquals(2, captorHide.getValue().size());
 
         // on broadcast, unhide the 2 notifications
-        simulatePackageSuspendBroadcast(false, PKG, notif1.getUid());
+        simulatePackageSuspendBroadcast(false, mPkg, notif1.getUid());
         ArgumentCaptor<List> captorUnhide = ArgumentCaptor.forClass(List.class);
         verify(mListeners, times(1)).notifyUnhiddenLocked(captorUnhide.capture());
         assertEquals(2, captorUnhide.getValue().size());
@@ -7298,7 +7318,7 @@
         mService.addNotification(notif2);
 
         // on broadcast, nothing is hidden since no notifications are of user 10 with package PKG
-        simulatePackageSuspendBroadcast(true, PKG, 10);
+        simulatePackageSuspendBroadcast(true, mPkg, 10);
         ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
         verify(mListeners, times(1)).notifyHiddenLocked(captor.capture());
         assertEquals(0, captor.getValue().size());
@@ -7479,7 +7499,7 @@
                 mContext, mTestNotificationChannel.getId())
                 .setContentTitle("foo")
                 .setSmallIcon(android.R.drawable.sym_def_app_icon);
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "tag" + System.currentTimeMillis(),  UserHandle.PER_USER_RANGE, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid + UserHandle.PER_USER_RANGE),
                 null, 0);
@@ -7502,7 +7522,7 @@
                 mContext, mTestNotificationChannel.getId())
                 .setContentTitle("foo")
                 .setSmallIcon(android.R.drawable.sym_def_app_icon);
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "tag" + System.currentTimeMillis(),  UserHandle.PER_USER_RANGE, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid + UserHandle.PER_USER_RANGE),
                 null, 0);
@@ -7552,31 +7572,31 @@
 
     @Test
     public void testBubble() throws Exception {
-        mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_NONE);
-        assertFalse(mBinderService.areBubblesAllowed(PKG));
-        assertEquals(mBinderService.getBubblePreferenceForPackage(PKG, mUid),
+        mBinderService.setBubblesAllowed(mPkg, mUid, BUBBLE_PREFERENCE_NONE);
+        assertFalse(mBinderService.areBubblesAllowed(mPkg));
+        assertEquals(mBinderService.getBubblePreferenceForPackage(mPkg, mUid),
                 BUBBLE_PREFERENCE_NONE);
     }
 
     @Test
     public void testUserApprovedBubblesForPackageSelected() throws Exception {
-        mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_SELECTED);
-        assertEquals(mBinderService.getBubblePreferenceForPackage(PKG, mUid),
+        mBinderService.setBubblesAllowed(mPkg, mUid, BUBBLE_PREFERENCE_SELECTED);
+        assertEquals(mBinderService.getBubblePreferenceForPackage(mPkg, mUid),
                 BUBBLE_PREFERENCE_SELECTED);
     }
 
     @Test
     public void testUserApprovedBubblesForPackageAll() throws Exception {
-        mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_ALL);
-        assertTrue(mBinderService.areBubblesAllowed(PKG));
-        assertEquals(mBinderService.getBubblePreferenceForPackage(PKG, mUid),
+        mBinderService.setBubblesAllowed(mPkg, mUid, BUBBLE_PREFERENCE_ALL);
+        assertTrue(mBinderService.areBubblesAllowed(mPkg));
+        assertEquals(mBinderService.getBubblePreferenceForPackage(mPkg, mUid),
                 BUBBLE_PREFERENCE_ALL);
     }
 
     @Test
     public void testUserRejectsBubblesForPackage() throws Exception {
-        mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_NONE);
-        assertFalse(mBinderService.areBubblesAllowed(PKG));
+        mBinderService.setBubblesAllowed(mPkg, mUid, BUBBLE_PREFERENCE_NONE);
+        assertFalse(mBinderService.areBubblesAllowed(mPkg));
     }
 
     @Test
@@ -7775,14 +7795,14 @@
         Notification n = new Notification.Builder(mContext, "").build();
         n.flags |= FLAG_FOREGROUND_SERVICE;
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 9, null, mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 9, null, mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
         mService.addEnqueuedNotification(r);
 
         mInternalService.removeForegroundServiceFlagFromNotification(
-                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+                mPkg, r.getSbn().getId(), r.getSbn().getUserId());
 
         waitForIdle();
 
@@ -7797,14 +7817,14 @@
         Notification n = new Notification.Builder(mContext, "").build();
         n.flags |= FLAG_FOREGROUND_SERVICE;
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 9, null, mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 9, null, mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
         mService.addNotification(r);
 
         mInternalService.removeForegroundServiceFlagFromNotification(
-                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+                mPkg, r.getSbn().getId(), r.getSbn().getUserId());
 
         waitForIdle();
 
@@ -7822,7 +7842,7 @@
                 .thenReturn(SHOW_IMMEDIATELY);
         for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
             Notification n = new Notification.Builder(mContext, "").build();
-            StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, i, null, mUid, 0,
+            StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, i, null, mUid, 0,
                     n, UserHandle.getUserHandleForUid(mUid), null, 0);
             NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
             mService.addEnqueuedNotification(r);
@@ -7830,7 +7850,7 @@
         Notification n = new Notification.Builder(mContext, "").build();
         n.flags |= FLAG_FOREGROUND_SERVICE;
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg,
                 NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS, null, mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -7838,7 +7858,7 @@
         mService.addEnqueuedNotification(r);
 
         mInternalService.removeForegroundServiceFlagFromNotification(
-                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+                mPkg, r.getSbn().getId(), r.getSbn().getUserId());
 
         waitForIdle();
 
@@ -7853,7 +7873,7 @@
                 .thenReturn(SHOW_IMMEDIATELY);
         for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
             Notification n = new Notification.Builder(mContext, "").build();
-            StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, i, null, mUid, 0,
+            StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, i, null, mUid, 0,
                     n, UserHandle.getUserHandleForUid(mUid), null, 0);
             NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
             mService.addNotification(r);
@@ -7861,7 +7881,7 @@
         Notification n = new Notification.Builder(mContext, "").build();
         n.flags |= FLAG_FOREGROUND_SERVICE;
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg,
                 NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS, null, mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -7869,7 +7889,7 @@
         mService.addNotification(r);
 
         mInternalService.removeForegroundServiceFlagFromNotification(
-                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+                mPkg, r.getSbn().getId(), r.getSbn().getUserId());
 
         waitForIdle();
 
@@ -8603,6 +8623,7 @@
         assertThat(captor.getValue().getNotification().flags
                 & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isEqualTo(
                 FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY);
+        assertThat(captor.getValue().shouldPostSilently()).isTrue();
     }
 
     @Test
@@ -8631,34 +8652,128 @@
     }
 
     @Test
-    public void testOnNotificationActionClickLifetimeExtendedEnds() {
+    public void testActionClickLifetimeExtendedCancel() throws Exception {
         mSetFlagsRule.enableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+
         final Notification.Action action =
                 new Notification.Action.Builder(null, "text", PendingIntent.getActivity(
                         mContext, 0, new Intent(), PendingIntent.FLAG_IMMUTABLE)).build();
-        final boolean generatedByAssistant = false;
 
         // Creates a notification marked as being lifetime extended.
         NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
         r.getSbn().getNotification().flags |= FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
         mService.addNotification(r);
+
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(mPkg);
+        assertThat(notifs.length).isEqualTo(1);
+        assertThat(mService.getNotificationRecordCount()).isEqualTo(1);
+
         // Call on action click.
         NotificationVisibility notificationVisibility =
                 NotificationVisibility.obtain(r.getKey(), 1, 2, true);
         mService.mNotificationDelegate.onNotificationActionClick(
                 10, 10, r.getKey(), /*actionIndex=*/2, action, notificationVisibility,
                 /*generatedByAssistant=*/false);
-        // The flag is removed, so the notification is no longer lifetime extended.
-        assertThat(r.getSbn().getNotification().flags
-                & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isEqualTo(0);
 
-        // The record is sent out without the flag.
-        ArgumentCaptor<NotificationRecord> captor =
-                ArgumentCaptor.forClass(NotificationRecord.class);
-        verify(mAssistants, times(1)).notifyAssistantActionClicked(
-                captor.capture(), eq(action), eq(generatedByAssistant));
-        assertThat(captor.getValue().getNotification().flags
-                & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isEqualTo(0);
+        // Lifetime extended flag persists.
+        assertThat(r.getSbn().getNotification().flags
+                & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isGreaterThan(0);
+
+        mTestableLooper.moveTimeForward(210);
+        waitForIdle();
+        verify(mWorkerHandler, times(1))
+                .scheduleCancelNotification(
+                        any(NotificationManagerService.CancelNotificationRunnable.class), eq(200));
+
+        // Check that the cancelation occurred and the notification is gone.
+        notifs = mBinderService.getActiveNotifications(mPkg);
+        assertThat(notifs.length).isEqualTo(0);
+        assertThat(mService.getNotificationRecordCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void testActionClickLifetimeExtendedCancel_PreventByNoDismiss() throws Exception {
+        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+
+        final Notification.Action action =
+                new Notification.Action.Builder(null, "text", PendingIntent.getActivity(
+                        mContext, 0, new Intent(), PendingIntent.FLAG_IMMUTABLE)).build();
+
+        // Creates a notification marked as being lifetime extended.
+        NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+        r.getSbn().getNotification().flags |= FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+        // Make the notification non-dismissable
+        r.getSbn().getNotification().flags |= FLAG_NO_DISMISS;
+        mService.addNotification(r);
+
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(mPkg);
+        assertThat(notifs.length).isEqualTo(1);
+        assertThat(mService.getNotificationRecordCount()).isEqualTo(1);
+
+        // Call on action click.
+        NotificationVisibility notificationVisibility =
+                NotificationVisibility.obtain(r.getKey(), 1, 2, true);
+        mService.mNotificationDelegate.onNotificationActionClick(
+                10, 10, r.getKey(), /*actionIndex=*/2, action, notificationVisibility,
+                /*generatedByAssistant=*/false);
+
+        // Lifetime extended flag persists.
+        assertThat(r.getSbn().getNotification().flags
+                & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isGreaterThan(0);
+
+        mTestableLooper.moveTimeForward(210);
+        waitForIdle();
+        verify(mWorkerHandler, times(1))
+                .scheduleCancelNotification(
+                        any(NotificationManagerService.CancelNotificationRunnable.class), eq(200));
+
+        // The cancellation is dropped and the notification is still present, with the update.
+        notifs = mBinderService.getActiveNotifications(mPkg);
+        assertThat(notifs.length).isEqualTo(1);
+        assertThat(mService.getNotificationRecordCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void testUpdateOnActionClickDropsLifetimeExtendedCancel() throws Exception {
+        mSetFlagsRule.enableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+
+        final Notification.Action action =
+                new Notification.Action.Builder(null, "text", PendingIntent.getActivity(
+                        mContext, 0, new Intent(), PendingIntent.FLAG_IMMUTABLE)).build();
+
+        // Creates a notification marked as being lifetime extended.
+        NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+        r.getSbn().getNotification().flags |= FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+        mService.addNotification(r);
+
+        StatusBarNotification[] notifs =
+                mBinderService.getActiveNotifications(mPkg);
+        assertThat(notifs.length).isEqualTo(1);
+        assertThat(mService.getNotificationRecordCount()).isEqualTo(1);
+
+        // Call on action click.
+        NotificationVisibility notificationVisibility =
+                NotificationVisibility.obtain(r.getKey(), 1, 2, true);
+        mService.mNotificationDelegate.onNotificationActionClick(
+                10, 10, r.getKey(), /*actionIndex=*/2, action, notificationVisibility,
+                /*generatedByAssistant=*/false);
+
+        // The "app" sends an update of the notification in response.
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
+                r.getSbn().getId(), r.getSbn().getNotification(), r.getSbn().getUserId());
+
+        mTestableLooper.moveTimeForward(210);
+        waitForIdle();
+        verify(mWorkerHandler, times(1))
+                .scheduleCancelNotification(
+                        any(NotificationManagerService.CancelNotificationRunnable.class), eq(200));
+
+        // The cancellation is dropped and the notification is still present, with the update.
+        notifs = mBinderService.getActiveNotifications(mPkg);
+        assertThat(notifs.length).isEqualTo(1);
+        assertThat(mService.getNotificationRecordCount()).isEqualTo(1);
     }
 
     @Test
@@ -8686,6 +8801,7 @@
                 mNotificationRecordLogger.event(0));
     }
 
+
     @Test
     public void testLogSmartSuggestionsVisible_triggerOnExpandAndVisible() {
         NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
@@ -8734,7 +8850,7 @@
                         .setContentTitle("foo")
                         .setSmallIcon(android.R.drawable.sym_def_app_icon);
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, "opPkg", 0, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, "opPkg", 0, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r =  new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -8756,7 +8872,7 @@
         NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
         mService.addNotification(r);
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, r.getSbn().getId(),
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, r.getSbn().getId(),
                 r.getSbn().getTag(), mUid, 0,
                 new Notification.Builder(mContext, mTestNotificationChannel.getId()).build(),
                 UserHandle.getUserHandleForUid(mUid), null, 0);
@@ -9084,7 +9200,7 @@
 
     @Test
     public void testFlagBubble() throws RemoteException {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -9092,11 +9208,11 @@
         NotificationRecord nr =
                 generateMessageBubbleNotifRecord(mTestNotificationChannel, "testFlagBubble");
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifs.length);
         assertTrue((notifs[0].getNotification().flags & FLAG_BUBBLE) != 0);
         assertTrue(mService.getNotificationRecord(
@@ -9105,7 +9221,7 @@
 
     @Test
     public void testFlagBubble_noFlag_appNotAllowed() throws RemoteException {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_NONE /* app */,
                 true /* channel */);
@@ -9113,11 +9229,11 @@
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                         "testFlagBubble_noFlag_appNotAllowed");
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifs.length);
         assertEquals((notifs[0].getNotification().flags & FLAG_BUBBLE), 0);
         assertFalse(mService.getNotificationRecord(
@@ -9126,7 +9242,7 @@
 
     @Test
     public void testFlagBubbleNotifs_noFlag_whenAppForeground() throws RemoteException {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -9137,14 +9253,14 @@
                 .setContentTitle("foo")
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
                 .setBubbleMetadata(getBubbleMetadata());
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
         // Say we're foreground
         when(mActivityManager.getPackageImportance(nr.getSbn().getPackageName())).thenReturn(
                 IMPORTANCE_FOREGROUND);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -9156,7 +9272,7 @@
 
     @Test
     public void testFlagBubbleNotifs_flag_messaging() throws RemoteException {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -9164,7 +9280,7 @@
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testFlagBubbleNotifs_flag_messaging");
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -9175,18 +9291,18 @@
 
     @Test
     public void testFlagBubbleNotifs_noFlag_noShortcut() throws RemoteException {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
 
         Notification.Builder nb = getMessageStyleNotifBuilder(true, null, false);
         nb.setShortcutId(null);
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 null, mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         waitForIdle();
 
@@ -9197,7 +9313,7 @@
 
     @Test
     public void testFlagBubbleNotifs_noFlag_messaging_appNotAllowed() throws RemoteException {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_NONE /* app */,
                 true /* channel */);
@@ -9206,7 +9322,7 @@
                 "testFlagBubbleNotifs_noFlag_messaging_appNotAllowed");
 
         // Post the notification
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -9217,7 +9333,7 @@
 
     @Test
     public void testFlagBubbleNotifs_noFlag_notBubble() throws RemoteException {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -9226,13 +9342,13 @@
         Notification.Builder nb = getMessageStyleNotifBuilder(false /* addBubbleMetadata */,
                 null /* groupKey */, false /* isSummary */);
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "testFlagBubbleNotifs_noFlag_notBubble", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
         // Post the notification
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -9243,7 +9359,7 @@
 
     @Test
     public void testFlagBubbleNotifs_noFlag_messaging_channelNotAllowed() throws RemoteException {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 false /* channel */);
@@ -9253,7 +9369,7 @@
         nr.getChannel().lockFields(USER_LOCKED_ALLOW_BUBBLE);
 
         // Post the notification
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -9268,22 +9384,22 @@
         nrBubble.getSbn().getNotification().flags |= FLAG_BUBBLE;
 
         // Post the notification
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testAppCancelNotifications_cancelsBubbles",
                 nrBubble.getSbn().getId(), nrBubble.getSbn().getNotification(),
                 nrBubble.getSbn().getUserId());
         waitForIdle();
 
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifs.length);
         assertEquals(1, mService.getNotificationRecordCount());
 
-        mBinderService.cancelNotificationWithTag(PKG, PKG,
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg,
                 "testAppCancelNotifications_cancelsBubbles", nrBubble.getSbn().getId(),
                 nrBubble.getSbn().getUserId());
         waitForIdle();
 
-        StatusBarNotification[] notifs2 = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs2 = mBinderService.getActiveNotifications(mPkg);
         assertEquals(0, notifs2.length);
         assertEquals(0, mService.getNotificationRecordCount());
     }
@@ -9294,10 +9410,10 @@
         nr.getSbn().getNotification().flags |= FLAG_BUBBLE;
         mService.addNotification(nr);
 
-        mBinderService.cancelAllNotifications(PKG, nr.getSbn().getUserId());
+        mBinderService.cancelAllNotifications(mPkg, nr.getSbn().getUserId());
         waitForIdle();
 
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertEquals(0, notifs.length);
         assertEquals(0, mService.getNotificationRecordCount());
     }
@@ -9314,7 +9430,7 @@
         mService.getBinderService().cancelNotificationsFromListener(null, null);
         waitForIdle();
 
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifs.length);
         assertEquals(1, mService.getNotificationRecordCount());
     }
@@ -9331,7 +9447,7 @@
         waitForIdle();
 
         // Notif not active anymore
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertEquals(0, notifs.length);
         assertEquals(0, mService.getNotificationRecordCount());
         // Cancel event is logged
@@ -9343,13 +9459,13 @@
     @Test
     public void testCancelNotificationsFromListener_suppressesBubble() throws Exception {
         // Add bubble notif
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
             true /* global */,
             BUBBLE_PREFERENCE_ALL /* app */,
             true /* channel */);
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel, "tag");
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
             nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -9359,7 +9475,7 @@
         waitForIdle();
 
         // Bubble notif active and suppressed
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifs.length);
         assertEquals(1, mService.getNotificationRecordCount());
         assertTrue(notifs[0].getNotification().getBubbleMetadata().isNotificationSuppressed());
@@ -9378,7 +9494,7 @@
         waitForIdle();
 
         // THEN the bubble notification does not get removed
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifs.length);
         assertEquals(1, mService.getNotificationRecordCount());
     }
@@ -9509,13 +9625,13 @@
 
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri"))
                 .setType(AutomaticZenRule.TYPE_MANAGED)
-                .setOwner(new ComponentName(PKG, "cls"))
+                .setOwner(new ComponentName(mPkg, "cls"))
                 .build();
         when(mDevicePolicyManager.isActiveDeviceOwner(anyInt())).thenReturn(true);
 
-        mBinderService.addAutomaticZenRule(rule, PKG, /* fromUser= */ false);
+        mBinderService.addAutomaticZenRule(rule, mPkg, /* fromUser= */ false);
 
-        verify(zenModeHelper).addAutomaticZenRule(eq(PKG), eq(rule), anyInt(), any(), anyInt());
+        verify(zenModeHelper).addAutomaticZenRule(eq(mPkg), eq(rule), anyInt(), any(), anyInt());
     }
 
     @Test
@@ -9537,27 +9653,27 @@
         ZenModeHelper zenModeHelper = setUpMockZenTest();
         mService.setCallerIsNormalPackage();
         reset(mPackageManagerInternal);
-        when(mPackageManagerInternal.isSameApp(eq(PKG), eq(mUid), anyInt())).thenReturn(true);
+        when(mPackageManagerInternal.isSameApp(eq(mPkg), eq(mUid), anyInt())).thenReturn(true);
         when(mResources
                 .getString(com.android.internal.R.string.config_systemWellbeing))
-                .thenReturn(PKG);
+                .thenReturn(mPkg);
         when(mContext.getResources()).thenReturn(mResources);
 
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri"))
                 .setType(AutomaticZenRule.TYPE_BEDTIME)
-                .setOwner(new ComponentName(PKG, "cls"))
+                .setOwner(new ComponentName(mPkg, "cls"))
                 .build();
 
-        mBinderService.addAutomaticZenRule(rule, PKG, /* fromUser= */ false);
+        mBinderService.addAutomaticZenRule(rule, mPkg, /* fromUser= */ false);
 
-        verify(zenModeHelper).addAutomaticZenRule(eq(PKG), eq(rule), anyInt(), any(), anyInt());
+        verify(zenModeHelper).addAutomaticZenRule(eq(mPkg), eq(rule), anyInt(), any(), anyInt());
     }
 
     @Test
     @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void testAddAutomaticZenRule_typeBedtimeCanBeUsedBySystem() throws Exception {
         reset(mPackageManagerInternal);
-        when(mPackageManagerInternal.isSameApp(eq(PKG), eq(mUid), anyInt())).thenReturn(true);
+        when(mPackageManagerInternal.isSameApp(eq(mPkg), eq(mUid), anyInt())).thenReturn(true);
         addAutomaticZenRule_restrictedRuleTypeCanBeUsedBySystem(AutomaticZenRule.TYPE_BEDTIME);
     }
 
@@ -9565,7 +9681,7 @@
     @EnableFlags(android.app.Flags.FLAG_MODES_API)
     public void testAddAutomaticZenRule_typeBedtimeCannotBeUsedByRegularApps() throws Exception {
         reset(mPackageManagerInternal);
-        when(mPackageManagerInternal.isSameApp(eq(PKG), eq(mUid), anyInt())).thenReturn(true);
+        when(mPackageManagerInternal.isSameApp(eq(mPkg), eq(mUid), anyInt())).thenReturn(true);
         addAutomaticZenRule_restrictedRuleTypeCannotBeUsedByRegularApps(
                 AutomaticZenRule.TYPE_BEDTIME);
     }
@@ -9577,13 +9693,13 @@
 
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri"))
                 .setType(ruleType)
-                .setOwner(new ComponentName(PKG, "cls"))
+                .setOwner(new ComponentName(mPkg, "cls"))
                 .build();
         when(mDevicePolicyManager.isActiveDeviceOwner(anyInt())).thenReturn(true);
 
-        mBinderService.addAutomaticZenRule(rule, PKG, /* fromUser= */ false);
+        mBinderService.addAutomaticZenRule(rule, mPkg, /* fromUser= */ false);
 
-        verify(zenModeHelper).addAutomaticZenRule(eq(PKG), eq(rule), anyInt(), any(), anyInt());
+        verify(zenModeHelper).addAutomaticZenRule(eq(mPkg), eq(rule), anyInt(), any(), anyInt());
     }
 
     private void addAutomaticZenRule_restrictedRuleTypeCannotBeUsedByRegularApps(
@@ -9595,12 +9711,12 @@
 
         AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri"))
                 .setType(ruleType)
-                .setOwner(new ComponentName(PKG, "cls"))
+                .setOwner(new ComponentName(mPkg, "cls"))
                 .build();
         when(mDevicePolicyManager.isActiveDeviceOwner(anyInt())).thenReturn(false);
 
         assertThrows(IllegalArgumentException.class,
-                () -> mBinderService.addAutomaticZenRule(rule, PKG, /* fromUser= */ false));
+                () -> mBinderService.addAutomaticZenRule(rule, mPkg, /* fromUser= */ false));
     }
 
     @Test
@@ -9882,7 +9998,7 @@
 
     @Test
     public void testNotificationBubbleChanged_false() throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -9891,7 +10007,7 @@
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testNotificationBubbleChanged_false");
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -9899,7 +10015,7 @@
         reset(mListeners);
 
         // First we were a bubble
-        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsBefore.length);
         assertTrue((notifsBefore[0].getNotification().flags & FLAG_BUBBLE) != 0);
 
@@ -9908,14 +10024,14 @@
         waitForIdle();
 
         // Make sure we are not a bubble
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsAfter.length);
         assertEquals((notifsAfter[0].getNotification().flags & FLAG_BUBBLE), 0);
     }
 
     @Test
     public void testNotificationBubbleChanged_true() throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -9923,19 +10039,19 @@
         // Notif that is not a bubble
         NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel,
                 1, null, false);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
         // Would be a normal notification because wouldn't have met requirements to bubble
-        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsBefore.length);
         assertEquals((notifsBefore[0].getNotification().flags & FLAG_BUBBLE), 0);
 
         // Update the notification to be message style / meet bubble requirements
         NotificationRecord nr2 = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 nr.getSbn().getTag());
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr2.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr2.getSbn().getTag(),
                 nr2.getSbn().getId(), nr2.getSbn().getNotification(), nr2.getSbn().getUserId());
         waitForIdle();
 
@@ -9947,21 +10063,21 @@
         waitForIdle();
 
         // Make sure we are a bubble
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsAfter.length);
         assertTrue((notifsAfter[0].getNotification().flags & FLAG_BUBBLE) != 0);
     }
 
     @Test
     public void testNotificationBubbleChanged_true_notAllowed() throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
 
         // Notif that is not a bubble
         NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -9969,7 +10085,7 @@
         reset(mListeners);
 
         // Would be a normal notification because wouldn't have met requirements to bubble
-        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsBefore.length);
         assertEquals((notifsBefore[0].getNotification().flags & FLAG_BUBBLE), 0);
 
@@ -9978,14 +10094,14 @@
         waitForIdle();
 
         // We still wouldn't be a bubble because the notification didn't meet requirements
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsAfter.length);
         assertEquals((notifsAfter[0].getNotification().flags & FLAG_BUBBLE), 0);
     }
 
     @Test
     public void testNotificationBubbleIsFlagRemoved_resetOnUpdate() throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -9994,7 +10110,7 @@
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testNotificationBubbleIsFlagRemoved_resetOnUpdate");
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
         // Flag shouldn't be modified
@@ -10010,7 +10126,7 @@
 
 
         // Update the notif
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
         // And the flag is reset
@@ -10020,7 +10136,7 @@
 
     @Test
     public void testNotificationBubbleIsFlagRemoved_resetOnBubbleChangedTrue() throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -10029,7 +10145,7 @@
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testNotificationBubbleIsFlagRemoved_trueOnBubbleChangedTrue");
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
         // Flag shouldn't be modified
@@ -10052,7 +10168,7 @@
 
     @Test
     public void testOnBubbleMetadataFlagChanged() throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -10062,12 +10178,12 @@
         // Set this so that the bubble can be suppressed
         nr.getNotification().getBubbleMetadata().setFlags(
                 Notification.BubbleMetadata.FLAG_SUPPRESSABLE_BUBBLE);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
         // Check the flags
-        Notification n =  mBinderService.getActiveNotifications(PKG)[0].getNotification();
+        Notification n =  mBinderService.getActiveNotifications(mPkg)[0].getNotification();
         assertFalse(n.getBubbleMetadata().isNotificationSuppressed());
         assertFalse(n.getBubbleMetadata().getAutoExpandBubble());
         assertFalse(n.getBubbleMetadata().isBubbleSuppressed());
@@ -10085,7 +10201,7 @@
         waitForIdle();
 
         // Check
-        n =  mBinderService.getActiveNotifications(PKG)[0].getNotification();
+        n =  mBinderService.getActiveNotifications(mPkg)[0].getNotification();
         assertEquals(flags, n.getBubbleMetadata().getFlags());
 
         // Reset to check again
@@ -10096,29 +10212,22 @@
         waitForIdle();
 
         // Check
-        n = mBinderService.getActiveNotifications(PKG)[0].getNotification();
+        n = mBinderService.getActiveNotifications(mPkg)[0].getNotification();
         assertEquals(0, n.getBubbleMetadata().getFlags());
     }
 
     @Test
     public void testOnBubbleMetadataChangedToSuppressNotification_soundStopped()
             throws RemoteException {
-        IRingtonePlayer mockPlayer = mock(IRingtonePlayer.class);
-        when(mAudioManager.getRingtonePlayer()).thenReturn(mockPlayer);
-        // Set up volume to be above 0, and for AudioManager to signal playback should happen,
-        // for the sound to actually play
-        when(mAudioManager.getStreamVolume(anyInt())).thenReturn(10);
-        when(mAudioManager.shouldNotificationSoundPlay(any(android.media.AudioAttributes.class)))
-                .thenReturn(true);
 
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
 
         // Post a bubble notification
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel, "tag");
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -10128,25 +10237,7 @@
         waitForIdle();
 
         // Check audio is stopped
-        verify(mockPlayer).stopAsync();
-    }
-
-    @Test
-    public void testOnBubbleMetadataChangedToSuppressNotification_soundStopped_NAHRefactor()
-        throws Exception {
-        // TODO b/291907312: remove feature flag
-        mSetFlagsRule.enableFlags(Flags.FLAG_REFACTOR_ATTENTION_HELPER);
-        // Cleanup NMS before re-initializing
-        if (mService != null) {
-            try {
-                mService.onDestroy();
-            } catch (IllegalStateException | IllegalArgumentException e) {
-                // can throw if a broadcast receiver was never registered
-            }
-        }
-        initNMS();
-
-        testOnBubbleMetadataChangedToSuppressNotification_soundStopped();
+        verify(mAttentionHelper).clearEffectsLocked(nr.getKey());
     }
 
     @Test
@@ -10156,12 +10247,12 @@
                 : USER_SYSTEM;
 
         NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel, userId);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag",
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
         // A notification exists for the given record
-        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsBefore.length);
 
         reset(mPackageManager);
@@ -10188,7 +10279,7 @@
         waitForIdle();
 
         // No notifications exist for the given record
-        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
         assertEquals(0, notifsBefore.length);
 
         Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 1);
@@ -10208,12 +10299,12 @@
         // generate a NotificationRecord for USER_ALL to make sure it's converted into USER_SYSTEM
         NotificationRecord nr =
                 generateNotificationRecord(mTestNotificationChannel, UserHandle.USER_ALL);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag",
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
         // A notification exists for the given record
-        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsBefore.length);
 
         reset(mPackageManager);
@@ -10238,13 +10329,13 @@
         int otherUserId = 11;
         NotificationRecord nr =
                 generateNotificationRecord(mTestNotificationChannel, otherUserId);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag",
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
         // A notification exists for the given record
         List<StatusBarNotification> notifsBefore =
-                mBinderService.getAppActiveNotifications(PKG, nr.getSbn().getUserId()).getList();
+                mBinderService.getAppActiveNotifications(mPkg, nr.getSbn().getUserId()).getList();
         assertEquals(1, notifsBefore.size());
 
         reset(mPackageManager);
@@ -10346,7 +10437,7 @@
 
     @Test
     public void testNotificationBubbles_disabled_lowRamDevice() throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -10357,12 +10448,12 @@
         // Notification that would typically bubble
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testNotificationBubbles_disabled_lowRamDevice");
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
         // But we wouldn't be a bubble because the device is low ram & all bubbles are disabled.
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsAfter.length);
         assertEquals((notifsAfter[0].getNotification().flags & FLAG_BUBBLE), 0);
     }
@@ -10417,7 +10508,7 @@
         assertNotNull(n.publicVersion.bigContentView);
         assertNotNull(n.publicVersion.headsUpContentView);
 
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         assertNull(n.contentView);
         assertNull(n.bigContentView);
@@ -10426,13 +10517,13 @@
         assertNull(n.publicVersion.bigContentView);
         assertNull(n.publicVersion.headsUpContentView);
 
-        verify(mUsageStats, times(5)).registerImageRemoved(PKG);
+        verify(mUsageStats, times(5)).registerImageRemoved(mPkg);
     }
 
     @Test
     public void testNotificationBubbles_flagAutoExpandForeground_fails_notForeground()
             throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -10448,7 +10539,7 @@
         when(mActivityManager.getPackageImportance(nr.getSbn().getPackageName())).thenReturn(
                 IMPORTANCE_VISIBLE);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -10463,7 +10554,7 @@
     @Test
     public void testNotificationBubbles_flagAutoExpandForeground_succeeds_foreground()
             throws RemoteException {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -10479,7 +10570,7 @@
         when(mActivityManager.getPackageImportance(nr.getSbn().getPackageName())).thenReturn(
                 IMPORTANCE_FOREGROUND);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -10495,7 +10586,7 @@
     @Test
     public void testNotificationBubbles_flagRemoved_whenShortcutRemoved()
             throws RemoteException {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -10510,12 +10601,12 @@
                 null /* groupKey */, false /* isSummary */);
         nb.setShortcutId(VALID_CONVO_SHORTCUT_ID);
         nb.setBubbleMetadata(metadata);
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
         // Test: Send the bubble notification
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -10530,12 +10621,12 @@
 
         // Make sure the shortcut is cached.
         verify(mShortcutServiceInternal).cacheShortcuts(
-                anyInt(), any(), eq(PKG), eq(singletonList(VALID_CONVO_SHORTCUT_ID)),
+                anyInt(), any(), eq(mPkg), eq(singletonList(VALID_CONVO_SHORTCUT_ID)),
                 eq(USER_SYSTEM), eq(ShortcutInfo.FLAG_CACHED_NOTIFICATIONS));
 
         // Test: Remove the shortcut
         when(mLauncherApps.getShortcuts(any(), any())).thenReturn(null);
-        launcherAppsCallback.getValue().onShortcutsChanged(PKG, emptyList(),
+        launcherAppsCallback.getValue().onShortcutsChanged(mPkg, emptyList(),
                 UserHandle.getUserHandleForUid(mUid));
         waitForIdle();
 
@@ -10555,7 +10646,7 @@
     public void testNotificationBubbles_shortcut_stopListeningWhenNotifRemoved()
             throws RemoteException {
         final String shortcutId = "someshortcutId";
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -10570,14 +10661,14 @@
                 null /* groupKey */, false /* isSummary */);
         nb.setShortcutId(shortcutId);
         nb.setBubbleMetadata(metadata);
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
         // Pretend the shortcut exists
         List<ShortcutInfo> shortcutInfos = new ArrayList<>();
         ShortcutInfo info = mock(ShortcutInfo.class);
-        when(info.getPackage()).thenReturn(PKG);
+        when(info.getPackage()).thenReturn(mPkg);
         when(info.getId()).thenReturn(shortcutId);
         when(info.getUserId()).thenReturn(USER_SYSTEM);
         when(info.isLongLived()).thenReturn(true);
@@ -10588,7 +10679,7 @@
                 anyString(), anyInt(), any())).thenReturn(true);
 
         // Test: Send the bubble notification
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -10603,11 +10694,11 @@
 
         // Make sure the shortcut is cached.
         verify(mShortcutServiceInternal).cacheShortcuts(
-                anyInt(), any(), eq(PKG), eq(singletonList(shortcutId)),
+                anyInt(), any(), eq(mPkg), eq(singletonList(shortcutId)),
                 eq(USER_SYSTEM), eq(ShortcutInfo.FLAG_CACHED_NOTIFICATIONS));
 
         // Test: Remove the notification
-        mBinderService.cancelNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -10620,7 +10711,7 @@
     @Test
     public void testNotificationBubbles_bubbleChildrenStay_whenGroupSummaryDismissed()
             throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -10631,21 +10722,21 @@
         // Dismiss summary
         final NotificationVisibility nv = NotificationVisibility.obtain(nrSummary.getKey(), 1, 2,
                 true);
-        mService.mNotificationDelegate.onNotificationClear(mUid, 0, PKG,
+        mService.mNotificationDelegate.onNotificationClear(mUid, 0, mPkg,
                 nrSummary.getUserId(), nrSummary.getKey(),
                 NotificationStats.DISMISSAL_SHADE,
                 NotificationStats.DISMISS_SENTIMENT_NEUTRAL, nv);
         waitForIdle();
 
         // The bubble should still exist
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsAfter.length);
     }
 
     @Test
     public void testNotificationBubbles_bubbleChildrenStay_whenGroupSummaryClicked()
             throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -10661,7 +10752,7 @@
         waitForIdle();
 
         // The bubble should still exist
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsAfter.length);
 
         // Check we got the click log and associated dismissal logs
@@ -10679,7 +10770,7 @@
     @Test
     public void testNotificationBubbles_bubbleStays_whenClicked()
             throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -10696,7 +10787,7 @@
         waitForIdle();
 
         // THEN the bubble should still exist
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsAfter.length);
 
         // Check we got the click log
@@ -10713,7 +10804,7 @@
     @Test
     public void testNotificationBubbles_bubbleStays_whenClicked_afterBubbleDismissed()
             throws Exception {
-        setUpPrefsForBubbles(PKG, mUid,
+        setUpPrefsForBubbles(mPkg, mUid,
                 true /* global */,
                 BUBBLE_PREFERENCE_ALL /* app */,
                 true /* channel */);
@@ -10737,7 +10828,7 @@
         waitForIdle();
 
         // THEN the bubble should still exist
-        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
         assertEquals(1, notifsAfter.length);
 
         // Check we got the click log
@@ -10797,7 +10888,7 @@
 
     @Test
     public void testHandleOnPackageChanged() {
-        String[] pkgs = new String[] {PKG, PKG_N_MR1};
+        String[] pkgs = new String[] {mPkg, PKG_N_MR1};
         int[] uids = new int[] {mUid, UserHandle.PER_USER_RANGE + 1};
 
         mService.handleOnPackageChanged(false, USER_SYSTEM, pkgs, uids);
@@ -10824,25 +10915,25 @@
         assertEquals(1, notifs.length);
 
         // Cancels all notifications.
-        mService.cancelAllNotificationsInt(mUid, 0, PKG, null, 0, 0,
+        mService.cancelAllNotificationsInt(mUid, 0, mPkg, null, 0, 0,
                 notif.getUserId(), REASON_CANCEL);
         waitForIdle();
         notifs = mBinderService.getActiveNotifications(notif.getSbn().getPackageName());
         assertEquals(0, notifs.length);
 
         // Checks that notification history's recently canceled archive contains the notification.
-        notifs = mBinderService.getHistoricalNotificationsWithAttribution(PKG,
+        notifs = mBinderService.getHistoricalNotificationsWithAttribution(mPkg,
                         mContext.getAttributionTag(), 5 /* count */, false /* includeSnoozed */);
         waitForIdle();
         assertEquals(1, notifs.length);
 
         // Remove sthe package that contained the channel
-        simulatePackageRemovedBroadcast(PKG, mUid);
+        simulatePackageRemovedBroadcast(mPkg, mUid);
         waitForIdle();
 
         // Checks that notification history no longer contains the notification.
         notifs = mBinderService.getHistoricalNotificationsWithAttribution(
-                PKG, mContext.getAttributionTag(), 5 /* count */, false /* includeSnoozed */);
+                mPkg, mContext.getAttributionTag(), 5 /* count */, false /* includeSnoozed */);
         waitForIdle();
         assertEquals(0, notifs.length);
     }
@@ -10851,7 +10942,7 @@
     public void testNotificationHistory_addNoisyNotification() throws Exception {
         NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel,
                 null /* tvExtender */);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -10875,14 +10966,14 @@
         assertEquals(original, orig);
         assertFalse(TextUtils.isEmpty(orig.getName()));
 
-        mBinderService.createNotificationChannels(PKG, new ParceledListSlice(Arrays.asList(
+        mBinderService.createNotificationChannels(mPkg, new ParceledListSlice(Arrays.asList(
                 orig)));
 
         mBinderService.createConversationNotificationChannelForPackage(
-                PKG, mUid, orig, "friend");
+                mPkg, mUid, orig, "friend");
 
         NotificationChannel friendChannel = mBinderService.getConversationNotificationChannel(
-                PKG, userId, PKG, original.getId(), false, "friend");
+                mPkg, userId, mPkg, original.getId(), false, "friend");
 
         assertEquals(original.getName(), friendChannel.getName());
         assertEquals(original.getId(), friendChannel.getParentChannelId());
@@ -10947,15 +11038,15 @@
         NotificationChannel parentChannel = parcelAndUnparcel(originalChannel,
                 NotificationChannel.CREATOR);
         assertEquals(originalChannel, parentChannel);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(parentChannel)));
 
         //Create deleted conversation channel
         mBinderService.createConversationNotificationChannelForPackage(
-                PKG, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
+                mPkg, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
         final NotificationChannel conversationChannel =
                 mBinderService.getConversationNotificationChannel(
-                PKG, mUserId, PKG, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
+                        mPkg, mUserId, mPkg, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
         conversationChannel.setDeleted(true);
 
         //Create notification record
@@ -10963,12 +11054,12 @@
                 null /* groupKey */, false /* isSummary */);
         nb.setShortcutId(VALID_CONVO_SHORTCUT_ID);
         nb.setChannelId(originalChannel.getId());
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, originalChannel);
         assertThat(nr.getChannel()).isEqualTo(originalChannel);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -10990,7 +11081,7 @@
         NotificationChannel parentChannel = parcelAndUnparcel(originalChannel,
                 NotificationChannel.CREATOR);
         assertEquals(originalChannel, parentChannel);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(parentChannel)));
         parentChannel.setDeleted(true);
 
@@ -10999,14 +11090,14 @@
                 null /* groupKey */, false /* isSummary */);
         nb.setShortcutId(VALID_CONVO_SHORTCUT_ID);
         nb.setChannelId(originalChannel.getId());
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, originalChannel);
         assertThat(nr.getChannel()).isEqualTo(originalChannel);
 
         when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -11028,27 +11119,27 @@
         NotificationChannel parentChannel = parcelAndUnparcel(originalChannel,
                 NotificationChannel.CREATOR);
         assertEquals(originalChannel, parentChannel);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(parentChannel)));
 
         //Create conversation channel
         mBinderService.createConversationNotificationChannelForPackage(
-                PKG, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
+                mPkg, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
         final NotificationChannel conversationChannel =
                 mBinderService.getConversationNotificationChannel(
-                    PKG, mUserId, PKG, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
+                        mPkg, mUserId, mPkg, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
 
         //Create notification record
         Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */,
                 null /* groupKey */, false /* isSummary */);
         nb.setShortcutId(VALID_CONVO_SHORTCUT_ID);
         nb.setChannelId(originalChannel.getId());
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, originalChannel);
         assertThat(nr.getChannel()).isEqualTo(originalChannel);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -11073,27 +11164,27 @@
         NotificationChannel parentChannel = parcelAndUnparcel(originalChannel,
                 NotificationChannel.CREATOR);
         assertEquals(originalChannel, parentChannel);
-        mBinderService.createNotificationChannels(PKG,
+        mBinderService.createNotificationChannels(mPkg,
                 new ParceledListSlice(Arrays.asList(parentChannel)));
 
         //Create deleted conversation channel
         mBinderService.createConversationNotificationChannelForPackage(
-                PKG, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
+                mPkg, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
         final NotificationChannel conversationChannel =
                 mBinderService.getConversationNotificationChannel(
-                    PKG, mUserId, PKG, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
+                        mPkg, mUserId, mPkg, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
 
         //Create notification record without a shortcutId
         Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */,
                 null /* groupKey */, false /* isSummary */);
         nb.setShortcutId(null);
         nb.setChannelId(originalChannel.getId());
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, originalChannel);
         assertThat(nr.getChannel()).isEqualTo(originalChannel);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -11209,7 +11300,7 @@
                 generateMessageBubbleNotifRecord(mTestNotificationChannel,
                         "testShortcutHelperNull_doesntCrashEnqueue");
         try {
-            mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+            mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                     nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
             waitForIdle();
         } catch (Exception e) {
@@ -11288,23 +11379,23 @@
     public void testRecordMessages_invalidMsg_afterValidMsg() throws RemoteException {
         NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
                 "testRecordMessages_invalidMsg_afterValidMsg_1");
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
         assertTrue(mService.getNotificationRecord(nr.getKey()).isConversation());
 
-        mBinderService.cancelAllNotifications(PKG, mUid);
+        mBinderService.cancelAllNotifications(mPkg, mUid);
         waitForIdle();
 
         Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */,
                 null /* groupKey */, false /* isSummary */);
         nb.setShortcutId(null);
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
                 "testRecordMessages_invalidMsg_afterValidMsg_2", mUid, 0, nb.build(),
                 UserHandle.getUserHandleForUid(mUid), null, 0);
          nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
@@ -11319,14 +11410,14 @@
         for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
             StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
                     i, null, false).getSbn();
-            mBinderService.enqueueNotificationWithTag(PKG, PKG,
+            mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                     "testCanPostFgsWhenOverLimit",
                     sbn.getId(), sbn.getNotification(), sbn.getUserId());
         }
 
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCanPostFgsWhenOverLimit - fgs over limit!",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
 
@@ -11347,7 +11438,7 @@
         for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
             StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
                     i, null, false).getSbn();
-            mBinderService.enqueueNotificationWithTag(PKG, PKG,
+            mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                     "testCanPostFgsWhenOverLimit",
                     sbn.getId(), sbn.getNotification(), sbn.getUserId());
             waitForIdle();
@@ -11356,13 +11447,13 @@
         final StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
                 100, null, false).getSbn();
         sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCanPostFgsWhenOverLimit - fgs over limit!",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
 
         final StatusBarNotification sbn2 = generateNotificationRecord(mTestNotificationChannel,
                 101, null, false).getSbn();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCanPostFgsWhenOverLimit - non fgs over limit!",
                 sbn2.getId(), sbn2.getNotification(), sbn2.getUserId());
 
@@ -11373,7 +11464,7 @@
         final StatusBarNotification sbn3 = generateNotificationRecord(mTestNotificationChannel,
                 101, null, false).getSbn();
         sbn3.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCanPostFgsWhenOverLimit - fake fgs over limit!",
                 sbn3.getId(), sbn3.getNotification(), sbn3.getUserId());
 
@@ -11522,7 +11613,7 @@
         NotificationRecord r = generateMessageBubbleNotifRecord(true,
                 mTestNotificationChannel, 7, "testImmutableBubbleIntent", null, false);
         try {
-            mBinderService.enqueueNotificationWithTag(PKG, PKG, r.getSbn().getTag(),
+            mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
                     r.getSbn().getId(), r.getNotification(), r.getSbn().getUserId());
 
             waitForIdle();
@@ -11539,7 +11630,7 @@
         NotificationRecord r = generateMessageBubbleNotifRecord(true,
                 mTestNotificationChannel, 7, "testMutableBubbleIntent", null, false);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, r.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
                 r.getSbn().getId(), r.getNotification(), r.getSbn().getUserId());
 
         waitForIdle();
@@ -11555,7 +11646,7 @@
         NotificationRecord r = generateMessageBubbleNotifRecord(false,
                 mTestNotificationChannel, 7, "testImmutableDirectReplyActionIntent", null, false);
         try {
-            mBinderService.enqueueNotificationWithTag(PKG, PKG, r.getSbn().getTag(),
+            mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
                     r.getSbn().getId(), r.getNotification(), r.getSbn().getUserId());
 
             waitForIdle();
@@ -11571,7 +11662,7 @@
                 .thenReturn(FLAG_MUTABLE | FLAG_ONE_SHOT);
         NotificationRecord r = generateMessageBubbleNotifRecord(false,
                 mTestNotificationChannel, 7, "testMutableDirectReplyActionIntent", null, false);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, r.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
                 r.getSbn().getId(), r.getNotification(), r.getSbn().getUserId());
 
         waitForIdle();
@@ -11645,7 +11736,7 @@
                 .thenReturn(FLAG_IMMUTABLE | FLAG_ONE_SHOT);
         NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, r.getSbn().getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
                 r.getSbn().getId(), r.getNotification(), r.getSbn().getUserId());
 
         waitForIdle();
@@ -11815,9 +11906,9 @@
 
         when(mPermissionHelper.hasPermission(mUid)).thenReturn(false);
 
-        assertThat(mBinderService.getNotificationChannelsBypassingDnd(PKG, mUid).getList())
+        assertThat(mBinderService.getNotificationChannelsBypassingDnd(mPkg, mUid).getList())
                 .isEmpty();
-        verify(mPreferencesHelper, never()).getNotificationChannelsBypassingDnd(PKG, mUid);
+        verify(mPreferencesHelper, never()).getNotificationChannelsBypassingDnd(mPkg, mUid);
     }
 
     @Test
@@ -11909,7 +12000,7 @@
                 .setContentTitle("foo")
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
                 .addAction(new Notification.Action.Builder(null, "test", null).build());
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -11921,7 +12012,7 @@
 
         // just using the style - blocked
         nb.setStyle(new Notification.MediaStyle());
-        sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -11933,7 +12024,7 @@
         Bundle extras = new Bundle();
         extras.putParcelable(Notification.EXTRA_MEDIA_SESSION, new Intent());
         nb.addExtras(extras);
-        sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -11942,7 +12033,7 @@
 
         // style + media session - bypasses block
         nb.setStyle(new Notification.MediaStyle().setMediaSession(mock(MediaSession.Token.class)));
-        sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -11960,7 +12051,7 @@
                 .setContentTitle("foo")
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
                 .addAction(new Notification.Action.Builder(null, "test", null).build());
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -11980,7 +12071,7 @@
         mService.clearNotifications();
         reset(mUsageStats);
         nb.setStyle(new Notification.MediaStyle());
-        sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -11997,7 +12088,7 @@
         mService.clearNotifications();
         reset(mUsageStats);
         nb.setStyle(new Notification.MediaStyle().setMediaSession(mock(MediaSession.Token.class)));
-        sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -12022,7 +12113,7 @@
                 .setContentTitle("foo")
                 .setSmallIcon(android.R.drawable.sym_def_app_icon)
                 .addAction(new Notification.Action.Builder(null, "test", null).build());
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -12039,7 +12130,7 @@
         nb.setStyle(Notification.CallStyle.forOngoingCall(
                 person, mock(PendingIntent.class)));
         nb.setFullScreenIntent(mock(PendingIntent.class), true);
-        sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -12087,7 +12178,7 @@
                         .setContentTitle("foo")
                         .setSmallIcon(android.R.drawable.sym_def_app_icon)
                         .addAction(new Notification.Action.Builder(null, "test", null).build());
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -12108,7 +12199,7 @@
         Person person = new Person.Builder().setName("caller").build();
         nb.setStyle(Notification.CallStyle.forOngoingCall(person, mock(PendingIntent.class)));
         nb.setFullScreenIntent(mock(PendingIntent.class), true);
-        sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, nb.build(),
+        sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0, nb.build(),
                 UserHandle.getUserHandleForUid(mUid), null, 0);
         r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -12230,21 +12321,21 @@
 
         NotificationRecord nr0 =
                 generateNotificationRecord(mTestNotificationChannel, mUserId);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag0",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
                 nr0.getSbn().getId(), nr0.getSbn().getNotification(), nr0.getSbn().getUserId());
 
         NotificationRecord nr10 =
                 generateNotificationRecord(mTestNotificationChannel, 10);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag10",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag10",
                 nr10.getSbn().getId(), nr10.getSbn().getNotification(), nr10.getSbn().getUserId());
 
         NotificationRecord nr11 =
                 generateNotificationRecord(mTestNotificationChannel, 11);
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag11",
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag11",
                 nr11.getSbn().getId(), nr11.getSbn().getNotification(), nr11.getSbn().getUserId());
         waitForIdle();
 
-        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
         assertEquals(2, notifs.length);
         for (StatusBarNotification sbn : notifs) {
             if (sbn.getUserId() == 11) {
@@ -12333,9 +12424,9 @@
                     VISIBILITY_PRIVATE));
 
         // cancel both children
-        mBinderService.cancelNotificationWithTag(PKG, PKG, nr0.getSbn().getTag(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, nr0.getSbn().getTag(),
                 nr0.getSbn().getId(), nr0.getSbn().getUserId());
-        mBinderService.cancelNotificationWithTag(PKG, PKG, nr1.getSbn().getTag(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, nr1.getSbn().getTag(),
                 nr1.getSbn().getId(), nr1.getSbn().getUserId());
         waitForIdle();
 
@@ -12375,9 +12466,9 @@
                 nr0_all.getKey(), GroupHelper.BASE_FLAGS, mock(Icon.class), 0, VISIBILITY_PRIVATE));
 
         // cancel both children for USER_ALL
-        mBinderService.cancelNotificationWithTag(PKG, PKG, nr0_all.getSbn().getTag(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, nr0_all.getSbn().getTag(),
                 nr0_all.getSbn().getId(), UserHandle.USER_ALL);
-        mBinderService.cancelNotificationWithTag(PKG, PKG, nr1_all.getSbn().getTag(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, nr1_all.getSbn().getTag(),
                 nr1_all.getSbn().getId(), UserHandle.USER_ALL);
         waitForIdle();
 
@@ -12677,7 +12768,7 @@
             boolean isSticky) throws Exception {
 
         when(mPermissionHelper.hasRequestedPermission(Manifest.permission.USE_FULL_SCREEN_INTENT,
-                PKG, mUserId)).thenReturn(appRequested);
+                mPkg, mUserId)).thenReturn(appRequested);
 
         when(mPermissionManager.checkPermissionForDataDelivery(
                 eq(Manifest.permission.USE_FULL_SCREEN_INTENT), any(), any()))
@@ -12687,7 +12778,7 @@
                 .setFullScreenIntent(mock(PendingIntent.class), true)
                 .build();
 
-        mService.fixNotification(n, PKG, "tag", 9, mUserId, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, mUserId, mUid, NOT_FOREGROUND_SERVICE, true);
 
         final int stickyFlag = n.flags & Notification.FLAG_FSI_REQUESTED_BUT_DENIED;
 
@@ -12741,7 +12832,7 @@
                 .setFlag(FLAG_CAN_COLORIZE, true)
                 .build();
 
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         assertFalse(n.isForegroundService());
         assertFalse(n.hasColorizedPermission());
@@ -12754,7 +12845,7 @@
                 .setStyle(Notification.CallStyle.forOngoingCall(
                         person, mock(PendingIntent.class)))
                 .build();
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -12775,7 +12866,7 @@
                 .setStyle(Notification.CallStyle.forOngoingCall(
                         person, mock(PendingIntent.class)))
                 .build();
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -12805,7 +12896,7 @@
         if (isExpired) {
             timePostedMs -= BITMAP_DURATION.toMillis();
         }
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 notification, UserHandle.getUserHandleForUid(mUid), null, timePostedMs);
 
         return new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12935,7 +13026,7 @@
                 .setStyle(Notification.CallStyle.forOngoingCall(
                         person, mock(PendingIntent.class)))
                 .build();
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -12952,7 +13043,7 @@
                 .setStyle(Notification.CallStyle.forOngoingCall(
                         person, mock(PendingIntent.class)))
                 .build();
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -12968,7 +13059,7 @@
                 .setStyle(Notification.CallStyle.forOngoingCall(
                         person, mock(PendingIntent.class)))
                 .build();
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -12984,7 +13075,7 @@
                 .setStyle(Notification.CallStyle.forOngoingCall(
                         person, mock(PendingIntent.class)))
                 .build();
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
@@ -13012,7 +13103,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should not be set
         assertSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13029,7 +13120,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be set
         assertNotSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13055,7 +13146,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be set
         assertNotSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13075,7 +13166,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be set
         assertNotSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13090,7 +13181,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should not be set
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13106,7 +13197,7 @@
         n.flags |= Notification.FLAG_NO_DISMISS;
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be cleared
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13122,7 +13213,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should not be set
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13141,7 +13232,7 @@
         n.flags |= Notification.FLAG_NO_DISMISS;
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be cleared
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13156,7 +13247,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should not be set
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13173,7 +13264,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be set
         assertNotSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13183,7 +13274,7 @@
     public void fixExemptAppOpNotification_withFlag_shouldBeNonDismissible()
             throws Exception {
         final ApplicationInfo ai = new ApplicationInfo();
-        ai.packageName = PKG;
+        ai.packageName = mPkg;
         ai.uid = mUid;
         ai.flags |= ApplicationInfo.FLAG_SYSTEM;
 
@@ -13191,7 +13282,7 @@
                 .thenReturn(ai);
         when(mAppOpsManager.checkOpNoThrow(
                 AppOpsManager.OP_SYSTEM_EXEMPT_FROM_DISMISSIBLE_NOTIFICATIONS, mUid,
-                PKG)).thenReturn(AppOpsManager.MODE_ALLOWED);
+                mPkg)).thenReturn(AppOpsManager.MODE_ALLOWED);
         // Given: a notification has the flag FLAG_ONGOING_EVENT set
         setDpmAppOppsExemptFromDismissal(true);
         Notification n = new Notification.Builder(mContext, "test")
@@ -13199,7 +13290,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should be cleared
         assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13210,7 +13301,7 @@
             throws Exception {
         when(mAppOpsManager.checkOpNoThrow(
                 AppOpsManager.OP_SYSTEM_EXEMPT_FROM_DISMISSIBLE_NOTIFICATIONS, mUid,
-                PKG)).thenReturn(AppOpsManager.MODE_ALLOWED);
+                mPkg)).thenReturn(AppOpsManager.MODE_ALLOWED);
         // Given: a notification has the flag FLAG_ONGOING_EVENT set
         setDpmAppOppsExemptFromDismissal(false);
         Notification n = new Notification.Builder(mContext, "test")
@@ -13218,7 +13309,7 @@
                 .build();
 
         // When: fix the notification with NotificationManagerService
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         // Then: the notification's flag FLAG_NO_DISMISS should not be set
         assertSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13230,10 +13321,10 @@
                 .thenReturn(true);
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelAllNotifications_IgnoreUserInitiatedJob",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+        mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
         waitForIdle();
         StatusBarNotification[] notifs =
                 mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -13247,10 +13338,10 @@
                 .thenReturn(false);
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelAllNotifications_UijFlag_NoUij_Allowed",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+        mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
         waitForIdle();
         StatusBarNotification[] notifs =
                 mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -13263,7 +13354,7 @@
                 .thenReturn(true);
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCancelAllNotifications_IgnoreOtherPackages",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         mBinderService.cancelAllNotifications("other_pkg_name", sbn.getUserId());
@@ -13284,9 +13375,9 @@
         StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, null, mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, null,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, null,
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        mInternalService.removeUserInitiatedJobFlagFromNotification(PKG, sbn.getId(),
+        mInternalService.removeUserInitiatedJobFlagFromNotification(mPkg, sbn.getId(),
                 sbn.getUserId());
         waitForIdle();
         StatusBarNotification[] notifs =
@@ -13298,12 +13389,12 @@
     public void testCancelAfterSecondEnqueueDoesNotSpecifyUserInitiatedJobFlag() throws Exception {
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags = Notification.FLAG_ONGOING_EVENT | FLAG_USER_INITIATED_JOB;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
         sbn.getNotification().flags = Notification.FLAG_ONGOING_EVENT;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
-        mBinderService.cancelNotificationWithTag(PKG, PKG, sbn.getTag(), sbn.getId(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, sbn.getTag(), sbn.getId(),
                 sbn.getUserId());
         waitForIdle();
         assertEquals(0, mBinderService.getActiveNotifications(sbn.getPackageName()).length);
@@ -13571,10 +13662,10 @@
 
     @Test
     public void testDeleteChannelGroupChecksForUijs() throws Exception {
-        when(mCompanionMgr.getAssociations(PKG, UserHandle.getUserId(mUid)))
+        when(mCompanionMgr.getAssociations(mPkg, UserHandle.getUserId(mUid)))
                 .thenReturn(singletonList(mock(AssociationInfo.class)));
         CountDownLatch latch = new CountDownLatch(2);
-        mService.createNotificationChannelGroup(PKG, mUid,
+        mService.createNotificationChannelGroup(mPkg, mUid,
                 new NotificationChannelGroup("group", "group"), true, false);
         new Thread(() -> {
             NotificationChannel notificationChannel = new NotificationChannel("id", "id",
@@ -13583,7 +13674,7 @@
             ParceledListSlice<NotificationChannel> pls =
                     new ParceledListSlice(ImmutableList.of(notificationChannel));
             try {
-                mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
+                mBinderService.createNotificationChannelsForPackage(mPkg, mUid, pls);
             } catch (RemoteException e) {
                 throw new RuntimeException(e);
             }
@@ -13594,7 +13685,7 @@
                 synchronized (this) {
                     wait(5000);
                 }
-                mService.createNotificationChannelGroup(PKG, mUid,
+                mService.createNotificationChannelGroup(mPkg, mUid,
                         new NotificationChannelGroup("new", "new group"), true, false);
                 NotificationChannel notificationChannel =
                         new NotificationChannel("id", "id", NotificationManager.IMPORTANCE_HIGH);
@@ -13602,8 +13693,8 @@
                 ParceledListSlice<NotificationChannel> pls =
                         new ParceledListSlice(ImmutableList.of(notificationChannel));
                 try {
-                    mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
-                    mBinderService.deleteNotificationChannelGroup(PKG, "group");
+                    mBinderService.createNotificationChannelsForPackage(mPkg, mUid, pls);
+                    mBinderService.deleteNotificationChannelGroup(mPkg, "group");
                 } catch (RemoteException e) {
                     throw new RuntimeException(e);
                 }
@@ -13625,14 +13716,14 @@
         Notification n = new Notification.Builder(mContext, "").build();
         n.flags |= FLAG_USER_INITIATED_JOB;
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 9, null, mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 9, null, mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
         mService.addEnqueuedNotification(r);
 
         mInternalService.removeUserInitiatedJobFlagFromNotification(
-                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+                mPkg, r.getSbn().getId(), r.getSbn().getUserId());
 
         waitForIdle();
 
@@ -13646,14 +13737,14 @@
         Notification n = new Notification.Builder(mContext, "").build();
         n.flags |= FLAG_USER_INITIATED_JOB;
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 9, null, mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 9, null, mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
         mService.addNotification(r);
 
         mInternalService.removeUserInitiatedJobFlagFromNotification(
-                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+                mPkg, r.getSbn().getId(), r.getSbn().getUserId());
 
         waitForIdle();
 
@@ -13668,7 +13759,7 @@
     public void testCannotRemoveUserInitiatedJobFlagWhenOverLimit_enqueued() {
         for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
             Notification n = new Notification.Builder(mContext, "").build();
-            StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, i, null, mUid, 0,
+            StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, i, null, mUid, 0,
                     n, UserHandle.getUserHandleForUid(mUid), null, 0);
             NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
             mService.addEnqueuedNotification(r);
@@ -13676,7 +13767,7 @@
         Notification n = new Notification.Builder(mContext, "").build();
         n.flags |= FLAG_USER_INITIATED_JOB;
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg,
                 NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS, null, mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -13684,7 +13775,7 @@
         mService.addEnqueuedNotification(r);
 
         mInternalService.removeUserInitiatedJobFlagFromNotification(
-                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+                mPkg, r.getSbn().getId(), r.getSbn().getUserId());
 
         waitForIdle();
 
@@ -13698,7 +13789,7 @@
                 .thenReturn(true);
         for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
             Notification n = new Notification.Builder(mContext, "").build();
-            StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, i, null, mUid, 0,
+            StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, i, null, mUid, 0,
                     n, UserHandle.getUserHandleForUid(mUid), null, 0);
             NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
             mService.addNotification(r);
@@ -13706,7 +13797,7 @@
         Notification n = new Notification.Builder(mContext, "").build();
         n.flags |= FLAG_USER_INITIATED_JOB;
 
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg,
                 NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS, null, mUid, 0,
                 n, UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -13714,7 +13805,7 @@
         mService.addNotification(r);
 
         mInternalService.removeUserInitiatedJobFlagFromNotification(
-                PKG, r.getSbn().getId(), r.getSbn().getUserId());
+                mPkg, r.getSbn().getId(), r.getSbn().getUserId());
 
         waitForIdle();
 
@@ -13729,13 +13820,13 @@
         for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
             StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
                     i, null, false).getSbn();
-            mBinderService.enqueueNotificationWithTag(PKG, PKG, "testCanPostUijWhenOverLimit",
+            mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testCanPostUijWhenOverLimit",
                     sbn.getId(), sbn.getNotification(), sbn.getUserId());
         }
 
         final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
         sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCanPostUijWhenOverLimit - uij over limit!",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
 
@@ -13755,7 +13846,7 @@
         for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
             StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
                     i, null, false).getSbn();
-            mBinderService.enqueueNotificationWithTag(PKG, PKG, "testCannotPostNonUijWhenOverLimit",
+            mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testCannotPostNonUijWhenOverLimit",
                     sbn.getId(), sbn.getNotification(), sbn.getUserId());
             waitForIdle();
         }
@@ -13763,13 +13854,13 @@
         final StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
                 100, null, false).getSbn();
         sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCannotPostNonUijWhenOverLimit - uij over limit!",
                 sbn.getId(), sbn.getNotification(), sbn.getUserId());
 
         final StatusBarNotification sbn2 = generateNotificationRecord(mTestNotificationChannel,
                 101, null, false).getSbn();
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCannotPostNonUijWhenOverLimit - non uij over limit!",
                 sbn2.getId(), sbn2.getNotification(), sbn2.getUserId());
 
@@ -13778,7 +13869,7 @@
         final StatusBarNotification sbn3 = generateNotificationRecord(mTestNotificationChannel,
                 101, null, false).getSbn();
         sbn3.getNotification().flags |= FLAG_USER_INITIATED_JOB;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
                 "testCannotPostNonUijWhenOverLimit - fake uij over limit!",
                 sbn3.getId(), sbn3.getNotification(), sbn3.getUserId());
 
@@ -13801,7 +13892,7 @@
                 .setFlag(FLAG_USER_INITIATED_JOB, true)
                 .build();
 
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
         assertFalse(n.isUserInitiatedJob());
     }
 
@@ -13809,11 +13900,11 @@
     public void enqueue_updatesEnqueueRate() throws Exception {
         Notification n = generateNotificationRecord(null).getNotification();
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, n, mUserId);
         // Don't waitForIdle() here. We want to verify the "intermediate" state.
 
-        verify(mUsageStats).registerEnqueuedByApp(eq(PKG));
-        verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(PKG));
+        verify(mUsageStats).registerEnqueuedByApp(eq(mPkg));
+        verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(mPkg));
         verify(mUsageStats, never()).registerPostedByApp(any());
 
         waitForIdle();
@@ -13823,26 +13914,26 @@
     public void enqueue_withPost_updatesEnqueueRateAndPost() throws Exception {
         Notification n = generateNotificationRecord(null).getNotification();
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, n, mUserId);
         waitForIdle();
 
-        verify(mUsageStats).registerEnqueuedByApp(eq(PKG));
-        verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(PKG));
+        verify(mUsageStats).registerEnqueuedByApp(eq(mPkg));
+        verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(mPkg));
         verify(mUsageStats).registerPostedByApp(any());
     }
 
     @Test
     public void enqueueNew_whenOverEnqueueRate_accepts() throws Exception {
         Notification n = generateNotificationRecord(null).getNotification();
-        when(mUsageStats.getAppEnqueueRate(eq(PKG)))
+        when(mUsageStats.getAppEnqueueRate(eq(mPkg)))
                 .thenReturn(DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE + 1f);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, n, mUserId);
         waitForIdle();
 
         assertThat(mService.mNotificationsByKey).hasSize(1);
-        verify(mUsageStats).registerEnqueuedByApp(eq(PKG));
-        verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(PKG));
+        verify(mUsageStats).registerEnqueuedByApp(eq(mPkg));
+        verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(mPkg));
         verify(mUsageStats).registerPostedByApp(any());
     }
 
@@ -13851,23 +13942,23 @@
         // Post the first version.
         Notification original = generateNotificationRecord(null).getNotification();
         original.when = 111;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, original, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, original, mUserId);
         waitForIdle();
         assertThat(mService.mNotificationList).hasSize(1);
         assertThat(mService.mNotificationList.get(0).getNotification().when).isEqualTo(111);
 
         reset(mUsageStats);
-        when(mUsageStats.getAppEnqueueRate(eq(PKG)))
+        when(mUsageStats.getAppEnqueueRate(eq(mPkg)))
                 .thenReturn(DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE - 1f);
 
         // Post the update.
         Notification update = generateNotificationRecord(null).getNotification();
         update.when = 222;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, update, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, update, mUserId);
         waitForIdle();
 
-        verify(mUsageStats).registerEnqueuedByApp(eq(PKG));
-        verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(PKG));
+        verify(mUsageStats).registerEnqueuedByApp(eq(mPkg));
+        verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(mPkg));
         verify(mUsageStats, never()).registerPostedByApp(any());
         verify(mUsageStats).registerUpdatedByApp(any(), any());
         assertThat(mService.mNotificationList).hasSize(1);
@@ -13879,22 +13970,22 @@
         // Post the first version.
         Notification original = generateNotificationRecord(null).getNotification();
         original.when = 111;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, original, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, original, mUserId);
         waitForIdle();
         assertThat(mService.mNotificationList).hasSize(1);
         assertThat(mService.mNotificationList.get(0).getNotification().when).isEqualTo(111);
 
         reset(mUsageStats);
-        when(mUsageStats.getAppEnqueueRate(eq(PKG)))
+        when(mUsageStats.getAppEnqueueRate(eq(mPkg)))
                 .thenReturn(DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE + 1f);
 
         // Post the update.
         Notification update = generateNotificationRecord(null).getNotification();
         update.when = 222;
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, update, mUserId);
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, update, mUserId);
         waitForIdle();
 
-        verify(mUsageStats).registerEnqueuedByApp(eq(PKG));
+        verify(mUsageStats).registerEnqueuedByApp(eq(mPkg));
         verify(mUsageStats, never()).registerEnqueuedByAppAndAccepted(any());
         verify(mUsageStats, never()).registerPostedByApp(any());
         verify(mUsageStats, never()).registerUpdatedByApp(any(), any());
@@ -13913,7 +14004,7 @@
                 .addAction(new Notification.Action.Builder(null, "action2", actionIntent2).build())
                 .build();
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 1,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 1,
                 parcelAndUnparcel(n, Notification.CREATOR), mUserId);
 
         verify(mAmi, times(3)).setPendingIntentAllowlistDuration(
@@ -13941,7 +14032,7 @@
                         .build())
                 .build();
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 1,
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 1,
                 parcelAndUnparcel(source, Notification.CREATOR), mUserId);
 
         verify(mAmi, times(4)).setPendingIntentAllowlistDuration(
@@ -14413,7 +14504,7 @@
         assertThat(mBinderService.getAutomaticZenRules()).isEmpty();
 
         // Create an implicit zen rule by calling setNotificationPolicy from an app.
-        mBinderService.setNotificationPolicy(PKG, new NotificationManager.Policy(0, 0, 0), false);
+        mBinderService.setNotificationPolicy(mPkg, new NotificationManager.Policy(0, 0, 0), false);
         assertThat(mBinderService.getAutomaticZenRules()).hasSize(1);
         Map.Entry<String, AutomaticZenRule> rule = getOnlyElement(
                 mBinderService.getAutomaticZenRules().entrySet());
@@ -14439,7 +14530,7 @@
         assertThat(mBinderService.getAutomaticZenRules()).isEmpty();
 
         // Create an implicit zen rule by calling setNotificationPolicy from an app.
-        mBinderService.setNotificationPolicy(PKG, new NotificationManager.Policy(0, 0, 0), false);
+        mBinderService.setNotificationPolicy(mPkg, new NotificationManager.Policy(0, 0, 0), false);
         assertThat(mBinderService.getAutomaticZenRules()).hasSize(1);
         Map.Entry<String, AutomaticZenRule> rule = getOnlyElement(
                 mBinderService.getAutomaticZenRules().entrySet());
@@ -14483,7 +14574,7 @@
 
         assertThat(n.flags & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isGreaterThan(0);
 
-        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+        mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
 
         assertThat(n.flags & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isEqualTo(0);
     }
@@ -14510,12 +14601,12 @@
         waitForIdle();
 
         // Notifications should not be active anymore.
-        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
         assertThat(notifications).isEmpty();
         assertEquals(0, mService.getNotificationRecordCount());
         // Ensure cancel event is logged.
         verify(mAppOpsManager).noteOpNoThrow(
-                AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, PKG, null, null);
+                AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, mPkg, null, null);
     }
 
     @Test
@@ -14538,7 +14629,7 @@
         waitForIdle();
 
         // Notifications should not be active anymore.
-        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
         assertThat(notifications).isEmpty();
         assertEquals(0, mService.getNotificationRecordCount());
         // Ensure cancel event is not logged.
@@ -14569,7 +14660,7 @@
         waitForIdle();
 
         // Notifications should not be active anymore.
-        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
         assertThat(notifications).isEmpty();
         assertEquals(0, mService.getNotificationRecordCount());
         // Ensure cancel event is not logged due to flag being disabled.
@@ -14599,12 +14690,12 @@
         waitForIdle();
 
         // Notifications should not be active anymore.
-        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
         assertThat(notifications).isEmpty();
         assertEquals(0, mService.getNotificationRecordCount());
         // Ensure cancel event is logged.
         verify(mAppOpsManager).noteOpNoThrow(
-                AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, PKG, null, null);
+                AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, mPkg, null, null);
     }
 
     @Test
@@ -14626,7 +14717,7 @@
         waitForIdle();
 
         // Notifications should not be active anymore.
-        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
         assertThat(notifications).isEmpty();
         assertEquals(0, mService.getNotificationRecordCount());
         // Ensure cancel event is not logged.
@@ -14656,7 +14747,7 @@
         waitForIdle();
 
         // Notifications should not be active anymore.
-        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+        StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
         assertThat(notifications).isEmpty();
         assertEquals(0, mService.getNotificationRecordCount());
         // Ensure cancel event is not logged due to flag being disabled.
@@ -14687,20 +14778,20 @@
         ICallNotificationEventCallback listener = mock(
                 ICallNotificationEventCallback.class);
         when(listener.asBinder()).thenReturn(mock(IBinder.class));
-        mBinderService.registerCallNotificationEventListener(PKG, UserHandle.CURRENT, listener);
+        mBinderService.registerCallNotificationEventListener(mPkg, UserHandle.CURRENT, listener);
         waitForIdle();
 
         final UserHandle userHandle = UserHandle.getUserHandleForUid(mUid);
-        final NotificationRecord r = createAndPostCallStyleNotification(PKG, userHandle,
+        final NotificationRecord r = createAndPostCallStyleNotification(mPkg, userHandle,
                 "testCallNotificationListener_NotifiedOnPostCallStyle");
 
-        verify(listener, times(1)).onCallNotificationPosted(PKG, userHandle);
+        verify(listener, times(1)).onCallNotificationPosted(mPkg, userHandle);
 
-        mBinderService.cancelNotificationWithTag(PKG, PKG, r.getSbn().getTag(), r.getSbn().getId(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(), r.getSbn().getId(),
                 r.getSbn().getUserId());
         waitForIdle();
 
-        verify(listener, times(1)).onCallNotificationRemoved(PKG, userHandle);
+        verify(listener, times(1)).onCallNotificationRemoved(mPkg, userHandle);
     }
 
     @Test
@@ -14709,7 +14800,7 @@
         ICallNotificationEventCallback listener = mock(
                 ICallNotificationEventCallback.class);
         when(listener.asBinder()).thenReturn(mock(IBinder.class));
-        mBinderService.registerCallNotificationEventListener(PKG,
+        mBinderService.registerCallNotificationEventListener(mPkg,
                 UserHandle.getUserHandleForUid(mUid), listener);
         waitForIdle();
 
@@ -14720,7 +14811,7 @@
 
         verify(listener, never()).onCallNotificationPosted(anyString(), any());
 
-        mBinderService.cancelNotificationWithTag(PKG, PKG, r.getSbn().getTag(), r.getSbn().getId(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(), r.getSbn().getId(),
                 r.getSbn().getUserId());
         waitForIdle();
 
@@ -14734,20 +14825,20 @@
         ICallNotificationEventCallback listener = mock(
                 ICallNotificationEventCallback.class);
         when(listener.asBinder()).thenReturn(mock(IBinder.class));
-        mBinderService.registerCallNotificationEventListener(PKG, UserHandle.ALL, listener);
+        mBinderService.registerCallNotificationEventListener(mPkg, UserHandle.ALL, listener);
         waitForIdle();
 
         final UserHandle otherUser = UserHandle.of(2);
-        final NotificationRecord r = createAndPostCallStyleNotification(PKG,
+        final NotificationRecord r = createAndPostCallStyleNotification(mPkg,
                 otherUser, "testCallNotificationListener_registerForUserAll_notifiedOnAnyUserId");
 
-        verify(listener, times(1)).onCallNotificationPosted(PKG, otherUser);
+        verify(listener, times(1)).onCallNotificationPosted(mPkg, otherUser);
 
-        mBinderService.cancelNotificationWithTag(PKG, PKG, r.getSbn().getTag(), r.getSbn().getId(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(), r.getSbn().getId(),
                 r.getSbn().getUserId());
         waitForIdle();
 
-        verify(listener, times(1)).onCallNotificationRemoved(PKG, otherUser);
+        verify(listener, times(1)).onCallNotificationRemoved(mPkg, otherUser);
     }
 
     @Test
@@ -14760,19 +14851,175 @@
         mBinderService.registerCallNotificationEventListener(packageName, UserHandle.ALL, listener);
         waitForIdle();
 
-        final NotificationRecord r = createAndPostCallStyleNotification(PKG,
+        final NotificationRecord r = createAndPostCallStyleNotification(mPkg,
                 UserHandle.of(mUserId),
                 "testCallNotificationListener_differentPackage_notNotified");
 
         verify(listener, never()).onCallNotificationPosted(anyString(), any());
 
-        mBinderService.cancelNotificationWithTag(PKG, PKG, r.getSbn().getTag(), r.getSbn().getId(),
+        mBinderService.cancelNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(), r.getSbn().getId(),
                 r.getSbn().getUserId());
         waitForIdle();
 
         verify(listener, never()).onCallNotificationRemoved(anyString(), any());
     }
 
+    @Test
+    @EnableFlags(FLAG_UPDATE_RANKING_TIME)
+    public void rankingTime_newNotification_noisy_matchesSbn() throws Exception {
+        NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel, mUserId);
+
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
+                nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
+        waitForIdle();
+
+        NotificationRecord posted = mService.mNotificationList.get(0);
+        long originalPostTime = posted.getSbn().getPostTime();
+        assertThat(posted.getRankingTimeMs()).isEqualTo(originalPostTime);
+    }
+
+    @Test
+    @EnableFlags(FLAG_UPDATE_RANKING_TIME)
+    public void rankingTime_newNotification_silent_matchesSbn() throws Exception {
+        NotificationChannel low = new NotificationChannel("low", "low", IMPORTANCE_LOW);
+        NotificationRecord nr = generateNotificationRecord(low, mUserId);
+
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
+                nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
+        waitForIdle();
+
+        NotificationRecord posted = mService.mNotificationList.get(0);
+        long originalPostTime = posted.getSbn().getPostTime();
+        assertThat(posted.getRankingTimeMs()).isEqualTo(originalPostTime);
+    }
+
+    @Test
+    @EnableFlags(FLAG_UPDATE_RANKING_TIME)
+    public void rankingTime_updatedNotification_silentSameText_originalPostTime() throws Exception {
+        NotificationChannel low = new NotificationChannel("low", "low", IMPORTANCE_LOW);
+        NotificationRecord nr = generateNotificationRecord(low, mUserId);
+
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
+                nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
+        waitForIdle();
+        NotificationRecord posted = mService.mNotificationList.get(0);
+        long originalPostTime = posted.getSbn().getPostTime();
+        assertThat(posted.getRankingTimeMs()).isEqualTo(originalPostTime);
+
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
+                nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
+        waitForIdle();
+        assertThat(mService.mNotificationList.get(0).getRankingTimeMs())
+                .isEqualTo(originalPostTime);
+    }
+
+    @Test
+    @EnableFlags(FLAG_UPDATE_RANKING_TIME)
+    public void rankingTime_updatedNotification_silentNewText_newPostTime() throws Exception {
+        NotificationChannel low = new NotificationChannel("low", "low", IMPORTANCE_LOW);
+        NotificationRecord nr = generateNotificationRecord(low, 0, mUserId);
+
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
+                nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
+        waitForIdle();
+        NotificationRecord posted = mService.mNotificationList.get(0);
+        long originalPostTime = posted.getSbn().getPostTime();
+        assertThat(posted.getRankingTimeMs()).isEqualTo(originalPostTime);
+
+        NotificationRecord nrUpdate = generateNotificationRecord(low, 0, mUserId, "bar");
+        // no attention helper mocked behavior needed because this does not make noise
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
+                nrUpdate.getSbn().getId(), nrUpdate.getSbn().getNotification(),
+                nrUpdate.getSbn().getUserId());
+        waitForIdle();
+
+        posted = mService.mNotificationList.get(0);
+        assertThat(posted.getRankingTimeMs()).isGreaterThan(originalPostTime);
+        assertThat(posted.getRankingTimeMs()).isEqualTo(posted.getSbn().getPostTime());
+    }
+
+    @Test
+    @EnableFlags(FLAG_UPDATE_RANKING_TIME)
+    public void rankingTime_updatedNotification_noisySameText_newPostTime() throws Exception {
+        NotificationChannel low = new NotificationChannel("low", "low", IMPORTANCE_LOW);
+        NotificationRecord nr = generateNotificationRecord(low, mUserId);
+
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
+                nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
+        waitForIdle();
+        NotificationRecord posted = mService.mNotificationList.get(0);
+        long originalPostTime = posted.getSbn().getPostTime();
+        assertThat(posted.getRankingTimeMs()).isEqualTo(originalPostTime);
+
+        NotificationRecord nrUpdate = generateNotificationRecord(mTestNotificationChannel, mUserId);
+        when(mAttentionHelper.buzzBeepBlinkLocked(any(), any())).thenAnswer(new Answer<Object>() {
+            public Object answer(InvocationOnMock invocation) {
+                Object[] args = invocation.getArguments();
+                ((NotificationRecord) args[0]).resetRankingTime();
+                return 2; // beep
+            }
+        });
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
+                nrUpdate.getSbn().getId(), nrUpdate.getSbn().getNotification(),
+                nrUpdate.getSbn().getUserId());
+        waitForIdle();
+        posted = mService.mNotificationList.get(0);
+        assertThat(posted.getRankingTimeMs()).isGreaterThan(originalPostTime);
+        assertThat(posted.getRankingTimeMs()).isEqualTo(posted.getSbn().getPostTime());
+    }
+
+    @Test
+    @EnableFlags(android.app.Flags.FLAG_RESTRICT_AUDIO_ATTRIBUTES_MEDIA)
+    public void testRestrictAudioAttributes_listenersGetCorrectAttributes() throws Exception {
+        NotificationChannel sound = new NotificationChannel("a", "a", IMPORTANCE_DEFAULT);
+        sound.setSound(Uri.EMPTY, new AudioAttributes.Builder().setUsage(USAGE_MEDIA).build());
+        mBinderService.createNotificationChannels(mPkg, new ParceledListSlice(
+                Arrays.asList(sound)));
+
+        Notification n = new Notification.Builder(mContext, "a")
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 9, null, mUid, 0,
+                n, UserHandle.getUserHandleForUid(mUid), null, 0);
+
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
+                sbn.getId(), sbn.getNotification(), sbn.getUserId());
+        waitForIdle();
+
+        ArgumentCaptor<NotificationRecord> captor =
+                ArgumentCaptor.forClass(NotificationRecord.class);
+        verify(mListeners, times(1)).prepareNotifyPostedLocked(
+                captor.capture(), any(), anyBoolean());
+
+        assertThat(captor.getValue().getChannel().getAudioAttributes().getUsage())
+                .isEqualTo(USAGE_NOTIFICATION);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ALL_NOTIFS_NEED_TTL)
+    public void testFixNotification_missingTtl() throws Exception {
+        Notification n = new Notification.Builder(mContext, mTestNotificationChannel.getId())
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .build();
+
+        mService.fixNotification(n, mPkg, "tag", 0, mUserId, mUid, NOT_FOREGROUND_SERVICE, true);
+
+        assertThat(n.getTimeoutAfter()).isEqualTo(NOTIFICATION_TTL);
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ALL_NOTIFS_NEED_TTL)
+    public void testFixNotification_doesNotOverwriteTtl() throws Exception {
+        Notification n = new Notification.Builder(mContext, mTestNotificationChannel.getId())
+                .setSmallIcon(android.R.drawable.sym_def_app_icon)
+                .setTimeoutAfter(20)
+                .build();
+
+        mService.fixNotification(n, mPkg, "tag", 0, mUserId, mUid, NOT_FOREGROUND_SERVICE, true);
+
+        assertThat(n.getTimeoutAfter()).isEqualTo(20);
+    }
+
     private NotificationRecord createAndPostCallStyleNotification(String packageName,
             UserHandle userHandle, String testName) throws Exception {
         Person person = new Person.Builder().setName("caller").build();
@@ -14797,16 +15044,16 @@
 
     private NotificationRecord createAndPostNotification(Notification.Builder nb, String testName)
             throws RemoteException {
-        StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, testName, mUid, 0,
+        StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1, testName, mUid, 0,
                 nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
         NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
 
-        mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+        mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
                 nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
         waitForIdle();
 
         return mService.findNotificationLocked(
-                PKG, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
+                mPkg, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
     }
 
     private static <T extends Parcelable> T parcelAndUnparcel(T source,
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTimeComparatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTimeComparatorTest.java
new file mode 100644
index 0000000..c39961e
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTimeComparatorTest.java
@@ -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.server.notification;
+
+import static android.app.Notification.CATEGORY_MESSAGE;
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
+import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.PendingIntent;
+import android.app.Person;
+import android.graphics.Color;
+import android.media.session.MediaSession;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.service.notification.StatusBarNotification;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+import com.android.server.UiServiceTestCase;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class NotificationTimeComparatorTest extends UiServiceTestCase {
+
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT);
+
+    @Test
+    @EnableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME})
+    public void testCompare() {
+        NotificationRecord one = mock(NotificationRecord.class);
+        when(one.getRankingTimeMs()).thenReturn(1L);
+
+        NotificationRecord five = mock(NotificationRecord.class);
+        when(five.getRankingTimeMs()).thenReturn(5L);
+
+        NotificationRecord ten = mock(NotificationRecord.class);
+        when(ten.getRankingTimeMs()).thenReturn(10L);
+
+        List<NotificationRecord> expected = new ArrayList<>();
+        expected.add(ten);
+        expected.add(five);
+        expected.add(one);
+
+        List<NotificationRecord> actual = new ArrayList<>();
+        actual.addAll(expected);
+        Collections.shuffle(actual);
+
+        Collections.sort(actual, new NotificationTimeComparator());
+
+        assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+    }
+}
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 cee6cdb..aeeca2ae 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -173,11 +173,8 @@
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class PreferencesHelperTest extends UiServiceTestCase {
-    private static final int UID_N_MR1 = 0;
     private static final int UID_HEADLESS = 1000000;
     private static final UserHandle USER = UserHandle.of(0);
-    private static final int UID_O = 1111;
-    private static final int UID_P = 2222;
     private static final String SYSTEM_PKG = "android";
     private static final int SYSTEM_UID = 1000;
     private static final UserHandle USER2 = UserHandle.of(10);
@@ -1102,18 +1099,15 @@
                 + "<package name=\"com.example.o\" show_badge=\"true\" "
                 + "app_user_locked_fields=\"0\" sent_invalid_msg=\"false\" "
                 + "sent_valid_msg=\"false\" user_demote_msg_app=\"false\" sent_valid_bubble"
-                + "=\"false\" uid=\"1111\">\n"
+                + "=\"false\" uid=\"10002\">\n"
                 + "<channel id=\"id\" name=\"name\" importance=\"2\" "
                 + "sound=\"content://settings/system/notification_sound\" usage=\"5\" "
                 + "content_type=\"4\" flags=\"0\" show_badge=\"true\" orig_imp=\"2\" />\n"
                 + "</package>\n"
-                + "<package name=\"com.example.p\" show_badge=\"true\" "
-                + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
-                + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" uid=\"2222\" />\n"
                 + "<package name=\"com.example.n_mr1\" show_badge=\"true\" "
                 + "app_user_locked_fields=\"0\" sent_invalid_msg=\"false\" "
                 + "sent_valid_msg=\"false\" user_demote_msg_app=\"false\" sent_valid_bubble"
-                + "=\"false\" uid=\"0\">\n"
+                + "=\"false\" uid=\"10001\">\n"
                 + "<channelGroup id=\"1\" name=\"bye\" blocked=\"false\" locked=\"0\" />\n"
                 + "<channelGroup id=\"2\" name=\"hello\" blocked=\"false\" locked=\"0\" />\n"
                 + "<channel id=\"id1\" name=\"name1\" importance=\"4\" show_badge=\"true\" "
@@ -1129,6 +1123,9 @@
                 + "sound=\"content://settings/system/notification_sound\" usage=\"5\" "
                 + "content_type=\"4\" flags=\"0\" show_badge=\"true\" />\n"
                 + "</package>\n"
+                + "<package name=\"com.example.p\" show_badge=\"true\" "
+                + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
+                + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" uid=\"10003\" />\n"
                 + "</ranking>";
         assertThat(baos.toString()).contains(expected);
     }
@@ -1194,10 +1191,6 @@
                 + "content_type=\"4\" flags=\"0\" show_badge=\"true\" orig_imp=\"2\" />\n"
                 + "</package>\n"
                 // Importance default because on in permission helper
-                + "<package name=\"com.example.p\" importance=\"3\" show_badge=\"true\" "
-                + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
-                + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" />\n"
-                // Importance default because on in permission helper
                 + "<package name=\"com.example.n_mr1\" importance=\"3\" show_badge=\"true\" "
                 + "app_user_locked_fields=\"0\" sent_invalid_msg=\"false\" "
                 + "sent_valid_msg=\"false\" user_demote_msg_app=\"false\" sent_valid_bubble"
@@ -1217,6 +1210,10 @@
                 + "sound=\"content://settings/system/notification_sound\" usage=\"5\" "
                 + "content_type=\"4\" flags=\"0\" show_badge=\"true\" />\n"
                 + "</package>\n"
+                // Importance default because on in permission helper
+                + "<package name=\"com.example.p\" importance=\"3\" show_badge=\"true\" "
+                + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
+                + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" />\n"
                 // Packages that exist solely in permissionhelper
                 + "<package name=\"first\" importance=\"3\" />\n"
                 + "<package name=\"third\" importance=\"0\" />\n"
@@ -1280,12 +1277,8 @@
                 + "sound=\"content://settings/system/notification_sound\" usage=\"5\" "
                 + "content_type=\"4\" flags=\"0\" show_badge=\"true\" orig_imp=\"2\" />\n"
                 + "</package>\n"
-                // Importance default because on in permission helper
-                + "<package name=\"com.example.p\" importance=\"3\" show_badge=\"true\" "
-                + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
-                + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" />\n"
-                // Importance missing because missing from permission helper
-                + "<package name=\"com.example.n_mr1\" show_badge=\"true\" "
+                // Importance 0 because missing from permission helper
+                + "<package name=\"com.example.n_mr1\" importance=\"0\" show_badge=\"true\" "
                 + "app_user_locked_fields=\"0\" sent_invalid_msg=\"false\" "
                 + "sent_valid_msg=\"false\" user_demote_msg_app=\"false\" sent_valid_bubble"
                 + "=\"false\">\n"
@@ -1304,6 +1297,10 @@
                 + "sound=\"content://settings/system/notification_sound\" usage=\"5\" "
                 + "content_type=\"4\" flags=\"0\" show_badge=\"true\" />\n"
                 + "</package>\n"
+                // Importance default because on in permission helper
+                + "<package name=\"com.example.p\" importance=\"3\" show_badge=\"true\" "
+                + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
+                + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" />\n"
                 + "</ranking>";
         assertThat(baos.toString()).contains(expected);
     }
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 d2c6028..ad420f6 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -18,6 +18,8 @@
 import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
 import static android.app.NotificationManager.IMPORTANCE_LOW;
 
+import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
+import static com.google.common.truth.Truth.assertThat;
 import static junit.framework.TestCase.assertEquals;
 
 import static org.junit.Assert.assertTrue;
@@ -27,6 +29,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import android.app.Flags;
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
@@ -42,6 +45,9 @@
 import android.os.Build;
 import android.os.UserHandle;
 import android.os.Vibrator;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.service.notification.StatusBarNotification;
 import android.testing.TestableContentResolver;
 
@@ -52,24 +58,23 @@
 import com.android.server.UiServiceTestCase;
 
 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.Collections;
+import java.util.List;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class RankingHelperTest extends UiServiceTestCase {
-    private static final String PKG = "com.android.server.notification";
-    private static final int UID = 0;
-    private static final UserHandle USER = UserHandle.of(0);
-    private static final String UPDATED_PKG = "updatedPkg";
+    private static final String UPDATED_PKG = "updatedmPkg";
     private static final int UID2 = 1111;
     private static final String SYSTEM_PKG = "android";
     private static final int SYSTEM_UID= 1000;
-    private static final UserHandle USER2 = UserHandle.of(10);
     private static final String TEST_CHANNEL_ID = "test_channel_id";
     private static final String TEST_AUTHORITY = "test";
     private static final Uri SOUND_URI =
@@ -98,28 +103,32 @@
     private NotificationRecord mRecordNoGroup;
     private NotificationRecord mRecordNoGroup2;
     private NotificationRecord mRecordNoGroupSortA;
+    private NotificationRecord mRecentlyIntrusive;
+    private NotificationRecord mNewest;
     private RankingHelper mHelper;
-    private AudioAttributes mAudioAttributes;
+
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT);
 
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        UserHandle user = UserHandle.ALL;
+        UserHandle mUser = UserHandle.ALL;
 
         final ApplicationInfo legacy = new ApplicationInfo();
         legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
         final ApplicationInfo upgrade = new ApplicationInfo();
         upgrade.targetSdkVersion = Build.VERSION_CODES.O;
-        when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(legacy);
+        when(mPm.getApplicationInfoAsUser(eq(mPkg), anyInt(), anyInt())).thenReturn(legacy);
         when(mPm.getApplicationInfoAsUser(eq(UPDATED_PKG), anyInt(), anyInt())).thenReturn(upgrade);
         when(mPm.getApplicationInfoAsUser(eq(SYSTEM_PKG), anyInt(), anyInt())).thenReturn(upgrade);
-        when(mPm.getPackageUidAsUser(eq(PKG), anyInt())).thenReturn(UID);
+        when(mPm.getPackageUidAsUser(eq(mPkg), anyInt())).thenReturn(mUid);
         when(mPm.getPackageUidAsUser(eq(UPDATED_PKG), anyInt())).thenReturn(UID2);
         when(mPm.getPackageUidAsUser(eq(SYSTEM_PKG), anyInt())).thenReturn(SYSTEM_UID);
         PackageInfo info = mock(PackageInfo.class);
         info.signatures = new Signature[] {mock(Signature.class)};
         when(mPm.getPackageInfoAsUser(eq(SYSTEM_PKG), anyInt(), anyInt())).thenReturn(info);
-        when(mPm.getPackageInfoAsUser(eq(PKG), anyInt(), anyInt()))
+        when(mPm.getPackageInfoAsUser(eq(mPkg), anyInt(), anyInt()))
                 .thenReturn(mock(PackageInfo.class));
         when(mContext.getResources()).thenReturn(
                 InstrumentationRegistry.getContext().getResources());
@@ -155,7 +164,7 @@
                 .setWhen(1205)
                 .build();
         mRecordGroupGSortA = new NotificationRecord(mContext, new StatusBarNotification(
-                PKG, PKG, 1, null, 0, 0, mNotiGroupGSortA, user,
+                mPkg, mPkg, 1, null, 0, 0, mNotiGroupGSortA, mUser,
                 null, System.currentTimeMillis()), getLowChannel());
 
         mNotiGroupGSortB = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -165,7 +174,7 @@
                 .setWhen(1200)
                 .build();
         mRecordGroupGSortB = new NotificationRecord(mContext, new StatusBarNotification(
-                PKG, PKG, 1, null, 0, 0, mNotiGroupGSortB, user,
+                mPkg, mPkg, 1, null, 0, 0, mNotiGroupGSortB, mUser,
                 null, System.currentTimeMillis()), getLowChannel());
 
         mNotiNoGroup = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -173,7 +182,7 @@
                 .setWhen(1201)
                 .build();
         mRecordNoGroup = new NotificationRecord(mContext, new StatusBarNotification(
-                PKG, PKG, 1, null, 0, 0, mNotiNoGroup, user,
+                mPkg, mPkg, 1, null, 0, 0, mNotiNoGroup, mUser,
                 null, System.currentTimeMillis()), getLowChannel());
 
         mNotiNoGroup2 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -181,7 +190,7 @@
                 .setWhen(1202)
                 .build();
         mRecordNoGroup2 = new NotificationRecord(mContext, new StatusBarNotification(
-                PKG, PKG, 1, null, 0, 0, mNotiNoGroup2, user,
+                mPkg, mPkg, 1, null, 0, 0, mNotiNoGroup2, mUser,
                 null, System.currentTimeMillis()), getLowChannel());
 
         mNotiNoGroupSortA = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -190,14 +199,20 @@
                 .setSortKey("A")
                 .build();
         mRecordNoGroupSortA = new NotificationRecord(mContext, new StatusBarNotification(
-                PKG, PKG, 1, null, 0, 0, mNotiNoGroupSortA, user,
+                mPkg, mPkg, 1, null, 0, 0, mNotiNoGroupSortA, mUser,
                 null, System.currentTimeMillis()), getLowChannel());
 
-        mAudioAttributes = new AudioAttributes.Builder()
-                .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
-                .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
-                .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
+        Notification n = new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                .setContentTitle("D")
                 .build();
+        mRecentlyIntrusive = new NotificationRecord(mContext, new StatusBarNotification(
+                mPkg, mPkg, 1, null, 0, 0, n, mUser,
+                null, 100), getDefaultChannel());
+        mRecentlyIntrusive.setRecentlyIntrusive(true);
+
+        mNewest = new NotificationRecord(mContext, new StatusBarNotification(
+                mPkg, mPkg, 2, null, 0, 0, n, mUser,
+                null, 10000), getDefaultChannel());
     }
 
     private NotificationChannel getLowChannel() {
@@ -303,13 +318,13 @@
                 .setGroupSummary(true)
                 .build();
         NotificationRecord lowSummary = new NotificationRecord(mContext, new StatusBarNotification(
-                PKG, PKG, 1, "summary", 0, 0, lowSummaryN, USER,
+                mPkg, mPkg, 1, "summary", 0, 0, lowSummaryN, mUser,
                 null, System.currentTimeMillis()), getLowChannel());
         notificationList.add(lowSummary);
 
         Notification lowN = new Notification.Builder(mContext, "").build();
         NotificationRecord low = new NotificationRecord(mContext, new StatusBarNotification(
-                PKG, PKG, 1, "low", 0, 0, lowN, USER,
+                mPkg, mPkg, 1, "low", 0, 0, lowN, mUser,
                 null, System.currentTimeMillis()), getLowChannel());
         low.setContactAffinity(0.5f);
         notificationList.add(low);
@@ -319,7 +334,7 @@
                 .setGroupSummary(false)
                 .build();
         NotificationRecord highChild = new NotificationRecord(mContext, new StatusBarNotification(
-                PKG, PKG, 1, "child", 0, 0, highChildN, USER,
+                mPkg, mPkg, 1, "child", 0, 0, highChildN, mUser,
                 null, System.currentTimeMillis()), getDefaultChannel());
         notificationList.add(highChild);
 
@@ -329,4 +344,187 @@
         assertEquals(highChild, notificationList.get(1));
         assertEquals(low, notificationList.get(2));
     }
+
+    @Test
+    @DisableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME})
+    public void testSortByIntrusivenessNotRecency() {
+        ArrayList<NotificationRecord> expected = new ArrayList<>();
+        expected.add(mRecentlyIntrusive);
+        expected.add(mNewest);
+
+        ArrayList<NotificationRecord> actual = new ArrayList<>();
+        actual.addAll(expected);
+        Collections.shuffle(actual);
+
+        mHelper.sort(actual);
+        assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+    }
+
+    @Test
+    @EnableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME})
+    public void testSortByRecencyNotIntrusiveness() {
+        ArrayList<NotificationRecord> expected = new ArrayList<>();
+        expected.add(mNewest);
+        expected.add(mRecentlyIntrusive);
+
+        ArrayList<NotificationRecord> actual = new ArrayList<>();
+        actual.addAll(expected);
+        Collections.shuffle(actual);
+
+        mHelper.sort(actual);
+        assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+    }
+
+    @Test
+    @EnableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME, Flags.FLAG_UPDATE_RANKING_TIME})
+    public void testSort_oldWhenChildren_unspecifiedSummary() {
+        NotificationRecord child1 = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                    mPkg, mPkg, 1, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                            .setGroup("G")
+                            .setWhen(1200)
+                            .build(),
+                        mUser, null, System.currentTimeMillis()), getLowChannel());
+        NotificationRecord child2 = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                        mPkg, mPkg, 2, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                                .setGroup("G")
+                                .setWhen(1300)
+                                .build(),
+                        mUser, null, System.currentTimeMillis()), getLowChannel());
+        NotificationRecord summary = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                        mPkg, mPkg, 3, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                                .setGroup("G")
+                                .setGroupSummary(true)
+                                .build(),
+                        mUser, null, System.currentTimeMillis()), getLowChannel());
+
+        // in time slightly before the children, but much earlier than the summary.
+        // will only be sorted first if the summary is not the group proxy for group G.
+        NotificationRecord unrelated = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                        mPkg, mPkg, 11, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                                .setWhen(1500)
+                                .build(),
+                        mUser, null, System.currentTimeMillis()), getLowChannel());
+
+        ArrayList<NotificationRecord> expected = new ArrayList<>();
+        expected.add(unrelated);
+        expected.add(summary);
+        expected.add(child2);
+        expected.add(child1);
+
+        ArrayList<NotificationRecord> actual = new ArrayList<>();
+        actual.addAll(expected);
+        Collections.shuffle(actual);
+
+        mHelper.sort(actual);
+        assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+    }
+
+    @Test
+    @EnableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME, Flags.FLAG_UPDATE_RANKING_TIME})
+    public void testSort_oldChildren_unspecifiedSummary() {
+        NotificationRecord child1 = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                        mPkg, mPkg, 1, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                                .setGroup("G")
+                                .build(),
+                        mUser, null, 1200), getLowChannel());
+        NotificationRecord child2 = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                        mPkg, mPkg, 2, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                                .setGroup("G")
+                                .build(),
+                        mUser, null, 1300), getLowChannel());
+        NotificationRecord summary = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                        mPkg, mPkg, 3, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                                .setGroup("G")
+                                .setGroupSummary(true)
+                                .build(),
+                        mUser, null, System.currentTimeMillis()), getLowChannel());
+
+        // in time slightly before the children, but much earlier than the summary.
+        // will only be sorted first if the summary is not the group proxy for group G.
+        NotificationRecord unrelated = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                        mPkg, mPkg, 11, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                                .setWhen(1500)
+                                .build(),
+                        mUser, null, System.currentTimeMillis()), getLowChannel());
+
+        ArrayList<NotificationRecord> expected = new ArrayList<>();
+        expected.add(unrelated);
+        expected.add(summary);
+        expected.add(child2);
+        expected.add(child1);
+
+        ArrayList<NotificationRecord> actual = new ArrayList<>();
+        actual.addAll(expected);
+        Collections.shuffle(actual);
+
+        mHelper.sort(actual);
+        assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+    }
+
+    @Test
+    @EnableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME, Flags.FLAG_UPDATE_RANKING_TIME})
+    public void testSort_oldChildren_oldSummary() {
+        NotificationRecord child1 = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                        mPkg, mPkg, 1, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                                .setGroup("G")
+                                .build(),
+                        mUser, null, 1200), getLowChannel());
+        NotificationRecord child2 = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                        mPkg, mPkg, 2, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                                .setGroup("G")
+                                .build(),
+                        mUser, null, 1300), getLowChannel());
+        NotificationRecord summary = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                        mPkg, mPkg, 3, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                                .setGroup("G")
+                                .setGroupSummary(true)
+                                .setWhen(1600)
+                                .build(),
+                        mUser, null, System.currentTimeMillis()), getLowChannel());
+
+        // in time slightly before the children, but much earlier than the summary.
+        // will only be sorted first if the summary is not the group proxy for group G.
+        NotificationRecord unrelated = new NotificationRecord(mContext,
+                new StatusBarNotification(
+                        mPkg, mPkg, 11, null, 0, 0,
+                        new Notification.Builder(mContext, TEST_CHANNEL_ID)
+                                .setWhen(1500)
+                                .build(),
+                        mUser, null, System.currentTimeMillis()), getLowChannel());
+
+        ArrayList<NotificationRecord> expected = new ArrayList<>();
+        expected.add(summary);
+        expected.add(child2);
+        expected.add(child1);
+        expected.add(unrelated);
+
+        ArrayList<NotificationRecord> actual = new ArrayList<>();
+        actual.addAll(expected);
+        Collections.shuffle(actual);
+
+        mHelper.sort(actual);
+        assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+    }
 }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java
index 70910b1..c1bb3e7 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java
@@ -164,7 +164,7 @@
                     mock(DevicePolicyManagerInternal.class), mock(IUriGrantsManager.class),
                     mock(UriGrantsManagerInternal.class),
                     mock(AppOpsManager.class), mUm, mock(NotificationHistoryManager.class),
-                    mock(StatsManager.class), mock(TelephonyManager.class),
+                    mock(StatsManager.class),
                     mock(ActivityManagerInternal.class),
                     mock(MultiRateLimiter.class), mock(PermissionHelper.class),
                     mock(UsageStatsManagerInternal.class), mock(TelecomManager.class),
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/SystemZenRulesTest.java b/services/tests/uiservicestests/src/com/android/server/notification/SystemZenRulesTest.java
new file mode 100644
index 0000000..e782461
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/notification/SystemZenRulesTest.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.notification;
+
+import static android.service.notification.SystemZenRules.getTriggerDescriptionForScheduleTime;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.AutomaticZenRule;
+import android.content.res.Configuration;
+import android.os.LocaleList;
+import android.service.notification.SystemZenRules;
+import android.service.notification.ZenModeConfig;
+import android.service.notification.ZenModeConfig.EventInfo;
+import android.service.notification.ZenModeConfig.ScheduleInfo;
+import android.service.notification.ZenModeConfig.ZenRule;
+
+import com.android.internal.R;
+import com.android.server.UiServiceTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Calendar;
+import java.util.Locale;
+
+public class SystemZenRulesTest extends UiServiceTestCase {
+
+    private static final ScheduleInfo SCHEDULE_INFO;
+    private static final EventInfo EVENT_INFO;
+
+    static {
+        SCHEDULE_INFO = new ScheduleInfo();
+        SCHEDULE_INFO.days = new int[] { Calendar.WEDNESDAY };
+        SCHEDULE_INFO.startHour = 8;
+        SCHEDULE_INFO.endHour = 9;
+        EVENT_INFO = new EventInfo();
+        EVENT_INFO.calendarId = 1L;
+        EVENT_INFO.calName = "myCalendar";
+    }
+
+    @Before
+    public void setUp() {
+        Configuration config = new Configuration();
+        config.setLocales(new LocaleList(Locale.US));
+        mContext.getOrCreateTestableResources().overrideConfiguration(config);
+        mContext.getOrCreateTestableResources().addOverride(
+                R.string.zen_mode_trigger_summary_range_symbol_combination, "%1$s-%2$s");
+        mContext.getOrCreateTestableResources().addOverride(
+                R.string.zen_mode_trigger_summary_divider_text, ",");
+    }
+
+    @Test
+    public void maybeUpgradeRules_oldSystemRules_upgraded() {
+        ZenModeConfig config = new ZenModeConfig();
+        ZenRule timeRule = new ZenRule();
+        timeRule.pkg = SystemZenRules.PACKAGE_ANDROID;
+        timeRule.conditionId = ZenModeConfig.toScheduleConditionId(SCHEDULE_INFO);
+        config.automaticRules.put("time", timeRule);
+        ZenRule calendarRule = new ZenRule();
+        calendarRule.pkg = SystemZenRules.PACKAGE_ANDROID;
+        calendarRule.conditionId = ZenModeConfig.toEventConditionId(EVENT_INFO);
+        config.automaticRules.put("calendar", calendarRule);
+
+        SystemZenRules.maybeUpgradeRules(mContext, config);
+
+        assertThat(timeRule.type).isEqualTo(AutomaticZenRule.TYPE_SCHEDULE_TIME);
+        assertThat(timeRule.triggerDescription).isNotEmpty();
+        assertThat(calendarRule.type).isEqualTo(AutomaticZenRule.TYPE_SCHEDULE_CALENDAR);
+        assertThat(timeRule.triggerDescription).isNotEmpty();
+    }
+
+    @Test
+    public void maybeUpgradeRules_newSystemRules_untouched() {
+        ZenModeConfig config = new ZenModeConfig();
+        ZenRule timeRule = new ZenRule();
+        timeRule.pkg = SystemZenRules.PACKAGE_ANDROID;
+        timeRule.type = AutomaticZenRule.TYPE_SCHEDULE_TIME;
+        timeRule.conditionId = ZenModeConfig.toScheduleConditionId(SCHEDULE_INFO);
+        config.automaticRules.put("time", timeRule);
+        ZenRule original = timeRule.copy();
+
+        SystemZenRules.maybeUpgradeRules(mContext, config);
+
+        assertThat(timeRule).isEqualTo(original);
+    }
+
+    @Test
+    public void maybeUpgradeRules_appOwnedRules_untouched() {
+        ZenModeConfig config = new ZenModeConfig();
+        ZenRule timeRule = new ZenRule();
+        timeRule.pkg = "some_other_package";
+        timeRule.type = AutomaticZenRule.TYPE_SCHEDULE_TIME;
+        timeRule.conditionId = ZenModeConfig.toScheduleConditionId(SCHEDULE_INFO);
+        config.automaticRules.put("time", timeRule);
+        ZenRule original = timeRule.copy();
+
+        SystemZenRules.maybeUpgradeRules(mContext, config);
+
+        assertThat(timeRule).isEqualTo(original);
+    }
+
+    @Test
+    public void getTriggerDescriptionForScheduleTime_noOrSingleDays() {
+        // Test various cases for grouping and not-grouping of days.
+        ScheduleInfo scheduleInfo = new ScheduleInfo();
+        scheduleInfo.startHour = 10;
+        scheduleInfo.endHour = 16;
+
+        // No days
+        scheduleInfo.days = new int[]{};
+        assertThat(getTriggerDescriptionForScheduleTime(mContext, scheduleInfo)).isNull();
+
+        // A single day at the beginning of the week
+        scheduleInfo.days = new int[]{Calendar.SUNDAY};
+        assertThat(getTriggerDescriptionForScheduleTime(mContext, scheduleInfo))
+                .isEqualTo("Sun,10:00 AM-4:00 PM");
+
+        // A single day in the middle of the week
+        scheduleInfo.days = new int[]{Calendar.THURSDAY};
+        assertThat(getTriggerDescriptionForScheduleTime(mContext, scheduleInfo))
+                .isEqualTo("Thu,10:00 AM-4:00 PM");
+
+        // A single day at the end of the week
+        scheduleInfo.days = new int[]{Calendar.SATURDAY};
+        assertThat(getTriggerDescriptionForScheduleTime(mContext, scheduleInfo))
+                .isEqualTo("Sat,10:00 AM-4:00 PM");
+    }
+
+    @Test
+    public void getTriggerDescriptionForScheduleTime_oneGroup() {
+        ScheduleInfo scheduleInfo = new ScheduleInfo();
+        scheduleInfo.startHour = 10;
+        scheduleInfo.endHour = 16;
+
+        // The whole week
+        scheduleInfo.days = new int[] {Calendar.SUNDAY, Calendar.MONDAY, Calendar.TUESDAY,
+                Calendar.WEDNESDAY, Calendar.THURSDAY, Calendar.FRIDAY, Calendar.SATURDAY};
+        assertThat(getTriggerDescriptionForScheduleTime(mContext, scheduleInfo))
+                .isEqualTo("Sun-Sat,10:00 AM-4:00 PM");
+
+        // Various cases of one big group
+        // Sunday through Thursday
+        scheduleInfo.days = new int[] {Calendar.SUNDAY, Calendar.MONDAY, Calendar.TUESDAY,
+                Calendar.WEDNESDAY, Calendar.THURSDAY};
+        assertThat(getTriggerDescriptionForScheduleTime(mContext, scheduleInfo))
+                .isEqualTo("Sun-Thu,10:00 AM-4:00 PM");
+
+        // Wednesday through Saturday
+        scheduleInfo.days = new int[] {Calendar.WEDNESDAY, Calendar.THURSDAY,
+                Calendar.FRIDAY, Calendar.SATURDAY};
+        assertThat(getTriggerDescriptionForScheduleTime(mContext, scheduleInfo))
+                .isEqualTo("Wed-Sat,10:00 AM-4:00 PM");
+
+        // Monday through Friday
+        scheduleInfo.days = new int[] {Calendar.MONDAY, Calendar.TUESDAY,
+                Calendar.WEDNESDAY, Calendar.THURSDAY, Calendar.FRIDAY};
+        assertThat(getTriggerDescriptionForScheduleTime(mContext, scheduleInfo))
+                .isEqualTo("Mon-Fri,10:00 AM-4:00 PM");
+    }
+
+    @Test
+    public void getTriggerDescriptionForScheduleTime_mixedDays() {
+        ScheduleInfo scheduleInfo = new ScheduleInfo();
+        scheduleInfo.startHour = 10;
+        scheduleInfo.endHour = 16;
+
+        // cases combining groups and single days scattered around
+        scheduleInfo.days = new int[] {Calendar.SUNDAY, Calendar.TUESDAY,
+                Calendar.WEDNESDAY, Calendar.THURSDAY, Calendar.SATURDAY};
+        assertThat(getTriggerDescriptionForScheduleTime(mContext, scheduleInfo))
+                .isEqualTo("Sun,Tue-Thu,Sat,10:00 AM-4:00 PM");
+
+        scheduleInfo.days = new int[] {Calendar.SUNDAY, Calendar.MONDAY, Calendar.TUESDAY,
+                Calendar.WEDNESDAY, Calendar.FRIDAY, Calendar.SATURDAY};
+        assertThat(getTriggerDescriptionForScheduleTime(mContext, scheduleInfo))
+                .isEqualTo("Sun-Wed,Fri-Sat,10:00 AM-4:00 PM");
+
+        scheduleInfo.days = new int[] {Calendar.MONDAY, Calendar.WEDNESDAY,
+                Calendar.FRIDAY, Calendar.SATURDAY};
+        assertThat(getTriggerDescriptionForScheduleTime(mContext, scheduleInfo))
+                .isEqualTo("Mon,Wed,Fri-Sat,10:00 AM-4:00 PM");
+    }
+}
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 c4d2460..3df52c7 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
@@ -136,6 +136,7 @@
 import android.provider.Settings.Global;
 import android.service.notification.Condition;
 import android.service.notification.DeviceEffectsApplier;
+import android.service.notification.SystemZenRules;
 import android.service.notification.ZenAdapters;
 import android.service.notification.ZenDeviceEffects;
 import android.service.notification.ZenModeConfig;
@@ -193,6 +194,7 @@
 import java.time.ZoneOffset;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
@@ -1087,6 +1089,11 @@
         mZenModeHelper.mConfig.manualRule.enabled = true;
 
         ZenModeConfig expected = mZenModeHelper.mConfig.copy();
+        if (Flags.modesUi()) {
+            // Reading the configuration will upgrade it, so for equality comparison also upgrade
+            // the expected value.
+            SystemZenRules.maybeUpgradeRules(mContext, expected);
+        }
 
         ByteArrayOutputStream baos = writeXmlAndPurge(null);
         TypedXmlPullParser parser = getParserForByteStream(baos);
@@ -1404,6 +1411,13 @@
         mZenModeHelper.readXml(parser, true, 11);
 
         ZenModeConfig actual = mZenModeHelper.mConfigs.get(10);
+        if (Flags.modesUi()) {
+            // Reading the configuration will upgrade it, so for equality comparison also upgrade
+            // the expected value.
+            SystemZenRules.maybeUpgradeRules(mContext, config10);
+            SystemZenRules.maybeUpgradeRules(mContext, config11);
+        }
+
         assertEquals(
                 "Config mismatch: current vs expected: "
                         + new ZenModeDiff.ConfigDiff(actual, config10), config10, actual);
@@ -1483,6 +1497,11 @@
         mZenModeHelper.mConfig.automaticRules = automaticRules;
 
         ZenModeConfig expected = mZenModeHelper.mConfig.copy();
+        if (Flags.modesUi()) {
+            // Reading the configuration will upgrade it, so for equality comparison also upgrade
+            // the expected value.
+            SystemZenRules.maybeUpgradeRules(mContext, expected);
+        }
 
         ByteArrayOutputStream baos = writeXmlAndPurge(null);
         TypedXmlPullParser parser = Xml.newFastPullParser();
@@ -1494,7 +1513,8 @@
         ZenModeConfig.ZenRule original = expected.automaticRules.get(ruleId);
         ZenModeConfig.ZenRule current = mZenModeHelper.mConfig.automaticRules.get(ruleId);
 
-        assertEquals("Automatic rules mismatch", original, current);
+        assertEquals("Automatic rules mismatch: current vs expected: "
+                + new ZenModeDiff.RuleDiff(original, current), original, current);
     }
 
     @Test
@@ -1524,6 +1544,11 @@
         mZenModeHelper.mConfig.automaticRules = automaticRules;
 
         ZenModeConfig expected = mZenModeHelper.mConfig.copy();
+        if (Flags.modesUi()) {
+            // Reading the configuration will upgrade it, so for equality comparison also upgrade
+            // the expected value.
+            SystemZenRules.maybeUpgradeRules(mContext, expected);
+        }
 
         ByteArrayOutputStream baos = writeXmlAndPurgeForUser(null, UserHandle.USER_SYSTEM);
         TypedXmlPullParser parser = getParserForByteStream(baos);
@@ -1532,7 +1557,8 @@
         ZenModeConfig.ZenRule original = expected.automaticRules.get(ruleId);
         ZenModeConfig.ZenRule current = mZenModeHelper.mConfig.automaticRules.get(ruleId);
 
-        assertEquals("Automatic rules mismatch", original, current);
+        assertEquals("Automatic rules mismatch: current vs expected: "
+                + new ZenModeDiff.RuleDiff(original, current), original, current);
     }
 
     @Test
@@ -2112,7 +2138,7 @@
         ZenModeConfig config = new ZenModeConfig();
         config.automaticRules = new ArrayMap<>();
         mZenModeHelper.mConfig = config;
-        mZenModeHelper.updateDefaultZenRules(Process.SYSTEM_UID); // shouldn't throw null pointer
+        mZenModeHelper.updateZenRulesOnLocaleChange(); // shouldn't throw null pointer
         mZenModeHelper.pullRules(events); // shouldn't throw null pointer
     }
 
@@ -2137,33 +2163,7 @@
         autoRules.put(SCHEDULE_DEFAULT_RULE_ID, updatedDefaultRule);
         mZenModeHelper.mConfig.automaticRules = autoRules;
 
-        mZenModeHelper.updateDefaultZenRules(Process.SYSTEM_UID);
-        assertEquals(updatedDefaultRule,
-                mZenModeHelper.mConfig.automaticRules.get(SCHEDULE_DEFAULT_RULE_ID));
-    }
-
-    @Test
-    public void testDoNotUpdateEnabledDefaultAutoRule() {
-        // mDefaultConfig is set to default config in setup by getDefaultConfigParser
-        when(mContext.checkCallingPermission(anyString()))
-                .thenReturn(PERMISSION_GRANTED);
-
-        // shouldn't update the rule that's enabled
-        ZenModeConfig.ZenRule updatedDefaultRule = new ZenModeConfig.ZenRule();
-        updatedDefaultRule.enabled = true;
-        updatedDefaultRule.modified = false;
-        updatedDefaultRule.creationTime = 0;
-        updatedDefaultRule.id = SCHEDULE_DEFAULT_RULE_ID;
-        updatedDefaultRule.name = "Schedule Default Rule";
-        updatedDefaultRule.zenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
-        updatedDefaultRule.conditionId = ZenModeConfig.toScheduleConditionId(new ScheduleInfo());
-        updatedDefaultRule.component = new ComponentName("android", "ScheduleConditionProvider");
-
-        ArrayMap<String, ZenModeConfig.ZenRule> autoRules = new ArrayMap<>();
-        autoRules.put(SCHEDULE_DEFAULT_RULE_ID, updatedDefaultRule);
-        mZenModeHelper.mConfig.automaticRules = autoRules;
-
-        mZenModeHelper.updateDefaultZenRules(Process.SYSTEM_UID);
+        mZenModeHelper.updateZenRulesOnLocaleChange();
         assertEquals(updatedDefaultRule,
                 mZenModeHelper.mConfig.automaticRules.get(SCHEDULE_DEFAULT_RULE_ID));
     }
@@ -2177,27 +2177,35 @@
 
         // will update rule that is not enabled and modified
         ZenModeConfig.ZenRule customDefaultRule = new ZenModeConfig.ZenRule();
+        customDefaultRule.pkg = SystemZenRules.PACKAGE_ANDROID;
         customDefaultRule.enabled = false;
         customDefaultRule.modified = false;
         customDefaultRule.creationTime = 0;
         customDefaultRule.id = SCHEDULE_DEFAULT_RULE_ID;
         customDefaultRule.name = "Schedule Default Rule";
         customDefaultRule.zenMode = ZEN_MODE_IMPORTANT_INTERRUPTIONS;
-        customDefaultRule.conditionId = ZenModeConfig.toScheduleConditionId(new ScheduleInfo());
+        ScheduleInfo scheduleInfo = new ScheduleInfo();
+        scheduleInfo.days = new int[] { Calendar.SUNDAY };
+        scheduleInfo.startHour = 18;
+        scheduleInfo.endHour = 19;
+        customDefaultRule.conditionId = ZenModeConfig.toScheduleConditionId(scheduleInfo);
         customDefaultRule.component = new ComponentName("android", "ScheduleConditionProvider");
 
         ArrayMap<String, ZenModeConfig.ZenRule> autoRules = new ArrayMap<>();
         autoRules.put(SCHEDULE_DEFAULT_RULE_ID, customDefaultRule);
         mZenModeHelper.mConfig.automaticRules = autoRules;
 
-        mZenModeHelper.updateDefaultZenRules(Process.SYSTEM_UID);
+        mZenModeHelper.updateZenRulesOnLocaleChange();
         ZenModeConfig.ZenRule ruleAfterUpdating =
                 mZenModeHelper.mConfig.automaticRules.get(SCHEDULE_DEFAULT_RULE_ID);
         assertEquals(customDefaultRule.enabled, ruleAfterUpdating.enabled);
         assertEquals(customDefaultRule.modified, ruleAfterUpdating.modified);
         assertEquals(customDefaultRule.id, ruleAfterUpdating.id);
         assertEquals(customDefaultRule.conditionId, ruleAfterUpdating.conditionId);
-        assertFalse(Objects.equals(defaultRuleName, ruleAfterUpdating.name)); // update name
+        assertNotEquals(defaultRuleName, ruleAfterUpdating.name); // update name
+        if (Flags.modesUi()) {
+            assertThat(ruleAfterUpdating.triggerDescription).isNotEmpty(); // update trigger desc
+        }
     }
 
     @Test
@@ -3634,12 +3642,11 @@
         mTestFlagResolver.setFlagOverride(LOG_DND_STATE_EVENTS, true);
         setupZenConfig();
 
-        // Event 1: turn on manual zen mode. Manual rule will have ACTIVE_RULE_TYPE_MANUAL
-        mZenModeHelper.setManualZenMode(ZEN_MODE_IMPORTANT_INTERRUPTIONS, null,
-                UPDATE_ORIGIN_SYSTEM_OR_SYSTEMUI, "", null, Process.SYSTEM_UID);
-
         // Create bedtime rule
+        // This one has INTERRUPTION_FILTER_ALL to make sure active rules still count when zen mode
+        // (in the notification filtering sense) is not on
         AutomaticZenRule bedtime = new AutomaticZenRule.Builder("Bedtime Mode (TM)", CONDITION_ID)
+                .setInterruptionFilter(INTERRUPTION_FILTER_ALL)
                 .setType(TYPE_BEDTIME)
                 .build();
         String bedtimeRuleId = mZenModeHelper.addAutomaticZenRule(mPkg, bedtime, UPDATE_ORIGIN_APP,
@@ -3652,17 +3659,21 @@
         String immersiveId = mZenModeHelper.addAutomaticZenRule(mPkg, immersive, UPDATE_ORIGIN_APP,
                 "reason", CUSTOM_PKG_UID);
 
-        // Event 2: Activate bedtime rule
+        // Event 1: Activate bedtime rule. This doesn't turn on notification filtering
         mZenModeHelper.setAutomaticZenRuleState(bedtimeRuleId,
                 new Condition(bedtime.getConditionId(), "", STATE_TRUE, SOURCE_SCHEDULE),
                 UPDATE_ORIGIN_APP, CUSTOM_PKG_UID);
 
+        // Event 2: turn on manual zen mode. Manual rule will have ACTIVE_RULE_TYPE_MANUAL
+        mZenModeHelper.setManualZenMode(ZEN_MODE_IMPORTANT_INTERRUPTIONS, null,
+                UPDATE_ORIGIN_SYSTEM_OR_SYSTEMUI, "", null, Process.SYSTEM_UID);
+
         // Event 3: Turn immersive on
         mZenModeHelper.setAutomaticZenRuleState(immersiveId,
                 new Condition(immersive.getConditionId(), "", STATE_TRUE, SOURCE_SCHEDULE),
                 UPDATE_ORIGIN_APP, CUSTOM_PKG_UID);
 
-        // Event 4: Turn off bedtime mode, leaving just unknown + immersive
+        // Event 4: Turn off bedtime mode, leaving just manual + immersive
         mZenModeHelper.setAutomaticZenRuleState(bedtimeRuleId,
                 new Condition(bedtime.getConditionId(), "", STATE_FALSE, SOURCE_SCHEDULE),
                 UPDATE_ORIGIN_APP, CUSTOM_PKG_UID);
@@ -3670,19 +3681,21 @@
         // Total of 4 events
         assertEquals(4, mZenModeEventLogger.numLoggedChanges());
 
-        // First event: DND_TURNED_ON; active rules: 1; type is ACTIVE_RULE_TYPE_MANUAL
+        // First event: active rules changed; active rules: 1; type is ACTIVE_RULE_TYPE_MANUAL
         assertThat(mZenModeEventLogger.getEventId(0)).isEqualTo(
-                ZenModeEventLogger.ZenStateChangedEvent.DND_TURNED_ON.getId());
+                ZenModeEventLogger.ZenStateChangedEvent.DND_ACTIVE_RULES_CHANGED.getId());
         assertThat(mZenModeEventLogger.getChangedRuleType(0)).isEqualTo(
-                DNDProtoEnums.MANUAL_RULE);
+                DNDProtoEnums.AUTOMATIC_RULE);
         assertThat(mZenModeEventLogger.getNumRulesActive(0)).isEqualTo(1);
         int[] ruleTypes0 = mZenModeEventLogger.getActiveRuleTypes(0);
         assertThat(ruleTypes0.length).isEqualTo(1);
-        assertThat(ruleTypes0[0]).isEqualTo(ACTIVE_RULE_TYPE_MANUAL);
+        assertThat(ruleTypes0[0]).isEqualTo(TYPE_BEDTIME);
 
         // Second event: active rules: 2; types are TYPE_MANUAL and TYPE_BEDTIME
+        assertThat(mZenModeEventLogger.getEventId(1)).isEqualTo(
+                ZenModeEventLogger.ZenStateChangedEvent.DND_TURNED_ON.getId());
         assertThat(mZenModeEventLogger.getChangedRuleType(1)).isEqualTo(
-                DNDProtoEnums.AUTOMATIC_RULE);
+                DNDProtoEnums.MANUAL_RULE);
         assertThat(mZenModeEventLogger.getNumRulesActive(1)).isEqualTo(2);
         int[] ruleTypes1 = mZenModeEventLogger.getActiveRuleTypes(1);
         assertThat(ruleTypes1.length).isEqualTo(2);
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 0b76154..19ce217 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
@@ -251,9 +251,9 @@
 
         VibrationEffect effect = VibrationEffect.createWaveform(
                 new long[]{5, 5, 5}, new int[]{1, 1, 1}, -1);
-        CompletableFuture<Void> mRequestVibrationParamsFuture = CompletableFuture.runAsync(() -> {
-            mVibrationScaler.updateAdaptiveHapticsScale(USAGE_RINGTONE, 0.5f);
-        });
+        mVibrationScaler.updateAdaptiveHapticsScale(USAGE_RINGTONE, 0.5f);
+        CompletableFuture<Void> mRequestVibrationParamsFuture = CompletableFuture.completedFuture(
+                null);
         long vibrationId = startThreadAndDispatcher(effect, mRequestVibrationParamsFuture,
                 USAGE_RINGTONE);
         waitForCompletion();
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 5861d88..185677f 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -1589,7 +1589,8 @@
         assertEquals(1f, ((PrimitiveSegment) segments.get(2)).getScale(), 1e-5);
         verify(mVibratorFrameworkStatsLoggerMock).logVibrationAdaptiveHapticScale(UID, 0.7f);
         verify(mVibratorFrameworkStatsLoggerMock).logVibrationAdaptiveHapticScale(UID, 0.4f);
-        verify(mVibratorFrameworkStatsLoggerMock).logVibrationAdaptiveHapticScale(UID, 1f);
+        verify(mVibratorFrameworkStatsLoggerMock,
+                timeout(TEST_TIMEOUT_MILLIS)).logVibrationAdaptiveHapticScale(UID, 1f);
     }
 
     @Test
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 52df010..eac9929 100644
--- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
+++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
@@ -85,7 +85,6 @@
 import android.os.test.TestLooper;
 import android.service.dreams.DreamManagerInternal;
 import android.telecom.TelecomManager;
-import android.util.FeatureFlagUtils;
 import android.view.Display;
 import android.view.InputDevice;
 import android.view.KeyEvent;
@@ -743,15 +742,8 @@
 
     void assertSwitchKeyboardLayout(int direction, int displayId) {
         mTestLooper.dispatchAll();
-        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI)) {
-            verify(mInputMethodManagerInternal).onSwitchKeyboardLayoutShortcut(eq(direction),
-                    eq(displayId), eq(mImeTargetWindowToken));
-            verify(mWindowManagerFuncsImpl, never()).switchKeyboardLayout(anyInt(), anyInt());
-        } else {
-            verify(mWindowManagerFuncsImpl).switchKeyboardLayout(anyInt(), eq(direction));
-            verify(mInputMethodManagerInternal, never())
-                    .onSwitchKeyboardLayoutShortcut(anyInt(), anyInt(), any());
-        }
+        verify(mInputMethodManagerInternal).onSwitchKeyboardLayoutShortcut(eq(direction),
+                eq(displayId), eq(mImeTargetWindowToken));
     }
 
     void assertTakeBugreport() {
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 82e55711..e42acba 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -3110,6 +3110,10 @@
 
     @Test
     public void testCloseToSquareFixedOrientation() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // No test needed as decor insets no longer affects orientation.
+            return;
+        }
         // create a square display
         final DisplayContent squareDisplay = new TestDisplayContent.Builder(mAtm, 2000, 2000)
                 .setSystemDecorations(true).build();
@@ -3416,6 +3420,7 @@
         // Remove window during transition, so it is requested to hide, but won't be committed until
         // the transition is finished.
         app.mActivityRecord.onRemovedFromDisplay();
+        app.mActivityRecord.prepareSurfaces();
 
         assertTrue(mDisplayContent.mClosingApps.contains(app.mActivityRecord));
         assertFalse(app.mActivityRecord.isVisibleRequested());
@@ -3433,6 +3438,7 @@
     public void testInClosingAnimation_visibilityCommitted_hideSurface() {
         final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
         makeWindowVisibleAndDrawn(app);
+        app.mActivityRecord.prepareSurfaces();
 
         // Put the activity in close transition.
         mDisplayContent.mOpeningApps.clear();
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
index 173a1b6..10eae57 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -46,6 +46,7 @@
 import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 import static android.os.Process.SYSTEM_UID;
+import static android.server.wm.ActivityManagerTestBase.isTablet;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.clearInvocations;
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
@@ -75,6 +76,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
@@ -122,6 +124,7 @@
 import com.android.server.wm.BackgroundActivityStartController.BalVerdict;
 import com.android.server.wm.LaunchParamsController.LaunchParamsModifier;
 import com.android.server.wm.utils.MockTracker;
+import com.android.window.flags.Flags;
 
 import org.junit.After;
 import org.junit.Before;
@@ -1295,6 +1298,12 @@
      */
     @Test
     public void testDeliverIntentToTopActivityOfNonTopDisplay() {
+        // TODO(b/330152508): Remove check once legacy multi-display behaviour can coexist with
+        //  desktop windowing mode
+        // Ignore test if desktop windowing is enabled on tablets as legacy multi-display
+        // behaviour will not be respected
+        assumeFalse(Flags.enableDesktopWindowingMode() && isTablet());
+
         final ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_NEW_TASK,
                 false /* mockGetRootTask */);
 
@@ -1634,6 +1643,28 @@
         assertThat(transition.isInTransientHide(top.getTask())).isTrue();
     }
 
+    /**
+     * Tests ATMS#startActivityWithScreenshot should collect display content for creating snapshot.
+     */
+    @Test
+    public void testActivityStartWithScreenshot() {
+        final ActivityStarter starter = prepareStarter(0 /* flags */);
+        starter.setFreezeScreen(true);
+
+        registerTestTransitionPlayer();
+
+        final Intent intent = new Intent();
+        intent.setComponent(ActivityBuilder.getDefaultComponent());
+        starter.setReason("testActivityStartWithScreenshot")
+                .setIntent(intent)
+                .execute();
+
+        final TransitionController controller = mRootWindowContainer.mTransitionController;
+        final Transition transition = controller.getCollectingTransition();
+        final Transition.ChangeInfo targetChangeInfo = transition.mChanges.get(mDisplayContent);
+        assertThat(targetChangeInfo).isNotNull();
+    }
+
     @Test
     public void testActivityStart_expectAddedToRecentTask() {
         RecentTasks recentTasks = mock(RecentTasks.class);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
index ed99108..400f9bb 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
@@ -38,18 +38,22 @@
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.doCallRealMethod;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.never;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.ActivityManager;
+import android.app.ActivityManager.TaskDescription;
 import android.app.IApplicationThread;
 import android.app.PictureInPictureParams;
 import android.app.servertransaction.ClientTransactionItem;
@@ -62,6 +66,7 @@
 import android.os.LocaleList;
 import android.os.PowerManagerInternal;
 import android.os.RemoteException;
+import android.os.UserHandle;
 import android.platform.test.annotations.Presubmit;
 import android.view.Display;
 import android.view.DisplayInfo;
@@ -1099,4 +1104,61 @@
 
         verify(mClientLifecycleManager).onLayoutContinued();
     }
+
+    @Test
+    public void testGetTaskDescriptionIcon_matchingUid() {
+        // Ensure that we do not hold MANAGE_ACTIVITY_TASKS
+        doThrow(new SecurityException()).when(mAtm).enforceActivityTaskPermission(any());
+
+        final String filePath = "abc/def";
+        // Create an activity with a task description at the test icon filepath
+        final ActivityRecord activity = new ActivityBuilder(mAtm)
+                .setUid(android.os.Process.myUid())
+                .setCreateTask(true)
+                .build();
+        final TaskDescription td = new TaskDescription.Builder().build();
+        td.setIconFilename(filePath);
+        activity.setTaskDescription(td);
+
+        // Verify this calls and does not throw a security exception
+        try {
+            mAtm.getTaskDescriptionIcon(filePath, activity.mUserId);
+        } catch (SecurityException e) {
+            fail("Unexpected security exception: " + e);
+        } catch (IllegalArgumentException e) {
+            // Ok, the file doesn't actually exist
+        }
+    }
+
+    @Test
+    public void testGetTaskDescriptionIcon_noMatchingActivity_expectException() {
+        // Ensure that we do not hold MANAGE_ACTIVITY_TASKS
+        doThrow(new SecurityException()).when(mAtm).enforceActivityTaskPermission(any());
+
+        final String filePath = "abc/def";
+
+        // Verify this throws a security exception due to no matching activity
+        assertThrows(SecurityException.class,
+                () -> mAtm.getTaskDescriptionIcon(filePath, UserHandle.myUserId()));
+    }
+
+    @Test
+    public void testGetTaskDescriptionIcon_noMatchingUid_expectException() {
+        // Ensure that we do not hold MANAGE_ACTIVITY_TASKS
+        doThrow(new SecurityException()).when(mAtm).enforceActivityTaskPermission(any());
+
+        final String filePath = "abc/def";
+        // Create an activity with a task description at the test icon filepath
+        final ActivityRecord activity = new ActivityBuilder(mAtm)
+                .setCreateTask(true)
+                .setUid(101010)
+                .build();
+        final TaskDescription td = new TaskDescription.Builder().build();
+        td.setIconFilename(filePath);
+        activity.setTaskDescription(td);
+
+        // Verify this throws a security exception due to no matching UID
+        assertThrows(SecurityException.class,
+                () -> mAtm.getTaskDescriptionIcon(filePath, activity.mUserId));
+    }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
index b9e87dc..a911131 100644
--- a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java
@@ -94,6 +94,7 @@
     private BackNavigationController mBackNavigationController;
     private WindowManagerInternal mWindowManagerInternal;
     private BackAnimationAdapter mBackAnimationAdapter;
+    private BackNavigationController.NavigationMonitor mNavigationMonitor;
     private Task mRootHomeTask;
 
     @Before
@@ -105,6 +106,7 @@
         mWindowManagerInternal = mock(WindowManagerInternal.class);
         LocalServices.addService(WindowManagerInternal.class, mWindowManagerInternal);
         mBackAnimationAdapter = mock(BackAnimationAdapter.class);
+        mNavigationMonitor = mock(BackNavigationController.NavigationMonitor.class);
         mRootHomeTask = initHomeActivity();
     }
 
@@ -291,13 +293,22 @@
         assertTrue(predictable);
         outPrevActivities.clear();
 
-        // Stacked + companion => predict for previous task
+        // Stacked + top companion to bottom but bottom didn't => predict for previous activity
         tf2.setCompanionTaskFragment(tf1);
         predictable = BackNavigationController.getAnimatablePrevActivities(task, topAr,
                 outPrevActivities);
+        assertTrue(outPrevActivities.contains(prevAr));
+        assertTrue(predictable);
+        tf2.setCompanionTaskFragment(null);
+        outPrevActivities.clear();
+
+        // Stacked + next companion to top => predict for previous task
+        tf1.setCompanionTaskFragment(tf2);
+        predictable = BackNavigationController.getAnimatablePrevActivities(task, topAr,
+                outPrevActivities);
         assertTrue(outPrevActivities.isEmpty());
         assertTrue(predictable);
-        tf2.setCompanionTaskFragment(null);
+        tf1.setCompanionTaskFragment(null);
 
         // Adjacent + no companion => unable to predict
         // TF1 | TF2
@@ -314,11 +325,13 @@
 
         // Adjacent + companion => predict for previous task
         tf1.setCompanionTaskFragment(tf2);
-        tf2.setCompanionTaskFragment(tf1);
         predictable = BackNavigationController.getAnimatablePrevActivities(task, topAr,
                 outPrevActivities);
         assertTrue(outPrevActivities.isEmpty());
         assertTrue(predictable);
+        tf1.setCompanionTaskFragment(null);
+
+        tf2.setCompanionTaskFragment(tf1);
         predictable = BackNavigationController.getAnimatablePrevActivities(task, prevAr,
                 outPrevActivities);
         assertTrue(outPrevActivities.isEmpty());
@@ -361,18 +374,27 @@
         tf3.setAdjacentTaskFragment(null);
 
         final TaskFragment tf4 = createTaskFragmentWithActivity(task);
-        // Stacked + companion => predict for previous activity below companion.
+        // Stacked + next companion to top => predict for previous activity below companion.
         // Tf4
         // TF3
         // TF2
         // TF1
-        tf4.setCompanionTaskFragment(tf3);
         tf3.setCompanionTaskFragment(tf4);
         topAr = tf4.getTopMostActivity();
         predictable = BackNavigationController.getAnimatablePrevActivities(task, topAr,
                 outPrevActivities);
         assertTrue(outPrevActivities.contains(tf2.getTopMostActivity()));
         assertTrue(predictable);
+        outPrevActivities.clear();
+        tf3.setCompanionTaskFragment(null);
+
+        // Stacked +  top companion to next but next one didn't => predict for previous activity.
+        tf4.setCompanionTaskFragment(tf3);
+        topAr = tf4.getTopMostActivity();
+        predictable = BackNavigationController.getAnimatablePrevActivities(task, topAr,
+                outPrevActivities);
+        assertTrue(outPrevActivities.contains(tf3.getTopMostActivity()));
+        assertTrue(predictable);
     }
 
     @Test
@@ -517,7 +539,7 @@
         }).when(appWindow.mSession).setOnBackInvokedCallbackInfo(eq(appWindow.mClient), any());
 
         addToWindowMap(appWindow, true);
-        dispatcher.attachToWindow(appWindow.mSession, appWindow.mClient);
+        dispatcher.attachToWindow(appWindow.mSession, appWindow.mClient, null);
 
 
         OnBackInvokedCallback appCallback = createBackCallback(appLatch);
@@ -793,6 +815,7 @@
                 animationHandler.prepareAnimation(
                         BackNavigationInfo.TYPE_RETURN_TO_HOME,
                         mBackAnimationAdapter,
+                        mNavigationMonitor,
                         task,
                         mRootHomeTask,
                         bottomActivity,
@@ -812,6 +835,7 @@
                 animationHandler.prepareAnimation(
                         BackNavigationInfo.TYPE_CROSS_ACTIVITY,
                         mBackAnimationAdapter,
+                        mNavigationMonitor,
                         task,
                         task,
                         topActivity,
diff --git a/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerExemptionTests.java b/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerExemptionTests.java
new file mode 100644
index 0000000..4afc8ac
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerExemptionTests.java
@@ -0,0 +1,567 @@
+/*
+ * 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.server.wm;
+
+import static com.android.server.wm.ActivityTaskManagerService.APP_SWITCH_ALLOW;
+import static com.android.server.wm.BackgroundActivityStartController.BAL_ALLOW_ALLOWLISTED_COMPONENT;
+import static com.android.server.wm.BackgroundActivityStartController.BAL_ALLOW_FOREGROUND;
+import static com.android.server.wm.BackgroundActivityStartController.BAL_ALLOW_PERMISSION;
+import static com.android.server.wm.BackgroundActivityStartController.BAL_ALLOW_SAW_PERMISSION;
+import static com.android.server.wm.BackgroundActivityStartController.BAL_ALLOW_VISIBLE_WINDOW;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityOptions;
+import android.app.AppOpsManager;
+import android.app.BackgroundStartPrivileges;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManagerInternal;
+import android.os.UserHandle;
+import android.platform.test.annotations.Presubmit;
+import android.provider.DeviceConfig;
+import android.util.Pair;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.compatibility.common.util.DeviceConfigStateHelper;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.am.PendingIntentRecord;
+import com.android.server.wm.BackgroundActivityStartController.BalVerdict;
+
+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.JUnit4;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.quality.Strictness;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Tests for the {@link BackgroundActivityStartController} class.
+ *
+ * Build/Install/Run:
+ * atest WmTests:BackgroundActivityStartControllerExemptionTests
+ */
+@SmallTest
+@Presubmit
+@RunWith(JUnit4.class)
+public class BackgroundActivityStartControllerExemptionTests {
+
+    private static final int REGULAR_UID_1 = 10100;
+    private static final int REGULAR_UID_2 = 10200;
+    private static final int NO_UID = -1;
+    private static final int REGULAR_PID_1 = 11100;
+    private static final int REGULAR_PID_1_1 = 11101;
+    private static final int REGULAR_PID_2 = 11200;
+    private static final int NO_PID = -1;
+    private static final String REGULAR_PACKAGE_1 = "package.app1";
+    private static final String REGULAR_PACKAGE_2 = "package.app2";
+
+    private static final Intent TEST_INTENT = new Intent()
+            .setComponent(new ComponentName("package.app3", "someClass"));
+
+    @Rule
+    public final ExtendedMockitoRule extendedMockitoRule =
+            new ExtendedMockitoRule.Builder(this).setStrictness(Strictness.LENIENT).build();
+
+    TestableBackgroundActivityStartController mController;
+    @Mock
+    ActivityMetricsLogger mActivityMetricsLogger;
+    @Mock
+    WindowProcessController mCallerApp;
+    DeviceConfigStateHelper mDeviceConfig = new DeviceConfigStateHelper(
+            DeviceConfig.NAMESPACE_WINDOW_MANAGER);
+    @Mock
+    ActivityRecord mResultRecord;
+
+    @Mock
+    ActivityTaskManagerService mService;
+    @Mock
+    Context /* mService. */ mContext;
+    @Mock
+    PackageManagerInternal /* mService. */ mPackageManagerInternal;
+    @Mock
+    RootWindowContainer /* mService. */ mRootWindowContainer;
+    @Mock
+    AppOpsManager mAppOpsManager;
+    MirrorActiveUids mActiveUids = new MirrorActiveUids();
+    WindowProcessControllerMap mProcessMap = new WindowProcessControllerMap();
+
+    @Mock
+    ActivityTaskSupervisor mSupervisor;
+    @Mock
+    RecentTasks /* mSupervisor. */ mRecentTasks;
+
+    @Mock
+    PendingIntentRecord mPendingIntentRecord; // just so we can pass a non-null instance
+
+    record BalAllowedLog(String packageName, int code) {
+    }
+
+    List<String> mShownToasts = new ArrayList<>();
+    List<BalAllowedLog> mBalAllowedLogs = new ArrayList<>();
+
+    ActivityOptions mCheckedOptions = ActivityOptions.makeBasic()
+            .setPendingIntentCreatorBackgroundActivityStartMode(
+                    ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
+            .setPendingIntentBackgroundActivityStartMode(
+                    ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED);
+
+    class TestableBackgroundActivityStartController extends BackgroundActivityStartController {
+        private Set<Pair<Integer, Integer>> mBalPermissionUidPidPairs = new HashSet<>();
+
+        TestableBackgroundActivityStartController(ActivityTaskManagerService service,
+                ActivityTaskSupervisor supervisor) {
+            super(service, supervisor);
+        }
+
+        @Override
+        protected void writeBalAllowedLog(String activityName, int code,
+                BalState state) {
+            mBalAllowedLogs.add(new BalAllowedLog(activityName, code));
+        }
+
+        @Override
+        boolean hasBalPermission(int uid, int pid) {
+            return mBalPermissionUidPidPairs.contains(Pair.create(uid, pid));
+        }
+
+        void addBalPermission(int uid, int pid) {
+            mBalPermissionUidPidPairs.add(Pair.create(uid, pid));
+        }
+
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        // wire objects
+        mService.mTaskSupervisor = mSupervisor;
+        mService.mContext = mContext;
+        setViaReflection(mService, "mActiveUids", mActiveUids);
+        when(mService.getPackageManagerInternalLocked()).thenReturn(
+                mPackageManagerInternal);
+        mService.mRootWindowContainer = mRootWindowContainer;
+        when(mService.getAppOpsManager()).thenReturn(mAppOpsManager);
+        setViaReflection(mService, "mProcessMap", mProcessMap);
+
+        //Mockito.when(mSupervisor.getBackgroundActivityLaunchController()).thenReturn(mController);
+        setViaReflection(mSupervisor, "mRecentTasks", mRecentTasks);
+
+        mController = new TestableBackgroundActivityStartController(mService, mSupervisor);
+
+        // nicer toString
+        when(mPendingIntentRecord.toString()).thenReturn("PendingIntentRecord");
+
+        // safe defaults
+        when(mAppOpsManager.checkOpNoThrow(
+                eq(AppOpsManager.OP_SYSTEM_EXEMPT_FROM_ACTIVITY_BG_START_RESTRICTION),
+                anyInt(), anyString())).thenReturn(AppOpsManager.MODE_DEFAULT);
+        when(mCallerApp.areBackgroundActivityStartsAllowed(anyInt())).thenReturn(
+                BalVerdict.BLOCK);
+    }
+
+    private void setViaReflection(Object o, String property, Object value) {
+        try {
+            Field field = o.getClass().getDeclaredField(property);
+            field.setAccessible(true);
+            field.set(o, value);
+        } catch (IllegalAccessException | NoSuchFieldException e) {
+            throw new IllegalArgumentException("Cannot set " + property + " of " + o.getClass(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testNoExemption() {
+        int callingUid = REGULAR_UID_1;
+        int callingPid = REGULAR_PID_1;
+        final String callingPackage = REGULAR_PACKAGE_1;
+        int realCallingUid = REGULAR_UID_2;
+        int realCallingPid = REGULAR_PID_2;
+
+        // prepare call
+        PendingIntentRecord originatingPendingIntent = mPendingIntentRecord;
+        BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE;
+        Intent intent = TEST_INTENT;
+        ActivityOptions checkedOptions = mCheckedOptions;
+        BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid,
+                callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp,
+                originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent,
+                checkedOptions);
+
+        assertWithMessage(balState.toString()).that(balState.isPendingIntent()).isTrue();
+
+        // call
+        BalVerdict callerVerdict = mController.checkBackgroundActivityStartAllowedByCaller(
+                balState);
+        BalVerdict realCallerVerdict = mController.checkBackgroundActivityStartAllowedBySender(
+                balState);
+
+        balState.setResultForCaller(callerVerdict);
+        balState.setResultForRealCaller(realCallerVerdict);
+
+        // assertions
+        assertWithMessage(balState.toString()).that(callerVerdict.getCode()).isEqualTo(
+                BackgroundActivityStartController.BAL_BLOCK);
+        assertWithMessage(balState.toString()).that(realCallerVerdict.getCode()).isEqualTo(
+                BackgroundActivityStartController.BAL_BLOCK);
+    }
+
+    @Test
+    public void testCaller_appHasVisibleWindow() {
+        int callingUid = REGULAR_UID_1;
+        int callingPid = REGULAR_PID_1;
+        final String callingPackage = REGULAR_PACKAGE_1;
+        int realCallingUid = REGULAR_UID_2;
+        int realCallingPid = REGULAR_PID_2;
+
+        // setup state
+        when(mService.hasActiveVisibleWindow(eq(callingUid))).thenReturn(true);
+        when(mService.getBalAppSwitchesState()).thenReturn(APP_SWITCH_ALLOW);
+
+        // prepare call
+        PendingIntentRecord originatingPendingIntent = mPendingIntentRecord;
+        BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE;
+        Intent intent = TEST_INTENT;
+        ActivityOptions checkedOptions = mCheckedOptions;
+        BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid,
+                callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp,
+                originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent,
+                checkedOptions);
+
+        // call
+        BalVerdict callerVerdict = mController.checkBackgroundActivityStartAllowedByCaller(
+                balState);
+        balState.setResultForCaller(callerVerdict);
+
+        // assertions
+        assertWithMessage(balState.toString()).that(callerVerdict.getCode()).isEqualTo(
+                BAL_ALLOW_VISIBLE_WINDOW);
+    }
+
+    @Test
+    public void testRealCaller_appHasVisibleWindow() {
+        int callingUid = REGULAR_UID_1;
+        int callingPid = REGULAR_PID_1;
+        final String callingPackage = REGULAR_PACKAGE_1;
+        int realCallingUid = REGULAR_UID_2;
+        int realCallingPid = REGULAR_PID_2;
+
+        // setup state
+        when(mService.hasActiveVisibleWindow(eq(realCallingUid))).thenReturn(true);
+        when(mService.getBalAppSwitchesState()).thenReturn(APP_SWITCH_ALLOW);
+
+        // prepare call
+        PendingIntentRecord originatingPendingIntent = mPendingIntentRecord;
+        BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE;
+        Intent intent = TEST_INTENT;
+        ActivityOptions checkedOptions = mCheckedOptions;
+        BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid,
+                callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp,
+                originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent,
+                checkedOptions);
+
+        // call
+        BalVerdict realCallerVerdict = mController.checkBackgroundActivityStartAllowedBySender(
+                balState);
+        balState.setResultForRealCaller(realCallerVerdict);
+
+        // assertions
+        assertWithMessage(balState.toString()).that(realCallerVerdict.getCode()).isEqualTo(
+                BAL_ALLOW_VISIBLE_WINDOW);
+    }
+
+    @Test
+    public void testCaller_appAllowedByBLPC() {
+        // This covers the cases
+        // - The app has an activity in the back stack of the foreground task.
+        // - The app has an activity in the back stack of an existing task on the Recents screen.
+        // - The app has an activity that started very recently.
+        // - The app called finish() on an activity very recently.
+        // - The app has a service that is bound by a different, visible app.
+
+        int callingUid = REGULAR_UID_1;
+        int callingPid = REGULAR_PID_1;
+        final String callingPackage = REGULAR_PACKAGE_1;
+        int realCallingUid = REGULAR_UID_2;
+        int realCallingPid = REGULAR_PID_2;
+
+        // setup state
+        when(mCallerApp.areBackgroundActivityStartsAllowed(anyInt())).thenReturn(
+                new BalVerdict(BAL_ALLOW_FOREGROUND, false, "allowed"));
+        when(mService.getBalAppSwitchesState()).thenReturn(APP_SWITCH_ALLOW);
+
+        // prepare call
+        PendingIntentRecord originatingPendingIntent = mPendingIntentRecord;
+        BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE;
+        Intent intent = TEST_INTENT;
+        ActivityOptions checkedOptions = mCheckedOptions;
+        BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid,
+                callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp,
+                originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent,
+                checkedOptions);
+
+        // call
+        BalVerdict callerVerdict = mController.checkBackgroundActivityStartAllowedByCaller(
+                balState);
+        balState.setResultForCaller(callerVerdict);
+
+        // assertions
+        assertWithMessage(balState.toString()).that(callerVerdict.getCode()).isEqualTo(
+                BAL_ALLOW_FOREGROUND);
+    }
+
+    @Test
+    public void testRealCaller_appAllowedByBLPC() {
+        int callingUid = REGULAR_UID_1;
+        int callingPid = REGULAR_PID_1;
+        final String callingPackage = REGULAR_PACKAGE_1;
+        int realCallingUid = REGULAR_UID_2;
+        int realCallingPid = REGULAR_PID_2;
+
+        // setup state
+        when(
+                mService.getProcessController(eq(realCallingPid), eq(realCallingUid))).thenReturn(
+                mCallerApp);
+        when(mService.getBalAppSwitchesState()).thenReturn(APP_SWITCH_ALLOW);
+        when(mCallerApp.areBackgroundActivityStartsAllowed(anyInt())).thenReturn(
+                new BalVerdict(BAL_ALLOW_FOREGROUND, false, "allowed"));
+
+        // prepare call
+        PendingIntentRecord originatingPendingIntent = mPendingIntentRecord;
+        BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE;
+        Intent intent = TEST_INTENT;
+        ActivityOptions checkedOptions = mCheckedOptions;
+        BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid,
+                callingPid, callingPackage, realCallingUid, realCallingPid, null,
+                originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent,
+                checkedOptions);
+
+        // call
+        BalVerdict realCallerVerdict = mController.checkBackgroundActivityStartAllowedBySender(
+                balState);
+        balState.setResultForRealCaller(realCallerVerdict);
+
+        // assertions
+        assertWithMessage(balState.toString()).that(realCallerVerdict.getCode()).isEqualTo(
+                BAL_ALLOW_FOREGROUND);
+    }
+
+    // TODO? The app has one of the following services that is bound by the system. These
+    //  services might need to launch a UI.
+
+    @Test
+    public void testRealCaller_appAllowedByBLPCforOtherProcess() {
+        // The app has a service that is bound by a different, visible app. The app bound to the
+        // service must remain visible for the app in the background to start activities
+        // successfully.
+        int callingUid = REGULAR_UID_1;
+        int callingPid = REGULAR_PID_1;
+        final String callingPackage = REGULAR_PACKAGE_1;
+        int realCallingUid = REGULAR_UID_2;
+        int realCallingPid = REGULAR_PID_2;
+
+        // setup state
+        WindowProcessControllerMap mProcessMap = new WindowProcessControllerMap();
+        WindowProcessController otherProcess = Mockito.mock(WindowProcessController.class);
+        mProcessMap.put(callingPid, mCallerApp);
+        mProcessMap.put(REGULAR_PID_1_1, otherProcess);
+        setViaReflection(mService, "mProcessMap", mProcessMap);
+        when(
+                mService.getProcessController(eq(realCallingPid), eq(realCallingUid))).thenReturn(
+                mCallerApp);
+        when(mService.getBalAppSwitchesState()).thenReturn(APP_SWITCH_ALLOW);
+        when(mCallerApp.areBackgroundActivityStartsAllowed(anyInt())).thenReturn(
+                BalVerdict.BLOCK);
+        when(otherProcess.areBackgroundActivityStartsAllowed(anyInt())).thenReturn(
+                new BalVerdict(BAL_ALLOW_FOREGROUND, false, "allowed"));
+
+        // prepare call
+        PendingIntentRecord originatingPendingIntent = mPendingIntentRecord;
+        BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE;
+        Intent intent = TEST_INTENT;
+        ActivityOptions checkedOptions = mCheckedOptions;
+        BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid,
+                callingPid, callingPackage, realCallingUid, realCallingPid, null,
+                originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent,
+                checkedOptions);
+
+        // call
+        BalVerdict realCallerVerdict = mController.checkBackgroundActivityStartAllowedBySender(
+                balState);
+        balState.setResultForRealCaller(realCallerVerdict);
+
+        // assertions
+        assertWithMessage(balState.toString()).that(realCallerVerdict.getCode()).isEqualTo(
+                BAL_ALLOW_FOREGROUND);
+    }
+
+    @Test
+    public void testRealCaller_isCompanionApp() {
+        // The app has a service that is bound by a different, visible app. The app bound to the
+        // service must remain visible for the app in the background to start activities
+        // successfully.
+        int callingUid = REGULAR_UID_1;
+        int callingPid = REGULAR_PID_1;
+        final String callingPackage = REGULAR_PACKAGE_1;
+        int realCallingUid = REGULAR_UID_2;
+        int realCallingPid = REGULAR_PID_2;
+
+        // setup state
+        final int realCallingUserId = UserHandle.getUserId(realCallingUid);
+        when(mService.isAssociatedCompanionApp(eq(realCallingUserId),
+                eq(realCallingUid))).thenReturn(true);
+
+        // prepare call
+        PendingIntentRecord originatingPendingIntent = mPendingIntentRecord;
+        BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE;
+        Intent intent = TEST_INTENT;
+        ActivityOptions checkedOptions = mCheckedOptions;
+        BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid,
+                callingPid, callingPackage, realCallingUid, realCallingPid, null,
+                originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent,
+                checkedOptions);
+
+        // call
+        BalVerdict realCallerVerdict = mController.checkBackgroundActivityStartAllowedBySender(
+                balState);
+        balState.setResultForRealCaller(realCallerVerdict);
+
+        // assertions
+        assertWithMessage(balState.toString()).that(realCallerVerdict.getCode()).isEqualTo(
+                BAL_ALLOW_ALLOWLISTED_COMPONENT);
+    }
+
+    @Test
+    public void testCaller_balPermission() {
+        int callingUid = REGULAR_UID_1;
+        int callingPid = REGULAR_PID_1;
+        final String callingPackage = REGULAR_PACKAGE_1;
+        int realCallingUid = REGULAR_UID_2;
+        int realCallingPid = REGULAR_PID_2;
+
+        // setup state
+        mController.addBalPermission(callingUid, callingPid);
+        mController.addBalPermission(callingUid, NO_PID);
+
+        // prepare call
+        PendingIntentRecord originatingPendingIntent = mPendingIntentRecord;
+        BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE;
+        Intent intent = TEST_INTENT;
+        ActivityOptions checkedOptions = mCheckedOptions;
+        BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid,
+                callingPid, callingPackage, realCallingUid, realCallingPid, null,
+                originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent,
+                checkedOptions);
+
+        // call
+        BalVerdict callerVerdict = mController.checkBackgroundActivityStartAllowedByCaller(
+                balState);
+        balState.setResultForCaller(callerVerdict);
+
+        // assertions
+        assertWithMessage(balState.toString()).that(callerVerdict.getCode()).isEqualTo(
+                BAL_ALLOW_PERMISSION);
+    }
+
+    @Test
+    public void testRealCaller_balPermission() {
+        // BAL allowed by permission. Requires explicit opt-in in options (hidden/not documented!).
+        int callingUid = REGULAR_UID_1;
+        int callingPid = REGULAR_PID_1;
+        final String callingPackage = REGULAR_PACKAGE_1;
+        int realCallingUid = REGULAR_UID_2;
+        int realCallingPid = REGULAR_PID_2;
+
+        // setup state
+        mController.addBalPermission(realCallingUid, realCallingPid);
+        mController.addBalPermission(realCallingUid, NO_PID);
+
+        // prepare call
+        PendingIntentRecord originatingPendingIntent = mPendingIntentRecord;
+        BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE;
+        Intent intent = TEST_INTENT;
+        ActivityOptions checkedOptions = mCheckedOptions;
+        checkedOptions.setPendingIntentBackgroundActivityLaunchAllowedByPermission(true);
+        BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid,
+                callingPid, callingPackage, realCallingUid, realCallingPid, null,
+                originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent,
+                checkedOptions);
+
+        assertThat(balState.isPendingIntentBalAllowedByPermission()).isTrue();
+
+        // call
+        BalVerdict realCallerVerdict = mController.checkBackgroundActivityStartAllowedBySender(
+                balState);
+        balState.setResultForRealCaller(realCallerVerdict);
+
+        // assertions
+        assertWithMessage(balState.toString()).that(realCallerVerdict.getCode()).isEqualTo(
+                BAL_ALLOW_PERMISSION);
+    }
+
+    @Test
+    public void testCaller_sawPermission() {
+        int callingUid = REGULAR_UID_1;
+        int callingPid = REGULAR_PID_1;
+        final String callingPackage = REGULAR_PACKAGE_1;
+        int realCallingUid = REGULAR_UID_2;
+        int realCallingPid = REGULAR_PID_2;
+
+        // setup state
+        when(mService.hasSystemAlertWindowPermission(eq(callingUid), eq(callingPid),
+                eq(callingPackage))).thenReturn(true);
+
+        // prepare call
+        PendingIntentRecord originatingPendingIntent = mPendingIntentRecord;
+        BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE;
+        Intent intent = TEST_INTENT;
+        ActivityOptions checkedOptions = mCheckedOptions;
+        BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid,
+                callingPid, callingPackage, realCallingUid, realCallingPid, null,
+                originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent,
+                checkedOptions);
+
+        // call
+        BalVerdict callerVerdict = mController.checkBackgroundActivityStartAllowedByCaller(
+                balState);
+        balState.setResultForCaller(callerVerdict);
+
+        // assertions
+        assertWithMessage(balState.toString()).that(callerVerdict.getCode()).isEqualTo(
+                BAL_ALLOW_SAW_PERMISSION);
+    }
+}
diff --git a/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerTests.java
index ef131ac..695faa5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerTests.java
@@ -62,7 +62,7 @@
 import java.util.Optional;
 
 /**
- * Tests for the {@link ActivityStarter} class.
+ * Tests for the {@link BackgroundActivityStartController} class.
  *
  * Build/Install/Run:
  * atest WmTests:BackgroundActivityStartControllerTests
@@ -504,22 +504,37 @@
         assertThat(balState.callerExplicitOptInOrOut()).isFalse();
         assertThat(balState.realCallerExplicitOptInOrAutoOptIn()).isTrue();
         assertThat(balState.realCallerExplicitOptInOrOut()).isFalse();
-        assertThat(balState.toString()).isEqualTo(
-                "[callingPackage: package.app1; callingPackageTargetSdk: -1; callingUid: 10001; "
-                        + "callingPid: 11001; appSwitchState: 0; callingUidHasAnyVisibleWindow: "
-                        + "false; callingUidProcState: NONEXISTENT; "
-                        + "isCallingUidPersistentSystemProcess: false; forcedBalByPiSender: BSP"
-                        + ".NONE; intent: Intent { cmp=package.app3/someClass }; callerApp: "
-                        + "mCallerApp; inVisibleTask: false; balAllowedByPiCreator: BSP"
-                        + ".ALLOW_BAL; balAllowedByPiCreatorWithHardening: BSP.ALLOW_BAL; "
-                        + "resultIfPiCreatorAllowsBal: null; hasRealCaller: true; "
-                        + "isCallForResult: false; isPendingIntent: false; autoOptInReason: "
-                        + "notPendingIntent; realCallingPackage: uid=1[debugOnly]; "
-                        + "realCallingPackageTargetSdk: -1; realCallingUid: 1; realCallingPid: 1;"
-                        + " realCallingUidHasAnyVisibleWindow: false; realCallingUidProcState: "
-                        + "NONEXISTENT; isRealCallingUidPersistentSystemProcess: false; "
-                        + "originatingPendingIntent: null; realCallerApp: null; "
-                        + "balAllowedByPiSender: BSP.ALLOW_BAL; resultIfPiSenderAllowsBal: null]");
+        assertThat(balState.toString()).contains(
+                "[callingPackage: package.app1; "
+                        + "callingPackageTargetSdk: -1; "
+                        + "callingUid: 10001; "
+                        + "callingPid: 11001; "
+                        + "appSwitchState: 0; "
+                        + "callingUidHasAnyVisibleWindow: false; "
+                        + "callingUidProcState: NONEXISTENT; "
+                        + "isCallingUidPersistentSystemProcess: false; "
+                        + "forcedBalByPiSender: BSP.NONE; "
+                        + "intent: Intent { cmp=package.app3/someClass }; "
+                        + "callerApp: mCallerApp; "
+                        + "inVisibleTask: false; "
+                        + "balAllowedByPiCreator: BSP.ALLOW_BAL; "
+                        + "balAllowedByPiCreatorWithHardening: BSP.ALLOW_BAL; "
+                        + "resultIfPiCreatorAllowsBal: null; "
+                        + "hasRealCaller: true; "
+                        + "isCallForResult: false; "
+                        + "isPendingIntent: false; "
+                        + "autoOptInReason: notPendingIntent; "
+                        + "realCallingPackage: uid=1[debugOnly]; "
+                        + "realCallingPackageTargetSdk: -1; "
+                        + "realCallingUid: 1; "
+                        + "realCallingPid: 1; "
+                        + "realCallingUidHasAnyVisibleWindow: false; "
+                        + "realCallingUidProcState: NONEXISTENT; "
+                        + "isRealCallingUidPersistentSystemProcess: false; "
+                        + "originatingPendingIntent: null; "
+                        + "realCallerApp: null; "
+                        + "balAllowedByPiSender: BSP.ALLOW_BAL; "
+                        + "resultIfPiSenderAllowsBal: null");
     }
 
     @Test
@@ -588,21 +603,36 @@
         assertThat(balState.callerExplicitOptInOrOut()).isFalse();
         assertThat(balState.realCallerExplicitOptInOrAutoOptIn()).isFalse();
         assertThat(balState.realCallerExplicitOptInOrOut()).isFalse();
-        assertThat(balState.toString()).isEqualTo(
-                "[callingPackage: package.app1; callingPackageTargetSdk: -1; callingUid: 10001; "
-                        + "callingPid: 11001; appSwitchState: 0; callingUidHasAnyVisibleWindow: "
-                        + "false; callingUidProcState: NONEXISTENT; "
-                        + "isCallingUidPersistentSystemProcess: false; forcedBalByPiSender: BSP"
-                        + ".NONE; intent: Intent { cmp=package.app3/someClass }; callerApp: "
-                        + "mCallerApp; inVisibleTask: false; balAllowedByPiCreator: BSP"
-                        + ".NONE; balAllowedByPiCreatorWithHardening: BSP.NONE; "
-                        + "resultIfPiCreatorAllowsBal: null; hasRealCaller: true; "
-                        + "isCallForResult: false; isPendingIntent: true; autoOptInReason: "
-                        + "null; realCallingPackage: uid=1[debugOnly]; "
-                        + "realCallingPackageTargetSdk: -1; realCallingUid: 1; realCallingPid: 1;"
-                        + " realCallingUidHasAnyVisibleWindow: false; realCallingUidProcState: "
-                        + "NONEXISTENT; isRealCallingUidPersistentSystemProcess: false; "
-                        + "originatingPendingIntent: PendingIntentRecord; realCallerApp: null; "
-                        + "balAllowedByPiSender: BSP.ALLOW_FGS; resultIfPiSenderAllowsBal: null]");
+        assertThat(balState.toString()).contains(
+                "[callingPackage: package.app1; "
+                        + "callingPackageTargetSdk: -1; "
+                        + "callingUid: 10001; "
+                        + "callingPid: 11001; "
+                        + "appSwitchState: 0; "
+                        + "callingUidHasAnyVisibleWindow: false; "
+                        + "callingUidProcState: NONEXISTENT; "
+                        + "isCallingUidPersistentSystemProcess: false; "
+                        + "forcedBalByPiSender: BSP.NONE; "
+                        + "intent: Intent { cmp=package.app3/someClass }; "
+                        + "callerApp: mCallerApp; "
+                        + "inVisibleTask: false; "
+                        + "balAllowedByPiCreator: BSP.NONE; "
+                        + "balAllowedByPiCreatorWithHardening: BSP.NONE; "
+                        + "resultIfPiCreatorAllowsBal: null; "
+                        + "hasRealCaller: true; "
+                        + "isCallForResult: false; "
+                        + "isPendingIntent: true; "
+                        + "autoOptInReason: null; "
+                        + "realCallingPackage: uid=1[debugOnly]; "
+                        + "realCallingPackageTargetSdk: -1; "
+                        + "realCallingUid: 1; "
+                        + "realCallingPid: 1; "
+                        + "realCallingUidHasAnyVisibleWindow: false; "
+                        + "realCallingUidProcState: NONEXISTENT; "
+                        + "isRealCallingUidPersistentSystemProcess: false; "
+                        + "originatingPendingIntent: PendingIntentRecord; "
+                        + "realCallerApp: null; "
+                        + "balAllowedByPiSender: BSP.ALLOW_FGS; "
+                        + "resultIfPiSenderAllowsBal: null");
     }
 }
diff --git a/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java b/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java
index 887e5ee..e443696 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java
@@ -304,8 +304,7 @@
         mContentRecorder.updateRecording();
 
         // Resize the output surface.
-        final Point newSurfaceSize = new Point(Math.round(mSurfaceSize.x / 2f),
-                Math.round(mSurfaceSize.y * 2));
+        final Point newSurfaceSize = new Point(Math.round(mSurfaceSize.x / 2f), mSurfaceSize.y * 2);
         doReturn(newSurfaceSize).when(mWm.mDisplayManagerInternal).getDisplaySurfaceDefaultSize(
                 anyInt());
         mContentRecorder.onConfigurationChanged(
diff --git a/services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java b/services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java
index 4060d40..353ba01 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java
@@ -29,7 +29,10 @@
 import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.RESULT_SKIP;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 
 import android.graphics.Rect;
 import android.platform.test.annotations.DisableFlags;
@@ -44,6 +47,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
 
 /**
  * Tests for desktop mode task bounds.
@@ -58,6 +62,7 @@
 
     private ActivityRecord mActivity;
 
+    @Mock
     private DesktopModeLaunchParamsModifier mTarget;
 
     private LaunchParamsController.LaunchParams mCurrent;
@@ -66,7 +71,8 @@
     @Before
     public void setUp() throws Exception {
         mActivity = new ActivityBuilder(mAtm).build();
-        mTarget = new DesktopModeLaunchParamsModifier();
+        mTarget = spy(new DesktopModeLaunchParamsModifier(mContext));
+        doReturn(true).when(mTarget).isDesktopModeSupported(any());
         mCurrent = new LaunchParamsController.LaunchParams();
         mCurrent.reset();
         mResult = new LaunchParamsController.LaunchParams();
@@ -81,6 +87,21 @@
 
     @Test
     @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
+    public void testReturnsContinueIfDesktopWindowingIsEnabledOnUnsupportedDevice() {
+        doReturn(false).when(mTarget).isDesktopModeSupported(any());
+        assertEquals(RESULT_CONTINUE, new CalculateRequestBuilder().setTask(null).calculate());
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
+    public void testReturnsDoneIfDesktopWindowingIsEnabledAndUnsupportedDeviceOverridden() {
+        doReturn(false).when(mTarget).enforceDeviceRestrictions();
+        final Task task = new TaskBuilder(mSupervisor).build();
+        assertEquals(RESULT_DONE, new CalculateRequestBuilder().setTask(task).calculate());
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
     public void testReturnsSkipIfTaskIsNull() {
         assertEquals(RESULT_SKIP, new CalculateRequestBuilder().setTask(null).calculate());
     }
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java
index b11f9b2..073b551 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java
@@ -31,6 +31,7 @@
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.when;
 
+import android.os.Message;
 import android.platform.test.annotations.Presubmit;
 import android.view.DisplayInfo;
 
@@ -60,6 +61,8 @@
     private int mColorMode;
     private int mLogicalDensityDpi;
 
+    private final Message mScreenUnblocker = mock(Message.class);
+
     @Override
     protected void onBeforeSystemServicesCreated() {
         // Set other flags to their default values
@@ -73,12 +76,11 @@
         doReturn(true).when(mDisplayContent).getLastHasContent();
         mockTransitionsController(/* enabled= */ true);
         mockRemoteDisplayChangeController();
+        performInitialDisplayUpdate();
     }
 
     @Test
     public void testUpdate_deferrableFieldChangedTransitionStarted_deferrableFieldUpdated() {
-        performInitialDisplayUpdate();
-
         mUniqueId = "old";
         Runnable onUpdated = mock(Runnable.class);
         mDisplayContent.requestDisplayUpdate(onUpdated);
@@ -107,8 +109,6 @@
 
     @Test
     public void testUpdate_nonDeferrableUpdateAndTransitionDeferred_nonDeferrableFieldUpdated() {
-        performInitialDisplayUpdate();
-
         // Update only color mode (non-deferrable field) and keep the same unique id
         mUniqueId = "initial_unique_id";
         mColorMode = 123;
@@ -121,8 +121,6 @@
 
     @Test
     public void testUpdate_nonDeferrableUpdateTwiceAndTransitionDeferred_fieldHasLatestValue() {
-        performInitialDisplayUpdate();
-
         // Update only color mode (non-deferrable field) and keep the same unique id
         mUniqueId = "initial_unique_id";
         mColorMode = 123;
@@ -163,7 +161,6 @@
 
     @Test
     public void testUpdate_deferrableFieldUpdatedTransitionPending_fieldNotUpdated() {
-        performInitialDisplayUpdate();
         mUniqueId = "old";
         Runnable onUpdated = mock(Runnable.class);
         mDisplayContent.requestDisplayUpdate(onUpdated);
@@ -181,7 +178,6 @@
 
     @Test
     public void testTwoDisplayUpdates_transitionStarted_displayUpdated() {
-        performInitialDisplayUpdate();
         mUniqueId = "old";
         Runnable onUpdated = mock(Runnable.class);
         mDisplayContent.requestDisplayUpdate(onUpdated);
@@ -212,6 +208,51 @@
         assertThat(mDisplayContent.getDisplayInfo().uniqueId).isEqualTo("new2");
     }
 
+    @Test
+    public void testWaitForTransition_displaySwitching_waitsForTransitionToBeStarted() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_WAIT_FOR_TRANSITION_ON_DISPLAY_SWITCH);
+        mDisplayContent.mDisplayUpdater.onDisplaySwitching(/* switching= */ true);
+        boolean willWait = mDisplayContent.mDisplayUpdater.waitForTransition(mScreenUnblocker);
+        assertThat(willWait).isTrue();
+        mUniqueId = "new";
+        mDisplayContent.requestDisplayUpdate(mock(Runnable.class));
+        when(mDisplayContent.mTransitionController.inTransition()).thenReturn(true);
+        captureStartTransitionCollection().getValue().onCollectStarted(/* deferred= */ true);
+
+        // Verify that screen is not unblocked yet as the start transaction hasn't been presented
+        verify(mScreenUnblocker, never()).sendToTarget();
+
+        when(mDisplayContent.mTransitionController.inTransition()).thenReturn(false);
+        final Transition transition = captureRequestedTransition().getValue();
+        makeTransitionTransactionCompleted(transition);
+
+        // Verify that screen is unblocked as start transaction of the transition
+        // has been completed
+        verify(mScreenUnblocker).sendToTarget();
+    }
+
+    @Test
+    public void testWaitForTransition_displayNotSwitching_doesNotWait() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_WAIT_FOR_TRANSITION_ON_DISPLAY_SWITCH);
+        mDisplayContent.mDisplayUpdater.onDisplaySwitching(/* switching= */ false);
+
+        boolean willWait = mDisplayContent.mDisplayUpdater.waitForTransition(mScreenUnblocker);
+
+        assertThat(willWait).isFalse();
+        verify(mScreenUnblocker, never()).sendToTarget();
+    }
+
+    @Test
+    public void testWaitForTransition_displayIsSwitchingButFlagDisabled_doesNotWait() {
+        mSetFlagsRule.disableFlags(Flags.FLAG_WAIT_FOR_TRANSITION_ON_DISPLAY_SWITCH);
+        mDisplayContent.mDisplayUpdater.onDisplaySwitching(/* switching= */ true);
+
+        boolean willWait = mDisplayContent.mDisplayUpdater.waitForTransition(mScreenUnblocker);
+
+        assertThat(willWait).isFalse();
+        verify(mScreenUnblocker, never()).sendToTarget();
+    }
+
     private void mockTransitionsController(boolean enabled) {
         spyOn(mDisplayContent.mTransitionController);
         when(mDisplayContent.mTransitionController.isShellTransitionsEnabled()).thenReturn(enabled);
@@ -233,6 +274,23 @@
         return callbackCaptor;
     }
 
+    private ArgumentCaptor<Transition> captureRequestedTransition() {
+        ArgumentCaptor<Transition> callbackCaptor =
+                ArgumentCaptor.forClass(Transition.class);
+        verify(mDisplayContent.mTransitionController, atLeast(1))
+                .requestStartTransition(callbackCaptor.capture(), any(), any(), any());
+        return callbackCaptor;
+    }
+
+    private void makeTransitionTransactionCompleted(Transition transition) {
+        if (transition.mTransactionCompletedListeners != null) {
+            for (int i = 0; i < transition.mTransactionCompletedListeners.size(); i++) {
+                final Runnable listener = transition.mTransactionCompletedListeners.get(i);
+                listener.run();
+            }
+        }
+    }
+
     private void performInitialDisplayUpdate() {
         mUniqueId = "initial_unique_id";
         mColorMode = 0;
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java
index 0a59ae1..137ef5e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyInsetsTests.java
@@ -29,6 +29,8 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.window.flags.Flags;
+
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ErrorCollector;
@@ -142,12 +144,20 @@
 
     private void verifyStableInsets(DisplayInfo di, int left, int top,
             int right, int bottom) {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO: update the verification to match the new behavior.
+            return;
+        }
         mErrorCollector.checkThat("stableInsets", getStableInsets(di),
                 equalTo(new Rect(left, top, right, bottom)));
     }
 
     private void verifyNonDecorInsets(DisplayInfo di, int left, int top,
             int right, int bottom) {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO: update the verification to match the new behavior.
+            return;
+        }
         mErrorCollector.checkThat("nonDecorInsets",
                 getNonDecorInsets(di), equalTo(new Rect(left, top, right, bottom)));
     }
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 5965fae..c77a4d6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
@@ -70,6 +70,8 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.window.flags.Flags;
+
 import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -411,6 +413,10 @@
 
     @Test
     public void testUpdateDisplayConfigurationByDecor() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // No configuration update when flag enables.
+            return;
+        }
         doReturn(NO_CUTOUT).when(mDisplayContent).calculateDisplayCutoutForRotation(anyInt());
         final WindowState navbar = createNavBarWithProvidedInsets(mDisplayContent);
         final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
diff --git a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
index faa6d97..7380aec 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
@@ -16,8 +16,6 @@
 
 package com.android.server.wm;
 
-import static android.view.InsetsSource.ID_IME;
-import static android.view.WindowInsets.Type.ime;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
 import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
 
@@ -26,7 +24,6 @@
 
 import android.graphics.PixelFormat;
 import android.platform.test.annotations.Presubmit;
-import android.view.InsetsSource;
 import android.view.inputmethod.ImeTracker;
 
 import androidx.test.filters.SmallTest;
@@ -46,57 +43,148 @@
 @RunWith(WindowTestRunner.class)
 public class ImeInsetsSourceProviderTest extends WindowTestsBase {
 
-    private InsetsSource mImeSource = new InsetsSource(ID_IME, ime());
     private ImeInsetsSourceProvider mImeProvider;
 
     @Before
     public void setUp() throws Exception {
-        mImeSource.setVisible(true);
-        mImeProvider = new ImeInsetsSourceProvider(mImeSource,
-                mDisplayContent.getInsetsStateController(), mDisplayContent);
+        mImeProvider = mDisplayContent.getInsetsStateController().getImeSourceProvider();
+        mImeProvider.getSource().setVisible(true);
     }
 
     @Test
     public void testTransparentControlTargetWindowCanShowIme() {
+        final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
+        makeWindowVisibleAndDrawn(ime);
+        mImeProvider.setWindowContainer(ime, null, null);
+
         final WindowState appWin = createWindow(null, TYPE_APPLICATION, "app");
         final WindowState popup = createWindow(appWin, TYPE_APPLICATION, "popup");
-        mDisplayContent.setImeControlTarget(popup);
-        mDisplayContent.setImeLayeringTarget(appWin);
         popup.mAttrs.format = PixelFormat.TRANSPARENT;
+        mDisplayContent.setImeLayeringTarget(appWin);
+        mDisplayContent.updateImeInputAndControlTarget(popup);
+        performSurfacePlacementAndWaitForWindowAnimator();
+
         mImeProvider.scheduleShowImePostLayout(appWin, ImeTracker.Token.empty());
         assertTrue(mImeProvider.isReadyToShowIme());
     }
 
+    /**
+     * Checks that scheduling with all the state set and manually triggering the show does succeed.
+     */
     @Test
-    public void testInputMethodInputTargetCanShowIme() {
-        WindowState target = createWindow(null, TYPE_APPLICATION, "app");
-        mDisplayContent.setImeLayeringTarget(target);
-        mDisplayContent.updateImeInputAndControlTarget(target);
-        mImeProvider.scheduleShowImePostLayout(target, ImeTracker.Token.empty());
-        assertTrue(mImeProvider.isReadyToShowIme());
-    }
-
-    @Test
-    public void testIsImeShowing() {
-        WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
+    public void testScheduleShowIme() {
+        final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
         makeWindowVisibleAndDrawn(ime);
         mImeProvider.setWindowContainer(ime, null, null);
 
-        WindowState target = createWindow(null, TYPE_APPLICATION, "app");
+        final WindowState target = createWindow(null, TYPE_APPLICATION, "app");
         mDisplayContent.setImeLayeringTarget(target);
-        mDisplayContent.setImeControlTarget(target);
+        mDisplayContent.updateImeInputAndControlTarget(target);
+        performSurfacePlacementAndWaitForWindowAnimator();
 
+        // Schedule (without triggering) after everything is ready.
         mImeProvider.scheduleShowImePostLayout(target, ImeTracker.Token.empty());
+        assertTrue(mImeProvider.isReadyToShowIme());
         assertFalse(mImeProvider.isImeShowing());
+
+        // Manually trigger the show.
         mImeProvider.checkShowImePostLayout();
+        // No longer ready as it was already shown.
+        assertFalse(mImeProvider.isReadyToShowIme());
         assertTrue(mImeProvider.isImeShowing());
-        mImeProvider.setImeShowing(false);
+    }
+
+    /**
+     * Checks that scheduling to show before any state is set does succeed when
+     * all the state becomes available.
+     */
+    @Test
+    public void testScheduleShowIme_noInitialState() {
+        final WindowState target = createWindow(null, TYPE_APPLICATION, "app");
+
+        // Schedule before anything is ready.
+        mImeProvider.scheduleShowImePostLayout(target, ImeTracker.Token.empty());
+        assertFalse(mImeProvider.isReadyToShowIme());
         assertFalse(mImeProvider.isImeShowing());
+
+        final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
+        makeWindowVisibleAndDrawn(ime);
+        mImeProvider.setWindowContainer(ime, null, null);
+
+        mDisplayContent.setImeLayeringTarget(target);
+        mDisplayContent.updateImeInputAndControlTarget(target);
+        // Performing surface placement picks up the show scheduled above.
+        performSurfacePlacementAndWaitForWindowAnimator();
+        // No longer ready as it was already shown.
+        assertFalse(mImeProvider.isReadyToShowIme());
+        assertTrue(mImeProvider.isImeShowing());
+    }
+
+    /**
+     * Checks that scheduling to show before starting the {@code afterPrepareSurfacesRunnable}
+     * from {@link InsetsStateController#notifyPendingInsetsControlChanged}
+     * does continue and succeed when the runnable is started.
+     */
+    @Test
+    public void testScheduleShowIme_delayedAfterPrepareSurfaces() {
+        final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
+        makeWindowVisibleAndDrawn(ime);
+        mImeProvider.setWindowContainer(ime, null, null);
+
+        final WindowState target = createWindow(null, TYPE_APPLICATION, "app");
+        mDisplayContent.setImeLayeringTarget(target);
+        mDisplayContent.updateImeInputAndControlTarget(target);
+
+        // Schedule before starting the afterPrepareSurfacesRunnable.
+        mImeProvider.scheduleShowImePostLayout(target, ImeTracker.Token.empty());
+        assertFalse(mImeProvider.isReadyToShowIme());
+        assertFalse(mImeProvider.isImeShowing());
+
+        // This tries to pick up the show scheduled above, but must fail as the
+        // afterPrepareSurfacesRunnable was not started yet.
+        mDisplayContent.applySurfaceChangesTransaction();
+        assertFalse(mImeProvider.isReadyToShowIme());
+        assertFalse(mImeProvider.isImeShowing());
+
+        // Starting the afterPrepareSurfacesRunnable picks up the show scheduled above.
+        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();
+        // No longer ready as it was already shown.
+        assertFalse(mImeProvider.isReadyToShowIme());
+        assertTrue(mImeProvider.isImeShowing());
+    }
+
+    /**
+     * Checks that scheduling to show before the surface placement does continue and succeed
+     * when the surface placement happens.
+     */
+    @Test
+    public void testScheduleShowIme_delayedSurfacePlacement() {
+        final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
+        makeWindowVisibleAndDrawn(ime);
+        mImeProvider.setWindowContainer(ime, null, null);
+
+        final WindowState target = createWindow(null, TYPE_APPLICATION, "app");
+        mDisplayContent.setImeLayeringTarget(target);
+        mDisplayContent.updateImeInputAndControlTarget(target);
+
+        // Schedule before surface placement.
+        mImeProvider.scheduleShowImePostLayout(target, ImeTracker.Token.empty());
+        assertFalse(mImeProvider.isReadyToShowIme());
+        assertFalse(mImeProvider.isImeShowing());
+
+        // Performing surface placement picks up the show scheduled above, and succeeds.
+        // This first executes the afterPrepareSurfacesRunnable, and then
+        // applySurfaceChangesTransaction. Both of them try to trigger the show,
+        // but only the second one can succeed, as it comes after onPostLayout.
+        performSurfacePlacementAndWaitForWindowAnimator();
+        // No longer ready as it was already shown.
+        assertFalse(mImeProvider.isReadyToShowIme());
+        assertTrue(mImeProvider.isImeShowing());
     }
 
     @Test
     public void testSetFrozen() {
-        WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
+        final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, "ime");
         makeWindowVisibleAndDrawn(ime);
         mImeProvider.setWindowContainer(ime, null, null);
         mImeProvider.setServerVisible(true);
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
index 4034dbc..2a025cd 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java
@@ -24,6 +24,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -163,6 +164,48 @@
     }
 
     @Test
+    public void testGetLeash() {
+        final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
+        final WindowState target = createWindow(null, TYPE_APPLICATION, "target");
+        final WindowState fakeTarget = createWindow(null, TYPE_APPLICATION, "fakeTarget");
+        final WindowState otherTarget = createWindow(null, TYPE_APPLICATION, "otherTarget");
+        statusBar.getFrame().set(0, 0, 500, 100);
+
+        // We must not have control or control target before we have the insets source window,
+        // so also no leash.
+        mProvider.updateControlForTarget(target, true /* force */);
+        assertNull(mProvider.getControl(target));
+        assertNull(mProvider.getControlTarget());
+        assertNull(mProvider.getLeash(target));
+
+        // We can have the control or the control target after we have the insets source window,
+        // but no leash as this is not yet ready for dispatching.
+        mProvider.setWindowContainer(statusBar, null, null);
+        mProvider.updateControlForTarget(target, false /* force */);
+        assertNotNull(mProvider.getControl(target));
+        assertNotNull(mProvider.getControlTarget());
+        assertEquals(mProvider.getControlTarget(), target);
+        assertNull(mProvider.getLeash(target));
+
+        // After surface transactions are applied, the leash is ready for dispatching.
+        mProvider.onSurfaceTransactionApplied();
+        assertNotNull(mProvider.getLeash(target));
+
+        // We do have fake control for the fake control target, but that has no leash.
+        mProvider.updateFakeControlTarget(fakeTarget);
+        assertNotNull(mProvider.getControl(fakeTarget));
+        assertNotNull(mProvider.getFakeControlTarget());
+        assertNotEquals(mProvider.getControlTarget(), fakeTarget);
+        assertNull(mProvider.getLeash(fakeTarget));
+
+        // We don't have any control for a different (non-fake control target), so also no leash.
+        assertNull(mProvider.getControl(otherTarget));
+        assertNotNull(mProvider.getControlTarget());
+        assertNotEquals(mProvider.getControlTarget(), otherTarget);
+        assertNull(mProvider.getLeash(otherTarget));
+    }
+
+    @Test
     public void testUpdateSourceFrame() {
         final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
         mProvider.setWindowContainer(statusBar, null, null);
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 2085d61..0e1a1af 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
@@ -552,6 +552,24 @@
                 control2.getInsetsHint().bottom);
     }
 
+    @Test
+    public void testHasPendingControls() {
+        final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar");
+        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars())
+                .setWindowContainer(statusBar, null, null);
+        // No controls dispatched yet.
+        assertFalse(getController().hasPendingControls(app));
+
+        getController().onBarControlTargetChanged(app, null, null, null);
+        // Controls pending to be dispatched.
+        assertTrue(getController().hasPendingControls(app));
+
+        performSurfacePlacementAndWaitForWindowAnimator();
+        // Pending controls were dispatched.
+        assertFalse(getController().hasPendingControls(app));
+    }
+
     /** Creates a window which is associated with ActivityRecord. */
     private WindowState createTestWindow(String name) {
         final WindowState win = createWindow(null, TYPE_APPLICATION, name);
diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
index 4e4bbfe..5aabea3 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
@@ -21,6 +21,7 @@
 import static android.content.pm.ActivityInfo.OVERRIDE_ANY_ORIENTATION;
 import static android.content.pm.ActivityInfo.OVERRIDE_ANY_ORIENTATION_TO_USER;
 import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION;
+import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT;
 import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH;
 import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE;
 import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS;
@@ -63,6 +64,7 @@
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
 import static com.android.server.wm.LetterboxUiController.MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP;
 import static com.android.server.wm.LetterboxUiController.SET_ORIENTATION_REQUEST_COUNTER_TIMEOUT_MS;
+import static com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -101,11 +103,11 @@
 import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 
- /**
+/**
  * Test class for {@link LetterboxUiControllerTest}.
  *
  * Build/Install/Run:
- *  atest WmTests:LetterboxUiControllerTest
+ * atest WmTests:LetterboxUiControllerTest
  */
 @SmallTest
 @Presubmit
@@ -466,10 +468,48 @@
         assertTrue(mController.shouldForceRotateForCameraCompat());
     }
 
+    // shouldApplyFreeformTreatmentForCameraCompat
+
+    @Test
+    public void testShouldApplyCameraCompatFreeformTreatment_flagIsDisabled_returnsFalse() {
+        mSetFlagsRule.disableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM);
+
+        assertFalse(mController.shouldApplyFreeformTreatmentForCameraCompat());
+    }
+
+    @Test
+    @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT})
+    public void testShouldApplyCameraCompatFreeformTreatment_overrideEnabled_returnsFalse() {
+        mSetFlagsRule.enableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM);
+
+        assertFalse(mController.shouldApplyFreeformTreatmentForCameraCompat());
+    }
+
+    @Test
+    @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT})
+    public void testShouldApplyCameraCompatFreeformTreatment_disabledByOverride_returnsFalse()
+            throws Exception {
+        mSetFlagsRule.enableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM);
+
+        mController = new LetterboxUiController(mWm, mActivity);
+
+        assertFalse(mController.shouldApplyFreeformTreatmentForCameraCompat());
+    }
+
+    @Test
+    public void testShouldApplyCameraCompatFreeformTreatment_notDisabledByOverride_returnsTrue()
+            throws Exception {
+        mSetFlagsRule.enableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM);
+
+        mController = new LetterboxUiController(mWm, mActivity);
+
+        assertTrue(mController.shouldApplyFreeformTreatmentForCameraCompat());
+    }
+
     @Test
     public void testGetCropBoundsIfNeeded_handleCropForTransparentActivityBasedOnOpaqueBounds() {
         final InsetsSource taskbar = new InsetsSource(/*id=*/ 0,
-                 WindowInsets.Type.navigationBars());
+                WindowInsets.Type.navigationBars());
         taskbar.setFlags(FLAG_INSETS_ROUNDED_CORNER, FLAG_INSETS_ROUNDED_CORNER);
         final WindowState mainWindow = mockForGetCropBoundsAndRoundedCorners(taskbar);
         final Rect opaqueBounds = new Rect(0, 0, 500, 300);
@@ -726,7 +766,7 @@
             throws Exception {
         mDisplayContent.setIgnoreOrientationRequest(false);
         assertEquals(SCREEN_ORIENTATION_PORTRAIT, mController.overrideOrientationIfNeeded(
-             /* candidate */ SCREEN_ORIENTATION_PORTRAIT));
+                /* candidate */ SCREEN_ORIENTATION_PORTRAIT));
     }
 
     @Test
@@ -736,7 +776,7 @@
         prepareActivityThatShouldApplyUserMinAspectRatioOverride();
 
         assertEquals(SCREEN_ORIENTATION_PORTRAIT, mController.overrideOrientationIfNeeded(
-             /* candidate */ SCREEN_ORIENTATION_PORTRAIT));
+                /* candidate */ SCREEN_ORIENTATION_PORTRAIT));
     }
 
     @Test
@@ -859,6 +899,7 @@
         assertEquals(SCREEN_ORIENTATION_USER, mController.overrideOrientationIfNeeded(
                 /* candidate */ SCREEN_ORIENTATION_UNSPECIFIED));
     }
+
     @Test
     public void testOverrideOrientationIfNeeded_respectOrientationRequestOverUserFullScreen() {
         spyOn(mController);
@@ -1380,7 +1421,7 @@
 
     private void mockThatProperty(String propertyName, boolean value) throws Exception {
         Property property = new Property(propertyName, /* value */ value, /* packageName */ "",
-                 /* className */ "");
+                /* className */ "");
         PackageManager pm = mWm.mContext.getPackageManager();
         spyOn(pm);
         doReturn(property).when(pm).getProperty(eq(propertyName), anyString());
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 bfa191e..75b84d1 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
@@ -1472,7 +1472,6 @@
         assertSecurityException(expectCallable, () -> mAtm.registerTaskStackListener(null));
         assertSecurityException(expectCallable,
                 () -> mAtm.unregisterTaskStackListener(null));
-        assertSecurityException(expectCallable, () -> mAtm.getTaskDescription(0));
         assertSecurityException(expectCallable, () -> mAtm.cancelTaskWindowTransition(0));
         assertSecurityException(expectCallable, () -> mAtm.startRecentsActivity(null, 0,
                 null));
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 b96f39d..856ad2a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -123,6 +123,7 @@
 import com.android.internal.statusbar.LetterboxDetails;
 import com.android.server.statusbar.StatusBarManagerInternal;
 import com.android.server.wm.DeviceStateController.DeviceState;
+import com.android.window.flags.Flags;
 
 import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges;
 import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges;
@@ -703,6 +704,11 @@
 
     @Test
     public void testFixedAspectRatioBoundsWithDecorInSquareDisplay() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         final int notchHeight = 100;
         setUpApp(new TestDisplayContent.Builder(mAtm, 600, 800).setNotch(notchHeight).build());
 
@@ -922,6 +928,17 @@
     }
 
     @Test
+    public void testIsLetterboxed_activityFromBubble_returnsFalse() {
+        setUpDisplaySizeWithApp(1000, 2500);
+        mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+        spyOn(mActivity);
+        doReturn(true).when(mActivity).getLaunchedFromBubble();
+        prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE);
+
+        assertFalse(mActivity.areBoundsLetterboxed());
+    }
+
+    @Test
     public void testAspectRatioMatchParentBoundsAndImeAttachable() {
         setUpApp(new TestDisplayContent.Builder(mAtm, 1000, 2000).build());
         prepareUnresizable(mActivity, 2f /* maxAspect */, SCREEN_ORIENTATION_UNSPECIFIED);
@@ -944,6 +961,11 @@
 
     @Test
     public void testMoveToDifferentOrientationDisplay() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         setUpDisplaySizeWithApp(1000, 2500);
         prepareUnresizable(mActivity, -1.f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT);
         assertFitted();
@@ -991,6 +1013,11 @@
 
     @Test
     public void testFixedOrientationRotateCutoutDisplay() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         // Create a display with a notch/cutout
         final int notchHeight = 60;
         final int width = 1000;
@@ -1587,6 +1614,11 @@
     @EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO,
             ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_MEDIUM})
     public void testOverrideMinAspectRatioLowerThanManifest() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1400, 1800)
                 .setNotch(200).setSystemDecorations(true).build();
         mTask = new TaskBuilder(mSupervisor).setDisplay(display).build();
@@ -1934,6 +1966,11 @@
 
     @Test
     public void testLaunchWithFixedRotationTransform() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         final int dw = 1000;
         final int dh = 2500;
         final int notchHeight = 200;
@@ -3757,6 +3794,11 @@
 
     @Test
     public void testLetterboxDetailsForStatusBar_letterboxNotOverlappingStatusBar() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         // Align to center so that we don't overlap with the status bar
         mAtm.mWindowManager.mLetterboxConfiguration.setLetterboxVerticalPositionMultiplier(0.5f);
         final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2800)
@@ -4076,6 +4118,11 @@
 
     @Test
     public void testPortraitCloseToSquareDisplayWithTaskbar_notLetterboxed() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         // Set up portrait close to square display
         setUpDisplaySizeWithApp(2200, 2280);
         final DisplayContent display = mActivity.mDisplayContent;
@@ -4102,6 +4149,11 @@
 
     @Test
     public void testApplyAspectRatio_activityAlignWithParentAppVertical() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         // The display's app bounds will be (0, 100, 1000, 2350)
         final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2500)
                 .setCanRotate(false)
@@ -4116,6 +4168,11 @@
     }
     @Test
     public void testApplyAspectRatio_activityCannotAlignWithParentAppVertical() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         // The display's app bounds will be (0, 100, 1000, 2150)
         final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2300)
                 .setCanRotate(false)
@@ -4131,6 +4188,11 @@
 
     @Test
     public void testApplyAspectRatio_activityAlignWithParentAppHorizontal() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         // The display's app bounds will be (100, 0, 2350, 1000)
         final DisplayContent display = new TestDisplayContent.Builder(mAtm, 2500, 1000)
                 .setCanRotate(false)
@@ -4145,6 +4207,11 @@
     }
     @Test
     public void testApplyAspectRatio_activityCannotAlignWithParentAppHorizontal() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         // The display's app bounds will be (100, 0, 2150, 1000)
         final DisplayContent display = new TestDisplayContent.Builder(mAtm, 2300, 1000)
                 .setCanRotate(false)
@@ -4393,6 +4460,11 @@
 
     @Test
     public void testUpdateResolvedBoundsPosition_alignToTop() {
+        if (Flags.insetsDecoupledConfiguration()) {
+            // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config
+            //  bounds no longer contains display cutout.
+            return;
+        }
         final int notchHeight = 100;
         final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2800)
                 .setNotch(notchHeight)
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java
index 6b1bf26bf..3c5b12c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java
@@ -898,6 +898,32 @@
         }
     }
 
+    @Test
+    public void testSetResumedActivity() {
+        // Setup two activities in ActivityEmbedding split.
+        final Task task = createTask(mDisplayContent);
+        final TaskFragment taskFragmentLeft = new TaskFragmentBuilder(mAtm)
+                .setParentTask(task)
+                .createActivityCount(1)
+                .build();
+        final TaskFragment taskFragmentRight = new TaskFragmentBuilder(mAtm)
+                .setParentTask(task)
+                .createActivityCount(1)
+                .build();
+        taskFragmentRight.setAdjacentTaskFragment(taskFragmentLeft);
+        taskFragmentLeft.setAdjacentTaskFragment(taskFragmentRight);
+        final ActivityRecord appLeftTop = taskFragmentLeft.getTopMostActivity();
+        final ActivityRecord appRightTop = taskFragmentRight.getTopMostActivity();
+
+        // Ensure the focused app is updated when the right activity resumed.
+        taskFragmentRight.setResumedActivity(appRightTop, "test");
+        assertEquals(appRightTop, task.getDisplayContent().mFocusedApp);
+
+        // Ensure the focused app is updated when the left activity resumed.
+        taskFragmentLeft.setResumedActivity(appLeftTop, "test");
+        assertEquals(appLeftTop, task.getDisplayContent().mFocusedApp);
+    }
+
     private WindowState createAppWindow(ActivityRecord app, String name) {
         final WindowState win = createWindow(null, TYPE_BASE_APPLICATION, app, name,
                 0 /* ownerId */, false /* ownerCanAddInternalSystemWindow */, new TestIWindow());
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 a88680a..1ca808f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
@@ -1960,6 +1960,27 @@
         verify(task).startPausing(eq(true) /* userLeaving */, anyBoolean(), any(), any());
     }
 
+    @Test
+    public void testGetBottomMostActivityInSamePackage() {
+        final String packageName = "homePackage";
+        final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
+        final Task task = new TaskBuilder(mSupervisor).setCreateActivity(false).build();
+        task.realActivity = new ComponentName(packageName, packageName + ".root_activity");
+        doNothing().when(task).sendTaskFragmentParentInfoChangedIfNeeded();
+
+        final TaskFragment fragment1 = createTaskFragmentWithEmbeddedActivity(task, organizer);
+        final ActivityRecord activityDifferentPackage =
+                new ActivityBuilder(mAtm).setTask(task).build();
+        final ActivityRecord activitySamePackage =
+                new ActivityBuilder(mAtm)
+                        .setComponent(new ComponentName(packageName, packageName + ".activity2"))
+                        .setTask(task).build();
+
+        assertEquals(fragment1.getChildAt(0), task.getBottomMostActivity());
+        assertEquals(activitySamePackage, task.getBottomMostActivityInSamePackage());
+        assertNotEquals(activityDifferentPackage, task.getBottomMostActivityInSamePackage());
+    }
+
     private Task getTestTask() {
         return new TaskBuilder(mSupervisor).setCreateActivity(true).build();
     }
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 1233686..00a8842 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -167,6 +167,10 @@
     }
 
     @Override
+    public void onDisplaySwitchStart(int displayId) {
+    }
+
+    @Override
     public boolean okToAnimate(boolean ignoreScreenOn) {
         return mOkToAnimate;
     }
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 ff7129c..0186006 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -64,8 +64,10 @@
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.doAnswer;
 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;
@@ -2368,9 +2370,7 @@
         assertTrue(transitA.isCollecting());
 
         // finish collecting A
-        transitA.start();
-        transitA.setAllReady();
-        mSyncEngine.tryFinishForTest(transitA.getSyncId());
+        tryFinishTransitionSyncSet(transitA);
         waitUntilHandlersIdle();
 
         assertTrue(transitA.isPlaying());
@@ -2476,6 +2476,36 @@
     }
 
     @Test
+    public void testDeferredMoveTaskToBack() {
+        final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build();
+        final Task task = activity.getTask();
+        registerTestTransitionPlayer();
+        final TransitionController controller = mWm.mRoot.mTransitionController;
+        mSyncEngine = createTestBLASTSyncEngine();
+        controller.setSyncEngine(mSyncEngine);
+        final Transition transition = createTestTransition(TRANSIT_CHANGE, controller);
+        controller.moveToCollecting(transition);
+        task.moveTaskToBack(task);
+        // Actual action will be deferred by current transition.
+        verify(task, never()).moveToBack(any(), any());
+
+        tryFinishTransitionSyncSet(transition);
+        waitUntilHandlersIdle();
+        // Continue to move task to back after the transition is done.
+        verify(task).moveToBack(any(), any());
+        final Transition moveBackTransition = controller.getCollectingTransition();
+        assertNotNull(moveBackTransition);
+        moveBackTransition.abort();
+
+        // The move-to-back can be collected in to a collecting OPEN transition.
+        clearInvocations(task);
+        final Transition transition2 = createTestTransition(TRANSIT_OPEN, controller);
+        controller.moveToCollecting(transition2);
+        task.moveTaskToBack(task);
+        verify(task).moveToBack(any(), any());
+    }
+
+    @Test
     public void testNoSyncFlagIfOneTrack() {
         final TransitionController controller = mAtm.getTransitionController();
         final TestTransitionPlayer player = registerTestTransitionPlayer();
@@ -2492,17 +2522,11 @@
         controller.startCollectOrQueue(transitC, (deferred) -> {});
 
         // Verify that, as-long as there is <= 1 track, we won't get a SYNC flag
-        transitA.start();
-        transitA.setAllReady();
-        mSyncEngine.tryFinishForTest(transitA.getSyncId());
+        tryFinishTransitionSyncSet(transitA);
         assertTrue((player.mLastReady.getFlags() & FLAG_SYNC) == 0);
-        transitB.start();
-        transitB.setAllReady();
-        mSyncEngine.tryFinishForTest(transitB.getSyncId());
+        tryFinishTransitionSyncSet(transitB);
         assertTrue((player.mLastReady.getFlags() & FLAG_SYNC) == 0);
-        transitC.start();
-        transitC.setAllReady();
-        mSyncEngine.tryFinishForTest(transitC.getSyncId());
+        tryFinishTransitionSyncSet(transitC);
         assertTrue((player.mLastReady.getFlags() & FLAG_SYNC) == 0);
     }
 
@@ -2642,6 +2666,12 @@
         assertEquals("reason1", condition1.mAlternate);
     }
 
+    private void tryFinishTransitionSyncSet(Transition transition) {
+        transition.setAllReady();
+        transition.start();
+        mSyncEngine.tryFinishForTest(transition.getSyncId());
+    }
+
     private static void makeTaskOrganized(Task... tasks) {
         final ITaskOrganizer organizer = mock(ITaskOrganizer.class);
         for (Task t : tasks) {
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 55a00fc..48fc2dc 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -799,6 +799,7 @@
         verify(child).onConfigurationChanged(any());
     }
 
+    @SuppressWarnings("SelfComparison")
     @Test
     public void testCompareTo() {
         final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
index 48b12f7..ec2c968 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
@@ -28,6 +28,7 @@
 import static android.view.flags.Flags.FLAG_SENSITIVE_CONTENT_APP_PROTECTION;
 import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
 import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
+import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SENSITIVE_FOR_TRACING;
 import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SPY;
 import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;
@@ -100,6 +101,7 @@
 import android.view.WindowInsets;
 import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
+import android.view.WindowManagerGlobal;
 import android.window.ActivityWindowInfo;
 import android.window.ClientWindowFrames;
 import android.window.InputTransferToken;
@@ -243,15 +245,6 @@
     }
 
     @Test
-    public void testDismissKeyguardCanWakeUp() {
-        doReturn(true).when(mWm).checkCallingPermission(anyString(), anyString());
-        doReturn(true).when(mWm.mAtmService.mKeyguardController).isShowingDream();
-        doNothing().when(mWm.mAtmService.mTaskSupervisor).wakeUp(anyString());
-        mWm.dismissKeyguard(null, "test-dismiss-keyguard");
-        verify(mWm.mAtmService.mTaskSupervisor).wakeUp(anyString());
-    }
-
-    @Test
     public void testTrackOverlayWindow() {
         final WindowProcessController wpc = mSystemServicesTestRule.addProcess(
                 "pkgName", "processName", 1000 /* pid */, Process.SYSTEM_UID);
@@ -319,7 +312,8 @@
         // Non activity window can still get the last config.
         win.mActivityRecord = null;
         win.fillClientWindowFramesAndConfiguration(outFrames, outConfig,
-                false /* useLatestConfig */, true /* relayoutVisible */);
+                null /* outActivityWindowInfo*/, false /* useLatestConfig */,
+                true /* relayoutVisible */);
         assertEquals(win.getConfiguration().densityDpi,
                 outConfig.getMergedConfiguration().densityDpi);
     }
@@ -554,6 +548,7 @@
                 .hasListener(eq(windowContextToken));
         doReturn(TYPE_INPUT_METHOD).when(mWm.mWindowContextListenerController)
                 .getWindowType(eq(windowContextToken));
+        doReturn(true).when(mWm.mUmInternal).isUserVisible(anyInt(), anyInt());
 
         mWm.addWindow(session, new TestIWindow(), params, View.VISIBLE, DEFAULT_DISPLAY,
                 UserHandle.USER_SYSTEM, WindowInsets.Type.defaultVisible(), null, new InsetsState(),
@@ -1115,7 +1110,35 @@
                 argThat(h -> (h.inputConfig & InputConfig.SPY) == InputConfig.SPY));
     }
 
-    @RequiresFlagsDisabled(Flags.FLAG_MAGNIFICATION_ALWAYS_DRAW_FULLSCREEN_BORDER)
+    @Test
+    public void testUpdateInputChannel_sanitizeInputFeatureSensitive_forUntrustedWindows() {
+        final Session session = mock(Session.class);
+        final int callingUid = Process.FIRST_APPLICATION_UID;
+        final int callingPid = 1234;
+        final SurfaceControl surfaceControl = mock(SurfaceControl.class);
+        final IBinder window = new Binder();
+        final InputTransferToken inputTransferToken = mock(InputTransferToken.class);
+
+        final InputChannel inputChannel = new InputChannel();
+        mWm.grantInputChannel(session, callingUid, callingPid, DEFAULT_DISPLAY, surfaceControl,
+                window, null /* hostInputToken */, FLAG_NOT_FOCUSABLE, 0 /* privateFlags */,
+                INPUT_FEATURE_SENSITIVE_FOR_TRACING, TYPE_APPLICATION, null /* windowToken */,
+                inputTransferToken,
+                "TestInputChannel", inputChannel);
+        verify(mTransaction).setInputWindowInfo(
+                eq(surfaceControl),
+                argThat(h -> (h.inputConfig & InputConfig.SENSITIVE_FOR_TRACING) == 0));
+
+        mWm.updateInputChannel(inputChannel.getToken(), DEFAULT_DISPLAY, surfaceControl,
+                FLAG_NOT_FOCUSABLE, PRIVATE_FLAG_TRUSTED_OVERLAY,
+                INPUT_FEATURE_SENSITIVE_FOR_TRACING,
+                null /* region */);
+        verify(mTransaction).setInputWindowInfo(
+                eq(surfaceControl),
+                argThat(h -> (h.inputConfig & InputConfig.SENSITIVE_FOR_TRACING) != 0));
+    }
+
+    @RequiresFlagsDisabled(Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER)
     @Test
     public void testDrawMagnifiedViewport() {
         final int displayId = mDisplayContent.mDisplayId;
@@ -1239,12 +1262,61 @@
         final InsetsSourceControl.Array outControls = new InsetsSourceControl.Array();
         final Bundle outBundle = new Bundle();
 
-        mWm.relayoutWindow(win.mSession, win.mClient, win.mAttrs, w, h, View.GONE, 0, 0, 0,
+        final ActivityRecord activity = win.mActivityRecord;
+        final ActivityWindowInfo expectedInfo = new ActivityWindowInfo();
+        expectedInfo.set(true, new Rect(0, 0, 1000, 2000), new Rect(0, 0, 500, 2000));
+        doReturn(expectedInfo).when(activity).getActivityWindowInfo();
+        activity.setVisibleRequested(false);
+        activity.setVisible(false);
+
+        mWm.relayoutWindow(win.mSession, win.mClient, win.mAttrs, w, h, View.VISIBLE, 0, 0, 0,
                 outFrames, outConfig, outSurfaceControl, outInsetsState, outControls, outBundle);
 
+        // No latest reported value, so return empty when activity is invisible
         final ActivityWindowInfo activityWindowInfo = outBundle.getParcelable(
                 IWindowSession.KEY_RELAYOUT_BUNDLE_ACTIVITY_WINDOW_INFO, ActivityWindowInfo.class);
-        assertEquals(win.mActivityRecord.getActivityWindowInfo(), activityWindowInfo);
+        assertEquals(new ActivityWindowInfo(), activityWindowInfo);
+
+        activity.setVisibleRequested(true);
+        activity.setVisible(true);
+
+        mWm.relayoutWindow(win.mSession, win.mClient, win.mAttrs, w, h, View.VISIBLE, 0, 0, 0,
+                outFrames, outConfig, outSurfaceControl, outInsetsState, outControls, outBundle);
+
+        // Report the latest when activity is visible.
+        final ActivityWindowInfo activityWindowInfo2 = outBundle.getParcelable(
+                IWindowSession.KEY_RELAYOUT_BUNDLE_ACTIVITY_WINDOW_INFO, ActivityWindowInfo.class);
+        assertEquals(expectedInfo, activityWindowInfo2);
+
+        expectedInfo.set(false, new Rect(0, 0, 1000, 2000), new Rect(0, 0, 1000, 2000));
+        activity.setVisibleRequested(false);
+        activity.setVisible(false);
+
+        mWm.relayoutWindow(win.mSession, win.mClient, win.mAttrs, w, h, View.VISIBLE, 0, 0, 0,
+                outFrames, outConfig, outSurfaceControl, outInsetsState, outControls, outBundle);
+
+        // Report the last reported value when activity is invisible.
+        final ActivityWindowInfo activityWindowInfo3 = outBundle.getParcelable(
+                IWindowSession.KEY_RELAYOUT_BUNDLE_ACTIVITY_WINDOW_INFO, ActivityWindowInfo.class);
+        assertEquals(activityWindowInfo2, activityWindowInfo3);
+    }
+
+    @Test
+    public void testAddOverlayWindowToUnassignedDisplay_notAllowed() {
+        int uid = 100000; // uid for non-system user
+        Session session = createTestSession(mAtm, 1234 /* pid */, uid);
+        DisplayContent dc = createNewDisplay();
+        int displayId = dc.getDisplayId();
+        int userId = UserHandle.getUserId(uid);
+        doReturn(false).when(mWm.mUmInternal).isUserVisible(eq(userId), eq(displayId));
+        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
+                LayoutParams.TYPE_APPLICATION_OVERLAY);
+
+        int result = mWm.addWindow(session, new TestIWindow(), params, View.VISIBLE, displayId,
+                userId, WindowInsets.Type.defaultVisible(), null, new InsetsState(),
+                new InsetsSourceControl.Array(), new Rect(), new float[1]);
+
+        assertThat(result).isEqualTo(WindowManagerGlobal.ADD_INVALID_DISPLAY);
     }
 
     class TestResultReceiver implements IResultReceiver {
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index 28e03bf..6bd0874 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -107,6 +107,7 @@
 import android.view.WindowManager;
 import android.view.WindowManager.DisplayImePolicy;
 import android.view.inputmethod.ImeTracker;
+import android.window.ActivityWindowInfo;
 import android.window.ClientWindowFrames;
 import android.window.ITaskFragmentOrganizer;
 import android.window.ITransitionPlayer;
@@ -694,7 +695,8 @@
 
     static void makeLastConfigReportedToClient(WindowState w, boolean visible) {
         w.fillClientWindowFramesAndConfiguration(new ClientWindowFrames(),
-                new MergedConfiguration(), true /* useLatestConfig */, visible);
+                new MergedConfiguration(), new ActivityWindowInfo(), true /* useLatestConfig */,
+                visible);
     }
 
     /**
diff --git a/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java b/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java
index d9cbea9..ed89190 100644
--- a/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java
+++ b/services/usage/java/com/android/server/usage/BroadcastResponseStatsTracker.java
@@ -181,7 +181,7 @@
                 // We only need to look at the broadcast events that occurred before
                 // this notification related event.
                 while (dispatchTimestampsMs.size() > 0
-                        && dispatchTimestampsMs.peekFirst() < timestampMs) {
+                        && dispatchTimestampsMs.peekFirst() <= timestampMs) {
                     final long dispatchTimestampMs = dispatchTimestampsMs.peekFirst();
                     final long elapsedDurationMs = timestampMs - dispatchTimestampMs;
                     // Only increment the counts if the broadcast was sent not too long ago, as
diff --git a/services/usb/Android.bp b/services/usb/Android.bp
index e8ffe54..e00627e 100644
--- a/services/usb/Android.bp
+++ b/services/usb/Android.bp
@@ -44,6 +44,7 @@
 aconfig_declarations {
     name: "usb_flags",
     package: "com.android.server.usb.flags",
+    container: "system",
     srcs: ["**/usb_flags.aconfig"],
 }
 
diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java
index 2da352d..9470c0a 100644
--- a/services/usb/java/com/android/server/usb/UsbService.java
+++ b/services/usb/java/com/android/server/usb/UsbService.java
@@ -60,6 +60,7 @@
 import android.util.proto.ProtoOutputStream;
 
 import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.content.PackageMonitor;
 import com.android.internal.os.BackgroundThread;
 import com.android.internal.util.DumpUtils;
@@ -222,6 +223,21 @@
         mContext.registerReceiverAsUser(receiver, UserHandle.ALL, filter, null, null);
     }
 
+    // Ideally we should use the injector pattern so we wouldn't need this constructor  for test
+    @VisibleForTesting
+    UsbService(Context context,
+                      UsbPortManager usbPortManager,
+                      UsbAlsaManager usbAlsaManager,
+                      UserManager userManager,
+                      UsbSettingsManager usbSettingsManager) {
+        mContext = context;
+        mPortManager = usbPortManager;
+        mAlsaManager = usbAlsaManager;
+        mUserManager = userManager;
+        mSettingsManager = usbSettingsManager;
+        mPermissionManager = new UsbPermissionManager(context, this);
+    }
+
     /**
      * Set new {@link #mCurrentUserId} and propagate it to other modules.
      *
@@ -886,7 +902,16 @@
 
     @Override
     public boolean enableUsbData(String portId, boolean enable, int operationId,
-            IUsbOperationInternal callback) {
+                                 IUsbOperationInternal callback) {
+        return enableUsbDataInternal(portId, enable, operationId, callback, Binder.getCallingUid());
+    }
+
+    /**
+     *  Internal function abstracted for testing with callerUid
+     */
+    @VisibleForTesting
+    boolean enableUsbDataInternal(String portId, boolean enable, int operationId,
+            IUsbOperationInternal callback, int callerUid) {
         Objects.requireNonNull(portId, "enableUsbData: portId must not be null. opId:"
                 + operationId);
         Objects.requireNonNull(callback, "enableUsbData: callback must not be null. opId:"
@@ -894,7 +919,14 @@
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
 
         if (android.hardware.usb.flags.Flags.enableUsbDataSignalStaking()) {
-            if (!shouldUpdateUsbSignaling(portId, enable, Binder.getCallingUid())) return false;
+            if (!shouldUpdateUsbSignaling(portId, enable, callerUid)) {
+                try {
+                    callback.onOperationComplete(USB_OPERATION_ERROR_INTERNAL);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "enableUsbData: Failed to call onOperationComplete", e);
+                }
+                return false;
+            }
         }
 
         final long ident = Binder.clearCallingIdentity();
@@ -943,15 +975,35 @@
 
     @Override
     public void enableUsbDataWhileDocked(String portId, int operationId,
-            IUsbOperationInternal callback) {
+                                         IUsbOperationInternal callback) {
+        enableUsbDataWhileDockedInternal(portId, operationId, callback, Binder.getCallingUid());
+    }
+
+    /**
+     *  Internal function abstracted for testing with callerUid
+     */
+    @VisibleForTesting
+     void enableUsbDataWhileDockedInternal(String portId, int operationId,
+            IUsbOperationInternal callback, int callerUid) {
         Objects.requireNonNull(portId, "enableUsbDataWhileDocked: portId must not be null. opId:"
                 + operationId);
         Objects.requireNonNull(callback,
                 "enableUsbDataWhileDocked: callback must not be null. opId:"
                 + operationId);
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
+
+        if (android.hardware.usb.flags.Flags.enableUsbDataSignalStaking()) {
+            if (!shouldUpdateUsbSignaling(portId, true, callerUid)) {
+                try {
+                    callback.onOperationComplete(USB_OPERATION_ERROR_INTERNAL);
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "enableUsbDataWhileDocked: Failed to call onOperationComplete", e);
+                }
+                return;
+            }
+        }
+
         final long ident = Binder.clearCallingIdentity();
-        boolean wait;
         try {
             if (mPortManager != null) {
                 mPortManager.enableUsbDataWhileDocked(portId, operationId, callback, null);
diff --git a/services/usb/java/com/android/server/usb/flags/usb_flags.aconfig b/services/usb/java/com/android/server/usb/flags/usb_flags.aconfig
index ea6e502..a7c5ddb 100644
--- a/services/usb/java/com/android/server/usb/flags/usb_flags.aconfig
+++ b/services/usb/java/com/android/server/usb/flags/usb_flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.server.usb.flags"
+container: "system"
 
 flag {
     name: "allow_restriction_of_overlay_activities"
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/DetectorSession.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/DetectorSession.java
index ad7b9e6..96c3ed5 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/DetectorSession.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/DetectorSession.java
@@ -184,7 +184,7 @@
     private final Executor mAudioCopyExecutor = Executors.newCachedThreadPool();
     // TODO: This may need to be a Handler(looper)
     final ScheduledExecutorService mScheduledExecutorService;
-    private final AppOpsManager mAppOpsManager;
+    final AppOpsManager mAppOpsManager;
     final HotwordAudioStreamCopier mHotwordAudioStreamCopier;
     final AtomicBoolean mUpdateStateAfterStartFinished = new AtomicBoolean(false);
     final IHotwordRecognitionStatusCallback mCallback;
@@ -201,7 +201,7 @@
 
     /** Identity used for attributing app ops when delivering data to the Interactor. */
     @Nullable
-    private final Identity mVoiceInteractorIdentity;
+    final Identity mVoiceInteractorIdentity;
     @GuardedBy("mLock")
     ParcelFileDescriptor mCurrentAudioSink;
     @GuardedBy("mLock")
@@ -926,7 +926,7 @@
      * @param permission The identifier of the permission we want to check.
      * @param reason     The reason why we're requesting the permission, for auditing purposes.
      */
-    private static void enforcePermissionForDataDelivery(@NonNull Context context,
+    protected static void enforcePermissionForDataDelivery(@NonNull Context context,
             @NonNull Identity identity, @NonNull String permission, @NonNull String reason) {
         final int status = PermissionUtil.checkPermissionForDataDelivery(context, identity,
                 permission, reason);
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VisualQueryDetectorSession.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VisualQueryDetectorSession.java
index aef8e6f..0a66065 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VisualQueryDetectorSession.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VisualQueryDetectorSession.java
@@ -16,6 +16,10 @@
 
 package com.android.server.voiceinteraction;
 
+import static android.Manifest.permission.CAMERA;
+import static android.Manifest.permission.RECORD_AUDIO;
+import static android.app.AppOpsManager.OP_CAMERA;
+import static android.app.AppOpsManager.OP_RECORD_AUDIO;
 import static android.service.voice.VisualQueryDetectionServiceFailure.ERROR_CODE_ILLEGAL_ATTENTION_STATE;
 import static android.service.voice.VisualQueryDetectionServiceFailure.ERROR_CODE_ILLEGAL_STREAMING_STATE;
 
@@ -24,6 +28,7 @@
 import android.content.Context;
 import android.media.AudioFormat;
 import android.media.permission.Identity;
+import android.os.Binder;
 import android.os.IBinder;
 import android.os.ParcelFileDescriptor;
 import android.os.PersistableBundle;
@@ -58,6 +63,14 @@
 final class VisualQueryDetectorSession extends DetectorSession {
 
     private static final String TAG = "VisualQueryDetectorSession";
+
+    private static final String VISUAL_QUERY_DETECTION_AUDIO_OP_MESSAGE =
+            "Providing query detection result from VisualQueryDetectionService to "
+                    + "VoiceInteractionService";
+
+    private static final String VISUAL_QUERY_DETECTION_CAMERA_OP_MESSAGE =
+            "Providing query detection result from VisualQueryDetectionService to "
+                    + "VoiceInteractionService";
     private IVisualQueryDetectionAttentionListener mAttentionListener;
     private boolean mEgressingData;
     private boolean mQueryStreaming;
@@ -172,6 +185,22 @@
                                         "Cannot stream queries without attention signals."));
                         return;
                     }
+                    try {
+                        enforcePermissionsForVisualQueryDelivery(RECORD_AUDIO, OP_RECORD_AUDIO,
+                                VISUAL_QUERY_DETECTION_AUDIO_OP_MESSAGE);
+                    } catch (SecurityException e) {
+                        Slog.w(TAG, "Ignoring #onQueryDetected due to a SecurityException", e);
+                        try {
+                            callback.onVisualQueryDetectionServiceFailure(
+                                    new VisualQueryDetectionServiceFailure(
+                                            ERROR_CODE_ILLEGAL_STREAMING_STATE,
+                                            "Cannot stream queries without audio permission."));
+                        } catch (RemoteException e1) {
+                            notifyOnDetectorRemoteException();
+                            throw e1;
+                        }
+                        return;
+                    }
                     mQueryStreaming = true;
                     callback.onQueryDetected(partialQuery);
                     Slog.i(TAG, "Egressed from visual query detection process.");
@@ -202,6 +231,48 @@
                                                 + "enabling the setting."));
                         return;
                     }
+
+                    // Show camera icon if visual only accessibility data egresses
+                    if (partialResult.getAccessibilityDetectionData() != null) {
+                        try {
+                            enforcePermissionsForVisualQueryDelivery(CAMERA, OP_CAMERA,
+                                    VISUAL_QUERY_DETECTION_CAMERA_OP_MESSAGE);
+                        } catch (SecurityException e) {
+                            Slog.w(TAG, "Ignoring #onQueryDetected due to a SecurityException", e);
+                            try {
+                                callback.onVisualQueryDetectionServiceFailure(
+                                        new VisualQueryDetectionServiceFailure(
+                                                ERROR_CODE_ILLEGAL_STREAMING_STATE,
+                                                "Cannot stream visual only accessibility data "
+                                                        + "without camera permission."));
+                            } catch (RemoteException e1) {
+                                notifyOnDetectorRemoteException();
+                                throw e1;
+                            }
+                            return;
+                        }
+                    }
+
+                    // Show microphone icon if text query egresses
+                    if (!partialResult.getPartialQuery().isEmpty()) {
+                        try {
+                            enforcePermissionsForVisualQueryDelivery(RECORD_AUDIO, OP_RECORD_AUDIO,
+                                    VISUAL_QUERY_DETECTION_AUDIO_OP_MESSAGE);
+                        } catch (SecurityException e) {
+                            Slog.w(TAG, "Ignoring #onQueryDetected due to a SecurityException", e);
+                            try {
+                                callback.onVisualQueryDetectionServiceFailure(
+                                        new VisualQueryDetectionServiceFailure(
+                                                ERROR_CODE_ILLEGAL_STREAMING_STATE,
+                                                "Cannot stream queries without audio permission."));
+                            } catch (RemoteException e1) {
+                                notifyOnDetectorRemoteException();
+                                throw e1;
+                            }
+                            return;
+                        }
+                    }
+
                     mQueryStreaming = true;
                     callback.onResultDetected(partialResult);
                     Slog.i(TAG, "Egressed from visual query detection process.");
@@ -280,6 +351,20 @@
         mEnableAccessibilityDataEgress = enable;
     }
 
+    void enforcePermissionsForVisualQueryDelivery(String permission, int op, String msg) {
+        Binder.withCleanCallingIdentity(() -> {
+            synchronized (mLock) {
+                enforcePermissionForDataDelivery(mContext, mVoiceInteractorIdentity,
+                        permission, msg);
+                mAppOpsManager.noteOpNoThrow(
+                        op, mVoiceInteractorIdentity.uid,
+                        mVoiceInteractorIdentity.packageName,
+                        mVoiceInteractorIdentity.attributionTag,
+                        msg);
+            }
+        });
+    }
+
     @SuppressWarnings("GuardedBy")
     public void dumpLocked(String prefix, PrintWriter pw) {
         super.dumpLocked(prefix, pw);
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index ae4faa8..9729c68 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -180,7 +180,8 @@
                 LocalServices.getService(ActivityManagerInternal.class));
         mAtmInternal = Objects.requireNonNull(
                 LocalServices.getService(ActivityTaskManagerInternal.class));
-        mWmInternal = LocalServices.getService(WindowManagerInternal.class);
+        mWmInternal = Objects.requireNonNull(
+                LocalServices.getService(WindowManagerInternal.class));
         mDpmInternal = LocalServices.getService(DevicePolicyManagerInternal.class);
         LegacyPermissionManagerInternal permissionManagerInternal = LocalServices.getService(
                 LegacyPermissionManagerInternal.class);
@@ -2737,12 +2738,8 @@
                     isManagedProfileVisible = true;
                 }
             }
-            final ScreenCapture.ScreenshotHardwareBuffer shb;
-            if (mWmInternal != null) {
-                shb = mWmInternal.takeAssistScreenshot();
-            } else {
-                shb = null;
-            }
+            final ScreenCapture.ScreenshotHardwareBuffer shb =
+                    mWmInternal.takeAssistScreenshot();
             final Bitmap bm = shb != null ? shb.asBitmap() : null;
             // Now that everything is fetched, putting it in the launchIntent.
             if (bm != null) {
diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
index fd9365f..0ddc38a 100644
--- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
+++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
@@ -790,7 +790,7 @@
         if (isGranted) return;
 
         if (allowCarrierPrivilegeOnAnySub) {
-            if (checkCarrierPrivilegeForAnySubId(context, Binder.getCallingUid())) return;
+            if (checkCarrierPrivilegeForAnySubId(context, uid)) return;
         } else {
             if (checkCarrierPrivilegeForSubId(context, subId)) return;
         }
diff --git a/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java b/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
index a63db88..7b5b07c 100644
--- a/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
+++ b/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
@@ -16,6 +16,8 @@
 package com.android.internal.telephony.util;
 
 import static android.telephony.Annotation.DataState;
+import static android.telephony.NetworkRegistrationInfo.FIRST_SERVICE_TYPE;
+import static android.telephony.NetworkRegistrationInfo.LAST_SERVICE_TYPE;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -37,6 +39,7 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.internal.telephony.ITelephony;
@@ -48,6 +51,8 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * This class provides various util functions
@@ -342,4 +347,31 @@
         return false;
 
     }
+
+    /**
+     * @param plmn target plmn for validation.
+     * @return {@code true} if the target plmn is valid {@code false} otherwise.
+     */
+    public static boolean isValidPlmn(@Nullable String plmn) {
+        if (TextUtils.isEmpty(plmn)) {
+            return false;
+        }
+        Pattern pattern = Pattern.compile("^(?:[0-9]{3})(?:[0-9]{2}|[0-9]{3})$");
+        Matcher matcher = pattern.matcher(plmn);
+        if (!matcher.matches()) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * @param serviceType target serviceType for validation.
+     * @return {@code true} if the target serviceType is valid {@code false} otherwise.
+     */
+    public static boolean isValidService(int serviceType) {
+        if (serviceType < FIRST_SERVICE_TYPE || serviceType > LAST_SERVICE_TYPE) {
+            return false;
+        }
+        return true;
+    }
 }
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index df32fbd..7db4180 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -8013,6 +8013,27 @@
                 KEY_SCAN_LIMITED_SERVICE_AFTER_VOLTE_FAILURE_BOOL =
                     KEY_PREFIX + "scan_limited_service_after_volte_failure_bool";
 
+        /**
+         * This config defines {@link ImsReasonInfo} code with which the emergency call
+         * shall be retried.
+         *
+         * <p>
+         * If the reason code is one of the following, the emergency call shall be retried
+         * regardless of this configuration.
+         * <ul>
+         * <li>{@link ImsReasonInfo#CODE_LOCAL_CALL_CS_RETRY_REQUIRED}</li>
+         * <li>{@link ImsReasonInfo#CODE_LOCAL_NOT_REGISTERED}</li>
+         * <li>{@link ImsReasonInfo#CODE_SIP_ALTERNATE_EMERGENCY_CALL}</li>
+         * </ul>
+         * <p>
+         *
+         * This config is empty by default.
+         *
+         * @hide
+         */
+        public static final String KEY_IMS_REASONINFO_CODE_TO_RETRY_EMERGENCY_INT_ARRAY =
+                KEY_PREFIX + "ims_reasoninfo_code_to_retry_emergency_int_array";
+
         private static PersistableBundle getDefaults() {
             PersistableBundle defaults = new PersistableBundle();
             defaults.putBoolean(KEY_RETRY_EMERGENCY_ON_IMS_PDN_BOOL, false);
@@ -8085,6 +8106,8 @@
             defaults.putBoolean(KEY_START_QUICK_CROSS_STACK_REDIAL_TIMER_WHEN_REGISTERED_BOOL,
                     true);
             defaults.putBoolean(KEY_SCAN_LIMITED_SERVICE_AFTER_VOLTE_FAILURE_BOOL, false);
+            defaults.putIntArray(KEY_IMS_REASONINFO_CODE_TO_RETRY_EMERGENCY_INT_ARRAY,
+                    new int[0]);
 
             return defaults;
         }
@@ -9836,7 +9859,7 @@
      * An integer key holds the time interval for refreshing or re-querying the satellite
      * entitlement status from the entitlement server to ensure it is the latest.
      *
-     * The default value is 30 days (1 month).
+     * The default value is 7 days.
      */
     @FlaggedApi(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG)
     public static final String KEY_SATELLITE_ENTITLEMENT_STATUS_REFRESH_DAYS_INT =
@@ -9854,6 +9877,73 @@
             "satellite_entitlement_supported_bool";
 
     /**
+     * Indicates the appName that is used when querying the entitlement server for satellite.
+     *
+     * The default value is androidSatmode.
+     *
+     * Reference: GSMA TS.43-v11, 2.8.5 Fast Authentication and Token Management.
+     * `app_name` is an optional attribute in the request and may vary depending on the carrier
+     * requirement.
+     * @hide
+     */
+    public static final String KEY_SATELLITE_ENTITLEMENT_APP_NAME_STRING =
+            "satellite_entitlement_app_name_string";
+
+    /**
+     * URL to redirect user to get more information about the carrier support for satellite.
+     *
+     * The default value is empty string.
+     *
+     * @hide
+     */
+    public static final String KEY_SATELLITE_INFORMATION_REDIRECT_URL_STRING =
+            "satellite_information_redirect_url_string";
+    /**
+     * Indicate whether a carrier supports emergency messaging. When this config is {@code  false},
+     * emergency call to satellite T911 handover will be disabled.
+     *
+     * This will need agreement with carriers before enabling this flag.
+     *
+     * The default value is false.
+     *
+     * @hide
+     */
+    public static final String KEY_EMERGENCY_MESSAGING_SUPPORTED_BOOL =
+            "emergency_messaging_supported_bool";
+
+    /**
+     * An integer key holds the timeout duration in milliseconds used to determine whether to hand
+     * over an emergency call to satellite T911.
+     *
+     * The timer is started when there is an ongoing emergency call, and the IMS is not registered,
+     * and cellular service is not available. When the timer expires,
+     * {@link com.android.internal.telephony.satellite.SatelliteSOSMessageRecommender} will send the
+     * event {@link TelephonyManager#EVENT_DISPLAY_EMERGENCY_MESSAGE} to Dialer, which will then
+     * prompt user to switch to using satellite emergency messaging.
+     *
+     * The default value is 30 seconds.
+     *
+     * @hide
+     */
+    public static final String KEY_EMERGENCY_CALL_TO_SATELLITE_T911_HANDOVER_TIMEOUT_MILLIS_INT =
+            "emergency_call_to_satellite_t911_handover_timeout_millis_int";
+
+    /**
+     * An int array that contains default capabilities for carrier enabled satellite roaming.
+     * If any PLMN is provided from the entitlement server, and it is not listed in
+     * {@link #KEY_CARRIER_SUPPORTED_SATELLITE_SERVICES_PER_PROVIDER_BUNDLE}, default capabilities
+     * will be used instead.
+     * <p>
+     * The default capabilities are
+     * {@link NetworkRegistrationInfo#SERVICE_TYPE_SMS}, and
+     * {@link NetworkRegistrationInfo#SERVICE_TYPE_MMS}
+     *
+     * @hide
+     */
+    public static final String KEY_CARRIER_ROAMING_SATELLITE_DEFAULT_SERVICES_INT_ARRAY =
+            "carrier_roaming_satellite_default_services_int_array";
+
+    /**
      * Indicating whether DUN APN should be disabled when the device is roaming. In that case,
      * the default APN (i.e. internet) will be used for tethering.
      *
@@ -10995,9 +11085,19 @@
                 CellSignalStrengthLte.USE_RSRP);
         sDefaults.putBoolean(KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL, true);
         sDefaults.putBoolean(KEY_OVERRIDE_WFC_ROAMING_MODE_WHILE_USING_NTN_BOOL, true);
-        sDefaults.putInt(KEY_SATELLITE_ENTITLEMENT_STATUS_REFRESH_DAYS_INT, 30);
+        sDefaults.putInt(KEY_SATELLITE_ENTITLEMENT_STATUS_REFRESH_DAYS_INT, 7);
         sDefaults.putBoolean(KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, false);
+        sDefaults.putString(KEY_SATELLITE_ENTITLEMENT_APP_NAME_STRING, "androidSatmode");
+        sDefaults.putString(KEY_SATELLITE_INFORMATION_REDIRECT_URL_STRING, "");
+        sDefaults.putIntArray(KEY_CARRIER_ROAMING_SATELLITE_DEFAULT_SERVICES_INT_ARRAY,
+                new int[] {
+                        NetworkRegistrationInfo.SERVICE_TYPE_SMS,
+                        NetworkRegistrationInfo.SERVICE_TYPE_MMS
+                });
         sDefaults.putBoolean(KEY_DISABLE_DUN_APN_WHILE_ROAMING_WITH_PRESET_APN_BOOL, false);
+        sDefaults.putBoolean(KEY_EMERGENCY_MESSAGING_SUPPORTED_BOOL, false);
+        sDefaults.putInt(KEY_EMERGENCY_CALL_TO_SATELLITE_T911_HANDOVER_TIMEOUT_MILLIS_INT,
+                (int) TimeUnit.SECONDS.toMillis(30));
         sDefaults.putString(KEY_DEFAULT_PREFERRED_APN_NAME_STRING, "");
         sDefaults.putBoolean(KEY_SUPPORTS_CALL_COMPOSER_BOOL, false);
         sDefaults.putBoolean(KEY_SUPPORTS_BUSINESS_CALL_COMPOSER_BOOL, false);
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index c5f2d42..ba7ba532 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -3137,7 +3137,7 @@
             if (useRootLocale) {
                 configurationKey.setLocale(Locale.ROOT);
             }
-            cacheKey = Pair.create(context.getPackageName(), configurationKey);
+            cacheKey = Pair.create(context.getPackageName() + ", subid=" + subId, configurationKey);
             synchronized (sResourcesCache) {
                 Resources cached = sResourcesCache.get(cacheKey);
                 if (cached != null) {
diff --git a/telephony/java/android/telephony/TelephonyFrameworkInitializer.java b/telephony/java/android/telephony/TelephonyFrameworkInitializer.java
index 901daf8..f5688bf 100644
--- a/telephony/java/android/telephony/TelephonyFrameworkInitializer.java
+++ b/telephony/java/android/telephony/TelephonyFrameworkInitializer.java
@@ -18,8 +18,13 @@
 
 import android.annotation.NonNull;
 import android.app.SystemServiceRegistry;
+import android.compat.Compatibility;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledSince;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.SystemProperties;
 import android.os.TelephonyServiceManager;
 import android.telephony.euicc.EuiccCardManager;
 import android.telephony.euicc.EuiccManager;
@@ -40,6 +45,16 @@
     private TelephonyFrameworkInitializer() {
     }
 
+    /**
+     * Starting with {@link VANILLA_ICE_CREAM}, Telephony feature flags
+     * (e.g. {@link PackageManager#FEATURE_TELEPHONY_SUBSCRIPTION}) are being checked before
+     * returning managers that depend on them. If the feature is missing,
+     * {@link Context#getSystemService} will return null.
+     */
+    @ChangeId
+    @EnabledSince(targetSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM)
+    static final long ENABLE_CHECKING_TELEPHONY_FEATURES = 330583731;
+
     private static volatile TelephonyServiceManager sTelephonyServiceManager;
 
     /**
@@ -57,8 +72,23 @@
         sTelephonyServiceManager = Preconditions.checkNotNull(telephonyServiceManager);
     }
 
+    // Suppressing AndroidFrameworkCompatChange because we're querying vendor
+    // partition SDK level, not application's target SDK version (which BTW we
+    // also check through Compatibility framework a few lines below).
+    @SuppressWarnings("AndroidFrameworkCompatChange")
     private static boolean hasSystemFeature(Context context, String feature) {
+        // Check release status of this change in behavior.
         if (!Flags.minimalTelephonyManagersConditionalOnFeatures()) return true;
+
+        // Check SDK version of the vendor partition.
+        final int vendorApiLevel = SystemProperties.getInt(
+                "ro.vendor.api_level", Build.VERSION.DEVICE_INITIAL_SDK_INT);
+        if (vendorApiLevel < Build.VERSION_CODES.VANILLA_ICE_CREAM) return true;
+
+        // Check SDK version of the client app.
+        if (!Compatibility.isChangeEnabled(ENABLE_CHECKING_TELEPHONY_FEATURES)) return true;
+
+        // Finally, check if the system feature is actually present.
         return context.getPackageManager().hasSystemFeature(feature);
     }
 
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index a047b97..0a8a18dc 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -15013,7 +15013,8 @@
     /**
      * Get the emergency assistance package name.
      *
-     * @return the package name of the emergency assistance app.
+     * @return the package name of the emergency assistance app, or {@code null} if no app
+     * supports emergency assistance.
      * @throws IllegalStateException if emergency assistance is not enabled or the device is
      * not voice capable.
      *
@@ -15021,16 +15022,15 @@
      */
     @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
     @FlaggedApi(android.permission.flags.Flags.FLAG_GET_EMERGENCY_ROLE_HOLDER_API_ENABLED)
-    @NonNull
+    @Nullable
     @SystemApi
     public String getEmergencyAssistancePackageName() {
         if (!isEmergencyAssistanceEnabled() || !isVoiceCapable()) {
             throw new IllegalStateException("isEmergencyAssistanceEnabled() is false or device"
                 + " not voice capable.");
         }
-        String emergencyRole = mContext.getSystemService(RoleManager.class)
+        return mContext.getSystemService(RoleManager.class)
                 .getEmergencyRoleHolder(mContext.getUserId());
-        return Objects.requireNonNull(emergencyRole, "Emergency role holder must not be null");
     }
 
     /**
diff --git a/telephony/java/android/telephony/satellite/ISatelliteSupportedStateCallback.aidl b/telephony/java/android/telephony/satellite/ISatelliteSupportedStateCallback.aidl
new file mode 100644
index 0000000..0455090
--- /dev/null
+++ b/telephony/java/android/telephony/satellite/ISatelliteSupportedStateCallback.aidl
@@ -0,0 +1,31 @@
+/*
+ * 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.telephony.satellite;
+
+/**
+ * Interface for satellite supported state change callback.
+ * @hide
+ */
+oneway interface ISatelliteSupportedStateCallback {
+    /**
+     * Called when satellite supported state has changed.
+     *
+     * @param supoprted Whether satellite is supported or not.
+     */
+    void onSatelliteSupportedStateChanged(in boolean supported);
+}
+
diff --git a/telephony/java/android/telephony/satellite/ISatelliteTransmissionUpdateCallback.aidl b/telephony/java/android/telephony/satellite/ISatelliteTransmissionUpdateCallback.aidl
index 06fc3c6..579fda3 100644
--- a/telephony/java/android/telephony/satellite/ISatelliteTransmissionUpdateCallback.aidl
+++ b/telephony/java/android/telephony/satellite/ISatelliteTransmissionUpdateCallback.aidl
@@ -26,11 +26,13 @@
     /**
      * Called when satellite datagram send state changed.
      *
+     * @param datagramType The datagram type of currently being sent.
      * @param state The new send datagram transfer state.
      * @param sendPendingCount The number of datagrams that are currently being sent.
      * @param errorCode If datagram transfer failed, the reason for failure.
      */
-    void onSendDatagramStateChanged(in int state, in int sendPendingCount, in int errorCode);
+    void onSendDatagramStateChanged(int datagramType, int state, int sendPendingCount,
+            int errorCode);
 
     /**
      * Called when satellite datagram receive state changed.
@@ -39,7 +41,7 @@
      * @param receivePendingCount The number of datagrams that are currently pending to be received.
      * @param errorCode If datagram transfer failed, the reason for failure.
      */
-    void onReceiveDatagramStateChanged(in int state, in int receivePendingCount, in int errorCode);
+    void onReceiveDatagramStateChanged(int state, int receivePendingCount, int errorCode);
 
     /**
      * Called when the satellite position changed.
diff --git a/telephony/java/android/telephony/satellite/SatelliteManager.java b/telephony/java/android/telephony/satellite/SatelliteManager.java
index 4a61114..87bb0f0 100644
--- a/telephony/java/android/telephony/satellite/SatelliteManager.java
+++ b/telephony/java/android/telephony/satellite/SatelliteManager.java
@@ -87,6 +87,9 @@
     private static final ConcurrentHashMap<SatelliteCapabilitiesCallback,
             ISatelliteCapabilitiesCallback>
             sSatelliteCapabilitiesCallbackMap = new ConcurrentHashMap<>();
+    private static final ConcurrentHashMap<SatelliteSupportedStateCallback,
+            ISatelliteSupportedStateCallback> sSatelliteSupportedStateCallbackMap =
+            new ConcurrentHashMap<>();
 
     private final int mSubId;
 
@@ -989,12 +992,19 @@
      */
     @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
     public static final int DATAGRAM_TYPE_LOCATION_SHARING = 2;
+    /**
+     * This type of datagram is used to keep the device in satellite connected state or check if
+     * there is any incoming message.
+     * @hide
+     */
+    public static final int DATAGRAM_TYPE_KEEP_ALIVE = 3;
 
     /** @hide */
     @IntDef(prefix = "DATAGRAM_TYPE_", value = {
             DATAGRAM_TYPE_UNKNOWN,
             DATAGRAM_TYPE_SOS_MESSAGE,
-            DATAGRAM_TYPE_LOCATION_SHARING
+            DATAGRAM_TYPE_LOCATION_SHARING,
+            DATAGRAM_TYPE_KEEP_ALIVE
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface DatagramType {}
@@ -1074,8 +1084,13 @@
                             }
 
                             @Override
-                            public void onSendDatagramStateChanged(int state, int sendPendingCount,
-                                    int errorCode) {
+                            public void onSendDatagramStateChanged(int datagramType, int state,
+                                    int sendPendingCount, int errorCode) {
+                                executor.execute(() -> Binder.withCleanCallingIdentity(
+                                        () -> callback.onSendDatagramStateChanged(datagramType,
+                                                state, sendPendingCount, errorCode)));
+
+                                // For backward compatibility
                                 executor.execute(() -> Binder.withCleanCallingIdentity(
                                         () -> callback.onSendDatagramStateChanged(
                                                 state, sendPendingCount, errorCode)));
@@ -2284,6 +2299,88 @@
         return new ArrayList<>();
     }
 
+    /**
+     * Registers for the satellite supported state changed.
+     *
+     * @param executor The executor on which the callback will be called.
+     * @param callback The callback to handle the satellite supoprted state changed event.
+     *
+     * @return The {@link SatelliteResult} result of the operation.
+     *
+     * @throws SecurityException if the caller doesn't have required permission.
+     * @throws IllegalStateException if the Telephony process is not currently available.
+     *
+     * @hide
+     */
+    @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION)
+    @SatelliteResult public int registerForSupportedStateChanged(
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull SatelliteSupportedStateCallback callback) {
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(callback);
+
+        try {
+            ITelephony telephony = getITelephony();
+            if (telephony != null) {
+                ISatelliteSupportedStateCallback internalCallback =
+                        new ISatelliteSupportedStateCallback.Stub() {
+                            @Override
+                            public void onSatelliteSupportedStateChanged(boolean supported) {
+                                executor.execute(() -> Binder.withCleanCallingIdentity(
+                                        () -> callback.onSatelliteSupportedStateChanged(
+                                                supported)));
+                            }
+                        };
+                sSatelliteSupportedStateCallbackMap.put(callback, internalCallback);
+                return telephony.registerForSatelliteSupportedStateChanged(
+                        mSubId, internalCallback);
+            } else {
+                throw new IllegalStateException("telephony service is null.");
+            }
+        } catch (RemoteException ex) {
+            loge("registerForSupportedStateChanged() RemoteException: " + ex);
+            ex.rethrowAsRuntimeException();
+        }
+        return SATELLITE_RESULT_REQUEST_FAILED;
+    }
+
+    /**
+     * Unregisters for the satellite supported state changed.
+     * If callback was not registered before, the request will be ignored.
+     *
+     * @param callback The callback that was passed to
+     * {@link #registerForSupportedStateChanged(Executor, SatelliteSupportedStateCallback)}
+     *
+     * @throws SecurityException if the caller doesn't have required permission.
+     * @throws IllegalStateException if the Telephony process is not currently available.
+     *
+     * @hide
+     */
+    @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION)
+    @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
+    public void unregisterForSupportedStateChanged(
+            @NonNull SatelliteSupportedStateCallback callback) {
+        Objects.requireNonNull(callback);
+        ISatelliteSupportedStateCallback internalCallback =
+                sSatelliteSupportedStateCallbackMap.remove(callback);
+
+        try {
+            ITelephony telephony = getITelephony();
+            if (telephony != null) {
+                if (internalCallback != null) {
+                    telephony.unregisterForSatelliteSupportedStateChanged(mSubId, internalCallback);
+                } else {
+                    loge("unregisterForSupportedStateChanged: No internal callback.");
+                }
+            } else {
+                throw new IllegalStateException("telephony service is null.");
+            }
+        } catch (RemoteException ex) {
+            loge("unregisterForSupportedStateChanged() RemoteException: " + ex);
+            ex.rethrowAsRuntimeException();
+        }
+    }
+
     @Nullable private static ITelephony getITelephony() {
         ITelephony binder = ITelephony.Stub.asInterface(TelephonyFrameworkInitializer
                 .getTelephonyServiceManager()
diff --git a/telephony/java/android/telephony/satellite/SatelliteSupportedStateCallback.java b/telephony/java/android/telephony/satellite/SatelliteSupportedStateCallback.java
new file mode 100644
index 0000000..7e19bd1
--- /dev/null
+++ b/telephony/java/android/telephony/satellite/SatelliteSupportedStateCallback.java
@@ -0,0 +1,40 @@
+/*
+ * 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.telephony.satellite;
+
+import android.annotation.FlaggedApi;
+
+import com.android.internal.telephony.flags.Flags;
+
+/**
+ * A callback class for monitoring satellite supported state change events.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
+public interface SatelliteSupportedStateCallback {
+    /**
+     * Called when satellite supported state changes.
+     *
+     * @param supported The new supported state. {@code true} means satellite is supported,
+     * {@code false} means satellite is not supported.
+     *
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
+    void onSatelliteSupportedStateChanged(boolean supported);
+}
diff --git a/telephony/java/android/telephony/satellite/SatelliteTransmissionUpdateCallback.java b/telephony/java/android/telephony/satellite/SatelliteTransmissionUpdateCallback.java
index e020970..d8bd662 100644
--- a/telephony/java/android/telephony/satellite/SatelliteTransmissionUpdateCallback.java
+++ b/telephony/java/android/telephony/satellite/SatelliteTransmissionUpdateCallback.java
@@ -52,6 +52,19 @@
             @SatelliteManager.SatelliteResult int errorCode);
 
     /**
+     * Called when satellite datagram send state changed.
+     *
+     * @param datagramType The datagram type of currently being sent.
+     * @param state The new send datagram transfer state.
+     * @param sendPendingCount The number of datagrams that are currently being sent.
+     * @param errorCode If datagram transfer failed, the reason for failure.
+     *
+     * @hide
+     */
+    void onSendDatagramStateChanged(@SatelliteManager.DatagramType int datagramType,
+            @SatelliteManager.SatelliteDatagramTransferState int state, int sendPendingCount,
+            @SatelliteManager.SatelliteResult int errorCode);
+    /**
      * Called when satellite datagram receive state changed.
      *
      * @param state The new receive datagram transfer state.
diff --git a/telephony/java/android/telephony/satellite/stub/ISatellite.aidl b/telephony/java/android/telephony/satellite/stub/ISatellite.aidl
index 36485c6..16983a0 100644
--- a/telephony/java/android/telephony/satellite/stub/ISatellite.aidl
+++ b/telephony/java/android/telephony/satellite/stub/ISatellite.aidl
@@ -83,6 +83,9 @@
      *
      * @param enableSatellite True to enable the satellite modem and false to disable.
      * @param enableDemoMode True to enable demo mode and false to disable.
+     * @param isEmergency To specify the satellite is enabled for emergency session and false for
+     * non emergency session. Note: it is possible that a emergency session started get converted
+     * to a non emergency session and vice versa.
      * @param resultCallback The callback to receive the error code result of the operation.
      *
      * Valid result codes returned:
@@ -96,7 +99,7 @@
      *   SatelliteResult:SATELLITE_RESULT_NO_RESOURCES
      */
     void requestSatelliteEnabled(in boolean enableSatellite, in boolean enableDemoMode,
-            in IIntegerConsumer resultCallback);
+            in boolean isEmergency, in IIntegerConsumer resultCallback);
 
     /**
      * Request to get whether the satellite modem is enabled.
diff --git a/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl b/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl
index ccca5ad..5b9dfc6 100644
--- a/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl
+++ b/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl
@@ -74,4 +74,11 @@
      * @param SatelliteCapabilities The current satellite capabilities.
      */
     void onSatelliteCapabilitiesChanged(in SatelliteCapabilities capabilities);
+
+    /**
+     * Called when supported state of satellite has changed
+     *
+     * @param supported True means satellite service is supported and false means it is not.
+     */
+    void onSatelliteSupportedStateChanged(in boolean supported);
 }
diff --git a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java
index b7dc79f..a623633 100644
--- a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java
+++ b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java
@@ -90,11 +90,11 @@
 
         @Override
         public void requestSatelliteEnabled(boolean enableSatellite, boolean enableDemoMode,
-                IIntegerConsumer resultCallback) throws RemoteException {
+                boolean isEmergency, IIntegerConsumer resultCallback) throws RemoteException {
             executeMethodAsync(
                     () -> SatelliteImplBase.this
                             .requestSatelliteEnabled(
-                                    enableSatellite, enableDemoMode, resultCallback),
+                                    enableSatellite, enableDemoMode, isEmergency, resultCallback),
                     "requestSatelliteEnabled");
         }
 
@@ -337,6 +337,9 @@
      *
      * @param enableSatellite True to enable the satellite modem and false to disable.
      * @param enableDemoMode True to enable demo mode and false to disable.
+     * @param isEmergency To specify the satellite is enabled for emergency session and false for
+     * non emergency session. Note: it is possible that a emergency session started get converted
+     * to a non emergency session and vice versa.
      * @param resultCallback The callback to receive the error code result of the operation.
      *
      * Valid result codes returned:
@@ -350,7 +353,7 @@
      *   SatelliteResult:SATELLITE_RESULT_NO_RESOURCES
      */
     public void requestSatelliteEnabled(boolean enableSatellite, boolean enableDemoMode,
-            @NonNull IIntegerConsumer resultCallback) {
+            boolean isEmergency, @NonNull IIntegerConsumer resultCallback) {
         // stub implementation
     }
 
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index ff2ee27..f25fc36 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -72,6 +72,7 @@
 import android.telephony.satellite.ISatelliteDatagramCallback;
 import android.telephony.satellite.ISatelliteTransmissionUpdateCallback;
 import android.telephony.satellite.ISatelliteProvisionStateCallback;
+import android.telephony.satellite.ISatelliteSupportedStateCallback;
 import android.telephony.satellite.ISatelliteModemStateCallback;
 import android.telephony.satellite.NtnSignalStrength;
 import android.telephony.satellite.SatelliteCapabilities;
@@ -3315,4 +3316,29 @@
     @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
             + "android.Manifest.permission.SATELLITE_COMMUNICATION)")
     List<String> getSatellitePlmnsForCarrier(int subId);
+
+    /**
+     * Registers for supported state changed from satellite modem.
+     *
+     * @param subId The subId of the subscription to register for supported state changed.
+     * @param callback The callback to handle the satellite supported state changed event.
+     *
+     * @return The {@link SatelliteError} result of the operation.
+     */
+    @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
+            + "android.Manifest.permission.SATELLITE_COMMUNICATION)")
+    int registerForSatelliteSupportedStateChanged(int subId,
+            in ISatelliteSupportedStateCallback callback);
+
+    /**
+     * Unregisters for supported state changed from satellite modem.
+     * If callback was not registered before, the request will be ignored.
+     *
+     * @param subId The subId of the subscription to unregister for supported state changed.
+     * @param callback The callback that was passed to registerForSatelliteSupportedStateChanged.
+     */
+    @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
+            + "android.Manifest.permission.SATELLITE_COMMUNICATION)")
+    void unregisterForSatelliteSupportedStateChanged(int subId,
+            in ISatelliteSupportedStateCallback callback);
 }
diff --git a/test-legacy/Android.bp b/test-legacy/Android.bp
new file mode 100644
index 0000000..236d704
--- /dev/null
+++ b/test-legacy/Android.bp
@@ -0,0 +1,38 @@
+// 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 {
+    // See: http://go/android-license-faq
+    default_applicable_licenses: [
+        "Android-Apache-2.0",
+    ],
+}
+
+java_library {
+    name: "android.test.legacy",
+    sdk_version: "current",
+    libs: [
+        "android.test.mock.stubs",
+        "junit",
+    ],
+    static_libs: [
+        "android.test.base-minus-junit",
+        "android.test.runner-minus-junit",
+    ],
+    dist: {
+        targets: [
+            "sdk",
+        ],
+    },
+}
diff --git a/test-legacy/Android.mk b/test-legacy/Android.mk
deleted file mode 100644
index da9dc25..0000000
--- a/test-legacy/Android.mk
+++ /dev/null
@@ -1,50 +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.
-#
-
-LOCAL_PATH:= $(call my-dir)
-
-# For unbundled build we'll use the prebuilt jar from prebuilts/sdk.
-ifeq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)))
-
-# Build the android.test.legacy library
-# =====================================
-# Built against the SDK so that it can be statically included in APKs
-# without breaking link type checks.
-#
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := android.test.legacy
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-MIT SPDX-license-identifier-Unicode-DFS
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../NOTICE
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_JAVA_LIBRARIES := junit android.test.mock.stubs
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    android.test.base-minus-junit \
-    android.test.runner-minus-junit \
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-$(call declare-license-metadata,$(full_classes_jar),\
-    SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-MIT SPDX-license-identifier-Unicode-DFS,\
-    notice,$(LOCAL_PATH)/../NOTICE,Android,frameworks/base)
-
-# Archive a copy of the classes.jar in SDK build.
-$(call dist-for-goals,sdk,$(full_classes_jar):android.test.legacy.jar)
-
-endif  # not TARGET_BUILD_APPS not TARGET_BUILD_PDK=true
diff --git a/tests/CompanionDeviceMultiDeviceTests/client/Android.bp b/tests/CompanionDeviceMultiDeviceTests/client/Android.bp
index 1e68c9d..9994826 100644
--- a/tests/CompanionDeviceMultiDeviceTests/client/Android.bp
+++ b/tests/CompanionDeviceMultiDeviceTests/client/Android.bp
@@ -19,10 +19,11 @@
     // to get the below license kinds:
     //   SPDX-license-identifier-Apache-2.0
     default_applicable_licenses: ["frameworks_base_license"],
+    default_team: "trendy_team_framework_cdm",
 }
 
 android_test {
-    name: "cdm_snippet",
+    name: "cdm_snippet_legacy",
     srcs: ["src/**/*.kt"],
     manifest: "AndroidManifest.xml",
 
diff --git a/tests/CompanionDeviceMultiDeviceTests/host/Android.bp b/tests/CompanionDeviceMultiDeviceTests/host/Android.bp
index 03335c7..37cb850 100644
--- a/tests/CompanionDeviceMultiDeviceTests/host/Android.bp
+++ b/tests/CompanionDeviceMultiDeviceTests/host/Android.bp
@@ -19,6 +19,7 @@
     // to get the below license kinds:
     //   SPDX-license-identifier-Apache-2.0
     default_applicable_licenses: ["frameworks_base_license"],
+    default_team: "trendy_team_framework_cdm",
 }
 
 python_test_host {
@@ -36,7 +37,7 @@
         tags: ["mobly"],
     },
     data: [
-        ":cdm_snippet",
+        ":cdm_snippet_legacy",
     ],
     version: {
         py2: {
diff --git a/tests/CompanionDeviceMultiDeviceTests/host/AndroidTest.xml b/tests/CompanionDeviceMultiDeviceTests/host/AndroidTest.xml
index 9d1813f..7c7ef63 100644
--- a/tests/CompanionDeviceMultiDeviceTests/host/AndroidTest.xml
+++ b/tests/CompanionDeviceMultiDeviceTests/host/AndroidTest.xml
@@ -24,12 +24,12 @@
 
     <device name="device1">
         <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-            <option name="test-file-name" value="cdm_snippet.apk" />
+            <option name="test-file-name" value="cdm_snippet_legacy.apk" />
         </target_preparer>
     </device>
     <device name="device2">
         <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-            <option name="test-file-name" value="cdm_snippet.apk" />
+            <option name="test-file-name" value="cdm_snippet_legacy.apk" />
         </target_preparer>
     </device>
 
diff --git a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rotation/RotationTransition.kt b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rotation/RotationTransition.kt
index 511c948..1390218 100644
--- a/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rotation/RotationTransition.kt
+++ b/tests/FlickerTests/ActivityEmbedding/src/com/android/server/wm/flicker/activityembedding/rotation/RotationTransition.kt
@@ -17,8 +17,12 @@
 package com.android.server.wm.flicker.activityembedding.rotation
 
 import android.platform.test.annotations.Presubmit
+import android.tools.Position
+import android.tools.datatypes.Rect
 import android.tools.flicker.legacy.FlickerBuilder
 import android.tools.flicker.legacy.LegacyFlickerTest
+import android.tools.traces.Condition
+import android.tools.traces.DeviceStateDump
 import android.tools.traces.component.ComponentNameMatcher
 import com.android.server.wm.flicker.activityembedding.ActivityEmbeddingTestBase
 import com.android.server.wm.flicker.helpers.setRotation
@@ -30,7 +34,14 @@
     override val transition: FlickerBuilder.() -> Unit = {
         setup { this.setRotation(flicker.scenario.startRotation) }
         teardown { testApp.exit(wmHelper) }
-        transitions { this.setRotation(flicker.scenario.endRotation) }
+        transitions {
+            this.setRotation(flicker.scenario.endRotation)
+            if (!flicker.scenario.isTablet) {
+                wmHelper.StateSyncBuilder()
+                    .add(navBarInPosition(flicker.scenario.isGesturalNavigation))
+                    .waitForAndVerify()
+            }
+        }
     }
 
     /** {@inheritDoc} */
@@ -76,4 +87,37 @@
         appLayerRotates_StartingPos()
         appLayerRotates_EndingPos()
     }
+
+    private fun navBarInPosition(isGesturalNavigation: Boolean): Condition<DeviceStateDump> {
+        return Condition("navBarPosition") { dump ->
+            val display =
+                dump.layerState.displays.filterNot { it.isOff }.minByOrNull { it.id }
+                    ?: error("There is no display!")
+            val displayArea = display.layerStackSpace
+            val navBarPosition = display.navBarPosition(isGesturalNavigation)
+            val navBarRegion = dump.layerState
+                .getLayerWithBuffer(ComponentNameMatcher.NAV_BAR)
+                ?.visibleRegion?.bounds ?: Rect.EMPTY
+
+            when (navBarPosition) {
+                Position.TOP ->
+                    navBarRegion.top == displayArea.top &&
+                        navBarRegion.left == displayArea.left &&
+                        navBarRegion.right == displayArea.right
+                Position.BOTTOM ->
+                    navBarRegion.bottom == displayArea.bottom &&
+                        navBarRegion.left == displayArea.left &&
+                        navBarRegion.right == displayArea.right
+                Position.LEFT ->
+                    navBarRegion.left == displayArea.left &&
+                        navBarRegion.top == displayArea.top &&
+                        navBarRegion.bottom == displayArea.bottom
+                Position.RIGHT ->
+                    navBarRegion.right == displayArea.right &&
+                        navBarRegion.top == displayArea.top &&
+                        navBarRegion.bottom == displayArea.bottom
+                else -> error("Unknown position $navBarPosition")
+            }
+        }
+    }
 }
diff --git a/tests/FlickerTests/Notification/src/com/android/server/wm/flicker/notification/OpenAppFromLockscreenNotificationWithOverlayAppTest.kt b/tests/FlickerTests/Notification/src/com/android/server/wm/flicker/notification/OpenAppFromLockscreenNotificationWithOverlayAppTest.kt
index 8e210d4..f1df8a6 100644
--- a/tests/FlickerTests/Notification/src/com/android/server/wm/flicker/notification/OpenAppFromLockscreenNotificationWithOverlayAppTest.kt
+++ b/tests/FlickerTests/Notification/src/com/android/server/wm/flicker/notification/OpenAppFromLockscreenNotificationWithOverlayAppTest.kt
@@ -123,7 +123,9 @@
     @Test
     override fun navBarWindowIsAlwaysVisible() = super.navBarWindowIsAlwaysVisible()
 
-    @Presubmit @Test override fun entireScreenCovered() = super.entireScreenCovered()
+    @FlakyTest(bugId = 227143265)
+    @Test
+    override fun entireScreenCovered() = super.entireScreenCovered()
 
     @FlakyTest(bugId = 278227468)
     @Test
diff --git a/tests/FlickerTests/README.md b/tests/FlickerTests/README.md
index 6b28fdf..7429250 100644
--- a/tests/FlickerTests/README.md
+++ b/tests/FlickerTests/README.md
@@ -7,82 +7,17 @@
 
 ## Adding a Test
 
-By default tests should inherit from `RotationTestBase` or `NonRotationTestBase` and must override the variable `transitionToRun` (Kotlin) or the function `getTransitionToRun()` (Java).
-Only tests that are not supported by these classes should inherit directly from the `FlickerTestBase` class.
+By default, tests should inherit from `TestBase` and override the variable `transition` (Kotlin) or the function `getTransition()` (Java).
 
-### Rotation animations and transitions
+Inheriting from this class ensures the common assertions will be executed, namely:
 
-Tests that rotate the device should inherit from `RotationTestBase`.
-Tests that inherit from the class automatically receive start and end rotation values.  
-Moreover, these tests inherit the following checks:
 * all regions on the screen are covered
 * status bar is always visible
-* status bar rotates
+* status bar is at the correct position at the start and end of the transition
 * nav bar is always visible
-* nav bar is rotates
+* nav bar is at the correct position at the start and end of the transition
 
 The default tests can be disabled by overriding the respective methods and including an `@Ignore` annotation.
 
-### Non-Rotation animations and transitions
+For more examples of how a test looks like check `ChangeAppRotationTest` within the `Rotation` subdirectory.
 
-`NonRotationTestBase` was created to make it easier to write tests that do not involve rotation (e.g., `Pip`, `split screen` or `IME`).
-Tests that inherit from the class are automatically executed twice: once in portrait and once in landscape mode and the assertions are checked independently.
-Moreover, these tests inherit the following checks:
-* all regions on the screen are covered
-* status bar is always visible
-* nav bar is always visible
-
-The default tests can be disabled by overriding the respective methods and including an `@Ignore` annotation.
-
-### Exceptional cases
-
-Tests that rotate the device should inherit from `RotationTestBase`.
-This class allows the test to be freely configured and does not provide any assertions.  
-
-
-### Example
-
-Start by defining common or error prone transitions using `TransitionRunner`.
-```kotlin
-@LargeTest
-@RunWith(Parameterized::class)
-@FixMethodOrder(MethodSorters.NAME_ASCENDING)
-class MyTest(
-    beginRotationName: String,
-    beginRotation: Int
-) : NonRotationTestBase(beginRotationName, beginRotation) {
-    init {
-        mTestApp = MyAppHelper(InstrumentationRegistry.getInstrumentation())
-    }
-
-    override val transitionToRun: TransitionRunner
-        get() = TransitionRunner.newBuilder()
-            .withTag("myTest")
-            .recordAllRuns()
-            .runBefore { device.pressHome() }
-            .runBefore { device.waitForIdle() }
-            .run { testApp.open() }
-            .runAfter{ testApp.exit() }
-            .repeat(2)
-            .includeJankyRuns()
-            .build()
-
-    @Test
-    fun myWMTest() {
-        checkResults {
-            WmTraceSubject.assertThat(it)
-                    .showsAppWindow(MyTestApp)
-                    .forAllEntries()
-        }
-    }
-
-    @Test
-    fun mySFTest() {
-        checkResults {
-            LayersTraceSubject.assertThat(it)
-                    .showsLayer(MyTestApp)
-                    .forAllEntries()
-        }
-    }
-}
-```
diff --git a/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/GameAppHelper.kt b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/GameAppHelper.kt
index 0c60f28..ffed408 100644
--- a/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/GameAppHelper.kt
+++ b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/GameAppHelper.kt
@@ -47,7 +47,7 @@
         val bound = gameView.getVisibleBounds()
         return uiDevice.swipe(
             bound.centerX(),
-            bound.top,
+            0,
             bound.centerX(),
             bound.centerY(),
             SWIPE_STEPS
diff --git a/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt b/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt
index e60764f..80282c3 100644
--- a/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt
+++ b/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt
@@ -33,7 +33,6 @@
 import android.os.Bundle
 import android.os.test.TestLooper
 import android.platform.test.annotations.Presubmit
-import android.provider.Settings
 import android.util.proto.ProtoOutputStream
 import android.view.InputDevice
 import android.view.inputmethod.InputMethodInfo
@@ -47,9 +46,7 @@
 import org.junit.After
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertNotEquals
-import org.junit.Assert.assertNull
 import org.junit.Assert.assertTrue
-import org.junit.Assert.assertThrows
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -234,631 +231,326 @@
     }
 
     @Test
-    fun testDefaultUi_getKeyboardLayouts() {
-        NewSettingsApiFlag(false).use {
-            val keyboardLayouts = keyboardLayoutManager.keyboardLayouts
-            assertNotEquals(
-                "Default UI: Keyboard layout API should not return empty array",
-                0,
-                keyboardLayouts.size
-            )
-            assertTrue(
-                "Default UI: Keyboard layout API should provide English(US) layout",
-                hasLayout(keyboardLayouts, ENGLISH_US_LAYOUT_DESCRIPTOR)
-            )
-        }
+    fun testGetKeyboardLayouts() {
+        val keyboardLayouts = keyboardLayoutManager.keyboardLayouts
+        assertNotEquals(
+            "Keyboard layout API should not return empty array",
+            0,
+            keyboardLayouts.size
+        )
+        assertTrue(
+            "Keyboard layout API should provide English(US) layout",
+            hasLayout(keyboardLayouts, ENGLISH_US_LAYOUT_DESCRIPTOR)
+        )
     }
 
     @Test
-    fun testNewUi_getKeyboardLayouts() {
-        NewSettingsApiFlag(true).use {
-            val keyboardLayouts = keyboardLayoutManager.keyboardLayouts
-            assertNotEquals(
-                "New UI: Keyboard layout API should not return empty array",
-                0,
-                keyboardLayouts.size
-            )
-            assertTrue(
-                "New UI: Keyboard layout API should provide English(US) layout",
-                hasLayout(keyboardLayouts, ENGLISH_US_LAYOUT_DESCRIPTOR)
-            )
-        }
+    fun testGetKeyboardLayout() {
+        val keyboardLayout =
+            keyboardLayoutManager.getKeyboardLayout(ENGLISH_US_LAYOUT_DESCRIPTOR)
+        assertEquals("getKeyboardLayout API should return correct Layout from " +
+                "available layouts",
+            ENGLISH_US_LAYOUT_DESCRIPTOR,
+            keyboardLayout!!.descriptor
+        )
     }
 
     @Test
-    fun testDefaultUi_getKeyboardLayoutsForInputDevice() {
-        NewSettingsApiFlag(false).use {
-            val keyboardLayouts =
-                keyboardLayoutManager.getKeyboardLayoutsForInputDevice(keyboardDevice.identifier)
-            assertNotEquals(
-                "Default UI: getKeyboardLayoutsForInputDevice API should not return empty array",
-                0,
-                keyboardLayouts.size
-            )
-            assertTrue(
-                "Default UI: getKeyboardLayoutsForInputDevice API should provide English(US) " +
-                        "layout",
-                hasLayout(keyboardLayouts, ENGLISH_US_LAYOUT_DESCRIPTOR)
-            )
+    fun testGetSetKeyboardLayoutForInputDevice_withImeInfo() {
+        val imeSubtype = createImeSubtype()
 
-            val vendorSpecificKeyboardLayouts =
-                keyboardLayoutManager.getKeyboardLayoutsForInputDevice(
-                    vendorSpecificKeyboardDevice.identifier
-                )
-            assertEquals(
-                "Default UI: getKeyboardLayoutsForInputDevice API should return only vendor " +
-                        "specific layout",
+        keyboardLayoutManager.setKeyboardLayoutForInputDevice(
+            keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype,
+            ENGLISH_UK_LAYOUT_DESCRIPTOR
+        )
+        var result =
+            keyboardLayoutManager.getKeyboardLayoutForInputDevice(
+                keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype
+            )
+        assertEquals(
+            "getKeyboardLayoutForInputDevice API should return the set layout",
+            ENGLISH_UK_LAYOUT_DESCRIPTOR,
+            result.layoutDescriptor
+        )
+
+        // This should replace previously set layout
+        keyboardLayoutManager.setKeyboardLayoutForInputDevice(
+            keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype,
+            ENGLISH_US_LAYOUT_DESCRIPTOR
+        )
+        result =
+            keyboardLayoutManager.getKeyboardLayoutForInputDevice(
+                keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype
+            )
+        assertEquals(
+            "getKeyboardLayoutForInputDevice API should return the last set layout",
+            ENGLISH_US_LAYOUT_DESCRIPTOR,
+            result.layoutDescriptor
+        )
+    }
+
+    @Test
+    fun testGetKeyboardLayoutListForInputDevice() {
+        // Check Layouts for "hi-Latn". It should return all 'Latn' keyboard layouts
+        var keyboardLayouts =
+            keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
+                keyboardDevice.identifier, USER_ID, imeInfo,
+                createImeSubtypeForLanguageTag("hi-Latn")
+            )
+        assertNotEquals(
+            "getKeyboardLayoutListForInputDevice API should return the list of " +
+                    "supported layouts with matching script code",
+            0,
+            keyboardLayouts.size
+        )
+        assertTrue("getKeyboardLayoutListForInputDevice API should return a list " +
+                "containing English(US) layout for hi-Latn",
+            containsLayout(keyboardLayouts, ENGLISH_US_LAYOUT_DESCRIPTOR)
+        )
+        assertTrue("getKeyboardLayoutListForInputDevice API should return a list " +
+                "containing English(No script code) layout for hi-Latn",
+            containsLayout(
+                keyboardLayouts,
+                createLayoutDescriptor("keyboard_layout_english_without_script_code")
+            )
+        )
+
+        // Check Layouts for "hi" which by default uses 'Deva' script.
+        keyboardLayouts =
+            keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
+                keyboardDevice.identifier, USER_ID, imeInfo,
+                createImeSubtypeForLanguageTag("hi")
+            )
+        assertEquals("getKeyboardLayoutListForInputDevice API should return empty " +
+                "list if no supported layouts available",
+            0,
+            keyboardLayouts.size
+        )
+
+        // If user manually selected some layout, always provide it in the layout list
+        val imeSubtype = createImeSubtypeForLanguageTag("hi")
+        keyboardLayoutManager.setKeyboardLayoutForInputDevice(
+            keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype,
+            ENGLISH_US_LAYOUT_DESCRIPTOR
+        )
+        keyboardLayouts =
+            keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
+                keyboardDevice.identifier, USER_ID, imeInfo,
+                imeSubtype
+            )
+        assertEquals("getKeyboardLayoutListForInputDevice API should return user " +
+                "selected layout even if the script is incompatible with IME",
                 1,
-                vendorSpecificKeyboardLayouts.size
-            )
-            assertEquals(
-                "Default UI: getKeyboardLayoutsForInputDevice API should return vendor specific " +
-                        "layout",
-                VENDOR_SPECIFIC_LAYOUT_DESCRIPTOR,
-                vendorSpecificKeyboardLayouts[0].descriptor
-            )
-        }
-    }
+            keyboardLayouts.size
+        )
 
-    @Test
-    fun testNewUi_getKeyboardLayoutsForInputDevice() {
-        NewSettingsApiFlag(true).use {
-            val keyboardLayouts = keyboardLayoutManager.keyboardLayouts
-            assertNotEquals(
-                    "New UI: getKeyboardLayoutsForInputDevice API should not return empty array",
-                    0,
-                    keyboardLayouts.size
-            )
-            assertTrue(
-                    "New UI: getKeyboardLayoutsForInputDevice API should provide English(US) " +
-                            "layout",
-                    hasLayout(keyboardLayouts, ENGLISH_US_LAYOUT_DESCRIPTOR)
-            )
-        }
-    }
-
-    @Test
-    fun testDefaultUi_getSetCurrentKeyboardLayoutForInputDevice() {
-        NewSettingsApiFlag(false).use {
-            assertNull(
-                "Default UI: getCurrentKeyboardLayoutForInputDevice API should return null if " +
-                        "nothing was set",
-                keyboardLayoutManager.getCurrentKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier
-                )
-            )
-
-            keyboardLayoutManager.setCurrentKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier,
-                ENGLISH_US_LAYOUT_DESCRIPTOR
-            )
-            val keyboardLayout =
-                keyboardLayoutManager.getCurrentKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier
-                )
-            assertEquals(
-                "Default UI: getCurrentKeyboardLayoutForInputDevice API should return the set " +
-                        "layout",
-                ENGLISH_US_LAYOUT_DESCRIPTOR,
-                keyboardLayout
-            )
-        }
-    }
-
-    @Test
-    fun testNewUi_getSetCurrentKeyboardLayoutForInputDevice() {
-        NewSettingsApiFlag(true).use {
-            keyboardLayoutManager.setCurrentKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier,
-                ENGLISH_US_LAYOUT_DESCRIPTOR
-            )
-            assertNull(
-                "New UI: getCurrentKeyboardLayoutForInputDevice API should always return null " +
-                        "even after setCurrentKeyboardLayoutForInputDevice",
-                keyboardLayoutManager.getCurrentKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier
-                )
-            )
-        }
-    }
-
-    @Test
-    fun testDefaultUi_getEnabledKeyboardLayoutsForInputDevice() {
-        NewSettingsApiFlag(false).use {
-            keyboardLayoutManager.addKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier, ENGLISH_US_LAYOUT_DESCRIPTOR
-            )
-
-            val keyboardLayouts =
-                keyboardLayoutManager.getEnabledKeyboardLayoutsForInputDevice(
-                    keyboardDevice.identifier
-                )
-            assertEquals(
-                "Default UI: getEnabledKeyboardLayoutsForInputDevice API should return added " +
-                        "layout",
-                1,
-                keyboardLayouts.size
-            )
-            assertEquals(
-                "Default UI: getEnabledKeyboardLayoutsForInputDevice API should return " +
-                        "English(US) layout",
-                ENGLISH_US_LAYOUT_DESCRIPTOR,
-                keyboardLayouts[0]
-            )
-            assertEquals(
-                "Default UI: getCurrentKeyboardLayoutForInputDevice API should return " +
-                        "English(US) layout (Auto select the first enabled layout)",
-                ENGLISH_US_LAYOUT_DESCRIPTOR,
-                keyboardLayoutManager.getCurrentKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier
-                )
-            )
-
-            keyboardLayoutManager.removeKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier, ENGLISH_US_LAYOUT_DESCRIPTOR
-            )
-            assertEquals(
-                "Default UI: getKeyboardLayoutsForInputDevice API should return 0 layouts",
-                0,
-                keyboardLayoutManager.getEnabledKeyboardLayoutsForInputDevice(
-                    keyboardDevice.identifier
-                ).size
-            )
-            assertNull(
-                "Default UI: getCurrentKeyboardLayoutForInputDevice API should return null after " +
-                        "the enabled layout is removed",
-                keyboardLayoutManager.getCurrentKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier
-                )
-            )
-        }
-    }
-
-    @Test
-    fun testNewUi_getEnabledKeyboardLayoutsForInputDevice() {
-        NewSettingsApiFlag(true).use {
-            keyboardLayoutManager.addKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier, ENGLISH_US_LAYOUT_DESCRIPTOR
-            )
-
-            assertEquals(
-                "New UI: getEnabledKeyboardLayoutsForInputDevice API should return always return " +
-                        "an empty array",
-                0,
-                keyboardLayoutManager.getEnabledKeyboardLayoutsForInputDevice(
-                    keyboardDevice.identifier
-                ).size
-            )
-            assertNull(
-                "New UI: getCurrentKeyboardLayoutForInputDevice API should always return null",
-                keyboardLayoutManager.getCurrentKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier
-                )
-            )
-        }
-    }
-
-    @Test
-    fun testDefaultUi_switchKeyboardLayout() {
-        NewSettingsApiFlag(false).use {
-            keyboardLayoutManager.addKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier, ENGLISH_US_LAYOUT_DESCRIPTOR
-            )
-            keyboardLayoutManager.addKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier, ENGLISH_UK_LAYOUT_DESCRIPTOR
-            )
-            assertEquals(
-                "Default UI: getCurrentKeyboardLayoutForInputDevice API should return " +
-                        "English(US) layout",
-                ENGLISH_US_LAYOUT_DESCRIPTOR,
-                keyboardLayoutManager.getCurrentKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier
-                )
-            )
-
-            keyboardLayoutManager.switchKeyboardLayout(DEVICE_ID, 1)
-
-            // Throws null pointer because trying to show toast using TestLooper
-            assertThrows(NullPointerException::class.java) { testLooper.dispatchAll() }
-            assertEquals("Default UI: getCurrentKeyboardLayoutForInputDevice API should return " +
-                    "English(UK) layout",
-                ENGLISH_UK_LAYOUT_DESCRIPTOR,
-                keyboardLayoutManager.getCurrentKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier
-                )
-            )
-        }
-    }
-
-    @Test
-    fun testNewUi_switchKeyboardLayout() {
-        NewSettingsApiFlag(true).use {
-            keyboardLayoutManager.addKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier, ENGLISH_US_LAYOUT_DESCRIPTOR
-            )
-            keyboardLayoutManager.addKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier, ENGLISH_UK_LAYOUT_DESCRIPTOR
-            )
-
-            keyboardLayoutManager.switchKeyboardLayout(DEVICE_ID, 1)
-            testLooper.dispatchAll()
-
-            assertNull("New UI: getCurrentKeyboardLayoutForInputDevice API should always return " +
-                    "null",
-                keyboardLayoutManager.getCurrentKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier
-                )
-            )
-        }
-    }
-
-    @Test
-    fun testDefaultUi_getKeyboardLayout() {
-        NewSettingsApiFlag(false).use {
-            val keyboardLayout =
-                keyboardLayoutManager.getKeyboardLayout(ENGLISH_US_LAYOUT_DESCRIPTOR)
-            assertEquals("Default UI: getKeyboardLayout API should return correct Layout from " +
-                    "available layouts",
-                ENGLISH_US_LAYOUT_DESCRIPTOR,
-                keyboardLayout!!.descriptor
-            )
-        }
-    }
-
-    @Test
-    fun testNewUi_getKeyboardLayout() {
-        NewSettingsApiFlag(true).use {
-            val keyboardLayout =
-                keyboardLayoutManager.getKeyboardLayout(ENGLISH_US_LAYOUT_DESCRIPTOR)
-            assertEquals("New UI: getKeyboardLayout API should return correct Layout from " +
-                    "available layouts",
-                ENGLISH_US_LAYOUT_DESCRIPTOR,
-                keyboardLayout!!.descriptor
-            )
-        }
-    }
-
-    @Test
-    fun testDefaultUi_getSetKeyboardLayoutForInputDevice_WithImeInfo() {
-        NewSettingsApiFlag(false).use {
-            val imeSubtype = createImeSubtype()
-            keyboardLayoutManager.setKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype,
-                ENGLISH_UK_LAYOUT_DESCRIPTOR
-            )
-            assertEquals(
-                "Default UI: getKeyboardLayoutForInputDevice API should always return " +
-                        "KeyboardLayoutSelectionResult.FAILED",
-                KeyboardLayoutSelectionResult.FAILED,
-                keyboardLayoutManager.getKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype
-                )
-            )
-        }
-    }
-
-    @Test
-    fun testNewUi_getSetKeyboardLayoutForInputDevice_withImeInfo() {
-        NewSettingsApiFlag(true).use {
-            val imeSubtype = createImeSubtype()
-
-            keyboardLayoutManager.setKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype,
-                ENGLISH_UK_LAYOUT_DESCRIPTOR
-            )
-            var result =
-                keyboardLayoutManager.getKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype
-                )
-            assertEquals(
-                "New UI: getKeyboardLayoutForInputDevice API should return the set layout",
-                ENGLISH_UK_LAYOUT_DESCRIPTOR,
-                result.layoutDescriptor
-            )
-
-            // This should replace previously set layout
-            keyboardLayoutManager.setKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype,
-                ENGLISH_US_LAYOUT_DESCRIPTOR
-            )
-            result =
-                keyboardLayoutManager.getKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype
-                )
-            assertEquals(
-                "New UI: getKeyboardLayoutForInputDevice API should return the last set layout",
-                ENGLISH_US_LAYOUT_DESCRIPTOR,
-                result.layoutDescriptor
-            )
-        }
-    }
-
-    @Test
-    fun testDefaultUi_getKeyboardLayoutListForInputDevice() {
-        NewSettingsApiFlag(false).use {
-            val keyboardLayouts =
-                keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
+        // Special case Japanese: UScript ignores provided script code for certain language tags
+        // Should manually match provided script codes and then rely on Uscript to derive
+        // script from language tags and match those.
+        keyboardLayouts =
+            keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
                     keyboardDevice.identifier, USER_ID, imeInfo,
-                    createImeSubtype()
-                )
-            assertEquals("Default UI: getKeyboardLayoutListForInputDevice API should always " +
-                    "return empty array",
-                0,
-                keyboardLayouts.size
+                    createImeSubtypeForLanguageTag("ja-Latn-JP")
             )
-        }
-    }
+        assertNotEquals(
+            "getKeyboardLayoutListForInputDevice API should return the list of " +
+                    "supported layouts with matching script code for ja-Latn-JP",
+            0,
+            keyboardLayouts.size
+        )
+        assertTrue("getKeyboardLayoutListForInputDevice API should return a list " +
+                "containing English(US) layout for ja-Latn-JP",
+            containsLayout(keyboardLayouts, ENGLISH_US_LAYOUT_DESCRIPTOR)
+        )
+        assertTrue("getKeyboardLayoutListForInputDevice API should return a list " +
+                "containing English(No script code) layout for ja-Latn-JP",
+            containsLayout(
+                keyboardLayouts,
+                createLayoutDescriptor("keyboard_layout_english_without_script_code")
+            )
+        )
 
-    @Test
-    fun testNewUi_getKeyboardLayoutListForInputDevice() {
-        NewSettingsApiFlag(true).use {
-            // Check Layouts for "hi-Latn". It should return all 'Latn' keyboard layouts
-            var keyboardLayouts =
-                keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
+        // If script code not explicitly provided for Japanese should rely on Uscript to find
+        // derived script code and hence no suitable layout will be found.
+        keyboardLayouts =
+            keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
                     keyboardDevice.identifier, USER_ID, imeInfo,
-                    createImeSubtypeForLanguageTag("hi-Latn")
-                )
-            assertNotEquals(
-                "New UI: getKeyboardLayoutListForInputDevice API should return the list of " +
-                        "supported layouts with matching script code",
-                0,
-                keyboardLayouts.size
+                    createImeSubtypeForLanguageTag("ja-JP")
             )
-            assertTrue("New UI: getKeyboardLayoutListForInputDevice API should return a list " +
-                    "containing English(US) layout for hi-Latn",
-                containsLayout(keyboardLayouts, ENGLISH_US_LAYOUT_DESCRIPTOR)
-            )
-            assertTrue("New UI: getKeyboardLayoutListForInputDevice API should return a list " +
-                    "containing English(No script code) layout for hi-Latn",
-                containsLayout(
-                    keyboardLayouts,
-                    createLayoutDescriptor("keyboard_layout_english_without_script_code")
-                )
-            )
+        assertEquals(
+            "getKeyboardLayoutListForInputDevice API should return empty list of " +
+                    "supported layouts with matching script code for ja-JP",
+            0,
+            keyboardLayouts.size
+        )
 
-            // Check Layouts for "hi" which by default uses 'Deva' script.
-            keyboardLayouts =
-                keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
-                    keyboardDevice.identifier, USER_ID, imeInfo,
-                    createImeSubtypeForLanguageTag("hi")
-                )
-            assertEquals("New UI: getKeyboardLayoutListForInputDevice API should return empty " +
-                    "list if no supported layouts available",
-                0,
-                keyboardLayouts.size
+        // If IME doesn't have a corresponding language tag, then should show all available
+        // layouts no matter the script code.
+        keyboardLayouts =
+            keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
+                keyboardDevice.identifier, USER_ID, imeInfo, null
             )
-
-            // If user manually selected some layout, always provide it in the layout list
-            val imeSubtype = createImeSubtypeForLanguageTag("hi")
-            keyboardLayoutManager.setKeyboardLayoutForInputDevice(
-                keyboardDevice.identifier, USER_ID, imeInfo, imeSubtype,
-                ENGLISH_US_LAYOUT_DESCRIPTOR
-            )
-            keyboardLayouts =
-                keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
-                    keyboardDevice.identifier, USER_ID, imeInfo,
-                    imeSubtype
-                )
-            assertEquals("New UI: getKeyboardLayoutListForInputDevice API should return user " +
-                    "selected layout even if the script is incompatible with IME",
-                    1,
-                keyboardLayouts.size
-            )
-
-            // Special case Japanese: UScript ignores provided script code for certain language tags
-            // Should manually match provided script codes and then rely on Uscript to derive
-            // script from language tags and match those.
-            keyboardLayouts =
-                keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
-                        keyboardDevice.identifier, USER_ID, imeInfo,
-                        createImeSubtypeForLanguageTag("ja-Latn-JP")
-                )
-            assertNotEquals(
-                "New UI: getKeyboardLayoutListForInputDevice API should return the list of " +
-                        "supported layouts with matching script code for ja-Latn-JP",
-                0,
-                keyboardLayouts.size
-            )
-            assertTrue("New UI: getKeyboardLayoutListForInputDevice API should return a list " +
-                    "containing English(US) layout for ja-Latn-JP",
-                containsLayout(keyboardLayouts, ENGLISH_US_LAYOUT_DESCRIPTOR)
-            )
-            assertTrue("New UI: getKeyboardLayoutListForInputDevice API should return a list " +
-                    "containing English(No script code) layout for ja-Latn-JP",
-                containsLayout(
-                    keyboardLayouts,
-                    createLayoutDescriptor("keyboard_layout_english_without_script_code")
-                )
-            )
-
-            // If script code not explicitly provided for Japanese should rely on Uscript to find
-            // derived script code and hence no suitable layout will be found.
-            keyboardLayouts =
-                keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
-                        keyboardDevice.identifier, USER_ID, imeInfo,
-                        createImeSubtypeForLanguageTag("ja-JP")
-                )
-            assertEquals(
-                "New UI: getKeyboardLayoutListForInputDevice API should return empty list of " +
-                        "supported layouts with matching script code for ja-JP",
-                0,
-                keyboardLayouts.size
-            )
-
-            // If IME doesn't have a corresponding language tag, then should show all available
-            // layouts no matter the script code.
-            keyboardLayouts =
-                keyboardLayoutManager.getKeyboardLayoutListForInputDevice(
-                    keyboardDevice.identifier, USER_ID, imeInfo, null
-                )
-            assertNotEquals(
-                "New UI: getKeyboardLayoutListForInputDevice API should return all layouts if" +
-                    "language tag or subtype not provided",
-                0,
-                keyboardLayouts.size
-            )
-            assertTrue("New UI: getKeyboardLayoutListForInputDevice API should contain Latin " +
-                "layouts if language tag or subtype not provided",
-                containsLayout(keyboardLayouts, ENGLISH_US_LAYOUT_DESCRIPTOR)
-            )
-            assertTrue("New UI: getKeyboardLayoutListForInputDevice API should contain Cyrillic " +
-                "layouts if language tag or subtype not provided",
-                containsLayout(
-                    keyboardLayouts,
-                    createLayoutDescriptor("keyboard_layout_russian")
-                )
-            )
-        }
-    }
-
-    @Test
-    fun testNewUi_getDefaultKeyboardLayoutForInputDevice_withImeLanguageTag() {
-        NewSettingsApiFlag(true).use {
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTag("en-US"),
-                ENGLISH_US_LAYOUT_DESCRIPTOR
-            )
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTag("en-GB"),
-                ENGLISH_UK_LAYOUT_DESCRIPTOR
-            )
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTag("de"),
-                GERMAN_LAYOUT_DESCRIPTOR
-            )
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTag("fr-FR"),
-                createLayoutDescriptor("keyboard_layout_french")
-            )
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTag("ru"),
+        assertNotEquals(
+            "getKeyboardLayoutListForInputDevice API should return all layouts if" +
+                "language tag or subtype not provided",
+            0,
+            keyboardLayouts.size
+        )
+        assertTrue("getKeyboardLayoutListForInputDevice API should contain Latin " +
+            "layouts if language tag or subtype not provided",
+            containsLayout(keyboardLayouts, ENGLISH_US_LAYOUT_DESCRIPTOR)
+        )
+        assertTrue("getKeyboardLayoutListForInputDevice API should contain Cyrillic " +
+            "layouts if language tag or subtype not provided",
+            containsLayout(
+                keyboardLayouts,
                 createLayoutDescriptor("keyboard_layout_russian")
             )
-            assertEquals(
-                "New UI: getDefaultKeyboardLayoutForInputDevice should return " +
-                        "KeyboardLayoutSelectionResult.FAILED when no layout available",
-                KeyboardLayoutSelectionResult.FAILED,
-                keyboardLayoutManager.getKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier, USER_ID, imeInfo,
-                    createImeSubtypeForLanguageTag("it")
-                )
-            )
-            assertEquals(
-                "New UI: getDefaultKeyboardLayoutForInputDevice should return " +
-                        "KeyboardLayoutSelectionResult.FAILED when no layout for script code is" +
-                        "available",
-                KeyboardLayoutSelectionResult.FAILED,
-                keyboardLayoutManager.getKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier, USER_ID, imeInfo,
-                    createImeSubtypeForLanguageTag("en-Deva")
-                )
-            )
-        }
+        )
     }
 
     @Test
-    fun testNewUi_getDefaultKeyboardLayoutForInputDevice_withImeLanguageTagAndLayoutType() {
-        NewSettingsApiFlag(true).use {
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTagAndLayoutType("en-US", "qwerty"),
-                ENGLISH_US_LAYOUT_DESCRIPTOR
+    fun testGetDefaultKeyboardLayoutForInputDevice_withImeLanguageTag() {
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTag("en-US"),
+            ENGLISH_US_LAYOUT_DESCRIPTOR
+        )
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTag("en-GB"),
+            ENGLISH_UK_LAYOUT_DESCRIPTOR
+        )
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTag("de"),
+            GERMAN_LAYOUT_DESCRIPTOR
+        )
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTag("fr-FR"),
+            createLayoutDescriptor("keyboard_layout_french")
+        )
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTag("ru"),
+            createLayoutDescriptor("keyboard_layout_russian")
+        )
+        assertEquals(
+            "getDefaultKeyboardLayoutForInputDevice should return " +
+                    "KeyboardLayoutSelectionResult.FAILED when no layout available",
+            KeyboardLayoutSelectionResult.FAILED,
+            keyboardLayoutManager.getKeyboardLayoutForInputDevice(
+                keyboardDevice.identifier, USER_ID, imeInfo,
+                createImeSubtypeForLanguageTag("it")
             )
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTagAndLayoutType("en-US", "dvorak"),
-                createLayoutDescriptor("keyboard_layout_english_us_dvorak")
-            )
-            // Try to match layout type even if country doesn't match
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTagAndLayoutType("en-GB", "dvorak"),
-                createLayoutDescriptor("keyboard_layout_english_us_dvorak")
-            )
-            // Choose layout based on layout type priority, if layout type is not provided by IME
-            // (Qwerty > Dvorak > Extended)
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTagAndLayoutType("en-US", ""),
-                ENGLISH_US_LAYOUT_DESCRIPTOR
-            )
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTagAndLayoutType("en-GB", "qwerty"),
-                ENGLISH_UK_LAYOUT_DESCRIPTOR
-            )
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTagAndLayoutType("de", "qwertz"),
-                GERMAN_LAYOUT_DESCRIPTOR
-            )
-            // Wrong layout type should match with language if provided layout type not available
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTagAndLayoutType("de", "qwerty"),
-                GERMAN_LAYOUT_DESCRIPTOR
-            )
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTagAndLayoutType("fr-FR", "azerty"),
-                createLayoutDescriptor("keyboard_layout_french")
-            )
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTagAndLayoutType("ru", "qwerty"),
-                createLayoutDescriptor("keyboard_layout_russian_qwerty")
-            )
-            // If layout type is empty then prioritize KCM with empty layout type
-            assertCorrectLayout(
-                keyboardDevice,
-                createImeSubtypeForLanguageTagAndLayoutType("ru", ""),
-                createLayoutDescriptor("keyboard_layout_russian")
-            )
-            assertEquals("New UI: getDefaultKeyboardLayoutForInputDevice should return " +
+        )
+        assertEquals(
+            "getDefaultKeyboardLayoutForInputDevice should return " +
                     "KeyboardLayoutSelectionResult.FAILED when no layout for script code is" +
                     "available",
-                KeyboardLayoutSelectionResult.FAILED,
-                keyboardLayoutManager.getKeyboardLayoutForInputDevice(
-                    keyboardDevice.identifier, USER_ID, imeInfo,
-                    createImeSubtypeForLanguageTagAndLayoutType("en-Deva-US", "")
-                )
+            KeyboardLayoutSelectionResult.FAILED,
+            keyboardLayoutManager.getKeyboardLayoutForInputDevice(
+                keyboardDevice.identifier, USER_ID, imeInfo,
+                createImeSubtypeForLanguageTag("en-Deva")
             )
-        }
+        )
     }
 
     @Test
-    fun testNewUi_getDefaultKeyboardLayoutForInputDevice_withHwLanguageTagAndLayoutType() {
-        NewSettingsApiFlag(true).use {
-            val frenchSubtype = createImeSubtypeForLanguageTagAndLayoutType("fr", "azerty")
-            // Should return English dvorak even if IME current layout is French, since HW says the
-            // keyboard is a Dvorak keyboard
-            assertCorrectLayout(
-                englishDvorakKeyboardDevice,
-                frenchSubtype,
-                createLayoutDescriptor("keyboard_layout_english_us_dvorak")
+    fun testGetDefaultKeyboardLayoutForInputDevice_withImeLanguageTagAndLayoutType() {
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTagAndLayoutType("en-US", "qwerty"),
+            ENGLISH_US_LAYOUT_DESCRIPTOR
+        )
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTagAndLayoutType("en-US", "dvorak"),
+            createLayoutDescriptor("keyboard_layout_english_us_dvorak")
+        )
+        // Try to match layout type even if country doesn't match
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTagAndLayoutType("en-GB", "dvorak"),
+            createLayoutDescriptor("keyboard_layout_english_us_dvorak")
+        )
+        // Choose layout based on layout type priority, if layout type is not provided by IME
+        // (Qwerty > Dvorak > Extended)
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTagAndLayoutType("en-US", ""),
+            ENGLISH_US_LAYOUT_DESCRIPTOR
+        )
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTagAndLayoutType("en-GB", "qwerty"),
+            ENGLISH_UK_LAYOUT_DESCRIPTOR
+        )
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTagAndLayoutType("de", "qwertz"),
+            GERMAN_LAYOUT_DESCRIPTOR
+        )
+        // Wrong layout type should match with language if provided layout type not available
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTagAndLayoutType("de", "qwerty"),
+            GERMAN_LAYOUT_DESCRIPTOR
+        )
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTagAndLayoutType("fr-FR", "azerty"),
+            createLayoutDescriptor("keyboard_layout_french")
+        )
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTagAndLayoutType("ru", "qwerty"),
+            createLayoutDescriptor("keyboard_layout_russian_qwerty")
+        )
+        // If layout type is empty then prioritize KCM with empty layout type
+        assertCorrectLayout(
+            keyboardDevice,
+            createImeSubtypeForLanguageTagAndLayoutType("ru", ""),
+            createLayoutDescriptor("keyboard_layout_russian")
+        )
+        assertEquals("getDefaultKeyboardLayoutForInputDevice should return " +
+                "KeyboardLayoutSelectionResult.FAILED when no layout for script code is" +
+                "available",
+            KeyboardLayoutSelectionResult.FAILED,
+            keyboardLayoutManager.getKeyboardLayoutForInputDevice(
+                keyboardDevice.identifier, USER_ID, imeInfo,
+                createImeSubtypeForLanguageTagAndLayoutType("en-Deva-US", "")
             )
+        )
+    }
 
-            // Back to back changing HW keyboards with same product and vendor ID but different
-            // language and layout type should configure the layouts correctly.
-            assertCorrectLayout(
-                englishQwertyKeyboardDevice,
-                frenchSubtype,
-                createLayoutDescriptor("keyboard_layout_english_us")
-            )
+    @Test
+    fun testGetDefaultKeyboardLayoutForInputDevice_withHwLanguageTagAndLayoutType() {
+        val frenchSubtype = createImeSubtypeForLanguageTagAndLayoutType("fr", "azerty")
+        // Should return English dvorak even if IME current layout is French, since HW says the
+        // keyboard is a Dvorak keyboard
+        assertCorrectLayout(
+            englishDvorakKeyboardDevice,
+            frenchSubtype,
+            createLayoutDescriptor("keyboard_layout_english_us_dvorak")
+        )
 
-            // Fallback to IME information if the HW provided layout script is incompatible with the
-            // provided IME subtype
-            assertCorrectLayout(
-                englishDvorakKeyboardDevice,
-                createImeSubtypeForLanguageTagAndLayoutType("ru", ""),
-                createLayoutDescriptor("keyboard_layout_russian")
-            )
-        }
+        // Back to back changing HW keyboards with same product and vendor ID but different
+        // language and layout type should configure the layouts correctly.
+        assertCorrectLayout(
+            englishQwertyKeyboardDevice,
+            frenchSubtype,
+            createLayoutDescriptor("keyboard_layout_english_us")
+        )
+
+        // Fallback to IME information if the HW provided layout script is incompatible with the
+        // provided IME subtype
+        assertCorrectLayout(
+            englishDvorakKeyboardDevice,
+            createImeSubtypeForLanguageTagAndLayoutType("ru", ""),
+            createLayoutDescriptor("keyboard_layout_russian")
+        )
     }
 
     @Test
@@ -867,27 +559,25 @@
                 KeyboardLayoutManager.ImeInfo(0, imeInfo,
                         createImeSubtypeForLanguageTagAndLayoutType("de-Latn", "qwertz")))
         Mockito.doReturn(imeInfos).`when`(keyboardLayoutManager).imeInfoListForLayoutMapping
-        NewSettingsApiFlag(true).use {
-            keyboardLayoutManager.onInputDeviceAdded(keyboardDevice.id)
-            ExtendedMockito.verify {
-                FrameworkStatsLog.write(
-                        ArgumentMatchers.eq(FrameworkStatsLog.KEYBOARD_CONFIGURED),
-                        ArgumentMatchers.anyBoolean(),
-                        ArgumentMatchers.eq(keyboardDevice.vendorId),
-                        ArgumentMatchers.eq(keyboardDevice.productId),
-                        ArgumentMatchers.eq(
-                            createByteArray(
-                                KeyboardMetricsCollector.DEFAULT_LANGUAGE_TAG,
-                                LAYOUT_TYPE_DEFAULT,
-                                GERMAN_LAYOUT_NAME,
-                                KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD,
-                                "de-Latn",
-                                LAYOUT_TYPE_QWERTZ
-                            ),
+        keyboardLayoutManager.onInputDeviceAdded(keyboardDevice.id)
+        ExtendedMockito.verify {
+            FrameworkStatsLog.write(
+                    ArgumentMatchers.eq(FrameworkStatsLog.KEYBOARD_CONFIGURED),
+                    ArgumentMatchers.anyBoolean(),
+                    ArgumentMatchers.eq(keyboardDevice.vendorId),
+                    ArgumentMatchers.eq(keyboardDevice.productId),
+                    ArgumentMatchers.eq(
+                        createByteArray(
+                            KeyboardMetricsCollector.DEFAULT_LANGUAGE_TAG,
+                            LAYOUT_TYPE_DEFAULT,
+                            GERMAN_LAYOUT_NAME,
+                            KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD,
+                            "de-Latn",
+                            LAYOUT_TYPE_QWERTZ
                         ),
-                        ArgumentMatchers.eq(keyboardDevice.deviceBus),
-                )
-            }
+                    ),
+                    ArgumentMatchers.eq(keyboardDevice.deviceBus),
+            )
         }
     }
 
@@ -897,27 +587,25 @@
                 KeyboardLayoutManager.ImeInfo(0, imeInfo,
                         createImeSubtypeForLanguageTagAndLayoutType("de-Latn", "qwertz")))
         Mockito.doReturn(imeInfos).`when`(keyboardLayoutManager).imeInfoListForLayoutMapping
-        NewSettingsApiFlag(true).use {
-            keyboardLayoutManager.onInputDeviceAdded(englishQwertyKeyboardDevice.id)
-            ExtendedMockito.verify {
-                FrameworkStatsLog.write(
-                        ArgumentMatchers.eq(FrameworkStatsLog.KEYBOARD_CONFIGURED),
-                        ArgumentMatchers.anyBoolean(),
-                        ArgumentMatchers.eq(englishQwertyKeyboardDevice.vendorId),
-                        ArgumentMatchers.eq(englishQwertyKeyboardDevice.productId),
-                        ArgumentMatchers.eq(
-                            createByteArray(
-                                "en",
-                                LAYOUT_TYPE_QWERTY,
-                                ENGLISH_US_LAYOUT_NAME,
-                                KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_DEVICE,
-                                "de-Latn",
-                                LAYOUT_TYPE_QWERTZ
-                            )
-                        ),
-                        ArgumentMatchers.eq(keyboardDevice.deviceBus),
-                )
-            }
+        keyboardLayoutManager.onInputDeviceAdded(englishQwertyKeyboardDevice.id)
+        ExtendedMockito.verify {
+            FrameworkStatsLog.write(
+                    ArgumentMatchers.eq(FrameworkStatsLog.KEYBOARD_CONFIGURED),
+                    ArgumentMatchers.anyBoolean(),
+                    ArgumentMatchers.eq(englishQwertyKeyboardDevice.vendorId),
+                    ArgumentMatchers.eq(englishQwertyKeyboardDevice.productId),
+                    ArgumentMatchers.eq(
+                        createByteArray(
+                            "en",
+                            LAYOUT_TYPE_QWERTY,
+                            ENGLISH_US_LAYOUT_NAME,
+                            KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_DEVICE,
+                            "de-Latn",
+                            LAYOUT_TYPE_QWERTZ
+                        )
+                    ),
+                    ArgumentMatchers.eq(keyboardDevice.deviceBus),
+            )
         }
     }
 
@@ -925,27 +613,25 @@
     fun testConfigurationLogged_onInputDeviceAdded_DefaultSelection() {
         val imeInfos = listOf(KeyboardLayoutManager.ImeInfo(0, imeInfo, createImeSubtype()))
         Mockito.doReturn(imeInfos).`when`(keyboardLayoutManager).imeInfoListForLayoutMapping
-        NewSettingsApiFlag(true).use {
-            keyboardLayoutManager.onInputDeviceAdded(keyboardDevice.id)
-            ExtendedMockito.verify {
-                FrameworkStatsLog.write(
-                        ArgumentMatchers.eq(FrameworkStatsLog.KEYBOARD_CONFIGURED),
-                        ArgumentMatchers.anyBoolean(),
-                        ArgumentMatchers.eq(keyboardDevice.vendorId),
-                        ArgumentMatchers.eq(keyboardDevice.productId),
-                        ArgumentMatchers.eq(
-                            createByteArray(
-                                KeyboardMetricsCollector.DEFAULT_LANGUAGE_TAG,
-                                LAYOUT_TYPE_DEFAULT,
-                                "Default",
-                                KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_DEFAULT,
-                                KeyboardMetricsCollector.DEFAULT_LANGUAGE_TAG,
-                                LAYOUT_TYPE_DEFAULT
-                            ),
+        keyboardLayoutManager.onInputDeviceAdded(keyboardDevice.id)
+        ExtendedMockito.verify {
+            FrameworkStatsLog.write(
+                    ArgumentMatchers.eq(FrameworkStatsLog.KEYBOARD_CONFIGURED),
+                    ArgumentMatchers.anyBoolean(),
+                    ArgumentMatchers.eq(keyboardDevice.vendorId),
+                    ArgumentMatchers.eq(keyboardDevice.productId),
+                    ArgumentMatchers.eq(
+                        createByteArray(
+                            KeyboardMetricsCollector.DEFAULT_LANGUAGE_TAG,
+                            LAYOUT_TYPE_DEFAULT,
+                            "Default",
+                            KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_DEFAULT,
+                            KeyboardMetricsCollector.DEFAULT_LANGUAGE_TAG,
+                            LAYOUT_TYPE_DEFAULT
                         ),
-                        ArgumentMatchers.eq(keyboardDevice.deviceBus),
-                )
-            }
+                    ),
+                    ArgumentMatchers.eq(keyboardDevice.deviceBus),
+            )
         }
     }
 
@@ -953,19 +639,17 @@
     fun testConfigurationNotLogged_onInputDeviceChanged() {
         val imeInfos = listOf(KeyboardLayoutManager.ImeInfo(0, imeInfo, createImeSubtype()))
         Mockito.doReturn(imeInfos).`when`(keyboardLayoutManager).imeInfoListForLayoutMapping
-        NewSettingsApiFlag(true).use {
-            keyboardLayoutManager.onInputDeviceChanged(keyboardDevice.id)
-            ExtendedMockito.verify({
-                FrameworkStatsLog.write(
-                        ArgumentMatchers.eq(FrameworkStatsLog.KEYBOARD_CONFIGURED),
-                        ArgumentMatchers.anyBoolean(),
-                        ArgumentMatchers.anyInt(),
-                        ArgumentMatchers.anyInt(),
-                        ArgumentMatchers.any(ByteArray::class.java),
-                        ArgumentMatchers.anyInt(),
-                )
-            }, Mockito.times(0))
-        }
+        keyboardLayoutManager.onInputDeviceChanged(keyboardDevice.id)
+        ExtendedMockito.verify({
+            FrameworkStatsLog.write(
+                    ArgumentMatchers.eq(FrameworkStatsLog.KEYBOARD_CONFIGURED),
+                    ArgumentMatchers.anyBoolean(),
+                    ArgumentMatchers.anyInt(),
+                    ArgumentMatchers.anyInt(),
+                    ArgumentMatchers.any(ByteArray::class.java),
+                    ArgumentMatchers.anyInt(),
+            )
+        }, Mockito.times(0))
     }
 
     @Test
@@ -975,18 +659,16 @@
         Mockito.doReturn(false).`when`(keyboardLayoutManager).isVirtualDevice(
             ArgumentMatchers.eq(keyboardDevice.id)
         )
-        NewSettingsApiFlag(true).use {
-            keyboardLayoutManager.onInputDeviceChanged(keyboardDevice.id)
-            ExtendedMockito.verify(
-                notificationManager,
-                Mockito.times(1)
-            ).notifyAsUser(
-                ArgumentMatchers.isNull(),
-                ArgumentMatchers.anyInt(),
-                ArgumentMatchers.any(),
-                ArgumentMatchers.any()
-            )
-        }
+        keyboardLayoutManager.onInputDeviceChanged(keyboardDevice.id)
+        ExtendedMockito.verify(
+            notificationManager,
+            Mockito.times(1)
+        ).notifyAsUser(
+            ArgumentMatchers.isNull(),
+            ArgumentMatchers.anyInt(),
+            ArgumentMatchers.any(),
+            ArgumentMatchers.any()
+        )
     }
 
     @Test
@@ -996,18 +678,16 @@
         Mockito.doReturn(true).`when`(keyboardLayoutManager).isVirtualDevice(
             ArgumentMatchers.eq(keyboardDevice.id)
         )
-        NewSettingsApiFlag(true).use {
-            keyboardLayoutManager.onInputDeviceChanged(keyboardDevice.id)
-            ExtendedMockito.verify(
-                notificationManager,
-                Mockito.never()
-            ).notifyAsUser(
-                ArgumentMatchers.isNull(),
-                ArgumentMatchers.anyInt(),
-                ArgumentMatchers.any(),
-                ArgumentMatchers.any()
-            )
-        }
+        keyboardLayoutManager.onInputDeviceChanged(keyboardDevice.id)
+        ExtendedMockito.verify(
+            notificationManager,
+            Mockito.never()
+        ).notifyAsUser(
+            ArgumentMatchers.isNull(),
+            ArgumentMatchers.anyInt(),
+            ArgumentMatchers.any(),
+            ArgumentMatchers.any()
+        )
     }
 
     private fun assertCorrectLayout(
@@ -1019,7 +699,7 @@
             device.identifier, USER_ID, imeInfo, imeSubtype
         )
         assertEquals(
-            "New UI: getDefaultKeyboardLayoutForInputDevice should return $expectedLayout",
+            "getDefaultKeyboardLayoutForInputDevice should return $expectedLayout",
             expectedLayout,
             result.layoutDescriptor
         )
@@ -1123,21 +803,4 @@
         info.serviceInfo.name = RECEIVER_NAME
         return info
     }
-
-    private inner class NewSettingsApiFlag constructor(enabled: Boolean) : AutoCloseable {
-        init {
-            Settings.Global.putString(
-                context.contentResolver,
-                "settings_new_keyboard_ui", enabled.toString()
-            )
-        }
-
-        override fun close() {
-            Settings.Global.putString(
-                context.contentResolver,
-                "settings_new_keyboard_ui",
-                ""
-            )
-        }
-    }
 }
diff --git a/tests/Internal/src/com/android/internal/protolog/LegacyProtoLogImplTest.java b/tests/Internal/src/com/android/internal/protolog/LegacyProtoLogImplTest.java
index d9a4c26..5cdfb28 100644
--- a/tests/Internal/src/com/android/internal/protolog/LegacyProtoLogImplTest.java
+++ b/tests/Internal/src/com/android/internal/protolog/LegacyProtoLogImplTest.java
@@ -90,7 +90,7 @@
         //noinspection ResultOfMethodCallIgnored
         mFile.delete();
         mProtoLog = new LegacyProtoLogImpl(mFile, mViewerConfigFilename,
-                1024 * 1024, mReader, 1024, new TreeMap<>());
+                1024 * 1024, mReader, 1024, new TreeMap<>(), () -> {});
     }
 
     @After
diff --git a/tests/Internal/src/com/android/internal/protolog/PerfettoDataSourceTest.java b/tests/Internal/src/com/android/internal/protolog/PerfettoDataSourceTest.java
index a963890..001a09a 100644
--- a/tests/Internal/src/com/android/internal/protolog/PerfettoDataSourceTest.java
+++ b/tests/Internal/src/com/android/internal/protolog/PerfettoDataSourceTest.java
@@ -67,7 +67,7 @@
 
     @Test
     public void allEnabledTraceMode() {
-        final ProtoLogDataSource ds = new ProtoLogDataSource(() -> {}, () -> {}, () -> {});
+        final ProtoLogDataSource ds = new ProtoLogDataSource((c) -> {}, () -> {}, (c) -> {});
 
         final ProtoLogDataSource.TlsState tlsState = createTlsState(
                 DataSourceConfigOuterClass.DataSourceConfig.newBuilder().setProtologConfig(
@@ -154,7 +154,7 @@
     private ProtoLogDataSource.TlsState createTlsState(
             DataSourceConfigOuterClass.DataSourceConfig config) {
         final ProtoLogDataSource ds =
-                Mockito.spy(new ProtoLogDataSource(() -> {}, () -> {}, () -> {}));
+                Mockito.spy(new ProtoLogDataSource((c) -> {}, () -> {}, (c) -> {}));
 
         ProtoInputStream configStream = new ProtoInputStream(config.toByteArray());
         final ProtoLogDataSource.Instance dsInstance = Mockito.spy(
diff --git a/tests/Internal/src/com/android/internal/protolog/PerfettoProtoLogImplTest.java b/tests/Internal/src/com/android/internal/protolog/PerfettoProtoLogImplTest.java
index 548adef..f6ac080 100644
--- a/tests/Internal/src/com/android/internal/protolog/PerfettoProtoLogImplTest.java
+++ b/tests/Internal/src/com/android/internal/protolog/PerfettoProtoLogImplTest.java
@@ -65,6 +65,7 @@
 import java.util.List;
 import java.util.Random;
 import java.util.TreeMap;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import perfetto.protos.Protolog;
 import perfetto.protos.ProtologCommon;
@@ -95,6 +96,7 @@
     private PerfettoProtoLogImpl mProtoLog;
     private Protolog.ProtoLogViewerConfig.Builder mViewerConfigBuilder;
     private File mFile;
+    private Runnable mCacheUpdater;
 
     private ProtoLogViewerConfigReader mReader;
 
@@ -152,9 +154,11 @@
         Mockito.when(viewerConfigInputStreamProvider.getInputStream())
                 .thenAnswer(it -> new ProtoInputStream(mViewerConfigBuilder.build().toByteArray()));
 
+        mCacheUpdater = () -> {};
         mReader = Mockito.spy(new ProtoLogViewerConfigReader(viewerConfigInputStreamProvider));
-        mProtoLog =
-                new PerfettoProtoLogImpl(viewerConfigInputStreamProvider, mReader, new TreeMap<>());
+        mProtoLog = new PerfettoProtoLogImpl(
+                viewerConfigInputStreamProvider, mReader, new TreeMap<>(),
+                () -> mCacheUpdater.run());
     }
 
     @After
@@ -500,7 +504,8 @@
         PerfettoTraceMonitor traceMonitor =
                 PerfettoTraceMonitor.newBuilder().enableProtoLog(true,
                         List.of(new PerfettoTraceMonitor.Builder.ProtoLogGroupOverride(
-                                TestProtoLogGroup.TEST_GROUP.toString(), LogLevel.DEBUG, true)))
+                                TestProtoLogGroup.TEST_GROUP.toString(), LogLevel.DEBUG,
+                                true)))
                         .build();
         try {
             traceMonitor.start();
@@ -526,6 +531,142 @@
         Truth.assertThat(stacktrace).contains("stackTraceTrimmed");
     }
 
+    @Test
+    public void cacheIsUpdatedWhenTracesStartAndStop() {
+        final AtomicInteger cacheUpdateCallCount = new AtomicInteger(0);
+        mCacheUpdater = cacheUpdateCallCount::incrementAndGet;
+
+        PerfettoTraceMonitor traceMonitor1 =
+                PerfettoTraceMonitor.newBuilder().enableProtoLog(true,
+                                List.of(new PerfettoTraceMonitor.Builder.ProtoLogGroupOverride(
+                                        TestProtoLogGroup.TEST_GROUP.toString(), LogLevel.WARN,
+                                        false)))
+                        .build();
+
+        PerfettoTraceMonitor traceMonitor2 =
+                PerfettoTraceMonitor.newBuilder().enableProtoLog(true,
+                                List.of(new PerfettoTraceMonitor.Builder.ProtoLogGroupOverride(
+                                        TestProtoLogGroup.TEST_GROUP.toString(), LogLevel.DEBUG,
+                                        false)))
+                        .build();
+
+        Truth.assertThat(cacheUpdateCallCount.get()).isEqualTo(0);
+
+        try {
+            traceMonitor1.start();
+
+            Truth.assertThat(cacheUpdateCallCount.get()).isEqualTo(1);
+
+            try {
+                traceMonitor2.start();
+
+                Truth.assertThat(cacheUpdateCallCount.get()).isEqualTo(2);
+            } finally {
+                traceMonitor2.stop(mWriter);
+            }
+
+            Truth.assertThat(cacheUpdateCallCount.get()).isEqualTo(3);
+
+        } finally {
+            traceMonitor1.stop(mWriter);
+        }
+
+        Truth.assertThat(cacheUpdateCallCount.get()).isEqualTo(4);
+    }
+
+    @Test
+    public void isEnabledUpdatesBasedOnRunningTraces() {
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.DEBUG))
+                .isFalse();
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.VERBOSE))
+                .isFalse();
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.INFO))
+                .isFalse();
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WARN))
+                .isFalse();
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.ERROR))
+                .isFalse();
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WTF)).isTrue();
+
+        PerfettoTraceMonitor traceMonitor1 =
+                PerfettoTraceMonitor.newBuilder().enableProtoLog(true,
+                                List.of(new PerfettoTraceMonitor.Builder.ProtoLogGroupOverride(
+                                        TestProtoLogGroup.TEST_GROUP.toString(), LogLevel.WARN,
+                                        false)))
+                        .build();
+
+        PerfettoTraceMonitor traceMonitor2 =
+                PerfettoTraceMonitor.newBuilder().enableProtoLog(true,
+                                List.of(new PerfettoTraceMonitor.Builder.ProtoLogGroupOverride(
+                                        TestProtoLogGroup.TEST_GROUP.toString(), LogLevel.DEBUG,
+                                        false)))
+                        .build();
+
+        try {
+            traceMonitor1.start();
+
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.DEBUG))
+                    .isFalse();
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.VERBOSE))
+                    .isFalse();
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.INFO))
+                    .isFalse();
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WARN))
+                    .isTrue();
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.ERROR))
+                    .isTrue();
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WTF))
+                    .isTrue();
+
+            try {
+                traceMonitor2.start();
+
+                Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.DEBUG))
+                        .isTrue();
+                Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP,
+                        LogLevel.VERBOSE)).isTrue();
+                Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.INFO))
+                        .isTrue();
+                Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WARN))
+                        .isTrue();
+                Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.ERROR))
+                        .isTrue();
+                Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WTF))
+                        .isTrue();
+            } finally {
+                traceMonitor2.stop(mWriter);
+            }
+
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.DEBUG))
+                    .isFalse();
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.VERBOSE))
+                    .isFalse();
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.INFO))
+                    .isFalse();
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WARN))
+                    .isTrue();
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.ERROR))
+                    .isTrue();
+            Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WTF))
+                    .isTrue();
+        } finally {
+            traceMonitor1.stop(mWriter);
+        }
+
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.DEBUG))
+                .isFalse();
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.VERBOSE))
+                .isFalse();
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.INFO))
+                .isFalse();
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WARN))
+                .isFalse();
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.ERROR))
+                .isFalse();
+        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WTF))
+                .isTrue();
+    }
+
     private enum TestProtoLogGroup implements IProtoLogGroup {
         TEST_GROUP(true, true, false, "TEST_TAG");
 
diff --git a/tests/PackageWatchdog/src/com/android/server/CrashRecoveryTest.java b/tests/PackageWatchdog/src/com/android/server/CrashRecoveryTest.java
index 081da11..489ef44 100644
--- a/tests/PackageWatchdog/src/com/android/server/CrashRecoveryTest.java
+++ b/tests/PackageWatchdog/src/com/android/server/CrashRecoveryTest.java
@@ -66,6 +66,7 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.mockito.MockitoSession;
 import org.mockito.quality.Strictness;
@@ -220,43 +221,36 @@
         RescuePartyObserver rescuePartyObserver = setUpRescuePartyObserver(watchdog);
 
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(1);
-        int bootCounter = 0;
+
         for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT; i++) {
             watchdog.noteBoot();
-            bootCounter += 1;
         }
+
         verify(rescuePartyObserver).executeBootLoopMitigation(1);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(2);
 
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; i++) {
-            watchdog.noteBoot();
-            bootCounter += 1;
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver).executeBootLoopMitigation(2);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(3);
 
-        int bootLoopThreshold = PackageWatchdog.DEFAULT_BOOT_LOOP_THRESHOLD - bootCounter;
-        for (int i = 0; i < bootLoopThreshold; i++) {
-            watchdog.noteBoot();
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver).executeBootLoopMitigation(3);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(4);
 
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; i++) {
-            watchdog.noteBoot();
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver).executeBootLoopMitigation(4);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(5);
 
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; i++) {
-            watchdog.noteBoot();
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver).executeBootLoopMitigation(5);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(6);
 
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; i++) {
-            watchdog.noteBoot();
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver).executeBootLoopMitigation(6);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(7);
     }
@@ -268,11 +262,11 @@
                 setUpRollbackPackageHealthObserver(watchdog);
 
         verify(rollbackObserver, never()).executeBootLoopMitigation(1);
-        int bootCounter = 0;
+
         for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT; i++) {
             watchdog.noteBoot();
-            bootCounter += 1;
         }
+
         verify(rollbackObserver).executeBootLoopMitigation(1);
         verify(rollbackObserver, never()).executeBootLoopMitigation(2);
 
@@ -280,19 +274,16 @@
         when(mRollbackManager.getAvailableRollbacks()).thenReturn(List.of(ROLLBACK_INFO_HIGH,
                 ROLLBACK_INFO_MANUAL));
 
-        int bootLoopThreshold = PackageWatchdog.DEFAULT_BOOT_LOOP_THRESHOLD - bootCounter;
-        for (int i = 0; i < bootLoopThreshold; i++) {
-            watchdog.noteBoot();
-        }
+        watchdog.noteBoot();
+
         verify(rollbackObserver).executeBootLoopMitigation(2);
         verify(rollbackObserver, never()).executeBootLoopMitigation(3);
 
         // Update the list of available rollbacks after executing bootloop mitigation once
         when(mRollbackManager.getAvailableRollbacks()).thenReturn(List.of(ROLLBACK_INFO_MANUAL));
 
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; i++) {
-            watchdog.noteBoot();
-        }
+        watchdog.noteBoot();
+
         verify(rollbackObserver, never()).executeBootLoopMitigation(3);
     }
 
@@ -305,27 +296,21 @@
 
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(1);
         verify(rollbackObserver, never()).executeBootLoopMitigation(1);
-        int bootCounter = 0;
         for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT; i++) {
             watchdog.noteBoot();
-            bootCounter += 1;
         }
         verify(rescuePartyObserver).executeBootLoopMitigation(1);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(2);
         verify(rollbackObserver, never()).executeBootLoopMitigation(1);
 
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; i++) {
-            watchdog.noteBoot();
-            bootCounter += 1;
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver).executeBootLoopMitigation(2);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(3);
         verify(rollbackObserver, never()).executeBootLoopMitigation(2);
 
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; i++) {
-            watchdog.noteBoot();
-            bootCounter += 1;
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(3);
         verify(rollbackObserver).executeBootLoopMitigation(1);
         verify(rollbackObserver, never()).executeBootLoopMitigation(2);
@@ -333,43 +318,46 @@
         when(mRollbackManager.getAvailableRollbacks()).thenReturn(List.of(ROLLBACK_INFO_HIGH,
                 ROLLBACK_INFO_MANUAL));
 
-        int bootLoopThreshold = PackageWatchdog.DEFAULT_BOOT_LOOP_THRESHOLD - bootCounter;
-        for (int i = 0; i < bootLoopThreshold; i++) {
-            watchdog.noteBoot();
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver).executeBootLoopMitigation(3);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(4);
         verify(rollbackObserver, never()).executeBootLoopMitigation(2);
 
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; i++) {
-            watchdog.noteBoot();
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver).executeBootLoopMitigation(4);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(5);
         verify(rollbackObserver, never()).executeBootLoopMitigation(2);
 
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; i++) {
-            watchdog.noteBoot();
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver).executeBootLoopMitigation(5);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(6);
         verify(rollbackObserver, never()).executeBootLoopMitigation(2);
 
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; i++) {
-            watchdog.noteBoot();
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(6);
         verify(rollbackObserver).executeBootLoopMitigation(2);
         verify(rollbackObserver, never()).executeBootLoopMitigation(3);
         // Update the list of available rollbacks after executing bootloop mitigation
         when(mRollbackManager.getAvailableRollbacks()).thenReturn(List.of(ROLLBACK_INFO_MANUAL));
 
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; i++) {
-            watchdog.noteBoot();
-        }
+        watchdog.noteBoot();
+
         verify(rescuePartyObserver).executeBootLoopMitigation(6);
         verify(rescuePartyObserver, never()).executeBootLoopMitigation(7);
         verify(rollbackObserver, never()).executeBootLoopMitigation(3);
+
+        moveTimeForwardAndDispatch(PackageWatchdog.DEFAULT_DEESCALATION_WINDOW_MS + 1);
+        Mockito.reset(rescuePartyObserver);
+
+        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT; i++) {
+            watchdog.noteBoot();
+        }
+        verify(rescuePartyObserver).executeBootLoopMitigation(1);
+        verify(rescuePartyObserver, never()).executeBootLoopMitigation(2);
     }
 
     RollbackPackageHealthObserver setUpRollbackPackageHealthObserver(PackageWatchdog watchdog) {
@@ -506,16 +494,9 @@
         }
 
         try {
-            if (Flags.recoverabilityDetection()) {
-                mSpyBootThreshold = spy(watchdog.new BootThreshold(
-                    PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT,
-                    PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS,
-                    PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT));
-            } else {
-                mSpyBootThreshold = spy(watchdog.new BootThreshold(
+            mSpyBootThreshold = spy(watchdog.new BootThreshold(
                     PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT,
                     PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS));
-            }
 
             doAnswer((Answer<Integer>) invocationOnMock -> {
                 String storedValue = mCrashRecoveryPropertiesMap
@@ -640,5 +621,16 @@
         public long uptimeMillis() {
             return mUpTimeMillis;
         }
+        public void moveTimeForward(long milliSeconds) {
+            mUpTimeMillis += milliSeconds;
+        }
+    }
+
+    private void moveTimeForwardAndDispatch(long milliSeconds) {
+        // Exhaust all due runnables now which shouldn't be executed after time-leap
+        mTestLooper.dispatchAll();
+        mTestClock.moveTimeForward(milliSeconds);
+        mTestLooper.moveTimeForward(milliSeconds);
+        mTestLooper.dispatchAll();
     }
 }
diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
index 4f27e06..1fdf97a 100644
--- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
+++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
@@ -1224,7 +1224,7 @@
         PackageWatchdog watchdog = createWatchdog();
         TestObserver bootObserver = new TestObserver(OBSERVER_NAME_1);
         watchdog.registerHealthObserver(bootObserver);
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_THRESHOLD; i++) {
+        for (int i = 0; i < 15; i++) {
             watchdog.noteBoot();
         }
         assertThat(bootObserver.mitigatedBootLoop()).isTrue();
@@ -1262,22 +1262,6 @@
     }
 
     /**
-     * Ensure that boot loop mitigation is not done when the number of boots does not meet the
-     * threshold.
-     */
-    @Test
-    public void testBootLoopDetection_doesNotMeetThresholdRecoverabilityHighImpact() {
-        PackageWatchdog watchdog = createWatchdog();
-        TestObserver bootObserver = new TestObserver(OBSERVER_NAME_1,
-                PackageHealthObserverImpact.USER_IMPACT_LEVEL_80);
-        watchdog.registerHealthObserver(bootObserver);
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_THRESHOLD - 1; i++) {
-            watchdog.noteBoot();
-        }
-        assertThat(bootObserver.mitigatedBootLoop()).isFalse();
-    }
-
-    /**
      * Ensure that boot loop mitigation is done for the observer with the lowest user impact
      */
     @Test
@@ -1306,7 +1290,7 @@
         bootObserver2.setImpact(PackageHealthObserverImpact.USER_IMPACT_LEVEL_30);
         watchdog.registerHealthObserver(bootObserver1);
         watchdog.registerHealthObserver(bootObserver2);
-        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_THRESHOLD; i++) {
+        for (int i = 0; i < 15; i++) {
             watchdog.noteBoot();
         }
         assertThat(bootObserver1.mitigatedBootLoop()).isTrue();
@@ -1349,9 +1333,7 @@
             watchdog.noteBoot();
         }
         for (int i = 0; i < 4; i++) {
-            for (int j = 0; j < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; j++) {
                 watchdog.noteBoot();
-            }
         }
 
         moveTimeForwardAndDispatch(PackageWatchdog.DEFAULT_DEESCALATION_WINDOW_MS + 1);
@@ -1360,38 +1342,7 @@
             watchdog.noteBoot();
         }
         for (int i = 0; i < 4; i++) {
-            for (int j = 0; j < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; j++) {
                 watchdog.noteBoot();
-            }
-        }
-
-        assertThat(bootObserver.mBootMitigationCounts).isEqualTo(List.of(1, 2, 3, 4, 1, 2, 3, 4));
-    }
-
-    @Test
-    public void testMultipleBootLoopMitigationRecoverabilityHighImpact() {
-        PackageWatchdog watchdog = createWatchdog();
-        TestObserver bootObserver = new TestObserver(OBSERVER_NAME_1,
-                PackageHealthObserverImpact.USER_IMPACT_LEVEL_80);
-        watchdog.registerHealthObserver(bootObserver);
-        for (int j = 0; j < PackageWatchdog.DEFAULT_BOOT_LOOP_THRESHOLD - 1; j++) {
-            watchdog.noteBoot();
-        }
-        for (int i = 0; i < 4; i++) {
-            for (int j = 0; j < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; j++) {
-                watchdog.noteBoot();
-            }
-        }
-
-        moveTimeForwardAndDispatch(PackageWatchdog.DEFAULT_DEESCALATION_WINDOW_MS + 1);
-
-        for (int j = 0; j < PackageWatchdog.DEFAULT_BOOT_LOOP_THRESHOLD - 1; j++) {
-            watchdog.noteBoot();
-        }
-        for (int i = 0; i < 4; i++) {
-            for (int j = 0; j < PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT; j++) {
-                watchdog.noteBoot();
-            }
         }
 
         assertThat(bootObserver.mBootMitigationCounts).isEqualTo(List.of(1, 2, 3, 4, 1, 2, 3, 4));
@@ -1642,8 +1593,7 @@
 
         mSpyBootThreshold = spy(watchdog.new BootThreshold(
                 PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT,
-                PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS,
-                PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT));
+                PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS));
 
         watchdog.saveAllObserversBootMitigationCountToMetadata(filePath);
 
@@ -1798,16 +1748,9 @@
         mCrashRecoveryPropertiesMap = new HashMap<>();
 
         try {
-            if (Flags.recoverabilityDetection()) {
-                mSpyBootThreshold = spy(watchdog.new BootThreshold(
-                    PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT,
-                    PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS,
-                    PackageWatchdog.DEFAULT_BOOT_LOOP_MITIGATION_INCREMENT));
-            } else {
-                mSpyBootThreshold = spy(watchdog.new BootThreshold(
+            mSpyBootThreshold = spy(watchdog.new BootThreshold(
                     PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT,
                     PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_WINDOW_MS));
-            }
 
             doAnswer((Answer<Integer>) invocationOnMock -> {
                 String storedValue = mCrashRecoveryPropertiesMap
diff --git a/tests/TelephonyCommonTests/src/com/android/internal/telephony/tests/TelephonyUtilsTest.java b/tests/TelephonyCommonTests/src/com/android/internal/telephony/tests/TelephonyUtilsTest.java
index a62103e..7558332 100644
--- a/tests/TelephonyCommonTests/src/com/android/internal/telephony/tests/TelephonyUtilsTest.java
+++ b/tests/TelephonyCommonTests/src/com/android/internal/telephony/tests/TelephonyUtilsTest.java
@@ -16,10 +16,16 @@
 
 package com.android.internal.telephony.tests;
 
+import static android.telephony.NetworkRegistrationInfo.FIRST_SERVICE_TYPE;
+import static android.telephony.NetworkRegistrationInfo.LAST_SERVICE_TYPE;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
 import android.content.Context;
@@ -72,6 +78,22 @@
         // getSubscriptionUserHandle should be called if subID is active.
         verify(mSubscriptionManager, times(1)).getSubscriptionUserHandle(eq(activeSubId));
     }
+
+    @Test
+    public void testIsValidPlmn() {
+        assertTrue(TelephonyUtils.isValidPlmn("310260"));
+        assertTrue(TelephonyUtils.isValidPlmn("45006"));
+        assertFalse(TelephonyUtils.isValidPlmn("1234567"));
+        assertFalse(TelephonyUtils.isValidPlmn("1234"));
+    }
+
+    @Test
+    public void testIsValidService() {
+        assertTrue(TelephonyUtils.isValidService(FIRST_SERVICE_TYPE));
+        assertTrue(TelephonyUtils.isValidService(LAST_SERVICE_TYPE));
+        assertFalse(TelephonyUtils.isValidService(FIRST_SERVICE_TYPE - 1));
+        assertFalse(TelephonyUtils.isValidService(LAST_SERVICE_TYPE + 1));
+    }
 }
 
 
diff --git a/tests/UsbManagerTests/Android.bp b/tests/UsbManagerTests/Android.bp
index a16a7ea..f0bea3f 100644
--- a/tests/UsbManagerTests/Android.bp
+++ b/tests/UsbManagerTests/Android.bp
@@ -21,6 +21,7 @@
     // to get the below license kinds:
     //   SPDX-license-identifier-Apache-2.0
     default_applicable_licenses: ["frameworks_base_license"],
+    default_team: "trendy_team_android_usb",
 }
 
 android_test {
diff --git a/tests/UsbTests/Android.bp b/tests/UsbTests/Android.bp
index 92c2711..c012cce 100644
--- a/tests/UsbTests/Android.bp
+++ b/tests/UsbTests/Android.bp
@@ -21,6 +21,7 @@
     // to get the below license kinds:
     //   SPDX-license-identifier-Apache-2.0
     default_applicable_licenses: ["frameworks_base_license"],
+    default_team: "trendy_team_android_usb",
 }
 
 android_test {
@@ -36,6 +37,8 @@
         "services.usb",
         "truth",
         "UsbManagerTestLib",
+        "android.hardware.usb.flags-aconfig-java",
+        "flag-junit",
     ],
     jni_libs: [
         // Required for ExtendedMockito
diff --git a/tests/UsbTests/TEST_MAPPING b/tests/UsbTests/TEST_MAPPING
new file mode 100644
index 0000000..70134b8
--- /dev/null
+++ b/tests/UsbTests/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "postsubmit": [
+    {
+      "name": "UsbTests"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/tests/UsbTests/src/com/android/server/usb/UsbServiceTest.java b/tests/UsbTests/src/com/android/server/usb/UsbServiceTest.java
new file mode 100644
index 0000000..56845ae
--- /dev/null
+++ b/tests/UsbTests/src/com/android/server/usb/UsbServiceTest.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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 static android.hardware.usb.UsbOperationInternal.USB_OPERATION_ERROR_INTERNAL;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.hardware.usb.IUsbOperationInternal;
+import android.hardware.usb.flags.Flags;
+import android.os.RemoteException;
+import android.os.UserManager;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.test.runner.AndroidJUnit4;
+
+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;
+
+/**
+ * Tests for {@link com.android.server.usb.UsbService}
+ */
+@RunWith(AndroidJUnit4.class)
+public class UsbServiceTest {
+
+    @Mock
+    private Context mContext;
+    @Mock
+    private UsbPortManager mUsbPortManager;
+    @Mock
+    private UsbAlsaManager mUsbAlsaManager;
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private UsbSettingsManager mUsbSettingsManager;
+    @Mock
+    private IUsbOperationInternal mCallback;
+
+    private static final String TEST_PORT_ID = "123";
+
+    private static final int TEST_TRANSACTION_ID = 1;
+
+    private static final int TEST_FIRST_CALLER_ID = 1000;
+
+    private static final int TEST_SECOND_CALLER_ID = 2000;
+
+    private UsbService mUsbService;
+
+    @Rule
+    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+    @Before
+    public void setUp() {
+        mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_USB_DATA_SIGNAL_STAKING);
+        MockitoAnnotations.initMocks(this);
+
+        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);
+    }
+
+    private void assertToggleUsbSuccessfully(int uid, boolean enable) {
+        assertTrue(mUsbService.enableUsbDataInternal(TEST_PORT_ID, enable,
+                TEST_TRANSACTION_ID, mCallback, uid));
+
+        verify(mUsbPortManager).enableUsbData(TEST_PORT_ID,
+                enable, TEST_TRANSACTION_ID, mCallback, null);
+        verifyZeroInteractions(mCallback);
+
+        clearInvocations(mUsbPortManager);
+        clearInvocations(mCallback);
+    }
+
+    private void assertToggleUsbFailed(int uid, boolean enable) throws Exception {
+        assertFalse(mUsbService.enableUsbDataInternal(TEST_PORT_ID, enable,
+                TEST_TRANSACTION_ID, mCallback, uid));
+
+        verifyZeroInteractions(mUsbPortManager);
+        verify(mCallback).onOperationComplete(USB_OPERATION_ERROR_INTERNAL);
+
+        clearInvocations(mUsbPortManager);
+        clearInvocations(mCallback);
+    }
+
+    /**
+     * Verify enableUsbData successfully disables USB port without error
+     */
+    @Test
+    public void disableUsb_successfullyDisable() {
+        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, false);
+    }
+
+    /**
+     * Verify enableUsbData successfully enables USB port without error given no other stakers
+     */
+    @Test
+    public void enableUsbWhenNoOtherStakers_successfullyEnable() {
+        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, true);
+    }
+
+    /**
+     * Verify enableUsbData does not enable USB port if other stakers are present
+     */
+    @Test
+    public void enableUsbPortWithOtherStakers_failsToEnable() throws Exception {
+        assertToggleUsbSuccessfully(TEST_FIRST_CALLER_ID, false);
+
+        assertToggleUsbFailed(TEST_SECOND_CALLER_ID, true);
+    }
+
+    /**
+     * 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, true);
+    }
+
+    /**
+     * 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);
+
+        mUsbService.enableUsbDataWhileDockedInternal(TEST_PORT_ID, TEST_TRANSACTION_ID,
+                mCallback, TEST_SECOND_CALLER_ID);
+
+        verifyZeroInteractions(mUsbPortManager);
+        verify(mCallback).onOperationComplete(USB_OPERATION_ERROR_INTERNAL);
+    }
+
+    /**
+     * 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);
+
+        verify(mUsbPortManager).enableUsbDataWhileDocked(TEST_PORT_ID, TEST_TRANSACTION_ID,
+                        mCallback, null);
+        verifyZeroInteractions(mCallback);
+    }
+}
diff --git a/tests/inputmethod/ConcurrentMultiSessionImeTest/Android.bp b/tests/inputmethod/ConcurrentMultiSessionImeTest/Android.bp
index 8d05a97..0e0d212 100644
--- a/tests/inputmethod/ConcurrentMultiSessionImeTest/Android.bp
+++ b/tests/inputmethod/ConcurrentMultiSessionImeTest/Android.bp
@@ -26,6 +26,11 @@
         "platform-test-annotations",
         "platform-test-rules",
         "truth",
+
+        // beadstead
+        "Nene",
+        "Harrier",
+        "TestApp",
     ],
     test_suites: [
         "general-tests",
diff --git a/tests/inputmethod/ConcurrentMultiSessionImeTest/src/com/android/server/inputmethod/multisessiontest/ConcurrentMultiUserTest.java b/tests/inputmethod/ConcurrentMultiSessionImeTest/src/com/android/server/inputmethod/multisessiontest/ConcurrentMultiUserTest.java
index b66ceba..a5ce69d 100644
--- a/tests/inputmethod/ConcurrentMultiSessionImeTest/src/com/android/server/inputmethod/multisessiontest/ConcurrentMultiUserTest.java
+++ b/tests/inputmethod/ConcurrentMultiSessionImeTest/src/com/android/server/inputmethod/multisessiontest/ConcurrentMultiUserTest.java
@@ -23,14 +23,22 @@
 
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.bedstead.harrier.BedsteadJUnit4;
+import com.android.bedstead.harrier.DeviceState;
+
 import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
 
-@RunWith(JUnit4.class)
+@RunWith(BedsteadJUnit4.class)
 public final class ConcurrentMultiUserTest {
 
+    @ClassRule
+    @Rule
+    public static final DeviceState sDeviceState = new DeviceState();
+
     @Before
     public void doBeforeEachTest() {
         // No op
diff --git a/tests/testables/OWNERS b/tests/testables/OWNERS
new file mode 100644
index 0000000..a6f1632
--- /dev/null
+++ b/tests/testables/OWNERS
@@ -0,0 +1 @@
+file:/packages/SystemUI/OWNERS
\ No newline at end of file
diff --git a/tests/testables/src/android/testing/TestableResources.java b/tests/testables/src/android/testing/TestableResources.java
index 0ec106e..384a21e 100644
--- a/tests/testables/src/android/testing/TestableResources.java
+++ b/tests/testables/src/android/testing/TestableResources.java
@@ -26,6 +26,8 @@
 
 import org.mockito.invocation.InvocationOnMock;
 
+import java.util.Arrays;
+
 /**
  * Provides a version of Resources that defaults to all existing resources, but can have ids
  * changed to return specific values.
@@ -103,6 +105,15 @@
                     if (index >= 0) {
                         Object value = mOverrides.valueAt(index);
                         if (value == null) throw new Resources.NotFoundException();
+                        // Support for Resources.getString(resId, Object... formatArgs)
+                        if (value instanceof String
+                                && invocationOnMock.getMethod().getName().equals("getString")
+                                && invocationOnMock.getArguments().length > 1) {
+                            value = String.format(mResources.getConfiguration().getLocales().get(0),
+                                    (String) value,
+                                    Arrays.copyOfRange(invocationOnMock.getArguments(), 1,
+                                            invocationOnMock.getArguments().length));
+                        }
                         return value;
                     }
                 } catch (Resources.NotFoundException e) {
diff --git a/tests/vcn/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java b/tests/vcn/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java
index 1d7be2f..fdf8fb8 100644
--- a/tests/vcn/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java
+++ b/tests/vcn/java/com/android/server/vcn/routeselection/IpSecPacketLossDetectorTest.java
@@ -34,6 +34,7 @@
 import static org.mockito.Mockito.doReturn;
 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.when;
 
@@ -333,6 +334,7 @@
     public void testHandleLossRate_validationFail() throws Exception {
         checkHandleLossRate(
                 22, true /* isLastStateExpectedToUpdate */, true /* isCallbackExpected */);
+        verify(mConnectivityManager).reportNetworkConnectivity(mNetwork, false);
     }
 
     @Test
@@ -416,4 +418,31 @@
         checkGetPacketLossRate(oldState, 20000, 14000, 4096, 19);
         checkGetPacketLossRate(oldState, 20000, 14000, 3000, 10);
     }
+
+    // Verify the polling event is scheduled with expected delays
+    private void verifyPollEventDelayAndScheduleNext(long expectedDelayMs) {
+        if (expectedDelayMs > 0) {
+            mTestLooper.dispatchAll();
+            verify(mIpSecTransform, never()).requestIpSecTransformState(any(), any());
+            mTestLooper.moveTimeForward(expectedDelayMs);
+        }
+
+        mTestLooper.dispatchAll();
+        verify(mIpSecTransform).requestIpSecTransformState(any(), any());
+        reset(mIpSecTransform);
+    }
+
+    @Test
+    public void testOnLinkPropertiesOrCapabilitiesChange() throws Exception {
+        // Start the monitor; verify the 1st poll is scheduled without delay
+        startMonitorAndCaptureStateReceiver();
+        verifyPollEventDelayAndScheduleNext(0 /* expectedDelayMs */);
+
+        // Verify the 2nd poll is rescheduled without delay
+        mIpSecPacketLossDetector.onLinkPropertiesOrCapabilitiesChanged();
+        verifyPollEventDelayAndScheduleNext(0 /* expectedDelayMs */);
+
+        // Verify the 3rd poll is scheduled with configured delay
+        verifyPollEventDelayAndScheduleNext(POLL_IPSEC_STATE_INTERVAL_MS);
+    }
 }
diff --git a/tests/vcn/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java b/tests/vcn/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java
index 381c574..af6daa1 100644
--- a/tests/vcn/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java
+++ b/tests/vcn/java/com/android/server/vcn/routeselection/NetworkEvaluationTestBase.java
@@ -26,6 +26,7 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.net.ConnectivityManager;
 import android.net.IpSecConfig;
 import android.net.IpSecTransform;
 import android.net.LinkProperties;
@@ -33,12 +34,14 @@
 import android.net.NetworkCapabilities;
 import android.net.TelephonyNetworkSpecifier;
 import android.net.vcn.FeatureFlags;
+import android.net.vcn.Flags;
 import android.os.Handler;
 import android.os.IPowerManager;
 import android.os.IThermalService;
 import android.os.ParcelUuid;
 import android.os.PowerManager;
 import android.os.test.TestLooper;
+import android.platform.test.flag.junit.SetFlagsRule;
 import android.telephony.TelephonyManager;
 
 import com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot;
@@ -46,6 +49,7 @@
 import com.android.server.vcn.VcnNetworkProvider;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
@@ -53,6 +57,8 @@
 import java.util.UUID;
 
 public abstract class NetworkEvaluationTestBase {
+    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
     protected static final String SSID = "TestWifi";
     protected static final String SSID_OTHER = "TestWifiOther";
     protected static final String PLMN_ID = "123456";
@@ -103,6 +109,7 @@
     @Mock protected FeatureFlags mFeatureFlags;
     @Mock protected android.net.platform.flags.FeatureFlags mCoreNetFeatureFlags;
     @Mock protected TelephonySubscriptionSnapshot mSubscriptionSnapshot;
+    @Mock protected ConnectivityManager mConnectivityManager;
     @Mock protected TelephonyManager mTelephonyManager;
     @Mock protected IPowerManager mPowerManagerService;
 
@@ -114,6 +121,9 @@
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
 
+        mSetFlagsRule.enableFlags(Flags.FLAG_VALIDATE_NETWORK_ON_IPSEC_LOSS);
+        mSetFlagsRule.enableFlags(Flags.FLAG_EVALUATE_IPSEC_LOSS_ON_LP_NC_CHANGE);
+
         when(mNetwork.getNetId()).thenReturn(-1);
 
         mTestLooper = new TestLooper();
@@ -130,6 +140,12 @@
         doReturn(true).when(mVcnContext).isFlagIpSecTransformStateEnabled();
 
         setupSystemService(
+                mContext,
+                mConnectivityManager,
+                Context.CONNECTIVITY_SERVICE,
+                ConnectivityManager.class);
+
+        setupSystemService(
                 mContext, mTelephonyManager, Context.TELEPHONY_SERVICE, TelephonyManager.class);
         when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
         when(mTelephonyManager.getNetworkOperator()).thenReturn(PLMN_ID);
diff --git a/tests/vcn/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluatorTest.java b/tests/vcn/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluatorTest.java
index aa81efe..1d68721 100644
--- a/tests/vcn/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluatorTest.java
+++ b/tests/vcn/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluatorTest.java
@@ -31,6 +31,7 @@
 import static org.mockito.ArgumentMatchers.anyObject;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -333,4 +334,36 @@
                         .compare(penalized, notPenalized);
         assertEquals(1, result);
     }
+
+    @Test
+    public void testNotifyNetworkMetricMonitorOnLpChange() throws Exception {
+        // Clear calls invoked when initializing mNetworkEvaluator
+        reset(mIpSecPacketLossDetector);
+
+        final UnderlyingNetworkEvaluator evaluator = newUnderlyingNetworkEvaluator();
+        evaluator.setNetworkCapabilities(
+                CELL_NETWORK_CAPABILITIES,
+                VcnGatewayConnectionConfig.DEFAULT_UNDERLYING_NETWORK_TEMPLATES,
+                SUB_GROUP,
+                mSubscriptionSnapshot,
+                mCarrierConfig);
+
+        verify(mIpSecPacketLossDetector).onLinkPropertiesOrCapabilitiesChanged();
+    }
+
+    @Test
+    public void testNotifyNetworkMetricMonitorOnNcChange() throws Exception {
+        // Clear calls invoked when initializing mNetworkEvaluator
+        reset(mIpSecPacketLossDetector);
+
+        final UnderlyingNetworkEvaluator evaluator = newUnderlyingNetworkEvaluator();
+        evaluator.setLinkProperties(
+                LINK_PROPERTIES,
+                VcnGatewayConnectionConfig.DEFAULT_UNDERLYING_NETWORK_TEMPLATES,
+                SUB_GROUP,
+                mSubscriptionSnapshot,
+                mCarrierConfig);
+
+        verify(mIpSecPacketLossDetector).onLinkPropertiesOrCapabilitiesChanged();
+    }
 }
diff --git a/tools/app_metadata_bundles/Android.bp b/tools/app_metadata_bundles/Android.bp
index be6bea6..dced50d 100644
--- a/tools/app_metadata_bundles/Android.bp
+++ b/tools/app_metadata_bundles/Android.bp
@@ -5,6 +5,7 @@
     // to get the below license kinds:
     //   SPDX-license-identifier-Apache-2.0
     default_applicable_licenses: ["frameworks_base_license"],
+    default_team: "trendy_team_preload_safety",
 }
 
 java_library_host {
@@ -12,6 +13,9 @@
     srcs: [
         "src/lib/java/**/*.java",
     ],
+    static_libs: [
+        "guava",
+    ],
 }
 
 java_binary_host {
@@ -24,3 +28,15 @@
         "asllib",
     ],
 }
+
+java_test_host {
+    name: "aslgen-test",
+    srcs: ["src/test/java/**/*.java"],
+    exclude_srcs: [
+    ],
+    java_resource_dirs: ["src/test/resources"],
+    static_libs: [
+        "aslgen",
+        "junit",
+    ],
+}
diff --git a/tools/app_metadata_bundles/src/aslgen/java/com/android/aslgen/Main.java b/tools/app_metadata_bundles/src/aslgen/java/com/android/aslgen/Main.java
index fb7a6ab..d7edfd4 100644
--- a/tools/app_metadata_bundles/src/aslgen/java/com/android/aslgen/Main.java
+++ b/tools/app_metadata_bundles/src/aslgen/java/com/android/aslgen/Main.java
@@ -16,8 +16,8 @@
 
 package com.android.aslgen;
 
-import com.android.asllib.AndroidSafetyLabel;
-import com.android.asllib.AndroidSafetyLabel.Format;
+import com.android.asllib.AslConverter;
+import com.android.asllib.AslConverter.Format;
 import com.android.asllib.util.MalformedXmlException;
 
 import org.xml.sax.SAXException;
@@ -41,9 +41,8 @@
 
         String inFile = null;
         String outFile = null;
-        Format inFormat = Format.NULL;
-        Format outFormat = Format.NULL;
-
+        Format inFormat = AslConverter.Format.NULL;
+        Format outFormat = AslConverter.Format.NULL;
 
         // Except for "--help", all arguments require a value currently.
         // So just make sure we have an even number and
@@ -79,11 +78,11 @@
             throw new IllegalArgumentException("output file is required");
         }
 
-        if (inFormat == Format.NULL) {
+        if (inFormat == AslConverter.Format.NULL) {
             throw new IllegalArgumentException("input format is required");
         }
 
-        if (outFormat == Format.NULL) {
+        if (outFormat == AslConverter.Format.NULL) {
             throw new IllegalArgumentException("output format is required");
         }
 
@@ -92,24 +91,23 @@
         System.out.println("in format: " + inFormat);
         System.out.println("out format: " + outFormat);
 
-        var asl = AndroidSafetyLabel.readFromStream(new FileInputStream(inFile), inFormat);
-        asl.writeToStream(new FileOutputStream(outFile), outFormat);
+        var asl = AslConverter.readFromStream(new FileInputStream(inFile), inFormat);
+        AslConverter.writeToStream(new FileOutputStream(outFile), asl, outFormat);
     }
 
     private static Format getFormat(String argValue) {
         if ("hr".equals(argValue)) {
-            return Format.HUMAN_READABLE;
+            return AslConverter.Format.HUMAN_READABLE;
         } else if ("od".equals(argValue)) {
-            return Format.ON_DEVICE;
+            return AslConverter.Format.ON_DEVICE;
         } else {
-            return Format.NULL;
+            return AslConverter.Format.NULL;
         }
     }
 
     private static void showUsage() {
-        AndroidSafetyLabel.test();
         System.err.println(
-                "Usage:\n"
-        );
+                "Usage: aslgen --in-path [input-file] --out-path [output-file] --in-format [hr|od]"
+                        + " --out-format [hr|od]");
     }
 }
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabel.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabel.java
deleted file mode 100644
index bc8063e..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabel.java
+++ /dev/null
@@ -1,122 +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.asllib;
-
-import com.android.asllib.util.MalformedXmlException;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.xml.sax.SAXException;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-public class AndroidSafetyLabel implements AslMarshallable {
-
-    public enum Format {
-        NULL, HUMAN_READABLE, ON_DEVICE;
-    }
-
-    private final SafetyLabels mSafetyLabels;
-
-    public SafetyLabels getSafetyLabels() {
-        return mSafetyLabels;
-    }
-
-    public AndroidSafetyLabel(SafetyLabels safetyLabels) {
-        this.mSafetyLabels = safetyLabels;
-    }
-
-    /** Reads a {@link AndroidSafetyLabel} from an {@link InputStream}. */
-    // TODO(b/329902686): Support parsing from on-device.
-    public static AndroidSafetyLabel readFromStream(InputStream in, Format format)
-            throws IOException, ParserConfigurationException, SAXException, MalformedXmlException {
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setNamespaceAware(true);
-        Document document = factory.newDocumentBuilder().parse(in);
-
-        switch (format) {
-            case HUMAN_READABLE:
-                Element appMetadataBundles =
-                        XmlUtils.getSingleElement(document, XmlUtils.HR_TAG_APP_METADATA_BUNDLES);
-
-                return new AndroidSafetyLabelFactory()
-                        .createFromHrElements(
-                                List.of(
-                                        XmlUtils.getSingleElement(
-                                                document, XmlUtils.HR_TAG_APP_METADATA_BUNDLES)));
-            case ON_DEVICE:
-                throw new IllegalArgumentException(
-                        "Parsing from on-device format is not supported at this time.");
-            default:
-                throw new IllegalStateException("Unrecognized input format.");
-        }
-    }
-
-    /** Write the content of the {@link AndroidSafetyLabel} to a {@link OutputStream}. */
-    // TODO(b/329902686): Support outputting human-readable format.
-    public void writeToStream(OutputStream out, Format format)
-            throws IOException, ParserConfigurationException, TransformerException {
-        var docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-        var document = docBuilder.newDocument();
-
-        switch (format) {
-            case HUMAN_READABLE:
-                throw new IllegalArgumentException(
-                        "Outputting human-readable format is not supported at this time.");
-            case ON_DEVICE:
-                for (var child : this.toOdDomElements(document)) {
-                    document.appendChild(child);
-                }
-                break;
-            default:
-                throw new IllegalStateException("Unrecognized input format.");
-        }
-
-        TransformerFactory transformerFactory = TransformerFactory.newInstance();
-        Transformer transformer = transformerFactory.newTransformer();
-        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
-        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
-        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
-        StreamResult streamResult = new StreamResult(out); // out
-        DOMSource domSource = new DOMSource(document);
-        transformer.transform(domSource, streamResult);
-    }
-
-    /** Creates an on-device DOM element from an {@link AndroidSafetyLabel} */
-    @Override
-    public List<Element> toOdDomElements(Document doc) {
-        Element aslEle = doc.createElement(XmlUtils.OD_TAG_BUNDLE);
-        XmlUtils.appendChildren(aslEle, mSafetyLabels.toOdDomElements(doc));
-        return List.of(aslEle);
-    }
-
-    public static void test() {
-        // TODO(b/329902686): Add tests.
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabelFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabelFactory.java
deleted file mode 100644
index 7e7fcf9..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabelFactory.java
+++ /dev/null
@@ -1,39 +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.asllib;
-
-import com.android.asllib.util.MalformedXmlException;
-
-import org.w3c.dom.Element;
-
-import java.util.List;
-
-public class AndroidSafetyLabelFactory implements AslMarshallableFactory<AndroidSafetyLabel> {
-
-    /** Creates an {@link AndroidSafetyLabel} from human-readable DOM element */
-    @Override
-    public AndroidSafetyLabel createFromHrElements(List<Element> appMetadataBundles)
-            throws MalformedXmlException {
-        Element appMetadataBundlesEle = XmlUtils.getSingleElement(appMetadataBundles);
-        Element safetyLabelsEle =
-                XmlUtils.getSingleChildElement(
-                        appMetadataBundlesEle, XmlUtils.HR_TAG_SAFETY_LABELS);
-        SafetyLabels safetyLabels =
-                new SafetyLabelsFactory().createFromHrElements(List.of(safetyLabelsEle));
-        return new AndroidSafetyLabel(safetyLabels);
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslConverter.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslConverter.java
new file mode 100644
index 0000000..b98161d
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslConverter.java
@@ -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.asllib;
+
+import com.android.asllib.marshallable.AndroidSafetyLabel;
+import com.android.asllib.marshallable.AndroidSafetyLabelFactory;
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+public class AslConverter {
+    public enum Format {
+        NULL,
+        HUMAN_READABLE,
+        ON_DEVICE;
+    }
+
+    /** Reads a {@link AndroidSafetyLabel} from an {@link InputStream}. */
+    // TODO(b/329902686): Support parsing from on-device.
+    public static AndroidSafetyLabel readFromStream(InputStream in, Format format)
+            throws IOException, ParserConfigurationException, SAXException, MalformedXmlException {
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setNamespaceAware(true);
+        Document document = factory.newDocumentBuilder().parse(in);
+
+        switch (format) {
+            case HUMAN_READABLE:
+                Element appMetadataBundles =
+                        XmlUtils.getSingleChildElement(
+                                document, XmlUtils.HR_TAG_APP_METADATA_BUNDLES, true);
+
+                return new AndroidSafetyLabelFactory()
+                        .createFromHrElements(XmlUtils.listOf(appMetadataBundles));
+            case ON_DEVICE:
+                throw new IllegalArgumentException(
+                        "Parsing from on-device format is not supported at this time.");
+            default:
+                throw new IllegalStateException("Unrecognized input format.");
+        }
+    }
+
+    /** Reads a {@link AndroidSafetyLabel} from a String. */
+    public static AndroidSafetyLabel readFromString(String in, Format format)
+            throws IOException, ParserConfigurationException, SAXException, MalformedXmlException {
+        InputStream stream = new ByteArrayInputStream(in.getBytes(StandardCharsets.UTF_8));
+        return readFromStream(stream, format);
+    }
+
+    /** Write the content of the {@link AndroidSafetyLabel} to a {@link OutputStream}. */
+    // TODO(b/329902686): Support outputting human-readable format.
+    public static void writeToStream(
+            OutputStream out, AndroidSafetyLabel asl, AslConverter.Format format)
+            throws IOException, ParserConfigurationException, TransformerException {
+        var docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+        var document = docBuilder.newDocument();
+
+        switch (format) {
+            case HUMAN_READABLE:
+                throw new IllegalArgumentException(
+                        "Outputting human-readable format is not supported at this time.");
+            case ON_DEVICE:
+                for (var child : asl.toOdDomElements(document)) {
+                    document.appendChild(child);
+                }
+                break;
+            default:
+                throw new IllegalStateException("Unrecognized input format.");
+        }
+
+        TransformerFactory transformerFactory = TransformerFactory.newInstance();
+        Transformer transformer = transformerFactory.newTransformer();
+        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+        StreamResult streamResult = new StreamResult(out); // out
+        DOMSource domSource = new DOMSource(document);
+        transformer.transform(domSource, streamResult);
+    }
+
+    /** Get the content of the {@link AndroidSafetyLabel} as String. */
+    public static String getXmlAsString(AndroidSafetyLabel asl, AslConverter.Format format)
+            throws IOException, ParserConfigurationException, TransformerException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        writeToStream(out, asl, format);
+        return out.toString(StandardCharsets.UTF_8);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslMarshallable.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslMarshallable.java
deleted file mode 100644
index 4e64ab0..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslMarshallable.java
+++ /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.asllib;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.util.List;
-
-public interface AslMarshallable {
-
-    /** Creates the on-device DOM element from the AslMarshallable Java Object. */
-    List<Element> toOdDomElements(Document doc);
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslMarshallableFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslMarshallableFactory.java
deleted file mode 100644
index b8f9f0e..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslMarshallableFactory.java
+++ /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.asllib;
-
-import com.android.asllib.util.MalformedXmlException;
-
-import org.w3c.dom.Element;
-
-import java.util.List;
-
-public interface AslMarshallableFactory<T extends AslMarshallable> {
-
-    /** Creates an {@link AslMarshallableFactory} from human-readable DOM element */
-    T createFromHrElements(List<Element> elements) throws MalformedXmlException;
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategory.java
deleted file mode 100644
index e5ed63b..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategory.java
+++ /dev/null
@@ -1,58 +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.asllib;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Data usage category representation containing one or more {@link DataType}. Valid category keys
- * are defined in {@link DataCategoryConstants}, each category has a valid set of types {@link
- * DataType}, which are mapped in {@link DataTypeConstants}
- */
-public class DataCategory implements AslMarshallable {
-    private final String mCategoryName;
-    private final Map<String, DataType> mDataTypes;
-
-    public DataCategory(String categoryName, Map<String, DataType> dataTypes) {
-        this.mCategoryName = categoryName;
-        this.mDataTypes = dataTypes;
-    }
-
-    public String getCategoryName() {
-        return mCategoryName;
-    }
-
-    /** Return the type {@link Map} of String type key to {@link DataType} */
-
-    public Map<String, DataType> getDataTypes() {
-        return mDataTypes;
-    }
-
-    /** Creates on-device DOM element(s) from the {@link DataCategory}. */
-    @Override
-    public List<Element> toOdDomElements(Document doc) {
-        Element dataCategoryEle = XmlUtils.createPbundleEleWithName(doc, this.getCategoryName());
-        for (DataType dataType : mDataTypes.values()) {
-            XmlUtils.appendChildren(dataCategoryEle, dataType.toOdDomElements(doc));
-        }
-        return List.of(dataCategoryEle);
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategoryConstants.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategoryConstants.java
deleted file mode 100644
index b364c8b..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategoryConstants.java
+++ /dev/null
@@ -1,74 +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.asllib;
-
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Constants for determining valid {@link String} data types for usage within {@link SafetyLabels},
- * {@link DataCategory}, and {@link DataType}
- */
-public class DataCategoryConstants {
-
-    public static final String CATEGORY_PERSONAL = "personal";
-    public static final String CATEGORY_FINANCIAL = "financial";
-    public static final String CATEGORY_LOCATION = "location";
-    public static final String CATEGORY_EMAIL_TEXT_MESSAGE = "email_text_message";
-    public static final String CATEGORY_PHOTO_VIDEO = "photo_video";
-    public static final String CATEGORY_AUDIO = "audio";
-    public static final String CATEGORY_STORAGE = "storage";
-    public static final String CATEGORY_HEALTH_FITNESS = "health_fitness";
-    public static final String CATEGORY_CONTACTS = "contacts";
-    public static final String CATEGORY_CALENDAR = "calendar";
-    public static final String CATEGORY_IDENTIFIERS = "identifiers";
-    public static final String CATEGORY_APP_PERFORMANCE = "app_performance";
-    public static final String CATEGORY_ACTIONS_IN_APP = "actions_in_app";
-    public static final String CATEGORY_SEARCH_AND_BROWSING = "search_and_browsing";
-
-    /** Set of valid categories */
-    public static final Set<String> VALID_CATEGORIES =
-            Collections.unmodifiableSet(
-                    new HashSet<>(
-                            Arrays.asList(
-                                    CATEGORY_PERSONAL,
-                                    CATEGORY_FINANCIAL,
-                                    CATEGORY_LOCATION,
-                                    CATEGORY_EMAIL_TEXT_MESSAGE,
-                                    CATEGORY_PHOTO_VIDEO,
-                                    CATEGORY_AUDIO,
-                                    CATEGORY_STORAGE,
-                                    CATEGORY_HEALTH_FITNESS,
-                                    CATEGORY_CONTACTS,
-                                    CATEGORY_CALENDAR,
-                                    CATEGORY_IDENTIFIERS,
-                                    CATEGORY_APP_PERFORMANCE,
-                                    CATEGORY_ACTIONS_IN_APP,
-                                    CATEGORY_SEARCH_AND_BROWSING)));
-
-    /** Returns {@link Set} of valid {@link String} category keys */
-    public static Set<String> getValidDataCategories() {
-        return VALID_CATEGORIES;
-    }
-
-    private DataCategoryConstants() {
-        /* do nothing - hide constructor */
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategoryFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategoryFactory.java
deleted file mode 100644
index d946345..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategoryFactory.java
+++ /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.asllib;
-
-import com.android.asllib.util.MalformedXmlException;
-
-import org.w3c.dom.Element;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class DataCategoryFactory implements AslMarshallableFactory<DataCategory> {
-    @Override
-    public DataCategory createFromHrElements(List<Element> elements) throws MalformedXmlException {
-        String categoryName = null;
-        Map<String, DataType> dataTypeMap = new HashMap<String, DataType>();
-        for (Element ele : elements) {
-            categoryName = ele.getAttribute(XmlUtils.HR_ATTR_DATA_CATEGORY);
-            String dataTypeName = ele.getAttribute(XmlUtils.HR_ATTR_DATA_TYPE);
-            if (!DataTypeConstants.getValidDataTypes().contains(dataTypeName)) {
-                throw new MalformedXmlException(
-                        String.format("Unrecognized data type name: %s", dataTypeName));
-            }
-            dataTypeMap.put(dataTypeName, new DataTypeFactory().createFromHrElements(List.of(ele)));
-        }
-
-        return new DataCategory(categoryName, dataTypeMap);
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabels.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabels.java
deleted file mode 100644
index d2fffc0..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabels.java
+++ /dev/null
@@ -1,101 +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.asllib;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Data label representation with data shared and data collected maps containing zero or more {@link
- * DataCategory}
- */
-public class DataLabels implements AslMarshallable {
-    private final Map<String, DataCategory> mDataAccessed;
-    private final Map<String, DataCategory> mDataCollected;
-    private final Map<String, DataCategory> mDataShared;
-
-    public DataLabels(
-            Map<String, DataCategory> dataAccessed,
-            Map<String, DataCategory> dataCollected,
-            Map<String, DataCategory> dataShared) {
-        mDataAccessed = dataAccessed;
-        mDataCollected = dataCollected;
-        mDataShared = dataShared;
-    }
-
-    /**
-     * Returns the data accessed {@link Map} of {@link com.android.asllib.DataCategoryConstants} to
-     * {@link DataCategory}
-     */
-    public Map<String, DataCategory> getDataAccessed() {
-        return mDataAccessed;
-    }
-
-    /**
-     * Returns the data collected {@link Map} of {@link com.android.asllib.DataCategoryConstants} to
-     * {@link DataCategory}
-     */
-    public Map<String, DataCategory> getDataCollected() {
-        return mDataCollected;
-    }
-
-    /**
-     * Returns the data shared {@link Map} of {@link com.android.asllib.DataCategoryConstants} to
-     * {@link DataCategory}
-     */
-    public Map<String, DataCategory> getDataShared() {
-        return mDataShared;
-    }
-
-    /** Gets the on-device DOM element for the {@link DataLabels}. */
-    @Override
-    public List<Element> toOdDomElements(Document doc) {
-        Element dataLabelsEle =
-                XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_DATA_LABELS);
-
-        maybeAppendDataUsages(doc, dataLabelsEle, mDataCollected, XmlUtils.OD_NAME_DATA_ACCESSED);
-        maybeAppendDataUsages(doc, dataLabelsEle, mDataCollected, XmlUtils.OD_NAME_DATA_COLLECTED);
-        maybeAppendDataUsages(doc, dataLabelsEle, mDataShared, XmlUtils.OD_NAME_DATA_SHARED);
-
-        return List.of(dataLabelsEle);
-    }
-
-    private void maybeAppendDataUsages(
-            Document doc,
-            Element dataLabelsEle,
-            Map<String, DataCategory> dataCategoriesMap,
-            String dataUsageTypeName) {
-        if (dataCategoriesMap.isEmpty()) {
-            return;
-        }
-        Element dataUsageEle = XmlUtils.createPbundleEleWithName(doc, dataUsageTypeName);
-
-        for (String dataCategoryName : dataCategoriesMap.keySet()) {
-            Element dataCategoryEle = XmlUtils.createPbundleEleWithName(doc, dataCategoryName);
-            DataCategory dataCategory = dataCategoriesMap.get(dataCategoryName);
-            for (String dataTypeName : dataCategory.getDataTypes().keySet()) {
-                DataType dataType = dataCategory.getDataTypes().get(dataTypeName);
-                XmlUtils.appendChildren(dataCategoryEle, dataType.toOdDomElements(doc));
-            }
-            dataUsageEle.appendChild(dataCategoryEle);
-        }
-        dataLabelsEle.appendChild(dataUsageEle);
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabelsFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabelsFactory.java
deleted file mode 100644
index 1adb140..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabelsFactory.java
+++ /dev/null
@@ -1,117 +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.asllib;
-
-import com.android.asllib.util.MalformedXmlException;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class DataLabelsFactory implements AslMarshallableFactory<DataLabels> {
-
-    /** Creates a {@link DataLabels} from the human-readable DOM element. */
-    @Override
-    public DataLabels createFromHrElements(List<Element> elements) throws MalformedXmlException {
-        Element ele = XmlUtils.getSingleElement(elements);
-        Map<String, DataCategory> dataAccessed =
-                getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_ACCESSED);
-        Map<String, DataCategory> dataCollected =
-                getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_COLLECTED);
-        Map<String, DataCategory> dataShared =
-                getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_SHARED);
-
-        // Validate booleans such as isCollectionOptional, isSharingOptional.
-        for (DataCategory dataCategory : dataAccessed.values()) {
-            for (DataType dataType : dataCategory.getDataTypes().values()) {
-                if (dataType.getIsSharingOptional() != null) {
-                    throw new MalformedXmlException(
-                            String.format(
-                                    "isSharingOptional was unexpectedly defined on a DataType"
-                                            + " belonging to data accessed: %s",
-                                    dataType.getDataTypeName()));
-                }
-                if (dataType.getIsCollectionOptional() != null) {
-                    throw new MalformedXmlException(
-                            String.format(
-                                    "isCollectionOptional was unexpectedly defined on a DataType"
-                                            + " belonging to data accessed: %s",
-                                    dataType.getDataTypeName()));
-                }
-            }
-        }
-        for (DataCategory dataCategory : dataCollected.values()) {
-            for (DataType dataType : dataCategory.getDataTypes().values()) {
-                if (dataType.getIsSharingOptional() != null) {
-                    throw new MalformedXmlException(
-                            String.format(
-                                    "isSharingOptional was unexpectedly defined on a DataType"
-                                            + " belonging to data collected: %s",
-                                    dataType.getDataTypeName()));
-                }
-            }
-        }
-        for (DataCategory dataCategory : dataShared.values()) {
-            for (DataType dataType : dataCategory.getDataTypes().values()) {
-                if (dataType.getIsCollectionOptional() != null) {
-                    throw new MalformedXmlException(
-                            String.format(
-                                    "isCollectionOptional was unexpectedly defined on a DataType"
-                                            + " belonging to data shared: %s",
-                                    dataType.getDataTypeName()));
-                }
-            }
-        }
-
-        return new DataLabels(dataAccessed, dataCollected, dataShared);
-    }
-
-    private static Map<String, DataCategory> getDataCategoriesWithTag(
-            Element dataLabelsEle, String dataCategoryUsageTypeTag) throws MalformedXmlException {
-        NodeList dataUsedNodeList = dataLabelsEle.getElementsByTagName(dataCategoryUsageTypeTag);
-        Map<String, DataCategory> dataCategoryMap = new HashMap<String, DataCategory>();
-
-        Set<String> dataCategoryNames = new HashSet<String>();
-        for (int i = 0; i < dataUsedNodeList.getLength(); i++) {
-            Element dataUsedEle = (Element) dataUsedNodeList.item(i);
-            String dataCategoryName = dataUsedEle.getAttribute(XmlUtils.HR_ATTR_DATA_CATEGORY);
-            if (!DataCategoryConstants.getValidDataCategories().contains(dataCategoryName)) {
-                throw new MalformedXmlException(
-                        String.format("Unrecognized category name: %s", dataCategoryName));
-            }
-            dataCategoryNames.add(dataCategoryName);
-        }
-        for (String dataCategoryName : dataCategoryNames) {
-            var dataCategoryElements =
-                    XmlUtils.asElementList(dataUsedNodeList).stream()
-                            .filter(
-                                    ele ->
-                                            ele.getAttribute(XmlUtils.HR_ATTR_DATA_CATEGORY)
-                                                    .equals(dataCategoryName))
-                            .toList();
-            DataCategory dataCategory =
-                    new DataCategoryFactory().createFromHrElements(dataCategoryElements);
-            dataCategoryMap.put(dataCategoryName, dataCategory);
-        }
-        return dataCategoryMap;
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataType.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataType.java
deleted file mode 100644
index 5ba2975..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataType.java
+++ /dev/null
@@ -1,176 +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.asllib;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * Data usage type representation. Types are specific to a {@link DataCategory} and contains
- * metadata related to the data usage purpose.
- */
-public class DataType implements AslMarshallable {
-
-    public enum Purpose {
-        PURPOSE_APP_FUNCTIONALITY(1),
-        PURPOSE_ANALYTICS(2),
-        PURPOSE_DEVELOPER_COMMUNICATIONS(3),
-        PURPOSE_FRAUD_PREVENTION_SECURITY(4),
-        PURPOSE_ADVERTISING(5),
-        PURPOSE_PERSONALIZATION(6),
-        PURPOSE_ACCOUNT_MANAGEMENT(7);
-
-        private static final String PURPOSE_PREFIX = "PURPOSE_";
-
-        private final int mValue;
-
-        Purpose(int value) {
-            this.mValue = value;
-        }
-
-        /** Get the int value associated with the Purpose. */
-        public int getValue() {
-            return mValue;
-        }
-
-        /** Get the Purpose associated with the int value. */
-        public static Purpose forValue(int value) {
-            for (Purpose e : values()) {
-                if (e.getValue() == value) {
-                    return e;
-                }
-            }
-            throw new IllegalArgumentException("No enum for value: " + value);
-        }
-
-        /** Get the Purpose associated with the human-readable String. */
-        public static Purpose forString(String s) {
-            for (Purpose e : values()) {
-                if (e.toString().equals(s)) {
-                    return e;
-                }
-            }
-            throw new IllegalArgumentException("No enum for str: " + s);
-        }
-
-        /** Human-readable String representation of Purpose. */
-        public String toString() {
-            if (!this.name().startsWith(PURPOSE_PREFIX)) {
-                return this.name();
-            }
-            return this.name().substring(PURPOSE_PREFIX.length()).toLowerCase();
-        }
-    }
-
-    private final String mDataTypeName;
-
-    private final Set<Purpose> mPurposeSet;
-    private final Boolean mIsCollectionOptional;
-    private final Boolean mIsSharingOptional;
-    private final Boolean mEphemeral;
-
-    public DataType(
-            String dataTypeName,
-            Set<Purpose> purposeSet,
-            Boolean isCollectionOptional,
-            Boolean isSharingOptional,
-            Boolean ephemeral) {
-        this.mDataTypeName = dataTypeName;
-        this.mPurposeSet = purposeSet;
-        this.mIsCollectionOptional = isCollectionOptional;
-        this.mIsSharingOptional = isSharingOptional;
-        this.mEphemeral = ephemeral;
-    }
-
-    public String getDataTypeName() {
-        return mDataTypeName;
-    }
-
-    /**
-     * Returns {@link Set} of valid {@link Integer} purposes for using the associated data category
-     * and type
-     */
-    public Set<Purpose> getPurposeSet() {
-        return mPurposeSet;
-    }
-
-    /**
-     * For data-collected, returns {@code true} if data usage is user optional and {@code false} if
-     * data usage is required. Should return {@code null} for data-accessed and data-shared.
-     */
-    public Boolean getIsCollectionOptional() {
-        return mIsCollectionOptional;
-    }
-
-    /**
-     * For data-shared, returns {@code true} if data usage is user optional and {@code false} if
-     * data usage is required. Should return {@code null} for data-accessed and data-collected.
-     */
-    public Boolean getIsSharingOptional() {
-        return mIsSharingOptional;
-    }
-
-    /**
-     * For data-collected, returns {@code true} if data usage is user optional and {@code false} if
-     * data usage is processed ephemerally. Should return {@code null} for data-shared.
-     */
-    public Boolean getEphemeral() {
-        return mEphemeral;
-    }
-
-    @Override
-    public List<Element> toOdDomElements(Document doc) {
-        Element dataTypeEle = XmlUtils.createPbundleEleWithName(doc, this.getDataTypeName());
-        if (!this.getPurposeSet().isEmpty()) {
-            Element purposesEle = doc.createElement(XmlUtils.OD_TAG_INT_ARRAY);
-            purposesEle.setAttribute(XmlUtils.OD_ATTR_NAME, XmlUtils.OD_NAME_PURPOSES);
-            purposesEle.setAttribute(
-                    XmlUtils.OD_ATTR_NUM, String.valueOf(this.getPurposeSet().size()));
-            for (DataType.Purpose purpose : this.getPurposeSet()) {
-                Element purposeEle = doc.createElement(XmlUtils.OD_TAG_ITEM);
-                purposeEle.setAttribute(XmlUtils.OD_ATTR_VALUE, String.valueOf(purpose.getValue()));
-                purposesEle.appendChild(purposeEle);
-            }
-            dataTypeEle.appendChild(purposesEle);
-        }
-
-        maybeAddBoolToOdElement(
-                doc,
-                dataTypeEle,
-                this.getIsCollectionOptional(),
-                XmlUtils.OD_NAME_IS_COLLECTION_OPTIONAL);
-        maybeAddBoolToOdElement(
-                doc,
-                dataTypeEle,
-                this.getIsSharingOptional(),
-                XmlUtils.OD_NAME_IS_SHARING_OPTIONAL);
-        maybeAddBoolToOdElement(doc, dataTypeEle, this.getEphemeral(), XmlUtils.OD_NAME_EPHEMERAL);
-        return List.of(dataTypeEle);
-    }
-
-    private static void maybeAddBoolToOdElement(
-            Document doc, Element parentEle, Boolean b, String odName) {
-        if (b == null) {
-            return;
-        }
-        Element ele = XmlUtils.createOdBooleanEle(doc, odName, b);
-        parentEle.appendChild(ele);
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataTypeConstants.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataTypeConstants.java
deleted file mode 100644
index a0a7537..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataTypeConstants.java
+++ /dev/null
@@ -1,156 +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.asllib;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Constants for determining valid {@link String} data types for usage within {@link SafetyLabels},
- * {@link DataCategory}, and {@link DataType}
- */
-public class DataTypeConstants {
-    /** Data types for {@link DataCategoryConstants.CATEGORY_PERSONAL} */
-    public static final String TYPE_NAME = "name";
-
-    public static final String TYPE_EMAIL_ADDRESS = "email_address";
-    public static final String TYPE_PHONE_NUMBER = "phone_number";
-    public static final String TYPE_RACE_ETHNICITY = "race_ethnicity";
-    public static final String TYPE_POLITICAL_OR_RELIGIOUS_BELIEFS =
-            "political_or_religious_beliefs";
-    public static final String TYPE_SEXUAL_ORIENTATION_OR_GENDER_IDENTITY =
-            "sexual_orientation_or_gender_identity";
-    public static final String TYPE_PERSONAL_IDENTIFIERS = "personal_identifiers";
-    public static final String TYPE_OTHER = "other";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_FINANCIAL} */
-    public static final String TYPE_CARD_BANK_ACCOUNT = "card_bank_account";
-
-    public static final String TYPE_PURCHASE_HISTORY = "purchase_history";
-    public static final String TYPE_CREDIT_SCORE = "credit_score";
-    public static final String TYPE_FINANCIAL_OTHER = "other";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_LOCATION} */
-    public static final String TYPE_APPROX_LOCATION = "approx_location";
-
-    public static final String TYPE_PRECISE_LOCATION = "precise_location";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_EMAIL_TEXT_MESSAGE} */
-    public static final String TYPE_EMAILS = "emails";
-
-    public static final String TYPE_TEXT_MESSAGES = "text_messages";
-    public static final String TYPE_EMAIL_TEXT_MESSAGE_OTHER = "other";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_PHOTO_VIDEO} */
-    public static final String TYPE_PHOTOS = "photos";
-
-    public static final String TYPE_VIDEOS = "videos";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_AUDIO} */
-    public static final String TYPE_SOUND_RECORDINGS = "sound_recordings";
-
-    public static final String TYPE_MUSIC_FILES = "music_files";
-    public static final String TYPE_AUDIO_OTHER = "other";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_STORAGE} */
-    public static final String TYPE_FILES_DOCS = "files_docs";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_HEALTH_FITNESS} */
-    public static final String TYPE_HEALTH = "health";
-
-    public static final String TYPE_FITNESS = "fitness";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_CONTACTS} */
-    public static final String TYPE_CONTACTS = "contacts";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_CALENDAR} */
-    public static final String TYPE_CALENDAR = "calendar";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_IDENTIFIERS} */
-    public static final String TYPE_IDENTIFIERS_OTHER = "other";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_APP_PERFORMANCE} */
-    public static final String TYPE_CRASH_LOGS = "crash_logs";
-
-    public static final String TYPE_PERFORMANCE_DIAGNOSTICS = "performance_diagnostics";
-    public static final String TYPE_APP_PERFORMANCE_OTHER = "other";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_ACTIONS_IN_APP} */
-    public static final String TYPE_USER_INTERACTION = "user_interaction";
-
-    public static final String TYPE_IN_APP_SEARCH_HISTORY = "in_app_search_history";
-    public static final String TYPE_INSTALLED_APPS = "installed_apps";
-    public static final String TYPE_USER_GENERATED_CONTENT = "user_generated_content";
-    public static final String TYPE_ACTIONS_IN_APP_OTHER = "other";
-
-    /** Data types for {@link DataCategoryConstants.CATEGORY_SEARCH_AND_BROWSING} */
-    public static final String TYPE_WEB_BROWSING_HISTORY = "web_browsing_history";
-
-    /** Set of valid categories */
-    public static final Set<String> VALID_TYPES =
-            Collections.unmodifiableSet(
-                    new HashSet<>(
-                            Arrays.asList(
-                                    TYPE_NAME,
-                                    TYPE_EMAIL_ADDRESS,
-                                    TYPE_PHONE_NUMBER,
-                                    TYPE_RACE_ETHNICITY,
-                                    TYPE_POLITICAL_OR_RELIGIOUS_BELIEFS,
-                                    TYPE_SEXUAL_ORIENTATION_OR_GENDER_IDENTITY,
-                                    TYPE_PERSONAL_IDENTIFIERS,
-                                    TYPE_OTHER,
-                                    TYPE_CARD_BANK_ACCOUNT,
-                                    TYPE_PURCHASE_HISTORY,
-                                    TYPE_CREDIT_SCORE,
-                                    TYPE_FINANCIAL_OTHER,
-                                    TYPE_APPROX_LOCATION,
-                                    TYPE_PRECISE_LOCATION,
-                                    TYPE_EMAILS,
-                                    TYPE_TEXT_MESSAGES,
-                                    TYPE_EMAIL_TEXT_MESSAGE_OTHER,
-                                    TYPE_PHOTOS,
-                                    TYPE_VIDEOS,
-                                    TYPE_SOUND_RECORDINGS,
-                                    TYPE_MUSIC_FILES,
-                                    TYPE_AUDIO_OTHER,
-                                    TYPE_FILES_DOCS,
-                                    TYPE_HEALTH,
-                                    TYPE_FITNESS,
-                                    TYPE_CONTACTS,
-                                    TYPE_CALENDAR,
-                                    TYPE_IDENTIFIERS_OTHER,
-                                    TYPE_CRASH_LOGS,
-                                    TYPE_PERFORMANCE_DIAGNOSTICS,
-                                    TYPE_APP_PERFORMANCE_OTHER,
-                                    TYPE_USER_INTERACTION,
-                                    TYPE_IN_APP_SEARCH_HISTORY,
-                                    TYPE_INSTALLED_APPS,
-                                    TYPE_USER_GENERATED_CONTENT,
-                                    TYPE_ACTIONS_IN_APP_OTHER,
-                                    TYPE_WEB_BROWSING_HISTORY)));
-
-    /** Returns {@link Set} of valid {@link String} category keys */
-    public static Set<String> getValidDataTypes() {
-        return VALID_TYPES;
-    }
-
-    private DataTypeConstants() {
-        /* do nothing - hide constructor */
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataTypeFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataTypeFactory.java
deleted file mode 100644
index e3d1587..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataTypeFactory.java
+++ /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.asllib;
-
-import org.w3c.dom.Element;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-public class DataTypeFactory implements AslMarshallableFactory<DataType> {
-    /** Creates a {@link DataType} from the human-readable DOM element. */
-    @Override
-    public DataType createFromHrElements(List<Element> elements) {
-        Element hrDataTypeEle = XmlUtils.getSingleElement(elements);
-        String dataTypeName = hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_DATA_TYPE);
-        Set<DataType.Purpose> purposeSet =
-                Arrays.stream(hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_PURPOSES).split("\\|"))
-                        .map(DataType.Purpose::forString)
-                        .collect(Collectors.toUnmodifiableSet());
-        Boolean isCollectionOptional =
-                XmlUtils.fromString(
-                        hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_IS_COLLECTION_OPTIONAL));
-        Boolean isSharingOptional =
-                XmlUtils.fromString(
-                        hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_IS_SHARING_OPTIONAL));
-        Boolean ephemeral =
-                XmlUtils.fromString(hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_EPHEMERAL));
-        return new DataType(
-                dataTypeName, purposeSet, isCollectionOptional, isSharingOptional, ephemeral);
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabels.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabels.java
deleted file mode 100644
index f06522f..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabels.java
+++ /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.asllib;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.util.List;
-
-/** Safety Label representation containing zero or more {@link DataCategory} for data shared */
-public class SafetyLabels implements AslMarshallable {
-
-    private final Long mVersion;
-    private final DataLabels mDataLabels;
-
-    public SafetyLabels(Long version, DataLabels dataLabels) {
-        this.mVersion = version;
-        this.mDataLabels = dataLabels;
-    }
-
-    /** Returns the data label for the safety label */
-    public DataLabels getDataLabel() {
-        return mDataLabels;
-    }
-
-    /** Gets the version of the {@link SafetyLabels}. */
-    public Long getVersion() {
-        return mVersion;
-    }
-
-    /** Creates an on-device DOM element from the {@link SafetyLabels}. */
-    @Override
-    public List<Element> toOdDomElements(Document doc) {
-        Element safetyLabelsEle =
-                XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_SAFETY_LABELS);
-        XmlUtils.appendChildren(safetyLabelsEle, mDataLabels.toOdDomElements(doc));
-        return List.of(safetyLabelsEle);
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabelsFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabelsFactory.java
deleted file mode 100644
index 80b9f57..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabelsFactory.java
+++ /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.asllib;
-
-import com.android.asllib.util.MalformedXmlException;
-
-import org.w3c.dom.Element;
-
-import java.util.List;
-
-public class SafetyLabelsFactory implements AslMarshallableFactory<SafetyLabels> {
-
-    /** Creates a {@link SafetyLabels} from the human-readable DOM element. */
-    @Override
-    public SafetyLabels createFromHrElements(List<Element> elements) throws MalformedXmlException {
-        Element safetyLabelsEle = XmlUtils.getSingleElement(elements);
-        Long version;
-        try {
-            version = Long.parseLong(safetyLabelsEle.getAttribute(XmlUtils.HR_ATTR_VERSION));
-        } catch (Exception e) {
-            throw new IllegalArgumentException(
-                    "Malformed or missing required version in safety labels.");
-        }
-
-        DataLabels dataLabels =
-                new DataLabelsFactory()
-                        .createFromHrElements(
-                                List.of(
-                                        XmlUtils.getSingleChildElement(
-                                                safetyLabelsEle, XmlUtils.HR_TAG_DATA_LABELS)));
-        return new SafetyLabels(version, dataLabels);
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/XmlUtils.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/XmlUtils.java
deleted file mode 100644
index 3bc9ccc..0000000
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/XmlUtils.java
+++ /dev/null
@@ -1,158 +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.asllib;
-
-import com.android.asllib.util.MalformedXmlException;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class XmlUtils {
-    public static final String HR_TAG_APP_METADATA_BUNDLES = "app-metadata-bundles";
-    public static final String HR_TAG_SAFETY_LABELS = "safety-labels";
-    public static final String HR_TAG_DATA_LABELS = "data-labels";
-    public static final String HR_TAG_DATA_ACCESSED = "data-accessed";
-    public static final String HR_TAG_DATA_COLLECTED = "data-collected";
-    public static final String HR_TAG_DATA_SHARED = "data-shared";
-
-    public static final String HR_ATTR_DATA_CATEGORY = "dataCategory";
-    public static final String HR_ATTR_DATA_TYPE = "dataType";
-    public static final String HR_ATTR_IS_COLLECTION_OPTIONAL = "isCollectionOptional";
-    public static final String HR_ATTR_IS_SHARING_OPTIONAL = "isSharingOptional";
-    public static final String HR_ATTR_EPHEMERAL = "ephemeral";
-    public static final String HR_ATTR_PURPOSES = "purposes";
-    public static final String HR_ATTR_VERSION = "version";
-
-    public static final String OD_TAG_BUNDLE = "bundle";
-    public static final String OD_TAG_PBUNDLE_AS_MAP = "pbundle_as_map";
-    public static final String OD_TAG_BOOLEAN = "boolean";
-    public static final String OD_TAG_INT_ARRAY = "int-array";
-    public static final String OD_TAG_ITEM = "item";
-    public static final String OD_ATTR_NAME = "name";
-    public static final String OD_ATTR_VALUE = "value";
-    public static final String OD_ATTR_NUM = "num";
-    public static final String OD_NAME_SAFETY_LABELS = "safety_labels";
-    public static final String OD_NAME_DATA_LABELS = "data_labels";
-    public static final String OD_NAME_DATA_ACCESSED = "data_accessed";
-    public static final String OD_NAME_DATA_COLLECTED = "data_collected";
-    public static final String OD_NAME_DATA_SHARED = "data_shared";
-    public static final String OD_NAME_PURPOSES = "purposes";
-    public static final String OD_NAME_IS_COLLECTION_OPTIONAL = "is_collection_optional";
-    public static final String OD_NAME_IS_SHARING_OPTIONAL = "is_sharing_optional";
-    public static final String OD_NAME_EPHEMERAL = "ephemeral";
-
-    public static final String TRUE_STR = "true";
-    public static final String FALSE_STR = "false";
-
-    /** Gets the single top-level {@link Element} having the {@param tagName}. */
-    public static Element getSingleElement(Document doc, String tagName)
-            throws MalformedXmlException {
-        var elements = doc.getElementsByTagName(tagName);
-        return getSingleElement(elements, tagName);
-    }
-
-    /**
-     * Gets the single {@link Element} within {@param parentEle} and having the {@param tagName}.
-     */
-    public static Element getSingleChildElement(Element parentEle, String tagName)
-            throws MalformedXmlException {
-        var elements = parentEle.getElementsByTagName(tagName);
-        return getSingleElement(elements, tagName);
-    }
-
-    /** Gets the single {@link Element} from {@param elements} */
-    public static Element getSingleElement(NodeList elements, String tagName)
-            throws MalformedXmlException {
-        if (elements.getLength() != 1) {
-            throw new MalformedXmlException(
-                    String.format(
-                            "Expected 1 element \"%s\" in NodeList but got %s.",
-                            tagName, elements.getLength()));
-        }
-        var elementAsNode = elements.item(0);
-        if (!(elementAsNode instanceof Element)) {
-            throw new MalformedXmlException(
-                    String.format("%s was not a valid XML element.", tagName));
-        }
-        return ((Element) elementAsNode);
-    }
-
-    /** Gets the single {@link Element} within {@param elements}. */
-    public static Element getSingleElement(List<Element> elements) {
-        if (elements.size() != 1) {
-            throw new IllegalStateException(
-                    String.format("Expected 1 element in list but got %s.", elements.size()));
-        }
-        return elements.get(0);
-    }
-
-    /** Converts {@param nodeList} into List of {@link Element}. */
-    public static List<Element> asElementList(NodeList nodeList) {
-        List<Element> elementList = new ArrayList<Element>();
-        for (int i = 0; i < nodeList.getLength(); i++) {
-            var elementAsNode = nodeList.item(0);
-            if (elementAsNode instanceof Element) {
-                elementList.add(((Element) elementAsNode));
-            }
-        }
-        return elementList;
-    }
-
-    /** Appends {@param children} to the {@param ele}. */
-    public static void appendChildren(Element ele, List<Element> children) {
-        for (Element c : children) {
-            ele.appendChild(c);
-        }
-    }
-
-    /** Gets the Boolean from the String value. */
-    public static Boolean fromString(String s) {
-        if (s == null) {
-            return null;
-        }
-        if (s.equals(TRUE_STR)) {
-            return true;
-        } else if (s.equals(FALSE_STR)) {
-            return false;
-        }
-        return null;
-    }
-
-    /** Creates an on-device PBundle DOM Element with the given attribute name. */
-    public static Element createPbundleEleWithName(Document doc, String name) {
-        var ele = doc.createElement(XmlUtils.OD_TAG_PBUNDLE_AS_MAP);
-        ele.setAttribute(XmlUtils.OD_ATTR_NAME, name);
-        return ele;
-    }
-
-    /** Create an on-device Boolean DOM Element with the given attribute name. */
-    public static Element createOdBooleanEle(Document doc, String name, boolean b) {
-        var ele = doc.createElement(XmlUtils.OD_TAG_BOOLEAN);
-        ele.setAttribute(XmlUtils.OD_ATTR_NAME, name);
-        ele.setAttribute(XmlUtils.OD_ATTR_VALUE, String.valueOf(b));
-        return ele;
-    }
-
-    /** Returns whether the String is null or empty. */
-    public static boolean isNullOrEmpty(String s) {
-        return s == null || s.isEmpty();
-    }
-}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabel.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabel.java
new file mode 100644
index 0000000..ecfad91
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabel.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.asllib.marshallable;
+
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class AndroidSafetyLabel implements AslMarshallable {
+
+    private final Long mVersion;
+    private final SystemAppSafetyLabel mSystemAppSafetyLabel;
+    private final SafetyLabels mSafetyLabels;
+    private final TransparencyInfo mTransparencyInfo;
+
+    public SafetyLabels getSafetyLabels() {
+        return mSafetyLabels;
+    }
+
+    public AndroidSafetyLabel(
+            Long version,
+            SystemAppSafetyLabel systemAppSafetyLabel,
+            SafetyLabels safetyLabels,
+            TransparencyInfo transparencyInfo) {
+        this.mVersion = version;
+        this.mSystemAppSafetyLabel = systemAppSafetyLabel;
+        this.mSafetyLabels = safetyLabels;
+        this.mTransparencyInfo = transparencyInfo;
+    }
+
+    /** Creates an on-device DOM element from an {@link AndroidSafetyLabel} */
+    @Override
+    public List<Element> toOdDomElements(Document doc) {
+        Element aslEle = doc.createElement(XmlUtils.OD_TAG_BUNDLE);
+        aslEle.appendChild(XmlUtils.createOdLongEle(doc, XmlUtils.OD_NAME_VERSION, mVersion));
+        if (mSafetyLabels != null) {
+            XmlUtils.appendChildren(aslEle, mSafetyLabels.toOdDomElements(doc));
+        }
+        if (mSystemAppSafetyLabel != null) {
+            XmlUtils.appendChildren(aslEle, mSystemAppSafetyLabel.toOdDomElements(doc));
+        }
+        if (mTransparencyInfo != null) {
+            XmlUtils.appendChildren(aslEle, mTransparencyInfo.toOdDomElements(doc));
+        }
+        return XmlUtils.listOf(aslEle);
+    }
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    @Override
+    public List<Element> toHrDomElements(Document doc) {
+        return List.of();
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabelFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabelFactory.java
new file mode 100644
index 0000000..41ce6e55
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabelFactory.java
@@ -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.asllib.marshallable;
+
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class AndroidSafetyLabelFactory implements AslMarshallableFactory<AndroidSafetyLabel> {
+
+    /** Creates an {@link AndroidSafetyLabel} from human-readable DOM element */
+    @Override
+    public AndroidSafetyLabel createFromHrElements(List<Element> appMetadataBundles)
+            throws MalformedXmlException {
+        Element appMetadataBundlesEle = XmlUtils.getSingleElement(appMetadataBundles);
+        long version = XmlUtils.tryGetVersion(appMetadataBundlesEle);
+
+        Element safetyLabelsEle =
+                XmlUtils.getSingleChildElement(
+                        appMetadataBundlesEle, XmlUtils.HR_TAG_SAFETY_LABELS, false);
+        SafetyLabels safetyLabels =
+                new SafetyLabelsFactory().createFromHrElements(XmlUtils.listOf(safetyLabelsEle));
+
+        Element systemAppSafetyLabelEle =
+                XmlUtils.getSingleChildElement(
+                        appMetadataBundlesEle, XmlUtils.HR_TAG_SYSTEM_APP_SAFETY_LABEL, false);
+        SystemAppSafetyLabel systemAppSafetyLabel =
+                new SystemAppSafetyLabelFactory()
+                        .createFromHrElements(XmlUtils.listOf(systemAppSafetyLabelEle));
+
+        Element transparencyInfoEle =
+                XmlUtils.getSingleChildElement(
+                        appMetadataBundlesEle, XmlUtils.HR_TAG_TRANSPARENCY_INFO, false);
+        TransparencyInfo transparencyInfo =
+                new TransparencyInfoFactory()
+                        .createFromHrElements(XmlUtils.listOf(transparencyInfoEle));
+
+        return new AndroidSafetyLabel(
+                version, systemAppSafetyLabel, safetyLabels, transparencyInfo);
+    }
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    @Override
+    public AndroidSafetyLabel createFromOdElements(List<Element> elements)
+            throws MalformedXmlException {
+        return null;
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfo.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfo.java
new file mode 100644
index 0000000..21f328d
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfo.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.asllib.marshallable;
+
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+/** AppInfo representation */
+public class AppInfo implements AslMarshallable {
+    private final String mTitle;
+    private final String mDescription;
+    private final Boolean mContainsAds;
+    private final Boolean mObeyAps;
+    private final Boolean mAdsFingerprinting;
+    private final Boolean mSecurityFingerprinting;
+    private final String mPrivacyPolicy;
+    private final List<String> mSecurityEndpoints;
+    private final List<String> mFirstPartyEndpoints;
+    private final List<String> mServiceProviderEndpoints;
+    private final String mCategory;
+    private final String mEmail;
+    private final String mWebsite;
+
+    public AppInfo(
+            String title,
+            String description,
+            Boolean containsAds,
+            Boolean obeyAps,
+            Boolean adsFingerprinting,
+            Boolean securityFingerprinting,
+            String privacyPolicy,
+            List<String> securityEndpoints,
+            List<String> firstPartyEndpoints,
+            List<String> serviceProviderEndpoints,
+            String category,
+            String email,
+            String website) {
+        this.mTitle = title;
+        this.mDescription = description;
+        this.mContainsAds = containsAds;
+        this.mObeyAps = obeyAps;
+        this.mAdsFingerprinting = adsFingerprinting;
+        this.mSecurityFingerprinting = securityFingerprinting;
+        this.mPrivacyPolicy = privacyPolicy;
+        this.mSecurityEndpoints = securityEndpoints;
+        this.mFirstPartyEndpoints = firstPartyEndpoints;
+        this.mServiceProviderEndpoints = serviceProviderEndpoints;
+        this.mCategory = category;
+        this.mEmail = email;
+        this.mWebsite = website;
+    }
+
+    /** Creates an on-device DOM element from the {@link SafetyLabels}. */
+    @Override
+    public List<Element> toOdDomElements(Document doc) {
+        Element appInfoEle = XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_APP_INFO);
+        if (this.mTitle != null) {
+            appInfoEle.appendChild(XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_TITLE, mTitle));
+        }
+        if (this.mDescription != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_DESCRIPTION, mDescription));
+        }
+        if (this.mContainsAds != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdBooleanEle(doc, XmlUtils.OD_NAME_CONTAINS_ADS, mContainsAds));
+        }
+        if (this.mObeyAps != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdBooleanEle(doc, XmlUtils.OD_NAME_OBEY_APS, mObeyAps));
+        }
+        if (this.mAdsFingerprinting != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdBooleanEle(
+                            doc, XmlUtils.OD_NAME_ADS_FINGERPRINTING, mAdsFingerprinting));
+        }
+        if (this.mSecurityFingerprinting != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdBooleanEle(
+                            doc,
+                            XmlUtils.OD_NAME_SECURITY_FINGERPRINTING,
+                            mSecurityFingerprinting));
+        }
+        if (this.mPrivacyPolicy != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdStringEle(
+                            doc, XmlUtils.OD_NAME_PRIVACY_POLICY, mPrivacyPolicy));
+        }
+        if (this.mSecurityEndpoints != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdArray(
+                            doc,
+                            XmlUtils.OD_TAG_STRING_ARRAY,
+                            XmlUtils.OD_NAME_SECURITY_ENDPOINT,
+                            mSecurityEndpoints));
+        }
+        if (this.mFirstPartyEndpoints != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdArray(
+                            doc,
+                            XmlUtils.OD_TAG_STRING_ARRAY,
+                            XmlUtils.OD_NAME_FIRST_PARTY_ENDPOINT,
+                            mFirstPartyEndpoints));
+        }
+        if (this.mServiceProviderEndpoints != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdArray(
+                            doc,
+                            XmlUtils.OD_TAG_STRING_ARRAY,
+                            XmlUtils.OD_NAME_SERVICE_PROVIDER_ENDPOINT,
+                            mServiceProviderEndpoints));
+        }
+        if (this.mCategory != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_CATEGORY, this.mCategory));
+        }
+        if (this.mEmail != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_EMAIL, this.mEmail));
+        }
+        if (this.mWebsite != null) {
+            appInfoEle.appendChild(
+                    XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_WEBSITE, this.mWebsite));
+        }
+        return XmlUtils.listOf(appInfoEle);
+    }
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    @Override
+    public List<Element> toHrDomElements(Document doc) {
+        return List.of();
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfoFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfoFactory.java
new file mode 100644
index 0000000..6fcf637
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfoFactory.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.asllib.marshallable;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class AppInfoFactory implements AslMarshallableFactory<AppInfo> {
+
+    /** Creates a {@link AppInfo} from the human-readable DOM element. */
+    @Override
+    public AppInfo createFromHrElements(List<Element> elements) throws MalformedXmlException {
+        Element appInfoEle = XmlUtils.getSingleElement(elements);
+        if (appInfoEle == null) {
+            AslgenUtil.logI("No AppInfo found in hr format.");
+            return null;
+        }
+
+        String title = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_TITLE);
+        String description = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_DESCRIPTION);
+        Boolean containsAds = XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_CONTAINS_ADS, true);
+        Boolean obeyAps = XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_OBEY_APS, true);
+        Boolean adsFingerprinting =
+                XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_ADS_FINGERPRINTING, true);
+        Boolean securityFingerprinting =
+                XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_SECURITY_FINGERPRINTING, true);
+        String privacyPolicy = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_PRIVACY_POLICY);
+        List<String> securityEndpoints =
+                XmlUtils.getPipelineSplitAttr(
+                        appInfoEle, XmlUtils.HR_ATTR_SECURITY_ENDPOINTS, true);
+        List<String> firstPartyEndpoints =
+                XmlUtils.getPipelineSplitAttr(
+                        appInfoEle, XmlUtils.HR_ATTR_FIRST_PARTY_ENDPOINTS, true);
+        List<String> serviceProviderEndpoints =
+                XmlUtils.getPipelineSplitAttr(
+                        appInfoEle, XmlUtils.HR_ATTR_SERVICE_PROVIDER_ENDPOINTS, true);
+        String category = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_CATEGORY);
+        String email = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_EMAIL);
+        String website = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_WEBSITE, false);
+
+        return new AppInfo(
+                title,
+                description,
+                containsAds,
+                obeyAps,
+                adsFingerprinting,
+                securityFingerprinting,
+                privacyPolicy,
+                securityEndpoints,
+                firstPartyEndpoints,
+                serviceProviderEndpoints,
+                category,
+                email,
+                website);
+    }
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    @Override
+    public AppInfo createFromOdElements(List<Element> elements) throws MalformedXmlException {
+        return null;
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AslMarshallable.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AslMarshallable.java
new file mode 100644
index 0000000..0a70e7d0
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AslMarshallable.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.asllib.marshallable;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public interface AslMarshallable {
+
+    /** Creates the on-device DOM elements from the AslMarshallable Java Object. */
+    List<Element> toOdDomElements(Document doc);
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    List<Element> toHrDomElements(Document doc);
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AslMarshallableFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AslMarshallableFactory.java
new file mode 100644
index 0000000..3958290
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AslMarshallableFactory.java
@@ -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.asllib.marshallable;
+
+import com.android.asllib.util.MalformedXmlException;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public interface AslMarshallableFactory<T extends AslMarshallable> {
+
+    /** Creates an {@link AslMarshallableFactory} from human-readable DOM elements */
+    T createFromHrElements(List<Element> elements) throws MalformedXmlException;
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    T createFromOdElements(List<Element> elements) throws MalformedXmlException;
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java
new file mode 100644
index 0000000..eb97554
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.asllib.marshallable;
+
+import com.android.asllib.util.DataCategoryConstants;
+import com.android.asllib.util.DataTypeConstants;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Data usage category representation containing one or more {@link DataType}. Valid category keys
+ * are defined in {@link DataCategoryConstants}, each category has a valid set of types {@link
+ * DataType}, which are mapped in {@link DataTypeConstants}
+ */
+public class DataCategory implements AslMarshallable {
+    private final String mCategoryName;
+    private final Map<String, DataType> mDataTypes;
+
+    public DataCategory(String categoryName, Map<String, DataType> dataTypes) {
+        this.mCategoryName = categoryName;
+        this.mDataTypes = dataTypes;
+    }
+
+    public String getCategoryName() {
+        return mCategoryName;
+    }
+
+    /** Return the type {@link Map} of String type key to {@link DataType} */
+
+    public Map<String, DataType> getDataTypes() {
+        return mDataTypes;
+    }
+
+    /** Creates on-device DOM element(s) from the {@link DataCategory}. */
+    @Override
+    public List<Element> toOdDomElements(Document doc) {
+        Element dataCategoryEle = XmlUtils.createPbundleEleWithName(doc, this.getCategoryName());
+        for (DataType dataType : mDataTypes.values()) {
+            XmlUtils.appendChildren(dataCategoryEle, dataType.toOdDomElements(doc));
+        }
+        return XmlUtils.listOf(dataCategoryEle);
+    }
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    @Override
+    public List<Element> toHrDomElements(Document doc) {
+        return List.of();
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategoryFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategoryFactory.java
new file mode 100644
index 0000000..90424fe
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategoryFactory.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.asllib.marshallable;
+
+import com.android.asllib.util.DataTypeConstants;
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Element;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DataCategoryFactory implements AslMarshallableFactory<DataCategory> {
+    @Override
+    public DataCategory createFromHrElements(List<Element> elements) throws MalformedXmlException {
+        String categoryName = null;
+        Map<String, DataType> dataTypeMap = new LinkedHashMap<String, DataType>();
+        for (Element ele : elements) {
+            categoryName = XmlUtils.getStringAttr(ele, XmlUtils.HR_ATTR_DATA_CATEGORY, true);
+            String dataTypeName = XmlUtils.getStringAttr(ele, XmlUtils.HR_ATTR_DATA_TYPE, true);
+            if (!DataTypeConstants.getValidDataTypes().containsKey(categoryName)) {
+                throw new MalformedXmlException(
+                        String.format("Unrecognized data category %s", categoryName));
+            }
+            if (!DataTypeConstants.getValidDataTypes().get(categoryName).contains(dataTypeName)) {
+                throw new MalformedXmlException(
+                        String.format(
+                                "Unrecognized data type name %s for category %s",
+                                dataTypeName, categoryName));
+            }
+            dataTypeMap.put(
+                    dataTypeName, new DataTypeFactory().createFromHrElements(XmlUtils.listOf(ele)));
+        }
+
+        return new DataCategory(categoryName, dataTypeMap);
+    }
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    @Override
+    public DataCategory createFromOdElements(List<Element> elements) throws MalformedXmlException {
+        Element dataCategoryEle = XmlUtils.getSingleElement(elements);
+        Map<String, DataType> dataTypeMap = new LinkedHashMap<String, DataType>();
+        String categoryName = dataCategoryEle.getAttribute(XmlUtils.OD_ATTR_NAME);
+        var odDataTypes = XmlUtils.asElementList(dataCategoryEle.getChildNodes());
+        for (Element odDataTypeEle : odDataTypes) {
+            String dataTypeName = odDataTypeEle.getAttribute(XmlUtils.OD_ATTR_NAME);
+            if (!DataTypeConstants.getValidDataTypes().containsKey(categoryName)) {
+                throw new MalformedXmlException(
+                        String.format("Unrecognized data category %s", categoryName));
+            }
+            if (!DataTypeConstants.getValidDataTypes().get(categoryName).contains(dataTypeName)) {
+                throw new MalformedXmlException(
+                        String.format(
+                                "Unrecognized data type name %s for category %s",
+                                dataTypeName, categoryName));
+            }
+            dataTypeMap.put(
+                    dataTypeName,
+                    new DataTypeFactory().createFromOdElements(XmlUtils.listOf(odDataTypeEle)));
+        }
+
+        return new DataCategory(categoryName, dataTypeMap);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabels.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabels.java
new file mode 100644
index 0000000..4a0d759
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabels.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.asllib.marshallable;
+
+import com.android.asllib.util.DataCategoryConstants;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Data label representation with data shared and data collected maps containing zero or more {@link
+ * DataCategory}
+ */
+public class DataLabels implements AslMarshallable {
+    private final Map<String, DataCategory> mDataAccessed;
+    private final Map<String, DataCategory> mDataCollected;
+    private final Map<String, DataCategory> mDataShared;
+
+    public DataLabels(
+            Map<String, DataCategory> dataAccessed,
+            Map<String, DataCategory> dataCollected,
+            Map<String, DataCategory> dataShared) {
+        mDataAccessed = dataAccessed;
+        mDataCollected = dataCollected;
+        mDataShared = dataShared;
+    }
+
+    /**
+     * Returns the data accessed {@link Map} of {@link DataCategoryConstants} to {@link
+     * DataCategory}
+     */
+    public Map<String, DataCategory> getDataAccessed() {
+        return mDataAccessed;
+    }
+
+    /**
+     * Returns the data collected {@link Map} of {@link DataCategoryConstants} to {@link
+     * DataCategory}
+     */
+    public Map<String, DataCategory> getDataCollected() {
+        return mDataCollected;
+    }
+
+    /**
+     * Returns the data shared {@link Map} of {@link DataCategoryConstants} to {@link DataCategory}
+     */
+    public Map<String, DataCategory> getDataShared() {
+        return mDataShared;
+    }
+
+    /** Gets the on-device DOM element for the {@link DataLabels}. */
+    @Override
+    public List<Element> toOdDomElements(Document doc) {
+        Element dataLabelsEle =
+                XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_DATA_LABELS);
+
+        maybeAppendDataUsages(doc, dataLabelsEle, mDataAccessed, XmlUtils.OD_NAME_DATA_ACCESSED);
+        maybeAppendDataUsages(doc, dataLabelsEle, mDataCollected, XmlUtils.OD_NAME_DATA_COLLECTED);
+        maybeAppendDataUsages(doc, dataLabelsEle, mDataShared, XmlUtils.OD_NAME_DATA_SHARED);
+
+        return XmlUtils.listOf(dataLabelsEle);
+    }
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    @Override
+    public List<Element> toHrDomElements(Document doc) {
+        Element dataLabelsEle = doc.createElement(XmlUtils.HR_TAG_DATA_LABELS);
+        maybeAppendHrDataUsages(doc, dataLabelsEle, mDataAccessed, XmlUtils.HR_TAG_DATA_ACCESSED);
+        maybeAppendHrDataUsages(doc, dataLabelsEle, mDataCollected, XmlUtils.HR_TAG_DATA_COLLECTED);
+        maybeAppendHrDataUsages(doc, dataLabelsEle, mDataShared, XmlUtils.HR_TAG_DATA_SHARED);
+        return XmlUtils.listOf(dataLabelsEle);
+    }
+
+    private void maybeAppendDataUsages(
+            Document doc,
+            Element dataLabelsEle,
+            Map<String, DataCategory> dataCategoriesMap,
+            String dataUsageTypeName) {
+        if (dataCategoriesMap.isEmpty()) {
+            return;
+        }
+        Element dataUsageEle = XmlUtils.createPbundleEleWithName(doc, dataUsageTypeName);
+
+        for (String dataCategoryName : dataCategoriesMap.keySet()) {
+            Element dataCategoryEle = XmlUtils.createPbundleEleWithName(doc, dataCategoryName);
+            DataCategory dataCategory = dataCategoriesMap.get(dataCategoryName);
+            for (String dataTypeName : dataCategory.getDataTypes().keySet()) {
+                DataType dataType = dataCategory.getDataTypes().get(dataTypeName);
+                XmlUtils.appendChildren(dataCategoryEle, dataType.toOdDomElements(doc));
+            }
+            dataUsageEle.appendChild(dataCategoryEle);
+        }
+        dataLabelsEle.appendChild(dataUsageEle);
+    }
+
+    private void maybeAppendHrDataUsages(
+            Document doc,
+            Element dataLabelsEle,
+            Map<String, DataCategory> dataCategoriesMap,
+            String dataUsageTypeName) {
+        if (dataCategoriesMap.isEmpty()) {
+            return;
+        }
+        for (String dataCategoryName : dataCategoriesMap.keySet()) {
+            DataCategory dataCategory = dataCategoriesMap.get(dataCategoryName);
+            for (String dataTypeName : dataCategory.getDataTypes().keySet()) {
+                DataType dataType = dataCategory.getDataTypes().get(dataTypeName);
+                // XmlUtils.appendChildren(dataLabelsEle, dataType.toHrDomElements(doc));
+                Element hrDataTypeEle = doc.createElement(dataUsageTypeName);
+                hrDataTypeEle.setAttribute(XmlUtils.HR_ATTR_DATA_CATEGORY, dataCategoryName);
+                hrDataTypeEle.setAttribute(XmlUtils.HR_ATTR_DATA_TYPE, dataTypeName);
+                XmlUtils.maybeSetHrBoolAttr(
+                        hrDataTypeEle,
+                        XmlUtils.HR_ATTR_IS_COLLECTION_OPTIONAL,
+                        dataType.getIsCollectionOptional());
+                XmlUtils.maybeSetHrBoolAttr(
+                        hrDataTypeEle,
+                        XmlUtils.HR_ATTR_IS_SHARING_OPTIONAL,
+                        dataType.getIsSharingOptional());
+                XmlUtils.maybeSetHrBoolAttr(
+                        hrDataTypeEle, XmlUtils.HR_ATTR_EPHEMERAL, dataType.getEphemeral());
+                hrDataTypeEle.setAttribute(
+                        XmlUtils.HR_ATTR_PURPOSES,
+                        String.join(
+                                "|",
+                                dataType.getPurposes().stream()
+                                        .map(DataType.Purpose::toString)
+                                        .toList()));
+                dataLabelsEle.appendChild(hrDataTypeEle);
+            }
+        }
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabelsFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabelsFactory.java
new file mode 100644
index 0000000..5473e01
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataLabelsFactory.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.asllib.marshallable;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.DataCategoryConstants;
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Element;
+
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class DataLabelsFactory implements AslMarshallableFactory<DataLabels> {
+
+    /** Creates a {@link DataLabels} from the human-readable DOM element. */
+    @Override
+    public DataLabels createFromHrElements(List<Element> elements) throws MalformedXmlException {
+        Element ele = XmlUtils.getSingleElement(elements);
+        if (ele == null) {
+            AslgenUtil.logI("Found no DataLabels in hr format.");
+            return null;
+        }
+        Map<String, DataCategory> dataAccessed =
+                getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_ACCESSED);
+        Map<String, DataCategory> dataCollected =
+                getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_COLLECTED);
+        Map<String, DataCategory> dataShared =
+                getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_SHARED);
+        DataLabels dataLabels = new DataLabels(dataAccessed, dataCollected, dataShared);
+        validateIsXOptional(dataLabels);
+        return dataLabels;
+    }
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    @Override
+    public DataLabels createFromOdElements(List<Element> elements) throws MalformedXmlException {
+        Element dataLabelsEle = XmlUtils.getSingleElement(elements);
+        if (dataLabelsEle == null) {
+            AslgenUtil.logI("Found no DataLabels in od format.");
+            return null;
+        }
+        Map<String, DataCategory> dataAccessed =
+                getOdDataCategoriesWithTag(dataLabelsEle, XmlUtils.OD_NAME_DATA_ACCESSED);
+        Map<String, DataCategory> dataCollected =
+                getOdDataCategoriesWithTag(dataLabelsEle, XmlUtils.OD_NAME_DATA_COLLECTED);
+        Map<String, DataCategory> dataShared =
+                getOdDataCategoriesWithTag(dataLabelsEle, XmlUtils.OD_NAME_DATA_SHARED);
+        DataLabels dataLabels = new DataLabels(dataAccessed, dataCollected, dataShared);
+        validateIsXOptional(dataLabels);
+        return dataLabels;
+    }
+
+    private static Map<String, DataCategory> getOdDataCategoriesWithTag(
+            Element dataLabelsEle, String dataCategoryUsageTypeTag) throws MalformedXmlException {
+        Map<String, DataCategory> dataCategoryMap = new LinkedHashMap<String, DataCategory>();
+        Element dataUsageEle =
+                XmlUtils.getOdPbundleWithName(dataLabelsEle, dataCategoryUsageTypeTag, false);
+        if (dataUsageEle == null) {
+            return dataCategoryMap;
+        }
+        List<Element> dataCategoryEles = XmlUtils.asElementList(dataUsageEle.getChildNodes());
+        for (Element dataCategoryEle : dataCategoryEles) {
+            String dataCategoryName = dataCategoryEle.getAttribute(XmlUtils.OD_ATTR_NAME);
+            DataCategory dataCategory =
+                    new DataCategoryFactory().createFromOdElements(List.of(dataCategoryEle));
+            dataCategoryMap.put(dataCategoryName, dataCategory);
+        }
+        return dataCategoryMap;
+    }
+
+    private static Map<String, DataCategory> getDataCategoriesWithTag(
+            Element dataLabelsEle, String dataCategoryUsageTypeTag) throws MalformedXmlException {
+        List<Element> dataUsedElements =
+                XmlUtils.getChildrenByTagName(dataLabelsEle, dataCategoryUsageTypeTag);
+        Map<String, DataCategory> dataCategoryMap = new LinkedHashMap<String, DataCategory>();
+
+        Set<String> dataCategoryNames = new HashSet<String>();
+        for (int i = 0; i < dataUsedElements.size(); i++) {
+            Element dataUsedEle = dataUsedElements.get(i);
+            String dataCategoryName = dataUsedEle.getAttribute(XmlUtils.HR_ATTR_DATA_CATEGORY);
+            if (!DataCategoryConstants.getValidDataCategories().contains(dataCategoryName)) {
+                throw new MalformedXmlException(
+                        String.format("Unrecognized category name: %s", dataCategoryName));
+            }
+            dataCategoryNames.add(dataCategoryName);
+        }
+        for (String dataCategoryName : dataCategoryNames) {
+            var dataCategoryElements =
+                    dataUsedElements.stream()
+                            .filter(
+                                    ele ->
+                                            ele.getAttribute(XmlUtils.HR_ATTR_DATA_CATEGORY)
+                                                    .equals(dataCategoryName))
+                            .toList();
+            DataCategory dataCategory =
+                    new DataCategoryFactory().createFromHrElements(dataCategoryElements);
+            dataCategoryMap.put(dataCategoryName, dataCategory);
+        }
+        return dataCategoryMap;
+    }
+
+    private void validateIsXOptional(DataLabels dataLabels) throws MalformedXmlException {
+        // Validate booleans such as isCollectionOptional, isSharingOptional.
+        for (DataCategory dataCategory : dataLabels.getDataAccessed().values()) {
+            for (DataType dataType : dataCategory.getDataTypes().values()) {
+                if (dataType.getIsSharingOptional() != null) {
+                    throw new MalformedXmlException(
+                            String.format(
+                                    "isSharingOptional was unexpectedly defined on a DataType"
+                                            + " belonging to data accessed: %s",
+                                    dataType.getDataTypeName()));
+                }
+                if (dataType.getIsCollectionOptional() != null) {
+                    throw new MalformedXmlException(
+                            String.format(
+                                    "isCollectionOptional was unexpectedly defined on a DataType"
+                                            + " belonging to data accessed: %s",
+                                    dataType.getDataTypeName()));
+                }
+            }
+        }
+        for (DataCategory dataCategory : dataLabels.getDataCollected().values()) {
+            for (DataType dataType : dataCategory.getDataTypes().values()) {
+                if (dataType.getIsSharingOptional() != null) {
+                    throw new MalformedXmlException(
+                            String.format(
+                                    "isSharingOptional was unexpectedly defined on a DataType"
+                                            + " belonging to data collected: %s",
+                                    dataType.getDataTypeName()));
+                }
+            }
+        }
+        for (DataCategory dataCategory : dataLabels.getDataShared().values()) {
+            for (DataType dataType : dataCategory.getDataTypes().values()) {
+                if (dataType.getIsCollectionOptional() != null) {
+                    throw new MalformedXmlException(
+                            String.format(
+                                    "isCollectionOptional was unexpectedly defined on a DataType"
+                                            + " belonging to data shared: %s",
+                                    dataType.getDataTypeName()));
+                }
+            }
+        }
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataType.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataType.java
new file mode 100644
index 0000000..02b7189
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataType.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.asllib.marshallable;
+
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Data usage type representation. Types are specific to a {@link DataCategory} and contains
+ * metadata related to the data usage purpose.
+ */
+public class DataType implements AslMarshallable {
+
+    public enum Purpose {
+        APP_FUNCTIONALITY(1),
+        ANALYTICS(2),
+        DEVELOPER_COMMUNICATIONS(3),
+        FRAUD_PREVENTION_SECURITY(4),
+        ADVERTISING(5),
+        PERSONALIZATION(6),
+        ACCOUNT_MANAGEMENT(7);
+
+        private final int mValue;
+
+        Purpose(int value) {
+            this.mValue = value;
+        }
+
+        /** Get the int value associated with the Purpose. */
+        public int getValue() {
+            return mValue;
+        }
+
+        /** Get the Purpose associated with the int value. */
+        public static Purpose forValue(int value) {
+            for (Purpose e : values()) {
+                if (e.getValue() == value) {
+                    return e;
+                }
+            }
+            throw new IllegalArgumentException("No Purpose enum for value: " + value);
+        }
+
+        /** Get the Purpose associated with the human-readable String. */
+        public static Purpose forString(String s) {
+            for (Purpose e : values()) {
+                if (e.toString().equals(s)) {
+                    return e;
+                }
+            }
+            throw new IllegalArgumentException("No Purpose enum for str: " + s);
+        }
+
+        /** Human-readable String representation of Purpose. */
+        public String toString() {
+            return this.name().toLowerCase();
+        }
+    }
+
+    private final String mDataTypeName;
+
+    private final List<Purpose> mPurposes;
+    private final Boolean mIsCollectionOptional;
+    private final Boolean mIsSharingOptional;
+    private final Boolean mEphemeral;
+
+    public DataType(
+            String dataTypeName,
+            List<Purpose> purposes,
+            Boolean isCollectionOptional,
+            Boolean isSharingOptional,
+            Boolean ephemeral) {
+        this.mDataTypeName = dataTypeName;
+        this.mPurposes = purposes;
+        this.mIsCollectionOptional = isCollectionOptional;
+        this.mIsSharingOptional = isSharingOptional;
+        this.mEphemeral = ephemeral;
+    }
+
+    public String getDataTypeName() {
+        return mDataTypeName;
+    }
+
+    /**
+     * Returns {@link Set} of valid {@link Integer} purposes for using the associated data category
+     * and type
+     */
+    public List<Purpose> getPurposes() {
+        return mPurposes;
+    }
+
+    /**
+     * For data-collected, returns {@code true} if data usage is user optional and {@code false} if
+     * data usage is required. Should return {@code null} for data-accessed and data-shared.
+     */
+    public Boolean getIsCollectionOptional() {
+        return mIsCollectionOptional;
+    }
+
+    /**
+     * For data-shared, returns {@code true} if data usage is user optional and {@code false} if
+     * data usage is required. Should return {@code null} for data-accessed and data-collected.
+     */
+    public Boolean getIsSharingOptional() {
+        return mIsSharingOptional;
+    }
+
+    /**
+     * For data-collected, returns {@code true} if data usage is user optional and {@code false} if
+     * data usage is processed ephemerally. Should return {@code null} for data-shared.
+     */
+    public Boolean getEphemeral() {
+        return mEphemeral;
+    }
+
+    @Override
+    public List<Element> toOdDomElements(Document doc) {
+        Element dataTypeEle = XmlUtils.createPbundleEleWithName(doc, this.getDataTypeName());
+        if (!this.getPurposes().isEmpty()) {
+            dataTypeEle.appendChild(
+                    XmlUtils.createOdArray(
+                            doc,
+                            XmlUtils.OD_TAG_INT_ARRAY,
+                            XmlUtils.OD_NAME_PURPOSES,
+                            this.getPurposes().stream()
+                                    .map(p -> String.valueOf(p.getValue()))
+                                    .toList()));
+        }
+
+        maybeAddBoolToOdElement(
+                doc,
+                dataTypeEle,
+                this.getIsCollectionOptional(),
+                XmlUtils.OD_NAME_IS_COLLECTION_OPTIONAL);
+        maybeAddBoolToOdElement(
+                doc,
+                dataTypeEle,
+                this.getIsSharingOptional(),
+                XmlUtils.OD_NAME_IS_SHARING_OPTIONAL);
+        maybeAddBoolToOdElement(doc, dataTypeEle, this.getEphemeral(), XmlUtils.OD_NAME_EPHEMERAL);
+        return XmlUtils.listOf(dataTypeEle);
+    }
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    @Override
+    public List<Element> toHrDomElements(Document doc) {
+        return List.of();
+    }
+
+    private static void maybeAddBoolToOdElement(
+            Document doc, Element parentEle, Boolean b, String odName) {
+        if (b == null) {
+            return;
+        }
+        Element ele = XmlUtils.createOdBooleanEle(doc, odName, b);
+        parentEle.appendChild(ele);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataTypeFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataTypeFactory.java
new file mode 100644
index 0000000..488c259
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataTypeFactory.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.asllib.marshallable;
+
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Element;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class DataTypeFactory implements AslMarshallableFactory<DataType> {
+    /** Creates a {@link DataType} from the human-readable DOM element. */
+    @Override
+    public DataType createFromHrElements(List<Element> elements) throws MalformedXmlException {
+        Element hrDataTypeEle = XmlUtils.getSingleElement(elements);
+        String dataTypeName = hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_DATA_TYPE);
+        List<DataType.Purpose> purposes =
+                XmlUtils.getPipelineSplitAttr(hrDataTypeEle, XmlUtils.HR_ATTR_PURPOSES, true)
+                        .stream()
+                        .map(DataType.Purpose::forString)
+                        .collect(Collectors.toList());
+        if (purposes.isEmpty()) {
+            throw new MalformedXmlException(String.format("Found no purpose in: %s", dataTypeName));
+        }
+        if (new HashSet<>(purposes).size() != purposes.size()) {
+            throw new MalformedXmlException(
+                    String.format("Found non-unique purposes in: %s", dataTypeName));
+        }
+        Boolean isCollectionOptional =
+                XmlUtils.getBoolAttr(hrDataTypeEle, XmlUtils.HR_ATTR_IS_COLLECTION_OPTIONAL, false);
+        Boolean isSharingOptional =
+                XmlUtils.getBoolAttr(hrDataTypeEle, XmlUtils.HR_ATTR_IS_SHARING_OPTIONAL, false);
+        Boolean ephemeral = XmlUtils.getBoolAttr(hrDataTypeEle, XmlUtils.HR_ATTR_EPHEMERAL, false);
+        return new DataType(
+                dataTypeName, purposes, isCollectionOptional, isSharingOptional, ephemeral);
+    }
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    @Override
+    public DataType createFromOdElements(List<Element> elements) throws MalformedXmlException {
+        Element odDataTypeEle = XmlUtils.getSingleElement(elements);
+        String dataTypeName = odDataTypeEle.getAttribute(XmlUtils.OD_ATTR_NAME);
+        List<Integer> purposeInts =
+                XmlUtils.getOdIntArray(odDataTypeEle, XmlUtils.OD_NAME_PURPOSES, true);
+        List<DataType.Purpose> purposes =
+                purposeInts.stream().map(DataType.Purpose::forValue).collect(Collectors.toList());
+        if (purposes.isEmpty()) {
+            throw new MalformedXmlException(String.format("Found no purpose in: %s", dataTypeName));
+        }
+        if (new HashSet<>(purposes).size() != purposes.size()) {
+            throw new MalformedXmlException(
+                    String.format("Found non-unique purposes in: %s", dataTypeName));
+        }
+        Boolean isCollectionOptional =
+                XmlUtils.getOdBoolEle(
+                        odDataTypeEle, XmlUtils.OD_NAME_IS_COLLECTION_OPTIONAL, false);
+        Boolean isSharingOptional =
+                XmlUtils.getOdBoolEle(odDataTypeEle, XmlUtils.OD_NAME_IS_SHARING_OPTIONAL, false);
+        Boolean ephemeral = XmlUtils.getOdBoolEle(odDataTypeEle, XmlUtils.OD_NAME_EPHEMERAL, false);
+
+        return new DataType(
+                dataTypeName, purposes, isCollectionOptional, isSharingOptional, ephemeral);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfo.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfo.java
new file mode 100644
index 0000000..efdc8d0
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfo.java
@@ -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.asllib.marshallable;
+
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+/** DeveloperInfo representation */
+public class DeveloperInfo implements AslMarshallable {
+    public enum DeveloperRelationship {
+        OEM(0),
+        ODM(1),
+        SOC(2),
+        OTA(3),
+        CARRIER(4),
+        AOSP(5),
+        OTHER(6);
+
+        private final int mValue;
+
+        DeveloperRelationship(int value) {
+            this.mValue = value;
+        }
+
+        /** Get the int value associated with the DeveloperRelationship. */
+        public int getValue() {
+            return mValue;
+        }
+
+        /** Get the DeveloperRelationship associated with the int value. */
+        public static DeveloperInfo.DeveloperRelationship forValue(int value) {
+            for (DeveloperInfo.DeveloperRelationship e : values()) {
+                if (e.getValue() == value) {
+                    return e;
+                }
+            }
+            throw new IllegalArgumentException("No DeveloperRelationship enum for value: " + value);
+        }
+
+        /** Get the DeveloperRelationship associated with the human-readable String. */
+        public static DeveloperInfo.DeveloperRelationship forString(String s) {
+            for (DeveloperInfo.DeveloperRelationship e : values()) {
+                if (e.toString().equals(s)) {
+                    return e;
+                }
+            }
+            throw new IllegalArgumentException("No DeveloperRelationship enum for str: " + s);
+        }
+
+        /** Human-readable String representation of DeveloperRelationship. */
+        public String toString() {
+            return this.name().toLowerCase();
+        }
+    }
+
+    private final String mName;
+    private final String mEmail;
+    private final String mAddress;
+    private final String mCountryRegion;
+    private final DeveloperRelationship mDeveloperRelationship;
+    private final String mWebsite;
+    private final String mAppDeveloperRegistryId;
+
+    public DeveloperInfo(
+            String name,
+            String email,
+            String address,
+            String countryRegion,
+            DeveloperRelationship developerRelationship,
+            String website,
+            String appDeveloperRegistryId) {
+        this.mName = name;
+        this.mEmail = email;
+        this.mAddress = address;
+        this.mCountryRegion = countryRegion;
+        this.mDeveloperRelationship = developerRelationship;
+        this.mWebsite = website;
+        this.mAppDeveloperRegistryId = appDeveloperRegistryId;
+    }
+
+    /** Creates an on-device DOM element from the {@link SafetyLabels}. */
+    @Override
+    public List<Element> toOdDomElements(Document doc) {
+        Element developerInfoEle =
+                XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_DEVELOPER_INFO);
+        if (mName != null) {
+            developerInfoEle.appendChild(
+                    XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_NAME, mName));
+        }
+        if (mEmail != null) {
+            developerInfoEle.appendChild(
+                    XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_EMAIL, mEmail));
+        }
+        if (mAddress != null) {
+            developerInfoEle.appendChild(
+                    XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_ADDRESS, mAddress));
+        }
+        if (mCountryRegion != null) {
+            developerInfoEle.appendChild(
+                    XmlUtils.createOdStringEle(
+                            doc, XmlUtils.OD_NAME_COUNTRY_REGION, mCountryRegion));
+        }
+        if (mDeveloperRelationship != null) {
+            developerInfoEle.appendChild(
+                    XmlUtils.createOdLongEle(
+                            doc,
+                            XmlUtils.OD_NAME_DEVELOPER_RELATIONSHIP,
+                            mDeveloperRelationship.getValue()));
+        }
+        if (mWebsite != null) {
+            developerInfoEle.appendChild(
+                    XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_WEBSITE, mWebsite));
+        }
+        if (mAppDeveloperRegistryId != null) {
+            developerInfoEle.appendChild(
+                    XmlUtils.createOdStringEle(
+                            doc,
+                            XmlUtils.OD_NAME_APP_DEVELOPER_REGISTRY_ID,
+                            mAppDeveloperRegistryId));
+        }
+
+        return XmlUtils.listOf(developerInfoEle);
+    }
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    @Override
+    public List<Element> toHrDomElements(Document doc) {
+        return List.of();
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfoFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfoFactory.java
new file mode 100644
index 0000000..c3e7ac3
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfoFactory.java
@@ -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.asllib.marshallable;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class DeveloperInfoFactory implements AslMarshallableFactory<DeveloperInfo> {
+
+    /** Creates a {@link DeveloperInfo} from the human-readable DOM element. */
+    @Override
+    public DeveloperInfo createFromHrElements(List<Element> elements) throws MalformedXmlException {
+        Element developerInfoEle = XmlUtils.getSingleElement(elements);
+        if (developerInfoEle == null) {
+            AslgenUtil.logI("No DeveloperInfo found in hr format.");
+            return null;
+        }
+        String name = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_NAME);
+        String email = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_EMAIL);
+        String address = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_ADDRESS);
+        String countryRegion =
+                XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_COUNTRY_REGION);
+        DeveloperInfo.DeveloperRelationship developerRelationship =
+                DeveloperInfo.DeveloperRelationship.forString(
+                        XmlUtils.getStringAttr(
+                                developerInfoEle, XmlUtils.HR_ATTR_DEVELOPER_RELATIONSHIP));
+        String website = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_WEBSITE, false);
+        String appDeveloperRegistryId =
+                XmlUtils.getStringAttr(
+                        developerInfoEle, XmlUtils.HR_ATTR_APP_DEVELOPER_REGISTRY_ID, false);
+
+        return new DeveloperInfo(
+                name,
+                email,
+                address,
+                countryRegion,
+                developerRelationship,
+                website,
+                appDeveloperRegistryId);
+    }
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    @Override
+    public DeveloperInfo createFromOdElements(List<Element> elements) throws MalformedXmlException {
+        return null;
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabels.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabels.java
new file mode 100644
index 0000000..576820d
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabels.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 com.android.asllib.marshallable;
+
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+/** Safety Label representation containing zero or more {@link DataCategory} for data shared */
+public class SafetyLabels implements AslMarshallable {
+
+    private final Long mVersion;
+    private final DataLabels mDataLabels;
+    private final SecurityLabels mSecurityLabels;
+    private final ThirdPartyVerification mThirdPartyVerification;
+
+    public SafetyLabels(
+            Long version,
+            DataLabels dataLabels,
+            SecurityLabels securityLabels,
+            ThirdPartyVerification thirdPartyVerification) {
+        this.mVersion = version;
+        this.mDataLabels = dataLabels;
+        this.mSecurityLabels = securityLabels;
+        this.mThirdPartyVerification = thirdPartyVerification;
+    }
+
+    /** Returns the data label for the safety label */
+    public DataLabels getDataLabel() {
+        return mDataLabels;
+    }
+
+    /** Gets the version of the {@link SafetyLabels}. */
+    public Long getVersion() {
+        return mVersion;
+    }
+
+    /** Creates an on-device DOM element from the {@link SafetyLabels}. */
+    @Override
+    public List<Element> toOdDomElements(Document doc) {
+        Element safetyLabelsEle =
+                XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_SAFETY_LABELS);
+        safetyLabelsEle.appendChild(
+                XmlUtils.createOdLongEle(doc, XmlUtils.OD_NAME_VERSION, mVersion));
+        if (mDataLabels != null) {
+            XmlUtils.appendChildren(safetyLabelsEle, mDataLabels.toOdDomElements(doc));
+        }
+        if (mSecurityLabels != null) {
+            XmlUtils.appendChildren(safetyLabelsEle, mSecurityLabels.toOdDomElements(doc));
+        }
+        if (mThirdPartyVerification != null) {
+            XmlUtils.appendChildren(safetyLabelsEle, mThirdPartyVerification.toOdDomElements(doc));
+        }
+        return XmlUtils.listOf(safetyLabelsEle);
+    }
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    @Override
+    public List<Element> toHrDomElements(Document doc) {
+        return List.of();
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabelsFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabelsFactory.java
new file mode 100644
index 0000000..7e1838f
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabelsFactory.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.asllib.marshallable;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class SafetyLabelsFactory implements AslMarshallableFactory<SafetyLabels> {
+
+    /** Creates a {@link SafetyLabels} from the human-readable DOM element. */
+    @Override
+    public SafetyLabels createFromHrElements(List<Element> elements) throws MalformedXmlException {
+        Element safetyLabelsEle = XmlUtils.getSingleElement(elements);
+        if (safetyLabelsEle == null) {
+            AslgenUtil.logI("No SafetyLabels found in hr format.");
+            return null;
+        }
+        long version = XmlUtils.tryGetVersion(safetyLabelsEle);
+
+        DataLabels dataLabels =
+                new DataLabelsFactory()
+                        .createFromHrElements(
+                                XmlUtils.listOf(
+                                        XmlUtils.getSingleChildElement(
+                                                safetyLabelsEle,
+                                                XmlUtils.HR_TAG_DATA_LABELS,
+                                                false)));
+        SecurityLabels securityLabels =
+                new SecurityLabelsFactory()
+                        .createFromHrElements(
+                                XmlUtils.listOf(
+                                        XmlUtils.getSingleChildElement(
+                                                safetyLabelsEle,
+                                                XmlUtils.HR_TAG_SECURITY_LABELS,
+                                                false)));
+        ThirdPartyVerification thirdPartyVerification =
+                new ThirdPartyVerificationFactory()
+                        .createFromHrElements(
+                                XmlUtils.listOf(
+                                        XmlUtils.getSingleChildElement(
+                                                safetyLabelsEle,
+                                                XmlUtils.HR_TAG_THIRD_PARTY_VERIFICATION,
+                                                false)));
+        return new SafetyLabels(version, dataLabels, securityLabels, thirdPartyVerification);
+    }
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    @Override
+    public SafetyLabels createFromOdElements(List<Element> elements) throws MalformedXmlException {
+        return null;
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabels.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabels.java
new file mode 100644
index 0000000..437343b
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabels.java
@@ -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.asllib.marshallable;
+
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+/** Security Labels representation */
+public class SecurityLabels implements AslMarshallable {
+
+    private final Boolean mIsDataDeletable;
+    private final Boolean mIsDataEncrypted;
+
+    public SecurityLabels(Boolean isDataDeletable, Boolean isDataEncrypted) {
+        this.mIsDataDeletable = isDataDeletable;
+        this.mIsDataEncrypted = isDataEncrypted;
+    }
+
+    /** Creates an on-device DOM element from the {@link SecurityLabels}. */
+    @Override
+    public List<Element> toOdDomElements(Document doc) {
+        Element ele = XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_SECURITY_LABELS);
+        if (mIsDataDeletable != null) {
+            ele.appendChild(
+                    XmlUtils.createOdBooleanEle(
+                            doc, XmlUtils.OD_NAME_IS_DATA_DELETABLE, mIsDataDeletable));
+        }
+        if (mIsDataEncrypted != null) {
+            ele.appendChild(
+                    XmlUtils.createOdBooleanEle(
+                            doc, XmlUtils.OD_NAME_IS_DATA_ENCRYPTED, mIsDataEncrypted));
+        }
+        return XmlUtils.listOf(ele);
+    }
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    @Override
+    public List<Element> toHrDomElements(Document doc) {
+        return List.of();
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabelsFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabelsFactory.java
new file mode 100644
index 0000000..9dc4712c
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabelsFactory.java
@@ -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.asllib.marshallable;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class SecurityLabelsFactory implements AslMarshallableFactory<SecurityLabels> {
+
+    /** Creates a {@link SecurityLabels} from the human-readable DOM element. */
+    @Override
+    public SecurityLabels createFromHrElements(List<Element> elements)
+            throws MalformedXmlException {
+        Element ele = XmlUtils.getSingleElement(elements);
+        if (ele == null) {
+            AslgenUtil.logI("No SecurityLabels found in hr format.");
+            return null;
+        }
+        Boolean isDataDeletable =
+                XmlUtils.getBoolAttr(ele, XmlUtils.HR_ATTR_IS_DATA_DELETABLE, false);
+        Boolean isDataEncrypted =
+                XmlUtils.getBoolAttr(ele, XmlUtils.HR_ATTR_IS_DATA_ENCRYPTED, false);
+        return new SecurityLabels(isDataDeletable, isDataEncrypted);
+    }
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    @Override
+    public SecurityLabels createFromOdElements(List<Element> elements)
+            throws MalformedXmlException {
+        return null;
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java
new file mode 100644
index 0000000..f0ecf93
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java
@@ -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.asllib.marshallable;
+
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+/** Safety Label representation containing zero or more {@link DataCategory} for data shared */
+public class SystemAppSafetyLabel implements AslMarshallable {
+
+    private final String mUrl;
+
+    public SystemAppSafetyLabel(String url) {
+        this.mUrl = url;
+    }
+
+    /** Returns the system app safety label URL. */
+    public String getUrl() {
+        return mUrl;
+    }
+
+    /** Creates an on-device DOM element from the {@link SystemAppSafetyLabel}. */
+    @Override
+    public List<Element> toOdDomElements(Document doc) {
+        Element systemAppSafetyLabelEle =
+                XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_SYSTEM_APP_SAFETY_LABEL);
+        systemAppSafetyLabelEle.appendChild(
+                XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_URL, mUrl));
+        return XmlUtils.listOf(systemAppSafetyLabelEle);
+    }
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    @Override
+    public List<Element> toHrDomElements(Document doc) {
+        return List.of();
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java
new file mode 100644
index 0000000..5b7fe32
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java
@@ -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.asllib.marshallable;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class SystemAppSafetyLabelFactory implements AslMarshallableFactory<SystemAppSafetyLabel> {
+
+    /** Creates a {@link SystemAppSafetyLabel} from the human-readable DOM element. */
+    @Override
+    public SystemAppSafetyLabel createFromHrElements(List<Element> elements)
+            throws MalformedXmlException {
+        Element systemAppSafetyLabelEle = XmlUtils.getSingleElement(elements);
+        if (systemAppSafetyLabelEle == null) {
+            AslgenUtil.logI("No SystemAppSafetyLabel found in hr format.");
+            return null;
+        }
+
+        String url = XmlUtils.getStringAttr(systemAppSafetyLabelEle, XmlUtils.HR_ATTR_URL);
+        return new SystemAppSafetyLabel(url);
+    }
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    @Override
+    public SystemAppSafetyLabel createFromOdElements(List<Element> elements)
+            throws MalformedXmlException {
+        return null;
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerification.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerification.java
new file mode 100644
index 0000000..229b002
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerification.java
@@ -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.asllib.marshallable;
+
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+/** ThirdPartyVerification representation. */
+public class ThirdPartyVerification implements AslMarshallable {
+
+    private final String mUrl;
+
+    public ThirdPartyVerification(String url) {
+        this.mUrl = url;
+    }
+
+    /** Creates an on-device DOM element from the {@link ThirdPartyVerification}. */
+    @Override
+    public List<Element> toOdDomElements(Document doc) {
+        Element ele =
+                XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_THIRD_PARTY_VERIFICATION);
+        ele.appendChild(XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_URL, mUrl));
+        return XmlUtils.listOf(ele);
+    }
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    @Override
+    public List<Element> toHrDomElements(Document doc) {
+        return List.of();
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerificationFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerificationFactory.java
new file mode 100644
index 0000000..ac4d383
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerificationFactory.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.asllib.marshallable;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class ThirdPartyVerificationFactory
+        implements AslMarshallableFactory<ThirdPartyVerification> {
+
+    /** Creates a {@link ThirdPartyVerification} from the human-readable DOM element. */
+    @Override
+    public ThirdPartyVerification createFromHrElements(List<Element> elements)
+            throws MalformedXmlException {
+        Element ele = XmlUtils.getSingleElement(elements);
+        if (ele == null) {
+            AslgenUtil.logI("No ThirdPartyVerification found in hr format.");
+            return null;
+        }
+
+        String url = XmlUtils.getStringAttr(ele, XmlUtils.HR_ATTR_URL);
+        return new ThirdPartyVerification(url);
+    }
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    @Override
+    public ThirdPartyVerification createFromOdElements(List<Element> elements)
+            throws MalformedXmlException {
+        return null;
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfo.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfo.java
new file mode 100644
index 0000000..ce7ef16
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfo.java
@@ -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.asllib.marshallable;
+
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+/** TransparencyInfo representation containing {@link DeveloperInfo} and {@link AppInfo} */
+public class TransparencyInfo implements AslMarshallable {
+
+    private final DeveloperInfo mDeveloperInfo;
+    private final AppInfo mAppInfo;
+
+    public TransparencyInfo(DeveloperInfo developerInfo, AppInfo appInfo) {
+        this.mDeveloperInfo = developerInfo;
+        this.mAppInfo = appInfo;
+    }
+
+    /** Gets the {@link DeveloperInfo} of the {@link TransparencyInfo}. */
+    public DeveloperInfo getDeveloperInfo() {
+        return mDeveloperInfo;
+    }
+
+    /** Gets the {@link AppInfo} of the {@link TransparencyInfo}. */
+    public AppInfo getAppInfo() {
+        return mAppInfo;
+    }
+
+    /** Creates an on-device DOM element from the {@link TransparencyInfo}. */
+    @Override
+    public List<Element> toOdDomElements(Document doc) {
+        Element transparencyInfoEle =
+                XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_TRANSPARENCY_INFO);
+        if (mDeveloperInfo != null) {
+            XmlUtils.appendChildren(transparencyInfoEle, mDeveloperInfo.toOdDomElements(doc));
+        }
+        if (mAppInfo != null) {
+            XmlUtils.appendChildren(transparencyInfoEle, mAppInfo.toOdDomElements(doc));
+        }
+        return XmlUtils.listOf(transparencyInfoEle);
+    }
+
+    /** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
+    @Override
+    public List<Element> toHrDomElements(Document doc) {
+        return List.of();
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfoFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfoFactory.java
new file mode 100644
index 0000000..123de01
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfoFactory.java
@@ -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.asllib.marshallable;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class TransparencyInfoFactory implements AslMarshallableFactory<TransparencyInfo> {
+
+    /** Creates a {@link TransparencyInfo} from the human-readable DOM element. */
+    @Override
+    public TransparencyInfo createFromHrElements(List<Element> elements)
+            throws MalformedXmlException {
+        Element transparencyInfoEle = XmlUtils.getSingleElement(elements);
+        if (transparencyInfoEle == null) {
+            AslgenUtil.logI("No TransparencyInfo found in hr format.");
+            return null;
+        }
+
+        Element developerInfoEle =
+                XmlUtils.getSingleChildElement(
+                        transparencyInfoEle, XmlUtils.HR_TAG_DEVELOPER_INFO, false);
+        DeveloperInfo developerInfo =
+                new DeveloperInfoFactory().createFromHrElements(XmlUtils.listOf(developerInfoEle));
+
+        Element appInfoEle =
+                XmlUtils.getSingleChildElement(
+                        transparencyInfoEle, XmlUtils.HR_TAG_APP_INFO, false);
+        AppInfo appInfo = new AppInfoFactory().createFromHrElements(XmlUtils.listOf(appInfoEle));
+
+        return new TransparencyInfo(developerInfo, appInfo);
+    }
+
+    /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+    @Override
+    public TransparencyInfo createFromOdElements(List<Element> elements)
+            throws MalformedXmlException {
+        return null;
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/AslgenUtil.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/AslgenUtil.java
new file mode 100644
index 0000000..7d54215
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/AslgenUtil.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.asllib.util;
+
+public class AslgenUtil {
+    private static final String ASLGEN_TAG = "ASLGEN";
+
+    /** Log info. */
+    public static void logI(String s) {
+        System.out.println(String.format("%s -- INFO: %s", ASLGEN_TAG, s));
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/DataCategoryConstants.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/DataCategoryConstants.java
new file mode 100644
index 0000000..b5ae54c
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/DataCategoryConstants.java
@@ -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.asllib.util;
+
+import com.android.asllib.marshallable.DataCategory;
+import com.android.asllib.marshallable.DataType;
+import com.android.asllib.marshallable.SafetyLabels;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Constants for determining valid {@link String} data types for usage within {@link SafetyLabels},
+ * {@link DataCategory}, and {@link DataType}
+ */
+public class DataCategoryConstants {
+
+    public static final String CATEGORY_PERSONAL = "personal";
+    public static final String CATEGORY_FINANCIAL = "financial";
+    public static final String CATEGORY_LOCATION = "location";
+    public static final String CATEGORY_EMAIL_TEXT_MESSAGE = "email_text_message";
+    public static final String CATEGORY_PHOTO_VIDEO = "photo_video";
+    public static final String CATEGORY_AUDIO = "audio";
+    public static final String CATEGORY_STORAGE = "storage";
+    public static final String CATEGORY_HEALTH_FITNESS = "health_fitness";
+    public static final String CATEGORY_CONTACTS = "contacts";
+    public static final String CATEGORY_CALENDAR = "calendar";
+    public static final String CATEGORY_IDENTIFIERS = "identifiers";
+    public static final String CATEGORY_APP_PERFORMANCE = "app_performance";
+    public static final String CATEGORY_ACTIONS_IN_APP = "actions_in_app";
+    public static final String CATEGORY_SEARCH_AND_BROWSING = "search_and_browsing";
+
+    /** Set of valid categories */
+    public static final Set<String> VALID_CATEGORIES =
+            Collections.unmodifiableSet(
+                    new HashSet<>(
+                            Arrays.asList(
+                                    CATEGORY_PERSONAL,
+                                    CATEGORY_FINANCIAL,
+                                    CATEGORY_LOCATION,
+                                    CATEGORY_EMAIL_TEXT_MESSAGE,
+                                    CATEGORY_PHOTO_VIDEO,
+                                    CATEGORY_AUDIO,
+                                    CATEGORY_STORAGE,
+                                    CATEGORY_HEALTH_FITNESS,
+                                    CATEGORY_CONTACTS,
+                                    CATEGORY_CALENDAR,
+                                    CATEGORY_IDENTIFIERS,
+                                    CATEGORY_APP_PERFORMANCE,
+                                    CATEGORY_ACTIONS_IN_APP,
+                                    CATEGORY_SEARCH_AND_BROWSING)));
+
+    /** Returns {@link Set} of valid {@link String} category keys */
+    public static Set<String> getValidDataCategories() {
+        return VALID_CATEGORIES;
+    }
+
+    private DataCategoryConstants() {
+        /* do nothing - hide constructor */
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/DataTypeConstants.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/DataTypeConstants.java
new file mode 100644
index 0000000..358d575
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/DataTypeConstants.java
@@ -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.asllib.util;
+
+import com.android.asllib.marshallable.DataCategory;
+import com.android.asllib.marshallable.DataType;
+import com.android.asllib.marshallable.SafetyLabels;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Constants for determining valid {@link String} data types for usage within {@link SafetyLabels},
+ * {@link DataCategory}, and {@link DataType}
+ */
+public class DataTypeConstants {
+    /** Data types for {@link DataCategoryConstants.CATEGORY_PERSONAL} */
+    public static final String TYPE_NAME = "name";
+
+    public static final String TYPE_EMAIL_ADDRESS = "email_address";
+    public static final String TYPE_PHYSICAL_ADDRESS = "physical_address";
+    public static final String TYPE_PHONE_NUMBER = "phone_number";
+    public static final String TYPE_RACE_ETHNICITY = "race_ethnicity";
+    public static final String TYPE_POLITICAL_OR_RELIGIOUS_BELIEFS =
+            "political_or_religious_beliefs";
+    public static final String TYPE_SEXUAL_ORIENTATION_OR_GENDER_IDENTITY =
+            "sexual_orientation_or_gender_identity";
+    public static final String TYPE_PERSONAL_IDENTIFIERS = "personal_identifiers";
+    public static final String TYPE_OTHER = "other";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_FINANCIAL} */
+    public static final String TYPE_CARD_BANK_ACCOUNT = "card_bank_account";
+
+    public static final String TYPE_PURCHASE_HISTORY = "purchase_history";
+    public static final String TYPE_CREDIT_SCORE = "credit_score";
+    public static final String TYPE_FINANCIAL_OTHER = "other";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_LOCATION} */
+    public static final String TYPE_APPROX_LOCATION = "approx_location";
+
+    public static final String TYPE_PRECISE_LOCATION = "precise_location";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_EMAIL_TEXT_MESSAGE} */
+    public static final String TYPE_EMAILS = "emails";
+
+    public static final String TYPE_TEXT_MESSAGES = "text_messages";
+    public static final String TYPE_EMAIL_TEXT_MESSAGE_OTHER = "other";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_PHOTO_VIDEO} */
+    public static final String TYPE_PHOTOS = "photos";
+
+    public static final String TYPE_VIDEOS = "videos";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_AUDIO} */
+    public static final String TYPE_SOUND_RECORDINGS = "sound_recordings";
+
+    public static final String TYPE_MUSIC_FILES = "music_files";
+    public static final String TYPE_AUDIO_OTHER = "other";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_STORAGE} */
+    public static final String TYPE_FILES_DOCS = "files_docs";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_HEALTH_FITNESS} */
+    public static final String TYPE_HEALTH = "health";
+
+    public static final String TYPE_FITNESS = "fitness";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_CONTACTS} */
+    public static final String TYPE_CONTACTS = "contacts";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_CALENDAR} */
+    public static final String TYPE_CALENDAR = "calendar";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_IDENTIFIERS} */
+    public static final String TYPE_IDENTIFIERS_OTHER = "other";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_APP_PERFORMANCE} */
+    public static final String TYPE_CRASH_LOGS = "crash_logs";
+
+    public static final String TYPE_PERFORMANCE_DIAGNOSTICS = "performance_diagnostics";
+    public static final String TYPE_APP_PERFORMANCE_OTHER = "other";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_ACTIONS_IN_APP} */
+    public static final String TYPE_USER_INTERACTION = "user_interaction";
+
+    public static final String TYPE_IN_APP_SEARCH_HISTORY = "in_app_search_history";
+    public static final String TYPE_INSTALLED_APPS = "installed_apps";
+    public static final String TYPE_USER_GENERATED_CONTENT = "user_generated_content";
+    public static final String TYPE_ACTIONS_IN_APP_OTHER = "other";
+
+    /** Data types for {@link DataCategoryConstants.CATEGORY_SEARCH_AND_BROWSING} */
+    public static final String TYPE_WEB_BROWSING_HISTORY = "web_browsing_history";
+
+    /** Set of valid categories */
+    private static final Map<String, Set<String>> VALID_DATA_TYPES =
+            new ImmutableMap.Builder<String, Set<String>>()
+                    .put(
+                            DataCategoryConstants.CATEGORY_PERSONAL,
+                            ImmutableSet.of(
+                                    DataTypeConstants.TYPE_NAME,
+                                    DataTypeConstants.TYPE_EMAIL_ADDRESS,
+                                    DataTypeConstants.TYPE_PHYSICAL_ADDRESS,
+                                    DataTypeConstants.TYPE_PHONE_NUMBER,
+                                    DataTypeConstants.TYPE_RACE_ETHNICITY,
+                                    DataTypeConstants.TYPE_POLITICAL_OR_RELIGIOUS_BELIEFS,
+                                    DataTypeConstants.TYPE_SEXUAL_ORIENTATION_OR_GENDER_IDENTITY,
+                                    DataTypeConstants.TYPE_PERSONAL_IDENTIFIERS,
+                                    DataTypeConstants.TYPE_OTHER))
+                    .put(
+                            DataCategoryConstants.CATEGORY_FINANCIAL,
+                            ImmutableSet.of(
+                                    DataTypeConstants.TYPE_CARD_BANK_ACCOUNT,
+                                    DataTypeConstants.TYPE_PURCHASE_HISTORY,
+                                    DataTypeConstants.TYPE_CREDIT_SCORE,
+                                    DataTypeConstants.TYPE_OTHER))
+                    .put(
+                            DataCategoryConstants.CATEGORY_LOCATION,
+                            ImmutableSet.of(
+                                    DataTypeConstants.TYPE_APPROX_LOCATION,
+                                    DataTypeConstants.TYPE_PRECISE_LOCATION))
+                    .put(
+                            DataCategoryConstants.CATEGORY_EMAIL_TEXT_MESSAGE,
+                            ImmutableSet.of(
+                                    DataTypeConstants.TYPE_EMAILS,
+                                    DataTypeConstants.TYPE_TEXT_MESSAGES,
+                                    DataTypeConstants.TYPE_OTHER))
+                    .put(
+                            DataCategoryConstants.CATEGORY_PHOTO_VIDEO,
+                            ImmutableSet.of(
+                                    DataTypeConstants.TYPE_PHOTOS, DataTypeConstants.TYPE_VIDEOS))
+                    .put(
+                            DataCategoryConstants.CATEGORY_AUDIO,
+                            ImmutableSet.of(
+                                    DataTypeConstants.TYPE_SOUND_RECORDINGS,
+                                    DataTypeConstants.TYPE_MUSIC_FILES,
+                                    DataTypeConstants.TYPE_OTHER))
+                    .put(
+                            DataCategoryConstants.CATEGORY_STORAGE,
+                            ImmutableSet.of(DataTypeConstants.TYPE_FILES_DOCS))
+                    .put(
+                            DataCategoryConstants.CATEGORY_HEALTH_FITNESS,
+                            ImmutableSet.of(
+                                    DataTypeConstants.TYPE_HEALTH, DataTypeConstants.TYPE_FITNESS))
+                    .put(
+                            DataCategoryConstants.CATEGORY_CONTACTS,
+                            ImmutableSet.of(DataTypeConstants.TYPE_CONTACTS))
+                    .put(
+                            DataCategoryConstants.CATEGORY_CALENDAR,
+                            ImmutableSet.of(DataTypeConstants.TYPE_CALENDAR))
+                    .put(
+                            DataCategoryConstants.CATEGORY_IDENTIFIERS,
+                            ImmutableSet.of(DataTypeConstants.TYPE_OTHER))
+                    .put(
+                            DataCategoryConstants.CATEGORY_APP_PERFORMANCE,
+                            ImmutableSet.of(
+                                    DataTypeConstants.TYPE_CRASH_LOGS,
+                                    DataTypeConstants.TYPE_PERFORMANCE_DIAGNOSTICS,
+                                    DataTypeConstants.TYPE_OTHER))
+                    .put(
+                            DataCategoryConstants.CATEGORY_ACTIONS_IN_APP,
+                            ImmutableSet.of(
+                                    DataTypeConstants.TYPE_USER_INTERACTION,
+                                    DataTypeConstants.TYPE_IN_APP_SEARCH_HISTORY,
+                                    DataTypeConstants.TYPE_INSTALLED_APPS,
+                                    DataTypeConstants.TYPE_USER_GENERATED_CONTENT,
+                                    DataTypeConstants.TYPE_OTHER))
+                    .put(
+                            DataCategoryConstants.CATEGORY_SEARCH_AND_BROWSING,
+                            ImmutableSet.of(DataTypeConstants.TYPE_WEB_BROWSING_HISTORY))
+                    .buildOrThrow();
+
+    /** Returns {@link Set} of valid {@link String} category keys */
+    public static Map<String, Set<String>> getValidDataTypes() {
+        return VALID_DATA_TYPES;
+    }
+
+    private DataTypeConstants() {
+        /* do nothing - hide constructor */
+    }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java
new file mode 100644
index 0000000..4f21b0c
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java
@@ -0,0 +1,400 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.asllib.util;
+
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class XmlUtils {
+    public static final String HR_TAG_APP_METADATA_BUNDLES = "app-metadata-bundles";
+    public static final String HR_TAG_SYSTEM_APP_SAFETY_LABEL = "system-app-safety-label";
+    public static final String HR_TAG_SAFETY_LABELS = "safety-labels";
+    public static final String HR_TAG_TRANSPARENCY_INFO = "transparency-info";
+    public static final String HR_TAG_DEVELOPER_INFO = "developer-info";
+    public static final String HR_TAG_APP_INFO = "app-info";
+    public static final String HR_TAG_DATA_LABELS = "data-labels";
+    public static final String HR_TAG_SECURITY_LABELS = "security-labels";
+    public static final String HR_TAG_THIRD_PARTY_VERIFICATION = "third-party-verification";
+    public static final String HR_TAG_DATA_ACCESSED = "data-accessed";
+    public static final String HR_TAG_DATA_COLLECTED = "data-collected";
+    public static final String HR_TAG_DATA_SHARED = "data-shared";
+    public static final String HR_ATTR_NAME = "name";
+    public static final String HR_ATTR_EMAIL = "email";
+    public static final String HR_ATTR_ADDRESS = "address";
+    public static final String HR_ATTR_COUNTRY_REGION = "countryRegion";
+    public static final String HR_ATTR_DEVELOPER_RELATIONSHIP = "relationship";
+    public static final String HR_ATTR_WEBSITE = "website";
+    public static final String HR_ATTR_APP_DEVELOPER_REGISTRY_ID = "registryId";
+    public static final String HR_ATTR_DATA_CATEGORY = "dataCategory";
+    public static final String HR_ATTR_DATA_TYPE = "dataType";
+    public static final String HR_ATTR_IS_COLLECTION_OPTIONAL = "isCollectionOptional";
+    public static final String HR_ATTR_IS_SHARING_OPTIONAL = "isSharingOptional";
+    public static final String HR_ATTR_IS_DATA_DELETABLE = "isDataDeletable";
+    public static final String HR_ATTR_IS_DATA_ENCRYPTED = "isDataEncrypted";
+    public static final String HR_ATTR_EPHEMERAL = "ephemeral";
+    public static final String HR_ATTR_PURPOSES = "purposes";
+    public static final String HR_ATTR_VERSION = "version";
+    public static final String HR_ATTR_URL = "url";
+    public static final String HR_ATTR_TITLE = "title";
+    public static final String HR_ATTR_DESCRIPTION = "description";
+    public static final String HR_ATTR_CONTAINS_ADS = "containsAds";
+    public static final String HR_ATTR_OBEY_APS = "obeyAps";
+    public static final String HR_ATTR_ADS_FINGERPRINTING = "adsFingerprinting";
+    public static final String HR_ATTR_SECURITY_FINGERPRINTING = "securityFingerprinting";
+    public static final String HR_ATTR_PRIVACY_POLICY = "privacyPolicy";
+    public static final String HR_ATTR_SECURITY_ENDPOINTS = "securityEndpoints";
+    public static final String HR_ATTR_FIRST_PARTY_ENDPOINTS = "firstPartyEndpoints";
+    public static final String HR_ATTR_SERVICE_PROVIDER_ENDPOINTS = "serviceProviderEndpoints";
+    public static final String HR_ATTR_CATEGORY = "category";
+
+    public static final String OD_TAG_BUNDLE = "bundle";
+    public static final String OD_TAG_PBUNDLE_AS_MAP = "pbundle_as_map";
+    public static final String OD_TAG_BOOLEAN = "boolean";
+    public static final String OD_TAG_LONG = "long";
+    public static final String OD_TAG_STRING = "string";
+    public static final String OD_TAG_INT_ARRAY = "int-array";
+    public static final String OD_TAG_STRING_ARRAY = "string-array";
+    public static final String OD_TAG_ITEM = "item";
+    public static final String OD_ATTR_NAME = "name";
+    public static final String OD_ATTR_VALUE = "value";
+    public static final String OD_ATTR_NUM = "num";
+    public static final String OD_NAME_SAFETY_LABELS = "safety_labels";
+    public static final String OD_NAME_TRANSPARENCY_INFO = "transparency_info";
+    public static final String OD_NAME_DEVELOPER_INFO = "developer_info";
+    public static final String OD_NAME_NAME = "name";
+    public static final String OD_NAME_EMAIL = "email";
+    public static final String OD_NAME_ADDRESS = "address";
+    public static final String OD_NAME_COUNTRY_REGION = "country_region";
+    public static final String OD_NAME_DEVELOPER_RELATIONSHIP = "relationship";
+    public static final String OD_NAME_WEBSITE = "website";
+    public static final String OD_NAME_APP_DEVELOPER_REGISTRY_ID = "app_developer_registry_id";
+    public static final String OD_NAME_APP_INFO = "app_info";
+    public static final String OD_NAME_TITLE = "title";
+    public static final String OD_NAME_DESCRIPTION = "description";
+    public static final String OD_NAME_CONTAINS_ADS = "contains_ads";
+    public static final String OD_NAME_OBEY_APS = "obey_aps";
+    public static final String OD_NAME_ADS_FINGERPRINTING = "ads_fingerprinting";
+    public static final String OD_NAME_SECURITY_FINGERPRINTING = "security_fingerprinting";
+    public static final String OD_NAME_PRIVACY_POLICY = "privacy_policy";
+    public static final String OD_NAME_SECURITY_ENDPOINT = "security_endpoint";
+    public static final String OD_NAME_FIRST_PARTY_ENDPOINT = "first_party_endpoint";
+    public static final String OD_NAME_SERVICE_PROVIDER_ENDPOINT = "service_provider_endpoint";
+    public static final String OD_NAME_CATEGORY = "category";
+    public static final String OD_NAME_VERSION = "version";
+    public static final String OD_NAME_URL = "url";
+    public static final String OD_NAME_SYSTEM_APP_SAFETY_LABEL = "system_app_safety_label";
+    public static final String OD_NAME_SECURITY_LABELS = "security_labels";
+    public static final String OD_NAME_THIRD_PARTY_VERIFICATION = "third_party_verification";
+    public static final String OD_NAME_DATA_LABELS = "data_labels";
+    public static final String OD_NAME_DATA_ACCESSED = "data_accessed";
+    public static final String OD_NAME_DATA_COLLECTED = "data_collected";
+    public static final String OD_NAME_DATA_SHARED = "data_shared";
+    public static final String OD_NAME_PURPOSES = "purposes";
+    public static final String OD_NAME_IS_COLLECTION_OPTIONAL = "is_collection_optional";
+    public static final String OD_NAME_IS_SHARING_OPTIONAL = "is_sharing_optional";
+    public static final String OD_NAME_IS_DATA_DELETABLE = "is_data_deletable";
+    public static final String OD_NAME_IS_DATA_ENCRYPTED = "is_data_encrypted";
+    public static final String OD_NAME_EPHEMERAL = "ephemeral";
+
+    public static final String TRUE_STR = "true";
+    public static final String FALSE_STR = "false";
+
+    /** Gets the top-level children with the tag name.. */
+    public static List<Element> getChildrenByTagName(Node parentEle, String tagName) {
+        var elements = XmlUtils.asElementList(parentEle.getChildNodes());
+        return elements.stream().filter(e -> e.getTagName().equals(tagName)).toList();
+    }
+
+    /**
+     * Gets the single {@link Element} within {@param parentEle} and having the {@param tagName}.
+     */
+    public static Element getSingleChildElement(Node parentEle, String tagName, boolean required)
+            throws MalformedXmlException {
+        String parentTagNameForErrorMsg =
+                (parentEle instanceof Element) ? ((Element) parentEle).getTagName() : "Node";
+        var elements = getChildrenByTagName(parentEle, tagName);
+
+        if (elements.size() > 1) {
+            throw new MalformedXmlException(
+                    String.format(
+                            "Expected 1 %s in %s but got %s.",
+                            tagName, parentTagNameForErrorMsg, elements.size()));
+        } else if (elements.isEmpty()) {
+            if (required) {
+                throw new MalformedXmlException(
+                        String.format(
+                                "Expected 1 %s in %s but got 0.",
+                                tagName, parentTagNameForErrorMsg));
+            } else {
+                return null;
+            }
+        }
+        return elements.get(0);
+    }
+
+    /** Gets the single {@link Element} within {@param elements}. */
+    public static Element getSingleElement(List<Element> elements) {
+        if (elements.size() != 1) {
+            throw new IllegalStateException(
+                    String.format("Expected 1 element in list but got %s.", elements.size()));
+        }
+        return elements.get(0);
+    }
+
+    /** Converts {@param nodeList} into List of {@link Element}. */
+    public static List<Element> asElementList(NodeList nodeList) {
+        List<Element> elementList = new ArrayList<Element>();
+        for (int i = 0; i < nodeList.getLength(); i++) {
+            var elementAsNode = nodeList.item(i);
+            if (elementAsNode instanceof Element) {
+                elementList.add(((Element) elementAsNode));
+            }
+        }
+        return elementList;
+    }
+
+    /** Appends {@param children} to the {@param ele}. */
+    public static void appendChildren(Element ele, List<Element> children) {
+        for (Element c : children) {
+            ele.appendChild(c);
+        }
+    }
+
+    /** Gets the Boolean from the String value. */
+    private static Boolean fromString(String s) {
+        if (s == null) {
+            return null;
+        }
+        if (s.equals(TRUE_STR)) {
+            return true;
+        } else if (s.equals(FALSE_STR)) {
+            return false;
+        }
+        return null;
+    }
+
+    /** Creates an on-device PBundle DOM Element with the given attribute name. */
+    public static Element createPbundleEleWithName(Document doc, String name) {
+        var ele = doc.createElement(XmlUtils.OD_TAG_PBUNDLE_AS_MAP);
+        ele.setAttribute(XmlUtils.OD_ATTR_NAME, name);
+        return ele;
+    }
+
+    /** Create an on-device Boolean DOM Element with the given attribute name. */
+    public static Element createOdBooleanEle(Document doc, String name, boolean b) {
+        var ele = doc.createElement(XmlUtils.OD_TAG_BOOLEAN);
+        ele.setAttribute(XmlUtils.OD_ATTR_NAME, name);
+        ele.setAttribute(XmlUtils.OD_ATTR_VALUE, String.valueOf(b));
+        return ele;
+    }
+
+    /** Sets human-readable bool attribute if non-null. */
+    public static void maybeSetHrBoolAttr(Element ele, String attrName, Boolean b) {
+        if (b != null) {
+            ele.setAttribute(attrName, String.valueOf(b));
+        }
+    }
+
+    /** Create an on-device Long DOM Element with the given attribute name. */
+    public static Element createOdLongEle(Document doc, String name, long l) {
+        var ele = doc.createElement(XmlUtils.OD_TAG_LONG);
+        ele.setAttribute(XmlUtils.OD_ATTR_NAME, name);
+        ele.setAttribute(XmlUtils.OD_ATTR_VALUE, String.valueOf(l));
+        return ele;
+    }
+
+    /** Create an on-device Long DOM Element with the given attribute name. */
+    public static Element createOdStringEle(Document doc, String name, String val) {
+        var ele = doc.createElement(XmlUtils.OD_TAG_STRING);
+        ele.setAttribute(XmlUtils.OD_ATTR_NAME, name);
+        ele.setAttribute(XmlUtils.OD_ATTR_VALUE, val);
+        return ele;
+    }
+
+    /** Create OD style array DOM Element, which can represent any time but is stored as Strings. */
+    public static Element createOdArray(
+            Document doc, String arrayTag, String arrayName, List<String> arrayVals) {
+        Element arrEle = doc.createElement(arrayTag);
+        arrEle.setAttribute(XmlUtils.OD_ATTR_NAME, arrayName);
+        arrEle.setAttribute(XmlUtils.OD_ATTR_NUM, String.valueOf(arrayVals.size()));
+        for (String s : arrayVals) {
+            Element itemEle = doc.createElement(XmlUtils.OD_TAG_ITEM);
+            itemEle.setAttribute(XmlUtils.OD_ATTR_VALUE, s);
+            arrEle.appendChild(itemEle);
+        }
+        return arrEle;
+    }
+
+    /** Returns whether the String is null or empty. */
+    public static boolean isNullOrEmpty(String s) {
+        return s == null || s.isEmpty();
+    }
+
+    /** Tries getting required version attribute and throws exception if it doesn't exist */
+    public static Long tryGetVersion(Element ele) throws MalformedXmlException {
+        long version;
+        try {
+            version = Long.parseLong(ele.getAttribute(XmlUtils.HR_ATTR_VERSION));
+        } catch (Exception e) {
+            throw new MalformedXmlException(
+                    String.format(
+                            "Malformed or missing required version in: %s", ele.getTagName()));
+        }
+        return version;
+    }
+
+    /** Gets a pipeline-split attribute. */
+    public static List<String> getPipelineSplitAttr(Element ele, String attrName, boolean required)
+            throws MalformedXmlException {
+        List<String> list = Arrays.stream(ele.getAttribute(attrName).split("\\|")).toList();
+        if ((list.isEmpty() || list.get(0).isEmpty()) && required) {
+            throw new MalformedXmlException(
+                    String.format(
+                            "Delimited string %s was required but missing, in %s.",
+                            attrName, ele.getTagName()));
+        }
+        return list;
+    }
+
+    /** Gets a Boolean attribute. */
+    public static Boolean getBoolAttr(Element ele, String attrName, boolean required)
+            throws MalformedXmlException {
+        Boolean b = XmlUtils.fromString(ele.getAttribute(attrName));
+        if (b == null && required) {
+            throw new MalformedXmlException(
+                    String.format(
+                            "Boolean %s was required but missing, in %s.",
+                            attrName, ele.getTagName()));
+        }
+        return b;
+    }
+
+    /** Gets a Boolean attribute. */
+    public static Boolean getOdBoolEle(Element ele, String nameName, boolean required)
+            throws MalformedXmlException {
+        List<Element> boolEles =
+                XmlUtils.getChildrenByTagName(ele, XmlUtils.OD_TAG_BOOLEAN).stream()
+                        .filter(e -> e.getAttribute(XmlUtils.OD_ATTR_NAME).equals(nameName))
+                        .toList();
+        if (boolEles.size() > 1) {
+            throw new MalformedXmlException(
+                    String.format("Found more than one %s in %s.", nameName, ele.getTagName()));
+        }
+        if (boolEles.isEmpty()) {
+            if (required) {
+                throw new MalformedXmlException(
+                        String.format("Found no %s in %s.", nameName, ele.getTagName()));
+            }
+            return null;
+        }
+        Element boolEle = boolEles.get(0);
+
+        Boolean b = XmlUtils.fromString(boolEle.getAttribute(XmlUtils.OD_ATTR_VALUE));
+        if (b == null && required) {
+            throw new MalformedXmlException(
+                    String.format(
+                            "Boolean %s was required but missing, in %s.",
+                            nameName, ele.getTagName()));
+        }
+        return b;
+    }
+
+    /** Gets a OD Pbundle Element attribute with the specified name. */
+    public static Element getOdPbundleWithName(Element ele, String nameName, boolean required)
+            throws MalformedXmlException {
+        List<Element> eles =
+                XmlUtils.getChildrenByTagName(ele, XmlUtils.OD_TAG_PBUNDLE_AS_MAP).stream()
+                        .filter(e -> e.getAttribute(XmlUtils.OD_ATTR_NAME).equals(nameName))
+                        .toList();
+        if (eles.size() > 1) {
+            throw new MalformedXmlException(
+                    String.format("Found more than one %s in %s.", nameName, ele.getTagName()));
+        }
+        if (eles.isEmpty()) {
+            if (required) {
+                throw new MalformedXmlException(
+                        String.format("Found no %s in %s.", nameName, ele.getTagName()));
+            }
+            return null;
+        }
+        return eles.get(0);
+    }
+
+    /** Gets a required String attribute. */
+    public static String getStringAttr(Element ele, String attrName) throws MalformedXmlException {
+        return getStringAttr(ele, attrName, true);
+    }
+
+    /** Gets a String attribute; throws exception if required and non-existent. */
+    public static String getStringAttr(Element ele, String attrName, boolean required)
+            throws MalformedXmlException {
+        String s = ele.getAttribute(attrName);
+        if (isNullOrEmpty(s)) {
+            if (required) {
+                throw new MalformedXmlException(
+                        String.format(
+                                "Malformed or missing required %s in: %s",
+                                attrName, ele.getTagName()));
+            } else {
+                return null;
+            }
+        }
+        return s;
+    }
+
+    /** Gets on-device style int array. */
+    public static List<Integer> getOdIntArray(Element ele, String nameName, boolean required)
+            throws MalformedXmlException {
+        List<Element> intArrayEles =
+                XmlUtils.getChildrenByTagName(ele, XmlUtils.OD_TAG_INT_ARRAY).stream()
+                        .filter(e -> e.getAttribute(XmlUtils.OD_ATTR_NAME).equals(nameName))
+                        .toList();
+        if (intArrayEles.size() > 1) {
+            throw new MalformedXmlException(
+                    String.format("Found more than one %s in %s.", nameName, ele.getTagName()));
+        }
+        if (intArrayEles.isEmpty()) {
+            if (required) {
+                throw new MalformedXmlException(
+                        String.format("Found no %s in %s.", nameName, ele.getTagName()));
+            }
+            return List.of();
+        }
+        Element intArrayEle = intArrayEles.get(0);
+        List<Element> itemEles = XmlUtils.getChildrenByTagName(intArrayEle, XmlUtils.OD_TAG_ITEM);
+        List<Integer> ints = new ArrayList<Integer>();
+        for (Element itemEle : itemEles) {
+            ints.add(Integer.parseInt(XmlUtils.getStringAttr(itemEle, XmlUtils.OD_ATTR_VALUE)));
+        }
+        return ints;
+    }
+
+    /**
+     * Utility method for making a List from one element, to support easier refactoring if needed.
+     * For example, List.of() doesn't support null elements.
+     */
+    public static List<Element> listOf(Element e) {
+        return Arrays.asList(e);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/AllTests.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AllTests.java
new file mode 100644
index 0000000..54c80f6
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AllTests.java
@@ -0,0 +1,47 @@
+/*
+ * 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.asllib;
+
+import com.android.asllib.marshallable.AndroidSafetyLabelTest;
+import com.android.asllib.marshallable.AppInfoTest;
+import com.android.asllib.marshallable.DataCategoryTest;
+import com.android.asllib.marshallable.DataLabelsTest;
+import com.android.asllib.marshallable.DeveloperInfoTest;
+import com.android.asllib.marshallable.SafetyLabelsTest;
+import com.android.asllib.marshallable.SecurityLabelsTest;
+import com.android.asllib.marshallable.SystemAppSafetyLabelTest;
+import com.android.asllib.marshallable.ThirdPartyVerificationTest;
+import com.android.asllib.marshallable.TransparencyInfoTest;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
[email protected]({
+    AslgenTests.class,
+    AndroidSafetyLabelTest.class,
+    AppInfoTest.class,
+    DataCategoryTest.class,
+    DataLabelsTest.class,
+    DeveloperInfoTest.class,
+    SafetyLabelsTest.class,
+    SecurityLabelsTest.class,
+    SystemAppSafetyLabelTest.class,
+    ThirdPartyVerificationTest.class,
+    TransparencyInfoTest.class
+})
+public class AllTests {}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java
new file mode 100644
index 0000000..e2588d7
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java
@@ -0,0 +1,73 @@
+/*
+ * 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.asllib;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.asllib.marshallable.AndroidSafetyLabel;
+import com.android.asllib.testutils.TestUtils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+@RunWith(JUnit4.class)
+public class AslgenTests {
+    private static final String VALID_MAPPINGS_PATH = "com/android/asllib/validmappings";
+    private static final List<String> VALID_MAPPINGS_SUBDIRS =
+            List.of("location", "contacts", "general");
+    private static final String HR_XML_FILENAME = "hr.xml";
+    private static final String OD_XML_FILENAME = "od.xml";
+
+    /** Logic for setting up tests (empty if not yet needed). */
+    public static void main(String[] params) throws Exception {}
+
+    /** Tests valid mappings between HR and OD. */
+    @Test
+    public void testValidMappings() throws Exception {
+        System.out.println("start testing valid mappings.");
+
+        for (String subdir : VALID_MAPPINGS_SUBDIRS) {
+            Path hrPath = Paths.get(VALID_MAPPINGS_PATH, subdir, HR_XML_FILENAME);
+            Path odPath = Paths.get(VALID_MAPPINGS_PATH, subdir, OD_XML_FILENAME);
+
+            System.out.println("hr path: " + hrPath.toString());
+            System.out.println("od path: " + odPath.toString());
+
+            InputStream hrStream =
+                    getClass().getClassLoader().getResourceAsStream(hrPath.toString());
+            String hrContents = new String(hrStream.readAllBytes(), StandardCharsets.UTF_8);
+            InputStream odStream =
+                    getClass().getClassLoader().getResourceAsStream(odPath.toString());
+            String odContents = new String(odStream.readAllBytes(), StandardCharsets.UTF_8);
+            AndroidSafetyLabel asl =
+                    AslConverter.readFromString(hrContents, AslConverter.Format.HUMAN_READABLE);
+            String out = AslConverter.getXmlAsString(asl, AslConverter.Format.ON_DEVICE);
+            System.out.println("out: " + out);
+
+            assertEquals(
+                    TestUtils.getFormattedXml(out, false),
+                    TestUtils.getFormattedXml(odContents, false));
+        }
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AndroidSafetyLabelTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AndroidSafetyLabelTest.java
new file mode 100644
index 0000000..0137007
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AndroidSafetyLabelTest.java
@@ -0,0 +1,97 @@
+/*
+ * 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.asllib.marshallable;
+
+import com.android.asllib.testutils.TestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.w3c.dom.Document;
+
+@RunWith(JUnit4.class)
+public class AndroidSafetyLabelTest {
+    private static final String ANDROID_SAFETY_LABEL_HR_PATH =
+            "com/android/asllib/androidsafetylabel/hr";
+    private static final String ANDROID_SAFETY_LABEL_OD_PATH =
+            "com/android/asllib/androidsafetylabel/od";
+
+    private static final String MISSING_VERSION_FILE_NAME = "missing-version.xml";
+    private static final String VALID_EMPTY_FILE_NAME = "valid-empty.xml";
+    private static final String WITH_SAFETY_LABELS_FILE_NAME = "with-safety-labels.xml";
+    private static final String WITH_SYSTEM_APP_SAFETY_LABEL_FILE_NAME =
+            "with-system-app-safety-label.xml";
+    private static final String WITH_TRANSPARENCY_INFO_FILE_NAME = "with-transparency-info.xml";
+
+    private Document mDoc = null;
+
+    @Before
+    public void setUp() throws Exception {
+        System.out.println("set up.");
+        mDoc = TestUtils.document();
+    }
+
+    /** Test for android safety label missing version. */
+    @Test
+    public void testAndroidSafetyLabelMissingVersion() throws Exception {
+        System.out.println("starting testAndroidSafetyLabelMissingVersion.");
+        hrToOdExpectException(MISSING_VERSION_FILE_NAME);
+    }
+
+    /** Test for android safety label valid empty. */
+    @Test
+    public void testAndroidSafetyLabelValidEmptyFile() throws Exception {
+        System.out.println("starting testAndroidSafetyLabelValidEmptyFile.");
+        testHrToOdAndroidSafetyLabel(VALID_EMPTY_FILE_NAME);
+    }
+
+    /** Test for android safety label with safety labels. */
+    @Test
+    public void testAndroidSafetyLabelWithSafetyLabels() throws Exception {
+        System.out.println("starting testAndroidSafetyLabelWithSafetyLabels.");
+        testHrToOdAndroidSafetyLabel(WITH_SAFETY_LABELS_FILE_NAME);
+    }
+
+    /** Test for android safety label with system app safety label. */
+    @Test
+    public void testAndroidSafetyLabelWithSystemAppSafetyLabel() throws Exception {
+        System.out.println("starting testAndroidSafetyLabelWithSystemAppSafetyLabel.");
+        testHrToOdAndroidSafetyLabel(WITH_SYSTEM_APP_SAFETY_LABEL_FILE_NAME);
+    }
+
+    /** Test for android safety label with transparency info. */
+    @Test
+    public void testAndroidSafetyLabelWithTransparencyInfo() throws Exception {
+        System.out.println("starting testAndroidSafetyLabelWithTransparencyInfo.");
+        testHrToOdAndroidSafetyLabel(WITH_TRANSPARENCY_INFO_FILE_NAME);
+    }
+
+    private void hrToOdExpectException(String fileName) {
+        TestUtils.hrToOdExpectException(
+                new AndroidSafetyLabelFactory(), ANDROID_SAFETY_LABEL_HR_PATH, fileName);
+    }
+
+    private void testHrToOdAndroidSafetyLabel(String fileName) throws Exception {
+        TestUtils.testHrToOd(
+                mDoc,
+                new AndroidSafetyLabelFactory(),
+                ANDROID_SAFETY_LABEL_HR_PATH,
+                ANDROID_SAFETY_LABEL_OD_PATH,
+                fileName);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AppInfoTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AppInfoTest.java
new file mode 100644
index 0000000..a015e2e
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AppInfoTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.asllib.marshallable;
+
+import static org.junit.Assert.assertThrows;
+
+import com.android.asllib.testutils.TestUtils;
+import com.android.asllib.util.MalformedXmlException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.w3c.dom.Document;
+
+import java.nio.file.Paths;
+import java.util.List;
+
+@RunWith(JUnit4.class)
+public class AppInfoTest {
+    private static final String APP_INFO_HR_PATH = "com/android/asllib/appinfo/hr";
+    private static final String APP_INFO_OD_PATH = "com/android/asllib/appinfo/od";
+    public static final List<String> REQUIRED_FIELD_NAMES =
+            List.of(
+                    "title",
+                    "description",
+                    "containsAds",
+                    "obeyAps",
+                    "adsFingerprinting",
+                    "securityFingerprinting",
+                    "privacyPolicy",
+                    "securityEndpoints",
+                    "firstPartyEndpoints",
+                    "serviceProviderEndpoints",
+                    "category",
+                    "email");
+    public static final List<String> OPTIONAL_FIELD_NAMES = List.of("website");
+
+    private static final String ALL_FIELDS_VALID_FILE_NAME = "all-fields-valid.xml";
+
+    private Document mDoc = null;
+
+    /** Logic for setting up tests (empty if not yet needed). */
+    public static void main(String[] params) throws Exception {}
+
+    @Before
+    public void setUp() throws Exception {
+        System.out.println("set up.");
+        mDoc = TestUtils.document();
+    }
+
+    /** Test for all fields valid. */
+    @Test
+    public void testAllFieldsValid() throws Exception {
+        System.out.println("starting testAllFieldsValid.");
+        testHrToOdAppInfo(ALL_FIELDS_VALID_FILE_NAME);
+    }
+
+    /** Tests missing required fields fails. */
+    @Test
+    public void testMissingRequiredFields() throws Exception {
+        System.out.println("Starting testMissingRequiredFields");
+        for (String reqField : REQUIRED_FIELD_NAMES) {
+            System.out.println("testing missing required field: " + reqField);
+            var appInfoEle =
+                    TestUtils.getElementsFromResource(
+                            Paths.get(APP_INFO_HR_PATH, ALL_FIELDS_VALID_FILE_NAME));
+            appInfoEle.get(0).removeAttribute(reqField);
+
+            assertThrows(
+                    MalformedXmlException.class,
+                    () -> new AppInfoFactory().createFromHrElements(appInfoEle));
+        }
+    }
+
+    /** Tests missing optional fields passes. */
+    @Test
+    public void testMissingOptionalFields() throws Exception {
+        for (String optField : OPTIONAL_FIELD_NAMES) {
+            var ele =
+                    TestUtils.getElementsFromResource(
+                            Paths.get(APP_INFO_HR_PATH, ALL_FIELDS_VALID_FILE_NAME));
+            ele.get(0).removeAttribute(optField);
+            AppInfo appInfo = new AppInfoFactory().createFromHrElements(ele);
+            appInfo.toOdDomElements(mDoc);
+        }
+    }
+
+    private void testHrToOdAppInfo(String fileName) throws Exception {
+        TestUtils.testHrToOd(
+                mDoc, new AppInfoFactory(), APP_INFO_HR_PATH, APP_INFO_OD_PATH, fileName);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataCategoryTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataCategoryTest.java
new file mode 100644
index 0000000..822f175
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataCategoryTest.java
@@ -0,0 +1,216 @@
+/*
+ * 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.asllib.marshallable;
+
+import com.android.asllib.testutils.TestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.w3c.dom.Document;
+
+@RunWith(JUnit4.class)
+public class DataCategoryTest {
+    private static final String DATA_CATEGORY_HR_PATH = "com/android/asllib/datacategory/hr";
+    private static final String DATA_CATEGORY_OD_PATH = "com/android/asllib/datacategory/od";
+
+    private static final String VALID_PERSONAL_FILE_NAME = "data-category-personal.xml";
+    private static final String VALID_PARTIAL_PERSONAL_FILE_NAME =
+            "data-category-personal-partial.xml";
+    private static final String VALID_FINANCIAL_FILE_NAME = "data-category-financial.xml";
+    private static final String VALID_LOCATION_FILE_NAME = "data-category-location.xml";
+    private static final String VALID_EMAIL_TEXT_MESSAGE_FILE_NAME =
+            "data-category-email-text-message.xml";
+    private static final String VALID_PHOTO_VIDEO_FILE_NAME = "data-category-photo-video.xml";
+    private static final String VALID_AUDIO_FILE_NAME = "data-category-audio.xml";
+    private static final String VALID_STORAGE_FILE_NAME = "data-category-storage.xml";
+    private static final String VALID_HEALTH_FITNESS_FILE_NAME = "data-category-health-fitness.xml";
+    private static final String VALID_CONTACTS_FILE_NAME = "data-category-contacts.xml";
+    private static final String VALID_CALENDAR_FILE_NAME = "data-category-calendar.xml";
+    private static final String VALID_IDENTIFIERS_FILE_NAME = "data-category-identifiers.xml";
+    private static final String VALID_APP_PERFORMANCE_FILE_NAME =
+            "data-category-app-performance.xml";
+    private static final String VALID_ACTIONS_IN_APP_FILE_NAME = "data-category-actions-in-app.xml";
+    private static final String VALID_SEARCH_AND_BROWSING_FILE_NAME =
+            "data-category-search-and-browsing.xml";
+
+    private static final String EMPTY_PURPOSE_PERSONAL_FILE_NAME =
+            "data-category-personal-empty-purpose.xml";
+    private static final String MISSING_PURPOSE_PERSONAL_FILE_NAME =
+            "data-category-personal-missing-purpose.xml";
+    private static final String UNRECOGNIZED_TYPE_PERSONAL_FILE_NAME =
+            "data-category-personal-unrecognized-type.xml";
+    private static final String UNRECOGNIZED_CATEGORY_FILE_NAME = "data-category-unrecognized.xml";
+
+    private Document mDoc = null;
+
+    /** Logic for setting up tests (empty if not yet needed). */
+    public static void main(String[] params) throws Exception {}
+
+    @Before
+    public void setUp() throws Exception {
+        System.out.println("set up.");
+        mDoc = TestUtils.document();
+    }
+
+    /** Test for data category personal. */
+    @Test
+    public void testDataCategoryPersonal() throws Exception {
+        System.out.println("starting testDataCategoryPersonal.");
+        testHrToOdDataCategory(VALID_PERSONAL_FILE_NAME);
+    }
+
+    /** Test for data category financial. */
+    @Test
+    public void testDataCategoryFinancial() throws Exception {
+        System.out.println("starting testDataCategoryFinancial.");
+        testHrToOdDataCategory(VALID_FINANCIAL_FILE_NAME);
+    }
+
+    /** Test for data category location. */
+    @Test
+    public void testDataCategoryLocation() throws Exception {
+        System.out.println("starting testDataCategoryLocation.");
+        testHrToOdDataCategory(VALID_LOCATION_FILE_NAME);
+    }
+
+    /** Test for data category email text message. */
+    @Test
+    public void testDataCategoryEmailTextMessage() throws Exception {
+        System.out.println("starting testDataCategoryEmailTextMessage.");
+        testHrToOdDataCategory(VALID_EMAIL_TEXT_MESSAGE_FILE_NAME);
+    }
+
+    /** Test for data category photo video. */
+    @Test
+    public void testDataCategoryPhotoVideo() throws Exception {
+        System.out.println("starting testDataCategoryPhotoVideo.");
+        testHrToOdDataCategory(VALID_PHOTO_VIDEO_FILE_NAME);
+    }
+
+    /** Test for data category audio. */
+    @Test
+    public void testDataCategoryAudio() throws Exception {
+        System.out.println("starting testDataCategoryAudio.");
+        testHrToOdDataCategory(VALID_AUDIO_FILE_NAME);
+    }
+
+    /** Test for data category storage. */
+    @Test
+    public void testDataCategoryStorage() throws Exception {
+        System.out.println("starting testDataCategoryStorage.");
+        testHrToOdDataCategory(VALID_STORAGE_FILE_NAME);
+    }
+
+    /** Test for data category health fitness. */
+    @Test
+    public void testDataCategoryHealthFitness() throws Exception {
+        System.out.println("starting testDataCategoryHealthFitness.");
+        testHrToOdDataCategory(VALID_HEALTH_FITNESS_FILE_NAME);
+    }
+
+    /** Test for data category contacts. */
+    @Test
+    public void testDataCategoryContacts() throws Exception {
+        System.out.println("starting testDataCategoryContacts.");
+        testHrToOdDataCategory(VALID_CONTACTS_FILE_NAME);
+    }
+
+    /** Test for data category calendar. */
+    @Test
+    public void testDataCategoryCalendar() throws Exception {
+        System.out.println("starting testDataCategoryCalendar.");
+        testHrToOdDataCategory(VALID_CALENDAR_FILE_NAME);
+    }
+
+    /** Test for data category identifiers. */
+    @Test
+    public void testDataCategoryIdentifiers() throws Exception {
+        System.out.println("starting testDataCategoryIdentifiers.");
+        testHrToOdDataCategory(VALID_IDENTIFIERS_FILE_NAME);
+    }
+
+    /** Test for data category app performance. */
+    @Test
+    public void testDataCategoryAppPerformance() throws Exception {
+        System.out.println("starting testDataCategoryAppPerformance.");
+        testHrToOdDataCategory(VALID_APP_PERFORMANCE_FILE_NAME);
+    }
+
+    /** Test for data category actions in app. */
+    @Test
+    public void testDataCategoryActionsInApp() throws Exception {
+        System.out.println("starting testDataCategoryActionsInApp.");
+        testHrToOdDataCategory(VALID_ACTIONS_IN_APP_FILE_NAME);
+    }
+
+    /** Test for data category search and browsing. */
+    @Test
+    public void testDataCategorySearchAndBrowsing() throws Exception {
+        System.out.println("starting testDataCategorySearchAndBrowsing.");
+        testHrToOdDataCategory(VALID_SEARCH_AND_BROWSING_FILE_NAME);
+    }
+
+    /** Test for data category search and browsing. */
+    @Test
+    public void testMissingOptionalsAllowed() throws Exception {
+        System.out.println("starting testMissingOptionalsAllowed.");
+        testHrToOdDataCategory(VALID_PARTIAL_PERSONAL_FILE_NAME);
+    }
+
+    /** Test for empty purposes. */
+    @Test
+    public void testEmptyPurposesNotAllowed() throws Exception {
+        System.out.println("starting testEmptyPurposesNotAllowed.");
+        hrToOdExpectException(EMPTY_PURPOSE_PERSONAL_FILE_NAME);
+    }
+
+    /** Test for missing purposes. */
+    @Test
+    public void testMissingPurposesNotAllowed() throws Exception {
+        System.out.println("starting testMissingPurposesNotAllowed.");
+        hrToOdExpectException(MISSING_PURPOSE_PERSONAL_FILE_NAME);
+    }
+
+    /** Test for unrecognized type. */
+    @Test
+    public void testUnrecognizedTypeNotAllowed() throws Exception {
+        System.out.println("starting testUnrecognizedTypeNotAllowed.");
+        hrToOdExpectException(UNRECOGNIZED_TYPE_PERSONAL_FILE_NAME);
+    }
+
+    /** Test for unrecognized category. */
+    @Test
+    public void testUnrecognizedCategoryNotAllowed() throws Exception {
+        System.out.println("starting testUnrecognizedCategoryNotAllowed.");
+        hrToOdExpectException(UNRECOGNIZED_CATEGORY_FILE_NAME);
+    }
+
+    private void hrToOdExpectException(String fileName) {
+        TestUtils.hrToOdExpectException(new DataCategoryFactory(), DATA_CATEGORY_HR_PATH, fileName);
+    }
+
+    private void testHrToOdDataCategory(String fileName) throws Exception {
+        TestUtils.testHrToOd(
+                mDoc,
+                new DataCategoryFactory(),
+                DATA_CATEGORY_HR_PATH,
+                DATA_CATEGORY_OD_PATH,
+                fileName);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java
new file mode 100644
index 0000000..6f6f254
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java
@@ -0,0 +1,325 @@
+/*
+ * 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.asllib.marshallable;
+
+import com.android.asllib.testutils.TestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.w3c.dom.Document;
+
+@RunWith(JUnit4.class)
+public class DataLabelsTest {
+    private static final String DATA_LABELS_HR_PATH = "com/android/asllib/datalabels/hr";
+    private static final String DATA_LABELS_OD_PATH = "com/android/asllib/datalabels/od";
+
+    private static final String ACCESSED_VALID_BOOL_FILE_NAME =
+            "data-labels-accessed-valid-bool.xml";
+    private static final String ACCESSED_INVALID_BOOL_FILE_NAME =
+            "data-labels-accessed-invalid-bool.xml";
+    private static final String COLLECTED_VALID_BOOL_FILE_NAME =
+            "data-labels-collected-valid-bool.xml";
+    private static final String COLLECTED_INVALID_BOOL_FILE_NAME =
+            "data-labels-collected-invalid-bool.xml";
+    private static final String SHARED_VALID_BOOL_FILE_NAME = "data-labels-shared-valid-bool.xml";
+    private static final String SHARED_INVALID_BOOL_FILE_NAME =
+            "data-labels-shared-invalid-bool.xml";
+
+    private static final String ACTIONS_IN_APP_FILE_NAME = "data-category-actions-in-app.xml";
+    private static final String APP_PERFORMANCE_FILE_NAME = "data-category-app-performance.xml";
+    private static final String AUDIO_FILE_NAME = "data-category-audio.xml";
+    private static final String CALENDAR_FILE_NAME = "data-category-calendar.xml";
+    private static final String CONTACTS_FILE_NAME = "data-category-contacts.xml";
+    private static final String EMAIL_TEXT_MESSAGE_FILE_NAME =
+            "data-category-email-text-message.xml";
+    private static final String FINANCIAL_FILE_NAME = "data-category-financial.xml";
+    private static final String HEALTH_FITNESS_FILE_NAME = "data-category-health-fitness.xml";
+    private static final String IDENTIFIERS_FILE_NAME = "data-category-identifiers.xml";
+    private static final String LOCATION_FILE_NAME = "data-category-location.xml";
+    private static final String PERSONAL_FILE_NAME = "data-category-personal.xml";
+    private static final String PERSONAL_PARTIAL_FILE_NAME = "data-category-personal-partial.xml";
+    private static final String PHOTO_VIDEO_FILE_NAME = "data-category-photo-video.xml";
+    private static final String SEARCH_AND_BROWSING_FILE_NAME =
+            "data-category-search-and-browsing.xml";
+    private static final String STORAGE_FILE_NAME = "data-category-storage.xml";
+    private static final String PERSONAL_MISSING_PURPOSE_FILE_NAME =
+            "data-category-personal-missing-purpose.xml";
+    private static final String PERSONAL_EMPTY_PURPOSE_FILE_NAME =
+            "data-category-personal-empty-purpose.xml";
+    private static final String UNRECOGNIZED_FILE_NAME = "data-category-unrecognized.xml";
+    private static final String UNRECOGNIZED_TYPE_FILE_NAME = "data-category-unrecognized-type.xml";
+
+    private Document mDoc = null;
+
+    @Before
+    public void setUp() throws Exception {
+        System.out.println("set up.");
+        mDoc = TestUtils.document();
+    }
+
+    /** Test for data labels accessed valid bool. */
+    @Test
+    public void testDataLabelsAccessedValidBool() throws Exception {
+        System.out.println("starting testDataLabelsAccessedValidBool.");
+        testHrToOdDataLabels(ACCESSED_VALID_BOOL_FILE_NAME);
+        testOdToHrDataLabels(ACCESSED_VALID_BOOL_FILE_NAME);
+    }
+
+    /** Test for data labels accessed invalid bool. */
+    @Test
+    public void testDataLabelsAccessedInvalidBool() throws Exception {
+        System.out.println("starting testDataLabelsAccessedInvalidBool.");
+        hrToOdExpectException(ACCESSED_INVALID_BOOL_FILE_NAME);
+    }
+
+    /** Test for data labels collected valid bool. */
+    @Test
+    public void testDataLabelsCollectedValidBool() throws Exception {
+        System.out.println("starting testDataLabelsCollectedValidBool.");
+        testHrToOdDataLabels(COLLECTED_VALID_BOOL_FILE_NAME);
+        testOdToHrDataLabels(COLLECTED_VALID_BOOL_FILE_NAME);
+    }
+
+    /** Test for data labels collected invalid bool. */
+    @Test
+    public void testDataLabelsCollectedInvalidBool() throws Exception {
+        System.out.println("starting testDataLabelsCollectedInvalidBool.");
+        hrToOdExpectException(COLLECTED_INVALID_BOOL_FILE_NAME);
+        odToHrExpectException(COLLECTED_INVALID_BOOL_FILE_NAME);
+    }
+
+    /** Test for data labels shared valid bool. */
+    @Test
+    public void testDataLabelsSharedValidBool() throws Exception {
+        System.out.println("starting testDataLabelsSharedValidBool.");
+        testHrToOdDataLabels(SHARED_VALID_BOOL_FILE_NAME);
+        testOdToHrDataLabels(SHARED_VALID_BOOL_FILE_NAME);
+    }
+
+    /** Test for data labels shared invalid bool. */
+    @Test
+    public void testDataLabelsSharedInvalidBool() throws Exception {
+        System.out.println("starting testDataLabelsSharedInvalidBool.");
+        hrToOdExpectException(SHARED_INVALID_BOOL_FILE_NAME);
+    }
+
+    /* Data categories bidirectional tests... */
+
+    /** Test for data labels actions in app. */
+    @Test
+    public void testDataLabelsActionsInApp() throws Exception {
+        System.out.println("starting testDataLabelsActionsInApp.");
+        testHrToOdDataLabels(ACTIONS_IN_APP_FILE_NAME);
+        testOdToHrDataLabels(ACTIONS_IN_APP_FILE_NAME);
+    }
+
+    /** Test for data labels app performance. */
+    @Test
+    public void testDataLabelsAppPerformance() throws Exception {
+        System.out.println("starting testDataLabelsAppPerformance.");
+        testHrToOdDataLabels(APP_PERFORMANCE_FILE_NAME);
+        testOdToHrDataLabels(APP_PERFORMANCE_FILE_NAME);
+    }
+
+    /** Test for data labels audio. */
+    @Test
+    public void testDataLabelsAudio() throws Exception {
+        System.out.println("starting testDataLabelsAudio.");
+        testHrToOdDataLabels(AUDIO_FILE_NAME);
+        testOdToHrDataLabels(AUDIO_FILE_NAME);
+    }
+
+    /** Test for data labels calendar. */
+    @Test
+    public void testDataLabelsCalendar() throws Exception {
+        System.out.println("starting testDataLabelsCalendar.");
+        testHrToOdDataLabels(CALENDAR_FILE_NAME);
+        testOdToHrDataLabels(CALENDAR_FILE_NAME);
+    }
+
+    /** Test for data labels contacts. */
+    @Test
+    public void testDataLabelsContacts() throws Exception {
+        System.out.println("starting testDataLabelsContacts.");
+        testHrToOdDataLabels(CONTACTS_FILE_NAME);
+        testOdToHrDataLabels(CONTACTS_FILE_NAME);
+    }
+
+    /** Test for data labels email text message. */
+    @Test
+    public void testDataLabelsEmailTextMessage() throws Exception {
+        System.out.println("starting testDataLabelsEmailTextMessage.");
+        testHrToOdDataLabels(EMAIL_TEXT_MESSAGE_FILE_NAME);
+        testOdToHrDataLabels(EMAIL_TEXT_MESSAGE_FILE_NAME);
+    }
+
+    /** Test for data labels financial. */
+    @Test
+    public void testDataLabelsFinancial() throws Exception {
+        System.out.println("starting testDataLabelsFinancial.");
+        testHrToOdDataLabels(FINANCIAL_FILE_NAME);
+        testOdToHrDataLabels(FINANCIAL_FILE_NAME);
+    }
+
+    /** Test for data labels health fitness. */
+    @Test
+    public void testDataLabelsHealthFitness() throws Exception {
+        System.out.println("starting testDataLabelsHealthFitness.");
+        testHrToOdDataLabels(HEALTH_FITNESS_FILE_NAME);
+        testOdToHrDataLabels(HEALTH_FITNESS_FILE_NAME);
+    }
+
+    /** Test for data labels identifiers. */
+    @Test
+    public void testDataLabelsIdentifiers() throws Exception {
+        System.out.println("starting testDataLabelsIdentifiers.");
+        testHrToOdDataLabels(IDENTIFIERS_FILE_NAME);
+        testOdToHrDataLabels(IDENTIFIERS_FILE_NAME);
+    }
+
+    /** Test for data labels location. */
+    @Test
+    public void testDataLabelsLocation() throws Exception {
+        System.out.println("starting testDataLabelsLocation.");
+        testHrToOdDataLabels(LOCATION_FILE_NAME);
+        testOdToHrDataLabels(LOCATION_FILE_NAME);
+    }
+
+    /** Test for data labels personal. */
+    @Test
+    public void testDataLabelsPersonal() throws Exception {
+        System.out.println("starting testDataLabelsPersonal.");
+        testHrToOdDataLabels(PERSONAL_FILE_NAME);
+        testOdToHrDataLabels(PERSONAL_FILE_NAME);
+    }
+
+    /** Test for data labels personal partial. */
+    @Test
+    public void testDataLabelsPersonalPartial() throws Exception {
+        System.out.println("starting testDataLabelsPersonalPartial.");
+        testHrToOdDataLabels(PERSONAL_PARTIAL_FILE_NAME);
+        testOdToHrDataLabels(PERSONAL_PARTIAL_FILE_NAME);
+    }
+
+    /** Test for data labels photo video. */
+    @Test
+    public void testDataLabelsPhotoVideo() throws Exception {
+        System.out.println("starting testDataLabelsPhotoVideo.");
+        testHrToOdDataLabels(PHOTO_VIDEO_FILE_NAME);
+        testOdToHrDataLabels(PHOTO_VIDEO_FILE_NAME);
+    }
+
+    /** Test for data labels search and browsing. */
+    @Test
+    public void testDataLabelsSearchAndBrowsing() throws Exception {
+        System.out.println("starting testDataLabelsSearchAndBrowsing.");
+        testHrToOdDataLabels(SEARCH_AND_BROWSING_FILE_NAME);
+        testOdToHrDataLabels(SEARCH_AND_BROWSING_FILE_NAME);
+    }
+
+    /** Test for data labels storage. */
+    @Test
+    public void testDataLabelsStorage() throws Exception {
+        System.out.println("starting testDataLabelsStorage.");
+        testHrToOdDataLabels(STORAGE_FILE_NAME);
+        testOdToHrDataLabels(STORAGE_FILE_NAME);
+    }
+
+    /** Test for data labels hr unrecognized data category. */
+    @Test
+    public void testDataLabelsHrUnrecognizedDataCategory() throws Exception {
+        System.out.println("starting testDataLabelsHrUnrecognizedDataCategory.");
+        hrToOdExpectException(UNRECOGNIZED_FILE_NAME);
+    }
+
+    /** Test for data labels hr unrecognized data type. */
+    @Test
+    public void testDataLabelsHrUnrecognizedDataType() throws Exception {
+        System.out.println("starting testDataLabelsHrUnrecognizedDataType.");
+        hrToOdExpectException(UNRECOGNIZED_TYPE_FILE_NAME);
+    }
+
+    /** Test for data labels hr missing purpose. */
+    @Test
+    public void testDataLabelsHrMissingPurpose() throws Exception {
+        System.out.println("starting testDataLabelsHrMissingPurpose.");
+        hrToOdExpectException(PERSONAL_MISSING_PURPOSE_FILE_NAME);
+    }
+
+    /** Test for data labels hr empty purpose. */
+    @Test
+    public void testDataLabelsHrEmptyPurpose() throws Exception {
+        System.out.println("starting testDataLabelsHrEmptyPurpose.");
+        hrToOdExpectException(PERSONAL_EMPTY_PURPOSE_FILE_NAME);
+    }
+
+    /** Test for data labels od unrecognized data category. */
+    @Test
+    public void testDataLabelsOdUnrecognizedDataCategory() throws Exception {
+        System.out.println("starting testDataLabelsOdUnrecognizedDataCategory.");
+        odToHrExpectException(UNRECOGNIZED_FILE_NAME);
+    }
+
+    /** Test for data labels od unrecognized data type. */
+    @Test
+    public void testDataLabelsOdUnrecognizedDataType() throws Exception {
+        System.out.println("starting testDataLabelsOdUnrecognizedDataCategory.");
+        odToHrExpectException(UNRECOGNIZED_TYPE_FILE_NAME);
+    }
+
+    /** Test for data labels od missing purpose. */
+    @Test
+    public void testDataLabelsOdMissingPurpose() throws Exception {
+        System.out.println("starting testDataLabelsOdMissingPurpose.");
+        odToHrExpectException(PERSONAL_MISSING_PURPOSE_FILE_NAME);
+    }
+
+    /** Test for data labels od empty purpose. */
+    @Test
+    public void testDataLabelsOdEmptyPurpose() throws Exception {
+        System.out.println("starting testDataLabelsOdEmptyPurpose.");
+        odToHrExpectException(PERSONAL_EMPTY_PURPOSE_FILE_NAME);
+    }
+
+    private void hrToOdExpectException(String fileName) {
+        TestUtils.hrToOdExpectException(new DataLabelsFactory(), DATA_LABELS_HR_PATH, fileName);
+    }
+
+    private void odToHrExpectException(String fileName) {
+        TestUtils.odToHrExpectException(new DataLabelsFactory(), DATA_LABELS_OD_PATH, fileName);
+    }
+
+    private void testHrToOdDataLabels(String fileName) throws Exception {
+        TestUtils.testHrToOd(
+                TestUtils.document(),
+                new DataLabelsFactory(),
+                DATA_LABELS_HR_PATH,
+                DATA_LABELS_OD_PATH,
+                fileName);
+    }
+
+    private void testOdToHrDataLabels(String fileName) throws Exception {
+        TestUtils.testOdToHr(
+                TestUtils.document(),
+                new DataLabelsFactory(),
+                DATA_LABELS_OD_PATH,
+                DATA_LABELS_HR_PATH,
+                fileName);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DeveloperInfoTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DeveloperInfoTest.java
new file mode 100644
index 0000000..ff8346a
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DeveloperInfoTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.asllib.marshallable;
+
+import static org.junit.Assert.assertThrows;
+
+import com.android.asllib.testutils.TestUtils;
+import com.android.asllib.util.MalformedXmlException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.w3c.dom.Document;
+
+import java.nio.file.Paths;
+import java.util.List;
+
+@RunWith(JUnit4.class)
+public class DeveloperInfoTest {
+    private static final String DEVELOPER_INFO_HR_PATH = "com/android/asllib/developerinfo/hr";
+    private static final String DEVELOPER_INFO_OD_PATH = "com/android/asllib/developerinfo/od";
+    public static final List<String> REQUIRED_FIELD_NAMES =
+            List.of("address", "countryRegion", "email", "name", "relationship");
+    public static final List<String> OPTIONAL_FIELD_NAMES = List.of("website", "registryId");
+
+    private static final String ALL_FIELDS_VALID_FILE_NAME = "all-fields-valid.xml";
+
+    private Document mDoc = null;
+
+    /** Logic for setting up tests (empty if not yet needed). */
+    public static void main(String[] params) throws Exception {}
+
+    @Before
+    public void setUp() throws Exception {
+        System.out.println("set up.");
+        mDoc = TestUtils.document();
+    }
+
+    /** Test for all fields valid. */
+    @Test
+    public void testAllFieldsValid() throws Exception {
+        System.out.println("starting testAllFieldsValid.");
+        testHrToOdDeveloperInfo(ALL_FIELDS_VALID_FILE_NAME);
+    }
+
+    /** Tests missing required fields fails. */
+    @Test
+    public void testMissingRequiredFields() throws Exception {
+        System.out.println("Starting testMissingRequiredFields");
+        for (String reqField : REQUIRED_FIELD_NAMES) {
+            System.out.println("testing missing required field: " + reqField);
+            var developerInfoEle =
+                    TestUtils.getElementsFromResource(
+                            Paths.get(DEVELOPER_INFO_HR_PATH, ALL_FIELDS_VALID_FILE_NAME));
+            developerInfoEle.get(0).removeAttribute(reqField);
+
+            assertThrows(
+                    MalformedXmlException.class,
+                    () -> new DeveloperInfoFactory().createFromHrElements(developerInfoEle));
+        }
+    }
+
+    /** Tests missing optional fields passes. */
+    @Test
+    public void testMissingOptionalFields() throws Exception {
+        for (String optField : OPTIONAL_FIELD_NAMES) {
+            var developerInfoEle =
+                    TestUtils.getElementsFromResource(
+                            Paths.get(DEVELOPER_INFO_HR_PATH, ALL_FIELDS_VALID_FILE_NAME));
+            developerInfoEle.get(0).removeAttribute(optField);
+            DeveloperInfo developerInfo =
+                    new DeveloperInfoFactory().createFromHrElements(developerInfoEle);
+            developerInfo.toOdDomElements(mDoc);
+        }
+    }
+
+    private void testHrToOdDeveloperInfo(String fileName) throws Exception {
+        TestUtils.testHrToOd(
+                mDoc,
+                new DeveloperInfoFactory(),
+                DEVELOPER_INFO_HR_PATH,
+                DEVELOPER_INFO_OD_PATH,
+                fileName);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SafetyLabelsTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SafetyLabelsTest.java
new file mode 100644
index 0000000..c52d6c8
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SafetyLabelsTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.asllib.marshallable;
+
+import com.android.asllib.testutils.TestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.w3c.dom.Document;
+
+@RunWith(JUnit4.class)
+public class SafetyLabelsTest {
+    private static final String SAFETY_LABELS_HR_PATH = "com/android/asllib/safetylabels/hr";
+    private static final String SAFETY_LABELS_OD_PATH = "com/android/asllib/safetylabels/od";
+
+    private static final String MISSING_VERSION_FILE_NAME = "missing-version.xml";
+    private static final String VALID_EMPTY_FILE_NAME = "valid-empty.xml";
+    private static final String WITH_DATA_LABELS_FILE_NAME = "with-data-labels.xml";
+    private static final String WITH_SECURITY_LABELS_FILE_NAME = "with-security-labels.xml";
+    private static final String WITH_THIRD_PARTY_VERIFICATION_FILE_NAME =
+            "with-third-party-verification.xml";
+
+    private Document mDoc = null;
+
+    @Before
+    public void setUp() throws Exception {
+        System.out.println("set up.");
+        mDoc = TestUtils.document();
+    }
+
+    /** Test for safety labels missing version. */
+    @Test
+    public void testSafetyLabelsMissingVersion() throws Exception {
+        System.out.println("starting testSafetyLabelsMissingVersion.");
+        hrToOdExpectException(MISSING_VERSION_FILE_NAME);
+    }
+
+    /** Test for safety labels valid empty. */
+    @Test
+    public void testSafetyLabelsValidEmptyFile() throws Exception {
+        System.out.println("starting testSafetyLabelsValidEmptyFile.");
+        testHrToOdSafetyLabels(VALID_EMPTY_FILE_NAME);
+    }
+
+    /** Test for safety labels with data labels. */
+    @Test
+    public void testSafetyLabelsWithDataLabels() throws Exception {
+        System.out.println("starting testSafetyLabelsWithDataLabels.");
+        testHrToOdSafetyLabels(WITH_DATA_LABELS_FILE_NAME);
+    }
+
+    /** Test for safety labels with security labels. */
+    @Test
+    public void testSafetyLabelsWithSecurityLabels() throws Exception {
+        System.out.println("starting testSafetyLabelsWithSecurityLabels.");
+        testHrToOdSafetyLabels(WITH_SECURITY_LABELS_FILE_NAME);
+    }
+
+    /** Test for safety labels with third party verification. */
+    @Test
+    public void testSafetyLabelsWithThirdPartyVerification() throws Exception {
+        System.out.println("starting testSafetyLabelsWithThirdPartyVerification.");
+        testHrToOdSafetyLabels(WITH_THIRD_PARTY_VERIFICATION_FILE_NAME);
+    }
+
+    private void hrToOdExpectException(String fileName) {
+        TestUtils.hrToOdExpectException(new SafetyLabelsFactory(), SAFETY_LABELS_HR_PATH, fileName);
+    }
+
+    private void testHrToOdSafetyLabels(String fileName) throws Exception {
+        TestUtils.testHrToOd(
+                mDoc,
+                new SafetyLabelsFactory(),
+                SAFETY_LABELS_HR_PATH,
+                SAFETY_LABELS_OD_PATH,
+                fileName);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SecurityLabelsTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SecurityLabelsTest.java
new file mode 100644
index 0000000..c0d0d72
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SecurityLabelsTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.asllib.marshallable;
+
+
+import com.android.asllib.testutils.TestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.w3c.dom.Document;
+
+import java.nio.file.Paths;
+import java.util.List;
+
+@RunWith(JUnit4.class)
+public class SecurityLabelsTest {
+    private static final String SECURITY_LABELS_HR_PATH = "com/android/asllib/securitylabels/hr";
+    private static final String SECURITY_LABELS_OD_PATH = "com/android/asllib/securitylabels/od";
+
+    public static final List<String> OPTIONAL_FIELD_NAMES =
+            List.of("isDataDeletable", "isDataEncrypted");
+
+    private static final String ALL_FIELDS_VALID_FILE_NAME = "all-fields-valid.xml";
+
+    private Document mDoc = null;
+
+    /** Logic for setting up tests (empty if not yet needed). */
+    public static void main(String[] params) throws Exception {}
+
+    @Before
+    public void setUp() throws Exception {
+        System.out.println("set up.");
+        mDoc = TestUtils.document();
+    }
+
+    /** Test for all fields valid. */
+    @Test
+    public void testAllFieldsValid() throws Exception {
+        System.out.println("starting testAllFieldsValid.");
+        testHrToOdSecurityLabels(ALL_FIELDS_VALID_FILE_NAME);
+    }
+
+    /** Tests missing optional fields passes. */
+    @Test
+    public void testMissingOptionalFields() throws Exception {
+        for (String optField : OPTIONAL_FIELD_NAMES) {
+            var ele =
+                    TestUtils.getElementsFromResource(
+                            Paths.get(SECURITY_LABELS_HR_PATH, ALL_FIELDS_VALID_FILE_NAME));
+            ele.get(0).removeAttribute(optField);
+            SecurityLabels securityLabels = new SecurityLabelsFactory().createFromHrElements(ele);
+            securityLabels.toOdDomElements(mDoc);
+        }
+    }
+
+    private void testHrToOdSecurityLabels(String fileName) throws Exception {
+        TestUtils.testHrToOd(
+                mDoc,
+                new SecurityLabelsFactory(),
+                SECURITY_LABELS_HR_PATH,
+                SECURITY_LABELS_OD_PATH,
+                fileName);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java
new file mode 100644
index 0000000..191091a
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.asllib.marshallable;
+
+import com.android.asllib.testutils.TestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.w3c.dom.Document;
+
+@RunWith(JUnit4.class)
+public class SystemAppSafetyLabelTest {
+    private static final String SYSTEM_APP_SAFETY_LABEL_HR_PATH =
+            "com/android/asllib/systemappsafetylabel/hr";
+    private static final String SYSTEM_APP_SAFETY_LABEL_OD_PATH =
+            "com/android/asllib/systemappsafetylabel/od";
+
+    private static final String VALID_FILE_NAME = "valid.xml";
+    private static final String MISSING_URL_FILE_NAME = "missing-url.xml";
+
+    private Document mDoc = null;
+
+    /** Logic for setting up tests (empty if not yet needed). */
+    public static void main(String[] params) throws Exception {}
+
+    @Before
+    public void setUp() throws Exception {
+        System.out.println("set up.");
+        mDoc = TestUtils.document();
+    }
+
+    /** Test for valid. */
+    @Test
+    public void testValid() throws Exception {
+        System.out.println("starting testValid.");
+        testHrToOdSystemAppSafetyLabel(VALID_FILE_NAME);
+    }
+
+    /** Tests missing url. */
+    @Test
+    public void testMissingUrl() throws Exception {
+        System.out.println("starting testMissingUrl.");
+        hrToOdExpectException(MISSING_URL_FILE_NAME);
+    }
+
+    private void hrToOdExpectException(String fileName) {
+        TestUtils.hrToOdExpectException(
+                new SystemAppSafetyLabelFactory(), SYSTEM_APP_SAFETY_LABEL_HR_PATH, fileName);
+    }
+
+    private void testHrToOdSystemAppSafetyLabel(String fileName) throws Exception {
+        TestUtils.testHrToOd(
+                mDoc,
+                new SystemAppSafetyLabelFactory(),
+                SYSTEM_APP_SAFETY_LABEL_HR_PATH,
+                SYSTEM_APP_SAFETY_LABEL_OD_PATH,
+                fileName);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/ThirdPartyVerificationTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/ThirdPartyVerificationTest.java
new file mode 100644
index 0000000..ab8e85c
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/ThirdPartyVerificationTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.asllib.marshallable;
+
+import com.android.asllib.testutils.TestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.w3c.dom.Document;
+
+@RunWith(JUnit4.class)
+public class ThirdPartyVerificationTest {
+    private static final String THIRD_PARTY_VERIFICATION_HR_PATH =
+            "com/android/asllib/thirdpartyverification/hr";
+    private static final String THIRD_PARTY_VERIFICATION_OD_PATH =
+            "com/android/asllib/thirdpartyverification/od";
+
+    private static final String VALID_FILE_NAME = "valid.xml";
+    private static final String MISSING_URL_FILE_NAME = "missing-url.xml";
+
+    private Document mDoc = null;
+
+    /** Logic for setting up tests (empty if not yet needed). */
+    public static void main(String[] params) throws Exception {}
+
+    @Before
+    public void setUp() throws Exception {
+        System.out.println("set up.");
+        mDoc = TestUtils.document();
+    }
+
+    /** Test for valid. */
+    @Test
+    public void testValid() throws Exception {
+        System.out.println("starting testValid.");
+        testHrToOdThirdPartyVerification(VALID_FILE_NAME);
+    }
+
+    /** Tests missing url. */
+    @Test
+    public void testMissingUrl() throws Exception {
+        System.out.println("starting testMissingUrl.");
+        hrToOdExpectException(MISSING_URL_FILE_NAME);
+    }
+
+    private void hrToOdExpectException(String fileName) {
+        TestUtils.hrToOdExpectException(
+                new ThirdPartyVerificationFactory(), THIRD_PARTY_VERIFICATION_HR_PATH, fileName);
+    }
+
+    private void testHrToOdThirdPartyVerification(String fileName) throws Exception {
+        TestUtils.testHrToOd(
+                mDoc,
+                new ThirdPartyVerificationFactory(),
+                THIRD_PARTY_VERIFICATION_HR_PATH,
+                THIRD_PARTY_VERIFICATION_OD_PATH,
+                fileName);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/TransparencyInfoTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/TransparencyInfoTest.java
new file mode 100644
index 0000000..56503f7
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/TransparencyInfoTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.asllib.marshallable;
+
+import com.android.asllib.testutils.TestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.w3c.dom.Document;
+
+@RunWith(JUnit4.class)
+public class TransparencyInfoTest {
+    private static final String TRANSPARENCY_INFO_HR_PATH =
+            "com/android/asllib/transparencyinfo/hr";
+    private static final String TRANSPARENCY_INFO_OD_PATH =
+            "com/android/asllib/transparencyinfo/od";
+
+    private static final String VALID_EMPTY_FILE_NAME = "valid-empty.xml";
+    private static final String WITH_DEVELOPER_INFO_FILE_NAME = "with-developer-info.xml";
+    private static final String WITH_APP_INFO_FILE_NAME = "with-app-info.xml";
+
+    private Document mDoc = null;
+
+    @Before
+    public void setUp() throws Exception {
+        System.out.println("set up.");
+        mDoc = TestUtils.document();
+    }
+
+    /** Test for transparency info valid empty. */
+    @Test
+    public void testTransparencyInfoValidEmptyFile() throws Exception {
+        System.out.println("starting testTransparencyInfoValidEmptyFile.");
+        testHrToOdTransparencyInfo(VALID_EMPTY_FILE_NAME);
+    }
+
+    /** Test for transparency info with developer info. */
+    @Test
+    public void testTransparencyInfoWithDeveloperInfo() throws Exception {
+        System.out.println("starting testTransparencyInfoWithDeveloperInfo.");
+        testHrToOdTransparencyInfo(WITH_DEVELOPER_INFO_FILE_NAME);
+    }
+
+    /** Test for transparency info with app info. */
+    @Test
+    public void testTransparencyInfoWithAppInfo() throws Exception {
+        System.out.println("starting testTransparencyInfoWithAppInfo.");
+        testHrToOdTransparencyInfo(WITH_APP_INFO_FILE_NAME);
+    }
+
+    private void testHrToOdTransparencyInfo(String fileName) throws Exception {
+        TestUtils.testHrToOd(
+                mDoc,
+                new TransparencyInfoFactory(),
+                TRANSPARENCY_INFO_HR_PATH,
+                TRANSPARENCY_INFO_OD_PATH,
+                fileName);
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/testutils/TestUtils.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/testutils/TestUtils.java
new file mode 100644
index 0000000..6a29b86
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/testutils/TestUtils.java
@@ -0,0 +1,216 @@
+/*
+ * 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.asllib.testutils;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+
+import com.android.asllib.marshallable.AslMarshallable;
+import com.android.asllib.marshallable.AslMarshallableFactory;
+import com.android.asllib.util.MalformedXmlException;
+import com.android.asllib.util.XmlUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+public class TestUtils {
+    public static final String HOLDER_TAG_NAME = "holder_of_flattened_for_testing";
+
+    /** Reads a Resource file into a String. */
+    public static String readStrFromResource(Path filePath) throws IOException {
+        InputStream hrStream =
+                TestUtils.class.getClassLoader().getResourceAsStream(filePath.toString());
+        return new String(hrStream.readAllBytes(), StandardCharsets.UTF_8);
+    }
+
+    /** Gets List of Element from a path to an existing Resource. */
+    public static List<Element> getElementsFromResource(Path filePath)
+            throws ParserConfigurationException, IOException, SAXException {
+        String str = readStrFromResource(filePath);
+        InputStream stream = new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8));
+
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setNamespaceAware(true);
+        Document document = factory.newDocumentBuilder().parse(stream);
+        Element root = document.getDocumentElement();
+        if (root.getTagName().equals(HOLDER_TAG_NAME)) {
+            String tagName =
+                    XmlUtils.asElementList(root.getChildNodes()).stream()
+                            .findFirst()
+                            .get()
+                            .getTagName();
+            return XmlUtils.getChildrenByTagName(root, tagName);
+        } else {
+            return List.of(root);
+        }
+    }
+
+    /** Reads a Document into a String. */
+    public static String docToStr(Document doc, boolean omitXmlDeclaration)
+            throws TransformerException {
+        TransformerFactory transformerFactory = TransformerFactory.newInstance();
+        Transformer transformer = transformerFactory.newTransformer();
+        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+        transformer.setOutputProperty(
+                OutputKeys.OMIT_XML_DECLARATION, omitXmlDeclaration ? "yes" : "no");
+
+        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+        StreamResult streamResult = new StreamResult(outStream); // out
+        DOMSource domSource = new DOMSource(doc);
+        transformer.transform(domSource, streamResult);
+
+        return outStream.toString(StandardCharsets.UTF_8);
+    }
+
+    /**
+     * Gets formatted XML for slightly more robust comparison checking than naive string comparison.
+     */
+    public static String getFormattedXml(String xmlStr, boolean omitXmlDeclaration)
+            throws ParserConfigurationException, IOException, SAXException, TransformerException {
+        InputStream stream = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8));
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setNamespaceAware(true);
+        Document document = factory.newDocumentBuilder().parse(stream);
+        stripEmptyElements(document);
+        return docToStr(document, omitXmlDeclaration);
+    }
+
+    /** Helper for getting a new Document */
+    public static Document document() throws ParserConfigurationException {
+        return DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+    }
+
+    /** Helper for testing human-readable to on-device conversion expecting exception */
+    public static <T extends AslMarshallable> void hrToOdExpectException(
+            AslMarshallableFactory<T> factory, String hrFolderPath, String fileName) {
+        assertThrows(
+                MalformedXmlException.class,
+                () -> {
+                    factory.createFromHrElements(
+                            TestUtils.getElementsFromResource(Paths.get(hrFolderPath, fileName)));
+                });
+    }
+
+    /** Helper for testing on-device to human-readable conversion expecting exception */
+    public static <T extends AslMarshallable> void odToHrExpectException(
+            AslMarshallableFactory<T> factory, String odFolderPath, String fileName) {
+        assertThrows(
+                MalformedXmlException.class,
+                () -> {
+                    factory.createFromOdElements(
+                            TestUtils.getElementsFromResource(Paths.get(odFolderPath, fileName)));
+                });
+    }
+
+    /** Helper for testing human-readable to on-device conversion */
+    public static <T extends AslMarshallable> void testHrToOd(
+            Document doc,
+            AslMarshallableFactory<T> factory,
+            String hrFolderPath,
+            String odFolderPath,
+            String fileName)
+            throws Exception {
+        testFormatToFormat(doc, factory, hrFolderPath, odFolderPath, fileName, true);
+    }
+
+    /** Helper for testing on-device to human-readable conversion */
+    public static <T extends AslMarshallable> void testOdToHr(
+            Document doc,
+            AslMarshallableFactory<T> factory,
+            String odFolderPath,
+            String hrFolderPath,
+            String fileName)
+            throws Exception {
+        testFormatToFormat(doc, factory, odFolderPath, hrFolderPath, fileName, false);
+    }
+
+    /** Helper for testing format to format conversion */
+    private static <T extends AslMarshallable> void testFormatToFormat(
+            Document doc,
+            AslMarshallableFactory<T> factory,
+            String inFolderPath,
+            String outFolderPath,
+            String fileName,
+            boolean hrToOd)
+            throws Exception {
+        AslMarshallable marshallable =
+                hrToOd
+                        ? factory.createFromHrElements(
+                                TestUtils.getElementsFromResource(
+                                        Paths.get(inFolderPath, fileName)))
+                        : factory.createFromOdElements(
+                                TestUtils.getElementsFromResource(
+                                        Paths.get(inFolderPath, fileName)));
+
+        List<Element> elements =
+                hrToOd ? marshallable.toOdDomElements(doc) : marshallable.toHrDomElements(doc);
+        if (elements.isEmpty()) {
+            throw new IllegalStateException("elements was empty.");
+        } else if (elements.size() == 1) {
+            doc.appendChild(elements.get(0));
+        } else {
+            Element root = doc.createElement(TestUtils.HOLDER_TAG_NAME);
+            for (var child : elements) {
+                root.appendChild(child);
+            }
+            doc.appendChild(root);
+        }
+        String converted = TestUtils.getFormattedXml(TestUtils.docToStr(doc, true), true);
+        System.out.println("Converted: " + converted);
+        String expectedOutContents =
+                TestUtils.getFormattedXml(
+                        TestUtils.readStrFromResource(Paths.get(outFolderPath, fileName)), true);
+        System.out.println("Expected: " + expectedOutContents);
+        assertEquals(expectedOutContents, converted);
+    }
+
+    private static void stripEmptyElements(Node node) {
+        NodeList children = node.getChildNodes();
+        for (int i = 0; i < children.getLength(); ++i) {
+            Node child = children.item(i);
+            if (child.getNodeType() == Node.TEXT_NODE) {
+                if (child.getTextContent().trim().length() == 0) {
+                    child.getParentNode().removeChild(child);
+                    i--;
+                }
+            }
+            stripEmptyElements(child);
+        }
+    }
+}
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/missing-version.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/missing-version.xml
new file mode 100644
index 0000000..ec0cd70
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/missing-version.xml
@@ -0,0 +1,3 @@
+<app-metadata-bundles>
+
+</app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/valid-empty.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/valid-empty.xml
new file mode 100644
index 0000000..19bfd82
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/valid-empty.xml
@@ -0,0 +1 @@
+<app-metadata-bundles version="123456"></app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-safety-labels.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-safety-labels.xml
new file mode 100644
index 0000000..53794a1
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-safety-labels.xml
@@ -0,0 +1,4 @@
+<app-metadata-bundles version="123456">
+    <safety-labels version="12345">
+    </safety-labels>
+</app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-system-app-safety-label.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-system-app-safety-label.xml
new file mode 100644
index 0000000..7bcde45
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-system-app-safety-label.xml
@@ -0,0 +1,4 @@
+<app-metadata-bundles version="123456">
+<system-app-safety-label url="www.example.com">
+</system-app-safety-label>
+</app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-transparency-info.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-transparency-info.xml
new file mode 100644
index 0000000..00bcfa8
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/hr/with-transparency-info.xml
@@ -0,0 +1,4 @@
+<app-metadata-bundles version="123456">
+<transparency-info>
+</transparency-info>
+</app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/valid-empty.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/valid-empty.xml
new file mode 100644
index 0000000..37bdfad
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/valid-empty.xml
@@ -0,0 +1,3 @@
+<bundle>
+    <long name="version" value="123456"/>
+</bundle>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-safety-labels.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-safety-labels.xml
new file mode 100644
index 0000000..74644ed
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-safety-labels.xml
@@ -0,0 +1,6 @@
+<bundle>
+    <long name="version" value="123456"/>
+    <pbundle_as_map name="safety_labels">
+        <long name="version" value="12345"/>
+    </pbundle_as_map>
+</bundle>
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-system-app-safety-label.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-system-app-safety-label.xml
new file mode 100644
index 0000000..ef0f549
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-system-app-safety-label.xml
@@ -0,0 +1,6 @@
+<bundle>
+    <long name="version" value="123456"/>
+    <pbundle_as_map name="system_app_safety_label">
+        <string name="url" value="www.example.com"/>
+    </pbundle_as_map>
+</bundle>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-transparency-info.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-transparency-info.xml
new file mode 100644
index 0000000..63c5094
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/with-transparency-info.xml
@@ -0,0 +1,4 @@
+<bundle>
+    <long name="version" value="123456"/>
+    <pbundle_as_map name="transparency_info"/>
+</bundle>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/appinfo/hr/all-fields-valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/appinfo/hr/all-fields-valid.xml
new file mode 100644
index 0000000..883170a2
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/appinfo/hr/all-fields-valid.xml
@@ -0,0 +1,14 @@
+<app-info
+    title="beervision"
+    description="a beer app"
+    containsAds="true"
+    obeyAps="false"
+    adsFingerprinting="false"
+    securityFingerprinting="false"
+    privacyPolicy="www.example.com"
+    securityEndpoints="url1|url2|url3"
+    firstPartyEndpoints="url1"
+    serviceProviderEndpoints="url55|url56"
+    category="Food and drink"
+    email="[email protected]"
+    website="www.example.com" />
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/appinfo/od/all-fields-valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/appinfo/od/all-fields-valid.xml
new file mode 100644
index 0000000..6e976a3
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/appinfo/od/all-fields-valid.xml
@@ -0,0 +1,25 @@
+
+<pbundle_as_map name="app_info">
+    <string name="title" value="beervision"/>
+    <string name="description" value="a beer app"/>
+    <boolean name="contains_ads" value="true"/>
+    <boolean name="obey_aps" value="false"/>
+    <boolean name="ads_fingerprinting" value="false"/>
+    <boolean name="security_fingerprinting" value="false"/>
+    <string name="privacy_policy" value="www.example.com"/>
+    <string-array name="security_endpoint" num="3">
+        <item value="url1"/>
+        <item value="url2"/>
+        <item value="url3"/>
+    </string-array>
+    <string-array name="first_party_endpoint" num="1">
+        <item value="url1"/>
+    </string-array>
+    <string-array name="service_provider_endpoint" num="2">
+        <item value="url55"/>
+        <item value="url56"/>
+    </string-array>
+    <string name="category" value="Food and drink"/>
+    <string name="email" value="[email protected]"/>
+    <string name="website" value="www.example.com"/>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-actions-in-app.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-actions-in-app.xml
new file mode 100644
index 0000000..520e525
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-actions-in-app.xml
@@ -0,0 +1,17 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="actions_in_app"
+        dataType="user_interaction"
+        purposes="analytics" />
+    <data-shared dataCategory="actions_in_app"
+        dataType="in_app_search_history"
+        purposes="analytics" />
+    <data-shared dataCategory="actions_in_app"
+        dataType="installed_apps"
+        purposes="analytics" />
+    <data-shared dataCategory="actions_in_app"
+        dataType="user_generated_content"
+        purposes="analytics" />
+    <data-shared dataCategory="actions_in_app"
+        dataType="other"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-app-performance.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-app-performance.xml
new file mode 100644
index 0000000..0d08e5b
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-app-performance.xml
@@ -0,0 +1,11 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="app_performance"
+        dataType="crash_logs"
+        purposes="analytics" />
+    <data-shared dataCategory="app_performance"
+        dataType="performance_diagnostics"
+        purposes="analytics" />
+    <data-shared dataCategory="app_performance"
+        dataType="other"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-audio.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-audio.xml
new file mode 100644
index 0000000..b1cf3b4
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-audio.xml
@@ -0,0 +1,11 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="audio"
+        dataType="sound_recordings"
+        purposes="analytics" />
+    <data-shared dataCategory="audio"
+        dataType="music_files"
+        purposes="analytics" />
+    <data-shared dataCategory="audio"
+        dataType="other"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-calendar.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-calendar.xml
new file mode 100644
index 0000000..a723070
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-calendar.xml
@@ -0,0 +1,5 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="calendar"
+        dataType="calendar"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-contacts.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-contacts.xml
new file mode 100644
index 0000000..2fe28ff
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-contacts.xml
@@ -0,0 +1,5 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="contacts"
+        dataType="contacts"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-email-text-message.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-email-text-message.xml
new file mode 100644
index 0000000..49a326f
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-email-text-message.xml
@@ -0,0 +1,11 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="email_text_message"
+        dataType="emails"
+        purposes="analytics" />
+    <data-shared dataCategory="email_text_message"
+        dataType="text_messages"
+        purposes="analytics" />
+    <data-shared dataCategory="email_text_message"
+        dataType="other"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-financial.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-financial.xml
new file mode 100644
index 0000000..f5de370
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-financial.xml
@@ -0,0 +1,14 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="financial"
+        dataType="card_bank_account"
+        purposes="analytics" />
+    <data-shared dataCategory="financial"
+    dataType="purchase_history"
+    purposes="analytics" />
+    <data-shared dataCategory="financial"
+        dataType="credit_score"
+        purposes="analytics" />
+    <data-shared dataCategory="financial"
+        dataType="other"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-health-fitness.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-health-fitness.xml
new file mode 100644
index 0000000..9891f81
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-health-fitness.xml
@@ -0,0 +1,8 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="health_fitness"
+        dataType="health"
+        purposes="analytics" />
+    <data-shared dataCategory="health_fitness"
+        dataType="fitness"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-identifiers.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-identifiers.xml
new file mode 100644
index 0000000..3e74da1
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-identifiers.xml
@@ -0,0 +1,5 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="identifiers"
+        dataType="other"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-location.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-location.xml
new file mode 100644
index 0000000..4762f16
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-location.xml
@@ -0,0 +1,8 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="location"
+        dataType="approx_location"
+        purposes="analytics" />
+    <data-shared dataCategory="location"
+        dataType="precise_location"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-empty-purpose.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-empty-purpose.xml
new file mode 100644
index 0000000..964e178
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-empty-purpose.xml
@@ -0,0 +1,5 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="personal"
+    dataType="email_address"
+    purposes="" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-missing-purpose.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-missing-purpose.xml
new file mode 100644
index 0000000..3ce1288
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-missing-purpose.xml
@@ -0,0 +1,4 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="personal"
+    dataType="email_address" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-partial.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-partial.xml
new file mode 100644
index 0000000..68baae3
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-partial.xml
@@ -0,0 +1,8 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="personal"
+        dataType="name"
+        purposes="analytics|developer_communications" />
+    <data-shared dataCategory="personal"
+    dataType="email_address"
+    purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-unrecognized-type.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-unrecognized-type.xml
new file mode 100644
index 0000000..921a90a
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal-unrecognized-type.xml
@@ -0,0 +1,5 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="personal"
+    dataType="unrecognized"
+    purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal.xml
new file mode 100644
index 0000000..4533773
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-personal.xml
@@ -0,0 +1,31 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="personal"
+        dataType="name"
+        ephemeral="true"
+        isCollectionOptional="true"
+        purposes="analytics|developer_communications" />
+    <data-shared dataCategory="personal"
+    dataType="email_address"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="physical_address"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="phone_number"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="race_ethnicity"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="political_or_religious_beliefs"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="sexual_orientation_or_gender_identity"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="personal_identifiers"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="other"
+    purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-photo-video.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-photo-video.xml
new file mode 100644
index 0000000..234fb26
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-photo-video.xml
@@ -0,0 +1,8 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="photo_video"
+        dataType="photos"
+        purposes="analytics" />
+    <data-shared dataCategory="photo_video"
+        dataType="videos"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-search-and-browsing.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-search-and-browsing.xml
new file mode 100644
index 0000000..db85163
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-search-and-browsing.xml
@@ -0,0 +1,5 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="search_and_browsing"
+        dataType="web_browsing_history"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-storage.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-storage.xml
new file mode 100644
index 0000000..9aad02d
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-storage.xml
@@ -0,0 +1,5 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="storage"
+        dataType="files_docs"
+        purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-unrecognized.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-unrecognized.xml
new file mode 100644
index 0000000..64b9ea7
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/hr/data-category-unrecognized.xml
@@ -0,0 +1,5 @@
+<holder_of_flattened_for_testing>
+    <data-shared dataCategory="unrecognized"
+    dataType="email_address"
+    purposes="analytics" />
+</holder_of_flattened_for_testing>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-actions-in-app.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-actions-in-app.xml
new file mode 100644
index 0000000..5b99900
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-actions-in-app.xml
@@ -0,0 +1,27 @@
+<pbundle_as_map name="actions_in_app">
+    <pbundle_as_map name="user_interaction">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="in_app_search_history">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="installed_apps">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="user_generated_content">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-app-performance.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-app-performance.xml
new file mode 100644
index 0000000..0fe1022
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-app-performance.xml
@@ -0,0 +1,17 @@
+<pbundle_as_map name="app_performance">
+    <pbundle_as_map name="crash_logs">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="performance_diagnostics">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-audio.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-audio.xml
new file mode 100644
index 0000000..51f1dfd
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-audio.xml
@@ -0,0 +1,17 @@
+<pbundle_as_map name="audio">
+    <pbundle_as_map name="sound_recordings">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="music_files">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-calendar.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-calendar.xml
new file mode 100644
index 0000000..326da47
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-calendar.xml
@@ -0,0 +1,7 @@
+<pbundle_as_map name="calendar">
+    <pbundle_as_map name="calendar">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-contacts.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-contacts.xml
new file mode 100644
index 0000000..5d4387d
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-contacts.xml
@@ -0,0 +1,7 @@
+<pbundle_as_map name="contacts">
+    <pbundle_as_map name="contacts">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-email-text-message.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-email-text-message.xml
new file mode 100644
index 0000000..5ac98f5
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-email-text-message.xml
@@ -0,0 +1,17 @@
+<pbundle_as_map name="email_text_message">
+    <pbundle_as_map name="emails">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="text_messages">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-financial.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-financial.xml
new file mode 100644
index 0000000..a66f1a4
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-financial.xml
@@ -0,0 +1,22 @@
+<pbundle_as_map name="financial">
+    <pbundle_as_map name="card_bank_account">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="purchase_history">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="credit_score">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-health-fitness.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-health-fitness.xml
new file mode 100644
index 0000000..8e697b4
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-health-fitness.xml
@@ -0,0 +1,12 @@
+<pbundle_as_map name="health_fitness">
+    <pbundle_as_map name="health">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="fitness">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-identifiers.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-identifiers.xml
new file mode 100644
index 0000000..34b4016
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-identifiers.xml
@@ -0,0 +1,7 @@
+<pbundle_as_map name="identifiers">
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-location.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-location.xml
new file mode 100644
index 0000000..db2e696
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-location.xml
@@ -0,0 +1,12 @@
+<pbundle_as_map name="location">
+    <pbundle_as_map name="approx_location">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="precise_location">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-personal-partial.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-personal-partial.xml
new file mode 100644
index 0000000..839922a
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-personal-partial.xml
@@ -0,0 +1,13 @@
+<pbundle_as_map name="personal">
+    <pbundle_as_map name="name">
+        <int-array name="purposes" num="2">
+            <item value="2" />
+            <item value="3" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="email_address">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-personal.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-personal.xml
new file mode 100644
index 0000000..43650b6
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-personal.xml
@@ -0,0 +1,50 @@
+<pbundle_as_map name="personal">
+    <pbundle_as_map name="name">
+        <int-array name="purposes" num="2">
+            <item value="2" />
+            <item value="3" />
+        </int-array>
+        <boolean name="is_collection_optional" value="true" />
+        <boolean name="ephemeral" value="true" />
+    </pbundle_as_map>
+    <pbundle_as_map name="email_address">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="physical_address">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="phone_number">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="race_ethnicity">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="political_or_religious_beliefs">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="sexual_orientation_or_gender_identity">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="personal_identifiers">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-photo-video.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-photo-video.xml
new file mode 100644
index 0000000..2a31780
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-photo-video.xml
@@ -0,0 +1,12 @@
+<pbundle_as_map name="photo_video">
+    <pbundle_as_map name="photos">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="videos">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-search-and-browsing.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-search-and-browsing.xml
new file mode 100644
index 0000000..9e654ef
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-search-and-browsing.xml
@@ -0,0 +1,7 @@
+<pbundle_as_map name="search_and_browsing">
+    <pbundle_as_map name="web_browsing_history">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-storage.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-storage.xml
new file mode 100644
index 0000000..9abc37f
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datacategory/od/data-category-storage.xml
@@ -0,0 +1,7 @@
+<pbundle_as_map name="storage">
+    <pbundle_as_map name="files_docs">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-actions-in-app.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-actions-in-app.xml
new file mode 100644
index 0000000..68e191e
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-actions-in-app.xml
@@ -0,0 +1,17 @@
+<data-labels>
+    <data-shared dataCategory="actions_in_app"
+        dataType="user_interaction"
+        purposes="analytics" />
+    <data-shared dataCategory="actions_in_app"
+        dataType="in_app_search_history"
+        purposes="analytics" />
+    <data-shared dataCategory="actions_in_app"
+        dataType="installed_apps"
+        purposes="analytics" />
+    <data-shared dataCategory="actions_in_app"
+        dataType="user_generated_content"
+        purposes="analytics" />
+    <data-shared dataCategory="actions_in_app"
+        dataType="other"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-app-performance.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-app-performance.xml
new file mode 100644
index 0000000..a6bd17d
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-app-performance.xml
@@ -0,0 +1,11 @@
+<data-labels>
+    <data-shared dataCategory="app_performance"
+        dataType="crash_logs"
+        purposes="analytics" />
+    <data-shared dataCategory="app_performance"
+        dataType="performance_diagnostics"
+        purposes="analytics" />
+    <data-shared dataCategory="app_performance"
+        dataType="other"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-audio.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-audio.xml
new file mode 100644
index 0000000..6274604
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-audio.xml
@@ -0,0 +1,11 @@
+<data-labels>
+    <data-shared dataCategory="audio"
+        dataType="sound_recordings"
+        purposes="analytics" />
+    <data-shared dataCategory="audio"
+        dataType="music_files"
+        purposes="analytics" />
+    <data-shared dataCategory="audio"
+        dataType="other"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-calendar.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-calendar.xml
new file mode 100644
index 0000000..f7201f6
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-calendar.xml
@@ -0,0 +1,5 @@
+<data-labels>
+    <data-shared dataCategory="calendar"
+        dataType="calendar"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-contacts.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-contacts.xml
new file mode 100644
index 0000000..e8d40be
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-contacts.xml
@@ -0,0 +1,5 @@
+<data-labels>
+    <data-shared dataCategory="contacts"
+        dataType="contacts"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-email-text-message.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-email-text-message.xml
new file mode 100644
index 0000000..69e9b87
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-email-text-message.xml
@@ -0,0 +1,11 @@
+<data-labels>
+    <data-shared dataCategory="email_text_message"
+        dataType="emails"
+        purposes="analytics" />
+    <data-shared dataCategory="email_text_message"
+        dataType="text_messages"
+        purposes="analytics" />
+    <data-shared dataCategory="email_text_message"
+        dataType="other"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-financial.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-financial.xml
new file mode 100644
index 0000000..fdd8456
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-financial.xml
@@ -0,0 +1,14 @@
+<data-labels>
+    <data-shared dataCategory="financial"
+        dataType="card_bank_account"
+        purposes="analytics" />
+    <data-shared dataCategory="financial"
+    dataType="purchase_history"
+    purposes="analytics" />
+    <data-shared dataCategory="financial"
+        dataType="credit_score"
+        purposes="analytics" />
+    <data-shared dataCategory="financial"
+        dataType="other"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-health-fitness.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-health-fitness.xml
new file mode 100644
index 0000000..bac58e6
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-health-fitness.xml
@@ -0,0 +1,8 @@
+<data-labels>
+    <data-shared dataCategory="health_fitness"
+        dataType="health"
+        purposes="analytics" />
+    <data-shared dataCategory="health_fitness"
+        dataType="fitness"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-identifiers.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-identifiers.xml
new file mode 100644
index 0000000..ee45f26
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-identifiers.xml
@@ -0,0 +1,5 @@
+<data-labels>
+    <data-shared dataCategory="identifiers"
+        dataType="other"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-location.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-location.xml
new file mode 100644
index 0000000..e8e5911
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-location.xml
@@ -0,0 +1,8 @@
+<data-labels>
+    <data-shared dataCategory="location"
+        dataType="approx_location"
+        purposes="analytics" />
+    <data-shared dataCategory="location"
+        dataType="precise_location"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-empty-purpose.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-empty-purpose.xml
new file mode 100644
index 0000000..0b220f4
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-empty-purpose.xml
@@ -0,0 +1,5 @@
+<data-labels>
+    <data-shared dataCategory="personal"
+    dataType="email_address"
+    purposes="" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-missing-purpose.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-missing-purpose.xml
new file mode 100644
index 0000000..ac221f2
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-missing-purpose.xml
@@ -0,0 +1,4 @@
+<data-labels>
+    <data-shared dataCategory="personal"
+    dataType="email_address" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-partial.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-partial.xml
new file mode 100644
index 0000000..11b7368
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-partial.xml
@@ -0,0 +1,8 @@
+<data-labels>
+    <data-shared dataCategory="personal"
+        dataType="name"
+        purposes="analytics|developer_communications" />
+    <data-shared dataCategory="personal"
+    dataType="email_address"
+    purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-unrecognized-type.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-unrecognized-type.xml
new file mode 100644
index 0000000..f1fbd56
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal-unrecognized-type.xml
@@ -0,0 +1,5 @@
+<data-labels>
+    <data-shared dataCategory="personal"
+    dataType="unrecognized"
+    purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal.xml
new file mode 100644
index 0000000..5907462
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-personal.xml
@@ -0,0 +1,31 @@
+<data-labels>
+    <data-shared dataCategory="personal"
+        dataType="name"
+        ephemeral="true"
+        isSharingOptional="true"
+        purposes="analytics|developer_communications" />
+    <data-shared dataCategory="personal"
+    dataType="email_address"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="physical_address"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="phone_number"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="race_ethnicity"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="political_or_religious_beliefs"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="sexual_orientation_or_gender_identity"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="personal_identifiers"
+    purposes="analytics" />
+    <data-shared dataCategory="personal"
+    dataType="other"
+    purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-photo-video.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-photo-video.xml
new file mode 100644
index 0000000..05fe159
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-photo-video.xml
@@ -0,0 +1,8 @@
+<data-labels>
+    <data-shared dataCategory="photo_video"
+        dataType="photos"
+        purposes="analytics" />
+    <data-shared dataCategory="photo_video"
+        dataType="videos"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-search-and-browsing.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-search-and-browsing.xml
new file mode 100644
index 0000000..a5de7be
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-search-and-browsing.xml
@@ -0,0 +1,5 @@
+<data-labels>
+    <data-shared dataCategory="search_and_browsing"
+        dataType="web_browsing_history"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-storage.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-storage.xml
new file mode 100644
index 0000000..f01e2df
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-storage.xml
@@ -0,0 +1,5 @@
+<data-labels>
+    <data-shared dataCategory="storage"
+        dataType="files_docs"
+        purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized-type.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized-type.xml
new file mode 100644
index 0000000..f1fbd56
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized-type.xml
@@ -0,0 +1,5 @@
+<data-labels>
+    <data-shared dataCategory="personal"
+    dataType="unrecognized"
+    purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized.xml
new file mode 100644
index 0000000..c5be684
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-category-unrecognized.xml
@@ -0,0 +1,5 @@
+<data-labels>
+    <data-shared dataCategory="unrecognized"
+    dataType="email_address"
+    purposes="analytics" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-collected-shared.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-collected-shared.xml
new file mode 100644
index 0000000..161057a
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-collected-shared.xml
@@ -0,0 +1,11 @@
+<data-labels>
+    <data-accessed dataCategory="location"
+        dataType="approx_location"
+        purposes="app_functionality" />
+    <data-collected dataCategory="location"
+        dataType="precise_location"
+        purposes="app_functionality" />
+    <data-shared dataCategory="personal"
+        dataType="name"
+        purposes="app_functionality" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-invalid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-invalid-bool.xml
new file mode 100644
index 0000000..bb45f42
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-invalid-bool.xml
@@ -0,0 +1,7 @@
+<data-labels>
+    <data-accessed dataCategory="location"
+        dataType="approx_location"
+        ephemeral="false"
+        isSharingOptional="false"
+        purposes="app_functionality" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-valid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-valid-bool.xml
new file mode 100644
index 0000000..f927bba
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-accessed-valid-bool.xml
@@ -0,0 +1,6 @@
+<data-labels>
+    <data-accessed dataCategory="location"
+        dataType="approx_location"
+        ephemeral="false"
+        purposes="app_functionality" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-invalid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-invalid-bool.xml
new file mode 100644
index 0000000..ba11afb
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-invalid-bool.xml
@@ -0,0 +1,7 @@
+<data-labels>
+    <data-collected dataCategory="location"
+        dataType="approx_location"
+        ephemeral="false"
+        isSharingOptional="false"
+        purposes="app_functionality" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-valid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-valid-bool.xml
new file mode 100644
index 0000000..4b6d3977
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-collected-valid-bool.xml
@@ -0,0 +1,7 @@
+<data-labels>
+    <data-collected dataCategory="location"
+        dataType="approx_location"
+        ephemeral="false"
+        isCollectionOptional="false"
+        purposes="app_functionality" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-invalid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-invalid-bool.xml
new file mode 100644
index 0000000..7840b98
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-invalid-bool.xml
@@ -0,0 +1,7 @@
+<data-labels>
+    <data-shared dataCategory="location"
+        dataType="approx_location"
+        ephemeral="false"
+        isCollectionOptional="false"
+        purposes="app_functionality" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-valid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-valid-bool.xml
new file mode 100644
index 0000000..ccf77b0
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/hr/data-labels-shared-valid-bool.xml
@@ -0,0 +1,7 @@
+<data-labels>
+    <data-shared dataCategory="location"
+        dataType="approx_location"
+        ephemeral="false"
+        isSharingOptional="false"
+        purposes="app_functionality" />
+</data-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-actions-in-app.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-actions-in-app.xml
new file mode 100644
index 0000000..c5fef58
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-actions-in-app.xml
@@ -0,0 +1,31 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="actions_in_app">
+            <pbundle_as_map name="user_interaction">
+                <int-array name="purposes" num="1">
+                    <item value="2" />
+                </int-array>
+            </pbundle_as_map>
+            <pbundle_as_map name="in_app_search_history">
+                <int-array name="purposes" num="1">
+                    <item value="2" />
+                </int-array>
+            </pbundle_as_map>
+            <pbundle_as_map name="installed_apps">
+                <int-array name="purposes" num="1">
+                    <item value="2" />
+                </int-array>
+            </pbundle_as_map>
+            <pbundle_as_map name="user_generated_content">
+                <int-array name="purposes" num="1">
+                    <item value="2" />
+                </int-array>
+            </pbundle_as_map>
+            <pbundle_as_map name="other">
+                <int-array name="purposes" num="1">
+                    <item value="2" />
+                </int-array>
+            </pbundle_as_map>
+        </pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-app-performance.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-app-performance.xml
new file mode 100644
index 0000000..4570145
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-app-performance.xml
@@ -0,0 +1,21 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="app_performance">
+    <pbundle_as_map name="crash_logs">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="performance_diagnostics">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-audio.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-audio.xml
new file mode 100644
index 0000000..120f626
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-audio.xml
@@ -0,0 +1,21 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="audio">
+    <pbundle_as_map name="sound_recordings">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="music_files">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-calendar.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-calendar.xml
new file mode 100644
index 0000000..59eb938
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-calendar.xml
@@ -0,0 +1,11 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="calendar">
+    <pbundle_as_map name="calendar">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-contacts.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-contacts.xml
new file mode 100644
index 0000000..f952bfb
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-contacts.xml
@@ -0,0 +1,11 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="contacts">
+    <pbundle_as_map name="contacts">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-email-text-message.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-email-text-message.xml
new file mode 100644
index 0000000..bcaa716
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-email-text-message.xml
@@ -0,0 +1,21 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="email_text_message">
+    <pbundle_as_map name="emails">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="text_messages">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-financial.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-financial.xml
new file mode 100644
index 0000000..a7bc82e
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-financial.xml
@@ -0,0 +1,26 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="financial">
+    <pbundle_as_map name="card_bank_account">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="purchase_history">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="credit_score">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-health-fitness.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-health-fitness.xml
new file mode 100644
index 0000000..f3ab2bd9
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-health-fitness.xml
@@ -0,0 +1,16 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="health_fitness">
+    <pbundle_as_map name="health">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="fitness">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-identifiers.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-identifiers.xml
new file mode 100644
index 0000000..05c07e5
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-identifiers.xml
@@ -0,0 +1,11 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="identifiers">
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-location.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-location.xml
new file mode 100644
index 0000000..931d1ad
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-location.xml
@@ -0,0 +1,16 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="location">
+    <pbundle_as_map name="approx_location">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="precise_location">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-empty-purpose.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-empty-purpose.xml
new file mode 100644
index 0000000..83f4a67
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-empty-purpose.xml
@@ -0,0 +1,11 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="personal">
+    <pbundle_as_map name="email_address">
+
+        <int-array name="purposes" num="2">
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-missing-purpose.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-missing-purpose.xml
new file mode 100644
index 0000000..532f5de
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-missing-purpose.xml
@@ -0,0 +1,8 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="personal">
+    <pbundle_as_map name="email_address">
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-partial.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-partial.xml
new file mode 100644
index 0000000..14f9ef2
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal-partial.xml
@@ -0,0 +1,17 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="personal">
+    <pbundle_as_map name="name">
+        <int-array name="purposes" num="2">
+            <item value="2" />
+            <item value="3" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="email_address">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal.xml
new file mode 100644
index 0000000..1c87de9
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-personal.xml
@@ -0,0 +1,54 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="personal">
+    <pbundle_as_map name="name">
+        <int-array name="purposes" num="2">
+            <item value="2" />
+            <item value="3" />
+        </int-array>
+        <boolean name="is_sharing_optional" value="true" />
+        <boolean name="ephemeral" value="true" />
+    </pbundle_as_map>
+    <pbundle_as_map name="email_address">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="physical_address">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="phone_number">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="race_ethnicity">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="political_or_religious_beliefs">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="sexual_orientation_or_gender_identity">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="personal_identifiers">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="other">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-photo-video.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-photo-video.xml
new file mode 100644
index 0000000..a752b51
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-photo-video.xml
@@ -0,0 +1,16 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="photo_video">
+    <pbundle_as_map name="photos">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+    <pbundle_as_map name="videos">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-search-and-browsing.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-search-and-browsing.xml
new file mode 100644
index 0000000..99bc188
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-search-and-browsing.xml
@@ -0,0 +1,11 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="search_and_browsing">
+    <pbundle_as_map name="web_browsing_history">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-storage.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-storage.xml
new file mode 100644
index 0000000..a4d2a62
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-storage.xml
@@ -0,0 +1,11 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="storage">
+    <pbundle_as_map name="files_docs">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-unrecognized-type.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-unrecognized-type.xml
new file mode 100644
index 0000000..16195df
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-unrecognized-type.xml
@@ -0,0 +1,11 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="personal">
+    <pbundle_as_map name="unrecognized">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-unrecognized.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-unrecognized.xml
new file mode 100644
index 0000000..511940e
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-category-unrecognized.xml
@@ -0,0 +1,11 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="unrecognized">
+    <pbundle_as_map name="email_address">
+        <int-array name="purposes" num="1">
+            <item value="2" />
+        </int-array>
+    </pbundle_as_map>
+</pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-accessed-collected-shared.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-accessed-collected-shared.xml
new file mode 100644
index 0000000..f86dbc1
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-accessed-collected-shared.xml
@@ -0,0 +1,29 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_accessed">
+        <pbundle_as_map name="location">
+            <pbundle_as_map name="approx_location">
+                <int-array name="purposes" num="1">
+                    <item value="1"/>
+                </int-array>
+            </pbundle_as_map>
+        </pbundle_as_map>
+    </pbundle_as_map>
+    <pbundle_as_map name="data_collected">
+        <pbundle_as_map name="location">
+            <pbundle_as_map name="precise_location">
+                <int-array name="purposes" num="1">
+                    <item value="1"/>
+                </int-array>
+            </pbundle_as_map>
+        </pbundle_as_map>
+    </pbundle_as_map>
+    <pbundle_as_map name="data_shared">
+        <pbundle_as_map name="personal">
+            <pbundle_as_map name="name">
+                <int-array name="purposes" num="1">
+                    <item value="1"/>
+                </int-array>
+            </pbundle_as_map>
+        </pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-accessed-valid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-accessed-valid-bool.xml
new file mode 100644
index 0000000..ddefc18
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-accessed-valid-bool.xml
@@ -0,0 +1,12 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_accessed">
+        <pbundle_as_map name="location">
+            <pbundle_as_map name="approx_location">
+                <int-array name="purposes" num="1">
+                    <item value="1"/>
+                </int-array>
+                <boolean name="ephemeral" value="false"/>
+            </pbundle_as_map>
+        </pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-collected-invalid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-collected-invalid-bool.xml
new file mode 100644
index 0000000..54cc8e7
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-collected-invalid-bool.xml
@@ -0,0 +1,13 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_collected">
+        <pbundle_as_map name="location">
+            <pbundle_as_map name="approx_location">
+                <int-array name="purposes" num="1">
+                    <item value="1"/>
+                </int-array>
+                <boolean name="is_sharing_optional" value="false"/>
+                <boolean name="ephemeral" value="false"/>
+            </pbundle_as_map>
+        </pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-collected-valid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-collected-valid-bool.xml
new file mode 100644
index 0000000..252c728
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-collected-valid-bool.xml
@@ -0,0 +1,13 @@
+<pbundle_as_map name="data_labels">
+    <pbundle_as_map name="data_collected">
+        <pbundle_as_map name="location">
+            <pbundle_as_map name="approx_location">
+                <int-array name="purposes" num="1">
+                    <item value="1"/>
+                </int-array>
+                <boolean name="is_collection_optional" value="false"/>
+                <boolean name="ephemeral" value="false"/>
+            </pbundle_as_map>
+        </pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-shared-valid-bool.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-shared-valid-bool.xml
new file mode 100644
index 0000000..3864f98
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/datalabels/od/data-labels-shared-valid-bool.xml
@@ -0,0 +1,13 @@
+<pbundle_as_map name="data_labels">
+<pbundle_as_map name="data_shared">
+        <pbundle_as_map name="location">
+            <pbundle_as_map name="approx_location">
+                <int-array name="purposes" num="1">
+                    <item value="1"/>
+                </int-array>
+                <boolean name="is_sharing_optional" value="false"/>
+                <boolean name="ephemeral" value="false"/>
+            </pbundle_as_map>
+        </pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/developerinfo/hr/all-fields-valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/developerinfo/hr/all-fields-valid.xml
new file mode 100644
index 0000000..908d8ea2
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/developerinfo/hr/all-fields-valid.xml
@@ -0,0 +1,8 @@
+<developer-info
+    name="max"
+    email="[email protected]"
+    address="111 blah lane"
+    countryRegion="US"
+    relationship="aosp"
+    website="example.com"
+    registryId="registry_id" />
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/developerinfo/od/all-fields-valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/developerinfo/od/all-fields-valid.xml
new file mode 100644
index 0000000..784ec61
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/developerinfo/od/all-fields-valid.xml
@@ -0,0 +1,9 @@
+<pbundle_as_map name="developer_info">
+    <string name="name" value="max"/>
+    <string name="email" value="[email protected]"/>
+    <string name="address" value="111 blah lane"/>
+    <string name="country_region" value="US"/>
+    <long name="relationship" value="5"/>
+    <string name="website" value="example.com"/>
+    <string name="app_developer_registry_id" value="registry_id"/>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/missing-version.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/missing-version.xml
new file mode 100644
index 0000000..762f3bd
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/missing-version.xml
@@ -0,0 +1,2 @@
+<safety-labels>
+</safety-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/valid-empty.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/valid-empty.xml
new file mode 100644
index 0000000..7decfd4
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/valid-empty.xml
@@ -0,0 +1 @@
+<safety-labels version="12345"></safety-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-data-labels.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-data-labels.xml
new file mode 100644
index 0000000..8997f4f
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-data-labels.xml
@@ -0,0 +1,9 @@
+<safety-labels version="12345">
+    <data-labels>
+        <data-shared dataCategory="location"
+            dataType="approx_location"
+            isSharingOptional="false"
+            ephemeral="false"
+            purposes="app_functionality" />
+    </data-labels>
+</safety-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-security-labels.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-security-labels.xml
new file mode 100644
index 0000000..940e48a
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-security-labels.xml
@@ -0,0 +1,6 @@
+<safety-labels version="12345">
+    <security-labels
+        isDataDeletable="true"
+        isDataEncrypted="false"
+    />
+</safety-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-third-party-verification.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-third-party-verification.xml
new file mode 100644
index 0000000..bfbc5ae
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-third-party-verification.xml
@@ -0,0 +1,4 @@
+<safety-labels version="12345">
+<third-party-verification url="www.example.com">
+    </third-party-verification>
+</safety-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/valid-empty.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/valid-empty.xml
new file mode 100644
index 0000000..4f03d88
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/valid-empty.xml
@@ -0,0 +1,3 @@
+<pbundle_as_map name="safety_labels">
+    <long name="version" value="12345"/>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-data-labels.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-data-labels.xml
new file mode 100644
index 0000000..a966fda
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-data-labels.xml
@@ -0,0 +1,16 @@
+<pbundle_as_map name="safety_labels">
+    <long name="version" value="12345"/>
+    <pbundle_as_map name="data_labels">
+        <pbundle_as_map name="data_shared">
+            <pbundle_as_map name="location">
+                <pbundle_as_map name="approx_location">
+                    <int-array name="purposes" num="1">
+                        <item value="1"/>
+                    </int-array>
+                    <boolean name="is_sharing_optional" value="false"/>
+                    <boolean name="ephemeral" value="false"/>
+                </pbundle_as_map>
+            </pbundle_as_map>
+        </pbundle_as_map>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-security-labels.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-security-labels.xml
new file mode 100644
index 0000000..b39c562b
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-security-labels.xml
@@ -0,0 +1,7 @@
+<pbundle_as_map name="safety_labels">
+    <long name="version" value="12345"/>
+    <pbundle_as_map name="security_labels">
+        <boolean name="is_data_deletable" value="true" />
+        <boolean name="is_data_encrypted" value="false" />
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-third-party-verification.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-third-party-verification.xml
new file mode 100644
index 0000000..10653ff
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-third-party-verification.xml
@@ -0,0 +1,6 @@
+<pbundle_as_map name="safety_labels">
+    <long name="version" value="12345"/>
+    <pbundle_as_map name="third_party_verification">
+        <string name="url" value="www.example.com"/>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/hr/all-fields-valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/hr/all-fields-valid.xml
new file mode 100644
index 0000000..e2fb592
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/hr/all-fields-valid.xml
@@ -0,0 +1,4 @@
+<security-labels
+    isDataDeletable="true"
+    isDataEncrypted="false">
+</security-labels>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/od/all-fields-valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/od/all-fields-valid.xml
new file mode 100644
index 0000000..7b2f656
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/od/all-fields-valid.xml
@@ -0,0 +1,4 @@
+<pbundle_as_map name="security_labels">
+    <boolean name="is_data_deletable" value="true" />
+    <boolean name="is_data_encrypted" value="false" />
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/missing-url.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/missing-url.xml
new file mode 100644
index 0000000..ff26c05
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/missing-url.xml
@@ -0,0 +1 @@
+<system-app-safety-label></system-app-safety-label>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/valid.xml
new file mode 100644
index 0000000..6fe86c3
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/hr/valid.xml
@@ -0,0 +1 @@
+<system-app-safety-label url="www.example.com"></system-app-safety-label>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/valid.xml
new file mode 100644
index 0000000..f96535b
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/valid.xml
@@ -0,0 +1,3 @@
+<pbundle_as_map name="system_app_safety_label">
+    <string name="url" value="www.example.com"/>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/missing-url.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/missing-url.xml
new file mode 100644
index 0000000..6738ac2
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/missing-url.xml
@@ -0,0 +1 @@
+<third-party-verification></third-party-verification>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/valid.xml
new file mode 100644
index 0000000..2a664f2
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/valid.xml
@@ -0,0 +1 @@
+<third-party-verification url="www.example.com"></third-party-verification>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/od/valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/od/valid.xml
new file mode 100644
index 0000000..dbeb592
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/od/valid.xml
@@ -0,0 +1,3 @@
+<pbundle_as_map name="third_party_verification">
+    <string name="url" value="www.example.com"/>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/valid-empty.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/valid-empty.xml
new file mode 100644
index 0000000..254a37f
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/valid-empty.xml
@@ -0,0 +1,4 @@
+
+<transparency-info>
+
+</transparency-info>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/with-app-info.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/with-app-info.xml
new file mode 100644
index 0000000..a7c48fc
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/with-app-info.xml
@@ -0,0 +1,4 @@
+
+<transparency-info>
+    <app-info title="beervision" description="a beer app" containsAds="true" obeyAps="false" adsFingerprinting="false" securityFingerprinting="false" privacyPolicy="www.example.com" securityEndpoints="url1|url2|url3" firstPartyEndpoints="url1" serviceProviderEndpoints="url55|url56" category="Food and drink" email="[email protected]" />
+</transparency-info>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/with-developer-info.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/with-developer-info.xml
new file mode 100644
index 0000000..862bda4
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/with-developer-info.xml
@@ -0,0 +1,11 @@
+
+<transparency-info>
+    <developer-info
+        name="max"
+        email="[email protected]"
+        address="111 blah lane"
+        countryRegion="US"
+        relationship="aosp"
+        website="example.com"
+        appDeveloperRegistryId="registry_id" />
+</transparency-info>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/valid-empty.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/valid-empty.xml
new file mode 100644
index 0000000..af574cf
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/valid-empty.xml
@@ -0,0 +1 @@
+<pbundle_as_map name="transparency_info"/>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/with-app-info.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/with-app-info.xml
new file mode 100644
index 0000000..b813641
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/with-app-info.xml
@@ -0,0 +1,26 @@
+
+<pbundle_as_map name="transparency_info">
+    <pbundle_as_map name="app_info">
+        <string name="title" value="beervision"/>
+        <string name="description" value="a beer app"/>
+        <boolean name="contains_ads" value="true"/>
+        <boolean name="obey_aps" value="false"/>
+        <boolean name="ads_fingerprinting" value="false"/>
+        <boolean name="security_fingerprinting" value="false"/>
+        <string name="privacy_policy" value="www.example.com"/>
+        <string-array name="security_endpoint" num="3">
+            <item value="url1"/>
+            <item value="url2"/>
+            <item value="url3"/>
+        </string-array>
+        <string-array name="first_party_endpoint" num="1">
+            <item value="url1"/>
+        </string-array>
+        <string-array name="service_provider_endpoint" num="2">
+            <item value="url55"/>
+            <item value="url56"/>
+        </string-array>
+        <string name="category" value="Food and drink"/>
+        <string name="email" value="[email protected]"/>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/with-developer-info.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/with-developer-info.xml
new file mode 100644
index 0000000..101c98b
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/with-developer-info.xml
@@ -0,0 +1,11 @@
+
+<pbundle_as_map name="transparency_info">
+    <pbundle_as_map name="developer_info">
+        <string name="name" value="max"/>
+        <string name="email" value="[email protected]"/>
+        <string name="address" value="111 blah lane"/>
+        <string name="country_region" value="US"/>
+        <long name="relationship" value="5"/>
+        <string name="website" value="example.com"/>
+    </pbundle_as_map>
+</pbundle_as_map>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/contacts/hr.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/contacts/hr.xml
new file mode 100644
index 0000000..b2ff449
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/contacts/hr.xml
@@ -0,0 +1,11 @@
+<app-metadata-bundles version="123">
+    <safety-labels version="12345">
+        <data-labels>
+            <data-shared dataCategory="contacts"
+                dataType="contacts"
+                isSharingOptional="false"
+                ephemeral="true"
+                purposes="analytics" />
+        </data-labels>
+    </safety-labels>
+</app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/contacts/od.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/contacts/od.xml
new file mode 100644
index 0000000..81277bf
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/contacts/od.xml
@@ -0,0 +1,19 @@
+<bundle>
+    <long name="version" value="123"/>
+    <pbundle_as_map name="safety_labels">
+        <long name="version" value="12345"/>
+        <pbundle_as_map name="data_labels">
+            <pbundle_as_map name="data_shared">
+                <pbundle_as_map name="contacts">
+                    <pbundle_as_map name="contacts">
+                        <int-array name="purposes" num="1">
+                            <item value="2"/>
+                        </int-array>
+                        <boolean name="is_sharing_optional" value="false"/>
+                        <boolean name="ephemeral" value="true"/>
+                    </pbundle_as_map>
+                </pbundle_as_map>
+            </pbundle_as_map>
+        </pbundle_as_map>
+    </pbundle_as_map>
+</bundle>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml
new file mode 100644
index 0000000..36beb93
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml
@@ -0,0 +1,35 @@
+<app-metadata-bundles version="123">
+    <system-app-safety-label url="www.example.com">
+    </system-app-safety-label>
+    <safety-labels version="12345">
+        <data-labels>
+            <data-shared dataCategory="location"
+                dataType="approx_location"
+                isSharingOptional="false"
+                ephemeral="false"
+                purposes="app_functionality" />
+            <data-shared dataCategory="location"
+                dataType="precise_location"
+                isSharingOptional="true"
+                ephemeral="true"
+                purposes="app_functionality|analytics" />
+        </data-labels>
+        <security-labels
+            isDataDeletable="true"
+            isDataEncrypted="false"
+        />
+        <third-party-verification url="www.example.com">
+        </third-party-verification>
+    </safety-labels>
+    <transparency-info>
+        <developer-info
+            name="max"
+            email="[email protected]"
+            address="111 blah lane"
+            countryRegion="US"
+            relationship="aosp"
+            website="example.com"
+            appDeveloperRegistryId="registry_id" />
+        <app-info title="beervision" description="a beer app" containsAds="true" obeyAps="false" adsFingerprinting="false" securityFingerprinting="false" privacyPolicy="www.example.com" securityEndpoints="url1|url2|url3" firstPartyEndpoints="url1" serviceProviderEndpoints="url55|url56" category="Food and drink" email="[email protected]" />
+    </transparency-info>
+</app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml
new file mode 100644
index 0000000..db21280
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml
@@ -0,0 +1,70 @@
+<bundle>
+    <long name="version" value="123"/>
+    <pbundle_as_map name="safety_labels">
+        <long name="version" value="12345"/>
+        <pbundle_as_map name="data_labels">
+            <pbundle_as_map name="data_shared">
+                <pbundle_as_map name="location">
+                    <pbundle_as_map name="approx_location">
+                        <int-array name="purposes" num="1">
+                            <item value="1"/>
+                        </int-array>
+                        <boolean name="is_sharing_optional" value="false"/>
+                        <boolean name="ephemeral" value="false"/>
+                    </pbundle_as_map>
+                    <pbundle_as_map name="precise_location">
+                        <int-array name="purposes" num="2">
+                            <item value="1"/>
+                            <item value="2"/>
+                        </int-array>
+                        <boolean name="is_sharing_optional" value="true"/>
+                        <boolean name="ephemeral" value="true"/>
+                    </pbundle_as_map>
+                </pbundle_as_map>
+            </pbundle_as_map>
+        </pbundle_as_map>
+        <pbundle_as_map name="security_labels">
+            <boolean name="is_data_deletable" value="true"/>
+            <boolean name="is_data_encrypted" value="false"/>
+        </pbundle_as_map>
+        <pbundle_as_map name="third_party_verification">
+            <string name="url" value="www.example.com"/>
+        </pbundle_as_map>
+    </pbundle_as_map>
+    <pbundle_as_map name="system_app_safety_label">
+        <string name="url" value="www.example.com"/>
+    </pbundle_as_map>
+    <pbundle_as_map name="transparency_info">
+        <pbundle_as_map name="developer_info">
+            <string name="name" value="max"/>
+            <string name="email" value="[email protected]"/>
+            <string name="address" value="111 blah lane"/>
+            <string name="country_region" value="US"/>
+            <long name="relationship" value="5"/>
+            <string name="website" value="example.com"/>
+        </pbundle_as_map>
+        <pbundle_as_map name="app_info">
+            <string name="title" value="beervision"/>
+            <string name="description" value="a beer app"/>
+            <boolean name="contains_ads" value="true"/>
+            <boolean name="obey_aps" value="false"/>
+            <boolean name="ads_fingerprinting" value="false"/>
+            <boolean name="security_fingerprinting" value="false"/>
+            <string name="privacy_policy" value="www.example.com"/>
+            <string-array name="security_endpoint" num="3">
+                <item value="url1"/>
+                <item value="url2"/>
+                <item value="url3"/>
+            </string-array>
+            <string-array name="first_party_endpoint" num="1">
+                <item value="url1"/>
+            </string-array>
+            <string-array name="service_provider_endpoint" num="2">
+                <item value="url55"/>
+                <item value="url56"/>
+            </string-array>
+            <string name="category" value="Food and drink"/>
+            <string name="email" value="[email protected]"/>
+        </pbundle_as_map>
+    </pbundle_as_map>
+</bundle>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/location/hr.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/location/hr.xml
new file mode 100644
index 0000000..ac844b3
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/location/hr.xml
@@ -0,0 +1,16 @@
+<app-metadata-bundles version="123">
+    <safety-labels version="12345">
+        <data-labels>
+            <data-shared dataCategory="location"
+                dataType="precise_location"
+                isSharingOptional="true"
+                ephemeral="true"
+                purposes="app_functionality|analytics" />
+            <data-shared dataCategory="location"
+                dataType="approx_location"
+                isSharingOptional="false"
+                ephemeral="false"
+                purposes="app_functionality" />
+        </data-labels>
+    </safety-labels>
+</app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/location/od.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/location/od.xml
new file mode 100644
index 0000000..d0a3bfa
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/location/od.xml
@@ -0,0 +1,27 @@
+<bundle>
+    <long name="version" value="123"/>
+    <pbundle_as_map name="safety_labels">
+        <long name="version" value="12345"/>
+        <pbundle_as_map name="data_labels">
+            <pbundle_as_map name="data_shared">
+                <pbundle_as_map name="location">
+                    <pbundle_as_map name="precise_location">
+                        <int-array name="purposes" num="2">
+                            <item value="1"/>
+                            <item value="2"/>
+                        </int-array>
+                        <boolean name="is_sharing_optional" value="true"/>
+                        <boolean name="ephemeral" value="true"/>
+                    </pbundle_as_map>
+                    <pbundle_as_map name="approx_location">
+                        <int-array name="purposes" num="1">
+                            <item value="1"/>
+                        </int-array>
+                        <boolean name="is_sharing_optional" value="false"/>
+                        <boolean name="ephemeral" value="false"/>
+                    </pbundle_as_map>
+                </pbundle_as_map>
+            </pbundle_as_map>
+        </pbundle_as_map>
+    </pbundle_as_map>
+</bundle>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/test.xml b/tools/app_metadata_bundles/src/test/resources/test.xml
new file mode 100644
index 0000000..202cc1e
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/test.xml
@@ -0,0 +1,16 @@
+<app-metadata-bundles>
+    <safety-labels version="12345">
+        <data-labels>
+            <data-shared dataCategory="location"
+                dataType="precise_location"
+                isSharingOptional="true"
+                ephemeral="true"
+                purposes="app_functionality|analytics" />
+            <data-shared dataCategory="location"
+                dataType="approx_location"
+                isSharingOptional="false"
+                ephemeral="false"
+                purposes="app_functionality" />
+        </data-labels>
+    </safety-labels>
+</app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/hoststubgen/hoststubgen/Android.bp b/tools/hoststubgen/hoststubgen/Android.bp
index 30333da..682adbc 100644
--- a/tools/hoststubgen/hoststubgen/Android.bp
+++ b/tools/hoststubgen/hoststubgen/Android.bp
@@ -82,13 +82,30 @@
     jarjar_rules: "jarjar-rules.txt",
 }
 
-// Host-side stub generator tool.
-java_binary_host {
-    name: "hoststubgen",
-    main_class: "com.android.hoststubgen.Main",
+// For sharing the code with other tools
+java_library_host {
+    name: "hoststubgen-lib",
+    defaults: ["ravenwood-internal-only-visibility-java"],
     srcs: ["src/**/*.kt"],
     static_libs: [
         "hoststubgen-helper-runtime",
+    ],
+    libs: [
+        "junit",
+        "ow2-asm",
+        "ow2-asm-analysis",
+        "ow2-asm-commons",
+        "ow2-asm-tree",
+        "ow2-asm-util",
+    ],
+}
+
+// Host-side stub generator tool.
+java_binary_host {
+    name: "hoststubgen",
+    main_class: "com.android.hoststubgen.HostStubGenMain",
+    static_libs: [
+        "hoststubgen-lib",
         "junit",
         "ow2-asm",
         "ow2-asm-analysis",
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
index 1089f82..803dc28 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
@@ -32,7 +32,6 @@
 import org.objectweb.asm.ClassReader
 import org.objectweb.asm.ClassVisitor
 import org.objectweb.asm.ClassWriter
-import org.objectweb.asm.tree.ClassNode
 import org.objectweb.asm.util.CheckClassAdapter
 import java.io.BufferedInputStream
 import java.io.FileOutputStream
@@ -52,7 +51,7 @@
         val stats = HostStubGenStats()
 
         // Load all classes.
-        val allClasses = loadClassStructures(options.inJar.get)
+        val allClasses = ClassNodes.loadClassStructures(options.inJar.get)
 
         // Dump the classes, if specified.
         options.inputJarDumpFile.ifSet {
@@ -92,55 +91,6 @@
     }
 
     /**
-     * Load all the classes, without code.
-     */
-    private fun loadClassStructures(inJar: String): ClassNodes {
-        log.i("Reading class structure from $inJar ...")
-        val start = System.currentTimeMillis()
-
-        val allClasses = ClassNodes()
-
-        log.withIndent {
-            ZipFile(inJar).use { inZip ->
-                val inEntries = inZip.entries()
-
-                while (inEntries.hasMoreElements()) {
-                    val entry = inEntries.nextElement()
-
-                    BufferedInputStream(inZip.getInputStream(entry)).use { bis ->
-                        if (entry.name.endsWith(".class")) {
-                            val cr = ClassReader(bis)
-                            val cn = ClassNode()
-                            cr.accept(cn, ClassReader.SKIP_CODE or ClassReader.SKIP_DEBUG
-                                    or ClassReader.SKIP_FRAMES)
-                            if (!allClasses.addClass(cn)) {
-                                log.w("Duplicate class found: ${cn.name}")
-                            }
-                        } else if (entry.name.endsWith(".dex")) {
-                            // Seems like it's an ART jar file. We can't process it.
-                            // It's a fatal error.
-                            throw InvalidJarFileException(
-                                    "$inJar is not a desktop jar file. It contains a *.dex file.")
-                        } else {
-                            // Unknown file type. Skip.
-                            while (bis.available() > 0) {
-                                bis.skip((1024 * 1024).toLong())
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        if (allClasses.size == 0) {
-            log.w("$inJar contains no *.class files.")
-        }
-
-        val end = System.currentTimeMillis()
-        log.i("Done reading class structure in %.1f second(s).", (end - start) / 1000.0)
-        return allClasses
-    }
-
-    /**
      * Build the filter, which decides what classes/methods/fields should be put in stub or impl
      * jars, and "how". (e.g. with substitution?)
      */
@@ -229,7 +179,7 @@
         val intersectingJars = mutableMapOf<String, ClassNodes>()
 
         filenames.forEach { filename ->
-            intersectingJars[filename] = loadClassStructures(filename)
+            intersectingJars[filename] = ClassNodes.loadClassStructures(filename)
         }
         return intersectingJars
     }
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenMain.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenMain.kt
new file mode 100644
index 0000000..45e7e30
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenMain.kt
@@ -0,0 +1,57 @@
+/*
+ * 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:JvmName("HostStubGenMain")
+
+package com.android.hoststubgen
+
+import java.io.PrintWriter
+
+/**
+ * Entry point.
+ */
+fun main(args: Array<String>) {
+    executableName = "HostStubGen"
+
+    var success = false
+    var clanupOnError = false
+
+    try {
+        // Parse the command line arguments.
+        val options = HostStubGenOptions.parseArgs(args)
+        clanupOnError = options.cleanUpOnError.get
+
+        log.v("$executableName started")
+        log.v("Options: $options")
+
+        // Run.
+        HostStubGen(options).run()
+
+        success = true
+    } catch (e: Throwable) {
+        log.e("$executableName: Error: ${e.message}")
+        if (e !is UserErrorException) {
+            e.printStackTrace(PrintWriter(log.getWriter(LogLevel.Error)))
+        }
+        if (clanupOnError) {
+            TODO("Remove output jars here")
+        }
+    } finally {
+        log.i("$executableName finished")
+        log.flush()
+    }
+
+    System.exit(if (success) 0 else 1 )
+}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
index 9f5d524..9ff798a 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
@@ -268,7 +268,7 @@
             }
             if (!ret.outStubJar.isSet && !ret.outImplJar.isSet) {
                 log.w("Neither --out-stub-jar nor --out-impl-jar is set." +
-                        " $COMMAND_NAME will not generate jar files.")
+                        " $executableName will not generate jar files.")
             }
 
             if (ret.enableNonStubMethodCallDetection.get) {
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt
deleted file mode 100644
index 4882c00..0000000
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt
+++ /dev/null
@@ -1,57 +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.
- */
-@file:JvmName("Main")
-
-package com.android.hoststubgen
-
-import java.io.PrintWriter
-
-const val COMMAND_NAME = "HostStubGen"
-
-/**
- * Entry point.
- */
-fun main(args: Array<String>) {
-    var success = false
-    var clanupOnError = false
-
-    try {
-        // Parse the command line arguments.
-        val options = HostStubGenOptions.parseArgs(args)
-        clanupOnError = options.cleanUpOnError.get
-
-        log.v("HostStubGen started")
-        log.v("Options: $options")
-
-        // Run.
-        HostStubGen(options).run()
-
-        success = true
-    } catch (e: Throwable) {
-        log.e("$COMMAND_NAME: Error: ${e.message}")
-        if (e !is UserErrorException) {
-            e.printStackTrace(PrintWriter(log.getWriter(LogLevel.Error)))
-        }
-        if (clanupOnError) {
-            TODO("Remove output jars here")
-        }
-    } finally {
-        log.i("$COMMAND_NAME finished")
-        log.flush()
-    }
-
-    System.exit(if (success) 0 else 1 )
-}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Utils.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Utils.kt
index 937e56c..aa63d8d9 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Utils.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Utils.kt
@@ -16,6 +16,11 @@
 package com.android.hoststubgen
 
 /**
+ * Name of this executable. Set it in the main method.
+ */
+var executableName = "[command name not set]"
+
+/**
  * A regex that maches whitespate.
  */
 val whitespaceRegex = """\s+""".toRegex()
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt
index 0579c2b..83e122f 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt
@@ -34,6 +34,9 @@
 /** Descriptor of the class initializer method. */
 val CLASS_INITIALIZER_DESC = "()V"
 
+/** Name of constructors. */
+val CTOR_NAME = "<init>"
+
 /**
  * Find any of [anyAnnotations] from the list of visible / invisible annotations.
  */
@@ -135,10 +138,10 @@
         // Note, long and double will consume two local variable spaces, so the extra `i++`.
         when (type) {
             Type.VOID_TYPE -> throw HostStubGenInternalException("VOID_TYPE not expected")
-            Type.BOOLEAN_TYPE, Type.INT_TYPE, Type.SHORT_TYPE, Type.CHAR_TYPE
+            Type.BOOLEAN_TYPE, Type.CHAR_TYPE, Type.BYTE_TYPE, Type.SHORT_TYPE, Type.INT_TYPE
                 -> writer.visitVarInsn(Opcodes.ILOAD, i)
-            Type.LONG_TYPE -> writer.visitVarInsn(Opcodes.LLOAD, i++)
             Type.FLOAT_TYPE -> writer.visitVarInsn(Opcodes.FLOAD, i)
+            Type.LONG_TYPE -> writer.visitVarInsn(Opcodes.LLOAD, i++)
             Type.DOUBLE_TYPE -> writer.visitVarInsn(Opcodes.DLOAD, i++)
             else -> writer.visitVarInsn(Opcodes.ALOAD, i)
         }
@@ -154,10 +157,10 @@
         // See https://en.wikipedia.org/wiki/List_of_Java_bytecode_instructions
         when (type) {
             Type.VOID_TYPE -> writer.visitInsn(Opcodes.RETURN)
-            Type.BOOLEAN_TYPE, Type.INT_TYPE, Type.SHORT_TYPE, Type.CHAR_TYPE
+            Type.BOOLEAN_TYPE, Type.CHAR_TYPE, Type.BYTE_TYPE, Type.SHORT_TYPE, Type.INT_TYPE
                 -> writer.visitInsn(Opcodes.IRETURN)
-            Type.LONG_TYPE -> writer.visitInsn(Opcodes.LRETURN)
             Type.FLOAT_TYPE -> writer.visitInsn(Opcodes.FRETURN)
+            Type.LONG_TYPE -> writer.visitInsn(Opcodes.LRETURN)
             Type.DOUBLE_TYPE -> writer.visitInsn(Opcodes.DRETURN)
             else -> writer.visitInsn(Opcodes.ARETURN)
         }
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/ClassNodes.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/ClassNodes.kt
index bc34ef0..92906a7 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/ClassNodes.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/ClassNodes.kt
@@ -16,13 +16,18 @@
 package com.android.hoststubgen.asm
 
 import com.android.hoststubgen.ClassParseException
+import com.android.hoststubgen.InvalidJarFileException
+import com.android.hoststubgen.log
+import org.objectweb.asm.ClassReader
 import org.objectweb.asm.tree.AnnotationNode
 import org.objectweb.asm.tree.ClassNode
 import org.objectweb.asm.tree.FieldNode
 import org.objectweb.asm.tree.MethodNode
 import org.objectweb.asm.tree.TypeAnnotationNode
+import java.io.BufferedInputStream
 import java.io.PrintWriter
 import java.util.Arrays
+import java.util.zip.ZipFile
 
 /**
  * Stores all classes loaded from a jar file, in a form of [ClassNode]
@@ -62,8 +67,8 @@
 
     /** Find a field, which may not exist. */
     fun findField(
-            className: String,
-            fieldName: String,
+        className: String,
+        fieldName: String,
     ): FieldNode? {
         return findClass(className)?.fields?.firstOrNull { it.name == fieldName }?.let { fn ->
             return fn
@@ -72,14 +77,14 @@
 
     /** Find a method, which may not exist. */
     fun findMethod(
-            className: String,
-            methodName: String,
-            descriptor: String,
+        className: String,
+        methodName: String,
+        descriptor: String,
     ): MethodNode? {
         return findClass(className)?.methods
-                ?.firstOrNull { it.name == methodName && it.desc == descriptor }?.let { mn ->
-            return mn
-        }
+            ?.firstOrNull { it.name == methodName && it.desc == descriptor }?.let { mn ->
+                return mn
+            }
     }
 
     /** @return true if a class has a class initializer. */
@@ -106,26 +111,33 @@
 
     private fun dumpClass(pw: PrintWriter, cn: ClassNode) {
         pw.printf("Class: %s [access: %x]\n", cn.name, cn.access)
-        dumpAnnotations(pw, "  ",
-                cn.visibleTypeAnnotations, cn.invisibleTypeAnnotations,
-                cn.visibleAnnotations, cn.invisibleAnnotations,
-                )
+        dumpAnnotations(
+            pw, "  ",
+            cn.visibleTypeAnnotations, cn.invisibleTypeAnnotations,
+            cn.visibleAnnotations, cn.invisibleAnnotations,
+        )
 
         for (f in cn.fields ?: emptyList()) {
-            pw.printf("  Field: %s [sig: %s] [desc: %s] [access: %x]\n",
-                    f.name, f.signature, f.desc, f.access)
-            dumpAnnotations(pw, "    ",
-                    f.visibleTypeAnnotations, f.invisibleTypeAnnotations,
-                    f.visibleAnnotations, f.invisibleAnnotations,
-                    )
+            pw.printf(
+                "  Field: %s [sig: %s] [desc: %s] [access: %x]\n",
+                f.name, f.signature, f.desc, f.access
+            )
+            dumpAnnotations(
+                pw, "    ",
+                f.visibleTypeAnnotations, f.invisibleTypeAnnotations,
+                f.visibleAnnotations, f.invisibleAnnotations,
+            )
         }
         for (m in cn.methods ?: emptyList()) {
-            pw.printf("  Method: %s [sig: %s] [desc: %s] [access: %x]\n",
-                    m.name, m.signature, m.desc, m.access)
-            dumpAnnotations(pw, "    ",
-                    m.visibleTypeAnnotations, m.invisibleTypeAnnotations,
-                    m.visibleAnnotations, m.invisibleAnnotations,
-                    )
+            pw.printf(
+                "  Method: %s [sig: %s] [desc: %s] [access: %x]\n",
+                m.name, m.signature, m.desc, m.access
+            )
+            dumpAnnotations(
+                pw, "    ",
+                m.visibleTypeAnnotations, m.invisibleTypeAnnotations,
+                m.visibleAnnotations, m.invisibleAnnotations,
+            )
         }
     }
 
@@ -136,7 +148,7 @@
         invisibleTypeAnnotations: List<TypeAnnotationNode>?,
         visibleAnnotations: List<AnnotationNode>?,
         invisibleAnnotations: List<AnnotationNode>?,
-        ) {
+    ) {
         for (an in visibleTypeAnnotations ?: emptyList()) {
             pw.printf("%sTypeAnnotation(vis): %s\n", prefix, an.desc)
         }
@@ -166,4 +178,55 @@
             }
         }
     }
+
+    companion object {
+        /**
+         * Load all the classes, without code.
+         */
+        fun loadClassStructures(inJar: String): ClassNodes {
+            log.i("Reading class structure from $inJar ...")
+            val start = System.currentTimeMillis()
+
+            val allClasses = ClassNodes()
+
+            log.withIndent {
+                ZipFile(inJar).use { inZip ->
+                    val inEntries = inZip.entries()
+
+                    while (inEntries.hasMoreElements()) {
+                        val entry = inEntries.nextElement()
+
+                        BufferedInputStream(inZip.getInputStream(entry)).use { bis ->
+                            if (entry.name.endsWith(".class")) {
+                                val cr = ClassReader(bis)
+                                val cn = ClassNode()
+                                cr.accept(cn, ClassReader.SKIP_CODE or ClassReader.SKIP_DEBUG
+                                        or ClassReader.SKIP_FRAMES)
+                                if (!allClasses.addClass(cn)) {
+                                    log.w("Duplicate class found: ${cn.name}")
+                                }
+                            } else if (entry.name.endsWith(".dex")) {
+                                // Seems like it's an ART jar file. We can't process it.
+                                // It's a fatal error.
+                                throw InvalidJarFileException(
+                                    "$inJar is not a desktop jar file. It contains a *.dex file.")
+                            } else {
+                                // Unknown file type. Skip.
+                                while (bis.available() > 0) {
+                                    bis.skip((1024 * 1024).toLong())
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            if (allClasses.size == 0) {
+                log.w("$inJar contains no *.class files.")
+            }
+
+            val end = System.currentTimeMillis()
+            log.i("Done reading class structure in %.1f second(s).", (end - start) / 1000.0)
+            return allClasses
+        }
+    }
 }
\ No newline at end of file
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt
index 78b13fd..5a26fc6 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt
@@ -19,14 +19,14 @@
 import com.android.hoststubgen.HostStubGenInternalException
 import com.android.hoststubgen.asm.CLASS_INITIALIZER_DESC
 import com.android.hoststubgen.asm.CLASS_INITIALIZER_NAME
-import com.android.hoststubgen.asm.isAnonymousInnerClass
-import com.android.hoststubgen.log
 import com.android.hoststubgen.asm.ClassNodes
 import com.android.hoststubgen.asm.isAnnotation
+import com.android.hoststubgen.asm.isAnonymousInnerClass
 import com.android.hoststubgen.asm.isAutoGeneratedEnumMember
 import com.android.hoststubgen.asm.isEnum
 import com.android.hoststubgen.asm.isSynthetic
 import com.android.hoststubgen.asm.isVisibilityPrivateOrPackagePrivate
+import com.android.hoststubgen.log
 import org.objectweb.asm.tree.ClassNode
 
 /**
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt
index f70a17d..fa8fe6c 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt
@@ -1833,7 +1833,7 @@
   flags: (0x0021) ACC_PUBLIC, ACC_SUPER
   this_class: #x                         // com/android/hoststubgen/test/tinyframework/TinyFrameworkNative
   super_class: #x                         // java/lang/Object
-  interfaces: 0, fields: 1, methods: 10, attributes: 2
+  interfaces: 0, fields: 1, methods: 11, attributes: 2
   int value;
     descriptor: I
     flags: (0x0000)
@@ -1938,6 +1938,10 @@
          x: invokespecial #x                 // Method java/lang/RuntimeException."<init>":()V
          x: athrow
       LineNumberTable:
+
+  public static native byte nativeBytePlus(byte, byte);
+    descriptor: (BB)B
+    flags: (0x0109) ACC_PUBLIC, ACC_STATIC, ACC_NATIVE
 }
 SourceFile: "TinyFrameworkNative.java"
 RuntimeInvisibleAnnotations:
@@ -1955,7 +1959,7 @@
   flags: (0x0021) ACC_PUBLIC, ACC_SUPER
   this_class: #x                         // com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host
   super_class: #x                         // java/lang/Object
-  interfaces: 0, fields: 0, methods: 4, attributes: 2
+  interfaces: 0, fields: 0, methods: 5, attributes: 2
   public com.android.hoststubgen.test.tinyframework.TinyFrameworkNative_host();
     descriptor: ()V
     flags: (0x0001) ACC_PUBLIC
@@ -2013,6 +2017,22 @@
         Start  Length  Slot  Name   Signature
             0       7     0 source   Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
             0       7     1   arg   I
+
+  public static byte nativeBytePlus(byte, byte);
+    descriptor: (BB)B
+    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+    Code:
+      stack=2, locals=2, args_size=2
+         x: iload_0
+         x: iload_1
+         x: iadd
+         x: i2b
+         x: ireturn
+      LineNumberTable:
+      LocalVariableTable:
+        Start  Length  Slot  Name   Signature
+            0       5     0  arg1   B
+            0       5     1  arg2   B
 }
 SourceFile: "TinyFrameworkNative_host.java"
 RuntimeInvisibleAnnotations:
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
index 37de857..c605f76 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
@@ -1554,7 +1554,7 @@
   flags: (0x0021) ACC_PUBLIC, ACC_SUPER
   this_class: #x                          // com/android/hoststubgen/test/tinyframework/TinyFrameworkNative
   super_class: #x                         // java/lang/Object
-  interfaces: 0, fields: 1, methods: 9, attributes: 3
+  interfaces: 0, fields: 1, methods: 10, attributes: 3
   int value;
     descriptor: I
     flags: (0x0000)
@@ -1686,6 +1686,15 @@
         com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
       x: #x()
         com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
+
+  public static native byte nativeBytePlus(byte, byte);
+    descriptor: (BB)B
+    flags: (0x0109) ACC_PUBLIC, ACC_STATIC, ACC_NATIVE
+    RuntimeVisibleAnnotations:
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
 }
 SourceFile: "TinyFrameworkNative.java"
 RuntimeVisibleAnnotations:
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
index c9c607c..11d5939 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
@@ -2236,7 +2236,7 @@
   flags: (0x0021) ACC_PUBLIC, ACC_SUPER
   this_class: #x                          // com/android/hoststubgen/test/tinyframework/TinyFrameworkNative
   super_class: #x                         // java/lang/Object
-  interfaces: 0, fields: 1, methods: 10, attributes: 3
+  interfaces: 0, fields: 1, methods: 11, attributes: 3
   int value;
     descriptor: I
     flags: (0x0000)
@@ -2435,6 +2435,23 @@
         com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
       x: #x()
         com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
+
+  public static byte nativeBytePlus(byte, byte);
+    descriptor: (BB)B
+    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+    Code:
+      stack=2, locals=2, args_size=2
+         x: iload_0
+         x: iload_1
+         x: invokestatic  #x                 // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeBytePlus:(BB)B
+         x: ireturn
+    RuntimeVisibleAnnotations:
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
 }
 SourceFile: "TinyFrameworkNative.java"
 RuntimeVisibleAnnotations:
@@ -2457,7 +2474,7 @@
   flags: (0x0021) ACC_PUBLIC, ACC_SUPER
   this_class: #x                          // com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host
   super_class: #x                         // java/lang/Object
-  interfaces: 0, fields: 0, methods: 4, attributes: 3
+  interfaces: 0, fields: 0, methods: 5, attributes: 3
   public com.android.hoststubgen.test.tinyframework.TinyFrameworkNative_host();
     descriptor: ()V
     flags: (0x0001) ACC_PUBLIC
@@ -2551,6 +2568,31 @@
     RuntimeVisibleAnnotations:
       x: #x()
         com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
+
+  public static byte nativeBytePlus(byte, byte);
+    descriptor: (BB)B
+    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+    Code:
+      stack=4, locals=2, args_size=2
+         x: ldc           #x                 // String com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host
+         x: ldc           #x                 // String nativeBytePlus
+         x: ldc           #x                 // String (BB)B
+         x: invokestatic  #x                 // Method com/android/hoststubgen/hosthelper/HostTestUtils.getStackWalker:()Ljava/lang/StackWalker;
+         x: invokevirtual #x                 // Method java/lang/StackWalker.getCallerClass:()Ljava/lang/Class;
+        x: invokestatic  #x                 // Method com/android/hoststubgen/hosthelper/HostTestUtils.onNonStubMethodCalled:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)V
+        x: iload_0
+        x: iload_1
+        x: iadd
+        x: i2b
+        x: ireturn
+      LineNumberTable:
+      LocalVariableTable:
+        Start  Length  Slot  Name   Signature
+           15       5     0  arg1   B
+           15       5     1  arg2   B
+    RuntimeVisibleAnnotations:
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
 }
 SourceFile: "TinyFrameworkNative_host.java"
 RuntimeVisibleAnnotations:
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
index 37de857..c605f76 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
@@ -1554,7 +1554,7 @@
   flags: (0x0021) ACC_PUBLIC, ACC_SUPER
   this_class: #x                          // com/android/hoststubgen/test/tinyframework/TinyFrameworkNative
   super_class: #x                         // java/lang/Object
-  interfaces: 0, fields: 1, methods: 9, attributes: 3
+  interfaces: 0, fields: 1, methods: 10, attributes: 3
   int value;
     descriptor: I
     flags: (0x0000)
@@ -1686,6 +1686,15 @@
         com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
       x: #x()
         com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
+
+  public static native byte nativeBytePlus(byte, byte);
+    descriptor: (BB)B
+    flags: (0x0109) ACC_PUBLIC, ACC_STATIC, ACC_NATIVE
+    RuntimeVisibleAnnotations:
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
 }
 SourceFile: "TinyFrameworkNative.java"
 RuntimeVisibleAnnotations:
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
index a57907d..088bc80 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
@@ -2743,7 +2743,7 @@
   flags: (0x0021) ACC_PUBLIC, ACC_SUPER
   this_class: #x                          // com/android/hoststubgen/test/tinyframework/TinyFrameworkNative
   super_class: #x                         // java/lang/Object
-  interfaces: 0, fields: 1, methods: 11, attributes: 3
+  interfaces: 0, fields: 1, methods: 12, attributes: 3
   int value;
     descriptor: I
     flags: (0x0000)
@@ -3002,6 +3002,28 @@
         com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
       x: #x()
         com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
+
+  public static byte nativeBytePlus(byte, byte);
+    descriptor: (BB)B
+    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+    Code:
+      stack=4, locals=2, args_size=2
+         x: ldc           #x                  // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNative
+         x: ldc           #x                // String nativeBytePlus
+         x: ldc           #x                // String (BB)B
+         x: ldc           #x                 // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
+         x: invokestatic  #x                 // Method com/android/hoststubgen/hosthelper/HostTestUtils.callMethodCallHook:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+        x: iload_0
+        x: iload_1
+        x: invokestatic  #x                // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeBytePlus:(BB)B
+        x: ireturn
+    RuntimeVisibleAnnotations:
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
 }
 SourceFile: "TinyFrameworkNative.java"
 RuntimeVisibleAnnotations:
@@ -3024,7 +3046,7 @@
   flags: (0x0021) ACC_PUBLIC, ACC_SUPER
   this_class: #x                          // com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host
   super_class: #x                         // java/lang/Object
-  interfaces: 0, fields: 0, methods: 5, attributes: 3
+  interfaces: 0, fields: 0, methods: 6, attributes: 3
   private static {};
     descriptor: ()V
     flags: (0x000a) ACC_PRIVATE, ACC_STATIC
@@ -3148,6 +3170,36 @@
     RuntimeVisibleAnnotations:
       x: #x()
         com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
+
+  public static byte nativeBytePlus(byte, byte);
+    descriptor: (BB)B
+    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+    Code:
+      stack=4, locals=2, args_size=2
+         x: ldc           #x                  // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host
+         x: ldc           #x                 // String nativeBytePlus
+         x: ldc           #x                 // String (BB)B
+         x: ldc           #x                 // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
+         x: invokestatic  #x                 // Method com/android/hoststubgen/hosthelper/HostTestUtils.callMethodCallHook:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+        x: ldc           #x                 // String com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host
+        x: ldc           #x                 // String nativeBytePlus
+        x: ldc           #x                 // String (BB)B
+        x: invokestatic  #x                 // Method com/android/hoststubgen/hosthelper/HostTestUtils.getStackWalker:()Ljava/lang/StackWalker;
+        x: invokevirtual #x                 // Method java/lang/StackWalker.getCallerClass:()Ljava/lang/Class;
+        x: invokestatic  #x                 // Method com/android/hoststubgen/hosthelper/HostTestUtils.onNonStubMethodCalled:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)V
+        x: iload_0
+        x: iload_1
+        x: iadd
+        x: i2b
+        x: ireturn
+      LineNumberTable:
+      LocalVariableTable:
+        Start  Length  Slot  Name   Signature
+           26       5     0  arg1   B
+           26       5     1  arg2   B
+    RuntimeVisibleAnnotations:
+      x: #x()
+        com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
 }
 SourceFile: "TinyFrameworkNative_host.java"
 RuntimeVisibleAnnotations:
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkNative.java b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkNative.java
index 5a5e22d..09ee183 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkNative.java
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkNative.java
@@ -52,4 +52,6 @@
     public static void nativeStillNotSupported_should_be_like_this() {
         throw new RuntimeException();
     }
+
+    public static native byte nativeBytePlus(byte arg1, byte arg2);
 }
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.java b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.java
index 749ebaa..b23c216 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.java
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.java
@@ -34,4 +34,8 @@
     public static int nativeNonStaticAddToValue(TinyFrameworkNative source, int arg) {
         return source.value + arg;
     }
+
+    public static byte nativeBytePlus(byte arg1, byte arg2) {
+        return (byte) (arg1 + arg2);
+    }
 }
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java
index ba17c75..762180d 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java
@@ -154,13 +154,22 @@
     }
 
     @Test
+    public void testNativeSubstitutionLong() {
+        assertThat(TinyFrameworkNative.nativeLongPlus(1L, 2L)).isEqualTo(3L);
+    }
+
+    @Test
+    public void testNativeSubstitutionByte() {
+        assertThat(TinyFrameworkNative.nativeBytePlus((byte) 3, (byte) 4)).isEqualTo(7);
+    }
+
+    @Test
     public void testNativeSubstitutionClass_nonStatic() {
         TinyFrameworkNative instance = new TinyFrameworkNative();
         instance.setValue(5);
         assertThat(instance.nativeNonStaticAddToValue(3)).isEqualTo(8);
     }
 
-
     @Test
     public void testSubstituteNativeWithThrow() throws Exception {
         // We can't use TinyFrameworkNative.nativeStillNotSupported() directly in this class,
diff --git a/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt
index 837dae9..0f1373c 100644
--- a/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt
+++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt
@@ -24,11 +24,20 @@
 import com.github.javaparser.ParserConfiguration
 import com.github.javaparser.StaticJavaParser
 import com.github.javaparser.ast.CompilationUnit
+import com.github.javaparser.ast.Modifier
 import com.github.javaparser.ast.NodeList
 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration
 import com.github.javaparser.ast.body.InitializerDeclaration
+import com.github.javaparser.ast.expr.ArrayAccessExpr
+import com.github.javaparser.ast.expr.ArrayCreationExpr
+import com.github.javaparser.ast.expr.ArrayInitializerExpr
+import com.github.javaparser.ast.expr.AssignExpr
+import com.github.javaparser.ast.expr.BooleanLiteralExpr
+import com.github.javaparser.ast.expr.Expression
 import com.github.javaparser.ast.expr.FieldAccessExpr
+import com.github.javaparser.ast.expr.IntegerLiteralExpr
 import com.github.javaparser.ast.expr.MethodCallExpr
+import com.github.javaparser.ast.expr.MethodReferenceExpr
 import com.github.javaparser.ast.expr.NameExpr
 import com.github.javaparser.ast.expr.NullLiteralExpr
 import com.github.javaparser.ast.expr.ObjectCreationExpr
@@ -168,6 +177,8 @@
         val classNameNode = classDeclaration.findFirst(SimpleName::class.java).get()
         classNameNode.setId(protoLogImplGenName)
 
+        injectCacheClass(classDeclaration, groups, protoLogGroupsClassName)
+
         injectConstants(classDeclaration,
             viewerConfigFilePath, legacyViewerConfigFilePath, legacyOutputFilePath, groups,
             protoLogGroupsClassName)
@@ -238,6 +249,12 @@
                                     field.setFinal(true)
                                     field.variables.first().setInitializer(treeMapCreation)
                                 }
+                                ProtoLogToolInjected.Value.CACHE_UPDATER.name -> {
+                                    field.setFinal(true)
+                                    field.variables.first().setInitializer(MethodReferenceExpr()
+                                            .setScope(NameExpr("Cache"))
+                                            .setIdentifier("update"))
+                                }
                                 else -> error("Unhandled ProtoLogToolInjected value: $valueName.")
                             }
                         }
@@ -245,6 +262,61 @@
         }
     }
 
+    private fun injectCacheClass(
+        classDeclaration: ClassOrInterfaceDeclaration,
+        groups: Map<String, LogGroup>,
+        protoLogGroupsClassName: String,
+    ) {
+        val cacheClass = ClassOrInterfaceDeclaration()
+            .setName("Cache")
+            .setPublic(true)
+            .setStatic(true)
+        for (group in groups) {
+            val nodeList = NodeList<Expression>()
+            val defaultVal = BooleanLiteralExpr(group.value.textEnabled || group.value.enabled)
+            repeat(LogLevel.entries.size) { nodeList.add(defaultVal) }
+            cacheClass.addFieldWithInitializer(
+                "boolean[]",
+                "${group.key}_enabled",
+                ArrayCreationExpr().setElementType("boolean[]").setInitializer(
+                    ArrayInitializerExpr().setValues(nodeList)
+                ),
+                Modifier.Keyword.PUBLIC,
+                Modifier.Keyword.STATIC
+            )
+        }
+
+        val updateBlockStmt = BlockStmt()
+        for (group in groups) {
+            for (level in LogLevel.entries) {
+                updateBlockStmt.addStatement(
+                    AssignExpr()
+                        .setTarget(
+                            ArrayAccessExpr()
+                                .setName(NameExpr("${group.key}_enabled"))
+                                .setIndex(IntegerLiteralExpr(level.ordinal))
+                        ).setValue(
+                            MethodCallExpr()
+                                .setName("isEnabled")
+                                .setArguments(NodeList(
+                                    FieldAccessExpr()
+                                        .setScope(NameExpr(protoLogGroupsClassName))
+                                        .setName(group.value.name),
+                                    FieldAccessExpr()
+                                        .setScope(NameExpr("LogLevel"))
+                                        .setName(level.toString()),
+                                ))
+                        )
+                )
+            }
+        }
+
+        cacheClass.addMethod("update").setPrivate(true).setStatic(true)
+            .setBody(updateBlockStmt)
+
+        classDeclaration.addMember(cacheClass)
+    }
+
     private fun tryParse(code: String, fileName: String): CompilationUnit {
         try {
             return StaticJavaParser.parse(code)
diff --git a/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt b/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt
index 2b71641..6a8a071 100644
--- a/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt
+++ b/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt
@@ -22,6 +22,7 @@
 import com.github.javaparser.ast.CompilationUnit
 import com.github.javaparser.ast.NodeList
 import com.github.javaparser.ast.body.VariableDeclarator
+import com.github.javaparser.ast.expr.ArrayAccessExpr
 import com.github.javaparser.ast.expr.CastExpr
 import com.github.javaparser.ast.expr.Expression
 import com.github.javaparser.ast.expr.FieldAccessExpr
@@ -35,6 +36,8 @@
 import com.github.javaparser.ast.expr.VariableDeclarationExpr
 import com.github.javaparser.ast.stmt.BlockStmt
 import com.github.javaparser.ast.stmt.ExpressionStmt
+import com.github.javaparser.ast.stmt.IfStmt
+import com.github.javaparser.ast.stmt.Statement
 import com.github.javaparser.ast.type.ArrayType
 import com.github.javaparser.ast.type.ClassOrInterfaceType
 import com.github.javaparser.ast.type.PrimitiveType
@@ -74,6 +77,8 @@
 
     private val protoLogImplClassNode =
             StaticJavaParser.parseExpression<FieldAccessExpr>(protoLogImplClassName)
+    private val protoLogImplCacheClassNode =
+        StaticJavaParser.parseExpression<FieldAccessExpr>("$protoLogImplClassName.Cache")
     private var processedCode: MutableList<String> = mutableListOf()
     private var offsets: IntArray = IntArray(0)
     /** The path of the file being processed, relative to $ANDROID_BUILD_TOP */
@@ -121,8 +126,9 @@
         group: LogGroup,
         level: LogLevel,
         messageString: String
-    ): BlockStmt {
+    ): Statement {
         val hash = CodeUtils.hash(packagePath, messageString, level, group)
+
         val newCall = call.clone()
         if (!group.textEnabled) {
             // Remove message string if text logging is not enabled by default.
@@ -166,11 +172,15 @@
         }
         blockStmt.addStatement(ExpressionStmt(newCall))
 
-        return blockStmt
+        val isLogEnabled = ArrayAccessExpr()
+            .setName(NameExpr("$protoLogImplCacheClassNode.${group.name}_enabled"))
+            .setIndex(IntegerLiteralExpr(level.ordinal))
+
+        return IfStmt(isLogEnabled, blockStmt, null)
     }
 
     private fun injectProcessedCallStatementInCode(
-        processedCallStatement: BlockStmt,
+        processedCallStatement: Statement,
         parentStmt: ExpressionStmt
     ) {
         // Inline the new statement.
diff --git a/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt b/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt
index de0b5ba..82aa93d 100644
--- a/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt
+++ b/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt
@@ -76,7 +76,7 @@
 
             class Test {
                 void test() {
-                    { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, -1473209266730422156L, 9, "test %d %f", protoLogParam0, protoLogParam1); }
+                    if (org.example.ProtoLogImpl.Cache.TEST_GROUP_enabled[3]) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, -1473209266730422156L, 9, "test %d %f", protoLogParam0, protoLogParam1); }
                 }
             }
             """.trimIndent()
@@ -86,7 +86,7 @@
 
             class Test {
                 void test() {
-                    { long protoLogParam0 = 100; double protoLogParam1 = 0.1; String protoLogParam2 = String.valueOf("test"); org.example.ProtoLogImpl.w(TEST_GROUP, -4447034859795564700L, 9, "test %d %f " + "abc %s\n test", protoLogParam0, protoLogParam1, protoLogParam2); 
+                    if (org.example.ProtoLogImpl.Cache.TEST_GROUP_enabled[3]) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; String protoLogParam2 = String.valueOf("test"); org.example.ProtoLogImpl.w(TEST_GROUP, -4447034859795564700L, 9, "test %d %f " + "abc %s\n test", protoLogParam0, protoLogParam1, protoLogParam2); 
             
             }
                 }
@@ -98,8 +98,8 @@
 
             class Test {
                 void test() {
-                    { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, -1473209266730422156L, 9, "test %d %f", protoLogParam0, protoLogParam1); } /* ProtoLog.w(TEST_GROUP, "test %d %f", 100, 0.1); */ { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, -1473209266730422156L, 9, "test %d %f", protoLogParam0, protoLogParam1); }
-                    { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, -1473209266730422156L, 9, "test %d %f", protoLogParam0, protoLogParam1); }
+                    if (org.example.ProtoLogImpl.Cache.TEST_GROUP_enabled[3]) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, -1473209266730422156L, 9, "test %d %f", protoLogParam0, protoLogParam1); } /* ProtoLog.w(TEST_GROUP, "test %d %f", 100, 0.1); */ if (org.example.ProtoLogImpl.Cache.TEST_GROUP_enabled[3]) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, -1473209266730422156L, 9, "test %d %f", protoLogParam0, protoLogParam1); }
+                    if (org.example.ProtoLogImpl.Cache.TEST_GROUP_enabled[3]) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, -1473209266730422156L, 9, "test %d %f", protoLogParam0, protoLogParam1); }
                 }
             }
             """.trimIndent()
@@ -109,7 +109,7 @@
 
             class Test {
                 void test() {
-                    { org.example.ProtoLogImpl.w(TEST_GROUP, 3218600869538902408L, 0, "test", (Object[]) null); }
+                    if (org.example.ProtoLogImpl.Cache.TEST_GROUP_enabled[3]) { org.example.ProtoLogImpl.w(TEST_GROUP, 3218600869538902408L, 0, "test", (Object[]) null); }
                 }
             }
             """.trimIndent()
@@ -119,7 +119,7 @@
 
             class Test {
                 void test() {
-                    { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, -1473209266730422156L, 9, null, protoLogParam0, protoLogParam1); }
+                    if (org.example.ProtoLogImpl.Cache.TEST_GROUP_enabled[3]) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, -1473209266730422156L, 9, null, protoLogParam0, protoLogParam1); }
                 }
             }
             """.trimIndent()
@@ -129,7 +129,7 @@
 
             class Test {
                 void test() {
-                    { long protoLogParam0 = 100; double protoLogParam1 = 0.1; String protoLogParam2 = String.valueOf("test"); org.example.ProtoLogImpl.w(TEST_GROUP, -4447034859795564700L, 9, null, protoLogParam0, protoLogParam1, protoLogParam2); 
+                    if (org.example.ProtoLogImpl.Cache.TEST_GROUP_enabled[3]) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; String protoLogParam2 = String.valueOf("test"); org.example.ProtoLogImpl.w(TEST_GROUP, -4447034859795564700L, 9, null, protoLogParam0, protoLogParam1, protoLogParam2); 
             
             }
                 }
diff --git a/wifi/java/src/android/net/wifi/WifiBlobStore.java b/wifi/java/src/android/net/wifi/WifiBlobStore.java
new file mode 100644
index 0000000..8737c7e9
--- /dev/null
+++ b/wifi/java/src/android/net/wifi/WifiBlobStore.java
@@ -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 android.net.wifi;
+
+import android.os.ServiceManager;
+import android.security.legacykeystore.ILegacyKeystore;
+
+import com.android.internal.net.ConnectivityBlobStore;
+
+/**
+ * Database blob store for Wifi.
+ * @hide
+ */
+public class WifiBlobStore extends ConnectivityBlobStore {
+    private static final String DB_NAME = "WifiBlobStore.db";
+    private static final String LEGACY_KEYSTORE_SERVICE_NAME = "android.security.legacykeystore";
+    private static WifiBlobStore sInstance;
+    private WifiBlobStore() {
+        super(DB_NAME);
+    }
+
+    /** Returns an instance of WifiBlobStore. */
+    public static WifiBlobStore getInstance() {
+        if (sInstance == null) {
+            sInstance = new WifiBlobStore();
+        }
+        return sInstance;
+    }
+
+    /** Returns an interface to access the Legacy Keystore service. */
+    public static ILegacyKeystore getLegacyKeystore() {
+        return ILegacyKeystore.Stub.asInterface(
+                ServiceManager.checkService(LEGACY_KEYSTORE_SERVICE_NAME));
+    }
+}
diff --git a/wifi/java/src/android/net/wifi/WifiKeystore.java b/wifi/java/src/android/net/wifi/WifiKeystore.java
index 1cda032..2ba7468 100644
--- a/wifi/java/src/android/net/wifi/WifiKeystore.java
+++ b/wifi/java/src/android/net/wifi/WifiKeystore.java
@@ -18,12 +18,16 @@
 import android.annotation.NonNull;
 import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
+import android.os.Binder;
 import android.os.Process;
-import android.os.ServiceManager;
 import android.os.ServiceSpecificException;
 import android.security.legacykeystore.ILegacyKeystore;
 import android.util.Log;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * This class allows the storage and retrieval of non-standard Wifi certificate blobs.
  * @hide
@@ -32,12 +36,6 @@
 @SuppressLint("UnflaggedApi") // Promoting from @SystemApi(MODULE_LIBRARIES)
 public final class WifiKeystore {
     private static final String TAG = "WifiKeystore";
-    private static final String LEGACY_KEYSTORE_SERVICE_NAME = "android.security.legacykeystore";
-
-    private static ILegacyKeystore getService() {
-        return ILegacyKeystore.Stub.asInterface(
-                ServiceManager.checkService(LEGACY_KEYSTORE_SERVICE_NAME));
-    }
 
     /** @hide */
     WifiKeystore() {
@@ -54,13 +52,18 @@
     @SystemApi
     @SuppressLint("UnflaggedApi")
     public static boolean put(@NonNull String alias, @NonNull byte[] blob) {
+        // ConnectivityBlobStore uses the calling uid as a key into the DB.
+        // Clear identity to ensure that callers from system apps and the Wifi framework
+        // are able to access the same values.
+        final long identity = Binder.clearCallingIdentity();
         try {
             Log.i(TAG, "put blob. alias " + alias);
-            getService().put(alias, Process.WIFI_UID, blob);
-            return true;
+            return WifiBlobStore.getInstance().put(alias, blob);
         } catch (Exception e) {
             Log.e(TAG, "Failed to put blob.", e);
             return false;
+        } finally {
+            Binder.restoreCallingIdentity(identity);
         }
     }
 
@@ -69,23 +72,31 @@
      * @param alias Name of the blob to retrieve.
      * @return The unstructured blob, that is the blob that was stored using
      *         {@link android.net.wifi.WifiKeystore#put}.
-     *         Returns null if no blob was found.
+     *         Returns empty byte[] if no blob was found.
      * @hide
      */
     @SystemApi
     @SuppressLint("UnflaggedApi")
     public static @NonNull byte[] get(@NonNull String alias) {
+        final long identity = Binder.clearCallingIdentity();
         try {
             Log.i(TAG, "get blob. alias " + alias);
-            return getService().get(alias, Process.WIFI_UID);
+            byte[] blob = WifiBlobStore.getInstance().get(alias);
+            if (blob != null) {
+                return blob;
+            }
+            Log.i(TAG, "Searching for blob in Legacy Keystore");
+            return WifiBlobStore.getLegacyKeystore().get(alias, Process.WIFI_UID);
         } catch (ServiceSpecificException e) {
             if (e.errorCode != ILegacyKeystore.ERROR_ENTRY_NOT_FOUND) {
                 Log.e(TAG, "Failed to get blob.", e);
             }
         } catch (Exception e) {
             Log.e(TAG, "Failed to get blob.", e);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
         }
-        return null;
+        return new byte[0];
     }
 
     /**
@@ -97,17 +108,27 @@
     @SystemApi
     @SuppressLint("UnflaggedApi")
     public static boolean remove(@NonNull String alias) {
+        boolean blobStoreSuccess = false;
+        boolean legacyKsSuccess = false;
+        final long identity = Binder.clearCallingIdentity();
         try {
-            getService().remove(alias, Process.WIFI_UID);
-            return true;
+            Log.i(TAG, "remove blob. alias " + alias);
+            blobStoreSuccess = WifiBlobStore.getInstance().remove(alias);
+            // Legacy Keystore will throw an exception if the alias is not found.
+            WifiBlobStore.getLegacyKeystore().remove(alias, Process.WIFI_UID);
+            legacyKsSuccess = true;
         } catch (ServiceSpecificException e) {
             if (e.errorCode != ILegacyKeystore.ERROR_ENTRY_NOT_FOUND) {
                 Log.e(TAG, "Failed to remove blob.", e);
             }
         } catch (Exception e) {
             Log.e(TAG, "Failed to remove blob.", e);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
         }
-        return false;
+        Log.i(TAG, "Removal status: wifiBlobStore=" + blobStoreSuccess
+                + ", legacyKeystore=" + legacyKsSuccess);
+        return blobStoreSuccess || legacyKsSuccess;
     }
 
     /**
@@ -119,14 +140,25 @@
     @SystemApi
     @SuppressLint("UnflaggedApi")
     public static @NonNull String[] list(@NonNull String prefix) {
+        final long identity = Binder.clearCallingIdentity();
         try {
-            final String[] aliases = getService().list(prefix, Process.WIFI_UID);
-            for (int i = 0; i < aliases.length; ++i) {
-                aliases[i] = aliases[i].substring(prefix.length());
+            // Aliases from WifiBlobStore will be pre-trimmed.
+            final String[] blobStoreAliases = WifiBlobStore.getInstance().list(prefix);
+            final String[] legacyAliases =
+                    WifiBlobStore.getLegacyKeystore().list(prefix, Process.WIFI_UID);
+            for (int i = 0; i < legacyAliases.length; ++i) {
+                legacyAliases[i] = legacyAliases[i].substring(prefix.length());
             }
-            return aliases;
+            // Deduplicate aliases before returning.
+            Set<String> uniqueAliases = new HashSet<>();
+            uniqueAliases.addAll(Arrays.asList(blobStoreAliases));
+            uniqueAliases.addAll(Arrays.asList(legacyAliases));
+            String[] uniqueAliasArray = new String[uniqueAliases.size()];
+            return uniqueAliases.toArray(uniqueAliasArray);
         } catch (Exception e) {
             Log.e(TAG, "Failed to list blobs.", e);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
         }
         return new String[0];
     }
diff --git a/wifi/tests/Android.bp b/wifi/tests/Android.bp
index 5a0f742..1d3e4bd 100644
--- a/wifi/tests/Android.bp
+++ b/wifi/tests/Android.bp
@@ -39,7 +39,7 @@
         "androidx.test.core",
         "frameworks-base-testutils",
         "guava",
-        "mockito-target-minus-junit4",
+        "mockito-target-extended-minus-junit4",
         "truth",
     ],
 
@@ -48,6 +48,12 @@
         "android.test.base",
     ],
 
+    // Required by Extended Mockito
+    jni_libs: [
+        "libdexmakerjvmtiagent",
+        "libstaticjvmtiagent",
+    ],
+
     test_suites: [
         "general-tests",
     ],
diff --git a/wifi/tests/AndroidManifest.xml b/wifi/tests/AndroidManifest.xml
index 18986fc..66056e5 100644
--- a/wifi/tests/AndroidManifest.xml
+++ b/wifi/tests/AndroidManifest.xml
@@ -18,7 +18,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="android.net.wifi.nonupdatable.test">
 
-    <application>
+    <application android:debuggable="true">
         <uses-library android:name="android.test.runner"/>
         <activity android:label="WifiTestDummyLabel"
              android:name="WifiTestDummyName"
diff --git a/wifi/tests/src/android/net/wifi/WifiKeystoreTest.java b/wifi/tests/src/android/net/wifi/WifiKeystoreTest.java
new file mode 100644
index 0000000..c28a0ae
--- /dev/null
+++ b/wifi/tests/src/android/net/wifi/WifiKeystoreTest.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wifi;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.validateMockitoUsage;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.os.ServiceSpecificException;
+import android.security.legacykeystore.ILegacyKeystore;
+
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+import java.util.Arrays;
+
+/** Unit tests for {@link WifiKeystore} */
+public class WifiKeystoreTest {
+    public static final String TEST_ALIAS = "someAliasString";
+    public static final byte[] TEST_VALUE = new byte[]{10, 11, 12};
+
+    @Mock private ILegacyKeystore mLegacyKeystore;
+    @Mock private WifiBlobStore mWifiBlobStore;
+
+    private MockitoSession mSession;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mSession = ExtendedMockito.mockitoSession()
+                .mockStatic(WifiBlobStore.class, withSettings().lenient())
+                .startMocking();
+        when(WifiBlobStore.getLegacyKeystore()).thenReturn(mLegacyKeystore);
+        when(WifiBlobStore.getInstance()).thenReturn(mWifiBlobStore);
+    }
+
+    @After
+    public void cleanup() {
+        validateMockitoUsage();
+        if (mSession != null) {
+            mSession.finishMocking();
+        }
+    }
+
+    /**
+     * Test that put() only writes to the WifiBlobStore database.
+     */
+    @Test
+    public void testPut() throws Exception {
+        WifiKeystore.put(TEST_ALIAS, TEST_VALUE);
+        verify(mWifiBlobStore).put(anyString(), any());
+        verify(mLegacyKeystore, never()).put(anyString(), anyInt(), any());
+    }
+
+    /**
+     * Test that if the alias is found in the WifiBlobStore database,
+     * then the legacy database is not searched.
+     */
+    @Test
+    public void testGet_wifiBlobStoreDb() throws Exception {
+        when(mWifiBlobStore.get(anyString())).thenReturn(TEST_VALUE);
+        assertArrayEquals(TEST_VALUE, WifiKeystore.get(TEST_ALIAS));
+
+        verify(mWifiBlobStore).get(anyString());
+        verify(mLegacyKeystore, never()).get(anyString(), anyInt());
+    }
+
+    /**
+     * Test that if the alias is not found in the WifiBlobStore database,
+     * then the legacy database is searched.
+     */
+    @Test
+    public void testGet_legacyDb() throws Exception {
+        when(mWifiBlobStore.get(anyString())).thenReturn(null);
+        when(mLegacyKeystore.get(anyString(), anyInt())).thenReturn(TEST_VALUE);
+        assertArrayEquals(TEST_VALUE, WifiKeystore.get(TEST_ALIAS));
+
+        verify(mWifiBlobStore).get(anyString());
+        verify(mLegacyKeystore).get(anyString(), anyInt());
+    }
+
+    /**
+     * Test that get() returns a non-null value if the alias is
+     * not found in either database.
+     */
+    @Test
+    public void testGet_notFound() throws Exception {
+        when(mWifiBlobStore.get(anyString())).thenReturn(null);
+        when(mLegacyKeystore.get(anyString(), anyInt()))
+                .thenThrow(new ServiceSpecificException(ILegacyKeystore.ERROR_ENTRY_NOT_FOUND));
+        assertNotNull(WifiKeystore.get(TEST_ALIAS));
+    }
+
+    /**
+     * Test that remove() returns true if the alias is removed
+     * from at least one database.
+     */
+    @Test
+    public void testRemove_success() throws Exception {
+        // Only removed from WifiBlobStore
+        when(mWifiBlobStore.remove(anyString())).thenReturn(true);
+        doThrow(new ServiceSpecificException(ILegacyKeystore.ERROR_ENTRY_NOT_FOUND))
+                .when(mLegacyKeystore).remove(anyString(), anyInt());
+        assertTrue(WifiKeystore.remove(TEST_ALIAS));
+
+        // Only removed from Legacy Keystore
+        when(mWifiBlobStore.remove(anyString())).thenReturn(false);
+        doNothing().when(mLegacyKeystore).remove(anyString(), anyInt());
+        assertTrue(WifiKeystore.remove(TEST_ALIAS));
+
+        // Removed from both WifiBlobStore and Legacy Keystore
+        when(mWifiBlobStore.remove(anyString())).thenReturn(true);
+        doNothing().when(mLegacyKeystore).remove(anyString(), anyInt());
+        assertTrue(WifiKeystore.remove(TEST_ALIAS));
+    }
+
+    /**
+     * Test that remove() returns false if the alias is not removed
+     * from any database.
+     */
+    @Test
+    public void testRemove_notFound() throws Exception {
+        when(mWifiBlobStore.remove(anyString())).thenReturn(false);
+        doThrow(new ServiceSpecificException(ILegacyKeystore.ERROR_ENTRY_NOT_FOUND))
+                .when(mLegacyKeystore).remove(anyString(), anyInt());
+        assertFalse(WifiKeystore.remove(TEST_ALIAS));
+    }
+
+    /**
+     * Test that list() retrieves aliases from both the WifiBlobStore
+     * and Legacy Keystore databases. The results should be de-duplicated.
+     */
+    @Test
+    public void testList() throws Exception {
+        // Aliases retrieved from WifiBlobStore will be pre-trimmed.
+        String[] blobStoreAliases = new String[]{"1", "2"};
+        String[] legacyDbAliases = new String[]{TEST_ALIAS + "2", TEST_ALIAS + "3"};
+        when(mWifiBlobStore.list(anyString())).thenReturn(blobStoreAliases);
+        when(mLegacyKeystore.list(anyString(), anyInt())).thenReturn(legacyDbAliases);
+
+        // Alias 2 exists in both DBs and should be de-duplicated.
+        String[] expected = new String[]{"1", "2", "3"};
+        String[] retrieved = WifiKeystore.list(TEST_ALIAS);
+        Arrays.sort(retrieved);
+        assertArrayEquals(expected, retrieved);
+    }
+}